From a4d27029411fb6508901f7ad64650ca778ecaf60 Mon Sep 17 00:00:00 2001 From: liyanyanli Date: Fri, 26 Oct 2018 10:22:41 +0000 Subject: [PATCH] Fix: Upgrade vendored to v1.12.0 --- .travis.yml | 2 +- cmd/frakti/frakti.go | 2 +- docs/deploy.md | 4 +- pkg/docker/privilegedruntime.go | 14 +- pkg/docker/runtime_service.go | 2 +- pkg/hyper/sandbox.go | 2 +- pkg/manager/manager.go | 2 +- pkg/unikernel/service/sandbox.go | 2 +- vendor/github.com/Rican7/retry/BUILD | 29 + vendor/github.com/Rican7/retry/LICENSE | 19 + vendor/github.com/Rican7/retry/Makefile | 83 + vendor/github.com/Rican7/retry/README.md | 101 + .../healthz => Rican7/retry/backoff}/BUILD | 6 +- .../Rican7/retry/backoff/backoff.go | 67 + .../static => Rican7/retry/jitter}/BUILD | 9 +- .../github.com/Rican7/retry/jitter/jitter.go | 89 + vendor/github.com/Rican7/retry/retry.go | 36 + vendor/github.com/Rican7/retry/strategy/BUILD | 27 + .../Rican7/retry/strategy/strategy.go | 85 + vendor/github.com/containerd/console/BUILD | 54 + vendor/github.com/containerd/console/LICENSE | 201 + .../github.com/containerd/console/README.md | 17 + .../github.com/containerd/console/console.go | 62 + .../containerd/console/console_linux.go | 255 + .../containerd/console/console_unix.go | 142 + .../containerd/console/console_windows.go | 200 + .../containerd/console/tc_darwin.go | 37 + .../containerd/console/tc_freebsd.go | 29 + .../github.com/containerd/console/tc_linux.go | 37 + .../containerd/console/tc_solaris_cgo.go | 35 + .../containerd/console/tc_solaris_nocgo.go | 31 + .../github.com/containerd/console/tc_unix.go | 75 + .../api/services/containers/v1/BUILD | 30 + .../services/containers/v1/containers.pb.go | 406 +- .../services/containers/v1/containers.proto | 2 +- .../containerd/api/services/tasks/v1/BUILD | 32 + .../api/services/tasks/v1/tasks.pb.go | 194 +- .../api/services/tasks/v1/tasks.proto | 2 +- .../containerd/api/services/version/v1/BUILD | 29 + .../api/services/version/v1/version.pb.go | 34 +- .../api/services/version/v1/version.proto | 2 +- .../containerd/containerd/api/types/BUILD | 37 + .../containerd/api/types/descriptor.pb.go | 30 +- .../containerd/api/types/descriptor.proto | 2 +- .../containerd/api/types/metrics.pb.go | 31 +- .../containerd/api/types/metrics.proto | 2 +- .../containerd/api/types/mount.pb.go | 30 +- .../containerd/api/types/mount.proto | 2 +- .../containerd/api/types/platform.pb.go | 30 +- .../containerd/api/types/platform.proto | 2 +- .../containerd/api/types/task/BUILD | 27 + .../containerd/api/types/task/task.pb.go | 95 +- .../containerd/api/types/task/task.proto | 2 +- .../containerd/containerd/containers/BUILD | 24 + .../containerd/containerd/dialer/BUILD | 35 + .../containerd/containerd/dialer/dialer.go | 2 +- .../containerd/containerd/errdefs/BUILD | 31 + .../containerd/containerd/errdefs/grpc.go | 19 +- .../containerd/containerd/namespaces/BUILD | 34 + .../cyphar/filepath-securejoin/BUILD | 27 + .../cyphar/filepath-securejoin/LICENSE | 28 + .../cyphar/filepath-securejoin/README.md | 65 + .../cyphar/filepath-securejoin/VERSION | 1 + .../cyphar/filepath-securejoin/join.go | 135 + .../cyphar/filepath-securejoin/vendor.conf | 1 + .../cyphar/filepath-securejoin/vfs.go | 41 + vendor/github.com/docker/docker/AUTHORS | 1984 + .../github.com/docker/docker/api/types/BUILD | 1 + .../docker/docker/api/types/client.go | 19 +- .../docker/docker/api/types/configs.go | 15 +- .../docker/docker/api/types/container/BUILD | 40 +- .../api/types/container/container_changes.go | 2 +- .../api/types/container/container_create.go | 2 +- .../api/types/container/container_top.go | 2 +- .../api/types/container/container_update.go | 2 +- .../api/types/container/container_wait.go | 14 +- .../docker/api/types/container/host_config.go | 66 +- .../api/types/container/hostconfig_windows.go | 14 - .../docker/docker/api/types/filters/BUILD | 1 + .../docker/docker/api/types/filters/parse.go | 272 +- .../docker/docker/api/types/image/BUILD | 1 + .../docker/api/types/image/image_history.go | 2 +- .../docker/docker/api/types/plugin.go | 3 + .../docker/docker/api/types/port.go | 2 +- .../docker/docker/api/types/types.go | 12 + .../docker/docker/api/types/volume/BUILD | 5 +- .../{volumes_create.go => volume_create.go} | 6 +- .../{volumes_list.go => volume_list.go} | 6 +- vendor/github.com/docker/docker/client/BUILD | 28 +- .../docker/docker/client/build_prune.go | 2 +- .../docker/docker/client/checkpoint_create.go | 3 +- .../docker/docker/client/checkpoint_delete.go | 2 +- .../docker/docker/client/checkpoint_list.go | 8 +- .../github.com/docker/docker/client/client.go | 270 +- .../docker/docker/client/client_unix.go | 5 +- .../docker/docker/client/client_windows.go | 3 + .../docker/docker/client/config_create.go | 2 +- .../docker/docker/client/config_inspect.go | 11 +- .../docker/docker/client/config_list.go | 4 +- .../docker/docker/client/config_remove.go | 4 +- .../docker/docker/client/config_update.go | 2 +- .../docker/docker/client/container_attach.go | 2 +- .../docker/docker/client/container_commit.go | 4 +- .../docker/docker/client/container_copy.go | 23 +- .../docker/docker/client/container_create.go | 4 +- .../docker/docker/client/container_diff.go | 2 +- .../docker/docker/client/container_exec.go | 4 +- .../docker/docker/client/container_export.go | 3 +- .../docker/docker/client/container_inspect.go | 19 +- .../docker/docker/client/container_kill.go | 3 +- .../docker/docker/client/container_list.go | 2 +- .../docker/docker/client/container_logs.go | 16 +- .../docker/docker/client/container_pause.go | 2 +- .../docker/docker/client/container_prune.go | 2 +- .../docker/docker/client/container_remove.go | 4 +- .../docker/docker/client/container_rename.go | 3 +- .../docker/docker/client/container_resize.go | 2 +- .../docker/docker/client/container_restart.go | 2 +- .../docker/docker/client/container_start.go | 3 +- .../docker/docker/client/container_stats.go | 2 +- .../docker/docker/client/container_stop.go | 11 +- .../docker/docker/client/container_top.go | 2 +- .../docker/docker/client/container_unpause.go | 2 +- .../docker/docker/client/container_update.go | 2 +- .../docker/docker/client/container_wait.go | 3 +- .../docker/docker/client/disk_usage.go | 2 +- .../docker/client/distribution_inspect.go | 5 +- .../github.com/docker/docker/client/errors.go | 244 +- .../github.com/docker/docker/client/events.go | 3 +- .../github.com/docker/docker/client/hijack.go | 137 +- .../docker/docker/client/image_build.go | 15 +- .../docker/docker/client/image_create.go | 7 +- .../docker/docker/client/image_history.go | 2 +- .../docker/docker/client/image_import.go | 7 +- .../docker/docker/client/image_inspect.go | 11 +- .../docker/docker/client/image_list.go | 2 +- .../docker/docker/client/image_load.go | 3 +- .../docker/docker/client/image_prune.go | 2 +- .../docker/docker/client/image_pull.go | 7 +- .../docker/docker/client/image_push.go | 3 +- .../docker/docker/client/image_remove.go | 6 +- .../docker/docker/client/image_save.go | 3 +- .../docker/docker/client/image_search.go | 4 +- .../docker/docker/client/image_tag.go | 2 +- .../github.com/docker/docker/client/info.go | 2 +- .../docker/docker/client/interface.go | 35 +- .../docker/client/interface_experimental.go | 3 +- .../github.com/docker/docker/client/login.go | 2 +- .../docker/docker/client/network_connect.go | 3 +- .../docker/docker/client/network_create.go | 2 +- .../docker/client/network_disconnect.go | 3 +- .../docker/docker/client/network_inspect.go | 11 +- .../docker/docker/client/network_list.go | 2 +- .../docker/docker/client/network_prune.go | 2 +- .../docker/docker/client/network_remove.go | 4 +- .../docker/docker/client/node_inspect.go | 11 +- .../docker/docker/client/node_list.go | 4 +- .../docker/docker/client/node_remove.go | 5 +- .../docker/docker/client/node_update.go | 2 +- .../docker/docker/client/parse_logs.go | 41 - .../github.com/docker/docker/client/ping.go | 10 +- .../docker/docker/client/plugin_create.go | 2 +- .../docker/docker/client/plugin_disable.go | 2 +- .../docker/docker/client/plugin_enable.go | 2 +- .../docker/docker/client/plugin_inspect.go | 11 +- .../docker/docker/client/plugin_install.go | 2 +- .../docker/docker/client/plugin_list.go | 4 +- .../docker/docker/client/plugin_push.go | 3 +- .../docker/docker/client/plugin_remove.go | 4 +- .../docker/docker/client/plugin_set.go | 2 +- .../docker/docker/client/plugin_upgrade.go | 2 +- .../docker/docker/client/request.go | 9 +- .../docker/docker/client/secret_create.go | 2 +- .../docker/docker/client/secret_inspect.go | 11 +- .../docker/docker/client/secret_list.go | 4 +- .../docker/docker/client/secret_remove.go | 4 +- .../docker/docker/client/secret_update.go | 2 +- .../docker/docker/client/service_create.go | 22 +- .../docker/docker/client/service_inspect.go | 11 +- .../docker/docker/client/service_list.go | 4 +- .../docker/docker/client/service_logs.go | 6 +- .../docker/docker/client/service_remove.go | 4 +- .../docker/docker/client/service_update.go | 2 +- .../docker/docker/client/session.go | 3 +- .../docker/client/swarm_get_unlock_key.go | 2 +- .../docker/docker/client/swarm_init.go | 2 +- .../docker/docker/client/swarm_inspect.go | 2 +- .../docker/docker/client/swarm_join.go | 3 +- .../docker/docker/client/swarm_leave.go | 3 +- .../docker/docker/client/swarm_unlock.go | 3 +- .../docker/docker/client/swarm_update.go | 2 +- .../docker/docker/client/task_inspect.go | 12 +- .../docker/docker/client/task_list.go | 4 +- .../docker/docker/client/task_logs.go | 3 +- .../docker/docker/client/transport.go | 8 - .../github.com/docker/docker/client/utils.go | 2 +- .../docker/docker/client/version.go | 2 +- .../docker/docker/client/volume_create.go | 4 +- .../docker/docker/client/volume_inspect.go | 12 +- .../docker/docker/client/volume_list.go | 6 +- .../docker/docker/client/volume_prune.go | 2 +- .../docker/docker/client/volume_remove.go | 4 +- .../daemon/logger/jsonfilelog/jsonlog/BUILD | 28 + .../logger/jsonfilelog/jsonlog/jsonlog.go | 25 + .../jsonfilelog/jsonlog/jsonlogbytes.go | 125 + .../jsonfilelog/jsonlog/time_marshalling.go | 20 + .../docker/docker/pkg/jsonmessage/BUILD | 2 +- .../docker/pkg/jsonmessage/jsonmessage.go | 52 +- .../github.com/docker/docker/pkg/mount/BUILD | 50 + .../docker/pkg/mount/flags_unsupported.go | 2 +- .../docker/docker/pkg/mount/mount.go | 105 +- .../docker/pkg/mount/mounter_solaris.go | 33 - .../docker/pkg/mount/mounter_unsupported.go | 2 +- .../docker/docker/pkg/mount/mountinfo.go | 14 - .../docker/pkg/mount/mountinfo_freebsd.go | 16 +- .../docker/pkg/mount/mountinfo_linux.go | 151 +- .../docker/pkg/mount/mountinfo_solaris.go | 37 - .../docker/pkg/mount/mountinfo_unsupported.go | 4 +- .../docker/pkg/mount/mountinfo_windows.go | 2 +- .../docker/pkg/mount/sharedsubtree_linux.go | 2 - .../docker/pkg/mount/sharedsubtree_solaris.go | 58 - .../docker/pkg/parsers/operatingsystem/BUILD | 36 + .../operatingsystem/operatingsystem_linux.go | 77 + .../operatingsystem/operatingsystem_unix.go | 25 + .../operatingsystem_windows.go | 51 + vendor/github.com/google/cadvisor/AUTHORS | 9 + .../cadvisor/{api => accelerators}/BUILD | 12 +- .../google/cadvisor/accelerators/nvidia.go | 49 +- .../github.com/google/cadvisor/api/handler.go | 250 - .../google/cadvisor/api/versions.go | 559 - .../google/cadvisor/cache/memory/BUILD | 1 + .../google/cadvisor/cache/memory/memory.go | 17 +- .../google/cadvisor/collector/BUILD | 1 + .../google/cadvisor/container/BUILD | 2 + .../google/cadvisor/container/common/BUILD | 1 + .../google/cadvisor/container/container.go | 1 + .../cadvisor/container/containerd/BUILD | 50 + .../cadvisor/container/containerd/client.go | 72 +- .../cadvisor/container/containerd/factory.go | 10 +- .../cadvisor/container/containerd/handler.go | 104 +- .../google/cadvisor/container/crio/BUILD | 2 +- .../google/cadvisor/container/crio/factory.go | 8 +- .../google/cadvisor/container/crio/handler.go | 95 +- .../google/cadvisor/container/docker/BUILD | 2 +- .../cadvisor/container/docker/docker.go | 14 +- .../cadvisor/container/docker/factory.go | 8 +- .../cadvisor/container/docker/handler.go | 124 +- .../google/cadvisor/container/factory.go | 1 + .../cadvisor/container/libcontainer/BUILD | 6 +- .../container/libcontainer/handler.go | 569 + .../container/libcontainer/helpers.go | 464 - .../google/cadvisor/container/mesos/BUILD | 47 + .../google/cadvisor/container/mesos/client.go | 190 + .../cadvisor/container/mesos/factory.go | 148 + .../cadvisor/container/mesos/handler.go | 213 + .../cadvisor/container/mesos/mesos_agent.go | 147 + .../google/cadvisor/container/raw/BUILD | 2 +- .../google/cadvisor/container/raw/factory.go | 22 +- .../google/cadvisor/container/raw/handler.go | 36 +- .../google/cadvisor/container/rkt/BUILD | 2 +- .../google/cadvisor/container/rkt/factory.go | 8 +- .../google/cadvisor/container/rkt/handler.go | 91 +- .../google/cadvisor/container/systemd/BUILD | 1 + .../cadvisor/container/systemd/factory.go | 2 +- .../google/cadvisor/devicemapper/BUILD | 1 + .../github.com/google/cadvisor/events/BUILD | 1 + vendor/github.com/google/cadvisor/fs/BUILD | 12 +- vendor/github.com/google/cadvisor/fs/fs.go | 40 +- .../google/cadvisor/healthz/healthz.go | 32 - vendor/github.com/google/cadvisor/http/BUILD | 39 - .../google/cadvisor/http/handlers.go | 112 - .../google/cadvisor/http/mux/mux.go | 26 - .../github.com/google/cadvisor/info/v1/BUILD | 1 + .../google/cadvisor/info/v1/container.go | 22 +- .../github.com/google/cadvisor/info/v2/BUILD | 1 + .../github.com/google/cadvisor/machine/BUILD | 2 + .../google/cadvisor/machine/info.go | 18 +- .../github.com/google/cadvisor/manager/BUILD | 3 + .../google/cadvisor/manager/container.go | 9 +- .../google/cadvisor/manager/manager.go | 104 +- .../google/cadvisor/manager/watcher/BUILD | 1 + .../google/cadvisor/manager/watcher/raw/BUILD | 1 + .../cadvisor/manager/watcher/raw/raw.go | 24 +- .../google/cadvisor/manager/watcher/rkt/BUILD | 1 + .../github.com/google/cadvisor/metrics/BUILD | 2 + .../google/cadvisor/metrics/prometheus.go | 181 +- vendor/github.com/google/cadvisor/pages/BUILD | 38 - .../google/cadvisor/pages/containers.go | 253 - .../google/cadvisor/pages/docker.go | 162 - .../github.com/google/cadvisor/pages/pages.go | 163 - .../google/cadvisor/pages/static/assets.go | 442 - .../google/cadvisor/pages/static/static.go | 77 - .../google/cadvisor/pages/templates.go | 256 - .../github.com/google/cadvisor/storage/BUILD | 1 + .../google/cadvisor/storage/storage.go | 2 +- .../github.com/google/cadvisor/summary/BUILD | 1 + vendor/github.com/google/cadvisor/utils/BUILD | 1 + .../google/cadvisor/utils/cloudinfo/BUILD | 1 + .../google/cadvisor/utils/cpuload/BUILD | 1 + .../cadvisor/utils/cpuload/netlink/BUILD | 1 + .../google/cadvisor/utils/docker/BUILD | 1 + .../google/cadvisor/utils/oomparser/BUILD | 1 + .../google/cadvisor/utils/sysfs/BUILD | 1 + .../google/cadvisor/utils/sysinfo/BUILD | 1 + .../google/cadvisor/validate/validate.go | 305 - .../github.com/google/cadvisor/version/BUILD | 1 + vendor/github.com/google/cadvisor/zfs/BUILD | 1 + vendor/github.com/mattn/go-shellwords/BUILD | 28 + vendor/github.com/mattn/go-shellwords/LICENSE | 21 + .../github.com/mattn/go-shellwords/README.md | 47 + .../mattn/go-shellwords/shellwords.go | 178 + .../mattn/go-shellwords/util_go15.go | 24 + .../mattn/go-shellwords/util_posix.go | 22 + .../mattn/go-shellwords/util_windows.go | 22 + vendor/github.com/mesos/mesos-go/LICENSE | 201 + vendor/github.com/mesos/mesos-go/NOTICE | 13 + .../mesos/mesos-go/api/v1/lib/BUILD | 50 + .../mesos/mesos-go/api/v1/lib/agent/BUILD | 35 + .../mesos-go/api/v1/lib/agent/agent.pb.go | 17324 ++++ .../api/v1/lib/agent/agent.pb_ffjson.go | 15157 ++++ .../mesos-go/api/v1/lib/agent/agent.proto | 706 + .../mesos-go/api/v1/lib/agent/calls/BUILD | 32 + .../mesos-go/api/v1/lib/agent/calls/calls.go | 258 + .../api/v1/lib/agent/calls/calls_generated.go | 129 + .../mesos-go/api/v1/lib/agent/calls/gen.go | 3 + .../mesos/mesos-go/api/v1/lib/client.go | 71 + .../mesos/mesos-go/api/v1/lib/client/BUILD | 24 + .../mesos-go/api/v1/lib/client/client.go | 54 + .../mesos/mesos-go/api/v1/lib/debug/BUILD | 23 + .../mesos/mesos-go/api/v1/lib/debug/logger.go | 17 + .../mesos/mesos-go/api/v1/lib/doc.go | 3 + .../mesos/mesos-go/api/v1/lib/encoding/BUILD | 33 + .../mesos-go/api/v1/lib/encoding/codecs/BUILD | 28 + .../api/v1/lib/encoding/codecs/codecs.go | 33 + .../api/v1/lib/encoding/framing/BUILD | 26 + .../api/v1/lib/encoding/framing/decoder.go | 34 + .../api/v1/lib/encoding/framing/framing.go | 70 + .../mesos-go/api/v1/lib/encoding/json/BUILD | 27 + .../mesos-go/api/v1/lib/encoding/json/json.go | 28 + .../mesos-go/api/v1/lib/encoding/proto/BUILD | 31 + .../mesos-go/api/v1/lib/encoding/proto/doc.go | 4 + .../api/v1/lib/encoding/proto/encoding.go | 30 + .../mesos-go/api/v1/lib/encoding/types.go | 111 + .../mesos/mesos-go/api/v1/lib/filters.go | 26 + .../mesos/mesos-go/api/v1/lib/fixedpoint.go | 35 + .../mesos/mesos-go/api/v1/lib/httpcli/BUILD | 40 + .../api/v1/lib/httpcli/apierrors/BUILD | 23 + .../api/v1/lib/httpcli/apierrors/apierrors.go | 161 + .../mesos-go/api/v1/lib/httpcli/auth_basic.go | 33 + .../mesos/mesos-go/api/v1/lib/httpcli/http.go | 614 + .../mesos/mesos-go/api/v1/lib/httpcli/opts.go | 53 + .../mesos/mesos-go/api/v1/lib/labels.go | 95 + .../mesos/mesos-go/api/v1/lib/mesos.pb.go | 72498 ++++++++++++++++ .../mesos-go/api/v1/lib/mesos.pb_ffjson.go | 63680 ++++++++++++++ .../mesos/mesos-go/api/v1/lib/mesos.proto | 3600 + .../mesos/mesos-go/api/v1/lib/ranges.go | 253 + .../mesos/mesos-go/api/v1/lib/recordio/BUILD | 32 + .../mesos/mesos-go/api/v1/lib/recordio/doc.go | 5 + .../mesos-go/api/v1/lib/recordio/reader.go | 145 + .../mesos-go/api/v1/lib/recordio/strconv.go | 117 + .../mesos-go/api/v1/lib/recordio/writer.go | 34 + .../mesos/mesos-go/api/v1/lib/resources.go | 1145 + .../mesos/mesos-go/api/v1/lib/roles/BUILD | 23 + .../mesos/mesos-go/api/v1/lib/roles/role.go | 82 + .../mesos/mesos-go/api/v1/lib/values.go | 142 + .../opencontainers/runc/libcontainer/BUILD | 59 +- .../opencontainers/runc/libcontainer/SPEC.md | 86 +- .../runc/libcontainer/capabilities_linux.go | 3 +- .../runc/libcontainer/compat_1.5_linux.go | 10 - .../runc/libcontainer/configs/BUILD | 53 + .../configs/cgroup_unsupported.go | 6 - .../runc/libcontainer/configs/config.go | 4 + .../libcontainer/configs/device_defaults.go | 2 +- .../runc/libcontainer/configs/intelrdt.go | 7 + .../runc/libcontainer/configs/validate/BUILD | 2 + .../libcontainer/configs/validate/rootless.go | 68 +- .../configs/validate/validator.go | 17 + .../runc/libcontainer/console.go | 17 - .../runc/libcontainer/console_freebsd.go | 13 - .../runc/libcontainer/console_linux.go | 129 +- .../runc/libcontainer/console_solaris.go | 11 - .../runc/libcontainer/console_windows.go | 30 - .../runc/libcontainer/container_linux.go | 255 +- .../runc/libcontainer/container_solaris.go | 20 - .../runc/libcontainer/container_windows.go | 20 - .../runc/libcontainer/criu_opts_linux.go | 4 +- .../runc/libcontainer/criu_opts_windows.go | 6 - .../runc/libcontainer/criurpc/BUILD | 7 +- .../runc/libcontainer/factory_linux.go | 77 +- .../runc/libcontainer/init_linux.go | 103 +- .../runc/libcontainer/intelrdt/BUILD | 32 + .../runc/libcontainer/intelrdt/intelrdt.go | 553 + .../runc/libcontainer/intelrdt/stats.go | 24 + .../runc/libcontainer/message_linux.go | 8 +- .../runc/libcontainer/mount}/BUILD | 15 +- .../runc/libcontainer/mount/mount.go | 23 + .../runc/libcontainer/mount/mount_linux.go | 82 + .../runc/libcontainer/mount/mountinfo.go | 40 + .../runc/libcontainer/process.go | 4 + .../runc/libcontainer/process_linux.go | 100 +- .../runc/libcontainer/rootfs_linux.go | 53 +- .../runc/libcontainer/setgroups_linux.go | 11 - .../runc/libcontainer/setns_init_linux.go | 13 +- .../runc/libcontainer/standard_init_linux.go | 51 +- .../runc/libcontainer/state_linux.go | 13 +- .../runc/libcontainer/stats_freebsd.go | 5 - .../runc/libcontainer/stats_linux.go | 6 +- .../runc/libcontainer/stats_solaris.go | 7 - .../runc/libcontainer/stats_windows.go | 5 - .../runc/libcontainer/system/BUILD | 69 + .../runc/libcontainer/system/linux.go | 11 + ...scall_linux_386.go => syscall_linux_32.go} | 3 +- .../libcontainer/system/syscall_linux_64.go | 3 +- .../libcontainer/system/syscall_linux_arm.go | 25 - .../runc/libcontainer/system/sysconfig.go | 2 +- .../runc/libcontainer/utils/BUILD | 9 +- .../runc/libcontainer/utils/cmsg.go | 10 +- vendor/github.com/pquerna/ffjson/LICENSE | 202 + vendor/github.com/pquerna/ffjson/NOTICE | 8 + .../github.com/pquerna/ffjson/fflib/v1/BUILD | 41 + .../pquerna/ffjson/fflib/v1/buffer.go | 421 + .../pquerna/ffjson/fflib/v1/buffer_nopool.go | 11 + .../pquerna/ffjson/fflib/v1/buffer_pool.go | 105 + .../pquerna/ffjson/fflib/v1/bytenum.go | 88 + .../pquerna/ffjson/fflib/v1/decimal.go | 378 + .../pquerna/ffjson/fflib/v1/extfloat.go | 668 + .../pquerna/ffjson/fflib/v1/fold.go | 121 + .../pquerna/ffjson/fflib/v1/ftoa.go | 542 + .../pquerna/ffjson/fflib/v1/internal/BUILD | 28 + .../pquerna/ffjson/fflib/v1/internal/atof.go | 936 + .../pquerna/ffjson/fflib/v1/internal/atoi.go | 213 + .../ffjson/fflib/v1/internal/extfloat.go | 668 + .../pquerna/ffjson/fflib/v1/internal/ftoa.go | 475 + .../pquerna/ffjson/fflib/v1/iota.go | 161 + .../pquerna/ffjson/fflib/v1/jsonstring.go | 512 + .../pquerna/ffjson/fflib/v1/lexer.go | 937 + .../pquerna/ffjson/fflib/v1/reader.go | 512 + .../ffjson/fflib/v1/reader_scan_generic.go | 34 + vendor/gopkg.in/square/go-jose.v2/BUILD | 2 + vendor/gopkg.in/square/go-jose.v2/README.md | 1 + .../gopkg.in/square/go-jose.v2/asymmetric.go | 19 +- vendor/gopkg.in/square/go-jose.v2/jwk.go | 40 +- vendor/gopkg.in/square/go-jose.v2/jws.go | 45 +- vendor/gopkg.in/square/go-jose.v2/opaque.go | 83 + vendor/gopkg.in/square/go-jose.v2/shared.go | 57 +- vendor/gopkg.in/square/go-jose.v2/signing.go | 85 +- vendor/k8s.io/api/BUILD | 96 + vendor/k8s.io/api/CONTRIBUTING.md | 7 + vendor/k8s.io/api/OWNERS | 52 + vendor/k8s.io/api/README.md | 1 + vendor/k8s.io/api/SECURITY_CONTACTS | 17 + .../api/admissionregistration/v1alpha1/BUILD | 13 +- .../v1alpha1/generated.pb.go | 71 +- .../v1alpha1/generated.proto | 1 - .../api/admissionregistration/v1beta1/BUILD | 13 +- .../v1beta1/generated.pb.go | 158 +- .../v1beta1/generated.proto | 12 +- .../admissionregistration/v1beta1/types.go | 25 + .../v1beta1/types_swagger_doc_generated.go | 1 + .../v1beta1/zz_generated.deepcopy.go | 45 +- vendor/k8s.io/api/apps/v1beta1/BUILD | 17 +- .../k8s.io/api/apps/v1beta1/generated.pb.go | 237 +- .../k8s.io/api/apps/v1beta1/generated.proto | 1 - .../api/apps/v1beta1/zz_generated.deepcopy.go | 132 +- vendor/k8s.io/api/apps/v1beta2/BUILD | 17 +- .../k8s.io/api/apps/v1beta2/generated.pb.go | 266 +- .../k8s.io/api/apps/v1beta2/generated.proto | 1 - .../api/apps/v1beta2/zz_generated.deepcopy.go | 172 +- vendor/k8s.io/api/authentication/v1/BUILD | 15 +- .../api/authentication/v1/generated.pb.go | 115 +- .../api/authentication/v1/generated.proto | 1 - .../v1/zz_generated.deepcopy.go | 23 +- .../k8s.io/api/authentication/v1beta1/BUILD | 13 +- .../authentication/v1beta1/generated.pb.go | 83 +- .../authentication/v1beta1/generated.proto | 1 - .../v1beta1/zz_generated.deepcopy.go | 7 +- vendor/k8s.io/api/authorization/v1/BUILD | 13 +- .../api/authorization/v1/generated.pb.go | 146 +- .../api/authorization/v1/generated.proto | 1 - .../authorization/v1/zz_generated.deepcopy.go | 39 +- vendor/k8s.io/api/authorization/v1beta1/BUILD | 13 +- .../api/authorization/v1beta1/generated.pb.go | 147 +- .../api/authorization/v1beta1/generated.proto | 1 - .../v1beta1/zz_generated.deepcopy.go | 39 +- vendor/k8s.io/api/autoscaling/v1/BUILD | 17 +- .../k8s.io/api/autoscaling/v1/generated.pb.go | 514 +- .../k8s.io/api/autoscaling/v1/generated.proto | 35 +- vendor/k8s.io/api/autoscaling/v1/types.go | 32 + .../v1/types_swagger_doc_generated.go | 14 +- .../autoscaling/v1/zz_generated.deepcopy.go | 198 +- vendor/k8s.io/api/autoscaling/v2beta1/BUILD | 17 +- .../api/autoscaling/v2beta1/generated.pb.go | 498 +- .../api/autoscaling/v2beta1/generated.proto | 36 +- .../k8s.io/api/autoscaling/v2beta1/types.go | 33 + .../v2beta1/types_swagger_doc_generated.go | 14 +- .../v2beta1/zz_generated.deepcopy.go | 180 +- vendor/k8s.io/api/autoscaling/v2beta2/BUILD | 44 + .../autoscaling/v2beta2}/doc.go | 5 +- .../api/autoscaling/v2beta2/generated.pb.go | 4438 + .../api/autoscaling/v2beta2/generated.proto | 369 + .../autoscaling/v2beta2}/register.go | 17 +- .../k8s.io/api/autoscaling/v2beta2/types.go | 393 + .../v2beta2/types_swagger_doc_generated.go | 240 + .../v2beta2/zz_generated.deepcopy.go | 487 + vendor/k8s.io/api/batch/v1/BUILD | 15 +- vendor/k8s.io/api/batch/v1/generated.pb.go | 147 +- vendor/k8s.io/api/batch/v1/generated.proto | 13 +- vendor/k8s.io/api/batch/v1/types.go | 12 + .../batch/v1/types_swagger_doc_generated.go | 17 +- .../api/batch/v1/zz_generated.deepcopy.go | 67 +- vendor/k8s.io/api/batch/v1beta1/BUILD | 17 +- .../k8s.io/api/batch/v1beta1/generated.pb.go | 96 +- .../k8s.io/api/batch/v1beta1/generated.proto | 1 - .../batch/v1beta1/zz_generated.deepcopy.go | 38 +- vendor/k8s.io/api/batch/v2alpha1/BUILD | 17 +- .../k8s.io/api/batch/v2alpha1/generated.pb.go | 101 +- .../k8s.io/api/batch/v2alpha1/generated.proto | 1 - .../batch/v2alpha1/zz_generated.deepcopy.go | 38 +- vendor/k8s.io/api/certificates/v1beta1/BUILD | 13 +- .../api/certificates/v1beta1/generated.pb.go | 104 +- .../api/certificates/v1beta1/generated.proto | 1 - .../v1beta1/zz_generated.deepcopy.go | 7 +- vendor/k8s.io/api/code-of-conduct.md | 3 + vendor/k8s.io/api/coordination/v1beta1/BUILD | 42 + vendor/k8s.io/api/coordination/v1beta1/doc.go | 21 + .../api/coordination/v1beta1/generated.pb.go | 883 + .../api/coordination/v1beta1/generated.proto | 80 + .../coordination/v1beta1}/register.go | 20 +- .../k8s.io/api/coordination/v1beta1/types.go | 74 + .../v1beta1/types_swagger_doc_generated.go | 63 + .../v1beta1/zz_generated.deepcopy.go | 124 + vendor/k8s.io/api/core/v1/BUILD | 19 +- vendor/k8s.io/api/core/v1/generated.pb.go | 2612 +- vendor/k8s.io/api/core/v1/generated.proto | 76 +- vendor/k8s.io/api/core/v1/types.go | 88 +- .../core/v1/types_swagger_doc_generated.go | 41 +- .../api/core/v1/zz_generated.deepcopy.go | 1467 +- vendor/k8s.io/api/events/v1beta1/BUILD | 15 +- .../k8s.io/api/events/v1beta1/generated.pb.go | 102 +- .../k8s.io/api/events/v1beta1/generated.proto | 1 - .../events/v1beta1/zz_generated.deepcopy.go | 16 +- vendor/k8s.io/api/extensions/v1beta1/BUILD | 21 +- .../api/extensions/v1beta1/generated.pb.go | 513 +- .../api/extensions/v1beta1/generated.proto | 13 +- vendor/k8s.io/api/extensions/v1beta1/types.go | 11 +- .../v1beta1/types_swagger_doc_generated.go | 5 +- .../v1beta1/zz_generated.deepcopy.go | 221 +- vendor/k8s.io/api/networking/v1/BUILD | 17 +- .../k8s.io/api/networking/v1/generated.pb.go | 105 +- .../k8s.io/api/networking/v1/generated.proto | 4 +- vendor/k8s.io/api/networking/v1/types.go | 2 +- .../v1/types_swagger_doc_generated.go | 2 +- .../networking/v1/zz_generated.deepcopy.go | 44 +- vendor/k8s.io/api/policy/v1beta1/BUILD | 17 +- .../k8s.io/api/policy/v1beta1/generated.pb.go | 268 +- .../k8s.io/api/policy/v1beta1/generated.proto | 7 + vendor/k8s.io/api/policy/v1beta1/types.go | 8 +- .../v1beta1/types_swagger_doc_generated.go | 1 + .../policy/v1beta1/zz_generated.deepcopy.go | 69 +- vendor/k8s.io/api/rbac/v1/BUILD | 13 +- vendor/k8s.io/api/rbac/v1/generated.pb.go | 105 +- vendor/k8s.io/api/rbac/v1/generated.proto | 2 - .../api/rbac/v1/zz_generated.deepcopy.go | 12 +- vendor/k8s.io/api/rbac/v1alpha1/BUILD | 13 +- .../k8s.io/api/rbac/v1alpha1/generated.pb.go | 105 +- .../k8s.io/api/rbac/v1alpha1/generated.proto | 1 - .../rbac/v1alpha1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/rbac/v1beta1/BUILD | 13 +- .../k8s.io/api/rbac/v1beta1/generated.pb.go | 106 +- .../k8s.io/api/rbac/v1beta1/generated.proto | 2 - .../api/rbac/v1beta1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/roundtrip_test.go | 151 + vendor/k8s.io/api/scheduling/v1alpha1/BUILD | 13 +- .../api/scheduling/v1alpha1/generated.pb.go | 55 +- .../api/scheduling/v1alpha1/generated.proto | 1 - vendor/k8s.io/api/settings/v1alpha1/BUILD | 15 +- .../api/settings/v1alpha1/generated.pb.go | 71 +- .../api/settings/v1alpha1/generated.proto | 1 - vendor/k8s.io/api/storage/v1/BUILD | 15 +- vendor/k8s.io/api/storage/v1/generated.pb.go | 86 +- vendor/k8s.io/api/storage/v1/generated.proto | 8 +- vendor/k8s.io/api/storage/v1/types.go | 6 +- .../storage/v1/types_swagger_doc_generated.go | 4 +- .../api/storage/v1/zz_generated.deepcopy.go | 28 +- vendor/k8s.io/api/storage/v1alpha1/BUILD | 13 +- .../api/storage/v1alpha1/generated.pb.go | 93 +- .../api/storage/v1alpha1/generated.proto | 2 - .../storage/v1alpha1/zz_generated.deepcopy.go | 24 +- vendor/k8s.io/api/storage/v1beta1/BUILD | 15 +- .../api/storage/v1beta1/generated.pb.go | 126 +- .../api/storage/v1beta1/generated.proto | 8 +- vendor/k8s.io/api/storage/v1beta1/types.go | 6 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../storage/v1beta1/zz_generated.deepcopy.go | 48 +- vendor/k8s.io/apiextensions-apiserver/BUILD | 58 + .../apiextensions-apiserver/CONTRIBUTING.md | 7 + vendor/k8s.io/apiextensions-apiserver/OWNERS | 11 + .../k8s.io/apiextensions-apiserver/README.md | 20 + .../apiextensions-apiserver/SECURITY_CONTACTS | 17 + .../code-of-conduct.md | 3 + .../main.go} | 40 +- .../pkg/cmd/server/BUILD | 36 + .../pkg/cmd/server/server.go | 64 + .../pkg/features/BUILD | 3 +- vendor/k8s.io/apimachinery/CONTRIBUTING.md | 7 + vendor/k8s.io/apimachinery/OWNERS | 23 + vendor/k8s.io/apimachinery/README.md | 29 + vendor/k8s.io/apimachinery/SECURITY_CONTACTS | 17 + vendor/k8s.io/apimachinery/code-of-conduct.md | 3 + .../apimachinery/pkg/api/equality/BUILD | 11 +- .../k8s.io/apimachinery/pkg/api/errors/BUILD | 17 +- .../pkg/api/errors/errors_test.go | 222 + vendor/k8s.io/apimachinery/pkg/api/meta/BUILD | 25 +- .../apimachinery/pkg/api/meta/meta_test.go | 51 + .../pkg/api/meta/multirestmapper_test.go | 391 + .../pkg/api/meta/priority_test.go | 409 + .../pkg/api/meta/restmapper_test.go | 724 + .../apimachinery/pkg/api/resource/BUILD | 14 +- .../pkg/api/resource/amount_test.go | 162 + .../pkg/api/resource/generated.pb.go | 43 +- .../pkg/api/resource/generated.proto | 7 - .../pkg/api/resource/math_test.go | 211 + .../apimachinery/pkg/api/resource/quantity.go | 11 +- .../pkg/api/resource/quantity_example_test.go | 59 + .../pkg/api/resource/quantity_proto_test.go | 103 + .../pkg/api/resource/quantity_test.go | 1352 + .../pkg/api/resource/scale_int_test.go | 85 + .../apimachinery/pkg/api/validation/BUILD | 21 +- .../pkg/api/validation/objectmeta_test.go | 500 + .../pkg/api/validation/path/BUILD | 1 + .../pkg/api/validation/path/name_test.go | 168 + .../pkg/apis/meta/internalversion/BUILD | 26 +- .../apis/meta/internalversion/conversion.go | 23 - .../pkg/apis/meta/internalversion/register.go | 16 +- .../meta/internalversion/register_test.go | 89 + .../meta/internalversion/roundtrip_test.go} | 13 +- .../zz_generated.conversion.go | 39 +- .../internalversion/zz_generated.deepcopy.go | 20 +- .../apimachinery/pkg/apis/meta/v1/BUILD | 45 +- .../pkg/apis/meta/v1/controller_ref_test.go | 133 + .../pkg/apis/meta/v1/conversion.go | 39 +- .../pkg/apis/meta/v1/conversion_test.go | 84 + .../pkg/apis/meta/v1/duration_test.go | 153 + .../pkg/apis/meta/v1/generated.pb.go | 733 +- .../pkg/apis/meta/v1/generated.proto | 64 +- .../pkg/apis/meta/v1/group_version_test.go | 79 + .../pkg/apis/meta/v1/helpers_test.go | 161 + .../pkg/apis/meta/v1/labels_test.go | 123 + .../apimachinery/pkg/apis/meta/v1/meta.go | 54 +- .../pkg/apis/meta/v1/micro_time_test.go | 139 + .../apimachinery/pkg/apis/meta/v1/register.go | 24 +- .../pkg/apis/meta/v1/time_test.go | 197 + .../apimachinery/pkg/apis/meta/v1/types.go | 77 +- .../meta/v1/types_swagger_doc_generated.go | 24 +- .../pkg/apis/meta/v1/types_test.go | 135 + .../pkg/apis/meta/v1/unstructured/BUILD | 21 +- .../apis/meta/v1/unstructured/helpers_test.go | 136 + .../apis/meta/v1/unstructured/unstructured.go | 61 +- .../v1/unstructured/unstructured_list_test.go | 86 + .../meta/v1/unstructured/unstructured_test.go | 162 + .../pkg/apis/meta/v1/validation/BUILD | 10 +- .../pkg/apis/meta/v1/validation/validation.go | 20 + .../meta/v1/validation/validation_test.go | 127 + .../apimachinery/pkg/apis/meta/v1/watch.go | 12 +- .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 171 +- .../apimachinery/pkg/apis/meta/v1beta1/BUILD | 15 +- .../pkg/apis/meta/v1beta1/generated.pb.go | 51 +- .../pkg/apis/meta/v1beta1/generated.proto | 1 - .../meta/v1beta1/zz_generated.deepcopy.go | 9 +- .../k8s.io/apimachinery/pkg/conversion/BUILD | 5 +- .../apimachinery/pkg/conversion/converter.go | 132 +- .../pkg/conversion/converter_test.go | 734 + .../pkg/conversion/helper_test.go} | 27 +- .../pkg/conversion/queryparams/BUILD | 9 +- .../conversion/queryparams/convert_test.go | 219 + vendor/k8s.io/apimachinery/pkg/fields/BUILD | 3 +- .../apimachinery/pkg/fields/fields_test.go | 57 + .../apimachinery/pkg/fields/selector_test.go | 397 + vendor/k8s.io/apimachinery/pkg/labels/BUILD | 11 +- .../apimachinery/pkg/labels/labels_test.go | 231 + .../apimachinery/pkg/labels/selector.go | 16 +- .../apimachinery/pkg/labels/selector_test.go | 619 + vendor/k8s.io/apimachinery/pkg/runtime/BUILD | 66 +- .../k8s.io/apimachinery/pkg/runtime/codec.go | 18 - .../apimachinery/pkg/runtime/conversion.go | 6 +- .../pkg/runtime/conversion_test.go | 115 + .../pkg/runtime/converter_test.go | 597 + vendor/k8s.io/apimachinery/pkg/runtime/doc.go | 22 +- .../apimachinery/pkg/runtime/embedded.go | 28 +- .../apimachinery/pkg/runtime/embedded_test.go | 256 + .../k8s.io/apimachinery/pkg/runtime/error.go | 35 +- .../apimachinery/pkg/runtime/extension.go | 2 +- .../pkg/runtime/extension_test.go | 113 + .../apimachinery/pkg/runtime/generated.pb.go | 51 +- .../apimachinery/pkg/runtime/generated.proto | 2 - .../k8s.io/apimachinery/pkg/runtime/helper.go | 2 +- .../apimachinery/pkg/runtime/interfaces.go | 8 +- .../pkg/runtime/local_scheme_test.go | 150 + .../apimachinery/pkg/runtime/schema/BUILD | 7 +- .../pkg/runtime/schema/generated.pb.go | 35 +- .../pkg/runtime/schema/generated.proto | 2 - .../pkg/runtime/schema/group_version.go | 5 +- .../pkg/runtime/schema/group_version_test.go | 180 + .../k8s.io/apimachinery/pkg/runtime/scheme.go | 104 +- .../apimachinery/pkg/runtime/scheme_test.go | 1021 + .../apimachinery/pkg/runtime/serializer/BUILD | 27 +- .../pkg/runtime/serializer/codec_test.go | 339 + .../pkg/runtime/serializer/json/BUILD | 33 +- .../pkg/runtime/serializer/json/json.go | 64 +- .../pkg/runtime/serializer/json/json_test.go | 346 + .../pkg/runtime/serializer/json/meta_test.go | 45 + .../pkg/runtime/serializer/protobuf/BUILD | 10 +- .../runtime/serializer/protobuf/protobuf.go | 11 + .../pkg/runtime/serializer/recognizer/BUILD | 5 +- .../pkg/runtime/serializer/sparse_test.go | 91 + .../pkg/runtime/serializer/streaming/BUILD | 11 +- .../serializer/streaming/streaming_test.go | 84 + .../pkg/runtime/serializer/versioning/BUILD | 13 +- .../serializer/versioning/versioning.go | 22 +- .../serializer/versioning/versioning_test.go | 382 + .../pkg/runtime/swagger_doc_generator_test.go | 43 + .../pkg/runtime/zz_generated.deepcopy.go | 8 +- .../k8s.io/apimachinery/pkg/selection/BUILD | 1 + vendor/k8s.io/apimachinery/pkg/types/BUILD | 1 + .../k8s.io/apimachinery/pkg/util/cache/BUILD | 3 +- .../apimachinery/pkg/util/cache/cache_test.go | 90 + .../pkg/util/cache/lruexpirecache_test.go | 68 + .../k8s.io/apimachinery/pkg/util/clock/BUILD | 1 + .../apimachinery/pkg/util/clock/clock_test.go | 196 + .../k8s.io/apimachinery/pkg/util/diff/BUILD | 3 +- .../k8s.io/apimachinery/pkg/util/diff/diff.go | 8 + .../apimachinery/pkg/util/diff/diff_test.go | 148 + .../k8s.io/apimachinery/pkg/util/errors/BUILD | 1 + .../pkg/util/errors/errors_test.go | 368 + .../k8s.io/apimachinery/pkg/util/framer/BUILD | 1 + .../pkg/util/framer/framer_test.go | 176 + .../apimachinery/pkg/util/httpstream/BUILD | 1 + .../pkg/util/httpstream/httpstream_test.go | 125 + .../pkg/util/httpstream/spdy/BUILD | 19 +- .../util/httpstream/spdy/connection_test.go | 164 + .../util/httpstream/spdy/roundtripper_test.go | 529 + .../pkg/util/httpstream/spdy/upgrade_test.go | 93 + .../k8s.io/apimachinery/pkg/util/intstr/BUILD | 7 +- .../apimachinery/pkg/util/intstr/intstr.go | 11 + .../pkg/util/intstr/intstr_test.go | 183 + .../k8s.io/apimachinery/pkg/util/json/BUILD | 1 + .../apimachinery/pkg/util/json/json_test.go | 319 + .../apimachinery/pkg/util/mergepatch/BUILD | 1 + .../apimachinery/pkg/util/mergepatch/util.go | 2 +- .../pkg/util/mergepatch/util_test.go | 136 + .../pkg/util/naming}/BUILD | 31 +- .../pkg/util/naming/from_stack.go | 93 + .../pkg/util/naming/from_stack_test.go | 56 + vendor/k8s.io/apimachinery/pkg/util/net/BUILD | 3 +- .../k8s.io/apimachinery/pkg/util/net/http.go | 22 +- .../apimachinery/pkg/util/net/http_test.go | 282 + .../apimachinery/pkg/util/net/interface.go | 26 +- .../pkg/util/net/interface_test.go | 725 + .../pkg/util/net/port_range_test.go | 77 + .../pkg/util/net/port_split_test.go | 121 + .../apimachinery/pkg/util/net/util_test.go | 68 + .../k8s.io/apimachinery/pkg/util/proxy/BUILD | 61 - .../apimachinery/pkg/util/proxy/dial.go | 117 - .../k8s.io/apimachinery/pkg/util/proxy/doc.go | 18 - .../apimachinery/pkg/util/proxy/transport.go | 259 - .../pkg/util/proxy/upgradeaware.go | 413 - .../k8s.io/apimachinery/pkg/util/rand/BUILD | 1 + .../apimachinery/pkg/util/rand/rand_test.go | 114 + .../apimachinery/pkg/util/remotecommand/BUILD | 3 +- .../apimachinery/pkg/util/runtime/BUILD | 1 + .../pkg/util/runtime/runtime_test.go | 71 + .../k8s.io/apimachinery/pkg/util/sets/BUILD | 6 +- .../apimachinery/pkg/util/sets/set_test.go | 270 + .../pkg/util/strategicpatch/BUILD | 19 +- .../pkg/util/strategicpatch/OWNERS | 1 + .../pkg/util/strategicpatch/patch.go | 2 +- .../pkg/util/strategicpatch/patch_test.go | 6763 ++ .../apimachinery/pkg/util/validation/BUILD | 5 +- .../pkg/util/validation/field/BUILD | 5 +- .../pkg/util/validation/field/errors.go | 2 +- .../pkg/util/validation/field/errors_test.go | 175 + .../pkg/util/validation/field/path_test.go | 123 + .../pkg/util/validation/validation.go | 16 + .../pkg/util/validation/validation_test.go | 541 + .../k8s.io/apimachinery/pkg/util/wait/BUILD | 5 +- .../k8s.io/apimachinery/pkg/util/wait/wait.go | 4 +- .../apimachinery/pkg/util/wait/wait_test.go | 501 + .../k8s.io/apimachinery/pkg/util/yaml/BUILD | 1 + .../pkg/util/yaml/decoder_test.go | 405 + vendor/k8s.io/apimachinery/pkg/version/BUILD | 1 + .../apimachinery/pkg/version/helpers_test.go | 52 + vendor/k8s.io/apimachinery/pkg/watch/BUILD | 30 +- .../apimachinery/pkg/watch/filter_test.go | 84 + .../k8s.io/apimachinery/pkg/watch/mux_test.go | 176 + .../pkg/watch/streamwatcher_test.go | 68 + vendor/k8s.io/apimachinery/pkg/watch/until.go | 87 - vendor/k8s.io/apimachinery/pkg/watch/watch.go | 47 + .../apimachinery/pkg/watch/watch_test.go | 175 + .../pkg/watch/zz_generated.deepcopy.go | 4 +- .../third_party/forked/golang/json/BUILD | 1 + .../forked/golang/json/fields_test.go | 30 + .../third_party/forked/golang/netutil/BUILD | 1 + .../third_party/forked/golang/reflect/BUILD | 1 + .../forked/golang/reflect/deep_equal_test.go | 137 + vendor/k8s.io/apiserver/CONTRIBUTING.md | 7 + vendor/k8s.io/apiserver/OWNERS | 22 + vendor/k8s.io/apiserver/README.md | 30 + vendor/k8s.io/apiserver/SECURITY_CONTACTS | 17 + vendor/k8s.io/apiserver/code-of-conduct.md | 3 + .../pkg/authentication/authenticator/BUILD | 3 +- .../pkg/authentication/serviceaccount/BUILD | 3 +- .../serviceaccount/util_test.go | 82 + .../apiserver/pkg/authentication/user/BUILD | 1 + .../pkg/authorization/authorizer/BUILD | 29 - .../authorization/authorizer/interfaces.go | 158 - .../pkg/authorization/authorizer/rule.go | 73 - vendor/k8s.io/apiserver/pkg/features/BUILD | 3 +- .../apiserver/pkg/features/kube_features.go | 12 +- vendor/k8s.io/apiserver/pkg/server/BUILD | 141 + vendor/k8s.io/apiserver/pkg/server/config.go | 627 + .../apiserver/pkg/server/config_selfclient.go | 95 + .../pkg/server/config_selfclient_test.go | 69 + .../apiserver/pkg/server/config_test.go | 155 + .../pkg/server/deprecated_insecure_serving.go | 85 + .../probe.go => apiserver/pkg/server/doc.go} | 11 +- .../apiserver/pkg/server/genericapiserver.go | 447 + .../pkg/server/genericapiserver_test.go | 582 + vendor/k8s.io/apiserver/pkg/server/handler.go | 190 + vendor/k8s.io/apiserver/pkg/server/healthz.go | 45 + .../apiserver/pkg/server/healthz/healthz.go | 168 - vendor/k8s.io/apiserver/pkg/server/hooks.go | 230 + .../k8s.io/apiserver/pkg/server/httplog/BUILD | 1 + .../apiserver/pkg/server/httplog/httplog.go | 11 +- .../pkg/server/httplog/httplog_test.go | 152 + vendor/k8s.io/apiserver/pkg/server/plugins.go | 34 + .../apiserver/pkg/server/secure_serving.go | 234 + vendor/k8s.io/apiserver/pkg/server/signal.go | 43 + .../pkg/server/signal_posix.go} | 13 +- .../pkg/server/signal_windows.go} | 10 +- vendor/k8s.io/apiserver/pkg/storage/BUILD | 53 +- vendor/k8s.io/apiserver/pkg/storage/cacher.go | 989 - vendor/k8s.io/apiserver/pkg/storage/errors.go | 2 +- .../k8s.io/apiserver/pkg/storage/etcd/BUILD | 62 +- .../pkg/storage/etcd/api_object_versioner.go | 25 +- .../storage/etcd/api_object_versioner_test.go | 95 + .../apiserver/pkg/storage/etcd/etcd_helper.go | 23 +- .../pkg/storage/etcd/etcd_helper_test.go | 747 + .../pkg/storage/etcd/etcd_watcher.go | 4 - .../pkg/storage/etcd/etcd_watcher_test.go | 579 + .../apiserver/pkg/storage/etcd/metrics/BUILD | 1 + .../apiserver/pkg/storage/etcd/util/BUILD | 1 + .../pkg/storage/etcd/util/etcd_util_test.go | 120 + .../apiserver/pkg/storage/interfaces.go | 35 +- .../pkg/storage/selection_predicate_test.go | 134 + .../apiserver/pkg/storage/time_budget.go | 95 - vendor/k8s.io/apiserver/pkg/storage/util.go | 26 - .../k8s.io/apiserver/pkg/storage/util_test.go | 54 + .../apiserver/pkg/storage/watch_cache.go | 484 - .../k8s.io/apiserver/pkg/util/feature/BUILD | 6 +- .../pkg/util/feature/feature_gate.go | 60 +- .../pkg/util/feature/feature_gate_test.go | 347 + vendor/k8s.io/apiserver/pkg/util/flag/BUILD | 5 +- .../pkg/util/flag/ciphersuites_flag_test.go | 114 + ...n_separated_multimap_string_string_test.go | 242 + ...langle_separated_map_string_string_test.go | 159 + .../pkg/util/flag/map_string_bool_test.go | 163 + .../pkg/util/flag/map_string_string_test.go | 181 + .../pkg/util/flag/namedcertkey_flag_test.go | 138 + .../apiserver/pkg/util/flag/sectioned.go | 95 + .../apiserver/pkg/util/flushwriter/BUILD | 35 - .../apiserver/pkg/util/flushwriter/doc.go | 19 - .../apiserver/pkg/util/flushwriter/writer.go | 53 - vendor/k8s.io/apiserver/pkg/util/logs/BUILD | 3 +- vendor/k8s.io/apiserver/pkg/util/logs/logs.go | 12 +- vendor/k8s.io/apiserver/pkg/util/trace/BUILD | 1 + .../k8s.io/apiserver/pkg/util/wsstream/BUILD | 3 +- .../apiserver/pkg/util/wsstream/conn_test.go | 272 + .../pkg/util/wsstream/stream_test.go | 294 + vendor/k8s.io/client-go/CONTRIBUTING.md | 7 + vendor/k8s.io/client-go/INSTALL.md | 162 + vendor/k8s.io/client-go/OWNERS | 17 + vendor/k8s.io/client-go/SECURITY_CONTACTS | 17 + vendor/k8s.io/client-go/code-of-conduct.md | 3 + vendor/k8s.io/client-go/discovery/BUILD | 59 +- .../client-go/discovery/cached_discovery.go | 4 +- .../discovery/cached_discovery_test.go | 169 + .../discovery/discovery_client_test.go | 882 + vendor/k8s.io/client-go/discovery/doc.go | 19 + .../discovery/helper_blackbox_test.go | 184 + .../client-go/discovery/round_tripper.go | 13 +- .../client-go/discovery/round_tripper_test.go | 95 + .../client-go/discovery/unstructured.go | 81 - vendor/k8s.io/client-go/dynamic/BUILD | 65 + .../k8s.io/client-go/dynamic/client_test.go | 651 + vendor/k8s.io/client-go/dynamic/interface.go | 59 + vendor/k8s.io/client-go/dynamic/scheme.go | 98 + vendor/k8s.io/client-go/dynamic/simple.go | 326 + vendor/k8s.io/client-go/informers/BUILD | 104 +- .../informers/admissionregistration/BUILD | 7 +- .../admissionregistration/v1alpha1/BUILD | 17 +- .../v1alpha1/initializerconfiguration.go | 6 +- .../admissionregistration/v1beta1/BUILD | 17 +- .../v1beta1/mutatingwebhookconfiguration.go | 6 +- .../v1beta1/validatingwebhookconfiguration.go | 6 +- vendor/k8s.io/client-go/informers/apps/BUILD | 9 +- .../k8s.io/client-go/informers/apps/v1/BUILD | 17 +- .../informers/apps/v1/controllerrevision.go | 12 +- .../client-go/informers/apps/v1/daemonset.go | 12 +- .../client-go/informers/apps/v1/deployment.go | 12 +- .../client-go/informers/apps/v1/replicaset.go | 12 +- .../informers/apps/v1/statefulset.go | 12 +- .../client-go/informers/apps/v1beta1/BUILD | 17 +- .../apps/v1beta1/controllerrevision.go | 6 +- .../informers/apps/v1beta1/deployment.go | 6 +- .../informers/apps/v1beta1/statefulset.go | 6 +- .../client-go/informers/apps/v1beta2/BUILD | 17 +- .../apps/v1beta2/controllerrevision.go | 6 +- .../informers/apps/v1beta2/daemonset.go | 6 +- .../informers/apps/v1beta2/deployment.go | 6 +- .../informers/apps/v1beta2/replicaset.go | 6 +- .../informers/apps/v1beta2/statefulset.go | 6 +- .../client-go/informers/autoscaling/BUILD | 9 +- .../informers/autoscaling/interface.go | 8 + .../client-go/informers/autoscaling/v1/BUILD | 17 +- .../autoscaling/v1/horizontalpodautoscaler.go | 12 +- .../informers/autoscaling/v2beta1/BUILD | 17 +- .../v2beta1/horizontalpodautoscaler.go | 6 +- .../informers/autoscaling/v2beta2/BUILD | 36 + .../v2beta2/horizontalpodautoscaler.go | 89 + .../autoscaling/v2beta2/interface.go | 45 + vendor/k8s.io/client-go/informers/batch/BUILD | 9 +- .../k8s.io/client-go/informers/batch/v1/BUILD | 17 +- .../client-go/informers/batch/v1/job.go | 12 +- .../client-go/informers/batch/v1beta1/BUILD | 17 +- .../informers/batch/v1beta1/cronjob.go | 6 +- .../client-go/informers/batch/v2alpha1/BUILD | 17 +- .../informers/batch/v2alpha1/cronjob.go | 6 +- .../client-go/informers/certificates/BUILD | 5 +- .../informers/certificates/v1beta1/BUILD | 17 +- .../v1beta1/certificatesigningrequest.go | 6 +- .../client-go/informers/coordination/BUILD | 30 + .../informers/coordination/interface.go | 46 + .../informers/coordination/v1beta1/BUILD | 36 + .../coordination/v1beta1/interface.go | 45 + .../informers/coordination/v1beta1/lease.go | 89 + vendor/k8s.io/client-go/informers/core/BUILD | 5 +- .../k8s.io/client-go/informers/core/v1/BUILD | 17 +- .../informers/core/v1/componentstatus.go | 12 +- .../client-go/informers/core/v1/configmap.go | 12 +- .../client-go/informers/core/v1/endpoints.go | 12 +- .../client-go/informers/core/v1/event.go | 12 +- .../client-go/informers/core/v1/limitrange.go | 12 +- .../client-go/informers/core/v1/namespace.go | 12 +- .../client-go/informers/core/v1/node.go | 12 +- .../informers/core/v1/persistentvolume.go | 12 +- .../core/v1/persistentvolumeclaim.go | 12 +- .../k8s.io/client-go/informers/core/v1/pod.go | 12 +- .../informers/core/v1/podtemplate.go | 12 +- .../core/v1/replicationcontroller.go | 12 +- .../informers/core/v1/resourcequota.go | 12 +- .../client-go/informers/core/v1/secret.go | 12 +- .../client-go/informers/core/v1/service.go | 12 +- .../informers/core/v1/serviceaccount.go | 12 +- .../k8s.io/client-go/informers/events/BUILD | 5 +- .../client-go/informers/events/v1beta1/BUILD | 17 +- .../informers/events/v1beta1/event.go | 6 +- .../client-go/informers/extensions/BUILD | 5 +- .../informers/extensions/v1beta1/BUILD | 17 +- .../informers/extensions/v1beta1/daemonset.go | 6 +- .../extensions/v1beta1/deployment.go | 6 +- .../informers/extensions/v1beta1/ingress.go | 6 +- .../extensions/v1beta1/podsecuritypolicy.go | 6 +- .../extensions/v1beta1/replicaset.go | 6 +- vendor/k8s.io/client-go/informers/factory.go | 6 + vendor/k8s.io/client-go/informers/generic.go | 150 +- .../informers/internalinterfaces/BUILD | 9 +- .../client-go/informers/networking/BUILD | 5 +- .../client-go/informers/networking/v1/BUILD | 17 +- .../informers/networking/v1/networkpolicy.go | 12 +- .../k8s.io/client-go/informers/policy/BUILD | 5 +- .../client-go/informers/policy/v1beta1/BUILD | 17 +- .../policy/v1beta1/poddisruptionbudget.go | 6 +- .../policy/v1beta1/podsecuritypolicy.go | 6 +- vendor/k8s.io/client-go/informers/rbac/BUILD | 9 +- .../k8s.io/client-go/informers/rbac/v1/BUILD | 17 +- .../informers/rbac/v1/clusterrole.go | 12 +- .../informers/rbac/v1/clusterrolebinding.go | 12 +- .../client-go/informers/rbac/v1/role.go | 12 +- .../informers/rbac/v1/rolebinding.go | 12 +- .../client-go/informers/rbac/v1alpha1/BUILD | 17 +- .../informers/rbac/v1alpha1/clusterrole.go | 6 +- .../rbac/v1alpha1/clusterrolebinding.go | 6 +- .../client-go/informers/rbac/v1alpha1/role.go | 6 +- .../informers/rbac/v1alpha1/rolebinding.go | 6 +- .../client-go/informers/rbac/v1beta1/BUILD | 17 +- .../informers/rbac/v1beta1/clusterrole.go | 6 +- .../rbac/v1beta1/clusterrolebinding.go | 6 +- .../client-go/informers/rbac/v1beta1/role.go | 6 +- .../informers/rbac/v1beta1/rolebinding.go | 6 +- .../client-go/informers/scheduling/BUILD | 7 +- .../informers/scheduling/v1alpha1/BUILD | 17 +- .../scheduling/v1alpha1/priorityclass.go | 6 +- .../informers/scheduling/v1beta1/BUILD | 17 +- .../scheduling/v1beta1/priorityclass.go | 6 +- .../k8s.io/client-go/informers/settings/BUILD | 5 +- .../informers/settings/v1alpha1/BUILD | 17 +- .../informers/settings/v1alpha1/podpreset.go | 6 +- .../k8s.io/client-go/informers/storage/BUILD | 9 +- .../client-go/informers/storage/v1/BUILD | 17 +- .../informers/storage/v1/storageclass.go | 12 +- .../informers/storage/v1alpha1/BUILD | 17 +- .../storage/v1alpha1/volumeattachment.go | 6 +- .../client-go/informers/storage/v1beta1/BUILD | 17 +- .../informers/storage/v1beta1/storageclass.go | 6 +- .../storage/v1beta1/volumeattachment.go | 6 +- vendor/k8s.io/client-go/kubernetes/BUILD | 78 +- .../k8s.io/client-go/kubernetes/clientset.go | 36 + .../k8s.io/client-go/kubernetes/scheme/BUILD | 79 +- .../client-go/kubernetes/scheme/register.go | 76 +- .../admissionregistration/v1alpha1/BUILD | 15 +- .../typed/admissionregistration/v1beta1/BUILD | 15 +- .../client-go/kubernetes/typed/apps/v1/BUILD | 15 +- .../typed/apps/v1/controllerrevision.go | 22 +- .../kubernetes/typed/apps/v1/daemonset.go | 22 +- .../kubernetes/typed/apps/v1/deployment.go | 22 +- .../kubernetes/typed/apps/v1/replicaset.go | 22 +- .../kubernetes/typed/apps/v1/statefulset.go | 22 +- .../kubernetes/typed/apps/v1beta1/BUILD | 15 +- .../kubernetes/typed/apps/v1beta2/BUILD | 15 +- .../kubernetes/typed/authentication/v1/BUILD | 9 +- .../typed/authentication/v1beta1/BUILD | 9 +- .../kubernetes/typed/authorization/v1/BUILD | 9 +- .../typed/authorization/v1beta1/BUILD | 9 +- .../kubernetes/typed/autoscaling/v1/BUILD | 15 +- .../autoscaling/v1/horizontalpodautoscaler.go | 22 +- .../typed/autoscaling/v2beta1/BUILD | 15 +- .../typed/autoscaling/v2beta2/BUILD | 40 + .../autoscaling/v2beta2/autoscaling_client.go | 90 + .../typed/autoscaling/v2beta2/doc.go | 20 + .../v2beta2/generated_expansion.go} | 8 +- .../v2beta2/horizontalpodautoscaler.go | 174 + .../client-go/kubernetes/typed/batch/v1/BUILD | 15 +- .../kubernetes/typed/batch/v1/job.go | 22 +- .../kubernetes/typed/batch/v1beta1/BUILD | 15 +- .../kubernetes/typed/batch/v2alpha1/BUILD | 15 +- .../typed/certificates/v1beta1/BUILD | 15 +- .../typed/coordination/v1beta1/BUILD | 40 + .../v1beta1/coordination_client.go} | 39 +- .../typed/coordination}/v1beta1/doc.go | 0 .../v1beta1/generated_expansion.go | 4 +- .../typed/coordination/v1beta1/lease.go | 157 + .../client-go/kubernetes/typed/core/v1/BUILD | 29 +- .../typed/core/v1/componentstatus.go | 22 +- .../kubernetes/typed/core/v1/configmap.go | 22 +- .../kubernetes/typed/core/v1/endpoints.go | 22 +- .../kubernetes/typed/core/v1/event.go | 22 +- .../kubernetes/typed/core/v1/limitrange.go | 22 +- .../kubernetes/typed/core/v1/namespace.go | 18 +- .../kubernetes/typed/core/v1/node.go | 22 +- .../typed/core/v1/persistentvolume.go | 22 +- .../typed/core/v1/persistentvolumeclaim.go | 22 +- .../client-go/kubernetes/typed/core/v1/pod.go | 22 +- .../kubernetes/typed/core/v1/podtemplate.go | 22 +- .../typed/core/v1/replicationcontroller.go | 26 +- .../kubernetes/typed/core/v1/resourcequota.go | 22 +- .../kubernetes/typed/core/v1/secret.go | 22 +- .../kubernetes/typed/core/v1/service.go | 18 +- .../typed/core/v1/serviceaccount.go | 22 +- .../kubernetes/typed/events/v1beta1/BUILD | 15 +- .../kubernetes/typed/extensions/v1beta1/BUILD | 19 +- .../kubernetes/typed/networking/v1/BUILD | 15 +- .../typed/networking/v1/networkpolicy.go | 22 +- .../kubernetes/typed/policy/v1beta1/BUILD | 15 +- .../client-go/kubernetes/typed/rbac/v1/BUILD | 15 +- .../kubernetes/typed/rbac/v1/clusterrole.go | 22 +- .../typed/rbac/v1/clusterrolebinding.go | 22 +- .../kubernetes/typed/rbac/v1/role.go | 22 +- .../kubernetes/typed/rbac/v1/rolebinding.go | 22 +- .../kubernetes/typed/rbac/v1alpha1/BUILD | 15 +- .../kubernetes/typed/rbac/v1beta1/BUILD | 15 +- .../typed/scheduling/v1alpha1/BUILD | 15 +- .../kubernetes/typed/scheduling/v1beta1/BUILD | 15 +- .../kubernetes/typed/settings/v1alpha1/BUILD | 15 +- .../kubernetes/typed/storage/v1/BUILD | 15 +- .../typed/storage/v1/storageclass.go | 22 +- .../kubernetes/typed/storage/v1alpha1/BUILD | 15 +- .../kubernetes/typed/storage/v1beta1/BUILD | 15 +- .../admissionregistration/v1alpha1/BUILD | 9 +- .../admissionregistration/v1beta1/BUILD | 9 +- vendor/k8s.io/client-go/listers/apps/v1/BUILD | 13 +- .../client-go/listers/apps/v1beta1/BUILD | 13 +- .../client-go/listers/apps/v1beta2/BUILD | 13 +- .../client-go/listers/autoscaling/v1/BUILD | 9 +- .../listers/autoscaling/v2beta1/BUILD | 9 +- .../listers/autoscaling/v2beta2/BUILD | 32 + .../v2beta2/expansion_generated.go} | 26 +- .../v2beta2/horizontalpodautoscaler.go | 94 + .../k8s.io/client-go/listers/batch/v1/BUILD | 13 +- .../client-go/listers/batch/v1beta1/BUILD | 9 +- .../client-go/listers/batch/v2alpha1/BUILD | 9 +- .../listers/certificates/v1beta1/BUILD | 9 +- .../listers/coordination/v1beta1/BUILD | 32 + .../v1beta1/expansion_generated.go | 27 + .../listers/coordination/v1beta1/lease.go | 94 + vendor/k8s.io/client-go/listers/core/v1/BUILD | 9 +- .../client-go/listers/events/v1beta1/BUILD | 9 +- .../listers/extensions/v1beta1/BUILD | 27 +- .../v1beta1/daemonset_expansion_test.go | 152 + .../client-go/listers/networking/v1/BUILD | 9 +- .../client-go/listers/policy/v1beta1/BUILD | 13 +- vendor/k8s.io/client-go/listers/rbac/v1/BUILD | 9 +- .../client-go/listers/rbac/v1alpha1/BUILD | 9 +- .../client-go/listers/rbac/v1beta1/BUILD | 9 +- .../listers/scheduling/v1alpha1/BUILD | 9 +- .../listers/scheduling/v1beta1/BUILD | 9 +- .../client-go/listers/settings/v1alpha1/BUILD | 9 +- .../k8s.io/client-go/listers/storage/v1/BUILD | 9 +- .../client-go/listers/storage/v1alpha1/BUILD | 9 +- .../client-go/listers/storage/v1beta1/BUILD | 9 +- .../pkg/apis/clientauthentication/BUILD | 7 +- .../apis/clientauthentication/v1alpha1/BUILD | 11 +- .../v1alpha1/zz_generated.conversion.go | 53 +- .../v1alpha1/zz_generated.deepcopy.go | 29 +- .../apis/clientauthentication/v1beta1/BUILD | 11 +- .../v1beta1/zz_generated.conversion.go | 46 +- .../v1beta1/zz_generated.deepcopy.go | 14 +- .../zz_generated.deepcopy.go | 29 +- vendor/k8s.io/client-go/pkg/version/BUILD | 3 +- .../plugin/pkg/client/auth/exec/BUILD | 32 +- .../plugin/pkg/client/auth/exec/exec.go | 25 +- .../plugin/pkg/client/auth/exec/exec_test.go | 748 + vendor/k8s.io/client-go/rest/BUILD | 79 +- vendor/k8s.io/client-go/rest/client_test.go | 343 + vendor/k8s.io/client-go/rest/config.go | 26 +- vendor/k8s.io/client-go/rest/config_test.go | 375 + vendor/k8s.io/client-go/rest/plugin_test.go | 311 + vendor/k8s.io/client-go/rest/request.go | 69 +- vendor/k8s.io/client-go/rest/request_test.go | 1937 + vendor/k8s.io/client-go/rest/token_source.go | 138 + .../client-go/rest/token_source_test.go | 156 + .../k8s.io/client-go/rest/url_utils_test.go | 61 + .../k8s.io/client-go/rest/urlbackoff_test.go | 79 + vendor/k8s.io/client-go/rest/watch/BUILD | 33 +- .../client-go/rest/watch/decoder_test.go | 123 + .../client-go/rest/watch/encoder_test.go | 84 + vendor/k8s.io/client-go/tools/cache/BUILD | 56 +- .../client-go/tools/cache/controller_test.go | 405 + .../client-go/tools/cache/delta_fifo_test.go | 492 + .../tools/cache/expiration_cache_test.go | 189 + .../k8s.io/client-go/tools/cache/fifo_test.go | 280 + .../k8s.io/client-go/tools/cache/heap_test.go | 382 + .../client-go/tools/cache/index_test.go | 163 + .../k8s.io/client-go/tools/cache/listwatch.go | 83 - .../tools/cache/mutation_detector_test.go | 81 + .../tools/cache/processor_listener_test.go | 58 + .../k8s.io/client-go/tools/cache/reflector.go | 77 +- .../client-go/tools/cache/reflector_test.go | 389 + .../tools/cache/shared_informer_test.go | 265 + .../client-go/tools/cache/store_test.go | 156 + .../tools/cache/undelta_store_test.go | 131 + .../client-go/tools/clientcmd/api/BUILD | 5 +- .../client-go/tools/clientcmd/api/helpers.go | 9 +- .../tools/clientcmd/api/helpers_test.go | 302 + .../tools/clientcmd/api/types_test.go | 135 + .../clientcmd/api/zz_generated.deepcopy.go | 44 +- vendor/k8s.io/client-go/tools/metrics/BUILD | 1 + vendor/k8s.io/client-go/tools/pager/BUILD | 21 +- .../client-go/tools/pager/pager_test.go | 206 + vendor/k8s.io/client-go/tools/record/BUILD | 45 +- .../client-go/tools/record/event_test.go | 924 + .../client-go/tools/record/events_cache.go | 5 - .../tools/record/events_cache_test.go | 279 + vendor/k8s.io/client-go/tools/reference/BUILD | 15 +- .../client-go/tools/reference/ref_test.go | 72 + .../client-go/tools/remotecommand/BUILD | 23 +- .../tools/remotecommand/remotecommand.go | 4 +- .../client-go/tools/remotecommand/v2_test.go | 228 + .../client-go/tools/remotecommand/v4_test.go | 71 + vendor/k8s.io/client-go/tools/watch/BUILD | 57 + .../client-go/tools/watch/informerwatcher.go | 114 + .../tools/watch/informerwatcher_test.go | 236 + vendor/k8s.io/client-go/tools/watch/until.go | 225 + .../client-go/tools/watch/until_test.go | 303 + vendor/k8s.io/client-go/transport/BUILD | 3 +- .../k8s.io/client-go/transport/cache_test.go | 157 + .../client-go/transport/round_trippers.go | 123 +- .../transport/round_trippers_test.go | 329 + vendor/k8s.io/client-go/transport/spdy/BUILD | 7 +- .../client-go/transport/transport_test.go | 288 + vendor/k8s.io/client-go/util/buffer/BUILD | 1 + .../util/buffer/ring_growing_test.go | 50 + vendor/k8s.io/client-go/util/cert/BUILD | 1 + vendor/k8s.io/client-go/util/cert/cert.go | 63 +- vendor/k8s.io/client-go/util/cert/csr_test.go | 75 + vendor/k8s.io/client-go/util/cert/pem_test.go | 197 + .../k8s.io/client-go/util/certificate/BUILD | 66 - .../k8s.io/client-go/util/certificate/OWNERS | 8 - .../util/certificate/certificate_manager.go | 429 - .../util/certificate/certificate_store.go | 338 - .../client-go/util/certificate/csr/BUILD | 53 - .../client-go/util/certificate/csr/csr.go | 261 - .../k8s.io/client-go/util/connrotation/BUILD | 1 + .../util/connrotation/connrotation_test.go | 61 + vendor/k8s.io/client-go/util/exec/BUILD | 1 + .../k8s.io/client-go/util/flowcontrol/BUILD | 7 +- .../util/flowcontrol/backoff_test.go | 195 + .../util/flowcontrol/throttle_test.go | 153 + vendor/k8s.io/client-go/util/integer/BUILD | 1 + .../client-go/util/integer/integer_test.go | 244 + vendor/k8s.io/client-go/util/retry/BUILD | 11 +- .../k8s.io/client-go/util/retry/util_test.go | 71 + vendor/k8s.io/client-go/util/workqueue/BUILD | 16 +- .../workqueue/default_rate_limiters_test.go | 184 + .../util/workqueue/delaying_queue_test.go | 255 + .../client-go/util/workqueue/parallelizer.go | 21 +- .../client-go/util/workqueue/queue_test.go | 161 + .../workqueue/rate_limitting_queue_test.go | 75 + vendor/k8s.io/csi-api/LICENSE | 201 + .../csi-api/pkg/apis/csi/v1alpha1/BUILD | 33 + .../pkg/apis/csi/v1alpha1}/doc.go | 10 +- .../pkg/apis/csi/v1alpha1}/register.go | 43 +- .../csi-api/pkg/apis/csi/v1alpha1/types.go | 142 + .../csi}/v1alpha1/zz_generated.deepcopy.go | 125 +- .../pkg/client/clientset/versioned/BUILD | 37 + .../client/clientset/versioned}/clientset.go | 42 +- .../pkg/client/clientset/versioned}/doc.go | 2 +- .../client/clientset/versioned/scheme/BUILD | 34 + .../client/clientset/versioned}/scheme/doc.go | 0 .../clientset/versioned}/scheme/register.go | 20 +- .../versioned/typed/csi/v1alpha1/BUILD | 41 + .../typed/csi/v1alpha1/csi_client.go} | 40 +- .../versioned/typed/csi/v1alpha1/csidriver.go | 147 + .../typed/csi/v1alpha1/csinodeinfo.go | 147 + .../versioned/typed/csi}/v1alpha1/doc.go | 0 .../csi}/v1alpha1/generated_expansion.go | 4 +- vendor/k8s.io/kube-openapi/pkg/common/BUILD | 1 + .../k8s.io/kube-openapi/pkg/util/proto/BUILD | 1 + vendor/k8s.io/kubelet/LICENSE | 202 + vendor/k8s.io/kubelet/config/v1beta1/BUILD | 34 + vendor/k8s.io/kubelet/config/v1beta1/doc.go | 21 + .../config/v1beta1}/register.go | 31 +- .../config}/v1beta1/types.go | 42 + .../config}/v1beta1/zz_generated.deepcopy.go | 173 +- .../kubernetes/cmd/kubelet/app/options/BUILD | 75 +- .../kubelet/app/options/container_runtime.go | 5 +- .../cmd/kubelet/app/options/globalflags.go | 6 - .../cmd/kubelet/app/options/options.go | 29 +- .../kubernetes/pkg/api/legacyscheme/BUILD | 4 +- vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD | 16 +- .../k8s.io/kubernetes/pkg/api/v1/pod/util.go | 10 +- .../kubernetes/pkg/api/v1/resource/BUILD | 8 +- .../kubernetes/pkg/api/v1/resource/helpers.go | 71 +- .../util/files => api/v1/service}/BUILD | 29 +- .../kubernetes/pkg/api/v1/service/util.go | 97 + .../kubernetes/pkg/apis/autoscaling/BUILD | 9 +- .../kubernetes/pkg/apis/autoscaling/types.go | 136 +- .../apis/autoscaling/zz_generated.deepcopy.go | 265 +- .../kubernetes/pkg/apis/componentconfig/BUILD | 51 - .../pkg/apis/componentconfig/OWNERS | 43 - .../pkg/apis/componentconfig/types.go | 578 - .../componentconfig/zz_generated.deepcopy.go | 805 - vendor/k8s.io/kubernetes/pkg/apis/core/BUILD | 14 +- vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS | 2 + .../kubernetes/pkg/apis/core/helper/BUILD | 20 +- .../pkg/apis/core/helper/helpers.go | 2 +- .../kubernetes/pkg/apis/core/install/BUILD | 12 +- .../k8s.io/kubernetes/pkg/apis/core/types.go | 82 +- .../k8s.io/kubernetes/pkg/apis/core/v1/BUILD | 50 +- .../kubernetes/pkg/apis/core/v1/conversion.go | 153 +- .../kubernetes/pkg/apis/core/v1/defaults.go | 3 +- .../kubernetes/pkg/apis/core/v1/helper/BUILD | 24 +- .../pkg/apis/core/v1/helper/helpers.go | 16 +- .../pkg/apis/core/v1/helper/qos/BUILD | 12 +- .../kubernetes/pkg/apis/core/v1/register.go | 2 +- .../pkg/apis/core/v1/validation/BUILD | 44 - .../pkg/apis/core/v1/validation/validation.go | 165 - .../apis/core/v1/zz_generated.conversion.go | 2505 +- .../kubernetes/pkg/apis/core/validation/BUILD | 45 +- .../pkg/apis/core/validation/validation.go | 147 +- .../pkg/apis/core/zz_generated.deepcopy.go | 1453 +- .../kubernetes/pkg/apis/extensions/BUILD | 10 +- .../kubernetes/pkg/apis/extensions/OWNERS | 2 + .../kubernetes/pkg/apis/extensions/types.go | 4 +- .../pkg/apis/extensions/validation/BUILD | 52 - .../apis/extensions/validation/validation.go | 608 - .../apis/extensions/zz_generated.deepcopy.go | 104 +- .../kubernetes/pkg/apis/networking/BUILD | 8 +- .../kubernetes/pkg/apis/networking/types.go | 2 +- .../apis/networking/zz_generated.deepcopy.go | 40 +- .../k8s.io/kubernetes/pkg/apis/policy/BUILD | 8 +- .../kubernetes/pkg/apis/policy/types.go | 5 + .../pkg/apis/policy/validation/BUILD | 56 - .../pkg/apis/policy/validation/validation.go | 443 - .../pkg/apis/policy/zz_generated.deepcopy.go | 53 +- .../kubernetes/pkg/apis/scheduling/BUILD | 8 +- .../k8s.io/kubernetes/pkg/cloudprovider/BUILD | 6 +- .../kubernetes/pkg/cloudprovider/OWNERS | 3 + .../kubernetes/pkg/cloudprovider/README.md | 28 +- .../kubernetes/pkg/cloudprovider/cloud.go | 24 +- .../kubernetes/pkg/cloudprovider/plugins.go | 2 + .../providers/azure/auth/azure_auth.go | 21 +- vendor/k8s.io/kubernetes/pkg/controller/BUILD | 92 +- .../pkg/controller/client_builder.go | 37 +- .../pkg/controller/controller_utils.go | 12 +- .../pkg/controller/volume/events/event.go | 1 + .../pkg/controller/volume/expand/cache/BUILD | 52 - .../volume/expand/cache/volume_resize_map.go | 221 - .../controller/volume/persistentvolume/BUILD | 92 +- .../controller/volume/persistentvolume/OWNERS | 6 + .../volume/persistentvolume/metrics/BUILD | 2 +- .../persistentvolume/metrics/metrics.go | 27 + .../volume/persistentvolume/pv_controller.go | 150 +- .../scheduler_assume_cache.go | 27 +- .../persistentvolume/scheduler_binder.go | 275 +- .../scheduler_binder_cache.go | 27 +- .../persistentvolume/scheduler_binder_fake.go | 21 +- .../volume/persistentvolume/volume_host.go | 11 +- .../kubernetes/pkg/credentialprovider/BUILD | 2 +- .../azure/azure_credentials.go | 36 +- .../pkg/credentialprovider/gcp/BUILD | 4 +- .../pkg/credentialprovider/plugins.go | 16 +- .../pkg/credentialprovider/secrets/BUILD | 2 +- vendor/k8s.io/kubernetes/pkg/features/BUILD | 6 +- .../kubernetes/pkg/features/kube_features.go | 130 +- vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD | 9 +- .../kubernetes/pkg/fieldpath/fieldpath.go | 10 +- vendor/k8s.io/kubernetes/pkg/kubelet/BUILD | 296 - vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS | 9 - .../kubernetes/pkg/kubelet/active_deadline.go | 98 - .../k8s.io/kubernetes/pkg/kubelet/apis/BUILD | 13 +- .../apis/{kubeletconfig => config}/BUILD | 22 +- .../apis/{kubeletconfig => config}/OWNERS | 0 .../apis/{kubeletconfig => config}/doc.go | 3 +- .../apis/{kubeletconfig => config}/helpers.go | 2 +- .../{kubeletconfig => config}/register.go | 26 +- .../{kubeletconfig => config}/scheme/BUILD | 14 +- .../scheme/scheme.go | 6 +- .../apis/{kubeletconfig => config}/types.go | 25 +- .../{kubeletconfig => config}/v1beta1/BUILD | 19 +- .../v1beta1/defaults.go | 28 +- .../config/v1beta1/defaults_linux.go} | 17 +- .../apis/config/v1beta1/defaults_others.go | 26 + .../pkg/kubelet/apis/config/v1beta1/doc.go | 24 + .../v1beta1/register.go | 24 +- .../config/v1beta1/zz_generated.conversion.go | 553 + .../config/v1beta1/zz_generated.deepcopy.go | 21 + .../v1beta1/zz_generated.defaults.go | 5 +- .../pkg/kubelet/apis/config/validation/BUILD | 49 + .../validation/validation.go | 14 +- .../validation/validation_others.go | 2 +- .../validation/validation_windows.go | 2 +- .../zz_generated.deepcopy.go | 10 +- .../kubelet/apis/cri/runtime/v1alpha2/BUILD | 5 - .../apis/cri/runtime/v1alpha2/api.pb.go | 772 +- .../apis/cri/runtime/v1alpha2/api.proto | 13 + .../pkg/kubelet/apis/cri/services.go | 2 +- .../kubelet/apis/deviceplugin/v1beta1/BUILD | 5 - .../v1beta1/zz_generated.conversion.go | 479 - .../apis/kubeletconfig/validation/BUILD | 81 - .../apis/pluginregistration/v1alpha1/BUILD | 6 - .../pluginregistration/v1alpha1/api.proto | 12 +- .../pkg/kubelet/apis/stats/v1alpha1/BUILD | 2 +- .../kubernetes/pkg/kubelet/cadvisor/BUILD | 78 +- .../pkg/kubelet/cadvisor/cadvisor_linux.go | 67 +- .../kubelet/cadvisor/cadvisor_unsupported.go | 2 +- .../pkg/kubelet/cadvisor/cadvisor_windows.go | 2 +- .../kubernetes/pkg/kubelet/certificate/BUILD | 59 - .../kubernetes/pkg/kubelet/certificate/OWNERS | 7 - .../pkg/kubelet/certificate/kubelet.go | 150 - .../pkg/kubelet/certificate/transport.go | 148 - .../kubernetes/pkg/kubelet/checkpoint/BUILD | 6 +- vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD | 148 +- .../pkg/kubelet/cm/container_manager.go | 7 + .../pkg/kubelet/cm/container_manager_linux.go | 45 +- .../pkg/kubelet/cm/container_manager_stub.go | 5 + .../pkg/kubelet/cm/cpumanager/BUILD | 12 +- .../pkg/kubelet/cm/cpumanager/cpu_manager.go | 27 +- .../kubelet/cm/cpumanager/policy_static.go | 21 +- .../pkg/kubelet/cm/cpumanager/state/BUILD | 22 +- .../kubelet/cm/cpumanager/state/checkpoint.go | 67 + .../cm/cpumanager/state/state_checkpoint.go | 194 + .../pkg/kubelet/cm/devicemanager/BUILD | 20 +- .../cm/devicemanager/device_plugin_stub.go | 56 +- .../pkg/kubelet/cm/devicemanager/endpoint.go | 95 +- .../pkg/kubelet/cm/devicemanager/manager.go | 244 +- .../kubelet/cm/devicemanager/manager_stub.go | 12 +- .../pkg/kubelet/cm/devicemanager/types.go | 18 +- .../pkg/kubelet/cm/helpers_linux.go | 19 +- .../pkg/kubelet/cm/helpers_unsupported.go | 9 +- .../pkg/kubelet/cm/node_container_manager.go | 3 + .../kubelet/cm/pod_container_manager_linux.go | 7 +- .../kubernetes/pkg/kubelet/cm/util/BUILD | 40 +- .../kubernetes/pkg/kubelet/config/BUILD | 93 +- .../kubernetes/pkg/kubelet/config/file.go | 8 +- .../kubernetes/pkg/kubelet/config/flags.go | 13 +- .../kubernetes/pkg/kubelet/configmap/BUILD | 26 +- .../kubelet/configmap/configmap_manager.go | 24 + .../kubernetes/pkg/kubelet/container/BUILD | 37 +- .../pkg/kubelet/container/runtime.go | 3 +- vendor/k8s.io/kubernetes/pkg/kubelet/doc.go | 19 - .../kubernetes/pkg/kubelet/dockershim/BUILD | 103 +- .../pkg/kubelet/dockershim/cm/BUILD | 42 +- .../kubelet/dockershim/docker_checkpoint.go | 1 + .../dockershim/docker_image_windows.go | 5 +- .../dockershim/docker_legacy_service.go | 7 +- .../pkg/kubelet/dockershim/docker_sandbox.go | 24 +- .../dockershim/docker_sandbox_others.go | 42 - .../dockershim/docker_sandbox_windows.go | 39 - .../pkg/kubelet/dockershim/docker_service.go | 15 +- .../pkg/kubelet/dockershim/helpers.go | 2 + .../pkg/kubelet/dockershim/helpers_linux.go | 2 +- .../pkg/kubelet/dockershim/libdocker/BUILD | 4 +- .../libdocker/kube_docker_client.go | 4 +- .../pkg/kubelet/dockershim/network/BUILD | 10 +- .../pkg/kubelet/dockershim/network/cni/BUILD | 57 +- .../pkg/kubelet/dockershim/network/cni/cni.go | 108 +- .../dockershim/network/cni/cni_windows.go | 2 +- .../kubelet/dockershim/network/hostport/BUILD | 8 +- .../network/hostport/hostport_manager.go | 8 +- .../network/hostport/hostport_syncer.go | 20 +- .../kubelet/dockershim/network/kubenet/BUILD | 76 +- .../network/kubenet/kubenet_linux.go | 2 +- .../network/kubenet/kubenet_unsupported.go | 2 +- .../pkg/kubelet/dockershim/network/plugins.go | 2 +- .../kubelet/dockershim/security_context.go | 20 +- .../kubernetes/pkg/kubelet/envvars/BUILD | 43 - .../kubernetes/pkg/kubelet/envvars/doc.go | 19 - .../kubernetes/pkg/kubelet/envvars/envvars.go | 113 - .../kubernetes/pkg/kubelet/events/event.go | 2 - .../kubernetes/pkg/kubelet/eviction/BUILD | 126 - .../kubernetes/pkg/kubelet/eviction/OWNERS | 4 - .../kubernetes/pkg/kubelet/eviction/api/BUILD | 2 +- .../kubernetes/pkg/kubelet/eviction/doc.go | 19 - .../pkg/kubelet/eviction/eviction_manager.go | 567 - .../pkg/kubelet/eviction/helpers.go | 1098 - .../eviction/memory_threshold_notifier.go | 135 - .../eviction/threshold_notifier_linux.go | 185 - .../threshold_notifier_unsupported.go | 33 - .../kubernetes/pkg/kubelet/eviction/types.go | 160 - .../kubernetes/pkg/kubelet/images/BUILD | 22 +- .../pkg/kubelet/images/image_gc_manager.go | 3 +- .../k8s.io/kubernetes/pkg/kubelet/kubelet.go | 2197 - .../kubernetes/pkg/kubelet/kubelet_getters.go | 313 - .../kubernetes/pkg/kubelet/kubelet_network.go | 167 - .../pkg/kubelet/kubelet_node_status.go | 1178 - .../kubernetes/pkg/kubelet/kubelet_pods.go | 1761 - .../pkg/kubelet/kubelet_resources.go | 57 - .../kubernetes/pkg/kubelet/kubelet_volumes.go | 149 - .../pkg/kubelet/kubeletconfig/BUILD | 62 - .../pkg/kubelet/kubeletconfig/OWNERS | 5 - .../kubelet/kubeletconfig/checkpoint/BUILD | 67 - .../kubeletconfig/checkpoint/configmap.go | 61 - .../kubeletconfig/checkpoint/download.go | 273 - .../kubeletconfig/checkpoint/store/BUILD | 61 - .../checkpoint/store/fakestore.go | 75 - .../kubeletconfig/checkpoint/store/fsstore.go | 194 - .../kubeletconfig/checkpoint/store/store.go | 70 - .../kubelet/kubeletconfig/configfiles/BUILD | 48 - .../kubeletconfig/configfiles/configfiles.go | 90 - .../pkg/kubelet/kubeletconfig/configsync.go | 265 - .../pkg/kubelet/kubeletconfig/controller.go | 324 - .../pkg/kubelet/kubeletconfig/status/BUILD | 34 - .../kubelet/kubeletconfig/status/status.go | 202 - .../kubelet/kubeletconfig/util/codec/BUILD | 34 - .../kubelet/kubeletconfig/util/codec/codec.go | 93 - .../kubelet/kubeletconfig/util/files/files.go | 229 - .../pkg/kubelet/kubeletconfig/util/log/BUILD | 26 - .../pkg/kubelet/kubeletconfig/util/log/log.go | 49 - .../kubelet/kubeletconfig/util/panic/BUILD | 26 - .../pkg/kubelet/kubeletconfig/watch.go | 154 - .../kubernetes/pkg/kubelet/kuberuntime/BUILD | 103 +- .../kuberuntime/fake_kuberuntime_manager.go | 2 + .../pkg/kubelet/kuberuntime/helpers.go | 2 + .../pkg/kubelet/kuberuntime/helpers_linux.go | 18 +- .../kuberuntime/instrumented_services.go | 6 +- .../kuberuntime/kuberuntime_container.go | 12 +- .../kuberuntime_container_linux.go | 5 +- .../kubelet/kuberuntime/kuberuntime_logs.go | 5 +- .../kuberuntime/kuberuntime_manager.go | 35 +- .../kuberuntime/kuberuntime_sandbox.go | 14 +- .../pkg/kubelet/kuberuntime/logs/BUILD | 8 +- .../pkg/kubelet/kuberuntime/logs/logs.go | 11 +- .../kubelet/kuberuntime/security_context.go | 11 +- .../kubernetes/pkg/kubelet/lifecycle/BUILD | 12 +- .../admission_failure_handler_stub.go | 2 +- .../pkg/kubelet/lifecycle/handlers.go | 70 + .../pkg/kubelet/lifecycle/predicate.go | 24 +- .../k8s.io/kubernetes/pkg/kubelet/logs/BUILD | 46 - .../pkg/kubelet/logs/container_log_manager.go | 387 - .../kubernetes/pkg/kubelet/metrics/BUILD | 4 +- .../pkg/kubelet/metrics/collectors/BUILD | 47 - .../metrics/collectors/volume_stats.go | 120 - .../kubernetes/pkg/kubelet/metrics/metrics.go | 2 +- .../kubernetes/pkg/kubelet/mountpod/BUILD | 44 - .../pkg/kubelet/mountpod/mount_pod.go | 120 - .../kubernetes/pkg/kubelet/network/dns/BUILD | 50 - .../kubernetes/pkg/kubelet/network/dns/OWNERS | 4 - .../kubernetes/pkg/kubelet/network/dns/dns.go | 414 - .../kubernetes/pkg/kubelet/oom_watcher.go | 74 - .../k8s.io/kubernetes/pkg/kubelet/pleg/BUILD | 54 - .../k8s.io/kubernetes/pkg/kubelet/pleg/doc.go | 19 - .../kubernetes/pkg/kubelet/pleg/generic.go | 464 - .../kubernetes/pkg/kubelet/pleg/pleg.go | 52 - .../k8s.io/kubernetes/pkg/kubelet/pod/BUILD | 16 +- .../pkg/kubelet/pod_container_deletor.go | 112 - .../kubernetes/pkg/kubelet/pod_workers.go | 333 - .../kubernetes/pkg/kubelet/preemption/BUILD | 56 - .../pkg/kubelet/preemption/preemption.go | 264 - .../kubernetes/pkg/kubelet/prober/BUILD | 87 - .../kubernetes/pkg/kubelet/prober/prober.go | 279 - .../pkg/kubelet/prober/prober_manager.go | 258 - .../pkg/kubelet/prober/results/BUILD | 10 +- .../kubernetes/pkg/kubelet/prober/worker.go | 247 - .../k8s.io/kubernetes/pkg/kubelet/qos/BUILD | 6 +- .../kubernetes/pkg/kubelet/reason_cache.go | 105 - .../pkg/kubelet/remote/remote_image.go | 6 +- .../pkg/kubelet/remote/remote_runtime.go | 10 +- .../kubernetes/pkg/kubelet/remote/utils.go | 4 +- .../k8s.io/kubernetes/pkg/kubelet/runonce.go | 177 - .../k8s.io/kubernetes/pkg/kubelet/runtime.go | 118 - .../kubernetes/pkg/kubelet/runtimeclass/BUILD | 45 + .../runtimeclass/runtimeclass_manager.go | 97 + .../kubernetes/pkg/kubelet/secret/BUILD | 26 +- .../pkg/kubelet/secret/secret_manager.go | 24 + .../kubernetes/pkg/kubelet/server/BUILD | 105 - .../kubernetes/pkg/kubelet/server/auth.go | 114 - .../kubernetes/pkg/kubelet/server/doc.go | 18 - .../pkg/kubelet/server/portforward/BUILD | 14 +- .../kubelet/server/portforward/httpstream.go | 2 +- .../pkg/kubelet/server/remotecommand/BUILD | 20 +- .../kubernetes/pkg/kubelet/server/server.go | 837 - .../kubernetes/pkg/kubelet/server/stats/BUILD | 66 - .../pkg/kubelet/server/stats/doc.go | 20 - .../server/stats/fs_resource_analyzer.go | 107 - .../pkg/kubelet/server/stats/handler.go | 291 - .../kubelet/server/stats/resource_analyzer.go | 49 - .../pkg/kubelet/server/stats/summary.go | 116 - .../server/stats/volume_stat_calculator.go | 162 - .../pkg/kubelet/server/streaming/BUILD | 16 +- .../k8s.io/kubernetes/pkg/kubelet/stats/BUILD | 119 - .../kubelet/stats/cadvisor_stats_provider.go | 376 - .../pkg/kubelet/stats/cri_stats_provider.go | 487 - .../kubernetes/pkg/kubelet/stats/helper.go | 313 - .../pkg/kubelet/stats/stats_provider.go | 189 - .../pkg/kubelet/stats/stats_provider_linux.go | 48 - .../kubernetes/pkg/kubelet/status/BUILD | 32 +- .../pkg/kubelet/status/status_manager.go | 3 + .../kubernetes/pkg/kubelet/sysctl/BUILD | 46 - .../pkg/kubelet/sysctl/namespace.go | 60 - .../kubernetes/pkg/kubelet/sysctl/runtime.go | 95 - .../pkg/kubelet/sysctl/whitelist.go | 136 - .../k8s.io/kubernetes/pkg/kubelet/token/BUILD | 40 - .../kubernetes/pkg/kubelet/token/OWNERS | 6 - .../pkg/kubelet/token/token_manager.go | 151 - .../k8s.io/kubernetes/pkg/kubelet/types/BUILD | 13 +- .../pkg/kubelet/types/pod_update.go | 32 +- vendor/k8s.io/kubernetes/pkg/kubelet/util.go | 129 - .../k8s.io/kubernetes/pkg/kubelet/util/BUILD | 46 +- .../kubernetes/pkg/kubelet/util/cache/BUILD | 6 +- .../kubernetes/pkg/kubelet/util/format/BUILD | 26 +- .../kubernetes/pkg/kubelet/util/format/pod.go | 4 +- .../kubernetes/pkg/kubelet/util/manager/BUILD | 46 +- .../pkg/kubelet/util/pluginwatcher/BUILD | 36 +- .../pkg/kubelet/util/pluginwatcher/README | 13 +- .../util/pluginwatcher/example_handler.go | 147 + .../util/pluginwatcher/example_plugin.go | 77 +- .../example_plugin_apis/v1beta1/BUILD | 6 - .../example_plugin_apis/v1beta2/BUILD | 6 - .../util/pluginwatcher/plugin_watcher.go | 432 +- .../pkg/kubelet/util/pluginwatcher/types.go | 59 + .../kubernetes/pkg/kubelet/util/queue/BUILD | 41 - .../pkg/kubelet/util/queue/work_queue.go | 67 - .../pkg/kubelet/util/sliceutils/BUILD | 6 +- .../kubernetes/pkg/kubelet/volume_host.go | 272 - .../pkg/kubelet/volumemanager/BUILD | 83 - .../pkg/kubelet/volumemanager/OWNERS | 10 - .../pkg/kubelet/volumemanager/cache/BUILD | 57 - .../cache/actual_state_of_world.go | 850 - .../cache/desired_state_of_world.go | 373 - .../pkg/kubelet/volumemanager/populator/BUILD | 73 - .../desired_state_of_world_populator.go | 661 - .../kubelet/volumemanager/reconciler/BUILD | 73 - .../volumemanager/reconciler/reconciler.go | 694 - .../kubelet/volumemanager/volume_manager.go | 461 - .../kubernetes/pkg/kubelet/winstats/BUILD | 23 +- .../kubernetes/pkg/master/ports/ports.go | 8 + vendor/k8s.io/kubernetes/pkg/probe/BUILD | 33 - vendor/k8s.io/kubernetes/pkg/probe/doc.go | 18 - .../k8s.io/kubernetes/pkg/probe/exec/exec.go | 51 - vendor/k8s.io/kubernetes/pkg/probe/http/BUILD | 39 - .../k8s.io/kubernetes/pkg/probe/http/http.go | 101 - vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD | 37 - vendor/k8s.io/kubernetes/pkg/probe/tcp/tcp.go | 58 - vendor/k8s.io/kubernetes/pkg/proxy/BUILD | 22 +- vendor/k8s.io/kubernetes/pkg/proxy/OWNERS | 2 + .../k8s.io/kubernetes/pkg/proxy/endpoints.go | 6 +- .../kubernetes/pkg/proxy/healthcheck/BUILD | 16 +- .../kubernetes/pkg/proxy/iptables/BUILD | 21 +- .../kubernetes/pkg/proxy/iptables/proxier.go | 134 +- vendor/k8s.io/kubernetes/pkg/proxy/service.go | 24 +- vendor/k8s.io/kubernetes/pkg/proxy/types.go | 4 +- vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD | 19 +- .../k8s.io/kubernetes/pkg/proxy/util/utils.go | 7 +- .../kubernetes/pkg/scheduler/algorithm/BUILD | 16 +- .../pkg/scheduler/algorithm/predicates/BUILD | 42 +- .../predicates/csi_volume_predicate.go | 157 + .../algorithm/predicates/metadata.go | 333 +- .../algorithm/predicates/predicates.go | 303 +- .../scheduler/algorithm/priorities/util/BUILD | 21 +- .../algorithm/priorities/util/util.go | 36 - .../pkg/scheduler/algorithm/types.go | 7 +- .../k8s.io/kubernetes/pkg/scheduler/api/BUILD | 12 +- .../kubernetes/pkg/scheduler/api/types.go | 3 + .../scheduler/api/zz_generated.deepcopy.go | 163 +- .../kubernetes/pkg/scheduler/cache/BUILD | 38 +- .../kubernetes/pkg/scheduler/cache/cache.go | 129 +- .../pkg/scheduler/cache/interface.go | 3 + .../pkg/scheduler/cache/node_info.go | 39 +- .../pkg/scheduler/cache/node_tree.go | 187 + .../kubernetes/pkg/scheduler/cache/util.go | 43 +- .../kubernetes/pkg/scheduler/util/BUILD | 11 +- .../pkg/scheduler/volumebinder/BUILD | 10 +- .../scheduler/volumebinder/volume_binder.go | 25 +- .../kubernetes/pkg/security/apparmor/BUILD | 43 +- .../security/podsecuritypolicy/seccomp/BUILD | 40 - .../podsecuritypolicy/seccomp/strategy.go | 149 - .../security/podsecuritypolicy/sysctl/BUILD | 40 - .../sysctl/mustmatchpatterns.go | 126 - .../podsecuritypolicy/sysctl/types.go | 28 - .../pkg/security/podsecuritypolicy/util/BUILD | 44 - .../security/podsecuritypolicy/util/doc.go | 19 - .../security/podsecuritypolicy/util/util.go | 242 - .../kubernetes/pkg/securitycontext/BUILD | 6 +- .../pkg/securitycontext/accessors.go | 13 + .../kubernetes/pkg/securitycontext/fake.go | 2 + .../kubernetes/pkg/securitycontext/util.go | 56 +- .../kubernetes/pkg/serviceaccount/BUILD | 33 +- .../kubernetes/pkg/serviceaccount/claims.go | 41 +- .../kubernetes/pkg/serviceaccount/jwt.go | 47 +- .../kubernetes/pkg/serviceaccount/legacy.go | 34 +- .../kubernetes/pkg/serviceaccount/util.go | 59 +- vendor/k8s.io/kubernetes/pkg/util/async/BUILD | 2 +- .../kubernetes/pkg/util/bandwidth/BUILD | 55 +- .../k8s.io/kubernetes/pkg/util/config/BUILD | 2 +- .../k8s.io/kubernetes/pkg/util/configz/BUILD | 32 - .../kubernetes/pkg/util/configz/configz.go | 90 - .../kubernetes/pkg/util/conntrack/BUILD | 12 +- .../pkg/{probe/exec => util/flag}/BUILD | 22 +- .../helpers.go => util/flag/flags.go} | 58 +- .../kubernetes/pkg/util/goroutinemap/BUILD | 4 +- vendor/k8s.io/kubernetes/pkg/util/io/BUILD | 9 +- .../k8s.io/kubernetes/pkg/util/io/writer.go | 87 - .../k8s.io/kubernetes/pkg/util/iptables/BUILD | 58 +- .../kubernetes/pkg/util/iptables/iptables.go | 23 +- .../pkg/util/iptables/save_restore.go | 40 +- vendor/k8s.io/kubernetes/pkg/util/mount/BUILD | 84 +- .../kubernetes/pkg/util/mount/exec_mount.go | 4 + .../pkg/util/mount/exec_mount_unsupported.go | 4 + .../k8s.io/kubernetes/pkg/util/mount/fake.go | 15 +- .../k8s.io/kubernetes/pkg/util/mount/mount.go | 7 +- .../kubernetes/pkg/util/mount/mount_linux.go | 62 +- .../pkg/util/mount/mount_unsupported.go | 10 +- .../pkg/util/mount/mount_windows.go | 50 +- .../pkg/util/mount/nsenter_mount.go | 13 +- .../util/mount/nsenter_mount_unsupported.go | 4 + vendor/k8s.io/kubernetes/pkg/util/node/BUILD | 18 +- .../k8s.io/kubernetes/pkg/util/node/node.go | 48 +- .../k8s.io/kubernetes/pkg/util/nsenter/BUILD | 49 +- .../k8s.io/kubernetes/pkg/util/nsenter/OWNERS | 8 + .../kubernetes/pkg/util/nsenter/exec.go | 67 + .../pkg/util/nsenter/exec_unsupported.go | 58 + vendor/k8s.io/kubernetes/pkg/util/oom/BUILD | 46 +- vendor/k8s.io/kubernetes/pkg/util/pod/BUILD | 14 +- .../k8s.io/kubernetes/pkg/util/pointer/BUILD | 32 - .../k8s.io/kubernetes/pkg/util/procfs/BUILD | 48 +- .../kubernetes/pkg/util/removeall/BUILD | 37 - .../pkg/util/removeall/removeall.go | 108 - .../k8s.io/kubernetes/pkg/util/resizefs/BUILD | 94 - .../pkg/util/resizefs/resizefs_linux.go | 86 - .../pkg/util/resizefs/resizefs_unsupported.go | 40 - .../k8s.io/kubernetes/pkg/util/selinux/BUILD | 39 +- .../k8s.io/kubernetes/pkg/util/taints/BUILD | 10 +- vendor/k8s.io/kubernetes/pkg/version/BUILD | 2 +- vendor/k8s.io/kubernetes/pkg/version/def.bzl | 45 +- vendor/k8s.io/kubernetes/pkg/volume/BUILD | 84 +- vendor/k8s.io/kubernetes/pkg/volume/OWNERS | 2 + vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD | 83 - .../k8s.io/kubernetes/pkg/volume/csi/OWNERS | 4 - .../kubernetes/pkg/volume/csi/csi_attacher.go | 567 - .../kubernetes/pkg/volume/csi/csi_block.go | 283 - .../kubernetes/pkg/volume/csi/csi_client.go | 293 - .../kubernetes/pkg/volume/csi/csi_mounter.go | 346 - .../kubernetes/pkg/volume/csi/csi_plugin.go | 443 - .../kubernetes/pkg/volume/csi/csi_util.go | 123 - .../pkg/volume/csi/labelmanager/BUILD | 30 - .../volume/csi/labelmanager/labelmanager.go | 251 - .../k8s.io/kubernetes/pkg/volume/plugins.go | 45 +- .../k8s.io/kubernetes/pkg/volume/util/BUILD | 88 +- .../pkg/volume/util/attach_limit.go | 34 + .../kubernetes/pkg/volume/util/device_util.go | 2 + .../pkg/volume/util/device_util_linux.go | 206 + .../volume/util/device_util_unsupported.go | 12 + .../kubernetes/pkg/volume/util/fs/BUILD | 63 +- .../kubernetes/pkg/volume/util/io_util.go | 4 + .../volume/util/nestedpendingoperations/BUILD | 44 - .../util/nestedpendingoperations/OWNERS | 2 - .../nestedpendingoperations.go | 322 - .../pkg/volume/util/operationexecutor/BUILD | 65 - .../pkg/volume/util/operationexecutor/OWNERS | 2 - .../operationexecutor/operation_executor.go | 942 - .../operationexecutor/operation_generator.go | 1412 - .../pkg/volume/util/recyclerclient/BUILD | 20 +- .../kubernetes/pkg/volume/util/types/BUILD | 2 +- .../k8s.io/kubernetes/pkg/volume/util/util.go | 240 +- .../pkg/volume/util/volumepathhandler/BUILD | 41 +- .../kubernetes/pkg/volume/validation/BUILD | 41 - .../pkg/volume/validation/pv_validation.go | 71 - vendor/k8s.io/kubernetes/pkg/volume/volume.go | 10 + vendor/k8s.io/metrics/CONTRIBUTING.md | 7 + vendor/k8s.io/metrics/IMPLEMENTATIONS.md | 26 + vendor/k8s.io/metrics/OWNERS | 3 + vendor/k8s.io/metrics/README.md | 71 + vendor/k8s.io/metrics/SECURITY_CONTACTS | 17 + vendor/k8s.io/metrics/code-of-conduct.md | 3 + vendor/k8s.io/metrics/pkg/apis/metrics/BUILD | 41 - .../k8s.io/metrics/pkg/apis/metrics/types.go | 95 - .../metrics/pkg/apis/metrics/v1alpha1/BUILD | 49 - .../pkg/apis/metrics/v1alpha1/generated.pb.go | 1564 - .../pkg/apis/metrics/v1alpha1/generated.proto | 90 - .../pkg/apis/metrics/v1alpha1/types.go | 95 - .../v1alpha1/zz_generated.conversion.go | 169 - .../metrics/pkg/apis/metrics/v1beta1/BUILD | 49 - .../pkg/apis/metrics/v1beta1/generated.pb.go | 1563 - .../pkg/apis/metrics/v1beta1/generated.proto | 90 - .../metrics/pkg/apis/metrics/v1beta1/types.go | 95 - .../v1beta1/zz_generated.conversion.go | 169 - .../metrics/v1beta1/zz_generated.deepcopy.go | 185 - .../pkg/apis/metrics/zz_generated.deepcopy.go | 185 - .../clientset_generated/clientset/BUILD | 41 - .../clientset/scheme/BUILD | 36 - .../clientset/typed/metrics/v1alpha1/BUILD | 42 - .../typed/metrics/v1alpha1/nodemetrics.go | 85 - .../typed/metrics/v1alpha1/podmetrics.go | 90 - .../clientset/typed/metrics/v1beta1/BUILD | 39 - .../typed/metrics/v1beta1/nodemetrics.go | 85 - .../typed/metrics/v1beta1/podmetrics.go | 90 - vendor/k8s.io/utils/clock/BUILD | 1 + vendor/k8s.io/utils/exec/BUILD | 1 + .../http/mux => k8s.io/utils/pointer}/BUILD | 5 +- .../pkg/util => utils}/pointer/pointer.go | 7 +- vendor/vendor.json | 2973 +- 1751 files changed, 275347 insertions(+), 65871 deletions(-) create mode 100644 vendor/github.com/Rican7/retry/BUILD create mode 100644 vendor/github.com/Rican7/retry/LICENSE create mode 100644 vendor/github.com/Rican7/retry/Makefile create mode 100644 vendor/github.com/Rican7/retry/README.md rename vendor/github.com/{google/cadvisor/healthz => Rican7/retry/backoff}/BUILD (72%) create mode 100644 vendor/github.com/Rican7/retry/backoff/backoff.go rename vendor/github.com/{google/cadvisor/pages/static => Rican7/retry/jitter}/BUILD (68%) create mode 100644 vendor/github.com/Rican7/retry/jitter/jitter.go create mode 100644 vendor/github.com/Rican7/retry/retry.go create mode 100644 vendor/github.com/Rican7/retry/strategy/BUILD create mode 100644 vendor/github.com/Rican7/retry/strategy/strategy.go create mode 100644 vendor/github.com/containerd/console/BUILD create mode 100644 vendor/github.com/containerd/console/LICENSE create mode 100644 vendor/github.com/containerd/console/README.md create mode 100644 vendor/github.com/containerd/console/console.go create mode 100644 vendor/github.com/containerd/console/console_linux.go create mode 100644 vendor/github.com/containerd/console/console_unix.go create mode 100644 vendor/github.com/containerd/console/console_windows.go create mode 100644 vendor/github.com/containerd/console/tc_darwin.go create mode 100644 vendor/github.com/containerd/console/tc_freebsd.go create mode 100644 vendor/github.com/containerd/console/tc_linux.go create mode 100644 vendor/github.com/containerd/console/tc_solaris_cgo.go create mode 100644 vendor/github.com/containerd/console/tc_solaris_nocgo.go create mode 100644 vendor/github.com/containerd/console/tc_unix.go create mode 100644 vendor/github.com/containerd/containerd/api/services/containers/v1/BUILD create mode 100644 vendor/github.com/containerd/containerd/api/services/tasks/v1/BUILD create mode 100644 vendor/github.com/containerd/containerd/api/services/version/v1/BUILD create mode 100644 vendor/github.com/containerd/containerd/api/types/BUILD create mode 100644 vendor/github.com/containerd/containerd/api/types/task/BUILD create mode 100644 vendor/github.com/containerd/containerd/containers/BUILD create mode 100644 vendor/github.com/containerd/containerd/dialer/BUILD create mode 100644 vendor/github.com/containerd/containerd/errdefs/BUILD create mode 100644 vendor/github.com/containerd/containerd/namespaces/BUILD create mode 100644 vendor/github.com/cyphar/filepath-securejoin/BUILD create mode 100644 vendor/github.com/cyphar/filepath-securejoin/LICENSE create mode 100644 vendor/github.com/cyphar/filepath-securejoin/README.md create mode 100644 vendor/github.com/cyphar/filepath-securejoin/VERSION create mode 100644 vendor/github.com/cyphar/filepath-securejoin/join.go create mode 100644 vendor/github.com/cyphar/filepath-securejoin/vendor.conf create mode 100644 vendor/github.com/cyphar/filepath-securejoin/vfs.go create mode 100644 vendor/github.com/docker/docker/AUTHORS rename vendor/github.com/docker/docker/api/types/volume/{volumes_create.go => volume_create.go} (88%) rename vendor/github.com/docker/docker/api/types/volume/{volumes_list.go => volume_list.go} (83%) delete mode 100644 vendor/github.com/docker/docker/client/parse_logs.go create mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/BUILD create mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go create mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go create mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go create mode 100644 vendor/github.com/docker/docker/pkg/mount/BUILD delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go create mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD create mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go create mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go create mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go create mode 100644 vendor/github.com/google/cadvisor/AUTHORS rename vendor/github.com/google/cadvisor/{api => accelerators}/BUILD (60%) delete mode 100644 vendor/github.com/google/cadvisor/api/handler.go delete mode 100644 vendor/github.com/google/cadvisor/api/versions.go create mode 100644 vendor/github.com/google/cadvisor/container/containerd/BUILD create mode 100644 vendor/github.com/google/cadvisor/container/libcontainer/handler.go create mode 100644 vendor/github.com/google/cadvisor/container/mesos/BUILD create mode 100644 vendor/github.com/google/cadvisor/container/mesos/client.go create mode 100644 vendor/github.com/google/cadvisor/container/mesos/factory.go create mode 100644 vendor/github.com/google/cadvisor/container/mesos/handler.go create mode 100644 vendor/github.com/google/cadvisor/container/mesos/mesos_agent.go delete mode 100644 vendor/github.com/google/cadvisor/healthz/healthz.go delete mode 100644 vendor/github.com/google/cadvisor/http/BUILD delete mode 100644 vendor/github.com/google/cadvisor/http/handlers.go delete mode 100644 vendor/github.com/google/cadvisor/http/mux/mux.go delete mode 100644 vendor/github.com/google/cadvisor/pages/BUILD delete mode 100644 vendor/github.com/google/cadvisor/pages/containers.go delete mode 100644 vendor/github.com/google/cadvisor/pages/docker.go delete mode 100644 vendor/github.com/google/cadvisor/pages/pages.go delete mode 100644 vendor/github.com/google/cadvisor/pages/static/assets.go delete mode 100644 vendor/github.com/google/cadvisor/pages/static/static.go delete mode 100644 vendor/github.com/google/cadvisor/pages/templates.go delete mode 100644 vendor/github.com/google/cadvisor/validate/validate.go create mode 100644 vendor/github.com/mattn/go-shellwords/BUILD create mode 100644 vendor/github.com/mattn/go-shellwords/LICENSE create mode 100644 vendor/github.com/mattn/go-shellwords/README.md create mode 100644 vendor/github.com/mattn/go-shellwords/shellwords.go create mode 100644 vendor/github.com/mattn/go-shellwords/util_go15.go create mode 100644 vendor/github.com/mattn/go-shellwords/util_posix.go create mode 100644 vendor/github.com/mattn/go-shellwords/util_windows.go create mode 100644 vendor/github.com/mesos/mesos-go/LICENSE create mode 100644 vendor/github.com/mesos/mesos-go/NOTICE create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb_ffjson.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.proto create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls_generated.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/gen.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/client.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/client/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/client/client.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/debug/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/debug/logger.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/doc.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/codecs.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/decoder.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/framing.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/json.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/doc.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/encoding.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/types.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/filters.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/fixedpoint.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/apierrors.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/auth_basic.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/http.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/opts.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/labels.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb_ffjson.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.proto create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/ranges.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/doc.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/reader.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/strconv.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/writer.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/resources.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/roles/BUILD create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/roles/role.go create mode 100644 vendor/github.com/mesos/mesos-go/api/v1/lib/values.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/compat_1.5_linux.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unsupported.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/configs/intelrdt.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/console.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/console_freebsd.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/console_solaris.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/console_windows.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/container_solaris.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/container_windows.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/criu_opts_windows.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/intelrdt/BUILD create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go rename vendor/github.com/{google/cadvisor/validate => opencontainers/runc/libcontainer/mount}/BUILD (53%) create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/mount/mount.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/mount/mount_linux.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/mount/mountinfo.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/setgroups_linux.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/stats_freebsd.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/stats_solaris.go delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/stats_windows.go create mode 100644 vendor/github.com/opencontainers/runc/libcontainer/system/BUILD rename vendor/github.com/opencontainers/runc/libcontainer/system/{syscall_linux_386.go => syscall_linux_32.go} (93%) delete mode 100644 vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_arm.go create mode 100644 vendor/github.com/pquerna/ffjson/LICENSE create mode 100644 vendor/github.com/pquerna/ffjson/NOTICE create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/BUILD create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/buffer.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/buffer_nopool.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/buffer_pool.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/bytenum.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/decimal.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/extfloat.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/fold.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/ftoa.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/internal/BUILD create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/internal/atof.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/internal/atoi.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/internal/extfloat.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/internal/ftoa.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/iota.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/jsonstring.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/lexer.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/reader.go create mode 100644 vendor/github.com/pquerna/ffjson/fflib/v1/reader_scan_generic.go create mode 100644 vendor/gopkg.in/square/go-jose.v2/opaque.go create mode 100644 vendor/k8s.io/api/BUILD create mode 100644 vendor/k8s.io/api/CONTRIBUTING.md create mode 100644 vendor/k8s.io/api/OWNERS create mode 100644 vendor/k8s.io/api/README.md create mode 100644 vendor/k8s.io/api/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/BUILD rename vendor/k8s.io/{metrics/pkg/apis/metrics/v1beta1 => api/autoscaling/v2beta2}/doc.go (84%) create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.proto rename vendor/k8s.io/{metrics/pkg/apis/metrics/v1beta1 => api/autoscaling/v2beta2}/register.go (82%) create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/code-of-conduct.md create mode 100644 vendor/k8s.io/api/coordination/v1beta1/BUILD create mode 100644 vendor/k8s.io/api/coordination/v1beta1/doc.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/generated.pb.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/generated.proto rename vendor/k8s.io/{metrics/pkg/apis/metrics/v1alpha1 => api/coordination/v1beta1}/register.go (77%) create mode 100644 vendor/k8s.io/api/coordination/v1beta1/types.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/types_swagger_doc_generated.go create mode 100644 vendor/k8s.io/api/coordination/v1beta1/zz_generated.deepcopy.go create mode 100644 vendor/k8s.io/api/roundtrip_test.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/BUILD create mode 100644 vendor/k8s.io/apiextensions-apiserver/CONTRIBUTING.md create mode 100644 vendor/k8s.io/apiextensions-apiserver/OWNERS create mode 100644 vendor/k8s.io/apiextensions-apiserver/README.md create mode 100644 vendor/k8s.io/apiextensions-apiserver/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/apiextensions-apiserver/code-of-conduct.md rename vendor/k8s.io/{kubernetes/pkg/kubelet/kubeletconfig/util/panic/panic.go => apiextensions-apiserver/main.go} (55%) create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/server.go create mode 100644 vendor/k8s.io/apimachinery/CONTRIBUTING.md create mode 100644 vendor/k8s.io/apimachinery/OWNERS create mode 100644 vendor/k8s.io/apimachinery/README.md create mode 100644 vendor/k8s.io/apimachinery/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/apimachinery/code-of-conduct.md create mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/errors_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/meta_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/multirestmapper_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/amount_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/math_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/quantity_example_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/scale_int_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/path/name_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register_test.go rename vendor/k8s.io/{kubernetes/pkg/kubelet/stats/stats_provider_unsupported.go => apimachinery/pkg/apis/meta/internalversion/roundtrip_test.go} (72%) create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/controller_ref_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/labels_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/converter_test.go rename vendor/k8s.io/{apiserver/pkg/server/healthz/doc.go => apimachinery/pkg/conversion/helper_test.go} (58%) create mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/fields/fields_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/fields/selector_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/labels/labels_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/labels/selector_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/conversion_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/converter_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/embedded_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/extension_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/scheme_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/meta_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/streaming_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/swagger_doc_generator_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/cache_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/errors_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/framer/framer_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/httpstream_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/intstr_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/json/json_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/mergepatch/util_test.go rename vendor/k8s.io/{apiserver/pkg/server/healthz => apimachinery/pkg/util/naming}/BUILD (50%) create mode 100644 vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/naming/from_stack_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/http_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/interface_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/port_split_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/util_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/rand/rand_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/runtime/runtime_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/set_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/errors_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/path_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/validation_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/wait_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/version/helpers_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/filter_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/mux_test.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/streamwatcher_test.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/until.go create mode 100644 vendor/k8s.io/apimachinery/pkg/watch/watch_test.go create mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go create mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal_test.go create mode 100644 vendor/k8s.io/apiserver/CONTRIBUTING.md create mode 100644 vendor/k8s.io/apiserver/OWNERS create mode 100644 vendor/k8s.io/apiserver/README.md create mode 100644 vendor/k8s.io/apiserver/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/apiserver/code-of-conduct.md create mode 100644 vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/util_test.go delete mode 100644 vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/authorization/authorizer/interfaces.go delete mode 100644 vendor/k8s.io/apiserver/pkg/authorization/authorizer/rule.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/BUILD create mode 100644 vendor/k8s.io/apiserver/pkg/server/config.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/config_selfclient.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/config_selfclient_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/config_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go rename vendor/k8s.io/{kubernetes/pkg/probe/probe.go => apiserver/pkg/server/doc.go} (81%) create mode 100644 vendor/k8s.io/apiserver/pkg/server/genericapiserver.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/genericapiserver_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/handler.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/healthz.go delete mode 100644 vendor/k8s.io/apiserver/pkg/server/healthz/healthz.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/hooks.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/httplog/httplog_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/plugins.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/secure_serving.go create mode 100644 vendor/k8s.io/apiserver/pkg/server/signal.go rename vendor/k8s.io/{metrics/pkg/apis/metrics/v1alpha1/doc.go => apiserver/pkg/server/signal_posix.go} (81%) rename vendor/k8s.io/{metrics/pkg/apis/metrics/doc.go => apiserver/pkg/server/signal_windows.go} (87%) delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/cacher.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/etcd/util/etcd_util_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/selection_predicate_test.go delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/time_budget.go create mode 100644 vendor/k8s.io/apiserver/pkg/storage/util_test.go delete mode 100644 vendor/k8s.io/apiserver/pkg/storage/watch_cache.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/feature/feature_gate_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/colon_separated_multimap_string_string_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/map_string_bool_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/map_string_string_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/namedcertkey_flag_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/flag/sectioned.go delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flushwriter/doc.go delete mode 100644 vendor/k8s.io/apiserver/pkg/util/flushwriter/writer.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/wsstream/conn_test.go create mode 100644 vendor/k8s.io/apiserver/pkg/util/wsstream/stream_test.go create mode 100644 vendor/k8s.io/client-go/CONTRIBUTING.md create mode 100644 vendor/k8s.io/client-go/INSTALL.md create mode 100644 vendor/k8s.io/client-go/OWNERS create mode 100644 vendor/k8s.io/client-go/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/client-go/code-of-conduct.md create mode 100644 vendor/k8s.io/client-go/discovery/cached_discovery_test.go create mode 100644 vendor/k8s.io/client-go/discovery/discovery_client_test.go create mode 100644 vendor/k8s.io/client-go/discovery/doc.go create mode 100644 vendor/k8s.io/client-go/discovery/helper_blackbox_test.go create mode 100644 vendor/k8s.io/client-go/discovery/round_tripper_test.go delete mode 100644 vendor/k8s.io/client-go/discovery/unstructured.go create mode 100644 vendor/k8s.io/client-go/dynamic/BUILD create mode 100644 vendor/k8s.io/client-go/dynamic/client_test.go create mode 100644 vendor/k8s.io/client-go/dynamic/interface.go create mode 100644 vendor/k8s.io/client-go/dynamic/scheme.go create mode 100644 vendor/k8s.io/client-go/dynamic/simple.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/informers/autoscaling/v2beta2/interface.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/BUILD create mode 100644 vendor/k8s.io/client-go/informers/coordination/interface.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD create mode 100644 vendor/k8s.io/client-go/informers/coordination/v1beta1/interface.go create mode 100644 vendor/k8s.io/client-go/informers/coordination/v1beta1/lease.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/autoscaling_client.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/doc.go rename vendor/k8s.io/{kubernetes/pkg/apis/componentconfig/doc.go => client-go/kubernetes/typed/autoscaling/v2beta2/generated_expansion.go} (78%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/metrics_client.go => client-go/kubernetes/typed/coordination/v1beta1/coordination_client.go} (59%) rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset/typed/metrics => client-go/kubernetes/typed/coordination}/v1beta1/doc.go (100%) rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset/typed/metrics => client-go/kubernetes/typed/coordination}/v1beta1/generated_expansion.go (89%) create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD rename vendor/k8s.io/{kubernetes/pkg/kubelet/stats/log_metrics_provider.go => client-go/listers/autoscaling/v2beta2/expansion_generated.go} (53%) create mode 100644 vendor/k8s.io/client-go/listers/autoscaling/v2beta2/horizontalpodautoscaler.go create mode 100644 vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD create mode 100644 vendor/k8s.io/client-go/listers/coordination/v1beta1/expansion_generated.go create mode 100644 vendor/k8s.io/client-go/listers/coordination/v1beta1/lease.go create mode 100644 vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset_expansion_test.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go create mode 100644 vendor/k8s.io/client-go/rest/client_test.go create mode 100644 vendor/k8s.io/client-go/rest/config_test.go create mode 100644 vendor/k8s.io/client-go/rest/plugin_test.go create mode 100755 vendor/k8s.io/client-go/rest/request_test.go create mode 100644 vendor/k8s.io/client-go/rest/token_source.go create mode 100644 vendor/k8s.io/client-go/rest/token_source_test.go create mode 100644 vendor/k8s.io/client-go/rest/url_utils_test.go create mode 100644 vendor/k8s.io/client-go/rest/urlbackoff_test.go create mode 100644 vendor/k8s.io/client-go/rest/watch/decoder_test.go create mode 100644 vendor/k8s.io/client-go/rest/watch/encoder_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/controller_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/delta_fifo_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/expiration_cache_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/fifo_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/heap_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/index_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/mutation_detector_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/processor_listener_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/reflector_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/shared_informer_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/store_test.go create mode 100644 vendor/k8s.io/client-go/tools/cache/undelta_store_test.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/helpers_test.go create mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/types_test.go create mode 100644 vendor/k8s.io/client-go/tools/pager/pager_test.go create mode 100644 vendor/k8s.io/client-go/tools/record/event_test.go create mode 100644 vendor/k8s.io/client-go/tools/record/events_cache_test.go create mode 100644 vendor/k8s.io/client-go/tools/reference/ref_test.go create mode 100644 vendor/k8s.io/client-go/tools/remotecommand/v2_test.go create mode 100644 vendor/k8s.io/client-go/tools/remotecommand/v4_test.go create mode 100644 vendor/k8s.io/client-go/tools/watch/BUILD create mode 100644 vendor/k8s.io/client-go/tools/watch/informerwatcher.go create mode 100644 vendor/k8s.io/client-go/tools/watch/informerwatcher_test.go create mode 100644 vendor/k8s.io/client-go/tools/watch/until.go create mode 100644 vendor/k8s.io/client-go/tools/watch/until_test.go create mode 100644 vendor/k8s.io/client-go/transport/cache_test.go create mode 100644 vendor/k8s.io/client-go/transport/round_trippers_test.go create mode 100644 vendor/k8s.io/client-go/transport/transport_test.go create mode 100644 vendor/k8s.io/client-go/util/buffer/ring_growing_test.go create mode 100644 vendor/k8s.io/client-go/util/cert/csr_test.go create mode 100644 vendor/k8s.io/client-go/util/cert/pem_test.go delete mode 100644 vendor/k8s.io/client-go/util/certificate/BUILD delete mode 100644 vendor/k8s.io/client-go/util/certificate/OWNERS delete mode 100644 vendor/k8s.io/client-go/util/certificate/certificate_manager.go delete mode 100644 vendor/k8s.io/client-go/util/certificate/certificate_store.go delete mode 100644 vendor/k8s.io/client-go/util/certificate/csr/BUILD delete mode 100644 vendor/k8s.io/client-go/util/certificate/csr/csr.go create mode 100644 vendor/k8s.io/client-go/util/connrotation/connrotation_test.go create mode 100644 vendor/k8s.io/client-go/util/flowcontrol/backoff_test.go create mode 100644 vendor/k8s.io/client-go/util/flowcontrol/throttle_test.go create mode 100644 vendor/k8s.io/client-go/util/integer/integer_test.go create mode 100644 vendor/k8s.io/client-go/util/retry/util_test.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/default_rate_limiters_test.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/delaying_queue_test.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/queue_test.go create mode 100644 vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go create mode 100644 vendor/k8s.io/csi-api/LICENSE create mode 100644 vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/BUILD rename vendor/k8s.io/{kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1 => csi-api/pkg/apis/csi/v1alpha1}/doc.go (68%) rename vendor/k8s.io/{kubernetes/pkg/apis/componentconfig => csi-api/pkg/apis/csi/v1alpha1}/register.go (57%) create mode 100644 vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/types.go rename vendor/k8s.io/{metrics/pkg/apis/metrics => csi-api/pkg/apis/csi}/v1alpha1/zz_generated.deepcopy.go (60%) create mode 100644 vendor/k8s.io/csi-api/pkg/client/clientset/versioned/BUILD rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset => csi-api/pkg/client/clientset/versioned}/clientset.go (62%) rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset => csi-api/pkg/client/clientset/versioned}/doc.go (97%) create mode 100644 vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/BUILD rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset => csi-api/pkg/client/clientset/versioned}/scheme/doc.go (100%) rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset => csi-api/pkg/client/clientset/versioned}/scheme/register.go (82%) create mode 100644 vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/BUILD rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/metrics_client.go => csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csi_client.go} (59%) create mode 100644 vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csidriver.go create mode 100644 vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csinodeinfo.go rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset/typed/metrics => csi-api/pkg/client/clientset/versioned/typed/csi}/v1alpha1/doc.go (100%) rename vendor/k8s.io/{metrics/pkg/client/clientset_generated/clientset/typed/metrics => csi-api/pkg/client/clientset/versioned/typed/csi}/v1alpha1/generated_expansion.go (89%) create mode 100644 vendor/k8s.io/kubelet/LICENSE create mode 100644 vendor/k8s.io/kubelet/config/v1beta1/BUILD create mode 100644 vendor/k8s.io/kubelet/config/v1beta1/doc.go rename vendor/k8s.io/{metrics/pkg/apis/metrics => kubelet/config/v1beta1}/register.go (57%) rename vendor/k8s.io/{kubernetes/pkg/kubelet/apis/kubeletconfig => kubelet/config}/v1beta1/types.go (94%) rename vendor/k8s.io/{kubernetes/pkg/kubelet/apis/kubeletconfig => kubelet/config}/v1beta1/zz_generated.deepcopy.go (85%) rename vendor/k8s.io/kubernetes/pkg/{kubelet/kubeletconfig/util/files => api/v1/service}/BUILD (59%) create mode 100644 vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/componentconfig/BUILD delete mode 100755 vendor/k8s.io/kubernetes/pkg/apis/componentconfig/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/componentconfig/types.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/componentconfig/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/validation.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/validation.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/volume_resize_map.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/active_deadline.go rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/BUILD (50%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/OWNERS (100%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/doc.go (85%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/helpers.go (98%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/register.go (66%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/scheme/BUILD (53%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/scheme/scheme.go (85%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/types.go (93%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/v1beta1/BUILD (55%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/v1beta1/defaults.go (86%) rename vendor/k8s.io/kubernetes/pkg/kubelet/{logs/container_log_manager_stub.go => apis/config/v1beta1/defaults_linux.go} (67%) create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults_others.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/doc.go rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/v1beta1/register.go (64%) create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.deepcopy.go rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/v1beta1/zz_generated.defaults.go (78%) create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/validation/validation.go (88%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/validation/validation_others.go (93%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/validation/validation_windows.go (95%) rename vendor/k8s.io/kubernetes/pkg/kubelet/apis/{kubeletconfig => config}/zz_generated.deepcopy.go (97%) delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/certificate/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/certificate/kubelet.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/checkpoint.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_others.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_windows.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/envvars/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/envvars/envvars.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/eviction/types.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/configmap.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fakestore.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/store.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/configfiles.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/volume_stats.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/mount_pod.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/oom_watcher.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pleg/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pleg/pleg.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/reason_cache.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/runtime.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/runtimeclass_manager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider_linux.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/namespace.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/runtime.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/whitelist.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/token/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_handler.go create mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/types.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/work_queue.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/exec/exec.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/http/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/http/http.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/probe/tcp/tcp.go create mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/csi_volume_predicate.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/util.go create mode 100644 vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_tree.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/strategy.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/mustmatchpatterns.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/types.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/doc.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/configz/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/configz/configz.go rename vendor/k8s.io/kubernetes/pkg/{probe/exec => util/flag}/BUILD (64%) rename vendor/k8s.io/kubernetes/pkg/{apis/componentconfig/helpers.go => util/flag/flags.go} (70%) delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/io/writer.go create mode 100644 vendor/k8s.io/kubernetes/pkg/util/nsenter/OWNERS create mode 100644 vendor/k8s.io/kubernetes/pkg/util/nsenter/exec.go create mode 100644 vendor/k8s.io/kubernetes/pkg/util/nsenter/exec_unsupported.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/pointer/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/removeall/removeall.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_unsupported.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/labelmanager.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/nestedpendingoperations.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/OWNERS delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD delete mode 100644 vendor/k8s.io/kubernetes/pkg/volume/validation/pv_validation.go create mode 100644 vendor/k8s.io/metrics/CONTRIBUTING.md create mode 100644 vendor/k8s.io/metrics/IMPLEMENTATIONS.md create mode 100644 vendor/k8s.io/metrics/OWNERS create mode 100644 vendor/k8s.io/metrics/README.md create mode 100644 vendor/k8s.io/metrics/SECURITY_CONTACTS create mode 100644 vendor/k8s.io/metrics/code-of-conduct.md delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/types.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/types.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/types.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/metrics/pkg/apis/metrics/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/nodemetrics.go delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/podmetrics.go delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/BUILD delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/nodemetrics.go delete mode 100644 vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/podmetrics.go rename vendor/{github.com/google/cadvisor/http/mux => k8s.io/utils/pointer}/BUILD (75%) rename vendor/k8s.io/{kubernetes/pkg/util => utils}/pointer/pointer.go (92%) diff --git a/.travis.yml b/.travis.yml index fd6df0e2..4a7587ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ env: - DOCKER_VERSION=17.03.2~ce-0~ubuntu-xenial go: - - 1.9.x + - 1.10.x go_import_path: k8s.io/frakti diff --git a/cmd/frakti/frakti.go b/cmd/frakti/frakti.go index 879aae9e..1e0d267a 100644 --- a/cmd/frakti/frakti.go +++ b/cmd/frakti/frakti.go @@ -34,7 +34,7 @@ import ( ) const ( - fraktiVersion = "1.11.0" + fraktiVersion = "1.12.0" // use port 22522 for dockershim streaming privilegedStreamingServerPort = "22522" diff --git a/docs/deploy.md b/docs/deploy.md index 2cc3cdfa..064f9f8e 100644 --- a/docs/deploy.md +++ b/docs/deploy.md @@ -84,10 +84,10 @@ systemctl start docker #### Install frakti -Please note frakti has the same release version of Kubernetes, i.e. frakti `v1.11.*` works with Kubernetes `v1.11.*`, the `*` part does not matter. This doc will always use latest stable release of Kubernetes. +Please note frakti has the same release version of Kubernetes, i.e. frakti `v1.12.*` works with Kubernetes `v1.12.*`, the `*` part does not matter. This doc will always use latest stable release of Kubernetes. ```sh -curl -sSL https://github.com/kubernetes/frakti/releases/download/v1.11.0/frakti -o /usr/bin/frakti +curl -sSL https://github.com/kubernetes/frakti/releases/download/v1.12.0/frakti -o /usr/bin/frakti chmod +x /usr/bin/frakti cgroup_driver=$(docker info | awk '/Cgroup Driver/{print $3}') cat < /lib/systemd/system/frakti.service diff --git a/pkg/docker/privilegedruntime.go b/pkg/docker/privilegedruntime.go index 6bb1ff37..f775a883 100644 --- a/pkg/docker/privilegedruntime.go +++ b/pkg/docker/privilegedruntime.go @@ -24,10 +24,9 @@ import ( "k8s.io/frakti/pkg/util/alternativeruntime" "k8s.io/kubernetes/cmd/kubelet/app/options" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" - kubeletconfigv1beta1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" + kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/config" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme" "k8s.io/kubernetes/pkg/kubelet/dockershim" dockerremote "k8s.io/kubernetes/pkg/kubelet/dockershim/remote" "k8s.io/kubernetes/pkg/kubelet/server/streaming" @@ -58,7 +57,7 @@ func NewPrivilegedRuntimeService(privilegedRuntimeEndpoint string, streamingConf return nil, err } - external := &kubeletconfigv1beta1.KubeletConfiguration{} + external := &kubeletconfiginternal.KubeletConfiguration{} kubeletScheme.Default(external) kubeCfg := &kubeletconfig.KubeletConfiguration{} if err := kubeletScheme.Convert(external, kubeCfg, nil); err != nil { @@ -76,7 +75,8 @@ func NewPrivilegedRuntimeService(privilegedRuntimeEndpoint string, streamingConf // NOTE(harry): pluginSettings should be arguments for dockershim, not part of kubelet. // But standalone dockershim is not ready yet, so we use default values here. pluginSettings := dockershim.NetworkPluginSettings{ - HairpinMode: kubeletconfiginternal.HairpinMode(kubeCfg.HairpinMode), + //HairpinMode: kubeletconfiginternal.HairpinMode(kubeCfg.HairpinMode), + HairpinMode: kubeletconfiginternal.HairpinMode(kubeletconfig.HairpinNone), NonMasqueradeCIDR: nonMasqueradeCIDR, PluginName: networkPluginName, PluginConfDir: cniNetDir, @@ -98,7 +98,7 @@ func NewPrivilegedRuntimeService(privilegedRuntimeEndpoint string, streamingConf // If dockershim detected this cgroupDriver is different with dockerd, it will fail. cgroupDriver, privilegedRuntimeRootDir, - true, false, + false, ) if err != nil { return nil, err diff --git a/pkg/docker/runtime_service.go b/pkg/docker/runtime_service.go index d0430f0b..13139374 100644 --- a/pkg/docker/runtime_service.go +++ b/pkg/docker/runtime_service.go @@ -213,7 +213,7 @@ func (p *PrivilegedRuntime) ReopenContainerLog(ContainerID string) error { } // RunPodSandbox creates and starts a pod-level sandbox. -func (p *PrivilegedRuntime) RunPodSandbox(config *kubeapi.PodSandboxConfig) (string, error) { +func (p *PrivilegedRuntime) RunPodSandbox(config *kubeapi.PodSandboxConfig, runtimeHandler string) (string, error) { request := &kubeapi.RunPodSandboxRequest{Config: config} logrus.Debugf("RunPodSandboxRequest: %v", request) r, err := runtimeClient.RunPodSandbox(context.Background(), request) diff --git a/pkg/hyper/sandbox.go b/pkg/hyper/sandbox.go index 45b918c2..49b73f7f 100644 --- a/pkg/hyper/sandbox.go +++ b/pkg/hyper/sandbox.go @@ -31,7 +31,7 @@ import ( ) // RunPodSandbox creates and starts a pod-level sandbox. -func (h *Runtime) RunPodSandbox(config *kubeapi.PodSandboxConfig) (string, error) { +func (h *Runtime) RunPodSandbox(config *kubeapi.PodSandboxConfig, runtimeHandler string) (string, error) { userpod, err := h.buildUserPod(config) if err != nil { glog.Errorf("Build UserPod for sandbox %q failed: %v", config.String(), err) diff --git a/pkg/manager/manager.go b/pkg/manager/manager.go index 9b0124df..9028e7b6 100644 --- a/pkg/manager/manager.go +++ b/pkg/manager/manager.go @@ -210,7 +210,7 @@ func (s *FraktiManager) RunPodSandbox(ctx context.Context, req *kubeapi.RunPodSa runtimeService := s.getRuntimeServiceBySandboxConfig(req.GetConfig()) runtimeName := runtimeService.ServiceName() - podID, err := runtimeService.RunPodSandbox(req.Config) + podID, err := runtimeService.RunPodSandbox(req.Config, "frakti") if err != nil { glog.Errorf("RunPodSandbox from %s failed: %v", runtimeName, err) return nil, err diff --git a/pkg/unikernel/service/sandbox.go b/pkg/unikernel/service/sandbox.go index ec2b4b86..56264787 100644 --- a/pkg/unikernel/service/sandbox.go +++ b/pkg/unikernel/service/sandbox.go @@ -31,7 +31,7 @@ import ( ) // RunPodSandbox creates and starts a pod-level sandbox. -func (u *UnikernelRuntime) RunPodSandbox(config *kubeapi.PodSandboxConfig) (string, error) { +func (u *UnikernelRuntime) RunPodSandbox(config *kubeapi.PodSandboxConfig, runtimeHandler string) (string, error) { var err error // Genrate sandbox ID and name podID := uuid.NewUUID() diff --git a/vendor/github.com/Rican7/retry/BUILD b/vendor/github.com/Rican7/retry/BUILD new file mode 100644 index 00000000..c0f0ae9b --- /dev/null +++ b/vendor/github.com/Rican7/retry/BUILD @@ -0,0 +1,29 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["retry.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/Rican7/retry", + importpath = "github.com/Rican7/retry", + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/Rican7/retry/strategy:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/Rican7/retry/backoff:all-srcs", + "//vendor/github.com/Rican7/retry/jitter:all-srcs", + "//vendor/github.com/Rican7/retry/strategy:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/Rican7/retry/LICENSE b/vendor/github.com/Rican7/retry/LICENSE new file mode 100644 index 00000000..36150762 --- /dev/null +++ b/vendor/github.com/Rican7/retry/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2016 Trevor N. Suarez (Rican7) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/Rican7/retry/Makefile b/vendor/github.com/Rican7/retry/Makefile new file mode 100644 index 00000000..77d4bcd7 --- /dev/null +++ b/vendor/github.com/Rican7/retry/Makefile @@ -0,0 +1,83 @@ +# Define some VCS context +PARENT_BRANCH ?= master + +# Set the mode for code-coverage +GO_TEST_COVERAGE_MODE ?= count +GO_TEST_COVERAGE_FILE_NAME ?= coverage.out + +# Set flags for `gofmt` +GOFMT_FLAGS ?= -s + +# Set a default `min_confidence` value for `golint` +GOLINT_MIN_CONFIDENCE ?= 0.3 + + +all: install-deps build install + +clean: + go clean -i -x ./... + +build: + go build -v ./... + +install: + go install ./... + +install-deps: + go get -d -t ./... + +install-deps-dev: install-deps + go get github.com/golang/lint/golint + go get golang.org/x/tools/cmd/goimports + +update-deps: + go get -d -t -u ./... + +update-deps-dev: update-deps + go get -u github.com/golang/lint/golint + go get -u golang.org/x/tools/cmd/goimports + +test: + go test -v ./... + +test-with-coverage: + go test -cover ./... + +test-with-coverage-formatted: + go test -cover ./... | column -t | sort -r + +test-with-coverage-profile: + echo "mode: ${GO_TEST_COVERAGE_MODE}" > ${GO_TEST_COVERAGE_FILE_NAME} + for package in $$(go list ./...); do \ + go test -covermode ${GO_TEST_COVERAGE_MODE} -coverprofile "coverage_$${package##*/}.out" "$${package}"; \ + sed '1d' "coverage_$${package##*/}.out" >> ${GO_TEST_COVERAGE_FILE_NAME}; \ + done + +format-lint: + errors=$$(gofmt -l ${GOFMT_FLAGS} .); if [ "$${errors}" != "" ]; then echo "$${errors}"; exit 1; fi + +import-lint: + errors=$$(goimports -l .); if [ "$${errors}" != "" ]; then echo "$${errors}"; exit 1; fi + +style-lint: + errors=$$(golint -min_confidence=${GOLINT_MIN_CONFIDENCE} ./...); if [ "$${errors}" != "" ]; then echo "$${errors}"; exit 1; fi + +copyright-lint: + @old_dates=$$(git diff --diff-filter=ACMRTUXB --name-only "${PARENT_BRANCH}" | xargs grep -E '[Cc]opyright(\s+)[©Cc]?(\s+)[0-9]{4}' | grep -E -v "[Cc]opyright(\s+)[©Cc]?(\s+)$$(date '+%Y')"); if [ "$${old_dates}" != "" ]; then printf "The following files contain outdated copyrights:\n$${old_dates}\n\nThis can be fixed with 'make copyright-fix'\n"; exit 1; fi + +lint: install-deps-dev format-lint import-lint style-lint copyright-lint + +format-fix: + gofmt -w ${GOFMT_FLAGS} . + +import-fix: + goimports -w . + +copyright-fix: + @git diff --diff-filter=ACMRTUXB --name-only "${PARENT_BRANCH}" | xargs -I '_FILENAME' -- sh -c 'sed -i.bak "s/\([Cc]opyright\([[:space:]][©Cc]\{0,1\}[[:space:]]*\)\)[0-9]\{4\}/\1"$$(date '+%Y')"/g" _FILENAME && rm _FILENAME.bak' + +vet: + go vet ./... + + +.PHONY: all clean build install install-deps install-deps-dev update-deps update-deps-dev test test-with-coverage test-with-coverage-formatted test-with-coverage-profile format-lint import-lint style-lint copyright-lint lint format-fix import-fix copyright-fix vet diff --git a/vendor/github.com/Rican7/retry/README.md b/vendor/github.com/Rican7/retry/README.md new file mode 100644 index 00000000..bccf4dec --- /dev/null +++ b/vendor/github.com/Rican7/retry/README.md @@ -0,0 +1,101 @@ +# retry + +[![Build Status](https://travis-ci.org/Rican7/retry.svg?branch=master)](https://travis-ci.org/Rican7/retry) +[![Coverage Status](https://coveralls.io/repos/github/Rican7/retry/badge.svg)](https://coveralls.io/github/Rican7/retry) +[![Go Report Card](https://goreportcard.com/badge/Rican7/retry)](http://goreportcard.com/report/Rican7/retry) +[![GoDoc](https://godoc.org/github.com/Rican7/retry?status.png)](https://godoc.org/github.com/Rican7/retry) +[![Latest Stable Version](https://img.shields.io/github/release/Rican7/retry.svg?style=flat)](https://github.com/Rican7/retry/releases) + +A simple, stateless, functional mechanism to perform actions repetitively until successful. + + +## Project Status + +This project is currently in "pre-release". While the code is heavily tested, the API may change. +Vendor (commit or lock) this dependency if you plan on using it. + + +## Install + +`go get github.com/Rican7/retry` + + +## Examples + +### Basic + +```go +retry.Retry(func(attempt uint) error { + return nil // Do something that may or may not cause an error +}) +``` + +### File Open + +```go +const logFilePath = "/var/log/myapp.log" + +var logFile *os.File + +err := retry.Retry(func(attempt uint) error { + var err error + + logFile, err = os.Open(logFilePath) + + return err +}) + +if nil != err { + log.Fatalf("Unable to open file %q with error %q", logFilePath, err) +} + +logFile.Chdir() // Do something with the file +``` + +### HTTP request with strategies and backoff + +```go +var response *http.Response + +action := func(attempt uint) error { + var err error + + response, err = http.Get("https://api.github.com/repos/Rican7/retry") + + if nil == err && nil != response && response.StatusCode > 200 { + err = fmt.Errorf("failed to fetch (attempt #%d) with status code: %d", attempt, response.StatusCode) + } + + return err +} + +err := retry.Retry( + action, + strategy.Limit(5), + strategy.Backoff(backoff.Fibonacci(10*time.Millisecond)), +) + +if nil != err { + log.Fatalf("Failed to fetch repository with error %q", err) +} +``` + +### Retry with backoff jitter + +```go +action := func(attempt uint) error { + return errors.New("something happened") +} + +seed := time.Now().UnixNano() +random := rand.New(rand.NewSource(seed)) + +retry.Retry( + action, + strategy.Limit(5), + strategy.BackoffWithJitter( + backoff.BinaryExponential(10*time.Millisecond), + jitter.Deviation(random, 0.5), + ), +) +``` diff --git a/vendor/github.com/google/cadvisor/healthz/BUILD b/vendor/github.com/Rican7/retry/backoff/BUILD similarity index 72% rename from vendor/github.com/google/cadvisor/healthz/BUILD rename to vendor/github.com/Rican7/retry/backoff/BUILD index 37d4e308..8f31aa93 100644 --- a/vendor/github.com/google/cadvisor/healthz/BUILD +++ b/vendor/github.com/Rican7/retry/backoff/BUILD @@ -2,10 +2,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["healthz.go"], - importpath = "github.com/google/cadvisor/healthz", + srcs = ["backoff.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/Rican7/retry/backoff", + importpath = "github.com/Rican7/retry/backoff", visibility = ["//visibility:public"], - deps = ["//vendor/github.com/google/cadvisor/http/mux:go_default_library"], ) filegroup( diff --git a/vendor/github.com/Rican7/retry/backoff/backoff.go b/vendor/github.com/Rican7/retry/backoff/backoff.go new file mode 100644 index 00000000..5369a75a --- /dev/null +++ b/vendor/github.com/Rican7/retry/backoff/backoff.go @@ -0,0 +1,67 @@ +// Package backoff provides stateless methods of calculating durations based on +// a number of attempts made. +// +// Copyright © 2016 Trevor N. Suarez (Rican7) +package backoff + +import ( + "math" + "time" +) + +// Algorithm defines a function that calculates a time.Duration based on +// the given retry attempt number. +type Algorithm func(attempt uint) time.Duration + +// Incremental creates a Algorithm that increments the initial duration +// by the given increment for each attempt. +func Incremental(initial, increment time.Duration) Algorithm { + return func(attempt uint) time.Duration { + return initial + (increment * time.Duration(attempt)) + } +} + +// Linear creates a Algorithm that linearly multiplies the factor +// duration by the attempt number for each attempt. +func Linear(factor time.Duration) Algorithm { + return func(attempt uint) time.Duration { + return (factor * time.Duration(attempt)) + } +} + +// Exponential creates a Algorithm that multiplies the factor duration by +// an exponentially increasing factor for each attempt, where the factor is +// calculated as the given base raised to the attempt number. +func Exponential(factor time.Duration, base float64) Algorithm { + return func(attempt uint) time.Duration { + return (factor * time.Duration(math.Pow(base, float64(attempt)))) + } +} + +// BinaryExponential creates a Algorithm that multiplies the factor +// duration by an exponentially increasing factor for each attempt, where the +// factor is calculated as `2` raised to the attempt number (2^attempt). +func BinaryExponential(factor time.Duration) Algorithm { + return Exponential(factor, 2) +} + +// Fibonacci creates a Algorithm that multiplies the factor duration by +// an increasing factor for each attempt, where the factor is the Nth number in +// the Fibonacci sequence. +func Fibonacci(factor time.Duration) Algorithm { + return func(attempt uint) time.Duration { + return (factor * time.Duration(fibonacciNumber(attempt))) + } +} + +// fibonacciNumber calculates the Fibonacci sequence number for the given +// sequence position. +func fibonacciNumber(n uint) uint { + if 0 == n { + return 0 + } else if 1 == n { + return 1 + } else { + return fibonacciNumber(n-1) + fibonacciNumber(n-2) + } +} diff --git a/vendor/github.com/google/cadvisor/pages/static/BUILD b/vendor/github.com/Rican7/retry/jitter/BUILD similarity index 68% rename from vendor/github.com/google/cadvisor/pages/static/BUILD rename to vendor/github.com/Rican7/retry/jitter/BUILD index 4a0ebdf2..84046258 100644 --- a/vendor/github.com/google/cadvisor/pages/static/BUILD +++ b/vendor/github.com/Rican7/retry/jitter/BUILD @@ -2,13 +2,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = [ - "assets.go", - "static.go", - ], - importpath = "github.com/google/cadvisor/pages/static", + srcs = ["jitter.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/Rican7/retry/jitter", + importpath = "github.com/Rican7/retry/jitter", visibility = ["//visibility:public"], - deps = ["//vendor/github.com/golang/glog:go_default_library"], ) filegroup( diff --git a/vendor/github.com/Rican7/retry/jitter/jitter.go b/vendor/github.com/Rican7/retry/jitter/jitter.go new file mode 100644 index 00000000..e94ad892 --- /dev/null +++ b/vendor/github.com/Rican7/retry/jitter/jitter.go @@ -0,0 +1,89 @@ +// Package jitter provides methods of transforming durations. +// +// Copyright © 2016 Trevor N. Suarez (Rican7) +package jitter + +import ( + "math" + "math/rand" + "time" +) + +// Transformation defines a function that calculates a time.Duration based on +// the given duration. +type Transformation func(duration time.Duration) time.Duration + +// Full creates a Transformation that transforms a duration into a result +// duration in [0, n) randomly, where n is the given duration. +// +// The given generator is what is used to determine the random transformation. +// If a nil generator is passed, a default one will be provided. +// +// Inspired by https://www.awsarchitectureblog.com/2015/03/backoff.html +func Full(generator *rand.Rand) Transformation { + random := fallbackNewRandom(generator) + + return func(duration time.Duration) time.Duration { + return time.Duration(random.Int63n(int64(duration))) + } +} + +// Equal creates a Transformation that transforms a duration into a result +// duration in [n/2, n) randomly, where n is the given duration. +// +// The given generator is what is used to determine the random transformation. +// If a nil generator is passed, a default one will be provided. +// +// Inspired by https://www.awsarchitectureblog.com/2015/03/backoff.html +func Equal(generator *rand.Rand) Transformation { + random := fallbackNewRandom(generator) + + return func(duration time.Duration) time.Duration { + return (duration / 2) + time.Duration(random.Int63n(int64(duration))/2) + } +} + +// Deviation creates a Transformation that transforms a duration into a result +// duration that deviates from the input randomly by a given factor. +// +// The given generator is what is used to determine the random transformation. +// If a nil generator is passed, a default one will be provided. +// +// Inspired by https://developers.google.com/api-client-library/java/google-http-java-client/backoff +func Deviation(generator *rand.Rand, factor float64) Transformation { + random := fallbackNewRandom(generator) + + return func(duration time.Duration) time.Duration { + min := int64(math.Floor(float64(duration) * (1 - factor))) + max := int64(math.Ceil(float64(duration) * (1 + factor))) + + return time.Duration(random.Int63n(max-min) + min) + } +} + +// NormalDistribution creates a Transformation that transforms a duration into a +// result duration based on a normal distribution of the input and the given +// standard deviation. +// +// The given generator is what is used to determine the random transformation. +// If a nil generator is passed, a default one will be provided. +func NormalDistribution(generator *rand.Rand, standardDeviation float64) Transformation { + random := fallbackNewRandom(generator) + + return func(duration time.Duration) time.Duration { + return time.Duration(random.NormFloat64()*standardDeviation + float64(duration)) + } +} + +// fallbackNewRandom returns the passed in random instance if it's not nil, +// and otherwise returns a new random instance seeded with the current time. +func fallbackNewRandom(random *rand.Rand) *rand.Rand { + // Return the passed in value if it's already not null + if nil != random { + return random + } + + seed := time.Now().UnixNano() + + return rand.New(rand.NewSource(seed)) +} diff --git a/vendor/github.com/Rican7/retry/retry.go b/vendor/github.com/Rican7/retry/retry.go new file mode 100644 index 00000000..15015db2 --- /dev/null +++ b/vendor/github.com/Rican7/retry/retry.go @@ -0,0 +1,36 @@ +// Package retry provides a simple, stateless, functional mechanism to perform +// actions repetitively until successful. +// +// Copyright © 2016 Trevor N. Suarez (Rican7) +package retry + +import "github.com/Rican7/retry/strategy" + +// Action defines a callable function that package retry can handle. +type Action func(attempt uint) error + +// Retry takes an action and performs it, repetitively, until successful. +// +// Optionally, strategies may be passed that assess whether or not an attempt +// should be made. +func Retry(action Action, strategies ...strategy.Strategy) error { + var err error + + for attempt := uint(0); (0 == attempt || nil != err) && shouldAttempt(attempt, strategies...); attempt++ { + err = action(attempt) + } + + return err +} + +// shouldAttempt evaluates the provided strategies with the given attempt to +// determine if the Retry loop should make another attempt. +func shouldAttempt(attempt uint, strategies ...strategy.Strategy) bool { + shouldAttempt := true + + for i := 0; shouldAttempt && i < len(strategies); i++ { + shouldAttempt = shouldAttempt && strategies[i](attempt) + } + + return shouldAttempt +} diff --git a/vendor/github.com/Rican7/retry/strategy/BUILD b/vendor/github.com/Rican7/retry/strategy/BUILD new file mode 100644 index 00000000..ad2ed75f --- /dev/null +++ b/vendor/github.com/Rican7/retry/strategy/BUILD @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["strategy.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/Rican7/retry/strategy", + importpath = "github.com/Rican7/retry/strategy", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/Rican7/retry/backoff:go_default_library", + "//vendor/github.com/Rican7/retry/jitter:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/Rican7/retry/strategy/strategy.go b/vendor/github.com/Rican7/retry/strategy/strategy.go new file mode 100644 index 00000000..a315fa02 --- /dev/null +++ b/vendor/github.com/Rican7/retry/strategy/strategy.go @@ -0,0 +1,85 @@ +// Package strategy provides a way to change the way that retry is performed. +// +// Copyright © 2016 Trevor N. Suarez (Rican7) +package strategy + +import ( + "time" + + "github.com/Rican7/retry/backoff" + "github.com/Rican7/retry/jitter" +) + +// Strategy defines a function that Retry calls before every successive attempt +// to determine whether it should make the next attempt or not. Returning `true` +// allows for the next attempt to be made. Returning `false` halts the retrying +// process and returns the last error returned by the called Action. +// +// The strategy will be passed an "attempt" number on each successive retry +// iteration, starting with a `0` value before the first attempt is actually +// made. This allows for a pre-action delay, etc. +type Strategy func(attempt uint) bool + +// Limit creates a Strategy that limits the number of attempts that Retry will +// make. +func Limit(attemptLimit uint) Strategy { + return func(attempt uint) bool { + return (attempt <= attemptLimit) + } +} + +// Delay creates a Strategy that waits the given duration before the first +// attempt is made. +func Delay(duration time.Duration) Strategy { + return func(attempt uint) bool { + if 0 == attempt { + time.Sleep(duration) + } + + return true + } +} + +// Wait creates a Strategy that waits the given durations for each attempt after +// the first. If the number of attempts is greater than the number of durations +// provided, then the strategy uses the last duration provided. +func Wait(durations ...time.Duration) Strategy { + return func(attempt uint) bool { + if 0 < attempt && 0 < len(durations) { + durationIndex := int(attempt - 1) + + if len(durations) <= durationIndex { + durationIndex = len(durations) - 1 + } + + time.Sleep(durations[durationIndex]) + } + + return true + } +} + +// Backoff creates a Strategy that waits before each attempt, with a duration as +// defined by the given backoff.Algorithm. +func Backoff(algorithm backoff.Algorithm) Strategy { + return BackoffWithJitter(algorithm, noJitter()) +} + +// BackoffWithJitter creates a Strategy that waits before each attempt, with a +// duration as defined by the given backoff.Algorithm and jitter.Transformation. +func BackoffWithJitter(algorithm backoff.Algorithm, transformation jitter.Transformation) Strategy { + return func(attempt uint) bool { + if 0 < attempt { + time.Sleep(transformation(algorithm(attempt))) + } + + return true + } +} + +// noJitter creates a jitter.Transformation that simply returns the input. +func noJitter() jitter.Transformation { + return func(duration time.Duration) time.Duration { + return duration + } +} diff --git a/vendor/github.com/containerd/console/BUILD b/vendor/github.com/containerd/console/BUILD new file mode 100644 index 00000000..fdf325b7 --- /dev/null +++ b/vendor/github.com/containerd/console/BUILD @@ -0,0 +1,54 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "console.go", + "console_linux.go", + "console_unix.go", + "console_windows.go", + "tc_darwin.go", + "tc_freebsd.go", + "tc_linux.go", + "tc_solaris_cgo.go", + "tc_solaris_nocgo.go", + "tc_unix.go", + ], + cgo = True, + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/console", + importpath = "github.com/containerd/console", + visibility = ["//visibility:public"], + deps = select({ + "@io_bazel_rules_go//go/platform:darwin": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:freebsd": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:solaris": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:windows": [ + "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/golang.org/x/sys/windows:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/console/LICENSE b/vendor/github.com/containerd/console/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/containerd/console/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/containerd/console/README.md b/vendor/github.com/containerd/console/README.md new file mode 100644 index 00000000..4c56d9d1 --- /dev/null +++ b/vendor/github.com/containerd/console/README.md @@ -0,0 +1,17 @@ +# console + +[![Build Status](https://travis-ci.org/containerd/console.svg?branch=master)](https://travis-ci.org/containerd/console) + +Golang package for dealing with consoles. Light on deps and a simple API. + +## Modifying the current process + +```go +current := console.Current() +defer current.Reset() + +if err := current.SetRaw(); err != nil { +} +ws, err := current.Size() +current.Resize(ws) +``` diff --git a/vendor/github.com/containerd/console/console.go b/vendor/github.com/containerd/console/console.go new file mode 100644 index 00000000..bf2798fd --- /dev/null +++ b/vendor/github.com/containerd/console/console.go @@ -0,0 +1,62 @@ +package console + +import ( + "errors" + "io" + "os" +) + +var ErrNotAConsole = errors.New("provided file is not a console") + +type Console interface { + io.Reader + io.Writer + io.Closer + + // Resize resizes the console to the provided window size + Resize(WinSize) error + // ResizeFrom resizes the calling console to the size of the + // provided console + ResizeFrom(Console) error + // SetRaw sets the console in raw mode + SetRaw() error + // DisableEcho disables echo on the console + DisableEcho() error + // Reset restores the console to its orignal state + Reset() error + // Size returns the window size of the console + Size() (WinSize, error) + // Fd returns the console's file descriptor + Fd() uintptr + // Name returns the console's file name + Name() string +} + +// WinSize specifies the window size of the console +type WinSize struct { + // Height of the console + Height uint16 + // Width of the console + Width uint16 + x uint16 + y uint16 +} + +// Current returns the current processes console +func Current() Console { + c, err := ConsoleFromFile(os.Stdin) + if err != nil { + // stdin should always be a console for the design + // of this function + panic(err) + } + return c +} + +// ConsoleFromFile returns a console using the provided file +func ConsoleFromFile(f *os.File) (Console, error) { + if err := checkConsole(f); err != nil { + return nil, err + } + return newMaster(f) +} diff --git a/vendor/github.com/containerd/console/console_linux.go b/vendor/github.com/containerd/console/console_linux.go new file mode 100644 index 00000000..c9637292 --- /dev/null +++ b/vendor/github.com/containerd/console/console_linux.go @@ -0,0 +1,255 @@ +// +build linux + +package console + +import ( + "io" + "os" + "sync" + + "golang.org/x/sys/unix" +) + +const ( + maxEvents = 128 +) + +// Epoller manages multiple epoll consoles using edge-triggered epoll api so we +// dont have to deal with repeated wake-up of EPOLLER or EPOLLHUP. +// For more details, see: +// - https://github.com/systemd/systemd/pull/4262 +// - https://github.com/moby/moby/issues/27202 +// +// Example usage of Epoller and EpollConsole can be as follow: +// +// epoller, _ := NewEpoller() +// epollConsole, _ := epoller.Add(console) +// go epoller.Wait() +// var ( +// b bytes.Buffer +// wg sync.WaitGroup +// ) +// wg.Add(1) +// go func() { +// io.Copy(&b, epollConsole) +// wg.Done() +// }() +// // perform I/O on the console +// epollConsole.Shutdown(epoller.CloseConsole) +// wg.Wait() +// epollConsole.Close() +type Epoller struct { + efd int + mu sync.Mutex + fdMapping map[int]*EpollConsole +} + +// NewEpoller returns an instance of epoller with a valid epoll fd. +func NewEpoller() (*Epoller, error) { + efd, err := unix.EpollCreate1(unix.EPOLL_CLOEXEC) + if err != nil { + return nil, err + } + return &Epoller{ + efd: efd, + fdMapping: make(map[int]*EpollConsole), + }, nil +} + +// Add creates a epoll console based on the provided console. The console will +// be registered with EPOLLET (i.e. using edge-triggered notification) and its +// file descriptor will be set to non-blocking mode. After this, user should use +// the return console to perform I/O. +func (e *Epoller) Add(console Console) (*EpollConsole, error) { + sysfd := int(console.Fd()) + // Set sysfd to non-blocking mode + if err := unix.SetNonblock(sysfd, true); err != nil { + return nil, err + } + + ev := unix.EpollEvent{ + Events: unix.EPOLLIN | unix.EPOLLOUT | unix.EPOLLRDHUP | unix.EPOLLET, + Fd: int32(sysfd), + } + if err := unix.EpollCtl(e.efd, unix.EPOLL_CTL_ADD, sysfd, &ev); err != nil { + return nil, err + } + ef := &EpollConsole{ + Console: console, + sysfd: sysfd, + readc: sync.NewCond(&sync.Mutex{}), + writec: sync.NewCond(&sync.Mutex{}), + } + e.mu.Lock() + e.fdMapping[sysfd] = ef + e.mu.Unlock() + return ef, nil +} + +// Wait starts the loop to wait for its consoles' notifications and signal +// appropriate console that it can perform I/O. +func (e *Epoller) Wait() error { + events := make([]unix.EpollEvent, maxEvents) + for { + n, err := unix.EpollWait(e.efd, events, -1) + if err != nil { + // EINTR: The call was interrupted by a signal handler before either + // any of the requested events occurred or the timeout expired + if err == unix.EINTR { + continue + } + return err + } + for i := 0; i < n; i++ { + ev := &events[i] + // the console is ready to be read from + if ev.Events&(unix.EPOLLIN|unix.EPOLLHUP|unix.EPOLLERR) != 0 { + if epfile := e.getConsole(int(ev.Fd)); epfile != nil { + epfile.signalRead() + } + } + // the console is ready to be written to + if ev.Events&(unix.EPOLLOUT|unix.EPOLLHUP|unix.EPOLLERR) != 0 { + if epfile := e.getConsole(int(ev.Fd)); epfile != nil { + epfile.signalWrite() + } + } + } + } +} + +// Close unregister the console's file descriptor from epoll interface +func (e *Epoller) CloseConsole(fd int) error { + e.mu.Lock() + defer e.mu.Unlock() + delete(e.fdMapping, fd) + return unix.EpollCtl(e.efd, unix.EPOLL_CTL_DEL, fd, &unix.EpollEvent{}) +} + +func (e *Epoller) getConsole(sysfd int) *EpollConsole { + e.mu.Lock() + f := e.fdMapping[sysfd] + e.mu.Unlock() + return f +} + +// Close the epoll fd +func (e *Epoller) Close() error { + return unix.Close(e.efd) +} + +// EpollConsole acts like a console but register its file descriptor with a +// epoll fd and uses epoll API to perform I/O. +type EpollConsole struct { + Console + readc *sync.Cond + writec *sync.Cond + sysfd int + closed bool +} + +// Read reads up to len(p) bytes into p. It returns the number of bytes read +// (0 <= n <= len(p)) and any error encountered. +// +// If the console's read returns EAGAIN or EIO, we assumes that its a +// temporary error because the other side went away and wait for the signal +// generated by epoll event to continue. +func (ec *EpollConsole) Read(p []byte) (n int, err error) { + var read int + ec.readc.L.Lock() + defer ec.readc.L.Unlock() + for { + read, err = ec.Console.Read(p[n:]) + n += read + if err != nil { + var hangup bool + if perr, ok := err.(*os.PathError); ok { + hangup = (perr.Err == unix.EAGAIN || perr.Err == unix.EIO) + } else { + hangup = (err == unix.EAGAIN || err == unix.EIO) + } + // if the other end disappear, assume this is temporary and wait for the + // signal to continue again. Unless we didnt read anything and the + // console is already marked as closed then we should exit + if hangup && !(n == 0 && len(p) > 0 && ec.closed) { + ec.readc.Wait() + continue + } + } + break + } + // if we didnt read anything then return io.EOF to end gracefully + if n == 0 && len(p) > 0 && err == nil { + err = io.EOF + } + // signal for others that we finished the read + ec.readc.Signal() + return n, err +} + +// Writes len(p) bytes from p to the console. It returns the number of bytes +// written from p (0 <= n <= len(p)) and any error encountered that caused +// the write to stop early. +// +// If writes to the console returns EAGAIN or EIO, we assumes that its a +// temporary error because the other side went away and wait for the signal +// generated by epoll event to continue. +func (ec *EpollConsole) Write(p []byte) (n int, err error) { + var written int + ec.writec.L.Lock() + defer ec.writec.L.Unlock() + for { + written, err = ec.Console.Write(p[n:]) + n += written + if err != nil { + var hangup bool + if perr, ok := err.(*os.PathError); ok { + hangup = (perr.Err == unix.EAGAIN || perr.Err == unix.EIO) + } else { + hangup = (err == unix.EAGAIN || err == unix.EIO) + } + // if the other end disappear, assume this is temporary and wait for the + // signal to continue again. + if hangup { + ec.writec.Wait() + continue + } + } + // unrecoverable error, break the loop and return the error + break + } + if n < len(p) && err == nil { + err = io.ErrShortWrite + } + // signal for others that we finished the write + ec.writec.Signal() + return n, err +} + +// Close closed the file descriptor and signal call waiters for this fd. +// It accepts a callback which will be called with the console's fd. The +// callback typically will be used to do further cleanup such as unregister the +// console's fd from the epoll interface. +// User should call Shutdown and wait for all I/O operation to be finished +// before closing the console. +func (ec *EpollConsole) Shutdown(close func(int) error) error { + ec.readc.L.Lock() + defer ec.readc.L.Unlock() + ec.writec.L.Lock() + defer ec.writec.L.Unlock() + + ec.readc.Broadcast() + ec.writec.Broadcast() + ec.closed = true + return close(ec.sysfd) +} + +// signalRead signals that the console is readable. +func (ec *EpollConsole) signalRead() { + ec.readc.Signal() +} + +// signalWrite signals that the console is writable. +func (ec *EpollConsole) signalWrite() { + ec.writec.Signal() +} diff --git a/vendor/github.com/containerd/console/console_unix.go b/vendor/github.com/containerd/console/console_unix.go new file mode 100644 index 00000000..118c8c3a --- /dev/null +++ b/vendor/github.com/containerd/console/console_unix.go @@ -0,0 +1,142 @@ +// +build darwin freebsd linux solaris + +package console + +import ( + "os" + + "golang.org/x/sys/unix" +) + +// NewPty creates a new pty pair +// The master is returned as the first console and a string +// with the path to the pty slave is returned as the second +func NewPty() (Console, string, error) { + f, err := os.OpenFile("/dev/ptmx", unix.O_RDWR|unix.O_NOCTTY|unix.O_CLOEXEC, 0) + if err != nil { + return nil, "", err + } + slave, err := ptsname(f) + if err != nil { + return nil, "", err + } + if err := unlockpt(f); err != nil { + return nil, "", err + } + m, err := newMaster(f) + if err != nil { + return nil, "", err + } + return m, slave, nil +} + +type master struct { + f *os.File + original *unix.Termios +} + +func (m *master) Read(b []byte) (int, error) { + return m.f.Read(b) +} + +func (m *master) Write(b []byte) (int, error) { + return m.f.Write(b) +} + +func (m *master) Close() error { + return m.f.Close() +} + +func (m *master) Resize(ws WinSize) error { + return tcswinsz(m.f.Fd(), ws) +} + +func (m *master) ResizeFrom(c Console) error { + ws, err := c.Size() + if err != nil { + return err + } + return m.Resize(ws) +} + +func (m *master) Reset() error { + if m.original == nil { + return nil + } + return tcset(m.f.Fd(), m.original) +} + +func (m *master) getCurrent() (unix.Termios, error) { + var termios unix.Termios + if err := tcget(m.f.Fd(), &termios); err != nil { + return unix.Termios{}, err + } + return termios, nil +} + +func (m *master) SetRaw() error { + rawState, err := m.getCurrent() + if err != nil { + return err + } + rawState = cfmakeraw(rawState) + rawState.Oflag = rawState.Oflag | unix.OPOST + return tcset(m.f.Fd(), &rawState) +} + +func (m *master) DisableEcho() error { + rawState, err := m.getCurrent() + if err != nil { + return err + } + rawState.Lflag = rawState.Lflag &^ unix.ECHO + return tcset(m.f.Fd(), &rawState) +} + +func (m *master) Size() (WinSize, error) { + return tcgwinsz(m.f.Fd()) +} + +func (m *master) Fd() uintptr { + return m.f.Fd() +} + +func (m *master) Name() string { + return m.f.Name() +} + +// checkConsole checks if the provided file is a console +func checkConsole(f *os.File) error { + var termios unix.Termios + if tcget(f.Fd(), &termios) != nil { + return ErrNotAConsole + } + return nil +} + +func newMaster(f *os.File) (Console, error) { + m := &master{ + f: f, + } + t, err := m.getCurrent() + if err != nil { + return nil, err + } + m.original = &t + return m, nil +} + +// ClearONLCR sets the necessary tty_ioctl(4)s to ensure that a pty pair +// created by us acts normally. In particular, a not-very-well-known default of +// Linux unix98 ptys is that they have +onlcr by default. While this isn't a +// problem for terminal emulators, because we relay data from the terminal we +// also relay that funky line discipline. +func ClearONLCR(fd uintptr) error { + return setONLCR(fd, false) +} + +// SetONLCR sets the necessary tty_ioctl(4)s to ensure that a pty pair +// created by us acts as intended for a terminal emulator. +func SetONLCR(fd uintptr) error { + return setONLCR(fd, true) +} diff --git a/vendor/github.com/containerd/console/console_windows.go b/vendor/github.com/containerd/console/console_windows.go new file mode 100644 index 00000000..d78a0b84 --- /dev/null +++ b/vendor/github.com/containerd/console/console_windows.go @@ -0,0 +1,200 @@ +package console + +import ( + "fmt" + "os" + + "github.com/pkg/errors" + "golang.org/x/sys/windows" +) + +var ( + vtInputSupported bool + ErrNotImplemented = errors.New("not implemented") +) + +func (m *master) initStdios() { + m.in = windows.Handle(os.Stdin.Fd()) + if err := windows.GetConsoleMode(m.in, &m.inMode); err == nil { + // Validate that windows.ENABLE_VIRTUAL_TERMINAL_INPUT is supported, but do not set it. + if err = windows.SetConsoleMode(m.in, m.inMode|windows.ENABLE_VIRTUAL_TERMINAL_INPUT); err == nil { + vtInputSupported = true + } + // Unconditionally set the console mode back even on failure because SetConsoleMode + // remembers invalid bits on input handles. + windows.SetConsoleMode(m.in, m.inMode) + } else { + fmt.Printf("failed to get console mode for stdin: %v\n", err) + } + + m.out = windows.Handle(os.Stdout.Fd()) + if err := windows.GetConsoleMode(m.out, &m.outMode); err == nil { + if err := windows.SetConsoleMode(m.out, m.outMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err == nil { + m.outMode |= windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING + } else { + windows.SetConsoleMode(m.out, m.outMode) + } + } else { + fmt.Printf("failed to get console mode for stdout: %v\n", err) + } + + m.err = windows.Handle(os.Stderr.Fd()) + if err := windows.GetConsoleMode(m.err, &m.errMode); err == nil { + if err := windows.SetConsoleMode(m.err, m.errMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err == nil { + m.errMode |= windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING + } else { + windows.SetConsoleMode(m.err, m.errMode) + } + } else { + fmt.Printf("failed to get console mode for stderr: %v\n", err) + } +} + +type master struct { + in windows.Handle + inMode uint32 + + out windows.Handle + outMode uint32 + + err windows.Handle + errMode uint32 +} + +func (m *master) SetRaw() error { + if err := makeInputRaw(m.in, m.inMode); err != nil { + return err + } + + // Set StdOut and StdErr to raw mode, we ignore failures since + // windows.DISABLE_NEWLINE_AUTO_RETURN might not be supported on this version of + // Windows. + + windows.SetConsoleMode(m.out, m.outMode|windows.DISABLE_NEWLINE_AUTO_RETURN) + + windows.SetConsoleMode(m.err, m.errMode|windows.DISABLE_NEWLINE_AUTO_RETURN) + + return nil +} + +func (m *master) Reset() error { + for _, s := range []struct { + fd windows.Handle + mode uint32 + }{ + {m.in, m.inMode}, + {m.out, m.outMode}, + {m.err, m.errMode}, + } { + if err := windows.SetConsoleMode(s.fd, s.mode); err != nil { + return errors.Wrap(err, "unable to restore console mode") + } + } + + return nil +} + +func (m *master) Size() (WinSize, error) { + var info windows.ConsoleScreenBufferInfo + err := windows.GetConsoleScreenBufferInfo(m.out, &info) + if err != nil { + return WinSize{}, errors.Wrap(err, "unable to get console info") + } + + winsize := WinSize{ + Width: uint16(info.Window.Right - info.Window.Left + 1), + Height: uint16(info.Window.Bottom - info.Window.Top + 1), + } + + return winsize, nil +} + +func (m *master) Resize(ws WinSize) error { + return ErrNotImplemented +} + +func (m *master) ResizeFrom(c Console) error { + return ErrNotImplemented +} + +func (m *master) DisableEcho() error { + mode := m.inMode &^ windows.ENABLE_ECHO_INPUT + mode |= windows.ENABLE_PROCESSED_INPUT + mode |= windows.ENABLE_LINE_INPUT + + if err := windows.SetConsoleMode(m.in, mode); err != nil { + return errors.Wrap(err, "unable to set console to disable echo") + } + + return nil +} + +func (m *master) Close() error { + return nil +} + +func (m *master) Read(b []byte) (int, error) { + panic("not implemented on windows") +} + +func (m *master) Write(b []byte) (int, error) { + panic("not implemented on windows") +} + +func (m *master) Fd() uintptr { + return uintptr(m.in) +} + +// on windows, console can only be made from os.Std{in,out,err}, hence there +// isnt a single name here we can use. Return a dummy "console" value in this +// case should be sufficient. +func (m *master) Name() string { + return "console" +} + +// makeInputRaw puts the terminal (Windows Console) connected to the given +// file descriptor into raw mode +func makeInputRaw(fd windows.Handle, mode uint32) error { + // See + // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx + // -- https://msdn.microsoft.com/en-us/library/windows/desktop/ms683462(v=vs.85).aspx + + // Disable these modes + mode &^= windows.ENABLE_ECHO_INPUT + mode &^= windows.ENABLE_LINE_INPUT + mode &^= windows.ENABLE_MOUSE_INPUT + mode &^= windows.ENABLE_WINDOW_INPUT + mode &^= windows.ENABLE_PROCESSED_INPUT + + // Enable these modes + mode |= windows.ENABLE_EXTENDED_FLAGS + mode |= windows.ENABLE_INSERT_MODE + mode |= windows.ENABLE_QUICK_EDIT_MODE + + if vtInputSupported { + mode |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT + } + + if err := windows.SetConsoleMode(fd, mode); err != nil { + return errors.Wrap(err, "unable to set console to raw mode") + } + + return nil +} + +func checkConsole(f *os.File) error { + var mode uint32 + if err := windows.GetConsoleMode(windows.Handle(f.Fd()), &mode); err != nil { + return err + } + return nil +} + +func newMaster(f *os.File) (Console, error) { + if f != os.Stdin && f != os.Stdout && f != os.Stderr { + return nil, errors.New("creating a console from a file is not supported on windows") + } + m := &master{} + m.initStdios() + return m, nil +} diff --git a/vendor/github.com/containerd/console/tc_darwin.go b/vendor/github.com/containerd/console/tc_darwin.go new file mode 100644 index 00000000..b102bad7 --- /dev/null +++ b/vendor/github.com/containerd/console/tc_darwin.go @@ -0,0 +1,37 @@ +package console + +import ( + "fmt" + "os" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + cmdTcGet = unix.TIOCGETA + cmdTcSet = unix.TIOCSETA +) + +func ioctl(fd, flag, data uintptr) error { + if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, flag, data); err != 0 { + return err + } + return nil +} + +// unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. +// unlockpt should be called before opening the slave side of a pty. +func unlockpt(f *os.File) error { + var u int32 + return ioctl(f.Fd(), unix.TIOCPTYUNLK, uintptr(unsafe.Pointer(&u))) +} + +// ptsname retrieves the name of the first available pts for the given master. +func ptsname(f *os.File) (string, error) { + n, err := unix.IoctlGetInt(int(f.Fd()), unix.TIOCPTYGNAME) + if err != nil { + return "", err + } + return fmt.Sprintf("/dev/pts/%d", n), nil +} diff --git a/vendor/github.com/containerd/console/tc_freebsd.go b/vendor/github.com/containerd/console/tc_freebsd.go new file mode 100644 index 00000000..e2a10e44 --- /dev/null +++ b/vendor/github.com/containerd/console/tc_freebsd.go @@ -0,0 +1,29 @@ +package console + +import ( + "fmt" + "os" + + "golang.org/x/sys/unix" +) + +const ( + cmdTcGet = unix.TIOCGETA + cmdTcSet = unix.TIOCSETA +) + +// unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. +// unlockpt should be called before opening the slave side of a pty. +// This does not exist on FreeBSD, it does not allocate controlling terminals on open +func unlockpt(f *os.File) error { + return nil +} + +// ptsname retrieves the name of the first available pts for the given master. +func ptsname(f *os.File) (string, error) { + n, err := unix.IoctlGetInt(int(f.Fd()), unix.TIOCGPTN) + if err != nil { + return "", err + } + return fmt.Sprintf("/dev/pts/%d", n), nil +} diff --git a/vendor/github.com/containerd/console/tc_linux.go b/vendor/github.com/containerd/console/tc_linux.go new file mode 100644 index 00000000..80ef2f6f --- /dev/null +++ b/vendor/github.com/containerd/console/tc_linux.go @@ -0,0 +1,37 @@ +package console + +import ( + "fmt" + "os" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + cmdTcGet = unix.TCGETS + cmdTcSet = unix.TCSETS +) + +func ioctl(fd, flag, data uintptr) error { + if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, flag, data); err != 0 { + return err + } + return nil +} + +// unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. +// unlockpt should be called before opening the slave side of a pty. +func unlockpt(f *os.File) error { + var u int32 + return ioctl(f.Fd(), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) +} + +// ptsname retrieves the name of the first available pts for the given master. +func ptsname(f *os.File) (string, error) { + n, err := unix.IoctlGetInt(int(f.Fd()), unix.TIOCGPTN) + if err != nil { + return "", err + } + return fmt.Sprintf("/dev/pts/%d", n), nil +} diff --git a/vendor/github.com/containerd/console/tc_solaris_cgo.go b/vendor/github.com/containerd/console/tc_solaris_cgo.go new file mode 100644 index 00000000..f8066d8e --- /dev/null +++ b/vendor/github.com/containerd/console/tc_solaris_cgo.go @@ -0,0 +1,35 @@ +// +build solaris,cgo + +package console + +import ( + "os" + + "golang.org/x/sys/unix" +) + +//#include +import "C" + +const ( + cmdTcGet = unix.TCGETS + cmdTcSet = unix.TCSETS +) + +// ptsname retrieves the name of the first available pts for the given master. +func ptsname(f *os.File) (string, error) { + ptspath, err := C.ptsname(C.int(f.Fd())) + if err != nil { + return "", err + } + return C.GoString(ptspath), nil +} + +// unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. +// unlockpt should be called before opening the slave side of a pty. +func unlockpt(f *os.File) error { + if _, err := C.grantpt(C.int(f.Fd())); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/containerd/console/tc_solaris_nocgo.go b/vendor/github.com/containerd/console/tc_solaris_nocgo.go new file mode 100644 index 00000000..0aefa0d2 --- /dev/null +++ b/vendor/github.com/containerd/console/tc_solaris_nocgo.go @@ -0,0 +1,31 @@ +// +build solaris,!cgo + +// +// Implementing the functions below requires cgo support. Non-cgo stubs +// versions are defined below to enable cross-compilation of source code +// that depends on these functions, but the resultant cross-compiled +// binaries cannot actually be used. If the stub function(s) below are +// actually invoked they will display an error message and cause the +// calling process to exit. +// + +package console + +import ( + "os" + + "golang.org/x/sys/unix" +) + +const ( + cmdTcGet = unix.TCGETS + cmdTcSet = unix.TCSETS +) + +func ptsname(f *os.File) (string, error) { + panic("ptsname() support requires cgo.") +} + +func unlockpt(f *os.File) error { + panic("unlockpt() support requires cgo.") +} diff --git a/vendor/github.com/containerd/console/tc_unix.go b/vendor/github.com/containerd/console/tc_unix.go new file mode 100644 index 00000000..df7dcb93 --- /dev/null +++ b/vendor/github.com/containerd/console/tc_unix.go @@ -0,0 +1,75 @@ +// +build darwin freebsd linux solaris + +package console + +import ( + "golang.org/x/sys/unix" +) + +func tcget(fd uintptr, p *unix.Termios) error { + termios, err := unix.IoctlGetTermios(int(fd), cmdTcGet) + if err != nil { + return err + } + *p = *termios + return nil +} + +func tcset(fd uintptr, p *unix.Termios) error { + return unix.IoctlSetTermios(int(fd), cmdTcSet, p) +} + +func tcgwinsz(fd uintptr) (WinSize, error) { + var ws WinSize + + uws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) + if err != nil { + return ws, err + } + + // Translate from unix.Winsize to console.WinSize + ws.Height = uws.Row + ws.Width = uws.Col + ws.x = uws.Xpixel + ws.y = uws.Ypixel + return ws, nil +} + +func tcswinsz(fd uintptr, ws WinSize) error { + // Translate from console.WinSize to unix.Winsize + + var uws unix.Winsize + uws.Row = ws.Height + uws.Col = ws.Width + uws.Xpixel = ws.x + uws.Ypixel = ws.y + + return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, &uws) +} + +func setONLCR(fd uintptr, enable bool) error { + var termios unix.Termios + if err := tcget(fd, &termios); err != nil { + return err + } + if enable { + // Set +onlcr so we can act like a real terminal + termios.Oflag |= unix.ONLCR + } else { + // Set -onlcr so we don't have to deal with \r. + termios.Oflag &^= unix.ONLCR + } + return tcset(fd, &termios) +} + +func cfmakeraw(t unix.Termios) unix.Termios { + t.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) + t.Oflag &^= unix.OPOST + t.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) + t.Cflag &^= (unix.CSIZE | unix.PARENB) + t.Cflag &^= unix.CS8 + t.Cc[unix.VMIN] = 1 + t.Cc[unix.VTIME] = 0 + + return t +} diff --git a/vendor/github.com/containerd/containerd/api/services/containers/v1/BUILD b/vendor/github.com/containerd/containerd/api/services/containers/v1/BUILD new file mode 100644 index 00000000..683bbc4c --- /dev/null +++ b/vendor/github.com/containerd/containerd/api/services/containers/v1/BUILD @@ -0,0 +1,30 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["containers.pb.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/api/services/containers/v1", + importpath = "github.com/containerd/containerd/api/services/containers/v1", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", + "//vendor/github.com/gogo/protobuf/types:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go b/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go index 90d30990..17cd36d3 100644 --- a/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go +++ b/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.pb.go @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/services/containers/v1/containers.proto -// DO NOT EDIT! /* Package containers is a generated protocol buffer package. @@ -25,9 +24,10 @@ package containers import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import _ "github.com/gogo/protobuf/gogoproto" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import google_protobuf1 "github.com/gogo/protobuf/types" -import google_protobuf2 "github.com/golang/protobuf/ptypes/empty" +import google_protobuf2 "github.com/gogo/protobuf/types" import google_protobuf3 "github.com/gogo/protobuf/types" import _ "github.com/gogo/protobuf/types" @@ -844,24 +844,6 @@ func (m *DeleteContainerRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Containers(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Containers(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintContainers(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -1270,51 +1252,14 @@ func (m *Container) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowContainers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowContainers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthContainers - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey if m.Labels == nil { m.Labels = make(map[string]string) } - if iNdEx < postIndex { - var valuekey uint64 + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowContainers @@ -1324,41 +1269,80 @@ func (m *Container) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift + wire |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowContainers + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowContainers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } } - if iNdEx >= l { + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthContainers + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowContainers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthContainers + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipContainers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthContainers + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthContainers - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - m.Labels[mapkey] = mapvalue - } else { - var mapvalue string - m.Labels[mapkey] = mapvalue } + m.Labels[mapkey] = mapvalue iNdEx = postIndex case 3: if wireType != 2 { @@ -1599,51 +1583,14 @@ func (m *Container) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowContainers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowContainers - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthContainers - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey if m.Extensions == nil { m.Extensions = make(map[string]google_protobuf1.Any) } - if iNdEx < postIndex { - var valuekey uint64 + var mapkey string + mapvalue := &google_protobuf1.Any{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowContainers @@ -1653,46 +1600,85 @@ func (m *Container) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift + wire |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowContainers + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowContainers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } } - if iNdEx >= l { + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthContainers + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowContainers + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } } + if mapmsglen < 0 { + return ErrInvalidLengthContainers + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthContainers + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &google_protobuf1.Any{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipContainers(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthContainers + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy } - if mapmsglen < 0 { - return ErrInvalidLengthContainers - } - postmsgIndex := iNdEx + mapmsglen - if mapmsglen < 0 { - return ErrInvalidLengthContainers - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue := &google_protobuf1.Any{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - m.Extensions[mapkey] = *mapvalue - } else { - var mapvalue google_protobuf1.Any - m.Extensions[mapkey] = mapvalue } + m.Extensions[mapkey] = *mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -2689,53 +2675,53 @@ func init() { var fileDescriptorContainers = []byte{ // 776 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xcd, 0x72, 0x12, 0x5b, - 0x10, 0xce, 0x00, 0x81, 0xd0, 0xdc, 0xaa, 0x7b, 0xeb, 0x5c, 0x2e, 0x77, 0x1c, 0xab, 0x80, 0xb0, - 0xa2, 0x2c, 0x1d, 0x0c, 0x5a, 0x9a, 0x1f, 0x37, 0x21, 0x7f, 0x65, 0x99, 0x58, 0xa9, 0x51, 0x37, - 0xba, 0x88, 0x03, 0x74, 0xc8, 0xc8, 0xfc, 0x39, 0xe7, 0x40, 0x49, 0xb9, 0xd0, 0x47, 0x70, 0xe7, - 0x23, 0xf8, 0x2a, 0x59, 0xba, 0x74, 0x15, 0x13, 0x9e, 0xc4, 0x9a, 0x33, 0x33, 0xcc, 0x04, 0x06, - 0x85, 0x68, 0x76, 0xa7, 0x39, 0xfd, 0x7d, 0xfd, 0xf1, 0x75, 0xf7, 0x01, 0xd8, 0xef, 0x68, 0xec, - 0xa4, 0xd7, 0x94, 0x5b, 0x96, 0x51, 0x6b, 0x59, 0x26, 0x53, 0x35, 0x13, 0x9d, 0x76, 0xf4, 0xa8, - 0xda, 0x5a, 0x8d, 0xa2, 0xd3, 0xd7, 0x5a, 0x48, 0xc3, 0xcf, 0x69, 0xad, 0xbf, 0x12, 0x89, 0x64, - 0xdb, 0xb1, 0x98, 0x45, 0x96, 0x43, 0x9c, 0x1c, 0x60, 0xe4, 0x48, 0x56, 0x7f, 0x45, 0xca, 0x77, - 0xac, 0x8e, 0xc5, 0xb3, 0x6b, 0xee, 0xc9, 0x03, 0x4a, 0x37, 0x3a, 0x96, 0xd5, 0xd1, 0xb1, 0xc6, - 0xa3, 0x66, 0xef, 0xb8, 0xa6, 0x9a, 0x03, 0xff, 0xea, 0xe6, 0xf8, 0x15, 0x1a, 0x36, 0x0b, 0x2e, - 0xcb, 0xe3, 0x97, 0xc7, 0x1a, 0xea, 0xed, 0x23, 0x43, 0xa5, 0x5d, 0x3f, 0xa3, 0x34, 0x9e, 0xc1, - 0x34, 0x03, 0x29, 0x53, 0x0d, 0xdb, 0x4b, 0xa8, 0x7c, 0x4e, 0x43, 0x76, 0x2b, 0x90, 0x48, 0x0a, - 0x90, 0xd0, 0xda, 0xa2, 0x50, 0x16, 0xaa, 0xd9, 0x46, 0x7a, 0x78, 0x56, 0x4a, 0x3c, 0xde, 0x56, - 0x12, 0x5a, 0x9b, 0x1c, 0x42, 0x5a, 0x57, 0x9b, 0xa8, 0x53, 0x31, 0x51, 0x4e, 0x56, 0x73, 0xf5, - 0x55, 0xf9, 0x97, 0x5f, 0x55, 0x1e, 0xb1, 0xca, 0xfb, 0x1c, 0xba, 0x63, 0x32, 0x67, 0xa0, 0xf8, - 0x3c, 0x24, 0x0f, 0x8b, 0x9a, 0xa1, 0x76, 0x50, 0x4c, 0xba, 0xc5, 0x14, 0x2f, 0x20, 0x4f, 0x21, - 0xe3, 0xf4, 0x4c, 0x57, 0xa3, 0x98, 0x2a, 0x0b, 0xd5, 0x5c, 0xfd, 0xfe, 0x5c, 0x85, 0x14, 0x0f, - 0xab, 0x04, 0x24, 0xa4, 0x0a, 0x29, 0x6a, 0x63, 0x4b, 0x5c, 0xe4, 0x64, 0x79, 0xd9, 0x73, 0x43, - 0x0e, 0xdc, 0x90, 0x37, 0xcd, 0x81, 0xc2, 0x33, 0x48, 0x19, 0x72, 0xd4, 0x54, 0x6d, 0x7a, 0x62, - 0x31, 0x86, 0x8e, 0x98, 0xe6, 0xaa, 0xa2, 0x1f, 0x91, 0x65, 0xf8, 0x2b, 0x08, 0x8f, 0xba, 0x38, - 0x10, 0x33, 0x97, 0x53, 0x9e, 0xe0, 0x80, 0x6c, 0x01, 0xb4, 0x1c, 0x54, 0x19, 0xb6, 0x8f, 0x54, - 0x26, 0x2e, 0xf1, 0xa2, 0xd2, 0x44, 0xd1, 0xe7, 0x41, 0x0b, 0x1a, 0x4b, 0xa7, 0x67, 0xa5, 0x85, - 0x4f, 0xdf, 0x4b, 0x82, 0x92, 0xf5, 0x71, 0x9b, 0xcc, 0x25, 0xe9, 0xd9, 0xed, 0x80, 0x24, 0x3b, - 0x0f, 0x89, 0x8f, 0xdb, 0x64, 0xa4, 0x09, 0x80, 0xef, 0x18, 0x9a, 0x54, 0xb3, 0x4c, 0x2a, 0x02, - 0x6f, 0xda, 0xa3, 0xb9, 0xbc, 0xdc, 0x19, 0xc1, 0x79, 0xe3, 0x1a, 0x29, 0xb7, 0x8c, 0x12, 0x61, - 0x95, 0xd6, 0x20, 0x17, 0xe9, 0x2c, 0xf9, 0x07, 0x92, 0xae, 0x2d, 0x7c, 0x78, 0x14, 0xf7, 0xe8, - 0xf6, 0xb8, 0xaf, 0xea, 0x3d, 0x14, 0x13, 0x5e, 0x8f, 0x79, 0xb0, 0x9e, 0x58, 0x15, 0xa4, 0x03, - 0xc8, 0xf8, 0xbd, 0x22, 0x04, 0x52, 0xa6, 0x6a, 0xa0, 0x8f, 0xe3, 0x67, 0x22, 0x43, 0xc6, 0xb2, - 0x19, 0x97, 0x9e, 0xf8, 0x49, 0xe7, 0x82, 0x24, 0xe9, 0x19, 0xfc, 0x3d, 0x26, 0x37, 0x46, 0xcd, - 0xad, 0xa8, 0x9a, 0x69, 0x94, 0xa1, 0xc6, 0xca, 0x1d, 0xf8, 0x77, 0x0f, 0xd9, 0xc8, 0x10, 0x05, - 0xdf, 0xf6, 0x90, 0xb2, 0x69, 0x2b, 0x52, 0x39, 0x81, 0xfc, 0xe5, 0x74, 0x6a, 0x5b, 0x26, 0x45, - 0x72, 0x08, 0xd9, 0x91, 0xc5, 0x1c, 0x96, 0xab, 0xdf, 0x9e, 0xa7, 0x11, 0xbe, 0xf1, 0x21, 0x49, - 0x65, 0x05, 0xfe, 0xdb, 0xd7, 0x68, 0x58, 0x8a, 0x06, 0xd2, 0x44, 0xc8, 0x1c, 0x6b, 0x3a, 0x43, - 0x87, 0x8a, 0x42, 0x39, 0x59, 0xcd, 0x2a, 0x41, 0x58, 0xd1, 0xa1, 0x30, 0x0e, 0xf1, 0xe5, 0x29, - 0x00, 0x61, 0x61, 0x0e, 0xbb, 0x9a, 0xbe, 0x08, 0x4b, 0xe5, 0x0d, 0x14, 0xb6, 0xf8, 0x38, 0x4f, - 0x98, 0xf7, 0xe7, 0xcd, 0xe8, 0xc2, 0xff, 0x13, 0xb5, 0xae, 0xcd, 0xf9, 0x2f, 0x02, 0x14, 0x5e, - 0xf0, 0x1d, 0xbb, 0xfe, 0x6f, 0x46, 0x36, 0x20, 0xe7, 0xed, 0x33, 0x7f, 0xcf, 0xfd, 0xa9, 0x9d, - 0x7c, 0x08, 0x76, 0xdd, 0x27, 0xff, 0x40, 0xa5, 0x5d, 0xc5, 0x7f, 0x36, 0xdc, 0xb3, 0x6b, 0xcb, - 0x84, 0xd0, 0x6b, 0xb3, 0xe5, 0x2e, 0x14, 0xb6, 0x51, 0xc7, 0x18, 0x57, 0xa6, 0x2c, 0x4b, 0xfd, - 0x3c, 0x05, 0x10, 0x0e, 0x23, 0xe9, 0x43, 0x72, 0x0f, 0x19, 0x79, 0x30, 0x83, 0x8c, 0x98, 0x95, - 0x94, 0x1e, 0xce, 0x8d, 0xf3, 0xad, 0x78, 0x0f, 0x29, 0x77, 0x2d, 0xc8, 0x2c, 0x3f, 0x67, 0xb1, - 0x2b, 0x27, 0xad, 0x5d, 0x01, 0xe9, 0x17, 0xff, 0x00, 0x69, 0x6f, 0x72, 0xc9, 0x2c, 0x24, 0xf1, - 0x0b, 0x25, 0xad, 0x5f, 0x05, 0x1a, 0x0a, 0xf0, 0x66, 0x64, 0x26, 0x01, 0xf1, 0x73, 0x3f, 0x93, - 0x80, 0x69, 0x93, 0xf8, 0x0a, 0xd2, 0xde, 0xdc, 0xcc, 0x24, 0x20, 0x7e, 0xc4, 0xa4, 0xc2, 0xc4, - 0x46, 0xec, 0xb8, 0xff, 0x90, 0x1a, 0xaf, 0x4f, 0x2f, 0x8a, 0x0b, 0xdf, 0x2e, 0x8a, 0x0b, 0x1f, - 0x87, 0x45, 0xe1, 0x74, 0x58, 0x14, 0xbe, 0x0e, 0x8b, 0xc2, 0xf9, 0xb0, 0x28, 0xbc, 0xdc, 0xfd, - 0x8d, 0x3f, 0x7d, 0x1b, 0x61, 0xd4, 0x4c, 0xf3, 0x8a, 0xf7, 0x7e, 0x04, 0x00, 0x00, 0xff, 0xff, - 0x17, 0x73, 0xba, 0x43, 0x45, 0x0a, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xcd, 0x72, 0xd2, 0x50, + 0x14, 0x26, 0x81, 0x86, 0x72, 0x70, 0x46, 0xe7, 0x8a, 0x18, 0xe3, 0x0c, 0x50, 0x56, 0x8c, 0xa3, + 0xc1, 0xa2, 0xa3, 0xfd, 0x71, 0x53, 0xfa, 0x37, 0x8e, 0xad, 0xd3, 0x89, 0x3a, 0xe3, 0xe8, 0xa2, + 0x06, 0xb8, 0xa5, 0x91, 0xfc, 0x99, 0x7b, 0x61, 0x64, 0x5c, 0xe8, 0x23, 0xb8, 0xf3, 0x11, 0x7c, + 0x95, 0x2e, 0x5d, 0xba, 0xaa, 0x2d, 0x4f, 0xe2, 0xe4, 0x26, 0x21, 0x29, 0x04, 0x85, 0x2a, 0xbb, + 0x7b, 0xb8, 0xe7, 0xfb, 0xce, 0xc7, 0x77, 0xce, 0xb9, 0x00, 0x7b, 0x6d, 0x8d, 0x1e, 0x77, 0x1b, + 0x72, 0xd3, 0x32, 0xaa, 0x4d, 0xcb, 0xa4, 0xaa, 0x66, 0x62, 0xa7, 0x15, 0x3d, 0xaa, 0xb6, 0x56, + 0x25, 0xd8, 0xe9, 0x69, 0x4d, 0x4c, 0xc2, 0xcf, 0x49, 0xb5, 0xb7, 0x1c, 0x89, 0x64, 0xdb, 0xb1, + 0xa8, 0x85, 0x96, 0x42, 0x9c, 0x1c, 0x60, 0xe4, 0x48, 0x56, 0x6f, 0x59, 0xca, 0xb5, 0xad, 0xb6, + 0xc5, 0xb2, 0xab, 0xee, 0xc9, 0x03, 0x4a, 0xb7, 0xda, 0x96, 0xd5, 0xd6, 0x71, 0x95, 0x45, 0x8d, + 0xee, 0x51, 0x55, 0x35, 0xfb, 0xfe, 0xd5, 0xed, 0xd1, 0x2b, 0x6c, 0xd8, 0x34, 0xb8, 0x2c, 0x8d, + 0x5e, 0x1e, 0x69, 0x58, 0x6f, 0x1d, 0x1a, 0x2a, 0xe9, 0xf8, 0x19, 0xc5, 0xd1, 0x0c, 0xaa, 0x19, + 0x98, 0x50, 0xd5, 0xb0, 0xbd, 0x84, 0xf2, 0x37, 0x01, 0x32, 0x9b, 0x81, 0x44, 0x94, 0x07, 0x5e, + 0x6b, 0x89, 0x5c, 0x89, 0xab, 0x64, 0xea, 0xc2, 0xe0, 0xb4, 0xc8, 0x3f, 0xdd, 0x52, 0x78, 0xad, + 0x85, 0x0e, 0x40, 0xd0, 0xd5, 0x06, 0xd6, 0x89, 0xc8, 0x97, 0x92, 0x95, 0x6c, 0x6d, 0x45, 0xfe, + 0xeb, 0x57, 0x95, 0x87, 0xac, 0xf2, 0x1e, 0x83, 0x6e, 0x9b, 0xd4, 0xe9, 0x2b, 0x3e, 0x0f, 0xca, + 0xc1, 0x82, 0x66, 0xa8, 0x6d, 0x2c, 0x26, 0xdd, 0x62, 0x8a, 0x17, 0xa0, 0xe7, 0x90, 0x76, 0xba, + 0xa6, 0xab, 0x51, 0x4c, 0x95, 0xb8, 0x4a, 0xb6, 0xf6, 0x70, 0xa6, 0x42, 0x8a, 0x87, 0x55, 0x02, + 0x12, 0x54, 0x81, 0x14, 0xb1, 0x71, 0x53, 0x5c, 0x60, 0x64, 0x39, 0xd9, 0x73, 0x43, 0x0e, 0xdc, + 0x90, 0x37, 0xcc, 0xbe, 0xc2, 0x32, 0x50, 0x09, 0xb2, 0xc4, 0x54, 0x6d, 0x72, 0x6c, 0x51, 0x8a, + 0x1d, 0x51, 0x60, 0xaa, 0xa2, 0x1f, 0xa1, 0x25, 0xb8, 0x12, 0x84, 0x87, 0x1d, 0xdc, 0x17, 0xd3, + 0x17, 0x53, 0x9e, 0xe1, 0x3e, 0xda, 0x04, 0x68, 0x3a, 0x58, 0xa5, 0xb8, 0x75, 0xa8, 0x52, 0x71, + 0x91, 0x15, 0x95, 0xc6, 0x8a, 0xbe, 0x0c, 0x5a, 0x50, 0x5f, 0x3c, 0x39, 0x2d, 0x26, 0xbe, 0xfe, + 0x2a, 0x72, 0x4a, 0xc6, 0xc7, 0x6d, 0x50, 0x97, 0xa4, 0x6b, 0xb7, 0x02, 0x92, 0xcc, 0x2c, 0x24, + 0x3e, 0x6e, 0x83, 0xa2, 0x06, 0x00, 0xfe, 0x48, 0xb1, 0x49, 0x34, 0xcb, 0x24, 0x22, 0xb0, 0xa6, + 0x3d, 0x99, 0xc9, 0xcb, 0xed, 0x21, 0x9c, 0x35, 0xae, 0x9e, 0x72, 0xcb, 0x28, 0x11, 0x56, 0x69, + 0x15, 0xb2, 0x91, 0xce, 0xa2, 0x6b, 0x90, 0x74, 0x6d, 0x61, 0xc3, 0xa3, 0xb8, 0x47, 0xb7, 0xc7, + 0x3d, 0x55, 0xef, 0x62, 0x91, 0xf7, 0x7a, 0xcc, 0x82, 0x35, 0x7e, 0x85, 0x93, 0xf6, 0x21, 0xed, + 0xf7, 0x0a, 0x21, 0x48, 0x99, 0xaa, 0x81, 0x7d, 0x1c, 0x3b, 0x23, 0x19, 0xd2, 0x96, 0x4d, 0x99, + 0x74, 0xfe, 0x0f, 0x9d, 0x0b, 0x92, 0xa4, 0x17, 0x70, 0x75, 0x44, 0x6e, 0x8c, 0x9a, 0x3b, 0x51, + 0x35, 0x93, 0x28, 0x43, 0x8d, 0xe5, 0x7b, 0x70, 0x7d, 0x17, 0xd3, 0xa1, 0x21, 0x0a, 0xfe, 0xd0, + 0xc5, 0x84, 0x4e, 0x5a, 0x91, 0xf2, 0x31, 0xe4, 0x2e, 0xa6, 0x13, 0xdb, 0x32, 0x09, 0x46, 0x07, + 0x90, 0x19, 0x5a, 0xcc, 0x60, 0xd9, 0xda, 0xdd, 0x59, 0x1a, 0xe1, 0x1b, 0x1f, 0x92, 0x94, 0x97, + 0xe1, 0xc6, 0x9e, 0x46, 0xc2, 0x52, 0x24, 0x90, 0x26, 0x42, 0xfa, 0x48, 0xd3, 0x29, 0x76, 0x88, + 0xc8, 0x95, 0x92, 0x95, 0x8c, 0x12, 0x84, 0x65, 0x1d, 0xf2, 0xa3, 0x10, 0x5f, 0x9e, 0x02, 0x10, + 0x16, 0x66, 0xb0, 0xcb, 0xe9, 0x8b, 0xb0, 0x94, 0xdf, 0x43, 0x7e, 0x93, 0x8d, 0xf3, 0x98, 0x79, + 0xff, 0xdf, 0x8c, 0x0e, 0xdc, 0x1c, 0xab, 0x35, 0x37, 0xe7, 0xbf, 0x73, 0x90, 0x7f, 0xc5, 0x76, + 0x6c, 0xfe, 0xdf, 0x0c, 0xad, 0x43, 0xd6, 0xdb, 0x67, 0xf6, 0x9e, 0xfb, 0x53, 0x3b, 0xfe, 0x10, + 0xec, 0xb8, 0x4f, 0xfe, 0xbe, 0x4a, 0x3a, 0x8a, 0xff, 0x6c, 0xb8, 0x67, 0xd7, 0x96, 0x31, 0xa1, + 0x73, 0xb3, 0xe5, 0x3e, 0xe4, 0xb7, 0xb0, 0x8e, 0x63, 0x5c, 0x99, 0xb0, 0x2c, 0xb5, 0xb3, 0x14, + 0x40, 0x38, 0x8c, 0xa8, 0x07, 0xc9, 0x5d, 0x4c, 0xd1, 0xa3, 0x29, 0x64, 0xc4, 0xac, 0xa4, 0xf4, + 0x78, 0x66, 0x9c, 0x6f, 0xc5, 0x27, 0x48, 0xb9, 0x6b, 0x81, 0xa6, 0xf9, 0x39, 0x8b, 0x5d, 0x39, + 0x69, 0xf5, 0x12, 0x48, 0xbf, 0xf8, 0x67, 0x10, 0xbc, 0xc9, 0x45, 0xd3, 0x90, 0xc4, 0x2f, 0x94, + 0xb4, 0x76, 0x19, 0x68, 0x28, 0xc0, 0x9b, 0x91, 0xa9, 0x04, 0xc4, 0xcf, 0xfd, 0x54, 0x02, 0x26, + 0x4d, 0xe2, 0x5b, 0x10, 0xbc, 0xb9, 0x99, 0x4a, 0x40, 0xfc, 0x88, 0x49, 0xf9, 0xb1, 0x8d, 0xd8, + 0x76, 0xff, 0x21, 0xd5, 0xdf, 0x9d, 0x9c, 0x17, 0x12, 0x3f, 0xcf, 0x0b, 0x89, 0x2f, 0x83, 0x02, + 0x77, 0x32, 0x28, 0x70, 0x3f, 0x06, 0x05, 0xee, 0x6c, 0x50, 0xe0, 0xde, 0xec, 0xfc, 0xc3, 0x9f, + 0xbe, 0xf5, 0x30, 0x7a, 0x9d, 0x68, 0x08, 0xac, 0xe6, 0x83, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, + 0x95, 0x94, 0x84, 0xf2, 0x47, 0x0a, 0x00, 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.proto b/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.proto index 0a2311c4..b7b32d94 100644 --- a/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.proto +++ b/vendor/github.com/containerd/containerd/api/services/containers/v1/containers.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package containerd.services.containers.v1; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/field_mask.proto"; diff --git a/vendor/github.com/containerd/containerd/api/services/tasks/v1/BUILD b/vendor/github.com/containerd/containerd/api/services/tasks/v1/BUILD new file mode 100644 index 00000000..d361ad05 --- /dev/null +++ b/vendor/github.com/containerd/containerd/api/services/tasks/v1/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["tasks.pb.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/api/services/tasks/v1", + importpath = "github.com/containerd/containerd/api/services/tasks/v1", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/containerd/containerd/api/types:go_default_library", + "//vendor/github.com/containerd/containerd/api/types/task:go_default_library", + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/gogo/protobuf/types:go_default_library", + "//vendor/github.com/opencontainers/go-digest:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go b/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go index 0f587685..83c18f68 100644 --- a/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go +++ b/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.pb.go @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/services/tasks/v1/tasks.proto -// DO NOT EDIT! /* Package tasks is a generated protocol buffer package. @@ -42,9 +41,10 @@ package tasks import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/empty" +import google_protobuf "github.com/gogo/protobuf/types" import google_protobuf1 "github.com/gogo/protobuf/types" -import _ "github.com/gogo/protobuf/gogoproto" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import containerd_types "github.com/containerd/containerd/api/types" import containerd_types1 "github.com/containerd/containerd/api/types" import containerd_types2 "github.com/containerd/containerd/api/types" @@ -1890,24 +1890,6 @@ func (m *WaitResponse) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Tasks(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Tasks(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintTasks(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -5725,88 +5707,88 @@ func init() { } var fileDescriptorTasks = []byte{ - // 1317 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x5b, 0x6f, 0x1b, 0x45, - 0x1b, 0xee, 0xfa, 0xec, 0xd7, 0x49, 0x9b, 0xec, 0x97, 0xe6, 0x33, 0x4b, 0x15, 0x87, 0xe5, 0xc6, - 0x04, 0xba, 0x4b, 0x5d, 0x54, 0x21, 0x5a, 0x21, 0x35, 0x07, 0x22, 0x0b, 0xaa, 0xa6, 0xdb, 0x72, - 0x50, 0x25, 0x14, 0xb6, 0xbb, 0x13, 0x67, 0x14, 0x7b, 0x67, 0xbb, 0x33, 0x4e, 0x1b, 0xb8, 0x80, - 0x9f, 0xd0, 0x5b, 0x6e, 0xf8, 0x3d, 0xb9, 0xe4, 0x12, 0xa1, 0x2a, 0x50, 0xff, 0x0b, 0xee, 0xd0, - 0x1c, 0x76, 0xb3, 0xb1, 0x63, 0xaf, 0x93, 0x34, 0xdc, 0xb4, 0x33, 0xb3, 0xef, 0x69, 0x9e, 0x79, - 0x0f, 0x8f, 0x03, 0xab, 0x1d, 0xcc, 0x76, 0xfb, 0xcf, 0x2c, 0x8f, 0xf4, 0x6c, 0x8f, 0x04, 0xcc, - 0xc5, 0x01, 0x8a, 0xfc, 0xf4, 0xd2, 0x0d, 0xb1, 0x4d, 0x51, 0xb4, 0x8f, 0x3d, 0x44, 0x6d, 0xe6, - 0xd2, 0x3d, 0x6a, 0xef, 0xdf, 0x92, 0x0b, 0x2b, 0x8c, 0x08, 0x23, 0xfa, 0x8d, 0x63, 0x69, 0x2b, - 0x96, 0xb4, 0xa4, 0xc0, 0xfe, 0x2d, 0xe3, 0xdd, 0x0e, 0x21, 0x9d, 0x2e, 0xb2, 0x85, 0xec, 0xb3, - 0xfe, 0x8e, 0x8d, 0x7a, 0x21, 0x3b, 0x90, 0xaa, 0xc6, 0x3b, 0xc3, 0x1f, 0xdd, 0x20, 0xfe, 0xb4, - 0xd0, 0x21, 0x1d, 0x22, 0x96, 0x36, 0x5f, 0xa9, 0xd3, 0x3b, 0x53, 0xc5, 0xcb, 0x0e, 0x42, 0x44, - 0xed, 0x1e, 0xe9, 0x07, 0x4c, 0xe9, 0x7d, 0x7a, 0x16, 0x3d, 0xc4, 0x22, 0xec, 0xa9, 0xdb, 0x19, - 0x77, 0xcf, 0xa0, 0xe9, 0x23, 0xea, 0x45, 0x38, 0x64, 0x24, 0x52, 0xca, 0x9f, 0x9d, 0x41, 0x99, - 0x23, 0x26, 0xfe, 0x51, 0xba, 0x8d, 0x61, 0x6c, 0x18, 0xee, 0x21, 0xca, 0xdc, 0x5e, 0x28, 0x05, - 0xcc, 0xc3, 0x1c, 0xcc, 0xaf, 0x45, 0xc8, 0x65, 0xe8, 0x89, 0x4b, 0xf7, 0x1c, 0xf4, 0xbc, 0x8f, - 0x28, 0xd3, 0x5b, 0x30, 0x93, 0x98, 0xdf, 0xc6, 0x7e, 0x5d, 0x5b, 0xd6, 0x9a, 0xd5, 0xd5, 0x6b, - 0x83, 0xa3, 0x46, 0x6d, 0x2d, 0x3e, 0x6f, 0xaf, 0x3b, 0xb5, 0x44, 0xa8, 0xed, 0xeb, 0x36, 0x94, - 0x22, 0x42, 0xd8, 0x0e, 0xad, 0xe7, 0x97, 0xf3, 0xcd, 0x5a, 0xeb, 0xff, 0x56, 0xea, 0x49, 0x45, - 0x74, 0xd6, 0x03, 0x0e, 0xa6, 0xa3, 0xc4, 0xf4, 0x05, 0x28, 0x52, 0xe6, 0xe3, 0xa0, 0x5e, 0xe0, - 0xd6, 0x1d, 0xb9, 0xd1, 0x17, 0xa1, 0x44, 0x99, 0x4f, 0xfa, 0xac, 0x5e, 0x14, 0xc7, 0x6a, 0xa7, - 0xce, 0x51, 0x14, 0xd5, 0x4b, 0xc9, 0x39, 0x8a, 0x22, 0xdd, 0x80, 0x0a, 0x43, 0x51, 0x0f, 0x07, - 0x6e, 0xb7, 0x5e, 0x5e, 0xd6, 0x9a, 0x15, 0x27, 0xd9, 0xeb, 0xf7, 0x00, 0xbc, 0x5d, 0xe4, 0xed, - 0x85, 0x04, 0x07, 0xac, 0x5e, 0x59, 0xd6, 0x9a, 0xb5, 0xd6, 0x8d, 0xd1, 0xb0, 0xd6, 0x13, 0xc4, - 0x9d, 0x94, 0xbc, 0x6e, 0x41, 0x99, 0x84, 0x0c, 0x93, 0x80, 0xd6, 0xab, 0x42, 0x75, 0xc1, 0x92, - 0x68, 0x5a, 0x31, 0x9a, 0xd6, 0xfd, 0xe0, 0xc0, 0x89, 0x85, 0xcc, 0xa7, 0xa0, 0xa7, 0x91, 0xa4, - 0x21, 0x09, 0x28, 0x3a, 0x17, 0x94, 0x73, 0x90, 0x0f, 0xb1, 0x5f, 0xcf, 0x2d, 0x6b, 0xcd, 0x59, - 0x87, 0x2f, 0xcd, 0x0e, 0xcc, 0x3c, 0x66, 0x6e, 0xc4, 0x2e, 0xf2, 0x40, 0xef, 0x43, 0x19, 0xbd, - 0x44, 0xde, 0xb6, 0xb2, 0x5c, 0x5d, 0x85, 0xc1, 0x51, 0xa3, 0xb4, 0xf1, 0x12, 0x79, 0xed, 0x75, - 0xa7, 0xc4, 0x3f, 0xb5, 0x7d, 0xf3, 0x3d, 0x98, 0x55, 0x8e, 0x54, 0xfc, 0x2a, 0x16, 0xed, 0x38, - 0x96, 0x4d, 0x98, 0x5f, 0x47, 0x5d, 0x74, 0xe1, 0x8c, 0x31, 0x7f, 0xd3, 0xe0, 0xaa, 0xb4, 0x94, - 0x78, 0x5b, 0x84, 0x5c, 0xa2, 0x5c, 0x1a, 0x1c, 0x35, 0x72, 0xed, 0x75, 0x27, 0x87, 0x4f, 0x41, - 0x44, 0x6f, 0x40, 0x0d, 0xbd, 0xc4, 0x6c, 0x9b, 0x32, 0x97, 0xf5, 0x79, 0xce, 0xf1, 0x2f, 0xc0, - 0x8f, 0x1e, 0x8b, 0x13, 0xfd, 0x3e, 0x54, 0xf9, 0x0e, 0xf9, 0xdb, 0x2e, 0x13, 0x29, 0x56, 0x6b, - 0x19, 0x23, 0x0f, 0xf8, 0x24, 0x2e, 0x87, 0xd5, 0xca, 0xe1, 0x51, 0xe3, 0xca, 0xab, 0xbf, 0x1a, - 0x9a, 0x53, 0x91, 0x6a, 0xf7, 0x99, 0x49, 0x60, 0x41, 0xc6, 0xb7, 0x15, 0x11, 0x0f, 0x51, 0x7a, - 0xe9, 0xe8, 0x23, 0x80, 0x4d, 0x74, 0xf9, 0x8f, 0xbc, 0x01, 0x35, 0xe1, 0x46, 0x81, 0x7e, 0x07, - 0xca, 0xa1, 0xbc, 0xa0, 0x70, 0x31, 0x54, 0x23, 0xfb, 0xb7, 0x54, 0x99, 0xc4, 0x20, 0xc4, 0xc2, - 0xe6, 0x0a, 0xcc, 0x7d, 0x85, 0x29, 0xe3, 0x69, 0x90, 0x40, 0xb3, 0x08, 0xa5, 0x1d, 0xdc, 0x65, - 0x28, 0x92, 0xd1, 0x3a, 0x6a, 0xc7, 0x93, 0x26, 0x25, 0x9b, 0xd4, 0x46, 0x51, 0xb4, 0xf8, 0xba, - 0x26, 0x3a, 0xc6, 0x64, 0xb7, 0x52, 0xd4, 0x7c, 0xa5, 0x41, 0xed, 0x4b, 0xdc, 0xed, 0x5e, 0x36, - 0x48, 0xa2, 0xe1, 0xe0, 0x0e, 0x6f, 0x2b, 0x32, 0xb7, 0xd4, 0x8e, 0xa7, 0xa2, 0xdb, 0xed, 0x8a, - 0x8c, 0xaa, 0x38, 0x7c, 0x69, 0xfe, 0xa3, 0x81, 0xce, 0x95, 0xdf, 0x42, 0x96, 0x24, 0x3d, 0x31, - 0x77, 0x7a, 0x4f, 0xcc, 0x8f, 0xe9, 0x89, 0x85, 0xb1, 0x3d, 0xb1, 0x38, 0xd4, 0x13, 0x9b, 0x50, - 0xa0, 0x21, 0xf2, 0x44, 0x17, 0x1d, 0xd7, 0xd2, 0x84, 0x44, 0x1a, 0xa5, 0xf2, 0xd8, 0x54, 0xba, - 0x0e, 0xff, 0x3b, 0x71, 0x75, 0xf9, 0xb2, 0xe6, 0xaf, 0x1a, 0xcc, 0x39, 0x88, 0xe2, 0x1f, 0xd1, - 0x16, 0x3b, 0xb8, 0xf4, 0xa7, 0x5a, 0x80, 0xe2, 0x0b, 0xec, 0xb3, 0x5d, 0xf5, 0x52, 0x72, 0xc3, - 0xd1, 0xd9, 0x45, 0xb8, 0xb3, 0x2b, 0xab, 0x7f, 0xd6, 0x51, 0x3b, 0xf3, 0x67, 0xb8, 0xba, 0xd6, - 0x25, 0x14, 0xb5, 0x1f, 0xfe, 0x17, 0x81, 0xc9, 0xe7, 0xcc, 0x8b, 0x57, 0x90, 0x1b, 0xf3, 0x0b, - 0x98, 0xdb, 0x72, 0xfb, 0xf4, 0xc2, 0xfd, 0x73, 0x13, 0xe6, 0x1d, 0x44, 0xfb, 0xbd, 0x0b, 0x1b, - 0xda, 0x80, 0x6b, 0xbc, 0x38, 0xb7, 0xb0, 0x7f, 0x91, 0xe4, 0x35, 0x1d, 0xd9, 0x0f, 0xa4, 0x19, - 0x55, 0xe2, 0x9f, 0x43, 0x55, 0xb5, 0x0b, 0x14, 0x97, 0xf9, 0xf2, 0xa4, 0x32, 0x6f, 0x07, 0x3b, - 0xc4, 0x39, 0x56, 0x31, 0x5f, 0x6b, 0x70, 0x7d, 0x2d, 0x99, 0xc9, 0x17, 0xe5, 0x28, 0xdb, 0x30, - 0x1f, 0xba, 0x11, 0x0a, 0xd8, 0x76, 0x8a, 0x17, 0xc8, 0xe7, 0x6b, 0xf1, 0xfe, 0xff, 0xe7, 0x51, - 0x63, 0x25, 0xc5, 0xb6, 0x48, 0x88, 0x82, 0x44, 0x9d, 0xda, 0x1d, 0x72, 0xd3, 0xc7, 0x1d, 0x44, - 0x99, 0xb5, 0x2e, 0xfe, 0x73, 0xe6, 0xa4, 0xb1, 0xb5, 0x53, 0x39, 0x43, 0x7e, 0x1a, 0xce, 0xf0, - 0x1d, 0x2c, 0x0e, 0xdf, 0x2e, 0x01, 0xae, 0x76, 0xcc, 0x04, 0x4f, 0xed, 0x90, 0x23, 0xe4, 0x25, - 0xad, 0x60, 0xfe, 0x04, 0xf3, 0x5f, 0x87, 0xfe, 0x5b, 0xe0, 0x75, 0x2d, 0xa8, 0x46, 0x88, 0x92, - 0x7e, 0xe4, 0x21, 0x2a, 0xb0, 0x1a, 0x77, 0xa9, 0x63, 0x31, 0x73, 0x05, 0xae, 0x3e, 0x90, 0x04, - 0x38, 0xf6, 0x5c, 0x87, 0xb2, 0x9c, 0x04, 0xf2, 0x2a, 0x55, 0x27, 0xde, 0xf2, 0xe4, 0x4b, 0x64, - 0x93, 0xb9, 0x50, 0x56, 0xfc, 0x59, 0xdd, 0xbb, 0x7e, 0x0a, 0x97, 0x14, 0x02, 0x4e, 0x2c, 0x68, - 0xee, 0x40, 0xed, 0x5b, 0x17, 0x5f, 0xfe, 0xec, 0x8c, 0x60, 0x46, 0xfa, 0x51, 0xb1, 0x0e, 0xf1, - 0x10, 0x6d, 0x32, 0x0f, 0xc9, 0x9d, 0x87, 0x87, 0xb4, 0x5e, 0xcf, 0x40, 0x51, 0x4c, 0x4e, 0x7d, - 0x0f, 0x4a, 0x92, 0x63, 0xea, 0xb6, 0x35, 0xe9, 0x17, 0x93, 0x35, 0xc2, 0xe9, 0x8d, 0x8f, 0xa7, - 0x57, 0x50, 0x57, 0xfb, 0x01, 0x8a, 0x82, 0x0b, 0xea, 0x2b, 0x93, 0x55, 0xd3, 0xcc, 0xd4, 0xf8, - 0x70, 0x2a, 0x59, 0xe5, 0xa1, 0x03, 0x25, 0x49, 0xb0, 0xb2, 0xae, 0x33, 0x42, 0x38, 0x8d, 0x8f, - 0xa6, 0x51, 0x48, 0x1c, 0x3d, 0x87, 0xd9, 0x13, 0x4c, 0x4e, 0x6f, 0x4d, 0xa3, 0x7e, 0x72, 0xa0, - 0x9f, 0xd1, 0xe5, 0x53, 0xc8, 0x6f, 0x22, 0xa6, 0x37, 0x27, 0x2b, 0x1d, 0xd3, 0x3d, 0xe3, 0x83, - 0x29, 0x24, 0x13, 0xdc, 0x0a, 0xbc, 0xd3, 0xea, 0xd6, 0x64, 0x95, 0x61, 0x76, 0x66, 0xd8, 0x53, - 0xcb, 0x2b, 0x47, 0x6d, 0x28, 0x70, 0xb2, 0xa5, 0x67, 0xc4, 0x96, 0x22, 0x64, 0xc6, 0xe2, 0x48, - 0x72, 0x6f, 0xf0, 0x1f, 0xeb, 0xfa, 0x16, 0x14, 0x78, 0x29, 0xe9, 0x19, 0x79, 0x38, 0x4a, 0xa4, - 0xc6, 0x5a, 0x7c, 0x0c, 0xd5, 0x84, 0x63, 0x64, 0x41, 0x31, 0x4c, 0x46, 0xc6, 0x1a, 0x7d, 0x08, - 0x65, 0xc5, 0x0e, 0xf4, 0x8c, 0xf7, 0x3e, 0x49, 0x22, 0x26, 0x18, 0x2c, 0x8a, 0x69, 0x9f, 0x15, - 0xe1, 0x30, 0x25, 0x18, 0x6b, 0xf0, 0x11, 0x94, 0xe4, 0xd8, 0xcf, 0x2a, 0x9a, 0x11, 0x72, 0x30, - 0xd6, 0x24, 0x86, 0x4a, 0x3c, 0xb9, 0xf5, 0x9b, 0xd9, 0x39, 0x92, 0x22, 0x0a, 0x86, 0x35, 0xad, - 0xb8, 0xca, 0xa8, 0x17, 0x00, 0xa9, 0x79, 0x79, 0x3b, 0x03, 0xe2, 0xd3, 0x26, 0xbf, 0xf1, 0xc9, - 0xd9, 0x94, 0x94, 0xe3, 0x47, 0x50, 0x92, 0x03, 0x31, 0x0b, 0xb6, 0x91, 0xb1, 0x39, 0x16, 0xb6, - 0x1d, 0x28, 0xab, 0xd1, 0x95, 0x95, 0x2b, 0x27, 0xa7, 0xa1, 0x71, 0x73, 0x4a, 0x69, 0x15, 0xfa, - 0xf7, 0x50, 0xe0, 0x33, 0x27, 0xab, 0x0a, 0x53, 0xf3, 0xcf, 0x58, 0x99, 0x46, 0x54, 0x9a, 0x5f, - 0xfd, 0xe6, 0xf0, 0xcd, 0xd2, 0x95, 0x3f, 0xde, 0x2c, 0x5d, 0xf9, 0x65, 0xb0, 0xa4, 0x1d, 0x0e, - 0x96, 0xb4, 0xdf, 0x07, 0x4b, 0xda, 0xdf, 0x83, 0x25, 0xed, 0xe9, 0xbd, 0xf3, 0xfd, 0x65, 0xef, - 0xae, 0x58, 0x3c, 0x2b, 0x09, 0xb8, 0x6e, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x67, 0xc5, 0x63, - 0x32, 0x20, 0x14, 0x00, 0x00, + // 1318 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4b, 0x6f, 0x1b, 0x45, + 0x1c, 0xef, 0xfa, 0xed, 0xbf, 0x93, 0x36, 0x59, 0xd2, 0x60, 0x96, 0x2a, 0x0e, 0xcb, 0xc5, 0x04, + 0xba, 0x4b, 0x5d, 0x54, 0x21, 0x5a, 0x21, 0x35, 0x0f, 0x22, 0x0b, 0xaa, 0xa6, 0xdb, 0x02, 0x55, + 0x25, 0x14, 0xb6, 0xbb, 0x13, 0x67, 0x14, 0x7b, 0x67, 0xbb, 0x33, 0x4e, 0x1b, 0x38, 0xc0, 0x47, + 0xe8, 0x95, 0x0b, 0x9f, 0x27, 0x47, 0x8e, 0x08, 0x55, 0x81, 0xfa, 0x5b, 0x70, 0x43, 0xf3, 0xd8, + 0xcd, 0xc6, 0x8e, 0xbd, 0x4e, 0xd3, 0x70, 0x69, 0x67, 0x66, 0xff, 0xaf, 0xf9, 0xcd, 0xff, 0xf1, + 0x73, 0x60, 0xb5, 0x83, 0xd9, 0x6e, 0xff, 0xa9, 0xe5, 0x91, 0x9e, 0xed, 0x91, 0x80, 0xb9, 0x38, + 0x40, 0x91, 0x9f, 0x5e, 0xba, 0x21, 0xb6, 0x29, 0x8a, 0xf6, 0xb1, 0x87, 0xa8, 0xcd, 0x5c, 0xba, + 0x47, 0xed, 0xfd, 0x1b, 0x72, 0x61, 0x85, 0x11, 0x61, 0x44, 0xbf, 0x76, 0x2c, 0x6d, 0xc5, 0x92, + 0x96, 0x14, 0xd8, 0xbf, 0x61, 0xbc, 0xdf, 0x21, 0xa4, 0xd3, 0x45, 0xb6, 0x90, 0x7d, 0xda, 0xdf, + 0xb1, 0x51, 0x2f, 0x64, 0x07, 0x52, 0xd5, 0x78, 0x6f, 0xf8, 0xa3, 0x1b, 0xc4, 0x9f, 0x16, 0x3a, + 0xa4, 0x43, 0xc4, 0xd2, 0xe6, 0x2b, 0x75, 0x7a, 0x6b, 0xaa, 0x78, 0xd9, 0x41, 0x88, 0xa8, 0xdd, + 0x23, 0xfd, 0x80, 0x29, 0xbd, 0xcf, 0xcf, 0xa2, 0x87, 0x58, 0x84, 0x3d, 0x75, 0x3b, 0xe3, 0xf6, + 0x19, 0x34, 0x7d, 0x44, 0xbd, 0x08, 0x87, 0x8c, 0x44, 0x4a, 0xf9, 0x8b, 0x33, 0x28, 0x73, 0xc4, + 0xc4, 0x3f, 0x4a, 0xb7, 0x31, 0x8c, 0x0d, 0xc3, 0x3d, 0x44, 0x99, 0xdb, 0x0b, 0xa5, 0x80, 0x79, + 0x98, 0x83, 0xf9, 0xb5, 0x08, 0xb9, 0x0c, 0x3d, 0x72, 0xe9, 0x9e, 0x83, 0x9e, 0xf5, 0x11, 0x65, + 0x7a, 0x0b, 0x66, 0x12, 0xf3, 0xdb, 0xd8, 0xaf, 0x6b, 0xcb, 0x5a, 0xb3, 0xba, 0x7a, 0x65, 0x70, + 0xd4, 0xa8, 0xad, 0xc5, 0xe7, 0xed, 0x75, 0xa7, 0x96, 0x08, 0xb5, 0x7d, 0xdd, 0x86, 0x52, 0x44, + 0x08, 0xdb, 0xa1, 0xf5, 0xfc, 0x72, 0xbe, 0x59, 0x6b, 0xbd, 0x6b, 0xa5, 0x9e, 0x54, 0x44, 0x67, + 0xdd, 0xe3, 0x60, 0x3a, 0x4a, 0x4c, 0x5f, 0x80, 0x22, 0x65, 0x3e, 0x0e, 0xea, 0x05, 0x6e, 0xdd, + 0x91, 0x1b, 0x7d, 0x11, 0x4a, 0x94, 0xf9, 0xa4, 0xcf, 0xea, 0x45, 0x71, 0xac, 0x76, 0xea, 0x1c, + 0x45, 0x51, 0xbd, 0x94, 0x9c, 0xa3, 0x28, 0xd2, 0x0d, 0xa8, 0x30, 0x14, 0xf5, 0x70, 0xe0, 0x76, + 0xeb, 0xe5, 0x65, 0xad, 0x59, 0x71, 0x92, 0xbd, 0x7e, 0x07, 0xc0, 0xdb, 0x45, 0xde, 0x5e, 0x48, + 0x70, 0xc0, 0xea, 0x95, 0x65, 0xad, 0x59, 0x6b, 0x5d, 0x1b, 0x0d, 0x6b, 0x3d, 0x41, 0xdc, 0x49, + 0xc9, 0xeb, 0x16, 0x94, 0x49, 0xc8, 0x30, 0x09, 0x68, 0xbd, 0x2a, 0x54, 0x17, 0x2c, 0x89, 0xa6, + 0x15, 0xa3, 0x69, 0xdd, 0x0d, 0x0e, 0x9c, 0x58, 0xc8, 0x7c, 0x02, 0x7a, 0x1a, 0x49, 0x1a, 0x92, + 0x80, 0xa2, 0x37, 0x82, 0x72, 0x0e, 0xf2, 0x21, 0xf6, 0xeb, 0xb9, 0x65, 0xad, 0x39, 0xeb, 0xf0, + 0xa5, 0xd9, 0x81, 0x99, 0x87, 0xcc, 0x8d, 0xd8, 0x79, 0x1e, 0xe8, 0x43, 0x28, 0xa3, 0x17, 0xc8, + 0xdb, 0x56, 0x96, 0xab, 0xab, 0x30, 0x38, 0x6a, 0x94, 0x36, 0x5e, 0x20, 0xaf, 0xbd, 0xee, 0x94, + 0xf8, 0xa7, 0xb6, 0x6f, 0x7e, 0x00, 0xb3, 0xca, 0x91, 0x8a, 0x5f, 0xc5, 0xa2, 0x1d, 0xc7, 0xb2, + 0x09, 0xf3, 0xeb, 0xa8, 0x8b, 0xce, 0x9d, 0x31, 0xe6, 0xef, 0x1a, 0x5c, 0x96, 0x96, 0x12, 0x6f, + 0x8b, 0x90, 0x4b, 0x94, 0x4b, 0x83, 0xa3, 0x46, 0xae, 0xbd, 0xee, 0xe4, 0xf0, 0x29, 0x88, 0xe8, + 0x0d, 0xa8, 0xa1, 0x17, 0x98, 0x6d, 0x53, 0xe6, 0xb2, 0x3e, 0xcf, 0x39, 0xfe, 0x05, 0xf8, 0xd1, + 0x43, 0x71, 0xa2, 0xdf, 0x85, 0x2a, 0xdf, 0x21, 0x7f, 0xdb, 0x65, 0x22, 0xc5, 0x6a, 0x2d, 0x63, + 0xe4, 0x01, 0x1f, 0xc5, 0xe5, 0xb0, 0x5a, 0x39, 0x3c, 0x6a, 0x5c, 0x7a, 0xf9, 0x77, 0x43, 0x73, + 0x2a, 0x52, 0xed, 0x2e, 0x33, 0x09, 0x2c, 0xc8, 0xf8, 0xb6, 0x22, 0xe2, 0x21, 0x4a, 0x2f, 0x1c, + 0x7d, 0x04, 0xb0, 0x89, 0x2e, 0xfe, 0x91, 0x37, 0xa0, 0x26, 0xdc, 0x28, 0xd0, 0x6f, 0x41, 0x39, + 0x94, 0x17, 0x14, 0x2e, 0x86, 0x6a, 0x64, 0xff, 0x86, 0x2a, 0x93, 0x18, 0x84, 0x58, 0xd8, 0x5c, + 0x81, 0xb9, 0x6f, 0x30, 0x65, 0x3c, 0x0d, 0x12, 0x68, 0x16, 0xa1, 0xb4, 0x83, 0xbb, 0x0c, 0x45, + 0x32, 0x5a, 0x47, 0xed, 0x78, 0xd2, 0xa4, 0x64, 0x93, 0xda, 0x28, 0x8a, 0x16, 0x5f, 0xd7, 0x44, + 0xc7, 0x98, 0xec, 0x56, 0x8a, 0x9a, 0x2f, 0x35, 0xa8, 0x7d, 0x8d, 0xbb, 0xdd, 0x8b, 0x06, 0x49, + 0x34, 0x1c, 0xdc, 0xe1, 0x6d, 0x45, 0xe6, 0x96, 0xda, 0xf1, 0x54, 0x74, 0xbb, 0x5d, 0x91, 0x51, + 0x15, 0x87, 0x2f, 0xcd, 0x7f, 0x35, 0xd0, 0xb9, 0xf2, 0x5b, 0xc8, 0x92, 0xa4, 0x27, 0xe6, 0x4e, + 0xef, 0x89, 0xf9, 0x31, 0x3d, 0xb1, 0x30, 0xb6, 0x27, 0x16, 0x87, 0x7a, 0x62, 0x13, 0x0a, 0x34, + 0x44, 0x9e, 0xe8, 0xa2, 0xe3, 0x5a, 0x9a, 0x90, 0x48, 0xa3, 0x54, 0x1e, 0x9b, 0x4a, 0x57, 0xe1, + 0x9d, 0x13, 0x57, 0x97, 0x2f, 0x6b, 0xfe, 0xa6, 0xc1, 0x9c, 0x83, 0x28, 0xfe, 0x09, 0x6d, 0xb1, + 0x83, 0x0b, 0x7f, 0xaa, 0x05, 0x28, 0x3e, 0xc7, 0x3e, 0xdb, 0x55, 0x2f, 0x25, 0x37, 0x1c, 0x9d, + 0x5d, 0x84, 0x3b, 0xbb, 0xb2, 0xfa, 0x67, 0x1d, 0xb5, 0x33, 0x7f, 0x81, 0xcb, 0x6b, 0x5d, 0x42, + 0x51, 0xfb, 0xfe, 0xff, 0x11, 0x98, 0x7c, 0xce, 0xbc, 0x78, 0x05, 0xb9, 0x31, 0xbf, 0x82, 0xb9, + 0x2d, 0xb7, 0x4f, 0xcf, 0xdd, 0x3f, 0x37, 0x61, 0xde, 0x41, 0xb4, 0xdf, 0x3b, 0xb7, 0xa1, 0x0d, + 0xb8, 0xc2, 0x8b, 0x73, 0x0b, 0xfb, 0xe7, 0x49, 0x5e, 0xd3, 0x91, 0xfd, 0x40, 0x9a, 0x51, 0x25, + 0xfe, 0x25, 0x54, 0x55, 0xbb, 0x40, 0x71, 0x99, 0x2f, 0x4f, 0x2a, 0xf3, 0x76, 0xb0, 0x43, 0x9c, + 0x63, 0x15, 0xf3, 0x95, 0x06, 0x57, 0xd7, 0x92, 0x99, 0x7c, 0x5e, 0x8e, 0xb2, 0x0d, 0xf3, 0xa1, + 0x1b, 0xa1, 0x80, 0x6d, 0xa7, 0x78, 0x81, 0x7c, 0xbe, 0x16, 0xef, 0xff, 0x7f, 0x1d, 0x35, 0x56, + 0x52, 0x6c, 0x8b, 0x84, 0x28, 0x48, 0xd4, 0xa9, 0xdd, 0x21, 0xd7, 0x7d, 0xdc, 0x41, 0x94, 0x59, + 0xeb, 0xe2, 0x3f, 0x67, 0x4e, 0x1a, 0x5b, 0x3b, 0x95, 0x33, 0xe4, 0xa7, 0xe1, 0x0c, 0x8f, 0x61, + 0x71, 0xf8, 0x76, 0x09, 0x70, 0xb5, 0x63, 0x26, 0x78, 0x6a, 0x87, 0x1c, 0x21, 0x2f, 0x69, 0x05, + 0xf3, 0x67, 0x98, 0xff, 0x36, 0xf4, 0xdf, 0x02, 0xaf, 0x6b, 0x41, 0x35, 0x42, 0x94, 0xf4, 0x23, + 0x0f, 0x51, 0x81, 0xd5, 0xb8, 0x4b, 0x1d, 0x8b, 0x99, 0x2b, 0x70, 0xf9, 0x9e, 0x24, 0xc0, 0xb1, + 0xe7, 0x3a, 0x94, 0xe5, 0x24, 0x90, 0x57, 0xa9, 0x3a, 0xf1, 0x96, 0x27, 0x5f, 0x22, 0x9b, 0xcc, + 0x85, 0xb2, 0xe2, 0xcf, 0xea, 0xde, 0xf5, 0x53, 0xb8, 0xa4, 0x10, 0x70, 0x62, 0x41, 0x73, 0x07, + 0x6a, 0xdf, 0xbb, 0xf8, 0xe2, 0x67, 0x67, 0x04, 0x33, 0xd2, 0x8f, 0x8a, 0x75, 0x88, 0x87, 0x68, + 0x93, 0x79, 0x48, 0xee, 0x4d, 0x78, 0x48, 0xeb, 0xd5, 0x0c, 0x14, 0xc5, 0xe4, 0xd4, 0xf7, 0xa0, + 0x24, 0x39, 0xa6, 0x6e, 0x5b, 0x93, 0x7e, 0x31, 0x59, 0x23, 0x9c, 0xde, 0xf8, 0x74, 0x7a, 0x05, + 0x75, 0xb5, 0x1f, 0xa1, 0x28, 0xb8, 0xa0, 0xbe, 0x32, 0x59, 0x35, 0xcd, 0x4c, 0x8d, 0x8f, 0xa7, + 0x92, 0x55, 0x1e, 0x3a, 0x50, 0x92, 0x04, 0x2b, 0xeb, 0x3a, 0x23, 0x84, 0xd3, 0xf8, 0x64, 0x1a, + 0x85, 0xc4, 0xd1, 0x33, 0x98, 0x3d, 0xc1, 0xe4, 0xf4, 0xd6, 0x34, 0xea, 0x27, 0x07, 0xfa, 0x19, + 0x5d, 0x3e, 0x81, 0xfc, 0x26, 0x62, 0x7a, 0x73, 0xb2, 0xd2, 0x31, 0xdd, 0x33, 0x3e, 0x9a, 0x42, + 0x32, 0xc1, 0xad, 0xc0, 0x3b, 0xad, 0x6e, 0x4d, 0x56, 0x19, 0x66, 0x67, 0x86, 0x3d, 0xb5, 0xbc, + 0x72, 0xd4, 0x86, 0x02, 0x27, 0x5b, 0x7a, 0x46, 0x6c, 0x29, 0x42, 0x66, 0x2c, 0x8e, 0x24, 0xf7, + 0x06, 0xff, 0xb1, 0xae, 0x6f, 0x41, 0x81, 0x97, 0x92, 0x9e, 0x91, 0x87, 0xa3, 0x44, 0x6a, 0xac, + 0xc5, 0x87, 0x50, 0x4d, 0x38, 0x46, 0x16, 0x14, 0xc3, 0x64, 0x64, 0xac, 0xd1, 0xfb, 0x50, 0x56, + 0xec, 0x40, 0xcf, 0x78, 0xef, 0x93, 0x24, 0x62, 0x82, 0xc1, 0xa2, 0x98, 0xf6, 0x59, 0x11, 0x0e, + 0x53, 0x82, 0xb1, 0x06, 0x1f, 0x40, 0x49, 0x8e, 0xfd, 0xac, 0xa2, 0x19, 0x21, 0x07, 0x63, 0x4d, + 0x62, 0xa8, 0xc4, 0x93, 0x5b, 0xbf, 0x9e, 0x9d, 0x23, 0x29, 0xa2, 0x60, 0x58, 0xd3, 0x8a, 0xab, + 0x8c, 0x7a, 0x0e, 0x90, 0x9a, 0x97, 0x37, 0x33, 0x20, 0x3e, 0x6d, 0xf2, 0x1b, 0x9f, 0x9d, 0x4d, + 0x49, 0x39, 0x7e, 0x00, 0x25, 0x39, 0x10, 0xb3, 0x60, 0x1b, 0x19, 0x9b, 0x63, 0x61, 0xdb, 0x81, + 0xb2, 0x1a, 0x5d, 0x59, 0xb9, 0x72, 0x72, 0x1a, 0x1a, 0xd7, 0xa7, 0x94, 0x56, 0xa1, 0xff, 0x00, + 0x05, 0x3e, 0x73, 0xb2, 0xaa, 0x30, 0x35, 0xff, 0x8c, 0x95, 0x69, 0x44, 0xa5, 0xf9, 0xd5, 0xef, + 0x0e, 0x5f, 0x2f, 0x5d, 0xfa, 0xf3, 0xf5, 0xd2, 0xa5, 0x5f, 0x07, 0x4b, 0xda, 0xe1, 0x60, 0x49, + 0xfb, 0x63, 0xb0, 0xa4, 0xfd, 0x33, 0x58, 0xd2, 0x9e, 0xdc, 0x79, 0xb3, 0xbf, 0xec, 0xdd, 0x16, + 0x8b, 0xc7, 0xb9, 0xa7, 0x25, 0x01, 0xd8, 0xcd, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x85, 0xa2, + 0x4f, 0xd1, 0x22, 0x14, 0x00, 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.proto b/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.proto index eb373185..90793cba 100644 --- a/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.proto +++ b/vendor/github.com/containerd/containerd/api/services/tasks/v1/tasks.proto @@ -4,7 +4,7 @@ package containerd.services.tasks.v1; import "google/protobuf/empty.proto"; import "google/protobuf/any.proto"; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; import "github.com/containerd/containerd/api/types/mount.proto"; import "github.com/containerd/containerd/api/types/metrics.proto"; import "github.com/containerd/containerd/api/types/descriptor.proto"; diff --git a/vendor/github.com/containerd/containerd/api/services/version/v1/BUILD b/vendor/github.com/containerd/containerd/api/services/version/v1/BUILD new file mode 100644 index 00000000..ead01db5 --- /dev/null +++ b/vendor/github.com/containerd/containerd/api/services/version/v1/BUILD @@ -0,0 +1,29 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["version.pb.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/api/services/version/v1", + importpath = "github.com/containerd/containerd/api/services/version/v1", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/gogo/protobuf/types:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go b/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go index c403c843..3f6528a0 100644 --- a/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go +++ b/vendor/github.com/containerd/containerd/api/services/version/v1/version.pb.go @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/services/version/v1/version.proto -// DO NOT EDIT! /* Package version is a generated protocol buffer package. @@ -16,8 +15,9 @@ package version import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/empty" -import _ "github.com/gogo/protobuf/gogoproto" +import google_protobuf "github.com/gogo/protobuf/types" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import ( context "golang.org/x/net/context" @@ -155,24 +155,6 @@ func (m *VersionResponse) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Version(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Version(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintVersion(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -446,7 +428,7 @@ func init() { } var fileDescriptorVersion = []byte{ - // 241 bytes of a gzipped FileDescriptorProto + // 243 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x72, 0x4b, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0x41, 0x66, 0x26, 0x16, 0x64, 0xea, 0x17, 0xa7, 0x16, 0x95, 0x65, 0x26, 0xa7, 0x16, 0xeb, @@ -460,7 +442,7 @@ var fileDescriptorVersion = []byte{ 0x76, 0xa8, 0x41, 0x42, 0x41, 0x08, 0xa6, 0x98, 0x1e, 0xc4, 0x49, 0x7a, 0x30, 0x27, 0xe9, 0xb9, 0x82, 0x9c, 0x24, 0xa5, 0xaf, 0x87, 0xdf, 0x2b, 0x7a, 0x68, 0x8e, 0x72, 0x8a, 0x3a, 0xf1, 0x50, 0x8e, 0xe1, 0xc6, 0x43, 0x39, 0x86, 0x86, 0x47, 0x72, 0x8c, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, - 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0x63, 0x94, 0x03, 0xb9, 0x81, 0x6b, 0x0d, 0x65, 0x26, 0xb1, - 0x81, 0x1d, 0x67, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x37, 0xd8, 0xc6, 0xa7, 0x01, 0x00, - 0x00, + 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0x63, 0x94, 0x03, 0xb9, 0x81, 0x6b, 0x0d, 0x65, 0x46, 0x30, + 0x26, 0xb1, 0x81, 0x9d, 0x67, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x95, 0x0d, 0x52, 0x23, 0xa9, + 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/services/version/v1/version.proto b/vendor/github.com/containerd/containerd/api/services/version/v1/version.proto index 2398fdcb..0e4c3d1e 100644 --- a/vendor/github.com/containerd/containerd/api/services/version/v1/version.proto +++ b/vendor/github.com/containerd/containerd/api/services/version/v1/version.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package containerd.services.version.v1; import "google/protobuf/empty.proto"; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; // TODO(stevvooe): Should version service actually be versioned? option go_package = "github.com/containerd/containerd/api/services/version/v1;version"; diff --git a/vendor/github.com/containerd/containerd/api/types/BUILD b/vendor/github.com/containerd/containerd/api/types/BUILD new file mode 100644 index 00000000..db3ef0c3 --- /dev/null +++ b/vendor/github.com/containerd/containerd/api/types/BUILD @@ -0,0 +1,37 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "descriptor.pb.go", + "doc.go", + "metrics.pb.go", + "mount.pb.go", + "platform.pb.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/api/types", + importpath = "github.com/containerd/containerd/api/types", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/gogo/protobuf/types:go_default_library", + "//vendor/github.com/opencontainers/go-digest:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/containerd/containerd/api/types/task:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go b/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go index 785d0507..93e88c0d 100644 --- a/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/descriptor.pb.go @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/types/descriptor.proto -// DO NOT EDIT! /* Package types is a generated protocol buffer package. @@ -22,7 +21,8 @@ package types import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import _ "github.com/gogo/protobuf/gogoproto" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import github_com_opencontainers_go_digest "github.com/opencontainers/go-digest" @@ -95,24 +95,6 @@ func (m *Descriptor) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Descriptor(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Descriptor(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintDescriptor(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -409,7 +391,7 @@ func init() { } var fileDescriptorDescriptor = []byte{ - // 232 bytes of a gzipped FileDescriptorProto + // 234 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x4e, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0x41, 0x66, 0x26, 0x16, 0x64, 0xea, 0x97, 0x54, 0x16, 0xa4, 0x16, 0xeb, 0xa7, 0xa4, 0x16, @@ -423,6 +405,6 @@ var fileDescriptorDescriptor = []byte{ 0x4d, 0x10, 0x12, 0xe2, 0x62, 0x29, 0xce, 0xac, 0x4a, 0x95, 0x60, 0x56, 0x60, 0xd4, 0x60, 0x0e, 0x02, 0xb3, 0x9d, 0xbc, 0x4e, 0x3c, 0x94, 0x63, 0xb8, 0xf1, 0x50, 0x8e, 0xa1, 0xe1, 0x91, 0x1c, 0xe3, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x18, 0x65, 0x40, - 0x7c, 0x60, 0x58, 0x83, 0xc9, 0x24, 0x36, 0xb0, 0x07, 0x8d, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x23, 0x14, 0xc9, 0x7c, 0x47, 0x01, 0x00, 0x00, + 0x7c, 0x60, 0x58, 0x83, 0xc9, 0x08, 0x86, 0x24, 0x36, 0xb0, 0x17, 0x8d, 0x01, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xea, 0xac, 0x78, 0x9a, 0x49, 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/types/descriptor.proto b/vendor/github.com/containerd/containerd/api/types/descriptor.proto index 7975ab06..5c00dca4 100644 --- a/vendor/github.com/containerd/containerd/api/types/descriptor.proto +++ b/vendor/github.com/containerd/containerd/api/types/descriptor.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package containerd.types; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; option go_package = "github.com/containerd/containerd/api/types;types"; diff --git a/vendor/github.com/containerd/containerd/api/types/metrics.pb.go b/vendor/github.com/containerd/containerd/api/types/metrics.pb.go index f9aacf94..da046788 100644 --- a/vendor/github.com/containerd/containerd/api/types/metrics.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/metrics.pb.go @@ -1,13 +1,13 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/types/metrics.proto -// DO NOT EDIT! package types import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import _ "github.com/gogo/protobuf/gogoproto" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import google_protobuf1 "github.com/gogo/protobuf/types" import _ "github.com/gogo/protobuf/types" @@ -81,24 +81,6 @@ func (m *Metric) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Metrics(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Metrics(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintMetrics(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -409,7 +391,7 @@ func init() { } var fileDescriptorMetrics = []byte{ - // 256 bytes of a gzipped FileDescriptorProto + // 258 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x48, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0x41, 0x66, 0x26, 0x16, 0x64, 0xea, 0x97, 0x54, 0x16, 0xa4, 0x16, 0xeb, 0xe7, 0xa6, 0x96, @@ -424,6 +406,7 @@ var fileDescriptorMetrics = []byte{ 0x5d, 0x82, 0x98, 0x32, 0x53, 0x84, 0x34, 0xb8, 0x58, 0x52, 0x12, 0x4b, 0x12, 0x25, 0x98, 0xc1, 0xc6, 0x8a, 0x60, 0x18, 0xeb, 0x98, 0x57, 0x19, 0x04, 0x56, 0xe1, 0xe4, 0x75, 0xe2, 0xa1, 0x1c, 0xc3, 0x8d, 0x87, 0x72, 0x0c, 0x0d, 0x8f, 0xe4, 0x18, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, - 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x28, 0x03, 0xe2, 0x03, 0xd2, 0x1a, 0x4c, 0x26, 0xb1, 0x81, - 0xcd, 0x37, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x51, 0x36, 0x74, 0x83, 0x01, 0x00, 0x00, + 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x28, 0x03, 0xe2, 0x03, 0xd2, 0x1a, 0x4c, 0x46, 0x30, 0x24, + 0xb1, 0x81, 0x6d, 0x30, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0xde, 0x0d, 0x02, 0xfe, 0x85, 0x01, + 0x00, 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/types/metrics.proto b/vendor/github.com/containerd/containerd/api/types/metrics.proto index d1629c7e..0e631d2a 100644 --- a/vendor/github.com/containerd/containerd/api/types/metrics.proto +++ b/vendor/github.com/containerd/containerd/api/types/metrics.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package containerd.types; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; import "google/protobuf/timestamp.proto"; diff --git a/vendor/github.com/containerd/containerd/api/types/mount.pb.go b/vendor/github.com/containerd/containerd/api/types/mount.pb.go index cc835140..f7a9c3c1 100644 --- a/vendor/github.com/containerd/containerd/api/types/mount.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/mount.pb.go @@ -1,13 +1,13 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/types/mount.proto -// DO NOT EDIT! package types import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import _ "github.com/gogo/protobuf/gogoproto" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import strings "strings" import reflect "reflect" @@ -96,24 +96,6 @@ func (m *Mount) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Mount(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Mount(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintMount(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -457,7 +439,7 @@ func init() { } var fileDescriptorMount = []byte{ - // 200 bytes of a gzipped FileDescriptorProto + // 202 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x4b, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0x41, 0x66, 0x26, 0x16, 0x64, 0xea, 0x97, 0x54, 0x16, 0xa4, 0x16, 0xeb, 0xe7, 0xe6, 0x97, @@ -469,6 +451,6 @@ var fileDescriptorMount = []byte{ 0x82, 0x8b, 0x3d, 0xbf, 0xa0, 0x24, 0x33, 0x3f, 0xaf, 0x58, 0x82, 0x45, 0x81, 0x59, 0x83, 0x33, 0x08, 0xc6, 0x75, 0xf2, 0x3a, 0xf1, 0x50, 0x8e, 0xe1, 0xc6, 0x43, 0x39, 0x86, 0x86, 0x47, 0x72, 0x8c, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0x63, 0x94, 0x01, - 0xf1, 0x1e, 0xb4, 0x06, 0x93, 0x49, 0x6c, 0x60, 0x97, 0x1b, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, - 0xe5, 0xc7, 0x07, 0x3f, 0x1b, 0x01, 0x00, 0x00, + 0xf1, 0x1e, 0xb4, 0x06, 0x93, 0x11, 0x0c, 0x49, 0x6c, 0x60, 0xb7, 0x1b, 0x03, 0x02, 0x00, 0x00, + 0xff, 0xff, 0x82, 0x1c, 0x02, 0x18, 0x1d, 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/types/mount.proto b/vendor/github.com/containerd/containerd/api/types/mount.proto index 031e6544..cd80e44a 100644 --- a/vendor/github.com/containerd/containerd/api/types/mount.proto +++ b/vendor/github.com/containerd/containerd/api/types/mount.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package containerd.types; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; option go_package = "github.com/containerd/containerd/api/types;types"; diff --git a/vendor/github.com/containerd/containerd/api/types/platform.pb.go b/vendor/github.com/containerd/containerd/api/types/platform.pb.go index 0ca2afc2..ba9a3bf8 100644 --- a/vendor/github.com/containerd/containerd/api/types/platform.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/platform.pb.go @@ -1,13 +1,13 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/types/platform.proto -// DO NOT EDIT! package types import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import _ "github.com/gogo/protobuf/gogoproto" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import strings "strings" import reflect "reflect" @@ -70,24 +70,6 @@ func (m *Platform) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Platform(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Platform(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintPlatform(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -395,7 +377,7 @@ func init() { } var fileDescriptorPlatform = []byte{ - // 203 bytes of a gzipped FileDescriptorProto + // 205 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x4c, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcc, 0xcc, 0x4b, 0x2d, 0x4a, 0x41, 0x66, 0x26, 0x16, 0x64, 0xea, 0x97, 0x54, 0x16, 0xa4, 0x16, 0xeb, 0x17, 0xe4, 0x24, @@ -407,6 +389,6 @@ var fileDescriptorPlatform = []byte{ 0x40, 0x2a, 0x82, 0x50, 0xc4, 0x84, 0x24, 0xb8, 0xd8, 0xcb, 0x12, 0x8b, 0x32, 0x13, 0xf3, 0x4a, 0x24, 0x98, 0xc1, 0xd2, 0x30, 0xae, 0x93, 0xd7, 0x89, 0x87, 0x72, 0x0c, 0x37, 0x1e, 0xca, 0x31, 0x34, 0x3c, 0x92, 0x63, 0x3c, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, - 0x18, 0xa3, 0x0c, 0x88, 0xf7, 0x9e, 0x35, 0x98, 0x4c, 0x62, 0x03, 0x3b, 0xda, 0x18, 0x10, 0x00, - 0x00, 0xff, 0xff, 0x97, 0xa1, 0x99, 0x56, 0x19, 0x01, 0x00, 0x00, + 0x18, 0xa3, 0x0c, 0x88, 0xf7, 0x9e, 0x35, 0x98, 0x8c, 0x60, 0x48, 0x62, 0x03, 0x3b, 0xdb, 0x18, + 0x10, 0x00, 0x00, 0xff, 0xff, 0x05, 0xaa, 0xda, 0xa1, 0x1b, 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/types/platform.proto b/vendor/github.com/containerd/containerd/api/types/platform.proto index b1dce062..4cf9834b 100644 --- a/vendor/github.com/containerd/containerd/api/types/platform.proto +++ b/vendor/github.com/containerd/containerd/api/types/platform.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package containerd.types; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; option go_package = "github.com/containerd/containerd/api/types;types"; diff --git a/vendor/github.com/containerd/containerd/api/types/task/BUILD b/vendor/github.com/containerd/containerd/api/types/task/BUILD new file mode 100644 index 00000000..242dd5e0 --- /dev/null +++ b/vendor/github.com/containerd/containerd/api/types/task/BUILD @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["task.pb.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/api/types/task", + importpath = "github.com/containerd/containerd/api/types/task", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/gogo/protobuf/types:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/api/types/task/task.pb.go b/vendor/github.com/containerd/containerd/api/types/task/task.pb.go index ccc230ae..ba34270a 100644 --- a/vendor/github.com/containerd/containerd/api/types/task/task.pb.go +++ b/vendor/github.com/containerd/containerd/api/types/task/task.pb.go @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-gogo. +// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: github.com/containerd/containerd/api/types/task/task.proto -// DO NOT EDIT! /* Package task is a generated protocol buffer package. @@ -17,7 +16,8 @@ package task import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" -import _ "github.com/gogo/protobuf/gogoproto" + +// skipping weak import gogoproto "github.com/gogo/protobuf/gogoproto" import _ "github.com/gogo/protobuf/types" import google_protobuf2 "github.com/gogo/protobuf/types" @@ -224,24 +224,6 @@ func (m *ProcessInfo) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func encodeFixed64Task(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Task(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} func encodeVarintTask(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -869,39 +851,40 @@ func init() { } var fileDescriptorTask = []byte{ - // 543 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0xcf, 0x6e, 0xd3, 0x4c, - 0x14, 0xc5, 0x33, 0x6e, 0xe3, 0x24, 0xe3, 0xb6, 0x9f, 0x3f, 0x13, 0x55, 0xc6, 0x20, 0xdb, 0xea, - 0xca, 0x62, 0x61, 0x8b, 0x74, 0xc7, 0x2e, 0xff, 0x84, 0x2c, 0x24, 0x37, 0x72, 0x12, 0xb1, 0x8c, - 0x9c, 0x78, 0x62, 0x46, 0x6d, 0x66, 0x2c, 0x7b, 0x0c, 0x64, 0xc7, 0x12, 0x75, 0xc5, 0x0b, 0x74, - 0x05, 0x4f, 0xc1, 0x13, 0x64, 0xc9, 0x0a, 0xb1, 0x0a, 0xd4, 0x4f, 0x82, 0xc6, 0x76, 0xd2, 0x08, - 0xd8, 0x8c, 0xee, 0x3d, 0xbf, 0x33, 0x77, 0xee, 0x1c, 0xf8, 0x22, 0xc2, 0xec, 0x4d, 0x36, 0xb7, - 0x17, 0x74, 0xe5, 0x2c, 0x28, 0x61, 0x01, 0x26, 0x28, 0x09, 0x0f, 0xcb, 0x20, 0xc6, 0x0e, 0x5b, - 0xc7, 0x28, 0x75, 0x58, 0x90, 0x5e, 0x17, 0x87, 0x1d, 0x27, 0x94, 0x51, 0xe5, 0xd1, 0x83, 0xcb, - 0x7e, 0xfb, 0xdc, 0x2e, 0x4c, 0x5a, 0x3b, 0xa2, 0x11, 0x2d, 0xb8, 0xc3, 0xab, 0xd2, 0xaa, 0x19, - 0x11, 0xa5, 0xd1, 0x0d, 0x72, 0x8a, 0x6e, 0x9e, 0x2d, 0x1d, 0x86, 0x57, 0x28, 0x65, 0xc1, 0x2a, - 0xae, 0x0c, 0x8f, 0xff, 0x34, 0x04, 0x64, 0x5d, 0xa2, 0x8b, 0x5c, 0x80, 0x8d, 0x51, 0x42, 0x17, - 0x28, 0x4d, 0x95, 0x0e, 0x3c, 0xd9, 0x3f, 0x3a, 0xc3, 0xa1, 0x0a, 0x4c, 0x60, 0xb5, 0x7a, 0xff, - 0xe5, 0x5b, 0x43, 0xea, 0xef, 0x74, 0x77, 0xe0, 0x4b, 0x7b, 0x93, 0x1b, 0x2a, 0xe7, 0x50, 0xc0, - 0xa1, 0x2a, 0x14, 0x4e, 0x31, 0xdf, 0x1a, 0x82, 0x3b, 0xf0, 0x05, 0x1c, 0x2a, 0x32, 0x3c, 0x8a, - 0x71, 0xa8, 0x1e, 0x99, 0xc0, 0x3a, 0xf5, 0x79, 0xa9, 0x5c, 0x42, 0x31, 0x65, 0x01, 0xcb, 0x52, - 0xf5, 0xd8, 0x04, 0xd6, 0x59, 0xe7, 0x89, 0xfd, 0x8f, 0x1f, 0xda, 0xe3, 0xc2, 0xe2, 0x57, 0x56, - 0xa5, 0x0d, 0xeb, 0x29, 0x0b, 0x31, 0x51, 0xeb, 0xfc, 0x05, 0xbf, 0x6c, 0x94, 0x73, 0x3e, 0x2a, - 0xa4, 0x19, 0x53, 0xc5, 0x42, 0xae, 0xba, 0x4a, 0x47, 0x49, 0xa2, 0x36, 0xf6, 0x3a, 0x4a, 0x12, - 0x45, 0x83, 0x4d, 0x86, 0x92, 0x15, 0x26, 0xc1, 0x8d, 0xda, 0x34, 0x81, 0xd5, 0xf4, 0xf7, 0xbd, - 0x62, 0x40, 0x09, 0xbd, 0xc7, 0x6c, 0x56, 0xed, 0xd6, 0x2a, 0x16, 0x86, 0x5c, 0x2a, 0x57, 0x51, - 0xba, 0xb0, 0xc5, 0x3b, 0x14, 0xce, 0x02, 0xa6, 0x42, 0x13, 0x58, 0x52, 0x47, 0xb3, 0xcb, 0x40, - 0xed, 0x5d, 0xa0, 0xf6, 0x64, 0x97, 0x78, 0xaf, 0xb9, 0xd9, 0x1a, 0xb5, 0x4f, 0x3f, 0x0d, 0xe0, - 0x37, 0xcb, 0x6b, 0x5d, 0x76, 0xe1, 0x42, 0xa9, 0xca, 0xd8, 0x25, 0x4b, 0xba, 0xcb, 0x06, 0x3c, - 0x64, 0x63, 0xc1, 0x63, 0x4c, 0x96, 0xb4, 0xc8, 0x51, 0xea, 0xb4, 0xff, 0x1a, 0xdf, 0x25, 0x6b, - 0xbf, 0x70, 0x3c, 0xfb, 0x0e, 0xa0, 0x58, 0x2d, 0xa6, 0xc3, 0xc6, 0xd4, 0x7b, 0xe5, 0x5d, 0xbd, - 0xf6, 0xe4, 0x9a, 0xf6, 0xff, 0xed, 0x9d, 0x79, 0x5a, 0x82, 0x29, 0xb9, 0x26, 0xf4, 0x1d, 0xe1, - 0xbc, 0xef, 0x0f, 0xbb, 0x93, 0xe1, 0x40, 0x06, 0x87, 0xbc, 0x9f, 0xa0, 0x80, 0xa1, 0x90, 0x73, - 0x7f, 0xea, 0x79, 0xae, 0xf7, 0x52, 0x16, 0x0e, 0xb9, 0x9f, 0x11, 0x82, 0x49, 0xc4, 0xf9, 0x78, - 0x72, 0x35, 0x1a, 0x0d, 0x07, 0xf2, 0xd1, 0x21, 0x1f, 0x33, 0x1a, 0xc7, 0x28, 0x54, 0x9e, 0x42, - 0x71, 0xd4, 0x9d, 0x8e, 0x87, 0x03, 0xf9, 0x58, 0x93, 0x6f, 0xef, 0xcc, 0x93, 0x12, 0x8f, 0x82, - 0x2c, 0x2d, 0xa7, 0x73, 0xca, 0xa7, 0xd7, 0x0f, 0x6f, 0x73, 0x8c, 0x49, 0xa4, 0x9d, 0x7d, 0xfc, - 0xac, 0xd7, 0xbe, 0x7e, 0xd1, 0xab, 0xdf, 0xf4, 0xd4, 0xcd, 0xbd, 0x5e, 0xfb, 0x71, 0xaf, 0xd7, - 0x3e, 0xe4, 0x3a, 0xd8, 0xe4, 0x3a, 0xf8, 0x96, 0xeb, 0xe0, 0x57, 0xae, 0x83, 0xb9, 0x58, 0xc4, - 0x70, 0xf9, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x19, 0xf7, 0x5b, 0x8f, 0x4e, 0x03, 0x00, 0x00, + // 545 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x3f, 0x6f, 0xd3, 0x40, + 0x18, 0xc6, 0x7d, 0x6e, 0xeb, 0xa6, 0xe7, 0xb6, 0x18, 0x13, 0x55, 0xc6, 0x20, 0xdb, 0xea, 0x64, + 0x31, 0xd8, 0x22, 0xdd, 0xd8, 0xf2, 0x4f, 0xc8, 0x42, 0x72, 0x23, 0x27, 0x11, 0x6c, 0x91, 0x13, + 0x5f, 0xcc, 0xa9, 0xcd, 0x9d, 0x65, 0x9f, 0x81, 0x6c, 0x8c, 0xa8, 0x13, 0x5f, 0xa0, 0x13, 0x7c, + 0x0a, 0x3e, 0x41, 0x46, 0x26, 0xc4, 0x14, 0xa8, 0x3f, 0x09, 0x3a, 0xdb, 0x49, 0x23, 0x60, 0x39, + 0xbd, 0xef, 0xf3, 0x7b, 0xee, 0xbd, 0xf7, 0x1e, 0xf8, 0x22, 0xc6, 0xec, 0x6d, 0x3e, 0x75, 0x66, + 0x74, 0xe1, 0xce, 0x28, 0x61, 0x21, 0x26, 0x28, 0x8d, 0x76, 0xcb, 0x30, 0xc1, 0x2e, 0x5b, 0x26, + 0x28, 0x73, 0x59, 0x98, 0x5d, 0x95, 0x87, 0x93, 0xa4, 0x94, 0x51, 0xf5, 0xd1, 0xbd, 0xcb, 0x79, + 0xf7, 0xdc, 0x29, 0x4d, 0x7a, 0x33, 0xa6, 0x31, 0x2d, 0xb9, 0xcb, 0xab, 0xca, 0xaa, 0x9b, 0x31, + 0xa5, 0xf1, 0x35, 0x72, 0xcb, 0x6e, 0x9a, 0xcf, 0x5d, 0x86, 0x17, 0x28, 0x63, 0xe1, 0x22, 0xa9, + 0x0d, 0x8f, 0xff, 0x36, 0x84, 0x64, 0x59, 0xa1, 0xf3, 0x42, 0x84, 0x87, 0x83, 0x94, 0xce, 0x50, + 0x96, 0xa9, 0x2d, 0x78, 0xbc, 0x7d, 0x74, 0x82, 0x23, 0x0d, 0x58, 0xc0, 0x3e, 0xea, 0x3c, 0x28, + 0xd6, 0xa6, 0xdc, 0xdd, 0xe8, 0x5e, 0x2f, 0x90, 0xb7, 0x26, 0x2f, 0x52, 0xcf, 0xa0, 0x88, 0x23, + 0x4d, 0x2c, 0x9d, 0x52, 0xb1, 0x36, 0x45, 0xaf, 0x17, 0x88, 0x38, 0x52, 0x15, 0xb8, 0x97, 0xe0, + 0x48, 0xdb, 0xb3, 0x80, 0x7d, 0x12, 0xf0, 0x52, 0xbd, 0x80, 0x52, 0xc6, 0x42, 0x96, 0x67, 0xda, + 0xbe, 0x05, 0xec, 0xd3, 0xd6, 0x13, 0xe7, 0x3f, 0x3f, 0x74, 0x86, 0xa5, 0x25, 0xa8, 0xad, 0x6a, + 0x13, 0x1e, 0x64, 0x2c, 0xc2, 0x44, 0x3b, 0xe0, 0x2f, 0x04, 0x55, 0xa3, 0x9e, 0xf1, 0x51, 0x11, + 0xcd, 0x99, 0x26, 0x95, 0x72, 0xdd, 0xd5, 0x3a, 0x4a, 0x53, 0xed, 0x70, 0xab, 0xa3, 0x34, 0x55, + 0x75, 0xd8, 0x60, 0x28, 0x5d, 0x60, 0x12, 0x5e, 0x6b, 0x0d, 0x0b, 0xd8, 0x8d, 0x60, 0xdb, 0xab, + 0x26, 0x94, 0xd1, 0x07, 0xcc, 0x26, 0xf5, 0x6e, 0x47, 0xe5, 0xc2, 0x90, 0x4b, 0xd5, 0x2a, 0x6a, + 0x1b, 0x1e, 0xf1, 0x0e, 0x45, 0x93, 0x90, 0x69, 0xd0, 0x02, 0xb6, 0xdc, 0xd2, 0x9d, 0x2a, 0x50, + 0x67, 0x13, 0xa8, 0x33, 0xda, 0x24, 0xde, 0x69, 0xac, 0xd6, 0xa6, 0xf0, 0xf9, 0x97, 0x09, 0x82, + 0x46, 0x75, 0xad, 0xcd, 0xce, 0x3d, 0x28, 0xd7, 0x19, 0x7b, 0x64, 0x4e, 0x37, 0xd9, 0x80, 0xfb, + 0x6c, 0x6c, 0xb8, 0x8f, 0xc9, 0x9c, 0x96, 0x39, 0xca, 0xad, 0xe6, 0x3f, 0xe3, 0xdb, 0x64, 0x19, + 0x94, 0x8e, 0x67, 0x3f, 0x00, 0x94, 0xea, 0xc5, 0x0c, 0x78, 0x38, 0xf6, 0x5f, 0xf9, 0x97, 0xaf, + 0x7d, 0x45, 0xd0, 0x1f, 0xde, 0xdc, 0x5a, 0x27, 0x15, 0x18, 0x93, 0x2b, 0x42, 0xdf, 0x13, 0xce, + 0xbb, 0x41, 0xbf, 0x3d, 0xea, 0xf7, 0x14, 0xb0, 0xcb, 0xbb, 0x29, 0x0a, 0x19, 0x8a, 0x38, 0x0f, + 0xc6, 0xbe, 0xef, 0xf9, 0x2f, 0x15, 0x71, 0x97, 0x07, 0x39, 0x21, 0x98, 0xc4, 0x9c, 0x0f, 0x47, + 0x97, 0x83, 0x41, 0xbf, 0xa7, 0xec, 0xed, 0xf2, 0x21, 0xa3, 0x49, 0x82, 0x22, 0xf5, 0x29, 0x94, + 0x06, 0xed, 0xf1, 0xb0, 0xdf, 0x53, 0xf6, 0x75, 0xe5, 0xe6, 0xd6, 0x3a, 0xae, 0xf0, 0x20, 0xcc, + 0xb3, 0x6a, 0x3a, 0xa7, 0x7c, 0xfa, 0xc1, 0xee, 0x6d, 0x8e, 0x31, 0x89, 0xf5, 0xd3, 0x4f, 0x5f, + 0x0c, 0xe1, 0xdb, 0x57, 0xa3, 0xfe, 0x4d, 0x47, 0x5b, 0xdd, 0x19, 0xc2, 0xcf, 0x3b, 0x43, 0xf8, + 0x58, 0x18, 0x60, 0x55, 0x18, 0xe0, 0x7b, 0x61, 0x80, 0xdf, 0x85, 0x01, 0xde, 0x08, 0x53, 0xa9, + 0x0c, 0xe2, 0xe2, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x32, 0xd2, 0x86, 0x50, 0x03, 0x00, + 0x00, } diff --git a/vendor/github.com/containerd/containerd/api/types/task/task.proto b/vendor/github.com/containerd/containerd/api/types/task/task.proto index 5845edf2..da91cb03 100644 --- a/vendor/github.com/containerd/containerd/api/types/task/task.proto +++ b/vendor/github.com/containerd/containerd/api/types/task/task.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package containerd.v1.types; -import "gogoproto/gogo.proto"; +import weak "gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/any.proto"; diff --git a/vendor/github.com/containerd/containerd/containers/BUILD b/vendor/github.com/containerd/containerd/containers/BUILD new file mode 100644 index 00000000..6ddc8f62 --- /dev/null +++ b/vendor/github.com/containerd/containerd/containers/BUILD @@ -0,0 +1,24 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["containers.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/containers", + importpath = "github.com/containerd/containerd/containers", + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/gogo/protobuf/types:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/dialer/BUILD b/vendor/github.com/containerd/containerd/dialer/BUILD new file mode 100644 index 00000000..d80ac24e --- /dev/null +++ b/vendor/github.com/containerd/containerd/dialer/BUILD @@ -0,0 +1,35 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "dialer.go", + "dialer_unix.go", + "dialer_windows.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/dialer", + importpath = "github.com/containerd/containerd/dialer", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/pkg/errors:go_default_library", + ] + select({ + "@io_bazel_rules_go//go/platform:windows": [ + "//vendor/github.com/Microsoft/go-winio:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/dialer/dialer.go b/vendor/github.com/containerd/containerd/dialer/dialer.go index 65af69f9..1ad4ab71 100644 --- a/vendor/github.com/containerd/containerd/dialer/dialer.go +++ b/vendor/github.com/containerd/containerd/dialer/dialer.go @@ -42,7 +42,7 @@ func Dialer(address string, timeout time.Duration) (net.Conn, error) { close(stopC) go func() { dr := <-synC - if dr != nil { + if dr != nil && dr.c != nil { dr.c.Close() } }() diff --git a/vendor/github.com/containerd/containerd/errdefs/BUILD b/vendor/github.com/containerd/containerd/errdefs/BUILD new file mode 100644 index 00000000..66bdd1c1 --- /dev/null +++ b/vendor/github.com/containerd/containerd/errdefs/BUILD @@ -0,0 +1,31 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "errors.go", + "grpc.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/errdefs", + importpath = "github.com/containerd/containerd/errdefs", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/google.golang.org/grpc/codes:go_default_library", + "//vendor/google.golang.org/grpc/status:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/containerd/containerd/errdefs/grpc.go b/vendor/github.com/containerd/containerd/errdefs/grpc.go index 2aa2e11b..6a3bbcaa 100644 --- a/vendor/github.com/containerd/containerd/errdefs/grpc.go +++ b/vendor/github.com/containerd/containerd/errdefs/grpc.go @@ -4,7 +4,6 @@ import ( "strings" "github.com/pkg/errors" - "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -61,7 +60,7 @@ func FromGRPC(err error) error { var cls error // divide these into error classes, becomes the cause - switch grpc.Code(err) { + switch code(err) { case codes.InvalidArgument: cls = ErrInvalidArgument case codes.AlreadyExists: @@ -94,7 +93,7 @@ func FromGRPC(err error) error { // Effectively, we just remove the string of cls from the end of err if it // appears there. func rebaseMessage(cls error, err error) string { - desc := grpc.ErrorDesc(err) + desc := errDesc(err) clss := cls.Error() if desc == clss { return "" @@ -107,3 +106,17 @@ func isGRPCError(err error) bool { _, ok := status.FromError(err) return ok } + +func code(err error) codes.Code { + if s, ok := status.FromError(err); ok { + return s.Code() + } + return codes.Unknown +} + +func errDesc(err error) string { + if s, ok := status.FromError(err); ok { + return s.Message() + } + return err.Error() +} diff --git a/vendor/github.com/containerd/containerd/namespaces/BUILD b/vendor/github.com/containerd/containerd/namespaces/BUILD new file mode 100644 index 00000000..0f1592ad --- /dev/null +++ b/vendor/github.com/containerd/containerd/namespaces/BUILD @@ -0,0 +1,34 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "context.go", + "grpc.go", + "store.go", + "validate.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/containerd/containerd/namespaces", + importpath = "github.com/containerd/containerd/namespaces", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/containerd/containerd/errdefs:go_default_library", + "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc/metadata:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/cyphar/filepath-securejoin/BUILD b/vendor/github.com/cyphar/filepath-securejoin/BUILD new file mode 100644 index 00000000..4268cd5c --- /dev/null +++ b/vendor/github.com/cyphar/filepath-securejoin/BUILD @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "join.go", + "vfs.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/cyphar/filepath-securejoin", + importpath = "github.com/cyphar/filepath-securejoin", + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/pkg/errors:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/cyphar/filepath-securejoin/LICENSE b/vendor/github.com/cyphar/filepath-securejoin/LICENSE new file mode 100644 index 00000000..bec842f2 --- /dev/null +++ b/vendor/github.com/cyphar/filepath-securejoin/LICENSE @@ -0,0 +1,28 @@ +Copyright (C) 2014-2015 Docker Inc & Go Authors. All rights reserved. +Copyright (C) 2017 SUSE LLC. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/cyphar/filepath-securejoin/README.md b/vendor/github.com/cyphar/filepath-securejoin/README.md new file mode 100644 index 00000000..49b2baa9 --- /dev/null +++ b/vendor/github.com/cyphar/filepath-securejoin/README.md @@ -0,0 +1,65 @@ +## `filepath-securejoin` ## + +[![Build Status](https://travis-ci.org/cyphar/filepath-securejoin.svg?branch=master)](https://travis-ci.org/cyphar/filepath-securejoin) + +An implementation of `SecureJoin`, a [candidate for inclusion in the Go +standard library][go#20126]. The purpose of this function is to be a "secure" +alternative to `filepath.Join`, and in particular it provides certain +guarantees that are not provided by `filepath.Join`. + +This is the function prototype: + +```go +func SecureJoin(root, unsafePath string) (string, error) +``` + +This library **guarantees** the following: + +* If no error is set, the resulting string **must** be a child path of + `SecureJoin` and will not contain any symlink path components (they will all + be expanded). + +* When expanding symlinks, all symlink path components **must** be resolved + relative to the provided root. In particular, this can be considered a + userspace implementation of how `chroot(2)` operates on file paths. Note that + these symlinks will **not** be expanded lexically (`filepath.Clean` is not + called on the input before processing). + +* Non-existant path components are unaffected by `SecureJoin` (similar to + `filepath.EvalSymlinks`'s semantics). + +* The returned path will always be `filepath.Clean`ed and thus not contain any + `..` components. + +A (trivial) implementation of this function on GNU/Linux systems could be done +with the following (note that this requires root privileges and is far more +opaque than the implementation in this library, and also requires that +`readlink` is inside the `root` path): + +```go +package securejoin + +import ( + "os/exec" + "path/filepath" +) + +func SecureJoin(root, unsafePath string) (string, error) { + unsafePath = string(filepath.Separator) + unsafePath + cmd := exec.Command("chroot", root, + "readlink", "--canonicalize-missing", "--no-newline", unsafePath) + output, err := cmd.CombinedOutput() + if err != nil { + return "", err + } + expanded := string(output) + return filepath.Join(root, expanded), nil +} +``` + +[go#20126]: https://github.com/golang/go/issues/20126 + +### License ### + +The license of this project is the same as Go, which is a BSD 3-clause license +available in the `LICENSE` file. diff --git a/vendor/github.com/cyphar/filepath-securejoin/VERSION b/vendor/github.com/cyphar/filepath-securejoin/VERSION new file mode 100644 index 00000000..1f5f8304 --- /dev/null +++ b/vendor/github.com/cyphar/filepath-securejoin/VERSION @@ -0,0 +1 @@ +0.2.1+dev diff --git a/vendor/github.com/cyphar/filepath-securejoin/join.go b/vendor/github.com/cyphar/filepath-securejoin/join.go new file mode 100644 index 00000000..f2098547 --- /dev/null +++ b/vendor/github.com/cyphar/filepath-securejoin/join.go @@ -0,0 +1,135 @@ +// Copyright (C) 2014-2015 Docker Inc & Go Authors. All rights reserved. +// Copyright (C) 2017 SUSE LLC. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package securejoin is an implementation of the hopefully-soon-to-be-included +// SecureJoin helper that is meant to be part of the "path/filepath" package. +// The purpose of this project is to provide a PoC implementation to make the +// SecureJoin proposal (https://github.com/golang/go/issues/20126) more +// tangible. +package securejoin + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "strings" + "syscall" + + "github.com/pkg/errors" +) + +// ErrSymlinkLoop is returned by SecureJoinVFS when too many symlinks have been +// evaluated in attempting to securely join the two given paths. +var ErrSymlinkLoop = fmt.Errorf("SecureJoin: too many links") + +// IsNotExist tells you if err is an error that implies that either the path +// accessed does not exist (or path components don't exist). This is +// effectively a more broad version of os.IsNotExist. +func IsNotExist(err error) bool { + // If it's a bone-fide ENOENT just bail. + if os.IsNotExist(errors.Cause(err)) { + return true + } + + // Check that it's not actually an ENOTDIR, which in some cases is a more + // convoluted case of ENOENT (usually involving weird paths). + var errno error + switch err := errors.Cause(err).(type) { + case *os.PathError: + errno = err.Err + case *os.LinkError: + errno = err.Err + case *os.SyscallError: + errno = err.Err + } + return errno == syscall.ENOTDIR || errno == syscall.ENOENT +} + +// SecureJoinVFS joins the two given path components (similar to Join) except +// that the returned path is guaranteed to be scoped inside the provided root +// path (when evaluated). Any symbolic links in the path are evaluated with the +// given root treated as the root of the filesystem, similar to a chroot. The +// filesystem state is evaluated through the given VFS interface (if nil, the +// standard os.* family of functions are used). +// +// Note that the guarantees provided by this function only apply if the path +// components in the returned string are not modified (in other words are not +// replaced with symlinks on the filesystem) after this function has returned. +// Such a symlink race is necessarily out-of-scope of SecureJoin. +func SecureJoinVFS(root, unsafePath string, vfs VFS) (string, error) { + // Use the os.* VFS implementation if none was specified. + if vfs == nil { + vfs = osVFS{} + } + + var path bytes.Buffer + n := 0 + for unsafePath != "" { + if n > 255 { + return "", ErrSymlinkLoop + } + + // Next path component, p. + i := strings.IndexRune(unsafePath, filepath.Separator) + var p string + if i == -1 { + p, unsafePath = unsafePath, "" + } else { + p, unsafePath = unsafePath[:i], unsafePath[i+1:] + } + + // Create a cleaned path, using the lexical semantics of /../a, to + // create a "scoped" path component which can safely be joined to fullP + // for evaluation. At this point, path.String() doesn't contain any + // symlink components. + cleanP := filepath.Clean(string(filepath.Separator) + path.String() + p) + if cleanP == string(filepath.Separator) { + path.Reset() + continue + } + fullP := filepath.Clean(root + cleanP) + + // Figure out whether the path is a symlink. + fi, err := vfs.Lstat(fullP) + if err != nil && !IsNotExist(err) { + return "", err + } + // Treat non-existent path components the same as non-symlinks (we + // can't do any better here). + if IsNotExist(err) || fi.Mode()&os.ModeSymlink == 0 { + path.WriteString(p) + path.WriteRune(filepath.Separator) + continue + } + + // Only increment when we actually dereference a link. + n++ + + // It's a symlink, expand it by prepending it to the yet-unparsed path. + dest, err := vfs.Readlink(fullP) + if err != nil { + return "", err + } + // Absolute symlinks reset any work we've already done. + if filepath.IsAbs(dest) { + path.Reset() + } + unsafePath = dest + string(filepath.Separator) + unsafePath + } + + // We have to clean path.String() here because it may contain '..' + // components that are entirely lexical, but would be misleading otherwise. + // And finally do a final clean to ensure that root is also lexically + // clean. + fullP := filepath.Clean(string(filepath.Separator) + path.String()) + return filepath.Clean(root + fullP), nil +} + +// SecureJoin is a wrapper around SecureJoinVFS that just uses the os.* library +// of functions as the VFS. If in doubt, use this function over SecureJoinVFS. +func SecureJoin(root, unsafePath string) (string, error) { + return SecureJoinVFS(root, unsafePath, nil) +} diff --git a/vendor/github.com/cyphar/filepath-securejoin/vendor.conf b/vendor/github.com/cyphar/filepath-securejoin/vendor.conf new file mode 100644 index 00000000..66bb574b --- /dev/null +++ b/vendor/github.com/cyphar/filepath-securejoin/vendor.conf @@ -0,0 +1 @@ +github.com/pkg/errors v0.8.0 diff --git a/vendor/github.com/cyphar/filepath-securejoin/vfs.go b/vendor/github.com/cyphar/filepath-securejoin/vfs.go new file mode 100644 index 00000000..a82a5eae --- /dev/null +++ b/vendor/github.com/cyphar/filepath-securejoin/vfs.go @@ -0,0 +1,41 @@ +// Copyright (C) 2017 SUSE LLC. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package securejoin + +import "os" + +// In future this should be moved into a separate package, because now there +// are several projects (umoci and go-mtree) that are using this sort of +// interface. + +// VFS is the minimal interface necessary to use SecureJoinVFS. A nil VFS is +// equivalent to using the standard os.* family of functions. This is mainly +// used for the purposes of mock testing, but also can be used to otherwise use +// SecureJoin with VFS-like system. +type VFS interface { + // Lstat returns a FileInfo describing the named file. If the file is a + // symbolic link, the returned FileInfo describes the symbolic link. Lstat + // makes no attempt to follow the link. These semantics are identical to + // os.Lstat. + Lstat(name string) (os.FileInfo, error) + + // Readlink returns the destination of the named symbolic link. These + // semantics are identical to os.Readlink. + Readlink(name string) (string, error) +} + +// osVFS is the "nil" VFS, in that it just passes everything through to the os +// module. +type osVFS struct{} + +// Lstat returns a FileInfo describing the named file. If the file is a +// symbolic link, the returned FileInfo describes the symbolic link. Lstat +// makes no attempt to follow the link. These semantics are identical to +// os.Lstat. +func (o osVFS) Lstat(name string) (os.FileInfo, error) { return os.Lstat(name) } + +// Readlink returns the destination of the named symbolic link. These +// semantics are identical to os.Readlink. +func (o osVFS) Readlink(name string) (string, error) { return os.Readlink(name) } diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS new file mode 100644 index 00000000..46102d74 --- /dev/null +++ b/vendor/github.com/docker/docker/AUTHORS @@ -0,0 +1,1984 @@ +# This file lists all individuals having contributed content to the repository. +# For how it is generated, see `hack/generate-authors.sh`. + +Aanand Prasad +Aaron Davidson +Aaron Feng +Aaron Huslage +Aaron L. Xu +Aaron Lehmann +Aaron Welch +Aaron.L.Xu +Abel Muiño +Abhijeet Kasurde +Abhinandan Prativadi +Abhinav Ajgaonkar +Abhishek Chanda +Abhishek Sharma +Abin Shahab +Adam Avilla +Adam Eijdenberg +Adam Kunk +Adam Miller +Adam Mills +Adam Pointer +Adam Singer +Adam Walz +Addam Hardy +Aditi Rajagopal +Aditya +Adnan Khan +Adolfo Ochagavía +Adria Casas +Adrian Moisey +Adrian Mouat +Adrian Oprea +Adrien Folie +Adrien Gallouët +Ahmed Kamal +Ahmet Alp Balkan +Aidan Feldman +Aidan Hobson Sayers +AJ Bowen +Ajey Charantimath +ajneu +Akash Gupta +Akihiro Matsushima +Akihiro Suda +Akim Demaille +Akira Koyasu +Akshay Karle +Al Tobey +alambike +Alan Scherger +Alan Thompson +Albert Callarisa +Albert Zhang +Alejandro González Hevia +Aleksa Sarai +Aleksandrs Fadins +Alena Prokharchyk +Alessandro Boch +Alessio Biancalana +Alex Chan +Alex Chen +Alex Coventry +Alex Crawford +Alex Ellis +Alex Gaynor +Alex Goodman +Alex Olshansky +Alex Samorukov +Alex Warhawk +Alexander Artemenko +Alexander Boyd +Alexander Larsson +Alexander Midlash +Alexander Morozov +Alexander Shopov +Alexandre Beslic +Alexandre Garnier +Alexandre González +Alexandre Jomin +Alexandru Sfirlogea +Alexey Guskov +Alexey Kotlyarov +Alexey Shamrin +Alexis THOMAS +Alfred Landrum +Ali Dehghani +Alicia Lauerman +Alihan Demir +Allen Madsen +Allen Sun +almoehi +Alvaro Saurin +Alvin Deng +Alvin Richards +amangoel +Amen Belayneh +Amir Goldstein +Amit Bakshi +Amit Krishnan +Amit Shukla +Amr Gawish +Amy Lindburg +Anand Patil +AnandkumarPatel +Anatoly Borodin +Anchal Agrawal +Anda Xu +Anders Janmyr +Andre Dublin <81dublin@gmail.com> +Andre Granovsky +Andrea Luzzardi +Andrea Turli +Andreas Elvers +Andreas Köhler +Andreas Savvides +Andreas Tiefenthaler +Andrei Gherzan +Andrew C. Bodine +Andrew Clay Shafer +Andrew Duckworth +Andrew France +Andrew Gerrand +Andrew Guenther +Andrew He +Andrew Hsu +Andrew Kuklewicz +Andrew Macgregor +Andrew Macpherson +Andrew Martin +Andrew McDonnell +Andrew Munsell +Andrew Pennebaker +Andrew Po +Andrew Weiss +Andrew Williams +Andrews Medina +Andrey Petrov +Andrey Stolbovsky +André Martins +andy +Andy Chambers +andy diller +Andy Goldstein +Andy Kipp +Andy Rothfusz +Andy Smith +Andy Wilson +Anes Hasicic +Anil Belur +Anil Madhavapeddy +Ankush Agarwal +Anonmily +Anran Qiao +Anshul Pundir +Anthon van der Neut +Anthony Baire +Anthony Bishopric +Anthony Dahanne +Anthony Sottile +Anton Löfgren +Anton Nikitin +Anton Polonskiy +Anton Tiurin +Antonio Murdaca +Antonis Kalipetis +Antony Messerli +Anuj Bahuguna +Anusha Ragunathan +apocas +Arash Deshmeh +ArikaChen +Arnaud Lefebvre +Arnaud Porterie +Arthur Barr +Arthur Gautier +Artur Meyster +Arun Gupta +Asad Saeeduddin +Asbjørn Enge +averagehuman +Avi Das +Avi Miller +Avi Vaid +ayoshitake +Azat Khuyiyakhmetov +Bardia Keyoumarsi +Barnaby Gray +Barry Allard +Bartłomiej Piotrowski +Bastiaan Bakker +bdevloed +Ben Bonnefoy +Ben Firshman +Ben Golub +Ben Hall +Ben Sargent +Ben Severson +Ben Toews +Ben Wiklund +Benjamin Atkin +Benjamin Boudreau +Benjamin Yolken +Benoit Chesneau +Bernerd Schaefer +Bernhard M. Wiedemann +Bert Goethals +Bharath Thiruveedula +Bhiraj Butala +Bhumika Bayani +Bilal Amarni +Bill Wang +Bin Liu +Bingshen Wang +Blake Geno +Boaz Shuster +bobby abbott +Boris Pruessmann +Boshi Lian +Bouke Haarsma +Boyd Hemphill +boynux +Bradley Cicenas +Bradley Wright +Brandon Liu +Brandon Philips +Brandon Rhodes +Brendan Dixon +Brent Salisbury +Brett Higgins +Brett Kochendorfer +Brett Randall +Brian (bex) Exelbierd +Brian Bland +Brian DeHamer +Brian Dorsey +Brian Flad +Brian Goff +Brian McCallister +Brian Olsen +Brian Schwind +Brian Shumate +Brian Torres-Gil +Brian Trump +Brice Jaglin +Briehan Lombaard +Bruno Bigras +Bruno Binet +Bruno Gazzera +Bruno Renié +Bruno Tavares +Bryan Bess +Bryan Boreham +Bryan Matsuo +Bryan Murphy +Burke Libbey +Byung Kang +Caleb Spare +Calen Pennington +Cameron Boehmer +Cameron Spear +Campbell Allen +Candid Dauth +Cao Weiwei +Carl Henrik Lunde +Carl Loa Odin +Carl X. Su +Carlo Mion +Carlos Alexandro Becker +Carlos Sanchez +Carol Fager-Higgins +Cary +Casey Bisson +Catalin Pirvu +Ce Gao +Cedric Davies +Cezar Sa Espinola +Chad Swenson +Chance Zibolski +Chander Govindarajan +Chanhun Jeong +Chao Wang +Charles Chan +Charles Hooper +Charles Law +Charles Lindsay +Charles Merriam +Charles Sarrazin +Charles Smith +Charlie Drage +Charlie Lewis +Chase Bolt +ChaYoung You +Chen Chao +Chen Chuanliang +Chen Hanxiao +Chen Min +Chen Mingjie +Chen Qiu +Cheng-mean Liu +Chengguang Xu +chenyuzhu +Chetan Birajdar +Chewey +Chia-liang Kao +chli +Cholerae Hu +Chris Alfonso +Chris Armstrong +Chris Dias +Chris Dituri +Chris Fordham +Chris Gavin +Chris Gibson +Chris Khoo +Chris McKinnel +Chris McKinnel +Chris Seto +Chris Snow +Chris St. Pierre +Chris Stivers +Chris Swan +Chris Telfer +Chris Wahl +Chris Weyl +Christian Berendt +Christian Brauner +Christian Böhme +Christian Persson +Christian Rotzoll +Christian Simon +Christian Stefanescu +Christophe Mehay +Christophe Troestler +Christophe Vidal +Christopher Biscardi +Christopher Crone +Christopher Currie +Christopher Jones +Christopher Latham +Christopher Rigor +Christy Perez +Chun Chen +Ciro S. Costa +Clayton Coleman +Clinton Kitson +Cody Roseborough +Coenraad Loubser +Colin Dunklau +Colin Hebert +Colin Rice +Colin Walters +Collin Guarino +Colm Hally +companycy +Corbin Coleman +Corey Farrell +Cory Forsyth +cressie176 +CrimsonGlory +Cristian Staretu +cristiano balducci +Cruceru Calin-Cristian +CUI Wei +Cyprian Gracz +Cyril F +Daan van Berkel +Daehyeok Mun +Dafydd Crosby +dalanlan +Damian Smyth +Damien Nadé +Damien Nozay +Damjan Georgievski +Dan Anolik +Dan Buch +Dan Cotora +Dan Feldman +Dan Griffin +Dan Hirsch +Dan Keder +Dan Levy +Dan McPherson +Dan Stine +Dan Williams +Dani Louca +Daniel Antlinger +Daniel Dao +Daniel Exner +Daniel Farrell +Daniel Garcia +Daniel Gasienica +Daniel Grunwell +Daniel Hiltgen +Daniel J Walsh +Daniel Menet +Daniel Mizyrycki +Daniel Nephin +Daniel Norberg +Daniel Nordberg +Daniel Robinson +Daniel S +Daniel Von Fange +Daniel Watkins +Daniel X Moore +Daniel YC Lin +Daniel Zhang +Danny Berger +Danny Yates +Danyal Khaliq +Darren Coxall +Darren Shepherd +Darren Stahl +Dattatraya Kumbhar +Davanum Srinivas +Dave Barboza +Dave Goodchild +Dave Henderson +Dave MacDonald +Dave Tucker +David Anderson +David Calavera +David Chung +David Corking +David Cramer +David Currie +David Davis +David Dooling +David Gageot +David Gebler +David Glasser +David Lawrence +David Lechner +David M. Karr +David Mackey +David Mat +David Mcanulty +David McKay +David Pelaez +David R. Jenni +David Röthlisberger +David Sheets +David Sissitka +David Trott +David Williamson +David Xia +David Young +Davide Ceretti +Dawn Chen +dbdd +dcylabs +Deborah Gertrude Digges +deed02392 +Deng Guangxing +Deni Bertovic +Denis Defreyne +Denis Gladkikh +Denis Ollier +Dennis Chen +Dennis Chen +Dennis Docter +Derek +Derek +Derek Ch +Derek McGowan +Deric Crago +Deshi Xiao +devmeyster +Devvyn Murphy +Dharmit Shah +Dhawal Yogesh Bhanushali +Diego Romero +Diego Siqueira +Dieter Reuter +Dillon Dixon +Dima Stopel +Dimitri John Ledkov +Dimitris Rozakis +Dimitry Andric +Dinesh Subhraveti +Ding Fei +Diogo Monica +DiuDiugirl +Djibril Koné +dkumor +Dmitri Logvinenko +Dmitri Shuralyov +Dmitry Demeshchuk +Dmitry Gusev +Dmitry Kononenko +Dmitry Shyshkin +Dmitry Smirnov +Dmitry V. Krivenok +Dmitry Vorobev +Dolph Mathews +Dominik Dingel +Dominik Finkbeiner +Dominik Honnef +Don Kirkby +Don Kjer +Don Spaulding +Donald Huang +Dong Chen +Donovan Jones +Doron Podoleanu +Doug Davis +Doug MacEachern +Doug Tangren +Douglas Curtis +Dr Nic Williams +dragon788 +Dražen Lučanin +Drew Erny +Drew Hubl +Dustin Sallings +Ed Costello +Edmund Wagner +Eiichi Tsukata +Eike Herzbach +Eivin Giske Skaaren +Eivind Uggedal +Elan Ruusamäe +Elango Sivanandam +Elena Morozova +Eli Uriegas +Elias Faxö +Elias Probst +Elijah Zupancic +eluck +Elvir Kuric +Emil Davtyan +Emil Hernvall +Emily Maier +Emily Rose +Emir Ozer +Enguerran +Eohyung Lee +epeterso +Eric Barch +Eric Curtin +Eric G. Noriega +Eric Hanchrow +Eric Lee +Eric Myhre +Eric Paris +Eric Rafaloff +Eric Rosenberg +Eric Sage +Eric Soderstrom +Eric Yang +Eric-Olivier Lamey +Erica Windisch +Erik Bray +Erik Dubbelboer +Erik Hollensbe +Erik Inge Bolsø +Erik Kristensen +Erik St. Martin +Erik Weathers +Erno Hopearuoho +Erwin van der Koogh +Ethan Bell +Euan Kemp +Eugen Krizo +Eugene Yakubovich +Evan Allrich +Evan Carmi +Evan Hazlett +Evan Krall +Evan Phoenix +Evan Wies +Evelyn Xu +Everett Toews +Evgeny Shmarnev +Evgeny Vereshchagin +Ewa Czechowska +Eystein Måløy Stenberg +ezbercih +Ezra Silvera +Fabian Lauer +Fabiano Rosas +Fabio Falci +Fabio Kung +Fabio Rapposelli +Fabio Rehm +Fabrizio Regini +Fabrizio Soppelsa +Faiz Khan +falmp +Fangming Fang +Fangyuan Gao <21551127@zju.edu.cn> +Fareed Dudhia +Fathi Boudra +Federico Gimenez +Felipe Oliveira +Felix Abecassis +Felix Geisendörfer +Felix Hupfeld +Felix Rabe +Felix Ruess +Felix Schindler +Feng Yan +Fengtu Wang +Ferenc Szabo +Fernando +Fero Volar +Ferran Rodenas +Filipe Brandenburger +Filipe Oliveira +Flavio Castelli +Flavio Crisciani +Florian +Florian Klein +Florian Maier +Florian Noeding +Florian Weingarten +Florin Asavoaie +Florin Patan +fonglh +Foysal Iqbal +Francesc Campoy +Francis Chuang +Francisco Carriedo +Francisco Souza +Frank Groeneveld +Frank Herrmann +Frank Macreery +Frank Rosquin +Fred Lifton +Frederick F. Kautz IV +Frederik Loeffert +Frederik Nordahl Jul Sabroe +Freek Kalter +Frieder Bluemle +Félix Baylac-Jacqué +Félix Cantournet +Gabe Rosenhouse +Gabor Nagy +Gabriel Linder +Gabriel Monroy +Gabriel Nicolas Avellaneda +Gaetan de Villele +Galen Sampson +Gang Qiao +Gareth Rushgrove +Garrett Barboza +Gary Schaetz +Gaurav +gautam, prasanna +Gaël PORTAY +Genki Takiuchi +GennadySpb +Geoffrey Bachelet +George Kontridze +George MacRorie +George Xie +Georgi Hristozov +Gereon Frey +German DZ +Gert van Valkenhoef +Gerwim Feiken +Ghislain Bourgeois +Giampaolo Mancini +Gianluca Borello +Gildas Cuisinier +gissehel +Giuseppe Mazzotta +Gleb Fotengauer-Malinovskiy +Gleb M Borisov +Glyn Normington +GoBella +Goffert van Gool +Gopikannan Venugopalsamy +Gosuke Miyashita +Gou Rao +Govinda Fichtner +Grant Reaber +Graydon Hoare +Greg Fausak +Greg Pflaum +Greg Stephens +Greg Thornton +Grzegorz Jaśkiewicz +Guilhem Lettron +Guilherme Salgado +Guillaume Dufour +Guillaume J. Charmes +guoxiuyan +Guri +Gurjeet Singh +Guruprasad +Gustav Sinder +gwx296173 +Günter Zöchbauer +Hakan Özler +Hans Kristian Flaatten +Hans Rødtang +Hao Shu Wei +Hao Zhang <21521210@zju.edu.cn> +Harald Albers +Harley Laue +Harold Cooper +Harry Zhang +Harshal Patil +Harshal Patil +He Simei +He Xiaoxi +He Xin +heartlock <21521209@zju.edu.cn> +Hector Castro +Helen Xie +Henning Sprang +Hiroshi Hatake +Hobofan +Hollie Teal +Hong Xu +Hongbin Lu +hsinko <21551195@zju.edu.cn> +Hu Keping +Hu Tao +Huanzhong Zhang +Huayi Zhang +Hugo Duncan +Hugo Marisco <0x6875676f@gmail.com> +Hunter Blanks +huqun +Huu Nguyen +hyeongkyu.lee +Hyzhou Zhy +Iago López Galeiras +Ian Babrou +Ian Bishop +Ian Bull +Ian Calvert +Ian Campbell +Ian Lee +Ian Main +Ian Philpot +Ian Truslove +Iavael +Icaro Seara +Ignacio Capurro +Igor Dolzhikov +Igor Karpovich +Iliana Weller +Ilkka Laukkanen +Ilya Dmitrichenko +Ilya Gusev +Ilya Khlopotov +imre Fitos +inglesp +Ingo Gottwald +Isaac Dupree +Isabel Jimenez +Isao Jonas +Ivan Babrou +Ivan Fraixedes +Ivan Grcic +Ivan Markin +J Bruni +J. Nunn +Jack Danger Canty +Jack Laxson +Jacob Atzen +Jacob Edelman +Jacob Tomlinson +Jacob Vallejo +Jacob Wen +Jaivish Kothari +Jake Champlin +Jake Moshenko +Jake Sanders +jakedt +James Allen +James Carey +James Carr +James DeFelice +James Harrison Fisher +James Kyburz +James Kyle +James Lal +James Mills +James Nesbitt +James Nugent +James Turnbull +Jamie Hannaford +Jamshid Afshar +Jan Keromnes +Jan Koprowski +Jan Pazdziora +Jan Toebes +Jan-Gerd Tenberge +Jan-Jaap Driessen +Jana Radhakrishnan +Jannick Fahlbusch +Januar Wayong +Jared Biel +Jared Hocutt +Jaroslaw Zabiello +jaseg +Jasmine Hegman +Jason Divock +Jason Giedymin +Jason Green +Jason Hall +Jason Heiss +Jason Livesay +Jason McVetta +Jason Plum +Jason Shepherd +Jason Smith +Jason Sommer +Jason Stangroome +jaxgeller +Jay +Jay +Jay Kamat +Jean-Baptiste Barth +Jean-Baptiste Dalido +Jean-Christophe Berthon +Jean-Paul Calderone +Jean-Pierre Huynh +Jean-Tiare Le Bigot +Jeeva S. Chelladhurai +Jeff Anderson +Jeff Hajewski +Jeff Johnston +Jeff Lindsay +Jeff Mickey +Jeff Minard +Jeff Nickoloff +Jeff Silberman +Jeff Welch +Jeffrey Bolle +Jeffrey Morgan +Jeffrey van Gogh +Jenny Gebske +Jeremy Chambers +Jeremy Grosser +Jeremy Price +Jeremy Qian +Jeremy Unruh +Jeremy Yallop +Jeroen Franse +Jeroen Jacobs +Jesse Dearing +Jesse Dubay +Jessica Frazelle +Jezeniel Zapanta +Jhon Honce +Ji.Zhilong +Jian Zhang +Jie Luo +Jihyun Hwang +Jilles Oldenbeuving +Jim Alateras +Jim Galasyn +Jim Minter +Jim Perrin +Jimmy Cuadra +Jimmy Puckett +Jimmy Song +jimmyxian +Jinsoo Park +Jiri Popelka +Jiuyue Ma +Jiří Župka +jjy +jmzwcn +Joao Fernandes +Joe Beda +Joe Doliner +Joe Ferguson +Joe Gordon +Joe Shaw +Joe Van Dyk +Joel Friedly +Joel Handwell +Joel Hansson +Joel Wurtz +Joey Geiger +Joey Geiger +Joey Gibson +Joffrey F +Johan Euphrosine +Johan Rydberg +Johanan Lieberman +Johannes 'fish' Ziemke +John Costa +John Feminella +John Gardiner Myers +John Gossman +John Harris +John Howard (VM) +John Laswell +John Maguire +John Mulhausen +John OBrien III +John Starks +John Stephens +John Tims +John V. Martinez +John Warwick +John Willis +Jon Johnson +Jon Surrell +Jon Wedaman +Jonas Pfenniger +Jonathan A. Sternberg +Jonathan Boulle +Jonathan Camp +Jonathan Choy +Jonathan Dowland +Jonathan Lebon +Jonathan Lomas +Jonathan McCrohan +Jonathan Mueller +Jonathan Pares +Jonathan Rudenberg +Jonathan Stoppani +Jonh Wendell +Joni Sar +Joost Cassee +Jordan Arentsen +Jordan Jennings +Jordan Sissel +Jorge Marin +Jorit Kleine-Möllhoff +Jose Diaz-Gonzalez +Joseph Anthony Pasquale Holsten +Joseph Hager +Joseph Kern +Joseph Rothrock +Josh +Josh Bodah +Josh Bonczkowski +Josh Chorlton +Josh Eveleth +Josh Hawn +Josh Horwitz +Josh Poimboeuf +Josh Soref +Josh Wilson +Josiah Kiehl +José Tomás Albornoz +Joyce Jang +JP +Julian Taylor +Julien Barbier +Julien Bisconti +Julien Bordellier +Julien Dubois +Julien Kassar +Julien Maitrehenry +Julien Pervillé +Julio Montes +Jun-Ru Chang +Jussi Nummelin +Justas Brazauskas +Justin Cormack +Justin Force +Justin Menga +Justin Plock +Justin Simonelis +Justin Terry +Justyn Temme +Jyrki Puttonen +Jérôme Petazzoni +Jörg Thalheim +K. Heller +Kai Blin +Kai Qiang Wu (Kennan) +Kamil Domański +Kamjar Gerami +Kanstantsin Shautsou +Kara Alexandra +Karan Lyons +Kareem Khazem +kargakis +Karl Grzeszczak +Karol Duleba +Karthik Karanth +Karthik Nayak +Kate Heddleston +Katie McLaughlin +Kato Kazuyoshi +Katrina Owen +Kawsar Saiyeed +Kay Yan +kayrus +Ke Li +Ke Xu +Kei Ohmura +Keith Hudgins +Keli Hu +Ken Cochrane +Ken Herner +Ken ICHIKAWA +Kenfe-Mickaël Laventure +Kenjiro Nakayama +Kent Johnson +Kevin "qwazerty" Houdebert +Kevin Burke +Kevin Clark +Kevin Feyrer +Kevin J. Lynagh +Kevin Jing Qiu +Kevin Kern +Kevin Menard +Kevin Meredith +Kevin P. Kucharczyk +Kevin Richardson +Kevin Shi +Kevin Wallace +Kevin Yap +Keyvan Fatehi +kies +Kim BKC Carlbacker +Kim Eik +Kimbro Staken +Kir Kolyshkin +Kiran Gangadharan +Kirill SIbirev +knappe +Kohei Tsuruta +Koichi Shiraishi +Konrad Kleine +Konstantin Gribov +Konstantin L +Konstantin Pelykh +Krasi Georgiev +Krasimir Georgiev +Kris-Mikael Krister +Kristian Haugene +Kristina Zabunova +krrg +Kun Zhang +Kunal Kushwaha +Kyle Conroy +Kyle Linden +kyu +Lachlan Coote +Lai Jiangshan +Lajos Papp +Lakshan Perera +Lalatendu Mohanty +Lance Chen +Lance Kinley +Lars Butler +Lars Kellogg-Stedman +Lars R. Damerow +Lars-Magnus Skog +Laszlo Meszaros +Laura Frank +Laurent Erignoux +Laurie Voss +Leandro Siqueira +Lee Chao <932819864@qq.com> +Lee, Meng-Han +leeplay +Lei Jitang +Len Weincier +Lennie +Leo Gallucci +Leszek Kowalski +Levi Blackstone +Levi Gross +Lewis Daly +Lewis Marshall +Lewis Peckover +Li Yi +Liam Macgillavry +Liana Lo +Liang Mingqiang +Liang-Chi Hsieh +Liao Qingwei +Lily Guo +limsy +Lin Lu +LingFaKe +Linus Heckemann +Liran Tal +Liron Levin +Liu Bo +Liu Hua +liwenqi +lixiaobing10051267 +Liz Zhang +LIZAO LI +Lizzie Dixon <_@lizzie.io> +Lloyd Dewolf +Lokesh Mandvekar +longliqiang88 <394564827@qq.com> +Lorenz Leutgeb +Lorenzo Fontana +Louis Opter +Luca Favatella +Luca Marturana +Luca Orlandi +Luca-Bogdan Grigorescu +Lucas Chan +Lucas Chi +Lucas Molas +Luciano Mores +Luis Martínez de Bartolomé Izquierdo +Luiz Svoboda +Lukas Waslowski +lukaspustina +Lukasz Zajaczkowski +Luke Marsden +Lyn +Lynda O'Leary +Lénaïc Huard +Ma Müller +Ma Shimiao +Mabin +Madhan Raj Mookkandy +Madhav Puri +Madhu Venugopal +Mageee +Mahesh Tiyyagura +malnick +Malte Janduda +Manfred Touron +Manfred Zabarauskas +Manjunath A Kumatagi +Mansi Nahar +Manuel Meurer +Manuel Rüger +Manuel Woelker +mapk0y +Marc Abramowitz +Marc Kuo +Marc Tamsky +Marcel Edmund Franke +Marcelo Horacio Fortino +Marcelo Salazar +Marco Hennings +Marcus Cobden +Marcus Farkas +Marcus Linke +Marcus Martins +Marcus Ramberg +Marek Goldmann +Marian Marinov +Marianna Tessel +Mario Loriedo +Marius Gundersen +Marius Sturm +Marius Voila +Mark Allen +Mark McGranaghan +Mark McKinstry +Mark Milstein +Mark Oates +Mark Parker +Mark West +Markan Patel +Marko Mikulicic +Marko Tibold +Markus Fix +Markus Kortlang +Martijn Dwars +Martijn van Oosterhout +Martin Honermeyer +Martin Kelly +Martin Mosegaard Amdisen +Martin Redmond +Mary Anthony +Masahito Zembutsu +Masato Ohba +Masayuki Morita +Mason Malone +Mateusz Sulima +Mathias Monnerville +Mathieu Champlon +Mathieu Le Marec - Pasquet +Mathieu Parent +Matt Apperson +Matt Bachmann +Matt Bentley +Matt Haggard +Matt Hoyle +Matt McCormick +Matt Moore +Matt Richardson +Matt Rickard +Matt Robenolt +Matt Schurenko +Matt Williams +Matthew Heon +Matthew Lapworth +Matthew Mayer +Matthew Mosesohn +Matthew Mueller +Matthew Riley +Matthias Klumpp +Matthias Kühnle +Matthias Rampke +Matthieu Hauglustaine +Mauricio Garavaglia +mauriyouth +Max Shytikov +Maxim Fedchyshyn +Maxim Ivanov +Maxim Kulkin +Maxim Treskin +Maxime Petazzoni +Meaglith Ma +meejah +Megan Kostick +Mehul Kar +Mei ChunTao +Mengdi Gao +Mert Yazıcıoğlu +mgniu +Micah Zoltu +Michael A. Smith +Michael Bridgen +Michael Brown +Michael Chiang +Michael Crosby +Michael Currie +Michael Friis +Michael Gorsuch +Michael Grauer +Michael Holzheu +Michael Hudson-Doyle +Michael Huettermann +Michael Irwin +Michael Käufl +Michael Neale +Michael Nussbaum +Michael Prokop +Michael Scharf +Michael Spetsiotis +Michael Stapelberg +Michael Steinert +Michael Thies +Michael West +Michal Fojtik +Michal Gebauer +Michal Jemala +Michal Minář +Michal Wieczorek +Michaël Pailloncy +Michał Czeraszkiewicz +Michał Gryko +Michiel@unhosted +Mickaël FORTUNATO +Miguel Angel Fernández +Miguel Morales +Mihai Borobocea +Mihuleacc Sergiu +Mike Brown +Mike Casas +Mike Chelen +Mike Danese +Mike Dillon +Mike Dougherty +Mike Estes +Mike Gaffney +Mike Goelzer +Mike Leone +Mike Lundy +Mike MacCana +Mike Naberezny +Mike Snitzer +mikelinjie <294893458@qq.com> +Mikhail Sobolev +Miklos Szegedi +Milind Chawre +Miloslav Trmač +mingqing +Mingzhen Feng +Misty Stanley-Jones +Mitch Capper +Mizuki Urushida +mlarcher +Mohammad Banikazemi +Mohammed Aaqib Ansari +Mohit Soni +Moorthy RS +Morgan Bauer +Morgante Pell +Morgy93 +Morten Siebuhr +Morton Fox +Moysés Borges +mrfly +Mrunal Patel +Muayyad Alsadi +Mustafa Akın +Muthukumar R +Máximo Cuadros +Médi-Rémi Hashim +Nace Oroz +Nahum Shalman +Nakul Pathak +Nalin Dahyabhai +Nan Monnand Deng +Naoki Orii +Natalie Parker +Natanael Copa +Nate Brennand +Nate Eagleson +Nate Jones +Nathan Hsieh +Nathan Kleyn +Nathan LeClaire +Nathan McCauley +Nathan Williams +Naveed Jamil +Neal McBurnett +Neil Horman +Neil Peterson +Nelson Chen +Neyazul Haque +Nghia Tran +Niall O'Higgins +Nicholas E. Rabenau +Nick DeCoursin +Nick Irvine +Nick Neisen +Nick Parker +Nick Payne +Nick Russo +Nick Stenning +Nick Stinemates +NickrenREN +Nicola Kabar +Nicolas Borboën +Nicolas De Loof +Nicolas Dudebout +Nicolas Goy +Nicolas Kaiser +Nicolas Sterchele +Nicolás Hock Isaza +Nigel Poulton +Nik Nyby +Nikhil Chawla +NikolaMandic +Nikolas Garofil +Nikolay Milovanov +Nirmal Mehta +Nishant Totla +NIWA Hideyuki +Noah Meyerhans +Noah Treuhaft +NobodyOnSE +noducks +Nolan Darilek +nponeccop +Nuutti Kotivuori +nzwsch +O.S. Tezer +objectified +Oguz Bilgic +Oh Jinkyun +Ohad Schneider +ohmystack +Ole Reifschneider +Oliver Neal +Olivier Gambier +Olle Jonsson +Oriol Francès +Oskar Niburski +Otto Kekäläinen +Ouyang Liduo +Ovidio Mallo +Panagiotis Moustafellos +Paolo G. Giarrusso +Pascal +Pascal Borreli +Pascal Hartig +Patrick Böänziger +Patrick Devine +Patrick Hemmer +Patrick Stapleton +Patrik Cyvoct +pattichen +Paul +paul +Paul Annesley +Paul Bellamy +Paul Bowsher +Paul Furtado +Paul Hammond +Paul Jimenez +Paul Kehrer +Paul Lietar +Paul Liljenberg +Paul Morie +Paul Nasrat +Paul Weaver +Paulo Ribeiro +Pavel Lobashov +Pavel Pletenev +Pavel Pospisil +Pavel Sutyrin +Pavel Tikhomirov +Pavlos Ratis +Pavol Vargovcik +Pawel Konczalski +Peeyush Gupta +Peggy Li +Pei Su +Peng Tao +Penghan Wang +Per Weijnitz +perhapszzy@sina.com +Peter Bourgon +Peter Braden +Peter Bücker +Peter Choi +Peter Dave Hello +Peter Edge +Peter Ericson +Peter Esbensen +Peter Jaffe +Peter Malmgren +Peter Salvatore +Peter Volpe +Peter Waller +Petr Švihlík +Phil +Phil Estes +Phil Spitler +Philip Alexander Etling +Philip Monroe +Philipp Gillé +Philipp Wahala +Philipp Weissensteiner +Phillip Alexander +phineas +pidster +Piergiuliano Bossi +Pierre +Pierre Carrier +Pierre Dal-Pra +Pierre Wacrenier +Pierre-Alain RIVIERE +Piotr Bogdan +pixelistik +Porjo +Poul Kjeldager Sørensen +Pradeep Chhetri +Pradip Dhara +Prasanna Gautam +Pratik Karki +Prayag Verma +Priya Wadhwa +Przemek Hejman +Pure White +pysqz +Qiang Huang +Qinglan Peng +qudongfang +Quentin Brossard +Quentin Perez +Quentin Tayssier +r0n22 +Rafal Jeczalik +Rafe Colton +Raghavendra K T +Raghuram Devarakonda +Raja Sami +Rajat Pandit +Rajdeep Dua +Ralf Sippl +Ralle +Ralph Bean +Ramkumar Ramachandra +Ramon Brooker +Ramon van Alteren +Ray Tsang +ReadmeCritic +Recursive Madman +Reficul +Regan McCooey +Remi Rampin +Remy Suen +Renato Riccieri Santos Zannon +Renaud Gaubert +Rhys Hiltner +Ri Xu +Ricardo N Feliciano +Rich Moyse +Rich Seymour +Richard +Richard Burnison +Richard Harvey +Richard Mathie +Richard Metzler +Richard Scothern +Richo Healey +Rick Bradley +Rick van de Loo +Rick Wieman +Rik Nijessen +Riku Voipio +Riley Guerin +Ritesh H Shukla +Riyaz Faizullabhoy +Rob Vesse +Robert Bachmann +Robert Bittle +Robert Obryk +Robert Schneider +Robert Stern +Robert Terhaar +Robert Wallis +Roberto G. Hashioka +Roberto Muñoz Fernández +Robin Naundorf +Robin Schneider +Robin Speekenbrink +robpc +Rodolfo Carvalho +Rodrigo Vaz +Roel Van Nyen +Roger Peppe +Rohit Jnagal +Rohit Kadam +Rojin George +Roland Huß +Roland Kammerer +Roland Moriz +Roma Sokolov +Roman Dudin +Roman Strashkin +Ron Smits +Ron Williams +root +root +root +root +Rory Hunter +Rory McCune +Ross Boucher +Rovanion Luckey +Royce Remer +Rozhnov Alexandr +Rudolph Gottesheim +Rui Lopes +Runshen Zhu +Ryan Abrams +Ryan Anderson +Ryan Aslett +Ryan Belgrave +Ryan Detzel +Ryan Fowler +Ryan Liu +Ryan McLaughlin +Ryan O'Donnell +Ryan Seto +Ryan Simmen +Ryan Stelly +Ryan Thomas +Ryan Trauntvein +Ryan Wallner +Ryan Zhang +ryancooper7 +RyanDeng +Rémy Greinhofer +s. rannou +s00318865 +Sabin Basyal +Sachin Joshi +Sagar Hani +Sainath Grandhi +Sakeven Jiang +Sally O'Malley +Sam Abed +Sam Alba +Sam Bailey +Sam J Sharpe +Sam Neirinck +Sam Reis +Sam Rijs +Sambuddha Basu +Sami Wagiaalla +Samuel Andaya +Samuel Dion-Girardeau +Samuel Karp +Samuel PHAN +Sandeep Bansal +Sankar சங்கர் +Sanket Saurav +Santhosh Manohar +sapphiredev +Sargun Dhillon +Sascha Andres +Satnam Singh +Satoshi Amemiya +Satoshi Tagomori +Scott Bessler +Scott Collier +Scott Johnston +Scott Stamp +Scott Walls +sdreyesg +Sean Christopherson +Sean Cronin +Sean Lee +Sean McIntyre +Sean OMeara +Sean P. Kane +Sean Rodman +Sebastiaan van Steenis +Sebastiaan van Stijn +Senthil Kumar Selvaraj +Senthil Kumaran +SeongJae Park +Seongyeol Lim +Serge Hallyn +Sergey Alekseev +Sergey Evstifeev +Sergii Kabashniuk +Serhat Gülçiçek +Sevki Hasirci +Shane Canon +Shane da Silva +Shaun Kaasten +shaunol +Shawn Landden +Shawn Siefkas +shawnhe +Shayne Wang +Shekhar Gulati +Sheng Yang +Shengbo Song +Shev Yan +Shih-Yuan Lee +Shijiang Wei +Shijun Qin +Shishir Mahajan +Shoubhik Bose +Shourya Sarcar +shuai-z +Shukui Yang +Shuwei Hao +Sian Lerk Lau +Sidhartha Mani +sidharthamani +Silas Sewell +Silvan Jegen +Simei He +Simon Eskildsen +Simon Ferquel +Simon Leinen +Simon Menke +Simon Taranto +Simon Vikstrom +Sindhu S +Sjoerd Langkemper +Solganik Alexander +Solomon Hykes +Song Gao +Soshi Katsuta +Soulou +Spencer Brown +Spencer Smith +Sridatta Thatipamala +Sridhar Ratnakumar +Srini Brahmaroutu +Srinivasan Srivatsan +Stanislav Bondarenko +Steeve Morin +Stefan Berger +Stefan J. Wernli +Stefan Praszalowicz +Stefan S. +Stefan Scherer +Stefan Staudenmeyer +Stefan Weil +Stephan Spindler +Stephen Crosby +Stephen Day +Stephen Drake +Stephen Rust +Steve Desmond +Steve Dougherty +Steve Durrheimer +Steve Francia +Steve Koch +Steven Burgess +Steven Erenst +Steven Hartland +Steven Iveson +Steven Merrill +Steven Richards +Steven Taylor +Subhajit Ghosh +Sujith Haridasan +Sun Gengze <690388648@qq.com> +Sun Jianbo +Sunny Gogoi +Suryakumar Sudar +Sven Dowideit +Swapnil Daingade +Sylvain Baubeau +Sylvain Bellemare +Sébastien +Sébastien HOUZÉ +Sébastien Luttringer +Sébastien Stormacq +Tabakhase +Tadej Janež +TAGOMORI Satoshi +tang0th +Tangi Colin +Tatsuki Sugiura +Tatsushi Inagaki +Taylor Jones +tbonza +Ted M. Young +Tehmasp Chaudhri +Tejesh Mehta +terryding77 <550147740@qq.com> +tgic +Thatcher Peskens +theadactyl +Thell 'Bo' Fowler +Thermionix +Thijs Terlouw +Thomas Bikeev +Thomas Frössman +Thomas Gazagnaire +Thomas Grainger +Thomas Hansen +Thomas Leonard +Thomas Léveil +Thomas Orozco +Thomas Riccardi +Thomas Schroeter +Thomas Sjögren +Thomas Swift +Thomas Tanaka +Thomas Texier +Ti Zhou +Tianon Gravi +Tianyi Wang +Tibor Vass +Tiffany Jernigan +Tiffany Low +Tim Bart +Tim Bosse +Tim Dettrick +Tim Düsterhus +Tim Hockin +Tim Potter +Tim Ruffles +Tim Smith +Tim Terhorst +Tim Wang +Tim Waugh +Tim Wraight +Tim Zju <21651152@zju.edu.cn> +timfeirg +Timothy Hobbs +tjwebb123 +tobe +Tobias Bieniek +Tobias Bradtke +Tobias Gesellchen +Tobias Klauser +Tobias Munk +Tobias Schmidt +Tobias Schwab +Todd Crane +Todd Lunter +Todd Whiteman +Toli Kuznets +Tom Barlow +Tom Booth +Tom Denham +Tom Fotherby +Tom Howe +Tom Hulihan +Tom Maaswinkel +Tom Sweeney +Tom Wilkie +Tom X. Tobin +Tomas Tomecek +Tomasz Kopczynski +Tomasz Lipinski +Tomasz Nurkiewicz +Tommaso Visconti +Tomáš Hrčka +Tonny Xu +Tony Abboud +Tony Daws +Tony Miller +toogley +Torstein Husebø +Tõnis Tiigi +tpng +tracylihui <793912329@qq.com> +Trapier Marshall +Travis Cline +Travis Thieman +Trent Ogren +Trevor +Trevor Pounds +Trevor Sullivan +Trishna Guha +Tristan Carel +Troy Denton +Tycho Andersen +Tyler Brock +Tzu-Jung Lee +uhayate +Ulysse Carion +Umesh Yadav +Utz Bacher +vagrant +Vaidas Jablonskis +vanderliang +Veres Lajos +Victor Algaze +Victor Coisne +Victor Costan +Victor I. Wood +Victor Lyuboslavsky +Victor Marmol +Victor Palma +Victor Vieux +Victoria Bialas +Vijaya Kumar K +Viktor Stanchev +Viktor Vojnovski +VinayRaghavanKS +Vincent Batts +Vincent Bernat +Vincent Demeester +Vincent Giersch +Vincent Mayers +Vincent Woo +Vinod Kulkarni +Vishal Doshi +Vishnu Kannan +Vitaly Ostrosablin +Vitor Monteiro +Vivek Agarwal +Vivek Dasgupta +Vivek Goyal +Vladimir Bulyga +Vladimir Kirillov +Vladimir Pouzanov +Vladimir Rutsky +Vladimir Varankin +VladimirAus +Vlastimil Zeman +Vojtech Vitek (V-Teq) +waitingkuo +Walter Leibbrandt +Walter Stanish +Wang Chao +Wang Guoliang +Wang Jie +Wang Long +Wang Ping +Wang Xing +Wang Yuexiao +Ward Vandewege +WarheadsSE +Wassim Dhif +Wayne Chang +Wayne Song +Weerasak Chongnguluam +Wei Wu +Wei-Ting Kuo +weipeng +weiyan +Weiyang Zhu +Wen Cheng Ma +Wendel Fleming +Wenjun Tang +Wenkai Yin +Wentao Zhang +Wenxuan Zhao +Wenyu You <21551128@zju.edu.cn> +Wenzhi Liang +Wes Morgan +Wewang Xiaorenfine +Will Dietz +Will Rouesnel +Will Weaver +willhf +William Delanoue +William Henry +William Hubbs +William Martin +William Riancho +William Thurston +WiseTrem +Wolfgang Powisch +Wonjun Kim +xamyzhao +Xianglin Gao +Xianlu Bird +XiaoBing Jiang +Xiaoxu Chen +Xiaoyu Zhang +xiekeyang +Xinbo Weng +Xinzi Zhou +Xiuming Chen +Xuecong Liao +xuzhaokui +Yahya +YAMADA Tsuyoshi +Yamasaki Masahide +Yan Feng +Yang Bai +Yang Pengfei +yangchenliang +Yanqiang Miao +Yao Zaiyong +Yassine Tijani +Yasunori Mahata +Yazhong Liu +Yestin Sun +Yi EungJun +Yibai Zhang +Yihang Ho +Ying Li +Yohei Ueda +Yong Tang +Yongzhi Pan +Yosef Fertel +You-Sheng Yang (楊有勝) +Youcef YEKHLEF +Yu Changchun +Yu Chengxia +Yu Peng +Yu-Ju Hong +Yuan Sun +Yuanhong Peng +Yuhao Fang +Yunxiang Huang +Yurii Rashkovskii +Yves Junqueira +Zac Dover +Zach Borboa +Zachary Jaffee +Zain Memon +Zaiste! +Zane DeGraffenried +Zefan Li +Zen Lin(Zhinan Lin) +Zhang Kun +Zhang Wei +Zhang Wentao +ZhangHang +zhangxianwei +Zhenan Ye <21551168@zju.edu.cn> +zhenghenghuo +Zhenkun Bi +Zhou Hao +Zhu Guihua +Zhu Kunjia +Zhuoyun Wei +Zilin Du +zimbatm +Ziming Dong +ZJUshuaizhou <21551191@zju.edu.cn> +zmarouf +Zoltan Tombol +Zou Yu +zqh +Zuhayr Elahi +Zunayed Ali +Álex González +Álvaro Lázaro +Átila Camurça Alves +尹吉峰 +徐俊杰 +慕陶 +搏通 +黄艳红00139573 diff --git a/vendor/github.com/docker/docker/api/types/BUILD b/vendor/github.com/docker/docker/api/types/BUILD index 55feeb90..5a35184c 100644 --- a/vendor/github.com/docker/docker/api/types/BUILD +++ b/vendor/github.com/docker/docker/api/types/BUILD @@ -24,6 +24,7 @@ go_library( "types.go", "volume.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types", importpath = "github.com/docker/docker/api/types", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go index 18a1263f..bf5fdfbf 100644 --- a/vendor/github.com/docker/docker/api/types/client.go +++ b/vendor/github.com/docker/docker/api/types/client.go @@ -7,7 +7,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" - units "github.com/docker/go-units" + "github.com/docker/go-units" ) // CheckpointCreateOptions holds parameters to create a checkpoint from a container @@ -74,6 +74,7 @@ type ContainerLogsOptions struct { ShowStdout bool ShowStderr bool Since string + Until string Timestamps bool Follow bool Tail string @@ -179,10 +180,7 @@ type ImageBuildOptions struct { ExtraHosts []string // List of extra hosts Target string SessionID string - - // TODO @jhowardmsft LCOW Support: This will require extending to include - // `Platform string`, but is ommited for now as it's hard-coded temporarily - // to avoid API changes. + Platform string } // ImageBuildResponse holds information @@ -195,7 +193,8 @@ type ImageBuildResponse struct { // ImageCreateOptions holds information to create images. type ImageCreateOptions struct { - RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry. + Platform string // Platform is the target platform of the image if it needs to be pulled from the registry. } // ImageImportSource holds source information for ImageImport @@ -206,9 +205,10 @@ type ImageImportSource struct { // ImageImportOptions holds information to import images from the client host. type ImageImportOptions struct { - Tag string // Tag is the name to tag this image with. This attribute is deprecated. - Message string // Message is the message to tag the image with - Changes []string // Changes are the raw changes to apply to this image + Tag string // Tag is the name to tag this image with. This attribute is deprecated. + Message string // Message is the message to tag the image with + Changes []string // Changes are the raw changes to apply to this image + Platform string // Platform is the target platform of the image } // ImageListOptions holds parameters to filter the list of images with. @@ -229,6 +229,7 @@ type ImagePullOptions struct { All bool RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry PrivilegeFunc RequestPrivilegeFunc + Platform string } // RequestPrivilegeFunc is a function interface that diff --git a/vendor/github.com/docker/docker/api/types/configs.go b/vendor/github.com/docker/docker/api/types/configs.go index e4d2ce6e..fd604bce 100644 --- a/vendor/github.com/docker/docker/api/types/configs.go +++ b/vendor/github.com/docker/docker/api/types/configs.go @@ -16,7 +16,6 @@ type ContainerCreateConfig struct { HostConfig *container.HostConfig NetworkingConfig *network.NetworkingConfig AdjustCPUShares bool - Platform string } // ContainerRmConfig holds arguments for the container remove @@ -26,19 +25,6 @@ type ContainerRmConfig struct { ForceRemove, RemoveVolume, RemoveLink bool } -// ContainerCommitConfig contains build configs for commit operation, -// and is used when making a commit with the current state of the container. -type ContainerCommitConfig struct { - Pause bool - Repo string - Tag string - Author string - Comment string - // merge container config into commit config before commit - MergeConfigs bool - Config *container.Config -} - // ExecConfig is a small subset of the Config struct that holds the configuration // for the exec feature of docker. type ExecConfig struct { @@ -51,6 +37,7 @@ type ExecConfig struct { Detach bool // Execute in detach mode DetachKeys string // Escape keys for detach Env []string // Environment variables + WorkingDir string // Working directory Cmd []string // Execution commands and args } diff --git a/vendor/github.com/docker/docker/api/types/container/BUILD b/vendor/github.com/docker/docker/api/types/container/BUILD index ac7fe21c..917e5fd7 100644 --- a/vendor/github.com/docker/docker/api/types/container/BUILD +++ b/vendor/github.com/docker/docker/api/types/container/BUILD @@ -10,43 +10,11 @@ go_library( "container_update.go", "container_wait.go", "host_config.go", + "hostconfig_unix.go", + "hostconfig_windows.go", "waitcondition.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "hostconfig_unix.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "hostconfig_windows.go", - ], - "//conditions:default": [], - }), + ], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/container", importpath = "github.com/docker/docker/api/types/container", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/docker/docker/api/types/container/container_changes.go b/vendor/github.com/docker/docker/api/types/container/container_changes.go index 767945a5..c909d6ca 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_changes.go +++ b/vendor/github.com/docker/docker/api/types/container/container_changes.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerChangeResponseItem container change response item +// ContainerChangeResponseItem change item in response to ContainerChanges operation // swagger:model ContainerChangeResponseItem type ContainerChangeResponseItem struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_create.go b/vendor/github.com/docker/docker/api/types/container/container_create.go index c95023b8..49efa0f2 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_create.go +++ b/vendor/github.com/docker/docker/api/types/container/container_create.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerCreateCreatedBody container create created body +// ContainerCreateCreatedBody OK response to ContainerCreate operation // swagger:model ContainerCreateCreatedBody type ContainerCreateCreatedBody struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_top.go b/vendor/github.com/docker/docker/api/types/container/container_top.go index 78bc37ee..ba41edcf 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_top.go +++ b/vendor/github.com/docker/docker/api/types/container/container_top.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerTopOKBody container top o k body +// ContainerTopOKBody OK response to ContainerTop operation // swagger:model ContainerTopOKBody type ContainerTopOKBody struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_update.go b/vendor/github.com/docker/docker/api/types/container/container_update.go index 2339366f..7630ae54 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_update.go +++ b/vendor/github.com/docker/docker/api/types/container/container_update.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerUpdateOKBody container update o k body +// ContainerUpdateOKBody OK response to ContainerUpdate operation // swagger:model ContainerUpdateOKBody type ContainerUpdateOKBody struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_wait.go b/vendor/github.com/docker/docker/api/types/container/container_wait.go index 77ecdbaf..9e3910a6 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_wait.go +++ b/vendor/github.com/docker/docker/api/types/container/container_wait.go @@ -7,10 +7,22 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerWaitOKBody container wait o k body +// ContainerWaitOKBodyError container waiting error, if any +// swagger:model ContainerWaitOKBodyError +type ContainerWaitOKBodyError struct { + + // Details of an error + Message string `json:"Message,omitempty"` +} + +// ContainerWaitOKBody OK response to ContainerWait operation // swagger:model ContainerWaitOKBody type ContainerWaitOKBody struct { + // error + // Required: true + Error *ContainerWaitOKBodyError `json:"Error"` + // Exit code of the container // Required: true StatusCode int64 `json:"StatusCode"` diff --git a/vendor/github.com/docker/docker/api/types/container/host_config.go b/vendor/github.com/docker/docker/api/types/container/host_config.go index 9fea9eb0..930cf2de 100644 --- a/vendor/github.com/docker/docker/api/types/container/host_config.go +++ b/vendor/github.com/docker/docker/api/types/container/host_config.go @@ -20,44 +20,70 @@ func (i Isolation) IsDefault() bool { return strings.ToLower(string(i)) == "default" || string(i) == "" } +// IsHyperV indicates the use of a Hyper-V partition for isolation +func (i Isolation) IsHyperV() bool { + return strings.ToLower(string(i)) == "hyperv" +} + +// IsProcess indicates the use of process isolation +func (i Isolation) IsProcess() bool { + return strings.ToLower(string(i)) == "process" +} + +const ( + // IsolationEmpty is unspecified (same behavior as default) + IsolationEmpty = Isolation("") + // IsolationDefault is the default isolation mode on current daemon + IsolationDefault = Isolation("default") + // IsolationProcess is process isolation mode + IsolationProcess = Isolation("process") + // IsolationHyperV is HyperV isolation mode + IsolationHyperV = Isolation("hyperv") +) + // IpcMode represents the container ipc stack. type IpcMode string -// IsPrivate indicates whether the container uses its private ipc stack. +// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared. func (n IpcMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) + return n == "private" } -// IsHost indicates whether the container uses the host's ipc stack. +// IsHost indicates whether the container shares the host's ipc namespace. func (n IpcMode) IsHost() bool { return n == "host" } -// IsContainer indicates whether the container uses a container's ipc stack. +// IsShareable indicates whether the container's ipc namespace can be shared with another container. +func (n IpcMode) IsShareable() bool { + return n == "shareable" +} + +// IsContainer indicates whether the container uses another container's ipc namespace. func (n IpcMode) IsContainer() bool { parts := strings.SplitN(string(n), ":", 2) return len(parts) > 1 && parts[0] == "container" } -// Valid indicates whether the ipc stack is valid. +// IsNone indicates whether container IpcMode is set to "none". +func (n IpcMode) IsNone() bool { + return n == "none" +} + +// IsEmpty indicates whether container IpcMode is empty +func (n IpcMode) IsEmpty() bool { + return n == "" +} + +// Valid indicates whether the ipc mode is valid. func (n IpcMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - case "container": - if len(parts) != 2 || parts[1] == "" { - return false - } - default: - return false - } - return true + return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer() } // Container returns the name of the container ipc stack is going to be used. func (n IpcMode) Container() string { parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 { + if len(parts) > 1 && parts[0] == "container" { return parts[1] } return "" @@ -375,6 +401,12 @@ type HostConfig struct { // Mounts specs used by the container Mounts []mount.Mount `json:",omitempty"` + // MaskedPaths is the list of paths to be masked inside the container (this overrides the default set of paths) + MaskedPaths []string + + // ReadonlyPaths is the list of paths to be set as read-only inside the container (this overrides the default set of paths) + ReadonlyPaths []string + // Run a custom init inside the container, if null, use the daemon's configured settings Init *bool `json:",omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go index 469923f7..3374d737 100644 --- a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go @@ -1,9 +1,5 @@ package container -import ( - "strings" -) - // IsBridge indicates whether container uses the bridge network stack // in windows it is given the name NAT func (n NetworkMode) IsBridge() bool { @@ -21,16 +17,6 @@ func (n NetworkMode) IsUserDefined() bool { return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer() } -// IsHyperV indicates the use of a Hyper-V partition for isolation -func (i Isolation) IsHyperV() bool { - return strings.ToLower(string(i)) == "hyperv" -} - -// IsProcess indicates the use of process isolation -func (i Isolation) IsProcess() bool { - return strings.ToLower(string(i)) == "process" -} - // IsValid indicates if an isolation technology is valid func (i Isolation) IsValid() bool { return i.IsDefault() || i.IsHyperV() || i.IsProcess() diff --git a/vendor/github.com/docker/docker/api/types/filters/BUILD b/vendor/github.com/docker/docker/api/types/filters/BUILD index b1980dda..5bf1db9c 100644 --- a/vendor/github.com/docker/docker/api/types/filters/BUILD +++ b/vendor/github.com/docker/docker/api/types/filters/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["parse.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/filters", importpath = "github.com/docker/docker/api/types/filters", visibility = ["//visibility:public"], deps = ["//vendor/github.com/docker/docker/api/types/versions:go_default_library"], diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go index beec3d49..d45d0528 100644 --- a/vendor/github.com/docker/docker/api/types/filters/parse.go +++ b/vendor/github.com/docker/docker/api/types/filters/parse.go @@ -1,38 +1,45 @@ -// Package filters provides helper function to parse and handle command line -// filter, used for example in docker ps or docker images commands. +/*Package filters provides tools for encoding a mapping of keys to a set of +multiple values. +*/ package filters import ( "encoding/json" "errors" - "fmt" "regexp" "strings" "github.com/docker/docker/api/types/versions" ) -// Args stores filter arguments as map key:{map key: bool}. -// It contains an aggregation of the map of arguments (which are in the form -// of -f 'key=value') based on the key, and stores values for the same key -// in a map with string keys and boolean values. -// e.g given -f 'label=label1=1' -f 'label=label2=2' -f 'image.name=ubuntu' -// the args will be {"image.name":{"ubuntu":true},"label":{"label1=1":true,"label2=2":true}} +// Args stores a mapping of keys to a set of multiple values. type Args struct { fields map[string]map[string]bool } -// NewArgs initializes a new Args struct. -func NewArgs() Args { - return Args{fields: map[string]map[string]bool{}} +// KeyValuePair are used to initialize a new Args +type KeyValuePair struct { + Key string + Value string } -// ParseFlag parses the argument to the filter flag. Like -// -// `docker ps -f 'created=today' -f 'image.name=ubuntu*'` +// Arg creates a new KeyValuePair for initializing Args +func Arg(key, value string) KeyValuePair { + return KeyValuePair{Key: key, Value: value} +} + +// NewArgs returns a new Args populated with the initial args +func NewArgs(initialArgs ...KeyValuePair) Args { + args := Args{fields: map[string]map[string]bool{}} + for _, arg := range initialArgs { + args.Add(arg.Key, arg.Value) + } + return args +} + +// ParseFlag parses a key=value string and adds it to an Args. // -// If prev map is provided, then it is appended to, and returned. By default a new -// map is created. +// Deprecated: Use Args.Add() func ParseFlag(arg string, prev Args) (Args, error) { filters := prev if len(arg) == 0 { @@ -53,74 +60,95 @@ func ParseFlag(arg string, prev Args) (Args, error) { return filters, nil } -// ErrBadFormat is an error returned in case of bad format for a filter. +// ErrBadFormat is an error returned when a filter is not in the form key=value +// +// Deprecated: this error will be removed in a future version var ErrBadFormat = errors.New("bad format of filter (expected name=value)") -// ToParam packs the Args into a string for easy transport from client to server. +// ToParam encodes the Args as args JSON encoded string +// +// Deprecated: use ToJSON func ToParam(a Args) (string, error) { - // this way we don't URL encode {}, just empty space - if a.Len() == 0 { - return "", nil + return ToJSON(a) +} + +// MarshalJSON returns a JSON byte representation of the Args +func (args Args) MarshalJSON() ([]byte, error) { + if len(args.fields) == 0 { + return []byte{}, nil } + return json.Marshal(args.fields) +} - buf, err := json.Marshal(a.fields) - if err != nil { - return "", err +// ToJSON returns the Args as a JSON encoded string +func ToJSON(a Args) (string, error) { + if a.Len() == 0 { + return "", nil } - return string(buf), nil + buf, err := json.Marshal(a) + return string(buf), err } -// ToParamWithVersion packs the Args into a string for easy transport from client to server. -// The generated string will depend on the specified version (corresponding to the API version). +// ToParamWithVersion encodes Args as a JSON string. If version is less than 1.22 +// then the encoded format will use an older legacy format where the values are a +// list of strings, instead of a set. +// +// Deprecated: Use ToJSON func ToParamWithVersion(version string, a Args) (string, error) { - // this way we don't URL encode {}, just empty space if a.Len() == 0 { return "", nil } - // for daemons older than v1.10, filter must be of the form map[string][]string - var buf []byte - var err error if version != "" && versions.LessThan(version, "1.22") { - buf, err = json.Marshal(convertArgsToSlice(a.fields)) - } else { - buf, err = json.Marshal(a.fields) - } - if err != nil { - return "", err + buf, err := json.Marshal(convertArgsToSlice(a.fields)) + return string(buf), err } - return string(buf), nil + + return ToJSON(a) } -// FromParam unpacks the filter Args. +// FromParam decodes a JSON encoded string into Args +// +// Deprecated: use FromJSON func FromParam(p string) (Args, error) { - if len(p) == 0 { - return NewArgs(), nil + return FromJSON(p) +} + +// FromJSON decodes a JSON encoded string into Args +func FromJSON(p string) (Args, error) { + args := NewArgs() + + if p == "" { + return args, nil } - r := strings.NewReader(p) - d := json.NewDecoder(r) + raw := []byte(p) + err := json.Unmarshal(raw, &args) + if err == nil { + return args, nil + } - m := map[string]map[string]bool{} - if err := d.Decode(&m); err != nil { - r.Seek(0, 0) - - // Allow parsing old arguments in slice format. - // Because other libraries might be sending them in this format. - deprecated := map[string][]string{} - if deprecatedErr := d.Decode(&deprecated); deprecatedErr == nil { - m = deprecatedArgs(deprecated) - } else { - return NewArgs(), err - } + // Fallback to parsing arguments in the legacy slice format + deprecated := map[string][]string{} + if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil { + return args, err + } + + args.fields = deprecatedArgs(deprecated) + return args, nil +} + +// UnmarshalJSON populates the Args from JSON encode bytes +func (args Args) UnmarshalJSON(raw []byte) error { + if len(raw) == 0 { + return nil } - return Args{m}, nil + return json.Unmarshal(raw, &args.fields) } -// Get returns the list of values associates with a field. -// It returns a slice of strings to keep backwards compatibility with old code. -func (filters Args) Get(field string) []string { - values := filters.fields[field] +// Get returns the list of values associated with the key +func (args Args) Get(key string) []string { + values := args.fields[key] if values == nil { return make([]string, 0) } @@ -131,37 +159,34 @@ func (filters Args) Get(field string) []string { return slice } -// Add adds a new value to a filter field. -func (filters Args) Add(name, value string) { - if _, ok := filters.fields[name]; ok { - filters.fields[name][value] = true +// Add a new value to the set of values +func (args Args) Add(key, value string) { + if _, ok := args.fields[key]; ok { + args.fields[key][value] = true } else { - filters.fields[name] = map[string]bool{value: true} + args.fields[key] = map[string]bool{value: true} } } -// Del removes a value from a filter field. -func (filters Args) Del(name, value string) { - if _, ok := filters.fields[name]; ok { - delete(filters.fields[name], value) - if len(filters.fields[name]) == 0 { - delete(filters.fields, name) +// Del removes a value from the set +func (args Args) Del(key, value string) { + if _, ok := args.fields[key]; ok { + delete(args.fields[key], value) + if len(args.fields[key]) == 0 { + delete(args.fields, key) } } } -// Len returns the number of fields in the arguments. -func (filters Args) Len() int { - return len(filters.fields) +// Len returns the number of keys in the mapping +func (args Args) Len() int { + return len(args.fields) } -// MatchKVList returns true if the values for the specified field matches the ones -// from the sources. -// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, -// field is 'label' and sources are {'label1': '1', 'label2': '2'} -// it returns true. -func (filters Args) MatchKVList(field string, sources map[string]string) bool { - fieldValues := filters.fields[field] +// MatchKVList returns true if all the pairs in sources exist as key=value +// pairs in the mapping at key, or if there are no values at key. +func (args Args) MatchKVList(key string, sources map[string]string) bool { + fieldValues := args.fields[key] //do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { @@ -172,8 +197,8 @@ func (filters Args) MatchKVList(field string, sources map[string]string) bool { return false } - for name2match := range fieldValues { - testKV := strings.SplitN(name2match, "=", 2) + for value := range fieldValues { + testKV := strings.SplitN(value, "=", 2) v, ok := sources[testKV[0]] if !ok { @@ -187,16 +212,13 @@ func (filters Args) MatchKVList(field string, sources map[string]string) bool { return true } -// Match returns true if the values for the specified field matches the source string -// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, -// field is 'image.name' and source is 'ubuntu' -// it returns true. -func (filters Args) Match(field, source string) bool { - if filters.ExactMatch(field, source) { +// Match returns true if any of the values at key match the source string +func (args Args) Match(field, source string) bool { + if args.ExactMatch(field, source) { return true } - fieldValues := filters.fields[field] + fieldValues := args.fields[field] for name2match := range fieldValues { match, err := regexp.MatchString(name2match, source) if err != nil { @@ -209,9 +231,9 @@ func (filters Args) Match(field, source string) bool { return false } -// ExactMatch returns true if the source matches exactly one of the filters. -func (filters Args) ExactMatch(field, source string) bool { - fieldValues, ok := filters.fields[field] +// ExactMatch returns true if the source matches exactly one of the values. +func (args Args) ExactMatch(key, source string) bool { + fieldValues, ok := args.fields[key] //do not filter if there is no filter set or cannot determine filter if !ok || len(fieldValues) == 0 { return true @@ -221,14 +243,15 @@ func (filters Args) ExactMatch(field, source string) bool { return fieldValues[source] } -// UniqueExactMatch returns true if there is only one filter and the source matches exactly this one. -func (filters Args) UniqueExactMatch(field, source string) bool { - fieldValues := filters.fields[field] +// UniqueExactMatch returns true if there is only one value and the source +// matches exactly the value. +func (args Args) UniqueExactMatch(key, source string) bool { + fieldValues := args.fields[key] //do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { return true } - if len(filters.fields[field]) != 1 { + if len(args.fields[key]) != 1 { return false } @@ -236,14 +259,14 @@ func (filters Args) UniqueExactMatch(field, source string) bool { return fieldValues[source] } -// FuzzyMatch returns true if the source matches exactly one of the filters, -// or the source has one of the filters as a prefix. -func (filters Args) FuzzyMatch(field, source string) bool { - if filters.ExactMatch(field, source) { +// FuzzyMatch returns true if the source matches exactly one value, or the +// source has one of the values as a prefix. +func (args Args) FuzzyMatch(key, source string) bool { + if args.ExactMatch(key, source) { return true } - fieldValues := filters.fields[field] + fieldValues := args.fields[key] for prefix := range fieldValues { if strings.HasPrefix(source, prefix) { return true @@ -252,30 +275,47 @@ func (filters Args) FuzzyMatch(field, source string) bool { return false } -// Include returns true if the name of the field to filter is in the filters. -func (filters Args) Include(field string) bool { - _, ok := filters.fields[field] +// Include returns true if the key exists in the mapping +// +// Deprecated: use Contains +func (args Args) Include(field string) bool { + _, ok := args.fields[field] + return ok +} + +// Contains returns true if the key exists in the mapping +func (args Args) Contains(field string) bool { + _, ok := args.fields[field] return ok } -// Validate ensures that all the fields in the filter are valid. -// It returns an error as soon as it finds an invalid field. -func (filters Args) Validate(accepted map[string]bool) error { - for name := range filters.fields { +type invalidFilter string + +func (e invalidFilter) Error() string { + return "Invalid filter '" + string(e) + "'" +} + +func (invalidFilter) InvalidParameter() {} + +// Validate compared the set of accepted keys against the keys in the mapping. +// An error is returned if any mapping keys are not in the accepted set. +func (args Args) Validate(accepted map[string]bool) error { + for name := range args.fields { if !accepted[name] { - return fmt.Errorf("Invalid filter '%s'", name) + return invalidFilter(name) } } return nil } -// WalkValues iterates over the list of filtered values for a field. -// It stops the iteration if it finds an error and it returns that error. -func (filters Args) WalkValues(field string, op func(value string) error) error { - if _, ok := filters.fields[field]; !ok { +// WalkValues iterates over the list of values for a key in the mapping and calls +// op() for each value. If op returns an error the iteration stops and the +// error is returned. +func (args Args) WalkValues(field string, op func(value string) error) error { + if _, ok := args.fields[field]; !ok { return nil } - for v := range filters.fields[field] { + for v := range args.fields[field] { if err := op(v); err != nil { return err } diff --git a/vendor/github.com/docker/docker/api/types/image/BUILD b/vendor/github.com/docker/docker/api/types/image/BUILD index d2bd229a..1a385bd2 100644 --- a/vendor/github.com/docker/docker/api/types/image/BUILD +++ b/vendor/github.com/docker/docker/api/types/image/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["image_history.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/image", importpath = "github.com/docker/docker/api/types/image", visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/docker/docker/api/types/image/image_history.go b/vendor/github.com/docker/docker/api/types/image/image_history.go index 0dd30c72..d6b354bc 100644 --- a/vendor/github.com/docker/docker/api/types/image/image_history.go +++ b/vendor/github.com/docker/docker/api/types/image/image_history.go @@ -7,7 +7,7 @@ package image // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// HistoryResponseItem history response item +// HistoryResponseItem individual image layer information in response to ImageHistory operation // swagger:model HistoryResponseItem type HistoryResponseItem struct { diff --git a/vendor/github.com/docker/docker/api/types/plugin.go b/vendor/github.com/docker/docker/api/types/plugin.go index cab333e0..abae48b9 100644 --- a/vendor/github.com/docker/docker/api/types/plugin.go +++ b/vendor/github.com/docker/docker/api/types/plugin.go @@ -121,6 +121,9 @@ type PluginConfigArgs struct { // swagger:model PluginConfigInterface type PluginConfigInterface struct { + // Protocol to use for clients connecting to the plugin. + ProtocolScheme string `json:"ProtocolScheme,omitempty"` + // socket // Required: true Socket string `json:"Socket"` diff --git a/vendor/github.com/docker/docker/api/types/port.go b/vendor/github.com/docker/docker/api/types/port.go index ad52d46d..d9123474 100644 --- a/vendor/github.com/docker/docker/api/types/port.go +++ b/vendor/github.com/docker/docker/api/types/port.go @@ -7,7 +7,7 @@ package types // swagger:model Port type Port struct { - // IP + // Host IP address that the container's port is mapped to IP string `json:"IP,omitempty"` // Port on the container diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go index f7ac7729..7814e6b9 100644 --- a/vendor/github.com/docker/docker/api/types/types.go +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -107,9 +107,21 @@ type Ping struct { Experimental bool } +// ComponentVersion describes the version information for a specific component. +type ComponentVersion struct { + Name string + Version string + Details map[string]string `json:",omitempty"` +} + // Version contains response of Engine API: // GET "/version" type Version struct { + Platform struct{ Name string } `json:",omitempty"` + Components []ComponentVersion `json:",omitempty"` + + // The following fields are deprecated, they relate to the Engine component and are kept for backwards compatibility + Version string APIVersion string `json:"ApiVersion"` MinAPIVersion string `json:"MinAPIVersion,omitempty"` diff --git a/vendor/github.com/docker/docker/api/types/volume/BUILD b/vendor/github.com/docker/docker/api/types/volume/BUILD index 565b8b52..1d021e2a 100644 --- a/vendor/github.com/docker/docker/api/types/volume/BUILD +++ b/vendor/github.com/docker/docker/api/types/volume/BUILD @@ -3,9 +3,10 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ - "volumes_create.go", - "volumes_list.go", + "volume_create.go", + "volume_list.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/volume", importpath = "github.com/docker/docker/api/types/volume", visibility = ["//visibility:public"], deps = ["//vendor/github.com/docker/docker/api/types:go_default_library"], diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_create.go b/vendor/github.com/docker/docker/api/types/volume/volume_create.go similarity index 88% rename from vendor/github.com/docker/docker/api/types/volume/volumes_create.go rename to vendor/github.com/docker/docker/api/types/volume/volume_create.go index 9f70e43c..539e9b97 100644 --- a/vendor/github.com/docker/docker/api/types/volume/volumes_create.go +++ b/vendor/github.com/docker/docker/api/types/volume/volume_create.go @@ -7,9 +7,9 @@ package volume // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// VolumesCreateBody volumes create body -// swagger:model VolumesCreateBody -type VolumesCreateBody struct { +// VolumeCreateBody +// swagger:model VolumeCreateBody +type VolumeCreateBody struct { // Name of the volume driver to use. // Required: true diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_list.go b/vendor/github.com/docker/docker/api/types/volume/volume_list.go similarity index 83% rename from vendor/github.com/docker/docker/api/types/volume/volumes_list.go rename to vendor/github.com/docker/docker/api/types/volume/volume_list.go index 833dad93..1bb279db 100644 --- a/vendor/github.com/docker/docker/api/types/volume/volumes_list.go +++ b/vendor/github.com/docker/docker/api/types/volume/volume_list.go @@ -9,9 +9,9 @@ package volume import "github.com/docker/docker/api/types" -// VolumesListOKBody volumes list o k body -// swagger:model VolumesListOKBody -type VolumesListOKBody struct { +// VolumeListOKBody +// swagger:model VolumeListOKBody +type VolumeListOKBody struct { // List of volumes // Required: true diff --git a/vendor/github.com/docker/docker/client/BUILD b/vendor/github.com/docker/docker/client/BUILD index 0201de78..cfc15a7e 100644 --- a/vendor/github.com/docker/docker/client/BUILD +++ b/vendor/github.com/docker/docker/client/BUILD @@ -8,6 +8,8 @@ go_library( "checkpoint_delete.go", "checkpoint_list.go", "client.go", + "client_unix.go", + "client_windows.go", "config_create.go", "config_inspect.go", "config_list.go", @@ -72,7 +74,6 @@ go_library( "node_list.go", "node_remove.go", "node_update.go", - "parse_logs.go", "ping.go", "plugin_create.go", "plugin_disable.go", @@ -115,27 +116,8 @@ go_library( "volume_list.go", "volume_prune.go", "volume_remove.go", - ] + select({ - "@io_bazel_rules_go//go/platform:darwin": [ - "client_unix.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "client_unix.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "client_unix.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "client_unix.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "client_unix.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "client_windows.go", - ], - "//conditions:default": [], - }), + ], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/client", importpath = "github.com/docker/docker/client", visibility = ["//visibility:public"], deps = [ @@ -152,12 +134,10 @@ go_library( "//vendor/github.com/docker/docker/api/types/time:go_default_library", "//vendor/github.com/docker/docker/api/types/versions:go_default_library", "//vendor/github.com/docker/docker/api/types/volume:go_default_library", - "//vendor/github.com/docker/docker/pkg/tlsconfig:go_default_library", "//vendor/github.com/docker/go-connections/sockets:go_default_library", "//vendor/github.com/docker/go-connections/tlsconfig:go_default_library", "//vendor/github.com/opencontainers/go-digest:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", ], ) diff --git a/vendor/github.com/docker/docker/client/build_prune.go b/vendor/github.com/docker/docker/client/build_prune.go index ccab115d..538fa99c 100644 --- a/vendor/github.com/docker/docker/client/build_prune.go +++ b/vendor/github.com/docker/docker/client/build_prune.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // BuildCachePrune requests the daemon to delete unused cache data diff --git a/vendor/github.com/docker/docker/client/checkpoint_create.go b/vendor/github.com/docker/docker/client/checkpoint_create.go index 0effe498..dcac35e1 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_create.go +++ b/vendor/github.com/docker/docker/client/checkpoint_create.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // CheckpointCreate creates a checkpoint from the given container with the given name diff --git a/vendor/github.com/docker/docker/client/checkpoint_delete.go b/vendor/github.com/docker/docker/client/checkpoint_delete.go index e6e75588..0552dbfa 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_delete.go +++ b/vendor/github.com/docker/docker/client/checkpoint_delete.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // CheckpointDelete deletes the checkpoint with the given name from the given container diff --git a/vendor/github.com/docker/docker/client/checkpoint_list.go b/vendor/github.com/docker/docker/client/checkpoint_list.go index ffe44bc9..6d5c5023 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_list.go +++ b/vendor/github.com/docker/docker/client/checkpoint_list.go @@ -1,12 +1,11 @@ package client import ( + "context" "encoding/json" - "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // CheckpointList returns the checkpoints of the given container in the docker host @@ -20,10 +19,7 @@ func (cli *Client) CheckpointList(ctx context.Context, container string, options resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return checkpoints, containerNotFoundError{container} - } - return checkpoints, err + return checkpoints, wrapResponseError(err, resp, "container", container) } err = json.NewDecoder(resp.body).Decode(&checkpoints) diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go index 7e145317..65397788 100644 --- a/vendor/github.com/docker/docker/client/client.go +++ b/vendor/github.com/docker/docker/client/client.go @@ -1,10 +1,6 @@ /* Package client is a Go client for the Docker Engine API. -The "docker" command uses this package to communicate with the daemon. It can also -be used by your own Go applications to do anything the command-line interface does -- running containers, pulling images, managing swarms, etc. - For more information about the Engine API, see the documentation: https://docs.docker.com/engine/reference/api/ @@ -46,11 +42,13 @@ For example, to list running containers (the equivalent of "docker ps"): package client import ( - "errors" + "context" "fmt" + "net" "net/http" "net/url" "os" + "path" "path/filepath" "strings" @@ -59,7 +57,7 @@ import ( "github.com/docker/docker/api/types/versions" "github.com/docker/go-connections/sockets" "github.com/docker/go-connections/tlsconfig" - "golang.org/x/net/context" + "github.com/pkg/errors" ) // ErrRedirect is the error returned by checkRedirect when the request is non-GET. @@ -106,12 +104,21 @@ func CheckRedirect(req *http.Request, via []*http.Request) error { } // NewEnvClient initializes a new API client based on environment variables. -// Use DOCKER_HOST to set the url to the docker server. -// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. -// Use DOCKER_CERT_PATH to load the TLS certificates from. -// Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. +// See FromEnv for a list of support environment variables. +// +// Deprecated: use NewClientWithOpts(FromEnv) func NewEnvClient() (*Client, error) { - var client *http.Client + return NewClientWithOpts(FromEnv) +} + +// FromEnv configures the client with values from environment variables. +// +// Supported environment variables: +// DOCKER_HOST to set the url to the docker server. +// DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. +// DOCKER_CERT_PATH to load the TLS certificates from. +// DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. +func FromEnv(c *Client) error { if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" { options := tlsconfig.Options{ CAFile: filepath.Join(dockerCertPath, "ca.pem"), @@ -121,95 +128,178 @@ func NewEnvClient() (*Client, error) { } tlsc, err := tlsconfig.Client(options) if err != nil { - return nil, err + return err } - client = &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: tlsc, - }, + c.client = &http.Client{ + Transport: &http.Transport{TLSClientConfig: tlsc}, CheckRedirect: CheckRedirect, } } - host := os.Getenv("DOCKER_HOST") - if host == "" { - host = DefaultDockerHost + if host := os.Getenv("DOCKER_HOST"); host != "" { + if err := WithHost(host)(c); err != nil { + return err + } } - version := os.Getenv("DOCKER_API_VERSION") - if version == "" { - version = api.DefaultVersion + + if version := os.Getenv("DOCKER_API_VERSION"); version != "" { + c.version = version + c.manualOverride = true } + return nil +} - cli, err := NewClient(host, version, client, nil) - if err != nil { - return cli, err +// WithTLSClientConfig applies a tls config to the client transport. +func WithTLSClientConfig(cacertPath, certPath, keyPath string) func(*Client) error { + return func(c *Client) error { + opts := tlsconfig.Options{ + CAFile: cacertPath, + CertFile: certPath, + KeyFile: keyPath, + ExclusiveRootPools: true, + } + config, err := tlsconfig.Client(opts) + if err != nil { + return errors.Wrap(err, "failed to create tls config") + } + if transport, ok := c.client.Transport.(*http.Transport); ok { + transport.TLSClientConfig = config + return nil + } + return errors.Errorf("cannot apply tls config to transport: %T", c.client.Transport) + } +} + +// WithDialer applies the dialer.DialContext to the client transport. This can be +// used to set the Timeout and KeepAlive settings of the client. +func WithDialer(dialer *net.Dialer) func(*Client) error { + return func(c *Client) error { + if transport, ok := c.client.Transport.(*http.Transport); ok { + transport.DialContext = dialer.DialContext + return nil + } + return errors.Errorf("cannot apply dialer to transport: %T", c.client.Transport) } - if os.Getenv("DOCKER_API_VERSION") != "" { - cli.manualOverride = true +} + +// WithVersion overrides the client version with the specified one +func WithVersion(version string) func(*Client) error { + return func(c *Client) error { + c.version = version + return nil } - return cli, nil } -// NewClient initializes a new API client for the given host and API version. -// It uses the given http client as transport. +// WithHost overrides the client host with the specified one. +func WithHost(host string) func(*Client) error { + return func(c *Client) error { + hostURL, err := ParseHostURL(host) + if err != nil { + return err + } + c.host = host + c.proto = hostURL.Scheme + c.addr = hostURL.Host + c.basePath = hostURL.Path + if transport, ok := c.client.Transport.(*http.Transport); ok { + return sockets.ConfigureTransport(transport, c.proto, c.addr) + } + return errors.Errorf("cannot apply host to transport: %T", c.client.Transport) + } +} + +// WithHTTPClient overrides the client http client with the specified one +func WithHTTPClient(client *http.Client) func(*Client) error { + return func(c *Client) error { + if client != nil { + c.client = client + } + return nil + } +} + +// WithHTTPHeaders overrides the client default http headers +func WithHTTPHeaders(headers map[string]string) func(*Client) error { + return func(c *Client) error { + c.customHTTPHeaders = headers + return nil + } +} + +// NewClientWithOpts initializes a new API client with default values. It takes functors +// to modify values when creating it, like `NewClientWithOpts(WithVersion(…))` // It also initializes the custom http headers to add to each request. // // It won't send any version information if the version number is empty. It is // highly recommended that you set a version or your client may break if the // server is upgraded. -func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) { - proto, addr, basePath, err := ParseHost(host) +func NewClientWithOpts(ops ...func(*Client) error) (*Client, error) { + client, err := defaultHTTPClient(DefaultDockerHost) if err != nil { return nil, err } + c := &Client{ + host: DefaultDockerHost, + version: api.DefaultVersion, + scheme: "http", + client: client, + proto: defaultProto, + addr: defaultAddr, + } - if client != nil { - if _, ok := client.Transport.(*http.Transport); !ok { - return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", client.Transport) - } - } else { - transport := new(http.Transport) - sockets.ConfigureTransport(transport, proto, addr) - client = &http.Client{ - Transport: transport, - CheckRedirect: CheckRedirect, + for _, op := range ops { + if err := op(c); err != nil { + return nil, err } } - scheme := "http" - tlsConfig := resolveTLSConfig(client.Transport) + if _, ok := c.client.Transport.(http.RoundTripper); !ok { + return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", c.client.Transport) + } + tlsConfig := resolveTLSConfig(c.client.Transport) if tlsConfig != nil { // TODO(stevvooe): This isn't really the right way to write clients in Go. // `NewClient` should probably only take an `*http.Client` and work from there. // Unfortunately, the model of having a host-ish/url-thingy as the connection // string has us confusing protocol and transport layers. We continue doing // this to avoid breaking existing clients but this should be addressed. - scheme = "https" + c.scheme = "https" } - return &Client{ - scheme: scheme, - host: host, - proto: proto, - addr: addr, - basePath: basePath, - client: client, - version: version, - customHTTPHeaders: httpHeaders, + return c, nil +} + +func defaultHTTPClient(host string) (*http.Client, error) { + url, err := ParseHostURL(host) + if err != nil { + return nil, err + } + transport := new(http.Transport) + sockets.ConfigureTransport(transport, url.Scheme, url.Host) + return &http.Client{ + Transport: transport, + CheckRedirect: CheckRedirect, }, nil } -// Close ensures that transport.Client is closed -// especially needed while using NewClient with *http.Client = nil -// for example -// client.NewClient("unix:///var/run/docker.sock", nil, "v1.18", map[string]string{"User-Agent": "engine-api-cli-1.0"}) -func (cli *Client) Close() error { +// NewClient initializes a new API client for the given host and API version. +// It uses the given http client as transport. +// It also initializes the custom http headers to add to each request. +// +// It won't send any version information if the version number is empty. It is +// highly recommended that you set a version or your client may break if the +// server is upgraded. +// Deprecated: use NewClientWithOpts +func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) { + return NewClientWithOpts(WithHost(host), WithVersion(version), WithHTTPClient(client), WithHTTPHeaders(httpHeaders)) +} +// Close the transport used by the client +func (cli *Client) Close() error { if t, ok := cli.client.Transport.(*http.Transport); ok { t.CloseIdleConnections() } - return nil } @@ -219,37 +309,27 @@ func (cli *Client) getAPIPath(p string, query url.Values) string { var apiPath string if cli.version != "" { v := strings.TrimPrefix(cli.version, "v") - apiPath = cli.basePath + "/v" + v + p + apiPath = path.Join(cli.basePath, "/v"+v, p) } else { - apiPath = cli.basePath + p - } - - u := &url.URL{ - Path: apiPath, - } - if len(query) > 0 { - u.RawQuery = query.Encode() + apiPath = path.Join(cli.basePath, p) } - return u.String() + return (&url.URL{Path: apiPath, RawQuery: query.Encode()}).String() } -// ClientVersion returns the version string associated with this -// instance of the Client. Note that this value can be changed -// via the DOCKER_API_VERSION env var. -// This operation doesn't acquire a mutex. +// ClientVersion returns the API version used by this client. func (cli *Client) ClientVersion() string { return cli.version } -// NegotiateAPIVersion updates the version string associated with this -// instance of the Client to match the latest version the server supports +// NegotiateAPIVersion queries the API and updates the version to match the +// API version. Any errors are silently ignored. func (cli *Client) NegotiateAPIVersion(ctx context.Context) { ping, _ := cli.Ping(ctx) cli.NegotiateAPIVersionPing(ping) } -// NegotiateAPIVersionPing updates the version string associated with this -// instance of the Client to match the latest version the server supports +// NegotiateAPIVersionPing updates the client version to match the Ping.APIVersion +// if the ping version is less than the default version. func (cli *Client) NegotiateAPIVersionPing(p types.Ping) { if cli.manualOverride { return @@ -265,23 +345,28 @@ func (cli *Client) NegotiateAPIVersionPing(p types.Ping) { cli.version = api.DefaultVersion } - // if server version is lower than the maximum version supported by the Client, downgrade - if versions.LessThan(p.APIVersion, api.DefaultVersion) { + // if server version is lower than the client version, downgrade + if versions.LessThan(p.APIVersion, cli.version) { cli.version = p.APIVersion } } -// DaemonHost returns the host associated with this instance of the Client. -// This operation doesn't acquire a mutex. +// DaemonHost returns the host address used by the client func (cli *Client) DaemonHost() string { return cli.host } -// ParseHost verifies that the given host strings is valid. -func ParseHost(host string) (string, string, string, error) { +// HTTPClient returns a copy of the HTTP client bound to the server +func (cli *Client) HTTPClient() *http.Client { + return &*cli.client +} + +// ParseHostURL parses a url string, validates the string is a host url, and +// returns the parsed URL +func ParseHostURL(host string) (*url.URL, error) { protoAddrParts := strings.SplitN(host, "://", 2) if len(protoAddrParts) == 1 { - return "", "", "", fmt.Errorf("unable to parse docker host `%s`", host) + return nil, fmt.Errorf("unable to parse docker host `%s`", host) } var basePath string @@ -289,16 +374,19 @@ func ParseHost(host string) (string, string, string, error) { if proto == "tcp" { parsed, err := url.Parse("tcp://" + addr) if err != nil { - return "", "", "", err + return nil, err } addr = parsed.Host basePath = parsed.Path } - return proto, addr, basePath, nil + return &url.URL{ + Scheme: proto, + Host: addr, + Path: basePath, + }, nil } -// CustomHTTPHeaders returns the custom http headers associated with this -// instance of the Client. This operation doesn't acquire a mutex. +// CustomHTTPHeaders returns the custom http headers stored by the client. func (cli *Client) CustomHTTPHeaders() map[string]string { m := make(map[string]string) for k, v := range cli.customHTTPHeaders { @@ -307,8 +395,8 @@ func (cli *Client) CustomHTTPHeaders() map[string]string { return m } -// SetCustomHTTPHeaders updates the custom http headers associated with this -// instance of the Client. This operation doesn't acquire a mutex. +// SetCustomHTTPHeaders that will be set on every HTTP request made by the client. +// Deprecated: use WithHTTPHeaders when creating the client. func (cli *Client) SetCustomHTTPHeaders(headers map[string]string) { cli.customHTTPHeaders = headers } diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/vendor/github.com/docker/docker/client/client_unix.go index 89de892c..f5c357ca 100644 --- a/vendor/github.com/docker/docker/client/client_unix.go +++ b/vendor/github.com/docker/docker/client/client_unix.go @@ -1,6 +1,9 @@ -// +build linux freebsd solaris openbsd darwin +// +build linux freebsd openbsd darwin package client // DefaultDockerHost defines os specific default if DOCKER_HOST is unset const DefaultDockerHost = "unix:///var/run/docker.sock" + +const defaultProto = "unix" +const defaultAddr = "/var/run/docker.sock" diff --git a/vendor/github.com/docker/docker/client/client_windows.go b/vendor/github.com/docker/docker/client/client_windows.go index 07c0c7a7..5619cef4 100644 --- a/vendor/github.com/docker/docker/client/client_windows.go +++ b/vendor/github.com/docker/docker/client/client_windows.go @@ -2,3 +2,6 @@ package client // DefaultDockerHost defines os specific default if DOCKER_HOST is unset const DefaultDockerHost = "npipe:////./pipe/docker_engine" + +const defaultProto = "npipe" +const defaultAddr = "//./pipe/docker_engine" diff --git a/vendor/github.com/docker/docker/client/config_create.go b/vendor/github.com/docker/docker/client/config_create.go index bc4a952b..8dec11ba 100644 --- a/vendor/github.com/docker/docker/client/config_create.go +++ b/vendor/github.com/docker/docker/client/config_create.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigCreate creates a new Config. diff --git a/vendor/github.com/docker/docker/client/config_inspect.go b/vendor/github.com/docker/docker/client/config_inspect.go index ebb6d636..42fce272 100644 --- a/vendor/github.com/docker/docker/client/config_inspect.go +++ b/vendor/github.com/docker/docker/client/config_inspect.go @@ -2,25 +2,24 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigInspectWithRaw returns the config information with raw data func (cli *Client) ConfigInspectWithRaw(ctx context.Context, id string) (swarm.Config, []byte, error) { + if id == "" { + return swarm.Config{}, nil, objectNotFoundError{object: "config", id: id} + } if err := cli.NewVersionError("1.30", "config inspect"); err != nil { return swarm.Config{}, nil, err } resp, err := cli.get(ctx, "/configs/"+id, nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return swarm.Config{}, nil, configNotFoundError{id} - } - return swarm.Config{}, nil, err + return swarm.Config{}, nil, wrapResponseError(err, resp, "config", id) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/config_list.go b/vendor/github.com/docker/docker/client/config_list.go index 8483ca14..95131d77 100644 --- a/vendor/github.com/docker/docker/client/config_list.go +++ b/vendor/github.com/docker/docker/client/config_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigList returns the list of configs. @@ -18,7 +18,7 @@ func (cli *Client) ConfigList(ctx context.Context, options types.ConfigListOptio query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/config_remove.go b/vendor/github.com/docker/docker/client/config_remove.go index 726b5c85..0288630c 100644 --- a/vendor/github.com/docker/docker/client/config_remove.go +++ b/vendor/github.com/docker/docker/client/config_remove.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // ConfigRemove removes a Config. func (cli *Client) ConfigRemove(ctx context.Context, id string) error { @@ -9,5 +9,5 @@ func (cli *Client) ConfigRemove(ctx context.Context, id string) error { } resp, err := cli.delete(ctx, "/configs/"+id, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "config", id) } diff --git a/vendor/github.com/docker/docker/client/config_update.go b/vendor/github.com/docker/docker/client/config_update.go index 823751bb..861a5cf5 100644 --- a/vendor/github.com/docker/docker/client/config_update.go +++ b/vendor/github.com/docker/docker/client/config_update.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigUpdate attempts to update a Config diff --git a/vendor/github.com/docker/docker/client/container_attach.go b/vendor/github.com/docker/docker/client/container_attach.go index 0fdf3ed0..f140856b 100644 --- a/vendor/github.com/docker/docker/client/container_attach.go +++ b/vendor/github.com/docker/docker/client/container_attach.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerAttach attaches a connection to a container in the server. diff --git a/vendor/github.com/docker/docker/client/container_commit.go b/vendor/github.com/docker/docker/client/container_commit.go index 531d796e..cc38faca 100644 --- a/vendor/github.com/docker/docker/client/container_commit.go +++ b/vendor/github.com/docker/docker/client/container_commit.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "errors" "net/url" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerCommit applies changes into a container and creates a new tagged image. @@ -39,7 +39,7 @@ func (cli *Client) ContainerCommit(ctx context.Context, container string, option for _, change := range options.Changes { query.Add("changes", change) } - if options.Pause != true { + if !options.Pause { query.Set("pause", "0") } diff --git a/vendor/github.com/docker/docker/client/container_copy.go b/vendor/github.com/docker/docker/client/container_copy.go index 30ba6803..4c221dfb 100644 --- a/vendor/github.com/docker/docker/client/container_copy.go +++ b/vendor/github.com/docker/docker/client/container_copy.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/base64" "encoding/json" "fmt" @@ -10,8 +11,6 @@ import ( "path/filepath" "strings" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" ) @@ -23,17 +22,17 @@ func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path stri urlStr := "/containers/" + containerID + "/archive" response, err := cli.head(ctx, urlStr, query, nil) if err != nil { - return types.ContainerPathStat{}, err + return types.ContainerPathStat{}, wrapResponseError(err, response, "container:path", containerID+":"+path) } defer ensureReaderClosed(response) return getContainerPathStatFromHeader(response.header) } // CopyToContainer copies content into the container filesystem. -// Note that `content` must be a Reader for a TAR -func (cli *Client) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error { +// Note that `content` must be a Reader for a TAR archive +func (cli *Client) CopyToContainer(ctx context.Context, containerID, dstPath string, content io.Reader, options types.CopyToContainerOptions) error { query := url.Values{} - query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. + query.Set("path", filepath.ToSlash(dstPath)) // Normalize the paths used in the API. // Do not allow for an existing directory to be overwritten by a non-directory and vice versa. if !options.AllowOverwriteDirWithFile { query.Set("noOverwriteDirNonDir", "true") @@ -43,11 +42,11 @@ func (cli *Client) CopyToContainer(ctx context.Context, container, path string, query.Set("copyUIDGID", "true") } - apiPath := "/containers/" + container + "/archive" + apiPath := "/containers/" + containerID + "/archive" response, err := cli.putRaw(ctx, apiPath, query, content, nil) if err != nil { - return err + return wrapResponseError(err, response, "container:path", containerID+":"+dstPath) } defer ensureReaderClosed(response) @@ -59,15 +58,15 @@ func (cli *Client) CopyToContainer(ctx context.Context, container, path string, } // CopyFromContainer gets the content from the container and returns it as a Reader -// to manipulate it in the host. It's up to the caller to close the reader. -func (cli *Client) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) { +// for a TAR archive to manipulate it in the host. It's up to the caller to close the reader. +func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) { query := make(url.Values, 1) query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API. - apiPath := "/containers/" + container + "/archive" + apiPath := "/containers/" + containerID + "/archive" response, err := cli.get(ctx, apiPath, query, nil) if err != nil { - return nil, types.ContainerPathStat{}, err + return nil, types.ContainerPathStat{}, wrapResponseError(err, response, "container:path", containerID+":"+srcPath) } if response.statusCode != http.StatusOK { diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go index 6841b0b2..7f1ce014 100644 --- a/vendor/github.com/docker/docker/client/container_create.go +++ b/vendor/github.com/docker/docker/client/container_create.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/json" "net/url" "strings" @@ -8,7 +9,6 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" ) type configWrapper struct { @@ -45,7 +45,7 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config serverResp, err := cli.post(ctx, "/containers/create", query, body, nil) if err != nil { if serverResp.statusCode == 404 && strings.Contains(err.Error(), "No such image") { - return response, imageNotFoundError{config.Image} + return response, objectNotFoundError{object: "image", id: config.Image} } return response, err } diff --git a/vendor/github.com/docker/docker/client/container_diff.go b/vendor/github.com/docker/docker/client/container_diff.go index 884dc9fe..056a282d 100644 --- a/vendor/github.com/docker/docker/client/container_diff.go +++ b/vendor/github.com/docker/docker/client/container_diff.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types/container" - "golang.org/x/net/context" ) // ContainerDiff shows differences in a container filesystem since it was started. diff --git a/vendor/github.com/docker/docker/client/container_exec.go b/vendor/github.com/docker/docker/client/container_exec.go index 0665c54f..9df1fae1 100644 --- a/vendor/github.com/docker/docker/client/container_exec.go +++ b/vendor/github.com/docker/docker/client/container_exec.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerExecCreate creates a new exec configuration to run an exec process. @@ -35,7 +35,7 @@ func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config // It returns a types.HijackedConnection with the hijacked connection // and the a reader to get output. It's up to the called to close // the hijacked connection by calling types.HijackedResponse.Close. -func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) { +func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) { headers := map[string][]string{"Content-Type": {"application/json"}} return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers) } diff --git a/vendor/github.com/docker/docker/client/container_export.go b/vendor/github.com/docker/docker/client/container_export.go index 52194f3d..35ee07d3 100644 --- a/vendor/github.com/docker/docker/client/container_export.go +++ b/vendor/github.com/docker/docker/client/container_export.go @@ -1,10 +1,9 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" ) // ContainerExport retrieves the raw contents of a container diff --git a/vendor/github.com/docker/docker/client/container_inspect.go b/vendor/github.com/docker/docker/client/container_inspect.go index 17f18097..92164e35 100644 --- a/vendor/github.com/docker/docker/client/container_inspect.go +++ b/vendor/github.com/docker/docker/client/container_inspect.go @@ -2,23 +2,22 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerInspect returns the container information. func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) { + if containerID == "" { + return types.ContainerJSON{}, objectNotFoundError{object: "container", id: containerID} + } serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ContainerJSON{}, containerNotFoundError{containerID} - } - return types.ContainerJSON{}, err + return types.ContainerJSON{}, wrapResponseError(err, serverResp, "container", containerID) } var response types.ContainerJSON @@ -29,16 +28,16 @@ func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (ty // ContainerInspectWithRaw returns the container information and its raw representation. func (cli *Client) ContainerInspectWithRaw(ctx context.Context, containerID string, getSize bool) (types.ContainerJSON, []byte, error) { + if containerID == "" { + return types.ContainerJSON{}, nil, objectNotFoundError{object: "container", id: containerID} + } query := url.Values{} if getSize { query.Set("size", "1") } serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ContainerJSON{}, nil, containerNotFoundError{containerID} - } - return types.ContainerJSON{}, nil, err + return types.ContainerJSON{}, nil, wrapResponseError(err, serverResp, "container", containerID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/container_kill.go b/vendor/github.com/docker/docker/client/container_kill.go index 29f80c73..83dc9317 100644 --- a/vendor/github.com/docker/docker/client/container_kill.go +++ b/vendor/github.com/docker/docker/client/container_kill.go @@ -1,9 +1,8 @@ package client import ( + "context" "net/url" - - "golang.org/x/net/context" ) // ContainerKill terminates the container process but does not remove the container from the docker host. diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go index 43989121..ecee3dd5 100644 --- a/vendor/github.com/docker/docker/client/container_list.go +++ b/vendor/github.com/docker/docker/client/container_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "strconv" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // ContainerList returns the list of containers in the docker host. diff --git a/vendor/github.com/docker/docker/client/container_logs.go b/vendor/github.com/docker/docker/client/container_logs.go index 0f32e9f1..58ebda7c 100644 --- a/vendor/github.com/docker/docker/client/container_logs.go +++ b/vendor/github.com/docker/docker/client/container_logs.go @@ -1,14 +1,14 @@ package client import ( + "context" "io" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" timetypes "github.com/docker/docker/api/types/time" + "github.com/pkg/errors" ) // ContainerLogs returns the logs generated by a container in an io.ReadCloser. @@ -46,11 +46,19 @@ func (cli *Client) ContainerLogs(ctx context.Context, container string, options if options.Since != "" { ts, err := timetypes.GetTimestamp(options.Since, time.Now()) if err != nil { - return nil, err + return nil, errors.Wrap(err, `invalid value for "since"`) } query.Set("since", ts) } + if options.Until != "" { + ts, err := timetypes.GetTimestamp(options.Until, time.Now()) + if err != nil { + return nil, errors.Wrap(err, `invalid value for "until"`) + } + query.Set("until", ts) + } + if options.Timestamps { query.Set("timestamps", "1") } @@ -66,7 +74,7 @@ func (cli *Client) ContainerLogs(ctx context.Context, container string, options resp, err := cli.get(ctx, "/containers/"+container+"/logs", query, nil) if err != nil { - return nil, err + return nil, wrapResponseError(err, resp, "container", container) } return resp.body, nil } diff --git a/vendor/github.com/docker/docker/client/container_pause.go b/vendor/github.com/docker/docker/client/container_pause.go index 412067a7..5b2f46c3 100644 --- a/vendor/github.com/docker/docker/client/container_pause.go +++ b/vendor/github.com/docker/docker/client/container_pause.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // ContainerPause pauses the main process of a given container without terminating it. func (cli *Client) ContainerPause(ctx context.Context, containerID string) error { diff --git a/vendor/github.com/docker/docker/client/container_prune.go b/vendor/github.com/docker/docker/client/container_prune.go index b5821708..9f25e9c5 100644 --- a/vendor/github.com/docker/docker/client/container_prune.go +++ b/vendor/github.com/docker/docker/client/container_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // ContainersPrune requests the daemon to delete unused data diff --git a/vendor/github.com/docker/docker/client/container_remove.go b/vendor/github.com/docker/docker/client/container_remove.go index 3a79590c..d1c682b8 100644 --- a/vendor/github.com/docker/docker/client/container_remove.go +++ b/vendor/github.com/docker/docker/client/container_remove.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerRemove kills and removes a container from the docker host. @@ -23,5 +23,5 @@ func (cli *Client) ContainerRemove(ctx context.Context, containerID string, opti resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "container", containerID) } diff --git a/vendor/github.com/docker/docker/client/container_rename.go b/vendor/github.com/docker/docker/client/container_rename.go index 0e718da7..d4305720 100644 --- a/vendor/github.com/docker/docker/client/container_rename.go +++ b/vendor/github.com/docker/docker/client/container_rename.go @@ -1,9 +1,8 @@ package client import ( + "context" "net/url" - - "golang.org/x/net/context" ) // ContainerRename changes the name of a given container. diff --git a/vendor/github.com/docker/docker/client/container_resize.go b/vendor/github.com/docker/docker/client/container_resize.go index 66c3cc19..1805b013 100644 --- a/vendor/github.com/docker/docker/client/container_resize.go +++ b/vendor/github.com/docker/docker/client/container_resize.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerResize changes the size of the tty for a container. diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go index 74d7455f..39169ad6 100644 --- a/vendor/github.com/docker/docker/client/container_restart.go +++ b/vendor/github.com/docker/docker/client/container_restart.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "time" timetypes "github.com/docker/docker/api/types/time" - "golang.org/x/net/context" ) // ContainerRestart stops and starts a container again. diff --git a/vendor/github.com/docker/docker/client/container_start.go b/vendor/github.com/docker/docker/client/container_start.go index b1f08de4..cea5c0d3 100644 --- a/vendor/github.com/docker/docker/client/container_start.go +++ b/vendor/github.com/docker/docker/client/container_start.go @@ -1,10 +1,9 @@ package client import ( + "context" "net/url" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" ) diff --git a/vendor/github.com/docker/docker/client/container_stats.go b/vendor/github.com/docker/docker/client/container_stats.go index 4758c66e..7df79e0e 100644 --- a/vendor/github.com/docker/docker/client/container_stats.go +++ b/vendor/github.com/docker/docker/client/container_stats.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerStats returns near realtime stats for a given container. diff --git a/vendor/github.com/docker/docker/client/container_stop.go b/vendor/github.com/docker/docker/client/container_stop.go index b5418ae8..c08fb193 100644 --- a/vendor/github.com/docker/docker/client/container_stop.go +++ b/vendor/github.com/docker/docker/client/container_stop.go @@ -1,15 +1,20 @@ package client import ( + "context" "net/url" "time" timetypes "github.com/docker/docker/api/types/time" - "golang.org/x/net/context" ) -// ContainerStop stops a container without terminating the process. -// The process is blocked until the container stops or the timeout expires. +// ContainerStop stops a container. In case the container fails to stop +// gracefully within a time frame specified by the timeout argument, +// it is forcefully terminated (killed). +// +// If the timeout is nil, the container's StopTimeout value is used, if set, +// otherwise the engine default. A negative timeout value can be specified, +// meaning no timeout, i.e. no forceful termination is performed. func (cli *Client) ContainerStop(ctx context.Context, containerID string, timeout *time.Duration) error { query := url.Values{} if timeout != nil { diff --git a/vendor/github.com/docker/docker/client/container_top.go b/vendor/github.com/docker/docker/client/container_top.go index 9689123a..ba2aad50 100644 --- a/vendor/github.com/docker/docker/client/container_top.go +++ b/vendor/github.com/docker/docker/client/container_top.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "net/url" "strings" "github.com/docker/docker/api/types/container" - "golang.org/x/net/context" ) // ContainerTop shows process information from within a container. diff --git a/vendor/github.com/docker/docker/client/container_unpause.go b/vendor/github.com/docker/docker/client/container_unpause.go index 5c762112..6eeec9c2 100644 --- a/vendor/github.com/docker/docker/client/container_unpause.go +++ b/vendor/github.com/docker/docker/client/container_unpause.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // ContainerUnpause resumes the process execution within a container func (cli *Client) ContainerUnpause(ctx context.Context, containerID string) error { diff --git a/vendor/github.com/docker/docker/client/container_update.go b/vendor/github.com/docker/docker/client/container_update.go index 5082f22d..624a6726 100644 --- a/vendor/github.com/docker/docker/client/container_update.go +++ b/vendor/github.com/docker/docker/client/container_update.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types/container" - "golang.org/x/net/context" ) // ContainerUpdate updates resources of a container diff --git a/vendor/github.com/docker/docker/client/container_wait.go b/vendor/github.com/docker/docker/client/container_wait.go index 854c6c05..2fdf0913 100644 --- a/vendor/github.com/docker/docker/client/container_wait.go +++ b/vendor/github.com/docker/docker/client/container_wait.go @@ -1,11 +1,10 @@ package client import ( + "context" "encoding/json" "net/url" - "golang.org/x/net/context" - "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/versions" ) diff --git a/vendor/github.com/docker/docker/client/disk_usage.go b/vendor/github.com/docker/docker/client/disk_usage.go index 03c80b39..b9417a21 100644 --- a/vendor/github.com/docker/docker/client/disk_usage.go +++ b/vendor/github.com/docker/docker/client/disk_usage.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // DiskUsage requests the current data usage from the daemon diff --git a/vendor/github.com/docker/docker/client/distribution_inspect.go b/vendor/github.com/docker/docker/client/distribution_inspect.go index aa5bc6a6..79e8f6fc 100644 --- a/vendor/github.com/docker/docker/client/distribution_inspect.go +++ b/vendor/github.com/docker/docker/client/distribution_inspect.go @@ -1,17 +1,20 @@ package client import ( + "context" "encoding/json" "net/url" registrytypes "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" ) // DistributionInspect returns the image digest with full Manifest func (cli *Client) DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registrytypes.DistributionInspect, error) { // Contact the registry to retrieve digest and platform information var distributionInspect registrytypes.DistributionInspect + if image == "" { + return distributionInspect, objectNotFoundError{object: "distribution", id: image} + } if err := cli.NewVersionError("1.30", "distribution inspect"); err != nil { return distributionInspect, err diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go index fc7df9f1..784357f1 100644 --- a/vendor/github.com/docker/docker/client/errors.go +++ b/vendor/github.com/docker/docker/client/errors.go @@ -2,6 +2,7 @@ package client import ( "fmt" + "net/http" "github.com/docker/docker/api/types/versions" "github.com/pkg/errors" @@ -36,95 +37,37 @@ type notFound interface { NotFound() bool // Is the error a NotFound error } -// IsErrNotFound returns true if the error is caused with an -// object (image, container, network, volume, …) is not found in the docker host. +// IsErrNotFound returns true if the error is a NotFound error, which is returned +// by the API when some object is not found. func IsErrNotFound(err error) bool { te, ok := err.(notFound) return ok && te.NotFound() } -// imageNotFoundError implements an error returned when an image is not in the docker host. -type imageNotFoundError struct { - imageID string +type objectNotFoundError struct { + object string + id string } -// NotFound indicates that this error type is of NotFound -func (e imageNotFoundError) NotFound() bool { +func (e objectNotFoundError) NotFound() bool { return true } -// Error returns a string representation of an imageNotFoundError -func (e imageNotFoundError) Error() string { - return fmt.Sprintf("Error: No such image: %s", e.imageID) +func (e objectNotFoundError) Error() string { + return fmt.Sprintf("Error: No such %s: %s", e.object, e.id) } -// IsErrImageNotFound returns true if the error is caused -// when an image is not found in the docker host. -func IsErrImageNotFound(err error) bool { - return IsErrNotFound(err) -} - -// containerNotFoundError implements an error returned when a container is not in the docker host. -type containerNotFoundError struct { - containerID string -} - -// NotFound indicates that this error type is of NotFound -func (e containerNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a containerNotFoundError -func (e containerNotFoundError) Error() string { - return fmt.Sprintf("Error: No such container: %s", e.containerID) -} - -// IsErrContainerNotFound returns true if the error is caused -// when a container is not found in the docker host. -func IsErrContainerNotFound(err error) bool { - return IsErrNotFound(err) -} - -// networkNotFoundError implements an error returned when a network is not in the docker host. -type networkNotFoundError struct { - networkID string -} - -// NotFound indicates that this error type is of NotFound -func (e networkNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a networkNotFoundError -func (e networkNotFoundError) Error() string { - return fmt.Sprintf("Error: No such network: %s", e.networkID) -} - -// IsErrNetworkNotFound returns true if the error is caused -// when a network is not found in the docker host. -func IsErrNetworkNotFound(err error) bool { - return IsErrNotFound(err) -} - -// volumeNotFoundError implements an error returned when a volume is not in the docker host. -type volumeNotFoundError struct { - volumeID string -} - -// NotFound indicates that this error type is of NotFound -func (e volumeNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a volumeNotFoundError -func (e volumeNotFoundError) Error() string { - return fmt.Sprintf("Error: No such volume: %s", e.volumeID) -} - -// IsErrVolumeNotFound returns true if the error is caused -// when a volume is not found in the docker host. -func IsErrVolumeNotFound(err error) bool { - return IsErrNotFound(err) +func wrapResponseError(err error, resp serverResponse, object, id string) error { + switch { + case err == nil: + return nil + case resp.statusCode == http.StatusNotFound: + return objectNotFoundError{object: object, id: id} + case resp.statusCode == http.StatusNotImplemented: + return notImplementedError{message: err.Error()} + default: + return err + } } // unauthorizedError represents an authorization error in a remote registry. @@ -144,72 +87,6 @@ func IsErrUnauthorized(err error) bool { return ok } -// nodeNotFoundError implements an error returned when a node is not found. -type nodeNotFoundError struct { - nodeID string -} - -// Error returns a string representation of a nodeNotFoundError -func (e nodeNotFoundError) Error() string { - return fmt.Sprintf("Error: No such node: %s", e.nodeID) -} - -// NotFound indicates that this error type is of NotFound -func (e nodeNotFoundError) NotFound() bool { - return true -} - -// IsErrNodeNotFound returns true if the error is caused -// when a node is not found. -func IsErrNodeNotFound(err error) bool { - _, ok := err.(nodeNotFoundError) - return ok -} - -// serviceNotFoundError implements an error returned when a service is not found. -type serviceNotFoundError struct { - serviceID string -} - -// Error returns a string representation of a serviceNotFoundError -func (e serviceNotFoundError) Error() string { - return fmt.Sprintf("Error: No such service: %s", e.serviceID) -} - -// NotFound indicates that this error type is of NotFound -func (e serviceNotFoundError) NotFound() bool { - return true -} - -// IsErrServiceNotFound returns true if the error is caused -// when a service is not found. -func IsErrServiceNotFound(err error) bool { - _, ok := err.(serviceNotFoundError) - return ok -} - -// taskNotFoundError implements an error returned when a task is not found. -type taskNotFoundError struct { - taskID string -} - -// Error returns a string representation of a taskNotFoundError -func (e taskNotFoundError) Error() string { - return fmt.Sprintf("Error: No such task: %s", e.taskID) -} - -// NotFound indicates that this error type is of NotFound -func (e taskNotFoundError) NotFound() bool { - return true -} - -// IsErrTaskNotFound returns true if the error is caused -// when a task is not found. -func IsErrTaskNotFound(err error) bool { - _, ok := err.(taskNotFoundError) - return ok -} - type pluginPermissionDenied struct { name string } @@ -225,76 +102,31 @@ func IsErrPluginPermissionDenied(err error) bool { return ok } -// NewVersionError returns an error if the APIVersion required -// if less than the current supported version -func (cli *Client) NewVersionError(APIrequired, feature string) error { - if cli.version != "" && versions.LessThan(cli.version, APIrequired) { - return fmt.Errorf("%q requires API version %s, but the Docker daemon API version is %s", feature, APIrequired, cli.version) - } - return nil -} - -// secretNotFoundError implements an error returned when a secret is not found. -type secretNotFoundError struct { - name string +type notImplementedError struct { + message string } -// Error returns a string representation of a secretNotFoundError -func (e secretNotFoundError) Error() string { - return fmt.Sprintf("Error: no such secret: %s", e.name) +func (e notImplementedError) Error() string { + return e.message } -// NotFound indicates that this error type is of NotFound -func (e secretNotFoundError) NotFound() bool { +func (e notImplementedError) NotImplemented() bool { return true } -// IsErrSecretNotFound returns true if the error is caused -// when a secret is not found. -func IsErrSecretNotFound(err error) bool { - _, ok := err.(secretNotFoundError) - return ok -} - -// configNotFoundError implements an error returned when a config is not found. -type configNotFoundError struct { - name string +// IsErrNotImplemented returns true if the error is a NotImplemented error. +// This is returned by the API when a requested feature has not been +// implemented. +func IsErrNotImplemented(err error) bool { + te, ok := err.(notImplementedError) + return ok && te.NotImplemented() } -// Error returns a string representation of a configNotFoundError -func (e configNotFoundError) Error() string { - return fmt.Sprintf("Error: no such config: %s", e.name) -} - -// NotFound indicates that this error type is of NotFound -func (e configNotFoundError) NotFound() bool { - return true -} - -// IsErrConfigNotFound returns true if the error is caused -// when a config is not found. -func IsErrConfigNotFound(err error) bool { - _, ok := err.(configNotFoundError) - return ok -} - -// pluginNotFoundError implements an error returned when a plugin is not in the docker host. -type pluginNotFoundError struct { - name string -} - -// NotFound indicates that this error type is of NotFound -func (e pluginNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a pluginNotFoundError -func (e pluginNotFoundError) Error() string { - return fmt.Sprintf("Error: No such plugin: %s", e.name) -} - -// IsErrPluginNotFound returns true if the error is caused -// when a plugin is not found in the docker host. -func IsErrPluginNotFound(err error) bool { - return IsErrNotFound(err) +// NewVersionError returns an error if the APIVersion required +// if less than the current supported version +func (cli *Client) NewVersionError(APIrequired, feature string) error { + if cli.version != "" && versions.LessThan(cli.version, APIrequired) { + return fmt.Errorf("%q requires API version %s, but the Docker daemon API version is %s", feature, APIrequired, cli.version) + } + return nil } diff --git a/vendor/github.com/docker/docker/client/events.go b/vendor/github.com/docker/docker/client/events.go index af47aefa..8b77a0f9 100644 --- a/vendor/github.com/docker/docker/client/events.go +++ b/vendor/github.com/docker/docker/client/events.go @@ -1,12 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/events" "github.com/docker/docker/api/types/filters" diff --git a/vendor/github.com/docker/docker/client/hijack.go b/vendor/github.com/docker/docker/client/hijack.go index 8cf0119f..636f2bbf 100644 --- a/vendor/github.com/docker/docker/client/hijack.go +++ b/vendor/github.com/docker/docker/client/hijack.go @@ -2,37 +2,20 @@ package client import ( "bufio" + "context" "crypto/tls" "fmt" "net" "net/http" "net/http/httputil" "net/url" - "strings" "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/tlsconfig" "github.com/docker/go-connections/sockets" "github.com/pkg/errors" - "golang.org/x/net/context" ) -// tlsClientCon holds tls information and a dialed connection. -type tlsClientCon struct { - *tls.Conn - rawConn net.Conn -} - -func (c *tlsClientCon) CloseWrite() error { - // Go standard tls.Conn doesn't provide the CloseWrite() method so we do it - // on its underlying connection. - if conn, ok := c.rawConn.(types.CloseWriter); ok { - return conn.CloseWrite() - } - return nil -} - // postHijacked sends a POST request and hijacks the connection. func (cli *Client) postHijacked(ctx context.Context, path string, query url.Values, body interface{}, headers map[string][]string) (types.HijackedResponse, error) { bodyEncoded, err := encodeData(body) @@ -55,96 +38,9 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu return types.HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn)}, err } -func tlsDial(network, addr string, config *tls.Config) (net.Conn, error) { - return tlsDialWithDialer(new(net.Dialer), network, addr, config) -} - -// We need to copy Go's implementation of tls.Dial (pkg/cryptor/tls/tls.go) in -// order to return our custom tlsClientCon struct which holds both the tls.Conn -// object _and_ its underlying raw connection. The rationale for this is that -// we need to be able to close the write end of the connection when attaching, -// which tls.Conn does not provide. -func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Config) (net.Conn, error) { - // We want the Timeout and Deadline values from dialer to cover the - // whole process: TCP connection and TLS handshake. This means that we - // also need to start our own timers now. - timeout := dialer.Timeout - - if !dialer.Deadline.IsZero() { - deadlineTimeout := dialer.Deadline.Sub(time.Now()) - if timeout == 0 || deadlineTimeout < timeout { - timeout = deadlineTimeout - } - } - - var errChannel chan error - - if timeout != 0 { - errChannel = make(chan error, 2) - time.AfterFunc(timeout, func() { - errChannel <- errors.New("") - }) - } - - proxyDialer, err := sockets.DialerFromEnvironment(dialer) - if err != nil { - return nil, err - } - - rawConn, err := proxyDialer.Dial(network, addr) - if err != nil { - return nil, err - } - // When we set up a TCP connection for hijack, there could be long periods - // of inactivity (a long running command with no output) that in certain - // network setups may cause ECONNTIMEOUT, leaving the client in an unknown - // state. Setting TCP KeepAlive on the socket connection will prohibit - // ECONNTIMEOUT unless the socket connection truly is broken - if tcpConn, ok := rawConn.(*net.TCPConn); ok { - tcpConn.SetKeepAlive(true) - tcpConn.SetKeepAlivePeriod(30 * time.Second) - } - - colonPos := strings.LastIndex(addr, ":") - if colonPos == -1 { - colonPos = len(addr) - } - hostname := addr[:colonPos] - - // If no ServerName is set, infer the ServerName - // from the hostname we're connecting to. - if config.ServerName == "" { - // Make a copy to avoid polluting argument or default. - config = tlsconfig.Clone(config) - config.ServerName = hostname - } - - conn := tls.Client(rawConn, config) - - if timeout == 0 { - err = conn.Handshake() - } else { - go func() { - errChannel <- conn.Handshake() - }() - - err = <-errChannel - } - - if err != nil { - rawConn.Close() - return nil, err - } - - // This is Docker difference with standard's crypto/tls package: returned a - // wrapper which holds both the TLS and raw connections. - return &tlsClientCon{conn, rawConn}, nil -} - func dial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) { if tlsConfig != nil && proto != "unix" && proto != "npipe" { - // Notice this isn't Go standard's tls.Dial function - return tlsDial(proto, addr, tlsConfig) + return tls.Dial(proto, addr, tlsConfig) } if proto == "npipe" { return sockets.DialPipe(addr, 32*time.Second) @@ -189,8 +85,14 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (net.Conn, e c, br := clientconn.Hijack() if br.Buffered() > 0 { - // If there is buffered content, wrap the connection - c = &hijackedConn{c, br} + // If there is buffered content, wrap the connection. We return an + // object that implements CloseWrite iff the underlying connection + // implements it. + if _, ok := c.(types.CloseWriter); ok { + c = &hijackedConnCloseWriter{&hijackedConn{c, br}} + } else { + c = &hijackedConn{c, br} + } } else { br.Reset(nil) } @@ -198,6 +100,10 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (net.Conn, e return c, nil } +// hijackedConn wraps a net.Conn and is returned by setupHijackConn in the case +// that a) there was already buffered data in the http layer when Hijack() was +// called, and b) the underlying net.Conn does *not* implement CloseWrite(). +// hijackedConn does not implement CloseWrite() either. type hijackedConn struct { net.Conn r *bufio.Reader @@ -206,3 +112,18 @@ type hijackedConn struct { func (c *hijackedConn) Read(b []byte) (int, error) { return c.r.Read(b) } + +// hijackedConnCloseWriter is a hijackedConn which additionally implements +// CloseWrite(). It is returned by setupHijackConn in the case that a) there +// was already buffered data in the http layer when Hijack() was called, and b) +// the underlying net.Conn *does* implement CloseWrite(). +type hijackedConnCloseWriter struct { + *hijackedConn +} + +var _ types.CloseWriter = &hijackedConnCloseWriter{} + +func (c *hijackedConnCloseWriter) CloseWrite() error { + conn := c.Conn.(types.CloseWriter) + return conn.CloseWrite() +} diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go index 44a215f9..68f93e11 100644 --- a/vendor/github.com/docker/docker/client/image_build.go +++ b/vendor/github.com/docker/docker/client/image_build.go @@ -1,14 +1,14 @@ package client import ( + "context" "encoding/base64" "encoding/json" "io" "net/http" "net/url" "strconv" - - "golang.org/x/net/context" + "strings" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" @@ -29,6 +29,13 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio return types.ImageBuildResponse{}, err } headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf)) + + if options.Platform != "" { + if err := cli.NewVersionError("1.32", "platform"); err != nil { + return types.ImageBuildResponse{}, err + } + query.Set("platform", options.Platform) + } headers.Set("Content-Type", "application/x-tar") serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers) @@ -123,6 +130,8 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur if options.SessionID != "" { query.Set("session", options.SessionID) } - + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } return query, nil } diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go index 4436abb0..f241a8e1 100644 --- a/vendor/github.com/docker/docker/client/image_create.go +++ b/vendor/github.com/docker/docker/client/image_create.go @@ -1,10 +1,10 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" @@ -21,6 +21,9 @@ func (cli *Client) ImageCreate(ctx context.Context, parentReference string, opti query := url.Values{} query.Set("fromImage", reference.FamiliarName(ref)) query.Set("tag", getAPITagFromNamedRef(ref)) + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/image_history.go b/vendor/github.com/docker/docker/client/image_history.go index 7b4babcb..7bae4ed3 100644 --- a/vendor/github.com/docker/docker/client/image_history.go +++ b/vendor/github.com/docker/docker/client/image_history.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types/image" - "golang.org/x/net/context" ) // ImageHistory returns the changes in an image in history format. diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go index d7dedd82..1d39dccf 100644 --- a/vendor/github.com/docker/docker/client/image_import.go +++ b/vendor/github.com/docker/docker/client/image_import.go @@ -1,10 +1,10 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" @@ -25,6 +25,9 @@ func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSour query.Set("repo", ref) query.Set("tag", options.Tag) query.Set("message", options.Message) + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } for _, change := range options.Changes { query.Add("changes", change) } diff --git a/vendor/github.com/docker/docker/client/image_inspect.go b/vendor/github.com/docker/docker/client/image_inspect.go index b3a64ce2..1e063f9a 100644 --- a/vendor/github.com/docker/docker/client/image_inspect.go +++ b/vendor/github.com/docker/docker/client/image_inspect.go @@ -2,22 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ImageInspectWithRaw returns the image information and its raw representation. func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (types.ImageInspect, []byte, error) { + if imageID == "" { + return types.ImageInspect{}, nil, objectNotFoundError{object: "image", id: imageID} + } serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ImageInspect{}, nil, imageNotFoundError{imageID} - } - return types.ImageInspect{}, nil, err + return types.ImageInspect{}, nil, wrapResponseError(err, serverResp, "image", imageID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go index f26464f6..7e4714bc 100644 --- a/vendor/github.com/docker/docker/client/image_list.go +++ b/vendor/github.com/docker/docker/client/image_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" ) // ImageList returns a list of images in the docker host. diff --git a/vendor/github.com/docker/docker/client/image_load.go b/vendor/github.com/docker/docker/client/image_load.go index 77aaf1af..6b8dedc1 100644 --- a/vendor/github.com/docker/docker/client/image_load.go +++ b/vendor/github.com/docker/docker/client/image_load.go @@ -1,11 +1,10 @@ package client import ( + "context" "io" "net/url" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" ) diff --git a/vendor/github.com/docker/docker/client/image_prune.go b/vendor/github.com/docker/docker/client/image_prune.go index 5ef98b7f..5f772efe 100644 --- a/vendor/github.com/docker/docker/client/image_prune.go +++ b/vendor/github.com/docker/docker/client/image_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // ImagesPrune requests the daemon to delete unused data diff --git a/vendor/github.com/docker/docker/client/image_pull.go b/vendor/github.com/docker/docker/client/image_pull.go index a72b9bf7..c2ae3581 100644 --- a/vendor/github.com/docker/docker/client/image_pull.go +++ b/vendor/github.com/docker/docker/client/image_pull.go @@ -1,11 +1,11 @@ package client import ( + "context" "io" "net/http" "net/url" - - "golang.org/x/net/context" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" @@ -30,6 +30,9 @@ func (cli *Client) ImagePull(ctx context.Context, refStr string, options types.I if !options.All { query.Set("tag", getAPITagFromNamedRef(ref)) } + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go index 410d2fb9..54d4b149 100644 --- a/vendor/github.com/docker/docker/client/image_push.go +++ b/vendor/github.com/docker/docker/client/image_push.go @@ -1,13 +1,12 @@ package client import ( + "context" "errors" "io" "net/http" "net/url" - "golang.org/x/net/context" - "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" ) diff --git a/vendor/github.com/docker/docker/client/image_remove.go b/vendor/github.com/docker/docker/client/image_remove.go index 6921209e..bf59afdb 100644 --- a/vendor/github.com/docker/docker/client/image_remove.go +++ b/vendor/github.com/docker/docker/client/image_remove.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ImageRemove removes an image from the docker host. @@ -19,12 +19,12 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options type query.Set("noprune", "1") } + var dels []types.ImageDeleteResponseItem resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) if err != nil { - return nil, err + return dels, wrapResponseError(err, resp, "image", imageID) } - var dels []types.ImageDeleteResponseItem err = json.NewDecoder(resp.body).Decode(&dels) ensureReaderClosed(resp) return dels, err diff --git a/vendor/github.com/docker/docker/client/image_save.go b/vendor/github.com/docker/docker/client/image_save.go index ecac880a..1d2bb587 100644 --- a/vendor/github.com/docker/docker/client/image_save.go +++ b/vendor/github.com/docker/docker/client/image_save.go @@ -1,10 +1,9 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" ) // ImageSave retrieves one or more images from the docker host as an io.ReadCloser. diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go index b0fcd5c2..054f8824 100644 --- a/vendor/github.com/docker/docker/client/image_search.go +++ b/vendor/github.com/docker/docker/client/image_search.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/json" "fmt" "net/http" @@ -9,7 +10,6 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" ) // ImageSearch makes the docker host to search by a term in a remote registry. @@ -21,7 +21,7 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options types.I query.Set("limit", fmt.Sprintf("%d", options.Limit)) if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return results, err } diff --git a/vendor/github.com/docker/docker/client/image_tag.go b/vendor/github.com/docker/docker/client/image_tag.go index 8924f71e..055e232c 100644 --- a/vendor/github.com/docker/docker/client/image_tag.go +++ b/vendor/github.com/docker/docker/client/image_tag.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "github.com/docker/distribution/reference" "github.com/pkg/errors" - "golang.org/x/net/context" ) // ImageTag tags an image in the docker host diff --git a/vendor/github.com/docker/docker/client/info.go b/vendor/github.com/docker/docker/client/info.go index ac079612..66e92ee8 100644 --- a/vendor/github.com/docker/docker/client/info.go +++ b/vendor/github.com/docker/docker/client/info.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // Info returns information about the docker server. diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go index acd4de1d..be9ea35b 100644 --- a/vendor/github.com/docker/docker/client/interface.go +++ b/vendor/github.com/docker/docker/client/interface.go @@ -1,20 +1,21 @@ package client import ( + "context" "io" "net" + "net/http" "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" + containertypes "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/events" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/image" - "github.com/docker/docker/api/types/network" + networktypes "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" ) // CommonAPIClient is the common methods between stable and experimental versions of APIClient. @@ -33,19 +34,21 @@ type CommonAPIClient interface { VolumeAPIClient ClientVersion() string DaemonHost() string + HTTPClient() *http.Client ServerVersion(ctx context.Context) (types.Version, error) NegotiateAPIVersion(ctx context.Context) NegotiateAPIVersionPing(types.Ping) DialSession(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error) + Close() error } // ContainerAPIClient defines API client methods for the containers type ContainerAPIClient interface { ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) - ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) - ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error) - ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) + ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, containerName string) (containertypes.ContainerCreateCreatedBody, error) + ContainerDiff(ctx context.Context, container string) ([]containertypes.ContainerChangeResponseItem, error) + ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error @@ -65,10 +68,10 @@ type ContainerAPIClient interface { ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error ContainerStop(ctx context.Context, container string, timeout *time.Duration) error - ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error) + ContainerTop(ctx context.Context, container string, arguments []string) (containertypes.ContainerTopOKBody, error) ContainerUnpause(ctx context.Context, container string) error - ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) - ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) + ContainerUpdate(ctx context.Context, container string, updateConfig containertypes.UpdateConfig) (containertypes.ContainerUpdateOKBody, error) + ContainerWait(ctx context.Context, container string, condition containertypes.WaitCondition) (<-chan containertypes.ContainerWaitOKBody, <-chan error) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) @@ -100,13 +103,13 @@ type ImageAPIClient interface { // NetworkAPIClient defines API client methods for the networks type NetworkAPIClient interface { - NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error + NetworkConnect(ctx context.Context, network, container string, config *networktypes.EndpointSettings) error NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) - NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error - NetworkInspect(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, error) - NetworkInspectWithRaw(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) + NetworkDisconnect(ctx context.Context, network, container string, force bool) error + NetworkInspect(ctx context.Context, network string, options types.NetworkInspectOptions) (types.NetworkResource, error) + NetworkInspectWithRaw(ctx context.Context, network string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) - NetworkRemove(ctx context.Context, networkID string) error + NetworkRemove(ctx context.Context, network string) error NetworksPrune(ctx context.Context, pruneFilter filters.Args) (types.NetworksPruneReport, error) } @@ -167,10 +170,10 @@ type SystemAPIClient interface { // VolumeAPIClient defines API client methods for the volumes type VolumeAPIClient interface { - VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) + VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) - VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) + VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumeListOKBody, error) VolumeRemove(ctx context.Context, volumeID string, force bool) error VolumesPrune(ctx context.Context, pruneFilter filters.Args) (types.VolumesPruneReport, error) } diff --git a/vendor/github.com/docker/docker/client/interface_experimental.go b/vendor/github.com/docker/docker/client/interface_experimental.go index 51da98ec..5bf00bc1 100644 --- a/vendor/github.com/docker/docker/client/interface_experimental.go +++ b/vendor/github.com/docker/docker/client/interface_experimental.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) type apiClientExperimental interface { diff --git a/vendor/github.com/docker/docker/client/login.go b/vendor/github.com/docker/docker/client/login.go index 79219ff5..a9781f9d 100644 --- a/vendor/github.com/docker/docker/client/login.go +++ b/vendor/github.com/docker/docker/client/login.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/http" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" ) // RegistryLogin authenticates the docker server with a given docker registry. diff --git a/vendor/github.com/docker/docker/client/network_connect.go b/vendor/github.com/docker/docker/client/network_connect.go index c022c17b..9372cda4 100644 --- a/vendor/github.com/docker/docker/client/network_connect.go +++ b/vendor/github.com/docker/docker/client/network_connect.go @@ -1,9 +1,10 @@ package client import ( + "context" + "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/network" - "golang.org/x/net/context" ) // NetworkConnect connects a container to an existent network in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_create.go b/vendor/github.com/docker/docker/client/network_create.go index 4067a541..91da2a5a 100644 --- a/vendor/github.com/docker/docker/client/network_create.go +++ b/vendor/github.com/docker/docker/client/network_create.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // NetworkCreate creates a new network in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_disconnect.go b/vendor/github.com/docker/docker/client/network_disconnect.go index 24b58e3c..0e74a782 100644 --- a/vendor/github.com/docker/docker/client/network_disconnect.go +++ b/vendor/github.com/docker/docker/client/network_disconnect.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // NetworkDisconnect disconnects a container from an existent network in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_inspect.go b/vendor/github.com/docker/docker/client/network_inspect.go index 848c9799..57b94953 100644 --- a/vendor/github.com/docker/docker/client/network_inspect.go +++ b/vendor/github.com/docker/docker/client/network_inspect.go @@ -2,13 +2,12 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // NetworkInspect returns the information for a specific network configured in the docker host. @@ -19,6 +18,9 @@ func (cli *Client) NetworkInspect(ctx context.Context, networkID string, options // NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation. func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) { + if networkID == "" { + return types.NetworkResource{}, nil, objectNotFoundError{object: "network", id: networkID} + } var ( networkResource types.NetworkResource resp serverResponse @@ -33,10 +35,7 @@ func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, } resp, err = cli.get(ctx, "/networks/"+networkID, query, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return networkResource, nil, networkNotFoundError{networkID} - } - return networkResource, nil, err + return networkResource, nil, wrapResponseError(err, resp, "network", networkID) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/network_list.go b/vendor/github.com/docker/docker/client/network_list.go index e566a93e..6056bee7 100644 --- a/vendor/github.com/docker/docker/client/network_list.go +++ b/vendor/github.com/docker/docker/client/network_list.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // NetworkList returns the list of networks configured in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_prune.go b/vendor/github.com/docker/docker/client/network_prune.go index 7352a7f0..9ae96f81 100644 --- a/vendor/github.com/docker/docker/client/network_prune.go +++ b/vendor/github.com/docker/docker/client/network_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // NetworksPrune requests the daemon to delete unused networks diff --git a/vendor/github.com/docker/docker/client/network_remove.go b/vendor/github.com/docker/docker/client/network_remove.go index 6bd67489..c9659635 100644 --- a/vendor/github.com/docker/docker/client/network_remove.go +++ b/vendor/github.com/docker/docker/client/network_remove.go @@ -1,10 +1,10 @@ package client -import "golang.org/x/net/context" +import "context" // NetworkRemove removes an existent network from the docker host. func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error { resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "network", networkID) } diff --git a/vendor/github.com/docker/docker/client/node_inspect.go b/vendor/github.com/docker/docker/client/node_inspect.go index abf505d2..8fe1ab10 100644 --- a/vendor/github.com/docker/docker/client/node_inspect.go +++ b/vendor/github.com/docker/docker/client/node_inspect.go @@ -2,22 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // NodeInspectWithRaw returns the node information. func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) { + if nodeID == "" { + return swarm.Node{}, nil, objectNotFoundError{object: "node", id: nodeID} + } serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Node{}, nil, nodeNotFoundError{nodeID} - } - return swarm.Node{}, nil, err + return swarm.Node{}, nil, wrapResponseError(err, serverResp, "node", nodeID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/node_list.go b/vendor/github.com/docker/docker/client/node_list.go index 3e8440f0..386aad1e 100644 --- a/vendor/github.com/docker/docker/client/node_list.go +++ b/vendor/github.com/docker/docker/client/node_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // NodeList returns the list of nodes. @@ -15,7 +15,7 @@ func (cli *Client) NodeList(ctx context.Context, options types.NodeListOptions) query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/node_remove.go b/vendor/github.com/docker/docker/client/node_remove.go index 0a77f3d5..ef949ed2 100644 --- a/vendor/github.com/docker/docker/client/node_remove.go +++ b/vendor/github.com/docker/docker/client/node_remove.go @@ -1,11 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - - "golang.org/x/net/context" ) // NodeRemove removes a Node. @@ -17,5 +16,5 @@ func (cli *Client) NodeRemove(ctx context.Context, nodeID string, options types. resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "node", nodeID) } diff --git a/vendor/github.com/docker/docker/client/node_update.go b/vendor/github.com/docker/docker/client/node_update.go index 3ca97602..6359966a 100644 --- a/vendor/github.com/docker/docker/client/node_update.go +++ b/vendor/github.com/docker/docker/client/node_update.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // NodeUpdate updates a Node. diff --git a/vendor/github.com/docker/docker/client/parse_logs.go b/vendor/github.com/docker/docker/client/parse_logs.go deleted file mode 100644 index e427f80a..00000000 --- a/vendor/github.com/docker/docker/client/parse_logs.go +++ /dev/null @@ -1,41 +0,0 @@ -package client - -// parse_logs.go contains utility helpers for getting information out of docker -// log lines. really, it only contains ParseDetails right now. maybe in the -// future there will be some desire to parse log messages back into a struct? -// that would go here if we did - -import ( - "net/url" - "strings" - - "github.com/pkg/errors" -) - -// ParseLogDetails takes a details string of key value pairs in the form -// "k=v,l=w", where the keys and values are url query escaped, and each pair -// is separated by a comma, returns a map. returns an error if the details -// string is not in a valid format -// the exact form of details encoding is implemented in -// api/server/httputils/write_log_stream.go -func ParseLogDetails(details string) (map[string]string, error) { - pairs := strings.Split(details, ",") - detailsMap := make(map[string]string, len(pairs)) - for _, pair := range pairs { - p := strings.SplitN(pair, "=", 2) - // if there is no equals sign, we will only get 1 part back - if len(p) != 2 { - return nil, errors.New("invalid details format") - } - k, err := url.QueryUnescape(p[0]) - if err != nil { - return nil, err - } - v, err := url.QueryUnescape(p[1]) - if err != nil { - return nil, err - } - detailsMap[k] = v - } - return detailsMap, nil -} diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go index a4c2e2c4..a1707025 100644 --- a/vendor/github.com/docker/docker/client/ping.go +++ b/vendor/github.com/docker/docker/client/ping.go @@ -1,14 +1,16 @@ package client import ( + "context" + "path" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // Ping pings the server and returns the value of the "Docker-Experimental", "OS-Type" & "API-Version" headers func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { var ping types.Ping - req, err := cli.buildRequest("GET", cli.basePath+"/_ping", nil, nil) + req, err := cli.buildRequest("GET", path.Join(cli.basePath, "/_ping"), nil, nil) if err != nil { return ping, err } @@ -26,7 +28,5 @@ func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { } ping.OSType = serverResp.header.Get("OSType") } - - err = cli.checkResponseErr(serverResp) - return ping, err + return ping, cli.checkResponseErr(serverResp) } diff --git a/vendor/github.com/docker/docker/client/plugin_create.go b/vendor/github.com/docker/docker/client/plugin_create.go index 27954aa5..f850057f 100644 --- a/vendor/github.com/docker/docker/client/plugin_create.go +++ b/vendor/github.com/docker/docker/client/plugin_create.go @@ -1,12 +1,12 @@ package client import ( + "context" "io" "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginCreate creates a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_disable.go b/vendor/github.com/docker/docker/client/plugin_disable.go index 30467db7..6f1337ba 100644 --- a/vendor/github.com/docker/docker/client/plugin_disable.go +++ b/vendor/github.com/docker/docker/client/plugin_disable.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginDisable disables a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_enable.go b/vendor/github.com/docker/docker/client/plugin_enable.go index 95517c4b..4f2679ac 100644 --- a/vendor/github.com/docker/docker/client/plugin_enable.go +++ b/vendor/github.com/docker/docker/client/plugin_enable.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginEnable enables a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_inspect.go b/vendor/github.com/docker/docker/client/plugin_inspect.go index 89f39ee2..31e99a98 100644 --- a/vendor/github.com/docker/docker/client/plugin_inspect.go +++ b/vendor/github.com/docker/docker/client/plugin_inspect.go @@ -2,22 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginInspectWithRaw inspects an existing plugin func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) { + if name == "" { + return nil, nil, objectNotFoundError{object: "plugin", id: name} + } resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return nil, nil, pluginNotFoundError{name} - } - return nil, nil, err + return nil, nil, wrapResponseError(err, resp, "plugin", name) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/plugin_install.go b/vendor/github.com/docker/docker/client/plugin_install.go index ce3e0506..d56beffa 100644 --- a/vendor/github.com/docker/docker/client/plugin_install.go +++ b/vendor/github.com/docker/docker/client/plugin_install.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/json" "io" "net/http" @@ -9,7 +10,6 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" "github.com/pkg/errors" - "golang.org/x/net/context" ) // PluginInstall installs a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_list.go b/vendor/github.com/docker/docker/client/plugin_list.go index 3acde3b9..4084e4c1 100644 --- a/vendor/github.com/docker/docker/client/plugin_list.go +++ b/vendor/github.com/docker/docker/client/plugin_list.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // PluginList returns the installed plugins @@ -23,7 +23,7 @@ func (cli *Client) PluginList(ctx context.Context, filter filters.Args) (types.P } resp, err := cli.get(ctx, "/plugins", query, nil) if err != nil { - return plugins, err + return plugins, wrapResponseError(err, resp, "plugin", "") } err = json.NewDecoder(resp.body).Decode(&plugins) diff --git a/vendor/github.com/docker/docker/client/plugin_push.go b/vendor/github.com/docker/docker/client/plugin_push.go index 1e5f9632..6528a6af 100644 --- a/vendor/github.com/docker/docker/client/plugin_push.go +++ b/vendor/github.com/docker/docker/client/plugin_push.go @@ -1,9 +1,8 @@ package client import ( + "context" "io" - - "golang.org/x/net/context" ) // PluginPush pushes a plugin to a registry diff --git a/vendor/github.com/docker/docker/client/plugin_remove.go b/vendor/github.com/docker/docker/client/plugin_remove.go index b017e4d3..70b565ee 100644 --- a/vendor/github.com/docker/docker/client/plugin_remove.go +++ b/vendor/github.com/docker/docker/client/plugin_remove.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginRemove removes a plugin @@ -16,5 +16,5 @@ func (cli *Client) PluginRemove(ctx context.Context, name string, options types. resp, err := cli.delete(ctx, "/plugins/"+name, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "plugin", name) } diff --git a/vendor/github.com/docker/docker/client/plugin_set.go b/vendor/github.com/docker/docker/client/plugin_set.go index 3260d2a9..9ffa7530 100644 --- a/vendor/github.com/docker/docker/client/plugin_set.go +++ b/vendor/github.com/docker/docker/client/plugin_set.go @@ -1,7 +1,7 @@ package client import ( - "golang.org/x/net/context" + "context" ) // PluginSet modifies settings for an existing plugin diff --git a/vendor/github.com/docker/docker/client/plugin_upgrade.go b/vendor/github.com/docker/docker/client/plugin_upgrade.go index 049ebfa2..cf215ba0 100644 --- a/vendor/github.com/docker/docker/client/plugin_upgrade.go +++ b/vendor/github.com/docker/docker/client/plugin_upgrade.go @@ -1,13 +1,13 @@ package client import ( + "context" "io" "net/url" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" "github.com/pkg/errors" - "golang.org/x/net/context" ) // PluginUpgrade upgrades a plugin diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go index 3e7d43fe..368fa1fa 100644 --- a/vendor/github.com/docker/docker/client/request.go +++ b/vendor/github.com/docker/docker/client/request.go @@ -2,6 +2,7 @@ package client import ( "bytes" + "context" "encoding/json" "fmt" "io" @@ -15,7 +16,6 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions" "github.com/pkg/errors" - "golang.org/x/net/context" "golang.org/x/net/context/ctxhttp" ) @@ -123,10 +123,7 @@ func (cli *Client) sendRequest(ctx context.Context, method, path string, query u if err != nil { return resp, err } - if err := cli.checkResponseErr(resp); err != nil { - return resp, err - } - return resp, nil + return resp, cli.checkResponseErr(resp) } func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResponse, error) { @@ -203,7 +200,7 @@ func (cli *Client) checkResponseErr(serverResp serverResponse) error { return err } if len(body) == 0 { - return fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), serverResp.reqURL) + return fmt.Errorf("request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), serverResp.reqURL) } var ct string diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go index 4354afea..3d7768ac 100644 --- a/vendor/github.com/docker/docker/client/secret_create.go +++ b/vendor/github.com/docker/docker/client/secret_create.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretCreate creates a new Secret. diff --git a/vendor/github.com/docker/docker/client/secret_inspect.go b/vendor/github.com/docker/docker/client/secret_inspect.go index 9b602972..45584d0e 100644 --- a/vendor/github.com/docker/docker/client/secret_inspect.go +++ b/vendor/github.com/docker/docker/client/secret_inspect.go @@ -2,12 +2,11 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretInspectWithRaw returns the secret information with raw data @@ -15,12 +14,12 @@ func (cli *Client) SecretInspectWithRaw(ctx context.Context, id string) (swarm.S if err := cli.NewVersionError("1.25", "secret inspect"); err != nil { return swarm.Secret{}, nil, err } + if id == "" { + return swarm.Secret{}, nil, objectNotFoundError{object: "secret", id: id} + } resp, err := cli.get(ctx, "/secrets/"+id, nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return swarm.Secret{}, nil, secretNotFoundError{id} - } - return swarm.Secret{}, nil, err + return swarm.Secret{}, nil, wrapResponseError(err, resp, "secret", id) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/secret_list.go b/vendor/github.com/docker/docker/client/secret_list.go index 0d33ecfb..128fc69d 100644 --- a/vendor/github.com/docker/docker/client/secret_list.go +++ b/vendor/github.com/docker/docker/client/secret_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretList returns the list of secrets. @@ -18,7 +18,7 @@ func (cli *Client) SecretList(ctx context.Context, options types.SecretListOptio query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go index c5e37af1..87c7a12b 100644 --- a/vendor/github.com/docker/docker/client/secret_remove.go +++ b/vendor/github.com/docker/docker/client/secret_remove.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // SecretRemove removes a Secret. func (cli *Client) SecretRemove(ctx context.Context, id string) error { @@ -9,5 +9,5 @@ func (cli *Client) SecretRemove(ctx context.Context, id string) error { } resp, err := cli.delete(ctx, "/secrets/"+id, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "secret", id) } diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go index 875a4c90..468e1acc 100644 --- a/vendor/github.com/docker/docker/client/secret_update.go +++ b/vendor/github.com/docker/docker/client/secret_update.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretUpdate attempts to update a Secret diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go index a3683944..4cd98f4b 100644 --- a/vendor/github.com/docker/docker/client/service_create.go +++ b/vendor/github.com/docker/docker/client/service_create.go @@ -1,15 +1,16 @@ package client import ( + "context" "encoding/json" "fmt" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" "github.com/opencontainers/go-digest" "github.com/pkg/errors" - "golang.org/x/net/context" ) // ServiceCreate creates a new Service. @@ -85,21 +86,30 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, return response, err } -func imageDigestAndPlatforms(ctx context.Context, cli *Client, image, encodedAuth string) (string, []swarm.Platform, error) { +func imageDigestAndPlatforms(ctx context.Context, cli DistributionAPIClient, image, encodedAuth string) (string, []swarm.Platform, error) { distributionInspect, err := cli.DistributionInspect(ctx, image, encodedAuth) - imageWithDigest := image var platforms []swarm.Platform if err != nil { return "", nil, err } - imageWithDigest = imageWithDigestString(image, distributionInspect.Descriptor.Digest) + imageWithDigest := imageWithDigestString(image, distributionInspect.Descriptor.Digest) if len(distributionInspect.Platforms) > 0 { platforms = make([]swarm.Platform, 0, len(distributionInspect.Platforms)) for _, p := range distributionInspect.Platforms { + // clear architecture field for arm. This is a temporary patch to address + // https://github.com/docker/swarmkit/issues/2294. The issue is that while + // image manifests report "arm" as the architecture, the node reports + // something like "armv7l" (includes the variant), which causes arm images + // to stop working with swarm mode. This patch removes the architecture + // constraint for arm images to ensure tasks get scheduled. + arch := p.Architecture + if strings.ToLower(arch) == "arm" { + arch = "" + } platforms = append(platforms, swarm.Platform{ - Architecture: p.Architecture, + Architecture: arch, OS: p.OS, }) } @@ -126,7 +136,7 @@ func imageWithDigestString(image string, dgst digest.Digest) string { // imageWithTagString takes an image string, and returns a tagged image // string, adding a 'latest' tag if one was not provided. It returns an -// emptry string if a canonical reference was provided +// empty string if a canonical reference was provided func imageWithTagString(image string) string { namedRef, err := reference.ParseNormalizedNamed(image) if err == nil { diff --git a/vendor/github.com/docker/docker/client/service_inspect.go b/vendor/github.com/docker/docker/client/service_inspect.go index d7e051e3..61c51738 100644 --- a/vendor/github.com/docker/docker/client/service_inspect.go +++ b/vendor/github.com/docker/docker/client/service_inspect.go @@ -2,27 +2,26 @@ package client import ( "bytes" + "context" "encoding/json" "fmt" "io/ioutil" - "net/http" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ServiceInspectWithRaw returns the service information and the raw data. func (cli *Client) ServiceInspectWithRaw(ctx context.Context, serviceID string, opts types.ServiceInspectOptions) (swarm.Service, []byte, error) { + if serviceID == "" { + return swarm.Service{}, nil, objectNotFoundError{object: "service", id: serviceID} + } query := url.Values{} query.Set("insertDefaults", fmt.Sprintf("%v", opts.InsertDefaults)) serverResp, err := cli.get(ctx, "/services/"+serviceID, query, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Service{}, nil, serviceNotFoundError{serviceID} - } - return swarm.Service{}, nil, err + return swarm.Service{}, nil, wrapResponseError(err, serverResp, "service", serviceID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/service_list.go b/vendor/github.com/docker/docker/client/service_list.go index c29e6d40..abe37d4a 100644 --- a/vendor/github.com/docker/docker/client/service_list.go +++ b/vendor/github.com/docker/docker/client/service_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ServiceList returns the list of services. @@ -15,7 +15,7 @@ func (cli *Client) ServiceList(ctx context.Context, options types.ServiceListOpt query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/service_logs.go b/vendor/github.com/docker/docker/client/service_logs.go index 24384e3e..51819357 100644 --- a/vendor/github.com/docker/docker/client/service_logs.go +++ b/vendor/github.com/docker/docker/client/service_logs.go @@ -1,14 +1,14 @@ package client import ( + "context" "io" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" timetypes "github.com/docker/docker/api/types/time" + "github.com/pkg/errors" ) // ServiceLogs returns the logs generated by a service in an io.ReadCloser. @@ -26,7 +26,7 @@ func (cli *Client) ServiceLogs(ctx context.Context, serviceID string, options ty if options.Since != "" { ts, err := timetypes.GetTimestamp(options.Since, time.Now()) if err != nil { - return nil, err + return nil, errors.Wrap(err, `invalid value for "since"`) } query.Set("since", ts) } diff --git a/vendor/github.com/docker/docker/client/service_remove.go b/vendor/github.com/docker/docker/client/service_remove.go index a9331f92..a8f13e26 100644 --- a/vendor/github.com/docker/docker/client/service_remove.go +++ b/vendor/github.com/docker/docker/client/service_remove.go @@ -1,10 +1,10 @@ package client -import "golang.org/x/net/context" +import "context" // ServiceRemove kills and removes a service. func (cli *Client) ServiceRemove(ctx context.Context, serviceID string) error { resp, err := cli.delete(ctx, "/services/"+serviceID, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "service", serviceID) } diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go index 8764f299..45a0ed0a 100644 --- a/vendor/github.com/docker/docker/client/service_update.go +++ b/vendor/github.com/docker/docker/client/service_update.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "strconv" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ServiceUpdate updates a Service. diff --git a/vendor/github.com/docker/docker/client/session.go b/vendor/github.com/docker/docker/client/session.go index 8ee91621..12051e3e 100644 --- a/vendor/github.com/docker/docker/client/session.go +++ b/vendor/github.com/docker/docker/client/session.go @@ -1,10 +1,9 @@ package client import ( + "context" "net" "net/http" - - "golang.org/x/net/context" ) // DialSession returns a connection that can be used communication with daemon diff --git a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go index be28d326..58f78e86 100644 --- a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go +++ b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // SwarmGetUnlockKey retrieves the swarm's unlock key. diff --git a/vendor/github.com/docker/docker/client/swarm_init.go b/vendor/github.com/docker/docker/client/swarm_init.go index 9e65e1cc..2049bb6b 100644 --- a/vendor/github.com/docker/docker/client/swarm_init.go +++ b/vendor/github.com/docker/docker/client/swarm_init.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmInit initializes the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_inspect.go b/vendor/github.com/docker/docker/client/swarm_inspect.go index 77e72f84..df8b6b3a 100644 --- a/vendor/github.com/docker/docker/client/swarm_inspect.go +++ b/vendor/github.com/docker/docker/client/swarm_inspect.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmInspect inspects the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_join.go b/vendor/github.com/docker/docker/client/swarm_join.go index 19e5192b..446d4d04 100644 --- a/vendor/github.com/docker/docker/client/swarm_join.go +++ b/vendor/github.com/docker/docker/client/swarm_join.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmJoin joins the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_leave.go b/vendor/github.com/docker/docker/client/swarm_leave.go index 3a205cf3..709e5adb 100644 --- a/vendor/github.com/docker/docker/client/swarm_leave.go +++ b/vendor/github.com/docker/docker/client/swarm_leave.go @@ -1,9 +1,8 @@ package client import ( + "context" "net/url" - - "golang.org/x/net/context" ) // SwarmLeave leaves the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_unlock.go b/vendor/github.com/docker/docker/client/swarm_unlock.go index 9ee441fe..a9ca424b 100644 --- a/vendor/github.com/docker/docker/client/swarm_unlock.go +++ b/vendor/github.com/docker/docker/client/swarm_unlock.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmUnlock unlocks locked swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_update.go b/vendor/github.com/docker/docker/client/swarm_update.go index 7245fd4e..820ef5b2 100644 --- a/vendor/github.com/docker/docker/client/swarm_update.go +++ b/vendor/github.com/docker/docker/client/swarm_update.go @@ -1,12 +1,12 @@ package client import ( + "context" "fmt" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmUpdate updates the swarm. diff --git a/vendor/github.com/docker/docker/client/task_inspect.go b/vendor/github.com/docker/docker/client/task_inspect.go index bc8058fc..414c86bf 100644 --- a/vendor/github.com/docker/docker/client/task_inspect.go +++ b/vendor/github.com/docker/docker/client/task_inspect.go @@ -2,23 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - - "golang.org/x/net/context" ) // TaskInspectWithRaw returns the task information and its raw representation.. func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) { + if taskID == "" { + return swarm.Task{}, nil, objectNotFoundError{object: "task", id: taskID} + } serverResp, err := cli.get(ctx, "/tasks/"+taskID, nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Task{}, nil, taskNotFoundError{taskID} - } - return swarm.Task{}, nil, err + return swarm.Task{}, nil, wrapResponseError(err, serverResp, "task", taskID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/task_list.go b/vendor/github.com/docker/docker/client/task_list.go index 66324da9..71e57aa5 100644 --- a/vendor/github.com/docker/docker/client/task_list.go +++ b/vendor/github.com/docker/docker/client/task_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // TaskList returns the list of tasks. @@ -15,7 +15,7 @@ func (cli *Client) TaskList(ctx context.Context, options types.TaskListOptions) query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/task_logs.go b/vendor/github.com/docker/docker/client/task_logs.go index 2ed19543..5c96c7dc 100644 --- a/vendor/github.com/docker/docker/client/task_logs.go +++ b/vendor/github.com/docker/docker/client/task_logs.go @@ -1,12 +1,11 @@ package client import ( + "context" "io" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" timetypes "github.com/docker/docker/api/types/time" ) diff --git a/vendor/github.com/docker/docker/client/transport.go b/vendor/github.com/docker/docker/client/transport.go index 401ab15d..73f6ef7b 100644 --- a/vendor/github.com/docker/docker/client/transport.go +++ b/vendor/github.com/docker/docker/client/transport.go @@ -5,14 +5,6 @@ import ( "net/http" ) -// transportFunc allows us to inject a mock transport for testing. We define it -// here so we can detect the tlsconfig and return nil for only this type. -type transportFunc func(*http.Request) (*http.Response, error) - -func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) { - return tf(req) -} - // resolveTLSConfig attempts to resolve the TLS configuration from the // RoundTripper. func resolveTLSConfig(transport http.RoundTripper) *tls.Config { diff --git a/vendor/github.com/docker/docker/client/utils.go b/vendor/github.com/docker/docker/client/utils.go index f3d8877d..13770506 100644 --- a/vendor/github.com/docker/docker/client/utils.go +++ b/vendor/github.com/docker/docker/client/utils.go @@ -24,7 +24,7 @@ func getDockerOS(serverHeader string) string { func getFiltersQuery(f filters.Args) (url.Values, error) { query := url.Values{} if f.Len() > 0 { - filterJSON, err := filters.ToParam(f) + filterJSON, err := filters.ToJSON(f) if err != nil { return query, err } diff --git a/vendor/github.com/docker/docker/client/version.go b/vendor/github.com/docker/docker/client/version.go index 933ceb4a..7bcc65f6 100644 --- a/vendor/github.com/docker/docker/client/version.go +++ b/vendor/github.com/docker/docker/client/version.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ServerVersion returns information of the docker client and server host. diff --git a/vendor/github.com/docker/docker/client/volume_create.go b/vendor/github.com/docker/docker/client/volume_create.go index 9620c87c..e6abd227 100644 --- a/vendor/github.com/docker/docker/client/volume_create.go +++ b/vendor/github.com/docker/docker/client/volume_create.go @@ -1,15 +1,15 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" ) // VolumeCreate creates a volume in the docker host. -func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) { +func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) { var volume types.Volume resp, err := cli.post(ctx, "/volumes/create", nil, options, nil) if err != nil { diff --git a/vendor/github.com/docker/docker/client/volume_inspect.go b/vendor/github.com/docker/docker/client/volume_inspect.go index 3860e9b2..9b077ba4 100644 --- a/vendor/github.com/docker/docker/client/volume_inspect.go +++ b/vendor/github.com/docker/docker/client/volume_inspect.go @@ -2,12 +2,11 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // VolumeInspect returns the information about a specific volume in the docker host. @@ -18,13 +17,14 @@ func (cli *Client) VolumeInspect(ctx context.Context, volumeID string) (types.Vo // VolumeInspectWithRaw returns the information about a specific volume in the docker host and its raw representation func (cli *Client) VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) { + if volumeID == "" { + return types.Volume{}, nil, objectNotFoundError{object: "volume", id: volumeID} + } + var volume types.Volume resp, err := cli.get(ctx, "/volumes/"+volumeID, nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return volume, nil, volumeNotFoundError{volumeID} - } - return volume, nil, err + return volume, nil, wrapResponseError(err, resp, "volume", volumeID) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/volume_list.go b/vendor/github.com/docker/docker/client/volume_list.go index 32247ce1..f8454284 100644 --- a/vendor/github.com/docker/docker/client/volume_list.go +++ b/vendor/github.com/docker/docker/client/volume_list.go @@ -1,17 +1,17 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types/filters" volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" ) // VolumeList returns the volumes configured in the docker host. -func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) { - var volumes volumetypes.VolumesListOKBody +func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumeListOKBody, error) { + var volumes volumetypes.VolumeListOKBody query := url.Values{} if filter.Len() > 0 { diff --git a/vendor/github.com/docker/docker/client/volume_prune.go b/vendor/github.com/docker/docker/client/volume_prune.go index 2e7fea77..dfe8aafa 100644 --- a/vendor/github.com/docker/docker/client/volume_prune.go +++ b/vendor/github.com/docker/docker/client/volume_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // VolumesPrune requests the daemon to delete unused data diff --git a/vendor/github.com/docker/docker/client/volume_remove.go b/vendor/github.com/docker/docker/client/volume_remove.go index 6c26575b..5b99a8ae 100644 --- a/vendor/github.com/docker/docker/client/volume_remove.go +++ b/vendor/github.com/docker/docker/client/volume_remove.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" ) // VolumeRemove removes a volume from the docker host. @@ -17,5 +17,5 @@ func (cli *Client) VolumeRemove(ctx context.Context, volumeID string, force bool } resp, err := cli.delete(ctx, "/volumes/"+volumeID, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "volume", volumeID) } diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/BUILD b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/BUILD new file mode 100644 index 00000000..bd82e1c8 --- /dev/null +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/BUILD @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "jsonlog.go", + "jsonlogbytes.go", + "time_marshalling.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", + importpath = "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/pkg/errors:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go new file mode 100644 index 00000000..549e3558 --- /dev/null +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go @@ -0,0 +1,25 @@ +package jsonlog + +import ( + "time" +) + +// JSONLog is a log message, typically a single entry from a given log stream. +type JSONLog struct { + // Log is the log message + Log string `json:"log,omitempty"` + // Stream is the log source + Stream string `json:"stream,omitempty"` + // Created is the created timestamp of log + Created time.Time `json:"time"` + // Attrs is the list of extra attributes provided by the user + Attrs map[string]string `json:"attrs,omitempty"` +} + +// Reset all fields to their zero value. +func (jl *JSONLog) Reset() { + jl.Log = "" + jl.Stream = "" + jl.Created = time.Time{} + jl.Attrs = make(map[string]string) +} diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go new file mode 100644 index 00000000..37604ae5 --- /dev/null +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go @@ -0,0 +1,125 @@ +package jsonlog + +import ( + "bytes" + "encoding/json" + "time" + "unicode/utf8" +) + +// JSONLogs marshals encoded JSONLog objects +type JSONLogs struct { + Log []byte `json:"log,omitempty"` + Stream string `json:"stream,omitempty"` + Created time.Time `json:"time"` + + // json-encoded bytes + RawAttrs json.RawMessage `json:"attrs,omitempty"` +} + +// MarshalJSONBuf is an optimized JSON marshaller that avoids reflection +// and unnecessary allocation. +func (mj *JSONLogs) MarshalJSONBuf(buf *bytes.Buffer) error { + var first = true + + buf.WriteString(`{`) + if len(mj.Log) != 0 { + first = false + buf.WriteString(`"log":`) + ffjsonWriteJSONBytesAsString(buf, mj.Log) + } + if len(mj.Stream) != 0 { + if first { + first = false + } else { + buf.WriteString(`,`) + } + buf.WriteString(`"stream":`) + ffjsonWriteJSONBytesAsString(buf, []byte(mj.Stream)) + } + if len(mj.RawAttrs) > 0 { + if first { + first = false + } else { + buf.WriteString(`,`) + } + buf.WriteString(`"attrs":`) + buf.Write(mj.RawAttrs) + } + if !first { + buf.WriteString(`,`) + } + + created, err := fastTimeMarshalJSON(mj.Created) + if err != nil { + return err + } + + buf.WriteString(`"time":`) + buf.WriteString(created) + buf.WriteString(`}`) + return nil +} + +func ffjsonWriteJSONBytesAsString(buf *bytes.Buffer, s []byte) { + const hex = "0123456789abcdef" + + buf.WriteByte('"') + start := 0 + for i := 0; i < len(s); { + if b := s[i]; b < utf8.RuneSelf { + if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { + i++ + continue + } + if start < i { + buf.Write(s[start:i]) + } + switch b { + case '\\', '"': + buf.WriteByte('\\') + buf.WriteByte(b) + case '\n': + buf.WriteByte('\\') + buf.WriteByte('n') + case '\r': + buf.WriteByte('\\') + buf.WriteByte('r') + default: + + buf.WriteString(`\u00`) + buf.WriteByte(hex[b>>4]) + buf.WriteByte(hex[b&0xF]) + } + i++ + start = i + continue + } + c, size := utf8.DecodeRune(s[i:]) + if c == utf8.RuneError && size == 1 { + if start < i { + buf.Write(s[start:i]) + } + buf.WriteString(`\ufffd`) + i += size + start = i + continue + } + + if c == '\u2028' || c == '\u2029' { + if start < i { + buf.Write(s[start:i]) + } + buf.WriteString(`\u202`) + buf.WriteByte(hex[c&0xF]) + i += size + start = i + continue + } + i += size + } + if start < len(s) { + buf.Write(s[start:]) + } + buf.WriteByte('"') +} diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go new file mode 100644 index 00000000..5fd8023e --- /dev/null +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go @@ -0,0 +1,20 @@ +package jsonlog + +import ( + "time" + + "github.com/pkg/errors" +) + +const jsonFormat = `"` + time.RFC3339Nano + `"` + +// fastTimeMarshalJSON avoids one of the extra allocations that +// time.MarshalJSON is making. +func fastTimeMarshalJSON(t time.Time) (string, error) { + if y := t.Year(); y < 0 || y >= 10000 { + // RFC 3339 is clear that years are 4 digits exactly. + // See golang.org/issue/4556#c15 for more discussion. + return "", errors.New("time.MarshalJSON: year outside of range [0,9999]") + } + return t.Format(jsonFormat), nil +} diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD b/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD index cb2ad118..a887bd32 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD @@ -3,11 +3,11 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["jsonmessage.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/jsonmessage", importpath = "github.com/docker/docker/pkg/jsonmessage", visibility = ["//visibility:public"], deps = [ "//vendor/github.com/Nvveen/Gotty:go_default_library", - "//vendor/github.com/docker/docker/pkg/jsonlog:go_default_library", "//vendor/github.com/docker/docker/pkg/term:go_default_library", "//vendor/github.com/docker/go-units:go_default_library", ], diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go index dc785d61..14377ee8 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go @@ -9,12 +9,14 @@ import ( "time" "github.com/Nvveen/Gotty" - - "github.com/docker/docker/pkg/jsonlog" "github.com/docker/docker/pkg/term" "github.com/docker/go-units" ) +// RFC3339NanoFixed is time.RFC3339Nano with nanoseconds padded using zeros to +// ensure the formatted time isalways the same number of characters. +const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" + // JSONError wraps a concrete Code and Message, `Code` is // is an integer error code, `Message` is the error message. type JSONError struct { @@ -38,21 +40,17 @@ type JSONProgress struct { // If true, don't show xB/yB HideCounts bool `json:"hidecounts,omitempty"` Units string `json:"units,omitempty"` + nowFunc func() time.Time + winSize int } func (p *JSONProgress) String() string { var ( - width = 200 + width = p.width() pbBox string numbersBox string timeLeftBox string ) - - ws, err := term.GetWinsize(p.terminalFd) - if err == nil { - width = int(ws.Width) - } - if p.Current <= 0 && p.Total <= 0 { return "" } @@ -101,7 +99,7 @@ func (p *JSONProgress) String() string { } if p.Current > 0 && p.Start > 0 && percentage < 50 { - fromStart := time.Now().UTC().Sub(time.Unix(p.Start, 0)) + fromStart := p.now().Sub(time.Unix(p.Start, 0)) perEntry := fromStart / time.Duration(p.Current) left := time.Duration(p.Total-p.Current) * perEntry left = (left / time.Second) * time.Second @@ -113,6 +111,28 @@ func (p *JSONProgress) String() string { return pbBox + numbersBox + timeLeftBox } +// shim for testing +func (p *JSONProgress) now() time.Time { + if p.nowFunc == nil { + p.nowFunc = func() time.Time { + return time.Now().UTC() + } + } + return p.nowFunc() +} + +// shim for testing +func (p *JSONProgress) width() int { + if p.winSize != 0 { + return p.winSize + } + ws, err := term.GetWinsize(p.terminalFd) + if err == nil { + return int(ws.Width) + } + return 200 +} + // JSONMessage defines a message struct. It describes // the created time, where it from, status, ID of the // message. It's used for docker events. @@ -187,7 +207,7 @@ func cursorDown(out io.Writer, ti termInfo, l int) { func (jm *JSONMessage) Display(out io.Writer, termInfo termInfo) error { if jm.Error != nil { if jm.Error.Code == 401 { - return fmt.Errorf("Authentication is required.") + return fmt.Errorf("authentication is required") } return jm.Error } @@ -200,9 +220,9 @@ func (jm *JSONMessage) Display(out io.Writer, termInfo termInfo) error { return nil } if jm.TimeNano != 0 { - fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(jsonlog.RFC3339NanoFixed)) + fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(RFC3339NanoFixed)) } else if jm.Time != 0 { - fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(jsonlog.RFC3339NanoFixed)) + fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(RFC3339NanoFixed)) } if jm.ID != "" { fmt.Fprintf(out, "%s: ", jm.ID) @@ -225,7 +245,7 @@ func (jm *JSONMessage) Display(out io.Writer, termInfo termInfo) error { // DisplayJSONMessagesStream displays a json message stream from `in` to `out`, `isTerminal` // describes if `out` is a terminal. If this is the case, it will print `\n` at the end of // each line and move the cursor while displaying. -func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(*json.RawMessage)) error { +func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(JSONMessage)) error { var ( dec = json.NewDecoder(in) ids = make(map[string]int) @@ -257,7 +277,7 @@ func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, if jm.Aux != nil { if auxCallback != nil { - auxCallback(jm.Aux) + auxCallback(jm) } continue } @@ -310,6 +330,6 @@ type stream interface { } // DisplayJSONMessagesToStream prints json messages to the output stream -func DisplayJSONMessagesToStream(in io.Reader, stream stream, auxCallback func(*json.RawMessage)) error { +func DisplayJSONMessagesToStream(in io.Reader, stream stream, auxCallback func(JSONMessage)) error { return DisplayJSONMessagesStream(in, stream, stream.FD(), stream.IsTerminal(), auxCallback) } diff --git a/vendor/github.com/docker/docker/pkg/mount/BUILD b/vendor/github.com/docker/docker/pkg/mount/BUILD new file mode 100644 index 00000000..d5aaca3c --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/mount/BUILD @@ -0,0 +1,50 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "flags.go", + "flags_freebsd.go", + "flags_linux.go", + "flags_unsupported.go", + "mount.go", + "mounter_freebsd.go", + "mounter_linux.go", + "mounter_unsupported.go", + "mountinfo.go", + "mountinfo_freebsd.go", + "mountinfo_linux.go", + "mountinfo_unsupported.go", + "mountinfo_windows.go", + "sharedsubtree_linux.go", + ], + cgo = True, + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/mount", + importpath = "github.com/docker/docker/pkg/mount", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/sirupsen/logrus:go_default_library", + ] + select({ + "@io_bazel_rules_go//go/platform:freebsd": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go index 9ed741e3..43d5e339 100644 --- a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go @@ -1,4 +1,4 @@ -// +build !linux,!freebsd freebsd,!cgo solaris,!cgo +// +build !linux,!freebsd freebsd,!cgo package mount diff --git a/vendor/github.com/docker/docker/pkg/mount/mount.go b/vendor/github.com/docker/docker/pkg/mount/mount.go index c9fdfd69..c329819b 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mount.go +++ b/vendor/github.com/docker/docker/pkg/mount/mount.go @@ -3,28 +3,64 @@ package mount import ( "sort" "strings" + "syscall" + + "github.com/sirupsen/logrus" ) -// GetMounts retrieves a list of mounts for the current running process. -func GetMounts() ([]*Info, error) { - return parseMountTable() +// FilterFunc is a type defining a callback function +// to filter out unwanted entries. It takes a pointer +// to an Info struct (not fully populated, currently +// only Mountpoint is filled in), and returns two booleans: +// - skip: true if the entry should be skipped +// - stop: true if parsing should be stopped after the entry +type FilterFunc func(*Info) (skip, stop bool) + +// PrefixFilter discards all entries whose mount points +// do not start with a prefix specified +func PrefixFilter(prefix string) FilterFunc { + return func(m *Info) (bool, bool) { + skip := !strings.HasPrefix(m.Mountpoint, prefix) + return skip, false + } +} + +// SingleEntryFilter looks for a specific entry +func SingleEntryFilter(mp string) FilterFunc { + return func(m *Info) (bool, bool) { + if m.Mountpoint == mp { + return false, true // don't skip, stop now + } + return true, false // skip, keep going + } +} + +// ParentsFilter returns all entries whose mount points +// can be parents of a path specified, discarding others. +// For example, given `/var/lib/docker/something`, entries +// like `/var/lib/docker`, `/var` and `/` are returned. +func ParentsFilter(path string) FilterFunc { + return func(m *Info) (bool, bool) { + skip := !strings.HasPrefix(path, m.Mountpoint) + return skip, false + } +} + +// GetMounts retrieves a list of mounts for the current running process, +// with an optional filter applied (use nil for no filter). +func GetMounts(f FilterFunc) ([]*Info, error) { + return parseMountTable(f) } // Mounted determines if a specified mountpoint has been mounted. -// On Linux it looks at /proc/self/mountinfo and on Solaris at mnttab. +// On Linux it looks at /proc/self/mountinfo. func Mounted(mountpoint string) (bool, error) { - entries, err := parseMountTable() + entries, err := GetMounts(SingleEntryFilter(mountpoint)) if err != nil { return false, err } - // Search the table for the mountpoint - for _, e := range entries { - if e.Mountpoint == mountpoint { - return true, nil - } - } - return false, nil + return len(entries) > 0, nil } // Mount will mount filesystem according to the specified configuration, on the @@ -53,34 +89,53 @@ func ForceMount(device, target, mType, options string) error { // Unmount lazily unmounts a filesystem on supported platforms, otherwise // does a normal unmount. func Unmount(target string) error { - if mounted, err := Mounted(target); err != nil || !mounted { - return err + err := unmount(target, mntDetach) + if err == syscall.EINVAL { + // ignore "not mounted" error + err = nil } - return unmount(target, mntDetach) + return err } // RecursiveUnmount unmounts the target and all mounts underneath, starting with // the deepsest mount first. func RecursiveUnmount(target string) error { - mounts, err := GetMounts() + mounts, err := parseMountTable(PrefixFilter(target)) if err != nil { return err } // Make the deepest mount be first - sort.Sort(sort.Reverse(byMountpoint(mounts))) + sort.Slice(mounts, func(i, j int) bool { + return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) + }) for i, m := range mounts { - if !strings.HasPrefix(m.Mountpoint, target) { - continue - } - if err := Unmount(m.Mountpoint); err != nil && i == len(mounts)-1 { - if mounted, err := Mounted(m.Mountpoint); err != nil || mounted { - return err + logrus.Debugf("Trying to unmount %s", m.Mountpoint) + err = unmount(m.Mountpoint, mntDetach) + if err != nil { + // If the error is EINVAL either this whole package is wrong (invalid flags passed to unmount(2)) or this is + // not a mountpoint (which is ok in this case). + // Meanwhile calling `Mounted()` is very expensive. + // + // We've purposefully used `syscall.EINVAL` here instead of `unix.EINVAL` to avoid platform branching + // Since `EINVAL` is defined for both Windows and Linux in the `syscall` package (and other platforms), + // this is nicer than defining a custom value that we can refer to in each platform file. + if err == syscall.EINVAL { + continue + } + if i == len(mounts)-1 { + if mounted, e := Mounted(m.Mountpoint); e != nil || mounted { + return err + } + continue } - // Ignore errors for submounts and continue trying to unmount others - // The final unmount should fail if there ane any submounts remaining + // This is some submount, we can ignore this error for now, the final unmount will fail if this is a real problem + logrus.WithError(err).Warnf("Failed to unmount submount %s", m.Mountpoint) + continue } + + logrus.Debugf("Unmounted %s", m.Mountpoint) } return nil } diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go b/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go deleted file mode 100644 index c684aa81..00000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build solaris,cgo - -package mount - -import ( - "golang.org/x/sys/unix" - "unsafe" -) - -// #include -// #include -// #include -// int Mount(const char *spec, const char *dir, int mflag, -// char *fstype, char *dataptr, int datalen, char *optptr, int optlen) { -// return mount(spec, dir, mflag, fstype, dataptr, datalen, optptr, optlen); -// } -import "C" - -func mount(device, target, mType string, flag uintptr, data string) error { - spec := C.CString(device) - dir := C.CString(target) - fstype := C.CString(mType) - _, err := C.Mount(spec, dir, C.int(flag), fstype, nil, 0, nil, 0) - C.free(unsafe.Pointer(spec)) - C.free(unsafe.Pointer(dir)) - C.free(unsafe.Pointer(fstype)) - return err -} - -func unmount(target string, flag int) error { - err := unix.Unmount(target, flag) - return err -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go index a2a3bb45..eb93365e 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go @@ -1,4 +1,4 @@ -// +build !linux,!freebsd,!solaris freebsd,!cgo solaris,!cgo +// +build !linux,!freebsd freebsd,!cgo package mount diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo.go index ff4cc1d8..e3fc3535 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo.go @@ -38,17 +38,3 @@ type Info struct { // VfsOpts represents per super block options. VfsOpts string } - -type byMountpoint []*Info - -func (by byMountpoint) Len() int { - return len(by) -} - -func (by byMountpoint) Less(i, j int) bool { - return by[i].Mountpoint < by[j].Mountpoint -} - -func (by byMountpoint) Swap(i, j int) { - by[i], by[j] = by[j], by[i] -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go index 4f32edcd..3700860c 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go @@ -15,7 +15,7 @@ import ( // Parse /proc/self/mountinfo because comparing Dev and ino does not work from // bind mounts. -func parseMountTable() ([]*Info, error) { +func parseMountTable(filter FilterFunc) ([]*Info, error) { var rawEntries *C.struct_statfs count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) @@ -32,10 +32,24 @@ func parseMountTable() ([]*Info, error) { var out []*Info for _, entry := range entries { var mountinfo Info + var skip, stop bool mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) + + if filter != nil { + // filter out entries we're not interested in + skip, stop = filter(p) + if skip { + continue + } + } + mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) + out = append(out, &mountinfo) + if stop { + break + } } return out, nil } diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go index be69fee1..614a479f 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go @@ -1,5 +1,3 @@ -// +build linux - package mount import ( @@ -7,80 +5,119 @@ import ( "fmt" "io" "os" + "strconv" "strings" ) -const ( - /* 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue - (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) +func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { + s := bufio.NewScanner(r) + out := []*Info{} + for s.Scan() { + if err := s.Err(); err != nil { + return nil, err + } + /* + 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) - (1) mount ID: unique identifier of the mount (may be reused after umount) - (2) parent ID: ID of parent (or of self for the top of the mount tree) - (3) major:minor: value of st_dev for files on filesystem - (4) root: root of the mount within the filesystem - (5) mount point: mount point relative to the process's root - (6) mount options: per mount options - (7) optional fields: zero or more fields of the form "tag[:value]" - (8) separator: marks the end of the optional fields - (9) filesystem type: name of filesystem of the form "type[.subtype]" - (10) mount source: filesystem specific information or "none" - (11) super options: per super block options*/ - mountinfoFormat = "%d %d %d:%d %s %s %s %s" -) + (1) mount ID: unique identifier of the mount (may be reused after umount) + (2) parent ID: ID of parent (or of self for the top of the mount tree) + (3) major:minor: value of st_dev for files on filesystem + (4) root: root of the mount within the filesystem + (5) mount point: mount point relative to the process's root + (6) mount options: per mount options + (7) optional fields: zero or more fields of the form "tag[:value]" + (8) separator: marks the end of the optional fields + (9) filesystem type: name of filesystem of the form "type[.subtype]" + (10) mount source: filesystem specific information or "none" + (11) super options: per super block options + */ -// Parse /proc/self/mountinfo because comparing Dev and ino does not work from -// bind mounts -func parseMountTable() ([]*Info, error) { - f, err := os.Open("/proc/self/mountinfo") - if err != nil { - return nil, err - } - defer f.Close() + text := s.Text() + fields := strings.Split(text, " ") + numFields := len(fields) + if numFields < 10 { + // should be at least 10 fields + return nil, fmt.Errorf("Parsing '%s' failed: not enough fields (%d)", text, numFields) + } - return parseInfoFile(f) -} + p := &Info{} + // ignore any numbers parsing errors, as there should not be any + p.ID, _ = strconv.Atoi(fields[0]) + p.Parent, _ = strconv.Atoi(fields[1]) + mm := strings.Split(fields[2], ":") + if len(mm) != 2 { + return nil, fmt.Errorf("Parsing '%s' failed: unexpected minor:major pair %s", text, mm) + } + p.Major, _ = strconv.Atoi(mm[0]) + p.Minor, _ = strconv.Atoi(mm[1]) -func parseInfoFile(r io.Reader) ([]*Info, error) { - var ( - s = bufio.NewScanner(r) - out = []*Info{} - ) + p.Root = fields[3] + p.Mountpoint = fields[4] + p.Opts = fields[5] - for s.Scan() { - if err := s.Err(); err != nil { - return nil, err + var skip, stop bool + if filter != nil { + // filter out entries we're not interested in + skip, stop = filter(p) + if skip { + continue + } } - var ( - p = &Info{} - text = s.Text() - optionalFields string - ) - - if _, err := fmt.Sscanf(text, mountinfoFormat, - &p.ID, &p.Parent, &p.Major, &p.Minor, - &p.Root, &p.Mountpoint, &p.Opts, &optionalFields); err != nil { - return nil, fmt.Errorf("Scanning '%s' failed: %s", text, err) + // one or more optional fields, when a separator (-) + i := 6 + for ; i < numFields && fields[i] != "-"; i++ { + switch i { + case 6: + p.Optional = fields[6] + default: + /* NOTE there might be more optional fields before the such as + fields[7]...fields[N] (where N < sepIndex), although + as of Linux kernel 4.15 the only known ones are + mount propagation flags in fields[6]. The correct + behavior is to ignore any unknown optional fields. + */ + break + } } - // Safe as mountinfo encodes mountpoints with spaces as \040. - index := strings.Index(text, " - ") - postSeparatorFields := strings.Fields(text[index+3:]) - if len(postSeparatorFields) < 3 { - return nil, fmt.Errorf("Error found less than 3 fields post '-' in %q", text) + if i == numFields { + return nil, fmt.Errorf("Parsing '%s' failed: missing separator ('-')", text) } - if optionalFields != "-" { - p.Optional = optionalFields + // There should be 3 fields after the separator... + if i+4 > numFields { + return nil, fmt.Errorf("Parsing '%s' failed: not enough fields after a separator", text) } + // ... but in Linux <= 3.9 mounting a cifs with spaces in a share name + // (like "//serv/My Documents") _may_ end up having a space in the last field + // of mountinfo (like "unc=//serv/My Documents"). Since kernel 3.10-rc1, cifs + // option unc= is ignored, so a space should not appear. In here we ignore + // those "extra" fields caused by extra spaces. + p.Fstype = fields[i+1] + p.Source = fields[i+2] + p.VfsOpts = fields[i+3] - p.Fstype = postSeparatorFields[0] - p.Source = postSeparatorFields[1] - p.VfsOpts = strings.Join(postSeparatorFields[2:], " ") out = append(out, p) + if stop { + break + } } return out, nil } +// Parse /proc/self/mountinfo because comparing Dev and ino does not work from +// bind mounts +func parseMountTable(filter FilterFunc) ([]*Info, error) { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return nil, err + } + defer f.Close() + + return parseInfoFile(f, filter) +} + // PidMountInfo collects the mounts for a specific process ID. If the process // ID is unknown, it is better to use `GetMounts` which will inspect // "/proc/self/mountinfo" instead. @@ -91,5 +128,5 @@ func PidMountInfo(pid int) ([]*Info, error) { } defer f.Close() - return parseInfoFile(f) + return parseInfoFile(f, nil) } diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go deleted file mode 100644 index ad9ab57f..00000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build solaris,cgo - -package mount - -/* -#include -#include -*/ -import "C" - -import ( - "fmt" -) - -func parseMountTable() ([]*Info, error) { - mnttab := C.fopen(C.CString(C.MNTTAB), C.CString("r")) - if mnttab == nil { - return nil, fmt.Errorf("Failed to open %s", C.MNTTAB) - } - - var out []*Info - var mp C.struct_mnttab - - ret := C.getmntent(mnttab, &mp) - for ret == 0 { - var mountinfo Info - mountinfo.Mountpoint = C.GoString(mp.mnt_mountp) - mountinfo.Source = C.GoString(mp.mnt_special) - mountinfo.Fstype = C.GoString(mp.mnt_fstype) - mountinfo.Opts = C.GoString(mp.mnt_mntopts) - out = append(out, &mountinfo) - ret = C.getmntent(mnttab, &mp) - } - - C.fclose(mnttab) - return out, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go index 7fbcf192..b57a7bd8 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go @@ -1,4 +1,4 @@ -// +build !windows,!linux,!freebsd,!solaris freebsd,!cgo solaris,!cgo +// +build !windows,!linux,!freebsd freebsd,!cgo package mount @@ -7,6 +7,6 @@ import ( "runtime" ) -func parseMountTable() ([]*Info, error) { +func parseMountTable(f FilterFunc) ([]*Info, error) { return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) } diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go index dab8a37e..cb41910b 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go @@ -1,6 +1,6 @@ package mount -func parseMountTable() ([]*Info, error) { +func parseMountTable(f FilterFunc) ([]*Info, error) { // Do NOT return an error! return nil, nil } diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go index 8ceec84b..f3c13e5a 100644 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go +++ b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go @@ -1,5 +1,3 @@ -// +build linux - package mount // MakeShared ensures a mounted filesystem has the SHARED mount option enabled. diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go deleted file mode 100644 index 09f6b03c..00000000 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go +++ /dev/null @@ -1,58 +0,0 @@ -// +build solaris - -package mount - -// MakeShared ensures a mounted filesystem has the SHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "shared") -} - -// MakeRShared ensures a mounted filesystem has the RSHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "rshared") -} - -// MakePrivate ensures a mounted filesystem has the PRIVATE mount option enabled. -// See the supported options in flags.go for further reference. -func MakePrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "private") -} - -// MakeRPrivate ensures a mounted filesystem has the RPRIVATE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeRPrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "rprivate") -} - -// MakeSlave ensures a mounted filesystem has the SLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "slave") -} - -// MakeRSlave ensures a mounted filesystem has the RSLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "rslave") -} - -// MakeUnbindable ensures a mounted filesystem has the UNBINDABLE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "unbindable") -} - -// MakeRUnbindable ensures a mounted filesystem has the RUNBINDABLE mount -// option enabled. See the supported options in flags.go for further reference. -func MakeRUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "runbindable") -} - -func ensureMountedAs(mountPoint, options string) error { - // TODO: Solaris does not support bind mounts. - // Evaluate lofs and also look at the relevant - // mount flags to be supported. - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD new file mode 100644 index 00000000..c716fec4 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD @@ -0,0 +1,36 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "operatingsystem_linux.go", + "operatingsystem_unix.go", + "operatingsystem_windows.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/parsers/operatingsystem", + importpath = "github.com/docker/docker/pkg/parsers/operatingsystem", + visibility = ["//visibility:public"], + deps = select({ + "@io_bazel_rules_go//go/platform:linux": [ + "//vendor/github.com/mattn/go-shellwords:go_default_library", + ], + "@io_bazel_rules_go//go/platform:windows": [ + "//vendor/golang.org/x/sys/windows/registry:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go new file mode 100644 index 00000000..e04a3499 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_linux.go @@ -0,0 +1,77 @@ +// Package operatingsystem provides helper function to get the operating system +// name for different platforms. +package operatingsystem + +import ( + "bufio" + "bytes" + "fmt" + "io/ioutil" + "os" + "strings" + + "github.com/mattn/go-shellwords" +) + +var ( + // file to use to detect if the daemon is running in a container + proc1Cgroup = "/proc/1/cgroup" + + // file to check to determine Operating System + etcOsRelease = "/etc/os-release" + + // used by stateless systems like Clear Linux + altOsRelease = "/usr/lib/os-release" +) + +// GetOperatingSystem gets the name of the current operating system. +func GetOperatingSystem() (string, error) { + osReleaseFile, err := os.Open(etcOsRelease) + if err != nil { + if !os.IsNotExist(err) { + return "", fmt.Errorf("Error opening %s: %v", etcOsRelease, err) + } + osReleaseFile, err = os.Open(altOsRelease) + if err != nil { + return "", fmt.Errorf("Error opening %s: %v", altOsRelease, err) + } + } + defer osReleaseFile.Close() + + var prettyName string + scanner := bufio.NewScanner(osReleaseFile) + for scanner.Scan() { + line := scanner.Text() + if strings.HasPrefix(line, "PRETTY_NAME=") { + data := strings.SplitN(line, "=", 2) + prettyNames, err := shellwords.Parse(data[1]) + if err != nil { + return "", fmt.Errorf("PRETTY_NAME is invalid: %s", err.Error()) + } + if len(prettyNames) != 1 { + return "", fmt.Errorf("PRETTY_NAME needs to be enclosed by quotes if they have spaces: %s", data[1]) + } + prettyName = prettyNames[0] + } + } + if prettyName != "" { + return prettyName, nil + } + // If not set, defaults to PRETTY_NAME="Linux" + // c.f. http://www.freedesktop.org/software/systemd/man/os-release.html + return "Linux", nil +} + +// IsContainerized returns true if we are running inside a container. +func IsContainerized() (bool, error) { + b, err := ioutil.ReadFile(proc1Cgroup) + if err != nil { + return false, err + } + for _, line := range bytes.Split(b, []byte{'\n'}) { + if len(line) > 0 && !bytes.HasSuffix(line, []byte{'/'}) && !bytes.HasSuffix(line, []byte("init.scope")) { + return true, nil + } + } + return false, nil +} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go new file mode 100644 index 00000000..bc91c3c5 --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_unix.go @@ -0,0 +1,25 @@ +// +build freebsd darwin + +package operatingsystem + +import ( + "errors" + "os/exec" +) + +// GetOperatingSystem gets the name of the current operating system. +func GetOperatingSystem() (string, error) { + cmd := exec.Command("uname", "-s") + osName, err := cmd.Output() + if err != nil { + return "", err + } + return string(osName), nil +} + +// IsContainerized returns true if we are running inside a container. +// No-op on FreeBSD and Darwin, always returns false. +func IsContainerized() (bool, error) { + // TODO: Implement jail detection for freeBSD + return false, errors.New("Cannot detect if we are in container") +} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go new file mode 100644 index 00000000..28642c0b --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go @@ -0,0 +1,51 @@ +package operatingsystem + +import ( + "fmt" + + "golang.org/x/sys/windows/registry" +) + +// GetOperatingSystem gets the name of the current operating system. +func GetOperatingSystem() (string, error) { + + // Default return value + ret := "Unknown Operating System" + + k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) + if err != nil { + return ret, err + } + defer k.Close() + + pn, _, err := k.GetStringValue("ProductName") + if err != nil { + return ret, err + } + ret = pn + + ri, _, err := k.GetStringValue("ReleaseId") + if err != nil { + return ret, err + } + ret = fmt.Sprintf("%s Version %s", ret, ri) + + cbn, _, err := k.GetStringValue("CurrentBuildNumber") + if err != nil { + return ret, err + } + + ubr, _, err := k.GetIntegerValue("UBR") + if err != nil { + return ret, err + } + ret = fmt.Sprintf("%s (OS Build %s.%d)", ret, cbn, ubr) + + return ret, nil +} + +// IsContainerized returns true if we are running inside a container. +// No-op on Windows, always returns false. +func IsContainerized() (bool, error) { + return false, nil +} diff --git a/vendor/github.com/google/cadvisor/AUTHORS b/vendor/github.com/google/cadvisor/AUTHORS new file mode 100644 index 00000000..1ddf1a75 --- /dev/null +++ b/vendor/github.com/google/cadvisor/AUTHORS @@ -0,0 +1,9 @@ +# This is the official list of cAdvisor authors for copyright purposes. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +Google Inc. diff --git a/vendor/github.com/google/cadvisor/api/BUILD b/vendor/github.com/google/cadvisor/accelerators/BUILD similarity index 60% rename from vendor/github.com/google/cadvisor/api/BUILD rename to vendor/github.com/google/cadvisor/accelerators/BUILD index e5b2775b..9936faec 100644 --- a/vendor/github.com/google/cadvisor/api/BUILD +++ b/vendor/github.com/google/cadvisor/accelerators/BUILD @@ -3,18 +3,16 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ - "handler.go", - "versions.go", + "nvidia.go", + "types.go", ], - importpath = "github.com/google/cadvisor/api", + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/accelerators", + importpath = "github.com/google/cadvisor/accelerators", visibility = ["//visibility:public"], deps = [ "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/events:go_default_library", - "//vendor/github.com/google/cadvisor/http/mux:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", + "//vendor/github.com/mindprince/gonvml:go_default_library", ], ) diff --git a/vendor/github.com/google/cadvisor/accelerators/nvidia.go b/vendor/github.com/google/cadvisor/accelerators/nvidia.go index 054d206b..496feba5 100644 --- a/vendor/github.com/google/cadvisor/accelerators/nvidia.go +++ b/vendor/github.com/google/cadvisor/accelerators/nvidia.go @@ -31,7 +31,10 @@ import ( ) type NvidiaManager struct { - sync.RWMutex + sync.Mutex + + // true if there are NVIDIA devices present on the node + devicesPresent bool // true if the NVML library (libnvidia-ml.so.1) was loaded successfully nvmlInitialized bool @@ -51,20 +54,9 @@ func (nm *NvidiaManager) Setup() { return } - nm.initializeNVML() - if nm.nvmlInitialized { - return - } - go func() { - glog.V(2).Info("Starting goroutine to initialize NVML") - // TODO: use globalHousekeepingInterval - for range time.Tick(time.Minute) { - nm.initializeNVML() - if nm.nvmlInitialized { - return - } - } - }() + nm.devicesPresent = true + + initializeNVML(nm) } // detectDevices returns true if a device with given pci id is present on the node. @@ -91,20 +83,18 @@ func detectDevices(vendorId string) bool { } // initializeNVML initializes the NVML library and sets up the nvmlDevices map. -func (nm *NvidiaManager) initializeNVML() { +// This is defined as a variable to help in testing. +var initializeNVML = func(nm *NvidiaManager) { if err := gonvml.Initialize(); err != nil { // This is under a logging level because otherwise we may cause // log spam if the drivers/nvml is not installed on the system. glog.V(4).Infof("Could not initialize NVML: %v", err) return } + nm.nvmlInitialized = true numDevices, err := gonvml.DeviceCount() if err != nil { glog.Warningf("GPU metrics would not be available. Failed to get the number of nvidia devices: %v", err) - nm.Lock() - // Even though we won't have GPU metrics, the library was initialized and should be shutdown when exiting. - nm.nvmlInitialized = true - nm.Unlock() return } glog.V(1).Infof("NVML initialized. Number of nvidia devices: %v", numDevices) @@ -122,10 +112,6 @@ func (nm *NvidiaManager) initializeNVML() { } nm.nvidiaDevices[int(minorNumber)] = device } - nm.Lock() - // Doing this at the end to avoid race in accessing nvidiaDevices in GetCollector. - nm.nvmlInitialized = true - nm.Unlock() } // Destroy shuts down NVML. @@ -139,12 +125,21 @@ func (nm *NvidiaManager) Destroy() { // present in the devices.list file in the given devicesCgroupPath. func (nm *NvidiaManager) GetCollector(devicesCgroupPath string) (AcceleratorCollector, error) { nc := &NvidiaCollector{} - nm.RLock() + + if !nm.devicesPresent { + return nc, nil + } + // Makes sure that we don't call initializeNVML() concurrently and + // that we only call initializeNVML() when it's not initialized. + nm.Lock() + if !nm.nvmlInitialized { + initializeNVML(nm) + } if !nm.nvmlInitialized || len(nm.nvidiaDevices) == 0 { - nm.RUnlock() + nm.Unlock() return nc, nil } - nm.RUnlock() + nm.Unlock() nvidiaMinorNumbers, err := parseDevicesCgroup(devicesCgroupPath) if err != nil { return nc, err diff --git a/vendor/github.com/google/cadvisor/api/handler.go b/vendor/github.com/google/cadvisor/api/handler.go deleted file mode 100644 index bf9e2c80..00000000 --- a/vendor/github.com/google/cadvisor/api/handler.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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 api provides a handler for /api/ -package api - -import ( - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "path" - "regexp" - "sort" - "strconv" - "strings" - "time" - - "github.com/google/cadvisor/events" - httpmux "github.com/google/cadvisor/http/mux" - info "github.com/google/cadvisor/info/v1" - "github.com/google/cadvisor/manager" - - "github.com/golang/glog" -) - -const ( - apiResource = "/api/" -) - -func RegisterHandlers(mux httpmux.Mux, m manager.Manager) error { - apiVersions := getApiVersions() - supportedApiVersions := make(map[string]ApiVersion, len(apiVersions)) - for _, v := range apiVersions { - supportedApiVersions[v.Version()] = v - } - - mux.HandleFunc(apiResource, func(w http.ResponseWriter, r *http.Request) { - err := handleRequest(supportedApiVersions, m, w, r) - if err != nil { - http.Error(w, err.Error(), 500) - } - }) - return nil -} - -// Captures the API version, requestType [optional], and remaining request [optional]. -var apiRegexp = regexp.MustCompile(`/api/([^/]+)/?([^/]+)?(.*)`) - -const ( - apiVersion = iota + 1 - apiRequestType - apiRequestArgs -) - -func handleRequest(supportedApiVersions map[string]ApiVersion, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - start := time.Now() - defer func() { - glog.V(4).Infof("Request took %s", time.Since(start)) - }() - - request := r.URL.Path - - const apiPrefix = "/api" - if !strings.HasPrefix(request, apiPrefix) { - return fmt.Errorf("incomplete API request %q", request) - } - - // If the request doesn't have an API version, list those. - if request == apiPrefix || request == apiResource { - versions := make([]string, 0, len(supportedApiVersions)) - for v := range supportedApiVersions { - versions = append(versions, v) - } - sort.Strings(versions) - http.Error(w, fmt.Sprintf("Supported API versions: %s", strings.Join(versions, ",")), http.StatusBadRequest) - return nil - } - - // Verify that we have all the elements we expect: - // //[/] - requestElements := apiRegexp.FindStringSubmatch(request) - if len(requestElements) == 0 { - return fmt.Errorf("malformed request %q", request) - } - version := requestElements[apiVersion] - requestType := requestElements[apiRequestType] - requestArgs := strings.Split(requestElements[apiRequestArgs], "/") - - // Check supported versions. - versionHandler, ok := supportedApiVersions[version] - if !ok { - return fmt.Errorf("unsupported API version %q", version) - } - - // If no request type, list possible request types. - if requestType == "" { - requestTypes := versionHandler.SupportedRequestTypes() - sort.Strings(requestTypes) - http.Error(w, fmt.Sprintf("Supported request types: %q", strings.Join(requestTypes, ",")), http.StatusBadRequest) - return nil - } - - // Trim the first empty element from the request. - if len(requestArgs) > 0 && requestArgs[0] == "" { - requestArgs = requestArgs[1:] - } - - return versionHandler.HandleRequest(requestType, requestArgs, m, w, r) - -} - -func writeResult(res interface{}, w http.ResponseWriter) error { - out, err := json.Marshal(res) - if err != nil { - return fmt.Errorf("failed to marshall response %+v with error: %s", res, err) - } - - w.Header().Set("Content-Type", "application/json") - w.Write(out) - return nil - -} - -func streamResults(eventChannel *events.EventChannel, w http.ResponseWriter, r *http.Request, m manager.Manager) error { - cn, ok := w.(http.CloseNotifier) - if !ok { - return errors.New("could not access http.CloseNotifier") - } - flusher, ok := w.(http.Flusher) - if !ok { - return errors.New("could not access http.Flusher") - } - - w.Header().Set("Transfer-Encoding", "chunked") - w.WriteHeader(http.StatusOK) - flusher.Flush() - - enc := json.NewEncoder(w) - for { - select { - case <-cn.CloseNotify(): - m.CloseEventChannel(eventChannel.GetWatchId()) - return nil - case ev := <-eventChannel.GetChannel(): - err := enc.Encode(ev) - if err != nil { - glog.Errorf("error encoding message %+v for result stream: %v", ev, err) - } - flusher.Flush() - } - } -} - -func getContainerInfoRequest(body io.ReadCloser) (*info.ContainerInfoRequest, error) { - query := info.DefaultContainerInfoRequest() - decoder := json.NewDecoder(body) - err := decoder.Decode(&query) - if err != nil && err != io.EOF { - return nil, fmt.Errorf("unable to decode the json value: %s", err) - } - - return &query, nil -} - -// The user can set any or none of the following arguments in any order -// with any twice defined arguments being assigned the first value. -// If the value type for the argument is wrong the field will be assumed to be -// unassigned -// bools: stream, subcontainers, oom_events, creation_events, deletion_events -// ints: max_events, start_time (unix timestamp), end_time (unix timestamp) -// example r.URL: http://localhost:8080/api/v1.3/events?oom_events=true&stream=true -func getEventRequest(r *http.Request) (*events.Request, bool, error) { - query := events.NewRequest() - stream := false - - urlMap := r.URL.Query() - - if val, ok := urlMap["stream"]; ok { - newBool, err := strconv.ParseBool(val[0]) - if err == nil { - stream = newBool - } - } - if val, ok := urlMap["subcontainers"]; ok { - newBool, err := strconv.ParseBool(val[0]) - if err == nil { - query.IncludeSubcontainers = newBool - } - } - eventTypes := map[string]info.EventType{ - "oom_events": info.EventOom, - "oom_kill_events": info.EventOomKill, - "creation_events": info.EventContainerCreation, - "deletion_events": info.EventContainerDeletion, - } - allEventTypes := false - if val, ok := urlMap["all_events"]; ok { - newBool, err := strconv.ParseBool(val[0]) - if err == nil { - allEventTypes = newBool - } - } - for opt, eventType := range eventTypes { - if allEventTypes { - query.EventType[eventType] = true - } else if val, ok := urlMap[opt]; ok { - newBool, err := strconv.ParseBool(val[0]) - if err == nil { - query.EventType[eventType] = newBool - } - } - } - if val, ok := urlMap["max_events"]; ok { - newInt, err := strconv.Atoi(val[0]) - if err == nil { - query.MaxEventsReturned = int(newInt) - } - } - if val, ok := urlMap["start_time"]; ok { - newTime, err := time.Parse(time.RFC3339, val[0]) - if err == nil { - query.StartTime = newTime - } - } - if val, ok := urlMap["end_time"]; ok { - newTime, err := time.Parse(time.RFC3339, val[0]) - if err == nil { - query.EndTime = newTime - } - } - - return query, stream, nil -} - -func getContainerName(request []string) string { - return path.Join("/", strings.Join(request, "/")) -} diff --git a/vendor/github.com/google/cadvisor/api/versions.go b/vendor/github.com/google/cadvisor/api/versions.go deleted file mode 100644 index 7fb0c01d..00000000 --- a/vendor/github.com/google/cadvisor/api/versions.go +++ /dev/null @@ -1,559 +0,0 @@ -// Copyright 2015 Google Inc. All Rights Reserved. -// -// 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 api - -import ( - "fmt" - "net/http" - "path" - "strconv" - - info "github.com/google/cadvisor/info/v1" - "github.com/google/cadvisor/info/v2" - "github.com/google/cadvisor/manager" - - "github.com/golang/glog" -) - -const ( - containersApi = "containers" - subcontainersApi = "subcontainers" - machineApi = "machine" - machineStatsApi = "machinestats" - dockerApi = "docker" - summaryApi = "summary" - statsApi = "stats" - specApi = "spec" - eventsApi = "events" - storageApi = "storage" - attributesApi = "attributes" - versionApi = "version" - psApi = "ps" - customMetricsApi = "appmetrics" -) - -// Interface for a cAdvisor API version -type ApiVersion interface { - // Returns the version string. - Version() string - - // List of supported API endpoints. - SupportedRequestTypes() []string - - // Handles a request. The second argument is the parameters after /api// - HandleRequest(requestType string, request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error -} - -// Gets all supported API versions. -func getApiVersions() []ApiVersion { - v1_0 := &version1_0{} - v1_1 := newVersion1_1(v1_0) - v1_2 := newVersion1_2(v1_1) - v1_3 := newVersion1_3(v1_2) - v2_0 := newVersion2_0() - v2_1 := newVersion2_1(v2_0) - - return []ApiVersion{v1_0, v1_1, v1_2, v1_3, v2_0, v2_1} - -} - -// API v1.0 - -type version1_0 struct { -} - -func (self *version1_0) Version() string { - return "v1.0" -} - -func (self *version1_0) SupportedRequestTypes() []string { - return []string{containersApi, machineApi} -} - -func (self *version1_0) HandleRequest(requestType string, request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - switch requestType { - case machineApi: - glog.V(4).Infof("Api - Machine") - - // Get the MachineInfo - machineInfo, err := m.GetMachineInfo() - if err != nil { - return err - } - - err = writeResult(machineInfo, w) - if err != nil { - return err - } - case containersApi: - containerName := getContainerName(request) - glog.V(4).Infof("Api - Container(%s)", containerName) - - // Get the query request. - query, err := getContainerInfoRequest(r.Body) - if err != nil { - return err - } - - // Get the container. - cont, err := m.GetContainerInfo(containerName, query) - if err != nil { - return fmt.Errorf("failed to get container %q with error: %s", containerName, err) - } - - // Only output the container as JSON. - err = writeResult(cont, w) - if err != nil { - return err - } - default: - return fmt.Errorf("unknown request type %q", requestType) - } - return nil -} - -// API v1.1 - -type version1_1 struct { - baseVersion *version1_0 -} - -// v1.1 builds on v1.0. -func newVersion1_1(v *version1_0) *version1_1 { - return &version1_1{ - baseVersion: v, - } -} - -func (self *version1_1) Version() string { - return "v1.1" -} - -func (self *version1_1) SupportedRequestTypes() []string { - return append(self.baseVersion.SupportedRequestTypes(), subcontainersApi) -} - -func (self *version1_1) HandleRequest(requestType string, request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - switch requestType { - case subcontainersApi: - containerName := getContainerName(request) - glog.V(4).Infof("Api - Subcontainers(%s)", containerName) - - // Get the query request. - query, err := getContainerInfoRequest(r.Body) - if err != nil { - return err - } - - // Get the subcontainers. - containers, err := m.SubcontainersInfo(containerName, query) - if err != nil { - return fmt.Errorf("failed to get subcontainers for container %q with error: %s", containerName, err) - } - - // Only output the containers as JSON. - err = writeResult(containers, w) - if err != nil { - return err - } - return nil - default: - return self.baseVersion.HandleRequest(requestType, request, m, w, r) - } -} - -// API v1.2 - -type version1_2 struct { - baseVersion *version1_1 -} - -// v1.2 builds on v1.1. -func newVersion1_2(v *version1_1) *version1_2 { - return &version1_2{ - baseVersion: v, - } -} - -func (self *version1_2) Version() string { - return "v1.2" -} - -func (self *version1_2) SupportedRequestTypes() []string { - return append(self.baseVersion.SupportedRequestTypes(), dockerApi) -} - -func (self *version1_2) HandleRequest(requestType string, request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - switch requestType { - case dockerApi: - glog.V(4).Infof("Api - Docker(%v)", request) - - // Get the query request. - query, err := getContainerInfoRequest(r.Body) - if err != nil { - return err - } - - var containers map[string]info.ContainerInfo - // map requests for "docker/" to "docker" - if len(request) == 1 && len(request[0]) == 0 { - request = request[:0] - } - switch len(request) { - case 0: - // Get all Docker containers. - containers, err = m.AllDockerContainers(query) - if err != nil { - return fmt.Errorf("failed to get all Docker containers with error: %v", err) - } - case 1: - // Get one Docker container. - var cont info.ContainerInfo - cont, err = m.DockerContainer(request[0], query) - if err != nil { - return fmt.Errorf("failed to get Docker container %q with error: %v", request[0], err) - } - containers = map[string]info.ContainerInfo{ - cont.Name: cont, - } - default: - return fmt.Errorf("unknown request for Docker container %v", request) - } - - // Only output the containers as JSON. - err = writeResult(containers, w) - if err != nil { - return err - } - return nil - default: - return self.baseVersion.HandleRequest(requestType, request, m, w, r) - } -} - -// API v1.3 - -type version1_3 struct { - baseVersion *version1_2 -} - -// v1.3 builds on v1.2. -func newVersion1_3(v *version1_2) *version1_3 { - return &version1_3{ - baseVersion: v, - } -} - -func (self *version1_3) Version() string { - return "v1.3" -} - -func (self *version1_3) SupportedRequestTypes() []string { - return append(self.baseVersion.SupportedRequestTypes(), eventsApi) -} - -func (self *version1_3) HandleRequest(requestType string, request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - switch requestType { - case eventsApi: - return handleEventRequest(request, m, w, r) - default: - return self.baseVersion.HandleRequest(requestType, request, m, w, r) - } -} - -func handleEventRequest(request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - query, stream, err := getEventRequest(r) - if err != nil { - return err - } - query.ContainerName = path.Join("/", getContainerName(request)) - glog.V(4).Infof("Api - Events(%v)", query) - if !stream { - pastEvents, err := m.GetPastEvents(query) - if err != nil { - return err - } - return writeResult(pastEvents, w) - } - eventChannel, err := m.WatchForEvents(query) - if err != nil { - return err - } - return streamResults(eventChannel, w, r, m) - -} - -// API v2.0 - -type version2_0 struct { -} - -func newVersion2_0() *version2_0 { - return &version2_0{} -} - -func (self *version2_0) Version() string { - return "v2.0" -} - -func (self *version2_0) SupportedRequestTypes() []string { - return []string{versionApi, attributesApi, eventsApi, machineApi, summaryApi, statsApi, specApi, storageApi, psApi, customMetricsApi} -} - -func (self *version2_0) HandleRequest(requestType string, request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - opt, err := getRequestOptions(r) - if err != nil { - return err - } - switch requestType { - case versionApi: - glog.V(4).Infof("Api - Version") - versionInfo, err := m.GetVersionInfo() - if err != nil { - return err - } - return writeResult(versionInfo.CadvisorVersion, w) - case attributesApi: - glog.V(4).Info("Api - Attributes") - - machineInfo, err := m.GetMachineInfo() - if err != nil { - return err - } - versionInfo, err := m.GetVersionInfo() - if err != nil { - return err - } - info := v2.GetAttributes(machineInfo, versionInfo) - return writeResult(info, w) - case machineApi: - glog.V(4).Info("Api - Machine") - - // TODO(rjnagal): Move machineInfo from v1. - machineInfo, err := m.GetMachineInfo() - if err != nil { - return err - } - return writeResult(machineInfo, w) - case summaryApi: - containerName := getContainerName(request) - glog.V(4).Infof("Api - Summary for container %q, options %+v", containerName, opt) - - stats, err := m.GetDerivedStats(containerName, opt) - if err != nil { - return err - } - return writeResult(stats, w) - case statsApi: - name := getContainerName(request) - glog.V(4).Infof("Api - Stats: Looking for stats for container %q, options %+v", name, opt) - infos, err := m.GetRequestedContainersInfo(name, opt) - if err != nil { - if len(infos) == 0 { - return err - } - glog.Errorf("Error calling GetRequestedContainersInfo: %v", err) - } - contStats := make(map[string][]v2.DeprecatedContainerStats, 0) - for name, cinfo := range infos { - contStats[name] = v2.DeprecatedStatsFromV1(cinfo) - } - return writeResult(contStats, w) - case customMetricsApi: - containerName := getContainerName(request) - glog.V(4).Infof("Api - Custom Metrics: Looking for metrics for container %q, options %+v", containerName, opt) - infos, err := m.GetContainerInfoV2(containerName, opt) - if err != nil { - return err - } - contMetrics := make(map[string]map[string]map[string][]info.MetricValBasic, 0) - for _, cinfo := range infos { - metrics := make(map[string]map[string][]info.MetricValBasic, 0) - for _, contStat := range cinfo.Stats { - if len(contStat.CustomMetrics) == 0 { - continue - } - for name, allLabels := range contStat.CustomMetrics { - metricLabels := make(map[string][]info.MetricValBasic, 0) - for _, metric := range allLabels { - if !metric.Timestamp.IsZero() { - metVal := info.MetricValBasic{ - Timestamp: metric.Timestamp, - IntValue: metric.IntValue, - FloatValue: metric.FloatValue, - } - labels := metrics[name] - if labels != nil { - values := labels[metric.Label] - values = append(values, metVal) - labels[metric.Label] = values - metrics[name] = labels - } else { - metricLabels[metric.Label] = []info.MetricValBasic{metVal} - metrics[name] = metricLabels - } - } - } - } - } - contMetrics[containerName] = metrics - } - return writeResult(contMetrics, w) - case specApi: - containerName := getContainerName(request) - glog.V(4).Infof("Api - Spec for container %q, options %+v", containerName, opt) - specs, err := m.GetContainerSpec(containerName, opt) - if err != nil { - return err - } - return writeResult(specs, w) - case storageApi: - label := r.URL.Query().Get("label") - uuid := r.URL.Query().Get("uuid") - switch { - case uuid != "": - fi, err := m.GetFsInfoByFsUUID(uuid) - if err != nil { - return err - } - return writeResult(fi, w) - case label != "": - // Get a specific label. - fi, err := m.GetFsInfo(label) - if err != nil { - return err - } - return writeResult(fi, w) - default: - // Get all global filesystems info. - fi, err := m.GetFsInfo("") - if err != nil { - return err - } - return writeResult(fi, w) - } - case eventsApi: - return handleEventRequest(request, m, w, r) - case psApi: - // reuse container type from request. - // ignore recursive. - // TODO(rjnagal): consider count to limit ps output. - name := getContainerName(request) - glog.V(4).Infof("Api - Spec for container %q, options %+v", name, opt) - ps, err := m.GetProcessList(name, opt) - if err != nil { - return fmt.Errorf("process listing failed: %v", err) - } - return writeResult(ps, w) - default: - return fmt.Errorf("unknown request type %q", requestType) - } -} - -type version2_1 struct { - baseVersion *version2_0 -} - -func newVersion2_1(v *version2_0) *version2_1 { - return &version2_1{ - baseVersion: v, - } -} - -func (self *version2_1) Version() string { - return "v2.1" -} - -func (self *version2_1) SupportedRequestTypes() []string { - return append([]string{machineStatsApi}, self.baseVersion.SupportedRequestTypes()...) -} - -func (self *version2_1) HandleRequest(requestType string, request []string, m manager.Manager, w http.ResponseWriter, r *http.Request) error { - // Get the query request. - opt, err := getRequestOptions(r) - if err != nil { - return err - } - - switch requestType { - case machineStatsApi: - glog.V(4).Infof("Api - MachineStats(%v)", request) - cont, err := m.GetRequestedContainersInfo("/", opt) - if err != nil { - if len(cont) == 0 { - return err - } - glog.Errorf("Error calling GetRequestedContainersInfo: %v", err) - } - return writeResult(v2.MachineStatsFromV1(cont["/"]), w) - case statsApi: - name := getContainerName(request) - glog.V(4).Infof("Api - Stats: Looking for stats for container %q, options %+v", name, opt) - conts, err := m.GetRequestedContainersInfo(name, opt) - if err != nil { - if len(conts) == 0 { - return err - } - glog.Errorf("Error calling GetRequestedContainersInfo: %v", err) - } - contStats := make(map[string]v2.ContainerInfo, len(conts)) - for name, cont := range conts { - if name == "/" { - // Root cgroup stats should be exposed as machine stats - continue - } - contStats[name] = v2.ContainerInfo{ - Spec: v2.ContainerSpecFromV1(&cont.Spec, cont.Aliases, cont.Namespace), - Stats: v2.ContainerStatsFromV1(name, &cont.Spec, cont.Stats), - } - } - return writeResult(contStats, w) - default: - return self.baseVersion.HandleRequest(requestType, request, m, w, r) - } -} - -func getRequestOptions(r *http.Request) (v2.RequestOptions, error) { - supportedTypes := map[string]bool{ - v2.TypeName: true, - v2.TypeDocker: true, - } - // fill in the defaults. - opt := v2.RequestOptions{ - IdType: v2.TypeName, - Count: 64, - Recursive: false, - } - idType := r.URL.Query().Get("type") - if len(idType) != 0 { - if !supportedTypes[idType] { - return opt, fmt.Errorf("unknown 'type' %q", idType) - } - opt.IdType = idType - } - count := r.URL.Query().Get("count") - if len(count) != 0 { - n, err := strconv.ParseUint(count, 10, 32) - if err != nil { - return opt, fmt.Errorf("failed to parse 'count' option: %v", count) - } - opt.Count = int(n) - } - recursive := r.URL.Query().Get("recursive") - if recursive == "true" { - opt.Recursive = true - } - return opt, nil -} diff --git a/vendor/github.com/google/cadvisor/cache/memory/BUILD b/vendor/github.com/google/cadvisor/cache/memory/BUILD index d7024e97..ba68ce4c 100644 --- a/vendor/github.com/google/cadvisor/cache/memory/BUILD +++ b/vendor/github.com/google/cadvisor/cache/memory/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["memory.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/cache/memory", importpath = "github.com/google/cadvisor/cache/memory", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/cache/memory/memory.go b/vendor/github.com/google/cadvisor/cache/memory/memory.go index ae8eb899..4152692e 100644 --- a/vendor/github.com/google/cadvisor/cache/memory/memory.go +++ b/vendor/github.com/google/cadvisor/cache/memory/memory.go @@ -15,7 +15,7 @@ package memory import ( - "fmt" + "errors" "sync" "time" @@ -26,6 +26,9 @@ import ( "github.com/golang/glog" ) +// ErrDataNotFound is the error resulting if failed to find a container in memory cache. +var ErrDataNotFound = errors.New("unable to find data in memory cache") + // TODO(vmarmol): See about refactoring this class, we have an unecessary redirection of containerCache and InMemoryCache. // containerCache is used to store per-container information type containerCache struct { @@ -70,16 +73,16 @@ type InMemoryCache struct { backend storage.StorageDriver } -func (self *InMemoryCache) AddStats(ref info.ContainerReference, stats *info.ContainerStats) error { +func (self *InMemoryCache) AddStats(cInfo *info.ContainerInfo, stats *info.ContainerStats) error { var cstore *containerCache var ok bool func() { self.lock.Lock() defer self.lock.Unlock() - if cstore, ok = self.containerCacheMap[ref.Name]; !ok { - cstore = newContainerStore(ref, self.maxAge) - self.containerCacheMap[ref.Name] = cstore + if cstore, ok = self.containerCacheMap[cInfo.ContainerReference.Name]; !ok { + cstore = newContainerStore(cInfo.ContainerReference, self.maxAge) + self.containerCacheMap[cInfo.ContainerReference.Name] = cstore } }() @@ -87,7 +90,7 @@ func (self *InMemoryCache) AddStats(ref info.ContainerReference, stats *info.Con // TODO(monnand): To deal with long delay write operations, we // may want to start a pool of goroutines to do write // operations. - if err := self.backend.AddStats(ref, stats); err != nil { + if err := self.backend.AddStats(cInfo, stats); err != nil { glog.Error(err) } } @@ -101,7 +104,7 @@ func (self *InMemoryCache) RecentStats(name string, start, end time.Time, maxSta self.lock.RLock() defer self.lock.RUnlock() if cstore, ok = self.containerCacheMap[name]; !ok { - return fmt.Errorf("unable to find data for container %v", name) + return ErrDataNotFound } return nil }() diff --git a/vendor/github.com/google/cadvisor/collector/BUILD b/vendor/github.com/google/cadvisor/collector/BUILD index 9709e4eb..ab109e6e 100644 --- a/vendor/github.com/google/cadvisor/collector/BUILD +++ b/vendor/github.com/google/cadvisor/collector/BUILD @@ -11,6 +11,7 @@ go_library( "types.go", "util.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/collector", importpath = "github.com/google/cadvisor/collector", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/container/BUILD b/vendor/github.com/google/cadvisor/container/BUILD index 9fc21eec..2627a6c1 100644 --- a/vendor/github.com/google/cadvisor/container/BUILD +++ b/vendor/github.com/google/cadvisor/container/BUILD @@ -6,6 +6,7 @@ go_library( "container.go", "factory.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container", importpath = "github.com/google/cadvisor/container", visibility = ["//visibility:public"], deps = [ @@ -31,6 +32,7 @@ filegroup( "//vendor/github.com/google/cadvisor/container/crio:all-srcs", "//vendor/github.com/google/cadvisor/container/docker:all-srcs", "//vendor/github.com/google/cadvisor/container/libcontainer:all-srcs", + "//vendor/github.com/google/cadvisor/container/mesos:all-srcs", "//vendor/github.com/google/cadvisor/container/raw:all-srcs", "//vendor/github.com/google/cadvisor/container/rkt:all-srcs", "//vendor/github.com/google/cadvisor/container/systemd:all-srcs", diff --git a/vendor/github.com/google/cadvisor/container/common/BUILD b/vendor/github.com/google/cadvisor/container/common/BUILD index 33b01fec..0d060091 100644 --- a/vendor/github.com/google/cadvisor/container/common/BUILD +++ b/vendor/github.com/google/cadvisor/container/common/BUILD @@ -8,6 +8,7 @@ go_library( "helpers.go", "inotify_watcher.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common", importpath = "github.com/google/cadvisor/container/common", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/container/container.go b/vendor/github.com/google/cadvisor/container/container.go index 45504524..37c0a7d2 100644 --- a/vendor/github.com/google/cadvisor/container/container.go +++ b/vendor/github.com/google/cadvisor/container/container.go @@ -36,6 +36,7 @@ const ( ContainerTypeSystemd ContainerTypeCrio ContainerTypeContainerd + ContainerTypeMesos ) // Interface for container operation handlers. diff --git a/vendor/github.com/google/cadvisor/container/containerd/BUILD b/vendor/github.com/google/cadvisor/container/containerd/BUILD new file mode 100644 index 00000000..c89f813e --- /dev/null +++ b/vendor/github.com/google/cadvisor/container/containerd/BUILD @@ -0,0 +1,50 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "client.go", + "factory.go", + "grpc.go", + "handler.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/containerd", + importpath = "github.com/google/cadvisor/container/containerd", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/containerd/containerd/api/services/containers/v1:go_default_library", + "//vendor/github.com/containerd/containerd/api/services/tasks/v1:go_default_library", + "//vendor/github.com/containerd/containerd/api/services/version/v1:go_default_library", + "//vendor/github.com/containerd/containerd/containers:go_default_library", + "//vendor/github.com/containerd/containerd/dialer:go_default_library", + "//vendor/github.com/containerd/containerd/errdefs:go_default_library", + "//vendor/github.com/containerd/containerd/namespaces:go_default_library", + "//vendor/github.com/gogo/protobuf/types:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/google/cadvisor/container:go_default_library", + "//vendor/github.com/google/cadvisor/container/common:go_default_library", + "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library", + "//vendor/github.com/google/cadvisor/fs:go_default_library", + "//vendor/github.com/google/cadvisor/info/v1:go_default_library", + "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + "//vendor/github.com/opencontainers/runtime-spec/specs-go:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", + "//vendor/google.golang.org/grpc:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/google/cadvisor/container/containerd/client.go b/vendor/github.com/google/cadvisor/container/containerd/client.go index 182fd010..4eccf4f6 100644 --- a/vendor/github.com/google/cadvisor/container/containerd/client.go +++ b/vendor/github.com/google/cadvisor/container/containerd/client.go @@ -16,6 +16,9 @@ package containerd import ( "context" + "fmt" + "net" + "sync" "time" containersapi "github.com/containerd/containerd/api/services/containers/v1" @@ -24,7 +27,7 @@ import ( "github.com/containerd/containerd/containers" "github.com/containerd/containerd/dialer" "github.com/containerd/containerd/errdefs" - pempty "github.com/golang/protobuf/ptypes/empty" + ptypes "github.com/gogo/protobuf/types" "google.golang.org/grpc" ) @@ -45,32 +48,51 @@ type containerdClient interface { Version(ctx context.Context) (string, error) } +var once sync.Once +var ctrdClient containerdClient = nil + +const ( + address = "/run/containerd/containerd.sock" + maxBackoffDelay = 3 * time.Second + connectionTimeout = 2 * time.Second +) + // Client creates a containerd client func Client() (containerdClient, error) { - gopts := []grpc.DialOption{ - grpc.WithInsecure(), - grpc.FailOnNonTempDialError(true), - grpc.WithDialer(dialer.Dialer), - grpc.WithBlock(), - grpc.WithTimeout(2 * time.Second), - grpc.WithBackoffMaxDelay(3 * time.Second), - } - unary, stream := newNSInterceptors(k8sNamespace) - gopts = append(gopts, - grpc.WithUnaryInterceptor(unary), - grpc.WithStreamInterceptor(stream), - ) + var retErr error + once.Do(func() { + tryConn, err := net.DialTimeout("unix", address, connectionTimeout) + if err != nil { + retErr = fmt.Errorf("containerd: cannot unix dial containerd api service: %v", err) + return + } + tryConn.Close() - conn, err := grpc.Dial(dialer.DialAddress("/var/run/containerd/containerd.sock"), gopts...) - if err != nil { - return nil, err - } - c := &client{ - containerService: containersapi.NewContainersClient(conn), - taskService: tasksapi.NewTasksClient(conn), - versionService: versionapi.NewVersionClient(conn), - } - return c, err + gopts := []grpc.DialOption{ + grpc.WithInsecure(), + grpc.WithDialer(dialer.Dialer), + grpc.WithBlock(), + grpc.WithBackoffMaxDelay(maxBackoffDelay), + grpc.WithTimeout(connectionTimeout), + } + unary, stream := newNSInterceptors(k8sNamespace) + gopts = append(gopts, + grpc.WithUnaryInterceptor(unary), + grpc.WithStreamInterceptor(stream), + ) + + conn, err := grpc.Dial(dialer.DialAddress(address), gopts...) + if err != nil { + retErr = err + return + } + ctrdClient = &client{ + containerService: containersapi.NewContainersClient(conn), + taskService: tasksapi.NewTasksClient(conn), + versionService: versionapi.NewVersionClient(conn), + } + }) + return ctrdClient, retErr } func (c *client) LoadContainer(ctx context.Context, id string) (*containers.Container, error) { @@ -94,7 +116,7 @@ func (c *client) TaskPid(ctx context.Context, id string) (uint32, error) { } func (c *client) Version(ctx context.Context) (string, error) { - response, err := c.versionService.Version(ctx, &pempty.Empty{}) + response, err := c.versionService.Version(ctx, &ptypes.Empty{}) if err != nil { return "", errdefs.FromGRPC(err) } diff --git a/vendor/github.com/google/cadvisor/container/containerd/factory.go b/vendor/github.com/google/cadvisor/container/containerd/factory.go index dba43ef3..18d6070e 100644 --- a/vendor/github.com/google/cadvisor/container/containerd/factory.go +++ b/vendor/github.com/google/cadvisor/container/containerd/factory.go @@ -47,8 +47,8 @@ type containerdFactory struct { // Information about the mounted cgroup subsystems. cgroupSubsystems libcontainer.CgroupSubsystems // Information about mounted filesystems. - fsInfo fs.FsInfo - ignoreMetrics container.MetricSet + fsInfo fs.FsInfo + includedMetrics container.MetricSet } func (self *containerdFactory) String() string { @@ -70,7 +70,7 @@ func (self *containerdFactory) NewContainerHandler(name string, inHostNamespace &self.cgroupSubsystems, inHostNamespace, metadataEnvs, - self.ignoreMetrics, + self.includedMetrics, ) } @@ -117,7 +117,7 @@ func (self *containerdFactory) DebugInfo() map[string][]string { } // Register root container before running this function! -func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics container.MetricSet) error { +func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics container.MetricSet) error { client, err := Client() if err != nil { return fmt.Errorf("unable to create containerd client: %v", err) @@ -140,7 +140,7 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics c fsInfo: fsInfo, machineInfoFactory: factory, version: containerdVersion, - ignoreMetrics: ignoreMetrics, + includedMetrics: includedMetrics, } container.RegisterContainerHandlerFactory(f, []watcher.ContainerWatchSource{watcher.Raw}) diff --git a/vendor/github.com/google/cadvisor/container/containerd/handler.go b/vendor/github.com/google/cadvisor/container/containerd/handler.go index b369d9b1..82aa8082 100644 --- a/vendor/github.com/google/cadvisor/container/containerd/handler.go +++ b/vendor/github.com/google/cadvisor/container/containerd/handler.go @@ -22,7 +22,7 @@ import ( "strings" "time" - "github.com/opencontainers/runc/libcontainer/cgroups" + "github.com/containerd/containerd/errdefs" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs" "golang.org/x/net/context" @@ -36,31 +36,21 @@ import ( ) type containerdContainerHandler struct { - client containerdClient - name string - id string - aliases []string machineInfoFactory info.MachineInfoFactory // Absolute path to the cgroup hierarchies of this container. // (e.g.: "cpu" -> "/sys/fs/cgroup/cpu/test") cgroupPaths map[string]string - // Manager of this container's cgroups. - cgroupManager cgroups.Manager - fsInfo fs.FsInfo - poolName string - // Time at which this container was created. - creationTime time.Time + fsInfo fs.FsInfo // Metadata associated with the container. - labels map[string]string - envs map[string]string - // The container PID used to switch namespaces as required - pid int + reference info.ContainerReference + envs map[string]string + labels map[string]string // Image name used for this container. image string - // The host root FS to read - rootFs string // Filesystem handler. - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet + + libcontainerHandler *containerlibcontainer.Handler } var _ container.ContainerHandler = &containerdContainerHandler{} @@ -74,7 +64,7 @@ func newContainerdContainerHandler( cgroupSubsystems *containerlibcontainer.CgroupSubsystems, inHostNamespace bool, metadataEnvs []string, - ignoreMetrics container.MetricSet, + includedMetrics container.MetricSet, ) (container.ContainerHandler, error) { // Create the cgroup paths. cgroupPaths := make(map[string]string, len(cgroupSubsystems.MountPoints)) @@ -103,34 +93,54 @@ func newContainerdContainerHandler( return nil, err } - taskPid, err := client.TaskPid(ctx, id) - if err != nil { - return nil, err + // Cgroup is created during task creation. When cadvisor sees the cgroup, + // task may not be fully created yet. Use a retry+backoff to tolerant the + // race condition. + // TODO(random-liu): Use cri-containerd client to talk with cri-containerd + // instead. cri-containerd has some internal synchronization to make sure + // `ContainerStatus` only returns result after `StartContainer` finishes. + var taskPid uint32 + backoff := 100 * time.Millisecond + retry := 5 + for { + taskPid, err = client.TaskPid(ctx, id) + if err == nil { + break + } + retry-- + if !errdefs.IsNotFound(err) || retry == 0 { + return nil, err + } + time.Sleep(backoff) + backoff *= 2 } + rootfs := "/" if !inHostNamespace { rootfs = "/rootfs" } + containerReference := info.ContainerReference{ + Id: id, + Name: name, + Namespace: k8sContainerdNamespace, + Aliases: []string{id, name}, + } + + libcontainerHandler := containerlibcontainer.NewHandler(cgroupManager, rootfs, int(taskPid), includedMetrics) + handler := &containerdContainerHandler{ - id: id, - client: client, - name: name, - machineInfoFactory: machineInfoFactory, - cgroupPaths: cgroupPaths, - cgroupManager: cgroupManager, - rootFs: rootfs, - fsInfo: fsInfo, - envs: make(map[string]string), - labels: make(map[string]string), - ignoreMetrics: ignoreMetrics, - pid: int(taskPid), - creationTime: cntr.CreatedAt, + machineInfoFactory: machineInfoFactory, + cgroupPaths: cgroupPaths, + fsInfo: fsInfo, + envs: make(map[string]string), + labels: cntr.Labels, + includedMetrics: includedMetrics, + reference: containerReference, + libcontainerHandler: libcontainerHandler, } // Add the name and bare ID as aliases of the container. - handler.labels = cntr.Labels handler.image = cntr.Image - handler.aliases = []string{id, name} for _, envVar := range spec.Process.Env { if envVar != "" { splits := strings.SplitN(envVar, "=", 2) @@ -144,20 +154,14 @@ func newContainerdContainerHandler( } func (self *containerdContainerHandler) ContainerReference() (info.ContainerReference, error) { - return info.ContainerReference{ - Id: self.id, - Name: self.name, - Namespace: k8sContainerdNamespace, - Labels: self.labels, - Aliases: self.aliases, - }, nil + return self.reference, nil } func (self *containerdContainerHandler) needNet() bool { // Since containerd does not handle networking ideally we need to return based - // on ignoreMetrics list. Here the assumption is the presence of cri-containerd + // on includedMetrics list. Here the assumption is the presence of cri-containerd // label - if !self.ignoreMetrics.Has(container.NetworkUsageMetrics) { + if self.includedMetrics.Has(container.NetworkUsageMetrics) { //TODO change it to exported cri-containerd constants return self.labels["io.cri-containerd.kind"] == "sandbox" } @@ -182,14 +186,14 @@ func (self *containerdContainerHandler) getFsStats(stats *info.ContainerStats) e return err } - if !self.ignoreMetrics.Has(container.DiskIOMetrics) { + if self.includedMetrics.Has(container.DiskIOMetrics) { common.AssignDeviceNamesToDiskStats((*common.MachineInfoNamer)(mi), &stats.DiskIo) } return nil } func (self *containerdContainerHandler) GetStats() (*info.ContainerStats, error) { - stats, err := containerlibcontainer.GetStats(self.cgroupManager, self.rootFs, self.pid, self.ignoreMetrics) + stats, err := self.libcontainerHandler.GetStats() if err != nil { return stats, err } @@ -213,7 +217,7 @@ func (self *containerdContainerHandler) ListContainers(listType container.ListTy func (self *containerdContainerHandler) GetCgroupPath(resource string) (string, error) { path, ok := self.cgroupPaths[resource] if !ok { - return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, self.name) + return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, self.reference.Name) } return path, nil } @@ -223,7 +227,7 @@ func (self *containerdContainerHandler) GetContainerLabels() map[string]string { } func (self *containerdContainerHandler) ListProcesses(listType container.ListType) ([]int, error) { - return containerlibcontainer.GetProcesses(self.cgroupManager) + return self.libcontainerHandler.GetProcesses() } func (self *containerdContainerHandler) Exists() bool { diff --git a/vendor/github.com/google/cadvisor/container/crio/BUILD b/vendor/github.com/google/cadvisor/container/crio/BUILD index be1b74e7..aa78a582 100644 --- a/vendor/github.com/google/cadvisor/container/crio/BUILD +++ b/vendor/github.com/google/cadvisor/container/crio/BUILD @@ -7,6 +7,7 @@ go_library( "factory.go", "handler.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/crio", importpath = "github.com/google/cadvisor/container/crio", visibility = ["//visibility:public"], deps = [ @@ -17,7 +18,6 @@ go_library( "//vendor/github.com/google/cadvisor/fs:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", ], diff --git a/vendor/github.com/google/cadvisor/container/crio/factory.go b/vendor/github.com/google/cadvisor/container/crio/factory.go index 0c77db69..e106c0ba 100644 --- a/vendor/github.com/google/cadvisor/container/crio/factory.go +++ b/vendor/github.com/google/cadvisor/container/crio/factory.go @@ -55,7 +55,7 @@ type crioFactory struct { // Information about mounted filesystems. fsInfo fs.FsInfo - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet client crioClient } @@ -81,7 +81,7 @@ func (self *crioFactory) NewContainerHandler(name string, inHostNamespace bool) &self.cgroupSubsystems, inHostNamespace, metadataEnvs, - self.ignoreMetrics, + self.includedMetrics, ) return } @@ -136,7 +136,7 @@ var ( ) // Register root container before running this function! -func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics container.MetricSet) error { +func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics container.MetricSet) error { client, err := Client() if err != nil { return err @@ -162,7 +162,7 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics c machineInfoFactory: factory, storageDriver: storageDriver(info.StorageDriver), storageDir: info.StorageRoot, - ignoreMetrics: ignoreMetrics, + includedMetrics: includedMetrics, } container.RegisterContainerHandlerFactory(f, []watcher.ContainerWatchSource{watcher.Raw}) diff --git a/vendor/github.com/google/cadvisor/container/crio/handler.go b/vendor/github.com/google/cadvisor/container/crio/handler.go index 024341da..b9748b8c 100644 --- a/vendor/github.com/google/cadvisor/container/crio/handler.go +++ b/vendor/github.com/google/cadvisor/container/crio/handler.go @@ -21,7 +21,6 @@ import ( "path/filepath" "strconv" "strings" - "time" "github.com/google/cadvisor/container" "github.com/google/cadvisor/container/common" @@ -29,48 +28,32 @@ import ( "github.com/google/cadvisor/fs" info "github.com/google/cadvisor/info/v1" - "github.com/opencontainers/runc/libcontainer/cgroups" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs" ) type crioContainerHandler struct { - name string - id string - aliases []string machineInfoFactory info.MachineInfoFactory // Absolute path to the cgroup hierarchies of this container. // (e.g.: "cpu" -> "/sys/fs/cgroup/cpu/test") cgroupPaths map[string]string - // Manager of this container's cgroups. - cgroupManager cgroups.Manager - // the CRI-O storage driver storageDriver storageDriver fsInfo fs.FsInfo rootfsStorageDir string - // Time at which this container was created. - creationTime time.Time - // Metadata associated with the container. - labels map[string]string envs map[string]string + labels map[string]string // TODO // crio version handling... - // The container PID used to switch namespaces as required - pid int - // Image name used for this container. image string - // The host root FS to read - rootFs string - // The network mode of the container // TODO @@ -80,10 +63,11 @@ type crioContainerHandler struct { // The IP address of the container ipAddress string - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet - // container restart count - restartCount int + reference info.ContainerReference + + libcontainerHandler *containerlibcontainer.Handler } var _ container.ContainerHandler = &crioContainerHandler{} @@ -99,7 +83,7 @@ func newCrioContainerHandler( cgroupSubsystems *containerlibcontainer.CgroupSubsystems, inHostNamespace bool, metadataEnvs []string, - ignoreMetrics container.MetricSet, + includedMetrics container.MetricSet, ) (container.ContainerHandler, error) { // Create the cgroup paths. cgroupPaths := make(map[string]string, len(cgroupSubsystems.MountPoints)) @@ -150,37 +134,44 @@ func newCrioContainerHandler( rootfsStorageDir = filepath.Join(rootfsStorageDir, "diff") } + containerReference := info.ContainerReference{ + Id: id, + Name: name, + Aliases: []string{cInfo.Name, id}, + Namespace: CrioNamespace, + } + + libcontainerHandler := containerlibcontainer.NewHandler(cgroupManager, rootFs, cInfo.Pid, includedMetrics) + // TODO: extract object mother method handler := &crioContainerHandler{ - id: id, - name: name, - machineInfoFactory: machineInfoFactory, - cgroupPaths: cgroupPaths, - cgroupManager: cgroupManager, - storageDriver: storageDriver, - fsInfo: fsInfo, - rootFs: rootFs, - rootfsStorageDir: rootfsStorageDir, - envs: make(map[string]string), - ignoreMetrics: ignoreMetrics, + machineInfoFactory: machineInfoFactory, + cgroupPaths: cgroupPaths, + storageDriver: storageDriver, + fsInfo: fsInfo, + rootfsStorageDir: rootfsStorageDir, + envs: make(map[string]string), + labels: cInfo.Labels, + includedMetrics: includedMetrics, + reference: containerReference, + libcontainerHandler: libcontainerHandler, } - handler.creationTime = time.Unix(0, cInfo.CreatedTime) - handler.pid = cInfo.Pid - handler.aliases = append(handler.aliases, cInfo.Name, id) - handler.labels = cInfo.Labels handler.image = cInfo.Image // TODO: we wantd to know graph driver DeviceId (dont think this is needed now) // ignore err and get zero as default, this happens with sandboxes, not sure why... // kube isn't sending restart count in labels for sandboxes. restartCount, _ := strconv.Atoi(cInfo.Annotations["io.kubernetes.container.restartCount"]) - handler.restartCount = restartCount + // Only adds restartcount label if it's greater than 0 + if restartCount > 0 { + handler.labels["restartcount"] = strconv.Itoa(restartCount) + } handler.ipAddress = cInfo.IP // we optionally collect disk usage metrics - if !ignoreMetrics.Has(container.DiskUsageMetrics) { + if includedMetrics.Has(container.DiskUsageMetrics) { handler.fsHandler = common.NewFsHandler(common.DefaultPeriod, rootfsStorageDir, storageLogDir, fsInfo) } // TODO for env vars we wanted to show from container.Config.Env from whitelist @@ -204,31 +195,21 @@ func (self *crioContainerHandler) Cleanup() { } func (self *crioContainerHandler) ContainerReference() (info.ContainerReference, error) { - return info.ContainerReference{ - Id: self.id, - Name: self.name, - Aliases: self.aliases, - Namespace: CrioNamespace, - Labels: self.labels, - }, nil + return self.reference, nil } func (self *crioContainerHandler) needNet() bool { - if !self.ignoreMetrics.Has(container.NetworkUsageMetrics) { + if self.includedMetrics.Has(container.NetworkUsageMetrics) { return self.labels["io.kubernetes.container.name"] == "POD" } return false } func (self *crioContainerHandler) GetSpec() (info.ContainerSpec, error) { - hasFilesystem := !self.ignoreMetrics.Has(container.DiskUsageMetrics) + hasFilesystem := self.includedMetrics.Has(container.DiskUsageMetrics) spec, err := common.GetSpec(self.cgroupPaths, self.machineInfoFactory, self.needNet(), hasFilesystem) spec.Labels = self.labels - // Only adds restartcount label if it's greater than 0 - if self.restartCount > 0 { - spec.Labels["restartcount"] = strconv.Itoa(self.restartCount) - } spec.Envs = self.envs spec.Image = self.image @@ -241,11 +222,11 @@ func (self *crioContainerHandler) getFsStats(stats *info.ContainerStats) error { return err } - if !self.ignoreMetrics.Has(container.DiskIOMetrics) { + if self.includedMetrics.Has(container.DiskIOMetrics) { common.AssignDeviceNamesToDiskStats((*common.MachineInfoNamer)(mi), &stats.DiskIo) } - if self.ignoreMetrics.Has(container.DiskUsageMetrics) { + if !self.includedMetrics.Has(container.DiskUsageMetrics) { return nil } var device string @@ -286,7 +267,7 @@ func (self *crioContainerHandler) getFsStats(stats *info.ContainerStats) error { } func (self *crioContainerHandler) GetStats() (*info.ContainerStats, error) { - stats, err := containerlibcontainer.GetStats(self.cgroupManager, self.rootFs, self.pid, self.ignoreMetrics) + stats, err := self.libcontainerHandler.GetStats() if err != nil { return stats, err } @@ -315,7 +296,7 @@ func (self *crioContainerHandler) ListContainers(listType container.ListType) ([ func (self *crioContainerHandler) GetCgroupPath(resource string) (string, error) { path, ok := self.cgroupPaths[resource] if !ok { - return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, self.name) + return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, self.reference.Name) } return path, nil } @@ -329,7 +310,7 @@ func (self *crioContainerHandler) GetContainerIPAddress() string { } func (self *crioContainerHandler) ListProcesses(listType container.ListType) ([]int, error) { - return containerlibcontainer.GetProcesses(self.cgroupManager) + return self.libcontainerHandler.GetProcesses() } func (self *crioContainerHandler) Exists() bool { diff --git a/vendor/github.com/google/cadvisor/container/docker/BUILD b/vendor/github.com/google/cadvisor/container/docker/BUILD index 905d8714..4753ea5a 100644 --- a/vendor/github.com/google/cadvisor/container/docker/BUILD +++ b/vendor/github.com/google/cadvisor/container/docker/BUILD @@ -8,6 +8,7 @@ go_library( "factory.go", "handler.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/docker", importpath = "github.com/google/cadvisor/container/docker", visibility = ["//visibility:public"], deps = [ @@ -27,7 +28,6 @@ go_library( "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library", "//vendor/github.com/google/cadvisor/utils/docker:go_default_library", "//vendor/github.com/google/cadvisor/zfs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/docker/docker.go b/vendor/github.com/google/cadvisor/container/docker/docker.go index b0ed227d..f1cda2be 100644 --- a/vendor/github.com/google/cadvisor/container/docker/docker.go +++ b/vendor/github.com/google/cadvisor/container/docker/docker.go @@ -29,19 +29,27 @@ import ( "github.com/google/cadvisor/machine" ) -const defaultTimeout = time.Second * 5 +var dockerTimeout = 10 * time.Second func defaultContext() context.Context { - ctx, _ := context.WithTimeout(context.Background(), defaultTimeout) + ctx, _ := context.WithTimeout(context.Background(), dockerTimeout) return ctx } +func SetTimeout(timeout time.Duration) { + dockerTimeout = timeout +} + func Status() (v1.DockerStatus, error) { + return StatusWithContext(defaultContext()) +} + +func StatusWithContext(ctx context.Context) (v1.DockerStatus, error) { client, err := Client() if err != nil { return v1.DockerStatus{}, fmt.Errorf("unable to communicate with docker daemon: %v", err) } - dockerInfo, err := client.Info(defaultContext()) + dockerInfo, err := client.Info(ctx) if err != nil { return v1.DockerStatus{}, err } diff --git a/vendor/github.com/google/cadvisor/container/docker/factory.go b/vendor/github.com/google/cadvisor/container/docker/factory.go index 9eb1ff52..9f544ee8 100644 --- a/vendor/github.com/google/cadvisor/container/docker/factory.go +++ b/vendor/github.com/google/cadvisor/container/docker/factory.go @@ -110,7 +110,7 @@ type dockerFactory struct { dockerAPIVersion []int - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet thinPoolName string thinPoolWatcher *devicemapper.ThinPoolWatcher @@ -141,7 +141,7 @@ func (self *dockerFactory) NewContainerHandler(name string, inHostNamespace bool inHostNamespace, metadataEnvs, self.dockerVersion, - self.ignoreMetrics, + self.includedMetrics, self.thinPoolName, self.thinPoolWatcher, self.zfsWatcher, @@ -309,7 +309,7 @@ func ensureThinLsKernelVersion(kernelVersion string) error { } // Register root container before running this function! -func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics container.MetricSet) error { +func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics container.MetricSet) error { client, err := Client() if err != nil { return fmt.Errorf("unable to communicate with docker daemon: %v", err) @@ -363,7 +363,7 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics c machineInfoFactory: factory, storageDriver: storageDriver(dockerInfo.Driver), storageDir: RootDir(), - ignoreMetrics: ignoreMetrics, + includedMetrics: includedMetrics, thinPoolName: thinPoolName, thinPoolWatcher: thinPoolWatcher, zfsWatcher: zfsWatcher, diff --git a/vendor/github.com/google/cadvisor/container/docker/handler.go b/vendor/github.com/google/cadvisor/container/docker/handler.go index 541df67c..69f84faf 100644 --- a/vendor/github.com/google/cadvisor/container/docker/handler.go +++ b/vendor/github.com/google/cadvisor/container/docker/handler.go @@ -35,7 +35,6 @@ import ( dockercontainer "github.com/docker/docker/api/types/container" docker "github.com/docker/docker/client" "github.com/golang/glog" - "github.com/opencontainers/runc/libcontainer/cgroups" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs" "golang.org/x/net/context" @@ -44,6 +43,7 @@ import ( const ( // The read write layers exist here. aufsRWLayer = "diff" + overlayRWLayer = "upper" overlay2RWLayer = "diff" // Path to the directory where docker stores log files if the json logging driver is enabled. @@ -51,53 +51,29 @@ const ( ) type dockerContainerHandler struct { - client *docker.Client - name string - id string - aliases []string + + // machineInfoFactory provides info.MachineInfo machineInfoFactory info.MachineInfoFactory // Absolute path to the cgroup hierarchies of this container. // (e.g.: "cpu" -> "/sys/fs/cgroup/cpu/test") cgroupPaths map[string]string - // Manager of this container's cgroups. - cgroupManager cgroups.Manager - // the docker storage driver storageDriver storageDriver fsInfo fs.FsInfo rootfsStorageDir string - // devicemapper state - - // the devicemapper poolname - poolName string - // the devicemapper device id for the container - deviceID string - - // zfs Filesystem - zfsFilesystem string - - // zfsParent is the parent for docker zfs - zfsParent string - // Time at which this container was created. creationTime time.Time // Metadata associated with the container. - labels map[string]string envs map[string]string - - // The container PID used to switch namespaces as required - pid int + labels map[string]string // Image name used for this container. image string - // The host root FS to read - rootFs string - // The network mode of the container networkMode dockercontainer.NetworkMode @@ -107,16 +83,18 @@ type dockerContainerHandler struct { // The IP address of the container ipAddress string - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet - // thin pool watcher - thinPoolWatcher *devicemapper.ThinPoolWatcher + // the devicemapper poolname + poolName string - // zfs watcher - zfsWatcher *zfs.ZfsWatcher + // zfsParent is the parent for docker zfs + zfsParent string - // container restart count - restartCount int + // Reference to the container + reference info.ContainerReference + + libcontainerHandler *containerlibcontainer.Handler } var _ container.ContainerHandler = &dockerContainerHandler{} @@ -150,7 +128,7 @@ func newDockerContainerHandler( inHostNamespace bool, metadataEnvs []string, dockerVersion []int, - ignoreMetrics container.MetricSet, + includedMetrics container.MetricSet, thinPoolName string, thinPoolWatcher *devicemapper.ThinPoolWatcher, zfsWatcher *zfs.ZfsWatcher, @@ -197,7 +175,7 @@ func newDockerContainerHandler( case aufsStorageDriver: rootfsStorageDir = path.Join(storageDir, string(aufsStorageDriver), aufsRWLayer, rwLayerID) case overlayStorageDriver: - rootfsStorageDir = path.Join(storageDir, string(storageDriver), rwLayerID) + rootfsStorageDir = path.Join(storageDir, string(storageDriver), rwLayerID, overlayRWLayer) case overlay2StorageDriver: rootfsStorageDir = path.Join(storageDir, string(storageDriver), rwLayerID, overlay2RWLayer) case zfsStorageDriver: @@ -209,47 +187,46 @@ func newDockerContainerHandler( zfsFilesystem = path.Join(zfsParent, rwLayerID) } + // We assume that if Inspect fails then the container is not known to docker. + ctnr, err := client.ContainerInspect(context.Background(), id) + if err != nil { + return nil, fmt.Errorf("failed to inspect container %q: %v", id, err) + } + // TODO: extract object mother method handler := &dockerContainerHandler{ - id: id, - client: client, - name: name, machineInfoFactory: machineInfoFactory, cgroupPaths: cgroupPaths, - cgroupManager: cgroupManager, - storageDriver: storageDriver, fsInfo: fsInfo, - rootFs: rootFs, + storageDriver: storageDriver, poolName: thinPoolName, - zfsFilesystem: zfsFilesystem, rootfsStorageDir: rootfsStorageDir, envs: make(map[string]string), - ignoreMetrics: ignoreMetrics, - thinPoolWatcher: thinPoolWatcher, - zfsWatcher: zfsWatcher, + labels: ctnr.Config.Labels, + includedMetrics: includedMetrics, zfsParent: zfsParent, } - - // We assume that if Inspect fails then the container is not known to docker. - ctnr, err := client.ContainerInspect(context.Background(), id) - if err != nil { - return nil, fmt.Errorf("failed to inspect container %q: %v", id, err) - } // Timestamp returned by Docker is in time.RFC3339Nano format. handler.creationTime, err = time.Parse(time.RFC3339Nano, ctnr.Created) if err != nil { // This should not happen, report the error just in case return nil, fmt.Errorf("failed to parse the create timestamp %q for container %q: %v", ctnr.Created, id, err) } - handler.pid = ctnr.State.Pid + handler.libcontainerHandler = containerlibcontainer.NewHandler(cgroupManager, rootFs, ctnr.State.Pid, includedMetrics) // Add the name and bare ID as aliases of the container. - handler.aliases = append(handler.aliases, strings.TrimPrefix(ctnr.Name, "/"), id) - handler.labels = ctnr.Config.Labels + handler.reference = info.ContainerReference{ + Id: id, + Name: name, + Aliases: []string{strings.TrimPrefix(ctnr.Name, "/"), id}, + Namespace: DockerNamespace, + } handler.image = ctnr.Config.Image handler.networkMode = ctnr.HostConfig.NetworkMode - handler.deviceID = ctnr.GraphDriver.Data["DeviceId"] - handler.restartCount = ctnr.RestartCount + // Only adds restartcount label if it's greater than 0 + if ctnr.RestartCount > 0 { + handler.labels["restartcount"] = strconv.Itoa(ctnr.RestartCount) + } // Obtain the IP address for the contianer. // If the NetworkMode starts with 'container:' then we need to use the IP address of the container specified. @@ -267,12 +244,12 @@ func newDockerContainerHandler( handler.ipAddress = ipAddress - if !ignoreMetrics.Has(container.DiskUsageMetrics) { + if includedMetrics.Has(container.DiskUsageMetrics) { handler.fsHandler = &dockerFsHandler{ fsHandler: common.NewFsHandler(common.DefaultPeriod, rootfsStorageDir, otherStorageDir, fsInfo), thinPoolWatcher: thinPoolWatcher, zfsWatcher: zfsWatcher, - deviceID: handler.deviceID, + deviceID: ctnr.GraphDriver.Data["DeviceId"], zfsFilesystem: zfsFilesystem, } } @@ -364,33 +341,24 @@ func (self *dockerContainerHandler) Cleanup() { } func (self *dockerContainerHandler) ContainerReference() (info.ContainerReference, error) { - return info.ContainerReference{ - Id: self.id, - Name: self.name, - Aliases: self.aliases, - Namespace: DockerNamespace, - Labels: self.labels, - }, nil + return self.reference, nil } func (self *dockerContainerHandler) needNet() bool { - if !self.ignoreMetrics.Has(container.NetworkUsageMetrics) { + if self.includedMetrics.Has(container.NetworkUsageMetrics) { return !self.networkMode.IsContainer() } return false } func (self *dockerContainerHandler) GetSpec() (info.ContainerSpec, error) { - hasFilesystem := !self.ignoreMetrics.Has(container.DiskUsageMetrics) + hasFilesystem := self.includedMetrics.Has(container.DiskUsageMetrics) spec, err := common.GetSpec(self.cgroupPaths, self.machineInfoFactory, self.needNet(), hasFilesystem) spec.Labels = self.labels - // Only adds restartcount label if it's greater than 0 - if self.restartCount > 0 { - spec.Labels["restartcount"] = strconv.Itoa(self.restartCount) - } spec.Envs = self.envs spec.Image = self.image + spec.CreationTime = self.creationTime return spec, err } @@ -401,11 +369,11 @@ func (self *dockerContainerHandler) getFsStats(stats *info.ContainerStats) error return err } - if !self.ignoreMetrics.Has(container.DiskIOMetrics) { + if self.includedMetrics.Has(container.DiskIOMetrics) { common.AssignDeviceNamesToDiskStats((*common.MachineInfoNamer)(mi), &stats.DiskIo) } - if self.ignoreMetrics.Has(container.DiskUsageMetrics) { + if !self.includedMetrics.Has(container.DiskUsageMetrics) { return nil } var device string @@ -453,7 +421,7 @@ func (self *dockerContainerHandler) getFsStats(stats *info.ContainerStats) error // TODO(vmarmol): Get from libcontainer API instead of cgroup manager when we don't have to support older Dockers. func (self *dockerContainerHandler) GetStats() (*info.ContainerStats, error) { - stats, err := containerlibcontainer.GetStats(self.cgroupManager, self.rootFs, self.pid, self.ignoreMetrics) + stats, err := self.libcontainerHandler.GetStats() if err != nil { return stats, err } @@ -482,7 +450,7 @@ func (self *dockerContainerHandler) ListContainers(listType container.ListType) func (self *dockerContainerHandler) GetCgroupPath(resource string) (string, error) { path, ok := self.cgroupPaths[resource] if !ok { - return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, self.name) + return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, self.reference.Name) } return path, nil } @@ -496,7 +464,7 @@ func (self *dockerContainerHandler) GetContainerIPAddress() string { } func (self *dockerContainerHandler) ListProcesses(listType container.ListType) ([]int, error) { - return containerlibcontainer.GetProcesses(self.cgroupManager) + return self.libcontainerHandler.GetProcesses() } func (self *dockerContainerHandler) Exists() bool { diff --git a/vendor/github.com/google/cadvisor/container/factory.go b/vendor/github.com/google/cadvisor/container/factory.go index cf5b463e..47847057 100644 --- a/vendor/github.com/google/cadvisor/container/factory.go +++ b/vendor/github.com/google/cadvisor/container/factory.go @@ -51,6 +51,7 @@ const ( NetworkUsageMetrics MetricKind = "network" NetworkTcpUsageMetrics MetricKind = "tcp" NetworkUdpUsageMetrics MetricKind = "udp" + AcceleratorUsageMetrics MetricKind = "accelerator" AppMetrics MetricKind = "app" ) diff --git a/vendor/github.com/google/cadvisor/container/libcontainer/BUILD b/vendor/github.com/google/cadvisor/container/libcontainer/BUILD index 65cfd748..a4a7ffab 100644 --- a/vendor/github.com/google/cadvisor/container/libcontainer/BUILD +++ b/vendor/github.com/google/cadvisor/container/libcontainer/BUILD @@ -2,8 +2,12 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["helpers.go"], + srcs = [ + "handler.go", + "helpers.go", + ], cgo = True, + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/libcontainer", importpath = "github.com/google/cadvisor/container/libcontainer", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/container/libcontainer/handler.go b/vendor/github.com/google/cadvisor/container/libcontainer/handler.go new file mode 100644 index 00000000..18c465f2 --- /dev/null +++ b/vendor/github.com/google/cadvisor/container/libcontainer/handler.go @@ -0,0 +1,569 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// 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 libcontainer + +import ( + "bufio" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "strconv" + "strings" + "time" + + "github.com/google/cadvisor/container" + info "github.com/google/cadvisor/info/v1" + + "bytes" + "github.com/golang/glog" + "github.com/opencontainers/runc/libcontainer" + "github.com/opencontainers/runc/libcontainer/cgroups" +) + +/* +#include +*/ +import "C" + +type Handler struct { + cgroupManager cgroups.Manager + rootFs string + pid int + includedMetrics container.MetricSet + pidMetricsCache map[int]*info.CpuSchedstat +} + +func NewHandler(cgroupManager cgroups.Manager, rootFs string, pid int, includedMetrics container.MetricSet) *Handler { + return &Handler{ + cgroupManager: cgroupManager, + rootFs: rootFs, + pid: pid, + includedMetrics: includedMetrics, + pidMetricsCache: make(map[int]*info.CpuSchedstat), + } +} + +// Get cgroup and networking stats of the specified container +func (h *Handler) GetStats() (*info.ContainerStats, error) { + cgroupStats, err := h.cgroupManager.GetStats() + if err != nil { + return nil, err + } + libcontainerStats := &libcontainer.Stats{ + CgroupStats: cgroupStats, + } + withPerCPU := h.includedMetrics.Has(container.PerCpuUsageMetrics) + stats := newContainerStats(libcontainerStats, withPerCPU) + + if h.includedMetrics.Has(container.ProcessSchedulerMetrics) { + pids, err := h.cgroupManager.GetAllPids() + if err != nil { + glog.V(4).Infof("Could not get PIDs for container %d: %v", h.pid, err) + } else { + stats.Cpu.Schedstat, err = schedulerStatsFromProcs(h.rootFs, pids, h.pidMetricsCache) + if err != nil { + glog.V(4).Infof("Unable to get Process Scheduler Stats: %v", err) + } + } + } + + // If we know the pid then get network stats from /proc//net/dev + if h.pid == 0 { + return stats, nil + } + if h.includedMetrics.Has(container.NetworkUsageMetrics) { + netStats, err := networkStatsFromProc(h.rootFs, h.pid) + if err != nil { + glog.V(4).Infof("Unable to get network stats from pid %d: %v", h.pid, err) + } else { + stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...) + } + } + if h.includedMetrics.Has(container.NetworkTcpUsageMetrics) { + t, err := tcpStatsFromProc(h.rootFs, h.pid, "net/tcp") + if err != nil { + glog.V(4).Infof("Unable to get tcp stats from pid %d: %v", h.pid, err) + } else { + stats.Network.Tcp = t + } + + t6, err := tcpStatsFromProc(h.rootFs, h.pid, "net/tcp6") + if err != nil { + glog.V(4).Infof("Unable to get tcp6 stats from pid %d: %v", h.pid, err) + } else { + stats.Network.Tcp6 = t6 + } + } + if h.includedMetrics.Has(container.NetworkUdpUsageMetrics) { + u, err := udpStatsFromProc(h.rootFs, h.pid, "net/udp") + if err != nil { + glog.V(4).Infof("Unable to get udp stats from pid %d: %v", h.pid, err) + } else { + stats.Network.Udp = u + } + + u6, err := udpStatsFromProc(h.rootFs, h.pid, "net/udp6") + if err != nil { + glog.V(4).Infof("Unable to get udp6 stats from pid %d: %v", h.pid, err) + } else { + stats.Network.Udp6 = u6 + } + } + + // For backwards compatibility. + if len(stats.Network.Interfaces) > 0 { + stats.Network.InterfaceStats = stats.Network.Interfaces[0] + } + + return stats, nil +} + +func schedulerStatsFromProcs(rootFs string, pids []int, pidMetricsCache map[int]*info.CpuSchedstat) (info.CpuSchedstat, error) { + for _, pid := range pids { + f, err := os.Open(path.Join(rootFs, "proc", strconv.Itoa(pid), "schedstat")) + if err != nil { + return info.CpuSchedstat{}, fmt.Errorf("couldn't open scheduler statistics for process %d: %v", pid, err) + } + defer f.Close() + contents, err := ioutil.ReadAll(f) + if err != nil { + return info.CpuSchedstat{}, fmt.Errorf("couldn't read scheduler statistics for process %d: %v", pid, err) + } + rawMetrics := bytes.Split(bytes.TrimRight(contents, "\n"), []byte(" ")) + if len(rawMetrics) != 3 { + return info.CpuSchedstat{}, fmt.Errorf("unexpected number of metrics in schedstat file for process %d", pid) + } + cacheEntry, ok := pidMetricsCache[pid] + if !ok { + cacheEntry = &info.CpuSchedstat{} + pidMetricsCache[pid] = cacheEntry + } + for i, rawMetric := range rawMetrics { + metric, err := strconv.ParseUint(string(rawMetric), 10, 64) + if err != nil { + return info.CpuSchedstat{}, fmt.Errorf("parsing error while reading scheduler statistics for process: %d: %v", pid, err) + } + switch i { + case 0: + cacheEntry.RunTime = metric + case 1: + cacheEntry.RunqueueTime = metric + case 2: + cacheEntry.RunPeriods = metric + } + } + } + schedstats := info.CpuSchedstat{} + for _, v := range pidMetricsCache { + schedstats.RunPeriods += v.RunPeriods + schedstats.RunqueueTime += v.RunqueueTime + schedstats.RunTime += v.RunTime + } + return schedstats, nil +} + +func networkStatsFromProc(rootFs string, pid int) ([]info.InterfaceStats, error) { + netStatsFile := path.Join(rootFs, "proc", strconv.Itoa(pid), "/net/dev") + + ifaceStats, err := scanInterfaceStats(netStatsFile) + if err != nil { + return []info.InterfaceStats{}, fmt.Errorf("couldn't read network stats: %v", err) + } + + return ifaceStats, nil +} + +var ( + ignoredDevicePrefixes = []string{"lo", "veth", "docker"} +) + +func isIgnoredDevice(ifName string) bool { + for _, prefix := range ignoredDevicePrefixes { + if strings.HasPrefix(strings.ToLower(ifName), prefix) { + return true + } + } + return false +} + +func scanInterfaceStats(netStatsFile string) ([]info.InterfaceStats, error) { + file, err := os.Open(netStatsFile) + if err != nil { + return nil, fmt.Errorf("failure opening %s: %v", netStatsFile, err) + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + // Discard header lines + for i := 0; i < 2; i++ { + if b := scanner.Scan(); !b { + return nil, scanner.Err() + } + } + + stats := []info.InterfaceStats{} + for scanner.Scan() { + line := scanner.Text() + line = strings.Replace(line, ":", "", -1) + + fields := strings.Fields(line) + // If the format of the line is invalid then don't trust any of the stats + // in this file. + if len(fields) != 17 { + return nil, fmt.Errorf("invalid interface stats line: %v", line) + } + + devName := fields[0] + if isIgnoredDevice(devName) { + continue + } + + i := info.InterfaceStats{ + Name: devName, + } + + statFields := append(fields[1:5], fields[9:13]...) + statPointers := []*uint64{ + &i.RxBytes, &i.RxPackets, &i.RxErrors, &i.RxDropped, + &i.TxBytes, &i.TxPackets, &i.TxErrors, &i.TxDropped, + } + + err := setInterfaceStatValues(statFields, statPointers) + if err != nil { + return nil, fmt.Errorf("cannot parse interface stats (%v): %v", err, line) + } + + stats = append(stats, i) + } + + return stats, nil +} + +func setInterfaceStatValues(fields []string, pointers []*uint64) error { + for i, v := range fields { + val, err := strconv.ParseUint(v, 10, 64) + if err != nil { + return err + } + *pointers[i] = val + } + return nil +} + +func tcpStatsFromProc(rootFs string, pid int, file string) (info.TcpStat, error) { + tcpStatsFile := path.Join(rootFs, "proc", strconv.Itoa(pid), file) + + tcpStats, err := scanTcpStats(tcpStatsFile) + if err != nil { + return tcpStats, fmt.Errorf("couldn't read tcp stats: %v", err) + } + + return tcpStats, nil +} + +func scanTcpStats(tcpStatsFile string) (info.TcpStat, error) { + + var stats info.TcpStat + + data, err := ioutil.ReadFile(tcpStatsFile) + if err != nil { + return stats, fmt.Errorf("failure opening %s: %v", tcpStatsFile, err) + } + + tcpStateMap := map[string]uint64{ + "01": 0, //ESTABLISHED + "02": 0, //SYN_SENT + "03": 0, //SYN_RECV + "04": 0, //FIN_WAIT1 + "05": 0, //FIN_WAIT2 + "06": 0, //TIME_WAIT + "07": 0, //CLOSE + "08": 0, //CLOSE_WAIT + "09": 0, //LAST_ACK + "0A": 0, //LISTEN + "0B": 0, //CLOSING + } + + reader := strings.NewReader(string(data)) + scanner := bufio.NewScanner(reader) + + scanner.Split(bufio.ScanLines) + + // Discard header line + if b := scanner.Scan(); !b { + return stats, scanner.Err() + } + + for scanner.Scan() { + line := scanner.Text() + + state := strings.Fields(line) + // TCP state is the 4th field. + // Format: sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode + tcpState := state[3] + _, ok := tcpStateMap[tcpState] + if !ok { + return stats, fmt.Errorf("invalid TCP stats line: %v", line) + } + tcpStateMap[tcpState]++ + } + + stats = info.TcpStat{ + Established: tcpStateMap["01"], + SynSent: tcpStateMap["02"], + SynRecv: tcpStateMap["03"], + FinWait1: tcpStateMap["04"], + FinWait2: tcpStateMap["05"], + TimeWait: tcpStateMap["06"], + Close: tcpStateMap["07"], + CloseWait: tcpStateMap["08"], + LastAck: tcpStateMap["09"], + Listen: tcpStateMap["0A"], + Closing: tcpStateMap["0B"], + } + + return stats, nil +} + +func udpStatsFromProc(rootFs string, pid int, file string) (info.UdpStat, error) { + var err error + var udpStats info.UdpStat + + udpStatsFile := path.Join(rootFs, "proc", strconv.Itoa(pid), file) + + r, err := os.Open(udpStatsFile) + if err != nil { + return udpStats, fmt.Errorf("failure opening %s: %v", udpStatsFile, err) + } + + udpStats, err = scanUdpStats(r) + if err != nil { + return udpStats, fmt.Errorf("couldn't read udp stats: %v", err) + } + + return udpStats, nil +} + +func scanUdpStats(r io.Reader) (info.UdpStat, error) { + var stats info.UdpStat + + scanner := bufio.NewScanner(r) + scanner.Split(bufio.ScanLines) + + // Discard header line + if b := scanner.Scan(); !b { + return stats, scanner.Err() + } + + listening := uint64(0) + dropped := uint64(0) + rxQueued := uint64(0) + txQueued := uint64(0) + + for scanner.Scan() { + line := scanner.Text() + // Format: sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops + + listening++ + + fs := strings.Fields(line) + if len(fs) != 13 { + continue + } + + rx, tx := uint64(0), uint64(0) + fmt.Sscanf(fs[4], "%X:%X", &rx, &tx) + rxQueued += rx + txQueued += tx + + d, err := strconv.Atoi(string(fs[12])) + if err != nil { + continue + } + dropped += uint64(d) + } + + stats = info.UdpStat{ + Listen: listening, + Dropped: dropped, + RxQueued: rxQueued, + TxQueued: txQueued, + } + + return stats, nil +} + +func (h *Handler) GetProcesses() ([]int, error) { + pids, err := h.cgroupManager.GetPids() + if err != nil { + return nil, err + } + return pids, nil +} + +func minUint32(x, y uint32) uint32 { + if x < y { + return x + } + return y +} + +// var to allow unit tests to stub it out +var numCpusFunc = getNumberOnlineCPUs + +// Convert libcontainer stats to info.ContainerStats. +func setCpuStats(s *cgroups.Stats, ret *info.ContainerStats, withPerCPU bool) { + ret.Cpu.Usage.User = s.CpuStats.CpuUsage.UsageInUsermode + ret.Cpu.Usage.System = s.CpuStats.CpuUsage.UsageInKernelmode + ret.Cpu.Usage.Total = s.CpuStats.CpuUsage.TotalUsage + ret.Cpu.CFS.Periods = s.CpuStats.ThrottlingData.Periods + ret.Cpu.CFS.ThrottledPeriods = s.CpuStats.ThrottlingData.ThrottledPeriods + ret.Cpu.CFS.ThrottledTime = s.CpuStats.ThrottlingData.ThrottledTime + + if !withPerCPU { + return + } + if len(s.CpuStats.CpuUsage.PercpuUsage) == 0 { + // libcontainer's 'GetStats' can leave 'PercpuUsage' nil if it skipped the + // cpuacct subsystem. + return + } + + numPossible := uint32(len(s.CpuStats.CpuUsage.PercpuUsage)) + // Note that as of https://patchwork.kernel.org/patch/8607101/ (kernel v4.7), + // the percpu usage information includes extra zero values for all additional + // possible CPUs. This is to allow statistic collection after CPU-hotplug. + // We intentionally ignore these extra zeroes. + numActual, err := numCpusFunc() + if err != nil { + glog.Errorf("unable to determine number of actual cpus; defaulting to maximum possible number: errno %v", err) + numActual = numPossible + } + if numActual > numPossible { + // The real number of cores should never be greater than the number of + // datapoints reported in cpu usage. + glog.Errorf("PercpuUsage had %v cpus, but the actual number is %v; ignoring extra CPUs", numPossible, numActual) + } + numActual = minUint32(numPossible, numActual) + ret.Cpu.Usage.PerCpu = make([]uint64, numActual) + + for i := uint32(0); i < numActual; i++ { + ret.Cpu.Usage.PerCpu[i] = s.CpuStats.CpuUsage.PercpuUsage[i] + } + +} + +// Copied from +// https://github.com/moby/moby/blob/8b1adf55c2af329a4334f21d9444d6a169000c81/daemon/stats/collector_unix.go#L73 +// Apache 2.0, Copyright Docker, Inc. +func getNumberOnlineCPUs() (uint32, error) { + i, err := C.sysconf(C._SC_NPROCESSORS_ONLN) + // According to POSIX - errno is undefined after successful + // sysconf, and can be non-zero in several cases, so look for + // error in returned value not in errno. + // (https://sourceware.org/bugzilla/show_bug.cgi?id=21536) + if i == -1 { + return 0, err + } + return uint32(i), nil +} + +func setDiskIoStats(s *cgroups.Stats, ret *info.ContainerStats) { + ret.DiskIo.IoServiceBytes = DiskStatsCopy(s.BlkioStats.IoServiceBytesRecursive) + ret.DiskIo.IoServiced = DiskStatsCopy(s.BlkioStats.IoServicedRecursive) + ret.DiskIo.IoQueued = DiskStatsCopy(s.BlkioStats.IoQueuedRecursive) + ret.DiskIo.Sectors = DiskStatsCopy(s.BlkioStats.SectorsRecursive) + ret.DiskIo.IoServiceTime = DiskStatsCopy(s.BlkioStats.IoServiceTimeRecursive) + ret.DiskIo.IoWaitTime = DiskStatsCopy(s.BlkioStats.IoWaitTimeRecursive) + ret.DiskIo.IoMerged = DiskStatsCopy(s.BlkioStats.IoMergedRecursive) + ret.DiskIo.IoTime = DiskStatsCopy(s.BlkioStats.IoTimeRecursive) +} + +func setMemoryStats(s *cgroups.Stats, ret *info.ContainerStats) { + ret.Memory.Usage = s.MemoryStats.Usage.Usage + ret.Memory.MaxUsage = s.MemoryStats.Usage.MaxUsage + ret.Memory.Failcnt = s.MemoryStats.Usage.Failcnt + + if s.MemoryStats.UseHierarchy { + ret.Memory.Cache = s.MemoryStats.Stats["total_cache"] + ret.Memory.RSS = s.MemoryStats.Stats["total_rss"] + ret.Memory.Swap = s.MemoryStats.Stats["total_swap"] + ret.Memory.MappedFile = s.MemoryStats.Stats["total_mapped_file"] + } else { + ret.Memory.Cache = s.MemoryStats.Stats["cache"] + ret.Memory.RSS = s.MemoryStats.Stats["rss"] + ret.Memory.Swap = s.MemoryStats.Stats["swap"] + ret.Memory.MappedFile = s.MemoryStats.Stats["mapped_file"] + } + if v, ok := s.MemoryStats.Stats["pgfault"]; ok { + ret.Memory.ContainerData.Pgfault = v + ret.Memory.HierarchicalData.Pgfault = v + } + if v, ok := s.MemoryStats.Stats["pgmajfault"]; ok { + ret.Memory.ContainerData.Pgmajfault = v + ret.Memory.HierarchicalData.Pgmajfault = v + } + + workingSet := ret.Memory.Usage + if v, ok := s.MemoryStats.Stats["total_inactive_file"]; ok { + if workingSet < v { + workingSet = 0 + } else { + workingSet -= v + } + } + ret.Memory.WorkingSet = workingSet +} + +func setNetworkStats(libcontainerStats *libcontainer.Stats, ret *info.ContainerStats) { + ret.Network.Interfaces = make([]info.InterfaceStats, len(libcontainerStats.Interfaces)) + for i := range libcontainerStats.Interfaces { + ret.Network.Interfaces[i] = info.InterfaceStats{ + Name: libcontainerStats.Interfaces[i].Name, + RxBytes: libcontainerStats.Interfaces[i].RxBytes, + RxPackets: libcontainerStats.Interfaces[i].RxPackets, + RxErrors: libcontainerStats.Interfaces[i].RxErrors, + RxDropped: libcontainerStats.Interfaces[i].RxDropped, + TxBytes: libcontainerStats.Interfaces[i].TxBytes, + TxPackets: libcontainerStats.Interfaces[i].TxPackets, + TxErrors: libcontainerStats.Interfaces[i].TxErrors, + TxDropped: libcontainerStats.Interfaces[i].TxDropped, + } + } + + // Add to base struct for backwards compatibility. + if len(ret.Network.Interfaces) > 0 { + ret.Network.InterfaceStats = ret.Network.Interfaces[0] + } +} + +func newContainerStats(libcontainerStats *libcontainer.Stats, withPerCPU bool) *info.ContainerStats { + ret := &info.ContainerStats{ + Timestamp: time.Now(), + } + + if s := libcontainerStats.CgroupStats; s != nil { + setCpuStats(s, ret, withPerCPU) + setDiskIoStats(s, ret) + setMemoryStats(s, ret) + } + if len(libcontainerStats.Interfaces) > 0 { + setNetworkStats(libcontainerStats, ret) + } + return ret +} diff --git a/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go b/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go index c2194ac3..d033f7bf 100644 --- a/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go +++ b/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go @@ -15,29 +15,14 @@ package libcontainer import ( - "bufio" "fmt" - "io" - "io/ioutil" - "os" - "path" - "strconv" - "strings" - "time" - "github.com/google/cadvisor/container" info "github.com/google/cadvisor/info/v1" "github.com/golang/glog" - "github.com/opencontainers/runc/libcontainer" "github.com/opencontainers/runc/libcontainer/cgroups" ) -/* -#include -*/ -import "C" - type CgroupSubsystems struct { // Cgroup subsystem mounts. // e.g.: "/sys/fs/cgroup/cpu" -> ["cpu", "cpuacct"] @@ -104,308 +89,6 @@ var supportedSubsystems map[string]struct{} = map[string]struct{}{ "devices": {}, } -// Get cgroup and networking stats of the specified container -func GetStats(cgroupManager cgroups.Manager, rootFs string, pid int, ignoreMetrics container.MetricSet) (*info.ContainerStats, error) { - cgroupStats, err := cgroupManager.GetStats() - if err != nil { - return nil, err - } - libcontainerStats := &libcontainer.Stats{ - CgroupStats: cgroupStats, - } - stats := newContainerStats(libcontainerStats) - - // If we know the pid then get network stats from /proc//net/dev - if pid == 0 { - return stats, nil - } - if !ignoreMetrics.Has(container.NetworkUsageMetrics) { - netStats, err := networkStatsFromProc(rootFs, pid) - if err != nil { - glog.V(4).Infof("Unable to get network stats from pid %d: %v", pid, err) - } else { - stats.Network.Interfaces = append(stats.Network.Interfaces, netStats...) - } - } - if !ignoreMetrics.Has(container.NetworkTcpUsageMetrics) { - t, err := tcpStatsFromProc(rootFs, pid, "net/tcp") - if err != nil { - glog.V(4).Infof("Unable to get tcp stats from pid %d: %v", pid, err) - } else { - stats.Network.Tcp = t - } - - t6, err := tcpStatsFromProc(rootFs, pid, "net/tcp6") - if err != nil { - glog.V(4).Infof("Unable to get tcp6 stats from pid %d: %v", pid, err) - } else { - stats.Network.Tcp6 = t6 - } - } - if !ignoreMetrics.Has(container.NetworkUdpUsageMetrics) { - u, err := udpStatsFromProc(rootFs, pid, "net/udp") - if err != nil { - glog.V(4).Infof("Unable to get udp stats from pid %d: %v", pid, err) - } else { - stats.Network.Udp = u - } - - u6, err := udpStatsFromProc(rootFs, pid, "net/udp6") - if err != nil { - glog.V(4).Infof("Unable to get udp6 stats from pid %d: %v", pid, err) - } else { - stats.Network.Udp6 = u6 - } - } - - // For backwards compatibility. - if len(stats.Network.Interfaces) > 0 { - stats.Network.InterfaceStats = stats.Network.Interfaces[0] - } - - return stats, nil -} - -func networkStatsFromProc(rootFs string, pid int) ([]info.InterfaceStats, error) { - netStatsFile := path.Join(rootFs, "proc", strconv.Itoa(pid), "/net/dev") - - ifaceStats, err := scanInterfaceStats(netStatsFile) - if err != nil { - return []info.InterfaceStats{}, fmt.Errorf("couldn't read network stats: %v", err) - } - - return ifaceStats, nil -} - -var ( - ignoredDevicePrefixes = []string{"lo", "veth", "docker"} -) - -func isIgnoredDevice(ifName string) bool { - for _, prefix := range ignoredDevicePrefixes { - if strings.HasPrefix(strings.ToLower(ifName), prefix) { - return true - } - } - return false -} - -func scanInterfaceStats(netStatsFile string) ([]info.InterfaceStats, error) { - file, err := os.Open(netStatsFile) - if err != nil { - return nil, fmt.Errorf("failure opening %s: %v", netStatsFile, err) - } - defer file.Close() - - scanner := bufio.NewScanner(file) - - // Discard header lines - for i := 0; i < 2; i++ { - if b := scanner.Scan(); !b { - return nil, scanner.Err() - } - } - - stats := []info.InterfaceStats{} - for scanner.Scan() { - line := scanner.Text() - line = strings.Replace(line, ":", "", -1) - - fields := strings.Fields(line) - // If the format of the line is invalid then don't trust any of the stats - // in this file. - if len(fields) != 17 { - return nil, fmt.Errorf("invalid interface stats line: %v", line) - } - - devName := fields[0] - if isIgnoredDevice(devName) { - continue - } - - i := info.InterfaceStats{ - Name: devName, - } - - statFields := append(fields[1:5], fields[9:13]...) - statPointers := []*uint64{ - &i.RxBytes, &i.RxPackets, &i.RxErrors, &i.RxDropped, - &i.TxBytes, &i.TxPackets, &i.TxErrors, &i.TxDropped, - } - - err := setInterfaceStatValues(statFields, statPointers) - if err != nil { - return nil, fmt.Errorf("cannot parse interface stats (%v): %v", err, line) - } - - stats = append(stats, i) - } - - return stats, nil -} - -func setInterfaceStatValues(fields []string, pointers []*uint64) error { - for i, v := range fields { - val, err := strconv.ParseUint(v, 10, 64) - if err != nil { - return err - } - *pointers[i] = val - } - return nil -} - -func tcpStatsFromProc(rootFs string, pid int, file string) (info.TcpStat, error) { - tcpStatsFile := path.Join(rootFs, "proc", strconv.Itoa(pid), file) - - tcpStats, err := scanTcpStats(tcpStatsFile) - if err != nil { - return tcpStats, fmt.Errorf("couldn't read tcp stats: %v", err) - } - - return tcpStats, nil -} - -func scanTcpStats(tcpStatsFile string) (info.TcpStat, error) { - - var stats info.TcpStat - - data, err := ioutil.ReadFile(tcpStatsFile) - if err != nil { - return stats, fmt.Errorf("failure opening %s: %v", tcpStatsFile, err) - } - - tcpStateMap := map[string]uint64{ - "01": 0, //ESTABLISHED - "02": 0, //SYN_SENT - "03": 0, //SYN_RECV - "04": 0, //FIN_WAIT1 - "05": 0, //FIN_WAIT2 - "06": 0, //TIME_WAIT - "07": 0, //CLOSE - "08": 0, //CLOSE_WAIT - "09": 0, //LAST_ACK - "0A": 0, //LISTEN - "0B": 0, //CLOSING - } - - reader := strings.NewReader(string(data)) - scanner := bufio.NewScanner(reader) - - scanner.Split(bufio.ScanLines) - - // Discard header line - if b := scanner.Scan(); !b { - return stats, scanner.Err() - } - - for scanner.Scan() { - line := scanner.Text() - - state := strings.Fields(line) - // TCP state is the 4th field. - // Format: sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode - tcpState := state[3] - _, ok := tcpStateMap[tcpState] - if !ok { - return stats, fmt.Errorf("invalid TCP stats line: %v", line) - } - tcpStateMap[tcpState]++ - } - - stats = info.TcpStat{ - Established: tcpStateMap["01"], - SynSent: tcpStateMap["02"], - SynRecv: tcpStateMap["03"], - FinWait1: tcpStateMap["04"], - FinWait2: tcpStateMap["05"], - TimeWait: tcpStateMap["06"], - Close: tcpStateMap["07"], - CloseWait: tcpStateMap["08"], - LastAck: tcpStateMap["09"], - Listen: tcpStateMap["0A"], - Closing: tcpStateMap["0B"], - } - - return stats, nil -} - -func udpStatsFromProc(rootFs string, pid int, file string) (info.UdpStat, error) { - var err error - var udpStats info.UdpStat - - udpStatsFile := path.Join(rootFs, "proc", strconv.Itoa(pid), file) - - r, err := os.Open(udpStatsFile) - if err != nil { - return udpStats, fmt.Errorf("failure opening %s: %v", udpStatsFile, err) - } - - udpStats, err = scanUdpStats(r) - if err != nil { - return udpStats, fmt.Errorf("couldn't read udp stats: %v", err) - } - - return udpStats, nil -} - -func scanUdpStats(r io.Reader) (info.UdpStat, error) { - var stats info.UdpStat - - scanner := bufio.NewScanner(r) - scanner.Split(bufio.ScanLines) - - // Discard header line - if b := scanner.Scan(); !b { - return stats, scanner.Err() - } - - listening := uint64(0) - dropped := uint64(0) - rxQueued := uint64(0) - txQueued := uint64(0) - - for scanner.Scan() { - line := scanner.Text() - // Format: sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops - - listening++ - - fs := strings.Fields(line) - if len(fs) != 13 { - continue - } - - rx, tx := uint64(0), uint64(0) - fmt.Sscanf(fs[4], "%X:%X", &rx, &tx) - rxQueued += rx - txQueued += tx - - d, err := strconv.Atoi(string(fs[12])) - if err != nil { - continue - } - dropped += uint64(d) - } - - stats = info.UdpStat{ - Listen: listening, - Dropped: dropped, - RxQueued: rxQueued, - TxQueued: txQueued, - } - - return stats, nil -} - -func GetProcesses(cgroupManager cgroups.Manager) ([]int, error) { - pids, err := cgroupManager.GetPids() - if err != nil { - return nil, err - } - return pids, nil -} - func DiskStatsCopy0(major, minor uint64) *info.PerDiskStats { disk := info.PerDiskStats{ Major: major, @@ -455,150 +138,3 @@ func DiskStatsCopy(blkio_stats []cgroups.BlkioStatEntry) (stat []info.PerDiskSta } return DiskStatsCopy1(disk_stat) } - -func minUint32(x, y uint32) uint32 { - if x < y { - return x - } - return y -} - -// var to allow unit tests to stub it out -var numCpusFunc = getNumberOnlineCPUs - -// Convert libcontainer stats to info.ContainerStats. -func setCpuStats(s *cgroups.Stats, ret *info.ContainerStats) { - ret.Cpu.Usage.User = s.CpuStats.CpuUsage.UsageInUsermode - ret.Cpu.Usage.System = s.CpuStats.CpuUsage.UsageInKernelmode - ret.Cpu.Usage.Total = 0 - ret.Cpu.CFS.Periods = s.CpuStats.ThrottlingData.Periods - ret.Cpu.CFS.ThrottledPeriods = s.CpuStats.ThrottlingData.ThrottledPeriods - ret.Cpu.CFS.ThrottledTime = s.CpuStats.ThrottlingData.ThrottledTime - - if len(s.CpuStats.CpuUsage.PercpuUsage) == 0 { - // libcontainer's 'GetStats' can leave 'PercpuUsage' nil if it skipped the - // cpuacct subsystem. - return - } - - numPossible := uint32(len(s.CpuStats.CpuUsage.PercpuUsage)) - // Note that as of https://patchwork.kernel.org/patch/8607101/ (kernel v4.7), - // the percpu usage information includes extra zero values for all additional - // possible CPUs. This is to allow statistic collection after CPU-hotplug. - // We intentionally ignore these extra zeroes. - numActual, err := numCpusFunc() - if err != nil { - glog.Errorf("unable to determine number of actual cpus; defaulting to maximum possible number: errno %v", err) - numActual = numPossible - } - if numActual > numPossible { - // The real number of cores should never be greater than the number of - // datapoints reported in cpu usage. - glog.Errorf("PercpuUsage had %v cpus, but the actual number is %v; ignoring extra CPUs", numPossible, numActual) - } - numActual = minUint32(numPossible, numActual) - ret.Cpu.Usage.PerCpu = make([]uint64, numActual) - - for i := uint32(0); i < numActual; i++ { - ret.Cpu.Usage.PerCpu[i] = s.CpuStats.CpuUsage.PercpuUsage[i] - ret.Cpu.Usage.Total += s.CpuStats.CpuUsage.PercpuUsage[i] - } - -} - -// Copied from -// https://github.com/moby/moby/blob/8b1adf55c2af329a4334f21d9444d6a169000c81/daemon/stats/collector_unix.go#L73 -// Apache 2.0, Copyright Docker, Inc. -func getNumberOnlineCPUs() (uint32, error) { - i, err := C.sysconf(C._SC_NPROCESSORS_ONLN) - // According to POSIX - errno is undefined after successful - // sysconf, and can be non-zero in several cases, so look for - // error in returned value not in errno. - // (https://sourceware.org/bugzilla/show_bug.cgi?id=21536) - if i == -1 { - return 0, err - } - return uint32(i), nil -} - -func setDiskIoStats(s *cgroups.Stats, ret *info.ContainerStats) { - ret.DiskIo.IoServiceBytes = DiskStatsCopy(s.BlkioStats.IoServiceBytesRecursive) - ret.DiskIo.IoServiced = DiskStatsCopy(s.BlkioStats.IoServicedRecursive) - ret.DiskIo.IoQueued = DiskStatsCopy(s.BlkioStats.IoQueuedRecursive) - ret.DiskIo.Sectors = DiskStatsCopy(s.BlkioStats.SectorsRecursive) - ret.DiskIo.IoServiceTime = DiskStatsCopy(s.BlkioStats.IoServiceTimeRecursive) - ret.DiskIo.IoWaitTime = DiskStatsCopy(s.BlkioStats.IoWaitTimeRecursive) - ret.DiskIo.IoMerged = DiskStatsCopy(s.BlkioStats.IoMergedRecursive) - ret.DiskIo.IoTime = DiskStatsCopy(s.BlkioStats.IoTimeRecursive) -} - -func setMemoryStats(s *cgroups.Stats, ret *info.ContainerStats) { - ret.Memory.Usage = s.MemoryStats.Usage.Usage - ret.Memory.MaxUsage = s.MemoryStats.Usage.MaxUsage - ret.Memory.Failcnt = s.MemoryStats.Usage.Failcnt - ret.Memory.Cache = s.MemoryStats.Stats["cache"] - - if s.MemoryStats.UseHierarchy { - ret.Memory.RSS = s.MemoryStats.Stats["total_rss"] - ret.Memory.Swap = s.MemoryStats.Stats["total_swap"] - } else { - ret.Memory.RSS = s.MemoryStats.Stats["rss"] - ret.Memory.Swap = s.MemoryStats.Stats["swap"] - } - if v, ok := s.MemoryStats.Stats["pgfault"]; ok { - ret.Memory.ContainerData.Pgfault = v - ret.Memory.HierarchicalData.Pgfault = v - } - if v, ok := s.MemoryStats.Stats["pgmajfault"]; ok { - ret.Memory.ContainerData.Pgmajfault = v - ret.Memory.HierarchicalData.Pgmajfault = v - } - - workingSet := ret.Memory.Usage - if v, ok := s.MemoryStats.Stats["total_inactive_file"]; ok { - if workingSet < v { - workingSet = 0 - } else { - workingSet -= v - } - } - ret.Memory.WorkingSet = workingSet -} - -func setNetworkStats(libcontainerStats *libcontainer.Stats, ret *info.ContainerStats) { - ret.Network.Interfaces = make([]info.InterfaceStats, len(libcontainerStats.Interfaces)) - for i := range libcontainerStats.Interfaces { - ret.Network.Interfaces[i] = info.InterfaceStats{ - Name: libcontainerStats.Interfaces[i].Name, - RxBytes: libcontainerStats.Interfaces[i].RxBytes, - RxPackets: libcontainerStats.Interfaces[i].RxPackets, - RxErrors: libcontainerStats.Interfaces[i].RxErrors, - RxDropped: libcontainerStats.Interfaces[i].RxDropped, - TxBytes: libcontainerStats.Interfaces[i].TxBytes, - TxPackets: libcontainerStats.Interfaces[i].TxPackets, - TxErrors: libcontainerStats.Interfaces[i].TxErrors, - TxDropped: libcontainerStats.Interfaces[i].TxDropped, - } - } - - // Add to base struct for backwards compatibility. - if len(ret.Network.Interfaces) > 0 { - ret.Network.InterfaceStats = ret.Network.Interfaces[0] - } -} - -func newContainerStats(libcontainerStats *libcontainer.Stats) *info.ContainerStats { - ret := &info.ContainerStats{ - Timestamp: time.Now(), - } - - if s := libcontainerStats.CgroupStats; s != nil { - setCpuStats(s, ret) - setDiskIoStats(s, ret) - setMemoryStats(s, ret) - } - if len(libcontainerStats.Interfaces) > 0 { - setNetworkStats(libcontainerStats, ret) - } - return ret -} diff --git a/vendor/github.com/google/cadvisor/container/mesos/BUILD b/vendor/github.com/google/cadvisor/container/mesos/BUILD new file mode 100644 index 00000000..9ee0d41c --- /dev/null +++ b/vendor/github.com/google/cadvisor/container/mesos/BUILD @@ -0,0 +1,47 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "client.go", + "factory.go", + "handler.go", + "mesos_agent.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/mesos", + importpath = "github.com/google/cadvisor/container/mesos", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/Rican7/retry:go_default_library", + "//vendor/github.com/Rican7/retry/strategy:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/google/cadvisor/container:go_default_library", + "//vendor/github.com/google/cadvisor/container/common:go_default_library", + "//vendor/github.com/google/cadvisor/container/libcontainer:go_default_library", + "//vendor/github.com/google/cadvisor/fs:go_default_library", + "//vendor/github.com/google/cadvisor/info/v1:go_default_library", + "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/agent:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/client:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/google/cadvisor/container/mesos/client.go b/vendor/github.com/google/cadvisor/container/mesos/client.go new file mode 100644 index 00000000..ce0c8ef1 --- /dev/null +++ b/vendor/github.com/google/cadvisor/container/mesos/client.go @@ -0,0 +1,190 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// 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 mesos + +import ( + "fmt" + "github.com/Rican7/retry" + "github.com/Rican7/retry/strategy" + "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/agent" + "github.com/mesos/mesos-go/api/v1/lib/agent/calls" + mclient "github.com/mesos/mesos-go/api/v1/lib/client" + "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" + "github.com/mesos/mesos-go/api/v1/lib/httpcli" + "net/url" + "sync" +) + +const ( + maxRetryAttempts = 3 + invalidPID = -1 +) + +var ( + mesosClientOnce sync.Once + mesosClient *client +) + +type client struct { + hc *httpcli.Client +} + +type mesosAgentClient interface { + ContainerInfo(id string) (*containerInfo, error) + ContainerPid(id string) (int, error) +} + +type containerInfo struct { + cntr *mContainer + labels map[string]string +} + +// Client is an interface to query mesos agent http endpoints +func Client() (mesosAgentClient, error) { + mesosClientOnce.Do(func() { + // Start Client + apiURL := url.URL{ + Scheme: "http", + Host: *MesosAgentAddress, + Path: "/api/v1", + } + + mesosClient = &client{ + hc: httpcli.New( + httpcli.Endpoint(apiURL.String()), + httpcli.Codec(codecs.ByMediaType[codecs.MediaTypeProtobuf]), + httpcli.Do(httpcli.With(httpcli.Timeout(*MesosAgentTimeout))), + ), + } + }) + return mesosClient, nil +} + +// ContainerInfo returns the container information of the given container id +func (self *client) ContainerInfo(id string) (*containerInfo, error) { + c, err := self.getContainer(id) + if err != nil { + return nil, err + } + + // Get labels of the container + l, err := self.getLabels(c) + if err != nil { + return nil, err + } + + return &containerInfo{ + cntr: c, + labels: l, + }, nil +} + +// Get the Pid of the container +func (self *client) ContainerPid(id string) (int, error) { + var pid int + var err error + err = retry.Retry( + func(attempt uint) error { + c, err := self.ContainerInfo(id) + if err != nil { + return err + } + + if c.cntr.ContainerStatus != nil { + pid = int(*c.cntr.ContainerStatus.ExecutorPID) + } else { + err = fmt.Errorf("error fetching Pid") + } + return err + }, + strategy.Limit(maxRetryAttempts), + ) + if err != nil { + return invalidPID, fmt.Errorf("failed to fetch pid") + } + return pid, err +} + +func (self *client) getContainer(id string) (*mContainer, error) { + // Get all containers + cntrs, err := self.getContainers() + if err != nil { + return nil, err + } + + // Check if there is a container with given id and return the container + for _, c := range cntrs.Containers { + if c.ContainerID.Value == id { + return &c, nil + } + } + return nil, fmt.Errorf("can't locate container %s", id) +} + +func (self *client) getContainers() (mContainers, error) { + req := calls.NonStreaming(calls.GetContainers()) + result, err := self.fetchAndDecode(req) + if err != nil { + return nil, fmt.Errorf("failed to get mesos containers: %v", err) + } + cntrs := result.GetContainers + return cntrs, nil +} + +func (self *client) getLabels(c *mContainer) (map[string]string, error) { + // Get mesos agent state which contains all containers labels + var s state + req := calls.NonStreaming(calls.GetState()) + result, err := self.fetchAndDecode(req) + if err != nil { + return map[string]string{}, fmt.Errorf("failed to get mesos agent state: %v", err) + } + s.st = result.GetState + + // Fetch labels from state object + labels, err := s.FetchLabels(c.FrameworkID.Value, c.ExecutorID.Value) + if err != nil { + return labels, fmt.Errorf("error while fetching labels from executor: %v", err) + } + + return labels, nil +} + +func (self *client) fetchAndDecode(req calls.RequestFunc) (*agent.Response, error) { + var res mesos.Response + var err error + + // Send request + err = retry.Retry( + func(attempt uint) error { + res, err = mesosClient.hc.Send(req, mclient.ResponseClassSingleton, nil) + return err + }, + strategy.Limit(maxRetryAttempts), + ) + if err != nil { + return nil, fmt.Errorf("error fetching %s: %s", req.Call(), err) + } + + // Decode the result + var target agent.Response + err = res.Decode(&target) + if err != nil { + return nil, fmt.Errorf("error while decoding response body from %s: %s", res, err) + } + + return &target, nil +} diff --git a/vendor/github.com/google/cadvisor/container/mesos/factory.go b/vendor/github.com/google/cadvisor/container/mesos/factory.go new file mode 100644 index 00000000..66cdfe83 --- /dev/null +++ b/vendor/github.com/google/cadvisor/container/mesos/factory.go @@ -0,0 +1,148 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// 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 mesos + +import ( + "flag" + "fmt" + "path" + "regexp" + "strings" + "time" + + "github.com/golang/glog" + "github.com/google/cadvisor/container" + "github.com/google/cadvisor/container/libcontainer" + "github.com/google/cadvisor/fs" + info "github.com/google/cadvisor/info/v1" + "github.com/google/cadvisor/manager/watcher" +) + +var MesosAgentAddress = flag.String("mesos_agent", "127.0.0.1:5051", "Mesos agent address") +var MesosAgentTimeout = flag.Duration("mesos_agent_timeout", 10*time.Second, "Mesos agent timeout") + +// The namespace under which mesos aliases are unique. +const MesosNamespace = "mesos" + +// Regexp that identifies mesos cgroups, containers started with +// --cgroup-parent have another prefix than 'mesos' +var mesosCgroupRegexp = regexp.MustCompile(`([a-z-0-9]{36})`) + +// mesosFactory implements the interface ContainerHandlerFactory +type mesosFactory struct { + machineInfoFactory info.MachineInfoFactory + + // Information about the cgroup subsystems. + cgroupSubsystems libcontainer.CgroupSubsystems + + // Information about mounted filesystems. + fsInfo fs.FsInfo + + includedMetrics map[container.MetricKind]struct{} + + client mesosAgentClient +} + +func (self *mesosFactory) String() string { + return MesosNamespace +} + +func (self *mesosFactory) NewContainerHandler(name string, inHostNamespace bool) (container.ContainerHandler, error) { + client, err := Client() + if err != nil { + return nil, err + } + + return newMesosContainerHandler( + name, + &self.cgroupSubsystems, + self.machineInfoFactory, + self.fsInfo, + self.includedMetrics, + inHostNamespace, + client, + ) +} + +// ContainerNameToMesosId returns the Mesos ID from the full container name. +func ContainerNameToMesosId(name string) string { + id := path.Base(name) + + if matches := mesosCgroupRegexp.FindStringSubmatch(id); matches != nil { + return matches[1] + } + + return id +} + +// isContainerName returns true if the cgroup with associated name +// corresponds to a mesos container. +func isContainerName(name string) bool { + // always ignore .mount cgroup even if associated with mesos and delegate to systemd + if strings.HasSuffix(name, ".mount") { + return false + } + return mesosCgroupRegexp.MatchString(path.Base(name)) +} + +// The mesos factory can handle any container. +func (self *mesosFactory) CanHandleAndAccept(name string) (handle bool, accept bool, err error) { + // if the container is not associated with mesos, we can't handle it or accept it. + if !isContainerName(name) { + return false, false, nil + } + + // Check if the container is known to mesos and it is active. + id := ContainerNameToMesosId(name) + + _, err = self.client.ContainerInfo(id) + if err != nil { + return false, true, fmt.Errorf("error getting running container: %v", err) + } + + return true, true, nil +} + +func (self *mesosFactory) DebugInfo() map[string][]string { + return map[string][]string{} +} + +func Register( + machineInfoFactory info.MachineInfoFactory, + fsInfo fs.FsInfo, + includedMetrics container.MetricSet, +) error { + client, err := Client() + + if err != nil { + return fmt.Errorf("unable to create mesos agent client: %v", err) + } + + cgroupSubsystems, err := libcontainer.GetCgroupSubsystems() + if err != nil { + return fmt.Errorf("failed to get cgroup subsystems: %v", err) + } + + glog.V(1).Infof("Registering mesos factory") + factory := &mesosFactory{ + machineInfoFactory: machineInfoFactory, + cgroupSubsystems: cgroupSubsystems, + fsInfo: fsInfo, + includedMetrics: includedMetrics, + client: client, + } + container.RegisterContainerHandlerFactory(factory, []watcher.ContainerWatchSource{watcher.Raw}) + return nil +} diff --git a/vendor/github.com/google/cadvisor/container/mesos/handler.go b/vendor/github.com/google/cadvisor/container/mesos/handler.go new file mode 100644 index 00000000..65d0b987 --- /dev/null +++ b/vendor/github.com/google/cadvisor/container/mesos/handler.go @@ -0,0 +1,213 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// 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. + +// Handler for "mesos" containers. +package mesos + +import ( + "fmt" + "path" + + "github.com/google/cadvisor/container" + "github.com/google/cadvisor/container/common" + containerlibcontainer "github.com/google/cadvisor/container/libcontainer" + "github.com/google/cadvisor/fs" + info "github.com/google/cadvisor/info/v1" + + cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" + libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs" +) + +type mesosContainerHandler struct { + // Name of the container for this handler. + name string + + // machineInfoFactory provides info.MachineInfo + machineInfoFactory info.MachineInfoFactory + + // Absolute path to the cgroup hierarchies of this container. + // (e.g.: "cpu" -> "/sys/fs/cgroup/cpu/test") + cgroupPaths map[string]string + + // File System Info + fsInfo fs.FsInfo + + // Metrics to be included. + includedMetrics container.MetricSet + + labels map[string]string + + // Reference to the container + reference info.ContainerReference + + libcontainerHandler *containerlibcontainer.Handler +} + +func isRootCgroup(name string) bool { + return name == "/" +} + +func newMesosContainerHandler( + name string, + cgroupSubsystems *containerlibcontainer.CgroupSubsystems, + machineInfoFactory info.MachineInfoFactory, + fsInfo fs.FsInfo, + includedMetrics container.MetricSet, + inHostNamespace bool, + client mesosAgentClient, +) (container.ContainerHandler, error) { + cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name) + for key, val := range cgroupSubsystems.MountPoints { + cgroupPaths[key] = path.Join(val, name) + } + + // Generate the equivalent cgroup manager for this container. + cgroupManager := &cgroupfs.Manager{ + Cgroups: &libcontainerconfigs.Cgroup{ + Name: name, + }, + Paths: cgroupPaths, + } + + rootFs := "/" + if !inHostNamespace { + rootFs = "/rootfs" + } + + id := ContainerNameToMesosId(name) + + cinfo, err := client.ContainerInfo(id) + + if err != nil { + return nil, err + } + + labels := cinfo.labels + pid, err := client.ContainerPid(id) + if err != nil { + return nil, err + } + + libcontainerHandler := containerlibcontainer.NewHandler(cgroupManager, rootFs, pid, includedMetrics) + + reference := info.ContainerReference{ + Id: id, + Name: name, + Namespace: MesosNamespace, + Aliases: []string{id, name}, + } + + handler := &mesosContainerHandler{ + name: name, + machineInfoFactory: machineInfoFactory, + cgroupPaths: cgroupPaths, + fsInfo: fsInfo, + includedMetrics: includedMetrics, + labels: labels, + reference: reference, + libcontainerHandler: libcontainerHandler, + } + + return handler, nil +} + +func (self *mesosContainerHandler) ContainerReference() (info.ContainerReference, error) { + // We only know the container by its one name. + return self.reference, nil +} + +// Nothing to start up. +func (self *mesosContainerHandler) Start() {} + +// Nothing to clean up. +func (self *mesosContainerHandler) Cleanup() {} + +func (self *mesosContainerHandler) GetSpec() (info.ContainerSpec, error) { + // TODO: Since we dont collect disk usage and network stats for mesos containers, we set + // hasFilesystem and hasNetwork to false. Revisit when we support disk usage, network + // stats for mesos containers. + hasNetwork := false + hasFilesystem := false + + spec, err := common.GetSpec(self.cgroupPaths, self.machineInfoFactory, hasNetwork, hasFilesystem) + if err != nil { + return spec, err + } + + spec.Labels = self.labels + + return spec, nil +} + +func (self *mesosContainerHandler) getFsStats(stats *info.ContainerStats) error { + + mi, err := self.machineInfoFactory.GetMachineInfo() + if err != nil { + return err + } + + if self.includedMetrics.Has(container.DiskIOMetrics) { + common.AssignDeviceNamesToDiskStats((*common.MachineInfoNamer)(mi), &stats.DiskIo) + } + + return nil +} + +func (self *mesosContainerHandler) GetStats() (*info.ContainerStats, error) { + stats, err := self.libcontainerHandler.GetStats() + if err != nil { + return stats, err + } + + // Get filesystem stats. + err = self.getFsStats(stats) + if err != nil { + return stats, err + } + + return stats, nil +} + +func (self *mesosContainerHandler) GetCgroupPath(resource string) (string, error) { + path, ok := self.cgroupPaths[resource] + if !ok { + return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, self.name) + } + return path, nil +} + +func (self *mesosContainerHandler) GetContainerLabels() map[string]string { + return self.labels +} + +func (self *mesosContainerHandler) GetContainerIPAddress() string { + // the IP address for the mesos container corresponds to the system ip address. + return "127.0.0.1" +} + +func (self *mesosContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerReference, error) { + return common.ListContainers(self.name, self.cgroupPaths, listType) +} + +func (self *mesosContainerHandler) ListProcesses(listType container.ListType) ([]int, error) { + return self.libcontainerHandler.GetProcesses() +} + +func (self *mesosContainerHandler) Exists() bool { + return common.CgroupExists(self.cgroupPaths) +} + +func (self *mesosContainerHandler) Type() container.ContainerType { + return container.ContainerTypeMesos +} diff --git a/vendor/github.com/google/cadvisor/container/mesos/mesos_agent.go b/vendor/github.com/google/cadvisor/container/mesos/mesos_agent.go new file mode 100644 index 00000000..20f921b9 --- /dev/null +++ b/vendor/github.com/google/cadvisor/container/mesos/mesos_agent.go @@ -0,0 +1,147 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// 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 mesos + +import ( + "fmt" + "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/agent" +) + +const ( + cpus = "cpus" + schedulerSLA = "scheduler_sla" + framework = "framework" + source = "source" + revocable = "revocable" + nonRevocable = "non_revocable" +) + +type mContainers *agent.Response_GetContainers +type mContainer = agent.Response_GetContainers_Container + +type ( + state struct { + st *agent.Response_GetState + } +) + +// GetFramework finds a framework with the given id and returns nil if not found. Note that +// this is different from the framework name. +func (s *state) GetFramework(id string) (*mesos.FrameworkInfo, error) { + for _, fw := range s.st.GetFrameworks.Frameworks { + if fw.FrameworkInfo.ID.Value == id { + return &fw.FrameworkInfo, nil + } + } + return nil, fmt.Errorf("unable to find framework id %s", id) +} + +// GetExecutor finds an executor with the given ID and returns nil if not found. Note that +// this is different from the executor name. +func (s *state) GetExecutor(id string) (*mesos.ExecutorInfo, error) { + for _, exec := range s.st.GetExecutors.Executors { + if exec.ExecutorInfo.ExecutorID.Value == id { + return &exec.ExecutorInfo, nil + } + } + return nil, fmt.Errorf("unable to find executor with id %s", id) +} + +// GetTask returns a task launched by given executor. +func (s *state) GetTask(exID string) (*mesos.Task, error) { + // Check if task is in Launched Tasks list + for _, t := range s.st.GetTasks.LaunchedTasks { + if s.isMatchingTask(&t, exID) { + return &t, nil + } + } + + // Check if task is in Queued Tasks list + for _, t := range s.st.GetTasks.QueuedTasks { + if s.isMatchingTask(&t, exID) { + return &t, nil + } + } + return nil, fmt.Errorf("unable to find task matching executor id %s", exID) +} + +func (s *state) isMatchingTask(t *mesos.Task, exID string) bool { + // MESOS-9111: For tasks launched through mesos command/default executor, the + // executorID(which is same as the taskID) field is not filled in the TaskInfo object. + // The workaround is compare with taskID field if executorID is empty + if t.ExecutorID != nil { + if t.ExecutorID.Value == exID { + return true + } + } else { + if t.TaskID.Value == exID { + return true + } + } + + return false +} + +func (s *state) fetchLabelsFromTask(exID string, labels map[string]string) error { + t, err := s.GetTask(exID) + if err != nil { + return err + } + + // Identify revocability. Can be removed once we have a proper label + for _, resource := range t.Resources { + if resource.Name == cpus { + if resource.Revocable != nil { + labels[schedulerSLA] = revocable + } else { + labels[schedulerSLA] = nonRevocable + } + break + } + } + + for _, l := range t.Labels.Labels { + labels[l.Key] = *l.Value + } + + return nil +} + +func (s *state) FetchLabels(fwID string, exID string) (map[string]string, error) { + labels := make(map[string]string) + + // Look for the framework which launched the container. + fw, err := s.GetFramework(fwID) + if err != nil { + return labels, fmt.Errorf("framework ID %q not found: %v", fwID, err) + } + labels[framework] = fw.Name + + // Get the executor info of the container which contains all the task info. + exec, err := s.GetExecutor(exID) + if err != nil { + return labels, fmt.Errorf("executor ID %q not found: %v", exID, err) + } + + labels[source] = *exec.Source + + err = s.fetchLabelsFromTask(exID, labels) + if err != nil { + return labels, fmt.Errorf("failed to fetch labels from task with executor ID %s", exID) + } + + return labels, nil +} diff --git a/vendor/github.com/google/cadvisor/container/raw/BUILD b/vendor/github.com/google/cadvisor/container/raw/BUILD index fcf14378..f5db9fcc 100644 --- a/vendor/github.com/google/cadvisor/container/raw/BUILD +++ b/vendor/github.com/google/cadvisor/container/raw/BUILD @@ -6,6 +6,7 @@ go_library( "factory.go", "handler.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/raw", importpath = "github.com/google/cadvisor/container/raw", visibility = ["//visibility:public"], deps = [ @@ -17,7 +18,6 @@ go_library( "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/machine:go_default_library", "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", ], diff --git a/vendor/github.com/google/cadvisor/container/raw/factory.go b/vendor/github.com/google/cadvisor/container/raw/factory.go index 1b8a43a4..dd277c32 100644 --- a/vendor/github.com/google/cadvisor/container/raw/factory.go +++ b/vendor/github.com/google/cadvisor/container/raw/factory.go @@ -17,6 +17,7 @@ package raw import ( "flag" "fmt" + "strings" "github.com/google/cadvisor/container" "github.com/google/cadvisor/container/common" @@ -43,8 +44,11 @@ type rawFactory struct { // Watcher for inotify events. watcher *common.InotifyWatcher - // List of metrics to be ignored. - ignoreMetrics map[container.MetricKind]struct{} + // List of metrics to be included. + includedMetrics map[container.MetricKind]struct{} + + // List of raw container cgroup path prefix whitelist. + rawPrefixWhiteList []string } func (self *rawFactory) String() string { @@ -56,12 +60,19 @@ func (self *rawFactory) NewContainerHandler(name string, inHostNamespace bool) ( if !inHostNamespace { rootFs = "/rootfs" } - return newRawContainerHandler(name, self.cgroupSubsystems, self.machineInfoFactory, self.fsInfo, self.watcher, rootFs, self.ignoreMetrics) + return newRawContainerHandler(name, self.cgroupSubsystems, self.machineInfoFactory, self.fsInfo, self.watcher, rootFs, self.includedMetrics) } // The raw factory can handle any container. If --docker_only is set to false, non-docker containers are ignored. func (self *rawFactory) CanHandleAndAccept(name string) (bool, bool, error) { accept := name == "/" || !*dockerOnly + + for _, prefix := range self.rawPrefixWhiteList { + if strings.HasPrefix(name, prefix) { + accept = true + break + } + } return true, accept, nil } @@ -69,7 +80,7 @@ func (self *rawFactory) DebugInfo() map[string][]string { return common.DebugInfo(self.watcher.GetWatches()) } -func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics map[container.MetricKind]struct{}) error { +func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics map[container.MetricKind]struct{}, rawPrefixWhiteList []string) error { cgroupSubsystems, err := libcontainer.GetCgroupSubsystems() if err != nil { return fmt.Errorf("failed to get cgroup subsystems: %v", err) @@ -89,7 +100,8 @@ func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, igno fsInfo: fsInfo, cgroupSubsystems: &cgroupSubsystems, watcher: watcher, - ignoreMetrics: ignoreMetrics, + includedMetrics: includedMetrics, + rawPrefixWhiteList: rawPrefixWhiteList, } container.RegisterContainerHandlerFactory(factory, []watch.ContainerWatchSource{watch.Raw}) return nil diff --git a/vendor/github.com/google/cadvisor/container/raw/handler.go b/vendor/github.com/google/cadvisor/container/raw/handler.go index 35614afd..0a3f2a9c 100644 --- a/vendor/github.com/google/cadvisor/container/raw/handler.go +++ b/vendor/github.com/google/cadvisor/container/raw/handler.go @@ -26,7 +26,6 @@ import ( "github.com/google/cadvisor/machine" "github.com/golang/glog" - "github.com/opencontainers/runc/libcontainer/cgroups" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" "github.com/opencontainers/runc/libcontainer/configs" ) @@ -34,32 +33,23 @@ import ( type rawContainerHandler struct { // Name of the container for this handler. name string - cgroupSubsystems *libcontainer.CgroupSubsystems machineInfoFactory info.MachineInfoFactory // Absolute path to the cgroup hierarchies of this container. // (e.g.: "cpu" -> "/sys/fs/cgroup/cpu/test") cgroupPaths map[string]string - // Manager of this container's cgroups. - cgroupManager cgroups.Manager - fsInfo fs.FsInfo externalMounts []common.Mount - rootFs string - - // Metrics to be ignored. - ignoreMetrics container.MetricSet - - pid int + libcontainerHandler *libcontainer.Handler } func isRootCgroup(name string) bool { return name == "/" } -func newRawContainerHandler(name string, cgroupSubsystems *libcontainer.CgroupSubsystems, machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, watcher *common.InotifyWatcher, rootFs string, ignoreMetrics container.MetricSet) (container.ContainerHandler, error) { +func newRawContainerHandler(name string, cgroupSubsystems *libcontainer.CgroupSubsystems, machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, watcher *common.InotifyWatcher, rootFs string, includedMetrics container.MetricSet) (container.ContainerHandler, error) { cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name) cHints, err := common.GetContainerHintsFromFile(*common.ArgContainerHints) @@ -88,17 +78,15 @@ func newRawContainerHandler(name string, cgroupSubsystems *libcontainer.CgroupSu pid = 1 } + handler := libcontainer.NewHandler(cgroupManager, rootFs, pid, includedMetrics) + return &rawContainerHandler{ - name: name, - cgroupSubsystems: cgroupSubsystems, - machineInfoFactory: machineInfoFactory, - cgroupPaths: cgroupPaths, - cgroupManager: cgroupManager, - fsInfo: fsInfo, - externalMounts: externalMounts, - rootFs: rootFs, - ignoreMetrics: ignoreMetrics, - pid: pid, + name: name, + machineInfoFactory: machineInfoFactory, + cgroupPaths: cgroupPaths, + fsInfo: fsInfo, + externalMounts: externalMounts, + libcontainerHandler: handler, }, nil } @@ -231,7 +219,7 @@ func (self *rawContainerHandler) getFsStats(stats *info.ContainerStats) error { } func (self *rawContainerHandler) GetStats() (*info.ContainerStats, error) { - stats, err := libcontainer.GetStats(self.cgroupManager, self.rootFs, self.pid, self.ignoreMetrics) + stats, err := self.libcontainerHandler.GetStats() if err != nil { return stats, err } @@ -267,7 +255,7 @@ func (self *rawContainerHandler) ListContainers(listType container.ListType) ([] } func (self *rawContainerHandler) ListProcesses(listType container.ListType) ([]int, error) { - return libcontainer.GetProcesses(self.cgroupManager) + return self.libcontainerHandler.GetProcesses() } func (self *rawContainerHandler) Exists() bool { diff --git a/vendor/github.com/google/cadvisor/container/rkt/BUILD b/vendor/github.com/google/cadvisor/container/rkt/BUILD index 90d7151c..8dfe0c1e 100644 --- a/vendor/github.com/google/cadvisor/container/rkt/BUILD +++ b/vendor/github.com/google/cadvisor/container/rkt/BUILD @@ -8,6 +8,7 @@ go_library( "handler.go", "helpers.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/rkt", importpath = "github.com/google/cadvisor/container/rkt", visibility = ["//visibility:public"], deps = [ @@ -20,7 +21,6 @@ go_library( "//vendor/github.com/google/cadvisor/fs:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/manager/watcher:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", diff --git a/vendor/github.com/google/cadvisor/container/rkt/factory.go b/vendor/github.com/google/cadvisor/container/rkt/factory.go index 3f79d753..e80cbd55 100644 --- a/vendor/github.com/google/cadvisor/container/rkt/factory.go +++ b/vendor/github.com/google/cadvisor/container/rkt/factory.go @@ -35,7 +35,7 @@ type rktFactory struct { fsInfo fs.FsInfo - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet rktPath string } @@ -54,7 +54,7 @@ func (self *rktFactory) NewContainerHandler(name string, inHostNamespace bool) ( if !inHostNamespace { rootFs = "/rootfs" } - return newRktContainerHandler(name, client, self.rktPath, self.cgroupSubsystems, self.machineInfoFactory, self.fsInfo, rootFs, self.ignoreMetrics) + return newRktContainerHandler(name, client, self.rktPath, self.cgroupSubsystems, self.machineInfoFactory, self.fsInfo, rootFs, self.includedMetrics) } func (self *rktFactory) CanHandleAndAccept(name string) (bool, bool, error) { @@ -67,7 +67,7 @@ func (self *rktFactory) DebugInfo() map[string][]string { return map[string][]string{} } -func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics container.MetricSet) error { +func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics container.MetricSet) error { _, err := Client() if err != nil { return fmt.Errorf("unable to communicate with Rkt api service: %v", err) @@ -91,7 +91,7 @@ func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, igno machineInfoFactory: machineInfoFactory, fsInfo: fsInfo, cgroupSubsystems: &cgroupSubsystems, - ignoreMetrics: ignoreMetrics, + includedMetrics: includedMetrics, rktPath: rktPath, } container.RegisterContainerHandlerFactory(factory, []watcher.ContainerWatchSource{watcher.Rkt}) diff --git a/vendor/github.com/google/cadvisor/container/rkt/handler.go b/vendor/github.com/google/cadvisor/container/rkt/handler.go index 9caa0ce4..afd48b4d 100644 --- a/vendor/github.com/google/cadvisor/container/rkt/handler.go +++ b/vendor/github.com/google/cadvisor/container/rkt/handler.go @@ -28,51 +28,38 @@ import ( "golang.org/x/net/context" "github.com/golang/glog" - "github.com/opencontainers/runc/libcontainer/cgroups" cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs" "github.com/opencontainers/runc/libcontainer/configs" ) type rktContainerHandler struct { - rktClient rktapi.PublicAPIClient - // Name of the container for this handler. - name string - cgroupSubsystems *libcontainer.CgroupSubsystems machineInfoFactory info.MachineInfoFactory // Absolute path to the cgroup hierarchies of this container. // (e.g.: "cpu" -> "/sys/fs/cgroup/cpu/test") cgroupPaths map[string]string - // Manager of this container's cgroups. - cgroupManager cgroups.Manager - - // Whether this container has network isolation enabled. - hasNetwork bool - fsInfo fs.FsInfo - rootFs string - isPod bool - aliases []string - - pid int - rootfsStorageDir string - labels map[string]string - // Filesystem handler. fsHandler common.FsHandler - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet apiPod *rktapi.Pod + + labels map[string]string + + reference info.ContainerReference + + libcontainerHandler *libcontainer.Handler } -func newRktContainerHandler(name string, rktClient rktapi.PublicAPIClient, rktPath string, cgroupSubsystems *libcontainer.CgroupSubsystems, machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, rootFs string, ignoreMetrics container.MetricSet) (container.ContainerHandler, error) { +func newRktContainerHandler(name string, rktClient rktapi.PublicAPIClient, rktPath string, cgroupSubsystems *libcontainer.CgroupSubsystems, machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, rootFs string, includedMetrics container.MetricSet) (container.ContainerHandler, error) { aliases := make([]string, 1) isPod := false @@ -122,33 +109,30 @@ func newRktContainerHandler(name string, rktClient rktapi.PublicAPIClient, rktPa Paths: cgroupPaths, } - hasNetwork := false - if isPod { - hasNetwork = true - } + libcontainerHandler := libcontainer.NewHandler(cgroupManager, rootFs, pid, includedMetrics) rootfsStorageDir := getRootFs(rktPath, parsed) + containerReference := info.ContainerReference{ + Name: name, + Aliases: aliases, + Namespace: RktNamespace, + } + handler := &rktContainerHandler{ - name: name, - rktClient: rktClient, - cgroupSubsystems: cgroupSubsystems, - machineInfoFactory: machineInfoFactory, - cgroupPaths: cgroupPaths, - cgroupManager: cgroupManager, - fsInfo: fsInfo, - hasNetwork: hasNetwork, - rootFs: rootFs, - isPod: isPod, - aliases: aliases, - pid: pid, - labels: labels, - rootfsStorageDir: rootfsStorageDir, - ignoreMetrics: ignoreMetrics, - apiPod: apiPod, + machineInfoFactory: machineInfoFactory, + cgroupPaths: cgroupPaths, + fsInfo: fsInfo, + isPod: isPod, + rootfsStorageDir: rootfsStorageDir, + includedMetrics: includedMetrics, + apiPod: apiPod, + labels: labels, + reference: containerReference, + libcontainerHandler: libcontainerHandler, } - if !ignoreMetrics.Has(container.DiskUsageMetrics) { + if includedMetrics.Has(container.DiskUsageMetrics) { handler.fsHandler = common.NewFsHandler(common.DefaultPeriod, rootfsStorageDir, "", fsInfo) } @@ -174,12 +158,7 @@ func createLabels(annotations []*rktapi.KeyValue) map[string]string { } func (handler *rktContainerHandler) ContainerReference() (info.ContainerReference, error) { - return info.ContainerReference{ - Name: handler.name, - Aliases: handler.aliases, - Namespace: RktNamespace, - Labels: handler.labels, - }, nil + return handler.reference, nil } func (handler *rktContainerHandler) Start() { @@ -191,8 +170,8 @@ func (handler *rktContainerHandler) Cleanup() { } func (handler *rktContainerHandler) GetSpec() (info.ContainerSpec, error) { - hasNetwork := handler.hasNetwork && !handler.ignoreMetrics.Has(container.NetworkUsageMetrics) - hasFilesystem := !handler.ignoreMetrics.Has(container.DiskUsageMetrics) + hasNetwork := handler.isPod && handler.includedMetrics.Has(container.NetworkUsageMetrics) + hasFilesystem := handler.includedMetrics.Has(container.DiskUsageMetrics) spec, err := common.GetSpec(handler.cgroupPaths, handler.machineInfoFactory, hasNetwork, hasFilesystem) @@ -207,11 +186,11 @@ func (handler *rktContainerHandler) getFsStats(stats *info.ContainerStats) error return err } - if !handler.ignoreMetrics.Has(container.DiskIOMetrics) { + if handler.includedMetrics.Has(container.DiskIOMetrics) { common.AssignDeviceNamesToDiskStats((*common.MachineInfoNamer)(mi), &stats.DiskIo) } - if handler.ignoreMetrics.Has(container.DiskUsageMetrics) { + if !handler.includedMetrics.Has(container.DiskUsageMetrics) { return nil } @@ -243,7 +222,7 @@ func (handler *rktContainerHandler) getFsStats(stats *info.ContainerStats) error } func (handler *rktContainerHandler) GetStats() (*info.ContainerStats, error) { - stats, err := libcontainer.GetStats(handler.cgroupManager, handler.rootFs, handler.pid, handler.ignoreMetrics) + stats, err := handler.libcontainerHandler.GetStats() if err != nil { return stats, err } @@ -275,7 +254,7 @@ func (self *rktContainerHandler) GetContainerIPAddress() string { func (handler *rktContainerHandler) GetCgroupPath(resource string) (string, error) { path, ok := handler.cgroupPaths[resource] if !ok { - return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, handler.name) + return "", fmt.Errorf("could not find path for resource %q for container %q\n", resource, handler.reference.Name) } return path, nil } @@ -285,11 +264,11 @@ func (handler *rktContainerHandler) GetContainerLabels() map[string]string { } func (handler *rktContainerHandler) ListContainers(listType container.ListType) ([]info.ContainerReference, error) { - return common.ListContainers(handler.name, handler.cgroupPaths, listType) + return common.ListContainers(handler.reference.Name, handler.cgroupPaths, listType) } func (handler *rktContainerHandler) ListProcesses(listType container.ListType) ([]int, error) { - return libcontainer.GetProcesses(handler.cgroupManager) + return handler.libcontainerHandler.GetProcesses() } func (handler *rktContainerHandler) Exists() bool { diff --git a/vendor/github.com/google/cadvisor/container/systemd/BUILD b/vendor/github.com/google/cadvisor/container/systemd/BUILD index c694265c..640a4b7d 100644 --- a/vendor/github.com/google/cadvisor/container/systemd/BUILD +++ b/vendor/github.com/google/cadvisor/container/systemd/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["factory.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/systemd", importpath = "github.com/google/cadvisor/container/systemd", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/container/systemd/factory.go b/vendor/github.com/google/cadvisor/container/systemd/factory.go index cb3b7c89..dfe751a4 100644 --- a/vendor/github.com/google/cadvisor/container/systemd/factory.go +++ b/vendor/github.com/google/cadvisor/container/systemd/factory.go @@ -50,7 +50,7 @@ func (f *systemdFactory) DebugInfo() map[string][]string { } // Register registers the systemd container factory. -func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, ignoreMetrics container.MetricSet) error { +func Register(machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, includedMetrics container.MetricSet) error { glog.V(1).Infof("Registering systemd factory") factory := &systemdFactory{} container.RegisterContainerHandlerFactory(factory, []watcher.ContainerWatchSource{watcher.Raw}) diff --git a/vendor/github.com/google/cadvisor/devicemapper/BUILD b/vendor/github.com/google/cadvisor/devicemapper/BUILD index 28c0e144..d3e813a0 100644 --- a/vendor/github.com/google/cadvisor/devicemapper/BUILD +++ b/vendor/github.com/google/cadvisor/devicemapper/BUILD @@ -9,6 +9,7 @@ go_library( "thin_pool_watcher.go", "util.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/devicemapper", importpath = "github.com/google/cadvisor/devicemapper", visibility = ["//visibility:public"], deps = ["//vendor/github.com/golang/glog:go_default_library"], diff --git a/vendor/github.com/google/cadvisor/events/BUILD b/vendor/github.com/google/cadvisor/events/BUILD index cebe194c..f5b78547 100644 --- a/vendor/github.com/google/cadvisor/events/BUILD +++ b/vendor/github.com/google/cadvisor/events/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["handler.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/events", importpath = "github.com/google/cadvisor/events", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/fs/BUILD b/vendor/github.com/google/cadvisor/fs/BUILD index 72d6b14c..4af2e938 100644 --- a/vendor/github.com/google/cadvisor/fs/BUILD +++ b/vendor/github.com/google/cadvisor/fs/BUILD @@ -3,20 +3,18 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ + "fs.go", "types.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux_amd64": [ - "fs.go", - ], - "//conditions:default": [], - }), + ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/fs", importpath = "github.com/google/cadvisor/fs", visibility = ["//visibility:public"], deps = select({ - "@io_bazel_rules_go//go/platform:linux_amd64": [ + "@io_bazel_rules_go//go/platform:linux": [ "//vendor/github.com/docker/docker/pkg/mount:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/devicemapper:go_default_library", + "//vendor/github.com/google/cadvisor/utils:go_default_library", "//vendor/github.com/google/cadvisor/utils/docker:go_default_library", "//vendor/github.com/mistifyio/go-zfs:go_default_library", ], diff --git a/vendor/github.com/google/cadvisor/fs/fs.go b/vendor/github.com/google/cadvisor/fs/fs.go index 271b01e3..7d0ead97 100644 --- a/vendor/github.com/google/cadvisor/fs/fs.go +++ b/vendor/github.com/google/cadvisor/fs/fs.go @@ -35,6 +35,7 @@ import ( "github.com/docker/docker/pkg/mount" "github.com/golang/glog" "github.com/google/cadvisor/devicemapper" + "github.com/google/cadvisor/utils" dockerutil "github.com/google/cadvisor/utils/docker" zfs "github.com/mistifyio/go-zfs" ) @@ -106,14 +107,16 @@ type CrioContext struct { } func NewFsInfo(context Context) (FsInfo, error) { - mounts, err := mount.GetMounts() + mounts, err := mount.GetMounts(nil) if err != nil { return nil, err } fsUUIDToDeviceName, err := getFsUUIDToDeviceNameMap() if err != nil { - return nil, err + // UUID is not always avaiable across different OS distributions. + // Do not fail if there is an error. + glog.Warningf("Failed to get disk UUID mapping, getting disk info by uuid will not work: %v", err) } // Avoid devicemapper container mounts - these are tracked by the ThinPoolWatcher @@ -409,13 +412,17 @@ func (self *RealFsInfo) GetFsInfoForPath(mountSet map[string]struct{}) ([]Fs, er fs.Type = ZFS default: var inodes, inodesFree uint64 - fs.Capacity, fs.Free, fs.Available, inodes, inodesFree, err = getVfsStats(partition.mountpoint) - fs.Inodes = &inodes - fs.InodesFree = &inodesFree - fs.Type = VFS + if utils.FileExists(partition.mountpoint) { + fs.Capacity, fs.Free, fs.Available, inodes, inodesFree, err = getVfsStats(partition.mountpoint) + fs.Inodes = &inodes + fs.InodesFree = &inodesFree + fs.Type = VFS + } else { + glog.V(4).Infof("unable to determine file system type, partition mountpoint does not exist: %v", partition.mountpoint) + } } if err != nil { - glog.Errorf("Stat fs failed. Error: %v", err) + glog.V(4).Infof("Stat fs failed. Error: %v", err) } else { deviceSet[device] = struct{}{} fs.DeviceInfo = DeviceInfo{ @@ -526,6 +533,21 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) { } mount, found := self.mounts[dir] + // try the parent dir if not found until we reach the root dir + // this is an issue on btrfs systems where the directory is not + // the subvolume + for !found { + pathdir, _ := filepath.Split(dir) + // break when we reach root + if pathdir == "/" { + break + } + // trim "/" from the new parent path otherwise the next possible + // filepath.Split in the loop will not split the string any further + dir = strings.TrimSuffix(pathdir, "/") + mount, found = self.mounts[dir] + } + if found && mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { major, minor, err := getBtrfsMajorMinorIds(mount) if err != nil { @@ -547,7 +569,7 @@ func GetDirDiskUsage(dir string, timeout time.Duration) (uint64, error) { if dir == "" { return 0, fmt.Errorf("invalid directory") } - cmd := exec.Command("nice", "-n", "19", "du", "-s", dir) + cmd := exec.Command("ionice", "-c3", "nice", "-n", "19", "du", "-s", dir) stdoutp, err := cmd.StdoutPipe() if err != nil { return 0, fmt.Errorf("failed to setup stdout for cmd %v - %v", cmd.Args, err) @@ -594,7 +616,7 @@ func GetDirInodeUsage(dir string, timeout time.Duration) (uint64, error) { } var counter byteCounter var stderr bytes.Buffer - findCmd := exec.Command("find", dir, "-xdev", "-printf", ".") + findCmd := exec.Command("ionice", "-c3", "nice", "-n", "19", "find", dir, "-xdev", "-printf", ".") findCmd.Stdout, findCmd.Stderr = &counter, &stderr if err := findCmd.Start(); err != nil { return 0, fmt.Errorf("failed to exec cmd %v - %v; stderr: %v", findCmd.Args, err, stderr.String()) diff --git a/vendor/github.com/google/cadvisor/healthz/healthz.go b/vendor/github.com/google/cadvisor/healthz/healthz.go deleted file mode 100644 index 83d72349..00000000 --- a/vendor/github.com/google/cadvisor/healthz/healthz.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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 healthz - -import ( - "net/http" - - httpmux "github.com/google/cadvisor/http/mux" -) - -func handleHealthz(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - w.Write([]byte("ok")) -} - -// Register simple HTTP /healthz handler to return "ok". -func RegisterHandler(mux httpmux.Mux) error { - mux.HandleFunc("/healthz", handleHealthz) - return nil -} diff --git a/vendor/github.com/google/cadvisor/http/BUILD b/vendor/github.com/google/cadvisor/http/BUILD deleted file mode 100644 index 724c0166..00000000 --- a/vendor/github.com/google/cadvisor/http/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["handlers.go"], - importpath = "github.com/google/cadvisor/http", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/abbot/go-http-auth:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/api:go_default_library", - "//vendor/github.com/google/cadvisor/healthz:go_default_library", - "//vendor/github.com/google/cadvisor/http/mux:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - "//vendor/github.com/google/cadvisor/metrics:go_default_library", - "//vendor/github.com/google/cadvisor/pages:go_default_library", - "//vendor/github.com/google/cadvisor/pages/static:go_default_library", - "//vendor/github.com/google/cadvisor/validate:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/github.com/google/cadvisor/http/mux:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/google/cadvisor/http/handlers.go b/vendor/github.com/google/cadvisor/http/handlers.go deleted file mode 100644 index 8950072b..00000000 --- a/vendor/github.com/google/cadvisor/http/handlers.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2015 Google Inc. All Rights Reserved. -// -// 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 http - -import ( - "fmt" - "net/http" - "os" - - "github.com/google/cadvisor/api" - "github.com/google/cadvisor/healthz" - httpmux "github.com/google/cadvisor/http/mux" - "github.com/google/cadvisor/manager" - "github.com/google/cadvisor/metrics" - "github.com/google/cadvisor/pages" - "github.com/google/cadvisor/pages/static" - "github.com/google/cadvisor/validate" - - auth "github.com/abbot/go-http-auth" - "github.com/golang/glog" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm string) error { - // Basic health handler. - if err := healthz.RegisterHandler(mux); err != nil { - return fmt.Errorf("failed to register healthz handler: %s", err) - } - - // Validation/Debug handler. - mux.HandleFunc(validate.ValidatePage, func(w http.ResponseWriter, r *http.Request) { - err := validate.HandleRequest(w, containerManager) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - }) - - // Register API handler. - if err := api.RegisterHandlers(mux, containerManager); err != nil { - return fmt.Errorf("failed to register API handlers: %s", err) - } - - // Redirect / to containers page. - mux.Handle("/", http.RedirectHandler(pages.ContainersPage, http.StatusTemporaryRedirect)) - - var authenticated bool - - // Setup the authenticator object - if httpAuthFile != "" { - glog.V(1).Infof("Using auth file %s", httpAuthFile) - secrets := auth.HtpasswdFileProvider(httpAuthFile) - authenticator := auth.NewBasicAuthenticator(httpAuthRealm, secrets) - mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler)) - if err := pages.RegisterHandlersBasic(mux, containerManager, authenticator); err != nil { - return fmt.Errorf("failed to register pages auth handlers: %s", err) - } - authenticated = true - } - if httpAuthFile == "" && httpDigestFile != "" { - glog.V(1).Infof("Using digest file %s", httpDigestFile) - secrets := auth.HtdigestFileProvider(httpDigestFile) - authenticator := auth.NewDigestAuthenticator(httpDigestRealm, secrets) - mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler)) - if err := pages.RegisterHandlersDigest(mux, containerManager, authenticator); err != nil { - return fmt.Errorf("failed to register pages digest handlers: %s", err) - } - authenticated = true - } - - // Change handler based on authenticator initalization - if !authenticated { - mux.HandleFunc(static.StaticResource, staticHandlerNoAuth) - if err := pages.RegisterHandlersBasic(mux, containerManager, nil); err != nil { - return fmt.Errorf("failed to register pages handlers: %s", err) - } - } - - return nil -} - -// RegisterPrometheusHandler creates a new PrometheusCollector and configures -// the provided HTTP mux to handle the given Prometheus endpoint. -func RegisterPrometheusHandler(mux httpmux.Mux, containerManager manager.Manager, prometheusEndpoint string, f metrics.ContainerLabelsFunc) { - r := prometheus.NewRegistry() - r.MustRegister( - metrics.NewPrometheusCollector(containerManager, f), - prometheus.NewGoCollector(), - prometheus.NewProcessCollector(os.Getpid(), ""), - ) - mux.Handle(prometheusEndpoint, promhttp.HandlerFor(r, promhttp.HandlerOpts{ErrorHandling: promhttp.ContinueOnError})) -} - -func staticHandlerNoAuth(w http.ResponseWriter, r *http.Request) { - static.HandleRequest(w, r.URL) -} - -func staticHandler(w http.ResponseWriter, r *auth.AuthenticatedRequest) { - static.HandleRequest(w, r.URL) -} diff --git a/vendor/github.com/google/cadvisor/http/mux/mux.go b/vendor/github.com/google/cadvisor/http/mux/mux.go deleted file mode 100644 index 791580b4..00000000 --- a/vendor/github.com/google/cadvisor/http/mux/mux.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2015 Google Inc. All Rights Reserved. -// -// 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 mux - -import ( - "net/http" -) - -// Mux interface expected by cAdvisor components. -type Mux interface { - HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) - Handler(r *http.Request) (http.Handler, string) - Handle(pattern string, handler http.Handler) -} diff --git a/vendor/github.com/google/cadvisor/info/v1/BUILD b/vendor/github.com/google/cadvisor/info/v1/BUILD index d74b9930..63113198 100644 --- a/vendor/github.com/google/cadvisor/info/v1/BUILD +++ b/vendor/github.com/google/cadvisor/info/v1/BUILD @@ -8,6 +8,7 @@ go_library( "machine.go", "metric.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/info/v1", importpath = "github.com/google/cadvisor/info/v1", visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/google/cadvisor/info/v1/container.go b/vendor/github.com/google/cadvisor/info/v1/container.go index 8d0c28e0..41f7ae53 100644 --- a/vendor/github.com/google/cadvisor/info/v1/container.go +++ b/vendor/github.com/google/cadvisor/info/v1/container.go @@ -85,8 +85,6 @@ type ContainerReference struct { // Namespace under which the aliases of a container are unique. // An example of a namespace is "docker" for Docker containers. Namespace string `json:"namespace,omitempty"` - - Labels map[string]string `json:"labels,omitempty"` } // Sorts by container name. @@ -295,10 +293,23 @@ type CpuCFS struct { ThrottledTime uint64 `json:"throttled_time"` } +// Cpu Aggregated scheduler statistics +type CpuSchedstat struct { + // https://www.kernel.org/doc/Documentation/scheduler/sched-stats.txt + + // time spent on the cpu + RunTime uint64 `json:"run_time"` + // time spent waiting on a runqueue + RunqueueTime uint64 `json:"runqueue_time"` + // # of timeslices run on this cpu + RunPeriods uint64 `json:"run_periods"` +} + // All CPU usage metrics are cumulative from the creation of the container type CpuStats struct { - Usage CpuUsage `json:"usage"` - CFS CpuCFS `json:"cfs"` + Usage CpuUsage `json:"usage"` + CFS CpuCFS `json:"cfs"` + Schedstat CpuSchedstat `json:"schedstat"` // Smoothed average of number of runnable threads x 1000. // We multiply by thousand to avoid using floats, but preserving precision. // Load is smoothed over the last 10 seconds. Instantaneous value can be read @@ -347,6 +358,9 @@ type MemoryStats struct { // Units: Bytes. Swap uint64 `json:"swap"` + // The amount of memory used for mapped files (includes tmpfs/shmem) + MappedFile uint64 `json:"mapped_file"` + // The amount of working set memory, this includes recently accessed memory, // dirty memory, and kernel memory. Working set is <= "usage". // Units: Bytes. diff --git a/vendor/github.com/google/cadvisor/info/v2/BUILD b/vendor/github.com/google/cadvisor/info/v2/BUILD index 80105f77..4a6f1175 100644 --- a/vendor/github.com/google/cadvisor/info/v2/BUILD +++ b/vendor/github.com/google/cadvisor/info/v2/BUILD @@ -7,6 +7,7 @@ go_library( "conversion.go", "machine.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/info/v2", importpath = "github.com/google/cadvisor/info/v2", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/machine/BUILD b/vendor/github.com/google/cadvisor/machine/BUILD index 3a248ed5..2e6d3c59 100644 --- a/vendor/github.com/google/cadvisor/machine/BUILD +++ b/vendor/github.com/google/cadvisor/machine/BUILD @@ -6,9 +6,11 @@ go_library( "info.go", "machine.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/machine", importpath = "github.com/google/cadvisor/machine", visibility = ["//visibility:public"], deps = [ + "//vendor/github.com/docker/docker/pkg/parsers/operatingsystem:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/fs:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/vendor/github.com/google/cadvisor/machine/info.go b/vendor/github.com/google/cadvisor/machine/info.go index be90f17e..bf4f595a 100644 --- a/vendor/github.com/google/cadvisor/machine/info.go +++ b/vendor/github.com/google/cadvisor/machine/info.go @@ -23,6 +23,7 @@ import ( "strconv" "strings" + "github.com/docker/docker/pkg/parsers/operatingsystem" "github.com/google/cadvisor/fs" info "github.com/google/cadvisor/info/v1" "github.com/google/cadvisor/utils/cloudinfo" @@ -173,20 +174,11 @@ func Info(sysFs sysfs.SysFs, fsInfo fs.FsInfo, inHostNamespace bool) (*info.Mach } func ContainerOsVersion() string { - container_os := "Unknown" - os_release, err := ioutil.ReadFile("/etc/os-release") - if err == nil { - // We might be running in a busybox or some hand-crafted image. - // It's useful to know why cadvisor didn't come up. - for _, line := range strings.Split(string(os_release), "\n") { - parsed := strings.Split(line, "\"") - if len(parsed) == 3 && parsed[0] == "PRETTY_NAME=" { - container_os = parsed[1] - break - } - } + os, err := operatingsystem.GetOperatingSystem() + if err != nil { + os = "Unknown" } - return container_os + return os } func KernelVersion() string { diff --git a/vendor/github.com/google/cadvisor/manager/BUILD b/vendor/github.com/google/cadvisor/manager/BUILD index d61c2d96..52dd2bac 100644 --- a/vendor/github.com/google/cadvisor/manager/BUILD +++ b/vendor/github.com/google/cadvisor/manager/BUILD @@ -6,6 +6,7 @@ go_library( "container.go", "manager.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager", importpath = "github.com/google/cadvisor/manager", visibility = ["//visibility:public"], deps = [ @@ -18,6 +19,7 @@ go_library( "//vendor/github.com/google/cadvisor/container/containerd:go_default_library", "//vendor/github.com/google/cadvisor/container/crio:go_default_library", "//vendor/github.com/google/cadvisor/container/docker:go_default_library", + "//vendor/github.com/google/cadvisor/container/mesos:go_default_library", "//vendor/github.com/google/cadvisor/container/raw:go_default_library", "//vendor/github.com/google/cadvisor/container/rkt:go_default_library", "//vendor/github.com/google/cadvisor/container/systemd:go_default_library", @@ -35,6 +37,7 @@ go_library( "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library", "//vendor/github.com/google/cadvisor/version:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", + "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/utils/clock:go_default_library", ], ) diff --git a/vendor/github.com/google/cadvisor/manager/container.go b/vendor/github.com/google/cadvisor/manager/container.go index 8193bb5e..295479f0 100644 --- a/vendor/github.com/google/cadvisor/manager/container.go +++ b/vendor/github.com/google/cadvisor/manager/container.go @@ -504,7 +504,7 @@ func (c *containerData) housekeepingTick(timer <-chan time.Time, longHousekeepin err := c.updateStats() if err != nil { if c.allowErrorLogging() { - glog.Warning("Failed to update stats for container \"%s\": %s", c.info.Name, err) + glog.Warningf("Failed to update stats for container \"%s\": %s", c.info.Name, err) } } // Log if housekeeping took too long. @@ -615,7 +615,12 @@ func (c *containerData) updateStats() error { } return err } - err = c.memoryCache.AddStats(ref, stats) + + cInfo := info.ContainerInfo{ + ContainerReference: ref, + } + + err = c.memoryCache.AddStats(&cInfo, stats) if err != nil { return err } diff --git a/vendor/github.com/google/cadvisor/manager/manager.go b/vendor/github.com/google/cadvisor/manager/manager.go index 08955833..0fb6d5dc 100644 --- a/vendor/github.com/google/cadvisor/manager/manager.go +++ b/vendor/github.com/google/cadvisor/manager/manager.go @@ -33,6 +33,7 @@ import ( "github.com/google/cadvisor/container/containerd" "github.com/google/cadvisor/container/crio" "github.com/google/cadvisor/container/docker" + "github.com/google/cadvisor/container/mesos" "github.com/google/cadvisor/container/raw" "github.com/google/cadvisor/container/rkt" "github.com/google/cadvisor/container/systemd" @@ -50,6 +51,7 @@ import ( "github.com/golang/glog" "github.com/opencontainers/runc/libcontainer/cgroups" + "golang.org/x/net/context" "k8s.io/utils/clock" ) @@ -59,6 +61,8 @@ var eventStorageAgeLimit = flag.String("event_storage_age_limit", "default=24h", var eventStorageEventLimit = flag.String("event_storage_event_limit", "default=100000", "Max number of events to store (per type). Value is a comma separated list of key values, where the keys are event types (e.g.: creation, oom) or \"default\" and the value is an integer. Default is applied to all non-specified event types") var applicationMetricsCountLimit = flag.Int("application_metrics_count_limit", 100, "Max number of application metrics to store (per container)") +const dockerClientTimeout = 10 * time.Second + // The Manager interface defines operations for starting a manager and getting // container and machine information. type Manager interface { @@ -138,7 +142,7 @@ type Manager interface { } // New takes a memory storage and returns a new manager. -func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingInterval time.Duration, allowDynamicHousekeeping bool, ignoreMetricsSet container.MetricSet, collectorHttpClient *http.Client) (Manager, error) { +func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingInterval time.Duration, allowDynamicHousekeeping bool, includedMetricsSet container.MetricSet, collectorHttpClient *http.Client, rawContainerCgroupPathPrefixWhiteList []string) (Manager, error) { if memoryCache == nil { return nil, fmt.Errorf("manager requires memory storage") } @@ -154,11 +158,10 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn dockerStatus info.DockerStatus rktPath string ) - if tempDockerStatus, err := docker.Status(); err != nil { - glog.V(5).Infof("Docker not connected: %v", err) - } else { - dockerStatus = tempDockerStatus - } + docker.SetTimeout(dockerClientTimeout) + // Try to connect to docker indefinitely on startup. + dockerStatus = retryDockerStatus() + if tmpRktPath, err := rkt.RktPath(); err != nil { glog.V(5).Infof("Rkt not connected: %v", err) } else { @@ -201,20 +204,21 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn eventsChannel := make(chan watcher.ContainerEvent, 16) newManager := &manager{ - containers: make(map[namespacedContainerName]*containerData), - quitChannels: make([]chan error, 0, 2), - memoryCache: memoryCache, - fsInfo: fsInfo, - cadvisorContainer: selfContainer, - inHostNamespace: inHostNamespace, - startupTime: time.Now(), - maxHousekeepingInterval: maxHousekeepingInterval, - allowDynamicHousekeeping: allowDynamicHousekeeping, - ignoreMetrics: ignoreMetricsSet, - containerWatchers: []watcher.ContainerWatcher{}, - eventsChannel: eventsChannel, - collectorHttpClient: collectorHttpClient, - nvidiaManager: &accelerators.NvidiaManager{}, + containers: make(map[namespacedContainerName]*containerData), + quitChannels: make([]chan error, 0, 2), + memoryCache: memoryCache, + fsInfo: fsInfo, + cadvisorContainer: selfContainer, + inHostNamespace: inHostNamespace, + startupTime: time.Now(), + maxHousekeepingInterval: maxHousekeepingInterval, + allowDynamicHousekeeping: allowDynamicHousekeeping, + includedMetrics: includedMetricsSet, + containerWatchers: []watcher.ContainerWatcher{}, + eventsChannel: eventsChannel, + collectorHttpClient: collectorHttpClient, + nvidiaManager: &accelerators.NvidiaManager{}, + rawContainerCgroupPathPrefixWhiteList: rawContainerCgroupPathPrefixWhiteList, } machineInfo, err := machine.Info(sysfs, fsInfo, inHostNamespace) @@ -234,6 +238,31 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn return newManager, nil } +func retryDockerStatus() info.DockerStatus { + startupTimeout := dockerClientTimeout + maxTimeout := 4 * startupTimeout + for { + ctx, _ := context.WithTimeout(context.Background(), startupTimeout) + dockerStatus, err := docker.StatusWithContext(ctx) + if err == nil { + return dockerStatus + } + + switch err { + case context.DeadlineExceeded: + glog.Warningf("Timeout trying to communicate with docker during initialization, will retry") + default: + glog.V(5).Infof("Docker not connected: %v", err) + return info.DockerStatus{} + } + + startupTimeout = 2 * startupTimeout + if startupTimeout > maxTimeout { + startupTimeout = maxTimeout + } + } +} + // A namespaced container name. type namespacedContainerName struct { // The namespace of the container. Can be empty for the root namespace. @@ -256,21 +285,23 @@ type manager struct { startupTime time.Time maxHousekeepingInterval time.Duration allowDynamicHousekeeping bool - ignoreMetrics container.MetricSet + includedMetrics container.MetricSet containerWatchers []watcher.ContainerWatcher eventsChannel chan watcher.ContainerEvent collectorHttpClient *http.Client nvidiaManager accelerators.AcceleratorManager + // List of raw container cgroup path prefix whitelist. + rawContainerCgroupPathPrefixWhiteList []string } // Start the container manager. func (self *manager) Start() error { - err := docker.Register(self, self.fsInfo, self.ignoreMetrics) + err := docker.Register(self, self.fsInfo, self.includedMetrics) if err != nil { glog.V(5).Infof("Registration of the Docker container factory failed: %v.", err) } - err = rkt.Register(self, self.fsInfo, self.ignoreMetrics) + err = rkt.Register(self, self.fsInfo, self.includedMetrics) if err != nil { glog.V(5).Infof("Registration of the rkt container factory failed: %v", err) } else { @@ -281,22 +312,27 @@ func (self *manager) Start() error { self.containerWatchers = append(self.containerWatchers, watcher) } - err = containerd.Register(self, self.fsInfo, self.ignoreMetrics) + err = containerd.Register(self, self.fsInfo, self.includedMetrics) if err != nil { glog.V(5).Infof("Registration of the containerd container factory failed: %v", err) } - err = crio.Register(self, self.fsInfo, self.ignoreMetrics) + err = crio.Register(self, self.fsInfo, self.includedMetrics) if err != nil { glog.V(5).Infof("Registration of the crio container factory failed: %v", err) } - err = systemd.Register(self, self.fsInfo, self.ignoreMetrics) + err = mesos.Register(self, self.fsInfo, self.includedMetrics) + if err != nil { + glog.V(5).Infof("Registration of the mesos container factory failed: %v", err) + } + + err = systemd.Register(self, self.fsInfo, self.includedMetrics) if err != nil { glog.V(5).Infof("Registration of the systemd container factory failed: %v", err) } - err = raw.Register(self, self.fsInfo, self.ignoreMetrics) + err = raw.Register(self, self.fsInfo, self.includedMetrics, self.rawContainerCgroupPathPrefixWhiteList) if err != nil { glog.Errorf("Registration of the raw container factory failed: %v", err) } @@ -592,6 +628,11 @@ func (self *manager) AllDockerContainers(query *info.ContainerInfoRequest) (map[ for name, cont := range containers { inf, err := self.containerDataToContainerInfo(cont, query) if err != nil { + // Ignore the error because of race condition and return best-effort result. + if err == memory.ErrDataNotFound { + glog.Warningf("Error getting data for container %s because of race condition", name) + continue + } return nil, err } output[name] = *inf @@ -1045,22 +1086,25 @@ func (m *manager) destroyContainerLocked(containerName string) error { // Detect all containers that have been added or deleted from the specified container. func (m *manager) getContainersDiff(containerName string) (added []info.ContainerReference, removed []info.ContainerReference, err error) { - m.containersLock.RLock() - defer m.containersLock.RUnlock() - // Get all subcontainers recursively. + m.containersLock.RLock() cont, ok := m.containers[namespacedContainerName{ Name: containerName, }] + m.containersLock.RUnlock() if !ok { return nil, nil, fmt.Errorf("failed to find container %q while checking for new containers", containerName) } allContainers, err := cont.handler.ListContainers(container.ListRecursive) + if err != nil { return nil, nil, err } allContainers = append(allContainers, info.ContainerReference{Name: containerName}) + m.containersLock.RLock() + defer m.containersLock.RUnlock() + // Determine which were added and which were removed. allContainersSet := make(map[string]*containerData) for name, d := range m.containers { diff --git a/vendor/github.com/google/cadvisor/manager/watcher/BUILD b/vendor/github.com/google/cadvisor/manager/watcher/BUILD index f78aa25a..4efb5694 100644 --- a/vendor/github.com/google/cadvisor/manager/watcher/BUILD +++ b/vendor/github.com/google/cadvisor/manager/watcher/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["watcher.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager/watcher", importpath = "github.com/google/cadvisor/manager/watcher", visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD b/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD index 0604f91a..613a5693 100644 --- a/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD +++ b/vendor/github.com/google/cadvisor/manager/watcher/raw/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["raw.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager/watcher/raw", importpath = "github.com/google/cadvisor/manager/watcher/raw", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/manager/watcher/raw/raw.go b/vendor/github.com/google/cadvisor/manager/watcher/raw/raw.go index 103fa887..5a8b79d3 100644 --- a/vendor/github.com/google/cadvisor/manager/watcher/raw/raw.go +++ b/vendor/github.com/google/cadvisor/manager/watcher/raw/raw.go @@ -71,7 +71,7 @@ func NewRawContainerWatcher() (watcher.ContainerWatcher, error) { func (self *rawContainerWatcher) Start(events chan watcher.ContainerEvent) error { // Watch this container (all its cgroups) and all subdirectories. for _, cgroupPath := range self.cgroupPaths { - _, err := self.watchDirectory(cgroupPath, "/") + _, err := self.watchDirectory(events, cgroupPath, "/") if err != nil { return err } @@ -109,7 +109,12 @@ func (self *rawContainerWatcher) Stop() error { // Watches the specified directory and all subdirectories. Returns whether the path was // already being watched and an error (if any). -func (self *rawContainerWatcher) watchDirectory(dir string, containerName string) (bool, error) { +func (self *rawContainerWatcher) watchDirectory(events chan watcher.ContainerEvent, dir string, containerName string) (bool, error) { + // Don't watch .mount cgroups because they never have containers as sub-cgroups. A single container + // can have many .mount cgroups associated with it which can quickly exhaust the inotify watches on a node. + if strings.HasSuffix(containerName, ".mount") { + return false, nil + } alreadyWatching, err := self.watcher.AddWatch(containerName, dir) if err != nil { return alreadyWatching, err @@ -135,7 +140,8 @@ func (self *rawContainerWatcher) watchDirectory(dir string, containerName string for _, entry := range entries { if entry.IsDir() { entryPath := path.Join(dir, entry.Name()) - _, err = self.watchDirectory(entryPath, path.Join(containerName, entry.Name())) + subcontainerName := path.Join(containerName, entry.Name()) + alreadyWatchingSubDir, err := self.watchDirectory(events, entryPath, subcontainerName) if err != nil { glog.Errorf("Failed to watch directory %q: %v", entryPath, err) if os.IsNotExist(err) { @@ -145,6 +151,16 @@ func (self *rawContainerWatcher) watchDirectory(dir string, containerName string } return alreadyWatching, err } + // since we already missed the creation event for this directory, publish an event here. + if !alreadyWatchingSubDir { + go func() { + events <- watcher.ContainerEvent{ + EventType: watcher.ContainerAdd, + Name: subcontainerName, + WatchSource: watcher.Raw, + } + }() + } } } @@ -186,7 +202,7 @@ func (self *rawContainerWatcher) processEvent(event *inotify.Event, events chan switch eventType { case watcher.ContainerAdd: // New container was created, watch it. - alreadyWatched, err := self.watchDirectory(event.Name, containerName) + alreadyWatched, err := self.watchDirectory(events, event.Name, containerName) if err != nil { return err } diff --git a/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD b/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD index 2106185b..a638993c 100644 --- a/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD +++ b/vendor/github.com/google/cadvisor/manager/watcher/rkt/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["rkt.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager/watcher/rkt", importpath = "github.com/google/cadvisor/manager/watcher/rkt", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/metrics/BUILD b/vendor/github.com/google/cadvisor/metrics/BUILD index a9b327cd..3644234e 100644 --- a/vendor/github.com/google/cadvisor/metrics/BUILD +++ b/vendor/github.com/google/cadvisor/metrics/BUILD @@ -3,10 +3,12 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["prometheus.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/metrics", importpath = "github.com/google/cadvisor/metrics", visibility = ["//visibility:public"], deps = [ "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/google/cadvisor/container:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", ], diff --git a/vendor/github.com/google/cadvisor/metrics/prometheus.go b/vendor/github.com/google/cadvisor/metrics/prometheus.go index 2dd7747b..9ff94502 100644 --- a/vendor/github.com/google/cadvisor/metrics/prometheus.go +++ b/vendor/github.com/google/cadvisor/metrics/prometheus.go @@ -19,6 +19,7 @@ import ( "regexp" "time" + "github.com/google/cadvisor/container" info "github.com/google/cadvisor/info/v1" "github.com/golang/glog" @@ -114,7 +115,7 @@ type PrometheusCollector struct { // ContainerLabelsFunc specifies which base labels will be attached to all // exported metrics. If left to nil, the DefaultContainerLabels function // will be used instead. -func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCollector { +func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc, includedMetrics container.MetricSet) *PrometheusCollector { if f == nil { f = DefaultContainerLabels } @@ -134,7 +135,12 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo getValues: func(s *info.ContainerStats) metricValues { return metricValues{{value: float64(time.Now().Unix())}} }, - }, { + }, + }, + } + if includedMetrics.Has(container.CpuUsageMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_cpu_user_seconds_total", help: "Cumulative user cpu time consumed in seconds.", valueType: prometheus.CounterValue, @@ -150,10 +156,18 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo }, }, { name: "container_cpu_usage_seconds_total", - help: "Cumulative cpu time consumed per cpu in seconds.", + help: "Cumulative cpu time consumed in seconds.", valueType: prometheus.CounterValue, extraLabels: []string{"cpu"}, getValues: func(s *info.ContainerStats) metricValues { + if len(s.Cpu.Usage.PerCpu) == 0 { + if s.Cpu.Usage.Total > 0 { + return metricValues{{ + value: float64(s.Cpu.Usage.Total) / float64(time.Second), + labels: []string{"total"}, + }} + } + } values := make(metricValues, 0, len(s.Cpu.Usage.PerCpu)) for i, value := range s.Cpu.Usage.PerCpu { if value > 0 { @@ -189,7 +203,38 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo getValues: func(s *info.ContainerStats) metricValues { return metricValues{{value: float64(s.Cpu.CFS.ThrottledTime) / float64(time.Second)}} }, + }, + }...) + } + if includedMetrics.Has(container.ProcessSchedulerMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { + name: "container_cpu_schedstat_run_seconds_total", + help: "Time duration the processes of the container have run on the CPU.", + valueType: prometheus.CounterValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{{value: float64(s.Cpu.Schedstat.RunTime) / float64(time.Second)}} + }, }, { + name: "container_cpu_schedstat_runqueue_seconds_total", + help: "Time duration processes of the container have been waiting on a runqueue.", + valueType: prometheus.CounterValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{{value: float64(s.Cpu.Schedstat.RunqueueTime) / float64(time.Second)}} + }, + }, { + name: "container_cpu_schedstat_run_periods_total", + help: "Number of times processes of the cgroup have run on the cpu", + valueType: prometheus.CounterValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{{value: float64(s.Cpu.Schedstat.RunPeriods)}} + }, + }, + }...) + } + if includedMetrics.Has(container.CpuLoadMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_cpu_load_average_10s", help: "Value of container cpu load average over the last 10 seconds.", valueType: prometheus.GaugeValue, @@ -197,6 +242,40 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo return metricValues{{value: float64(s.Cpu.LoadAverage)}} }, }, { + name: "container_tasks_state", + help: "Number of tasks in given state", + extraLabels: []string{"state"}, + valueType: prometheus.GaugeValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{ + { + value: float64(s.TaskStats.NrSleeping), + labels: []string{"sleeping"}, + }, + { + value: float64(s.TaskStats.NrRunning), + labels: []string{"running"}, + }, + { + value: float64(s.TaskStats.NrStopped), + labels: []string{"stopped"}, + }, + { + value: float64(s.TaskStats.NrUninterruptible), + labels: []string{"uninterruptible"}, + }, + { + value: float64(s.TaskStats.NrIoWait), + labels: []string{"iowaiting"}, + }, + } + }, + }, + }...) + } + if includedMetrics.Has(container.MemoryUsageMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_memory_cache", help: "Number of bytes of page cache memory.", valueType: prometheus.GaugeValue, @@ -210,6 +289,13 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo getValues: func(s *info.ContainerStats) metricValues { return metricValues{{value: float64(s.Memory.RSS)}} }, + }, { + name: "container_memory_mapped_file", + help: "Size of memory mapped files in bytes.", + valueType: prometheus.GaugeValue, + getValues: func(s *info.ContainerStats) metricValues { + return metricValues{{value: float64(s.Memory.MappedFile)}} + }, }, { name: "container_memory_swap", help: "Container swap usage in bytes.", @@ -271,7 +357,12 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo }, } }, - }, { + }, + }...) + } + if includedMetrics.Has(container.AcceleratorUsageMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_accelerator_memory_total_bytes", help: "Total accelerator memory.", valueType: prometheus.GaugeValue, @@ -316,7 +407,12 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo } return values }, - }, { + }, + }...) + } + if includedMetrics.Has(container.DiskUsageMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_fs_inodes_free", help: "Number of available Inodes", valueType: prometheus.GaugeValue, @@ -356,7 +452,12 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo return float64(fs.Usage) }) }, - }, { + }, + }...) + } + if includedMetrics.Has(container.DiskIOMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_fs_reads_bytes_total", help: "Cumulative count of bytes read", valueType: prometheus.CounterValue, @@ -518,7 +619,12 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo return float64(fs.WeightedIoTime) / float64(time.Second) }) }, - }, { + }, + }...) + } + if includedMetrics.Has(container.NetworkUsageMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_network_receive_bytes_total", help: "Cumulative count of bytes received", valueType: prometheus.CounterValue, @@ -638,7 +744,12 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo } return values }, - }, { + }, + }...) + } + if includedMetrics.Has(container.NetworkTcpUsageMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_network_tcp_usage_total", help: "tcp connection usage statistic for container", valueType: prometheus.GaugeValue, @@ -691,7 +802,12 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo }, } }, - }, { + }, + }...) + } + if includedMetrics.Has(container.NetworkUdpUsageMetrics) { + c.containerMetrics = append(c.containerMetrics, []containerMetric{ + { name: "container_network_udp_usage_total", help: "udp connection usage statistic for container", valueType: prometheus.GaugeValue, @@ -716,37 +832,8 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo }, } }, - }, { - name: "container_tasks_state", - help: "Number of tasks in given state", - extraLabels: []string{"state"}, - valueType: prometheus.GaugeValue, - getValues: func(s *info.ContainerStats) metricValues { - return metricValues{ - { - value: float64(s.TaskStats.NrSleeping), - labels: []string{"sleeping"}, - }, - { - value: float64(s.TaskStats.NrRunning), - labels: []string{"running"}, - }, - { - value: float64(s.TaskStats.NrStopped), - labels: []string{"stopped"}, - }, - { - value: float64(s.TaskStats.NrUninterruptible), - labels: []string{"uninterruptible"}, - }, - { - value: float64(s.TaskStats.NrIoWait), - labels: []string{"iowaiting"}, - }, - } - }, }, - }, + }...) } return c @@ -813,6 +900,19 @@ func DefaultContainerLabels(container *info.ContainerInfo) map[string]string { return set } +// BaseContainerLabels implements ContainerLabelsFunc. It only exports the +// container name, first alias, and image name. +func BaseContainerLabels(container *info.ContainerInfo) map[string]string { + set := map[string]string{LabelID: container.Name} + if len(container.Aliases) > 0 { + set[LabelName] = container.Aliases[0] + } + if image := container.Spec.Image; len(image) > 0 { + set[LabelImage] = image + } + return set +} + func (c *PrometheusCollector) collectContainersInfo(ch chan<- prometheus.Metric) { containers, err := c.infoProvider.SubcontainersInfo("/", &info.ContainerInfoRequest{NumStats: 1}) if err != nil { @@ -860,6 +960,9 @@ func (c *PrometheusCollector) collectContainersInfo(ch chan<- prometheus.Metric) } // Now for the actual metrics + if len(container.Stats) == 0 { + continue + } stats := container.Stats[0] for _, cm := range c.containerMetrics { if cm.condition != nil && !cm.condition(container.Spec) { diff --git a/vendor/github.com/google/cadvisor/pages/BUILD b/vendor/github.com/google/cadvisor/pages/BUILD deleted file mode 100644 index 885c8bf1..00000000 --- a/vendor/github.com/google/cadvisor/pages/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "containers.go", - "docker.go", - "pages.go", - "templates.go", - ], - importpath = "github.com/google/cadvisor/pages", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/abbot/go-http-auth:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/container/docker:go_default_library", - "//vendor/github.com/google/cadvisor/http/mux:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/github.com/google/cadvisor/pages/static:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/google/cadvisor/pages/containers.go b/vendor/github.com/google/cadvisor/pages/containers.go deleted file mode 100644 index 8f298152..00000000 --- a/vendor/github.com/google/cadvisor/pages/containers.go +++ /dev/null @@ -1,253 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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. - -// Page for /containers/ -package pages - -import ( - "fmt" - "html/template" - "net/http" - "net/url" - "path" - "strconv" - "strings" - "time" - - info "github.com/google/cadvisor/info/v1" - "github.com/google/cadvisor/manager" - - "github.com/golang/glog" -) - -const ContainersPage = "/containers/" - -// from http://golang.org/doc/effective_go.html#constants -type ByteSize float64 - -const ( - _ = iota - // KB - kilobyte - KB ByteSize = 1 << (10 * iota) - // MB - megabyte - MB - // GB - gigabyte - GB - // TB - terabyte - TB - // PB - petabyte - PB - // EB - exabyte - EB - // ZB - zettabyte - ZB - // YB - yottabyte - YB -) - -func (b ByteSize) Size() string { - for _, i := range [...]ByteSize{YB, ZB, EB, PB, TB, GB, MB, KB} { - if b >= i { - return fmt.Sprintf("%.2f", b/i) - } - } - return fmt.Sprintf("%.2f", b) -} - -func (b ByteSize) Unit() string { - switch { - case b >= YB: - return "YB" - case b >= ZB: - return "ZB" - case b >= EB: - return "EB" - case b >= PB: - return "PB" - case b >= TB: - return "TB" - case b >= GB: - return "GB" - case b >= MB: - return "MB" - case b >= KB: - return "KB" - } - return "B" -} - -var funcMap = template.FuncMap{ - "printMask": printMask, - "printCores": printCores, - "printShares": printShares, - "printSize": printSize, - "printUnit": printUnit, -} - -func printMask(mask string, numCores int) interface{} { - masks := make([]string, numCores) - activeCores := getActiveCores(mask) - for i := 0; i < numCores; i++ { - coreClass := "inactive-cpu" - if activeCores[i] { - coreClass = "active-cpu" - } - masks[i] = fmt.Sprintf("%d", coreClass, i) - } - return template.HTML(strings.Join(masks, " ")) -} - -func getActiveCores(mask string) map[int]bool { - activeCores := make(map[int]bool) - for _, corebits := range strings.Split(mask, ",") { - cores := strings.Split(corebits, "-") - if len(cores) == 1 { - index, err := strconv.Atoi(cores[0]) - if err != nil { - // Ignore malformed strings. - continue - } - activeCores[index] = true - } else if len(cores) == 2 { - start, err := strconv.Atoi(cores[0]) - if err != nil { - continue - } - end, err := strconv.Atoi(cores[1]) - if err != nil { - continue - } - for i := start; i <= end; i++ { - activeCores[i] = true - } - } - } - return activeCores -} - -func printCores(millicores *uint64) string { - cores := float64(*millicores) / 1000 - return strconv.FormatFloat(cores, 'f', 3, 64) -} - -func printShares(shares *uint64) string { - return fmt.Sprintf("%d", *shares) -} - -// Size after which we consider memory to be "unlimited". This is not -// MaxInt64 due to rounding by the kernel. -const maxMemorySize = uint64(1 << 62) - -func printSize(bytes uint64) string { - if bytes >= maxMemorySize { - return "unlimited" - } - return ByteSize(bytes).Size() -} - -func printUnit(bytes uint64) string { - if bytes >= maxMemorySize { - return "" - } - return ByteSize(bytes).Unit() -} - -func serveContainersPage(m manager.Manager, w http.ResponseWriter, u *url.URL) { - start := time.Now() - - // The container name is the path after the handler - containerName := u.Path[len(ContainersPage)-1:] - - // Get the container. - reqParams := info.ContainerInfoRequest{ - NumStats: 60, - } - cont, err := m.GetContainerInfo(containerName, &reqParams) - if err != nil { - http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound) - return - } - displayName := getContainerDisplayName(cont.ContainerReference) - - // Get the MachineInfo - machineInfo, err := m.GetMachineInfo() - if err != nil { - http.Error(w, fmt.Sprintf("failed to get machine info: %v", err), http.StatusInternalServerError) - return - } - - rootDir := getRootDir(containerName) - - // Make a list of the parent containers and their links - pathParts := strings.Split(string(cont.Name), "/") - parentContainers := make([]link, 0, len(pathParts)) - parentContainers = append(parentContainers, link{ - Text: "root", - Link: path.Join(rootDir, ContainersPage), - }) - for i := 1; i < len(pathParts); i++ { - // Skip empty parts. - if pathParts[i] == "" { - continue - } - parentContainers = append(parentContainers, link{ - Text: pathParts[i], - Link: path.Join(rootDir, ContainersPage, path.Join(pathParts[1:i+1]...)), - }) - } - - // Build the links for the subcontainers. - subcontainerLinks := make([]link, 0, len(cont.Subcontainers)) - for _, sub := range cont.Subcontainers { - if !m.Exists(sub.Name) { - continue - } - subcontainerLinks = append(subcontainerLinks, link{ - Text: getContainerDisplayName(sub), - Link: path.Join(rootDir, ContainersPage, sub.Name), - }) - } - - data := &pageData{ - DisplayName: displayName, - ContainerName: escapeContainerName(cont.Name), - ParentContainers: parentContainers, - Subcontainers: subcontainerLinks, - Spec: cont.Spec, - Stats: cont.Stats, - MachineInfo: machineInfo, - IsRoot: cont.Name == "/", - ResourcesAvailable: cont.Spec.HasCpu || cont.Spec.HasMemory || cont.Spec.HasNetwork || cont.Spec.HasFilesystem, - CpuAvailable: cont.Spec.HasCpu, - MemoryAvailable: cont.Spec.HasMemory, - NetworkAvailable: cont.Spec.HasNetwork, - FsAvailable: cont.Spec.HasFilesystem, - CustomMetricsAvailable: cont.Spec.HasCustomMetrics, - SubcontainersAvailable: len(subcontainerLinks) > 0, - Root: rootDir, - } - err = pageTemplate.Execute(w, data) - if err != nil { - glog.Errorf("Failed to apply template: %s", err) - } - - glog.V(5).Infof("Request took %s", time.Since(start)) -} - -// Build a relative path to the root of the container page. -func getRootDir(containerName string) string { - // The root is at: container depth - levels := (strings.Count(containerName, "/")) - return strings.Repeat("../", levels) -} diff --git a/vendor/github.com/google/cadvisor/pages/docker.go b/vendor/github.com/google/cadvisor/pages/docker.go deleted file mode 100644 index 4fb2f6bc..00000000 --- a/vendor/github.com/google/cadvisor/pages/docker.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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 pages - -import ( - "fmt" - "net/http" - "net/url" - "path" - "strconv" - "time" - - "github.com/google/cadvisor/container/docker" - info "github.com/google/cadvisor/info/v1" - "github.com/google/cadvisor/manager" - - "github.com/golang/glog" -) - -const DockerPage = "/docker/" - -func toStatusKV(status info.DockerStatus) ([]keyVal, []keyVal) { - ds := []keyVal{ - {Key: "Driver", Value: status.Driver}, - } - for k, v := range status.DriverStatus { - ds = append(ds, keyVal{Key: k, Value: v}) - } - return []keyVal{ - {Key: "Docker Version", Value: status.Version}, - {Key: "Docker API Version", Value: status.APIVersion}, - {Key: "Kernel Version", Value: status.KernelVersion}, - {Key: "OS Version", Value: status.OS}, - {Key: "Host Name", Value: status.Hostname}, - {Key: "Docker Root Directory", Value: status.RootDir}, - {Key: "Execution Driver", Value: status.ExecDriver}, - {Key: "Number of Images", Value: strconv.Itoa(status.NumImages)}, - {Key: "Number of Containers", Value: strconv.Itoa(status.NumContainers)}, - }, ds -} - -func serveDockerPage(m manager.Manager, w http.ResponseWriter, u *url.URL) { - start := time.Now() - - // The container name is the path after the handler - containerName := u.Path[len(DockerPage)-1:] - rootDir := getRootDir(containerName) - - var data *pageData - if containerName == "/" { - // Get the containers. - reqParams := info.ContainerInfoRequest{ - NumStats: 0, - } - conts, err := m.AllDockerContainers(&reqParams) - if err != nil { - http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound) - return - } - subcontainers := make([]link, 0, len(conts)) - for _, cont := range conts { - subcontainers = append(subcontainers, link{ - Text: getContainerDisplayName(cont.ContainerReference), - Link: path.Join(rootDir, DockerPage, docker.ContainerNameToDockerId(cont.ContainerReference.Name)), - }) - } - - // Get Docker status - status, err := m.DockerInfo() - if err != nil { - http.Error(w, fmt.Sprintf("failed to get docker info: %v", err), http.StatusInternalServerError) - return - } - - dockerStatus, driverStatus := toStatusKV(status) - // Get Docker Images - images, err := m.DockerImages() - if err != nil { - http.Error(w, fmt.Sprintf("failed to get docker images: %v", err), http.StatusInternalServerError) - return - } - - dockerContainersText := "Docker Containers" - data = &pageData{ - DisplayName: dockerContainersText, - ParentContainers: []link{ - { - Text: dockerContainersText, - Link: path.Join(rootDir, DockerPage), - }}, - Subcontainers: subcontainers, - Root: rootDir, - DockerStatus: dockerStatus, - DockerDriverStatus: driverStatus, - DockerImages: images, - } - } else { - // Get the container. - reqParams := info.ContainerInfoRequest{ - NumStats: 60, - } - cont, err := m.DockerContainer(containerName[1:], &reqParams) - if err != nil { - http.Error(w, fmt.Sprintf("failed to get container %q with error: %v", containerName, err), http.StatusNotFound) - return - } - displayName := getContainerDisplayName(cont.ContainerReference) - - // Make a list of the parent containers and their links - var parentContainers []link - parentContainers = append(parentContainers, link{ - Text: "Docker Containers", - Link: path.Join(rootDir, DockerPage), - }) - parentContainers = append(parentContainers, link{ - Text: displayName, - Link: path.Join(rootDir, DockerPage, docker.ContainerNameToDockerId(cont.Name)), - }) - - // Get the MachineInfo - machineInfo, err := m.GetMachineInfo() - if err != nil { - http.Error(w, fmt.Sprintf("failed to get machine info: %v", err), http.StatusInternalServerError) - return - } - data = &pageData{ - DisplayName: displayName, - ContainerName: escapeContainerName(cont.Name), - ParentContainers: parentContainers, - Spec: cont.Spec, - Stats: cont.Stats, - MachineInfo: machineInfo, - ResourcesAvailable: cont.Spec.HasCpu || cont.Spec.HasMemory || cont.Spec.HasNetwork, - CpuAvailable: cont.Spec.HasCpu, - MemoryAvailable: cont.Spec.HasMemory, - NetworkAvailable: cont.Spec.HasNetwork, - FsAvailable: cont.Spec.HasFilesystem, - CustomMetricsAvailable: cont.Spec.HasCustomMetrics, - Root: rootDir, - } - } - - err := pageTemplate.Execute(w, data) - if err != nil { - glog.Errorf("Failed to apply template: %s", err) - } - - glog.V(5).Infof("Request took %s", time.Since(start)) - return -} diff --git a/vendor/github.com/google/cadvisor/pages/pages.go b/vendor/github.com/google/cadvisor/pages/pages.go deleted file mode 100644 index 7568b2ac..00000000 --- a/vendor/github.com/google/cadvisor/pages/pages.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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 pages - -import ( - "fmt" - "html/template" - "net/http" - "net/url" - "strings" - - httpmux "github.com/google/cadvisor/http/mux" - info "github.com/google/cadvisor/info/v1" - "github.com/google/cadvisor/manager" - - auth "github.com/abbot/go-http-auth" - "github.com/golang/glog" -) - -var pageTemplate *template.Template - -type link struct { - // Text to show in the link. - Text string - - // Web address to link to. - Link string -} - -type keyVal struct { - Key string - Value string -} - -type pageData struct { - DisplayName string - ContainerName string - ParentContainers []link - Subcontainers []link - Spec info.ContainerSpec - Stats []*info.ContainerStats - MachineInfo *info.MachineInfo - IsRoot bool - ResourcesAvailable bool - CpuAvailable bool - MemoryAvailable bool - NetworkAvailable bool - FsAvailable bool - CustomMetricsAvailable bool - SubcontainersAvailable bool - Root string - DockerStatus []keyVal - DockerDriverStatus []keyVal - DockerImages []info.DockerImage -} - -func init() { - containersHtmlTemplate, _ := Asset("pages/assets/html/containers.html") - pageTemplate = template.New("containersTemplate").Funcs(funcMap) - _, err := pageTemplate.Parse(string(containersHtmlTemplate)) - if err != nil { - glog.Fatalf("Failed to parse template: %s", err) - } -} - -func containerHandlerNoAuth(containerManager manager.Manager) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - serveContainersPage(containerManager, w, r.URL) - } -} - -func containerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFunc { - return func(w http.ResponseWriter, r *auth.AuthenticatedRequest) { - serveContainersPage(containerManager, w, r.URL) - } -} - -func dockerHandlerNoAuth(containerManager manager.Manager) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - serveDockerPage(containerManager, w, r.URL) - } -} - -func dockerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFunc { - return func(w http.ResponseWriter, r *auth.AuthenticatedRequest) { - serveDockerPage(containerManager, w, r.URL) - } -} - -// Register http handlers -func RegisterHandlersDigest(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.DigestAuth) error { - // Register the handler for the containers page. - if authenticator != nil { - mux.HandleFunc(ContainersPage, authenticator.Wrap(containerHandler(containerManager))) - mux.HandleFunc(DockerPage, authenticator.Wrap(dockerHandler(containerManager))) - } else { - mux.HandleFunc(ContainersPage, containerHandlerNoAuth(containerManager)) - mux.HandleFunc(DockerPage, dockerHandlerNoAuth(containerManager)) - } - return nil -} - -func RegisterHandlersBasic(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.BasicAuth) error { - // Register the handler for the containers and docker age. - if authenticator != nil { - mux.HandleFunc(ContainersPage, authenticator.Wrap(containerHandler(containerManager))) - mux.HandleFunc(DockerPage, authenticator.Wrap(dockerHandler(containerManager))) - } else { - mux.HandleFunc(ContainersPage, containerHandlerNoAuth(containerManager)) - mux.HandleFunc(DockerPage, dockerHandlerNoAuth(containerManager)) - } - return nil -} - -func getContainerDisplayName(cont info.ContainerReference) string { - // Pick a user-added alias as display name. - displayName := "" - for _, alias := range cont.Aliases { - // ignore container id as alias. - if strings.Contains(cont.Name, alias) { - continue - } - // pick shortest display name if multiple aliases are available. - if displayName == "" || len(displayName) >= len(alias) { - displayName = alias - } - } - - if displayName == "" { - displayName = cont.Name - } else if len(displayName) > 50 { - // truncate display name to fit in one line. - displayName = displayName[:50] + "..." - } - - // Add the full container name to the display name. - if displayName != cont.Name { - displayName = fmt.Sprintf("%s (%s)", displayName, cont.Name) - } - - return displayName -} - -// Escape the non-path characters on a container name. -func escapeContainerName(containerName string) string { - parts := strings.Split(containerName, "/") - for i := range parts { - parts[i] = url.QueryEscape(parts[i]) - } - return strings.Join(parts, "/") -} diff --git a/vendor/github.com/google/cadvisor/pages/static/assets.go b/vendor/github.com/google/cadvisor/pages/static/assets.go deleted file mode 100644 index 156737f2..00000000 --- a/vendor/github.com/google/cadvisor/pages/static/assets.go +++ /dev/null @@ -1,442 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// 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. -// generated by build/assets.sh; DO NOT EDIT - -// Code generated by go-bindata. -// sources: -// pages/assets/js/bootstrap-4.0.0-beta.2.min.js -// pages/assets/js/containers.js -// pages/assets/js/gcharts.js -// pages/assets/js/google-jsapi.js -// pages/assets/js/jquery-3.0.0.min.js -// pages/assets/js/popper.min.js -// pages/assets/styles/bootstrap-4.0.0-beta.2.min.css -// pages/assets/styles/bootstrap-theme-3.1.1.min.css -// pages/assets/styles/containers.css -// DO NOT EDIT! - -package static - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _pagesAssetsJsBootstrap400Beta2MinJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\xbd\x6b\x77\xe3\xb6\x76\x30\xfc\xbd\xbf\x42\xe2\xe9\xab\x21\x6a\x98\x23\x27\xa7\x3d\x3d\xd4\x70\xbc\x3c\xb6\x92\xf8\x8d\xc7\x76\x6d\x39\x69\xea\xa3\x7a\xd1\x22\x24\x21\x43\x01\x2a\x09\x8d\xc7\xb5\xd8\xdf\xfe\x2c\x5c\x09\x90\xa0\x6c\x4f\x92\xf3\x74\x3d\x5f\x66\x2c\x60\x13\xd7\x8d\x7d\xc3\xde\x1b\x6f\xff\xa9\xff\x0f\xbd\xde\x3f\xf5\x3e\x50\xca\x4a\x56\xa4\xeb\xde\xe7\x3f\x47\xc3\x68\xb8\x7f\x8f\x58\x1a\x7d\xd3\x0b\x97\x8c\xad\xcb\xf8\xed\xdb\x05\x62\xf7\x1a\x26\x9a\xd1\x15\x10\x9f\x1d\xd3\xf5\x63\x81\x17\x4b\xd6\xfb\x66\x78\x70\xb0\xff\xcd\xf0\xe0\x2f\xbd\xc9\x12\x59\xcd\x1d\x6d\xd8\x92\x16\xa5\xd5\x10\x66\xcb\xcd\x3d\x6f\xe2\x2d\x7b\xb8\x2f\xdf\x9a\x56\xdf\x2e\x8a\x74\xbd\x2c\xdf\xce\x28\x61\x05\xbe\xdf\x30\x5a\x94\xb2\x97\x33\x3c\x43\xa4\x44\x59\x6f\x43\x32\x54\xf4\x3e\x9e\x4e\x5e\xd2\xdc\x7d\x4e\xef\xdf\xae\xd2\x92\xa1\xe2\xed\xd9\xe9\xf1\xf8\xfc\x7a\x2c\x9a\x7b\xfb\x0f\x9f\xd3\xa2\x67\xe0\x92\xf9\x86\xcc\x18\xa6\x24\x64\x10\x41\x02\x9e\x82\x4d\x89\x7a\x25\x2b\xf0\x8c\x05\x23\x5d\xd9\xc3\xbc\x1a\x3c\xcd\x69\x11\xf2\xcf\x49\x32\x1c\x91\x77\x28\xca\x11\x59\xb0\xe5\x88\xec\xed\x81\x27\x5e\x8e\x13\x74\x4b\xa6\x23\x1c\x21\xb2\x59\xa1\x22\xbd\xcf\x51\x62\xff\xd8\x6e\xfb\x07\x10\x47\x33\x4a\xe6\x78\xb1\x91\xf5\xfd\x21\x0c\x3e\xa7\xf9\x06\x05\x98\xf4\xf0\x60\x10\xe2\xe8\xa1\xc0\x4c\xd5\x01\x78\x71\xff\x2b\x9a\xb1\x28\x43\x73\x4c\xd0\x65\x41\xd7\xa8\x60\x8f\x21\x83\x38\xfa\x84\x1e\x21\x06\x55\x85\x12\x34\x18\xa0\x68\x99\x96\x17\x0f\xc4\x40\x04\x19\x9a\xa7\x9b\x9c\x05\xe0\x10\x45\xea\xef\x18\x41\x92\x90\xc1\x80\xec\x00\x26\x06\x98\x8c\xf8\x9c\xca\x7a\x89\xc0\x93\x59\x10\x16\x32\xf0\x54\x20\xb6\x29\xc8\x53\x15\x31\x7a\xcd\x0a\x4c\x16\xd1\x2c\xcd\xf3\x90\x81\x68\x95\xb2\xd9\x32\x7c\xfb\xb7\x32\xbc\x4d\xf7\xff\xfb\x68\xff\x3f\xa6\x7b\xe0\x2d\xb8\x3d\x98\x46\x8c\x9e\xd1\x07\x54\x1c\xa7\x25\x0a\x41\x65\xda\xe3\x8d\xab\xe6\xee\x31\xc9\x26\x8f\x6b\x14\x17\x11\x22\x19\xcc\x50\x8e\x16\x29\x43\x56\xd1\x32\x25\x59\x8e\xe2\x7a\xeb\xc0\x13\x9e\x87\x28\x64\x11\x4b\x8b\x05\x62\x20\xc2\x65\xc8\x96\xb8\x04\x40\xb6\xd9\x63\x91\xfc\xe6\xe2\xfe\x57\xf5\x57\x11\xa5\xeb\x75\xfe\x28\xc0\x60\x5a\x2c\x36\x2b\x44\x58\x09\xaa\xaa\xb2\x36\x5d\xb4\xfb\x80\x49\x46\x1f\xa2\x7f\xbb\x21\x98\xa9\xf6\xfa\x07\x62\x69\x58\x92\xd1\x99\xf8\x30\x9a\x15\x28\x65\x68\x9c\x23\xfe\x2b\x0c\x0c\x7e\x05\x60\xa4\x91\x06\xf5\x30\xe9\x51\x80\xe7\x61\xc0\x31\x99\x6f\x67\x16\xf4\x13\xf6\xb8\x46\x74\xde\x63\x51\xc9\x1e\x73\x74\x8b\xa6\xaa\x8f\x27\x44\xb2\x98\xde\xa2\x69\x35\xd2\x9d\xd6\x43\x2b\xf9\x9c\x25\x26\x8a\x09\xe0\xa4\x7f\xa0\xc0\x7a\x48\x4e\x3d\xa2\x04\x85\x69\x34\xb9\x3a\x3a\xbf\x3e\x9d\x9c\x5e\x9c\xdf\x8d\xcf\x4f\xa0\xb5\x97\x38\xe9\x0f\x2b\x00\x4b\xc4\x26\x78\x85\xe8\x86\x85\x76\xe5\x76\x9b\x46\xac\xc0\x8b\x05\x2a\x26\x45\x4a\x4a\xcc\x2b\xc6\x24\x0b\x09\xa8\x20\x03\x90\xf7\x51\xf1\x11\x14\x49\xff\x00\xd2\xe4\xe9\x67\x74\xff\x09\xb3\x1a\x36\x0e\x1e\x1a\x25\x63\x92\x05\xf0\x23\xfd\x6f\x1b\x86\x99\xbf\x11\xaf\xbd\xb0\xeb\xa8\xf3\x69\x8f\x36\x60\x59\x67\x33\x15\x4c\x93\x27\x77\xe2\x71\x70\x5f\x36\x46\xb2\x40\xec\xe6\xf4\xc4\xc1\xa2\x8c\x3e\xb1\xbd\xe4\x7f\xfe\x27\x3c\x40\xff\xf2\x4f\x1f\x53\xb6\x8c\x8a\x94\x64\x74\x15\x02\x50\x3d\x2c\x71\x8e\x42\xb3\xe1\x0b\xc4\xd4\x6e\x7f\x78\x3c\xcd\x42\x06\x80\x5e\x7f\x56\xf1\xa6\xaf\x51\x8e\x66\x8c\x16\xdf\x15\x74\xa5\x00\x9d\xae\xd4\xe6\xf1\x76\x8e\x98\xa4\x78\x28\x0c\xb2\x94\xa5\xfb\x12\x89\x03\x30\x22\x83\x41\xf0\xa7\xa0\x9f\x24\x64\xbb\x0d\xdb\xc0\xcb\x02\xcd\x03\xb0\xdd\x06\x01\x18\xb1\xe2\xf1\xc9\xec\xbf\x1e\x24\x88\xe6\x58\xec\x98\x22\x54\xef\x87\x87\x24\x26\x9b\x3c\xaf\x66\xe2\x7c\x9a\x23\xdc\x13\x85\x15\x2c\xd0\x3c\xa7\x0f\xce\x38\xcd\x01\xa2\xf3\x79\x89\xd8\x0f\x88\xd3\xfb\x0a\xfa\x50\xc3\xf9\x0e\x71\x32\xa0\xa0\x42\x71\x6c\x41\x05\xcb\xcd\x7a\x4d\x0b\x56\x76\x7c\x66\x7a\xfb\x40\x69\x8e\x52\x12\x16\xa0\x82\xb8\xf4\x2d\x9f\x04\x0c\xd9\xed\x70\xba\xdd\x32\x10\x11\x9a\x09\x0a\x51\x41\x7e\x9e\x8e\x97\x68\xf6\xe9\x58\x50\xd9\xfa\x2b\x04\x09\xc4\x35\x0d\x2f\xf9\x71\xc4\xfc\x38\x2a\x0a\xbb\x2e\x28\xa3\xfc\xeb\x06\x71\x94\x44\x0d\xc3\x12\xc8\x5d\x2b\x12\x7c\x5b\x4e\x21\x4d\x08\xff\x2f\x4f\xe8\x60\x90\x46\x66\x94\x21\x05\x87\x01\x92\x7f\x07\x31\xff\x39\xc2\xf3\xb0\x4f\xd0\x43\xef\x0a\x2d\xc6\x5f\xd6\x61\x01\x22\x86\x4a\x16\xe6\x00\xb0\x65\x41\x1f\x7a\xbc\x6e\x5c\x14\xb4\x08\x51\xc4\xe8\xcd\x7a\xad\xc9\xe3\xde\x9b\xb8\x77\xb1\x16\x07\x3e\x78\xb3\x57\xee\xbd\x09\x7a\xeb\x82\x7e\xc6\x19\xca\x7a\x7c\xa0\xbc\x34\xe7\xa5\xf7\x1b\xd6\x43\x5f\xd6\x68\xc6\xac\x9a\x62\xef\x4d\x10\xbd\xe1\x14\x4d\x63\x66\x91\xe0\x10\x40\x14\xcd\x49\x84\x56\x9b\x9c\x13\x55\x7b\x23\x92\x12\xa6\x91\x77\x8b\x42\x30\x18\x84\x28\x42\x9f\x39\xe6\x97\x6b\x34\xc3\x69\x7e\xdb\xa4\x2d\xd3\x84\x84\x00\xc0\xb4\x0a\x01\x2c\x5a\x7c\x55\x23\xe7\x60\x80\x43\x6b\xad\x21\x02\x90\x88\x32\x48\x00\x64\x15\xa4\xce\x97\xe0\xc9\x82\x4d\xd4\x46\x49\x5a\x1b\xa2\xba\x06\x40\x7b\xfb\x66\x94\x94\xac\xd8\xf0\xd3\x97\x30\xc8\xa2\xbb\x3b\x51\x77\x77\x97\x20\x4e\x19\x2c\x74\x93\x44\x3c\x48\x73\x54\xb0\x00\x92\x84\x2f\xcd\x2d\x9b\x42\x9c\x3c\x1d\x9f\x5d\x5c\x8f\xe3\x60\x96\xd3\x12\x45\xf7\x65\xa4\x60\x44\xf1\x89\x2a\xcf\x9c\x8a\xd3\xe3\x1f\xef\x4e\x8e\x26\x47\x77\x47\x97\xa7\x1c\x00\xcf\x3e\x99\xfa\x48\x1c\xec\x74\x8d\x03\x3e\xc3\xa7\xa3\xb3\xf1\xd5\x24\xd6\xfd\x7e\x77\x74\x32\x8e\x83\x79\x9a\xa1\x00\x5e\xff\x70\xf1\x73\x1c\x94\x4b\xfa\x10\x34\xc6\xea\xb2\x5e\x4e\x7e\xa3\x3b\x85\x67\x09\xab\x34\x39\x31\xab\xa0\xf7\x9c\x44\x62\xa8\x89\x7d\x78\x58\xc2\xb6\x5b\xa7\x05\xc1\xce\x50\x22\xcb\x16\x88\x5d\x51\xaa\xc9\x5b\xc8\xc0\x48\x96\xab\xd3\x7c\xcc\xdb\x1b\x73\x54\x08\x11\xe7\xb4\x27\x52\x5c\xb8\x2c\x04\x7a\xa0\x2c\x04\xba\xf1\x02\xad\xe8\x67\xc3\x14\x11\xa8\x20\x89\x32\x5c\xae\x9d\xf1\x80\x27\x14\x49\xc0\x93\x94\xa5\xa1\x33\x2c\x18\x98\x05\x96\x1c\xa7\x9e\xb2\xa0\x58\x90\x34\x47\x9b\xb4\x69\x6c\x19\xf9\xc9\x71\xc8\x80\xc3\x37\x09\x97\xbd\x12\x14\x12\x70\x3b\x9c\x02\x88\xb7\x5b\xf1\x93\x01\xb9\x82\x25\x0b\x83\x28\xd8\xa3\x91\xd8\x3c\x05\x23\x46\xd0\x5a\x17\xcf\x20\x50\x24\x57\x0c\x47\x02\x83\x80\xc5\xac\x6b\x32\x49\x00\x24\xa2\x45\x67\xe1\x3c\xad\xf1\xa5\x18\x89\x4f\x25\xe4\x71\x9e\x96\x65\x48\x23\x8e\x3d\x00\x96\xdd\x87\x58\x7c\xb3\x4c\x4b\xfd\x01\x47\x3d\x70\x28\x4a\xb9\xb8\x50\x76\x8a\x0b\xa8\x66\x15\xd1\x5d\x86\x4a\x56\xd0\x47\xb3\x8e\x10\x81\x0a\x78\x49\x4a\x78\xf0\xcf\x43\x10\xcb\x9d\x6b\x7e\x25\xd0\xa1\x51\x9a\xb4\x58\x48\x86\x58\x3a\x5b\x86\xf5\x22\xa9\x15\x3c\xd1\x73\x0f\xb9\x3c\x12\xdd\xfd\xfa\x6f\x1b\x54\x3c\x9e\x12\x86\x8a\x79\x3a\xb3\xf0\xab\xa6\x3d\x62\x18\x88\xb7\xd6\x20\x01\x62\x9b\xb9\xcc\x04\xcb\x04\x8b\xa3\x1a\x5a\x88\x37\x2a\xb7\xdb\xb0\x4c\x38\x95\x66\x0a\xac\x05\xc4\x99\x03\x94\x44\x21\x48\x12\x2e\x62\x97\xb7\x64\x2a\xa1\x2b\x39\x40\x29\x76\x9e\xe0\x72\x85\xcb\x32\xf1\xb0\x58\x7b\xad\x85\x40\xbf\x96\x27\x4a\x9d\xaf\x90\x13\x39\xd1\x83\x6a\xb6\x82\x05\xa7\x9a\x9b\x3c\x87\xb7\x4f\x9f\xd0\x63\x1c\xfc\x34\xbe\xba\x3e\xbd\x38\x17\xa2\x4d\x9b\xab\x06\xb6\x6a\x17\x54\xd5\x94\xd3\xdb\xd0\xc2\xc4\x5a\x6c\xa0\x44\x2c\xb3\x4d\xd1\xe0\xd3\xc9\xe9\xf5\xc7\xd3\xeb\xeb\xf8\xcd\xad\x20\x66\x99\x9a\x89\xa2\x62\xd3\x37\x55\xa4\x20\x60\xda\x98\x6d\xc8\xd7\x2e\x05\x92\xf5\xdc\xb2\x69\x92\xb6\xf6\x4b\x57\x45\xc7\x16\xf1\x4e\x4d\x29\xa1\x9c\x9b\xe7\x78\xc6\x92\xb6\xb4\xa0\x5b\x25\xb0\xdd\x6e\x25\xf9\x51\xee\xa1\xfa\xf7\x1b\xc6\x28\x69\x90\xfd\xa3\xe3\xc9\xe9\x4f\xe3\x38\x48\x67\x0c\x7f\x46\x01\xfc\x70\x33\x99\x5c\x9c\xc7\xc1\x3d\x23\x01\xfc\xee\xe2\xf8\xe6\x3a\x0e\xe6\x74\xb6\x29\x83\x0a\x96\xc9\x93\x58\x9d\xc9\xc5\xf7\xdf\x9f\x8d\xef\x8e\x8f\xae\xae\x2e\x26\x7a\x79\x18\x5d\x2c\x72\xf4\x9f\xa6\x9b\xe9\x1b\x68\x01\xbb\x50\x1a\xa8\xe4\x50\xa7\xe7\x97\x37\x93\x38\xc0\x64\xbd\x61\x01\xd4\xe3\x89\x9a\x03\x8a\xf8\x88\x04\x33\xe9\xe4\x3c\xb2\xd1\x9a\xf5\xc8\xf1\xdf\x7d\x38\xbb\xb9\xb2\xc0\xc5\x6c\x3c\xe0\xbd\xfb\x7c\x53\xf8\x9a\xf9\xbd\xf8\x92\x9a\x7b\x6b\x63\xfa\x43\x48\xf8\x3f\x85\x3a\x95\xa6\xb9\x9a\x10\x97\x91\xb5\x96\x9c\x14\x73\x19\xab\x90\x0d\xd0\xf6\x67\x42\x0a\x2e\x23\xb1\xb2\x1a\x9a\x0a\xdd\x2e\x28\xd2\x0c\x53\x7e\x64\x69\x24\x04\x09\x5e\x13\xcd\xb8\xf8\x88\x32\x41\x2e\xdd\x96\x0c\xe9\xc4\x91\xdc\x19\x00\x18\x67\x21\x28\x2f\x91\xe8\x3d\x4d\x10\x17\xf0\x54\x8f\x0a\x86\x77\x99\xf2\xd6\x52\x97\x60\x9b\x46\x2a\x3c\x57\x4a\x2c\xe5\x5d\xd8\x0a\x01\x2e\xd3\xfb\x1c\x65\x5c\xce\x2f\x76\xd4\xd1\x68\xc6\x9b\x3c\xc3\x25\xe3\xf2\x0f\x4b\x31\x29\x9b\x5f\xef\x86\x50\x6a\xe7\xc8\x4c\x3f\xe9\xbf\x60\xfa\x10\x85\xb4\xa6\xcd\xc1\x6c\x99\x92\x05\x0a\x40\x45\x23\x81\x57\x21\xe0\x7b\x79\x50\x55\x64\x30\x70\xda\x8a\x4a\x47\x95\x49\x0b\x9c\xee\xaf\x0b\x54\x96\x28\x0b\xe0\x4b\x3a\x06\x90\x79\xf6\x47\xe2\x54\x73\x75\xbf\x4a\xec\x50\xe7\xd6\x2f\x77\xfc\x5e\x0c\xa7\xe6\x23\xba\xbb\x91\x94\x3b\x6c\x6e\xd3\x05\x0b\x31\x67\x3a\x72\xca\x8a\xeb\x60\xce\x75\x04\xc7\xf9\x23\x79\x03\x6d\xf2\x06\xe7\x3c\x2a\x42\x08\x1d\x89\xb3\xc5\xcc\x46\x9a\x32\x48\x6d\x77\xc4\xe5\x2e\x7b\x9b\x25\x9d\x03\x42\xf1\x15\x75\xf5\xd9\x57\x55\xc0\x43\xee\xa5\xae\xc6\xe1\xcd\xc2\x70\xd1\x44\x8c\xd9\x43\xfd\x9e\x1f\xb8\x92\xde\x2c\xd3\x52\x6b\x1c\xfc\x74\x8b\x11\xba\xc8\x27\xba\x83\x6f\xff\x53\x9e\x03\x4c\xc0\xe1\x3f\xbe\x95\x8a\x1f\x93\xa4\x06\x54\xff\x17\x19\xe2\xd2\xc3\x10\x67\x69\x41\x37\x25\xca\x39\x4b\xe4\x68\x56\xff\xc6\x09\x17\x7d\x09\xa4\x86\x55\xa6\xc9\x13\xe6\x4d\x7e\x4e\xf3\xf8\x9f\xd1\xb7\xf0\x13\x7a\xbc\xa7\x69\x91\xc5\xfd\x21\x2c\x73\x9c\xa1\xb8\x7f\x00\xd7\xe9\xa6\x44\x71\xb0\xa4\x9f\x51\x11\xc0\x87\x22\x5d\xc7\xfd\x61\x05\x73\xeb\xdb\x20\x24\x9b\xd5\x3d\x2a\xb6\xf7\x52\xe5\x07\x41\xdd\x54\xa0\xca\x02\xd5\x62\x10\xaa\x82\x6d\x29\xac\x8d\x20\xd0\x3d\x84\xb2\xc0\x6a\x44\x74\x66\x1a\xa8\xe0\x32\x79\x3a\x1f\xff\xfb\x24\x0e\x08\xfa\xc2\x02\x78\x79\x35\xfe\x29\x0e\x38\x4e\x06\xf0\x6c\xfc\xdd\x24\x0e\x72\x34\x67\x01\xbc\x3a\xfd\xfe\x87\x49\x1c\x08\xa3\x76\x50\xc1\x59\xf2\x74\x7d\x76\xca\xb5\x33\x31\x82\x60\x0f\x43\xfe\x5b\xfe\xe4\xbf\x7e\x1c\xff\x72\x72\xf1\xf3\x79\x1c\x7c\x42\x8f\x19\x7d\x20\xbc\xec\xe3\xc5\xcd\xf5\x78\x7c\x3e\x19\x5f\xc5\xc1\x8a\x2f\x20\xd7\x8a\x0a\x53\x73\x36\x3e\xe2\x0c\x5d\xd4\xe4\x28\xfd\x2c\x5a\x9d\x5c\xdc\x1c\xff\x20\xcc\x54\x8c\x6e\x66\x4b\x44\x44\xeb\x67\x17\x47\x27\x16\xa7\xce\x69\x2a\x34\x4e\xbd\x2f\x16\x67\xef\x94\x01\xda\xb0\x15\xdc\x24\x4f\xc7\x47\x57\x62\x2c\xb1\xb5\xe9\x4d\xd1\xc7\x99\xb9\x5e\x19\x0d\xbe\x8f\x19\x5a\xed\xcb\x75\x52\x2b\xe8\x56\xc9\xf5\x94\x6b\xee\xd6\xd8\x3b\xe0\xd6\xc8\xfd\x38\x9d\x8c\x3f\x36\x6a\x82\x0a\x66\xb5\x6c\x66\x64\x21\x59\x70\x27\x3f\x50\xa5\x91\xfb\xa1\x6a\xad\x59\xca\xc7\x75\x27\x87\x10\xb5\x47\x07\x7b\x91\x77\x60\xe7\x27\xa7\xc7\x47\x93\x8b\xab\x6b\xe7\x2b\x92\xe1\x59\xca\x68\x51\x06\x52\xc2\x53\xeb\x26\x05\x3c\xb1\x7a\x53\xd8\xb3\x7e\xed\x33\x3a\x55\xa0\x57\x1c\x52\x89\x82\x05\xce\x90\x75\x06\xa7\x6f\x2a\x38\xf7\xca\x59\x54\xd8\x4a\x94\xa4\xc5\x87\x57\x0a\xa6\xa4\xf8\x94\x3e\x59\x76\x99\x5c\x99\xb1\xc5\xc1\x34\x70\x79\xc9\x0f\x50\x96\xf4\x0f\x4c\xc9\x75\x8e\x33\x4c\x16\xa6\x48\x20\xa4\xb2\x10\xdb\xdf\xca\x4b\x8c\xda\x64\x20\xcd\x6d\x9c\xf2\xba\x0c\x93\x6b\x71\xb7\xc3\xa9\x19\x9e\x5e\xad\x71\x5d\xef\x91\xd6\xb2\xa8\x5e\x6d\xeb\xf3\x34\xcb\x84\x1e\xcd\xa5\x18\x44\x50\x51\x86\x40\x88\x98\xf3\x84\xb6\x45\xcc\x79\xc4\x37\xd3\x5e\xc3\xc6\x1c\xb5\x9d\x42\x6c\x4b\xb8\x8c\x38\x56\x80\x0a\xca\xef\x7e\x5e\x22\xf2\x13\x2e\xf1\xbd\x2b\xa3\xf6\x8d\x05\x78\x89\xb3\x0c\x11\x8f\x10\x82\xcb\x30\x88\x3f\xcb\x4f\x03\x30\x18\x04\x12\x32\xe8\x27\x1e\x89\xb6\x2c\xc3\x40\xc0\xe2\x1c\xb3\x47\x0e\x2e\x20\xf8\x08\x42\x31\x16\x8e\x7b\xaf\x98\x03\x47\x6a\xf9\x1d\xdf\x59\xd7\xec\xb3\xdd\x86\xcd\x7d\x1f\x6a\xf1\xa2\xbd\x01\xe6\x8c\xf0\xf5\x1f\x0c\x76\x58\x15\xc2\xd2\x7f\x55\xe0\xb6\x2b\xb7\x70\xf6\x38\xcb\x51\xd8\x1f\x02\x00\x67\x39\x4a\x8b\x53\x85\xaf\xa1\x8b\xbe\xc0\x87\xce\x7c\x5a\xe2\xfb\x67\xa7\x75\xd0\xfc\x7e\x30\x08\x5f\xdd\x1d\x70\x30\x3d\xaa\x9b\xea\xbb\xdd\x0d\x06\x8d\xd6\x92\x12\x31\xd3\x51\x7d\x65\x50\x6f\xf3\x35\x4b\x19\x3a\x34\x1b\x6d\xa1\x5a\x6c\x0a\x41\x74\x8f\xd5\x1a\x76\x0c\x04\x88\x7d\x66\xb4\xcb\x40\xe4\x3b\xfc\x5d\x9b\x6d\x91\x52\x21\xd0\x48\x29\xd5\x1c\xee\x53\x86\x56\xa7\x24\x43\x5f\x42\x4f\xa3\xd2\xc2\x1d\xb2\xf7\x16\x49\x52\x37\x0e\xfb\x07\xdb\x2d\x7b\x37\x04\x5c\xaf\x6a\x20\x2e\x68\x0d\x85\x12\x14\xce\x22\x4e\x3e\x61\x5b\xa6\xe1\xfa\x62\xc8\x40\x05\xa4\xae\x85\xe7\x21\x4e\x92\x84\x01\x5b\xd4\x16\x28\x1f\x02\xf8\x99\xe2\xac\x67\x61\x1b\x50\x17\x99\xec\x3d\x3e\x94\xa7\x3c\x96\x07\x65\x64\x9f\x9d\x12\x5a\xe3\xbf\x65\x53\x50\xf1\xe5\xf5\x29\x0e\xad\x81\xcf\xe7\x21\xe6\xc2\x5c\xa7\x42\x61\xa8\x62\x8b\x5e\x2b\x32\x6a\x95\x20\x0f\x9d\xf6\x10\x75\x83\xec\x4e\x99\xa6\xde\x2f\xa2\xfe\x2d\x5a\xac\x0f\x59\x4d\xcf\x7d\x6a\x0d\x49\x50\x84\xbe\x30\x44\xb2\xf0\xa9\x82\x29\x9f\x5c\x19\x35\xae\x5d\x38\x8f\x82\xb9\xb0\x67\xce\x3d\x64\xbb\x2d\x7d\x5a\x18\xab\xd0\x5c\xcb\x81\x1e\x0a\x4b\x49\x38\x8b\x94\xec\xe5\xb3\x51\xb2\xe8\x4e\x09\x64\x21\xe2\x62\xb6\x12\x41\x39\xc2\xd8\x3d\x08\x7c\x19\x0c\x42\x7f\xfb\xb5\x1c\xe7\xef\x42\x62\x1b\x52\xfa\x85\x82\x17\xd2\x9d\x1f\x5e\xe2\xa2\x1c\x0f\x25\x82\xad\x96\x2c\x2d\x58\x80\x49\xcf\xd0\x08\xfd\x87\xda\x91\xae\xb9\x6b\x79\xd1\x3e\x28\xcc\xe0\x3f\x73\x98\xf6\x60\x20\x28\x9f\xbe\xe4\x75\x2b\x9b\xc0\x89\xef\x3a\xd8\x3b\x0b\xf8\xcf\xc3\xe1\x1e\x6b\x13\xa5\x4a\x92\x25\xbd\x01\x49\xe3\x96\xbe\xff\x56\x58\xb6\xb6\x0c\x7d\x61\x69\x81\xd2\xb7\xd8\x28\x45\x42\xc1\x8a\x58\xba\x38\x4f\x57\x08\x80\xf2\x01\x8b\x4b\xca\xe8\x61\x89\x67\x4b\xf0\x34\x4b\x4b\xd4\xfb\xf6\x2f\x71\x5b\x97\x94\xf8\xcc\x4b\x43\x30\xba\x2f\x50\xfa\x69\x24\x81\xff\xda\x09\x2c\xf9\xab\x02\xd6\x0e\x0f\x72\x92\x95\x3e\x01\x86\xe8\xf9\xac\xb5\xf6\x71\x46\xd1\x2a\xfd\x84\x8e\x8a\x22\x7d\x0c\x85\xd1\x7a\x9d\x16\x88\xb0\xb0\x96\x65\x38\x59\x75\x48\x40\x84\x79\xc3\x17\x73\x61\x06\xaf\xbb\xfb\xf0\x78\x82\x0b\x24\xfa\x6a\xdc\x83\x29\xba\x9e\x24\x89\xa4\x60\x10\xab\x1f\x9c\x8e\xc1\xd2\x47\xaa\x11\x80\x45\xe2\xa3\xc9\x9c\x5e\x87\x78\x30\x18\x26\x49\x52\x6e\xb7\x64\x30\x28\x93\x24\x29\x80\xe1\x6c\x6a\x4f\xb9\x12\xa5\x09\x2c\x1a\x49\xe3\x5a\x58\xee\x85\x75\xc7\x87\xfb\x07\xf1\x01\x00\xff\x5f\xbb\x17\x25\x84\xed\x1f\x24\x49\x42\x0f\x1d\xca\xea\x19\xd1\x34\xb6\x21\xe8\x54\xac\x89\x92\x29\x38\x49\x6b\xdd\xab\x70\x09\xb8\x9b\x47\x81\x8e\x05\x79\x19\xf3\xe3\xcb\xa6\xef\x6b\x24\x3f\x1a\xc3\xa7\x02\xe5\x29\x43\xd9\x44\x20\x69\xcc\x60\xa6\xf7\x29\x26\x70\x5e\xd0\x55\x5c\x42\x46\x63\x5c\x01\xd7\x0d\xc3\xb6\x4d\xe9\xcb\x70\x00\x0b\x31\xbf\x12\xb1\x23\x41\x9b\x4f\x35\x21\xf6\xdd\x82\xd4\x9c\xb3\x49\xae\x6b\x4e\xd4\xae\x72\xa7\xe6\x9a\x1d\x37\xba\x74\x54\x0b\x0b\x9e\x36\xa2\xd9\x12\xe7\x59\x81\xc8\xad\x77\x89\xa7\x23\x21\xfb\x12\x10\xa5\x59\xd6\x68\x58\x1e\x21\xc1\x56\x7d\x7b\x06\x0b\x48\x61\x2a\x3d\x57\xf2\x97\x8a\x24\x70\xee\xdb\xd2\x1c\xc0\xbb\x84\x6c\xb7\xb9\xb6\x2f\xb6\x0f\x52\xc8\x38\x23\x5a\xf8\xbe\xbe\x03\x70\x95\x68\x67\x83\x86\x44\xc8\x0f\x49\x7d\xdc\x0e\x43\x9c\x6c\x22\xae\xe8\xc2\x22\xd9\xc8\x13\x48\x93\xa5\x28\x01\xb1\xa8\x14\x1a\xb2\xa8\x15\x47\x92\xd7\x8a\x22\x00\xef\xf8\x42\xdd\x59\xe6\xad\x4d\x6d\x3d\x6e\x69\x5d\x42\xbe\xe9\x71\x4a\xe9\xdc\xba\xd6\xa7\x20\xbc\x83\xd4\x7f\xef\x3a\x18\xe4\x83\xc1\x5d\x4b\x45\x48\xfa\x43\xb8\x52\xeb\x63\x58\x84\x14\x7c\xba\x30\x30\xbc\x93\xc8\xb1\x6e\x1c\x84\xe6\x39\xb8\xb3\xce\x01\x95\xe7\x60\xce\xcf\xc1\xa2\x02\xa3\xdd\xd7\x90\x1d\xf6\xdd\x8d\x3c\x6f\xe0\x30\x14\x2b\x66\x50\xab\xe0\x32\x86\x74\x4f\xe1\xbb\x86\xc2\xdc\xaa\xe4\xb2\x97\x03\x8d\x15\xc4\xee\x3b\x4d\x7e\x7e\xee\x1a\x16\xf9\xbd\xa0\x17\xec\x15\x3e\x9c\x96\x2d\xfa\xce\x91\xfc\x46\xfc\x8b\x85\x51\xd2\x51\xa2\xfd\xfe\x55\x86\x48\xa4\x1e\x0a\xb1\x06\x15\x1c\x76\x5e\xa9\xfe\xcb\x70\x08\x40\x1c\x76\x0e\xa7\xb9\x18\x75\xb9\x47\xc5\xef\xa4\x52\x6b\x00\x0c\xd2\x28\x29\xba\xaa\x20\xdd\x61\xf7\x66\xaf\xb6\x7b\x73\xc1\xb1\x21\x4b\x3a\xf5\x00\x8c\x02\x2a\x7c\x3e\x82\xc4\xf8\xc9\x0d\x06\xe6\x8b\x12\x32\x89\xa6\x45\x12\x48\x0b\xa0\x05\x77\xc8\xe2\x32\x12\x24\x88\x9f\xe4\xda\xaa\x4e\xa5\xcb\x5f\xd3\xae\x4e\xa4\x35\x5d\x5a\x23\xad\x66\x00\x96\x8a\x87\x39\x96\xad\x9e\x0a\x79\x93\x54\xfb\xf4\x99\x1a\x7c\x5b\x4c\x5b\x3e\x3e\x6f\xce\x69\x6f\x85\xd8\x92\x66\x3d\x92\xae\x50\xa6\x5d\x75\xde\x80\x11\x87\x0f\x41\x25\x7a\x2a\x2d\x7d\x33\xc4\xe6\xdc\x62\xbd\x19\xc2\xc8\x4f\xa3\x3b\x3e\xf8\xa3\x35\x3e\xce\xf1\xec\xd3\x0f\xd2\xb3\xb1\xa5\x0f\xe2\x1d\x3e\x10\x7c\x05\xc4\x02\x69\xe7\x26\x14\x62\x73\xa3\xc6\x4f\x6a\xe1\x9c\x4e\x6d\x38\x54\xbe\x50\xa9\xb3\x7d\x02\x58\xee\x5c\x73\x23\x61\x2e\xe9\xaf\xc7\xdd\x4d\x1b\xc5\x02\x30\xe2\x73\x4d\xcd\xc4\x85\x1a\xdf\xc6\x38\x6d\xe3\x2f\x00\x4c\x01\xcc\xd5\x18\x15\x42\xf1\xcd\xca\xa5\x3b\x90\x2b\xf6\x55\xe2\xbe\x9c\xfe\x86\x3b\x11\x28\x3f\x52\x2d\x76\x7c\xd4\x4b\xc5\xe5\x09\xed\xbe\x3c\x99\x35\x2f\x4f\xb2\xa8\x36\x1b\x72\xb6\xe9\xd9\x51\xbe\x9c\xd2\x0d\x55\x35\xe1\x58\x86\x5d\x8a\xa6\x9a\xbb\xe2\x54\xd4\x7b\x08\xb5\x11\x00\x8c\xe6\x1d\x6b\xcb\x20\xd3\xfb\x56\xd9\xb7\x14\x6d\x78\xef\x2d\xc5\xfc\x75\xb7\x14\x14\xb6\xdb\xad\xe0\xbc\x0a\x01\x9c\xf9\x6e\x29\x68\x9e\xa7\xeb\x12\x99\x5b\x0a\xf3\x1b\x9b\xdb\x09\x9a\x3c\xc9\xcb\x98\xb8\x3f\x84\x52\x18\x8f\x03\xe9\x16\xaa\xca\xeb\xbb\x05\x5d\xad\xef\x10\x34\x25\x0c\xc4\x45\x45\xed\x8f\x15\x39\x7d\xf1\xf2\x73\x59\x41\xdc\x9a\x1f\x84\xf5\x77\x89\x33\xd4\x2a\x3f\x19\x9f\xc7\xca\x18\xe8\xd6\x75\x9b\xef\x15\x88\x6d\xbe\x5f\xda\xa3\x0a\xe0\xf1\xc5\xd9\xd9\xd1\xa5\xf0\x55\xab\xdb\x93\x65\xa7\xe7\xdf\x9b\x52\x4e\xb2\x0c\xec\x49\x0d\x9c\xc9\x6b\x8e\x9f\x4f\x4f\x26\x3f\xc4\xc1\x03\xce\xd8\x32\x80\x3f\x8c\xa5\xb5\x7f\x89\xd4\x45\xc8\x46\x5b\xdf\xaf\xe3\x20\xe2\xfd\xc2\x5e\x64\x37\xbc\xc3\xb5\xc1\x8c\x6a\xfa\xa6\x82\x99\xd7\xa2\x8d\x1d\x8b\xb6\x25\x2e\xd8\x76\xe8\xda\xa9\xe0\x85\x06\x68\xc5\xc9\x84\x5a\xd6\x50\xd1\x3a\x87\x78\xbb\x2c\xd0\x3c\x09\xfe\xf4\x66\x8f\x45\x38\xdb\x7b\x13\x4c\x61\x27\xa8\xe5\xab\xeb\x7c\xf1\x06\xd4\x3e\xdf\x9c\xe1\x6d\x1c\x67\x05\x58\x24\xc3\x51\xf1\x0e\x1b\x35\x49\xc7\x0e\xd0\x84\x93\x7f\x98\x76\xd3\x6a\x0a\x46\x9c\x7a\xf5\x93\x44\x3b\x13\xcc\x71\xce\x50\xc1\x35\x4e\xed\xe0\xab\xc5\x60\x7b\xf2\xd1\x7a\x53\x2e\x43\x0a\x2a\x59\x25\x11\xbe\x69\x09\xe1\x65\x87\x66\x2d\x2f\x95\x02\x1b\xb7\x2c\x55\x0a\x54\x9b\x9d\xd3\x2c\x3b\x2a\x70\x7a\x44\xb2\x63\x8d\x50\x92\x55\xb8\xf6\xaf\xf6\xa0\x1a\x36\x4d\xb9\xbe\x6a\xf4\xf2\x87\x32\xed\x67\x09\x6e\x9b\xf6\x33\x8f\xf7\x48\xb7\x50\xb9\x94\x8e\x71\x72\x7a\xfc\x64\x86\xca\x27\x8d\x63\x72\x08\x2a\x98\x89\xbf\x3a\x8c\x52\xb5\x28\xde\x40\xcd\xc1\x60\x87\xa3\x82\xea\x53\x71\x55\x48\x47\x46\x8f\x93\x0b\x38\x18\x84\x61\xd1\xb4\x1c\x58\xf5\xc0\xa8\x5f\xa1\xf5\xa7\x96\xe5\xae\x01\xd0\x7b\xbe\xdd\x86\x85\x34\x57\x03\xd8\xe7\x2c\x3b\xa4\x89\xcd\x11\xc1\x60\x40\x5b\x43\xb7\xd8\xb7\x14\xef\x73\x39\xdc\x91\x8c\xa3\xf0\x8b\x84\x29\x80\xfd\xd4\xab\x78\x80\xa7\x42\x48\x29\x3b\x58\xb5\xa0\x88\x01\x80\x74\xbb\xb5\x46\x07\xe5\xc0\x85\x10\x37\xab\x8f\xf2\x09\x5e\x21\x52\x8a\x9d\x18\xb5\x86\x63\xcb\xbc\xcb\x48\x93\x34\x4b\xe0\x35\x85\xa7\xe7\xdf\x37\x6e\xa3\x54\x90\xc5\x6c\x9a\x0c\x3d\x38\xa9\x56\xb4\xd6\x4f\x1c\x84\xed\xe8\xf8\x04\x44\x29\x63\x85\xf2\x61\x41\x5f\xd6\x29\xc9\x84\x13\xcb\x50\xf5\xcd\x15\x00\x7b\xed\xc3\xfe\x50\x4e\x38\x6b\x60\xef\x73\x73\xe4\xd3\xf1\xcc\xd2\x9d\xba\x74\x01\x65\x9e\x19\x07\x01\x64\x9e\xc1\x1c\x08\x59\xcd\xb3\xdd\x12\x25\xce\x41\xc5\x91\xa2\x53\x99\x93\x88\x34\x4f\x82\x72\x56\xd0\x3c\x0f\xf6\xc2\xd9\xed\x70\xda\xf0\x63\x9f\x71\x41\x7c\x86\xc2\x03\xe0\xd9\x4f\xaf\x92\x96\xed\x50\x7e\xba\xb6\xd4\x29\xbe\x9d\x4f\xf7\x82\xf5\x97\x40\x4a\xd3\x99\x10\x00\xf9\x41\x5f\x3a\x36\x89\x97\x1e\xf4\x17\x9e\x73\x62\x9d\x27\x2e\x07\xec\x3e\x4f\x04\xc0\x3e\xe9\x38\x4f\x0d\xdb\x96\x7d\x20\x0c\x21\x71\x17\x00\x37\x16\x80\x73\x91\x0f\x74\x43\xb8\xa6\x77\x9c\x63\x44\xd8\x15\x9a\xb1\x10\xdc\x62\xb9\x30\xb5\x3e\xdd\xb8\xa6\x6b\x8d\xd7\x7f\xb0\x3a\xcf\xa1\x5b\xae\xf0\xb1\xeb\xac\x01\xcd\x29\x25\x5b\xec\x84\xb3\xf9\x64\x1b\xe8\x35\x8c\x33\x14\x9c\xb3\xb9\x7f\x9c\x2a\x51\xef\xe9\xea\x3c\xdf\x07\x40\x71\xd4\xce\x03\xee\x88\xaf\x2f\x3a\x7b\xaf\x3c\xf7\xf5\x51\x95\xd2\x25\xa8\x46\x1d\xa8\x11\x04\xdd\x6e\xe1\x87\x2f\x3b\x92\xb3\x1d\x47\x32\x9e\x49\x0d\x2b\x6b\x4d\xd2\xbd\xaa\xf5\x4a\x78\x8c\x7f\xf7\x3a\x07\x3d\x02\x3a\xaf\xcf\x94\x78\xb3\xfb\x42\xcd\x91\x0d\x9d\x0b\x34\x77\x68\xf2\x42\x2c\x7b\xd5\x85\x18\xe5\xa3\x33\xee\xad\xda\xba\xa8\x0b\xba\xee\xca\x52\x71\x57\x96\xb9\xa7\xdd\xa7\x35\x75\x52\xa2\x59\x24\x84\x78\x70\xa8\xfe\x88\x67\x91\x94\xe3\x75\xb3\x52\xa8\xf3\x13\x3f\x48\xc4\x5c\x47\xa5\x15\xc9\xe4\x11\xfb\xc0\x61\x48\x7c\x92\x23\xf4\x86\x34\xb6\xe1\xa2\x5f\xff\x8b\x0b\x08\x83\x81\xbf\x99\xdb\xe1\x14\x80\x98\x18\x93\xb0\xdb\xb7\xbe\x97\x2e\x92\x6e\xf9\x5d\x94\x2b\x14\x08\xde\xec\x79\x9a\x11\x22\x7a\xad\x9b\x13\x65\x6f\x2e\x9a\xca\xb2\x88\x5a\x62\x3b\x24\x5c\x2c\x16\x55\x1a\x42\x6d\x6a\x43\x00\xbc\x25\x53\xae\x37\xcb\x0d\xed\x6a\xa0\x61\x19\x97\x2e\xc0\xc6\x4a\xd6\x26\x51\x23\x62\xc9\x27\x0d\x77\x43\x8b\x5c\xc1\x3e\xee\xa0\x58\x18\x54\x15\xec\x18\xf5\xeb\xe2\x66\x8c\x13\xf7\xa1\x0a\x97\x91\x51\x85\xb0\x2d\x01\xbe\xca\x3c\x58\x9a\x38\x8c\x22\x29\x8d\x89\x30\x6d\x9c\xae\x52\x9b\x98\x7c\xb6\x41\xe5\x8c\x50\x0c\x06\xa9\xd1\x29\xde\x72\xe1\x7e\xcb\x19\xbf\x76\xc0\x04\xc2\xce\xa4\xd0\x87\x53\xe1\x42\x4a\xd1\xe8\x81\xeb\xa2\x22\x22\x18\xe8\x7e\x08\x2c\x00\x80\x6d\xfb\x62\xa7\xd5\xaf\xb8\x65\x2f\xb3\xfa\x31\x69\xf5\xe3\xf0\x9c\x7a\x0a\xa7\x5d\xfc\x87\x1b\xa8\xa8\x30\x50\xe1\x6e\x03\x55\xde\x34\x50\x39\x0a\xac\xe3\x1d\x1b\x1c\x89\x3b\xf5\x68\xb6\x29\xf8\xd1\x9a\x38\x37\xb8\x83\x41\x87\xd7\x2f\x76\xb6\x79\xa7\x61\x12\xb5\xcf\x65\xc3\x88\x05\xcb\x84\x69\x54\x39\xd4\x3e\xbf\xb1\x0a\xd0\x01\xa3\xac\xd3\xc4\x55\xba\xb6\xad\x36\xa0\xd7\xb6\x95\xbd\xce\xb6\x85\x61\xbb\xdd\x0a\x66\x55\x08\xe0\xc6\xfe\xac\x03\x95\x48\x0b\x8f\x82\x3a\xb7\x42\x56\xd0\x75\x46\x1f\x48\xaf\x40\xff\xb5\xc1\x05\xea\x5d\x52\x2e\x72\x47\xbf\x5a\xe9\x16\xd6\xba\x28\xa2\xc5\x02\x04\x40\x85\xad\x07\xfa\x5b\xe1\xda\x7b\x5f\x46\xf5\x6f\x2a\x5c\x7d\xb1\x38\x75\xd2\x98\x96\x27\x56\xf0\x6a\xf0\xed\xbf\x6e\xff\x3c\xdc\x7e\xf3\x97\x00\xc0\x65\xf2\x54\x1b\xbb\x82\x3d\xda\x30\x71\xf1\x12\xcb\x50\xa5\x7e\x69\xa3\x19\xff\x2d\xf0\x4c\x59\xbb\xcc\x6f\x9f\x19\x4c\x0f\xcf\xf2\x78\x55\xde\x1f\x16\xb4\x72\x38\xe8\x86\xbf\xb9\x74\xa1\x37\x6b\x3f\xac\x30\x88\x9d\x9c\x5e\x1f\x7d\x38\x1b\x9f\xc4\x75\x88\x84\x3d\x1b\x78\x72\x75\x71\x79\x73\x19\x8b\x95\xdc\xac\x03\xf8\x71\x7c\x7e\xa3\x7c\x64\x75\x8b\xfb\x2b\x44\x36\xda\x47\x96\xd7\x4b\x3f\x59\xb7\x5a\xf8\xc9\x0a\x03\xdb\x0e\x1b\x9a\xd9\x9e\xe9\x1b\xf8\xdd\xc5\xd5\xc7\xbb\xe3\x1f\x4e\xcf\x4e\xe2\xc0\x0c\xbe\x37\xa7\xc5\x4a\x76\x62\x95\x8a\x1e\x02\x78\x7e\xf4\xd3\x87\xa3\xab\xbb\xf3\xa3\x9f\xe2\x20\x22\xe9\xe7\xfb\xb4\xd8\x27\xe9\xe7\x00\xfe\x74\x7a\x7d\xfa\xe1\x4c\x5e\xb1\x5e\x37\xbf\xeb\xd5\x3f\x31\x43\xab\x98\x50\x16\x46\x7a\x2d\x80\xf4\xc8\x9d\x5c\x5c\xc6\x01\xa3\xeb\x7d\xe9\xc8\x02\x27\x17\x97\xca\x89\x79\xbd\x2f\x62\xf4\x3f\x5c\x4c\x26\x17\x1f\xe3\xe0\x9e\x32\x46\x57\x1a\x4c\x96\xca\xa8\x7c\x59\x21\xa3\xf6\xe7\xc9\x93\x8c\x32\x8f\x87\x70\x9e\x63\xe9\x2d\x7e\x67\x0a\x8d\xaf\xb8\xb2\xd4\xea\xf3\x03\x02\x09\x6d\xb9\x7b\x2f\xbc\x76\xc6\x54\x85\x14\x7b\xcd\x89\xf2\xa8\xbc\xc0\xc3\x15\x69\xd9\x93\xaf\x52\x5d\xfb\x11\x91\x8d\x26\x5e\xb5\x3b\xe1\xb9\x58\x6e\x05\x95\x21\x86\x66\x4c\x16\x19\x98\x2e\x97\xd6\x45\x92\xb6\xed\x5e\x0b\x8f\xdd\xab\x56\x5b\xb5\xd4\xaf\x77\x69\xa7\x81\x6a\x16\x69\x14\x07\x9a\xa4\xa6\x96\x98\xd8\xa4\xc5\x96\x82\x88\x8d\x7c\xc6\x57\xc0\x69\xd2\x18\x91\xd2\xe8\x4e\x78\x1d\xf1\x55\x29\x43\xc0\x85\x12\xc5\xe2\x9b\x9e\x14\x76\xdb\x95\xe5\x79\x21\xa5\x1e\x58\x6a\x1d\xda\x71\xa0\xe8\x17\x3b\xf4\x66\xea\x2a\xc2\x23\x57\x9a\x9a\x45\xf2\xe8\x02\xcb\xf1\xab\x35\x0f\x7d\x5a\x85\x5e\xb8\x03\x46\x5e\xf0\x03\x61\x74\xd3\x1e\xae\x06\x93\xd0\x43\x8f\x84\xd4\x42\x16\x58\xdb\x57\x05\x88\x42\x28\xf0\x2a\x87\xb0\xbe\x13\x92\xbc\x89\xea\xd3\x0d\x2c\xf9\x30\xb8\xa7\xd9\x63\xe0\x18\x11\x29\x09\x65\xd4\x81\x0c\xc7\x10\x88\x8e\x22\x42\xe9\xba\x69\x51\xd1\xa1\x5b\x0d\x5d\xb2\x1d\xb1\xe5\x5a\xbb\xdc\x95\xb2\xc5\x53\x85\x18\x50\x6e\x63\xbb\xc2\x6c\xad\xbb\xf9\xe7\xb0\x04\xd2\x6e\xb3\x78\xa5\x7e\x88\x3d\x66\x0c\x3a\x9f\x87\xd4\x17\xce\x65\x1f\x67\xf1\x5b\x19\x0b\xec\xdd\xd4\x76\x75\xc5\x50\x55\xd4\x72\xd8\xdc\x72\x21\x05\x2f\xa2\xcd\x3a\x4b\x19\xf2\x78\x6d\xef\xa4\x07\xcf\x77\x5b\xce\x96\x28\xdb\xe4\xe8\x46\xb4\x1f\x02\xde\xd7\x8b\x9d\x2b\x7d\x9e\x84\x4b\x29\xeb\x39\x0e\x8b\x9e\xc0\x63\x14\x95\x8c\xae\x2f\x0b\xba\x4e\x17\xa9\x6c\x59\xf8\x0d\x2a\x33\xbd\x1c\xc7\x2b\x54\x64\xe9\x55\x50\x8b\x55\x91\xea\xaa\xbd\x69\x4a\xd4\xef\x74\x31\xed\x6a\x69\x22\xb2\x42\x10\x3d\x30\x8b\x38\xfb\x49\xa7\xc0\xd9\x57\x91\xc1\x91\x85\x35\x02\xaf\x85\x1a\xb9\x11\x64\x81\xab\x44\x95\xe3\x28\xc8\xc1\xf4\x60\x2e\xf3\x74\xd6\x1a\x8a\x2d\xd4\x5a\xf3\xd7\x9e\x84\x90\x24\x59\x24\xf9\xe6\xc8\xca\x69\xd4\xa4\x69\x5c\x3d\xcf\xa2\xc9\xc5\x25\x7c\x01\xd9\x12\x5a\xb8\x80\x1e\x9f\x9f\x00\x10\xbf\xfc\x13\xc3\xc0\xf5\x12\xdb\x98\xfc\x12\xa3\x45\x9d\x51\x41\xca\x23\x41\x7d\x83\x65\x56\xc9\x22\x91\x9d\x36\x8b\xa7\x6a\x14\xe8\x3a\x4b\x37\xb3\xb5\x7e\x29\x3c\x1c\x92\x68\x4e\xbc\x88\xa9\x00\x5c\x47\x14\x53\x0a\x59\xa3\xa1\xd0\x54\x81\xed\xf6\x49\x28\xf9\xb1\x2e\x4a\x3c\x1d\x2b\x8d\xe7\x69\xad\x37\x3d\xae\x99\x80\x2e\x0a\x01\x5c\xd1\x0c\xcf\x31\x2a\xca\x58\x4b\x3b\x44\x0a\x35\x4f\x88\x08\x5e\x1e\x3b\x6d\xf3\x2a\x2b\xb1\x8b\x4b\x5d\xc4\x55\x8c\x69\x50\xe6\xb9\xba\x66\x8f\x39\x4a\x4c\x63\x7d\xf7\x8b\x4a\xa4\xb2\x68\x07\x0b\xbe\x4a\x7b\x27\xae\x73\x0f\xe6\xaa\x59\x5b\x45\x3f\x64\xc2\x56\xc0\x99\xba\xcc\x6a\x24\x72\x03\xf8\x7d\x72\x30\x24\xaf\x53\xbd\xc9\x2b\x55\x6f\x52\xab\xde\x8e\xc0\xd2\x72\x5a\x66\xdb\xed\xb7\x9c\x34\x4b\x5f\xe4\xc1\x20\x94\xfa\x43\x20\xca\x78\xe7\xdb\xed\x5f\x13\x53\x0f\x40\x9d\x28\xce\xbd\xe1\x73\xef\x82\xf9\x0a\x0d\x47\xe5\x3b\x6d\xd8\x19\x95\xda\xc8\x5d\x74\x12\x21\x72\x5b\x4e\x01\xa4\x09\x92\x7f\x99\xb5\xce\x9b\x82\x15\xaf\xae\x54\xa4\xbb\xbc\x6d\xa2\xf2\x68\x4b\x79\xaa\x68\xcb\x6d\x83\x41\x3f\x64\x7c\x6e\x52\x21\x4b\xf4\xdc\x06\x83\x97\xfa\x6c\x6f\xb7\x6a\x5d\xac\x6f\xed\x75\x19\x0c\x50\x1d\x7b\x5e\x40\x13\x54\x6b\x6e\x91\x6a\xfe\xcf\x35\x4b\x98\x2b\x0b\x80\x16\x0f\xe6\x00\xce\x3b\x32\xce\x84\xaf\xf2\xa9\xf7\x89\x47\xf3\x79\xb7\x7c\xc4\x17\x73\xb7\x00\x14\xcc\xd3\xbc\x44\x01\xc7\xe0\xcc\xb5\xe3\xd7\xc2\x4f\xe1\xad\xf0\x08\x3f\x52\x91\x86\x39\x50\xe2\x4f\x07\x32\xb4\x8d\x76\x70\x97\xab\x97\x31\xf8\x60\x41\xc6\x95\xa3\x17\x80\x64\xbb\x65\x8a\xd1\x9c\xd3\x0c\x89\xee\x94\x13\xd2\x8f\x52\xa7\xf6\x39\x96\x89\x98\x9f\x7e\xae\x31\x41\x6e\xf0\x76\xfb\x56\x06\xa7\x77\xa2\xc8\x60\xf0\xed\x37\x35\x46\x6c\xb7\x2f\x47\xad\xd0\xe7\xcb\xef\x13\x4c\x38\x81\xd2\x2a\x90\x96\xdf\x3b\x14\x1f\x73\x6f\xb7\x8b\xe7\x4b\x8d\x87\xf8\x15\x9d\x10\x6f\xb7\xdf\xfc\x25\xb1\x68\x83\x3d\x3f\xce\x30\xfb\x02\xa2\xef\x40\xf4\x2d\x5a\x61\x4c\x9f\xc4\xc8\x10\x8e\x62\x0e\xf8\x86\xca\x7b\x3f\xed\x30\xaf\x89\x84\x15\x46\xa0\x8f\xd2\xe8\xdb\x7f\xb5\x07\x53\xbc\x1f\x0e\x06\xc5\xfe\x3e\xfc\xf3\xd0\x29\x7e\x57\xfb\xde\x0f\x06\xc5\xde\x1e\x2c\xde\x0d\x07\x83\xb0\x48\x86\x00\x96\xb7\xc5\x54\xeb\x00\x55\xa5\xc3\xad\xec\x49\xd6\x99\x36\xea\x31\x37\x33\x72\xb8\x89\x21\x64\xce\x14\x50\xe9\xdd\xa8\x33\x46\x08\x5a\xa3\xdc\xf3\xd2\x3f\xdc\xfa\x39\x6f\x02\x72\x41\xb1\x0b\xf8\x4e\x98\x4a\xd3\x6e\x53\xe9\x32\x6a\x9a\xa1\x1a\xc6\xd2\x45\xc7\x49\xea\xfe\x9a\xcb\x5a\xcf\x7d\xe6\xda\xc9\x84\xe3\xb1\x68\xcb\x32\x70\xf1\x26\x6a\x7e\xe6\xfd\x6e\x87\x5d\xf7\x85\x27\x6d\xd1\xe9\xf0\x21\x8f\x4d\x23\x05\x83\x67\x00\xb5\x31\xab\xd1\x7f\xab\x33\xcb\x54\xdb\xee\xd6\x6b\xaa\x5d\xbc\xce\x54\x9b\x7a\xa6\x53\xc1\x45\x15\x02\xd7\x6b\x4d\x59\x50\x57\x34\x4b\x65\xa6\x84\xe8\xbe\x8c\xd4\x2f\xc7\x03\xf1\x3e\x9d\x7d\xca\x0a\xba\x8e\xfb\x43\x27\x3d\x82\x38\x0a\x22\x4f\xc2\x92\x3e\x08\x13\x57\x6a\x01\x7b\x92\x1c\x78\x12\x22\xc8\x36\xac\x04\x09\xbc\x29\xcb\xfe\x95\xdb\xa6\x59\x6b\x80\x6d\x27\x44\x55\xe1\xfa\x39\x5a\x85\xb6\x93\xa3\x2a\x16\x99\x2d\x4e\xcf\x55\xea\x20\x6c\x57\x5d\x8d\xaf\x4f\xff\x63\x1c\x07\x05\x2a\xf1\x7f\xdb\x1d\xab\x9d\x57\x29\xa4\x94\x65\x57\xa5\x90\xb2\xc0\xcc\x81\xd0\x80\xda\xa8\xdb\x06\x15\xe1\x76\x1c\xe3\x35\xa8\xe0\xdd\x9b\x75\x17\xa8\xdb\xae\x00\xee\x68\xb9\xd3\x0c\x2d\xea\x9b\xae\x98\xc7\x57\x17\x67\x67\x1f\x8e\xae\xee\x3e\x8e\x8f\xae\x6f\xae\x64\xd6\x87\x2c\xcd\xf7\xa5\x43\xcc\x7d\x5a\xec\xaf\x50\x5a\x6e\x0a\x14\xc0\x0f\x47\xc7\x3f\x72\x4d\x4d\x83\xe8\x5d\x0f\x20\xd7\xc1\x74\x29\x5d\x23\xb2\x23\x2b\xa0\x30\x4e\x1f\x9d\x5d\x7c\x1f\x07\x72\x44\xfb\x19\x4e\x73\xba\xdb\x0b\x53\x4e\x4d\x27\xa1\xea\x4a\xe5\x65\xa0\xbe\x3b\xfd\xf7\xf1\xc9\xdd\xf1\xc5\xf9\x64\x7c\x3e\x89\x83\x68\x8e\xbf\xa0\x6c\x9f\xd1\x35\xec\xa9\xbf\xa5\xe1\x16\xf6\x22\x5c\xee\x8b\x12\xd8\x8b\x4a\x86\x67\x9f\x1e\x39\x58\x00\xaf\x27\xa7\xc7\x3f\xfe\x62\x35\x61\x57\x2a\x9b\x95\x1c\xea\x55\x6d\x95\x96\xa3\x2d\x84\x3d\xfc\x59\x47\xd1\x97\x26\x20\xd0\x06\x5e\xb9\x4a\x96\xae\xce\x05\x01\xbe\x8e\x56\x7e\x01\xbd\x21\x8d\xa0\x5a\x7e\x00\xec\x1c\x09\x1f\x68\xf6\x78\xf1\x19\x15\xf3\x9c\x3e\x38\x3e\xaa\x78\x41\x68\x81\x3e\xa8\x56\x84\x0b\x77\x5d\x49\x0b\xbc\xc0\x24\xcd\xf9\xd7\x97\x69\x26\x42\x30\xb4\x1b\x9a\x41\x96\x9f\x71\xc6\x96\xc9\x50\x98\x80\x37\x3e\xd7\xc7\x4d\xcb\x04\xdc\x0a\x4a\x94\x03\xee\x70\x77\x64\xa0\x82\x9b\x86\xbf\xa3\x1b\x37\xbe\xcb\xe1\xd1\xe9\x01\x3c\x7d\x55\x8c\xcf\x52\xa6\x1d\xac\xc3\xe6\x9b\x1e\xbf\x43\x73\x4f\xe8\x78\x27\xb6\x82\xf0\x2a\x8f\x37\x99\x49\x13\x08\xdc\xed\xdb\x6e\x71\x97\xe6\xd0\xd8\x66\xbd\x25\x22\x0d\xd6\xb5\xde\x17\x3b\x66\xaa\x5d\x98\x66\xbf\x6e\x4a\x76\x22\x30\x4c\x04\x3f\x18\xe5\x83\x2b\x1a\x8e\xf7\x0e\x3f\xe9\x56\x5b\xe3\x72\x96\xae\x55\x60\x97\x55\x7c\x25\x08\xa8\x2e\xf6\x99\xee\xcc\x35\xad\x4a\xba\x37\x8b\xec\xa3\x0d\x3d\xd8\x41\x24\x32\x30\xc1\x4b\x43\xfb\x50\xa8\x06\x5b\x74\xd2\x8d\x2c\x20\x0d\x0f\x21\xf5\x41\x4d\x83\x61\x23\x7b\xa3\x9d\x8e\xdb\xfa\x98\x6b\x1f\x1d\x47\x65\x28\x2f\x65\xd5\x32\x2c\xe9\x83\xae\xf7\xc4\x4e\x11\x09\x61\xe5\x93\xe4\xda\x12\xdc\x34\x5c\xfc\x5a\xb8\xcd\x7c\x17\xd3\xb0\x0b\xe3\x1b\x08\xdf\xc4\xcb\xe7\xbd\xfc\x9a\x88\x38\x18\xf4\xfd\x98\x68\xc5\xed\x29\x7a\x33\xd2\x52\xfe\xd7\x1f\xb2\x51\xb1\xeb\x98\xbd\x1a\x0d\x2d\xe9\x77\x3e\x0f\xf3\x48\x89\x02\x1e\x0c\xf5\x79\x01\x7a\x4d\xf2\x0d\x3c\xf6\xa0\xa6\x00\x6a\xe1\x26\x80\xc5\x0b\x1d\xd7\xbc\x47\xe1\x8e\x63\xc9\x47\xce\xef\x04\xe6\xf8\x5d\xdb\xbe\x1d\x9a\xec\xa5\x35\xb8\xd0\x55\x36\x5f\x91\x51\x4e\x72\xd7\x3a\x96\x07\xea\xd5\x74\x19\x56\x83\x15\xc9\x05\xd8\xe1\xf0\xe6\xb9\xca\x50\xac\xce\x2a\xd9\xc5\xd8\x9c\xa2\x26\x6b\xb3\x2b\x3d\x27\xd6\xaa\x6e\xb0\x30\x79\x17\xb2\x51\xe9\xf6\x6f\x3a\x6e\x44\x5c\xc2\xc9\xe1\x5f\xed\x6a\xb7\xcb\x9f\x6e\xe3\xd0\x88\x0e\xa2\x20\x8c\x26\xbf\xe1\x88\xb9\xd7\x64\xb5\x21\xa5\x99\xf2\xb0\xae\x31\xe9\xca\x93\x24\x11\xbf\xc7\x67\xe3\x8f\xe3\xf3\xc9\xdd\xf9\xc5\xc9\x78\xbb\x75\x98\x47\x94\xae\xd7\x88\x64\xc7\x4b\x9c\xfb\x33\xea\xb8\xce\x9e\x02\x2f\xf3\xf4\x31\x09\xee\x73\x3a\xfb\x14\x34\x60\x24\x82\x36\xcd\x58\xca\x61\xa3\xd5\xa0\xd8\xd1\x09\x5d\x27\x43\x88\x07\x83\xaf\x71\x18\xb6\xdd\x7f\xb5\xed\x9a\x6b\x0d\x66\x6d\xc8\x9c\x16\x33\xf4\x9d\xb4\x36\x28\x82\xe7\xb2\xfd\x73\x0f\xdf\xb7\xd3\x84\x83\x27\xd2\x6c\x9b\xb4\xef\x32\x89\x37\xb2\xc8\x65\x6a\xf5\x05\x73\x35\xc2\x87\x6d\x16\xe9\xa1\x2d\x74\x17\xe5\xa0\x0a\xa3\xed\x49\x76\x5e\xce\x75\x91\x56\xc9\x9a\xd5\x2f\x68\x1f\x09\xfd\x45\x92\x24\x44\xb1\xda\xed\xb6\xf6\x26\x76\x8a\x5d\x37\xe3\x65\xca\x19\xb2\xe6\xce\x3a\x8e\x84\xb5\x56\xad\x92\xe3\x77\xf9\xc3\xce\xdc\x2d\x86\xc9\x39\x5b\xae\x35\x58\x1f\xc1\x0e\xf3\xa8\xa1\xf5\x39\xb7\x91\xc2\xec\x84\x8c\xdd\xdd\x9b\x15\x59\xca\xb8\xa0\xd2\xb4\xda\x88\x7c\x1d\x0c\xa7\xd1\x9f\x99\xa4\xc5\xed\x5e\x32\xc9\x43\x27\x28\x33\x8f\xa4\xf2\xeb\x4f\xfe\x62\x53\x41\x91\x03\x26\xb6\x3e\x16\x83\x92\x5f\xcb\xb1\x18\x66\xb3\x73\x18\x1d\xe7\x9e\x50\x82\x9a\xc7\xde\x63\xba\x56\x67\xbe\x8e\x53\xe9\x8e\xbc\xeb\x12\xc4\x5a\x62\xae\xcb\xf4\x95\xa4\x1b\xdd\x15\x88\xf7\x2f\x28\x3d\x07\x16\xae\x05\xaa\xd4\x16\xa5\xbb\xc2\x50\xb4\x6f\xbb\x5c\x1b\xd9\x87\x1e\x4e\x9b\xa3\x68\x4e\x67\xb9\x77\xd4\xac\x54\xa7\x0c\xf7\x71\x45\x60\xd8\x45\xbb\xf1\x26\xbf\x78\x96\x29\x1c\xca\xff\xe3\x20\x18\xd9\xa9\xaf\x3c\x67\xc3\x0c\xee\xe9\x59\x69\x0f\xd7\x6d\x99\x91\x77\xbd\x40\x93\xe1\xcf\x41\x73\x9a\x32\x03\xf0\x79\xba\x42\xc9\x32\xd2\xb6\x08\x4e\xd9\xdb\x0b\xe5\xa6\x52\x68\xd5\x0a\x96\x34\xa1\x8d\xfd\x7f\x91\x9e\x62\xaf\xa9\x5f\x0d\x38\xec\xd2\x0e\x0e\x62\xad\x52\xb4\xbd\x4e\x07\x83\x30\x28\x59\xca\xf0\x4c\xa4\xc2\x6d\x2d\xef\x61\x9b\x27\xc4\xa4\xa6\x1c\xb0\x68\xf1\x37\x33\x5d\xdf\x02\x34\x39\x5c\x5f\x67\x22\x93\xee\xc7\x3a\x6b\x8e\xcc\x44\x66\x45\xb1\x59\x52\x9d\x8f\x9d\xb0\x1d\x69\xf4\xab\x46\x62\x90\x06\x3a\xd5\x78\xd4\x85\xf6\xae\x37\xb9\xb4\xe0\xbb\x5c\xd4\x3d\x5b\xa1\xc8\xb1\xcc\x42\x50\x7d\x5d\x2e\x8f\x65\xfd\xbc\xc0\x4b\xe6\xde\xc5\x4a\xc5\x13\x02\x54\xe7\x45\x50\x23\xe2\x47\xd5\x96\x1d\xfd\x84\xb2\x29\xca\xc8\xd7\x6b\xde\x77\xdd\x0c\x46\x33\x11\x27\x25\xa1\x46\xfd\x0e\x91\x78\x30\x60\x46\xa7\x72\x49\xf0\x5a\x1a\x75\xce\xd0\x5c\x77\xef\xca\xc4\x22\xee\x0a\x74\x89\xda\x83\x41\xff\x99\x86\xaf\xf8\xb8\x76\xb4\xac\xe8\xa3\x4b\x6c\xdb\x14\xb2\x7b\xd0\x41\x8b\x6f\xb4\xbb\x0f\x02\xd1\x8d\x6b\x1d\x69\x2f\xbf\x2b\xc3\x76\xc4\xa2\x8d\xba\xb4\x0e\x16\xe5\x68\xce\xf6\x58\x24\xbc\x67\xdf\xa9\x27\xb8\x30\x21\x48\xce\xd7\xaf\x72\x18\x53\xe0\xb5\x53\x1e\x1a\x06\xbf\x63\xbc\xc6\x3a\xe0\x1f\x11\x3f\x55\xb3\xc8\x31\x8b\x36\x1d\xd3\xc5\xeb\x42\xfa\x2e\x4f\x5c\xad\x7a\x96\x0f\xca\x04\x1b\x32\xef\xa7\xaa\x50\x2e\xc2\x9c\x48\x60\x9d\xe5\xdb\xad\x82\xa5\xf7\x0b\xb8\x4e\x8b\x12\x7d\x97\xd3\x94\x85\x05\xd8\x63\x1d\x58\xc1\x09\xd8\x2c\x72\x0d\xb2\x2f\x1e\xfc\x2a\x2d\x16\x98\xb4\xc7\x2e\xcb\x7d\x43\x77\x6a\xcc\xc8\xdd\x52\x67\xe0\xfb\xbb\x07\xee\x1a\x8b\xff\x37\x0d\xbc\x7b\xc5\x55\x66\x2d\xf7\x10\x78\xb0\x81\x4b\x12\xc6\x17\xc1\x8f\x12\xba\xda\x8b\x17\xe4\x59\xbc\xc0\x60\x6f\x07\xc1\xa8\x29\x86\xf7\x68\x3c\x8b\xf3\x56\x1e\x36\x71\x17\xec\x1b\x24\x18\xf9\x82\xc3\xb0\x8a\x62\xf2\x0d\x1f\x03\xdb\x90\xd2\x6c\xce\x8b\xcf\x7b\x01\xec\x05\x7b\xcf\x21\x8b\x7f\xb8\x0d\x8c\x78\x76\xb4\x2e\x46\x34\x06\xeb\x36\x56\xe9\x88\x8b\xdd\xfb\xe8\xef\xd4\xf5\x54\xf1\xac\x13\xdb\xbd\x4e\xca\x98\xe2\x12\xc3\x1d\x94\xda\x27\x41\x8e\x98\x23\x34\xb6\x6f\xbb\xe0\x0e\x63\x05\xd0\xcf\x4a\x75\xd1\xff\x48\xe4\x1b\xd9\xd7\x8c\x57\x0c\xd0\xa4\x78\x70\xda\x55\x12\x8c\x6a\x17\xa2\x67\x62\xcd\xe0\x0b\x1e\x61\x28\xdb\x8f\x30\x68\x0b\x5d\xe1\x58\x99\x70\xc3\x3d\x15\x3c\x1f\x80\x56\x3f\x19\xa4\xe2\xc9\x0a\xcf\x33\x0e\xea\xba\xb1\x7c\x9d\x8f\x5b\xf9\x4a\x1f\x37\x0e\x1f\x12\x25\x3d\x15\xe2\xe2\x47\x24\x73\x5e\xd2\x07\x5e\xfc\xbf\x36\xea\x6c\xd6\xe9\x9d\xa0\x3d\x9d\xe4\xc2\x3e\x17\x42\x56\x28\x67\xa7\x42\x38\x3b\x8d\x2c\xc7\x95\xe6\xb6\xd7\xe1\x63\x6e\x52\x2b\xd2\x95\xd4\x6a\x14\x1c\x05\xda\x61\xdb\x04\xbd\x05\x47\x57\xe3\x56\xb1\xf0\xb0\xf2\xc5\xc2\xa5\x72\x28\xf2\x3a\x45\x5c\x72\xb9\x7e\x10\xfe\x2b\xab\x54\x7d\xa0\xfc\xc4\x1c\x8a\x8d\xdb\x09\xc8\xb1\x65\xcf\x01\xa3\xcd\xae\x57\x33\x64\xb8\x82\xed\x6d\xd1\x06\xf7\x7a\x5b\x6c\x5e\x1b\x18\xd7\x6e\xb7\x82\x9b\x2a\x04\x6e\xd6\xfb\xaf\x09\x8c\x63\x94\xe6\x0c\xaf\xcb\xaf\x09\x8c\x53\xdf\xca\x27\x2f\xee\xcb\xc8\xfc\xb6\x9f\xbe\xb0\xe3\xe1\xc2\xff\xdc\xfe\xed\x6f\x25\xb8\x2f\xf7\x15\xe8\xdf\xfe\x76\xbd\x17\xc0\x60\x11\x08\x9f\xcc\x94\xe0\x95\xf0\x60\xb1\x9c\x35\x18\x5a\xad\xb9\x9a\x13\xeb\x53\x0f\x19\x66\x39\x6a\xa5\xa0\xb2\x03\x9c\x94\x35\xa4\xfe\x24\x43\x79\xfa\x58\x87\x44\x49\x4a\x04\x02\xb8\x64\xab\xdc\x76\x0c\x51\xe7\xc2\xf7\x46\x46\xed\x92\x6c\x2a\xad\x1e\xfd\x41\x57\x20\x80\xca\x81\x13\x15\xed\x01\xd7\x6d\xcf\x53\xce\x72\x66\x9f\x2e\xdb\x7d\xa4\x22\x9b\x8a\xf4\x9e\x38\xba\x99\x5c\xc4\x41\xba\x61\x54\x04\x8f\x89\xc8\xb1\xc6\x2b\x1c\x8d\x18\x32\xe7\xbd\x0e\xe1\x0c\x51\x2f\x71\x7f\x58\xaf\xed\x9b\x77\x19\xfe\xdc\x13\xbc\xab\xde\xd5\x5e\x41\x73\x54\xff\x7c\x6f\xc3\xa4\x45\x41\x1f\x82\xf7\xef\xde\x66\xf8\xf3\x7b\xcf\xc7\xfb\x42\xfb\x30\x00\xe2\xdf\x37\xf5\xbe\x88\x0c\xd3\x3d\xe9\xe6\xa6\xf7\x53\xef\xd2\x50\xee\x8a\x48\x06\xa9\xb6\xa3\x7f\x60\x2f\xbf\x98\xb5\x09\x7d\xab\x17\xb8\x7f\xe0\x5b\xc8\x79\x8e\xd7\x32\x64\xd0\x0e\x48\xbc\xb8\x99\xc4\x01\xdd\x30\x19\x99\x67\x07\x66\xe2\x56\x60\x26\x76\x02\x33\x71\x23\x30\x13\xc3\xd3\xf3\xeb\xf1\xd5\x64\x7c\x12\x07\x98\x94\xa8\x60\x48\x3c\x47\xe2\x86\x6b\xe2\x96\x1f\x90\x29\x13\x43\x11\x85\x7c\x3c\x5f\xf7\x24\x8a\x88\x06\xec\xf4\x81\xb9\x4b\x9e\x26\x17\x17\x67\x93\xd3\xcb\x38\xa8\xcf\xa8\x2a\xba\x3b\x3d\x3f\x17\x5e\x25\xee\xce\xc1\xa3\xab\x2b\xde\x44\x24\x77\xba\x82\x8b\xe4\xe9\x87\x8b\x9f\x38\xa4\x7a\xa1\xc6\x79\xdf\xcd\x9d\x2e\xfc\x78\x74\x7e\x73\x74\x16\x07\xab\x94\x6c\xd2\x3c\xa8\xe0\xaa\xf3\x71\x0e\x54\xdf\xe4\x8e\xa5\xbf\x7d\xed\x54\xc0\x54\x9a\x6d\xfd\x5b\xf4\x2c\x9e\x03\xa8\x95\x6f\x99\xb0\x7d\x22\x31\x2b\xd1\xe1\x32\xed\x00\xc5\x86\x83\xcb\x33\xe1\x8a\x0c\x3b\x97\x7f\x25\x6a\x45\x1c\xae\x7c\x8f\x68\xac\x22\x19\x33\xe0\x7b\x82\xa2\x9e\x5d\x05\x57\xda\xe5\x76\x27\xe0\x01\x07\x94\x5c\x56\x97\xed\x02\x6f\x14\xd4\x1f\x77\x64\x48\xd6\x80\xa0\x4e\xa6\xa0\xf2\x4c\x38\x21\x42\x5c\xae\xf8\x71\xfc\x8b\xb4\xe3\xba\x66\x44\x93\x36\xcb\x7e\x87\xab\xd1\x40\xf3\x9b\x3a\xac\xef\x44\xbd\x55\x5e\x07\xf6\x75\x76\x20\xd2\x8d\xe2\xc6\x66\x47\x33\x69\xe8\xf4\x97\x73\x70\x5c\xfe\x8c\xd9\xf2\xc8\xae\x0c\xc1\x21\x8e\xee\xc4\x89\x0a\xc5\x06\x63\x10\xe3\xe8\x4e\x1c\x24\x5d\x60\xbc\x78\x95\x2d\x6e\x81\xd8\x04\xaf\x4d\xb8\xaa\x65\xb4\x9b\xab\x7c\x46\x8e\x01\x53\xcc\xcf\x6a\x50\x4a\x56\xfa\x06\xcf\x74\xcc\xd4\xbb\x94\x2b\xdf\xe5\xb8\x9b\x84\xde\x3e\x0c\xbe\x97\x13\x9c\xbb\x70\xdf\xe6\x19\xab\xac\x73\xb7\xd3\x02\x1f\xff\x34\x3e\x9f\xf8\xe1\xeb\x18\x24\x25\xff\xc9\x10\x00\xd7\x63\xb2\x3e\x3c\xc6\xd2\xc9\x70\xfb\x22\xa1\xc6\x59\x3b\xc9\x4c\xfb\xd1\x1c\xeb\xb8\xb7\x5e\x68\xd0\x07\xfe\xb7\x87\x20\xba\xe4\xa1\x2e\x69\xf9\x0e\x68\x9a\xc0\xb7\x6c\x77\x06\x3c\x79\xab\x94\x98\x17\x6c\xdc\x07\x6c\xd4\xdd\x53\xd0\x7e\xd1\x3a\xb8\xcc\x51\x5a\xa2\xde\xa6\x44\x3d\xde\x43\x8f\x92\x9e\x92\x4c\x7b\xaa\x8d\x32\x68\xba\x7b\xb5\x77\x51\x3c\x3c\x6d\x7c\xee\x45\xbd\x3c\x09\xc7\x94\x30\x81\xc2\xb5\xa7\x8e\xa6\x01\x4f\xcd\xa1\xd6\x1e\x39\xe6\x9e\xd9\x04\xa3\xd8\x90\x11\x7d\x20\xa8\x38\xe9\x30\x12\x3b\x8b\x2b\x53\xe7\x76\x48\xe9\xe6\x1a\x40\x49\xfa\xbe\x93\x07\x73\xa9\xbf\xdc\x9c\x9e\xb4\xa7\x7d\x7e\xf4\x71\x0c\x46\x69\xe3\xf6\x0e\x67\x01\xd4\x6f\xd3\xec\xb8\xdf\xcb\x50\x39\x2b\xf0\x3d\xca\xee\x1f\x6b\xf8\x52\xb0\x05\x66\x79\xf9\xa8\x6b\x12\x23\x44\xa9\xcc\x92\xe6\x82\x63\xae\x9c\x1c\xf8\x14\x96\x49\x57\xb0\x9d\xce\xb0\xa3\x85\x94\x43\x6f\xa9\x4a\xbd\x21\xf2\xab\xb8\xcb\x18\x7b\xe1\xa1\x95\x12\xf0\x88\xb1\x74\xb6\x14\x8b\xb6\x54\xa4\x27\xcd\xb2\xba\x54\x05\x66\xe8\xcc\x7a\xfd\x03\xfd\xd8\x87\x6a\xd4\x08\x55\x87\x8e\x61\x41\x07\x3d\x36\xa1\xc0\x48\x2c\x43\x66\x08\x92\x97\x81\x30\xf9\x3e\xe3\xd7\xa3\x11\xa7\x25\xdb\xad\x5c\x71\x73\xa7\xd6\x26\x55\x1a\x73\x3b\x0e\x86\x16\xd7\xbc\x01\xe8\x0e\x39\x4d\xa1\x15\x88\x38\xf3\x44\x1d\xea\xff\xed\x45\x91\x45\x95\x8a\x47\xbc\x47\xcb\xf4\x33\xa6\x85\x03\xd2\x92\x52\x2b\x28\xa4\xac\xf8\x49\xf5\x1c\xdf\x45\x42\xfc\xaa\x2a\x48\xc9\xb1\x30\x34\xc5\x6e\xd0\xb1\xf6\x8e\x35\x4d\xf4\x93\x04\xd5\xb8\x30\x18\x98\x37\x94\xa5\x3a\x67\xe0\x8e\xc5\x9b\xa3\xe2\x49\x12\x4a\xe4\x0d\xbb\xd3\xf4\xf3\xdf\x09\x8b\xa2\x8b\xf4\xf2\x56\xef\x37\xc7\x94\x75\x87\xdc\x8f\x64\x8e\x07\x27\x41\x5c\xfb\x2c\xb2\xe8\x6e\x8e\xbf\xd4\xf7\x61\xd6\xbb\x99\x16\x2f\x19\xb1\x36\x67\xe1\x82\x47\x1b\x7f\x3a\xa8\xea\x39\x80\x24\x49\x92\x4d\x74\x71\x33\x11\x9d\xda\xbc\xfe\x45\xd7\x7f\x82\x29\x5a\x42\x84\x73\xf3\x27\x2a\xbd\x77\x7e\x8b\x8e\x3b\x3f\x1a\xdd\x59\x90\x27\x37\x57\x47\xfc\x0f\x10\x2f\x42\x29\x5f\xec\x70\xf1\x54\x86\xa1\x16\xa1\x2d\x9e\x63\x2f\xc2\x95\xb3\xe5\x58\x54\xaf\x6b\x9f\x2f\x10\x5f\xad\xc1\x00\x3b\x5e\x5e\xf6\x2f\xc7\x50\x89\x85\xdb\x11\x17\x7c\xc8\x04\xaf\xe5\xd2\xf0\xa2\xdd\xce\x58\x36\xe1\x06\xc2\x43\xa9\x9d\x39\xd2\x3f\xfc\x93\xf1\xb9\xc9\x22\x40\x6a\xb1\x81\xf8\x64\x06\x75\xb1\xdb\x45\x69\x0a\x00\xfd\x29\x36\xb6\xdb\x50\xd8\x98\xec\x2b\xe5\xdf\xed\xb8\xec\x0a\xc1\xf4\x88\x4a\xb7\x0b\x69\x34\x9c\xd6\xae\x2a\xcd\x7a\xa1\xd2\xed\xa8\x17\x0a\xa0\xa8\xff\x7a\x1c\xc7\x5f\x79\xa1\xed\x53\x01\x01\xc7\xee\x76\xfa\x88\xaf\x49\x0d\xb1\x72\x45\x24\x8f\x31\xce\x79\xf9\x44\x9c\x17\x26\x9f\x16\x80\x2b\x0f\x73\x6d\xbe\xcd\xef\xd5\x23\x0c\x09\x0d\x6a\x8b\xd8\x7e\xb0\xc7\x44\x9b\x0e\xb4\x67\x3c\x46\x26\xd5\x7f\x18\x0f\x2e\x9d\x25\x5a\x59\x77\xea\x88\x0d\x86\xd7\x42\x78\x35\x72\x4d\x67\x4e\x85\xe6\x50\x47\x5a\x20\x52\x45\x5a\x2e\x62\x32\x38\xe4\x2e\x72\xac\x09\x6a\xb3\xac\x45\x82\xac\x71\x06\x38\x3a\x88\x58\x3c\x75\x1c\xd4\xb8\xdc\xe6\xbb\x9f\x30\x52\x53\x5c\xb2\x55\xde\x7e\xf5\x82\x08\x9f\x79\xed\x35\xba\xdd\x12\x95\x48\x11\x1c\x62\x91\x82\xaf\x7e\x71\x0a\x97\x21\x03\xdb\x2d\x8b\xd0\x6a\xcd\x1e\x43\x2d\x57\x84\x04\xc4\x2c\x62\xe8\x0b\x0b\x65\xf2\x40\xf1\xfe\x15\x88\xd9\x2d\x3e\x0c\x78\x9f\x41\x1c\xf0\xb2\x40\xdc\x15\xe8\xbd\x62\xbe\xf7\xd9\x1d\x19\xc7\xf3\x9e\x83\x66\xe4\xfb\xc2\x0a\x16\x18\x83\xbf\x78\xa7\xf1\x39\x09\x52\x7c\x73\xd8\x2a\xa9\x25\x47\xbf\xc8\x28\x80\x00\x64\x7c\xe4\xae\xb4\xe8\x0b\x93\x59\xde\x32\x37\x41\xf1\x54\x7c\x67\x9b\x44\x76\x39\xde\xe9\x3e\x95\x6e\x5e\xae\x73\xcc\xc2\xa0\x17\x80\x68\x4e\x8b\xb1\x7b\x3b\x2d\x2d\xd8\x26\xa0\x9e\x00\x87\x2f\xf3\x51\x79\x48\xb9\xcc\xc9\x62\xe4\x01\x6d\x34\xf4\x7b\x16\xaa\x2c\x2c\x48\x3f\x8d\xd8\xc3\xf3\x90\xf4\x93\x64\x11\x49\x93\x95\x46\x32\xce\xe0\x15\xbd\x3b\xf4\x75\x6a\xd9\xe8\x7c\xd5\xda\x01\xb5\x7c\x59\x43\xd2\xa4\xd7\xd9\xd0\xc5\xcd\x64\xd4\x5c\x09\xfc\xd2\x19\x2b\x93\x83\x7e\x79\xaf\x7c\xf1\x77\x52\xaa\xe1\xdf\x55\x4e\xe7\x1e\x4b\x00\x69\x1a\x02\x3c\x4f\x52\x6a\xc7\xd3\x3a\x64\xa5\x31\x0c\x1b\x8f\xbd\xf9\x6f\xe6\x78\x01\x9f\x8c\x09\x59\x99\x16\x2d\x9b\x7d\x60\x5c\x5a\xb9\x14\x28\x09\x8f\x40\x55\xfd\xd3\x83\xa6\xd6\x99\x7a\xcd\x21\x0d\x77\x7c\xa1\x60\xb6\x5b\x7d\xfb\xc0\x59\x91\x89\xdf\xf2\xeb\xa0\xbe\x5e\xe0\x8b\xfa\x08\x76\xea\xb6\xaa\xa5\x20\x90\x6c\x4a\xe2\xc2\x4e\xaa\xda\x52\xdb\x46\x21\x49\xa4\x73\xb0\xd7\x34\x87\x01\x30\x89\x49\xfe\x08\xd3\x9f\xcc\x6a\xc2\x64\x14\x94\x2b\x8f\x18\x4b\xba\xc9\x9f\x71\xa8\x44\x98\xb8\x16\x55\x86\x52\x28\x7c\xd6\x84\xc7\xb9\x84\x2d\x5c\x68\xf1\xf5\xd0\x2d\x96\x85\x71\xe8\xd8\xe7\x88\x65\x9c\xf3\x81\x43\xa2\x71\x5d\xdc\x70\x70\x19\xd3\xfe\x2d\x8c\x49\x87\x75\x23\xde\x57\x25\x1b\xe2\x75\x52\x8b\xd7\xc4\x3c\xcc\xe0\x69\x16\xc4\xba\x5a\x22\x80\x38\xd4\xff\x6f\x21\x00\xdd\xb0\x9d\x18\x70\xa0\xc2\x19\x3c\xa6\xe0\xed\xf6\xe5\x1b\x79\x71\x33\x79\x6e\x1f\x39\x81\xfb\x9a\x7d\x14\x7a\xa4\x76\xaf\x6d\x6d\x23\x2f\xb6\xbd\x6f\xf9\x36\x7a\x66\xe3\x5c\xb0\xa8\x84\x3a\xac\x87\x75\x98\xab\xb3\x72\xf5\x03\xc3\xee\x82\xb2\xa9\xb2\xc1\xf5\x87\x4a\x0e\x91\x77\x10\x3b\xa3\x8c\x9a\xaf\x80\x85\xaf\xcb\x5e\xd6\x4e\x5e\x06\xf4\xf2\x86\x44\xfe\x95\x3c\x89\x88\x7d\xf5\x0b\xf2\x85\xd0\x3f\x2a\xcf\x2b\x64\x44\x0a\x38\xe2\x7b\xf1\x57\xa2\xfe\x8f\x18\xbd\x16\x24\x39\xf4\x3d\x5e\x26\x96\x9d\xc9\xc7\x46\xcc\xdf\x89\xf9\xcb\xf9\xf8\x2b\xd3\xab\xad\x3c\xb8\xdf\x66\x4a\x4f\x95\x31\xdb\x4a\x44\x30\x09\x92\x90\xd9\x4f\x55\xd1\xd5\xe3\x2d\x9a\xf6\x1d\x8b\xde\x2d\x9a\x72\x0e\x74\x8b\xa6\x8d\xd2\x5a\xe0\x14\xc3\x73\xd4\xef\x17\x6b\x07\x90\x24\x4c\x65\xd1\x16\xd7\xc0\x01\x88\x56\x29\x9b\x2d\xc3\xd4\xbc\x25\x40\x38\x86\x5b\xef\xee\x38\xea\x00\x89\x7e\xa5\x98\x84\x86\x4d\xed\xb0\x40\x79\x32\xe4\x37\x4d\x06\x5d\xe6\x4e\x9f\x75\x94\xd5\x36\x33\x50\x0b\x0b\x46\x01\xed\x90\xe7\x9b\xd6\x12\x92\x78\xad\xc3\x62\xee\x82\x34\xb9\xdc\xfb\xcb\xbe\xe9\x34\x50\x89\x35\x9b\x26\x02\xa1\x2d\xfb\x6d\xce\x46\x3d\x97\x04\x41\x99\xaa\x05\x8d\xef\xf8\x80\x80\xdf\xfc\x16\x21\x69\xbb\x7f\xe9\x8b\x64\x00\xb1\x27\x73\xd9\x60\xc0\x44\xc2\x1f\xb2\xdd\xf6\xdf\xaa\x0b\x2e\x37\xab\xb8\x88\x6c\x36\xac\x43\x3d\x34\x88\x3d\x9e\x5f\xe6\xc6\xba\x23\xbf\xd9\x1f\x91\xe0\xec\xef\xf1\xf8\xdd\xcc\x00\x9e\x1f\x7d\x1c\x77\x41\xb1\xba\x39\xc5\x90\xbb\x06\x61\x2d\x95\xf9\x46\x68\x11\x5d\x4d\x67\x35\x98\xbe\xf8\xeb\x02\xc5\xaf\xc9\x04\x94\xb7\x5f\xf5\x53\x8e\x4c\xab\x97\xb9\x47\xad\x5e\xfb\x26\x5e\xbb\xdd\x0a\xae\xaa\x10\xc0\x3b\x4f\x32\x9a\x35\x5d\x2b\x8b\x99\xf4\x5a\x32\xbf\xeb\x84\x34\x65\x87\xd7\x92\x02\xb5\xbc\x96\xdc\x7c\xfb\x73\xc3\xdd\xac\x9b\x03\xed\x9a\x63\x54\x17\xe5\x24\xa1\x18\x4b\x1c\x04\x1d\x8e\x38\x7a\x60\x2f\x77\xc4\x59\x7e\xdb\xf8\x76\x7f\x89\xd2\x4c\x3a\xe2\x2c\xbf\x7d\xef\x69\x7c\x5f\x18\x16\x5d\x3f\x9d\x0a\xc0\xdc\x3f\x2d\xbe\xeb\xf0\xc9\x0c\xbc\xdb\x05\xab\x12\x09\xcf\x77\x65\x65\x99\x9c\x4e\xce\xc6\x71\x10\x35\x06\x0a\xeb\x1c\x28\xce\x08\x85\x07\x8f\xed\xa7\x43\x5a\x7e\x3a\xc4\xf1\xd3\x21\x0d\x3f\x1d\xe2\xf5\xd3\x21\x0d\x3f\x1d\xe2\xf1\xd3\x21\x5e\x3f\x1d\xd2\xe9\xa7\x43\x3a\xfd\x74\x88\xf3\xa6\x1f\xb6\x3c\x61\x32\xeb\xa8\xc9\x1c\x94\xea\xe6\xaf\x58\x08\x53\x70\x09\xe4\x1b\x72\x15\x0d\x33\xa8\xae\x64\xe7\x49\xd6\xf6\x40\x99\x3f\x6b\xc7\x6c\x98\xe6\xf4\xdb\x74\x0b\xeb\xb2\x93\xef\xf8\xef\x61\xd2\xd4\x3b\x28\x4d\x9a\xf3\x3f\xcc\xa4\x39\xff\x03\x4c\x9a\xb3\x48\x60\xa8\xcf\x94\xf9\xcc\x77\xda\xfb\x1f\xb6\x17\xb6\x69\x07\x5d\xd6\x76\xd0\xa5\xb6\x83\xce\xed\x4f\xba\x16\x69\x87\xb1\x42\x9d\xce\x40\xa4\x79\xdc\x6d\x3f\x54\xa0\x87\x9e\xb2\xe7\x6c\x88\x0a\x4c\x8e\xf7\x77\x96\x1a\xcb\xaf\x90\x1a\xdb\x2f\x47\xfc\x56\xf9\x46\x53\x5f\xbf\x7c\x63\x65\x66\x55\x32\x8e\xbc\x2d\xda\x25\xe3\x64\xdd\x32\x4e\xcd\x93\xfe\x9e\x32\x4e\xf6\xf7\x78\xe0\xf7\xf7\x96\x71\xf4\x52\xbd\x4c\xc6\xd9\xbc\x5c\xc6\x21\xaf\x97\x71\xb2\x2a\x9c\xb7\x84\x9c\xbf\xfb\xe3\x28\x1e\x1d\x52\x3d\x30\x58\xae\x1f\xb9\x98\xa3\xc5\x1a\x6c\x5e\x87\x38\x18\x42\x89\x20\xda\x9f\x58\x46\x0a\x8b\x77\x7f\x69\xfd\x86\x84\xd2\x91\x0d\xac\x71\xc1\x56\xd0\x9e\x67\x80\x53\xf5\xf8\xed\xd1\x64\x1c\x07\xc2\xbc\x90\x32\x61\x19\xb6\x46\x24\x03\x63\x62\x35\xc8\x46\xa5\xf3\x5a\x73\x1c\xe4\x34\xcd\x1c\x08\x3b\xa5\x5c\x9e\x3c\x9d\x5c\x5d\x5c\x8a\xfc\x04\xa7\x93\xf1\x47\xeb\xbd\x10\xcc\xd0\x4a\x3e\x3c\x22\x6a\xe5\x63\x1f\x8d\xb7\x3e\xe4\xf3\xa0\x6a\x98\x48\x3a\x59\xcb\xe7\xa5\x2f\x7f\xd1\xe9\xde\xca\xf5\xa3\x79\xae\x71\xfa\xc6\x7c\x12\xa9\x6f\xe0\xf9\xd1\x4f\x77\x67\xa7\xd7\x93\xbb\xef\xaf\x2e\x6e\x2e\x65\x76\x36\xd8\x8b\x72\x5c\xb2\xfd\x45\x41\x37\x6b\x0d\x72\xfe\xe3\xb5\xac\xdd\xcf\x31\xf9\x24\x4b\xf5\x5b\x22\xbc\x54\x0e\x58\x34\xa5\x8b\xeb\x46\x1a\xd3\xb1\x9e\x1f\xb1\xe6\xd8\x7a\x99\xa4\xb1\x06\x2a\xd9\x9d\x05\xa0\x42\x38\x84\x40\x76\xf1\xdd\x77\xd7\xe3\x49\x1c\xc8\xbd\x0f\xe0\xe5\x85\xbc\x9d\x8d\x83\x35\x95\xda\x70\x67\xa6\xb9\x96\x21\xd1\xcd\xb9\x60\x92\xca\xc9\x65\xd4\xfc\x3f\xf8\x70\x71\xf2\x8b\x32\xdd\xc9\xc0\x8f\x43\x19\xba\x1a\xbf\xf4\xd1\x62\x6d\xfb\x77\x53\x89\x4b\xe4\x54\x4c\xd5\xac\x3d\x17\xd8\xf7\xba\xe1\xea\x75\x7f\x06\xd0\x5d\x6d\x9d\xac\x4e\x65\x45\xbf\xd5\xa9\xf1\xe4\x27\x56\x81\x32\xb4\xc9\x78\xfc\x56\x1e\x20\x19\x44\x9d\x0c\x4d\xf0\xbc\xb3\x52\xe2\x86\x25\x55\xe1\x64\xbe\x04\x4d\x38\xba\x5b\x17\x74\x86\xca\x52\xe6\x2b\x13\x6d\x14\x68\x5e\xa0\x72\x59\xbb\x3c\x2a\x08\xa0\xb2\xe5\x11\x5f\xb6\x3c\xf5\x51\x67\x0a\x79\xcf\xe8\xcc\x4d\xbb\x53\x1a\xc9\xad\x3c\x9c\x45\x06\x8f\x66\x91\x44\x31\xce\x4f\x05\xd1\xd1\x4e\x67\x7a\x9d\x25\x95\x39\x24\xb1\xa7\x14\x16\x09\x4e\x92\xa4\x6e\xae\x7e\x7e\xf9\x5a\x27\xde\x09\x41\x3c\x1c\xbd\x74\x43\x9c\x85\x6f\xb4\x25\x4b\xc5\x53\x0e\xed\x17\x87\x35\xd2\x01\x2e\xae\x58\x19\x3e\x4c\xac\x15\xdd\x99\x55\x1a\xcf\x43\xaa\x82\xac\xa8\xca\x28\xad\x9f\x17\x26\x9d\x91\xdf\xe2\x8d\x18\x11\xfe\xb7\xdd\xa6\x91\x7c\x68\x5c\x99\x6a\x6f\xc5\xa3\x72\x78\x1a\x82\x88\xd1\xf5\x5e\x01\xa9\x79\x4c\x41\x38\xab\x9a\x77\xaf\x7d\xe2\x50\x05\xa2\x92\x16\xcc\x8e\xf9\xb4\xee\x00\x6f\x87\xd3\x7d\x74\x3b\x9c\x56\x9e\xbb\x5a\xe9\x2a\xa6\x96\x59\xbe\x99\x8d\xc4\x6c\x98\x59\x6b\x5d\x7a\x30\x55\xd9\x48\x5e\x9f\x04\xac\x66\x0b\xa0\xf3\x68\xcc\xe7\x61\x10\x35\x60\x5d\xf2\xd3\x3a\x6e\xe3\x76\x45\x3b\x53\x98\x21\x2e\x56\x99\x46\x2b\xdb\x6f\x59\x21\x56\xdb\x43\x79\xf7\x59\xd7\x19\xbf\x3a\x6c\xeb\x5c\xdc\x33\xf7\x87\x5e\xc3\xba\xb8\x18\xd1\x69\x89\x54\x3a\x14\x64\x25\x2a\x92\x92\x35\xce\x02\x30\x92\x0f\xf6\xd5\xae\xb3\xf2\x4e\xac\x05\x28\xde\xee\xd3\xe5\x49\xf0\xa7\x60\xaf\xd0\xa8\xe4\x37\x78\x53\x9d\x36\xcc\x3e\x85\x5d\x2a\x4b\x63\xed\x93\x44\x51\x08\x1f\xf1\x58\xa7\x0b\xf4\xcb\x85\xe5\x5c\xd9\xa8\x37\xb9\xb6\xdc\xde\xd5\xd2\xbe\x68\x00\x4e\x92\x8b\xed\xf6\x63\xca\x96\xd1\x2a\xfd\x12\x36\xa2\xd0\x2d\x20\xd8\x99\x09\xc3\x86\x32\x91\xc4\x72\xf8\xaf\x19\x52\xbd\x26\x76\x0a\x07\xd9\x82\x77\x19\xba\x02\x85\x25\x81\x10\x03\x51\x54\xbf\x2b\xe3\x87\x4b\x3e\x5d\xb6\x27\x91\x1d\xa2\x4e\xea\x48\x7c\x4f\x78\xec\xa1\x7d\x03\x6f\x2f\x81\xfd\x16\xb3\xbd\x5e\xfd\x24\xd1\xb9\xdf\x2c\x8e\xf5\x3e\x71\x2f\x26\xf5\x31\xbb\x75\x7e\x99\xac\xec\xd3\x51\xfb\xe4\xf5\x93\x04\x6b\xb7\x2f\x2d\x87\x86\x56\x70\x47\xfb\x8b\xc1\x80\xbd\x73\xce\xf9\xed\x70\xaa\x5b\xa8\x4b\xde\x0f\x81\xb3\x85\xed\xd3\x6e\x85\x81\x88\xeb\xc5\x10\x8c\xf4\x0d\x4e\x99\x38\xcd\x99\xa7\x2c\xf6\xf7\x47\xc0\x3b\x05\x77\xf6\x25\x1f\xcf\x7b\xb7\x0d\x51\xe8\xd5\x0d\x1b\x60\x7b\x07\xd3\xed\xb6\x39\x43\x5e\x0a\x5a\xcb\xd4\xec\x55\xe5\x3e\xd0\xf5\x9e\x4b\x18\x67\x15\x8c\xfc\xa6\x66\x6f\x85\x16\x19\xb2\xaa\x3d\x81\x60\x00\x46\x24\x21\x2e\x2f\xad\x99\x10\xda\xd3\xb9\x99\x15\x55\x92\x9a\xec\x14\xbe\xd9\xe3\x55\xcb\x02\xcd\x4d\xd9\x9b\xaa\x7e\x32\x53\x1b\x07\x60\x00\xc0\x08\xd7\xd7\xfd\xb9\x2b\xc0\x81\xc3\x10\x1b\x8f\x96\x5a\xb8\x53\x39\x8f\x2d\x69\x4f\xe5\xea\xaf\xed\x5b\x79\x24\x55\x01\x00\xb1\xa7\x10\xc4\xa1\xaf\x18\x6a\xef\xd7\x32\xd4\xa2\xa9\xd6\x1c\x80\x08\x79\x0e\x5d\x89\xb5\x21\x9a\x76\x74\xff\xa2\x26\x55\x03\xc6\x81\xd4\xea\xc8\xd7\x6c\x27\xbf\xd5\x3e\xaf\x69\xa4\xd5\x3c\x4f\xc6\x41\x99\xf4\x86\xef\x7e\xe3\xd5\x7e\x57\x82\xd2\xa2\xc9\x52\xf7\xea\xd8\x77\xcc\x58\x2a\x48\x7e\x9b\x75\x07\xb7\xad\x3b\xb6\xb4\xe0\x7b\x79\x47\xdd\x5f\xd5\x71\x6d\xc4\xff\xea\x8e\xdb\x96\x88\x53\x7b\x45\x7a\x02\xfc\x4a\xeb\x0d\xb6\xad\x37\xe4\x0f\xb7\xde\x60\x61\xe4\x20\x4e\x1e\x02\x2b\x89\x5f\x1a\x39\xba\x3a\xf4\x79\x20\x34\x9e\xf4\x59\x46\x5a\xbf\x56\xf6\x3f\x45\x00\x09\x27\x80\xf5\x5e\xdd\x92\x69\x77\xe8\x3d\x86\xfa\xc1\x5a\x19\x8c\xf0\x87\x86\xde\x93\xee\xd0\xfb\x95\xc7\xd2\x19\xcd\xb9\xfc\x74\x0f\x49\xf3\x49\x01\x96\xde\xfb\x1e\x14\x10\xc5\xee\x73\x02\xa6\xc8\x7e\x4c\x40\x14\x76\xa6\xda\x67\xe9\xbd\x6d\x15\xc1\x96\x55\xe4\x25\x76\x0f\xe8\x7b\xbe\xb5\xf3\xee\x86\xd6\xad\x3b\x66\x88\x17\x18\x42\x5a\xc6\x13\x59\x70\x77\x73\x16\x07\xef\x7b\x39\xee\xbd\xef\x99\xaa\x1d\xe9\xf9\xf9\x62\x4c\x61\xcf\x2d\x5c\xe3\x3c\x6f\x97\xf2\xde\x45\x22\xff\x67\x6d\x20\x35\x88\x1a\x94\x7a\x35\xf6\x7d\xaf\xf9\xd2\xab\xb1\x16\xa5\x5e\x63\x08\xab\x99\xa2\xb1\x7f\x54\x2a\xa6\xad\xad\x72\xa7\xcf\x84\x12\xf6\x1b\x29\xce\x7e\x73\xc2\xdc\x5d\x39\xe8\xb0\xa6\xb8\x9e\x64\xa0\x16\x90\xf5\x22\x90\xd4\x3b\x60\x0a\xf3\x76\x96\x47\xcd\x56\x69\x93\x2d\xdd\x0e\xa7\x70\xb9\x3b\x13\x89\xf5\x72\x20\x9e\x87\xb9\xec\x67\x96\x04\x37\x67\x41\x92\x24\xb9\x98\xa1\xb0\x18\xd1\xa8\xc6\x21\xfd\xf7\x28\x6d\x50\x9d\x5c\xbf\x61\x00\x00\x4c\x93\xf4\x36\xad\x05\x47\x65\x0c\xd1\xd1\x2e\x44\x3e\xa5\xb5\xf3\xd9\x55\x00\x33\x0b\xde\x97\x6b\x3f\xad\xa4\xca\xae\xc2\x03\x35\xcb\xdc\x78\x72\x3e\xea\xba\x0c\xc0\x7e\xe6\x8d\x21\x19\x0c\xfa\x9b\x8e\x14\xe8\x4b\xf1\x08\x11\x0a\x97\xd2\x90\xe0\x15\xe2\xb4\x3a\x9d\xeb\x4b\xc3\x36\x6f\xb4\xe7\x7e\x32\x6e\x67\x10\xb6\xa7\x5e\x36\xa6\xde\x82\x4e\x2b\x15\x0d\x68\xa5\x74\xf7\xe7\x2a\x2d\x41\x35\x52\x5e\xbf\xf5\xa0\x0b\x58\x58\x98\x0c\xe7\x20\x9e\xcb\x1c\xe2\xe9\x57\x98\x0f\x38\xa1\xf0\x19\x03\xc4\xa3\x5d\x1e\x61\x16\x12\x58\x28\x63\x0c\xcc\xa5\xc9\x6b\x99\x84\xa9\x46\x3b\x52\xa3\x5d\xfd\x96\x93\x85\x80\x20\x96\x69\xaf\xb4\x88\x45\x8d\x30\xc5\x31\x7e\x96\x88\xac\x99\x9d\x71\x33\xe2\x25\xda\xa5\x73\xd0\xa4\x17\xd0\xc6\xc3\x9e\xf2\xe8\x8e\x99\x06\x8e\xe9\x6a\x9d\x23\xbe\xe3\x70\x09\x67\xb0\x00\xd5\x68\x39\x18\xcc\x0e\x45\x73\xde\x60\x9b\xcd\xae\x60\x9b\x4d\x08\xa0\x1e\x8c\x2d\x8f\x61\x7d\x43\x99\xfa\x3a\x6f\x2c\x23\x4c\x85\xd0\x43\xc4\x53\x08\xcd\x76\xd4\xb2\x08\x84\xcc\x85\xb0\x5e\x6f\xb9\x59\x56\x2f\x3d\x16\x8f\x65\xe5\x7c\x70\x79\x47\xa3\x50\xb0\x07\xb1\x5b\xee\xe5\x68\x41\x65\x7e\x1f\xe2\x8b\xff\x95\x22\xa9\x78\x9b\xf7\x00\x54\xfa\x0d\xe5\x3a\xaf\x6b\xab\xf5\xe6\xd5\xab\x6e\xdd\x1b\x5d\x6c\xb5\x3e\x04\xb0\x38\x0c\xeb\xe4\xa9\xea\x99\x5f\xab\x27\x99\x51\x20\x6e\x39\x85\x69\x74\x70\x79\x00\x3f\x5a\xf6\xe2\xd9\x64\xda\x96\x01\x14\xa9\x5e\x26\xce\x83\xc8\xf5\x2a\x8b\x85\xd5\xbb\xde\xdc\x81\x96\xf2\x53\xaf\xc7\xf3\x2f\x1d\x57\xe9\x60\x90\x86\xa0\x82\x6c\x87\x10\xff\x82\x0c\x64\x46\x88\x87\x65\x82\x2d\xef\x30\x7e\xc6\xdd\x2c\x62\xe6\x21\x3a\x17\xca\x9f\x3b\x8c\xec\xc8\x1d\x46\x5e\x26\x9c\x13\x9d\x3b\x8c\xd4\xc2\x39\xfb\x0d\xc2\x39\x27\xe5\xdd\xb9\xbf\x48\x33\xf7\x17\x7d\xcd\xcb\x64\xed\x67\x4b\x1b\xaf\x90\x09\x29\x4f\xa7\xb4\xe2\xeb\x96\xb4\x3f\x31\x75\x8e\x64\x9d\xd6\xc5\xcf\x8a\xd6\xa2\x61\xe6\x19\x4d\xe5\xbc\x20\xf7\x7c\x6e\x2b\xb4\x23\xb7\xd5\x9b\xb2\xf7\xff\xa7\x9f\xd3\xeb\x59\x81\xd7\x4c\xe7\xb7\x2a\x7b\xb2\xc7\x48\xfd\xdf\x5b\x6d\x4a\xd6\xbb\x47\x3d\x4c\x66\xf9\x26\x43\x59\xef\x1e\xcd\x69\x81\x7a\xfe\x66\x22\x93\xfd\x4a\x4c\x43\x06\x96\x59\x51\x4d\x22\xa5\xa6\xfc\x15\x49\xbc\x64\xb7\xc3\xe9\xbb\x6f\x06\x03\x76\x7b\x30\x7d\xf7\xd7\xed\x56\xc4\xda\x0b\xcb\x92\x78\xec\xf3\xf6\x60\xca\xeb\xbe\x99\xbe\x3b\xd8\x6e\x79\xf9\xfb\xe4\xcf\xaf\x9f\x53\xca\x7a\x39\x4a\x4b\xa6\x27\xf5\xf9\x20\xfa\x6b\x74\xd0\xbb\xdf\xf0\xf2\xb2\xec\xb1\x65\x4a\x7a\x9f\x05\x9e\x05\xa0\x12\x29\xc5\x6f\x18\xce\x93\x12\xb2\xe8\x28\x47\x05\x4b\x52\xc8\xa2\x0f\xe2\x35\xca\x24\x87\x2c\x3a\x4e\x0b\xe1\xb8\x94\x2c\xf9\x0f\x9a\xe7\xe9\xba\x44\xc9\x0c\xb2\xe8\x44\x49\xc3\xc9\x06\xb2\x48\xe6\x5d\xcf\x20\x8b\x2e\xe5\xb5\x7c\x72\x07\x59\x74\xad\x15\xe2\x64\x01\x59\x34\x49\xef\x93\x15\xff\x5f\xfa\xaf\x25\x73\x8e\xdd\x4f\x15\xfc\x47\x28\x3d\x7c\xc1\xe8\x1f\xde\xbe\xfd\x53\xaf\xa4\x9b\x62\x86\x3e\xa6\xeb\x35\x26\x8b\x9b\xab\xb3\xe4\x5e\xcf\x39\x5a\x61\x12\xfd\x5a\x46\xab\x74\xfd\x7f\x02\x00\x00\xff\xff\x83\xb8\xb6\x8d\x84\xc5\x00\x00") - -func pagesAssetsJsBootstrap400Beta2MinJsBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsJsBootstrap400Beta2MinJs, - "pages/assets/js/bootstrap-4.0.0-beta.2.min.js", - ) -} - -func pagesAssetsJsBootstrap400Beta2MinJs() (*asset, error) { - bytes, err := pagesAssetsJsBootstrap400Beta2MinJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/js/bootstrap-4.0.0-beta.2.min.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsJsContainersJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xeb\x72\x1b\xb9\xd1\xe8\xef\xa3\xa7\xe8\x75\x36\x3b\xe4\x27\x72\x48\x79\x2f\xa7\x96\x32\x5d\x25\xcb\xf6\x46\x5f\x7c\x2b\x49\x4e\x2a\x25\xab\x54\xd0\x0c\x48\xc2\x1e\x0e\x26\x00\x46\x14\x77\x57\xef\x7e\x0a\xb7\x01\x30\x17\x92\xd2\x6a\x37\x39\x95\xf8\x87\x45\xce\x34\x1a\x8d\x46\xa3\x6f\x68\x80\xa3\x11\x1c\xd3\x62\xcd\xc8\x7c\x21\xe0\xe9\xf8\xe0\x3b\xf8\x89\xd2\x79\x86\xe1\x24\x4f\x62\x38\xca\x32\x38\x95\xaf\x38\x9c\x62\x8e\xd9\x0d\x4e\xe3\xbd\xd1\x68\x6f\x34\x82\x37\x24\xc1\x39\xc7\x29\x94\x79\x8a\x19\x88\x05\x86\xa3\x02\x25\x0b\x6c\xdf\x0c\xe0\x6f\x98\x71\x42\x73\x78\x1a\x8f\xa1\x27\x01\x9e\x98\x57\x4f\xfa\x87\x12\xc5\x9a\x96\xb0\x44\x6b\xc8\xa9\x80\x92\x63\x10\x0b\xc2\x61\x46\x32\x0c\xf8\x36\xc1\x85\x00\x92\x43\x42\x97\x45\x46\x50\x9e\x60\x58\x11\xb1\x50\xfd\x18\x2c\x92\x12\xf8\x87\xc1\x41\xaf\x05\x22\x39\x20\x48\x68\xb1\x06\x3a\xf3\x01\x01\x09\x43\xb4\xfc\xb7\x10\xa2\x98\x8c\x46\xab\xd5\x2a\x46\x8a\xe0\x98\xb2\xf9\x28\xd3\xa0\x7c\xf4\xe6\xe4\xf8\xd5\xbb\xb3\x57\xc3\xa7\xf1\xd8\x34\xfa\x98\x67\x98\x73\x60\xf8\x9f\x25\x61\x38\x85\xeb\x35\xa0\xa2\xc8\x48\x82\xae\x33\x0c\x19\x5a\x01\x65\x80\xe6\x0c\xe3\x14\x04\x95\x44\xaf\x18\x11\x24\x9f\x0f\x80\xd3\x99\x58\x21\x86\x25\x9a\x94\x70\xc1\xc8\x75\x29\x02\x9e\x59\x12\x09\x0f\x00\x68\x0e\x28\x87\x27\x47\x67\x70\x72\xf6\x04\x5e\x1c\x9d\x9d\x9c\x0d\x24\x92\xbf\x9f\x9c\xff\xe5\xfd\xc7\x73\xf8\xfb\xd1\xe9\xe9\xd1\xbb\xf3\x93\x57\x67\xf0\xfe\x14\x8e\xdf\xbf\x7b\x79\x72\x7e\xf2\xfe\xdd\x19\xbc\x7f\x0d\x47\xef\xfe\x01\x7f\x3d\x79\xf7\x72\x00\x98\x88\x05\x66\x80\x6f\x0b\x26\x47\x40\x19\x10\xc9\x4d\x3d\x89\x70\x86\x71\x40\xc2\x8c\x6a\x92\x78\x81\x13\x32\x23\x09\x64\x28\x9f\x97\x68\x8e\x61\x4e\x6f\x30\xcb\x49\x3e\x87\x02\xb3\x25\xe1\x72\x56\x39\xa0\x3c\x95\x68\x32\xb2\x24\x02\x09\xf5\xa8\x31\xae\x78\x6f\x6f\x56\xe6\x89\x7c\x0b\x8b\x72\x89\x72\xf2\x33\xee\xe5\xe5\x72\x00\x9c\xfc\x8c\x07\x50\xe6\x44\xf0\x3e\xfc\xb2\x07\x70\x83\x98\xfa\x7a\xb8\x07\x8a\x94\x9e\xfc\x02\x53\x0d\x12\x17\xb4\xe8\xf5\x0f\xcd\x97\x0c\xe7\x73\xb1\x80\x6f\xbe\x81\xbc\x5c\xc2\xf3\xa9\x42\xa6\x5f\x86\x0d\x34\x66\x50\x60\x23\x03\xb6\x07\x70\xb7\x07\xc0\xb0\x28\x59\x0e\x17\x8a\x18\xd9\xe4\xf2\x70\xef\x6e\x4f\x0e\xe8\x35\xcd\x32\xba\x92\xa3\x95\x03\x39\x79\x75\x0c\x39\x5a\xca\xaf\x09\xcd\x6f\x70\x2e\xc7\xd2\x1c\xd4\xc9\xab\x63\x39\x2e\x37\x14\x86\x25\x2d\xe1\x98\x0f\xc6\x4f\xbf\x1b\xc0\x45\x74\x4e\x5e\x44\x03\x88\x7e\xd2\x7f\xde\xea\x3f\x7f\xd5\x7f\x5e\x44\x97\xfd\x43\x47\x1f\xc3\xe2\x62\x7c\x19\x0b\xfa\x9a\xdc\xe2\xb4\xf7\xb4\x0f\xfb\x10\x41\x04\xfb\xea\xcd\x81\x22\xba\x41\xf3\x5b\x2c\x18\x49\x5a\xc8\x6e\xd2\xad\x41\x77\x21\x7d\x3c\x56\xa4\x6b\xca\x35\xe1\x9a\x6e\x4d\xf6\x5a\x60\x7e\x7f\xd2\x25\xed\x2f\x19\x5a\x01\x02\x21\x97\x53\xec\x28\x4c\x19\x5a\x9d\xcb\x67\x3d\x35\x85\x1c\x33\x82\xf9\x39\x11\x19\xe6\x03\x10\xf2\xef\xf9\xba\x90\x9f\x53\x24\xd0\x00\x70\x86\x97\x38\x17\x27\xe9\x40\xce\xf6\x07\x34\x97\xaf\x38\x65\xe2\x24\x4f\xf1\xad\x1b\x9c\x84\x56\x68\x61\x0a\x39\x5e\xc1\x5c\xa9\xbb\xf8\x86\xf0\x12\x65\xe4\x67\x25\xc8\xf1\x4b\x0b\xd4\xeb\x57\xe2\x28\x1b\x13\x98\xc2\xf8\x10\x08\x3c\x0b\xe8\x31\x02\x79\x08\x64\x7f\xdf\x8a\x5c\xd5\x4f\x8c\xd2\xf4\x98\x66\xe5\x32\xef\x39\xaa\x2f\xc8\xe5\x20\x40\x71\x41\x34\xef\xa4\x68\x06\x4d\x4f\xe9\x8a\xf7\xe4\x13\xf5\x9a\xcc\xa0\xf7\x55\xaf\x1a\xab\x52\x36\x24\x4f\xe9\x2a\x4e\x16\x88\x09\x5e\x49\x7c\xf0\xf4\xa2\x6a\x70\x09\x53\xf5\x5a\x2d\x8a\xae\xd1\xeb\x91\xa7\x34\x29\x65\xa3\x78\x8e\xc5\x2b\xdd\xfe\xc5\xfa\x24\x75\x9d\xf7\x0d\xc1\x86\xb1\x09\xe7\xc7\x19\xe2\xfc\x1d\x5a\x62\x0e\x53\x43\x47\xb4\xc0\x28\xc5\xec\x94\xae\xa2\x09\x44\xd1\x40\x3f\x54\x73\x6d\x9e\xa9\xcf\x43\x46\x57\xf6\x25\x4d\xd3\xf3\xd6\xf7\xb2\xb7\x43\xd3\x1b\x2d\x84\xeb\x04\x65\x02\xb3\x1c\x49\x9d\x7b\x4a\x57\x67\x62\x9d\xe1\x09\x08\x56\x62\x8d\xb1\x40\x73\x3c\x81\x08\xe7\x12\x53\xe4\x9e\x9d\x91\x9f\xf1\xc4\x49\x8b\x41\x95\xd1\xd5\x5f\xc4\x32\xf3\x11\x48\x31\xd2\x53\x38\x71\x22\xe5\x5e\x1d\xf1\x04\xe7\x29\xc9\xe7\x13\x98\xa1\x8c\x9b\x46\x01\x3f\x26\xe1\x57\x3b\x92\xae\x59\x8a\xa5\xf0\xf7\x2a\x39\x18\xa8\xe1\xf6\x6b\x0b\x26\x23\x39\x06\xd5\xb4\xb6\x6a\xde\x90\x1c\x1f\xcb\xe7\xbd\x70\xd1\x34\x16\x8a\x54\x7b\x6e\x65\x2c\x49\x0e\x53\x38\xc9\x67\x24\x27\x62\x6d\x19\xbd\x44\xb7\x30\x85\xa1\xff\xb8\x6d\x39\x48\xdc\x6d\xcb\x40\xf9\x17\xf9\x0d\x66\x42\x69\xa6\x19\x61\x5c\x40\xa2\x78\x29\x8d\x25\x82\x97\x48\xe0\x58\x81\x4a\xd9\x96\x68\x2e\xc8\x25\x7c\x35\x85\xbc\xcc\x32\x8b\x45\xaf\x89\x0b\x72\x79\x31\xbe\x34\xeb\x56\xb6\xeb\xb9\xa7\x4a\x16\x8d\x34\xaa\x5e\x5f\x93\x3c\x95\x43\x1a\xc8\x11\xe8\x0e\x2a\xba\x3f\xc3\x14\x0e\x0e\xe1\xb3\xa1\xfb\x82\x5c\x56\xa4\x7f\x76\xa4\xeb\xf1\xdf\xa0\x0c\xa6\x55\xf7\x9f\x2f\x0f\xcd\x3b\x49\xad\x7c\xf7\x4c\x76\xe2\x9a\x80\x61\xe3\x0d\xca\x2c\xe4\x5d\xad\xc5\x73\x49\x51\xd0\x42\xb1\xb8\xd1\xe2\xce\xae\x2e\x69\xf7\x31\xa4\x34\x8f\x04\xac\x50\x2e\x24\xe3\xf8\x82\xae\x00\xe5\x6b\xd9\xac\xc4\x1c\x94\x8b\x22\x16\x28\x87\x31\x70\x0a\x09\x2a\x14\xbf\x25\x31\x0a\x02\x90\x9c\x00\x24\x62\x8d\xef\x48\x4f\x07\x47\x4b\x0c\x82\x2c\xf1\x40\x23\x3c\x18\xff\xd9\xfa\x4e\x73\x86\x8a\x05\x5c\xe3\x8c\xae\x6a\x98\xc8\x0c\x56\x18\x12\x94\xc7\x4e\x70\xfe\xae\x04\x19\xa6\x0a\x6c\x08\x3d\x39\xa4\xa1\xe6\xcc\x08\x0e\xc6\x56\x75\x39\xc8\x67\x30\xb6\x2c\xf0\x9b\x8f\x0f\xbd\x41\x1f\xa5\xa9\xea\x3a\xc5\x4a\xf6\xa4\x78\xd3\x19\x60\x94\x2c\xac\x04\xa1\x5c\x43\xe4\x38\xc1\x9c\x23\xb6\xd6\x72\xf8\x1b\x54\x7d\x9b\xda\x8e\x52\x24\xb0\xe4\x52\x54\xd3\xd9\x46\xec\x82\xf5\x70\xf0\x70\xf3\x10\xe5\xe5\xf2\x1a\xb3\x7a\x2f\xbb\x58\x06\xcd\xb0\x63\x86\x91\xc0\x8a\x2b\x52\x0f\x28\xd6\x84\xa3\xfd\xa3\x4c\x88\x53\x41\xf7\x31\x23\xa3\x11\x9c\xbf\x7f\xf9\xbe\x77\xb3\x44\x6c\x49\xb3\xfe\x04\xde\x50\xfa\x05\x48\x2e\xa8\x54\x74\xf9\xdc\x3a\x38\x37\x04\xaf\x0c\x7d\x72\x31\xcc\xb1\x00\x04\x7c\x49\xa9\xf4\x77\x35\x22\x94\x93\x65\x35\xe6\x86\xc5\x48\x4a\x76\xa3\x2c\xf1\x04\x22\xab\x3b\x8d\x65\x58\x60\x19\xf0\x4c\xe0\xdb\xf1\x58\x3f\xc8\xf0\x1c\xe7\xe9\x04\x7e\x29\x28\x57\x52\x38\x81\x28\xa7\x39\x8e\xee\x06\x46\xad\x24\x25\x3f\x47\x6c\x8e\xc5\x04\xa2\x04\x09\x3c\xa7\x6c\x6d\xb0\xdd\x1c\xdd\x12\x3e\xa9\x16\xbb\xf2\x00\x26\x4a\xf1\x0e\xac\x92\x21\x78\xa5\xe5\x7f\x12\x6a\x91\x89\x5b\x19\x83\x50\x31\xd4\xe8\x32\x2f\x3d\xf2\xae\xa9\x10\x74\x19\x39\x35\x72\xa8\x99\x72\xa2\xd7\xf6\x6a\x41\x33\xac\x84\xc9\x48\x1a\x2c\x10\x77\x0a\x41\x2d\xf3\x01\x08\xb6\x96\xcc\x4d\x70\x2e\x30\x03\xa2\xc2\x31\x09\x63\x4c\x4e\xb5\xa2\x61\x3a\xf5\x35\x9a\xe4\x73\xac\x86\x1d\xbb\xa1\xc5\x5a\xc7\x1d\xc4\x07\xf0\x3f\x12\xf8\x70\x13\xa8\x52\xa0\xe3\xf8\x47\x07\xaa\xa4\xe3\x61\xc6\xf2\x27\x2c\xf4\xd0\x4c\xd0\x60\xd4\x1b\x91\x83\x92\xda\x98\xe4\x90\xa3\x9c\x72\x9c\xd0\x3c\xe5\x9e\x25\x9d\x63\x71\x62\x80\x7a\x49\xc9\x18\xce\xc5\x00\x0a\x86\x6f\x08\x2d\xbd\x90\x25\x29\x99\x6f\x91\x0c\x64\xdf\x9a\x4f\xd9\xc0\x7f\x5f\x21\xb0\x6b\x76\xc9\x61\xf8\x1c\x72\x1e\x3b\xc7\x59\x22\x91\xcb\xe5\x9c\x2c\x71\xaf\x0f\x43\x85\xc4\x3d\xe8\xc3\xff\x28\x77\x7c\x3c\x1e\xdb\x41\x1e\x2f\x70\xf2\x85\xcb\x09\xf1\x02\x38\x9c\x02\x17\x48\x70\x20\x79\x92\x95\x29\xae\xbd\x63\x98\xd3\x92\x25\xbe\xcb\xbd\x40\xfc\xd4\x3c\xed\xa9\xa6\x83\x0a\x4a\x0f\xd8\x10\xa8\xde\xc5\xfa\x7f\xc3\xd6\xe7\x30\x96\xf1\x98\xf7\xe6\x62\x7c\x79\x61\x5b\x5f\x36\x09\x45\x59\x26\x23\x13\x19\xb5\x63\x26\x69\x84\x82\xd1\x1b\x92\xe2\x14\x32\xc2\xc5\x83\x88\x7e\x4d\xd9\x51\x96\xf5\x2a\xb4\x27\xf9\x8c\x36\xc6\x20\xa5\x36\x84\xb0\x63\x98\x4e\xa7\xce\x2a\x99\xa1\x2a\x87\xce\xaa\xdf\x36\xc7\xa7\x15\x55\xa0\xea\x95\xc2\xf5\x59\x1b\x36\x51\xa1\x40\x45\xa2\xf3\x0b\xea\x04\x58\x87\xa0\x7a\x23\xfd\xd3\x9a\x4b\xc8\xb1\x90\x02\x3e\x47\xe5\x1c\xf3\x58\x4a\x1c\x02\xc2\x55\x12\x85\x11\x8e\x53\xf9\x12\xe5\x80\x18\x43\x2a\x49\xa2\x3e\x70\x93\x59\x59\x51\x89\xc9\xac\x2b\x3e\x91\x5f\x10\x70\xc1\xa4\xd2\xcd\xd0\x35\xce\x94\x61\x41\xd2\x61\xc6\x32\xbc\xd4\xde\x80\xcd\x1a\xa8\x3e\x6b\x8e\xe8\x4f\x8a\x8e\x9e\xe7\x71\x6a\xca\xf4\x20\x0d\x95\x65\xce\x17\x64\x26\x7a\x17\xd1\x1b\xd9\x89\x0c\x26\xff\x26\x31\xab\x60\xb2\x61\xd7\x0a\x5a\x94\x99\xfc\xa2\x1c\x03\x39\x3e\x13\x37\x3a\x93\x0f\xd3\x76\x9b\xa4\x06\x7b\x4e\x9d\xc1\x37\xc4\xdc\xcb\x7a\x1a\x4b\xa2\xb2\x1d\xd6\x98\x58\x8b\x71\x60\x2d\x06\xc3\xe9\x6b\x46\x97\x13\xf8\xd1\x3d\x38\xa7\x1e\xc0\x1a\xcb\x30\x43\xc3\xfc\xdf\xef\xfd\x67\x12\xcc\xb6\x5a\x92\x9c\xb2\x73\x92\x7c\xe1\x13\x30\x40\x95\x55\x9b\xc0\x2f\x69\xc9\xcc\xc7\x1f\x65\x6c\x8e\x11\x57\x21\x48\x24\xe3\x02\xc4\xa2\x3b\x3f\x5c\x52\x4a\xb3\x32\xdc\x9d\x66\x5b\x4d\xd8\xae\x26\x5b\xdb\x81\x4a\xf9\x0e\x2c\x5f\x7c\xd5\xab\x5d\x47\x94\x2c\x64\xac\x42\xf2\x19\x0d\x15\xec\x5b\xfd\x46\xae\x83\x1e\xa3\x54\xbc\x24\x6c\x00\x09\xca\xb2\x6b\x94\x7c\xd1\x52\xf2\xb5\xa4\xe2\x7f\xcf\xde\xbf\xb3\x00\xb0\x0f\x11\x2a\xc8\xe8\xe6\x20\x1e\x8f\x0c\xea\x68\x00\x16\xad\xf6\x88\xe0\x97\x0a\x8d\x71\x91\xe0\x2e\xa0\xab\xe0\x2d\xe4\x7c\x60\x54\xfa\x91\x35\x72\xec\x6a\x95\x91\xdb\xee\xd4\x3d\x8d\xc7\xa3\x82\x47\xb0\x1f\x22\xe8\x9b\x29\x88\x53\x9a\xe3\xde\x0e\x44\x5b\xf8\x19\x22\x99\x83\xff\xfc\xcf\xc5\x2d\x1b\x80\xc0\xb7\xe2\x4c\x20\x51\xf2\x01\x60\xc6\x28\x0b\x70\x5c\x5c\x36\x86\xad\xec\xb7\xa5\xc7\x98\x87\x5a\xde\x0f\xa7\x0e\x22\x64\x8f\xec\x89\xef\xc8\x98\xd1\x08\x4e\xf1\x3f\x4b\xcc\x05\xfc\x30\xe6\x52\xd7\xb8\x6e\x17\x84\x0b\xca\xd6\x6a\xa5\xe5\x54\xfa\x1c\x85\xf4\x92\xab\xec\x93\x6e\x36\x05\xc9\xd7\x58\x2b\x20\x32\x5b\xf7\xaa\x80\xf2\x63\x21\x1d\x72\x58\x22\x92\x6b\x53\x63\x7a\xc2\xe9\x8b\xf5\xc7\x13\x58\x2d\x48\x86\xa1\x94\x40\x52\x75\x3d\xc9\xcb\xe5\x95\x02\x7b\x02\x0b\xcc\x4c\xb0\x19\x55\x4f\xa3\x09\xfc\x60\x16\x9c\x7e\xa8\xc9\x89\x26\x30\x96\x2b\x48\xab\x87\xaf\xe3\xd5\x02\xe7\x3d\xeb\x9e\x7d\x1d\x17\x94\x8b\x56\x89\x74\x36\xad\x31\xf7\x03\x3b\xb6\xfe\x60\x2b\xa2\x83\x11\x2f\xaf\x77\xc2\xd5\x21\x51\xae\xed\x29\xe6\xc5\x00\x02\x74\xf2\x91\x1f\x81\x56\x22\x13\x82\x5c\x8c\x2f\x5b\x1a\xba\x68\x1b\x3c\xe9\x7a\x69\x55\xa6\x0e\x1c\xa5\x50\x1d\x7f\xf8\x08\x25\x47\x0d\xb3\x70\x5c\x94\xe7\x54\xa0\xec\xa3\x7c\xe7\x5b\x87\xa5\x53\x07\x03\x2d\x9c\xce\x64\x1b\xcf\xa2\xc0\x49\xbc\x40\xfc\x2a\x29\x4a\xe9\x6f\x7c\xd5\xe2\xb2\x44\x49\x51\x46\xfd\xd0\x8e\x07\x99\x2a\xe5\x84\x4b\xf5\x7d\x11\x9d\xeb\xa8\x2e\x52\xf4\x44\x97\x87\xa1\x19\xb9\xb8\xec\x0c\xef\x1a\x1e\x50\x60\xf2\x9d\x63\xe8\x3b\x44\xc4\x24\x0f\x3c\xbf\x30\x78\x0d\x43\x38\xf0\x40\xac\x8b\xfa\x4e\x92\x5a\xf3\x46\x63\x19\x8e\x72\x81\x96\x85\xf6\x49\xdd\x77\x2d\xaf\x1a\x83\xb5\xe5\xd5\x50\xa0\x7a\x14\x17\x25\x5f\x84\x98\xfa\x6d\x10\x0a\x24\x29\xca\x58\x4f\xa4\x90\x7c\xb2\x1e\x69\xed\xb1\x0c\xf5\x1d\xcd\x06\x9b\x8a\xc7\x15\x26\x8b\xd7\x05\xb3\x41\xaa\x4a\x74\x25\xa9\xa2\x63\xca\x30\x8f\xb6\x09\x5a\x46\x51\xda\x94\xb3\x37\x14\xa5\xbb\x48\x58\x87\x58\x1c\xdd\x60\x86\xe6\xf8\x8f\x10\x8c\xc7\x9c\x34\x3b\x67\x92\x27\x57\x48\x8f\x41\xe5\x61\xc6\xe3\xc7\x9b\x96\xd3\x32\x57\x09\x55\x10\x0b\x86\x51\xba\x79\x86\x0a\xcc\x86\x09\x65\x78\x93\x4e\xf8\x80\x99\x9c\xea\x7f\x85\x56\x30\xc9\x26\xa4\x65\x40\x51\x6c\xd2\x4c\xac\x72\x2d\xeb\xe2\xd1\x14\x01\x13\x11\x78\xf4\xc6\xd2\xa0\x48\x24\x3c\x90\x02\x8d\x4a\xf3\x5f\x89\xb7\xda\x15\x21\xd5\x14\xfc\xa7\xab\xa0\x20\x51\x3b\xd6\x89\xda\x0e\xae\x06\xf9\xda\x10\x73\x65\xdd\x00\x6a\x5a\xac\xc0\x4c\x8a\xca\x95\xfa\x76\xf1\xf9\xb2\xa9\xd0\xea\x10\x7d\x18\x79\xe8\x1a\x5a\xee\xee\x8f\xd5\x75\x8a\x2a\xb8\x66\x18\x7d\x49\xe9\x2a\x6f\x2e\x25\xb5\x86\x5e\xd8\xf7\x9d\x8b\x29\x08\x44\x3b\xa2\xe3\xcd\x8b\x2b\x00\x7d\x98\xe9\xfd\xc8\x55\xca\x33\xfa\x2b\x66\x39\xbe\x8f\x0d\xae\x91\xb9\x7d\x21\xb4\x34\x68\x5b\x10\xad\x60\xff\x1e\x0b\x63\xa3\x6d\x2e\x39\x66\x4d\x49\x96\x4f\x5b\x2d\x73\xc7\x62\xa9\x21\xe5\x6b\x2e\xf0\xb2\x89\x56\x3f\xff\x83\x4c\xfe\xa9\x4e\x78\xe8\x20\xd6\x88\x90\x0a\xd3\xa5\x88\xcc\x18\x5d\x06\x49\x0d\xdf\x61\x35\x19\xa0\x92\x9b\xcc\xb1\xc4\x56\x20\xce\xb1\x6e\xfc\x5a\x6d\x42\xd9\x7c\x8a\x4a\x0b\xa6\xe4\x86\xa4\x25\xca\x34\xf2\x82\x12\xc9\xa2\x30\x0c\xf2\xf0\xab\x81\xbc\x44\x02\xf5\x5a\x7a\xd5\x3d\x74\x3b\x18\x3b\x88\xba\xdd\x6c\xae\x23\x6f\x13\x74\xdf\xaa\x34\x1a\x5c\x90\xcb\x38\x97\xf1\x67\x8b\x86\x35\x5b\x61\xad\x6d\xc2\x65\xd5\xd8\x1d\x33\x16\xa6\xb3\xa5\xb7\x61\xe6\x9b\x9c\x0d\xf0\x66\xa1\x99\x46\x2a\x6c\xcd\x31\x53\x89\x19\xe0\x05\x62\x1c\x9b\x99\xd6\x49\x2b\xbb\x40\x00\x09\x39\x79\xf8\x16\x7e\xc6\x8c\x3a\xe9\x50\x13\x08\x48\x38\x7c\x1a\x8a\xec\x1f\x0c\xe4\xdc\x5f\x63\x28\xa5\x34\x20\xae\xf7\x22\xcd\x86\x11\xa3\xab\xd8\xa3\xdb\x5f\xac\xc1\xba\xac\x46\xd7\x9c\xa1\x19\x65\xaf\x50\xb2\x70\x11\x99\x1f\x70\x85\x8b\x4f\x6d\x75\xfa\x21\x55\x08\x74\x41\xf6\x0f\x2e\xcd\x26\xe4\xeb\x5c\x2e\x50\xad\x58\x2a\xc0\x8e\x15\xd7\xc8\x18\xfa\x72\x32\x31\x7f\x07\xd5\x9a\x9d\xe8\x85\xa8\x9a\x6c\x74\xe4\xfc\xb1\x6e\x71\xe8\xfc\xb5\xd2\x70\xec\x1a\x3c\x73\x26\xe8\xab\x66\x56\xb7\x65\x81\x6d\x35\x37\x89\x5d\x9e\x5a\x4b\xef\xba\x72\x0d\x5b\x5d\x2c\x5d\x71\xdc\xb3\x29\x0f\x36\x01\x8e\xd6\xba\xb2\xdd\x3d\xba\x3a\xdc\xb3\x82\x12\xaa\xd4\x6a\xc0\xb1\x55\xae\xee\xc9\x43\xbc\x8d\xc6\x74\x2f\xf1\x92\xb2\x75\xeb\x8c\xbf\x55\xaf\x7e\xff\x49\xd7\x24\xfc\x4b\xe6\xdd\x4c\x9b\x9c\x35\x4d\x85\x9e\x21\x18\x01\xcd\xf1\x5b\x3c\x47\xd7\x6b\x81\x1f\x67\x6e\x2c\x36\x3b\x3f\xe1\x04\xa9\xcc\xb5\x9a\x21\x2a\xc3\xbb\x2c\xab\x76\x10\x5a\xa7\xe6\xbd\x06\xda\x1c\x5a\xb5\x78\x83\x9b\x7d\xa7\x6e\x07\xac\xf2\x96\x24\x02\x43\xac\xb6\x6f\x16\xa9\xf1\x51\xed\x96\xff\x76\xb7\x73\x43\x67\xcf\xa7\xf0\xd4\x5f\x99\x1b\xfc\xb8\x8d\x24\x3f\xf5\x1c\x3c\x86\x56\x96\xc0\xdd\xd7\xe8\x63\xf9\x87\x7e\xd1\x0c\x85\x25\xc9\x32\xa2\xc2\x1d\x5d\xef\x80\xbe\xe8\xdd\x8f\x02\xb3\x04\xe7\x02\xcd\xb1\xde\xd2\xae\x58\x5a\x59\x99\xb7\x48\x2c\x62\x46\xcb\x3c\xed\xf5\x7a\xd5\x88\x02\x97\x0d\x46\xed\x91\x95\xd9\x64\x34\xea\x4a\x4d\x8f\xc5\xff\x5c\xbd\xa8\x8c\x99\x37\x95\x07\xe3\xb1\x1f\x0f\x99\x0d\x1e\x65\x98\x2e\xa2\xe3\x0f\x1f\xa3\x41\x05\x7d\x19\x16\x8f\xe9\xd5\xb4\xab\x48\x68\x68\xaf\xc4\xe8\x0c\x89\x52\xf9\x08\x82\x06\x3b\x0e\x9c\xfc\x6c\xf2\xbd\xb2\x13\x55\xa9\xda\x14\x0c\x89\xd5\xac\x66\x05\xe1\x86\xac\x1b\x3c\x0f\x38\xa4\x21\xaf\x12\x54\xa0\x84\x88\xb5\xe3\x83\xc5\xbe\x01\x38\xa8\x51\x0a\x87\xec\x4f\x55\x8b\x7a\x51\xc8\xc3\x39\x09\xb9\xab\x95\x6f\x34\xf0\xd1\xd6\x78\x9c\x97\xcb\x9f\xec\x52\x34\x8d\x8d\x5f\x67\xb9\x5d\xb2\x78\x46\x32\x6c\x7d\xfb\x5f\x42\x57\xd1\xdf\xf4\x0c\x20\xdb\x9c\xd1\xc0\xb1\x0d\xc1\xab\x98\xcb\x78\xc5\x55\x2a\xd8\xb2\x61\x96\x51\xca\x7a\x6a\x0b\xc4\x30\x40\x8d\x3b\x1e\x4b\x69\x55\x4f\x2b\xee\x1f\x06\x4e\x9a\x1c\x99\xad\x12\x40\xe9\x0d\xe1\x94\xc5\x33\xae\x70\xc7\x95\x33\xa5\x10\xa4\xf8\x86\xa8\x6d\x69\xe7\x17\x9a\x5d\x05\x4f\xbd\x9a\x7a\x07\x5d\x1b\x4f\x59\x8a\x99\xf5\x09\x35\xc0\x85\xe3\xe8\xbe\xec\x3d\x56\xae\xe5\xa5\x72\xf0\x5f\x9f\xc1\x9f\x22\xd8\x87\x5e\xf5\x1c\xf6\xe1\xa0\x3f\xf0\x86\x7b\x59\x2f\x59\x7b\xa3\x24\x48\xd5\x33\xa9\x42\x20\x19\xcc\x38\xb6\x59\xaa\x52\xc2\x8b\x0c\xad\x75\xb1\xf9\xf7\xb1\x6d\x1c\xbd\x76\x90\x29\x16\x88\x64\x3c\x02\x8e\xb5\x0d\xe0\x82\x64\x99\x2a\xf1\xd2\xdb\x5e\x4c\x6f\x22\xaa\xb9\x95\xc6\xc3\xf5\xc2\xdd\x72\x59\xa2\xdb\xab\x4a\x77\xfb\x43\xfd\xde\xad\x90\x40\x8e\x74\x65\xdb\x95\xbf\xc7\xeb\x98\xe5\x84\x8e\x67\x24\xc1\xbd\xf1\xc0\x07\xf6\xdd\x55\x63\x38\x3b\x37\x8f\x95\x39\x54\xfb\xb0\xce\xe6\x2a\xe5\xf3\xf4\x3b\x25\x28\x4f\xbf\x3b\xb4\xaf\x7f\x22\xf5\xd7\x81\x9d\x6e\xf3\x5f\xee\x6d\x23\xb7\xea\xa9\xad\x49\x93\x1d\x1c\x9a\xce\x2d\x8b\x01\x44\x7f\xa1\xe2\x1e\xa1\xe4\xa3\x65\x4d\x1e\x3b\x61\xdd\xed\x50\x6d\x6b\xb2\xa2\xec\x0b\xc9\xe7\x57\x1c\x8b\xd6\x86\x9d\x09\x89\x3d\x13\x60\x9a\x6d\x6a\x3d\x5b\x4a\xd5\x0e\x80\x6f\x31\x29\xce\x6a\x5d\xed\xa8\xf9\x3b\x04\xc5\x37\x3d\xf0\xcd\x37\x7b\x36\x0d\xb3\x05\xf2\x59\xd0\x7b\x25\x3b\x35\x92\x76\x30\x75\x96\x0d\x1f\xed\x86\xa9\xf2\x2d\x18\x9d\xab\x33\x23\xd7\x88\xc5\x8f\xe5\x08\x2e\xa8\xd0\x6b\xac\xa6\xe8\x3b\xa6\xd2\x53\xfa\xc1\x50\x2d\x3a\xa5\x49\xb7\x21\x6c\xd8\x8f\x56\x54\x09\xcd\xd2\x0a\x93\x8f\x77\xe8\x88\x96\xb0\x5f\xf7\xa2\x3f\x59\xd6\x0c\x17\x54\x0c\xed\xd2\x8d\x57\x24\x15\x8b\x9e\x1b\xe1\x3e\x44\x7f\x8e\xfa\x8d\x36\xb2\xa3\x7a\x23\xaf\xf3\xb0\x95\x86\x1b\x0a\x7c\x2b\xa2\x6a\x97\x57\x7e\xf3\x53\xdb\xfe\x01\x94\xfa\xb8\xf5\x89\x8b\x91\xda\x5d\xf0\xe1\x02\x1e\xc0\xbe\x87\x2d\x82\x9e\x04\xf6\x59\x20\x69\xea\x47\xda\x35\xdd\x35\x7f\x57\x0f\x5e\xbc\x55\xa6\x6d\xa1\x5f\x85\x37\x43\xfe\xe1\x2e\x57\x85\x90\xa3\x25\x0e\x33\x6f\xef\xb0\x90\x02\x72\x62\x5b\xa9\x3a\xfc\x5e\x85\x44\xef\x8b\x57\x5f\x8d\x09\x6a\x53\x82\x0e\xa6\xab\x60\xcb\x41\xd8\xcc\x19\x4c\xa7\x10\x74\xd5\x28\xd5\x22\xad\x49\x97\xe1\xc1\x86\xf8\x3a\xd7\x23\x02\x71\x3b\x62\xb7\xa0\x58\x56\x0b\xdd\xcc\x98\xd5\xf9\x9a\x07\xee\x8a\xd9\x4e\xba\x76\xc6\xcc\xfb\x4d\xbb\x63\x72\xf6\xdc\x64\xa9\x39\xb4\x6a\x81\x04\xb3\x01\x53\x35\xe0\x80\x8e\x5a\x9d\x60\xc5\xe6\x7a\xc3\xce\x19\xae\x04\xb4\xee\xdc\x19\xca\xe3\x0a\xd5\xa0\x56\x81\xd8\x84\x70\xc9\xe8\x60\x9a\x35\x0d\x5e\x55\x7a\x42\x73\x4e\x33\x1c\x67\x74\xee\xfa\x8f\x3e\x9a\x2d\x4f\x0a\x33\x92\xa7\x6e\x08\x4f\xa2\x01\xd4\xe4\x30\x7a\x22\x1d\xc8\xa8\x2a\xf5\x08\x36\xec\x0c\x59\x41\x36\x68\xab\xc1\x37\x02\x22\x3f\x9f\xda\xcf\xff\x9e\x25\x0b\x27\xf9\x19\x4e\xee\x15\xf9\x9a\xed\x69\x5b\xd6\xfa\x98\xce\x45\xb8\xb5\xd1\x14\x88\x8b\x50\x08\x2e\x63\x71\x7b\xa5\x98\x0b\x43\xa7\x19\x15\xb9\xf7\x68\xeb\x6f\x18\x06\x5c\x79\x1c\x12\xd9\x6f\x20\x91\xed\x48\xe2\x23\xec\xe3\x28\xad\x05\x05\x66\xa0\xeb\xab\x37\xe6\x1a\xad\x9a\x52\x85\x6c\xbc\x55\x0b\xbe\x52\xaf\xfe\xab\x06\xff\xb3\xd5\xa0\x56\x80\xff\x55\x7d\xbf\x8f\xea\xd3\xcb\xef\x81\xba\x4f\x37\xfe\xfd\x95\xdf\xc3\x89\x64\xbb\x12\xf9\x08\xea\x4f\xab\xab\x56\xfd\xe7\x65\x9b\xbc\x14\x8f\x8e\x56\xf4\x91\xbe\x9a\x1f\xf8\x9a\x64\xf8\x4c\x41\xe9\x0c\xc5\xa6\x4a\xb6\xa6\x30\xb7\xa8\x20\x2b\xbe\x6a\xe7\xa5\x3d\xf5\xd7\xb2\x20\x71\x06\x53\x19\x9c\x3c\x4b\xc9\xcd\xf3\xa8\xf3\x74\xf4\xf6\x04\xe1\xf6\xf4\xe0\x23\x24\x07\x6d\x72\xcc\x70\xfb\xe5\xfb\xb7\x4e\xf6\xbc\x75\xf6\x80\xbc\xa1\x16\x63\x1e\xdb\xc8\xce\xd4\xc9\x9b\x90\xce\x23\xdb\x85\x74\xba\x81\x8c\xdf\x2c\x70\x18\xcb\xd5\x8e\xe4\xbb\x11\xb6\x85\x71\x3e\x90\xcb\x45\xbb\x50\xce\x0f\xe4\x1c\x21\xfd\xc8\xc8\xf0\x5d\x2d\xf7\x75\xb2\x44\x73\xcc\x7b\x44\xfd\x71\x16\x54\x7f\x97\x91\x4f\x5e\x66\x19\xfc\xfa\x2b\xe8\x27\xee\xc4\x4c\xfd\xc0\x8c\x5d\x22\xc1\x61\x2d\x98\xc2\x2f\xd5\x51\x04\x4f\xa5\x9f\x62\x75\x66\x4d\x27\xae\xa3\x73\x34\x57\xbe\xed\xc9\x4b\x75\x06\x84\x30\x51\xa2\x0c\xce\xc8\xcf\x4a\xed\xab\xd3\x19\x92\xdc\xb0\x74\xc2\x1d\xa9\x57\x18\x75\xb5\xb8\x84\x6f\xfb\x54\x9d\xaf\xb4\x9f\x2a\x34\xd5\xa9\x6e\xbb\xfb\xb0\x53\x2e\x2d\x60\x46\x43\xba\x5b\xf4\xb7\xa2\x18\xcd\xeb\x8f\x98\xe4\x03\x4c\x0d\x3e\x19\x70\xca\x27\x57\x12\x52\x1a\x6f\x5e\x64\x44\xf4\xa2\x49\x54\xd9\xc9\x82\x72\xf5\x34\xc1\xbd\xe1\xc1\x00\x0e\x36\xd4\xcd\xb5\xe0\xec\x2e\xe7\x50\x3d\x75\x51\xf2\xb9\x49\x89\xf1\x6f\x54\x2b\xe7\xda\x1c\xf8\x95\x0e\xaa\x43\x5d\x93\xa2\xc0\x2e\x42\x68\xa9\x85\x5c\xe9\x83\xb7\x79\x14\xda\x08\x3d\xe4\xcf\x94\xe4\xaa\xf7\x56\x3b\xa2\x7a\xd2\x20\x03\xe8\x80\x71\xe3\x22\x69\xcc\xcb\x6b\x2e\x58\x6f\x3c\x80\xa7\xdf\xb5\x83\x57\xa3\xf8\xe5\x66\xe2\xf1\xe4\x46\xcb\xe6\x95\xbe\xc3\x64\x36\x09\x92\x2b\xed\x60\x7d\x5b\xd6\xa1\x04\xcb\x3f\x11\xe8\xe0\x13\x75\x00\x29\x35\xc7\xfb\x5a\x09\x0a\xe9\x30\x0d\x14\x09\x69\x2c\xe8\x1b\x9a\xa0\x0c\x9f\x29\x79\xef\x55\x3d\x6e\x31\x64\xfa\x2c\x94\xe8\xbc\x58\x23\x4a\x69\xf2\x05\xb3\xa1\xee\x36\x1a\xc0\xb7\x63\xff\x62\x8d\xc3\x86\x2e\x31\xa7\x68\xa4\x3a\xe1\xa7\x94\x8a\x01\x54\x47\x46\x0a\x77\xc0\xc6\x29\x19\xef\x61\x9b\x5e\x31\xf9\x33\x8d\x72\x28\x68\x11\xf5\xb5\xe2\x8c\xde\x51\xa8\x5e\xc0\x8c\x96\xda\xbe\x36\x75\x51\xa8\x75\xf6\xb4\x07\x6b\xaa\x0e\x3f\x68\x6d\xf3\xc1\xfc\x3d\x13\x88\x09\xb0\xae\xe6\xf1\x87\x8f\xf0\x67\x75\xd3\xc9\xab\xb7\xfa\xc3\xe9\xd9\x99\xbd\xa6\xa2\xae\xa0\xf4\x39\x9c\xc8\x54\x46\x93\x7c\xee\xd0\xd0\xe5\x12\xe5\x69\xb4\x07\xd0\xa1\xb7\x34\xc6\x0d\x8a\x6a\xb3\x1a\xf3\x3e\x69\x4c\x6d\xad\x1a\x9f\x7c\x72\x7c\xfd\xf7\x9d\xf5\x0a\xf4\xf4\x75\x14\x2d\x9b\x8c\xaf\xe5\xb8\x1b\x8f\x81\x30\x9d\xec\x58\xd3\x6c\x14\x6a\x53\x14\x76\xd1\xaa\xe1\x12\xf1\x70\xc8\x35\xa2\xea\x1f\x77\x80\x2b\x48\xba\x13\x18\x62\x38\x17\x57\x3b\x42\x73\x29\x4e\x57\xd2\x47\x6f\x5f\xcd\x56\xf5\x4e\xa0\xde\x8d\xde\xdb\xbf\x4a\x8a\xb2\xaa\x4a\xd9\x04\xe4\xdd\xb2\xa3\x75\xe8\x03\xfb\x5b\xe2\xe5\xf6\xfe\x96\x78\xb9\x63\x7f\xcd\x8e\x18\xe7\x0d\x8d\xd9\x04\xe9\xdf\x97\xfe\x40\x23\xbb\x01\x6c\xe8\x25\x50\xce\x1b\xc6\xd0\x9c\x51\x51\xb6\x97\xd0\xd6\x87\xa1\xb5\x40\xf7\xec\xd7\xe0\x93\x65\xea\x55\x5b\x84\x6b\xcf\xb8\xf5\x73\x46\xcb\x02\xa6\xf5\xc1\xeb\xe7\x57\x05\xd2\x5b\xf9\xd6\xe7\xe5\x3a\xbc\x60\x68\x65\x5b\x66\x24\xff\x02\x88\x03\x11\x20\xc3\x24\x5e\xed\xff\xba\x03\x5e\x71\xa3\xbf\x37\xb2\xd1\x14\xa2\x67\x08\x16\x0c\xcf\xa6\x4f\xd4\x0d\x4e\xee\xc0\x9a\x6b\x3b\x52\xa7\xd4\x74\x57\xfb\x10\x3d\x79\x1e\x05\x7b\x0b\xfa\x8d\x67\x75\xbf\x1d\x6b\xcf\xf6\xd9\x08\x3d\x8f\xea\x45\x8f\x4e\x82\x74\x3b\x25\x35\x8e\xa2\xbb\xfb\x54\xde\x6f\x35\x71\xa1\x7d\x19\xc0\xd3\xef\x1b\x26\xce\xcf\x59\x35\x22\xb6\x9c\xa6\x41\xc0\xa6\xd6\x7d\x3d\x62\xdb\x21\x6b\xd5\x11\x84\x18\xff\xd9\x1c\x54\x81\x25\x2a\x80\xce\x40\xc7\x22\x6a\x9b\x04\x04\x6d\x04\x37\xdb\x02\x1a\x87\xf4\xde\x21\x63\x47\x20\xb8\x63\x24\xf9\xfb\x45\x8c\x38\x8b\x51\x51\xe0\x3c\x75\x8e\x9b\xa3\xd0\x93\x44\x00\x75\xeb\x4a\x86\x38\xef\x45\x8c\xae\x20\xa1\xd9\x90\x2f\x87\x07\x4f\x1b\x60\x1a\x9d\xc4\xb2\xf8\xee\x79\xe5\x79\x54\xd5\x1d\x44\x55\x75\x48\x29\x9e\xa8\xf0\xcc\x0b\x12\xfb\x7d\xbf\xdc\xbf\x16\x27\x7a\x45\x5a\x8e\x42\x8f\xa8\x6a\xc3\xf0\xda\x6b\x2b\xbf\x0c\x53\x94\xcf\x9d\xd9\x7d\xd0\x88\xcd\x68\x7f\xdc\x30\xd8\x4e\x82\xe4\x43\x0d\x56\x1b\x51\x38\x5c\x2f\xca\x0d\xc4\xa4\x49\xc5\xb7\xcd\xa1\x78\x8d\x2d\xce\x7b\x45\xe7\xd5\xc1\x7c\x80\xa8\x46\x65\x34\xa9\xcf\x84\xb5\x16\x91\xd7\x6b\x34\xf1\x07\x50\x41\xa8\x7c\x6f\x34\x01\xa2\x9f\xdc\x59\x71\x96\x1e\x6a\xa4\x4a\x80\xec\xf9\xf8\x18\x2f\x0b\xb1\xee\x55\xbc\xc2\x99\xdb\x3f\xdd\x21\x91\x63\x15\xce\xab\xdb\x02\x27\x82\x07\xa7\x1b\x92\x8c\xf2\x92\x61\xae\xae\x66\x41\x59\x16\xc3\xd1\x4c\x60\x73\x5e\x0d\xdf\xe2\xa4\x54\x1a\x48\xaa\xa9\xff\x3d\x03\x56\xe6\xd2\xfe\x00\xe1\x12\xdf\x9c\xdc\xe0\x5c\x29\x7b\x46\x33\xb8\x46\xc9\x17\xb8\xc6\x33\xca\xf4\x99\x70\x92\x97\x24\x9f\xab\xab\x21\xcf\xd5\x4d\x9c\x56\x9b\xe9\xc5\xcb\x01\xf1\x75\x9e\x2c\x18\xcd\x69\xc9\xb3\xb5\xaf\xed\x70\xf1\x4a\xf5\x8c\x7b\xf2\x33\xaf\x8e\x80\xbf\xa3\xea\x25\x97\x03\xa3\x45\x5c\xe5\xc3\x71\xb1\x35\x85\xe0\x12\xee\x48\xe1\x50\xb5\x8f\x7a\x7c\x18\x88\xb0\x69\x77\xf5\x6a\xaa\x7b\x89\xf5\x45\x12\x4a\x9e\xe4\x83\x5e\x75\xb5\xc3\x59\xb2\xc0\x69\x99\x61\x73\x59\xd4\xad\x50\xef\x25\x0e\xae\x6f\x55\xa1\xa5\x08\x0a\xf5\x5b\xc6\x74\x08\x77\x03\x18\xd7\x2e\x61\xcb\x32\x77\x25\x0e\x07\xc3\xf7\xa2\xa5\x1a\x5e\x01\xf4\xba\x6b\x89\x6a\xe7\xac\x5d\x2e\x4f\x75\xee\x8a\x67\xb7\x14\xca\xfe\xfa\x6b\x5b\xc9\x47\xb3\x66\x52\xf3\x4b\x59\xcc\x96\xf3\x09\x8d\x92\xe1\x48\x99\xb9\xa1\x2a\xc0\x8a\x36\x96\x44\x1d\x7a\xae\x94\x9d\xc4\xe3\x0f\x1f\xe3\xad\xa4\xef\x4e\x59\x78\x7c\x3c\x4a\x8a\x72\xa8\xd2\x5c\x43\x4d\xa4\x9a\x8b\xdd\x89\x74\xb7\x4e\xb1\xcf\x39\x9a\xa3\xac\x3f\x81\x53\x3c\xd4\x97\x05\xaa\xd3\x0d\x6f\x28\x4a\x01\xa9\x45\xa6\xee\x37\xe5\x02\xa9\xdb\xfe\x1a\x25\xd7\x06\xd9\xa6\x11\x8c\x46\xf0\x7f\xfc\xa3\xc9\x4f\x24\xf5\x19\x45\xa9\x26\xfb\xc9\x0e\x64\x8f\x46\x15\xe5\x3b\xf1\x2a\x38\x56\xeb\x29\x7c\xc5\x38\x7b\x2e\xf7\xa1\xbc\xdb\x89\x82\xda\x69\xc4\x3a\x0d\xba\xeb\xea\x34\xe3\x7d\x89\xb0\x52\xa6\xcb\x55\xb6\x08\xda\x7d\x57\x81\x5f\x13\x68\xea\xf4\x1e\xc6\x2a\x4b\xa5\xd9\xd9\xdb\x42\xa6\xdd\x17\xdb\x99\xce\xa0\x4a\xc4\xee\x64\x0e\xd5\x36\xef\xef\x31\xa9\xe1\x76\x6c\xd5\x9f\xde\x58\x79\x28\x6b\x5c\x01\xeb\x16\xee\x34\xdd\xcb\x0e\x8a\xb7\xdb\xdb\x1a\x55\x75\xc5\x55\x72\x41\x97\xe6\x3a\x5d\xbe\x45\x85\x29\xd8\xab\xa5\x86\xdd\x6d\xe6\xe6\x58\xe8\x2e\x4c\x0f\xfe\xd2\xa8\x7b\x3c\x55\x0e\xad\xfe\x22\xbc\x16\xc4\xc3\x50\x75\x68\x68\x72\x59\x37\xf7\x4f\xad\xd0\x2e\x12\xf4\x0a\x55\x6f\x87\x06\x47\x35\xb7\x35\xe3\xe5\x77\x71\xe8\xa1\xb8\x6b\x9d\x69\xff\x3c\x4e\x75\xef\x4b\xe3\x38\x0e\x4c\x65\xa0\x25\xc2\xf3\x44\xbc\x5e\x3d\x1b\x9a\xcd\x6a\xcb\xbd\xe3\xc0\x64\xb0\xf1\x3e\x83\xde\x03\x8e\x99\x6d\x9b\x54\x13\xa8\xe8\x2a\xed\x63\x5a\x5a\x0f\xf8\x4f\x56\xdf\xfa\x3d\x0c\x0d\xdc\x30\x91\x80\x51\x3f\xbe\x41\x59\xcf\xe3\xe0\xa6\x93\x74\x7b\xe1\x3c\xb5\x61\x0f\x54\x55\x00\xaf\x8a\xb0\x5f\xac\x8f\x8b\xb2\xf5\xe4\xaa\x47\x7d\xbf\x71\x32\xd1\x54\xac\xef\xce\xbf\x7a\x81\xf3\x83\x59\x68\x34\xf0\x43\xb8\xb8\xe1\x74\x5a\xc8\xc8\xae\x3e\xb6\xf2\x52\xf7\xf0\x10\x76\x1a\x96\xb6\xf8\x9c\xe1\x01\x68\x94\xeb\xbe\xea\xa7\x9c\xb9\x4a\x56\xe8\xab\xe9\x8f\x3f\x7c\x1c\xe8\x6a\x4a\x24\x60\x49\xb9\x80\x48\x73\x05\x70\x2e\x18\x09\xd3\x14\x1b\x85\x40\x35\xd3\x93\xd2\x5c\x4e\xb2\x43\x37\x75\x68\x00\xd7\xfe\xb2\x42\xb1\xb9\x75\x84\xc7\xd2\x2b\x7d\x0e\xd7\xc1\x83\x46\xe5\xa4\xae\x95\x01\xb8\x03\x9c\x71\xdc\x86\xe2\xd9\x36\x14\x21\x86\xda\xcb\x84\x2e\x0b\xc4\xf0\x8b\xb5\xd4\x91\x9a\x5a\x8f\xf7\xfe\xa5\xe5\x2d\x23\xb5\xc7\x15\xd4\xf6\xf3\x92\xe4\x9d\xca\xc5\xb2\xac\xaa\xd5\x55\x4c\x0a\xfa\x7e\xc8\x8c\x6a\x81\x6c\x9f\x54\x75\x63\x5f\xd7\xbc\x76\x0b\xe4\xe3\x4c\xad\x29\x98\x0f\x66\x37\x74\xb0\x76\x9c\x60\x83\xe8\xd9\x0e\x88\xfe\xff\x9c\x66\x09\x61\xa8\x23\x82\x32\xb8\x46\x5c\xff\xc8\x83\xe9\x83\xd1\x2c\xc3\xac\x5e\xf1\x1c\x0e\x87\x97\xd7\x47\xca\xdc\xbd\xf0\x2a\xdc\xca\xeb\x23\x5d\x9c\xfc\x5c\xbd\xd1\x47\xfc\xc3\xc3\xaa\x8a\x63\x1e\xdf\x5d\x9b\x67\x9d\x6d\x86\x7e\xa3\xe0\xcd\xf8\xd0\x3b\x1f\x6e\x85\xd8\x66\x24\x65\xf0\x6b\x27\xd0\x7e\x0f\x4e\x0f\xeb\x6c\x62\xe7\x6d\x0a\xe6\xba\x25\x1e\xb0\xde\x2b\x6b\x29\xca\xb3\x72\xe9\xef\xd0\x6b\x21\xf1\x1e\xfa\x0d\x4d\xee\xb2\x71\x0e\x5f\x3e\xae\xca\xdb\x34\xca\x7d\x9d\xfa\x6c\x3f\xcf\xe9\x3a\xb1\x60\xbb\x9c\xfd\x0d\x8e\xdc\x27\x45\x39\xb1\x7d\x8d\xda\x88\x34\x92\xe5\xf5\x37\xf1\xfa\xdd\xd2\xa4\x31\x1d\xea\x02\x55\x3a\x03\xb2\x5c\xe2\x94\x20\x11\xce\x02\x1f\x98\xcb\x55\x65\x0c\xab\x1d\xb7\x6a\xd6\xbc\xb9\xb9\xb7\xef\xe5\xce\x71\xd7\x5c\xe4\x40\xaf\xfd\xfa\xab\x59\x36\x1b\x80\x82\x0b\x59\x5d\x8b\xaf\x5a\xfa\x73\x3f\xe4\x71\x19\xd4\x29\xf9\xa0\xd5\x2f\x12\xa8\x8c\xdd\xa6\x7e\x9b\xb2\xd2\x10\x44\x68\xa2\xbe\x08\x66\x47\x2e\xa7\xcb\xda\x25\x17\xea\xe1\xa1\xbb\x4e\xb0\xcb\xdf\xd5\x83\x78\x00\x4d\x75\x9f\xb7\x93\xae\xaf\xa6\x53\x95\xc5\x98\x91\x1c\xa7\x9e\x3f\xe6\x43\x56\x4b\xb8\x71\x78\xbe\x7d\x81\x1e\xb6\x20\xd1\x0a\xb3\x71\x17\x49\x4d\x1f\x6f\x50\xc8\x61\x5d\x01\xaf\x6a\x62\x7b\x2d\x67\x30\xa4\x6b\x68\x63\x50\x8e\x33\x7d\xe8\xb1\x76\x6e\xc6\x64\x64\xed\x57\x2f\xd7\xcd\x0b\x94\xbb\xd4\x7e\x55\x73\x3b\x81\xa8\xdf\x06\x7e\x5d\xc1\x86\x94\xa8\xa1\x6d\xad\xcc\x85\xda\x21\x12\x9b\xa1\xac\xf6\x96\x72\xbc\xb2\x6a\x52\x32\x67\xc6\x30\x5f\xe8\x8b\x37\x2b\xa3\xa2\x2f\xaa\xe5\x06\x5c\x17\x35\x57\xc3\x86\x94\xd1\xa2\x76\x2b\x94\xda\x8e\xb2\xfc\xab\x20\x6d\x7a\xbb\xeb\x50\xe3\xc6\x33\x8b\x55\xb1\x74\xe7\x82\xf6\x37\x8e\x6a\xeb\xb8\xed\x0c\x59\x6b\x91\xf2\x46\xe4\xed\x4d\x76\xc8\x2b\x77\x4c\x52\xa5\x21\x76\x99\xc4\x28\x3a\xf4\x2f\x8e\xcb\x32\xef\x4c\x91\x3d\x32\xe8\x66\x22\xdc\x32\x53\x9b\x05\xf5\x69\xe8\x2e\xa5\xbc\xe7\xc8\x1b\x7b\x66\x81\xbc\x75\x9c\xe0\x6b\x45\x68\x4f\x3e\xd5\xf7\x67\xe4\x2a\xc8\x48\x7d\x83\xc9\xae\x14\x21\x58\x2f\x62\x34\x53\xa5\x2f\x05\xc3\x1c\xe7\xfa\xe7\xa1\x3a\xe0\x1d\x4e\xd4\x8e\x72\x03\xfa\x25\xce\x4b\x22\xf0\x72\xd7\x76\x02\x5d\xeb\x4d\x9c\x01\x0c\x0f\xb6\xb6\x49\x32\x92\xc8\xf5\x62\x97\x4e\x2c\x1b\xab\xcb\x7a\x6a\x55\xee\xfd\xad\xa8\xda\xf4\x45\xb5\x45\xed\x29\xb7\xdd\xe7\x66\x5c\xdd\xe7\x64\x8d\xbf\x52\x15\xda\xe7\x52\xf7\xfa\xb6\xef\x46\x84\x2a\xa5\xf2\xad\xbc\xac\x58\x4b\x31\xac\xf7\x56\x12\x5d\xdd\x05\x6c\x86\xfd\xdb\x72\x55\xcd\x2b\x6b\x3b\xbd\x0b\xfd\x4f\x2a\xa7\xc6\x86\x20\x61\x5c\x9c\x96\x79\x98\xe0\xea\x82\x82\xa9\xbd\x57\xdd\x03\xbe\x57\xc6\xd1\xfe\x6b\xdd\xe9\x6f\x48\x43\xe4\x10\xe8\x3c\xc2\x2e\xd9\x51\xfd\xef\x6e\x37\x0a\x6b\x19\xe3\x80\x3c\x2b\x5c\x51\xc3\x46\xd6\x13\x79\x0f\xe9\xb9\x3d\xf1\x19\x10\x10\x66\x18\x77\x4a\x29\x76\x50\x72\x17\x66\xc6\xee\xbb\xab\xe6\xa7\x5e\x7c\xf7\x02\xa5\xe9\x51\x96\xa9\xfb\xe7\x1b\x4e\x6e\x23\x7b\xaa\x7e\xf6\xc2\x3d\xdc\x5e\x0b\xad\x23\x15\xd9\xe0\xac\x50\x67\x43\x5a\x38\x19\x72\x31\xb0\x05\xc1\xa2\x01\x92\x37\x29\xb2\x87\x98\x6d\x98\x35\xf5\x41\x2e\x82\xf6\x97\x5e\xa5\xb0\x7f\x67\x69\x45\x5e\xfb\x65\x1e\xfa\xbd\x31\x20\x0e\x38\xb4\x10\x16\x4c\xf1\xf1\x6f\xea\x77\x93\xaa\xbe\x2f\x1c\x86\xea\xf6\x0f\xb5\x1a\x15\x30\x4c\xcd\xaf\x19\x98\x17\x76\xe8\xfa\x67\x07\xaa\x21\x5b\xc4\x75\x65\xa0\xc1\xa6\xd2\x2a\x87\xf2\x27\x8d\xed\x75\x29\x04\xcd\x87\xd2\xe6\x3a\x1a\xfa\xf1\x82\xa4\xd8\xcf\x11\xde\x39\x55\x60\x4d\xb4\x37\xe8\x7d\x88\xae\x54\x2f\xbc\xa3\x68\xa2\xb1\xe4\x37\x19\xc9\xfb\x9b\xc9\x7b\x1b\xca\x87\x9b\x4a\xdf\xf0\x29\x86\xfb\x66\xcf\xb1\x64\xa0\x27\x67\xab\xe9\xb3\xc6\xcf\x40\x7b\x1c\x97\x33\xe7\x44\x20\x9c\xb8\x40\x34\xbc\x9f\xc0\xd0\xff\x2c\x65\xbd\x26\x39\x87\x0d\x55\xe1\xff\x98\x96\xbf\xe6\xe7\x58\x68\x8d\xa4\x0f\xd7\x79\xb2\xe1\x8e\x8d\x7b\x2b\xa4\x61\x12\x9d\x44\x7e\x40\x84\x55\xcb\x66\x7f\x9f\xf8\x41\xd9\x96\x66\xf6\x27\xcd\xa6\x10\xf4\xef\x4e\x94\x77\x9c\x26\xf7\x03\x23\x9f\x15\x96\x0d\x55\x58\xe4\xe4\x58\xca\xf0\x6f\x8e\x8e\x54\x5f\xdb\x23\x23\x33\xd9\xba\x62\xc1\x1d\x6b\x6c\xf2\xbb\xda\xb0\x31\x50\x53\xe9\x97\x19\xf6\x6d\xe3\xb8\xbe\xf9\x28\x18\xb7\xb9\xf1\xc8\xcf\x5b\x6d\x9d\x00\x75\x2c\xec\x42\x5d\xb0\xa8\x70\x54\x61\x42\x4b\xf0\x15\x24\xae\x14\x2b\x71\x5a\x97\x44\x63\x24\x36\x8d\xfa\x9d\xbd\x88\xb3\x39\x72\x3b\xcf\x51\x74\xe8\x4f\xfb\xce\xa3\xa8\x49\x47\xd3\xfa\x7a\x55\x88\x1d\x17\xbe\xdd\xdf\x54\x79\xad\x94\xe7\xd9\x1a\x63\x74\xb4\x6b\xd4\x11\x06\x16\xd6\xb3\x48\x6d\x6b\x10\xdd\x06\x83\xeb\x94\x9c\x1a\x5c\x60\xc3\xbc\x4b\xb0\x76\x58\xf5\x35\x4c\x0f\x33\x93\x7a\x77\xeb\xe6\x1c\xdf\xfa\x85\x80\x00\x8a\x09\x90\x64\x88\xf3\xe9\xa7\xc8\x86\x8f\x9f\xa2\xe7\xf0\x4c\x5b\xb1\xea\xdd\xb5\xc8\xe1\x5a\xe4\xc3\x14\xcf\x50\x99\x89\xa8\x76\x89\x87\x6d\x3a\x14\x74\x3e\xcf\xf0\xa7\x08\xc4\xba\xc0\xb2\x9d\x42\xf3\x29\x02\x92\x56\xdf\x6a\xa6\xd1\x12\x69\x09\xdc\x0f\x28\xfc\x14\xa9\x1a\x47\x83\x38\xa0\x12\x10\x23\x68\xb8\x40\xbc\xa0\x45\x59\x4c\x3f\x45\xd2\xa4\x7f\x8a\xea\xb4\x29\x28\x7c\x5b\xa0\x3c\xc5\x92\x08\xa5\xdd\x3f\x45\xae\x02\xd8\x75\x0c\x5a\xfd\x68\x62\xeb\x16\xd9\x47\x5a\xd3\x6b\x9f\xa2\xe7\xcf\x46\x4a\x71\x81\x46\x60\xd9\x96\x20\x86\x83\xb7\x23\xcd\x82\x8e\xce\xcb\x6c\x7b\xd7\xc6\x2d\xf8\x14\x35\xe6\x6d\x28\x4d\xee\xa7\x08\xa4\x05\x9e\x7e\x8a\xf4\xb7\x56\x6e\x28\x14\x19\x4e\xaf\xd7\x5d\x93\x22\x95\xb7\x92\x83\x51\x99\xc9\xff\xd5\x62\x69\xa5\x59\x4a\x50\x45\xb4\xfb\x95\x3f\xa9\xfc\xbb\x50\x06\xc8\xfc\x30\xdf\x20\xee\xd7\x6e\x93\x0d\x33\x01\xba\xb9\x51\xf6\x2d\xa5\x90\x7e\x09\x64\x4d\x85\x86\x9a\xe9\x31\x7e\x71\x07\x15\x85\xd1\x2f\xa3\x7f\x9b\x9f\xde\x09\x0b\x01\x77\x52\xc6\xff\x21\x51\xc7\xef\xa3\x5d\xf5\x9b\x8f\xb9\x3e\xc9\x18\xc2\xa9\xdf\x06\xf7\xd5\x70\xf3\x82\x81\x96\x40\xe5\x7e\x61\x4d\x67\x7a\x42\x8f\xed\x98\x66\x46\x57\xf9\x2e\xef\x4e\x0d\x9a\xbe\xf0\xae\x81\xeb\xe1\x5e\xe8\x14\x37\x4e\x63\x81\x72\xab\x3d\x8f\xc6\x24\xff\xbb\x9c\x9c\x90\x35\x9a\x2b\x21\x9b\x2e\x02\x74\x97\x8d\xd8\xce\xdc\xc3\x9d\x3b\x14\x3e\x3f\x8c\xcf\x3a\x75\x6f\x8d\x8f\xe3\xc6\xde\x71\x1a\x2c\xe8\x44\xc6\x40\xea\x27\xf5\x5d\x47\x61\xa0\xa1\x7f\xc4\xce\x76\x73\x51\xc1\x5f\xfa\xf1\x46\x78\x26\x45\x35\x69\x09\x34\xf4\xcc\x57\xb0\x95\xd7\xf2\x34\xec\x31\x44\x36\x6e\x45\xd4\x79\xa1\xb7\x03\xda\xe9\x0e\x82\x16\xb5\x3f\xf0\xd7\x47\xa0\xd8\x6d\xcd\xb9\x2a\x40\x49\x61\xb5\xc0\x2e\x81\x08\x33\x92\x13\xbe\xc0\x5c\xfd\xce\x8e\x2a\x13\x0f\x9d\xcc\x0f\x68\xee\x6d\x12\xe8\x8e\x16\x88\x1f\x17\xa5\xfa\xfb\xd6\xd4\x30\x54\x3a\xde\x3f\xdf\x34\x1a\xc1\x4b\xf5\xe3\xc6\x33\x2c\x92\x85\x96\x4b\xfd\x23\xc3\xfa\x37\x8f\x17\xe8\x06\xab\xdf\x3a\x76\xbf\xfe\xe8\x76\x28\x8e\xdd\xaf\x52\xbc\x0d\x4a\x06\x3a\x92\xfe\xe1\x81\xf4\xda\xb2\xeb\xdc\x02\xf0\x12\x87\x36\x51\xd1\x91\xf4\x84\xa9\x1d\x64\x1b\x50\xa8\x55\xa7\xa1\x96\x3d\x6c\xdb\x9c\xe8\x52\x04\x5d\x64\xd4\x22\x83\x6a\x61\xec\xe0\x13\x1f\x8c\x83\xdd\x28\x73\x28\x2a\xb8\x30\x14\x09\x3d\xdd\xaa\x1a\xdf\x04\x48\x80\x6f\x30\x5b\xc3\x0f\x63\xb5\x65\xb5\xe3\xcf\xe8\x55\xe6\xb4\x71\x24\x18\xee\x73\x88\xd8\xed\xb7\x73\xef\xbe\x95\x46\x49\xd9\x23\x10\x75\x6f\xb2\xaa\xa2\xc7\x01\xfc\x30\xd6\xe7\xb9\xdd\x99\x06\xff\x27\x11\x07\x72\x95\x29\x7f\xc8\x4b\xde\x6b\x9e\x1e\x58\x96\xb6\xfe\x50\xa2\x2b\xf0\x74\x6f\xbb\x43\x20\x3f\xbf\x5f\xcb\xe7\x77\x73\xaf\x1e\x04\xcb\xd1\x54\x87\xd3\xb5\x7f\xf3\xff\x02\x00\x00\xff\xff\x38\xce\x15\xfe\x42\x86\x00\x00") - -func pagesAssetsJsContainersJsBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsJsContainersJs, - "pages/assets/js/containers.js", - ) -} - -func pagesAssetsJsContainersJs() (*asset, error) { - bytes, err := pagesAssetsJsContainersJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/js/containers.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsJsGchartsJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\xfd\x7b\x7b\xd3\xba\xd2\x38\x80\xfe\xcf\xa7\x68\xb5\xd8\x59\x36\x51\xd3\xa4\xdc\x4a\x5c\x35\xbf\x16\x0a\x14\xe8\x85\xb6\x50\xc0\x78\xef\x47\x37\x27\x6e\x9c\x38\x75\x9c\x5e\x20\x3d\x9f\xfd\x3c\x33\xf2\x45\x4e\x53\xf6\x7a\xdf\xf3\x9e\xc5\x7a\x1a\x5d\x46\xd2\x68\x34\x1a\x8d\x46\x23\xd9\x09\x67\x63\x99\x45\xc9\xd8\x71\x57\x7e\x3f\xba\xe2\xe9\x0a\xe7\x4c\x8f\x65\xa2\xf4\x97\x93\xfd\xd7\xc9\x68\x92\x8c\xf5\x38\xa3\x82\xb3\xeb\x68\xac\x92\x6b\x2a\x39\x3b\x12\x17\x5a\x66\x54\x71\xb6\x3f\x0e\xa3\x71\x94\xdd\x52\xcd\x99\x4a\xe4\x6c\x04\xb0\x21\x67\xd1\xf4\x90\x1f\xd2\x01\x3b\xe0\xd9\x80\xf6\x39\xdb\x49\x53\x7e\x4b\x07\x9c\x1d\xce\x46\x42\xa7\x34\xe2\x0c\x00\x46\x6c\x2f\x4d\x93\x94\x5e\x70\xb6\x9b\x24\xb1\xe6\x63\x3a\xe4\x6c\xc2\xd3\xa9\xde\x1f\x67\x34\xce\xc3\x6f\xe3\x84\x67\x74\x0c\xd5\xbe\x85\xe6\x34\x4d\x38\x53\x7a\x11\x49\xaf\xe8\xcb\xca\x84\x3b\x9c\x0a\xf7\x77\xaa\xb3\x59\x3a\x5e\xe1\xad\xeb\x48\x65\x03\x26\xee\x4a\x88\xcb\x45\x08\xc5\x33\x6e\x03\xa4\x8b\x00\x52\x47\xb1\x0d\x30\x5d\x04\x08\xe3\x24\x49\x6d\x88\xec\x1e\x44\x92\x8e\x78\x66\x83\xcc\x16\x41\x52\x3d\x4a\xae\xb4\x0d\x72\x75\x0f\x91\x58\xf3\x5a\x3b\xd7\x8b\x10\x7d\x9d\xbd\x4e\xe2\xd9\x68\xbc\x3f\x56\xfa\x86\x89\xbb\x47\x25\xec\xcd\x22\xec\x34\x4b\x93\x61\xad\xc1\xdb\x25\xd5\x9d\x45\xa3\x1a\xcc\xaf\x7b\x5d\x8b\xe2\x1a\x75\x76\x16\x01\xb2\xe4\x34\x4b\xa3\x71\xdf\x06\xda\x5d\x04\x9a\x24\xd3\x08\x72\x6c\xa0\xd7\xf7\x6b\xfa\x70\x7a\x74\x68\x83\xbc\x59\x04\x19\xeb\x9b\x1a\x99\xf7\xee\xd1\x30\x19\x4f\xb3\x74\x26\xb3\xfa\x88\xbd\xbd\x3f\x62\xe3\xec\x34\xfa\x55\xeb\xfb\xbb\x45\xa0\x91\x9e\x4e\x79\xbf\x06\xb3\x7f\x7f\xd0\x92\x71\x0d\xe2\xe3\xfd\x81\xe0\x69\x0d\xe9\x4f\x8b\x10\xc0\xfa\x36\xc0\xc1\x22\x80\x48\xb2\x2c\x19\xd5\xc6\xfb\xf0\x5e\x33\x92\xc7\x35\x44\x8e\xee\xb1\x60\x72\x3d\xb5\x01\x8e\x97\x10\x2f\xe3\xd1\xb8\x06\xf4\x79\x11\x28\xe6\x42\xd7\x38\xe2\xe4\xde\x8c\x8b\xa6\x93\x98\xdf\xda\x30\xa7\x8b\x30\x03\x1d\xf5\x07\xb5\x4e\x9f\xdd\x43\x77\x11\xe2\xcb\x3d\xba\x4d\xf7\x46\x93\xac\xd6\xd0\xf9\xfd\x4e\xcf\xc6\xca\x86\xf8\x76\x9f\xfa\x63\x9d\xbe\x3f\x3b\xf8\x64\x43\x7d\xbf\x4f\x9b\xb8\xce\x52\x3f\xee\x11\x46\x87\x35\x74\x1f\x2f\x02\xe8\xcb\x19\x8f\x6b\xc4\xe5\x62\xb1\x95\xe9\xf4\xcc\xb0\x78\x35\xd2\x62\x11\xa8\xaf\xb3\xf7\xf7\xc8\x27\x17\xa1\xb2\xdb\x49\x8d\x1d\xd4\x3d\x00\x2e\x0a\x31\x52\x02\xe9\x7b\x40\x29\x1f\x4f\x63\x9e\xd5\xaa\x0a\x17\xa1\xc6\xbc\x2e\x45\xfa\x4b\x50\xfe\xca\xe3\x59\x0d\x68\xb0\x08\x84\x4b\x82\x0d\x11\x2d\x42\x5c\x45\xd3\x48\x44\x71\x54\x1f\xf3\x8b\x45\x30\x91\xc4\xb5\x21\x1f\x2e\x02\xc4\x7a\xdc\xaf\x2f\x1b\xf1\x3d\x64\xd2\x24\x4b\x16\x69\x38\xba\x37\x5e\x31\x9f\x4e\x0f\x17\x7a\x3f\x5e\x84\x4a\x26\x5c\x1a\x9c\xab\x51\x4d\x16\x81\xa6\x09\x4a\x09\x5c\xaa\x2f\x19\xe1\x93\x89\x1e\xab\xd7\x83\x28\x56\x84\x4e\x04\x23\x61\x14\x67\x3a\x25\xf4\x52\x30\xc2\x65\x16\x5d\xe9\xbd\x58\xc3\xb2\x4c\x68\x2a\x18\xe9\xeb\x6c\x17\x58\x3d\x1a\xf7\x5f\xc7\x91\x1e\x67\x27\x5a\x66\x84\x4e\x05\x23\xd3\x41\x14\x66\x84\x66\x82\x11\x7d\xa3\x25\xa1\x29\x23\xb8\x6e\x12\x3a\x13\x8c\xc8\x24\x8e\xf9\x64\xaa\x09\xbd\x12\x8c\x4c\x78\x96\xe9\x74\x4c\xe8\xb5\x60\x24\xd5\x93\x98\x4b\x4d\xe8\x8d\x60\x24\x4b\xde\x46\x37\x5a\x11\x7a\x0b\x85\x74\x14\x13\x9a\x31\x82\x8b\x23\xa1\xbf\xb0\xa2\x71\x86\xf8\xec\x08\x46\x92\x30\x9c\xea\xec\xdc\x34\xb3\x6b\x72\x25\xcf\x08\x7d\x0d\xe1\x01\x4f\x77\x32\x42\xdf\x40\x38\xd5\x3c\xd3\xc0\xf5\x87\x89\xd2\x84\xee\x99\xce\xbc\xe1\x99\x26\xf4\xad\x60\x24\x1a\x4f\x75\x9a\xed\xea\x30\x49\x35\xa1\xef\x30\x25\xd3\xe9\x15\x8f\x09\x7d\x0f\x78\xf1\x14\x16\xb2\x64\x26\x07\x7a\x4a\xe8\x3e\xf4\x58\xa6\x5a\x8f\xbf\x11\xfa\xb1\x8c\x7c\x27\xf4\x93\x60\x64\xc4\x33\x39\x20\xf4\xc0\x34\xf2\xe5\xec\xf5\xdb\x59\x1c\x7f\xd7\x3c\x25\xf4\x10\x88\x8c\x0b\x39\xa1\x47\x05\x45\x6f\x8c\x4a\xf4\x16\xfa\x78\x6c\x88\x35\x25\xf4\x33\xd2\x06\x16\x74\x42\x4f\x04\x23\x97\x33\x9d\xde\x9e\xea\x58\xc3\xba\x43\xe8\x69\xd9\xad\x72\x88\xce\x0c\x22\x49\x1c\x9b\xa9\x4b\xe8\x17\x1c\xd3\x74\x9a\xe5\x63\xfc\xe8\xab\x69\x7f\x8f\x03\x82\xe7\x50\x05\x8e\xe3\x27\x0d\x83\x77\xcd\xc8\x54\x67\x3b\x59\x96\x46\x62\x06\x94\xf9\x56\x02\x9c\x25\x13\x42\xbf\x63\x14\xfb\xf1\x03\x09\x1c\xc5\x0a\xe8\x39\x25\xf4\x31\x34\x8d\xca\x00\xa1\x5c\x32\x22\xa2\xb1\x22\x54\x48\xec\xe1\xfb\x64\x96\x4e\x09\x95\x92\x11\x98\xc4\x53\x42\x15\x04\xf5\x4d\x76\x1a\x89\x38\x1a\xf7\x09\xd5\x06\x12\x34\x05\x42\x43\x13\xc9\xfb\x35\xdd\xbd\x3d\xe3\x7d\xe0\x7f\x42\xfb\x92\x91\x42\x53\x2c\xbb\x3d\x90\x8c\x4c\x67\x62\x9a\xa5\x84\x46\x12\x99\x38\x26\xf4\x42\x32\x32\x49\xf5\x55\x94\xcc\xa6\x65\x33\x43\x09\x2c\x66\x74\x09\x42\x63\x04\x49\x26\x3a\xcd\x6e\xf7\xa7\x7b\xe3\xd9\x48\xa7\x5c\xc4\x9a\xd0\x11\xe4\xe4\xea\x04\xa1\x63\x99\x73\xcb\x2d\xa1\x09\x34\x96\xcc\x52\xa9\x51\xae\x11\x3a\x91\xc0\x2b\x18\xbc\xcc\x7b\x45\x68\x0a\x50\x93\x38\x82\x19\x21\x0b\x3e\x3d\xe6\x29\xe2\x3b\x93\xc8\xa8\x85\x0a\x41\xe8\x95\x64\x64\x36\xd5\xe9\x4e\x1f\xf3\xaf\xa1\x70\xc6\xe5\x90\xd0\x1b\xc9\x48\x9c\x48\x6e\xf0\xb8\x85\xce\xe5\x3a\x05\xa1\xbf\x24\x23\x03\x3e\x3d\xba\x1e\x1f\xe7\x7d\x20\xf4\x06\x4a\xde\x42\x0f\x76\xa0\xd9\xeb\xb1\x4e\xdf\xe4\xe4\x22\xf4\xd1\x2e\x34\x0c\xaa\x04\xa1\xaf\xa1\x0d\xcd\x53\x60\x83\x37\xd0\x08\x2f\x79\x64\x4f\x16\x6c\x7b\x90\x8c\x61\x62\xbd\x35\x09\x86\x81\xdf\xc9\x82\xc7\xf2\x69\x77\x8b\xc8\xa6\x19\xa1\xef\x25\x23\x29\x1f\xab\x64\x44\xe8\x3e\xd6\x9f\x55\x98\x7d\x30\x95\x54\x33\xe1\x23\xd2\x0d\x28\xf4\xa9\xac\xd2\xb0\xe1\x01\xf0\x0f\x2a\x23\x84\x1e\x42\x27\x53\x1d\x12\x7a\x64\x6a\x34\x1c\x72\x0c\x4d\x25\xd7\x53\x42\x4f\x0c\x31\x51\xa5\x20\xf4\x54\xa2\x50\x8b\x6f\x09\x3d\x83\xa1\x2e\xf8\xe6\x8b\x2c\xe6\x92\xc5\xdd\x5f\x0d\x4a\x07\xd1\x78\x96\x01\x53\x9e\x23\x1d\x84\x8e\x09\xfd\x06\x7c\x66\x34\x0c\x42\xbf\x97\x23\x88\xb3\x60\x87\x91\x41\x3e\xbd\x7e\x94\x39\xc5\x84\x7b\x2c\x19\x39\xe1\xe3\x3e\x4c\x03\x65\x44\xe1\xa9\x4c\xa3\x49\x46\xa8\x50\x8c\x8c\x13\xa5\x71\x8d\x22\x54\x2a\x46\x52\x53\xe8\x35\x23\x93\xd9\x74\x40\xa8\x52\x8c\xe4\xfa\x06\xa1\xa1\x62\xe4\x0a\x60\x8f\x42\x42\xfb\x0a\xe7\x57\x34\xee\x47\xe1\x2d\xa1\x03\xc5\x48\xa6\xa7\x19\xa1\x11\x86\x80\xe7\xf6\x80\x24\x33\x98\x76\x17\x00\x1c\x47\x20\x53\x87\x8a\x3d\xc2\x56\xcf\x6e\x27\x9a\xd0\x58\x01\x3f\x71\x45\xe8\x48\xd9\x73\x6c\xf7\x76\x5f\x11\x3a\x86\xe6\x0b\x45\x85\xd0\xa4\x40\x80\xd0\x09\xe4\x64\x7a\x44\xe8\xa5\xca\xd9\x1d\xb0\x7a\x8b\xb2\x0a\x58\x38\x55\x10\x1c\x4d\x78\xaa\x0b\x86\x3b\x2e\xe7\xcf\x34\xef\xb9\x19\x8b\x4c\x15\x82\x2b\x27\xd4\x3b\x46\x62\x1c\xf8\x99\xc2\x21\xce\xd9\xee\x4a\x31\x12\xa6\xc9\xe8\xf5\x80\xa7\xaf\x51\x6a\x5f\x9b\xfc\x8a\x87\x6e\x14\x23\x3c\xe3\xe3\x0d\x42\x6f\x55\x2e\x90\x52\x3d\x26\xf4\x17\x40\x5e\x02\x53\xee\x28\x46\xde\xe6\x02\xf7\x3d\x23\x19\x92\x61\x57\x31\xa2\x74\xc8\x67\x71\xf6\x35\xd2\xd7\x84\xbe\x56\x46\x34\x11\xba\x8f\x64\xc9\xc7\xe8\x8d\x2a\xe4\xdf\x37\x42\xf7\xca\xc8\x77\x42\xdf\x1a\x54\xcc\x02\xf2\x4e\x15\x0c\x8c\x0c\xf2\xde\x90\x36\xef\xc6\xbe\x02\x6e\x86\x89\xf5\x01\xfa\x09\x3a\x01\xa1\x1f\x51\xf0\x98\xb5\x9f\xd0\x0f\x58\x73\xbe\xc8\x13\xfa\xb1\x6c\x28\x9f\x62\x9f\x54\x25\xf5\x08\x3d\x30\xd5\x9f\x6a\x99\x8c\xd5\x94\xd0\x43\x55\xcc\x57\x83\xcd\x91\x62\x24\x57\x06\x08\x7d\x74\x9c\x23\x13\xc5\x71\x34\x2d\x8a\x7c\x86\x91\x8d\xa6\x33\x1e\x47\xbf\x72\xd9\x72\xa2\x90\xe3\x41\xfc\x29\x42\x4f\x55\xc1\xd8\x66\x4a\x9e\x61\x27\xd4\x2d\xa1\x5f\x54\x31\x93\x72\x71\xf1\x89\x11\xc9\x41\xe0\x7e\x05\x2a\x24\xd0\x81\x73\x65\x04\xca\x7e\xc1\x27\xdf\x0c\x12\xd6\xdc\xfb\xae\x16\x16\xb4\x1d\xa8\xe2\x87\xa1\x6a\x25\x7a\x1e\x97\xa4\x28\x26\x18\xd7\x66\x65\x07\x8e\x80\xd5\x5d\xe8\x9c\xf1\xb2\x03\xe4\x11\xa9\x01\x0b\x18\x79\x05\x39\xb3\x14\x64\xee\xa9\x91\x89\x5a\x17\x0b\x05\x8a\xff\x50\x57\x64\x35\x85\xfb\x9a\x11\x7d\xa5\x53\x98\x61\xba\x94\x82\x85\x7c\x88\xca\xa4\x7c\x41\xbb\xd0\xa0\xca\x40\x03\x46\xab\x18\x6a\x58\x5d\xbe\x4c\x26\x3a\x7d\xcd\x41\xd7\x89\xb5\x59\x06\x60\x26\x8e\x34\x23\x17\x49\x34\x26\x34\xd1\x8c\xcc\xc6\xb9\xc2\x34\xc1\x32\x9f\x92\xeb\xa2\xcc\xa5\x2e\x57\xc2\x5f\xc9\x58\x1f\xe1\x28\x10\x7a\xc4\x08\xa1\x9c\x73\x46\x7e\xde\xb4\xdb\x84\xa6\x9a\x91\x9f\x30\xb7\x34\x23\x2b\x84\x66\xf0\xc3\xc7\x6a\x85\x50\xc1\x39\x7b\x44\x56\x54\xa2\xa7\x2b\xe3\x24\x5b\x41\x6d\x64\x05\x38\x6d\x85\x50\xc9\x39\xfb\x7b\x05\x55\x69\xf2\x37\x55\x18\x43\x05\x94\xfc\x4d\x67\x9a\xfd\x4d\xfe\xa6\x57\xf0\xb3\xb2\xbe\xfd\x37\xbd\xd6\x8c\xfc\x45\xa8\x86\x56\xff\x7a\xdc\x79\xdc\x79\xbc\xf1\x78\xe3\xf1\xd3\xc7\x4f\x09\xbd\x81\xac\x36\xfe\x47\xe8\x2d\x44\x36\xdb\xf0\x8f\xd0\x5f\x10\x09\xc3\x90\xd0\x9d\x3c\x84\x91\x5d\xcd\xc8\x63\x42\x5f\xc3\x4f\x87\xd0\x37\x9a\x91\x7f\x11\xba\xa7\x19\x69\x10\xfa\x16\x7e\xfe\x6a\x7b\x84\xbe\xc7\xd0\xd3\x57\x1e\xa1\xfb\x10\xe4\xa3\x89\x47\x68\x08\x18\x34\x0c\x23\xb0\x7e\x92\xf4\x63\xbd\xd6\xbf\x8a\x7e\x11\xfa\x01\x80\xfa\x99\x47\xe8\x47\x08\xc5\x10\xfa\x04\xa1\xcb\x59\x02\xe1\x03\xe8\x19\xa1\x7d\xa8\xe0\xef\xbf\x09\x3d\xd4\x8c\x38\x84\x0e\x20\xee\xfc\x9b\xd0\x23\xcd\x88\x4b\x68\x04\x71\xd7\xf1\xf9\xda\xaf\xc0\x25\xf4\x58\x33\xf2\x84\xd0\xcf\x9a\x91\x26\xa1\x27\x9a\x11\x4a\xe8\x29\xfc\xac\x10\x7a\xa6\x19\x59\x23\xf4\x02\x8a\xac\x8d\x92\x5f\x84\x0e\x4d\x70\x4a\x68\x8c\xa1\x84\xd0\x11\x06\x70\x63\x03\xea\x1e\xa1\x63\x4c\xb8\xd6\x62\x08\x4b\xde\x17\xcd\x48\x8b\xd0\xaf\xf0\xd3\x6a\x11\x7a\x0e\x81\xd3\xd3\x53\x42\x13\x18\x92\xd6\x64\xdc\x27\x2b\xf9\xf6\x95\x74\x36\xc8\x8a\x31\x41\x91\xbf\xe9\x04\xea\x59\x5f\xe7\x17\xfc\xa6\x65\x28\xc1\x27\xd1\xb4\x25\x93\x11\xa6\x11\xfa\xe8\x12\x21\xa6\x19\xcf\x22\xb9\x3e\x4a\xd4\x2c\xd6\xd3\x75\xa0\xd6\x3a\xa1\x29\xe6\xcd\xb2\x28\x5e\x17\x3c\xfd\x0f\xa1\xd3\x2a\xc1\xa8\xa5\xb0\x3b\x24\xf4\x9b\x66\xa4\x4d\xe8\x77\xf8\x69\x3d\x27\xf4\x07\x06\x5e\x10\x9a\x01\x3c\x8c\xf9\x63\x48\x81\xc0\xcc\xa4\xd4\xff\x23\x94\x87\x8c\x74\x08\xbd\x82\xdc\x4e\xab\x4d\xe8\xb5\x09\xbd\x22\x54\x40\x56\x9b\x50\x19\x32\xf2\x94\x50\x15\x32\xf2\x8a\x50\x1d\x32\xd2\x25\x34\x84\x1f\x40\xa1\x1f\x32\xe2\x11\x3a\x08\x19\xd9\x22\xf4\x06\x4a\x6f\xad\x4f\x27\x7c\xbc\xfd\x73\xd6\x6e\x73\x60\x3b\x93\x96\x81\xcc\xda\x26\xf4\x57\x1e\x4d\xb7\x09\xbd\x80\x52\x02\x42\x3b\x40\xcf\xad\x68\xd4\x5f\x41\xc5\x08\x26\xac\x82\xfd\x4b\x77\xa5\x4d\x56\xa6\xa0\xa7\xfd\x4d\x77\x11\x06\xea\xbe\x0f\xe4\xad\x84\x71\xc2\xb3\xee\x0a\x2c\x51\xde\xca\xf5\x20\xca\xf4\xda\x74\xc2\xa5\xee\xae\x8c\x93\xeb\x94\x4f\x3c\xb2\xfd\x37\x7d\x8d\x8d\x17\xa8\xbc\x31\x31\xb5\xdd\x18\x8b\xe9\xc4\xdb\x5a\xcf\xd4\x36\xa1\x7b\x45\x6a\x1e\x1f\x02\x92\x88\x6e\x1c\x32\xc2\x08\x1d\x85\x8c\x6c\x13\x3a\x0e\x19\xe9\x11\xfa\x16\xc0\xff\x1f\xa1\x49\xc8\xc8\x0e\xa1\xef\x20\xba\x73\x7c\xfc\x69\xef\x8c\xd0\xf7\x18\x39\xd9\xdb\x21\x74\x1f\x82\xbb\x3b\xa7\x7b\x84\x3e\x9a\x84\x8c\xec\x9e\x10\x7a\x09\xbf\x5f\xce\xce\x8e\x0e\x09\xfd\x00\xf9\xaf\x8f\x3e\x11\xfa\xd1\x84\x0e\x0e\x76\x0e\xdf\x10\x9a\x86\x8c\xbc\x3e\x3d\xed\xbc\x46\xe1\x49\xe8\x27\xcc\xe5\xe3\xbf\xb3\x15\x99\x8c\x44\x34\xd6\x2b\xd3\xa8\x3f\x8e\xc2\x48\xf2\x71\xb6\xa2\xa2\x7e\x94\x4d\x51\xc4\x8c\xa2\x71\x34\x9a\x8d\x56\xc2\x94\xe7\xbb\x7e\xcc\x23\x74\x0a\x55\xa2\xe9\x10\x24\x12\x46\x50\x31\xd3\xe9\x4a\x64\x64\x91\xd2\x61\x34\x86\x05\x66\x16\x32\xf2\x66\xe7\x3b\xa1\x57\x10\xd8\xff\x4a\xe8\x01\xb4\x0f\x2b\x98\x43\xe8\x2d\x24\x6a\xa9\x47\x02\x36\xa3\xbf\x42\x46\xf6\x08\x3d\x04\x80\xbd\x83\xdd\xbd\x37\x84\x1e\x61\x38\x93\xeb\xef\x0e\xce\x08\xdd\x09\x19\x79\x4b\xe8\x31\x24\xbe\x3d\xd9\x39\xd8\x23\x74\x17\x92\xb4\x48\x67\x1c\x84\xf9\x67\xc8\x79\x47\xe8\x09\xfe\x42\x91\x53\x08\xbd\x27\xf4\x75\xc8\xc8\xfb\xf7\xdd\xd1\x88\xd0\x33\x4c\x3a\xfa\x72\x42\xe8\x1b\x48\x3d\x21\xf4\x0b\x24\xed\xe7\x55\x7e\xc5\xc8\xc1\x3b\x42\xf7\x42\x46\xf6\x0f\x8f\xbf\x9c\x11\x7a\x8e\x89\xa7\xfb\x87\x6f\xf6\xbe\x11\xfa\x0d\x62\x1f\xf8\x15\x2f\x74\xbe\xef\x90\xf0\x91\xd0\x1f\xf8\xbb\xf7\xfd\xdd\xde\x21\xa1\x6f\x43\x46\x3e\x11\xfa\x18\xd2\x3e\xed\x1f\x7e\x24\xf4\x5d\xc8\xc8\x01\xa1\x5c\x70\x46\x0e\xf6\xce\x76\x08\x7d\x0f\x29\xfb\x9f\x3e\xed\x9f\xee\xbd\x3e\x82\xe1\x12\x98\xb7\x7f\xf8\xe5\x6c\x8f\xd0\x7d\xc8\x3d\x38\x58\x01\xa5\x22\x64\x8f\xc8\xc1\xd1\xe1\xd9\x7b\x42\x3f\x42\xf2\xe9\xfe\x1e\xa1\x12\xa1\x41\x36\xa9\x3c\x74\x54\x68\x04\x9f\x42\x46\x0e\x09\xd5\x90\x7e\x78\x84\x7d\x3b\x25\x34\x34\xd1\xd3\xd7\x27\xfb\xc7\x67\x84\x1e\x00\x50\x72\x95\x0f\xc0\x61\xc8\xc8\x11\xa1\x7d\x80\x39\xda\xfd\xb0\xf7\xfa\x8c\xd0\x01\x44\x8e\x77\x4e\x76\x0e\x08\x3d\x0a\x19\xf9\x4c\x68\x04\x49\x9f\x57\x6e\x6f\x6f\x6f\x09\x3d\x86\xb4\x2f\x3b\x27\x67\x7b\x27\x84\x7e\x0e\x19\x39\x25\xf4\x04\x7e\xf2\x16\x2e\x00\xb8\xe8\xdc\x29\x64\xec\x7d\xc2\x8a\xcf\x20\x7c\xf4\xe5\xe4\xf5\x1e\xa1\x43\x04\x3a\xfb\xfe\x69\x8f\xd0\x18\xc3\x5f\xdf\x11\xfa\x05\x20\x78\x36\x4b\x15\x68\xe7\x5f\x21\xa6\x27\x59\x8e\xeb\x08\xc1\xcc\x7a\x7f\x1e\x32\x72\x46\xe8\x37\xf8\xd9\xfb\x76\x66\xe6\xcb\x77\x88\x7d\x22\xf4\x07\xfc\x9e\x10\x3a\x86\x02\x67\x27\x3b\xaf\x3f\x12\x2a\xfa\x8c\x9c\x0d\x66\xe9\x14\x6b\x4e\x30\x27\x49\x56\x46\x7c\x7c\xbb\x32\xd1\xa9\xd4\xe3\x6c\x7d\xa2\xd3\x11\x6e\x30\x27\x98\x0d\xcb\xea\x28\x9a\xe2\x22\xdb\x5a\x41\xbd\x71\x85\xd0\x4b\xc8\xfb\x72\xf6\x9a\xd0\x14\x43\x63\x7d\xa5\xc7\x2b\x63\x3c\xbe\x58\x49\xc2\x15\x9e\xf6\x51\xed\x98\x12\xaa\xfb\x8c\x9c\x13\x3a\x05\xb8\x73\x98\xbc\x19\x86\xf6\xf6\x3e\x12\x3a\xc3\x60\xbe\x66\x84\x00\xa8\xd5\x58\x1b\xec\x1e\x5d\x61\xa6\xd1\x10\xfb\x7d\x46\xbe\xef\xed\x9c\x10\x3a\xe8\x33\xf2\x83\xd0\x6b\xc8\xf4\x09\xbd\xc1\xdf\x04\xed\x0b\x2b\x78\x8e\x12\x10\x7a\x6b\x27\xbe\xcd\x8d\x45\x01\xa1\xbf\xec\xf4\x73\x3c\xb0\x09\x08\xdd\x81\xd4\x9f\x3f\x09\xdd\x35\x01\x58\xbe\xa3\x3e\x84\x20\xf1\x02\x43\x53\x42\x5f\x9b\xdc\x19\xa1\x6f\x4c\xe8\xa6\xbd\x49\xe8\xb0\xcf\x48\x40\xe8\x1e\x24\x05\x4d\x42\xdf\x42\xe0\x3f\xb0\xf6\x98\xe5\xe6\x3f\x49\xac\xfe\x93\x6f\x32\xe2\x3e\x23\xff\xc9\xd5\xf2\xff\x10\x3a\xea\x33\xc2\x09\x9d\xc0\x8f\x98\x26\x31\xea\x8d\xef\xa0\x3c\x8f\x27\x03\xee\x14\x06\x2f\x42\xdf\x63\xe2\x68\x42\xe8\x25\x00\xa7\x11\x5f\x23\x34\xc5\x60\x0a\xa4\x9a\x42\x70\x96\x25\x84\x66\x7d\x46\x04\xa1\x33\xf8\xe1\x72\xd8\xc7\x0d\xd3\x1a\xee\x61\xba\x84\xee\x43\x3d\x82\xa7\x2d\x48\x9f\xe4\xa4\xbd\xea\x17\xaa\xef\x35\x86\xf0\xa0\x89\xd0\x0f\x08\x9b\xa4\x4a\xa7\xbb\xf9\x5e\xf5\xe3\x62\x52\xa1\xbe\x57\xe9\xf9\x06\xb7\x9e\x90\x83\x1d\x56\xa9\x27\x46\xd7\x3d\x5a\x48\xc9\x01\x1f\x1d\x57\xe9\xb8\xe1\xf8\x5c\x8b\xe7\x50\x37\x88\x2d\xee\xd0\xfb\x8c\x48\x42\x4f\x00\xca\xa8\xea\xa7\x45\x50\x6b\x42\xcf\x30\x02\xdb\x0f\x42\xbf\x94\x61\xb3\x15\xf9\x6a\xe2\x9a\xa7\xd5\x2e\x19\x93\x72\x8a\xfd\xea\x63\x78\x36\x1a\x13\xfa\x2d\xcf\x98\x8d\xc6\x6f\xd1\x8c\x38\xf5\x09\xfd\x6e\x12\x71\x63\x48\xe8\x4e\x9f\x11\x45\xe8\x0f\x48\x54\x3c\x83\x61\xda\xed\x63\x50\x13\xfa\x3a\x0f\x65\xb8\xc3\x7f\x8c\x30\x5a\x46\x23\x1e\x9f\xde\x8e\x44\x12\x13\xca\x25\xa6\x4d\x25\xa1\x6f\x00\x38\x4a\xb5\x34\xbb\x97\xbd\xbe\xb5\x5f\x3f\x86\xf0\x15\xa1\x02\xc1\xcb\x7d\xd3\xdb\x3e\x23\x21\xa1\xef\xe0\x87\xc7\xa0\x6a\xef\xf7\x2b\x8b\xe7\x07\x0c\xa3\xe9\xf1\x23\x04\x13\x39\x43\x93\x15\x47\x7b\x19\xa1\x2a\x0f\x8d\x78\x66\xb6\xd2\x1a\x13\xf2\x25\xf0\x4d\xbe\x02\x7e\x82\xa2\x33\x20\xf1\x01\x86\xc6\x39\x7e\x87\x7d\x46\x60\xc7\x01\x65\x72\xfd\xb5\xb6\xff\x5a\x33\x35\x03\xd1\xd6\x78\x9a\x26\xd7\x6b\x2a\x25\xb4\xff\xcf\xc1\xb5\xb1\x19\x3c\x1a\xfc\xf3\x22\xb3\x3e\xa1\x51\x05\xde\x82\x5d\x55\x36\x6d\x11\x7a\x61\x25\xc6\x09\x57\x3a\x6d\xbd\xc3\xd8\xce\x24\x9a\xee\xe2\x26\x65\x68\x81\x8c\xf8\x64\xda\x7a\x53\x8c\xc5\xf4\x54\xa7\x57\xb8\xe1\x89\x2d\x98\x1a\x2a\x2d\x42\x47\x0f\xe6\x1d\xa0\xc2\x7a\xcc\x81\x71\xc7\x0f\x42\x99\x83\xe0\x62\x5f\x9f\x3c\x08\xf7\x55\xa7\x53\x1c\x80\x09\x82\xc0\xb4\x8e\xc6\xfd\x82\x9f\x2e\x31\x11\x26\x5a\x9f\x91\x01\xa1\xc7\xf0\xd3\x1d\x8d\x56\x38\xa1\x9f\x21\xac\xb9\x22\xf4\xa4\x5f\x19\x7c\x52\x28\x31\xd0\x37\x84\x9e\x42\x6a\xa4\x94\x1e\x13\x7a\x06\xe1\x24\x8d\x7e\x81\xba\x13\x13\xfa\xa5\x5f\x18\xad\xbe\x42\x28\x1b\xc5\x84\x9e\x63\x28\x9b\x4c\x09\xfd\xd1\x67\x24\x1a\xc7\xd1\x58\x13\x3a\x85\x0a\xd1\xe6\x72\x86\x46\x9c\xc7\x7d\x46\x86\x84\xf2\x41\x61\x13\x11\x10\x8a\xc6\x43\x42\x25\x84\x12\xd8\xb8\x66\x50\x28\x86\x2d\xee\x80\x91\x11\xa1\x8f\x66\x90\x00\xe3\x40\xa8\x86\x24\x7e\x93\x1b\x30\x42\x88\x69\x15\xcd\x46\x84\xf6\x21\x1c\x8d\xf3\x9c\x2b\x2c\x32\x25\xf4\x1a\x02\xb0\x21\x54\x84\xde\x98\x70\x16\x5d\xe9\x15\x89\x5b\xda\x5b\x4c\xd1\x7d\x4c\x7b\x6d\x6c\x3d\xbf\xec\x34\x34\x6a\x4e\x09\xdd\x31\x89\xd7\x2b\x84\x7e\x66\x64\x8c\x46\xc6\xc1\x80\x91\x31\xce\x86\x33\x08\x98\x05\x3a\x1a\x30\x92\x10\x7a\x01\x3f\xb8\xd2\x10\x3a\x84\xf0\x98\xd0\x78\x60\x59\x2e\x76\xa1\xc2\x64\x96\x95\xd6\x28\xc8\xbc\xd2\x69\x18\x27\xd7\x84\xbe\x86\xdc\x5c\x4b\x2f\xe4\xef\x1b\x2b\xcd\x08\xda\x3d\x2b\x25\x97\xa9\x6f\xad\x24\x14\x9e\x93\x81\x75\x1e\xf1\x0e\x73\xa3\x1b\x5d\x5a\xd0\xdf\x97\x29\xa6\xca\xfd\x32\x9e\xcb\xd9\xcb\x81\x6d\x2a\x4e\x07\x68\x75\x0e\xa3\x1b\x42\xbf\x30\x32\xb9\x21\xf4\x03\x94\x80\xed\x28\xa1\xd3\x01\x23\x29\xa1\xb0\x93\x4b\x75\x8c\xf4\x23\x74\x06\xb1\xbe\x20\xf4\x0a\x02\x09\x28\x2e\xd7\x10\xca\x62\x42\x6f\x06\x8c\x4c\x09\xfd\x08\x55\xe0\xd9\xeb\x5b\x6e\x4c\xc6\xb7\x03\xf6\x88\x4c\x73\x2d\xf3\x17\x40\xa1\x1d\x05\x71\xf8\x84\xd0\x7a\x3c\x4d\x52\x96\x4b\xba\x1d\x80\x18\xa0\x59\x64\x17\x82\xd1\xb8\x0f\xed\xbc\x86\x70\x12\x47\x8a\xd0\x03\x2c\x94\xa4\xf9\xd9\xff\x94\xd0\xc3\x85\x14\x9f\xd0\x23\x93\x64\x59\xbf\x8f\x31\x25\x37\x71\xbc\x19\xa0\x2d\x38\x8b\x24\xa1\x7b\x83\xc2\x60\x49\xe8\xdb\x41\x69\x96\xfe\x8c\xf0\x10\x9e\x0e\xb4\xce\x08\x7d\x07\x79\xb3\x10\x09\x76\x02\x99\xc5\x89\x21\xa1\xa7\x79\x34\xb7\xae\x9f\x61\x54\xdf\x64\xeb\xb8\x45\x7d\x3f\xc8\x63\x17\xfc\x8a\x17\x94\xf8\x52\xc0\xbc\x2e\x8e\x89\xf6\x01\x0c\x57\x94\xaf\x98\x17\x8d\xf4\x0f\x64\xce\x0f\x79\x46\x12\xa2\x3a\xf5\x11\xa2\xd5\x76\xfd\x53\x11\x9d\xe4\x46\xfb\x03\x4c\x80\x99\x73\x38\x28\xcc\x88\x47\x03\x34\xe4\x20\xe5\xcd\xb9\xc1\xf1\x80\x91\x2b\x42\x3f\x0f\x4a\xcb\xe9\x39\xb4\x8a\x61\xb3\x6c\x7c\x33\xf1\x74\x85\xd0\xef\x45\xf0\x3f\x3a\xfb\xcf\x0a\x5b\xe9\x78\x84\x9e\x40\x49\x9d\x66\x91\x04\x41\x72\x3a\x40\x3b\x5d\x84\x75\xff\x40\xf0\xba\xd5\xee\xd1\xd9\x80\x91\x6b\x42\xbf\xc0\x0f\x6c\x4d\x09\xfd\x3a\x28\x0f\xde\xce\x07\x8c\xdc\x12\xfa\x6d\xc0\xc8\x2f\x42\x1f\x43\xf9\x5f\x49\x32\xda\x9d\x65\x59\x32\x9e\x1e\x81\xbe\x40\xe8\xf7\x01\x23\xbf\x09\xe5\x8a\x33\xf2\xbb\x7d\x47\xa8\xc0\x50\xe7\x8e\x50\x09\xa1\xb9\x4f\xe8\x8f\x01\x23\x77\x84\x3e\x1e\x30\x52\x6c\xbe\x15\xe4\x61\xe4\x19\xa1\xda\x44\x36\xda\x4f\xdb\x84\x9e\x53\x1e\x31\x1e\xcd\xe7\xbf\xef\xa8\x88\x58\x36\x88\xa6\x95\x6f\x8d\x8c\x1c\x5e\x9e\x47\x5e\x25\x91\x5a\x69\xaf\x32\xc6\xad\x13\xe4\xc8\xe1\x54\x50\xe9\xfe\xe6\x8c\xfb\xa9\x0c\x9c\x2f\xda\xf5\x24\x93\xf3\xb9\x88\x3c\xee\xb7\x83\x68\xbc\x22\xe7\xf3\x55\xe9\x73\x15\xcc\xe7\xf8\xe3\x7c\x93\xbc\x09\x79\xae\x17\x26\xa9\x03\x34\x55\x1e\xf7\x3f\x04\x8d\x86\xa3\x18\xf7\xa7\x22\x70\x5c\xd7\x73\x57\x4d\x9a\x8c\x1c\xe1\xf6\xa4\xaf\x02\x26\xba\x92\x41\x00\x63\x5d\x4c\xfa\x7d\x67\x1d\x55\x47\xe6\x00\xb5\xa8\x55\x56\x38\x51\xc5\x04\xe0\x44\xb5\xa7\x99\x34\x4d\x78\x6e\x14\x3a\x20\xf1\x56\x99\xf2\x75\xe0\x2a\xfc\xf1\x74\x3c\xd5\x2b\x79\x9f\x21\xd7\xcb\xc3\xca\x3a\xed\x8e\x1c\xf7\xb7\x75\x72\xdb\x47\x3a\xf1\xd6\x57\xc1\x2a\x1f\x2b\xeb\xf0\x39\xe4\x3d\xfc\xdb\xc5\xbf\x0c\x04\x2f\xb7\xf0\x1e\x60\x71\xc0\x58\x30\xe0\x55\xd8\x72\x78\x51\xe8\x08\xc6\x2e\x06\x80\x24\x77\x7f\xc3\xdf\x95\x68\x3c\xcd\xf8\x58\x02\x40\x9f\xbb\x79\xfd\x69\xdf\x5b\xcc\x94\x65\xa6\xf0\x0c\x21\x24\xf7\x3f\x06\xfe\x50\x06\xfe\xa7\xc0\xe1\x2e\x94\x90\x8c\xfd\x12\x25\xe0\xc5\x20\x4f\xbb\x11\x7c\x3e\x2f\xb0\xf0\x3f\x04\x8c\x9d\x35\x1a\x64\x36\x2e\x8c\x01\xab\x25\x8a\x7e\xac\x83\x07\xb3\x64\xd0\x68\xac\xe2\xaf\x73\x2c\xb9\x5b\x47\x56\x32\x76\x0b\xcd\x2c\x2f\xfb\xe9\x1f\xd5\x7a\x22\xaa\x5a\x0f\xfa\x77\xf6\xa8\x0d\x06\x66\x10\x0d\x09\x0f\xfa\xb5\xea\x98\xdd\x90\xd5\xfb\x82\x60\xd6\xb0\x46\x36\xfb\x03\x2b\xb0\x1a\xf3\x5f\x2c\x66\xaf\xda\xb9\x43\x3b\x17\x47\x98\xb1\xb4\x6f\xb9\x17\x58\x83\x8e\xd9\x25\x06\x00\x37\x9f\xe3\xe0\x37\x1a\xf5\x91\xb0\xfc\x0e\x6a\x8d\x43\xc4\x86\x95\x01\xf4\xbb\x82\x4e\x6c\xe8\x02\x8c\xb1\xbd\x41\x05\x32\x59\x0e\x72\x6d\xd5\x72\xb9\x1c\xc4\xc2\x2a\x5d\xd2\x69\x1b\x8f\xf1\x32\x4e\xaf\xfa\x0d\x1d\xce\x09\x89\x04\xb0\x8b\x66\x76\xd5\xdc\x0f\x15\x0f\xe6\x73\xc7\x04\x58\xb3\xd9\x57\xdc\xbd\x83\x8a\x43\x85\x9b\xa0\x64\x3a\x4b\xf5\x7f\x66\x91\xfa\x0f\x69\x3a\x9d\xbd\x57\x4f\x06\xfe\x7b\x19\x38\xee\xf6\xf6\x76\xdb\xa5\x7d\xc5\x59\xdb\xab\x46\x7a\xa0\x78\x21\xc8\xca\x16\x3e\x05\xfe\xa9\x0c\x1c\xee\x73\x19\xd0\xd2\x04\xe0\x5a\xbe\x28\x55\xa1\x28\x74\x56\xb9\x9b\x0d\xd2\xe4\x7a\x65\xe4\xe0\xf4\xda\xd8\x2a\xcb\xf8\x1f\x02\xd3\x69\xc5\xfa\x38\x0f\x2f\x94\x99\x87\x05\x00\xdd\x28\x47\xdf\x92\x1f\x66\xe6\x2e\x2f\xe1\x7a\x26\x3d\xd1\x06\x4b\x49\x55\x59\x05\xc7\x14\xc0\xeb\xee\xee\x7e\xad\x0b\x40\x56\xc7\x2c\x87\xa8\xa2\x5f\xdf\x58\x61\x70\x80\xc6\x38\x4c\xbf\xb5\xce\xea\x62\x22\xc8\x15\xc7\xf5\x2f\x55\xe0\xdc\x48\xee\xf6\x06\x8a\x77\x23\x55\x0e\xec\x37\x6c\x0a\xc6\xd5\x6e\xad\x22\xfe\x2c\x17\xdb\x7f\xea\x2f\xed\x3c\x44\x21\xc1\x24\x40\x3b\xae\x27\xfc\xd7\xc1\xbd\x5e\xd5\x89\x02\xcb\x1b\x15\xee\x1d\x72\xca\x55\xc4\xde\xf0\x4c\xb7\xc6\xc9\xf5\x7c\x7e\x8f\x42\x4d\x90\xd2\x90\x7f\x57\xad\x87\x17\x30\xe2\x38\xda\x22\x82\x95\xcc\x35\x3f\x0e\xa7\xdf\x38\x77\x2b\xa1\x13\xb5\xf4\x15\x8f\x8b\xe5\x85\xb1\xeb\xa8\xd1\x28\x52\x9d\xef\x92\xbb\x74\x99\x7c\x13\x51\x0b\x74\x8b\x9e\xa3\x74\xac\x33\x5d\xc4\xe9\x75\xc4\x56\xdb\x6e\x17\x7e\x3a\x2e\xbd\x8e\xdc\xa2\xa6\xbc\xc9\x9c\x0c\x22\xf2\x3f\xa9\x80\x4a\x26\xfc\x53\x11\x38\xb7\x03\xd7\x93\xc2\x91\xf4\x3d\x04\x5a\x4a\x87\x3a\x65\xab\x1d\x4f\xfa\x97\x81\x23\xfc\x37\x02\xd6\x01\x20\xda\x99\x0a\x20\x49\x16\xe1\x2f\x0a\x22\x46\xa0\x16\x1c\x8d\xfb\xb5\x56\x3f\x4e\x04\x8f\xf7\xae\x78\x8c\xe6\x61\x7e\xc5\xa3\x18\x35\x29\xd7\x43\x82\x5e\x47\x0c\x17\xcc\x6a\x68\xbf\xe7\x0b\x72\xa9\x50\xc0\xba\x19\x03\x56\xc2\xff\x18\xb8\x1e\x6f\x69\x06\x21\x0f\x9d\xad\x80\xe2\xd2\xf5\xf6\xb8\x03\x3c\x40\x39\xe4\x5f\xe8\x6a\x49\xe5\x54\xd2\xd0\x8c\x7a\xff\xbf\xcf\x24\xa8\xd7\x97\xf9\x24\xa6\x7d\xf7\xee\x0e\xd7\x42\xb3\xf3\xcc\xcf\xa5\xe6\x73\xc1\x5b\x45\xf0\xb7\x35\xd2\x37\x51\x3e\xd0\xa3\x96\xe4\x93\x6c\x96\xea\xd3\x8c\xcb\xe1\x59\xca\xa5\x76\x97\xa4\x19\xce\xba\x89\x6a\x23\x32\x72\x5c\xff\x5a\x06\x9e\x68\x34\x30\xbf\x85\x7e\x22\x4c\xb8\x77\xbc\xd1\x78\xc7\x4d\x19\xe3\xde\x02\x63\x71\xf7\xdd\xb9\x89\xe8\xc8\xf5\x42\xe1\xdc\x44\x40\x01\xf2\x7a\x36\xcd\x92\x11\x3a\x4e\x13\x17\xd1\x1f\x2a\x5e\x61\x79\x1b\xd5\x3c\xc6\xda\x8c\x71\xff\x5c\xc1\x04\x68\x5b\x72\x2a\x36\x5c\x6b\x70\x82\x85\x64\xad\x53\xd0\xa8\xbd\xc5\x44\xa3\xc1\x71\xea\xbe\xd1\x54\xb8\xac\xe6\xf9\x6b\x89\xdc\xf5\x7f\xfb\x3f\xa7\x3f\x6f\x78\x3b\x78\xf2\x78\xdd\x1f\x00\xd3\x5b\x4d\xec\xd8\xc2\xf9\x57\xe4\xec\x46\xd8\xa1\xca\xb1\xd7\xca\x5f\x5d\xf7\xff\xdd\x5e\x7b\x15\xdc\xaf\x65\x64\x10\x2d\x67\xec\xb5\x08\x9c\x75\xff\x67\xf6\x33\xfd\x39\x5e\x09\x9a\xeb\x7d\x3a\xd5\xae\x49\xfd\x77\x95\x3c\xaf\x82\x8f\xd7\xfb\xf4\xc8\xaa\xf0\x4d\x74\xbf\xbe\xb2\x1f\x50\x30\x0f\xe5\xe5\x2a\xbe\xdd\xcb\x09\x0b\x93\xd9\x05\xd5\x16\x8a\x8e\x15\xa7\xfb\x39\x02\x89\xe2\xf4\x63\x1e\x9e\x28\x4e\x3f\xe4\xe1\x4b\xc5\xe9\xa7\x3c\x9c\x2a\x4e\xdf\xe7\xe1\xa9\xe2\xf4\xad\xce\xb9\x03\x56\x8b\x4c\xf1\xbc\xff\x85\x0e\xc2\x3d\x10\xad\x66\x2c\xf6\xb4\xdb\x68\x38\x0b\x0d\xbb\x16\xc0\x20\xb4\x01\x72\x6c\x6c\x80\x51\x0d\x20\x47\xd1\x06\x98\xd5\x9a\xc8\xf1\xb6\x01\x0e\x6a\x00\x79\x67\x6c\x00\xce\xb9\x0d\x91\x77\xd1\x2d\xd6\x1c\x8e\x32\x61\xac\x38\x5b\x6f\xac\xf7\x69\x02\x81\xad\xf5\x3e\x9d\x40\x60\x7b\xbd\x4f\x2f\x21\x40\xd6\xfb\x34\x85\xc0\xdf\x30\xbc\x10\xf8\x79\xd3\x6e\xaf\xf7\x69\x06\x61\x1f\x22\x8d\xad\x6d\xf2\x77\xb0\x5e\xb1\xfd\xac\xc6\x27\x6f\x61\xac\xf6\xb4\xdb\x13\x12\x94\xe0\x15\x11\xf5\xae\x10\xa0\x7b\x6d\x7e\xb8\x35\xb0\x57\xf6\x5c\xf8\x9d\x9f\x58\x77\xf7\x34\x35\xa7\xd1\xdd\x41\x48\xcd\x09\x75\x77\x04\x21\x73\x2e\xdd\x9d\xe9\x3b\x2a\x3d\x99\x8b\x58\x14\xaf\xc7\xd6\xca\x02\xbd\xbf\x51\x9c\x5a\x82\x4a\x9b\x36\x42\x26\x7c\x1e\x80\x3a\x10\x16\xc3\x1c\x42\x4c\xfb\xaf\x45\xe0\xb4\x5d\xc6\xae\x75\x21\xd0\x06\xdc\xf9\xa6\x9b\xda\x1f\xc8\xc0\xe9\xb8\xae\x17\x72\xa7\xef\xce\xe7\x4e\xc8\x8c\x88\xf0\xaf\x54\xe0\xf4\x61\x56\xcd\xe7\xce\x37\xee\x48\xca\x9b\x53\xed\xd2\x90\x49\xff\x8b\x08\x7c\xa1\x50\x1c\x3a\x6d\xba\x06\xc5\x4b\x29\xc8\x03\x16\xde\x59\x93\xe2\x7a\xd9\x2c\x6b\x38\xfe\xbf\xbd\xa0\xe9\x7a\xeb\x7d\xbb\x1b\xd2\xfd\x3d\xbd\x8e\x32\x39\x70\xa4\xfb\x5b\xf2\xa9\x5e\x79\x2f\x78\x37\x2f\xba\xa7\x3d\x4c\xca\x64\x99\x34\x08\x4d\xd2\x65\x95\x34\xca\x93\x3e\x54\x49\x33\xed\xe5\x07\x07\x5d\xd8\x0c\xdc\xa3\x85\xca\x69\x21\x4b\x5a\xc0\x8c\x09\xb9\xa3\xca\xc9\x62\x91\x44\x59\x1c\x77\x67\x74\xc0\x1b\x64\x3a\xe8\xd2\xcf\xe9\x56\x03\xba\xd5\x5b\xef\x5b\xcb\xd2\xbb\x7c\x7a\x83\x30\xdc\x16\x39\x0f\x6b\x0d\xb4\x13\x6b\x4f\xdd\xe6\x57\x5d\x8d\xae\x75\x63\xa0\x26\x6d\xab\x79\x20\x2c\xe2\xbe\xaf\x4b\xe4\x3e\x77\x44\xb3\xe3\xfa\x23\x5d\x97\x74\xfb\x35\x95\x47\x46\x8e\xd9\x5c\xbb\x3d\xee\xdf\x88\xa0\x88\x75\xcb\xb5\x81\x2a\x26\xb1\x2d\xd8\x5e\xaf\x75\x18\x53\xb8\x57\x96\xa0\x59\x16\x98\xbe\x8f\x9c\x6f\x9a\x0e\x5a\x23\x7e\x83\xfd\x50\xae\xdb\x94\xd6\x05\x8c\xfb\x9b\x19\xde\x3b\xaa\x9a\xb0\x2e\x85\xd4\x18\xc4\xac\xb3\x23\xbd\xb0\xce\xd6\xc4\xe5\x87\x7b\x1b\xef\x36\x55\xec\x4d\xe4\x54\x8b\x5b\xb9\x11\xd7\x56\xba\xb0\xd2\x43\x66\x50\x57\xfe\x87\x80\x6a\xe8\x18\xed\xb3\xb6\xd7\x66\x4c\x36\x1a\xfd\xad\xd0\xeb\x37\x9b\x86\x60\x43\xa6\xfc\x7e\x30\x9f\x1f\xd1\x98\xe9\x3c\x34\x66\xeb\xce\x4f\xf5\xc4\x75\x7e\xbe\x79\xe2\x82\x90\xa9\xc7\x3d\x95\x60\xd1\x29\x1b\xfb\x99\x08\x9c\xa1\x3b\x9f\xfb\x47\xf4\x88\x1e\x05\x74\xc6\x26\x98\x16\x57\x69\xc0\x6f\x6d\xc6\xa6\x7e\x3b\x40\x13\x44\x9b\xb1\x99\x09\xbb\x22\xd5\x7c\xe8\x49\xf6\x31\x32\x10\x1d\x48\xed\xb5\xbb\x43\xee\x40\x84\x76\xda\x2e\x45\x70\x2b\x63\x96\x67\xb8\xf3\x79\x51\x6c\x03\x72\x0d\x20\x06\x4d\x16\xa4\x53\x48\x71\xef\xae\x07\x51\xac\x01\x56\x96\xec\x6d\x0d\xe6\xc7\x3a\x9b\xf1\x2d\xd1\x5b\xeb\x74\xf9\xb6\xe8\x75\xba\x6d\xeb\x5a\x09\x8e\x79\x31\x2a\x82\xb5\xa9\x64\x6d\x4f\x6e\x01\xdf\x7b\xcd\xa6\x74\x05\x7b\xda\x79\x22\x9a\xdc\xe7\x1a\x94\x3e\x2a\xfe\xc5\x9e\x6d\xbc\x7a\xf6\xea\xc5\xcb\x8d\x57\x2f\xac\x2d\x31\x14\xff\xa5\x38\xdb\xe8\x3c\x7b\xf9\x6c\xf3\xe9\x8b\x67\x9b\xc5\x7e\x6a\xde\xae\xe4\xf2\x81\xbd\xa5\xe5\xd6\x96\xb6\xcd\x40\xcd\x40\x75\xa2\x17\xf1\xae\xa5\x62\x1c\xda\x5c\x59\x72\x8b\x91\x49\x3f\xd7\x72\x17\x9f\x7b\x32\xa9\x20\x88\x3f\xd4\x81\xe3\xda\xc2\x6d\xc7\x96\xef\x49\x35\xaf\x2c\x7d\xdb\x54\xee\xf8\x6b\x8e\xfb\xd3\xff\x19\xfc\xbe\x6b\xf6\x9e\xb4\x1e\xff\xfc\xf7\x9c\x76\xff\xda\x5a\xfd\xf9\x13\xdb\xdb\x15\x25\x16\x37\xed\xcd\xf5\x3e\x7d\x23\xb8\xdb\xbd\xe8\xd7\x85\x3e\x28\xac\x27\xba\xbf\x77\x33\x71\x06\x9c\x37\x1d\xd1\x93\x8a\x37\x45\x73\x4f\xf0\xee\x91\xdb\x8c\x38\xa7\x87\x7d\xd7\x46\x5e\xc0\xca\x50\xd0\xb5\xa9\xcb\x0e\x54\x44\x3c\xaa\xeb\x2c\x46\x5f\x0b\xcc\x10\x1c\x47\x46\xed\xa5\x9f\x23\x76\x1c\x81\x40\xe8\xd5\xea\xae\x48\x63\x72\x71\xca\x62\xfa\x5d\x77\x11\x50\x32\x23\x04\x64\xaf\xdd\x6d\x6f\xcb\x5e\x21\x38\xa0\xc1\xa6\x74\xbb\x12\x26\x01\xda\x0d\x0a\x99\x9b\x44\x8e\x70\x1b\x8d\x0e\x63\x02\x58\x3b\x17\x7e\x54\xba\xdd\xb5\x0e\x5a\xf2\x0a\xce\x92\xcd\x26\xec\x7d\x24\xac\xc6\x1c\xd4\x4b\x19\x30\xc6\x44\x51\x8f\xf4\x0a\x09\x7a\x47\x77\x15\x87\x9e\x9c\xff\xb1\x27\xe7\x55\x4f\x0a\x9c\x0d\x59\xba\x7f\xee\x58\x01\xe4\xb5\xb7\x65\xa3\xe1\x48\xb6\xd0\x47\xf7\xbf\x77\xf1\x7c\xb1\x8b\xed\x2d\x26\x3d\xb9\xb6\xf6\x4f\x3b\xf8\x03\xba\xf7\x55\xdc\xef\x9e\x49\xfe\xd3\x08\x95\xc6\x51\xf6\x88\xa3\x50\x64\x88\x6b\xcf\x18\x35\x8f\xdc\x2e\xa7\x21\x6b\x7b\xe1\x96\xf2\xc2\x66\xd3\x0d\x01\x1b\xdd\x68\x08\xa8\x53\x52\xed\x87\x01\x0d\x29\xb7\x79\xeb\x24\xba\x5f\xf7\x43\x55\x2b\xa6\xd6\x3a\xd0\x5d\xe5\xad\xad\x29\x57\x2d\xd6\xae\x02\xaa\xa0\x76\x64\xcc\x53\xe4\xc7\xc9\x92\x6e\x56\xa3\x38\xf9\xa7\xbd\xcd\x31\xf2\x03\xe8\x1e\xed\xdf\x47\x6d\xc8\xda\xde\x70\x4b\x79\x43\xc3\x67\x43\x40\xad\x6f\x26\x7d\xcc\xfa\xfe\x30\xf0\x72\x2c\x63\x3a\xa4\xa8\xa3\x6a\x3f\x6c\x36\x03\x16\x97\xb2\x54\xdf\xd1\x33\xc0\xb9\x35\xe2\x93\x87\x71\x86\xdc\xff\x11\xce\x7d\xd0\x51\x68\x78\x1f\x65\x58\xca\xfa\x5b\x0a\x17\xb1\x3e\xe0\x1b\x22\x56\xfd\x80\xe5\xa8\x86\x7e\x3f\xa0\x7d\xca\x2b\xcd\x4d\xdf\xd1\x2f\x88\x62\xaa\xd5\x4c\xea\x05\x2c\xa9\x72\x7f\x83\x12\x20\xd8\x37\x47\x50\x55\x15\x2b\x0b\x3c\x8c\x38\x94\x05\xb4\x35\x93\xde\x0f\xc7\xd2\x5b\x25\xed\xbb\xbf\xb5\x41\x49\x51\x4d\x25\x62\x74\x67\xa3\xf4\x15\x47\xfa\xab\x0a\x7a\x8f\x1e\x1e\xea\xaf\x7f\x16\x3d\xff\x9d\xf9\x6c\xbe\x06\xe5\xf9\x01\xd6\xce\x27\xdc\x6a\x3b\x47\x70\xb5\x73\x47\xcf\x11\xc1\xbe\xfe\x13\x2b\xf6\xf5\xff\x7f\xf0\x5b\x7d\x08\xc1\x62\xc3\xbd\xda\xb6\x66\xe3\x6b\xc5\x6d\x2d\xb0\x5d\x1f\x0b\x4e\x35\x0d\xdd\xdf\x58\xa3\x59\xc5\xa8\x49\x6a\x34\x9a\x4d\x79\x47\xf3\x95\xcd\xbb\xaf\x1c\x7c\x2b\x67\xb9\x60\xdf\x8b\x70\xb9\x14\x6f\x8b\x1e\xc8\xc7\x6e\xd1\x27\x50\xbe\x85\xdb\xe5\xbe\x08\x2c\x8d\xee\xfb\xff\x40\x52\xfc\xcf\x06\x6b\x25\xac\xa4\x63\x75\x73\xd2\xd6\x87\xbd\xac\xfb\xbb\x6a\xd1\x93\xf7\x5a\x44\x49\xac\xd6\x58\x2e\x9e\x94\x91\xc6\x28\xa1\x64\xde\x6e\x4e\x31\x59\x88\x29\x58\x16\x94\x87\xca\xdb\x4a\x76\x27\xd9\x5a\xe7\xae\x24\x88\xbc\x4f\x10\x09\x04\x91\x81\x75\x73\x73\xc1\xd2\xb2\xc5\x3e\x9b\x14\xeb\xe6\xe6\x85\xb5\x70\xa3\x29\xe6\x83\x55\x81\xb8\xc8\x0d\x4a\xab\x78\x30\xe0\x56\x4a\x59\x6e\x91\x69\x6f\x31\xe1\x89\xb5\x35\x37\xb7\xfe\xc1\x80\x78\x78\x4d\xd1\xb6\xe5\xc8\x8b\x62\x5c\xd4\x05\xda\xc3\xda\x80\x43\x35\x6e\xfa\xc2\x66\xa9\x1c\x47\xaa\x3c\x47\x31\x58\xb9\xdc\x46\xe3\x38\xf2\xe3\x82\xfd\xa5\x65\x56\xb5\x8f\xb7\xec\x9e\x1c\x47\xfe\xae\x30\x56\xb4\xe3\x68\xa9\x1d\xbc\x7f\x51\x37\x2f\xa1\xf6\xbc\x55\xdb\x0e\xc0\x3e\x08\x36\x31\x6d\x4f\x6d\x09\x4f\x35\x9b\x2e\x1e\xde\x71\x5f\x05\x15\x03\x9b\x80\x6f\x11\x2d\xba\x58\xdc\x57\x74\x40\xc7\xb0\xec\xea\xa8\x6b\x14\xdc\x52\xa6\xcb\x80\x6a\xc0\x62\x18\x39\x0a\xb6\xd0\x9a\xc5\x10\x72\x1b\x0d\x73\x0e\xf6\xcb\x9c\x83\x29\x7a\x2a\xb8\xeb\xf2\xc2\x6e\xcc\xa9\xaa\x8c\xb8\xba\x1c\xa2\xd0\x70\x7e\x9f\xe1\xd6\xc4\x2c\x3e\x7d\x5c\x7c\xb8\x1f\x36\x87\x01\x53\xb0\xe4\x60\x39\xa8\x0a\x36\xa4\xd6\x09\xe9\x45\x25\x73\x2b\x8a\xc6\xba\x68\xf1\xe2\xa2\x66\xe4\xb6\xc7\xf2\xe2\x62\x41\x72\x6d\x6c\x33\xbb\xef\xbd\xe3\xa8\xb4\x7f\x52\xe1\x76\x6b\x51\x10\x6c\x95\x1d\xcc\x68\xc5\x15\xcf\xfd\xbe\xa3\x66\x8f\x06\x03\x82\x63\x56\xac\x08\xdc\x57\xcd\x26\xac\xbc\xe3\xc8\xd1\x6e\x2f\x1a\x34\x33\x08\x74\x9d\xdc\x48\xad\xdd\x7c\xbb\xde\x84\xdd\xbf\x45\x4c\x41\x43\x20\xb5\xf0\xc3\x80\xad\x82\x8a\x25\x61\xc5\xd5\xee\x1d\xf2\xb0\x8d\xcd\x70\xb1\x5f\x7b\x28\x08\xe5\x7c\x1e\x5f\xd0\xd5\x4e\x6d\x52\xbd\xbd\x77\x30\xb3\x97\xa7\xac\xb6\x69\x31\xc9\x2d\xf8\x22\x57\x52\x05\x9a\x76\x35\x84\xa0\x48\xe0\x30\x0e\xbd\x70\xab\xef\x15\xda\x42\xd8\xec\x6f\x6f\x77\xe8\xd8\x1b\x33\xd9\x43\xc9\xa1\x29\xf7\xe3\x80\xc6\x94\xbb\x5d\xe1\x28\x8c\xb9\x5e\x7b\x6b\xdc\x0b\x59\xdc\xec\x74\x9d\x3e\x8b\xe9\x90\xad\x8e\x4b\x5d\x62\xd8\x0b\xbb\xff\x9f\xd0\x32\x63\x5e\x14\xd6\x05\xa9\x03\x47\x40\xb7\xec\x61\x1d\xdf\x63\xea\xb6\xad\x38\xa3\x32\xf9\x1b\xbd\x28\xba\x92\xa2\x2f\x82\x91\x45\x9e\xe1\x72\xac\xcf\xc3\x36\xec\x75\xab\xa4\x8f\x72\xb8\x9f\xa8\x80\x0a\xf8\xeb\xce\xe7\xdc\x9f\xc8\x60\x4d\xc0\xdf\x3b\x73\xe0\xbe\xac\x41\xf8\x03\x05\xac\xa7\x0f\xec\x9d\xd4\x92\x16\x2b\x7e\x16\x0e\x6f\xdd\x50\xd5\xba\xa9\xed\xc4\x92\x8b\xd2\x84\xba\x8a\x67\x9d\xf3\x39\xfc\x0a\x44\xe9\x43\xb0\x8a\x1a\x76\xb5\x3e\xda\x67\xf6\x1f\x02\xaa\xd8\x7b\xc5\xa9\x66\x6d\x4f\x6f\x49\x4f\x9b\x95\x65\x15\xfa\xa6\xa1\x6b\x3a\x58\xb6\xb4\x56\x16\xef\x8b\xfa\xf6\x18\xf7\xc5\xf9\x26\xd9\x02\x7b\xaf\x16\xee\xe3\x83\x12\x6f\x8d\xd4\x7e\x91\x5f\x21\xf7\xfb\xce\x9e\x34\xaa\x10\x3e\x38\x6f\x60\xd6\xd8\x8b\x8f\xc6\x95\xc7\x93\x91\x83\xb6\x58\xe9\x87\xc1\x7c\x8e\x3f\xcc\x0f\x5c\x17\x44\x85\x5e\xb6\xb9\x9f\x58\xf2\xd4\x37\xd2\x74\xbb\xf3\xc4\xe1\x6b\xed\xa2\xd3\x7e\xe0\x2d\x70\x8f\x27\x9b\xac\xe3\x0a\xa8\xb3\x5a\xeb\xed\x37\x50\xee\x31\x9d\x1f\x2c\x91\xc7\x4b\xb4\x89\xab\x8b\xba\xe8\xf0\x83\xc2\x88\xf0\x0f\xc4\xb0\x87\x12\xb8\x67\x9d\xcc\x5d\x5d\x54\xa7\x81\xca\x75\xbb\x22\x97\x98\x4b\x8e\xdf\xaf\xcb\x25\xb3\x76\x92\x7a\x8f\x04\x25\x4e\x06\x8b\x4a\x61\xf1\x83\x9c\x83\x6a\xa8\xea\x02\xd5\xd0\x42\x55\x23\x9d\xe5\x36\x0b\xab\x26\x56\x84\xa7\x00\xbb\xd0\x97\x81\x7b\x57\x20\x6a\x1f\x12\xd9\xeb\xe4\x92\x23\x56\x73\xcc\xf8\x41\x71\x76\x73\xe1\xac\xb6\x5d\x7a\x7b\x01\x21\xe8\xbb\x5b\xd5\xf2\xcb\xae\xc5\x32\x37\x7e\xb4\x26\xa0\x27\x60\xde\xb7\x97\x1c\x81\xde\x3f\xde\x7c\xe0\x60\x0c\x14\x05\x7b\x61\xfa\xa4\xb8\xf3\x30\xf2\xab\x51\x54\xd5\x68\x9f\x11\x57\x78\xef\x2c\x8a\xf1\x41\x6b\x14\x8d\x1d\xb3\xc7\x46\xb5\xc3\x16\xcc\xbb\x35\xc5\x84\xff\x4b\x54\x0a\xa9\x7c\x22\x7a\xb2\x29\xba\x16\xd3\xbd\x5e\xac\x9b\x37\xe5\x13\x47\xac\xd9\x66\xca\x37\x35\xba\x3d\x19\xb4\x8e\xf7\xd7\x3b\x9b\xd6\xf4\xde\xab\x4b\x01\xf1\x64\xd0\x92\xc9\xd4\xc1\x72\xf6\x12\x73\x1f\x6c\x1a\x8d\xef\x81\xbd\xbb\xbf\x90\xef\x5e\x38\x9d\xcd\xf6\x93\x81\x7f\xa3\x02\x47\xad\x09\x2a\xd7\xb8\xbb\x0e\x88\xd0\xa7\x2f\x6c\xad\xed\xfd\xa2\x6a\x88\x36\x17\x0e\xe2\xc8\x52\x82\xf7\x6d\xa8\x2f\x91\x35\x76\x4b\xad\x5f\x1c\x76\x01\x76\x2b\x1f\xec\xf2\xfb\x17\xcb\x4e\xdd\xd7\xed\x99\x60\xb1\x9a\x5d\x72\xcc\xd1\x99\x04\xd0\xfc\x57\xc7\x9a\x8e\x9f\x96\x00\xad\x86\xf0\x6b\x96\xa6\x83\x0b\x46\x4e\xb3\x64\xb2\x9f\xe9\xd4\x38\xbc\x99\xc3\x18\x11\xb5\x6a\xc9\xdd\x91\xb3\x00\x67\x4d\x86\xc3\x0b\xc7\xfd\x7d\xf7\x86\x3b\x87\x17\xfe\xc7\x80\x5a\x7c\x69\x8e\xa2\x0f\x2e\xbc\x3b\xd7\xc3\xcc\x16\xcf\x96\x78\x5b\x01\xc3\x5a\x4c\x7a\x7c\xb1\xcc\x79\xea\xf0\xa2\x3a\x74\x8b\xc2\x42\xb5\xe1\x50\x23\x3b\xe8\x97\x79\x2d\x9e\x39\xab\x1d\xb4\x12\xe1\x0a\x56\x08\xe5\x36\x95\xe8\xc3\x75\x78\xe1\xbd\xe1\xb0\x77\xaf\xb0\x40\x1b\x91\x67\x0e\x0e\xb7\x71\x29\x73\x4b\xc4\x21\x0d\x2d\x46\x65\x03\xbe\x68\x36\x03\x4f\x34\x9b\x77\x77\xd6\x46\xae\x3c\x74\x3f\x4c\xb2\x95\x68\x34\x31\x97\xbe\xb5\x22\xae\x67\x0d\xc7\xe7\x0b\xcb\xf9\xc4\xa0\x97\xa5\xb7\xbf\x7f\x14\xca\x9f\xe4\x99\x1c\x38\x0a\xb3\xd5\x2a\x63\x07\x17\x39\x26\xca\xc3\xb3\xfd\xdf\x9c\x21\x71\x3c\x28\x95\xa3\x9d\x6f\xd9\xb8\x7f\x29\x03\xc7\x2d\xf4\x2b\x5e\x54\xa6\xb1\x32\x6d\x57\xa6\xbd\x3b\x4b\xa6\x9c\x94\x38\x19\x01\xdc\xa6\x9a\xc1\xfe\x50\xce\xe7\x1d\xaf\x53\x13\xc3\xc6\xd7\x8f\x6a\x26\xdc\xdc\xda\x1e\x96\xfe\x33\xe6\x4e\xfe\xca\x34\xd3\x93\xf2\xee\xcd\xca\x68\x36\xcd\xd0\xed\x40\xe8\x95\x5f\x3a\x4d\xf2\xf3\xf0\xbe\x35\x12\x7d\x7b\x24\x70\x13\x12\x36\x1a\x6a\x9b\xe9\xf9\xbc\xbd\x0d\xc1\x2d\xa6\xab\xe1\xc0\x07\xd0\x60\xfb\xd8\x64\x61\x75\xda\x53\x8e\x83\xe5\x7a\x74\x50\x29\xa1\xa6\x5f\x86\x70\xdc\x6a\x9a\xd3\x05\xb7\x14\xce\x94\xa1\x62\x75\x10\x67\x68\x5b\x50\x55\x59\x76\x15\xfb\x84\xf2\xd0\xd6\xbb\x8e\xad\xdd\x81\x5b\x72\x1d\x55\xc6\xcf\xe2\x0f\xcc\x67\x4c\xa0\xaa\xc0\x45\xe4\xb8\xe4\xa8\xdf\xc1\x98\x17\xfa\xa2\xc9\xca\x87\xd8\xb0\x93\xb4\x87\x58\x7a\xa6\xb9\xbb\x1a\x93\x56\xf6\xea\xd2\x27\x26\xb6\x2d\xa9\xfd\x9c\x44\x86\x54\xa5\x32\xf3\xb9\xae\x45\xba\xbf\x71\x59\xb5\x6d\x4c\xf6\x6b\x54\xa6\x6a\x0b\x59\xac\xad\x86\x70\x7e\x48\xbf\x5a\xe1\x5b\xae\x2c\x06\xe9\x4a\x16\x9c\x5e\xdc\xb3\x69\x98\xe9\x58\xb2\x7d\x61\xd3\x2c\x8b\x7c\x5d\x60\xe8\xdf\x77\x54\xa3\xde\xa1\x4d\x49\xe5\xeb\xd2\x82\x87\xaa\xa9\xa6\x7c\xd9\x8e\xfa\x7c\x51\xfd\x32\xc5\x01\x73\xdb\xbe\x03\x1b\x57\xb9\xdc\xae\x55\x59\x77\x1e\xea\x05\x28\x4a\x8b\x3d\xf9\x93\x92\xfc\xd9\x66\xb4\x36\x95\x66\x6f\x90\x53\xa4\xd9\x5c\x32\x1e\xdf\xeb\xaa\xe0\xa2\x2c\xb3\x16\x94\x1f\x35\x15\xd6\xec\x35\x8d\xd5\xa6\xa0\x38\xee\x0e\xed\xfd\xbf\xfd\x06\xd6\xf0\x1f\x95\x56\xcb\x7c\x36\xc5\xf0\x21\x4a\x1b\x2b\xbd\xf8\x13\x6d\xe5\xf0\xc1\x0e\x2e\x25\xa1\xca\x1b\x13\xf9\x41\x80\x65\xba\xb1\xbc\x92\x87\x96\xa0\xce\xeb\x2c\x24\xdd\xdf\x67\x03\xbd\x92\x5f\xe1\xe3\x71\xaa\xb9\xba\x5d\x29\xde\x47\x59\xc9\x06\x7a\x65\xa8\x6f\x57\xc8\xdf\x4d\xd1\x9c\x69\xd7\x83\x7a\x99\x35\xf5\xc2\xe1\x82\x96\x64\x6a\xef\x01\x5c\x77\x11\xb8\x6f\x11\x15\xb6\xff\xb5\xe1\x2e\xb6\x80\x4b\x06\x63\x30\x5c\xf4\x53\x2d\x3c\x93\xd1\x45\x33\xed\x9b\xe5\xd5\xdf\x95\x41\xc5\x0b\xbb\x28\x6d\x72\xbf\x34\x00\xea\xf9\x41\x77\x69\xab\x50\x3d\xe8\xd7\x55\xcb\x4b\x64\x62\xf4\x47\xdc\xa1\x7c\xc0\x64\x55\x03\x00\x9e\xa0\x1b\x68\xf5\x6e\xcf\x4a\xfd\xf1\x9d\x95\x68\x7a\x5c\x3c\xe9\x71\x14\xae\x2c\x7b\x57\x68\x25\x4b\x3e\x25\x92\xc7\xda\x1c\x4b\xae\x14\x2f\x11\xad\x14\xcf\xbc\xb4\xf0\xcd\x20\x87\xac\xd8\x0a\xcc\xc5\x22\xff\x51\x45\x35\xeb\x2c\xdd\x84\xa8\xfa\x06\xa4\xec\x94\x32\x7b\x72\x05\x03\x62\x59\x30\xbc\x70\xeb\x44\xe1\xbe\x33\x84\x0d\x1b\x83\x48\x18\xd0\x05\x93\x96\x44\x9f\x9c\xa2\xbc\x7b\x67\x91\xf1\xb4\xe6\x08\x66\xa3\x13\x85\x4e\x07\xcf\x68\x87\x96\xda\xe9\xb7\x83\xca\xdf\x42\xf1\x25\xfa\x24\xfa\xf0\x03\x3b\xfc\x6b\xa3\x64\xe9\x54\x70\xd7\x5b\xb2\x61\x86\x6d\x26\xdb\x70\xa5\x5f\x95\x56\x41\x60\xa1\xa1\x9a\x9d\x60\xc9\xfa\x32\x1c\xfe\x6f\x71\x1e\x0e\x1f\x42\xf9\x01\xf4\x9a\xf7\xb0\x2b\xa5\xc4\x8a\xb4\x16\x92\x38\x1f\x63\xf4\xe9\xeb\x03\x4b\x7a\x18\x1c\x6b\x58\xe2\x30\x78\x74\x8b\x57\x29\x5a\x67\x82\xb5\x73\x17\xfc\x7b\xc8\x6f\xe5\x8b\xed\x43\xc4\x33\x88\x49\x43\x37\xe3\x3f\xa8\x33\xc7\x46\x90\xd6\xa9\x97\x3b\x6d\xf2\x46\x03\xa1\x2f\xde\xc0\xc2\x7a\xce\xe2\xa1\xff\x31\xf0\xce\x5b\x4a\x3e\xa0\x2f\xb7\xce\xc4\x9d\x77\xde\xfa\xc2\xed\xfc\xd1\x10\x37\x7f\x15\x3a\x1c\x64\x31\x74\x47\x6c\xe5\xbd\x85\x8e\x08\xb4\x20\xbd\x36\x3b\xc5\x56\x5f\xf8\x45\x9e\x08\x02\x4b\xbf\xf1\xce\x5b\x07\xc3\xa5\xd5\xdb\x78\x8c\xb5\xbf\x2b\x60\x6d\xf7\xce\x5b\x22\x64\xb6\x9e\x50\xac\xe9\xc3\xa2\x21\x3c\xd9\x3c\x6f\x3d\x3e\xab\x81\x59\xbe\x0e\xf7\xf1\xcc\x37\x9f\x15\x86\x30\x0c\x56\x8d\x30\x75\x8a\x6e\xc0\x5a\x51\xca\xfe\xf6\x5d\xb9\x56\x78\x8f\x1e\x73\xe7\x7c\xc1\xf4\x06\x7b\x88\x41\x34\x65\x76\x11\x2f\x4f\x6c\x9d\x89\x55\xc6\x5b\x4a\x3a\xd6\x6a\x6c\x10\x11\xf3\xf9\x99\xe2\xde\x3d\x4a\x2b\x34\x5b\xa8\x12\x51\x1d\x94\x16\x30\x99\x23\xab\x33\x47\xb9\x94\xe7\x81\x65\xeb\xbc\x25\x93\xce\x96\xda\xb9\xbe\xd4\xfa\x61\x6f\x4f\x0b\x9e\x00\x09\x5e\x87\xb1\x38\x7e\x28\x9c\x1c\x3f\xda\x76\xef\x33\xfd\x9d\xeb\xcd\xea\x84\x5a\x3e\x86\xa5\xb7\x73\x41\x78\x1e\xd0\xbc\x92\xb5\x35\x9a\x57\xdb\x6c\xd2\x6a\x28\xb7\x37\x9e\xe4\x00\x8d\x46\x41\x3a\xba\xda\x76\xbb\xab\x9d\x3b\xd7\x72\xf2\x1a\x0d\x8b\xad\x5f\x3e\x04\x58\xfa\xbe\x3b\x8c\xd8\xca\xb3\xbc\xd2\x82\x95\x73\xc7\x78\xe8\x70\xc0\x52\xa1\x48\x85\x44\xa3\x77\xb8\xb8\x65\x1b\x0a\x4c\x83\xbd\xd6\xc3\x8d\x68\x63\x6a\x17\xf5\x76\xca\x26\xe8\x78\xe8\x68\x8a\x67\x14\x56\xfd\x78\xba\xce\x3a\x2e\x05\x35\xcc\x6a\xe6\xee\x1c\xc6\x9b\x2d\x35\xfb\xd6\x89\x5a\x11\xb3\x8b\x53\x7b\x7a\xaf\x58\x0d\x7e\x3e\x2f\x58\xd5\xa2\x34\xea\xe5\xd5\x08\xe4\x63\x8c\x95\x32\xac\xf4\xe2\x4d\x6d\xea\x19\x43\x55\x6d\x9f\x1d\x0f\x7b\x8e\x60\xbc\x75\x30\x74\x5c\xca\x19\x6f\x7d\xe1\x8e\xeb\x76\x21\x0d\x06\x87\x72\x86\x8a\xa2\xbb\x60\xcd\x14\x85\x45\xb1\x14\x7a\x30\x1f\x51\x3d\x76\xef\xbc\x47\xe7\xad\xfc\x4d\xc4\x85\x2e\x55\x95\x60\x39\x6c\x34\x97\xa1\x0b\xc6\x5a\x69\x8c\xb5\xe5\x54\x42\xdd\xca\x9c\x61\x50\x8d\x5d\x76\xef\xee\xbc\xfd\xe5\x13\x04\xf6\x60\x71\xce\x77\x77\xae\x77\x6e\x1e\x44\x9d\x24\x53\xcd\x16\xf6\x62\x46\x6a\x1a\xf8\xe5\x92\xf3\xbe\x44\xe2\xd8\xdf\x4a\x0a\x51\x69\xb9\x37\x7a\xe7\x35\xa3\x07\xb7\xc4\x68\xc5\xd1\xc5\xac\xcc\xe5\x47\x5f\x50\xcd\xf2\x51\xcc\xfb\x4c\x1f\xdc\x34\x5b\x3b\x48\xbd\xca\xc2\xd6\xd1\x6d\xb5\x29\x07\x55\x75\xc4\x27\xa0\x48\xad\xc8\x01\xec\xd0\xd5\xca\x34\x1a\x4b\x8d\x8a\x6a\x84\xd6\x9c\x24\x5d\xb9\x86\x6c\x7c\x30\x4e\x11\xa3\x1c\x6c\x1b\x3f\xc5\xda\xc6\xbb\xcf\xa4\x31\x7e\x14\x7d\xeb\xf5\xbb\xca\xef\x07\x77\xf6\x06\xdc\x9a\xcc\xe3\x61\x8d\xdb\x6b\x3a\x0f\x1e\xc3\x56\xd2\xee\x4b\xcd\x7d\xb1\xb4\xed\x28\xc9\xd8\x41\xbf\x67\x24\x71\x37\x3f\x91\x28\xce\x7c\x3f\x04\x5d\xb3\x1d\xb2\xce\x2f\x0a\xf1\x51\xd6\xf0\x85\xd7\xad\x43\xc0\xcc\xf7\x3c\x88\x8a\x53\x6a\xcb\x68\xb4\x60\xa7\xce\xcf\x37\x8a\xb5\xbd\x69\xac\xf6\xb0\x15\xba\xaf\x04\xe3\xf4\xb0\x4e\x06\xee\xe1\x74\x30\xac\xe3\x04\x4c\xef\xd5\x91\x5e\x05\x80\x72\x7f\x9e\xf7\xd9\x3a\x5f\xe0\xe6\xd0\xf6\xfe\x81\x42\xf3\xfe\x79\x42\xd1\x0e\xe0\x61\x6b\x96\x97\xf6\x1e\xa7\xbc\x86\xf6\x55\xe0\x35\x34\x17\x43\xe8\x46\x55\x9e\xae\xd6\x70\x29\x6c\x56\x26\xb7\x52\x7f\xb0\xbb\x54\x33\x1c\x0a\x1a\x32\x6d\x8e\x61\xdb\x5e\xe1\x0e\x5a\xba\x18\xf4\x03\xaa\x1a\x0d\x60\xa0\xfa\xf6\xbd\x76\x43\xab\xc4\x6b\x92\xe3\x55\x0e\xd9\xa4\x40\x6f\x11\xb3\x42\xfb\x2d\xbd\x28\x8a\xe5\x79\x92\xa3\x64\x50\xeb\xe3\xb1\x01\x3a\x76\x83\x56\xff\xfb\xae\xa4\xa6\x7d\x5a\x5c\x7a\xfa\x0c\x03\xaa\xe1\x0f\xba\x26\x29\x1f\xc2\x01\x83\xe4\x5c\x81\xc3\xad\x2e\x30\xcb\x43\xa5\x4b\xc3\x1c\xf4\x19\x4f\x28\x86\x81\x65\x76\xa8\xc6\xe5\x7c\x29\x01\x5a\x23\x3e\xa9\xb3\xcd\x88\x4f\xfe\x48\x80\xb3\xff\x13\x02\x14\x5d\x5d\x42\x88\x3f\x74\x5c\xf9\xc3\x7a\x91\xb2\xf7\x4b\x0c\x2d\xdf\x96\x8f\x78\x5f\x2f\x8c\x78\x5f\xff\x79\xc4\xcf\xcb\x0e\xff\x0f\xd8\xd1\xb2\xc0\x2c\xb0\xe4\x1f\xfd\x80\xa6\x38\xab\x0b\xd5\xca\x2c\x17\x5e\x5d\x89\x2f\x61\xb3\xe1\x7f\xbd\x40\x59\x5c\x9d\xcc\xcf\xee\xb9\xdb\x15\xe8\x47\xdf\xa6\x1d\xb7\xc9\xef\xce\xd9\xf4\xbf\xee\x07\xfa\x02\xa5\x24\xae\x37\x4a\xd5\x16\x9c\x22\x1f\x57\x29\xb3\x88\xbb\x4b\x94\x01\x6e\xa8\xe4\xd5\xdd\x5c\xf2\x93\x43\x51\x2d\xee\x5c\x29\x27\x5f\xd7\xcf\x5b\x23\xf9\xbf\xa9\xc3\xff\x2c\x82\xa2\x8e\x87\x54\xce\x62\x3d\x05\x50\xc4\xda\x7d\x58\xb9\xf5\xbf\xe3\x16\xc4\xf5\x1e\x50\x90\x0b\x30\xa5\x0c\xd8\xf1\x9f\xdb\x6c\x89\xb0\x6a\xf2\xd1\x79\xeb\xf0\xd7\x7d\xad\x09\x07\x7d\x3a\xf4\x16\x7b\xbc\x70\x52\x5f\x7a\x45\x49\xb3\xcb\xf4\x4f\x64\xe0\x80\x72\x2a\x90\x8e\xf6\x29\xaa\x77\xde\x8a\x46\x4b\x1a\xc2\x62\xc6\x3a\x23\x5a\x23\x69\x5f\x3b\xbe\xbf\x05\x5c\xe8\x08\xac\x77\x7f\xd4\x8a\xa6\x95\x56\xf4\xf8\x4f\x44\x01\xde\x62\xcc\xac\xd3\x39\x9b\xdf\x7c\x31\x46\xe0\xf3\xd6\xcd\x97\x25\x68\x1b\xd8\x72\x4b\x05\x15\x6c\x8b\x6a\x52\xad\xd6\x8f\x77\xa6\x43\xb7\xd1\x78\xbe\x65\x2e\x76\xe4\x88\x59\x8e\x95\x20\x23\x50\x0d\x2a\xdb\x11\x25\x69\xbd\xba\xda\xa0\x80\xc4\x38\x99\x30\xe4\x08\xb7\x5b\xe4\xc0\xce\x13\x33\x5a\x8f\xcf\x20\x3d\x36\xbe\x46\x09\x1e\x78\x3f\x8e\x1c\x45\x85\xdb\x15\x43\xfc\xbd\x33\x6a\xeb\x83\x07\x56\x40\x5d\x73\xd6\x64\x8e\xd2\x66\xc3\xc2\x07\xee\xbb\xe2\x4c\x44\xad\x31\xbf\x8a\xfa\xa0\x5e\x01\x09\xbe\xab\x9c\x2e\x3f\x14\x67\xdf\x15\xf7\xaf\x24\x8a\xde\x1f\x90\x3e\x1b\xb2\x1f\x8a\x97\x9e\x6e\x77\xb3\x21\x3b\x32\x95\x5e\x0d\xe9\xf5\x90\xde\x0c\xe9\xe3\xda\x15\xc2\x61\x85\x8a\xdd\xd0\x7c\x8e\xe6\x73\x74\xfc\x1f\xb2\xb7\x91\x33\x1b\x52\x72\x34\xd1\x29\x27\xee\x7c\x5e\xc4\x8f\x4f\x88\x4b\x77\xca\xfc\xb3\x34\x52\x7a\x9c\x55\x10\x1f\x43\x97\xee\x96\xd9\xef\xb4\x1c\x26\xc4\x6d\x34\x56\x31\xc1\x9f\xe8\xc0\x71\x29\xc9\x9f\xd9\x84\x74\xe7\x0f\x15\xb9\x74\x2f\xaf\x69\xb1\x20\xe5\x9a\xb3\xbd\x61\xa3\x91\x97\x3e\x48\x44\x14\x6b\xe2\x52\xa1\x39\x83\x0e\xd2\xb7\x43\x26\x34\x6f\x34\x84\xe6\xad\x49\xcc\xb3\x30\x49\x47\xf3\xf9\x91\x77\x85\x35\xbe\x85\x32\x5c\x12\xd7\xbb\x2e\xe3\xe7\xd1\x98\xb8\xde\x4d\x19\xff\x14\x8d\x67\x37\xc4\xf5\x1e\x2b\xce\x56\x57\xa1\x52\x6c\x0e\x02\x2d\x3e\x99\xe4\x4f\x17\xcd\xe7\x47\x94\x7c\xeb\x74\xf2\xc3\xa9\x77\x43\x36\x1b\x7a\xef\x0c\x66\xef\x86\x94\xec\x8c\x55\x9a\x44\xa0\x18\x5b\x89\xd1\xf1\x20\x19\xeb\xc5\x34\xae\x6c\xb3\xa2\xd4\xbc\x3c\x58\x32\xb7\xd0\x2a\xcd\x99\xfb\xa1\x0e\xba\x66\x55\x34\xee\xd8\xef\x6b\xa6\x16\x53\xea\x88\x0a\x60\x92\x5f\xc3\x46\x43\x44\xad\x04\x46\xb2\x5c\x0e\x59\x91\xd2\xba\x32\xfd\xa0\xa9\x51\x8c\x1d\xb7\xcb\xbd\xdd\x61\x4f\xb0\xf5\xf4\xea\x67\xd7\xf1\xff\xfd\xd3\xf5\x82\xa6\xeb\xfc\x74\xe7\x9e\xbb\xde\xdd\xc1\xac\x9f\xc2\xe9\x75\x0f\x4e\xf7\xf7\xe6\xe9\x95\xeb\x77\x57\x82\x7b\x70\x30\x38\x8e\x60\xeb\xe7\x5a\x7c\x8c\xb2\x9f\xeb\xce\xcf\xd3\xa6\xbb\xee\x7a\x66\x8a\x3a\x9c\x09\xbc\x82\x33\x1b\xba\xa0\x8d\x77\x82\xee\x51\x39\x5b\x77\x4c\x51\x24\x00\x15\xdb\x31\x08\x02\xb7\x57\x5e\x20\xea\xf2\x3b\xd8\xe6\x69\xce\xec\xeb\xbb\xfb\x43\x4b\xe6\x28\xcd\x7d\x7c\x2c\xc0\x04\x58\x7b\x8b\x7d\x88\x9c\xf7\x43\x5a\x3b\xdf\xff\x60\x17\x81\x46\xb5\xe6\xdb\xcc\x5c\x62\x0c\x75\x41\x75\xaa\x35\x67\x21\xb0\xd2\xce\xb0\x87\x38\xcd\xe7\x4e\xa8\xb9\x2f\x40\xc3\x48\xc3\xde\x90\x43\xcd\x9d\xb6\xdb\x7d\xee\xe6\x63\x52\xa1\xf5\xd1\x36\x1c\xde\x30\x69\x88\xdc\x6d\x9b\xad\xf5\x2d\x33\x4f\x9d\x88\x6e\xfb\xee\x9c\x7d\xc4\x55\xfa\x0f\xd2\xf6\x63\xbe\x83\xbf\x31\x7b\xf4\x5b\xd7\x36\xf9\x7c\x1a\x2e\x5a\x7c\x44\x6f\xb5\xdd\x85\x29\xd0\xe3\xad\x1b\xc6\x44\xeb\xa6\xd1\xe0\xad\x5b\x08\xdd\x76\xed\x43\x90\x83\x61\xcd\x53\xa3\x75\xb3\x26\x5a\x37\x54\x31\xde\xba\x5d\x13\xad\xdb\x62\x5c\x06\xfe\x2f\x15\x38\xf2\x89\x6c\xaa\x27\xca\xa2\xe3\x61\xbd\xe5\x1c\xd3\xa2\x9a\xbc\x12\x0b\xfe\xe8\x21\xf8\x66\x0e\xdf\x44\xf8\x74\xd9\x62\x7d\xc3\x06\xfe\xad\xc8\x6d\x8f\x37\x6e\x41\x46\x2b\xf1\xb6\x66\x60\xbc\x73\xbd\xe9\x43\xf5\x64\x4b\xaa\xc9\x1e\xaa\xe5\xd1\xf9\x43\xd5\xec\x2d\xa9\x66\xef\xa1\x6a\xb4\xb8\x67\x4a\xac\x2d\x64\x1f\x87\xbd\xbc\xb6\x26\x0c\x44\x3e\xd0\x10\xbe\x75\xbb\x55\x0e\xbd\x34\xd7\x56\x9c\x22\x5f\xb8\x8b\x2d\x1d\xde\x37\x5a\x9a\xf1\xbd\xcc\x59\x8e\x1b\x74\x6f\x9e\xb0\x3c\x74\xfb\xa4\x3a\x52\xc9\x2b\xa9\x0e\x66\xf3\x31\x9b\xe4\x0b\x29\x77\xbd\x53\x5e\x3e\xae\x50\x9d\x30\xfe\x89\x09\xfd\x34\x60\x4c\xf8\x69\xd0\x68\x70\x7f\x07\xc3\x3b\x01\x30\xe2\x39\x3b\xfe\x6f\xac\x7f\x6c\x58\xdf\x4f\x8d\xad\xd0\xdf\x09\x6a\xcc\x7f\x62\x4f\x65\xe3\x95\x04\xcd\x51\x8e\x80\xe7\x2d\x9e\xea\x87\xf4\x1c\x3f\x0d\x9e\xe4\x55\xde\x3d\xa0\x00\xae\x1a\xc5\x35\x85\xc9\x7f\xe7\x7a\x8b\x8c\x59\xd0\xa4\x62\x42\x3f\x0d\xdc\x8a\x40\x56\xfa\x4e\x70\x6f\x9c\x16\xd9\xb3\xaa\x2d\x5b\x5e\x59\xf6\x70\x5d\x8b\x3c\x5a\xd5\xb5\xb7\xbc\xae\xbd\x87\xeb\x7a\xf4\x0f\x18\xa8\xa8\xbf\xa0\xa3\xc5\x15\x79\xb5\x4f\xe4\x62\xbd\x68\x0b\xd2\x9c\xad\xee\x0c\xe7\xf3\x0f\x43\xe7\x95\x4b\x07\x10\xdd\x1d\x36\x1a\x98\x06\x92\x18\xd3\xe7\x73\x48\xdb\x1f\x3a\xa4\xd3\x7a\xd5\xea\x10\x97\x46\x9a\x33\xc8\x5e\xdd\x1f\x3a\x2a\x74\xe9\x05\xc6\xe7\xf3\x5f\xc3\xf9\x7c\x6f\x68\x9d\xfb\xdb\xec\xc0\x7b\xc0\x40\x67\x43\xe7\x0b\xea\x84\xdd\xa1\xe2\xf3\xb9\x33\x54\x46\x51\x3c\x1b\xda\xd6\x03\xbb\x9c\xb1\x14\x69\xee\x8f\xf0\xd2\x7e\xd7\x72\xd4\x3b\x5f\x3c\x86\xfd\x36\x74\x34\xa7\x8b\x4e\xd8\xdf\x6b\x72\x55\xcc\xe7\xba\x72\xb7\xf4\xbf\xab\xa0\xd1\x90\xfe\x89\x08\x7a\x18\x71\xbe\xe8\x26\x77\xbb\xa6\xa6\x63\x4d\xeb\x57\x0d\x7e\xdc\xaf\xaa\xf0\x09\x31\x35\xe2\xdd\xe0\x5a\x9d\x27\x62\x69\x9d\x7e\x3b\x70\x73\x55\xaf\xb2\x1a\x7c\x1b\x56\xae\x6e\x9c\xa9\xf9\x9c\x7b\x82\x89\x46\x43\xac\xb2\x63\xdd\x13\xe6\xd2\x62\xf7\x08\x9f\x9d\x32\xad\x70\xa8\x1f\xd6\xe9\xf9\x5c\x5a\xa6\x30\xe8\x88\x68\x3a\xb2\xf7\x45\x37\x65\xf7\xc8\x5c\xb8\x93\xb0\xee\xd4\x3e\x18\xf3\xba\x78\xc2\x14\x9f\x11\x7b\x20\xcf\x31\x9b\x75\xb1\x60\x5f\xd0\xac\x6d\xae\x89\x79\x7d\xc6\xfd\xd0\x9c\x8d\x0a\xc6\xfa\xfe\x54\x05\xc6\xbc\xd2\x6c\x06\xac\xef\x7a\x43\xe1\x28\xaa\x2d\xa3\x41\x69\x56\xe5\x50\x52\xa2\xab\xf6\xb1\x36\x38\x5a\xad\x84\x4c\xc3\x1e\xdf\xae\xbd\xef\x7f\x50\x01\x2d\x9e\x6d\xf1\x53\xb3\x47\x68\x34\x1e\x47\x0e\xc6\x9c\xf5\x9f\xd3\xe6\xba\x6b\xce\x62\xff\x09\x06\x15\xed\x1f\xe7\x43\x7b\x7a\xe1\x08\x6b\x83\x82\xd7\xbd\x18\x7b\x3b\xe8\x71\xe1\x70\xff\x26\x80\xdd\x85\x62\xec\x4c\xf0\x5e\xfe\x09\x2a\x88\x4a\xc9\x7b\xbc\x35\xc8\x46\xf1\xdb\x24\x65\xa2\x8b\x0e\x13\x43\x0d\x3a\xe2\x75\xe0\x0c\x35\x3a\x86\x08\xb7\x7b\x0b\xfb\x93\xcb\xbe\x3b\x9f\x63\xe8\x87\x40\x2b\xe8\x75\x60\x76\x2d\x1c\xdf\x5a\xcb\xef\xd2\x0f\x41\xb5\x92\x3a\x8e\x8b\x57\xd6\x09\x44\x8e\x4d\x84\x50\x88\x4c\x27\x5c\x96\x39\xa7\x26\x42\xa8\x4c\x20\x63\xdc\x25\x32\x81\xc4\x31\xa1\x61\xca\x47\xda\xbc\x7c\xdb\x25\x18\xd9\x4d\xcc\xb3\x76\xe6\xc5\xce\xee\x49\x9f\x8e\xf8\x8d\xf9\xec\x46\x97\x8c\xf8\xcd\xa7\xfc\x0b\x1c\x69\x12\xeb\xee\xd5\x80\xa6\xc9\xb5\xa9\x33\x4d\xae\x4d\x9d\x30\x08\xdd\xc3\x01\x9d\x4d\xf5\x88\x4f\xba\x64\x36\xd5\x07\x7c\x42\xe8\x15\x8f\xa3\xfe\xb8\x4b\xae\x76\xe0\x97\x50\x7c\x64\xaf\xfb\x75\x60\x29\x89\xf8\x82\x0e\x3e\x5c\x07\xea\x34\xfc\x16\x4a\x1c\xf7\xfb\x32\xe8\x72\xff\xac\x52\xb3\xf3\x65\x87\xfb\x1f\x15\x2c\x24\x8f\x55\x60\xbf\xb0\xa2\x6d\x93\xf3\xde\x70\x3e\xc7\xba\x56\x4d\x5d\x67\x2a\x80\x04\x53\x65\x5f\xda\xd7\xac\x44\x5c\x13\x4d\xf8\xc1\x33\xfc\x92\xc8\x58\x25\xd7\x50\x68\x57\x05\x5d\x61\xc9\x1a\x19\x2f\xc8\x9a\x91\xe6\x28\x6c\x96\xdc\xcb\x81\x2c\x5b\x4c\xf8\xed\x80\x2a\x26\xfc\x0e\xee\x16\x57\xfb\xa0\xc5\xe2\x3b\x02\xfe\x6b\xc0\x50\xf9\xef\x03\xbc\x27\xe5\x0f\x42\x2a\x03\x0f\x93\x41\x80\xbc\x0e\x1c\xc9\x39\xdd\x8b\x0c\xa4\x4b\x67\x66\x92\x60\x81\xdf\x98\xaf\x8a\xfc\xf7\x79\x76\x71\xf6\xe5\x5d\x98\x03\x2e\x2f\x3f\xe5\xd3\xfe\xfb\xc0\x53\x4c\xdf\x61\xb1\x51\x88\x8f\x05\xe2\xf3\x08\x47\xee\x9d\x64\x1c\xdf\xd6\x90\xae\x07\x78\x99\xad\xf4\x48\xe0\xe3\x56\xdd\xa1\x15\xc3\x02\x53\xed\xba\xdd\xc7\x43\xcc\x75\xbd\x0d\x3c\x35\x6a\x34\xc6\xd8\x69\x49\x85\xf5\x12\x90\xe5\x4d\x60\xb2\x73\xd9\x56\xb9\xe8\xe0\xf3\x16\x8d\x86\xf0\x2f\x03\x68\x56\xc2\x6c\x78\x63\xee\x81\x81\x08\x4f\x52\xe7\xde\x29\x52\x88\xa7\x48\x5e\x6c\xbc\xfb\x57\x55\xec\x84\x6e\xef\x87\x93\x68\x0e\x81\xfe\x85\x13\xba\xdd\x90\x6a\xb7\xab\x9d\xb0\x66\x2b\xd7\xf6\x98\x6b\xd3\x63\xdb\xc4\x17\xc6\xb9\x91\x1f\x1f\x98\x18\x2a\xeb\x92\x44\xfe\x16\x07\xf7\xcf\x64\x90\xbf\xc7\xf1\x8e\xf3\xae\x79\x98\xa3\x08\xec\x17\x81\x49\x68\x7e\x3f\x14\x09\x1f\x8b\xc0\x61\x11\x38\x2e\x02\x6f\x72\xd8\xaf\x45\xc2\x5e\x9e\xf0\xa5\x48\x38\x2f\x02\x3f\x8a\xc0\xe3\x22\xa0\x45\x1e\x08\x8b\x00\x2f\x02\xfd\x22\x30\x28\x02\x27\x79\xc5\x67\xf9\xef\xb0\xc8\x18\x17\x81\x69\xf9\xc4\xc8\x6a\x71\x4b\xcf\x76\xba\x9a\x14\x6c\xcd\xf1\x25\x2b\xfb\x22\x5a\x9c\x9f\x6d\x6a\x6e\x96\x77\x6a\x4d\x0c\xda\xb1\x20\x07\x71\xcd\x59\xc0\x13\x8c\xfb\x5f\x44\xe0\xb9\x1c\x9f\xbf\xb2\x2b\x8d\xf2\x4a\x85\x7f\xa1\x03\x60\x91\x0b\x1d\xf8\x6f\x45\x7e\xec\x64\xdd\xd6\xfa\x03\x9c\xaf\xa4\x2d\x2e\x86\xb5\x59\x0f\xab\xe7\x85\x0e\x7a\xf8\x17\x9b\xe7\x6e\x17\x57\xe4\x4a\xbe\xd8\x05\x06\x30\x6f\x8b\xc7\x38\xb9\x7f\xab\xa0\xe8\xad\x0a\xba\xa7\x91\xc3\xfd\x1f\x22\x58\x66\x77\xeb\x30\xc3\x4b\xf6\x0d\x9d\x51\xbc\xe4\x75\x4f\xde\xc2\x2f\xd0\xe5\x0b\x30\x7e\x35\xa8\xb7\x24\xad\x7b\x09\xa3\x00\x34\xb3\x2a\xbc\xd4\xe5\x35\x33\x8f\x37\x1a\x05\xff\x7a\xf8\x82\x92\xaa\xbc\xcb\xec\x07\x44\xe3\xfb\xcf\x18\xb6\xb7\x0c\xaa\xd5\xa4\x5d\x02\x54\x76\xc8\xfa\x7e\x62\x5c\x1d\x43\x47\xa1\x73\x01\x74\x5a\x75\x76\x8c\xd6\xa8\x70\x96\xee\x0f\x1d\x01\x01\x11\xb5\x4e\xbf\xbe\xcb\x3b\xd4\x68\xd4\x36\x5d\xb5\x3c\x17\x8d\x0f\x85\x5c\x2e\x12\xab\x0b\x22\xc0\x38\x17\xba\x5a\x25\x62\xa3\x0c\xd7\x87\x6f\x12\x97\x6e\x22\xdc\x3f\x91\x41\xfe\xc0\x40\x35\xb5\x71\x6b\x04\xe2\xde\xd8\x18\x01\xfb\xe5\x0f\x60\xa6\x8b\x45\x2e\x60\x14\x52\x64\xd9\x46\xe7\x85\xb1\x1c\x7b\xa2\xd1\xe0\xab\x4c\x78\xae\x60\xc2\xc6\x4e\x30\x66\xab\x1a\x69\x31\x91\x00\x2f\xeb\xf9\x82\xb6\x51\xec\xec\xb6\x8a\x26\x36\x7a\x9d\xee\x5a\x07\xf2\x51\xf1\x46\xc5\x1c\xcb\xbf\x62\x35\x59\x65\x60\x5e\x2d\xf4\xb2\x73\x17\x85\xce\x91\x79\xa5\x89\x43\x77\x71\xa6\x14\x09\x10\x2b\xd6\xaa\x62\x74\xa9\x62\x05\xa9\x72\xd5\x51\x55\x38\x25\x78\xaf\x2d\x91\x81\x57\x5c\xc1\xba\xd0\xe6\x0e\x96\xd5\x67\xcd\x58\xd8\x9b\xe6\x3d\xed\xae\xca\x46\x63\x12\x3b\x9a\x0a\xb7\xb7\xd6\x79\x92\x95\xe9\x0a\xd3\x43\xf4\x9d\xd0\xdc\x11\x94\xbb\x5d\x47\xf6\xb0\x91\xae\x86\xbf\xee\x9a\xa3\x7a\xd8\x5c\x37\xc4\xf8\x9d\x62\x28\x64\x3c\xc9\x94\x9f\xe1\x0b\x84\xb2\x65\x9e\x17\x3e\x4c\x94\xc6\x1c\x7f\x26\x02\x67\xb5\xed\x7a\xaa\x84\x51\x36\x8c\x70\x3d\x55\xc2\x14\xab\x55\x2b\x7f\x81\x1f\x3f\xde\xc9\xd3\xdb\xe3\x24\x1a\x67\x53\x47\x44\xfe\x63\x19\xb4\x4e\xcf\x76\x4e\xce\xfe\x73\x76\xf4\x9f\xbd\xc3\x37\x54\xd9\x12\x28\xab\xaf\xf7\x86\x31\xcd\x6b\xab\xa2\x1a\x97\xea\x3c\x4b\x78\x0a\x40\x56\x99\xf4\xf0\xed\x5b\x8b\x6a\x40\xb0\xba\x27\x74\x41\x42\xcb\xcb\x42\xe0\xda\x7d\x21\x03\x7c\x48\x57\x56\xce\x4f\xd5\xfb\x72\x96\x59\xe9\x8b\xbd\x9b\x2a\xd8\xa5\xc7\xbb\xdc\xdf\x91\xa8\x1f\x7d\xb2\xa7\xfc\x65\x35\x65\xbe\xe4\xfc\xe1\xf2\x96\xf5\x56\x34\x13\xe5\x59\xf2\xd3\x82\xf7\xf2\x0f\x7d\x97\x19\x28\x9f\x1a\x0d\xcc\xff\x22\x02\x84\xc9\xa5\x93\xff\x46\x06\xab\x75\xa1\x8f\x69\xae\x77\x99\xcb\x35\x90\xee\x78\x4f\x02\xd7\x8a\xdc\x63\xcb\x0c\x38\x2e\x3c\x12\x15\x84\xea\x21\x23\xfb\x6e\xd5\x4c\x17\x3e\xf1\xbb\x05\xf2\xe5\x51\x6b\xf9\x48\x7a\xee\xb2\x81\x55\x16\x4f\x8a\xa1\x02\x92\x7f\x41\x1a\x19\x64\xb5\x6d\x3f\xe5\x35\xae\xc9\xbb\xab\xfa\x78\xfb\xe5\xe8\x65\xb9\x92\x48\x57\xdb\x6e\x4f\xfa\xed\xd2\x38\x5c\x16\xbd\xbe\x57\xb4\x2a\xd3\x59\xa6\x37\x95\xd9\xaa\xbc\x5e\xb0\xca\x38\x5e\x91\xe6\x39\x19\x79\x7e\xed\x05\xc5\xb3\x23\x73\xff\x21\xe5\xce\xe7\x56\xe1\xca\x3d\x2e\x5f\x13\x2a\xcf\x3a\x40\xe5\x06\x36\x1b\xe6\xa3\x33\xdd\x0e\xc5\x6f\xc9\x74\x3b\xf4\xfd\xde\xce\x9b\x6e\x87\x9a\x4f\xfb\x74\x3b\xd4\x7c\xd5\xa6\xdb\xb9\xa3\xb7\x00\xbf\x7f\xf0\xae\x3b\xd5\x74\xf7\xa4\x9b\xda\x8f\x75\xce\x8a\x05\xb9\xa7\xcc\x2d\xfa\xae\x83\x81\xb5\x8e\x4b\xb9\xff\x45\x06\xce\x89\xac\x59\x80\xaf\x8a\xfd\x40\xcb\xfe\xfa\x1d\x0e\xc3\xa9\xac\x0e\xca\xf2\xbe\xc3\x2e\x76\x3a\xd1\x32\x0a\x23\x6d\x1d\x40\x5f\x97\x95\x14\x4f\xa3\x17\xe5\x2e\x8b\xd5\x0d\xca\x3e\xdd\x78\xf9\x62\x73\xdb\x96\xc6\x37\x85\xda\x17\xc1\xba\x35\x2d\x99\x9e\xe5\x9f\xa3\x3e\xd3\x37\x59\xfe\x74\xd1\xcf\xf4\xe7\x78\xfe\x33\x9d\xff\x1c\xbb\xeb\x7d\x9a\xea\xda\xa3\x93\x7e\xe0\xdd\xc6\xf9\x0d\x69\xd7\xe3\x4c\x14\xda\x75\xf1\x4e\xdf\xfa\xca\xcf\x9b\x9d\x37\x2b\xf6\x6b\x8a\x90\x80\x4f\x20\x7a\x25\xd0\xcf\xd9\x46\xbb\xbd\x6b\x12\x23\xcd\xe7\x73\xa7\x2a\x9f\xbf\xc4\xe8\x7a\x7c\x95\x4d\xb5\xf5\x04\xe0\xfa\xbf\x7f\x4e\x9f\xac\xd3\x23\x77\xd9\xf3\x69\xbf\xe2\xda\xb5\xd6\x02\xc9\x8e\xc5\xdf\x39\xa6\xd5\xe1\x54\x6c\x1d\xe6\xaf\x3a\x1c\xf6\xf4\xd1\x18\xb8\xc4\x75\xed\x89\x2f\xf1\x86\x69\xf9\xda\x98\x2f\x54\xe0\x2e\xa5\xd5\x51\x71\xe3\xd4\xc0\x58\x92\xc2\xd4\x7c\xab\xb9\x71\x7a\xb9\xd5\xdc\xc7\xc4\xc0\xf2\x4a\xb1\x38\xbd\xc4\x8c\x16\x7c\x6c\xe9\x21\xe5\xec\xe7\x8b\xef\x37\x9b\xc9\x63\x3b\x1a\x54\x4e\x29\x0a\x8d\x08\xd6\xdb\xdb\x98\xb2\x87\xef\x72\xa7\x7f\x2a\x52\x4d\xa1\x8a\xd6\xb5\x0d\xe9\x4e\xbc\x70\xe9\xa6\x5c\x42\xa7\x50\x43\x2c\x40\x51\x6a\xdf\x01\xc3\x58\x2f\x69\x95\xb4\x97\xf9\xe0\xc3\xfa\x5c\x5e\x20\xb7\x66\x7b\x75\x97\x2e\x87\xf2\x64\xb3\x79\x67\xcd\x16\xeb\x16\x68\xbc\x70\xa1\x07\xb5\xdf\x4b\x11\x54\xb7\x79\x96\x17\x3c\xab\x7c\x24\x2e\x43\x7c\x1d\x1a\x8f\x63\xe6\x73\xcd\xef\xce\xd9\x59\xee\xd1\x10\x71\x76\x3a\xf4\xce\x5b\xfd\x07\x3d\x1b\x2e\x43\x74\x6a\x58\xe6\x5a\x6c\x2c\x7c\x39\x54\x65\xe6\xf3\x1e\x9d\xb7\x4e\x1f\x70\xba\x34\x76\xb8\xf9\x3c\x2f\x84\x4e\x0c\xe1\xe6\x3f\x87\xbd\xb8\x66\x8f\x01\xdf\x8b\x5a\x91\x85\xdd\x7d\x5e\xc0\xde\xe2\x7b\xe7\xad\xda\xc7\xa4\x97\x75\xa7\xe8\x48\xbe\xbd\x2c\x8b\x14\x9f\xd5\xfe\x53\x19\x6b\x65\x03\x09\xe9\x9d\xb7\x74\x9f\xdf\xc3\xd1\x68\x11\x05\x7a\x9a\xad\xae\x4a\x4f\x32\x7f\x18\x2e\xde\x5a\x10\xe6\xc2\x02\x5e\x78\xef\xbd\xe1\xbc\xbb\xc7\x51\x39\x7a\x1d\x38\xbf\x30\x54\x9a\x00\x3c\xc1\xfc\xd7\x9c\x07\xb9\xe1\x0d\x0a\x73\x63\x73\xcb\x3d\xd1\xcc\xe4\xe4\x78\xb5\x4c\x61\xdf\xae\x42\xd7\x33\x1f\xf0\xcf\xeb\xb0\x1e\xe6\x34\xcb\x3a\x6e\x52\x2c\x5f\xc2\xd7\xb1\xfd\xd8\x4c\xe1\xf2\x7b\x19\xa2\x22\x97\x2f\xc4\x3b\xc3\x9e\x79\x63\xf3\x22\x6c\x0a\x97\x4a\xf3\x2a\x32\x56\xe5\x76\x31\xc3\xa8\xe9\x1d\xc6\x24\xec\xb9\xfc\x0f\x81\x0b\xdd\xa8\xc0\x8c\x4c\x36\x1e\x4d\x2a\xa7\x7d\xf1\xb1\xdd\xb7\x29\xef\xc3\x2f\xa8\x8c\x46\x05\x51\x46\xa5\xc0\x82\x92\xa9\x25\xaf\x02\xbc\xa9\x6d\x1a\x61\x94\x72\x6b\xd5\xdd\x79\xeb\xf3\xee\xfd\xf3\xde\x7c\x5c\x4a\x62\x2c\x33\x2d\x59\xab\xe5\x9e\x25\x9d\x91\x18\x9c\xc5\xa0\x08\xc3\x90\x88\x85\xb2\x02\xca\xda\xe7\xb3\xe5\xb6\xaa\x35\xe1\x7d\xfd\xdd\x7c\x05\x15\xd4\xab\x77\x2a\xe8\x15\x27\x7a\xfe\x27\xf4\xe1\x7d\xa7\x02\xb7\x9b\xa7\x19\xf8\x6f\x06\x1e\x75\x40\x19\xd0\x5a\x25\x90\x08\x25\xee\xce\x5b\x57\x6f\x97\xb1\x2c\x48\x94\xfa\xa4\xb2\x3e\x93\xcf\x26\x9a\xa3\xe3\x05\x26\xb1\x7e\xec\x9d\xb7\x0e\x25\x1b\xc0\x2f\xff\x0f\x8b\xe0\xf7\x34\xe2\xec\x02\x02\xe6\x3b\xb9\x38\x35\x86\x10\xff\x16\xb2\x18\x7e\xc7\x87\x6c\x04\xbf\xea\x80\x29\xf8\xfd\x10\x73\x36\x8e\x8d\xdb\xcf\x24\x76\x01\x72\xc2\xd9\x25\x64\x5d\xa5\x4b\x3c\xa2\x61\xff\xe8\x9f\xc9\x80\xb1\x24\x84\xee\x60\x70\xaf\x0a\x7e\xab\x82\xa7\x55\xf0\x32\xec\xad\x72\xff\x04\x6d\xd8\xab\xa8\x99\xcc\xe7\xa8\x5b\xb8\x5d\x8c\x35\x1a\x26\x86\x07\xd1\x0e\x67\xb0\x42\xf8\xa9\x08\xf0\x9d\x24\x11\x38\x6e\xf7\x77\x6e\x54\xe5\xfe\x0f\x19\xe4\xf6\x4f\xee\xef\x88\xe0\x8e\x72\x56\x2a\x31\xb0\xd9\xde\x09\xcc\x6f\x1a\xb8\x5d\xce\x84\x75\x6b\xa3\x5a\x0d\xb4\xf5\x5a\xc0\xde\xb0\x37\x13\xbc\xbb\x3b\xec\x49\xc1\xbb\x3b\xc3\xde\x95\xe4\xdd\x5f\xc3\xde\x61\xb8\xb0\xf1\xdd\x5d\x28\x35\xe6\x58\xea\x82\x63\xa9\x21\xc7\x52\x31\xe7\xa6\x58\xd5\xda\x5b\x4b\xdb\xc4\xa1\xcd\x92\x09\xe3\xde\x59\x79\xc6\xe8\x1d\xe4\x41\xe9\x7a\x3f\xf2\xa0\x72\xef\xce\xd9\xdb\xd8\xac\x04\xa3\x65\x5f\xe2\xc0\x53\x28\xa9\x82\x35\x0c\xbc\x0b\xee\x3c\x21\x1e\x74\xf1\xf2\x0f\xa4\x01\x84\xc6\xef\xdc\x3f\x1d\x47\xbe\x8d\x9d\x02\x90\x16\x6d\xd0\xa2\x0e\x9a\x37\xf6\xdf\x5c\xc5\x1a\x0d\xde\xab\xd9\x21\xde\xc6\x3d\xee\xbf\x0b\xb6\x59\x5e\x01\xbe\x33\xa8\x82\x2d\x56\x34\x01\x1a\x68\x96\x4c\x0c\x00\x84\x00\xe2\x40\x16\x10\x07\x32\xe8\xf2\xd6\x8d\x5d\xbe\x75\x53\x2f\x7d\x5b\x2b\xdb\xba\xb5\x4a\x9a\xcb\x14\xe7\x2d\x7d\x33\xe1\x63\xb5\x20\xfb\x61\x5c\x50\x8b\xe9\x95\x1d\x5f\x63\x88\x0c\x3d\xb3\x4f\xfc\xa4\x0a\x9a\x88\xb4\x4b\x0f\xec\xf4\x03\x09\xe9\x07\x32\x70\xe9\x0f\x3b\xfd\x5d\xb0\x06\x5d\x76\x8b\xc3\x6d\x53\xef\xfd\x3a\xc5\x92\xfa\xe4\xfd\xba\xd4\xc2\x31\x66\xc5\x60\xef\xf2\x25\xe0\x07\x2c\x1c\xc5\x09\xf1\xbb\x80\x0a\x6c\xdd\xc3\xae\xb0\x3c\x1d\xbb\x25\xe0\xaf\x0b\x1c\xc8\xf3\x27\x76\xb1\x5f\x54\x60\xef\x90\x1f\xab\x0c\x18\x75\x81\xdd\xb3\xdf\x80\x88\xeb\x87\xe1\xfe\xbb\x60\x8b\x09\x33\x12\x02\x23\xdc\x1a\x54\xc8\x3a\x90\x90\x65\x62\x58\xe9\xdd\xa3\xa5\x5e\x10\x88\x6b\xe5\xf2\x50\x20\xba\x78\xda\x5c\x22\xba\x98\x81\x88\x96\xd3\xc8\xca\x78\xf7\xdf\xcf\xa7\x2d\x04\xb2\xe5\xed\x67\x0f\x34\x9f\x3d\xd0\x7a\xf6\x70\xe3\x4b\x9d\x2e\x4c\xe3\x7b\xcb\x1b\xdf\x7b\xa0\xf1\xbd\x07\x1a\xdf\x7b\xb8\xf1\x47\xff\xc4\x59\x63\x81\x03\x9b\xbc\x75\xe3\x2e\x99\x12\x90\x5a\xa0\x8b\xde\x1c\x4b\xa6\x47\xeb\x16\xa6\xc1\xbd\x0a\x97\x55\xe7\xd6\x1d\x40\xb0\x52\x71\xbf\x4a\xe1\xfe\x6f\xdc\x42\x16\x30\x78\xc2\x2b\xfa\x16\x18\x40\x5a\xd1\xf2\x13\x26\xbd\xc5\x96\xef\x1f\xfb\x57\x8e\x5a\x96\xa4\xff\x51\x79\x93\x94\x23\x2b\x4a\xaf\x02\x59\x79\x13\xa0\xa4\xdf\x8f\xff\x8b\x93\xc8\x7e\x5c\x8c\x25\xad\x4b\xe7\x07\xbc\x46\x3e\xd4\xac\xcc\x46\xac\x9b\xc9\xcf\x91\xf2\xe8\x41\x82\xc4\x85\x15\x13\x13\xad\xe9\xfd\x71\xb1\x34\xf4\x0c\xda\x2e\xaa\x80\x75\xc7\x24\xe0\xca\x82\xc9\x56\xf9\x4f\xf1\x9f\x7c\x65\xde\xa1\x7f\x8c\x59\x03\x2c\xbf\x19\x24\x11\x13\x85\xec\xb7\xbd\x68\x1e\xf2\x34\x36\x32\xaa\x20\x0c\x76\x82\xca\x5c\xd4\x15\x4c\x56\x50\xa9\xec\xb7\x39\x79\xdf\x62\xa5\xd2\x5f\xd5\x62\x7a\x67\xe6\x1d\xb7\xea\x41\x42\xe5\x64\xb6\xc8\x66\x0e\x0e\xb7\x4a\x53\xe1\xca\x8f\x72\x4d\x2f\x47\x89\x29\x5a\x0e\xfa\x9a\x70\x69\x31\xec\x7c\x4d\xb9\xb4\x76\x17\xb3\x52\xe9\xeb\xf6\xac\x42\x10\x17\x12\x9d\x2a\x56\x09\x79\x33\x92\x90\xde\x14\x45\xdf\xe4\x16\x2b\xdf\x44\xcd\x0b\x5b\x62\xdf\xbc\x4d\x5e\xac\x05\x66\xf8\x31\xa7\x29\x8a\x2e\xe9\x2d\x56\xbe\xf0\x9f\x8f\xbe\xa4\x9a\xaa\x35\x49\xc3\xb5\xea\x95\x2f\xe3\x68\xf1\x80\x6f\xf6\x6b\x5d\x4d\x00\xa0\x37\xac\x0b\x3b\xb8\x3a\xa4\x41\xed\x39\x84\x92\xee\x66\xf7\x05\xe8\x68\xb6\x38\x78\x21\xbb\x37\x0c\x7d\x56\xf5\x7f\xc8\xaa\xce\x98\xf5\x6e\xbb\x52\x05\x1c\xdc\x66\xfd\xb7\x49\x84\xa5\x4a\x15\xc9\x05\x3e\x32\x54\x53\xb9\x32\x50\xe5\x79\xc3\xad\xf0\x81\x6a\x87\x65\x7d\xe1\xda\xd0\x85\xa1\x1a\xae\x49\xd7\x43\xd5\xa7\xd4\x5c\x96\x15\x94\xc8\x9f\x85\x2e\x87\x87\xc0\xfd\x2d\x5d\x87\xed\x53\x49\xf5\x5a\x1f\x33\x39\x13\xf9\xfd\x68\x86\x97\x94\x8d\x1b\xbc\x75\x28\xe5\x3d\x7a\x48\x3f\xab\xc9\xf9\xfd\xb8\x97\xb7\xb9\x85\xf4\x34\x1e\xec\x16\xe9\xb7\x2b\x32\xe7\xde\xed\x66\x09\x37\xb4\x5d\x1c\x95\x6d\x6b\x20\x1e\xd4\xd7\xaa\xca\x1f\x56\xdb\xec\x4a\x6d\xb9\xf6\x66\xc1\x0d\xa0\x75\xb3\x05\xf8\xa1\x54\x59\x13\xad\x9b\xae\x61\x78\xd1\xba\x59\xab\xe6\x87\x4b\xdb\xf8\xcd\xbc\xd6\xed\x16\xa2\xd7\x33\x03\x2a\x5a\xb7\x25\xf8\xed\x9a\x35\x1f\x00\xbe\x34\x1b\x1b\x9f\xd0\xbb\xf3\x96\x8a\x0c\xd5\x96\x6d\xdc\x8c\xff\xe8\x9b\x8a\xe7\xcd\xe6\x6d\x99\xe5\xe6\x21\x97\x3f\xd0\x4f\xfb\x3a\x7b\xad\xc7\x99\x4e\x1f\x28\x97\x7b\xc9\x5a\x14\x5c\xdf\xa0\x8b\xe4\x5a\xdf\x70\xef\xee\x39\xf2\x3d\xa4\x10\x3d\xa8\x73\xfd\xdf\x7a\xfe\x3d\xa0\x11\x3d\xa4\x70\xfd\x5f\x3a\x0a\x3e\xa0\x0f\x3d\xa4\x6e\xfd\xff\xe4\x57\xf8\xbf\xd6\xaa\x6a\xfa\xd3\x72\x4d\x69\x89\x56\xf4\x7f\xa4\x01\x2d\x71\x75\xb4\x15\xa0\xff\xea\xf6\x58\x39\x5b\x97\x56\x56\x7c\x7a\xbe\xb7\x57\xb8\xaf\xb8\x5d\xf4\x00\x9b\x45\xce\x9e\xe6\x75\x4f\xf5\x3d\x5d\xde\x71\x73\x24\x7b\x6b\x4a\xb8\xe6\xd9\x8f\x9b\xc0\x97\x01\xab\xbd\xa0\x5a\x9f\xfe\x87\x51\x7e\xc0\x6c\x8e\x84\x18\x63\x79\xa1\x62\x69\xc7\x9d\x7e\x73\x47\xf1\xdc\xe1\xae\xfa\xec\x27\xc0\x55\x87\xb9\xcb\x6c\x54\xef\x16\x4f\x20\x6f\x02\x1f\x1b\x2c\xa4\x6c\xed\x54\xbb\x38\xd6\x96\x3d\xd9\x45\xd0\x02\xd5\x60\x3e\x3f\xb2\x1c\xca\x6d\x73\x5d\x7e\x02\x57\xfa\x4d\xee\x1a\x17\xa5\x5d\x15\xa0\x24\x48\x46\x93\x59\xa6\xd5\x69\x76\x1b\x6b\x7c\xf1\x7f\x79\x96\xc3\xf1\x43\x02\xae\xdb\x93\xbe\x08\xe6\x73\x09\x10\xc5\xd3\x30\xf8\xc9\x65\x7c\xa7\xf4\xa8\x6b\xa1\x71\x54\x57\xd0\x72\xac\xf0\x13\x84\x0a\xbd\x37\x94\x0e\x7c\x11\xa0\x29\x03\xdf\x38\xbd\x41\x6d\xed\x26\xa8\x3f\xac\x7d\x6c\xeb\x89\x58\xe7\xe5\xc0\x76\x99\x8e\x6b\xd6\x55\xaa\xd9\xee\xb0\xd1\x70\xae\x86\xf3\xf9\x63\xc5\x5d\x34\xb5\x5d\x73\xee\x7a\x62\x71\x92\x80\xb0\xbe\xa1\x02\x44\xb6\xdb\x85\x18\x15\xcc\x58\x47\xd0\x5d\xf0\x24\x46\xdf\x43\x58\x58\x6f\x02\x9c\xc5\x27\xb1\x23\xa8\xb6\xda\x3e\x5d\x54\x61\xd1\x6a\x77\x8a\xfe\x6e\xdf\x6b\x0e\x2c\x67\xc5\x21\x57\x0f\x87\xa3\x5b\x7a\xb2\x56\x6e\xbc\xf3\xf9\x9b\xd8\x41\xcf\x5b\xd7\x76\xa7\xb3\xce\x83\x2d\x6f\x8d\x2c\xbd\xfd\x2d\x58\x6e\xb8\xaa\x5e\x22\x33\x75\xfe\x8e\x75\x98\x75\xdb\x34\x4b\x26\xdd\x36\x4d\xd1\xa6\xd5\xa6\x02\x3f\x23\xdd\x6d\xdf\xdd\xed\x0c\x51\xf7\x95\x01\xd4\x9f\x1f\x46\xed\xc8\x80\xfe\xe0\x8e\x40\x35\x0f\x96\xb5\xbe\x0c\xfc\x73\x01\x6b\xdb\x99\xc2\x90\xeb\x1a\x15\x6e\x8d\x99\xcc\x6f\x65\xe6\x37\x61\x5f\xc4\xae\x46\xee\x7d\x79\xac\x53\xf8\x3e\x6c\x5a\xae\xae\x59\xee\x86\x90\x1f\xe8\x52\xc9\x8a\xc1\xa5\x8a\x49\xc6\x3e\xf4\xe7\x73\xc9\xd8\xa4\xef\x15\x27\x49\x17\x3a\xf0\x78\xee\xa9\x51\x1c\xaf\xe0\x39\xba\x55\x50\x35\x1a\x92\xb1\x37\x03\x03\x06\x88\xe6\xa1\x33\x15\xd0\x55\x85\x53\xfe\x9d\x0c\xb6\xd1\x2d\x11\x6d\x87\x02\x22\x8f\xf1\x5b\xbb\x56\xa3\xf8\x93\x0d\xac\xa3\x9a\x9a\x42\x5a\xb9\x3c\xd7\xfd\xa2\x58\xbe\x0d\x6a\x53\xc5\xe1\xff\x36\xf4\x0b\x07\x15\x3a\xd5\xea\x4b\xc7\x45\x4c\x74\x11\xe9\x4b\x50\x3c\x63\xcd\x1d\xd9\xba\x0c\x41\xe7\x32\x54\x43\x0f\x01\xe3\x8b\x83\x2f\xa3\x23\xb6\x7b\x45\xec\x31\x9a\x3d\x18\x53\x2e\xf6\x4e\xe1\x5f\xdd\x68\x20\x21\x92\x81\xbb\xca\x4e\x07\xc5\x57\xb2\xce\x01\x43\x3a\xf4\x86\x0c\x9f\x6e\xdc\xcd\xfd\xbf\x61\x4e\x14\x6f\x3a\xc7\xdc\x39\x8c\x9d\x21\x3d\x10\xdc\x78\x1c\x7f\x8b\x9d\xa1\xeb\x42\xe6\x98\x0d\xfd\x1d\x11\xac\x0d\x01\x83\xb5\x78\xad\x00\x3d\x02\x50\x1a\xb3\xb8\x39\xf6\x86\x2c\xe7\xfd\x98\x16\xd9\x9f\x21\x3b\xbf\xa3\x5c\x66\x0f\x81\x8d\xe8\xd0\xf0\x4b\xbf\x75\xd3\x64\xc3\xd6\x8d\xd7\x6f\xdd\x42\xe0\xd6\x13\x85\x0d\x09\x95\x25\x50\x8b\xfb\xad\x5b\xdc\x3b\x8b\xdc\xe2\x84\xc6\x1f\x0a\x25\x91\x20\xc6\x40\x51\x65\x1e\x48\xc8\xbc\x6d\x1a\x67\x53\x9c\xc9\x22\x37\x31\x01\x57\x43\x41\xd7\xbd\x53\x2c\xf4\x3f\xc9\xc0\x0b\x59\xe8\xbf\x53\xc1\x3d\x28\xd0\x7c\xef\xa3\x82\x7e\x97\x8f\x64\xeb\xf3\xae\x03\x21\x1e\x3b\x72\x3e\x17\x7c\x09\x7a\xaa\x29\xcd\x72\x7e\x0f\xb7\xb0\x29\x6b\x2b\x7a\x7b\xab\xd8\x89\x42\x28\x57\xdb\x0f\x64\xb0\x9d\xa7\x62\x7d\xdb\x90\x51\x38\x48\x59\xf7\xd4\x2b\x61\x40\x73\x19\x4f\x55\x35\x11\x8c\x14\x94\xfe\x91\x30\xdf\xff\x4d\xe1\x57\x01\x63\x9b\xbb\x61\x90\x61\x8c\xe1\x4e\x7b\x5b\xf8\xfb\x20\xd3\x21\xf0\x51\x04\xb0\x79\xcb\x07\xac\x0d\xfc\xdb\x67\x67\x71\xbe\xb2\x71\xc6\xfa\xb5\xaf\xb2\x19\x03\xba\x60\x28\x9a\x28\x67\x7b\x28\xc1\xa4\xeb\xd2\xb0\x75\x83\x5d\x02\xd5\x83\x86\xad\x5b\xd3\xd3\x26\x6f\xdd\x96\x47\xc8\x05\x76\xda\xad\x10\xa2\x3c\x0f\xf6\x8b\x2a\xf6\x45\xb0\xc6\xe1\xaf\xa9\x05\x30\x5c\xe3\xf0\xd7\x1c\x17\x09\xc6\x3d\x95\xfc\x0e\x81\x9b\x04\x88\x5e\x2f\xc4\xfb\x3c\x20\x7f\x3d\x81\x06\x7b\x27\xcf\x3c\xc7\x4e\xd2\x3c\xff\x1b\xc6\xb0\x5b\x30\xad\x8e\x63\x47\xb8\x30\xff\x5d\x53\x97\x44\xc9\x86\x7c\x02\xf0\x26\x0a\xec\x82\xf7\x44\xef\x04\x13\x20\xc0\xf2\x8f\x4e\x19\x4f\x7f\xb3\x09\x35\x77\x29\x72\x62\xbb\x61\xeb\x76\x2d\x2f\xfc\x3d\x7f\x9b\x0c\x30\x76\x04\x4e\x73\x01\x03\x20\x56\x0d\x00\x86\xfa\x9e\x1b\xb6\x6e\xd6\x98\xc0\x83\x1d\xbc\x7a\x68\x4e\x37\x1e\xfd\x08\xe7\x73\x07\xab\x13\xe6\x7c\xa7\x18\x07\xeb\xbe\x44\x6d\xdd\xff\x11\x1b\x9e\xf8\x01\x3d\xf3\xea\x8b\x94\x6c\xdd\xac\xa9\xd6\x0d\x95\xad\xdb\x35\x55\xbb\x5c\xb6\xaf\x79\xcd\x27\xb0\x3e\xc2\xa2\xe0\x0c\x9c\x29\xb9\x89\x37\x1f\x87\xbd\x62\xf5\xca\x3d\x7f\x90\x43\xbd\xb2\x84\xcc\xef\xb3\xc9\xe2\x3e\x9b\x25\x8b\x3a\x1b\xae\xfb\x3b\xea\xfe\x46\x65\xeb\xe3\x60\xa9\xb6\x85\xca\x89\xad\x6a\xd1\xba\x9e\x25\x8d\x2b\x36\x1e\xa0\x34\x47\xbc\xb8\xd0\x1b\xdd\x49\xf6\x71\x70\x87\x57\x26\x71\x76\x48\x50\x53\x20\xf0\x71\xe0\xba\x3d\x5c\x57\x3e\x89\xc0\xf9\xa0\x61\xdd\x2d\xe4\x18\xa8\x00\x9d\xc0\xa5\x18\xd8\x08\xdc\xf2\xfc\x0d\x66\x84\x1d\xf6\x38\x3b\x1a\xa2\xf3\x5b\xb1\x53\x16\xcb\x9e\x28\xfd\x51\x7a\x28\xd7\xbd\xfe\x72\x72\xe7\xeb\x60\x1a\x39\xbc\x75\x35\xc5\xb5\x90\x7b\xdc\x7f\x2f\x82\x1e\xe8\x84\xef\x45\xe0\xb7\x83\xae\x80\xad\xeb\x67\x8c\x22\x31\x8a\x08\x3e\xd0\xb6\x30\xbe\xfe\x1b\x15\x50\xe9\xef\xd5\x9c\xee\x1f\xc7\x0b\xef\x2a\x96\xea\xd0\xf1\xd0\x95\x68\x08\x03\x75\xc8\x4f\x83\x72\x8e\x16\xa3\x20\xab\x57\x6d\x46\xd1\x74\x1a\x8d\xfb\x2b\xe6\xb0\xac\x7c\x6e\x96\xb8\x1e\x1f\x19\x6f\x32\x39\x5a\xf8\x7e\xc1\x49\xce\x98\xd6\x17\xb0\xcd\x35\x56\xd1\xc3\xbd\x0e\x77\xbb\xdc\x6d\x7e\x59\xe6\x03\x23\x47\xf9\xed\x8e\x4a\x2b\x43\x3f\x1d\xfb\x33\x22\xa3\xf2\x6e\xdd\x43\x20\x6a\x64\x7b\x90\x43\xc4\x76\x2f\x1f\x55\x16\xa5\x8f\x1a\x17\x49\x64\x90\xbd\xbe\xbb\xca\x3e\x97\x9e\xab\x95\x4f\x1b\xb6\xa2\x98\xf4\xbf\x49\xb3\x92\x5f\x45\xd3\x48\x44\x71\x94\xdd\xe2\xb7\x25\x47\x32\xf0\x22\xe1\x48\x7a\xda\x77\xbd\x5d\xee\x48\x3a\xe9\xbb\xde\x09\x04\x7e\xf4\xd1\xac\x02\x75\x61\x5c\xe5\x00\xa1\x6b\x4a\x2c\xfd\x8c\xe2\x47\x5d\xfb\x1c\xed\x8e\x30\x8f\xe2\xfc\x90\x80\x05\xc8\x9a\x55\xd1\x68\xac\x96\x77\x0f\xa5\xd9\xc4\xad\xaa\xf9\xdc\x48\xfe\x5e\x6e\x0e\xc0\xcf\x72\x39\x3c\x9f\xcb\xe5\xfd\x8c\xa5\x76\x56\xdb\xbd\xde\xa2\x8f\x99\xd4\x9c\x21\xcd\xbc\xba\xf9\x0e\xb5\xe9\xd6\x2d\xb5\x6e\x0e\x56\x8e\xe6\xa3\xc5\x6d\x8e\x17\x0f\xf0\xf3\x33\xbd\x31\x7e\xdc\xd8\xed\x2a\xc1\x4d\x82\x6c\x1d\x24\xbf\x8e\x26\x5c\x46\xd9\x2d\x13\xdd\xfd\x7e\xfe\x99\x1a\x47\xb6\xc2\x28\xce\x74\xca\x04\x63\xec\xa8\x77\xd4\x7d\x27\x78\xb3\xd3\x6e\x3f\x11\xcd\x23\x5b\x2d\x1f\xe4\x8d\x9d\xe4\x0c\x21\x7a\x47\xdd\xcf\xf6\x88\x47\x56\x8f\x4e\x87\xc5\x27\xef\xa8\xf9\x0e\x1a\x95\x4c\xa0\x6e\x56\x38\xed\xca\xdc\x17\x01\x37\x42\xa7\x03\xad\x33\x58\xb0\xd8\xfd\x64\xc7\xa5\x08\x1f\x39\xa2\x25\xa7\xd3\x33\x7d\x93\xb9\x3d\x2e\x8c\x6f\xec\x37\xe3\x23\x5b\x39\x9e\x29\xf6\x6d\xe8\x88\xd6\x65\x48\x3f\xf7\x8b\x17\x5a\x72\x4c\xfc\x76\xe0\xa9\xf9\xdc\x91\x25\xc8\xd5\x12\x10\xb4\x36\x5d\x38\x9f\xfb\x2e\x95\xa5\xef\xbc\x82\x8d\x6d\xee\xde\x2b\x31\xff\xed\xc0\xf5\x72\xb4\x74\x0d\x2d\x9d\xa3\x85\x2f\xf0\xa2\x1f\xa5\xa2\x4b\xbf\x9d\xf8\xcd\xde\xe6\x5c\x0f\x98\x11\xa4\x6f\xfa\xe6\xba\xd3\xc5\x88\xed\x0e\x7b\xe4\x20\xf9\xf5\x65\xaa\xd3\x53\x74\xd5\x25\xdd\xbd\x61\x8f\x9c\xe3\x6b\x03\x76\xea\xc2\xc7\xae\x87\xa3\xd2\x63\x8a\xe5\xdf\x14\x32\xf7\xca\xf2\x4b\x65\x17\x23\x23\xaa\x98\xe8\x7d\xee\x1e\x51\x94\xf3\x17\xa3\x80\x61\x11\xce\xda\x95\x6b\xae\x07\xd3\x91\x07\x1e\xc7\xe7\x6f\x0a\xb0\xbb\xbb\x42\x8e\x99\x5b\x8e\x6e\x5e\xd9\x70\x80\xb5\x5d\x07\xce\xd1\xc0\x3c\xbb\x6f\xb6\x18\xed\x7a\x35\x45\xbe\x75\xad\xc0\x62\x9c\x62\xd7\x62\x76\x53\x4a\x17\xfe\xd6\x66\x17\x87\x4b\x3b\x28\x82\xab\x6c\xda\x87\xd0\x4e\x1e\x5a\x95\x2d\x91\xdc\x9c\x46\xbf\xa2\x71\xa9\x4b\x09\x36\x42\x91\x09\x13\xe7\xeb\x80\xee\x4b\x54\x84\xf2\xb4\x9d\x80\x9e\xf4\xe9\x3b\x59\x4d\x59\xe4\x23\xf3\xb4\x35\x4e\x60\x10\x08\x28\x0e\x70\xb9\x1d\x99\x19\x9a\x2c\xce\xd0\x63\x58\x16\x52\x33\xd5\xd7\x84\xf9\x63\xa6\xbe\xc4\xb5\x62\x27\x9f\xfa\x6b\x66\x97\x27\x8c\x30\xc0\x03\x3f\x6b\xea\x8c\x46\x35\xb7\xd6\xf5\x7f\xff\x54\xcd\xc9\x4d\x2f\xff\xc2\xb5\xa8\x9e\x12\x05\x76\xef\xb4\xdd\xd2\xd3\x1c\x97\x68\x1a\x32\xde\x4a\x67\xe3\x2c\x1a\x99\x79\xe3\xcb\xc0\xbb\x97\xc2\x8c\x69\x00\xb2\x0a\xf3\x0c\x5e\x1b\x40\x6b\x4a\x99\xa6\x97\x14\x0c\x97\x3c\xc7\x3b\x59\x10\x3d\xf7\x6c\x0f\xa5\xdc\xec\x19\x8a\x53\x3e\xa0\xef\x25\x77\xed\x0f\x9f\x20\x55\xcd\x4e\xb6\x18\x7f\xac\xf7\x8d\x44\x1e\xc0\xf0\x9e\x44\x7d\x0b\xc3\x6f\x25\x0e\x02\x86\x5f\xcb\xfa\x40\xbc\x8d\x61\xa2\x99\x0b\xaa\x82\xa1\x59\x04\xaa\xf1\xa4\x09\x43\x35\x9e\x32\xe1\xbc\x1a\x0c\x2f\xa9\x26\xc6\x8f\xe7\xc5\xa8\x0d\xe1\x33\x0f\xf0\x57\xb8\x66\x5e\x7e\xd2\x9c\xfd\xce\x06\xd1\xb8\xbb\x41\x47\x5a\x45\xb3\x51\xf7\x19\xcd\x06\x91\x1c\x76\x5f\xd8\xce\x5d\x97\xa3\xd2\x71\xbc\x6e\x99\x69\x8e\x04\xcf\xad\x33\xac\x5a\x07\xcb\xc7\x59\x6b\xa0\x57\x05\x68\x49\x4c\x10\xda\x9f\x34\xef\x7d\xd2\xdc\x97\x41\xb7\x4e\x5a\xeb\xd1\xb8\xd1\x82\x89\xe0\x55\xf9\xd2\x1a\x22\xf6\x49\x20\x81\x31\x7c\x28\x90\xc0\x18\x3e\x16\x48\x19\x0c\x7f\x10\xff\x95\xc0\xb0\xb3\x2d\x08\x0c\x5b\xd7\x82\xc0\x9f\x45\x45\xe0\x8f\xf7\xab\x79\x90\xc0\xd5\x95\x90\x91\xfd\xd0\xb2\xf7\xc3\xe1\xc5\x75\xd6\x27\xde\xcf\xe9\x93\x75\xb7\x76\x3a\x02\xda\x66\x91\xdd\xc5\x6c\x6f\xc3\x7c\xf7\x0c\xcf\x7a\x0e\x23\x87\xfb\xed\xc0\xbc\xd6\xe2\xc2\x3c\xe8\x04\xb5\x87\xde\xa1\x9d\x0f\x9a\xb3\xf5\x11\xcf\xd2\xe8\xe6\xa7\xe3\xb7\xd7\x5e\xfd\x6c\xfd\x5c\x0b\x9a\x74\xe5\x9f\x84\xad\x02\xee\xa4\x77\xd3\xbb\x9f\xf2\xd3\x5d\x37\x1f\xa7\x80\x66\xfe\xed\xf4\xba\x8e\xff\xef\xee\x7a\xef\xaf\x56\xd0\x74\xbb\x6e\xcf\xe9\x75\x7f\xae\xff\x5c\x37\xe9\xeb\xbd\xbf\x82\x27\xee\xff\x73\x7b\x10\xfe\xab\x17\x3c\xe9\xb9\x4e\xaf\xdb\xc5\x2a\x83\x26\xa8\xd7\x3d\xe6\x43\xc6\xfc\xb1\x8b\x40\xbd\xbf\x82\xa6\xa9\x03\x62\x50\x18\x63\x7f\x39\x2d\x08\x3d\xb6\xbe\x58\x3e\x2d\xf8\x22\x1b\xb9\xbf\xb3\x11\xcb\x9f\x80\x15\x4c\x44\xfe\x8d\x79\xbd\xc7\xba\xa7\x79\x28\x0b\xe9\xeb\x48\x36\x1b\x39\x68\xdc\x95\xab\x4c\xb4\x06\xc9\x34\x1b\xf3\x51\xf1\x15\x03\xa8\xa9\x4d\x47\x8e\xeb\xdd\x95\x77\x89\x51\xff\x3f\xd0\xdc\x4c\x9b\x6c\xc4\xec\xab\xf0\x33\x4b\x73\x74\x38\x43\xb4\xfc\xa7\x81\xb9\x01\xee\x36\x1a\x49\xfd\x0d\xc4\xab\x65\xe0\xcf\x17\xc1\xad\x2f\xf6\x58\xe2\xb4\xba\xa0\x8d\xf7\x26\xdb\x5b\x0c\x1d\xe1\x2e\x55\x80\x0a\x12\x6c\x15\xb7\x94\x57\x7e\x89\x07\xbf\x40\x2c\xd6\xcc\xd7\x36\x9e\x6e\x32\x16\xce\xe7\x2f\x9e\x32\x16\xe2\x27\x05\x8b\xfc\xa6\x76\xe9\x2a\xe4\x74\x10\x20\x87\x7b\xfa\x9c\x55\xa7\xaf\xc2\x13\x4d\xa6\x9b\xc5\xcd\xc1\xb5\xfc\x62\xc1\x88\xad\xff\x35\xb7\x87\xe4\x76\x41\x90\xbe\x96\x81\x73\x33\x82\x19\x89\xbd\x68\xd3\xe2\x79\xb8\xf6\x76\x79\xe7\x08\x45\x42\xb1\x04\x98\xef\xf4\x83\xce\x8b\x40\x7a\x3e\xd7\xdb\xd2\xd5\x0c\x1f\x6c\x16\xfe\x87\xa0\x59\x5e\x83\x01\x3a\xe1\x1b\x6c\x8a\xea\x35\x55\x38\xdd\x17\x6e\xf4\x88\xe0\x21\x30\xa8\xdf\x6b\x04\xce\xe3\xf9\x5f\xae\x85\xe7\xaf\xd1\xe2\xbd\x1b\x1b\xd7\x36\xd5\x34\x64\xbe\xa1\xaf\x36\xa8\x2b\x44\xdd\xf5\xdc\xd0\x78\xba\x6b\x1d\x18\xdb\xaf\x75\x0c\x9e\x23\xaf\xdd\x66\x67\x3e\x97\xf8\xce\x9d\x01\x46\x2c\x2b\xa3\x4e\x98\x3b\xd5\x22\xca\x87\x9a\xd3\xd7\xda\x1e\xf0\x9d\x52\xe5\xe1\xcc\xcf\x31\xa5\x7b\x9a\x8a\xc0\x33\x1e\x86\x12\xb4\x89\xd7\x81\x13\x87\x94\xf3\xc2\xa7\x58\xba\x68\x87\xee\xe4\x1b\x3f\x50\xfe\x44\xfe\x7d\xf3\x6b\xed\xd2\xf6\x16\xc3\x77\x81\xd0\xe5\x17\x11\x12\xae\x4b\x01\x0c\xf4\xd4\xfc\x2d\x3b\x48\x2a\x0a\x8d\x43\x97\xb6\xb7\x05\xbe\x1c\xc4\xc6\x61\x57\x30\xe4\xb9\xb5\x0e\xd6\xd2\x09\x58\xae\x65\x5a\x9e\xc1\xf9\x4d\x03\x1c\xcc\xdd\x11\xfb\xcd\xe3\x48\x6a\x11\xcf\x74\x97\xfc\x15\xb6\xc3\xcd\x30\x24\x94\x8f\xb3\xe8\x72\xa6\xaf\x07\x51\x86\xc9\x5c\x0b\xf5\x92\x50\x7e\x39\xe3\x5d\xf2\x57\xbb\x1d\x86\x08\x75\x39\xe3\x23\x9e\x46\x63\x80\x79\x19\x86\xa1\x7a\x46\x28\xff\x35\x4b\xf3\xaa\x10\x48\xe8\xa8\x8f\xf1\xe7\xe1\x73\x25\x09\x15\xd1\xf4\xd2\xb4\x15\xea\x67\xf2\x19\xa1\x22\xe6\x72\xd8\xbd\xd1\x10\x18\xcb\x81\x56\x3c\x1e\x25\x63\x65\x20\x84\x54\x00\x81\x05\xda\x6d\x68\xd8\x44\xaf\xa2\x24\xd6\x59\x97\xfc\xb5\xc9\x37\x84\xde\x20\x54\xa4\xc9\xf5\xb8\x4b\xfe\xe2\xcf\x37\xf8\x06\x27\x54\xcc\xd2\xf8\xf6\x3a\x49\xa0\x1e\xa5\xc5\xe6\xe6\x4b\x42\x25\x57\x3a\xcb\x2b\x7b\x1e\xbe\xd2\xbc\x4d\xa8\x1c\xf0\x34\x4b\xf5\x6c\x5a\xf4\xa1\x8d\x89\x89\x4c\x62\x8e\x7d\x57\x1b\x2f\x5e\x75\x34\xa1\x32\x49\x79\x8c\x48\xbd\x0c\x9f\xb7\x31\x3e\x0e\xe3\xe4\x5a\xa7\x79\x8d\x2f\x9e\xbd\x7a\xae\x95\xc9\x98\x46\xf1\x10\x61\xc3\x4d\xe8\xb3\x4c\xa3\xd1\x34\x01\xf4\x94\xec\x3c\x7b\x0a\x29\xb7\x7c\x6c\x51\x52\xf1\x74\x68\xf5\x72\x53\x98\xa4\x12\x6a\x53\x14\x49\xfd\x24\x56\x7a\x9c\x62\xbf\xc4\xe6\xe6\x8b\x76\x91\x9e\xf2\x5b\xe8\xfe\x2b\xf8\x57\x24\x69\x6d\x8a\xbf\x78\x06\xbd\xca\xd3\x6c\xb0\x47\x90\x36\x1c\xf0\x61\x04\xd5\x29\xf1\xf2\x45\x5e\xdd\x88\xf7\xf5\x38\x83\xc1\xde\x14\x15\x3e\x49\x1c\x5d\xe9\xa2\xda\xe7\xcf\x5f\x88\x8d\x1c\xf7\x24\xe5\x63\x33\xca\xe1\xa6\x2c\xda\x4a\x52\x39\x88\x00\xcf\x57\xaf\x9e\x6e\x48\x69\x12\x53\xad\xf2\x4a\x0b\xb0\x29\x8e\x77\x97\xfc\xa5\x5f\xbd\x7a\xf1\x92\xe7\x89\x9a\x17\xed\x6c\x86\x42\x6e\xe6\xed\x4c\x61\x50\x72\x42\x3d\xdb\x7c\xaa\x0a\xc4\x30\x3d\x27\xc1\x46\xf8\x2c\x7c\x16\xd6\xd2\xf5\x62\x7a\x36\x4b\x2f\x67\x49\x34\x35\x04\x97\x5a\x75\x4c\x7a\xc9\x56\xaf\x9e\xb5\xdb\xea\x29\xa1\x4a\xeb\xc9\x24\x1a\x9b\xc1\xec\x3c\x7b\x95\x27\x4d\x87\xb7\xe5\x70\x09\x33\x82\xd1\x28\x6f\xff\xc5\x2b\xf8\x97\xa7\xe8\x5a\x4a\xa2\xfa\x25\xbb\x74\xf4\x2b\xe4\xe6\x30\x4a\xb5\x48\x41\x99\x23\x7f\x89\x0d\xf8\x8f\xd0\x30\x06\x66\x2b\x67\x5f\x18\xf2\xb0\x4d\x68\x98\xa4\x7a\x9a\x15\x64\xd9\xd8\xd8\x14\x08\x3b\x93\x83\x69\xc4\x11\xce\xcc\x8f\x3e\x8f\xc6\x53\x91\xa4\x09\xf2\x1b\xfc\x23\xb4\x0f\xcb\x67\x59\xe1\xa6\x99\xe5\x8f\x80\x99\xb0\xa0\x7a\x09\xa3\x61\xf3\x96\xe2\xfc\xf9\x06\xa4\x41\xa7\x6e\x35\xad\x98\x69\x13\x47\x0e\xe3\xb7\x3a\x8e\x93\x6b\xe0\x27\x15\x86\xc0\x0b\xd8\xe1\x5b\x4d\x07\xc9\x58\xdf\x2a\x7d\x5d\xc8\x81\x36\xa1\x83\x24\x2b\x09\xf9\xe2\x95\x78\x46\x68\x34\x56\x11\x1f\x1b\x86\x90\xea\xb9\x7c\x2e\x4d\x5a\x1f\x10\x7f\x06\x6c\xb7\x41\x68\x74\x95\xa4\xb7\x86\x08\x58\x4d\xc1\xac\x61\x5b\xbf\xd8\x94\x84\xc6\xfc\x4a\x8f\xf1\x55\x8d\xbf\xf4\x0b\xfd\x22\xe4\x55\x92\x88\x67\xd3\x81\x29\xda\x0e\x9f\x43\xfa\xf5\xb8\xe8\xc6\x4b\x19\x22\x9f\xc6\x7a\x94\x8c\xe5\x20\x0a\x43\x64\x41\x20\x35\x48\x9c\x38\xea\x0f\x0a\x49\xc1\x95\xda\xd4\x2f\xf2\xb4\x52\x0a\xb4\x37\xdb\x9b\xed\x22\xd1\x4c\x53\x9d\x4f\x66\x4c\x2b\x69\x59\xd2\x28\xe4\x21\x57\x1b\x45\xb6\xe1\x15\xf5\x14\xfe\x95\x69\x06\xb7\x57\x6d\xad\x5f\xb5\xab\xc4\x7b\x80\x25\x1d\xc5\x0b\xd9\xc9\xd3\xca\x59\x14\x86\xbc\x0d\xb3\xc8\xa4\x56\xd3\x68\xa3\x2d\x36\x78\x99\x5e\xf2\xef\xe6\x4b\xa9\x81\x68\x8f\x4c\xba\x35\x8f\x5e\xbe\xdc\xdc\x7c\xf5\xaa\x28\x60\x4d\xa4\x7a\x46\xa6\x75\x9c\xd7\x25\xda\xf2\x99\xd2\x79\x46\xd5\xef\x30\x0c\x35\x76\x67\xa4\x73\x91\xd7\xce\xa3\x05\x6e\x4f\x37\xa4\x7a\x8a\xa4\x19\x63\x1c\xf8\x1d\x48\x5e\x49\xa1\x82\xb7\x47\x3c\x4d\xb0\x9b\xc0\x85\x50\x8d\xd9\x10\xd5\x56\xa2\x17\x2f\xa4\x82\x9e\x9a\x2c\x4b\xac\xc2\xc8\x9a\xc4\x52\x34\x09\xfe\xfc\x39\xd0\xd5\x24\x4f\x66\xe9\x24\x06\xe8\x57\x4f\x5f\xb6\x95\x28\x92\x2d\x2a\x3e\x95\xe2\xe9\xcb\x4e\x99\x61\x89\xa3\x97\xe2\xc5\xa6\xd6\x65\xce\x04\x96\xfb\x6a\xd2\x84\xfc\x55\x89\x91\x2d\x7c\x9e\x6d\xaa\x0e\x88\x46\x93\x63\xc4\x4f\x3e\x23\x5e\x76\x9e\x6f\x3e\x27\x74\x14\xa9\xb1\xc5\x8d\x9d\x57\x9d\x57\x2f\xa1\xdf\xd1\x38\x93\xa9\xe6\x23\xb3\xb4\x86\x30\x86\xa3\x68\x9a\xdd\xa6\xc9\xb4\x58\x5d\x35\x20\x9a\x48\xc9\xa7\xd1\x38\x4f\x12\xcf\x09\x1d\xf3\x2b\x7e\x91\x54\xd2\x45\x69\xae\x08\x7d\x34\xe6\x57\xb7\xc5\xfa\xd3\x26\x34\x89\x55\xcc\x25\x42\xa8\xf0\x39\x8c\x06\x4a\x7f\x24\xbd\x11\x01\x18\x57\x29\x17\x40\x73\xb1\xa9\x37\x9e\x12\x6a\x2d\x04\xfc\x39\x02\x61\x82\xe9\x52\x18\x3e\xcb\xd3\x72\xea\x2b\xfe\xb2\xad\x5e\x10\x3a\xe1\xb1\xb6\x85\x8f\xd6\x7a\x13\x46\x10\xd3\x8b\x59\xb1\x19\x8a\x57\x9b\x26\xcd\xa6\x20\x0f\xb5\x06\xba\x43\xba\x4d\x3f\x25\x5e\xb6\x41\x5c\x4f\xf8\x84\xdf\xf2\xeb\x41\x34\x31\x24\x08\xd5\x73\x42\x27\x9a\xcb\xc1\x64\x16\x86\x86\x00\x5c\xbc\x82\xb4\x74\x86\x92\x68\xf3\xf9\xd3\x90\xd0\x72\x92\xc9\xb6\x14\x84\x4e\xe2\x19\x90\x5a\x29\xde\x56\x8a\xd0\x49\x72\xad\x4a\x51\x2e\xda\x1a\xd9\xb5\x64\x9f\xcd\x9c\x86\x45\xb7\x0d\xab\xa6\xc9\xf4\xb6\x50\x53\x60\x49\x83\x45\x2d\x4d\x6e\x79\x31\x7d\x9e\x75\x5e\xbc\x82\x21\x9b\x72\xa5\x62\x5d\x40\x6e\x8a\x67\xcf\x3b\x4f\x21\xb5\x98\xe0\x7c\xb3\xfd\x72\x03\x12\xc6\xaa\xac\x2f\x7c\xc6\x9f\xbd\x68\x13\x6a\x4f\x78\xbd\x29\x9e\xbf\xc4\xa4\xe9\x40\xc7\x46\x77\x09\x9f\x03\xad\xa6\x91\x1e\x8f\x61\x5a\xf1\xf6\xf3\x8d\x0d\x18\xfc\x69\x14\x5f\xa1\x10\x95\x6d\xf8\x47\x68\x5d\x42\x68\x41\xa8\xcd\xec\x2f\xf8\x73\x94\x93\x35\x79\xd1\xde\x6c\x83\xd8\xaa\x89\x8a\x22\x6d\x5c\x88\x02\x0e\x8c\x7a\x6f\x76\x84\x2f\x43\x42\x6d\x51\xf2\xec\xc5\xe6\x06\xac\x11\x19\x4a\x56\xb5\x21\x9e\x81\xb0\xcf\x34\x0a\xdf\x76\x2e\x7c\xb3\x41\x34\xcd\x90\xe0\x6a\x53\x84\x6a\x93\xd0\x2c\x19\xf1\x2c\x31\x6b\xcc\xd3\x67\x2f\x09\xad\xcd\xb5\xb6\x6e\xab\x36\xa1\xe5\x22\xaf\xf5\xe6\x06\x90\xe3\x7a\xa0\x79\x86\xf3\x48\x69\xf1\x14\xe2\x30\x35\x76\xb4\x09\x4c\x47\xc9\xb0\x50\x60\x61\x19\xa9\x09\x36\x18\x57\x93\x50\xf2\x29\x47\x59\x66\x7b\xe8\xd6\x2d\x0b\x9c\x95\xf7\x0b\x4b\x0b\x8c\xf9\xae\x34\x63\xd7\xba\xc7\xbb\xd7\xba\x89\x67\x17\x6f\x46\x68\x8a\xab\x5e\x15\x13\xad\x44\xb1\x3d\xd8\x14\x53\x29\x1c\x41\x53\xc9\x5d\x2a\x3c\xc9\x8e\x74\xf1\x46\xb0\xb4\xbf\xe1\x0a\xe0\x6f\x2b\xf0\xd9\xc0\x35\x0f\xa1\xee\x8e\x70\xf7\xb1\x3b\xf2\xb9\xb1\x50\x04\xf5\x26\xa4\x81\xbf\x36\xd5\x17\xe7\x45\xbc\x49\x56\xa2\x29\x7e\x87\x90\xaf\x5c\xf1\x38\x52\x2b\x32\x89\x93\x74\x65\x8a\xdd\x21\xae\x67\x79\x43\x59\xbb\xe7\xd5\xd5\xa2\x27\x4b\xfa\xe9\xce\xe7\x06\x79\xff\x43\x30\x9f\x03\x62\x36\x56\xb8\x3d\x3c\x86\xed\xe1\x5f\x4e\xcb\x35\xff\x5b\xfb\xc3\xbd\xc2\xb4\xb0\x5a\x34\xe0\x96\xa7\x5b\x07\xba\xc9\x9b\xe4\xef\x45\x8c\x07\xfa\xc6\x60\x4d\x5c\xef\x59\x69\xb0\x29\x2e\x71\x1f\x6b\x4e\x35\xe7\xf6\x6e\x09\x31\xb1\x5d\x61\x46\xc6\xfc\xb3\x67\x59\x65\xfd\x61\xb1\xc9\xed\xd0\x0d\x97\x76\x5e\xb8\xb4\x4c\x79\x7a\x2f\xe5\x79\x9e\x62\x39\x04\xed\x5b\x7b\xc9\x01\x37\xa7\xad\x03\xbc\x81\x28\xe1\xd7\x6c\xc6\xf1\x7b\xa3\xf3\x79\x7b\x9b\xcf\xe7\x1b\xcf\x9f\x6f\xf1\xf9\x3c\xe4\xe8\xac\xd5\xde\x16\x26\x49\x60\x92\xc4\x24\x69\x92\xaa\xf3\xbe\xbf\x89\xf3\x77\x93\x37\x4f\x74\x53\xc0\x1f\xd9\xfc\x9b\xb8\x8b\xe4\x39\x79\xb7\x6b\xc8\xf3\xb7\xeb\x71\xf6\x61\xe4\x70\x7f\x08\xdd\x7a\xe1\x02\x4a\x1f\x46\x8e\xa8\xe2\x12\xe2\xb2\x8a\x17\xc7\x0a\x40\x78\xd1\xb4\x4e\x1d\xde\xda\x67\x76\xd0\x55\xd8\xf5\xc2\xe6\x94\xe2\x91\xac\xfd\x61\xcf\xfa\xf9\x58\x3b\x58\xdf\x78\xfe\x1c\x8f\xc8\x3a\x18\x44\x67\xa1\x0d\x13\xb4\xbd\xf1\x05\x7e\x3a\x90\xea\x7c\x8f\x9f\x47\xcd\x97\xcf\xdb\x74\xc8\x5a\xcf\x9f\x38\xaa\xa9\x5d\x4f\xa1\x73\x8d\xa3\x18\x13\xbd\x90\xbd\x68\x3f\x71\xf0\xbb\xb5\x8e\x5a\xd3\xe6\x11\xb9\x3c\x95\xaf\x89\x3c\xb5\xd9\xd9\x68\x43\x0e\xba\x1f\x60\x9e\x58\x93\x45\xde\xc6\x33\x74\xab\x68\x6f\x0d\x1b\x8d\xd6\xf3\x6d\x36\xec\x61\xfa\xba\xb3\xf1\x64\xe8\x76\x8b\xf0\x1a\xc4\x4a\x5e\xc1\x73\xd2\xb0\xf9\xf4\x45\xdb\xfd\xd7\xd3\x17\x6d\xda\xa7\x43\xfb\x73\xb4\x25\x27\xb4\xb7\x65\x4f\x36\x59\xa7\xdb\xd9\x42\x6b\xd8\x1a\xab\x9e\x0b\xe8\x6c\xbf\x78\x22\x7b\xbc\xf9\xc2\x7c\x18\xf8\x89\xec\x76\xb6\x37\x9e\xc8\x9e\xe8\x6e\x6c\x3f\xc5\x1c\x93\xee\x6c\xac\x3f\x5d\x93\xee\x93\x17\x5d\xfb\x0c\xfb\xa4\x4e\xe5\x8e\x39\x84\xdc\x08\x8c\x4d\xc5\x3c\x2a\x88\x94\x6e\x07\xeb\x4f\x5f\xb4\xf3\x6f\x94\x0a\x57\x31\xcd\x42\xb6\xf1\xfc\xf9\x13\x69\x8e\x95\x8d\x5b\x92\x21\x73\xeb\x39\xe0\xfb\xc4\xe9\x34\x85\xdb\x95\x4d\xb1\x26\x9e\x48\x1a\xb2\x8d\x27\x72\xad\x4f\x15\x96\xfa\x38\x72\x42\xda\xa7\xbc\xd9\x59\x7f\x0a\x83\x65\xa7\xc1\x68\xd9\xf1\x35\x80\xa9\x91\x4c\xb9\xc6\x9d\x56\xe7\xbf\xa1\x1b\xa0\x78\x78\x33\x62\xeb\xff\xfe\xcb\xe9\x75\xfd\xf6\xda\x2b\xbe\x16\x06\xbf\x9f\xde\xb9\xbf\x3b\x74\xe3\xee\xf1\x7a\x44\x4f\x0b\xe3\x67\xda\x17\x6e\xef\xa7\xe3\xb4\xe7\x7e\x67\xed\x55\xf0\x53\xfd\x6e\xd3\x8d\x3b\x97\xfe\x9c\xf6\xfe\x49\xda\x4f\xf7\xf1\x7a\x54\x49\x9e\xa3\x3a\x09\x3f\x89\xc0\x39\xd5\xbc\x78\xa5\x11\x27\xb1\xf0\x3b\x41\x21\xe0\x31\xba\x11\xb8\xd4\x4c\x6b\xff\xa9\xb9\x39\x61\xde\xc3\xd8\x78\xfe\x7c\xdb\x5c\x47\x65\x32\x8f\x49\xe3\x48\x94\xc7\x8a\x17\x6c\x7c\xf4\x8e\x2d\x9e\x0d\xf1\x6d\xd7\xca\x0f\xa3\xc5\x07\xaf\x3e\x04\xbd\x6f\xba\xc9\xed\xc7\x3a\x3f\x59\x87\x74\x3b\x17\x8e\xa4\x6d\xda\xa9\xd3\x58\x3e\x81\x41\x6f\xfe\x7f\x69\x7b\xd7\xb6\xb6\x71\xe6\x71\xf8\x3d\x9f\x22\xf8\xee\xa6\x76\x23\x8c\x03\xdd\x6e\xd7\x46\xcd\xc5\x21\x2d\x94\x33\x84\xd2\x36\xf8\xde\x4b\xb6\x65\xc7\x24\xd8\xc1\x71\x80\x40\xf2\xdd\x9f\x4b\x23\xc9\x96\x93\xd0\xdd\xbd\xff\xbf\xe7\x05\x41\x96\x46\xa3\xd1\xe8\x34\x92\x46\x33\x7a\x93\x75\x1a\xaf\x6b\xb9\x82\xd7\x2c\xbe\x59\xc6\x37\xd5\xf8\x8d\x32\x7e\xc3\x55\x27\xb5\xe3\xbb\x8a\xd6\xe8\xd1\x9d\xde\xb5\x90\x85\xd8\xd8\xaf\x5c\xc5\x9d\x2c\xc2\xb1\x51\x2f\xfe\xe6\xa1\x4f\x17\xce\x04\x4b\x6f\xee\xd2\x48\x1d\x3c\xaf\x7f\x81\x79\xcc\xf6\xba\x81\x8b\xf6\x7a\x76\x87\x32\xc6\x07\x2e\x22\x46\xe3\xaa\x0c\xcf\x0c\xc7\xef\xfa\xd4\xd5\x97\x1a\x2e\xf0\xcc\xbd\xde\x1a\x31\xf7\x7a\x8a\xfb\xd7\xae\xe5\x76\x3f\x2b\xd5\xec\xd0\xaa\x87\xb1\x9e\x49\xbc\x91\x0e\xec\xd1\x37\xfe\xfc\x93\x73\xf4\xf7\x8f\x7f\x70\x16\x36\x9b\xef\x81\x67\xc6\x7a\xb3\xbd\x69\xac\x95\x60\x9e\x04\xf3\x24\x98\x57\x80\xa9\x53\xe4\xd5\xd2\xe2\x58\x21\x6b\xd0\x60\x0d\x19\xd1\x64\x11\x4d\x25\x62\x83\x45\xb0\xf9\x56\x31\x66\x2c\x98\x79\x28\x5f\x22\x6c\x79\x2d\x62\x7b\x42\xa3\x9b\x26\x01\x66\x31\x9e\x4d\x66\x07\x44\x3f\xbb\x9b\x73\x4b\xad\x5e\x49\xde\x71\x35\xf7\x89\x78\x2b\x43\x13\xf0\xf1\x0b\x59\xcc\x88\xe6\xdc\x98\xe5\x6b\x96\x29\x68\x12\xac\x89\xec\x0a\x71\xe7\x25\x71\xe5\x43\xd5\x89\x8b\x3c\x78\xa5\xca\x88\x93\xcf\x95\x68\x12\x54\xfa\xc8\xc5\xdd\x1c\x8b\xf8\x93\x28\x96\xb7\x3b\x71\x8d\xad\xe2\x49\x13\x64\xe4\xc4\x96\xaa\xc0\x77\x73\x8f\x55\x27\x2e\x0c\x45\x80\xfe\x84\x3d\x85\xc2\x8e\x00\x25\xe0\x23\x6d\x90\x46\xb1\x4f\x06\x09\xb9\xa3\x15\x2d\xf4\x6f\xaa\x41\x12\x9d\xe0\xd7\x4c\x92\x88\x77\xe9\x2a\x1e\xb0\x4b\x62\xb4\x2a\x71\xf6\x20\x52\x3d\x3e\xa9\x03\x9f\x60\x7c\x3e\x9d\x12\x8c\x4f\xe1\xf7\xa8\xd7\x3a\xb7\x41\xf8\x34\x53\xc5\x4c\xcf\x37\x29\x35\x11\xe5\x32\xf0\xdc\x21\x78\x5f\x5c\x38\xf3\x4e\x09\xfd\x16\xfa\x2c\xef\xaf\xc5\x74\xcc\xa5\x15\x52\x31\x91\x75\xcd\xeb\x48\x30\xb8\x5a\x75\xb8\x0b\x66\xd2\x3d\x08\xdc\x7a\xfd\xd6\xd3\x09\x52\x8c\x7c\x29\x33\xd2\xf7\x39\xa5\x79\xf3\x56\xf7\xba\xbb\x81\x8b\x3c\xf3\xd2\x67\xad\x7c\xfb\xa8\xfb\xe8\x65\x94\x4f\x06\xd4\xf6\xba\x4f\xee\x0c\xe6\x4d\xce\x29\xaf\xfb\xec\x15\xaa\xfb\xfd\x58\xe7\xdf\x2d\xf8\x67\x77\xe1\x9f\xeb\xfc\xd4\x83\x8a\xaf\x0b\xee\xb3\xca\x33\x0c\x6e\xc8\x0a\x71\x5b\x97\xac\x4b\xc1\x8a\xe6\xe1\x54\x22\xaa\xd7\x3d\xf3\x73\x42\x5a\xdc\x64\x06\x44\xd9\x92\x5e\x24\x72\x83\x7b\x0b\x41\x8d\x19\x07\xf5\x7a\xe7\x8e\xc5\x9a\x71\x60\x2c\x73\x9e\x79\x2d\xfb\x0b\x26\xd3\xe9\xcb\x8c\x55\x65\x03\x57\x9c\x63\x16\x9c\x28\xe2\x9a\xae\xea\x00\xd8\x37\xe2\x50\xef\xc7\xba\xdf\x0d\x5c\x56\x87\xc0\xc5\xd1\x2d\xff\x2a\x34\xbd\x0a\x1b\x39\x81\x8b\xb9\x5b\x1c\xd1\xb3\x18\x14\xc4\x32\x3a\xba\xa0\x2a\xb0\x24\x9f\x3f\x9f\xcf\x57\xf3\xbd\xcc\xe6\x72\xc9\xa6\x0e\xc4\xd5\x98\x0a\xcf\x42\x85\xe2\xc6\x46\xc5\x0b\xac\xc1\x8d\xe9\x34\x51\x50\x75\x0e\xea\x6f\x05\xe0\xef\x85\x00\x91\x8a\x93\x4f\xdf\x5d\xda\x81\xee\xe6\xac\xc6\x70\xad\xf2\xf3\x16\x57\xe4\x3c\x6f\x7d\xbe\xd3\x8f\xee\x74\xe8\xd9\x68\xff\x4e\x07\x15\x11\xc3\x26\xb6\xaa\xdd\xfe\xa3\xbc\x37\xe7\xb5\xf1\x4a\x5d\x71\xde\x1c\x62\x8a\xf3\x50\xa9\x7f\xc9\x8d\x69\x9f\xdd\xe9\xca\xcc\xe4\xb3\xd9\x05\xa9\xb3\x92\x0f\x93\x8b\x61\x2b\xd2\xf0\x0f\x3a\xe7\x51\x5d\xf4\x1f\x36\xcd\x16\x2c\xaf\xd7\xfd\x2d\x86\xb2\xe5\xdb\xa4\xc5\x02\xfc\x4a\x5e\x1a\xaf\x80\x67\x23\x12\x98\x55\xf5\x13\x14\xc7\x50\xb4\x20\x54\xb9\xc1\xe7\x60\x41\xd1\x0f\x24\xe5\x01\x5a\xb0\xb6\xf9\x53\xce\x0d\x16\x97\x21\x2a\xb7\x7f\xaa\x33\x22\xcb\xe5\x6f\x08\x91\x8f\x9b\xaa\x9f\x9e\x2f\x03\xdd\x43\x73\x5e\x8d\x15\x0b\xcf\x95\x8b\xc7\x3e\xf7\x0c\x2e\x24\x21\xbf\xbc\xc5\xf4\xf1\x9a\xee\x37\x9a\xd2\x3b\xbe\x5f\x3e\x35\xb0\xa4\x55\x3f\x95\xb8\xd3\x58\x6e\xa5\xc1\x41\xd0\x9a\x10\x68\x4b\xa3\x9b\x7c\x05\xf4\xd6\x02\x98\xfa\x79\xd8\x37\x5a\x81\xad\x0e\x4e\x52\x18\xf7\x81\x35\x69\x12\x48\x6f\x00\x57\x7d\x7c\xc5\x7a\x0e\xff\xda\x9e\xb0\xaf\xb2\x19\xb6\xa9\x31\xbb\xc6\x24\xe1\xb6\x37\x0e\x5e\xb3\xbd\x61\x4e\x82\x99\x73\x6d\x7e\x0b\x5e\x4b\xbf\xea\xb3\xf4\xde\xe8\xb5\xf4\xed\xc9\x2f\xfd\x0f\x11\xf1\xf4\x78\x12\x20\x81\x0e\x89\x6c\xdc\xb5\xd0\x60\xff\x95\x47\x82\x4a\xc6\x6f\x7c\x11\x37\xaf\xfa\x46\x11\xde\x9e\x18\xaa\xc0\xe0\x49\xe5\x07\x98\xbf\x00\x62\x77\x17\x9f\x3b\x72\x86\x89\x7d\xf9\xee\xf3\x94\xea\xf0\x29\xd8\x76\x46\x71\x53\x42\x99\xbb\x54\x00\xed\xf6\x74\xf6\x25\x60\x32\xaa\x60\x7a\xe3\x49\x4c\xbd\x40\x87\x4f\x01\x75\xe2\x29\x98\xc6\xd2\x57\xd8\x5d\x5f\x67\x5f\x02\xe6\x3e\x56\x60\xbe\x47\xf5\xba\x9f\x08\x01\xc7\xfc\x1e\x09\x98\x64\x80\x77\x7b\x05\x90\x7f\x2e\x1f\xcb\x25\x03\xf8\x14\x50\xdf\xf6\xa5\xbd\x18\xf3\x4b\xdc\x62\x3f\x7c\x68\x41\xe2\x75\x99\xb8\xcf\x12\xf7\xd5\xc4\xfd\x88\x5b\xa5\x27\x66\xbb\x27\x71\xef\x47\xb0\x40\x9a\xed\x9e\x78\xc4\xb7\x1f\x99\xb7\x11\xeb\x50\xe5\x57\x99\x72\x11\xaa\x29\x17\xa1\x7c\x87\xf8\x20\xec\xdd\x93\xee\x03\x28\x10\xcb\x48\xf8\x16\x30\xde\x9f\x00\x33\xbb\xc6\x1e\x74\xcd\x95\x6b\xf3\xf6\x76\xb1\x0b\xbc\x84\xf1\x60\x60\x43\x0e\xdf\xd3\x0d\xb4\x4b\x6d\xd1\x5c\x68\x94\x67\x69\x5f\x7c\x66\x14\x8d\x89\x2d\xd8\x8f\xbe\x47\xb6\xe0\x32\xf2\xcf\x6d\xc1\x34\xf4\x25\xb6\x05\xc7\xd0\xbe\x08\x5e\xef\xa3\x76\xcf\xee\xf5\x65\x1d\x0c\x34\x24\x79\x4e\xb3\xa4\x88\x7b\x08\x8c\xd9\xcc\x59\xd9\x9d\xeb\xd8\x8a\x19\xa7\xfd\x88\xaf\x2b\x0e\x08\x59\x98\x4b\xf5\x4d\x9b\x98\xb7\x11\x82\xf0\x86\x4d\xcc\x8b\x10\xa5\x5c\xcd\x94\xa5\xfc\x78\x90\x5f\x2c\xed\xe7\x03\x7a\x62\xb1\x4f\x4d\x04\xa9\x93\x26\x7a\x62\xf1\xfb\x1e\x82\xf4\x23\x0f\x8d\x47\xf4\x14\x1c\xd1\x83\xd9\xd1\x38\x89\x76\xd2\xa7\xab\x24\xce\x47\x36\x31\x1f\x72\x34\xea\x91\x6c\xd8\xc9\x48\x32\x8a\x19\x7d\xac\xbc\xf6\x4c\xaa\x7a\x8b\x6a\x08\x22\x3d\x78\x94\x21\x05\x16\xf3\x80\xf1\x54\xec\x43\xcc\x6f\x81\x6e\x20\x2f\x92\x9f\xbd\x11\xf8\xd0\x20\x78\xbe\x0d\xd8\xa7\x50\x9a\x7d\xad\x31\xf8\xe7\x35\xd8\x35\x92\xad\xc2\xe3\x2a\x19\xef\x63\x11\xbb\x47\x46\x3d\x50\xad\x2b\x5a\x2b\x7b\x2a\x5a\x2b\x9b\x14\xad\x15\x65\x24\x88\x69\x92\xdb\xa4\x68\x29\x6f\xf6\xab\xf7\x8b\x5f\x2f\x4f\x4f\xea\x75\xf6\xdb\x8d\x02\xb7\x25\x03\x3a\x31\xec\x20\xe1\x6e\xcd\x7e\x31\x69\x79\x62\xee\xb9\xbd\xd5\xa5\x8b\xb8\xea\x3c\x55\xf6\x03\xe1\xb8\x8d\xb0\x79\x45\xce\x4d\xbb\xbb\xb0\x13\xe8\x05\x45\x4c\x46\x8d\xd2\x53\xda\x7e\x24\x37\xe8\x51\xd9\x03\x1d\x8f\x0d\xb8\x6f\x95\x01\xe7\x78\x6c\xa8\x7d\xab\x0c\x35\x18\xb6\xd8\x9b\x89\xe6\x85\x66\x15\x61\x73\xb0\xaf\x1b\x88\xb0\x11\xe7\x19\xcb\x0c\x46\xfd\xac\x58\x20\x14\x02\x12\x48\xe4\xe7\xb3\x6b\xf3\x94\x2e\x3a\x15\xdc\xdd\xc5\x20\xc8\x83\xa9\xba\x57\x97\x90\xdd\x5d\x96\xbe\xdb\x5b\xcc\x7f\x46\xd9\x86\x9e\xc0\x86\x1e\x96\x91\x60\xce\x10\x9f\x9c\x5f\xa1\x14\xa7\x90\x1b\xe4\xd4\xe9\x41\xae\x43\xff\x55\x17\x78\x19\x05\x27\x85\xfd\xc5\xa2\x4f\x3c\xac\xd6\x9d\x56\x76\x34\x09\x38\x79\x32\x4f\x3c\xdb\x52\xa4\x00\x5f\x3e\x76\x66\xf3\xf4\xf6\xad\xee\x71\xba\xe1\x41\xfb\x65\x8f\x04\xe9\xe3\x6b\x64\x78\x7f\x2a\x45\x55\x36\x4f\xd6\x16\x31\xcf\x68\xbd\xae\xaf\x02\xf7\x59\xdf\x90\xf2\x28\x29\xe6\x10\x16\x7e\x50\xf7\x7a\xc9\x3c\x8a\x13\x0f\xcc\x81\x99\xf7\x71\xbd\x2e\x30\x65\xaa\x42\xfa\xb0\x62\x35\x31\xe1\xe6\xb8\xb7\x30\x2b\x1b\x0e\xa3\xee\x13\x2c\x3a\xf6\xcb\x2e\xb5\x2d\x18\xcb\xf6\x55\x8f\x4d\x99\x96\x1c\xc4\x57\x3d\xf5\x15\x74\x96\x2c\xf8\x80\x62\xb9\x05\xec\x39\xc7\x40\xd8\xc4\x5c\xca\x89\x4d\xd5\x94\xf9\x48\x31\x4c\xb5\x1c\x09\x61\x93\x37\x4c\xdb\x42\x12\x6c\x05\x76\x93\x23\x2e\xc5\xcd\xd6\x33\xb5\xcf\x67\xea\x49\xc3\x9b\xca\xe6\x4c\xbc\x1a\xc3\x9e\xe1\xe3\x55\x6b\x5e\xfc\xe7\xfc\x15\xa9\x4d\xae\x1a\x0f\x82\x1a\x6b\x09\x8c\x3d\x73\x77\x97\xed\xa0\xcf\x28\x0b\xb3\x76\x62\x7c\x65\xe1\x0c\xc2\x27\x1e\x0b\x9f\xc0\x2e\xfb\x3e\x66\x61\xd6\x00\x84\xad\xc5\xd8\x33\x93\x01\x0b\x7f\xdb\x67\xe1\x6f\xfb\x2c\x7c\x0d\xe1\xeb\x7d\xe3\x85\x95\xd0\xee\x09\xe1\xcf\x63\x41\x1f\xfb\x18\xe3\xa0\xb5\x6a\xd9\x9c\x26\x5f\x12\x17\xb4\x56\x9b\xb6\xcf\xc6\x3f\x0e\xcc\x5b\x26\x15\xb0\x71\x8f\x03\xf3\x22\x64\xe1\xa7\x26\x0b\x3f\x35\x59\x78\x02\xe1\x09\x84\xf7\x3d\x16\xde\xf7\x58\xf8\x08\xc2\x47\x10\x7e\xc8\x59\x39\xe6\x43\x3e\xf3\xc5\x2b\x9e\x87\x00\x34\xf9\x1f\x02\xf4\xb7\x44\x6c\x4f\x58\xde\xed\x09\x43\x74\xd5\x67\xe1\x2b\x78\xa0\x30\x09\xa0\xe0\x40\xd1\xde\x87\xca\xe5\x09\x1a\x27\x58\xfb\x4a\x92\xda\x67\xea\xd5\x8e\x49\x56\xdb\x1e\x66\xb5\x63\x32\xa9\x7d\x1d\x27\xb5\xaf\xe3\x41\x6d\x7b\x1c\xd5\x2e\xe9\xb0\x76\xea\xe7\xb5\x93\xf4\xa1\xb6\x47\x7d\xcd\x1c\x0d\x07\x71\xae\x6b\x35\xcd\x40\x24\x24\xb8\xab\x5d\x8e\x93\x80\x4c\x34\xa4\x1d\xa7\x22\xd0\x19\xd3\x11\x84\xc2\x08\x79\x11\xd2\x3e\x67\x31\x7c\x5e\x85\xae\xb3\x92\x27\xf8\xa5\x7d\xb1\x7d\x69\x77\xb5\x9d\x5d\x0d\x69\xdb\x7b\x9a\x8b\xda\x17\xdb\x27\xdb\xc7\x6d\x88\xa4\x61\x9a\xd1\xda\x6e\x2f\x8b\x47\x39\x4b\x4f\x92\xb4\xb6\x97\xde\xc5\x49\xac\xb9\xe8\x64\xfb\xe2\xe2\xf4\xfa\xf8\xf4\xa4\xb3\xcf\x80\xbf\x6a\x68\x3b\x44\x5f\x42\x94\xc2\x2f\xfb\x66\x7f\x69\x88\xce\x43\x74\x12\xa2\xa3\x10\x69\x0c\xff\x65\x67\xfb\x64\x6f\xfb\xe8\xf4\xa4\xfd\x3f\x22\x28\x33\x90\x64\x4c\xb2\x89\x86\x76\x42\xa4\x1d\x93\xcc\xef\x31\x1a\x87\x59\x3c\x60\x1c\x80\xea\x7f\x1d\x27\x14\xfe\x0d\xd8\xd7\xf6\x38\x1a\xb3\x8a\x7c\x0b\x91\x76\xea\xe7\xa9\x47\x33\x0d\x1d\x87\x68\x12\xaa\x64\xfd\xff\x84\x7f\xff\xf4\xa2\x23\x50\xff\x3f\xb5\x74\x49\xe8\xff\x19\xca\x95\xeb\x76\xfb\x70\x6f\xfb\x07\xab\xf4\xbf\xea\x42\x0a\x31\xff\x3b\x0a\x56\x8b\x22\x37\xcb\x5c\x3b\x4e\x93\x5a\x67\x4c\x6b\xd7\x34\xa8\x75\x7a\xe3\xda\xe7\x2c\xae\x5d\x92\xfc\x57\x6c\xf8\xf7\x08\x78\xef\x2b\xc9\x3e\x87\x5e\x77\x1d\x22\x1a\xb1\xdf\x6d\xd6\xed\x16\x7b\xeb\xdf\xc2\x33\x62\xce\xaf\xb6\x2f\x3a\xed\x0b\xc6\x8b\xf3\xa6\x86\xb4\xf3\x0d\xf6\xb3\xc9\x7e\xde\x6b\x2e\x52\x92\x9b\xa3\xbc\x76\x3f\x26\x59\xce\x7a\x8a\xb6\x91\x04\xca\xd7\x66\xa6\x7e\xbd\xcf\x7b\xc5\x97\x8b\xb6\x8f\xcf\x8e\x59\xfe\xed\x63\x0d\x69\x67\xc7\x9a\x8b\xf6\xb6\x3b\xed\xcf\xa7\x17\xc7\xdb\x1d\x16\xdf\x6e\xb7\xdb\xa8\x76\x7c\x7c\x7c\x5c\x0b\x50\x0d\xda\xa2\x1a\x16\xc1\x15\xed\x78\x3d\x58\x9f\x4c\x34\x17\x75\x0e\x8e\x15\x04\x3d\xfb\xee\xce\x1e\x8d\x6a\xa4\xf6\xfc\xfc\xfc\xac\x21\x35\x42\xfd\xd2\xd0\x59\xc4\x0b\xaf\xe6\x7f\x69\xce\x6a\x6f\x49\xfe\xb6\xf6\x62\xcd\x34\xb4\xe4\x13\xcd\x07\x5d\xf4\xf9\xe0\xe2\xb2\xb3\xb7\xfd\xe3\xf4\x33\xe3\xb2\xfd\x01\xb1\x7f\xed\x93\xbd\x8b\xed\x93\x2f\x6d\xbb\xfb\x3b\xfa\x20\x60\x58\xfc\xee\x55\xe7\xf4\xf3\xe7\xbd\xed\x1f\xf6\xef\x8a\xd8\xf0\x20\x16\x5c\xe1\x50\xc6\x13\xce\x64\x9a\xb6\x14\x03\x56\x31\xf9\xed\xfd\x74\x6a\x61\x4c\x7e\x6b\x5a\x56\xbd\xce\x63\x2c\xab\xb5\xf1\xd1\xde\xf8\xd3\x01\xf0\xdf\xb9\xbf\x96\x8f\xfc\x5f\xd3\xe2\xff\x37\x25\x92\x4d\x69\xaa\xab\xb6\xa9\x98\xa6\xf6\x42\x32\xe7\xbc\x8c\xad\xd4\x7b\x24\xa7\xfa\x43\xac\xab\xb7\xce\x5f\x99\xb4\x0b\xaa\xbc\x2c\xa0\x98\x58\x2f\x0e\x29\xee\x55\x1b\x94\x1e\xf6\x39\xea\xe9\xd4\x42\xfe\x74\xda\x34\xd0\x93\xd8\xf1\xc2\x97\x61\x27\x4b\xc0\x39\x72\x44\xba\xfb\x01\xff\xdf\xf6\x5c\xdd\x28\xb3\xca\x88\xc2\x24\x25\x7f\x02\x5c\xd2\x2b\x0c\xd1\x80\x47\xec\xfd\x74\x9c\x8d\x74\xab\x12\x77\x1c\x27\xe3\x9c\xce\xc7\x5e\x52\x3f\x4d\x82\x45\xd8\xc1\x20\x1e\x15\x49\xaa\x20\x22\xea\xc6\x6a\xad\x50\x20\x7c\x94\xf3\x3b\xb4\xa6\x65\x7d\x22\xf5\xba\xd7\x7d\x0c\x5c\xdd\xe3\x15\x5b\x6b\xfe\x69\x59\xca\x31\xd4\x35\x7e\x14\xa7\x34\xe7\x94\xe0\x3c\x31\xab\x9d\xc9\xb9\x36\x2f\x94\xf8\x4a\x07\x5a\xd8\xc4\xf0\x8d\x09\xa3\xe5\x51\xda\x7c\xf3\xd8\x9e\x01\x30\xb3\xcf\x73\x4a\x1c\xc2\x11\xb2\xcf\x8b\xd2\xe1\x1d\x81\xf3\x98\x88\xe6\x9f\xc7\x83\xc1\x0f\x4a\x96\x59\x6f\x12\x18\x45\xeb\x73\xf0\x5f\x80\x56\xe0\x8e\xd3\xe4\xf5\x9b\x96\xdc\xe3\x8d\x2d\x60\x19\x23\x7f\x01\x0a\xcd\x3f\x73\x26\xbf\x70\x06\x9e\x7b\x5d\xea\x73\x67\xe0\x02\xe3\xe4\x17\x08\x13\x85\xce\xab\xce\xee\x3f\xe0\xc0\x31\x27\x61\x45\x66\xf9\xbb\xda\xb5\xab\x25\xfc\x4d\x05\x4f\x82\x0a\x34\xf4\xe1\x5f\x80\xc7\xb4\x02\x2e\xba\xf7\x2f\x32\xf4\x94\x0c\x9d\xf8\x8e\x3e\xa7\x09\xe5\xc6\x9d\x7f\x91\xe9\x5e\x66\xaa\x80\xc9\xfd\x96\x3a\x08\x5f\x1b\xc1\x22\xf3\x22\x7b\x4b\x24\x30\x50\x88\x84\x9c\xe3\xaa\x02\x36\x56\xc1\xaa\xdc\x54\xa0\x3e\xab\x50\xac\xa2\x4b\xa1\x4e\x7d\x05\x6a\x69\xf3\x97\xc0\x73\x20\x90\x6f\x45\x66\x7c\x9d\xdc\x9f\x41\xb5\x88\xd7\x28\x56\x92\x05\xfc\xbc\xb3\x7f\xb6\xdd\x31\x27\x94\x64\xa3\xe9\x94\x98\x77\xac\xc4\x51\xc5\x93\x3c\xb0\xbc\x21\x93\x1a\xcd\x8d\x77\x02\x5e\x58\x29\xec\x7e\x66\x6d\xd3\x00\xeb\x63\xde\x7a\x73\xc3\x40\x1e\xf6\x7e\x6b\x6e\x38\xd6\x27\x38\x25\x6a\xe0\xe6\x86\x51\x6a\xb1\xc4\x89\xfe\x90\xc0\x95\x12\x37\x9d\xc5\x5b\x92\xfb\xba\x67\xec\x6d\x8a\xf0\x23\x68\x84\xf1\xf0\x18\x1e\x6a\x96\x30\x81\x31\x23\x66\x40\x26\xa3\xc2\xfb\x3b\x54\x50\x2f\x42\x25\x5d\xa8\xac\x83\x52\x1e\x6a\x6e\x18\x06\x1f\xd0\x8d\x8f\x1f\xde\xb7\x7f\x7f\xc7\xf1\x09\x18\x4e\x07\x2a\xe8\x10\xfd\x4f\xc4\x40\x57\xe1\x28\x15\xf8\xd7\x57\x15\xee\x17\xfe\x71\xc9\x99\x43\xb7\x9c\xd4\xd0\x41\xac\x2b\xec\x06\xfd\x2a\x19\xc5\x49\xde\x30\x5c\xf1\xa4\xa5\x71\x3a\x7b\xcd\xf9\xfe\xaa\xbe\x2a\x4c\xa5\xf3\xea\xaf\x62\xc2\x03\x22\x12\xb0\xb3\x48\x08\x88\x48\xc0\xcf\x22\xc5\xa8\x32\x9c\xed\x5f\xcc\x84\xe4\x91\x3b\xc5\x2d\x96\xad\x27\x79\xcc\x21\x11\xc1\xf6\xb6\xe8\x7b\x7c\xc1\x24\xc5\xbc\xd2\x90\xac\xda\xf2\xc0\xd3\x94\x01\x86\xdf\xc9\x60\x4c\x4f\xc3\x5f\xcc\x16\x21\x9f\xc2\xca\xb7\x5d\xc9\xdc\xf5\x35\xb4\xe6\x9a\x9c\xa6\x95\xc7\x55\xc9\xdc\xad\x97\xb8\x50\x52\xaf\xbf\xd8\x7e\xbf\xdc\xf8\x0b\x56\xca\x77\xa3\xbd\x98\x9b\x25\xe9\x49\xb3\x6a\xfe\x2a\x0e\x4a\x87\x7d\xbc\x67\xdf\x01\x10\x65\xff\x39\x50\xb0\x8a\xe9\x82\x57\x3f\x5f\x08\x61\xb7\x3d\x9b\x81\xd4\xeb\xb4\x78\xa4\x8a\xb1\xa8\x51\xe9\x58\x81\x7b\x87\x01\x93\x26\xcf\xbe\x0b\x3e\x08\xf5\x55\x4f\x84\xa7\xd3\x55\x56\xb3\x6e\xe8\x22\xaf\x1b\xba\x86\x51\x16\x26\x11\x80\x19\x02\x0f\x9e\x90\x43\xa6\xc8\x00\xcb\x3a\x3c\x58\x82\x17\xd5\x05\xd2\xb2\xc8\x86\x12\xbf\xba\xab\xf0\xc2\xad\x8a\xd6\xc7\x96\xbc\x05\x6b\x34\xe0\x92\x96\x53\x01\xd6\xb0\x7d\xf7\x55\xac\xc7\x91\x5d\x8d\x68\xf7\x84\x8b\x40\xfe\xef\xb1\x48\x6f\x3a\x01\x0d\xc9\x78\x90\xdb\x85\xfd\x8e\x76\x96\xa5\x59\x0d\x0c\xd7\xd4\xb8\xdf\xac\x38\x89\x6a\x5a\x83\x34\x72\xda\xf0\x1a\x9a\x5d\x1b\x27\xf4\x69\x48\xfd\x9c\x06\xe0\x39\xa5\x96\x86\xb5\xd4\xbb\x6d\xd6\xb4\xc6\x8a\x6f\x38\x8a\xd7\xa6\x6d\x39\xe7\x41\x7b\xc9\x79\x4e\xce\x1b\x8e\x98\xbb\x79\x67\x9b\x7b\xc5\x2a\x3a\x82\xb8\x97\xbb\xed\x81\xbd\xad\x2c\x12\x2e\xdf\x76\x7c\xc5\x93\x1a\x3f\xc3\x85\xb3\x91\x2c\x6a\x75\x5d\x5b\xb8\x99\xf5\x78\x8b\xfa\x5d\xcf\xc5\x8c\x92\xae\x62\x86\xcc\x9f\x2d\x39\x61\xdd\x29\xe7\xf2\x4e\x8c\xc9\x74\xda\x7d\x99\x29\x2a\x39\xbb\xa2\x6b\xfb\xb7\x3a\x31\x3b\x31\xf2\x2a\x0e\x10\x83\x70\xde\x9d\x17\xef\x0f\x49\xac\x43\x5b\x81\xb1\x79\xb7\x05\x60\x45\x03\xda\x04\x5e\xaf\x77\x7d\xa5\x18\x2a\x11\x2d\x71\x58\x9b\x08\xd3\x1d\x7d\x30\x6d\x08\xd7\xed\xe2\x92\xfc\x65\x86\x20\x23\x77\x47\x6b\xd8\xc5\x61\x2c\x07\x02\x95\x82\xa2\x88\xbd\xa4\xa2\x3a\x7c\x11\xf3\x0a\xa9\x13\x1c\x43\xe6\x71\x4d\xa6\xc5\x27\xf3\xed\xf2\x52\xd3\x7e\x01\x8b\x30\xbe\xab\x5f\x51\x70\x76\x34\x9d\x7a\xb1\xe2\x12\xad\xa2\x41\x25\xec\x01\x7b\x5d\xee\x7c\x4e\x5e\xca\x51\x17\xfc\x19\xd2\xc2\x64\x13\xbf\xf4\x00\xfb\x3c\xf9\x6c\xe6\x61\x32\xab\xdc\x39\x7b\xf5\x7a\x06\x2e\x45\x7d\xdd\x33\x6c\x6f\xb6\xb2\xc3\x24\x70\xf3\x72\xc1\x9f\x4a\x49\x06\x18\xee\xa0\xd8\x72\xe8\x96\x68\x5f\x46\x13\x65\x34\xe5\xb6\xea\x77\xa5\x13\x77\xc1\xe5\x1d\x41\x11\x86\xd3\xc9\x34\xd6\x43\xc3\x08\x70\x3b\xd1\x03\x14\xa2\x48\x71\x43\x02\xce\x7c\xb1\xe5\xf4\xb7\x42\x3e\x44\xfb\xd2\x60\x1a\x07\xee\xf6\x5d\x06\x5f\xd4\x74\x60\xbc\x04\x58\xa9\x18\x27\x6b\x36\x2b\x00\x82\xd2\x14\x64\x50\x1a\x0a\xf2\xc1\x4f\x6b\xb0\xe0\xd2\x41\x39\xa1\xf5\x8b\x1b\xfc\xa8\xaf\xfb\x86\x5d\x71\xe7\x4c\x78\x6d\xd7\x9a\x6c\x57\x43\x1d\xba\xb6\x56\xf8\x5b\x45\x11\x4f\xa5\x2e\xea\x63\x0f\x0d\x70\xe0\xa4\xb1\xde\x67\x53\x5f\x1f\x77\xfb\x6e\x39\x3d\x26\xb8\x5f\xe0\x48\x9c\xb5\xb5\x84\xe3\x18\xb2\xaa\x46\xa8\xdf\x4d\x5c\x34\x30\xe0\xfa\xf6\xb6\xaf\x87\x68\x68\xcc\xca\xa3\xc6\x72\xcf\xf5\x25\x29\x75\x05\x17\x28\x4e\x85\x71\x51\x0f\xc3\x48\x2d\x1b\xaf\x52\x81\xc0\x09\xd6\xd6\x8c\xb2\x76\x9e\x52\xb5\xb5\x35\x2a\xab\xc6\xba\x28\xcb\x06\x1e\x05\xa8\xcb\x49\xbb\xbe\x03\x53\x3a\x4b\x4c\x98\xec\xcb\x99\x4a\x2c\x5a\x15\x0d\x05\x45\xfb\x05\xe3\xc7\x48\xf5\xce\x54\xea\xdc\x97\x8b\x1b\x01\x9f\x23\xa0\xe1\x8d\xf1\x71\x0f\x8c\x8e\x63\xfc\x9d\x2a\xb1\x5f\xa2\xd6\x6a\x73\x4e\x49\xe2\x20\x29\xb5\xb5\xbf\x26\x85\x0e\x83\x74\x0c\x57\x14\xea\xc7\xa0\x8a\xad\xfb\x78\xb9\x63\xb9\xaf\x73\x4b\xb5\x79\xa9\x7b\x60\x9c\x13\xed\x27\xaa\x79\xf5\x7f\x5c\xe3\x8e\x5a\xe1\xe3\x58\xf1\x63\x54\xbc\x69\x26\x3a\x31\x84\x7d\x16\xa5\xb5\x8f\x96\xe8\xa1\xb5\xfa\x70\x64\xd0\x89\x75\x82\x0e\x13\x3e\x4f\xcd\x31\x22\x0c\xc9\xaf\x49\xbb\x8f\xe7\x7c\x64\x71\xe5\xf6\x65\xc4\x94\x6a\xa3\x0a\x77\x4f\xfe\x11\x77\xad\x65\xcc\x8d\xca\x43\x03\x82\x15\xd6\x86\x21\xf9\x9f\xf0\x9d\xbc\xda\x58\x87\x6a\x63\x9d\x0a\x05\x09\x68\xb4\x05\xb7\x79\xd6\x16\x26\x2d\x32\xc7\xc5\xb3\x64\x29\xa1\xa7\xc9\xbf\xa1\x53\xd1\xa1\x17\x14\x9c\x2e\xa1\xa0\x55\xdc\x12\xce\xd1\x70\xb1\x9c\x86\xf3\x7f\x45\x43\xa9\x42\xb9\xac\x3b\x15\x9d\x71\xae\xe8\x4e\x39\xd3\x14\x58\x4f\xcb\x51\x0a\xc4\xf8\xe8\x52\x65\xf2\xd5\xab\x6d\x51\x01\xfb\x56\x31\x6a\x0c\x44\x81\xf7\x6f\x7f\xbe\x9b\xbe\x89\x75\x6f\x3a\xed\xba\xa8\x7c\x6a\xe3\x3b\x8a\xa7\xb6\xab\x3b\xdd\x97\xb6\x59\x83\x4a\xc5\x14\x11\xea\x7a\xde\x81\x99\x24\xfd\x9b\x4a\xd3\xf7\xc5\xdb\x3a\x0e\x17\x2c\x53\x09\x85\x1a\xf8\x46\xe5\x5a\xee\xc7\xab\x95\xaf\x14\xd4\x0b\x15\xf3\x7f\xbc\x51\xdf\xf8\xdc\xf6\x2f\x8a\x7f\x31\x06\xc0\xae\xaf\x87\xbb\xee\x32\x71\x22\x0e\xe7\x6f\xb6\xe7\x26\x0a\xde\xc8\x4b\x27\x8b\x9f\xf3\xad\x51\x5e\x9e\x7b\x7d\xa8\x66\xcb\x9f\xcb\xf2\xe6\x75\x66\x7d\xd7\x7f\x26\xbc\x32\x7e\xc5\x82\x5c\xba\xb4\x11\x00\xf0\x95\x2c\x5e\xba\xd8\xff\xc0\xc6\xc7\x5c\x17\xac\x9c\x48\xa6\xaa\xb9\x2b\x1f\x14\x18\xa4\x86\x5e\xb1\xda\xab\xed\x09\xc7\xaf\xe0\x4b\x90\x6b\x7b\x90\x42\x7f\xe4\x65\x86\x7c\xcc\xda\x99\x2b\x4b\x15\x17\xb2\xcf\x04\x0a\x75\x7c\xcc\x06\xb4\xa9\x28\x85\x28\x40\xba\x67\xee\x52\x0c\x50\x80\x02\xb4\xa4\x8a\xd4\xa7\x02\x05\x9b\x0b\x4c\x45\x69\xa4\x8a\x62\x4c\x70\x59\x50\x45\x8d\xa4\x0a\xf7\x3d\xe2\x70\x47\x25\x5c\xa1\x58\xa2\x40\xf6\x19\x1b\x21\x83\x7f\xce\x33\xb0\xc9\xd0\xcc\x9e\xaa\xd8\xbe\xc4\x6a\xe2\x5c\x51\xfb\x90\xa8\x83\x43\x52\xa1\x93\x62\x14\xfa\x8b\x26\xd7\x01\x9a\xfb\xde\x28\xbf\x9f\x94\xb4\x89\x12\x7e\x52\x60\x26\x1b\x70\x69\xcb\xd8\x0f\x1a\x21\x8c\x0a\x8e\xd7\x40\x70\x2f\x5c\xc6\x6c\x18\x68\xc5\x37\x7f\x3c\x70\x06\x49\x45\x23\x06\xf6\xb3\x1a\xb7\xc1\xe2\x9e\x9a\x40\x01\x82\x4b\x64\x50\x37\x82\x2b\x64\x56\x3a\x82\x0b\x64\x56\x36\x82\xeb\x63\x26\xcb\x98\xaf\x2a\x1f\x19\xc8\x33\xdb\x3d\xec\x2b\x03\x91\xc9\xed\xe2\x72\x9f\x18\x0e\x74\x2d\xd6\xa9\xcc\x53\xaa\xdf\x27\xa0\x3d\x64\x20\x62\xee\xf6\xd8\xd7\x19\x35\x0c\x27\x29\x40\x7a\x01\x8b\xcc\xa8\x81\x40\xfd\xe2\x3e\x31\xef\x63\xd5\x57\xa9\x62\x45\x31\x55\x07\xea\xcb\x0c\x05\xbc\x73\x7d\x66\xfb\x15\xa7\x50\x26\xfd\x21\xac\x1e\x06\xc0\x82\xee\x69\xe0\x2a\x89\x60\x0a\x10\x12\x81\x8d\x64\x9c\x91\x5d\xc6\xca\x0a\x06\xdd\x37\x07\x3e\xe6\x46\x64\x02\xde\x47\x19\x20\xef\xa1\x86\x6f\x9e\x3f\x12\x1c\xf0\xc4\x4b\x18\x03\x69\x92\x9f\x90\x3b\xca\xd2\x88\x87\x03\x47\xe4\xea\x4e\xd8\x0e\xbb\x5e\xff\x5c\x50\xc4\x18\xdb\x3d\xa8\x50\x74\xeb\xa9\x89\x66\x9c\x93\x41\xec\x57\x89\xe9\x00\x31\x02\x60\x9c\x04\x34\x1b\xc4\x09\xad\xc2\x5c\x52\x1c\x2c\x5b\xf2\xc2\xf9\x89\x67\xe9\x34\x20\xd2\x18\x87\x2b\xdb\xbc\x5b\x29\xac\x28\x33\x9d\x40\xb0\x74\x5d\x80\x26\x9a\x5b\x17\xfa\xd5\xcb\x25\x91\x5d\x98\x7f\x71\xa4\xba\x5f\x9a\xdd\x91\xdc\xf6\xbb\x27\x9e\x8b\xe2\x24\xa7\xd9\x03\x19\xd8\x7e\xf7\x8b\xe7\x2a\x4b\xd9\xa0\x8a\x0a\xe6\xcc\x80\x0d\x54\x55\x14\x0b\x0c\x1f\x07\x85\x1e\x48\xc0\x67\x74\x54\xf0\x6a\x10\x10\x3d\x30\x24\x8a\x00\x64\x7f\x44\x71\xe0\xf0\x67\x4e\xfe\x56\xc0\x9f\x5e\x52\x1c\x08\xb3\x36\xbe\xd1\xe0\x41\xbf\xd1\x44\x90\xc1\x5f\x6b\xc2\x3b\x43\xf2\xee\x38\xd6\xa9\xb1\xde\xb4\xac\x59\x39\x4b\x14\x8f\x98\x14\xf9\x56\x69\x91\xbb\x4a\x25\x50\x80\x23\xc6\xb4\x03\xaf\x2a\x50\x96\x1b\xb9\xbf\x15\x28\x7f\xb9\xb4\x0c\x42\x52\xae\x2d\x2b\xb0\x0f\x0b\x09\x7e\x69\x4f\x88\xad\xdd\x8d\x07\x79\x3c\x1c\x50\x0d\xf9\xcf\xc4\xde\xe9\xcd\x50\x2f\xc5\x2f\x27\xa7\x27\x6d\xfb\x1c\x1d\x8d\x89\x7d\x18\xa1\xce\x98\xd8\xcf\x3d\x74\x31\xb1\x9f\xa2\x19\x4a\x59\xde\x5f\x01\x0c\x01\xe0\xca\xee\x44\xe8\xf4\xca\xbe\x90\xf1\xe5\x9e\xf3\x3e\x24\xd2\x4b\xd8\x24\xc1\xab\x4d\xa1\x61\xfb\x1e\x77\xdd\x59\x14\xeb\xf7\x4c\x02\x28\x75\x90\xc2\x39\x95\x74\xdf\xf4\xc9\x60\xe0\x11\xbf\xef\x94\xc1\x79\xc5\x3c\x0f\x07\xdd\x4b\xdf\x15\xa7\xba\x85\x87\x56\xc7\xda\x22\x66\xf6\xbe\xfb\xd5\x6d\xe9\x10\x18\x79\xae\x6e\x80\xc6\x1c\xa3\xc4\x32\x6c\x22\x48\x2a\xa6\x35\xc7\xc3\xdf\xf5\x28\x4d\xa3\x01\xed\x0e\xd8\x3e\x30\x36\xf9\x17\xfa\xe9\x93\xc2\x18\x15\xcb\x66\x00\xc6\x5d\x38\xf6\xe6\x66\x7a\x39\x52\xe4\x55\xce\x36\xe3\xf9\xb6\xf2\xcc\x4b\xfd\x5b\xaf\x10\xac\xa7\x53\xb0\xff\xd8\xcd\xdc\xe9\xd4\x9f\x4e\xdf\x5b\x8a\x81\xc0\xdb\x65\x79\x2f\xa2\x85\xbc\xdb\x3c\xef\x86\x9a\xb7\x9f\x2e\x0c\x63\xae\x11\xea\x75\x33\x17\x89\x6d\xf3\x6e\xb1\x7b\x96\xa6\x15\x0d\x24\xf6\x70\x1e\xd8\xd3\xdd\x14\x56\xa0\x56\x83\xe9\xd4\xdb\xc2\x81\x61\x4c\xa7\x04\x32\x80\xb1\x74\xb4\x98\xde\xf2\xec\xf9\x6a\x0c\x0a\x52\x10\x5d\x20\x66\xfb\x9f\x13\xe3\x7d\xc2\x3a\x9d\x4e\x37\x2d\xe3\x15\x8a\xde\xb0\x06\x5b\x0e\xc4\xc9\xaa\x70\x68\xa4\x88\xa5\x38\x0f\x09\xf2\xb9\x3b\x71\x58\x68\x47\x8e\x0f\xb7\xed\x3e\x3c\x06\xd7\x7d\xcc\x04\x80\x7a\x9d\x2d\x3d\x46\xab\x4b\x5c\xdb\x5b\xba\xe3\xb9\x4b\x8b\x1b\x59\x1a\xeb\x77\xfe\x2b\xc2\x2d\xa4\xde\xfa\x85\xfe\x23\x77\xec\x3d\x24\x85\xd5\x66\x1a\xeb\x69\x99\xec\x81\x1c\xfc\x40\x94\x13\x83\xc6\x3d\x21\x0d\x45\x1c\x1e\xc3\x20\xe3\x8f\x14\x28\xb7\x77\x7a\x1e\x19\xc5\x33\x1e\x22\x23\xbf\x45\x06\x37\xf4\x25\xbe\x1f\xf8\xb7\xcf\xbe\x2f\x3d\xc8\xe4\x10\x30\xfa\x0a\x4f\x8a\xe4\x24\x5f\x62\xb4\x94\x53\xc7\x24\xe5\xfb\x3b\x56\xeb\x06\x51\x1e\x65\x08\xf8\x37\x04\xec\x2c\x5a\x8e\xcf\x8f\xf3\xfc\x46\x83\x1f\x75\x83\x4b\xc5\xae\xef\x76\xbf\x07\xae\x7e\x15\x19\xd5\x2f\x5c\x6e\xdf\x1d\x4f\x12\xe6\xf5\x0c\xc7\x33\x7b\x19\x0d\x31\x71\x3c\x33\xa3\x03\x7c\xee\x13\x07\xac\x03\x74\x18\xab\x80\x03\xdd\x7b\x36\x1e\xe1\x30\x38\x4d\x71\xd7\x55\x4c\x52\x3e\xf0\xe6\x2e\x85\x6d\xce\xaf\x47\x96\x4d\x32\x29\x4d\x1d\x9e\xed\xe7\xdc\xbb\x38\xb8\x4f\xe1\xef\x87\xaa\x67\xde\x76\xcd\x27\x49\x92\xe6\xb5\x41\x4a\x82\xda\x31\x19\x8e\x6a\xdb\x67\x07\xa6\x66\x38\x33\xc0\xdc\x22\xba\x61\xeb\x69\x2a\xfc\xf0\x37\x31\x4e\x53\xf9\xd0\xff\xc8\x27\xe8\x89\x01\xb1\xaf\x06\x0e\x19\xb7\xca\xa9\x47\x1f\xfb\x04\xf9\x21\x7a\x91\x93\x9e\xed\xa1\x34\xef\xd1\xec\xaf\x21\xc9\xc8\xdd\x88\x09\xee\xea\xe6\x01\x30\x89\x7a\x70\x7b\x86\xd2\x82\xe1\xea\x36\x3f\x49\x8f\x43\x5d\xe7\xc6\x03\x9b\xd2\x78\xe0\x2a\xbe\x8e\xca\x0b\x01\x82\xc1\x32\xa1\x9a\x87\xb7\xe7\xfa\x7f\xc9\x2d\x79\xba\x11\x53\x21\x19\xc6\xa3\x1b\xd3\x4f\xef\x84\x81\xd6\xa2\x5b\xae\x4b\x88\x6a\xea\x74\xea\xcd\x96\x78\x47\x07\xfe\x14\x86\x19\x68\xac\xf7\xfd\x8a\x19\xc3\x61\x5a\x0e\xcf\x44\xd8\x50\x96\xb3\xb1\xa3\xfb\xb0\x74\x77\xcf\xb9\xe7\x99\xf3\xc0\x35\x8f\x52\x9f\x0c\xa8\x51\xaf\xfb\xe6\x90\xf8\x7d\x12\xd1\x91\x1a\xee\x12\x97\xbb\x29\x30\x07\x1c\x70\xc9\xa6\xf2\xbe\x22\x6f\xf2\xcb\x04\x0f\xeb\x9b\xcd\x77\x5e\xe3\x88\xad\xc9\xc6\x6f\x1f\xfe\x68\x5a\x1f\x3f\x7e\x78\xbf\xfc\xbe\x88\x74\xc7\xbe\x8b\xf1\x1e\xc9\xa9\xa1\x64\xdc\x89\x94\x9c\xc8\xc3\xac\x1c\x7e\x0b\x86\xc4\xea\xf1\xe2\x63\x02\xef\x15\xef\x6e\x75\x5f\xbe\xd5\xee\xf7\x75\xdf\xa8\xbe\xb9\x13\x79\x03\x17\xdd\xa7\x7a\x80\x3c\xc3\x98\xc1\xd1\x70\x71\x33\xc4\x5d\x5d\x5b\x4e\xc0\xaf\x80\x82\x46\xa3\x9a\x47\x9c\x7d\x04\x06\x3c\x5e\xe5\x79\xe5\x75\x8e\x42\x71\x79\x5e\x57\x12\x3e\x5b\x64\x58\x96\x4a\xb3\x17\xc1\x40\x35\x79\x91\x87\x4b\xe5\xf9\x91\x98\x30\xbe\xc7\x7a\x27\xd6\xbb\x03\x9f\x34\x08\x8a\xe1\x97\xb8\x4b\xa5\xcb\x18\xc4\x53\x94\xc5\x0b\xe7\x47\x0b\xee\x8a\xc7\x69\x71\x13\xe3\x89\x57\x41\x49\xaa\x8f\x08\x31\x66\x39\xd1\xc7\x69\xe5\xc9\xb0\xbc\x6f\x24\xe6\x1e\xf8\x68\xe8\x18\xe5\x2b\x6e\x8e\xc2\xf4\xc8\x88\x4e\xa7\x96\x78\xd1\x4d\xcc\x63\xdd\x50\x2f\x24\x48\xf7\xc0\x85\x16\x40\x21\xef\x9e\x21\xa6\x5b\x7e\x2b\xf4\x89\x4d\x3f\xf9\xad\x9e\x4f\xec\xc8\x27\x0e\xe9\x1e\x80\xc5\x49\x0f\x5d\x79\x04\x85\xc6\x4c\xbd\x97\x7d\x10\xfc\x28\x4f\x84\xb9\xf9\xe3\xd1\xbb\x62\xf0\xb4\x2c\x7b\xfd\xbf\xdd\x1b\x17\xd9\x2f\xb3\x9b\xd1\xcd\x78\xc3\xda\xf8\x08\xbf\x7f\xba\x05\x90\xb0\x64\x79\xd3\xd5\x6e\x6e\x6e\xd6\xbd\x30\xc9\xf2\xb1\xbb\x1e\xa1\xcf\x84\x08\x2b\x97\x5a\xf7\xbf\x2c\x2d\xb9\xc9\x54\x0c\x37\x4f\x96\xb5\x76\xf3\x64\x7d\xbc\x79\xb2\xc8\xda\xcd\x53\x33\x74\xdf\x69\xd3\x3c\x1b\xd3\x69\x48\x06\x23\x0a\x73\xc4\x74\xad\x75\x13\x34\xf4\x96\x7d\x63\xde\x04\xef\xc0\xb4\x6a\x97\xb6\xdd\x6e\xe3\x66\xcd\x65\x29\x46\x6b\x3d\x42\xfd\x48\x14\xa4\xb7\xec\xff\x4e\xed\x29\x32\x18\xd8\x3c\xbd\x37\x5d\xa3\xb1\x1e\xa1\x53\xc3\x30\x94\x23\x2d\xfa\x40\x06\xfa\x09\x6d\x10\x30\xb8\xce\x8f\xb6\x3c\xe3\x65\x56\x4c\xb4\x07\x09\xb7\x08\xf2\xf5\xf2\xf4\x44\x58\x78\xb1\x6b\x5a\x83\xa8\x56\x5e\x9e\x53\xb5\xd7\x54\x30\x96\xb7\x6d\x4a\xcf\x02\x45\x84\x49\x48\xa4\x9d\x76\xc3\xcc\xa2\x8a\xd1\xd5\x09\x5f\x2e\xf8\x73\x94\x2b\x4c\x66\x93\x90\x74\x0f\x5d\x33\x8b\x96\xf8\x8c\xec\xba\xce\x76\x2a\xa4\x4f\xe5\x61\xa6\x57\x18\xb8\x54\x6c\x75\x16\x32\x9d\x98\x40\xa4\x88\x23\xe6\x91\x76\xcf\x7e\x0e\xc5\x69\x89\x32\xb2\x3b\x36\x58\x12\x48\x08\xbf\xcb\x03\x6b\x2b\x2d\xcf\xee\xf5\x2a\x50\x8f\x11\x07\xf3\x2a\xb1\xca\x73\x19\x9e\x3c\x97\x8b\x4f\x5d\xf2\xc2\xfd\xa5\x0a\x32\xe3\xaf\x7c\x3d\x43\x0a\xe4\x7c\x25\x67\x30\x8f\x1e\x31\x94\x2b\xa3\x53\x30\xd6\x11\x6e\x05\x4e\x28\x0d\x1f\x50\x03\x51\xec\x75\x43\x17\x41\xb5\x89\x79\x7d\xd5\x62\x3f\xdd\x23\x57\xf7\xc4\x09\x9d\x1e\x1a\x88\x1a\x36\x45\x3e\x03\xbe\xa0\x1c\x77\x3f\x92\xe5\xc3\xe7\x8f\x1e\xdb\x0d\x9f\x42\x69\x21\xbf\x23\xf5\x59\x73\x74\x9f\x7d\x97\x23\x83\xab\x77\x51\x98\x60\x29\x5d\xc5\xc7\x11\xdb\x9d\x31\x0c\x81\x81\x18\x5f\x43\x56\x0c\xa7\x2d\x34\x96\x52\x15\x16\xd4\x04\xf8\x82\xb2\x4d\x1f\x83\xfe\x59\x65\xd9\x71\x64\x57\xa7\xce\xa2\xb3\x5e\x25\xfd\x24\x7d\x4c\xe0\x92\x9b\xf5\xd2\x95\xa2\x7d\x9d\x19\xc8\x25\x3b\x29\x7e\x79\xab\xbd\xb5\xdf\xde\xdc\x68\x6f\x91\x76\x73\xa3\xd9\x71\x84\xb4\x75\xcd\xd6\x6e\x6e\xd6\x35\xa4\xdd\x78\x10\xf4\x58\x30\x84\x60\xc8\x82\x09\x04\x13\x16\xcc\x20\x98\xb1\x60\x0e\xc1\x9c\x05\x9f\xac\x1d\xf8\x18\x5b\x96\xe5\x69\x33\xb4\x1d\x12\xbc\x7e\x33\x0e\xc3\x30\xe4\xf3\x84\xc6\x3f\x34\xa3\xb5\xde\xbd\xb9\xb9\xd1\xc4\xf0\x6f\x86\x37\x4f\x7f\x84\x6b\x3c\xd1\x5d\x8f\xec\xa5\xa9\x4f\x90\xa6\xe8\x6c\xc8\x3d\x2d\x38\xfa\x1c\x53\xc4\x67\xa1\xed\xb0\x2a\x38\xb1\x29\x96\xb5\xd7\x4e\x2a\xa5\xdf\x9d\xb4\x4b\xa4\x93\x2e\x6e\x4f\xd8\x62\x0d\xbf\xeb\x11\xa7\xf9\xe1\x93\xd7\xa2\x0d\xfc\x86\xda\x1b\xbf\x8b\x70\x4e\x88\xfd\xde\xfa\xf3\x03\x68\x2a\xd1\x06\xfe\x5e\x2e\xdc\x80\x09\xd3\x46\x61\x08\x68\x66\xa0\x31\x55\x37\x5f\xbb\xea\xac\x10\x24\xfa\x1e\x6b\xef\x76\xaa\x8a\x4d\x9f\xb9\x94\x91\x2a\x37\x14\x3b\x61\xd5\xfe\x32\xff\x7e\x21\xf8\x8b\x0a\xf5\xca\x24\xb3\x97\xca\x87\xf5\x8a\x73\x8f\x57\xd4\x12\x78\xa2\xa2\x82\xa0\xae\xf5\x8a\x5a\x89\x3c\xbc\xa0\x78\x2f\x95\xb7\xf5\x8e\x1f\xeb\x4c\xd8\x81\x17\xf7\x98\x1a\xc2\x2d\x81\x8f\xc9\x92\x03\x83\x2f\x2a\x1f\xc4\x72\xa1\xe9\x4c\x4a\xb9\xd1\xbb\x37\x01\xba\x19\xb9\xef\x6e\x0c\x43\x5b\x8f\xd4\x15\xb2\xdc\x77\x6e\xfb\xa4\xe1\x57\x8e\x78\xda\x80\x11\x54\x34\x40\x96\xe5\x2e\x73\xce\x02\x57\x67\xdb\xa3\xe5\xca\x80\x88\x74\x3d\x11\xff\x4d\xfc\x3f\x16\xe9\x90\xd1\xb5\x39\x96\x63\xae\xf8\xc4\x3f\xbe\xf9\xca\x07\x64\xff\xd7\xf8\x5d\xfb\xb5\x1c\x2e\x22\xf8\x98\x90\x06\xb7\x44\x7c\x49\x0d\xd6\x96\xca\x3b\x3a\xc6\xf4\xdd\x90\xe0\x97\xfb\x27\x62\x3f\x46\xe8\xcb\x84\xd8\x1d\x74\xfb\x4c\xec\x76\x0f\x7d\x19\x13\x7b\x27\x42\xd9\x33\xb1\xbf\xf6\xd0\xfe\x98\xd8\xbb\x11\xcf\xb2\xc7\xb2\x3c\x4f\x88\xbd\x1f\xa2\xeb\x09\xb1\x6f\x3d\x82\xb6\x27\xc4\xf6\x3c\x82\xbe\x3f\x11\xbb\x43\x08\x3a\x7e\x22\xf6\x38\x44\xbb\xcf\xc4\xce\x3d\x82\x76\x27\xc4\xfe\x1a\xa2\xcb\x09\xb1\xcf\x42\xf4\xe5\x99\xd8\x91\x7a\x86\xb2\x0f\xec\x16\x2b\x06\x11\x4b\xc5\x7e\x28\x75\xbc\x9b\x62\x22\xf7\x48\x11\xd3\xde\xe4\x71\x5e\x19\xf7\xa1\xfd\x5e\x2c\x26\xa4\x88\xdb\xfc\xd0\xfe\x9d\x47\x8e\x0b\x6c\xa0\x6e\xc7\x23\x73\x25\xb7\xf5\xfe\xa3\x8c\xfe\x5a\xc0\x6e\x7c\xd8\xf8\xf3\x8f\xf7\x1f\x64\x69\x67\x45\xc2\x1f\x1f\x3f\xfe\xb9\xb1\xf9\x51\x26\x44\x51\x51\x62\xf3\xf7\xdf\x3f\xfc\xf9\xfb\x46\x7b\x53\xca\x93\x96\x52\xd1\x03\xb6\x81\x56\xee\xa5\xa5\x7c\xa9\xde\x2c\x2b\x2a\x41\x07\xa9\xe3\x99\x4f\x21\xc1\xc2\x3c\x82\xe3\x73\x87\x74\xf0\x54\xdf\xc7\xa7\x84\xa8\xbe\x51\xba\xa7\x84\x20\xeb\x93\xdf\xea\x50\xfb\x9c\xba\x8e\x2f\x9e\xe0\xfb\x86\x13\xc0\xa2\xd7\xcd\x5d\xdd\x5f\xff\x60\x19\xbf\x35\x2d\xcb\x70\xfc\xdf\xf0\x07\xcb\xb1\xe0\x8c\x2f\xe0\x6b\x06\x3a\x88\x75\x1f\x6d\xc0\x59\x60\x20\x97\x77\xcf\x9c\x84\x04\xfb\x8e\x85\x99\x5c\x8a\xef\x3d\x62\xeb\x3e\xee\xde\x7b\xac\x34\xd2\x3a\xa7\x76\x87\xb2\xae\x26\xcc\xdf\x88\x05\x08\x4a\x23\x45\x69\x88\xb0\xd2\x90\x05\xb7\xb3\x62\x85\x42\xc2\x79\x19\x2f\x87\x6d\x80\xef\xde\xe3\x2e\x13\x96\x1d\xcf\x3c\xdb\x63\x72\x47\x21\x93\x2b\x0c\x61\xd4\x10\x33\x0e\x04\x6f\xd6\x88\x39\xca\x83\xbf\x52\xd0\xf6\xe5\x38\x48\xd7\xf7\x05\x0e\x62\xe6\xc5\x7b\xe2\x91\xaa\xa2\x7e\x90\x8a\xd7\xda\x5c\x97\x1a\x2c\xa9\x6e\x07\xb7\xe3\x51\x7e\x47\x93\xaa\x3a\x30\x81\x1d\x8f\x79\xd5\xd9\xd5\x09\xd7\x93\x66\x23\x4c\x8c\xb8\x13\x31\xe2\x40\xb5\x10\x11\xae\x89\x6c\xac\x43\xcf\x2b\x8f\x0c\x2c\xc7\xe3\x5a\x36\x67\x7b\xb0\x3f\x26\xc2\xbb\xf2\xd9\x5e\xd7\x73\x1d\xc3\x6b\xe0\x0d\xa7\x54\xc4\xf3\x5a\x96\x5d\x24\xaf\x35\x5d\xa1\xd8\xfc\xe5\xb8\xc3\x85\x8a\x39\xea\x00\x34\xa2\x39\x57\x78\x2e\x9d\x63\x75\x2f\x08\x63\x25\x63\xb6\xf5\x09\x8b\x96\xe2\x1e\xd4\x79\x4b\xf1\xb4\x83\x78\xae\xb1\xd0\x86\x81\x78\x5f\x20\xbf\x7d\xb0\xa0\x3b\x2c\x88\x7c\x40\xd0\x51\x9a\x44\x27\xe4\x6e\xa9\xeb\x65\xfe\xe2\xf5\x3d\x68\x98\x9a\xf1\x48\xb2\xb8\x13\xdf\x51\x26\xf7\x6f\xda\x45\xb5\xe6\xf5\xb4\xe7\x70\x3c\x85\x64\x4d\xd6\x70\xb1\xa1\xa4\xbe\x72\x44\xf3\x8b\xcf\xbb\x0c\xfb\xcf\x34\xa1\x4b\xd9\xb4\xf6\x2a\x9f\x58\x37\x16\x83\xe6\x1f\x31\xe7\xef\x39\x73\xd9\x4b\xb3\xfc\x7f\x64\xcd\x86\x6d\xb9\x8a\x2a\x3b\xab\xcf\xc1\xab\xd6\x2c\x26\x21\x61\xb0\x55\x2c\xcb\x0a\xb5\xb6\xfe\x86\x89\xa5\x1a\x4c\xaa\x3c\x65\x7e\xbc\x62\xc3\x10\x82\xe3\x10\x7b\xd3\x69\x9e\x38\xca\x6c\x05\x5e\xca\xcd\x5e\x47\x27\x06\xef\xb1\x21\x20\x63\x7c\x6d\x87\x04\x77\xd7\xff\x7b\xf3\x96\xed\x95\xfe\x7b\xf3\xd6\x9d\xde\xbc\xbd\x79\x6b\xbc\xbb\x79\xbb\x8e\xc0\x50\xdc\x97\xc6\x74\xd2\x98\x1e\x37\xa6\xfd\xc6\xf4\xb2\x31\x6d\x37\xa6\xa4\x31\xed\x35\xa6\x87\x8d\xe9\x7e\x63\xea\x37\xa6\x47\x8d\xe9\x79\x63\x1a\x34\xa6\x77\x8d\xe9\xa8\x31\x7d\x68\x4c\x1f\x1b\xd3\xe7\xc6\xf4\x67\xc3\x60\x28\x18\xd2\x2f\x93\xe3\xfe\x65\x9b\xf4\x0e\xf7\xfd\xa3\xf3\xe0\x6e\xf4\xf0\xf8\xfc\xd3\x6d\xac\xbb\xce\x21\x1b\xde\x66\x58\xed\x56\x6c\x3c\x3a\xc4\x31\xaa\xe3\xb2\x1d\x0a\x75\x52\xc5\x51\xc3\x91\xe7\xea\x2c\xde\x13\xae\xfb\xe1\xfe\xb9\x6b\xb9\x60\xad\x8f\x52\x97\x9b\xff\x64\x53\xa2\x07\x17\x24\x38\x22\xa4\xe5\xe3\x63\x6a\x83\x3f\x60\x06\xd1\x44\xdc\x3f\x80\x81\x58\x0c\xdf\xc3\xbe\x65\x95\x3f\xa6\x86\x34\x30\xf1\x78\x05\x06\xd4\x72\xfa\x94\xdb\x3e\x08\xf6\xb6\x37\x93\x5b\x83\xd9\xcc\x59\xc9\x89\x7e\xb8\x7c\x6b\xbf\x4a\x4a\xff\x72\x9d\x1e\xad\x05\x24\xa7\xb5\x3c\xad\xf1\x8b\xa7\xda\xdd\x78\x94\xd7\x3c\x5a\x4b\xd2\x64\x8d\xed\x7d\x4c\x4d\x4a\x6b\x5e\xeb\x43\xfb\xfd\x3b\x9d\xf0\xe7\x0f\x6b\x5e\x65\x44\x18\xb6\x85\x02\xec\xb7\x94\x97\x0f\x5c\x49\xdd\x37\x6c\x02\xb7\x4a\x1e\x5b\x2c\x20\xeb\x2a\x16\x38\x18\x07\x1a\xd8\xda\xf2\x5b\x6b\xb0\xb8\xda\xf0\x8b\x28\x5e\x82\xa5\xdc\x52\x81\x3d\x39\xbe\xa7\x92\xbc\x80\x56\x08\xa5\x17\x56\x19\x1b\xba\xdd\x38\x70\x9d\x26\x56\x63\xf6\xdd\x16\xac\x22\x9f\x43\x61\x51\x2d\x42\x04\x05\x88\x82\xa6\x27\xa4\x44\xa5\x52\x9b\x1c\x9b\x86\xb3\xc2\xfb\x45\xaf\xb3\xb8\xcd\x65\xed\xfc\xfe\x13\x31\x84\xf9\x81\x71\x68\x2a\xcf\xf8\x98\x50\x2f\x6f\xe0\x3e\x56\x80\x94\xa7\x76\x5d\xb2\xf6\xbe\x04\x6b\x6e\x2c\x20\xab\xc2\x7e\xe4\xae\x03\x59\xcf\xf0\x02\x82\x96\x96\xba\xf6\x11\x6c\x19\x72\x28\xa2\x40\xcd\xa3\x12\xe7\x6c\x72\x38\x36\x8b\x9b\xb5\x99\x1c\x96\x9e\x3a\xc6\x8f\xd4\xa3\x40\xc7\x97\x47\x34\x5e\x61\xdd\xc7\x1c\x87\x30\xd6\x55\xe7\xdc\x81\x19\xe7\x44\x75\xba\x52\x34\x20\x78\x5f\x09\xe5\xe9\x51\x84\x7d\xd8\xf9\x84\x86\x43\x59\x4b\xbc\xff\xb8\x85\xa3\x7a\xfd\xf7\x3f\x3e\xe1\x48\x68\x27\x75\x1f\x02\x57\x07\x7c\x8d\x68\xed\xfd\x47\x68\x32\x8f\xe5\x30\x66\x3e\xa6\xb2\xbd\x96\x5c\x41\x1c\x17\x47\x72\x3a\xc8\xc3\xf5\x3a\x88\xc1\xec\xdf\x37\xdf\x35\x7e\x39\x26\x7a\x64\x54\x4b\xd2\x5a\x1e\xdf\xd1\x9a\x3e\xcc\x52\x8f\x78\x83\x49\x8d\xd4\xa2\x34\x8d\x4c\x06\x6b\xc2\xc9\xa6\x59\xbb\x1a\x51\xe8\xb7\xb5\x34\x9b\x4b\x64\xb3\x2b\x62\xd1\xe3\x11\xad\x91\x9a\xb0\xdd\x51\x7b\x8c\xf3\x5e\x3a\xce\x39\xea\x30\xa6\x83\x60\x04\x87\xe4\x25\xdd\x9f\xcb\x8b\x67\x44\x51\xd1\xc7\xe1\xb8\x41\x3e\x90\x14\x46\x7b\x85\xfc\x7b\x5e\x8a\xb1\x3e\xb6\xb6\x02\x2e\xe3\xb7\x9a\xb6\x85\xde\x6f\xe1\xa8\xc5\x9a\xc8\x94\x0f\xc4\xbb\xbe\x6b\xcb\x08\xf6\xc1\xc5\xd2\xeb\x5e\x89\x41\xe4\x67\x02\x22\xcc\x58\x6b\xbe\x81\x36\x30\x86\x13\x84\xdf\x30\x88\x68\xd0\x29\x40\x02\x8c\x98\x04\xc8\x30\x7c\x09\xed\xdc\x96\x67\xc1\x38\x10\xfb\x8b\x48\x90\xf8\xbb\x4d\xa0\xa7\x98\xea\xeb\x71\x56\xba\xd0\xe7\xe5\x38\xde\x4b\xa8\x57\xd2\x37\x65\xba\xf2\x86\x5a\x05\x92\x87\x10\x04\x17\x04\x36\x9a\x8c\xc4\x59\xa9\x4e\xc5\xf0\xbc\x29\x84\xf0\xe3\x54\xa7\x65\x75\x28\xdf\x37\x4d\xa7\x1b\xef\xcb\x8a\x9d\x87\x25\x6b\x28\x9f\x9d\x7e\x6b\xb6\x37\xd7\x9b\xed\x4d\x9e\xd1\xef\x3e\x79\xae\xb0\x39\xb6\xc9\xf2\xc1\x8d\xf9\x86\xd1\xd0\x37\xb7\xa2\xd6\x41\xac\x5b\x28\x5a\xdb\x34\xec\x53\x89\xf1\x59\xc1\xb8\x12\xf0\x17\x78\x4a\x4b\xc9\xc7\xca\x45\x4b\x55\x9e\x4a\x17\x4d\x76\x37\x57\x89\x08\x53\xb9\xed\x63\x99\xe0\xad\x71\xb7\xb9\x01\x03\x6a\xe3\xfd\xa7\x88\xf5\x07\x91\xf5\xf4\xd7\xf5\xff\xad\xb9\x31\x9d\x36\x37\x4a\x16\xfc\x28\x3b\xd8\x6b\x19\x4a\xe0\xcb\xbf\x01\x2e\x21\x27\x51\xb5\xcb\x24\xfe\xd2\x2e\xf3\xda\x63\xee\xd7\xbb\xcf\xe2\xfb\xf6\x5f\x74\xa5\xe5\x2f\xd2\xff\xa6\x5b\xa1\xe6\x42\xa7\xfa\xfc\xcf\x06\xc0\x72\x43\x0a\xac\xb8\x95\xbf\xab\xcc\xdf\x8e\x8a\x65\x36\x06\xfe\x97\xf1\x71\xaa\x74\x50\x90\x69\x45\x6d\xd6\x37\x0d\xc4\x7a\x52\xd9\x2b\xe5\xa3\xf8\xa2\xaf\x2a\x11\x1c\xd7\x76\xd1\xd7\x64\x99\x81\x38\xa5\x28\xfa\x41\xd0\x7b\xad\xc3\x7c\xab\x76\x98\xa7\x57\x01\x8f\x83\x0a\xe0\x59\x01\x48\x70\x38\x9d\x7e\x4d\x75\x9f\x0b\x20\x6c\x70\x54\xa4\x65\x5d\xe4\xe8\x28\x13\x60\x21\x8c\x50\x31\x13\x52\xd1\x98\x54\x3e\x9c\xf3\x38\xc3\xab\xaf\x95\xe1\xa1\x37\xf6\xf9\x8b\x1c\xf1\x56\x4f\xd7\xf5\x12\xb2\xf2\x7e\x79\x3a\xdd\x34\xd6\xbc\xc6\x1f\xc6\x6f\x2b\x7f\xac\xe9\xba\xcf\x7b\x7f\xe3\x83\xf1\xdb\x1f\x3c\xfa\x0f\x26\x0e\x02\xf7\xb9\xf1\x4f\x7f\x4d\x5f\xf2\x7c\xd0\x37\x0c\x39\x5d\xb3\x3e\x29\x9e\x03\xad\x43\xe9\xc6\xfa\x1f\x46\xa3\xb9\x6c\xb2\xfe\xfe\x3a\x7f\x78\xfb\xaa\x1b\x13\x9d\x49\x74\xea\x26\x4e\xf7\x05\x9a\x5e\xd1\xb6\xde\x32\x34\xde\xd2\xbd\x16\x43\xc7\x85\x8a\xca\x4e\x95\xd5\xa4\xe8\xa0\x02\xeb\xe9\x8c\x9f\x23\x7d\x09\x09\x7e\xf9\xd1\xde\xbe\xf8\xeb\xf3\xd5\xd1\x91\x7d\xdd\x43\xc5\xc7\x5f\xd7\x07\x9d\xfd\xbf\xda\x17\xdb\xb6\x36\xa9\x7d\xd1\x78\x02\xf4\xfc\xbf\xb6\x77\x76\x2e\x6c\xb0\x9a\x30\xa9\xc4\x03\x0e\x6e\x59\x61\xa2\x71\xbb\x24\x7f\xed\x6d\xff\xe0\xf0\x07\xa1\x12\xa3\x40\x06\x81\x0a\x0a\x7d\xdf\xd6\x8e\xd7\x2b\xb1\xc7\xed\xbd\x83\xab\x63\x99\x41\x4d\xe1\xa5\x97\xc9\xc2\x8e\x83\x98\x6c\xfe\x5a\x44\x21\x0d\x41\x30\x34\x8b\x50\x15\x74\x25\x28\xe0\x2c\x6a\xb2\x1d\xcd\xd0\x49\x8a\xbf\x84\x44\xfc\x03\x56\xee\x33\x56\x76\x72\x62\xbf\x34\xdb\x9b\xf6\x0b\x5c\xa4\xdb\x9a\x75\xa8\xcd\x50\xb3\xfd\xbe\x8c\x10\x31\xbf\x2b\x31\x22\xea\x43\x19\x75\x0c\x11\x7f\x28\x30\x3c\xe6\xa3\x9a\x8b\x47\xfd\x59\x46\xed\x40\x44\xd3\x52\x80\x44\x54\x53\xcd\x27\xe2\x36\xca\xb8\x0e\x8f\x51\xc8\x96\x51\x2a\xe1\x2c\x6e\x86\x2e\x17\xaa\x58\x63\x82\xd7\x88\x24\xc1\x42\x55\xab\x29\x95\x2a\x57\x93\x94\xaa\xd7\xee\xe2\xc1\x20\x4e\x93\x05\x0e\x54\x12\x2a\x8c\xa8\xa4\x28\xfc\xa8\x79\x4a\x7c\x85\x2d\xd5\x94\x0a\x77\xaa\x49\x1b\x6a\x35\x33\x35\x65\xb3\x52\xcf\x32\x69\x65\x9e\x6b\x4a\xe2\x6c\x86\x4e\x53\xbc\x1f\x12\xf1\x4f\x39\x95\x54\x55\x85\xce\x52\xb3\x3d\x26\xc8\xc7\xdd\xef\x70\x1c\x72\x9e\x76\x89\xdb\xb5\xdc\xfa\x1f\xdc\x7c\x28\x11\x57\x68\x57\xd4\x98\x7b\xd3\x46\x4a\x93\xe0\xdf\x69\xb1\xf8\xf0\xad\xcb\xba\x65\x5a\xd6\x7a\x84\x8a\xc3\x3e\xae\xba\x77\x9e\xe2\x97\xed\xf6\x9e\xdd\xdd\x40\x5a\xd0\xd3\x90\x76\x33\xb6\x3e\x6c\x84\x26\xfc\xfb\xdd\xd4\x90\xb6\xb7\xaf\xb9\x68\xfb\xe8\xc8\xee\x5a\x48\x3b\xa2\x7d\x8d\xff\xba\x68\xfb\x0a\xb2\xed\x50\xa4\x6d\x5f\xbd\xd1\x5c\xb4\xb3\xd7\x01\x3c\x37\x63\xeb\xcf\x70\x53\x43\x5a\x87\x81\xed\x7c\x39\x81\xd8\x01\x7d\xd0\xf8\xaf\x8b\x76\x2e\x8e\x20\xee\xe2\x8d\x06\x3f\x2e\xda\xdd\x2e\x90\xed\xc2\xf7\xde\x67\x80\xf8\x9c\xed\xee\x69\x48\xdb\xdd\xfb\xcc\x22\xf7\x79\xe4\xee\xfe\x67\x8d\xff\xba\x68\xf7\xe8\x8c\x51\x06\x19\x8f\x20\xe7\xc9\x0f\x49\x85\x45\x7e\x67\xf8\x8f\x77\x44\xd8\x45\xbb\xa7\x25\xf4\x29\x07\xbf\xd8\x85\x9a\xdd\x8c\x37\x2c\xd2\x64\x68\x2f\x44\xd0\x45\xbb\x3f\x0f\xed\xee\xef\x16\xd2\x0e\x6f\xc6\x56\xd3\x0a\xb4\x32\xe4\xa2\xbd\xc3\x43\xbb\xdb\xfc\x88\xb4\x7e\xa6\xc1\x8f\x8b\xf6\x18\x76\x5e\x89\x8b\x3d\x86\xbc\xfd\xe5\xac\xa4\x85\x71\xe4\xa8\xcd\x62\x3b\x3b\x10\xbb\x13\x67\x2c\x2b\xfc\x73\x51\xfb\xea\x42\xc0\x6e\x58\xc4\xd7\x8a\x80\x8b\xbe\xec\xcc\x61\xf9\xb2\x23\x82\x2e\xda\x3f\x2c\xf8\xb6\x7f\xc8\x8a\xdc\xbf\x38\x04\xe0\x7e\xa2\xc1\x8f\x8b\xf6\xaf\x3e\x43\x0d\x3f\xe7\x1a\xfc\xb8\x68\xe5\x60\xef\x02\xa2\x2e\x86\x1a\xfc\xb8\xe8\xe0\xe8\xb2\x2c\x9d\x68\x48\x3b\x38\x12\x41\x17\x1d\x9c\x94\x94\x79\x7f\xb2\x1c\x23\x16\x7b\x21\x70\xc4\x64\xc0\xe0\x2f\x2e\x58\xe4\xe5\x21\x44\x96\x3c\xf9\x7a\x5c\x10\xf8\x75\x9b\x11\xf8\xf5\xec\x87\x60\xb8\x68\x9f\xaf\x67\x45\xf3\x1c\x5e\x5c\x97\x8d\xc1\x4a\x3a\xbc\x10\x41\x17\x1d\x1d\x72\x2a\x2e\x46\x1a\xd2\x2e\x8f\x80\x86\xa3\x0e\xef\x47\x47\xac\x6a\x47\xac\x6a\x47\xdf\x44\x0c\x83\x3a\x62\x30\xc7\x27\x9d\x12\x27\xd5\x90\x76\x7c\x22\x82\x2e\x3a\xfe\x7e\x22\x89\x3b\xa6\x4f\x8c\xba\xe3\x1f\xa2\x94\x63\xe8\x39\x9a\x8b\x4e\x4e\x45\x27\x80\x3a\x9d\x9c\x42\xad\xce\xb6\x45\x13\xae\xb3\x21\xc2\x7e\x5d\x74\xd6\xe6\x1d\xfd\x12\xe2\x2e\x79\xdc\xfe\x59\xc9\x3a\xd6\xbb\xce\x7a\x8c\xdb\x67\x87\x82\x77\x8c\xca\xb3\xc3\x8b\x11\xc0\x1e\x9d\xf0\x82\x9e\x59\x1f\x7b\xbf\xa1\x95\x21\x17\x5d\x9c\x72\xe4\x17\xa7\x27\x1a\xff\x75\xd1\xc5\xe5\x1e\x60\x09\x62\xd6\xd6\x17\x97\x7b\x2c\xee\x6a\x87\x23\xb9\x19\x5b\xef\xdf\x5b\xf0\xbb\xc9\x7e\x37\x9b\xa6\x86\x56\x96\x46\xbb\xe8\x72\x5b\xd4\x9a\xb7\x25\xfc\x73\xd1\x65\x5b\x74\xa5\xa2\x31\x2f\xbf\x14\x8d\x79\xc9\xb8\xd5\xd9\xdf\x91\x3d\x93\x6e\x86\x6c\xc4\xef\xef\xb0\xe8\x0b\x18\x82\x3f\x42\xa4\xfd\xe8\x1c\xb1\x88\x6b\x3e\xc3\x9c\x74\xd8\x80\x67\xbf\x2e\xea\xfc\xbc\x04\xea\x3b\x97\x6c\xda\x61\xbf\x2e\xba\xda\xde\x2f\xd9\xf5\x5e\x43\xda\xd5\x36\x9b\x7d\xae\x2e\x8b\x62\xaf\xa0\xdc\xab\x1f\x57\x32\xe2\xcd\x95\xe6\xa2\x6f\x27\x7b\x65\x1b\x7b\x1a\xd2\xbe\x9d\x88\xa0\x8b\x7e\xb4\x2b\xfd\x54\xd4\xed\xa7\xac\xb1\x86\xb4\x9f\xdb\x17\x9a\xcb\x25\xa2\xaf\x6c\x19\xdf\x6b\xef\x1e\x1c\x6f\x1f\xfd\x75\xd9\x3e\xb3\xaf\x28\xfa\x72\x71\x7a\x75\x06\x1f\x17\x14\xd1\x23\x7b\x8f\xa2\xc9\xa6\xfd\x9d\xa2\x2c\x27\xf6\x39\x45\xf7\x39\xb1\x3b\x14\xdd\x53\x62\x3f\x87\xa8\x4f\x89\x4d\x03\x82\xfc\x4d\x9b\x91\xb3\xd1\xa4\x1a\xda\xcf\x88\xad\x9d\x90\x13\x0d\x49\xd4\x67\xdb\x9d\x4e\xfb\xe2\xc4\xd6\xfe\x83\xfe\xf3\x1f\xcb\xfc\xcf\x7f\xfe\xa3\xa1\x3b\xf0\xfe\xd6\xb6\x34\x44\xde\x8b\x84\xdf\x34\xd4\x1e\x13\x9b\x8f\x95\xf7\x1c\xd6\xb2\x34\x34\xbe\x27\xb6\x76\x75\xb9\xa7\xcd\xd0\x59\x8a\xbf\x86\x44\xfc\x2b\x57\x94\x8b\xb4\x62\xe2\x79\xfb\x10\x7b\xd3\xe9\x59\x6a\x8e\xef\x85\xa9\xe7\xbb\x7b\x82\xfd\xe9\xd4\xe2\x5f\x9d\x4b\xfc\x5e\x04\xaf\x52\x2c\x54\xa8\xbd\x67\x2c\xe3\x26\x78\x53\xc4\x75\xf8\x79\x9a\x9f\xcb\x34\x2f\x10\xf7\x1f\x8f\x3e\x29\xb4\xaf\xfb\x87\xc2\x36\xd0\x04\x9f\x0a\x63\xd2\x0f\xb8\x43\x85\x59\xe3\x3d\x19\x99\xdf\xca\xb2\x7e\x36\x65\x09\xdf\x2f\x85\xf5\x51\x05\xdd\xe3\xa1\x2c\x8d\x04\xdc\x30\xf8\x3f\x3c\x02\xbf\x4c\x19\x8e\x6b\x7c\x91\x72\x73\x48\xdc\x52\x53\x7c\x37\xbe\xfb\x9c\x11\xe0\xd4\x5e\x1c\xc5\xf9\x68\xde\x1e\x8a\x38\xab\xf7\x9e\xc1\x46\x66\x71\xa6\x75\x44\xa4\xd9\x65\x3f\x2f\x2f\xc2\x59\x84\xb4\x2e\x43\x9e\xfe\x06\xb9\xe4\xe7\x5c\x6e\x6e\xf0\xe5\x32\x8e\x92\x38\x8c\x7d\x92\xe4\xbf\xa4\xcb\xcf\xf9\x03\xcb\x25\x84\x79\xcf\x4b\x50\x87\x4b\xac\xeb\x80\x15\x65\x90\x0c\x6a\xeb\x11\x7a\xd3\x2b\xef\x62\xc4\x6d\xc3\xf9\x04\x77\x54\xa5\xa3\xf2\xd8\xd8\xeb\x5a\x2e\x0a\x30\xbc\x72\xb0\x14\xdf\x43\x6b\x4d\x34\x00\x73\xe5\x28\xc1\xab\x96\xc3\xc0\xb6\x06\xf5\x7a\x02\xa1\x46\xc3\x90\xf7\xcb\x70\xcc\x06\x2e\x3c\xc4\x2e\xfe\x91\xda\xd6\x56\xd8\x8a\x1a\x0d\x9b\x36\x1a\x8e\xb5\x85\xfb\xf5\xba\xf5\x29\xa8\xd7\xfb\x8d\x86\xaa\x17\xf3\x9d\xda\xc0\x85\xa8\x74\xf5\x74\x55\x1a\x7e\xd0\x2c\xad\x16\x27\xc5\x99\xa0\xf6\xb6\x41\x1a\x63\x26\x25\xfd\x12\xe7\x05\xb5\xfb\xd8\x52\x63\xae\x44\x29\x38\x28\x8b\x39\x16\x2f\x1b\x6a\x01\xf5\xe3\x3b\x32\xa8\x8d\xe8\x90\x64\x24\x4f\xb3\xd1\xd2\x32\x03\x4c\x1b\x61\x23\x52\xd1\x3e\x87\xb6\x34\xd8\xfb\xfd\x72\x09\x66\xfa\x34\x4c\x13\x9a\xe4\x31\xc3\x3e\xb9\xf3\xd2\xc1\x72\xd4\x72\x98\xac\x5a\xc5\x98\xe4\xcc\x6e\x34\x19\xbb\x4b\xf6\x36\x56\x9a\x06\xc6\xe7\x14\xfc\xb4\xb3\x16\x40\xe5\x40\xb5\x78\x83\x2e\xcf\xc7\xb2\x7d\xa7\x8e\xa1\xe6\xf2\x3a\x8d\x06\x13\x40\x9b\x9f\x68\x23\x9c\x4e\x9b\x9f\x44\xac\x52\x11\x32\x08\xd3\xec\x8e\x06\x95\x9a\x2c\x90\x0f\x0f\x22\xe6\x14\x43\xbb\x96\xbb\xb6\xc6\x7a\x4d\x73\x66\x61\x1c\xb2\xde\x4d\xa1\x8b\x07\xe0\x8b\x2a\x40\x3c\x36\x6c\x34\x50\x84\xe9\x5a\x88\x28\x0e\xd7\x9a\x28\xc4\x4d\xe9\xbc\x9b\x41\x47\xd3\xa9\xc8\x12\x6c\xd1\xe9\x34\x60\x94\x1a\x60\xde\xae\xbf\x8c\xca\x05\xca\x22\xd1\x66\x72\x8c\x32\x64\xad\x68\x2d\xb0\x2d\x47\xe0\x95\x63\x9f\x36\xc2\xb5\x00\x59\x9f\x8a\xd1\x58\xa4\x58\xf2\x66\xe9\x2a\xc5\xd0\x85\x5a\x81\x1d\x19\x6b\x54\xb6\x9a\x04\xed\x5c\x62\xda\x10\x80\xac\x76\xa2\xcc\x7a\xbd\x08\xa7\x12\x94\xcd\xc8\x12\xeb\xcf\xa6\x70\x05\x63\xa1\xbe\xb4\x91\xee\x13\x6c\x61\x1c\x4c\xa7\x01\xc6\x91\xe3\xe3\x15\x60\xa7\x5f\xcc\xc4\x95\x51\x0c\x83\x92\xfb\x82\x53\xc6\x21\xc6\x51\xd8\xaa\x74\x12\x36\x5f\x2b\xf9\x10\xa4\x61\x1f\xc9\x19\x5c\x4d\x94\x56\xf3\xb6\x1f\xe4\xac\xdf\x10\xdf\x12\xbc\x81\x05\x31\xdc\x66\x73\xf5\xf2\x67\x4e\xed\xa4\x59\x4c\xe2\x67\xa9\x39\xb7\x60\x56\x94\xe4\x36\x54\xc0\xbb\x9c\x54\x12\x37\xd5\x44\xf2\xbe\x92\xf6\xbe\x48\x3b\x10\x97\x57\xe6\xf6\xa1\x51\x01\xf9\xdd\x3e\x94\xf7\x5a\xcd\x4a\xc2\x87\x32\x61\x63\x5e\xbf\x59\x51\xd2\x1b\x8d\x87\xc3\x34\xcb\x95\x5e\xc6\x16\x2c\xb8\x92\x50\xb5\x35\x0f\xa5\x96\x1b\x61\x6b\x9c\xe7\x90\xd7\xaa\x4d\x5e\x5d\xba\x74\x4b\xa6\x2e\x5b\x7b\xf4\x0d\x91\xba\xb0\xb4\xe8\x1b\xc6\x6c\xa5\xe7\x55\x6c\x48\x55\x0c\x36\x0a\x0f\x14\xd6\xaa\x58\xde\x0f\xcb\xab\x9d\x33\x92\x8d\xe2\x24\xaa\xa5\x21\xb7\xc6\xe3\xe7\xb5\x64\x7c\xe7\x51\x36\x17\x8e\x6a\xe3\x24\xbe\x1b\x0e\xe8\x1d\x4d\x72\x1a\x68\xf2\x42\x2b\x26\x0e\x59\xb6\xe2\x48\x27\xfb\xa2\xe7\x20\x9f\xf7\x47\xf6\x0f\x85\x6a\xda\xf6\x83\x9a\xe6\xd0\x7a\x3d\x94\x23\xe4\x7c\xd2\xfd\xea\x7e\x12\x50\xdd\xaf\x6e\x2b\xc4\xab\xa2\x1b\x41\xd2\x56\x99\x04\x5a\x9c\xab\x6c\x3c\xd1\x96\x0f\x7d\xba\x04\xb3\x43\xd0\x77\x2b\x22\x21\x03\x7f\x90\x05\x64\x9c\xa5\xa6\xbf\xa9\x12\x61\x70\x60\x88\x67\xcb\x5e\x80\x83\x8a\x42\x10\x41\x11\x5e\x6d\xa2\x3e\xfb\x19\xb0\x9f\x04\x37\xd1\x10\x2b\x0d\x7c\xd9\x3e\x43\x23\x16\x51\x48\x99\x68\xcc\x3e\xef\x29\xf9\x17\xcc\x07\x23\xfc\x6a\x13\x24\x69\x5e\xab\x36\x82\x5c\xbd\x1f\xf0\xa9\xc3\xa8\xde\x5a\x09\xb8\xa2\x2d\xac\xcc\x40\xef\x33\x0e\x60\x46\x80\x9a\xa1\x1d\x7c\x14\x12\xfd\x59\xfa\x2c\xd9\xa9\xd7\xff\xfc\x84\x77\x8c\x87\x06\xde\x61\x75\x29\xed\x62\x3f\x63\x3c\x2c\x2e\xce\xe2\x50\x8f\xa6\xd3\xbe\xc1\x07\xc6\x43\x03\x5f\x51\x27\xc2\xab\xd6\x4c\x81\x1e\x09\xe8\x7a\x5d\x7f\xd3\x5b\x2d\x3e\xa7\x53\x9f\xaf\x45\xfc\xb9\xa4\xb5\x05\x04\x94\x24\x35\x9a\x86\x31\x5f\x82\x8a\x76\xac\x12\xa1\x50\xf0\x1c\x3a\xfd\x39\x0a\xce\xe9\x74\xfa\x8c\x71\x87\xb2\xea\x3c\xab\x35\x39\x4b\x4d\x7a\xa4\x22\x6a\xae\xe2\x44\xe0\x4a\x70\xd3\x02\x17\x81\x03\xe3\x85\xf3\x4d\xea\x09\x54\x11\xf4\x29\x79\x1d\x43\x7b\xf3\x75\x0c\x3c\x1c\xe0\x01\xd1\x1f\x8c\xf5\x64\x16\x87\x3a\x15\xc6\xa5\x8a\x51\xd0\x3f\xe4\x1d\x70\x95\x77\x40\x21\xe9\xc5\xc4\x51\xfa\x6d\xff\xb0\xfb\xb5\xf4\x46\x14\xce\xa3\x38\xd9\x43\x2b\x7f\x8b\xe3\x64\x8f\xe1\x90\xe6\x4b\x5a\x6b\x81\x1d\xcc\x0c\x50\x87\xb8\x9e\x57\xc0\x85\xc3\x2b\x89\xe5\x2c\x35\xf7\x33\x22\x65\x49\x17\xf9\x4e\x69\xec\x08\x8b\xa5\x8d\x04\xa4\x25\x7c\x6c\x90\x80\x20\x8a\x89\x23\x57\xbd\xc7\xc3\x96\x8f\xaf\x52\x5b\x0f\x84\x1a\x50\xc0\x7d\x5d\xb2\x20\x35\x90\x8f\x8f\x8b\x69\xf9\x13\x0e\x5a\x96\xfd\x2d\xd5\x03\xc3\x30\x83\xf8\x21\x1e\xa5\xd9\x0e\x19\x51\x44\xd7\x71\xcf\x1c\xa6\x8f\x7a\xd3\x42\xbe\x81\xae\xc5\x4a\x45\x0d\x14\x54\x53\x02\x2c\xd3\x82\x0a\x6a\xbf\xc1\xb0\x9a\xe3\x80\x18\x86\xe1\x10\x35\x93\x5a\x90\x50\x50\xf2\xcd\x61\x46\xc3\xf8\x89\xc9\x7c\xe0\xb1\xd4\x02\x03\x73\xd6\xa7\xe6\x3a\xe1\x10\x41\x4b\x4c\x27\x72\x4a\xe2\xaf\xf6\x80\x6d\x60\x72\x8e\xbc\xd3\x83\xd6\x5a\xd3\x6e\x1a\xef\xc4\xbe\x08\x49\x31\x51\x38\x28\x32\xbe\x17\xeb\xad\x14\x1a\x3c\x03\x9d\x48\x8a\xad\xe2\x9d\x0f\x63\xd6\x20\x8d\x74\x62\xac\xf3\x40\xd3\x32\x1c\xca\x2f\x3c\x68\x63\xa3\xbd\xd6\xfc\xbd\x5a\x25\xca\xa7\xe1\x50\x4a\x1d\x20\xe3\x09\x83\x54\x97\xc2\x6f\x42\xe7\xf2\xd3\x8a\x48\x16\x3a\x3c\xd6\x2a\xa6\xbf\x89\x34\xc7\x20\xef\x30\xc3\xb4\xb6\xe6\x84\xb8\xc9\x3b\x9e\x90\x0f\xaf\xd2\x96\x4e\x1b\x0d\x44\xd6\x71\xd3\x32\x6c\x9d\xae\xc9\x72\xd6\x9a\x88\xbc\x2b\xc9\x28\x62\x0d\xc3\x29\xeb\x1a\xb2\x7a\x15\xb5\xa4\xc8\x13\x8f\xe4\x96\x71\x43\xb8\x35\x63\x0c\x87\x09\xd9\xa8\x30\xff\x64\xcf\x96\x22\x88\x6c\xb6\xd1\x38\x84\x66\x9b\x57\x20\x53\x1e\xd0\x5c\x57\x1f\x6c\x49\x62\x89\x79\x35\x61\xdd\xc7\xfa\x84\x89\xe9\x3d\xb7\xe0\x26\xc9\x7b\xe7\x1b\x36\x84\x4e\x43\xc2\xbe\x10\x4b\xe3\xb0\x06\xa2\x4e\x42\xf4\xc0\x68\xe9\xa2\x2d\x82\x75\xbf\xb8\x88\x0a\xd6\xe8\x3b\x9f\x49\x51\x14\x7b\x48\x79\x93\xfd\x32\x0e\x88\x4d\xd1\x97\x11\xb1\xfd\x99\xa2\xca\xf0\x5d\x79\x7b\x0b\x6f\x8c\xfc\xfc\x13\x14\x53\xac\x11\xc7\x71\x52\x03\x83\x8a\x85\x1a\xd2\x80\x8e\x46\xb5\xbc\x47\x92\xda\x1d\x79\xe2\x69\x9a\xe1\x78\x58\xd4\x50\x2c\xc5\x73\x35\x0c\xb1\xc7\x46\x01\x8a\xb0\x67\x7e\x19\x11\xd4\x67\x82\x66\xc8\x47\x5d\x68\x34\xd8\xa2\x66\x6d\xb1\xe2\x99\xe0\x1d\x4d\xa7\xc4\xf4\x02\x52\xaf\xf7\xb7\x58\xcd\x1d\x0f\xb3\x24\x67\xc0\x5f\xcf\xf2\x24\x0b\x92\x5a\xec\x67\xad\x6f\xb3\x74\xd5\x9c\xd7\x29\xea\xe3\xd0\x69\xb6\x37\xac\xad\xbe\x63\x24\xf8\x3b\x6d\x24\xa8\xcf\xbd\xf4\xf5\xd7\x59\x4f\x16\x66\xbf\x1a\xc9\xdf\x2e\xa3\x7d\x7c\x99\xb6\xde\x7f\xb4\xcf\x52\x73\xb2\x29\xdf\x01\x8c\x71\xc2\x56\x3d\x58\xd2\x42\x46\xb4\x30\xc8\x16\xe2\xb1\x13\x6e\xf9\xa0\x41\x03\x9a\xb8\x8a\x92\x4c\x5f\xa8\x4c\x71\x45\x9b\xf1\x72\x98\x46\xf3\x5d\x22\x15\x68\x0c\xd4\xdc\x1a\xaf\x85\xbc\xb2\x3f\x9b\xf5\x7a\x13\x63\x7d\xbc\x16\x1a\xbf\xf1\x4f\xc8\x3c\x12\x3d\x79\x30\x9d\x2e\x2b\x50\x27\x4c\xae\x9f\x4e\x07\x46\xbd\xbe\x02\x00\x43\xc3\x21\xf8\xb4\xa1\x47\x0d\x71\xee\xef\xc3\x56\xdb\xe1\x6b\x8d\xbf\xc6\xf7\x6c\xf5\xba\xff\xc9\x6b\x34\x1d\xc3\x67\x83\x11\xa8\x6e\xbe\x5e\xb3\x46\xf3\x1d\x29\xa8\x56\x0c\x40\x95\x8f\xe4\x7d\x31\x9c\xee\x29\x31\x1c\xeb\x93\xd7\xd2\x3d\xbc\xe6\xa1\x22\x3a\x27\x86\x61\x13\xb6\xa5\x14\x4a\xc5\x67\xa9\x99\x81\x28\x8e\x4f\x1b\x9e\x72\x3f\x71\x99\xb6\xbe\x53\xde\x18\x88\x1b\x48\x73\x28\xeb\x0b\x1d\x30\x78\x27\x9e\xd0\x38\xe2\x75\x91\xe2\xc8\x55\xbe\x8d\x90\x4f\x39\x40\x49\xec\x23\x58\xc2\xfe\xfd\xe3\xa7\xf2\xcd\xf3\xda\xfb\x8f\x4e\x71\x7f\x52\x34\x78\x31\xb6\x21\x03\xd9\xf2\x1a\x4d\xab\x45\xd6\x3c\x7b\xad\xa9\x8c\xa7\x4e\xba\x68\x9c\xef\x14\x31\x31\x91\x8d\x00\x29\x26\x6d\x85\x15\x69\x29\xc2\x5e\x29\x2d\x31\xaa\x22\x8c\x8f\xa9\x21\x64\x98\xb0\x5e\xf7\x54\xc9\x85\xa5\xb5\xf8\x47\x03\x05\x0d\x06\x69\x53\xbc\x4a\x0b\xd9\x83\x1a\x41\x03\x47\xfc\x53\x6c\x88\xa2\xf2\x74\x44\x1e\x7e\xc8\x03\x0b\x79\x4c\xc1\x75\xdf\x0b\xb5\x82\x40\x5c\xfc\x07\xc4\x06\x07\xe9\xaf\x90\x12\x04\xc4\x28\x49\x21\xe6\xf6\x61\xa5\x5c\x62\xde\xdd\xcb\xcd\x98\x65\x07\x0d\xb8\x81\x32\xb7\x0f\xdd\x6e\xd3\xad\xee\xbf\x38\x1f\x58\x1a\xea\x33\xa8\x08\x44\xe0\x06\x63\x45\xbf\xdb\x74\x5b\x91\x1d\x35\x46\xb4\xd1\x07\xff\xc0\x4a\xce\x66\x05\xeb\x86\xab\xbe\x31\xdd\x83\xc3\x97\xe6\x2a\x26\x66\x7e\x5b\xcc\x68\xa9\x47\xd8\x46\x26\xbf\x05\x19\x2c\x68\x70\x41\x4d\xc5\x49\x79\xa5\x7f\x91\xb1\xbd\xc9\x32\xae\x70\x09\x6d\x6e\xeb\xc6\x98\x5f\x58\x07\x0c\xe0\xec\xf0\x2a\xc5\x2f\x7c\x65\xb7\x4f\x11\x5f\x2b\xec\x53\xa4\xac\xff\xb6\xfa\xb0\xe0\xb8\x6a\x48\xa4\x89\x31\xdb\xd2\xb5\x4e\x53\xb3\x93\x13\xfb\x34\x35\x2f\x73\x90\xe8\x37\x3f\x15\x36\x67\xaf\x52\xc7\x13\xf6\x90\x9b\xef\xe1\xc9\x0d\xf6\xbb\xc5\x0c\xec\x19\x6e\xd5\x84\xd7\x55\xca\x00\x4c\xb8\x5a\x2c\xde\xe0\xd4\xeb\xfe\x2a\xfe\xce\xba\x16\x5e\xd7\xbb\xff\xb5\xdc\x77\x86\x6e\x35\x0c\xdd\x7c\x67\xac\x77\x73\x0f\x5c\xea\xb7\x64\x35\xfc\x6e\xd3\x95\x35\xf1\xbb\x9b\x6e\xa5\x32\xde\x9a\xee\x77\x37\x5c\xae\x31\x3b\xb3\xaf\x52\xfb\x2a\x55\x0c\x8c\xa5\xba\xa2\x78\xe8\x61\xcb\x69\x6e\x61\x9d\xaf\xea\x8e\xe1\x35\x1a\x4b\x5e\x3b\x9f\x96\xd3\x08\x57\x97\x2d\xb4\x61\x3c\xec\xad\x01\xc6\xb5\x26\xf8\x91\xde\x5a\x2b\x6a\xe9\x57\x24\x34\x98\xf9\xc9\xba\x6f\xbc\xf3\x1d\x25\xa5\x7c\x02\xc9\x01\xde\xf9\xc6\xba\x3f\x73\x0a\x5d\x5d\xf8\xed\x9e\x78\xae\xe1\x1c\xa6\xe6\x67\x50\x3e\xc4\x2f\xa0\xd7\xb0\xb7\xdd\x69\xdb\x16\x3a\x3a\x3d\xf9\xc2\xc3\x4d\xc4\x6f\xfc\xf9\xd7\x06\xf7\x59\xc1\x3f\x36\x11\x64\xe9\x1c\x1c\xb7\xed\xf7\x3c\x0b\x84\x7f\x97\x59\xe0\xeb\x83\xc8\x02\x1f\x7f\xa0\xa2\x14\xf8\xfe\x58\x96\x04\xdf\x7f\xaa\xa5\x41\x4c\xd3\x52\x8a\xe4\x31\x4d\x7e\x19\xf1\x23\xc5\x27\xa9\x73\x51\x56\xe0\x60\x4c\xec\x26\xba\x1c\x13\x7b\x03\xd1\x23\x7b\x13\xed\x8d\x89\xfd\x1e\xed\x8e\x89\xfd\x3b\xda\x19\x13\xfb\x03\xf0\x00\x0e\xbb\xd1\x45\xc9\x83\x8b\xd4\x1c\xd1\xbc\x9d\x84\x69\xe6\xd3\xed\x91\x1f\xc7\x4b\x4e\x97\x2f\x53\x4c\x66\x0c\x34\x1e\xfd\x0a\xb2\x50\x67\xbf\x4c\x39\x95\x3f\x53\x7c\x96\x3a\x07\xa9\xe9\x67\x54\xe8\x67\xfe\x4c\x13\x8a\xbf\xa6\xe5\xe0\x78\x03\xaf\x6e\xde\xa4\xc2\x45\x32\x5f\x82\xbe\x31\x19\x04\x2f\x3b\x7c\x00\x41\x6d\xaf\x34\xb5\x8c\xdb\xbd\x62\x3c\x8f\xc2\x86\xd7\xd0\x0a\xb1\x26\x0d\xb9\xb9\x5f\xfe\x6c\x17\xd5\x1e\xc9\xa8\xa6\x35\x4a\x43\x52\x0c\x55\xf7\xc0\x05\xec\xaa\x07\xcc\x21\x23\x88\x0c\x19\x41\xa7\xfe\xab\x4f\x04\xce\xae\xaa\x8a\xf9\xde\x50\x1e\x9f\x77\x0f\xb9\x85\xf7\x1f\xba\x37\x44\x64\x68\x38\x47\x44\xf7\x86\x55\x3d\x71\xb6\x6c\x25\xf4\xb1\xb6\x93\xe8\x5d\x78\x2f\x8e\x84\x51\xa2\xce\x64\x48\xed\xed\x1e\x02\x29\x0c\x3e\x76\xa3\x99\x5b\xba\x3c\x24\xe6\xa5\x3e\xec\x89\xef\x91\x70\x81\x08\x1f\xd7\x43\x82\xc1\xf0\x5b\xe0\x13\x74\x16\xca\x43\xff\x33\x19\x7d\xed\x13\x74\x5e\x44\x7f\x1b\x12\x0c\x16\x3c\xbf\x79\x04\xad\x0a\xb3\xea\xe6\xb9\x2f\xae\x50\x84\xd1\xc9\x6f\x8a\x9d\x90\xe2\x40\xc5\x27\x78\xa1\x49\xf5\x0f\xd6\xbb\x35\x02\xd6\xc1\xa1\x9d\x86\xf8\x30\xed\x6e\x07\x2e\x23\x04\xbf\x5c\x3e\x11\xfb\x28\x42\xc9\x84\xd8\x7e\x0f\xe5\x13\x62\x87\x3d\xde\xb3\xed\xed\xde\x8c\x51\x85\x5f\xc4\x93\x36\xfe\x96\x0d\x0d\x9f\x89\x7d\xd0\x53\x8f\xc3\x2e\xe4\x24\x3a\x77\x24\xb8\x13\xd9\x73\x3e\x4c\x8e\x0a\x15\x29\x4e\x83\x59\x0c\x3b\xbe\x1a\xf8\xbd\xb9\xf4\x62\x18\xf2\xf4\x70\x3e\x5d\x19\x96\x42\xc1\x6e\x1e\xa2\x1c\xa5\x33\x00\xd8\xfd\x17\x44\xb1\x71\xfd\x77\x84\x95\x30\xbf\x22\xae\x84\xfa\x05\x81\x0c\x88\x13\x79\xd0\xfb\x67\x44\xfe\x1d\x81\x7f\x4f\xdc\xdf\x12\x06\x44\xcd\x69\xa2\x2d\xe3\xd3\x6c\xb6\x02\x23\xc9\x8c\x06\xbf\x3a\x26\x8e\x22\x9b\xe0\x1f\xa9\x59\xa8\xac\xa9\xc2\xc0\x59\x68\x13\x1c\x7b\x44\x8d\xfb\x1a\x2a\x19\x4a\x55\x36\x15\x64\xcc\x40\x16\xb8\x39\x27\x2a\x2c\x81\x00\xb2\x8b\x69\xe1\x45\x3a\x94\x24\x28\x17\x43\xc7\xb6\x66\x06\xcc\xcd\xf3\x73\x44\x39\xe9\xfd\x4c\xf4\xf3\x90\x20\x6e\x30\x42\x3e\xe6\xdd\x89\xe0\x31\xef\x6e\x34\x6f\x3e\xe2\xfc\x14\x4c\x77\x60\x30\x1b\x21\x8c\x48\x07\xdc\x76\x34\xdf\xcd\x83\xf9\x08\xca\xcd\x47\x5c\x16\x07\x1b\x08\xdc\x3d\x76\x9e\x58\x8a\x30\x16\xc1\x79\x7d\x76\xb5\x78\x43\x38\x0a\xa6\x53\x5d\xce\x41\xb2\x54\x39\xdf\x94\x0f\xaf\x0a\xec\x02\x14\xc1\x83\x30\x8e\xf6\xfc\x74\x89\x35\x03\x31\xcd\x55\x8c\x0f\xf1\x91\x2f\xe7\xb8\x12\x39\x9b\x3f\x0f\xd3\xea\xd3\x89\xcb\x8a\x5c\x21\x0e\x96\x0a\x01\xe2\xb4\x78\x40\x71\xee\x13\xe1\x9e\x1d\xae\x84\x96\x4c\x68\x52\xad\x92\x89\x5e\xa5\xea\x27\x57\x46\x67\x8c\xfa\x36\x64\xdb\x9a\xaa\x7f\x9f\xf2\xb8\xe0\x04\xac\x18\x05\x2a\x69\xc1\x50\xb1\x29\x53\x9d\xfa\xc5\xbd\xe1\x25\x5c\xec\xd9\x9d\x90\xa0\x28\x4b\xc7\xc3\x38\x89\x44\xd4\x55\x48\x50\x58\x39\xbc\xb7\x37\x50\x42\x23\x92\xc7\x0f\xf4\x8c\x64\x34\x19\xd9\xab\x4d\xb4\x28\x92\x8e\x7c\x32\xa0\x9f\x89\x9f\xa7\x99\xdd\x2c\xd6\x91\xe4\x19\x9f\x25\xba\x87\x28\x9b\xde\x49\xbd\x7e\x1f\xeb\xc4\xac\xe2\x37\xea\x75\xc6\xca\xc5\x58\x5d\x62\x88\xe5\x52\xd2\x1f\x11\xdc\x61\xe8\xde\x78\x32\xea\x61\x93\xc7\x0c\xfd\x22\x86\x0a\xa0\x4c\x2e\x5e\x8f\x32\xe6\x8b\x8c\x49\x3d\x82\x7f\xb0\x98\x49\x91\x6d\x4c\x61\x99\xf2\xd0\x33\x8b\x2a\x7c\xfc\x5e\x01\xf2\x9e\x61\x88\x43\xa8\x87\x80\x5b\xaa\x8e\x93\xda\xb7\x90\x28\xce\x80\xbf\x85\xa4\x5b\x81\x90\x2c\x88\x0f\xf0\x31\x43\x72\x28\xec\x64\x59\xe2\xcd\x67\x7c\x50\x9e\x94\x5c\x32\xe6\xd5\x42\xe0\x5e\x21\x55\x90\xda\x30\x1d\xc5\x8c\xef\xe2\x50\x1d\x2e\x6e\x7e\xe8\x01\x5f\xeb\x41\x73\xee\x1b\x5b\xd0\x44\xa3\xda\x17\x7c\x46\x38\x18\x13\x34\xf2\x63\x9a\xe4\x71\x18\xfb\x32\xf6\x72\x4c\xd0\x90\x66\x3e\x4d\x72\x19\x45\x8f\x90\x3f\xce\x32\x9a\xf8\x13\x19\xb5\x37\x26\x48\x1b\xf5\xd2\x2c\xd7\x64\xd4\x2e\x8b\x1a\xa4\x49\x54\xc4\xec\x8c\xc9\x0c\x5d\x87\x84\x6d\x4d\x3b\x21\xc1\x3f\xab\x47\x20\x57\x3c\xaa\x3c\x04\xa1\x43\x15\x44\xdc\x26\xb1\x79\x28\x58\x32\x0f\xbd\x62\xae\x06\xdc\x3d\x80\x75\x1a\x5f\x4e\x2f\x01\x9f\x5e\xfc\x39\xfb\x82\xc2\x88\x00\xf0\xf8\xd4\x67\xfb\x79\x98\x6b\x7c\xe4\x21\x6a\x38\xab\xdb\xdc\x99\x09\xeb\x02\x86\xb8\x8a\xe7\xd6\x6b\x18\xc0\xe7\x1e\xba\xf6\x48\x43\x02\x34\x22\x36\x3b\xcd\x0c\x67\x25\x58\x36\x3f\x29\x56\x9b\x3c\x4c\xd6\x45\xab\x3a\xe5\x74\x20\xfa\x83\x3c\x9f\x16\xfd\xb9\x38\xa5\x2e\x0d\xe2\xc8\x1e\x08\x87\x54\xc2\x63\xba\x51\xbc\xd4\x2b\xce\xa5\x93\x67\x78\xb3\x03\xdb\x0d\xdf\x30\x1c\xb0\xc9\x52\xbe\xe4\x41\x70\xa4\xd8\xa1\x46\xe9\xe6\x46\x3d\xd7\x4c\x9e\xe1\x14\x1b\x32\xbf\x83\xb3\x66\x41\x00\x3f\x96\x5d\x0f\x0c\x36\x97\x8b\x38\xfa\x1b\xb7\x13\xba\x09\x8f\xba\x64\xe7\xdf\x84\x16\xa1\x60\x30\xee\xb7\x4d\x04\xf7\xe3\x3a\x3f\xc8\x84\xc7\x8e\x16\xa2\xc2\xc9\xd8\xc3\x26\x7f\xf0\xc8\x62\x19\x41\x1c\x8f\x63\x54\x80\x37\x97\x00\xcb\x13\x53\x70\x35\x56\xd6\x1a\xe2\xe4\x24\x60\x80\xb9\x4a\x25\x35\xc0\x63\x42\x1a\x81\xc1\x39\x10\x00\x22\xb0\x68\x59\xb0\x9c\x31\x4b\x9e\xad\x3a\x72\xf6\xa7\xa4\xe1\x35\xe4\x14\xa1\x34\x02\xf8\x36\xd3\x3d\xbc\x72\x42\x1b\x1e\x58\xbe\x10\x66\x27\xd8\x6c\x7a\x91\x16\xae\xb4\x11\xc1\xaf\x6c\x55\x74\x03\xbd\xb6\xdf\xd1\x57\xaf\x43\x62\x20\x0f\x83\x51\x50\xdd\x63\xc1\x25\xe4\xbc\x9e\x9f\x28\x46\xbd\xca\x49\xff\xfb\x82\xa9\x68\x8c\x09\x37\xf6\x9e\xb1\x49\xf7\xf3\xc4\x68\x11\x9b\x9b\x8e\xfe\x01\xb0\x36\xab\x4d\x38\xac\x58\x01\xf9\xa9\xea\x00\xbf\xcc\x58\x0f\x00\xb3\x1e\xab\x60\xd1\x83\x3b\x2b\xf1\xcc\x07\x5c\xb5\x4f\x85\x3c\x93\x9b\x87\x12\x6e\x2a\xcc\x07\xac\x98\xe3\x29\x9c\x57\x13\xf3\x41\x58\x9f\x37\x1f\x44\xdf\x2e\x52\x42\x56\x54\x25\x93\x0f\x42\x47\xaf\x67\x54\x90\xd7\xb8\x48\xd2\xe6\xd1\x2c\x5f\xd5\x5e\x1d\xdf\xa5\xe6\x34\x10\x27\xcf\xfa\xdb\xf0\xad\x81\x6a\x71\x58\x1b\x0d\xa9\x1f\x87\x31\x0d\x90\x32\xc3\xf2\x1d\x1b\x9b\x58\x15\x5a\x86\x85\x11\x13\xc3\x33\x87\x98\x45\x14\x45\xaf\xe2\x5e\xaf\x5e\xaf\xf8\xe6\xf6\x95\x5b\xd1\x2c\x1d\xd2\x2c\x8f\xe9\xa8\xa6\xbf\x1d\xfe\xa2\xe0\xa4\xc6\x6d\x10\xc3\x94\x2e\xce\xd9\x1f\x6c\xcf\x7c\x40\xa1\xed\x99\x21\x1a\xda\x9e\x39\x54\x4f\xdb\xdf\x54\xc4\x8d\xd2\x62\xe4\x6d\xaf\x5e\x7f\x16\x0e\x76\x60\xee\xf4\xc1\x12\x8d\x57\xaf\x4b\x18\x33\xa0\x23\x7f\x15\x3f\x2a\xda\x4a\x82\xcc\x49\x4d\x63\x69\xa0\xae\xf4\xb6\xe1\x2b\x1b\x5a\x2f\x4d\x07\x94\x24\x8c\xba\x38\xd4\x7f\x78\x12\xe7\x6a\x16\xeb\x9e\xc9\x7d\xdf\x50\x63\x19\x42\x91\xb6\x04\x27\xa9\xc9\xca\x40\xa5\x2b\xcd\xe6\x37\xde\xaa\xbc\x49\x81\x37\xf0\x9c\xb2\x46\x18\xce\xc1\xf8\x2e\xd1\x6a\x43\x51\x8a\xf9\xd6\x70\xa2\x21\x3c\x32\xe1\x49\xaa\xcd\x16\x12\x15\x8c\x2a\x05\x22\x1d\x8c\x72\x16\x0e\x8d\x5e\x79\xac\x1a\xba\xa8\x8f\x23\x81\x13\x0d\xb0\xa7\x07\xa8\x6f\xa0\x1d\xec\xe9\x94\x05\x78\x22\xd4\xaf\x25\x66\xf8\x81\x0c\xec\xb4\x2c\x7b\xad\x69\x17\x5f\x4d\xbb\x80\xd5\x07\x68\xc7\xb0\x7b\x43\x58\xd7\xfa\x06\x62\x9f\xe2\x5a\xbd\x2f\x97\x82\xfe\x3b\x3d\x82\x86\xe2\x17\x70\xa5\xd1\x90\x38\xd4\xc1\xa3\x8b\x11\x60\xbf\xe8\x85\xa2\x69\x7d\xb6\x44\x02\x23\xe0\x16\xa7\xfb\xc2\x29\xb7\xfd\x99\xbb\x04\xf4\xb6\x67\xc4\xa1\x3e\x00\x64\x70\x23\xfc\x09\x1e\xaf\x17\x7d\x77\x94\x66\xf9\x2e\x20\x80\xcb\x7b\x92\xd4\xe8\xdd\x30\x9f\xd4\x48\x96\x91\x89\x59\x3b\x66\xcd\xd3\x23\x0f\xb4\x46\xf2\xda\x80\x92\x51\x5e\x4b\x13\x5a\xa3\xfc\x76\xdf\xd4\x54\x23\x59\x2f\x33\x14\xe2\xae\x8b\x22\x6c\x39\x11\x67\x74\x24\x19\xdd\x47\x03\xec\x77\x23\x57\xf1\xa4\xc1\x3e\x59\x55\xfa\x90\x80\xa0\x46\x8c\x4f\xb8\xa8\x50\x37\x72\x67\x0b\x55\x82\x5c\x2b\xb7\x3d\x91\x4f\xb6\x1b\x1f\x29\x80\xe9\xc4\x27\x8d\xa8\xd1\x17\x9e\x69\x6a\xbf\xa8\x2a\x54\x12\xd5\xbc\x71\x0e\x5a\x0b\xac\xe5\xd2\x11\x0d\xc0\x81\x53\x32\x98\x88\x1e\x39\xaa\xa5\x99\x54\x70\x10\x63\xa3\xcf\x3a\x3a\x2d\xb9\xc8\xd1\xd6\xe2\x24\xa0\x4f\x35\xad\xd1\x6f\x68\xac\x84\x60\x3c\x1c\xc4\x3e\x61\xd3\x52\x9c\xd4\x94\xe2\x19\x16\xda\xed\xbb\x78\xd5\x72\x42\xb6\x76\x0d\x8c\x99\x8f\x43\x3e\x3a\x44\x4d\xd0\xb1\x0f\x16\x46\xbb\x7e\x61\x08\x25\x50\x5c\x04\x0c\xd5\xfd\x1b\x17\x91\xe0\x66\x89\xcf\x14\xdc\x1d\x9e\xb1\x8a\xd9\x16\xc7\xfa\xe4\x4d\xa7\xde\x27\x75\xc6\x92\x66\xe7\xd8\xa7\x24\xda\x6b\x68\x66\xed\xb2\x97\x8e\x07\x01\x1b\x90\x71\x52\xcb\x7b\xb4\x96\x91\x24\xa2\xb5\xae\xb5\xa6\x35\xe0\xa2\xa7\xa1\xb9\x8b\x03\x59\xeb\x10\x6f\x40\xe5\x13\xeb\x2c\x7d\x9c\x7f\x00\x1d\xcd\x91\xbb\xff\xbf\x91\xeb\x57\xd9\x3c\x47\x31\x61\x29\x39\x8d\x68\xf6\xff\x40\xbc\x5f\xb6\x90\x62\xac\x78\xa8\xfa\xed\x90\xa7\x83\xab\x5e\x44\x74\x1f\x29\xa6\x21\x87\x1e\x69\xf8\x0d\x8f\x90\x06\x69\xc0\x5c\x38\x4f\x70\x85\x29\x5e\x44\xe6\x7d\xc3\xcd\x3b\x7f\x93\x8b\x93\x33\x77\x90\xd2\xb1\xf9\x5a\xd5\x29\x33\x28\x47\x09\xed\x9e\x5d\xac\x97\xcb\xd2\x1f\x23\x91\x5e\xf8\xee\xa9\xa6\xef\x44\xb6\x3c\x65\x2a\x7c\x95\x2d\x83\xfb\x0a\xe5\x0c\xb8\xa1\xac\x0d\xa1\xd9\xf7\xfb\x27\x02\xa6\x79\x4b\x21\x7e\xb5\xb0\x33\x39\xe7\xf7\x8a\x08\xbf\x57\xa5\x4d\xbb\xce\x74\x4a\x57\x85\xc2\x80\x61\xbc\xf8\x85\xba\x26\x38\x85\xb2\x3e\x91\xae\xe5\xb2\x1e\x42\xc0\xcc\xeb\xef\x7f\x6e\xf1\x00\x8b\xd8\x90\x11\x1b\x2e\xf7\x8e\xff\x1e\x63\x4e\x11\xe4\xdb\x74\xa7\xd3\x3f\xff\x64\xe9\x9b\x2e\xd8\xac\x00\x6f\x41\x60\xdd\x43\x56\x4d\x31\xe4\x5a\x36\x52\x6f\xb8\xb0\xdf\xf7\x8c\x8a\xb8\xe5\xc3\x1a\x50\xca\xff\xc5\x69\x40\xe1\x77\x4f\x1e\x1b\x7d\xed\x81\x09\x53\x82\x2d\x67\xf3\x13\x71\x08\xe3\x04\xd8\x0c\x26\xee\x96\xdf\x25\x52\x1b\x86\x23\x63\x11\x5b\x5e\x19\x5b\x6b\xce\x3c\xfc\xfe\x93\xd7\xfd\xea\xb6\x2c\xdb\xeb\x6e\xba\x8e\x8f\xdf\xc3\x6c\xde\xb2\xe0\x4a\xa5\xbc\x70\x84\xf5\xc4\x07\x0f\x87\xd6\xfc\x03\xcc\x6a\xaa\x62\x8e\xde\x97\xdd\x51\x0c\x56\x47\x0e\x56\xd6\xdf\x51\xe1\x32\x8c\xdb\x03\x45\x11\xea\x8b\x69\xa7\xbc\x9f\xee\xc3\xc2\x0a\xd7\x91\xb0\x47\x0b\x51\x61\xaa\x3e\x32\x5e\x28\x0e\x70\x54\x1a\x5e\x14\xa7\x23\xa2\x76\x2f\x77\x71\xc2\x85\xca\x3b\xf2\x24\xad\x9f\x32\xc4\x8d\x46\x81\x78\x09\x56\x68\xdc\xde\x50\xf7\x51\x84\x02\xa3\x15\xe0\xc8\x16\xdf\x14\x45\xdc\x6a\x62\x54\x1c\xe8\x40\x19\x01\x14\x40\x55\x21\x2b\x88\xe6\x3d\xd5\x61\x2e\x4e\x14\xbb\xbe\x8a\x3d\x7a\x46\x03\x38\x2a\x41\xc0\x96\xae\x8b\xa8\x38\x0a\xe3\x5c\xa0\xe5\x7d\x77\x68\x38\xc9\xad\x1e\xa0\xf2\x4e\x40\x99\xc2\xe9\x6b\xfc\x96\x73\x79\xd9\x95\xba\xae\x72\x9b\x0d\x05\x5a\x0e\xdd\xf2\x9d\x46\x83\xf2\x82\x8a\x13\x37\xa9\x50\x23\x66\x29\x28\xbd\xba\xd3\x96\x97\x57\x43\x3d\x04\x05\x5a\x79\xa2\x8e\x83\xae\xc5\xd6\xee\xae\xeb\x44\x62\x27\xc6\x77\x7d\x4d\x87\x82\x5a\x5c\x79\xc2\xd7\xc7\x41\x97\xba\x8e\xb5\x8a\x01\x4b\x1f\xf9\x46\xbd\x0e\x99\xfa\x4c\xa2\xee\x4b\x39\x26\x52\x98\x1c\x46\xaa\x24\x9b\x81\xd5\x4d\xd9\x23\x41\x94\xf9\x07\x3e\xf2\x50\x88\xa9\x5c\xef\x23\x79\x0c\x10\x1a\xd0\x13\xf7\x18\xb3\xe3\x50\x3f\xef\xf1\xa5\xf9\x85\x8b\x5a\x8c\xc2\x3e\x8a\x10\xed\xa6\x81\xe2\x1f\xb2\x50\x50\xe3\xfd\x88\x9a\x77\x71\x02\x77\x42\xdc\x76\x34\xc4\x90\x27\x88\x31\x8a\xbe\x1a\x29\x89\x02\x9c\x6d\x1a\x65\x09\x45\xa4\xb1\x88\xa4\x5e\xb7\xb6\x4a\x38\x89\xb9\xb4\x4e\xcd\x59\x42\xbb\xbd\x80\x4d\x4e\xab\x10\xd0\x23\xe4\xa3\x10\x11\x85\xea\x62\xa6\x52\x56\x56\x65\x11\x59\xe5\x6c\x85\xe0\x80\xfb\x18\xb2\x30\x77\xa3\x59\x2c\x76\x9c\x7d\x9f\xe3\x41\x4e\xb3\x91\x22\xa5\x27\x69\xb2\xa6\x48\x7e\x9a\xfa\xe6\x02\x9c\x93\x54\x1b\x45\xd9\x8d\x74\x03\x97\xef\x13\x57\x75\xb1\x25\xe9\x32\x56\x73\x33\x2d\xbc\x39\x3c\x70\xc9\x18\x29\x61\xda\x2b\x21\x25\x6d\xdf\x3d\xd2\x08\x1a\x6f\x5d\x4e\x15\x08\x9d\xc3\x72\x67\x55\xec\x07\x48\x12\xd4\x34\xae\x44\x84\x6a\x9a\x64\xba\x96\x66\x35\x4d\x72\x56\x7b\xab\xf4\x05\x56\x48\xbd\xae\xff\xbb\xd2\xf9\xee\x6d\x52\xa3\x71\xde\xa3\x99\x2c\x8f\x09\x82\x5c\xa6\x50\x08\xd3\x4b\x1a\x18\x6d\xeb\xf3\x84\xcc\xca\x0e\x2c\x3a\x2f\xa3\x8d\x72\x9b\xd7\xaf\x49\x90\x74\x4e\x82\x2c\x85\x09\xd1\x74\x4c\x40\x59\x81\x99\x83\x1a\x0e\xc8\x27\x14\xb1\x22\xa0\x9f\x3b\x7e\x97\x32\xe1\x72\x36\xf3\xd9\x78\x0e\x94\x99\x5a\x3d\xae\x97\x63\x12\x0c\x8b\x73\x9b\xb6\x4b\x0c\x6c\xf6\x87\x15\x07\x1f\xf3\xa2\xc8\xd7\x9e\xad\x1c\x60\x37\xff\xfc\xc3\x42\x16\x6a\x22\xb6\x52\x23\xb6\x3a\x23\xb6\x22\x23\xbe\x00\x5b\x86\x13\xe0\xdd\x90\x6b\x35\xb3\x05\x1b\x56\xe3\xa0\x81\xc3\xd0\x61\xc1\x7a\x5d\x0f\x1a\xf8\x1a\x9e\xb0\x80\x03\x9e\x61\x79\xa1\x11\xcc\xc0\x2e\xa1\x79\xea\xeb\x55\xf3\xc1\x3b\x91\x5d\x42\x2b\x97\x9c\xa1\x7a\xc9\xb9\x13\x95\xd9\xab\xca\xfa\xbb\xff\x24\xfb\xee\xab\xd9\x3b\x22\x77\xc0\x72\x57\x4f\xd0\x63\xb2\x24\x93\x5c\x8d\x7d\xbc\xe8\xb1\xed\x74\x99\xcd\xa3\x5e\x44\xaa\x8e\x82\x40\xf4\x84\x13\x9d\xb2\xf7\x9c\xa4\x79\xb1\x9f\xd1\x84\x68\x4d\x0a\x0f\x09\x01\x5e\xf5\x10\x45\xc0\xf7\xc0\xa0\xb8\x13\xeb\xd0\x3c\x73\xba\xb4\xa9\x22\xe8\xbd\x0c\x88\x47\x07\x36\x81\xd2\x12\xd5\xbf\x60\xd4\xe7\x47\x97\x73\x36\x81\x7b\x94\x04\x34\x2b\x4c\x03\x13\xc3\x99\x15\x5a\xa1\x6c\xf9\xc2\x96\xd3\xe7\xc5\x1a\xad\x10\xb3\xff\xdd\xaf\xae\x9d\x88\xa8\x7a\x7d\x02\x53\x07\xfb\x00\xd7\x56\x2c\x60\x82\x7f\x2b\x0e\x6c\x72\x93\x6b\x85\x6f\x61\xd8\x62\x86\xb0\xbf\xa4\xdc\x8a\x1a\x2b\x98\x1b\xab\x9a\x19\x33\x9f\x8d\xb4\x11\xa6\xce\x29\x93\xd0\xbb\x2c\x27\xa6\xb0\xf3\x2f\xdc\x94\x46\x44\x67\x31\x6c\x09\x0f\x5a\xb7\xb7\x3a\x41\x4d\xc3\x26\x62\xf3\x1a\x54\x36\xaf\x03\x1c\x88\xad\x6b\x3f\xd6\x07\x86\xc1\xb6\xa8\xf6\xa0\xdc\x9a\xae\x32\x0e\x0d\x8a\x4a\x0c\x8c\xe5\x1b\x2d\x50\x16\x08\xd9\x14\x92\x3e\xd6\xb4\x06\xf7\x84\x3a\x80\x9a\xad\x62\x20\xaf\xcc\x77\x01\x20\x2b\x51\x43\x83\x8d\x89\xd6\xe0\x70\x0d\x4d\x6e\x50\xf8\xae\xb5\x9c\x29\xb5\x06\x20\x70\x06\xa6\x8f\xa3\x5b\x86\x96\xcd\x02\x67\xbe\xcb\xb7\x97\x8a\xa2\xa3\xe5\x24\x5b\xa1\x93\xc8\xca\x0d\x71\xbb\x87\x86\x98\xe1\x4f\x5c\x27\x89\xf5\x21\xe3\xfa\x19\xcc\x90\xc3\xe9\xf4\x33\x54\x69\x68\xb4\x86\x78\x68\x3e\xd8\x1c\x0c\xbf\x3c\xd8\xc3\x59\x29\xf2\xd2\x6e\xe2\x76\xf7\xd9\xf0\xe5\xdf\xfd\x6e\xe2\x4e\xa7\xec\x17\x63\xbc\x13\x15\x3e\xc5\x86\xb2\x9f\x0d\x0d\x83\x95\x5b\x70\xf0\x5e\x44\x75\x8a\x98\xbe\x88\xf9\x5a\x02\x0d\x45\xd4\x63\x54\x44\xdd\x89\xa8\x62\xfe\x19\x1a\x68\x08\x06\x7b\x87\xdc\x32\x51\x63\xc8\x0d\xce\x34\x86\xdc\x9e\x4c\x63\x28\x0c\xf9\xee\x46\xf6\x4e\x34\x77\x40\xa0\xda\xb7\xae\xa5\xa1\x38\x4b\x8c\x13\xd6\x58\x8d\x0b\xda\x48\x0c\x07\xea\x34\x9c\xcd\x66\x3f\x75\xbf\x7b\xe6\xcd\x5f\x63\x88\x31\xdd\xdd\x77\xa7\x53\x9f\xc9\x35\xfd\xae\xe7\x4e\xa7\xed\x9e\x31\x5b\x6a\xd0\xec\x87\x54\x3a\x50\xae\x1c\xc3\xa1\x2e\xc7\xbc\x72\x44\x1b\x47\x8a\xef\xaa\xf2\xcc\x45\x58\xe7\xe7\xf3\xbb\x1e\xb4\xac\x2d\xec\xd9\xde\x56\x68\x48\x2f\xe3\x98\x3a\x86\x30\xe8\xcf\x84\x2f\xe4\x35\x30\x57\xf7\x2e\x6c\x3d\x73\x55\x9a\xdb\x88\xe0\x97\xed\x67\x62\xff\xa0\x68\xe7\x99\xd8\x3f\xa9\x72\xca\x1c\x0e\x15\xa3\x90\xa7\x13\xec\x61\x8c\x7f\xd0\xd6\x0f\x6a\xff\xa4\x8e\x10\x3c\x20\xed\xf3\x44\x39\x1e\xfc\x91\x8e\x6b\x3e\x19\x0c\x68\x50\xe3\x9e\x2d\xcc\x87\x78\x34\x26\x83\xf8\x99\xc0\x79\xe0\x1e\xc9\x09\xec\xbd\x75\xa3\xb4\xa1\xd6\xa3\x35\x2d\xa1\x8f\x5a\xad\x4f\x27\x8f\x69\x16\xbc\x35\x1c\xd2\xe2\x53\x53\x8b\x60\xb0\x68\x6d\xf7\x19\x2f\xc4\x25\xc2\x19\x1c\x39\x71\x35\xeb\x32\x78\x97\x63\x62\x0e\xb9\x1c\x86\x64\xa3\x9c\x79\x6e\xbd\xfe\x53\x87\x00\xfa\xae\x2f\xdc\x39\x7f\x01\x2b\xf9\x80\xc0\x30\xca\x5c\xbe\x2b\xef\xfb\x4e\x42\xfe\x5d\x3c\x3a\x7b\xb5\x70\xee\xd9\x90\x63\x65\x4b\xf0\xec\x87\x1e\x0e\xd1\x9b\xd4\x50\x14\x4e\x78\x2d\x5e\xa4\xb5\xf0\x33\xd6\x51\xba\xdc\xc6\xe4\x99\xcf\xc3\xea\xb3\x57\x78\xe2\xc3\x84\x30\x7f\x5e\x2c\xee\xee\xc3\xdc\x44\xf9\x95\x3d\xad\x5c\xd9\x53\xfe\x26\x56\xdd\x99\x88\x83\x4f\xd2\x0d\xd9\xac\xca\x77\xe0\x91\x14\xec\x23\xf3\xc1\xe1\xe3\xaa\x2f\x67\xfc\xc2\x03\x72\x84\x77\x53\x3d\x32\x50\xc4\x9a\x21\x32\x50\x81\x01\x47\xc6\x6c\x36\x9b\x5d\xe3\x70\xc8\x9f\x3a\x9f\x89\xa3\xfb\x6b\xd6\x59\x44\xe8\xa4\x88\x13\xfc\x71\xae\x19\x6f\x44\xe8\xf8\x35\x13\xa7\x27\x61\xf7\x2b\x18\x44\xdd\x7f\x0d\xe2\x4c\x42\x7c\xaf\x9a\x3e\x8d\x86\x42\x4f\xbf\xa2\x90\xc5\xc0\x89\x6b\xc6\xc1\x74\x7a\x3a\x73\x1e\xe7\x9f\x94\x94\x5a\x86\x02\xf8\x15\x1f\x3f\x66\x1c\x28\x8e\x78\x7d\x47\xee\xdc\x67\x86\xb3\x72\x6d\x5e\x90\xbf\xa1\x44\xac\xf9\x25\x41\xdd\x6b\xd6\xe4\xdc\x82\xec\x9b\xf1\x3f\xae\x47\xf7\xc1\x83\xaa\xdf\x65\x4b\xad\x02\xb3\x55\xed\xa1\xa7\xf8\x62\x16\xe3\xc8\x3e\x65\x99\xf6\xfe\x79\x31\xfb\xee\xcc\x89\x16\xdf\xeb\xc5\x65\x1e\x99\xbd\xd8\xc7\x42\xee\xfd\x11\x00\x8a\xd3\x03\xc7\x87\x4b\x3b\xdf\x7c\x40\x01\x56\xbd\x78\x2b\xdb\x63\x83\x35\xf5\x08\x2f\xdd\xb3\xca\x0e\x41\x58\xb7\x63\x15\x5f\xb9\x36\xdb\x04\xff\xcf\x34\x9d\xf2\xf3\x9f\xea\x15\xd4\xaa\x3c\x74\xf3\xcd\x50\xae\x5b\xbe\x19\x1a\x8c\xee\x50\xb1\xb3\xf9\xc5\xef\x12\x17\x97\x41\x18\xb0\xca\x25\x34\x44\x22\x1f\x53\x58\x01\x5e\x66\x0e\x0b\x60\x1f\xfc\xdf\x99\x41\x68\xb4\x18\xc2\x20\xb4\x75\x0e\x2f\x15\x05\x91\x9c\xb6\xa7\x53\x3d\xc0\xfd\xa1\x4e\x51\xa1\x92\x68\x18\x88\x65\xc1\x81\x51\x6a\x0b\x3b\xd7\x66\x6f\xb8\xe0\xe8\x7d\x39\x13\x78\x26\x9d\x60\x9d\x54\x58\x61\xd4\xeb\xc4\x64\xcb\x3e\xb8\xe8\x27\x2d\xd2\xf5\x5d\x71\x06\x73\x6d\xde\xde\xfe\x8f\x0c\x76\x7c\x70\x2e\xf6\xf2\xc0\xcf\x75\x42\x8e\x11\xcd\x35\x22\x78\x27\x65\x53\xb5\xee\x9b\x43\xfc\x52\xba\xd7\xf7\xcd\x21\x2b\xfe\xf3\xe4\xb5\x71\x7f\x97\x43\x07\x78\x5a\x62\xcd\x15\x0b\x80\xe2\x44\xac\x5e\xe7\x77\x59\x2d\xaf\x4b\xca\xaa\x7d\x7f\x20\x8b\x9a\x47\x6c\xe9\x60\x89\x3f\x1e\xe6\x7b\x96\x48\x96\x8a\x49\x77\x39\x90\x2b\xc2\xac\x33\x78\x40\x30\x59\x68\x0d\x00\xf1\x7d\xb1\x7e\x73\x21\x55\xba\x8c\x64\x59\x3a\x4f\xbf\xcc\x22\x32\xf8\x6a\x96\xdb\xc7\x7f\x92\x45\xe6\x34\x84\x89\x08\x79\x61\x37\x97\x97\x89\x14\x90\x1b\xc4\x60\xcf\xe8\xfa\x2e\x0e\x80\xb9\xbe\xbf\x00\x8a\xe8\xaf\xba\x40\xa8\x74\x7e\x27\xac\xd7\xc3\x2e\x5b\x74\x75\xf6\x0f\xb8\x15\x56\xbb\x48\x38\x9d\xea\x21\x7e\x59\xec\x15\xa1\xe1\x2c\x1d\x93\x72\x29\x16\xaa\x22\xf5\x7a\xca\xdd\xe0\xae\x86\x44\xf7\x8d\x56\x68\x3e\xe0\x1e\x0b\xd9\xfa\xad\x24\x8c\x49\x3d\x2c\xde\x37\x96\xe3\x84\x67\xfe\x26\x1b\x55\x85\xdf\x89\xd0\x1c\xe2\x84\x85\x5b\xd4\x7e\x99\x01\xf7\xae\x17\xba\x83\xc2\x04\x85\xfa\x21\xef\x05\xf1\x87\xe5\xed\x73\x70\xa8\x13\x03\xba\x3d\x83\x3a\xce\x5e\xc7\xa9\x0c\x28\xc0\x2c\x47\x2f\x77\x0e\x06\xc3\xd5\x83\x53\x81\x16\x63\x58\xd1\xa7\x0f\x0e\xab\x76\x3b\x4a\x84\x44\x45\x06\xd2\x91\x4e\xaa\x43\x8e\xb0\x21\xb7\x72\x6d\x7e\x5d\xa8\xab\xb2\x38\x9c\x13\x65\xd9\x02\xcd\xe6\x6b\x73\xe0\xff\x22\x83\xb2\xea\x0a\xe6\x1c\xbe\xd2\x79\xdb\x99\xca\x9c\x68\x7e\xe2\x89\x96\x32\xe7\xec\x5f\x30\xa7\x9d\xbd\xb6\xe4\x11\x15\xd9\x2f\x99\x33\x0c\xe7\x07\x38\x1b\x3e\x64\x15\xe3\x52\x1a\x91\xbd\x14\x64\x3f\x54\x16\x63\xb0\xfd\x95\x70\xfd\xfd\x12\x07\x36\x13\x42\x10\xdf\x69\xfb\x2c\x28\xcf\x3a\x4e\x4b\x6b\xe0\x4c\xf4\xe3\xf2\xdd\xaa\xd7\xd7\x77\x43\x82\xfc\x25\xdb\x4b\x06\x8e\x6a\x5a\xc3\x6f\xbc\x45\xb0\xc5\x14\x17\x4f\xda\xdb\x86\xee\x71\xd9\xc2\x03\x99\x87\x18\x8d\xb7\x9a\xf9\x56\xe8\x78\x7a\x66\x96\x0e\xa8\x11\x60\x8f\xd5\xf8\x65\x26\x16\x9f\x00\xa2\xd9\x5a\x0d\x01\xec\x23\xcf\x1c\xb2\xf1\x21\x6b\x38\xa0\x2e\x38\xb8\x17\x96\x59\x14\x0f\x07\x20\xae\x39\x5e\xa3\x61\xc8\x4f\x8f\x8d\x68\x99\x61\x6e\x31\x80\xce\xf3\x25\x5a\xde\x1b\x86\x61\xd9\xd3\xbe\xba\x48\x78\x28\x5d\x90\xfc\xd6\x9a\xca\x46\x65\x50\x9e\x32\xfb\xf8\x27\xcc\x09\x8e\xbc\xbc\x33\x1f\x54\xb7\x96\xd7\xe6\xb3\x35\xd7\xbf\x8a\x36\x3c\x59\x6c\xc3\x58\x69\x43\x6e\x36\xbb\xf0\x1d\xe5\x63\x6f\xfe\x92\xda\x03\x57\x1e\x4c\x54\x14\x97\x59\x70\x14\xfb\xc9\x5b\x6c\x38\xbe\xc5\x0c\xf9\x05\xf3\x69\xb6\x9d\x65\x64\x62\xcb\xab\xcd\x83\x50\x89\x85\x2b\x6b\x71\x0d\x5d\x8b\xf3\xda\xa8\xbc\xf7\xac\x25\x69\x22\x95\x35\xe5\x15\x28\x57\x6e\xb9\xbf\xd5\xb9\xa6\xce\xbc\x83\xc7\x5f\x95\x5f\xb9\x53\x95\x25\xa6\x59\x71\xc0\xc4\xb6\xc6\x10\x18\x81\x1d\x00\x3a\x18\x8c\x54\x45\x00\xf5\x86\xa2\x72\x6d\x10\x62\xbf\x4b\xc5\x15\x43\xa9\x2d\x17\x1a\xe5\x05\x52\xd9\xaa\xfc\xc2\x07\x4e\x76\xe6\xba\x8c\x7a\x42\x10\xf2\x63\xe6\x10\x4e\x50\xca\xcc\xd5\x63\x94\x28\x7e\xa0\xdc\x48\x77\x6d\x14\x3f\xd3\x5a\x10\x87\x21\xcd\x68\x92\xf3\x27\xa9\x5a\x63\xa5\xcc\xd9\xd0\x6a\x3a\xdb\x82\xca\x4a\x87\xf2\xb8\x45\xde\x28\xe7\x6c\xbf\x6a\xa8\xd5\xed\x63\xcb\xe9\x6f\x01\xcd\x7d\x49\x33\xeb\x86\xd0\x5d\xfa\x28\xec\xf6\x5d\x63\xc1\xbd\xe6\x03\xcd\x26\x70\x0c\xc4\x89\x93\xc7\xf0\xe2\xb4\x99\x55\x54\x65\x38\x14\x87\x5f\x66\x4e\x68\xfa\x38\x72\xe4\xd5\x52\xb3\xfd\x1e\x63\xe1\xdf\x39\xc2\x01\x1a\xc7\x7a\x70\x2b\x57\x52\x44\x90\x65\x80\xe3\x60\xe0\x1e\xdb\xae\x35\x00\x18\xae\xac\x8c\x99\x8f\x03\xe7\x57\x19\x7c\xc5\x1f\x6b\x20\x86\xd9\xb5\xe9\xef\xcc\x5b\x85\x52\x6c\x61\x4d\xa7\x7d\xf5\xa0\x10\xf0\x3e\x5b\x7a\x39\xa4\x90\x7a\x70\xb8\x2d\x5c\x19\x0b\x16\xe4\x69\x8d\x04\xc1\x45\xfa\x38\x9a\xe7\xc6\xb2\x2e\xa8\x19\x0e\x4c\xc6\x97\xf7\xf3\xf4\x2c\x92\xe0\xef\xe8\x5d\xe2\x56\x9c\xd5\x96\xc3\x80\xf5\x64\x41\x47\x3c\x9a\x27\x05\xb1\x71\xa6\x28\x28\x09\x75\x91\x94\xb7\x90\x56\x9d\x8c\xfc\x1d\xbd\x09\xf3\xd9\xe5\x70\xd9\x9b\x1e\x5f\x76\x09\x02\x40\xc1\x52\xa0\x40\x05\x4a\xbd\xb9\xbd\x69\x39\x1d\x39\x04\x6e\x28\x01\xb4\xea\xd4\x4a\xea\x9f\xfb\xaa\xda\x48\x2b\x30\x1f\x84\xf4\x4d\xe0\x4e\xb0\x68\x72\x03\xf6\x5b\xe3\xce\xdf\xec\x04\x41\x20\x1e\x75\x5e\x93\x2c\x4a\xa8\x83\xca\x7e\x7a\xfe\x58\x0b\x8a\x9d\x8c\x74\x78\xc6\xb3\x72\x6d\x4e\x96\xbd\xed\xda\x4b\xf5\x17\x3f\x1d\x8c\x6c\xb9\x01\xcf\xd2\x47\xf1\x71\x12\xa2\xa1\x2d\x65\x7f\xd4\x4e\x8d\x99\xb3\xbb\xbc\xc0\x20\xa9\x16\x76\x6d\x9e\x77\x96\x31\x9c\x56\x5b\x25\x3f\x5a\x06\x14\x55\x81\xee\xa3\x79\x61\xc7\xfa\x04\x2f\x09\x96\x2e\x17\x88\x34\xbc\x4f\x95\x55\xc5\x53\x16\x99\x35\x79\x8c\x75\x22\x17\x55\xcf\xe0\xc2\xfa\xee\xe2\xce\xe4\x1e\x16\x37\xde\xc9\x86\x0b\x44\xc0\x39\x34\xa3\xc4\xa8\xf4\x14\x55\xc6\x91\x94\x9c\x55\x29\x39\x13\x94\xcc\x2d\xef\x15\xb3\x6b\x96\xe3\xab\x0b\xbc\xaf\x2c\xf0\x7e\xb9\xc0\x7b\xc6\x8c\x11\x47\xdf\x2f\x12\x3f\x2c\x88\x2f\x17\xeb\xe1\x82\x53\xd3\x3b\x26\x78\xdd\x0d\xb9\xd7\xe5\x8c\x08\x4b\x7a\x77\x43\x7e\xce\x79\x17\x11\xfc\x92\xd1\xc0\x1e\xf5\x90\x37\x18\x53\x3b\x8f\x50\x94\x51\x9a\xd8\x27\xaa\x43\xb1\xa4\x50\xd9\xb0\xb6\x3c\x71\xb3\xb5\x4d\x08\xba\x1b\x22\x82\x52\x02\xfb\x23\x6a\xcc\x56\x72\xa2\x0f\xfe\x4e\x15\x5d\x7d\x15\xe8\x21\xb6\x65\xbf\x8b\x13\x44\xd9\x7f\xf2\x24\xbc\xa3\x96\x8b\x59\xc0\x4f\x1c\x31\xa6\x46\x88\x89\x79\x39\xd4\x8b\x0d\x3d\x05\x65\x84\x90\x65\x93\x51\xfc\x65\x08\x7f\x84\x6b\xa1\x90\xfd\x37\x0c\x27\xf8\x04\xb0\x21\x0e\xa7\x53\x89\x42\x64\x44\x01\xe6\x50\x4e\xc0\x11\x5a\x18\x07\x2d\x8a\x9b\xb6\xb5\x15\xb4\x02\x6c\xd9\x14\x5b\x72\x1f\x46\xd7\x02\x14\x61\xbf\x70\xf5\x1a\x09\xe3\x5d\x01\xe2\x25\x52\x14\x19\x06\xea\x63\x1f\xdc\xb3\x37\x2d\x0b\x0d\xb0\x6f\x8e\x7a\xe9\x23\xdc\x5c\x8a\xd7\x2b\x83\x7a\x5d\x1f\x14\x16\xdb\xf8\x05\x02\xb7\x5d\x1e\xad\x05\xc6\x7a\xf8\xae\x6f\xa0\x21\xee\xaf\x25\x68\x84\x2d\x67\x24\x94\xf5\x47\x72\xc9\x1f\xf3\x93\x67\xb6\x3d\x44\x0f\x6c\x60\x8c\x17\xa8\x18\x1b\x06\x7a\xc6\xbd\xee\xc4\x73\x75\x7d\x2c\x91\x3a\x0f\xac\xd5\x76\x08\x9b\xaf\x86\xfa\x53\x0f\x35\xd1\x03\xaf\xd9\x0e\x4e\x22\xa2\xfb\xdc\x95\xf9\x99\x78\x2a\x81\xf2\xc8\x40\x7b\x6a\xca\x89\x90\x87\xd0\xa8\x67\xa0\x13\xec\x9b\x41\x46\x1e\x7f\xd2\x2c\x3d\x8a\x13\xda\x5a\x69\x82\x5d\xb5\xa4\x35\xde\x8a\x5a\x7a\x32\xd4\x3b\x3d\xf4\x8c\x1e\x0c\x94\x0c\xf5\x3d\x94\xac\x41\xd8\xda\x3a\xa9\xd7\x93\xa1\xfe\xbd\x87\x4e\x44\x5a\xa7\x87\x86\xe8\xc1\x30\x6c\x91\x27\x79\x05\x6e\x07\x3d\xaf\x25\x65\x9e\x3e\x20\xe4\xb9\x76\x8a\x82\xca\x04\xb5\x8e\x63\x4c\xcc\xde\x90\xb1\x0c\x7d\xf6\xc4\xeb\x48\x8c\xc7\xf5\xba\xce\x52\xda\x84\x33\x93\x3f\x5e\x10\x40\x8c\x87\x60\xea\x02\x98\xf6\xa6\x67\x20\x08\xb0\x58\x08\x3c\x11\x22\x9e\x43\xb0\x0c\x0f\x85\x15\xe6\x8a\xbf\xde\x44\xde\x33\x12\xac\x93\xe9\xf4\xd4\xe0\xef\x59\xe4\xe4\x7e\x17\x11\x38\xe4\x52\x95\xcf\xd3\x61\xb9\x01\x2a\xdd\x25\x12\xf9\x86\xe9\xae\x70\x7a\xef\xc9\xa8\x7e\x01\x35\x64\x83\x1f\x22\x04\xcc\x70\x08\x8f\x1f\x60\xa4\xc5\x27\x58\x28\xe6\xdf\x9e\x60\x4f\xd8\xb4\xeb\x63\x61\x56\x6e\x7b\x82\x83\xd9\x19\xd1\xd3\x85\x37\xaf\xca\xe1\x4f\x7c\x82\xc4\xb0\xbd\x3d\x71\x16\x14\xec\x84\xea\x96\x27\x6f\x49\x7c\xe7\x4e\xdc\x30\x08\xea\xed\x05\x4a\xc5\x0e\x53\x64\x9c\x4e\x09\x9b\x6a\x8b\x1b\x2f\x7f\x3a\x25\x5b\x3e\x5b\x6a\x80\x2a\xf3\xdb\xab\x3e\xbb\xae\xfa\x33\x01\xd3\x5b\xb6\xfc\x89\x1a\x2a\x5c\xbe\x1f\xaa\x47\x2f\xe9\xb0\x7b\xe4\x16\xe6\xef\x90\x8f\x4e\x05\xcf\x0e\x36\xb1\xb7\x46\x1c\xf9\xce\xe8\x60\x53\x6e\x60\x0e\x36\xb1\x7c\x7e\x7b\x30\x22\x78\xff\x4e\xdf\xbd\xd3\x03\xc3\x4c\xe5\x86\xee\x6b\x11\x4b\x21\x76\xf6\x43\xbf\x1f\xa2\x74\x68\x38\x2b\xf7\x0b\x84\x0a\xff\x3b\xf7\xaa\x98\x75\xea\x10\x7c\x74\xa7\xcb\x22\x90\xc4\x8a\x9a\x6b\xba\x70\xdf\x16\x9f\x18\xeb\x82\x9a\xa2\x4b\x1d\xdc\xe9\x55\x2d\x01\x75\x71\xc8\x86\xba\x58\x1b\xc6\x97\xb8\xeb\xce\x32\xa0\x84\xc9\x65\x24\x89\xe8\x6b\x07\x58\xe3\x4b\xf0\x24\x4c\x1f\xd5\xbe\x69\xcc\x1c\x9e\x9b\x3e\x2c\x6e\xdd\x19\x4f\xe7\xb2\x56\x18\x6e\x70\x3f\x5c\xd9\xab\x6f\x27\x4b\x7d\x50\x1f\x64\x60\x50\xbb\x84\x7f\xc5\x03\x4a\xf8\xf7\xb5\x67\x70\xcb\x29\x73\x6f\x9a\xca\x6d\x53\xf1\xae\x09\x95\x0e\x87\x25\x69\x55\xa5\x75\x19\x1b\xf2\xcb\x9b\xee\x85\x70\xa4\x1a\xe2\xc8\xfc\x16\xe8\x6c\x7d\x88\xcc\xde\x48\x0f\x0c\x27\xe4\xae\x65\xaf\x3d\xd2\x08\x1b\x51\x68\x38\x01\x8f\x18\x47\x8d\x00\xbe\x85\x7a\x65\xe5\x35\x14\xad\xba\xf2\x86\x11\x20\x3b\xe8\xe6\x87\xf6\xef\xef\x58\xbb\x35\x3e\xb4\xdf\xbf\x63\x6d\xd7\x68\xb6\x37\xdf\xb1\xf6\x6b\xe8\x42\xe7\xb2\x45\xba\x9b\xae\x6d\xa9\xed\x39\x1a\x56\xac\xbf\x4e\xa7\xa7\xe5\xdd\x66\x1a\x55\xdc\x23\xa1\x48\xf1\x5b\x17\xd6\xeb\x51\x37\x5c\x6b\xba\x18\x6f\x7b\xa4\x15\xd8\x1e\x9b\x03\x09\xf2\xbb\x7d\xa2\x53\xd4\xb4\x0c\x17\x7c\xa0\x8f\x16\x1a\x88\x77\x0b\x79\x4d\x66\xb9\xe2\xcd\xa7\x5f\xaf\xf7\x62\xdd\xe7\xa7\x87\x3a\x85\xf3\x67\xb9\x70\x3b\x8a\x87\xf9\xaa\x4f\xf4\x50\xbe\xea\xe2\x46\x04\x5f\xf4\x9b\xa0\x61\xcc\xd6\x23\xb6\xe9\x4a\x23\x82\x02\x6e\x8c\x12\x85\x38\x94\x1e\xcb\x75\xd3\x58\x8f\xd0\x2e\x35\x1c\xbf\x25\x3d\xa5\x53\x78\x06\x6b\xc3\x5c\xcc\x5d\x41\x31\x46\x07\xb1\x9e\xf8\x04\x05\x43\x79\xc2\x5b\xbe\x92\x83\x5f\x6e\x49\x81\x3f\x46\xe3\x1a\x2a\xdc\x7e\x41\x20\x6c\x08\x30\x04\xda\xd2\x2b\xd6\x13\xd8\x39\xf1\xd7\x31\xe6\x78\x44\x4f\x60\x4d\xdc\xed\x91\x8c\xf8\x39\xcd\x46\x07\xe1\xf6\x03\x89\x07\x6c\x53\xab\x55\x66\xd2\xeb\x90\x60\x32\x2b\xe8\xf9\x67\x05\x28\xcf\x01\x35\xd4\x09\xc9\xbf\xcc\x5e\x3c\x1d\xd4\xd0\xd5\xbf\xce\x3c\xf7\xce\x50\x43\x74\xf8\xf7\x18\x76\x99\xa4\xc0\x11\x68\x28\xab\xb0\x9f\x0f\xf8\xac\x64\xff\xdc\x04\x54\xfd\x2c\x53\xbf\x64\x24\x88\x69\x92\xab\x50\xf4\x81\x38\x2b\xaf\x12\xb1\x43\x0a\x12\x06\x15\x12\xb8\x70\x3a\x50\x7a\xc0\x6b\x28\xb6\xb3\x2c\x7d\x94\x48\xc6\xa9\x8a\x64\x0c\x06\x39\xc6\xe9\xdf\x23\x39\xe3\x87\x8f\x12\xcd\xa8\x42\x0b\x1f\x5e\xa3\x7f\x40\xcb\x1e\xc9\xa9\xc4\xe1\x55\x70\xf0\xf7\xe7\x5e\x89\xc3\x5b\xe8\xd1\x9e\xd2\xa3\xff\xc9\x90\x78\x8d\x08\x50\x2b\x78\xad\x75\x7f\x9d\xeb\x9f\x37\xc7\xeb\x4d\x0a\x88\xfe\x4f\x1a\x05\x30\xfd\x1f\xb5\x0c\xe0\x7a\xa5\x79\x9c\xc7\x38\x09\xd2\x47\x93\x67\xac\xd7\x2b\x9f\xe6\x20\x25\x01\xcd\x96\xc7\xb2\xde\x3d\xf8\x45\x52\x95\x88\x7a\x5d\xff\x87\x90\xaa\x6c\x04\xfe\xc8\xe5\x41\xcd\xa8\x6b\xb9\x70\x80\xb0\xb2\x52\x2a\x53\xe4\xc3\xca\x4d\x31\x31\xd3\x84\x61\xc6\x8a\x49\xa0\xf1\x3c\x48\x10\x8f\x86\x24\xf7\x7b\xed\x07\x9a\xe4\x2a\xe4\xc3\x3c\xe4\x88\xe6\x67\x24\xef\xa9\x30\x8f\x0b\x30\x3e\xdb\x89\x7e\x57\x61\x9e\x96\xc3\xfc\x50\x61\x26\x8b\x65\x25\x15\xb2\xb7\xe7\x01\x22\xca\x7d\xcb\x2a\x30\x5f\xe6\x61\xfa\x74\xb2\x9b\x06\x15\x98\xfd\x79\x98\x1e\x49\x82\x01\x5d\xa8\xfc\xc1\x3c\x9c\x17\x57\x09\xfa\x3a\x0f\x40\x06\xf9\x21\x9d\xa8\x20\x87\xf3\x20\xa0\xd6\xaa\x42\x1c\x2d\x61\xf1\xe9\x90\x25\x8d\xb0\xa7\x7a\x7c\x5c\x52\x7b\x0e\xa7\x62\x3b\x59\xc0\x96\x93\xbc\x52\xfb\xd3\x85\xfe\x51\x14\x56\xc0\x9c\x2d\x29\xeb\x72\x1e\xd1\xf9\x62\x47\xcb\x28\x09\x26\x50\xa2\xdf\x83\x59\x5f\x01\xbf\x98\x07\xf7\x49\xe2\xd3\x81\x0a\x72\x39\x0f\x72\x47\x73\x32\xc7\xd0\xce\x02\x1a\x78\xc1\x9f\x77\x48\x16\xd1\x4a\xf3\x5d\x2d\x40\x0e\xd8\x72\x54\xe9\x97\xdf\x96\xc3\x54\xfa\xe5\xf5\x22\x4b\xd3\xa1\x0a\xf0\x7d\x1e\x20\x8f\xf3\x41\xa5\xee\x3f\x16\x3a\x8a\x97\x66\x79\xa5\x79\x7f\xce\x83\x54\xa7\x00\x05\xd9\x9b\x85\xe2\x16\xaa\x4e\xee\xe7\x07\x78\x46\x1e\x59\x71\xb0\x2d\xbc\xc7\x5a\x46\x07\x24\xa7\x01\x67\x9a\x86\xfc\x7b\xac\xf9\x03\x4a\xb2\x4e\x7c\x47\xd3\x71\xae\xa1\x00\x80\x1e\x68\x36\xa2\x1a\x7a\x83\xb5\x80\xe4\x44\x43\xf4\x1e\x6b\x43\x16\x9d\xe4\x7b\x5c\x7b\x57\x43\xe1\x3d\xd6\x2a\xf3\x87\x86\xa2\x7b\xac\x89\x89\x42\x43\xbd\x7b\xac\x1d\x6f\x7f\xff\xeb\xdb\xf6\xd1\x55\x5b\x43\x31\xa4\x25\x81\x86\x6e\xef\xb1\x26\x46\xb0\x86\xfa\x8c\x82\x1e\xc9\xd8\x58\xd5\xd0\xe0\x1e\x6b\x62\xe0\x6a\xe8\xee\x1e\x6b\x47\x24\x3f\x4a\x22\x0d\x25\xf7\x58\x53\x46\xab\x86\x52\x8e\x84\xeb\x8c\x1f\xb0\xb1\xa5\xa1\x21\x2b\x22\x1d\x67\x3e\xd5\xd0\xfd\x3d\xd6\xbc\x74\x9c\x04\x23\x0d\x65\xf7\x58\xe3\x23\x54\x43\x23\x56\x1e\x98\x21\xd1\x50\x7e\x8f\xb5\x9c\x0b\x7e\x63\x16\x4c\xbf\x5e\x9e\x9e\x68\xe8\xa1\x28\x77\x47\x20\x78\xe4\x85\x29\x86\xb3\x34\xf4\xc4\xeb\x5a\x30\x6e\xc2\xbe\xf3\x74\x78\x96\xa5\x43\x12\x41\xe3\x69\xe8\x99\x03\x89\x61\xad\xa1\xed\x7b\xac\xdd\xd1\xd1\x88\x44\x54\x43\x3b\xec\x83\x0c\x47\x1a\xda\xe5\xf8\x39\x98\x86\xf6\x00\x15\x90\xd8\xbe\xc7\x5a\x2a\x73\x7f\x86\x56\x48\xf3\xd4\x4f\x07\x1a\xfa\x72\x8f\x35\x9a\x30\xf2\x03\x0d\xed\x4b\x0a\x21\xd7\x01\x34\xe2\x5d\xfa\x40\x4f\x80\x93\x2b\x5f\x19\x1a\xf0\x71\xfc\x5d\x43\x87\xc5\xc7\x0f\x0d\x1d\xb1\x8c\x24\x88\x68\x3e\xd2\xd0\x31\x94\x46\x13\x0d\x9d\x30\x36\xc1\x38\xd5\xd0\xe9\x3d\xd6\x2e\xe8\xfd\x98\x8e\xf2\x33\x92\x91\x3b\xca\xc4\x66\x0d\x9d\x33\x0e\x8f\xf3\x9c\x51\x7c\x01\xf5\x82\x31\xab\xa1\x4b\x96\x57\x1d\x9c\x1a\xea\x00\x41\x24\x98\x08\x02\xaf\x58\x8b\x04\x01\xb4\xe5\x51\x3c\xca\x69\x42\x33\x0d\x7d\x63\xf5\x23\xd0\xf3\xae\x05\x37\x35\xf4\x9d\x81\xb2\x51\xa3\xa1\x1f\x0c\x71\x9e\x0d\xa0\x94\x9f\xbc\xc6\xbc\xaf\xbd\xb9\xc7\xda\x43\x4c\x1f\x35\x44\x32\xd6\xa6\xbc\x54\x2f\xc3\x1a\x1b\x00\x1a\xf2\x33\xac\x8d\x7a\x71\xc8\xfb\xc0\x30\x22\x58\xbb\x49\x6e\x9e\x36\xfd\xf5\x91\x9f\xc5\xc3\xfc\x93\x86\xee\x21\x32\xd3\x50\xc6\x02\xb5\xae\x86\x46\x10\x20\x79\x6d\x10\x27\xb4\xa6\xa1\x1c\xbe\x83\x94\x72\x03\xdf\x61\x9c\xcb\xfb\x99\xbc\x47\x6b\xbb\x69\x92\x67\x29\x5c\x5a\x7d\x53\x47\xb0\x7c\x05\xef\x73\x09\x44\x43\xe3\x45\x34\x6a\xfe\x0a\x78\xed\xb1\x17\xc3\xc3\xcc\x24\x18\xc4\x49\x54\x7b\x0b\x4c\x7c\x5b\x83\x91\x68\x6a\xe8\xe1\x5f\xe0\x32\x35\xb4\x12\x64\x78\xd1\x78\xdb\x5b\x0d\x3d\x46\x04\xbf\xd5\xb4\xb7\xe8\x09\x02\x9f\x6e\x92\xb7\x68\xc2\x70\xff\xb6\xb1\xa1\xa1\x67\x1e\xfa\x43\x43\xdb\x2c\x54\xcf\xe8\xfd\x38\xce\x28\x19\xe7\x3d\xdc\xac\x6b\x88\x66\x58\x7b\x6b\x6a\x28\xcc\xb0\x66\x9a\x1a\xda\x61\x50\xe6\xba\x86\x62\x16\x11\x0a\x51\xeb\x36\xc3\xda\xba\x86\x76\x59\xe2\xba\xa9\xa1\x3d\x08\xac\x6b\xa8\x0d\x01\x36\x09\xe4\x66\x2f\xbf\x1b\x68\xe8\xb3\x12\x73\x3b\xd2\xd0\x17\xf8\x8e\x1e\xe2\xe7\xf5\xfc\x5e\x43\x7d\x86\x89\x05\x1e\x32\xac\xfd\xbe\xf1\x51\x43\x8f\x19\xd6\x3e\x6a\x68\x9f\xc1\xd9\x37\x89\x86\x0e\x58\xc8\x19\xc5\x91\xad\xa1\xaf\x10\x06\x75\x02\x0d\x3d\x65\x58\xdb\xda\xbd\x38\xfa\xfc\x49\x43\x87\x2c\x61\xab\x7d\x7c\xd6\xf9\xf1\x49\x43\x13\x96\xd2\x3e\x65\x09\xcf\x3c\x78\xf1\x49\x43\x47\x8c\x21\x5b\xbc\x97\x00\xbb\xb0\x96\xd3\xa7\x7c\xfd\x96\x3c\x10\x1e\xab\xd5\x46\x99\x8f\xb5\xb7\x68\x3b\xc3\xda\x76\x92\xa4\x39\xcc\xb0\xf1\x1d\x3d\x8a\x13\x36\xcc\x59\x74\x46\x09\xdb\x72\xe6\x1a\xda\x55\x3f\xd7\x46\x39\xf1\xfb\x6c\x00\xef\x65\x58\xdb\x21\x99\x00\x6a\xb3\xaf\xb1\xc7\x24\x78\x1e\xf1\x39\xc3\xda\x2e\xcc\x7f\xa3\x3c\xf6\xfb\x22\xf6\x98\x55\x60\x97\xb0\x32\x6b\x4c\x46\xa9\x91\x9a\x2f\x9a\x3e\x4f\x6b\x71\x3e\xa2\x83\x90\x35\xfb\x17\x96\x1b\x66\x4a\x91\x71\x1f\x22\xee\xbc\x54\x7c\x9f\x00\xa2\x34\xc9\x69\x92\xaf\x75\x26\x43\xaa\xa1\x53\x88\x1a\x8f\xf2\xf4\xae\x96\xd1\xd1\x30\x4d\x46\xa2\x23\xd2\x6c\xa9\x69\x03\x74\xc6\x72\xec\x91\x51\xcf\x4b\x49\x16\x68\xe8\x9c\x7d\x7f\x69\x77\x34\x74\x90\x61\xed\x0b\x19\xb3\x49\xef\x2b\x0b\x52\x59\xee\x61\x86\xb5\xfd\x78\x94\xa7\x51\x46\xee\x34\x74\x94\x61\xed\xe0\x8e\x44\xf4\x82\x04\x05\x2f\x8e\x65\xe4\xe5\x90\x64\x7d\xce\xd3\x0b\x86\xfa\x20\x01\x3b\x03\x79\xec\x0d\xc0\xd5\x35\xe1\x57\xd3\x76\x4d\x43\x97\x3c\x9d\x5f\xf0\xef\x91\x9c\x7c\x8b\xe9\xa3\xd4\x08\xe1\xae\x20\xd0\x49\x56\x82\x94\xb9\x85\xaf\x6c\x5b\x02\xff\x47\x43\x1d\x15\xd9\x12\xc8\xf2\x05\xc2\x66\xf9\x76\x1a\x5d\xfd\xe3\x5c\x85\x59\x81\x0d\x25\xfb\x69\x86\x35\x56\x57\xc1\x84\x6f\x0c\xdb\xf1\xe5\xf7\xe3\xa3\x0d\xf3\xfb\xf1\xd1\x7e\xa7\x73\xa6\xa1\xeb\xc5\x48\x73\xd3\xb4\x34\xf4\x7d\x49\xc2\x07\x96\xb0\x72\x96\x61\xed\x98\x0c\x35\xf4\x03\x40\x62\x3f\x4b\x47\x69\x98\x97\x38\xcf\x19\x40\xca\x5a\x54\x94\xfc\x93\x01\xf2\xb5\xfa\x0d\x0b\x9e\x26\xe0\x16\xfc\x2e\xcd\x68\x6d\x48\xb2\x3c\xf6\xe3\x21\x49\xf2\x51\x2d\x24\xf1\x80\x06\xac\xe3\xb1\x39\x57\x37\x34\x74\x91\x61\xed\x34\x8b\x04\xa2\xcb\x0c\x6b\x67\xa7\x97\x1d\x0d\x75\x58\x28\x96\x55\x23\x3d\x52\xac\x2f\xe0\x40\x3c\xa8\xc1\x82\x7a\x95\x61\xed\xd2\x87\x7d\x9f\x64\x02\x8b\xc9\xe9\x70\x48\x03\x65\x40\x5d\x67\x98\xbf\x5f\xd7\x90\xc7\x50\x75\x7a\xb4\x96\x71\x74\x34\x28\xc6\x03\x49\x02\x95\xdc\x9a\x2f\x46\x0d\xad\x81\x94\x50\xcb\xd3\x88\xb2\xb9\x1c\xd5\xc8\x08\x4e\xa0\x6b\x8f\xa0\x00\x12\xb3\xec\xc1\xd8\x67\x7d\x3d\xa0\x43\x9a\x04\x34\xf1\x27\x35\x7f\xe2\xb3\x02\x7d\x28\x50\xd2\x5c\x23\x61\x4e\xb3\x9a\x86\xbe\x67\x3c\x76\x00\x9d\xf5\x07\xfb\xca\x28\x05\xbe\x07\x90\x03\x46\xd8\xcf\x0c\x6b\xd7\x69\x16\xb0\x34\x0d\x51\x96\x70\x73\xe3\x6b\xe8\x4d\x86\xb5\xff\x6a\x28\x64\x11\x7f\x41\xa7\xf9\xeb\x7e\x4c\xb3\xc9\x5f\x19\x0d\x33\x3a\xea\xfd\x15\x27\x39\xcd\x1e\xc8\x40\x43\xd1\x02\xcc\x38\x1b\x68\xa8\xc7\xa2\x89\x50\xb1\xd6\xd0\x4a\x0c\xdf\x7c\x11\x25\x23\x58\x7a\x3b\x19\x4d\x02\x3e\x98\x3c\x1e\x93\xd1\xd1\x48\x43\xb7\x00\x9a\xd4\x40\x0d\x46\x43\x3e\x4b\x93\x73\x5a\x5e\x54\xa9\x0f\x50\x43\xfe\x32\x2f\x4e\x93\xf5\xa7\xb5\xc7\xc7\xc7\x35\xd6\xb7\xd7\xc6\xd9\x80\x26\x7e\x1a\xd0\xc0\x61\x33\xf8\x88\xe6\x78\x9c\x87\x6b\x1f\x35\x14\x8c\xb0\xe6\x91\x4c\x43\x94\x05\x06\xa9\xdf\xd7\x50\x38\xe2\xf2\x1f\x93\x1e\x59\x70\x10\xb3\xd8\x1e\x0b\xa6\x77\xc3\x01\x65\xd2\xc2\x80\x95\xe6\x8b\xd9\x29\x07\xde\xdd\xc9\xa8\x8c\x89\x42\xf1\xa8\xf8\x60\x55\x80\xaf\x8c\x0a\xb4\x09\x03\x0d\xca\x69\xa9\x3f\x92\x52\xed\x40\x84\x84\x0c\x98\x72\xc0\xff\x8f\xb8\x37\xed\x6e\x1b\x47\x1a\x85\xbf\xe7\x57\x48\x7a\x7c\xd9\x44\x0b\xa6\x25\x3b\xdd\x33\x4d\x1a\xd1\xeb\x45\x89\x1d\xdb\x71\x6c\xcb\x76\x12\x86\x93\x03\xae\xa2\x76\x91\x94\xbc\x49\xff\xfd\x3d\x28\x00\x24\x28\xc9\xe9\x65\x9e\x7b\x6e\x9f\x8e\x45\x82\xd8\x51\x28\x54\x15\x6a\xc9\x82\x05\xfb\xc3\x06\x5b\xc3\x13\x48\x0b\x32\x80\xed\x1f\x39\xe9\x36\x85\xe4\x38\x9d\x0c\xe8\x93\x59\x19\x8d\x47\x81\x55\x99\x50\xdf\x8f\x47\xd1\x76\x36\x9e\x98\x95\xdd\xc9\x63\x0d\x0f\x59\xfd\xe3\x21\x8d\x47\x35\x3c\xca\x9f\x0f\x1e\x63\x46\x93\x42\x0d\x40\x9c\x8c\x53\xfe\x04\x6b\x95\xb2\x74\xb0\x42\x95\xab\x37\x49\x49\x2d\x48\x92\x71\x52\xc3\xd3\x94\xd4\xc2\xb1\x37\x4b\x59\x8d\x89\x7c\x81\xdd\x92\xb1\x72\x82\x90\x33\xe2\xb1\x31\xa4\xfd\x40\x6c\xaa\x1a\x7e\x33\x7b\xfd\xab\xd8\xb7\x35\x9c\xa6\x2c\x0b\x20\xe9\x8c\x3d\x06\x63\x31\x81\x73\x28\xcc\x65\x15\x8c\x5e\x35\x3e\x04\x63\xb6\xbe\x49\x0d\x3f\x28\x9f\xca\x92\x96\xf3\x31\xf5\x0f\x92\x28\xad\xe1\xc7\x57\xf3\x5c\x31\x88\xad\xe1\xa7\x57\x33\x00\x99\x93\x1a\xd4\xf7\x0b\x22\xf1\xf9\x2f\xe4\xbe\x1c\x05\xfc\xfc\x95\x85\x0e\xfe\xac\x10\xa7\x96\x0f\x06\x03\x59\x26\xad\xe1\xc3\xbf\x56\xa8\x68\xe5\xe8\xcf\x0a\x64\x49\x1c\x45\x2c\xe7\x2c\x65\xec\x4c\x7a\x4e\xdd\x60\x90\xf2\x93\xb9\x86\x8f\x59\xf1\xee\xa0\x86\xe7\xec\x6b\x96\x4d\x6a\xb8\x0d\x49\x59\x36\xf9\x3f\x35\xfc\x5e\x3e\x9b\x3b\x3b\xfe\x6c\x38\x7c\x32\xbc\xf1\xb0\x86\x3f\xc8\xe4\xf4\xff\xd4\xf0\x09\x7b\x89\xfd\x60\x94\xc5\xd9\x53\x0d\xbf\x79\x48\x49\x2d\x66\x67\x67\xca\xce\x4e\xbe\x77\x1f\x21\x2d\xaa\xe1\x53\xc8\xcc\x4f\x28\x8e\x3d\x6a\xf8\x29\x25\xb5\x5e\x0a\xac\x4b\x0a\xac\xd8\x84\xa3\x85\x83\x94\xd4\x06\x34\x1b\x30\x80\x3c\x64\xcf\xf1\xa8\x2f\xb6\xcd\x51\xca\xd8\x18\x05\xda\x3e\xb2\x7a\x59\xca\x0f\x81\x86\x7f\x48\x10\x3b\x86\xac\x6c\x5c\xf0\x90\xf4\x61\x9e\xcf\x20\xbf\xdc\x5a\xe7\xf0\x36\xf6\xe3\x30\x66\x33\xf5\x9e\xe5\x84\xf3\x48\x40\xe3\x07\x48\x98\xa5\x81\x3f\x7e\x18\xd5\xf0\x89\x7c\x85\x5d\x70\x9a\xbf\xcd\x59\xe1\x0b\xa8\x2b\xc5\x15\xc0\x7d\xb0\x9b\x3e\xb1\xa4\xd1\x98\x6d\x69\xe8\xfd\x25\x7f\xcf\x7e\x88\x26\xfd\x1a\xfe\xcc\x92\x72\xa6\xeb\x63\x4a\x6a\xe3\x24\x12\xad\x5f\xb1\x6f\x62\xa7\x8b\x5d\x7e\x96\x92\x1a\x3b\x17\xa0\xfa\x6b\xf8\xce\xbd\x0d\xd6\xf0\x0d\xbc\xc1\x05\xfd\x78\x64\x56\xa8\x9b\x8e\x07\xb3\x2c\xb0\x2a\x80\x23\x1a\x56\x65\x10\x84\x19\x3c\x3c\x6f\x83\x7c\xc8\xac\x34\xad\x1a\xee\x40\xb1\x99\x5b\xc3\xe7\xa9\xe0\x9b\x6a\xf8\x96\x25\xae\xca\x59\x6a\xf8\x4e\x24\xc3\x9a\xdd\xf3\x17\x38\x25\x6a\xf8\xcd\x05\x94\x8e\xd8\xdc\x01\x1b\xf8\x29\x7f\x4f\x6b\xf8\x0b\xcf\x3b\x3d\xf5\xcd\x1a\xbe\x64\x5f\xe2\xa8\x9b\xd5\xf0\xe7\x94\xb1\xac\x83\xc0\x63\x0c\x17\xcb\x93\x06\x49\x1c\xa4\x46\xd3\x60\xe0\x73\x1f\xfb\x8c\xdf\xfa\x56\xfa\x30\x19\xc7\xa3\xec\x26\x7e\x66\x24\x42\xe9\xc3\x3c\x4e\x19\x71\x76\x3a\x3a\x0f\x22\x60\xfd\x69\xcc\x3e\x03\x55\x7e\xc5\xda\x99\x50\xc6\x3c\xa6\x82\xdd\x95\x63\x72\x21\x17\xa0\xbf\x38\x64\x87\x10\xbc\xcf\x3c\x0f\x40\xf1\x26\xcd\xb9\x76\x9f\x7d\xe0\xdc\xde\xc1\x63\x90\x32\x0a\x27\x58\x49\x6a\xd6\x70\x27\x2d\x52\x18\xea\xbd\x4d\x39\x0d\x5f\xc3\x21\x64\xee\x06\x95\x87\x64\x3c\x8a\x72\xa3\x47\x7e\x3a\xdc\xb1\x6c\x70\x1a\xdd\xc3\x93\x3c\xfb\x22\x28\x24\x5e\x8d\x8c\xa6\xfd\x0b\xda\x63\xd8\xb9\x2b\x3f\x00\x28\x7e\x61\x85\xc6\xe3\x41\x16\x4f\x6a\x38\x86\x4f\x53\x60\x62\x59\x7a\x12\x04\xb0\x0f\xbe\xa5\xa4\x36\x8b\x6b\xb8\xc7\xbe\xcf\x62\x83\x1f\x6e\x5b\x90\x2a\x67\xa3\x0f\xdf\xd2\x20\xf9\xc1\xc0\x94\x31\x5d\x6c\x7b\x83\x4f\xa5\x1a\xa6\x19\xa9\xcd\xf9\xb0\xdc\x8c\xd4\x1e\x68\x32\xe2\x47\xfe\x80\x95\x12\x72\xe6\x80\x8b\x4c\x86\x3c\x29\xeb\x1e\x25\x81\xcf\xc3\x03\xa6\x35\xec\x65\xa4\xf6\xd8\x4d\x6a\xd8\xe7\x0f\x93\x31\xdb\xc3\x23\x96\xf7\xf9\xb1\x86\x83\x8c\xd4\x16\x35\x3c\x66\xef\xdf\x67\x8d\x86\xff\xaf\x9a\x72\x2f\x9f\xe5\x37\x9a\x37\x13\x4a\x26\x31\xcd\x7d\x3a\x0e\x77\x09\x97\x41\xce\x52\x9e\x70\x3c\x27\xb6\x08\x6d\xd9\x2e\x3d\x52\x43\xf4\x3a\x05\xfb\x21\x99\x99\x1a\x70\xe8\xf1\xc4\x69\x2c\x14\xa1\xdb\x73\x54\xbc\x1c\xcf\xf3\xc6\xaa\x64\x92\xca\xdb\xfe\xbb\x26\x6b\x3a\x8e\xf8\x25\x7c\x46\xa4\xb7\x3f\x3b\x9b\x0a\xf3\xc4\x9b\x09\x55\x0d\x4b\xa7\xd0\xef\x92\x7b\x7d\x97\x7b\xea\x71\xe5\xe5\xa7\x47\xa8\xed\x3a\xc6\x2a\x25\xc0\xad\xa7\x72\xa7\x9c\xae\x83\x3d\xe2\xb5\x3c\xfb\xdc\x75\xf4\x24\xa6\x48\xd3\xaa\xfc\x25\x8d\x29\x6a\x79\xa6\xc7\x6f\x46\xb5\x9d\x08\x9f\x06\x88\xbf\xec\xef\x44\xf8\x4c\xbe\xbc\xdb\x89\xf0\x47\xf9\xf2\xbd\xb6\x13\xe1\xf3\x00\x99\x97\x96\xbf\xd6\x34\xf1\x96\x4b\x2e\xd7\x4b\x62\x4a\x76\xfe\x63\xff\x67\xdf\xf9\x55\xdf\xa7\xba\x5e\x41\x75\x21\x19\xd4\x7f\xf9\xe1\x0e\xe8\xa8\xff\x0b\x6a\xe9\x35\xfe\x58\x43\x2d\xd4\x62\x59\xf4\x6e\x12\x84\x44\xff\xc5\xfe\xcf\x2f\xce\xaf\x90\xc1\xfe\x4f\xcd\xf9\x95\x7d\x7f\x07\x75\xed\x7f\xdf\xa1\xfc\x09\xfd\xba\xb5\x83\x53\xd6\x4a\xc1\xf5\xea\x7a\x0a\xf5\xb4\xd0\xaf\xe6\x8e\x72\x4f\x1e\xcb\x80\x21\xc6\x3c\x48\xd2\x78\x3c\x5a\x2c\xbe\x05\xb9\x11\x52\x5f\xef\x45\x14\x83\xfd\xdd\xb7\x60\x79\x4f\xa6\x19\xb7\x96\xbc\x6b\x4a\x2b\xc8\xdc\x30\x72\xd0\x7b\xd5\xea\x69\x97\x90\x09\x84\x7c\x1d\xec\xfd\x2c\x8f\x9b\x29\x97\xef\xd9\xc6\x35\x36\x8e\xe7\x72\x99\xb9\xce\xdb\x9c\xad\x32\x47\xa7\x84\x5c\x76\x15\x6f\x54\x85\x96\x3f\x35\xda\xe5\x52\xed\xd7\x4b\xe5\x7e\x4b\xee\x8d\x3b\xfa\x5a\x67\x33\xd5\x09\x7b\x92\xad\x88\x70\x07\x3d\x1d\xac\xd3\x8e\xe7\xfc\x2f\xf8\x07\x10\x0f\xb6\xeb\xb4\x8a\x47\x93\x1a\x83\x3d\x9e\xb9\x3d\xe7\x7f\x45\xe6\x76\x91\x59\x3e\x72\x6d\xd8\x7b\x63\x12\x94\xfa\xc5\x26\x87\x92\x24\xe3\xfa\x35\x77\xdd\x42\xb7\x35\xf7\x51\x4f\xab\xe4\xb2\x65\x53\xc7\xb4\xc1\xf0\xf2\xf9\xe3\x86\x71\xc9\x0a\xce\xba\x14\x81\x99\xe9\xbd\xf1\x71\xf7\x27\xf9\x26\x32\x1f\x6b\x3f\xcd\xc8\xcb\xc9\x5b\x53\x90\x52\xdb\x25\x52\x6a\x9b\x63\x85\xda\xd2\x4a\x33\x23\xf6\x28\x49\x33\xe3\xe4\x6d\xbd\x13\xb0\xf7\x51\x20\xdf\x83\x90\xbd\xcf\xdf\x8a\xd7\xda\x36\x1d\x0c\xb6\x6b\x2c\x2d\x69\x12\x9e\x13\x1c\x09\x8c\x32\x1a\x8f\x82\x04\x82\xf6\xcd\x06\x03\xc8\xd1\x9d\x50\xc6\xa7\x78\xfd\x28\x61\xac\xe1\x36\x28\xd3\x99\x95\xff\xf1\x1a\xec\x3f\xab\x22\xde\x1f\xba\x71\x56\x90\xfd\x40\x0c\x58\x50\xbe\xf7\x4a\xf9\x30\x0c\xdf\x7a\xbb\x79\x79\x77\x40\xbd\xbe\xc5\xab\xd9\x4e\x27\xd4\x0b\x18\x27\xf1\x90\xd0\xc9\x4a\xa5\x15\x77\x9c\xf8\x41\x62\x56\x9a\x93\xc7\x4a\x3a\x1e\xc4\xbe\x28\x0b\xad\xf5\x59\x6b\xe1\x78\x94\xb1\xd2\xc9\x90\x0e\x2a\x0d\xe3\xdf\xc1\xb0\x42\x93\x98\x0e\x70\x4a\x47\xe9\x36\x3b\x8f\x43\xab\x32\xa4\x49\x14\x8f\xb6\xdd\x71\x96\x8d\x87\x66\xe5\x37\xd9\xdf\x58\xd6\xb0\x9d\xc6\xcf\x81\x59\x69\x1a\xcd\x60\x98\x77\xf3\x7f\xd8\xa0\x3d\xcf\xaa\x40\x8e\x87\x80\x51\x09\x66\xc5\x1d\x0f\x7c\xab\xe2\xcd\x92\x94\xe5\x01\x02\x20\x48\x0a\x1e\x88\xd3\x35\xcd\x06\xeb\x7d\x69\xb8\xec\xdc\xdd\xa6\x83\x38\x1a\x99\x15\x20\x38\xac\xca\x3c\x60\x5c\x39\x1d\xc8\xe4\x6c\x3c\xb1\x6a\xd6\x9b\x34\x33\x22\x8f\x92\x06\x3c\x5d\xf8\x1b\xd4\x9d\xe2\x50\xaf\xa6\x99\x11\x7c\x50\xfd\x80\xc0\x0a\xd7\x6b\x46\x45\xa0\x49\x93\xfb\x9c\xf3\xd8\xa2\x4f\x27\x54\xe7\x65\x85\x95\xaa\xc7\xcf\x98\x0b\x81\xcc\x5d\xe2\xe5\x68\x56\xa6\x79\xc4\xb3\xdb\x53\x47\x68\x94\x4a\x5b\xd8\xb4\x3b\x7e\x38\x1d\x75\xf8\xf1\xde\xaa\x56\x57\x52\xcc\x6a\x03\x47\x44\xf7\xec\x13\x87\xa1\xa1\x96\x9b\x99\x93\x14\x31\xac\xd5\xe2\xf0\x65\x72\x30\xc1\x11\x89\xea\xba\x67\x3f\x3a\x2d\xf6\xc7\xbc\x44\xb8\x4f\x58\x6d\xc0\x59\x30\x1a\xc7\xf2\xc9\x4d\x5f\x97\xfd\xf5\x8d\x9e\x7e\x95\xe2\x17\x08\x38\x69\x46\x4b\xec\xdb\xc7\x2e\xf8\x89\xc3\x11\xe1\xfb\xa1\xce\xe7\xad\x5e\xc7\x03\xc8\xfe\x19\xbf\xc4\xbe\x19\x61\x5e\x84\xc3\xcb\x12\x07\xc8\x72\x35\x4d\x0f\x5b\x5f\x26\xe0\x33\xcb\xd4\x43\x12\x50\xfb\xc6\x75\xf4\xab\x14\xe1\x2f\x94\xbb\x18\xf3\xed\xa9\xa3\x0f\xb0\xa8\x87\x57\x71\xd5\xa5\x4b\x1c\x22\x84\x90\xd5\x07\xad\xc5\x72\xa7\x38\x3c\xc9\x9e\x8d\x63\x8a\x10\x76\x8d\xf1\x08\x18\x7b\x32\x8b\xd9\x02\x7d\x6c\xe2\x81\xa8\x9c\x3b\xec\x4a\x33\x63\x30\xa1\x3a\xc5\x03\x64\x89\xc1\x07\xc7\xd2\xef\x4f\xaa\x69\x0c\x04\x12\x99\x21\xf7\xac\xc5\x8a\x0d\xbd\x35\xbd\xbc\xcd\x20\xc1\xe3\x88\xb2\x49\x1a\xbc\xd5\x21\x1c\x07\xba\xa6\x3a\xb5\x1f\x1d\x7c\x85\x70\x77\x00\x91\x46\xd8\xdc\x1d\x6f\x50\x2a\xff\x49\x95\x55\x57\x4d\xe4\x68\x25\x17\x97\x4a\xac\x22\x72\x0a\x54\xce\x1e\xf6\x74\xa4\xea\x61\x4a\x87\xd7\x0c\x1b\xeb\x08\xfb\x10\xbf\x5b\x64\xd7\x7d\x52\xd5\xb7\x62\xdd\x63\x94\x20\x5a\x2c\xe0\xf1\xb4\x0b\xc1\x11\x65\xb1\xe7\x8f\x10\x86\xc0\x35\x3e\xee\x42\xf1\x97\x32\x38\xfa\x4b\xcb\x73\x75\x1f\xf3\x2a\x5b\x93\xd4\x74\x33\x64\xf9\x6b\x33\x4d\xf2\x13\xab\x02\x9b\x0e\x9c\x70\x06\xe0\x63\x3f\xcd\x8c\x0f\x2b\xb6\xc2\x94\x81\xcc\xd0\x77\x14\xbf\xcc\x69\x66\x1c\xbc\xd5\x29\x6a\xf1\x65\xd6\x29\xc2\xd5\x06\x32\xab\xcd\x25\x6c\xe3\x89\xf7\x97\x2b\xa0\x76\x2f\x70\xd8\x3f\x61\xb9\x98\x66\xc6\xf9\xf5\x66\x9b\x78\xe5\x54\xc9\x92\xa7\x17\x5a\x58\xf0\xe4\xfa\x12\x68\xe9\xd1\xcc\xeb\x32\x5a\x0d\x1c\x84\xb5\x5c\xdd\x43\x26\x1f\xa3\x8b\x3d\xfb\x60\xea\xa0\xe5\x12\x5a\xf9\xd8\xdc\x60\x4c\x0d\xbd\xb1\xfa\x0c\x4a\x2c\xf0\x27\xf6\xcd\x75\xc0\x80\xe0\x9a\xea\x2e\x87\x21\x28\x7c\xf0\x76\xa3\x4d\xcb\x00\x14\x69\xa9\x11\xfb\x9a\xf6\x14\xeb\xec\x01\xf3\xed\x2a\xf5\x85\x7b\x81\xb3\x29\xc7\xfc\x2d\x4b\x65\x5f\x5b\xd5\x46\x3e\x8d\xd3\xc9\xba\x81\x75\x11\xe6\x93\x9f\xd1\x2d\x6a\x4e\x52\xa1\x45\xf9\xb2\xc4\x11\x29\x74\x47\x3e\x3a\xd6\x2e\x21\x51\xcb\x05\x35\x40\x17\x11\xd2\xeb\xb6\x42\xe2\x9a\x81\x28\xef\xb6\x5c\x33\x30\xf7\x08\x38\x17\x2c\x25\xe2\x90\x78\x8b\xc5\xcb\x12\x59\x3e\x39\x8e\x75\x1f\x59\x01\xfb\xcd\x9d\x66\xbd\xa8\xf8\xd4\xf4\xf1\x0a\x36\x35\x03\x2c\xf8\x6a\x33\xe4\xb3\x1d\x7c\xd8\x34\x61\xf9\x30\xfc\x7c\x5f\x0e\xde\xae\x2c\xbe\xe2\xa9\x90\xad\x46\xe1\x9d\x91\xe1\x4b\xbc\xe2\xe9\x18\x9c\x49\x86\x8e\x9c\x5e\xf1\x2c\x66\x18\xbd\xf8\xe0\x03\xd9\x0a\xec\xd3\x29\xc4\xc1\xe3\x0a\xa1\x55\x5f\xd3\x5c\xd8\x7f\x90\xaf\xc0\xac\x3e\xf1\x06\x02\xb1\xfa\x02\xb1\x4e\x19\x56\x04\x3f\x0e\x5c\xbd\x14\xc2\x03\xde\xba\x0e\x6a\x05\x06\xfd\x01\xfe\x0f\xcd\x80\x21\x3c\x8a\x7d\xa4\xf8\x7a\x80\xf5\x1c\x4c\x56\x2d\x59\xf8\xc0\x72\x64\xd5\x40\xd6\x35\x85\x73\x02\x07\x29\xb2\x3c\x56\x91\x2b\xf0\xd5\xec\xcf\xcb\x7e\xd3\x3d\x4d\xf3\x60\x96\xd4\xc9\x96\x7b\x4d\xd3\x5c\x36\xcb\xbc\xbe\xe4\x95\xbe\xec\xc4\x3e\xa9\xb5\x7e\x42\x91\x6d\xdb\x8d\xed\x3f\x9c\x5f\x6b\xad\x1d\xec\x93\x59\x40\xb9\xc7\x4c\xae\x2c\xea\xe1\x4b\x86\x9e\x6c\x47\xf4\x58\x75\x2c\xc9\xb1\x36\xad\x12\x57\xaa\xf6\xb2\xc2\x94\x9d\x68\x51\x5e\xd8\x8a\xc0\x56\x04\xfc\x5c\x51\x50\x18\xfd\xa6\x07\x18\x76\xab\xaa\x61\x9b\x65\xf9\x96\x15\xee\x23\x03\x6a\x87\x9e\xa3\x5f\x45\x08\x5c\x81\xb9\x32\xe1\x2e\x42\x76\xc3\x11\xf8\x53\xa4\xcd\x21\x0d\xfb\xf9\x49\x18\x21\xcb\xb5\xdf\xbb\x0e\x2c\xdf\xd2\x55\x2b\x6b\x38\x96\x27\xf3\x3d\x75\x11\x43\xaf\x1e\x3e\x61\x0f\x46\x9a\x78\x84\x5a\x2e\x5b\x23\x4f\x61\x32\x67\xb1\xea\xa6\x3e\x1f\xbe\x0b\xeb\x30\x04\xf7\x68\x12\x9b\x33\x24\x6d\x79\x9a\x06\xc7\x11\x37\x43\x12\x7c\x84\xb7\x54\x46\x3b\xcb\x74\xf4\xb2\x9c\x31\x16\xca\x18\xf5\x49\xb5\x69\xf1\xe7\xbb\xe8\x35\x46\x63\xd4\x5f\x8a\x3c\xdf\xd4\x2c\xe2\x9b\xb4\xdf\x62\x75\x89\xc8\x09\x87\x3a\x52\xe7\x77\x9e\xa9\x20\x31\x8b\xf5\x87\x8c\x75\x8e\x1a\xc7\xe7\x60\x2d\x7e\x7c\x4e\x6c\x87\xbf\x83\xff\xcc\x58\x17\xca\x75\xad\x2f\x7a\xee\xbb\xc1\xf4\x90\xe8\xf4\xa1\xda\x89\x38\x14\x4c\xfd\x39\x28\x89\x0b\x39\xc0\x39\xc4\x4e\x90\xcf\xa9\xeb\xe8\x48\x57\x7b\xf4\x00\x2b\x4e\x73\xa7\xef\xd4\xf8\x46\xc8\x45\xc4\x50\xe9\x37\x5d\x99\xfd\xf9\x1a\xfb\x87\xbd\x32\x4a\x74\xc1\x99\xa8\x9b\x33\xf3\xf9\x37\xd7\xb1\x06\xe0\xa8\x65\x1e\x2b\x47\x8b\x8f\xcc\x87\x4c\xf7\x91\xba\x20\x8f\x62\x7a\x3c\x37\x37\x38\xdb\x2a\x7c\x43\x74\x26\x45\x9c\x1e\x9b\x26\x32\x4a\x8a\xf0\x86\xf7\x99\x6b\xd7\x04\x22\xd4\xcf\xf3\x33\x5b\x4f\x6e\xc0\xe7\x53\x52\x6d\x2c\x1f\xd7\xa7\x6c\x69\x3d\xae\x2f\xa6\x4c\x5c\xd1\x45\x59\x5b\x6f\xd6\x42\x43\x66\x2e\xeb\xf6\xac\xe5\x5d\xeb\x63\xb5\xa1\xf4\x4d\xb5\x3e\x7f\xe2\xeb\x61\x07\x53\xa7\xb4\x4e\xcf\x90\xfe\x9c\xd9\x69\xa0\x1e\xf7\x74\xc9\x93\x48\x18\x03\xf4\x3f\xc4\x94\x54\x0f\xfa\x8b\xc5\xc7\xbe\xfe\x07\xc2\x8f\xe5\xd7\xa7\x98\x92\x83\xbe\xa6\x55\x4f\xfb\xba\x1f\x22\xab\xda\xee\x2f\x16\xa7\x7d\x7d\x9e\x20\xeb\xb0\xaf\x69\xa7\x7d\xbd\xd6\x34\xfe\x70\x6b\x68\xb1\x38\xe0\xef\x0f\x09\x5a\x2c\x9e\xc5\xb7\x3f\x8c\xdf\xd8\xa7\x36\x7f\x95\xa5\xaa\x32\x9b\x28\xc2\x6a\x86\x78\xec\xd0\x5a\x6b\x9a\x9a\xb5\xe3\xcb\x8b\xf7\x63\x6f\x96\x9e\x8e\x6a\xf8\x80\x27\x27\x4a\xf2\xe5\x2c\x53\x84\x62\x07\x02\x0a\x1e\xb3\xc2\x4c\xa5\x45\xed\x13\x46\xde\xe7\xf0\xc0\x5d\xfe\x74\x4a\x6f\x30\xa3\x25\x05\x2d\x25\xf4\x9c\x50\xd8\x21\xca\xcb\x17\xd2\xb0\x6e\x45\x0d\x0d\x64\xdd\x15\x8f\x0f\xc5\xe3\x63\xf1\xc8\x2d\xf8\x40\x63\x87\x34\xac\x0f\x2b\x1f\xa4\x12\x16\x11\x4b\x2b\x14\x6d\x18\x18\x7e\x14\x59\xf3\x18\x76\x52\x95\x86\x7d\xbc\x51\x3e\x7e\x5a\x1f\xcf\xcd\x6e\x0e\xc8\x57\x32\xf0\x1d\x0f\xaa\xc2\x63\xf8\x61\x17\x2d\xbf\xea\x07\x19\x7e\xcc\x84\x71\x5b\x4c\x89\xdd\xc4\x6f\xf1\xae\x63\xdd\x93\x03\x10\x10\xbd\x39\xa7\x6b\x8e\x97\x38\x0e\xca\xb7\x9a\x7d\xe2\x14\xb3\x4b\xd9\xfe\x5a\x2c\x28\xc3\xc5\x6d\xee\xa7\xbf\x98\x6c\x57\x06\x89\xa1\xb6\x3b\x75\xb8\x43\x48\x86\x7d\x0e\xfb\xc2\x54\xc2\xca\x4c\x20\x24\x9f\x33\xdd\xb7\x53\xdf\x61\x44\x8e\xf4\xfa\x5d\xc9\x04\x25\x19\xa2\x97\x65\xc0\x60\x9f\x7b\x29\x82\x11\x2f\x65\xb4\x14\x72\x9a\xb6\x7c\x42\x8d\x30\x19\x0f\x45\xfb\xa6\x47\xc8\x49\x0a\xd4\x04\x35\xb2\x71\xde\xab\x0d\x8b\xee\x5b\xa5\x45\x66\x40\xce\x51\x67\x15\x4c\x4b\xa6\x4e\x0b\xfe\x9a\xd4\x18\xd0\xa7\x20\xf9\x52\x06\x90\x95\xec\x67\x90\xfd\xac\xc8\xfe\x35\x87\x19\x25\xd7\xb1\xcf\x72\x1d\xfb\x2c\xd7\x84\x46\xc1\x97\x02\x9c\x94\x5c\x6d\xc8\xd5\xce\x73\x7d\x2d\x20\x8d\xda\xa7\x2e\xf7\x6e\xfa\x98\xa7\x9c\x89\x14\x15\xee\xa8\x7d\x35\x75\x72\xd8\xa3\xf6\x60\xaa\xe4\xc9\x41\x90\xda\x7d\x96\xfe\x46\xf7\x08\x79\x4e\x5b\x90\xcd\xcc\x73\x09\xc0\xa4\xf6\xd7\xa9\x93\xc3\x26\xb5\x93\xa9\xb3\x0a\x9e\xd4\xf6\x12\x27\x87\x50\x6a\x5f\xe7\x59\x6e\x76\xc9\xbc\xdf\x82\x14\x93\x57\xf4\x29\xcf\x75\x9c\xe7\xba\xa2\x84\x5a\x74\x0d\xfd\x09\xf8\xe5\x38\x4e\x31\x12\x3a\x2c\x8b\xee\x1e\x62\xda\xa2\xc6\x15\x0c\x99\x10\xd7\xa4\x20\x0e\x88\xd2\x16\xe3\x20\xcc\x6a\x55\x97\x1f\xb5\xc3\x98\xda\xae\xa3\x1c\x57\x47\x99\x42\x2b\x40\xb5\x0d\xc6\x38\xea\x0c\x75\xcd\xfb\x8c\x25\xf8\xca\x38\x96\xfb\x9f\x61\xf9\x83\xcc\x08\xec\xa7\xa9\x23\xb1\x50\x3e\x26\x96\xd8\x52\x9e\x75\x24\x02\xe3\x4b\xd5\x5c\xae\x79\x04\xc7\xc3\x9b\xfb\x9f\x9c\x0d\xd0\x42\xa0\xb6\xc0\xa5\x87\xa2\x36\xee\xe3\x36\x98\x3a\x48\x9c\x07\xb9\xdf\x0a\x6a\xf0\xa1\x71\x8b\x87\x6a\x93\x61\x76\xc4\xb6\x9c\x0e\x03\x5b\x2c\x9a\xcd\xdd\x7d\x02\xcb\xae\x69\xcd\xdd\xbd\x77\xfc\x19\x69\x1a\xa8\x79\x6f\x37\x25\x3f\xe7\xa2\x17\x30\xb7\x9e\xa7\xaf\x0a\x57\xaf\xc0\x72\x7f\xe5\xdc\x64\xfd\x3c\xce\x48\xcd\x1b\x8c\xd3\x59\x12\xfc\x18\xc0\x1d\x2e\xa8\x51\xd4\xea\x7a\xb3\xfd\xfb\xaf\x5d\xfb\xc4\x73\x74\xc4\x60\x33\x5f\x95\xb6\xb2\x2a\x55\xbd\x4a\x17\x8b\x2a\xb5\x8f\x33\x87\x9b\x68\x1f\xc5\x94\x31\x1d\x32\xf3\x71\x4c\xd7\x0c\xec\xee\xc6\xd2\xa8\xf3\xb2\xa3\xe0\x76\x46\x31\xba\x96\x44\x65\x9e\x58\xa8\x6e\x9b\x54\xab\x02\x17\x74\x28\x09\x44\x24\xb8\xe0\x89\xd4\xeb\x47\xb1\xa8\x27\x68\xf3\xd9\x7e\xdf\x61\xb8\x28\x6f\xfc\x3d\x3f\x86\xd9\xe7\x6a\xc3\xa2\xac\x61\x8e\x7a\xf3\x86\x01\x37\xca\xc7\x0e\xc7\xcc\xca\x79\xfd\xa1\xb8\xd9\xe1\xf4\x2c\x27\x07\xbb\xe4\x65\x29\xae\x5c\xce\x49\x63\x79\x4f\x3e\x08\x01\x3e\xf5\xd7\x25\x74\x6c\xd8\x32\x1a\x62\x9f\x4d\xa6\x74\x31\x74\xd8\x65\xdc\x16\x65\x24\xa3\x92\x50\x38\x8f\x3c\xaf\xd7\x39\x28\x45\xe4\x04\xb6\x14\xd4\x65\x6d\x37\xf7\xa3\x96\xce\x98\xf1\xc8\xc1\xde\x62\xa1\xbb\x7c\xd8\x08\x99\x3a\x8f\xf7\xc7\xe6\xdc\xc5\xb2\xd7\x38\xc4\xd5\x2a\x2b\x89\x21\xa3\x87\x29\x0f\x6f\xae\x46\x91\x9a\xad\x1e\x2c\xc2\x97\x51\xde\x65\xf0\x29\x40\xb9\xef\x13\xe8\xa9\xe2\xb2\x5c\x71\x75\x77\xd8\xb5\xa9\x63\xb9\xac\xbf\x81\xa8\x24\x77\x88\xb8\xef\xb6\xf4\xf7\x99\x1e\xb0\x2d\x8e\x3f\xc7\xf6\x20\x80\x1d\xc3\xf2\x35\x11\x6e\x70\xbf\xb7\xec\x64\x08\x06\x41\x16\x54\x8a\xfa\xe4\x74\x6c\x6f\xe7\x62\x14\xd5\x7b\xe6\x69\x89\x1a\xcf\x7d\x24\xe9\xdc\x85\xdd\x7a\x57\x7d\x12\xf4\x74\x96\x6e\x7b\x0e\x3b\x05\x19\x9f\xfa\x3e\x63\x7c\x5a\x83\x10\x91\x5e\xea\x89\xcc\x4b\x79\x1f\x14\xb6\xf5\x7e\x55\xf0\x46\x41\xe8\x20\xe6\x2c\xa7\xb0\x79\xa0\x7c\x75\xf2\x20\x12\x35\x18\x83\x52\xd5\xee\x53\x8e\xd9\x93\x6e\x73\x72\x6f\xfb\xf5\xba\x8b\xdf\xb3\x83\x38\x70\x90\xb5\x32\x43\x9e\x63\xe5\x33\xb4\x2c\xd6\xf4\xde\x08\x6e\x5f\x0f\x6c\xcc\x66\x96\xf7\x93\xfb\x81\xe1\x57\x78\x85\xb3\xd0\xdc\x69\x4f\xbd\x1e\xa8\x4e\x7b\xac\x90\xed\x48\xe2\x6a\x9a\x70\x3e\x53\x72\x40\x78\x77\xb6\xc9\x23\xd6\x5a\x8b\x02\x64\xb6\x9b\x8c\x08\xd2\x03\x09\xde\x9e\x22\x14\xd8\x6e\xee\x07\x2d\x6a\xe7\x82\xaf\x37\xf7\x46\x7b\xf3\x70\xbc\x98\xb1\xc9\x3e\xf1\x5a\xa2\x7a\xf3\x12\x07\x2c\xb5\x88\xcf\x7d\x2f\x1c\x9d\x1c\x76\x37\xba\xf8\xe4\x9e\x9e\x29\x1f\x6d\x84\x38\xf4\xb0\x75\x8c\x1c\xfb\xc4\xa9\x12\x7f\xb1\x08\xf8\xab\xd1\x6d\x33\x0e\x7d\xc3\xc5\x96\x4a\xe5\x2b\xc3\x79\x29\xcf\x28\x5d\x99\x51\x36\x40\x80\xd6\xd0\x08\xda\x9a\x16\x32\x0c\xc5\xe6\x96\x4f\x72\xb5\xea\xb1\xc7\x0e\x2d\xa2\x63\x54\x82\x65\xee\x60\x14\x66\xf1\xa3\x8a\xbe\x87\xeb\x68\x1b\x9f\x65\xe4\x65\x89\xdb\x65\xac\x7c\x9e\x95\x9c\xf8\x49\x07\x56\x2b\x11\xb2\x5c\x29\x37\xe2\xd9\xed\xd0\x11\x25\xd4\xbb\xb0\xa5\x47\x2e\x32\xbd\x70\x12\x04\xa7\x43\x8b\x1a\x43\x5d\xd6\x6f\xbe\xcf\xcf\x80\x6a\x13\x52\x14\x0c\x1d\x97\x0c\x7e\xb9\x9c\x79\x83\x77\x2c\x38\x7b\x41\x33\xa1\x26\x71\x62\xb5\x1a\xe0\x3e\xf9\xc4\x9a\xb3\x18\xd3\x4e\xed\x8f\x99\x43\xfa\x80\x01\x01\x6f\x43\x04\x0a\x86\x92\xf5\xa2\x7e\x00\x73\xe3\xb2\x53\xf8\x6b\xf5\xc9\x87\x98\xea\xc8\x62\xa9\xc4\xb7\x7c\x81\xe8\x7d\xb6\x14\x9e\x45\xed\x5b\xa0\x1c\x6f\xa7\x8e\xee\x72\xf0\xc2\x3e\x8e\x90\x49\x0d\x9a\x65\x54\x98\x7c\xe8\x27\x0c\xe3\xf2\xcf\x88\xe1\xbc\x76\x4c\x8b\x60\xf4\xaa\x9b\x67\x68\x4b\xdc\x2e\x9e\xc6\x14\xbb\xe4\x31\xa6\xad\x1c\x28\xd5\xe0\x22\xe7\x8e\xee\x02\xfe\x76\x8d\xbb\x31\xf6\xd0\xd2\x54\xb3\x79\x64\x3d\x47\x39\x52\xbf\xb7\xdc\x14\x0d\xff\xef\x2d\xfc\xe5\x3f\x58\xf8\x83\xa3\x8d\x2b\xdf\x58\x59\xf9\xcf\x9b\x7b\xf2\x4a\x47\x3e\xaf\x76\x44\xb0\x18\xd0\x03\x2c\x9b\x9e\xbb\x45\xd3\x14\x44\xca\x00\x1e\xdc\xad\x04\x35\xee\xce\xe0\x33\x3f\x0d\x91\xa6\x5d\x31\xac\xaf\x2c\xce\x55\x26\xc4\x70\xe0\xd3\x80\x91\x35\x8c\x79\x0a\xda\xe5\xf3\x83\xd5\x94\x26\xe0\xf6\xad\x9d\x29\xc1\x4b\x4e\x33\xdd\x35\xbe\x0e\x0a\xa7\x84\x8c\xd0\x85\xe0\xc8\x97\x1d\xcb\x15\x97\x0c\x25\x53\x8f\xd6\xc6\x54\x9d\x0d\x80\x1a\xdd\x36\x32\x5d\xb8\x87\x13\x40\xa6\x69\xa5\x57\x80\x39\x4f\x42\xdb\xf6\xb6\xa5\x7b\x6c\xb4\x2e\x42\x2d\xfd\x34\x83\x68\x54\xec\x40\xf3\x8c\xe1\xb9\xa6\xe9\x5e\x4e\xe7\x60\x17\xf6\x09\x17\xd2\x9a\x40\x21\x49\x2c\xd6\x50\xac\xd5\xe4\x54\x54\x73\x47\x19\x0d\x31\xe2\xc2\xdb\x03\x35\xbe\x0e\x5a\xec\x8f\x31\xf4\xa4\x88\xcb\x6c\x58\x62\xd6\xad\x95\xd2\x1b\x8e\x43\x38\x9d\x15\xb7\x07\xe2\xf0\x3d\x74\x9d\x22\x9c\xb4\xc4\x98\x57\xe2\xf4\xd3\xb4\x7a\xdd\x2d\x20\xbb\x58\xbd\x8f\x5c\xb6\xb5\xde\xc9\xf6\xad\xfe\x81\x33\xe6\xb2\x67\x62\xbc\x55\x0a\x4a\x01\xf2\xb3\x62\x21\x59\x12\x52\x02\xd9\x73\x96\xb5\xce\x32\x9b\x3a\x26\xfc\x25\xfd\x6e\x9d\x2a\x56\x8e\x31\x5d\xf5\x33\xd0\xe4\x17\x6d\x1c\xfe\xe2\x10\xe0\xef\xb0\x6b\x0b\x24\xe1\x20\xae\x47\xe1\x8a\xb1\x32\xe4\x4c\x39\xb4\xd3\xc2\xd1\x80\x2b\x5d\xa7\xc2\x69\xe0\x69\x9a\x38\x26\xf4\x40\x23\xd5\x66\x95\x90\xf3\x98\xea\x21\xf8\xb5\x10\x5d\xed\x51\x5d\xdd\x63\xe7\x31\x2d\x3b\xa8\xb8\x1b\x03\x40\x76\xa8\x90\x0a\x58\xd4\x78\xdf\x81\x8d\x50\x08\xa3\x3c\x86\x57\x7c\x5c\xda\x19\xa7\x31\x55\x5c\x22\x15\x3b\x02\x60\xa2\xfa\x18\xd3\x9c\xfc\x5a\x2c\x82\x58\x1f\xc4\x70\x22\x33\x4c\x7c\xc0\x40\x11\xb8\x22\x0c\xe2\x03\xe1\x9c\xca\xe3\x2c\xaf\xe4\xaa\x3d\x95\x13\x42\xe8\x25\x33\xc5\x14\xf0\x88\x38\x0c\x8e\x81\xf3\x61\xcc\xd1\x87\x89\xee\x31\xde\x67\x45\x12\x11\xa1\x97\x90\xf1\x6a\x71\xa8\x87\xb2\x62\xb2\x52\xb1\x57\x66\xb8\x1a\x3c\x28\x0a\xf7\x3a\xe8\xdb\x37\x53\xc7\x0a\xad\x90\x84\x70\x0d\xe5\x09\xdf\x7a\x05\x42\x82\xfd\xdc\x87\xd8\xb7\xdb\x4d\xab\xea\x1b\xcf\xcf\x9a\xd6\xd8\x27\x7d\xab\xbf\xbd\x8d\x3a\x13\xdd\xc7\x9e\xdd\x77\x10\x0e\x34\xc2\x20\x82\xbd\x30\xe2\xbb\xc1\xf6\x28\xab\xa6\x4f\x1a\xb2\x58\x9f\x13\x57\xfd\x7a\xfd\x27\x05\x9b\xb8\xf0\xef\x2c\xcf\x7d\xb1\xa6\x62\x6a\x5d\xe1\xa3\x5e\x31\x80\xcd\x04\x1d\xca\x76\xb9\xa5\x40\x70\x9a\x31\xa6\x76\x1c\x56\x3e\x64\x22\x6a\x2b\x57\x9b\xba\xc9\x48\xed\xc7\x0f\x49\x42\x70\x0d\xdd\x1f\xe1\x88\x53\x12\x7f\x48\x4a\xe2\xdd\xbb\x77\x2a\x0b\x78\x21\xd1\x43\xa2\x7a\x7f\xa1\x16\xb5\x6f\x32\x07\xce\xe2\x9b\xcc\x21\xaa\x74\x3f\x3f\xd6\x46\xfc\xd2\xa6\x90\x7d\xb2\xac\x0a\xf1\xd4\xc9\xa4\xb8\xf5\xeb\x40\x9e\xe5\x0a\xdf\xfe\x25\xe5\xe4\x24\x7f\xdb\x3a\xe2\x1c\xdb\x57\xbd\x93\xe1\x59\x86\xac\x0e\x63\xc4\x18\x33\xca\x60\xed\x9e\x74\x04\x5f\x76\x7a\xb0\xee\x87\x6c\xeb\x88\xbb\x77\x5e\x35\xc0\xdb\x40\xc1\x9e\x67\xaa\x9f\x1d\x1f\xfc\xae\x6d\xc0\xdc\x1b\x4a\x7e\x5e\x2b\xf9\x66\x36\x59\xf1\xe6\x07\x88\x51\xfa\x28\xda\x3a\x2a\x28\x71\x08\xef\xec\x59\x1e\xf1\x8c\xad\x23\x24\xa3\x22\x2b\x44\xfc\x97\x94\xb2\xfd\x0c\x41\x26\x40\xce\xc0\x03\xb7\x50\x98\x37\x10\xc3\x7b\x8a\xb4\x41\x05\x82\xc7\x0c\x81\x1d\xad\x10\x11\x8a\x6c\x32\x1a\x9f\x95\xd7\x00\x11\xcb\x7a\x7d\x08\x2e\x24\xc2\x17\x55\x1b\x3c\x7e\x8c\x8b\x0a\xfa\xd9\x15\x7b\x82\xca\x3d\x11\x59\xd1\xf6\x36\x0a\x09\x37\x57\xb6\x23\x06\xdc\xe4\x36\x63\xd8\x8a\x6d\x08\x8a\x34\x2d\xb0\x58\x6e\x70\xfb\xdc\x11\x31\x4c\xd7\xb2\x60\x91\xa5\xf8\xd0\xe4\x1f\x10\x2a\xba\xc0\xc8\x77\xd1\x72\xc4\x71\x68\x54\xaf\xbf\xd6\xb6\x28\x5f\xc4\xbc\x40\xab\x62\x91\x4e\x66\x04\xc6\xe1\x8a\xb8\xe8\xeb\x40\x84\xc0\x2e\x1d\x76\x65\x20\x64\x3c\xca\x70\x03\x0c\xa8\x62\x98\xaf\x03\x20\x48\xf3\x48\x3f\xd8\x65\x5d\x92\x30\x75\x70\xf4\x0f\x8a\x37\xf2\xe2\x73\xf7\x4f\x8b\xdb\x57\xae\x53\x2a\xce\xcb\x16\x46\xe3\x0a\xeb\xc2\x8e\xac\xaf\x03\x76\x6a\x89\x02\x2e\x12\xee\x87\x95\x18\x90\xf2\x08\x53\xa2\xbf\x32\x00\x29\xa8\xb7\x7a\x3d\x94\x37\x9a\xae\x74\x53\xa4\x69\xd5\x08\x4e\xb2\x88\x9f\x6c\x45\xcc\x89\xbb\x31\x1e\x90\x08\x0e\xa8\x08\x0e\xa8\x08\x0e\x28\xc6\xe3\x33\xda\x2a\x02\x21\x34\x3b\xfa\xfa\x6c\x81\x06\xd8\x67\x8b\xb9\xcc\x91\xa4\xa6\xb1\x8f\xbe\xf1\xe4\xd3\xe5\x06\xfe\x77\x65\x2a\x83\x5b\x75\x2a\x10\x2c\xe0\x46\x0e\x76\xa5\xdc\xdd\xd9\x86\x29\xdc\xc0\x9f\xae\x14\x6b\xdf\xea\xc0\xab\x2a\x71\x9e\x84\x5b\x76\x57\x5d\x82\x3b\x21\xcf\xe8\x64\x2b\x30\x78\x3a\x27\x74\xb1\x10\xb7\x08\xdd\x63\x76\xd6\xba\x31\x7f\x7b\xdc\x23\x5f\x38\x8b\x3b\xdd\xc3\x4a\x91\xa4\x4d\xe6\xb1\x8e\x96\x5f\xf5\xbb\x0c\x77\x32\x64\xdd\x93\x3b\x81\x12\x85\xcd\x34\x3b\x61\xef\x8d\xd0\x97\xfa\xa6\xd3\xbd\x0d\xb7\x91\xf6\x87\xa9\x23\xb9\x16\x56\xdf\xb6\xa8\xdc\x6a\xec\x33\x12\x6a\xdf\xf8\xf7\xaf\xa2\x87\x5c\xa0\x1a\x0a\x51\x46\xf7\xd8\x7e\x9c\x8a\xb0\xed\x8f\xbc\x63\xc6\xe9\x7c\x9b\xca\xa8\x29\xa1\x2f\x95\x95\xbb\xc7\xb6\x27\x73\x86\xbe\x70\x85\x29\x7a\xc5\xdf\xec\x70\xea\xe8\x77\xa9\x78\xf9\x30\xcd\xdd\x32\xff\xbc\x31\x51\x95\x98\x08\x84\x96\x4b\xeb\x6c\xc5\x53\x28\x97\x20\xca\xe9\x10\xf7\x3e\xa1\x2f\xef\x81\xff\x56\xfd\xe0\xce\x74\xf2\xb3\xfa\x9b\xd6\xdf\x19\xfa\x3a\x7a\xba\xdb\x80\x9e\xec\x7b\x90\x2b\xab\x72\xa1\xee\xb1\x02\x52\xf7\x99\x5e\x8a\xb8\x48\x11\xf2\x80\x3d\xfa\x02\x78\x57\x39\x23\x8a\x1b\x64\x76\x50\x13\x72\x11\x21\xc8\xc5\xde\x18\x67\xb3\xd9\x77\xf4\x40\x1c\x80\xb9\x0b\xdd\xc2\x23\xee\x6e\xf3\xed\xbf\xde\xfe\x7b\xef\xf7\xb7\xff\xda\x77\x5b\xdb\x4d\xd3\x8d\x61\x16\x29\x76\x17\x8b\x86\x42\xb7\x7c\x01\x8a\xc2\x8d\x61\x2e\xa8\xba\x1f\xbe\xc2\xfd\xfe\x57\xb8\xa0\xf5\x22\x71\x79\xc6\x5f\xfb\xfe\x9a\xce\xae\x25\x85\xa9\x5e\xc4\x58\x38\x9d\x92\x97\x25\xbe\x10\xaa\xf2\xa0\x66\x64\x37\x18\x71\x00\xbe\xe6\x48\xb5\xc1\x68\x6f\x99\x9f\x94\x3c\xd8\xb2\xea\xbe\x65\x45\x3f\x3e\x01\xeb\xbe\xfc\xaa\x7f\x8a\x29\xfe\x9a\x29\xd4\xd0\xa5\xca\x2e\xe8\x94\x5c\xc0\x3b\x6a\x01\x91\xe6\x65\xf1\x3c\xf8\xc2\xa3\xbd\xcb\xa0\xfb\x5f\x2e\xce\x4f\xb2\x6c\x22\x4c\x85\x8a\x49\xb8\xc8\x59\x98\x2a\x35\x7a\x11\x2d\x05\x9a\xcf\xc3\xe8\x97\x4b\xaf\x04\xa3\x17\x79\x4a\xcd\xaa\x17\xfe\xf6\x97\x88\xe2\xfb\x88\xe2\xbb\x88\xe2\xaf\x11\x04\x26\x29\x85\xb5\x11\x17\xff\x2e\x88\x15\x93\x27\xd5\x71\x6f\x79\x2c\x3e\xc2\xd0\x49\xe2\x0b\x0a\x3c\x40\x2f\xcb\xa5\x12\xc6\x70\x36\xf0\x79\x30\x6d\xf0\x33\x51\x2e\x6d\xc8\xd7\xca\x30\x8e\xba\x60\x80\xea\xc7\x29\x6c\x11\x70\xab\x0c\x56\xbb\xe2\x9b\x30\x50\x05\xea\x65\x30\x08\xfc\x22\x64\x7e\x05\x3a\xb0\xfc\xc6\x8d\x1b\x3e\xc5\xb4\x58\x93\x2d\x80\xa7\x35\x1c\xca\x83\xd3\xa5\x90\x7f\xd0\x17\x5b\xb1\xc3\xf0\x6a\x71\x0f\xf1\x6d\x96\xef\x52\xaf\x23\xa2\x54\xf8\xca\x3d\xc5\xdd\x13\x4f\x0c\x77\xc9\xa5\xf0\x52\x29\x52\xae\x9a\xfc\xf7\xf2\x86\xff\x06\xc5\xad\x6f\xd0\x91\x37\xca\xbe\x7a\xe7\xf1\xe4\x51\x59\x89\xb7\xcb\x0b\xf9\x14\x94\x09\xbe\xea\x5b\x1c\x65\xb3\xf5\xf8\x0c\xb6\x0d\x60\xde\xd6\xda\xda\x89\xf1\x55\x4c\x89\x7d\x93\xe0\xda\xe7\xdb\x4e\xcd\xc1\xd7\xec\xd5\xb1\xee\xc9\x96\x40\xee\x93\x31\x5d\xd3\x5e\xf8\xa6\x23\x2b\xe8\xe9\xd7\x31\x77\xcb\xc8\x8e\xbb\xa7\xc9\x46\xb1\xbf\xd4\x41\x39\xf1\x0b\x41\x9c\x1d\x8d\xc7\x91\x31\x0a\x32\xe3\x4b\x37\x39\x1d\x3b\x15\xbe\x8e\xe0\x8b\x1e\x56\x52\x44\xeb\x1f\x8d\xc1\x15\x84\x30\x79\x23\xb5\xba\x98\xaa\x7a\xcd\x62\x30\x74\x9b\xc4\x04\x62\x02\xba\xc4\x6d\xb9\x76\x3f\x70\x74\x64\x5e\x45\xe2\x62\x25\xdc\x95\x57\x2c\x77\x4f\x72\x5a\x94\x39\x64\x0b\x23\x26\xf1\x44\x20\xe5\xb0\xd3\xba\x94\x76\x30\x61\x07\x99\xec\xe5\x9b\xbc\x4f\x96\xab\x17\x76\xc4\xb1\xd4\x31\xfa\xbe\x8e\xcc\x6f\x19\xfc\x5a\x57\x13\x39\x4e\x2c\x4e\xcf\x13\x4f\x4c\x0e\x02\xd8\x97\x8b\x2a\xf5\x80\x4e\x7c\xfb\x82\xb1\x2f\xb8\x38\xfe\x19\x06\xc9\xb3\x35\x8b\x9d\x00\x69\xb7\xa9\xfe\x5b\x21\x35\x5b\x52\xe2\x2d\x16\x97\x6a\x74\x14\x01\x8e\xf6\x21\x5c\x18\xf8\x9a\x36\xed\xaf\x85\xe9\x0d\x8d\x34\x60\x9c\x1e\xb8\xe8\xf6\xc9\x97\x58\x0f\x8d\x8b\xbe\x8e\xf0\x4d\x4c\x21\x2a\x44\x6c\xbc\x1f\x27\xc3\x63\x9a\x51\x1e\xdc\x26\x27\xf2\x95\x2f\x56\x75\x2b\xd6\xaf\x62\x56\xe1\x62\xf1\xc6\x5f\x2c\xbc\xc5\x82\x57\xfc\x29\xa2\xb8\xdf\xa5\xc8\x0a\xed\x3b\xd7\xd1\xcb\x6d\x8b\x51\xb3\x8c\x02\xdd\x9c\x40\x8f\x79\x77\x54\x4a\xe3\xc9\xa3\xf2\x40\x3b\xf1\x0d\xa9\xfa\xdb\x79\x9a\x88\x9b\xa1\x27\x8f\x22\x6b\x18\x17\x57\x48\x27\xbe\x92\x7f\xc5\x1c\x2b\xdf\x08\x7c\x19\x3a\x12\x7d\xe3\xc6\xbe\xd8\x4c\x9a\xa6\xeb\x72\xd7\xdc\x4a\x00\x38\xf1\x11\x6a\xe5\x75\x0a\x13\x34\xb1\x13\x3b\x72\x05\x8d\xf1\x48\x7e\x11\x8b\x3e\x08\xc5\x9a\x9b\x72\x7f\xde\x67\xa5\x2f\xb2\x34\x12\x4b\x7d\x79\xa3\x42\x44\x0c\x07\x56\xf1\xa5\x59\x08\x24\x0a\x20\x88\xca\x7e\x34\x6f\x4b\x02\x26\xa1\x71\xf3\x07\xd2\xb4\x69\xac\x53\xd9\x73\xa4\x69\x8c\x5e\x2c\x3a\xac\x1c\x97\x37\xa5\x0a\x06\x5d\x4a\x08\xe5\x6e\x7a\x97\x6f\xee\x8d\x41\xa8\xee\xfe\x4d\xe7\x03\x8d\x05\x3f\x53\x2c\xc3\xdd\x13\xf1\xba\xb4\x2e\x06\x5c\xbf\xe8\xd2\x82\xee\xea\xc6\x62\x84\xf6\x97\xa9\xa3\xff\x9b\x7b\x26\xbf\x5d\x0d\xce\xb5\x8a\x3d\x8b\xba\xe3\x27\x75\xc6\x58\x1d\x62\xc2\xd8\x07\xa9\x4e\x73\xf7\x44\x5c\xeb\x4e\xae\xb5\x45\x67\xba\xc0\x53\x05\x69\x2c\xcc\xaa\x8c\x60\x17\x14\xed\x18\x6e\x60\x27\x39\x74\x31\x45\xe2\x69\x92\x22\xb4\xfc\xba\x89\x08\x3b\x11\x3a\x0b\xc6\xb7\x99\xec\x19\x74\x17\xff\x85\x4e\x2a\x93\x91\x2a\x14\x69\xdc\xa5\x08\xcb\xae\x6e\x20\xd7\x56\x26\xe2\x1f\x34\x9c\x57\xcf\x70\x0d\xb2\xb6\xca\xf4\x1f\x30\x2d\x27\xde\x3a\xba\x2f\x14\x19\xaf\x9a\x8b\x85\x80\x4e\xf1\x10\x3f\xb5\xee\xe5\x3c\x73\xa0\xbf\x4f\xa9\xce\x57\xf5\xbe\xac\x43\x90\xe7\x53\xc9\xc9\x9c\x4c\xa1\x30\xa0\xd7\x00\x8c\x51\x31\x5e\x07\xe2\xf2\xbf\xad\x12\x77\x06\x42\xf5\xdd\x2a\xf1\xd8\x13\xe2\x46\x63\x97\x37\x9a\xf6\x96\xf0\x8f\x88\xd1\xa9\x80\x83\x1b\x39\xad\x09\xca\x13\x6c\xa2\x6f\xd9\x44\xe7\x39\x5f\xa8\x04\xb4\xe4\x89\x75\xe4\x0b\x27\xb9\x56\x41\xc1\x8b\xa9\x22\xd9\x70\x21\xb7\x4b\x76\xf7\xa1\x92\x16\x05\xd4\x06\xc6\x99\x9d\xe0\x31\x33\x2f\x0b\xf5\x78\x97\x5c\x2e\x29\x40\x64\x3d\x89\x68\x1d\x7a\x5c\xef\x47\x16\x87\xc0\xe5\x32\x8c\x47\x74\x30\x78\x7a\xa1\x33\x78\x55\x44\xa5\x2c\x25\x97\x94\x9e\xf8\x08\xb0\x57\x71\x27\xc0\x0e\x1b\x08\xcb\xd0\xb1\x1b\x4e\x2b\x8c\x4d\xa1\x7b\x20\x29\x0c\xf6\x85\x3f\xb9\x8b\x05\x1f\xc4\x79\xca\xd1\xe0\xd5\x44\x07\x56\x53\xa1\xb6\x14\xbf\x70\x72\x6b\x30\x58\xa3\x86\xb7\xcb\x48\xdd\x32\xba\xe3\xea\x68\x80\x61\xfc\x0e\x23\x85\x19\xcd\xcd\x1e\x31\x95\x44\x09\x5a\xde\x1b\xd7\xfd\x75\x1d\x92\x6a\x55\x40\xa7\x02\x05\x7c\xca\x85\x65\x00\x4c\x10\xf6\xac\xcc\x5c\x09\x0a\xbd\xdb\x68\x98\xe2\xa1\x29\x1f\x76\xe5\xc3\x5b\xf9\xf0\x3b\x7f\xd8\x93\x29\xcd\xdd\xdd\x3d\xd3\x53\xd4\xcd\x94\x68\xc9\xd5\xe6\x92\xdf\x73\x41\x58\x1d\xd2\x20\x84\xb8\x88\x92\x74\x98\x33\xe5\x46\xb8\x8b\x10\x80\x1d\x5c\x78\x54\xa9\xa6\xa5\xc1\x20\xb4\x1f\x21\x80\x27\x25\xf2\xc5\x7e\xcf\x98\x1a\x42\xed\xae\xe7\xe8\x0c\x8f\x7c\x74\xb6\x9b\x08\x61\x97\x54\x3f\xc7\x14\x22\xaf\xd3\x96\x40\xab\xe6\x25\x9c\xb5\x9b\x42\xb7\x02\x30\x15\x86\x8a\x27\x3e\x00\x96\xdd\x99\x3a\xa6\x72\xa3\x02\x33\xf4\xa2\x50\xd4\x1b\xa0\xd0\xdc\x6e\x16\x1a\x3d\xf9\x3d\xaf\xe2\x47\xaf\x84\xf5\xc7\x6c\x25\xef\x9e\x58\x0d\x77\x4f\x66\x3e\xf8\xbb\x27\x75\xaf\xfa\x33\xe5\x06\xc0\x5a\x15\x03\xfa\x33\xa1\x54\x3c\xe2\x17\xe6\x2d\xd7\xa4\xc6\xf1\x08\x07\x02\xe3\x50\xe3\xd3\x00\x61\x06\xb6\xf1\x33\x0e\x05\x96\x13\xb8\xe9\x99\x78\x38\xca\xf3\x7d\x9c\x23\xdc\xcd\xdf\xce\x05\x5f\x6c\x47\xec\x70\xb4\xbf\x4d\xe1\x62\x34\xce\xbf\x0f\x7b\x9c\xe4\xe1\x75\x77\x57\xeb\xee\x3e\x13\x4f\xe5\x49\x75\x4f\x5d\x5e\x84\x64\x60\x8b\xe3\x11\xa9\x56\x5d\x4b\xf6\xd6\x83\x35\xbf\x04\x65\x7f\xce\xc5\x78\x10\x5b\xfc\xd2\x92\xd5\x5b\xb2\xeb\xbd\x99\xee\x23\x2b\xca\x0b\xee\xe5\x05\xbb\x79\xda\x5b\xa1\xff\x06\x83\xf0\xec\xdf\xf2\x2c\x71\x9e\xe5\xf7\x3c\xcd\x23\x9e\xfd\xaf\x0d\x6d\x75\xa1\x2d\x2f\x8f\xfb\x93\xf7\x5a\x68\xb5\xf4\x80\x15\xe9\xcf\xb8\x3a\xb5\x38\x05\x8e\x47\x68\x79\x4f\xfc\x19\x27\xe6\x3f\x0d\xc8\xa5\x75\xcf\x7a\xcd\x7e\x3e\xce\xe1\xe7\x7c\x2e\x25\x36\x5b\x7d\x72\xc9\x0e\x81\x2e\xff\x7e\x34\xa7\x5c\xa6\xc3\x9a\x69\x5a\x07\x2b\xc2\x0e\x2e\xc4\xb1\x1d\x2c\x83\x8f\x0c\x2c\x57\xd3\x40\x25\x68\x30\xd3\x5d\xfc\x8d\x9d\xf4\x01\xbf\x28\x17\x59\x3e\xce\xd1\x0b\x64\x38\x8e\xca\x01\xd7\xe2\x67\xcb\x2b\xca\x7a\xbc\xec\x7b\x08\x31\x00\x16\x0a\x54\xcf\x05\x87\x88\x51\xfc\x50\xe8\x7c\x2e\xdc\x6f\xcb\x66\x83\x10\x17\xd9\x96\x79\xb3\x02\x68\x44\x0f\x34\xcd\xb5\x8f\x5c\x47\x6f\xa0\x2a\xe9\x25\xa2\x64\x2f\x41\xb8\xe8\xb9\xcc\x40\x48\x2f\x69\x6d\xc5\xd4\xa4\x3d\x8a\x90\x25\x47\x31\xec\x89\xfb\x79\x51\x78\x14\x62\xb7\xf8\xda\x7d\x96\xe9\x0f\x01\xe6\xd5\xf5\x0a\x5f\xff\x15\x2a\x22\x25\xf0\x68\x35\x49\x90\x8e\x07\xf3\xe0\x95\x68\x93\x1c\xb2\xb1\x47\xaa\x55\xb6\x7d\x2c\xaf\x15\xb0\xfa\x60\x2b\x99\x3c\x35\x7e\x2e\x5b\xcc\xb3\x84\x70\xa6\xbb\xc8\x72\xd9\x32\xfb\x52\x81\x96\xe5\xfd\x38\xb7\xbc\x56\xc4\x6b\xf8\x38\x47\x45\xb8\x78\x36\x93\x3e\x11\x9b\x8b\xd7\xd7\xe5\xd9\xce\xe7\xc5\xe1\xc9\x2b\xd9\xea\x03\xb6\xf4\x95\x39\x44\x92\xcb\x63\x93\xcb\xd1\xfb\x56\x1f\xf9\xa4\x97\xd4\x7d\xf5\x32\xc0\xe5\x0d\xd8\xf7\x3e\x4c\xb8\xb5\xdd\xac\x42\xc4\x11\x3f\xff\xc2\xb1\x67\x50\x6f\xa2\xba\x8f\x96\x01\xf1\x45\x0c\xe2\x30\x81\x18\xc4\xb7\x01\xf2\xc9\x65\xde\xa1\xf7\xb1\x1e\xe0\x43\x10\xce\xc0\xe3\x51\x44\x91\xaa\x03\xf5\xc4\x12\xd9\xca\x06\x24\xb0\x13\x8f\xaf\x32\x84\x54\xe6\x6a\x3a\x10\xbc\x5d\x0a\x8c\x03\x3b\xaa\xd7\x1d\xab\xcf\x5a\x69\xf9\x9a\x16\x49\x2d\xb2\x90\x2d\xe5\x25\x32\xfb\xac\x1b\x2d\x5d\x6f\x42\x5c\xae\xc5\xa2\x49\x48\x28\x32\x34\x9c\x2a\xb9\x44\x9a\x16\x1a\x93\xf1\x44\x47\x78\x43\x71\x64\xea\xf0\xd4\x47\xf8\x8d\x4f\xaa\x0d\xb4\xf4\x49\x08\xa0\xd0\x4b\xc4\x8e\xf6\x49\xb0\xf4\x5a\x2e\xe0\x08\x9f\xad\x0e\xcd\x21\xad\x4a\xc8\xa5\xe5\xb5\x62\xb6\x28\xbd\x99\x5e\x7c\x40\x12\x0e\xba\xb0\x81\x74\x9a\xe3\x40\x17\x61\x97\x6d\x64\xaa\x2a\xe7\xfd\x24\x94\x92\x2f\x69\x64\x85\xb7\x08\x66\x52\xd8\x17\xb2\xf3\xc5\x62\x80\x47\xbc\x56\x8f\xd5\x6e\xba\xf0\x0a\xb4\xc1\xa7\x01\x61\x7f\xb8\x8f\x05\x73\x6b\x07\x5f\xaa\xf7\x88\xd1\x5a\x2d\x1f\xe7\x45\x2d\x45\xbe\xae\x38\x5f\x78\x2e\xb8\x93\x79\x71\x49\x97\x8a\x48\x08\x21\x5d\x8f\x78\x77\x48\xfd\xca\x64\x9c\x64\x32\x9a\x17\x58\x26\x33\xa8\x25\x2e\x9f\x53\x2a\xb1\xdb\xf2\xde\x10\xbe\x2d\x5f\x53\x6b\xdd\xea\x2f\xad\xf9\xaa\x14\x03\x7a\xa3\xe0\xe0\xad\x3e\x71\x59\xcf\x29\x32\xa9\x1a\xa9\xab\xa4\x46\x18\xaf\x0c\xd8\x55\xcf\xc9\xfe\xac\x05\xeb\x47\x5c\x38\xbc\x8c\xce\x9e\xce\xce\x49\x06\x20\xa0\x81\x49\x00\x65\x78\x0c\x65\x40\x06\x89\xd4\x5d\x46\xc9\x42\xc6\x42\xb0\x78\x6f\x9c\xf6\x37\x5f\x14\xe4\xe7\xa3\x08\xa6\x99\x8c\x5f\xf5\xeb\x20\x20\x09\xc2\xd3\x7a\xab\x26\x81\xa5\xc1\x0f\x7b\xc0\xe6\x2b\xe6\x53\x7c\xec\x0a\x89\xd0\xa3\xe5\xa1\xf7\x63\xdd\x43\x10\xb2\x57\xde\xfc\x78\x08\xec\x99\x78\x5d\x70\x7b\x9e\x42\x10\xf9\x02\x0e\x86\xb3\x55\xdf\xc5\x3d\xb6\x76\xba\xcb\x48\xca\xd9\x5e\x09\x57\xae\x76\x10\x2e\xa5\xe8\x6b\xdd\x83\x3e\x71\x72\xfa\x68\xae\x44\x6c\xeb\x24\x31\xf7\xb3\x07\x2e\x8b\x9e\x2a\xb4\x92\x04\xd4\xdf\x1e\x8f\x06\x4f\x95\xdb\x24\xae\x21\x8b\xb1\xc2\x9d\xbd\xf5\x9b\xdf\xe3\x91\x14\x33\x0d\x7b\x82\x21\x14\x6b\xfa\x5a\x1f\x82\xde\xaa\x42\x88\x42\x42\xb5\x28\x47\xf9\xa6\xd8\x91\x79\xc0\x82\x62\x76\x7a\x25\x12\xb1\x35\x66\xb5\x99\x4a\xdc\x8b\x41\x79\xf6\x78\x70\x6e\xee\x3e\xee\xf6\xfa\x54\xa7\xdc\x13\x8a\x8b\xc3\x1e\x45\xfc\xee\xbe\x98\x9e\x9e\x74\x35\x62\xd3\x80\x21\x77\x39\x84\xe3\xa0\xae\xd3\x77\xef\xde\x6a\xcd\xdf\x10\x40\x4b\xf3\x77\x54\xd7\xa9\xfa\x0a\x37\xba\xdf\x62\x4a\x76\xec\xff\xf9\xbe\xf3\xbd\xf5\xff\x39\x3b\x11\xa6\x3d\xf6\xfe\xfd\x7f\xbe\xb7\x4c\xf6\xba\x15\xcb\x57\xf6\xe6\xe5\x1f\x21\xaf\xcb\x5e\xff\x67\x27\x2a\x66\xaa\x3f\x2b\x85\xee\x8c\x86\x65\xd9\x2a\xd0\x3e\x2a\xf1\x3c\x9a\x15\x12\xef\x38\x02\xc4\x14\x47\x42\x3c\x8b\xa9\xd1\x71\x09\xdb\x41\xd1\xb0\xd0\x0c\x73\x09\x7b\x87\xa3\xa1\x1d\xa0\x9f\x88\xaf\xed\xa9\xef\xe8\x83\x90\x9d\x24\x3c\x6e\x24\xa7\x98\x1a\xfb\xc4\x6f\xe9\x01\xcf\x12\xb0\x29\xc3\x3e\x3b\x61\xf2\x77\xbf\xde\x44\xc8\xe4\x19\xac\x80\x8c\xa9\x1e\x08\x47\x34\xf5\x9d\x08\xa7\x01\x42\x2c\x75\x06\x77\xe2\x16\x85\x0b\xd9\x00\x87\x6c\x51\xc3\x95\x7c\xe6\x25\x5a\x2e\xef\x49\x5f\x10\x72\x6c\x60\x9c\x66\xeb\xb8\xf2\xc9\xf7\xd4\x3d\x3e\x92\x3b\x43\xdd\xec\x1d\x77\xb9\x41\xb5\x5c\xc9\x2c\x67\x9a\x33\x90\xac\x6b\xd9\x7a\x74\xdc\x38\x82\xfd\x48\x21\x1a\xb7\x4c\xe1\x98\xc1\x03\x73\x45\x8f\xab\x85\x0b\x4d\x7b\xb7\xd0\x5f\xe4\x7b\xe1\xcd\x6c\x35\x42\x7e\xde\x7e\xa9\x49\xb5\xe7\x71\x64\xb8\x21\xd8\xc1\xab\x5d\xc4\xa2\x85\xed\x95\x8e\xd9\x1f\x85\xaa\x77\x1c\x09\x8c\x20\x74\xbd\xe7\x9b\x2e\xec\x62\x11\xfc\x46\x8e\x5b\x54\x4a\x1a\x4b\x64\xdd\xae\x14\x58\x9d\xd6\x86\x08\xef\xda\x71\x41\x60\xe3\x86\xe4\x9f\x8d\x0b\x62\xf4\xbf\x1a\x75\xfc\x96\x16\x41\xb3\xb6\x62\x2e\x32\xb5\xee\x8d\x8b\xfe\xc6\x15\x97\xe0\x4d\xf3\x59\x61\xe5\x25\x99\x1e\x47\x5c\xe6\x0b\x31\x05\x79\x5c\x1a\x00\x79\xbf\x5e\x57\x94\xb6\xa9\xed\x3b\xe2\xee\x3d\x90\x9a\x93\x7c\x59\x6d\xdf\x51\x62\xde\x32\x22\xf6\x96\x6e\x1e\xb4\xb8\x26\x72\x0a\x75\x12\xe8\x00\x8c\x17\xf4\x28\xc3\x9e\x34\x2e\x10\x2b\x57\x4c\x12\x12\x57\x89\x2f\xe5\x41\xac\x44\x0f\xa4\x72\xaf\x8a\xba\xa8\xed\x39\xa8\xa4\xb8\x9e\x06\xd9\xdf\x87\xf5\x52\x37\x5f\x07\x31\xc9\x03\x4a\xe0\xb7\x5d\xe7\x55\x98\x07\xf2\x63\xa3\xd2\x39\x6d\xc9\x25\xa6\xc8\xb4\x73\x45\xab\x06\xa8\x75\xc9\x0b\x7e\xcf\x6e\x38\x8c\x58\xe2\x23\xe2\xc7\xe6\x06\x91\xa9\x3c\xfe\x1a\xb0\xa4\xb2\xf3\xa5\xcd\x22\x7a\x5b\x8c\x16\x47\x3d\xc6\x2e\xc9\xad\x54\x07\x0d\x1c\xb4\xb4\xde\xac\xf2\x7b\x92\xca\x8f\x86\xa5\x50\xa8\xd1\x10\x34\x39\x44\xe5\x45\xf8\xae\x02\x0a\x0b\x16\xb1\x80\xbd\x12\xa6\x2d\x48\x76\x97\x1b\x2c\x14\xfc\x9e\x8f\x10\xf6\xf3\x4d\xe0\x4b\x3f\x04\xfe\x4a\xf0\xaa\xc0\xf2\xed\xd0\x61\x64\xb2\xa6\xe9\x51\x9d\x0c\xc2\xba\x52\x87\x1d\x3a\x0c\x9e\x80\x29\x8b\x72\xf8\xc8\x4f\x15\x20\xc3\xdb\x01\x23\x7d\x57\x09\x64\x3e\x00\x4e\x82\x59\xec\xb0\x90\x98\x42\x2e\xbd\x3c\x66\x24\xb6\xe1\x1c\x1b\x9c\x36\x62\x42\x15\x7a\x4d\x21\xad\xc7\xaa\x30\x85\xe4\x5c\xab\xc5\x48\x3c\x90\x52\x78\x5c\x58\x54\x0e\x2f\xbd\x42\x82\x50\xc9\x6e\x41\x99\x51\x49\xf0\xb1\xb2\xe8\xab\x37\x32\x39\xc7\x28\xda\xb1\xbc\x2a\x91\xa2\x65\x80\x22\x4f\xd4\x53\x50\x69\x3e\xdb\x96\xcb\xfc\x52\x4b\x92\x3f\x60\x1e\xf2\x98\x05\x23\x9f\x6c\xb2\x88\x10\x1e\xbe\x4a\x86\xe1\xf5\x3a\x9a\xf6\x75\xd5\x20\x1c\x6f\x10\xff\x73\x75\xfb\xfc\x72\x88\x5f\xa3\x47\x8c\x4c\xf8\xbe\x93\x4e\x18\x85\x96\x76\x83\x20\xdb\xc1\x5d\x9e\xa6\x7b\x9e\xb7\xc8\xa6\x8b\xc9\xcc\x45\x5b\x3b\x38\x66\xa9\xff\x51\x32\xa6\x2d\x70\xa8\xd0\xfa\x2e\xc2\xc4\x7c\x37\xbc\xf1\x70\x6b\x07\xf7\x20\xa3\x3f\xf6\xd2\xd2\x97\x5f\xb7\x76\x70\x1f\x3e\xe9\x59\x12\x3f\x2e\xd4\x9a\x16\x2c\xf7\xe2\x21\x70\xfd\x24\x9e\x07\x48\xdf\xb6\xe9\xf6\xb3\x53\x47\xad\xef\x86\xee\x8d\x93\xc9\x22\xa5\x23\xdf\x1d\x3f\xa2\x52\x8d\x3b\x78\xc0\xeb\xfb\xfe\xf0\xeb\x77\x03\xbd\x34\xf1\xee\x92\xe5\x5e\xed\xd0\x70\x6d\x8c\xa9\xfe\x7d\xc7\xff\xbe\x63\xff\x67\x87\x35\xb2\x83\x47\x62\xc4\x81\x1f\x67\x8b\x68\x1e\x3f\x7f\xdf\xc9\xa6\x0b\x36\xea\xf1\xeb\x83\x99\x28\x9f\x44\xff\xd6\xf2\x4c\xff\x52\x07\x13\xc8\xf5\x7d\x87\x7e\xdf\xd1\xed\xef\x0f\xdb\x4e\xfd\xbb\x81\xea\xdf\x1f\xea\x3b\x78\x32\x83\xf2\xeb\x9f\x58\xb7\x53\x28\xc7\xe7\xea\xbb\x5f\xff\x6e\xe6\x8f\x5b\x3b\x31\xce\xca\x5f\xb7\x76\x62\x85\xa7\x9a\xce\x8a\x23\x71\x36\x04\x09\x31\x89\x7b\x5c\xb2\x0a\x7e\x31\xfa\xc5\x4b\x40\x06\xc5\x8b\x4b\x7a\xc5\x4b\x48\xe6\x43\xee\x09\x83\x6d\xe9\xeb\x20\x6a\x3f\x4e\xf4\xc9\xcc\x9e\x4c\x9d\x7a\xb7\x47\xd9\x2f\xcb\xa4\x53\xa2\xaf\x67\x88\x78\x86\x3c\x23\x82\x5a\x43\x84\x16\x8b\x48\x3c\xe6\xac\xb6\xa6\xd1\xc5\x42\xf7\x17\x8b\x60\xb1\xf0\x90\xa6\x85\x8a\xdb\x8a\x1e\x5d\x1f\xca\x44\x1d\xca\x54\xed\xfd\x38\x7f\xb1\x28\xef\xbd\xb5\xb1\x77\x43\xd1\xbb\x51\xa9\x77\x39\xb5\xa1\xbb\x70\x51\xeb\x23\x4d\xa3\x0a\xcd\x3c\xef\xe5\x6a\x22\x99\x68\x88\x96\xfd\x28\x81\xe1\x5e\xa0\xaa\xe5\xb9\xd8\x23\x97\x82\x72\xa0\x92\x72\x90\xfa\x9e\xc0\x39\xf8\xc0\xb0\xff\xfe\xdb\xbb\x60\xb1\xf8\xa3\xb1\x1f\x70\x1b\x13\x49\x20\x5b\xae\x78\xf1\x8b\x40\x81\xac\x32\xd2\x84\x26\x02\xa9\x16\xdd\xd8\x27\x81\x15\x6c\x6f\x23\x5a\x27\xfe\xaf\xba\x07\x55\x07\x68\xfb\xf7\xb7\x08\xfb\xbf\x92\xdd\xdf\x2d\x70\x0b\x42\xfa\x54\x77\x71\xb3\xe0\x56\x72\x41\x01\x71\xd9\x5f\xaf\xc5\xc6\x01\x1c\xd5\x59\x1f\x42\x21\x72\x4c\xf2\xd0\xa3\xe4\x25\x8c\x93\x34\x3b\x8f\x47\xc1\x69\xca\xaf\xa3\xcd\x92\xf3\x85\x64\xa6\xea\x30\xba\xc0\x29\xec\x7c\x4f\x5a\xdf\x47\x3b\x88\x91\xf4\x1f\x64\x10\xe7\x7a\x1a\xd1\xba\xee\xd5\x9b\xa8\x7e\x12\xd1\xba\x8b\xf2\x4f\x80\x50\x0f\xa6\x4e\x5d\x4f\x82\xfa\x49\xac\xa7\x01\xde\x6e\x12\xe2\xb7\xd8\xe9\x67\xfa\xa8\xbe\x95\x20\xb4\xfc\xaa\x27\x33\x3c\xe4\x71\xb6\xe6\x71\x6a\x78\xe9\xdc\xf8\x4c\x93\x34\x68\x73\x3f\xd5\xc9\x2c\x8f\xaa\x15\xba\x7a\xc2\xb8\x00\x5c\x53\x32\x28\x27\x4b\x3a\x5b\x8b\x80\x7c\xd3\xd3\x1f\x7a\x74\x25\xaa\x77\xd8\xe7\xc7\x39\x1b\x5e\x81\x64\xd7\x3a\x90\xd4\x70\x5a\x34\xfe\xa6\xeb\xea\xe9\x6c\x35\x44\x6a\x71\x7f\xc1\xf9\x47\xf2\x98\x68\x9a\x3e\xd8\xde\xc6\x23\x32\x41\x56\x4a\x14\x03\x07\x4f\x47\x2f\x13\x32\x2a\x22\xa7\xa7\x72\x2f\xa4\x96\x2b\x4b\xd6\xeb\x78\x44\x1a\xac\x24\xc0\x60\x4e\xd0\xc5\xa1\xde\x7f\x47\x72\x22\xe3\x29\x01\x58\x3a\x72\x1d\xbd\x5f\xaf\x23\x6b\x54\xaf\x0b\x3e\xa5\xda\x64\x95\x25\x41\xcb\x23\xd5\x86\xe9\x12\x32\x8d\xa8\xa6\xe9\xfd\xfd\x08\x64\xb3\xac\x00\x62\xdf\x35\xad\x5f\xaf\x63\x0f\x82\x11\xcb\x83\xb6\x25\xdb\xc7\x8f\x49\x49\x40\xe5\xeb\xf2\xd0\xec\xe3\x80\xcc\x2c\xb8\x35\x14\xf6\x8c\x5c\x6e\x1a\x12\x72\x16\xe5\x86\x2a\xcf\x89\x48\x7b\x4a\x16\x8b\x90\x8d\x2d\x37\xbd\x6b\xe9\xae\xce\x72\xe2\x4b\x64\xe6\xd9\x66\x01\x7a\xf1\x49\xdf\xe2\x4c\xa6\x30\x26\x60\x35\x87\x55\xf2\x94\x58\xf0\x8c\xf2\xac\x20\x19\xed\x6f\x37\x31\xa4\x63\x9e\x28\x8a\x02\xe5\xcc\x73\x5e\x07\xd0\x76\xd1\x85\x97\x90\xcf\xb2\xab\xe7\x81\x3a\xb9\x20\x84\xed\x90\x64\xa6\xff\x72\x3b\x0a\x1e\x27\x81\x07\xbe\xfe\x65\x50\xc7\x4a\xed\x97\xfa\x9b\xb0\xfe\x4b\x4d\x78\xe4\x9f\xce\xc6\x59\x50\x19\xd2\xa4\xff\x0b\xa6\x78\x80\x47\xdb\x4d\x64\x2d\xf3\x90\xb8\x01\x2a\x55\x59\x53\xaa\x0c\x46\x3e\xc4\x49\x09\x1e\xa5\x77\xff\xf1\x24\x18\xf1\x0a\x6b\xbc\x2e\x45\x56\x0e\x68\x02\x4b\xf7\xad\xb5\xda\x4e\x84\x67\x01\x5a\x82\x3f\x1b\x98\x15\x4d\x0b\xab\xe4\x3a\x80\x9f\xc7\xb5\x39\x7a\xb5\x17\x45\xff\x6b\x45\xff\x61\xb6\x20\x26\x32\xc4\xa6\xce\xab\x7f\x4c\x16\x0b\x57\xc1\xee\xb2\x5b\x30\xad\xad\xbe\xd9\xdf\x6e\x8a\x0e\xda\xdf\x93\xef\x23\x87\xf1\xec\x97\x8a\xc8\x26\xe0\xc4\xf3\x0a\xe4\xae\xd0\xc7\xbe\x8e\x2c\xb7\x4a\x9e\x19\x48\xfb\x3a\x42\xc2\xb4\xba\x20\x1e\x15\x5d\x1f\xd7\x58\xc3\x5b\x38\x82\x20\xa9\xb8\x4f\x1a\x78\x40\x1a\x00\xbe\x13\xd2\xc0\x7c\x07\x61\xd0\x10\x80\x60\xd9\xcf\xec\xcf\xa1\x80\x30\x4d\xd3\xe7\x24\xd0\x11\x3e\x24\x73\x60\x68\x64\xa7\x8e\x59\xaa\x75\x0c\x70\x77\x4c\xde\x04\x3a\x62\x8c\x13\x5b\xda\x43\x4d\xd3\x0f\xc9\x31\xe4\x8e\x43\x9d\x3d\x54\xc9\xe1\xca\x4c\x5f\x07\xde\x38\xf1\x2b\x5d\x9a\x56\x6a\x75\x96\xa5\x5e\xab\x84\x71\x30\xf0\x6b\x75\xbd\x49\xa0\x74\xeb\xd2\x7c\xec\xa2\x7a\x0d\x57\xdc\x59\x56\xc9\x17\xa6\x56\x3f\x64\x0b\xb2\xdd\x04\xbb\x1c\xb6\x90\x05\x29\xf9\x09\x14\x30\x49\xc3\xba\xd8\x67\x35\x58\x17\xf5\x3a\xfa\x64\xcf\xed\x0b\xc7\x21\xc7\xf6\x85\x63\x3d\xb3\x39\xfb\x24\xc4\xe9\xf0\x72\x9c\x53\xfb\xcf\x4b\x64\xe5\xc8\x0b\xfe\xda\x77\x53\x47\xc1\x9b\x8f\x85\xec\x12\x26\xd9\x9b\x72\xc2\x3f\x9d\x71\x5a\xf7\xc3\x8d\x74\x56\xd9\xf2\x4c\xa9\x97\xe2\x4e\x29\xa1\x30\x6b\x2b\x76\x57\x70\x5f\xe2\xda\xd4\xc1\xd5\xa7\x1e\xb0\xa5\xb9\xb4\xf1\x76\x94\xce\x26\x93\x71\xc2\x86\x0b\x31\x74\x2a\xb5\xba\x74\x51\xe0\x4f\xa9\x8c\x4d\x7d\xc5\x58\x67\x58\xf5\x27\x76\x52\x71\x09\xb7\xb9\x2e\x20\x18\x50\x21\x2e\x87\x73\xaf\x68\xe6\xd3\x38\xab\xd0\x42\x30\xae\xde\x03\x60\xee\x0a\xbc\x54\x59\x0e\x67\xb8\xe6\x8e\xc7\x83\x80\x8e\x6a\x1b\xbf\x73\x76\x81\x10\x72\xd1\x5d\x62\x9f\x66\xc1\xa6\x5c\xe0\x3a\x80\x66\x81\xce\x0e\x16\x19\xfb\xe1\x4f\x33\x82\x76\x41\xe8\xd3\xa7\xcd\x0d\xb3\xc3\xf7\x3a\x28\xf9\x87\xca\x4a\x5c\x94\x0b\x87\x1d\x17\xc2\x52\x4a\xbc\x58\xf7\xd8\x39\xc6\xa3\x01\x48\x86\xff\x78\x42\x89\x9a\x9c\x2f\x6e\xb5\x0a\xc9\x27\x54\xec\x28\xa1\x33\xd8\x24\x1e\x84\x4f\xbc\x08\xb2\xee\xd8\x5f\x2c\xd2\x48\x68\x04\x8e\x29\x14\x79\xec\x26\xf7\x65\x95\x33\x6e\xd8\xd0\xd7\x9f\x7b\x22\x6a\x75\xd0\x54\x96\xe5\x86\x21\xc0\x21\x54\x06\xea\xa8\x39\x2c\x30\x30\x90\xd9\x45\x13\x2e\xeb\xaa\x12\x09\x00\x82\x85\xa5\x3f\x60\x98\x71\xa8\x73\x4a\x32\xbf\xfa\xc3\x1e\x11\x62\x63\x1f\x59\x6f\xf7\xf6\x08\xf1\x8c\xf3\xb9\xa6\x75\x67\xba\x27\x1c\x08\x09\x27\xad\xfc\xb6\x0d\xae\xc5\xb8\x94\x71\x87\x31\x12\x5b\x3b\xf8\x43\x44\x91\xe5\xc1\x0d\x54\x80\xac\x80\x91\xa7\x3e\xb2\x7c\x52\x8d\x63\xbd\x4b\xf5\x94\xbd\xda\x6f\x85\x36\x04\x12\x3f\x56\x41\xb1\x06\x48\xd3\x7c\x2b\x60\x0d\xfa\xad\x79\x6a\xde\x47\x8c\x5a\xf5\xc4\x0d\x83\xbc\xb7\x9b\x72\xbd\x9b\x80\x50\x2b\xef\x72\xf0\x5a\x97\x7d\xd9\x5d\xeb\x8d\x74\x7e\xb7\xf3\x7d\xc7\xf3\x3c\xc6\x9e\x25\xc8\xda\xf9\xbe\x33\x99\xb9\x5b\x3b\xd0\xbe\xcf\xbd\x7b\xe6\xd9\xe0\x0b\xcb\x86\x3d\xe3\xab\xa7\x77\xba\x14\xd3\x10\xc9\x21\xfa\xf2\x6e\x7f\x36\xd4\x03\x29\xdb\xad\x12\x31\xd2\x60\x7d\xa4\x38\xcc\xd9\x0c\x9f\x11\xea\x83\xfc\x45\xd3\xaa\xa1\xa6\x05\xaf\x0e\xdd\x87\xb1\x4e\x67\x7c\x3a\xe7\x62\x5a\x93\xbc\xbc\xc5\x38\x7e\x4d\xf3\x11\xf8\x3e\x62\x4b\xc9\x16\x17\x1a\x81\xcc\x58\xcd\x8c\x45\x5e\x81\x82\xc6\x54\x06\xb1\xa7\x63\x2a\xaf\x23\xfc\x26\x39\xe8\xd1\x7a\xdd\x9a\xcd\x18\x1e\xe4\xc4\x1d\x38\xe1\x62\xc8\xa4\xfd\x4c\x4d\x2f\xc3\xef\x9f\xa9\xe9\x67\xf8\xee\x89\x9a\x35\xee\x84\xfc\x74\xd4\x0b\x60\x6b\xd5\xf0\xe4\x89\x9a\x47\x29\xbe\x0b\xa9\x99\x46\x4b\x7c\xd8\xa3\x42\x96\xae\xbf\xd4\xbe\x6c\x1f\xd3\x8c\xde\x40\x64\xc0\xed\x83\x59\xd6\xad\x99\xc3\x68\x89\xf0\x41\x8f\x92\x06\x9e\xcf\xc0\xa9\xc9\x0c\xc2\xee\x86\x94\xec\x71\x8b\xdd\xd9\x8c\x1d\x3d\x0f\x33\xe2\xc6\xf6\xf9\xd4\x51\x98\xbb\xa3\x1e\xd5\x0b\x34\xcf\x31\xe9\x6c\x56\x32\x61\x75\xc9\x6c\x06\x0e\x41\x8c\x8f\x7b\x9a\xe6\x1a\xe1\x4c\x47\x8a\x3a\xcb\x71\xaf\x6c\x9e\x0a\x02\xfb\x87\x80\xdf\x31\x8b\x8b\x51\xc1\x80\x78\xa8\x70\x57\xc5\x72\x8d\x40\xac\xef\x81\x5f\x4f\xdb\xb1\x38\x71\xee\x11\x6a\xea\x2a\xd3\x82\x03\xc9\xb4\xd4\x9b\x0c\x0e\x02\x79\x6b\xc0\xd6\x51\x58\x7e\x72\x33\xe3\x50\x3a\xda\x10\xa2\xa9\xd0\x0e\x1c\xc8\x3c\x08\x11\xee\xb3\x99\x09\x5d\xbd\x8f\x23\xbb\xe1\x20\xab\x6f\xdc\xbc\x85\x1c\x96\xcf\x6f\x87\x97\x72\x16\x06\x95\x78\x54\x71\x19\xb5\xe6\xda\x03\xc7\x8a\x18\xad\x59\x34\x92\x7b\xf3\x80\xab\xf8\xc0\xb1\x8f\x7c\x87\x90\x01\x7a\x61\x2f\xac\xce\x41\x9d\x8b\xc0\x42\xc4\x8a\x0a\xe5\xa7\x65\x04\x06\x70\x2f\x4b\x1c\xba\x7a\x80\x07\x08\x07\xe5\xbc\x18\x7a\x11\x20\xb4\x1c\x10\x50\xf1\x69\x40\x4b\xe8\x65\x50\x27\xa3\xd0\xf2\xca\x23\xcd\x3b\x01\x82\x61\xd1\x32\xb2\x06\x75\xe2\xe5\x22\x35\xa9\x56\xba\xbc\x27\x00\x10\xd6\x9b\x7b\x23\x1d\xaf\x7a\xc4\x14\x6a\x77\x2e\x78\xf1\x93\x1a\x46\x52\x22\x48\x13\x6e\x3e\xe0\x11\xdf\x38\xf1\x5b\x7e\x49\x2b\x58\x55\xb6\x03\x3e\xf3\x72\xe9\x91\xe3\x58\xe7\x2e\x0c\xe4\x59\x20\xcd\xa0\xc1\x14\xb1\x47\x85\x1d\x31\x3b\x0b\xb0\x40\xff\x6c\x87\x85\xec\xcc\x67\x54\x81\x1e\xb2\x83\x1d\x09\xec\x14\x4e\xc0\xa5\x99\xa6\xc9\xc9\x28\x8c\x15\x6d\x46\x70\x85\xec\xd4\x16\x44\x57\x9f\x4d\xc9\x60\x7f\x64\x0d\xea\x75\x14\xb1\x69\x79\x81\x23\xbe\x6f\x0f\x1c\x3c\xa0\x6e\x30\x30\x6d\x67\xc9\x8f\x6b\xd6\xaa\xb0\xe5\xc5\x23\x12\x81\x11\xef\xfe\x08\x0c\x79\x23\xbb\xef\xd8\xf7\x9e\xc3\xe7\xb5\xe1\xd8\x7d\x06\x2b\x84\xfb\xcc\x5f\xc9\x3b\x20\x2c\x37\xf6\x8c\x0f\x91\x3e\xb0\x4f\x1c\x3c\x80\x92\x6c\x01\xe0\x82\x29\x64\x94\x44\x64\x45\x84\x3d\x58\x23\x12\x12\xd6\x72\xab\x69\x36\x84\x25\x31\x2c\xe3\x68\xbf\xcf\xd8\x27\xf4\xe2\x19\x37\x53\x85\xd9\x1f\x00\x1d\x19\xf1\x61\x4d\x60\x58\x9e\xe1\x79\xfa\x68\x3b\xc4\x03\xcc\x48\x9b\xc8\x1e\x38\xf6\x89\xc3\x3a\x3a\x72\xec\x81\x83\xd0\x72\xe9\x33\x30\xf7\x0d\x08\x2a\x42\x3c\x7b\x26\xf0\xb7\x8c\x60\x00\x71\x2d\x7c\xee\x2f\x79\x7a\xca\x70\xe3\x23\xc3\x8c\x42\x57\x05\xc2\x3b\xec\xfc\x47\x7f\x31\x7e\x5d\xa2\xad\x1d\xd4\xd2\x3d\x72\x18\x82\x87\x82\xc7\x99\xee\x21\x64\xf6\x7c\xaa\x7f\x18\xb3\xc7\xfc\x4c\x81\x65\x1c\xcd\xd1\x93\x90\x6b\x3f\x76\x29\xfe\x5a\x80\xd4\x8a\xb5\xd1\xeb\xc1\x93\xd8\x29\xac\x96\x53\x9d\x51\x2a\x22\x28\xca\x7b\x8e\x3d\x32\x9f\xd9\xae\x70\x79\x03\x8f\x9c\xde\xf6\x8c\x69\x5b\x5f\x33\x72\xba\x88\xd3\x34\x1e\x45\x15\x08\x0d\x54\x09\xc7\xb9\x71\x43\x25\xf6\x85\x5b\xf5\xe5\xbd\x31\xca\xf5\xb1\x66\xb7\xf2\xe9\x2c\x7f\x3a\xef\xc9\xa7\x49\x1e\xe2\x61\x7e\x2c\x9f\x3e\xee\x81\xb5\xb2\x71\x3a\x20\xec\xe7\xfc\xa3\xfc\x70\xdd\xe7\xaa\x5c\x87\xa3\x55\xf7\xde\x52\xcb\xb6\x4a\x3a\x8b\x45\xe3\x9d\x72\x2d\x7e\xcd\xe3\xde\x54\x64\x74\x34\x25\x48\xe1\x68\x3c\xda\x1e\x05\x11\x05\x73\x0d\x4e\x63\xd6\xa4\x6d\xe1\x80\x50\xeb\x39\xd7\xb8\x2e\xb0\xfc\xc1\x8c\xab\x95\x9e\xdd\x6a\x9a\xee\x52\x6e\x9e\x65\x9c\xdd\x22\x4c\xe5\xf8\x14\xa6\xe9\x49\x11\xbd\x50\x36\x9b\x2f\x02\x78\xcc\x6f\x01\x16\x3a\x8e\x93\x14\x73\x57\xb9\xa6\xfd\xc2\x83\x45\x98\x2e\x96\x6e\xea\x3d\xbc\x1a\xe0\xc3\xf4\x97\xce\x12\xb4\xda\xc3\xd9\xba\xb5\x97\xb8\x68\xa2\x63\x2a\x2e\xae\x24\x2d\x79\xde\x63\xfd\x35\xb2\xa9\x14\xd3\x8b\xd4\xdc\x5b\xf8\x97\x2e\xad\xab\x9f\xfc\x66\x7e\x67\x71\xfe\x11\x9c\x42\x79\x75\x72\x1a\xd1\xba\x3c\xb2\x27\x4d\x9e\xf6\x31\x12\x4a\xf2\x93\x26\xb2\x58\x0b\x8f\x1c\xeb\x42\xda\xfc\x58\x9e\x66\xb6\x83\x03\x8e\x76\x73\x93\x87\xf9\x31\x47\xba\x41\x3d\x08\xeb\x22\x05\x1c\x3a\xb1\x5a\xba\x02\xff\x46\x21\x5a\x52\x22\x8f\x46\xb9\x3a\x70\x18\x4a\xfd\x02\x84\xdb\x7d\x4d\xd3\x41\x31\x02\x53\x46\x23\x8d\x62\x8a\xbb\x76\xe6\xe8\xb9\xb9\xdd\xbf\xa5\xe5\x3e\xbf\xec\xdf\xfb\x1d\xd5\xbb\x06\x75\x53\xfd\xb5\x6c\xff\x01\xfb\x45\x99\x19\x21\x9c\x3b\xff\x62\x34\xe5\xcb\xd2\x9a\xcf\xec\x95\xf9\x72\xb8\x25\xbe\xb8\x60\x0e\x9a\x96\x4b\xae\x22\x46\x32\x11\x3f\xe3\xd7\x21\x19\x76\xc9\x4d\xc2\x70\x32\x49\x23\x48\x7a\x59\xe2\x1d\xbb\xa5\x39\x74\x90\x91\x68\x1e\x3f\xeb\x9a\xfd\x1f\x8d\xc7\x56\x11\x82\xcc\x56\x40\x8e\x52\x53\xf7\xc9\xd3\x50\xa7\xf8\x4d\x0c\xde\xde\xd3\x08\xbc\x28\xb3\x13\x39\x80\xa3\x9f\x21\x58\x1c\x54\x09\xf1\x32\x4d\x63\xbf\x7e\xb6\x58\x54\xb7\x62\xdd\xc7\x43\x28\xa1\x6f\xa2\xf2\xc1\xe0\x4f\x50\xf9\x01\x82\x73\x35\x8d\x10\xab\xef\xa5\x60\x17\x14\xf7\xdc\xde\x12\x7b\x24\x50\x58\x09\x20\xbf\xdb\x53\xce\x46\x7b\x84\x1c\xa5\x20\xd2\x89\xf5\xac\x4b\x11\x12\xd7\x47\x9e\x4b\x31\xe7\xbb\x5d\xfb\x61\x66\xc4\x63\xfb\x72\xea\x18\x47\x97\x9f\x3a\xed\x4f\x9d\x1f\x9d\xaf\x9f\xdb\x0e\x03\xce\xd7\xbe\x11\x48\x37\x44\x1c\xd2\xce\xd3\x24\x30\x3a\xed\x2f\x1d\xb4\xa1\xce\x83\xdb\xce\xc9\xe5\xf5\xe9\xb7\x83\xce\xe9\xe5\xa7\xd5\x4a\xcb\x1f\x45\xad\x8c\xee\x1b\x27\x02\x7b\x42\xdd\x37\xa7\x1f\x3e\xb5\x8f\xf3\xda\x8d\x4b\x56\xee\x47\xfb\xd3\xc1\xe1\x79\xfb\xc7\xe7\xeb\xd3\xbb\x83\x4e\xfb\xc7\xa7\x76\xe7\xfe\xf2\xfa\x0c\xf6\xd4\xcf\x32\xc0\x04\x97\x6b\x3a\x38\x3e\xfe\xd1\xbe\x38\x38\x3d\x57\x0a\xe7\x69\x90\x9f\xf7\x4c\x61\x99\xd8\xba\x0b\xe3\x9c\x64\x2c\x2c\xb2\xb0\x8b\xf0\xa1\xbc\x05\x5e\x39\x18\x36\x47\xf4\x8b\x79\x34\x60\x61\x9a\x60\xd4\x50\x2e\x61\xab\xea\x3e\xf1\x18\xe8\x20\x40\xa6\x1e\x01\xf8\x44\x3e\x23\x72\x1f\x3d\xc7\xfe\xe4\x39\xd8\xe3\xf2\x7a\x60\xcc\x90\x54\xf9\xd4\xf3\x2d\x88\xa4\x33\x28\x02\xfc\x15\x06\x0d\x65\x8f\xfd\xfa\xf6\x9e\x43\x88\x67\xef\x39\x9a\xe6\xdb\x4d\x78\x6e\xc2\xf3\x5b\x78\x7e\xeb\x30\xf6\x68\xc9\x1d\xae\x7a\x84\x0b\x69\x2d\x1f\xa4\xe2\xe4\x26\x11\x64\x2f\x83\x74\x46\xe4\x36\xf7\x41\x44\xc4\x3d\xa6\x32\xea\x13\xef\xe6\x29\x8c\xd4\x6d\xb2\xf3\x8e\x12\xdf\xf2\xc9\x17\x7d\x16\xf3\x49\x4b\xc5\xa4\x01\x52\x13\x33\x46\x24\x03\xbc\x58\x54\xab\xc1\x26\x0e\xb8\xa0\xb6\xb6\x32\xeb\x3a\xa6\xc2\x01\x8a\xaf\x69\xa1\x31\xd4\xbb\x29\xb8\x31\x31\x0e\x8e\xf4\xf3\x14\x87\xc6\x64\xcc\x4e\x4a\x86\x86\xc0\x62\x31\x40\x56\xc8\x4d\xa1\x00\xff\x1f\xf6\x28\x3f\xe6\x5f\x54\x82\xae\x30\x0e\xbd\xb9\xab\x84\xf1\x20\x48\x2b\xe3\x51\x85\x5b\x0c\xf2\xa8\x90\x69\x85\x26\x41\x99\xc5\x36\x2a\x9f\x07\x01\x4d\x83\xca\x2c\x0d\x2a\xca\x2e\xad\xfc\xf2\xd8\x4d\x7e\xa9\x8c\x93\xca\x2f\x74\x96\x8d\x7f\x81\xd8\xa6\x69\x90\xcc\x83\xca\xd3\x78\x96\x54\x0c\x2f\x9d\x43\x23\x95\x30\x19\x0f\x21\x20\x74\x4a\x87\x81\x68\x28\x8f\x6f\x3a\xa1\x51\xc0\x60\xe3\x8d\x5b\x76\x80\x2e\x04\xba\x84\xe4\x67\x82\x64\xdc\x34\x2d\x68\xe9\x81\x74\x7b\xfe\x98\x22\xdc\xee\x89\x7b\x83\x00\x53\x84\xc1\xe7\x79\x80\x90\xa9\x1f\xe6\x97\xbb\x19\x43\xd5\xcf\xb9\x99\x90\x2a\x0e\x69\x17\x22\x2c\xd7\x18\x8f\xe0\x6c\x54\x0f\xba\x43\xd0\xc9\xcb\xc0\xd5\xd6\x33\x98\x9b\x58\xd9\x44\x77\xf1\x4f\xb3\x80\xa7\x7c\x11\x92\x41\xea\xc2\xd7\x0f\x22\x5a\xd7\xa5\xf0\x06\xd9\x01\x18\x1d\x82\x07\x31\xe2\x2f\xef\xd9\x56\x5b\x25\x33\x8a\x40\x0a\xf6\x96\x83\x04\x05\x07\xcf\xaa\x59\x0d\xb9\xb4\xc0\x93\x12\x3f\xd6\x85\xb3\x2d\xfe\x52\x50\xb4\x92\xc6\xfb\xd8\xa5\x78\xd6\x05\x15\x47\x65\x12\x60\x04\x2f\x07\x42\xd5\xf4\xec\x96\xb8\x14\xec\xc4\x95\x41\x02\x6d\xd1\x8d\x29\xa6\x5d\x8a\x96\xb8\xd9\xde\xfb\x95\x32\x4e\x55\xf5\x26\x27\x74\xe1\x8c\x59\x89\x5a\x99\x01\xb5\x32\x93\xd4\x4a\x41\xdc\xc0\x5c\xbd\xf0\x52\x56\xa3\x4a\x28\x9c\xb4\x14\xb8\x55\x6a\x5c\xf7\x41\x4f\x60\xb6\xa9\x33\x94\xf3\xb2\xa2\x17\xa7\x03\x84\x96\x4f\xab\x7e\x5d\x00\x5e\x18\x09\x27\x6c\x56\x47\x73\xc9\xe7\x43\x59\x64\xdd\xab\xe8\x6a\x93\x2d\xdd\xc6\xc2\x5f\x1e\x28\x39\x4a\x0b\x61\x93\x22\x40\x83\x7a\xad\x8d\xa6\x6f\x9c\x94\x3c\x90\x08\xf4\x7d\x8f\xe6\x9a\xc3\xf7\xc6\xb4\x5d\x5a\xf8\x83\x42\x01\x8a\x41\xcb\x34\xf7\xe6\xc5\xa3\x87\x89\x1a\xcf\x3f\x12\x1e\x95\x8b\x5f\xd5\x51\xe3\x4e\xfa\x47\x13\x1d\xb6\x5c\xf0\x50\x87\x29\x5a\x0a\x15\x98\x8e\xb0\x44\xfa\x19\x31\x1b\x52\x30\x13\x6b\xbc\x23\xaa\xae\x27\x2f\xa8\xd0\xb2\x3c\x9c\xe4\x1a\x1d\x7b\x19\x52\x42\xb9\x23\x8f\xf9\x1a\x34\x17\xed\x3c\x44\x6b\x04\x33\x44\xa5\x2e\xea\x97\xe2\xd4\xb2\xe2\xd7\xc7\x3d\xae\x3a\x51\xd2\xe0\x5d\xa9\xbb\xdd\x2d\xea\x06\x9e\x81\x53\x4d\x4a\xdd\x5c\x90\x2b\xbb\x7c\xde\xe3\x75\x5e\xaf\x74\x58\xd0\x98\x84\x5a\xf9\x2e\x84\xa4\xcf\x21\xd5\x3f\x75\x85\x32\xd9\xe7\x70\x95\x2b\x67\x87\x07\x17\xa4\x7d\xdf\x89\x70\x1c\x81\xa9\xf5\x4a\x4a\x9e\xc7\xdc\x89\x70\xd0\xa5\x4a\x9e\x3c\x25\xcf\x63\xed\x44\xb8\xa7\x56\x23\x13\x04\x05\x2b\xcd\x0c\xe7\xc7\xe4\x65\x99\xa7\xda\xd4\x21\xae\xb2\xc1\x8f\x66\x3a\x7a\xf9\xd0\xa3\x8b\x85\xfe\xa1\x47\x49\xb5\x81\xdd\xd8\xb8\xcb\xa8\xa6\xf1\x5f\x63\xeb\x81\xea\x47\x3d\x8a\x5f\x26\xe3\xc1\x20\x1e\x45\xa7\x82\x7f\x31\x9b\x8d\xc6\x12\x61\x2e\x7e\xd2\x34\xfd\xa4\x47\xa5\x79\xe4\x71\x48\x75\x19\xfe\x87\x92\xfb\xbe\xc4\xdc\xf0\xf1\x6b\x46\x09\x0f\x36\x01\x12\x34\x68\xb4\x69\x1d\x81\x7c\xeb\x26\xa4\x64\xb7\xa1\x7a\x29\x9e\x29\xa6\x6e\xb2\x29\xf9\x64\x24\x13\x6f\xc9\x0b\x1e\x87\x74\xc5\x3d\x0a\x2b\x29\x35\x8e\x84\x88\x2c\x89\x75\xca\xca\x18\x49\x10\xc5\x69\x16\x24\x10\xd2\x46\x4d\xd0\xef\xbb\x14\x1f\xc9\x23\xb2\x22\xac\x9a\x6f\xc2\xdc\x84\xfa\x26\xa4\xdb\xdb\x58\xa0\x1d\x41\x09\x1d\x87\x92\x12\x6a\x36\x1a\x08\x2d\xc5\x58\x7a\x2b\x60\x93\xab\xc8\x06\x99\x20\xd7\xa3\x2e\x68\x2b\xb8\x42\x67\x48\xfa\x53\x9b\xfa\x8e\xde\x86\x78\x73\xf9\xeb\x07\x4e\xc4\x8e\x41\x7b\x9f\xfb\x12\xce\x66\x5c\x89\x01\x2a\x3c\x1d\x65\x7a\x08\xe0\x62\x1c\x8e\xf4\x92\x91\x02\xef\x8c\xfb\x40\x37\x05\xb2\x91\x0b\x02\x87\x57\x81\x7e\x61\x29\x5f\x99\x44\x08\x61\x04\x93\x16\x05\xd9\x75\x30\xa0\x4f\xb7\xc9\x40\x0f\x13\xb4\x58\xf0\xe4\xb4\x94\x8c\xdf\xb3\x43\xa1\xb0\x9d\x93\x4b\xa0\xe4\xca\x57\x61\x53\xc9\xe5\x32\x5f\x75\xd6\x19\x4d\xcb\x32\xbd\xb6\xb3\xf3\xf0\xf0\xb0\x3d\x9e\x04\xa3\x74\xec\xc5\x74\x20\x14\x6a\x66\x69\x90\x88\x30\xdc\xa0\x20\x24\xc8\xcf\x9d\x64\xe2\xb1\x7f\xc6\xdc\xe8\xa5\x35\x64\xc1\xe8\x00\x36\x3f\xcc\x88\x1b\x1b\x3f\x7e\x30\x7e\x27\x9a\xd1\xc4\xff\xf1\xa3\x15\xc4\xfa\x53\x97\x22\xb3\xec\x7d\x81\x6d\xdf\x36\x37\x3f\x20\xc2\x47\xeb\x69\x8f\xea\x5e\xa1\x51\xc6\xd6\xe4\x3d\x5b\x93\x25\x3e\xd9\x5c\xed\xf3\xcf\xab\xbd\xfc\xb3\x6a\x3f\x6e\xae\xf6\x68\x53\xb5\x50\x29\x18\xa9\xb2\x0a\x4e\xc1\x08\x02\xa1\x25\x3e\xdb\x5c\xc7\x61\xb9\x0e\xc5\x65\x0a\xd5\x34\x58\xb3\x28\xc8\xce\x82\x27\x58\x2a\xfe\xa8\x23\xd4\x02\xf7\x84\x66\xb5\xb9\xc4\xe7\x9b\xeb\x3d\x58\xad\x97\x6f\x02\xe8\x1d\x76\xc9\x75\xc6\x60\xf8\x21\xd3\xa9\xf1\x83\x7b\xb8\xe3\x21\x06\x18\xa9\x51\x4a\x90\xc4\x78\x01\xd6\x05\xb0\xb6\x4b\x82\xa4\x52\x31\x4b\x30\x3c\x40\xf9\xb0\x89\xe8\x64\x78\xb5\x66\xe5\x52\x98\x28\xda\x09\xa7\xbd\xd7\xc2\xe1\xb8\x9a\xe6\x1a\x57\x19\x6d\x51\xdd\x35\x3e\xa4\xc8\xa4\x25\xd9\xf9\xfb\x42\x61\xe4\x78\xce\xce\xbc\xf7\xb0\x01\xf9\xa4\xbd\x66\x36\x72\x3c\xa7\x0a\x4a\x3e\x9d\xad\x47\xe8\x10\xf8\xfb\x43\x4a\xdc\xe5\x57\xfd\x74\x06\xf1\x28\x4e\xa1\xea\xab\xec\x55\xe7\xf2\x1f\x54\x5b\x89\x8b\xa2\x67\x19\xa1\x85\x3e\x31\xc3\x21\x27\xeb\xca\xc0\x5c\x13\x58\xf8\xb6\x93\x77\xa8\xe2\x36\xf5\x63\x9a\xd3\x3f\xa7\xa9\xa2\xe6\x7d\xd3\xc8\x23\xe7\xba\x4f\xa4\xda\x58\x7e\xd5\x2f\x66\x78\x6b\x8c\xac\x7b\x72\x21\x94\xed\x7f\x1a\x67\x34\xef\xec\xc7\xde\x4a\x40\x1c\xdb\x01\x93\xd4\xcc\xb8\x00\xe6\xae\x61\xf9\xfb\x1e\xe8\x4a\x41\x17\x7d\x06\x32\xa7\x29\x71\x2d\x2a\x5a\x7e\x73\x6f\x44\xc9\x2b\x3a\x94\xbc\x35\x56\x5f\x5f\x3f\xeb\x51\xf4\xaa\xfa\x95\x0f\xb2\xc8\x69\xcc\xb8\x86\x88\xd1\xf6\x41\x61\xc0\x37\x82\x54\x21\x0a\x0f\x8c\x14\xae\x6f\xf8\x35\x28\x0e\x48\x60\x78\x74\xe0\x09\x5d\xed\x80\xb3\xb3\x55\x6f\xb1\xf0\x34\xad\x0a\x11\xf2\x82\xe2\x16\xf3\x97\xdb\x51\x7f\x34\x7e\x28\xc0\xac\x52\xfb\xa5\x1e\xd4\x67\x01\x12\x14\x46\xa8\x69\xd0\x7a\x28\x43\x78\xac\x39\x7a\xf2\xa0\xdd\x4a\x3c\x9a\xcc\x32\x5c\xdc\xff\x07\x31\xb0\x70\xf9\xc5\xf5\x38\xa9\xd0\x51\x65\xcc\x3d\xfd\xd4\x90\xb5\x94\xeb\xda\xed\x73\x55\x38\x3e\x33\xd2\x24\xf4\xca\xe5\x2e\x61\xcb\xfa\xc5\x8c\x41\xe6\xaa\xc5\xa3\x98\xf1\xe0\x5c\x35\xc6\x37\x92\xf1\x20\x40\x01\xf1\x8d\x49\x32\x9e\x04\x49\x16\x07\x29\xa3\x80\x71\x00\x5f\x48\x88\xd5\x2f\x24\xb0\x58\x19\x75\xd6\xac\x69\xac\x87\x48\xd3\xf4\x68\xa2\x53\x1c\x22\xec\xc3\x1c\x12\xfe\xb3\x58\x9c\x74\x29\x86\x30\x81\x3e\xf7\xab\x68\x1c\xeb\x21\x42\x68\xa9\x80\x9b\x82\x16\xce\x0b\xee\xad\xf0\xa6\x1c\x87\xba\x17\x33\xf4\x5a\x4c\x60\x08\x0c\x28\x68\x80\x54\x26\x34\xa1\xc3\x20\xe3\xf1\x56\xe9\xa8\x42\x93\x84\x3e\xe1\xca\x68\x5c\x49\x03\x6f\x3c\xf2\xcb\x19\xe4\x2c\xd7\x8a\xad\xb3\x62\x00\x10\x4f\x74\x6a\x64\xb8\xa4\xe4\x0f\xfa\xe1\xcb\x38\xd4\x45\x6c\xbb\x0e\x07\x8d\x2e\xeb\x16\x7b\x53\x7b\xb6\xa9\x57\x62\x29\xf1\x7a\x97\x24\x1d\x9b\x4e\x02\x0f\x42\xc5\x03\xe3\xcd\x05\xcc\x50\xc6\xe0\x81\x1e\xdd\x77\x9e\x42\xc0\x6f\x18\xbc\x3e\x8c\x47\xa8\xa8\x6e\x48\x07\x83\x20\xa9\x64\x5d\x06\x3a\x49\x25\x98\xce\xe8\xa0\x92\x8d\x39\xe3\xbe\xda\x09\x7d\x48\x1f\x11\x34\x24\xc6\x9e\x3f\x79\x0c\xbe\xc4\x8d\x97\x4f\x5c\xcb\xdf\x27\x7c\x03\x53\xb1\x81\x73\x9d\x89\xbc\x73\xef\x57\x3a\xa6\x48\xcc\x55\x78\x86\x65\x02\x51\xc1\xf2\xde\xb8\x1f\x6d\x62\xd8\x4e\x53\x72\x2e\x65\x01\x85\xf8\x96\xa1\xb1\xa6\x8a\xae\xac\x7b\xe3\x8c\x6e\xc2\x4f\x5d\xa1\xde\x77\xc5\x0d\x00\xd3\x60\x95\xdc\x14\xf5\xa9\xf7\xae\x85\xa2\x3e\x47\x5a\x62\x1b\xc1\x1e\xa2\x02\xaf\xe6\x63\x2e\xa0\x43\xf4\x17\xda\x79\xde\xc4\x7a\x44\x89\x7e\x13\xcb\xee\x60\xf5\x68\x12\x84\xf2\x56\xcc\xe3\x16\x49\xbd\xf2\x7c\x6c\x07\xf3\xcd\xc1\xf3\x36\x4e\x8d\xa6\xe9\x1f\x25\x33\x8a\x8b\xe9\x12\xdf\xef\x47\x79\x27\x4e\x53\xbc\x4e\x3a\x70\x24\x47\xd7\x3a\xf1\xe6\xde\x98\x5f\xff\x44\xb5\x5d\x0c\x6b\x25\xb8\xb9\x4c\x15\x77\x43\x04\x6c\xd7\xd8\x8e\xd1\x34\xaf\x84\x43\x08\xc9\xf5\x05\x5d\xc5\x21\xff\xbd\x71\x79\xfd\x2a\xfd\xfb\x31\x6d\x35\xde\xd1\xc5\x82\xbe\x53\x56\xab\xb5\xdd\x34\xa9\x79\x55\x0c\x91\xb3\x75\x0f\xe5\x78\x90\xd1\x24\x3f\x9e\x69\xde\x49\x9a\x5b\x9d\x80\xbb\xf2\x16\x35\x47\x31\x18\xbf\x80\x87\x0f\xb5\xb7\xa8\x55\x7e\x37\x79\x5f\x67\x9d\x95\xd8\x15\x50\xf3\xc3\x87\x82\xb0\xdf\x6e\x12\x42\x5b\xd4\x94\x08\xdb\x98\x75\x84\xd5\xd3\x6c\x58\x66\x80\x27\x1b\xed\xa4\x3e\xa6\x2d\x6a\x8a\x91\xd9\x14\xc2\x64\xa7\x1b\x1b\x05\x8d\xea\x82\x40\x12\xad\xa5\xb2\xb5\x8b\xd7\x8e\xf2\x8f\x69\xab\x98\xcb\xbc\xa5\x8f\x0e\xf7\x8a\xf3\x6a\x2c\x1c\x17\xb2\xdc\x1b\x5f\x82\xbf\x3f\xcd\xa2\xbd\x2f\x01\x98\x13\x1b\xb1\x0f\xf1\xba\x1f\x56\x8d\xe3\xfe\x3e\xb8\xe5\x80\x16\xfb\x25\xf0\x92\xd3\x61\x8f\xa7\xab\x56\xb2\xc6\xfc\x9a\x0b\xfb\xee\x8d\x6b\xfa\x8f\x87\x72\x0d\x46\x4c\xd4\xbe\xf7\x1c\x11\xa3\x7c\x6b\xf6\x8f\x2b\xdb\x02\x33\x6b\xee\x0f\xf7\xde\x18\x26\x9b\x56\x3b\xea\xe9\x14\xcf\xbb\xca\x82\x8f\x05\x04\x5f\xc2\xc2\x1d\xff\xe3\xd6\x8f\xf9\x48\x4e\x04\x00\xac\x5a\x5b\x45\xe5\xd8\x67\xea\x0a\x14\x81\x53\x15\x80\x94\xab\x52\xa0\x5e\xf7\x89\x2f\x2d\x47\xb2\xca\xb2\x32\x6c\x3b\xca\xd1\xa5\xed\x39\xb9\x15\xda\x4d\xc3\xf6\x1c\xb0\xb0\xcc\x11\x54\x73\x29\x9a\xbe\x69\xd8\xae\x23\x63\x80\x70\x92\x41\xc0\x06\x8f\xae\xa8\x76\x30\x14\x14\x8a\x35\x66\xf4\x4b\x4b\x0f\xc9\x59\x8f\x42\x44\x04\x22\x3a\x97\x41\x90\x62\x64\x26\x82\xc0\xf1\x48\xc8\x28\xfb\xc2\xa2\x28\x63\xe4\xa0\xe5\x91\x6f\x70\x31\x6f\xf9\x84\x91\x38\x56\x48\x3c\x63\xce\x7a\x70\x00\x74\x56\x4e\x2e\xd6\x20\xdc\xc6\xfa\x79\xff\x8b\x88\xe3\x1c\x09\xe7\xf3\xb2\xc0\xc4\xa5\xf5\xb0\xee\xd2\xe2\xca\x54\x0e\x8f\x78\x4b\x9f\x9d\xc2\xc6\x84\x30\x5a\xce\x98\xa0\x96\x6f\x4c\xcc\x97\x65\xa1\x5d\x06\x63\xf7\xc9\xcb\xdc\x14\xd0\x7e\xea\xe8\x01\xf6\x10\x0e\x01\x98\xf0\x44\xc0\xd4\x4f\xe9\x52\xb8\xea\x89\xd9\x7a\x9b\x95\x5a\xfd\x8d\xaf\x46\x98\x8d\xdc\x35\x2f\x01\xea\x4e\x3a\x49\x21\xcd\x98\xc3\x6e\x6a\x6f\x3e\xc0\xd4\x9c\x56\xae\x37\xed\x19\xa1\x54\xe7\x5b\xdb\xd1\x3e\x1b\x14\xe7\xbd\x74\x17\x61\xcf\x28\x82\xa7\xcf\x5b\xfd\x89\xee\x19\x73\xec\x23\xb3\x70\x8f\x31\xe5\xb4\xee\xbc\x88\xa9\xc4\x41\x91\x95\x14\x40\xde\xa6\x3a\x04\xa3\xce\x7d\x11\x19\x21\xdb\x6b\xdd\xc9\x5a\x34\x64\xb1\x5f\x7a\x3d\xe8\xb1\xed\xe5\x9b\xc6\x93\x27\x86\xd8\xa7\xbd\xde\x5f\x1a\x6f\xd5\x33\x26\xa5\x6f\xdc\x12\xc6\xcf\x4f\x8e\xb2\x8f\x01\x23\x63\x4d\x7b\x8a\x17\x7b\xcf\x98\x80\x55\xe5\x6a\x73\xca\x1e\x2f\x6f\xcc\xd2\x3e\xf7\xf2\x7d\x1e\xf5\xc0\x26\x84\xc3\x4a\x3b\xd1\x29\xb2\x5d\xa1\xf6\xc7\x43\x05\x25\xff\x18\x85\x40\x6d\x26\x5d\xe1\x2e\x58\xaf\x1f\x3b\xaf\x9e\xed\x99\xf1\x28\xcf\xaa\xf7\xaf\x72\xdf\x99\xf1\xfe\x89\xbb\x6c\xb8\x48\x5e\x9f\xee\xd2\x51\x28\x0f\xb7\x44\x98\xc0\xdc\x1b\xa7\x67\xaf\x1d\xbc\x9b\x8e\x52\x51\xfe\xf4\x4c\x74\xee\x66\xb2\x69\x08\x5e\x24\xe9\x32\xc8\x74\xb5\x71\x9c\x41\x39\x93\xbf\xb1\x26\xbf\x9c\x29\x3b\xdf\x94\x29\x52\x33\xb1\xc5\x7a\x5c\xd3\xeb\x90\x0c\x22\xc8\x84\xda\x8f\x22\x3c\xb8\xd1\x7e\xd4\x73\x71\x2f\x35\x9e\xd2\xc2\x3e\xfa\x04\x08\x5f\x78\x04\xc6\x1d\x07\x38\xc4\x42\xd5\x2b\x67\x06\x80\x69\xe2\x9c\x77\x98\x83\x81\x2f\xb7\x6a\x88\x50\x40\xa2\x3e\x28\xd4\x71\x47\xca\x9c\xb9\x2e\xde\x4a\x5c\xa4\xb2\x61\xa1\x24\xb5\x3f\xbb\x0e\x84\xcf\x56\x31\xd4\x4d\x44\x91\x15\x71\xfd\xbc\x65\xa1\x84\xe7\x15\xba\x86\x03\x56\xd2\x73\x6c\x49\xcf\x04\x39\x19\x13\x38\x0e\x1e\xfd\x8d\xde\x87\x12\x7b\x72\xdc\xe9\xa3\xe5\x4a\x27\x43\x32\x30\x3c\xbb\x28\xba\xa9\xaf\x23\x11\xd5\x6b\x60\x78\x64\x64\xf5\xc1\xbb\x12\x5a\x52\xc3\x1b\x0f\x52\x12\x59\x97\x8c\xdb\xed\x2b\x27\x37\xd7\xb5\xd3\xc5\x52\x3e\xa5\xea\x52\x16\x3c\xca\xcb\x12\x0b\xd1\xca\x86\x63\x73\x05\x77\x7a\x8e\x05\x88\x53\xd3\xaa\x63\x76\x58\xb0\x35\x40\x8b\x85\x90\xbf\x2c\x69\x0f\x0c\xc5\x74\xe8\xd2\x6c\x38\x4a\x49\xc1\x4b\x2c\x16\xd0\x3f\x85\xbb\x51\x1d\x3a\x1f\x6d\xf6\xa3\x73\x34\xe6\xb9\x19\x38\x95\x1c\xe9\x7c\x12\xf2\xb1\x31\xe3\xa0\x41\xb6\xf7\x7e\x0c\x71\xf3\xc4\x09\x1d\x3c\x70\x59\x17\xf6\x89\x2b\x3b\x83\x03\xe2\xb2\xe5\x14\x12\x15\x9f\xd1\x73\x51\xc2\xd8\x4e\x9e\x10\xb0\x84\xfb\x51\x11\x2a\xbe\xe2\xf1\x30\x1c\x67\x3d\x4a\x5e\x82\xe1\x24\x13\xd7\x45\xe6\x7a\x47\x2f\x97\x5c\x71\x6a\x4d\x0a\x2b\xee\x77\x57\x65\x43\x9e\x31\xa4\xd1\x28\xce\x66\x7e\x00\xc8\x1b\x8e\x96\xc5\xa2\xca\xe5\x4c\xab\xe6\x82\xa7\x8e\xee\x16\xe1\xfa\x04\x4e\xf4\xf8\x35\x2e\xb8\x71\x25\xd7\x5d\xda\xa2\xf5\x60\xa7\xd9\x68\xfc\x4a\x4d\x5a\x0f\xf8\xf1\x21\xec\x12\xe2\xf0\x69\xad\x63\xde\x4a\xa7\xca\xb8\x9c\xb2\x93\x8c\xe5\x33\x2f\x97\x38\x8c\x07\x83\xf7\xc9\x78\xd8\x19\x4f\xfe\x66\x35\x71\x54\xc4\x98\x12\x94\x67\x5e\xdb\xe1\x38\xcb\xc6\xc3\x7f\x5e\x61\x53\x56\x18\x83\x96\x44\xf6\xb7\x87\xc8\xa7\xd5\x13\xd5\x28\x82\xc7\xcb\xb2\x9f\x94\xd3\xcf\xf2\x7a\x77\x44\x5c\x8b\x92\xcf\x03\xb8\x76\xa9\x92\x4b\x4d\xa3\x55\x72\xdc\x5d\x2c\x2e\x06\xba\x8b\xa7\x5d\x9c\x75\x05\xbc\x3f\x9f\x71\x91\xa8\x27\x29\xcd\xe7\x33\x11\x91\x9f\x07\xe3\xbf\xe9\xd2\xa5\xea\xd2\xe9\xa2\xec\xc4\xc6\x78\x3e\x6b\xe9\xec\xaf\xdd\x0b\x9c\x2a\xa1\xc6\x48\xd3\xa8\x31\x82\xe8\xfc\xc6\xf3\x19\xc2\xf0\xd7\xa4\xc6\x68\x79\x09\x02\xe0\x8b\xb2\xad\xf8\xa7\x82\x9b\x9f\x94\xdc\x83\x7e\x16\xfb\xe6\x93\x10\x8d\xb9\xaa\xe3\xda\x4f\x85\xbc\x8c\x83\x2d\xef\x95\xe5\x91\x17\x88\xa8\x42\xdd\x41\x60\x56\x1b\x18\x14\x70\xbd\xa5\xe5\x92\x97\xd8\x37\xd3\xcc\xb8\xf0\x75\x1f\xbb\x98\x2b\x6a\xa2\x5c\x61\xd0\xcd\x15\x06\x2f\x44\xca\xa5\xa2\xbd\x65\x7d\x9c\xe9\xd4\x38\xfd\x8c\x27\x8c\xe8\x17\xe3\x18\x7a\xeb\xe7\xcd\x85\x14\x41\x58\x32\x0c\xbd\x32\xa0\xab\x62\xad\x92\xa7\x17\xb8\xd5\xf6\xe4\x65\x13\x28\x3a\xb2\xbe\xd9\x07\x53\xa7\xa4\xd2\x70\xc9\xa7\x9b\x93\x28\x79\xec\xd0\x8f\x10\xa1\xf4\xb2\x47\x59\x4f\xce\xd2\x55\x3a\x53\x2c\xce\x17\xbd\x2c\xf6\xa9\x8a\xb2\xb9\xaa\xbc\xb4\xc2\xb7\xae\xf8\x5d\xbd\xd1\xf6\x54\xd4\xc6\x23\xb4\x83\x87\x26\xb4\xcc\x4d\xf1\xf3\xae\x5d\x17\x22\xfa\x84\x92\x64\xac\x4b\xb9\x7f\x7f\x0e\x68\xed\x72\x56\x98\xc1\x1a\x89\xfc\x78\x31\x97\xc1\x76\xae\x67\x10\x6c\xe7\x1a\xa6\x73\xe2\xbd\x46\xf0\x24\x74\x69\xd1\xa9\x7e\xbd\x62\x7a\xca\xa7\x52\x76\xbc\x3f\xc7\xa5\xd1\x42\xe2\x30\x14\xd9\xa4\xe7\x82\xa5\x6c\x6d\x18\xae\x51\xb9\x3c\xce\x58\xce\x13\x1c\xd3\x8c\x56\x40\x89\x79\x83\x06\x18\xcb\x0b\x44\xc5\xfb\x27\xc9\xb8\xb8\x24\x8c\x29\xee\x03\xbe\x73\x49\xaf\x4b\xcd\x71\x2c\x7d\x9d\x74\xbb\x14\xe1\xa1\x5e\xfb\x3a\x9e\x55\x3c\x70\x3e\x0f\xe2\x48\x3f\xa1\x0f\x3a\x92\x06\x41\xe0\xf8\xbc\x56\x77\xeb\xb5\x4a\x42\x41\x10\x0e\x32\x4c\x5a\x61\x3d\xe9\x40\x47\xc6\x09\xbc\xdc\xc5\xc1\x43\x2d\x9f\x4d\xb9\x6d\x2f\xe6\x00\x15\x0d\x65\x9a\xd9\x1a\x08\x88\x34\xfa\x73\xa9\xc1\xf3\x25\xcf\x7f\x96\x0a\x05\xaf\x8b\xb9\xf4\xa2\x35\xd4\x7d\x2c\xe6\xcc\x7a\xc3\xe7\xea\x5b\xb8\xe6\x15\x78\xbd\x55\xac\xae\x6d\x1e\x39\xba\x14\xb5\xfe\x46\xd1\xea\x85\xef\xe7\x3d\x09\xce\xa7\x9f\xe5\x5d\x8d\x4b\xbc\x42\x11\x65\x24\xa3\x77\xb7\x45\x70\xdd\xdc\x01\x72\x5b\x50\x69\xe7\x3f\xe0\x76\xde\x47\x22\xb6\xac\xab\x69\x49\x97\x72\xf3\x89\xc5\x42\x68\x53\xb8\xb6\x9b\x38\x55\x72\xa1\x68\x6b\xdc\xa9\xda\xdf\x9c\x37\xed\xd2\x79\x50\xa1\xb0\x28\x62\x49\xe0\xce\xe1\x9e\xdc\x88\xab\xa0\xf3\x1f\x52\xa1\x3a\x6c\xcb\xa7\xc7\x33\xf9\x24\xc2\xcb\x9f\x6f\x54\xdf\x11\xc6\xd8\x4b\xc4\x00\x79\x5d\xab\x26\x13\x3a\x19\xa7\x9f\x59\x4f\x25\x17\xce\x4b\x72\xb9\xcc\xc5\xc6\xeb\x79\x3e\x49\xf9\x14\xd1\x16\x35\xdd\xd6\xca\xfc\x14\x81\x4f\x6f\x8f\xc9\x26\x74\xd0\xf6\x4a\x52\xfc\xd1\xb8\xe2\x8d\x47\x19\x8d\x47\x41\x52\x79\xa0\x29\x68\xd0\x0d\xe2\xc0\xc7\x15\x5a\xf1\x66\x69\x36\x1e\x56\xe0\x34\xaf\x74\xe9\xc8\x1f\xa8\x92\x7c\x91\x11\xdc\x9a\x05\x14\xa6\xaf\x20\xc3\xa5\x96\x0a\x68\xf7\xa9\x62\x60\xe9\xd1\x38\x6c\xb3\x23\xc8\xe3\x8e\x50\xa6\x6d\xf6\xab\xb3\xf4\xc7\x33\xc4\x93\x97\xc0\x0c\xac\x28\x19\x29\x13\xd1\xf6\x2c\x57\x71\xdb\x93\x11\x6a\xdc\xe5\x4a\x1e\x1b\xa7\x16\x2a\x3c\xee\xbc\xa2\xae\xb6\xa2\x90\xa3\x80\xcf\x65\x24\x91\x59\xd8\x26\x14\xb8\xba\xa3\xbf\x5f\x4b\xed\x88\xcf\xe6\x64\x9c\x66\x15\x69\xd4\xb2\x36\xab\x34\xbf\x67\x33\xe4\x9e\x7f\x3c\x83\x46\x37\x2a\x68\x9d\xf7\xb8\xe7\x6f\x95\x02\xed\xcc\x94\xbb\x85\x30\x94\x5b\xed\x3a\xa5\x84\x2e\x9f\x26\x7a\x67\xcd\xa8\x9f\x03\xd6\xaa\xa2\x19\xe4\xfb\x99\xfe\x7c\x18\xe6\xea\xf3\x6c\x9b\x97\xd5\xe0\x09\x8d\x41\xa4\xe3\x09\x8d\xfa\x47\xe2\xe1\x42\x43\x1d\xe5\x7d\xca\x6f\x91\x65\x28\xa2\xb6\xd0\x57\x61\x87\x29\xef\xc2\x0a\x0c\xfc\x2f\xea\x97\xe5\x73\x76\x3b\xcb\x3d\xa0\x0f\xf3\x5b\xe2\x23\xc6\x47\x29\xb1\x47\x85\x9e\x60\x4f\xa7\xc6\x68\x08\xdc\x25\xcb\x4d\x8d\xa3\x11\x66\x4f\xb6\x3f\xe5\x0e\x81\xa0\x9c\x42\xbd\xdc\xc1\xc1\xc9\x8b\xe7\x9c\x85\x31\x1a\x72\x17\xa2\xcb\x7b\x72\x2b\x50\xce\x41\xc9\x75\xe3\xe7\x9c\xba\x90\xa4\xbc\x90\x14\x8e\x86\x9c\x99\x7e\xf5\x08\x1d\x0d\xed\x8f\x4e\x5d\x8c\x01\xa4\xd6\xab\xbe\xcd\x64\x2f\x7a\x79\x8d\x9a\x26\x5f\x8e\x46\xe8\x35\xf7\x69\x6b\x93\x83\xac\xcf\xab\x32\xec\xc2\x77\x99\x28\x82\x29\x5a\x2c\xe4\x2b\x9b\x2b\x56\xfd\x9a\x5f\x38\xbe\x48\x87\x3e\x55\x8a\x81\xd6\xd1\x3b\x37\x77\xa5\xd0\x53\xea\xb0\x8a\x60\xe0\xb2\x80\x8b\x9b\x4a\x54\x52\xb4\xea\xaf\x6c\xf3\xf5\x17\xcc\x15\x77\x41\xe2\x5a\xdb\xdb\x2e\xbf\xfd\x92\x9f\x5c\x47\x55\x3d\x28\x66\x14\x73\x09\xbd\x67\xd5\xeb\x6a\x89\xa3\x11\x94\x28\xb8\xc7\x1c\x06\xee\x67\x02\x09\x07\xb1\x3e\xef\x52\xe5\x92\x17\xd4\x8e\x27\x34\x02\xc2\x63\x28\xcc\x86\x18\xbd\xc0\xf5\x86\x2a\x43\x3a\x49\x2b\x07\x9f\x4f\x25\x3a\x18\xb4\x01\xfe\xf9\x57\xfb\x70\xea\x18\x1f\x82\xb1\x37\xce\xcd\x98\x3f\x78\xb9\x39\xcb\x07\xcf\xf6\x47\xfa\x0b\xf5\xfd\x24\x48\x53\xf3\x72\x89\x1c\x46\x30\x73\xd4\x63\xda\x8e\x34\xae\xd9\x50\xd7\x0d\x7c\x31\xbe\xb5\xaf\x2f\x7f\x5c\xb7\x6f\x6e\xcf\x3b\x37\xa2\xd2\xa7\x11\xb7\x95\x17\x71\x70\x9e\xe6\xa5\xb0\x38\x67\xc7\xf0\x7a\x3b\x5b\x46\xb1\x7e\x3f\x53\xd0\xd2\x97\x32\xef\xd2\xcf\xd8\x21\x29\xa1\x69\x70\x2e\x03\xdd\x5c\xa5\x12\x61\x1d\xdd\xe4\x17\xa0\xc3\xdb\x52\x23\xc3\x14\x82\xa2\x88\x7a\x18\x80\x5f\x4f\xf4\x2f\x65\xb4\x26\x9a\x61\x95\x00\x2c\x7c\xe1\xd8\x2c\x1e\xc5\x69\x77\xa3\x1c\xcd\x1f\xe5\x04\xed\xf0\xd6\x70\x43\xf0\x66\x2a\x5f\xd3\x20\x03\x61\x1a\xb7\x8b\xcc\x0f\xd3\xa3\x9b\xb5\x40\xec\xd0\x1f\x79\x21\x30\x38\xb7\x82\x7d\xbf\x10\xdb\x84\xac\x15\x99\x2d\x70\x50\x51\x13\x6f\x32\x44\x08\xac\x37\x2d\x21\xab\x19\xde\x82\x0b\xba\x50\xd1\xb5\xd0\x43\x12\xe6\x36\x91\xc2\xff\x62\x88\x96\x9e\xfd\xd1\xd9\x97\x93\x23\xe8\x8b\xc1\x79\x1d\x92\xf3\xa0\x64\x83\xf3\x3a\x78\xdc\x11\xb1\x67\xd2\xdc\xf3\xd7\xe0\xfc\x9d\xd2\x7b\x5e\xdc\xfe\x04\xae\xb4\x55\x2c\xf9\x35\xc7\x92\xfd\x2c\x47\x04\x83\xb6\x20\xf0\x61\x82\xcb\x0e\x27\xf3\xdc\xe0\xd9\x9b\xd1\x98\x3c\x17\x0f\xee\xb4\x89\x26\xe7\xe3\x14\x15\x4b\x6e\x0f\xa2\x5f\x49\xf0\x11\xf6\xcf\xbe\xaf\xfb\xf9\x8e\x30\x22\x0e\xb6\xb9\x65\xe1\x3c\xa4\x7a\x89\x41\xe0\x42\x77\x91\x5d\xd2\x0c\x83\x36\xb9\x9f\x19\x77\xae\x2e\xce\x23\x3b\x95\xa6\x08\x05\x0b\x61\x5d\x4f\xf4\xaf\xab\xa0\xf5\x4d\x2e\x62\x09\x85\x51\x3e\x65\x52\x9d\x15\xe6\x88\x91\x73\x42\xc7\x0a\x7a\x58\x9a\x9c\x6f\x3a\x65\x75\x7c\xd9\x40\x20\xf9\xec\xd9\x2a\xc2\xff\x7f\xf0\x5a\x54\x40\xaf\x74\xa4\xf8\xc1\xb3\x3d\x47\x06\xc5\x7b\x9a\x4b\x90\xd5\xc5\x3e\x64\xc8\x08\xfc\x8a\x60\x99\x81\x03\xb1\xed\xa0\x22\x89\x41\x97\x87\xf8\xea\xac\x38\x7c\xbb\xf6\xa9\x0e\xf2\x39\xe8\xfe\xb5\xbf\xaa\x54\xd0\xa8\x8a\xf9\x3c\x3b\x36\x7c\x4f\x47\x8b\x45\x9e\xf2\x34\x82\x14\xc9\x26\x0b\x4d\x55\x91\xda\x9a\x4b\xd1\xd9\x08\xfc\x3c\x82\xbb\x43\x59\xd1\xc1\x18\xa4\xb3\x7c\x2f\xc6\xa1\xee\x2a\x13\x50\x12\x78\x8b\xbe\xbb\xb9\x00\xf7\x83\x67\xbb\x8e\x75\x37\x93\xc3\x97\xb0\xd1\xd1\x29\xf6\xf2\x0d\x83\x3d\x11\x34\x41\x06\x20\x9a\x83\x07\x3c\x57\xea\xd4\x92\xf2\x08\x34\x4d\xf4\x5d\x8c\xb1\xa5\x2b\x0d\xe0\xb5\xae\xdc\xc7\xba\xb7\xe9\x2c\xa4\xc6\xd1\xcd\x52\xdc\x15\x40\x87\x40\x1e\x01\xac\x93\x99\xcf\x05\xf8\xc0\x43\xf8\xaa\x10\x90\xc8\x48\x43\x3c\x8e\x10\xf7\x94\x69\x96\x27\x53\xd3\x7e\x9a\x7f\xa9\x2a\x1d\x5d\x95\x94\x8e\x46\xb9\x7c\xb2\xdb\x07\xf7\x63\xf6\x74\xea\xa0\xc2\x13\xee\x74\xea\x58\xae\xe1\x8e\x67\x23\x3f\x5d\x39\x70\xec\xb9\x50\xdd\x54\x92\x86\x53\x47\xf7\x8d\xc1\xd8\x18\xd0\x0c\xf3\x87\x51\x84\xf0\xc6\x5c\xdd\x58\xe4\x62\x0f\xa3\x08\xa1\x25\x55\xf7\x70\xd9\x45\xf4\xf5\xaa\xe8\x07\x76\x06\x0e\x08\x95\x13\xaf\x8a\x49\xbf\xe9\x41\x79\x4b\x1a\x47\x37\x8b\x85\xb2\x73\x3c\xb6\x3d\xa9\xf1\x34\x82\x75\x07\xcd\x3c\x01\x03\x3e\x5a\x0a\x58\x1f\x74\xd6\x30\x93\xd4\x9f\xe2\x0a\x1e\xaf\x9f\x97\x97\x77\xed\xeb\x1f\x57\xb7\xed\xeb\xaf\x3f\xce\x4f\x2f\x4e\x3b\xc8\x27\xbf\xed\x36\x14\xbf\xfa\x3f\x2b\x7b\x26\x6f\xf0\x38\xf8\xbb\xca\x59\xed\xca\xa3\xda\x2b\x8e\xf6\xc0\x21\xae\x75\xad\x6a\xc7\x70\x20\x56\x92\x8a\x0a\x00\xe2\xf2\x3a\x90\x22\x56\xb2\xee\x33\xa9\x2c\x7e\xed\x4b\x65\x71\x7f\x4d\xfa\xf3\x8d\xe1\xfe\x62\x59\xb6\x72\x0f\xcc\xba\x50\x20\x01\x01\xc9\x89\x7c\xb8\x40\xaa\x1e\x9b\xb8\x70\xf5\x73\x21\x8b\xe0\xb5\xbf\x09\xc2\xb7\xd7\x7f\xf5\x92\xec\x33\x63\xf2\x5a\xbb\x26\xe8\x08\x6d\xd1\xb5\x95\xc9\xb7\xd8\x89\x8e\xde\xb9\x9a\xe6\x11\x42\xe1\xda\x54\x15\x45\xf4\x94\x48\xeb\x85\xe3\xdb\x55\xef\x0a\xd4\xd8\x02\xd1\x32\x86\x90\xf1\x45\xb8\x5a\xf1\xd0\x5c\xde\x1b\xf1\xc8\x0f\x1e\x2f\xc3\x55\xdf\xe9\x65\xe5\x54\x50\x58\xf5\x64\x9d\xc7\xa0\x3b\x97\x13\xb1\x9e\x55\x68\xfe\xe4\x1d\xa4\xf3\xdc\x97\xfa\xba\xb2\x5e\xbd\x9e\xc7\x87\x97\x57\x37\xc1\x3b\xae\x16\xcb\x15\x0d\x03\x54\x25\x9e\xed\x3b\x28\xef\x68\x4e\x04\x2b\xf1\x66\xe6\x6b\x33\x26\x46\xdb\x41\x2d\x6f\x0e\x4f\x1b\xd6\xa0\xb1\x4f\xe8\x12\xd4\xa8\xf3\x9a\xbc\x0d\x9d\xed\x1a\xc3\x78\xc4\x96\x5d\x47\x78\xb7\x91\x87\xe1\x57\x29\x1f\xca\x2f\x98\x8a\x3b\x70\x20\x67\xaa\x1e\x23\x7a\xd6\x3b\x7e\x6f\x5c\x4d\x36\x5a\x05\xdc\x0c\x01\xf5\x7c\x1e\xea\xdb\x7f\x34\xf0\x1f\x0d\x04\xa1\x99\xab\x67\x3d\x71\x59\x79\xfd\xa7\xc5\x9a\xff\x6e\xe0\xe6\xbf\x57\x0a\x16\xdc\xf3\xaa\x6e\x2f\x35\xae\x3a\x7a\x83\x61\xfb\xd5\x41\xfa\xa4\x81\xd7\x6e\xe6\xf2\x81\x36\x91\x15\x72\x7d\x5a\x17\x87\x68\xb1\xf0\xeb\x75\x31\x3c\xe3\xf7\x7d\x7f\xc7\x53\x7d\xe9\xcf\x79\x8c\x50\x7f\x8e\xbf\xcd\x90\xe5\xcf\x19\x16\xfa\xec\x96\x09\x29\x19\x59\x30\xf2\xf5\x92\xd1\xc2\xda\xd4\x89\xf2\x51\x99\x10\x83\x0d\x6b\xc9\x21\x9d\x70\x93\x8e\x5d\x25\xc2\xc2\x6d\x44\x55\x5e\xa7\xda\xc0\x3e\x98\xa3\xc3\x00\xdd\xd2\x00\x8d\x61\xa2\x07\xc8\x7a\x96\x1a\x23\x2d\x3d\x24\xc3\x14\x7b\xa4\xda\x44\x66\x48\xfa\x29\xe2\x3e\x4e\x42\xd0\x25\xf5\x21\x68\x06\x19\xa6\xaf\x20\x84\x70\x9c\x0c\x69\x66\x0a\x4d\x4f\xa1\x94\x21\xe5\x21\xdc\xee\x92\xa1\x0b\x4a\x6e\xc1\x4f\x8e\xd8\x3f\x2f\xd3\xc8\xa4\xc6\x34\xc2\xf3\x07\xb3\x03\x31\x8d\x82\x0d\xf0\xfb\x92\x0d\x4c\x6a\x3c\x7b\x58\xe6\x1e\xfc\x2c\x73\xef\xa2\x94\x79\xb9\x44\xf0\xbf\x72\x86\xde\xae\x69\x7e\x0f\x53\xdc\x4f\x1d\xec\x91\x97\x3b\x60\xa9\xa6\x91\xf9\xb2\x5c\xb2\xb9\x03\xf7\xc6\xe0\xb4\xaf\x61\x85\x5c\x7f\x5b\x71\x63\x0c\x4a\x38\x7d\x72\xc5\xc0\x23\x42\x78\x90\xbb\x99\xef\x6b\x9a\x3e\x20\x2f\xcf\x9e\x19\xe2\xe7\x07\x33\xc2\x6a\xbd\x9c\x25\x86\x4c\xfd\xfd\x00\xbd\x04\xdb\xa4\x6f\xc9\x70\xe6\xd1\x3e\x09\x20\x8a\xb9\xcf\x25\x0b\x56\x40\xfa\x56\x9f\xf8\xb6\x0f\x2c\xae\x70\x3c\x33\x40\x56\xdf\xb8\x0b\xc4\x1d\xad\x30\x25\x62\x67\x67\x44\x08\x71\xed\xc0\x69\xe9\xa2\x3c\x56\xca\x62\x51\x16\x17\x65\x91\x19\xd4\x9b\xc2\xfb\xb4\x28\x5b\x6f\x3a\x2d\x5d\x2d\x15\xd4\xeb\x1b\x4b\x96\x32\x45\x8c\xc8\xeb\x1b\xd3\x68\xb1\xd0\xd9\x8f\x1d\x81\xe6\x13\x16\xcf\x1c\x92\x0a\x6d\x10\x35\xc2\x82\xd8\x38\x01\xdf\x38\xc1\xa6\x8d\xf3\x2a\xe0\xcb\x9d\x93\x07\x59\x3b\xd6\x1b\xdc\x42\xbf\x4a\x0e\x23\x4d\xf3\xaa\xe4\x28\xe2\x18\xb6\x89\xaa\xa4\x53\x14\x50\xf0\x3d\xf6\x49\xb3\xb8\x62\x17\xaa\xf9\xc6\xb1\xf0\x8b\x1a\x10\xd2\x41\xec\x54\x90\x04\x40\x40\x48\xbb\xcb\x55\xbd\xeb\x75\xbc\xbb\xef\x15\xa8\x0f\xb2\x6c\xd8\xcd\x7c\x50\xbd\x35\xdb\xc1\x6a\x71\x3c\xca\xb3\xa5\x21\x86\x59\x6d\x62\x4f\x50\xdd\x60\xa1\x45\x71\xbb\xcb\xc8\x6a\x2a\xec\x13\xa8\xe1\x4f\xc4\x58\x7f\x6b\xec\xbb\xc8\x25\x55\xde\x45\xe5\x70\xec\x52\xbb\x3b\x75\x70\x48\xba\xd4\xb8\x38\xfd\xf4\xe3\xee\xe0\xfc\xb6\x8d\x23\xd2\xb4\xa2\x7d\x17\xa0\x6c\x0e\xc1\x74\xb8\x7f\x08\xc0\x79\xbe\x1d\xb1\xe5\x6c\xa0\x6d\xf9\xca\x5e\xe0\x30\xd8\xe7\x00\xdb\xea\x9b\x01\x0e\x49\xff\x5d\xd8\xea\x9b\xa1\xe5\x92\x06\x50\x6d\xbf\x35\xf6\xc3\x9d\xa0\x55\x6d\x98\xf9\xc8\x2b\x9e\xa6\xb9\xad\x3d\xd3\x5b\x2c\xdc\xd6\xae\xa9\x1e\x96\xe1\x3c\x67\x2c\x0f\x5c\x4a\xaa\x55\x1d\xa4\xed\xc8\xb8\x0e\xe9\xf2\xab\x1e\x72\x58\x08\xff\x0c\x16\x1a\x60\xb2\x21\xe0\xa1\xf9\xae\x58\x89\x82\x29\xdf\x62\x64\x43\x03\x43\xd8\x3b\xb7\x5e\xc7\xb2\x4d\x1e\x56\xc2\x72\xf7\x3d\xc1\x69\x6f\x71\xfa\xa2\xdd\x45\x16\x72\xeb\x75\x45\xe5\x9e\x07\xe5\xdb\xf7\x2c\x15\x38\xdc\x02\x38\xc0\x7d\x4e\xc9\xb3\xcd\x81\x4b\x35\xad\x80\x93\xaa\xbf\x02\x22\xbc\xe4\x43\x24\xbe\x2e\x16\xbe\xb1\xf5\x50\x74\x9e\xbd\xc9\x90\x38\x79\xa2\x9b\x9f\x3d\x15\x7e\xf2\x12\x35\x26\x5f\x54\x4c\xe8\xec\x0a\xec\xb6\x8d\x8e\xbf\x58\x30\x40\x9f\x2b\x46\x3e\xcb\xaf\x7a\x34\xc7\xe1\x1c\x59\xd1\xeb\x73\xcb\xfa\x14\xcd\x8d\xc0\xf8\xec\x2a\x45\xcb\x7b\x4d\xd9\x87\xa2\x51\x54\xec\xa8\x66\xae\x86\x2e\x3f\xc3\xe4\x7a\xb0\x0a\x55\x77\x2e\x49\x5b\x4f\xa9\xb4\xd8\x2c\xd1\xa6\xcd\xa2\x9e\xe5\x5c\xe5\x47\x6e\x04\x76\x7e\x57\x25\x86\x76\x01\x3d\x17\x4d\x86\x7c\xe1\xfd\x7a\x1d\x17\xcd\x86\xdc\xff\x07\x04\xd5\x5c\x27\x53\x9b\x84\x78\xe0\x08\x5a\x05\x9f\x76\x17\xb5\x9a\xe6\xee\xbe\x0c\x23\x3a\xbb\x6a\xed\x99\xcd\x2a\xf1\x45\xb6\xd9\x15\xfb\xcc\x08\xdc\x7c\x45\xba\x02\xaf\x75\x39\x2c\x77\xff\x1a\x5e\x13\xfd\xd9\x7b\xe7\x2e\x16\xbf\xed\xbb\x8b\x45\x75\xa5\x1b\xa5\x94\x26\xee\x94\x13\x76\x21\x61\x6f\xdf\xcd\x23\x7b\xb1\xd4\x3d\x5e\xf0\xed\x4a\xf2\x5b\x46\x36\x56\x9b\x26\x9b\xf4\xee\x2b\x18\x4a\x41\x50\x22\x92\x66\x69\x49\xa1\x66\xf4\x02\xde\x77\xca\x18\xf5\xaf\x53\x93\x7b\xc8\x72\xed\xd0\x59\x2c\xbc\x7a\x1d\x9e\x48\xb5\xb1\x74\x49\xb3\xf1\xce\xe3\x5b\x80\x21\x43\x8b\x12\x86\x4a\x56\x5a\x66\x93\x2e\x22\x47\x91\xc6\x26\x91\x6d\x2c\x16\x21\xe6\x8b\x10\xff\x97\x54\x59\xfc\xd7\xa9\xb2\x2a\x98\x05\xee\xb1\x9f\x9f\x31\x51\x39\xe5\x54\x5c\x68\xee\x56\xc6\x49\x65\x4f\x10\x51\xa9\xbc\x92\xf3\x48\x13\xfb\x64\xd7\xda\x25\xdc\xde\xd0\xdb\xde\xc6\xfe\xf6\xb6\xe0\x02\xcf\x5c\x09\x1f\xca\xbb\xb7\xf2\xee\xe3\x4e\x4e\x79\x8d\x67\xa6\x87\xfd\x21\x35\x1b\xf8\xe9\xc8\xf4\x97\x72\x6c\x67\xee\xc6\x5b\x76\x15\x43\x2a\xd6\x4d\x9f\x92\xba\x5b\xf7\x93\xba\x57\x0f\x92\x92\xf3\xad\x5e\x81\x8e\x92\x3c\xe6\xd2\x68\x4b\x48\x80\x97\x67\x13\xbd\x37\x5f\x91\xc7\x95\xf4\x07\x46\xea\x65\x58\x5f\x2c\x62\x9f\x2f\x62\xff\xbf\x5c\xc4\xfe\xeb\x8b\xb8\x66\x0d\x78\xa2\xd8\x02\x2a\x3c\x1c\x50\xcf\x39\x79\x40\x2e\xb9\x8d\x20\x1b\x5c\x6f\x0e\x37\xdb\xd2\x01\x4a\xf3\x1d\x84\xe7\xc8\x01\xe0\x20\xab\x0c\x02\x9a\x66\x95\x26\x87\x01\x95\x52\xf6\xc6\xc3\xa0\xe2\x06\xe1\x38\x09\x2a\x74\xf4\x54\x49\xc6\x83\x40\x64\x60\x40\x70\x19\xeb\x2e\x32\x46\x5b\x20\x02\xe4\x6a\xc0\x1c\xce\xca\x2d\xfc\x45\x10\x53\x5a\x07\x10\xf3\x88\x6b\x37\x1c\x30\xf5\x6f\x3a\x2a\x0c\xd9\x13\xf0\x76\x33\xee\x52\x15\x94\x5c\x91\x5c\x00\xd4\xe5\x37\xd3\x63\xa0\xe4\x32\x5a\xbb\xff\x33\x58\xba\x8b\x75\x8f\xfb\x73\xca\x50\x01\x00\xde\x4a\x78\x37\xba\x22\xc4\xfd\x53\x90\x1b\x08\x28\x19\x70\x28\x19\xfc\x65\x3a\xf2\x37\x86\x6b\x7f\x07\x5c\xab\xaf\x20\x5b\x95\x34\x68\xc2\x51\x52\x46\xb5\xea\xfb\xde\xca\x3b\xc3\xae\x68\xb1\xf8\x1d\xb6\xab\xb2\x81\x7e\x03\x94\xb9\x46\x87\xba\x6b\x18\x53\x35\xe7\x92\x4e\x63\x19\xc6\xf4\x70\x93\xfb\xb7\x84\xe7\x5d\x84\x43\xf9\xbc\x87\xc0\xaf\x34\x3c\xbf\x85\xb1\xf9\x55\x51\xad\xd0\x8b\x45\x8b\x45\x04\x49\xf4\x31\x4f\xda\xc0\xb9\x8b\xd9\xfb\x53\x91\xce\x5e\xe9\xc4\x1b\xb2\x15\x28\xc8\x0d\x46\x6c\x0c\x39\xb1\x31\xdc\x54\x9d\x72\xa5\x9b\x13\x69\x39\x3d\xe7\x2e\x16\xde\xf6\xf6\x86\xe3\x79\xf7\x9d\xb7\x76\xd4\x8e\xe6\x7a\x1e\x72\x5d\x6a\x2a\x8d\x38\x18\x8c\x36\x81\x81\xf4\xf7\x70\xd7\x53\xf4\x91\x47\x9b\xd0\x02\x25\x4a\x1e\x4b\x51\x11\x90\x67\x8d\x25\xe1\x52\x34\x5f\x02\xc9\xbb\xb2\x9b\x53\x81\x1f\x40\xea\x20\x9e\x61\x25\xc5\x33\xac\xa4\x78\xde\x93\x41\x2f\x7a\x73\xfd\x2d\x63\xe2\xc4\xf3\x6f\xc0\x65\xf2\xe7\xdf\x95\x8b\xe8\x33\x57\x77\xf3\xbd\x0a\x80\x2b\xd2\xfc\x0d\x69\x81\x48\x3b\x8c\x8a\xb4\x70\x43\x5a\x94\x6f\xf2\x3c\xa9\xbf\x9e\x34\x28\x5a\x68\xbd\x7c\x49\xa8\xe9\xe1\xf1\xcc\xf4\xf1\xd6\x07\x33\xc0\xdf\x3e\x98\x21\xbe\x4f\xa8\x19\xe1\xaf\x09\x35\xfb\xf8\x36\xa1\xe6\x60\xc9\x35\x5c\xde\x8c\x5e\x43\x13\x1b\x31\x01\xe3\x2d\xe4\x34\x13\x15\x0d\xe0\x6a\x53\x95\xfe\x8c\x05\x22\x18\x73\x08\x18\xff\x09\x22\xb0\x5c\x95\x85\x70\x17\x8b\x5d\xce\x4d\x35\x0b\x3f\x47\x10\x8f\x7a\x57\x9c\xbb\xa4\xc4\x30\x00\x9a\x40\x96\x4b\x20\xbd\xa0\x31\xdd\xed\x26\x08\x4e\xaa\x2e\x82\xc0\xb6\x65\xaa\xb5\x41\x88\xbb\x58\x34\xab\xc4\x53\x5a\x5a\x91\xdb\x14\x5a\xdf\xe5\x03\x98\x9d\xe2\xe8\x85\xc7\x4c\x00\x2f\xb1\x2e\xf1\x94\x18\x5a\xe3\xbf\xb6\x73\x9b\xfb\xd0\x93\xd6\xae\x59\xde\xc3\x13\x31\x79\x13\x3e\x79\xac\x3f\xf7\x3d\x4a\x5e\x6e\x9f\xa8\xf9\x29\xc5\xc9\x13\x35\xdb\x29\xee\xb4\xbf\x74\xcc\xdb\xdc\xdb\xb0\x35\xd9\x34\xc7\x2b\x68\x36\x9f\xdb\x15\x9e\x7d\x65\x2e\x5f\x99\x67\x86\x7d\xd5\x38\x66\x93\xbf\x38\x4c\x36\xb8\x37\x93\xf5\xad\xad\x68\x75\xb2\xa5\x48\x23\xa1\x69\xd7\x60\x48\x91\x6c\x37\x71\xc4\xfe\xf4\xd9\x9f\x01\xd9\x06\x7e\x12\x04\xbc\xb6\x8f\xfd\x7a\xd3\xc1\x76\x07\x77\x1c\xf0\x8a\x7d\x90\x5a\x7d\xe2\x5b\x03\xe2\xd7\x9b\x96\x5f\x27\xbb\x3c\x80\x32\x21\x9f\x14\x61\x99\x1f\xa7\x93\x01\x7d\xba\x18\xfb\x85\xab\xa1\x34\xc8\x2a\xd9\xb8\x72\x41\x93\x7e\x90\xa4\x95\x87\x6e\x30\xaa\xcc\x40\x73\x60\x40\xb3\x9d\xc1\x78\x14\x55\xc4\xad\x7f\x00\x47\x34\xab\x13\x7c\x29\xba\xa4\x9d\x16\xae\x54\x45\xb7\x1c\x6c\xb7\xbb\xac\x47\x2b\x61\xd8\xd3\xc8\x0c\xc8\x45\x6a\xb9\xe4\x53\x6a\x85\xc4\xe7\x40\x63\xc1\xb7\x4f\x29\xff\xb6\x92\xdc\x4e\x79\x2c\xf6\x5b\xf6\xd9\x4d\xad\x28\xff\x2c\x63\xb1\x2b\xce\xf1\xb9\x63\x01\x65\x7c\xd2\x33\xaa\x5f\x27\xcd\x15\x67\x02\x32\xb7\x18\x16\xb8\xd3\x97\xf4\xed\x48\x04\x76\x2b\x8d\x46\xd3\xbe\xa4\x55\x42\x8d\xa8\xa7\xfb\x78\xce\x50\x98\x3e\x22\x6c\x4b\x40\x91\x09\xb7\x95\x4b\x57\x4b\x76\xc0\x04\x6f\x42\xde\x30\xb6\x6f\x35\x39\x85\xf2\xbc\x82\xd9\x6b\x6d\x92\x72\x9b\x33\xde\x66\x50\x25\x17\xa9\xa6\xf1\x23\x60\xc2\x1f\x08\x49\xa1\xd2\x09\xc0\x38\x00\x7b\x95\xf8\x8a\xf9\x3b\x50\x60\x42\x3d\x2f\xad\x0c\x19\x71\x27\xc8\x2e\xae\x2c\x9a\xbb\x52\xd0\xdb\xf0\xc4\xd6\xbf\x56\xf7\xeb\x35\x99\x0d\xe5\x9e\xa8\x5e\x3e\x7e\x33\x03\xec\xff\x66\xba\xf8\xcb\x89\x19\xe2\xaf\x27\x66\x84\xdd\x23\xb3\x8f\xbd\x23\x73\x80\x27\xa7\xe6\x08\x4f\x66\xe6\x04\x87\x47\x66\x8a\xdb\x3f\xcc\xd9\x52\x10\xc2\xf3\xc2\xe2\x47\xd3\x3c\xe3\xc2\xd7\xaf\x23\x5a\x9f\x73\x87\x8d\xaa\x76\xc0\x54\x6c\xff\x29\xdf\xfe\xd3\xff\x92\xd4\x9e\xbe\x4e\x6a\x33\xc2\xab\xca\xb1\xc3\xdf\x24\x5e\x7f\x53\xe9\x56\x95\xfb\xe9\xa8\xaf\xcd\xf2\xeb\x6e\xf9\x75\xaf\xfc\xfa\x16\x30\x8f\x98\xe5\xab\x1e\xe3\x8a\xae\x7b\xd4\x6c\xe2\xcf\x3d\x6a\xee\xe2\x4f\x3d\x6a\xee\xe1\xcb\x1e\x35\xdf\x2e\xe5\xa0\xfe\x97\x18\xa5\x04\x18\xa5\x55\x19\x4d\xc2\xc9\xa6\xe4\xe7\x32\x9a\xe4\xff\x9d\x8c\x26\xf9\xfb\x32\x9a\xc6\x4f\x44\x34\x2d\xbf\x5e\x37\xd5\x24\x20\x43\x82\x72\x54\x46\x89\xd2\x1b\x9c\x02\x7c\xe7\x6b\x5a\x83\x90\xa0\xb5\xb7\x42\x0d\xa6\x02\x86\x53\x0e\xc3\xe9\xeb\x14\x60\xe5\x4b\x41\xdc\x2d\x16\x5f\x55\x6a\x30\x7d\x9d\x62\x55\x0a\x59\x94\x28\xa5\x72\xef\x41\x8b\x05\x6d\xd1\x56\x73\xe5\x68\xfd\x22\xa9\xc1\x2d\xf0\xac\xc5\x97\xc1\x2d\xa4\xd9\xde\x62\xb1\xa7\x08\x93\xa5\xd7\x7b\x7e\xc5\x07\xc4\xb1\x4f\x7c\x46\x76\x41\x02\xc0\xf7\x1e\x01\x6f\xf9\x6a\xfa\x2e\x27\x48\xe0\xa2\xda\x47\x4a\xe9\x52\xc9\x96\xee\x91\x2f\x3a\x35\xae\x26\x14\x83\x1d\x13\x7b\xb9\xe6\x2f\x1e\x81\xab\xc4\x06\x06\xa3\xf4\x39\x94\xf0\x79\xe4\xf2\x66\x71\x02\x17\x0a\x45\xaf\x0f\x4b\x64\x6e\xb2\xa1\xed\xee\x7b\x8b\x45\x35\xef\x0f\x08\xa4\x76\xa1\xfb\xd5\xbc\x5f\x8c\x84\x14\xf2\xa8\xbc\xfa\x4c\xac\x66\xc6\x57\x33\xfb\xcb\x6c\x1d\x88\xd0\xf8\x85\x00\xb8\xe6\xdb\x70\x55\xd0\x94\x57\x05\x1d\xb8\x29\x10\x17\x06\xed\xee\x62\xe1\x11\xd2\xee\x6a\x5a\xf5\x1b\xdc\x15\x69\x5a\x75\xab\xc7\xbd\x13\x7a\x84\x65\xae\xc2\xfd\x69\x73\xd3\x65\x2b\xbf\x8b\x5c\x61\xf0\x3c\xb2\xbb\xc6\xca\xc1\xa5\xb2\xe0\xd1\x3a\x9a\xe6\x97\x3a\xa9\xe0\xd0\xec\xaf\x51\x3a\xab\x8c\x6a\x95\xf6\x29\xa7\x80\xca\x50\xc8\x93\xf3\xe3\xe0\xd5\x71\x34\xff\x68\x34\xf6\xa9\xa6\xed\x36\x1b\x8d\x77\x74\xa9\x3a\xcf\xfc\xd6\xfb\x6b\x55\xfc\xab\x0a\xfe\x6a\xb9\x67\x47\x11\x9a\x61\x8f\xf1\xc4\x3c\xa4\xd7\x5b\x54\x25\x41\xa4\x7c\xfd\x1d\xff\x0b\x49\x00\x50\xb4\x47\xb6\xfe\x62\x73\xbf\xff\x79\x73\x97\xa1\xf8\xca\x12\x7e\x53\x1a\x2b\xe6\x67\x26\xe0\x6d\xc6\xe1\x6d\xf6\x77\xae\xa3\x40\xf2\xfa\x27\xf4\x6d\x99\xa8\x65\xc7\xce\xde\x46\x82\x57\xec\xe3\xe2\xd8\xe6\x97\xda\x4b\xd1\xa3\xbf\xc9\x9a\xcf\xc5\xa8\xe6\x82\xac\xff\xcb\xa3\xfa\x73\xaa\xdd\xdd\x6e\x16\x62\xa0\xca\x26\x36\x48\x34\xf7\x53\xe1\x32\x6b\x8a\xf0\xf3\x02\x51\xa2\xf0\x5e\xae\xb0\x12\x21\xeb\x82\xf0\xdd\xdf\x38\x13\x83\x54\xed\x0d\x57\xe8\x6f\x5c\x08\xfd\x0d\xb7\x5e\x48\x4d\x2c\x97\x54\xf5\x3f\xfe\xb5\xef\x6a\x5a\xb3\x01\xf8\xc1\x10\x6f\x06\x7b\x45\x4b\x4a\x5c\xc6\x11\xfd\x54\xa4\xfc\x20\xa6\xf2\x81\x4f\xe5\xc3\x5f\x9e\xca\x46\xa1\x41\x52\xba\x7f\x5c\xbf\x67\x60\xec\x9f\xfb\xce\x53\x4f\xe8\x6a\xf9\x88\x46\x2f\x7e\xc1\x00\x4a\x13\x6c\x35\xf8\x81\xe8\xe4\x23\xef\xe4\xe3\x7f\x49\xc7\xbd\x79\xdc\x44\xc8\x71\xb7\x57\xf9\xcd\x00\x78\xa9\x06\x8b\xd2\xa6\xb3\x7a\xba\xed\x55\x09\xf1\xd6\xe9\xbc\x41\x3c\xea\x77\x5e\x21\xf3\xf6\x36\x91\x79\x87\x29\x76\xcb\x94\x1e\xa4\x34\xd7\x52\x80\xde\x53\x2f\x07\xab\x70\xd6\xec\x6e\xee\xc7\x68\xec\x07\xaf\xf5\xa3\x59\x19\x27\x95\xdd\x4d\x9d\xf9\xd4\xa5\x58\xe1\x5a\xf3\xfd\x9b\x7f\xe2\xfb\xbb\xb8\x48\x04\x55\x0c\x1b\x02\x75\xe3\x88\xb8\x00\xa3\xe1\x7e\x64\xd5\xeb\xc2\x8f\x44\x9f\xb8\x0c\x56\x43\xdc\x40\x78\x20\x9f\x9b\x08\x8f\xe4\xf3\x2e\xb2\xe0\xfe\xfd\x85\x5b\x9e\x9a\x7d\x9c\x81\x97\x41\x73\x80\xe7\x74\x30\x0b\xcc\x11\xc3\x9c\x22\xf2\x48\xc4\xf7\x53\xde\x04\x5c\xe2\xbf\x8c\xe8\x30\x30\x69\xde\xcc\xc8\x35\xa1\xef\x2d\x2a\x5b\x33\x2f\x97\x39\x2d\xcc\x16\x28\x35\x03\xfc\x86\xcd\x50\x6a\xfa\xcb\x65\x4e\x7e\xb2\x25\x2d\x93\xef\x9d\x48\x91\x11\x0f\x52\xbc\x7a\x23\x01\x49\xcd\xf5\x24\x58\x2b\x57\x6a\x87\x83\x76\x36\x04\xe9\x09\xc4\x38\x42\x31\x8e\x60\x3f\xb4\xea\xf5\x00\x45\x84\xda\x0f\x53\x47\x0f\x58\xff\xfb\xf9\x4b\x13\xb1\x49\xed\x73\x85\xa8\x88\x7d\x91\x2f\x7d\x36\x9b\xe2\xb6\x69\x57\x44\xcd\x91\x33\x18\xc9\x19\xec\x8b\x19\x1c\xac\x8e\xde\xc7\x7c\xf0\x9e\xca\x28\xb1\xaa\x0b\xb2\x9f\x72\xc5\xdd\x5c\x2a\x28\x74\x72\x2d\x2a\x95\xce\x21\xfe\x9e\x5b\xcc\xbf\xc7\xe6\xbd\x98\xe7\x8a\x0b\x6a\x14\xcb\xc7\xcd\xac\x05\xf6\xcb\xcc\x05\x4f\x5a\x07\x63\x0e\xbc\x95\x78\x54\xa9\xd5\x69\xbd\x66\xca\xeb\x85\xff\xa9\xd5\x3d\xc6\x7d\xf8\xab\xdc\xc7\x93\x40\x13\x4f\x1c\x4d\x3c\xfd\xbd\xc3\x4e\x45\x5c\x0f\x11\x5a\xbb\x31\xdd\x84\xec\x9a\xb9\xc6\x15\x43\x6e\x85\x36\x92\x24\x86\x42\xb8\x50\xaf\xd7\xf9\x7d\xa1\x10\x71\x84\xf9\x5d\x79\x50\xaf\xe3\x06\x21\xfe\x62\xd1\xdc\x0f\x5e\xd1\xbb\x60\x28\x73\x99\xab\xbe\xa9\x58\xf1\x59\x0c\xf7\x99\x0f\xf7\xf9\xf5\xe1\x16\xac\x4c\xb5\xb1\x76\x11\xf4\x9a\x4c\xce\x5d\x43\xc9\xee\x52\x34\xf2\xe7\xca\x91\xef\xa0\x8d\x35\xd1\xf6\x81\xe8\xf2\x01\xef\xf2\xc1\x7f\x89\xc8\x0f\xfe\xf2\x05\x66\xf3\xdd\xdf\xbd\xb7\xa4\xc5\xdd\x56\x71\x6b\xa5\xf2\xe7\x87\x91\xaa\x9c\x66\x3b\x25\xbd\x9b\xf2\x35\x25\xf6\x4a\x3e\xfb\x5e\x2e\xbf\x99\x0d\x7c\x37\xa0\xb0\x09\x0f\xfe\x37\x19\xf0\x43\x31\xc1\x87\x7c\x82\x0f\xff\xcb\x09\x3e\xfc\xa9\xc4\x63\x6f\x55\xe2\x51\x42\x99\xeb\x37\xb8\x6b\x42\x0c\x45\x4c\x31\x9e\x99\x0d\xfc\x71\x48\xcd\x5d\xfc\x74\x64\x36\x97\xb2\xed\xff\xa5\x79\x39\x12\xf3\x72\xc4\xe7\xe5\x68\x6d\x5e\xf2\xe1\xab\xe0\x7a\x2c\x4a\x1d\xf3\x52\xc7\xff\xe5\x6c\x1e\xbf\x3e\x9b\x54\x45\x46\xb4\xac\x01\x29\x66\x68\x34\x1b\x8a\xa8\x91\x26\x2d\xc5\x5d\x98\x97\xad\x7c\xd9\xc1\x73\x38\xd2\x6d\x07\x2d\xbf\xea\xed\x42\xf0\xed\xf5\x29\xb1\x0f\x23\xdc\xc1\x47\x91\x63\xb5\xff\x5b\x1a\xaa\xfd\x7f\xeb\xde\xf9\x05\x34\x9a\x4d\x3f\xd7\x2f\xfc\x5f\xbe\x7d\x4e\xf3\xdb\xe7\x69\x64\x07\x0e\xf1\x97\x4b\x0f\x6e\x9d\x73\xca\x4e\xd3\xde\x6e\x26\xac\x7e\x8a\x30\xf6\x18\x65\xf5\x76\xed\x2a\xda\x27\x6f\x89\x0c\x91\x28\x2e\x9b\x1b\x8e\x3d\xf1\x1c\x80\x7e\xbf\x20\xb2\xd8\x97\x66\xf1\x45\x4d\xf6\x5b\xbb\xa6\xf8\xe4\xf5\xe9\xea\xb7\x3d\x73\x57\xf9\x26\x90\xf1\x5b\xa0\x82\x74\x4a\xaa\xa7\x23\x19\x6a\x3b\x8a\x29\xae\x36\x10\x66\x9b\xcd\xb5\x29\x23\xcd\x1d\xdc\x3e\x84\xe7\x86\xd9\x74\xf0\xd6\x07\xd3\xb5\x77\x1d\xfc\x8d\xfd\xee\x39\x4b\x64\xf2\xac\x3c\x1b\x88\xa7\xdf\x40\x9e\xa6\xc8\xb3\xeb\x2c\x97\x02\x94\x36\x6c\xd4\x7e\xcc\xcd\x7f\x3c\x62\x7b\xc2\xb2\xec\x46\x31\x0e\xf8\x4b\x1b\xf7\x5c\x6c\xc1\x73\x0e\xc8\xe7\xff\x25\xd8\x9e\xff\x14\xa1\x89\x63\xeb\x6f\xab\x1f\xbc\x22\xc1\x3d\x8c\xd6\xb0\x9f\x3c\x00\x1e\xa8\xd9\xc0\x9f\x1f\x28\x60\xba\xf3\xff\x9b\x13\x78\x21\x26\xf0\x82\x4f\xe0\xc5\xdf\x23\x8a\xde\xfe\x03\x09\xc0\xee\x7e\x2e\x00\x28\x58\xe7\x5d\x84\x34\x6d\x6f\x7f\x83\x68\x60\xaf\x74\x17\x56\x48\x06\x2e\xfe\x89\x64\xe0\x53\x81\x0c\x83\x01\xe9\x0b\xf7\x70\xdf\x7a\xba\xdf\xa7\x68\xf9\x09\xaa\x4c\xef\x37\x88\x41\x6d\xc7\xba\x11\xc6\xbc\xc1\xa0\xa4\xc7\xc1\x99\x9d\xa0\x4f\xb9\xfa\xb4\xaf\x69\xbe\xfd\xc9\x75\x20\x66\x50\x40\x02\xa3\xd7\xd7\x29\xc2\x5c\x6d\xd4\x2d\x82\x2e\x7a\xf8\x53\x40\xcd\x00\x1f\x06\xa6\x6f\x1c\x06\x4b\xee\x93\xa9\x4f\x15\xdf\x72\x9d\x58\x0d\x7f\xa3\x46\x1b\x3e\x71\x4a\x52\x9c\x90\x4b\xb9\x46\x3d\x7d\x35\x8e\xbe\x94\xbe\x7d\x0a\xe8\xb6\xc7\xfe\x5a\x8c\x9e\xe4\x51\x96\x8c\xc3\x60\xdb\x33\x0e\x73\x17\x4d\xdb\xfe\x12\x71\x27\x4d\x7e\x9f\x92\x97\xe8\x91\x9a\x07\x09\x9e\xce\xa8\x79\x98\xe0\xe1\x23\x35\x8f\x13\xfc\xf8\x48\xcd\x76\x82\x9f\x1f\xa9\xf9\x3e\xc1\x27\x8f\xd4\xfc\x90\xe0\xf9\x8c\x9a\x27\x09\xee\x3c\x52\xf3\x34\xc1\xb7\x8f\xd4\xfc\x98\xe0\x4f\x33\x6a\x9e\x25\xf8\xeb\x23\x35\xcf\x13\xfc\xed\x91\x9a\x17\x09\x3e\x7e\xa2\xe6\x55\x82\x2f\x67\xd4\xbc\x4c\xf0\xe5\x13\x35\x3b\x09\x9e\x3e\x51\xf3\x73\x82\x4f\x9e\xa8\x79\x9d\xe0\xeb\x19\x35\x6f\x13\x1c\x3e\x53\xf3\x28\xc1\xdd\x67\x6a\xde\x25\x78\xf8\x2f\xf3\x3e\xc1\xd3\x67\x6a\x7e\x49\x70\xfa\x4c\xcd\xaf\x09\xfe\x36\xa3\xe6\xb7\x64\x89\x03\xd6\xd9\x83\xd1\x68\x9c\xd1\x2c\xf0\x3b\xf1\x30\x38\x8f\x47\x81\xf9\x22\x36\x22\x3b\xee\x82\xf9\xff\xcf\xda\x9b\x77\xb7\x6d\x3b\x8d\xc2\xff\xfb\x53\x28\x68\x9e\x44\x7c\x3c\x56\xec\xb4\xbf\xfe\x1a\xa9\x6c\x8e\x2c\x79\x8b\x77\x4b\xf2\x5a\xdf\x1c\x90\x84\x28\x5a\x14\x49\x93\xd4\x1a\xfb\xbb\xbf\x67\x06\x00\x17\x49\x4e\x7b\xef\x79\xd3\x1e\x0b\xb3\x00\xc4\x3a\x18\x0c\x80\x01\x56\xf3\xaf\xaf\xd0\x8c\x05\x6f\x0d\x78\x9c\x96\xc8\xee\xa4\xfa\xe3\xaa\xcf\xc9\x36\x86\x8c\x9f\x5f\x61\x97\xc7\xab\x7c\xfd\x89\xa6\x8e\x2d\xcb\x17\xab\x0c\x03\xcd\xd0\x22\x1f\x09\x49\xea\xd9\xc3\x55\x2e\x3f\xe3\x22\xb1\xf0\x93\xef\xb4\xc2\x91\x15\xae\xd2\x47\x9a\x7e\xc0\xc7\x6e\xb9\xa4\x21\x91\x76\x5e\xe1\x40\xac\x89\x18\xe9\x7a\x38\xf4\x92\x34\x74\x63\x3e\x2a\x91\xe3\x09\x6c\x48\x3a\xd6\xe0\xba\x7c\xad\xd4\xd3\xd1\x88\xbb\xe2\x8a\x3b\xeb\xaa\x6b\xaa\xf3\x42\x4c\x9d\x88\xc7\xc3\x95\x96\x59\x68\x9e\x53\x1e\x95\x08\x89\x2e\xe3\x69\x88\xbd\x79\x35\xf5\x54\x97\xe5\x3c\x76\x57\xa9\x63\x1d\xfd\xc2\x5b\x53\x90\x89\xa6\x76\x6c\x9e\xa6\x62\x4d\xde\xe7\x9a\x83\x65\x5d\x66\x2b\x49\xb9\x3d\x14\x0e\x5b\xe9\x3b\x5d\xa7\x58\x25\x9d\x54\x44\x91\x70\xde\xea\x6a\x8a\x8b\xec\x2f\x25\x52\x8b\x48\xdb\xaf\x80\x5d\xd8\x5f\xae\xa8\xbd\x2c\x62\x2c\xc4\x72\x65\x9d\x6a\xe2\x4d\x18\x3b\xc8\xb0\xa6\xd5\x3f\xbf\xbe\x36\x1c\xef\x8d\xd7\x45\x29\xa3\x1d\xe1\xeb\xe7\x95\xcf\x26\x20\x9f\x88\x30\x1a\x52\x26\xda\xdc\xb7\xc7\x3e\x4f\x65\x65\x76\xe7\x91\x48\x4c\x2d\x2d\x49\xee\xbb\x38\x0a\x75\xe2\x36\x32\x25\xb5\x5d\x1e\xb3\xba\x93\xc0\xea\xe0\xb4\x33\x64\xd6\xb6\x8c\x67\x08\x8a\xce\x0a\x83\xf5\x29\xc9\x07\x24\x86\x0b\xc3\xef\x29\x59\x1d\x6c\x88\x2b\x0c\x2d\x02\xb3\x81\xf4\x94\xa8\x61\x93\x24\xf9\x20\x49\x29\x8c\xd5\xca\x5c\x11\x8e\x78\xc4\x0a\x43\xe4\x29\x91\x3d\x38\xcf\x0f\xf3\x10\xe6\xb1\xe0\x2a\xab\x44\xcf\xb2\x28\xc9\x16\x8f\x8b\xd4\x95\x5c\x4a\xae\x12\xcb\x1b\xf8\x7c\x34\x4a\x1a\x76\x8e\x22\x3d\xeb\xe3\x92\x1c\x79\x25\x6a\x3e\xf0\xa6\x09\x1c\x05\xa9\x08\x12\x2f\x9d\x53\x59\x3d\x0d\x51\x89\xf3\xcf\x3c\x25\x34\x1e\xdb\x49\x69\xf4\xed\x27\xf9\x58\xfb\x96\xc0\x46\xf6\xd9\xa7\x04\xae\x78\xe0\x0a\xd9\x81\xc2\x18\x11\xa5\x91\x85\x30\xe6\xc2\x2f\x7e\x61\x65\x9c\x3c\x25\x6a\x54\x74\x92\x7c\x0c\xdc\x24\x59\x8f\xbf\xc3\x38\xb1\x17\xb8\xfb\x9e\x9f\x8a\xb8\xee\x25\xd0\xe6\xa9\xa0\x4f\xe7\xa8\x33\x72\x65\xbf\x84\x6c\xf1\x54\xb8\x61\x3c\x2f\x60\xf0\x93\x6f\x47\xed\x88\x54\x33\x52\x4f\xca\x8a\x46\x1f\x4d\x06\x56\xc8\x63\xa7\xee\x15\xdf\x03\x39\x9f\x94\x1e\xf9\xae\x8d\x13\xb1\x4f\x83\x70\x3f\x0e\x47\x6d\x9e\xf2\x46\x24\x3d\x5f\xbf\xb3\x5f\x5e\xde\x35\xbd\x2a\x47\x35\x01\xd5\x37\xcb\xec\xac\x9f\xe9\x89\xcb\x78\x35\xa0\xed\xa0\x5e\x00\x3b\xa6\x69\xe9\x27\x11\x07\xa8\x2a\xd0\x43\x89\x29\x99\xc9\x8d\xa2\x0b\xbc\x81\x54\x08\x28\xfa\xcb\x4b\x35\x7f\x2b\xcb\xf9\xe4\xc2\xad\x90\x8f\x9e\x12\xe6\x97\x1f\x3b\xdb\xf0\xfa\x09\x0e\xbd\xea\x54\xc0\xce\xb6\x61\xac\x75\x06\xe2\xc9\x04\xa5\x2e\xf4\x44\x00\x14\x5c\x43\x36\xc8\xfb\xe3\xc3\x36\xec\x80\xd4\x6e\xba\x80\x12\x23\xf7\x22\x68\x83\xd0\xd6\xaf\x0b\xac\xa7\xdc\x2f\xa4\xba\x57\xf9\xd5\xaa\xcd\x8f\xff\xb7\x5f\x9b\x6d\x5a\xb5\xd6\xb3\xf2\xd8\xfb\xfa\x68\xac\xd9\x82\x7d\x2a\xe4\xa5\x61\x69\xab\x6f\x66\x69\xc1\x4c\x1d\x0f\x4b\x47\xca\xd4\x7a\x92\xbe\x5c\xbc\x7b\x5d\xb5\x6b\xb3\x4d\x53\xd4\x66\x60\xd7\xe6\x18\x98\x1b\xaf\x96\x4a\x00\x69\x9f\x2c\x24\x7c\xb2\x0c\xf5\xae\xb8\x63\xd2\xcd\x28\xb5\xdf\x52\x38\xdb\xaf\xcb\x54\xf4\x79\xa1\x92\xe9\xd7\x66\x5b\x56\x6d\x06\xfd\xda\x7c\xcb\xaa\xcd\x0d\xb0\x37\xcd\x7e\x6d\xf6\xbf\xfd\xda\x1c\x1c\x1d\x9c\x19\xaf\xdc\xfc\xf1\xda\xe0\xb5\xf9\xb1\x69\x7f\x72\x5e\x5e\x76\x1a\x1c\xeb\xc1\xb4\x6a\xf3\x2d\xc4\xfe\xaf\x55\x9b\xe5\x0d\x93\xd5\xc5\x45\xb9\xd3\x49\x37\x8c\x74\xe4\x52\x85\x77\x4a\x15\x4d\x97\x3d\x64\xc0\x91\xee\x86\x74\x61\xc9\x8d\x6a\x7e\x06\xbd\xd8\xdc\xbc\x66\xd9\xea\x7c\xc3\x35\xaf\x4a\x5b\xc4\xd0\x51\x6f\x3e\x39\x8d\xb4\x4e\x2f\x98\xac\xe9\xf0\x10\x29\xff\xa6\x8e\xe1\x64\xe7\xfe\x1c\xf3\x81\xa7\xd0\x4d\xc0\xf1\x38\x08\x8f\x43\x90\x3c\x36\xde\xbe\xe1\x2c\x3c\x7a\xbb\x7d\xd3\x8b\x81\x97\xf6\x81\x2a\xe9\xab\x63\xbe\xdb\x96\xef\x8b\xca\x33\x68\x7b\xb1\xf1\xeb\x5f\xb6\xbc\x65\x5c\xb5\x4c\xbb\xf6\x7e\x5c\xdd\x91\xb7\xc7\x06\xcd\x99\x27\x9f\x4f\x39\x9f\x54\x1d\x78\xb0\x1e\x0d\x50\x58\xd3\x01\x5b\xf2\x7e\x96\x37\xce\x26\xcd\x99\x7a\x6a\xc5\xa1\x63\xe2\x85\x68\xf6\xa3\x41\xeb\x73\xd3\x01\xc5\x67\x5a\x86\x2e\x57\x16\xf3\xe1\xc7\x2b\xfc\x78\x2d\x96\xaa\x98\x81\x3e\xbd\xe9\x4b\x41\xd7\x74\x1e\x76\x64\x70\x68\x3e\x3c\x82\x8f\x7f\x02\x93\x4e\x2d\x51\x29\xb6\x21\x32\xb7\x1b\xd1\x9f\x41\x23\x92\xd5\x61\xd7\xda\xd5\x48\x3e\x73\x82\x29\x27\x32\xe3\x91\x01\xe3\xc6\xd8\x8c\x50\xb9\x1f\x7f\x95\xe7\xbc\xea\xd5\xf1\xd6\x16\x8c\xcd\x6a\x95\xd7\x12\x11\x2b\xff\xce\xc6\xc3\xf8\x51\x5e\x3d\x93\xfb\x00\x98\xab\xa3\xc0\x11\xb3\x97\x97\x8d\x6d\xa3\xa1\x4e\xd3\x8d\xd5\x69\xba\xed\x3a\x39\xc6\x4d\x8c\xe2\x79\xb9\x9d\xba\x2f\x91\xaf\xaf\x96\x69\xb6\xe3\xaf\xe7\x93\xaa\x80\xa1\x51\xaf\x9e\x4f\xaa\x7d\x18\x1a\x58\x57\x2e\xf8\x86\xd1\xd8\xfe\x33\xc0\xa2\xe8\x43\x09\x74\x98\x4f\xc6\xe9\xd7\x05\xa8\xcc\x6f\x53\x04\x0b\x1e\x92\x47\xc3\x68\x60\xdd\x98\xfd\x06\x3d\x28\xeb\x36\x74\x25\x3b\x0d\xdd\x58\xa2\xf0\x36\x94\x2f\x7b\xa9\xd7\xaf\xf2\x87\xd6\xf3\x63\x95\x27\xf9\xe6\x9c\xea\xaa\xd4\x75\x4d\xb3\x17\x7f\xf8\xf0\xd9\x94\x1b\x74\x94\x0b\x8f\x16\x5a\xc0\x6b\xfb\x03\xf9\x7b\x5c\xbd\x1b\xe0\x2a\x94\x82\xf7\x03\x8e\x83\x08\x83\xef\x07\x1c\xde\xed\x18\xf4\x5a\x67\x95\x27\xd2\x05\x46\x21\x0f\xa3\xf2\x48\x21\x7f\x6e\x38\x52\x16\xc3\x86\xdc\x30\xb4\x0d\xa3\x7c\x43\xde\xd6\xcf\xd9\x58\xe6\x19\x3d\x24\x46\xcf\xd9\x90\x4d\x5f\xb9\x4c\xa7\x1c\x9e\xa9\x47\xc6\x1a\xbc\x66\xb7\xab\xd2\x69\xa1\xca\x6e\xe1\x70\x42\xb0\x3a\x50\xf1\xbb\x55\x77\xc8\x33\x4f\xe1\x86\x69\x3e\x25\x1f\x3e\x58\xef\xcc\x5e\xbc\x9a\x53\xaa\xb9\x71\x52\x38\xee\x5d\xba\x26\xff\xf0\x83\x04\xb9\xfd\xd5\xf2\x78\x3d\x19\x70\x28\x3d\xb0\xa1\xfc\x97\xee\x0d\x5e\x71\xe9\x6b\xa9\x73\x50\x36\xbd\xdf\x6f\xff\x29\x68\x3b\xd7\x51\x6f\xb3\x58\x7a\xba\xb0\x8c\x86\xa5\x9c\x05\x63\xa5\x8e\x55\xa5\x66\xa5\x2b\x1a\x2f\x2f\x4b\xf2\x4d\x3e\x01\x1a\xca\x69\xb4\x6a\x9b\xfb\xf4\xcc\xbe\xf2\xe5\x78\x68\xda\xb5\xcc\x31\xe0\x91\x23\xcb\xae\x5e\xcb\x3c\xd3\x97\x72\x4e\x5d\xd3\x7e\xe0\x9b\xce\x80\x3f\x16\x19\x46\x1e\xa1\xef\xdd\x32\xfa\x6a\x57\x1e\x99\xbc\x57\xde\xc7\x0b\xae\x23\x6f\xcf\x0b\xef\x74\xf5\xfb\xa6\x5d\x73\x78\xca\x3b\x54\x39\xbd\xd8\x2f\xa6\x92\x16\x38\xf7\x07\x55\xc9\x49\x9a\x8e\x91\xb9\x94\x7c\xd8\x7b\x7e\xcc\xdd\x4a\x86\xa6\xfd\xd0\x56\x88\x89\x72\x7a\x1c\x71\x7b\xc8\x5d\xa1\xdc\x14\x4e\xcf\x4d\x1b\x85\xeb\x57\xa7\x9e\x27\x7e\xf2\x64\xda\x35\x7a\x8a\xb3\xf8\xf9\x23\xdf\xb4\x6b\xb1\x7c\xfc\x53\x3f\x36\x59\xa4\x2f\x86\xa6\xfd\xf0\xfe\xb9\x54\xf0\x9b\xfd\x42\x9e\xfd\x3f\xcc\x87\xd1\x90\x43\x30\xe4\x30\x1c\x72\xf0\x87\x5c\xdd\x99\x79\xfe\x62\xda\x35\x2f\x69\xcb\x73\xb2\x25\x97\x95\x2f\x2f\xf4\xce\xc3\x1b\x54\xe3\xf5\xae\x7a\x39\x21\xe7\xaa\x37\xe6\x25\xae\x23\x1a\x1b\x37\xb5\xd8\xe6\xda\x59\xe5\xa4\xa7\x43\xea\xa4\xec\xd1\x92\x73\x37\xe9\xa7\x87\x16\x82\x03\x2f\x79\x18\xdb\xf2\x54\xe0\xc3\x98\x5c\x40\x35\x38\x16\x41\x15\x25\x9f\x36\x8d\xc6\x4d\x6d\x77\xd9\x57\xe8\xc3\x9d\xf5\x58\x35\x1a\x97\x93\x9a\xa8\xed\xe6\xb7\x39\x56\xdc\xc9\x5d\x4d\xb2\x97\x64\x37\xca\x4e\x32\xe5\xcd\x89\x61\x95\xbf\xbc\x9c\x4b\x2b\x9c\xe3\x17\x0e\x0a\xa8\xee\xd9\x20\x1e\xab\xc8\x50\x7a\x36\x2a\x77\x6a\xf9\x8b\x74\xb2\xea\x25\x24\x10\x2a\x61\xbc\xec\xdd\x55\xbe\xd1\x45\x37\xcd\xe2\xf9\x8f\xec\x81\x06\xd9\x99\xec\xea\x52\xc2\x6c\x53\x0d\x82\x4d\x46\x67\x90\xd7\xbb\x8b\x4d\x94\x8f\x23\x8a\x6f\x28\x03\x1a\xf9\xff\x2b\x5c\x0c\xb8\xd5\x87\x58\xb8\x76\xd8\x03\xb6\x99\xa4\xb5\x93\xab\xaa\xad\x9d\xf9\x04\xcf\x99\x33\x9f\xec\xc5\x84\xf3\xfc\x15\x09\xa7\xf4\xe8\x03\x69\x16\xc2\x14\xa4\x8c\xfa\x36\x87\x73\x8c\x84\xd2\x4b\xe8\x0e\x59\x88\xb9\x62\x77\x2d\xad\x62\xa9\x70\xf5\x0a\xdb\x14\x46\xe3\x35\x94\xaa\x47\xd5\x31\x49\xbc\xca\x51\xf4\x43\x0f\xa2\xba\x83\xfa\xa9\x6f\x71\x7b\x58\xb7\x71\x4a\x16\x5e\x35\xb4\xb9\xa1\x5e\x38\x54\x1a\xdc\x84\x73\x7a\x3c\xe4\xab\x53\xff\x91\xb1\xf7\xbd\xd7\xc6\x06\x79\x6b\x27\xd8\xcc\x83\x2f\x2f\x7d\x4f\xae\x85\x41\xbe\xa9\x0d\x43\x4c\x77\x3a\xe0\x46\x63\xf8\xe1\xc3\xf6\x9f\xe6\x74\x54\x1d\xc2\x36\xb4\x07\x1c\x86\x0f\x2d\xfb\xb1\x3a\x1b\x19\x06\x99\x09\xe7\x48\x69\x0f\xb8\x61\x34\xaa\xae\x29\x48\x69\xaa\xf9\x3c\x70\xc7\xdc\x45\x45\x35\x07\x4c\xd7\x68\xc4\x7d\x5e\x7d\xee\x73\xf2\x03\x06\x7d\xba\x1c\x27\x8d\xda\xbe\xf6\x7a\xf8\x5c\xe5\x80\xf3\x94\xf1\x13\x6f\xf0\xe1\x90\x17\xdc\x1f\x5f\xd3\x1b\xb3\x34\x44\xca\xde\xed\x55\x84\x32\x77\x6c\x73\xb5\x01\x4e\xf1\x8a\x0e\x27\xc2\x21\x2f\x2f\x84\xa6\xe7\xe0\xe8\x17\x27\x55\xfd\x5a\x2f\x2f\x55\xc7\x8c\xbd\xaa\x55\xdb\x9b\x19\x5f\x2d\x7a\xf1\x80\x3c\xd3\xd7\x2d\xe9\xa0\xbe\x61\x9b\x3f\x0a\xd2\xbc\xce\x6b\xc9\xe1\xcb\x8b\x4c\x05\x4a\xa2\xb6\xce\x6b\xfd\x7e\x89\x24\x57\x91\x4e\xe6\x1f\x5b\xaa\xab\x19\x4b\x92\xf2\x54\xd4\xf9\xc3\x21\x8a\x8a\x0c\x9b\x75\x0d\x95\x45\xfb\xab\x24\xd4\x6d\x58\x12\x9e\x75\x5e\x3b\xf2\xb3\x78\x24\x6f\xeb\xbc\x16\x87\x85\xc4\x26\x9e\x98\xd6\x51\x09\xc8\x30\xeb\xe5\x60\x9d\xd7\xee\x6c\x72\x5a\x66\x3f\x70\x1c\xa1\x38\x31\xa9\x79\x5c\x47\xd5\x24\x9c\x9c\x4c\xfe\xf0\x54\xcc\x75\x83\xd7\x6e\x6d\x5e\x78\xf9\xcc\x7e\xbd\x41\x4c\xb1\xfd\xe8\x3d\x8c\xde\x5b\x8e\x37\xfb\xf4\xa6\xca\x4f\x1f\x91\xbc\xa9\x59\x6f\xfa\xed\x3c\x75\x5f\x1b\x1b\xcd\x68\x6d\x17\x53\x33\x2b\x75\xa9\xcb\xdf\xde\x48\xe1\xe1\xd2\xa1\x27\xaa\x2e\xdf\xcc\x61\x72\x88\xf4\x38\x7c\x8b\x7e\xf2\x84\xf4\xee\x9b\xf1\x8f\xfc\xd7\xc6\x69\xf4\xd6\xa3\x38\x9d\x89\xde\xfd\x92\x6f\xbc\x15\x5c\x30\x4d\xf2\xe7\x65\xb6\x68\xe5\xfd\xec\x3c\x56\x7b\xc2\xf8\x8a\xaa\x55\x5d\x78\xe4\x92\xb5\x61\x9b\xf4\x9e\xd1\x57\x5b\x4e\xc4\xa5\x55\x2d\xff\xca\xeb\xd8\x22\x43\xe7\xad\xcc\x59\xaf\x8d\x8b\x9f\xd4\x5e\x48\x95\x77\x67\xbf\xd9\x3c\xcf\x5f\xb0\xf0\x67\xde\xaa\x07\xc3\x7e\x5f\x3e\xb7\x7d\xb6\xee\xcd\xbb\x9b\x7d\x49\x4c\x27\x6f\xa6\x7c\xb3\x4f\xaf\xbc\x0c\x56\x23\xa7\xe6\x6d\x9f\xeb\x97\x30\xa6\x93\x55\x86\x53\x57\xa6\x2e\xc2\x55\xda\xc8\x93\xb4\xdb\xde\x2a\x2d\x39\x5c\xfb\xea\xb8\xd6\x6d\x88\xb6\x1b\xac\xd2\x8e\x7c\x49\x3b\x5e\x72\x72\x15\x29\x91\xa5\x1b\xb7\x70\xef\x2b\x3f\xcf\xa4\x96\xc5\x5f\x3d\xaf\x2a\x5b\xdc\x90\x3b\x6a\x16\x5d\xda\xed\x09\x03\x76\x48\x65\x27\xa5\xdc\x56\x6e\x66\xb8\x49\xbc\x36\x3d\xfb\xdf\x13\x86\x91\xbd\xa5\x82\x7d\xc3\xa8\x3b\x1e\x9d\x5a\xe2\xc6\xeb\x3f\xb9\xdb\xa6\xf7\xe2\x2f\xe4\x1b\x3c\xf3\xb5\x5e\x3e\xb9\xce\x88\x74\xa4\x83\x79\xc9\x9e\xc2\x78\x48\x2c\xf5\xd4\xb5\x63\x3e\x0f\x39\x4e\x75\xf2\xe8\x25\x39\xcd\x34\x1c\x4c\x9c\x5c\xe4\xa7\xea\x39\x30\x5a\x66\x38\xa6\x53\x73\x0b\x04\x03\xb0\x3e\x9c\xbc\x38\x58\x59\xd4\xba\x2d\x7b\xb5\xb6\x43\x95\xf7\xc6\x4d\xad\xf9\x6d\x95\x3c\x3d\x97\x8d\x61\xb7\x57\x69\x8b\xa1\xa4\xdd\x2f\xf5\x49\x2e\xfd\x67\xa2\x2c\xd0\x8e\x2e\x6f\xcf\x4d\xe9\x1d\xeb\xe9\xf7\xd5\x74\x9e\xbf\xa8\x74\x3a\x6b\x7a\xef\x8a\x4e\xa8\x5e\x3c\x69\xdc\xd4\x7a\x6f\x0a\x89\xc5\x90\xc6\xca\x5b\x52\xaa\x36\xa5\xf7\xe2\x82\xe7\xb5\x2d\x64\x7d\xf8\x60\x3d\x34\x51\x83\x8e\x12\x70\x4c\xf9\x88\x03\x07\xdb\x68\x7c\x53\x0f\x0c\x44\x09\xfc\xf0\x9c\xba\x93\x3d\xe7\x60\xbf\xca\xe1\x33\xbb\x5a\x9b\x62\x49\x19\x93\x2f\x52\xad\x2a\x3f\xcb\x7a\x5d\x5d\x63\x64\x2c\x55\x8d\x1f\x3e\x54\xb5\xe6\x0a\x7a\x1d\xa3\x48\x06\x14\x97\x32\xda\x9e\x43\x9d\x29\x6f\x0e\x1d\xc2\xea\x34\x4d\xdb\x70\xcc\x02\x59\xfa\xce\x73\x6a\x91\x4d\x2f\x9d\xd1\x5a\x9b\xd7\xdf\xed\x34\x9c\xaf\x76\xc6\x54\xcf\x33\x20\xad\x73\x36\xea\xbe\x7a\x85\xa5\xb6\x7a\xaf\x76\x69\xe1\x1b\x2b\xa7\xcb\x57\xbb\xb5\xfb\xbe\x91\xd1\x6a\xf7\xfd\x6a\x16\xc3\xb4\x1b\xb1\x56\x46\xb4\x73\x55\x5c\x3a\x58\x0d\xc7\x6c\x6a\x67\xb5\x0e\x56\x81\xbc\x78\xdc\x9d\x54\x7f\xd8\x7a\xdb\xa2\x9e\xab\x9d\xb9\xaa\x60\x65\xaa\x82\x23\xa7\x6e\xdd\x27\x8c\x25\xcb\x94\x5a\x0f\x69\xfb\x94\x06\x05\x1d\xde\xb2\xc9\x81\xbb\x23\x57\xd6\x0e\x65\x81\x2a\x58\x2a\x1a\xb2\xbd\xf7\x97\x7a\xfe\x50\x95\x77\x31\x54\x77\x1a\x16\x43\xe9\xda\x54\x67\xc1\x54\xea\x88\x02\xbf\x3e\xf0\xc7\xfa\x83\x02\x40\x3d\x35\x19\x2f\xbf\xae\xe1\xf5\xab\x16\xb9\x14\xcf\x7a\x68\x6d\xf1\xad\x2a\x1f\xf0\xf9\xf6\x99\x34\xee\x24\xad\xb9\x6d\xf9\xe0\xd9\x52\x27\x15\x79\x27\x5d\x79\x73\xc4\x79\x35\xf4\x25\x47\x2f\xa9\xcd\xae\x30\x01\xad\x01\xe6\x97\xbc\xb4\x02\x98\x90\x71\xa2\xa1\x0f\xc0\x35\xee\xab\x0f\x27\x09\x5c\xd0\x97\xae\x92\x82\x3b\x8c\x6c\x4d\x70\x30\xae\x5a\xe0\x94\xb6\xd7\x1d\xd3\x3c\x49\xc8\x73\xb9\x5a\x8d\x63\x2f\x96\x0e\xd9\x9d\x77\x44\x72\xde\x99\x57\xc9\xcb\xcb\x3b\x54\x27\xb1\xae\xc9\xc7\x60\xcb\x96\x00\xb9\x4e\x37\xa8\x90\x1c\x1c\xe9\x4c\xd3\x56\xef\x54\xe1\x32\x71\xd2\x33\xed\xd7\x8d\x1b\x5c\xd2\xbc\x75\x5d\x9f\x2c\x49\x58\xa5\x46\xa1\xd4\x85\x87\xab\x73\xff\xbf\xfd\xbe\x61\xe9\x35\x52\x12\xe7\x6b\x24\x4b\xad\x91\xac\x75\x6b\x24\xd9\x98\x9d\xaa\x05\xef\xb6\x8d\xa5\x77\xff\x5a\xb4\x29\x26\x9f\x7c\xa0\x2e\x5c\xaf\x04\xa1\x3c\x6d\x92\x3d\x53\x48\x0b\xc2\xc6\x4d\x6d\xd1\x59\x2b\x4a\x22\xaf\x6a\x19\x5f\xad\xfa\xbb\x1d\x75\x0f\x3f\x55\xfe\x60\x51\x69\x3e\x37\xb4\xdf\xe7\x23\xbf\x21\x3e\x7c\xb0\x3f\x7c\x70\x6a\xbb\xf4\x6c\x53\x55\x9d\xe4\x40\xbd\xd6\x40\xf4\xd1\x90\xde\x52\xa4\xe7\x11\x4a\xfe\x07\xaf\x26\xd2\x95\x30\x89\x8b\xd8\xab\x52\x48\x0e\x5f\x1d\xac\xca\x67\xe9\x49\x64\x34\xa8\xfd\xa4\x1d\x2d\xbf\xc5\x26\xed\x58\x43\xaf\x8a\x4d\x82\x6b\xa2\x7b\x0a\x95\xa6\xce\xe3\xb1\xdc\x0d\xe1\xda\x3c\xa0\x8e\x2b\x3c\x0f\xb9\x29\x0f\x1a\xff\x70\x45\x5a\x27\x7b\x02\xea\xc9\x90\x68\xa8\x26\xc2\x57\x69\xaa\xca\x39\x6a\x96\x5d\x60\x98\x4e\x5e\xa1\xb8\xde\x28\xf0\x5d\xf6\x0a\x7c\xb7\xbd\xd7\x4c\x58\x14\x78\x86\x4e\xce\xf3\xb0\x78\x7e\x7c\x55\xab\x8c\x42\x86\x0e\x4b\x19\x6a\xd9\xaf\x4b\xcb\x98\x42\x6a\x9d\xe2\x17\xcf\xbc\xd7\x82\xa8\x2a\x70\x5d\xf3\x02\xd7\xfe\xe0\x75\x65\x9d\x52\xe0\xed\x16\x53\xdc\x0d\x5e\xd5\xb2\xa5\xc0\x11\x87\x05\x8e\xa3\xe1\xab\x14\x84\x05\x86\x5e\x31\x09\xbb\x5d\xb4\xd2\x75\xa9\x07\x5c\xe6\xd7\x3a\xfb\xea\x66\x67\x77\x02\x97\x13\xa3\x71\x63\x76\x27\xd2\x6d\xaa\x2b\x4c\x55\xa9\xbf\xe1\xba\xe2\x5c\x41\xf7\x13\x8e\xd3\xaf\x63\xea\xc6\x40\xed\xd1\x32\x75\x3b\x35\x6e\x6a\xce\xbd\xa9\x5b\x12\xe5\xa8\xad\x40\x6c\xe6\xc2\x9b\x08\xcb\xf9\x18\x0d\xb8\xcc\x48\x4f\x67\xa4\xa7\x33\xd2\x2d\x66\xe4\x64\xc2\x8b\x9f\x4e\x32\x90\xbe\x7d\x9c\x81\x22\xc4\xa5\x88\x06\xcb\x1f\xbf\xce\x8f\x16\x0d\x44\xe6\x04\x48\x98\x3f\x5e\x5f\xef\xaa\xd7\xd2\xd8\x85\xbd\x35\x1d\xd2\xbb\xdd\x37\xe6\xb5\xca\xca\x68\xcd\xf9\x77\xa5\x7b\xdc\x4c\x0a\x87\xb9\xca\x5b\x34\xb7\x13\xcd\x0d\xc2\xf8\x71\x93\x43\xef\x76\x40\x14\x46\x56\x81\x22\xa0\x5f\x38\x33\x86\x9a\xd6\x90\x3f\x6c\x3f\x9a\xf6\xc3\xd0\xc6\x19\x0a\x6c\x33\x1d\x16\xce\x67\x4a\x0f\x8d\x64\xaf\x76\xf5\x5e\xd7\xd0\x3c\x49\xc9\x68\xed\x3e\x82\xf3\xf2\xc2\x1f\x82\xe7\x47\x10\x2f\x2f\xef\x76\xa0\x8f\x72\x77\x20\x5e\x5e\xd4\x85\xdd\xa1\xf2\x0c\xcf\x6b\x81\x78\x18\xd6\x86\x62\xfe\x68\x66\x67\xc5\xf9\xeb\x4d\xad\xd9\x7a\xbb\xe4\xe3\x21\x5f\x2e\x7a\x6e\x62\x18\x0f\x79\xb9\x50\x2b\xa6\xf6\xa5\xac\x67\x11\x28\xdb\x14\x47\x9a\xb5\x2c\xf3\x3c\x95\x17\x0c\xb2\xb2\xac\x94\xc3\xca\xdd\x9f\x50\x51\x2c\x59\x14\xab\x58\x94\xc9\xea\x25\x06\x6c\x96\xec\xa9\x7c\x9d\x2f\x75\x29\x58\x7b\xd6\xa4\x3e\x32\x91\x07\x35\xfb\x8f\x2a\x96\x9c\x03\x6c\xfd\x5e\x80\xcc\x95\xa9\x5d\xb4\x0d\x54\x00\x6c\xf3\x34\xad\xda\x38\xa9\xbf\x7b\xe7\x80\x65\xee\xa5\x74\x98\xad\x76\x7d\x5c\xd5\xdf\xaf\xf3\xaf\x55\x6e\x9e\x21\x61\x99\x22\x37\xff\x70\x3a\xb5\x3e\x7c\xa8\x5e\x92\x33\x70\xb5\x84\x51\x1d\x57\x95\xb3\xe4\x34\x8e\xde\x3a\x2e\x19\x03\xf4\xa1\xb8\x40\xc0\x65\x6a\x14\x3b\xfd\xb2\xad\xf5\xba\x6c\x60\x55\x86\x77\x9b\x3c\xb6\x1f\xae\xbc\x14\xa3\x26\xc0\xbd\x89\x08\xd2\x43\xf9\xe2\x4c\x4d\xbe\x3c\x43\x28\x32\x60\x7a\xa3\xc8\x17\x23\x11\xa4\xc2\xc1\x39\xb0\xb0\x76\xbf\xcb\xc7\x62\xe6\x8f\xeb\x80\x66\xbf\xeb\x49\xe6\xad\xe7\x4e\x1b\xa0\xef\xd4\x40\x7c\xcb\x34\x7c\xf7\x4f\xa6\x61\x99\x3e\x15\x06\xe7\x39\x09\x1a\x8d\x81\xaf\xea\x46\x9a\xd5\xde\x7e\x40\x2c\xc0\xca\xe2\x8e\x43\x45\x3b\xf1\x92\x54\x04\x22\x5e\xdb\xa1\xc4\x57\x25\x12\x6a\x07\x90\xa3\xeb\x3a\x03\xd5\x7c\xb4\x2c\xbf\xe3\xf4\x6a\xbc\x61\x69\xa0\x65\x68\x56\x73\xf7\xc5\x9a\x2b\xbc\x98\xb6\x67\xaf\xbe\x98\x16\xe8\xe7\x7e\x6c\x94\x68\xaf\x77\xd5\x7b\x5d\xa3\xf7\xff\x50\xa3\xf7\xff\x54\xa3\x13\x35\xfc\x95\x41\x32\xdb\x17\xb0\x9b\x3a\x64\xe9\xc0\xad\xad\x43\xe1\x91\x0e\xbd\xbf\xcb\x70\x3a\x70\x38\xd6\xa1\xb7\x8d\x5d\x73\x5a\x55\xfe\xd4\x5a\x73\x53\x0b\x9e\x56\xc9\xb2\xbb\xef\xf9\xe6\x5a\x1b\x93\x15\x56\x2d\xb8\x4f\xe0\x87\x7c\x20\x2a\x5a\x67\x5e\xa5\xf5\xe5\x8d\xb3\xc6\x56\x83\xb5\x2b\x57\xd4\x57\x6f\xe5\x6b\x66\x13\x83\xfb\x5c\xb6\xfb\x6d\xfc\xd4\xb4\xf4\x75\x3f\xac\xea\x37\x41\x43\x43\xbd\xdc\xb8\xfc\xfe\x57\xf1\xfd\x93\x39\xd7\x43\xc9\x6e\xaa\xad\x38\x82\xde\xdf\xa9\x27\xd1\x0a\x6f\xf4\xd1\xef\x7e\x13\x74\x1b\xe2\xd2\xa7\xb9\xf4\x1c\x83\x4a\x34\x33\x2b\xa8\xc4\x28\x29\x94\xbb\xfa\x99\xf1\xb0\xb0\x9f\xd1\x0a\x83\x34\x0e\xfd\x0a\x69\x57\xf9\x13\x54\x41\x25\xb4\x9e\x84\x9d\x66\x27\xac\x0f\xc7\xea\xbd\xdc\xb1\x12\x9b\xa1\xde\x6a\xd3\xd7\x1f\x54\x41\x54\x4f\x7e\xaa\x1a\xf8\x5d\xfd\x78\xb9\xfb\xac\x73\xa7\x5e\xe2\x02\x95\x93\x46\xd6\x31\xd5\xcb\x61\xdd\xec\xf4\xfc\x93\xa7\x98\xa3\x24\x5f\x7e\xdb\x66\x95\xe3\x6a\x1e\x05\x30\x7e\x59\xbf\x15\x24\xab\x3b\xf7\xdb\x7a\xbb\x66\x7d\xdf\xf3\xe8\xa1\x32\x1e\xd8\x22\x2b\x57\x78\x84\x6b\x24\x15\x05\xde\x67\x6f\x50\x1d\x0f\x79\xe9\x29\x8c\x5b\x3b\x7f\x4d\x2c\x94\xd9\xda\xf3\x97\xca\xa4\x79\x55\xcd\xdf\xda\x72\xa1\x9a\xad\x07\x4f\xb2\xdd\xee\xc2\xd4\x3b\x91\x8a\x3a\xaf\x85\x47\x1f\x3e\x54\x51\x23\xaf\x85\x47\x06\xa0\x76\x4f\x01\xae\x47\xa1\xd4\xf8\xb1\x60\x64\xa4\x96\x83\x6f\xe0\x57\x39\x8a\xc3\x1b\xcc\xf0\x3a\xd3\xd2\xfa\x9c\x5c\xe9\x87\x96\x93\xb4\xd8\x87\x96\xfb\x5b\x4f\xbd\x16\x28\x6d\x3d\x09\x5f\x16\x3e\xb5\xc3\xb1\x36\x2f\xbd\xbf\xd3\xfd\x43\x77\xd5\xf2\x1a\xf6\x7d\xe6\x63\x2d\x1e\x94\x1e\xf2\x79\x4a\x4b\xe0\x42\xbf\x25\x94\x2b\x5c\xd3\xdc\xb6\x38\xcb\x82\xf4\x90\x6f\x3c\xa0\x0b\x92\x7c\x4a\xaf\x57\x60\x5d\xe5\x18\xdb\x00\xdb\x80\xb9\xba\xc2\xc9\x6b\x4f\xa9\x84\x6c\xb0\x80\xd7\x16\x13\xc3\x78\xbd\x31\xdf\x93\x58\x5d\x3b\xfb\xc4\x03\x25\x5a\x55\x2e\x8b\xd0\x62\x22\xa1\x57\xe3\xad\x57\xb5\x74\x12\x8e\x23\xd9\x6e\x6a\xe3\xcf\xa5\xda\x8b\xe7\x9a\x75\xa1\x07\x00\xbc\xdb\x56\xbb\x4e\xbc\x70\x95\xe2\xe7\xcf\x7c\xc5\x03\x7a\x03\x84\xda\xe7\x4d\x29\x1c\x0f\xe8\x95\x95\xd7\x37\x1f\xea\xd2\x5c\x56\x1f\x6b\x8e\xd3\xae\x55\xde\x43\xf3\x4a\xff\x61\x99\x54\xd7\xb9\xe3\xb8\xa7\x14\x23\x59\xe4\x1d\xe4\x29\x55\x8f\xa0\x3c\x5c\xd9\x8f\xb2\x09\x0a\x6a\xb3\x35\xcd\x4c\x29\xef\x38\x71\x58\xe5\xb7\x84\xf5\xee\xd6\x42\x3e\xe9\x41\x1f\xca\xb7\x61\xbe\xde\x38\x7c\xfd\xcb\x2a\x3a\xf3\x14\xc9\x78\x05\xae\x24\xef\x4d\xed\xb6\xff\xd6\x55\x06\x99\x43\x03\x95\x39\xd5\xbc\xfa\x9b\xdc\x30\x0c\xfa\x16\xff\x37\xdf\xa2\x76\xcb\x55\xbf\x42\x7f\xb7\xa7\xfa\x24\x4d\xd6\x0d\x54\x69\x1f\x1e\x1b\xd9\x0d\x88\xe7\x61\x15\xeb\xad\x38\x3d\xe8\xa7\x32\x17\xf4\x9a\x8f\xa3\x1f\xb0\x2e\x7e\xd9\x31\xa8\x98\xda\x29\xc0\x5a\xff\x9d\x72\xb5\x5c\x69\x37\x0f\x2a\x03\x2e\xb7\xa7\xe3\x30\x4c\xe9\xaa\x7a\x35\x31\x6a\x2c\xbf\x3b\x5c\x38\xfd\xb2\x18\x2e\xf9\xb6\x6f\x22\x02\x47\x0b\xa8\x1b\x97\x5d\xaf\x4a\x45\x5b\x7b\x8d\x62\xaa\x1a\xa0\xb1\x2d\x8f\x9c\x15\x5f\xda\x90\xf7\xd6\x1b\x7d\x49\x29\x78\xc1\x77\x1e\xfa\x8f\xd2\x82\xc4\x75\x01\x5d\xe5\x60\x6b\x68\x66\xbd\xca\xa5\x2d\xdf\xe7\x61\x75\x58\xfa\xb2\xa5\x9a\x82\x9e\x6f\x71\xe9\x1c\x8c\x84\xa9\xc6\x3f\x7c\xa8\x5a\x44\xe1\x06\x08\xfd\xc2\x91\xf1\xea\x98\xe2\xd5\xeb\x57\x71\x31\xf3\xce\xe4\x7a\x0c\xe5\x75\x68\xcf\x6d\x5f\x54\x1c\x91\x92\x67\x2d\xd4\x84\x97\x0f\x4b\x14\xbb\x12\x7d\x89\xe6\xa2\xf7\x93\xfa\x7b\xb9\xe6\xed\xe6\x7b\x04\xf6\x54\x8e\x6e\x29\x05\xa6\xdd\x35\x46\x31\x19\x57\x35\x67\xf6\x42\x2f\x36\xab\x6e\xa2\xc6\xd2\xf3\x22\x05\x1e\x3a\x12\xb4\x9b\x2d\xee\x32\x8a\xfd\x08\x56\xa1\x8d\x0b\xe3\x79\x77\xb8\xf4\x9c\x0e\xaf\xdd\xe2\x18\x6e\x38\x54\xc1\x4e\xa9\x82\xa7\x5a\x64\x1a\x8d\xfc\x23\xe4\x57\x95\x17\x06\x37\xb5\xbc\x36\xf1\xa9\x97\x2f\xb3\x6f\x9b\xe6\xd3\xe0\xc3\x07\xfe\xf2\x62\x99\xe6\xa9\xfb\xd5\x1b\x6c\xa6\x5e\x95\x1b\x75\xeb\x61\x60\x3f\x56\xb7\x61\xc7\xd8\x2c\x1c\xc0\x9c\x2f\xe7\xce\x2e\x0c\xcd\x86\x43\xfb\xdc\xf2\xf1\x39\xb0\xb5\xac\xe7\x06\x38\x48\xa4\x07\x94\xa4\xe0\xc8\x13\x6c\xfd\x3c\x41\xd9\x3f\xa4\xb0\x71\x74\xb7\xb1\x35\x96\x17\x53\x6a\x6b\x3b\xac\x12\xce\x5a\xfc\xc9\xd8\xe4\x89\x48\x8e\xda\xe5\x2c\x34\x8b\x87\xca\xd4\x6c\x87\x43\x7f\x69\xdc\x5b\x54\x1e\x07\xf8\xc3\x2e\x99\x0f\x5e\x8b\xed\x97\x25\xe6\x4c\xb3\xe9\x7d\x3e\xd0\x7d\x47\x2a\x41\xdd\xc2\x21\xa3\xde\x71\xf6\x3c\xdb\xd2\x52\x43\xaf\x40\x9a\x81\x76\x76\xea\x4c\xd5\x32\xc3\x99\xfe\x7c\x99\xe1\x4c\xff\x61\x99\xa1\x5e\x45\xeb\x1d\xaf\xb3\x33\xae\x64\x4c\xe5\x40\xbd\xc3\x35\xc8\x26\xd5\xa5\x8d\xa1\xec\x2d\x6c\xda\x06\xc2\xe5\xed\xd1\xea\xf6\xb3\xd7\xaf\xee\x51\x35\x1b\x5e\xbf\xba\x4f\xa7\x11\xb3\xd7\xc2\x3c\x75\xdd\x30\xf5\xaa\x96\x21\x2f\x9a\xca\x33\x1d\xa7\xae\x3e\x8e\x63\x67\x99\x9a\x0f\xd4\xec\xf0\xf2\x22\xa5\x92\x51\xc2\x5b\x1a\x6f\x19\x8d\xa9\xde\x0f\x9d\x0f\x68\x43\x54\x1f\xe0\x95\xa8\xda\xf8\x73\xd5\xf8\xea\x98\x99\xdf\xd1\xe0\xb9\x6a\x0d\xc8\x5d\xd6\x3b\xe9\x3a\xca\x21\x33\xc6\xd2\x29\x46\x55\x49\xf8\x89\x83\x71\xd5\x7e\x70\x1e\x51\x5d\x53\x6a\x69\x57\x1b\xc1\xe9\x90\xa3\x36\x76\x97\xb9\x4f\x32\xee\xce\xbf\xe0\x8e\x32\xee\xab\x25\x6e\x6d\x36\xd1\x25\x9c\x91\x28\xc0\x72\x7e\xf8\x50\xcd\x46\x15\x29\x56\x2d\x52\xb3\x38\xd8\x34\x55\xb4\x25\x23\x8e\x23\x9c\xfc\xf2\xa1\xa4\x28\xd6\x12\xc5\x32\x0c\xe3\xb5\xb0\x0d\x82\xf5\xb4\x99\xea\xa6\xc9\x70\x7c\x73\x63\xe2\x52\x3f\x5a\x39\x2d\x86\xf3\xac\xf6\x92\x3c\xd7\xd3\xed\x0f\x3d\x28\xe4\xee\x7a\xde\xe5\xc4\xb4\x22\x94\x54\x6e\x70\x53\x09\xe8\xda\x7c\x50\xbc\x48\xbd\xdd\xb0\xe4\x7b\x2d\xd6\xe6\xa6\xc1\x1f\xac\xc7\xda\xfe\x40\xb5\x62\x37\x4b\xea\x61\x4e\x96\xfb\xe2\x72\x7f\xbf\xe4\x1f\xab\xf0\x2e\x16\x2e\x1f\xf4\xcb\x58\x89\x48\xb3\x27\xbe\x0b\x62\x62\xaf\x14\x57\xa6\xa4\x62\xb8\x22\x55\x2b\x35\xd4\xf5\xbb\xf1\x1a\x5d\xbf\x19\x98\xea\x57\x5e\x49\xcf\x8a\x78\xa0\x7b\x69\x93\x1e\x5e\xc5\xa5\x63\x27\x5e\xb3\x39\x23\x1d\x8f\xaa\x41\x84\xaa\x5e\xcd\xed\xaa\x43\xe9\xb6\x74\x08\x47\x0f\xc6\x51\x6d\xd3\x49\x23\x1e\x45\xfe\xfc\x3c\x12\x31\x4f\xc3\xd8\x30\xd2\xfa\x0f\x4b\x77\x96\x86\x6d\x5a\xb5\x69\xb7\x78\x39\x1d\x05\x2f\xaa\xa1\xb0\x74\x26\x5d\xbf\x8a\xf9\x20\xe8\x42\x78\xff\x9d\xc9\x3f\x7c\xb0\xa6\xa8\xec\x19\x34\x43\x5b\x53\x7a\x3e\x89\xb6\xe9\xad\xe2\x71\xf5\x57\xcb\x7c\xb7\xad\x7d\xfc\xd3\x66\x55\xc7\x7e\x24\x5f\xe4\x48\xb1\x5f\xd5\xcb\xd8\xd4\x75\xc6\x2e\xd7\x0f\xed\xbd\x55\x51\x50\xae\x28\xf9\x94\xd4\xfa\x9a\x56\xfb\xa8\xcd\x40\x9b\xd0\xe2\x38\x8c\xcb\x9b\x38\x87\x7a\xb2\xb0\xbe\xd2\x56\x99\x5e\xfc\xd5\x39\x66\xe8\x3d\xf6\x6e\x9e\x89\xe0\x7c\x72\x3e\xd2\xd1\xa4\x47\x2b\xab\xa8\x05\x3c\x6c\x3f\x16\x14\x01\xba\x25\xee\x98\x4f\x4f\x74\x29\x41\xf9\x81\x4e\x86\xd5\x6f\x94\x82\xf3\xb0\xfd\x68\x18\xd0\x37\x77\x94\xca\xa5\x2e\xcf\x9e\x2d\x32\x86\x3e\x32\xbc\x13\x6a\xb4\x90\x4a\xd6\xc8\xcd\xaa\x0f\x8f\xa0\x6c\xbe\x74\x37\xc3\xdd\xdc\x34\x04\x09\xc0\xe3\xa1\xf4\x22\xe5\xe2\x94\xd7\x47\x51\xe2\x1a\x8d\xec\xeb\x27\x85\xaf\x2b\x2f\x42\x3b\x0d\x77\x29\x07\x9a\xc9\x2d\xe7\x00\xbf\x21\x5d\xf7\xe4\xcf\x19\xd1\xb9\xfd\xc2\xd7\x4f\x8b\x5f\x77\xd4\xd7\xb3\x8b\x33\xb6\xd1\xb0\x6b\x37\x41\xb5\xaf\x2e\xd0\x38\xeb\xae\xbb\x7c\xd3\x55\xbc\xe4\x4c\x84\xae\xb7\x50\x61\x0b\x57\x5c\x8e\x95\x9c\x2b\xde\x72\xd1\xdb\x9d\x59\xd2\x79\xf3\x1d\xe7\xca\x86\x7c\x1f\x86\xbc\x1c\x05\xdd\x86\x81\x03\x62\x3c\xc2\x65\xa9\x65\xca\x2d\xde\x35\x59\x3b\xf9\x69\xd6\x0e\xcb\x59\x3b\xfd\x37\x59\xcb\x92\x3e\x7d\x23\x67\x1f\x3e\x6c\x91\x73\x2b\x99\xc3\xe9\x41\x29\x87\x5b\x3b\xd2\x43\xa4\xad\x2c\x10\xab\xc9\x8a\x5c\x1b\x99\x26\xda\x9c\x35\x1f\x98\x1c\xe5\x30\xa9\x31\x12\xb5\xfb\x4c\xd7\x71\xb4\x7c\x20\x49\xf0\x96\xb8\x55\x11\x1e\x52\x12\x9b\x8f\xc6\xa3\x79\x92\xbc\x1e\xf3\xaa\x98\x2e\xbf\x5a\x4e\x98\xda\x85\xe0\xb9\xbe\xcd\x7f\x9e\xec\xa8\x2f\xd3\x2c\xad\x70\x0f\x0a\x83\x8e\xe7\x13\x7d\xe6\x0c\x99\xab\xdc\x58\xc6\xa3\xba\xc8\x71\x9c\xd4\x0b\x37\x38\xa2\x12\x14\x26\xf5\x42\x04\xf3\x24\x69\x9c\xa9\xf4\x8b\xb7\x3e\x4e\x90\xeb\x42\xd0\xf5\xf4\x25\x7a\xe6\x26\x19\x13\x78\x3d\x27\x81\xfc\xfa\x2a\xcb\x5a\x90\x37\x6b\xdd\xe1\x65\xda\x4b\x96\xf9\x62\x6d\x16\xf3\xaf\x73\xb1\xbe\x04\xe5\x58\x66\x94\x14\xda\x8e\xe4\xfa\x72\x0b\xee\xfc\xbc\x05\xa3\x64\xb5\x70\x5c\x16\x4e\xaa\x92\xc5\x15\xca\x79\x51\x5f\xde\x6e\xdc\x3e\x51\x0b\xac\xcc\xf8\xa6\x19\x25\xf4\xd6\x52\xe6\xcb\xfa\x9d\x79\x92\xac\xf1\x37\x4b\xba\x08\x09\xe4\xda\x34\x21\xef\xe9\xc6\x6b\xd6\x75\xde\xf0\x41\xbb\xb2\x92\x23\x25\x4f\x2f\xaf\x70\x3d\x6c\xc9\xe9\x6c\x49\x7d\xd3\xcf\x34\x42\x9f\x1e\x64\x24\x8b\xa4\x14\x5d\x7d\xe3\xe5\x45\xe4\x2b\x84\xbe\x3e\x15\x2e\xeb\x89\x94\xae\x47\xf3\x38\x79\x7d\x6d\xc8\xbc\x8d\xfa\xab\x53\x4f\xde\x22\x61\xa2\xcc\x08\xf2\x24\x44\x41\x07\x27\x55\xa3\x6a\xbc\x6a\xbd\xae\xd0\x65\xb2\x43\x12\x8d\x9b\x94\xde\xc7\xcc\xeb\xfc\x6c\xf9\x94\xf1\x7c\xa0\x96\x85\x38\xf5\x67\x8f\xc2\x4a\x9d\xc0\xa9\xdd\x38\xfc\xc3\x07\xfa\x41\xa1\xbb\x46\x8d\x55\xf5\x40\x3a\x66\xbf\x91\xd6\x7f\xf4\x4d\x2e\x0f\x73\xe3\x84\xde\xc7\xda\x94\x27\xf0\xdc\x6c\x2f\x6f\x68\x6e\x37\x86\x7f\xba\x98\xc2\x50\xde\xce\xea\xab\x02\xbb\x0f\xc3\x47\xe3\x91\x5a\xf7\x47\xbf\xa8\x02\xf4\x51\x03\x90\x87\xcb\x2f\xa8\x00\xc2\x00\x81\xaa\x5a\xdf\x00\x8e\x83\x5d\xa0\x6a\x59\xb8\xde\x57\x2e\x65\xd7\xab\x5a\x53\x1a\xf2\x60\x19\x4b\xf7\x0f\x94\xfa\x23\x95\x1d\x12\x30\xb9\x83\x36\x84\x70\x15\xc4\x0b\x6b\xb4\x23\xdd\xbf\xec\x92\x27\x89\xe9\xea\xc6\xd9\x54\xbe\xa6\x4b\x0b\xb9\x6c\x7b\x6b\xf1\x5d\x1b\x17\xbf\x67\x16\xe9\x69\x52\x50\xe6\xf7\x6c\xa5\x9e\x9f\x24\x46\x1e\x6d\xae\xa3\xcd\x4b\xd1\xa2\xd5\x68\x51\x62\x18\xaf\x77\xd5\xbe\x5e\xeb\xf5\xff\x61\xad\x57\xcc\x58\xf1\x6b\x3a\x3c\x4d\x8c\x46\xff\x9f\xd6\x83\xc7\xe3\x3c\x11\x1d\xce\xb2\x3c\x4d\xb2\x15\xdf\x9a\x05\xdd\x30\xbb\x6b\xfb\xc0\x1f\x8d\x06\x6d\xfb\xd2\x35\xc4\xa5\x17\xf9\xc9\x20\xa2\x0d\x21\x6b\xde\x4e\xcd\xd6\x54\xd3\xe4\x81\xa3\x68\x24\xd3\x08\x5d\x62\x28\x6e\xc4\xae\x59\x55\xe8\x58\x38\x9c\xf8\xbf\xd8\x72\xdc\xb8\xc1\xda\x5e\xda\xb2\xd2\x26\x77\x0e\x96\xba\x3d\x56\x7c\x76\x6d\xba\x74\xbe\x22\xa0\xf3\x15\x0d\x2e\x8f\x84\x36\x42\xb9\x7e\xa8\x72\x73\x3f\xcc\xcf\xf8\x2d\x9e\x4d\x5e\x9b\xc6\x3c\x8a\x44\x9c\x14\x6f\x19\xcd\xdb\x26\xaf\x59\x5e\xe0\x78\x81\x5b\x22\x4c\x27\x55\x5e\x73\xf4\x35\xeb\xee\x3c\x12\x2f\x2f\x17\xa8\x82\x0e\xa6\xd9\xee\xad\x3b\x55\x27\x3a\x5c\xd5\x31\x56\x8e\x52\xe6\xc6\xcd\xc2\x32\xa5\xff\xc0\x1f\x5f\x55\x9f\x90\xc7\x91\xb8\xda\xe6\x2c\xbc\x80\x27\xa6\x72\x20\xe8\xc3\x51\xf3\xf6\xcb\x0b\x19\x04\x55\x79\xc0\x35\xc5\xc3\xb7\x47\x50\x12\x80\x86\x3f\x0d\x51\x1f\x87\xa8\x78\x18\x3e\xd2\x4d\xb4\x38\xf4\x71\x78\x41\x90\x61\x23\x1e\xa7\x9e\xed\x45\x3c\x48\xe9\xec\xa2\x43\x4d\xec\x43\x60\xbc\xea\xb3\x99\x8e\xd1\x70\xb1\x9b\xce\xae\x72\x4f\xe7\x74\x78\x79\xe9\x60\x3f\x6d\xc2\xe8\x5a\xd5\x19\xfb\xda\xd5\xe7\x09\x9f\xd7\x3b\x8e\x19\xcb\xe7\xde\xeb\xd9\xf5\x01\x5d\xfd\x79\x41\x25\x89\xba\xc7\xfb\x75\x67\xc7\xb1\x39\x55\x63\x65\xcd\xd1\xb8\xa9\xcd\xdf\x3e\x4a\xbe\x78\xa6\x53\xdd\xeb\x12\xc3\x2e\xb0\x26\xb1\xe0\xed\xc4\xe6\x6d\x64\x18\x67\x47\x72\xe8\xfc\xce\x45\xf9\x84\xce\x64\xfd\x09\x9d\xc1\xb4\x78\x57\x72\xf1\x9c\x5f\x79\xa4\x47\x8b\xe4\x49\x8d\x1f\xd9\x71\xc5\xce\x53\xe9\x52\x3e\x59\xd2\x50\xb4\x8e\xe9\x88\x61\x95\x9b\x9e\xb4\xc9\xf1\x9a\x08\xe9\xe9\x7b\x69\x7e\x21\x8b\xb2\x65\xda\xaf\xda\x5a\x39\x6f\x37\x9e\xa6\xb4\xe9\xf0\x34\x25\x0b\x79\x15\x3f\x4e\xc2\x1c\x85\xfe\x0e\x70\x14\xfe\xf3\x36\x62\x1c\xe0\xb5\x6e\xc2\x69\x3d\x77\x53\x1b\xed\x94\x77\x04\xd6\x7f\x7d\x7f\x90\x5d\x0f\x3d\xf3\xaa\x25\xcd\x97\x53\x33\x76\x93\x75\x67\x1b\x79\xa1\x8f\x9a\xbc\xd4\x35\xb1\x62\x28\xcb\x2f\x2f\x4f\xb4\x2f\x92\xd9\x9a\x3d\x65\xaf\x57\xdd\xa6\x5e\x61\x9b\x54\x5a\x2a\x0c\xb5\x4f\xdf\x55\x9b\x70\x0d\x9a\xaf\xec\x65\xac\xda\x30\xd7\xdf\xae\x5b\x50\xfc\x32\x79\x3c\xbc\x41\xf6\x75\x39\x06\xdb\xfc\xf4\x7f\x7e\xd4\xfe\xf7\xf5\xfd\xa7\x86\x7c\x10\x1e\x45\xae\x92\x3a\xf6\xc3\xc0\x79\x2c\x3c\x2d\x4a\x2b\x6c\x55\x5b\x16\xd6\x96\x95\x1d\xb6\x7c\x96\x06\xb1\x0c\xfa\xf6\xb8\xb5\xd3\xe0\xe6\x65\xb6\xb7\xcb\xcd\x26\x1d\x9b\xdc\xda\xa9\x5f\x7a\x52\xd7\xf5\xfa\x55\x5c\x5e\xf0\xd5\xbd\x0b\x35\x08\x2b\x74\x02\x51\x3e\x07\xb2\xc6\x83\xc2\x65\xc9\x5a\x42\x4f\xfa\xbe\x35\x48\x9f\xe4\x20\x2d\x78\x3c\x98\x16\xe8\xca\x69\xd5\x53\x95\x1b\x65\xdf\xf1\x43\xbd\x65\x85\xdc\x34\x0b\x58\x85\x34\x08\xfb\xe3\x4d\x49\x9d\x6d\x91\xa9\x86\x41\xa1\x4b\xbb\x04\x74\xa6\xae\xbe\x24\x8e\x89\x42\xb3\x41\x5d\x9d\xb0\x2e\x19\x13\xfc\x69\xd9\x84\x6d\x91\xc3\x53\xba\x21\x7c\x2b\x30\xd4\x37\xad\xda\x15\x97\xa7\x97\x78\xed\xc0\xad\x3a\xd0\x47\xfd\x8a\xd7\x7c\x9b\x57\x1d\xb0\x6a\x7b\x71\x79\x3f\x6e\x34\x2d\xeb\xbb\xdb\xb0\x34\x95\x92\xe7\x6b\xfb\x31\x37\x41\xe7\xe7\x53\x4b\x35\x8f\x11\x72\x5a\xa7\x44\xa3\x8f\x7c\x22\x8e\xc2\x15\xeb\xac\x30\xb9\x4d\x7b\xe5\xb8\x1a\x3d\x4b\x41\xc7\xa9\x6c\x7a\x48\x96\x06\x70\x61\x27\x89\x4e\x3f\x5b\xcb\x4b\x82\x67\xf2\x27\xad\xb6\x7a\xb2\x65\xc1\x00\xb1\xa6\xf9\x34\x28\x8e\x54\x7f\x3c\x0a\x1a\x27\x03\x5e\xf1\x82\x0a\x57\x86\x8c\x07\x0b\xe4\xed\xec\x31\x0a\x0e\x12\x26\xa1\xe3\xf5\x3d\x11\x1b\xf2\xb0\x2b\x7f\x38\x7c\x04\x9f\x5b\xc2\xaf\xf3\x87\x1b\xfb\x11\x3c\xa7\xce\x6b\x9e\xf3\xfa\xa8\x1c\x2b\x5b\x86\x7a\xa0\xf9\x1d\x7f\x42\x0d\xff\x47\x7e\x7e\x2e\xf3\xed\x01\x43\xd3\xad\x1d\x73\x5c\x3b\xf8\xea\x89\x8b\xc0\xdc\x6e\x04\x7f\xfa\x8d\x60\x73\xd3\xb8\xaf\xf6\x4b\xc5\x1a\x3e\xf0\x87\xed\xc7\x47\xf2\x8b\xfd\x6a\x34\xdc\x9a\x1b\x57\x87\x38\xa2\x5c\xaa\x8f\x48\xce\xae\x11\x24\xb2\x4e\x0a\xaf\x5a\x53\x7d\x4e\xb2\x27\x67\x65\x37\x79\x70\x1e\x31\xe7\x2f\x2f\x5c\x75\x18\xd7\x94\x22\x1b\x29\x35\xcf\xf9\xaa\x7e\xeb\x5c\x76\xad\x46\x84\xdd\x49\x3e\xf5\xd6\x48\xb2\x83\xde\x74\x9a\x8e\x3e\x58\xd8\x94\xcd\x2f\x70\xa8\x0a\x86\x0d\xc7\xb4\xca\x9f\xb3\xf5\xe7\xe8\x5b\x2b\x1f\xb2\xb0\x86\xd5\xb1\xf2\x09\xbd\xb1\xb3\x5c\x2a\x6e\xfc\x18\x93\xd7\x37\xf9\x89\x3a\x7f\x35\x0a\xd7\x0a\x26\xf2\x65\xe3\xb1\x01\x0b\xec\x28\xbb\xe6\x76\x63\x57\x2e\x4a\x76\x37\x37\x8d\x05\xb5\xb2\x52\x1f\x25\x6d\xa2\x69\x3f\xca\x45\xc1\xfe\xb9\x78\xb0\xe9\xe9\x69\x72\xfd\x31\x79\xd8\x7d\x04\x5d\x30\xda\x9c\x71\x4d\xf9\x52\xb0\x4c\x64\x6b\xc7\x90\x66\xab\x77\xdb\xe0\x9b\xdb\x0d\xff\x4f\x54\x69\x1a\xbe\x56\x65\x02\x33\x4f\x46\x3c\xf8\x8f\x06\xb4\x33\xcc\xe6\x8e\xc2\xd1\x26\xe0\x3b\x73\x10\x55\x93\x07\xff\x11\x02\x68\x1b\xc6\x0f\x37\x77\x0c\x4c\x6f\x82\xb9\x32\xc1\x33\x33\xaa\x75\x9e\xab\x46\xb9\x7a\x28\xe3\x51\x6d\x9f\x57\xcf\xc0\x86\x42\xce\x0d\x5d\xa5\xa7\xd2\xf9\x66\xa9\xb8\xa5\x95\x1f\x77\xdd\x58\xb8\x74\x9f\x32\x1b\x85\x0b\xd2\xba\x55\xba\xa7\x9b\x96\x6c\xa1\x82\x9d\x4e\x9f\x0c\x5d\x3c\xb8\x8f\xe6\xc6\xc3\xe3\xab\xb6\x41\x45\x3f\x71\x93\xe5\xc4\x7c\xda\x92\xae\x95\x86\xd3\xcc\x43\xd6\x4f\xd9\xf7\xe3\x70\xd4\x8b\x7d\xb6\x36\xef\xb4\xac\x1a\x57\xad\x97\x17\xc1\x1f\x66\xf6\xe3\xc3\x99\xfd\x88\x22\x71\x34\xae\xda\x30\x4f\x0c\x10\xca\x54\xe6\x7c\x15\xa6\x53\xaf\x0a\xf3\xc7\x2b\xdc\x57\xed\xda\xe8\xa9\x76\x3a\xac\x96\x97\x80\x52\x56\x50\x54\x6e\xd0\xc5\x70\xd5\x73\xe9\xe6\xda\x7e\x48\x7b\x7c\xf2\xc0\x86\x63\xfc\x78\x15\x0f\xfc\xd1\xb4\x5e\x0d\x38\x8f\xaa\x02\x06\x43\x5c\x7a\x1a\x8d\xe1\xb4\x2a\x00\x75\x18\x5d\xb8\x8d\x37\x4b\x67\xc7\x82\xa7\x62\x4d\xd9\x56\xe6\x96\xdc\x32\x08\x42\x7a\xd2\x21\x29\x66\x48\xbf\xae\x17\x03\x9e\x3f\x91\x2b\x1e\xc1\x95\xcd\x84\x2c\x7d\xc3\x31\xfb\x0f\xee\x23\xd0\x6d\x6e\xda\x4b\x6d\x85\x55\xc7\x50\x0e\x93\xdd\x4d\xbf\xbf\xc9\x79\x55\x7a\x85\x42\xbc\xba\x9d\xe2\xc8\x94\xf2\x58\xb1\x57\x75\x48\x17\xf8\xea\x48\x15\xb8\x5e\x4c\x47\xac\xa6\xd3\x70\xcc\x51\x58\x35\x36\xf7\x5c\xde\x70\x4c\x47\xfa\x4a\xfa\x3f\x83\x34\x8d\x92\xaf\xf5\x4f\x70\x8e\x12\x05\xdb\xcd\x31\x36\x83\xfe\xa6\xbc\x38\xb7\x27\x48\xce\x48\xde\x8f\x9f\x5c\x58\xe4\xde\x79\x2b\x19\x81\x7d\x72\x61\xee\xfe\xdf\x54\x71\x27\xf0\xa2\x48\xa4\x6c\x5d\x6b\x63\x1e\xf7\x5d\x0e\x96\x69\xad\xe6\x11\x2c\xf3\xc4\xe5\x9b\xd6\xe6\xcc\xe5\x0d\xa5\x30\xca\xe2\x37\x32\xff\x4f\x7f\x7e\x72\xe1\x58\x14\x10\x7f\x7d\x72\xe1\x5b\xee\x9e\xc9\x32\xad\x4d\xbe\x19\xb9\xfc\xf5\x9f\xfb\xbb\xcc\xee\x8d\x54\x87\x18\x78\xff\x62\x88\xd0\x68\xca\x62\x74\x73\xb7\x73\x13\x5e\xa5\x3b\x03\x40\x7f\x71\xe1\x4d\x2b\xde\x22\xce\x8a\x1f\x8d\xc6\x51\x99\x6f\xd7\x7e\xa4\x2b\xef\x45\x1c\xb6\x7b\xa3\x2b\x1d\xbb\x8a\xb4\x13\xf0\x28\x19\x84\xa9\xbc\x92\x50\xbb\xef\xe4\xa4\x76\xf1\x3e\x86\xa2\x77\x7a\x65\x3a\x6d\x82\x29\xda\x35\xcf\x69\x54\x90\x33\x3e\xd2\x34\xfb\x7e\x89\x86\x6a\x93\xa2\x09\xab\xb1\x51\x26\x9a\x1a\x2c\x44\xca\x2f\xa3\x28\xea\x65\x21\x2b\x17\xea\xb6\xba\x22\x9d\xfd\x96\x93\x2e\xc7\x22\x9e\x2b\x7c\x1c\xe6\xf8\xab\xf2\xed\x10\xc5\xd1\x2d\x24\x7a\xed\x89\xa9\x42\xf7\x7a\x8d\xd3\xa8\x54\x8b\xad\x52\x2d\x9e\xcb\x2b\x30\x8a\x7b\xe8\x34\x2e\xca\xdc\x87\x25\xee\xd6\x38\x49\xc3\xd1\x95\x78\x1e\x8b\x44\x9f\xe6\x56\x51\xd3\x89\xae\xc4\xf5\x37\xe4\x15\xdb\x9d\xad\xd9\xa2\x71\x32\x28\x64\x74\x3f\x8b\x9f\x88\xc0\x29\x96\x7d\xd1\xc9\x08\x6b\x5b\xf6\xcc\x2b\xd3\x8b\x2d\xbb\x3f\xc8\x69\xc5\x06\xb2\xce\x97\xf0\x85\x16\x77\xee\x97\x68\x85\x16\x3f\x73\x74\x8b\x27\xeb\x5a\xf6\xb6\x97\x47\x3d\xfa\x59\x35\x3c\xfd\x9e\x33\x2e\x75\x81\xe6\xb7\x9c\x54\xac\x86\xa3\x61\x8e\x5f\xdf\x05\x76\x83\x9c\xa3\x50\xb3\x76\x3b\x47\xcb\xe6\x56\x84\xe3\xc6\x49\xb9\xb1\x17\x79\x63\x27\x22\xed\xa4\x3c\xd5\xe5\x6e\xd9\x85\x3a\x79\xbb\x13\x9c\x4d\xf8\x4f\x44\x84\x5c\x90\x64\x42\xa2\x57\x12\x12\x74\x9f\x07\x7a\x25\x21\x51\xc4\x91\x90\x68\x95\xf9\x48\x20\xf4\x56\x04\x42\x4f\x0b\x84\xde\x7a\x81\xd0\xd3\x02\xa1\xb7\x2a\x10\x7a\x5a\x20\x6c\xf4\x8a\x03\x38\x0e\x7d\xea\x21\x12\x19\x4f\x78\x63\x99\x4c\x9d\x44\x22\x93\x35\x64\x45\x72\xbb\x65\x8a\xee\x3e\x3d\x2d\x18\x7a\x2b\x82\xa1\xa7\x05\x43\xaf\x2c\x18\x7a\x5a\x30\xf4\xde\x12\x0c\x3d\x2d\x18\x7a\x25\xc1\xd0\x2b\x08\x86\x62\x6d\xb6\x4a\xb5\xa9\x05\x43\xaf\x20\x18\x8a\xdc\x87\x39\x77\x3e\x60\x7b\x7a\xc0\xf6\xd6\x0f\xd8\x9e\x1e\xb0\xbd\xd5\x01\xdb\xd3\x03\xb6\x57\x1c\x5f\xe5\x8a\x3f\xce\x6a\x36\x59\x57\xf1\x27\xcb\xe4\x72\xf5\xde\xf6\x72\xea\x52\xf5\x36\xbf\xe9\x06\x4f\xca\xf5\x7b\x34\xcc\xe3\xac\xaf\xdf\xdd\x20\xe7\x28\xd4\xaf\xdd\xce\xd1\x6a\xd4\xf5\xf2\x51\x57\xac\xc9\x45\xb1\x26\xd5\xa8\xeb\xe9\x51\xf7\xe6\x68\xca\x9c\x57\x66\xe3\xc9\x9d\x16\xc7\x13\x59\x53\x81\xfe\x66\xe3\xa9\x88\xd3\xe3\xa9\x88\xa3\xf1\x44\x41\xec\x01\xbb\xda\xa2\x28\x31\xc1\x84\xe7\xb4\x72\xb3\x4a\x74\xa7\x57\xa6\xcb\x66\x95\xa8\xeb\x52\x5c\x95\x73\x45\x1b\x4f\xd6\x11\xa9\xd5\x25\x7a\x52\x64\x28\x36\xab\x44\x5e\x16\xbe\x9b\x35\xab\xc4\x9c\xfd\x96\x93\x64\xab\x4a\x30\x0e\x1b\x1b\x19\x61\xb9\x59\x25\xa1\x5b\x48\x95\x9a\x55\x42\xbd\x02\xfa\x46\x1b\x6d\x25\x66\x9e\x65\x33\x59\xa9\xbc\xa3\x22\x6d\x5d\xe5\x9d\x79\x65\x7a\xb1\xf2\xf6\x07\x45\xda\x6a\xfd\x5c\x14\x13\x5f\xad\x9f\xdb\x5e\x4e\x5d\xaa\x9f\xe6\xb7\x9c\x54\xac\x9f\xa3\x61\x8e\x5f\x5f\x3d\xbb\x41\xce\x51\xa8\x1e\xbb\x9d\x57\x4f\x26\x8f\x25\xe6\xbe\x93\xc7\x58\xaa\xb9\xf7\x3f\x9b\x36\x1c\x9e\xf2\x1a\x9f\xb8\x0c\x3a\x43\xfe\x2f\xd6\x6a\xc8\x6e\x87\xe3\x20\x65\x70\xf5\xaf\x23\xb8\x71\x38\x8e\x18\x04\xd3\x7f\xa1\xcc\x53\x84\xa7\xd0\x0b\x18\xac\xde\xec\x82\xbe\x3e\x5f\x6c\x9b\x26\x97\x4f\x32\x9e\xb8\x30\x44\xf0\x3c\xd1\xa0\xaf\x8d\x27\x81\x34\x33\x38\x6b\x1c\xd1\x93\xe9\x84\xfc\xc2\x0a\x69\x77\x7b\xd8\x79\xd4\x0f\x2f\x8a\xdc\x78\x79\x2c\xe6\xe4\x34\x22\xa9\x38\x21\x1d\xb7\x1e\xe1\xca\xb0\xce\x36\x9d\xcd\x8e\xd8\x14\x46\xc3\x9f\x56\x7d\xe0\x40\x49\x35\x02\xf9\x3e\xcd\xab\x7e\x89\xf8\xe1\x51\xdb\x6f\xca\xc7\x6f\xa3\x92\xa5\xe3\x61\xfb\xf1\x55\x19\x61\x72\xdc\xce\xe3\x6b\x6e\x2c\x21\xe3\x47\x64\xc0\xc4\xb4\x30\x94\x2c\x1b\x07\x8c\x1f\x2a\x1b\xe4\x9a\x67\xd9\xd4\x44\x34\x0b\x78\xd1\xa0\xb2\x30\xdf\xed\xc0\xae\xb9\x0d\x6d\x73\x1b\xce\xc8\x64\x32\xa6\x67\x12\xdb\xd2\x74\x22\xab\xe9\xd4\xdc\x86\x2b\x2c\x80\xd7\xaf\xb6\xff\x32\x91\x62\xd0\xde\xee\xd5\xc3\xf6\xa3\x39\x7e\xd8\x7d\x84\x53\x73\x4b\x7a\x2c\xad\xc8\x83\x00\xda\x3a\xb7\xfb\x97\x39\x56\xec\x43\xe3\xea\x61\xe7\xd1\x9c\x3c\xb4\x1f\x61\xe3\xd4\x5c\x61\xff\x91\xa5\xd6\xc8\x18\xb3\x8c\x76\xcc\xed\x46\x47\x1e\x2b\xeb\x68\x9b\xcb\xa9\xb4\xb0\x5c\xd1\x51\xa9\x87\xce\x23\x35\xe3\xb5\x7c\x0d\x0d\x53\x90\xc8\x9d\x47\x03\x4e\xcd\x41\x54\x0d\x1e\x3a\x8f\x70\x0a\xd7\xda\x0c\x73\x6a\xe4\x56\x97\xc5\x87\x0f\x84\xa1\xfa\x68\xab\x43\x07\x3f\x94\x11\xfb\xf4\xc3\x07\xf7\xe5\x45\x06\x86\x2f\x2f\xdb\xa6\x79\x6a\xfc\xf0\xa5\x75\x06\xf3\x31\xe2\xf0\x8d\x37\x72\xce\x6d\x0a\xd8\xef\xcc\xf3\xe4\x6b\x75\xc4\x4d\x24\x9b\xdb\x46\x1d\xc3\x16\x86\x77\x8c\xa5\xae\x00\x96\xf1\x83\xfa\xec\x57\x5f\xda\x60\x2c\x18\xa9\xb2\x7d\xe3\x8f\xc0\xf1\xaf\x61\xd4\xfd\x9a\x6d\xbf\x41\x84\x11\xaf\xed\xf1\x15\xd4\xd3\x53\x39\x89\xd7\xcc\x32\x9f\x67\x55\x56\xe6\x21\x37\x1d\x69\x38\x5a\x36\x37\xa9\xaf\xda\x9b\x87\x1c\xf2\x0a\xa7\x0b\x39\xf4\x45\x0d\xd0\xb7\xb6\x95\x2d\xea\x55\x9e\x70\x2b\xd4\xd8\x21\x37\x37\xc4\xc3\xb7\xc7\x4d\xfc\x0c\x94\x3b\xe7\xf2\x67\xf2\x26\xe4\x06\x58\xf2\x33\x1a\xa0\xcf\x10\x80\xa5\x39\xdb\xdc\x7c\xc5\xef\x7c\x6d\x6f\x6e\xd6\x77\x37\x37\x1b\xb2\xf2\xab\x0b\xf3\xdd\xb6\x91\x59\xa9\xfc\x7f\xb1\x1c\x27\x81\x33\xe2\x33\xb6\x6c\x76\xde\x36\xe9\xe9\xd0\xd2\x75\x96\xc2\x6b\xc6\x58\x64\xf9\x62\x72\x66\x5c\xd7\xb2\xe5\xc1\x7e\xd4\x16\xa9\x0f\x1f\x9c\xbf\xa4\x69\xc9\x31\xf2\x07\xc0\xfe\x6d\xae\xca\x52\xf0\xff\xd7\x5c\xfd\xf9\xff\x9e\xab\x30\x48\x07\xec\x8d\x17\x37\x9c\xc7\xaa\xb1\xb9\xf3\x6f\xac\x36\x94\x56\x32\x1e\x31\x18\x95\x2d\x20\xdf\xbf\xbb\x13\x6f\xe1\x8e\x79\xec\x7c\xff\xce\xe0\xdd\x76\x91\x3a\x1b\x70\x48\xc7\x19\x26\x1d\xe3\x0c\x37\xe2\x43\xa1\x56\x4c\xe6\x0a\x46\xf1\xac\x99\x6b\x25\x61\x37\xc8\x39\xe4\x2c\x2d\xc1\xa3\x61\x63\x1e\x55\x29\x0c\xf4\xf7\xc1\x43\x05\x6e\x39\x35\xd2\x24\x24\xf2\x7a\xc2\x73\x72\xd7\x1b\x89\x70\xac\xf2\xf3\x30\x7b\x7e\xcc\x49\x6a\x55\x47\xaa\xb5\x44\x5e\x15\x63\x2a\xf2\x05\x8f\xf9\x48\xa4\x22\x56\x3c\x17\x7d\xe4\x91\x5f\x4e\xa2\x30\x48\x84\x39\x1b\x37\xee\xca\x59\xbc\xc5\x2c\xbe\xbd\x46\xa4\xb5\x25\x15\x92\x41\x37\xaf\xc5\x79\x54\xed\x52\x22\xdd\xbc\x9c\x6f\x26\x42\xd1\x75\x16\x18\x3c\xa7\x59\x32\xcf\xe9\x8a\x7e\x2a\x51\xd7\x5c\xd1\xbc\x44\x9e\x71\x93\x90\xff\xd4\xd8\x90\xa1\x01\x4f\x6e\x78\x1c\x78\x81\xab\x49\xbf\xe6\xa9\x5d\x09\x9e\xe0\x5a\x49\x22\x22\xc1\x73\x92\x72\xb8\xa3\x48\x8b\x6f\x85\x2c\x94\x5d\xf2\x28\x8e\x6f\x9f\x7f\xa6\xf2\xab\x4c\x33\xe8\x47\x59\x99\xfa\x11\xc6\xe3\x8e\x23\x5d\xf9\x9a\x12\x3e\x70\x73\xc2\x55\x38\x55\xd8\xce\x73\x09\x9b\x28\xb4\xbd\xdb\x38\xe2\x55\x0a\x03\xfd\x95\xe6\x37\x49\x24\x9d\x1b\x53\x3e\x72\x14\xfb\xad\x68\x4c\xcb\xec\xe1\xf3\x2a\xfb\x09\xb7\x84\xaf\x62\x5c\xf1\x65\xea\x05\xbd\x2a\xa0\x73\xfb\x7e\xbc\x42\xcf\x3c\xa9\x49\xfc\xd3\x1b\x0c\x9e\xd0\x85\xd8\x8b\x97\x59\xe8\x01\x00\x5d\xf2\x68\x85\x1a\xfa\x9a\x38\x8a\x1b\x1b\x4b\x54\xea\xfa\x12\xd7\xce\x63\xb6\xbd\x24\xf5\x02\x3b\xbd\xe6\xfe\x38\xfb\xf0\x65\x37\x67\x90\x6f\x10\x88\x62\xe5\xa6\x27\x05\x32\xb9\x55\x4f\x85\x43\x09\xe8\x8c\x17\x2a\x47\xbe\x5c\x70\xde\x57\x0f\xc0\x29\x8e\xc3\x55\x86\xc2\x07\x4e\x73\xea\x4a\xa5\x3c\x3d\xad\x10\x75\x95\x0e\x0a\x35\x72\x15\x4e\x97\xa8\xa7\xf1\x3a\x6a\x9e\xf0\xd1\x71\x4e\xef\x84\x71\x5a\x2a\xb2\x53\x48\x9a\x3a\xec\x52\xe2\xb3\xee\x7a\x7a\x9e\xfc\xfe\x3c\xe7\xe8\x05\x8e\x88\xfd\xb9\x17\xb8\xc4\xab\x3a\x63\xe0\x88\x99\x62\x1e\x77\xdf\x64\xbe\x0a\xa7\x45\xce\xa4\xdb\x70\xad\x52\xcf\x3d\x7a\x34\x74\xdb\x7b\x41\x22\xe2\xb4\x34\x8a\xa2\xbe\x6e\x1b\x49\x2c\x94\x71\xb1\xad\x28\xb1\x18\x85\x13\x51\x8a\x26\x7e\x5b\x43\xd3\x11\x23\x97\x97\xa8\xf9\xe8\x4c\x5a\xcb\x04\x1d\xe7\x39\x8b\x83\x2b\x3c\xe1\xeb\x71\x65\xdb\x05\xf4\xca\xa8\xfb\x36\xe1\xcb\xe4\x95\x8a\xf6\xed\xb7\x78\x74\x63\x1d\x4f\x73\x86\xb5\xfd\xb7\x3b\xcb\x19\x56\x3b\xe0\x74\x85\xa8\x12\x7e\x38\xb2\x1f\x73\xda\xba\x3e\x76\x53\xcc\xff\x6a\x17\xf5\x7e\xcf\xa9\xeb\x7b\xd1\x6d\x31\x81\x75\x1d\xf1\x6e\xc2\x75\xeb\xe3\x3a\xb6\x50\xa8\x7d\xde\x08\xcb\x3d\xc5\x16\xd2\x60\x52\xc4\x8d\x7f\x3a\x0f\xa1\xbc\xc6\xb5\x31\x83\xd3\x7c\x26\x3b\x1d\xd7\xfa\x71\x38\xfa\xd6\x39\x3f\x33\xcf\xc6\x8d\xd3\xf1\xb2\x8c\x95\x18\x29\x63\x29\x0c\xf4\x57\xca\xd8\x25\x76\xd9\xda\x12\x79\xc5\x97\xa9\x5a\xc6\x4a\xf4\xfb\x95\x8f\x65\x95\xa1\xf0\x4f\xff\xaf\x0c\x58\xe3\x92\xb2\x17\x2f\xb3\x48\x21\x2c\x91\x9d\x68\x85\x8a\x42\x58\xe2\x46\x2b\x51\x49\x06\x4b\x5c\x3b\xa7\x2d\xc9\x60\x89\xbf\xec\xe6\x0c\x25\x19\x2c\xb1\xe9\x49\x63\x23\xa7\x97\x3b\xb1\xca\x78\xa1\xf6\x96\x85\xb0\x24\x1c\xae\x32\x14\xbe\x70\x9a\x53\x57\x2a\xe5\xe9\x69\x85\xa8\xab\x74\x50\xa8\x91\x62\x0f\x57\x89\xc6\xeb\xa8\x79\xc2\x47\xc7\x39\xbd\x20\x84\x25\xce\x29\x24\xbd\x22\x38\x25\x65\x7a\x90\xb3\xfc\x44\xca\x4a\x9e\x71\x77\x29\xbd\x4c\xb6\x2a\xfa\xe8\xcd\xc4\x96\x38\x93\xe5\x94\x96\x8a\x3d\x7b\x83\x9e\x17\x7c\x7f\x8e\x72\xbc\x38\x3a\x48\x8e\x67\xb1\x70\xd4\xad\x96\x60\x72\xd5\x58\xc3\xa1\xd3\x3c\xe6\xbc\x4c\x5e\xca\xf5\xf9\xd5\x0a\x59\x47\x4d\x84\x8e\x3a\xf0\x1c\x51\x4e\x76\x31\x29\xd2\x0a\x91\x9a\x19\x21\x93\xbc\x9a\xe4\xc6\x39\xa5\x10\xe3\x26\x50\xe8\x34\xcc\xf5\x57\xd5\x7d\x67\x28\x9a\x8a\x15\xf2\x73\xd1\x24\x50\xc9\x4d\x18\x24\xb9\x6e\x9c\xa4\xe4\xb9\x88\xb4\x5f\xf2\x7c\x8a\x18\x39\x13\x35\x7d\x1f\x51\x23\x3b\x47\x65\x7c\x07\x13\x5e\x8c\xba\x1f\x2b\xf5\x3d\x5b\x02\x90\x83\x4a\x64\x29\x1a\x6f\x11\x1b\x51\x72\x72\xaf\xf9\x22\x0e\xe5\xad\xf7\x96\x76\xc7\x4e\xd7\x0b\xb0\x00\xf3\x01\x87\x83\x71\x71\x85\xb5\x18\x70\x38\x1c\x97\x16\x70\xad\x01\x87\x6f\x25\xa6\xdd\x01\x87\xe3\x12\xa6\x39\xe0\x70\x32\xfe\xe7\x25\x24\x65\x3f\xb3\xaa\x77\xf2\x18\x27\x51\xb5\x43\x35\x4c\x7f\xa5\xdd\x9e\x3f\x97\x70\x64\x55\xef\x64\xad\x4a\xab\x19\xaa\x17\xbd\x4f\x26\x69\xa7\x13\x9e\x71\x05\x4e\x33\x70\xda\x31\x9f\x2a\x5a\xaf\xbd\x9c\xc0\x45\x98\x64\x2b\xaa\x72\x3a\xad\xee\x32\xef\x7a\xbe\x76\x17\x97\x61\xc5\x8c\xfe\x7c\x19\xc6\xe3\x98\xcf\xbb\x61\x61\xc1\x71\xd7\xff\x97\xa6\xd4\x71\xea\xf9\x49\xcd\x0e\x47\x11\x8f\x85\x94\xd1\x0c\x06\xd1\xbf\x5c\x6e\xd3\xd7\xba\x61\x2b\x99\x94\x97\xef\xb9\xfd\xe0\x5c\x9f\x17\xa4\x1b\x73\x64\x3d\x28\x1f\xbe\xe7\xf9\x7d\xb5\xed\x3f\x9d\x0f\x1f\xaa\xd6\xa6\x79\x25\xa4\x3d\x4c\x98\x64\x19\xb2\xc1\xc9\x1f\x2b\xa0\x83\x1c\x53\x97\x1b\xd0\x37\xb7\x76\xde\x99\x82\xdc\x83\x5f\x09\x03\xdc\x02\x1c\x0b\x03\x86\x05\x78\x2c\x2f\x91\xf4\x5f\x5e\xdc\x97\x97\xa1\x21\xcc\xb1\xd8\x14\x9b\x63\xd1\xb0\x36\x4d\xf1\x6a\x6d\x9a\xb1\xf8\xbf\x31\x5b\x1c\x70\xc7\x15\xe9\xa1\xf0\xa9\xcf\xb5\xf2\x3e\xd7\xa2\xf6\x93\x83\x84\x3a\x26\x0e\xb0\x8b\x58\xf4\x13\x53\x92\x9e\x26\x5c\x31\xd1\x21\x56\x9e\x8a\x6c\xe4\x49\xb4\x35\xe5\x8d\xc6\xd4\x0b\x9c\x70\x5a\x93\xdf\xfe\xf0\xa1\x04\xd6\xfc\x90\x3b\x22\x5e\x8f\xad\x89\x09\xf7\x7f\x42\x2a\x97\xe3\xc3\x87\xea\xbf\xe4\x2c\x9e\x0a\x47\x6a\x35\xf7\x20\xb1\x2d\x6f\xc9\x6d\x6c\x90\x4f\xd0\x70\x6a\x8e\x03\x91\xd8\x3c\x12\x10\x4d\x4d\x15\x7a\x9e\x9a\xb9\x05\x03\xe2\xa9\x19\xf0\x89\xe7\xf2\x34\x8c\xf3\xc3\xab\xc9\xb4\xe4\xbc\x8b\xd7\x1c\x2f\x96\xef\x22\x9a\x85\x43\xa5\xe9\x32\x57\xdf\xf3\x7d\xe1\x14\x59\xc6\xcb\x2c\x53\xe1\xb9\x83\xb4\xc8\x32\x59\x66\xb1\x43\xdf\xe7\x51\x22\x8a\x4c\xd3\x65\xa6\x84\x1e\xa3\x2b\x7f\x6c\xb6\xc2\x94\xc6\xe1\xb0\xcc\x33\x5f\x97\x67\x3b\xf4\xc3\xb8\xc8\xb5\x58\xff\xb9\x22\x4b\x73\x99\x65\x22\x95\xaa\x02\xcb\xee\x6a\x2a\xe9\x15\x77\xbc\x71\x89\xab\xb5\x86\x2b\x7b\x86\xb2\xc8\xd8\x5e\x69\x14\x11\xa5\x03\xb3\xe8\x0c\x66\x6f\x99\x45\xb9\x43\x2d\x26\xb3\xbf\xcc\xe3\xa5\x62\x54\xca\xd1\xc1\x4a\xa3\x0d\xbc\x54\x74\x22\x6e\x97\xda\xe4\x70\x7d\x75\xaf\xb6\xf0\xd1\xba\x3a\xef\xa4\x73\xbf\x94\xdc\xb7\x35\xf5\x70\xed\x25\x9e\x55\x66\x3b\x5e\x66\x1b\xf1\xd8\xf5\x82\x1b\xcf\x49\x4b\xc5\x3c\x59\xe9\x56\xe3\x38\x29\xb7\xf2\xe9\xca\x17\xbd\x45\xe9\x5b\x67\x6f\x67\x29\x7f\x3b\xb1\x18\xe1\x7c\xb5\x2f\x87\xb1\x13\xc6\x9e\xeb\x95\x9a\xf2\x62\xb5\xea\x96\x6a\xe3\x72\x25\x25\x3f\xa4\x21\x91\x37\xf6\xd5\x32\x4b\xea\xd9\xc3\x52\x43\x76\x96\x39\x50\x8b\x0e\x13\x6f\xb9\x67\x75\x57\xba\x44\xb2\x17\xe0\x74\x52\x1a\x3a\xbd\x95\xce\xb5\x5c\xfc\xeb\xf5\x6d\x73\xb8\xd2\x23\x6e\xd6\xd6\x93\x17\xf0\xb4\x3c\x82\x6e\x97\xf9\xf8\xca\xa8\xb8\x5b\xed\xf2\x89\x28\x7d\xec\x7e\xb5\xb2\x79\x4c\x02\xb0\xc8\xf5\x7e\x99\x2b\x08\x9d\x12\x03\x9f\x2d\x31\xf8\x5e\x20\x56\xba\x9d\xb5\xcc\xd5\x8f\xf9\x48\xec\x86\xb1\x23\x4a\x7d\xcf\x5e\xe6\x4b\xc5\x2c\x2d\x35\xaf\xb3\xcc\x91\x3f\x0e\x5b\xaa\x23\xb1\xcc\x27\x67\xbc\x16\x8f\x96\xab\xaa\xbf\x92\xb7\x30\x48\xf7\xf9\xc8\xf3\xe7\x45\x36\x77\x99\x8d\x24\x5b\x91\x63\xb0\xcc\x81\x6a\x6d\x91\xc1\x5b\x66\x90\xa2\x61\x65\xcc\x3f\x2d\xf3\xa1\xfe\xea\xc6\xe1\x38\x70\x5a\xcb\x32\x79\xb8\x3e\xcd\x15\xd9\xed\x2f\xf3\xc5\x2b\x22\x77\xb4\x52\x65\x03\xcf\x77\x62\x51\xaa\xad\x60\xe5\x7b\x76\x1c\xfa\xbe\x17\xb8\x45\xae\x70\x99\x2b\x8c\x3d\x11\xc8\x66\x2a\x35\x67\xb4\x92\x9c\xd4\xe9\x45\x50\xea\xac\xcf\xcb\x6c\xee\x5a\xb6\x78\xa5\x8d\x56\x25\x65\xb2\xae\xb9\x6f\x56\xc6\x62\xba\xbe\x9c\xdd\x30\x2a\x4d\xe4\xcb\x5c\x22\x70\x96\x87\xd0\x64\x6d\xde\xfd\x30\x2e\x55\xfe\x74\x65\x1c\x71\x4b\xf8\x25\x96\xd9\x9a\x84\xd6\x4e\x89\xf3\x95\xb6\x5e\x9a\xa5\x17\xcb\x0c\x8e\x97\xac\x08\xb6\xe6\xba\xb1\xd8\xf4\x3d\xb7\xf4\xad\xdd\xb7\xfb\x6a\xa9\xa1\x5b\xeb\xaa\x7d\xa5\xe7\xb7\xd7\x14\xf1\xa8\x94\xab\xbd\xd5\xf1\x6f\x0f\xca\x5d\x7d\x7f\xa5\x1f\xa3\x18\x2d\xcf\xe5\xeb\x59\x96\x26\xba\xc3\x35\x9d\x73\xdd\x44\x71\xb4\xd2\x0b\xa4\xf3\xe1\xd2\x3c\xbe\xcc\x33\x8e\x50\xb5\x2e\xcd\xe1\x2b\x15\x1e\xf3\x20\xe9\x87\xf1\xa8\x34\x83\xaf\xb4\x9d\xb0\xc6\x38\xf8\x48\xb9\x3d\x9d\x99\x4c\x4e\xac\x0c\xce\x28\xec\xa0\xfe\x7f\x3e\x33\x59\xa6\xac\x32\xb8\x98\x99\x2c\x19\xf0\x48\x30\xb8\x9c\x99\x0c\x15\x0f\xea\x91\x0c\xae\x66\x26\xa3\x53\x4f\xb1\x08\x52\x06\x9d\x99\xc9\x6c\x11\xa4\x74\x04\x1b\xc3\x3e\x4f\x92\x13\x2f\x49\x19\xf4\x30\x8d\xfc\x5d\xf0\xeb\x99\xc9\x3c\x69\x9b\x63\x70\x33\x33\x99\x98\xa5\x22\x70\x18\xdc\xce\x4c\xe6\xf3\x79\x38\x4e\x19\xdc\x65\x71\x84\xc3\xe0\x1e\x13\x54\x5a\xad\xc3\xe0\x3d\x7d\x3a\x1c\x89\x34\x9e\x33\xe0\x73\x64\x4d\xf7\x30\x09\x6b\x6e\xb2\x34\xf6\x46\x0c\x6c\xc4\x92\x80\x53\xf9\x75\xe6\x26\x8b\x85\xeb\x25\xa9\x88\xf7\x64\xad\x33\x10\x73\x93\x4d\x63\x2f\x15\x0c\xdc\xb9\xc9\xe8\x35\x3b\x4f\x66\xf3\x69\x2e\x8b\xdb\x15\xb3\x94\xc1\x10\xa1\xd0\x1e\x27\x0c\xfc\xb9\xce\x1a\x83\xd1\xdc\x64\x13\xb5\xd0\x0c\xe6\x26\x8b\xb8\xe3\x78\x81\xcb\x20\x9c\x9b\x4c\xb5\x6d\xc2\x20\x9a\x9b\x0c\x45\x7c\x37\x64\xf0\x2c\xb3\x5b\x78\x28\x3d\xa6\x2f\x47\xe9\x80\x41\x32\xa7\x4a\xdd\xc5\x41\x91\x30\x48\x91\xc2\xd3\xf1\x88\xc1\x78\x6e\xb2\xb0\xdf\x4f\x44\xca\x60\x32\x37\x19\x29\x9d\x0c\xbe\xcd\xb1\x66\x48\xbc\xdd\xd0\xea\x87\xc1\x31\x46\x1a\x47\xbe\x67\x73\x2c\xd7\x09\x56\x89\x37\x12\x0c\x36\x4e\x91\x59\x4e\x6b\x0c\xce\x64\x3e\x94\x3a\xc6\xe0\x1c\x89\xa4\xe2\x31\xb8\x98\x9b\x6c\x90\x8e\x7c\x06\x97\x58\x40\x4f\x4c\x13\x06\x57\x18\xc1\x5b\x08\x06\x9d\xb9\xc9\x4e\x79\xd4\x9d\x47\xe2\xc8\x61\xd0\xc5\x98\x34\x67\xaa\x7a\x3d\xeb\x30\xe8\x95\x92\xcf\xb5\x3d\x06\xd7\x98\x38\x99\x08\x18\xdc\x20\x17\x9f\x08\x06\xb7\x54\x10\x3a\x3a\x75\x37\x37\x19\x2a\x0f\x09\x83\x7b\x6c\x34\x7a\xf7\x9d\xc1\xfb\xac\x12\xd5\x67\x64\xcb\xf0\x85\xc9\xb8\xe3\x68\x8f\xd7\x0c\xac\x05\xf6\xbe\x30\x11\x0c\xec\x05\x96\xdd\x1e\x26\x0c\x9c\x05\xb6\x8e\xec\xab\x62\x41\xd5\xca\xb1\x00\x0c\xfa\x0b\xd9\x91\xd5\x70\x65\xe0\x2e\x4c\x96\x29\x70\x0c\x06\x0b\x93\xc5\x32\xeb\x1e\x26\x2d\x7c\x3f\x61\xf0\xb4\x30\xd9\x68\xec\xa7\x5e\x84\xe5\x18\x2e\xb0\xb3\xc4\xd2\xaf\x38\x03\x1f\xf9\x72\x8d\x8c\xc1\x68\x61\xb2\xc4\xe6\xc8\x1a\x60\x72\x22\x49\xc3\x58\x30\x08\x31\xf3\xaa\x1b\x44\xc8\xa3\x35\x2b\x06\xcf\x0b\xd9\xff\xae\xa8\xa3\xc5\xc8\x98\xa6\xb1\x67\x8d\x29\xc1\x64\x21\xeb\x88\x41\x4a\xdf\x1a\x45\x1c\xd9\xc6\x0b\x93\x65\x6a\x15\x83\x89\xae\x8a\x0b\x8e\xe0\xc6\x74\x61\x32\x59\x6b\x33\x2a\x63\x2b\x1f\x53\x73\x2c\x0f\x69\x9b\x0c\x16\x2a\x15\xec\xae\x4d\x64\xb4\x31\x7f\xbb\x94\xf1\xc8\xe7\xb6\x68\xe1\x74\xcf\xa0\x85\x99\xca\x95\x2a\x06\x6d\x59\x95\x2d\x25\x07\xf6\x16\xba\x63\xb4\x74\xaf\xdb\x5f\x98\xcc\xf2\xc7\x31\x83\x83\x85\xc9\x64\xd9\x0e\x17\xb2\x61\x19\x1c\x21\xb5\xac\xc1\x30\xf8\x86\xad\x15\x8e\x38\xe6\xec\x78\x61\x32\x29\x0e\xd5\x19\x61\x06\x27\xd4\x3c\xa8\xa1\x30\x38\x5d\x98\x4c\x3c\x8f\x39\x36\xd0\x19\xa6\x25\x5c\x2f\x90\x65\x3f\x97\x59\x93\xaa\x34\x83\x0b\xec\x0e\x3e\x9f\x33\xb8\xa4\x8e\x81\x2c\x57\xf8\x21\x91\x72\x7b\xc0\xa0\xa3\x4a\x82\x43\x0b\xeb\xab\x8b\x3d\x09\x85\xac\x4f\x7d\xb1\xb7\x30\xd9\xc9\xd9\xce\x36\x83\xeb\x05\x89\x51\xad\xb2\x30\xb8\x59\x50\xc7\x57\x3a\x07\x83\xdb\x42\x4a\xd4\xbb\x17\x38\xa2\xd4\xa0\xbb\x5f\x98\x6c\x28\xe6\x09\x83\xf7\x32\x5a\xd3\x4e\x3d\xac\x09\xde\xd4\xe2\x4b\xd6\x91\xd5\x34\x19\x69\xc2\x09\x03\xbb\x29\x25\x48\x4a\x97\xc8\x9c\xa6\xc9\x22\x65\xc4\x66\x20\x9a\xea\x6b\x3e\xd9\x58\xfb\x4d\x1c\x00\x29\x7e\x6a\xc3\x6d\xa2\x78\x45\x55\x81\xc1\x40\xb2\x15\x84\x90\xd7\x44\xa9\x11\xab\x42\x3c\xe1\x27\xec\x10\x87\xc7\xb0\x89\xcd\x8e\x79\xf0\x31\xb1\x81\x08\x18\x8c\x30\xa4\xe7\x78\x06\x41\xd3\x64\xdc\x8f\x06\x9c\x41\xd8\x34\x59\xcb\x8b\x6d\xfc\x62\xd4\x2c\xb6\x26\x83\xe7\xa6\xc9\x44\x90\xc6\x1e\x16\x22\x96\x39\x40\xf9\x91\x60\x74\x9a\x9b\x19\xa4\x4d\xd9\x17\x48\x9a\x8f\x9b\x6a\x18\x25\x0c\x26\x4d\xd5\xcd\x63\xa4\x5d\x84\x1e\x09\xd6\x69\x93\x06\x3f\x15\xb7\x93\x86\x11\x83\x99\xac\x9c\x7c\x34\xcf\x9b\x99\x24\x66\xb0\x68\x66\xe2\xb2\x1d\xda\x63\x89\x6c\x62\x22\x33\x2f\x61\xb0\xdb\xd4\xdd\x8b\x41\x0b\xb1\xb1\xe0\xd8\xad\x31\x18\x45\x34\x49\xed\x35\x55\x47\xc0\xd9\x96\xc1\x3e\x56\x1b\x4e\xab\x0c\x0e\xf0\x43\x72\xfc\x77\x87\xdc\x64\x7f\x07\x95\xd3\x4f\x0e\x83\x9e\x02\x38\x83\x6b\x15\x9c\xcf\xe7\x73\x06\x37\x04\xcd\xb6\x77\x19\x1c\x36\x4d\x56\xa9\x32\xb8\x45\x54\xa5\x4a\x82\xd0\x60\x70\x47\xe0\xff\x56\x18\xdc\x53\x68\xb3\xc2\xe0\x08\x59\xb7\x2a\x0c\xde\x13\x6a\xab\xb2\xef\xf3\x64\x50\xb9\xf0\xf9\x5c\xc4\x95\xa3\x20\x49\xb9\xef\xab\x66\xe4\x3e\x37\x37\x58\xe5\x53\x85\x81\xe5\x23\xf7\x76\x85\xc1\xb7\x26\x05\xb6\x2b\x3b\x15\x06\x36\xa1\xcd\x0a\x03\x87\x42\x0f\x9b\x8f\x0c\x04\x05\xbf\x93\x01\xcd\xa9\x98\x95\x34\x1e\x8b\x06\x83\x3e\xa1\xb9\x1f\x0b\xee\xcc\xf3\x97\x5f\xc1\x25\xbc\x13\x0a\xe9\x73\x77\xc0\x27\xa2\xc2\x2b\x72\xc8\x56\xe4\x99\xcd\x1a\x83\xe3\xa6\xf9\xb1\xe2\x39\x26\xfb\x08\x03\x8a\x20\x93\x87\x8a\x35\x4e\x2b\x13\x11\x7b\x7d\x9c\xb0\x68\x49\x40\x6e\xd8\x2b\x0c\x3c\x9f\x9b\x1f\x2b\x61\x80\x9c\x26\x6b\x1d\x36\xaf\xba\x2a\x53\x55\x83\x7d\x84\x13\x2c\x48\x1a\x56\x18\x3c\x51\x82\x53\xbe\xf4\x26\x2d\x0c\x29\x81\xd9\xc8\x0f\x92\x7a\x32\x71\x71\x52\x4b\xa3\xfa\xa7\x4f\xd3\xe9\xb4\x36\xfd\xb5\x16\xc6\xee\xa7\xcf\xdb\xdb\xdb\x9f\x92\x89\xcb\x3e\x82\x5f\xe0\x9e\xf9\x5e\x30\x5c\xc7\xbf\xf3\xe5\xcb\x97\x4f\x44\x65\x7f\x7d\x84\xd3\xa6\xf9\x91\x55\x3e\xc2\x08\xa3\xb2\x0a\x29\x3d\x58\x46\xdb\x4f\x3c\xa7\xde\xfe\xfc\xdf\x56\x7b\xf7\xf7\xbd\xad\xe6\xde\xef\xed\xad\x9d\x1d\xbb\xbf\xf5\xe5\xf7\xdd\x3f\xb6\x7e\xfb\xed\xb7\xff\xfc\xe7\xd7\xff\xfc\xb6\xbd\xbd\xbd\xcd\x2a\x53\x5a\x02\xb3\x8f\x10\xc8\x44\x06\x72\x85\xc1\x3e\x42\x28\x11\x01\x1f\x09\x04\x23\x09\x26\xb1\x5d\xca\x98\x32\x77\xda\xe1\xe8\x93\xe7\x7e\xf2\xfa\xf1\xd7\x71\xec\x9b\x1f\x61\xe3\x59\xf1\x93\xea\xcc\x3e\xc2\x19\x65\x56\x2e\x46\xd9\x47\x88\x25\x39\xfb\xfc\x39\x92\xff\xfa\x08\x17\xf4\xfb\xe7\x27\xc7\x9b\xfc\xf5\x11\x12\xac\xda\x5f\x6a\xbf\xfc\xf2\x0b\x83\xcb\xa6\xc9\x7e\xc1\x3c\x43\x4a\x58\xcc\xff\xe7\x6d\x06\x57\x12\xdf\x67\xd0\xa1\x50\x7f\x9b\x41\x17\x43\x3b\xdb\x5f\x7e\xdf\xf9\x83\x41\x0f\x81\xcf\xf4\x8f\xc1\x98\xe2\xfe\xfa\xeb\xaf\x0c\xae\x9b\x32\x44\xc0\x8d\x04\xbe\x7c\x69\xb5\x18\xdc\x22\xf0\xdb\xaf\xf8\x1f\x83\x3b\x02\xe8\x1f\x83\x7b\x04\x7e\xff\xfd\x77\x06\xef\x55\x88\x80\x09\xa5\xfa\xdf\x2f\x5f\x7e\xe5\x0e\x83\xa9\x84\xfa\x5f\xf8\xef\x16\x83\x19\x41\x7f\x6c\xff\xb1\xdd\xef\x33\xe0\xbb\x26\xfb\xe5\xcb\x97\xdf\x7e\xfb\xf2\x85\x81\x25\x81\x2f\x0c\x6c\x15\x22\x60\x4e\x31\xbe\x58\x96\x83\x53\xac\x83\xa4\x16\xfd\x63\x20\x10\x68\xb7\x7e\xfd\xb2\xf3\x99\xc1\x82\xf8\xda\xed\x36\x83\x3e\xe2\xf7\xf6\xf7\x7e\x6f\xb7\x18\xb8\x08\xec\xef\x7f\xf9\x82\x95\x35\x90\x00\xfe\x63\xd0\xa4\x18\xfc\xb3\xfd\xdb\x1f\x7f\x30\xd8\x95\xd0\x97\x2f\x9f\x31\xd7\x2d\x09\x39\xff\x75\xfe\xfb\x85\x41\x5b\x42\x82\x7f\xf9\xef\x0e\x83\x3d\x82\xac\xff\xe2\x7f\x0c\xf6\x09\xb2\xbf\x7c\xd9\xc1\x12\x79\xf8\x01\xdb\xb6\x19\x3c\xed\x9a\x1b\x14\x24\xe8\x40\x72\x39\xf6\x7f\xff\xf8\x0f\x83\x43\x09\x89\x2f\x7f\xfc\xfa\x85\xc1\x11\x41\xce\xe7\xbe\xb0\xb6\x19\x7c\x93\xd0\xef\xd6\x17\xc7\x62\x30\xc4\xf4\x1c\x5b\x16\xf1\x58\x92\x04\xdf\xf9\x62\x31\x38\x51\x10\xdd\x2e\xfb\xe5\xfa\xf4\x84\x81\x8f\xdc\x62\x1b\xff\x63\x30\x22\x40\x08\x06\xa7\xc4\x29\x84\x10\xff\xb1\x18\x9c\x65\x10\xb7\x19\x9c\x67\x10\x72\x06\x18\xa7\x8f\x35\x75\x41\xf8\x7e\xdf\xb2\x7f\xfb\x9d\xc1\xa5\x82\x9c\x1d\xfb\x0b\x83\x2b\x05\xf5\xb7\x31\x8b\x1d\x84\xde\xa3\x04\xeb\x52\x68\x22\xe2\x84\x44\x5e\x0f\xc1\xff\x49\x18\x5c\xcb\xc0\xc7\xa4\xc2\x9d\x91\x17\x78\x49\x2a\x27\xb7\x4a\x75\x1c\x38\x22\xae\x38\x5e\x12\x8d\x53\x61\x30\xb8\x91\x9c\x7a\x38\x25\x38\x93\xdb\x34\x9e\xe8\xb9\xb4\xe4\xd3\xff\xd0\xff\x0c\x6e\x91\xf1\xc3\x38\xfa\xce\xe0\x4e\x07\xbf\xa7\xa8\x26\x7e\xa7\xa7\xb0\xbe\xe3\xc0\x63\x70\x8f\xb4\x8f\x06\xed\xaf\x55\xff\x0e\x2a\xf8\x2f\xdb\x72\x88\xd5\x0e\x89\x51\xf9\xa1\x48\xf4\xd8\x24\x83\xf7\x14\xeb\xf1\xd5\x68\xfc\x1d\x10\x25\x37\x64\xc5\x7c\x5a\xba\xc8\x57\xcd\x22\x93\x0b\x8d\x37\x37\x12\xab\x1f\x19\x6c\xf0\x11\x37\x3f\xea\x6c\x54\x2a\x8e\x9a\xf6\x70\xbd\xac\xf4\xe8\xdd\xf9\x91\x53\xfd\xfb\x63\x29\x81\xbf\x3f\x1a\x46\x2d\x8b\x44\x59\xc8\xb2\x5e\x3a\xc4\x58\x35\xa0\x22\xdd\xc5\x68\xee\x57\x15\x7c\x55\xe5\x50\xf9\x4b\x44\x7a\x1e\x9c\x84\x3c\xdb\x66\xad\xae\x94\x4b\x46\xfc\x7b\xf6\xab\xfd\x29\xb1\x63\x2f\x4a\xff\xfa\x3b\xa8\xfc\xf9\x69\x20\xb8\x43\x21\x2b\x74\xe6\x18\xa8\xfc\xe9\x78\x13\x9a\x4b\x4a\x79\xce\x44\x1d\x89\xb4\x7a\xe5\x3f\xdb\xdb\xd1\xac\xa1\xe4\xa9\x06\xb5\x64\xa3\x94\x55\x82\x7f\x7e\xc2\xc5\xce\x5f\x1f\xc1\x1a\x71\x93\x19\x95\x4c\xd1\xab\x32\xb0\x11\x05\xdb\xc0\xc0\xc1\xd0\xd6\x16\x03\x41\x81\x1d\x94\x7e\xd1\x8c\x41\x3f\x03\x11\x72\x09\xe2\x4a\x8d\x1b\x10\x64\xb9\x0c\x3c\x19\x1a\xa7\x29\x69\xad\xe1\xae\xc9\xb6\xb2\xb5\xd8\x13\x11\xed\x81\xb0\x87\x56\x38\x63\x30\xcc\x61\xd4\xcd\x7d\x09\x2a\x65\x7d\xcb\x17\x7d\x5c\x7a\x96\x91\xb1\xd4\x6b\x23\x4a\x57\xeb\x9a\x1b\xcf\x08\xaa\xd1\xca\x20\x26\x48\x19\x70\x18\x24\x04\xc6\x61\xe4\x84\x53\xd4\xe2\x28\x41\x5a\xe4\x22\x35\x24\x70\xe0\xb9\x03\x5f\x25\x2d\x11\x61\xec\x2d\xc2\x20\xe5\x3e\x83\x67\x85\x99\xa0\xb2\x9f\x62\x6a\x5e\x10\x88\x78\x8b\xca\x10\x13\x71\xc4\x5d\x06\x09\x05\xc3\x08\x55\xc7\x31\xb2\x85\xe3\x54\xb3\xa5\x44\x8b\x53\x9f\xc1\x98\x82\xf9\xaa\x7f\x42\xb0\x52\x5f\xa7\x39\xb0\xa5\x56\x77\xb3\x02\xca\x89\xb9\xeb\xca\xed\xe2\x79\x01\x2d\x95\xf7\x05\x61\xc6\x41\x56\xa1\x4d\x85\x70\x44\x2a\xe2\x11\x2a\x0b\x0c\x76\x09\x37\x11\x71\xea\xd9\x58\xb8\x16\xc1\x53\x61\x0d\xbd\x74\x6b\x9c\x88\x58\xe5\xac\x1e\x84\x01\x6a\x43\x6d\xa4\xd7\x6a\x9f\x6a\xb5\x4f\x64\x20\x49\x3e\xa1\x96\xbc\x35\x4e\x3d\x9f\xc1\xde\x0a\x51\xfe\x30\x98\xec\x9a\xac\xf6\x89\x5b\x28\x8e\xec\xf4\xbb\xb2\xad\x4c\x09\x6b\x2b\xc5\x79\x46\x90\xf0\x7d\x2f\xc2\x72\xee\x53\x62\x9f\xd4\x3d\xa1\x39\x11\x71\x79\xc6\x60\x41\x61\xb9\x7a\x39\x90\x5c\x08\xa8\x4c\x6c\x34\x89\x2c\x95\xf7\x43\x49\xd6\xd9\xd8\x25\x52\x32\x71\x15\x6f\x8b\x60\x59\x5d\x47\xc4\x5a\x58\xd8\xd5\x18\x7c\x23\x9c\xeb\xf5\x19\x1c\xcb\x20\xae\xb9\x50\x8e\xf4\xe3\x70\xc4\xe0\xa4\x8c\x4c\x43\x06\xa7\x65\xd4\x6c\x87\xc1\xd9\x12\xea\x33\x83\xf3\x32\x6a\xbe\xc3\xe0\x62\x09\xf5\x99\xc1\x25\xa1\x9e\x12\x06\x57\x14\xf2\x2d\x9f\x41\x87\x82\xda\x28\xd2\x25\x88\x24\x00\x83\x1e\x01\x29\xad\xef\xaf\x31\xfc\x49\xca\x72\xa5\x2c\xf1\xc8\x4b\x72\x01\xcf\xe0\x86\x58\xfe\x62\x70\x4b\x01\x3b\x8c\x05\x56\x64\x2a\xe2\x00\xe5\x7e\x7b\x57\x23\xd3\x30\xc4\x25\x7f\xcd\x4e\x12\x06\x7b\xbb\x26\xdb\xae\x6c\x33\xb8\xc3\x58\xa8\x51\xff\x56\xf9\x8d\xc1\x3e\xa2\xff\x87\xc1\x3d\x61\x51\x73\xda\xdb\x66\xf0\x1e\xa1\x9d\xda\x1f\x0c\x78\x80\xa1\x4f\x0c\x0e\x76\x4d\xb6\xb3\x8d\xac\x16\xa1\x3e\x47\x69\x05\xd7\xfe\x49\xe5\x4c\x4c\x2b\x57\xe1\x88\x07\x0c\x0e\x91\xe9\x3f\x28\x59\x8e\x30\x24\x70\x4a\xfe\x86\x21\x44\xd9\x14\x2f\x9a\x55\x92\xd0\xf7\x9c\x8a\x17\xf4\x43\xd9\x84\x1b\xc7\xbb\x26\xfb\xcc\xc0\x41\x86\xcf\x52\x32\x9d\x20\xca\x61\x70\xba\x6b\xb2\xdf\x18\x08\x24\xfd\xf6\x79\x7b\x93\x41\x9f\x82\x5f\x6a\x5f\xbe\xfc\x0f\x03\x17\x81\xff\xd4\xfe\xc3\x60\x40\x21\xcc\x9f\x47\xa1\xcf\xff\x61\xf0\x44\xa1\x5f\x77\x18\x0c\x65\xe8\x73\x6d\x9b\x81\x2f\xc3\xbf\xd6\x76\xfe\x5b\xfb\xc2\xe0\x6c\xd7\x64\xbf\x33\x38\xdf\x35\xd9\x7f\x19\x8c\x90\x88\xca\xd7\x1f\xdb\x0c\x02\x04\xbe\x60\x9c\x90\x42\x98\xfa\xc5\xae\xc9\xea\x15\x06\x11\x62\xea\x23\x06\x97\x88\x18\x8d\x18\x3c\x13\xe6\x85\x41\x8c\x81\x06\x6d\x55\xd4\x2b\x4a\x63\x6c\x48\x73\x45\x7d\xbb\xd1\x0f\x83\x74\x8b\x5a\xbe\xce\x20\x21\x56\x42\xc9\x9d\xd4\x3a\x83\x94\x70\x03\x0d\x8e\x09\x44\xb1\xd5\xf7\xc3\xe9\xd6\xbc\xce\x60\x42\xa8\x24\x0d\xa3\xad\x30\xe2\xb6\x97\x22\x72\x4a\x48\xac\xd1\x2d\x47\xd8\xa1\xd4\x1f\xea\x0c\x66\x84\x97\xb3\x0c\x83\x39\x42\x7f\x56\x18\x5c\xed\x9a\x4c\xcd\x29\x0c\x3a\x04\xe0\x4c\xc3\xa0\x4b\x61\x9a\xc6\x18\xf4\x24\x80\x13\x0e\x83\x6b\x02\x7c\xef\x2f\x06\x0b\x4a\xe6\x93\x5c\xfc\xfc\xc5\xa0\x19\xd0\xea\x30\x9f\x0b\x19\xdc\x10\x77\x12\xf1\x00\xbb\x2a\x01\x29\x26\xb9\x2b\xa3\xa6\x83\xbf\x18\x6c\xb4\x14\x10\xff\xf5\x77\xc0\xa0\x1d\x70\xf3\xe3\x9f\x5f\x67\x23\xbf\xa2\x54\x24\xec\x85\xdb\xec\xeb\x5f\x1f\x61\x8f\x68\x98\xdf\x8a\xac\x4a\xb5\x14\xd8\x66\x0a\xd6\x2b\x91\x6d\xf6\x11\xf6\x29\x59\x35\x95\xfc\xc5\xe0\x80\x22\xeb\x79\x98\xc6\x51\x33\x16\x3c\x5f\x38\x1c\x96\x18\x62\x81\x4a\x97\x88\x93\x9c\xe1\x88\x18\xc4\xc8\x12\x0e\xdd\x22\xa4\x35\xb6\xaf\x16\x81\x9f\x66\x5b\xc9\x20\xb4\x87\x53\x3e\x11\x5b\x7d\x5c\xe1\xaa\x85\xcf\x47\xb8\xc3\x82\xab\xca\xfc\x46\x69\x60\x65\xaa\x75\xdb\xc4\x64\xe3\x38\xa8\x27\xf6\x40\x8c\x78\xb2\x35\xf2\xec\x38\x4c\xc2\x7e\xba\x65\x87\xa3\xfa\x64\xe4\xe3\x02\xe7\x78\x29\xd2\xdb\xcb\x3c\xb2\x81\x7e\x84\x93\x2c\x02\xa9\x0d\x5a\x1f\xa9\xfc\x49\x93\xcc\x5f\x07\x24\x53\x2a\x25\x55\xa6\xd2\xbc\x38\xfa\xf3\x93\xa4\x13\xab\x6c\x44\x55\x50\xec\x52\x9f\x9e\xf8\x84\x4b\xec\x4f\xd7\x74\x4f\x09\x8f\x3c\xf6\xd7\x92\x56\xf4\x0f\x09\xfe\x55\xd4\xbc\x70\xc9\xbc\xaa\xdf\x41\xe5\xef\x8f\x3b\xf8\xf3\x23\x52\x17\x73\xeb\x95\x87\xbf\x3f\x7e\x84\x8d\x53\x2a\xae\x47\xe6\xa6\xc2\xea\x91\xb0\x6a\x6d\x2e\xd7\xf1\xe7\x84\x8a\x78\xcc\x47\xd9\x22\xf5\x62\x05\x47\xad\x37\xe1\x71\x52\x58\x7b\x5e\xae\x70\x8d\xc2\x89\x27\x0a\x1c\x57\xc4\xf1\xf3\x42\x7e\x84\x8e\xe4\x8a\x78\xa0\x33\x2a\x65\xc4\x47\xb8\xc7\x5e\x42\xb8\xbf\x2a\x93\xbf\xff\xae\xff\x6f\xe5\x47\xc5\x12\x03\x3e\xf1\xc2\xb8\x3e\x8e\xfd\x6a\x71\x11\x63\x34\x5e\xff\xfc\x24\x99\x19\xbc\xc7\x98\x34\xae\xba\xd4\xe7\x69\x58\xf1\x96\xf9\x11\xb3\x65\xb5\x4c\xd6\xac\x30\xe8\x21\xa9\x29\xdf\x53\xae\x31\xb8\x96\x60\xca\xad\xb1\xcf\xe3\x4a\x2c\xa2\x58\x24\xda\x26\x58\x09\xfb\x95\x74\x20\xe4\x93\xcb\x5e\x40\x61\x1d\x51\x60\x7a\x5d\x06\x37\x94\x80\xd2\x0a\x3a\x29\x4f\x93\xd3\xd0\x11\x3e\x83\x5b\x22\x90\x3a\x79\xcb\xe0\x8e\x20\xc7\xa9\xa4\x61\xc5\x93\xfd\x8e\xc1\x3d\x21\x7d\x5f\x7e\x40\x1a\x5c\x12\xfd\xd1\x84\x1a\x51\xc4\x9e\x48\xb2\xa7\xee\x8a\x24\x8a\x23\x27\xca\x8d\xf7\x59\x42\x64\xbb\xf9\xc7\x08\x7d\xcc\x3c\x0e\x7a\x70\x29\xe4\xa1\xde\xc4\x43\x6e\xb2\x5d\x06\x83\x96\xc9\x76\x9b\xad\xe3\x83\xab\xf3\xde\x59\x9b\x81\x45\xf8\xf3\xf6\x1d\x03\x0f\x49\xd8\x21\xc0\x26\xa4\xe7\xfb\x52\x0d\x6e\x99\xac\xc5\x60\x88\x3f\x7b\x27\xb8\xb4\xc4\xd0\xf9\x49\xef\xf4\x8c\x81\x83\xac\x12\xf8\x7e\x74\xd6\xde\xbb\x65\x30\x22\xf2\x29\x83\x16\x05\x7a\x67\xdd\xab\xa3\xbd\x0e\x03\x41\xac\x3c\xb0\xb1\x02\xfb\x04\x60\x75\x57\x42\x6d\x33\x76\x09\xa7\xb4\xad\x01\x01\xbe\x67\x0f\x19\x78\x59\x18\x6b\x58\xcc\x22\x1e\x38\x95\x92\x89\xfb\x49\x72\x90\x02\x3a\xa4\xb0\xb4\x52\xb7\x5b\x14\xc4\xaa\x67\xb0\x47\xc0\x28\x0a\x03\x11\xa4\x99\xc5\x4c\xc9\x40\x54\xe8\x65\xc4\x20\x49\x7f\x30\x18\x49\x20\x9a\x6f\x5d\xf0\x44\x3d\x9d\x5a\xb1\x43\x47\x60\x16\x78\x50\x39\xec\x9e\x9e\x54\x22\xee\xe2\x4a\x99\x58\xc7\x71\x2c\x82\x14\x67\xcc\x10\xe1\xf6\xf9\xe9\x69\x38\x4e\x44\x87\xb6\x9d\x19\x44\x84\xc4\x56\x92\xaf\x60\xe9\x1e\x51\x63\xf0\x9c\x91\xa8\x65\xd5\x5b\xd5\x15\x9e\x56\x7c\xc1\x93\xb4\x92\x4e\x8b\xdc\x1b\xfb\x2d\xc5\x4d\x6b\xdc\x8a\x57\x32\xaf\x31\x88\x29\x35\xcb\x57\x75\x97\x10\x18\xf3\xa9\x17\xb8\xdf\xf7\x51\x78\x7c\x67\x90\x22\x72\x8f\xdb\x03\x39\xb2\x13\x95\x7c\x65\xc4\xe7\xd8\xb1\xfa\xa1\xef\x87\x53\xe1\x54\xac\x79\x25\x0c\x44\x25\x8c\x29\x0f\x79\x8d\x67\xd9\xd1\x11\x03\x3a\xff\x5e\x61\x30\xa6\x94\xb5\x8e\x7c\xd0\x32\x19\xd9\x8c\x27\x84\x0e\x9c\x6e\x48\xe0\x94\xc0\x38\x0e\xe3\xca\x74\xe0\xf9\x82\xac\x8e\x5e\xe0\x56\x94\x64\x61\x30\x23\x8e\x59\x14\xc6\xa9\xec\xdb\x3c\xa9\xb4\x3a\xd7\x0c\xe6\x6b\x08\xd8\x16\x0c\x16\x21\x37\x3f\xee\xd3\x0d\xba\x8a\x2b\x42\x3b\xa4\x14\xd9\x47\x68\x62\x94\x7d\x2f\xa6\xba\x95\xe5\xd4\xaf\x4b\x96\xed\xa1\x0c\x76\xd7\xb3\xea\x26\x71\x78\x2a\x00\xab\x03\x03\x15\xec\x85\xa9\x37\x12\x35\x06\x2d\x8c\x77\x70\x7d\x74\xdf\xbc\x6a\x55\x18\xb4\x25\xe8\x2d\xb0\x75\x0e\x62\xc1\x51\xa8\xec\x11\x32\xcb\x58\x5f\xe6\xb4\x1f\xc6\x15\xae\xa5\x44\xa4\x0c\xe8\xfb\xc4\xba\x66\x02\x63\xb0\x71\x90\xd3\xbe\x2f\xd1\x0e\x89\x24\x17\x24\x47\x18\x3e\xdc\x6b\xb6\x19\x7c\xa3\xe0\x61\x7d\x34\xaa\x9c\x9e\x9e\x9e\x56\x1c\x07\x94\xad\xfb\x38\xa3\xd4\x51\x75\x3e\x29\x82\xb5\x4e\xa7\xc3\xe0\x94\x50\x54\xbf\x67\x14\x44\xfd\xec\x28\x60\x70\x9e\x41\xe7\xe3\x94\xc1\x05\x82\x47\x72\xf7\xf3\x12\xc3\xdf\xb2\x19\x81\x46\x0d\x83\x2b\xc2\x26\xf2\xfc\x67\x85\x8e\x9b\x57\xaa\x34\xa0\x7e\x61\xd0\x41\xe2\x49\x85\xc1\x61\xcb\x64\x27\x47\x0c\xba\x84\xc0\xde\xaf\x5a\xa8\x6c\xc8\x16\x41\x38\x76\x07\x65\xd1\x5a\x1d\x79\x49\x42\x4d\x0e\x47\x98\x0a\xad\xc5\xbe\xa9\x50\xc2\xa0\x87\x49\x9e\x56\x18\x5c\x53\x60\xaf\x7b\x75\xde\x61\x70\xdc\x32\xd9\xe9\xe9\x29\x83\x13\x19\x28\x56\xcf\x0d\x31\x6a\x39\x78\x4b\x10\x8e\xe9\x36\xad\xcc\xef\x32\xb8\x17\x31\x38\x6d\x99\xec\x4c\x3e\xe0\xcf\xe0\x1e\x49\x0a\x92\xa3\x34\x8a\xc3\x89\xe7\x90\xf9\xfb\x3d\x12\xcf\x8f\x19\xf0\x08\x03\x81\x2f\x07\x59\xa1\x2c\x95\xa9\x97\x0e\x2a\x71\xe8\x8b\xca\x47\xb5\xb6\xf9\x58\x89\x44\xac\x67\x0c\x2f\xc1\x2e\x83\x23\x94\xc1\x86\x45\xa9\xa4\x03\x5c\xed\xdb\x18\xbe\xb8\x3a\xbf\x3e\x3a\x6b\xa1\xc8\x75\x08\xa6\x85\xe8\x59\xcb\x64\x17\x9e\x60\x20\x08\xe7\x8f\x5d\x6c\xc5\x3e\x01\xb1\x98\x78\xe1\x38\x51\x99\x77\x8b\x38\x94\x67\x03\x89\x08\x47\x5e\x22\x2a\x36\x49\x81\x4a\x2c\x92\xd0\x9f\x90\x30\xf4\xd2\x44\xf8\x7d\x06\x1e\xb1\x8d\x2d\xdf\x4b\x06\x88\x9f\x0a\x4b\x09\xc8\x27\xa4\x5c\x8e\xb9\x13\xeb\xba\x1c\x22\xe6\x6a\xef\xe0\xe8\xfc\xac\xc3\xe0\xbc\x65\xb2\xab\xf3\x1b\x06\x17\x32\xa0\x67\x12\x9f\xb8\xe4\x96\xbe\x0c\xd2\xed\x68\xe1\x54\x46\x3c\xca\x7b\x84\x98\x79\x09\x0e\xb0\x80\x78\x50\x39\x56\xb2\x2f\x44\x44\xa7\xc7\x20\x92\x81\xdd\xec\x8b\x97\x2d\x82\xbb\x77\x17\x7b\x0c\xae\x10\xb0\x69\x61\xc9\xe0\x99\x58\xb5\x18\x8a\x15\x44\x22\x3c\x21\x00\x97\xea\x4b\xdf\x96\xea\x83\x97\x54\xc8\x18\x50\x63\x90\x4a\x4e\xa5\x29\xcb\xbd\x20\x06\xe3\x12\x96\x90\xb5\x32\xc8\x60\xf2\x8f\x3c\x35\x06\xd3\x88\x9b\x1b\xff\xc0\xf5\x3b\x83\xd9\x3f\xa7\xf5\x5f\x06\x73\xe2\x22\xe7\x33\x4d\xb9\x5b\xb8\xc8\x31\x07\x31\x8f\x06\x9e\xcd\xa0\x83\x75\x24\xb7\x36\x9b\x44\xc6\x30\x49\x40\x11\x38\x4a\x6e\x65\x62\xf5\x73\x9b\xc1\x6e\xc6\xa5\x64\x7e\xab\x80\x50\x29\x75\x5b\x26\xeb\xb6\x19\xf4\x5a\x7a\x03\xbc\x8d\x4c\x5d\xd4\xc4\xd4\xa0\x46\x95\x26\xaf\x6d\xf2\x64\x22\x95\x9e\x71\x14\xd1\xfd\x26\x39\x6e\xfa\x74\x83\xab\x56\xe9\x08\x91\xd9\x52\xe5\x4c\x85\xf2\x35\x67\x96\x7c\x38\x8d\xee\xe9\x2f\x95\x14\x70\x3d\x9b\x4a\xd5\x60\x2e\xb0\x5b\xed\x13\xa7\x3c\x58\x8e\x04\x7b\xa0\xc4\xf6\xca\xa4\x75\x8d\xe5\x08\x19\x1c\x50\x0c\x54\x2c\x7c\x2f\x10\x28\xd5\x24\x42\xf7\xfe\x23\x04\x7b\xc7\x0c\xbe\x51\xe0\x84\xc1\x4d\xcb\x64\xbd\x0e\x83\x5b\xfa\xdd\x62\x70\x4c\x94\xee\xfe\xd6\x1f\x0c\x4e\x28\x4c\x07\x1f\x70\x5c\x25\x22\xad\xc8\x33\x13\x15\x5b\x6b\x33\x0c\x36\x4e\x25\x97\x98\x45\x64\xa8\x2b\xcf\x6c\x28\x69\xe9\xf7\x17\x06\x67\x92\x71\x18\x84\xd3\xa0\xe2\xc6\x3c\x40\xe5\xd8\x4b\xe7\x35\x06\x77\x2d\x93\xd1\x0d\x0d\x06\xe7\xc8\x75\xbd\x76\x03\xf0\x02\x49\x37\x4d\x06\x97\x14\xa0\x03\x2e\x49\xa5\xb5\xc7\xe0\xbe\x65\xb2\x5b\x06\x57\x88\xbf\x63\xd0\xa1\xdf\x70\x1c\x57\xac\x38\x9c\x26\x22\xce\x5b\x52\x35\x89\xd4\xb8\x13\x06\xef\x5b\x26\xfb\xce\xa0\x8b\x31\xbe\x37\x77\x3b\xdd\xab\x66\xab\xfb\xfd\x6a\xef\xac\xbd\x77\xb5\x77\xf5\xfd\xa8\xfd\x9d\x41\x8f\x88\xdf\x19\x5c\xcb\x40\xfb\xa8\x73\xd1\xeb\xee\xb5\x11\x75\xb3\x8c\x6a\xe2\x88\xbd\x95\x58\x2f\x48\x45\x1c\x70\xff\x3b\x83\x3b\xc2\xd8\xca\xd8\x9d\x7c\xaf\x31\xe0\x6d\x93\x7d\x57\x06\xd6\x13\xb5\x13\x6f\x21\x4e\xdb\x3c\x35\xf2\x9e\xe2\xa6\xba\x5d\x19\xbc\x47\x84\x2c\x81\xb2\x21\x33\xe0\xcf\x39\x2e\x37\x1d\x5b\x45\xac\xbe\xf2\xc4\xc0\x5e\x42\xc7\xa1\xcf\x60\xc3\x29\x62\xe9\x0e\x4f\x96\xba\x28\x90\xfa\x3e\x4f\x33\x82\xdd\xce\xf0\x5e\x80\xb9\xdb\xb2\xfc\x10\x65\xa0\xb3\x9e\x50\x61\xd0\x2f\xa4\xe5\x7b\xc1\x30\xff\x48\x1e\x65\x24\x82\x31\x03\xb7\xc0\x89\x98\x8c\x73\xb0\x44\xc0\x35\x38\xf9\x07\x5d\xc2\x7b\xa9\x18\x31\x78\x5a\x83\xdd\xe2\x36\xad\x07\x86\xeb\x68\xa3\x40\x8c\xc2\xc0\xb3\xb7\x12\x81\x8b\xd2\x14\x35\xfa\x7e\x39\x73\x05\x8a\x5f\x4c\x22\x74\xb8\x1f\x85\x11\x6a\x42\x1b\x6e\x1e\x25\x54\xa6\xfd\x51\x81\x57\xe2\x0a\x16\xee\xa0\x40\xd4\x47\xca\xc2\x12\x2e\x9e\x88\x98\x80\x2d\x6f\x44\x33\x5c\x54\x24\xfb\x9e\x23\xe2\x82\x45\xff\x79\x0d\x31\xe6\xae\x4b\x47\xd2\xe2\x55\x62\x3a\x18\x8f\xac\x02\xcb\xa0\x9d\x1f\x47\x4a\x90\x5d\x02\xc9\xa9\x08\xc6\xd9\xc9\x4f\x94\x9f\x1d\x69\x66\x4d\x97\x79\xd2\x9c\x36\x5e\xa2\xed\x05\x74\x5a\x6f\xb2\x0e\xad\x66\xd1\xe9\x3a\x5a\xa6\x07\xce\xde\xa4\x92\x5e\x38\xd7\xe4\x09\x1d\xdf\xf0\x54\x51\x26\xc2\x11\x89\x2d\x02\x87\x93\xec\x7a\x6a\xd3\x81\x11\x06\x0b\x62\x77\x1c\x3a\x25\x92\x54\xa4\xd9\xb4\x49\x48\xc1\x60\x97\x02\xfd\x54\xc4\x03\x0f\x55\xca\x56\x06\x27\x83\x70\xca\xa0\x4d\x70\xee\x33\xba\xcb\x63\x57\xa4\x0c\x86\x98\xbc\xef\xcb\xbb\x67\x9d\x71\xbf\xef\xcd\x18\xec\x11\x33\xaa\x51\xd9\x1d\x44\x3a\xe0\xc7\xe3\x39\xd6\x65\x6b\xdc\x0f\xfb\x7d\x06\x3e\xc5\x9d\xf2\x39\xaa\xe5\x32\x0a\x02\xe7\xe3\x34\xa1\x3c\x1c\x10\x2e\xa0\x25\xff\xa1\x0c\x7b\x23\x2a\xeb\xa8\xad\x01\x6a\xb9\xa0\x08\xd6\xf2\x43\x3d\x47\x79\x24\xba\x87\xc9\x13\x6a\xf4\x6f\x65\xf4\x88\xcf\x68\xf1\x96\x5c\x88\xb8\x23\xec\x10\x67\xd4\xe3\x12\xcb\x9e\x8a\x78\x52\xc2\xf6\xbd\xc0\x43\xbd\xe2\xb4\x8c\xc5\xa4\x34\x29\x6c\x17\xcf\x8b\x31\x38\x93\xac\x1a\x51\x63\x70\x5e\xc6\xa8\x7e\x71\x51\xc6\x66\x3d\xe2\x72\x0d\x9e\xfa\xc2\x55\x99\x90\xd4\x96\xaa\x72\xa3\xb3\xcc\x60\x85\x33\xd5\x6f\xbb\xcb\x24\x3a\x80\xb9\x9c\x42\x6f\x3d\x57\x9e\xcc\xf5\x7a\x86\x81\xe7\x0e\xc8\x79\x24\x4f\x52\x06\x37\xeb\x99\x92\x54\x8c\x94\x59\xe1\xf6\x6d\x8e\x13\x11\xb8\xa8\x6f\xdf\xbd\xc5\x42\xf9\xb8\x5f\x4f\x2d\x0c\xd4\xf7\x2b\x1c\x34\x9f\x17\xca\xc2\xe3\xf5\x1c\x85\x7c\x5a\x3f\x61\xd1\x19\xb5\xdf\xe4\xa1\xaf\x38\x6f\x90\x0b\x59\x15\xcb\x2c\xe5\xea\xec\x2f\x93\x0b\x19\x74\x63\xd4\x64\x97\x89\x3a\x6b\x83\xd5\x98\xf4\xc1\xa8\x5d\x46\x17\xf2\xf2\x5c\x22\x49\xf9\xe1\xc9\x64\x52\x8f\xfb\x1e\xa7\x5d\xd4\x27\x89\x99\x33\x88\x91\x3f\xb6\x19\x24\x6d\x79\xb0\x8c\xc1\x90\x88\xb1\xe0\xa8\xc8\x2b\xec\xb9\xdc\x7d\x60\xe0\x4b\xa2\xc7\xb7\x56\xc5\xd8\xb8\xad\x48\x03\xcf\x71\x44\xc0\x60\xa2\x11\x74\xc0\x8f\xc1\x54\xc1\x3e\x83\x11\xa5\x93\xa6\xdc\x1e\x28\xfd\x38\x28\x62\x94\x82\x3c\x6b\xeb\x33\x70\x21\x51\x67\x5e\xb2\xbb\x7c\x10\x33\xd2\x14\x52\x53\xb4\x2b\x03\x5c\xc9\x68\x42\xd7\x4b\x7d\x91\xe4\x67\xef\x62\x4d\x48\x69\x1c\xcf\xdb\xe5\x03\x81\x09\x92\x73\xc4\x96\x2d\xbf\xb3\x68\xaf\x39\x05\xda\x5c\x45\xd2\x35\x38\x06\xa9\x4c\x25\xae\x31\x18\xab\xa0\x3a\xfe\xba\x4b\x71\xe2\x84\xc1\x46\x8b\x82\x89\x90\xea\x54\xbb\x00\xa9\xf4\xf7\x10\x25\xfa\x61\x2c\x70\x3a\x64\xb0\x9f\xc1\x72\x06\x38\xc8\x60\x39\x03\x4c\xe8\x53\x82\xce\xcb\x4e\x29\xdc\xc7\xff\x18\xcc\x08\x70\x19\x1c\x62\x8c\x81\xcb\xe0\x88\x02\x09\x83\x6f\x18\xf0\x39\x56\xc5\x31\x05\x51\xfd\x3d\x69\xeb\x13\xb1\xa7\x18\x0a\x7d\x87\xc1\x9c\xd2\x08\x7d\xa7\xc2\xe0\x8c\xb0\xea\x70\x7e\x16\x96\x9b\xe7\x0b\xc9\x87\x88\xfa\x76\x43\xef\x5d\x6f\x71\xdf\x73\x83\xba\x15\xa6\x69\x38\x6a\x30\xb8\xa0\x58\x08\x30\xb8\xcc\xc2\x5b\x49\xc4\x6d\xc1\xe0\x2a\xc7\x60\x02\x0c\x3a\x19\xe2\xbb\x3c\x69\xd0\x94\x5f\xa1\x26\xeb\xb6\x55\x30\x61\xd0\xa3\xf0\x8c\xc1\xae\x64\xd0\xe2\xa2\xa5\x40\xd5\x0a\x6d\x05\x8a\x84\xc1\x35\x46\x89\x19\xdc\xe0\xef\xd8\xa2\xfd\xfa\x3d\xa2\x13\x50\x0b\x75\xef\xdf\x2f\x20\xe5\x39\x58\x06\x07\x05\x5c\x61\x20\xde\x66\x69\x25\x0c\xee\x08\x90\x3a\xe3\x7d\xdb\xdc\x60\xd6\xc4\x65\xf0\x1e\xb1\x93\x84\xc1\x21\x26\x81\x3a\xf9\xd1\x68\x24\x1c\x8f\x66\xcf\x23\x8d\xb3\xa8\x65\xf8\x1e\x42\xd2\x76\x6c\xc9\xb0\xe3\x0b\xd5\x83\xbf\x49\xde\x0c\x53\xeb\x73\xba\xd1\xa4\x3a\xd1\xf1\x32\x79\x40\xf6\xcd\xa3\xe4\xca\x53\x53\xe6\x32\x43\x4c\x04\x15\xdd\x2e\x7f\x2e\x61\xe0\x48\xcc\x84\x27\x0c\x04\x85\x53\xe1\x86\xa8\x47\x9d\xca\x94\x24\xa8\xe6\xc9\xb3\x22\x2e\xb7\x9f\xad\x60\x69\x8e\xec\x17\x92\xa3\x55\x35\x03\xb7\x80\x4a\x44\x80\xa3\x78\xe2\xa5\x73\x29\xac\x2e\x28\x19\x75\xb2\x6c\xb0\x27\x0f\xc2\x33\xf0\xf6\xf2\x7b\x1f\x97\xc4\x42\x40\x76\xb2\xb8\x49\xe3\xb5\x4d\xf6\x9e\xa7\x3d\x52\x40\xe9\x28\xfd\x50\x86\x63\x6e\x53\x54\x7f\xaf\xb8\x89\x08\xa3\x22\xb8\x7c\xa9\x8d\x41\x50\x22\x0f\xd4\x99\xee\xb0\x84\x95\x7d\x77\x23\x2a\x21\xe9\x88\xf0\x73\x09\x35\x95\xbd\xf4\x2a\xd6\xda\xb1\xaa\xcc\x4e\x86\xc8\x4d\xdc\xdd\x1c\x47\x42\xa2\x57\x82\x49\xb8\x5e\x97\x50\x4a\xba\xde\x64\xc8\xac\x55\x6e\xcb\x28\x6a\x92\xbb\x0c\x57\x30\xfe\xdd\x97\x91\xa7\x74\x50\xfe\x7d\x19\xd9\x8b\x18\xf0\x44\xa3\xb2\xa3\xf1\x56\x86\xba\xf0\x02\x1b\x67\xe0\x32\x82\x32\xec\x94\x71\x2a\xc7\x22\xc3\x16\xcd\x5c\xfd\x0c\xab\x2d\x55\xb1\xae\x4b\x79\x97\x22\xd1\xa0\xec\x33\x6e\xc6\x2f\x1c\x8f\x96\x4e\x29\x31\xd8\x21\x83\x81\xa4\x39\x0c\x3c\x15\xf2\x19\x3c\xc9\xa0\xc0\x8f\x8d\xf7\x54\x90\x64\xcc\x44\x43\x38\xab\x0e\x25\x1b\x2a\xcd\x32\x84\xf3\x9c\x0a\x39\x0c\xa6\x7b\xe6\x06\xb3\x51\xe2\xce\x28\x56\xca\x20\x90\xd4\x14\xbb\x89\x0c\xce\x7c\x06\x91\x0a\xe2\xf2\x01\x39\xd5\x8e\xd0\x62\x4f\xdd\x5f\x72\x44\x9f\xc1\x33\x31\xf9\x82\xe3\x2c\x44\x14\x2f\xda\x92\x67\x6e\x62\x49\xf2\xa2\xac\x0f\x26\x19\x46\xf5\xab\x34\x43\xcc\x18\x8c\x33\x00\x57\x42\x1a\x90\x66\xd3\x5d\x95\x74\x84\x05\x9c\x4a\x5a\x88\x93\x55\x6b\x2f\xbb\xcf\xd2\xd6\x41\xe7\x62\xc0\x11\xb1\xb7\x47\x3b\x9e\x5b\xb1\x90\x37\x73\x66\x14\x4f\x9d\x09\x63\xb0\xbf\xa7\x36\x44\x19\xcc\x15\x25\x8c\x3f\x33\x58\x64\x40\x73\x46\x27\x61\xe4\x6d\x81\x66\x19\xed\x0b\x57\x04\x4e\x4d\xee\xb8\xc8\xe9\x9e\xc1\xee\x5a\x9e\x28\x9b\xf2\x5b\x6b\xe9\x05\x71\xdd\x2e\x33\x8c\xf8\x4c\xd9\x81\xf6\x96\x08\x5e\xa0\x08\xfb\x65\x82\xbe\x6f\x75\xb0\x0e\x2d\x2d\x83\x41\x98\xef\xa4\x04\x63\xba\xaf\xb3\x71\xa0\xeb\x62\x17\x1b\xf2\x30\x8b\x6c\x11\xa8\x89\x09\x83\x23\x45\x92\x5b\x79\xdf\x24\x14\x04\xc2\x4e\x3b\xa9\x88\x90\x61\x4f\x5d\x22\x98\xa5\xd2\x6a\x71\xac\x78\x52\x2f\x90\xf7\xbd\xbe\x11\x47\x1c\x88\x18\x57\x16\x38\x95\xa2\x34\xaa\xc5\x33\x06\xc7\x6f\x90\xe6\x0c\x4e\x56\x48\x74\xa8\x8f\xa2\x9d\xbe\x45\x9b\x33\x38\x2b\xd0\x90\xf7\xbc\x08\xcf\x19\x5c\x14\xe0\x34\x8c\xb2\xac\x5c\xae\xc3\xcf\x19\x5c\x95\xf1\x79\x26\x3a\x6b\x09\x73\x06\xdd\x3d\x75\x79\x4b\xde\xed\x38\x91\xf5\xa1\xe0\xef\xa8\xa0\x9e\xe6\x28\xcc\x31\x41\x71\x98\x24\x03\xee\xc5\x35\xd5\x45\xcf\xcb\x58\x65\x28\xd3\xd4\x8b\xf5\xd4\x4c\x63\xb8\x7c\x83\x5e\xbc\x9b\xb3\x71\x55\x66\xca\x22\x77\x96\xf0\xc5\x48\xdd\x32\x4d\x5b\x6f\x74\xbe\x7a\x6f\x90\xb3\xb4\xaf\xdf\x62\x28\xdd\x1a\x2a\x33\xa5\xb1\xe7\xba\x38\x2f\xde\x12\x3e\x99\x30\xb8\xa3\x10\x5d\xd0\xab\xab\xa3\x0b\x8d\x37\x8f\x27\x6e\x8d\xc2\xc5\x56\x98\xcc\xb6\xe4\xd1\xa8\x51\x18\xa6\x03\x2f\x70\xeb\x6e\xcc\xe7\x74\x0f\xad\xc1\xa0\xb7\x47\xe9\xe1\x74\x72\xad\x83\x52\x8a\xdf\xcb\x4f\xe1\xc4\x85\x84\x19\x83\x5b\xfc\x9d\x33\xb8\xdb\x33\x99\x43\xdb\x07\xef\x91\xc7\xe1\x69\xbe\x60\xe1\xa9\xc2\xf8\x22\x49\xae\x84\x8b\xeb\x77\x59\x45\xf7\x14\x2b\x15\x5a\x86\xbc\xdf\xcb\xae\x35\x5a\x2a\xd2\x78\xa4\xa6\x18\x3b\x43\x64\x53\xa5\x53\x46\xd1\x54\x29\x24\x6e\x9e\x30\xe0\xfb\x26\x73\x2c\xdf\x56\x53\x14\x11\x44\x6e\x08\x72\x53\x5c\xf8\xa9\x3b\x3a\xd6\x3e\x5d\xf2\x94\xc7\x61\x07\x92\x95\x20\xad\x81\x49\x7a\xc2\xc0\x93\x44\x37\x16\x82\xc1\x93\x04\x50\x11\x9d\x33\x18\x4a\x28\x15\x76\x2a\x4f\x26\x81\x83\xd1\x3c\xee\x87\xae\xb6\xe2\xf9\xc4\xe3\xf1\x11\xd9\x4f\x04\xd1\xfb\xfd\x5a\x20\xa6\xa8\x0a\xe5\x9d\x63\x24\xf9\x0a\x24\x7d\xc4\x30\x8a\x05\x59\x8f\x82\x15\x0e\x9a\x59\xf6\xb9\x4d\x13\x6a\x98\x91\x43\x9f\xd4\x2c\xdd\x2f\xfb\xfb\x4b\xf8\xec\x9b\xd1\x4a\x94\xe5\x6f\xba\x14\x37\x91\xe7\x69\x9f\x25\xbb\xb6\x31\xc6\x0a\x8c\x7c\x3e\xaf\xd3\x96\xe3\x16\x6a\x82\x0d\x75\xf5\xb5\x5e\xd9\xd6\x07\xf3\x2a\xdb\x0d\xb5\x36\xa9\x6c\x33\x48\x56\xe2\x35\xf4\xac\x51\xe7\x56\x12\xfa\xe3\x54\x64\x89\x6c\xe7\x87\xfb\xf4\xf2\x86\x41\x5a\x48\xa1\x59\x3c\x93\x31\x2e\x10\xda\x3c\x15\xbb\x3c\xee\xe4\xd6\xda\x8d\x49\x81\x7c\x42\xf3\x51\x3b\xa4\xcb\x63\x2b\x78\xed\x33\x6a\x56\xa0\x9c\xd2\x9e\xf2\x60\x3f\x43\xd0\x35\x56\xa9\xdf\xd2\xc4\x5a\xe0\xbd\x0f\xc3\xd1\xae\x3e\xe2\xbd\xd0\x84\x31\xd9\x7a\x3d\x4a\x01\x47\xdb\x13\x86\xc2\xbd\x59\x14\x8b\x24\x51\x17\xb6\x18\x34\x89\x9d\x54\xbe\x21\x32\x90\x82\xb9\x4b\xc8\x98\xbb\xdd\xf0\x82\xe3\xec\x9a\xc3\xf8\x2d\x06\x6d\x8d\x90\x97\xd3\x34\x94\x48\x2d\x6e\x5f\xc1\x53\x7d\xd6\xe5\x40\x23\xb2\x83\x13\x87\x1a\x23\x77\xb1\x8f\x34\x28\x37\x43\xbf\x69\xb0\x23\xcf\x29\x1f\x6b\x58\x6e\xa2\x9d\x48\x10\x95\x6a\x1f\xf3\x3c\x63\x30\xc2\xdf\x39\x83\x60\xdf\x64\x82\xc1\x29\x72\x08\x1e\xfb\x73\xbd\xa6\x3a\x93\x18\xb9\x1e\x3a\x27\xc0\xe7\x56\x18\x73\xaa\xa5\x8b\x32\xa2\xe6\x25\xed\xac\x06\x2f\x97\x68\xf2\xf6\x3a\xea\x55\x57\xeb\x29\x73\x06\x1b\x9d\x25\x52\x1c\x4e\x8f\x1c\x06\x21\x66\x4f\xd7\x41\x97\x78\x46\x11\x0d\x0e\x24\x04\x0c\x9e\xe9\x57\x8e\x80\x38\x0b\x93\x77\x6c\x92\x2d\x34\x92\x7a\x14\x91\x28\x52\xe0\x2d\xd1\xaf\x73\xba\x54\x98\x6f\x06\x02\xeb\x20\xa1\x04\x1d\x06\x29\x05\x68\x05\x74\x43\xbc\x74\xe2\x08\x0b\x3b\xde\x27\xc8\xf7\x6c\x2f\x65\x30\x51\x50\x18\x23\xeb\xb4\x00\x29\x8f\x2e\x09\x83\x5b\x95\x80\x42\x93\x31\xe7\x6e\x05\x57\x63\x70\x5f\x42\x0e\x85\x88\x8e\x02\x7d\xe3\xfc\x7d\x89\x36\xe2\x33\xec\x66\x28\x84\xf9\x78\x0d\x81\x44\xb1\x55\xa2\x2c\xc2\x70\xd4\x16\x3e\x2e\xf7\x6c\x24\xf4\x45\x76\x10\xaa\x4b\xd7\x26\xb1\x00\x8e\xa4\xec\x8f\x03\xbb\xc9\x40\x48\xe8\x80\x8f\x93\xc4\xe3\xc1\x2e\x19\x43\xfa\x12\x79\x2a\x62\x5c\x2d\xce\xf6\x33\xe0\x8c\xc6\xa3\x2b\xc9\xe7\xea\xf0\xf7\x9c\xe8\x3c\x1d\xc7\xa8\xbe\xef\x9b\x1b\x1a\x52\xb3\x4a\x33\xa7\x1f\xca\xeb\x0a\xbb\x39\x46\x2e\xa9\x5a\x88\x70\x63\xcf\x61\x30\xa0\xc4\x3d\x3a\x4e\xdc\xde\x97\xd7\xb0\x19\xec\xa9\xd0\x56\x6e\xa4\x50\x18\x2d\x72\x3d\x15\xcf\xcf\x65\xed\x93\x46\xa9\x09\x66\xa8\xe1\x6c\xda\x3c\xa0\x44\xa4\x81\xfc\x30\x0b\x37\x73\x73\xbe\x2f\xa3\xc4\x89\xbe\x4c\x2f\xc7\xde\x48\xa2\x67\xc2\x91\x02\x89\xf4\xff\x60\xcc\xcd\x8f\xd9\x81\x4b\x93\x7d\x84\xa3\x7d\xe5\xb8\x40\x6f\x51\x84\x14\x4f\x6a\x47\xfb\xba\xca\xa2\x02\xf2\x94\xc7\x43\xb2\xea\x49\x5c\x90\x6e\xf5\xc9\xc5\x0d\x83\x78\x09\x53\x67\x90\x64\x28\xb9\x00\xf9\xb6\xaf\x41\xa9\xed\x1f\x6b\x78\xaa\x16\x48\xa9\x8e\x50\xd3\xa9\x8e\x33\x8c\x4c\x62\x92\xc1\x3a\xce\x89\x4a\x44\xd5\xe1\x54\x33\xec\xab\x14\x4e\x15\xfd\x8c\x93\x9b\x83\x33\x05\xca\x2a\x99\x69\xee\x1b\x95\xda\x39\x91\x63\x5b\x1c\xd1\x3e\x07\x83\x0b\x89\x20\xd5\x64\x2e\xb9\x11\xc8\x96\xd1\x97\xfb\x4b\xa8\x6c\x9e\xbc\x5a\xa1\x90\x72\xa5\xe7\xe6\xce\x2a\x59\x6d\x09\x2d\xf2\xcf\xa4\x22\xc6\x25\x56\x5b\xd8\xde\x88\x2e\xae\x37\x57\x68\x1d\xcf\x0d\x68\x77\x3c\x48\xdb\x9e\xeb\xe1\xdc\xb5\x5b\x66\x1a\x07\x28\x25\x5a\x4b\xc8\x44\x9c\x72\x37\xf0\xd2\x31\xf9\x52\x68\x13\x35\xf3\xb2\x52\xba\x4d\x5b\xf9\xc1\x60\x0f\xe9\xee\xf7\xc9\xc8\xff\xce\x60\x3f\x07\xea\x0c\x0e\x72\xe8\xef\xbf\xeb\xff\xfb\xe3\xed\x83\xb4\xaf\x0c\x0e\x89\x59\x9f\x3e\xcb\x6f\xd0\xef\xd3\x85\x6f\x06\x3d\x19\xb0\x35\xe1\x88\xf8\xc3\xd0\xfd\xce\xe0\x9b\x0e\xfb\x62\xab\x74\x5c\x62\x0b\x55\x14\x8b\xc7\x5b\x96\xe7\x6e\x49\x55\x8b\xc1\xf1\x3f\x72\x0f\xd2\x91\xbf\x65\x87\x8e\xd8\x42\x01\xc5\x03\xbd\x0e\x38\xf9\xc7\x98\xc9\x88\xfb\x7e\xf6\xa5\xeb\xfd\x9f\xb0\xa7\x5e\xc4\xe0\xf4\xa7\x29\xa6\x5e\xb4\xa5\x37\x56\xcf\xfe\x25\xe7\x96\x4f\xde\x53\xce\xff\x91\x5d\xee\x79\x5f\xfc\x2b\x3e\x95\xe8\xe5\x3f\x32\x17\xb6\xbb\xaf\xfe\x99\xf9\x79\xcc\x51\x8c\x74\x72\xce\xa5\xfb\x88\xcd\x58\x70\xf5\xea\x6d\xf7\x4d\xa6\x5d\x1e\x2b\x9e\xde\x9b\x3c\xf2\x8c\xad\x62\xbb\x7e\x93\x0d\xb5\x19\xc5\x74\xf3\x26\xd3\x85\xa7\x79\x36\x6e\xdf\x64\x52\xe7\xb5\x14\xe3\x5d\xce\xf7\xbd\xc4\xf7\x1d\x7b\x3c\xf2\x7c\x67\x70\xff\xcf\x4c\x64\x43\xf7\x02\x77\x57\xda\xc5\xdf\xff\x73\x8c\x11\x8f\xa4\x3b\x9d\x1b\xec\x8b\xea\x72\x14\x03\x3e\xe1\x39\xd8\x0b\x48\x38\x58\x12\x27\x50\x8f\xb9\x25\x6e\x9c\xd5\x6c\x89\xf5\xd4\x91\x92\xbb\xfd\x1c\xd2\x2e\x72\x8a\x1c\x49\x8d\xb6\xac\x4f\xbd\x80\x96\x70\xfb\x45\x8a\x9a\xef\xde\x2f\x21\xc9\x7b\x8b\x28\x27\x32\xf2\x82\x53\xfe\x14\xc6\x38\x69\xb5\xbd\x24\x45\x2d\x90\x41\x7f\x95\x09\xbf\x53\x66\x72\x57\x98\xce\xc2\xd4\x1e\xe4\x0c\x83\x15\x86\x4e\x1a\x87\x81\x8b\x8d\x9f\x73\x79\x6f\x70\x75\xc3\x1b\xc1\x87\x65\xde\x8d\xa7\x15\xe6\x55\xa6\xe1\x0a\x4f\x18\x1f\x28\x30\xdf\xbe\x5b\xc3\x84\xc5\xcb\x18\x46\x65\x86\x40\x4c\xbb\xde\x48\xed\x4f\x05\x65\x1a\x4a\xf7\xee\x80\x76\x9e\x7c\xd4\x5d\x57\xa9\xa8\xd6\xf1\x03\xc4\xd2\x91\xdc\x08\x39\x06\xcd\x99\x40\xbc\x75\x40\x61\x54\x07\x9f\x15\xde\x4b\x7e\x61\x60\x23\x9e\x4b\x0f\x1e\x0e\x85\x13\x75\x8e\x45\x20\x44\x07\x6c\x54\xc7\xe8\x67\x08\xed\x3f\x25\xa6\x94\x04\x97\xde\x8e\x12\x09\xa9\xeb\x55\x2e\x72\xd3\xa6\xd9\x80\x42\xee\x80\x41\x4a\x1c\xa5\xdd\x5a\x4f\x11\xd5\xf5\xd2\x27\x02\x93\x34\x74\x63\x3e\x62\x30\x96\x11\x14\x5c\xb3\xc6\xf6\x50\xa8\x19\x7d\x58\xe4\x24\xd7\xd6\xbb\x44\x55\x87\x82\x27\xe5\x98\x3e\x4f\x52\x49\xbf\x10\xb1\x2d\x82\xd4\xa3\xeb\xa4\x65\xa6\x11\x9f\x49\x1e\xe9\x5e\x9d\xc1\xc6\x6c\x89\xc1\x0b\xca\x0c\xf3\x32\x3d\x09\xe3\xb4\x94\x8b\x45\x89\x5e\x22\x35\xd7\x90\x70\x4a\x2f\xa1\xd5\xdd\x6c\xf2\x02\x8e\x12\xa2\x45\x54\xa9\xbb\xfa\x07\x2a\x88\x8a\xf9\x48\x03\xa4\x8c\xb7\x89\x2d\x1d\xf9\xf2\x28\xf4\x9e\x04\xd3\xa8\xce\x60\x3f\x0b\xaf\xf3\x1b\xc1\x1d\x47\x7c\x1d\x85\xce\xd8\x17\xf2\x16\xfb\xc1\x12\xfb\xaa\xff\x0b\x08\x0e\x7e\xea\x51\x03\x42\x45\x4f\xea\x0c\x22\x0c\xcf\x2d\x92\x44\xcf\x07\x26\xc3\xdf\x43\xfc\x84\xe7\x60\x9b\xf4\x3d\x2c\x58\x8c\x84\xbe\xd4\xca\x8e\x88\xe8\xaa\x3b\x2e\xdf\x08\x92\x47\xa0\x8e\xb3\xf0\xa7\x88\x36\xd5\x72\x38\x99\xb8\x9b\xb3\x11\xae\xb0\x30\xa5\x80\x41\x4a\xbf\xcd\xc0\xa1\xda\x39\x25\xce\x00\xc7\x61\xbe\x49\x7d\x26\x91\xfd\xf0\x53\x49\x28\xd3\x6d\xd3\x8d\xf3\x8c\xa8\xe4\x2f\xa1\x2f\x34\xb6\xb8\x9b\x3d\xa6\x4f\x45\xf8\x9d\x09\x05\xe5\x49\x91\x4b\xc9\x5b\x58\x17\xaa\x9b\x3d\xd3\x03\x85\x8f\x42\x9f\xa7\xe2\x4c\xda\xa9\x67\x1a\x3b\xe1\x3e\x83\xab\x2c\xf2\x84\xfb\x35\x06\x9d\x22\x8c\x83\x7b\x8e\xec\xc9\xaf\x6d\x06\x5d\x22\x25\x6d\xaf\xdf\x67\xd0\x93\xc0\x55\xea\x33\x58\x10\x4b\x27\xe5\xea\xee\x33\x82\x29\xf7\x3d\x9b\xc1\x35\xb1\x11\x50\x61\x70\x33\xe1\xe6\xc7\xfc\x7e\x55\x9d\xb1\x8f\x70\x8b\x1c\x4f\x89\xec\x4d\x77\x08\x0c\xf9\x24\xe6\xf3\x64\xe8\xcd\xb7\x26\x9e\xc7\xe0\x9e\x90\x42\x44\xcd\x24\x12\x76\x7a\x85\xd3\x16\x83\xdd\x03\x72\x6c\xc4\xa0\x25\x03\xd2\xb0\xd1\x96\x00\xca\x98\xbd\x03\x93\xf9\x0c\xf6\x0f\x94\x53\x22\x06\x07\x3a\x78\x14\x48\x6b\x0c\x83\x43\x8d\xc2\x8c\x1f\x69\xc0\x17\x8e\x35\x67\xf0\x1e\x3f\xec\x0b\xf2\x1e\xf6\x0d\x69\x2a\xd2\x71\x16\xae\x91\x74\x93\x4e\x7e\xf8\x94\x67\x68\x8b\xc7\x35\x5f\x9d\xfc\xb0\x0a\xf8\x11\x9f\xa9\x13\xfc\x1b\x76\x01\x1d\x88\xa9\xce\x90\x53\x44\x97\xf6\x45\x44\x81\x52\xb2\xec\xf6\x0b\x84\x88\xbb\x5e\xe0\x16\x0e\xd0\x9d\xe4\x79\xcd\xb7\x50\xdc\x42\x0c\xe9\x4b\xb2\x19\xc7\xe1\x34\xa9\xc9\x83\x20\x4a\x26\x0f\xde\xe2\xf2\x82\x12\x9f\xf7\x16\x5f\x29\x97\x4f\x45\xae\x41\x38\xbd\xe0\xae\x20\xd9\xc3\xe0\x34\xcf\x63\x61\x1b\x67\x98\x47\x50\x27\xfb\xfc\x25\x8c\x5a\x7a\x8f\x96\xd0\x99\x59\x37\x58\x47\xa0\x61\x1a\xe6\x94\xfd\x6c\x1d\x17\xe5\x48\x69\x4b\xd9\x55\xdb\xfc\xcf\xeb\x09\xea\xf3\x71\x4e\xa5\xc3\x76\xb2\x52\xce\x0e\x8a\x48\x55\xa4\xf3\x03\x73\x43\x61\x85\x2c\xd2\x45\xc6\x26\x6b\x4e\x9f\x2c\xb8\x24\xbc\x3c\xfc\x72\x85\x61\x8f\x41\xe7\x40\x3a\x4d\x63\x90\xd0\x27\xbd\x40\xd0\x11\x0b\x9a\x20\xbb\x8a\x58\x63\x90\x6a\xaa\xca\xca\x58\xc3\x6d\x9e\x0c\x54\x4e\x26\x1a\x27\x8b\x3e\xcd\x40\x9d\xde\x4c\x63\xf4\xa2\xb6\x77\x50\x72\xfc\x76\xad\x40\x1e\x33\xb8\xc9\xc2\x07\x99\xd6\x78\x2b\x71\xc3\x84\xc1\x5c\x26\x95\xa4\xf2\x44\x09\x41\x21\x47\x41\xa1\x83\x38\xf8\xee\x30\x02\xae\x84\xee\x65\xa0\x23\x9d\xd9\xed\x4a\x1e\x09\xde\x32\x68\x49\x38\x11\x36\x8f\xa4\x65\xa1\x2d\x31\x53\x06\xef\x31\x66\x1a\x33\xd8\x43\xd4\x08\x57\xa6\xfd\xb9\x17\xb8\x07\x3e\x4f\x92\x9a\xb6\xb5\xed\xaf\x23\x2e\xc2\x70\xa4\x17\xd5\xfc\x70\x85\xbe\xab\x8e\xc7\x58\xab\xa4\x6e\xec\xa9\x23\x93\x07\x32\xe1\x27\xb9\x5d\x58\xe8\x0b\x87\x53\x6e\x6e\x30\x14\xef\xaa\xac\x36\x25\x13\xc9\xbd\x90\x23\x19\x2d\xea\x7b\xbe\x48\x3e\xfd\x8f\x9c\x16\x1c\xe2\x90\x66\x92\x6f\x92\x01\x01\x79\x6a\x2c\x3b\xaf\x72\xfc\x06\x45\xab\xcf\x27\x6f\xd1\xd5\xd6\xb1\xc8\xbe\xa2\xb7\xdf\x33\x84\x32\x62\x9d\xe6\x29\x48\x23\xd6\x59\x8e\xc8\x14\x4d\x97\x62\x91\x0f\x3c\x49\x4d\x63\x6f\x56\x65\x30\x27\x3c\xb6\xb9\x0c\x6c\xa9\xcf\x5e\x48\xae\x59\xd3\xa7\xb3\xec\x52\x3e\x34\x25\x8f\xaa\xb2\x4b\xc5\x42\xa0\xda\xa5\xdd\x95\x1c\x6d\xe9\xc8\xf2\x4a\x71\x60\x3d\x2b\x99\xda\x92\x0c\xde\xc8\x5b\x60\x2d\x77\x88\x83\xf6\x4f\xbb\x3a\x28\x57\xb2\xbd\x22\x98\x9f\x00\xb8\x2e\xa2\xb1\x27\x87\x0c\xda\x98\xa6\x88\x6d\xb9\x50\xbd\x91\x1c\x29\x67\xb0\x47\x84\x34\x0e\x13\x06\xfb\x18\xf6\xf4\xd9\x91\x03\x09\x91\xfb\xc9\x8d\x43\x02\x02\x06\x47\x32\xa0\x4f\x5d\x52\x42\x0a\x54\xe5\xbb\x53\xb8\x82\xb5\xed\x5e\xa1\x48\x86\xe8\xa1\xf9\x5e\x21\x57\xfa\xd9\xb7\x43\x85\x3f\x58\x5e\x47\xf1\x19\x5f\x43\xa2\xd5\x94\xb5\x86\xa4\x15\xfe\x63\x4a\x30\x8e\xc3\xf8\x04\x47\xe6\x09\x81\x33\xea\xc1\x14\x2b\x74\x78\x6e\xc1\x38\x45\xaa\x7c\x9b\xf2\x8c\x82\xe3\x44\x28\xcb\xf3\xb9\x86\xd5\x64\x7a\xa1\x61\xe9\x94\xf1\x52\x83\x38\x6d\x5f\x69\x60\x2a\x2d\xd9\x9d\x43\xed\xbb\xb1\xab\x42\xdf\xc3\x7e\x3f\xb1\xe5\xe2\xb3\x77\x68\xb2\x80\xb4\xb9\x6b\x0a\xa5\xe3\x18\xb5\x9a\x1b\x04\x42\x06\x0e\x66\x33\x08\x1d\xb5\xed\x78\x4b\xe8\x78\x84\x2c\x42\x92\xa4\xe3\xd2\x3b\x22\x4c\x63\x1e\x31\xe8\x23\x41\x5e\x10\xd9\xcd\xd5\x35\x06\x2e\xe1\x6d\xc1\x03\x06\xf7\x87\xe4\x2b\x95\xc1\xfb\xc3\xdc\x69\x2a\x3f\x32\x59\x38\x64\x60\x1d\x99\x1b\x2c\xf4\x9d\x2d\x79\x07\x6d\x40\xf1\x02\x2a\x93\x54\x52\xec\xa3\x0c\x21\x4b\xe6\xe4\x08\xf2\x4d\x2b\x0a\x30\x0d\x43\xaf\x90\x06\x56\xd2\x93\x84\xe9\x6a\x4f\x92\xf2\x54\x64\x87\x9e\x24\x61\x1c\x48\x09\xeb\x13\x28\xc7\xe9\x67\x06\xfd\x23\x82\x9e\xb1\xb7\xb9\x14\x26\x5f\x8b\x92\x29\xa5\x71\x73\x39\xe6\x3e\x0d\xea\xc1\x91\x44\x92\xeb\xc6\xa3\x25\x17\x94\x4f\x88\xc0\x9c\x06\x14\x77\x9c\xd6\xed\x64\xd2\x60\x10\x6a\x10\x17\x08\x0d\x06\x91\x82\xcb\xfa\xf0\x50\xc6\x96\xda\xeb\x33\xb1\x90\x2e\x1a\xcb\xa0\x74\x9a\x51\xe7\xe3\x34\x5c\xb3\x81\x97\x86\x51\x7d\x5b\xb9\xc6\xd8\x21\x87\x4b\x6a\x59\xb8\x23\x9d\x90\x24\xa5\x44\xe4\xf1\xd5\x3c\x99\x58\xf8\x1c\x55\x97\xcc\xb7\x46\x5a\x64\xbf\x65\x30\xd6\xb0\xcf\xe7\x24\x14\x7c\xcc\xec\x34\x48\x18\x8c\x8e\x4c\x16\x31\x98\x20\x47\xf4\x2b\x83\x29\x05\xa4\x6b\x03\x06\xb3\x19\x0a\xf9\x88\x27\x29\x2e\xaf\x8f\xb4\xcb\xcf\xb9\x64\x4a\x07\xb9\xca\xbd\x50\x28\x14\x7e\xca\x9e\xd2\x24\x94\xcd\x20\xc4\x88\x72\x15\x49\xa9\xee\x12\x41\x1e\xc5\x89\x90\xe6\x61\x95\xc9\x80\x2d\xa6\x5e\x22\x4e\xd4\x24\xdc\x22\x4e\x2f\xb0\x07\xd9\xce\x9d\xc4\xcc\x84\x9f\x5c\x88\xf8\x44\xea\xc0\x7b\x84\xf4\xb9\x2d\x70\xa9\x4f\x4b\xa2\x23\xed\xa8\x74\x5f\xd1\xe6\x85\xbd\x81\x04\xa9\xf2\xf0\xde\x01\x91\x31\x5c\x63\x70\x98\x03\xca\xc3\xd0\x51\x01\x23\x2d\xf5\x39\x22\x73\x47\x7a\x9c\xe1\xd4\x7e\x5f\xaa\xd3\x97\x02\x6f\xac\x41\xcc\xd9\x44\x03\x09\x83\x69\x16\x5e\x3e\x36\x38\x23\x8a\x3f\x77\x31\xbb\x27\x32\xfd\xc4\x0b\x68\x48\x9e\x6a\xb0\xdc\x87\xf4\x26\xb1\x72\xb4\x74\xb6\x9e\xcb\x17\xfd\xb4\xae\xbd\x70\x51\xbf\xa3\x2e\xa9\xba\x5e\xa1\xe3\x45\xb3\xc6\x52\x87\xc3\x75\x5d\x29\xd1\xac\xdf\xad\x30\x5e\x10\x5f\x4c\xee\xaf\x65\x88\xee\xe4\x94\xd6\x3a\x57\x9a\x22\x1d\xe9\x1e\x11\x90\xe2\x28\x5d\x50\xd8\x1b\xf1\x78\xee\x78\xdc\x0d\x03\xee\x27\x69\xec\x91\x07\xa6\x8e\x8c\x15\x3e\x69\x0f\xac\x5d\x85\x20\x4f\xae\x5a\x62\x34\x29\x85\x70\xe2\x05\x36\xdd\x2c\x26\x9e\x94\xc1\x35\x05\xc6\x31\x79\x1f\xbe\x21\x60\x56\x61\xb0\x8b\xec\xb3\x06\x83\x5b\x89\xca\x9d\xdc\xcc\xea\x0c\xee\x14\x32\x2b\x77\x65\x69\xdc\x52\x9d\x6e\x37\x18\xdc\x23\xe7\xf3\x98\x3b\x29\x9d\x7f\x78\x8f\x60\xcc\x2d\x9f\x01\x9f\xab\xe0\xd6\x38\x11\x5b\xda\xa3\xb2\xa5\xb1\xb6\xef\x45\x0c\x6c\x0d\xe6\x76\x4a\x47\xa3\x92\xc1\xff\x47\xdc\x9b\x37\xa7\xd1\x2b\x0f\xa3\xff\xfb\x53\xc4\xbc\x79\xf9\x49\x46\x4c\xc0\x59\x9e\x64\x26\x0a\x65\xf0\x0a\x78\x5f\x88\x33\x67\x4e\x4a\xb3\x01\x66\x58\xcc\x66\xc0\xf0\xdd\x6f\xa9\x25\xcd\x68\x00\xe7\x79\xce\xb9\xbf\xba\xb7\x52\x31\x52\xab\xa5\x91\x5a\x52\xab\xd5\x6a\xb5\x18\xb8\xa9\xae\x9c\xc5\x6e\x95\x03\x91\xd6\x6b\x06\x15\x68\x36\x78\x51\x3e\x6e\x0f\xdb\xbd\xe6\x0d\xd8\x70\x1c\x2a\x5c\x45\x96\xa3\x33\xe5\x94\x36\x84\xbc\x81\x37\x46\x19\xd2\x14\x61\x3f\x43\x8e\x21\x5d\xf8\x31\xbf\x1f\xf2\xcd\xa5\x00\x0c\xd9\x0b\x5f\xf5\xcf\x84\x2b\x70\xb8\x58\x26\xf2\x34\x93\xdb\x26\x67\x90\x2a\x58\x7f\x5b\xa4\xf2\xc8\x6d\x30\x6c\x07\x6a\xcf\xf1\xb4\x15\x2e\x0b\xe8\x6c\x4d\x8c\xf7\x3d\xd1\xdb\xc9\xb0\xfb\xe9\x6a\xe9\x62\x16\xf6\x12\x08\xdc\xcb\xce\x90\xfe\x1a\x44\x6d\x4c\x06\x02\xae\x7c\xed\x90\xea\x99\x16\x8d\xbd\x8e\xc5\x01\x95\x94\x21\xcf\xa9\x8c\x1f\x84\xcd\xf1\x07\x65\x7a\x3c\xdc\x9e\x2a\x8d\x0a\x46\x5b\x53\xe3\xd3\xf5\xf1\xd6\x64\xb1\x55\x9a\x6c\x4d\x13\xbc\x79\xba\x35\x4d\xf4\xfa\xcb\xd6\x34\xe5\xdc\x6c\xb6\x35\x55\x7a\xc6\x9a\xa7\x13\x47\xd3\x66\xdc\x90\xc5\x66\x52\xdc\x8a\x83\xcd\x34\xa9\x6c\x2d\x6f\xa6\x88\xc6\x55\x36\x13\x44\xcb\x0e\xb7\x27\x28\xdf\x71\x9b\xa9\xa2\xd1\xc7\x9b\x09\xaa\xc5\x27\x5b\x92\xa6\xcd\x0c\x39\xdd\x0a\x97\x1f\x3a\xdb\x4c\x14\x34\xaa\x8a\x84\x41\xc0\xc6\x19\x52\x13\x11\x60\xd8\x35\x18\x4e\x62\xfd\xa8\x8b\x30\x67\x1f\x30\x91\xea\x12\x6f\xc2\x25\xb6\x73\x11\x99\x06\x43\x4e\xbb\x0b\x2d\x26\x14\xd1\xe7\x67\x31\xa0\x22\x0c\xce\xc1\x70\xf0\x12\x10\x9b\x2e\xca\x90\x2b\x19\x64\x28\x43\x2e\xce\x64\xb0\x40\xe0\x1f\xce\x90\x4b\x0e\xe2\xfc\x5d\x5d\x63\xb8\x06\xfc\xd8\x56\xf9\xae\x7f\x23\xaa\x7c\xa5\x10\xa5\x7d\xd8\xce\xf5\x59\xe2\x52\xfe\x26\x0e\xa3\x0c\xb9\x85\xc8\x4b\x86\xdc\x40\x51\xfd\x97\xd8\xaa\xf6\x4e\xa4\x28\xe7\xd9\xf7\x22\x3a\xca\x90\x07\x1e\x9a\x65\x48\x83\xff\xce\x33\xe4\xe7\x19\xcd\x8c\x58\x0f\x2e\x6e\xb6\xc3\x0c\xb9\xe5\x25\xc1\x91\x30\xca\x90\xc7\x33\x19\x96\x46\x76\x22\x2a\x94\x08\xef\x21\x22\x84\x66\x56\x85\x30\x98\x57\xdf\x89\x02\xc4\x7b\x22\x42\x6e\xb8\x07\x10\x5c\xcc\xdb\xb6\xac\xb8\x55\xfd\xe1\x04\x4f\x8b\xdd\x40\x95\xfd\xaa\xf6\x18\x83\xb0\x6d\x0a\x00\x14\x1f\xf7\x3d\x88\x0f\x00\x9f\x69\xc4\x61\xc9\xdb\x7e\xc6\x80\x98\x9f\x3d\xa6\x41\xe2\x72\x41\x55\x82\x46\x19\xd2\x8c\xc3\xea\x82\x4f\x6b\x0d\x92\xf7\xd9\xb0\x93\x21\xbf\xe2\x82\x14\x5c\x1e\x0d\xb4\x63\x7c\x23\x43\xde\x27\x58\x46\xc1\xd8\x6a\x96\xc3\x16\x31\x8a\xa0\xf5\x53\x95\xee\x64\x60\x38\xb8\x22\x69\x2c\x3a\xb6\x53\x85\xd7\x2d\xfc\xfe\x4b\x62\xb1\x11\x25\x30\xe5\x56\xde\x83\x4c\x02\x36\xcb\xab\x0d\x85\xaf\x43\x95\x21\x4a\x37\xc9\x3d\x53\x88\x81\x86\x38\x8f\xb3\x87\x3a\x54\x65\xef\x25\xd9\xe7\x0a\xb1\x5f\x8d\x9f\xe0\x68\xca\x3c\x83\x60\xb4\xe1\x42\xb2\xa5\xa5\x29\x86\xd6\xd6\x60\x31\x27\x7b\xd2\x80\x92\x85\x75\x34\x90\xe0\x5d\x91\x06\x11\x4c\xab\xab\x41\x04\x3f\xea\xad\x41\x24\x5b\x19\x54\x63\xa8\x62\x4f\x7d\x0d\x53\xb0\x98\x81\x80\xf4\x87\xe3\x72\x7c\x5d\xeb\x39\x86\x09\x13\xd3\xa1\x8c\x4f\x22\xff\x54\x9d\x13\x69\x1e\xeb\x9f\xe1\x3b\x7c\xc2\x8e\x24\xe2\x0b\x1c\xd2\xc6\x06\x78\xe3\x05\x97\xf9\x39\x5c\xf8\xc2\x09\xe4\x2b\xfa\x7c\x41\x93\x79\x85\xd1\xdb\x44\xe5\xbf\xd9\xcf\x90\x69\x1c\x49\x96\xe8\x91\x5a\xf7\x5f\x54\xa2\xd4\x7f\xcd\xe2\x78\xdb\x0f\xae\x58\x8f\xcb\xf0\x73\x05\xe3\xdb\xaa\xa3\x69\xc0\x19\xc3\x62\x03\x26\xa6\xde\x48\xd6\xe3\x8e\x4b\x4d\x63\x15\x11\xa7\xea\x7c\xe3\x01\xd9\xda\x7e\x70\x0b\xbc\x41\x2a\x12\xca\x02\xba\x08\x84\x85\x7d\xac\x8c\xab\xa4\xe0\x5d\x36\x13\x42\xfb\xe1\x3a\x58\xd9\xdb\xa7\xe1\xed\x9e\x40\x3f\x5e\x07\x4b\xf4\x93\x14\x5c\x63\x64\xa7\x90\x10\xb1\xde\x58\xdc\x0d\xcf\x90\xb3\x35\xc8\x81\xd0\xc0\x4d\x78\xfb\xe0\xe2\x79\x86\x54\x05\x0a\xbc\x30\x30\xe5\x70\x65\xa2\xac\xd4\x7c\x35\x40\xe8\xb1\x81\x78\x0a\x34\x43\xea\x00\x80\x63\x36\xb8\xeb\x55\x9e\x8b\xfa\x9e\x03\x7c\xc0\x86\x1d\x31\x72\x5f\x78\x69\xd2\x1e\x61\x67\xc6\x23\x43\x2f\x43\xe6\x55\x78\x5c\x03\x6e\x49\x41\x06\xbe\x81\x93\xe2\xd5\x42\xa4\x0d\x33\xe4\x40\x86\xc6\x19\x72\x29\xb1\xf8\x32\x11\x1c\x40\xd8\x3f\x0c\xa6\x6d\xa5\xd5\x17\xa0\xe4\x7a\xa9\x8a\xab\x1b\xa5\x65\x28\x2a\x18\x64\x48\x45\x86\x06\x81\x2f\x2e\x37\x1d\x26\x00\xbe\x47\x82\x0b\x08\x2d\x91\x5f\xdc\xfa\x3a\x02\x84\xfe\x20\x43\xda\x02\xdc\x1f\x28\xd6\x79\x5c\xd5\xe3\x66\x86\x9c\x54\xd5\x43\x11\x19\xf2\x24\xb0\x79\x24\xcf\xa7\x10\x3c\xa5\x9a\x21\x1d\x0d\xcc\x69\xe4\xb1\x41\x86\x9c\xc6\xf9\x12\x7b\xb6\xb3\x04\x26\x75\x81\xd5\x18\xa2\x74\x55\x51\x52\x98\x66\xc5\xac\x01\x65\xce\x5e\x02\x92\x24\xea\x27\x90\x58\x37\x39\x48\x60\x8a\x09\x00\x64\xe2\xea\xd7\x29\x86\x12\xd6\x6d\x73\x19\x84\x57\x89\xcb\x36\x75\x1e\x78\x09\x33\xe4\xbc\x4a\x33\xe3\x0c\x19\x71\xac\x31\x58\xb9\xc9\x93\xef\x9d\x8b\x6a\x02\x69\x8f\xe4\x79\xc6\x25\x07\xba\x7d\x7f\x9e\x21\x57\x3c\xe8\x67\xc8\x75\x55\x78\x17\xcc\x27\xcf\x50\x30\x09\x49\x1c\x7f\x66\xc8\x44\x41\x65\x8b\xa6\x2a\x9e\x9c\x52\xbc\x28\x50\xa2\x4f\xb9\x91\x85\x4b\xdd\xfe\x4c\x61\x08\xb6\x7a\x5b\x4d\x62\xfd\x4e\x86\xcc\x21\xb9\xd5\xf6\x3a\xbd\x60\x34\xca\x90\x05\xc4\xdb\x5e\xe7\xd6\xeb\xf3\x0d\x91\x50\xf8\x73\xde\xa0\x12\x22\xa1\x5e\xbd\xab\xc6\x6f\xdd\x94\x45\x52\x37\x38\x49\x7c\xae\x64\xc8\x7d\x35\x7e\x0b\xa4\x22\x10\xc6\x91\xea\x9b\x07\x95\x96\xb4\xe4\x30\xc6\x49\x9a\xd2\x50\x68\xda\xa9\xc9\x51\x8c\xf7\x33\x43\x7e\x2a\x84\xc7\x0c\x79\xe4\xe1\x7e\xb3\x19\x05\xbf\xe5\x8e\x3e\x43\x8e\x01\x59\x5a\x9b\xb7\x9b\xbd\xfe\x30\x50\x96\xa7\x27\xa9\xa4\xd1\x29\x3c\x3f\x74\xaa\x03\x07\xed\x69\x7f\x6c\xcc\x32\xe4\x6c\x13\x3a\xcf\x90\xaa\x0e\x85\xd5\x80\xb7\xad\x02\x7c\x76\xa7\xb6\x9e\xa8\xcc\x8a\xa5\x21\xf3\x7a\xf2\x91\xb0\x06\x3e\x5f\x87\xdf\x09\x02\x5e\xe8\x70\xad\x73\x7f\x55\x35\xb0\xba\xc3\x71\xa9\x21\x27\xf4\xbd\xd2\xa0\x89\x47\x83\x75\xa0\x70\x67\xa0\x41\x45\x7d\x6f\xd7\x20\xb2\x1b\xef\xd6\xc0\xb2\x56\xf7\x3a\x58\xd5\xea\x3d\x54\x75\x90\x21\xac\x06\x01\x25\x48\xbb\x22\x2a\xef\xfe\x3e\x88\xac\x83\xdf\xd2\xbf\x78\x43\xc4\x27\x5e\x4b\xd9\x73\xff\x8c\x21\x70\x42\xfa\x18\x47\xc5\x0e\xda\xab\xc9\xa8\xe4\xab\xbf\x20\xfd\x79\x96\x21\x3e\x4f\xe1\x15\x01\xc8\x50\x5c\xbe\x2d\x33\xed\x9d\x1d\x94\x21\xae\x00\x48\x47\x38\x7c\x52\x7b\x02\xa2\x8e\x75\x7c\x19\x15\x8d\x0a\x20\x36\x1a\x30\xce\xa2\xcb\x7c\xf9\x1f\xcf\x07\xc1\x6f\xf0\x01\x67\x82\xc3\xc5\x0c\x69\x02\x4e\x02\xbe\x65\x61\x20\x46\x5b\x50\xa3\x99\x49\x94\x21\x2d\x8e\x31\xe9\xc9\x2b\xcf\x6d\x11\x93\xb7\x12\x43\x8e\x03\x4f\xcc\xc3\x6a\xd3\x84\xa8\x6e\xc6\x22\xb0\xd5\x3d\x90\x0e\x44\x07\x19\x12\x41\x60\xd8\xe6\xdd\xd0\xef\x35\x33\xa4\x2b\x00\x11\xca\x90\x56\x4d\x84\xfe\x4f\x86\xb4\x6b\x7f\xe7\xc0\x96\xf4\x20\xe3\x28\x58\xbf\x40\xd0\x97\xf0\x3a\x67\x78\x15\xe5\xe3\x67\x20\xa1\xf2\xbd\xae\x18\xfe\x54\x03\xf0\x10\x5e\xa5\xbd\xec\xdd\x83\x3f\xcb\x1a\xcd\x4c\xf3\x82\x11\x0a\xbb\xa0\x88\x43\x4c\x61\xff\xfc\xcc\x4b\x9a\x9a\x52\x64\xec\x42\x8a\xd0\x0c\xf7\x20\x2c\xaf\x44\x0a\x2c\x21\x21\xf6\x21\x41\x0a\xa8\x23\x91\xa2\x16\xab\xb1\x88\x26\x9c\x70\xc0\x91\x0f\xc0\xd8\x65\x02\x69\x92\x8b\x4f\x65\x04\x8c\x96\x9e\x6b\xf0\xe0\x1a\x54\xee\x05\x12\xb8\x74\x92\x67\x3d\x3f\xaf\x2b\x66\x77\x66\x71\x9a\xe6\xa7\x60\x1e\x03\xc5\xb9\x57\x12\x6d\xf7\x32\xe4\x20\x8e\xf6\xb8\x50\x59\x8e\xa3\x42\x62\xad\x88\xf8\x50\x7b\x17\x27\x64\xd1\x28\xb0\x32\x64\xc8\x2b\xa5\x1e\xa0\x18\xd5\xc4\x8b\x69\x70\x2a\x31\x96\x11\xe1\xba\xca\x80\xcf\x4e\xd6\x60\xfc\xdb\x87\x50\x78\x02\xec\x4d\xba\xc1\xb0\xed\x9d\x73\xfc\xa3\x37\xd2\x78\xbe\x69\xaa\x2c\x21\x53\xbe\xd4\xe2\x07\xa6\x12\x4b\x8a\x59\x2d\x7e\x16\x21\x43\x8e\x79\x89\x32\xf6\xd7\xd6\x47\x12\xc8\x49\x82\xb2\xa9\xc6\x4f\xd4\xa4\x62\x6b\xba\xe5\x1c\x00\x2a\xd0\x8e\xda\xe3\xb9\x52\xf2\x67\xc8\x9c\xd7\xa1\x3f\x94\x3a\xc5\x85\x88\x45\x7e\x86\x1c\xd4\x68\x66\x96\x21\x65\xfe\x53\xcc\x90\x0a\xff\xdd\xcf\x90\x53\x5e\x87\x59\xfb\x46\xd7\xe3\x1d\xd6\x68\x66\x5e\xcc\x90\x23\xfe\xbb\x9f\x21\x67\x1c\x67\x0e\x2a\xf6\x2a\xcc\x77\xe9\x6e\x92\x83\x17\x97\xe2\x58\xf8\xb8\x46\x33\x8b\xdb\xfe\x7c\x91\x21\x75\x80\xf7\xfb\x5d\x71\x2d\x5d\xdb\x4d\x9c\xab\x94\x7a\x30\x05\x6b\x94\x1a\xcd\xbc\xae\x32\xe4\x82\xc3\xff\x35\x29\x14\xdc\x42\x86\x5c\x8a\xc8\xfe\x67\xd7\xcb\x24\x8f\x7d\x9f\xd6\xc4\x3b\x8b\x7c\x70\x78\xd4\x5d\x2e\xaf\xca\xcc\x92\x8f\x2e\x6a\x4f\x8d\x8b\x37\xe4\xc7\xad\xf6\x68\xb9\x74\xdb\xc4\xa5\x2e\xbc\x49\x3c\x19\x06\xbf\xbb\x41\xb7\xdf\x5e\x04\xbf\x3d\xe6\xb5\x82\xdf\xcb\x25\x7a\x2b\x89\xbe\xae\x30\x09\xa8\x87\xc6\x6d\xc4\x30\x89\x1f\x2e\xc7\xea\x7b\xae\xbd\xf0\x1c\x14\xe0\x92\x6b\x07\x8e\xc9\xff\x50\x66\xdf\x7a\x0e\xe2\xdf\xd5\xf0\x57\xda\x5b\xca\x65\x26\xea\xaf\xde\xb2\xf7\xa8\xcd\x1c\xe2\x53\xd7\xae\x3a\xf9\xa2\x55\xf8\x4e\x7d\x2b\x9f\xf7\xb1\x67\x57\x1c\xc4\x19\x67\x3f\x7c\xe7\xda\xbe\x43\xf8\x9f\xf8\xcb\x9e\xdd\x0d\x1c\xd4\xe8\x30\xbc\x82\xf7\xee\xaf\xcb\x8c\x76\x3a\xc8\x1e\x1d\x12\xf0\xb5\x91\x21\x0f\x87\x24\xe3\x71\xde\x93\xf1\xfa\xdd\x2e\xe3\xc3\x32\x03\xee\xbf\x33\x24\xd3\x1a\x66\xc8\x6c\x44\x26\x27\x24\xd3\x09\xe6\xcd\xa0\x97\x21\x6e\x8b\x34\x5e\x18\xc9\x80\x97\xe8\x0c\xc9\x8c\xc0\x4f\x20\xac\x17\x24\xf3\xe2\x0e\x33\x8e\x78\x58\xff\xa6\xcc\xe8\x87\xef\xf6\xbf\x7f\x38\x7b\x3f\x96\x59\xfb\xdf\x96\x93\xb3\x3e\x34\x93\xee\x39\xab\xa5\x9e\xc1\x74\x4b\x0c\xde\xde\xbf\x29\x33\x72\x89\x4d\xb6\xe2\x65\xdc\xf2\x32\xec\x83\xfc\x2f\x96\x5f\xf0\xce\xf6\x0a\x79\xfe\xe3\x7f\x81\xbf\x5f\x21\x12\x42\x24\x84\xc8\xbe\xfb\xf5\x5f\x93\xc2\xc7\x02\xa0\x7d\xfe\x56\xf8\xd7\xa4\xf0\x15\x22\xc5\x30\x0c\xff\x35\xd9\x2f\x14\x82\x7f\x4d\xf6\x3d\x00\x85\x6e\xd1\xfb\xd7\x24\x0c\x44\x24\xf8\x12\xf2\xbf\xa1\xcf\x23\x61\x18\x3a\x1f\xc8\x1d\xff\xf8\xbf\xed\x7f\xff\xff\xf2\xf9\x3d\x1b\x8a\x28\xf2\x92\xfe\x92\x99\x43\xc8\x05\x28\x7e\x08\xf8\x7f\x89\xcc\xa1\xe7\x7c\x20\xf7\x50\x5d\xb0\xfb\xfb\xd7\x87\x7f\x7d\x30\xf6\x3e\x90\x07\x00\x21\x36\x5c\x7a\x1d\x77\xe9\x4f\x97\xad\x60\xd9\x7e\x59\x86\x6c\xd9\x7b\xee\x2f\x07\xa3\xe5\xc8\x5f\x4e\x9a\xcb\xc9\x70\x39\x6f\x2f\x8d\x3d\x3b\xff\xdb\x41\x07\x43\xe6\x2e\x4f\x03\x77\xb8\xbc\x6b\x31\xb6\xbc\xe8\xf4\xfb\xcb\xbb\xb0\xd7\xc4\x18\x95\x76\x25\x4e\x9d\x8d\x7b\xcb\xca\x7c\x18\x61\xf4\x7e\x99\x5f\xfe\xc6\xea\xf7\x43\xdb\x4a\x1e\x8c\xad\xd6\x50\xdc\xbb\x0f\x65\x66\xb7\x7c\x07\x0d\xfa\xa8\x39\x62\x78\xb9\x1c\x1c\x63\xe8\xe1\x06\xaf\xe2\xbf\x46\xb9\x0f\xe4\x27\x84\xfc\x0f\xc9\x08\x79\xdc\x9c\x01\x05\xe2\xd3\x02\x09\xe8\x6e\x91\x84\x54\x8e\x20\x7b\xe8\x39\xa8\x51\x66\x98\x34\x69\xc1\x6a\x7e\x0f\xed\xaa\x63\x35\x73\x39\x31\xb5\x3b\x34\xb4\x9b\x8e\x75\x27\x2b\x70\x56\x43\x1d\x32\xed\xb7\xfd\x77\x05\x8c\x4b\xc8\xcb\xe5\x88\x9f\xcb\x61\xf3\x5e\xa6\x77\x70\x29\xa0\xbb\x05\xf3\x76\x2b\xbe\x9f\xcb\x99\x3f\x63\xcc\x6c\x16\x71\x5c\xbc\x92\x8d\x2c\x50\xea\x97\x82\x52\xd1\x2c\x98\xc6\xa7\xef\xde\x07\xbf\x94\x2f\x9a\xc5\x55\xd2\xa0\x1a\xa7\x08\x9f\xf1\xc6\xe1\x27\x7a\x69\x41\x88\x4d\x18\xfd\x55\x66\xab\x5a\xcd\xae\x39\x46\xf9\x9e\xee\x16\x2c\x11\x5e\xdc\x53\x8d\x4d\xc9\x6f\xc8\xdc\x2b\xeb\x80\x21\x40\x23\x9b\x38\x51\x9f\xe5\x24\x5e\xee\x57\x6b\x85\x93\x0a\xbc\xe7\x14\x4d\x5e\x9e\x7d\xd7\xee\x09\xe3\xe9\x7e\xf8\xae\x56\xcb\x66\x99\x3d\xf1\x1c\x4a\x29\x84\xa1\x66\x94\xd7\xad\xc4\x8c\xc3\x4f\x66\x58\x16\x73\xf2\x57\x99\xd1\x57\xad\x51\xf5\xb8\x51\x7e\xdc\xa8\xe6\x98\x51\x56\x61\xab\xba\xd6\x28\x9e\x97\x55\x20\x6f\xfd\x6f\xda\xe7\x7f\xd2\xca\x77\x2b\x50\x67\xc1\xa6\x7b\xc1\xcb\xbb\x7a\xcd\x72\xf9\xb7\x62\x66\xee\x42\xbd\xbc\x0a\xa3\x1c\xf7\x12\x13\xbf\x02\x33\x37\x6f\xfc\xdf\xdf\xbb\xff\xe7\x1d\xcb\x2f\x0e\xf2\xbf\x0a\xf9\x6f\x4e\xee\xbd\x36\xba\xce\xe3\x7a\x57\x8e\x54\xbd\x5b\x63\x46\x83\x0a\x5b\x9d\x6b\xf5\x3e\xff\x9b\xca\x56\x8e\x56\x12\x67\x1c\xb2\x24\xc3\x70\xb1\x25\x43\x51\xf0\xe0\xa0\x92\x26\xe1\xc5\x96\xaa\xd4\xc7\x8c\x86\x15\x26\x22\xe5\x90\xd1\xde\x24\x8a\x56\x17\xfa\x87\x2e\xde\xfe\x90\xca\xb5\x92\x48\xa2\x29\x17\xff\xa0\x29\xc9\x9b\xff\xb5\xb7\x86\xca\x85\x36\x54\x20\x0c\x95\xa5\xbc\xba\x25\x66\x54\x8e\xcc\x66\x99\x69\xeb\x18\x94\xd3\x0e\xd1\x5a\x19\x58\x15\x6d\xc9\xae\x9d\x44\x91\xc5\x78\xdb\xb2\x59\xe4\x52\x66\x0c\x17\x08\xc7\xcb\xd8\x75\x0d\x1d\xb5\x11\x33\xca\xf7\x25\x66\x2c\xee\x11\x36\x6f\xc7\x7c\xdf\x8d\x18\xc6\xc4\x15\xbc\xa4\x29\xba\x3d\xee\xef\x3c\xef\x70\xd2\xaa\xc0\x82\xd7\xe2\xab\x1c\xbc\x28\xdc\x19\x11\x71\x1b\x4b\x8a\x18\xf7\x4d\x92\xe9\xb2\x5e\x3b\x0c\xf8\x36\x24\x33\xe8\x8f\x40\x2a\x9d\x55\x31\x69\x8b\xbc\x6e\x8b\xcc\x5b\xe4\xb8\x85\x35\xee\xf6\x24\x86\x65\x32\x4c\x79\xac\xc3\x97\xff\xd2\x2f\x60\x4b\x26\x62\x14\xda\x4e\xfc\x1c\x05\x62\x12\x26\x5b\x45\x0a\x94\x7a\x25\x8f\x32\xb3\xb0\x4b\x59\x36\xeb\xc1\x5f\xe4\x01\x0d\xb0\x68\x8c\xe0\x75\x97\xd6\x2f\x14\x4b\x07\xc4\xd5\xc9\xe1\x13\x4f\x60\x86\x6b\xa3\xe9\x3a\x25\xf7\xf0\x19\x73\x51\xb3\x3c\x3e\xb4\x98\xe5\xc1\x50\x72\x63\xe1\x00\x0a\xb8\xa9\xd1\xeb\x1a\xba\x24\x05\x8d\x53\xdc\xca\x42\x7e\x72\x16\x7c\x59\x43\x2e\xc6\xda\x27\x3a\xfa\x9c\x64\xf6\xad\xef\x10\x8f\x32\x7b\xec\x39\x96\xb7\x5c\x5e\x45\x88\xe1\x5d\x5a\x6d\x2e\x97\xc8\xa3\xf7\x1d\xc4\xb0\xdd\xf4\x1c\x6c\xb5\x43\xb4\xeb\xa9\x7e\x77\x79\xb4\xdc\xc1\xbc\x10\x9f\xf6\xbb\xc8\xc3\x5c\xf8\xca\xf9\xf6\x89\x63\x05\xd1\x28\x78\x57\xed\xa0\xaf\x38\x9b\xdd\xad\x76\xd0\x37\xce\x6c\x63\xac\x3c\xe5\x48\x31\x31\x7e\x46\xc8\xc3\x25\xcf\xae\xf9\x4e\x1e\xb9\x39\x66\x1f\xb8\x0e\x36\x5d\xad\xbe\x77\xd0\x1a\xe2\x11\x9f\x04\x24\x24\x4d\xd2\x21\x91\xa8\x7e\x8f\xde\xd7\x78\x99\x03\x1a\x76\x79\x17\x8d\xe8\x03\xaf\xbd\x35\xca\x66\x07\xc6\xc5\x02\xd5\x22\x34\xc2\x42\xa0\x19\xd1\x5b\xde\x14\x32\xe1\xbf\x1e\xb4\x66\x64\x34\x3d\x84\x77\xe9\x04\x7e\x45\x89\x53\x2a\xa0\xf6\x9d\xef\x90\x09\x9d\x18\xd7\x65\x84\xc9\x02\x3a\xa2\xd6\x41\x05\x52\xc0\xa4\x4c\xdd\x08\xdd\x77\xd0\x14\x63\x72\x48\xa7\x96\xdf\x87\xac\x17\xb4\x4c\xe9\xa4\xd4\x88\xd0\x21\x36\xcf\x02\x86\x0e\xb1\xb5\x30\x66\x39\x7a\x61\xcc\xac\x85\x31\xe7\x81\xf9\x0a\x1c\xe6\xa3\x72\x36\x5b\xde\xa5\x93\x6c\x16\x1d\xd2\xb2\x01\xc6\xf9\xf2\x6e\x02\x27\x55\x99\x96\x6d\x7f\xe1\xf0\x9a\xd3\x8b\x0e\x5a\x90\x46\xc4\x3f\x66\xed\x1e\x74\x96\x4b\xa0\xe7\x72\x79\xc8\x9b\xb6\x5c\x22\xc0\x98\x92\x23\x68\x29\xb6\x7e\x31\x34\x20\x03\xfb\xc4\xc9\x4d\x8d\x19\xb6\x06\xc6\xb8\x3f\xc8\xd1\xa9\x31\x5f\x31\xfa\x20\x46\x85\x35\x50\xad\x61\xd9\xfd\x12\xe0\x0e\xec\xa1\x63\xf2\x10\x61\xd9\x62\x49\x64\x1a\xd8\x07\x8e\x09\x41\x9e\xe3\xa2\x83\x06\xa4\x87\xad\x20\x9b\x45\x03\xde\x28\xc8\xcc\x57\x48\xbc\x17\x18\x33\x32\xe0\xed\x43\x3c\xb7\x82\xcd\x05\xdd\xcf\x39\xa5\x9b\xb8\x1d\xa2\x08\x9f\xd3\x48\x8c\x8d\x76\x88\xce\x79\x57\x79\x18\x9f\xf3\x2f\xe4\x69\xcf\x98\x93\x3b\x86\xce\xc9\xce\xb9\xed\xf9\x4e\xbe\x67\xcc\x30\x39\xe7\x80\x73\xfb\xdc\xe3\xf1\x39\x26\xbf\x44\xfc\x44\x24\xab\x01\xd4\xa8\xa1\x01\x0c\x8e\x90\x9c\xf3\xc1\x81\x13\xee\x75\x5f\x8b\x07\x3a\xaf\x06\x13\xa3\x5c\x4d\x2e\x66\xdf\x71\x2e\x78\xde\x67\xcb\xa5\x0c\xbb\x7d\x66\x79\xd9\x2c\xcc\x01\x4a\x0f\x5b\x7c\xd7\x40\x1b\x3c\x46\x3c\x98\x0f\xc8\xa3\x3f\x79\x14\x67\xb3\xe5\x4e\x29\xcf\xec\xba\xe7\x98\xbb\xde\x72\x79\xd0\xc9\x66\xcf\x3a\xe8\x65\x88\x97\xcb\xcb\x08\x31\x32\x9e\xf1\x22\x6e\x5b\x25\x81\xc3\xec\x13\xcf\xc9\x33\x18\xe6\x00\x21\x2e\x27\xaa\x4b\x64\x5f\x78\x84\xd9\x27\xbe\x83\x31\x8e\x25\x12\x77\xb9\x14\x89\xda\x3b\xfe\x8d\xb5\xb9\x80\x5f\x79\xa3\xca\x9e\x83\x04\xb9\x3b\xb4\x40\x22\xde\xd3\x2e\xf1\xb0\xe5\xd1\xa0\x8b\x5c\x6c\x35\x69\xb3\xd4\x14\x58\xa6\x27\xb1\xdb\x21\xf2\x97\xcb\xc2\x2e\x8d\x70\x94\xdd\x2f\x31\x63\x96\xa7\x4d\x7b\xe8\xe4\x90\x5f\xf2\x79\x1f\x98\x05\x6c\xfa\xd9\x2c\x62\xbc\xbb\x61\xca\x92\x28\x5b\x2c\x31\x63\xce\x11\x0f\x24\xe2\xb9\xa7\x21\xce\x73\xd4\x17\x23\xa6\x1d\xa2\x90\x4b\x58\x25\xd4\xa1\x0c\xc4\xbe\x2f\x9f\x29\x45\x61\xf6\xcb\x67\x3e\xc2\x3b\xc6\xec\x7b\x60\x9f\x38\xcb\x65\xc7\x98\xfd\xa0\x01\xff\x1e\x87\x87\x59\x9a\xdf\xc7\xa4\xf8\x71\x1f\x90\x8b\x1f\xf7\x05\xf6\xfc\x7b\xc0\xcb\xe5\xe8\x73\x8e\x7e\xee\xc5\xe8\x9f\x31\x51\xa5\x65\xb3\x61\xb6\x28\x4a\xa7\x3c\x4e\xfc\x25\x2d\xea\xc9\x1d\x63\x96\xe3\x6d\xfc\x01\x1f\x04\xf4\x2f\x7c\x40\x33\xd4\x24\x2d\xa3\xcb\x66\x88\xa7\xe6\x91\xc2\xcb\x8b\x8a\x91\x02\xc6\xbc\xac\x4f\x50\xd6\x7a\x09\xf2\x83\x22\x3f\x80\xf3\x1c\x83\x04\x40\x32\x51\x85\x30\xbb\x0f\x2c\xd0\x5f\xc6\x4d\x2f\x15\xbf\x98\x05\xbc\x44\xe9\x12\x4b\x1f\xf7\x4d\xfe\x35\xde\xe4\x1d\x68\x33\xff\xc6\x27\x41\x04\x0a\x00\x5e\xe4\xbe\xc0\xa0\x12\xa3\x63\xcc\x73\xbc\x4b\xbe\x03\x65\x78\x8e\x8f\xfc\x7b\xb7\x7a\xbb\x0e\x9c\x3c\x02\xf4\x7c\x87\xcf\x25\xf9\x91\xa4\xc8\xaf\x10\xff\xb1\x5e\xe4\x8f\xbf\x29\x52\xe1\xe5\x45\xa7\x28\x52\x89\xd2\xd6\x4a\x50\xcd\x50\xa4\xe2\x13\x9b\x63\x10\xf8\x26\x96\x0d\x0b\xb3\x5f\x13\x5a\xc9\x8e\x2f\x7d\xf9\x24\x89\xa5\x97\x59\x2a\xee\x7f\x15\xd4\xa2\x3e\x36\x3b\x74\xff\xf3\x17\xd2\xc9\x7e\xfa\xf6\x05\xab\x65\xaa\x63\x5d\x47\xc8\x25\x0c\x5b\xd7\x7c\x8a\x35\x39\xc7\x64\x7c\x51\x73\xf9\x8e\xff\x30\x42\xb0\x28\x60\x02\x9c\xf5\xac\x83\xdc\x10\x2f\x97\x81\x9a\xc9\x25\xe4\x52\xd7\x9e\x39\xa4\xdc\x29\xb9\xc6\x79\x7f\x51\xee\xcf\x6e\xdb\x8b\x76\xaf\x49\x2f\x0f\xcd\x23\x0e\x6c\x80\xaf\xa0\x14\xdc\x05\x27\xaf\x2a\x4a\x06\x0c\xb9\xda\xe0\x22\x05\x9c\xbb\xc7\xe4\x56\x87\x1e\x48\x28\x48\x1d\x3b\xf0\xc5\xa0\x84\x02\xda\xe3\x93\x97\xb8\x7c\xe1\x74\x31\x61\x06\x18\x36\xc2\x91\x0e\xcc\xd4\xbc\xcb\x59\x61\x20\xfe\xf0\x61\xe7\xf2\xbf\x0a\x4f\x5c\x2a\x84\x99\x9a\x77\xa1\xdf\x45\xef\x0b\xb2\xbb\xd0\x5b\x26\xda\x28\x74\x4b\x76\x9c\x08\x72\x9d\x84\xb7\x3e\xa4\x34\x00\xc8\xe5\xbd\x0b\xac\xb1\xe4\xfe\x7b\xdf\x74\x71\x36\xff\x59\x5b\xc3\x7f\x72\x21\x79\xf5\x13\x44\xd8\x5f\x81\x2e\xc2\x6a\x48\x8f\x92\xb9\xe1\xd7\xb3\x99\xd4\xad\x60\x21\x42\x1f\x9d\x51\x57\x84\xde\x8f\x19\xf5\x56\x8f\xe8\xb1\x46\x7e\xd6\xb0\xf5\xb8\x51\xa2\x2c\xe1\xae\x06\x25\xd8\xf3\x03\x87\xc8\x22\x08\x4f\x12\xbb\x41\xe2\x11\x55\x9a\x2e\x19\xfd\x92\x6d\x82\xb4\x9f\x34\xbd\xc5\xea\x94\x98\xa9\x16\x4e\x2e\xb4\x3e\xa2\x5f\xa2\x0e\xbf\xb6\xd7\x81\xf8\x50\x8b\x3b\x58\x3d\x0a\xf0\x71\x51\x2e\xf1\x08\x17\x15\x89\xaf\x7f\xfa\x7d\x2d\xc9\xf5\x58\xb3\xeb\x4a\xb9\xc4\x17\x6c\xc8\xf6\xeb\x8a\x7a\xa5\xcf\x66\x41\xc4\xc6\x9f\xa8\xbf\x5c\x8a\xc6\xac\x1e\xd1\xfb\x1a\x79\xac\x61\xeb\x3d\xd4\x64\x1a\xb1\xb7\xf6\x08\xbf\xae\x56\x12\x69\x6b\x75\x61\x7b\x43\xdf\x22\x1d\x54\xda\x23\xc5\x02\xf1\x89\xac\x04\x30\xfa\x00\xa6\x1c\x64\x0e\x29\xab\xa3\x40\xe5\xc2\x96\x2b\xe2\x2e\xb6\xd2\xc5\x86\x6f\x17\x08\xa5\x71\xde\x2e\xb2\x86\x7c\x02\xc8\x42\xc8\x9b\x45\xc8\xc6\x69\xe5\xe0\x95\x46\x5c\x56\x17\xfd\xca\xb2\x9f\x38\x6f\x71\xff\x4d\xf7\xb1\xc5\xb2\xc5\x6f\xfb\x22\x56\x4c\x54\x7d\xfa\xde\xb5\xfe\x1f\x8d\x06\xb7\x0e\xa3\xc1\xad\xff\x99\xbc\x56\x20\x84\x6a\x4b\xd0\x2b\xe0\x92\xa6\x15\xd0\x80\x0b\xd9\x56\xa0\x44\xb3\x90\x8b\x08\xcb\x65\x00\x92\x42\xc8\x25\x03\x1e\xe1\x02\x82\x15\x52\x51\x21\x63\x96\x0b\x8c\x99\x15\xa8\xe8\x3c\x17\x18\x73\x28\xb5\x49\x41\xf0\x21\x21\x0d\xf3\x4d\x8e\x92\xa7\x4d\x63\x6e\x35\x6a\x48\x95\x4e\x02\x4c\x44\xb5\x80\x80\x9b\xc3\x31\x12\x7b\x04\x2e\x34\xd9\xc3\x67\x27\x9b\xdd\x65\xf6\xe3\xb3\xc3\x05\xa5\x1b\xfe\x53\x2c\xee\x7f\xa7\xcc\x8e\x78\x52\x71\xff\xe3\x0f\x11\x96\x6c\x77\xb7\x68\x8d\x5e\xda\x63\xaf\x85\x04\xf4\xd5\x63\xa3\xe0\x5d\xf1\xab\x09\xbf\xfb\x05\xf1\xfb\xed\xa3\xf8\x2d\xfe\x25\x7e\x3f\x49\xf8\xc7\xcf\x12\x4f\xc2\x3f\x7e\x91\xe9\x12\xfe\x51\xc2\xf7\xf7\x3f\xc9\x82\x8a\xb2\xa0\x4f\x12\x50\xdc\x97\x98\x32\xfe\x51\x7d\xe9\x9b\xcc\xf9\x59\x16\xa5\x32\x7c\xfc\xa6\x4a\x90\x09\x45\xf9\xcd\x8f\x5f\xd7\xbf\xb5\x6f\xc6\x6d\x04\x40\x41\xc5\xcb\x1d\x4b\xfa\xec\x30\x95\xbe\xe0\xcb\x97\x1f\x40\x80\xe5\xb2\xf8\xf5\xe3\x77\x08\xae\x34\x59\xae\x5b\x61\x89\x30\x07\xb4\xde\x45\x7c\x1d\x3a\x12\xa2\x64\xbb\xc7\xb0\x5a\xc8\x76\x0b\x7c\xa2\x4d\x3b\xd9\x6c\xa0\x96\x36\xaf\xce\x07\x11\x4c\xbf\xec\xae\x9f\x50\xfe\xb9\x8d\x5c\x0c\x9b\x70\xbf\xce\x37\x7e\x62\xdf\x96\xcd\xa2\xe2\x5f\x94\xba\xbc\x2a\xf0\xc3\xcb\xfa\x56\xa4\xd4\xc5\x49\xd6\x76\x88\xf8\xb7\xfd\x6c\xd6\xc3\xaa\x03\x65\xe7\xed\xab\x5e\xdb\x8f\x89\xb8\xaf\xc8\xfe\x4d\x92\xbb\xf8\xf5\x8b\x0a\x28\x7a\x7e\xfd\x4b\x05\xbe\x2a\xe4\x82\x0a\xac\x67\xdf\xdf\x4f\x68\xbb\x6a\x87\xe8\x40\x54\xc5\xa5\x94\x6d\x8e\x2b\x35\xa6\x3e\x9a\x31\x81\xd4\xa0\x91\x80\xa3\xce\x4a\xa7\x94\x46\x77\x88\x73\x72\x7f\xfa\xfa\x9d\x6f\xdd\x3f\xff\xf5\x83\xb2\xe5\xf2\xdb\x17\x88\x15\x0b\x5f\x20\xfa\xe5\x33\x44\xbf\x15\x20\xc6\xe9\x52\xd0\x6a\x52\x58\xaf\xc9\x47\xd9\x8a\x2f\x6a\xac\x15\x54\xd3\x0b\x8a\x18\x45\xd5\xf4\x62\x71\x8d\x60\x9f\xbf\xbd\x45\xb8\x2f\xc5\xff\x8c\x80\xeb\x7d\x54\x48\x3a\x2b\xae\x79\x7a\x98\xee\x16\xb5\x63\x0b\x5f\x91\xa6\xdc\xc1\x8c\xf6\x80\x09\xc4\x5b\x36\x3e\x64\x8e\x3a\x78\x6c\xae\x35\xfd\xdb\x47\x93\xd1\x6f\x45\xcb\x1d\x06\xac\xf3\x6e\xac\xc8\xce\x34\x92\x8b\x92\x5e\xd7\x32\x7e\x29\xc6\x53\xe5\xeb\x5f\x96\xa2\x44\x0c\xfa\x62\x49\xfe\xf0\x31\x81\x7d\xb3\xe2\xf9\x28\x61\xdf\xd6\x26\x22\x4f\x5b\x9f\x89\x4c\x5f\x0c\x02\xc9\xd6\xef\xc6\x6a\x95\x95\x2b\x6c\x4b\x70\xdf\x87\xa9\x0e\x3c\x7b\x41\x6c\xb9\x14\x8f\xb1\xbb\xd9\x2c\xc0\x5e\xa6\x08\x38\x7e\x50\x27\x77\x63\x6c\x35\x68\xc0\x79\xbe\xd5\x30\x9e\x85\x1e\xac\x61\xcc\x18\xe8\xf8\x1a\x46\xf8\x5e\x81\x7e\x79\x2c\x0e\x56\xe8\x6e\xd1\x6a\x18\x97\x03\x26\x02\x7e\x81\xe6\xf9\x6f\xa3\x2b\x01\x8f\x03\x99\xff\xbc\x49\x1f\xab\x56\xc3\x70\xbd\xb7\x96\xf4\xf3\xe6\xca\x6a\x18\x2f\x53\x6d\xbd\x91\x4b\xd6\x79\x93\x32\x9e\xf6\xa6\x34\xf0\xcc\x53\xcf\x5e\x52\x39\xfb\x15\xa6\x37\xff\x59\x14\xd1\xb9\xf8\x13\x12\x6f\x2d\xa0\xd5\x2f\x53\xab\x9e\xac\x47\xa3\x4c\xa5\x26\x74\x58\xa1\x2e\xc7\x1b\xbf\xd9\x9a\x56\xb0\xd2\xd4\x74\xfd\x64\x15\x32\x7e\x55\xf0\xb8\x35\xec\xbf\xbc\xeb\xa2\x4c\x85\xf5\x84\x3b\x5a\xb8\xb9\x20\x1e\xef\x02\xb3\x32\xf5\xa8\x26\xf8\xdc\x90\x8f\x13\x8e\x5a\xfd\x97\x76\xaf\x69\x64\xb0\xb5\x6a\x18\x37\x6f\x8a\x46\x95\x95\x55\x7d\x41\x0d\xb2\x41\xc7\x46\x59\xf6\x7b\xa3\x6c\x37\x9e\xf9\xde\x59\x36\x46\x82\x87\x15\x09\x66\x25\x88\xdf\xef\x23\x6c\x0a\x15\xfe\x21\xc2\x2b\xcc\x7b\x3c\xa0\x61\xdb\xda\x69\x18\xf7\xfb\xfa\xf7\x39\x6b\x96\x1f\x97\x65\x55\x1f\x11\xd6\xe0\xcf\x7a\x9b\xa3\x28\x18\xca\x07\x0d\x59\x14\xbd\x1b\x05\x63\xa9\x33\x7a\x27\x7c\xe8\xbf\x1b\x0f\xe7\xed\x5e\x13\x1e\x99\x6a\xf5\x5f\x12\x42\x64\x94\x08\x19\x48\x2d\x01\x6c\x81\xe4\x07\x44\x52\xa3\xcb\x64\x0d\x5a\x81\xd1\x45\x8c\x54\x4e\xa4\xb4\xda\x65\x64\xb7\x00\xab\x88\xea\x6b\xac\xc2\x12\xf5\x64\x24\x50\x0f\x18\xa0\x92\x83\x8e\xd2\xb9\x8c\x87\xf3\x57\x97\x32\xfb\xd9\x75\x56\x1e\xe3\x53\xdf\xc3\xaf\xab\xb0\x3f\x44\x7c\x2e\xb9\xf6\xc8\x77\x28\xbd\x67\xcc\xc2\xaf\x1c\x55\x28\x13\x5d\x7b\x71\xe0\x2c\x97\xae\x5d\x9d\x3b\x76\xdd\x57\x39\x03\xfc\x0a\x0c\x66\xc5\xa8\x6f\xa9\x42\xff\x50\x0d\x4b\x4f\x0b\xc7\x4c\x24\x2e\x18\xc3\x2b\x60\x68\x7a\x72\xfd\x30\x49\xb5\xd4\xdc\xa1\x8f\xd5\x12\x6a\xbb\x92\x4e\x7c\x53\x76\xdb\xc2\xa4\xd5\x95\x00\xfe\x0d\xd9\xcd\x1c\xf9\xee\x54\xd2\x0f\x88\x2c\x3b\x95\xcf\x61\x71\x26\x52\xa0\x3b\xd3\xb6\x4a\x68\x94\x4b\xe8\x72\x8c\x64\x98\x8c\x8e\xc5\xd7\xcb\xbc\xe2\x45\x08\x63\xa2\x06\xdc\xd5\xc2\x41\xea\x3b\x65\xc6\x10\x97\x6b\x1b\xc6\xe1\x61\x6a\x3e\x6a\xe3\x68\xb9\x84\x90\x1d\x3e\x3b\xe8\x75\x3c\x1f\x04\xe6\xf1\x21\x11\xe6\x7a\x26\x5b\x69\x8b\xbd\x6c\xbf\xd6\xeb\x9e\x5e\xf1\xa2\x95\xd4\x77\x58\x49\xea\x3b\xac\xf0\xfa\x4e\xda\x22\x16\x05\x8c\x30\xbc\x56\xeb\x61\x25\x55\xeb\x28\x80\x55\x44\x2d\x3f\xbc\xfa\x51\xc0\xb6\xb2\x2b\x4e\x72\x08\x5f\x0e\x58\xa9\x21\xbf\x78\xec\x31\x52\x10\xe5\x9b\x0a\x80\xd6\x28\x9f\x74\x12\xdf\xe3\xd2\xa0\xab\xfa\xb1\xfb\x9b\xaf\xfd\x56\x83\x67\x4a\xcd\xbc\x54\xbf\x36\xb1\xa5\xf5\x6b\x11\x32\x54\x1f\xdf\xe0\x14\x40\xda\x93\x43\x40\x2a\xb3\x54\xa9\x71\xf2\x73\x15\xaf\xf8\x74\xef\xfe\xde\x68\xa7\xd6\x33\xcd\x13\xad\x67\x78\x71\x07\x2c\x4d\x17\x46\x99\xcd\x86\x8e\x35\x88\x54\xe5\xe0\xf4\x55\x72\x5f\x88\x88\x0e\xf3\x58\x36\xbb\xab\xb0\x7e\x79\x0c\x92\x8a\x9f\x0b\x3f\x78\x27\xe6\xe5\x10\x94\xc8\x87\x87\x92\x24\x3f\xbb\xe9\xaf\xed\xff\x45\x95\x48\x1f\x23\xf2\xcf\x73\x69\x92\xd9\x01\x67\x71\x84\xd9\x73\xfe\x0b\xf9\x17\x6b\xb5\x55\x6c\xe1\x71\x10\x9f\x2e\x68\x6c\xa6\x1d\x22\xb0\xf1\x12\xef\xdc\xee\x52\x69\xf3\x10\xc0\x44\x16\x3c\x9e\xba\x3c\x4c\x76\xd9\x72\x99\x6e\x71\xa2\x9d\x95\xe3\x77\xa5\x64\x12\xa8\xe0\x2e\x75\x25\xdc\x7a\xbb\xcd\xa9\x0d\xe1\xa0\xc2\x52\xf6\x0b\x0f\x6d\xc4\x8c\xf0\xfd\x72\x69\x3b\x29\xfe\xaf\x76\x85\x94\x52\x51\x29\xd8\xeb\xe1\xd5\x4e\xc3\x28\xeb\x1d\x1f\xd4\x8d\xc0\x28\x6f\xc8\x13\xc6\x2f\x84\xad\x97\x78\xa6\x27\xe1\x61\x05\x5b\x7e\x10\x05\xf2\x65\x62\xe3\x39\x15\x6b\x05\xa9\x68\xf8\x5e\xab\x79\xa8\x6f\x4a\xc7\xdf\xe8\x27\x4b\x72\x2e\x10\xea\x41\x1f\x60\x05\xf5\x44\x7f\xc0\xe5\x94\xb0\x4e\x82\x3a\xb6\x6e\x5f\x50\x58\xdf\x7e\xe8\x2c\xcb\x10\x82\xce\x0a\x5b\xa7\xb3\x75\x54\x35\x4b\x17\x8c\x53\x42\x7e\x08\x20\x37\x08\x6b\xac\x6f\x85\xad\x70\x63\x07\x9c\x8c\x8d\x85\x1c\x1a\x8c\xee\xae\x65\x76\xe1\x2c\xe6\xee\x94\x08\x73\x1e\x83\xf1\x05\x35\x9b\xe5\x1c\xd8\x95\x93\x94\x33\x5f\x17\xf8\xae\x6a\x34\xff\xa4\x54\xab\x8c\xbf\x89\xdf\xc9\x0b\x83\x8c\x02\xb7\x98\xea\xf6\x66\x5d\xa9\x87\xc4\x42\x4d\xbd\xe5\x12\xb1\xd2\x6d\x07\x3d\x80\x1e\xd0\xbc\xed\x20\x0c\x0d\x50\xf4\x13\x78\xc6\x13\xba\x22\xaf\xe0\x4e\xc2\x3c\x9f\x71\x36\x2a\x05\x1f\x57\xed\xd7\x8b\xa4\x28\x61\x57\x0c\x60\xa3\x8e\xa5\x56\x54\xff\x80\xf3\x3f\x4e\xd9\x5d\xaa\x44\xc8\xab\xa1\x10\x21\x9b\x75\x12\xd6\xc5\xa2\xdc\xaa\x53\xdb\xb1\x1a\xb4\x29\x85\xc9\xa0\x29\xe4\xc5\xae\x8b\x1a\x44\xbd\x31\xa7\x5c\x23\x72\xa1\xe2\xe1\x92\x7e\x2e\x70\x21\xb1\xfd\x9e\xc2\xcf\x9b\x82\xde\x3d\x9f\xae\xfe\xc1\x1a\x6f\x81\x36\xab\x4a\x1b\xcc\xf7\x79\xb4\x3e\x46\x8c\x9c\xc9\x86\x77\xfa\x31\x6b\x17\x09\xa7\x32\x21\xbc\x5f\x4b\xb8\x3a\x15\x09\x41\xc0\xd6\x52\x6a\x4d\x91\x72\x38\x59\x4b\x50\x8b\xae\x56\x16\xf0\x4c\x3f\x18\x33\xaf\xb5\xce\x59\x18\x96\x15\x26\xcf\x09\xfb\x23\xb2\xf2\xf6\xb5\xeb\xa8\x9d\x4a\x6c\x6f\x22\xc7\xd1\x15\x33\xee\x19\xc2\xc4\xa3\x05\x8b\x73\x18\xcf\xb1\xbc\x5c\x0e\x6b\xa5\x28\x12\xd8\x8f\xae\x93\x66\x13\xcf\x8a\x4d\x5c\x8d\x91\xcb\xa9\xc2\x24\x49\x18\xb6\x00\x74\xca\x41\xa2\x01\x0a\x74\x75\x4a\x98\x22\x83\x82\xd5\x9a\x84\x49\x02\x28\x50\xfd\x50\xcb\xb9\x6a\x18\x57\xc3\x54\x8b\x9f\x25\xff\xe3\x35\x17\xdc\x7a\x54\x4c\x21\x68\x2d\xe4\x33\xc5\xcd\x66\x6f\x6b\xa0\xe9\xde\x22\xd3\x6f\xe2\x76\x22\x38\x16\xe2\x5c\xeb\xec\x45\x63\x16\x96\x38\xbe\x97\xa3\x3e\x3e\x08\x75\xed\x63\x4e\x60\xe2\xda\x87\x9e\x23\x98\xff\xc9\x74\xcb\x60\x9b\x25\xb5\x06\xa4\xdb\xbf\xde\x1a\x91\x0c\x61\xbb\xe7\x3b\x2b\x6b\xe7\x6a\xa0\xcb\xdc\x6b\x36\x10\xd3\x92\xe2\x12\xa5\x4f\x66\x51\xac\xf9\xef\xcf\x4a\x1f\xcd\x18\xbc\x6f\x16\x40\xc2\x4e\x2f\xd7\x5c\x20\x82\x4d\x99\x51\x7d\x8c\xb9\x72\x4a\xd1\x01\x4b\xf1\xe8\xc0\xc1\x6a\xb8\x30\xe2\xc2\x08\x69\xd5\x6d\xd7\xb1\xdc\x5c\x0e\x73\x76\x0f\x1d\x10\xe3\xf2\x95\xe8\x62\xee\xa0\xdd\x22\xb6\xde\xb7\x51\xab\x2e\x86\xed\x72\xd9\xaa\x83\x19\x1f\x0c\x6e\x96\x50\xba\xeb\x22\x21\x77\xda\x55\xdf\xc1\x56\xbb\x8e\xb4\xf1\xaf\x26\xd9\x09\x5b\x9f\x32\x6a\x96\x1d\xeb\x29\x4f\x2a\x73\x22\x48\xad\x09\x18\xf8\x35\x78\x8a\xeb\x64\xc5\xed\x8a\xab\xc3\x39\x1f\x2d\x58\x2e\x6f\xa2\x9c\x05\x2e\x6f\x56\x36\x2b\x16\x36\x68\x22\x17\xcb\x55\x13\x21\xe3\x29\x63\xd9\x6c\x47\x7c\x9c\x47\x60\xfc\xbe\x51\xfb\xab\x37\x6b\x7f\x24\x15\xfa\xd2\x18\xcb\x2a\x50\xa8\x96\x7d\xca\xa5\x09\x25\xbf\xb5\xaf\x29\xff\xac\xe8\xb8\xee\xef\xb8\xe3\xf8\x50\xba\x4b\x89\x8c\x6a\x05\xe4\x55\xa6\x54\x31\xda\x2b\x66\xdf\x48\xab\x4c\xd9\x16\x55\xae\x94\x8a\x8d\x8b\x17\x56\x12\xe9\xb2\x8d\x44\x0d\xa4\xe5\x12\x1d\xcd\x52\x7c\xc5\x9e\x1d\x38\xc8\x95\x02\xc4\xd5\x15\x2a\x60\x09\x87\xac\x05\x8c\xb1\xb9\xd6\x2a\x49\xb1\xf2\x94\x4a\xc5\x3c\xe7\xba\xfb\x6f\x4d\x81\x2b\xd8\x32\x4f\x8f\xdf\x4a\x0f\x9a\xd0\xc3\x37\xe3\x2d\xb2\xf2\xfb\x33\xf9\x09\x8b\x49\x42\x42\x3f\x22\xb1\xc8\xc8\xec\xaa\xf9\x41\x93\xc6\x63\x40\x35\x27\xa1\x94\x11\x34\x71\x2c\x47\xbe\x57\x2b\xf9\x7b\x23\x68\x0a\xa0\xa2\x94\xae\x1d\x1e\x2a\xbe\x28\x0e\xd2\x8f\xf8\x44\xb9\xc7\x16\x33\x66\xae\x31\xa3\xae\x7d\xe8\x3b\x39\xcf\x98\x09\xc0\x9c\xba\xf6\x11\x00\xe6\xab\x86\xd1\xe9\x6f\x61\x4d\x51\x5d\x52\x1e\xc4\x4d\x4b\xd5\xda\x4d\x66\x8c\xbb\xab\x37\x53\xd1\xdd\x95\xfd\x57\x9e\x2e\x97\x48\xd1\xbe\x31\x46\x3f\x45\xe4\x2e\x10\xb3\x2f\x3e\xf6\x91\xe8\x0f\x97\x18\x93\x91\xd2\x61\x90\x61\xb2\x14\xa4\x54\xe0\x4a\xd2\x1a\xce\x5f\xd5\x96\x75\x97\x29\xd2\xb9\xd8\xc2\x2e\x75\xed\xa7\xc0\x49\xce\x0e\xe2\x3d\xae\x84\x80\x34\xb5\x6a\xf0\xe5\x20\xd5\xea\xe1\xfa\xe2\xc3\x47\xbe\x98\xd0\x87\x93\xcd\xde\x0e\x9a\x94\x6d\xa5\x11\x64\xd3\xb9\xd9\x2e\x65\xf8\x35\x19\xc7\x96\xbe\x0e\x5e\xa1\xa2\xc6\x82\xfe\x11\xdd\x58\x4c\x61\x4e\x32\x2b\x26\x19\xec\x41\xaf\xae\xe8\x16\x51\xb9\x40\x29\x2b\x21\xc9\x74\x66\xae\x30\x36\x00\x23\x87\x6e\x1d\x44\x2c\x1e\xec\xd5\xe3\xa1\xa7\x11\x7c\xa4\x9d\x39\xe8\x9c\x79\x93\x6d\x0d\x22\xe4\x8a\xa5\x51\xcd\x73\xd7\xf8\xf5\x9e\x32\xc2\x38\x87\xa2\x2e\x5f\x50\xc3\xfb\xbf\x1d\x68\xc4\xd3\x00\xee\xb3\x03\xc3\xcc\x83\x15\x70\xcb\x1c\x02\x1d\x20\x51\x6c\x98\x24\x1c\x8b\xec\x26\x4c\x04\xca\x01\x86\x9a\x2c\xdf\x50\x74\x69\x8d\x57\x98\x92\xa5\x62\x21\xf4\x9c\xa4\x37\x92\x69\xc6\xad\x26\x84\x30\x34\x6b\xa7\x6a\xc0\xc7\x86\xd8\xe0\xae\xed\xc6\xd6\x16\xfd\xb8\x08\x57\xaf\xa4\x2b\x6b\xa7\x86\x81\x6c\x26\xd1\x2a\x97\xd8\xcc\x81\x6e\x98\x19\xe5\x69\x36\x8b\x7e\x8e\x11\x0f\x61\xc2\x12\x76\xa7\x19\xde\x74\x00\x77\x9f\xef\x27\x15\x87\x67\x9c\x69\xc1\x18\x63\x9c\xa7\x11\x26\x3b\x8f\x30\xa3\xfd\x1e\x6b\x79\xdb\xf2\x3b\xef\xcf\xd4\x77\xde\x9f\x71\xac\x98\xe7\xf1\xde\x2d\x6f\x6c\xbb\xd5\xa2\xf5\xa4\x8f\x70\xfb\x66\x11\xeb\xeb\x18\xaf\x46\x47\x93\x50\x2c\xbd\xc9\xa9\x1d\xd7\xbd\x10\x8d\xca\xda\x0a\x94\x9c\xda\x48\xb6\xf0\x2b\x7d\x48\xbb\x7a\x44\xdd\x3a\xf9\x55\xc3\xd6\x4e\x77\xfb\x09\x20\x7e\x75\x29\x1c\x06\x5b\x2e\x7d\x00\xf9\xcb\xa3\x5e\x89\x4f\x87\xe3\x08\x79\x60\x73\x55\x2c\x10\x0f\xce\xf0\x3d\xfb\xdc\xe3\x7f\x4f\x9c\x5c\xb1\x20\xe6\xcc\x71\x84\x8a\xc2\x55\x43\xb1\x80\xad\x86\x38\x09\x35\x7e\x12\x46\x3e\x11\x8f\xb8\xe4\x1b\x16\x07\xa7\x9b\x29\x9f\xf5\xea\xf7\x80\xba\xa9\x13\xe6\x8f\xbc\xf2\xbd\x3a\x9c\x20\xf7\xde\xaa\xbb\xd0\xcd\xa9\xdd\x4e\x81\x14\xb0\xf5\xd6\x39\xb1\x4f\xbc\xb8\x36\x3a\xce\x3e\x61\xa4\x08\xa9\xa9\x1a\xf5\xeb\x9a\x85\x30\x1c\xe7\x8a\x0e\x19\x82\x39\xa6\x4b\x99\xe9\x29\xfd\x71\xf8\xcc\x94\x1d\xc0\x33\xf5\x64\xe0\x4e\x18\xd7\xf6\xa1\xe6\x6e\x7f\x93\x7d\x3e\xdf\xa9\xfc\xcf\xd9\xec\x5d\x37\x51\x2c\xac\x2c\x91\xe9\x7e\xf2\xa6\x86\xbc\xf4\x10\x30\xa5\xc2\x30\x65\x69\x2a\xdb\x86\xea\xc7\x78\x56\xf3\xe8\x99\xaa\xfa\x72\xe6\x37\x89\x22\x2a\x39\xca\xf3\xdd\x72\x99\x54\x41\x82\x12\xfb\x0a\x01\xd0\x15\x15\x75\x55\x76\xd7\xa7\xb6\xb3\x6a\xd0\x81\xdc\x1e\xde\x3d\x6d\xb6\xb4\xeb\x73\x31\x94\x37\xac\x35\x4b\x69\xb2\x63\x8d\xc1\xdd\x13\x7a\x16\x03\x58\x28\xa6\xfd\x6d\x52\x15\xc7\x12\x1a\xaa\xdb\x13\xe2\xb3\x31\x33\x5f\x67\x26\x23\x73\xd3\x5d\x09\x3d\x55\x79\xb0\x71\xba\x4d\x02\x12\xae\xe7\xbe\x3f\x52\xb9\x8b\x3c\x7b\xd1\x74\xc9\xa9\x6b\x7a\xa4\xee\x9a\x3e\x99\x99\x01\x99\x9b\xa1\x2c\x71\x16\x6e\x2d\x91\x34\xd7\xcb\x1c\x1e\xca\x32\x9f\x2a\x26\x23\x9d\x8a\xe9\x92\x93\xb6\xe9\x91\xd3\xb6\xe9\x13\xc6\x0b\xad\x0f\xcd\x90\xf4\x5c\x66\x36\xa1\xec\xe4\x34\x61\x18\xef\xfe\xdb\x21\x2a\xec\xc2\x55\x1c\xcc\x83\x94\x32\x4e\xba\xaa\x53\x62\xf6\xe9\xc2\x41\xae\x5d\x70\x8c\x19\x81\x9f\x39\x36\x99\xe1\xb3\x35\x18\xf1\xe2\xd5\xc9\xa7\x45\xcb\xff\xce\xcb\xb2\x72\x39\x1f\x33\xa3\x3c\x40\x9e\xed\xe7\x8b\x8e\x5d\xe4\x39\x92\xf0\x9c\x87\x1d\x51\x8e\x0a\xcd\xe1\xbe\x0f\x14\xec\xf3\x82\xc5\x61\x1b\x2f\x7b\xa3\x5c\xa8\x84\x8e\xbb\xba\x7e\x49\x6f\x9d\xd2\x94\xaa\x48\xea\x0b\x95\x8e\x7e\x91\x40\x8e\x00\x39\xd2\x65\x4f\x9f\xae\xf7\x74\xc2\x91\x47\xf5\x75\x9b\xe4\x41\xdd\x2a\x7c\x67\x76\x95\x0b\x63\xc3\x3a\xf2\xb8\xcc\xec\x2e\x97\x9e\xed\x82\xe2\x37\xb1\x50\x06\x09\x64\x5c\x61\xf4\xf5\x61\xc2\xcc\x83\x2a\x19\x4d\x98\xd9\x3e\x22\xd5\x09\x33\x47\xc7\xda\x40\x1f\xc7\x9d\x23\x0f\x09\x3d\x79\x48\x78\x50\x85\xf9\xcf\x72\xd4\x15\x27\x8c\xe2\xb8\x6f\x74\xcc\xc1\xf9\x14\xac\x7d\x24\x60\x1f\xf6\x01\xfd\xc3\xbe\x4c\x54\xa7\x81\x1e\x65\xb4\xcd\xe4\xf9\xe4\x2b\xdc\x9d\x35\x3d\x12\xf4\x7c\x93\x69\xad\x9d\xd4\x13\x8b\x0d\x1f\x0c\xbb\x3d\x4a\xe9\x41\xb5\x04\x9f\xa4\x74\x74\x5c\xe2\x75\xc2\xd6\x5a\x45\x47\xc7\x66\x6c\x1c\xad\xaa\x23\x01\xd5\x27\x61\x79\xfb\xa7\x63\xc9\xa9\xae\xd8\x1b\x32\xc5\xb2\x06\x87\x8a\xe3\xbd\x8c\x05\x5f\x84\xc8\x75\x48\x4f\x6b\xe8\x27\x4a\x4f\xde\x14\x17\x39\x14\xca\x4a\xa9\x99\x4f\x23\x0a\x43\x1f\x9b\xc1\x78\x76\xac\xdb\x27\xe4\xda\x45\x67\x0d\x29\x10\xcc\xc4\x82\x5f\x97\x8f\x20\x59\x7e\x00\xb7\xd2\xde\x57\x38\x48\x6c\xab\xa6\x82\x07\x3f\xa2\x69\x9d\x4c\xc6\xda\x50\x7b\xe1\xfc\xcb\x6d\x1b\xbf\x7f\x0b\xa7\xe3\x0f\xfa\x3b\x0c\x07\xd2\xdb\xca\x8d\x74\x97\x24\x8f\xb3\x46\x95\xfe\xa4\x37\xfe\xfd\x9b\xfe\x97\xf9\x96\x4b\x79\x5f\x85\xde\x0d\x58\xee\xbf\x2c\xc4\xee\x80\x95\xec\x7f\x99\x3b\x97\xb3\xe2\x3e\x6e\xd0\x29\xb0\xec\x01\x43\x0d\xbe\x6c\xee\xdc\xca\x40\xc3\x78\xee\xd2\xcd\x7e\xf1\xa4\xd0\x76\x23\xc6\x8c\x67\xb8\x7d\x14\x35\xd3\x4b\xc4\xcb\x98\x7a\xb0\xbb\x04\xa1\x05\x9e\x83\xe9\x8d\x47\x5b\xce\x54\x3e\x49\x5d\x7f\x18\x4d\x46\xad\xb4\xd9\xdd\x94\x6d\xe1\x1e\xa3\x96\x3c\xb1\x4c\x63\xeb\x03\x10\x16\x80\x8d\x44\x9e\xd1\x9a\xae\x4b\x4d\x0d\x63\xf0\xe6\x51\xef\x10\xf6\xbf\xa9\x05\x5b\xd8\x68\x65\x91\xbc\x9f\xd2\xaf\x97\x18\x6f\xbd\x8b\xcd\xbb\xae\x5c\xb4\xac\x46\x6a\xb9\x4e\x36\x1e\x0f\x70\xcc\x04\xe7\xdd\x83\x41\xd0\xf3\x2b\xad\x76\xe4\xaf\x95\xdd\x0e\x91\x22\x32\xdf\x35\xb9\xea\x33\x42\x61\xe4\x1a\xcf\xea\x18\xc1\xa3\xb0\xbf\x10\xc7\x0c\x1e\x75\x2d\x50\x04\xd9\xcf\x0e\xf2\xc4\xe6\x67\x18\x80\x43\xc9\xcd\x8f\x70\x0e\x26\x90\xcb\x7c\x25\x21\x9e\x90\xef\x2f\xbc\x0d\x85\xa6\xf1\x1c\xdf\xc1\x48\x24\xf4\xa7\x89\x71\xe1\x71\xd9\x10\x60\x2b\x71\xc6\xb4\xa6\xb7\x15\x9b\x7c\x56\x62\xe6\x6e\xd1\x4a\x6e\x56\xf5\xeb\x6a\xff\x36\x92\xc7\x65\xd8\x62\xcb\x25\x34\x44\x33\x6f\x6b\x18\x47\x07\xe9\x81\xd0\x30\x1e\xb7\x29\x21\x44\x5f\xc7\x33\x79\x56\x4f\x2f\xf5\xc2\xd0\x4c\x2e\x06\x4d\xb1\x6e\x12\x0f\x5b\x4d\xbe\x50\xf9\x24\x88\xbf\xc9\x8c\xb2\x87\x9a\x24\x14\xa7\x26\xde\x5a\x97\x68\xf7\x63\x1d\xe2\xd3\x82\xe5\x7f\x97\x8b\xb1\xe5\xab\x5b\x80\x01\xf5\x48\x28\xd6\x68\xdf\x51\x6c\x37\xb4\x4f\x95\x65\xd9\xed\xa9\x19\xd2\xd0\x7e\xef\x08\x1a\xf6\x7c\x14\x90\xd0\x98\x91\x90\x2f\xa8\xda\xfa\x70\x7b\x92\xc2\x9b\xb1\x37\xf0\xee\x8f\x52\x78\xd1\x50\xe0\x15\x39\x22\xff\x73\xea\x92\xd0\xa8\xbb\x5b\xf3\x0e\x0f\x53\x79\x1b\x5d\xc8\xfb\x54\x21\xa1\xd1\xe1\x7f\x4e\xda\xbc\x00\xfe\x87\xf1\xcc\xf5\x21\x09\x8d\x9e\xcb\x52\x65\x54\x8e\x84\xa8\x79\xdd\x46\x01\x5e\xad\xf4\x49\x13\x15\x91\xc7\xb9\xba\xd5\x30\xfa\x9b\x26\x86\x24\xe0\xe3\x03\x10\x2f\x5f\xe2\x55\x4c\xec\x84\x9e\x1d\x14\x10\x96\xf4\x0a\x4c\xce\xce\x1b\x72\x9c\x2c\xa4\xfe\x49\x2b\x39\x2e\x26\x4c\x17\xb3\xd3\x30\x5a\xee\x9f\xcb\x09\xa3\x7f\x50\x4e\xc3\xa8\xd6\xdf\x2c\x66\x56\x8f\xb7\x5a\x7f\x5b\xcc\x88\x6d\xce\x48\x51\x8f\xb2\x87\x62\x83\x5a\x98\xcc\xeb\x59\x6f\xd7\x27\x73\xfa\xce\x91\x2c\xa6\x39\x5b\x4b\x8c\x92\x22\x3b\xeb\x45\x9e\xb5\xff\x50\x24\xe9\xc5\x85\x2e\xea\x1b\xc9\xbd\xa4\xd8\x28\x5d\x6c\x22\xac\xe8\x36\x84\x7a\xa9\x9c\xab\x3c\x8c\xd0\x7a\x8a\xd2\xbf\x32\x5e\x68\x8f\x80\xa6\xa4\x1b\xd1\xb7\xc5\x88\xeb\x50\x5e\xd3\x75\xe0\xc8\xb7\xb2\xc9\x28\x76\x8b\x82\xc3\x1d\xd3\xf9\x93\x26\xce\x54\xf4\xcb\xaa\x07\x7c\x00\x6c\x61\xda\xcc\x18\x06\x61\x30\x0c\x7a\x5e\x00\x9e\x6e\x57\x64\x57\x57\x23\xcc\xb5\xad\x21\x14\x28\x74\x5f\x32\xf3\xa3\x3c\x8e\x4d\x3e\xba\x50\x82\x6a\x7d\x8b\x01\xf5\xd3\x44\x5c\x01\x93\x5b\xc1\x2b\xaa\x18\x6e\x33\x36\x7c\xe8\x0c\xa9\x2d\x27\xee\x89\xb4\x05\x5b\x3d\xa2\x45\x9d\x4c\xeb\xba\x4c\x93\xd0\x9c\xd3\x99\xe3\x35\xeb\x9c\x67\x0b\x5e\xc5\x78\x99\x4f\xe8\x0a\xf6\xf7\x70\xbd\x79\x18\x70\x21\xea\xd9\x41\x3c\xc9\x3e\x74\x1d\xe4\xd9\x05\x07\x27\x3a\xfa\x90\x16\xad\xf0\xbb\x27\x64\xfd\x10\xc7\xb8\xc6\x13\x7a\x38\xc4\x98\xac\x67\x0e\x79\xe6\xf3\x08\x05\x7c\x76\xbb\x6a\x69\x0a\x78\xf8\xe1\x92\x16\x0b\x05\xcb\x35\xda\xef\x21\xc0\x8c\xce\x50\xca\x6f\x0d\xba\x90\x7b\xc7\xc7\x70\x53\x54\x78\x9a\xd8\x67\xcf\x20\xef\xdd\x8c\x91\xf0\x37\xb0\x45\x3e\x38\x11\x66\x22\xea\x1c\xfb\x04\xa7\xa9\x65\x2d\xea\x46\x60\x3f\xba\x4e\x22\x03\x60\x3e\x38\xd2\xd2\x04\x47\x32\x46\xad\xe4\xb8\xfc\x17\x92\xe4\x4f\x8d\x91\x17\xa8\x07\xb6\xdc\x27\x95\x9c\x5a\x24\xa5\x10\xa1\x6a\xb0\x5e\x31\x3e\x5c\x27\xd1\x16\x95\x98\x18\x99\xf1\x8a\x58\x42\x2e\x95\x23\x89\x30\x1a\xc0\x3d\x42\xa9\x6f\x71\xf9\xf6\xcc\x98\xe5\x98\x3d\x74\x88\x6b\xcc\x73\xcc\x3e\xe0\x81\x19\xc6\xa6\x92\x84\x5a\xde\x26\xb3\x51\x62\x05\x97\x64\xc4\xe2\x9e\x54\x52\x22\xfd\xad\x0c\x01\x84\x2c\x2f\x1c\x7d\x20\xf3\xe5\xf5\x66\xcc\x45\x90\x64\x30\x1e\x68\xbb\x15\xb1\xaa\x15\xd4\xd6\x61\x5e\x50\x5b\x87\x59\x51\x69\x4b\xe6\x45\xea\xaf\xce\x18\x3a\x78\xc3\x10\x80\xb7\xfc\x40\x6a\x67\x67\x42\x8c\x30\xe6\xf2\x77\x56\x94\xf1\x22\xef\x95\xf7\x1b\x85\xb0\x34\xe7\x98\xc1\xbe\x7a\x56\x90\x47\x0a\x73\x88\xce\x55\x74\x56\x84\xd4\xa2\x4a\x85\xe8\xbc\xa8\x6f\x53\x67\xa9\x7b\xaa\xc6\xac\x98\xe7\xc5\x59\x0c\x10\xf3\xbc\x2c\xd5\x89\x2d\x7b\xe1\x3b\xc8\xdd\x73\x73\x6c\x8f\x69\xfc\xa3\x9c\xda\xe8\xbe\x93\xda\xab\xca\x13\xe2\x05\x11\x5e\x24\xef\x75\x88\xcf\x79\x7c\x5e\x24\xe9\xab\xb2\x15\x7d\x53\x36\x8b\x09\x4b\xdd\xd5\x23\xaa\xd4\x49\xad\x83\xad\x06\xad\xc0\xac\x3a\x63\x5b\xcf\x31\xf9\x37\x2b\x8a\xa0\x92\x7e\x42\xc2\x8e\x9a\xdb\xce\xeb\x45\x53\x04\xfa\x9e\xf8\x11\xee\x00\xe6\x7b\x2a\xb3\x75\xc1\x3f\x55\xeb\xd8\x35\xc7\xee\x2e\x1c\x5e\x16\xf3\xfd\xcd\x19\x3d\xcb\x71\xaa\xc9\x2a\xf3\xf0\x5c\xdf\x43\x80\x68\xf9\x69\x4b\xae\xbc\x96\x2b\xbf\x2d\x97\x70\xee\xba\x65\x66\xb5\x0c\xaf\x3f\xe2\x73\x8b\xd1\x96\x31\x6a\xf7\xd4\x2d\x07\xb9\xa3\x99\xef\xb9\x39\xd9\x30\x49\xc8\x99\x3c\x26\xd8\x73\xf3\x12\x23\xa6\xb0\x97\xfe\xea\x7b\xb6\x66\x99\xa9\xa5\x82\x6d\xce\xee\xae\x3a\x05\x9c\xc1\xc0\x52\xe3\x0a\x86\xd5\x4a\xbf\xfb\x7d\xb8\x39\x28\x78\x37\x1b\xb3\x9c\x6b\xcc\xf8\x20\xc8\xb9\x9c\xca\x31\xfe\xd1\x5b\xf8\x79\x89\x9f\x07\xfc\x64\xd0\x1c\xcb\x0c\x8b\x6d\xab\x50\x4f\x5a\x01\x0b\xba\xdc\x76\x90\x8b\xed\x5b\xd7\x41\xfe\x11\x56\x1b\x7e\xb1\xcd\x90\xbe\x18\x02\x46\x3d\xfb\x76\xe1\xa0\x7a\x59\x82\xbc\x7b\xb5\xd9\x3e\xae\x93\x85\xbe\x30\x9d\x28\xcd\xb9\xcf\x96\x4b\xc4\x8c\x1e\xb3\x2f\x16\x60\xb5\xc5\x41\xe0\xec\xa2\x41\x8f\xe5\x1a\xc0\x6e\xb6\xee\x3d\x6f\x3b\x31\x63\x8d\xeb\xe5\xd9\x2f\x0e\x7a\x68\x71\x11\x04\x82\x37\xcd\xb8\x39\x43\xa6\xd7\xb6\xa7\x57\x56\xa3\x57\xbf\x8e\x04\xcb\x3b\xff\xf4\xc6\x29\xc7\xcb\x38\xd9\x03\xf5\x98\xe1\x45\x01\x1b\xde\x04\xde\x18\xbc\x13\x03\xff\xe5\xbc\x57\xa7\xf2\x69\x5d\x1b\x06\x7c\x61\x8f\xab\x7c\x37\xd6\x79\xc0\x59\x3d\xde\xfb\x31\x4a\xaf\xd5\xf5\x89\x8b\x33\xcb\xa5\xf4\x1a\x0e\x7b\x92\xeb\x3f\x57\x73\x96\x3b\xe5\x4b\x40\xee\x26\xc8\xb9\xb9\xcb\x40\xb3\x61\xaf\xca\x82\x52\x56\x6c\xca\x8c\x8d\x19\xa3\x00\xde\x64\x39\x64\xa3\x56\x29\x15\xe3\xdb\x57\x66\x9c\x2d\x18\x75\xf9\x0e\x68\xde\x4e\xef\x04\xc5\xb1\x90\xd1\x63\x84\xd7\xd4\x18\x06\x84\x19\xcf\x6d\x8c\xad\xb3\x97\x74\x8a\xe7\x42\x4f\x5e\x05\x58\x9d\xeb\x31\xa3\x17\x25\x76\x45\x2e\xa5\x8f\x47\xa5\x6a\x3d\xce\x65\x7f\x25\xfb\x0e\x36\x3b\x6d\xe4\x62\x1d\xee\x62\x53\xc7\x72\x92\xe2\xa6\x3e\xf1\x28\x33\x4e\x9b\x7c\x77\x2c\x0b\x96\xaa\x7f\xb5\xed\x72\x8d\x33\x17\x61\xb9\xf1\x5a\x9c\x99\x72\x6e\x3f\x5f\xa9\xd1\x42\xd4\x68\xf9\x24\x83\x37\x4d\x1e\xf4\x93\x91\x41\xce\x5e\x90\x4f\x5c\xa3\x35\x42\x18\x13\xdf\x7e\x5e\x38\xd0\xcd\x9f\x38\x5e\x7b\x06\x69\x0f\xbe\x48\x93\xe3\x97\x03\xf7\x31\xf1\x0d\x78\xe3\x89\x0d\xe8\x4b\x95\xf8\xf6\x60\xee\xa0\x7d\x52\xe0\x78\x8b\x85\x83\x3e\x01\x0a\x40\x0b\x22\xc8\xa1\xfb\xf0\x75\xfb\xbd\xcb\x0b\xf2\xa9\xb7\xd2\xe8\x1a\x0f\xb7\x61\xc0\xc6\xc1\x95\x78\x9f\x02\xf9\xa4\x3a\x67\x58\x6e\xfe\x05\x15\xbc\xc4\x2c\x26\x46\xaf\xa7\x9e\x7f\x42\x39\x8f\x2f\x27\x39\x8f\x2f\x22\x39\x8f\xef\x11\x73\x9e\x51\x77\x31\x71\xed\x97\x03\x5e\xa3\x1d\xcf\x78\x6a\xaa\x68\x91\x78\xc6\x4d\x08\xa4\x48\xba\x05\x5b\x2c\x19\x0d\xcc\xb8\x48\xc9\xb6\x73\x75\xe6\xee\x1a\x91\x97\xcd\xf2\xbf\xbb\xf4\xba\x84\xda\xb0\x19\x31\x22\x0f\xc8\xc4\xc8\x47\x8c\x4d\x80\x5d\x9c\xc1\x18\x82\xd1\xe3\xda\xc7\x0e\x71\xed\x4b\xdf\x29\xc1\x5f\xb3\x88\xb1\x05\x03\x5a\x75\xbf\x47\x2f\x2d\xd7\xb8\xf3\x40\xe1\xf9\x30\xe5\x1b\x52\xfb\xcc\x77\x78\x34\x47\xe7\x5c\xcc\xf2\x72\xd4\xb5\xe7\x9e\x93\x6b\xcc\x58\xce\x35\x98\x6b\x31\x23\xec\xf7\xc6\xd4\x5b\x35\x8c\xcb\x97\x2d\xf7\xdd\x64\x53\x44\x27\x4a\xc6\xde\x46\x7e\x32\xcd\xd9\xd0\x93\xd8\x05\xb2\xbf\xd7\x32\xae\xce\xe2\x34\x7b\x9a\x64\xea\x31\xbb\xed\xe9\x31\xe8\x4c\x35\x67\x4f\xeb\x4a\xdb\xb4\xd3\x30\xea\x9f\xb6\x6e\x8a\x55\xc6\xc6\x5c\xaf\x49\x90\x94\x78\xb7\x70\xa4\xba\xed\x87\x5f\x52\x7d\xc0\x57\x57\x54\x24\xfe\x07\x4e\x5b\xea\x61\x33\x95\xe0\x7d\xf0\x49\x91\x27\xac\x35\x08\x38\x56\xdc\x20\x12\x1b\xd2\xbc\xd1\x0a\x15\xeb\x2d\xb6\xb6\xa9\x61\x84\xd1\xdb\x4d\x4a\x37\xe2\x59\x34\x22\xd9\xf4\x73\x20\x3b\xd0\x80\x5b\x8a\xef\x17\xb6\x48\x21\x3a\x42\x54\xdc\x76\x44\x34\xe7\x5c\xe5\xef\x1b\x06\xeb\x4e\x71\xdb\x77\x9b\xb3\x37\x4f\x7c\x74\x29\xf2\x61\x14\xa7\x16\x64\x3a\x74\xf4\x62\xbb\xae\x00\x1c\x40\x00\xc7\x8a\xe8\xa4\x8e\x5c\xe2\x93\x10\x93\x1e\x0f\x7b\xa0\x4b\x20\x03\xca\xe5\x4a\x29\xe7\x2a\x6a\xa6\xb5\xab\xf0\xcd\x88\xf4\xc8\x80\x9c\x3c\xc5\x38\xb2\x70\xf8\xfa\xc3\xe8\x0f\x5f\x9f\x4b\x33\x09\x3e\x8b\x3b\x09\x55\xc4\xd8\x0b\xe8\xe1\x13\xef\x33\x9f\xba\x7b\x42\x48\xca\x07\x38\xe7\xed\x09\xd9\x29\xcf\xf7\x70\x90\x22\x63\x79\x2f\xc1\x8a\x4b\xfa\x35\x87\xcd\x5e\x13\x4e\x25\xfc\x1c\xfd\xb4\xd7\xe1\x13\xf3\xc3\x67\xb3\x49\x69\xfb\x88\x83\x04\xe0\x23\x07\x8c\x8e\xb3\x59\xe4\xe7\x25\xe8\x33\xb6\xc2\x5d\x7a\x50\x85\x1b\xb6\x1c\xd9\xcd\x4b\x0e\x7e\x88\x78\x75\xed\xa1\xf3\x61\xdf\x0c\x65\xb6\xcd\x44\x9c\x0c\x76\xe1\x74\xf2\x2e\x98\x8d\x81\x06\xda\x98\x7b\x9a\x3b\x0a\xd4\x31\x6e\x03\x65\x44\x11\xcb\x23\x81\xac\x4c\xf1\x33\xf1\x73\x34\xc8\x15\x49\xf1\x47\x00\x0e\xb9\x8a\xc0\xc5\x14\xf5\x02\xac\x58\x34\x70\x75\x5e\x60\x0c\xe0\xbc\x5d\xd5\xa4\x1b\xb0\xd1\x64\x28\xab\xc2\x6b\x99\x03\x54\x6d\x6d\x55\x98\x61\x3b\x8a\xc0\x81\x6b\x52\x10\x8c\xd6\xbf\x9d\x87\x7c\x13\xfb\x77\x33\xe5\xe8\x60\x5d\xc9\x2b\x8f\x7e\x95\xd9\x7a\x8c\x1d\x4b\x72\xcc\xda\xc2\x9a\x62\x96\xa9\xad\x0e\x17\x1a\x6b\xec\xf0\x29\x0d\xde\x5a\xc0\x79\x43\x22\x1e\x69\xf2\x53\x7b\xb0\x9d\x9b\xa4\x55\xbd\x9a\x04\xe6\xdd\xab\x4a\xa9\xee\x92\x82\x26\x49\x51\x26\xad\xdc\x9a\x6c\x53\x1c\xeb\x9f\xeb\x6d\xee\x6c\x4f\x52\x34\x88\xbb\x56\x08\x88\xb3\x4d\xdd\xdd\x06\xfe\x62\x91\xe0\x47\xc3\x37\xb9\xc8\x7a\x3e\xc3\x0d\x16\xed\x60\x58\x99\x0c\xa7\xc1\x5d\x5f\xd7\x8c\x89\xee\xbd\x6e\xeb\x6d\xd9\xf8\x2a\xac\x47\x2b\xb8\xa4\xf7\x87\xb9\x1f\x67\x0b\xf9\x3c\x0f\xf3\xdf\x0a\x7c\x9e\x1e\x3e\xa1\x26\x04\x99\xf4\x7d\x11\x2b\x30\x37\x7b\xfe\x4e\x29\xd2\xf5\xb5\xc6\xff\xc0\x48\xf0\x81\x6d\x5b\x68\xf8\x87\x77\x3b\x6b\xe3\x17\x46\x63\x77\x5d\xcd\x3f\x6f\x6e\x28\xfe\x9f\xd6\x21\xcd\xdb\x75\x48\x6b\x13\xe2\xaf\x43\x9e\x0f\xd7\xd6\x88\x98\x07\x36\x03\xa6\x79\xbe\xe2\x6c\xf7\xaa\x13\xa7\x6c\x4e\x5c\x02\x22\x06\xd4\xbf\xb3\xcd\x72\x52\x1f\x5b\x83\xa7\xf5\x03\xad\xe1\xbb\x5a\x5d\xf3\x6d\x27\x05\x76\x70\x4e\xe9\xa0\x69\x8b\x4b\xbe\xcc\xbe\xf7\x78\x58\xdb\x21\x9c\xc7\x47\xcf\x51\x1b\x79\x58\x1c\xf9\xc2\x11\xe7\x48\xc9\xda\x3e\x7d\x6e\xe6\xc0\x87\x90\x47\x29\xbd\x54\x17\x20\x28\xf5\x70\xad\xbe\x5c\xa2\x5a\x9d\xbe\xb2\x71\xbf\xdb\xf6\xcc\xdd\x22\x61\x93\x71\xdf\xeb\x77\x07\x51\x30\x0e\xcc\x6b\xe2\x0f\xfb\x83\x20\x0c\x03\x6f\x6c\x5e\x13\xf5\x20\x38\xc7\x8b\xda\xd3\xc0\xfc\x75\x4a\xba\x93\x68\xdc\xe6\x92\x2d\x07\x42\x44\x78\x3a\x66\x6e\x04\x20\xed\x1d\x3a\xf3\xa6\x45\x86\x01\xf3\xfb\xbd\x68\xce\x93\x86\x41\x14\x4c\x59\x6f\x6c\x2e\x9e\x19\x19\x06\xcf\x93\xf6\x30\xf0\x79\xc2\xa8\x3f\xe4\x9f\x73\x27\x23\xc0\xf3\xdb\x23\x5e\x1a\x24\x09\xdf\xb1\x3c\xd4\xee\x4d\x59\xd4\xf6\xcd\x93\xe6\x0a\x13\x8f\xd6\xea\xc4\x7d\xd7\xee\xbd\xf3\x04\xc1\x7c\xe2\xd9\xae\xa3\x48\xe6\x4b\xdb\x04\x95\xa4\x11\xf0\x22\x65\x1f\xc0\xec\x9f\xbe\x83\x38\xbd\x92\x6e\x07\x36\xe8\x69\x64\x2b\x5d\x2a\x17\x70\x29\x6d\xd6\x65\x3d\xd6\x43\xf4\x14\x6f\xd4\x34\xb1\x97\xe2\x74\xb9\x41\x2f\xe5\x26\xf6\xed\xd3\xc5\xde\x1b\x0a\xcc\xe6\x09\x5a\xd3\x59\x82\x32\xa6\x79\xa2\x17\xd4\x92\x56\x62\xbd\x3f\x29\x17\x37\xcf\x40\xa1\xec\xcb\xcd\x33\xd0\x2d\x3a\xc2\xf1\xba\x3a\x30\x26\xc1\xd5\x9f\xb4\x07\x95\x81\x66\x03\xd0\xb9\xa6\xaf\x2b\xa9\x11\xfd\x1d\x07\x9f\x0f\xd1\x61\x9f\x91\xd7\x50\x3a\x45\x37\xbf\x12\xe6\x9a\xcd\x0a\x71\xfb\x11\x74\xff\x1d\x1f\xa3\x2b\xbc\x7a\x44\x57\x6b\xfa\x83\x85\xda\x62\x30\xfe\x21\x66\xfc\x62\xc8\x3b\xc6\x16\x8f\xf1\x4e\x7f\x3e\x21\x22\x2a\x3e\xcc\xe4\x57\x99\x71\xfa\x9e\xff\xba\x42\x49\x5d\x19\xe0\x55\x83\x5e\xbd\xa5\x65\x18\x24\x96\xaf\xb7\x4c\x59\xf1\xea\x5a\xa2\x5f\x0c\xd5\xaa\x6f\xe9\x1c\x3c\x7b\xe6\x18\xca\x51\x32\xbd\x6d\x8a\xb4\xe9\x21\xb9\xef\xb1\x75\x8d\xc4\x42\x19\xd9\x7a\xdb\x74\x11\x3b\x1b\xda\xe1\x75\x27\x87\x6e\xdb\xb8\x7d\x38\x91\x07\xfb\xd9\x2c\xdc\x41\xb3\x07\x81\x83\xf0\x2e\xa5\xbd\xb3\x44\x31\xd9\x0c\xc6\xe5\x72\x7f\xa6\x9d\xb2\x1a\xf3\xa5\x6b\xcc\x96\xae\x7d\xe0\x2c\x5d\x7b\xe8\x94\xd6\x14\xca\xae\x52\x28\xbb\x4a\xa1\x6c\x5e\xf1\x61\x33\x89\xf4\x8b\x5b\x4a\x27\xb1\x99\xb2\xa1\x49\x59\x33\xf6\x17\xda\x14\xe2\x52\x66\xff\x72\x1d\xe2\x81\xa9\x93\x55\xfc\xee\x59\x98\xd9\xf7\xbe\xb0\x70\xc2\xc4\xcb\xe7\x13\x2a\x89\x62\xdf\x0f\xde\xbc\x44\x34\x64\xe2\xc6\x46\xe3\x0d\x55\x5c\xcb\x3e\x72\x50\xb1\x50\xd8\x63\xf8\x43\xb1\x20\x6e\x65\x6c\xdd\x16\x8a\x63\x12\xd5\xd9\xf3\x23\x6c\x05\xbc\x17\x1b\x47\x84\xc9\xe0\xcf\x23\x70\x19\xc3\x83\xa3\x56\xbc\x16\x0e\x9e\xc4\x81\x87\xb2\x42\xf9\xd3\x86\x4f\x9c\xaa\xa8\x6f\xf4\x8f\xb1\x15\x26\xdf\x08\x93\x6f\x40\xf0\xe1\x8c\x7f\x43\x20\x9c\xc5\x72\xec\xe0\x09\xfc\xa4\xc4\x4e\xa7\xff\xb0\x17\x4b\x7f\xed\xe8\x4c\x16\x76\x50\x8b\xbf\xd6\x68\x25\x5f\x6b\xc5\x5f\xbb\x69\xfe\xf1\x6b\xfa\xd6\x6c\x4d\xb8\x71\xe9\x68\xca\x72\x5e\xee\xe7\x8c\xe5\x50\x58\x62\x55\xf3\xb6\x89\x73\x93\x1e\xcb\xa1\xa6\x8a\xcd\x7a\x2c\xe7\xe6\x1e\x67\xcc\xf2\x63\x93\x12\x10\x3c\xda\x21\x8a\xda\x88\x61\xb0\x61\x0b\x68\x01\xdc\x3f\x56\x1d\x2b\xf8\xee\x59\x41\x2e\x87\xc7\xf2\xd0\xd1\x27\xcc\x0e\x1c\xc9\xf7\x35\x20\x97\x63\xbc\x28\xb9\x12\xe7\xae\x88\xaf\x9d\x72\x88\x19\x18\x1f\xb1\xbc\x0a\x7b\x0c\xd3\x76\x48\x30\x0d\x7a\xe3\x91\x69\x03\xb6\xb3\x82\x0e\xdc\xd8\x5e\xa6\x79\x41\xef\x0c\xc7\xa6\x66\x30\xd9\x0f\x9a\x84\xc1\xe2\x7c\x89\x13\xd2\x79\x9a\x8c\xe1\xfd\x71\x77\xc9\x85\xb4\x3f\xef\x2f\x61\x8f\xf7\xc7\x0d\x66\xe2\x7e\x52\x6d\x31\x49\xc4\x37\x96\x6a\x93\xc9\x63\xa3\x7f\xb8\xcd\xe4\x9b\xcc\xd1\xe6\x36\x93\x44\x7f\xbb\xd1\x4c\x6a\xe1\xb5\x51\xc7\xbe\xf4\x1d\x5c\xea\x08\xe5\x0e\x11\x2e\x1e\xdd\x1e\x7a\xe5\x1b\x1e\xb3\x63\x1f\x3b\xa4\x12\x98\xbd\x15\x74\x3e\x8f\x66\xb3\xfc\xef\x2e\xbd\xce\x66\x3b\xa0\x50\xea\x08\x85\x92\x2a\x73\x7b\x7e\x22\xf6\x7c\x26\x47\x26\x3f\x9b\x66\x8f\x4c\x98\xf9\x71\xc5\x9b\x0b\x4d\x2a\xc7\x4a\xdc\xc7\xb3\xcd\xe3\x6c\x32\x22\x11\xe6\x7d\x38\x39\x24\xe7\xad\xb7\x11\x07\x80\xa8\x68\x05\xc6\xda\x29\x23\x88\x9f\xdb\xb2\x48\x82\xfd\x3c\xfb\x9b\xe3\x76\x3f\x1e\x5a\xf7\x23\x2e\x9b\x8f\xeb\xa8\x40\x60\x3b\x4a\x9a\x3c\x3e\xa9\xa3\xa6\x3d\x77\x48\xd3\x08\x7a\x3e\x19\x1d\x63\xab\x99\xa7\x46\xf1\xb3\xd8\x63\x5b\xc2\xe4\xa5\xc2\x33\x71\x74\xd8\x8b\xc3\x8e\x1e\x5b\x9e\x4a\x12\xbe\x17\xe1\x46\x65\x93\xef\xe7\x3d\x63\x66\x79\xd4\x33\xe6\x96\xcf\x67\x86\x52\x98\x1e\xc2\xa5\xc5\xd8\x8e\x30\x4c\x0c\x1e\x7d\x4e\xa4\xeb\x2a\x39\xa8\xe2\x35\xfb\x46\x95\x72\x72\x8a\xd7\xac\x21\x55\xca\xe8\x18\xaf\x7c\xc9\x7d\x5c\x6c\xf9\x92\xfb\x78\x32\xf8\x3c\x61\xa4\x63\x30\x95\x32\xe2\x51\xde\xb0\xe5\xb2\x80\xad\x8e\x50\xf9\x41\x4a\xed\x98\x9c\x1f\xf2\xfd\xfb\x9d\x27\x21\xd5\x63\x72\x70\xa2\x76\xf4\x00\x19\x1f\x30\x12\xd6\xb0\xd5\x93\xf1\xc3\x26\x79\x69\x61\xab\xb0\x4b\x15\x46\xad\x45\x6e\xce\x72\x41\x6e\x14\xe4\x5c\xfe\xc7\xcb\x5d\x06\xc9\xb4\xf5\xb5\x6e\xf6\xa1\xfb\x1e\xff\xdc\x7d\x64\x10\xdb\x4b\x6c\x19\x04\x11\x19\x24\x16\x13\xbd\x0d\xb3\x90\x6d\xdb\x77\x35\x16\x2e\x9a\x78\x7d\x3f\x9b\x32\x7c\x7f\xa9\x83\xda\x42\xa1\x4f\x47\x5c\x2e\x29\x21\x4f\x5f\x62\x84\xba\xbb\x71\x44\x5c\xfb\xc4\x81\x35\xfe\xc3\xbe\x04\xf2\xc5\x06\x2c\xfc\xf9\x82\x1f\x43\x1f\xce\x48\x0a\xab\xc1\xe3\x90\x8e\x4d\xad\xe8\xa3\x33\x99\xce\x7b\x14\x9c\x4a\x7a\x6a\x49\x11\x7e\x13\x95\xac\xc4\x0b\x4b\x94\xee\x2e\xb8\xee\x13\x86\x07\x9e\x5c\x4d\x9f\x4f\xe2\x05\xa7\x32\x90\x36\x03\xf2\x88\xda\x72\xe9\xa5\x55\xee\x80\xa2\xdb\x65\xf6\xcc\x73\xec\x0b\xcf\x01\xfb\x85\x97\x00\x73\x79\xc1\x02\xd1\xff\xe0\x88\x74\xcb\x7c\x61\x79\x09\x72\x3e\xf4\xa6\x4e\xe4\x2d\xfb\x7d\x66\x57\x1c\x74\x12\xe6\xdc\xdc\x4d\x90\x93\xa2\xd7\x96\x6d\x3e\xa0\x1d\x6b\x68\x7f\xdc\xdc\x03\xf6\x53\x45\x62\xf3\x3f\x3e\xff\x13\xf0\x3f\x21\xff\x23\xfa\xf3\x3a\x7d\xd8\x02\xb9\x5a\xcd\xbf\xdf\xc6\xb7\x43\x54\xf8\xee\x67\xb3\x85\xef\x72\x75\x8f\xac\x88\x96\x9f\x50\x93\x7c\xfc\x52\xc0\xf9\x32\x5f\xac\x79\xc8\x2a\x7e\x2d\x7c\x8f\x4a\x51\x9e\x7e\xfc\x52\x30\xf3\xc5\xaf\x85\x1f\x34\xca\x66\x51\xc4\xe3\xb9\x48\x08\xb6\x3d\x2a\x54\xc1\x7b\x2d\xa3\xdb\xee\x89\x25\xd8\x28\xfe\x68\x19\xcc\x1d\xa1\xe8\xc3\xc7\x2f\x85\xbd\x1e\x86\x4c\xc8\x28\x7e\xe8\xed\x7d\xfc\x52\xc8\xcb\x44\x8c\xf7\x4e\x9f\x50\x84\x3f\xec\x93\x30\x4f\x23\xd2\xcc\xd1\x08\xaf\x42\x9a\x54\xa0\x99\x54\x4b\x7e\xec\x48\x28\x1b\x88\xcf\x97\xa4\x63\x19\x09\xb0\x15\xd1\x4e\xa9\x99\x0f\xcd\x30\xdf\xb4\x0a\x3f\xa0\x96\x39\x0a\xf9\x80\x2c\xfd\x50\x91\xd0\xeb\xb2\x1c\x12\x0d\x2b\x9a\x05\x38\x0a\x43\x9d\x24\xe8\xe6\x7a\x22\xe0\xe5\x06\xf2\xf6\xd2\xd1\x3a\x2d\x39\xa9\xc5\xec\x67\x30\x56\x6e\xe5\xcc\x5f\xd7\x42\x88\xdd\x86\x1a\xbe\x78\x5d\x25\x91\x24\x83\xf8\xbf\xae\x9f\x48\x92\x81\xd7\xad\x2b\x2b\x92\xe4\x86\x2a\xbc\xb5\x6d\x78\xbe\x38\xe8\xac\xca\x19\xa4\xcb\xa5\xfc\x17\x07\x9d\x54\x25\xfa\x86\x5a\x43\x93\x4d\x06\x87\xd6\x33\x43\x9e\x7d\xef\x3a\xea\xa6\x9d\x4f\xf9\xfe\xc4\x0a\xc5\x11\x16\xe7\xb1\xc7\x8c\x07\xe1\xd4\xe4\x1e\x5b\x23\x48\xe0\x3c\xb6\x74\x7e\x68\x5e\x62\xab\x22\x30\xef\xbc\xd2\xc1\x09\x8f\xdf\x80\xe5\xe4\x48\x59\x12\x81\x53\x6c\xe2\x51\xcf\x7e\xef\x3b\x22\xf1\x7a\x5d\x95\x12\x28\x0b\xd3\xce\xba\x67\x21\xed\x2e\xe8\xc5\x14\xeb\xfc\xee\x62\x2a\xed\xa3\x83\x08\x5d\x61\x8b\xb9\x88\xd9\x33\x87\x0c\x67\xf1\x8d\x41\x91\xf0\x3e\xe2\xd2\x4d\x8f\xf1\xff\xd2\x64\x8c\x8b\xe5\xcc\xbe\xf3\x1d\x29\xe2\xf1\x2d\xc6\x81\x2b\x1d\x1b\x5b\x9d\x48\xb3\xac\x91\x9f\x12\x1e\x9f\x7e\xb1\x6d\x36\xbb\x6a\x25\xbc\x9b\x3b\xa8\x77\x02\x5b\x90\x9d\xb4\x5e\x07\xa8\xde\xeb\x21\x17\x97\x50\xdc\x37\xc6\x30\xc0\x44\xf5\x9b\x6b\x5c\xb8\x98\x00\x4a\x36\x5b\xfc\x4e\x5d\xe3\xb9\x5d\x12\x2a\x8b\xd3\x2a\x36\x01\xed\x94\xa3\x3d\xb7\x31\x71\x8d\x5e\xb4\x4b\x2b\x2d\xa1\xe0\x78\x3a\x60\xe4\xa0\xc2\x10\x87\x8a\x72\x94\xb2\xe3\xe9\x80\x81\x37\x56\xf9\xc5\xeb\xe4\x73\x05\x8c\xad\x01\xd4\x47\x60\x1e\x1d\xcb\x6f\x1c\x1d\x13\xd7\xb8\x0a\xd4\x5e\xd6\x35\x1e\x4e\xad\x67\xa1\x4f\x62\xc9\x26\x83\x27\x34\xd2\x09\x0d\x48\x90\xbe\x8f\xe4\xd9\x6b\xbc\x4b\x7a\xee\x23\x9f\x14\xb1\xb0\x46\x27\x72\xe8\x3d\xfd\xb6\x03\x47\xfa\x63\x7f\xf5\x60\x6d\xb2\x92\x04\xea\x59\xe9\x1d\x56\xe3\x04\x93\x90\xfa\xc6\xac\x48\x9a\xd4\x37\x4e\x5d\xd2\xa1\xbe\x31\x2f\x92\x88\xfa\x46\xdd\x25\x3d\xea\x1b\x4f\x4d\x32\xa0\xbe\x71\x13\x92\x11\xf5\x8d\xc7\xe9\x72\x59\x24\x13\xea\x1b\xbf\x20\x34\xa5\xbe\x31\x1d\x97\xc2\x19\x33\x9f\x6a\xf1\x4a\xa2\x16\x95\x72\x8d\x84\x32\x78\x58\x23\x1d\x19\xac\xd4\xb8\x80\x04\xc1\xa3\x1a\x5f\xe7\x21\xc8\xa6\x8c\x4c\xb1\x15\xd2\xe3\x6a\xae\x97\x9b\xf6\x58\x6e\x64\x0d\x78\x64\x67\x00\xb1\x89\x35\x49\xd6\xbd\x2a\xb6\x26\x3c\xd3\xfb\x53\x72\x5c\x96\xe1\xe3\x96\xf8\xd8\xb3\x83\x26\xd8\xf2\x8d\x9b\x23\x70\x16\xac\xe5\x21\xbe\xcc\x13\xf6\x98\x8c\x40\x26\x61\x45\xe7\x63\xb2\x1d\xbb\xa5\x63\x0f\x62\x6c\x6c\xa5\xd0\x2d\x85\x7e\x52\x96\x61\xc0\xb6\x24\x76\x7a\x69\x5d\x41\xff\x1e\x1e\x93\x56\x4d\xb2\x3f\xe5\xb6\x46\x9e\xad\x1b\x53\x1f\xbf\x06\xf0\x6b\x79\x34\x80\xa3\xf5\xdc\xfb\x4a\x2e\x80\xf3\x6f\x11\x6a\x8d\x84\xb3\xee\x5d\xe4\xbd\x6b\xcb\x29\xd3\xb9\xc6\x5c\x90\x05\x55\x90\x94\x1e\x83\xb5\x73\xf9\xa4\xd6\x83\x96\xac\xe9\x62\xc6\xc8\x53\x4d\x46\x0e\x6a\xe4\x67\x90\x88\x87\x71\xf8\xa1\x45\xce\x55\xd3\x6e\x9a\x49\x78\x54\x23\x8f\x5d\x86\xad\x41\x6a\x9b\x3b\xd0\x8a\x1a\x68\x45\x0d\xb4\xa2\x06\x5a\x51\x03\x49\x10\xd1\x2c\x6c\xed\x80\x40\x3c\xd0\x8b\xbd\x68\x4a\xb4\x93\x2a\x11\x74\x90\xf1\xce\x01\x23\x2f\x55\x6c\x25\x03\xfb\xf6\x24\x19\x81\xb5\x72\x32\x04\x7f\x06\xc9\x18\x3c\x2f\x27\x83\x30\xc6\x39\xab\x42\x58\x49\x40\xdb\x4b\x8c\x4b\x39\xd4\x72\x56\xb4\xf0\x91\x56\xfa\x5a\x89\xaa\x59\xba\x51\xf9\x9c\xa5\x3b\x85\xe8\x9d\x42\xb4\x4e\x21\x5a\xa7\x10\xd5\x29\x17\x65\x19\xbe\x69\x26\x61\xd9\x29\x24\xd5\x29\x44\xeb\x14\xa2\x75\x0a\xd1\x3a\x85\x68\x9d\x42\xd6\x3a\x85\xc8\xca\x93\x54\x9f\x90\xb5\x3e\x21\x7a\x9f\x90\x14\x05\x89\xd6\x27\x44\xeb\x13\xa2\x28\xb8\x13\x47\x8e\x34\x24\x41\x42\x22\x49\xf8\x46\x91\xe7\x5a\x91\x71\xce\x8a\x16\x3e\xd2\x70\xd6\x4a\x94\xed\x5a\x05\x82\x63\xfa\x92\x8d\x05\xa9\x59\xab\xe6\x70\xe7\xda\xf6\x1c\x1a\xac\x24\xcb\x85\xa8\xb5\x7d\x3e\x2b\xa8\x0b\x26\x3a\xb1\xa7\x1f\xc3\xfd\x06\xac\xc9\x35\x9a\xc1\xf8\x16\xde\x9f\x86\x3d\xc4\x56\x96\x7e\xfa\xde\x0e\x1c\xf9\xc6\x00\xec\x35\x12\x28\xf5\x34\x5a\x9c\x35\x65\xdb\x80\xff\x6a\x5d\x14\x4c\x98\xec\x93\xd1\x09\x99\x0f\x54\x24\x38\x60\xc4\xb7\xeb\x0b\x47\x32\xb4\x54\xb7\x36\xe3\x3c\xd1\x31\xf1\x8d\x83\x17\xc6\x77\x81\x02\xd2\xe5\x90\xb2\x84\xa8\xac\xa2\x65\xbe\x7d\x09\x86\x21\x49\x41\xde\x04\x5e\xd6\x50\x51\x1f\xa2\xbc\x94\x8b\x16\x79\x38\x91\xe1\xea\x82\x91\x1d\xc8\x2b\xbb\x64\x12\x17\xac\xf3\xe4\x70\x92\x1a\xd0\xb3\xe3\x6d\x03\x92\x43\x55\x63\x17\x03\x96\xa0\x28\x1e\x9f\xe2\xc3\x6a\xf5\x6e\xc6\x1d\x97\xb2\xa0\x55\x5a\xef\x76\x88\xe0\x09\x98\xf8\x6d\x1b\x50\x33\xdd\x04\x78\xdd\xd7\x6b\xa5\xa5\x6e\xf0\xfd\x0c\xc4\xe4\x7e\x8c\xaf\xfa\xc9\x53\x8d\x4f\x7b\x2e\x08\xc9\x32\xba\x79\xf7\x8f\x7f\xb5\x02\x62\xe9\x0a\x6c\xe7\x37\x0e\x65\x85\x82\x2d\xc3\x86\x6d\x96\x87\x47\xf2\x33\xe6\x43\x8f\x11\xa1\x71\xbb\x98\xb1\xd5\xba\xb6\x4d\xc5\xb6\x28\xc4\xef\x5d\x47\xaa\x5d\x76\x0b\x5b\xaf\x11\x5c\xff\xe9\xd0\x21\x8c\x6f\xf7\x5d\x8b\x03\x83\x06\xbd\xfe\xaf\xd5\xfb\xed\x80\x4b\x96\x10\xbc\x7d\x42\x1e\xc9\x7f\x3e\xfa\x24\xfe\xc0\xc6\x7d\xe8\xe4\x8a\x47\x9f\x45\xf8\x00\xc2\xeb\x6a\x7d\x21\x28\xc5\xda\x26\x12\x50\xd0\x26\x5a\x97\x2f\x28\x20\x47\x65\x6c\x9d\xcc\x50\x40\x18\x68\x1c\x38\x73\x96\x2e\x01\x3f\x1f\x7d\xb2\xf8\x34\xe1\x82\xee\xe7\xa3\x4f\xd8\xf2\x24\xab\x4e\xd4\x0f\xff\x6b\x4a\xf5\xbf\xd1\x91\x33\xfc\x8f\x74\xe3\xed\x00\x75\x6b\x5c\x72\xdb\xdf\xf3\x62\x82\x05\x84\xe5\x3d\xe2\xe6\x3d\x12\x72\x39\x48\xd3\x8b\x83\xa1\xd1\x7f\xa8\x1a\x17\x9f\x88\x0b\x0f\x65\xe1\x3e\xd9\xdf\xf3\xc8\xfe\x5e\x5a\x37\xad\x7f\xe0\x1f\x2a\xc3\xdb\x01\x1a\x8a\xa7\xdd\x06\x3d\x14\x08\xf9\xdc\x87\xbf\x5e\x36\x2b\x0e\x05\x03\x2e\xf1\xea\x5f\x69\x82\xb4\xd3\xe3\xf8\xcb\x65\x13\x7b\xf2\xc4\xdc\xcb\x17\xc1\xd2\x4f\x1d\xa0\x43\x54\xaf\xf9\x9a\x89\xd3\xdf\x2b\xd0\x75\x0d\xf6\x3f\x55\xa6\x97\xcf\x56\x7c\xcf\x23\xcf\x91\xdc\x35\x55\xba\x78\xf5\x09\x54\xe9\xde\x77\x1f\x3c\x95\x28\x6d\x94\x4b\x98\xed\xad\xab\xd2\x5d\xb2\xa9\x24\x87\xdb\x1c\x89\xa6\xfc\x2d\x25\x79\x72\x6d\x4e\x11\xba\x5f\x8b\xb9\x68\x3b\x40\xbd\x5a\xa2\x36\x9f\xb7\xd1\x25\xbc\x6c\x79\x12\x62\x0b\x33\xfa\xf4\x84\x18\x58\xd5\x56\x9d\x7c\x51\xae\x83\x57\xad\x75\xad\x3a\xcc\xce\x82\xf4\xbc\x69\x0f\x1d\x35\x27\xe5\xcc\xf1\x53\xca\x77\x7d\x6c\xfc\x59\xff\xce\x29\x3f\x16\x5a\xf3\x80\x6f\x87\xc6\x75\xe4\x91\x26\xa8\x5f\x43\xbe\x2f\x68\x1f\x59\x1e\x28\xd2\xed\xb9\x43\x3c\xd0\xc1\x86\xe9\x2d\xa5\xb8\xe4\x03\xc9\xc4\x05\x04\xef\x3f\x34\x0c\xdb\xd0\x6d\xff\xbf\x51\x8b\xeb\x1a\xf1\x09\x33\xf7\x57\xf1\x3a\xf5\x37\xca\xf0\xc1\xdb\x89\xa0\xc8\x94\x6d\x1e\xfc\x13\xf5\x77\x04\xea\x8a\x3f\x5a\xa5\x25\x86\x67\x63\x65\x17\x27\x47\xb2\xd2\x58\x27\xc4\xa9\xd4\x91\x0f\x04\xc6\x24\xa2\x91\xf0\xe1\x63\x94\x3f\x21\x17\x4b\xdb\x33\xd0\x6d\xbb\x9a\xca\xdb\x17\x1d\x21\xee\x3c\xbd\x8d\xbf\xd1\x8f\x91\x31\x23\x91\x31\x27\x9e\x31\x23\x9e\x31\xd7\x6d\xec\xfe\xa8\xc9\x57\xfd\xa1\x8d\xfe\x78\xd8\xf6\xb6\x0f\xdb\xe6\x2e\x6d\xf3\xcd\xe2\x9a\xca\x9f\xac\xab\xfc\xdb\x47\x1c\xa6\x69\xf9\x49\xac\xe5\xd7\x8e\x69\x30\x17\xdd\x34\xea\x91\x20\x26\x05\x09\x30\x51\xda\x7f\x12\xa8\x00\x1c\x03\x10\x38\x06\x20\x3e\x0d\x8c\x19\x09\x28\xbc\x92\xe5\x52\x58\x15\x80\x9a\x10\xf2\x78\x27\x41\xc8\xe7\x7b\x13\x08\x81\xb9\x9f\x3e\xb9\x9b\x72\xd6\xc6\x8a\xd5\xdc\x71\xac\xc0\x5b\x84\x32\xfd\xb6\x0a\xe7\x2c\x6e\x9c\x73\x5c\x06\xc3\x5e\x2e\xb9\xb7\x20\xc9\x87\x07\x6e\x84\x9e\x4a\x9e\x03\x5c\x62\xa1\xc1\xea\x18\xcc\x85\xd8\x1b\xe7\x13\x9d\x1a\x61\xad\xad\xe7\x13\x9d\x1a\x27\xe2\xb6\xf3\x89\x4e\x8d\x5c\x8e\xf0\x4a\x9e\x33\x80\x3e\x2c\x39\x64\x00\x6d\xd8\xce\xc1\x89\xac\xe1\x11\x1c\xfe\xf7\x38\xb3\x69\xca\x5f\x37\x61\x3a\x3d\x12\xe9\x4c\xa7\x07\xaa\xc3\xbf\x3b\xfb\xf9\xc3\xd1\xc1\x3f\x3e\x38\xd0\x24\x82\x76\x80\x9e\xcb\x2c\x19\x78\x6c\xfb\xc0\x7b\xcb\x60\x6e\x5d\xa3\x08\xa2\x11\xf1\xa9\x2d\xa4\x5c\x17\x7d\x3e\xfa\x94\x93\x2a\xfe\x14\x48\x1d\x2f\xac\x81\xe3\x03\x86\x4d\x74\xec\x08\xd3\x09\x2f\x6a\x0f\x68\x38\x67\x39\x1f\x98\xfd\x6d\x80\x73\x97\xc1\x76\x7e\xbf\x29\x87\x89\x63\x02\x9f\xc6\x56\x14\x56\xea\x4c\x18\x4a\x69\xb9\xa8\x48\xc4\xbf\x14\xab\xbc\x6f\xad\xb0\xb6\x3a\x7b\x30\xc3\xff\x70\x58\x20\xa7\x04\x1f\xcf\x72\x4e\xbc\x65\x1e\xa8\xce\x0d\xde\xc8\xf1\x0f\xce\x10\x36\x73\xc6\x41\x3f\x09\x06\x49\x30\x4c\x82\x4d\xfc\xe6\x39\xc3\xaf\x8a\xe0\x63\x7f\x3c\x68\xf8\x93\x2a\x3f\x12\x53\xff\x48\xd8\x11\x12\x1f\x63\xd2\x13\xa0\x63\x09\xe2\x5b\x9b\x41\x8c\xd5\x54\x58\xa3\x18\x4b\xea\xfe\xb7\x33\x94\x6d\x8c\x27\xa2\x94\x0e\xb2\xd9\x1e\xa5\x74\x94\xcd\xa2\x4e\x36\x5b\xfc\x5a\xf8\xc1\xeb\x95\x17\xb5\x5c\x2e\x77\x13\x60\x98\x17\xd5\x05\xc7\x67\x15\x07\xa1\x4e\xe9\x6a\xc0\xcc\xa0\x82\x73\xc8\xcd\xfb\xf2\x98\x20\x1f\xa8\x83\x03\x05\xc9\xc5\x90\x48\x41\x7a\x0a\x32\x50\x90\x11\xde\x30\x63\x8c\xbb\x5c\x0a\xf5\x6a\x98\x7b\xf0\xf0\x21\x28\xb1\x15\x48\xfa\x8a\xd8\x38\x6c\x18\x6c\xc7\xdb\x38\x75\xb8\xdd\x8e\xb7\x71\xfc\xb0\xf5\xbb\x3b\x5b\x0f\x22\xd6\x2a\xfd\xe6\x89\x04\xd8\xc7\xcd\x5e\x10\xe3\x0c\xce\x44\x22\x54\xc0\xc4\xcd\x66\x3b\x33\x71\x51\xf5\x94\xc3\xe4\x08\xff\xdf\x39\xa4\x88\x6b\xa5\x0e\x83\xff\xb7\x8e\x2b\xd4\x35\x92\x60\x8f\x16\x8d\x22\x56\x97\x4c\x82\x3d\x6a\x7c\xdb\x7e\x98\xf1\xdf\x9d\x65\xe8\xe2\xfc\x49\x39\xde\x1e\x8b\xeb\x74\x0c\x2a\xab\x00\x33\x07\x6a\xad\x0e\x28\xf4\x13\x8c\x34\xd6\x35\xde\x7a\xa4\x01\x1d\xfc\xcb\xdd\x76\xa2\x21\x37\x78\x39\xf0\xb8\xdc\x0e\xfe\x74\xe8\x71\xeb\x0a\x57\x5d\x9b\x27\x1e\x7c\x10\x24\xee\xa5\x98\x3d\xf7\x1d\x12\xd0\x82\x15\x7c\x07\xbf\x18\x41\x2e\x87\x01\x68\x07\x8e\x7d\xe7\x39\xbb\xf4\xf0\x38\x9b\x4d\x43\x4e\xaa\x7c\x4a\xf2\x5d\xa9\x0f\x26\x3c\x9e\xf4\x1a\xe2\x95\x3c\x53\xb8\x8c\x84\x13\x13\x20\x6e\x3c\xc0\x60\x54\x89\xf3\x14\x31\xd0\xe0\xa0\xc5\xa3\xbb\x28\x7d\xbc\xc2\x17\x29\x75\x92\x42\xbc\xe5\xd2\xc7\xc9\x96\x75\xc4\xf7\x7b\x7c\x77\xe7\xa2\x80\x48\xed\x47\x6c\x19\x06\x99\x71\xee\x30\xc0\xc4\xe7\x63\xc0\xf0\xd9\xa8\x05\x5d\x46\xcb\xf2\x1c\x06\x94\x35\x42\x7b\x2e\x9c\xaf\x64\xb3\xe2\xb8\x65\xad\x9a\xc5\xb8\x8e\xa0\x74\xc3\xa6\x9a\x30\x96\x07\xbe\xdc\xdb\x51\x14\xf8\x38\x9b\x1d\xcb\x5c\x70\xf2\xa2\x5f\x6c\x03\x7f\x7c\xaa\xd6\x51\x4d\x0a\x1d\xc7\x47\x04\xae\x69\x89\xd8\x7c\xc4\xc4\x3d\x2d\x11\x8d\x5a\xc4\x13\x67\x23\x0a\x30\xe3\xe9\xbf\x04\x44\x4e\x2e\x63\x56\x24\x01\x85\x6b\x60\x21\xf5\x8c\x53\x17\x4c\x3f\xea\xae\x25\x6f\x0a\xfa\x94\x1e\xb5\xb2\xd9\x1d\xe4\xd3\x0e\x9f\x22\x45\xf0\x1b\x2b\x9d\xe1\x8b\x34\x14\xf0\xa4\x20\x95\x14\xca\xa4\x90\x27\x85\xa9\x24\x4f\x26\x79\x3c\xc9\x13\x49\x1e\x3d\x79\x42\x62\x9d\x01\xa1\xbc\xfc\x84\xf6\xff\x2a\xe4\x3d\xb1\xba\x40\xe5\x4f\x9e\x19\x1c\x7a\x4a\x3d\x5d\xe3\x38\x3e\xe2\x13\x94\x77\x8d\xa9\x5f\x42\x1e\x9c\x4e\x90\x14\xa9\x88\xca\x33\x68\xc9\x30\x90\x4d\xe8\x85\x35\xc2\x09\x75\xb2\x47\xbb\x7d\x84\x73\x3f\xbb\x2c\xe7\x89\x13\x8e\x6a\x97\x09\xb4\x59\x95\x4b\xce\xf2\xab\xd8\x14\x7d\x49\xe9\x75\x69\xac\xb8\x9f\xe8\xfb\xf9\x4b\xd2\xd3\xb1\x65\x84\xac\x4b\xcf\x45\xde\x96\x81\x76\x15\xc8\x81\xf6\xc8\x69\x22\xf3\x12\xa9\x44\x12\xce\xa9\xd7\x27\x9d\xf2\x9f\xc2\x39\xb5\x05\xaf\xd7\x0f\x9a\x62\x61\xd1\xb9\xbb\xc5\xd6\x97\x9e\x81\x8e\xe1\x63\xd0\x7c\x25\x80\x40\x3e\x96\xb0\xcd\x73\x46\x41\x77\x4f\x57\x8e\xdd\x9f\x6e\xd1\x42\x8e\xfe\xa4\x85\xac\xb4\xd6\xb5\x90\xcf\x0b\xb6\xae\x70\x2c\x83\xc2\x31\xe5\xde\xfc\x46\xf3\x1d\x20\x5f\x1f\x2b\x15\xbe\xd3\x6a\x1b\x9d\x76\x48\xb3\xc7\xb0\x59\xd6\x00\xef\xbb\x0c\x9b\x0b\x0d\xd0\xe3\x18\xf0\x30\x96\x82\x04\xf0\x64\x59\xfc\x64\xcd\xc9\x90\x0d\x5a\x6d\x6f\xf4\xae\x3d\x82\xe7\x7a\x46\x93\xc1\xa0\x3f\x1c\x07\x7e\x26\x71\x7d\xc1\xc5\x91\xb1\x83\x8a\x47\x9f\xf7\x5a\xf6\xa9\x07\x37\x4c\x5c\x66\xbb\x07\x8e\x3d\xea\xb3\x5c\xe0\x58\x38\xc8\xe5\x04\xaf\x3e\xea\x50\x80\x59\xca\xbf\xec\x90\x51\x26\x7c\x8b\xa6\xdd\x88\x50\x3e\xe1\x7f\x32\x75\x93\x99\x5c\x4a\x66\x7f\xdd\x51\x1e\x11\xea\x5d\xfd\xa6\xb3\x80\x8d\x7e\x8b\x52\x1f\x22\xcd\xc8\xba\x3f\xa2\xea\xb1\x94\xc5\x75\xec\x1d\x64\xd6\xd1\x50\x82\x67\x46\x91\x4b\x0f\x3a\x25\xc1\x59\x02\x66\x87\x81\x53\xfa\xf6\x43\x04\xcc\xdd\xb3\x0e\xf2\x43\x6c\xee\x16\x71\xe9\xba\x6e\x5e\xd5\x93\xc7\x74\xae\xa9\xcb\xd9\xa7\xd4\xdb\xd4\xbb\xb0\x28\x0c\x4f\x30\x09\x5d\xb5\x26\x1f\x75\x30\xf1\x8d\xb6\x44\x39\xea\x90\x41\xbc\x5c\x5f\x77\xec\xa1\x23\xce\x11\xe0\x45\xd1\x04\x7c\x10\x83\x5d\xbe\x66\x17\x30\xd9\xe9\xf1\x40\xe3\x14\x93\x87\x17\x01\xa9\xc9\x5f\xdf\x60\x51\xd4\x7f\xb9\x1b\xb2\xde\x68\xc0\x38\x11\xe7\xf4\xbc\x05\xee\xfc\x78\x25\xea\x53\xe5\x67\xbf\xde\x8d\xad\xd7\x86\x8c\xc0\x41\xaa\x2f\xde\xea\xf1\xd5\x5b\x3d\xc4\xb7\xcf\xc5\x3b\x21\xd4\x76\x88\x5b\x42\x20\x16\x56\x7b\x8c\x4f\xbd\x8a\x83\x1e\xcb\x32\xf0\xab\x2c\xce\xd7\x2b\x0e\x3a\x8c\x53\x6b\x71\xa8\x13\xa9\x50\x14\x69\x79\x65\xe8\x26\xc6\xab\x94\x55\xe8\x70\xa2\x42\x41\x9c\xe3\x57\x4b\x06\x0e\xe2\x0c\x77\xaa\x02\x47\x31\xa8\x1d\xe3\x77\x43\x19\x38\x8d\x13\x6f\x14\xfe\x3d\x9c\xb9\x05\x73\x07\x89\x09\x39\x0c\xe0\xa4\x0c\xfc\x1d\x5a\x95\xc4\xd4\x7c\xf5\x88\x6e\xd6\x7c\xe0\x55\xd2\xde\xb2\x7f\x22\x66\xf4\x26\xf0\x6e\x8e\x0f\x91\x3e\x44\xac\xdb\x3a\xe2\x2c\x08\x1c\xb5\xdc\x80\x7e\x7d\xa7\xc1\xd3\xd6\x44\x21\x39\x70\xe4\x46\xd4\x62\x54\x4d\x86\x7a\xd7\x90\x23\xfe\xa8\x83\x71\x89\x89\xae\x61\xaa\x6b\xcc\xd8\xed\x80\x1b\x0f\x73\x66\x77\x7d\x07\x0d\xe6\x0c\x6c\x5f\x90\xbb\x6d\x1a\xa9\xa9\x71\x57\x47\x60\xf8\xa1\xc6\x98\xfe\x8c\xd2\x43\x94\x1a\xc0\x57\x98\x9c\xcb\x1b\x14\x0f\x11\x79\x6e\x91\x71\x0b\x93\xf7\x09\x44\x95\x20\x5d\x4b\x47\x86\xdf\x1e\xd2\xf7\xf2\xc1\x29\xa1\xe8\x97\x29\x12\x45\x7c\x5e\x8d\x3c\x95\x3d\x99\xa0\x05\xfd\xb5\xf8\xfa\x9a\x3b\x03\x26\x2f\x9f\x8b\x8a\x05\xd4\xe7\xec\xfd\x86\xaf\xaf\xd7\x98\xb3\xf9\x00\xd8\x3c\x3c\x8e\x4b\x5d\xd8\xec\x16\x72\xf7\x70\x56\x00\x06\x75\x10\xc5\xd6\xc9\x0b\x0a\xc8\xe3\x29\xb6\xce\xeb\xc8\x27\xb7\x4d\x90\x29\x7c\xed\x54\x85\xaf\xf9\xe0\x49\x48\xa8\x47\x49\x00\xf6\x9d\x70\x83\x08\x20\x4c\xdb\xfe\xfa\x2b\xbe\xfb\xdd\xe8\xda\x5d\xd5\xb7\x6a\x79\x10\xa2\xad\xcc\x85\xfe\xd0\xd5\xd5\xb9\xb3\x5c\xba\x11\x5a\xef\x74\xe1\xa7\x06\x67\xb3\xcc\xf8\x1d\xf5\x99\x1f\xc0\x31\xc7\x93\xbb\x7e\xf1\x61\x57\x92\x12\x6b\x17\x76\x80\x45\xeb\xde\xe6\x0a\x8a\x0d\xda\x55\xe7\x3b\x65\x96\xba\x01\xa1\x18\xe9\x43\x84\x25\x95\xad\xf3\x08\xb9\xbc\xe3\x39\x65\xe1\x05\x66\x70\x18\x0c\xf6\x44\x27\x65\xb0\x9d\x90\x39\xa4\x56\x47\x28\x22\x15\x37\x55\x4f\xba\x8c\x7e\x63\x6b\x3a\x8e\x4f\x91\xd4\xd7\x85\x37\xa3\x94\x2a\xf1\xda\x66\xe0\x9f\x2a\x3a\xd8\x4a\xd2\xb5\x86\x25\xa4\xee\x24\xd3\x28\x3d\x80\x13\x36\x1f\xbc\x88\x5b\x49\xd6\x16\x1e\x28\x91\x8c\x81\x87\x70\xba\x46\xb3\x8e\xd8\x24\x3c\xaf\x6f\x2b\xeb\xba\xd3\xce\x94\xaf\xbd\x5d\x35\x2d\x95\xcb\x4e\xe1\xdc\xaa\xba\xe9\xc9\x97\xd7\xff\x5a\x12\xfd\xba\x43\x18\x8e\x5f\x64\xbb\xee\x50\x55\xab\xeb\xd4\x46\x30\x35\x62\x2c\x4f\x3c\x7a\xee\x6d\x5f\x46\xbc\xcd\x65\x44\x9f\xec\xfd\x51\x36\xbb\x65\x32\xab\xd9\xb8\x5c\xc6\xdc\xd0\x4d\x79\x9d\xbd\xd5\xa4\x0d\x66\xd7\x1d\x84\x4b\x2e\xfc\x98\x87\x9a\x43\xad\xe4\x56\x99\x0e\x95\xe7\x62\xf2\xfc\xb9\xe4\x9b\xc5\x02\x97\x12\x66\x5c\x9a\xd3\xc9\x19\x7f\x23\xc0\x2b\xcc\xff\x6c\xbb\xa6\x55\xef\xa6\xdc\x47\xa9\x5b\x5d\xb3\x4e\xec\x88\x6a\x71\xbd\xd5\x11\xd5\xcd\x9b\x4e\xc1\xef\x37\xdc\x34\xdf\x6f\x73\xd3\x1c\xdf\x9e\x17\x8e\x9a\x5f\xdd\xe1\x64\xd4\x32\x19\xf1\x7f\x9b\xee\xea\xcf\x5e\x9b\xe1\x26\xee\x9f\x5c\x37\xc7\xb7\xca\xee\x9e\x10\x23\x1b\xee\x9b\x5d\x32\x37\xbd\x3f\xbb\x6f\xd6\x9d\x2d\xab\x12\x74\x17\xce\x2e\x99\x17\x4d\x8f\x9c\xba\xa6\x4f\xea\xae\x19\x90\x99\x19\x92\xb9\x74\xb3\xfc\x07\x17\xce\xa4\xb3\x59\xae\xee\xc6\xd9\x25\x9d\x8a\xe9\x91\x93\xb6\xe9\x93\xd3\xb6\x19\x10\xc6\x0b\xae\x0f\xcd\x26\xb8\x71\xee\x40\xf9\xd7\xeb\x4f\x33\x6a\x2b\x59\xd7\xb7\x0b\x8e\xe1\xff\x8e\xbd\x2e\xfa\x30\x72\x8c\x19\x71\x85\xb3\xa5\x44\xc8\x3e\x4a\x3f\x44\x9a\xf2\x21\xa9\x7c\x44\x2a\x1f\x90\x4a\x00\xa7\xcc\x7e\xef\x10\xf5\xd8\xb3\xf0\xf9\x83\x63\x6f\x8f\x22\x59\x2e\xac\xe5\x27\xc4\x8c\xfa\x50\xec\xb2\xd2\x5e\xa7\x98\xf1\x54\xc9\x1d\x3d\x21\x37\xff\xad\x40\x98\x71\xd2\xc6\x84\x19\x9d\x4a\xee\x38\x06\x9d\xb6\xf1\x86\x99\x80\xcc\xcc\xd9\xe7\x6a\xc3\x7f\x26\xd6\xde\x3a\xb2\x1d\xe9\x37\x5d\x3a\xd1\x54\x84\x49\xfb\xd1\x54\x50\xdf\x21\x21\x0d\x0c\xff\x37\xe7\x85\xa1\x7d\xea\x50\x7a\x7b\x8a\x3d\xca\xc9\x13\xca\x77\x94\xc6\xe6\x6b\x22\xa4\x07\x06\x8c\x55\xd2\xa4\x05\xab\x29\xbc\x52\x37\x55\xb1\x1d\xea\xda\x4d\xb0\x47\x7c\x1f\xf0\x55\xb3\x23\x70\x31\x7e\x0d\x68\x27\x7e\x15\x76\xd5\xa1\x72\xbc\x07\xa4\xeb\x9b\xc2\x71\x28\x09\x42\xe9\x49\xcd\x05\xb1\x8f\x2f\xa3\x9d\x55\xbd\x83\x02\x23\xe0\x3b\xd7\xe5\x32\xe0\xd5\x3d\x5d\x38\x48\x9e\x10\xf1\x95\xba\xeb\xf3\xa1\x14\x62\xb0\x99\x0b\x42\x59\xeb\xd5\xaa\x1d\x22\xf6\xc4\xf7\x68\xd2\xc7\x92\xb2\xb6\x2b\x52\xe1\xeb\x9b\x51\xf0\x45\x0a\x3e\xbc\xbb\xbe\xf0\xe5\x2d\xaa\x2a\x5a\xec\xf1\x74\x86\xc4\xe6\x44\x90\xd1\x55\x04\x0c\xa9\x2b\xa8\x06\x45\x84\x3c\x7f\x28\x33\xcb\x5d\x25\x09\xe1\x5e\x94\x7e\x5c\xc7\xf4\xfd\xdd\xb1\x18\x7a\x49\x97\x49\x12\x78\xb4\x60\x79\xb1\xd3\x53\x78\x95\x07\x66\x0a\x07\x78\x7c\x58\x6f\x7d\x9c\xfc\x24\x2d\x54\xca\xb2\x7c\xf0\x92\x6a\x09\xa7\xe6\xbc\xbc\xe5\xb2\x28\x02\xf1\xb3\xd1\xda\xce\xcb\xe6\x54\xe2\x6d\x2a\x58\xa1\x50\x2d\x85\xaa\x4f\x9b\xd4\xb7\x43\xc7\x6a\xda\xef\x9d\x6c\x16\x1c\x40\xcb\x91\xc8\x21\xc6\x8c\xc0\xcf\x9c\xaf\x0b\x90\x06\xcf\xe3\xaa\x7c\x3e\x1c\x2c\x3b\x30\xaa\x2a\x47\x7c\xa0\xd9\x45\x47\x3e\x04\xd2\xa1\x81\xbd\xaf\x22\x11\x0d\xec\x80\x23\x7f\x54\x90\x9e\x82\x28\x1c\xab\x59\x42\x81\x5d\x70\x68\x8f\xc8\x94\xa2\x43\x43\x6c\xd6\x3b\x28\x24\x3d\x2c\x13\x23\x2d\xb1\x83\x4d\x01\x2c\xd7\xd5\xf5\x2b\xe9\xa7\x95\x74\x8c\x19\xe9\x18\x73\x4c\xf2\x45\xac\xe5\x48\x10\x7b\xc6\x8c\xf4\x8c\xb9\x3a\x95\x04\xc4\x64\xab\xda\xa1\x85\x1f\x2e\x11\x37\x70\xc9\x48\xfc\xf4\xc4\x0f\x6f\x09\xaf\xb5\xa4\x25\x8d\x80\x92\x7c\x9d\xe6\x63\xd9\x0e\x1d\x12\xd8\x61\xae\xe8\x60\x41\xdd\x89\x35\xa1\x1c\x0a\x24\x9b\x52\x91\x46\x16\xa4\x4c\xd1\xd4\x98\xe7\x27\xc6\x1c\x7f\x40\x53\x63\x96\x9f\x18\x33\x6c\x2d\xe8\x4e\x8f\xa1\x32\x2e\xbd\xde\x47\x66\x99\x3c\xf6\xcd\x89\x31\xcf\x97\xf7\x26\xc6\x6c\x65\x72\x98\xcf\x04\x70\xb6\xb2\xca\x74\x61\xdc\x47\xd6\x82\x2e\x8c\xc7\x3e\x1f\x07\x65\x4a\x7d\x86\x27\x34\xc1\x2b\xfc\x90\xdf\x28\x2d\x72\xae\xb9\xc8\xbb\x2b\x31\xfa\x79\x5d\x0e\xa9\xbb\x27\x3c\xd0\x15\x73\xe5\xbd\x32\xb6\x44\x46\xf8\x68\xe1\xbb\xac\x51\x69\x91\x3b\x34\x17\xf9\xc3\xd5\x6a\x50\x42\x53\xfa\x50\x47\x03\x32\xc1\xa4\xd7\x46\x53\x5c\x42\x65\x0e\x68\xd4\xd1\x88\x37\xd9\xc1\x64\x80\xc9\x42\x82\x80\x10\x23\x00\x95\xe9\x6d\x17\xa8\x7e\xd5\x45\x65\x63\x46\x16\xc6\x0c\x93\xa9\x31\xc3\xd9\xac\x9e\x30\x27\x0b\xde\x0d\x53\x3e\xd4\xcc\x32\x9d\xf2\xc6\x90\x01\x2d\x67\xb3\xd3\x5d\xea\xb3\xd2\xd4\xdc\x28\xd9\xe3\x93\xe7\xb4\xc2\x50\x8f\x0c\x30\x26\xe5\xe5\x12\xf5\xf4\xef\xcb\x8e\xe0\x35\xf6\x8c\x59\x08\x40\x63\x06\x95\x35\xe6\x44\xdc\xbb\x70\x71\x12\x28\x7e\x2d\xe4\x8b\x5f\x0b\x7b\x2d\x7b\xc6\xf7\x4a\xc6\x2c\x2f\x73\x0c\x8c\xb9\x08\xce\xf1\x07\xf0\xf4\x93\xc6\xec\x25\x98\xbd\x75\xcc\x0e\x9c\xdb\x4c\xc8\x08\x46\x01\xe9\xc1\x64\xc3\x26\x4a\xc1\x9e\xeb\xc8\x17\xf9\x77\x7c\x91\x19\xaf\x9a\xd9\xac\xf4\xb1\x9f\x9c\xa4\xc5\x2c\xe1\x34\xcd\x12\x5a\xe0\xec\xf4\xcf\x2b\x1d\x4c\x66\xea\x1a\x33\x0b\x82\x73\xea\x1a\xf3\x35\x4f\xc8\xdb\x71\x94\xb9\xfa\x2c\xcf\x04\x43\x08\x38\x58\x44\xe6\x02\x71\x56\xcc\x51\x5f\xe6\x29\xe6\x68\x20\x82\xa7\x6e\x0c\xad\xbb\x39\x1a\xac\x36\xdb\xd1\x48\xed\xe0\x94\xa7\x3d\xfc\x01\xc1\x17\xf8\x78\xf0\xad\x1e\x43\x1e\x2e\x71\x76\x37\xcf\x7b\x7b\xcc\x98\x99\xc8\xe3\x63\x83\x43\x66\xb1\x51\xcd\x7d\x64\x7a\x7c\xe8\xfa\xfa\xb3\xfb\x0f\x69\x6f\x05\xc6\x7d\x04\xb9\x1e\xfb\xd0\x86\xfb\x88\x84\xd4\xe5\x93\x07\x3e\x01\x06\x99\x3e\xc3\x3c\x16\xf0\x58\x00\x31\xe1\x08\x22\x58\x2e\x8b\x47\xf9\xcf\x3f\xa8\x18\x2c\x5e\x3e\x88\xb5\x76\x3e\xa5\x61\x3a\xd5\xcf\x87\xb8\xe4\x8b\xe7\x18\x64\x7e\x3f\xf6\x0b\x23\x99\xab\x4f\x82\x3d\x3f\x17\x8a\x67\xfd\xb7\xa4\x87\xc4\xdb\x0b\x73\xbe\x62\xb5\x41\xde\x5b\x13\x32\xf2\x28\xcc\xfb\xf8\x43\x93\x20\x7f\x2f\xc8\x7b\x7b\x21\xfe\xd0\xc4\xc2\x33\xc6\xcf\x7a\xca\xb6\x4d\x51\x23\xb1\x7d\xcc\x17\x29\x5f\x27\x9f\x7d\x07\xdd\x27\x0d\x71\x2d\xe5\xd5\x61\xe8\x39\xe8\x69\x88\x2d\xcf\x18\xf4\x07\x28\xbe\xb1\xa0\xe0\x70\x9b\x40\xa4\xb4\x43\xc4\x25\x32\x4a\xe9\x7d\x80\x7d\x3b\x0a\x1c\xfb\xd6\xe3\x7b\x62\xbb\x40\xf8\x4a\xe0\x82\x0e\x36\xfd\x5a\x63\x8f\x16\xc8\x00\x56\x2a\xab\xf7\x7d\x60\xf5\x04\xfb\xf4\xed\x1e\x2f\x26\x1c\x62\xf9\x55\x02\xc5\xa1\x1e\x29\x62\xd2\xcb\xe7\xc5\x12\x2f\x5f\x79\xa0\x1e\x14\xed\xe3\x15\x48\xd7\xda\xd5\x42\xd0\xd8\x3c\x0d\xb5\xcd\x85\x0b\x86\x1c\xcd\x64\x39\xee\x70\x09\x2a\xa2\x05\xd2\xa3\xe0\x87\x37\xfa\xde\xb3\xa2\x5c\x0e\x77\x78\x51\xbe\xcd\xf7\xa4\x9e\x1d\x39\xd8\xe1\xbb\x7e\xd7\xa1\x4d\x68\x12\x6c\x73\x3a\x78\x05\x34\x22\x3e\xb8\x41\x40\x8b\x23\x62\xa7\x7c\xab\x6a\xc4\xc6\xaf\x7a\x1d\x3c\xfc\x1a\xb9\x70\x92\xa7\xf7\x23\x4b\x50\x3c\xed\xdc\x28\xb5\x8d\x19\xf6\x5f\xfe\x87\xc9\x37\x08\xde\x75\x83\x71\xab\xef\xbf\xcb\xfc\x4f\x8e\xe5\xfe\x27\x03\xaa\xd6\x76\x77\x20\x1c\x17\x04\xbe\xf1\x3f\xd6\x8e\xfe\xc4\xbf\xb6\xaf\x38\x6b\xc4\x1b\xdb\xa8\x6c\x33\x47\x6c\xad\x53\x9e\x37\xe3\x7c\xd1\x46\xbe\x35\x1b\x34\x28\x81\x88\x5b\x09\x24\xa0\x05\x12\x0a\x4a\x06\xdf\x43\x38\xb2\xe2\x63\xde\x0e\x78\x77\xba\xf8\xd5\xa7\x81\xe0\x33\xab\xd4\x0e\xd8\x2f\x21\x0f\x3a\x18\x5c\xab\xed\x16\xb0\xb9\x5b\x4c\xaa\xd0\xfb\xa7\x55\xb0\x9d\x6d\x15\x80\x51\xe1\xc1\x71\x98\xbc\xf8\xae\x25\xc9\x31\xaa\x74\x0d\xb2\x56\x85\xef\x61\xf2\xf9\x41\x4a\x59\x12\x95\xed\x85\x07\x17\x78\x45\x6f\x80\xc5\xde\x3b\xbe\xb9\x89\x3b\x62\xd2\xeb\xf4\xfa\x2f\x3d\xe3\x7f\x2c\x18\x20\x23\x3e\x3c\x46\xc6\xd9\x90\x7a\xcc\x1e\x3d\x3b\xcb\xa5\x6b\x8d\x8c\x5a\x8b\x51\xcf\x1a\x19\x87\x2d\xf6\x96\x68\x7f\x3c\x66\xe4\x64\xcc\xc8\xe9\x98\x91\xb3\x31\x23\xd5\x31\x23\xb5\x31\x23\xdd\x39\x23\x17\x0b\x46\x9e\x47\xbc\xd5\xb2\xc9\x6e\xaa\xc9\x74\xc7\xb5\x03\x87\x30\xbb\xe6\xd8\xbe\x43\x3d\x3e\x3b\xac\x91\x71\xd1\x58\xb3\x57\xa8\x39\x46\x97\xfa\x16\x04\xa6\x2e\x8d\x44\x28\x6c\x0f\x83\x23\xde\x2e\xda\x13\x80\xb3\x06\x1d\xac\xe2\x8b\xd9\x2b\x6c\xb9\xa8\xb9\x60\xc4\x5e\x1c\xa5\xfd\x00\x6b\x63\x5c\xf9\x73\x89\xca\xf4\x95\xf9\xe0\x06\xc0\x8b\xda\x5e\x87\x07\x9a\xc1\xd8\xeb\xf7\xc6\xc1\x6c\xcc\x63\xdd\xfe\x64\x14\x74\xfb\xd3\x20\x8e\xf0\xf1\x3b\x8c\x63\x51\xc0\x44\x9a\xdb\x9f\xf1\x9f\x61\xe0\x0f\xd9\x8b\x08\xa9\x6c\x83\x88\xcd\x0f\x7a\xed\xae\x70\x96\xc3\xa7\x61\xbb\xd7\x1e\xb5\x74\x90\xf4\x93\xd2\x91\x3a\xcb\x39\xd3\x54\xf9\x73\x3f\xf6\xa3\x72\x7c\x12\x6b\xfb\x9f\x2f\xe2\x60\xbd\xc5\xa8\x6f\x33\x4f\x79\xae\x8e\x8f\x13\x59\xfc\x20\x50\xf0\xae\xdd\x7b\xc7\xb0\x17\x5b\x52\x07\xc2\x8d\x42\x6a\x56\x83\x5f\x22\xdd\xdb\x88\x27\x5e\x5e\x75\xa5\xc2\x25\x3e\x22\x98\xfb\x36\x13\x73\x46\x79\x5b\xb7\x34\xb8\x3c\xcd\x08\xfb\xf2\xc9\x2c\x75\xac\xb4\xa3\x4d\x77\x6d\xcc\x9e\x36\x74\xab\xe6\x82\x3a\xd5\x7b\xbe\xe0\x63\x86\x7d\x77\x2d\x26\x4d\x56\x8d\xf3\x96\x7a\xf6\xea\xc2\x66\xca\xb1\x18\xd0\x61\xb5\x7a\x66\xc8\x7d\xc3\xf1\xb3\xf0\xef\xb3\x0b\x6f\x00\x2a\xea\x32\xfd\xed\xf6\x39\x5b\x61\xeb\xea\x65\xbd\x00\xcd\xbf\x6e\x5c\x84\xcb\x79\x81\x6e\x8d\x2e\x5c\xfa\xda\x9d\x85\x83\x4e\xce\x88\x2d\xe0\xd2\xd8\x09\x9b\xac\x94\xd0\x45\x7e\xcb\xe7\x03\x94\x0f\xdb\x66\x30\xae\x88\x71\xb6\xa1\x0c\xea\x44\xf2\x99\x4b\x5e\xec\xfd\xb1\x28\xd6\x49\x9f\xf8\x77\x60\x7f\x5a\x73\x52\x1e\x63\xe4\x91\x99\xa6\xb9\x0b\xfb\xf2\x19\xcd\xa7\x32\xc2\xc2\xbe\x79\x2d\x45\x7c\xe4\x50\x7d\x64\x0d\x47\x72\x92\x8c\xc7\x7a\x9c\x85\xfb\xc1\x38\x18\x76\xdb\xbd\xe0\x9d\xdb\x9f\xf4\xfc\x76\xaf\xf9\xce\xed\xcf\xde\x4d\x7a\xe3\x76\xc4\x47\x4e\x30\x1c\x07\xfe\xbb\x76\x6f\xdc\x7f\xc7\xde\x8d\xbc\xa0\x17\x18\x19\x6b\x47\xaf\x77\xd8\x97\xf5\x7e\x2a\x6f\x77\xdb\x0f\x89\xe7\xad\xed\xcf\xb8\x9f\x36\xb0\x1a\x01\x95\xf8\x75\x65\x65\xfa\x76\x7c\x02\x82\x02\xe3\x5b\xa4\xef\xca\xf3\xf2\xf1\x09\xf0\x6e\x38\x9c\x2f\xa8\x17\xcf\x8e\x4f\xc0\x08\x19\xc2\x53\x17\x9d\x1e\x13\x35\x91\xf0\xca\x3a\x93\x43\x89\x71\x36\x88\x5e\x46\x0c\xce\x57\x2f\x1a\xda\x2a\xe4\x02\x97\xa9\x9e\x71\x26\x43\x9a\x0b\xf6\x36\xa3\xd1\x9c\x8e\x5e\xc7\xaf\xc3\x31\xea\x5b\x6f\xf2\x9f\x7f\xcc\x71\xb6\xb0\x9a\xd5\x4a\x55\x94\x71\xde\xbd\x51\xe3\x27\xce\x17\xa7\x65\x92\x66\x8d\x60\xbb\x9d\xf0\x01\x37\x56\x86\xc2\x68\x56\x46\xd5\xdd\x26\x67\x38\xf0\x5a\x8d\x18\x12\x83\x61\x30\xe8\x0f\x26\x11\x1b\xf3\x61\xc0\xde\x35\x87\xfd\xc9\xe0\x5d\x7b\xf4\x6e\xd2\xd3\x57\xfa\x8c\xb5\x23\xb4\xb0\x65\x1a\x69\x4c\x4a\x74\x67\x44\x7b\xeb\xb0\x5e\x99\x0e\xd6\x61\x27\x27\x74\x94\xc0\x52\x72\x83\x7c\x9b\xf3\x16\xfc\x00\xa6\xc6\x2a\xf3\x7d\x3e\x08\x5b\x6c\x10\xbc\x83\xf1\x28\x2a\x38\x6e\xb1\xf1\x3b\x16\x0d\x03\xe6\xcf\xdf\xb5\xd8\xe8\x1d\x7b\x27\xf9\xbd\x91\x51\x2d\x95\x83\x8b\x19\x5d\x3e\xab\x65\xf5\x45\xbc\x29\x5f\x12\x3e\x8d\x44\x5c\x3d\x32\xae\xe2\x17\x6b\xf1\xcb\xb5\xf8\xbd\x1c\x6b\x3d\x59\xde\x99\x2c\xff\x44\x3e\x5b\x00\xd3\xf1\xe9\x90\xd8\x8c\xec\x16\x9d\x37\xe5\x1e\x5d\x66\x8b\xfd\xa4\x43\x5e\xbe\xab\x22\x9c\x3f\xae\x09\x09\x4c\xad\x2e\x09\x47\x8e\x11\x46\xeb\xca\xcb\xa6\x9c\x49\xa0\xb5\xf9\x21\x7b\xfc\xdd\x68\xc0\x2c\xc6\x27\x4c\x9a\x28\x53\x77\x8d\x2a\x53\x97\x93\x65\x27\x0d\x49\x13\x66\xea\xae\x51\x66\xea\xae\x91\x66\xea\xa6\x68\x03\xd5\x4f\x16\xc5\x6e\x13\xa6\xb5\x4b\x8a\x78\x4b\x7b\x26\x72\x5c\x14\x7e\xa4\x9b\xa3\xb7\x03\x88\x75\x76\x06\xa4\x4a\x51\x39\x72\xc1\x38\xe3\x6c\x88\xb8\x78\x81\xb1\x75\xc4\x90\xc7\x19\x02\x38\x50\xe9\xb6\xe8\x69\x9f\x59\x1c\x60\xb4\x26\xb0\x6d\xac\x39\xe0\xeb\xde\xb7\xa6\x12\x71\xeb\x7d\x9d\x78\x65\xeb\x36\x37\x56\xb6\x6e\xd3\x66\xce\x1a\x61\x49\xdc\xa3\x67\x72\x61\x11\x68\x4e\x6a\x3e\x6e\xac\x3e\x6b\x8d\xc1\xd6\xd5\x7a\xa5\xb4\x77\x71\xbf\xaf\x75\xf7\x0a\x8b\xe6\xf4\x2f\xe8\xc4\x9a\xc8\x8c\x13\x09\xac\x37\xde\xf2\x55\xd2\x6d\xae\x92\xad\x3f\xb6\x76\x5c\xd4\xfa\x87\x8c\x46\x28\xf8\x9b\xb4\xb9\x5c\xbe\xae\xac\xa6\x31\xa4\xe2\x06\x8e\x5b\x6a\x1a\x43\xd3\xb5\x9a\xc6\x4c\x42\xfc\x52\xd3\x98\x99\xbe\xd5\x34\xe6\x12\x12\x96\x9a\xc6\xdc\x0c\xad\x84\x55\x35\xf1\xdf\x77\x5e\x53\x75\x5e\x7a\xfd\x49\x2c\xa8\xed\x99\x83\x46\x2d\x2c\x7b\x8b\xc7\x0e\x6a\xea\x4a\x24\x8f\x35\x94\x93\xa0\xb0\x4f\x5f\x67\xa6\x9b\x67\x64\x6e\x7a\x79\x46\x5e\xda\xfe\xb8\x65\xee\xef\x31\xd2\x0a\xda\xcd\xd6\x98\x07\x57\xda\xcb\xe8\x1a\x85\x5c\xd4\xfe\x0f\x08\x44\x46\xf8\x75\x44\x47\x40\xa2\x91\x31\x9c\xc5\x34\xe2\x11\x93\xcb\xeb\xc3\x79\x4c\x25\x1e\x31\x7d\x6b\x14\x13\x2e\x2c\x8d\x8c\x99\x19\x5a\xa3\x98\x70\xcd\xd2\xc8\x98\x9b\x4d\x8d\x70\xa3\x7f\x40\xb8\xc9\x3f\x21\xdc\xc3\x19\x26\x3b\x09\xe5\x1a\x67\x3a\xe5\x0e\xe2\xdb\x40\x5b\xe8\xe8\x01\x1d\xfd\xbc\xbb\x8d\x8e\xee\x9b\x74\xec\xfc\xd7\x74\x9c\x15\x35\x3a\xce\x8a\x40\xc7\x79\x51\xa3\xe3\xbc\x28\xe8\xb8\xaf\x13\x72\x5f\x50\x72\x5f\x27\xe5\xfe\x7f\x4c\xcb\xb3\xca\xdf\x93\xb2\x5c\xd3\xc7\xe0\x61\x6a\x0c\x56\x52\x94\x3c\xaa\xa5\x28\x29\x3c\xba\xf0\x0d\x3c\x99\xcb\x08\x78\x1e\x16\x74\x55\x6a\x21\x86\x15\x79\x95\x2a\xc8\xc5\x6f\x52\xb9\x79\xfa\xb6\xf6\x40\x73\x48\xb4\xe3\xfe\xdf\x58\xf9\x53\xf8\xe1\xef\x79\x25\x3f\xe7\x99\x7e\x4a\xbb\x00\x97\x7c\x5e\x3d\xca\x90\xb4\xfb\xf3\x29\x43\xbe\x0c\x7e\xf7\xb2\x59\xe4\x4b\x0f\x30\x21\x65\xca\x0a\x3d\x84\x84\x50\x26\x28\xdd\xc3\x77\xea\xab\x77\x33\x07\x17\x26\x23\xcd\x17\x66\xc6\x75\xe4\x1f\x8a\xa4\x27\xb3\x09\x7e\x1d\x50\x86\x06\xa2\xb0\x11\x65\x68\x94\x58\xb4\x4f\xe9\xe0\x03\x68\x48\x8d\xab\x33\xb2\xd0\x23\x65\xea\xe5\x22\xe9\xf6\x7a\x8a\xc9\x94\xfa\xb9\x9e\xf4\x7c\x3d\xc5\xe4\x50\x4b\x5d\x60\xb2\xd0\x52\x17\xd8\x9a\x2c\x97\x68\x42\x07\x64\x40\x47\x64\x44\x27\xd8\x9a\x50\x17\xf1\xba\x14\x70\xc9\xcb\x45\xa6\xb8\x31\x58\x26\x87\xa2\x12\x17\x32\xf5\x5b\x01\x97\xfc\x5c\x4f\x26\x4f\xc9\x02\x6c\x44\x21\xa9\xf8\x95\x67\xcd\x47\xb2\x4b\x21\xab\x2f\xd3\xf6\xff\xe2\xf9\xf2\x3d\x99\x06\xf9\x24\x65\x66\x45\xd3\x23\x7c\x28\x93\x53\xd7\x9c\x90\xba\x6b\x5e\xac\x56\xa4\xa5\x93\x2a\x3e\xd0\x8e\xfb\x29\x40\x03\xd1\xa7\x53\x5a\xcc\x0f\xc8\x82\x4e\xf7\xa6\xa4\x4c\x07\x7b\x03\x72\x48\x17\x7b\x53\xb2\xa0\x1f\xf7\x06\x7b\x0b\x32\xa5\x1f\xf7\x76\xa6\x7b\x65\x6b\xb0\x47\xcb\x56\x08\x72\x93\x31\xdb\x3b\xcc\xb9\xc6\x6c\x6f\x91\xf3\x8c\xd9\xde\x34\xe7\x1b\xb3\xbd\x01\xb6\x26\x22\x75\x0e\xa9\x73\x48\x9d\x43\xea\x7c\x6f\x20\xb4\x55\x21\xb5\x99\x31\x23\xbe\x31\x73\xc8\x84\x87\xe7\xc4\x37\xe6\x0e\x99\xd2\xfd\x3d\x66\xcc\xf2\x9f\xf6\x5c\x63\x96\xdb\xdf\xf3\x8c\x19\x59\x08\x45\xaf\x31\x23\x65\xca\x7f\x72\x1f\x21\xd1\x37\x66\xf9\x8f\x80\x70\x48\x51\x7e\x9a\x13\x07\x07\xd3\xbd\x69\xfe\xd3\xde\x62\xaf\x8c\xf1\x07\xb4\xbf\x57\xe6\x9d\x89\xf2\xd3\xfc\x1b\xa9\x96\x98\x12\x87\xf8\xc7\x59\x39\x9b\x45\x87\xd4\xf8\xac\x60\x53\x09\x9b\x02\xac\xf0\xfd\x30\x9b\x2d\xfe\x38\xcc\x66\x03\x74\xc8\xa3\x53\x1e\x9d\xf2\xe8\x14\x5b\xa2\xda\x73\xa8\xf6\x1c\xaa\x3d\xb7\x16\x54\x2a\x8c\x2d\xa8\xf6\x1c\xaa\x3d\xe7\x44\x80\x6a\xcf\xad\x3f\x56\xdb\xfa\xff\xa2\xda\x87\x94\x0f\x1a\x18\x49\xa0\x7e\x02\x3f\x25\xf3\x34\x64\x82\xc9\xce\xa9\x2b\x86\x69\x82\x54\x4f\x43\x26\x78\x65\x0d\x18\x3a\x24\x87\xc6\xa9\x9b\x3f\x34\x66\x45\x30\x43\xe5\xf1\x3a\x8f\xcf\x93\xab\x52\x87\xab\x15\x30\x9a\x28\x66\xe7\xa4\x79\x9a\xe6\xe8\x60\x80\x9e\x08\xfe\xae\xbe\x47\x71\x75\x06\x58\x04\x75\x36\xaf\x31\xfc\x9e\xba\xe2\xb7\x2e\x7f\x05\x1b\x2c\x28\xee\x57\x90\xaa\x95\xab\x01\xb5\x1d\xce\xb9\xfd\x75\xce\xed\x73\xce\xed\x63\xcb\xe7\x9c\xdb\x1f\x30\xcb\xff\xd3\xf6\xb5\x35\x13\x19\xb6\x58\x4c\x5c\x0d\xc0\x68\xaf\xcf\x72\xea\x26\x78\x5a\x52\x83\x72\xa3\x76\x2f\xd8\x66\x9d\x21\x32\xdf\xbe\x91\x59\xe4\x65\xc3\x35\xa7\xbe\xc2\xd8\xa1\x43\x16\xf8\x35\xa4\x9e\x31\xb8\x50\x0c\xb5\x23\x62\x1d\x11\xdb\xff\x8b\xef\x8c\xc3\x6c\x96\xff\x74\x4a\xda\xf7\xdc\x4a\xce\xe7\x9f\x0b\x72\xd5\x83\x1c\xf2\x73\x0c\xe7\x76\xe0\xeb\x66\xf1\xab\xcc\x23\x32\xbf\x9d\x0b\xaa\x8b\xdc\x7c\x80\xb1\x29\xb3\x7c\xfb\x47\x39\x72\x3c\xc7\x37\x99\x45\x7c\xee\x0f\x75\x63\x79\x1f\x0b\xc2\x98\x1a\x4e\x25\xa6\x17\xff\x23\xd1\x47\x41\x2e\xe4\x7f\x3a\xfc\x4f\x8b\xa1\x05\x5e\x23\xe6\xf5\xcb\x5a\x1f\xa6\xfa\xa0\xd5\x5c\xef\xb8\xd8\x82\x8e\x0f\xe1\xee\x7f\x2f\x91\xe8\x02\x89\x90\x47\x74\x71\xc4\xf4\xf9\x6c\x1a\x91\x58\x1a\xb1\x87\x8e\x19\xc2\x94\x52\xc0\x66\x69\x64\x1f\x38\x66\x13\xff\x87\xf2\x48\x34\xd8\x2a\xdb\x69\x42\x85\x2e\xc3\xed\xcc\x4d\x4d\x88\x93\x13\x2a\x96\x00\x5b\xb1\x60\xa1\x40\x37\xcd\x94\x64\x71\xb6\xb9\x4b\xd2\x0e\x1a\x84\x11\x94\xfa\x94\xfe\x1d\xfd\x0b\x5a\xd1\x71\x18\x6b\xaf\x41\x0b\xb1\xa5\xff\x5f\xee\x42\x66\xda\x2e\x64\x06\xbb\x90\xb9\xb6\x0b\xe1\x1d\xe1\xcd\x50\x33\xee\x88\xa6\xdd\xf6\xa1\x27\xfe\xb3\x9d\xc8\x7d\x25\x5d\xdb\x41\x95\xd8\xc7\x5d\x46\x5e\xca\x64\x56\x26\xf3\x32\x59\x94\xc9\x41\x99\x54\xca\xeb\x7c\x50\x49\x36\xf1\x63\xe9\xde\x83\xc9\x48\xa5\x3d\xf4\xa2\xc0\x74\xc9\xe1\x89\xe9\x91\x68\x62\xfa\xe4\xa5\x61\x46\xe4\x26\xf0\xc6\x66\x8f\xdc\x05\xb3\xb1\x39\x10\x5c\xf6\x74\xce\xfe\x20\xcf\xe9\x17\xf9\xc1\x77\xc0\xb0\x39\x81\x77\xa4\x85\x0f\x81\x1d\xe1\x44\x20\x51\x32\xc7\xc9\x5e\x6c\xd0\xa1\xc3\xb6\x48\x7f\x23\x11\x80\x9b\x31\x20\xfe\xf1\xee\x3b\x06\xa7\x2a\x33\x07\x3d\x4d\x98\x0c\x1d\x1e\x27\x17\x4a\xfc\x5d\x71\xa3\x44\x8b\xde\x2d\x97\x9e\x74\x73\xe3\xa7\x34\xd9\xae\xb2\xce\x0b\x55\xe1\xed\xb8\xcc\x4e\x1c\x3a\xd2\x4a\x0f\xd3\xa5\x87\xa2\x74\x57\xfa\x50\x0b\x53\x2a\x27\xde\x03\xd0\x08\x08\xc8\x7b\x3c\xbc\x6f\x67\x0e\xaa\x56\x31\x81\x40\xef\x80\xc9\xd0\x49\x55\xbb\x15\x93\xfe\x8c\xa7\x7d\xe6\xa4\x9a\x72\x5f\x1f\xe9\x72\xb5\x2c\x3c\x8a\xcb\xec\xc7\xa1\xd3\xea\xdf\x91\xc8\x95\xce\xe6\x74\x12\xf5\xb6\x94\xde\x8d\xcb\x1c\xc4\xa1\xb3\xb5\xd2\x77\xde\x28\xfe\x2c\x5d\xfc\x40\x3f\xcc\x76\xa1\xea\xad\xbf\xa1\x01\x53\x77\x99\x70\x4a\x2b\x95\x36\xb5\xf4\x4b\x27\x55\xf3\xf0\x18\x0e\x94\x66\x0e\x0a\x72\xb5\x2e\x38\xf2\x90\xb1\x7a\x97\xc1\x78\x02\x5f\xff\xc2\xa5\x74\x98\xcd\x36\x13\x83\x30\xc0\x3a\xef\x32\xbc\x5c\x1e\x97\x49\xa4\x20\x97\x0a\xd2\x53\x90\x0b\x80\x9c\x94\xc9\x40\x41\xae\x14\x4e\x40\x6d\xcd\xf3\xab\x03\xa7\xb8\x98\x8c\xa8\x6b\x54\x87\xa0\x1d\xa5\xa3\xd2\x8d\x1d\x38\xe6\xb9\x1d\x38\x78\x42\x5d\xf1\xf2\xc0\x89\x3c\x5a\x76\x69\xc0\x94\x6b\xc1\xc6\x89\x10\xfe\x27\xd4\x9b\xb3\x1c\x1a\x95\x1e\x72\x39\xf3\x36\x97\x93\xf7\x9f\x9e\x4f\xc8\x44\x06\xcb\xe0\xc2\xce\x95\x3e\xa6\x22\x19\xac\xd4\x48\x4f\xdd\x4b\xaf\x91\x01\x5f\xd5\x93\xc2\x8f\xaa\xd8\xea\xf0\xa4\xf6\x01\x23\xa1\x0c\x4b\xa7\x75\xe1\x1a\x5e\xa8\xf0\x9a\x32\x2c\x7d\xc9\x81\xf7\xfc\x0e\xb6\x76\x20\x10\x8a\x23\x4a\xd1\x3c\xea\x42\x03\xa9\x6b\x79\xf6\xc8\x77\x76\x29\xad\x55\x2d\xec\x51\xcf\x7e\x0a\x1c\x70\xb8\x70\xe3\x3a\xc8\x3b\xc6\xcb\xa5\x67\x79\xf6\xb1\x0b\x0f\x88\xd8\xf7\xae\x83\x57\x1e\x6d\xd5\x72\x93\xdc\x65\x60\xf1\x31\xe4\x49\x97\x83\x87\xc7\xbc\xf3\x41\x9f\xef\x67\xb3\xbe\xdd\xf2\x1c\x54\x20\x9f\x31\xa5\xb4\x55\xe3\x38\xf7\x1e\xdc\xc0\xd3\x95\x7c\xba\x37\x5c\x31\xce\xaa\x78\xb9\x2c\x90\x40\xc4\x3a\x10\x83\xa3\xff\xe5\x32\xf6\x02\x03\x49\xfe\x82\xf7\x27\x04\xbd\x24\xd8\x15\xd9\xe5\x88\x0a\x93\x84\x20\x09\xf6\x04\x4e\x87\xda\xd2\x94\x54\x8d\x81\x08\xc6\x00\xe9\xd1\xa8\x54\x65\x76\xc7\x31\xbb\xfc\x2f\x9c\xc6\x61\x97\xf6\xd2\xe3\xa0\xa7\x75\xc1\x19\x38\x64\xf6\xf9\x18\x88\x4a\x0f\x2c\x97\x33\x4f\x19\x1f\x05\x3d\x39\x0a\xa4\xb3\xa2\x81\x96\x25\x98\x30\xe9\x81\x4e\x7a\xd6\xb2\x12\xcf\x5a\x7c\x0e\x24\x98\x4d\x8e\xe9\x4b\x7f\x5a\xa1\x0c\x76\x8f\x95\x4b\x1b\x71\x39\x48\x90\x66\xa4\x65\x03\xef\x59\x3b\x13\x0d\xe2\xf3\x82\x34\x07\x5a\x56\xec\x40\x2b\x50\xbb\xb7\x04\x19\x1c\x66\x35\x35\xc0\xec\x98\xef\xb9\x52\x71\x6b\xaa\x39\xcb\x12\xbe\x14\x06\xf2\xd7\x57\x0e\xcb\x82\x6c\x16\x8d\xa4\x5f\x2e\x48\x19\x61\x3e\x44\x85\xfb\x05\xf8\x9d\xca\x2c\x72\x74\x4a\xda\xd3\x9e\xa0\x3e\xed\xfd\xf3\xf1\xd9\x4b\xc6\xa7\x60\x21\xa2\x5f\x5a\x35\x78\x74\xd1\xe2\x8c\x4a\x39\x63\x3d\x03\xcf\xaf\xe2\xec\xc9\x68\xb1\xd1\xc1\x78\x3c\x6c\xbb\x93\x71\xc0\xf3\xa8\xb1\x7a\xd6\x14\x74\x99\xd2\xd7\x4c\xd8\x8e\x22\xc3\xeb\x47\xfd\x61\xc6\x74\x09\x8f\x55\x78\x44\x86\x4d\x97\x08\x8c\xa6\x7c\xb8\xcf\x08\x87\xfd\x6e\x66\x13\x3c\xee\x6f\x01\xce\x8a\x5b\x80\xf3\x6d\xc0\xd9\xfe\x36\x4c\x0d\xd8\x1f\x30\xaf\x3d\x9e\x67\x4c\x8f\xec\x70\xc0\xa5\x88\x9b\x9e\x48\xcf\x6b\xe9\x32\x68\x0e\x48\x46\x78\x9b\x51\xcd\xf3\xa5\xf7\x19\xd1\x40\x15\x33\xfd\x18\x6f\xad\x91\x5b\x12\x78\x33\xb7\x80\x79\x43\xb7\x80\xe7\xdb\xc1\xbc\xb1\xdb\xb0\x53\xe0\xb8\x41\x91\xac\xa7\x6a\x71\xa4\x50\xf2\x1a\x8a\xca\x05\x12\x6f\x26\xf6\x3c\xdf\x00\x01\xb8\x17\xe7\x88\x93\x67\xe6\xb6\x4b\xf0\xae\x14\x6e\x2d\xe5\x25\xd8\xc3\x2b\x32\x7f\x1b\xb5\xd1\x92\xa8\xe0\x31\x7d\xb5\x22\x0b\xfa\xba\x22\x65\xfe\xe7\x90\x16\xc8\x05\x2d\x90\x73\x1e\xb9\xe1\x7f\x6e\x69\x81\x3c\xd0\x02\xe9\x32\x1e\xab\xc2\xdf\x53\xc6\x81\x8c\xaa\xa7\x89\x5f\x8f\x5a\xcc\x9c\x90\xc7\x17\xfd\x9b\x01\xdf\x8b\xf0\x85\x7b\x27\xe0\x22\xa2\x00\x58\x1e\x0f\x60\xcb\x57\xf1\x48\xc4\x7b\xe2\x67\xa2\xc0\xca\x64\x74\xe6\xa0\xd1\x88\x61\x72\x2e\xc2\xc3\x91\x38\x41\x9a\x66\xb3\xe7\xa2\x49\x5d\x26\x52\xc6\x23\x06\x5c\xf4\x46\x44\x27\x32\xfa\xff\xd0\xf6\xe6\xcb\x6d\xe3\xca\xe2\xf0\xff\x79\x0a\x2b\xe5\x8f\x87\x18\xc1\x1c\xc9\xce\x24\x33\x64\x30\x2a\xcb\xf2\x6e\x29\x89\x9d\x58\xb6\x75\x58\x53\xe0\x26\xc9\xa2\xf6\xc5\xb2\x4d\xdd\x67\xff\x0a\x8d\x85\xa0\x44\x39\x39\xe7\xde\xdf\xd4\xc4\x22\x41\xec\x68\x34\xba\x1b\xbd\xdc\x90\x56\x9f\xe2\x6b\xbc\xc0\x75\x89\x55\x6f\x49\x28\x4e\xd6\x90\xdc\x56\xaa\xad\x1b\xd7\x7e\x69\xdd\xb8\xe8\x82\xd5\x94\x41\xa9\xa1\x86\x5e\xc0\x17\x3a\x6b\xf0\x82\x12\x8f\x21\xd6\xdb\x4a\xa3\x58\xb4\x6b\x0c\xad\x4a\x57\x85\x17\x22\xcb\x19\xd5\x8f\xc3\x73\xe4\x9c\xc9\x85\x61\xf4\xc4\x99\x9c\xfa\x6b\xf9\x7c\xdb\xc1\x0b\xf9\x7c\xdd\xc6\x75\xe1\x68\xf5\x4c\xa8\xfe\xf0\x4e\x92\x10\xba\x49\x42\x67\xaa\xe1\x9f\x29\x99\x02\xfe\x61\xbf\x0a\xff\x4c\x9d\x29\xe0\x9f\x10\x4f\x39\xfe\x91\x2e\xcd\x3b\x97\xc5\x0b\xaa\xb9\x74\xcc\x62\x9a\xc3\x63\x85\x69\x0e\x8f\xd1\x0a\x77\xab\x1b\x12\x3d\x1c\x22\x36\x2b\xc0\xd5\x08\x7b\x2d\x8f\x84\x2d\xcf\x4d\x92\x45\xcb\x73\x51\xc5\x94\x37\xd4\xf8\x9d\xd0\x6b\xc2\xa7\x1d\x4d\x32\xa8\xdd\x5f\xed\x74\x07\x3b\x7d\xca\xc8\xfe\x3e\x95\x4a\x46\xe2\xca\xb0\x4f\x5b\xd4\x75\x3c\x36\x32\xee\x73\x0e\x39\x41\x18\x87\xb3\x70\x07\xbe\xac\x18\xfc\x39\x00\x90\xa9\x6e\x14\xab\xae\x8e\x44\x55\x10\xdf\x8a\x92\x7a\xcb\x77\x31\x55\xd5\x30\x3a\x9d\x57\x53\x07\x37\x65\x37\xa4\xe4\xd4\xf5\x4a\x02\x56\xc9\x0b\x7a\x81\x3a\x02\x1e\x23\xeb\xa5\x15\xb8\xd8\x57\x75\xf8\xaa\x0e\xf6\x01\x39\x35\x52\x72\xd8\xf6\x11\xe2\xa6\x67\xc6\x08\x55\xab\x6f\x5d\xdf\x4b\xf2\xc2\xcf\xec\xda\xe6\xf1\x1a\xcb\xa1\x36\x6d\xb0\xb6\x69\xef\xb2\x39\x83\x8d\xed\x3d\x95\x39\x21\xaa\xcc\x8a\x3b\x59\x79\x5d\xe1\x01\x79\x65\xe8\x53\x5a\xc9\x38\x74\x6c\xc6\x69\x3f\x19\xf5\x39\x47\xaf\x73\x32\x4f\x92\x14\x7a\x9f\x8f\xd9\xa8\xe6\x8c\x42\xf4\xf9\x4f\xc0\x7f\xa8\x75\xff\xc4\x9e\x18\xc1\x38\x30\x8c\x39\x9b\x20\x46\xcf\x0f\x0c\x63\x20\xdc\x16\x0b\xd6\x6d\xbe\x42\x4e\x6c\x75\xb5\xd8\xf8\x1c\x94\x22\xf4\x4a\xad\x6e\xd5\x8c\xb0\x0f\x82\xa5\x81\xe2\xe9\x77\x62\x98\xcb\x97\xbc\xb9\x14\x08\x07\x14\x15\xb2\x15\xa2\xd7\x80\x04\x7a\xdf\x87\x27\xd2\xc3\x8c\x42\x90\x81\x98\xea\x18\x39\x71\x3a\xad\x81\x98\xd6\x34\xf5\xf6\x5c\x3a\x0a\x3e\xd7\xf3\xca\xd4\xe6\xb9\x9a\x82\x80\x07\xac\x87\xe8\x11\x7c\x0a\x7c\xc3\x90\xbe\xe3\x94\x18\x07\x77\x3b\x6b\xbd\xc5\xb1\x18\x7e\xcc\x87\x8f\x04\x00\x55\xff\x43\x00\xaa\x4a\x00\xaa\x5e\xfe\x04\x80\x6a\x32\x67\xed\xf2\x27\x00\x74\x24\x73\x1e\x5d\xae\xb1\x90\xeb\x39\x8f\x65\xce\xe3\x4b\xfc\x4e\xc0\xda\x80\xc1\xda\x88\x70\x5b\xaa\xe5\xbe\x1d\x70\x83\xaa\xe7\x7d\x3b\x06\x98\x1b\xa4\x43\x1b\xe0\x11\x5e\xa0\xd7\x05\x59\xe8\xeb\x76\x73\xca\x26\x62\xc1\x20\x2b\xe0\x3f\x3e\xff\x89\xf9\x0f\xcc\xfb\x82\xfb\x96\x1b\x19\xc6\x42\xcc\xfb\xc8\x30\x46\x82\x7e\x93\x4a\x56\x2b\xe4\x0c\x7e\x01\xf2\x46\x29\xe4\x0d\x60\x11\x6a\x6c\x11\xda\x67\xb8\x5a\x7d\x4b\xcc\x83\x5e\x3d\xe2\x59\x5f\x47\x29\xfa\x20\x2d\xb0\x33\x01\x72\xff\xc2\x75\xa2\xcf\xed\xd4\xd6\x64\x4a\xbc\x56\x04\xc4\xfb\xb4\x15\x86\x8c\x13\xf9\x93\x71\x22\x47\x43\xa1\x28\x31\x27\x53\x50\x32\x9e\x86\x8c\xae\x2d\xce\x5b\x65\x17\xbf\xb0\xdf\x7d\x17\x4f\xd9\xef\x81\x8b\xab\xec\xf7\x83\x8b\x6b\x84\x5a\xa3\x86\x59\x9c\xb7\xfe\x70\x41\xe0\x8a\x1b\x2a\xe5\xa3\x48\x99\x93\x42\xa1\x38\x6f\x7d\x72\xf1\x82\x2c\x8a\xfc\x56\xa9\xa1\xae\xa2\xd0\x6f\x53\xfc\x42\x5e\x8a\xfc\x7a\x49\x4f\xaf\xe2\x1a\x99\x57\x1a\x7b\x35\xbb\xb6\xd7\x70\x4a\x7f\xd7\x0c\xc3\xac\x89\x7b\xb2\x29\xf1\x8e\x8a\xd3\xe2\x34\x2c\x56\x8b\x5e\x4c\x8b\x1d\x0a\x11\x14\xde\xd5\x90\x10\x7c\xce\xe1\x61\xc1\xfe\xbc\x70\xfd\xe4\xa9\x32\x13\x0a\xa4\x8b\x07\x79\xc5\x36\xfc\xa8\x9f\x2f\xca\xab\xe6\x88\x9d\x2f\x29\x34\x0c\xce\x91\x13\x26\x09\x77\xf7\xdc\xc6\x3e\xf8\x9e\xf0\x18\x08\x8c\x70\xa0\x39\x31\x1b\xad\xf0\x59\x87\x82\xf5\x9f\xe3\x99\x47\x6c\x05\x4f\xfb\x34\x67\x09\xdf\xc2\x20\x1e\xa1\xd6\xf0\xa3\xc9\x77\x24\xdb\xd4\xde\xda\xa6\xd6\xf5\x9f\x32\x9b\x9a\xca\xe3\xd1\x63\x90\x15\x62\x1f\xd3\x74\x53\x0f\x40\x7b\x34\x1f\x93\x9d\xeb\xc7\xa3\x52\x9a\xa1\x6c\x77\x7d\x3d\x06\x1a\xc6\xe7\x6f\xdf\xf8\x5b\xc0\xdf\xae\x8f\x05\x5f\x0a\x6f\x37\xfc\x6d\xc4\xdf\x2e\xf8\xdb\x94\xbf\x5d\xf2\xb7\x39\x7f\xbb\x82\x37\x87\xfb\xff\x30\xeb\xfc\x4d\x0e\x29\x49\xfc\x24\x61\x38\x34\x49\x46\x49\x32\x4d\x92\x79\x92\xd0\x15\x1e\x68\x0b\x95\xdd\xff\xd0\xc3\x77\xac\x53\x9e\xd6\x45\x81\x2e\x45\x17\x85\x0c\x44\x75\xd1\xcb\x74\xd1\xcb\x74\xd1\x4b\xbb\x88\x17\xfc\x8d\x77\x11\xbf\x08\xc4\xdc\x41\xb8\x2a\xaa\x6f\x23\x5c\x53\xa8\x1d\x37\x14\x3e\x67\x44\xec\x67\xf2\x52\xa9\xd9\xb5\xe2\x0b\xa3\x66\x3f\x93\x6a\xa5\x61\x37\x8a\x55\xfc\x22\xcc\x14\x5e\x58\x2d\xfc\xb1\xca\xed\x1c\x8a\xf1\xdf\x2f\x88\x8d\xac\x4e\x5e\x7e\x67\xaf\x08\xfb\xc4\xff\xad\x8e\x03\x12\xfc\x56\xc7\x31\x89\x7f\xab\xe3\x01\x19\xfc\x56\x77\x46\xc5\xf9\xdf\x2f\x86\x61\x42\xce\x51\x71\x8e\xf0\xe8\x37\x52\xc7\x53\xf6\x67\xce\xfe\x2c\x7e\x23\x75\xe4\x04\xc5\xe9\xdf\x55\xc8\x56\xfd\xdd\x0c\x8a\x53\x84\x7d\xf6\x31\x60\x7f\x54\x01\xe4\x0c\x8a\x8b\x34\xdb\xa0\xb8\x40\x38\x66\x1f\x07\x6b\xb5\x09\x6a\x0b\x34\xe7\x4d\x8f\x4b\xa7\x11\x98\x0c\xd6\x8a\x2f\x7b\x31\x6e\x20\x88\x96\x2a\x5e\x8a\x03\x90\x26\xed\x7f\x2a\xe1\x12\x2e\x94\x10\x5c\x02\x99\x30\x1d\xc5\xea\xde\x22\xcd\x3b\xe7\x09\x78\x8e\x17\xb8\x84\xff\xca\x64\x1e\xb1\x6f\x32\x2b\xbc\xec\x4d\x31\xbf\x53\xc6\xe5\x3f\x4b\x40\xe1\x89\xbc\xb8\x51\x0c\x64\x4e\x9f\xbd\xc0\x6e\x60\x99\x58\x17\x0a\x25\xc4\xcd\x79\xc4\x76\x38\x66\x9b\xb3\xd6\xa7\x38\x6f\x83\xb2\xf3\x2d\x77\x8b\x06\xdc\xbb\x21\x47\x11\x20\x6f\x6d\x1c\x23\x3c\xe5\x8f\x5f\x8e\x19\xc6\x0b\x24\x88\x2c\xf8\x23\x03\x91\x17\xfe\xc8\x40\xa4\xca\x1f\x19\x88\xbc\x30\xa8\x98\x57\x5e\xec\x97\xe2\x1c\x57\xd9\xcb\xa2\x52\xb5\xab\xc5\x05\x9e\x0b\xb8\x98\xb3\x5a\xe4\x5d\xa7\x14\x35\x8e\x08\x21\xdf\x95\xa4\x71\x4a\x40\xd2\x58\xa0\xd6\x79\x87\x9a\x01\xaa\x98\x03\x32\xd0\x71\xd7\xf1\x39\xc2\x03\x41\xfa\xbf\x88\xc7\x66\x07\x57\xc5\xe3\x2d\x5c\x7b\x0e\x04\xd9\xbf\x90\x9e\xc7\x47\xaa\x01\xd1\xdc\x40\x50\x22\xca\x37\xf9\x34\xdb\x05\x91\xa3\x79\x8e\x19\x90\x31\xd4\x38\x00\x02\x03\xd9\x66\x40\xa8\x35\xf8\x68\x06\x88\x6d\x43\x86\xda\x62\xa0\xb4\x90\x13\xb3\x42\x1c\xb7\xc5\x86\x01\x1e\x0a\x06\x9a\x9f\xc9\x0c\x6e\x53\xb7\x03\x10\x8c\x83\xe1\xb7\x11\x7e\x27\x2a\x12\x96\x57\xb1\x30\xbb\x6a\x1c\x73\xb3\xab\x2f\xe2\xf7\xab\xf8\xfd\x26\x7e\xaf\xc5\xef\x8d\xf8\xbd\x10\xbf\x97\xe2\xf7\x4a\xfc\xd6\x8f\xed\x51\x1a\x8a\x92\x10\x32\x38\xaf\x68\x83\x81\x18\x22\x30\xe7\x58\x1e\x0c\x01\x42\x76\x4c\x08\x69\x1c\x57\x46\x62\xbe\x24\x90\xf0\x0f\x5f\x8e\x19\x81\x20\xa2\x1f\x0a\x98\xc9\xb8\xef\x8c\x2f\x78\xdb\x3d\xf1\x1b\xbc\x50\xfe\xe0\xcb\x87\xbe\xf8\x12\xc9\x84\x50\x3e\x0c\x2e\x6c\xdf\x3a\xee\x50\x38\x94\x06\xb2\x5a\x69\xe6\xcc\x6d\x27\x84\xa1\xc4\xce\x68\x32\x1c\x85\x93\xd9\xf3\xce\x70\xb0\x33\x09\xfd\xd9\xce\xfb\x7f\x15\xe3\xe2\xbf\xde\x5b\xff\x72\x24\x1b\x71\xce\xa9\x40\x7c\xdc\x7f\x53\x13\x38\x43\x09\xce\xe6\x8c\xe5\x85\xc7\xa7\xf4\xb1\x7e\x82\x34\x9f\x5c\x20\x27\x8f\x96\xdc\x99\xdf\xdb\xe4\xe2\x7c\xae\x04\x94\x8d\x6c\x1d\xef\xbe\x73\x9d\x9a\x1f\x1b\x35\x9f\xd0\xcd\x9a\x37\xc9\xcb\x45\x5a\xf3\x72\x4e\x7f\x22\xc6\x9f\x8a\xce\xe6\xd0\xa1\x85\x12\x98\x72\xb1\xcd\x7d\x8a\xc0\xb1\x2a\xe4\x3c\x3c\x45\x1b\xc6\x34\x69\xd6\xe8\x12\x58\x43\x70\x53\x18\x2e\x67\xb5\xd0\x1f\x4e\xc0\x66\x82\x44\x97\x99\x0b\x07\xa1\xe6\xc3\xed\x45\x47\x30\xab\x4f\xac\xdf\xf0\x38\x7d\xe2\xe2\x85\x06\xff\xf2\x63\xaa\x46\xd1\x10\x53\x61\x36\x48\x03\xe8\xb9\x89\x8c\xae\x5c\xe7\x79\x19\xf6\xb9\x26\x85\x92\x53\x66\xc0\x0a\x5a\xe3\x90\xb7\xe4\xb2\x64\xe1\x61\xed\x86\x5c\x57\xbe\xd8\x0d\x7c\xcb\xcb\x30\xd6\x65\x4e\xe6\x8c\xcd\xfa\xee\x83\xc5\xd9\xb4\x32\xb7\x53\x3c\xc3\xda\x9f\xc3\x78\xc0\x00\x60\x30\x23\x37\x5c\x98\x4a\x9f\x29\x38\xc0\x9d\x0b\x24\xc4\x2f\x18\x6f\x2b\xb2\x56\xfb\x56\x7c\x6b\x76\xc4\xb7\x7a\x45\xf6\xd2\xae\xa7\xc1\x68\xee\xa7\x14\x39\xef\xe6\x6c\xd6\x9e\x42\xaf\xd7\x9d\x9d\x0c\x07\xb3\x9b\xfe\x70\x38\xeb\x74\x07\x6d\xd2\x9d\x50\xc9\x10\x8e\xb8\x50\x67\xce\x88\xf3\x01\xff\xf1\xf8\x8f\xcf\x7f\x02\xfe\x53\x27\x73\x67\x6a\x18\x75\x81\x83\xa6\x86\x01\x52\xd9\x3a\x23\x32\xb9\x56\xf8\x35\xd8\x9a\xdc\x10\x46\x17\x80\xe9\xc6\xcd\xe7\xb9\x73\xc3\xc8\xe9\x5b\x5d\x6e\x5d\xa5\xc8\xb9\xcd\x8c\xbd\xd1\xba\x71\x9d\x5b\x31\x62\x39\x52\xc4\x53\x9a\x1d\x2c\xc7\xc7\x67\xba\x4f\x49\x3d\x8d\x6d\xdb\x3a\x74\x9d\xd2\xe7\x1b\xc3\x30\xfb\xb4\x48\x6a\xa2\x50\xff\x04\xf7\x69\xf1\x07\x72\xea\xac\x8b\xb7\xc8\x99\x32\xca\xf6\x16\xad\x6a\xe4\xba\x32\xb5\x5b\x75\xd7\x69\x08\x8f\xed\x25\xcc\x15\xa6\xca\xbc\x19\xff\x14\x71\x2f\x93\xdd\xc8\x8c\xa8\xd9\x40\x49\x52\x18\xb0\x5f\xd4\x20\x25\x67\xca\x57\x77\x7c\xc9\x0d\x61\x34\x8c\x0e\xa8\x76\xba\x51\xe7\x14\x21\x1c\x51\x73\x2a\xaa\x99\x22\x34\x25\x25\x2e\xcb\x99\x92\xa3\x9a\x73\xa3\x8f\xc5\x99\x2b\x80\xdb\xbb\xb1\x9e\x9d\x5b\x52\x6b\xd5\x84\xd1\xba\x8e\x59\xc3\x2a\xad\xa4\x5f\x26\x9e\x6b\x22\x6b\x36\x1c\xed\xd5\xd3\x67\xfb\x9d\xca\x90\xd6\x6f\x3d\x43\xb5\xd7\xaa\x95\x8d\x41\x5c\x93\xeb\xe2\x7c\xef\xa6\x75\xe8\xfe\x36\x55\x6e\x0a\xd8\xa7\xa3\x9a\xf8\x76\x2b\x5d\xc5\x4f\x86\x4f\xef\x7f\x0c\x26\xa1\x3f\x6c\x0f\xba\x2f\x61\xb0\xb3\xa0\x71\xb7\x3d\x60\x3f\xf3\xd0\xde\x79\x5f\x9c\x3a\xf5\x54\x6c\x36\x25\x25\x87\x03\x07\xeb\x95\x33\xfd\x7c\xe3\x4c\x8b\x45\x34\x27\xb5\xd6\xd4\xe5\x71\x38\xe2\x13\xbc\x37\xe7\x26\x31\xfd\xd1\x7c\x16\x06\xdf\xc3\xe5\xec\x2a\x1c\xb4\x67\x1d\x13\xfd\xd6\x28\xfe\x10\xf1\x3a\x78\x85\x62\x87\x7f\x3b\x97\xd7\x04\x35\xc3\x28\xc1\x5f\x68\x95\xc7\x77\xac\x31\xb6\x46\xc2\x93\x7a\x6e\x76\x90\x1e\x1f\xb0\xae\x8c\xe0\xf0\x9c\xbc\xbe\x8f\x86\x83\x99\x15\xd1\x7e\x37\x7e\x06\x39\xfd\x70\x30\x3b\x81\x37\xf1\xd2\xa0\xfd\x10\x84\xe5\x2c\xdf\xb4\xfb\x12\xbe\xb7\x7d\xac\x82\x5a\xfb\xe2\xc3\x13\xa8\x3f\xbc\xb7\x03\xf8\xd4\xe4\xca\x10\x01\xee\xce\x68\xdc\xf5\xed\x18\xcf\x07\x41\x38\x81\xd0\xea\x03\x60\xb1\xa7\x6c\x87\x4d\xf3\x39\x5f\x76\x86\x67\xb8\xdf\x39\x38\xd6\xf1\x01\xab\x24\x09\xfb\xf5\x4f\xf9\xef\xbb\xf1\x25\x97\xd7\x39\x91\x61\x44\xad\x1f\x9e\xeb\xa0\x08\xa4\x60\xf0\x82\x1c\x8f\x8c\xa4\x93\x75\x06\xe0\x05\x42\xa4\x29\x47\x38\x99\x0c\x27\x3b\xdc\xa0\xa4\x3b\x68\xef\xb0\xfd\xf9\xde\x59\xa5\xab\xfd\xaf\xbc\x1c\x3b\x21\x37\xf2\xd8\x79\xea\xce\x3a\x3b\x7e\x87\x0e\xda\x61\x90\x9e\x97\xef\xff\x55\xf4\xc5\x39\x99\xb5\xce\x3b\x64\xc7\xe5\x86\x96\x43\x0e\x69\x99\x2a\x3a\xac\xdf\x09\xa3\x57\x9f\xf8\x3a\xed\x06\x11\x9a\x18\x4e\xf3\x79\x90\x10\x8f\x71\x80\x1c\x59\x79\x8c\x2f\xe4\x71\x3a\x94\xbe\x05\x08\x23\xe9\xd8\xa4\x0c\xff\xd1\xcc\xd4\x8b\xfa\x3d\x22\x9b\x4a\x6f\x7e\xc0\xc8\x44\x33\xd0\xf0\xb8\x89\x06\x25\xd4\xea\xb7\x5b\x8f\x81\x6b\x22\x87\xb6\x82\xb1\x66\x0a\xaf\x34\xc0\x77\x28\x8c\xfd\x84\x8d\x7d\x74\x81\xff\x23\x45\x0f\x3c\x95\x42\x87\xd7\x95\x33\x6f\x51\xcb\xbf\xb5\xfa\x1d\x97\x78\xec\xa5\x35\x3c\x74\xe1\xed\x9d\x0f\xdf\x6a\xa7\xf0\x16\xc0\x4b\x3c\x87\x97\x18\x5e\x9e\x9a\xf0\x32\x80\x52\xa7\x2f\xbc\xd4\x08\xde\x9e\xc4\xdb\x54\x17\x03\x7a\xe6\x29\xeb\xed\xc5\x39\x7e\x39\xc6\xa3\x0b\x7c\x96\x4b\xff\x73\xe1\x58\x56\xb5\x20\x6b\x41\x24\x82\x60\x68\x31\x38\xa6\x0b\xfd\x6e\xf0\xf2\x62\x5b\x14\xea\x1b\x56\xc7\xeb\x74\xd1\xb6\xbd\x95\xb8\xef\xd3\xae\x28\x4f\x90\xb8\xa2\x8e\x52\xd3\xa1\xda\xba\xe9\xd0\x97\x26\x69\xac\xa7\x0d\xab\xa4\x9a\x63\x62\xb4\x58\x4f\x1b\x7f\xd4\xcd\x8e\x94\xc9\xd2\xcb\x7a\xda\xe4\x23\xa9\x6b\x69\x51\xeb\xc7\xd8\xcd\x98\xc4\xf0\x14\xdd\x54\x88\xa7\x9c\x6f\xe4\x39\xd3\x52\xb8\xd5\xd8\x48\xd9\x79\x8a\xed\xc6\x4e\xdc\xac\xae\xc5\x3b\xed\x1a\x5c\x14\xd2\xed\x77\x3e\x93\x60\xcd\x61\x71\x6b\xf8\xec\xb6\x02\x17\x98\xa1\x8b\x89\x40\x02\x37\x60\x29\x15\x2e\xbb\xd3\xd9\x74\x87\x0e\x02\xe9\x21\x93\xee\x4c\x67\x94\xed\x6c\x30\xa5\xb2\xde\x3b\xac\x8c\x74\x40\x29\x6a\x22\x9e\xe6\x8c\xeb\xdb\x88\xdb\x4f\x61\x95\x81\x9b\x70\xd3\xd6\xdc\x67\x60\xc6\x70\xd7\x91\x61\x80\x35\x54\x0d\x8b\x55\xca\xb7\xb6\x7a\x14\xdf\xc7\x1f\xf9\xfb\xc9\x52\xb8\x12\x9b\x7c\xdc\x34\x9f\xf2\x45\x9d\x9a\x19\x91\xda\x7b\x59\x04\xa2\x08\xdc\x8a\x04\x47\xfb\x3a\x35\xeb\x14\xc6\x64\xd8\x27\x41\x4b\xf6\xd9\x6d\x79\x13\x97\x5b\xc5\x8f\x34\x03\x50\x1f\x17\x0a\x1e\x23\xbc\xb4\xa4\xbc\x56\xe7\xca\xa3\x01\xb5\xae\x9a\x28\x55\xb0\x62\x98\x23\xcf\x2e\x5c\x38\xbc\xf1\x5b\xa1\x8b\x63\x12\xb4\xda\x99\x7e\xb4\x19\x8a\x7b\x97\x76\xa4\x2d\x02\x0f\xcc\xf5\x14\xa4\x19\xd8\x2f\xd6\x0c\xbc\xb2\x00\xf2\xb7\x66\xc8\x2b\xbb\xa8\xd9\x7a\x43\x1f\xb9\x2e\x98\xa7\xc7\x91\x49\x4d\xa8\xbc\x96\xef\xba\x2a\xa6\x83\xaa\x7c\xc5\x20\x45\x58\x99\x32\x30\xf0\x5c\x75\x31\xa3\xa5\x29\x40\x4f\x2d\xba\xd4\x57\x95\xc2\x0d\xc4\x32\xd0\x92\x67\x87\x96\xb5\x18\xcb\xb3\x29\xcb\x42\xd4\xc2\x5b\x07\x29\x69\x65\xb6\x69\x54\xf6\x92\xb5\x80\xa7\x2d\x3a\x71\x65\x5c\x35\xb8\x89\xa4\xcf\x14\x39\xc8\x23\x20\x85\xd4\xe2\x4b\xc1\x48\x60\x46\x58\x11\xb9\x27\xfd\x54\x78\x78\x31\x76\x41\x50\x78\x39\x76\x41\xd4\x77\xc6\x7e\x08\x39\x9f\x56\x28\x69\x9c\xd9\xec\xf9\x6c\x0a\x57\x64\x5f\xce\x90\xf3\xce\x57\xd3\xec\xbb\x8e\xcf\x8d\xfe\x70\xeb\x15\xdc\x63\x4a\xb7\x6a\xc1\x0a\x83\x4f\x33\x8a\x67\x74\xd2\x0e\x67\xb6\xbf\x72\x75\x80\xa8\x66\xfc\x8d\x70\x88\xe7\x2b\x85\x43\xa2\xed\x05\xb6\x0b\xd2\x57\x08\xd8\xad\xb6\x84\xd5\xed\xa4\x9e\xed\x54\xcd\xb5\x8c\xb1\x61\x9a\xde\x50\xb6\x9a\xbc\x78\x81\x90\x60\x24\x92\x18\x12\xe2\xb3\x91\xfa\x41\x1c\x7d\x54\xce\xb0\x47\x1f\xd9\x69\x21\x9c\x20\x56\xb9\x40\x0d\xdc\x38\x7a\xd2\x7f\x7d\xd4\xa7\xce\x83\xf8\x10\xf5\x29\xb8\xc6\x84\x97\xfb\x33\x19\xe9\x2b\x7b\xde\x48\x8a\x20\x0d\x1c\xeb\xa1\x95\x6a\xce\xb9\x16\x75\x85\x53\xe4\xe4\xa1\x01\x8f\xdf\xd4\x72\x6f\xe0\x99\xf9\x92\x7e\xe7\x35\xca\x9e\x82\x0e\x2d\x57\x93\x0d\x5b\x13\x57\xea\xc7\x86\xad\x43\x17\x2f\xed\xd0\x5a\xe2\x67\x3b\xb4\x9e\x57\x80\x59\x0d\xc3\x94\xad\x7f\x43\x99\xab\x4c\xa4\x7b\x8c\xa9\xaf\xc9\x17\x7a\xe8\x95\x47\xea\xeb\xb1\x06\x4f\x4e\x5b\xb7\x9e\x6b\x6a\xf4\x64\xcc\x69\xc9\xa8\x15\xbb\x8c\x80\x0c\x5b\xb1\x9b\x24\xf0\x43\x3c\xeb\xa2\x43\x4d\xcf\xea\x36\xb0\x67\x3d\xb2\x3f\xb5\x1e\xf6\xc1\xad\x89\x4b\xfc\x22\x7b\x45\xb8\xf7\x37\x61\xef\x08\x04\xd1\x9e\x35\xfd\x08\x79\x11\x6e\xef\xed\x61\x56\x29\x29\x94\xb0\x07\xb0\x78\x76\x02\xb4\x91\x0c\x2c\x95\x16\x60\x8d\x99\x3d\x50\xd3\x6d\x73\xc4\x7b\xd3\x24\x03\x6b\xf6\x91\x4d\xdf\x2d\xf6\x90\x6d\xca\x54\x6e\x70\x8f\xa9\x75\xd6\x24\x85\x32\xa6\x69\xc5\x2e\x4a\x3d\x9b\x80\x4b\x0d\xb8\xc4\x69\xb9\x0e\xcf\x5b\x12\x6e\x68\x28\xb7\xf1\x76\xf2\x9a\x49\x61\xf2\x5a\xc2\xa4\x30\x0c\xcf\x78\xf1\x9f\x2e\xda\xd2\x05\x67\x8a\x2e\x95\x75\x13\x05\xc7\xca\xb6\xda\xdf\x54\x3b\x93\x6f\x36\x03\xb5\x4d\x17\x6d\xec\x39\x94\x53\xe5\x3c\xf8\x1d\x97\x0d\xf8\x27\xe0\x63\xa1\x50\x42\x98\xfb\xc6\xa7\x82\x58\x67\x04\x67\x86\xde\x79\x07\x04\xcf\x1b\x44\x81\x13\x5b\xa7\x1d\x6a\x22\x67\x60\x9d\x74\x28\x1f\xad\x18\x3f\x9f\xb3\xdb\x2d\x06\x9c\x2b\x28\x33\xfb\x48\x6e\xad\x49\x38\x9e\x87\xd3\x99\xf2\x4d\x71\x32\xa1\xfd\x30\x49\x6e\xad\xfe\xf0\xe5\x7a\xdb\x37\x2e\x64\xd8\xfa\xb9\x3f\xdd\xf2\x49\x17\x95\xdd\x82\xe3\xcc\x1c\x37\xa4\x29\x1d\x59\xa3\xb3\xd0\x1a\x0c\x9f\x4c\x84\x56\xb8\x7c\x7c\xf0\xfb\xc7\x12\x42\x2b\x3e\x5a\x72\x6b\xf9\x74\xe0\x87\xf1\xd6\x5e\xf0\xcf\xb9\x03\x3b\x7a\xbb\xa4\xca\xb1\x6d\xe4\x3f\x29\xaf\x67\xca\x9b\x9d\x37\x8b\xbf\x4b\x73\x6c\x94\x6d\xf9\x63\xd7\x89\x3d\x73\xb0\xae\x67\x3e\x68\x5d\xba\x70\xd5\x2f\xac\x94\x73\x6c\x7f\x75\x9c\x95\x24\xe2\x04\xa8\x98\x54\x19\x13\x53\x17\x61\x8a\xec\xa9\x46\xda\x14\x4a\x6c\xba\xc1\x40\x38\xdc\x30\x34\x41\xaf\x14\x3c\xfe\xf9\x8c\x21\x51\x89\x19\x9f\x15\x9d\x39\x04\x97\x80\x1a\x46\xbd\x1c\x53\x15\x55\x87\x55\x3b\xd5\x52\xb7\x56\xd2\xf1\xde\xaa\x84\xf1\x38\xbf\x52\xcb\xc5\xd5\x9b\x5d\x89\xe7\xbf\x52\xc9\x4d\x90\x33\x23\x81\xe8\xc8\xd3\xcb\xf6\x19\x09\xd4\x9c\x36\xd6\x5d\x5e\x70\x19\xdf\xbb\xac\x77\x83\xc3\xd9\x2c\xec\x8f\x66\x61\xb0\x33\x1b\xee\x70\xcf\x0f\xd2\xc9\x41\x87\xce\x76\x82\x61\x38\x1d\xfc\x6b\xb6\xd3\xa1\x8b\x30\xe3\xda\x40\x6d\x27\xcd\xee\x5d\xb4\xdc\xd8\xf4\xb6\x91\xf2\x05\x3b\x7d\xf3\xbd\x4f\x59\x95\xc0\x06\xa4\x2e\x15\x3a\x74\xf6\xaf\xa9\xf2\xa4\xc0\x79\x04\xeb\x3d\x90\x37\x7b\xe5\x02\x59\xc3\x9c\xff\x51\x65\xc1\x84\x3e\x0d\x58\x5d\x9c\xd5\x28\x39\x19\xbe\xc2\xd1\xf9\x0a\xee\xe6\x31\x8f\x97\xd0\x48\xbf\x95\xb3\x10\x9b\xe2\x06\x65\x75\x07\x1e\x96\x6f\x99\x42\x30\xb6\x8a\x9d\x9a\x5e\x92\x78\xd6\xb2\xfc\x37\xf1\xac\x33\x78\x7e\x86\xe7\x2b\x29\x3f\x39\x06\xe9\x88\x3f\x1c\x4c\x67\x93\xb9\x0f\xfe\x30\xbe\xcd\x69\xf0\x7d\x12\x86\xf6\x4e\x77\xb0\xa0\x71\x37\xe0\x1e\x53\xa6\x3b\xed\xee\x22\x1c\x48\x57\x13\x71\x83\xf8\x49\x22\xc6\xc7\x33\x48\xff\x39\x83\x61\x10\x4e\xc9\xbb\x36\x35\x3f\x48\x8b\xff\x2a\xe3\xba\x4e\x9e\xf8\x76\x6c\xb9\x19\xd7\x61\x54\xf4\x55\xe4\xcc\xb0\x83\x17\x4d\x13\x82\x6a\x88\x9d\xdc\xba\x07\x9e\x0d\x78\x95\x15\x6d\x1d\x71\x2f\x53\x9c\x0a\x6e\x2d\x9e\xf5\xe8\x60\xe0\x09\xec\x95\x3b\x76\xc9\xbb\xf7\xb6\xe6\xb1\x99\xfa\x05\x92\xcd\xfa\xaa\x59\x4f\x59\x2d\xb3\x36\x7d\x17\xbc\x9e\x8f\xc7\xae\xc3\xa7\x33\xb0\x96\x65\xc3\x60\x93\xfa\x19\x82\xc0\xb3\xe7\x67\x48\x7f\x86\xf4\x2b\x48\xbf\xf2\x2a\xbe\xc5\xfb\x60\x52\x6e\xde\xc5\xba\xc9\x81\x41\x85\x2f\xcf\x26\xe3\x0f\x7f\x8b\x09\x36\x8c\x0f\x9f\xd5\xb7\x0b\x57\x78\xca\x98\x80\x23\x4f\x2a\x24\x93\xc2\xce\x9a\xe7\xc8\xba\x66\x10\xed\xaa\xef\xd4\x45\x6a\x09\xb4\x42\x7f\x73\x56\x12\xde\x38\xd3\xa2\x7d\xdc\xf3\x90\xcd\x96\x6b\x85\xfd\x38\xa4\x13\x5d\xbf\x4e\x5b\xcd\xcc\x34\xa6\xe4\xc3\x3b\xe9\x38\x02\xa6\x70\xad\x7b\x90\x46\xdd\xd6\xbd\xc7\x86\x23\x54\xdd\xe4\x07\x1d\x8e\xd6\xc1\x68\xb5\xc2\xe3\x79\x38\x79\xb6\x73\x8e\x06\x05\x28\x6c\x67\x50\xb4\xc2\x17\xcd\x9c\xb5\x2f\x98\x94\xad\x15\x9f\x99\xf1\x18\x1c\x2a\xaa\xe7\x2b\x0f\xfd\xbe\x8f\xc0\x8d\x2c\x65\x2b\x9d\xe6\x5a\x6a\xb9\xce\x58\xae\x0a\x63\xc3\xcb\xf6\xbe\xed\x01\xf9\x7a\xa0\x49\xe9\xf0\x74\x14\x77\x67\xf6\x9a\x89\xbc\x47\x4c\xad\x86\x3d\xad\x66\xf4\xfb\x3e\xf6\xb5\xaf\x57\xda\xd7\x67\xf8\x2a\x8c\xe6\x79\x76\x1c\x11\xed\xb3\x8c\x90\x19\x37\x8a\x42\xb4\xc1\xe6\xb6\xe4\x12\x7e\x89\xff\xba\x2c\x73\xdd\xa8\x08\x9c\x4d\x17\x3d\x7c\xe5\xd9\x51\xd1\x5f\xc9\x98\x99\x90\xbd\x9c\xc9\x5e\xf4\xf4\x02\x5b\x8a\xec\xe7\x15\x29\xbe\xf3\xd7\x4b\xad\x97\x3b\xd8\xec\x59\xd1\xcf\xf6\x4d\x2b\x02\xab\x5e\x5a\x49\x57\x41\x9b\xcb\xa9\xc0\x75\x8d\xd0\xfd\x4c\xbc\x8a\xb9\x06\xda\xc2\x0d\x9e\xa8\xb7\x52\x50\x7d\x6a\x87\x3a\xcf\xa1\xcc\x62\xbd\xd6\x37\x1e\x57\x0a\x54\x4c\x57\x28\x2b\x12\x9d\x6c\x58\xa3\xe5\x2a\x14\x70\xf7\x64\xad\x06\x38\x1a\xf5\x40\x7b\x41\xf8\xbd\xc6\xd4\x0a\xe7\xb8\x84\xf7\xb9\xd9\x7e\x01\x22\x21\x2d\x78\xbe\x56\x97\x6d\xf4\x15\xee\x55\x73\x15\xac\x85\x1f\x4f\xcc\x9d\x76\x7a\xd6\xb3\xa3\x62\x66\xbd\x30\x9e\xeb\x37\xbf\x18\xfc\x16\xa0\xcf\x84\x35\x21\x6e\x7b\xa7\xff\x51\x7f\x9b\xcf\xbc\x1f\xa2\xdf\xad\xef\x2f\x60\x22\xbf\x47\xad\xd3\x2e\xeb\xfc\x1e\xf8\xd8\x76\xbc\x56\x1f\x3e\x9c\x76\xf1\x3b\x91\x02\x43\xe4\x61\x0b\x33\x63\x3b\x7f\x32\x3d\x3c\xa8\xaa\xc1\x39\x5e\x6b\xf0\xf2\xd6\x20\x4d\x61\x29\x8f\x7e\x87\xfa\x03\xa2\x9c\x96\xfe\xce\x9a\x92\x43\x2e\xff\x4d\xc4\x78\xc5\x40\x67\xff\xab\x81\x8e\x9e\x61\xa0\x65\x36\x48\x58\x91\x17\x18\xe0\x99\x87\x29\x43\x0f\x6a\x89\xba\x4b\xd3\xc3\xb7\x4b\x88\x01\xba\xeb\xfd\xd2\x78\x58\x8d\x7b\x50\xcb\xef\xd0\x04\x9b\x43\xa5\xea\x65\xfd\xf1\xb7\xf0\x71\x01\x0e\x01\x78\x66\x70\xc7\x5a\x46\x7b\xe0\x7b\x9d\x8f\x6e\xfe\xa6\x11\x24\x5c\x31\x88\xb1\xa4\x0a\x83\x9e\xf5\x75\x04\xd2\xba\x01\xf7\x0a\x1a\x7e\x1e\xa4\xd2\xba\x11\x01\x8f\x8d\x42\x2b\x50\x3a\xb9\x1d\xb5\x4a\xd2\xc9\xed\x69\x64\xfb\x30\x2d\xa3\x56\xd9\xc5\xa3\xd6\xbe\x9b\x51\x68\x38\x61\x9f\xd9\x24\xc1\xe7\x77\x1b\xdf\x1f\x8f\x6c\xdf\xf2\xc2\x97\x6e\x38\x39\x9a\x4f\x16\xe1\xf7\x61\x5a\x11\x1e\xb5\x0e\xd8\x9f\x0f\xec\xcf\x1f\xec\xcf\xc7\x6c\xe1\x4e\xdb\xf6\xc5\x84\xf3\x69\xda\xa6\xed\x40\x67\x9d\x1d\x7f\xd8\xef\xd3\x01\x38\xef\x64\x43\x52\xca\x0e\xdb\x74\xf1\xd8\x54\xf1\xe5\xe7\x33\xc7\x40\xd4\xc7\xd7\x87\xc8\xf1\x05\x88\xfa\x79\x4b\xaa\x49\xad\x85\x78\x27\x38\x46\x40\xeb\x5e\x55\x79\x55\x9a\x52\xae\xd5\x9d\x7e\x1d\x76\x07\xb3\xf3\xc1\x57\x3a\xeb\x28\xcf\xeb\x49\x12\x58\xdd\x27\xaa\xde\xc5\xe2\x2e\xfe\x57\xa0\xdb\x3b\x74\x53\xdc\xd2\x9a\xb8\x98\x42\xcc\x54\xd8\x78\x37\x87\xbf\xb2\xf1\xe4\x49\x6a\x2d\xff\xa6\xd6\x92\x91\x32\xcb\xcf\xd4\x5a\x16\x59\x6d\x40\xe4\xfc\x4d\xad\x67\x78\xf8\x4c\xad\xe7\x22\xab\x1f\x7a\xfe\xce\x33\x97\xff\x49\xd7\xad\x68\x38\x98\x11\x6f\x40\x1d\xaf\xf5\x08\x1b\xee\x32\xc4\x32\x1c\xc0\x1b\x58\x0f\xc8\x36\xad\x93\xbe\xec\xa4\x6f\x2d\x8b\xbe\xea\xa4\x2f\x3b\xe9\x5b\xcf\x45\x5f\x76\xd2\x33\x9f\x72\x6f\xf0\xf2\xaf\xaf\x54\xff\x85\x81\x32\xc5\xb5\x53\xdb\xc3\xf1\xdc\xf6\xf1\x53\xd3\x0e\xb8\x81\x72\xcc\x0d\x94\x07\xbc\xfe\x31\xab\x9f\x91\xe6\xfa\xdd\xd3\x4f\x2f\x9e\x58\x4a\x9b\xad\xa7\x12\x57\x42\x82\xc3\xcd\x3f\xe1\xb4\xf2\xe9\x60\x41\xa7\x1a\xb8\x71\xbb\xc8\xdb\x0e\x03\xb5\x9e\xb8\x78\x6a\x8b\xc7\x93\x0e\x3e\xea\x53\x11\x2a\x47\x06\x13\x79\x78\x22\x3d\x05\xa3\x9c\x2d\x69\x6a\x07\x71\x89\x1d\xc4\x25\x15\x8f\xa2\x2d\x43\x3e\xd2\x38\x26\x2d\xd7\xf1\xe5\xd5\x90\x76\xaf\x84\x34\xa9\xde\x48\xb9\x26\xa5\x71\xac\x79\xa1\xfb\x51\xc3\x73\xad\x84\x6c\x38\xa5\x8a\xf3\x6f\x3a\xe4\xe1\xfe\xba\xb4\xb9\x94\xf9\xd9\x06\x29\xf3\xca\xa1\xac\x37\x6b\x9e\x6a\xbf\x35\x2d\xa0\x09\x61\x20\xec\x54\x7c\x66\x3f\xcf\x6c\x30\xec\xed\x8a\xfd\x3c\xaf\x10\x0e\x48\x09\x87\xfc\xba\x22\xf8\x1c\xa6\xa1\x1c\x22\xe2\xb7\x02\xd7\x89\x5b\x51\x6b\xee\xbb\xad\xa3\xc0\x75\xad\x5e\xd5\x8c\xc0\x4d\x26\x04\xac\x8a\x10\xc4\x43\x00\x32\xdc\x23\x7b\x65\xc7\x27\xb4\x55\x72\x9d\x40\xd0\xe1\x21\x0f\x54\x2f\x6b\x15\xb7\x85\x6c\x2a\xb8\xf8\x3c\x70\x11\x8e\xfe\x86\xb0\x50\x24\x02\x4d\xdb\x00\x62\xbf\x33\x96\xb6\x3d\xd5\xe5\xdb\x73\xee\x42\x56\xf4\x43\xdc\x38\x99\xba\x24\x56\xac\xa6\xd5\x0f\xe9\x74\x3e\x09\x19\xf8\xc1\xf6\x41\x9a\x84\xb6\xbc\x8f\x97\x36\x05\xf9\x2c\x65\x43\x5f\x81\xb0\xc5\xb7\xce\x27\xe0\x22\xf2\xe7\xc2\x96\xb8\xa5\xfa\x20\x45\xc7\xa2\x5d\xa4\xdc\x62\x6a\xf7\x49\xdb\xc4\x2b\xbe\x94\x46\x04\x4a\xb8\xe2\x23\x27\x66\x2f\xeb\xb5\x6e\xaf\x74\x5d\xe2\xe2\xa7\x32\x9b\x40\xca\x5b\x58\x9a\x13\x5b\xb5\xd3\x5f\xaf\x76\x5d\x06\xa3\x57\xab\x24\x30\xbc\x5e\xf6\xfa\xeb\x15\xaf\x8b\x65\x32\xfd\x15\x42\x19\xd1\xdf\x78\xfe\xeb\xd5\xae\x89\x59\xb4\x4b\x31\x05\x67\x9b\xb7\x62\x62\x7f\x08\x3a\x56\x6d\xe9\xf4\x7e\x6a\x24\x5c\xd3\x72\x04\x83\xb5\xe7\xd6\xc4\xd5\x19\xcd\x77\xaa\xac\xc6\xca\xe9\x5c\x33\xfb\x44\x5d\xc7\x37\x8c\xb8\xe5\x67\x81\xc7\x57\xe3\x5b\x6d\x38\xea\xe2\xe2\x8c\x7e\xed\x6d\xbf\xc7\xc2\x23\xcc\x54\x20\x99\xe9\x47\x42\xf9\x60\xba\x0d\xe9\x93\xf4\xb1\x41\x44\xf4\xed\x5a\x8f\x44\xfc\xe9\xa2\x43\xc9\x34\x49\xfc\xd4\x6b\x69\x8e\x0b\xe3\x35\xf5\xc4\xd4\x44\x20\x22\xa6\xb7\x47\xd1\xef\x01\x6e\x93\xe8\xb7\xbd\xb0\x48\x9d\x75\xf7\xe1\x9a\x47\xf1\xdf\x68\xb1\x9d\xfa\x31\xcd\xb8\x2f\xdd\x5d\x52\xdc\x3a\x7d\xa6\x98\x9d\x0f\xa3\x0b\xdc\xaf\xad\x9d\x09\x01\x84\xaf\x4e\x15\x0f\x7d\xb0\xd3\x7f\xe1\xdd\xa8\x42\x20\xe9\xcb\x8b\x4a\x95\x50\x50\x31\x0d\x8e\x0d\xc3\xac\x12\x0f\x39\x23\xeb\x84\x54\x9d\x91\x15\x85\x24\x70\x46\xd6\xcd\x1f\x64\xa0\x3b\x3f\xaf\x9a\x2f\xd8\xc7\x3d\xb4\xe6\x72\x73\x7d\x10\x8a\x9e\x09\x05\xf4\x3f\xbd\xb8\x66\x09\x97\xb0\x87\xdf\xf9\xe0\x43\xb6\x43\xcd\x50\x2a\x42\x84\xfc\x10\xa6\xd6\xb0\xc1\x12\x05\xef\x1e\x59\xcb\xf4\x51\x71\x23\xd1\x6a\xc5\x29\x4c\x3f\x37\x3c\x28\xaf\x70\xab\x6c\x1f\xb7\x71\x8f\x14\xca\x4e\x68\x18\x21\x10\x0c\x53\xc3\x88\xac\x66\xe8\x9d\x0c\x07\xb3\x8a\xf8\x6d\xc5\x81\x6b\xbe\xb6\x87\xc3\x76\x1c\xda\xaf\xa0\x03\xd5\x0d\xa7\xb6\x28\xb0\xc2\xd4\x9f\x75\x75\xc6\x11\xbd\xb6\x0d\xa3\x6d\xc6\xca\x47\x03\x5a\x81\xba\x53\x77\xb0\x99\x53\x89\xfe\x86\x83\x70\x67\x38\xd9\xe9\x0f\x27\xe1\x0e\xd4\xbb\xe3\x0f\xe7\x71\x00\x6a\x06\x5e\xb8\xc3\xa3\xc1\x59\xef\x91\xb3\x5a\x21\xbb\x47\x0a\xca\x62\x75\xd6\x09\x07\x69\x8d\x21\x8f\x48\x8a\x22\xb8\x33\x08\xe1\x60\x8c\xb0\xd6\x15\x5c\x12\x97\x4f\x6d\x12\xae\x56\xab\x74\x65\xa3\x27\x4a\x7a\xba\x9b\x18\x53\x0b\x06\x76\xaf\x05\x03\xe3\x37\xc2\x54\x6e\x8f\x6f\x3c\xe8\xda\x57\x1e\xf5\x88\xa7\xd5\x7d\x4a\x82\x24\x51\x3e\x49\x5b\xd5\x43\x70\x72\x80\x56\xf7\xe6\xfd\x15\xbe\xbe\x42\x4e\x93\xdc\x8b\x90\x5b\x7a\x78\xbb\xac\xf3\xcc\xe6\xd3\x66\x90\x38\x31\xea\x15\xfb\xb2\x11\xae\xed\xfe\xca\x0a\xad\x87\x71\xc6\x0d\xf5\x46\x48\xb6\xbc\x80\x6c\xaf\x72\x28\x54\xc4\xb1\x49\x71\x9f\x0c\x7d\xa7\x79\x58\xbd\x19\x0a\x07\xc9\x37\x43\x21\x5e\x02\x73\x86\xbb\x2b\x93\x11\xb1\x49\x52\x02\xaa\x98\xfd\x5e\x5e\xc8\x28\x89\x58\x4e\x4c\xe5\x15\x96\xd7\x96\xef\x2b\x9b\xdf\xe8\x21\xd4\x8a\x0f\x35\x19\x01\x65\x34\x6c\xf3\x89\x50\x87\xfd\x58\xdf\x22\x72\x77\x65\xed\xfa\xe4\xec\xd2\xbc\xbb\xb2\x6e\xfe\x30\x59\x32\xc2\x79\x44\x6c\x8b\x42\xb0\x24\x46\x53\x1d\xb9\xe6\xc5\xcd\x97\x46\xab\x1d\xb8\xa6\xd7\x2a\xbb\xa9\x3f\x27\x1f\xac\x98\x76\x8f\x10\xc3\x1f\x6c\x7c\xaf\xab\x15\x02\x42\x7b\x2d\x08\x9b\x16\xc5\xe8\xe1\x4a\xdf\x5b\x30\x82\xa7\x36\x29\x14\x3c\x47\xf8\x94\x6e\x2d\x0f\x45\xe8\xc4\x9a\x90\xde\x49\xff\xe0\x61\x25\xe4\x43\xbe\xef\x25\x89\x84\x93\xa7\xb6\x61\xc8\x8c\x7b\xe5\xdf\xb8\xf8\xf1\x59\xaa\x3d\x4c\x7e\x90\x82\xbf\xba\x37\x1f\xae\x70\xe3\x91\x41\xcc\x03\x40\xcc\xee\x93\xd9\xc4\x5c\xb6\xdd\xb4\xee\x7b\xa4\xc4\x60\xe8\x80\xed\xe2\xb3\xf5\x78\x6c\x0c\xeb\xec\x3e\xa9\xfb\x67\x6a\x18\xa6\xe8\x03\x19\x77\x4d\x0f\x55\x3c\xbb\x2c\xd4\x7e\xa6\x2f\x6e\xab\x17\xb8\x95\x92\x2d\x7a\x56\xd9\x2b\xdb\x65\xe4\x8c\xbb\x60\x83\x2b\x7b\xe9\xf3\x60\x6e\x8d\xeb\xcc\x49\xa9\xda\x60\xd5\x88\xde\xdf\xf7\x08\xb5\xee\x7b\x6a\x22\xa8\x36\xb2\xa7\x36\xa1\xd6\x53\x5b\x0d\x93\x5a\x93\x1f\xe0\xfd\xa9\xb9\xc5\xf5\xd3\x03\x0f\xa7\xc9\xaa\xc7\xa2\x06\x5c\x10\xa5\xb1\x68\x0e\xab\xe9\x63\x8b\x58\x5b\xab\x0c\x24\xa6\x4a\x8e\xfa\x78\x90\xba\x99\x67\x95\x0a\x4f\xe8\x93\x1f\xe0\xe8\x4c\x55\xc4\xb1\x53\xfd\x51\x5c\xf6\xb2\x9c\x7a\x48\x52\x31\x49\xaa\xd6\xfb\x1e\x04\x8b\xd0\x4e\xec\xa7\x76\x85\xb6\x6a\xbe\x6b\xf3\xeb\x5d\xbf\xa2\x80\xc4\x17\xd2\x6a\x0e\x30\x7b\xe5\xdf\x84\xd7\x08\x53\x2f\xf9\x08\x25\x03\xdf\x45\x5b\x0a\xb6\x1e\x43\x97\x17\x56\xf3\x2c\x3b\x5f\x14\x5d\xfa\xcd\xcc\x2c\xa8\x1e\x1a\x91\x41\x4d\x49\x1f\x9b\x3e\x25\xe9\xe0\x35\x91\xdc\x2e\x5d\x43\x25\xea\xea\x68\xfa\xe2\x12\x55\x91\x61\xe8\x53\x4b\x61\x62\x44\x77\x10\xdf\x61\xd3\x51\xdc\xf5\xc3\x2d\xe4\x16\x2c\x73\x3a\x0f\x65\x7b\xaf\xac\x60\x8a\xf8\x1a\x10\xef\x95\x7f\xf3\xf1\xaf\x0e\x3c\x85\xbd\x82\x78\x70\x60\x43\xb5\xc6\xbe\xab\x82\x24\x6e\xe6\x49\x39\xa1\xb8\x6b\xa6\xde\xab\x4a\x2e\xaa\xe8\x6f\xb6\x7a\x81\x8b\x8c\x0b\x77\xaf\xec\x94\x3e\x93\xc0\x09\xf6\xf6\xd0\x63\x6c\x32\xfe\x07\x7b\x10\xa0\xdf\xd3\x43\x31\xee\x5e\x31\x14\xb3\x7b\x05\x91\x2c\x02\x9a\xef\x39\x90\x7f\x6e\xfb\x39\x07\xc5\x8f\x9e\x79\x28\x7c\xdf\x8d\x7c\x53\x48\x5e\xc7\x8f\x26\x42\xb2\xd8\xb7\x1c\x77\x84\x3b\x9e\x88\x88\xd9\xf6\xb5\x9c\xfe\x70\x30\xa3\xdd\xc1\xb4\x31\x0c\xd6\x1d\x0d\xea\xc7\xd2\xb7\x9a\x79\x0e\xc1\xe1\x70\x66\x24\x17\x32\x9e\xd3\xc3\x95\x7e\x00\xc1\xd5\xf0\xbd\x79\x71\x44\xf1\xc3\x95\x76\xa4\xd2\xfa\x06\x9d\x92\x22\x28\x1a\xca\xc0\xa0\xbb\x01\x11\xe1\x55\x4f\x03\x22\xa9\xdc\x80\x04\xb8\x4c\x08\x65\x18\x8b\xf1\x8f\xdf\x7d\xb7\x40\x46\x11\xe8\x41\xd1\xd6\x83\xe7\x62\xd3\x23\x94\xfb\x31\x90\xf5\x79\xaa\xbe\x12\x84\x72\x06\x7b\x0d\xf9\xf1\x0b\x84\x30\xc7\x11\x29\x94\x10\x62\x55\xfb\xbc\x6a\xd3\x54\x4d\xb3\x6a\x19\x4f\x59\x91\x5d\x10\x98\x92\x7d\x43\xc8\xd1\x06\x1d\x56\xc4\x07\x5b\x54\x8f\x43\x70\x05\xd6\x8d\xcc\x08\xcd\x26\xcf\xfc\x9a\x69\x0c\xd2\x67\x9f\xce\xfc\x8e\xd9\x06\x6c\xd4\x2e\x90\xfa\xa3\xd8\x76\x6d\x67\xb5\xba\x37\x69\x1d\x5f\x1c\x51\x86\xfa\x69\x9d\x13\x0b\x94\x47\x15\x75\x9a\xac\x5d\xf1\xc4\x86\xc4\xa8\x01\xfe\x33\x7e\xdc\x46\x4e\xd0\x10\x88\x86\x78\xdb\xf7\x53\x88\xb6\x1b\x8d\x72\x80\x50\xe2\x0b\x71\xca\xa9\xcd\x6e\x9d\x06\x72\xaf\x5b\x0f\x41\x92\x88\xd3\x04\xf6\xf9\x26\x0e\x96\x78\x32\x1a\x51\x79\x67\xad\xe3\x97\xba\x15\x66\xf6\x62\xde\x49\xa3\xa0\xc3\xa2\x82\x15\x39\x0d\x08\xb5\x4e\x05\x87\xb2\xcb\x5e\x76\xc5\xcb\x03\x7b\x79\x10\x2f\x47\x43\x42\xad\xa3\xa1\xc3\x5a\xb1\x1a\xd7\x19\xe6\x6f\xfd\xe0\xe1\xb7\x6b\x20\xb9\xa9\x4b\x10\x91\xd0\x23\x61\x51\x42\x22\x16\xb5\x03\x11\x7f\x2d\x90\x88\x86\x31\x53\x16\xab\xce\x36\xba\x57\x87\x2d\x59\x23\x79\x74\x8b\x67\x18\x05\xda\x5a\xbe\xb8\x26\x82\x6b\x87\x4b\xea\x30\x70\x91\x04\x4b\x45\x3a\x65\x1f\x0c\xcc\x00\x97\x70\x19\x19\x46\xe9\x6f\x2d\xa9\x8c\x4b\xc8\x5e\xcb\x54\xda\xcc\x54\x96\x60\xc7\x89\xe5\xc2\x61\x4f\xac\x45\xe8\x28\x94\xb3\x72\x78\x4f\x7f\x1d\x25\xf8\x75\x89\x11\x78\x49\x3a\xcb\x01\x23\x7d\x4e\x19\x92\xe2\xb3\xf7\x38\x90\x4f\x0f\xb1\x7c\xba\x1a\x02\x62\x4a\xad\xcf\xea\x6a\xf9\x2f\x29\xa1\xab\x7b\x33\xa8\x63\xaf\xae\x4d\x70\x58\x4f\x4f\x91\x1f\x3d\x93\xa2\xd6\x0c\xd4\xee\xbb\x91\x79\x20\x70\x05\xf2\x5a\x3e\x9c\xb7\x25\x84\xbd\x16\x7d\x66\x8f\x20\x72\x52\x46\x2d\x51\x1d\xbc\x97\x28\xa4\xcf\xd6\xc1\x31\x7d\x12\x80\xea\x95\x61\x44\x75\xd3\x47\x0e\x0a\x88\xef\xf0\xba\x02\x46\xf4\xf3\x00\x9c\x22\x63\xcd\xdf\xc8\xc8\x5a\x02\x8c\x15\x00\x8d\x15\x00\x2e\xb9\x70\x6d\x88\x74\x29\x55\x05\xf9\x61\x4e\xc9\xb7\xae\x09\xc8\x06\xb3\xe9\x84\x36\x7c\xfe\xc8\x6a\xf1\x31\x2d\x96\x35\xde\x57\x8d\xbe\x5d\x5f\x77\x89\xa7\xcf\x41\x28\xc6\xed\xb1\x47\x5e\x4f\x2a\x40\x0f\x57\x4d\x12\x00\x7e\x79\x83\x02\x83\x7d\x3f\x17\x62\x46\xeb\x92\x5a\x7e\x3c\x1c\x84\xd7\x74\xd0\x0e\x4d\x11\xe1\x77\x94\x77\x3e\xa9\xec\xc3\x7e\x7f\x38\x38\x1c\xf8\xe1\x74\x36\x9c\x1c\x71\xb0\x0a\x27\xab\x37\x31\xd6\x25\xb5\xa6\x33\x3a\x99\x69\xd9\xdf\x35\xad\xc7\xc1\xcf\xf2\x7f\x89\xa2\x69\x38\x7b\x1b\xdb\x5d\x52\x2b\x1c\x04\x99\x8e\x5c\x0d\xdf\xce\x9c\x56\x3b\x18\x6c\x48\xe1\x36\xc7\x3b\xa2\x93\xb0\x3a\x9c\x0f\x02\x3a\x79\x86\x0b\x8a\xa9\xc9\x4e\x96\x4a\x99\x10\xaf\xe2\x75\x5b\xbb\xbe\x6b\xdd\x7c\x3f\xbc\xfe\xfe\xcf\xf7\x2f\xff\xc0\x83\xbd\x9e\x7a\xdc\xa8\xd9\x7a\xf6\xe3\x46\x6d\x23\xb3\x48\x3b\x6e\xd4\x00\x99\x35\xad\xee\xf4\x68\x18\xc7\x74\x34\x0d\x83\xed\xe3\x69\x3d\x2c\x21\x04\xf9\xe9\xe2\x8d\x3c\x10\xdc\x69\xe5\xbc\xe4\x07\x33\xf6\x62\xf3\x47\x2f\xdd\xcb\x92\xc0\xa2\x97\xa6\xd7\xea\x1c\x32\x24\x46\x39\x60\xd0\xcb\x6c\xf8\x2e\x8b\x5f\x35\x1f\xc6\x31\xc0\xcf\x14\x64\x1d\x34\x08\x38\x34\x89\xc6\xd1\xca\x59\xac\xb7\x2b\xfb\x35\x17\x77\xc6\xe9\xe6\xef\x6c\xa0\x87\x4e\x1d\x07\x75\xe4\x74\x38\x32\xba\x5c\x43\x5e\x42\x75\x87\x53\xd2\xa0\x42\xd5\x61\x07\x03\xbd\xcc\xf0\xce\x52\x4d\x95\xb5\x97\x87\x9f\x30\x6d\x35\x97\x6e\x1e\x3a\xd3\x51\x57\xb7\xae\x39\x6b\xbe\x54\x82\x83\xe6\x23\xf1\x56\xf7\x66\x77\x0d\x8d\x3d\x6e\xa0\xb1\xef\x81\x6b\xf9\x93\x90\xce\x40\x12\x2d\xb6\x9c\xc3\x03\x05\x4b\xb4\xb6\xfb\x0c\xaa\x2d\x80\xbe\xe0\x14\xe1\x18\xc6\x30\x3c\xe8\x7c\xa1\xbc\x16\xbf\x50\xf8\x6f\x75\x02\x12\x30\x2e\xc3\x51\x7e\x34\x59\x7d\x02\x65\x86\xc8\x2f\x8a\xcb\xcc\x34\x32\x71\x88\x5e\x79\x6b\x81\xb8\x44\x5c\xad\x82\x24\x11\x1d\x60\x18\x0c\x39\xa2\x49\xe9\x77\xe3\xec\xc5\x35\x7b\xc7\x18\xd4\x8c\x66\x87\xf0\x0c\x38\x77\xa5\x90\x58\x93\x74\x05\x79\x13\xce\x24\x51\xb3\x85\xd0\xd9\x2b\x73\x4a\x67\xaf\xfc\xc6\xa9\xdd\xad\x4b\x20\x6a\x5d\x3e\xbb\x72\x59\x9a\x8f\x0c\xcc\xc2\x19\x3f\x0b\xc3\x19\x83\x39\x11\x62\x9a\x86\x0e\xa3\x21\x24\x49\xa3\x9f\xdf\xef\xd6\xf1\x9a\xd2\x42\x0f\x67\x7a\x5c\x06\xd6\x58\x97\x91\xf8\x24\xdb\x34\xc3\xeb\x4f\x9e\x6b\xfe\xbe\x53\xdc\xfd\x1d\x7f\x41\xec\x8c\x60\xc3\xdf\x63\x3c\x02\x62\xf3\x23\xe6\x64\xcf\x07\x87\xfe\x16\xc3\x1a\x83\xd9\x31\xd7\xdd\x35\x91\xe3\x11\xcf\xea\xcc\xfa\x31\x5b\x7b\x5e\x93\xf9\xef\xc9\xbf\x07\xc9\xbf\x27\xc9\xbf\x07\xa8\xf8\x7b\x1b\x4f\x43\xc4\x16\x49\x2a\x3a\x01\x38\x1b\x46\xe9\xb3\x97\xd1\x59\x0e\x67\x84\x07\x53\x76\xbc\xbf\x7d\x6b\x38\x9f\x85\x93\xb3\xef\xf5\xab\x37\xab\x54\x5e\x11\xa1\x1c\x90\xc5\x12\xae\x7c\xab\x3b\x18\x84\x13\xd6\x2b\x42\x2e\x8f\xa8\xe9\x6b\x27\x24\xd7\x53\x86\xd2\x8c\xed\x2d\x11\x22\xe8\x6d\x9f\x5c\xc9\x68\xfb\xbe\xc4\x17\xac\x63\xab\x6c\x4f\xf5\x38\xd4\x57\x92\xad\x48\x41\xd7\x83\xe3\xf1\x27\x77\x4d\xfc\x30\x8f\x90\xb4\x97\x79\x64\x2f\xb8\x47\xda\x6a\x36\x0b\x24\x4a\xe7\x01\xac\x5b\xe4\xdc\xf5\x18\xa9\x45\x19\xbd\xd4\x06\x7a\x09\x48\x28\xf5\x5e\x42\x36\xa3\xcd\x5a\xb7\x4b\xd7\x6c\xab\xc8\xa3\xbc\x9f\x11\x5a\x69\x70\xbd\x76\xb4\x09\x58\x4b\x12\xc5\x77\xf4\x38\xa4\xe2\xb2\xf4\x55\xcd\xdb\x57\x5c\x87\xc8\x97\xf5\x42\x2e\x08\xf9\xec\x31\x28\xe2\x19\xed\x06\xb2\xf4\xae\x28\xdd\x3b\x36\x73\x6b\x7f\x10\xdf\x77\x83\xb5\xda\x77\x83\xcd\x83\x33\x03\x5b\x19\xb0\x62\x68\x4f\x12\xe2\x72\x60\xa7\x81\x1a\x58\x69\xad\x72\xc6\x63\xbc\x5b\x3f\x69\xb7\xd7\xce\x50\xa9\x23\x86\xf6\x10\xac\x77\xbd\x77\x6c\x96\xf2\x86\x26\x87\xfe\xb0\x3e\xb4\x87\xe0\x97\x0e\xef\xd6\xe2\xd0\x35\x21\x0c\x7b\xe5\xe6\xc8\x3e\x3d\x42\xc5\xdb\xa3\x22\x3f\xbb\xf9\x3b\x1c\xb4\x29\x88\xf6\xea\x19\xd3\x53\x0a\x9c\x38\x08\x53\xfc\x24\x29\xf0\xdd\x20\x89\x78\x4d\x65\x84\x35\xa0\x0c\xbc\xf8\xbe\x5a\x37\xf2\x0a\x2a\xa1\x1d\xed\x85\x7b\x65\xdc\x13\x79\xda\x2e\x8e\x81\x2b\x88\x89\x5f\x37\x7b\x92\x94\x1f\xa0\x57\x1f\x44\xec\xf3\x50\xdc\x07\xc4\x8c\x7d\x48\x81\x1a\xa2\x7b\x47\xac\x04\x0f\x7f\x45\x38\x3c\x8f\x00\xbe\xd9\x99\xbc\xcb\xb9\x25\xd2\x96\x68\x1d\xce\x8b\x6e\x64\xc6\x8c\xba\xa7\x6a\x5d\xc4\x60\x7b\x48\x65\xa0\x2c\x43\x8c\x84\x15\x09\x6f\x22\xa8\x40\x8d\x6d\x9b\xd7\x59\x2c\x67\xc3\xa7\xa6\x95\xc0\x75\x9a\xea\x0a\x70\x2b\x9f\xc5\x2b\xe3\x70\x36\x5b\x4d\x23\x30\xbf\x6b\x5a\xbd\xe3\x5c\x46\x8a\x1d\x8c\x38\x20\xa0\x36\x58\x51\x60\x6a\xab\x23\x5c\x9e\x9e\x70\xda\xa5\x98\x85\x1d\x86\x0c\xb3\x84\x70\xea\xb1\x65\x01\xd9\x13\x6e\x13\xbf\x52\xb2\x43\x2e\xd1\x69\x1b\x46\xfb\x73\xe8\xb4\x8b\x24\x92\xee\xa3\x83\x56\x9b\xcb\xce\x60\xf0\x4a\x84\xa8\x43\x12\x5d\x83\x24\xf9\x8e\x61\x11\x19\xb9\xa3\x20\xa4\xd2\xb6\xdb\xc5\xb2\x18\xe6\x5e\x99\x90\x76\xa5\x64\xb7\x57\x61\xf6\x60\x71\x22\x86\xd1\x02\xe4\x84\xd6\x34\x9c\x1d\x0f\x02\xa0\x30\x4d\xbf\xb2\x18\x52\xfb\x68\x04\x8e\x9d\x43\x12\xb2\x33\x89\xc1\x95\xaa\x1c\xa2\xdd\x87\x76\xa8\xd1\x27\x97\x3c\xd2\xbf\xc8\x22\x79\xa5\x0a\x6d\x79\x81\x6b\xd3\x14\xcf\xaf\x7e\x46\x5a\xae\x8d\xbb\x3a\x12\x32\x9c\x4b\x4e\x97\xbe\x49\x6a\x76\x03\x77\x9d\xd0\x4c\xe9\xbd\x98\x8d\x98\x1d\xc6\x3f\xa1\x08\x1d\x19\xc7\x33\x45\x9d\x78\x1d\xd9\xd9\x0a\xf9\x66\x38\x79\x0d\x67\xe8\x74\x65\xbc\x41\x57\xc6\x9c\xae\x8c\x37\xe9\x4a\xd0\x2a\xf0\xf2\xc9\x41\x47\xc1\x9e\x98\x23\xf6\x5d\xdc\xa2\x30\x52\x52\xa4\xb2\xbc\x49\xa2\x51\x95\x6b\x04\x27\x1c\xa5\xd6\x84\x91\x80\x47\xc3\xf9\x60\x66\x18\xb9\x84\xb3\xea\x7e\x7f\xa3\xfb\x7d\xde\xfd\x3e\x74\x7f\x3b\x26\x3c\xef\x99\x8b\x09\xaa\xf4\x19\x51\x3c\x18\x64\xe4\x79\x42\x00\xfd\xbf\x66\x72\x32\xbc\x4c\x6e\x76\xc6\xfd\xe4\x33\x39\xfd\x7c\xaa\x3e\x8f\xb3\xf0\x2a\x94\xed\x90\x2a\x9d\x86\x87\x83\xe0\x78\x39\x63\x64\x55\xce\xdc\xe2\xbc\x65\xb3\xb7\x95\xfd\xcf\x84\x17\x20\x1b\x61\xe8\xf1\xb0\x67\x18\x85\x8b\x9e\xf9\x97\xf2\x90\x2a\xe8\x55\xa0\xfa\x31\xd0\xfb\xc8\xf9\x0f\xe5\x10\x0c\x96\x03\xc7\xe3\x72\xc0\x9f\x88\x22\xd8\xce\x60\x79\x1f\xe0\xf8\xc9\x11\x47\x38\x1e\x23\xc8\x28\x17\x4a\x40\xd5\x50\x86\xa7\x82\x84\x02\x1a\xfa\xd6\x35\x59\x92\x92\x53\xb0\x0a\xd9\x87\x62\xd9\xa1\xd2\xe2\x9b\x92\xe3\x5e\x85\x8d\xaf\x5f\x37\x41\x38\x83\xec\x2a\x4f\xe8\xa8\x84\x17\x9e\x10\xab\x04\xb8\x1e\x97\x6f\x39\xaa\x4b\x30\x31\xea\x7e\x3d\x36\x29\x4a\x12\x89\xb2\xb4\x19\x1f\x80\xb4\xed\xde\x1c\xd4\xf1\x2e\xdc\xb6\x0e\x04\x87\x71\xb2\xd8\xe4\x30\x76\x83\x4d\x5e\xe3\x41\x3d\x1d\x0d\x49\xe1\x2d\x6e\x63\x50\x77\x28\xab\x16\x56\xfe\x64\x21\x83\xcb\x2e\xc4\x4d\xea\x1a\x97\xb1\xab\x30\x51\x96\xe5\xa0\x0a\x47\x3d\xb0\x97\xa3\x21\x11\x82\x45\x9d\x19\x69\x5a\x5e\xee\x1d\xc0\x54\xa7\x46\x86\x29\x03\x09\x87\x92\xe9\x11\xd6\x3f\xc4\x9d\x22\x02\xbd\x26\x75\xfd\x00\x76\xe1\xdc\x67\xa0\x1b\x12\x0a\x90\xeb\xe4\x00\x6a\x44\x3c\x76\x0c\xe2\x1e\x09\x70\x4c\x42\x3c\x60\x73\x52\x26\x24\x12\x72\xf2\x36\x89\x24\x79\x32\x20\x85\x36\x8e\x48\x3b\x49\x22\x06\x80\x49\x12\xe1\x36\x29\x49\x47\xf5\x40\x86\x3b\x6d\xc3\x18\x49\xc6\x90\xbb\x9b\x8f\x08\xe9\x19\x46\x9b\x90\x18\x8d\x38\xff\x28\x2f\xea\x07\x2c\xaf\x60\x62\xa1\x5d\x5c\x26\xa4\x27\xda\xed\x11\xb3\x4d\x7a\xd0\x74\xec\xa2\x24\xe9\xf1\x26\x7b\x22\x36\x7e\xa1\x8d\x30\x1c\x94\x3d\x84\x23\x5e\xc9\x00\xe1\xd8\x30\x22\xc9\x76\xc5\x08\x8f\x32\x27\xe8\x62\x08\x67\x67\x2c\x77\xe6\x88\xed\x4a\x0f\x21\x27\x86\xcd\xe0\xc4\x6c\x09\x7d\x27\xe6\x3b\x29\x66\xcb\x16\x3a\x1e\x89\xc5\x8e\xd1\x60\xbe\x5d\x37\xe5\xfd\x86\x0e\xf9\x99\xe4\x14\xfe\x33\xc9\x62\x17\xe8\x69\x0e\x5f\x46\xe2\xa5\xfc\xc5\x06\x6f\x2a\xbe\x0c\x39\xf1\x8d\x80\x0e\x7d\x5b\xc2\x96\xe1\x46\x54\x39\x71\x7f\xb4\x45\xd4\xa6\x45\x81\xde\x0d\x2a\xe2\xd7\x96\xa7\xa8\xaa\x84\x01\xd7\xcf\x2e\x1c\x34\x8e\x41\x95\x03\x02\x6d\xab\x38\x4e\x6b\xfc\x21\x90\x77\x31\xb6\x3c\xe4\x55\x25\x0c\x8e\x59\x1d\xb9\x57\x6a\x3b\x62\x6b\xb1\x0c\x5b\x44\xf1\xd4\xf2\xfc\x54\x0f\xd6\x07\x47\x5d\xaa\xf2\x6f\x35\x73\x28\xa4\xdd\xb6\x4f\x48\xbf\x43\x2b\x8c\xab\xb7\x82\x7d\x13\x61\xd3\xab\xdc\x76\xed\x66\x17\x99\x7e\xde\x4d\x29\x34\xad\x4b\xd5\xa1\xd5\x15\x8f\x0a\x0e\x46\x10\x3f\x95\xe0\xc9\x7e\x70\xc2\x1e\xf8\xa9\x5c\xd2\x4a\xf5\xf7\x74\xc1\x27\xe3\xff\x46\x24\xbf\x4e\xa4\xa9\xee\x30\x2a\x4d\xcc\x2c\xa3\xa1\x36\x68\x35\x21\x28\x59\x04\xd4\x44\x95\x02\xb5\x85\x1c\x4c\x47\x99\xff\x97\x64\x9c\xba\xf7\x29\x94\x75\x8a\x8e\x5f\x5d\xbe\x52\x02\x87\xb2\x93\x9e\xc2\x83\xba\xe3\xb1\x0d\x46\x1d\x4f\xe0\xfc\x4d\x29\x7b\x9d\x0b\x23\xb8\x98\x9d\x5b\x87\xfb\x92\x70\x0f\x3e\x7b\xdc\xc2\x5f\x17\xcd\x19\x86\x07\x36\xf5\xfc\x5a\xb2\xe5\xb9\x88\x92\x10\x7b\xa4\xa4\x64\x6a\xa3\x18\x0c\xf4\xa4\x42\x61\x49\x94\x16\x17\x90\x01\x2f\xad\x6e\x1f\x7d\x12\xe2\x20\x5b\xda\xc7\x8a\x79\x48\xfb\x5c\xfa\x6c\x4e\x42\x0a\x35\x27\x89\xb7\x17\xe8\xd4\xc8\x08\xce\xc6\x76\xd7\x1c\xd5\x91\x33\x02\x4a\xea\x78\x01\x6a\x88\x32\xc7\x58\x3f\x64\xc3\xa8\x68\x52\x96\xa3\x58\x44\x20\x11\x3e\xf8\xa8\xd7\x36\x81\xbc\xdf\x67\x6b\x57\xe8\x3f\x08\x4d\x92\x9b\x9e\x14\x0e\x8c\xc6\xa4\x71\x24\x15\x0a\x7d\x4d\x97\xa8\xe6\x49\x7f\x31\xd6\x58\x4b\x7e\x99\x0b\x43\x7f\x41\x38\x0f\x04\xd5\x2c\x96\xf7\x5e\xfc\x2e\x75\xb5\xa4\x8b\x4f\x6c\xa9\xef\xcd\x49\x1d\x7f\x9f\x21\x67\x02\x23\xbb\x99\x52\x32\xaa\x5b\xb7\x9e\x38\xf6\x1a\x47\x94\x17\x51\x03\xf8\x22\x05\x4c\xc2\x2c\x83\x0a\x9b\x8c\xb2\x2d\xd7\xbf\xd2\x3e\xb1\xc7\x27\xdc\x5a\x62\x3f\x4d\xed\x9e\xda\xed\x4b\x9e\xfa\x21\x4d\x7d\x1e\x53\x3b\x9a\x51\x9e\xfe\x67\x9a\xfe\x75\x6a\x3f\x56\x45\x72\xf9\x63\x9a\xfe\x38\xa5\x76\x57\x7e\x38\xd0\xaa\xbf\x6c\xdb\x57\x35\x9e\xfc\x51\xab\xbf\x7d\x6e\x1f\x1d\xaf\x94\xde\xdc\xb9\x30\x21\x65\xa4\xf8\x70\x10\x0e\xc0\x7c\x76\x16\xbe\x47\xce\xaa\x49\x60\x0a\x9c\xda\x32\xf7\x56\x47\xac\x85\x44\xc1\x5d\x9f\x8c\x05\x1a\xb8\x99\x52\x24\xf4\x34\xbc\xe5\xe6\xf5\xeb\x7d\x20\x36\xec\x7d\x60\x3d\x0c\x0c\xc3\x0c\xc4\x2d\x00\xbc\x63\x51\x1b\xc2\x61\x26\x99\x0a\x14\xa7\x60\x80\x02\x4a\xda\x86\x9d\xc7\xec\xeb\xcd\x2c\xcf\x3e\x9d\x7f\xe7\xb8\xff\x87\x75\x33\x93\xca\xbd\x63\x04\x61\x1c\xe1\x12\xfb\xcf\xad\x05\x59\x7e\xc0\x86\x33\x7f\x43\x36\xf7\x32\x97\xb3\xf1\x32\x07\x9c\x70\xbb\x90\x6a\xf5\x7a\x15\x2f\x73\x0d\xfe\xa7\xf5\xd4\x81\x8f\x72\x9b\xb6\xd3\x37\xaf\x46\x5c\x59\xd8\x63\x3c\x1a\x9b\x32\x6a\x75\x7d\xfe\x6c\x3d\x55\x4d\xf6\x86\xf8\x6b\x61\xbd\x14\x4b\x24\x9e\x33\x61\xcc\xd7\xf9\x21\xdb\x58\x70\x46\x34\xad\x76\x38\xfb\x0a\xe2\xe1\x6d\xb3\x76\xcf\xc5\x6b\xe7\x87\xeb\x46\xdb\xeb\x0b\x57\x20\x34\x35\xbb\xae\x87\xb3\xce\x90\xab\x5a\x4e\xe7\xa3\xd1\x70\x32\x0b\x83\xf7\x48\x6f\x7f\x26\xaf\xca\x9b\x56\x77\xeb\x92\xfd\x00\x8a\x61\x63\x52\xc7\x7c\xab\xfe\x10\x5e\x5a\x58\xa6\xa3\x4d\xa0\x3a\x7f\x11\xcb\x72\xfe\xb2\x79\x55\x23\x30\x85\xea\xf1\xf1\x91\x74\xc3\x25\x14\xb7\x18\x51\x4b\x2b\x14\x82\x65\xf0\x0f\xd8\xe3\xfa\x97\x82\x59\xfd\x01\x9a\x2e\xd2\xa1\x8b\x00\x17\x47\xcd\x4a\x41\x02\x6a\x4d\x5c\x0a\x59\x27\x9e\x38\x5a\xeb\x1b\x06\xf0\x79\xbd\x61\xab\x2f\x26\xf7\xa1\x63\x2a\x8d\x4a\x86\x92\x4a\x8e\x76\x99\x23\x90\xa3\xc8\xca\x7b\x45\x40\x50\x25\xb0\xe6\x0d\x67\x01\xe1\xed\x38\x52\x25\xa0\x3b\xa9\xd3\x3d\x7d\xe7\x4b\x57\x7b\xb3\xe1\x4e\xc0\x9d\xa0\xc2\xee\x67\x94\x57\x27\x47\x9d\xa8\xc4\xbe\x1c\x47\x9b\x2b\x30\xe6\x3b\xf2\xc4\xdb\x58\x41\x86\xa3\x4b\xce\x4c\x88\x74\xf5\x82\x05\x6a\xd5\x00\xc0\xa9\x09\xc0\x0c\xdd\x84\x65\x3c\x0b\x33\xd5\xe4\x94\x95\x45\xcf\x42\x90\xed\x88\x9d\x25\x66\xe6\x65\x6e\xf5\x7d\x79\x78\xc0\x19\xb1\xda\x50\xcc\x14\xdf\x44\x09\x56\x4d\x5a\x89\xdc\xc5\xd6\x83\xa9\xe2\x7c\x88\x24\x94\x3b\x12\xca\x72\xae\x90\x53\x10\xeb\x26\x6a\x1d\x1b\x46\x2f\x5e\x87\x17\x75\xf6\xe8\xf0\xad\x1d\x51\xdc\x4b\x14\xdb\x3d\xd5\x54\x99\x25\xc5\x18\x73\xfd\x74\xa5\xd6\x32\x5e\x35\xad\x05\xcd\x8b\xec\xda\x7b\x96\xb8\x6d\xd0\x36\xb9\x72\xc5\xbb\xa6\xd5\x7b\xde\x90\xda\x80\x14\x96\x4d\x85\xe9\x27\x49\x41\x02\xe8\x3a\x84\x96\xfe\xf6\x92\xc4\xfb\x5b\x55\x98\x62\x80\xa3\x4e\x37\xd6\xcf\x90\xee\x20\x08\x97\x3b\xc3\xf9\x6c\x67\x18\x09\xef\x04\xef\xa5\x0c\x6b\x20\xa7\x46\x51\xef\x0f\x10\x29\x42\x8e\x5e\xd8\xab\xd3\xd6\xf5\xd2\x95\x82\x2d\x15\x50\xb0\x35\x39\x74\x4d\x55\x53\x2b\x70\x09\x75\xc2\x47\x31\xc1\x01\x96\x46\xfb\xf2\xe8\x60\xe7\x06\x2f\x82\x29\x72\x00\xd5\x72\x1a\xc3\xd7\xca\x60\x8f\xa1\x4c\x05\x08\x00\x55\x7a\xe3\x15\xa9\x53\x79\x4f\x4d\x84\x79\x44\x2f\x80\x58\xec\x0b\xa2\x4c\xa0\x0a\x64\xfb\x82\xf0\xd4\xf0\x8a\xbc\xd1\x7b\x8a\x4c\xaf\x58\x46\x98\x32\x54\x95\x56\xe7\x55\x3c\x6b\x6c\x8b\xe2\xaa\x7d\xb5\x2f\xc6\xf0\xa7\xf5\x18\xba\x86\xc1\x68\x42\xfe\x2c\xf4\xd6\x04\x92\x69\x5a\xf7\x6f\x1d\x83\xef\x9a\x56\x27\xb3\x91\xb9\xef\x0f\x41\x56\x49\x50\x1f\x8d\xc9\x5d\x2c\x51\x93\x90\x79\xaf\xa3\xbe\xb5\x63\x6c\x04\x67\xec\xe8\xe9\x57\xf0\x9b\x6c\x03\x50\xc4\xa0\xbd\xb5\xbb\x82\x25\x1b\x07\xad\x0b\xd7\x06\x54\xf3\x54\xcd\xad\x9f\x81\x51\xd6\xc6\xe6\x61\xe0\x50\x62\x42\x34\x21\xaf\xe2\xb5\xa8\x2b\x15\xc3\xf9\xea\x48\x99\x92\xe6\x82\x6d\x07\x7a\xf3\x14\x6d\x27\x12\xd2\xee\x50\xb1\xc8\x82\x44\x50\x9b\x71\xa6\xee\x6e\xa8\x35\x0e\x0c\xe3\xc1\x64\xbf\x90\xa2\xf9\xc8\xab\x67\x54\x9e\x78\x4e\xaf\xf2\xad\x2b\x32\x23\x7b\xaf\xcc\xb8\x71\x2e\x7d\x84\xcd\xb4\x79\x88\x51\xc9\x5b\x0e\xbb\x26\x45\x15\x6a\xcb\xcd\x20\xf8\xa2\xa7\xaa\xc9\xe3\xcf\x50\x8d\xa4\x7a\x18\x60\x46\x49\xe9\x3b\x04\x7b\x60\xae\xc6\xf0\x1d\xa6\x02\x41\x51\x6b\x8c\x10\x86\xfd\xc1\x41\x71\x05\xde\x61\xd7\x37\xb8\x70\xdb\xd8\x1d\xec\xf0\x5b\xe6\x74\xc7\xbf\xd7\xdd\x92\xaa\x71\x7f\x95\xa4\xb1\x52\xf3\x05\x37\x54\x6c\x2f\x94\x10\x27\x49\x1a\x7e\x66\xf6\x53\x27\x78\xd2\x0b\x15\x9b\xaa\x52\x81\xa4\x60\xe1\x20\xaf\x75\xe4\x9a\x5f\xe5\x45\xb0\x26\xe7\xf3\xb4\xb6\x9f\xea\xca\x2b\xdc\xf7\x65\x1a\x3e\x96\xbd\x80\x27\xbc\x8b\x40\xdd\x6a\xc0\x84\xb2\x4d\x7f\xe5\xb9\xe6\xef\xff\xbe\x29\xfe\xde\x46\x49\xa2\xbb\xc2\xfc\x26\x07\xd2\xf7\x38\x2d\xa5\xbe\x2c\xd7\x96\x96\xd5\x5f\x81\xbf\xad\x6b\xdf\x35\x3d\x64\xef\x76\xcd\x27\xa9\xdb\xa6\x8a\x3d\x8b\x62\x5a\x7e\x8b\x06\x01\xcb\x2f\x6a\x4c\x12\x68\x0b\x3a\x5a\x34\x4b\x9f\xe1\xa1\x75\xe1\x56\xa6\x61\xd1\xb3\x3d\xa4\x55\xf6\xa2\x91\x90\x30\xd8\x07\xd3\x4b\x0f\x27\x0f\xbd\x8a\xd6\x56\x42\x89\x83\x83\xd1\xeb\xca\x79\x10\x3d\xd3\x57\xc0\x6f\x51\x97\x14\x4a\x2b\xe4\x64\x6a\xc9\x7c\x81\x9e\x7d\x41\xd9\x70\x59\x3e\xda\xde\xe1\xc0\x0e\xb2\x3e\xe6\x0e\xd7\xbb\xcc\xa7\xec\x9b\x07\xee\x3c\x61\xab\x8a\x79\x30\x0c\xa8\xf6\xa6\x9b\xd3\x57\x39\xe9\x05\xe2\xad\x90\x8c\x2a\xa3\x4d\x4c\x35\x33\xcb\xeb\xb3\x72\x28\x67\xc5\xfe\x59\x0b\x85\xdd\xae\xe9\x81\x36\x52\x4e\x23\x47\xe9\xed\x6d\x45\x4c\xb4\x2d\xab\x4e\xc1\xb1\xa6\x72\xe9\xac\xee\xee\x48\x19\x57\x00\x80\x77\xe8\x20\x88\x43\x46\xcf\x09\x5e\xf7\x74\x9f\xf8\x49\xc2\x58\x89\xf3\xd8\xec\x52\x2c\xff\x97\xf4\x6b\xa4\x93\x85\xa7\x19\x9e\xc3\x59\xcc\x52\xc5\x76\xeb\x14\x39\x57\xc2\xd7\xcc\xed\xb3\x8b\x5b\xfe\x25\x3e\x9d\x0a\x63\x88\xc3\x5d\x5c\x28\xf3\x83\x71\x75\x6f\xd6\x38\xfb\xcb\xd6\xf5\xb8\x4e\x0e\x7b\x49\x52\xed\x19\xc6\x79\xcf\x7c\x5f\xb6\xfe\xb2\x0e\xde\x23\xa7\x49\x6a\xc0\x18\xfe\x18\x99\x4d\x5c\x42\xce\xad\xf8\x7d\x12\xbf\x4b\xf1\xdb\xb4\x8e\xe7\xa0\x53\x1c\xc7\xf0\x73\xc4\xdf\xa2\x29\xfc\xcc\xda\x8c\x2a\x6c\x5a\xdd\x31\xe3\xe0\x9b\xd6\x94\x52\x48\x5f\x7e\xe1\xea\xc8\x7d\xca\xd3\x3b\xcf\xfc\x77\x32\xdf\xa4\x39\x3b\xcf\xfc\x44\x99\x6d\x55\x1d\x3c\xd5\xd6\xe0\x44\x82\x03\x9b\x56\x2f\x77\x5a\x57\x4d\xeb\x8a\x6e\xb6\x33\x6b\xb3\x76\xd6\x09\xc8\x5a\x96\x44\x73\xbe\xfe\xc2\x04\x8b\x95\xe2\xd4\xe9\x71\x5d\xd2\x42\x91\x35\x09\xe3\x90\x4e\xc3\x23\x3a\x9a\xcd\x27\x8c\x16\x95\xb0\xc1\x4d\x75\x74\xf0\x90\x5c\xaa\x77\xae\xf7\xc6\xef\xca\x93\x1c\x49\xc2\x2a\x3d\xd4\xc1\x3d\xe8\xe6\xf1\xfd\xae\x69\x1d\xee\xe6\x58\x51\xd0\xd6\x99\x4b\xc8\xe9\x34\xf5\x99\x39\x6b\x0b\x92\xa6\x3b\x4e\x12\x46\xa1\x1c\xcd\xb8\xeb\xad\xee\xb4\x15\x8d\x5d\xb3\x3e\xa3\x02\xbb\x9c\xd6\xa5\x99\xab\x20\x32\xa6\x14\x82\xfb\xa9\xac\x6c\xda\xcf\xea\xe6\x21\xb7\xed\xc2\xb4\x55\x0b\x5c\x4c\x5b\xc7\xec\x2f\x42\xc2\x37\xd2\x98\x14\x4a\x98\xb6\x42\xf0\x78\x0d\xf8\x80\xf7\x5d\xaa\xd4\xf1\x0f\xda\xf1\x3f\x8e\xb0\x4f\xbc\x56\x1b\x3c\x41\x15\x8e\xeb\x6a\xa2\x4d\x0f\xb7\xee\x0f\x29\xfe\x7a\x26\x56\x63\x58\xc7\x01\xca\x7c\xbe\x3b\xa4\xf8\x9b\xfc\xdc\xbb\x66\x9f\x8f\xeb\x15\xd3\xb7\xa6\xe1\x4c\x2e\x48\x41\x68\xc1\x40\x19\x1f\x1f\x3d\x51\x99\x5d\x12\x6e\x50\x59\x6c\x7a\x08\x5f\xd5\xd4\x37\xe7\xb0\x27\xf9\xba\xbe\xe4\xf0\x78\xab\xc7\x33\x8a\x9f\x67\x52\xe9\x71\xa0\x7f\x94\x49\x98\x0a\xfb\xb7\xdd\x3e\x18\x85\xfd\x18\x69\x3b\xfa\x78\x4e\x60\xea\x60\xff\xa5\xc9\x71\x4c\x60\x2e\x61\x3b\x8a\x09\x3e\xf7\x5c\xd8\x95\xe2\xf5\x92\xbd\x72\x6b\xe1\xa3\x39\x11\x1b\xa9\xd2\x13\x07\x2a\x80\x8a\x2d\x9f\x5a\x37\x81\x38\x88\xa3\x29\x51\x89\xf7\xbe\x48\x7c\x2c\x91\xe3\xd8\xbc\x91\x6a\x9c\x91\x64\x3d\x97\x5f\xc8\xa2\x6b\x22\x30\x33\xec\xe5\xa8\xe0\xff\xca\x06\x90\xa4\x5e\x77\x8c\x04\x50\x29\xd0\x28\x8b\x95\xbf\x96\x44\x80\x18\x0c\xc2\x3e\xb9\xc9\xa4\x45\x62\xcb\xe9\x90\x37\x3d\xc9\x81\x3c\x40\xce\x9a\x75\x93\x82\x6a\x0d\x81\x9c\xd6\xb3\x5b\xc4\xf1\x08\xf1\x2f\x93\xc4\x23\xe4\xfe\x90\x56\x68\xeb\xd2\x67\xe4\xcd\x37\xda\x3a\xf3\xdc\x56\x89\xd5\x7d\x33\x76\x91\xed\x15\xc8\xdd\x21\x35\x0c\xaf\x40\x9a\x87\x34\x49\xd2\x8c\x96\xf0\x6d\xff\x7d\x38\xf7\x3b\xe1\x34\x2d\xc3\xc8\xc1\x61\x3d\x97\xf4\x9d\xb5\xe5\x7c\x68\x3e\xab\xac\xce\xb3\x98\x4a\xef\xdc\x44\xdc\x64\xe9\x37\x13\x46\xc8\x3d\x55\x31\x48\x01\x6d\xc2\x63\x99\x72\x1c\xb8\x0a\xa2\xd6\x20\xe9\x97\x20\x48\xe1\x06\xb6\x40\x9a\x4f\xb8\xe3\xb9\x6a\x11\x0b\xf1\x7a\x1c\xa7\x4d\x76\x23\x33\xf8\x2d\x28\x86\xbf\x85\x7f\xff\xef\xd0\x03\x47\x37\xf0\x3e\xe8\x09\xec\xd4\xbb\x4e\x3d\x56\xac\x56\x3e\xf9\x2e\x81\x01\xdc\x1a\x78\xc4\xb7\x96\x8e\x4f\x7c\xeb\x59\xc2\x92\xb0\x48\xd1\x1a\x3e\xae\x6d\x85\x0e\xc3\x30\x7f\x28\xb2\x13\x92\x24\x8a\x62\x90\x9e\x52\x37\xdf\xa5\x98\x5f\xce\x0b\xdf\x23\x94\x6f\x10\xaf\x48\x02\x70\x9b\xf4\x58\x62\xbd\x61\x6f\xcf\xfc\xed\xd9\x61\x3f\x04\x2e\x70\xe7\x45\xe2\x39\xd4\x8a\xa6\x45\xe2\x3b\x1c\xd2\x29\x66\xe9\x8c\xe0\xbf\x11\x6f\x51\x6a\x2c\xc2\x7a\x7f\xd9\xe3\x64\x4a\x93\x21\x8c\x1c\xb4\xae\x66\x03\x4c\x8d\x7f\x8c\xa4\x67\x3e\xb9\xf6\xe2\x15\xd6\x5e\x1f\xa8\xb5\xc4\xe0\xde\x28\xdd\x09\x3f\xf4\x8b\x0c\x6a\x9d\x2c\xb9\x45\x00\xd5\x27\xb2\x77\xc2\xca\xc2\x2c\x7a\x30\x8b\xd2\x9a\x5b\xd5\x72\x2d\xc9\x6a\x79\x69\x76\xba\x8f\x03\x12\x51\xd3\x6f\x9d\xba\x88\xbb\xc1\x65\x8f\xd8\xe7\x89\x13\x17\x55\x4a\x36\xfb\x55\xce\xb4\x20\x20\x0a\xbf\xd4\x0b\x2a\x41\xd1\xb7\x03\x8a\x79\xb4\x14\x95\x68\xef\x05\xac\x11\xdd\x19\xca\xcd\xd6\x86\xad\xd9\x70\x24\x5b\x66\xcf\xb2\xe9\x43\xd1\xf4\xe1\x7f\xd7\x74\xd3\x3a\x59\xe6\x49\x68\xb2\xbb\xf6\x7b\x8a\x81\x5b\x4b\x17\xd3\xe2\x0f\x64\x3f\x6c\xa6\x39\x5a\x02\xf8\xa8\xf6\x8a\x3f\xb4\xb5\x39\xd3\x2c\xe3\x70\x84\xdb\xe8\x75\x39\xd3\xdd\x48\xcb\x3d\xef\xa7\xfb\x5d\x9e\x87\x7e\x9f\x92\xd0\x79\x90\x2a\xb6\x5d\x33\x42\x95\xc8\xf6\x00\xea\x38\xee\x19\x8e\x88\xdf\x35\xdb\xa8\xd2\xb6\x3d\x2b\x12\xd6\xdd\x83\x7f\x40\x15\xfd\xac\x8e\x97\x33\xfd\xaa\x2c\xff\x6a\x67\x4c\xa8\x43\xc9\x61\xaf\x32\x99\xda\x57\x35\xa1\xc4\xdb\xa7\xe4\x4a\xea\xc6\xe0\xc3\x5e\x65\x3c\xb5\x2f\xdb\x7c\x23\x16\x0e\xa5\x87\x9c\x28\x93\x8b\xa6\x9f\x57\xf7\xe6\x39\x27\x5b\xcf\x46\xe6\x39\x23\x4e\x73\xec\x0d\x18\x58\x1e\xce\x00\xed\x22\xc7\xf7\xd8\x56\x01\x32\x67\x3c\x65\x18\x99\x3d\x5d\xb6\x59\xbb\x13\xfd\xc8\x00\xae\x09\x6a\xcc\xd2\x7e\xe7\x6b\xb4\xdf\x37\xd1\xad\xb0\x4f\xd3\x17\xf0\x17\xae\x4b\x0f\xc7\xba\xbd\xa3\xe4\x1c\xeb\x69\x38\x0b\x31\xce\xf3\x01\x25\x85\x82\x60\x01\x76\xab\x9c\xe0\xbb\x37\x2f\xea\x78\x52\x67\xe4\xf7\x85\x50\x46\x19\xdf\x49\x25\x93\x30\xe4\x44\xf2\x51\xac\x52\x1e\xe5\x53\x67\x28\x9f\x6e\xff\xe1\xb9\xfc\x3c\x79\x51\x3c\x06\x52\xfa\x2e\xcf\xdc\x93\x1f\xaf\xf1\x86\x80\xfe\x82\xcd\xc2\x63\x3a\x0b\x9a\x3e\x3b\x08\xb7\x48\x4d\x10\xa5\x3e\x35\x11\x52\x0e\xcc\x04\xc3\xea\xcc\x63\x13\x5c\xff\x3a\x9d\x3e\x7b\x28\x23\xe7\x56\x60\x1d\xe4\x34\xe5\x93\x36\x65\xb7\xfc\xee\x15\xa4\x95\xe7\x8c\x62\x2a\x50\x2b\x7c\x94\xca\x2a\x1e\xa1\x56\x97\x9a\xc8\x7a\x34\x27\xa7\xf8\x35\x9a\xd0\x7e\xe8\x0d\x27\x41\x38\xb1\x4b\x78\x3a\x7b\x8e\x43\xfb\x65\x42\xf1\x74\xe2\xdb\xcd\x05\x5d\x81\x36\xff\x23\xf1\x80\x9b\xb5\xc2\x47\x4c\xa1\x97\xc5\x0e\x5b\x34\xd6\x21\x96\xc6\xfa\xd4\x16\xcf\x25\xb4\xa2\xd6\x51\x9c\x24\x26\xfb\x49\x1b\xfb\xaa\x97\xc4\x50\xf2\x08\x82\x26\xe8\x18\xa7\x29\xae\x8d\xad\xce\x10\x2a\xe8\x0c\x45\x05\x70\xad\xf1\x6d\x2a\x0a\x76\x86\xac\x20\x66\x13\x03\xcf\x25\x84\xab\x14\x9e\x85\x63\x7a\x86\x4a\x7a\x94\x6e\xc8\xb1\x61\x69\xd7\x85\xf6\x29\x03\x5b\xa0\xc2\xce\x95\x90\x45\x94\x23\xc1\x87\x85\x3c\x8e\x74\x34\x41\xb7\x2f\x9e\x5a\x60\x9a\xbb\x62\x6c\xf6\x54\x96\x42\x19\x6d\xb9\x16\x08\x1f\x0d\xa3\x2b\x64\x8e\xe1\x23\x96\x25\x90\x23\x13\x8f\x62\x2d\x11\x7a\x78\xe2\xa5\xb0\xf6\x28\x72\x75\x86\x5a\x2e\xbe\xcb\xee\x60\xaf\x9f\x8b\x8e\xc2\x32\x81\xa1\xb2\xc0\x61\xbe\x89\x24\x91\x3d\xbe\xc3\x63\x41\x29\x7e\x65\x5c\xf5\xa5\x10\xed\x43\xaf\xdf\x6d\x5c\x43\xb0\x7c\xd7\x52\xf1\xb2\xd5\x78\xe6\x96\x31\x4f\x12\x25\xdd\x89\x6e\x9e\x85\x69\x37\x7b\x6a\x84\xe9\xf3\x51\x9c\x3e\x77\x86\x68\xe5\x5c\x6c\xe8\x3a\x08\x89\x57\x18\x4a\x01\xed\xd1\x52\x9c\x14\x47\xcb\x56\x73\xac\xac\x52\xc2\x23\x91\x1c\x1e\xe9\xc9\x3d\x99\xbb\x97\xc9\x7d\x5e\x15\xc9\xe7\x55\x3d\xb9\xe6\x19\x86\x1c\x39\x45\x98\x8a\xbb\xd1\x7d\xa9\xf3\x5c\xab\x71\x1b\xbd\x54\xe5\x37\x15\xdf\x00\x3f\xfd\x52\x03\xa0\x7e\xa9\x81\xf4\x5e\x8f\x41\xd2\x05\x39\x39\xf1\xad\xbb\xc8\xf4\x53\x49\x32\x28\x21\x04\x9f\xb9\xf5\x85\xd4\x57\x0f\xb9\xe5\x45\x08\x72\xee\x24\x69\x5c\x99\x21\xbe\x69\x33\x6e\xb6\xce\x1f\x61\x3f\xb0\x66\x5a\x47\xae\x19\x32\xa2\x4b\xea\x31\xb0\x44\x2e\x3d\xe4\x15\x43\x26\x51\x37\x3c\x07\x2e\xc4\xb3\x9f\xd7\xd8\xb6\x7f\xa9\x71\x94\xca\x88\xec\xab\x2f\x1b\x8e\x6f\xc4\x42\x1f\x2d\xa5\xa9\x55\x6f\x29\x5d\x27\x87\x47\x44\xb8\x2a\x3a\xaf\x12\xb0\x06\xf8\xb1\x9f\x67\x8a\xc0\x8e\x8e\xd3\x1a\x42\xaf\xd2\x5e\x9b\xa1\xf1\x2c\x34\xb6\xc6\x9e\x2b\xb4\xef\x29\x7a\x5d\xc1\xc7\xc3\x7b\x75\xb9\xa1\xae\xa3\x74\x70\x85\xc2\xdf\xaa\x26\xc2\x97\x22\x1c\xc9\xe1\x3d\x72\xee\x24\xa9\x56\x10\x8e\x41\x5a\xbd\x67\x75\x4b\xc2\x4e\x06\xa1\x05\xa1\x40\x28\x3c\xaa\x98\x5f\x66\x12\xae\xb0\xe0\x87\xac\xe8\x9b\x12\x53\x48\xe0\x6a\x7d\x7d\x51\x50\x72\xb4\xe4\x6f\x02\x28\xa2\x6f\xc0\xdf\xbd\x6b\x5a\xb5\xda\xb6\x29\x38\xa9\xc9\x9b\x4c\x18\xc5\xc2\x7b\x6b\x18\xaa\xbb\x65\x27\x0b\xc3\xe7\xd5\xb4\xbb\xbd\xb4\xbb\xe7\x5f\xd6\xba\x7b\x5e\xd5\xbb\xdb\xcb\x76\xf7\xfc\x0b\x9b\x11\x1b\x16\x44\x3b\xa6\xba\xfc\x9c\xa2\x0a\x34\x19\x8f\xa4\xd6\x27\x49\xb4\xb0\x21\xbb\x55\xc1\x64\xec\x56\xc1\x4f\x87\x7e\x3a\x73\xf3\x84\x9d\xd9\xca\xf4\xe1\x3a\x96\x82\xf4\x57\x21\x41\xe0\x1d\x44\x7e\xbe\x38\x62\xe5\x03\xb9\xf2\xf2\x94\x5f\x69\xc7\xdd\x9d\xa4\x52\x29\xe0\x4a\x79\x26\xc1\x75\xd5\x51\x2c\x12\x8e\x62\x96\x00\x8f\x30\x14\xf1\xdc\x19\x72\xf9\x7a\xf4\x6d\x1d\x81\xc1\xc2\x8c\x2f\xf8\x65\xf9\x17\xfd\x6b\x0a\x47\x65\x8d\x02\x6a\x9f\x42\xd6\xeb\x6d\x64\x41\x18\x02\x10\x44\x43\x7f\x3e\xdd\x40\x96\xd3\x88\xf2\x2b\xaa\xc3\xfb\x5c\xfc\x2f\x4f\x0a\x71\xd4\x0a\xec\x98\xa6\xf3\x83\xd4\x59\x5b\x30\x58\x1f\xb6\x6a\xb1\xe9\x71\x15\x5e\x8f\xb2\x7f\x0c\xd3\x70\x0a\xdc\x03\x57\x7b\xf0\xc8\xc3\xb0\x9c\xfa\x8c\x97\x6b\xfb\xf0\x84\x10\xa6\x2a\xe3\x61\x36\xe3\x77\x4f\x66\xfc\xee\xb9\xca\xc6\xec\xd1\x30\x4c\xbd\xaf\x25\x84\x77\xd3\xa3\x0b\x54\xa8\xd2\xce\x9b\x7a\xef\xb5\x9c\x47\x31\xcf\x09\xf3\xf5\x90\x39\x59\xb6\x0c\x50\x8d\x8e\x41\xe1\xd7\x58\x01\x14\x22\xe4\xa2\x8d\x04\x8e\x95\xea\x5c\x3e\x63\x33\x55\x15\x6c\x88\xe0\xba\x14\xb8\x5d\x61\x9e\x92\x9e\xcb\x72\xfa\xf8\xb4\xc9\xd9\xa0\x45\x36\x71\xbf\xef\xef\x05\xf0\x83\x4b\xe9\x8c\xfa\x45\x36\x55\xf0\xe9\x90\x7f\x72\xbe\xc5\x1a\x25\xc0\xd8\x89\x6f\xe9\x91\x0c\x1e\xe0\x9d\x26\x3b\x55\x37\xa5\x3f\xb7\xff\xf0\x13\xa6\x47\xa9\x89\x6c\x88\x5d\x24\x64\x85\x9d\xa1\x61\x34\xc5\x56\x9f\x46\x14\x97\x84\x58\xda\x69\xb2\xd7\x0c\x08\x4d\x9e\x5f\x95\x6c\x2d\x45\xaa\x6c\x09\x7b\xa9\xd1\x26\x23\xb0\xf4\xfd\xc6\x30\x2d\xab\x2c\x43\xe4\x3e\x29\x54\x28\x17\x71\xc9\x37\xf5\x93\x42\x3a\x48\x1d\x04\x99\x0f\xa1\xbc\xda\x0c\x8f\xb2\x1f\xce\xa5\x0b\xcf\x73\x81\x1f\x2e\xb6\x5e\xe7\x5f\xa9\x9b\x81\x8b\xba\x1e\xd8\x4e\x46\x85\x7b\x24\x34\x49\xfc\xa5\x38\x8a\x1e\xbb\x04\xf8\xeb\x7a\x1d\x59\x93\x47\xb3\x51\x87\x40\xdd\x93\x47\xf3\x4b\x9d\x61\x43\xee\x2c\xe5\xaa\x8e\x2f\x80\x51\xb8\x12\x8c\xc2\x55\x9f\x72\x61\x7b\x7c\xc2\x7f\x3d\xf1\xfb\xed\x13\xff\xa5\x0d\x62\xfd\xc1\x4e\xb3\x88\x7c\x71\x9a\xd6\xb0\x2d\x59\x86\x6b\xc5\x46\x3c\x9f\x73\xe6\xe1\xa4\x27\x53\xee\xba\xf2\x29\x68\xc8\xa7\xaf\x2a\xed\x4c\xe5\x3b\xef\xc8\xa7\xe3\x2b\xf2\x3e\xe8\xd2\x78\xd8\x7e\xbf\x8d\x0d\x11\x83\x86\x15\x0f\x67\xdf\xbb\xb3\x38\xdc\x04\xa0\x1f\x91\x3c\x9a\xef\xba\x86\x31\x16\x60\x77\xd7\x15\x3a\x46\xed\x8d\x82\x6b\x9a\x46\xd1\xca\x19\xad\x7b\x35\x83\x2f\xc3\x36\xa1\xe4\xdb\xa5\xbc\x07\x15\x4b\xd0\x33\x8c\x9b\x4b\x53\x3c\x73\xab\xf4\x71\xbe\x52\x9c\xa6\x5e\x3c\x6c\x57\xbe\x88\x42\xc3\x36\xb2\xbf\x70\x85\xb8\xe3\xad\xba\x57\xc7\x57\xac\xeb\x2f\x1f\x36\x47\x7b\x7c\x45\x32\xb7\xaa\x75\xce\x49\x50\xb0\xf5\xb1\x8e\x4c\x86\xe7\xb3\x2a\x00\x5f\x85\x4e\x6d\x46\xe0\x7f\xd6\xd3\x2a\xb9\xe7\xfc\x08\xd4\xa5\xae\x6e\x59\x95\xab\x75\x16\x70\xbd\xae\x2b\x06\xc9\x77\xb9\xa0\xfc\x4d\x5d\xb0\xd0\x06\xf1\x78\xc0\x37\x86\x6b\x94\x98\xe5\xae\x6a\xc2\x15\x75\xbb\x6f\xfa\x98\xe5\xd2\x1d\xab\x5e\xab\xd2\xde\x89\x2c\x5d\xd3\x64\x34\x70\x54\x07\xa2\x16\xb0\x36\x08\x1f\x1d\xaf\x62\x86\x86\xe1\x5b\xf4\x1f\x33\xc4\xbc\x35\x0c\x6f\x81\x78\x43\xb6\xe9\xb7\xce\xc7\x8c\x5e\xc4\xfc\x21\x40\x8c\x91\x03\x32\x5e\xd0\xb1\x5c\x35\xae\x36\xa1\xed\x36\xf5\xb6\x83\xcd\xb7\x4f\xba\x90\xef\x21\x2b\x43\xaa\x75\x4d\x6a\x9d\x3d\x16\x97\x7d\x9a\xf2\x4a\x42\xb1\xc9\xf4\x2a\x8c\xe5\xb5\x4e\x7a\xd8\x47\x76\x55\x3d\x4a\x05\xbf\x02\xb5\xae\x05\x1b\x1b\x38\x3c\xb2\x4b\xad\x2e\x0e\x74\x96\x95\x55\x74\xfd\x48\x02\x27\xad\xc5\xb9\x9a\x99\x2c\x11\x1f\x5e\x60\x6a\x45\xff\xb0\xcd\x2f\xb4\x5f\x0a\xa0\x39\x72\xfd\x08\xd7\xfc\xd7\x8f\xa0\xc2\x44\xe5\x46\x06\xc1\x72\x86\x87\xbf\xfa\x19\x0f\xaf\x30\xac\x50\x25\xeb\x11\x0f\xb8\x5e\xb1\x53\x8b\x8b\xbe\xb8\x0a\xb9\xeb\xc2\x97\x6f\x53\xfc\xea\xc7\x74\x3a\x85\x98\xb6\x32\xd7\x73\x9f\xe2\x2e\xd7\xb4\xe7\x7a\x0b\x42\xe3\xe7\x47\x84\x24\xff\x25\x4b\xcb\x22\x4f\x7d\x76\xac\xb6\x63\xa9\xc4\x74\xd2\x13\x9f\xd6\x7b\x30\xaa\x4a\x0a\xb0\xb3\xf6\xa5\x0b\x55\x5c\x5d\x29\x04\x31\x59\xd0\xf4\xfd\x6b\x17\xdf\xd7\x40\x0c\x21\x5f\x19\x05\x5d\x4f\xbf\x9e\x9c\xe2\xc7\xa1\xbc\x78\x08\x1a\x44\xd4\x62\x75\x03\x56\x87\xe8\xd6\xf1\x8c\xb1\x96\x75\xf6\x7e\x7e\x8a\x45\xd6\x24\xf9\x22\x43\x82\xb6\x33\xd8\x43\x22\x04\xc5\x24\x7f\xed\x8a\x8b\x9b\x13\x24\x51\x3c\x38\xa2\x12\xcf\x98\x4a\x0d\xb1\xf3\x0e\x86\xdd\x9e\x16\x3d\xef\xe0\x42\x41\xe4\x43\xce\xb7\xba\x76\xef\xc1\xb6\x16\xe0\x9b\x2c\x9f\x7f\x95\xc7\xe7\xcb\xb5\xd6\xaf\xd3\x60\x56\x25\xfa\x23\xcd\x1e\xc8\x34\xb1\x87\x29\x6a\x95\x5c\x99\x2e\xef\x19\xcf\x7a\x1a\xe9\xc2\xa6\xdf\x43\xf8\xad\xb1\x63\xaa\xb4\x28\xcf\x7a\x68\xbd\x5d\x06\x4f\x3e\xd1\xe1\x26\x20\x1a\x48\x38\xa6\x04\xc3\xb5\x5e\x49\x67\x5d\x77\x5d\xf5\xc5\x97\x80\xc3\xbe\x2b\x30\x93\x5f\x03\xfd\xab\xb4\x08\x38\xc9\x19\x8b\xa6\x18\x9a\xc2\xa0\xa4\xf8\xee\xba\xa2\xdd\x1f\x11\x59\xaa\x93\x08\xe1\x14\x56\xe4\x34\xc1\x0b\x49\x77\x00\x92\x6d\xde\x75\x89\x1f\xaf\xed\x1b\x7f\x6d\xb7\x20\xd9\x59\x35\x75\x77\x5d\x94\x0b\x99\xef\xb6\x82\xe2\xd7\xae\xec\xca\xd7\x6e\x66\x94\xdf\xa6\x38\xd8\x6c\xe0\x6b\x17\xe5\x83\x69\xba\x56\x5d\xb5\x1e\xe7\x9d\x6d\xeb\xf1\xd8\x25\x9c\x62\xd1\x89\x53\xf1\xc5\xaa\x53\x59\x5c\xcd\xc6\x79\x27\x6f\x05\x64\xa7\xce\x3b\xaa\xf0\x4f\xb6\x09\xce\xdd\x26\x5b\xf6\x49\x56\x3e\x75\xb5\x2e\x6c\x82\xbc\x3a\x27\xce\x50\xe3\x91\x98\xe2\xeb\x4f\x99\xe4\x97\xa9\x4a\xde\x2c\x77\xde\xc1\x32\x7c\xef\xe8\x91\x22\xe7\x21\x73\x5b\xf9\x2d\xaf\xc8\xd7\xae\x2a\x32\x7e\xa4\xeb\x08\x7a\x03\x11\xa5\x90\x50\x20\xe4\x8b\x61\x64\xa0\x01\xd2\x45\x1e\xef\x24\x49\xae\x75\x79\xd7\x2f\x8a\xbb\x1e\x74\x36\xf1\x6a\x4d\xde\xf5\x86\x2c\xeb\x3a\xf5\xb0\xa0\xd4\xa4\x8f\x4c\x84\x59\x15\xac\x72\x0d\x29\x71\xbf\x3f\x59\xde\x15\x5a\x8a\xbe\x65\xd7\x04\x38\xd4\xa3\x31\xe5\x8b\x98\x65\x67\xa1\xc0\xf9\x97\x9c\x02\xd5\xb1\xc4\xe9\xcf\xe7\xf2\x76\x9e\xb3\xa9\xd1\x3f\xbf\xc0\x95\x6d\x67\x3b\x53\x5e\x93\xf1\x51\x1a\x5f\xa5\x58\x4b\xc6\x44\x31\x2a\x46\x67\xc5\x9c\x75\xce\xae\x72\x22\xf6\xca\xf5\x23\x16\x4a\x2a\x25\x5c\x12\x6c\x6a\x09\xea\x06\x0e\x0d\x69\x49\x87\x2e\x70\x66\x0c\xa9\xe4\x97\xf6\xa1\x08\xa6\x22\x1b\xb7\xeb\xcb\x50\x8d\x37\xf5\x0d\x8a\xee\x46\x69\xd1\xb1\x8d\xaf\x62\x73\x3d\x76\x31\xb8\x9b\xf3\xac\x1f\xff\x30\x1a\xc6\x47\x1e\xf1\x18\x0d\x65\xc2\x95\xa8\xbc\x04\xfc\x5e\x37\x7d\xec\x21\xd0\xad\x93\xd0\x23\xf4\x37\xc4\xeb\x6a\xd5\xb4\x7a\xb7\x9b\x24\xef\xf3\x79\x9e\xc2\x4d\x06\x3d\x48\x4e\xe3\x6a\x9d\xb3\x6a\xb2\x9d\x95\xad\xd2\x06\xd1\x20\xcd\x44\xd6\xa5\x86\x21\x21\xf3\xbc\xe3\x48\x55\x34\xdf\x25\x64\x1c\x21\x21\xce\x01\x4d\xc1\xc7\xd0\x5d\x71\xbd\xd1\x15\x57\xd3\x2f\xd0\xd6\x75\xe0\xa2\x57\xf6\xf1\x28\xc8\xb8\x74\x7d\xec\xc2\x2c\xd0\x35\xa5\x83\xef\x9c\xce\x5c\xdb\x49\x5c\x7a\x76\xfd\x29\xe7\xa6\xb6\x50\xc6\x3e\xfb\x13\x28\xfc\x16\x8a\xce\x43\x37\xcf\x5c\x42\x8e\x4e\xe5\xb5\x39\x63\xef\x0c\x63\xff\x13\x21\xb4\x15\x8f\x5d\x69\x71\x1b\x18\x46\x60\xfd\xf8\x07\x87\x24\xe4\xe3\xba\x89\x0c\xa3\x10\xb2\xbe\x3b\xf0\x54\x31\x7d\x88\xad\x4a\x02\xe8\x74\x24\x89\x3d\xbd\xdb\x11\xeb\x36\xb2\xc3\x24\xe1\xa1\x44\x95\xd7\x8e\xbf\x44\x6b\x6c\x6d\xfd\x89\x6b\x18\x21\x51\x38\x49\xbb\x93\x28\x39\x4a\x02\xda\x19\x66\x58\xf1\x36\x7a\x5d\x49\x56\xbf\x47\x53\x56\x5f\xc9\x74\xcb\x07\x6a\x40\x10\x56\x56\xac\x8d\x1c\x03\x8a\x48\x08\xd3\x2f\xf3\xcb\x0e\x7c\xed\x22\x09\xc9\xea\x5b\xa0\x7c\x6d\x58\x77\xf7\x38\x26\x3d\xc3\xf8\x51\x37\x03\xdc\x63\x8c\x84\xac\xfb\x2e\x4a\x12\x35\x55\xea\x71\x18\x21\x35\x6d\x85\x38\x49\x62\xf6\x94\x24\x6c\x46\x22\xd2\x43\xab\xc8\x30\x02\x70\x4d\x54\x28\xe5\xce\xdf\xcd\x6c\xd2\x1d\xb4\x4d\x39\xc7\xec\x3f\xa1\xa4\x4e\x84\xcb\xfe\xaf\x5d\xc3\x38\xd8\x57\xf3\xa9\x3a\xcf\x98\x83\x24\xf1\x11\x6d\x3d\x83\xac\x5e\x6a\x3d\x79\x6b\x60\x94\x6e\x57\x01\x67\xaf\xbe\x27\xee\x75\x25\x4d\xd9\x0b\x9f\x25\xc7\xec\xd3\x11\xcb\x0b\x37\xb6\xdf\xd7\x6e\x6c\xeb\xa9\xbf\x87\xd4\x00\x2f\xee\xa5\x9b\xeb\xde\xac\xd7\x71\xdc\x43\x4e\x93\xd4\x85\x6c\xe1\xec\x91\xbc\xf7\x3b\x74\x32\x9b\xee\x79\xf3\xd9\x6c\x38\x98\x86\x33\xc6\xdd\xdf\xdd\x4b\xae\x7f\x2c\x1f\x7e\xfc\x23\x9f\xa6\xe1\x2c\x47\xec\x1e\xf7\x5a\x97\x2e\xfb\x96\xf5\xa2\xa6\x5c\xf6\xde\xdd\x13\x8a\x1c\xe5\xc7\xe7\xc7\x3f\x84\x66\x58\x5c\xb6\xf7\x27\x8f\x6f\x7a\xe7\x99\xb2\xdd\xc9\xa6\x03\xd3\x56\xfd\xd9\xe5\x8a\xda\x6c\x1b\x1e\xe5\xc8\xb0\xad\x31\x7a\x95\xe4\xeb\x18\x5f\x5f\xca\xb3\x57\xe9\x3b\x89\x6d\xbe\x16\x10\x59\xa9\x7d\x50\xeb\xd1\xbc\xaf\xe1\xd7\x01\x10\x74\x2b\x18\x8b\x00\xd2\xbb\x7b\x50\x6c\x0d\x14\xa7\x32\x96\x12\xa3\x71\x0b\x78\xd4\x95\xdc\x0e\x4e\x9e\x0d\x11\xe5\xe6\x00\xdc\xff\x0c\x2f\x06\xb7\xea\xa2\x86\xc8\x77\x4d\xc6\xd9\xa4\xea\xd4\x25\xae\x0f\x00\x61\x51\x3c\xd7\xf1\x8a\x45\x86\x3d\x02\xe2\xb3\x2d\x94\x24\xbe\xd5\x0d\x70\xc8\xe8\x57\x1f\x25\x89\xdf\x1a\x06\xae\xf4\x04\x19\x91\x12\x91\xd7\x1f\x6c\xf6\xb8\x56\x81\xcf\x83\x9f\xd0\x63\xc4\x70\xc9\x73\x5d\x46\x90\xe0\x23\x59\xad\x7e\x6e\x9c\xf7\xa6\x21\x58\xaa\x68\x52\x5f\xf7\xde\x45\xc5\xf8\xc6\x91\x88\x17\xe3\x88\x7b\xa3\x80\x8f\x29\xe4\x3d\xf3\x92\x24\x64\xe4\x36\x51\x6e\xcc\x42\x47\x13\xd2\xac\xde\x81\x35\x67\x9d\xbc\xf6\xc2\x67\x9b\x9e\x63\xb1\x2d\xec\xdd\x21\x5d\xe1\x2f\x32\xfd\x58\xa5\x87\x2c\x7d\xf7\x88\xf2\x0f\xef\x9f\xc3\xe9\x7b\xf5\xed\xfd\x7d\x38\x7d\xbf\xc2\xb4\x26\xbe\x36\xcf\xd2\x4f\x8d\xe1\xfb\x15\xf6\xe4\x97\xf7\x53\xba\x08\xb5\x82\x37\xec\x75\x85\x7d\xf5\x5d\x7a\x61\xd2\xf2\x1c\xc9\xa4\x95\xf3\x7e\x3e\x08\xc2\xa8\x3b\x08\x83\xf7\x05\x32\x7b\x1e\x85\xc3\x68\x27\xa4\x86\x61\x6e\xc8\x04\x41\xf0\xfc\x13\x49\x61\xe6\xfb\xee\x11\x95\x19\x68\x8d\x6e\xc9\x91\x7e\x7e\xab\x2a\xbf\xc6\x33\x7a\xe2\xf7\x8b\xec\x90\x86\x69\x6e\xc5\xba\xea\xda\x21\x52\x05\x32\x38\xe4\x52\x99\x7b\xf3\x96\x2b\x75\x34\xc9\xad\xd4\x78\x50\x72\xc9\x1b\xf9\xd4\x2c\xcb\xa7\x1b\x95\x16\xf4\xb9\xa7\xbf\xf9\x82\xff\x8e\xc0\xbf\x3d\x2c\x79\xc0\xa6\xfa\xc0\x2e\x1f\xe0\xf2\xbe\x5d\xfe\xf0\x01\x7f\x3c\xd8\x3f\xd8\xb7\x0f\xfe\x84\x87\x03\xfb\x43\x09\x1e\x3e\xd8\x07\x9f\xe0\xe1\x0f\xfb\xe0\x2f\x78\xf8\x68\x97\xcb\xfb\xf0\xf4\xc9\x2e\x97\x0f\xe0\xe9\x4f\xbb\x5c\xe6\x35\xfc\x65\x97\xcb\x7f\xb0\xa7\x0f\x25\xbb\x5c\xfe\x08\x4f\x65\xbb\x5c\x86\x4a\x3e\xec\xdb\xe5\x32\x34\xf0\xe1\xc0\x2e\x97\xa1\xbe\x0f\x1f\xec\xf2\x3e\xb4\xf5\xe1\x0f\xbb\xbc\x5f\x86\xa7\x8f\x76\x79\x1f\xda\xf8\xf0\xc9\x2e\xef\x43\x1b\x1f\xfe\xb4\x79\x27\x3f\xed\xdb\x1f\xa0\xde\x4f\x07\xf6\x01\x7f\xf8\xc3\x3e\x80\x36\x3f\x7d\xb4\x0f\x20\xf3\xa7\x4f\xf6\x01\x64\xfe\xf3\x2f\x31\xb6\x83\xd2\xbe\xfd\xe1\x8f\x15\x0e\xd9\xb0\x7f\x8c\xd8\x38\x6b\xc3\xa7\x01\x1b\xe6\x55\x18\xcd\xd8\x28\xaf\x21\x20\xd1\xc1\x5f\xf8\x78\x30\x0b\x27\x6c\x66\x4e\xca\x30\xd6\x93\x7d\x18\xe8\xc9\x01\x8c\xf2\xe4\x03\x0c\xf1\xe4\x0f\x18\xdf\xc9\x47\x18\xdc\xc9\x27\x18\xd9\xc9\x9f\x30\xac\x93\xbf\x60\x4c\x27\xe5\x12\x8c\xe8\xa4\x5c\x86\xf1\x9c\xb0\x99\xde\x3f\xc0\xef\x7f\x14\x4b\xa5\x4f\x27\xef\xd9\x38\xce\x86\xfd\x90\x0d\xe3\x78\x10\xb0\x41\x7c\xa5\xed\x90\xf5\xee\x00\x9e\xa0\x87\x07\x1f\xf0\x39\x8f\x0e\xcb\xfa\x1f\xd5\x28\xe8\xa2\x1f\x73\x5d\xf4\xee\x80\x22\xdc\xae\x51\xb2\xe8\x19\x46\xb5\xa7\x20\xe4\x5d\xd3\xfa\xda\xcf\x20\x4b\x56\xc0\x2c\x7f\x12\x68\x37\xe8\x03\xf9\x76\x3f\x76\x93\xa4\xfc\x67\x36\x71\xc2\x12\x59\x7d\x7f\x95\xb3\x1f\xae\xc7\xae\xe2\x5c\xe6\x0b\xf9\x89\xec\x95\x91\xb3\xa7\x67\x35\xa1\x62\xc3\x28\x7f\x2a\xf0\xb3\xbc\x22\xb3\x96\x3f\xd9\x50\xbf\x61\x94\xff\xdc\xf8\xf6\xa7\x0d\x4d\xb0\x76\x0b\x92\x06\x30\xe5\xd7\xbf\xca\xc2\xa1\x4f\x8d\x11\x9e\xfd\x23\x6a\x42\x0e\xc1\xdb\xf7\x31\x10\x5f\x18\x1a\xc6\xd0\x84\xd0\xc9\x1e\x8c\xc1\x13\x42\xea\xac\x7f\xbe\x20\xc1\x15\x2f\x0c\x33\xa7\x0c\xbf\x0e\x08\x2f\xc7\x70\x72\x63\x94\x73\x5b\x93\x19\xb2\x93\x29\xb4\x72\xde\x9d\x8d\x72\x9d\xbb\x52\xeb\x1b\xe5\x47\x0e\xf1\x58\x4e\xd0\x83\xe6\x84\xeb\x4b\x6a\x51\x37\x5f\xe0\x80\x94\x0f\x0a\xc4\x67\xf4\x6b\x81\xf8\x15\x8f\x75\xd0\x2e\x21\xfb\x78\x6b\xfe\xd2\x67\xe2\xb5\x7a\x6c\x96\x60\xeb\xfe\x2d\x5e\xfc\x2b\xd3\x47\x15\x78\x61\xe5\x5f\x7a\xd9\x52\xf2\xb3\xa8\xde\xf4\x09\x3c\x0b\x3e\x14\xb2\x40\xd9\x24\x29\x89\xe9\x11\xba\xab\xa3\x03\x84\x19\x54\x7c\x3c\x20\x8c\xa4\xde\xdf\xff\xc0\x83\x08\xf8\xa4\x0c\x8b\x23\x7c\x46\xb2\xd9\xf5\x11\x6e\x13\x8f\x51\x17\xe7\x41\x38\x98\x75\xa3\x6e\x38\x71\xfc\x0a\x74\xf3\x33\x2b\xe4\xef\x74\x07\x0c\x03\x55\x22\x12\xd4\x68\xcb\x77\xed\xfd\x3f\xa0\x36\x41\x43\x9b\x11\xf9\x0b\xd9\x6d\xc3\x68\xb3\x8c\x21\x74\x23\x22\x61\x8d\xb6\xda\x10\xea\x29\x52\xd0\xe6\xc8\x25\x89\x1c\xae\xd9\xd6\xa9\x51\x33\xc2\xc2\x9c\xf1\x62\x64\x7a\x38\x5c\x57\x63\x7b\xfb\x44\x7e\xd7\xb4\x82\xc3\x3c\x1d\xc5\x9b\x1b\x41\x6f\x5e\xbf\x28\xad\x82\xb1\xa4\x26\xaf\x6f\x34\x8d\x3c\x21\xf9\x50\x7a\x6c\xcd\xb2\xf6\x51\x4a\x4b\xbe\xf6\xb1\xa7\xdb\x42\xdc\xe8\x35\xd4\x44\xa6\xc6\x88\xca\x5c\x0c\x2e\x83\x70\x46\xfd\xce\xa6\x6c\xe2\xc6\x30\x4c\xa9\x6c\x77\x7d\x83\xb0\x7c\x6e\x96\xd3\xe7\x9b\x1b\x21\x30\xba\xb9\x21\xb2\x57\xb2\xeb\xda\x25\x8f\xee\x3d\x22\x03\xf1\x1b\xd7\x85\xb7\x6b\xaa\x7f\xe9\xdc\x68\x74\x0b\x5b\x0e\x45\xd7\x1e\xa6\x04\x6d\x00\xaa\x87\xf0\x58\x3d\x45\xce\xe9\x9a\x01\x10\x23\xa4\x8f\x86\x41\x28\x09\xae\x49\x38\x0a\xe9\x8c\xf8\xab\x7b\xb3\x53\xa3\xf8\x50\x27\xd6\x9b\xe0\x87\x83\x81\xdf\x5d\xdd\x69\x77\xcd\xa6\xee\x06\xb8\x5b\xa3\x59\xcd\xc7\xfb\xba\xe3\xe5\xdf\xb8\xd1\x55\x6a\x3f\xc7\xf2\x3f\xb2\xa3\x82\x93\xf2\xf6\xf5\x92\x62\xbf\x13\xfa\x3d\x6f\xb8\xb4\x17\xc7\xb8\x1f\x0e\xe6\xdd\x59\xd8\xb7\xbd\x0b\xf5\x9c\xf7\x7d\x42\x83\xee\x90\x25\xa8\x87\x19\xf5\x58\xa1\xd9\x24\x0c\x45\x05\x2b\xa7\x49\x9a\xe2\x5c\xbf\xeb\xe9\x1d\x5b\xd3\x33\xd4\x90\x8a\x92\x09\xf2\x15\x8d\x4d\xaa\x4c\xb2\x30\x6d\xdd\x81\xbe\x87\xf3\x50\xd7\x98\x87\xd4\x34\x30\x7b\x49\x46\xf5\xf1\x37\xad\x87\x49\xae\x51\x34\xa1\x16\xad\xc0\x45\x8c\x4d\x25\x55\xcf\xe8\x67\xf0\x6f\x75\xde\x33\xbf\x54\xd9\xc9\x10\x90\xdd\xba\x32\xf2\xc3\x41\xeb\xc8\x05\x8f\x4f\xa6\x5f\x79\xa9\xdb\xd5\x3a\x82\x90\x3e\xab\xb7\x4c\xea\xd7\x1d\x05\xf0\x10\x9c\x5d\x70\xfb\xe0\x2d\x4d\x0f\xa4\x76\x5a\x60\x98\x7b\x6a\x72\xc6\x08\xbc\x83\x56\xa8\x75\x76\xc8\xdd\xe6\xb6\x02\xdf\xad\xb4\x1f\xb9\x0b\x78\x64\x73\xe7\xa1\x36\x7c\xe7\xc0\xce\xc7\x50\x92\x9a\xf9\x3e\x35\x91\x88\x56\xcd\x9f\xdb\xa4\x50\x86\xa0\x5e\x5c\x00\x11\x93\xf6\x23\x1b\x1a\x1b\xcf\x83\x19\x67\x30\x7d\x3b\x49\x68\x81\x84\x95\x1e\xfc\x46\x95\x20\xe1\xf5\xd4\xfe\x31\x29\x0f\xb2\x65\x9b\x6d\xc6\x16\x47\x84\x84\xe0\x6c\x8b\xd1\x80\x82\xb1\x71\xa8\x35\x24\x81\xd3\x4e\x12\x33\xe6\xea\x5c\xd9\x6c\x4e\x8f\xb1\xda\x10\xd9\x11\xfa\x3c\x60\x84\xff\xd0\x19\x18\x46\x2c\xe3\xca\xc7\x78\x90\x3a\x1b\xe3\x8b\x21\xe3\xe5\xee\xd6\xcd\x18\x39\xa5\xcf\x23\xee\x37\x58\x2b\x32\x42\x6c\x60\x25\xb4\x6a\x1b\x06\x2b\x37\x30\x8c\x82\x9f\x24\xdf\x8e\xa8\xe9\xe1\x58\xd9\xf7\x6d\x07\xa2\xf3\xfe\x9a\x37\xf2\x4e\x47\xb9\x62\x1c\x3d\x89\x5b\xbb\x42\x09\x39\xb4\xd5\xe6\x5e\x65\x39\xac\x0e\x40\x63\xff\x1a\x7c\x20\xa5\xb7\x88\xb4\x91\x01\x37\x70\xff\x7a\xd7\x33\x11\x62\xe7\xd3\x5d\xe0\x9a\x8b\x8e\x30\x60\xc6\x14\x8e\xc9\xab\x2b\xae\xe3\x9f\xde\x43\x2a\xfd\x01\x8f\xd5\x9e\x24\xf5\x2b\xd3\x07\x65\x39\x78\x47\x8e\xc7\xfb\x01\x35\x8f\x4c\x1f\x97\x71\x41\x24\x21\xc7\x6b\x98\x1e\xfe\x13\x7c\x2f\xc0\xb7\x3f\xb1\x67\x45\xd7\xea\x4b\xf9\x63\xfa\xa9\xfc\x11\x7b\xd6\x61\x5f\x7d\xfb\xf8\x21\xfd\xf6\xf1\x03\xf6\x45\x1a\x5a\x35\xad\xce\xd9\x1a\x28\xf7\x40\xbf\xd7\xc3\x05\x58\xaa\x97\x1e\xda\xb0\x1c\x57\xa7\xcd\xc3\x44\x8a\xb3\x41\xa7\x76\xd6\xe7\x86\x94\x4d\x6b\x31\xd9\xc4\x08\x6a\x61\xd8\x2c\x1e\xec\xc3\x55\x2b\xa1\xd6\x65\xdb\x44\xa8\xb2\x88\x4d\x0f\x19\xc6\x13\xfb\xb1\x85\x03\x88\x9b\x41\x9e\xbb\x2e\x90\xb4\xa4\x55\xf8\xb2\x0a\xe1\xe7\xdd\x30\x7c\xf1\x91\xab\x9d\xf8\xad\x93\x97\xac\x0a\x97\xaf\x0a\x53\xab\xca\xf5\xff\xd1\xca\x5c\xc4\x10\xfb\xea\x89\xfd\xa0\x02\xf1\x0c\x63\x1e\x83\x40\x74\xb5\x21\x25\x67\x5d\x01\x25\x68\x0f\xd8\x20\x90\xd9\xc3\x12\xf2\x73\xfb\x68\x3d\x3a\x5f\x2a\x61\xa0\xdc\x52\x4a\x85\x6d\x80\xa9\x0b\xcf\xc1\x8c\x56\xca\xb6\xd9\x94\x86\x4a\xa3\xe4\x6e\x64\x0a\x03\x75\xd0\xf7\x1e\x6d\x54\x7d\x57\x4f\x12\xf3\xae\x4e\x5e\xcb\xf6\x78\x46\xf1\x9f\x0c\x6f\x97\x3f\x32\x24\xfe\xf1\x83\xdd\x9c\x41\x6c\x75\x72\x57\x67\x78\x50\xba\x65\xc8\x40\x2a\x48\x68\x02\xf2\x58\xa3\xad\xc0\x4d\x12\x0f\x7b\xc4\x23\x64\x71\x0c\x86\x52\xde\x45\x25\xb0\x3d\x10\x62\xd5\x45\x38\x34\xb6\x21\x46\xeb\xb1\xc7\x32\x71\xb0\xee\xa9\xb0\x29\x64\x84\x57\x87\xcd\x27\xf6\xc0\x25\xf1\xb0\xcb\x30\xd3\x98\x4f\x6b\x6a\xdd\x1c\x6c\xc8\x4b\x34\x97\xf8\xbe\x88\xbb\xcb\xed\xe8\xbd\x56\x0d\x9c\x86\xd9\x94\xcd\x47\x0f\xc2\x9a\x3d\x40\x80\x68\xbb\x10\xb3\xb7\x24\x09\x96\xc2\xab\x00\xd8\x67\x3f\x98\xed\x47\x93\xa1\x79\x88\xf6\xd6\xb4\x2e\xdb\xb9\x87\x8a\x25\x14\xdf\x72\x8f\x5c\x9f\xeb\xda\xdf\xc4\x39\x87\x5c\x8a\x8a\x7d\x76\xd4\x48\x11\x30\x4b\x71\x02\x80\x22\x08\x4b\x17\x80\x47\xbf\xd6\xd9\x58\xc6\x11\x0f\x48\xcb\x75\x3c\xe5\x89\xdf\x33\xf6\x3c\x07\x8e\x22\x09\x11\xe0\x04\xd0\x20\xff\x13\xae\x7c\x89\x0e\xc1\x68\x07\x4e\xb9\xf1\x10\xf1\x8a\x45\x3a\x45\xd9\x33\x4e\xfb\xb4\x5b\x67\xf0\x9c\x06\x3a\xd4\xb0\xd9\x6e\x3d\x13\x47\xcf\x75\x3c\x11\x53\xa9\xea\xb9\x66\x0b\xf4\xe9\x1e\x4c\x3d\x04\x75\x80\x5e\x0b\xcd\xae\x19\xe0\x79\xd7\xdc\xed\x62\x8a\x10\xb7\x2e\xdd\x65\x69\x1e\x88\xa2\xd8\x58\x65\xac\x3d\xa4\x07\x58\x6c\x5a\xe1\xf9\x26\xb7\xe2\xfd\x48\x92\x5e\x8d\xe6\xe8\xbf\x78\x3f\x5a\x14\x62\x56\xd4\xfe\xd9\x2c\xd6\x88\xa8\xbc\x1b\xcd\xd4\x80\xe5\x57\xd2\xed\xc9\xcf\x88\x91\xe2\x3d\x71\x71\xd9\x88\x68\x8b\xba\xb8\x5c\x52\x8d\x45\x0c\x58\x2b\x25\x5b\xd7\xd9\xe9\xe9\xe4\x18\x37\x17\x70\x4e\xba\xa6\xc7\xdd\xe7\xff\x7b\x49\x4b\xc9\xbf\xa7\xdc\x71\x3e\xe6\x8a\x23\xde\x0f\xb6\xff\xbc\xe2\xa4\x8a\xf7\x6d\xaf\x38\xee\x53\xfc\xc1\xf6\x8a\xed\x3e\x6c\xc8\xe2\xbc\x4f\xd9\x9e\xf4\x8a\xbd\x3e\xc3\x3c\xb6\x57\x1c\xf4\x29\xdb\x9f\x5e\x71\xda\xa7\xba\x16\x69\xd0\x48\x43\x56\x68\x1e\x1d\x94\xe3\xaf\x98\x4e\xa7\x3b\x03\xda\x0f\x77\xde\x17\xf9\x26\x2b\x4c\x60\x57\x6d\x64\x15\xee\x81\x86\x13\x15\x98\x74\xe7\x7d\x91\x6d\xbb\x46\x8b\xba\x44\x73\x73\x17\x6b\xa3\x75\x28\x01\xca\xc8\x59\x0b\x1d\xd1\xba\x70\x1d\xff\x73\xe0\xf8\x5c\x6a\xc7\x60\xd9\x77\x19\xa6\x00\xce\xa7\x51\x09\x1b\x2d\xcf\x35\xb9\x4b\x2e\x29\xc1\xf3\x32\x12\x3c\x56\x59\x9f\xd1\xaa\x2b\x1c\x36\x88\x1e\x67\x71\xa0\xcf\x36\xef\x8c\x03\xb7\x55\x75\xaa\xa9\x3b\xe9\xde\x22\x22\x75\x0c\x6b\xe6\x38\x3e\x9f\x0d\x46\x8a\x71\xb9\xfe\xdc\x4f\x23\x5b\x07\xb0\xd7\x02\x32\x63\x73\x05\x18\x98\xf4\x01\xe1\xf1\xbb\x23\x88\xbb\x10\x56\x3c\x2b\x64\xa5\xb8\xd7\x10\x8f\x04\x95\x49\xd7\x0c\xac\x5b\x0f\x55\x02\xf0\x29\xc7\x3d\x75\xf2\xcf\x00\x4e\x6d\x49\xf9\x33\x82\x4e\x38\xfa\xe0\xc7\xc9\xbd\x19\x35\x84\xfd\x4f\xd4\xe0\x54\x73\xaa\xa6\x37\x04\x9b\x79\xff\x9c\x1c\xfc\xe5\x34\xad\xc9\x94\xec\xff\xf1\x87\xd3\xb4\xbe\x73\x53\x7b\xae\x03\xde\xb4\xc6\xca\x12\xa8\xd3\xe0\x29\x17\x0d\xae\xd4\x77\x7c\xb5\xe6\xd5\xae\xdd\x90\xca\x58\x35\x0f\x0c\x57\xa9\xd5\x69\x18\xc6\x90\xb3\x35\x0c\x40\x3b\x0d\xe2\xad\xb2\xe8\x2f\xcb\x53\xb6\xd9\x21\xaa\x58\xb8\xc9\xd7\x6d\xf9\x6a\x91\xdc\x79\xb5\x88\x7b\x30\xa8\x73\xe7\xa1\x5b\x03\x9b\xb6\xb9\x6d\x86\xf7\x4b\xae\xb5\x66\xe2\x52\x4a\x0a\x3c\xc6\x3a\xd7\xd7\xe6\xfe\x03\x1a\x83\x2c\x4d\xa7\xf2\x0e\x2b\xbb\x5d\xf9\x88\x29\x12\xd2\x82\xf1\x90\x07\x50\x17\xd1\xf2\x86\x84\x61\x00\x31\xe6\x87\x89\xa4\x1b\x81\xd8\xdd\x64\x2d\xd0\xab\xf0\xaf\xd3\x18\xc0\xb1\x23\x2d\xa0\x87\x86\xa1\xfc\xb4\xb0\xb6\x0c\x43\x59\xd0\x8f\x87\x5a\xb8\x39\xb1\x88\x28\xa7\xc1\xb2\xf0\xba\xba\xe5\x0e\xbb\x6d\x3d\xea\xea\x0c\x70\x63\xd0\xe0\x95\xb6\xf1\xa6\x0e\xc1\x45\x43\x0c\xb7\x6d\x75\xce\x84\x7d\x16\x67\x9c\x4d\x39\x11\x6d\xb8\x83\xa2\x52\x7d\xe0\xbf\x57\x6e\x7c\xcb\x87\x51\x9b\x1d\xff\x72\x15\x85\xf2\x74\x9e\x91\x93\xcc\x0d\x0e\xd4\xde\xf0\x52\x26\x27\xa3\x4e\x53\x1d\xa8\xff\x66\x1a\xc2\x90\xd0\xd6\xd2\x6d\xdd\xf9\x6e\x81\x7c\xdb\x34\x72\x8a\x1a\x79\x4a\x24\x6d\xeb\xbc\x9f\xde\xef\xf1\xa3\xfd\xdc\xd8\xdb\x97\xcb\x2b\x77\xd9\x4c\x18\x74\x60\x8f\xf7\x0d\xc8\xcf\x6c\xc4\x98\x36\x27\xfd\xb2\x94\xc3\xe4\xab\x89\x1c\x0f\x64\xe8\x59\x5d\x12\x0f\x57\x85\x70\xe5\xbe\xcb\xde\x29\x16\x06\x96\x56\x6d\xce\xdf\xa5\xdb\x82\xea\x12\x2e\x70\x34\x97\xd0\xb5\x35\x73\x59\x56\x25\x96\xd4\xa7\x57\x31\x7d\xab\x6f\x06\xf8\x7c\x8a\xa9\xd5\x1b\x22\x78\x39\x65\x2f\x34\xe2\x2f\xdf\xce\x30\xb5\xbe\x8f\xf8\xcb\x19\xfb\x32\xfb\x02\xde\x87\xce\x0b\x24\xea\x1a\x86\x28\x7f\x0c\x49\x08\x33\xca\x83\x27\xd1\x13\x4c\xad\xc5\x5f\xa0\xc5\x69\x2d\x3c\xbd\x11\x78\x53\xad\xc0\x9b\x6a\x06\xde\x72\xdb\xe1\x75\x64\x1b\x82\x34\xd5\xd2\x6a\x5d\x0d\x06\xd6\x51\x37\xe9\x12\xb8\x4a\xfa\x0b\x8b\x74\xc1\x58\xaa\x2e\xa3\x33\x7f\x6d\xc6\xfe\xcd\x34\x45\x9b\xea\x46\x03\xd5\x9c\xfa\x25\x56\xdc\xf0\x42\x57\x8b\xb2\x76\xa5\x22\x14\xee\x78\x28\x55\x8f\x85\x8f\x90\x2d\x5a\xca\x22\xd3\x0a\x6d\xd0\xdd\x62\x97\xb4\x5b\xcd\x17\xcd\x7c\x45\x42\xd2\xd9\xa1\x29\x42\x72\x9d\x1d\x6e\x6e\xad\xa1\x40\xa6\xd5\x38\x1f\xff\x70\xf1\x8c\xc3\xe9\x10\xd1\x93\x2f\x0e\x55\xfe\xac\x7a\xf0\xfb\xbd\x6b\x52\xfc\x12\x73\xb1\xce\x17\x64\x2f\x63\xed\xc8\xee\x07\x54\xec\xed\x35\xb7\x63\x30\x85\xa3\x27\x5d\xaf\x51\xdb\x13\x34\xbd\x34\xb7\xda\x8c\x49\xf7\x84\xa2\x78\x86\x51\x95\x3e\x17\x1b\x84\x6e\x2f\xdc\x39\x53\x85\xdf\xb4\x88\xc9\xe1\xef\xf8\x75\xbe\xc8\x01\xfa\x27\x33\x29\x9e\xa5\x95\xf1\x85\xdd\x3e\x45\xd9\x70\xfd\x5c\x57\x5a\x43\xb4\xbe\x5c\x89\x2d\xc0\x45\x35\xcc\xe4\x28\xe1\x92\xf4\xed\xcb\x96\xfb\xfb\x53\x1e\x40\x14\x7c\x81\x63\xca\x7c\x75\xaf\xf2\x9c\x07\x40\xbb\xe0\x16\x0f\xa6\x83\x5f\x3e\x82\x20\x81\x90\x7a\xdb\x30\x0a\x4a\xce\x50\xe8\xc8\xea\x70\x81\x9d\x99\xa6\x24\xad\x5b\xbb\x2f\x6e\xea\x48\xe5\xba\xc3\x9e\xe5\x4b\xee\x70\x84\xe1\x99\x6f\x42\x4d\x7c\xd6\xb3\xa8\x5f\x36\xb5\x0f\x27\xa6\xcc\xbe\x2f\x97\xa8\x97\xc7\x7c\x89\x22\x1f\x90\x30\x32\x38\x84\xb0\xf2\xb9\xd5\x7e\xc8\x54\xfb\x41\x54\x1b\xe5\x2d\xbd\xac\xf6\x4f\x7e\x06\x0f\x73\xeb\xfb\x33\x53\xdf\x9f\xa2\xbe\xc3\xfe\x1b\xf5\x95\x3f\x72\x2a\xa2\x9d\x5b\x61\xf9\x63\xa6\x46\x78\xe5\xd4\x51\x2d\x37\xff\x41\x76\xa2\x0e\xe4\x4c\x1d\x06\xb9\xd9\x3f\x66\x27\xe0\x23\x9f\x81\xaf\xa3\x37\xd0\x8a\x6e\x27\xea\x37\x74\xef\x68\x85\x82\x49\xad\xa1\x01\xfa\xf6\x6b\x12\x0d\xf4\x2a\x8f\x39\xd6\x9c\x57\x20\xbe\xf6\x2a\xce\x66\xd6\x81\x99\x14\xc9\x09\x5d\x62\x22\x68\xa9\x61\x42\x39\x31\x36\x34\xfe\x27\xe3\xb2\xc5\xdb\xec\x81\x7f\xce\xbb\xe0\xb7\x37\x9d\xec\x09\x02\x12\x24\x3e\xaa\xfd\x42\x96\xa0\x2c\xac\x7d\x96\x93\xa3\x91\x06\xfe\xb9\xec\x98\x7f\x2e\x7b\xe6\x9f\x1b\xff\xa3\xb3\x84\xdd\xcd\x9e\x4d\xa6\x86\xc7\x86\xcf\xbf\x68\xd6\xe3\x9d\xc6\x9a\x2e\x8b\xc8\x22\x24\x53\x1e\x02\xd1\xa0\xc9\xea\xf8\xce\xea\x48\x12\xae\x84\xf7\x05\xa4\x9a\x3e\x42\x10\xd4\xcf\x1a\xf4\x56\x4d\xab\x97\x85\xcc\xc2\x08\x0e\x77\x45\x5f\x69\x58\x69\x76\xb2\x76\x96\x75\xe5\x66\x93\xa3\x66\x5b\xb8\xc4\xbd\x21\x7f\xf9\xd5\x5a\x77\x17\xb0\xa6\x5d\xb5\x0b\xc5\x37\x89\x1b\x72\x1b\x11\x94\xed\xf8\x9c\x44\x5d\xcd\x13\x79\x8d\x66\xe7\x90\xb6\xbc\xb1\x6b\x18\xa3\x18\x9c\x3b\x78\x63\x97\xad\x33\xdd\x24\x03\xe5\x80\xcc\x2d\x23\xc2\xe0\xdd\x6a\x6b\x2f\x4b\x8a\xf8\x5e\x70\xe2\x5b\x96\x66\x24\x19\x57\x72\x43\xca\x15\x6c\xc3\x30\x44\x6d\x42\x7f\x0b\xb6\xe7\xf7\xd1\x7f\xde\x29\xfe\xdc\x53\x98\x72\xc6\xfd\x16\x6e\x9b\x49\x2e\x35\xfd\x6b\x6b\x3b\x69\x1d\xb0\x80\xdd\x2c\x33\x95\x62\x1f\x29\x45\x6c\x0b\x3b\x58\x2e\x03\xee\x2a\x74\x27\xbe\x3f\x0e\x21\xe6\x46\x57\x61\x0e\xf9\xe1\x30\x30\xd5\x01\xf3\xf1\x03\xd2\x7d\xe6\x2f\x67\x66\xa7\x26\xef\x03\x0c\xc3\x84\x7b\x4b\x7e\x1d\x8d\x3d\xcb\x9f\x4d\xe2\xcb\xf0\x99\xf0\xdb\xed\x1b\xfe\xed\x9a\x7f\x9b\x76\xba\xd1\x8c\x7f\xf4\x27\x2e\xf6\xac\x9b\x7d\x42\xad\x9b\xfd\x8c\xc8\x47\x5e\x7d\x3a\x4d\xab\x36\xcf\xe8\x77\xa5\x34\xb5\x74\xff\x5b\x93\x90\x5c\x5d\xe6\xe5\x5c\x9f\x5c\x27\xbf\x0a\xe1\x36\xe0\xbe\xbb\x95\x3f\xc9\x27\x10\xef\x1e\x19\xed\x63\x0a\x08\xc1\x52\xe3\xaf\x50\x92\x21\x1d\xee\x1e\xf3\x6a\x54\x2a\x92\xd9\xd5\x14\x32\x9c\xa8\x91\x23\xc4\x49\x9d\xf4\x72\xc9\xcf\xfb\x62\xd4\x50\x52\x9f\x66\x3d\xa7\xc4\x24\x1c\x04\xe1\x24\x9c\xa8\x02\xcd\x3a\x5f\xc3\x71\x8d\x92\x19\x34\xe3\xf4\x6b\xb4\x35\xae\x51\x97\x34\xeb\x4e\xd0\x30\xfd\x31\xdd\x12\x07\x38\x6a\x08\xe9\xb8\x1e\xb2\xb4\x21\x2f\x74\x87\x07\xa4\xe5\xae\xee\xcd\xc7\x06\x66\x8d\xb4\xbb\xe6\x63\x43\xcb\xd8\x6b\x64\xd9\x90\xe1\x41\xcb\xe3\x91\xd3\x7c\xe5\x7e\xdf\x13\xee\xf7\x4b\xb6\x2f\x04\x6d\xc5\x61\x9f\x72\xfb\x6c\xe1\x3d\x3f\xfd\xf2\x98\xfd\xb2\x9f\x7e\x19\x55\x57\xa2\xfe\x34\xba\xa4\xbf\x6a\x92\xc7\x46\xde\x85\xa5\xc8\xf0\xfd\x89\xfe\x77\x57\x97\x13\xc9\xf0\x89\x3b\x4c\xcc\xb3\x23\xe4\xc4\x0d\x75\xe6\x61\x40\xfa\x7f\xa2\x24\x81\x87\xf2\x47\xf4\x4b\xb7\x9b\x0c\xef\xfc\xf0\xdc\xfc\x3b\x46\x3e\x93\x7d\xf0\x5a\x17\x90\x9e\x42\x3c\x8c\xf0\x5c\xd6\x41\x3e\x9c\x24\x5e\x6b\xec\x9a\xaa\x8b\x3c\x7a\xa6\xea\xe0\xb2\x6e\x7a\xb8\x5d\x43\x60\x6d\x16\x7d\x4d\x11\x55\xf4\xd5\x14\xe1\xfb\x55\x37\x1f\x19\x95\x5e\xa7\x19\xed\xce\x0d\x4b\xcc\x3c\xd1\x3f\x0e\x48\x5f\x9d\xb8\x15\xb8\xd4\x04\xa9\x98\xc3\x6a\x64\xbc\x4a\x56\x61\x34\x30\x8c\x42\x5f\x3b\xa1\xb9\xcf\xe6\x00\x43\x41\xe1\xac\x59\x07\xc0\x49\x4d\xf9\xeb\xa2\x04\x80\x2c\xc5\x23\x3e\xf7\xf0\xc2\xad\x04\x87\x0f\x1b\x97\x25\xd4\x30\x3c\xc3\xd0\x97\x89\x1b\x3e\x47\x5f\x7f\x31\xab\xea\x45\x7f\x0d\xba\xf9\x1d\x2f\x68\xd7\x8b\x34\xe8\x3f\x5f\x27\x8a\x55\x18\xef\x42\xc1\x37\x8c\x01\xbf\x6b\x12\x6b\x96\xd2\xfc\x29\x0d\x11\x37\x34\x8f\x5d\xec\xd9\xc7\x9e\x90\x73\xa8\x2b\x44\x90\x63\x16\x08\xf4\xc4\x87\x0b\x96\x23\x56\x61\xbb\x86\x03\x70\x1e\xc7\xfa\xe4\x23\x1c\x20\x2a\xfb\x20\xfc\x61\x7b\x9a\x33\x1c\x94\x99\x67\x61\x9b\x0e\x9e\x7f\xf9\x6d\xf4\xa6\xe0\x7e\x2d\x72\x86\x0a\x62\x21\xe1\xb1\x84\x54\xdc\x8b\x6c\x58\x8c\xfe\x98\x3a\x41\x18\xd1\x79\x3c\xb3\x75\x18\x0b\xcf\xf5\xa8\x03\x39\x32\x7f\xbe\x29\xb5\xfa\xd7\xba\xd0\x1f\x53\x59\x61\xf9\x23\x6f\xdc\x93\x09\xfb\xb9\x4d\xd6\xfe\x59\x6f\x32\xf7\xe6\xa7\x3b\xd6\x69\xc0\x81\xb6\x26\x51\x43\x03\xe2\x20\x49\x1e\x1b\x20\x21\x56\xd7\x76\x27\x0c\x1c\x56\xf7\xe6\xa0\x81\x19\xc6\x6d\x92\x01\xa0\xa2\xb6\x97\x17\x58\x0c\x4a\x2c\x63\x27\x63\x96\x4c\x2b\x82\x14\xad\xc6\x26\x67\xf4\x4e\x72\xd4\xbd\x96\x31\x67\xe3\x37\xc8\xe3\x01\x1b\xa6\xdf\xce\x6e\xb5\xb5\x79\xfb\xd3\x56\x24\x02\xa3\x9b\x35\xd2\xa1\x9c\xd1\x5f\xd0\x79\xdb\x47\xcf\x44\xd6\xf0\x41\xc8\xdc\x59\xa5\x3a\xb2\xfe\x68\x9b\x69\x19\xa4\x17\x89\xbe\xa6\x45\x60\xc2\x33\xbb\x53\x8c\xc6\x6f\x2b\x2e\x2b\xb3\x23\xd3\xcf\x29\xcb\xf4\x13\xc1\x85\x04\xca\x2e\x3f\xaa\x09\x48\x2a\x72\x30\xee\x20\xe6\xb4\x23\x38\x30\x7e\x1c\x33\x0e\x18\x1e\x7b\x63\x8a\x50\xe5\x8b\xfd\x12\x9b\xca\x95\xf0\x17\x84\xb9\x4c\x03\xd9\x30\xbd\xd5\x38\x63\xc8\xb2\x46\x25\x6e\x30\xe2\xdc\xff\x8e\x88\x6a\x6c\xcd\x3c\xea\xc0\x5f\x2e\xcb\xe7\xd7\xa5\xe3\x2e\xf7\x02\x89\x0c\xe3\xaa\x67\xfa\x58\xf8\x09\xd4\xbc\x1b\x22\x19\xfe\x67\x05\x5d\xf8\x3e\x5a\x8b\xd8\x91\x4f\x7a\x00\xd9\x21\x03\x76\x96\x74\xfa\xa3\x52\x28\xf1\xc1\xdc\x3d\xae\xd5\x34\x1b\x6e\x15\xf2\x5e\x96\x56\x8c\x70\xe8\x6e\x25\x1c\x06\x29\xe1\x00\x80\x9f\x2f\x6c\xf6\x52\xb2\xb5\xf2\xe3\x89\xda\x9e\xa2\x52\x2b\xb7\x4f\x94\x77\xeb\x78\x96\x67\xbb\x3e\xd4\xb6\xe2\xee\x65\x36\x62\x65\x92\x04\x1c\x11\xb3\x07\x0e\xd1\x5f\xc9\xc7\x3f\x12\x33\xa8\x1c\xec\xdb\xe5\x83\x7d\xb6\x2f\x87\x0d\xbc\x2b\x2c\x04\x46\x0d\x3c\x6e\x38\xe3\x06\x19\x35\xa4\xaf\xd2\x49\x83\xcc\x7b\xce\xa4\x61\x18\xe6\x5e\xb9\x40\x26\x8d\xd6\x38\x70\xcd\xf7\x27\xdd\x49\x18\x0d\x97\xef\x51\x92\xe8\xc9\x47\xb4\xdf\x1d\x0c\x59\x6a\x26\x77\xf7\x6b\x67\x38\x08\xd7\x33\x77\xbf\x0e\x83\xf7\xa8\xc2\xda\x2a\xd9\xd9\x0f\x94\x7d\x18\x6f\x7c\x38\xea\x4c\x86\xfd\x8d\x7a\x0e\x07\xc1\x64\xd8\x0d\x58\xb2\x4c\xba\xa1\x11\x9d\x74\xdf\x23\x41\xb4\x4f\x6b\x94\x8c\x1a\x78\x56\xa3\x64\xdc\xd0\x42\xd8\x34\x78\xb0\xc4\xa9\xa2\xda\xa6\x80\xa0\xa6\x6f\xd1\x4a\xf7\xb5\x2d\xda\x07\x6b\x74\xdc\x9f\xb6\xc4\x03\xa0\x2e\x00\x0a\x69\x12\x43\x48\x3c\x2c\x83\x1c\x09\xf2\x6e\x0a\xc0\x37\x5a\x8b\x3a\xba\xda\x46\x9a\x41\x76\x1d\x54\xc5\x95\xd1\x23\xe3\x37\xac\x07\xe0\x76\xc4\x99\xdc\x3a\x77\x35\xc4\x75\xc2\x99\x6b\x47\x92\x63\x92\x96\x1f\x81\xe6\x0c\xa6\x82\x53\xd2\x69\xb4\x4d\x25\x2f\xde\xfc\x1a\x51\xa4\xa1\x4a\xd6\x24\xdc\xb7\x3d\x05\xc4\x77\xa8\x75\x5b\xe5\x42\x8a\x87\x3e\xe8\x64\xfd\x72\xdb\xfc\x9c\xe8\x4a\xac\xdf\x05\x17\xdb\xf9\x1b\x3b\x3a\xe4\xd4\x22\x7d\x5c\xeb\x2c\x05\x57\x06\x77\x23\xee\xe4\x9c\x82\x47\xad\x1f\x17\x9c\xd1\xec\xcd\x73\x49\x4b\xae\x1e\xa5\x2b\x31\x14\xe3\x3e\xd5\xb5\xcf\x8a\xfd\x3e\x75\xa8\xf5\x30\x31\xfd\x4a\x68\x07\xb8\x50\x30\x3d\xa3\x8c\x90\x4c\x0b\xec\x90\xa7\xed\xa3\xed\x0a\x15\xbb\x23\xfd\x58\x9d\x09\x80\x9c\x35\x30\x83\xc4\x76\xd7\x9c\x01\x40\xce\x72\x01\x72\x13\x2e\xe0\xf2\x93\x9d\x58\x20\x92\x21\x7b\xfb\x7f\x7c\x74\x28\x3b\x2b\x0e\xf6\x21\x59\xe9\x78\x08\xa2\xe7\xbe\x86\x5f\xdf\x03\x77\xf4\xde\xce\xa1\xee\x83\xee\x94\x7a\x71\x18\xd8\x05\xa1\x12\x86\x67\xdd\x59\x1c\xda\x1c\xb8\x92\xe4\x0b\x5e\xd0\x78\x1e\xda\x1c\xbc\x92\xe4\xcb\x0a\x53\x38\xa3\x93\xe4\x0b\xda\xea\xd3\x6f\x47\x59\x2b\x26\x89\x78\x3c\x8e\x40\x09\xfd\xcc\x25\xe4\xbe\x26\x9d\x5a\x4e\xb8\xc7\x61\xf0\x6f\xf9\xcc\xf1\xf0\x06\x14\xfe\x6c\xc0\xec\x9c\xe1\x36\x8f\xda\x19\x1e\x9e\x9b\x65\xe4\x3c\x43\x8c\x49\xa4\x22\xf0\xe7\x92\xf8\x39\x5a\x73\xe2\x56\x8a\xab\xcb\xb5\xe1\xaa\xa6\xab\x64\xf2\x5d\x21\xe1\xef\x6e\xea\x7d\xa9\xc1\xb7\x55\xf4\xc2\x9b\x01\xcf\x99\xa3\x25\x05\xdd\x39\xf2\xd7\x50\x01\x57\x79\xe1\xf4\x44\x99\x10\xcf\x30\x5e\x96\x26\xf7\x58\x94\x25\xa7\xf4\xf6\x86\x81\xbb\x49\x33\x89\x5d\xd1\x5e\x9a\x72\xa0\x0c\xa3\x69\x22\xaa\xb9\x92\xdc\x65\xe8\x3b\x2f\x49\x66\x8a\xbe\x5b\xdd\x9b\x73\x49\xd4\xcd\x73\x89\x3a\xfd\xa4\x7c\x0a\xb6\x92\x6e\x4f\x81\x54\xcb\x06\x02\xe9\x84\xea\x57\x38\xab\xb5\x1d\x9f\xad\xb5\xc3\xc3\xa9\x3d\x6e\x56\xda\xa1\x99\x4a\xe9\xe3\x7a\xa5\xb7\xd5\xfc\x42\x1b\x58\x41\x7c\x83\x6a\x7a\x73\x9d\x30\xc8\x5c\x87\xcd\xd7\xae\xc3\xf4\x8b\xae\xa7\x20\xf3\xda\xc9\x09\x39\x35\x5f\xbf\x76\xe5\xca\x7d\x52\x58\xb3\x79\x85\x2a\x6f\xe0\x25\x44\x2a\x25\xf4\xbb\x47\x61\xa2\xfb\x53\xe1\x0b\xdf\x5e\xd5\xd3\x24\xd1\xec\x38\x79\x62\xed\xb4\x92\x92\x46\xb6\xfa\x0c\xd4\xce\xee\x68\x1b\xb5\x33\xcf\x11\x93\x2c\x1a\xe9\x1d\xd5\x0f\x42\x57\xed\xae\xb9\x00\x98\x59\xbc\x75\xce\x8a\xfc\x7a\x64\x94\x86\x82\xdb\x00\xc2\x99\x54\x18\x75\xc0\xd8\xb2\x7c\x42\xef\x2d\xc9\xc5\x46\xf8\xa1\x75\xb5\xea\xb7\x30\x17\xf7\x44\xfa\x1f\xe9\x3d\xfb\xdc\x07\x50\xa1\x8c\x43\x02\x5a\xc9\x4e\x68\x18\x0f\x66\x98\x09\xec\xe1\x11\xe2\x57\x02\x46\xf4\x48\x06\xe4\xa9\x24\x35\x0d\x85\xb0\x31\x48\x12\x81\xb8\x9c\xb9\x92\xbd\x60\x29\x70\xf0\xd6\x4e\xed\xa7\xd2\x06\x62\x61\x6d\x14\x27\xd5\x0a\xb5\xae\x28\x63\x6e\x6c\x48\x18\xf5\x69\x85\x5a\xfd\x73\xf3\x7b\x5b\xa4\x54\xfb\x94\x8d\xa5\x7f\x6e\x5e\x77\x32\x8a\xbf\xf3\x54\xe6\x00\x2c\xbe\xd2\x2b\x12\x5c\x7e\xe8\x04\x86\x11\xb4\x1e\x43\x97\x10\xdf\x41\xaf\x21\x09\x5a\x81\xef\x8a\xf0\x9e\x01\xb7\xfc\xe4\xb6\x27\xd4\x7a\xfa\xc7\x0c\xc0\x10\xd3\x8c\xac\x31\x09\xb0\xba\x8a\x8b\x44\xf7\xb0\x67\x2d\xa8\x19\x21\x1c\x59\x75\x0a\x1e\x90\x80\x2d\x0f\x5a\x5e\xe0\x1a\x46\xad\x6b\xc2\x13\x2a\x90\x2f\x49\xc2\x79\xf5\x00\x39\x01\x09\x57\xab\xa6\xf5\xf4\x4f\xde\x1a\x72\xb5\xaa\x3c\xd4\x2e\xd4\x02\xb8\xce\x6f\x09\x57\x7b\x5c\x95\xd0\xa4\x56\xa7\x1b\x84\x27\xe0\x27\xb0\x50\xca\x5c\xd0\xde\xf5\xf8\xad\x22\xf8\xb2\xe0\x78\xf4\xbf\x51\xab\xf4\x7e\x59\xad\x12\x53\x6b\x3e\x35\x11\x21\xdf\xdb\x15\x8f\x2d\x9b\xed\xb1\xa5\x72\xa5\xd2\xb6\x50\x3c\xf4\x8a\x93\xaa\xae\xe9\xa8\x56\x6f\xb9\x45\x5f\x8c\x5f\x0b\x10\x2f\x49\x16\x1c\xbd\xf3\x94\xd8\x23\x34\x49\xae\x3b\xab\x7b\x73\x29\x95\xb8\x96\x62\xd7\x9e\x29\x3b\xe9\x5a\x24\x9f\x94\x5e\x57\xec\xe9\x1e\x9e\xf5\xb0\x29\xf7\xfb\xfc\xf7\x32\xe2\x26\x8e\xb1\x72\xb2\x76\x3b\xe0\x3a\x5d\xdf\x06\x22\x82\xca\x48\x7a\x7f\x6b\x4c\x64\x9e\xed\x5a\x5b\x67\xf7\x4a\xdd\xe5\xbf\x56\xdf\x32\x15\x72\x45\x3f\xd7\xe4\xda\xae\xc8\x45\x4d\xb4\xa9\xc9\x25\x94\x0c\xb6\xc6\x89\x54\x4a\x4e\xff\x99\x52\xd1\xaf\xe9\x14\x6d\x3a\x54\xca\x36\xad\xab\x14\x09\xd5\x20\x42\xbe\xc9\x1b\x4c\xf0\x6d\x9a\xe3\x0d\x79\xb9\xa1\x28\xb4\x35\xdc\xe1\x42\x21\x2b\x85\xca\xd6\xdc\xc1\x88\x9e\x28\x25\xa3\x99\xf4\x14\x20\xba\xa0\x9c\xc4\xea\x3e\x66\xf0\x4c\xf8\x54\x6d\x36\x55\x52\x57\x9c\x82\xcb\x53\x95\xd4\xbe\x14\x21\x50\xd2\x5c\x6d\xe1\xc0\xb5\xd9\xa1\x2a\xed\xe8\x58\xb8\xf6\xe2\x69\x14\x9f\x4a\x67\x3b\xa0\x0e\x04\x11\x8b\xf0\xb7\x33\x9e\x76\x2b\x33\xb5\x4e\xa7\x2c\xf1\x7c\x8a\xcf\xa6\xf8\xfc\x58\x28\xd4\x7d\xef\x48\x7e\x6c\x31\x31\x91\x61\x3c\x69\xaa\x51\x3a\x3a\x7d\xda\xaa\xa2\x04\x67\xbc\x57\xe1\xfa\x44\x97\x6d\x4c\x85\xbe\x53\x80\xaf\x6a\x8c\xce\x5e\x72\x32\x74\xf2\xd5\x44\xb8\x7a\x8a\xa9\x75\xdf\x45\xb6\x50\x0a\x52\xd9\xe1\x4d\xe5\x5f\x78\xeb\x05\x36\x94\x86\xf8\x3c\x45\xe6\x9e\xbc\x12\x8e\x3b\xe2\x2c\x8a\x3b\x70\x23\x26\xd3\xf9\x6e\x5d\x36\xd6\xdd\xe8\xac\x11\x45\xcb\x5f\xd2\x11\x52\xdb\x50\xd7\x70\x14\xad\xf2\xdf\xc6\x44\xf8\x6e\xba\x57\x61\x84\x9a\xcd\xad\x36\x49\xcb\xd3\x1c\x4c\xba\x90\x96\x31\x10\x29\x86\x1d\x48\x7b\xe5\xcf\x5c\x49\x94\xef\xfb\x48\xae\xc2\x73\x43\xf4\xd6\x37\x0c\x5f\xdc\xe3\x3a\x22\x0f\xf1\x1c\x2d\x83\x98\x0a\xc3\xf0\xe5\x0d\xab\x30\x34\x55\x41\x73\xd8\xfc\xf9\x05\xa2\x9e\x19\x4d\xe7\xe3\x8f\x1f\x50\xc5\x87\xf9\x2c\x09\x6d\x4c\x35\xbd\x68\xa5\x29\xf0\x08\x01\x28\xeb\x31\xd7\x05\xad\x5f\x99\x1e\xee\xd6\xb0\x4a\x62\x94\x06\x9b\x8d\xd3\x66\xf6\x34\xe3\xce\x49\x65\x47\xe5\x7c\x03\xd6\x4d\x75\x4b\x81\x13\x8e\x27\xfc\x3c\x6c\x76\xb2\xe8\x4c\xfa\x9d\x41\xa9\xc3\x19\x36\x80\x4c\x8c\x49\x59\xef\x26\x94\x60\xb9\x7c\xbc\xf2\x1f\x6b\x95\xeb\xce\x53\x61\x5a\x64\x76\x4e\x3e\x02\x1b\x9f\x83\xb1\x66\x6d\x99\x95\xc1\x5f\xf6\x30\xe6\x1b\xc6\x30\x74\xfb\x99\x8a\xc7\xaf\xb5\x6d\x75\x87\xdd\x64\x3b\x77\x03\xe2\x01\x9a\x41\x72\xd9\xc9\xd1\x21\x72\x66\xf6\xab\x97\xfa\xb1\x11\x00\x89\x52\xcd\x70\xb5\x5e\x1c\x9c\x80\xf0\xe1\x44\x11\xa3\x04\xe1\x76\x62\xa7\x2b\x90\x72\x63\x22\xf5\xb2\xad\xc6\xa4\x15\xb8\xca\x05\xb3\x47\x3c\xf0\xd9\xe3\x29\x9f\x3d\x1e\x92\x62\xea\xd6\x99\x2b\xe4\x4a\xa7\x53\xdb\xb3\x28\x44\xc8\xd5\xc4\xcd\xdf\xce\x6c\xcf\xfa\x3e\x5a\x4b\x3d\x67\x79\x7b\xc3\xb5\xd4\x33\x96\x3a\xfb\xb2\x9e\xf7\xd8\xf6\xac\xf1\xb9\x29\xef\x1d\xe6\xeb\xa2\x86\xec\xfd\xf2\x06\x9e\xe0\xf8\x60\x0b\x30\xfc\xe4\x72\x39\x73\xa5\xcc\xdd\x6d\xc9\xd0\x89\x83\xb6\x52\xda\x3d\xbb\xff\xc5\x5b\xe7\x4d\xce\x87\x43\x89\xda\xb5\xdc\x7b\xa5\x54\x05\x63\x1d\x03\x4d\x30\xf6\x64\x2a\x65\x69\x6d\x14\x60\xbd\x22\xb2\xcb\x81\xc9\x42\xe9\xbb\x49\xb3\xd1\xec\xe1\x86\x3f\x49\x84\xd5\x3e\x68\x00\xb0\x9f\xc9\xd8\x4d\xc3\xd6\xab\xf5\x05\x77\x41\xfc\x16\xe9\x93\x2d\x61\x8c\x1d\x1d\x48\xc1\x36\xb7\xde\xd2\x83\x8a\x15\xca\xfa\x0a\x1e\x7c\xb4\x97\xca\x80\x44\x4f\xff\xc3\x7e\xce\x4d\xff\x53\x35\x14\x7b\x84\x5c\x77\xd0\x8b\x9c\xa0\xed\x6d\x7c\xca\x94\xf9\xde\xe6\xdd\xeb\x74\x4c\x54\x39\x14\xa5\xed\x9f\x57\xf3\xa1\xb4\xde\xf4\xe1\xcf\x9b\xfe\x6b\x7b\xd3\xb2\x45\xfb\xdd\x9b\xf5\x64\xef\xbf\x0a\xe5\x55\x7a\x68\xa4\xdc\x6a\xf6\x40\xf6\x2c\x19\x08\x00\xfc\x21\xb2\x1f\xe2\x09\x37\x88\x0e\xb5\x1a\x13\x08\x20\xd0\x98\x90\xd7\x15\x7f\x6f\xf9\x2e\xd8\x17\x6c\x44\x36\x86\x93\x70\xb1\x29\x61\xca\x09\x6b\x4c\xad\xef\xd3\x84\xec\x3b\xfc\xf7\xe3\x07\xa1\x92\xc3\x29\x09\x78\xfc\x36\xa0\x49\xa2\x4b\xba\x94\x24\x0c\x9a\xe9\x3d\xaf\x4b\x8e\xd6\x02\x05\x6b\xf4\x98\xe3\x7d\x96\xe7\x9f\xd4\x06\x8a\x8a\x45\xd8\x45\x6f\xc7\x75\x15\x0a\xb0\x50\xe4\xa9\xca\x4d\xd1\xc4\xac\xa9\xa3\x16\x39\x7b\xe5\x82\x70\x3b\x20\x5b\xa9\x98\x54\x9c\xa9\x58\x3b\x93\x6c\xff\xf3\x7a\x2f\xf6\xf6\x90\x03\x46\x8d\x5c\xe2\xe5\x03\x7f\x2d\x10\xa7\x61\xc8\x50\xb1\x8d\x09\xf6\xe1\x10\xa4\x84\x8d\x9d\x31\x81\x59\x99\x34\x9f\x9a\x12\xca\x44\xcf\xcd\xfa\x7c\xd7\x89\xe6\x18\x58\xe7\xfe\xf9\xaf\x93\xf6\x8c\x4b\xfa\x7f\xa6\x58\x2b\x29\x70\x9a\x73\x0d\x69\x76\xc0\x1f\xb1\x98\x47\x41\x68\x36\x52\x2e\x06\xab\x33\x53\xd4\x82\xb0\x68\x90\xeb\xc9\xf1\xc4\xca\xd1\x98\xda\xd5\x71\x1a\x8f\xf6\x97\x74\x6f\x77\x44\xdd\x79\x8a\xb7\xe2\xd3\xc6\x90\x4e\xec\xf6\x09\x28\x5c\x08\x0f\x9b\xc0\x13\xe2\x7c\xae\x61\x14\xd0\x8a\x10\x99\xc1\x8b\xcd\x25\x16\x25\xb4\x02\x87\x9b\x79\x65\xf8\x31\x92\x8a\x36\xa0\x1c\x44\x7e\xc5\xf2\x88\x52\xcd\x96\xb7\x4f\x1a\x4d\xa7\x6b\xc3\x80\x37\x3b\xfa\xfb\x7d\x60\xdb\xd7\x8c\x70\xc4\xc9\x75\xbf\xaf\xed\xb7\x27\x6d\xbf\x89\xaf\x52\x3a\xa9\x2d\xcf\x7a\x47\x38\x61\x17\xad\x53\x65\x7c\xc7\x31\x12\x80\x0d\x96\x2b\xd9\xd9\x7b\xe5\x74\xff\xc8\x83\x4e\x6c\xb3\x1c\xf5\x63\x79\x7c\xa7\x1b\x35\xc3\x95\x3c\x37\x32\xb2\x0b\xd6\x16\x23\x8f\xb5\xf0\xc1\xdc\x52\xad\xda\xc8\x5c\x25\xa7\x8a\x9e\x26\x2d\x96\xd1\xff\xe7\xaf\x30\x85\x13\x7c\xaf\xac\xc7\x10\xde\x5a\x96\xee\xed\xc9\x4d\x5a\xfa\x9b\x56\xfc\xbd\xb2\x4d\x57\xb8\xa4\x95\x3d\x6c\xfc\x6a\xb3\x99\xee\xbe\x6c\x2b\x96\xdf\xe2\x5a\xe9\xaa\x12\x9a\xf8\xa4\xf4\xb7\x5f\x81\xb0\xd8\xd4\x8a\x3b\xc8\xf6\xa5\x25\x31\x0c\xd3\xf1\x09\x70\xc3\xe0\x41\x26\xb5\x1c\x0c\x49\xc9\x09\x3f\x93\xc0\xd1\x04\x5f\x91\xc9\xb5\x56\x22\xc3\xa0\xd6\x4b\x48\xcd\x08\x31\xa8\x6f\x97\x4d\x79\x4b\xb8\x0a\x8b\xc5\x6c\x85\xab\x55\x93\x65\xcd\x97\x2f\x01\xd9\xa4\x4c\xf7\x3d\xae\x0c\x04\x4e\xe5\xcb\xb9\x2b\x9f\xd1\x36\x3e\x12\x17\x4f\x47\xea\x26\xf4\xa8\x81\x9c\x23\xb8\xaf\xce\x95\x58\x75\x32\xea\x20\xb5\xfc\xcb\x02\x3f\x49\x8e\xc4\x65\x81\xf4\xac\xe2\xb7\xcd\xb2\xa6\x6e\xdc\x36\xf7\x33\x6f\x1f\x32\x6f\x07\xda\xc7\x21\x29\xaf\xee\xcd\x1a\xbf\x6e\x08\x1a\x66\x67\xeb\x85\x7b\x2d\x47\x04\x7d\x2c\xc6\x77\xac\xc6\x77\xdc\x40\xce\x31\x8c\xef\x97\x84\xc7\x3e\x97\xb6\xf0\x12\x3f\x97\xfc\xc2\xbd\x13\xc8\x8a\x6b\x8a\xa9\xf4\xa4\xfb\xe1\x47\xb0\x09\x8f\xb9\x14\xb7\x17\x9b\xbe\x10\x6a\x82\x60\x37\x6d\x4d\x93\xe4\x8e\x96\x26\xb4\xac\x8f\x78\x25\xfb\x9f\xbb\x3e\x51\x4d\x8f\x1f\x2c\x04\xe7\xda\xe2\x70\xc7\x0c\x49\x72\xfc\x7f\xbb\x3e\x27\x7c\x7d\x4e\xa0\x63\x59\x61\xd1\xc9\xba\xb0\x28\xcf\x1d\x70\x78\x81\xe0\x82\x21\xaa\x6d\x59\xdc\x93\x86\xbe\xac\xa7\xd9\x9b\x85\x24\xb9\x79\xa2\xab\x7b\xf3\xb4\x81\x17\xfc\xfa\xf4\x14\xee\x19\x4e\x85\xc4\xf2\x4d\xa1\xfe\xc5\x88\x26\xc9\x29\xeb\xe4\x43\x67\x4d\xfd\x23\x5f\x90\x4c\xe5\x02\x57\x78\xc7\x6c\x28\xfc\xf4\xcf\x5a\xe1\xe9\x74\x0d\x58\x44\xf1\x51\xac\x22\xdf\x6c\x95\x0b\x87\xb5\x1c\x39\x35\x34\x73\xde\xcf\xba\x42\xe7\xa2\x6b\xd0\x34\x08\x4e\x71\xbd\xf3\x1f\x4d\xe3\x59\x43\x52\xa8\xaa\xd2\xeb\x0e\xa3\x14\x4e\x05\x74\xc8\x43\xeb\x66\x00\xc7\xc9\xbd\x79\xd6\xc0\x4b\x98\xda\x33\x31\xb5\x93\x73\x2e\xa9\x3d\xf6\xe8\x1b\xa1\xfa\x38\xf8\x7b\x26\x02\x08\xdf\x98\x9d\x94\xcc\x82\x3c\xd3\xa9\x3a\x9b\x14\x5b\x95\x71\x0c\x99\x72\x88\x8e\xf7\xd9\x07\xdf\x90\x7a\x3c\xd7\xa7\x48\xe8\x21\x0a\xce\x2d\x60\xad\x01\xcf\xc6\x9e\x74\x6e\x2d\x25\x77\x9c\xa6\x75\x98\x73\x97\xb8\xa0\x9c\x84\x04\xca\x70\xb1\xb6\xa0\x90\xa3\xf7\x2c\xb5\x46\x41\xea\x1c\x6c\x95\xc9\x3e\x45\xe2\xfa\x21\xcc\x71\xa9\xb3\xa3\x46\x04\x8a\x5f\xcb\x4d\xbd\xae\x96\xbb\x29\x65\x85\x48\xf1\x47\xc2\x59\x56\x4a\xe4\xbe\x3b\x7b\x53\x41\xf5\x9a\x9d\x57\x49\x92\x89\x79\x57\x92\x7e\x76\x54\x52\x48\x28\x8e\x88\x87\xdb\xa4\x19\x9b\x01\x72\xc2\x9d\xee\x60\x3a\xa3\x03\x9f\xcd\xe8\x65\x8f\xfb\xf9\xb2\x9e\x71\x48\x42\x6b\x09\x91\x74\x02\x1c\xb4\x6e\x02\xb7\x68\x86\x7b\x6d\x6b\x89\x70\xd0\xba\xf7\xdd\xa2\x19\xed\xb5\xad\x67\xb4\xd9\x24\x98\x6e\xdd\xbc\x41\x62\x5e\x9b\xa8\xd2\xd4\x1c\x4d\x73\xa3\x73\xb4\x49\x50\xb3\xf3\xc7\xf4\xc8\x59\x63\xdd\x2d\xb7\x70\xe5\xac\x91\x63\xf0\x30\x39\xdf\xb0\x7e\x10\x14\x99\x47\x19\xe5\xca\x95\xd0\x7c\x50\x42\xab\x08\xf5\x33\x78\xc3\x3e\xa8\x9f\x71\x4d\x5e\x85\xa5\xd1\x9a\x48\x52\xc2\x4e\x5e\x33\xa2\x10\xeb\xaa\xd5\x6c\xae\x61\x8c\xfc\x23\x9e\x4f\xc0\xb1\x07\x4a\x11\xdc\x0b\x0e\x84\xcb\xc8\x9c\xf6\x9b\x72\x7e\xdd\xc7\x33\xdc\xda\x3b\xbe\x16\x18\x43\xca\xa8\x84\xea\xb8\xe3\x93\xbb\x9e\xe9\x5b\xe3\x08\x7f\xc5\x01\xd6\x9c\x1f\x04\xc4\x6f\x5d\xb8\x98\x53\x32\x81\x13\x16\x8b\x68\x5e\xa3\xe2\xbc\xc2\x7e\x2b\x74\x91\x03\xa3\xc9\xc4\x68\xc8\xd1\xc2\xfb\xff\x59\x7b\xf3\xee\xc4\x75\xe4\x61\xf8\xff\xfe\x14\x24\x6f\x7e\x5c\xab\x11\x8e\x21\x64\xc3\x51\x73\x92\x90\xa4\xb3\x42\x92\xee\x6c\xbe\x9e\x39\xf2\x82\x21\x80\x21\x6c\x81\x04\x9e\xcf\xfe\x1e\x95\x24\x5b\x36\xa4\xe7\xce\xf3\xfc\xce\xcc\xed\x60\xad\xa5\x52\xa9\x54\x2a\x95\xaa\x38\x3c\x3f\x97\xcc\xec\x4c\x76\x30\x49\x13\xb6\x8b\x3e\xe1\xd1\x92\x3e\xea\xb1\xf9\xd0\x2f\x0d\x92\x70\x34\x98\xd4\x1b\x35\xc1\xbd\x0a\x71\x85\x2a\x46\xde\x33\xc4\xdb\xe8\xb7\x25\x61\x1a\xe0\x38\x4b\x84\x95\x80\x93\xad\x22\x61\x47\x76\xf0\x0c\x5f\xa9\x98\x13\x2e\x5b\x14\x60\x81\xfe\xd8\xd1\x28\x5b\x2c\xbd\x2e\xfb\xdb\x20\xae\x3e\xcd\x7b\xfa\x34\xef\xf3\x28\xc0\xae\x3e\xcb\x7b\xfa\x2c\xef\x43\x68\x5e\x8f\x50\x6b\xc3\xb3\xf3\x8e\xf5\xe2\xda\xe0\x20\xfb\xca\xb5\x71\x40\xa8\x75\x06\xa1\xa7\xfd\x1c\x8f\xd1\xdb\x10\x6e\xd2\x1b\x79\x8d\x5a\x97\x50\xe1\xd0\xb1\x11\x36\x10\xc2\x01\x09\x44\x29\x57\x94\x72\xf3\x1e\xe4\xf0\x17\x2a\x97\x6d\xcd\xc7\x01\x3b\xf7\x0f\xdd\x41\xaf\xd3\xb9\xf2\x1b\x23\xe2\xe8\x53\x73\x04\x26\x1f\xfa\x0c\xa9\xbe\x36\xce\x85\x7c\x74\x1e\x19\x1e\x9d\x03\x7b\x3f\x17\xec\x7d\xd5\x1c\x46\x96\x43\x5e\x35\xc7\x77\x07\xf5\x82\x7d\x81\x13\x6f\x07\x84\x60\xb3\x51\xd7\x96\x5e\x0a\x70\x8c\xaa\x46\x6b\x5f\xba\xb0\xfa\x83\x41\xde\x9f\x1f\x11\xf0\x87\x04\x8f\xfa\x46\x7d\xf5\x66\xcc\x83\xaf\x78\xd5\x9c\x16\xc9\x5f\xb9\xf1\x11\xc2\xab\xd2\x47\x47\x08\xd3\x3f\x5d\xbd\x29\x56\x02\xab\x9e\x2e\x7c\xc0\xba\x61\xac\x56\xfc\x92\x16\xc6\xe6\xa8\xfc\x29\xe3\x05\xe9\xe1\x8d\xe6\x24\x98\xb1\x80\x49\x58\xc7\x0a\x7b\x79\xe1\xf4\x49\xd6\x70\x93\x06\x6b\xa3\x23\x1c\x17\x45\xec\xf4\xb2\x66\x44\xda\x66\x97\xac\x15\x16\xae\x78\x24\x21\x27\x27\xf5\x46\xe2\x83\x49\xa4\x96\x5b\x8d\xa5\x52\x3b\x9a\x90\xf3\x2f\x0c\xa6\x56\x6e\xfc\x5e\xe2\xb8\xf0\x21\x55\x6c\xe0\x04\x20\xd6\xa2\x3b\x15\x98\xac\x32\xb5\xaa\xae\x8d\x3d\xee\x26\x0e\x0c\x09\x28\xb8\x2c\x71\x2a\xae\xe5\xb9\x76\xd9\xb5\x5e\xb9\x41\xc1\x16\x21\x6e\x6c\x50\xe0\x13\xd7\x72\x78\xa0\xf6\x6a\x4b\xf3\x11\x21\x35\x44\xb9\xfd\xbe\x70\xb1\xe4\xea\x61\xcf\xf3\x1f\x68\x67\xec\x13\xa7\xe2\x73\x27\x36\xff\xb2\xfe\x1e\xfe\x3d\xa5\x86\x9d\xdb\xc4\x35\x54\x16\xa9\x51\xe2\x06\x4b\x15\x27\x32\x2e\xa7\x0b\x9d\x24\xf1\xd4\x15\x74\x21\x56\xd0\xc5\x0d\x3e\xe7\x2b\xe8\x02\x56\xd0\x85\x58\x41\xab\xe9\xf3\x82\x21\xf1\x59\x41\xa2\xa0\xd7\xd5\xd6\x6e\x82\xe5\xb4\xb5\xba\x8f\xfd\x2a\x76\x20\xa4\x0d\x7f\x67\x01\x8a\x20\x46\x49\xe0\x27\x0a\xa2\x36\xbc\xc1\xb8\x39\x05\x41\x64\xf3\x1b\xd3\xd3\xaf\xa9\x06\xca\xc0\x8b\xae\x16\xbd\xb6\xe0\x50\xac\x98\xca\xaf\x56\x0b\x94\xdf\xa8\x47\xe5\x2d\xe0\xc5\x27\x1f\xb6\x16\xbf\x70\xad\xd5\x35\x07\xd9\xd0\x90\xbf\x2c\x86\x88\x86\x2e\x6f\x54\x9f\x69\xd8\x49\xc6\x6a\x4d\xbf\x1d\x75\xa3\xc5\xe8\xe4\x7a\xb0\x08\x17\x8f\x7a\xad\xbe\xfa\xf8\xb6\xbc\x6e\x87\x47\x08\x6f\x34\xbf\xa6\xd1\x20\x41\xa3\x57\x37\x71\x30\x72\xf4\x39\x4e\x1d\x6b\x2f\x84\x60\xec\xc5\x87\xa1\x9d\x52\x7c\x43\xfd\x5e\x07\x8c\xf7\xf8\x49\x14\x6f\xc7\x0f\xf1\x2f\xba\x9a\x3c\x6a\xbd\xb7\xa9\xe2\xba\xb3\xc1\x27\xe9\x61\xa4\x6d\x1b\x06\x32\xd7\x86\xe0\x37\x77\x54\xa5\xf3\xf9\x79\x5b\xeb\x84\xf0\x1e\x1d\x4a\x76\x0f\x49\xd4\xd1\x51\x8f\x12\x3f\x92\xd3\x17\xcf\xda\xd5\x0d\x1e\x03\xdd\x5d\x09\xba\x63\xa5\x99\x3c\xde\x6b\x0a\xc1\x3c\x15\x30\x26\x7d\x2a\x3b\xac\xa6\x62\xb2\xea\x1b\xd9\xec\xb5\x30\x43\xe3\xdf\x89\x60\x53\x6f\xec\xbc\x21\xa2\xd4\x6c\xac\x88\xc5\x72\x95\x76\x42\x11\x77\x50\x88\x3d\x89\x6c\x08\x59\x49\xbd\x60\xde\xd0\x7f\xfa\xec\x4c\x93\xea\x3b\x19\x55\x73\x83\x6f\xcb\xd9\x6c\xbb\xc3\x6f\xae\xd2\xa1\x37\xae\x56\xdd\x3f\x6f\xc8\x4b\xc4\x8d\x25\x0f\x15\x1b\x49\xbb\xbd\x56\x8b\xca\xf9\x91\xa1\x56\x52\xd7\x92\xd0\x01\x6d\x2c\x99\x61\xf3\xf7\xae\x5a\x34\x2c\xe5\x25\x69\xa4\xb1\x55\xe0\x78\x08\x89\xfa\xd6\x74\xd5\x2b\x8a\xab\xa5\x57\x0e\xd1\x68\xd6\x96\xba\xdc\xe0\x17\x72\x4b\x4f\x64\xc5\x53\x5a\xf9\x1a\x34\xbe\x00\x79\xd4\x3b\xcd\x15\x5a\xdc\x0d\x19\xff\x95\x4b\x9a\xbc\x23\x76\x7a\x12\x37\xc3\xca\xb4\xad\x38\xcf\xc5\xdb\x70\x5f\x8d\xb9\x29\xaf\xd8\xe2\xc6\xe1\x3c\x36\x9f\xaf\xbe\xbd\x63\x9c\xbe\xa8\xc6\xd4\x88\x2f\xfe\x7e\xda\x6b\xa4\x7a\x16\x1f\xe4\xa2\xb8\xca\x90\x73\x74\x16\xdf\xb4\x45\xa4\xa6\x0e\x28\x21\x1f\x6f\x70\xc1\x51\x6e\x70\x51\x5c\x92\x8a\xa6\x0c\x12\x2e\x19\x1d\xc9\x39\x4b\x52\x20\x9d\xcf\xb7\xf6\xe2\x9f\xc5\xe8\x67\x64\x6b\xa9\x34\x62\xb0\xf9\x57\x5e\xc8\x2e\xdf\xab\xc6\xf8\xec\xae\xb8\xab\x66\xd3\x2c\x10\x18\x17\x54\x6f\x67\xe5\xdc\x75\x0f\x13\xc5\x4c\xbe\x16\xa6\x29\x01\xfd\xa2\xb1\xd4\xc3\x86\xa8\x77\xd1\xd5\xf8\xce\xa1\x45\x47\x06\x2c\xf9\x0e\x4a\x3a\xa9\xdb\xe0\xcf\xe6\x60\xfa\x2e\xba\x5f\x1d\x41\x36\x40\xbc\x86\xeb\x54\xcd\x51\x57\x47\x41\x89\xe8\x2d\x57\x3c\x88\x46\xa9\xc5\xa9\x94\x4a\x32\x20\x0a\x42\x99\x00\x9f\x50\x73\x78\x2d\xb6\x16\x64\xc6\x31\x7c\x94\xd3\x6f\xf7\xd0\xd4\xa8\x3e\x38\x27\x2e\x1c\xa3\xee\xc3\xd8\x76\x43\x85\x81\x9f\xfa\x55\x19\x74\x95\x7a\xe0\xa2\xa1\xa1\x7f\xa0\x23\x80\x62\xff\x58\x51\xb0\x51\x11\x54\x09\xe7\x90\xb2\xb4\x7a\xf9\x5a\x6d\x10\x55\x08\x03\x0d\x95\x8d\x95\x57\x4e\x1c\x03\x57\xab\x8e\xc8\x4c\xdc\x5a\x93\x27\xee\xc4\xc2\x8e\x0d\x09\x21\x14\x68\xea\xb2\x07\xa8\xea\x8a\xa6\xd9\x92\xb4\x47\x4c\xd1\xe9\xab\xbb\x4c\xd0\xdc\x0c\x86\xe5\x7a\xef\x5f\xae\x85\x6f\x29\x5f\x1f\x6c\x34\xd0\xf5\xa1\x97\x3a\xbe\xc9\x65\xae\xf0\x53\x42\x22\x77\x9a\x71\x58\x6c\xbd\xea\x44\x91\x88\x7a\x4d\x79\x77\x69\x2a\x57\x6c\x9a\x4b\x26\xbd\x96\x97\x31\xd6\x88\xab\x87\xfe\x74\x74\xd2\xf1\xbb\x7e\x38\xba\x6f\x39\x9d\x56\x18\x54\x56\x25\x96\xdf\x7c\xaa\x81\x9c\x8a\x90\x9c\x90\xf3\x0f\x0d\x04\x59\xec\x0a\x63\x9f\x0d\xfd\x38\x62\x87\x2c\x43\x68\x80\xa3\x3c\xe9\xf1\x74\x9b\x3c\x28\x9a\x0f\xe1\x9c\x7c\x9b\x34\xba\xe9\xc4\xe9\xb5\x16\x6d\x9b\x67\x0d\x6d\xcd\x99\xcf\x4b\xc6\x1a\x77\x15\x9f\xcd\x6e\xed\x89\x9f\x95\x7c\xa1\x2c\x63\x21\x25\xf6\x01\x75\xcf\x00\x91\x32\x7e\xba\x08\x6e\x79\x5b\x55\x5c\x43\x18\x7e\x76\xce\x99\x40\xac\x04\x8c\xbd\xbd\x96\x2b\xf9\xf6\x5a\xe0\x0b\xcb\x06\x36\xc4\xdd\xed\x46\x47\x73\x71\x0d\xd7\x10\x12\x61\xc3\x23\x07\x6c\x98\xeb\xe8\xf8\x9c\x84\x6d\x76\x4a\x81\x9f\x23\x37\xd2\x4f\x7c\xa3\x15\x57\xef\x82\x6d\x9b\x09\x93\x2d\x62\xb6\xc4\xb1\xcd\xa4\xa1\x5e\xa7\x49\x63\xc1\xa5\x7b\x98\xcd\xaa\xc5\x37\x22\x47\x61\xdd\x26\x45\x89\x96\x1a\x1e\x7e\x10\x4d\x84\x2c\x8f\x56\x44\xb2\x05\xc6\x43\xf2\xe3\x11\x4c\x88\xc0\x3e\x66\x7a\xad\x52\x6a\x44\x75\x51\xe0\x57\x19\x7e\xad\x45\xc5\x12\x50\x62\x92\xbe\xd7\xcd\xf3\xa9\x26\x7e\x2a\xa1\x2c\x37\x62\x43\xc8\x0d\xee\xac\x4e\x6b\x39\x1a\xb5\xa6\x36\xbe\x0f\x20\x2c\x20\x77\xce\x27\xcc\x01\x18\xde\x45\x23\xfa\xa4\x43\xe3\x8f\x97\x7a\x76\xab\xa8\xcc\x89\xdf\xd5\x18\xbb\x76\xf4\x17\x1f\xce\xfe\x27\xe7\xff\xe2\xf1\xe7\x99\x0c\x2a\x02\xf8\x5d\xa7\x3a\xe6\x9d\x15\x10\x8e\x20\x68\x22\x21\x5f\x85\xc9\x3d\x89\x8f\xb6\x91\x0c\xd1\xad\x92\x2d\x76\xd9\x42\x5a\xbb\x12\x49\x8f\xdb\xdc\x5d\xaa\x24\x91\xa7\x6d\xec\x92\x35\x11\x7f\xde\x85\xa7\xe6\xae\x3e\xea\xf5\x09\x71\xd8\x1f\x76\x06\x74\x21\x30\x0e\xfb\xc3\xbe\xae\x5d\xf8\xba\x76\xe1\xeb\x0c\x3e\xce\x6c\xa4\xc4\x5b\x7a\xdc\x26\x32\xb4\xeb\x36\x11\xaa\x07\xb6\x42\xd4\x2b\xaf\xeb\x9b\xb4\x47\x62\xa0\x38\x97\xb8\x15\x4f\xef\x96\x3d\x46\x6c\xf0\xfe\xc6\xc3\x0e\x6e\x56\x31\xd5\x9f\xa6\x28\x4e\x69\x9d\x61\xaa\x4f\xcf\x94\x94\xe0\x12\x53\xfd\xec\x51\xbd\xac\x5c\x65\xdb\x69\x6a\x4e\x44\xcd\x88\x93\x20\x95\x51\x19\xa9\xfe\xde\x81\x53\xcd\x4a\xfb\xc5\x88\x2d\x71\x07\xef\xd2\x00\x50\x36\x7f\x73\xa5\x51\xdc\xaa\x32\x6a\x02\x4b\x55\xab\x0b\x27\xdf\xf9\x9c\x9a\x54\x18\xaf\x90\xfe\xb5\x50\xe8\xeb\x2d\x8f\xbc\x71\x7f\xb8\x2e\xa9\x81\x0f\x13\x50\x24\x78\x20\xd9\x83\x85\xa1\x2b\x7e\x76\xce\xa1\xb8\x98\xfc\xf7\x4e\x92\xfb\x3b\x4b\xee\x44\x2e\x83\x68\xfb\x48\x09\x8f\xc2\x4e\x2b\x6d\xad\xc8\x79\xb2\xb8\xb3\xd6\x37\x92\x2f\x5d\xa2\x6b\x0d\xe0\x40\xfc\x27\x70\xa0\x05\xdc\x70\x04\x5f\x5e\x03\x5e\xad\xb8\x06\xbc\x81\xfb\x22\x35\x74\x0f\xdf\xf0\x87\xc4\xb2\xcd\x23\xc5\x44\xf9\x59\xbb\xb9\x11\x11\x7c\x6e\xc4\x41\x6a\x32\x8b\x82\x81\xd7\x23\xdb\xf6\x2f\xf7\xe2\xea\xd0\xba\xb0\xff\xc3\x06\x5f\x1d\x5a\xd4\x96\x62\x53\x7c\xd9\x2c\x89\x86\xc9\x47\x2f\x9a\xb3\xec\xe4\xee\xfc\x58\x78\xae\x64\x72\x64\xeb\x55\xa3\x7a\x75\x88\x1d\x70\x00\xb8\x4a\x38\xe9\x4e\xe4\x21\xdb\x6f\x0a\x93\xf1\x25\xf1\x24\x72\x1c\x2a\xdb\xc6\xae\x78\x2e\x55\x15\xfa\x73\xd0\x07\x7c\x19\x61\x7a\x32\x5b\xbe\xaf\x90\xc7\xea\xa8\x21\x1e\x57\xbf\xbd\xd2\x58\x62\x32\x53\x20\x10\x29\x38\x36\xd2\x98\xc9\xf5\xcc\xe1\x33\x90\x12\x22\xa4\x3e\xe4\xd2\xc1\xac\xbf\xcc\x95\x44\xed\xe8\x52\xa4\x72\xdb\x8a\x87\x85\xca\x3c\x48\xc6\x7b\x67\x19\x69\x75\x61\x5c\x34\xf0\x40\x95\x6c\x4e\x68\xf2\x82\xc2\x89\x47\x65\x4a\x10\xc5\xbd\x44\xea\x00\x7a\xf3\x87\x57\x61\xd5\x61\xb2\xb2\xf9\xa8\x9f\x1f\xaf\x9a\x1a\xc5\xf4\xf0\xa4\x4e\xc8\x75\x50\x11\xbf\xf9\x8b\x56\x91\x4f\xf5\xd7\x1e\xbf\xe0\x62\xbf\x34\x27\xc1\xef\x6a\x09\x85\xc6\xd5\x4d\xd2\x40\x8c\xa5\xce\xe7\x6c\xdd\x9c\xdd\x68\xb3\x77\x2a\xe5\x8a\xd1\x8d\xea\x49\x00\x92\x82\x7f\x2b\x6a\x8b\x8f\x12\x94\x5e\x3c\x6b\xb5\x1b\x7c\x05\x9a\x87\x9a\x58\x30\x7d\x2a\x97\x49\x52\xe5\x50\x4b\xab\x1c\xea\xd2\x64\xef\x58\x5a\x29\x2e\x96\x9d\xa0\xd6\x96\x2e\x17\x4c\xa9\xa7\x3f\xea\x68\x48\xc6\xec\x1d\xdd\x10\x8a\x65\x83\x52\xd8\xf2\x23\x39\xf4\xbd\xa3\x19\xcb\x36\xea\xb5\x55\x3a\x82\x7e\x1c\x69\x88\xc6\x36\xea\x62\x50\x31\x76\xe4\xbc\x3d\xad\x38\x7f\xd5\xdb\xe2\x98\x6c\x42\x0f\x4f\xd3\xc4\x9d\x2d\x67\x86\x31\x1d\x37\xab\xfc\xb0\xfe\x55\x24\x57\x36\x0c\xde\xd0\x69\x4a\x61\x78\x0e\xc6\x88\x72\xd4\x5f\x1f\xc1\xa0\xf2\x45\xf2\xe6\x98\x9f\xc5\xa2\x11\x8b\x1f\xd6\xb3\x63\x73\x4b\x28\x99\x55\x19\x5d\xa7\xbc\x46\xdc\xde\x44\x9e\x5a\xfb\x54\x3f\x7c\xd5\xa2\xa7\x1d\xe5\xbb\xc8\x87\x4d\xea\x41\x5a\x8a\x3f\xf1\x26\x00\xac\xc3\xe5\x87\xec\x7d\x21\x85\xc9\xd6\xa3\x66\x47\xf2\x30\x85\xcc\xfb\x9b\x98\x62\x96\xb8\x9a\xd2\x7c\x77\x92\x3c\xeb\xa4\x3b\x00\x26\xe9\xac\xea\x62\x05\xd3\x92\xd2\x5e\x3f\x75\xb8\xf5\xb5\x18\x1f\x6c\xee\x25\x7a\xa3\x29\x7e\x3d\xe1\xc6\xd5\xab\x38\x4e\x84\x7d\xc9\x7a\xfa\x34\xe2\x3e\xdf\x96\x9e\xcd\xb6\x1a\x5a\x14\x0d\x56\xc2\x92\xb8\x1b\x97\xc7\x18\xde\x8a\x83\x64\xe4\x44\x37\x32\x64\x76\xad\x73\xe1\x01\xd3\x05\x0a\x82\x33\x92\x84\xc0\x95\xf3\xb6\x90\x29\xc2\x2e\xff\x0f\x6e\x5b\x60\xfc\x11\xa7\xe5\x64\x59\x8e\x98\xe2\xd7\x9b\x87\x32\x0d\xac\x89\xe8\xa4\x9b\x64\xe8\x5f\xd4\x98\xf5\x35\xce\xc7\x23\x46\x77\x17\x79\x00\x67\x8b\xd5\x7f\xcf\xdc\xdc\x80\xfa\xf5\x3a\xb5\x97\xae\xa4\x5f\xca\xb9\x90\x1a\xa7\x84\x7f\x43\x73\x8c\xb1\x46\xef\xbf\xfb\x14\xd7\xe1\xf9\xf7\xbf\x55\x8f\x87\xf5\x1b\xd5\x77\x16\xa0\x84\x82\x53\x5a\xa7\xe2\x00\xa7\x2a\x53\x7d\x74\x13\x39\x66\xe0\x96\x0e\xcf\x94\xdb\x82\x80\x08\x2b\xae\x73\x2e\x3a\x14\x3c\x23\x01\xe2\x09\xa1\x7a\xf0\x6f\x78\x8b\x18\xfc\x9b\x49\x7a\x2e\x3e\x3d\x03\x41\x5b\x73\x08\x6b\x99\x4a\x8f\xf3\x95\x1b\x26\xb3\x9d\x9e\xb1\x7e\x82\x7f\xf3\x13\xdb\xe9\x19\x76\x10\xbe\xbf\x01\x62\x8a\x20\xbd\x4f\x40\xca\xe0\x10\x76\xf1\xac\xc9\x18\x24\x14\x8b\xaf\x6f\xa6\xc3\x05\x49\x47\x88\x8f\x42\x9c\x44\x60\xbd\xe3\xe0\xe6\x39\x08\x68\x70\x5a\xe4\x76\x50\x1c\x69\x20\x5a\xf6\xa9\xde\x98\x82\x29\xf5\xb1\x47\x35\x77\xe5\x5b\x75\xd5\xb6\x20\xbc\x59\xc0\x81\xd3\xc1\xce\x07\xc5\xae\xf8\x7d\x35\xa5\xb8\x90\xa3\x72\xe6\xd9\x91\x24\x1a\x10\x4c\xe8\x27\x65\x7b\x52\xaa\xa5\x4a\xf3\xbc\xec\x5f\x80\x80\x94\x56\x21\xd4\xd2\x2a\x04\xd0\x84\xc4\x9a\x83\x4a\xc4\x09\xd8\xb9\x1a\x3e\xa0\xe3\x72\xcc\x79\xbe\x79\x37\x5a\xf8\xa5\x1c\x5a\x5b\x21\x87\xfe\xba\x51\xb4\x42\xbf\x09\x44\xab\xe5\x87\x4f\x69\x14\x3a\x76\xb8\xa9\x07\x08\x70\x0d\xcd\x41\x8b\x5f\x60\x53\x35\x3d\xe6\x9b\x6a\x4c\x70\xd5\xe4\x21\x83\xb5\x85\x21\xd4\x29\x2f\xb8\xe4\xa2\x8a\xdf\x33\x5c\x5d\x6b\x57\x63\x8a\xcc\x06\x39\x3e\xcf\x79\xdc\x9e\xdd\xf4\x09\xbf\x62\x81\x4b\x0b\xfe\x33\xba\xe4\xbd\x1c\xd3\x05\xee\xf6\x28\x82\x8c\x87\x2a\xe6\xbe\xdc\xa1\xd4\x94\x26\xaa\xb4\xbc\x72\x63\x81\x1d\xeb\xf0\xcd\x66\xa4\xa1\x9a\xf0\xc7\xbd\x5f\xb0\xde\xff\xfb\x0e\xf9\xc2\x09\x96\xea\x49\x10\x44\xaf\x3c\x50\x8a\x8f\x03\xb4\xf0\x60\xf5\xf9\x56\xe8\xd9\xec\xac\xe3\x99\x75\x76\xec\x31\x9f\xa8\xe6\xea\x4f\x2d\x7c\xda\xa3\x4b\xc9\xe7\x4d\x76\xd4\xf0\xb8\xda\xd0\xe0\x66\x9a\xe8\xd3\x23\x2e\x79\x68\x6b\x0d\x86\x34\xc3\xf4\x49\xc1\x0c\x60\x30\xe1\xb5\x19\xe8\xc7\x3d\x72\x7d\x4c\x35\x0f\x37\xb0\x8b\x7d\xa8\x12\x76\x34\x0f\x65\xb3\x6b\x0d\xf6\x37\x0a\xe3\x0c\x6a\xa0\x06\xb9\x6d\x69\x6d\xb8\x6b\x85\xe7\xca\xed\x85\x70\x83\xc6\x0a\xc3\xa2\x6f\x13\xae\x30\xf2\xe3\x92\x2e\xc2\xdf\x5c\xd2\x46\xd0\x5b\x45\x0b\x74\xea\x13\x17\x07\xfa\x86\x47\x7c\x1c\xe8\x67\x1e\xf1\x70\xa0\xbf\x78\xa4\x81\xca\x3c\xd7\xe3\xb9\x0d\x9e\xeb\xf2\x5c\x1f\x99\x81\xd5\x81\x78\xd6\x8b\x6f\x9c\xa8\xba\x8d\xf4\x43\xe8\xf9\xdc\x4a\x84\x07\x0f\xa5\xb1\xd5\x6f\xd3\xd5\x6f\x5c\x61\x57\xa5\xf8\x97\x1d\x35\xa4\xb2\x86\x4d\xc7\xed\x50\x90\x87\x4f\x2c\xe5\x1b\x37\x7a\x14\x09\xa2\x66\x84\xcc\x57\x87\x2f\x9c\xc1\xb3\xed\x8b\xdb\x97\x40\x8c\x0d\x5f\x5a\x73\x71\x42\xc6\x0d\x42\x2d\xdf\xc6\x01\x69\xe8\x1e\x1d\xd1\x61\x6f\x3c\x70\x7d\xdc\x26\x0d\x3d\xa0\x5e\xe0\x8f\x70\x87\x34\xf4\xf1\xd0\x1f\xf4\x07\x7e\x63\x88\x43\xd2\xb0\x6e\x3d\x1b\xf7\x49\xc3\x7a\x9f\x52\x1b\x0f\x49\xc3\x9a\xda\xf3\xf9\xe9\x11\x95\x8b\xa2\x11\xbf\xaa\x7a\x1a\xd2\x72\x83\xfc\x16\xeb\xde\xc7\xe3\x96\x96\x38\xe5\x52\xeb\xfa\xcd\xe6\xd1\x6a\xbd\x31\xe3\xa3\xfa\xb3\xab\xbd\x1c\x52\x1c\x4e\x29\xc2\x67\x3d\xb6\x77\x04\x08\x4f\x7b\xc9\x47\x55\xd5\xc9\x1f\x9a\x65\x8b\x96\xad\xde\x22\xfe\xec\xfa\xc3\x21\x0d\xfc\xf2\x75\x48\x73\xc3\x5c\xbf\x43\x73\x94\x6d\x3a\xb9\x67\xfe\xcb\x41\xb9\x93\x2a\xd5\x3a\x28\x37\xf1\x17\x68\x81\xdb\xac\xaf\x56\x3f\xd9\xd7\xd3\x9f\xfb\xc2\x2e\xef\x6d\x0b\x7f\x8b\xba\xbb\x0a\x65\xf3\x1b\xac\xa3\xdc\x0b\xef\xce\x45\x39\xda\xa5\xac\xa3\x00\xf7\x71\x88\xf0\x6d\x6a\x58\x0f\xc1\xff\x1d\xb2\x7a\x09\x64\xcd\x52\xad\x9e\xff\xe7\x01\x88\xa6\x4f\x27\xab\x11\xe4\x22\x8e\x1c\xdc\x41\xf8\x39\xa4\x69\x77\x4b\x91\x87\xd0\x9b\x5e\x66\x38\x76\x9b\x99\x51\xaf\xd7\x71\x18\xdb\x8c\x7c\x8b\xd2\x61\x39\xb3\x9e\x6b\xe8\xa3\xde\x3d\x10\x18\xdb\x93\x17\xf2\x45\xca\xf4\x98\x89\x09\x0d\xb4\x90\x71\x1f\xa7\xc7\xb8\x59\xc5\x4f\xe2\xa3\x23\x2e\x1c\xa4\x4a\xf6\x58\x3f\xd6\x3c\xc1\x8a\x1c\xec\xa1\x85\x29\x78\x78\x67\x85\xfe\x4c\x56\x61\x9b\x4b\xb4\x05\x58\x34\x3a\x75\x4d\x8f\xd9\xe1\x25\x9f\x88\x9a\xfe\x5b\x71\xfd\xc5\x19\x6b\x78\xa3\xc1\xae\xcb\xea\x3a\x36\x71\xa5\x38\xe6\x29\x12\xca\x09\x97\x67\x52\xee\xec\xc5\x09\x01\xbb\x60\xf2\x05\xf1\x3e\x29\x72\x72\xe4\xa9\x43\x73\x6e\xae\xd3\x00\x7c\x5b\xae\xbd\x32\x0a\xcd\xf3\x35\x37\x7e\x78\xbe\x96\xe6\xd5\xcf\xd7\xc8\x7c\xbe\x5e\x36\xaf\x4e\x39\x15\xbd\x1d\xae\xf2\xcd\x61\x9e\x46\x3e\x3b\x31\xd5\xef\xfa\x6a\x9f\xbc\xd1\x15\xee\xa8\x9e\xaf\xbf\x74\x47\x05\x0e\x37\xc0\xfb\x86\xb9\xd1\xd2\x5c\xfc\x70\x13\x1b\x41\x23\x54\xf1\x80\xc1\x94\x13\x59\x6b\x06\x64\xac\x19\xa9\xe4\x02\xe2\x71\x13\xb9\xcf\xa1\xbb\x3e\xf1\xb8\x92\x6c\x72\x82\xb9\x9c\xe6\x55\xae\x7e\x96\xd7\x0c\xf6\xe3\xba\x59\x3e\x0b\x96\x61\x5f\x69\xc4\x34\x3e\x51\xed\xb5\x13\x2e\x36\x1c\xa9\xa1\x7c\xe0\xde\x2d\xb9\xe7\x52\x0f\xcd\xe7\xda\xfd\xab\x76\x56\x4d\x9e\xca\x28\x79\x88\x0e\x5f\xe6\x31\x2b\x49\x31\x25\xc4\xe3\xda\xa2\x24\xac\xae\x84\xd5\x15\xb0\xa2\xc5\x82\xc3\xb8\x3a\xde\xe6\x1b\x55\xdf\x88\x3c\xa4\xdc\x7e\xba\x42\x35\xc9\x1a\x8c\x62\x97\xbb\xb9\x76\x97\x42\x6a\x21\x91\xfa\xc1\x53\x39\x1c\x4a\xfa\x61\x97\x09\x40\x69\xd7\xbf\x22\x50\x67\x66\x38\xa2\x23\xbf\xcc\x83\x37\x29\xf8\x7a\x54\xde\x67\xb8\xf3\xf9\x33\x97\x4a\xcd\xb4\xb9\xbb\x1b\x1d\xfc\xee\xfa\x44\xc6\x28\x5a\x2b\x2c\x9e\xb5\x47\x6e\xb6\xce\x46\x72\x56\xa5\xe4\xf3\x64\x4a\xcb\x6b\x06\x7e\xff\x60\xf9\x78\xfa\x41\xe5\x99\x84\x3c\x0a\xe5\x46\x2d\xf2\x6f\xb1\xca\x07\xfe\x9a\x0c\x80\x73\xd7\x5f\xe1\x02\x5f\xea\xbc\xee\xfa\xf2\x78\x7d\xd7\x27\x14\x4b\xa2\xe7\x76\x9a\x52\xf9\x29\x9c\x67\xf7\xf9\x41\xf4\xa8\xbb\x7c\x70\xac\x3a\x42\xf7\xf1\xd3\x97\xc5\x6b\x8e\xd4\x97\x9d\x32\xf1\xbc\x1c\x25\x72\x67\x86\x41\xd0\x59\x7e\xf3\xff\x12\x48\x58\x2a\x6b\x85\x32\xf7\x52\x90\x56\xdd\x3c\xae\x70\x51\x04\x95\x9a\x37\x09\x3e\x06\x7a\x6e\xd1\x29\x78\x91\xd1\xc4\x07\x0e\xc4\x82\x7f\x7a\x42\x4a\xea\xb9\x48\xe5\x31\x58\x64\xea\x4f\x91\x3a\xaa\xa9\xa9\x49\x9f\x0c\x32\x55\x7a\x65\xf8\xd5\x67\xeb\x52\xb1\x2f\x56\x3a\x5c\x44\x10\xc9\x6a\xfc\x34\x13\x7f\x70\x5d\x17\x08\xc3\xb9\xbb\x2e\x45\x38\x56\x42\x63\xd0\x3c\x9f\x9f\xe1\xb8\x34\x9f\x92\xd4\x6d\xe8\xe3\xf2\x6d\xa8\x46\x55\x3f\xa0\xe0\xba\x68\x14\x5d\x90\x0a\x1f\x46\xe6\xa3\xfe\xf4\x94\x7a\x20\xcf\xf5\x43\x8a\x14\x76\xd7\xaf\xb4\x8e\x68\xf9\x75\x48\x13\xc1\x34\xd6\x40\xc9\x64\xdd\xb8\xb6\xa2\x6a\x70\xe0\x9d\x9d\xb0\x93\xe0\x68\x84\x79\x17\x5f\x52\x1d\x81\x56\xd9\x5b\x28\xbe\xa0\x04\xee\x62\xb3\x88\xb5\x02\xe8\xdd\xe9\x97\xe7\x9d\xc7\xc4\xd3\x82\xa7\x9b\xe5\x70\xf9\xd0\xe6\x5b\xf4\xa0\x31\x14\xf7\x42\x6f\xe2\xac\xf5\x26\xa2\x53\x89\x2f\xeb\x97\x27\x7c\x26\xc3\xf7\x49\x9f\x12\x70\x1c\xfc\xc4\x24\x65\x9e\x76\xb5\xa1\x44\x62\x3e\x6a\x57\x7a\x3d\x5a\xbe\xfb\x29\x43\x3a\x2f\x9e\xb5\x27\xae\xcc\xff\xf6\xb3\xaf\x3d\x25\xdf\xd1\x44\x5b\x92\x81\x79\x7c\x37\x03\x1e\x53\xdc\x52\x53\x18\x91\x10\x72\xf7\x93\xf1\x95\x02\x0f\xd8\xca\x03\xb9\x6b\xef\x6d\x30\xcb\x6a\x87\x14\x21\xe4\x92\x92\x61\x7a\xe4\xf9\x46\xcb\x53\xfd\xbd\xe9\xfb\x9d\xaa\xdf\x19\x01\xab\x66\x5c\x46\x49\x7a\x42\x15\xcd\x59\x2a\xf8\xc4\x44\x7b\x77\x29\xf9\x19\xbb\x08\x95\x5d\xe2\x09\x97\x47\x84\x42\x38\xe9\x56\x07\x17\x0c\xe3\xc0\xab\x78\x64\xab\x9c\x2f\x18\xc6\x0f\x1e\xb5\x32\xbf\x85\x30\xeb\xce\x3a\x3c\x04\x8f\x0d\xec\x2f\x21\x84\xea\x3f\x6b\x77\xe7\x2f\xb5\x9b\x5f\x87\x57\xff\x3e\x7c\x3a\xbf\xaf\x38\xc4\x63\xad\x9a\x6f\x2d\xc9\x36\x28\x8f\x3f\x7a\xf8\xaa\x39\x38\x2f\xd3\x70\x94\x89\xa2\xa2\xe7\xbc\xa8\xcb\x8a\xba\xa2\xe8\xb9\x2c\x7a\xee\x47\x5a\xe3\x13\x38\xf5\x3b\x24\xef\x20\x11\xe5\xfb\x67\x95\x1d\x8e\xc4\x5b\xe4\x51\x22\xba\x77\x2c\x45\x24\x02\x4b\x64\x00\xd1\x93\xf6\x7c\x3e\x6d\xa3\x6c\xd6\x58\x23\xf4\x7f\x9c\x0a\x2d\xd3\x4d\x67\xf1\x0d\x66\x31\xa9\xc4\x7d\x4a\x29\x71\x65\x18\xed\xab\x8d\x98\x4a\x52\x57\x2d\x3f\xbf\x88\x75\xed\xc4\xb1\xae\xef\x7e\x8a\xda\x1c\xf5\xf2\x78\x7e\x3c\x26\xae\xb0\x0b\x1b\x12\x6f\xf1\xac\xfd\x4c\x07\xb9\x7e\xb9\xd1\x56\x50\x7d\x8f\x18\xe6\xcb\xbb\x22\x7d\x98\xe3\xa9\xf2\xb5\x78\xd6\x5e\x38\xa9\xbe\xc0\x00\xef\xc7\x2b\xb6\x61\x19\xb9\xbf\xb7\x10\xa5\x1e\xcf\x97\x98\x79\xef\x55\x9b\x80\x57\x0f\x51\x62\xd9\xc4\xa8\xf7\xaa\x0d\x4f\xa3\x02\xbd\xe5\x7b\x23\xfe\x66\x57\x15\x37\x37\xd8\x90\x5e\x6e\x52\x43\x9a\x0c\xb9\xeb\xfb\x8d\x1b\xfc\x72\x83\xcc\x0d\x68\x8f\x7a\xc9\x6b\x2f\x19\x8c\x6e\x32\xc4\xb1\x21\xe3\x64\xc8\xa3\xd1\xe1\xab\x91\x46\xf1\x99\xf0\xe4\x73\xdc\x00\xab\x00\x2e\x49\x2f\xcc\x31\xd5\x36\x96\x96\xac\x8c\x37\x37\xe1\x6e\xd2\xeb\x5f\xd5\x5f\x48\x78\x12\x94\xf2\x12\x55\x4e\xf0\x5b\xb0\xef\x43\x66\xdb\x89\xb2\x0d\x56\x3d\x41\x55\x0a\x36\x68\x4d\x43\x9f\x1b\x69\x6c\xfc\x2e\x10\x63\xf1\xac\xd1\x1a\xde\xb8\x41\xe6\x37\x5a\x63\xbd\xf7\x3b\x74\x96\xd6\xde\x4a\x09\x61\x32\xb4\x2e\xec\x84\x95\x1a\x9d\xcf\x65\x66\x0f\x45\x8d\x0a\x6f\x45\xe7\xd2\x01\x84\xdc\x79\xef\xc7\x1a\x8a\xab\xcb\xa9\x1d\x9c\x23\x33\x1f\x11\x8a\x60\xe3\xbd\x57\xed\x6a\x16\x05\x98\x52\xb3\xd7\x68\x44\x95\x93\x16\x3b\xf2\x24\xa8\x32\x7a\xe0\x67\xae\xc0\x9c\x0b\x17\x95\xf0\xc8\x5f\xef\xcd\xe7\xae\x55\xff\xb0\x79\xb0\x2d\xc5\xb4\xb0\xaf\x01\x22\x12\xf8\x5e\xd1\x96\x83\x3e\x99\xec\xc8\xda\x71\xc0\xd6\x02\xda\x89\x16\x8e\x04\x8a\x83\x28\x87\x74\x72\x21\xed\x62\xa6\x30\x7f\x1c\xe5\xc7\x8d\x65\x33\xa3\xdf\x85\x5c\x2e\x9a\x25\x05\xfb\xd9\xac\x96\x68\x5a\x86\xe8\x11\x38\xef\xbd\x6a\x67\xa7\x22\x91\xf5\x91\x88\xd2\x53\x8b\x1c\x76\x82\xa6\x6e\x28\x19\xc4\xf9\x84\x38\xf3\xb9\xc1\x3f\x9a\xbe\xe4\x16\xb7\x43\x22\x4e\x8b\xcf\x97\x82\x44\x9f\x35\xa7\x86\xc7\x70\xd5\xec\xd4\xb8\x70\xd9\x72\x21\xfa\x65\x82\x68\x9d\xda\x8a\xe0\xfd\x60\x8f\x92\xb8\x51\xec\x0e\x93\x7e\x26\xfd\x85\x79\x49\x57\x44\x4a\x13\x55\xa1\x50\xcb\x25\x8f\x82\x59\xde\x0e\xb1\x14\x8c\xc5\x30\xc0\xdf\x7a\x2a\x6c\x12\x17\x46\xc0\xd8\xf4\x49\x54\x6c\xb9\x71\x63\x06\xe8\xfb\x5f\x7e\x2d\x19\x9d\x2a\x7d\x3e\x5f\x6a\x5f\x07\xba\x92\xbe\x5f\x5a\x2e\xbc\xec\xb8\x5c\x9a\x49\x40\x90\x18\xaf\x20\xee\xee\x50\xe2\x46\x6f\xfa\x70\x61\x3b\xc8\xb8\x35\xf2\xb9\xc0\x5e\x2d\x15\x22\xd4\xaf\xf1\x83\x12\x78\xb6\x94\xe8\x72\x6b\x16\xb5\x4d\xb7\xad\xb9\x35\x26\xa4\xd5\xd8\x7f\xc2\xde\x27\xaa\x78\x5e\xa5\x1a\xfa\xf4\x6a\xf3\xb9\xc6\x1a\xf5\xdf\xd9\xfc\x2b\xb0\x5d\xb0\xfc\x05\x2e\x1a\x48\xda\x28\x7b\x35\x76\x4a\x04\x7b\x4d\x0a\xa6\x44\x71\x63\x50\x58\x08\xcd\x8c\xec\xcc\xfb\x57\xcd\xad\x25\x16\xc3\x25\xbc\x0f\x81\x45\xc0\x01\x9b\xcf\x01\x04\x85\x00\x83\x5a\xbc\x83\xa9\xac\x99\x9d\xb8\xda\xdc\x99\xcd\x5a\x3b\x19\x15\xf7\x7e\x44\x07\xa3\x0c\x0d\xbd\x8c\x1f\x7a\x99\x3e\x1d\xd0\xae\x3f\xf2\x07\xc3\x4c\x77\x3c\x1c\x65\x1c\x3f\x43\x07\x03\x3a\x1b\xae\x73\xb5\x9c\x75\x61\xaf\x11\x87\xf1\xa8\xaf\x1a\xe8\xb5\xc2\x51\x5c\x79\xd4\xf4\x33\x43\xda\xf5\x33\x1d\x3f\x0c\x46\xcd\x75\x69\x56\xd4\x8a\x34\xdb\x03\x19\x29\xd6\x1b\x0f\x28\x1b\x44\xb4\x95\x36\x28\xf1\xcc\x53\xb1\x14\x2d\x5b\x54\x6d\xce\x08\x1c\xd2\x82\x1a\x6c\x30\x8f\x24\x10\xcb\x64\xb0\xc2\x47\x6b\x73\xc6\x0f\x39\xe3\x90\x18\x4c\xb2\x5d\xc5\x7a\x97\x19\x2c\x2b\x8d\x65\xc7\x02\xde\x3f\xf2\x59\xbf\x26\xf0\x2c\xe6\x4e\x72\x4f\x9a\x64\xbb\x32\x19\xa8\xbf\xff\x61\x83\xc4\x64\xb5\x0e\xed\xef\xa2\xdb\x98\xd3\xca\x22\x39\x59\x44\x6a\x81\x42\x71\x75\x0d\xac\xff\x1f\xf1\xf7\x88\x5d\x8b\xa3\x43\x4b\xc0\x0a\x11\x8a\x5d\x46\xbd\x6e\xcd\x72\x6c\xc2\x53\x81\xa2\xcc\x4b\xc5\x3f\x45\x82\x71\x27\x59\x47\x34\xee\x88\x29\x47\x57\xc4\xe3\x90\x14\x90\x79\x25\xdb\x89\x06\xf8\x15\x9f\x4e\xf1\xb7\x68\x46\x84\x7f\x12\xb6\xf4\xe2\xc7\xe5\xaf\xda\xeb\x88\x22\x33\xa8\xa5\x76\xe3\x58\x1b\x71\x29\xaf\x41\x28\x83\x44\x73\xf2\x94\x61\x13\x6d\x6a\x54\xf7\x43\xef\x57\xab\xeb\x8b\x14\xb3\x70\x40\x58\x19\xb8\x4c\x8b\x81\xa6\x98\x02\xb8\x05\x02\xb9\x15\x8d\xc2\x0e\x00\xbc\x02\x53\xb9\x09\x50\xbe\x03\x94\x29\xd0\x03\x3b\xda\x06\x86\xba\xa8\xaf\xa2\xc0\x5e\x4c\xf0\x6f\x34\xa8\x8c\xec\xdf\x68\x70\xef\xac\xa7\x53\x8d\xe2\x80\x6a\x54\xdf\x68\xb1\x45\x95\x08\x2f\x6d\xba\x07\x22\x1d\xa2\x4b\x53\x6b\x7c\x68\x5b\xae\x4d\x18\xa0\x03\xcb\xb5\xf3\x90\xeb\xda\xe8\xbb\x93\x13\x3f\x17\x8f\x7a\x60\xac\x12\xee\x7e\xbe\x71\xeb\xee\xaf\x24\x3b\xc6\xbd\xae\xa3\x58\x67\x49\xcb\x38\x39\x88\xe9\x48\x3d\xc6\xca\xf5\xe1\x30\xb0\xa4\x56\x92\xc0\x97\x65\x08\xad\xfe\x4c\x7c\x17\xc4\xf7\x87\xf8\x2e\xda\xa9\x25\xef\x30\x12\x97\x14\x4e\x1c\x7d\x1c\x9a\x37\x7d\xd1\xbe\xde\x63\xbb\xe2\x75\x95\xe2\xa9\x2a\x51\x37\x6b\xaa\x01\x4b\x50\x8b\xc5\x75\x91\x26\x8d\x2a\xb9\x01\x57\xb3\x86\x83\x1a\x63\x17\x4d\xc1\x2e\x6e\x66\xdc\xdb\x76\x33\x61\xb4\xe5\x0a\xc9\xb4\xff\x16\xc9\xa5\xfd\x37\xf2\xc4\xcf\xa4\xd6\xec\xd0\x4e\xd9\xb9\xf7\xdf\xc0\xa7\xc6\x32\xce\x6f\x66\x1a\x32\x9b\x8c\x40\x03\x23\xe1\x0e\x71\x85\xf0\x1d\x97\x7d\x9c\x26\xcb\x2e\x8b\xf2\x4a\xd9\xf3\x55\x72\x68\x2b\x81\x96\x56\x43\x2b\x72\x7e\x3d\x9f\x17\xd7\xe0\xd1\x6e\xc4\xb8\x0f\xfb\x94\xb5\x04\xd1\xf0\x39\x9e\x06\xc1\xb8\xeb\x87\x23\x90\x42\x5a\x35\xdc\xac\x21\xb3\x05\xe2\xd3\xcd\xec\x0b\x0d\x75\x73\x26\x98\x0d\xb8\xdd\xaa\x0d\xcb\xb4\x69\x4a\x4c\x59\x53\xdb\xa2\x36\x69\x5a\x27\xbc\x7d\x41\x19\x28\xf7\x5b\x2d\x02\xa6\x9d\xc9\x32\x05\x56\x46\x5d\xcc\xaf\xff\x4b\x63\x7a\xe5\x63\x7a\x5d\x31\xa6\x3e\xd5\x14\xa0\xf0\x0a\xa0\x91\x79\xff\xa7\x32\x00\xb4\x3a\x11\xed\x04\xd0\xcd\x9a\xa2\x89\xb6\x1c\x1b\x5b\xae\x0d\x39\x8b\x67\xad\xcd\xc1\x6a\xff\xdf\x81\xa5\x74\xd9\xf9\xc7\x5d\x76\x78\x97\x9d\x15\x5d\xfe\x71\x94\x4b\x5d\x76\x6b\xc9\x73\xed\xe2\x59\xeb\xd6\x84\xa9\x64\x57\xac\xb4\x77\x0f\xe4\xd7\x47\x1e\xdc\xfd\x23\x24\x05\x83\xfd\x68\x74\xe1\x7b\xf8\x4a\x0a\x4c\x3e\x6c\xf3\xf7\x68\xe7\x33\xf1\x2e\x2d\xe5\x1f\x92\x84\xb5\xa4\x39\xd0\xbb\x07\xd6\x2e\x9a\xf8\x20\x94\xbf\x3a\x6e\x74\x7f\x70\x56\x13\x56\xc4\xdf\xbc\x48\x2f\x53\xee\x11\xe9\xb1\x57\x11\x7f\xcb\x42\x55\xf1\xd2\x16\x9b\xea\xf9\x4c\x71\x87\xc5\xd5\x61\x5f\xb8\xb0\x97\xd0\x88\xde\xf9\x0e\xf6\x70\xff\x1f\x60\x6e\x74\x15\x98\xd9\xf8\x7f\xd0\x8a\x51\x16\x6d\xe4\xe8\x6a\xc8\xdf\xbd\x7f\x02\xe7\xa3\x7e\xfd\x45\xd8\x1f\xbd\xd1\x55\xe3\x27\x89\x8d\x75\xf8\x5a\xa1\x65\x98\x5c\xba\x29\x12\xd0\x77\xf1\x03\x94\x80\x1f\xa3\x95\x46\x4e\x8f\xbd\x35\x92\xb4\x73\x7a\x69\x9b\xe2\x2f\x59\x13\x62\xf8\x63\x8f\x50\x73\x69\x42\x94\x81\x27\x06\xf8\xd8\x43\xa6\x18\xfb\xbb\x17\xc7\x24\xa1\x51\x6a\xa2\xaa\x38\x86\xfd\x7e\xd3\xe4\xb3\x39\x28\x8b\x4c\x4d\x42\xe1\xa0\x2f\xd0\xc4\xa3\x2b\x35\x56\x1c\x31\x12\xd3\xf9\xd8\xe3\x2e\x4a\xdf\xbe\x9e\x4d\x89\x8d\x8f\xf0\x1f\x60\xe3\x23\x64\xd8\x38\x90\xd3\x2c\x06\xa2\x0c\x54\x52\x28\x32\x23\x12\x5d\x1e\xf0\xc7\x48\x1d\xb0\x68\x18\x29\x55\xe2\x86\xbf\x46\xf3\x3f\xc2\xd1\xb7\x47\x3d\xfc\x8f\x48\xfa\x08\x01\x49\xd3\x8b\xaf\x8c\xb2\x18\x19\x3d\xea\xef\xf7\xcb\x42\xf9\xf0\x55\x59\x05\xc3\x57\x42\xa5\x5e\xfd\xa5\x8d\x63\xdc\x45\xd3\x0c\x7f\xc3\x46\x74\x12\x7f\xb8\xe7\x49\xd7\x9d\x28\x49\x20\x84\x5b\x3e\xe2\x68\x90\xf4\xab\x41\xaa\x1c\x2c\xac\x25\xd4\x8c\xd2\xbc\x6a\xf8\x5a\x71\xca\x94\xa1\x15\x16\x09\x93\x20\x19\x06\x37\x29\x2c\x14\x0a\xc3\x8b\xda\xe8\xc9\x36\xae\x97\xac\x16\x2f\xa8\xfa\xac\xf7\xc6\x87\x73\x62\xb7\x26\xde\xeb\x76\x29\x71\xe6\xf3\xd9\xab\x29\x15\xd6\x37\x3e\x7e\x15\x6e\xa7\x7f\xb9\x8a\xe6\xea\x59\xeb\xd5\x84\xc3\xf5\x9e\x60\xab\x1d\x87\xfc\x0a\xcc\x47\x3d\xbc\xe3\x1c\xf3\xba\x2d\xfd\xa4\x33\x0e\x6b\x3e\xea\x17\xf7\xc0\x60\x07\xfb\xdc\x17\xcf\xb4\x06\x9f\x57\x6d\x4a\x0a\x27\x5b\x8a\x0b\xf6\xd3\x0e\xaf\x97\xf0\x45\xde\xab\xa9\xd1\x84\x12\x8f\x6c\x97\x5c\x61\xc1\xdf\x8e\x13\xa9\x7b\xa5\x4b\x9b\x94\xcd\x2e\x34\x99\xb4\xd9\x9d\x5d\x2b\x2f\xbe\x53\xcd\x4c\xda\x29\x17\x1b\xe0\x12\x6a\x7c\x81\xcc\x9b\xd8\x30\x78\xe9\x4e\x0a\x3a\x49\x38\x21\x67\xd5\x0f\x3b\x80\xf7\xaa\x70\xe9\x7e\x2c\x1f\x6a\x9f\xf6\x13\xe9\x8f\xad\xa8\xbc\x3e\xe0\x91\x3d\xf4\xd3\x4e\x54\x76\x39\xed\xb0\xa3\x9f\x4e\x89\xcc\x3e\x9d\x32\x91\x12\xbe\x52\x3e\xe4\xc1\x98\xaf\xa6\xbe\xa5\xf6\x9c\xf8\x52\xca\x40\x66\xbf\xb6\x7c\x86\xa9\x45\xa6\xff\xec\xf8\x11\x19\x1a\x1e\x76\xf0\x49\x15\x53\xfd\xb4\xce\xbf\x4f\xfb\xc9\xef\xc3\x0e\xb6\x0e\x2f\xf0\xf0\xd4\xc6\x54\xbf\x1c\x47\x85\x96\x13\xab\x0d\xee\xf8\xbb\xde\x4d\x85\xb0\xf9\x59\x8f\x13\xce\x44\x02\xa6\xfa\x60\x3f\x9b\xad\x57\xc5\xbb\x46\x54\x96\x40\x81\x1b\x71\x15\x2a\x48\x50\xc1\x92\x25\x92\x20\xc8\x62\x2b\x52\x55\xc8\x20\x21\x01\x5a\x94\xb2\x1a\xb6\x02\x5a\xf6\x63\x0e\x64\xa1\xbe\x3b\x9f\xb4\x04\xc1\x1d\x76\x04\x0f\xe9\x4b\xb7\xe3\xe2\x91\x41\x57\x90\x57\x7d\xa5\xc5\x42\xf8\x6f\xb1\x91\x1e\x76\x2a\x82\xa6\xca\x82\x86\xb0\x1b\xf9\x01\x25\x77\xcd\x8a\xf2\x78\x4e\x71\xf3\xe2\x12\xcd\xcd\x53\x26\xfd\xa2\x4d\xf7\x7b\xcc\xe4\x38\xaf\xee\x31\x76\x97\x8b\x7f\xaa\xc1\x03\x63\xd7\x2f\xd8\x25\xd4\x3a\xb3\xff\x41\x7d\xd3\x4d\x81\xcc\x7d\xc5\x08\x4f\x31\x38\x2e\x88\x23\x3e\x9a\x8b\x99\x6c\x79\xb9\xb4\x60\xb5\x31\x6f\x36\xdf\x6a\xd1\xf1\x8b\x07\xbe\x18\xaf\xc2\x1b\x5c\xa1\x1d\x5e\x98\xc7\xf1\xc2\xc0\x6f\x6f\x60\x9c\x71\x7c\xcd\xcd\xe3\xad\x87\x99\x8d\x07\x3c\x8d\x26\xc1\x36\xc5\xdd\x36\x3f\xb2\x9e\x2a\x77\x97\xb4\xd2\x0d\xca\xb3\x00\x7c\x81\xca\xb4\xd3\x20\x51\x60\x14\x94\x0f\x03\x71\xc3\x59\x5f\x65\x0f\xbf\x66\xac\xf2\xbf\xbc\xb5\x53\x1e\xa8\x1b\x1f\xc7\x67\xd2\x9f\x72\xa2\x40\xb8\x54\x60\xab\x3c\x54\x0b\xf4\xc3\x64\x76\x29\xca\xce\xaf\xcc\xdf\x2d\x2b\x0f\x95\x4f\x3b\xea\x89\xab\x50\xce\x17\x4c\x59\x1b\x1c\x4c\x57\xdc\xef\xa2\x91\xb2\xf8\x75\x3d\x43\x29\x5f\xcb\xc9\x0a\xb2\xd3\x72\x7e\x55\xf1\xad\xfd\xf2\xca\x9e\xf3\x85\xf2\x7f\xdb\xf3\xd6\x5e\xaa\x67\x59\x3c\x55\x58\xda\x67\x39\x64\xad\xb0\x70\x92\xf1\xc6\x7f\xae\x08\x7e\x49\xb9\x1f\x2d\x01\x1d\x8d\xbc\x6a\x49\x92\xa3\x03\xdb\x94\xfe\x06\x8e\x3d\xcc\x44\x1f\xf9\xf9\xd8\x82\x4f\x4d\x52\x66\x30\xc4\x4e\x36\x3b\x69\x69\x88\x4b\x55\xd3\x1a\x5f\x06\x57\x6d\xca\x4a\x49\x95\xc0\xb4\x46\x94\xab\x81\xeb\x36\xad\x48\x0a\xb8\x8d\x15\x67\x82\x14\xf5\x97\xe7\x48\x70\x73\x42\x72\x27\x0b\xa8\x25\x45\x18\xf6\x7d\xa2\xf2\x0d\x4e\x4c\xd3\x03\x51\xd3\x7a\x76\xed\xb2\x48\xfb\x31\x52\xe9\xc9\x09\xc5\x62\x75\x42\xe0\x0a\xf0\xe0\x2f\xda\x76\xc4\x6d\xbf\x0c\x0a\x25\x2d\x23\x6e\x9f\x19\x13\x57\x4d\x23\xea\x22\xe7\xe5\x59\xd4\xf1\xc6\x72\xbc\xde\x58\x7a\x23\x29\x1a\x46\xb2\x45\x91\x1f\xbd\x97\x6d\xef\xcb\x2e\xdb\xfb\x5a\xd4\x90\xc5\x63\xc9\xf3\x39\x7c\x49\xc6\x72\x97\x34\xa1\x19\x07\xf2\x4a\x1b\xa8\x0b\xc5\x44\xa4\x78\xeb\x6f\xef\x2f\x9d\x72\xcc\x94\xef\x70\x55\x1c\x0f\xa7\xd2\x54\x95\x63\x50\xbc\x59\xda\xaf\x38\x07\x6e\x36\xab\x51\x32\x5e\x89\xc9\x7e\x88\xca\xce\x0f\x37\x42\xeb\x8b\x6b\xaf\x2c\x1d\x2d\x58\xe1\x0a\x48\xed\x34\x55\x14\x47\x3d\x2b\xed\x1e\x3a\xab\xdb\x55\xa0\xf8\x02\xce\x98\x55\xb8\x3c\x7c\xfe\x5b\xb2\x80\xf0\xe6\x70\xfb\xbc\xa4\x41\xf2\xc6\x62\xa5\x78\x63\x71\x05\xc3\x65\x3b\x95\x68\xcc\x78\x8a\xd9\x66\x9b\xa6\x9a\x89\xb3\x92\x6c\x54\xe1\x65\x52\x53\xcd\xc1\x9e\x3b\xe0\xcf\x4b\xf5\x63\x4a\x25\x9d\xbb\xfa\xac\x4c\x81\xbb\xf0\x20\x8b\x15\x1a\xed\x72\xae\x3e\x2d\xbb\xfa\x74\xf1\xa8\xbf\x3c\x2f\xaf\xfb\x70\x4a\x26\xd1\x91\x4c\x91\xc6\x6f\xd3\xef\x6c\x19\xcb\x86\x18\x2a\x8c\x35\xc3\x35\x46\x82\x54\x7c\x42\xf5\x63\x0f\x76\xe5\x06\x77\xec\x06\xfb\xb4\x8f\x7d\x22\x46\x91\xf7\x37\x8b\x02\x6e\xcd\xcb\xbb\xe8\xbb\xd6\xc8\xfb\x68\xb3\x91\x73\x17\xa2\xf2\xa1\x63\x9b\xb2\x32\x83\xdc\x37\xbf\xae\xec\x43\xc5\x08\xdc\x71\x2d\x76\xff\x4d\xa0\x35\x14\xa1\xe8\xc6\xe7\xa1\x3a\x65\xde\x63\x6b\x29\x2f\xc7\x7e\xc1\x3e\xad\x58\xca\x75\x3a\x7e\x40\x3b\x99\x51\x73\xdc\x75\x32\x3e\x77\x48\xa0\x67\x6e\xfc\xd6\xa8\xe9\x0f\x32\xdd\x56\xf8\x0b\x72\xc2\xde\x20\xd3\xa5\x53\xf8\x58\x47\xa6\x62\x15\x3a\x14\x40\x35\x75\xea\x0c\x35\x07\x1d\x50\x7d\x7a\xa1\x71\xf5\xf5\xcf\x57\xcd\x61\x47\x20\x96\x20\x6d\x2a\x61\x10\x00\x7b\xce\xc1\x9e\xfc\x7c\x6c\xb1\x4f\x61\x1f\x22\xe6\x81\xcf\x42\x9e\xea\x17\xf7\x6c\x52\x0e\x5f\x35\x4f\x64\xe5\x58\x9a\xc8\x47\xe6\x7b\x8d\xbb\x39\xce\xbb\x8a\x42\xfd\xad\x96\x7c\xa5\xcd\x0e\x6f\xec\xcc\xe4\x82\xaf\x65\x8e\xbd\x8a\x57\x8e\x11\xe7\x10\x81\x37\x35\x55\x41\x99\xfb\x43\xd0\x47\x36\xeb\xfc\x20\x2e\x80\xc0\x08\x91\xc1\xf0\x83\x38\xd9\xac\x00\xc3\x49\x80\xf1\x5e\x8b\x5d\xf3\xb3\xca\x07\xac\xa4\x73\x20\x28\x2c\x0f\xaf\x76\x2e\xee\x0f\x88\x9b\xcd\xba\x51\x2a\x3c\xa5\x59\x23\x32\x3a\xa6\xbb\x46\x28\x17\xaf\xe0\xea\xe1\xc6\x07\xd5\x97\x81\xe1\xe7\xc3\xbd\x66\x20\xfe\x13\xe2\x65\x47\xa9\xae\xf8\x09\x6a\x32\x4c\xd9\x21\x51\x03\x71\x77\xa5\x5a\x63\xc4\x8f\x94\x00\x23\xb8\x92\x1c\x2d\xaf\xa2\x1b\x9f\xab\x16\xbe\x3e\xf7\xcb\x62\xa1\x68\x25\xa5\x18\x91\xd9\xa0\x91\x51\x1f\x5e\x45\x97\x1f\xc2\xe2\x95\x61\x62\x69\x06\x36\x8b\x15\x36\x69\xec\xa8\xdd\x5a\x3c\xb2\xf1\x24\xf4\x9f\xf2\x82\x29\x3a\xf2\xc5\xd6\x42\xaf\x27\x09\x86\xd3\xaf\xc9\xfb\x3c\xfd\xd8\xcb\x66\xd7\xa8\x1e\xde\xc9\xad\x60\xca\xe6\x2b\x26\x51\x84\xdd\x44\xd2\x63\x0b\x25\xd9\x02\x2c\x69\xa1\x9b\x76\xf4\x59\xee\x37\x14\x92\x29\xae\x48\x99\x04\xb0\x1c\x66\x35\xcd\xd5\x67\xd8\xd1\x67\x58\xf2\x11\x04\xb9\x51\x0b\xd6\x78\x66\xe7\x7e\xe3\x7b\xaa\x89\x64\xec\x58\x77\x2c\x09\x09\x47\x74\xd2\xe5\x80\xc2\x04\xb9\x2e\x5d\x00\x62\x79\x36\x71\xf4\x69\xee\xb7\x29\xe0\x60\x09\xae\x48\x88\xc1\x70\xf4\x29\x76\xf5\x29\x96\x1c\x29\x02\x03\xea\x0b\x28\xfa\x2b\xa0\x58\x28\xcf\xa6\x66\xa9\x25\xd6\xb4\x66\x8e\xad\xb9\x9b\x45\xc9\xb9\x3f\x7b\x8d\xc6\xd0\x1f\x95\x69\xce\xc3\xc3\xd6\x87\x5f\xe6\xe7\x02\x27\x4f\x73\x6e\xbe\xf8\xdd\xc3\x06\x5a\x28\x9c\x64\x9a\xd8\x08\xb8\x2f\x4a\x53\x4c\x53\xec\x6c\x01\x58\x83\x2f\x96\x0a\xf6\xd8\xaa\xf5\xb2\x59\x8f\x10\xbf\x62\x94\x35\x27\xef\xa1\x4d\xcd\xcf\x83\x31\xbb\x3c\x56\x29\x6c\xdb\x4f\xb0\x6d\x8f\xdf\x27\x78\xdf\x7d\xc4\xd0\xc1\x76\x62\x31\xf1\xd8\xd5\x67\x84\x35\x53\xd6\x7c\x85\x59\x4b\x7c\x2d\xd5\xf4\xa0\x02\x64\x3f\xbb\x76\xe4\xf8\xc7\x55\x86\x37\xa8\x49\x8b\xf3\x43\xee\xb3\x52\x61\x72\x0c\xda\xf0\x8e\x4d\xe9\x25\x37\x1e\x90\x0e\x75\x39\x1e\x68\x0d\x7b\xd8\x27\x72\x9d\xc0\x93\x16\xb6\x38\x70\x20\x38\x03\x6e\x73\x46\xea\x23\xdc\xe1\x04\xdb\x46\x26\xc3\x16\xe3\xbc\xa6\x60\xcd\xf9\x36\x3a\xf0\xa4\xc1\x5e\x3b\xa7\x39\x3f\xda\x15\xaf\x9c\xf7\x50\x0a\x16\x38\xa1\x51\xec\xb3\x63\x55\x5b\x21\x7f\x1f\xf1\x36\x05\x5a\xad\x91\xe8\xb1\xad\xcf\xec\xb2\xd5\xd6\xa7\xd8\x67\x83\xb7\x4d\xae\x42\x69\xd5\x34\x1f\x5b\x1d\x7d\x8a\x3b\xfa\xcc\xc6\x1e\x2e\x18\x06\x32\x41\x5d\x42\x41\x2f\xe2\xea\xd4\xf3\xb4\x0e\x12\x94\x79\x0f\xa3\xf3\x71\x03\x07\xb8\xcd\x23\x8f\x5c\x50\x9a\xcd\xc2\x04\x5c\x50\xaa\x1f\xbf\x53\xad\x81\x1d\x68\x07\x27\x42\x60\x52\xf4\xc9\x1b\xa3\x68\x01\xb8\xbc\xac\x41\xe8\x68\x21\x79\xba\x78\x78\x8a\xa9\x5e\x0d\x29\xc7\x33\x3b\xbf\x71\x7b\xa3\xb5\x82\xfa\x04\xf3\x3e\x36\xeb\x63\x70\x70\x9a\x0b\x38\x06\x5c\x86\x63\xfe\x2b\xe7\xb1\x3d\x24\x30\x3d\xd2\x36\xe5\x4e\xe2\x12\xbf\xec\x11\x5f\x21\x3a\x58\x67\x6d\x7d\x86\x83\xc4\x72\x0f\x58\xb2\xa7\xcf\x18\xbd\x28\xc9\xbe\x44\x19\xc3\x05\xb6\x04\x21\x4e\x02\x84\x61\x35\xda\x89\xa4\x80\x27\x01\x1e\xb8\x95\x64\x47\x54\x84\x75\x8a\x03\xf8\x97\x65\xa3\x32\x87\x23\xd0\xa7\xb8\x9d\x58\xef\x01\xe7\x46\x53\xec\x25\x92\x53\x70\x40\xe7\x9c\x37\xb0\x99\xc5\x56\x90\x4a\x50\x60\x68\x7f\x05\x83\xe9\xc7\x73\xee\xc4\x3f\x1b\x30\x63\xbe\xfc\xe1\xb0\xbd\xa9\x1a\x2e\x5b\x5f\x81\xd6\x12\xf6\x9c\x2f\x42\xab\x74\x9c\xb4\x6a\x5d\x51\x11\xe2\x38\x8e\x2a\x55\xa2\xae\x98\x52\x2a\x05\x91\x39\x12\x51\xa7\xd7\xb0\xc0\xb2\x59\xed\x90\xff\xc2\xa0\x77\x74\x51\xe4\x82\x27\x79\xb6\x05\xde\x2b\xcc\x07\x81\xfd\x0a\xeb\x08\x65\x57\xa8\x89\xab\x82\x96\x9a\x1d\x6f\x11\x22\x7b\x12\x85\x27\xe3\x6c\x58\x16\x8c\xf7\x86\x1a\x16\x57\x7c\x82\x25\xdf\x27\xbe\x6a\x08\x21\x2c\xf7\x40\x7e\x7d\xf1\xe7\x40\x35\x69\x77\x87\xbd\x15\x66\x62\xea\x01\x40\x7f\x49\x19\x8c\x79\x63\x5e\xe6\xb2\x26\xdd\xb7\xd4\x96\xca\x5c\xd6\x12\x9f\xc7\xc9\x58\xc6\x8f\x42\x03\xca\xc6\xae\xa6\x4f\x02\xa9\x02\x5f\x6a\xf0\xc6\x97\x4a\xd3\x54\x1c\xc0\x84\x73\x8c\x86\xd4\x0b\x47\x37\x1c\x93\xee\x52\xa9\x49\x37\xd2\xcc\x46\xfe\xe4\x3a\x4b\xa5\x0e\x63\x9d\xae\x2c\x75\xda\x5f\x2a\x75\xda\xe7\xf7\x6a\x33\xb8\xa0\xfc\xfa\xa6\xe3\xc6\x07\x86\xfc\xd5\x75\xc7\x8d\xaf\xbf\xdf\x83\x68\xf4\xa7\x70\xd8\x42\x30\x5a\x15\x13\x3b\x71\xb2\x3b\xf6\xc4\xc9\x2e\x79\xdd\x97\x82\x87\xed\x1e\x40\x0d\xa9\x2b\xc9\x44\x53\x8f\x2d\xac\x76\x9d\x63\xed\xa6\x7c\xc4\x81\x27\xd9\x68\x1d\x51\x70\xad\x19\xa9\xaa\x55\x4f\x3a\xfc\x11\x99\xea\x1b\x9b\x89\xbb\xf0\xbe\xe8\xe3\x88\x8a\xad\x48\x3c\x38\x9a\x41\x42\x18\x27\x1c\xb2\x04\xa1\x51\x84\x84\x23\x28\x71\xd4\xa5\x9a\x48\x9e\xcf\x6b\xea\x5b\xf5\x7a\x42\x33\x3e\xe9\x42\xd0\xad\x49\x17\x18\xd6\xd3\x8d\x7c\xa9\x8e\x15\xa5\xf9\xa4\x8b\xef\x7e\x62\xaa\xbf\xec\x83\xb9\x4e\xac\xb7\x56\x32\x16\xff\x75\xe0\x22\x91\x4f\x28\xae\xc5\xda\x1c\x2c\x5d\x7c\xdd\x3e\x6b\x08\xab\x8a\xce\xfe\x1b\xc5\x6b\xe0\xc1\xe1\x3f\xc6\x50\x8a\x86\x3a\x4a\x5e\x4f\x31\x26\x5b\x69\x1f\xb3\x33\x41\xd9\xb1\xee\x3d\x7b\x61\x7a\x2d\x6d\x3d\xe8\xf5\x82\x8e\xaf\x4f\x5a\xc3\x31\xed\xb4\x3e\xc0\xa8\x46\xf7\x06\xf4\xfd\x17\x7f\xd2\xb8\x9e\xf2\xfb\xc7\x10\x25\x5e\x9d\x2f\x30\xf7\xd1\xa6\xf4\xf9\x51\x8b\xbc\xed\x71\x49\x65\x28\x2e\x35\x69\x27\xf1\x79\xd8\x12\x9f\x8b\x47\xf2\x01\xb7\x52\x69\xbf\x38\xff\x55\x23\xc8\x3c\xa7\xab\xbc\x49\xb0\xec\x8f\x9a\x49\xe3\x86\xc4\xc2\x76\xf5\xdf\x94\x4b\x59\x51\x9b\x02\xd9\x9d\x28\x27\x6a\x5e\xd4\x69\x89\x9c\x28\x2e\x02\x32\x37\xd2\x16\xb1\xea\x6c\x1c\xba\xd6\xf5\x87\xad\xb1\xce\xa5\x1b\x2b\xda\x11\x49\xb4\x13\x39\x46\x6c\xc9\x52\xad\xc4\xba\x38\x4c\x08\xbf\x96\x6d\xde\xbe\xb2\x83\xfc\xfd\x79\x85\x35\x58\x66\x4d\x24\xe5\x1d\xeb\xd8\xd6\xda\x8c\xb8\x0b\x06\x52\xc2\x37\x28\xea\x82\xf3\x9a\x02\x22\xb4\x7f\x7f\xae\x8a\x3b\x17\xb5\x78\x25\xf2\x0e\x19\x54\xa9\x47\x81\xd4\x1a\xb8\xb6\x76\xe7\x23\xd3\x61\x3d\x7e\x0e\x7a\xef\x65\xd6\xad\x65\xb0\xdd\x1d\x61\xb7\xd7\x19\x77\x43\x9e\x54\x80\xa4\x85\x02\x8d\xb3\x98\x4e\x93\x13\x25\xad\xd6\x28\xb1\x6c\xec\x90\x73\xc1\x22\xd8\xd1\x5f\x70\x9c\x8f\x80\x89\xf5\x17\x32\x83\xbf\xec\x76\x52\x2f\xbb\x3f\x17\x66\x43\x1f\xf4\xde\x89\x63\xf9\xb6\xd9\xd0\x39\x18\xfc\xfe\x14\x42\x5a\x34\xd0\x22\x7e\x17\xee\xca\xda\x0d\x02\x03\x80\xe7\x1c\x38\xaa\xe5\x5a\xbe\x8d\x45\x2d\x33\xae\xe5\x29\xb5\x58\x69\xd6\x9d\x67\xf9\x36\xfb\x11\x57\x86\x14\xfe\x3b\x6a\x43\x21\x99\xd8\xce\x30\xbd\x3c\x0f\x5d\xeb\xce\xb5\xb5\xfb\xd1\xa0\x15\x06\xe0\x73\x29\x7e\x03\x92\x2e\x4b\x3b\xe9\xb2\xf1\x34\x6e\xd4\xd4\x37\x9f\x40\x32\xd0\x97\x6b\x19\x36\xc4\x64\xff\x08\x2a\x2f\x71\x02\x9b\x63\xb5\x31\x96\x9a\xbb\xf3\x73\xae\x55\xb0\x91\x62\xa9\x1a\x13\x1f\x88\x67\x4a\x69\x24\x5b\x65\x70\xad\xc8\x64\x3d\xa4\x93\xe3\x1e\x62\x2b\xd1\x47\xfd\xfe\x6d\x95\x8f\xb3\x0d\x41\x08\xf7\xe7\xd8\xa2\xdc\xa3\xf9\xd9\xca\xd8\xe8\x1b\x11\xc5\x88\x82\xf1\x1b\x8b\x7a\xf2\x68\x2a\x90\x0f\x5e\x52\xb8\x8b\x22\xd3\xab\x50\x7d\x78\xcc\xb8\x23\xd5\xef\xdf\x98\xf8\x19\x1b\xe7\xa7\x6a\xbf\xac\xae\xed\x97\x78\xed\xb3\x20\x51\xdb\xad\xc7\x96\xd5\x52\x69\x98\x44\xb9\x03\xd8\x60\xa7\xa9\xb8\x41\xbf\x42\xf5\x49\x83\x42\x6c\xa7\x32\x4c\x69\xf3\x04\x5b\x0e\x66\x87\xc9\x6f\x8f\xfa\xf0\x38\x2d\xfa\xae\x5d\x46\x1a\xcd\xd4\x33\x8e\x43\xd7\xba\x75\xa2\xce\x12\xd1\xf9\xcc\x47\xdd\x2f\x2d\xb5\xf4\xf2\x55\x4b\xb4\xf3\xa7\x96\x26\x8d\xf4\x63\xea\xc8\x1d\x67\x72\xbc\x94\x8d\xd7\x41\x4b\x70\xb6\x12\xad\x8b\x42\x4a\x17\xdf\x8e\xd3\x32\x06\x67\x56\x9c\x4d\x63\xc9\xe3\xb1\x27\xb7\x09\xca\xb6\x77\x62\xd9\xe9\x08\x6a\x69\xbf\x10\x94\x31\x0d\xee\x06\x09\x96\x75\x36\x2b\x3f\xf8\x42\xae\x78\x2a\xfd\x42\x11\x06\x9d\xcc\x16\xa1\x64\x44\xe5\x8a\xb3\x54\x58\x29\xc0\x6b\x64\xb3\x6e\xb2\x90\x6c\x68\xc1\x8f\x98\x8e\xde\xea\xca\xad\x8a\x1d\x34\xdd\xe8\x9b\x76\xd8\x91\xde\x8b\xf3\x5b\x91\xa5\xc3\x21\x94\x72\x90\xe9\x13\xb9\x97\xb5\xba\x9a\x8b\xcc\x06\x91\x3b\x58\xab\xab\x49\x03\x86\x43\x57\x9a\xcf\xd3\x8e\x34\x9c\x3f\x6c\x11\x4f\xbc\xb3\xfb\xa8\x99\x0e\x2b\x13\x98\x0e\x2b\xd0\x66\x5f\x2d\xd2\x31\x5d\x99\xeb\xb2\x5c\xca\x0e\xed\x1d\xe2\xb3\xaf\x16\x69\x98\xca\xf3\xcd\x5f\x55\x4e\xbc\x09\x77\x35\x52\xfa\x82\xde\x3e\x7e\xca\x73\xd7\xe1\x4f\xa2\x7a\x01\xf8\xad\xbc\x68\xb0\x0c\x5c\x30\x70\x01\x17\x71\x01\x17\xf6\xf0\xfe\x36\xde\xda\xc2\x85\x2d\x5c\xc0\xdb\xfb\x25\x5c\x28\x14\x71\x71\x77\x1b\xef\xe2\xe2\xce\x16\x2e\x6d\xb3\x42\xa2\x30\x54\xc0\xdb\x3b\x78\x1b\x17\x0a\xec\xff\xa5\x3d\x5c\x2c\xe0\xc2\x0e\x4b\x37\x0a\x78\x17\xf2\x77\x70\x11\x4a\x96\xa0\x59\xf8\xdf\x96\x81\x8b\xbb\x78\x1f\xea\x6c\xef\xe1\x7d\xbc\x55\xc2\x25\x5c\xc0\xfb\x2c\x8f\x35\x89\x4b\x5b\xec\xc7\xd6\x0e\xde\x82\x1a\xbb\x78\x6b\x57\xd4\x65\x25\xf6\xa0\x34\x6b\x74\x17\xef\x41\xf3\xc5\x02\xde\xe3\x49\xbb\x78\x6b\x3f\x82\x71\x07\xef\x40\xb3\xdb\xb8\xc4\xa1\x80\x7f\xb6\x39\xe4\x50\xb2\xc8\xfa\x29\xe2\x12\xde\x63\x45\x77\xf9\x77\x29\xca\x4e\xf4\x67\xb0\x36\xf6\x53\xdd\x14\x61\x88\x3b\x78\x1f\xef\xc8\x4e\x60\x98\x3b\x1c\x9b\x25\x09\x75\xa1\x28\x06\x58\x82\x31\xc2\x88\x4a\x78\x0b\x6f\xc3\x18\xb6\x70\x11\x46\xc2\x30\x93\x18\x03\xef\x80\x23\x85\x8d\x91\xa3\x48\x29\xb8\x07\x99\x45\x68\x87\x77\x50\x30\x64\x7e\xb1\xc8\xa6\xe4\xdb\xb6\xc0\xc5\x2e\x2e\xec\x73\xf8\x4a\x3b\x62\xf2\x0a\x80\xa0\x02\xeb\x7c\xdb\x50\x93\xf7\xd9\xdc\xec\x30\x54\x14\xd9\x14\x31\x1a\x88\x20\x2a\xc0\x40\x4b\xfb\x1c\x51\x25\x01\xe5\x36\xeb\x8b\xf5\xbf\xbd\x0b\x33\x5d\x84\x9c\x1d\xc8\xe3\x14\x50\x60\xcd\x73\x1c\x95\x00\x6a\x36\x90\x5d\xbc\xc5\x0a\x6e\x29\x73\x06\xbf\x80\x1e\xf6\xf0\xfe\x0e\xde\x2d\xe2\xbd\x3d\xbc\x55\xda\xc7\x5b\x78\x9f\xd1\x83\x98\xbf\xd2\xd2\xaf\x6d\xf8\x7f\x09\x6f\x6d\xf3\xa9\xe4\xf4\xc1\x1a\xdd\x97\x83\x62\x14\xbc\x85\x0b\xdb\x80\xcd\x5d\x46\x5e\x5b\x00\xd2\x3e\xc0\xba\xc5\x26\x99\x21\x69\x1f\x97\x4a\x8c\x2e\xf9\xf4\xee\xe3\x22\xe0\x1c\x97\x58\xf5\x18\x49\x7b\x11\xd0\x40\x3d\x6c\xd0\x9c\x54\x0a\x11\xb1\x6f\x2b\xff\x32\x70\xb6\x00\x8a\xa2\x00\xae\xb8\x25\x90\x29\xff\x57\x10\xb3\x2b\xfb\x00\x72\x14\x98\x2a\x40\xfa\x5e\x4c\xf1\xbc\x3f\x28\xb0\x05\xcd\x95\x44\x6b\x8c\x56\xb7\xf0\xb7\x9d\x12\xde\x2e\x6e\xc9\x09\x28\xb1\x02\xfb\x6c\x12\xf6\x77\x18\x74\x5b\xc6\xae\x01\xc4\x0e\x98\xd9\xc1\x5b\x45\xbc\xbd\x5d\x62\xe3\x30\xb6\x81\x80\x0a\x3b\x7c\x55\x16\x0c\x3e\x98\x3d\x20\xa9\x5d\x49\x8f\xb0\x24\xb6\xc4\xd4\x16\x4b\x8c\xe2\x4a\x30\xaf\x02\x2b\x00\xf2\x0e\x5b\xda\xb0\x16\x18\xfd\xec\xb1\x72\xc5\x12\xac\xb6\x22\x0c\x3e\x5a\x1b\x5b\x45\x41\xe4\x6c\xe1\x6f\x71\xaa\x29\x45\xb4\xbf\xb3\xcf\xe6\x74\x27\x46\x53\x31\xc6\xfe\x1e\x6f\x7f\x0b\x08\x07\x88\x50\x22\x8c\xd1\x24\x47\xe3\x16\x9f\x60\x9e\x04\x78\x35\x0a\x9c\xb6\x39\x59\xec\x45\xfc\x4c\x4e\x2d\x6b\xb6\x50\xd8\x2b\x31\xb8\x19\xd6\x8c\xe2\x1e\xfb\xa7\x84\x77\xf6\x4b\x30\x77\x8c\x21\xed\xb0\xff\xef\xe2\x22\x5f\xec\xb0\x4c\xf6\x18\xd1\x6c\xc3\x7c\x14\x8d\x6d\x20\xd6\x92\xc1\x39\x61\x69\x57\x36\xbe\x2d\x78\xcc\x36\x27\x52\x20\xc9\x52\x34\xe3\x05\xbc\xb3\xc3\x91\xb0\x2d\xd8\xe7\x2e\x1f\x47\x89\x4d\xb6\x60\x0c\xc5\xed\xbd\xd4\x8a\x29\x16\x77\xf6\x0a\x78\xa7\x88\xbf\x95\x70\x71\xdb\x28\x89\x91\x0b\xb4\x72\xb2\xd9\xe5\xb3\x54\x80\x96\xf6\x8c\x7d\xc6\xd4\xf1\xee\xbe\x61\xb0\xe5\xb2\xbd\xcd\x8e\x07\x96\xa0\x26\x40\xb1\x11\xfd\x57\xfc\xc3\x7f\xcb\xf9\xe9\x94\xff\xd4\x42\xfc\x5f\x09\x1b\x30\x6b\x25\xf8\x06\x3e\x03\x8c\xd5\x80\xa9\xe3\xa5\xb6\x95\x72\x86\x28\xcb\x4a\x25\xcb\xa4\x5b\xdb\x51\x72\xd5\xfa\x6a\x6d\xe3\x8b\x96\xd3\xed\xc6\xad\xc6\x35\x4b\x4a\xaf\xc9\xde\xd2\x7d\xc5\xff\x2d\x97\x4a\x8f\x47\xcd\xdb\x49\xd4\x36\x94\x9a\xac\xa5\x6f\x49\x00\x4b\x51\xe5\xed\x15\x88\x2e\x29\x68\x49\xe6\xc4\x20\x18\x62\x47\xdb\x16\xa9\x25\xb1\xa0\xe4\xf7\xb6\xf8\x8e\xfb\x92\x3d\xed\xc2\x46\x15\x23\x6a\x27\xf5\xd7\x88\xda\x59\x46\x47\x1a\x9a\x64\x09\x43\x81\xc6\x50\xa6\x57\xa6\x97\x96\x46\x55\x5a\x41\x58\x25\x05\xc9\x69\x92\x88\x5b\x28\x29\x23\x5d\x86\x54\x2d\x6b\x24\x5a\x29\x2e\xcd\x40\x01\xaf\x5e\x4c\x69\xdc\xaf\xfa\x6f\x47\xe0\xaa\x94\x18\x67\xfc\xdf\x37\x09\xf6\xce\x4a\x0a\xdd\x81\xe9\x50\xab\x26\x87\x9f\x4c\x49\xa2\xc2\x48\x4c\xf5\x32\x68\x31\x50\xb2\x25\x23\x41\x2c\xc9\xdc\x42\x41\xa1\x8a\x55\xcc\x21\xc9\x24\x76\xa2\x46\x8c\x68\x3e\x4b\xca\x72\x4d\xd6\x28\xad\x2c\x63\x2c\xd1\x56\x29\x31\x4b\x62\xaf\x4c\xc3\x53\xe2\x53\x26\xec\x91\x7a\x81\x30\x12\x4f\x3e\xb1\x55\x4c\xd2\xe3\x72\x54\x79\x22\x58\x30\x5d\x7e\x0a\x72\x73\x39\x24\x2c\xd7\x2d\xd7\xae\xb0\x7f\xd8\xaf\x7c\xc1\xce\x15\xca\xec\x2b\x27\x3e\xcd\x43\xf1\x06\xd5\x11\x8f\xa2\xbd\x7a\xea\x39\xf4\x43\xe4\x0f\xac\x54\x32\xb6\x8a\x07\x84\x66\xb3\xdb\xdb\x45\x63\xeb\x07\x89\xfc\x83\x15\x76\x08\xa1\xff\x53\xdc\xab\x14\x8c\x72\xa1\x60\x7a\xf5\xf9\x5c\xf3\x78\x90\xab\xdf\x55\x25\x4c\xa4\x43\xbc\x3a\x76\x89\xc3\x00\xc7\x1e\x31\xb0\x0f\xcf\xb5\xcc\xbd\x03\x3f\x1f\x87\xbf\xf6\x73\xde\x8f\x1f\x05\xd3\xb5\x1a\xf6\x01\xa1\x15\x8f\x34\xca\x3e\x69\x80\xa2\xc7\xf4\x0e\xfc\x6c\x76\x4d\xa3\x07\xae\xe5\xd9\xc8\xcc\xe5\x3c\x76\x50\xf2\xf2\x05\x35\x4c\x37\xf8\xeb\x72\xac\xee\xcc\xb6\xa8\xbd\x30\x9b\x7a\xbf\xf7\xae\xc1\x4e\x9a\xdf\x42\x89\xcf\x62\xe2\x33\xf9\x95\x2c\x5a\x4a\x7c\x6d\x23\xf3\xb0\x9d\xcd\x9e\xb7\xb5\x3d\xe5\x20\xf4\xc8\x51\xc5\x2d\xae\xc6\x94\x48\xbf\xdb\x84\xfc\xaa\x18\x07\xb4\x52\x28\x33\xe8\xf2\x05\x38\x36\x96\xc5\xfc\x70\x68\x21\xb9\xb0\x78\xac\x52\xf0\xaf\x35\xa6\xe4\xf9\x88\x7b\xc0\xf1\xeb\xe4\x73\x81\x9f\xaa\x14\xd4\x53\x75\xd0\x89\x45\xcf\xbb\xeb\xa0\x53\x15\x56\x3e\xd5\x5e\x26\xec\x8d\x84\x6b\xd3\x51\x8b\x8e\xfc\x8c\xd7\x1a\xf8\xee\xa8\x33\x5b\x47\xe6\x22\xa8\xb3\xa6\xdb\x57\x7c\x7e\x0f\xa9\x06\x09\x5f\x68\x9d\xad\x0f\xc7\x56\xcf\x78\xcd\x48\x59\xf2\xc4\x0e\x7b\xad\xba\xe6\x68\xee\x7c\xfe\x5a\x17\xda\x62\xa9\x34\x56\xf5\x5b\xed\xba\xea\x7f\x4e\xf3\xe6\xf3\xfb\xb6\x86\x90\x75\xef\xd8\xda\xa4\xc1\xe6\xad\x55\xd7\xa8\xe6\xa8\xcd\xb8\x08\x9c\x6c\x7a\xf1\x43\xe3\x4c\x81\x10\xcf\x7a\x71\x6c\xee\x8a\x81\x12\xcf\xfa\xed\xd8\xb8\xc0\x48\xbb\xed\xd9\xa8\x42\xcb\x5e\xdc\x27\x6b\x91\x6b\x28\xc2\x56\x1c\xc2\x37\x13\xe9\x36\x60\x45\xa9\xde\x5f\x83\xba\x30\x12\x39\x7b\x23\x84\xf8\xf5\xc8\x9e\x8a\x61\xc0\x8c\x73\x1a\x51\xce\x49\x4b\x83\xcc\xe8\xfa\xff\xf4\x12\xce\xf7\xaf\xc9\xb9\x79\x8e\xd6\x8d\xf0\xc4\x8c\xa4\x31\xb1\xde\xbe\x12\xb6\xc4\x85\xb2\x1c\x23\xb7\x88\xcd\xcb\x84\xbc\x48\x30\x64\x01\x19\x83\x18\x16\x7f\x3c\xdc\x0e\x23\x80\xa0\xae\x3e\xb7\xeb\xd4\x71\x50\x47\x66\x07\x66\xfb\xec\x8d\xf8\x75\xe5\x75\x5e\x5d\xd1\xab\x45\x0e\xa2\xa3\xb1\x57\x68\x39\x81\x9b\x9b\xcb\x4a\x58\xd7\x6a\x97\xfc\x8d\xf3\xe0\x03\xa2\xeb\xd6\xb5\x93\x96\xd4\x70\xc4\x2a\x23\x84\xf9\x78\x95\xe9\xef\x2d\xc3\xd6\xe3\xb0\xf5\x24\x6c\x2a\xbe\xfa\x75\x45\x89\xe0\xf6\xc2\x91\x1f\x8e\x48\x3c\x6f\x90\x2c\x88\x77\x8d\x38\x15\x87\xab\x77\x9f\xb5\x3e\x6f\xb3\x2f\xdb\x6c\xd4\x15\x23\xa0\x17\x3e\x09\xb1\xce\x4f\x43\x9f\x8b\x8e\xa3\x39\x98\xad\xb3\x88\xc4\x14\xfd\x56\xa4\xce\x03\xff\x0d\xa6\xbf\x02\x14\x19\xf3\x87\x78\xd9\xac\xe6\x33\xa0\xbc\xa8\x25\x7f\x01\xb4\x10\xd6\x09\xeb\xba\x53\x47\x26\xfb\xdb\xab\x2b\x4b\xe9\xad\x9e\x36\x80\xf9\xd5\xd6\xc4\xf2\xe1\x4b\x04\x7b\x2b\x56\x86\x5c\x60\xb2\xa7\xe3\x0e\xc4\xed\x8c\xf1\x3d\x10\xed\xc6\x2a\x4a\x31\x58\x17\x53\x35\xd0\xa3\x8b\x7d\xae\xfe\xce\xb4\xc2\x8c\x83\x3c\xcb\xb7\xb9\x7e\x3d\x72\x06\xc9\xca\x0e\x93\x86\xd5\xff\x1d\x06\xd9\xfa\x8b\x69\x23\xe1\x44\xf2\xff\x01\xb1\x80\xce\x78\x6e\x47\x40\xcc\x2b\xa8\x58\xa3\x51\x9b\xb0\x4e\x21\x62\xe7\x46\x95\xe2\x1a\xff\x49\x4f\x28\xbe\xf4\x11\x8e\x8b\xf1\x74\xe7\x84\x62\xf7\x84\x22\x54\xa6\x24\xa6\x71\xaa\x5e\x0e\xc5\x46\x9a\x2b\x3b\x7f\xaa\xd2\x0a\x25\xd0\x2b\x0f\x13\xaa\x59\xff\x5a\xff\xeb\xef\xa1\x8d\x36\x36\xf1\x7d\x87\xa2\xb2\x02\x1b\x03\xc0\x3b\xa1\x56\xd3\xb3\xb9\x4b\x95\xd3\xcb\x55\x3d\x4d\xfe\xb4\x66\x1b\xf5\xca\xe9\x65\x99\x2e\xbe\x01\x6a\x4f\x28\xf9\x5c\xff\x7b\x6a\x18\xeb\xe5\x53\x1f\xaf\xff\x3d\x5a\x2f\xaf\x67\xff\xbf\x7d\x73\x1d\xaf\xff\x1d\xc2\xef\x82\x01\x1f\x53\xe3\x88\x7f\x16\xe0\xb3\xc1\x3f\x8a\xf0\x31\xe0\x1f\x5b\xec\x23\x03\xbf\xb7\x58\xc6\x5f\xeb\x7f\x95\xaf\x7c\xbc\x9e\x5d\x2f\x9f\xfb\x78\xfd\xaf\xf5\xf2\x4f\x1f\xaf\xe7\xa1\x40\x69\x9b\x15\xde\xe4\xbf\x77\xd9\xef\x83\xf5\xf2\xa5\x8f\xd7\x09\x24\xed\x40\x2f\x3f\xd6\xcb\x17\x0c\xa8\xb1\x61\xec\x18\x1c\xb0\x1d\xe8\x70\x6c\x18\x7b\xdb\xa2\xd3\x2d\x99\x42\x79\x91\xc2\x0e\x07\x78\x5c\x34\x8a\x7b\x90\xb2\x57\xdc\x2a\x46\x49\xfb\x32\x69\xcb\x5c\x57\x58\x89\x7b\x42\x15\x9c\xf9\x27\x94\x89\x01\x80\x22\xe7\x84\x92\x4d\x8b\xa1\xe8\xef\x69\xb1\xf8\xf7\xb4\xb8\xfb\xf7\x74\xcb\xfd\x7b\xba\xe5\xdb\x9b\x01\xf6\x58\xee\xbf\xb4\xca\xda\x70\x34\xeb\xf8\xf3\x5e\x38\xa7\xd0\xe0\x9c\x0e\xdc\x66\x6b\xe2\xcf\x1d\xea\xb6\x83\x41\x6f\x1c\x7a\x73\xb7\x35\xf2\xe7\xe0\x8b\xba\xe5\xcd\xdd\x9e\xe7\x3b\x74\xe8\xcf\x3d\x3a\xa2\x73\x6f\x38\x0b\xdd\x79\x73\xe0\x37\xe6\x9d\x5e\x18\x78\xfe\xd0\x9d\x0f\x07\xee\x7c\x3c\xf4\xbb\xb4\x8f\xb4\x4a\xd9\xa2\xf9\x0f\x23\xbf\xff\xef\x8d\x72\xde\xfe\x8e\x36\x36\x5b\x78\xa3\x4a\xc9\xe6\x81\x56\x29\xaf\xcd\xff\xde\xac\x68\xac\xc0\x61\xfe\xc5\x16\x7f\x8d\xfc\x7e\xf9\x6f\x56\x14\x2a\xff\xeb\xc7\x5f\xeb\xf6\x7c\xdd\xfa\xd7\xba\xfd\x7d\x7d\xfe\x97\xf5\xaf\xbf\xec\xef\x7f\xa1\xef\x3f\x36\x03\x4c\xd9\x08\x0e\x36\x83\x18\x17\xef\xf5\x38\x96\xae\xca\xdb\xdf\xeb\xdc\xb7\xc9\x85\x47\xa8\xde\xae\x6a\x8a\xe5\xa1\xcb\x23\x7c\x75\x60\x03\x1d\x95\x3f\x95\x20\xdf\xc4\x30\x3d\x2e\x61\x7a\xb9\x1c\x5f\xe7\xac\x18\x93\xc5\xe6\x73\xe3\x00\xae\x4e\x3c\x1b\x24\x56\x70\xb7\xb9\x56\x88\x02\x0a\xa7\x75\xf5\x50\x0c\xd4\xf5\xac\x95\x37\xde\x8a\xe5\xdb\x28\x55\xcf\x20\xc4\xe5\x3e\xe2\x79\x15\xb4\x70\x89\xb1\x46\xdc\x05\x44\xb6\x95\x63\x08\x5e\x19\x03\x89\xc2\x3b\xaa\x23\xad\xb7\xa3\x52\x0d\x46\x18\xd6\xa1\x8d\xa9\x35\xb0\xe3\xe2\x6f\xc2\x62\xbe\x05\x6e\x11\x8d\x03\xca\xfe\x71\x92\xb5\xb0\x23\xca\x2f\xb9\x1f\x95\x2e\x05\xb4\x21\xca\x34\x7a\x83\xcc\x35\x1d\x0d\x5a\xd3\x0c\x63\x6f\x83\xb1\x3b\xea\x0d\x98\xf0\x05\x6d\xbd\xf2\xbb\x6b\x19\xc1\xe1\xc2\xb3\x0c\x36\x22\x2c\xbf\xd8\xe0\x14\x43\xc9\x48\xe4\x8a\x27\x00\xd0\xaf\x53\x57\x43\xd6\x21\x9f\x83\x14\x5a\x79\xde\x80\x23\xd6\x91\xf1\xa3\x2e\x3c\x8e\x5b\xb0\x78\x53\x83\x17\xcc\x96\xf6\x22\x46\x2f\xd0\x08\x32\x01\x80\x88\xb1\x0b\x63\x39\x97\x35\xe6\xdb\x56\x83\x6d\x1a\x57\xb6\xd8\xb8\xb8\x29\x1d\xa6\xab\xaf\xa8\x25\x02\x3f\xe3\x93\x8a\x65\x63\x31\x1a\x4e\x49\x4c\x9c\x27\x96\x9d\xba\xd1\x71\x60\x18\x2e\x07\x9e\x18\xb1\xbd\xe5\x23\x79\xaf\xf3\x57\xaf\x69\x57\x72\x8c\x98\x6e\x05\x82\x5f\x29\x16\x63\x89\xbd\x13\x89\xd9\x19\x8e\xbb\x5d\xca\x25\xc6\x61\xa6\x17\x76\x66\x99\xe1\xb8\xdf\xef\x0d\x46\xbe\x97\xe9\x85\xc2\xc7\x51\xa6\xd7\xc8\xf8\x6f\x63\xda\xc9\x0c\x5b\x1f\xfe\x7a\x34\xb4\x59\x9d\x9f\x99\xa2\x7e\x85\x90\x2b\xaf\xc3\x73\x80\x71\xd7\xb6\x3c\x7b\x91\xb0\x49\x0e\x4e\x94\xc8\xd6\xfa\x2b\x23\xc5\x35\xe2\xc8\xf9\x8c\x81\xfc\xd5\xf4\x33\x41\x6b\xe2\x87\x99\x2e\x07\xb7\x49\x87\x99\xa6\xdf\x0a\x9a\xa3\xcc\x7a\xce\xe1\x35\x73\xeb\x38\xe3\x8c\x47\x99\x4c\xe8\xfb\xde\x30\x33\xea\x65\x9a\x74\xe2\xc7\xc5\x44\x07\xb9\xdf\xbe\x6a\x64\x0a\xf3\xfb\xca\x17\x01\xfb\x3b\xb0\x79\x7b\x6c\x3d\x24\x27\x9c\x11\x9f\x9c\x70\x07\x26\x9c\x2e\xa0\x8c\xf3\x65\x19\x81\x75\xd6\x28\x14\x57\xa4\x78\x77\x91\x32\xab\x10\x68\x88\xab\xac\x11\x01\x90\x30\x97\x11\xe8\x11\xd0\xc6\xb7\x8a\x4a\x40\xf0\xf9\xdc\x10\x64\x14\xd7\x58\xb1\x2a\xe2\x3e\x22\x7e\xa3\x71\x6b\x59\xb9\xf2\x80\xc0\xf2\xf1\x42\x41\x07\x84\x1d\x6f\x0a\x27\xf9\x1d\xf5\x42\x33\xba\xb4\x84\x40\x97\x6f\x3d\xba\x2a\xc8\x9f\x18\x4c\x0c\x51\x3c\xaf\x87\x61\xa6\x15\x4e\xfc\xc1\xd0\xcf\xb8\x34\xe4\x74\xe7\xf8\x99\x11\x6d\xfb\x21\x90\x5d\x66\xf8\x36\xa6\x03\x5f\x4c\xbb\xce\x9d\x6c\x49\x47\x4e\x62\x69\xcb\x3b\xb4\x0f\x41\x85\x06\x36\x22\x2c\x1b\xd1\x81\x52\xcc\xb5\x65\x15\x36\xa9\x6d\xa3\x45\x6c\x91\x11\x03\x86\x1d\xb6\x0e\x85\x67\x21\xd0\x19\x7c\x3a\x96\x9b\x58\x87\xea\x22\x75\x38\x49\x13\x97\x10\x8f\x9d\x65\x17\x54\x52\x14\xf8\xf1\x6c\x9e\x50\x8d\x11\xb8\xbc\x64\x96\x30\xb5\x4e\xa8\xe6\x60\x43\x92\x5b\xbe\x80\xc5\x94\xe6\x0b\x88\x5b\xc9\xa0\x0a\x2f\x23\x4a\xc8\x10\x2f\xf1\xba\x69\xf2\x0d\x3d\x56\x23\x48\x4a\x46\x91\x5b\x56\xef\x40\x2c\x8b\x6c\x76\x4d\x73\x7f\x90\x88\xa8\x81\xbd\xc4\xf4\xe0\x99\xe0\x43\x90\x33\x31\xd7\x36\x19\x35\xf8\xb9\x1c\xf6\x09\x89\x1a\xd0\x7c\xe2\x61\x37\x97\xc3\x2e\x89\xda\x91\x52\xac\x63\x8a\xcb\x65\x1c\x10\x0f\xe2\x0b\x40\x53\xa6\xf8\xcb\xbf\x03\xf1\x1d\xd8\xa4\x6d\xfa\xbc\x3b\x0f\xba\x63\x80\x34\x88\x6b\x36\x0e\x44\xc3\x66\x83\x61\x56\x14\x68\xd8\x9b\xc4\x57\x6c\x53\x04\x44\x92\x6a\xfd\x35\xe2\x01\x69\x07\xca\x08\xf0\x17\xcd\x01\x8f\xce\x93\xe0\x7b\xdc\x38\x9b\xe2\x38\x58\xed\xa3\x4e\xdd\xaf\x4c\x06\x5f\xd5\x58\xe7\x87\xf5\xe4\xa5\xbc\x64\x21\x03\x5b\xce\xe4\x32\xeb\x00\x8f\x33\x12\x0e\x8f\xb3\x8e\xa8\xe7\x78\x62\x3f\xea\xa9\x20\xee\x86\x78\x3a\x43\xe5\x5c\x18\xe2\xd5\x8c\xe8\xb1\x42\x05\xab\x71\xb9\xd7\xdf\xc5\xa3\xde\x1d\x77\x46\xad\x7e\x67\xd9\x8f\x5b\x4a\xdc\x59\xe6\x36\x4b\x7c\x57\x6e\xe9\xb0\xfc\x5c\x7f\x08\xfb\xb9\x68\xbf\xe5\x72\x2b\xba\xcc\xbd\xef\xf6\x42\x4f\x72\xe6\x61\xb3\x37\xee\x78\x9c\xf5\x46\xce\xed\xc2\x71\xd7\xf1\x07\x6c\xfb\x18\xf4\xde\x87\x19\x3a\x84\xac\x46\x6b\x30\x1c\x01\x2b\xe7\x76\x01\x43\x3d\xde\x52\x5e\xe3\x85\xb3\x90\x12\x89\x24\xb9\x76\x9c\x17\x3f\xe9\x3a\x94\x00\xa8\x8c\x44\x82\xea\x7b\x19\x67\x96\xa1\x11\x1c\x83\x0c\x0d\x7b\xfc\xa9\x57\xc4\x58\xb8\x71\xf0\xb2\x99\xc8\x3f\xda\x3c\x9d\xd1\x80\xba\xff\xdd\xf6\xa9\xff\xf3\xfd\x33\x9f\xdc\x3f\x1f\xf5\x76\xf5\x2b\x42\xbd\xf0\x54\x5f\x57\x27\x34\x6d\x94\x23\xe8\x55\x73\x2b\x6e\x39\x66\x3b\x79\x23\x57\xc0\x1a\x7f\x19\x26\x98\x12\xca\x3b\xb9\x02\xd0\xb1\xfa\xe2\x80\x37\xe5\x47\xe0\x90\x48\x70\xcb\xb9\xb6\xe5\xe4\x3c\x5b\xdd\xe3\x7c\x85\xb2\x5f\x4f\xe8\x4a\xd1\x4a\x30\xde\x88\x99\xb3\x1e\xd5\x68\x47\x5c\xca\x92\xfc\x2a\x20\x94\x18\x66\xa0\xee\x60\x41\x2e\x87\x68\x2e\xe2\xfe\x3e\x0e\xd0\xf7\x0f\xb6\x29\x07\xb8\xc1\x1d\x3b\x6a\xc6\x01\xf1\xb3\x59\xff\xc0\x55\x16\x51\x23\x9b\x6d\xf0\x04\xc6\xcc\x14\x8a\xf7\xfc\x69\xa6\x37\x1e\xb1\xc9\x72\xd8\xc9\x66\x98\x79\x6f\xfa\x61\x66\xe8\x8f\x46\xad\x30\x90\x54\x36\xa1\x9d\xb1\x8f\x33\xda\x7a\xce\x07\x1b\x99\xdc\x3a\xca\xb4\x42\x98\x58\x96\x28\x7a\x02\x8b\x27\x21\x00\xd4\x7c\x64\x2a\xc2\x62\x4a\x18\x88\x95\x84\x27\xc9\x57\x61\xb3\x7a\x2a\x8e\x9c\x3c\x11\x7f\x77\x16\x09\xdf\x56\x89\x33\x9e\x72\x5e\x3e\x92\x1a\x40\x2e\x99\x12\x12\xab\xa9\x3b\x27\xfc\x6d\x70\xa4\x96\xbd\x0e\x22\x75\x5f\x32\xe3\xa4\x89\xd2\x8a\x0d\xe5\xe1\x1a\x68\x95\x01\x85\xeb\x47\xd4\xcb\xb0\x6a\xc0\x29\x26\xfe\xc0\xa1\x1d\xdd\x67\xc8\xa2\xa3\xde\xa0\xcc\xa4\x30\x33\x06\xad\xcb\x61\xa6\x84\x5a\xaf\x9e\xad\x19\xc8\xec\xbe\x6a\x34\xb2\xb7\x5d\x1e\xcb\x71\x42\x3c\x3f\x82\x8d\x56\x94\xfa\xdd\x4a\xc9\x6a\x31\x2e\x72\xae\xe6\xa0\x05\x36\x14\x39\xbf\x5a\x4f\x14\x11\xed\x6e\xb2\x93\x5c\x5c\x28\x3c\x51\x8c\xb6\x39\xac\xa2\x37\xcb\xc0\x7a\x71\x1b\xeb\xdb\x58\xdf\xdd\xc6\x05\x5b\xef\xd2\x7e\x22\xa6\x0b\xfd\x0e\x37\x14\x91\x1a\x5e\x73\xac\xa6\x35\x62\x5b\xbb\x9d\x63\x3f\x67\x0e\xfc\x46\x9b\xc5\x85\xaa\x21\x4c\xcd\x7d\xd3\xfa\xf0\x6c\xad\x2f\x52\xd5\xb3\x50\x3f\xb9\x9a\x00\x13\xd8\x23\xd5\x34\xb1\x50\xe2\x2a\x21\xfa\xe9\x77\xba\x40\xd8\xe7\xc5\xa2\x90\x75\x19\xfe\x3e\xcd\xcb\xfb\xdf\xfd\x04\x92\xde\xd4\xf1\x1f\xd5\xa5\x4e\x0e\xbb\x5c\x63\xfe\xb2\xd4\x97\xc3\xfa\x72\x7f\x10\x0a\xc1\x73\xbf\x38\xfc\x9c\xd4\x57\x35\x1a\x6d\x86\xda\xe9\x6a\x82\xcf\x3b\xfc\x99\x53\xdc\xd0\xe9\x32\x31\xb0\x6d\x76\x09\x2e\xde\x15\xe0\xc1\xfb\xc1\x64\x64\xcd\x23\x0e\xf6\x13\xf0\xf9\x71\xb3\x67\x5f\xd3\xd8\x57\xa0\xb9\x00\x1a\xa8\x09\x07\x27\x94\x14\x36\xf9\xc4\x15\xbf\x37\xf5\xfa\xb9\xaa\xa2\x1b\x9e\xa8\x91\x4a\x8c\x1f\x2e\x8a\x57\x4d\xd8\x1b\x74\x69\x27\xe3\xb5\x86\xa3\x41\xcb\x19\xb3\xf2\xe5\xcc\xb0\x15\x74\x69\x86\x64\xd6\x73\x6e\xee\xb7\x6f\x72\x47\xd8\x6e\xb4\x48\x09\x71\x2a\x1e\x2d\x1b\x26\x25\x1a\xcd\x3b\x68\x33\x8a\x60\x33\x38\xa1\xdf\x9b\xba\x3f\xed\x6b\x79\x7d\xfb\x3b\xfd\x4e\xd1\xa6\x32\x07\x23\x75\x66\x3f\x17\x26\xb5\x1e\x1c\x3b\x19\x94\xc8\xa2\x36\x01\x91\x21\xe3\x54\xd8\x47\xd9\x40\xb9\x82\x2a\xb4\xc4\xaa\x3f\xb5\x31\xde\x32\x76\x09\x23\x9e\x97\x57\xcd\x51\xb4\x85\x6d\xcd\x41\x56\x3f\xd5\x91\xc2\x43\x08\x71\x17\x28\xb9\x94\xe2\xb5\x20\x79\x91\x65\xd8\x84\xfc\xaa\xe4\x9c\xb2\xa3\x2e\x9d\x9f\xf5\xe8\xa6\xa9\x0d\x01\xb9\x3e\x17\xc2\x0d\x5e\x53\x3c\x29\x6a\x12\xc3\x6c\x08\x37\xf5\x8f\xa1\x7a\xe8\x3f\x17\x33\x7e\xff\x9a\x3a\xca\xa1\xcf\x86\xd8\xfc\xdb\x6c\xd6\x78\xc0\x43\x7e\x2d\x38\x39\xa1\xa4\xa9\x77\x7a\x81\x56\x50\x5f\x06\x5c\xa8\xca\x49\x0a\x11\x7a\xde\x7d\x4e\x19\xef\x27\x94\x58\xeb\xdd\x56\xd8\x1b\x04\x83\x96\xd7\x69\x85\xfe\x3a\x76\x27\x14\x0f\xab\xb8\x7a\x81\xbd\x21\x9e\x4d\x29\x3e\xae\xe2\xe9\x19\xbe\x3f\xc3\xce\x09\x7e\xac\xe2\x5e\x15\xbf\x9f\xe3\xe1\x39\xfe\x7d\x81\x07\x03\x8a\xd7\xe9\xb4\x35\x1c\xb5\x46\x1d\x7f\x1d\x07\x27\xf8\xad\x8a\x2f\xce\x70\xfd\x0c\xd7\xce\xf0\xcf\x21\xc5\x4f\x43\xdc\xac\xda\x8a\xf5\xb5\x72\xe3\x24\x1e\xa7\x36\x47\xdd\x4e\x79\xca\x67\xe9\xd4\x87\x80\x2d\x67\x3e\x2d\x7b\x98\x86\x6e\xb3\x37\x28\xbb\xf8\xc4\xa7\x65\x07\x6f\x1c\x96\x8b\x06\xee\xd2\x41\xd0\x0a\xcb\xdb\xca\xfb\x57\x5e\x57\xf8\x64\xa7\xd6\xdb\xa1\x1d\x5f\xc5\x7e\x86\xb4\xeb\x97\xeb\x58\xa8\xb2\xcb\x96\x8d\xef\xdd\xf2\x27\xa8\x05\x6f\x58\xd6\xc3\xe9\x62\x21\xfc\x8e\x3c\xb7\x34\xa8\xbd\x72\x73\x03\x67\x23\xfe\xc5\x02\x61\x17\x1c\xf7\x3a\x15\x97\xcc\x40\x59\xf5\x76\x68\x83\xb7\x1f\xf6\xf5\xfa\x2a\x9a\x30\x18\x7b\xc4\x94\x7c\xa8\x89\x4c\x7e\x61\x94\xd8\x78\xd5\x5c\x2c\x21\x4b\x82\x73\x3b\xa6\x8b\x85\x72\x36\x4b\xc3\xef\xae\x00\x5f\x51\x16\xa9\x5b\x2e\xaf\xea\x5f\xa6\x6a\xd4\xc7\x74\x11\x35\xf7\xab\xb5\x92\x7f\xf0\xaa\x77\x67\x51\xb9\x43\x18\xe9\x86\x8d\x52\x8d\xd5\x18\xb8\x8b\xc4\xeb\xe1\x8f\x7f\x00\xc3\xcd\x7f\x03\x43\xcb\x2b\x5f\xd4\x35\xab\x59\xc5\x0c\x02\xbd\xe5\xd9\xe8\x3f\xc2\x75\x2d\xe1\x8a\x8f\x48\x09\x69\x84\xf5\x69\x4d\x66\x76\x42\x90\x44\x9f\x91\x33\xa1\x28\xac\xdc\xef\x61\x59\x3c\x78\xb6\x36\x6c\x6b\x6a\x27\xa6\xe5\x76\x88\x41\x0f\x5d\x1e\x8c\x69\xce\xd3\xa9\x93\x1b\x84\x34\xa7\x79\xfa\x2f\xb7\x72\x78\x56\xbe\x45\xb9\x77\xfe\x7d\xef\x57\x1a\x97\xec\x7b\x08\xdf\xd6\xb9\x67\x57\xae\xab\x2c\x21\x68\xe0\xd3\x90\x96\xd7\xd6\xa8\x55\x9f\xd9\xd1\xb8\x80\xa9\x56\x6a\xe5\xa1\x8f\x72\xd0\x73\xcb\xb3\x17\xfc\xc2\xf1\xfd\xa2\x9c\x24\x0d\x0e\xc2\x38\xc8\x01\x26\x74\x67\x30\x1e\x36\xb3\xd9\xf8\xb7\xee\x3a\x1a\x82\x9e\x92\x38\xba\x03\x1c\x25\x44\xb6\xab\xba\xfa\xee\x16\xde\xff\x76\x38\x1f\x0d\xc9\x67\x6b\xe4\x77\x87\x65\xcb\x5e\x08\x8b\x6d\x1f\x8e\xe1\x83\x90\x89\xe3\x08\x87\x0c\x9d\xf0\x32\x85\xf1\xc5\xf2\xfb\x05\xf6\xe8\x88\x96\x3f\xe1\xbd\xb9\x63\xcd\x5c\x7b\xb3\x88\x01\x9e\xb2\xbf\x58\x20\x24\x1a\x09\xb2\xd9\xa8\xe6\x75\x5d\x0b\xd8\xb2\x31\xa3\x1b\x59\x37\xba\x9d\x25\xc4\x8b\x45\xe2\xab\x56\xe8\x67\x80\xe7\xb0\xc3\xcd\xb0\xef\xbb\xad\x06\x3b\x51\xbd\xb7\x46\x4d\x26\x28\xd3\xcc\xc8\x9f\x8e\x32\x80\x18\x76\xa8\x71\xc9\x75\x5d\x73\x73\x7e\x03\x7b\xc8\x8c\xba\x73\xd1\x02\x32\xd8\x88\xdb\x89\x74\x01\x5b\x27\x9b\xd5\x42\xbd\xe5\x91\x0e\x3e\x9a\x6a\x21\xfe\xe4\xe0\xbf\x85\x8b\x78\x79\xc2\x60\xef\xcf\xf8\x60\x43\x85\xde\x8e\x4e\x68\x74\x10\xe2\xa5\x7c\x89\x12\xde\xcc\x30\xd4\xba\x47\xb8\x90\x78\xc9\x7f\x1d\x1d\xb6\x29\xe1\x95\x7e\x0f\x45\x25\x36\xa2\x32\x15\x93\xed\x2c\x16\x26\x38\x99\xd1\x19\xf3\x24\x6b\xaa\x68\x1a\xaf\xc4\x9b\x95\xb3\xd9\x6a\x68\x6d\xb9\x5d\x03\x37\xf6\xb1\x87\x1b\xb1\x05\x48\x48\xda\xc4\x30\xc3\x03\xc9\x48\xcd\x50\xda\xeb\xf7\x05\x73\x0d\xe1\xd6\xbd\x0f\x1c\xf1\xfe\x2c\xd2\xe4\xf5\x49\xdf\xda\xb0\xf1\x90\x18\xe6\xf0\xa0\x0f\xd8\xbc\xb0\xcd\xa1\xac\x3d\x26\x3c\x6d\x68\x9b\x63\xa8\xfa\x7b\x08\x61\x32\xb9\xac\xd7\xc6\x63\xbe\xc0\x18\xa5\x20\xb4\x58\x18\x84\xb4\x21\x3f\x98\xcf\xc5\x1b\xfc\x89\x19\x90\x36\xc0\x39\x24\x21\xe9\x43\x3f\x11\x94\xac\x1f\xb1\x7c\xc7\x02\xce\xa1\x8d\xc7\xf1\x4a\xbe\x3f\x2b\x8f\xc9\xf1\x09\xd5\x58\x47\xd8\x41\x66\x98\x23\x63\x76\x22\xd2\x8c\x83\x61\x65\xac\xff\x9c\x94\x0d\x64\xf6\x05\x3c\x7d\x3c\x86\xb3\x9f\xe2\x0c\xcb\xbf\x28\x87\x39\x52\xd0\xb7\xbf\x07\xb9\x71\xbc\xba\x6e\x9c\x45\x5c\xa9\xf8\x3d\x80\x36\xac\x13\x5b\xeb\xe7\x8a\xdf\x83\xcd\x82\xbe\x53\xd8\x43\x66\xc0\xd3\x42\x35\x6d\x22\xef\x1a\xfa\x38\xe0\x23\x0c\xc9\xcf\x57\xcd\xd3\xa7\xf9\x86\x3e\x45\xb8\xcf\xbf\x66\xf9\x86\x3e\x43\xf8\x83\x47\xd1\xfc\x20\x6e\x85\xbb\x64\x60\x05\x73\xe1\xf7\x36\xf6\xf4\x59\xee\x5b\xff\xbb\xd6\xce\x4d\xac\x43\x7b\xb3\x88\x50\x39\x51\x62\x62\x0d\xd8\xe2\x63\xc5\xfa\xdf\x45\x11\x3c\x24\x1f\xfa\x34\x2f\xb2\xc6\x64\x98\x63\x3f\xf1\x11\xf9\xd0\x67\x79\x5e\x06\x57\xc9\x11\xb4\x68\x06\x4c\x22\xe3\x57\x3c\xa2\xe1\x0f\x7d\x8a\x8f\x01\x38\xfc\xa1\xcf\x70\x7b\x53\xe9\x1c\x40\xe5\xc5\x8e\x5f\xa1\xa4\xa7\x4f\x71\xbe\x00\xbe\x1c\xb8\x97\x06\xc0\x85\xcb\xc6\xe8\xea\x33\xf9\xc5\xc6\x28\xf3\x3e\x58\xde\x87\xcc\xfb\x60\x79\x81\xbe\xf1\x4a\x0a\x84\x84\xdf\xfb\x15\x8b\xd1\xf4\x87\x5d\xb6\x3e\xb0\x87\x5d\x1b\x99\x81\xde\xe0\xaa\xce\xd3\x8e\x06\x55\x8e\x10\xf7\x83\x3c\x16\x7f\xab\xe2\xef\x10\x7c\x27\xf8\xd6\x99\x9d\xdb\x36\x5d\xe2\x5b\xae\x67\xe7\xb7\xf9\xa1\x9c\x35\x62\x9d\xd9\x3f\x88\x97\xcd\xc2\x6f\xd7\xb3\x0f\x88\x8b\xd0\x67\x48\x9a\x6d\x0d\x66\x36\xe4\x65\xcc\x17\xaa\xb1\x9f\x0c\x09\x0d\x7d\x8a\x43\x51\x9c\x0d\x13\x99\xbf\x92\x99\x7d\x9e\xca\xd6\x0c\x09\xf5\x8d\x57\x34\x24\x7d\xcb\xb0\x31\xfb\x87\xf4\xad\x22\xfb\x55\xb4\xc9\x10\x12\xf4\x29\x91\xd5\xe0\x0b\x10\xd7\xb7\x0a\x89\x8c\x82\xcc\xf8\xc6\x6a\xaa\x39\x45\x91\x63\x86\xca\x60\xc2\x78\x30\x15\x8d\xa3\x8a\x81\x07\x18\x05\x80\xca\x1a\xfb\x9d\xcd\x6a\xdc\xb9\x66\xbd\xab\x79\xb9\x12\x76\xf3\x25\x46\x27\x22\x85\x15\xe4\x10\xc1\x2f\xd6\x11\xc2\x63\x99\x1b\x44\xb9\x41\x9c\xbb\xa6\xf5\xad\x99\x7d\x40\xc6\xd6\xcc\xce\x66\xfb\xba\x1f\x7a\x3f\xc8\x98\xfd\x41\xd9\x2c\xcf\x1a\xaa\x59\x43\xf6\x27\x9b\x5d\x09\x22\x23\x00\x3e\x8a\x1f\x8c\x12\x5f\x28\x94\xc2\x62\xce\xf2\x9a\xcc\xcd\xbb\x08\xe1\x5f\x22\xd7\x95\xd5\xce\x6c\xf0\xb8\xf1\x4b\xad\xe5\x7a\x76\x4e\xf3\xf2\x22\x1f\x21\x2c\xdb\xf4\x10\x42\x0b\x8f\xf8\xfa\xa8\xd7\xcf\x6d\x9b\x3e\xf1\xad\x6b\x37\x41\x25\x2c\x27\x26\x93\x6b\xd7\x3e\x20\x3e\xdc\x8a\x72\x32\x09\x89\x2b\x0a\x99\xf2\x07\x9f\xa1\x19\x76\x45\x05\x98\xa3\x6b\xaa\xb9\x11\x9d\xcc\x70\x18\xd1\x09\x6b\x60\xe3\x15\xf5\x49\xc8\xe8\x84\xfd\x43\x42\x46\x27\xec\x1f\xd2\xc7\xdf\x58\x8a\x3e\x93\x6d\xf2\x2f\xa0\x87\x90\x91\x86\x92\x51\x88\x33\x8a\x89\x8c\xa2\xc8\x88\x00\x84\xe1\xb8\xf1\x70\x04\xa1\xb8\xd1\x2c\xb8\x92\x50\x78\x91\x1f\xbe\x98\x28\x56\x39\x4f\x64\x72\xde\xc7\xd7\x02\x8d\xbe\x40\x3e\x2b\x00\xd8\xbf\x56\xb1\x7f\xed\x46\xd8\x07\x97\x9a\x71\x59\xe2\x45\x8f\xfa\x59\xc7\x68\xd1\x00\x15\xfd\xe7\xc2\x6c\x93\x06\xe7\x9d\x66\x5b\x2e\x76\x59\x29\xd7\x8e\x26\x35\xdf\x8e\x7a\x90\x3f\xcf\xec\x1c\xf8\x61\x11\x31\x91\x6f\x48\x9b\xd5\xc1\x61\x74\x5a\xc0\xd7\x44\xdc\x5b\xf1\xbb\x96\x10\xee\x5a\xc0\xb6\xf3\x0d\x42\x38\xe8\x8d\x4b\xf4\x79\x4d\xd6\x0c\xbe\x23\xc0\xf9\xe9\x8e\x58\x36\xee\xcb\xbb\x98\x54\xc5\x09\x91\x55\xf1\x04\xb6\x3b\xb6\x55\xc2\x46\x78\x4f\x26\x7c\x9f\xb4\x6c\xb3\xcf\x04\x8e\x21\x32\xab\xec\x28\xd8\x1b\x68\x1f\xe4\x5e\x6e\x9c\xd5\x83\x0f\xb3\x2a\x37\xcf\x07\x52\x3d\xa1\x1a\xcf\xab\xda\xf8\x9b\x83\x4c\x88\xbd\xf5\x80\xcc\x89\xde\xb8\xcc\x66\xb5\xea\x8f\x3b\x50\xef\x54\xee\x20\x1d\x2e\x69\xee\xac\xaa\x2d\xb6\x26\xf6\x13\x43\x2a\x5a\x2c\xa0\xeb\x31\xfb\xe7\x88\x18\x8c\xde\xae\xd1\x3f\x19\x01\x1b\xc0\x35\x54\x05\x69\x8d\x6f\x59\x5d\xca\x9b\x60\x60\x40\x2b\x62\x78\x55\x62\xe0\x15\xa3\x79\x20\x7d\xeb\x08\xc6\x30\x21\x0c\xa6\x3c\x83\x09\x5f\xb3\x06\x27\x08\x77\x69\x8e\x4c\xf8\xc8\xba\x14\x99\x47\xb9\xdc\x82\x03\x76\xa4\x80\xf6\x19\x03\x66\xde\x91\xcf\xb3\x66\x79\x22\x64\xa4\xc5\x42\xba\x03\x9d\x24\xf6\x7d\x0e\x92\x79\x4d\xee\xd8\x9f\x2e\x05\x31\xe0\x1e\xc2\xcb\x02\xf2\xfa\x54\xeb\x52\xdc\x05\xa5\xe8\xd0\x3a\xb2\x91\x09\x86\x12\xda\x4d\x8e\x74\xa9\xfe\x73\x82\xcc\x7b\xab\x7f\x68\x67\xb3\x47\x53\xed\x1a\x7f\x36\x68\x59\x50\xdf\x4d\x1e\xf2\x37\x8b\x11\xf1\xe1\x9b\x5c\x17\xf4\xac\x90\x21\xa9\x0f\x1e\xe3\x09\x31\xe9\x02\x5e\x5c\xff\xa4\xa4\x6d\x9d\x7d\x89\xa6\xcf\x7b\x46\xef\x11\xb2\x04\x9c\xdf\xfa\x54\x7b\x80\x59\xcc\x8d\x79\x06\x83\xb4\x9a\xcd\x6a\x3f\x69\x8e\x3c\xe8\xad\x5f\x7c\x4e\x1e\x28\xb9\xc9\x69\x00\x47\xfe\xc1\x3a\xb4\xd1\x66\xd1\xbc\x4f\xef\x90\x0f\x54\x6c\x89\x3f\x69\x0e\x08\x03\x8b\xe4\x1c\x54\x91\x79\x08\x99\x4c\x0e\x7e\x60\xf0\xb2\xc5\xa5\xdd\x0b\x8e\xcb\xc0\x47\x79\xf9\x05\xd3\xf8\x42\x21\x17\x8b\xc4\x1c\xeb\xe2\x97\x9a\xc6\x58\xee\x03\x6b\xf2\x02\x5e\x68\xdf\x23\x13\x00\xb7\x06\xf6\xe2\xf4\x5d\xbb\xc6\x17\x14\x99\x80\x74\x26\x75\x1c\xe5\x72\x29\xf1\xab\xca\x49\xeb\x83\xdc\xe4\x1a\xb9\x6a\x24\x7f\x6d\x16\x31\x9b\x58\xbd\xd3\x0a\xf9\x75\xc2\xe1\x95\xdc\xcb\xf1\x47\x3c\x33\x1f\x08\xdf\x70\xf9\x2d\x59\x79\xe1\x31\x58\xee\xd0\xc2\xd7\xfd\x70\x34\x68\xf9\x43\xe2\x99\xbe\x3e\xdd\x20\x6b\x6b\x9d\xc8\x83\xd6\x78\xc4\x9a\x2f\x07\xf8\xf7\x39\x3b\xc0\xc4\x52\xf6\xf1\xb2\xe9\x84\x21\x2c\xa7\x0d\xdc\x60\xeb\xfa\x80\xca\xe9\x6d\xe4\x72\x88\x5f\x1a\x54\xe1\xe0\xca\x92\x1b\x4c\x18\xc5\x2e\x71\x73\x5a\xc0\x66\x56\x33\x0e\x1a\x95\x40\x6f\xfd\x2a\x1b\x08\x61\x4f\xac\x5f\x0f\x07\x30\x2b\xbe\xf8\xf6\xe1\x7b\xb3\x98\x0b\x80\x3e\x05\x94\xef\x2d\x6f\xd4\x2c\xbb\x98\x5b\x18\x94\x3d\xfc\x73\x52\xf6\xf3\xde\x66\x51\x39\x63\x54\x25\xbc\x5f\x1e\x76\xdd\xf4\x61\x97\x37\xeb\x54\x9c\xc8\xe2\x4e\x1c\x49\x11\x76\x91\x35\xb0\xcb\x86\xec\xd1\x65\xe2\x3b\xeb\x15\x7e\x6c\x6e\xe9\xc5\xad\x1d\xdc\xfa\xa5\x7e\xc6\xc7\x58\x69\xb1\x04\xad\xdd\xcd\xec\x2f\x46\xe1\xb2\xf6\x3c\xd6\x8a\xb7\x88\x3c\xcd\x4a\x4b\x48\xa5\x3a\xfe\x53\xc5\x85\x72\xca\xad\xc5\x9a\xb9\xdb\x28\xde\xdb\xc6\x90\x78\xe2\xe7\xe0\x04\x82\x88\x0a\xff\xa9\x85\x6d\x64\x4e\x46\xd1\xf5\x1e\x84\x3a\x7c\x18\xca\x98\xe1\x6f\x5b\x89\x90\xe1\x0d\x8f\xd0\xc5\xb3\x56\xab\x43\x40\xb8\xd8\xfb\x49\x3d\xe9\xde\x72\x63\x68\xb2\x7f\x08\xf7\xd2\xcc\x7e\x32\x66\x74\xf5\x0a\x3f\x51\xe5\xea\x55\x73\xd1\x7c\x4e\xf5\x86\x07\x6e\x58\xcb\xf0\x8b\xc7\x32\xab\x81\x15\xed\xdb\xd6\x72\xe4\x08\x88\x63\x25\xc6\x92\x27\x22\x44\xc1\xe0\x24\x1a\x13\x35\x8d\x1f\x44\xe4\x4b\x4f\x28\xb7\x43\xe9\xf1\x15\xc6\x8f\xc5\x20\x78\x5f\x09\x0f\x9d\xf5\x55\x1e\xb9\x84\x22\xa0\xe2\x97\x0b\x42\x13\x2c\xaf\x6b\x3e\xcf\xcb\x96\x8d\x47\x7e\x79\xad\x80\x83\x66\xd9\x58\x98\x3e\xdb\x39\x1c\x72\x02\x76\x04\xec\xcc\x19\x60\xf1\x36\xbb\xd2\x60\xa5\x56\x68\x58\xf9\x43\x66\xc6\x1d\x22\x0a\x3f\x2f\xfb\xac\x55\x47\x0f\x46\xac\x5d\x47\x0f\x9a\xea\x62\x3c\x39\x59\xe9\x39\xac\x21\xec\xca\x83\x03\x45\x55\x9d\xcd\xb6\xc0\xff\x9b\xd5\x76\x6d\x0d\x81\x7b\x8d\x01\x93\x59\x3e\x83\x91\x80\x3a\x58\x80\x71\xc7\x81\x17\x2f\xee\x36\x31\x70\x87\x18\x38\x20\x05\x33\xe0\x76\x76\x81\xdc\xa4\x99\x38\x71\xec\xd8\x4c\x02\x04\x19\x8e\x0c\xfd\xf9\x3c\x24\x64\xe0\xcb\xf3\x33\x93\x27\x9a\xae\xad\x19\x38\x10\x07\x02\x06\x50\xab\xa1\x75\x48\x1f\xb7\x49\x80\x79\x69\xce\xf5\xc0\x96\xcd\xed\x85\xa3\x56\x38\xf6\x85\xd8\xb1\x60\x58\x3e\x88\xce\xef\xe0\x0a\x44\x36\xd9\x06\xe7\x58\x80\x01\x48\x69\xe7\x0a\x88\xa3\x22\x5f\xc0\x0c\xc1\x7c\x68\x12\x75\x9c\x8f\x74\x30\x43\x21\x82\x86\x7d\x08\x43\x1b\xc3\x58\x40\xb9\x07\x1f\x61\xf7\xc0\x43\x1c\x01\x81\x24\x58\x26\x31\x6d\x43\x20\xae\xc0\x0c\xf2\x79\x36\x02\x2f\x39\x38\xec\x29\xa8\x4e\x80\x19\x48\x14\x1b\x0c\x0a\x6f\x21\x67\x36\x4a\x32\x16\x0b\xd6\xd8\x83\x0f\x18\x72\x25\xf6\x03\x52\x4c\x74\x48\xc9\xb7\x86\xb6\xae\xeb\xfa\xba\xd2\x30\x4d\xf7\x9a\x2e\x10\x77\x43\x57\xf6\xcc\x7b\xa2\xfc\xa6\x4c\xed\xce\x27\xf1\x00\x72\x0f\x3e\xee\x90\x86\xe6\x23\xdc\x49\x77\xe8\xab\x7d\x74\x16\xdc\x5b\x0b\x1b\x4b\xba\x33\x4f\xe1\xc9\xa7\x89\xdb\x8f\xd8\x86\xb5\x5c\x9f\x50\xdc\xa7\x9e\xd7\x0a\x83\xf2\xc5\x11\x76\x7a\x03\xcf\x1f\x94\xdd\x90\x4a\x25\x1c\x65\x8c\x35\x9b\xd5\x4e\xc1\x3a\x87\x7d\xe4\x7e\x23\xec\xe8\x5c\x4d\x4e\x64\x8a\x2c\xad\x53\x27\x9b\x6d\x4c\xb9\x6b\x5f\x47\x0d\x6d\x1f\xc1\x72\x57\x97\x5e\x80\xee\x7b\x9c\x5d\xbc\x97\x48\xf2\x4d\xc3\x99\x0a\x2e\x63\x93\x77\x75\xd3\x61\xc5\xe8\x8a\xcb\x98\x9f\x2b\x0b\xdf\xf7\x56\x16\xbe\xaf\x27\x5f\x64\xe8\xef\xa5\xd8\x7d\xee\x7b\x49\x31\xae\x70\x86\x60\xe0\x70\xe7\x87\x9e\x3f\xf0\x07\xf0\xae\x66\xe8\x8f\xd6\x91\xb9\xb8\x03\x16\xf9\xf8\x9e\x32\xfd\xe2\x4d\x8a\x91\x21\xd5\x44\xe1\xbe\x17\x37\x7c\x47\x8f\x3a\x6a\x63\x8a\x13\x05\xf5\xf9\xc3\x75\x20\x37\x8e\x0b\x47\xbe\x78\xc8\x66\x83\xb6\xe6\xa0\xf9\xfc\x53\x99\xda\xdf\xea\xfd\xcb\x43\x1d\xc2\xb6\xfd\xaa\x6b\xb5\x63\x84\xeb\xc7\x09\x4b\xcf\xc7\xc4\x26\x11\x17\xed\x1c\x23\xec\xf5\x28\xdb\x7c\xa2\x8e\x1e\xea\x9a\x8b\x6f\x8f\xb1\xb3\xea\x3e\xf3\x29\x79\x95\xfc\x50\xd7\xe2\xc6\xda\xbc\x5f\x47\x36\x19\xd7\x7a\xae\xf3\x2b\xd3\x49\x4f\xb9\x9f\x15\xb5\xa8\x7e\x1d\x60\xaa\x5f\x38\x68\x71\x4e\xb5\x5f\x5f\xbc\x4a\x7a\xe6\x06\x0f\xfa\x20\xd0\xc0\x13\xd2\xc6\x52\x51\x61\xc0\x22\xdd\x6d\x5d\x07\xe0\x51\x37\x88\xcd\xf7\x84\x3b\x32\x69\x7e\xab\x50\x28\x58\x2c\xb3\x1c\x00\xc3\xba\xb0\x2b\x6b\x85\xf2\x63\x4b\xfb\xd5\xd2\x1c\xfc\xb4\xf2\x7e\x8e\x37\x61\x39\x3c\x8a\x36\xfc\x5a\x88\xdd\x1a\x7f\xbc\x32\x08\xe3\x8d\xe3\x3c\x79\xff\x88\x5d\x7e\xa6\xcb\xb4\x18\xe1\x5d\x38\x60\x59\xc7\x1b\x71\xed\x15\x74\xfb\x10\x2b\x6e\x45\x97\x6e\xac\x91\x75\x9d\x2f\x51\x26\xd0\xb0\x40\x26\x94\xd0\x07\xc1\x0a\x33\x1a\x2f\x94\x91\x46\xe2\x5b\x3d\x0e\xae\x0c\x72\x4d\x91\xf9\x26\x2c\x90\x78\x18\xea\xf8\x79\x8d\xa0\x85\x1e\x37\xa0\xd6\xb8\x58\xc3\xab\x0b\x69\x61\xf0\x26\x49\xb9\xf7\x06\x7b\xb4\x8c\x46\xf9\xc6\x58\x97\xea\x51\xe7\x12\x74\xda\x90\x79\x07\x67\x48\xbe\x7a\xe2\x9f\xb3\x7b\x70\x11\x19\x55\xd8\x60\xbc\xe4\x5d\x86\xcb\x06\xff\x25\xa2\xd3\xe3\x16\x5f\x89\x67\x21\xff\x3b\x68\x70\x1e\x73\x4e\xb5\x8d\x34\xae\x62\x9f\x62\x1b\x75\xf3\xfd\x5d\x46\xdf\x7f\x9e\xda\xd6\x11\xdb\xba\x91\x49\x59\x7d\xd1\x4e\x45\xfc\xe5\x79\x3c\xf0\x3c\x8d\xfa\x39\x13\xa1\xba\xce\xc2\x64\xbe\x84\xe7\xb8\x25\x62\x83\xb4\xd4\xfc\x68\x2a\x81\xa8\x37\x96\x88\x5a\x7d\x96\xc7\xc0\x02\x9b\x49\xf6\x2b\x72\x39\xa7\xc0\xc5\xdd\x8e\x0d\x1a\xa8\xbc\x06\x7f\x64\x11\x05\x34\x5e\xe4\x2c\x84\x22\x67\x61\x54\x44\x81\x8e\x17\x39\x6e\x41\x91\xe3\xa4\x0f\xb3\xab\x93\xf8\x95\x63\x4f\x89\x65\x14\x4c\xa2\x99\x1a\x4e\x08\x5d\x3c\x92\xab\x13\xca\x8d\xb4\xdd\xcb\x95\x2e\x3d\x7b\xc2\xfc\x53\x4a\x75\xb3\x7b\x26\x1a\xdd\x0d\xe1\x1e\x95\x5f\x06\x29\xee\x3e\x83\x89\x74\x89\xf3\xd0\x56\x98\x08\x6f\xe9\x92\xfb\xae\x33\x1f\xf5\x87\x76\xba\x2f\x35\xca\xd9\x44\xf4\x25\x74\x35\x0e\xf9\x2d\x02\x3c\x0e\x27\xaa\x39\x9a\x87\x3e\x41\x7c\xf3\x78\x5f\xca\x56\x86\x2d\x6e\xaf\x8f\xa2\x41\x3b\x32\xda\x29\xe5\x93\xaa\x6c\x7b\x8f\x7a\xef\x32\xe5\x3c\x49\x09\xdd\x71\x37\xd1\x28\x3b\x83\xc9\x0f\x87\x1d\xc0\x5c\xee\xcd\x07\xbb\xdc\x1b\x90\x8b\x84\xdf\xa3\xcb\x13\x6a\x7a\x6c\x61\xf0\x55\x31\xd1\x7c\x64\x7a\x6c\x75\xc8\xef\xd8\xbe\xc5\x83\xc8\xc9\x93\x54\xb4\xb2\x2f\x2e\x42\xd9\xfa\x57\x2d\x43\x84\x73\x3c\xe1\xff\xfb\x3e\xdd\x0a\x05\x77\x79\xa6\x72\xd1\x99\xb2\x89\xe1\x0c\x9e\xb2\xd5\xce\x72\xf5\xde\xdb\xaa\x4e\x97\x39\xbf\xea\x4e\x4d\x75\xf1\x75\xab\x6c\x8b\x47\x7d\x4a\x22\xf8\xc4\x4a\x8f\x93\x9c\x44\xe4\xed\x5b\x00\xe7\x56\x0d\x79\xd8\x39\xc3\xdd\x33\x1b\x42\x6a\xdf\x62\x7a\x8b\x4c\xe7\x96\x71\xc5\x4e\x72\x8a\x62\x17\x6b\x9d\x33\xb1\xa1\x00\x99\xba\x6c\x35\xc9\x8d\x9d\x7d\x10\x8a\xd7\x8c\x85\x7c\x43\x22\xae\x14\x59\x21\xb5\x0c\xdc\xaa\xac\x19\xd2\x72\xbc\xb0\x10\x9d\xa6\xa8\x34\xf9\xbc\x8b\xad\x67\x8b\x8d\xea\xa5\xae\x5d\x32\x04\x0d\x1a\xc8\x86\xe5\x10\xdf\xe5\x01\xb3\x54\xdf\x3c\xdd\xaa\xb1\x1e\x01\x37\xad\xaa\x64\xbd\xa7\x92\x48\xdb\x3e\x61\xe2\x95\x23\xb0\x57\x1d\x48\x1f\x51\x1f\x43\x65\x25\x7f\xcc\xc8\xcd\x89\xa8\x3a\x1a\x12\x4f\x04\x73\xbd\x27\xc2\x2f\xeb\x0d\x5f\xf6\x8b\x67\xcd\xbd\xc5\xd7\x27\x14\x99\x8f\xc4\x65\xc3\x32\xe9\xdb\x8a\x60\xe2\xac\xf1\xcf\xc4\x52\x3e\x35\x1d\xe1\x10\x4d\xb6\x27\x00\xd6\xdf\x26\x32\x00\x58\x75\x10\xb9\xc0\xba\xe9\x81\xb9\xa4\x49\x89\xa3\xbf\x75\x35\x6e\x79\x0c\x66\xc7\xc9\xe8\xb8\x02\x78\xf9\x00\x5e\xf8\x75\x93\xa9\xe0\x17\xdc\xd1\x8f\xc0\x19\xa9\xf5\x66\x83\x5b\x6b\x39\x7a\xcb\xb3\x89\xbf\x10\xbd\x59\xce\x20\xe1\x20\xd7\x2d\xf0\x25\xf2\xa8\xfb\x97\xcb\xfe\x40\x3f\x20\xa6\xf4\x49\xda\x89\x19\xe4\x8d\xaf\x34\xaa\xdf\x0f\x71\x14\xaa\x18\x12\xee\x78\xc8\xaf\xa5\xde\xf8\xb3\x82\xf1\x55\x8a\x65\xa4\x42\x00\xcb\xe1\xc5\x26\xfa\x94\x8f\xcd\x83\xc5\x06\x3a\x21\x5f\xea\x83\x24\xfe\xde\x43\xcd\xb7\x1a\x36\xf6\xf4\xc1\x9b\x60\x94\x6e\x61\x45\xcc\x23\x39\x3d\x7a\xd3\xd5\x28\x3e\x3f\xc1\xb3\x11\x8a\xbe\x84\x9f\xd8\xe9\xbd\xc6\xf5\x13\x56\xf8\xc6\x99\x21\xee\x9c\x21\x14\x95\xfb\xf9\x75\xb9\xae\x5a\x2e\xf8\xba\x5c\x30\x84\xe0\x30\x3f\xfb\x4b\x4f\x46\x1c\x6b\xf6\x66\x67\xb3\xf0\x47\x93\x0f\x5b\x38\xd4\xfa\xef\xb1\xe6\x58\x74\x60\x23\xd3\x5d\x23\x9d\x00\xae\x14\x9f\xeb\x8c\x87\x0a\x52\x86\xa7\xb0\x7c\x26\x5f\x9d\xaf\x4c\x8a\xdb\x3e\xc3\x4e\xd5\x4f\x71\x05\xb6\x27\xc8\xc7\xc7\x7c\x2a\x4b\x00\x11\x8f\xc1\xd3\xeb\x09\x63\x61\x60\x9b\xbd\xde\x12\x4b\xe1\x20\x32\xb2\x93\x14\xe7\xda\x51\x50\xc0\x53\xdd\x61\xf5\x1d\x21\xdc\x9a\x8f\xfa\xb8\x94\x22\x82\x5e\x47\x73\x90\x75\xc4\xf6\x4b\x50\x2d\xa7\xc7\x9d\x6c\x89\x87\xdc\x7a\x6e\x2c\x53\xeb\xa9\xfe\xcc\xc3\xf1\xc1\x55\xc5\x09\x25\xd6\xac\x8a\x7f\x9f\xe3\x5f\xe7\xd8\xa9\x62\xaa\x5a\x53\x79\xb7\x51\x2d\xef\x23\x92\xe2\xf8\xd2\xf7\x80\x8b\x1d\xbb\xcb\x1d\x44\xfb\xe0\xc2\xe4\x85\xde\xde\xbf\xa2\xb3\x9e\x49\x23\x81\xc6\x01\x81\x46\x09\xcb\x58\x17\xd2\xa6\xc9\xb7\x6f\xc2\xe4\x90\xf9\x9c\x4a\xe9\xc4\x61\x62\xc9\xaa\xe2\x52\x0b\x36\x68\x60\x8f\x38\xec\x8f\x4f\xe0\x45\xe3\x9a\x9b\xcd\x7a\xf3\xb9\x9b\xcd\xae\x71\x1f\xae\x1e\x92\xd0\xf8\xe7\xb8\x01\x45\x3c\xd4\x20\xae\x7e\xe1\xe8\x77\xb5\xc7\x7f\x9f\xdf\x54\x4f\x9e\xa2\x47\x82\x6b\x2e\x72\x88\x77\x8e\x1b\xc4\x4b\x14\x60\x0b\x2f\x2a\xe4\x59\x3f\x6d\x0d\xad\x11\xe2\xc2\x8f\xf9\x3c\x59\x96\x65\x24\x12\x96\xbb\x73\xb9\xef\xd2\xc6\xc2\xe4\x16\x30\x3e\xcb\xae\x1e\xfe\x3a\xc1\xb1\x5d\x8c\xab\x7b\x74\xe4\x13\x1f\x29\xd1\x2f\xc0\x29\x5f\x7a\x02\xc6\x7d\x0d\xe6\x20\xb5\x86\x2e\x44\xd8\x42\xef\x03\x83\xd4\xa4\x08\x77\xbe\xba\xdf\xaa\xd2\xdd\x30\x12\x74\x1c\x7e\xd0\x06\x3d\x67\xa4\xbb\x14\x39\x6c\x73\xf5\x6f\x41\x3d\xe9\xff\x89\x42\x16\x22\x3b\x58\xe5\x44\x3b\xc5\x0c\x38\x1f\xf0\x57\x8c\x23\x79\xec\x1e\x4e\xa4\x74\xb5\x56\x30\x5f\x96\xa5\x3a\x0f\x7d\x7a\x4c\x84\x00\x9f\x95\x14\xe6\x07\x65\xb3\x1e\x13\x21\x20\x09\x1c\xc2\x7b\xc4\xd3\x3b\x20\x4c\x8a\xe8\x6e\xa0\x3c\x9f\xcf\x3d\x24\x0e\x77\xa6\x9b\xcd\xd6\xc5\x51\xd4\x71\xf0\xb6\x81\x16\x2a\xfe\x1a\xb7\x49\x0d\x61\xbc\x11\xcb\xf8\xe5\x9c\x4a\x39\x07\xb9\x14\xae\x6c\xa3\xed\xaf\xfb\xa1\xc9\x3d\x69\xe0\x71\xc9\x86\x8b\xdb\xa6\x4f\x1a\x82\x4b\xea\x1d\xee\xa7\x1b\x82\x2e\x46\x9b\x34\x2b\xea\xdf\x6a\x3e\x4e\x4f\xca\x48\xee\x62\x6f\x5e\xdc\xcf\xc9\x0c\xde\x5c\x88\x02\x7a\x70\xa1\x21\x2c\xfd\xa9\x5f\x17\xa1\x31\xef\x56\xf3\xd8\x74\x36\xf8\x74\xd2\x37\xad\xb1\x62\x0a\xa2\xa8\xec\xf2\xb0\x24\x9b\x3c\x76\xf9\x2c\x56\xdf\xec\xa8\xdd\x64\xa2\xc2\xc2\x06\x1e\x65\x82\x76\xaa\xc2\x9b\x47\x61\x6f\x04\xdb\x6d\x89\x30\x59\x46\xc8\xda\xa2\x65\x58\x02\x57\xf2\x7c\x8a\xcc\x06\x97\xec\x5a\x5f\x71\x1e\xd6\xa1\x7b\xb9\xa2\x43\x7d\xe0\x37\x06\xfe\xb0\x19\x31\xd4\xe5\x2e\x85\xef\x6f\x36\x9e\xb7\xf7\xb8\x09\xee\xc8\x34\x8d\x23\x41\x01\x9d\x96\x26\x77\x7c\x68\x89\x71\xbd\xb7\x99\x1d\x07\x2b\x68\x41\x90\x0a\x64\x4e\xa7\xe9\x26\xd2\x47\x98\xf1\x25\xe3\x7c\xea\x86\x35\xbe\x84\xf6\x9a\x87\x71\xec\xae\xb8\x24\x06\x83\x67\x29\x58\x0a\x5e\x92\xcd\x6a\x0e\xe7\x21\x51\x12\x52\xcb\x44\xec\x08\x0a\x0e\x7a\xef\xa9\xe4\xe8\x5d\x40\xd2\x49\x4c\x00\x1b\xc6\xdd\x58\x89\xe8\xba\x78\xd6\x82\x5b\x7c\x37\x46\x66\x00\x53\xd2\xfd\x58\x15\x48\x18\x9e\xfb\xf1\x02\xc3\x44\xf8\xfd\x77\x11\x06\xf7\x56\xfa\x37\xbd\xf5\xf8\xfe\x63\x1e\xbf\x6b\xc1\x6a\x5c\xdf\xca\x98\xd1\xb7\x9e\xc0\x31\xc7\x6b\x90\xc6\xab\x8a\xc3\x5b\xaf\x22\xeb\x00\x1e\x99\xb4\xad\xba\xbf\xb9\x55\x4f\x6f\x4e\xa5\x76\x42\xcb\xf5\x13\x8a\x3d\xee\xbf\x88\xd3\x43\x2f\xf9\x80\xb9\x90\x83\x27\x10\x1a\xcd\x17\xd0\xa6\x87\x70\x43\x84\xce\xa1\x9b\x3e\xc2\x01\xb1\x6c\xdc\x26\x86\xd9\x3e\xf0\xcc\x36\x3c\x72\x6e\xdb\x56\xc1\x3e\x68\x64\xb3\x01\xd8\x09\xb2\x6f\x43\x88\xb8\xbc\x20\x85\x82\x02\x86\xc0\x72\x2a\xed\xff\x69\x94\xa1\x8f\xf6\xa6\x8f\x6c\xdc\x21\xdc\x43\x91\x53\xd1\x77\xcb\xfa\xde\x36\x76\x2a\x22\xb7\x81\xca\xed\xff\x91\x8c\xe5\xba\x67\xb5\x6d\x76\x38\x73\x57\x9c\xcc\xfe\xcf\xff\xd1\x3a\xdf\x69\xae\xb8\xbd\xfd\x5d\x2b\xe4\x3b\x4c\x58\x5a\x70\xd7\x09\x75\x26\x2b\x58\xd6\xce\x0e\x2e\x6c\x6d\xe1\x62\xa9\x64\x63\xc3\xc6\x96\x55\x2c\xec\xe3\x9d\x3d\xbc\xbd\x2d\xbf\x4b\x25\x5c\xd8\x33\xd8\x07\x7c\x83\x87\xcc\x5d\xbc\xb7\x27\xbf\x77\x0b\x78\xb7\x80\x0b\x51\x82\x81\x0b\xbb\x45\x5c\xd8\xdf\x92\x0d\x6c\x6f\x83\x07\xd8\x9d\xdd\xa8\x85\x3d\x68\x62\x6b\x47\x24\xec\x17\x71\xc1\xd8\xc5\x85\xfd\x62\xd4\xa7\x81\xf7\xf7\x70\xa1\xb4\x13\xb7\x59\x2c\xb0\x42\xb2\x89\x7d\x70\x02\xb9\x5f\x60\xdf\x36\xae\x89\xb1\xec\xe2\x9d\x7d\xd6\xb4\x8d\x77\x58\xa9\xbd\x2d\x5c\xd8\xd9\xc3\xc5\xed\x82\x8d\xf7\xa0\x23\x06\xbb\x81\xf7\x4a\x36\x2e\x88\x8e\x0a\xb8\x68\x14\xf1\xf6\x9e\x8d\x8b\x90\xb0\x55\xc0\x85\xc2\x16\x2e\xee\xda\x78\x1b\x7a\xda\xda\xc6\xc5\x5d\xbc\x5b\xb0\x71\x89\x7d\xef\xec\xe2\x42\x61\x07\x17\x8b\x11\xbe\x18\x02\xb7\xf1\xfe\xbe\x8d\x0b\x50\x61\x6f\x1b\x33\xf0\x76\x0d\x1b\xef\x43\x81\x22\x1b\xc9\x2e\xde\xb5\xd9\xff\x19\x82\x0b\x78\xbb\x84\x4b\xdb\x36\xde\xb2\x6d\xb3\x09\xcb\xe4\xeb\xa7\x9b\xd7\x3d\xeb\xc2\x5e\x88\x62\x0f\xde\xaa\x63\x66\x6d\x26\x62\xb1\x5f\xf7\x2c\x6a\xe7\x6a\xbe\xfa\xd6\xb6\x75\xbb\xe4\x46\x46\xbc\x59\x6a\xbb\xb6\x56\xd8\x41\x26\xb8\x5e\x12\xce\x98\x9e\xfc\x9c\xf2\xde\x66\x21\xc3\x37\x5d\xf7\x2c\x27\xd2\x64\xbe\xfb\x39\xcd\xd5\x3c\x46\xcd\x39\xf6\xb7\x20\xfe\x16\x6d\x84\xac\xb6\x0f\x92\x4a\x7c\x15\xa8\xaa\x4a\x2d\x9b\xdf\x70\x1c\x53\x8a\xcc\x3b\xfe\x46\x18\xdf\x9f\x50\xf5\xe0\x47\xf5\x6b\xf0\x98\x63\x98\xde\x81\x0b\x0e\xc1\x64\xc1\xb4\x08\xce\x6f\xd8\x3c\xee\x39\x7e\xe3\x08\x99\x0e\x39\x69\x69\x8e\x75\x6e\x6b\x6d\xec\xa2\x5c\x0d\xf1\xac\x5a\xce\x11\xbf\x9e\x8e\x18\xef\x00\x10\x66\x94\x2a\xea\xe2\xae\x6f\x6b\x35\x45\x77\x79\x17\x3f\x74\x81\x8a\x6d\xc5\xe4\x95\x49\xa1\x3f\x35\xe9\xe2\xde\x33\x73\x39\x1f\x39\x7a\x77\xa0\xf9\x88\x10\x52\xcb\x66\x5d\xa8\xea\x8b\x3e\x8f\x13\x6f\x35\xee\x53\x0d\xff\x82\xe8\x46\x1c\x4a\x06\xbc\x7e\x47\xe1\x36\xd7\xd1\x9f\x7c\xcd\x65\x87\x2b\xc8\x3c\x0a\x13\xa1\xd7\x5e\x97\x19\x33\xe7\x05\x67\xd1\x49\xfe\xf5\x16\x07\xb7\xec\x20\xff\x7a\xcb\x75\x76\x27\xb3\x15\x07\xa0\x68\x2b\x72\xd4\x27\x84\x23\x7f\x10\xd2\x4e\xc6\x1f\x0c\x7a\x83\x72\xa6\xdb\x1a\x0e\x5b\x61\x90\xe9\x4d\xfc\x41\x87\xce\x0e\x07\x3e\x5d\x67\x67\x77\xb8\x7d\x51\xd5\x4c\xee\xad\x54\xcd\x38\xe2\xe8\xf4\xa8\x77\xbb\x4b\x27\xa7\xe1\x48\xef\xba\x42\xcf\x49\x91\x70\x55\x7d\x14\x6a\x96\x3b\x9f\x7f\x2e\x44\x8c\xdd\x57\x0d\x6e\x46\x6c\xe9\xe8\xa8\xd5\x93\x35\xb0\xcb\x50\xff\x9a\xf8\xf6\xa4\x6d\xac\x87\x7d\x96\x7b\x1e\x6a\x2e\xae\x9d\x0a\xa4\xb4\x3c\x70\x40\x16\x69\x07\xce\x7a\xfa\xcb\x9b\x14\xbe\x66\x03\x2e\x7c\x71\x19\x8f\x22\x11\x7d\xa5\xe5\xd1\x25\xc0\x15\xd9\xf4\xac\x27\xb4\xaf\x3d\xeb\xe8\xd0\x56\xce\x8d\x6c\x02\xfc\xf7\xcc\xdd\x55\x04\x1e\x15\x11\x93\xbf\x3d\xea\xb3\xc1\x8a\x29\xe0\x9b\x8b\x04\xec\xd5\x61\x92\x5b\xf4\xd9\x39\xd4\x18\x86\xb8\x02\xe5\x0d\x2a\x3d\x69\xbe\x7e\xdb\x60\xe3\x74\x91\xfe\xd4\xd4\x90\xa9\x6e\xaa\xfc\x06\xdb\x57\x9f\x4a\x4f\xae\x2a\x67\x27\x54\xf3\x51\xf9\x27\xfc\x89\x37\x5e\xff\x9d\xc9\xb7\xfc\x80\x8e\x1b\x12\x0f\x1e\x12\xce\xc5\x37\xea\xb2\x28\x88\x6d\x2e\xb8\x4c\xd1\x6f\x4e\xc5\x39\xe6\xe6\x14\x04\x6e\x9a\xcd\x3e\x51\xcd\xc7\x7c\xa1\x03\xf2\x92\x7b\xfe\xeb\xad\xee\xeb\xc3\x66\x1c\xa4\x48\xc2\x7b\xd6\x4b\x51\x6d\x4c\xe0\xed\x5b\x79\x75\x70\xad\x1e\x5a\x9c\x2b\x1e\x37\x4b\x84\x16\x19\x9e\x88\xcf\x45\x1b\xb8\xe3\xf5\x47\xea\x90\x2d\x2a\xe9\x0e\x3b\x22\x8b\x6b\x24\xe7\x4a\x1f\xfa\x23\xa9\x95\x72\xae\x74\x0f\x9c\xa3\x44\x97\x65\x6b\xa2\x69\x56\xc9\x91\xf1\x3f\x86\x27\x50\x49\x1c\x22\x86\x27\xbc\xd2\xc2\xe4\xfd\x36\x8e\x52\xfd\x2a\xe2\xdd\x75\x4f\xaa\xe3\xaf\x39\x69\x34\x6f\xb5\x44\xcf\x52\x70\x6e\xdd\xca\x62\x11\x64\x01\x83\x93\x5f\xfd\x17\x7f\xa8\x3d\xcf\xe7\x72\xd5\x4a\xdd\xa4\x68\xe4\xa7\xd0\x30\xcb\xc2\xac\x05\xe5\xfd\x5f\x57\xbb\xea\x6a\x2e\x86\x2d\x59\xfc\x67\xe3\x42\xde\xdb\x4c\x0c\x2b\xf1\x2c\xf7\x36\xa1\xf0\xb8\xef\x4a\xbd\xc1\x74\x40\x1c\x55\x66\x7f\xec\x10\x57\xa9\xd7\x8d\x26\xf0\x79\x98\x98\xb3\xc9\xbd\x32\x9f\x6f\x0e\x25\x6b\xc6\xa2\x0b\x58\xbc\xf2\xe8\xf2\x1e\x68\xd9\x0b\x76\x54\xe9\x2e\x89\x86\x49\x21\x7a\x72\x2f\x7a\x63\xcd\xf3\xde\x94\xd3\xc1\x95\x07\x47\xae\x17\xb8\xfb\xe3\x48\x16\xd6\x2b\x58\x90\xc1\xe4\x5e\x38\xf5\x17\x35\x9e\x2e\xf9\x2b\x40\x35\xb4\xcc\xf3\x50\xbf\x6e\x33\x52\x79\x51\x9f\xd9\x39\x72\x05\x3b\xfa\x74\x00\xfa\x1e\x93\x07\x72\x88\xc4\x33\xd6\x39\x16\x2d\x40\x3c\x9e\x51\xac\x89\x7c\x73\x68\x36\x7b\xfb\xaa\x8a\x6e\xc9\x3b\x85\xe7\xa1\x9c\x43\xaa\x3f\x37\x34\x57\xbf\x97\x01\xb0\x9e\x87\xd0\x4d\xd4\xe0\x02\x99\xdf\x38\x22\xaf\x57\xf0\x2e\x61\x3d\x25\x61\x04\xcd\x29\x6b\xd8\x13\xe7\x57\x3f\x9b\xf5\xf5\x87\x62\x36\x0b\xdd\xb0\x9f\xc8\x74\xf5\xc7\x0e\x3c\x57\x24\x1b\xc7\x15\xad\xd9\xd5\x7c\xfd\xbe\x8b\xd7\x0a\x08\xb3\x7c\xc2\x60\xc1\xbe\xfe\x3a\xa0\x84\x95\xc4\x54\xef\xf5\xa0\x26\xf6\xf5\xe9\x80\xe7\x20\x54\xf6\xd7\xc0\xdf\x93\xd0\xfa\xf8\xf3\xb9\xaf\x3f\x76\x40\x71\xf2\xd8\xa9\x68\x91\x12\x44\xf4\x7b\xdf\x45\xbc\x21\x68\x9d\xc1\x8b\x59\x41\x88\x4f\x52\xf5\x35\xd1\x67\x22\x0b\x3b\xb0\x36\x3d\xec\x26\x28\xf7\x97\xb4\x5c\xfb\xcd\x15\xe4\xb1\x47\x15\xc7\xba\xb0\x2b\x52\x0b\x55\x31\xca\xb4\xfc\xbb\xb5\xf4\x72\x32\x7a\x7c\xed\x24\x5f\x5e\x3f\xa4\x9a\xe5\x86\x4c\xaa\x3b\x57\x2a\xd6\xe2\x7d\xb2\xd1\xf4\xa5\xc0\x42\x05\xc9\x95\x20\x95\x39\xd8\x2e\xda\x74\x13\x6f\xb9\x7f\x73\x31\x2a\xf1\x36\x18\x7d\x26\xae\x56\xc2\x58\xbd\xf7\xab\x45\xde\x5e\xb5\xcf\x45\x24\x17\x04\xa5\x28\x41\x79\xae\x7d\x9b\xa4\x0e\xaa\xff\x6a\x81\x9e\xb9\x37\xd0\xe0\x37\x5c\x4c\x3b\x20\xe2\x38\x88\xea\x41\x89\xa5\xf4\x59\x2d\x36\xe4\xca\xe7\xa2\xcc\x13\xf3\x05\x1b\x8b\x0a\xaa\x85\x82\x2a\xf9\x35\x5b\x8a\xb0\xe0\xac\x91\xd7\x66\x36\xeb\xac\x91\x41\x30\x9f\x3b\x04\xbe\x06\x2d\x0d\xf4\x5c\x68\x3e\xef\xb2\xc2\x71\x43\xfd\x5b\xe5\x1e\x87\xb5\xca\x04\xa4\x47\x40\xff\x7c\xde\x6c\x69\x2e\x22\x64\x10\xc4\xac\xb0\xd5\xd0\x9a\x2d\xcd\x41\xac\x5d\x39\x36\xb0\xb5\x30\xef\x5f\x93\xbe\x19\x5c\xf4\xe9\x59\xae\x4d\xe0\xe6\xde\x91\xf1\x44\x1c\xcb\xb5\x2b\xfd\x5b\xa9\x08\x01\xbd\x6e\x19\xfc\x1d\xf0\xdb\x21\xf0\x4e\xe6\x20\xfc\x55\x6b\xa9\xaa\xaa\xa3\x04\x6f\x11\xc2\x12\x75\x7b\xdd\x3e\x75\x47\x2b\x64\xfe\x9a\xb8\xbf\x0c\x4a\xea\xdc\xbe\xa9\x6a\xbc\x96\x2b\x99\x70\xb7\x45\x9c\xc5\xb3\xf6\xc6\x55\x3a\x6c\xa4\x4f\xec\x24\x64\x9b\x8f\xe4\x4d\x88\x7d\xcf\xfc\x80\x6d\x3e\xea\x6f\xd1\x2f\x67\xba\xac\xc4\x63\x8d\x2e\xcc\xea\xf4\xeb\xb8\x65\x2d\x77\x81\xcc\xc3\xfe\xd7\x05\xba\x2d\xd0\xc4\x07\xfe\xa8\x4e\x07\x7e\xb8\x6a\x74\x9c\x73\xc1\x85\x66\xf7\x6c\x39\x9f\xef\xbd\x61\xc0\x83\xed\x3d\x7d\x19\xac\xf8\xcd\x9b\xcf\x9f\x4e\x28\x44\xe4\x6b\xac\x3a\x11\x71\x26\xde\xd0\x90\x45\x6d\xbe\x59\xb2\xb2\xe1\x2a\x7b\x89\xb8\x28\x3b\x66\x39\xce\xaa\x08\x65\x51\x99\xaf\xbc\x35\xc4\x0e\x6f\xb8\xa1\x1c\xc5\xae\x55\xfb\x00\xab\x48\x9c\x2f\xf0\x97\xe7\xf1\x91\xec\x39\x75\x26\x82\x05\x47\xa8\x75\x37\x05\x7d\x94\x89\xb8\x09\x1c\xc2\x71\x62\x74\x07\x5d\x4f\x07\x33\xf3\x7a\x99\xb8\xd8\x7b\xb3\xd5\xf1\x35\x9a\xcd\x52\x2e\xa8\xc6\xfe\x68\xa8\xbc\xf2\x1a\xa4\x6f\xb0\x95\x83\x21\xdc\x35\xae\x15\xd6\xd8\x81\xf0\xca\xd6\x1c\xb8\x7c\xcc\x66\x5f\x34\x0f\x46\x9f\x0c\x65\xa6\x51\xec\xe7\x0a\x68\x81\x16\xae\x70\x5c\x05\xb3\xd6\x68\x85\xde\xca\x3b\x72\x69\x4c\x30\xb8\xd4\x54\x1d\xae\xec\x09\x65\xb3\x10\x1d\xcd\x4b\xb8\x5d\x30\x1f\xf5\xc9\xaf\x15\x52\x73\xac\x96\x81\xfa\x1e\xdf\x03\x71\x83\x58\x36\x0e\xe2\xf9\x12\x2a\x99\x80\xb1\xb5\x48\xd9\xd2\x21\x81\xd5\xb6\xf5\xc9\xaf\xa8\x39\xb3\xc1\x7a\xee\xa0\x05\xe5\x4e\xf0\xb8\xb2\xd7\x74\x19\x48\x51\xeb\x58\x3d\x18\x33\x71\x7e\x92\x0c\x26\x48\xd9\x5a\x63\x05\xa5\xf2\x91\x44\xb4\x2a\x87\xfe\xe6\xf1\x89\x55\x4c\x84\x95\x45\x3e\x88\xf8\xdc\x5b\x7c\xcf\xed\x46\x3c\x7c\x04\x6b\x7d\x70\x8b\xdf\xe0\x5c\x37\x10\x0b\xfc\x61\x85\xd4\x24\x02\x0d\x2a\x6d\xbf\x24\xdd\xab\xe8\x27\x54\x33\xd0\x7c\x4e\xad\x57\xb0\x13\x7e\xd4\xaf\x07\x5f\xae\xa3\xab\x82\x08\x84\xa8\x5f\x0f\xf0\x72\x9c\xcb\xaf\x4a\x5b\xe7\x36\x16\x34\x77\x42\xff\x41\xe3\x27\x54\x9c\xbd\xae\x0a\x5f\xda\x58\x58\x83\x43\x65\x35\x88\x3b\xfa\x8a\xe6\x12\xc6\x6a\x5b\x8c\x1f\xbf\xbe\x6a\xd2\x81\xe3\x10\x17\x10\xc2\xd4\xba\x77\xc5\x25\xdd\x88\x89\x08\xe5\xd4\x51\x63\x18\x1f\x35\xfa\x11\x8d\x5e\x4e\xc9\xe7\x62\xf1\xac\x0d\x39\x67\x7d\x24\x43\x81\x6d\x5a\x5d\xa1\x82\xa6\x02\xac\xe8\x0c\xa1\x89\x46\xd8\x7e\xc9\xc6\x94\xe6\x2a\x31\x17\x11\x1d\xaf\x16\x3e\x24\x2f\x71\x54\x5e\xf2\xc5\x22\x8e\xf4\x27\xb2\x45\xa1\x41\x91\xbe\x3d\x5d\xcb\xb3\xd9\xd2\x93\x66\x35\x2b\x96\x69\xca\x9b\xa3\x6c\x28\x15\x56\x0f\xb0\x0c\xe1\xf3\x58\x13\xdc\xb3\xcb\x7f\xb3\x5e\xa3\x11\x27\x2f\xb6\x7d\xab\x91\x58\x92\xca\x0c\x8d\xc4\xe6\x37\xbc\x8d\xcf\x90\x70\x24\xa2\xfa\x4f\x4d\xf1\x7d\x54\xa5\x23\x9a\x19\x51\xa7\xe3\x27\xbc\x78\xd1\x51\xa6\xe3\xd3\xe1\x28\x53\x94\x7e\xba\xd6\x45\x34\xf8\xaa\x66\xa0\x35\x72\xd2\x8c\x9b\x38\x86\x02\x19\x23\xd3\x1d\x0f\x47\x19\xc7\xcf\xf4\x1a\xdc\x1d\xd0\x10\x9e\x32\xc4\x15\x0b\xab\x2b\x16\xbe\xae\x98\x9a\xa1\xa7\x37\xee\xf2\xc6\xd5\x07\xbb\x60\x26\x34\xdc\xc5\x2e\x71\xf5\xd1\x2e\x86\xc0\x85\x8a\x42\x19\x34\x62\x2a\xfb\xa2\x5c\xc5\x65\x00\x34\xd1\x93\xfb\x86\xd5\xb1\xcd\x50\x08\xb6\x21\x27\xc9\x6c\x36\xd4\x9d\xa9\xd6\x46\x65\x8d\x65\x93\x10\x4e\x34\x83\x5b\xad\x83\x29\x6e\x23\x0c\xaa\xe9\x90\x1f\x31\x3b\x24\x64\xed\x16\x50\x64\x7f\xce\x1a\xec\xcf\xe7\xbc\x6a\x5f\xad\x0a\x87\x06\x5e\xbb\x2f\x1e\x21\xf2\x1d\x08\x64\x34\x5f\xf1\x30\xd6\x1b\xf8\x99\x51\x13\x7c\x9a\xf9\x19\x96\xf8\xde\x1a\x35\x63\xcf\x6a\x2d\x2f\xa3\xad\xe7\x42\xce\x86\x72\xeb\x48\x5f\x47\xe6\xb7\xd8\x08\x67\x8d\xf4\xb3\xd9\xb5\x10\xee\xf3\xfa\x08\xf5\xf5\x09\xd5\xc2\xd8\xd1\xab\x97\x9a\x7c\xb7\x17\x8e\x68\x2b\x1c\x66\x68\xc6\x9d\xb9\x1d\xbf\x9c\x59\xcf\x6d\x9c\x50\xad\xf1\xaa\xf5\x31\xdb\x75\xfb\x08\x21\x70\xa0\xb9\xe0\xc6\xdb\x7c\x91\x04\x91\x03\xdc\x90\x04\x96\x07\x0f\xd6\xdd\x6c\xb6\xd5\xd2\x04\x1a\x63\x22\xfb\xeb\x94\xb6\x3a\xbe\x97\x19\xf5\x32\x8c\xfc\xe3\x11\xb5\xbc\xcc\xfa\x5f\xd1\x40\xfe\x5a\xd7\xff\x42\xa6\xc0\x09\x57\x15\xd1\xaa\x16\x42\x5c\xfa\x10\x8b\x25\x20\x0c\xc0\xe5\x5e\xe0\x0b\xb3\x06\x5a\xd5\x7c\x84\x18\xf7\x19\xdd\xe2\xe1\xad\x72\x6b\xb1\xb1\xe4\x95\x62\xb5\xf3\x11\xce\xd3\x11\x7f\xaa\xb0\x18\x81\xc4\xf9\xf4\xb6\x82\x71\xb1\x19\x0d\x6f\xb5\x22\x32\x7b\xb7\xe0\xd3\xf1\x73\xb0\x5b\x5e\x33\xf0\x10\xfe\x1d\xb1\x7f\x17\xd1\x45\x52\x36\x0b\x85\x0a\x58\x55\x9c\x8e\x3e\x92\xea\xde\x71\xb4\x87\xa9\xab\x95\x12\xaa\x5f\xf7\xd3\x4e\x28\x23\xac\x8b\x8d\xfc\x54\xba\xc5\xb3\x3c\x1b\xda\x30\x13\x88\x32\x63\x44\x99\x31\xa2\x18\x9e\xc6\x29\x3c\xb1\x96\x52\xfa\x35\xb1\x8f\x83\x63\x4b\x87\x8b\x72\x12\x1a\xce\x88\x1c\xc9\x88\xc4\x23\x10\xd1\x86\xd5\xb0\xb9\x84\x40\x59\x77\x01\x32\x7d\x46\x82\x41\x14\x2b\xc0\x57\xc6\x3e\x89\x76\x92\x56\x3b\xda\x49\x7e\x39\xd1\xcf\xd7\x2e\xb1\xec\xc5\x04\xa6\xe3\xf4\x8d\x0b\xe3\xfc\xeb\x77\xa0\x7e\x3d\xcf\xc8\x9a\xc1\xf5\x17\xa7\x94\x58\x45\x11\x84\xce\x60\x62\x3d\x94\x58\x0a\xc3\xdb\xe6\x96\xbd\x7a\x0b\x98\x82\xfc\xfa\xe5\xa8\x5f\xaf\x5d\xf6\x95\x88\x7f\xfd\x96\xf8\xfc\x1d\x24\x3e\x9f\x67\xaa\x45\x26\xec\x3a\xdd\xde\xc4\xff\xd5\x4b\xed\x1a\x06\x21\xf2\xcc\xd2\x6a\xa3\x8a\xd2\x9d\xf8\x6b\x5d\xd8\xf9\x22\x2a\xcb\x22\x6c\x32\x0d\x41\xea\xbf\x40\xd0\x2d\xc8\x6b\xe6\xd7\x2e\x88\x47\x58\xde\xd5\xfe\x16\x92\xdc\xe9\x1b\xb1\x28\x8e\x2f\x20\x00\x20\x26\x81\x75\x5a\x61\x12\x20\x49\xd8\x0a\x44\xe6\x2a\x1d\x77\x9d\x8e\x9a\x19\x97\x86\x60\xba\x3f\xa2\x83\x11\x5f\xc4\xbc\xbd\x75\x64\x16\x94\x6d\x9c\x83\x5c\x48\x80\x6c\x20\x4e\x3f\x0e\x31\x4c\xe7\x20\x12\x38\x18\x0d\x39\x39\x52\x8c\xde\x6e\x45\x19\x0e\xdb\x51\x95\xcf\x5c\xc1\x56\xc7\x0c\x3b\x9e\x6c\x5f\xfe\xbd\xb0\xf3\x05\x3b\x47\x9c\xcd\x62\x84\x0e\xcb\xc5\xde\x32\x1a\x06\x0d\xfa\xbf\x87\x03\x77\x3c\x98\xf8\xeb\xc8\x2c\x2e\xa1\xa0\xf8\x5f\xa0\x60\x67\x05\x0a\x72\xa5\x34\x12\xb6\x13\x48\x48\x60\x2b\x89\xab\xc4\x67\x31\xf9\xb9\xc5\x57\xe8\xd7\xe8\xdb\xf9\x13\xfa\x6e\xdf\x57\x1d\xf8\x56\xe2\x8e\xfe\x67\xdc\x75\x7a\x43\x86\xbb\x12\xb0\x4b\x15\x77\xa5\x14\xc5\xe3\x14\x81\xa3\xd4\x62\xfb\xf6\xa8\xd3\x81\xbb\x24\x48\x71\xd7\x2c\xe8\x93\xe6\xc8\xc9\xab\xe6\x33\x1e\xe9\xe4\xc8\x29\xfb\xe9\x21\x33\xa8\x88\x56\xb3\x59\x2a\x14\xa3\xbf\x03\xcb\xb0\xb3\x59\x27\xfe\x2c\x08\x7f\xcc\xd6\xc7\x87\x72\x71\x61\xf5\x67\x62\xe5\xa9\xc2\x39\x1d\xb8\xbf\x7a\x9a\x34\x7e\x61\xc2\x1d\xa4\xfc\xf9\x16\x03\xba\xcc\x9f\xbc\x82\x71\x5e\x8e\xfd\xcd\xc1\xc5\x4a\x43\x01\x21\x7f\xfa\x0a\xf7\x09\xb9\x53\x9e\x2d\x57\x3c\x47\xd6\x16\x32\x13\xc8\x4a\x71\x87\xc8\x1a\x47\x28\x42\x67\x44\xc6\xa6\x65\x53\xec\xe3\xc6\xf2\x0a\x69\x4c\xd2\x2a\xd1\x3f\x01\xbd\x12\x54\x1c\x90\xea\xab\xe6\x21\xd3\x13\xf7\xfe\xdc\xe3\x74\x80\x36\x9b\x7a\xfd\xfc\x7b\x11\x99\xc1\x26\xf1\x4c\x97\x95\x72\xe3\xdd\x45\xb5\x09\x10\xe2\x5b\x53\x77\x7b\x43\xcd\x45\x38\x24\x4d\x7d\xd8\x0a\xd9\xcf\x3e\x29\x6d\x6e\x7d\xe7\x9f\xc1\x66\x11\x6d\x6a\x85\x1c\x2f\xc7\xbe\x10\x1e\x12\x3f\xa7\x75\xf2\xfd\xef\x21\xfa\x4e\xf1\x98\x34\x72\x5a\x98\xeb\x7f\xef\xa0\xef\x8e\xe9\xe6\x48\x60\xc6\xcd\x9a\x71\xb3\xe2\xc0\xdd\xa0\xda\x10\x8f\x31\x6b\x21\x27\x5a\x60\xf5\xf3\xbc\x3e\xf6\x73\x1d\x48\x09\xbf\x3b\xd1\xbe\xc6\x31\x17\x6d\x6d\xef\xb7\xe9\x23\x02\x65\x1c\x3e\x7e\xb8\x4c\xd9\xd4\xb1\x13\xc2\x41\x23\x0e\xd9\x1b\xf0\x64\x9f\x09\xb2\xce\x29\xb5\x02\xfb\x3b\x65\x93\xea\xdb\xa6\xa3\x05\xd8\x05\xaf\x99\x1e\xf6\x72\x6d\x84\x4c\x2f\x47\xda\x8b\xc5\xb7\xaf\x43\xc4\x03\x99\x8e\x5d\xdb\x64\x8d\x12\x49\x2e\x47\x60\x76\xcc\x9a\x25\x92\x66\x64\xd2\x6b\x97\x48\xc2\x91\x49\xa7\x6f\x72\xc1\x89\x8b\x9d\xd3\xb7\x28\x4f\x2e\x46\xb6\x7c\xe4\xf4\xcb\xbc\xe7\x19\x49\x6d\x8a\x74\xc1\x15\x6e\xd3\x5b\xf2\xb9\x30\xa7\xb7\x96\x61\xf3\xcd\x99\xad\x24\xf6\x5d\x90\xdf\x1f\x1f\xf0\x5d\x92\xdf\x0e\xff\x2e\x8a\x6f\x36\x3d\xec\x7b\x4b\x7e\x37\x26\x54\x31\x03\x3f\x95\xde\xea\x18\x10\x71\x30\x23\x7e\xf3\x12\x4b\x71\x93\x5b\x13\xe6\x48\x21\x72\x0f\x7d\x4e\x6f\x2d\x6a\xc3\xf9\xd7\xc1\x5e\x22\xc0\xfb\xb7\xcb\xa9\x36\x59\x75\xa9\xb2\x26\xc6\x19\xf3\xba\x9b\x5e\x98\x1f\xb6\xba\xfd\x8e\x9f\xe9\xd3\x51\x73\x1d\xfd\xff\xec\xfd\x79\x53\xe3\x3a\xd3\x00\x8e\xfe\x3f\x9f\x02\xa8\x79\x53\x16\x51\x4c\xc2\x9c\x39\xcf\xf3\xd8\x68\x52\xac\x61\x1d\x20\x81\x61\xc0\x8f\xef\x29\xd9\x96\x9d\x60\x67\x21\x0b\x24\x90\x7c\xf7\x5b\xdd\x92\xbc\x84\x30\x73\xce\xfb\xfe\xaa\x6e\xd5\xad\x5f\xcd\x54\xb0\x65\xa9\xd5\xda\xbb\x5b\xbd\xd8\xdc\x39\xdc\x75\x33\xaa\x82\xbe\x7b\x72\x4e\xdd\xad\x6d\xad\xc1\xfa\x54\x2a\xe5\x0a\x1c\x3d\xe9\x6c\xf8\x54\x4b\x8f\xfa\x74\x40\xd6\xb3\x61\xc8\x95\xbb\x8d\x74\x39\x7c\xaa\x2d\x6f\x98\xb7\x7c\xb9\x3d\x99\x0f\x6a\x96\xce\x96\xd3\x82\x16\xd0\xac\xa0\x63\x3f\xbc\x48\x85\x2e\x82\xd8\x83\xcc\x47\x73\x8b\xeb\x90\x6a\x12\xd7\x41\x9f\xf9\x52\xa8\xa8\xa4\x3a\xc7\x2c\x50\x42\xc6\x7b\x63\x76\x4d\x87\x17\xc4\xbe\x63\x33\x25\x31\xf0\x22\x2d\x76\x7d\x99\xb0\xaa\x7d\x67\x26\x53\x20\x38\x35\x0e\xaf\xd7\x05\xb9\xcc\xa0\x5f\x57\x57\xd9\xf0\x4c\xb9\xf9\x74\x4c\x2c\x6e\x9e\xc5\x28\xa4\xf9\x58\x4b\x04\x33\xd8\x77\xe6\x59\xfc\x51\x8e\x03\xaf\x1e\xe8\xe8\xd4\x06\x21\xd6\x93\x3c\xe2\x9c\xa1\x2b\x43\x65\xe0\xcb\xae\x4b\xea\xb9\x90\x16\xce\x50\xaa\x6c\x42\xfa\xb2\xdc\x64\xf7\x3a\x27\x00\xc1\xfa\xd3\xd9\x55\xf7\x9c\xa1\xbb\x85\x2d\x43\x7b\xff\xc5\x3b\xd5\xe5\x38\x31\x38\xa2\x81\x36\x35\xef\x55\xb3\xa5\xb2\x65\x1e\xfd\x41\xac\xbe\x65\xa7\xd1\xa7\x3b\xb3\x15\x7c\x70\x44\xd2\x98\x26\xb4\x47\x07\x12\xc3\x11\x8b\x9d\xe6\xcc\xdd\xda\xb6\x7d\x16\x31\x76\x75\x50\xf7\xcb\xa2\x32\xb2\x22\xc6\x3a\x87\xf0\xbc\xb5\x6d\xf9\xe5\x51\xe1\xec\x3b\xe9\x28\x88\x5e\x39\xa0\x3e\x0d\x53\x88\x80\xf2\xde\xaa\x81\x90\xeb\x30\xd7\x45\x7b\x4b\xca\xa3\x9d\xd0\xf8\x93\xb1\x3c\xa9\x24\xf5\xf9\x47\x62\x7c\x33\xe4\xbd\x51\xd8\x1f\x76\x8b\x07\x1c\xc6\x70\xe9\x84\x46\x75\x7d\xb9\x58\xaa\xac\x31\x9a\x84\x61\xc7\xef\x88\xde\x58\xfb\x76\x1e\xf0\x21\xef\x8a\xb1\x18\x8e\x36\xb4\xa3\x01\xb5\x5f\xb6\x63\xa6\x4e\xca\xc9\xa3\x32\xc2\x52\x5f\x02\xf5\x57\xc4\xac\xba\x58\xdc\xb1\x3d\x9c\xbd\xcb\x9b\x71\xae\xa1\x7b\xea\xba\x3a\x8c\xa9\x02\x48\x15\x40\xaa\xaa\xa2\x0a\x30\x55\x80\xa5\xe4\x2a\xdf\xd6\x0f\x86\x1d\x1d\x27\x15\x63\xb8\x3c\x75\x0c\x5f\xfe\x09\xe4\x1f\x21\xff\x84\x84\xbc\xf7\xf6\x3e\xd6\xf0\x57\xf7\x04\x4f\x7b\x40\x29\x40\x47\xb1\xb6\x9a\x69\xc7\xda\x38\x26\x88\xb5\x71\x8c\x88\xb3\x88\xe9\x29\x3d\xf1\xbd\xf9\xfe\x06\x05\x40\x9b\x61\x9c\x42\xe7\xe6\xe4\x31\xad\x80\x9b\x51\x9c\xd6\xc1\xcd\x76\x9c\x56\xc3\xcd\x20\x4e\x6b\xe2\xa6\x88\x8b\x95\x7d\x7f\x1f\x65\x43\xd5\xb6\x99\xb5\x24\x7d\x8c\xe2\x4d\xdd\xaa\x36\x3e\x16\x37\x49\xe1\xad\x06\x16\xc4\x65\xc6\x37\x15\xdc\xb2\xb7\xa9\x60\x69\xb4\xd2\x8f\x93\x47\xfd\xb1\x1d\xbf\x27\x58\x87\xfd\x31\x1f\x2f\xaf\x65\x7d\x01\x27\xe7\x0c\x7a\x24\x01\x32\x85\x13\x9b\x2b\x32\x85\x03\x4f\x1e\x14\x17\x81\xa0\x9c\x56\x38\x15\xd4\xab\x78\x9b\xa2\xec\x6f\x72\xea\x57\xbc\x4d\x5e\xf1\x37\x45\xaa\x10\x13\xc6\x76\xc0\x0a\xa8\x86\x31\xf3\xa0\x67\xfc\xb2\x07\xbd\x12\xa4\xdd\xef\x41\xcf\x40\x6a\x3b\xde\x4c\x47\xb8\xcc\x3c\x33\x90\xc9\x02\x92\x15\xd8\xc9\xa3\x06\xdb\xce\x06\x73\x05\xd8\xf6\x4a\xb0\xe2\x1d\xd8\xc2\x70\xee\xae\x5e\x51\x97\x2f\xbc\xec\xfc\xc3\xf5\xe4\xa2\xd6\x1a\x29\x5f\x0a\xe8\xfe\xb3\xe9\xd2\xd0\xea\x63\x4d\x8a\x38\x3c\xc9\xab\x95\xd9\xf6\xa6\xb0\xc3\x1d\xcf\x26\x6f\x82\x71\x27\x2c\x97\x5d\xa5\x33\xa4\x5e\x7c\x27\x28\x97\x5d\x26\xd2\xd9\x10\xe9\xd9\x50\x56\xf5\x2f\x65\x99\x3c\xea\x2c\x6d\x95\x45\xc4\x0b\x69\xfa\xfa\xe1\x25\x01\x63\xbc\xbe\x5e\xb5\x78\x5d\x8f\x1a\xae\x1c\x45\x01\x44\xf8\x1a\xe9\xd7\x00\x5f\x03\xfd\x3a\x79\x64\xb8\xb2\xd4\x6b\x1b\xbf\xb6\xf5\x57\x81\xaf\x22\xb6\xd6\x6b\xf9\x83\x7e\x5f\x91\xaf\x37\xe3\x4c\x26\x25\x8f\x6e\xbd\x70\x5e\x03\xb5\x6e\x9c\x83\xb1\xcb\xd6\x6b\x8b\x7b\x63\xff\x9a\xde\xa0\xec\x7f\x5f\x9d\xe4\xaf\xd9\x55\xaa\x7e\xb8\x9b\xe9\xa7\x0f\x6f\x61\x9e\x50\x9d\x2c\xfa\xf0\xfb\x2b\xde\x86\xf2\x20\x38\x7c\x16\xbd\xf1\x79\x67\x34\x16\x3d\xb1\x4a\x51\xec\x5c\xa9\x4d\x3d\x15\x14\xec\x86\xa2\xdb\x7f\x16\xbf\x2b\x7b\xb5\xb2\xec\x5e\x1e\xa7\xfd\x6b\x53\x98\x7b\x59\xff\x34\x75\x91\xbc\x78\xef\xe0\x3a\x83\xb9\x9f\x37\xc6\xd4\xb4\x51\x3b\x48\xd9\x8e\x4b\x21\x0d\x0e\x0e\xae\xe9\x3e\xde\x58\x1d\x60\x3f\xbe\xc2\xbc\x90\x4a\x27\x80\xbd\xee\xbf\x4b\x51\xd8\x51\x5f\x79\x51\xb1\xf1\x35\x30\xef\xbe\x64\x77\x66\x77\xa6\xff\x91\xbd\x97\xd3\xf1\x5d\xc8\xd0\x0e\xde\x6f\xd1\x43\x91\x8d\xb7\xb9\x5f\x80\x77\xe6\x7f\x38\x42\xc3\xbc\x90\xef\x30\xd7\x03\x07\x85\x1e\x90\xdd\x7a\x6f\x1c\x5e\xd3\x83\xbc\x34\xf2\x48\x4d\xbe\xa5\xfe\x5a\xdc\x1b\x47\xb2\x67\xd2\x9c\x8d\x0f\x73\x36\x96\x72\x1e\xff\x16\x8b\xe3\x25\x2c\x4e\x7e\x5b\xe2\x64\xa9\xc4\xe9\x6f\x4b\x9c\x2e\x95\x38\x43\x92\x30\x87\x3d\x5a\xcb\xf2\xd4\x1a\x83\x39\xee\xe2\xde\x38\xbb\xa6\x47\xd7\xc0\xbb\x18\x67\xcb\x04\xbb\xca\x27\x95\x91\xb5\x24\xf1\x29\xa0\x5a\x5e\xf8\x1a\x98\x9d\xb6\x74\x17\x71\x26\x45\xa5\x22\x3f\x68\x0b\x95\xca\x07\x03\xd1\x0b\xf6\xdb\x9d\x64\xc5\x1c\xd0\x77\xb0\xa8\x57\xf6\x0e\x83\x2c\xac\x52\x95\x7a\x2c\xc3\xc7\xe6\x3b\x9e\xcd\xb5\x01\xe6\x6b\x60\x1e\x08\x8d\x9d\xc3\xdd\xa2\x3d\xfd\xf5\x32\x29\xfa\xae\xff\x20\x4d\x9d\x42\x21\xd7\xc4\x87\x08\xb9\xa6\x3e\xce\xbf\x68\xea\xe3\xe2\x0b\x0b\x95\x9b\xa6\x58\x33\x7a\x17\xd7\xf9\x2d\xec\xfb\x17\x4c\xff\x7e\x8d\x52\x2a\x6d\xe7\xf4\x39\xc6\x4a\x16\xf7\xc6\xf9\x35\x3d\xbc\xce\x6b\x1f\x5c\x48\x53\x6a\xf3\x73\xac\x6c\x76\xf1\x11\xe5\x3f\x80\x4e\xf9\xf0\xd1\xa8\x52\x6e\x9e\x7f\x21\x94\x03\x52\xe5\x23\x99\x70\xf1\x85\xc8\xbc\x4a\x2c\x04\x59\x30\x99\x56\xe9\x97\x3f\xab\x0a\x8e\x87\x17\x02\xe7\xd2\xf6\x43\x8c\xf7\x45\x6f\xbc\xb4\x23\x69\x9a\x23\xe4\x7a\x31\x42\xcb\xbd\x77\xcd\x72\x22\x6d\x5c\xf9\x39\x26\x0b\x7b\xef\xc5\x38\x5f\x61\xb0\xa4\xfb\x8b\xa7\xfd\xf5\x3b\x48\x68\xfb\xb4\x0c\x4a\x01\xfa\xfe\x45\x5a\x28\x15\x06\xf4\xf2\x9f\x0c\xe8\xd5\xb3\x1e\xcf\xeb\x67\x3d\x9c\xd1\xab\x1e\xce\xf0\x95\x85\x8b\x7b\xe3\xf2\x9a\x9e\x5c\x13\xfb\x78\x6a\x5c\x7e\xd4\xa4\xab\x67\xdd\xa4\xeb\xd4\x52\xef\x50\x4b\x2d\xd4\x3a\x58\x10\x1b\xcb\x9b\x87\x4f\x6c\xbd\x66\x7f\xba\x7c\xb7\x26\x32\x78\x51\x6a\xf1\x19\xbe\x7e\x08\x0f\x7a\x66\x19\x23\x55\x1e\xaa\xa8\xda\xdc\xf9\xfe\x8a\x53\x06\xe7\x8b\x42\x94\x2a\x34\x21\xf9\xf5\xf5\x5d\x72\x59\xd5\xba\xf4\xb9\xac\xd0\xfa\x87\xd9\xe0\xf3\x33\xce\xb1\xdc\x08\x7d\x2f\x30\xf2\x4b\x63\x13\xe8\x0b\x23\x9c\x06\x3e\xac\x89\xef\xd7\xf4\xf8\x9a\xd8\xdf\x73\x9d\xf7\x3c\x30\xbe\xaf\x6e\xf9\x67\x20\xcb\xef\x67\x75\x6e\x49\x61\xcc\x87\x63\xf1\x89\x3f\x7d\x04\xa3\xd8\x7b\x2f\xd7\x7a\x36\x16\x42\x26\xa5\x4e\xf6\x3c\xe5\x61\xaf\x6a\xc9\x7e\xf6\x9d\xaa\x4b\x7d\xa7\x56\xf4\x30\x5d\xb3\x8a\xf7\x69\xea\xaa\x9f\x6d\x13\xd9\x81\xbe\x13\x40\xa9\xa0\xbc\x54\x6e\xdb\xca\x6e\x3e\x75\x99\x3f\x09\x37\x3d\xf1\xda\x11\xc3\xfd\xc9\xf0\x59\xdc\xf4\xf3\xa5\xf1\xcf\xb6\xfc\xf3\x45\xfe\xf9\x43\xfe\xf9\x5a\x84\xfc\xc5\xca\xee\xc3\x79\xef\x99\x8f\x50\x60\x34\xd2\x82\x72\x75\x3b\xbb\xc6\x87\x3e\xf0\x63\x58\xe4\x0f\x4b\x0f\xe7\xa2\xe8\x62\xe7\xea\xdd\xa2\x03\xf6\x5b\x5f\x4d\xfb\x89\xf1\x1c\xd2\x37\xe9\xdf\x7c\x34\xe6\x0b\x62\xe7\x46\x7d\x40\x39\x66\x56\xba\x1c\x42\xcf\xf7\xa7\xcf\x7a\x6d\x36\x93\x74\xaf\x1d\x7e\xd6\x8b\xb3\x95\x70\xbd\xd9\x5e\x25\x9c\x45\xf3\x39\x6f\xab\x25\x98\x70\xa6\x78\x81\xc1\x75\xb1\xf2\x21\x56\xae\x58\x87\xa7\xcf\xb6\xe2\xa3\x87\x9f\x35\x13\xd1\x4c\xb8\xad\x84\xcc\xad\x84\xdb\x09\xd3\x15\xd8\x4a\xca\x7c\x9d\x70\x5b\x1d\x35\xdc\x20\xce\xd4\xb5\x23\xb6\xab\x66\xc8\x6b\x40\x6c\xe5\x8b\xe6\x35\xb0\xa5\x28\xa3\x27\x85\x2d\x3d\x36\xaa\x8f\x9c\x5d\x94\xb3\xf4\x88\xb3\xeb\x5a\x55\xdb\x67\x2c\xae\x1b\x1e\xde\x8b\x1d\xa3\x5b\x43\xd6\xef\x29\xe5\xe3\xc1\xb5\x33\x75\xcd\x67\x31\x1c\x77\x7c\x9e\xec\x26\x9d\xa8\xc7\x12\x94\x7f\x34\x8e\xad\x84\x31\xde\xae\x07\x3b\xa2\xfe\xf9\xd4\xba\x3a\xb0\xe0\xe9\xea\xc0\xfa\x7c\x4a\x77\xa7\x86\x47\x3b\x87\x84\xc6\x2c\x74\x9a\x33\x77\x33\xa2\x1e\xfa\xdd\x45\x8f\x9f\xd2\xc3\x1b\xac\xb0\xcd\x1e\x29\xdf\xd2\x07\x6e\x78\xd2\x17\xa8\xe1\x57\xe2\xad\x6d\xb2\x19\x91\xf2\x2d\xa1\x83\x34\x3d\xc6\xf7\x16\xbe\xa3\x00\x3d\xa8\x08\xb2\xf9\xa9\x07\xa9\xe8\x96\xcc\xfc\x73\x53\x56\xd4\x2b\xdf\x4e\x39\x21\x56\xb1\x3d\x8d\xbd\x8f\x9b\xa3\xd1\x45\x9d\xe0\x14\x47\xc3\x08\xca\x82\x6c\x6d\x57\xb6\x25\xe0\xad\x2f\xef\x90\xf5\xdf\xa1\x29\x71\x8b\x2b\xbe\x6e\x01\x62\x3c\x8a\x14\x92\x05\x0c\xed\xd1\x14\x93\x54\x9c\x86\x9f\xc7\xc4\xde\xc7\x14\x15\xd9\x01\x12\x42\x99\x10\xf2\x6e\x27\x99\xa5\xf3\xc5\xf7\x0c\x62\xdf\xa3\xe3\x42\xf3\x47\x60\x90\xf9\xdc\x37\x4f\xff\x63\x10\x62\x07\xea\x32\x1c\x2f\x9e\x0d\xe2\x3c\xb9\xc6\x80\xd8\x83\xd4\xdf\xc0\xe0\x1a\xf6\xb1\xab\x6b\x7a\x7a\x4d\xec\x2b\xdc\xc7\xae\x86\xef\x89\x9d\x33\x20\x78\x53\x58\x0b\x95\xf3\x63\x5a\x3b\xa7\x02\x8f\x6e\x35\x4a\x25\xc0\xce\x99\xba\x94\x2b\x04\xb9\x44\x50\x83\xca\x53\xd9\x40\x80\xf1\x27\xe3\x6a\x99\xa6\x2a\xac\xeb\x40\x0a\xb4\x7f\x72\x83\x9b\x83\x6b\xca\x61\x51\x32\x6e\x0e\x3f\xd7\xd1\xbd\xcc\x99\x40\xd7\x8a\x97\x64\x15\xeb\x78\x88\x7a\xc1\x04\xf9\xde\xc7\x90\x58\x87\xb2\x44\x3e\xa8\xd2\xf5\xf5\xf2\x55\xd9\x4a\x36\xe5\xf7\xa7\xb4\xb2\x72\x18\x71\x16\x2d\xee\x8d\xeb\x6b\xda\x40\x1e\xe6\x5a\x5b\x53\xe1\xa1\x71\xbc\xcc\x74\xff\xb3\xc3\xfb\xee\xff\x7a\x56\xaf\xf0\x50\xf2\x23\xe0\x75\xa5\x41\xfc\xaa\x4a\x84\xaf\xa5\x12\x37\x83\x21\x7f\x39\xe9\xf2\x48\xd1\xad\x3f\xb4\xff\xce\xec\xa0\xa6\x85\xa3\x36\x7c\x55\x44\x37\x9e\x5d\x18\xe9\x1c\xe8\x4c\x04\x41\xc7\x03\x83\x6b\x5b\x8a\xc3\x91\xb6\xa5\x20\x40\x31\x8e\x86\x6a\x72\x4f\x47\x5c\x79\x40\x39\x1c\xf1\xf7\x53\xf3\x47\xc0\x73\xcc\x98\x6c\x52\x3a\x8c\xe2\x68\xc9\x1d\x4e\x33\xaf\x00\x7d\x9b\x0a\xf1\x66\x5d\xa6\xee\xb5\xeb\x35\xcb\x5b\xdc\x1b\xcd\x6b\x2a\x8e\x38\xb1\x9b\xef\xcc\x25\x8b\x3c\xdd\x6d\x9c\x03\xde\x2a\x90\x0f\xb3\x77\xbc\x0e\x15\xb0\xd8\x5a\xd7\x74\x86\x73\xa0\xa5\xe6\xc0\x5d\xc1\xad\x2a\x82\x95\xcd\xb8\x33\xf7\x3f\xfa\x94\xd6\x19\x1e\x15\x22\xa0\x71\xa7\x85\xa4\x81\xef\xdc\xcd\xf4\xcd\x4e\xc0\x3c\xf3\x6e\x56\x87\x1f\xed\x5e\x4c\x0b\xd1\x02\x33\x88\xd1\x73\x85\x88\x6d\x43\xcc\xe7\x21\x6a\xcf\xde\xbc\xba\x18\x5e\xc5\x46\xb7\x07\x93\x47\x4c\x7c\x98\xe1\x6e\x36\x82\x7d\x9a\x90\xc5\x9d\xf9\xf8\xde\x19\xac\xec\x12\xf3\xd1\xb8\xd2\xc7\xda\xe5\x14\x8e\xb5\x71\x41\x46\xd2\xf7\xb3\x8c\xc1\x21\x10\x62\x7a\x37\xea\xa7\x06\xfd\x7f\xc9\x2c\x5e\x24\x9d\x5c\x15\x08\xf1\x87\x84\xb3\xaa\x7d\x73\xad\x37\x23\x54\x15\xdf\xef\xf7\xc6\x62\x3a\x7e\xd7\x5d\xdc\xd0\x06\x5b\x8f\xda\xc4\x28\x4e\xe6\x73\x43\x3d\x29\x87\x23\x3e\x76\xdb\xf9\x9e\x9a\xaa\x71\x22\xbb\xaf\x78\x8b\x1d\x27\x28\xb3\x7d\xb7\xd6\x56\x5f\xf1\xdc\x14\x70\xd6\x03\x5a\xbc\x57\xc9\x7a\xcd\x19\xba\x8a\x4f\x74\x76\x5d\xea\x33\xe5\x39\xaf\x52\x5b\x67\xdc\x79\x0a\x5c\xe3\x40\x10\x1a\x40\xb2\xa7\x92\x3d\x9d\x6c\xa7\xb7\x6d\x07\x5e\xa9\x64\xa0\x53\x0a\x92\xd3\x6c\xc5\x39\x20\x68\x88\xb1\x34\x44\x46\x20\x3c\x0a\x97\x86\x4c\x74\x0d\x41\x28\x67\x09\x6c\xa7\x9b\xa1\x33\x74\xb7\x6a\xd5\x2a\xb1\x03\x69\x9d\xa7\xfa\x2e\xcb\x1f\xce\xe7\xb2\x88\x07\x45\x3c\x28\xb2\xab\x8a\xe4\xa4\xfa\x57\xb1\x52\x10\x4d\xe7\xe9\x0d\x72\x8b\x9f\xd5\x7d\x0d\xcd\xf9\x6a\x2a\x5c\xfd\x40\x0b\x30\x53\xdf\xa7\x1e\x76\x0a\x3a\xa0\x1e\xf0\x2c\x09\xcf\x50\xf5\x06\xdf\x38\x0c\xa3\x74\xf0\xf0\xe9\x7e\xa5\x16\x06\x76\x6b\x4b\x31\x1c\xbd\xd7\xec\xc6\x53\x9e\x6d\x58\xaf\x33\x44\xef\x41\xbb\x2e\xec\x71\x7e\x22\xf8\xb0\x29\xfc\xb1\x51\xa5\xd5\x1c\x1e\x36\x97\xf3\x02\xef\x6c\x8b\x35\x49\x6a\x4d\x8c\xc4\x58\x4f\x33\x2f\x52\x7c\xf1\x52\x88\x65\x38\x10\x6b\x3b\xdc\x79\xf0\xd0\x3b\x37\xe1\xce\x6d\xe0\x1a\xdc\x39\xf0\x5d\xb9\x99\x77\xda\x4b\x3e\x44\xe5\xe8\x36\x5f\xb4\x87\x89\x03\x6f\xa9\x3e\xed\x38\x6f\xd0\x2f\xac\x44\x6c\x59\xd6\x78\xa7\x8b\x0e\x02\x87\xee\x96\xca\x8c\x03\x20\x5f\x9e\x8e\xc9\x42\xc2\x78\x99\xa8\x31\x4f\xa6\xca\x6a\x51\x95\x86\x5d\xa1\xa2\xb2\xd0\x8a\xce\x62\x87\x5a\xdd\x4e\x35\x3a\x6b\xbd\xf6\x5f\x65\xc6\x49\x01\x8d\x9e\xa4\xd3\x61\x2d\x1d\x88\x77\x71\x66\x97\x82\xf4\x5f\x93\xbc\x83\x0e\x35\x8a\x69\x9d\x5c\x29\xd2\xfa\x1e\x0c\xdb\x99\xcf\x33\x6f\xd7\x48\x13\x75\x42\x03\x3d\x1d\xfb\x79\x98\xcd\x6b\x52\x5d\x67\xbe\x39\xeb\xa2\x1b\x8b\x28\xe9\x7b\x40\xf9\x0d\xda\x1c\x13\xe9\xc9\x4b\x4a\x48\xc1\x44\x85\x66\x78\x84\x7a\x4e\x07\xf6\x4e\x5a\x2c\x50\x53\x77\x6b\x7a\x9f\xf5\x87\x82\x8f\xc5\x79\xa7\x27\xf8\xb0\x31\xe4\x41\x47\xf4\xc6\x86\x6f\x9e\xbe\xc0\xa4\xf7\xcd\x73\xf5\xf7\x4c\xfd\xbd\x80\xbf\xc4\x0e\x9c\x97\x5d\xd7\xa8\xd2\x94\x6a\xc3\xf7\x1a\xf5\xcd\x13\x99\x01\x51\x0a\x60\xfe\x49\x6c\x6c\x85\xcd\x02\xda\x06\x64\x8f\x20\x29\xa2\x9d\x69\x1e\x7d\xe6\x9b\x5d\xcf\x20\xf4\xdd\x86\x72\x2b\x1d\x73\xe2\xba\xdf\x52\x7c\x02\x14\x40\x37\xbd\xd0\xdc\xcf\x30\x79\xa5\x0a\x6d\x5a\xed\x8a\x51\xbc\x33\xc7\xbd\x15\xc4\x87\x73\xa0\xec\x99\x71\x9c\xa5\x24\x6d\x29\x9b\xc7\x3c\x6d\x4b\x1b\x29\xcf\x6b\xc4\xd6\x3b\x99\xfa\xf2\x90\xf0\xf9\xdc\x5b\xd7\xa7\x01\x1a\x7b\xa9\x13\x42\xe5\x38\x10\x86\x94\xbc\x0e\xe2\x8f\xd5\x9c\xa4\xc7\x1c\x25\xda\x2a\x1e\xc9\x5a\xff\x47\x21\x1c\xe5\x8d\x33\xee\xcc\xb6\xf7\x1b\xa0\x97\xff\x0b\xa0\x29\x09\xf5\xc1\xc5\xa5\x84\x7c\xbd\x12\x72\x01\x6e\x58\x84\x7b\xd2\xf9\xe5\x2d\xb6\x06\x7c\x75\x6d\x2c\x63\xab\xc2\x74\xe5\x61\xf7\x96\xac\x54\x46\xab\x34\x9f\x78\x41\x66\x98\x41\x2d\x40\x0a\x8a\x58\xee\xad\x52\x32\x2c\x9c\xf2\x18\xb8\x52\x4f\x0c\x74\xba\xad\xc7\x7f\x3e\xd7\xcf\x93\xbf\x88\xa6\x14\xbc\xac\x32\x2f\xaf\x54\xfc\xee\x6a\x42\x9f\xf9\x78\x2a\xb6\x8a\xf7\x14\x90\xf9\xc8\xfb\x80\xa4\xc1\x8d\x14\x0b\x1c\x79\x39\x6d\xe4\xf9\xdc\xd0\xa7\xbc\x54\x6f\x08\x9f\x5c\xe3\xec\x84\x14\xce\xfc\xf4\x04\xbc\xcd\x93\x9e\xd7\x9a\x18\xba\x8d\x99\xb7\xb8\x95\x3e\x70\x3e\x74\x3d\x77\xbd\xb0\x6f\xff\x09\x21\xfa\xe3\xc3\x0b\x80\x1f\xa9\xd0\xfc\xc7\x32\x7b\xd5\x4e\x32\xad\x8e\x05\xb1\x7f\xac\x16\x02\xde\x5d\xa7\xb9\x74\xe8\x03\xae\x43\x1f\x14\x23\x31\xff\xfc\xad\xdc\xff\xa7\x14\x29\xff\xfc\xa5\x90\xb7\x50\xa1\x3f\xb5\x38\xf5\x67\xb2\xa6\xbd\x17\xe3\xe7\x0a\xb1\x67\xa1\xc0\x10\x0a\x0c\x65\x81\x9c\xa0\xef\xfe\xb7\xb8\xdd\xa7\xa2\xd5\xfb\xdf\xd5\x01\x55\xe8\x1a\xee\xff\xaf\xbd\xf6\xf0\x5b\xcc\x1e\xa4\xd0\xf1\xd3\xf3\xc0\x78\x78\x27\x25\x2c\x54\x14\x58\xd1\x91\xb4\xd7\xcb\xb7\xfd\xf3\x6f\x6b\xf8\x2c\xc5\x01\x9f\x57\x89\x03\x94\xc7\x67\xa4\x08\x6f\x3d\xb7\x68\x79\xc6\x9b\x1f\xcd\x3b\xde\x44\xc6\xf7\x78\x6a\xf0\xe6\x3f\xe8\x4e\xcc\xfc\x7f\xe9\x4e\xaf\xf9\x5b\x96\x4c\xae\xc3\xfd\x01\xd3\xa1\x72\x7f\xde\xb1\xc3\xb8\x54\x5a\x3f\x89\x8d\xaf\xdb\x7f\xea\x0b\x49\x19\xe4\xe5\xc7\xb3\xda\x2e\x90\xcc\x68\xda\xf7\x86\xd7\x54\xec\x9c\xd7\x94\xec\xdc\x03\xff\xd8\xb5\xef\xad\x19\xf9\x40\x4a\xcd\x5c\xa3\xd7\x80\xbd\xca\x2b\x95\xee\xae\xa5\x4b\x8c\xcc\xf6\x29\xc5\xfe\x6e\x59\x5d\x12\xed\x8b\x09\x77\x5e\xd0\x8d\x86\x03\x14\xe3\x8a\xf3\xd7\xc8\xce\x55\xa2\xa5\x3e\x99\x9a\x54\x9e\xdd\x2c\xc4\x07\xe1\x92\x60\xf2\x96\x68\x25\x1f\x6a\x3b\x38\xa2\x9e\x22\x29\xf0\xfd\x10\xde\x67\x5d\x65\x42\xa3\xb3\x5c\xcb\xd3\x7e\xff\x77\x35\x90\x37\x2c\xd1\x38\xd5\x40\x53\x3e\x15\x68\x15\xbb\x2f\xd5\x73\x80\x56\x09\x14\xad\x52\xc7\x02\x27\xa7\x34\xe1\x46\x90\xa3\x57\x2c\x9d\x1e\x28\x52\x45\x03\xbe\xc6\xb6\x7e\xc4\xa3\x3e\x70\xe3\xec\x54\x4f\x1d\xcd\x7f\xa9\x09\xa4\x99\xb0\xfe\xb3\x18\x86\x49\xff\xc5\x6a\x45\x0b\xa2\x2f\xf1\x1e\xb8\xf1\x5d\x93\xb8\x27\x3f\xd3\x34\xff\x28\x25\x7b\xe5\x34\xb9\x56\x3e\x3e\xf2\xdc\xed\xc9\x4f\xf5\xe6\xe5\x38\xe2\x8c\x74\x57\x63\x96\xa7\xbf\xd3\x95\xf6\xe2\x1a\xd7\x53\x4e\xaf\x15\x7f\xfa\xf3\x4e\x6a\x3c\x3c\x7f\x37\x94\xbf\x18\x95\x69\x74\x46\x15\x90\xf2\x48\x94\x15\x18\x78\xd4\x95\xd4\xd5\xdf\xf4\xf3\xd3\xb1\x75\x49\xe4\xb0\x3d\x7f\x5f\xe2\x3b\x32\xa6\xf2\x3d\x8a\xeb\x1a\xc7\xf7\x07\xa5\x0e\x89\x3c\x74\x49\xc7\xcb\x76\x8b\xa9\x4b\x5b\x91\x56\x45\x2b\xa6\x5f\x6a\x86\x2c\xe5\x2f\x7c\xa6\x39\x0c\x1a\xb0\x22\xcf\xc2\xf2\x5c\x8b\xee\x75\xdd\x01\x67\x6d\xda\x9a\xf1\x72\x00\xed\xe3\x65\xaf\xcb\xcb\x1e\x3c\xfa\xe5\x4b\x41\x16\x48\xad\xbe\xdb\x4c\x3e\x67\xe7\x1e\x4d\x09\xd6\x22\x9f\x0e\x7c\xc9\x5e\x4c\x7e\xa5\x06\xe9\x35\x4d\x61\x9e\xc5\x19\x75\xf0\xff\xff\xbc\xfd\x4a\x16\x38\xe5\x7a\x35\x39\x01\xb3\x3e\xdb\x61\x91\xc1\xfd\x25\xa5\xae\x97\x54\xff\x28\x77\xdc\xd3\xe1\xd4\xf2\xe1\x1c\x0f\x16\xc4\x96\x3b\x31\x92\x17\xb8\x95\x67\x2a\xfc\xe3\x9e\x21\x72\xc4\xb6\xc0\xa1\xfc\x25\x09\xaf\x6b\x3b\x3c\x49\x0f\x1e\xba\x1c\xcf\x2a\xad\xf2\xfe\x6f\x55\xf9\x77\xe8\x7b\x5d\xed\xe9\x33\xff\xb8\x5e\xba\xd1\x01\x20\x95\x21\x46\x1b\xe9\xf4\xa2\x0d\xab\x3b\xe5\x74\x00\x5c\xff\xf0\x59\xec\x8e\x06\xc2\x1f\x37\xf9\xb8\xd3\xb7\xae\xe1\xac\x04\x12\x6a\x77\x2c\xa3\xe6\x8b\xef\x2d\xa3\xf1\xcc\xe9\x6d\x04\x27\x9c\x44\x1f\x4f\xe7\x71\x26\x93\x1a\xcb\x20\xca\xc5\xde\xfa\x2d\x0f\x21\x2f\xce\xf0\x72\xa3\xf1\x68\xe8\x43\x94\xd8\x41\x85\x79\xb6\xa8\x30\xdf\x16\xea\x4e\x07\x83\xff\x07\x9b\x41\x59\x6c\x0a\xb5\xc5\x8f\x58\x84\x31\xb7\x02\xf6\xb6\x11\xf6\x7b\xe3\x8a\xbc\xc8\xd8\xb0\x22\x75\xa5\x41\x65\xf2\xa8\xf3\x2a\x36\xac\x91\xf4\x46\x3c\x91\xf0\xcc\x7f\x7f\xdd\x1c\x11\x3a\x52\x91\x5b\x2b\xa3\xad\xed\xf2\x84\xd0\x09\xf3\xec\x10\xef\x9f\x8c\x49\x59\x7e\x13\x5b\xdb\x84\x06\xce\xf5\xa9\xcb\x1a\xc7\xc4\x0a\x19\xbb\x1c\x95\x4a\xf0\x59\xa8\xe4\xd1\x11\xb1\x03\x73\xca\x26\x76\x60\xce\xd8\xc8\x8e\x9c\x93\xc0\x2d\x95\x8c\xc0\x39\x3b\x72\xd9\xc5\x01\xb1\x23\xf3\xc6\xc7\x84\xd3\x23\x97\xed\x36\x88\x5d\x45\x1b\xd2\xb3\xa9\x11\xd0\xe6\x49\x79\x00\xbb\x4a\xb6\xb5\xd8\xd9\xf1\x70\x3b\x42\xcf\x57\xe9\xae\xaf\x8e\xfc\x03\x0f\x23\x1a\x28\xaf\xc5\x71\xa9\xb4\x17\x97\x4a\xcf\x31\xf2\xe0\xa7\x07\x34\x29\x1e\xba\x92\x35\x57\x07\xae\x54\xd8\xb8\xbd\x36\x6a\x18\xa2\x3d\x91\x4e\xb5\xf4\x09\x93\x31\x6e\x30\xa0\x49\x8e\x6f\x4b\x7e\xc5\xb7\x69\x74\x7b\x27\x79\x3a\x51\x79\xec\x7a\x48\x27\x7a\x66\x3e\x39\x96\xf1\x0f\x56\x05\xef\x91\xa5\x33\x3f\x14\x2b\x2c\x08\x74\xd8\xb7\xf4\x46\x1a\x4d\x72\x1a\x21\xb1\x23\xee\x9c\xb9\xce\x7e\x66\x5e\x50\xbc\x9b\xc6\x7c\x47\xbf\xcb\xb7\x2d\xf3\x3d\xee\xff\x26\xdf\x17\x4b\xda\xea\x04\xce\x17\xe5\x42\xb0\x1f\xd2\xc0\xa9\xba\x34\x70\x6a\x2e\xad\xd2\xda\xbf\xab\x3b\xf2\xce\x4e\x90\x7a\xcd\xaa\xd2\xea\x8e\xc0\xbf\x81\xf3\x07\x64\x5a\xba\xa9\xfe\x43\xd6\xdb\x8e\xd0\xdb\x6f\xc1\x0d\xe0\x48\x00\x6d\xb6\x92\xd9\xcd\x53\x12\x06\x7f\x4f\xab\x79\x85\xfd\x36\xa3\x25\xd0\xdd\x49\x52\xbc\x28\xfb\xf4\x3b\xb6\x15\x0f\xa6\x25\xb6\x35\xcf\xac\xa6\x14\xc8\xcf\xbb\x0f\x05\xd2\xf6\x78\x36\x80\x89\xc9\x19\x3b\x6c\x2f\x9d\x5c\xa5\x92\xfa\xe8\x65\x1f\xbd\xdc\x47\x49\x3c\x9b\x5d\xa3\x7d\x04\x27\xec\x0f\x25\x28\x7c\xfe\xae\xe6\x15\xd0\x30\x78\x30\x1f\x17\x74\xb0\x10\xed\x63\xb1\xa4\x67\xf9\xf3\x2e\x83\xf8\xec\xbd\x07\xf9\x8e\xe5\xcf\x5b\xa2\xee\x0f\x0a\x86\xa9\x27\x3f\x0b\xaf\x5e\x24\xbb\x2a\x2f\x12\x48\x67\x38\x56\xf4\xe6\x37\xe7\x73\xc3\x6f\xea\x18\x7d\x7f\x54\xab\x84\xfa\x4d\xa7\x70\x53\xe0\x37\x73\xc5\x82\xe6\xb2\x12\xa7\xbe\x83\x37\x6f\x4d\xc5\x48\x75\x7c\x7d\x41\xf1\x94\x5d\x3f\x8a\xe6\x92\x9f\x1e\xb3\x13\xd8\xef\xb9\x2a\xd1\x44\x6e\x5e\x20\x97\xc4\x59\xd0\x84\x33\x59\x34\x7f\xcd\xd8\x8b\xd5\x3c\x55\x8e\x4b\xe1\xe8\x38\xd3\x77\xa6\xae\x3d\xe0\x46\x40\xc3\xa6\xc1\x49\xf9\x16\xaf\x37\xf0\xcd\xc3\xb7\xc6\xd4\xf0\xd5\xb7\x91\x28\x63\x72\xa6\x65\xe9\x45\x52\x50\x57\x2a\x5d\xbe\x18\x3e\x3d\xdc\xcb\x77\x67\xd4\x7c\xaf\x09\x55\x68\xea\x87\x6a\x51\x8f\xfb\xfa\xc2\x35\xde\xd7\x17\xae\x8d\x8e\xbe\x70\x3d\xee\xa0\x5a\x54\xd4\x44\xb9\x42\x94\x75\x8b\x7c\xfc\xa5\x1e\xd9\xe3\xbe\x16\xc9\xc4\xfb\xcc\xb3\xdb\xcd\x1c\x55\x58\x51\xf5\x50\xaf\xa2\xea\xa1\xdb\x9b\x3a\x4d\x3d\x1d\x77\x80\x72\xdc\x7b\x31\xa2\x15\x0c\xae\xc6\x93\xa7\x78\x16\x6b\x50\x18\x54\xd4\x5d\x6a\xbc\x5f\xf1\xe8\xf6\x26\xa7\xdb\x9b\x45\x37\xec\x9d\x66\xb6\x87\xff\xaa\xc3\x14\x23\xdf\x69\xa2\x10\xa3\x93\x75\xc4\xf1\xd4\xe8\xac\xc0\xaf\x38\xf8\x30\xf0\xc0\xd4\xd0\xc7\x26\x9e\x59\x3e\x2a\x41\x3c\xc2\x00\x2f\x34\xb4\xdf\xcc\x1f\x35\x77\xfc\xc2\xdc\xf1\xd3\xb9\x93\x77\xd1\xf8\xcf\x9a\x14\x37\x51\xfa\x11\xe7\xa6\xfc\xc0\x88\x9b\xcb\x72\x90\x24\xd7\xb9\xbd\x13\xda\x39\x92\x4e\x25\x73\x5d\xd9\xfd\x67\xf5\x76\x9b\x28\x13\xe9\x66\xf5\x7e\x92\xcf\x4b\xf2\x91\x5c\xc5\x78\xc3\x53\x73\xe9\x61\xbb\x28\x25\xe9\xfd\xbd\xc5\xdd\x93\x22\x93\x5e\x61\xf0\x7a\xff\xc7\xc1\xeb\xfd\xa3\xc1\x53\x20\x5a\xea\xd9\x2b\x38\xc6\xeb\xff\x5d\xd1\xca\xb2\xe8\xe4\xde\xe8\x4b\x99\x09\x92\x92\x4d\x26\xb8\x13\x0a\xb7\x54\xfa\xf7\x8e\x7a\xcc\x39\xa8\x3d\xca\x7b\xaa\x50\x8c\x53\x82\x6e\x18\xeb\xdc\x02\xbe\x46\x3a\xa7\x20\xe5\xdb\x6c\xf3\x7c\x6a\xe6\xca\x20\x41\x58\xab\x56\x37\x8d\x5c\xee\x8a\xf9\x35\xaf\xec\xf1\x98\x2f\xf0\x24\x27\x6c\xf6\x35\x5c\x09\x2e\x07\x2d\x07\x29\x69\x6a\x6b\x95\x41\xb3\xce\xd1\xf1\x9d\x85\xd2\x1a\xf4\xdd\x9a\x66\x1b\x36\x8b\x72\x91\x5b\xa7\xe5\xb9\xc6\xd1\x84\x97\x3d\x18\xb0\x4e\xc0\x4e\x26\xbc\xfc\x1a\xf0\x72\x79\x45\xa4\xbd\x11\x22\x34\x68\x96\x4a\x1c\xd9\x42\xd4\x81\xc1\x7d\x0a\x07\xaf\x17\xb8\x64\xd1\xc7\x71\xfe\x07\x92\x21\x7b\xd4\xd4\xa7\xde\x27\x59\xf8\x97\x72\xa2\x19\x6c\xea\x97\xc4\x5e\x56\x1d\x54\x97\x9a\x39\x77\x1c\x32\x2d\x70\x6d\xe1\xdc\xf8\x2e\x63\x07\x47\xa5\x92\x8f\x57\x9e\x82\x2c\x96\x64\x4d\x75\x29\x0e\x62\xec\xbc\x5d\x1f\x43\x0d\xeb\x35\x62\x01\x3d\x61\xce\xba\x75\x43\xa6\x54\xe1\x6c\x1a\x4a\x64\xe9\xc1\x11\xa1\x3d\xcf\x08\x68\x3a\x2e\x28\x95\x2a\x03\x47\x7d\x0f\x87\x55\x26\xb4\x7a\xc2\xc0\x1e\x56\x06\x05\x9b\xa0\xbe\x13\x4b\x57\x97\xeb\x07\xd9\x0d\x7f\x43\x98\x35\x55\x20\x0b\x52\x2c\xc9\xd1\x4b\x39\x16\xcb\xe4\x58\x28\xbf\xb2\x82\x4d\x2d\xc1\xa2\xd0\x43\xa1\xef\x1a\x8d\x53\xe2\x54\x5d\xbb\xf6\x2d\xa8\x4b\xe6\x5c\xb7\xb1\x71\x8a\x6d\x14\x34\x20\x74\xf2\x62\x08\x7a\xba\x87\x8d\x13\xc5\xc6\x09\x68\x9c\xc8\xfa\x96\xc6\xd3\xac\x7d\xf4\x18\x50\x0c\xca\xb7\x44\x89\xc9\xa6\xef\x9b\x9b\xe9\x56\xb5\x9b\xef\x0d\x7f\x38\x6c\x0a\x7b\xdc\x08\xe9\x20\x22\xb0\xc1\x84\x6a\x47\xb0\x43\xbd\xc1\xf8\x68\xed\x1a\xc2\x26\x1f\xe8\x2d\x1f\xdf\x04\xbe\x71\x39\xfe\xfd\xd3\x52\xa9\x31\x05\x06\x01\xb3\x49\xca\xa1\xa0\x7b\x35\x2e\xac\x0e\xb5\x56\x68\xc0\xd0\x10\x14\x8e\x4d\x9f\x56\x29\x50\xe4\x43\xa0\xc8\x77\xdd\x9c\xe8\x74\x3c\x9c\xbd\x89\x67\x9e\x18\x1b\x41\xdf\x47\x33\x47\xb3\xc7\xbb\x62\x34\xe0\xbe\x18\x6d\x90\x85\xcf\x81\x0b\x89\x8f\x38\x79\x5b\xdc\x31\x1c\x60\xa0\xa0\x3f\x56\x65\x89\x30\xbe\x54\x0e\x88\x19\xfd\xf5\xdc\x4d\xfe\x9a\xcf\x0d\x58\xe1\xf9\x0f\x3c\x08\x8c\xc3\x09\xa7\x9d\x33\x7a\x9e\x70\x62\x7d\xf0\x91\x50\xee\x19\x5c\x5d\x14\xb7\xc6\xb3\x44\xb4\xda\x42\x8c\x0d\x42\x1b\x13\x4e\x7e\x25\x37\x52\x28\xe5\xb4\x6b\x46\x53\x5e\x96\x5b\x64\x79\xdc\x93\x8f\xb8\xcb\x2b\x5a\xd3\x57\x13\x52\xcf\x24\xde\x80\xe9\x16\xa8\x91\x14\x7a\x24\x05\x15\x38\x84\x55\x1c\x3f\x41\x55\xdd\x38\x7e\x22\xb5\xdb\x05\x72\x2f\xa0\x5a\x8c\x18\x36\x53\x8d\x03\x35\x84\x4a\x20\x47\xac\x65\x8a\xf0\xf2\xc5\x08\xa8\xdf\xd1\xda\x05\x24\x2d\xfb\x32\x29\x94\x4d\xa6\xc4\x3a\xdc\x23\xb6\x5a\xaa\x05\x79\xaa\x68\x6a\xd7\x7c\xf6\xf9\xd8\xf0\xe9\xd9\x89\xd6\x1a\x1b\xde\xa9\xe0\x9a\xd2\x83\xc9\xdd\xfb\x91\xcc\x8b\xe9\xb4\x18\x57\x09\x0c\xa7\xe8\xa2\x09\x25\x95\x03\x19\xca\x76\xe8\xa6\x4a\x9a\x18\x50\xff\x56\x09\x2c\xa5\x6b\x45\x0d\xc7\xe6\xa5\x12\x77\x02\x38\xb4\xf0\x8f\xf3\xd3\x77\xd7\xd9\xb5\x4d\x38\xe3\xce\xa3\x70\x73\xdf\x33\xfe\x87\xd3\x9b\xa9\xa2\xef\x86\x77\xd2\xcd\x88\xe6\xc1\xfe\xa6\x5c\xf2\x63\xf5\x21\x33\x17\x7c\x4f\xcb\xe8\x9c\xa9\x6b\x0e\x3a\x53\x91\xdc\x75\x82\x71\x7b\x3e\xe7\xce\xae\xe7\xce\xe7\x35\x9a\x7d\x91\xba\xb0\xf0\xe9\xc1\x87\x4f\xbf\x13\xea\xfd\x4e\x7a\x27\x1d\x55\xe8\xe9\xf6\x34\x95\xcb\x35\xa6\xbc\xe2\x53\xaf\x12\xd0\xed\x4d\x9f\x6e\x6f\x06\x44\xc5\x39\x8f\xe0\xdb\x78\xe5\xc5\xb9\x39\xee\x2d\xdf\x9b\xff\x5a\x94\x57\xac\xfa\xf0\x44\xd7\xac\x3d\x33\xca\x1a\x3b\x69\x8d\xbf\xaa\xe9\xf7\x12\x3c\x69\xea\xa8\x6b\x3b\x7d\x96\x0d\x8d\xb2\xea\x12\x78\x9b\x9e\xa2\xf7\x7e\xe9\x1e\x0b\x12\x8a\xc2\xb7\xa5\xfb\xfb\xbf\x2f\x7c\x1b\xab\x7a\xfb\xa7\x84\x8e\x52\x2c\x7a\x27\xc4\xf6\x58\x23\x2c\x3f\x21\x91\xdd\x14\xf0\xe0\x93\xf2\x11\xa6\x04\x3a\x45\x90\xf2\x6b\x08\xf8\x8d\xe8\x55\x9b\x7a\x44\x3e\xb6\x4e\xe9\x45\x1b\xca\x6b\x68\xd3\x5d\x4e\x6c\x0f\x48\x97\xb8\x8d\x9f\x7c\xe6\xc1\x7a\x39\x02\x5a\x10\x85\x78\xe9\x11\x86\x5a\xc9\x3e\x8d\x52\xad\x64\x15\x61\xbd\x54\x32\x7c\x27\x3e\x73\x59\x48\xb4\x80\x6d\x04\x19\x33\xf1\xda\x3e\xbc\xee\x36\x10\x07\x4f\xd2\xc9\x52\x37\x79\xa4\xfe\x7a\xba\xfb\xba\x4d\x63\xb0\x42\xdc\xb5\xa4\xa6\xf0\x81\xb4\x4b\xf9\x67\xc9\x7a\x0d\xea\x13\x39\xbe\x40\x55\x12\x37\xd5\x7e\x57\x14\x7b\x2d\x69\x30\xe4\x42\x62\xfc\x6f\xe5\x5e\x41\xfb\x9d\x9c\xea\xa6\x83\xac\x35\x59\x25\xfe\x3a\x6c\xfc\xbd\xec\x4a\x0a\x36\x8b\xfe\x5e\x76\x25\xbc\xda\x3d\xfb\x40\x44\xb6\xed\x96\x03\xe7\x0b\x5e\x0c\x34\x8d\xc0\xf9\x03\xfd\xda\x08\x14\x97\x11\x38\x48\x30\xf5\x2b\x3a\xb6\x11\x28\x3f\x23\x84\x46\x32\xb5\xea\xa2\xa2\x7f\x53\x46\xf5\xa0\x89\x94\xcb\x56\xfe\xfc\xfa\xf5\xcb\x9f\x9b\x18\xe1\x83\xf6\x96\xd2\xbe\xb8\x2a\xa2\xc6\xee\x13\xa7\x21\x15\xe9\xa4\xff\x47\x92\xb5\xec\xa4\xfb\x1b\x92\x35\xd1\xfc\x58\xb2\xa6\x7d\x7e\xac\x90\xb0\xf5\x97\x25\x6a\x6a\x4f\x37\xf2\xd4\xd4\x2a\xd5\x13\xed\xc2\xa3\xff\xa1\x9c\x69\xd2\xfc\xc0\x93\x88\x3e\x0f\xcf\x25\x2f\x15\x4c\x0c\x31\x9f\xff\xe8\x6a\x2b\xa2\xe0\x84\x5d\x2a\x6b\xd9\x20\xf5\x13\x37\xdd\x4d\x1f\xf9\x75\x96\x3a\x49\x1f\x77\x13\x9e\x3e\x1f\xe4\x9e\x4f\x4e\xd2\xc7\x1f\x0f\xe9\xb5\xf8\x5e\xc2\xd3\x67\xef\x3a\x7d\xdc\xcf\x25\xbf\x3c\xa7\x76\x4d\xf7\xc2\xc8\x16\x51\x83\xb3\x67\xd5\x33\xf5\xaa\x15\xf0\xc5\xbd\x31\x69\x2a\xff\x26\x13\x75\x6d\xbe\xff\x2f\xb6\x5d\xfd\xe3\xdf\xf6\x9d\x79\x83\xfa\xbd\x77\xe6\xad\xfa\xdb\xf7\x58\x25\xe0\x90\x10\x6a\x2b\xdf\xc9\xbd\x7e\xfa\x88\x74\xc3\xc0\xa0\x79\x99\x5b\x87\x1b\xc4\x7c\x34\xa6\x23\xfa\x36\x1a\xfa\xd6\x8b\xc2\x87\x6e\xf8\x09\x1f\x8d\x36\xac\xfe\x13\x57\x37\x30\xdc\xa9\xa6\x97\xc1\xdc\xa9\xb9\x0b\x1c\xce\xc3\x70\xc9\x4b\xef\x68\xe8\x33\x0d\x25\xbd\xcf\xcd\x6f\x0f\x2f\xcd\x74\x62\xda\xdc\x0c\x4e\xd6\xd9\x65\xdd\x63\x53\x18\x62\x78\x25\x96\xa1\xde\x7a\x47\x84\xcc\xe7\xfa\x6d\xda\x86\x65\x0a\x87\x32\x50\x07\x18\x85\x00\xf6\x19\xf3\x5c\x68\x7e\x33\xdd\x8c\xcc\x73\x91\x91\xcd\xdd\xa2\x26\xb8\xe3\x16\x03\x0c\x20\xce\x7c\x28\x38\x93\x7f\xe6\xf3\xe9\x90\xdb\x1c\x03\x71\x9b\xc3\xa7\xf9\x7c\xda\xb6\xd1\x71\xb2\x23\xbf\x53\x48\xa5\xdc\x39\x72\x95\x83\x00\x82\xf6\x49\x3e\xbe\x88\x31\x7a\x33\xf2\x8d\x78\x84\x41\x25\xef\xcc\x97\xe7\xf7\xaa\xf9\xe7\x02\xb2\x4c\x0f\x95\x69\xb4\xb7\xca\xd9\x49\x57\xc5\x1c\x3c\x17\x74\x7a\xb8\x9a\x10\x52\xed\xe1\xf3\xf9\x97\x6a\x95\x7a\xf3\x79\xed\x6b\x55\xe2\x04\x5b\x57\xae\xa6\x97\x43\x15\xe0\x72\xa5\x7f\x9b\x5c\x4d\x2f\x87\x04\xcd\x43\x76\xcf\x30\xfb\xc3\xe5\x7b\xdc\x1b\x9c\xe1\x81\x72\xbf\xe2\x5b\xdf\x2b\x0e\xf4\x4c\x31\x2c\x1c\x16\x17\x8c\xb5\x44\x27\x19\x41\x27\x4e\x27\xba\xc7\x72\x2c\xce\x6b\x53\x87\x4d\xf6\xfc\x8c\x72\xe3\x8c\xfd\x38\x40\x15\xb7\x63\xf9\xe7\x44\xfe\x79\x90\x7f\x3e\x1f\x64\x00\x9e\x3f\x02\xd0\x3d\xc1\xbc\xcf\x53\x8e\x7f\x77\xa7\x3c\x2b\xd4\x93\xe7\xd5\xdf\xa8\x36\xe7\xdc\xff\x77\x65\x4e\x52\xe4\xee\xcc\x7b\x7f\x95\x64\x55\xf6\x86\x26\x61\x27\x5f\x56\x4e\x94\xc9\x17\xa5\xc6\x39\x12\xe3\x9b\xce\x38\x11\xef\x73\xdd\x86\x5a\x7e\x2a\x21\xf6\x94\xc1\x88\x79\x1b\x3a\x2f\x9e\x6b\x6c\xfd\xb7\xb7\x15\x51\xec\xe8\x9c\x7b\xa1\x74\x6c\x4e\x4e\x64\x64\xf9\x74\x7c\x06\x38\x3e\x27\x27\x38\x3e\x4d\x91\x5f\x57\x27\x27\xe8\xf6\x6f\x91\x8d\xf1\x5e\x2a\xd9\xe1\xe6\x8f\x07\x15\xd2\x80\x0d\x70\xcd\x41\x0a\x7d\xea\x71\x2a\x97\x85\x84\xde\x1f\x61\x8b\x53\x00\xfb\xcd\x25\x82\xc4\x16\x2c\xe0\x79\xef\xa1\x34\x62\xd2\x7b\xe8\x4e\x64\x97\xcb\xa1\xa6\x69\x3d\x27\x74\x15\x49\x15\x97\x4a\xf1\x8e\x8c\xff\x19\x93\x85\xd8\xe1\x66\x83\x97\x4a\x06\xfc\x61\x78\xcd\x0b\xfb\x24\xfa\x21\xed\x0f\x8d\x25\x68\x12\x10\xcd\x00\x7d\xd3\x80\x6c\xf1\x8d\x9b\x7d\x0f\x01\xf5\x3d\x26\xb5\x0e\xfc\x0e\xc6\x41\x45\xed\x6a\x7e\xed\x9c\xba\x3b\xdc\xbc\x0c\x0a\x3e\x83\xf6\xf3\x7e\x0b\x79\x10\x74\x7a\xd1\x5a\x22\x22\xd1\x0b\x46\x6b\x63\x31\x1d\xaf\xf1\x70\x2c\x86\x6b\x61\x67\x38\x1a\xaf\x89\x44\x20\x3b\xbe\x81\x96\x68\xd7\xd2\x43\x7b\xda\x59\x1d\x1c\x0a\x7e\x9d\x2d\x15\xac\x4d\x8f\xd7\x74\x17\x9d\x5b\x66\xf9\xc7\x87\x14\x53\xf5\xc8\x2d\xd0\x06\xe4\x80\x8f\x57\x3a\x08\xf7\x3b\x06\x57\xde\x73\x2f\x03\x87\xbb\x96\x7a\xcc\xaf\xe1\x69\x73\xa5\xf3\xea\x2a\x15\x4c\x35\xdc\x0e\x76\x04\xc6\x11\x53\x12\x11\x9f\x46\x2c\xa0\xb1\x1d\xb3\x6c\x14\x13\x99\x39\x70\x69\x8f\xc1\xa8\xd0\x01\x83\x3e\xa5\x23\xe6\x51\x38\x77\xe9\x33\xab\xd2\x57\x96\x00\xb8\xe7\x9d\x57\xbb\x5c\x7e\x26\x13\x68\xdb\xd3\x11\x37\x12\xe7\xd9\xa5\x3d\x3a\xa0\x40\x52\xc7\x4c\xee\x1b\x31\x9c\xed\xec\xe2\xb4\xde\x14\xd6\x25\xb1\x43\x27\x72\x59\xbc\xd0\xfb\xb0\x87\x9f\xc4\xd8\x6a\xa2\x3b\x1b\xe5\x5f\xd2\x9c\xdc\xd7\x67\x01\xf0\xb0\x22\xa4\x3e\xb1\xe4\x33\x24\xcb\x84\xb4\x1b\xdb\xb8\x7b\xe7\x8f\x13\x79\xc4\xc8\xe1\xde\xff\x57\x2e\x76\xc6\x7b\x57\xb8\x8e\x4b\xf5\x54\x83\xdd\x01\x97\x8c\x1d\xee\x70\x9c\x6d\x30\xd7\x4a\x25\x01\x4d\x0b\xcb\x7e\x19\x5e\x11\xe1\x20\x5b\x65\x42\x0f\x36\xea\xd2\x0d\x8f\xb8\x0a\x53\xf8\xe7\x1f\x74\x9b\x54\x6a\xb9\xb1\x79\x7a\x5f\x79\xc0\x58\xef\x28\x73\xa9\xc9\xf8\x7c\xbe\x8e\xc3\x3c\x9f\x87\x1c\xff\xf0\x1d\x38\x43\xbf\xf9\x5a\x5d\x46\xd4\x6f\x07\xdc\xfa\xbc\x0f\x85\x02\xe8\x36\xfd\xa1\x85\x9e\xb5\x81\x70\x09\x98\xf9\xd5\xf6\xbf\x79\x18\xef\xd5\xe0\x15\x8f\x6c\x19\x7e\xc5\x93\x8e\xa9\x85\xca\xbf\xb1\xbb\xb7\x7f\x70\x78\xd4\x38\x3e\x39\x3d\x3b\xbf\xf8\x7e\x79\x75\xdd\x6c\xdd\xdc\xfe\xb8\xfb\x79\xff\xc0\x3d\x3f\x10\x61\xd4\xee\x3c\xc6\x49\xb7\xd7\x1f\x3c\x0d\x47\xe3\xc9\xf3\xcb\x74\xf6\x5a\xad\x6d\x7f\xf9\xe3\xeb\x9f\xff\xfa\xf7\x7f\x2a\xe6\x86\xb3\xef\xb9\x06\x46\x60\x0c\x36\x87\x47\x7c\xeb\xcf\x3f\x08\x29\xff\x3f\x0e\xf6\x7f\x00\xac\xcd\x25\x95\xfd\x67\x6d\x33\xe5\x61\xfe\x8f\x35\xc9\x7a\x38\x59\x7c\x42\xca\xad\x48\xe6\x4e\x8a\x94\x6d\xe1\x82\x75\x3a\x29\xbc\xee\x26\xbc\xf0\x7e\xb0\xf4\x7e\xb3\xf4\x7e\xbb\xf4\x3e\xdd\x2d\xbc\xf2\xeb\xc2\xeb\x65\x90\xd1\xcb\x40\x28\xe6\xbf\x35\x8a\x80\xfa\xca\x32\x52\x53\x97\x85\x3b\xe2\x93\xc2\xeb\x8f\x87\xc2\xeb\xde\x12\x4a\x5e\x11\x87\xfd\x84\xe7\x23\x60\xc9\x83\x74\x9a\xba\x0e\xa2\xc9\x9e\x26\x96\x27\xc3\x0e\x03\xa2\x38\x39\xe2\x74\x3a\xce\x5d\x52\x1d\xa4\xa7\x0e\xe6\xbb\x88\x52\x5f\x5d\x7d\xae\x2d\x3a\x2f\x44\x4a\x7f\x1f\x0c\x79\xea\xc3\xf4\x21\x1f\xf0\xec\xb9\xcf\x99\x6f\x73\xc6\x58\xef\xa4\x54\x32\x94\xa5\xae\x79\x21\xe8\x35\xa1\xd3\xdc\xdb\xae\xba\x8b\x7c\x90\x41\xc6\x7e\x9e\x9b\xa1\x30\x5f\xee\x74\x06\xd8\x69\xd9\x01\x52\xec\xcb\xa6\x56\x1a\x81\x34\x4c\x99\x60\x3e\xc7\x20\x2e\xc3\xfe\xb8\x3f\x9e\x0d\xc4\x65\x98\x03\x43\xec\x3b\xb3\xd5\x5d\x52\xb2\xcb\x45\xe2\x7a\x48\x4d\x99\x46\x47\xdc\x51\xad\x47\x71\xdd\x3a\xcf\xfb\x94\x5c\x0b\x86\xfc\x65\x6d\xd8\x9f\x8c\x3b\x3d\xb1\x16\xf6\x87\x6b\x1b\x2a\x86\x65\x84\x0e\xda\x75\x6b\x30\xbc\x47\x6a\xa5\x00\x38\xe4\x5d\x94\x9a\x0f\x7d\xa0\x3d\x5a\xe2\x43\xe7\x3d\x17\x05\xe7\x3d\x29\x51\x71\x21\xcc\x69\xe6\x1e\x2d\x47\x6b\x1d\xe5\xb3\xcc\xf2\x59\x3e\xdd\x99\xb3\xa8\x70\x4c\x0d\xb2\x01\xe0\x45\x7f\x94\x40\x80\x3e\x16\xf2\xb6\x7e\x95\x77\xe9\x2e\xd2\x9f\x7e\x98\x77\xef\x65\xc9\xe8\x37\xf9\x30\x6f\xde\xb1\xd0\x32\x0d\xc3\x82\xf9\xfc\x6d\x61\x1f\xa1\xdf\x09\xe9\xa6\x27\x05\x9a\x52\xee\x3f\x7a\x06\x9a\x2b\xcd\xe7\x02\xfe\x90\xf9\xfc\xda\xe6\xe6\xa5\x80\x03\xdd\x67\xd7\x3d\xc3\x33\xc3\x4e\x92\x5c\x0e\xb8\xdf\x19\xa7\xe2\x23\xbf\x54\xe2\xe6\x7e\x5b\x66\x42\x10\x9f\x3d\x04\xf1\xd9\x73\x0b\x79\xa4\xab\x28\x8f\x5d\x02\xa0\xd1\x78\xd8\x8f\x05\x4a\x3c\x73\x71\x34\xb8\xd9\x8d\xf3\xbc\xff\x24\x49\x16\x40\x33\x2c\xf9\x76\x9a\x16\xfa\x56\xcd\x0b\x25\xc2\x7d\xe8\x3b\x53\x54\x2c\x5e\xee\xc9\x4f\x77\x66\x37\x7e\x4f\xac\x5e\x88\x3c\x2e\x7a\xd9\x2e\x81\x1b\xec\xf2\x15\xa3\xb8\xda\xac\x7e\xf5\x88\xef\xb7\x57\x56\x9d\xeb\x4f\xc6\x8b\x65\xda\x1f\xd8\x9a\x3f\xf4\x9d\xe3\xd7\xf7\xbe\x9b\x71\xa1\x06\xcb\x2a\xed\xaa\x04\x3a\x54\x78\x5f\xc4\xbe\x33\xa7\xe1\x87\x92\x5a\x5d\x96\x0f\xfd\xa5\x4f\xf6\x6a\xa7\xc1\x63\xcd\xd8\x86\x53\x03\x96\x53\xae\xba\xdc\x82\x3b\x56\x0b\x0e\x79\xe5\x8f\x32\x4d\x96\xac\xa5\xa1\xaf\xfc\xfe\xb0\x27\x86\x23\xd8\x44\x7d\x73\x08\xab\xd9\x37\x87\x33\xe6\xe5\x88\xff\x67\x5d\x0c\x0b\xb4\x39\x7a\x89\x58\xb5\xea\x5f\x0a\x19\x9f\xdf\x65\x44\x1d\xc8\x23\xce\xde\xfc\xce\xd0\x4f\x84\xb5\x82\x58\x4d\xb7\x5d\xa7\xbf\xeb\x1a\xdc\x39\x7f\x75\x81\xd6\xa5\xdc\x9c\xd1\x37\x18\x57\x8b\xa3\x6b\x32\xb2\xa0\xd0\xfb\xbf\x04\x61\x26\x13\x43\x97\xe5\xe6\x31\xd0\x80\xe7\x1e\x86\x12\x1b\x0a\x7f\xfc\xeb\xda\x1b\x30\x19\x74\x59\x6d\xad\x8b\x65\x81\xb6\xff\x75\xd9\x97\x42\xd9\x4e\x80\xe5\x72\x23\x7a\xd2\x4c\x27\x6b\x37\xca\xe2\x1a\xa4\x86\xfc\xf1\x17\x56\x5d\x9c\x34\x7f\x1d\xd0\xf8\x91\x2f\x6c\x99\xe7\xfc\xee\xa3\x3c\xdd\x48\xe7\x79\x17\xcb\x30\x53\xc6\x3d\x6a\x1a\x87\x4d\x14\xb4\x1c\x34\x8d\x56\x83\xf2\xf9\xfc\x54\x4b\x87\xbc\xf9\x7c\x76\x40\x30\x36\x2c\x90\xcd\xb0\xdd\x6f\x33\x21\x9f\x66\xdb\xda\xbd\x43\x37\x52\xf1\x98\x32\x29\x71\xda\xd6\xb3\xe6\xf2\x02\xf0\x8a\x35\x1e\x9e\x40\x2d\xa7\x4d\x8c\x14\x29\xab\x0b\x08\x15\xc4\x9c\x45\x46\x48\xcc\xfb\x47\x23\x82\xaa\x65\x1d\x5e\x4e\x01\x53\x36\xcc\x9b\xfc\xa6\x61\xba\x9e\xdb\xd1\x8a\x96\x11\xf3\x6a\x88\xa1\x3e\xb3\x1a\x3f\x6c\x52\xb6\x1e\x4e\x9b\x45\xcb\xbd\x9b\x2b\xa3\xbd\x4f\xec\x1f\x57\x86\x47\xaf\xf7\xe9\xcf\x01\x2f\x73\x33\xfe\x02\x68\xc7\x5f\xca\xac\xb6\x4a\x69\xf4\xbc\x70\xcb\x2b\xe5\xd5\x8f\x81\x0b\xc7\x74\xea\xa2\x56\xaa\xa1\x8d\x50\x9f\xbc\x13\x1a\x1b\x93\x5e\x20\xc2\x4e\x4f\x04\x1b\x8c\x29\xad\xc3\x5c\xe8\x16\x27\xea\xf7\x23\x53\x06\xca\x31\xc3\xfe\xb0\xcb\xc7\xee\xda\x8d\xe8\x0e\x12\x3e\x16\x6b\x43\xf1\x34\xe9\x0c\x45\xb0\x91\x05\xd1\x93\x52\x83\xff\x31\x9c\xea\x7f\x2b\xff\x5d\xfb\x6f\xd9\xdd\x24\xc6\x7f\x83\x32\xa9\x1b\xff\x35\xf1\x81\xd4\x0d\xe7\x7f\x46\x61\xd0\x99\xb8\x64\x2b\x2a\xba\xc5\x0c\xb4\x23\x5f\x3a\x92\xb4\x0b\x63\x07\x9a\x47\x58\x3b\x10\x4a\x73\xf9\x37\xd8\x4f\x7e\x83\xfd\xf7\xfe\x78\x4d\xf4\xfa\x93\xa8\xbd\x96\x76\x0a\x70\xd0\xa9\x0f\xdf\xaa\xcb\x26\xba\x3d\x17\x4d\xa7\x27\x05\xfe\xd2\x5f\x5e\xda\x8b\x0b\x22\x43\xb5\x5f\x34\xd9\xdb\xc8\x2a\xce\x96\x74\xbd\x84\x32\x1e\xa2\xcf\xd8\xe5\x7c\xce\x9d\x53\xf7\x1b\xf3\xeb\xdc\xe2\xac\x52\xdb\x91\xfa\x9c\x37\x82\x56\x49\x9d\x97\x8f\x3b\xc6\x48\x50\xbf\x02\x99\x88\x55\x78\x2b\xf3\x05\x0d\xad\xf7\xf3\x91\xbc\x05\x2a\x50\x38\xb1\x43\x6e\x08\x32\x9f\x0b\xac\xc8\x80\xf4\x29\x86\x39\x95\x57\xdf\xa1\x1d\xb2\xea\x37\x5e\xbf\x11\x56\x75\x47\x29\x92\x5e\x0b\x52\xbf\xce\xbd\x8f\x04\xa9\x8f\x84\x75\x69\x57\x77\x30\x3e\x42\xc0\xc2\x72\x80\x7d\xac\x1a\x11\x48\xf4\xf5\x68\x04\x76\xc0\xb0\xd6\xba\x54\xed\xe5\x2a\xa4\x8d\x95\xbe\x4a\x0c\x6c\xce\xfc\x0a\x94\xad\x84\xc0\xcb\xa6\xf5\xc9\x86\x63\x2d\xaa\xf1\x1c\x85\xb7\x69\x86\x9f\x98\xe1\xa7\xb0\x46\x82\x42\xb6\xe3\x0e\x5a\xa2\x96\x83\x5c\xc0\x46\x1a\xac\xe8\x17\xad\xfc\x98\x8e\xa0\x19\x1a\x31\x1c\x21\xb5\x2a\x51\x79\xaa\x2a\xcf\x62\x61\x5f\x34\xcd\x0e\xbb\x68\x9a\x01\x3c\x4d\xe4\x53\xba\x9e\xbe\xe7\xd7\x93\xed\x33\xaf\xe3\x4c\x7d\xd7\xf9\xee\xbb\xb6\xcf\x76\x3b\xd8\x2f\xc6\xa8\x6b\xf8\x04\x43\x37\xa0\xc3\x84\x75\xf6\x3c\xaa\xdf\x45\xd6\x73\xea\xb2\xfa\xbc\x69\xdc\x25\x9c\xfa\x74\xc9\x7d\xc3\x54\x1f\x6c\x9d\x50\x19\xea\x7b\xce\xa9\xbb\x8e\x01\xdf\xb3\x39\xec\xf7\x93\xfe\x70\xd4\xf2\x79\x22\xd6\x78\x2f\x58\x7b\xe6\xc9\x44\xa8\xf7\x7c\x40\x2b\x1d\xb5\x29\x11\xbd\x08\x3d\xc1\xa7\x91\x9a\x50\x79\xf8\x23\x90\x08\x42\x7b\xff\x12\x53\xee\x8f\x93\x19\xc6\x83\x52\xc2\xa5\xb5\x97\xb6\xe8\xad\xf5\xfa\xb2\x5e\x59\xa6\x33\x5a\x1b\x0c\xfb\xcf\x9d\x00\x57\x3e\x6e\x6d\x77\xa9\xdb\x97\xe4\x99\xdd\x7c\x10\x5d\x75\xbf\x6b\x70\x62\xf6\x83\x85\x14\x4f\xcc\x8e\x38\x73\xc2\x3d\x7a\xb3\xeb\xd2\x57\x78\x16\x7b\x54\xbe\xe6\xb6\xc5\xcb\x66\xda\x47\xeb\xdc\xbc\x4b\x0d\x86\xb8\x99\x3c\x3b\x55\x64\x5e\xbc\x6f\x0c\xbe\x38\xf8\x83\x91\x45\x0a\x99\xf0\x07\x93\x31\xf3\x8e\xcc\x5c\x75\x97\x21\xc9\x4d\x33\x7e\x34\xe0\x3b\x55\xe1\x63\x77\xb2\x19\x8f\xf9\x7c\x57\xe9\x7f\x54\xfc\xca\x36\xf5\xe1\x4f\xba\x13\xff\xec\x1a\x2a\x0f\xc5\xbf\x81\x4b\x0d\xaf\x82\xb5\x05\x2e\xd9\x42\xb8\x8e\xef\xa6\x29\x24\x47\x0d\xed\xea\xb9\xe0\x95\x4a\x55\x39\x5e\xf5\x9a\x8c\x5d\x5b\x2a\x19\x1e\x73\x66\x47\x78\x85\xe2\x39\x55\xd7\x25\x96\x07\x6b\xf4\x0b\xc3\xa9\x52\x7f\x3d\xe2\xd6\xec\x88\x4b\x3e\x6e\x3e\xdf\xfe\xc6\xb3\x88\xb7\x6f\x72\xba\xa0\x83\x78\x2a\xbe\x58\xce\x65\xc7\xf0\x88\xbb\xb0\xb5\x6b\x9b\x2a\xc6\x7d\x71\xb8\xec\x21\x2a\x58\x50\xf1\x95\xb5\x99\x58\x82\x01\x0d\xca\x83\xe8\x84\xc6\xb6\x44\x81\x48\x81\x15\x4a\xf7\xc4\x96\x21\xe3\xbb\xe8\x28\xfc\x9e\x8e\x4e\x87\xd1\xf2\xfd\x72\xb0\x29\xf4\x12\xd6\x90\x39\xc0\xf5\x16\x79\xd1\x70\x91\xa8\x44\xf4\x03\xc6\xcd\x96\x71\x34\x92\x0e\x2a\x82\x52\xa9\x8a\x91\xef\xc8\x1b\xea\x82\x61\x47\x05\xcc\x51\x96\x07\xd0\x4d\xe8\xf9\x44\xf2\xbf\x01\x86\x5a\xc1\x5b\x54\xe6\x39\x33\x97\x50\x9d\x1e\xc8\x96\xe3\x47\xf5\xcc\x3c\x53\xf4\x02\x92\x0b\x2f\x83\xb7\xaf\x7a\xfd\x34\x00\x03\x68\xb1\xcf\x6a\xb6\x2f\xa3\xef\xf9\xe5\x72\x8e\xdb\x0e\x1c\x7f\x29\x3b\x20\xec\xf8\xee\x4e\xe0\xf8\x30\x3f\x8b\x4b\x71\x77\xda\x19\x99\xb2\x2b\xd2\x25\xcd\xd7\xba\xfd\x5e\x7f\xdc\xef\x75\x7c\x9e\x24\xb3\xb5\x4e\xcf\x1f\x0a\x8e\xc1\xfe\x47\x62\xd8\x11\x70\x64\x2d\x7c\x16\x2c\x72\xae\x32\xbe\xc3\x2e\x78\x38\xe2\xd0\xf3\xf8\x7c\xa0\xaa\x96\x4c\x5b\xa0\x83\xe8\x8a\x52\x29\xf8\x26\x56\x21\xd1\xed\xf4\x7e\x00\x1e\x6b\xc6\x46\x39\x28\x6f\x90\x0c\x9d\xf1\x5a\xb7\x8f\x3b\x45\x9a\x95\x4f\xd3\xac\x02\xed\x75\x8c\x80\xdd\x0b\xae\x22\x93\x92\x52\xc9\xf0\x61\x34\x66\x2e\x0d\xa0\x3b\x5d\xb2\x90\x03\x78\x7c\x48\x6c\xf9\xf4\x3a\x42\x35\x80\x4f\x3e\xdb\x45\x15\x88\xa0\x70\x93\x0c\xdb\xa3\xef\x74\x67\x2e\xf5\x4d\xf1\x25\xbf\x71\x5e\x15\x55\x3d\x9d\x2b\xc8\xc3\x7e\x0a\x6e\xb4\x80\x25\xc5\xc8\x3b\xce\x93\x12\x6e\x1f\x09\x19\x05\xdf\xa7\x98\xd1\x79\xf5\x94\x7f\x9c\x80\x0a\xc6\x9d\xd1\xae\x8b\x21\x52\x1a\x82\x23\x56\x87\x82\x6b\xa7\xdb\xe6\xe7\x5d\x1a\x33\xee\xcc\x5e\x5d\x2a\x0d\x84\xae\x62\xc3\x77\xce\xd0\xf9\xe2\xe7\x00\xef\xdb\x85\x39\x2b\x1b\x51\x39\x71\x76\xdd\xad\x6d\xb2\x79\xfc\x68\x08\x73\x56\x09\xcd\x19\x8c\xc1\x2e\xbc\x4d\xe5\xf7\x61\xf6\x7d\x5a\x09\xcd\x29\xa9\xc8\x34\x1a\x38\x0d\xb7\x1c\xd3\xc0\xf1\x03\xb7\x12\x63\x2a\xf4\xcf\xee\xa3\xd1\xab\x48\xb0\x34\x30\xc7\xfd\x01\xe6\xb9\xf0\x65\x9e\x5d\xcc\x83\x0e\x1e\x62\x19\x5f\x68\x00\x9d\x35\x05\xcc\xce\x02\xb7\x5c\xd3\xda\xe1\x32\xe9\x73\x80\x5a\x57\x0f\x2a\x21\x30\xa7\xf0\x0a\xcf\xa8\xa4\x16\x98\xb3\xf2\xed\x2a\x5b\xe9\xeb\x54\x54\xa6\xb5\x30\xf7\x38\x06\x28\xe7\x66\x7f\x32\x06\x56\x89\x86\x88\xc5\xe0\x9c\x4a\xa5\xb2\xa3\xc4\x10\x66\xc8\x11\x61\xf3\x2b\x85\x67\x68\x58\xfa\x7c\xe1\x67\xcf\x0d\x78\x24\x34\x66\xc2\xfc\xfc\x68\x87\xc8\x2a\x47\x90\x5a\xa3\x11\x64\x24\x76\x68\x4e\xc3\x42\x52\xa5\x46\xf1\xdf\xbf\xab\x74\xfb\x5f\x55\xd4\x0f\x0d\xcd\x80\x63\x1e\x1a\x61\xad\xb5\xa5\x62\x32\x11\x8b\x41\x11\x59\x28\x5d\x13\x71\xa9\x04\x67\x81\x39\x63\x4c\xe3\x4d\xb2\x8b\x87\xaa\xfd\xe5\x5b\x62\x97\xcb\x09\xc1\x5a\x62\x27\x71\xcd\x29\xe0\x8f\x4f\x33\x40\x5f\xd7\x0f\xa3\xa7\x6a\x4b\x11\xc8\xa5\x29\x0c\xaa\xf4\x3f\x05\xac\xfd\xc0\xd5\x0d\x5b\x2e\x95\x6b\xee\x7f\xd0\x86\xea\x97\x88\x63\x7f\x01\xe2\x7f\x13\x69\xe9\x0b\xd8\x16\xcc\x81\x51\xf3\x7a\x86\x64\x83\x6f\xdb\xf4\x93\x14\xb1\x58\x9d\x3d\x3a\xe1\x56\x6d\x41\x68\x21\x87\x4c\xae\xd2\x7d\x61\x99\x7f\xfe\xea\xe3\x1f\x0b\xe2\xaa\x3b\x33\x81\xdb\x2a\xd0\x7e\x91\x5d\xa9\x44\x24\x66\x9e\x39\xe2\x46\x48\x85\x13\xb9\xc0\x26\x79\xe6\x61\xd7\x88\x69\x44\x23\x19\x8f\xf0\xf6\x04\x4b\xca\xe8\x7f\xdc\x79\xda\x75\x75\x04\x40\xa5\xfb\x03\xcb\x12\x52\x43\x97\x46\x2c\x36\x1b\x6d\x0c\x9a\x8f\x93\x13\x57\x3e\xec\x40\x34\x72\x8e\x5d\xa5\x23\xd4\x6a\x58\x11\x8b\x9c\xcf\xae\x1d\xb3\x18\xff\x38\x83\x5d\xb7\x54\xf2\xcc\xb6\x67\xe0\xb3\x9c\x90\x54\x3f\xc3\x98\xa5\x2f\x72\x69\xae\xc8\x25\xd7\x63\xbe\x48\x84\x2f\xde\x70\x32\x6a\x53\x21\x4f\x09\x18\x91\x64\x27\x76\x9e\x67\xd8\x8a\x44\xab\x71\xf7\x58\x84\x69\x89\x4b\x07\x2c\x56\x8f\xb6\x6a\x60\x2f\xc3\xfd\x76\x64\x79\x66\x2b\x30\x7a\xce\x67\x57\xf2\xfd\xe6\xf4\x73\x7d\xa0\xf0\xb2\x06\x0a\xa7\x81\x46\xa1\x46\x77\x4f\xe1\x3f\xe6\x9f\xba\x54\x60\x81\x82\x3e\xd2\xcb\xa9\x85\x2d\x7f\x57\xf6\x93\x06\x5b\xc9\x7f\xc2\x66\xa6\x79\x00\x6e\xda\xc2\xc5\x42\x4e\xc7\xc8\xec\x04\xa5\x92\x11\xb1\xd3\x2b\xc3\x69\x1f\x50\x78\x77\x61\x60\xbd\x3e\xda\xf2\x16\xaa\x17\xa7\x6a\x34\xa8\x1c\x0d\xb5\xbb\x0e\xce\x69\x82\x9b\x40\x8c\x32\x30\x73\x5a\xa5\xea\x69\x56\x25\x34\xc1\xc9\xac\xbe\xd4\xd2\x2f\x35\xa8\x64\xc4\x8d\x84\x46\x19\x52\x72\xf7\xa7\x79\x56\x21\xe7\xae\x30\x6f\x2a\x32\x65\x7c\x3e\xaf\x2a\x87\x85\xcc\x9b\xcf\xab\x8b\x13\x6e\x34\x97\xcd\xbd\x72\xc7\x52\x53\xa9\xd6\x4e\xa5\xd0\x7b\x56\x30\x80\x69\xe5\x98\x78\xf4\x99\x79\xf2\x4e\x76\x1b\xc8\x43\xa7\x8e\xbf\xd6\xdb\xd4\xaa\xd2\x99\x55\x5d\x50\xc1\xc6\xe7\x86\x67\x4e\xcb\x81\x39\xa5\x40\x33\x51\x6e\x9e\xa1\x10\x16\xd3\x67\xe5\x00\x05\x4e\x1e\x77\x66\x48\x60\x9e\xfa\xb9\x5b\xbf\x99\x0b\xdb\x80\xe8\x05\xf3\xb9\x87\x2f\x48\xc1\x60\xbc\x59\x4b\x6d\xcb\x90\x4e\x31\x0f\xc5\x8f\x14\x4a\x11\xf4\xc2\xd0\x02\x7a\xfd\xb1\x93\xc2\x7b\xe8\x1a\x05\x46\x65\x5f\x13\x63\xda\x60\x43\xb2\x78\x95\xfc\x55\xfc\x81\xbe\x4f\x54\xa4\xfa\x7c\xbe\xee\x29\xfa\x51\x05\xcc\x0c\x98\x3f\x9f\xef\x1f\xa5\xa2\xd3\x9f\x8f\xef\xe2\xb4\xcb\x83\xd7\x03\x2a\x5b\x15\xf5\x3b\x06\xba\xe4\x98\xcf\xcd\xea\xd7\x6f\x2c\x40\xb5\xd2\x45\xae\xde\xc3\x42\xbd\x55\xc6\xb8\x39\x9d\xcf\xab\xd0\x03\x53\x4d\xbf\xca\x3e\x56\x1f\x4b\x25\xf9\xb1\x5e\xb5\x64\x42\x9d\x9b\x33\xcb\x33\x67\x64\xd3\xdf\xfa\x73\x61\xfb\xcc\xc7\x68\x6f\xdd\x4e\x4f\x79\x9a\xe5\xe6\x94\x28\x87\xb8\x00\x14\x86\xc4\xe0\xe6\x6c\x8b\x9b\xd3\xb2\x67\xce\xb6\x20\x71\x6b\x5b\x37\xab\xba\x03\x30\xdf\xa6\x96\x4f\x67\x96\xbf\xe9\x2d\x60\x8c\x2b\xf0\x52\x81\xb7\xdc\x6d\x46\x86\xb9\x9a\x17\x66\x12\xc9\xe3\xd5\x93\x4f\x8a\x0e\x0f\xb0\x3d\xa9\x1c\x04\xc6\x73\xff\xdc\xa8\x62\xc8\x50\xa6\x2c\xc2\xb7\x90\xd3\x3e\x38\x37\x54\xf8\x31\xf4\x4b\x57\xdb\x82\xbd\x35\x97\x00\x34\x2d\xc7\x27\x7f\xeb\xcf\x9c\x18\x2a\xa3\xbb\x6f\x0a\xca\x72\x3e\xf3\xeb\x87\x47\xdc\x3a\x3a\xca\x2b\x55\x60\x18\xf7\xaa\x1d\xc9\x28\xb1\xe5\xb2\xd6\x14\xa6\x89\x2d\xea\x46\xcc\x1a\xd8\xb0\x88\xd6\x60\x6b\x4f\xd2\xd7\x0a\xbc\x13\xcb\x88\x59\x50\x37\xa2\x72\x8d\xfc\x0f\x94\xb7\xa2\x72\x8d\x26\x90\x04\x6f\xe5\xa8\x92\xa6\xc3\x91\x98\x9e\x75\xf2\x21\xd1\x0f\xdc\x89\xdc\xec\x39\xc9\x3d\xc7\x2e\xa0\xe0\x1b\x87\xd0\x15\x91\x4b\xe1\x2b\xa1\xf8\x16\xc3\x5b\x04\xbb\x12\xa1\x18\x54\xde\xd1\x99\x62\x42\x0f\xd2\x47\x57\xc5\x21\x97\xb5\xd4\x65\x4e\x78\x94\x1d\x49\xb3\x47\x97\x58\xf8\x55\x3a\x4a\xd4\x32\x9f\x6c\x84\x1b\xef\xef\xd8\xbd\xb2\x8f\x3d\x29\xdd\x45\x18\xa2\x8c\xec\x13\xb6\x98\xd8\x02\x2f\x56\xaa\x3b\x40\xa0\x0b\xd9\xbb\x29\x53\x01\xd8\x88\x94\x67\x15\xb6\x28\x33\xdf\x5e\x05\x65\x91\xbf\x90\xc9\x06\xf6\x36\x25\xe5\x7c\x58\x87\x7a\x49\xde\x17\x58\xf5\x6c\x89\xc3\xa2\xfb\xc6\x53\x2d\x51\x34\xb7\xa9\x4b\xbe\x0e\x96\x4d\x50\xaf\x5a\x9e\x13\xb8\xc8\xce\xee\xf0\x8a\xe7\x04\x95\x1a\xbc\xd5\x03\x2b\xa8\xd4\x72\x37\x08\x4b\x93\xdc\x0e\x70\x3a\xdb\x0a\x09\x64\xb1\x25\x93\xcb\x77\x18\x32\x96\xba\x89\x3e\x53\x28\x07\x84\x3a\xd2\x31\x8f\x13\xb8\x92\xfd\x16\x4c\xa2\x52\xf1\x69\x28\x4b\x01\x6f\x0a\x3b\x87\x80\x4c\x34\x66\x61\x25\x42\x0d\xd9\xb1\x6b\x18\xbc\x12\x92\xad\x18\x29\x8b\x4a\x58\x49\x36\x63\x5b\xc0\xe6\xfc\xf8\x68\x78\x40\x26\xbc\x17\x54\x38\xdc\x09\xdc\x4a\xe4\x2e\xa0\x0c\x62\x21\x68\xea\xaf\xc3\x91\x55\x97\x93\x4d\xbf\xcc\x69\x58\x4e\x36\xe3\xb2\x70\xb8\x0b\x1c\x67\xd6\xee\x1f\x69\x77\x67\xd6\x5c\x8e\xab\x38\x62\x8e\xec\x70\xe0\x08\xe0\x45\xcf\xe1\xa4\x12\xb9\x93\x2a\x93\xe8\x17\x0c\xf5\xd4\x24\x00\xbe\xab\x8e\xbf\x16\x87\x3d\x2a\x37\xc4\xa7\xf9\xe9\xe6\x2b\xe9\x94\xcf\xaa\xc4\x46\xc5\x23\x25\x18\x84\x89\xe6\x33\xaf\xe2\xdb\x59\xdc\xf7\x2a\x0d\x59\x75\x87\xf9\xf5\xaa\x14\x14\x44\xac\x4a\x63\x56\xa5\xd2\xad\x1b\xed\xc9\x5b\xef\x74\x4a\x4a\x8d\x79\x98\x8f\x80\x01\x1d\x31\xc4\x14\xa6\x67\x65\x40\x23\x16\x95\x07\x30\xb0\xd1\x0e\xf3\x89\xdc\x31\x44\xb9\x46\x27\x4c\xee\xa9\x7e\x25\xa2\x23\xa0\xfa\xa3\xf2\x84\xf6\xd8\xa0\x3c\xc1\xcc\xdf\xbc\x74\x6e\x7f\x63\x41\xfd\xed\xbe\x6f\x09\x9a\xf0\xd1\xd8\x4a\x68\xef\xdc\xf2\x2a\x46\x54\x19\x90\x85\xa5\x74\x53\x42\x79\xb6\x41\xb6\x50\x66\xeb\x41\x36\xbf\x12\x2f\x6c\x5d\x93\x87\x35\xd9\x51\x99\x4d\xec\x04\x2b\x12\xe5\xb2\x5a\x1e\xef\xe1\x47\xb9\xad\xf9\x2c\x9b\xb5\x1c\xcf\x71\xea\xcf\xe7\xaf\x8f\xc4\xee\x3e\x1a\x3c\x6f\xa0\xe7\xaf\x8e\x96\x0d\x33\x24\xa0\x21\x33\x70\x22\xf9\x64\x53\xa0\x20\x75\x87\x79\x04\xf8\xd5\xc0\xa5\x5e\x85\x85\xd2\x0a\xc6\x2f\x33\x6f\x4b\xd8\x18\xaa\x17\x48\xa4\x85\xc6\x70\x32\xe2\x96\x8f\xb8\xe5\x05\x23\x77\xef\xae\x8b\xf3\xc3\x8e\x32\x20\x51\xf0\x66\xe3\x31\x61\xf6\xce\x6d\x9f\x3d\xc2\x79\x5b\xa5\xc2\xbc\xef\xc3\xc1\x71\xdb\x31\xfc\xa5\x3b\xcb\xf4\x78\xef\xf2\x29\xa4\x98\x77\x28\x37\x5c\x50\x65\x86\x17\x42\x5f\xf8\xf4\xe4\x88\x13\xbb\xba\x13\x4a\x91\x4b\xe8\x84\x4a\x6a\x22\x4c\xe8\xcf\xac\x7b\xe4\x21\x11\xd8\x11\xf4\x8c\x60\x67\xc8\xe3\xaf\x14\x0c\x72\xa8\x29\x72\x81\xfa\x22\x1a\xe1\x62\x90\x56\x14\x1e\xc7\xe5\x32\x09\x9d\xd8\x2d\xab\x01\x16\xe6\x64\xc4\x29\x6c\xec\x69\x79\x7d\x66\x7a\x44\x76\xe6\xfb\x4d\xf9\x67\x41\x78\xa0\xba\xf3\xb9\xdf\x09\xd6\xaa\xea\x0f\xa1\x01\x7b\x5b\xd8\x0f\x45\xf2\xc4\xcb\xe2\xa6\xc6\x62\xa6\x4e\xa6\x00\x6b\x35\xe0\x0f\x73\x5c\x62\x7b\x18\xb5\xa1\x54\x82\x04\x94\x76\x39\x9e\x9b\x8b\xed\x19\xe4\x06\xf2\x3c\xbd\x81\x4d\xb5\xe3\x60\x84\xf4\x05\x03\xad\x01\x1a\xe9\x96\xe1\x4b\x21\x9a\x0e\x5f\x1d\xea\xc5\xe4\x08\x38\xd4\x4e\x5d\x42\xa3\x2c\x09\x83\x32\x63\x62\x28\x47\x1d\x2f\x82\x3b\x8f\x46\x40\xc3\xf4\x7c\xc8\x6d\x34\xf7\x4d\x25\x7f\x06\x82\x48\x4f\x9e\x2a\x06\x81\x93\xb2\xfc\x74\x30\x60\x96\xd6\xfe\xfc\xe6\xd9\xe5\xb2\x94\xc9\x6a\x52\x10\x35\xa2\x38\x21\x3b\xb5\xc3\xca\xbf\x36\x53\x20\x9e\xcd\x37\x59\xad\xaa\xeb\xac\xfd\x99\x55\xfa\x90\x23\x95\x05\x6e\x18\xd5\x6f\x59\xed\x9e\xd3\xf6\x5d\xa3\x4a\x3d\xe7\x2e\x70\x8d\x5b\x41\xf2\x38\xbc\xfb\x58\xae\x11\x0a\x4b\xd1\xdf\xe1\x28\x89\xf3\xca\xec\x45\x64\x17\x64\x69\x9d\x9f\x9b\x85\x89\x8e\xb6\xcf\x75\x87\x97\x6f\x45\xd9\x73\xad\x0f\x83\xf6\xe3\xf7\x3c\xd1\xc9\x5b\x4b\x17\x3d\xd5\x6f\xc0\x3a\x7c\xf3\xe5\xae\xc4\x1d\x0f\xce\xc2\xdc\x60\x5f\x64\x6b\x34\x6f\xec\xe4\xc0\x51\xc5\x5b\xc0\xaa\x54\x6a\x70\x08\xc4\xa5\x12\xde\x11\xbe\xf5\x6f\xad\x98\xc6\x5d\x2b\x36\xe3\x6e\xb9\x46\x9f\xce\xe1\x58\xa5\x83\x5b\xb9\x3f\x0f\xcf\xe5\xdf\x27\xf9\xbe\x20\xb6\xa1\xe1\x50\x51\xa9\x11\xf2\x31\x18\x2c\x97\x83\x23\x2a\xb5\x3c\x18\x3f\x87\x8e\x04\x14\xc2\x26\x56\xa9\xb9\xd4\x73\x44\xa5\xe6\xe6\x41\xfb\x00\xda\x37\xe3\x6e\x0e\x3f\x80\x97\x81\x05\x5a\x00\x77\xcd\x68\xf5\x56\xc3\xcd\xb8\x5b\xf1\xcc\xb8\x9b\xad\x91\xea\x4e\xe4\x9c\xba\xf5\xc8\xa9\xba\x16\x54\x82\x88\xc6\x5d\xab\xba\x0a\xfb\x42\x2f\xe4\xfa\xfb\xfb\x32\x6d\xed\xcf\xe7\xab\x11\x60\xcc\x03\x9a\xdf\x71\x97\x8e\x43\x2e\x23\x26\x33\x15\x32\x19\x16\x1a\x83\x9f\xf9\x3c\x97\x55\x9e\x93\x28\xe0\x8e\x76\x58\x8c\x3b\x1d\x64\x82\xed\x20\x1b\x72\x41\x23\x1a\x90\x05\x9a\x74\x78\xf0\x13\x33\xdf\x09\x5d\x27\x76\x95\x14\x19\x46\xc7\x8e\x6d\xa2\xa8\x5d\xf3\xe9\xbc\x54\x02\x7a\xd5\x7c\x3a\x77\x59\x6c\x0e\x6e\x89\x56\x31\x36\x87\xf0\xc9\x73\xe0\x01\x3e\x3d\xdd\xc2\x49\x1a\x9b\x7d\x2d\xbe\x7b\x83\x11\xa1\x97\xff\xb6\x38\xbd\xfa\x77\xf1\xe4\xb8\xcc\xfa\x24\x4d\x0b\x72\xbc\x93\x3c\x59\xfd\x6c\xfd\xa3\x1f\x64\xa6\x48\x2d\x79\xbb\x95\xdb\x1f\xb4\x21\x6c\x28\x19\xb4\x9c\xac\x3c\xcd\x51\xae\xd9\x9e\xfc\x8e\x71\x6e\x72\xa7\x12\x63\x5e\xdd\xd7\x57\x85\x95\x80\xec\xb0\x8c\xa7\xac\xfb\x96\x5f\xae\x2d\x52\x2e\x12\xb9\x1f\x1c\x0f\xf9\xe4\x65\xb7\x1b\xf2\x84\xcb\x06\x0e\xd5\x67\xf1\xa8\xa6\x11\x9c\xcd\x14\x78\x12\x7f\x47\x96\x8d\xe4\x4d\x04\x91\xef\xa5\x92\x11\x33\x98\xdb\x3e\x9a\x58\x29\x22\xd4\x48\x10\xdf\x08\xd2\x74\x3e\xfd\x2d\x66\x2c\xa9\x1b\xa8\x7e\x2b\xef\x2d\xac\x98\xfa\x87\x96\x4f\x83\x43\x2b\x5a\x10\xea\x97\xcb\x14\x26\x80\x95\x56\xa0\xfc\x52\xcd\xe7\x91\xc4\x7a\x3e\x8f\x77\x12\xf2\x11\x0c\xb9\x04\x01\x0c\xb1\x52\x7c\x24\x88\x04\xef\x90\x65\x33\x92\x9d\x98\x00\xd9\x9f\x83\x91\x00\x0c\x79\x45\x22\x51\x01\x34\xec\x4f\x52\xc8\x24\x97\x8c\xa4\xe0\x1e\x0c\x91\xad\x43\x9f\xbc\xa9\x21\x37\xfd\xc3\x3a\xfc\xb0\xc0\xf0\x9d\x7e\xe0\x52\x4e\x7b\xc4\xea\xe1\x07\x5b\xe7\x09\x20\x4f\x90\xe5\xf1\xe8\x80\x58\x03\xfc\xb0\xc8\xf9\x3b\x4b\xa7\x96\xd7\x5a\xe1\x67\x93\x13\x18\xd6\xcf\x1d\xb4\x63\xd2\xe2\x01\x7d\x81\xb6\x5e\xcd\x4a\x5f\xe5\x69\xd9\x6c\x80\x6b\xa8\x1e\x5d\x3b\xfc\xf2\x2d\x44\x71\xa0\xda\x47\xaf\xb3\xb5\x06\xeb\x21\x7b\xad\x02\x03\x7a\xa0\x18\xd0\x00\xbe\xc9\x97\x58\xd1\x4a\x49\xa9\x14\x4b\x4a\xc1\xe6\x2c\xb2\xc5\x26\x33\xff\xf3\x9f\xc5\x7b\x1d\xa4\xeb\xf7\x9c\xdc\xdb\xc2\x6e\x15\x24\x18\xa8\x87\x92\x51\x2d\x21\x95\x82\x3f\x4f\x0b\xfd\xe4\x70\xe0\xb1\x95\xb8\x24\xc3\xc8\x37\x62\xda\x23\xb6\x90\x5a\xe8\xb9\xae\xcc\x96\xae\xdf\xca\xad\xd3\xec\x0a\xbe\x65\xb4\xe0\xc8\x7a\xec\x00\x4b\xab\xef\x25\x6b\x6a\x53\xa9\xaa\x89\x8f\x07\x62\x4e\xa9\x1b\x26\xfc\x5b\x20\xe9\x82\xa0\x5c\xa3\x3e\x10\x83\x41\xcb\x08\xd4\x95\xa7\xdc\x69\xb2\x55\x0c\x2c\x9b\xbf\xe0\x69\x81\x8c\x98\x91\x03\x9c\x75\x92\x4a\x78\xcb\x2e\x52\x0b\xd4\x5e\x6e\xd7\x4d\xf0\x9b\x39\x45\xd7\x37\x4b\xb7\xac\x8e\xef\x9a\x33\xdd\x18\xc3\x87\x0a\x53\x31\x48\xa0\xae\x1b\xf3\xab\x1f\x09\xea\x4a\xcd\xb5\x03\xa4\xac\x35\x76\x7b\xe7\xa8\xa3\xb3\x7b\x6e\xf8\xe6\x94\xfa\xe6\x8c\x06\xe6\x94\x06\xe6\x8c\x50\xc3\xab\xf8\xe6\x94\x6c\x19\x81\x39\xc5\x27\x62\xce\xf2\xf2\x41\xf4\x4b\xa5\xb6\xd3\x34\x5e\xf1\x2a\xe5\x2c\xbe\xa0\x9d\xde\xb3\x18\x8e\x56\x6a\x8c\xf1\x45\x8e\xa3\x68\xe5\xcd\x5a\x6f\x64\xac\xb2\x5f\x56\x21\x3b\xe0\x16\x23\x1a\xad\xa6\x4a\x9c\xc1\x93\xbb\x58\xda\x55\x59\x50\xe7\x56\xe0\xf0\xa1\x5b\x86\x7d\x15\xb2\x90\xcd\xc0\x3c\x3a\x5c\x8d\xe9\xdf\xa8\x84\x0f\x57\x57\x02\x03\x62\x1e\x1d\xd6\xb1\x0e\x0b\x7f\x65\x95\x7c\xe8\x92\x2d\xac\x32\x7f\xf8\xc8\x26\xbf\x65\x34\x9c\xe3\x02\xc5\x46\x65\xd8\x56\xcd\x17\xeb\x9b\xe2\xd4\x3f\x86\x00\xae\x3e\x34\xa3\x1e\xc7\x18\x57\x33\x34\x9c\x45\xe9\x65\xc2\xa2\x2d\x23\xac\xc4\xda\xfb\x1f\x4e\x8f\x75\x16\xd7\x8d\x80\xbd\x8d\xfa\x93\xa1\x0f\x7b\xeb\x98\x0f\x23\x31\xb6\xe2\xb2\x4f\x8f\x0e\xad\x64\x41\xa5\xa9\x30\x21\x96\x11\x30\x4f\xb1\xf2\x2e\x05\x74\x59\xa2\x6c\x65\x75\xe9\x30\x57\xba\x1c\x41\x79\xa0\x65\xfc\x32\x8b\x2a\xb2\xe2\x80\x85\x8b\xf7\x34\xe6\x6d\x76\xcc\x7a\x72\x11\x68\x80\x9e\x06\xe8\x01\xb0\xea\x62\x05\x77\x11\x32\xdf\xe0\x40\xcb\xfb\x39\xad\xb4\x70\x27\xaa\x57\x6a\x56\xf8\x2d\xaa\xd7\x2c\xe0\x90\xaa\x68\x4e\xe1\xb1\x8a\x57\xd9\xce\xe8\xa6\x6f\x5e\x46\x7d\xe6\x04\x11\x7f\x7b\x36\xb7\xcd\xa4\x1f\x19\x9c\x6c\xb5\x9d\xdb\x57\xf7\x97\x53\x5b\x1a\x95\xd4\xaa\xa8\x82\x98\x67\x4e\xf3\x12\x8b\x55\xb5\xe5\x04\x4c\xdf\x78\x5d\xd6\xe8\x6d\xe9\x3a\x2d\x6f\xa7\xc2\xeb\x15\x99\x5c\xc9\xa5\x57\x57\x60\x93\x81\xaa\xee\x78\xf5\x14\x23\x8f\x6c\x72\x0b\xfa\xa2\x92\x26\x55\x64\xda\x62\x81\x5a\x27\x3f\x8f\x38\x7b\xfb\x3e\xe3\xd6\xd3\x09\xed\xce\xb8\x75\xdf\xa0\x7b\x33\x6e\x9d\x1d\xe7\x43\x1c\x2d\xd1\xf7\x40\x16\xf7\x0d\x4e\x7d\xfa\xf3\x88\x13\xa0\x50\x4e\xe4\xa0\xd5\xef\x1b\xd6\xd3\x49\x8e\x93\xca\x06\x7f\xc9\x4a\xfd\xe9\xc4\xd2\x6b\xea\xd1\xf0\x49\x1d\x77\x19\x0b\xb6\x05\x5f\x85\xdb\xbb\x6f\xe8\x1c\x38\x66\x32\xf1\xec\x58\x27\xde\xa1\x23\x12\x3b\x10\x21\x9f\x24\x63\x9d\x8a\x60\xf2\x6a\xa0\x0f\x72\x08\xbc\x8e\x33\x7d\x72\x8d\x82\x2d\xc1\xb0\xff\xb2\xc6\x6d\xe0\xe6\xb1\x23\xc2\x56\x4e\xcd\xe6\x33\x4e\x13\x69\x1c\xe0\x75\xcc\x0b\x31\x1a\xf1\x48\xec\xb7\x79\xaf\x27\x12\xbb\xa0\x66\xa7\xf5\xec\x78\xa9\x94\x4b\x5f\x4f\xd3\x3d\x5e\x2a\x79\xdc\x1c\xf4\x47\x63\x05\x06\xde\x9d\xdb\x27\x17\x3d\x70\xe6\x50\x92\xd5\x09\x8e\x9e\x9a\x86\x0d\x62\x37\x39\xba\xd8\xa0\xd7\xe8\x79\x75\xe8\xb3\x4b\x5b\x70\x27\xf2\x5d\x15\xc8\x42\x6e\x1d\xdc\x39\x9d\xb9\x94\x33\xcf\x39\x0f\x5c\x9b\x3b\x17\x4f\x32\x0a\x8d\x98\xb9\xc6\x25\xc6\xf3\x48\xc3\xd1\xf8\xec\x78\xc8\xcb\x6d\xe7\x18\x25\xb7\xb0\xe4\xa7\xbe\xeb\x1c\x3d\xb9\x8c\xb5\x27\xbc\x7e\x25\xac\x34\xa5\x7c\x10\xf1\x32\xbe\x99\xed\xfe\x68\x4c\x39\xfb\x69\xe4\xa7\x3e\x3a\x35\xb9\x98\xba\xb8\xd3\x70\xe7\xb3\x0b\xb4\xf2\x58\xfa\x6b\x19\x8e\x6b\x66\xbf\xd7\x95\xad\x35\xc8\x42\x39\xa5\xf0\xa0\xd1\xc6\x59\x9b\x53\x8e\x7e\x81\xb2\xdc\xa9\x75\x09\xbc\x6d\xb3\xb7\x5c\x67\x59\xb9\x0e\xf2\xf2\xbd\x88\x17\x5a\x8b\xc5\x62\x59\xf1\x31\xeb\xf9\x82\xfe\x28\xa7\x3e\x7b\x5b\xd0\x80\xf9\xb6\xb7\x8c\x22\xfb\x94\xab\xc4\x67\xbe\xf3\xa4\xf4\x9a\x38\xd0\x73\x11\xb7\xf1\x57\xd2\x8c\x30\xbf\xd2\x9d\x28\xd7\x1f\x07\xdc\x08\xe8\x5b\x10\x71\x8b\x2f\x90\x84\x40\x20\xb2\xaa\xed\x02\xde\x55\xa2\x65\x5a\x2b\xb1\x16\xbc\x54\x7a\x9c\x72\x20\x0f\xd5\x54\x98\xb5\x49\x7d\xf9\x98\xf2\x58\xf6\xd1\xbe\x1e\xe4\xa5\xd6\xe4\x0d\xdf\x65\xdc\x6a\xcf\x79\x14\x2e\xba\x6b\xf2\xd0\xf3\xaa\x6a\x82\x2d\x5b\xb3\x20\xb9\x09\xe5\x91\x45\x61\x73\x53\x6b\x86\xc3\x02\xc9\x3b\x56\x54\x64\x4d\xbb\x35\x9f\xf3\x06\x5e\xcb\xb4\xe6\x73\xa3\xdd\x32\x08\xed\xb4\xd8\x7a\x95\xd8\x8f\x2d\xbc\x06\x10\x2f\x6b\x5e\x43\x4a\x75\xe4\x12\x6b\xb7\x72\x7e\xfc\xa1\x28\x2a\xf9\x75\xcc\xab\x61\xbf\xdb\x19\xc1\xba\x48\x9f\xcd\xa1\x18\xf5\x93\x67\x91\x5b\x84\x4b\x5f\x0c\x62\xb7\x5b\xf9\xe5\xc3\x9d\x64\xd7\x35\xfc\x06\x6c\xc2\xa8\xeb\x57\xfc\xac\xc6\xb3\xc1\xed\x61\x07\x2a\x1d\x89\xf1\x49\xb7\x2b\x82\x0e\x1f\x0b\x52\x5f\x4a\x30\x38\xb1\x8c\x10\xda\x15\xb6\x18\x6e\x06\x84\x86\x2d\xf4\xef\x87\x2d\x81\x86\xd6\xe8\x63\x0b\x19\xe5\x94\x2c\xc5\x26\xc1\x99\x0e\x3d\x90\x8a\x86\x39\x7b\x6c\xd9\x2a\x6b\x4e\x6e\xe4\xc9\xf3\xdd\xd3\xe7\x3b\x10\x6e\x9e\x6b\x8f\x87\xb3\x37\xdf\x4c\x9e\xd1\x98\xc8\x77\x1e\x77\x5d\xed\x52\x2a\x20\x6f\xb0\x9b\xe1\xa4\xc7\xfa\x73\xcc\x85\xea\xe6\x37\xa5\x72\x98\x6a\xb9\x8f\xfc\xfe\x40\xb0\xbc\x4e\x74\xd0\x90\xc6\xd6\xe8\xbb\xad\x2d\x7a\x0c\xb5\xa2\x93\x5d\xd8\x39\xce\x5c\xf3\x73\xd4\xef\x47\x7f\xdd\xb4\x45\x8f\x7b\x89\x60\x79\x1e\x44\xc8\x92\xd2\x3c\x2a\xe5\x55\x00\x5f\xf5\xb2\xce\x97\x8a\x2b\xc4\xd3\xa3\x69\xbd\x96\x9f\x48\x71\x2b\x87\x73\x9f\xa9\x5b\xe7\x9f\x23\x26\xc5\x8e\xca\xaa\x4c\x85\x14\xbd\x0f\x72\xa6\x66\x17\x2d\x99\x78\x59\x63\x0a\x83\xcc\xb9\xa0\x8d\x1d\x57\x14\xab\x26\x2d\xc3\xa7\xdb\x68\x58\xf0\x2e\xf9\x0b\xc5\xe0\x15\x69\x17\x27\x2d\x69\x39\xf7\x05\x77\x97\xb8\x95\xf6\xd3\x47\x3a\xcd\x0d\x15\x27\x6a\xd8\x91\x1e\x03\xa5\x2c\xa6\x63\x78\xa4\xee\xc9\x17\x9f\x2c\x6c\xe8\xf6\xb8\x45\xec\xe6\xc0\x40\x98\x05\x44\xaa\xca\x20\xad\x5f\x2a\x45\x2d\x63\x69\xce\xca\xed\xab\x0b\x93\xcf\x8e\x1a\x69\xf0\x37\xb5\xa9\x16\x02\x56\x46\x8d\x4c\x83\x16\x2f\x73\xfb\x04\x8d\xab\xef\x83\xcc\x1a\xe5\x3e\x40\x41\x86\xf9\xdc\xcb\xdf\xc5\x54\xa9\x60\x15\xe4\x26\x69\x64\x47\x0c\x3e\x3b\xa1\x54\x31\xe9\x84\x46\xc4\x22\xf3\xbe\x05\x4f\x01\x30\xf5\x0c\x35\xa2\x05\x0b\x09\x95\x97\x73\xb5\x9d\x40\x71\x8d\xf2\x1d\x2a\xf7\xa1\x35\x78\x4d\x06\x58\xf9\xd4\x43\x1a\x13\x01\x27\xc2\x35\x04\xad\x11\xf4\x81\x81\x1f\x03\xfa\x05\x36\x09\xbd\x70\x13\x98\x19\x5f\x0a\xcc\x54\xa7\x91\x5a\xbd\x3c\xf7\x4a\x25\xf8\x45\xf6\x7f\x7b\x1d\x9a\x59\x2a\x7d\xc1\xbf\xf3\xf9\x23\x4e\x52\x1b\xbe\xcf\xe7\x06\xfc\x41\x41\x34\xe6\x47\xdb\x86\x1c\x79\x16\x36\xde\x73\xb1\xf7\x2d\x39\x66\x0f\x42\x8d\xe4\x67\xf5\xb0\xb0\x85\x79\xdf\x92\x3e\x7c\x72\x63\xc4\x81\xcb\x15\xe6\x83\xe0\xcc\xab\xe7\x65\x09\x7a\x56\x0a\x79\xa7\x15\xa0\x4d\xb4\x21\xf4\x4c\xeb\x91\xb7\xc8\xe8\x91\xc5\xc2\xe2\xb6\x30\x3f\x0b\xce\xfc\x7a\x9e\x96\xcb\x8a\xfb\xb2\xb8\x47\xec\x75\xbf\x63\x08\x52\x2a\x15\x3c\x1a\x76\x5b\xf5\xc8\xf0\x88\xb5\x12\x76\x04\x1b\xbc\x79\xdf\x82\xe5\xc3\x6d\xd9\x87\xd9\xdd\x1a\x7c\x51\x33\xbc\xe9\xaf\x08\x7b\x09\x6b\x52\x2f\x07\x5c\x3d\xb6\xcc\xdc\xfa\x5d\x66\x5c\x53\xb9\x79\x99\xb4\x96\x75\x12\xfa\x92\x80\x00\x9a\xc1\x63\x5f\xa8\x2f\x4d\x3c\x66\x03\x71\x38\x1c\xf6\x87\x46\x7b\xc0\x75\x14\x87\xd0\x80\x7d\xc7\x27\x30\xf2\x7d\x56\xb3\x7d\xdc\xe5\x39\x60\x4c\x39\xa0\x92\x59\xac\x2d\x80\x5d\xef\x40\x5e\xdd\x7b\x01\xc3\xec\x30\xe3\x87\xd2\xd9\x40\x8c\x7d\x90\xd3\x85\x59\xa8\x4e\x13\xc0\x9f\x00\x26\x62\xb1\xe0\xb0\x0b\xf9\x36\x54\xe8\xd9\x6a\x46\x7d\x59\x67\xde\x7c\xee\x17\xbb\x7e\x3e\x4f\x24\x3c\x92\xe3\x6d\xe3\xc6\x2a\xc1\xa2\x47\xde\x42\x38\x4e\xd8\x7a\x55\xe2\x8d\xae\x4e\xb3\xcd\x75\x29\x43\x53\x65\x90\x8d\x96\xbc\x90\xda\xeb\x7c\xb9\xc1\x09\xd8\xa0\x24\xee\x11\x79\x0b\x8c\x28\x8f\xc3\xa3\xda\xe5\xcd\xcb\x1a\x2e\x03\xd8\x29\xab\x14\x8e\x6e\x33\x9c\x40\x97\x91\xc5\x27\x39\x98\xe1\xa4\x40\x83\xe2\xe9\xa5\x76\x5e\x65\x47\x88\x2b\xcd\x2e\x78\xbe\x79\xee\xa5\xbb\xf3\xc7\xa7\x5a\x5b\x6f\x56\x70\xae\x49\xed\xa0\xbe\x8a\x2d\x32\x92\xbe\xe9\xe4\x06\x9e\xf7\x81\x9d\x5f\x91\x52\x9f\xda\x27\x1e\xac\x2e\x23\xc8\x79\xc9\x43\xdf\x77\xe6\x45\x0b\x95\xe3\xee\x03\x02\xcf\xd0\x3b\x1e\x2c\x24\x3c\x20\xb3\xa9\x97\xed\x1b\x90\xa7\x6a\x17\x37\x58\x48\x2d\x95\xba\x8d\xcc\x74\xd7\x23\x4a\x1d\xbf\xdb\xe0\xec\xe1\x88\xe7\xbc\xf9\xb6\xd0\x80\xb3\x93\x39\xa1\x45\xa7\xbd\x2d\x3a\xed\x10\x3b\xf4\x8c\x2e\xee\xeb\xfc\x90\xd8\x5b\x9b\x9f\xd6\xae\xfa\x43\x28\x35\x92\xc6\x08\x9d\xd1\x9a\xdf\x0f\xc4\x1a\x1f\x8a\xb5\x70\xd8\xef\xae\x5d\xf4\xfd\x76\xe7\xac\x33\xa6\x6b\x43\xe1\x8b\xce\xb3\x08\xd6\xbc\xd9\xa7\xb5\x9b\xb6\x58\xdb\x4f\xfa\xa3\xc9\x50\xac\xed\x4e\xc6\xed\xfe\x70\xb4\x06\x44\xe2\x10\x0d\x1a\x2e\x4e\x6e\xd6\x92\x8e\x2f\x7a\x23\x61\xae\xed\x26\xc9\x5a\x7f\xdc\x16\x43\x09\xb9\x33\x5a\xdb\xef\x0f\x66\xc3\x4e\xd4\x1e\x7f\x5a\xdb\xae\x56\xbf\x56\xb6\xab\xd5\xff\xac\x82\x28\xcb\x36\x21\xe7\x68\xad\x29\x23\x3d\x04\xe6\xa7\xcd\xad\x6c\xc5\xf6\xf2\x67\xb3\x1f\xa6\xf6\x73\xdf\xb3\x48\xb8\x77\x3e\x87\x15\x91\x9d\xca\x7b\x67\xca\xac\xfa\x20\x35\x10\x5f\x3a\xcc\xbd\x2f\xca\x71\xd2\x93\x9a\x47\xc3\xed\x34\xeb\xf0\x46\x53\x00\x85\xa3\x7e\xb0\xcd\xaa\x8b\x3b\xd6\x83\xbe\x85\xc3\xb3\x68\x51\xac\xfd\xca\x3f\x1c\x10\x55\x5f\x7e\x7d\xf6\x5a\x6a\x06\xff\x1c\x39\xdf\x91\x29\xd2\x5b\x8a\xaa\xa7\xe0\x2c\xff\x3e\x28\x58\xd6\xcb\x73\x92\x13\x0f\x8b\xaa\xed\x68\xcd\x33\x07\xdb\x95\x0a\xad\x7e\x63\xf0\x54\x2a\xc9\xaf\x6a\x36\x7f\x0f\x78\x5d\x3f\xe8\x49\x02\xdd\x24\x4f\x6a\x4b\x77\xc1\xba\x6a\xe7\xc3\xc1\x7c\xde\x57\x3b\x26\xea\xfb\xb5\x88\x8c\x5d\x12\xaf\xb6\x85\x95\x9d\xf5\xd4\xca\x79\x70\xce\x26\xe7\x53\x2b\xf3\x1d\x03\x03\x50\xb5\xd3\x4d\x6c\xef\x8c\xad\x7b\x76\x0f\x77\x84\xc5\xa7\x3b\xf3\x79\xb2\x2a\x06\xcf\xc3\x41\x2e\x0e\xa8\xf7\x45\x69\xc3\x03\x5e\xc3\x56\x3a\x7a\x48\xc0\xdd\x99\x51\xb8\xe2\x00\x78\x9e\x18\x24\xc5\x6e\xbd\x5a\xf4\x47\xdd\x6f\xa5\xa7\xb7\xca\x06\x2c\x60\xe1\x84\xef\xeb\x95\x3a\x92\x4d\xc1\xd5\xa8\x6e\xa0\x73\x4e\x42\x0a\xb9\xe4\x8a\x7d\x9f\x4b\x81\x90\x71\x28\x4c\x5f\xea\x2c\xe1\x3b\xd2\x02\x0f\x07\xa5\x92\xea\x8f\xbb\xd5\xc4\x9d\x52\x88\x57\xea\xdc\xc5\x03\xdf\x43\x4b\x33\x1b\xc8\x6a\x62\x8f\x54\x83\x83\xa2\x17\xac\xfc\x34\x1c\xb4\xea\xa1\x9c\x26\x96\x90\x11\x30\x34\xe9\x28\x8f\x32\xac\x51\x52\x88\xbd\x16\xb1\x71\xaa\x9b\xc9\xe3\x2a\x2f\x33\x05\xb8\xdd\xfc\x11\xfb\xd4\xc8\x2b\xc7\xfc\xe8\x18\xd0\xec\x55\x22\x4c\x20\x53\x9d\x9a\x8b\x06\x7b\xd9\x72\x4f\x49\x7b\x6e\x0e\x6f\x60\x73\x85\x2e\x92\x30\xf5\x22\x81\x2f\xd4\x67\xe3\x16\x70\x29\x7e\xa9\x64\x78\x1d\xc7\x7f\x72\x0d\xdf\xec\xf8\x84\xea\xa5\x03\x5f\xa1\x8b\x61\x39\x2f\x60\x73\x46\x97\x3f\xf7\x81\x5c\x37\x2a\x17\x6e\xda\xb9\x63\x03\xa6\x2a\x70\xe6\x30\xbf\x71\xb8\x4e\xdd\x52\x69\x9d\x9b\xc3\x6d\x3b\xd5\x21\x81\x64\xb4\x73\xa4\x21\x13\x40\x39\x46\x4c\x38\x68\xa1\x23\x9c\x6d\x3c\xe1\x43\x06\x73\xbd\x1e\x59\x61\x7a\xfe\xc7\x2c\x84\x85\x28\xe6\x73\x8e\x0b\xd1\x43\xdd\x1f\xbc\x30\xc2\x75\x01\x3f\x78\xf3\x05\x3b\x19\x37\x93\x47\x23\xc6\xc0\xe0\x3f\x47\xcc\x43\xaf\x45\x0d\x8e\x01\x93\x8c\x40\x9e\xca\xb0\x04\xab\xfa\xd4\x4d\x80\x62\x48\xa8\x5c\x60\x55\x2a\x7b\x0b\x55\x8c\x20\x8f\x24\x22\x3c\xb4\x74\x01\xca\x39\x66\x3f\x0d\x0e\x4b\x9b\x72\xe5\x60\x3a\xf7\x5e\x23\xd4\x2b\xee\x5c\x64\xd4\x32\x3c\xbc\x97\xa1\x1e\xee\x97\xeb\x55\xb5\x03\xe1\xa4\xc1\x0b\x1b\x1c\x04\x9c\xa0\x43\xc4\x93\x42\xef\x9b\x1d\xdf\x65\x1e\xc5\x11\x80\x97\xfc\x30\x8f\x1a\xbc\x68\x54\xdb\x6b\xd9\xfd\xd6\x52\x44\xcb\x34\xf7\xb0\x65\xe4\x8f\x3b\x38\xec\x86\xf2\xb0\x6b\x70\x63\x88\x87\xdd\xc6\x81\x08\xc5\x70\x28\x82\xb5\x36\x1f\xad\xf1\x64\x28\x78\x30\x5b\x0b\x95\x0d\x6c\xe8\xe9\x6c\xbb\xf2\xcb\x3e\x4f\x12\x11\x20\x89\xb7\x91\xd3\x12\x1e\xbc\xaf\x68\x90\x56\x34\x58\xaa\xe8\x85\x8f\xd6\x7c\xe8\xa6\x44\xd7\xa1\x72\xec\xab\xc4\x77\xe0\x87\xb2\xd5\xb8\x49\x75\xa4\xd1\xe2\x93\x6b\x28\xdf\xbe\xc7\xca\xc1\x17\xa1\x55\x25\x90\xba\x1d\x31\xbe\x18\x36\x90\x1b\x3e\x1e\xf1\x55\x91\x3e\x5a\x8e\x02\x06\xa7\x22\x6c\x93\xaa\xa0\x2d\xed\xc8\xc6\x2d\x96\x8f\x07\x3f\x6e\x14\x6c\xb7\xbc\xf9\x5c\xca\xa1\x9c\xf3\xc0\x9d\xcf\x05\x87\x29\x9c\x18\xcd\x10\x66\xf6\x5b\x27\xe4\x96\xa0\x49\x68\xc9\x3d\x6d\xa1\xec\x48\x7a\x2d\x63\xd2\xe0\x34\xc4\x48\x3d\xb0\xe9\x49\x55\xb4\x75\xe6\x9b\xe3\x4e\x57\xf4\x27\xe3\x7a\xfa\x64\x7d\x3d\xfc\x62\x57\x77\x12\x9c\xd8\x1e\x5f\x16\x7c\x4e\x5a\x86\x40\xdb\x89\x7e\xcb\x88\xf0\xe0\x79\x6e\x19\x35\x7a\x34\xe0\x65\x20\x0b\x69\x42\x68\x68\x26\x21\x4c\xff\xf1\xc0\x10\xf4\x7a\x90\xbf\x25\x25\x6f\xc2\xb9\x79\x42\xbf\x4b\x37\x4f\xee\x3a\xdb\x7d\xe1\xe9\x73\x7b\x34\x9f\x1b\x08\xde\x37\x6f\x02\x3e\x9f\xaf\xd7\x68\x4c\x68\x04\xe7\x85\x54\x0a\x25\x0b\x02\x0c\x49\xbf\x27\x60\x90\xd8\x7b\xac\x68\x5c\xc4\xab\x4a\x5f\xfa\x12\x2f\xfb\x73\x6c\x08\xfa\x36\x9e\x0d\x84\x75\xdc\xa6\x7e\x9b\x0f\x47\x62\x6c\x9d\x0d\x38\x1d\x0d\x7d\x14\xba\x3d\x37\x80\xf8\x93\x8e\xca\xf5\x7c\x8e\x72\xd3\xff\x45\x1d\x42\x5e\xc7\xf4\x25\x45\xf4\xd7\xb3\x18\x76\xc2\x8e\xcf\xe1\xfb\x7c\x6e\x7c\xf0\x85\xbd\x2d\xb4\xfc\xf4\x83\x1c\xca\x9d\x19\xea\x37\xe9\xeb\x38\x58\x6d\xaa\x19\x5f\xe8\xe5\x80\x97\xbd\x72\x98\xf0\x34\x10\xa1\x9c\x16\x6f\x37\x01\xb7\xd6\xab\x0b\x42\x85\x1e\xe8\x9f\x46\x00\xc7\x05\x0d\x08\xb1\xe1\x50\x0c\x96\xa3\x8d\xc3\xdc\x81\x3d\x18\x38\x9a\xba\x21\xb0\x7b\x83\x74\x0b\x46\x1c\xac\x3e\xf4\xa7\xaa\x7d\x9b\x3e\xc1\xe0\x96\xdb\x09\xe0\xf0\x98\xc8\x28\x15\x83\x22\x68\x2e\x75\x24\xa1\x70\xa9\x94\x03\x65\x23\xa4\xfc\xb1\x95\xbb\xd4\x7e\xce\x6f\x28\x1c\x7d\xcc\x9f\xf4\xd3\xcd\x64\x1d\x36\xd5\x47\xc3\x23\x75\x94\x31\x5a\x9e\x53\xcd\xdd\xc4\x4c\xb4\x00\x70\x8c\x21\x5c\xe4\x8a\x0a\x79\x81\xcf\xe8\x84\x5c\xfa\xb9\x46\xb7\xee\xcd\xb0\x54\x9a\x20\xe5\x50\x95\x7c\x44\x12\x92\xfc\x75\xcb\x24\xa5\x81\x52\xd7\x2d\xfa\x8c\xc2\xb9\xcc\x69\xd8\x81\xb3\x29\x9d\x7e\x1d\xfb\x5a\xa7\x7a\x28\x94\x5f\x5a\x2a\x71\x02\xe7\x35\xcd\x53\x16\xcf\x85\x4b\xdd\x26\x4c\xce\xf2\xa5\x40\xcb\x4a\xbf\xcc\xae\xf6\xca\x1e\xb1\x73\x2c\x82\xf6\x4e\x0a\x24\x3a\xba\x5f\x7a\x96\x1b\x1b\x14\xff\xeb\xaf\x30\xe1\xa3\xf6\x5f\x93\x5e\xd2\xe7\xc1\x31\xef\x05\x89\x18\x52\x9d\x3a\xe2\xcf\x22\xb8\xcd\x7f\x42\xb6\xa2\x75\x77\x74\xe9\x3d\x0a\x7f\xbc\xf6\x5c\x33\xbf\x5a\x6b\x47\x90\x79\xed\x2a\xe1\x33\x31\x5c\x0b\xc4\x58\x28\xe9\x6a\x2f\x58\x13\x5d\x4f\x04\x6b\x95\x4f\x6b\xed\xf1\x78\x60\x6d\x6d\x79\x49\x3f\x32\x03\xe1\xf7\x7b\xbe\x18\x8c\x4d\xbf\xdf\xdd\x1a\xbd\x84\x7d\x84\xb6\xf5\x29\x0f\xba\x33\x5a\x33\x7c\x02\x4c\xc4\xbf\xd6\x1a\xa2\x1f\x86\x6b\xad\xb1\xe0\xc3\xde\x08\xe1\x76\x46\x6b\x43\x91\x08\x3e\x12\xc1\x12\x6f\x72\x2e\x79\x13\x2b\xad\xf2\xe5\xe5\xc5\xec\x0f\x44\x4f\xde\xf8\x99\xfd\x61\xb4\xa5\xf8\x97\xd1\x56\xb7\x33\xae\x68\x66\x66\xd0\x1e\x7c\x2a\xf0\x1f\xd3\xd6\x6a\xe7\xd4\x9d\xd0\x10\xdc\xe9\x06\xae\xda\xcf\xc7\x43\xce\x7a\xf5\x9e\x15\x8f\xb9\x3d\xb6\xde\x94\xb0\x70\x3c\x94\x46\x8b\x03\x26\x38\xde\x67\xec\xa3\x67\x20\x2e\x6f\x33\xf8\xa8\x9d\x69\xe7\xf4\x48\x8f\x0d\x52\xbe\x20\x33\x76\x1b\xb0\x81\x23\x84\x6b\xd4\xa4\x17\xcf\x43\x41\xe8\x88\x55\xed\xd1\xce\x00\xd8\xdb\x91\x94\x8b\x0d\x9c\x91\x8b\xb9\xaa\x14\x1f\x9f\x02\xd7\x48\x42\x42\x00\xec\x5b\x8f\xa5\x9f\xf3\x1f\xcb\x35\x65\xfb\xb3\x36\x5e\xf4\xd8\xe5\x42\xb2\x0e\x4f\xd0\x0e\xe5\x98\x24\xf3\x75\xfb\xb9\x9b\x3e\x72\x1d\x74\x6f\x04\xbc\x98\x8a\xd2\xef\xbc\xb8\xc6\xf9\xa9\x8a\xf1\xaa\x13\x9e\x1a\x48\xe6\x64\x09\x3f\xda\xa8\xd4\x90\x25\x34\x23\xa0\x1e\x44\x96\x30\x3c\xc3\xad\x62\xd6\x32\xb4\x73\x3e\x68\xf3\xad\x20\x84\xd8\x63\x0b\x05\x35\xea\xbb\x53\xa5\x55\x5a\x75\x09\x1d\xbe\x98\x83\x64\x12\x75\x7a\xa3\x52\x69\xf8\x62\x76\x3b\x5d\x71\x33\x1b\x88\x91\x73\xea\x12\xc3\x63\xd9\x67\x67\x3c\xe0\xb0\xa5\x78\x66\x20\x46\xfe\xb0\x33\x80\xf1\xc5\x9b\x2f\x05\xb2\xf0\x41\xba\xcb\x30\x1c\x5e\x79\xdd\xad\x3c\xb8\xf3\xff\x8e\x48\x79\x8b\x7e\xba\x24\xea\xc3\x7f\x47\xe5\xe1\xfc\xbf\xa3\xb2\xe7\x54\x2b\xff\x71\xcb\x64\x8b\xde\x8a\x3c\xb6\xda\xc6\x7f\xf8\xe2\x3c\xfb\x2e\x1a\x0f\xc8\x47\xe9\xe4\x61\xc0\x09\x8e\xb0\xc7\x6a\xd4\x67\x5f\x6c\xcf\x46\x52\xd1\x2f\x97\xa9\x24\x88\x76\xfd\x71\xe7\x59\xfc\x94\xeb\xc0\x78\x1e\xf0\xb2\x4f\x68\xd6\x7a\x5f\xb6\x5e\x11\x80\x13\x20\x00\x51\x36\x88\xf3\x47\xdd\xae\x00\xc0\x55\xc0\xa6\x03\xae\x0b\x3e\x4b\xf9\xde\xaa\x5c\x2f\x03\x9e\xaf\xf0\x4f\x5a\xa5\xdb\x35\xb4\x1c\x6b\xbd\x70\x96\x1c\x28\x08\xaf\xb8\x14\xfe\x44\x51\xda\x21\xd1\xf3\xe9\x23\xa0\x93\xac\xea\x3d\xf2\xa6\x6d\xd4\xbc\xe2\x28\x34\xc4\xf8\x07\x1f\x76\xb8\x97\x08\xe3\x26\xe1\xb2\x57\x47\x82\x38\x35\x17\x1f\x9b\xd0\xc1\x72\xb6\x36\x6f\x18\xb7\xd7\x3d\x0e\x6b\x7b\x08\xe7\x3f\x37\x79\x92\x94\x4a\xff\xda\x51\x9f\xcd\xfe\x61\xa9\x64\xbc\x34\x38\x5e\x07\x85\xda\x5f\x5b\xcc\x4d\x2f\x42\x93\x69\xa6\x7d\xc0\xc4\xdc\x7c\x9a\xf0\xa4\x33\x9e\xb1\xa8\x1e\x59\xed\x86\xad\x27\x65\x6f\x8f\xd3\x4f\xfa\x9a\x10\x12\x1e\x8f\x68\xfe\xf5\x78\x8f\xd3\xb8\x1e\x5b\x1e\x2e\xeb\x2c\xfd\xe8\x84\x5e\x12\x3b\xc9\x66\xf7\xd1\x09\x4d\xd4\xb5\xcd\x4b\x83\xdb\x9f\x12\xcf\x98\xb6\xe8\x5b\x3e\x92\xa5\xf5\x9e\xdd\x76\x86\xaf\xae\xc3\x5d\xe6\x2d\x68\xb4\x3a\x67\xc1\x0d\x90\xca\x8e\x99\xaf\xf8\x90\x77\x47\xf9\x8b\xcb\xbc\xbf\xa0\x98\x2f\xe8\xcb\xb0\xb3\x04\x4a\x9d\x83\xce\xcf\x00\x5b\x4e\x4a\xa5\x57\xc9\x59\x9a\xcd\x1b\x9a\x9f\x0d\x7f\x7e\x75\x09\x29\x95\xd6\x73\x9f\xd3\x82\xc3\x33\x42\x14\xf6\xaa\xbf\xaa\xfa\x92\x78\xf0\x92\xc1\x3f\xde\xe3\x3a\x8a\xda\xe7\xae\x79\x71\x31\x14\x41\x67\x28\xfc\xf1\x6d\xf3\x9c\x79\xf6\xcf\x81\x01\x34\x29\x77\xc2\x5d\xf4\x96\x63\x54\xe9\x1f\xff\x22\xe5\xcf\x31\xcf\x97\x09\xfa\xfe\x18\x5d\xe8\xca\x8c\x0b\x2d\x46\x78\x1a\xea\xd8\x7f\x50\xd3\xe3\x11\x99\xcf\x3f\xc6\x94\xb3\x7c\xd0\xbf\xba\xdc\xd9\x0d\x4e\x2c\x6e\x7b\xec\x12\xa5\xb6\x1f\x6c\x33\xef\x37\x9d\xb7\x7c\xa5\x7a\xc2\x21\xaa\x03\x3c\x1c\x21\x23\xfb\x24\x06\x92\xdc\x57\x3b\xa7\x14\x31\x8d\x35\x51\xe6\xb1\x93\x1e\x2f\xa7\x80\xce\x4f\x49\x79\x98\xe4\x12\x7e\xb4\x49\xb9\x97\x4f\x68\x46\xa4\xfc\x94\x4f\x38\x6a\x93\xf2\x44\x50\x8f\x79\x65\xe3\x6c\x37\x4b\x7f\x6a\x90\x72\x3f\x9f\x11\x12\x2e\x76\x89\x0e\xb9\x92\xce\x1a\x83\xd0\x40\x5a\x44\xad\x75\x7a\x6b\x3e\xf1\xca\xcc\x09\xdc\x32\xdf\x2f\xfb\xf0\xf7\x62\xd7\x0e\xd8\x54\x09\x56\x09\x7a\x37\x3d\x14\xc4\x96\x9e\x1f\x80\x1d\x2c\xb3\xde\x84\x97\x83\xf2\x44\x10\xdb\x2b\xb3\xbb\x2e\x97\x9b\xd3\xdf\xe9\x9d\x9f\xbd\x8f\x3a\xc7\x63\xdf\x7b\x4b\xc8\x77\xff\x79\xc7\x5c\xee\x02\x4a\xd7\xcb\x5d\xfc\x2c\xec\xf7\xbd\xb0\xd4\x07\x97\x3d\x68\xd4\xf7\x5d\xd9\x0b\xcf\xe2\xb7\xbd\x70\x85\x05\x9e\x65\x2f\x7c\x7a\xed\xf1\xc5\x4f\x9e\xf7\x22\xb7\x5e\x5d\x64\xb8\x9d\x90\x75\x76\x09\xdb\x18\x12\x0b\x70\xd2\xe4\xbf\xa5\x45\x6a\x8b\xbc\x6d\xeb\xb4\x51\x88\xcc\x40\x7d\x94\x46\x7f\xee\x4a\x7d\x43\xa9\xdd\x29\x55\xaa\x5c\xe6\x97\x93\xb0\xcc\x33\x3b\xce\x3c\x9b\x3d\x6b\x65\x77\x28\x87\x4c\xdb\xb6\x55\xdd\x7a\xcc\x0d\xf4\x47\x52\xab\x12\x4b\x89\x0c\x4f\x6e\xd3\x0c\x35\x95\xa1\x56\xc8\x30\x14\xcf\x69\x8e\x6d\x95\x63\x5b\xe5\xc8\xb9\x06\x6f\x2d\x69\x9d\xf7\x0f\x77\x3c\xb3\x7f\x58\x5f\xaf\x59\xf0\xf2\x4d\xbe\x54\x2d\x6e\x9e\xdc\xee\x78\xe6\xc9\xad\xfc\x72\x72\xfb\x4d\xbe\xc0\x97\xa1\x78\xde\xf1\xe0\x17\xbe\xe5\xef\x89\x67\xe9\x35\x78\xaa\xd0\x02\x8c\x41\xe4\x71\x42\x3d\x69\x0c\x84\xc6\xef\x9e\xed\x55\x2a\xe4\x0d\x95\x5c\x3c\x57\xe9\xb9\x14\xd5\x63\x81\x1b\xd1\x5b\x84\x34\x22\x60\xec\x22\x42\x6d\x70\xf9\x96\xdb\x63\x17\xc0\x0b\x74\x42\x38\x75\x60\x7b\x6c\x70\xf2\xe6\x71\xa0\x9b\xb8\xdf\x3e\x7c\x16\xbd\xb1\xb1\xd1\xef\x79\x22\xec\x0f\x85\xa4\xb8\x37\xf2\x7c\xd5\x4a\x62\xbc\x18\x06\xf5\x63\xca\xbc\x98\x6f\xa9\xd6\x78\xca\xe9\xac\x81\x0c\x14\x34\xec\x15\x0f\xc5\xc5\xba\xdc\xec\xb2\xb3\xd3\x10\xe8\xc9\xf4\x50\xba\x19\xda\x9b\x9d\x04\xab\x04\x80\x32\x37\x1c\x34\xb9\x99\xb8\x9b\x13\x70\xc4\xcf\x9c\x49\x1f\x80\x7b\x0d\xce\xbe\x37\x8d\x8d\xa1\x88\x3a\xfd\x1e\x30\x20\xc3\x0d\xfa\x53\x90\xf2\x46\x24\xfa\xf0\x3a\xda\xa0\xbb\x45\x49\xc5\x7e\x7a\x59\xc2\x0e\x3a\x06\x77\x06\xe8\x93\x1f\xe6\x35\x37\x52\x17\xc6\x9a\x13\xde\x6d\x39\xdc\xb5\x73\x8a\xf2\x6f\x98\xc2\x80\x67\x94\x39\xf6\x1a\xbc\xfc\x38\x2c\xf3\xf2\x75\x97\xd3\x80\x4d\x42\x69\xcd\x9b\x53\x5c\xf1\x3d\x43\xd0\xe3\x36\xb1\x05\xaa\x37\xf9\x76\xa0\xb8\xf7\xbb\xb1\x31\xe9\x18\x07\x0d\x4e\xa5\x90\x97\xd0\xaf\x87\x5f\x54\x5c\xb1\x76\xc7\xf0\x09\x63\xc3\xa8\xfe\xb9\x83\x17\xcb\xf3\xb9\x2f\xef\x76\x2d\x59\x0c\x58\xc0\x02\xd3\x76\x90\xbb\x17\xcf\x7c\xe8\x00\x99\x24\xe5\x66\x41\xd6\x98\x36\x30\xd5\x00\x5c\x37\xa7\x60\x17\x68\x0b\xe9\xde\x46\xdb\x2b\x1a\xbe\xbe\xb2\x46\x8f\xcf\x58\x82\x66\x20\xa0\xa4\x84\x92\xd3\xea\x2c\x02\x90\xb6\xb2\x19\xe3\x73\xa8\x51\xf5\x60\x08\x3c\x3d\x04\x99\x7d\xc8\x33\xea\x33\xa2\x32\xfb\x51\x83\x33\x67\x63\xf7\x60\x83\x6e\xec\x1e\xc2\xcf\x11\xfc\x34\xe0\xe7\x1c\x7e\x2e\xe0\xe7\x12\x7e\x9a\x1b\x54\xec\xd3\x8d\xdd\x5b\x78\x79\xd8\xa0\x1b\x7b\xbb\xf0\xb3\x07\x3f\x50\x7c\x0f\x8a\xef\x41\xf1\x3d\x28\xbe\x77\x0c\x3f\x27\xf0\x73\x0a\x3f\xdf\xe1\xe7\x72\x83\x0e\x42\xba\xb1\xd7\x82\x97\x1b\xf8\xb9\x83\x9f\x7b\xf8\x01\x90\xfb\x00\x72\x1f\xa0\xed\x03\xa0\x7d\x00\xb4\x0f\x80\xf6\x01\xd0\x3e\x60\xb4\x0f\x18\xed\x03\xb4\x7d\x40\x6b\xbf\x09\x3f\x00\x6f\x1f\x10\xdb\xff\x01\x3f\x00\x6f\x1f\xe0\x1d\x00\x4e\x07\x50\xff\xc1\x19\xfc\x40\xd9\x03\x28\x76\x00\x5f\x0f\xf7\xe1\x07\xb2\x1c\x42\x45\x87\x00\xea\x10\x40\x1d\x02\x6a\x47\x50\xe5\x11\x94\x3d\x82\x62\x47\xf0\xb5\x01\xf8\x35\xa0\xc9\x0d\x40\xb2\x01\x65\x1b\x80\x5f\x03\xb2\x34\x00\xab\xc6\x35\xfc\x60\x66\x80\xd2\x80\x06\x36\x00\xa1\xe3\xef\x1b\xf4\x20\xa4\x1b\xc7\x90\x7c\x0c\xc8\x9e\x00\x8c\x13\x80\x71\x02\x2d\x3b\x81\xe2\x27\x50\xfc\x04\x8a\x9f\x00\x26\x27\x90\xf9\x14\x80\x9f\x02\xda\xa7\x57\x1b\x74\xe3\x0c\x4a\x9c\x01\xc6\x67\x50\xf5\x19\xe0\x79\x06\x59\xce\x00\xc0\x19\x66\x01\x00\x67\x50\xf5\x19\x34\xf4\x1c\xd0\x3e\xdf\xdb\xa0\xc7\xfb\xf4\xd3\xc6\x39\x74\xc5\x39\xe4\x38\x87\x2a\xce\xa1\x8a\x73\xc0\xe7\x1c\x3a\xef\x1c\x70\xbd\x80\x02\x17\x80\xde\x05\x54\x76\x01\x95\x5d\x40\x65\x17\x50\xf6\x02\xb0\xbd\x80\x1a\x2f\xa0\xc6\x0b\x00\x75\x01\x50\x2e\x00\xca\x05\x40\xb9\x80\xba\x2f\x7e\xc2\x0f\xc2\x03\x2c\xbe\x03\xd0\xef\x00\xef\x3b\xc0\xfb\x0e\x78\x7f\x07\x50\xdf\xa1\x69\xdf\x01\xef\xef\x00\xea\x3b\x64\xbe\x04\xf0\x57\x50\xe2\x0a\x4a\x5c\x41\x89\x2b\xc0\xe0\x0a\x30\xb8\x82\x62\x57\x50\xe5\x15\x54\x74\x05\x75\x5c\x43\xe6\x26\x80\x6a\x42\xb3\x9a\x80\x4b\x13\xbe\xb6\xe0\x43\x0b\x06\xad\x05\x03\xde\x82\x66\xb5\x00\x68\x0b\x80\xb6\x00\x68\x0b\x70\x69\x01\xe4\x16\x40\x6e\x41\xe5\x2d\x68\x5b\x0b\xe0\xb5\x00\xab\x16\xd4\xd6\x82\xb6\xb5\xa0\xb6\xd6\xc3\x06\xbd\xd9\xa7\x1b\x37\x00\xe3\x06\x60\xdc\x9c\x6e\xd0\xfb\x90\x6e\xdc\x40\xe1\x1b\x28\x7c\x73\xb9\x41\x1f\x20\x05\x8a\xde\x40\xd1\x1b\xc0\xe7\x06\xda\x77\x0b\x48\xdd\x42\xe1\xdb\x8b\x0d\x7a\xb7\x4f\x37\x6e\x01\xec\x2d\x7c\xfb\x01\x68\xfe\x00\x0c\x7f\x00\x98\x1f\xd0\x92\x3b\x68\xd3\x3d\xa4\xdd\xc3\xeb\x03\x14\x7f\x80\x9a\x1e\xee\x36\x5c\x3b\xe8\x18\x1b\xd1\x73\xe7\xd5\x9c\x8c\x3b\x89\xd9\xc4\xdd\x7a\x1f\x76\x6b\x33\xe8\xe0\x9e\xc0\x87\xb3\xa6\xe0\xc1\x6c\x83\xc2\x7e\xa8\xee\xba\x70\x8b\x6d\x34\x38\x7b\xfb\x7e\x6b\xdd\x44\xf4\xf2\xd6\x6a\xb6\xf3\x17\x42\x7b\xad\xf7\x16\x1a\x34\x84\x9f\x88\x79\x66\xf0\x79\x3e\x97\x56\x86\x9e\xf3\xe3\xd5\x65\xec\x26\xd2\x1a\xd7\x9e\xe9\x71\x74\x69\x84\x5e\xe1\x68\xbc\xec\x4c\x4e\x49\xa4\x83\x81\xf1\x36\xe0\xe3\xb1\x18\xf6\xd0\xc6\x46\xb0\xc8\xbc\xf4\x31\x28\xa4\x7c\x8a\x51\x9e\x7d\x14\x59\x6f\xe8\xcc\x55\xa8\xc8\x37\x41\x3d\x30\x04\x0d\x89\x33\x74\xad\xaa\x0e\x81\x13\x3a\x33\xdf\x5d\xd0\x7b\x9d\x39\xce\x65\x8e\x57\x67\x5e\xd8\x01\x0b\xcd\xa3\xc8\xd9\x75\xb7\xfe\xb0\xa5\xf0\xf4\x24\x31\x30\x69\xe8\x96\x03\x5a\xa5\x9e\x33\x74\x2b\x69\x4a\x68\xde\xe3\xdf\xed\x4d\xf4\x02\xb1\xeb\xaa\xe3\x24\x2d\x5a\x55\x45\xe4\x47\x3b\x60\xe6\x97\x2f\x9b\xc2\xd9\x95\xc7\x59\xcc\xb6\x37\x8d\x60\x4b\xfa\x97\xf8\x82\x61\xa8\x54\x39\x81\x1e\xab\xb6\xb6\x65\x88\xc3\x72\x50\xae\x51\x01\x35\xc7\x14\x0a\x57\x82\x4a\x8d\xd0\x84\x71\x33\x79\xc6\x88\x0d\x77\x31\x1d\xb0\x9e\xd3\x93\xbd\x59\xe9\x41\x27\x8f\x94\x4d\xc7\x80\x8c\x98\xf3\x36\x6d\x5b\x0a\x74\xe6\xc7\x89\x02\xee\x14\x5a\x4b\x28\xfa\x75\xb1\x0a\x9e\x86\x12\xa7\xea\x2e\xc8\xc2\xb5\x3f\x21\xb5\x3f\xca\xab\x65\x0c\x18\x94\xdd\x1a\xd0\x09\x43\x78\x32\x3e\x44\xd5\x7e\xdd\x91\x38\xd8\xe5\xf2\x2b\x79\x66\x93\xb2\xd1\x73\x5e\xcb\x88\xd2\xab\x4b\x36\x07\x74\xe4\xbc\xba\x2c\x87\xcd\x44\xa1\xf2\x5c\x99\xac\xc4\xe4\xb0\x6d\xbd\x4d\x6b\xd6\x84\xce\x6a\x56\x95\x1e\x7b\xd6\x33\x3d\xf7\xac\x2a\x7d\x8c\xac\xc4\x79\x75\x69\x33\x84\xbf\xe5\x9a\xbb\x58\x90\x05\x9d\xb0\xe7\x45\xc4\x46\x99\x8d\x4d\x54\x2a\x49\x63\xc7\x52\xc9\xa8\x7e\x8b\x9c\xaa\x6b\x4e\xdb\xce\xd0\x9d\xcf\xb3\xb7\xdd\x4c\xbc\x8e\xc2\x96\x84\x09\xbb\xc7\x3c\xd3\xff\x6c\x0b\xdd\x66\x29\xa7\xf3\xa5\x33\x8e\x11\x19\x30\xdf\x19\xb9\x68\xa3\x35\x51\xdd\xbf\x33\x01\xfa\x7a\xc0\xaa\x96\xf1\xcc\x12\x39\x56\x83\x6f\x13\x67\x22\xc7\xa4\x3e\x60\xcf\x96\xf1\xca\xd2\x84\x0a\xe4\xa7\x03\x56\x65\xec\xb5\x6e\x7e\xdd\x7c\xb6\x8c\x01\xa6\x91\xad\xd7\xcd\x67\x42\xe8\x80\x25\x30\x09\x06\x38\x0d\x06\xcc\x19\x54\xe0\x21\xc1\xde\x92\x89\xea\x59\xfe\x2d\x23\x2e\x85\x01\xec\x51\xe5\x67\xaa\x07\x6b\xc9\x19\xb9\x0c\x56\x57\xdb\x1a\xa8\x3e\x9e\x2c\x6c\x0c\x9e\x95\x2e\x57\xa9\x3c\x4e\x31\x86\x88\xef\x54\x5d\xf6\x49\xf9\x75\x81\xd9\x5b\xe1\x72\x65\x48\x3f\xca\xf8\xd2\x09\x5c\x2a\x23\x7a\xc2\x02\x5f\x50\xdf\xa9\xc1\xe0\x5a\xb8\x48\xb8\x5c\x1b\x59\xe9\xfb\x7c\xe9\xfb\xf7\xa5\x39\xf3\x81\x2e\x7c\x7b\x7c\xb0\x22\x1a\x3f\x58\x82\x26\x0f\x16\x5f\xd8\x21\xe3\xe6\xe3\x43\xce\xe4\x2a\x94\xc3\xe0\x93\x80\x85\x8e\x0f\x6b\x0b\xf1\x6f\xb6\xf1\x76\x2a\x80\x31\x6d\xb8\xf4\x81\x1b\xf0\x48\xe1\x07\x5d\x86\xa5\x4f\x2c\xa6\x2a\xdb\xd0\xa5\x83\x5c\x36\x9c\x7f\x2d\x95\x10\x13\x52\x80\x01\x83\xe1\x39\x0d\x37\x83\x53\x66\x9e\xf4\x61\xc5\x02\xe9\x17\x49\x79\x2f\x51\x6f\x2c\xa6\x01\x8b\xcd\xe3\xa8\x80\x60\x60\xce\x6a\x50\x79\x0d\xc0\xd4\x58\x95\x06\xe6\xb9\xc7\x02\xf3\xd8\xa3\xf0\xc3\xaa\xda\x10\x35\xc0\xcc\xd3\x5a\x99\x41\xad\x14\xca\xe9\x0a\x21\x63\x9a\x7c\xee\xa9\x64\x82\x3d\x15\xaf\xec\x29\xe4\x7c\xd1\x6d\x59\x80\xb1\x60\x8a\x5d\x06\xbd\xe8\x5c\xbf\xba\xce\xf6\x66\xe0\xd2\xdc\xdb\xa7\xc0\x2d\x7c\x2c\xd7\x0a\x9f\xe1\x9d\xc1\x9e\x9c\x2f\xaf\x10\x5b\xca\xa6\x70\x44\x14\x93\xd5\x28\x3a\xbe\x6b\x4e\x73\xa5\xcd\x99\x2e\x94\x5a\x7b\xe1\xae\x79\x0c\x27\xd4\xc9\x94\x5b\x67\x23\x4e\xe3\x57\x6e\x3d\xed\x72\x7a\x3a\xe5\xd6\xcd\x21\x6d\xce\xb8\xb5\x7b\x42\xa7\x33\x6e\x1d\xe6\xad\x4d\xf6\x33\x86\xd8\x63\x7c\x3e\x7f\x5b\x2c\xf6\x51\x27\xe2\xf2\xe7\x0a\x1f\xdc\x35\xf3\xcf\xda\xbf\x17\xb6\xcc\x31\x12\xe3\x55\x9a\x33\x9e\x14\xe4\xa9\x4c\x71\xb0\x02\x4c\x3b\x96\x32\x91\x82\x52\xcd\x41\x2b\xe3\xf0\xab\x68\x51\x8f\x1a\x12\x5e\x7f\xd2\x0b\x3a\xbd\x68\xaf\x3f\x25\xda\x55\x51\x2e\xcd\x4c\xfa\xd4\x5f\x4a\x6a\x77\xa8\xc7\x0c\x58\xa7\x15\xf4\x9d\xb9\xb5\x5d\x46\xc7\x9c\x3e\x24\xd6\x20\xb1\xa6\x12\xd1\x72\xcf\xd9\xfe\x8f\xf9\x95\xfe\xf1\xd5\xfc\xea\xda\x1e\xec\x04\x43\x9e\x24\x22\x19\x59\x01\xed\x0f\x3b\x51\xa7\x67\xbd\x25\x7c\x6c\x79\x34\xe9\x45\x96\xbf\x58\x60\xe4\xcc\x8b\x29\x5a\x7f\x4c\xdd\x52\xe9\x31\x46\xff\x8e\x17\x53\x97\xd8\x8f\xb1\xbc\xe0\xf7\x4c\x59\x14\x0d\x20\xbc\x2e\xfa\x55\x85\xc3\xbe\xeb\x9c\xba\xf5\xed\x6f\xea\xa9\x54\x32\xf0\xa9\xe6\x32\xed\xe2\xc9\xeb\xa6\x68\x7f\x5b\x4e\xab\xb9\xa4\x0e\x5f\x2c\x7c\x84\xcd\xa1\xcb\x54\x58\x14\x35\x76\x4a\x66\x58\x95\x08\x9a\x09\x1f\x6f\x19\xb5\x7f\x57\xb7\xda\xe6\xd5\x89\x0e\xc0\xdb\xd2\x1f\x7b\xd1\xbb\x8f\x57\x7d\xf4\x9f\x6b\xa6\x7d\xb0\xd2\x2e\x2f\x57\x6c\x41\x16\xf7\xc6\x41\x8b\xee\xb7\x88\xfd\xe9\x00\x47\x7c\x76\xb8\x8a\x97\xbe\xe9\xe4\xdc\x4b\x14\x8d\x5b\x32\x6f\xb0\x39\xc0\x34\x60\xe6\xd7\x4d\xa3\x6d\x8e\x3a\x3d\x43\xe1\x06\x9d\x52\x2e\xa6\xd4\x5c\x64\x99\x83\x4d\x14\xce\xe4\xca\x57\x54\x63\x89\xf2\xd9\xd3\x36\xfd\xfe\x28\x0f\x08\x78\xe3\x4d\x01\x04\xca\xe6\xbb\x4a\xa8\xaf\x5c\x5b\x89\x4a\xf6\xdd\x27\x64\x2b\xa0\xc1\x8a\x2f\xaa\xd3\xe1\xbb\x9d\x7a\xfd\xd2\x98\xa8\x3c\x9c\x6c\xfa\x74\x96\xa5\x1a\x41\xc5\xdf\x94\x48\xa1\x9d\x43\x1a\xf4\x38\x63\x4e\xdf\xaf\xcc\x7b\xe3\x50\x76\xf5\xe1\xc7\x4b\x74\xdb\xdc\x5e\xa8\xef\x7f\x63\x24\x7e\x3b\x0e\x36\x67\x4b\x3d\xbb\xf9\x65\xcb\xd8\xde\x94\x8f\xb9\x7c\x69\xc3\x65\xff\xa8\xa6\x5f\x9d\x6c\x7d\xa9\xf8\x9b\x3e\xd9\xe4\x74\x06\x8b\x27\xdf\xc2\xa3\xff\xdf\xad\xf8\x2a\xfd\x5a\xfd\x7f\x57\xfb\xff\x6a\xb5\x1f\xa9\xd5\x7e\xf4\xff\xe0\x6a\x7f\x3f\xcb\x94\xde\x86\x34\xc7\xac\x6d\x15\x97\x6f\xcd\x25\x9b\xef\x16\x34\xd9\x92\x99\xdb\xe6\x98\xf7\x0c\x73\xfb\x2b\x4e\xbf\xb2\xf9\x75\x33\x5f\x0c\x61\x7d\x94\x01\xa0\xc0\xc6\xf0\x0e\xf6\xa6\xb4\xe7\xfc\x65\x49\x1a\xc0\xfe\xe0\x33\xa1\x32\xaf\xaa\x48\x05\x66\xf8\x65\x1e\xbd\x9b\x64\x5a\xf3\xef\x77\x13\xd8\xef\xd2\x1d\x4e\xee\x2c\xa2\x92\xcb\x03\xe8\x2f\xe7\x59\xb5\xc7\x34\x5a\xb9\x41\xcb\xf6\xa6\xb6\xc9\x01\xab\xb6\x29\xa6\x03\x23\x3f\x01\x08\xa9\xe0\x9a\xfe\x83\x6c\x6e\xe7\xfc\xac\xb5\x74\xb8\xa8\xd3\x27\xf6\xb6\x58\x1c\x4b\x3b\x9e\x21\xf7\x8b\x71\x74\x1e\x3e\x9c\x14\xef\xfd\x34\x70\xe7\xd5\x77\xd1\x12\x01\xd3\x14\xf4\xf9\xdc\x50\x4f\x8e\xef\xb2\xb7\x6e\xa7\x67\x05\x9c\x76\xf9\xd4\xaa\x04\x5c\x1a\x27\xae\x67\x19\xcc\x6e\xa7\x37\x9f\x73\xc7\x77\x77\x8a\x89\xa4\xf8\x8a\x7e\x09\xde\x95\xe5\x53\x59\xf6\x5b\x31\x91\x14\x5f\xb1\x6c\xae\x6b\x65\xdb\x23\x31\xde\x83\xed\x69\xb4\x62\x71\x20\xd6\x1a\x08\x97\x5e\xcc\xa0\x05\xf9\x24\x3e\x2d\x44\x57\x59\x75\x12\x9c\xc8\x65\x78\xf2\xbf\xd9\xe9\xd3\x69\x85\x37\x1a\xb3\xfc\xec\xca\x56\x10\x2e\xd1\xda\xbf\xab\x9b\xa6\x9a\x9b\x6a\xe4\x09\x6e\xe2\x30\x5a\x27\x40\x6f\x8a\x29\xb7\x36\x78\xe2\x89\xe1\x68\x83\x46\x33\x6e\xdd\x3f\x73\xfa\x38\xe3\xd6\x46\xc2\xbb\x9e\x18\x8e\x37\xe8\xcb\x8c\x5b\x07\xc7\x0b\x7a\x8a\x02\xf0\xd3\x96\xd9\x15\x43\x9f\x8f\xfb\x43\x76\xd2\xb2\x4f\x5b\xce\xfd\x33\x77\xd9\x21\x3c\x9a\x12\x10\x3b\xc0\x17\x05\x80\x1d\xb5\xb0\xba\x53\x14\xc0\x5c\x7e\x3f\xb4\xae\xe9\xcd\xe5\xd5\x5f\xe7\x87\x47\x37\x96\x77\x86\xcf\xcd\x93\xc6\xf1\x8d\xf5\x63\x97\xd3\xbd\xcb\x9b\x9b\xcb\x0b\xf9\xb1\x75\xa0\x5f\xe5\xf7\x0d\xaf\x3f\x1e\xf7\xbb\x7f\xa1\xde\xfe\xc6\x82\x9e\xe5\x21\xce\xb8\x75\x7c\x42\xc7\x40\x2e\x1f\xd0\xe6\xcc\x9a\x46\xf9\xe0\x26\x05\x8d\xdf\x23\xa0\x77\x5b\x53\x4e\xdf\x7a\xbc\x2b\xb0\x6d\xf9\xee\xed\xc9\xb8\x85\x06\x67\xf2\x3b\x4f\x15\xda\xb8\xb3\x1f\xb8\x19\x13\xee\x97\x4a\xeb\x5e\x6c\x9c\x34\x38\x6d\x21\x81\x91\xb9\x45\xbf\x69\x8b\xb5\xc1\xb0\xff\xa8\x54\x8c\x66\xfd\xc9\xda\x68\x20\xfc\x4e\xd8\x11\xa8\x14\xd4\xeb\x8f\xd7\x9e\x79\xd2\x09\xcc\x8d\x9c\x2f\x4d\x1d\x17\x04\xda\x25\xaf\x22\xac\xd7\x33\x8a\x36\x9c\x13\x80\x03\x9c\x40\xd0\xef\xf2\x4e\xcf\xea\xee\xd3\xa0\x33\x1a\x24\x7c\x76\xd1\x0f\x84\x35\x8a\xe8\xa8\xdd\x7f\x69\xc8\xdb\x8a\x3b\x3e\xec\x75\x7a\xd1\xc8\x5a\xaf\x51\x8f\xfb\x71\x34\x84\xd9\xbc\xdf\x4f\xfa\x43\x2b\x75\xd6\xac\x78\xe8\x87\x5d\x9a\x0b\x8c\x65\x55\x17\x34\xe0\x63\x9e\x88\xd1\x48\x8b\xd7\xa0\xd4\xc6\xd1\x57\xf8\xb7\x41\x95\x0d\xb9\x4a\xdd\xfe\xf3\x5f\xb5\xda\x1f\x1b\xb4\xcb\x87\xb1\x18\xaa\x08\x57\x56\x8d\x8e\x44\x22\x5b\x8e\xc8\xed\xb5\x69\xd8\xef\x8d\xbf\x43\x67\x46\xfb\x54\x5e\xa9\x74\x7a\xd1\x7e\xbf\x87\x5c\x33\x8c\x5b\xbf\x9f\x8c\x3b\x03\xeb\xad\x33\x3a\x1e\x77\x13\x40\x1c\x3e\xb5\x90\x8d\x7e\xcb\x97\x86\xe7\x56\xe7\x55\x58\xb5\x2f\x14\xd5\x23\xac\xd3\x83\x05\x1d\x0f\x3b\x51\x24\x86\xd6\x99\xec\x87\x83\xce\x68\x30\x19\x8b\xe0\x06\xc0\xaf\xd7\x30\x0d\xa3\xd8\x5a\xeb\xd5\x05\x4d\x1d\xd1\x5b\x6f\xda\x69\xbd\xb4\x5f\xd3\x7e\xe9\xe5\x5b\x2e\xfc\xc1\x82\x8e\x3a\xaf\xe2\xf7\x45\xba\x9d\x1e\xe2\xf6\x05\xd2\x25\x96\xdb\x0b\x2a\x83\xb0\x5a\x6f\x83\xfe\xa8\x83\xc3\xd8\x3a\x00\x62\x45\xf4\xc6\x5c\x8e\x6a\x44\x3f\xe5\x5a\xab\x5b\x45\xf9\x64\xc8\x65\x47\xdf\xb6\x17\x0b\xd5\xc9\xd6\x9b\x94\x2d\xbc\xa9\xf1\x53\xd9\x3b\x7b\x4a\x0c\x58\x5b\x2c\x16\x34\x9b\x7a\xd6\xc1\x31\x8d\x85\x18\xec\xc2\xf4\x1b\x37\xa1\x42\x6b\xbd\x4a\xbb\x3c\xea\x75\xc2\x59\xa7\x17\x35\x12\x3e\x1a\x59\x6f\xd2\x08\x15\x3e\xbd\xf6\xfb\xdd\x23\xee\x8f\xfb\x43\xeb\x6b\x7e\x1b\x3b\xcb\xb6\xb1\x43\x5f\x1b\xb6\xfc\x38\xc8\xd9\x9f\xec\xfb\x3c\x35\xd8\x38\x3d\xcb\x7d\x98\x0c\x50\x80\x73\x3f\x91\xaf\xbd\x11\x67\x5b\xff\x9f\x54\x71\x29\x55\x60\x5a\x4e\xf8\x6f\x45\x3d\x55\x2b\xff\x71\x8d\xf9\x47\x2f\x84\xcc\xff\x1b\xc0\x3f\xf2\x79\x4b\x5d\xfd\x0e\xa1\x02\x99\xf8\x79\x6b\x71\x6f\x9c\xb5\xe8\x64\x4c\xec\x3b\x76\xd6\x92\xd1\xcd\xbb\x2b\xa2\x1e\xff\x38\x60\x5c\xf9\xe6\xc3\xf7\x87\x31\xd7\xd1\xe1\xc6\x68\xff\x90\x0b\xee\xd2\x58\xf2\xc9\xc6\xb1\xf1\x42\x7b\x10\x34\x2f\x0c\x42\xee\xc6\x79\xfd\xc8\xd0\x70\x5c\xea\xb8\x74\xbd\x4a\x16\x4a\xf7\x4a\xb9\x79\xf0\xcd\xd3\x07\xe5\xe9\x61\x77\x64\x71\xd3\xbf\xc7\xe8\x7d\x61\xc1\xef\xf5\xc5\xc8\xba\xcc\x55\x5a\xfc\xe8\x41\x31\x4f\x16\x43\x3f\x7d\x8b\x4f\x77\xa6\x7f\xff\xce\x52\x63\x95\x3f\x51\x40\xb5\xe8\x38\xe5\xc4\x35\x04\xf5\x4c\x6f\x9f\xd0\x28\x7b\xf5\xf7\x89\x8d\x6e\x47\xe5\x15\x66\xa8\x9d\x7a\x45\xca\x9b\x26\x50\xdd\x7b\x1d\x23\x24\x48\x79\xef\x75\xd0\xc6\xae\xd8\x05\x3e\x74\x41\x20\x7b\x20\xd7\x99\xf9\x76\x89\x0c\xc9\x9c\xb3\x60\xec\x4f\xf4\x90\x86\xd6\x29\x1e\xe0\x14\x51\xdf\xfc\x79\x4c\x88\x1d\x98\xd3\x1e\x63\x87\xc7\xf3\xb9\x7c\x3a\x1b\x71\xfd\xf8\xb4\xcb\xeb\xdc\xbc\xff\x69\x04\x34\xa4\x82\x58\xdc\x7c\xd0\xcf\x8b\x3b\xf3\xfe\xe7\xbb\x0e\xe2\x6c\xd6\x31\xb8\xb9\xff\x4c\xef\xf6\x49\xa9\xc4\x15\x68\x7b\x45\xc7\x79\x4b\x0e\x67\xf6\x3a\x86\xe7\x08\x97\x68\x7d\x43\x98\x84\x4e\x3b\x70\x8d\x90\x94\x4a\x46\xc8\x7e\xee\x97\x43\xe8\xc1\x7d\xd7\x08\x9d\x58\x06\x70\x5f\xee\x9e\x20\x9d\x20\x18\xc7\xf0\xe1\x3d\x82\x9a\xa1\xda\x7f\xa6\xc2\x16\x4c\x22\xb8\x7b\x82\xca\x7b\xf1\xa3\x71\xd4\xe0\x34\x20\xf5\xc0\x3a\x1f\x71\xc9\x8d\xe9\xef\x01\x63\x77\xfb\x2a\xd6\x4a\xd5\xe6\x12\xfd\x72\x99\xa7\x37\x19\x0e\x77\xed\x6d\xc6\x94\x67\x4e\x94\x02\x21\xca\x8b\xfd\x06\x37\x84\x8a\x42\xda\x29\x90\x7d\x4a\xf1\xf8\xe4\x2f\xc9\x46\x2d\xf9\x52\xab\xda\xa1\xac\x25\xcc\x3b\x91\xe2\x4e\xe8\x6a\x1f\xf6\x18\x49\x5b\x3a\x23\x8b\xb6\xad\x1e\xfd\xe1\x73\x2b\xa4\xb7\x3e\xd7\x2e\x05\x21\x33\xeb\x2d\xf8\xa3\x21\x48\xdd\x37\xb8\xea\x1e\xcb\xd0\xcf\x35\x42\xaf\xb4\xe5\xa4\xa0\x01\xf5\xd1\x5a\x93\x60\xe0\xf2\x93\xbf\x96\xc4\x5b\xcb\xa1\xa4\xb5\xf7\xd5\x34\x86\xb4\x60\x07\x1d\x63\xaf\x83\x9e\x57\x09\x91\xd7\xc9\x34\x64\x5e\xa9\x74\xd8\xe0\xd2\xe1\xaf\x60\x61\x3d\xb4\xf4\x2e\x86\xe3\x2b\x48\x5d\xc8\x01\xb5\xa4\x53\x29\x68\x50\x16\xce\x34\x1f\x13\xe3\x3c\xb5\xec\xda\xf7\xd1\x2c\xf3\xd0\x2f\x95\xae\x26\x06\x3c\x50\x0f\x0d\xce\xbc\xe5\x55\x9b\x0f\xf0\x6c\xfb\xcc\x37\xf7\x9f\x61\x9c\xa4\xaf\x50\xc3\x67\xbe\xac\x9b\xc2\x13\xea\x7d\x36\xf6\xb6\xe8\xc9\x80\xe7\x52\x9a\xb7\x5b\xb4\x5f\x48\xb9\xb9\xda\xa2\xf7\x61\xce\x31\xa6\x0a\x97\x80\xeb\x2c\xe7\x1c\x0d\x3b\xe3\xc4\x35\x42\xea\x99\xf7\xb0\xd8\xae\x75\x6f\xfb\x30\xab\xa3\x32\x1b\x89\xb2\x4f\xb2\x41\x8c\x70\xf8\x42\x1c\x4a\x15\xd6\x33\x37\x40\xb0\xc2\x1d\x37\xbf\xf6\xaf\x1b\x45\xf7\xf0\x1e\x63\xaf\x67\xf3\xf9\x3e\xba\x04\x40\x3d\x9a\xd3\x33\xc6\xd8\xf1\xc9\x7c\xae\x1e\xa7\x79\x2b\x85\x66\x5e\xaf\x28\xe0\xd4\x87\x9f\x80\x55\x02\x4e\x65\xf0\xf5\xcc\x03\xb6\xf9\xe3\x40\x32\xf6\xf0\xe4\x5c\x63\x40\x05\x7d\x3d\xf2\x60\xe8\xc4\xa2\x65\x1a\xe4\x1d\xdb\x9e\xf6\x09\x4c\xb9\xf9\xd8\x06\x5e\xd1\xf6\x8b\x49\x35\xbc\x02\x93\xbe\x6f\x03\xca\xcd\x61\x07\x73\x89\x62\x12\x1a\x92\xd1\xb7\xa4\x5f\x14\x51\xd0\x76\x47\x26\x04\x98\x20\xf2\xae\xbf\xae\x7e\xbf\x35\xa2\x03\x49\x3d\x62\x31\x7b\xe3\x41\x30\x14\xa3\x91\xe5\x39\x91\x6b\x46\xdb\x0b\xfb\x5a\x59\x5d\x97\x4a\x46\x6c\x4a\xaa\x12\x2f\x24\xcc\xd3\xb3\x75\xc6\x6e\x0e\x60\x1e\xe2\xe3\x34\x9a\xcf\x8d\x58\x0a\x66\x46\x4c\x76\x2d\xb1\x71\xc7\x8d\xc9\xc2\x63\xd1\x23\x3a\x11\x42\x5b\xac\xe6\x5f\x54\x06\xdd\x13\x54\xba\x0c\x98\x0c\x9c\xd1\x13\x4c\x94\x80\xd6\x70\x22\x37\xff\x5a\x11\x07\x31\xdf\x04\xe1\x9c\xea\x46\x84\xf9\x16\xa0\x2b\xf5\x84\xc5\x66\xb4\x4d\x7b\x2c\x36\x7f\xf8\x9c\x0e\x58\x6c\xde\xfa\x38\x9c\x02\xdd\xb7\xc3\x2f\xf4\xf1\x5b\xcc\xd4\x63\x36\xd4\x3d\x09\x69\xc4\x7a\x74\xc2\x62\xf3\xff\xcb\xdd\xbb\x7f\xa5\xae\x7b\x8b\xa3\xbf\xaf\xbf\x42\x3d\x1e\x46\xbb\x08\x5d\xa0\x4b\x70\xb5\x66\x39\x10\x41\xc0\xb7\xe2\xb3\xb7\x77\x8f\xf4\x09\x52\x0a\xf2\x50\x41\xfb\xbf\xdf\x91\x99\xa4\x4d\x11\xd7\xde\xe7\xf3\x39\xf7\xdc\x7b\xbe\x7b\xb9\x69\x9b\xc7\xcc\x6b\x26\x99\x33\x99\x0f\xde\x21\x7f\x39\xc3\xc1\x68\x18\x01\x33\xc5\xe4\xbe\x8c\x12\xc6\x33\x98\x46\xc5\x3d\x7c\xd9\x53\x66\x66\xd1\xd2\xa6\xf3\x91\x37\x41\xa7\x13\xa2\xee\xbf\x60\x08\x99\x74\x87\xe3\xe9\x5f\xc0\x09\x6c\x89\x0c\x33\xb3\x24\x47\xd0\xb5\x35\x97\x53\x5e\xe8\x8a\xb9\x94\x47\x35\x1c\x73\x62\xe1\x17\xc3\x31\x23\xeb\xe3\x43\x39\xe1\x3a\x90\x8b\x21\xc9\x87\xf9\x99\xa7\x22\x1a\x81\x43\x95\x0b\x1a\x8f\xc0\x90\xe4\x88\xb6\x1c\x45\x18\xf0\x22\x32\x37\xdf\x2c\x10\xc7\x0f\xc9\x54\x61\xfb\xab\x14\x16\x05\x8a\x1a\x23\xd7\x0c\x2d\x1c\xf1\x6b\x5a\xde\x0f\x74\x7d\xa0\xc0\x99\x50\x50\x0a\xdf\x35\x47\x22\xf0\x53\x75\x62\x97\x99\x7a\xf6\x55\x43\x21\x98\x3c\x51\x1c\xc8\xe5\xee\x7a\x8a\x83\x7a\x3d\xf6\xe6\xb2\x37\x91\xb5\x3e\x24\xaa\x61\x83\x61\x8a\x6f\x04\x56\xde\xc7\xde\x2a\x76\xf6\x5e\xe1\xda\x63\x34\x49\xc6\x4b\x39\xa7\x11\xb9\xde\xf1\xf1\x75\xc6\x67\xb9\xb4\x58\x5c\x4b\xc6\x02\x52\x6b\x1c\xf2\x32\x0e\x9e\x49\xe8\xf2\xcd\xef\xca\xf8\x2b\x5c\x2e\x89\xe0\x71\x12\x0c\x0e\x54\xe9\x2b\x73\xfe\xe1\x48\x52\x50\x9d\xbf\x2d\x8a\x2f\xca\xcc\xf9\x88\xe1\x31\x67\xbd\xa6\xcb\xee\x86\x8a\x0c\x30\xbc\xd3\xc5\xc1\xd3\x5c\x92\xc6\x6e\x49\xb1\xdb\x9f\x62\x7f\x4a\xb1\x3b\x34\x96\xdb\xa4\x02\x57\x25\xde\x52\x85\x25\xdb\x71\xff\xa0\x73\xae\x5d\x56\x0c\x78\x82\x81\x3e\x60\x8f\x79\xe2\xf8\x05\xa2\xdf\x2c\x50\xb2\x4d\x40\x9f\x5e\x67\xcc\xfa\x0d\x3c\xd0\x20\x90\xc9\xe1\xeb\x8c\x5b\xf4\x40\xb8\x42\xbf\xf4\x31\x57\x1d\x0c\xb4\x4b\x9f\xd1\x10\x01\x3f\xbd\x7c\x4b\xbc\xfe\x75\x2f\x12\x95\x79\xdf\xc6\x0e\x7b\x9b\xba\x89\x3a\xc7\x9c\x5b\xbc\x98\xf2\x33\xd1\x47\x46\x76\x1c\xbd\xb2\xe7\x15\x7f\x5e\xf2\xe7\x09\x7f\xf6\x66\xec\x79\x5f\x65\x7a\x07\x0f\xca\x19\xe3\x02\xce\xe0\xcc\x65\xb0\x44\x1d\x9c\x4c\x15\x5e\x1a\x57\x17\x4f\x77\x99\xdb\xa3\x25\x2f\xc5\x81\xe1\x98\x0f\xb6\x30\x14\xe6\x62\x47\x7b\x1e\x28\x92\x38\x04\xe1\xd5\xe7\x46\x49\xc0\xb9\x90\x71\xc7\x2c\x8a\x20\x1b\xad\x94\xa1\x00\x79\x7d\x6e\xc7\x8f\x79\x23\x0a\x68\x49\x20\x21\x02\xf9\x09\x6d\x19\x7f\x97\xdd\x4c\x85\x7b\x36\xdf\xce\xc0\x71\xd3\xfd\x11\x33\x52\x6a\x23\x16\x1c\x32\x32\xe9\x81\xa3\x87\x08\xa4\xf0\x7a\x33\x01\xef\x9c\x0e\x20\x0d\x40\xb6\xd6\x5c\x80\xb6\xb9\x16\xf6\x55\x23\x30\x61\x4d\x4f\xdf\x68\x25\xa4\x8f\xde\x4c\x35\x02\x6c\x6b\x4f\x5d\x62\xd0\x7a\xcf\x1a\x10\xbc\xa8\x29\xea\xfe\x6a\xb1\x0c\x70\x4f\x55\xb5\x0a\x25\x55\x07\x37\xba\x57\xaf\xa2\x7f\x1e\x79\x2f\x1b\x84\x0e\x2d\x0f\xdc\x4c\x03\x2f\x93\x40\xd2\xe4\x81\x8e\xf0\xd7\xc4\xde\x28\x27\x26\xde\x28\x64\xe9\xe3\x48\xfe\xb8\x7c\xa5\xf0\xee\xab\xd8\x36\x6c\x00\xe5\xca\x52\x85\x17\xd7\x19\x6f\x17\xa0\x66\x1d\x68\x67\x8e\xc2\x33\x8a\xc2\x7b\xbe\x42\xa3\x17\x91\x42\x61\x69\xa3\x2a\xb2\xb5\x51\x95\xe9\xcc\x24\x39\x4e\x5e\x85\x75\x71\x69\x90\x1c\x35\x3b\x1a\x0e\xa5\x28\x9a\x49\x43\x79\x56\x5a\x7f\xa9\x4f\xec\xc7\x75\xac\xd8\xda\x53\x63\x9f\xfe\x68\xed\x08\xe8\x2b\xa6\x9d\xcd\x73\x1c\xbd\xaa\x48\x74\x98\x68\xa1\x64\x5f\xf0\xe8\x93\xcf\x18\x3e\xfa\x0e\xbe\xee\x29\x8e\x76\xbe\xea\xfe\x60\x13\x6e\x18\xaa\x74\xac\x5d\x70\x57\x94\x11\xf0\xe4\x82\x23\x9e\xea\xb2\x7e\xa4\xe0\x19\x13\xa4\x01\x8e\xd0\x0e\xa0\xbd\x9b\x9a\x6e\x69\x7e\x9a\x4a\x8f\x4a\x18\x2a\x14\x95\x34\x66\x39\x2c\x73\xe2\x4c\xa3\xb2\x61\x8e\xf6\xe0\x83\xa6\x21\xdb\x1d\x28\xe3\xf1\x05\xf6\xb2\xc3\x34\xbf\x49\x12\xe9\x91\x19\xd1\x1d\x5f\x1c\x7c\xb5\x0f\xd1\x7d\xa0\x6f\x14\xb5\xad\x8d\x58\x45\x41\x36\x19\xf9\x9c\xac\xb4\x21\xcb\x11\xb3\x06\x27\x66\x13\x28\xc6\x83\x3a\xbb\xa3\x05\x55\xd3\xd5\x7a\xae\xa5\x8d\x3c\x74\x79\xcd\x7d\x13\xaf\x97\xe8\x9f\xe9\x37\x09\x2d\x09\x39\x66\xcf\xb1\x2c\x15\x91\x27\xc5\xd5\xbc\x88\x66\x4d\x93\x16\x21\xa9\xa3\x79\x91\xa5\x7e\x82\xe0\x68\xf6\x70\xec\x7a\x63\x4b\xcd\xf8\x00\xdd\x5c\xd2\x9b\xd6\x9e\x1a\x80\xa0\xe9\x58\x1f\xbd\x82\xa0\x5a\x80\x7c\xec\x98\x9b\xcf\x96\xf6\xb0\x40\x01\xf6\xcd\x23\x2b\xef\x33\x6f\x82\x7d\xec\x83\xf4\x87\xcf\x3c\x07\x86\x98\x87\x47\x98\x87\x8c\xb0\xa3\xb5\x2a\xda\x1b\x9a\xb0\x97\xf9\xb2\x60\xce\x20\x22\xe0\xbf\x6d\x6b\x27\x56\x29\x91\xc5\xf6\xc6\x17\xd8\x1b\x47\x68\xa2\x1a\x2f\x74\xa7\x1b\xa1\x49\x5e\xe9\xff\x9e\xec\x47\x7a\x21\x52\x45\x60\x5e\x09\x7e\x8f\xf6\x43\xbd\x10\xaa\x90\x92\xef\x7a\x23\xec\xd1\x7d\xef\x05\xcd\x90\xab\x1a\x57\xb4\x37\x46\xc8\x6e\x82\xb6\xce\x08\x2f\x39\xa0\x8b\x59\xfa\x51\x5f\x09\x12\x6f\xd0\x69\x2e\xb2\x9c\x8b\x8f\xf0\xeb\x98\x80\xbb\x3a\x6d\xe7\x1f\xe6\xf7\xf8\x22\x8c\x3d\xba\xe0\x8d\xc4\x7a\x0e\x7d\xb9\xad\xed\x20\xd6\x8d\xf0\x46\x57\xbc\x0a\xa2\xfd\x57\xa8\xa8\x90\xdd\x63\x6b\x96\x4f\xf3\x2f\x55\xe4\x42\xae\x88\x2b\x55\xa4\x40\x61\x45\xf0\xeb\x83\xd7\x4b\xa8\x91\x2b\x6a\xe4\xb2\x11\xe5\x3b\xcc\x88\xa2\x0b\x1d\x5d\x1a\x75\x9f\x06\xc1\xf7\x39\x6b\x8a\x03\xf3\xa4\xc8\x57\x79\xba\xb8\x60\x47\x6b\x47\x8c\x7a\x84\x4f\xd8\x32\x13\xf4\x12\x8b\xde\x7b\x71\x8f\x68\xdd\x0b\xc6\x7b\x82\x93\xb2\xee\x05\xfa\x74\x90\x16\x88\x29\x4a\x54\x44\xd8\xf6\x4e\x0b\xe9\x5e\xe0\xe2\x9e\xad\xf5\xc7\x66\xdb\xda\x87\x9b\xcb\xfe\x78\xb5\xe1\xe0\x8b\xb9\xb5\x0f\x8e\x3a\x39\xa5\xa0\x8d\x1c\x45\x55\xf5\xcb\x24\x28\x40\x7c\xcb\x57\xe9\xa2\x41\x0b\xd2\x4d\x49\x5d\xba\x2b\xaa\x7b\xfd\xa4\xd8\x5a\x50\x5d\x61\x2d\x97\xce\x85\x91\x67\x5c\x73\x22\xd6\x46\xf3\x06\xf2\xe8\xac\x54\xa5\xb0\xc5\x94\x80\xdb\x33\x39\xec\xec\x10\x79\x7c\x0e\x42\xc1\x92\x9d\x66\x49\x8a\xd4\xc6\xa7\xa0\x02\x69\x5b\xaa\x61\x63\x4a\x0f\x98\xb6\xc4\xa2\xd8\x6a\x2a\x28\x64\x8b\x4d\x81\xae\xc7\xa3\x27\x30\x89\x9f\xdd\x91\xec\xe5\x45\x73\xe9\x1c\x86\xb1\xbf\xbd\x66\x62\x42\x8a\x8c\x99\x51\x7d\x3b\x97\xb3\xb5\xe8\x52\x64\x7c\xa2\x70\xcc\x26\x25\x38\x9a\x16\x98\x34\xd5\xee\x66\xc8\xc6\x41\x5f\xb1\xcd\x4d\x3a\x46\x66\xd3\xc2\xb8\x39\xd9\xb7\xb5\xab\x08\x53\xf6\x1b\x02\x5a\x13\xb8\xfb\xa6\x41\x45\x4a\x87\xbe\xd9\x78\x7e\xa2\x08\x15\xb7\xb9\x63\xfa\xcf\x96\xc2\xac\x0d\x38\xe8\x6e\xa6\xbb\x70\x85\xa0\xdb\xb1\x1a\xc7\x2a\xb8\xde\x0d\x0c\x57\xeb\x3a\x8a\x8d\x2e\x9a\xa0\x5f\xcb\x3e\x9a\x13\xe9\xa3\x25\x7f\x04\x93\x0c\x35\xfe\x24\x3a\x80\x9f\x98\xda\xfc\xb8\x74\xde\xd0\x97\x4c\xe5\x06\x13\x61\xdd\x76\xd1\x60\x67\xa3\x17\x89\x15\xdc\x03\x1e\xd2\x9c\xe8\xf0\x6c\x25\x69\xab\x8d\x18\x42\xdc\xe6\xd7\xf0\xbc\xe6\x32\xbc\xd3\x57\xf2\x15\x40\xbf\x19\x7f\xe1\x4b\xeb\x4a\x42\x92\x0e\x7b\x37\xab\x3e\x72\x10\xf1\x91\xbb\x4f\x7c\xfd\xde\x43\xe7\xe8\xde\xb3\x64\x66\x44\xa6\x48\x80\xfc\x7e\xf5\x18\xa1\x60\x0f\x41\x81\x43\x32\xfd\xf7\x69\x7f\xd5\x6e\x66\x0a\xa3\x56\xd6\x1d\x70\x05\x10\x06\x19\xa9\x50\x96\xd0\x01\xb5\xd5\x57\x8f\x79\xf8\x07\x53\x31\x8e\xb9\x65\x61\x4c\xfc\xfd\xf5\xa2\xbe\x5e\x82\x6d\x63\x5b\x0a\x10\xde\x26\x1d\x60\xc3\xd9\xe9\xb5\xaf\x0b\xf3\xcd\x14\x17\xe6\x0d\x86\x0c\xd1\xa5\xee\x31\x8c\x78\x9f\xb4\x75\x1f\xbd\x8d\x75\xc7\xfc\x69\xed\xd3\x1f\xee\x95\xa3\xa9\x3b\xe6\x8e\x04\x3c\x8e\x59\xcf\x1e\x65\x21\xba\xcd\xd5\x10\xdb\x11\x40\x44\xe7\x3d\xfd\xb4\xa7\x50\x50\x2a\xba\x59\xe8\x8e\x59\xce\xc2\x5c\x32\x80\xcc\x3c\x7f\x24\x7d\x77\x97\x3d\x6c\xb1\xa1\xf7\xba\xb6\xe2\x32\x79\x44\x10\x50\xa4\xe4\xba\x4b\xf9\x46\x47\x3b\xa9\x53\xc2\x8c\x8f\x67\xf0\x46\x90\x27\xcf\xd9\xfb\xaf\x4e\x6e\x04\xd5\xc5\x8f\x3e\x5c\xed\x3c\xeb\x09\x0f\x13\xba\xf3\xa2\x08\xd3\x98\xc0\x42\x23\xec\xc1\x7e\x1b\x54\xcd\x88\x93\x15\xc6\xe5\xb5\xc2\xb6\xa7\xf5\x12\x1a\x21\x73\x02\xd4\x04\x9a\x37\x54\x83\x3c\x29\x51\x4a\x50\xf0\x44\x45\x48\x44\xe9\x09\xba\xa2\x01\x4d\x91\xc9\x2e\x48\x0a\x74\x76\x08\x56\xf4\x80\x74\xb3\x91\x2f\xb7\xe7\x72\xc9\xc8\x80\xa8\xad\xbb\x4f\x09\x15\xdd\xd1\x1e\x6a\x28\xc4\x8e\xd6\x73\x0d\x25\xe0\x6a\x75\xc1\x3e\x5d\x04\x03\x14\x5a\xaa\x44\xac\x4e\xc1\xe3\x11\x7f\x7e\x7c\xd0\xbd\x41\x76\x75\xca\xd9\x18\x76\x44\x6c\x44\xb8\x6f\x86\x16\x37\x50\xc0\xe9\x89\x7e\x93\xd2\x10\x91\x76\xd6\x46\xb7\xcd\x94\x22\x65\xa2\xcc\x91\x76\xda\x16\x56\x07\x44\xc2\xd3\xb6\x39\xb1\xd0\xe9\x9c\xa8\x46\x84\x99\xbb\xa0\xbd\x48\x1b\xb8\xc2\xfb\xf8\x08\x17\x8d\x91\x10\xd8\x1c\xa9\x3d\x5f\x99\xc0\x30\x4d\x88\x12\x21\xdf\x1c\x59\x94\x9e\x86\x49\x38\x81\xc9\x3a\x6f\x20\x47\x8b\x2e\xf9\x6c\xf5\xf8\x93\xb6\x5d\x4c\x61\x4b\x45\x41\x2e\xc7\xdb\x68\xd6\x2c\x65\x92\x31\xbe\xd1\x6f\x4a\x76\xde\x6d\xad\xcf\xd9\x48\xd8\x09\xe8\x44\x55\x4a\xbf\xb1\xab\x8a\x8d\xca\xc1\xf8\xb6\xb9\x5f\x04\x2f\x39\x2e\xff\x72\xf5\x42\xc9\x70\xf8\x47\x49\xe7\x9e\x1b\xf8\xc1\x9a\xe1\xaf\x63\xd7\xf0\xf3\x58\x72\x8b\xe9\x5b\x4c\x41\x01\xde\x4a\x96\xe1\x63\xec\xed\x13\xe6\x37\x19\xf5\x55\x9d\x80\x53\x61\xd4\x57\x63\x6e\x03\x3b\xe3\xfe\xe5\x5a\xc6\xe5\x04\x8f\x0d\x07\x07\x4f\x8a\x03\x4e\x7a\xbe\xf0\x07\x66\x9b\x57\x73\xab\x40\xe8\x6f\xbc\xec\xdd\xcb\x59\x42\x7c\x87\x1d\xfc\xf9\x8c\xba\x82\xfe\x0e\x91\x79\xe4\x23\xb7\x29\xaf\x8e\x7d\xad\x1d\xa1\xbe\x76\xde\x43\x7d\xed\x66\x21\xfa\xdb\xf0\x19\xd2\x86\x74\x61\xf4\x6d\xcd\xdd\xc1\x18\xdf\x4c\xf6\x7d\xed\xda\x55\xfa\xe6\x9d\x63\xa1\xbe\xf6\x86\xfa\xda\x1c\x6d\x15\x51\xaf\x4e\xff\xde\x89\xad\x7b\xe9\x85\x72\x9f\xd6\x92\xdf\x29\xf7\xd9\x11\x8b\xe6\xd8\x8a\x8a\x86\xfc\x5e\x5b\x04\x5e\x78\x28\x74\xf4\x73\x64\x0f\x43\x97\x2e\x8d\xd7\x1e\xfd\xed\x38\x74\x91\x41\xa1\xaa\xfb\xda\xd0\x53\x44\x69\x0c\x2a\xcf\x4a\xab\xd7\x07\xd2\xc0\x6d\x42\x43\xf8\x61\x81\xd9\xb7\x70\x08\xa4\x8c\xec\xb9\xe3\xd3\x5a\x0e\x7b\xe9\x7d\x55\x1b\x57\x8d\xc7\x25\x7b\x34\xc2\x37\x8a\x36\xae\x22\x02\xea\xe2\xbc\x14\x42\x8b\xc0\x61\xa8\xf0\x63\x15\x93\x58\xb2\x17\xba\x92\x7c\x42\xc4\x78\x2b\xd3\xb5\xd4\x18\x18\xab\x47\x06\x6f\x45\x39\xee\xaa\x42\xd2\x12\xb8\x86\xf8\x80\x72\x6f\x9a\x13\x0e\x23\xef\x6c\xe8\x7a\x0a\x25\x1f\x1c\xa0\x71\x90\xdf\x24\x94\xde\x60\xa6\xb4\xb3\x74\xd4\xa3\xac\x81\xa8\xd5\x7b\x29\x53\x53\xef\x31\x6a\x02\x38\x99\xab\x57\xe3\xfa\x88\x28\x8e\xf6\xf4\x08\x78\x69\x74\xe0\xab\xcf\xbf\x6e\xe0\x2b\x64\x5f\x71\xfc\x8d\x9d\xfa\x64\xce\x1d\xaf\x92\x23\x1f\x55\xbe\xf7\x3d\xe9\x89\x2b\x3c\x20\x64\x45\x18\x27\x77\x02\x7e\xf2\xf3\xca\x33\xdf\x57\x79\x04\x3f\x67\x32\xf8\xe1\xd3\x27\x10\x9c\xc1\x15\xf1\x52\xe2\x93\xd7\xcf\xe5\xbd\x4a\x89\x4f\x5e\xa5\xc4\x97\x9f\x13\x5f\xca\x89\x2f\xe5\xc4\x57\x9f\x13\x5f\xc9\x89\xaf\xe4\xc4\x47\x9f\x13\x1f\xc9\x89\x8f\x78\xe2\xb3\xe5\x03\x5a\xd6\xb5\x7f\x7b\xea\xcb\x92\x2d\x6a\x2b\xa4\x5e\x79\xb1\x94\x8b\x96\x8e\x15\x6f\x52\x89\x83\x44\xa0\x04\x36\x81\xc5\x39\xab\x51\x83\x1f\xf1\xdd\x3e\x71\x9d\xf8\x16\x37\x95\xe9\xb3\x9a\xa6\xb7\x3f\xdc\xe4\xc1\xcd\x9b\x65\x3e\xcf\x2d\x85\xd0\x37\x61\xc7\x80\x42\x3c\x88\x14\x98\x18\x22\xfb\x4d\xa4\xd8\x68\x38\x4b\x06\xbd\xc5\x42\x46\x34\x24\x81\xda\xa0\x41\xe7\x53\x36\x13\xce\xe8\xc7\xf5\x94\x08\x59\xa1\x36\xfd\xbe\xa0\xdb\xad\xcb\xe2\x2e\xa7\xa0\xd3\x0d\xef\x57\x34\x1d\xaf\x9a\xf0\x3f\xeb\x8a\x17\x5b\xbc\x38\xc2\xf8\xc0\xed\x13\x7e\x3f\xef\xe9\x04\x08\xa5\x44\xce\xf5\x4d\x77\xd1\x5c\xb7\x63\x4a\x66\xc7\x2d\xa2\xdc\x5c\x2f\x79\x9e\x66\x2a\xe5\xb4\x79\x37\xd7\x06\x91\xfa\x30\xe9\x0b\xd0\xeb\x30\x08\x6d\xb1\x10\xea\x1f\xfb\x34\xe0\xf6\x29\x09\xb8\x7d\xa2\x01\x8d\x59\x12\xd0\x98\xc9\x22\x4b\xc6\xe6\xa7\x92\xd3\xd1\x77\x99\x74\xb5\x8a\xb1\x1b\x31\x73\x8e\xc9\xe0\x86\xd9\xd5\x8d\x7b\x9a\x2e\xec\x20\xf1\xc7\xbb\xfe\x7c\x80\xb9\x1b\x62\xcd\x7b\x1b\x91\xc8\x05\xa7\x17\x78\xeb\xfb\x55\x5f\x21\xea\x8f\x1d\x96\x6a\xb1\x09\x10\x2e\xfa\x8a\x43\xe9\xe1\xb0\x09\x26\xe9\xee\x36\xbf\xb8\x40\xb7\xb5\xf6\x2d\xf8\x4a\x7e\x58\x68\xc4\x51\x28\x8f\x16\x12\x85\x68\x21\x99\xc2\x6a\x09\xef\x51\xa0\x1a\x64\xcf\x65\x17\x7c\xfb\x24\x8f\xb7\xcb\x45\x9d\xfc\x76\xd9\x5d\x1e\xa5\x65\x0a\x34\x88\xd6\xe6\x8a\x77\xcd\x62\x53\xfd\xb1\xf5\xc3\xf9\xa1\x78\x66\xd5\xfa\xa1\xb8\xec\x26\xb0\xe0\xf2\x7b\xc3\x44\x22\x74\xdc\xd3\x4d\x3b\xef\x20\x92\x77\x2c\xf4\xd4\xd5\x4d\xbb\xe0\x20\x52\x00\x55\xbd\xa4\x87\x06\xd9\x1e\xba\xa7\xec\x76\x73\xb1\xda\x07\xe6\x79\x0f\x83\x89\x4d\x20\xf3\x53\x83\xf3\xfc\xf0\x47\x9c\xf7\x38\xf8\xb4\x0f\x66\xd6\x8e\xfb\xc2\xb5\x11\xf3\xc2\x7f\xdc\x07\x2a\x37\xef\xb2\x13\x1f\x97\x29\x5e\xc1\xa9\x8f\x4a\x11\xf8\xaa\xaf\xb8\xd0\x51\x92\xb3\x6a\x67\x4f\xfb\xf5\x5d\x76\x8e\x7e\x2b\xb1\x36\x6c\x2b\x08\xf0\x3a\x3b\x1a\xcb\xe5\x5a\x14\xed\xeb\xaf\x62\x42\x0d\xc5\x39\xbf\x6d\x0b\xa9\xe8\xd9\x21\x9f\xcc\x6d\x76\xf8\xd0\x1c\x29\xb7\x4b\x78\xc5\x37\x85\x75\x0e\x3d\x6d\x27\x9d\x92\x09\xfb\xab\x32\xa3\x2a\xda\xe5\x3d\x3b\x09\x15\x46\x2c\x84\x10\x9f\x76\x37\xc3\x78\xde\x48\x70\xd8\xdc\xb4\xb4\x49\x3b\x97\x73\x38\x9f\xa0\x1a\x50\xae\x76\x79\x8f\x3f\x15\x4d\x19\xe2\x75\xec\x37\x33\x45\x03\x84\xab\x88\x9b\xfb\xa7\x1f\x37\x8b\x4c\x02\x3b\x97\xa3\x83\x69\x23\x88\x3c\xef\x49\x75\x1a\xf2\x6a\xf3\x7e\xb9\x6d\x0b\x2b\x84\x9f\x04\x2e\x84\x94\x52\x5b\x5a\xb2\x87\x74\x5e\xbe\xb7\x23\x1d\x00\xb7\x23\xca\x01\xf1\x32\x62\xe3\xe2\x82\xab\xe9\xd8\xa8\xa8\xc6\x2a\xda\x2e\x16\x25\x8b\x1e\x69\xc1\x89\xc5\x0e\xe9\xca\x23\x6a\xa6\x7b\xf0\x3a\x81\x72\xd2\x16\x09\x2e\xdc\x6c\x0a\xce\xcf\x6b\x32\x0e\x78\xd1\xd0\xa1\x93\x0d\x9b\x75\xea\xbe\x83\xd7\x4b\xba\x72\x47\x17\x72\x04\xb6\x3e\x13\xec\x61\x0c\x9e\xcf\x33\x56\x1b\x3a\xe8\xd7\xf2\x8e\x74\xe0\x68\x02\x63\xb7\x29\x48\x63\xf8\xb4\x9b\x02\x70\x2e\xb7\xee\xee\xdf\x53\xb0\x3a\x58\xf6\x64\x9d\xce\x43\xee\x98\xf3\x89\xe4\x2a\x14\x63\x4c\xb4\xd9\x21\x88\x4b\x08\xb8\x48\xe1\x90\x3e\x3e\x1c\x35\x97\x1b\x35\xd9\x6d\x77\xd2\x46\xa8\xd5\x41\x43\xb0\x8a\xa2\xfc\x7d\x85\xa5\x64\x8d\xd1\x69\xf3\x90\xb3\xc4\x57\x52\x56\x33\xe9\x48\x96\xfc\x1d\x2a\x66\xd0\x5a\x88\xf1\x25\xab\x06\x77\xc6\xc5\xe9\xee\xae\xf9\xde\xaa\xa2\x9d\xa2\x6c\x9d\x01\x9a\xf6\xce\x06\x84\x25\xbd\xb8\x50\x08\x1f\xe2\x24\xd5\x90\x15\xca\xdd\xb1\x11\xed\xb6\x9d\x9a\xa0\xa5\x5f\x2a\x22\x02\x8f\x32\x3c\xeb\x75\x26\x17\xf4\x58\x92\x6b\x76\x48\x73\xf1\x0a\xaa\xf1\xed\x3f\xdb\xf3\x13\xd8\xcf\xf2\x79\x39\xa3\x3d\xb6\x31\x93\xa2\x27\x68\x4b\xd0\x2e\x22\xc8\x4e\x82\x6e\x27\x44\xdc\x26\x5e\x6f\x63\x6e\x87\xf4\x19\x3b\x70\xbd\x74\x31\x50\x5c\xb3\x5e\xb5\x14\xc7\x9c\x5b\x2a\xe2\xef\x9a\x17\xb9\xdc\x0f\xbb\xba\xcf\x33\xd0\xb0\x02\x7f\x37\xe7\xec\xd8\x81\xdf\x3e\xfa\x04\x4b\xfe\x6c\xc7\x4b\xdb\x12\x4d\xb7\xb4\x2d\x13\x9a\x07\xcc\xc9\xc2\x1b\x14\x6a\xab\x12\x5d\x20\xa5\x6c\x3e\xab\xe0\x81\x52\xbb\xde\xce\xe5\x6c\x78\x83\x0a\xec\x3b\x58\x21\xda\xe5\x76\x9e\x68\x57\xdb\xea\x8f\x2d\xdd\xde\x93\xa2\x68\xa0\x6e\xff\x86\x10\x5a\x73\xc0\x5c\x9a\x3c\x35\xda\xb6\x4e\x41\x0a\x19\xbc\xc4\xff\x35\xa1\xfd\x25\xdc\x2e\x42\x15\xab\x4f\x20\xa4\x02\x90\x91\x80\x47\xd1\xb7\xf6\xa4\xd0\x62\x10\x05\x8b\x14\xbb\xc0\xd3\xa8\x3f\x28\xe0\xd4\x8a\x06\x38\xe7\x65\x3a\x41\x4e\xe6\xc6\x61\x92\xed\xa8\x0b\xba\x46\xd6\x17\x40\xee\xc0\x7b\x6d\xc1\x48\x25\xe7\xb7\x9b\x8a\x45\x0b\x29\x5a\x8d\x0b\xca\xae\x29\x1b\x79\x27\xbf\xa1\xae\x0d\x66\x93\xe9\x9a\xed\xad\x91\xe9\xda\x60\x38\x99\xae\xa5\x09\x99\x1c\x2d\x4d\xe8\xe6\xcf\x3d\xa1\x0f\x76\x46\x8b\x68\xd0\xe2\x7c\xf6\x7e\xb8\x90\x29\x33\x4f\x8c\x80\x9f\xcb\x79\xbf\xfd\xd5\x15\x00\xb9\x5d\x0a\xd8\xfb\xbb\x1a\x24\x29\x7d\xa8\x82\x87\x1f\x3c\x90\x07\x63\xa7\xf8\xe0\xf1\xeb\x60\x41\xd0\x11\xad\x83\x8f\x1f\x1a\x44\xf1\x51\x8f\x80\x64\x8c\x38\x6a\xf2\x5e\x61\x0a\x08\x81\x51\x69\x66\x3c\xac\x52\x0f\x78\x60\xea\x01\x0f\x7f\xd0\xe5\x8c\x79\xec\xbf\xa9\x3c\x40\xcc\xa2\x95\xd5\xeb\x9a\x36\x97\x84\x5b\x45\xdd\x0c\xc6\xbb\x33\x61\x7a\x36\x7b\x3a\xb7\x40\x77\xb5\xaf\xcd\xc0\xac\xb9\x96\xa5\x88\xeb\xfd\x4b\x31\x6b\x9f\x09\x76\xb8\x51\x00\x2f\x52\x9c\xa1\x42\xd0\xe2\x10\x4c\x02\xd8\x85\x3e\xea\x63\xa7\xd0\x07\x6f\xfb\x75\x4b\x51\xec\x42\xa0\xfe\xd8\x52\x51\xc4\xbf\x9d\x42\x9f\x7e\x33\x40\xaf\x63\x61\x44\x20\x44\x11\x0a\x50\x5f\x35\x42\xcc\x63\xe8\xc8\xb7\x29\x1a\x3c\xbe\x10\x55\x65\xa7\x45\xa1\x39\xb6\x50\x84\x43\xb3\x6a\xa1\x09\xe6\xb5\xd5\xce\xef\x95\xd4\xdf\xf5\x08\x41\x39\xd1\xf7\x89\xaa\xa2\x3e\x2f\x74\xc4\x2a\x91\x0f\xcd\x23\x0b\x8d\x78\xca\x88\xa5\x1c\xfd\xa0\x29\x45\x75\xa3\xc2\x88\xa5\x64\xb7\xdb\xa2\x7a\x7d\x14\xa2\x00\x8d\xf8\x5c\x0d\x70\xc8\xc9\x6c\xa8\xc2\xdd\x14\x07\x9c\xab\x73\x05\xe5\x33\xc5\x5e\x22\xfe\xe0\xf3\xc8\x1d\x36\x8b\xce\x1a\xac\x60\xb6\x2c\x6e\x7d\x57\x78\x83\xcd\xb1\x95\x17\xaf\x55\x4b\x45\xa5\x1f\xdb\xaa\xe0\xd3\xde\xba\x04\xdf\xd1\xcc\xe6\xf1\x2b\x41\xed\x57\x62\xa1\xde\x81\x38\xac\xef\x12\x06\xf8\xe4\x95\xa0\x92\x6a\x7c\x63\x4b\xf1\x2d\xee\xd0\xc0\xd3\x86\x18\xbd\x67\x3c\xcb\x12\x26\x9d\x3a\x7e\x49\x42\x28\x13\x7e\xad\xb4\x8f\x78\xdc\x4b\x8f\x60\x6e\xc8\xe7\xa9\xcb\x19\xa6\x73\xbc\x09\xc5\x1c\xa1\xf6\x11\x41\xd7\x87\x3c\xa9\x5f\xc1\x57\x34\x9c\xd0\xe2\x7f\x6c\x8b\x50\x9e\xda\x7b\x25\xe8\xe8\x88\xa0\x8e\xc0\xa2\xa0\x82\x7d\x8a\x31\xa7\x47\x70\x58\xc3\x2b\x9b\x1e\xd9\xf0\xbe\x8a\x05\x55\x79\x47\xd9\x34\x82\xdc\x84\xce\x8c\x7a\xbc\x2f\xc8\x94\xa0\x73\xa1\x55\x77\xc6\xc2\xba\x52\xd8\xdb\x0e\x7e\xcd\xb6\x78\xd1\x25\xf8\x4d\x6a\x32\x54\xe4\xac\x4a\xe8\xfc\xbf\x63\x4e\x36\xd8\xe8\x55\x59\xe5\x1f\xdb\xa8\x3b\x44\xc7\xa2\xea\xd3\x29\x3f\x0f\xa9\xae\xe3\x4b\xee\xf4\x61\x8c\xdf\xa3\xe1\x78\x40\x42\xdd\x65\x87\x47\x5e\x6c\xb8\x18\xfc\x01\x1e\x57\x45\x95\x1f\xbb\x84\x05\x9d\x26\x41\x0f\x5d\x82\xdd\xfd\xdb\x90\xe8\x37\x21\x17\x9a\x19\xdc\xb3\x44\x47\x49\xa2\xab\x1e\xc1\x25\x2e\x7d\x4f\xee\x78\xe1\x23\x3e\x43\xe4\xb3\x09\xaf\x8a\xbf\xf5\x0e\xf8\xa4\x6a\x48\x11\xaf\x5d\xc2\x46\xe7\x2c\xe9\xbf\xcd\x2e\x63\x20\x43\xde\x11\xda\xdd\x14\xf8\x00\xc4\xf9\xb5\x22\x77\x95\x2b\x11\x1f\xf3\xe6\x27\xe7\xf4\x45\x38\xb6\x79\xad\x82\x4b\xd9\x3d\x17\xdc\xca\xa6\x82\x04\x10\xe3\x58\xda\xe8\x5e\x3b\x67\x5e\x95\x40\x36\xd0\xf0\xf7\x82\x54\x16\xb5\x8f\x3d\xd3\x87\xd3\xd1\xbe\xd6\x73\xa5\x2d\xaf\x9f\xb9\x68\x49\xcd\xb6\x65\xb7\xa7\x2a\x7c\x12\x8a\x0f\x89\x8b\x7e\xfb\x93\xc0\xe7\xa3\x42\x96\xa4\x20\x5c\x93\x68\x3d\xd7\xc2\xef\x23\x4f\x4f\x54\xf0\x62\xc9\x06\xbc\xec\x96\xff\xe0\x73\xcb\x69\x37\x35\xaf\x91\x8b\x4b\x46\xa9\xf8\xdb\x35\x5c\xd1\x1e\x8f\xee\xff\xc0\x48\x16\x84\x08\xe9\x8f\x52\xf1\xbb\x9b\xe7\x5f\xc8\xe7\x09\x8a\x3c\x41\x31\x93\xa0\x68\x01\xfb\x3a\xaf\x2b\xa6\x2f\x64\x50\x2d\x04\xef\x00\xd4\x42\x66\x92\x0e\xde\x01\x12\xf2\x2c\xd5\x70\x98\x6a\x9f\x79\xed\x58\x8a\x83\x3c\x35\x76\xb1\x63\x4e\xe6\x96\x52\x3d\xa6\xac\x2c\x7b\xbf\xeb\x66\x78\x55\x87\xee\x82\xc8\xa5\xbf\x8c\x5f\x75\x40\xef\xcd\xa5\xbf\x56\x1c\xdf\xe1\x29\x30\xdc\xc6\xb7\x3b\xed\xb6\xbc\x42\x80\x39\x1d\xec\x9a\x60\xd3\xce\x5c\xa2\x5c\x3c\x29\xae\xf6\x50\x53\xd1\x05\x97\x83\x50\x55\xc3\x33\x4b\xd6\x6f\xde\x0a\x43\xa5\x5f\xc0\x65\xc3\x91\x25\x44\xee\xf1\xe6\xb2\x48\xe0\xca\x45\x55\x7b\xae\xee\x6a\x3d\x17\x39\x5e\x34\xf5\xc6\x6c\x75\xa8\x3f\xa6\xee\x9d\x1f\x6a\x7a\xa7\x07\x45\x22\x2e\x97\x76\xe0\x31\x52\x15\xb1\xe3\x01\x15\x79\x11\x4b\xe2\x45\x5f\x26\x89\x2e\xa1\x94\x75\x7c\x37\x22\x32\xbf\x5e\xcb\xa2\x1c\x45\xfa\x22\x28\x0b\x5c\x3e\x2d\xf9\x58\xa3\x78\x76\xd6\xce\x8a\xb5\xe4\x41\xa9\xd6\x70\xf3\xf8\xe0\x89\x99\x2a\x84\xb3\x05\x2f\x9f\xff\x8c\x75\xa6\xf3\xc3\x43\xee\x0f\xcf\x8a\xef\x68\xf5\x56\x74\x38\xef\x90\xb3\x36\xeb\x84\xaa\x9f\x6c\xe9\xda\x59\x5b\x45\xa7\x6d\xd6\xca\xd3\xb6\x68\x65\xd5\xcf\xb6\x32\x06\x0d\x84\xaa\xff\x07\xe0\x7d\x80\x21\x00\xd4\x1f\x97\xf3\xdf\x69\xf5\xc7\x2f\x85\xd9\xe9\x20\x82\x11\xc8\x71\xcf\x10\x1a\x08\x63\x8b\x52\x05\x74\xbf\xee\x83\xb5\x0c\xc3\xe6\x76\x32\x1c\xec\x50\x54\x77\x55\xda\x43\xbc\x0b\xfa\x79\xff\xbb\xe2\x68\x6f\x05\x0f\xe6\x0e\x74\x19\x7b\x47\x76\x3e\xf8\xae\x94\x0a\x8a\xa3\xcd\x0b\x1e\x4c\x1c\xd0\x86\x64\xef\xaa\x25\x1b\xad\xc8\x0e\x99\x69\x19\x84\xae\x99\x92\x41\x20\x17\x83\x98\xc3\x6b\x75\xf5\xb9\xcb\xe8\x1e\xcc\x39\x25\x0a\x21\xf9\xbc\x97\x6a\x54\x80\x07\xe2\xf7\x70\xc8\xcc\xde\xeb\x3e\x3a\xbe\xd7\xdf\xe3\x38\x25\x53\x7d\xf5\xdd\xc7\xf5\x26\x93\x0b\x04\xc9\x8e\x1e\xdc\xa4\xa4\x07\xf4\x7d\x5c\x34\xfa\xec\x6a\xaa\x2f\x96\x8e\x10\xfb\x66\xdf\x32\x02\xed\xf8\xde\x0c\xb5\x76\x64\xe1\x30\x8e\x69\xbd\xcd\x1a\xa5\xbf\xe2\x46\x13\x1c\xc3\x26\xfa\x07\xe9\x02\xd5\x68\x2e\x79\x52\xce\x7a\x56\x4c\x97\x2d\xf0\x42\xe5\xe2\xe5\xa3\x22\x0f\x17\xb9\x62\x07\x91\x14\x3b\x6c\x68\x08\xa3\x0d\x89\xe9\xd3\xd1\x3b\xed\x2b\xae\x38\x58\x0a\xb4\x37\x14\x68\x73\x55\x35\xfa\x7b\x8e\x79\x35\xb7\xf2\x01\xfd\xcd\xe5\x14\x2f\x8f\xa5\x80\x42\x5f\x8d\x1d\xed\x66\x81\xbd\xdf\x10\x2a\x5f\x85\xd4\x9b\x9f\xbc\xcf\x11\xba\x41\x2b\x36\x65\x00\x88\xf6\xb6\xa3\xa4\x1e\xc8\x31\xf6\xf9\xe6\x60\x5a\x1c\xb7\x96\x04\x6d\x08\xa5\x91\xd0\x8c\xe8\x84\x12\x44\x08\xa4\x87\x7c\x54\xa3\x11\xaf\x5d\x12\x53\x02\x31\x84\xdb\x03\x32\xa5\x74\x21\x28\x5e\xb0\x80\x28\xa0\x6b\xa4\xe9\x20\x27\xbf\x5d\x2e\x22\xa7\xb0\x5d\x2e\x5a\x4b\xe2\x98\x6e\xf6\x0e\x13\xbb\x66\x48\x09\x49\xa2\xbd\x36\xe8\xdb\x04\x47\x5a\xfb\x96\xdd\xf3\x05\x7b\x13\xb6\x4a\x7f\x7c\x04\xbf\x27\x5c\x6f\x20\x1d\x88\x19\x2e\x1a\x33\x71\x4f\x36\x63\xf0\x5e\xb0\x63\xce\xf8\x35\xe1\x0b\xcb\x5e\xb2\x3e\x3e\x5e\x58\xf6\x92\xa5\x8a\x64\x84\x2e\x7d\x91\x76\x3b\x45\x91\xf6\xb0\x40\x23\x64\x06\xe8\xc5\x52\xd1\x02\x73\xf3\x94\x76\xbe\xe3\xe5\x23\xad\xe7\xd2\xe7\x4c\x45\x07\xd8\x6d\x8a\x43\x69\xcd\xb7\xb5\x11\x53\x2b\xe2\xef\xfb\x07\x98\x68\x53\xad\x0e\xc7\x58\x2c\x88\xf1\xd8\x3c\xf5\x43\x33\x4d\xfd\xd0\xfc\x94\xfa\xa1\x99\x49\x7d\x2f\xa5\xbe\xff\x9c\xfa\xbe\xa9\xea\xdf\xa4\xe4\x76\x2d\x65\xa9\x7d\x5b\x73\x6a\x69\x6e\x5b\x7a\xa7\xe1\xca\x01\x3e\xa2\xd8\xa2\x4d\xcd\x96\x25\xe0\xd9\x35\x15\x65\x43\x9c\x1a\xdd\x6c\xfa\xa0\xb7\xd2\x8e\xf4\x05\x0a\x89\xed\x85\xfa\x01\x3a\xef\xe9\x36\x7a\xd3\x5f\xe8\x76\x39\xd7\x5f\xe8\x42\x4c\x59\x41\xdd\xe3\xc6\xa5\x7c\x74\xb3\x80\x53\xc2\x38\x86\x8b\xe4\xbe\xd9\xb6\x98\x51\xf1\x44\xe4\xa3\x2f\x61\x6e\xb3\xf9\x49\xea\x72\x3a\x42\x1e\x76\x4d\x87\xee\xf1\x1e\x9d\xc4\x4c\x32\x68\xdd\x4f\x8f\x0d\x53\xd1\x0c\xba\x20\x8e\x1d\x4b\xe9\x80\x71\x71\xb0\x30\xf7\x5a\x65\x17\xa5\x80\x50\x01\xe5\x71\x4e\x23\x85\x68\x36\x6a\xbc\x12\x15\x10\x6d\xb3\x4b\x90\x87\x47\xda\xdd\xa6\xe2\x99\x6f\x70\xf5\x39\xba\x47\x91\xca\x5d\x34\x1d\xf7\x15\x5f\x7b\x43\x3e\x9c\xfe\xe2\x91\x76\x3e\x40\x23\x3c\xd2\x16\x9b\x68\x82\x7d\xed\xcd\x98\xe4\x47\xe6\xd8\xfa\x1d\x99\x8e\x4b\xa7\x29\x04\x16\x68\x10\xe3\xbe\x67\xd8\xd7\xe6\x85\x91\x59\xb5\x8c\xd9\x5e\x44\x17\xe8\x5c\x4e\x81\x40\x21\x5c\xd7\x0a\x95\x09\x9a\xa1\x11\xd8\xa1\x02\x89\xe8\x10\x53\xe2\xc8\x43\x21\x9d\x3e\x74\x9f\x0e\x28\xd2\x39\xf9\xf1\x80\xa0\xdb\xa9\x1e\xa2\xf6\xad\xee\xa1\x87\x85\x3e\x42\xe7\x74\x5b\xe9\x6b\xe7\xe8\x5e\x21\xda\x6d\x19\xd1\xb5\x91\xc9\xd8\x3d\x5c\xab\x6a\x6c\x04\x62\x79\x66\x6b\xa3\x2b\xd6\xc6\x10\xbb\x66\x1f\x74\x22\xb8\xaa\x43\x98\xcb\xf5\x9e\x94\x00\xb1\xc5\x83\x72\x65\xa6\x23\x9d\xc1\xb7\x23\xdd\x46\xad\x8a\xee\xa3\x97\x9e\xf7\xaa\x3b\xa8\xb9\xd0\x03\x79\xd1\x69\x65\xcf\x40\x5f\x7a\x44\x9c\xb7\x10\xed\xf2\xf9\xe3\x63\x9d\x3e\xb4\xbb\xfe\x0a\x71\x1a\xa2\x05\x15\x73\xee\x58\x8c\xee\xa5\xdc\x1a\x5c\x59\x02\xb3\x86\x7c\xfc\x3e\x1d\x8e\xf4\x22\x0a\x3d\x7f\xaa\x17\xb9\xde\x2e\xa1\x5c\x10\xee\x04\xfb\xee\x77\xa2\xf9\x15\xdd\x83\x87\xb0\xe3\x57\xd2\x76\xbe\x3b\x19\xa5\x61\x9a\x1e\xd9\x74\x09\x0b\x2a\xc8\xd9\xd4\xdb\x87\xc8\xdd\xd4\x89\x36\xbc\x8b\x0d\x10\x40\xa4\x95\x38\xc7\xd8\x3e\xfe\xf8\x60\x6f\xb7\x55\xb2\xbf\xfd\xdd\xe1\x25\x5d\x75\xf7\xbd\x82\x53\xf0\xcd\xb1\xa5\xb3\x97\xaa\x65\x3c\x12\x90\xdf\xce\xe6\xbb\x3e\xdc\xa7\xa5\xa7\xf9\x5c\x9e\x5c\x77\x39\x00\x95\x65\x04\x01\x48\x68\xe5\x91\xa5\xb2\x4a\xe4\xa1\xd5\xb2\xb1\xab\x83\x6b\x85\xf6\x1b\xf2\x11\x9d\x89\x27\xb2\x70\x70\x7b\x05\xfd\x3c\x0b\x43\xa1\xab\xa7\x4d\x41\x3d\x2d\x9f\x77\x55\xb1\x05\xc0\x8c\x76\x91\xad\x22\x07\x3f\x0c\x80\x9c\x5d\xb5\xef\xbd\x36\x65\xd7\x2b\xb0\x78\xcd\x0c\x69\xd4\xd6\x65\x7f\xa4\xa9\x62\x23\x40\x97\xec\x60\xf3\xb4\x64\xff\xfc\x8a\x5f\xbc\x3e\x23\x22\x7c\xd5\x9d\xc5\x5f\x19\xb1\xb7\xcf\xa4\xf3\xe0\xb7\x4f\x55\xf1\x6b\xff\x4a\x55\xc6\x82\x21\xeb\xd4\x11\x51\xbf\x2c\xfb\xaa\x47\xa4\xc2\x67\xab\xfa\x21\xd9\x35\xed\x0c\x22\xdb\x58\x0c\x47\x32\x72\x0d\x02\xcb\x8c\xec\x88\xee\x65\x45\x73\x90\x8d\x45\x4b\x04\x08\x76\xde\x2a\x7c\xfd\x34\x13\x38\xe9\x10\x1d\x67\x29\xb1\xf7\x51\x55\x37\x2d\x34\xa6\xbf\xb1\x38\x80\xd5\xc6\x7e\x2e\xa7\x38\xda\xa8\x8a\x4d\xfa\x61\xa9\x49\x4c\xd0\x82\x98\x31\xc4\x04\x2d\x60\x73\xfa\x63\xcc\x09\x00\x58\x75\xa7\x4c\xfa\xa8\x8a\x99\xa6\x1b\x7f\x5d\x74\x55\xe3\x51\x69\x9d\x2b\x36\x5c\x09\x7f\xb2\xa8\x64\xe3\x93\xe4\x62\x09\x14\x29\x3c\x2e\x24\xe0\x22\x1f\x73\xae\x5e\x63\x4c\x3d\x4c\xf8\x00\x27\x9c\x31\x43\x91\x42\x09\xf1\x73\xb0\x42\x09\x15\x55\x34\x13\x9c\xb9\x49\x2c\x83\x60\x85\x0f\x30\xb9\x33\xc1\xf5\xc7\x3c\xbd\xc6\x32\xd8\x3e\x0e\x53\x60\xc1\xbd\x91\xef\x43\xf3\xe9\xae\x05\x02\xf9\xc8\x05\xb5\xb3\x85\x58\xd6\x89\x79\xfd\xc6\xb5\x8f\xe8\x0b\x25\x86\x69\x3f\xd0\xf4\x67\x17\x70\x62\xb9\x5e\x42\x0b\x14\xa0\x17\x6e\x1b\x15\xf1\xc3\x04\x55\x55\x55\x7d\x96\xcb\x5d\x3f\x29\x33\xed\xf8\x5e\xbe\x73\xeb\xab\xef\xb4\x63\x99\x1a\xa0\xe1\xe6\x72\x9f\x21\x8a\xd2\xb5\xb7\x02\x5d\x3e\xe6\x05\x5f\x45\x81\x14\x4a\xc3\xd4\x4f\x25\xc6\xe8\x5b\xca\xd8\xa4\x87\xe7\xda\xed\x13\xf7\xae\xf7\xc5\x90\x1d\x07\x89\x68\xd4\x09\xc3\x1a\xed\xf6\x49\x3b\xef\xb1\xe7\xa8\xc9\x48\xc2\x55\xc3\x72\xdc\x57\x68\x1a\xb0\xa8\xf4\x86\x92\xd7\x39\xc3\x16\xde\x26\x0f\x96\x25\xa9\x59\x01\x34\x2b\x60\xcd\x4a\x46\x97\xc0\xd0\x92\x64\x5c\x03\xd1\x3e\xc2\x1a\x27\x13\x52\x33\x70\x01\xfd\x0e\x06\x25\x74\x41\x87\xf0\x4a\xf3\x14\x6a\x8c\x1c\xad\xde\xc3\x6c\xd3\x31\x3d\x2b\x01\x61\x6b\x8d\x19\x20\xf7\x53\x03\x73\x6a\x42\x6b\xcc\xb4\x76\xc4\x9e\xe7\x3d\x55\x5a\xf3\x52\x9d\x2d\x59\xc4\x8c\xd2\x47\xfb\x8e\x6e\x1b\x84\x9b\xae\x22\xa0\xc2\x6a\x4e\xc1\x59\x27\x9b\x21\xe5\xe2\x77\x85\x14\xc0\x52\x25\x44\xb8\xa0\xd2\x6a\xd6\x2d\x85\xc6\xb8\x05\x22\x15\x93\x3f\x3b\x20\x79\x92\x3f\xf5\xc0\x79\x42\xde\x96\xe6\xf1\x51\x33\xab\xd0\xcb\xea\x71\xe9\xa3\x13\x5f\xcd\x4f\xbc\xfc\x29\xdc\x83\x7a\x01\x5a\x64\xc4\x0b\x4f\x3e\x93\x49\xbe\x0d\x7b\xe6\x94\xee\x97\x5e\x34\x1d\xf7\xbc\x09\x5d\x0c\x50\x90\xe2\x8a\x4b\x89\xd0\x00\x7b\x8c\x72\x84\xaf\x8c\x65\x05\x37\x63\x59\xc1\xc1\x1e\x23\x00\x5d\x4a\x0f\x1a\x41\xfa\xe9\xc0\xe7\x11\x9c\xcf\x07\xcb\x66\x17\x24\xf8\xf7\x4d\xe6\x48\x30\xc0\x27\x57\x0a\xd1\x1e\xba\x04\x05\xea\xb2\x25\x06\x29\xfd\x43\x53\x44\x8a\x1b\xc2\x00\x9f\xc7\x44\x7b\xec\x12\xb8\xd2\x39\xb9\x50\x02\x44\x51\xd5\x6c\xb9\x74\xed\x31\x9f\xab\x20\x2d\xe8\xc8\xb7\x49\xae\x56\xff\x8b\xb2\x59\x4e\x0a\xb7\xfe\x97\x8a\x3c\x2d\x78\x52\xe8\x2b\xba\x0d\x54\x35\xc9\x7a\x72\xa1\x38\x48\xc2\x7e\x81\x95\x7f\x7a\xac\x17\x85\x37\x20\xe6\xef\x87\x09\x03\x8f\x41\x18\x98\xee\xbc\xc0\xd9\xba\xf9\xbc\x0a\x35\xb6\x4d\xd7\x92\x4b\xc8\xd4\xdb\x90\xf4\x4f\x5d\x86\xf8\xb4\x3f\xae\x88\x42\xbf\xe8\x36\xcd\x1b\xf1\x4d\x7c\x27\x15\xa6\x7d\x80\x82\x2f\x21\x27\xe6\x43\x35\xbf\x96\xcb\xd1\xdf\xcf\x25\xf8\x35\xa9\x04\xf1\xf9\x8f\x0b\x48\x5c\x8d\xc6\xff\x40\x85\x35\xc1\xdc\x6a\x76\xe3\xb2\x31\xc6\x97\xfb\xe6\xd6\xce\x0e\xe2\xff\x5b\x7a\x73\xa0\x00\x85\xd2\x18\x28\xa7\x94\x48\xd1\x4a\x29\x15\xca\x0c\xda\x66\xd9\x53\x87\x71\xa4\x76\x0c\xc7\x51\x4b\x91\x97\x48\x58\x92\xa6\x11\x24\x52\x16\x2d\x64\x23\x9b\x12\xa5\x5e\x75\x7f\x41\xd7\x17\xaf\xaa\xc6\x2a\x62\x42\xbd\x9f\x60\x53\xc6\x25\xad\xfd\xe3\x0a\xdf\x61\xfc\xc2\x67\x11\x0a\x05\x4d\x3b\xd1\xe7\x14\x52\x1b\xcf\x44\xdc\x5d\xa4\x57\x16\x43\x71\xb1\x71\x38\x90\xce\x94\xfd\xfb\xc4\x6b\xf1\xc3\x13\xc1\x7d\xee\x37\x32\xc2\x3c\xfe\xe5\x36\x89\x7f\xbd\x95\x65\xe2\xca\x49\xb8\xcd\x44\xb4\xce\x2f\x12\x99\x08\x76\x8c\x3d\x16\x17\x1e\x67\x07\xcc\x1d\xe0\xa5\x22\x2e\x14\xc2\x0b\x6c\x32\x85\xa9\xf5\x12\x57\x2d\xbd\x65\x9b\xe4\x54\xd0\x4d\x36\xdf\x9f\xc5\xee\x8c\x78\xa3\xb5\x4b\x1f\x71\x73\x17\xbe\xcd\xc1\x9d\x96\x21\x2f\x17\x70\xe1\xca\x27\xb6\x88\xbd\xa8\x60\x90\x6e\xb9\x99\x12\xe4\x83\xe0\xe9\x99\xb8\x43\x38\xbb\x57\xd4\xf8\x41\x79\x14\xe6\x67\x1e\xaf\xf9\x29\x69\xc6\xfe\x4c\x82\x3d\xc2\xb7\xcb\xed\x22\x51\x2c\xb5\x0d\x47\x7b\xad\xc2\x11\x84\xf6\xda\x90\x4f\xa6\x84\x99\x0d\x30\xd2\xc2\x75\x0b\x97\x8e\xcc\x59\xb8\x6f\x81\x64\x76\xe7\x56\xeb\xbb\x8a\x6a\x84\xb2\xe9\x45\xfc\x1e\x0e\xf5\xbe\x76\x3b\xd5\x9e\xba\xa8\xdb\x63\xaf\xe3\x5e\x6c\x84\xd0\x62\x9a\xcb\x9c\x39\x96\x42\xf9\x36\xca\x6e\xd6\xe0\x95\x9d\x75\x38\xa0\xa4\x3e\xc2\x3e\x9a\x08\xae\x2f\xd2\xde\x7a\xe4\x7b\xa8\xdd\x4d\xcd\xb1\x95\x87\xe7\x91\x85\x22\x6d\x2e\x42\xab\x2c\x14\x2e\xcc\x22\x73\xb0\xb0\x44\x62\xf9\xab\x6a\x51\x32\x29\xa4\xe5\x8d\x2c\xf4\x02\xac\x23\x1c\x64\xcc\x54\x14\x02\xf7\xc8\x4f\x30\x46\x2a\x65\x1e\x5f\x28\xf3\x08\xf1\x0f\x0b\x7d\xc2\xf8\xc7\x08\xf8\xc7\x90\xf2\x8f\x21\x7a\x41\x13\x34\xa3\xac\xa3\xc7\xeb\x4f\xbb\x14\x38\xff\x73\x9d\x32\x9a\xa3\x7b\x3d\x8c\xd5\xd8\xc1\xef\x8c\x15\x73\xb4\x4b\xc1\x77\x39\x14\x33\x9e\xba\x44\x77\xb4\xbb\x29\x3a\x5e\xe8\x9b\x91\xe2\x22\xb7\x8d\x22\x9f\xa0\x83\xae\x8a\x9e\x5e\x69\xdc\xb4\x8a\x4e\xea\xba\x33\x54\x5c\xb4\x38\x54\xd1\xdd\x4f\xfd\x81\xa6\x7b\x68\xa8\x08\x3c\x3f\x71\x53\xed\x1d\x1a\xf8\xed\xa6\xad\x52\xc6\xcd\xa7\xa9\xef\xda\x70\xb1\xe5\x64\x6e\xb5\x1c\xb8\xd2\x42\x2d\x4a\x01\x93\xb0\x17\x44\x7a\xb5\x8d\x26\xb6\x7e\x1e\x03\xab\x3a\xd1\x3d\x14\x54\xf5\x05\x6c\x57\x94\xe3\x4f\x49\x65\xca\xc3\x9a\x16\xaa\xf7\x98\x5e\xc5\x53\x83\x3d\xc3\x3e\x94\xc0\xf5\xa9\x5b\x0d\xa5\x98\x38\x5b\xa4\xf3\xaf\x28\x26\xa5\xd2\x7c\x05\x82\x5f\x12\x86\x7d\xbd\xdd\xe7\x4f\x85\x73\x3a\xde\x58\xc9\x68\x47\x9f\x2d\x5f\x17\x13\x3e\xe9\xf9\x89\xe0\x2a\x39\x97\x93\x32\x76\xa5\xdb\x7a\x1e\x2a\x16\x8e\x97\xd4\xa9\xe5\xed\xc2\x20\x70\x3f\x4a\xc4\x9d\x24\x88\xd1\xf0\xdb\x48\x22\x68\xa4\xc4\x6b\xda\x10\x73\x35\xf3\xd3\x32\x7d\x4f\xa4\x92\x01\x0e\xb9\x93\xe7\x4f\x80\xdf\x63\x14\xe1\xa2\x11\x49\xac\x25\xb7\x1d\x31\xc2\xb6\x19\x59\x90\x85\xe2\xc9\x48\xda\x8e\x47\xc2\xba\x04\x9c\x3a\x46\xa2\xb3\x26\x74\x1f\x32\x47\x16\x08\x6a\x46\x68\xe4\xe9\x6c\x63\x98\xa8\x74\xc1\x25\xf8\x3d\xa8\xea\x01\x1d\x1e\x76\xe4\xec\xa8\x74\x90\x38\xb1\x67\xa9\xe9\xc8\x94\x90\xb8\x7a\x83\x7e\xa6\x8d\x7d\xb9\xdd\x0f\x14\x55\x27\x74\x81\x0c\xe2\xda\xeb\x92\x5f\x77\xd6\xee\x54\xb4\x55\x95\x05\xbf\x4a\x14\xc4\xdb\x9b\x9c\x25\xcb\x20\xb2\x8c\xdd\xaa\x05\x85\x7d\xbb\xd3\xb2\x1e\x7a\x84\xab\xb2\x97\x5b\x78\x67\x8c\x22\x1f\xac\x8f\x8f\x75\xfe\x66\x9e\x2e\xb8\xc0\xda\x50\x15\x62\xa7\xc7\x62\xa1\xbd\x5d\x20\x1e\x95\x34\x72\x8b\xb2\xac\x7c\x64\xce\x0e\xcc\x29\x68\x7a\x8a\xa2\xc2\x0b\xb3\x68\xa9\xb7\xdc\x6a\x8c\xb6\x08\x11\x49\xc5\x5e\x44\x8a\x92\x95\xf1\x47\xbf\x08\x8d\x2e\x13\xb0\x53\x0d\x4f\xbc\x5c\x80\xb7\x66\xb0\xa7\x04\xd9\x2f\xae\x65\x88\x5f\xed\x13\x87\x03\xcc\x3b\x86\xdd\xda\xaf\xf3\x6d\x8c\xcb\x46\x9f\x94\x05\xaa\x3d\x3c\x11\x45\x45\xc9\x26\x57\xe4\x57\x26\xd3\x51\xd6\xdf\x3b\x08\xcc\x0b\x3f\xf4\x2a\x87\x72\x51\x49\x1d\xc1\x6e\x5a\xda\xdb\x98\x63\x11\xf3\x33\xc8\xa4\xe0\xf6\x79\x8f\x6a\x63\x1f\xd3\x0d\xfe\x5c\x70\x86\x36\x2f\x75\xa8\xdd\x3e\x25\x9c\xf6\x3b\x9c\x5b\x8e\x9a\x4c\xfc\x6f\xd4\x94\xa4\x84\x59\x11\xb6\xf6\x06\xd2\x1e\xec\x7d\x1e\xc7\x4c\x40\x4a\x97\x4a\x81\xb5\x22\x0b\x5a\x45\x12\x32\xed\x14\xf9\xbd\xce\xeb\x52\x1b\xd3\xf6\x7d\x7c\x7c\xaa\x7e\xd0\xc2\x42\x3a\x31\x85\xfd\x9e\x0a\x2a\xd2\x4a\xaf\x97\xfe\xbe\xbe\x69\x55\x83\xd6\x3f\xab\xaa\x71\xa7\xcd\xfe\x50\xd3\x8b\x94\xd5\xa6\x49\xdf\x96\x92\x66\xa2\x25\xf3\x00\x82\xde\x13\x0c\x1e\xad\x00\xf0\xa9\xf4\x45\x58\x12\x06\x67\x01\x69\x33\xec\xa4\x19\x48\xc8\xeb\x6d\xab\x6a\x7c\xa7\x4d\xfe\x75\x6c\xc1\xe0\x88\x5d\xac\xdc\xdd\x39\x41\xc2\x66\xa4\x1d\xab\x46\x06\x5f\x38\x7d\xf5\x0a\x15\x87\x11\x7c\xf9\x43\xbf\xa4\x89\x85\xb8\x2a\x8c\xf9\xeb\x2a\x8a\x25\x3b\x87\xb5\xe3\x05\xc6\x07\x5d\x59\xcf\x95\xf0\x31\x81\x75\x06\x18\x3c\x24\xaa\x7c\x31\x41\xef\xc2\x14\x9e\xb4\x16\x31\xf5\x0a\x3e\x90\xb9\x5c\x76\x50\x25\xd2\x75\xf3\x3a\xab\x1d\x93\x2c\x24\xc9\xe5\xdc\x69\xd9\x8c\x40\x29\xc8\xd9\xa7\xdc\xb3\xce\xe5\x1d\xef\xb4\xb3\xfb\x4f\xe6\x67\x16\xa1\x36\x50\x16\x0d\x94\x21\x31\x27\xa3\xc4\xf9\x23\xc4\x57\x97\xe2\xa7\x4b\xf1\x07\x4b\xf1\xb3\xa5\x78\xaf\x99\x8d\x7f\x59\x8a\xf7\x97\xe2\x5f\x97\xe2\x4f\x5f\x49\x36\xc1\xdb\x88\x64\x0c\x02\x9f\x4b\x47\xd6\x02\x47\x56\x1e\x4f\x2f\x77\x16\xe8\x17\xda\xd6\x3e\x7f\x6a\xe7\x8c\x82\x88\xef\xb4\x56\x63\x69\xdc\x87\x97\x0a\x1f\x74\x30\x94\x22\x16\x52\x93\x58\x78\xbd\xf8\xc9\xb6\x8f\x50\x93\x49\xa8\x65\x9b\xbb\x7e\x15\x11\x8b\x30\x69\x61\x36\xe2\x76\xa1\xa6\x94\x3b\x8d\x78\x5c\xd6\x3b\xf9\x07\x6c\x1a\x6d\xef\x65\x93\xe0\xf7\xda\xf9\xa9\xfe\x5e\x3b\xbf\x39\xeb\x5c\xb5\xea\xd7\xba\xb9\x51\x2c\x6e\x6d\xa0\x8d\x62\x71\x07\x7e\x7f\xd1\xdf\x52\x09\x7e\xb7\xe1\xf7\x27\xfc\x42\x6c\xa9\x02\xbf\xbb\xf0\x0b\x29\xb7\x20\xe5\x16\xbc\x6f\x17\xe1\x17\xd2\x6f\x43\xfa\x6d\x08\xdf\x01\x38\x3b\x10\xbe\x03\x10\xca\x34\x57\xe9\xe7\x16\xfc\x6e\xc3\x2f\x4d\x5f\xda\x29\xc2\x2f\xc4\x42\xfa\xd2\x0e\x0d\x5f\xe9\xac\xac\xb5\xda\x63\xd9\x46\xf5\x5a\x76\x5b\x76\x47\x7f\xee\xff\x35\x07\x66\x14\xf8\xc1\xa9\xec\xca\x6c\xe3\xe0\xf2\x93\x3f\xb3\xdb\xaf\x9c\x9a\xd5\xfe\xe8\xd9\xec\xf8\x8f\xee\xcd\x52\xcf\x66\x14\x72\xed\xfe\x5f\xf6\x71\xf6\x6d\xa3\xde\xfc\xa3\xa7\xb3\xe3\xc4\xdd\xd9\xf9\x1f\x7d\x9e\xd1\x36\x1c\x1d\x25\xde\xcf\x28\x80\xa3\x93\xac\x1f\xb4\x8b\xac\x33\xb4\xeb\xc4\x23\xda\x4d\xd6\x2d\x1a\x2d\xb2\x79\xfa\x8f\x1c\xa4\x9d\x26\x5e\xd2\xce\xbf\x72\x95\x56\xff\x77\xfd\xa5\x3d\x7c\x72\x9a\xb6\x71\x52\x03\xcf\x69\xff\xdc\x71\x5a\x2d\xeb\x3d\xad\xf1\xf7\x2e\xd4\x68\x65\x4f\x69\x4d\x4e\x2f\x13\x8f\x6a\xd7\xff\x15\xb7\x6a\xb5\xc4\xb7\x5a\xe3\x93\x83\xb5\x6f\x9f\x3c\xac\xdd\x7c\xe5\x66\xad\xf1\x95\xaf\x35\x48\x47\xab\x7a\x41\x01\x5c\x5c\x7f\xe5\x7f\xad\xfe\xef\x3a\x61\x6b\xff\xbd\x27\xb6\xeb\xac\x3b\xb6\x7b\xd9\x27\xdb\x46\xa7\xc6\x1d\xb3\xd1\xa6\x64\xbd\xb3\x6d\x74\x8e\xff\xdb\x5c\xb4\x55\xb3\x7e\xda\x68\xaa\xdb\x56\xd6\x63\x5b\x43\xb8\x6d\xbb\x3f\x4e\x7c\xb7\x75\x96\x7d\xb7\xa1\xc5\xb1\x85\x4e\xeb\x9d\xab\xf3\x6b\xdd\x84\x32\xae\x0b\x3b\x45\xba\xf0\xc1\x4b\x49\xbc\x6c\x89\x97\x6d\xf1\xf2\x53\xbc\xec\x88\x97\xb2\x78\xa9\x88\x97\x5d\x3a\xf8\xf0\xf6\x8b\x07\x95\x04\xe8\x92\x00\x5d\x12\xa0\x4b\x02\x74\x49\x80\x2e\x09\xd0\x25\x01\xba\x24\x40\xc3\xaa\x0f\x2f\x02\xf2\x96\x80\xbc\x25\x20\x6f\x09\xc8\x5b\x02\xf2\x96\x80\xbc\x25\x20\x6f\x09\xc8\x5b\x02\xf2\x96\x80\xbc\x25\x20\x6f\x0b\xc8\xdb\x02\xf2\xb6\x80\xbc\x2d\x20\x6f\x0b\xc8\xdb\x02\xf2\xb6\x80\xbc\x2d\x20\x6f\x0b\xc8\xdb\x02\xf2\x4f\x01\xf9\xa7\x80\xfc\x53\x40\xfe\x29\x20\xff\x14\x90\x7f\x0a\xc8\x3f\x05\xe4\x9f\x02\xf2\x4f\x01\xf9\xa7\x80\xbc\x23\x20\xef\x08\xc8\x3b\x02\xf2\x8e\x80\xbc\x23\x20\xef\x08\xc8\x3b\x02\xf2\x8e\x80\xbc\x23\x20\xef\x08\xc8\x65\x01\xb9\x2c\x20\x97\x05\xc0\xb2\x00\x58\xde\x11\x03\x5f\x16\x10\xcb\x02\x62\x59\x00\xaa\x08\x40\x15\x01\xa8\x22\x00\x55\x04\xa0\x8a\xa8\x59\x45\xc0\xa9\x08\x38\xbb\x22\xd7\xae\x68\xd8\xae\xc8\xbe\x2b\xb2\xef\x8a\xda\xff\x12\x69\x7e\x09\x38\xbf\x04\x9c\x5f\x3c\x4d\x59\x60\x7d\x59\x20\x7b\x59\x20\x7b\x59\x20\x7b\x59\x20\x7b\x59\x20\x7b\x59\x60\x76\x59\x60\x76\x59\x60\x76\x59\x60\x76\x59\x60\x76\x59\xe0\x71\x59\xe0\x71\x59\xe0\x71\x59\xe0\x71\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x60\x6d\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x59\x20\x6b\x79\x3b\x01\x28\x2a\x26\x90\xb5\x2c\x90\xb5\x2c\x90\xb5\x2c\x90\xb5\x4c\x91\xf5\x1b\x7b\x13\x80\x04\x6e\x96\x05\x6e\x96\x05\x6e\x96\x05\x6e\x96\x05\x6e\x96\x05\x02\x96\x05\x02\x96\x05\x02\x96\x05\x02\x96\x05\xde\x95\xcb\x22\x97\x40\xa9\xb2\x40\xa9\xb2\x40\xa9\xb2\x40\xa9\xb2\xc0\xa4\xb2\xc0\xa4\x72\x45\x40\xae\x88\xec\x02\x93\xca\xbb\x22\xcd\xae\xa8\xc6\x2f\x01\x50\x60\x52\xf9\x97\x80\x2c\x10\xa8\x22\xf0\xa6\x22\xb0\xa4\x22\x90\xa3\x22\x90\xa3\x22\x90\xa3\x22\x50\xa1\x22\x50\xa1\x22\x50\xa1\x22\x30\xa0\x22\x06\xbe\x22\x06\xbe\x22\x46\xae\x22\x06\xac\x22\x06\xac\x22\x86\xa7\x22\x06\xa3\x22\x56\x8e\x8a\x58\x39\x2a\x62\xe5\xa8\xfc\x4c\x72\x89\x1a\x8a\xb1\xa8\x88\xb1\xa8\x88\x75\xa2\x22\xd6\x89\x8a\x58\x27\x2a\x62\x98\x2a\x62\x98\x2a\x3b\x62\xa9\xaf\x88\x71\xaa\x88\x85\xa2\x22\xc6\xa9\x22\xd6\x87\x4a\x59\x00\x12\xcb\x43\x45\x2c\x0f\x15\x31\x84\x15\x31\x84\x15\x31\x84\x95\x5d\x01\xf9\x97\x48\x23\xba\x7e\x57\xcc\xdd\x5d\xb1\x63\xed\x8a\xc1\xd8\x15\x93\x78\x57\x4c\xe2\x5d\xb1\x3f\xed\x8a\x51\xd9\x15\xa3\xb2\x2b\x66\xea\xae\x98\x8e\xbb\x62\x5b\xd9\x15\xdb\xca\xae\x18\x8c\x5d\x31\xe7\x76\xc5\x14\xd9\x15\x1d\xb4\x2b\x9a\xbc\x2b\x1a\xb8\x5b\x16\x89\xc5\xba\x55\x3d\xe6\xcf\x13\xfe\xbc\xe2\xcf\x47\xf6\x04\xb2\x9d\x3e\xcf\xf9\xb3\xc3\x9e\x87\x35\xfe\xac\xb3\x67\x83\xe7\x3f\xe2\xe9\x9b\x2d\xf6\x6c\xf1\x6f\x20\x62\xe9\x93\xa7\x03\x02\xf6\xe6\xba\x70\x7c\xcd\x9f\x0f\xec\x79\xc2\xd3\x9f\x8a\x27\xcf\x77\xca\xcb\x39\xe5\x70\x4f\x79\xfe\x53\x5e\x2f\x4a\x27\xc2\xc8\x9f\xf2\x0a\x9e\xf1\x0a\x9e\x71\x00\x67\x1c\xc0\x59\x93\x3f\xdb\xfc\x79\xca\x9f\xb7\xfc\xc9\x2b\x72\xce\xd3\x9d\xf3\x0e\x3a\xe7\x1d\x73\xc1\x2b\x76\xc5\x2b\x72\xcd\xcb\xb9\xe6\xe5\x74\x78\xc5\x3a\xf7\xec\x79\xc3\xeb\x73\xcb\xf3\xdd\xf2\xef\x3b\xfe\x7d\xc7\xe1\xdc\xf1\xf2\xef\x1e\x36\x2c\x74\x71\x75\x7e\xdb\x3a\xab\x01\x2b\xfa\x3f\xe8\x95\x7a\x15\x2b\xf7\xdf\xe3\x9a\xfa\xdf\xf6\x4a\xfd\x27\x86\xed\xdb\x3f\xf2\x4d\x7d\xf2\xbf\xc7\x41\xf5\x7f\x9d\xd7\xfa\x2f\x39\xa9\xfe\x5f\xe6\x9f\xfa\x0b\xd7\xd4\xdf\xfe\x8e\x23\xfa\x37\x1c\x54\x67\x18\x1f\xce\x8f\xfc\x9f\xb4\x52\xfe\x6f\x5f\x28\xbf\xf1\x95\xf2\xef\xfc\x85\x03\xbb\x99\xf5\x12\x8e\xae\xea\x47\xad\xf3\x33\xf9\x90\xef\x57\x72\x74\xc7\x8f\xdf\x28\x69\x48\x39\xd2\xeb\x9b\x83\xcf\xa9\xff\x7f\x7b\x24\xb8\x38\xb6\x62\xd4\x3a\x5b\x7d\x90\x99\xb6\xf1\x73\xf9\xab\x4a\x28\x89\xfd\x86\xed\x1f\x1d\xb1\xa6\x03\x36\xc2\x82\x02\x4b\x01\xcc\x73\x98\xc4\x70\xb4\x40\x07\x82\x76\x5c\xba\x7f\x6d\x54\x1b\x6b\x07\x87\x6b\x07\x9d\xb5\xda\xd9\x5a\xeb\x6c\xed\xf4\x74\xed\xec\x62\xed\xe2\x78\xed\xea\x66\xad\xd3\x5e\xbb\x79\xdc\xd0\x26\xa3\xb0\x37\x55\x36\xd6\x36\xd4\xbf\x1f\x9b\x6f\x5f\x0e\xcb\xbf\xd0\x40\xda\x61\xec\x10\x98\x74\xf0\x7b\x8c\x6c\xf8\x75\x3a\xec\xfe\xe8\xaa\x49\xf0\xd9\x95\x32\x9d\x20\xdb\x57\x91\xdb\xc1\x57\x4d\x22\x59\x9b\x4f\x45\xd2\xdc\x0e\x26\xfb\x24\xff\x34\xd6\x69\x0a\x00\x62\x78\x1d\x21\x92\x39\xb9\x56\x5e\xaf\x15\xb7\x93\x3f\x7f\x21\x68\x73\xb6\x64\xaf\xd8\xef\x60\x62\xd8\x8a\x1a\xcb\x37\xb0\x8e\xa2\xc6\xaa\xae\xf8\x1d\x7c\xd9\x24\xc8\x56\x32\x9a\xf5\x9d\x4f\x87\xf8\x76\xaa\xc0\x5e\x23\x61\x68\x13\xa7\x0f\x4e\xc4\x66\x61\xb8\x36\x1c\xaf\xcd\x22\xd7\xf3\x7b\x91\xe7\x6e\x08\xe3\x43\x37\xec\xa2\xbc\xe7\x2b\x4e\x4f\xb1\x3b\x20\xf7\xce\x05\xeb\xee\x15\x1b\x24\xa9\x10\x0b\x36\x9e\x5f\x15\x17\x89\x2b\x52\x96\x81\xb0\x0c\xf0\x00\x7f\x3b\xfc\x92\x06\x02\x30\x53\x0d\x72\x3b\xf9\x93\x2b\xa5\xf5\x0a\x57\xd9\xbc\x07\xd0\xc3\x8c\xe4\x99\x87\x91\x8e\x87\x0e\x3c\x75\x95\x38\xed\x3b\x13\x61\xe8\xf4\x14\x90\x4e\x41\xb7\x4d\xa2\xc6\x06\x54\x06\xdb\xc6\x23\x2b\x3c\xeb\x86\x43\xb1\xd5\x58\x35\x5c\x2f\xf4\xa6\xbc\x12\x99\xce\x5c\x9d\x87\x5d\xf6\x2c\x65\x93\x24\x97\x6f\x64\xc9\xe5\x73\x83\x98\xed\x85\xb5\x8e\x07\x35\x66\xd8\x81\x7e\xe5\x37\x6b\xc9\xfd\x88\x9d\x27\x5a\xed\x25\xbf\x59\xcb\xdf\x81\xf4\xf2\x5b\x24\x8f\xd8\x9d\x6c\x6f\xc3\xe9\x7c\x7c\x28\x4e\x07\xbf\x3b\xc3\x68\xda\x03\x87\x13\x7a\x7f\x44\xd0\x64\x66\x4b\x21\xa3\x11\x41\xce\x70\xc6\xe5\x1a\x6b\x35\x34\x1a\x0f\x5f\x7a\x91\xe3\x4d\x74\x67\x44\xd0\xc0\x9b\x8e\x87\x13\xfd\x76\x48\xe2\xf4\x8e\xa6\x63\x12\x2b\x06\x85\x26\xc0\x9b\x14\x55\xef\x33\x52\xd8\xb4\xee\xe0\x62\xb5\xf6\x62\x10\x9c\xd4\x17\x0c\xd1\x60\xbf\x63\xda\x16\x68\x6d\x81\xcb\x1f\x71\x39\xc4\xdc\x07\x51\x64\x4f\xcd\xc1\x80\x90\x11\xc7\xf2\xd4\x5a\x81\xdc\x54\xaf\xb3\x4f\x14\xaf\xa3\xea\xc9\x14\x38\x7b\x21\xe8\x31\x33\x05\x6c\xf5\xdd\xeb\x60\x1b\x5c\x95\xa2\x47\xb0\xfa\x46\xc7\x53\x1e\xc0\x64\xb0\xa4\x2e\xbd\x5d\x56\x55\x03\x35\x3c\xdf\x23\xd3\xd9\xd8\x9b\xa0\xcd\x26\xd8\x60\x79\x8f\xd1\x1f\x5c\x32\x71\x0d\x3c\x5f\xeb\xb9\xc6\xbc\xa7\x04\xe8\x76\x44\xd4\x7d\xc7\x0c\x2c\xec\xeb\xcc\x13\x93\x1a\xd3\x12\x58\x76\x57\x64\xf7\xb1\x4b\x73\xda\xd8\x31\x6f\x47\x24\x4f\xf3\x5b\xc8\xd7\xbc\x08\xdb\xfb\xb6\xf6\x50\xd3\x4d\x50\xd8\x71\xb0\xa3\xfd\xf5\xd7\x61\xeb\xfa\xe2\xa6\x53\x3f\xfc\xeb\xaf\x6a\x18\xaa\x0e\x4d\x05\xc6\x30\x5d\x2e\x10\xc9\xe5\xfc\xce\x75\x17\xdd\x4e\x75\xd2\x22\x4b\x2e\x72\xd1\x5b\x8f\xe8\x44\x7b\x1b\xfa\xfe\xc4\x9b\xa2\x39\x7c\xcd\xf9\xd7\xc4\x21\xa1\xa7\x13\x73\xb0\xb0\x24\x31\xfe\xcd\xa6\xe4\xcd\xf0\xbd\xe7\xea\x44\xeb\xb9\x5c\xb9\x95\x68\xa3\x61\x38\x0f\x86\xd1\x04\xd9\x2d\x02\x02\x84\xa6\x9c\xd7\x6e\xc9\x9e\x10\xc3\x9e\x42\xd4\xfd\xf7\xb3\xb6\x1e\x74\x14\x02\x7a\xa1\xa6\x15\xeb\x22\x40\x9b\x74\xbd\x30\x14\xea\xa2\x44\xeb\x0e\x43\x6f\x82\x82\x8e\xec\x77\x02\x32\xca\x56\x27\x56\x28\x4a\x9a\x47\xd7\xa0\x81\xa9\xa2\x90\x80\xa2\xa6\x6a\x65\x06\x9b\xc8\x95\x02\x85\x63\x9a\x41\xeb\xf6\x92\x3c\xf4\x9d\x66\x03\xe5\x63\x88\x0c\x87\x69\x64\x38\x64\x30\x25\x1b\x82\x99\x2e\xaa\xbd\xe8\x84\xbb\xbe\x41\x6f\x11\xbc\x0b\x97\x8a\xc2\x9f\x22\x9b\x35\x93\x67\xc2\x5a\x2a\x8d\x90\x37\x41\xa4\x45\x32\x52\x93\x4e\xeb\x93\x3a\x62\x27\x52\x1c\xd4\x6c\xc1\x2c\xf3\xd6\xf1\x24\x50\x5d\xa5\xdb\x51\x3c\xe4\xa8\xa9\xf4\x8a\xad\xb5\x1f\xd7\x71\x75\xc2\xe2\x16\xc7\x49\xa4\x6c\x1f\x76\xa8\x38\xe8\xa4\x85\x9a\x47\x44\x45\x01\xbe\xa1\x70\x07\x13\xa6\x86\x98\xf1\xd9\x96\xcf\x7b\x2a\xd3\x5f\x0b\xc9\x54\xcf\xb8\x6d\x0b\xa3\x40\x97\x1d\xb7\xc5\xaa\x41\xe7\xed\x92\xa0\x01\x51\xdf\xa7\xfa\x2a\x65\xd0\x7c\x3e\x35\x92\x2d\x99\xad\x06\xa7\x6f\x1e\x78\x14\xf3\x53\x87\x5e\xc1\xc7\x87\x47\xfb\x0e\xe3\x20\x9d\xae\x13\xbc\x5e\x44\x4c\x7b\xb1\x9f\x68\x2f\x8a\xc8\x17\xdc\x37\x67\x16\x5a\xe0\xf5\x12\x3a\xc0\x9e\x36\x79\x26\xe8\x10\x17\x8d\xc3\xbd\x03\x96\xf6\x90\x42\x77\x5b\x44\x79\x41\x07\xe6\x21\xdd\xba\x16\x78\xbd\xc8\x24\xa9\xe3\x9e\xaf\xac\x2f\xd4\xf7\x09\x5e\x2f\xf1\x10\x1a\x34\x51\xdf\x09\xa6\xe3\xec\x69\xb5\x17\x3a\xc6\xb4\x9e\x62\x6c\xa1\x7e\x31\x4b\xbd\x36\x8d\xe3\x98\x30\x0b\x63\x42\x9d\xc7\x55\x88\xaa\x4b\x43\xc2\xf6\x42\x37\x59\x95\x24\x4c\xed\x76\x64\xa1\x83\xcd\x48\xb1\xf9\x58\xa1\x4e\x5d\x45\x2e\x45\x03\x1b\x86\xcb\x81\xda\x10\x5a\x15\x47\xd4\xc3\x8d\xc5\x52\x7e\x0f\x2a\xba\x1f\x1f\x8e\xb4\xeb\x38\x1a\x4b\x86\x07\x35\xc4\xe2\xd5\x7d\x47\xcf\x5a\x35\x70\x5b\x59\xe9\x7a\xb0\x58\xf7\xdb\x66\x3a\xa4\xb9\x1c\x7c\xee\xd9\x4c\x8f\x34\x97\xbb\xed\x29\x66\x61\xbb\x5c\x44\x45\xb4\x5d\x2e\x4a\x1b\xa4\x23\x03\x88\x82\xbc\xc3\x40\x94\x18\x08\x1a\xc0\x80\x94\xac\x8c\x61\x98\x1e\x4c\xf5\xab\x99\xb8\x82\x4f\xc4\xa8\x08\x97\x99\xba\x27\xb2\x37\xc8\x39\xd3\xb9\xe0\x52\x57\xfd\x17\x61\xdf\xa2\x88\xb9\xf9\xc6\x73\x2e\x02\x76\x3f\x10\x1e\x5a\x7a\x1d\x74\x35\x53\x8d\x3b\xdc\xeb\x70\x3f\x8d\x83\x15\x1a\xe4\xd1\x50\x39\x3c\x50\x8d\xc9\x54\x1b\x38\xdc\x68\xa1\xa8\xc9\xfd\x00\x93\x44\x82\xa0\x36\x57\xbf\xac\x0a\xc1\x0e\xf8\xe0\x26\xb8\x31\x54\x6a\x43\x30\xfe\xf5\x92\x78\xf4\x01\x73\x90\xe8\xf4\x88\x58\x42\x67\xf2\xe6\x3a\x31\xf8\x21\xaa\x5d\x9d\x89\xc2\x91\xa7\x1a\x2e\xc5\x06\x0f\xbd\x4d\x09\xba\x7b\x22\x68\x12\xa8\x5c\x00\x12\x0c\xee\x8d\x5e\x54\x2d\x70\x15\x1b\xb9\x28\xa9\x42\x22\x25\x93\x1a\x53\x8e\x94\xf7\xe1\x88\x36\x76\xa2\x13\xe4\x0f\xc7\x03\x32\xd5\x03\xa6\x7f\xca\x8b\x06\xcf\x00\xbc\xa9\xcb\x13\x9a\x2b\x27\x26\xc4\xe2\x60\x44\x54\xc3\x6b\x09\x31\x20\x14\x20\x0f\xf5\x91\x8f\x12\xef\x19\x06\x5d\xc8\x58\xb8\xcb\xc5\xd7\xfa\x7d\xfc\xc9\x82\xe4\x75\x3f\xe9\x65\xf3\xda\xb6\x94\x0b\x15\xd9\xb8\x73\x22\x8c\xf1\x9f\xc3\x56\x0c\x22\xda\x27\x0a\x98\xd7\x00\x25\x99\x13\xc0\x54\xc4\x25\xf4\xc8\x80\xa7\x39\xbb\x06\x23\x48\xb6\xb6\x08\x35\x1f\xe2\xed\x54\x1a\xe5\xf6\x88\x28\x0e\xb2\x55\x90\xe6\x83\x17\x4f\xbc\x5c\xd0\x7c\x36\x38\x31\x60\xaf\xa9\xa0\x8f\xf9\x68\x5b\xe0\xbb\x6b\x78\x48\xa6\xe4\xe6\xea\x44\x39\x7e\x61\x32\x5d\xd5\xd9\x4a\xa1\xa5\xde\x10\x90\xa9\x50\xa2\x95\x7d\x4a\x3e\x8c\x42\x09\xcc\x66\xd1\x87\xbb\xaf\x38\x78\x67\xa7\x8c\x5c\xbc\xfd\xb3\xa2\xea\x10\xb5\xef\x30\x8d\x98\x9d\x9d\xf2\x77\xf7\x47\x12\xee\xe6\x72\x0a\xd7\x95\xd9\xfe\x59\xf9\xee\xfc\xd8\xd9\x29\xab\x19\xd3\x4f\x60\x97\xd2\xcd\xc8\x91\x79\x2d\xb2\xda\xa2\x76\x2b\x52\x5c\x34\xe5\xe6\xac\x08\x9d\x2e\xd8\x53\x7d\x48\xbd\x5e\x62\x2e\x56\x40\x4e\xdf\xa7\x58\x07\x9b\x87\xe4\xe4\xee\x9e\xa8\xf4\xc7\x3c\xa8\x5a\x0a\xd1\xce\x09\x22\xda\xfd\x80\x27\x63\x52\xdb\x00\xfe\xbc\x01\xfe\x61\x98\x6d\x97\xab\x13\x85\x50\x24\x4e\xd2\xa3\x50\x8d\x69\xac\xf6\xf8\xac\xdc\x2b\x9f\xd0\x81\x4f\x75\xed\xc9\x56\x54\x14\x26\x9f\x61\x55\x51\x11\x11\x63\x1c\x22\xca\x19\xc8\x92\xc4\x64\x90\xcb\x89\x99\x49\x06\x89\xf1\xa6\xf3\x74\xbe\xd2\x50\xb1\x9e\x50\x30\x8f\xcc\xcb\x05\x18\x72\x02\x33\x4e\xe0\x16\x55\x18\x9c\x38\x1c\x72\x29\x1f\x11\x70\x69\xf3\x00\xd5\xf0\x05\xd2\xaf\x17\x97\x7a\x8c\x3b\xa5\xb8\x1f\x64\x96\x75\x7f\x79\x30\x98\x1e\x04\xac\xf0\x0e\x6a\xce\x08\x3a\x3e\x22\xb0\xbd\x33\x95\x7e\x07\x63\xdc\x39\x04\x73\xfa\xf8\x2d\x00\x9d\xeb\xcc\x74\x64\x6c\xe3\x99\x10\x81\x25\x03\x24\xa0\xf7\x59\x0d\x26\x38\xd3\xb1\x67\x42\xda\xb5\x36\x4f\x6a\x30\x62\x8a\x71\x44\xab\xcd\xb5\xf6\x31\x76\x0c\x90\x0d\xa5\x5f\xdc\xe9\x2e\xa2\x8c\xa2\x8f\xc8\xf2\x4a\x20\xb6\x35\x51\xb6\x36\xd8\xa6\x54\x99\x8a\x22\x21\xba\x5a\x9b\x43\x98\x8a\x26\x8a\xca\xe5\xf1\x1e\x8b\x38\xe4\x02\xde\xfd\x17\xed\xd4\x85\xc5\x83\x56\x40\x55\x8d\xe8\xe3\x23\x5b\x30\xcd\xf6\x59\x10\x39\x33\xd6\xfb\xfc\xc9\x65\x92\x65\xc8\xf5\x11\x59\x25\x95\x9c\x60\xb1\xc0\x05\x59\x4c\x99\x0c\x98\x8c\xb2\xb1\x04\x47\x58\x03\xb1\x62\xd5\xb8\xa3\x28\xf1\x49\xb0\xef\xd2\x26\xca\x09\x48\x1a\xc2\xfa\x76\x69\x93\xa5\x25\xa1\x3d\x13\xea\x9d\x36\xac\x19\x93\xee\x27\x18\xb0\x65\xad\xc4\x52\x59\x60\xed\x3e\xd9\x84\x38\x7d\x61\xb8\x3d\x65\x23\x18\x0e\x83\xd0\xd3\x5e\x7a\x93\x19\x09\x7b\x0b\x50\xde\xd6\x8e\xbc\x61\xad\x4b\xc6\xd3\x0d\xd4\xeb\x70\x2d\x2c\xd5\x20\xcf\x0a\x6c\x7b\x08\x7e\x4d\x1b\x9c\x78\x74\xb8\x3f\xfa\xd6\x80\x04\xde\xcd\x55\x8b\xed\x8c\x5a\xbf\x6f\xd4\x5e\x33\xc9\x9f\xe7\x16\xf4\xa9\x1c\xd6\xad\x26\x20\x9c\xd0\x23\x63\x28\x93\x43\x78\xf4\xff\xbe\x7a\xda\x80\x8c\xea\x6f\xbd\xc9\x74\xb2\xb1\x62\xa4\x09\xf3\x91\x1e\xd3\xcd\x74\x69\xd3\xe4\x96\x95\xc1\xa8\x18\x9d\x35\x19\x05\xe7\x6e\x07\xe4\xb3\xe3\xa4\xe1\x7f\x5f\x8f\x89\x37\x3d\x25\xa3\xc9\xf5\x70\x36\x76\xbc\x0d\xb4\x3c\xd1\xd8\x51\x8d\x34\x6a\x76\x2e\xf7\xe9\xc8\x25\x97\x83\x53\x97\xb4\xd8\x64\xf6\x3f\x75\x64\xf3\xf6\x30\x84\xbd\x43\xa1\xfc\xd4\xc0\xb6\x76\xf7\x9a\x60\x9e\x27\x74\xa1\x16\x13\x89\xd6\x59\xcc\x71\xd0\xe2\x19\xa6\x13\xa1\x1b\xf5\x76\x2d\x0c\xbb\x9d\x0d\x05\x85\xf3\xd4\x41\xa7\x75\x42\x49\x9c\x27\x20\x71\xc8\xf3\x2a\x71\xfe\xc5\x24\xf1\x7e\xd7\x90\x05\x62\xcf\x86\xdc\xb7\xdd\xa1\xf6\xfc\xa2\x10\x38\xc8\x49\xa2\x98\x25\xe3\xd4\xc5\x2f\xaf\x19\xa5\xa9\x89\x60\x8a\x85\xbc\xfc\xc4\x14\xb1\xc4\xb2\x60\xf4\xee\x4f\x34\xdf\xd3\x9c\x5b\x06\xcd\x29\x51\x26\x9d\x03\xa6\xa8\xc8\xcd\xa0\x75\xf9\xc2\x9a\x31\xe5\xdc\x6d\x65\x94\xc0\xfb\x1e\xeb\xb0\x47\xe5\xf1\x49\x21\xda\x62\x92\x3d\x06\xb2\xb5\xee\x8c\x7b\x07\x8a\xef\x34\xef\xf8\xb3\x23\xee\xc5\x1c\x93\xd8\xa8\xaf\x54\x74\x98\xd1\xcd\xea\x7a\x02\xde\xf2\xd2\x80\xab\x09\x10\x06\x9f\xea\xcb\x54\x1a\x66\x27\x5f\x7a\x02\x2e\x1a\x0e\xe3\x79\x64\x93\x64\x2e\x26\xa6\x43\x99\x2d\x57\x1b\x3e\x73\x83\x37\x9e\x30\x78\x23\x3a\xfb\x35\x52\x3c\xd3\xb7\x90\xab\x8d\x9f\xf9\xca\xe1\x94\x32\x6d\x49\x79\xee\x0c\xcd\x9e\x24\xf1\xd4\x77\x02\x56\xb8\x6c\x04\xa3\x81\x3c\x4b\x8d\x63\xa2\x0d\x94\x60\x82\x6c\x25\x5b\xe5\x7e\x87\xad\x52\x01\x5f\xa8\xc4\x4e\x47\x93\x5f\x34\xbf\x4c\x1e\x1e\x7d\x4e\x7e\xfe\x75\xf2\x41\x36\xb9\x44\xfb\xf7\x3b\x29\xfd\xed\x60\xd7\x24\x63\xcb\x00\xef\xc3\x9b\x96\xa2\xe6\x72\xec\xa9\xf5\xdc\xeb\xe9\x98\x7e\xae\xe3\x30\x00\x15\xd7\x87\x0b\xc5\x01\xdb\x2b\x13\xa0\xd9\xe8\x90\x3f\xd9\x5f\x59\x80\xef\x7b\xb4\x1b\x87\xc3\xaf\xdc\x5e\x43\x21\x40\xb6\xbb\xac\x28\x6c\x6b\xe3\x40\x51\x0d\x88\x11\xf4\xf9\x62\x62\x3a\x96\x46\x5c\x17\x7c\xb6\x7f\xbb\xd3\x0e\xbd\x15\x4c\x84\xbd\x8e\x31\x58\x71\xe5\x42\xf6\x0f\xbe\x92\x28\x56\x50\x8a\x90\x26\x82\x51\x7d\xf0\x33\xa3\x2a\x7c\x03\x34\xb4\xe1\x19\x14\x00\x54\x7e\x8b\x60\x73\x7e\x88\x6e\x5a\xa8\xd3\x42\xf6\x21\x22\x87\x96\x64\xea\xfc\x2b\xbe\xe9\x3a\x59\x16\xc2\x0e\x0a\x2e\xe9\xaa\x10\x7e\xc5\xf8\xa8\xef\x4b\xfc\x8e\x93\x2c\xba\xc0\xc9\xb0\xaa\x47\x4f\xac\x83\x2c\xa1\xd6\xdd\x1b\x26\x4c\x8a\xa3\x22\x8f\x52\xbb\xd2\xb7\x2b\xac\xa6\x83\xcb\x84\xa4\x4e\xb0\x1c\x28\xa9\xb3\x9b\xe3\x36\xca\xb2\x59\xd7\x43\x33\xac\x5a\x0a\x27\xbc\xe6\x63\xc4\x39\x0c\xba\x84\x12\xd6\x6d\xf3\xf1\x4a\xff\xbf\xa2\x0c\x4f\x68\x66\x1d\x3e\x43\x74\xf3\x58\xb9\x3f\xd1\xae\x77\x14\x9e\x40\x5d\xe1\xb3\xcb\xc1\x26\x41\xb6\x59\xb4\x2c\xe6\x64\xbb\x7d\x7d\x7e\x66\x06\xae\xa5\xd8\x60\xf7\x28\x39\x27\x05\x17\x49\x9b\x35\x35\x56\x91\xa3\x6a\xf7\x5d\x70\x71\xd8\xac\x93\x04\x36\xd7\x66\x65\xad\xf7\x2f\xb9\x47\x6b\x94\x28\x95\x20\x1b\xb9\xaa\xc1\xd4\x4e\x37\x2f\x44\x6a\x58\x56\x56\x53\x09\x61\x47\xf3\xb4\x49\x57\x92\x4d\xff\x76\xa7\xd5\xe7\x2b\xd0\x8e\x6d\x95\x4f\x1d\x41\x73\x14\x21\xd8\x50\xf8\xc2\x7c\xe2\x13\x45\x05\xcf\xf3\xde\xb1\x22\xb1\x38\xb4\xc8\x13\x3f\x43\xdd\xc8\x8c\x79\x8b\x08\x52\xe5\x81\xe9\x62\x86\x5c\xd1\xf6\x81\x81\x7d\xe2\x9d\xfd\x72\xcd\x10\xee\x0e\xf7\x5a\x84\x21\xda\x6b\x94\x05\x7a\xa7\xd5\xdb\x9f\x97\xe4\x07\xb1\x1d\x3e\x78\x0a\x61\x96\xe0\x61\x6e\x78\x9f\x93\x3e\x11\x0c\xd5\x25\xce\x57\xd3\xfc\x89\xc4\x9f\xf7\xbd\xd4\x17\x43\xd8\x37\x1e\xb9\x8a\x95\x36\x08\x32\xa7\x16\x42\x2b\x76\x36\x24\x6c\xe2\xf3\x36\x6b\xb6\xaf\xb8\xea\xbe\xa3\x5d\xf3\x93\x88\x87\x09\x25\x9a\x14\x57\xd5\xae\x07\x3a\x81\x25\x41\x7b\x19\x12\xb6\x2c\xd0\x64\x8a\x0a\x1e\x75\x69\x1a\xe4\x24\xfc\xf0\xe5\x93\x22\xb2\x93\xa9\xb2\x5e\x5c\xde\xb9\x6c\xc9\xf5\xa4\x28\x1b\xdb\x06\xdb\x00\xe5\x2d\x71\x00\x53\x3e\xec\x48\x53\x3e\x7e\x50\x06\x1d\x14\x76\x54\x63\x00\x04\xd8\xf3\x0b\x5e\xdd\xfe\x5e\x8b\x18\xb6\x56\x6f\x2b\xa9\x95\x49\x5b\x1a\xec\xa8\x93\x90\xb6\x13\x82\xe9\xbc\x61\x75\x76\x67\x09\xfb\x33\xe5\xdc\x0f\x8f\xf1\x92\x98\x38\xe8\x29\x51\x47\x35\x22\xa8\x81\x37\x5b\xa6\x85\xe5\x51\xba\x9c\xd0\x46\x69\xe7\x0e\xa5\x04\x78\x0e\x77\x46\x56\x29\x5c\x80\x8e\xf9\x48\x79\x17\x9a\xe9\x04\x81\xa9\x8b\xce\x7c\xe4\xe9\xad\x6e\xe6\x0c\x69\xd8\x11\xcb\xd9\x25\xc9\x2e\x86\x36\xc1\xb6\x51\x7d\xe3\x93\x91\x99\x5a\x52\xe3\x21\x94\x3b\xb0\xb3\x3b\x6b\x72\x66\x49\x13\x9b\x77\x8e\x95\x58\x2c\x48\xed\x2e\x32\xab\x05\x7b\x1e\xb7\x5c\xc0\x5c\xb1\x3b\x88\x30\x03\x06\xbc\x48\xd9\x76\x46\x5a\xc9\x51\x67\x99\x35\x67\x3d\x22\x26\xc1\x9b\x2b\xa8\xc0\xa6\x2f\x54\xe2\x0f\x5f\x05\xb1\x57\x8b\x88\xd0\x89\xbf\x1a\x24\xda\xb5\x57\x41\xe2\xe5\xb8\x5a\x14\x14\x62\x18\x4a\x44\xa4\x7b\x84\x79\xda\x87\x01\xc1\x01\xeb\x01\x83\x08\x17\xca\x67\x82\xdf\x35\x6c\x7c\x38\x0f\xc6\x64\xd4\xd5\x46\x3d\xa7\x7f\x48\xa6\x5e\xa7\xe7\xf4\x8f\xc6\x24\x9a\x85\x64\xdc\x9b\xce\xb9\x72\x10\x3f\x6b\x6a\xfa\x42\xd5\x5d\x74\xf5\x74\x98\x40\x08\xbc\x29\x05\x50\x7d\xeb\x4d\x3e\xe5\xb2\xa5\x0c\x66\xd1\xd2\x5e\x4c\xdf\xb5\x14\xf5\x37\x4f\x27\xb8\xc9\xe9\xd0\x1c\x7a\x96\xf2\xfe\xa2\x0b\x00\xcc\x96\xda\x79\xcc\xf7\xd3\xab\x00\x12\x50\x2c\x19\x76\x94\x73\xca\x8b\x25\xb6\x8a\x5d\x6e\x60\xf9\x73\x31\xdc\xf9\xa3\x9b\x7a\x16\x1a\x9a\xe2\xd9\xb6\x0a\xa5\x24\xa1\x41\x7e\xf3\x1a\xb3\x6f\x51\xaf\xa6\x8f\x45\xfd\x07\xdc\x67\xf4\xe5\x0f\x11\x55\x48\xa0\x33\x13\xc8\xb3\x2e\x58\x7f\xc4\xcc\xd0\xa8\x8d\xd3\x92\x0c\xb2\x67\x03\x01\xcd\xd3\xd1\x9d\x07\xd0\x6e\x20\x94\x5e\xa7\x43\x93\x58\xda\x8b\xaa\xc6\xdf\xc8\xb3\x32\xea\x2c\x3b\xad\xa0\xd8\x2e\x74\x57\xaf\x06\xcb\x8a\xb4\x61\xc8\x0e\xec\x36\x26\x53\x32\x9e\x3e\x24\x86\xc8\x27\x1e\x7d\xf8\xc3\xb1\xb7\xe6\x90\x30\xec\x45\xc1\x9a\x3b\x26\xaf\x8a\xaa\x6d\xf0\xbd\x5d\xee\x0d\xf0\x6a\xb6\x8e\x71\x72\x21\x21\x7a\xbe\xc8\xcc\xcc\x0d\x6c\x05\xee\x13\x4c\x6e\x37\x5f\x34\xa6\x68\x15\xfc\x1f\x5b\x28\xfd\xcc\xfb\x3f\xb6\x54\x8b\x59\x3d\xcc\x26\xda\xe3\xc8\x5b\xe0\xf8\x9e\xcb\x29\xd5\x37\xc5\x43\xd5\xb6\x8a\x8e\x89\x02\x45\xa5\x39\x54\x44\x03\x34\x2f\xe2\xf5\xe4\xc0\xc5\x29\xab\xa8\x9e\x2b\x57\x8f\x19\x1d\x90\x6a\xe7\x66\x6b\xe7\xb2\xda\x19\xfe\x8f\xad\xbc\x94\x44\xcc\x3a\x86\x06\x97\x79\x5e\x4f\x51\xbf\x49\x03\xea\x17\x22\x19\xaa\x8a\xc2\x4c\xdd\x5c\x4b\x35\xae\x06\x4a\x08\xb5\x56\xf7\xe1\x62\xc5\x55\xf5\x80\x5b\x0c\x60\xb7\x84\x25\xc3\xdb\x73\xd3\x1b\xc6\x28\x69\x85\x67\x19\xdf\xb8\xcd\x99\xc8\x1c\x54\x13\x87\x88\x6d\x3d\x5a\x6e\x92\x97\x76\x92\x67\xe5\x23\xd6\xf2\x8c\x0d\x99\x5e\x9d\xf9\xc4\xa0\x38\xb2\x2a\x7f\x81\x67\x92\x3a\x26\x85\x44\xbb\x47\x82\x35\x69\xfc\x09\x82\x94\x7f\xd9\x50\x4d\x22\x70\x30\x8b\xfa\xd1\xf0\x35\x5a\x03\x43\x04\x03\x2f\x9a\xae\xf5\xa2\xb5\x69\xcf\xe9\xaf\xc1\x2c\xd7\x36\x54\x23\x16\xeb\xf1\x08\x83\xa3\xc8\x22\x0a\x71\xc0\xcc\x51\x84\xc2\x48\xe8\xd5\x40\x09\x28\xbb\x14\xa9\xea\xfb\x28\xbd\xcd\x19\xb1\x9e\xf6\x78\x4f\x47\x6a\xec\xf3\x29\x18\xe2\xbe\x0c\x22\xed\xeb\xbe\xe9\x5b\x16\xba\x24\x4a\x84\xce\xd5\x98\x50\x46\xd9\xe5\x79\x02\x79\xda\xba\x7b\x01\x2c\xfd\x3d\x5f\x19\xc9\xe8\xb6\x2e\xd6\xb9\xdf\x22\xb1\x4b\x27\x6f\x2e\x37\xa2\x1b\x49\xba\xb9\xf4\xb1\x2d\x8c\x7d\x01\x7e\x08\x7b\x5f\x61\x98\x2f\xd1\x16\x8e\xe8\x40\x7f\x7c\x7c\xeb\xd5\xc1\x88\xa2\x4d\xd0\x08\x8f\x32\x7b\xd1\x04\x9b\x16\x9a\xe1\x22\x7a\xc1\x23\x5a\xa3\xd9\xde\x8b\x31\xcb\xe7\xd5\x09\xd8\xd2\x52\x46\xe6\xcc\x82\xfd\xa5\xb4\x83\x42\x54\x6d\xd3\xbe\x41\x7e\x1e\x97\x76\x8c\x3e\x9e\x18\x1e\x6f\x94\xcf\x3a\xc2\xdb\xf3\x01\xf3\x1c\xa5\x4f\x71\x08\x68\x55\xc2\x59\x74\xba\xcd\x94\xe2\x58\x35\xce\xc8\xa7\xe5\x47\x6c\xd2\x0a\x49\x96\xbc\xef\x7c\x4d\x14\x13\x85\x72\xc9\x90\x8d\xee\x31\xff\x84\x85\xf5\x14\x87\xee\x51\x1f\x1f\x40\x0d\xa7\x8a\xc0\xc8\xc5\xeb\x74\xeb\x8d\x3a\xda\xad\xad\xa8\xe6\x99\x6d\x19\x4b\x0e\x55\x47\x63\xa2\x2f\x33\xc2\x44\x78\x15\xec\xa3\xd0\x70\xe8\x3e\xe8\xc1\x35\xea\x5e\xb2\x4b\x75\x9a\xad\xab\xce\xc3\x5f\xd7\xf5\xda\xf9\xd9\xe1\xc9\x83\x38\x1a\x0c\xb1\xad\xbc\x75\x11\x51\x91\x43\x07\xb7\x96\xec\x31\x21\x7a\xcf\x78\xe8\x63\x4e\xfd\xda\x87\x88\xd8\x7a\x50\x4b\x2d\x6d\x94\xb6\x99\xdb\x3e\xe6\xc2\x2f\x56\x39\x20\xba\xa0\xe6\xcf\x57\xd7\xe1\xb4\x75\x76\xd3\xa9\xcb\x75\xb8\x3c\x40\xe0\xe3\xc3\xbc\x75\x80\x3d\x75\xf7\x95\x3e\xed\x87\x10\xd7\x7c\x55\xef\xd3\x39\xe1\xd2\x1f\x5a\xdb\xf0\xef\x2a\xdb\xff\x6f\xa9\xeb\x75\xeb\xfe\xaf\xe6\xf9\xcd\x95\x5c\xcd\xf3\x00\xf5\x31\x31\x6d\x5a\x49\x44\xb7\x0a\x5e\xe1\x5c\xee\x9b\x12\xe6\xf1\x28\x22\x2a\xea\xe3\xd2\x16\xc6\xb8\xff\xf1\x51\x64\x0f\x17\x51\x72\xfb\xcd\xfd\x4d\xd8\xde\xca\x9d\xc1\xf6\x73\x39\x9a\xe7\xa6\x0f\x8b\xf6\xff\x58\xb3\x0e\xab\x2d\xb9\x45\x0b\x9f\x77\x7c\x94\x74\x7c\x98\xc7\x9d\x3e\x41\x7d\xf0\xce\xf3\xff\x49\xd7\xdf\xd5\xeb\xc7\x69\x25\xfb\xd8\x4d\x6b\xd0\xf2\xff\x67\xaa\x70\xd0\xaa\x9e\x9d\xdd\x54\x4f\xd2\x9e\x3a\xae\xa1\x3e\x66\x7d\xd5\x74\x59\x5f\xa1\x6f\x7f\x1a\xd9\xdb\xff\xe1\x91\xad\xd5\xcf\x3a\xf5\xb3\xb3\x96\x5c\x69\x5b\x69\x1f\x90\xff\xd7\x26\x37\xdb\xe0\xce\x46\xc4\xe0\xbe\x86\x0f\xdf\x92\x95\x69\xa7\x28\x4b\x7b\x3c\x77\x18\xb7\xdd\x03\xae\x2d\xfa\x82\xab\x15\x09\x9a\xf3\xcf\x09\xd6\x4b\x22\xb6\x65\x93\x2f\xa2\x45\x69\xe3\x4e\x66\xa9\x2d\xfe\xb6\xf7\xc9\x0f\xe6\xfe\xa3\x54\x44\x05\x5b\xd5\xc9\xf7\xe4\x53\x36\xc5\x39\xe9\x30\x7b\xa1\xcc\xc2\x9f\xf6\x73\xfb\xe7\xd6\xaf\x9f\x3f\x77\x4b\xbf\x8a\xdb\x5b\x3b\xa5\xdd\xef\x5d\x2d\x1c\x06\x92\x93\xab\xb5\x52\xbd\x50\xf9\xcd\xed\x01\x16\xe0\xf6\x92\xc8\x7e\x1c\xa6\xb2\x60\x0f\x98\x04\xfc\x03\x4c\xc9\xc6\x68\x36\xdb\xdc\xfe\x73\xbe\xb4\xe1\x2f\xd0\xcd\x77\xf8\x05\x4e\xc0\x4e\x48\xe6\x7c\x80\x11\xd1\x8c\x69\x13\x5c\xd8\x75\x43\x70\x61\xdd\x67\xcc\xad\x1d\x38\x1f\x1f\xc5\xdf\x0e\xbb\x7c\x6a\x6c\x2a\xaa\xbe\xb5\xe7\xec\x3b\x85\x92\x5e\x32\xae\x5e\x19\x6b\x69\x0a\x37\x8f\x13\x07\xbb\x1c\xd4\xb3\x83\x0b\xf4\x9d\xb3\xa4\xe0\x44\x04\x22\xda\x44\xb9\x68\xa8\x70\x70\xca\x85\x07\xda\x44\x79\x3b\x20\xcb\xc7\x53\x09\x9f\x2e\xfc\xac\x1c\xb0\x83\x16\x38\x7f\xee\xd5\x56\xde\x42\x7b\xd7\x19\x4b\x64\x6d\xa2\x3c\x1e\xa9\xc9\xfb\x43\x8b\x19\x01\x5c\x27\x4f\x8a\xcd\x8e\x54\x9f\x5b\xa9\x1c\xe8\xd9\x30\x2a\x84\xbd\xc8\x23\xe3\x35\x10\x12\x5b\x7b\xed\x4d\xbb\x6b\x01\x19\x4d\x40\x32\x74\x38\x5d\x9b\xcc\x46\xa3\xe1\x78\xea\xb9\x94\x44\x4b\x8f\xb6\xbf\x92\x96\x33\xa6\x7a\xe2\x2c\xd8\xb3\x0c\x4e\xec\x8c\x8a\x4a\xa0\x5d\xf6\xb9\x95\xc8\x3e\x0b\xac\xb5\x95\x80\xd2\x11\x28\x90\xbe\x9b\xbe\xca\x3c\x2b\x83\x6c\x50\x3f\xef\xef\x05\x6a\x3f\x8f\x7d\x2e\xdf\xc4\xf8\x5c\x21\x82\xe3\xe3\xf7\x20\x22\x7a\x11\x01\xcf\xa3\xf7\x91\x17\xb9\x7a\x10\xc7\x7e\x2e\x27\xe4\xf2\x44\x37\x3e\x34\x88\xe2\xa0\x71\x47\x29\x21\xc0\x48\x15\xee\xd1\xef\xb4\xf6\xca\x93\x88\x4d\x6e\x99\xf7\xba\xc1\xad\xba\x34\x36\x3f\xcf\xb7\x42\xc6\xd5\xdd\x93\x2c\xcc\xe5\xc2\x1d\x6b\xe4\x28\xaf\x6c\x1a\xaa\x28\xfd\x72\x18\x1e\x4c\x1c\x8c\x5d\x92\xcb\x11\x8a\x35\x14\x6d\x20\xcb\xc4\xc1\x45\x04\x41\x25\x39\x11\x8b\xa1\xe1\x34\x54\xce\xf0\x4c\x83\x27\x8e\x48\x4c\x03\x72\x39\xa5\x88\x21\x74\x9f\xe5\x63\x06\x46\x29\x48\xbd\xb8\x97\x86\xff\xc0\x5b\x10\xfe\x1d\x6f\xa9\x3a\x84\x7c\xe7\x21\x3f\xf0\x16\xd4\x71\xd6\x82\x60\x08\x43\x94\x83\xd6\x2e\xb7\x96\x43\x4e\x5b\xe0\xfa\xb3\xfb\xcc\x8f\x46\x4a\x88\x98\xce\xc2\x82\xf5\x51\x8d\xef\xb4\x59\x6b\xf9\x60\x70\x3c\xca\x74\xb9\x98\x50\x44\x9e\xc5\x6f\x6c\x15\xd2\x26\xee\xc7\x07\x2f\x23\x11\x35\x9a\x48\x7e\xd6\x5e\x33\x82\x54\x73\xf6\x95\x4a\x9a\x39\x19\xab\x25\xb4\xab\xe6\x07\xcc\xbb\x5b\x7a\x99\x48\x14\x27\x91\x90\x4a\x87\x73\x9e\x5d\x3f\x85\x7d\x24\x42\xb1\x94\x1b\x22\x8e\xef\xb4\xc8\xc1\x2b\x2e\x34\xc5\xc9\xc1\xc4\x91\x4f\x25\x26\x60\x65\x4d\xac\x13\xac\xb3\xf8\x97\x38\xec\x1e\x8d\x56\x21\x23\x24\xba\x69\xf0\x43\xf2\x03\xad\x17\xbd\x78\xe3\x89\xa7\xf0\x4c\xad\xcd\xd5\xa7\x6f\x64\xcf\xde\x2f\x94\x74\xf2\xdb\xde\x2f\xe9\x45\xf9\x0e\x86\xdd\xb3\x01\xb8\xc7\x11\x26\x1f\x1f\xcc\x0e\x1e\x50\xe0\x61\x8b\xe0\xf7\x68\x36\xb0\xbd\xb1\xbe\x7a\x6d\xd2\x1e\x47\x0a\x31\x87\xae\xa5\xc6\xa8\xe7\x7a\xd1\xb4\xe7\xf7\x32\x89\xd3\x1a\x98\x35\xd7\x8a\xd1\x46\x7e\x63\x85\x5d\xe9\xc7\x3e\x89\xd1\x46\x61\x55\x54\xab\x4a\x63\x56\x46\x75\xbc\x18\x6d\xe0\x55\x31\x4e\x48\xe1\x7d\x5f\x15\xf5\x00\x45\x29\xab\xa2\xce\x28\x3c\x75\x55\xcc\x39\x8d\x41\xab\x62\xae\x69\xcc\xff\xbd\x2a\x66\x73\x1c\xc7\x46\x1f\x8e\xc4\xb5\xda\x57\xee\xd4\x56\x79\x00\x09\x5b\xc4\x24\x5a\xeb\x59\x51\xad\xc4\xe8\x0c\x7b\xc0\x25\xc4\xb9\x3c\x35\x16\xb0\xc1\x3d\x28\x8b\x0e\x7a\xee\xa8\xc6\x02\x38\xae\xd6\xf3\x0a\x7a\xa2\xe3\xc9\x06\x46\x79\xb6\x2a\xcb\x56\xfd\x3a\xdb\xa5\x9c\xed\xa0\x93\xde\xa7\x76\x31\x89\x1f\x94\x83\x0e\xf2\x7b\xaa\x71\x00\x00\x9e\x86\xbd\x68\xc5\xf9\xb3\x69\x89\xb3\xf7\x45\x57\x3a\x79\xa7\x4b\x63\x71\xcf\xcd\xe5\x6c\x30\x3d\x2d\x0e\x71\xd6\x4b\x86\xb3\xd6\x8b\x26\x53\x12\x39\xde\xd0\x5f\x3b\xe8\xe4\x72\xa5\x3d\x47\x5b\x74\xcd\xb6\xc5\xef\xc9\x5e\x4e\x14\xf5\xb7\x03\x0f\xb0\x82\xbc\x5e\x54\x0d\x8f\x03\xa2\x04\x5d\xad\x03\x5e\x4f\x6c\xe4\x68\x0d\x38\x95\x97\x23\x0f\x3b\xc9\x69\x7b\x7a\x12\xce\x1a\x90\x25\xc4\x7a\xbe\x52\xc2\xfc\x40\x0d\x4a\xcf\x48\x8f\x2c\xba\x66\xd1\xe2\x66\x05\x57\xb7\xd0\x56\xdf\x09\xa8\x3a\x68\xcf\x91\xa2\xaa\x71\xe2\x03\x0c\x13\x23\x4b\xe4\x89\xfe\xad\x7f\xea\xdf\x7a\x07\x1d\x74\x54\xa3\x0e\xd5\x7b\x39\x59\xed\xb3\x8f\xc5\x36\x06\x9f\xa5\xec\xbe\xac\x18\x37\x2c\xab\x35\xe7\x8a\x6a\x14\xe1\xba\x3a\x97\xa3\x5b\x81\xe8\xa5\x45\x47\x45\x36\x93\x33\x6c\x74\x14\x5b\x55\x59\x23\x74\x91\x36\x49\x58\xed\xa8\x06\xc1\xfe\x13\xb3\x21\x3d\x60\x0d\x4d\xaf\x98\x92\xb6\x1d\x72\x94\x3b\x64\x28\x77\xf8\x35\xca\x9d\xcb\x28\x77\x04\x5d\xe2\xdb\xd2\x8d\xc7\x11\x83\x70\xf4\x35\x84\xe6\x8b\x5c\x72\x8d\x97\x5c\x63\xf9\x6a\x5f\xe7\x3b\x93\x4b\x6e\xf2\x6c\x4d\x96\xad\xf9\x75\xb6\xd0\x97\xb2\xb5\x3e\x8d\x61\x8b\x8d\x61\xeb\xeb\x31\x2c\xc6\x3c\x36\x3b\x86\x12\x92\xc0\xcc\x07\xc7\x5f\x1d\x79\xfa\xb7\x79\x1d\xdb\xac\x8e\xed\xaf\xeb\x78\x21\x37\xed\x98\x67\x3b\x66\xd9\x8e\xbf\xce\xe6\x0e\xe4\x9e\x1c\x48\x9b\xc5\xa2\x8b\x4d\x62\xc5\x0f\xca\xa0\x45\xa0\x7d\x49\xaa\x46\xe7\x73\xa2\x46\x07\x0d\x5a\x44\x35\x1a\x2b\xe6\x99\x24\x01\x08\x93\x0a\x30\x8d\x09\x2a\x52\xf4\x64\x72\xe5\xf2\x92\xd0\xe8\xa4\xbe\x49\xd9\x34\x5c\x4e\x71\x92\xa4\xa0\x7d\x76\xd2\x51\x0a\x20\xba\x0e\x37\x04\x9c\xd8\xbd\xe1\x67\x90\xd3\xf9\xc8\x5b\x1b\xfa\x6b\x91\x17\x90\x69\xef\xc5\x83\xc3\x47\x29\x33\xb4\x26\xe6\x15\x5f\x39\x3e\xfe\x93\x02\x27\xe0\xc7\x1d\x7e\x0c\xcb\x5a\xc1\xe6\x02\xcf\xb8\x8a\x83\x63\xeb\x08\x6d\x6c\xa6\x6d\x52\x7f\x9f\x42\x4f\x06\x6f\x12\xf2\x9f\xb2\x21\x3b\xfd\xc3\x42\x2f\x01\x38\xf9\x0c\xe0\x84\xad\xd8\x27\x5f\xb6\x07\xda\x72\xca\x2e\x93\x61\x67\xb7\x62\x9e\x7a\x65\x23\x8a\xbf\x45\xc2\xd8\x08\x6c\xe5\xa4\xb3\xe4\x30\x5e\x46\x62\x9a\x48\x14\xbd\x9a\x6b\x95\x49\x93\x33\x4e\x75\xa5\xab\x26\x63\xc1\x6c\x92\x58\xa8\xb4\x29\x13\xfe\xa0\x9c\xb1\x19\x76\xf6\xf5\x0c\xdb\x8a\x79\x6c\x16\xf5\xce\x3a\x9a\xa7\x3d\x47\xc9\x1d\x3b\x5f\xcf\x8b\x88\xee\x5a\xc8\xc1\xa5\x55\xcb\x27\x25\xe9\x01\x33\x41\x44\x57\x2c\x91\x2e\x5f\x22\x11\xc9\xe7\x55\xc3\xa5\xed\x83\x14\xce\x77\xec\x02\xee\x21\x97\x99\x94\x34\xc4\x96\xe7\xd2\x95\xb2\xb4\x0e\xe2\xc1\x2e\xdd\xad\x8a\xa8\x88\x38\xbe\x3a\xaa\x10\xb6\x00\xd9\xd7\x8e\xc2\x19\xba\x86\x4d\x54\x83\xfc\xe7\x16\x14\x9d\x96\x9c\x7a\x0e\xe4\xcd\xfc\x72\x21\xa1\x10\xf6\xfd\x27\x90\x11\x62\x02\x9f\xbd\xcf\x2d\x94\xbd\x91\x51\x34\x8e\x55\x26\x6c\x99\xac\x42\x6d\xba\x0a\x9d\xad\x40\x0a\xde\x7f\x5f\xec\x3a\x36\xef\x36\x92\xcf\x27\x9b\xc4\xfa\xba\x42\xfe\x73\x4b\x5e\xd4\x22\xa1\x90\xc0\x68\x5c\x92\xdc\x1a\x4d\x3d\x92\xdc\x96\x7a\x04\xdb\x29\xe5\x7f\xde\x49\xb4\x1b\x29\x53\x33\xa7\x7b\x54\x6a\xc5\x71\x4e\xe9\x29\x08\x2b\x94\xc0\x93\x85\x8b\xed\x82\x43\x17\x0d\xf7\x37\xa1\x50\x53\x59\x6b\xf7\x07\x04\xa8\xa8\xb4\xe7\xaa\x92\x3f\xc9\xa5\x5b\x1a\x1f\x7b\x3f\xdc\xef\x8a\x5d\x70\xd4\xbc\x63\x00\xf0\x9a\xc5\xdc\x26\xbe\x79\x44\xf1\x55\x26\x75\xc5\x83\x6d\x1e\x6c\xd3\xe0\x88\x51\x84\x93\x2f\x07\x68\x2e\xaf\xb8\x43\x99\x91\x24\x78\x94\x7c\xbe\x8f\x49\x14\x78\xba\x6b\x76\x17\x16\x6a\x3b\x44\x77\xb5\xb6\x43\x50\xbf\xaa\x97\xe2\x8c\x6c\x24\xc6\x94\xa8\xf7\x09\x65\xd5\x46\xea\x3e\x5c\x00\xbd\xbb\x64\x4a\xc0\x0e\x2a\x9a\x8c\x74\x1a\x81\x6e\xa6\xfa\x3b\x53\x10\xd3\x89\xd6\x6c\x83\xa7\xaa\x63\xf6\x5a\xb2\x62\xf9\xe8\xea\xe2\xf3\x8e\x7c\xc1\xd6\x94\x8b\x3f\xaf\x29\x47\x7c\x4d\xa9\xb1\x35\xa5\x3a\x52\x2e\xfe\xb4\x58\xd4\x60\xb1\x48\x8a\xbd\xe4\x7b\xd6\x25\x5b\x00\x2f\xbf\x5e\x00\x37\xc7\x52\x6d\xaf\x3e\x6d\xc7\x57\x6c\xb1\xb8\xfa\x7a\xb1\xd8\x8e\x79\xec\xdf\x6f\xc7\x97\x99\xed\xf8\x59\xda\x1f\xe7\x1d\x4c\xb4\x7e\x35\xcf\x0d\xce\x1f\x13\x4c\xe8\x58\x71\x0b\xd9\xcf\x04\x13\x3a\x60\xdc\xcc\xfd\x16\xdb\xfe\x9a\x5b\xe2\xb6\x1e\xb0\x3e\x7e\x66\xb8\x42\x5c\x77\x89\xab\x03\x3c\xe7\x09\x65\x54\x2f\x88\xb0\x34\xae\x50\xb2\xb4\x37\xa3\xb8\xe7\x24\x57\xd8\x5b\x79\xec\xf0\xb3\x90\xe1\x56\x5e\x9c\x77\x31\x5c\x7d\x7f\xd3\x09\x9a\xeb\x76\x46\xbe\x62\x9c\x95\xc5\x7c\x79\xe6\x4e\xab\xd6\x31\xd1\x8e\x49\xea\x45\xed\x98\x50\x06\x37\x97\x3b\x79\x52\xc4\x87\x9a\x8d\x25\x6f\x52\x2c\x79\x53\xe1\xd4\x82\xbd\x17\x92\x2c\x3f\x4a\xc5\xe2\xc7\x07\x93\xa8\x4d\xfd\xa4\x9f\x3c\x29\xb6\xfa\xf1\x01\x1e\xd2\x9b\x5b\x3f\x94\x64\x46\xab\x12\x1d\x9f\x1e\x5c\x2e\x29\x35\xdd\xf4\x20\x83\x7c\xc2\xe6\xa6\x8b\x5c\x9e\x1d\x7e\xba\xda\x1b\x08\x2a\x16\x65\x3d\xc2\xe9\xbf\x0e\xe9\xbb\xab\xcd\xe3\x8c\x13\xfd\x59\x6b\x49\x03\xd5\x64\x5a\xb5\xf3\x0e\x77\x8b\xe1\x30\x6f\xae\xe9\xc2\x13\x10\xc5\xc9\x97\x54\x2e\x31\x8a\x1d\xb8\xb8\xf4\x4c\xdf\xc2\xfe\x9e\xb3\xcf\x9a\xe9\xe6\x7d\x55\x67\xf5\x74\x55\xc3\x66\x97\x9f\x32\x0d\xf3\x7a\xa1\x64\x1c\x2c\xc9\xe3\xd9\xad\x13\x85\x55\x2b\xe9\xc7\x4e\x4f\x19\xd1\x41\x9a\x77\xd4\x55\x7b\xc2\xe2\x02\x6c\x60\x73\x2c\x67\x42\xb7\xe9\x19\x4c\x8b\x64\x4d\xe8\xce\x3b\xc6\xa7\xbb\x39\xb9\x81\xc2\xfb\x23\x6f\x59\x1e\xdb\xa6\x6f\x7d\x17\x5e\xfc\xfd\xa4\x52\x9e\xac\x5b\xf1\x96\x2d\x45\x14\x8a\x5c\xcc\x70\x35\x3d\xf4\x71\x61\xed\x73\xd5\x8f\x8f\xf5\x93\x27\x78\x16\x31\xc6\xee\x27\x03\xb6\x6c\x37\xa5\x5b\x8f\xcb\x84\x1a\xe9\x20\x1b\x83\x27\xc5\x5b\x7d\x2a\x4b\xb4\xb7\xdf\xb6\xf6\xb6\x5f\xd2\x89\xf6\xb6\x47\xdf\x0a\x25\xbd\x18\xab\xdc\x39\x24\xd1\x86\x5b\x3f\x3c\xb3\x6d\xa1\x00\x50\xdf\xf8\xe7\xf3\x25\xa0\xcf\x3d\x8f\x92\x90\x6f\xb9\xdc\x79\x47\x71\x11\x04\x65\x1c\x78\xa2\x10\x17\x51\x84\xd7\x8b\x68\x84\x8b\xc6\x88\x89\x12\x8f\xc4\xf6\x34\xc1\x9e\x39\xb2\xb4\x37\x34\x63\x2f\x73\xf4\x82\x1d\x65\xa2\xa2\x08\x47\xb9\xdc\x0b\xc6\x78\x66\x00\xe0\x89\x6a\xf4\xf3\x98\x75\xf6\xac\xf0\x82\xb6\x54\x23\x4c\xbf\x7d\xb4\xa5\xc6\x0e\x8e\xf6\x4b\x7a\xa9\xd0\xff\x11\x7e\xd9\x88\xcf\xd3\x3a\xa0\xcf\xdf\x9e\xe9\x89\x15\x28\x6d\x09\x79\x4b\x14\x98\x61\x1b\x72\xb5\xc9\x40\x51\xe9\x46\xe4\xc8\x43\x3c\x97\x91\x94\x61\x2c\x72\x0c\x27\xeb\x47\xd5\x66\x72\x2a\xc5\x3d\xec\x1a\x6e\xa1\x20\xe4\x54\x6c\xd3\xb5\x32\x8e\xfb\x8b\xeb\x18\x7b\xea\x3b\x53\xc4\x3b\xe9\x28\x1e\x3f\x57\x76\xc5\x76\x0e\xe2\x0c\x1d\x70\x57\x5c\xda\x73\x73\x39\x85\x05\x5d\x75\xe8\xa6\xce\x33\xb9\xaa\xa5\xaa\x86\x27\x28\x32\xd3\x43\xbe\x05\x96\xe0\x1d\x3e\xe3\x62\x26\x3e\xdb\xea\x30\x7e\xe0\xa2\xa3\xdc\x75\x99\x77\xa7\x3a\xa5\xe8\x2c\xca\x28\x0b\xcc\x5d\x72\xff\xc6\xaa\x48\x77\x64\xb3\x6d\xed\xbf\x37\xdb\xba\x8d\x56\x6e\xd2\x0e\x10\x99\xcc\xd0\xba\x2c\x5d\xf6\x59\x7b\x98\x96\x4b\x37\x24\x17\x44\x10\xaf\x9e\x14\xf2\xd9\x74\x82\x8b\x6d\x70\x7e\x80\x1d\xfa\xe0\xce\x70\x60\x2c\xdd\x74\xe5\x66\x63\xab\xe6\x72\x1e\x48\x3a\xba\x88\x48\x2c\x3e\x1d\x26\x8f\x4b\x2c\x2f\x5a\x04\xbf\x9f\xb4\xce\xea\xd5\x2b\xfd\xf6\x08\x5d\xbe\x11\x7d\xc3\x7b\x1b\x0d\x23\x2f\x9a\xf6\x48\xb8\x81\x2e\xe6\x44\xdf\x18\x0d\xc3\x79\x34\x1c\xd0\x80\x18\x55\x69\x16\x76\xe7\xa0\x67\x6f\x66\x18\xc1\x23\xd3\x3f\xe9\xa4\xc6\x64\xc9\xad\xdc\xd7\xdd\x6e\x8a\xd1\xe2\x83\x48\xb4\x9b\xa9\x36\x3f\x66\xf1\x6c\xc4\x2d\x15\x49\x91\xe6\x6c\x6e\xa9\xf4\x5f\x06\x49\x97\x87\x81\x9d\xe9\xc4\x31\x92\xda\xb7\xa2\x01\xe9\x32\xe7\x12\xe1\xe5\x36\x75\xa6\x12\x60\x5b\xf1\x55\xd4\xc7\x8e\xe2\x8b\xde\xef\xe7\x72\xfd\x3d\x0f\x4e\xb5\xfa\x6a\xec\xe1\xe2\x9e\xc7\x68\x36\xaf\x50\x32\xd2\xfe\x90\x07\x92\x8f\x9e\xa4\xac\x29\x77\x4e\x32\x07\x14\x52\xc0\xa9\x2b\x43\x71\x5b\x16\xff\xb9\x63\xf9\x6c\x13\x0e\x7a\x37\x2d\xa1\xb2\x10\x30\x64\xf5\x81\x9e\xfe\xd6\xc7\x5d\xcd\x7b\x1b\x29\x22\xac\x64\x09\xd7\x4a\xb4\xe0\x7e\x1e\x7b\x2a\x82\x7d\xc9\x0c\x50\xdf\x52\x0d\x1f\x2f\x0d\x0b\xcf\x2e\xfa\x9f\x8d\xc8\x55\x3a\xa2\x51\x83\x05\xfd\xcd\x48\xd2\xe9\x68\xb1\x87\xb0\x67\xef\x7d\x7c\xf0\xc9\x5c\x97\x27\xb3\x07\x93\xd9\x67\xec\xdb\x12\xea\xf8\x16\xe7\xe5\x32\x28\x60\xcb\xe3\xef\x53\x92\xb8\xda\x62\x96\x11\x18\x36\x53\xe2\x1c\xa6\xc1\x01\xc5\xe9\xb3\xf3\xb3\xba\x7e\x89\x4e\xe7\x44\x1f\xb5\xd0\xe9\x8c\xe8\xa7\x01\xba\x9c\x11\xfd\xb1\x85\x5e\xde\x88\x7e\x77\x88\xce\x66\x44\x7f\x3a\x8a\x51\x4d\x4a\xff\xe0\x13\xfd\xfa\x08\x8d\x66\x44\x9f\x1c\xa2\x60\x41\xf4\x5a\x1b\x8d\x67\x44\x3f\x38\x44\xf3\x37\xa2\x3b\x75\x01\xe4\xf5\x8d\xe8\xf7\x87\x31\x3a\xa4\xb9\x79\x8a\xde\x82\xe8\xdd\x2a\x41\xb3\x37\xa2\x1f\x8e\x09\xba\x38\x6f\x9d\x75\xae\xf5\x97\xd6\x12\x5c\x56\x58\x8c\xea\x34\xef\xf1\x1b\xd1\xbb\x6d\x14\xce\x89\xfe\x38\x27\xe8\xe8\x8d\xe8\x41\x3b\x46\x0d\x1a\x77\xe7\x13\xdd\xab\x23\x3b\x20\xfa\x65\x17\x55\xdf\x88\xee\xd7\x63\x74\x44\xa3\x2e\xe7\x44\x9f\xb7\xd0\x64\x4e\xf4\x5a\x13\x1d\xcf\x88\x3e\x6b\xc4\xa8\x29\xb5\xe5\xaa\x75\xd4\xec\xe8\xe7\x13\x74\x52\x6f\x74\x74\xd2\x45\x9d\xf3\x0b\x7d\xb3\x8d\x0e\xce\x3b\x9d\xf3\x53\xfd\xe2\x10\xdd\xfb\x44\x9f\x1c\xa1\xde\x9c\xe8\xcd\x23\x34\x7e\x23\xfa\xd5\x61\x8c\x5a\x12\x8c\x2f\xb2\xc4\xe8\xba\x83\xdf\xcf\x6f\xf4\xab\x2e\x3a\xbb\xd1\x3b\x41\x8c\xda\x34\xd7\xed\x8c\x80\x5f\x9b\x19\xd1\x7b\x75\xd4\xa6\xad\x6d\xc4\xa8\xd3\x49\xe0\xf1\x12\xdb\x73\xa2\x3f\xb5\x62\x74\x4c\x33\x4d\xde\x88\x5e\x1d\x13\xf4\x42\x7b\xef\x80\xc4\xe8\x04\x9a\x4e\xbb\xe5\x08\x0d\xe7\x44\x3f\x7c\x25\x31\x3a\x95\x6a\xd5\x9d\x13\xbd\x71\x24\xba\xe5\x62\x46\xf4\x61\x0b\x7d\x5b\x2c\x88\xfe\x4a\xf3\x9f\xd1\xa4\x57\x73\xfd\x2d\xc8\x26\x89\xd1\x39\x8d\x39\xac\x37\xaa\x37\x27\x1d\xdd\x6e\xa0\xb3\x37\xa2\xf7\x1a\x31\xba\x80\x95\xf3\x8d\xe8\x9b\x75\xc4\xfb\xfc\x66\x46\x74\xbf\x1d\xa3\x4b\x68\x17\xad\x76\x90\x8d\x4a\x46\xf1\x26\x6d\x1e\xc7\xb3\x93\x39\xd1\x0f\xde\x08\x6a\x50\x3c\xa8\xc7\xe8\x0a\x56\xd9\x37\xa2\x47\x63\x82\xfa\x6f\x44\x1f\x8c\x49\x8c\x6e\x3b\xf8\xbd\x3f\x27\xfa\xe5\x11\x47\x8f\x18\xdd\x75\xb0\xf9\xce\x64\x1f\x36\xfe\x63\x7b\xbb\x5c\xae\xd5\x36\x50\xd8\x0b\xba\x53\x8f\x86\xfc\xdc\xa9\x36\xea\x5b\x1b\x31\xe2\x69\xbc\x03\x29\xb2\xd1\xd8\xde\x2e\x16\xd3\xc8\x20\x1b\x59\xab\xc9\x91\x9d\xaa\x14\x59\xfa\x59\xdb\x2a\x1d\xa6\x91\x1b\xff\xf1\xeb\x57\xb1\xf8\xeb\x97\x5c\xf4\x61\x63\xa7\xd4\xc8\xa4\xa1\x29\x6a\x65\x39\x4d\x69\xa7\x76\xd0\x68\xc8\x69\x0e\x0f\x7f\xfe\xac\x54\x36\x32\x15\xf9\x55\x39\xdc\x92\xd3\x94\xcb\xd5\x6a\xb1\x28\xa7\xf9\x55\x69\x1c\xc8\x95\xdd\xf8\x8f\x83\xdd\xad\xfa\x56\x3d\x53\x9f\x83\x72\x79\xa7\xb4\x11\xa3\x6f\x69\x7f\x95\xca\xdb\xbf\x76\xe4\x44\x3b\xa5\xdd\x83\x5a\x39\x05\x44\xe4\x2e\x39\x38\x2c\xd7\x0e\x32\x2d\xda\xda\xaa\x56\xb3\xad\xde\xde\x39\xac\xd4\x32\xb5\xad\x56\xab\xd5\x52\x49\x4e\x53\xff\x55\xff\x55\x6a\x64\x5b\xb4\xbd\x9d\x1d\xb8\x5f\xbb\x95\xca\x61\xa6\xac\x7a\xb9\xb2\x9d\x6d\x75\xa3\xb1\xdb\xd8\xca\xb4\x7a\xf7\xa0\x58\x29\x66\x7a\xef\x70\xab\x78\x50\x3c\xc8\x94\xb5\x53\x2a\x96\x33\x69\x0e\xca\xa5\xc3\x83\xaa\x9c\x66\x7b\xeb\xd7\x56\x79\x2b\x83\x48\xc5\x83\xc3\x4a\x5d\x4e\xb3\xb3\x53\xf9\x59\xcd\x8c\x66\xb9\x5a\xad\xd4\x7e\x66\xe0\x1c\x6c\xd7\xab\x99\x76\x95\x0f\x2b\xc5\x5a\xa6\x5d\x07\x95\xca\xf6\x56\xa6\xac\xc3\xea\xaf\xd2\x76\x59\x4e\x53\x2a\x1f\x96\xb7\x32\x6d\xdf\x3a\xac\x57\xb3\x69\x0e\x7e\x95\xb6\x77\xb7\x33\xfd\xbc\x5b\xaa\x57\x33\x69\x1a\x3f\xb7\x77\x7e\xd5\x37\xd0\x37\xa9\x13\x77\x76\x76\xab\x99\x86\xfd\xaa\xed\xfc\xda\xce\x60\x45\xad\x58\x29\xfd\xdc\xc9\x0c\xea\xaf\xda\xcf\x52\xa6\xb0\xc3\x4a\xbd\xbe\xb3\x9d\x41\x8e\x6a\xa5\xb2\x7b\x98\x41\x8e\x7a\xb5\x52\x2b\x67\x07\x7e\xf7\xb0\x94\x1d\xf8\xca\x61\x69\xeb\x57\xa6\x61\xf5\xea\x52\x59\xf5\x5f\xb5\x6a\x76\xfa\x15\x6b\x3b\xbf\xb2\x9d\x58\xfa\xf9\xab\xbc\xbd\x2b\xa7\xa9\xfc\xdc\xfe\x99\x45\xc4\xda\xce\x4e\x85\xc2\xb1\xd0\x35\x5d\x6f\x12\x4c\x83\xff\x32\x98\x56\xa7\xff\x36\x62\xd4\x69\x11\x6c\x9a\x3b\x16\x32\xb7\x90\xfc\xfb\x13\x95\xd1\xee\xd2\xdb\x36\xfa\x89\x76\x50\x19\x55\xb2\x5f\xcb\xb1\x68\x17\xfd\xb2\x2c\x74\x43\x6b\x00\x6e\xd2\x3a\xde\xdb\xf4\x7a\x3a\x0f\x3d\x9d\xd7\xe8\xa6\x8a\x7a\x53\x12\xf6\x1c\x7d\xbd\x18\xa3\x60\xdc\x73\x29\xfd\x39\xd1\xdf\x6d\x32\xf1\xe8\x2b\x5d\x69\x07\xbd\x68\x38\xa6\x59\xcf\x47\xc4\xe9\x4d\xe7\xba\x56\x61\x61\x47\x3c\x7d\x12\xfe\x13\x7d\x8b\xbc\xd7\x4e\x6f\xc0\xf2\xae\x97\x10\x09\xc3\xe1\xeb\x29\x4d\xac\xaf\x17\x69\xae\xeb\xe9\x78\x18\x05\x27\xbd\xc8\x3b\xec\xb1\x83\x7e\xfd\x27\x44\xdc\x79\xa4\xbf\x22\x98\xa5\xef\x0c\x3f\x45\xef\xd0\xd8\xb3\xe1\xd4\xe9\x26\x41\x25\xc8\x71\x4a\x9e\x58\x75\x97\xc3\x45\x33\x24\x10\xb3\xa8\x37\xed\x74\xc7\xde\xa4\x3b\x0c\x5d\xbd\xa4\xb1\x90\x89\xfe\x3e\xe8\x85\x61\x6f\xe2\x39\xc3\xc8\x9d\x80\x0d\x9f\x01\x99\xea\xe6\x46\x57\x1f\x0c\xf4\xc9\x44\xbb\xbe\xbe\x5e\x23\x1b\x16\xea\x45\x53\x6f\xfc\x42\x42\xdd\x2c\xa1\x1d\x54\x2a\xa2\x9d\x22\x2a\x15\x8b\x68\xab\x48\x5f\x8b\x56\x8c\xbe\x84\xb1\x3a\x7f\x69\x07\x6d\xd3\x6c\x83\x5e\x34\x9b\x7a\x52\xb6\x8b\x20\x9b\x7a\x8b\xa6\xe7\x89\xbb\xc3\xd9\x38\x53\xc2\x27\xd8\x5b\xa8\x8c\x4a\x5b\x56\x8c\x5c\x32\x97\x52\xb6\x7c\x54\xfd\x04\xb7\x42\x8b\x1f\x46\xd3\xae\x0c\xf2\xf4\xf4\x74\x6d\x0e\x76\x0b\x4f\xd7\xe6\xf3\x0d\x74\x5c\xcb\x66\xfb\xb6\x8d\xca\x56\x8c\xe6\x1e\x91\x6b\x72\xd7\x5d\x51\x69\xda\x3b\x4b\xfd\x84\x4a\xf5\x6d\x2b\x8e\xe3\x2c\x5a\x4d\xf4\xf7\x3f\x8e\xc6\x9d\x27\x43\xff\xfb\x9e\xf7\xfd\x95\x1d\xbe\xaa\xb7\x2f\x0f\x56\xf5\xf6\x3f\xed\xea\x4f\xfd\xbc\xdc\xc9\xab\xba\xf8\xb8\x26\xcc\xcc\xd2\xff\x96\x80\x6e\xff\xfb\x7d\x1b\xa3\x5b\xba\x0e\x74\x7b\x93\xe9\x30\x18\x93\x81\xfe\xde\xad\xbe\xf5\xa4\xa9\x5e\x83\x15\xe1\x52\x5e\x05\xd8\x22\x71\x19\xc7\xc8\x26\x63\xfd\x3d\x18\x0f\x67\xa3\x3b\x70\xe1\x78\x74\x40\x21\x7e\xbb\xa3\x20\x5f\x00\xce\x4d\x8b\xa0\x6e\xf2\x36\xe9\x2d\x3c\x06\x9e\xce\xe1\xde\x02\xe6\x2b\x79\x83\xb7\xed\x62\x0c\x42\xa4\x67\x64\xe0\xe9\x41\x0d\xad\x5e\x9a\xde\x3c\x2e\x80\x5a\x8c\x91\x3d\xb3\x6d\xe1\xe4\x71\x29\x51\x1c\x23\x87\x44\x6e\xe8\x4d\xa6\x3d\xa7\xaf\xbf\x77\x87\x74\xc5\x69\x4d\xae\x7a\x93\x5e\x14\xe8\xeb\xa5\x18\x91\x28\x1a\x32\xa7\xfe\x13\x38\xed\x9f\x0d\x56\x40\xa2\x64\xfe\x64\xea\x0d\x58\x2f\x38\x07\xb1\x30\x2a\xf5\x39\xe9\x4d\x75\x29\x69\x8c\x06\x74\xcd\xa1\xed\xa5\xcd\xa8\x89\xa5\x15\xb0\x39\x1b\xfa\x50\x45\x36\x71\xfa\xb4\x27\x23\x97\x05\x31\x17\xb5\x0b\x0f\x71\x0f\xb2\x9b\x55\xfe\xc6\x7a\xba\x18\x23\xa7\x4b\xc6\xd3\xea\xd8\x23\x74\xb0\x56\x65\xa6\x23\x34\x1d\x0e\xc3\x69\x6f\xf4\x55\x27\x65\x47\xf9\xb6\x9a\x0c\x33\x0b\x78\x3a\x40\xa3\x9e\x77\x1d\xf6\x1c\xef\x00\xfc\xda\xb2\xe0\xaa\x47\x83\xaf\xbc\x49\xcf\x9d\xb1\xd8\x24\xf9\x37\x91\xfe\xd3\xc8\x55\xbd\x18\x91\xb1\x47\x92\x6d\x61\x3b\x41\xd4\x89\xfe\x3e\x81\xa4\x07\x87\x5c\xac\x98\x72\x5b\xbd\x88\xb7\xb5\x04\x8e\x79\xa5\x7c\x36\x19\xb3\x18\x6d\x6b\x07\x4d\xba\xc3\xf1\xf4\x20\x09\x29\x21\x7b\xf8\x96\xc6\x52\xbe\x54\xe4\x2c\xa1\xd1\xb0\xc7\xa5\x94\xcb\x31\x22\x70\x3c\x30\x39\xf5\xa2\xd9\xea\xee\x41\x6e\x6f\x42\xec\xd0\x73\x3f\xb5\x65\xe3\x3f\x9c\x22\xfd\xb7\x11\xc7\x28\xf4\x02\x2f\x72\xf5\xf7\xc8\x7b\x3d\x61\xaf\xeb\x25\xb4\x12\x3b\x46\x24\xe8\x45\xc1\x0a\x60\xc5\x62\xa9\xe4\x38\x1b\x31\x9a\x38\xe3\x61\x18\x56\xc7\xe3\xe1\xeb\x44\x7f\xa7\x15\x7c\xe1\x5d\x9b\x24\x42\xbd\x48\x0e\x7f\xa2\x78\x46\x82\x60\x0c\x77\xf3\xc3\xa8\x43\xc6\x81\x37\xa5\xfb\x33\x00\x67\x93\x4d\x54\x71\x25\x0e\x7c\x9e\xc5\xa5\x62\xf1\x47\x49\x2b\x97\x76\xf3\x87\x5e\x8c\xa4\xa5\x21\x24\x93\xe9\xc1\xcc\xe9\x7b\xd3\x0b\x6f\xec\x78\xd1\xb4\x17\x7a\x7a\x11\x75\x7b\xae\xc7\x82\x5b\x53\x6f\x30\xa1\xed\xff\x66\xc3\x37\x74\x75\xa1\x44\x51\x9e\x25\x38\x9b\x0d\xbc\x31\x9b\xf4\x49\x80\x4d\x43\x32\xa2\xdf\xf7\x19\x6b\x89\xe2\xa0\x7b\x5b\x3a\x43\x7f\xc8\xa4\x28\x15\xb8\x68\x76\x21\x9b\xea\x31\x93\x6a\xfb\x3b\xf9\x4e\x0a\x5b\xf4\xf7\x3b\x61\xc7\x71\x9b\xd9\xe3\x38\x32\x07\xd6\xb7\x05\xac\x2f\xf2\xe7\x44\x9f\x1e\x49\xd5\x22\x6d\x00\xb7\xa4\x5a\x73\x7b\x24\xe4\xd7\x17\x4f\x5c\xfb\x2b\x09\xb9\x6f\x11\x16\xf4\xd4\x12\x41\x0f\x22\x68\x9a\xa4\x7a\x6c\x91\x44\x01\x2c\x01\x25\x1b\x8f\x6c\x4b\x4e\xe5\x2f\x22\x85\xa0\xe8\x90\x8b\x6d\xae\x7f\xf6\x33\xe7\xb2\x24\xed\x67\x82\xb6\x8b\xaa\x41\xf0\x26\xfd\x6c\x3d\x13\xb4\xd9\x02\xe3\x50\x04\xb3\x86\x24\x47\x37\xb3\x31\xa0\x8e\x6e\xa3\xc5\x8e\x4e\xd0\xf9\xad\xee\x66\xcc\x2e\xb2\x66\x13\x4c\xcc\xb6\x6b\x89\xd3\xb1\x61\x0f\x0e\x3c\x89\x79\x62\x5b\xca\x8f\xff\xeb\x3a\xff\x23\x50\x3f\x3e\x4c\x4b\xb2\x9a\xd7\x26\xcb\x76\x3f\x18\x28\xe4\xe2\xa7\x27\x85\x8c\x83\xd9\xc0\x8b\xa6\x13\x54\x52\x91\x87\x1d\x7e\xf8\xe7\x8a\xe3\xb3\xcd\x9e\xe2\x21\xd7\xf4\x2d\xf5\xe3\x03\x3c\x08\xc3\xbb\xe1\x60\x66\x68\x60\xe2\xa9\xc6\xc0\x06\xf9\xe0\xb4\x48\xaf\x9d\xb9\xf4\xf8\xb2\x38\x07\xfb\x6d\x02\xf2\x75\x5f\xc3\xf2\xdb\xd9\x5b\xad\xeb\xd5\xb2\x88\xeb\x9b\x3d\x66\x57\x47\xbe\x0e\xbc\xe7\x37\xb1\xf7\x1d\x34\x39\x53\x8d\xa0\xa7\xdc\x77\x54\xe3\x0e\xdf\x73\x33\x13\x4f\x2b\x64\x00\xdf\x37\x9c\x90\x4c\x26\x1b\xba\x7b\xc8\x34\xc4\xae\x43\x85\x24\xf5\x8b\x91\x8d\x89\xd6\x23\x8a\xaa\x3d\x29\x17\xc8\x46\xc4\xbc\x5f\x70\x71\x9d\xde\x44\x23\x4f\xb4\x12\xda\x23\x88\xf2\x3d\x9e\xa6\xa6\x95\x24\x01\xbe\x3b\xed\xbe\xbf\xe2\xb2\xf6\xe1\x10\x5c\xfa\x75\x57\xc9\x5f\x12\xb3\xe3\x58\x18\xbf\xf8\x34\xc9\xe9\xb2\xda\xfa\xfc\x54\xb1\x91\x73\x98\x94\x71\xdf\xd1\x3c\xed\x94\xa4\xca\xf7\x60\xb4\x21\xb0\x57\xba\xc1\x3d\x07\xd3\x51\xce\x0a\x09\x97\x35\xef\x99\xc4\x86\x7b\xa6\x78\xcf\x64\x45\xc6\xc8\x7b\x5d\x9b\x9d\x31\xc9\x8c\x7b\xa6\xf1\x96\xb1\x01\xf0\xc0\xfb\xfe\xa1\x83\x68\xa7\x07\x3d\xe5\xa1\xa3\x1a\x0f\xcc\x1c\xd3\xaa\xe2\x7c\x5e\x9c\xff\xb7\xc5\x3d\xac\x28\xee\x31\x2b\xf8\xbc\xc9\x74\xd8\xe5\x1b\xcd\xcd\x44\xf7\x3e\xbd\x95\x01\x29\x4b\x32\xf5\x14\x62\x7a\x0e\x1d\x46\xe4\x31\x25\x4e\x9b\x5d\x88\x99\x5d\x73\x6a\x21\xd0\xe3\xb0\x4c\xc7\x42\x7d\x5c\x34\xfa\x7b\xbe\x91\xcf\xf7\x55\x6e\x51\x8e\x98\x4f\xed\x3c\xb9\x31\xfb\x96\x85\x22\x4c\xcc\x4e\x83\x7f\x81\xe0\x0a\x51\xd1\x08\xdb\x66\xdf\x42\x13\x1c\xb4\x89\xd9\x87\xdb\x9e\x22\xc6\x23\xd5\xc3\xde\xc7\x47\x71\x1d\x47\x70\xa3\xe2\xa0\x10\x32\xb8\xc8\x9c\x58\xdc\x64\x9d\xb7\x9f\x86\xe5\x47\xdf\x95\x52\x1e\x14\x51\x94\xa8\x30\x51\x7f\x8c\x54\xd5\x52\xf5\x4c\x82\x20\x89\x12\x0a\xad\x71\x9c\x88\xdb\x24\xfd\xd0\xcd\x4e\xce\xae\x59\xb7\x90\x8b\x03\xb8\x75\xf1\x8c\xac\x41\xe0\x5c\xae\x88\x99\x46\x44\x3e\xef\xa9\xae\xe9\x59\xb8\xc8\x1b\xe0\x89\x15\xcf\x35\x8b\x16\x76\xc0\xc2\xed\x0f\xdb\x2c\x5a\xea\x77\x1b\x24\x57\xf8\xfd\x62\xd1\x20\xa6\x57\x28\x59\xbf\x71\xaf\xcd\xde\xf6\x7d\xac\x55\x40\x3c\x93\x7e\xc1\x0d\x96\x56\x52\x0d\x80\xee\x28\x74\x28\xac\xbc\xaf\xfe\xa0\xc5\x52\x58\x9e\x95\xca\x0c\x49\x7a\x0b\x62\x35\x84\x81\x37\x8b\x88\xfd\x2b\x59\xa9\x48\x27\xb6\x6f\xe4\x28\xa5\x92\xe7\xba\x72\x85\x92\xfa\x9f\x15\x0b\x15\x4a\x12\x76\x38\x37\x59\x6b\x3b\x60\xb0\xf9\xf3\x54\x34\xd9\x6d\x84\x7b\xa3\x10\x55\xb5\x62\xb6\xf8\x27\xe2\xfa\x04\xdf\x5c\x29\xe2\xbe\x02\xb9\x2a\xb2\x4d\x62\x19\x0e\x6e\x36\x88\x14\xcc\x16\x7f\xc7\x2c\x26\x0d\x23\x7b\xd8\x85\xfb\xc1\x7d\x9a\x41\xa7\x23\xe4\xdd\xf0\x9b\x06\x07\xac\xbb\xa0\xf3\x9e\x62\xcb\x8a\x46\x76\x52\x5f\xf2\x19\x8b\xd9\x06\x64\x70\xfb\xb6\xec\xbe\xde\x66\xd6\x65\x5d\x95\xa9\xca\xdb\xa6\x6b\xa9\xef\x6e\x62\x47\x76\x6d\x1a\xbb\x78\xbd\x18\xf7\x7c\x25\xb9\x72\x26\xc6\xdf\x64\xe7\x56\x72\x6f\x98\x7e\x30\xcc\x04\xcf\x42\x1e\x9b\x05\x1e\x9f\x01\xa0\x72\xe4\x8b\x77\x2f\xef\x7c\xa7\x99\xad\xe4\xda\x9f\xc8\x96\x08\x6f\xd2\x1b\x29\x58\x50\xfb\x3e\xdd\xef\xa0\x55\xdc\x4c\xc4\x81\x10\x03\x79\x98\x10\x61\x48\xe2\x7e\x3b\x99\x78\x8e\x25\x17\xcb\x94\x05\x26\x24\x99\xa5\x8e\xc5\xe5\x5a\x16\x6f\x69\xb7\x89\x92\xd4\xf8\x90\x28\xfe\xcd\x92\xa4\x8f\x2c\xf4\xf9\xf6\x87\xcc\xa2\x2a\x79\x61\x83\x85\x24\xc5\x43\x8d\x78\x4e\x66\xed\x4a\xbb\xdf\x96\x30\x95\x2e\x64\xb4\x58\xad\x3a\xfc\x4a\xd6\x6a\xf1\xb6\xc7\xdb\xbf\xcf\xbf\x97\x2f\x56\xfb\x62\x46\x3c\x7c\x21\xad\x5f\x5c\xc7\x92\x3d\x75\xa6\xc9\x51\xcc\x88\x44\x00\x5a\xbf\x7f\xba\x9e\x2b\x94\x0c\xc9\x4e\x32\x72\x28\x05\x62\x25\x62\x20\x14\x29\xec\x3c\x26\xa6\x6b\x7d\x0f\x28\x2a\xa4\x7b\x9d\x64\xef\xf3\x66\x85\x34\x49\x70\x93\x5c\x8a\x3b\x86\x53\x28\xa8\xb6\xe9\x58\x18\xd6\x38\xf2\x23\xa0\x83\xa5\x22\x52\xc0\x34\xf4\x3b\x7c\xae\x10\x9f\xe9\xde\xb0\x46\xf7\x6e\x24\x83\x31\xd0\x8e\x34\xcd\xd3\x8d\xd4\x0b\x50\x13\xd3\x7d\xb6\x14\x29\x45\x8f\x43\xf9\xf9\x9b\x36\x6d\x1f\x64\xc4\x9f\x9f\x94\x22\xfa\x59\x00\xa9\x25\x55\x87\xf5\x31\xb5\xb9\xba\x94\x3f\x14\x7d\xcf\xaa\x91\x5a\xb3\x01\x14\x29\xfd\xaa\xc0\xda\xc4\x17\xa2\xa2\x6a\xd8\xe6\xab\x6b\xd1\xa5\xae\x6c\x7d\x7c\x14\xd5\x3c\x4d\x41\x43\x67\xae\xa5\x10\x73\x07\x02\x0d\xdb\x6c\xb0\x44\x3f\x79\x22\x6e\xb3\xa7\x39\x9c\x8d\x27\x0a\x31\xb7\x79\x32\xb0\x0f\xc8\xce\x48\x14\x62\x6e\x49\xa1\xd7\xec\x90\x05\x8c\x8e\xcb\x69\xd3\xf3\x1a\x58\xb6\x21\xea\x73\xd7\x0e\x96\x28\xaf\xaf\xb4\x40\xc8\x77\x3b\x56\xe3\x6f\x30\x4f\x6e\xf0\x86\x0c\x7e\x8d\xd7\x60\x8d\xd7\x6f\x0d\xea\x0e\xbd\xb2\x76\x3a\x8c\xa6\xdd\xb5\xc6\x2c\x0c\x1f\x3c\x32\xce\xb8\xc9\xe8\xdf\x60\x73\x43\x3e\x56\xda\x40\x1b\xe9\x1b\x3f\x0f\xda\x40\x1b\x70\xde\xb3\x81\xbc\x29\x41\x1b\xec\xc4\x66\x03\x6d\xc0\x49\xcc\x86\x85\xc2\x1b\xfc\x1e\x1b\x8f\x4a\xff\x66\x49\x2e\x26\xbc\x31\x89\x85\x6d\x2e\x01\x33\xb8\xc1\xa6\x59\xb2\xe8\x3e\xc1\x7e\xd3\xa7\xfc\x96\x7d\x5f\xfe\xa2\xdf\x16\x0a\xda\x04\xa7\xc9\xe9\xaf\x85\x7a\x34\x6c\xa7\x58\x44\xdb\xf0\x57\xda\x42\xa5\x1d\x54\xa6\x31\xc1\x0d\x36\x4b\xa8\x54\xdf\x46\xe5\xfa\x4f\xb4\x5d\xae\xef\xa0\xdd\xf2\xcf\xfa\x0e\xda\x2a\x6f\xfd\xaa\xfc\xdc\xde\xa5\x39\x4a\x3b\x3b\xe5\x5f\x5b\xe5\xfa\xb6\x64\x50\x2d\xba\x59\xc1\xfe\x1c\x04\xcc\x6c\x46\x2d\xe0\xbc\xcb\x3b\xe9\xeb\x51\x9b\xa0\x83\xb9\x3e\x6c\x13\xae\xe5\xdb\xee\x4a\xb1\x23\x16\xfb\x9c\xc4\x76\x18\x88\xba\x9c\x68\xcc\x12\x4d\x68\xa2\x2c\x73\xb4\x14\x2b\x31\x4a\xe3\x76\x86\x6f\x24\x99\xc9\x38\xc9\x44\x92\x34\x22\xca\x46\xb0\x45\x3f\x8d\x1e\x66\xa2\xd3\x2d\x4f\x4a\x32\xca\x96\x9b\x5d\x04\x9e\x33\x91\xb0\x24\xc8\xd2\xab\x37\x19\x2d\xdb\x8b\xbf\x12\x8b\x5f\x97\xc9\x7e\x53\xc4\x4e\xfc\xa0\x0c\x6f\xd0\x0b\x30\x11\xc3\x9b\x2f\x35\x75\x87\x37\x9a\x67\x1e\x3b\x96\x4c\x82\xb3\x5d\xbf\x21\xeb\xd6\xce\x67\x60\xfb\x04\x9b\x16\x13\x85\x23\x9a\x84\xf3\xaa\x08\x5b\xfa\x64\xd8\x9f\x7c\xd2\x29\x90\x7c\xb8\x64\x9e\xa6\xa3\xf3\x21\xf9\xa2\x93\x42\x4d\xda\x31\x6d\x13\xc5\xb4\xe9\x0a\x07\x22\xa2\x67\xb6\x85\xe8\xfe\xce\xd5\xfc\x1e\x8a\x56\x86\xb4\x9e\x8a\xc5\xed\x55\x12\xc6\x26\xb2\x0c\xde\xca\x65\xe1\xfe\xab\xe5\x22\xa6\x4c\xda\x9d\x76\xfd\x85\xfe\x9f\x76\xad\x30\x23\x73\xb5\xf6\x4a\x6b\x5b\x50\x1b\x1a\x7f\xd3\x58\x15\x3f\x4c\xe2\x47\xc5\x95\xbc\x14\x58\xa7\xf3\x8b\x9f\x65\xc1\x13\x9c\xa2\xec\x3a\x2c\xd0\xc5\xac\x09\x3a\x59\x27\x34\x43\x2c\x72\x35\x6c\xb0\xa0\xcd\xed\x61\x97\x85\x96\x98\x62\x17\x88\xfa\x03\x2c\x49\xdc\x28\x1e\xe2\xe8\xc5\x7b\xfa\x52\x35\x9c\x7d\x05\x88\x58\x09\xa3\x81\x72\xc4\x9b\x52\x98\x4d\xc9\xc6\x92\xaa\xea\x0a\xc9\x84\x13\x16\x8e\xec\x0c\x04\x9a\x1a\xe4\xbf\xbc\x1b\xc5\xa3\x4f\x20\x28\x91\xb0\x10\x39\x74\x09\xf6\x70\x71\xcf\xa5\xb1\xfb\x9e\xce\x89\xa8\xc1\x38\x91\x59\x3f\x74\x09\xb6\x0d\x47\x52\x08\xe5\xd3\x31\xd1\x03\xb5\x39\xa5\x49\xbb\xe5\x72\xeb\x53\xb7\x10\x21\x8e\xc3\x4d\x49\x0d\xc6\xc4\xb0\xf7\x04\x6c\x43\x65\xda\x66\x82\xe7\xb2\x29\xa5\xce\xd5\x06\x86\x2e\x41\x25\xe6\xbb\xe7\xe3\xc3\xde\xc3\x22\xcf\x52\x96\xd5\xfa\xa8\x22\x9a\xb5\x62\x3c\x12\x26\x30\x4f\x5b\x9f\x47\x9b\x92\x4b\xa2\x44\x15\x71\x02\xef\xa1\x48\x09\x76\xd6\x68\x17\x4f\xe7\x23\x6f\xe8\xaf\x11\x8c\xf1\x53\x77\x9f\x9b\x79\x23\xaa\xfe\xc9\xe0\x1b\x58\x57\xa6\x60\x67\x74\xb5\x5f\xb9\x63\x6c\x49\xef\x95\x3f\xec\x24\xdb\x99\xaf\x72\x36\xe5\xd6\xa7\x4d\x27\xfb\xbd\xb3\x1c\x5f\x5c\x0a\xd8\x5a\x4e\xb1\xb3\x9c\xa2\x54\x2c\x5a\x16\x7a\xa1\xed\x70\x46\xda\x69\xfd\xb0\x75\x73\xfa\xd7\x61\xb5\x53\x47\xff\xce\xe7\xc3\x50\x7b\xa8\x57\xaf\xfe\x3a\x3d\x3f\xeb\x34\xff\xaa\x1e\x1c\x5c\xa1\xbb\xae\x85\x5e\xa1\xbb\x68\x2b\x68\xcb\x68\xdd\xa0\xc6\x5b\xf4\x07\x6a\x46\x6b\x43\xbf\x59\x40\x51\xda\xa5\x59\x57\xb0\xe6\xf0\x66\x96\xd8\xd7\x76\x71\x69\x1b\x17\xbd\x26\xda\x9e\xf4\x4a\x49\x84\x6c\x17\x57\xec\xf8\x69\x67\xa7\x63\xf2\x33\x79\x13\x23\xf3\x6d\x69\x58\xfe\xf7\x8e\xf9\x5b\x76\xcc\x3b\xad\x53\x79\x18\xc5\xe7\x75\xf3\xfc\xaa\xc3\xbe\x12\xfc\xcf\x06\x83\xad\x6d\x4e\xef\xc1\xfd\xd0\x3f\xc2\x85\x74\xbb\x99\xb7\x3f\x59\xa3\x17\x67\x2d\x76\x81\xc0\xe9\xc3\x6f\x1c\x66\xce\x5b\x05\x5f\x11\x31\xe6\x81\xb1\xda\xa1\xfa\x83\xbd\x94\x8a\xaa\x8a\x42\x7c\x7b\xa5\xec\xac\xd8\x8f\xde\x9f\x3c\x3d\xb1\x28\x12\x15\x88\x8a\x82\x1b\x7d\x27\x8e\x55\x34\xa2\x5c\xca\x04\xaf\x97\xb8\x2f\x97\x30\xf1\xe5\xc2\xfc\xb8\x84\xcc\x8f\xcb\x82\xd6\xf7\x87\xf2\xa2\x3d\x79\xdf\x5f\xb4\xe0\x46\x45\x76\xe6\x2b\xb5\xa3\x08\x26\xb2\x0e\x6c\x4b\xe9\xf4\x94\xc5\xaa\xc3\x85\x17\x44\xac\x98\x19\xbe\x98\xa8\xcc\x22\xd9\x04\xaf\x93\x27\x65\x91\x70\xcb\x37\x3d\x65\xb4\x44\xcf\xa6\xe7\xba\x36\x57\x19\xa2\x53\xca\x63\xc6\xea\x7d\xec\x6a\xc7\x63\x62\xf8\x7b\xd8\xd5\xda\x63\x92\xcb\x79\xeb\xd8\x37\x3c\xec\x23\x3f\x8f\x5d\xed\x64\x4c\x04\x1f\x0f\x6a\x45\x8e\x16\xdc\x7c\xf7\x69\x7f\xa5\x9f\x8a\x9f\x0f\xbe\xbb\xda\xe9\x98\xa8\x2a\x8a\x70\x5f\xf1\x50\x88\x1c\xed\xc9\x53\x8d\xe8\x37\xd1\xfa\x83\x5c\x4e\x21\xf8\xbd\x3f\xd0\x23\xd4\xf5\x88\xfe\xbe\xd9\xd3\x21\xb7\xa7\x7e\xa7\xc9\xd0\x6c\xcc\xbe\x43\xf6\x1d\xc7\x12\xf3\x8f\xbe\xd1\x8c\x05\x97\x40\x56\x66\x36\x44\xeb\x7a\x12\x61\xb8\x58\x46\x08\xd9\x4a\x99\x69\x21\xc0\x0b\x14\x61\x37\xef\xa3\x11\x66\x46\x57\xc2\x1f\x4a\xa9\xa0\x38\x79\x4f\x55\x7f\x04\xac\x35\x53\x1e\x1a\xd1\x10\x63\xb4\xe7\x92\x5c\x6e\xb4\x87\x43\x23\x9f\x1f\x09\x8b\x76\xa3\xef\x01\x9a\x70\x10\x6c\x6b\x21\x05\xf7\x7b\x84\xec\x82\x52\x2a\x78\xea\xf7\x48\x55\xd1\x4c\x20\xd9\xa0\x17\x29\xa4\xe0\x88\x68\x9f\x45\xbf\x60\xca\xd0\xda\xb9\x5c\xf1\x37\xd9\x2f\xed\x05\xb9\x9c\x22\x20\x4e\x7e\x8c\xd4\xef\x23\x01\x60\xc6\xbe\x5e\xf0\x48\xd5\x8b\x7b\x98\xec\x4f\xb0\xe0\xc9\x27\xaa\x3e\xe3\x36\x18\x0a\x11\x9a\xa9\x94\x43\x9e\x15\x26\xb9\x1c\xf3\x78\x74\x3a\x26\xfa\x08\x9d\x8c\x89\xfe\x82\x8e\xc7\x44\x9f\xa0\xf6\x98\xe8\xb3\xb4\x57\xfb\x12\x4d\x2c\x58\xfa\xa2\x24\x32\x5b\x34\x8a\xbf\xc1\x0e\x07\x2e\x30\x71\x5c\x6d\xe7\xb7\x14\x49\x7b\xd7\x28\x62\x86\x01\xe4\x3f\x4b\x45\xd5\x50\x09\xff\xfa\x51\x4a\x89\xa2\x12\x28\x6c\xed\x60\x4c\xf6\xb5\x1d\x5d\x9a\x7a\x44\x9e\x7a\x79\xd9\xbe\xcf\xf3\x8d\x30\xdf\xda\xdd\xc4\xc5\xf8\x41\x79\x16\xe4\xf4\xf3\x0d\x3b\x93\x5f\x65\xb2\x64\xed\x67\xbc\x9a\xd0\x7e\xfe\x82\xd0\x16\x3b\x78\x6a\x5e\xb4\xd7\xc2\xa7\x32\xed\x7d\xd5\x50\x91\x30\xa2\x7e\x78\x89\x65\x03\x37\x8b\x2a\x51\xe9\xd6\xc3\x2e\xed\x2d\x6e\x46\x7d\x05\x95\x03\xc4\x9f\x58\xa3\x28\x21\xe7\xe2\x7b\xa5\xda\x26\xa9\x29\xe5\xff\x87\xb9\x77\x6f\x6a\x5b\xd7\x1e\x86\xff\xef\xa7\x28\x67\xfa\xcb\x58\x44\x11\x09\x2d\x3d\x3d\x36\x22\x03\x4d\xb8\x53\x0a\x25\x01\xea\xf1\x9c\x91\x2d\xdb\x04\x9b\x10\x72\x03\x42\xf2\xdd\xdf\x59\x4b\x92\xed\x5c\xe8\x3e\x67\x3f\xbf\xf7\x99\x67\xf6\x2e\xb1\xee\xf7\x75\xd3\xd2\x5a\xac\x71\x41\x35\x71\x88\x62\x78\x1a\xf2\x4a\xad\x59\xf9\x42\x23\x5e\xdb\x28\xd0\x2e\x77\x4f\xf4\x33\xa1\x31\x0f\x69\xc2\x23\x62\x5b\x90\x6d\x39\x3d\xe2\x55\x93\xc7\xd4\xee\x56\xbd\x75\x5e\xa9\xd1\x3f\xb6\x6c\xec\x78\x68\x32\x89\x10\x27\xc8\x48\x56\x4b\x72\x03\x70\x8d\xeb\x0f\xb4\xfd\x3d\x9d\x5a\xb0\x29\xa7\xd3\xea\x0e\xf7\xa7\x53\xf4\xff\x22\x39\x9c\x6c\x01\xc7\xd9\x9f\xd9\x96\xcc\x4c\xa7\xa8\xad\x1a\x54\x6a\x14\x37\x89\xbf\x81\x44\xef\x7a\x40\x08\xa1\x41\x85\x4b\x2a\x74\x56\x7f\x43\xd2\x8a\xd8\x40\xdb\xdb\x50\x57\x25\x58\xc7\xea\xe4\xba\x00\xb8\x27\xb8\x74\x7c\x6e\x09\x36\xea\x57\x04\xfb\xd4\x21\x1b\xa6\x9b\xd9\x6b\x0a\x25\x75\xca\xba\x5f\x2e\x4b\x12\x28\x16\xe7\x53\xa7\xec\xaf\xcb\xdc\xba\x91\xee\x54\x66\x97\x73\x60\xf6\x45\x46\x36\x06\x6e\xa0\x1e\x7d\x64\x33\x93\x11\x8e\x81\x22\x1c\x17\x6c\xbe\xc0\x76\x63\xfd\x5e\xd1\x92\xb9\x71\x1e\xa6\x9e\x91\xba\xc1\x64\xc1\x13\xa3\x36\x24\x04\x74\xa3\xe3\x9b\x59\xa0\xb7\x97\x96\xd8\xd0\xfb\x92\xcc\x9b\x54\xbe\xfb\xc4\xf1\x92\x68\x15\xcd\x9a\x61\xdc\x8c\x6d\x8b\xfa\xea\xfa\xbc\xd1\x89\x3b\xc3\x41\x16\xaf\x14\xf1\x75\x7d\xca\x8f\xde\xbe\x08\x86\x8f\x7d\x5b\x37\x4a\x7b\xfd\x30\xea\xbc\xd8\xad\xee\xa2\x15\xa6\x8b\x7d\x42\xe8\x60\x14\xad\x4e\xfd\xb5\x0f\x34\x7f\x76\xbc\xc2\xe7\x8f\xb2\x37\xcf\x49\xef\x2e\x43\x6b\x60\x1f\xaa\xde\xba\x25\x2b\x01\xd9\xb0\xe2\x75\x2b\xaa\x84\x84\x38\x92\xe3\xc7\x86\xaf\xad\x57\xd6\x9c\x78\xdb\x77\xca\xe5\x98\x04\x15\x2e\xdc\x9a\x79\x5b\xd5\x6b\x59\x21\x20\x20\x42\x6b\x6c\x93\x38\x98\xb8\x59\x4c\x7c\x2f\x21\xd2\x09\x1a\x88\x60\xfa\xe7\x42\xba\xae\x71\xf6\xe1\x5d\x66\xf4\x47\x37\x33\x79\xbe\x9a\x1b\xbd\xfb\x33\x33\x2a\xfe\xc8\x87\x2e\xb2\xa1\xb9\x8d\x85\x6c\x36\xf7\x8e\x33\xdb\xe6\xfb\xa7\xfc\x6d\x86\xc6\x6e\xfa\xad\x05\xb7\x94\x83\x56\x5e\xba\xdf\xaa\xf7\x5b\x36\x64\x09\x9f\xa1\xf8\x6c\xef\x18\x9f\x66\x3e\xad\xba\x59\xb4\xf4\xfe\xdc\x3f\x75\x85\x47\xea\x22\xe7\xef\x5d\x8f\x2c\x0a\x98\x87\x19\xec\x3e\xa8\xf1\xda\xec\xd6\x1a\x1a\xd8\x3d\xd4\xb0\xfb\x2f\x59\xfa\x25\xa3\x3f\xfa\x0e\xaa\xa5\xee\x87\xef\x5a\x05\xab\xef\xc1\xb6\xac\x57\x6a\x76\xb0\x23\x95\x21\xa0\x77\x97\xa0\xf5\xc7\x25\xb8\x6f\xfd\x95\x38\xe0\x9d\x65\xb8\x6f\x59\x55\xf2\x37\xd9\x7e\x99\xb1\xfd\x21\xb0\xfd\x92\x7e\x3f\x16\xd4\xb8\xe8\x38\xa8\x21\xf3\x89\x9c\x39\xf2\xe0\xfa\xcd\x78\x27\x48\x7e\x75\x26\x21\x2f\xc0\x55\xf5\xd0\x3b\x24\x64\x3d\x54\x82\x02\x2d\x1c\x97\x64\x5d\x52\x5f\x93\x15\x3e\x06\x51\x36\xa0\x22\x0a\xe9\xc3\x2c\x59\xb7\x9d\xf1\xf8\x8f\xfe\x22\x8b\x9f\x33\xf7\xda\x59\xd0\x66\x71\x56\x0c\xc9\x05\xac\xbd\x71\x6b\x76\x90\x71\xf5\x8f\xbe\x61\xea\x09\xf5\xf5\x0d\x88\x19\x90\xa3\x13\xe6\xb8\xf2\xd5\x00\x6e\x91\xb3\xce\xe0\x99\xf9\xb0\x6b\xdb\x7a\x0e\xeb\xdf\x23\x3b\x33\x7a\x73\x50\xab\x9f\x3c\x0a\xfb\x14\x1d\xc6\x1a\xe8\xf4\x76\x1e\xd8\x73\x6f\xfa\x79\x7a\x2c\x8a\x6e\x05\xb4\x75\x77\xed\x23\xf9\xbb\xe6\xdd\xb5\xe0\x16\x78\xcc\xec\x6b\x2b\xfb\xaa\x55\xf3\xe4\xfc\xf3\x73\xfe\x89\x15\x18\x8e\x33\x8f\x2b\x24\xe7\xb1\x9f\xf3\xd8\xff\x9e\xf3\x44\xde\xd0\x73\xe0\xec\xb3\xfd\x53\x36\xec\x3c\x84\x8f\x91\x14\xab\x2c\x5f\xc0\xb4\x0e\x5b\xb3\x2c\xaf\x14\xc3\xf0\x9d\x6c\x8f\x2d\x6b\x74\x2c\xe8\x67\x3a\x3e\x86\x65\x2a\x96\x80\x16\xde\x2f\xf5\x8c\xa5\x5e\xe6\x4a\x29\x83\x5c\xef\x94\x79\x6a\x15\x60\xcb\xa8\xa5\xcc\x1f\x8e\x34\x24\x91\x17\x2b\x54\x33\x04\xeb\xf9\x8e\xe0\x82\x75\x7d\xed\xe9\x79\xdc\x32\xde\xfd\x72\x79\x24\x2e\x7f\xea\xfa\x1e\x4b\xdc\xc0\x63\x32\x64\x77\xcf\xd3\xa9\xf6\x9a\x26\xdc\x40\x6d\x26\xf8\x14\x1e\xfb\x31\x74\xab\x9e\xad\x8c\xed\x17\x2c\x00\xcd\x5f\x91\xfb\xac\xe7\x53\x09\x8d\x09\x1a\x50\x9f\x75\x8b\x7b\x28\x85\x46\x12\x57\x62\x4b\xdf\x1f\xa6\x53\x15\xe5\x46\xbb\xde\xec\x9a\x85\xff\x5e\x09\x74\x58\x17\x71\xfc\xf5\xcd\x8a\xd4\xb7\x6b\x61\x43\x06\x3a\x09\x6c\x3d\x16\x18\xb8\xc7\x46\xc3\x19\x82\xb9\x1f\x2b\xa6\x46\x89\x15\x9f\x5c\xc1\x26\x81\xc7\x46\xc1\xfc\xa3\x4d\xbf\xfe\xd6\xf3\x6d\x9f\x76\x7d\x55\xe3\x0f\xc8\x78\x2d\x3c\xf3\x38\xf3\x9a\x1d\x1d\xfc\xc1\x17\x42\x0a\x33\x95\xc0\x8c\xca\xa2\x6d\x9e\xe7\x56\xc1\xf8\x45\x66\x8d\xb2\xd1\x37\x10\xc6\x7f\xd6\x5e\x3d\x9e\xd4\xef\xab\x76\xc7\x71\x66\xec\xcb\xeb\xf4\xa1\x86\xa4\xe7\x4f\xc6\x3d\xc7\xb3\xde\x05\x41\x6f\xa1\x57\x26\xbf\x71\x0f\x35\x7c\x5e\xed\x29\xaa\xd1\xd7\xa1\xe6\xb1\x28\x28\xe1\xe4\xb6\x9a\xd9\x99\x4f\xf5\xd7\x3e\x7b\x7a\xb0\x02\xb7\xef\xd1\xc0\xdd\xf5\x88\xb3\x7f\x9c\xb9\x8c\x0c\x8a\x9b\xa2\x99\xab\x7f\x15\x9e\x61\x5f\x58\x9b\xc4\x79\xbc\xb0\x24\xad\x42\x0b\xf8\x55\x43\x59\x3f\x8c\x53\x2a\xcf\x8e\x85\x8b\xd0\xfd\xbc\x16\xe1\xca\x57\xe0\xb0\x85\x45\x68\x34\x30\x88\x03\xca\xe1\xa3\xee\x7d\xe4\xdd\x4f\x9b\xce\xda\x63\xd7\x8a\x48\xa9\xb4\xd6\x85\xdf\xe9\x34\x64\x77\xbe\x05\xe7\x3f\x77\x51\x13\x41\x8b\x92\x9d\x4e\x38\xbf\x3f\x42\x8d\x0a\xc1\x1a\x43\x4b\xc2\x2e\xa4\x01\xa1\xaa\xa9\x88\xb6\x8e\xd1\x40\xe2\xe9\x13\x0f\xd9\x9e\xb0\xd6\xaa\xc4\x81\x46\xbe\x0b\x47\xb0\xe3\xa6\x15\x11\x27\x2a\x95\x22\xf7\x21\xf0\xd6\xf8\xe0\xa0\x54\xb2\x42\xf7\xc9\xb3\x02\x0a\x45\x4c\x2d\xf0\x8d\x7d\x3e\x3e\xc0\xca\xfc\xe7\xf9\xca\x9a\x1d\xe7\x00\x07\xf9\x87\xda\xfc\x67\xf4\x8a\x24\x19\xea\x3f\xfa\xa2\xcf\x21\x0e\x6a\x85\x1a\x5f\x6f\x75\x8d\x68\x4c\xf2\xd7\x37\x7c\xe8\x0e\x07\x2b\xbe\xc6\x4f\x27\xab\xe7\xf5\x16\x72\x9c\x3f\x71\x1f\x88\xb8\xf8\x7a\x25\x75\xf1\x56\x34\x91\x2b\x58\x9a\xe4\x46\x72\x05\xeb\x3d\x64\x96\x74\x8b\xe6\x72\xf5\x3d\xff\xbd\x75\xf6\x9d\x42\x43\xbb\x6e\xdf\xcb\x57\x68\x97\x0d\x1f\x7b\x65\xc5\x10\xb3\x5d\x77\xd7\xdb\xd8\xd4\x1b\x6f\x9f\x1d\x75\xa0\x0c\x44\x1f\x78\x54\xea\x8f\xb2\xaa\x81\x4a\xda\x69\xc2\xff\x81\x26\x2a\x8f\x9b\x73\x67\x59\xb9\x25\x36\xc0\xee\x7c\x88\x4e\xcb\xf5\x30\x60\xd9\x0e\xeb\x01\x17\x4c\xf4\x43\x61\x5b\xc1\x7b\x2a\x2a\x1f\x0f\xd5\x0d\x88\x76\x0f\x19\xf0\xdf\x0f\x68\xa4\x27\x40\x8f\x54\x27\xa9\x15\x68\xf1\xf9\x3e\xec\xa3\x00\xba\x19\xc0\x78\x68\x76\x06\xe8\x53\x97\xea\x93\x4b\xd4\x5b\x7e\xe5\x2a\xcc\x37\xae\xc2\x8e\xb2\x23\x82\x4e\xf4\x8f\xb3\x43\xc6\x4e\x0f\xc9\x9c\x09\x16\xd5\x97\xdc\xbc\x1e\xda\xca\xda\x15\x66\x69\x7e\x5d\xaa\x20\x74\xce\x57\x2e\xc3\x67\x82\x5d\x9b\xd0\x71\x6a\x41\xc8\x4d\x27\x05\x07\x47\xbf\x1f\x00\x69\x17\x2c\x2c\xb4\x56\x7b\x12\x15\x6c\x9f\xdd\xee\xa3\x93\xce\xc8\x3d\xf4\x68\x97\xdf\x09\x2b\x62\x83\x8e\x0c\x07\xe6\x0d\xb3\x32\x69\xd0\x05\x6e\xb7\xcb\xb7\xd4\x02\xf7\x54\xbe\xbe\xd6\x4a\x37\x59\x7b\x98\xb5\x07\x59\x7b\xbc\x4a\x9c\x1e\xef\x6d\xd4\xbe\x55\xd7\xef\xd8\xcf\xa3\x0a\xfc\xd9\xd8\x74\xd0\x06\xef\x9e\xa8\x5b\x29\x7f\x39\xa2\x5d\xfe\x99\xd8\x10\xf5\x7c\x9c\xc5\x7c\xa1\xbd\x32\xc7\xdc\x5f\x54\x5a\x3a\x14\xa5\x52\x96\xaa\x7a\x30\xe0\x90\x32\x39\x76\xb6\xaa\xd5\xed\x2e\x26\x73\xfe\x72\x34\x9d\xaa\x68\x82\x31\xaf\x4d\x95\x79\xa4\x78\x81\x4e\xb4\x98\xeb\x2d\x52\x03\x91\x61\x77\x68\x06\x11\xe1\x20\x00\x88\x58\x5b\xdb\xbc\x5b\xb7\x22\x7e\xc7\x82\xc7\x81\x85\x5d\xea\x12\x1a\x55\xb4\x4d\x85\x3b\x36\xe8\x74\xb3\xe8\x4d\xb2\x51\x88\xd8\xac\xe8\x78\x62\x47\x9c\x7d\x26\x4e\xb4\xce\xa5\xa3\x9a\x2d\x95\xac\xee\x3a\xdf\x24\x8e\xf2\x66\xd1\x3b\xc5\xfd\xa3\x04\xa8\x5d\xb4\xff\xaf\xa5\xa7\xd2\x19\x94\x4a\x23\xb4\x0f\x35\xe6\xda\x31\xc6\x84\x6f\xae\xab\xaa\xd7\x47\xe5\x1e\xdd\xd3\x9d\x9b\x90\xf5\x71\xd9\xa7\x63\xae\xfa\x30\x21\xeb\x1f\xc6\xe5\xc0\xa9\x6e\x8f\xea\x29\x93\xc2\xda\xa3\x63\x62\xa7\xee\xe1\xc4\xc3\xcf\x59\xea\xfa\xe8\x4f\x77\x84\x7b\x60\x2f\xb0\x52\x1a\x6a\xb7\xd6\x2a\xea\xfc\xd9\x32\x2e\xb9\x9c\x51\xa9\x14\x97\x4a\x82\xed\x03\x4c\x89\xe9\x08\x00\xca\x3e\x6b\xee\x5a\x49\xb6\xe3\x46\x85\xdd\x76\x64\x48\x03\x74\x68\x7e\x99\x5b\x0f\xd9\xd7\x10\x8b\x4a\x7e\xfc\xd3\x72\xcf\x0f\xa8\xef\xf6\x02\xcf\x23\x4e\x11\xce\x4b\x7a\x7e\x80\x12\x37\xc9\x0f\x91\x18\x25\x12\x8e\xa4\x04\x70\x88\xe7\x51\x22\xd8\xc0\xf3\x98\x83\xf7\xa7\x2e\x40\x3d\x9f\xed\xa2\xe1\xdd\xc6\xd0\x82\x4f\x88\xc2\x4e\x5c\x07\xe8\x31\x1c\x31\x07\x10\x3e\xd8\x2c\xc5\x50\xeb\x4b\xa9\x24\x4b\xa5\x35\xc9\x1a\x77\xa5\x92\x64\x17\xcd\xcc\xf0\x84\x3e\x57\xd0\x5c\x94\x87\xfa\x1e\x8d\xf3\xd0\xae\x47\x13\x1e\x96\xa3\x8d\x4d\x9a\x66\xb1\x08\xfb\xe2\x8d\x4d\x47\xb2\xf6\x18\x67\x0e\xfa\x1d\xd2\x14\x0e\xdf\xc6\x26\x85\x68\xe8\x9b\x92\xa8\xb2\xad\xf5\x98\xf6\x00\x91\x05\x4e\xaf\x54\xb2\x7a\xec\x87\xbf\x03\x7b\x1a\x65\xe1\x78\xa7\xd8\x63\x0f\x89\xd5\x25\x6a\x0a\x8e\x4f\xb1\xaa\xb0\x1c\xd1\x94\xf6\xd0\x45\xbc\x64\xdf\xe3\x52\xc9\xb2\x42\x8e\x03\x98\x4e\xad\x90\xbf\x0d\x5f\x7b\xa1\xfd\xda\x9c\x11\x8a\xe7\x3f\xa1\xa9\x6e\xfc\x7b\x4c\xc3\xdc\x8d\xb9\xee\x5d\x71\xb4\xc5\x71\xd0\xe2\xc0\x8b\xc3\x86\x6f\xe6\xf7\x47\x83\x3b\xfa\x01\x50\xab\x36\xe0\xcc\x9a\x71\xa9\x04\x7f\xd9\x65\xa9\x64\x25\x1c\x3e\xb1\xae\x17\x9c\x20\x1d\x78\xa5\x21\x06\x74\x05\x12\x91\x79\xcc\x25\xec\x10\x42\x25\x74\x08\xfa\x5b\xdb\x84\xff\x43\x1a\x13\x2a\x15\x42\x8b\x09\x0d\xf5\xb1\xa1\x21\xee\xe7\xa4\xbc\x49\xd3\xf2\x26\xa1\x21\x6c\xf4\xa4\x5c\xdb\xac\x40\x04\xfc\x90\x2c\x8b\x8e\xcc\x73\xe5\x59\x12\xc5\x52\x75\x69\xc2\xee\xa4\xb5\x1b\x12\x9a\xc0\x6c\x6f\x42\x37\x06\xc2\x0a\x69\x82\xcd\xf3\x18\x77\x67\x8c\x5b\xf7\xf1\x55\x98\xbd\xab\x51\xbe\xa4\x31\x22\x66\x3c\x23\x80\xff\x81\x32\xca\x65\xcc\xc7\xe6\x4c\xf8\xa5\x92\x75\xa2\x02\xac\xf3\x1b\x3d\x4c\xfb\xec\xee\x77\xb6\x69\xef\x7e\x6b\x4a\xc2\x64\x8a\x7f\xd3\x5a\x51\xab\xf1\x24\xa7\x8e\x72\xd4\x27\xf9\xe0\xd4\xf2\xdd\x8b\x89\x47\xd4\x5c\x42\xcf\x25\xf5\xf5\xf4\x62\x8d\x8e\xcf\xf6\x46\xa5\x92\xe5\xe3\x08\x7e\x1e\xd0\xa0\xd0\x79\x9f\xcc\xb9\x3b\x3e\x28\x1e\xe1\x8c\xc6\x77\xe3\x57\x4f\x2f\x55\x88\xd4\x88\xf3\xeb\x40\x58\x01\xbb\xff\xad\xe0\xc4\x15\x86\x12\x1d\x6a\x61\x28\xd5\x21\x75\xfe\x71\x9f\x5d\x1c\xaa\x3d\x76\x71\xa8\xf7\xd7\xc5\xa1\xda\x5b\x17\x87\xfa\x24\x23\xf5\x63\x80\x02\x3d\x1c\x08\x32\x9b\x5d\xb3\xc9\xfd\x3b\x42\x06\xdf\x7d\x0d\x3c\xe3\x04\x6a\x9f\x3d\xa4\xca\x28\x8b\xd8\x09\x94\x2d\xb8\x4c\x54\x00\xac\x3e\xe4\x5d\x0f\x36\xd0\x6f\x71\xa6\x34\x5b\xb8\x5a\x6b\xcd\x5b\x3c\x1a\x4a\xd7\xf7\x90\x30\x40\x64\x19\x01\x69\x20\xc3\x34\x1c\xc2\xc1\xc1\x44\x32\xbb\x66\x87\xfb\x2b\xc9\x2a\xe1\xfe\x7c\xf5\xea\x3f\x2f\x8d\x50\xbd\xd1\x67\xbd\xc0\x22\xc4\xbe\xc8\xa2\xf6\xb5\xe9\xa5\x5b\x02\xdb\x0b\x29\x24\x3d\x6c\x45\xfe\x34\x86\x4b\x83\xb6\x04\x3f\xcd\x69\xf6\x80\x10\xe3\x70\x12\xb6\x5e\x91\xcd\x13\x45\x2b\xe6\xa7\x8b\xb4\xb9\xcf\x8e\x50\x35\x57\xa2\x15\x25\x59\x30\x89\xab\xdd\x8a\x09\xb6\xef\x18\x48\xe8\x0b\x04\x81\x27\x4f\x34\x36\xf6\x1a\xd9\x81\x5f\x87\x3f\x76\x95\x26\xdc\x77\x07\xbb\x5e\x1d\xff\xda\x6f\x2f\x76\x95\xbe\xda\xd5\x19\x1e\xf8\x81\x4f\xbb\x7c\x6d\x2d\x9d\x4e\x83\xe9\x74\xad\x86\x1b\x01\x0e\xb9\xd6\x91\xe6\x71\xa9\x14\xa9\x2e\xf5\x80\xd6\x51\x8f\x45\x7a\xc6\xf4\x91\x92\xd6\xf4\xdc\x03\xaf\xf2\x99\x94\xd9\x96\xb9\x19\xea\xc1\xd6\xa9\xd4\x20\xca\x11\xb0\xad\x06\x74\xa4\x16\xb8\xe7\x06\xd2\x2b\x63\xe6\xca\xc0\x44\x9d\x05\x5e\x19\x33\x57\x46\xc8\x08\xcc\x66\xb9\x21\x94\xec\x19\x47\x8f\x4b\x37\xf2\xd0\x63\x48\x5c\x17\xec\x97\xb4\x7a\x6e\x47\x7a\xb4\xc7\x5e\xca\x09\x7b\xa1\x3d\xf6\x5a\x4e\xd8\x2b\xed\xb9\xc7\xb0\x5b\x4f\x80\xcf\x3d\x0e\x10\x94\xda\xa3\xef\x30\xbb\x7f\xc8\x1f\x2f\x94\x40\x33\x2d\xe4\xad\x9b\x91\x26\xd8\x2c\xb1\xf4\x24\x00\x01\xd3\xe5\x38\x32\x18\x3c\xc5\xf1\x52\x1c\x5b\x45\x45\xc0\x98\x2a\x2a\x1a\x71\x5f\xc1\x87\xfb\x98\x7f\x68\xdc\x5b\x31\x4a\xd3\x13\x98\x51\x58\x26\x5e\x75\x12\x65\x20\xe5\xfb\xa9\x05\xdd\x4b\xd8\x2b\x21\xee\xef\x57\xcf\xaa\x8c\x89\xd3\x7c\xb1\x7c\x65\xa7\xe5\x32\x4f\x75\x56\xcc\x52\x5e\x09\xcc\x16\x7b\xc1\x87\x2f\xc5\xaa\xa8\xcf\x8e\x30\x85\x43\x3d\x3a\xf0\xca\x13\xf6\x8a\x2b\xab\xc7\x27\x95\xa3\xb1\xef\xa7\x85\xf1\x29\xeb\x2f\x18\x15\xc8\x77\xe2\x60\xd8\x85\x38\x33\x13\xc4\xa3\xbf\x2d\x39\x7f\xaf\x80\x1d\x1a\x93\x19\x80\xc4\xc1\xa9\x25\x29\x90\x1e\x30\xa9\x08\x1b\x71\xd2\x66\x69\xa9\xd4\x2d\x95\x9e\x71\xf5\xba\x34\xa5\xfb\x4d\x61\x85\x24\xbb\x25\x44\x8a\x64\xb6\xc2\x41\xec\x9c\x7c\x53\xc1\x08\x6d\x70\x49\xbb\x96\x70\xf7\x26\x9e\x76\x12\x6b\xe7\xa7\x53\x98\x9b\xb7\xc2\x19\xff\x70\xcd\xfa\x61\xdc\x19\x0c\xc3\x7e\x33\x0d\x1f\xc2\xee\xf2\x89\xcf\xec\xce\xef\x33\xff\x51\x19\x47\xcb\x1b\xe6\x82\x66\x32\xca\xe1\xb3\x1b\x78\x46\x92\x83\x01\xee\x7a\x84\x7e\xea\x14\x62\xa8\x4f\xa6\xd3\x3c\xa8\x04\x8f\x73\x8e\x36\x26\x7f\x0b\x06\x8e\xd2\xd5\xe6\xc2\x8d\x63\xbb\xa1\x74\x45\x66\xdc\x50\x8f\x66\x94\x16\xd3\xe6\x58\x1c\x23\x00\x71\x85\x37\x9d\xce\xd9\x09\xab\x3a\x52\xb9\x64\x2e\x97\x25\xb1\x56\xd6\x85\xda\xf3\x24\xab\x6d\x9e\x2f\x2a\x5c\xc4\xb4\x16\x84\xf0\x6d\xc0\xc3\x6d\x85\x35\x81\x9b\xd6\x1f\x3e\xfb\x1e\xe7\x18\x78\xaf\xb5\xe4\x40\x80\x73\x2e\xd8\xa7\xbe\xba\x53\x82\x2f\x28\x73\x1a\xe4\x65\xbe\xb7\xe6\x14\x37\x0f\x3d\xce\x7f\x1d\x4c\xa7\xea\x6b\xd0\x30\x5f\xbf\x8f\xf2\x22\x8d\xe5\x66\xd6\xb8\x70\x6f\x27\x5e\x1d\xff\xda\x3e\x3b\x3c\xcd\xb3\x9f\x1d\x2f\xd8\xea\x4b\x5c\x5f\x61\xeb\xc4\xf5\x2b\xa8\xed\x80\x9f\xe5\x1a\xc4\x02\xd4\x5f\x93\xac\x3d\x9d\x4a\x76\x11\xd2\x90\xaf\x85\xd3\xe9\x5a\x08\x11\x21\xbb\x08\x8d\x39\x57\x6b\x0d\x80\x76\x00\xd1\x01\xbb\x08\x09\x92\xca\x61\xc1\xf8\x60\x2b\x7f\xee\x27\x50\xa2\x98\x29\x49\xb3\x4f\x71\xa9\x14\x74\x2c\x9f\x35\xb7\x48\xdd\x12\x2a\x9d\x35\xb7\x94\xd0\x91\x1a\xbb\xbf\xa2\x2e\x58\x3b\x62\x8f\xa9\x2d\xa8\x89\x49\xee\x2d\x9f\x25\x54\xbc\x63\xad\xaf\xe2\xab\x12\x33\x62\x07\xc4\x0e\x0a\x74\xcb\x8f\x05\x7d\x6c\x5c\x51\x63\xdc\xae\xed\x9e\xc2\xdc\xa9\x5f\xdb\xcc\x27\xc6\x61\x8c\xcf\x44\xe1\x0d\x50\x73\x7e\xfa\x4d\xcd\xe5\xb0\x6b\xe9\x6d\x43\x36\x36\x0b\x46\x6b\xe7\x55\x73\xd9\x95\x84\xad\x94\xf8\x9c\x9f\x01\xef\xe4\xb6\x27\x1e\xe7\x57\x71\x51\xcc\xd5\x5a\xd4\x4d\x01\xa8\xd6\x3a\x35\x3e\xd2\xd6\xaa\x54\x39\x45\xd1\x28\x57\xbf\xac\x82\x45\x3c\xf6\x9c\xc4\xb0\x89\x29\x2e\xab\x7a\x34\x95\x96\x4a\x69\x3e\xe2\x94\xb5\xd9\x4b\x31\xf0\xaa\xdc\x97\x44\x3c\x41\x97\x53\x86\xff\x48\x59\x9b\xf6\xf8\x5e\x0b\x5d\x39\x39\xa1\x32\x07\xca\x39\xef\xd5\xad\x00\xc9\xe7\x2e\x7b\xa1\x5d\xf6\xaa\x5e\x7e\x11\x5b\x30\x71\x5b\x0f\xd8\x5e\xcf\xea\x51\x68\x3b\xf6\x58\x30\x60\x2f\x85\xef\x57\x9a\x32\x1f\xa2\xf0\xe7\x95\x9a\x0a\xec\x00\x88\xef\x5e\x16\x76\x62\x9e\x28\x26\x24\xe4\x6b\xfe\x74\x2a\x67\x6b\xb2\x24\x58\xe7\x5e\x19\xf1\xf5\xeb\xb1\xad\x86\x5b\xc1\x07\x67\xf5\xc8\xae\xd2\xcc\xae\x5d\xc6\xae\x0b\x94\x2d\xab\xdf\xc8\x43\xbe\x09\x8e\x28\x86\xa8\x00\x9e\x69\xbe\xbf\xb2\xd0\x5f\xa9\xfb\xab\x72\xab\x4e\xe7\xdf\x59\x7c\x3b\x8f\x6e\xe3\x38\x90\x7d\xee\x91\xa2\x77\xd8\x02\xf5\xbc\xf0\x92\x43\xaf\x6b\x00\x4b\xaa\xc1\x97\x5a\x44\x69\x16\x51\x9d\x4d\xe9\xb1\xb6\x31\xf1\x96\xaf\x5c\xc8\x5e\xeb\xa8\xe9\x89\x7c\xbc\x1a\x98\xc4\x81\x85\x6c\x7c\x46\x43\xf6\x7c\x46\x28\x64\x80\x20\x64\x1f\x9e\xc1\xf7\x33\x7e\x8f\xce\x10\x0a\xc2\x2a\x42\x02\xc5\x18\xe8\x49\x8d\xd8\xd0\x9f\xd9\xf2\x9b\x86\x9f\x39\xa1\xa8\x6f\x40\x03\x8e\xc7\x37\x08\xf1\x15\x6d\x30\x9d\x56\x3d\xf4\xe8\xfe\x10\x78\xac\x19\xce\x59\x23\xbd\x78\xaf\xf0\x89\xfc\xeb\xc2\x97\xff\x55\xcb\xfd\x64\xae\xf0\xaf\xff\xaa\x65\x55\x38\x5f\xb2\xab\x63\xb1\xca\xd0\x9f\x60\x69\x7e\x08\x25\xf2\xd0\xb8\x9a\x27\x89\x05\x2d\xd1\x2e\xaf\xd2\x1e\x47\x7b\x9d\xdd\xed\x9e\xd3\x2d\xda\xec\xec\xe2\x91\x5c\x1b\xb0\x4f\x31\x41\x99\x1e\x00\x03\xde\x3b\x22\x6f\xda\x91\xd2\x88\xfb\x74\xcc\x03\x27\xe1\x52\x8b\x76\x06\xec\x7c\xc2\x5e\x2a\x23\xba\xa7\x3e\x5f\x2b\x63\xda\xe0\xd5\xed\xca\x64\xdd\xd2\x11\x03\x96\x44\xec\x95\x94\xf7\x74\xcc\x8b\x8a\x79\xd1\x36\x30\x2b\xd6\x80\xbd\x0e\x31\xf6\xf0\x8e\xbd\x90\xf5\xbd\xb2\x8a\x79\x55\x31\xaf\x64\x7d\x52\x2a\x35\x4a\x25\x6b\xc2\xef\xdc\x89\xf4\x2c\x25\xcb\x9a\x2b\x45\x37\x49\xb9\x10\x6d\x8a\xd2\x4d\x42\xe8\x8a\x42\xa3\xa5\xfc\x63\xc8\xba\x3d\x29\x27\x84\xbc\x0d\x32\x5f\x9e\x1f\x87\xb3\x01\x5f\xab\xcd\x50\x75\x2f\xbf\xc8\xe9\xce\x10\x04\xbc\x8d\xb4\x3b\xcb\x31\x1f\xa8\xd3\x61\xbc\x61\x76\x22\xcb\x4a\x30\x72\xe4\x65\x86\x2c\x13\xd6\x26\xfa\x7d\x47\x02\x01\x3a\x70\x0f\x8d\x57\xd5\x5f\x07\xea\x95\xc6\x4d\x43\xfd\xfe\x3e\xb2\x13\x7e\x96\x58\x29\x4d\x88\x93\x6c\x7f\x90\xa5\x52\x82\x5a\x67\x11\x7f\xbb\x38\xb5\x47\x14\x7b\x41\x63\x9e\xcc\xb9\x46\x0d\xb4\x9b\xd5\xbd\x86\x3d\x51\x64\xfa\x00\x91\x34\xdf\x6b\xd4\x27\xca\x4a\x65\x6a\x25\x40\x82\x26\x48\x86\x27\xc0\xc5\x26\xee\xae\x47\x6c\x9d\x31\x68\xe2\x44\x27\x2c\xed\x74\x43\x94\xd5\x3d\x74\xba\x56\xe2\x26\xbb\x4a\xb4\x32\x51\x14\x6e\xa1\xb2\x64\x17\x05\x30\x7b\x54\x7d\xf6\x3d\xaa\xb8\xd7\xac\x4c\x59\x25\xec\x7a\xaa\x70\x79\x02\xed\x55\xf6\x08\xc1\x6d\x34\xe1\x13\x26\xb5\x75\x20\x2b\x25\x8e\x95\xf0\xc9\x4e\xa2\xc8\x92\x09\xf9\xcb\x61\xcf\xf9\x76\xcd\x1c\xbb\xa2\xf5\x0e\xe5\x5a\x21\x7a\xec\x7f\x8c\xc3\xe1\xcf\xc7\x4e\x77\xd8\x10\xc3\xd1\x03\xfb\x87\x33\xcb\x98\x97\xf9\xf7\xb4\x45\x3f\x1a\x87\x1a\xd7\x3d\xb7\xe6\x9e\x5c\xeb\x2b\x84\xa8\xa0\x84\xf6\xb4\xc9\x5d\x6f\x76\x6b\x1d\xb6\xe8\x73\xab\xf0\xc2\xe2\x28\x7f\xcc\xc9\x9e\x36\x51\xc7\x4f\x86\x51\xa7\xdb\x19\x2a\x7b\x00\x1d\x69\x07\xb3\x02\x38\x38\x6e\x15\xef\x09\x94\x98\xdb\xf9\x6d\x41\x61\x7a\x63\x15\x09\x55\x6c\xf6\x70\xdf\x12\x28\xde\x10\xac\x23\xd1\x0a\x72\x26\xe4\xf4\xd1\x31\x17\x76\xeb\x9a\x1f\xe2\xb5\xdb\x87\x6b\xf6\xeb\xdb\x02\xc7\x9f\x3f\x93\x55\x17\xe9\x73\xe4\xd0\x9a\x60\xf7\x72\x3a\xf5\xdd\x43\x6f\x0d\xa8\x3c\x80\xe6\x87\xa7\xb3\xd6\xb1\x98\xd3\x92\x92\x86\x96\xd5\x37\x3b\x45\xb6\x5e\x16\x18\x07\x89\xa2\xa8\x41\x93\x38\xbf\xb4\x3f\xfa\x49\x34\xcf\xfb\xb0\x56\x38\x9d\x5a\xf0\x53\xac\xd2\x0a\x3a\x96\x60\xc1\x57\x52\x2a\xad\xe1\xef\x82\x62\x15\x0a\x68\xf4\xbd\x8c\xbe\xc2\xd1\x17\x3b\x54\x5d\xe2\x50\xc1\x6e\xbf\x28\xef\x60\xa7\x13\x8e\x37\x56\x4a\xb0\x31\xb4\x04\x5e\xa4\xe9\xce\xc0\x37\x6b\x85\x90\xaf\xb3\x5f\xc8\xc3\x3a\xfb\x26\x0b\x13\x2f\x9d\x01\x5a\xce\xc1\x8c\xb0\x34\x8d\x45\x82\x4f\xb0\x56\x50\x2a\x9d\xb4\xcc\xd5\x49\x2b\x50\xda\x7b\x7e\xd6\xed\x5f\xf7\x30\xa0\x70\xce\x31\x41\xbb\x78\xa1\x39\x97\xf1\x44\xce\x65\xbc\x5e\x95\x31\xb7\xb7\x7b\x94\x2e\xce\xc5\x87\xb9\xc9\xc8\x26\xad\xb9\x6b\x85\xb9\x41\xe7\x88\xbb\x1e\x8d\x79\xd5\x89\xb7\x61\x0f\x1c\x7b\x4e\x8c\x5e\x79\x63\x52\x2a\x45\xb8\x71\xcf\x9b\x36\xa4\xc4\x1e\x3b\x6f\xd2\x4e\x57\x86\x2f\x76\x3c\x23\x4e\xf7\xde\x8a\x56\x53\xbc\x29\x74\xfe\xbc\x49\x7d\x76\xde\xc4\x77\x47\xa8\x0c\x06\x2d\x44\xa6\x7e\x7d\xa3\x13\xb9\xb1\xe7\xf6\x02\xcf\x39\xcd\x26\x2d\x75\x13\x8f\x26\x64\x06\x5b\x10\x88\xa4\xd4\xad\x7a\x0a\x3c\xfd\x3e\x2a\x95\x6e\xe6\x6e\x7f\xf3\x8a\x61\x35\x4c\xdd\xf8\x1d\x7b\x6c\xe0\x23\xf0\x38\xfe\x69\xb9\x37\x03\x1a\x7b\x84\x1e\x65\xad\x98\x1c\x34\x22\x40\xd6\xe9\x99\xc1\x53\xb7\xb4\x46\x82\xbc\xdd\xe6\x3b\xff\xdd\x15\x5a\x9d\x2d\x9f\xf3\x98\x38\xc7\xad\x82\xab\x8f\x74\xfe\xf4\xd0\x6c\xeb\x8f\xf6\xf1\x7a\xa3\x70\x9c\x50\x24\xf9\xdb\x7a\x6e\x8a\x25\x2b\xca\x9a\x9f\x9c\x44\xae\x80\x2d\x8c\xcf\x6c\x34\x91\x96\xb9\xf0\xce\x73\x00\x31\x61\x9e\x17\x36\xed\x90\xa7\x45\x04\x32\x3e\xb0\x43\x2e\x8b\x31\xc9\x91\x1d\x72\x7f\x96\x77\x24\x44\x61\xd4\x9c\x07\xab\xb5\x6a\x51\x6c\xd7\x32\x1c\x8d\x00\x38\xf9\x36\x73\x0c\x7b\x37\x89\x9c\x9b\x67\x2b\xa0\x6f\xbd\xc7\x81\x02\x82\xc9\xd1\x8c\x38\x01\xcb\xad\x45\xf1\x3c\x6d\xaf\x39\x9b\x4b\x1a\x86\x2f\xc3\x42\xf2\xf8\x00\x93\xfb\xa1\x58\x2a\xe3\x8b\xfe\x8a\x38\x65\x8b\x69\x39\x01\xed\x5c\x2d\x45\x07\x62\x18\xc6\x8f\xfd\xd7\x41\xd8\x85\xf8\x71\x67\xf8\xba\xb2\xad\x82\x21\xac\xa5\xb4\xcc\xb8\xcf\x52\x8a\x31\x04\xb5\x94\x60\x8c\x36\x2d\x25\xac\xcc\x8d\xc6\xae\xde\xad\xeb\x71\x1c\xf6\x53\xf1\xea\x3f\xbe\x2c\x25\xf5\xc4\xf0\xee\xdd\xa6\xd0\x8e\xd3\xdc\x4c\xd3\xe0\x2b\x5e\x9f\xeb\xb4\xc5\x39\xf9\xb0\xb8\x2a\x83\x61\xd8\xeb\x85\x12\x12\x57\xad\x85\x36\x9b\xc5\xe7\xf6\x81\x73\xd3\x9b\xdb\x1a\xbe\x06\xd7\xf5\xf1\x41\xb6\x4d\x10\xfc\xce\x4d\xb4\xde\x05\x06\x2e\xf3\x62\xf9\xb3\x66\xa1\xbc\x63\x24\xc8\xdf\x45\xa9\x04\x7f\xe1\x18\x40\x3a\x0d\xb9\xac\x0b\x76\xfa\x84\xec\x35\x95\x5c\xaa\x12\x30\xe7\x68\xd9\x89\xbf\xb5\x42\x3b\xa4\x59\xc5\x72\x96\x25\x29\x8b\x52\xfe\x68\x38\x84\x9d\xfb\x6e\xb6\xb0\x3b\xec\xbf\xae\x48\xc7\xfb\xa4\x0e\x5e\x3d\x75\x4c\x77\x60\x4b\x19\xed\x09\x2c\x51\x17\xcc\x7f\x56\x7d\xcb\xca\x86\x7a\x50\x05\x6e\xe0\xb4\x55\xbc\x62\x41\x60\x79\xd3\x20\xbf\x33\x0e\x03\x45\xad\x1f\xb3\xb4\xbd\x06\xf9\xf4\x5e\xda\xf7\xe3\xf7\xd3\x82\x26\x99\x97\x6a\xf9\x39\x5b\x28\x4e\x84\x56\xa5\x42\x6e\x4f\x2e\x96\x1d\x34\x72\xce\xf1\xcc\x67\x57\x92\x46\xea\xeb\xe5\xde\xd1\xf6\x27\xb0\xb2\x9c\x9b\x89\x80\x57\x5e\x0b\x69\x0c\xf8\x29\xe1\x6f\xca\xb3\x2a\xce\x45\xd8\x95\xea\x03\xe5\x5d\x4a\xe3\x49\x73\xaa\xdc\x5f\x60\x55\x53\xae\xba\xe4\xa4\xa5\xd2\x5a\xca\x2e\x94\x45\x73\xce\x79\xe2\xbe\x7a\xf5\x13\x61\x25\x54\x12\xdb\x4a\x79\xca\xc2\x7d\xa0\x73\xda\x63\x6a\x72\x18\x79\xda\xa7\x50\x58\x3a\x40\x53\x52\xb7\x12\x06\x5b\x43\x52\x1d\xc7\x53\x62\x5b\xe8\xd0\x39\x21\x79\x4f\x65\xa5\x86\x1d\x95\xba\x97\xe9\x8c\x10\x3b\x2a\x95\xe4\x1a\xd7\x9d\x9c\x4e\xad\x42\x5f\x32\x39\x06\xd6\x3e\x9d\x9a\x0a\xcd\x34\xe3\xed\x64\x71\x16\x3e\xac\x9a\x06\x42\x66\xa9\xb9\xba\x26\x05\xf5\xfa\x78\x6e\x52\x12\x1e\xc3\x2a\x75\xcd\x10\x69\xcf\xdc\x51\x0e\x78\x8f\x2a\x46\x2f\xa4\x13\xec\x17\x4d\x54\x8f\xe8\x1e\x5f\xab\xd2\x46\xc6\x59\x4c\x3c\x6b\xc4\x12\x77\xe2\xb1\x36\x6b\xb4\x69\xf6\xdd\x6c\xe7\xb4\xc5\x0f\x3e\x71\x7e\x6c\xf3\xc4\xf9\x61\x5a\x3e\xe3\x90\xf1\x87\x47\x2f\xf9\x19\x6b\x3b\x67\xec\x02\x08\xbf\x01\x93\xc2\xba\x64\xe3\x33\x7a\x89\xe2\x81\x4b\x36\x3c\xe3\x1c\x22\x4a\xa5\x4b\x36\xc2\xef\xe7\xb3\xe9\x54\xe7\x1b\x42\xbe\xd1\x99\x31\xf3\x7e\x99\x0b\x1f\x2e\xd9\x6b\xa9\x64\xed\xf1\xb5\x1a\x6d\xf0\x1f\x84\x00\xb1\xbf\xb6\x07\x2c\xd9\x18\xf7\xee\x0f\xe8\xcb\x0e\xf4\xaa\x52\x21\x97\xba\x2f\xc0\x8d\xa9\x8a\xf7\xdb\xf4\x92\x1d\xb4\xa1\x03\x8d\x36\x34\xba\xdf\x86\x0e\x34\xf1\xfb\xa0\x9d\x75\xa0\x01\xf9\x60\xa0\xb8\xc9\x55\x3d\x8d\x55\xf5\x0c\xb4\xde\x82\xbe\xe2\xec\xd1\x2e\x4d\xc9\x4c\xe9\x13\x0c\x1a\x34\xf0\x20\xa9\x11\x5a\x02\x29\xcc\x7e\x08\x14\x30\x95\x34\x55\x7a\x53\x9d\xc8\x0a\xc9\x9b\xe4\x07\xa8\x44\x1d\x62\xa9\x5f\x07\xf4\x43\xe0\x29\xbd\xac\xbd\xc0\x12\x6c\x1f\xe8\x17\xff\x44\x64\x0e\x67\x23\xf2\x06\x9b\xfe\xb4\xeb\x74\xb9\xcf\x8e\x3b\x28\x69\x9b\x4e\xbb\xe4\x2d\xe6\xf1\x74\x9a\x6d\x0e\x88\x26\xf9\x0e\x49\xd9\x51\x98\x9d\x66\xd5\x5d\x8c\x92\x9e\x7b\x31\xf1\xa8\xfe\xd6\xfb\x25\x26\x4e\x57\x29\x0a\x0c\x84\xd5\xc5\x0c\xdd\x2c\x69\x56\xd4\xbe\x88\x60\xb8\x71\x1d\x6f\xa3\xed\x28\x77\xf3\x90\x0f\x1b\xf0\x17\x0c\x1b\x9f\x33\x9f\x19\x50\xa6\xe4\x6c\xc1\x89\x91\x73\x44\x64\xb6\x18\xa5\xe1\x87\xd6\x99\x18\x47\x00\x4c\xc7\x11\xdb\xef\x10\xf5\x4e\x59\x87\x10\x32\x68\xbf\x1c\xe5\xb2\x24\xd5\x35\x1e\x62\xa3\xea\x50\x45\x66\xeb\xf7\x4f\xad\x88\xaa\x14\x1a\xb2\xdf\x2d\x42\x43\xf7\x2c\xf0\x4a\x25\x95\x00\xdf\x34\x64\xc9\x9d\x20\xe8\x57\x45\xcd\x22\xd5\x73\x00\x25\xcd\xf8\x69\xa8\x2f\xdf\x15\xed\xf9\xfa\x82\xf7\x2a\x1e\xe4\x35\x63\x2e\xe2\x60\x18\x7b\x44\x43\x52\x94\xef\xc8\x93\xc2\x93\x0b\xf2\x66\xe0\xb6\x62\xc9\x00\x4a\xd7\x05\x3b\x08\x33\x95\x17\xdb\x00\xe8\xba\x81\xc3\x85\xd8\x9b\x46\x5d\xb0\xa3\xc3\x3c\xf3\x8f\xa2\x7a\x95\xea\x0e\x60\x76\xe0\x6b\x0a\x16\xfe\x16\xef\x5f\x31\xa3\x22\x98\x70\xb5\x78\xfb\xd2\x52\x90\xe9\x1d\x93\x00\x8e\xcf\x6e\x63\x51\x2a\x2d\xfa\xb1\x29\xdc\xe8\x26\xae\xf0\x50\xb3\x22\xc9\x4d\xc1\x58\x61\x3d\xd4\x32\xef\x2a\xa9\x58\xb2\x2e\xb3\xd0\xac\xc8\xb5\x54\x9d\x48\x79\x9e\x29\xb8\xb4\x08\xdd\x08\xe0\x95\x8f\x92\x5d\x27\xc1\x1b\x20\x3d\x72\xd4\x8a\x50\x2a\x64\xbf\xa4\x95\xe0\xcd\x67\x82\x82\x52\xf8\xfb\x4a\x13\xf6\x3b\x16\x5a\x97\x2f\x61\xbe\xa0\xd2\x28\x4f\x5c\x37\x68\x80\xdc\x83\x50\xf7\x59\x50\x53\x51\x57\x22\xc7\x97\x6f\xef\xa3\x47\xb3\x5a\x19\x7e\x9c\x7d\xb8\x66\x07\x8b\xd7\x74\x54\x22\x0a\x0f\x4a\xa5\x80\xb5\x0d\xc2\x0c\x0c\x1a\xda\x6d\x59\xe8\xb9\x39\xe2\x42\xef\x87\xba\x1c\xd8\x8d\x63\xdd\xcf\x88\xfa\xb8\xcb\x12\x1e\xb0\x36\xbb\x7c\x9a\x4e\x03\xd6\xce\xb9\x8a\x68\xb5\xf0\x87\x86\xa8\x52\x02\x68\x24\xc5\x82\x8f\xa3\x21\x1e\x81\x2e\x0f\xd8\x69\x97\xf6\x78\x50\x80\x21\xd3\x69\x8f\xbc\x25\x05\xc6\xa5\xc8\xa5\x24\x34\xd4\x50\x45\x0b\x15\x03\x76\x1a\x00\xc0\x39\x0d\x68\xca\x07\xa7\x56\x8a\xbe\x31\x74\x61\x80\x2f\x74\x00\x9c\x1e\x5e\x2d\xc3\xd4\x0d\x78\xd5\x19\x6c\x77\x35\x20\x1a\x94\xcb\x24\xe5\x18\x1a\x78\x6e\x62\xb8\x75\x64\xfa\x53\x18\x49\x8a\x23\x49\x61\x24\x29\x8c\x44\x67\xd5\xe7\x30\x21\x4e\xcf\x68\x1a\xa8\x7b\x69\x2d\xac\xea\x65\xf2\xac\x9e\x11\x5a\xf5\x8c\x90\xaa\x97\x15\x9e\x85\x3c\xa9\x27\x08\xb5\x42\xad\x81\x1c\x66\x8c\x54\x04\xac\x16\x8d\x51\x51\x64\x81\xcd\x54\x6b\x60\x18\xcd\xc0\xb0\x98\xc1\x9c\x68\xe0\x03\x04\x29\x0a\x49\x60\xca\xa3\x7e\xa9\x14\x9e\xe4\x8c\x2d\x95\x54\x45\x93\xa2\xe2\xa5\x81\xf1\x9a\xed\xd3\x14\x2b\xa2\xe3\xdf\x78\xff\x54\xd8\x4b\x11\x79\x3b\x3b\x16\x16\xb4\x5d\x2a\x59\xc1\x74\x9a\xdf\x3b\xc2\xa2\x11\x2a\xa7\x53\x4b\xf2\x7e\xd7\xf2\xd9\x69\xc0\xfa\x21\xc5\xdf\xa7\x0e\x21\x54\x5f\xe4\xe9\x4b\xd7\x7d\xf6\x08\x30\x4b\xdd\x28\xc0\x41\xf1\xdd\xd1\xc4\x43\x93\x67\x28\x77\x5a\x75\xa1\x90\x83\xe8\xcc\x21\x90\x46\x5d\x80\xb9\xd4\x73\x6f\xac\x86\xe0\xd5\x6d\x48\x68\x06\xf6\x73\xad\x80\x88\xef\xb7\x94\x1c\x09\x70\xb8\xb8\xb7\x22\xf6\x20\x09\xa0\x43\x2b\xe2\x91\xc1\x7d\xa4\x54\x92\x4a\x5e\xb8\x80\x02\xb5\x8f\x1b\xd8\xc2\x49\x86\x06\xe3\xe9\x34\x21\x6f\x6a\xec\x06\x82\x63\x81\x38\xa3\x6c\x53\x5e\x75\xd2\xed\x58\xef\xc1\x34\x47\x86\x18\x95\x2a\x64\xa8\xbf\x8d\x36\x18\x01\x50\xa3\xb3\x25\x98\x21\xc9\x92\x66\x32\x43\x86\x12\x90\x58\xc4\x01\xa2\x15\x91\x61\xb4\x1a\x19\x46\x45\x64\x58\xa4\xf6\x6f\x56\xc2\x1b\x04\xa3\x28\xbe\x91\xdb\xa1\x23\xcb\x7c\xd3\xb8\x97\x82\x68\xa9\x94\x00\x53\x57\x96\x6b\x00\x21\x23\x05\x9a\x14\xe5\x9d\x14\x06\xaf\x74\xcb\xac\x37\x6d\x1b\x39\x62\xdf\x63\x16\xf8\x16\xa1\x37\xb1\x0a\xfc\x0c\xe9\x48\xd8\xb5\x19\x5e\x26\x38\xdd\xed\x24\xbf\x45\xe8\x61\xb5\x5d\x34\x8c\x88\x1f\x70\x00\x7b\xac\x5d\x2a\xad\xf5\xd8\x45\xa8\xa6\xe8\xf8\xd4\xea\xe1\x6e\xea\xe1\x6e\x1a\xe0\xf7\x00\xbf\x53\x35\xd2\xfc\x8a\xb8\xf5\x97\x70\x35\x43\x65\x06\xae\x2e\xe2\xb3\x6b\x76\x74\xb8\x02\xc8\xfe\x68\x15\x1e\x17\x53\x99\x09\xf9\x32\xfc\x46\x8a\x42\x8d\x68\x79\x3f\xeb\x97\xf8\xb0\xb1\x68\x61\x9b\x9d\xfd\x13\xb7\xdf\x74\x8a\x3b\x2d\xcc\x29\xf1\xf7\x36\x48\x88\x42\x6f\xdf\xfd\xf9\xe2\x91\x52\x29\x71\x0f\x81\x2b\x48\x0a\xca\x90\x4e\x54\x2a\xa1\x3e\x64\xc4\x5e\x68\xc4\x5e\x69\x04\xc8\xb0\xcc\xb6\x68\x64\x60\x95\x06\xbb\x6a\x0f\x2b\xc4\x68\xf6\x2f\xe0\x46\x2c\x1d\xb3\x17\x1a\xb3\x57\xb5\x73\x23\x0f\xea\x30\xdf\xc5\x6a\x7c\xae\x74\xaf\x71\x55\x7c\x5c\x15\x98\x9e\x04\xbd\x98\x0b\x23\x03\xca\x1f\xcb\x00\xae\x86\xbd\x5c\x34\x0c\x37\x47\x5e\x98\x93\x88\x1d\x04\xba\x4f\xe2\x7e\x90\xec\x22\x24\xfa\x5e\x29\xe1\x92\xb5\x9d\x98\x37\x5b\xa8\xd8\xe7\x98\x5b\xe2\x33\x9f\xed\x42\xb1\x84\xbd\x54\xe2\x1d\x9e\xba\x81\xf4\xa6\xd3\x84\xbd\x94\xe3\x6d\x0e\x08\x00\x02\xaf\x2a\xe9\x2c\x50\x21\x4c\xc2\x5b\x8a\x98\xaf\xd5\x14\x30\xc1\xfb\x18\xf6\x52\xac\x41\x95\x07\xd0\x98\xb0\xd7\x62\x79\x53\x9a\xbc\xc5\xeb\x3c\xd6\x17\xce\xd0\x81\x54\xa9\xf3\xe8\xef\x03\xd8\xe3\xd0\x38\x96\x44\x0e\xe9\xb5\xa2\xd1\x11\xef\xae\x03\xd6\xec\xad\xf7\xe8\x80\x0f\xd6\x07\x90\xba\x9e\x20\x5e\x2c\x0f\x76\x78\x5c\x2a\xa5\xe5\x04\x7f\x7b\xd9\x2f\xc4\x03\x79\x5e\x30\xdd\x38\x8b\xf9\x5a\x75\x06\xa4\xb4\xa5\xd0\x7b\x46\xcc\x5d\x37\xec\xc1\x11\x0d\x68\xe8\x21\xac\x86\x39\xab\x23\x00\x89\x68\x4c\xd5\x56\x95\xf4\xc7\x31\x2a\x54\x12\xba\xab\x72\x10\x62\x23\xac\x8d\x51\x4d\x74\x0e\x63\xa9\x9a\xf0\xc2\x42\x6a\x74\x45\xa5\x41\x57\x02\x3f\x21\x0f\x44\xe6\xa8\x4a\xad\x70\x48\x3f\xa8\xc8\xa2\xc6\xa7\x28\x9e\x96\x25\x6a\x46\x28\x52\x04\xf0\x1b\xd2\xe0\xf8\x56\x41\x7d\xab\x27\x0b\x26\xa1\x9f\x27\x00\x66\x06\x5a\x02\x49\x9f\xac\xbc\xc1\xe7\xfa\xd3\x94\x36\x38\xdd\x7c\x62\xd9\x9f\x93\x22\xd1\xee\x64\xdc\x49\x58\xf8\x8e\x14\xc3\x85\x64\x4f\xe1\x28\x85\x85\xa3\xa4\xf7\x6b\xa8\x0f\x51\xb2\xeb\x39\x5a\x4d\x74\x35\x69\x35\x77\xc0\x62\x32\xc3\xda\x8f\x3b\x24\xd7\xb1\x36\x83\x08\xb3\x21\x84\x66\x00\xa1\xe9\x7e\xce\x59\x68\x1e\xd0\x6f\x2a\x32\xa3\xc0\x3b\x16\x44\x91\x0a\x7d\xc4\x8a\x85\xd4\xe4\x89\xbf\x44\x9e\x08\x45\x9b\x2c\x28\xd2\x9e\xb4\xe6\x96\xce\xcf\x75\xcb\x0f\xb6\x8c\xc4\x06\x0f\xe5\x9a\xb5\x16\x4e\xa7\x21\x7b\xd9\x8e\xf0\x24\x86\xec\x65\x27\x82\x33\x42\x70\x6b\xf9\x6e\xbc\xeb\xe1\xb5\xcd\xbd\x15\x11\x83\x8d\xdd\xc7\x06\x95\x46\xf3\x0c\xb6\xc5\xbd\x15\xd3\x80\x6a\xcd\x0e\xdc\xe6\x48\xa4\x87\xa8\x7c\x1d\xb2\x57\xda\xc5\xcb\x6a\xbc\xb3\xde\x07\x4e\x21\x34\x8a\x29\x75\xb7\x4b\x6b\x9e\xed\xd6\x68\x57\xa9\x0a\xe1\xae\xd0\x17\x96\x34\x29\x87\x6e\xd5\x23\xda\x8a\x41\x4a\xd3\x72\x88\x6e\xe1\xee\x98\xf0\x07\x96\x49\x53\xdf\x35\xad\x9f\x07\x58\x0f\x8d\xfb\xf7\xd0\x6e\x41\xce\x95\x67\x42\xe8\x8c\xe6\x2b\xc0\xf5\x98\xbb\x4f\xef\x0d\x2a\x31\x2a\xe6\xfe\x08\x16\xa7\x54\x5a\x33\x9f\xec\x53\x0b\xa7\xc9\x35\x11\xee\x75\xe0\x01\x1c\xa9\xd4\x00\x06\x67\x17\x80\xb0\x0b\x15\x41\x12\x19\x6a\x04\x88\x65\x1e\xb9\x29\x4c\x8a\xd2\x91\xed\x02\x55\xad\x6c\x7c\xb2\x3b\x61\x68\xef\xec\x70\x4b\x9a\x7a\xc4\xc1\x15\x87\x74\x3a\x20\xb3\x0c\x90\x7f\xe8\x11\xa7\xcb\x63\x54\xbe\xec\xa2\xbc\x69\x3a\x4d\x21\xea\xf8\xa7\xd5\x35\x1a\xcd\x3d\xda\xc5\x22\xfa\x72\x31\x50\xcb\xb4\x72\x86\x86\xe1\x0b\xa0\x5d\x80\x0c\xb8\xfd\xe6\xe8\x96\x70\x9e\xa7\xcd\x5c\x64\x02\x9b\x6e\x68\x95\x6c\x5e\x35\xf7\xfe\xb4\x9f\x71\x7c\xea\x9e\x27\x5c\xb8\x40\x0a\xdd\x58\xf1\x06\x29\xf7\x5d\x08\xb0\xde\x7e\xa6\x5b\xe4\xbe\x78\x6b\x7c\xd0\x30\x5f\xbf\x0e\x8c\x51\x98\x54\x9d\x28\xad\xc7\x0a\x07\x16\xcd\x22\xe3\x65\x78\xca\x53\x26\xce\x36\x36\x69\x75\x3b\x45\x99\x9b\x7e\x5e\x52\x38\xe1\x29\xed\x22\x37\x08\x93\x18\xd1\x84\xe4\xc2\x4e\x5d\x1b\xaa\x28\xeb\xda\xb4\x74\x41\x3d\x66\xc9\x2b\x21\x14\x1f\xba\x40\x44\x59\x41\x0c\x7d\x5d\xbe\xeb\x65\x42\x85\x94\x76\x01\x2a\x99\x67\x0f\xaa\x39\xf1\x07\x5e\xae\x8b\x8c\x29\x7b\xc2\x77\x61\xb0\x03\x5e\x0e\xb4\xe8\x01\x48\x66\x25\xae\xd0\xab\xe6\x1e\xf8\x9e\x5a\xaa\x68\x1e\x04\xb4\x17\x19\xff\xe2\xf5\x73\x4e\x00\xa9\x67\xeb\xec\x86\x00\xc6\xd3\xba\x69\xc7\x5e\x1d\xfe\xd8\xbe\xba\x7c\x05\x0e\xf2\xf8\x9e\xdd\xd0\xae\xd6\x24\xe8\xd2\x6e\x19\xa2\xdc\xf3\x17\x6f\x3d\x9d\x7f\xde\xab\x9f\x9c\x74\x69\x8d\xa6\x54\xe4\xe4\x33\x2a\x0e\xfd\xcd\x3e\x00\x6e\x5e\xd5\x89\xca\xdf\xe8\x84\x13\x17\x24\x2b\x85\xe9\xba\xfe\xdf\x99\xae\xfe\xdf\x99\xae\x2e\x0d\x69\x4a\x6b\xff\x5b\xd3\x75\xf0\x77\x66\x6b\x75\x1f\xde\x9b\xad\x78\x99\x92\x9e\xeb\xab\x41\x3c\x99\x05\x2b\xc3\x71\x07\xb8\x59\xbb\x9a\x12\xfa\x2e\x3d\x64\x25\x7f\xcf\xd9\xa3\x34\xc4\xe6\xa8\x98\x8b\x46\x1e\x71\xee\x72\xe6\x1a\x88\xd2\x11\x40\x34\x75\x89\x39\xc3\xde\x86\x96\xcf\x8e\x04\x0d\xc6\xa8\xf0\x0c\xa1\xab\x3b\xda\xef\xa3\x4b\x6b\x23\xf9\xd2\x77\x88\xac\x15\x1a\x2c\x8c\x0d\x7c\x6f\xe8\xfa\x81\x6a\x6e\x1a\xe8\x56\xb0\x66\x7c\x22\xde\x25\x87\xfd\x52\xc9\x67\x97\x04\xf8\x07\x8d\xe1\xf9\x9a\xb5\xf6\xd8\xc5\xbb\xf7\xb5\x2e\xfc\x12\x27\x46\xf4\x1d\x20\x2b\xac\xdf\xbf\xa0\x61\x9f\x39\x79\xe1\xed\xa2\x36\xed\x24\x42\x5d\xda\xc6\xd0\xf2\xd5\x8b\xe1\x79\xfd\x05\x5a\x1c\x42\xeb\x38\x7b\xd2\x26\x35\x2f\xe1\xbb\x1d\x63\x0d\x3c\xe2\xf9\xe5\x1b\x62\xc0\x42\xc9\xfd\x03\x5c\x04\xcc\xbd\x20\xe2\x43\x15\xb2\xcb\x39\xbd\x73\xd4\xa8\xd8\x85\x65\x9a\x6b\x7e\x5f\x89\x05\x72\x6d\x11\x7c\x40\x85\x0b\x33\x9b\x5d\xb3\x87\xad\x55\x2f\xc6\xfd\x33\xcb\xd8\xe7\xbe\xdb\xd4\x16\x5d\x3e\x5c\x33\xff\xec\xbd\x97\xf4\xe7\x4f\xfa\xe9\x6d\xa6\xbf\xfa\xb1\xd3\xfd\xe8\xb3\x34\x97\x6f\xa6\x6e\x80\xa8\xc3\xff\x65\xf9\x18\xa0\x22\xb1\xde\x12\x73\xb1\x92\xd3\x42\xca\x40\x00\x8d\xd4\x7b\x03\xa8\x27\x2c\x4a\x20\x71\x71\xd9\xc0\x37\x38\x4a\xa3\xe2\x3b\x61\x05\x04\xfe\x46\xc4\x23\xce\xab\xe6\x40\x95\xfc\x2b\xe6\x31\x6b\x05\x39\x1f\x0e\x75\xc6\x48\x43\xe1\x5f\x37\xf5\xd8\x9d\x40\x6c\xb4\x5c\x19\xfc\x4d\x89\x47\x68\x5e\x25\x71\xa4\xd9\xf1\x52\x67\x95\x4a\xbf\x14\x4b\x68\x51\xfa\x5b\xd6\x7d\x33\x24\x62\x3e\x80\x6a\x45\xc2\x71\x75\xef\xe7\x9a\x32\xaa\x1b\xba\x25\xfd\x58\x05\x11\xad\xaa\xbb\x21\x80\x6a\x09\x38\x7c\xb9\x5d\x8f\x06\xcb\x55\x77\x17\x2a\xa5\x31\x0f\x60\x42\xb0\x8b\x7f\x3d\x1b\x1f\x90\x1d\xc7\x7a\x56\xce\xc6\x49\x51\xef\xa3\xeb\x65\x8a\x39\x58\x82\xcc\x8c\x5a\x06\x1a\x63\xb8\xdb\x5c\xd4\x94\xfa\xdb\x1b\x26\x53\xcc\x9c\x9b\xe3\x82\xd7\xef\xcc\xd6\x40\x44\xab\xb8\x42\xa1\xa7\x83\x35\x9a\x2d\x45\x88\xb7\x3d\x91\xb2\x3b\xb0\xbc\xb0\x11\xfc\x86\xe6\x75\x64\xa1\x5e\x6a\xea\xd5\x5f\xa6\x4a\x42\xa5\xa9\x8d\x2e\xad\x5d\x46\x6d\x65\x4b\xe7\x17\xb5\x69\x82\xc2\x9a\xc5\xa4\x20\xe8\xcc\x73\xd1\x80\x90\x2c\xd8\x52\x4f\xd4\xe7\xfa\x14\xd0\x6a\xa6\x80\xd3\x0a\x74\x54\xad\x50\x84\xd0\x80\x07\xba\x83\x66\xe5\xf2\x05\x8b\x09\xc9\x15\x69\x0a\xe2\xd1\xce\x89\xc8\xd4\xe3\x5e\xb8\x60\x2f\xd3\x69\x55\x01\x88\x57\x2e\xd8\x6b\x16\xea\x69\xef\xea\x97\x4a\x9a\xfb\xa2\x1f\xb4\x11\x27\xf1\xf5\x26\x71\x01\x1e\x06\x2f\x26\x04\x90\xb0\xd0\xce\xbd\x6a\x67\x3e\x5d\x9b\xc7\x10\x5c\x30\x5f\xdb\xca\x38\xe2\x82\x1d\xa9\xcf\x13\x80\xc8\x27\x81\x0a\x1c\x43\xe0\x58\x07\x06\x3e\x1f\x3f\x76\xe4\x47\x74\xc0\xce\x06\x7e\x1d\xfe\xd8\xe7\xda\x31\x02\xf0\x19\x52\x4b\x9f\x0f\x7c\x83\xb3\xd9\x01\x64\x3b\xf0\xed\xaa\xd3\xd4\x9d\xc8\xeb\xc0\x77\x6d\xf8\x57\x99\x40\xd1\x20\xf2\x3b\x5f\x5b\x13\xec\xee\xfb\xec\xfe\x04\x4d\x47\x5d\x7f\x5a\xb6\xd4\xa3\xd6\x91\x5f\xe9\xc7\x37\x47\x73\xba\x67\x7a\xcb\x17\xaa\xcf\x9f\xcd\x85\x7c\x78\x6a\xf9\xec\xa5\x2c\xd9\x0b\x5a\x9d\xa6\x30\x5a\xa0\xe1\x31\xfe\xb5\x2c\x51\x33\xdd\x17\xee\x2b\x1c\x11\x76\x9c\xbf\x70\x09\xdd\x57\x8f\xf3\x50\xdd\x78\xfb\x18\xf0\x21\xa0\x44\xba\xb0\x4e\xfb\xa9\x05\xf1\x14\xf3\x50\x4c\xa4\x50\x8a\xcc\x08\xf5\xf9\xaf\x8e\xe5\xd3\xfb\xce\xbb\x2f\x66\x92\x13\x6d\xe8\xfa\x57\xc7\x12\x6e\x3f\xf0\xac\xdf\x77\x64\xd5\x7d\x55\xe6\x6e\xbe\xd1\xb1\x04\x59\xe3\xfc\xbc\x70\xd9\xe4\xf3\xb7\x19\x55\x06\x13\x84\x31\x98\x90\xcd\x48\xe0\x61\xbd\xb7\x77\x80\xd5\xae\x3a\x96\x74\xab\x2a\xe6\x32\x24\xb4\xd1\x01\xd2\xbb\xff\x60\x35\x20\xa1\xe6\x11\xe2\x54\x39\x47\xa6\xb6\x7e\x9f\xa0\x7c\xde\xfe\x6d\xcd\xeb\x9a\xf9\x68\xcb\x1e\xdf\x11\xbd\xcd\x1c\xc8\xe5\x0a\x8f\x46\x24\x37\x06\xe9\x2b\x8d\x96\xf3\x16\xf4\x2b\x3d\x11\x7c\xad\x56\x90\x56\x3e\xa8\x31\x03\x93\x9e\x9e\xe4\x4e\x90\x50\xb3\x64\x60\x1b\x17\xcb\x27\xa9\xa0\x52\xf4\x13\xfb\x7b\x2a\x94\x7b\x54\xfb\x22\x15\x99\x8f\xd5\x03\x93\xdc\xc8\x92\x7f\x14\x92\x8f\x4d\xf2\x5e\x96\x7c\x59\x48\xde\x35\xc9\xcf\x59\xf2\x51\x21\xf9\xa7\x49\x3e\xcc\x92\xcf\x0a\xc9\xaf\x26\x79\x9c\x25\xef\xa7\x62\xe6\x2d\x7b\xf2\x8b\xfb\x42\x76\xc2\xee\x50\x7b\x5d\xab\xd9\x2f\xa9\x50\xee\xd9\x36\xed\x61\x2a\xe8\x4b\xcd\xde\xdf\xa3\xaf\xf8\xf7\x65\xd3\x3e\xd8\xa3\xaf\x9b\xe8\x4a\xf1\x1d\x1f\x88\xad\xbb\x99\xf6\xa9\xb8\xc2\x0b\xe1\xdd\x1f\x4a\xcd\xe8\xf8\xef\x15\x7b\xd7\x81\x1c\xa6\xfe\xc9\x11\xa1\x96\xd0\xa7\x7b\x34\x73\x49\xf8\x61\xce\x0b\xe0\xb7\x99\x73\xde\x62\xe8\xfa\xaa\x13\x70\xdf\xf1\xb5\x53\xda\x9f\x46\x93\x68\x70\x40\x81\xb0\xbb\x82\xc8\x41\x31\xd6\x74\xaa\x97\xc7\xcd\xf5\xe5\x59\xbb\xa4\xa4\x77\x21\xae\xce\xc1\xde\xdc\xf8\x7f\x16\x8b\xdd\xad\x8e\xc7\xbe\x3d\x88\x97\xce\x43\x67\x12\x4a\xd5\xbb\xb0\x2b\xfc\x34\x3c\xea\x0e\x43\x34\x81\x38\x86\x51\xac\xd5\x96\x7b\x73\x31\xa3\x83\xb0\xdf\x09\x07\x57\xaf\xbd\xd0\x1e\x34\x8a\x0e\x0d\xd9\xd7\xbf\xd3\xd1\x95\x4e\x38\x17\x5c\x38\x5e\xac\x1e\xcb\x7f\x56\x14\x87\x3b\xe8\x89\x7e\x82\xda\x7a\xbe\x83\xa7\x36\x7b\xce\x72\xde\x72\x85\x57\x20\xe7\x7f\x16\xb4\xc1\xdf\x66\xce\xad\xb0\x7c\x2a\xdc\x7d\x6f\x3a\x15\xc6\xe4\x51\xeb\xc1\xf2\xdd\x7d\x74\xdb\xc6\x2f\xea\x96\xcf\x9e\x7d\xc0\x16\xa2\x9f\x84\xfd\xe9\x34\xa0\x3e\xeb\xdc\x03\x89\xa2\x1c\x1f\x4f\xa7\x01\xb1\xad\x80\x1f\x3e\x00\xc9\xb0\x90\x79\xff\xc1\x3a\x7b\xb0\x02\xca\x36\xb7\x10\x75\xcf\x17\xdc\x7f\xb0\x7e\x64\xa9\x45\xaf\x67\xf9\x23\x9a\x25\x17\x3f\x71\x66\x30\xca\xd8\x90\xea\x3f\x18\xcf\x3e\xa7\x92\x6b\xe4\x77\x28\x78\xf4\x68\xcc\x51\x1e\xf4\x05\x7d\x13\xbe\x2d\xe7\xac\xf9\x48\xd6\x7b\xa0\x69\x60\x4b\x76\x33\x36\x76\xe0\xfa\x21\xbf\xce\xac\x58\xee\xf7\x05\xed\xec\xe9\x94\xd7\x07\x7e\x99\xa5\x34\xfb\x82\xb2\x6f\x06\x01\xb6\xb9\x46\xff\x37\x4d\x5e\xd3\x5e\x7c\x9a\x7c\x53\x7d\xb5\x9f\xf8\x67\xf5\x75\xfd\xc4\xbf\xa8\xaf\xa8\xa7\xf8\x86\x78\x4b\xfd\x46\xfa\xb7\xa3\x7f\xef\xb6\xb8\x46\xd3\x93\xb6\x8a\xf1\xd9\x2f\xeb\xb0\x49\xaf\xaf\x0c\x35\xf0\x83\xff\x6c\xe9\x2b\xe3\xb6\x5b\xf5\x88\xbb\xaf\x0d\xd1\x5f\x35\x55\x89\x0b\x6d\x46\x6b\x57\xd7\xf0\xaa\x7f\xaf\x27\xea\xf7\x6a\x52\x78\x69\xf0\x7a\x6f\x91\xd9\x87\x0b\x74\x2a\xf4\x7a\x3f\x67\xc7\x2f\x93\xbc\xe3\x3a\x68\xa9\x3b\x3b\xb4\xc8\x76\x6e\x20\xf8\xdc\x31\xda\x04\x0d\x4b\x59\x08\xf6\x4b\xa5\xb5\x4f\x1d\x64\xf9\x08\xbe\xa0\xf8\xf8\x60\x0d\xa2\xb2\x28\xff\xe3\xe3\xc3\x68\x30\xfc\xe8\x87\x1f\x1f\x23\xf5\x8e\xe2\x1f\x65\x89\xee\xf2\xee\xfb\x44\x3b\x47\x2c\x95\xde\x29\x1a\xa0\x34\xf0\xdd\xc2\x06\xef\xcf\x0a\xac\x59\xff\xc1\x18\xee\x4a\x62\x2a\x39\xf6\x1c\x5a\xf9\xbc\x23\xb3\xda\xff\xd1\x10\x43\xf1\x71\x08\x00\xe2\xe3\xe0\xee\x71\x94\xca\x8f\x77\x62\x1c\x7e\x14\xc3\x8f\x69\x28\x06\xc3\x8f\x9f\x3f\x06\x8f\xe9\xe8\xa1\x3b\xf8\x07\x71\xb4\x1b\x80\xbb\x36\x5d\xab\x52\xb7\x79\xe7\x19\x35\x79\x9d\x70\xd3\xa4\x6b\x35\x95\x40\x23\x13\xf9\x3b\x8f\x74\xcc\x0a\x07\xec\x32\x2b\xa2\x63\x3b\xc5\xd8\xdf\x4d\xe2\x3c\x69\x7a\xa9\xfd\x64\x0c\x1b\xb4\x9f\xb6\x65\xdd\x32\xbb\x48\x98\x64\xec\xcc\x15\xc5\x56\x4d\x22\x6f\xde\x99\xb7\xd0\x57\x13\xc0\xe6\x66\xfd\xdd\x2c\x53\xb1\xbd\xf6\x13\x21\xf6\x07\xb3\x67\x33\xc7\x94\x78\x71\x64\xfa\x71\x9d\xf5\xe3\x1a\xfb\x21\x4c\xb4\x6a\xdf\xd4\x1b\x17\xeb\xbd\x7e\x02\x8e\xeb\x28\x3b\x3b\xa7\x13\x81\x42\x65\xdb\x1c\x0a\x2d\xc8\x6e\xa0\x17\x08\x9f\xfd\x78\x02\xb0\x94\xeb\x8e\x05\xec\x0c\x58\x93\x5c\x2c\x1b\xb0\xd1\x83\x25\x09\x66\x75\x13\x8f\xcb\x99\xcf\x52\xee\xaa\x6b\xcd\x9b\x06\xbd\x8e\xed\xbc\x35\xf7\xd3\xab\xa0\xfd\x7d\x0f\x9a\xa4\x87\xa7\xf6\x5a\x95\xde\xc6\xc2\x8e\x69\x62\xbb\x1e\x95\xcf\xc2\xd6\x13\x44\x43\xf3\x7d\x3d\x99\x41\x3f\xf6\x87\x3c\x74\x7c\xd6\xdf\xe7\xc0\x76\xfb\xec\x17\xaa\x9c\xc3\xaf\xbe\xc9\x1d\xf0\x9a\xe3\xb3\x93\x2e\x77\xbd\x02\xc0\xea\x9e\xac\xb8\x41\x17\xb0\xfb\xb4\x9f\x3c\x1c\x4e\x68\x86\x13\x71\xe9\x1e\x79\x56\x48\x05\x6c\x03\x1a\xe7\xc1\xdf\x4d\xd8\x40\xaf\x57\x96\xcf\x42\x94\x6b\xc4\x10\x08\x20\x10\x17\x0c\x34\x5d\xb6\x90\xd2\xd3\x11\x31\x46\x04\x28\xe3\xc8\x41\xfe\xe3\xc9\xca\x17\x7d\xd0\x1d\xe8\xd9\x42\x8f\xd0\x11\x1c\x17\x7a\xf5\x7d\x9a\xf0\x80\xa6\x3c\xa4\x5d\x1e\xc1\x30\x7a\xbc\x0b\x5d\x4c\x69\xc4\xee\xda\x84\x0e\x78\x97\x35\x45\x16\x1c\xe5\xa9\x30\x9e\x71\x1e\x84\xf1\x4c\x32\x13\x0f\xba\xff\xac\xfd\x84\xcf\xc2\xb2\x5c\xed\x27\xa2\x55\x64\x27\x84\xbc\xe9\xd7\x50\xe6\xde\x12\x7a\xb4\xb7\x54\xc5\xf5\x13\xaa\x65\x66\x55\x5c\x67\x55\xec\x2d\x57\x01\x83\x38\x95\xd6\x80\x46\xec\x50\x10\xb7\x8f\x3c\x76\x84\xc7\xe5\x8a\x44\x00\x25\x6f\x1f\x2c\xf8\xa5\x93\x5c\xf2\x1e\xe9\xe3\xa4\x26\xa8\xc1\x27\xf4\x07\x8f\xd8\xd5\xc4\x6d\xa8\x77\x8d\x3f\x54\xc2\x0f\xde\x39\x2e\x37\xca\xad\x90\x9e\x01\x16\x89\x98\x4f\x7f\x94\xf7\x9b\x34\x02\x18\x1d\xb1\xeb\x89\x7b\xec\xfd\x0f\x06\x8e\x3d\x8f\xd0\x33\x00\xe1\x67\x84\x5e\xc2\xe1\x50\x99\x9f\x4f\x70\x9f\xfe\xe0\x57\x26\xe6\xe0\x80\x36\x20\x42\xa3\xff\x33\x77\xdf\xa3\xfb\x13\xfb\x92\x36\x27\xf6\x8f\x99\xa3\x7b\xc1\x7f\x38\x58\xff\x77\xcf\x6a\xa0\x94\x7e\xb7\xcd\x3f\xe0\x40\x76\xdb\x74\x8f\x38\x23\xfe\x7c\x65\xc5\xb0\x75\x46\xc4\x19\x43\x20\x81\xc0\x58\x6d\x1b\xce\xf9\x28\xd3\x10\x1e\xd7\xd5\x8c\xd9\xd6\xaf\x16\x1a\xb8\x2a\x95\x7e\xb5\xac\x84\x8e\x49\xa9\x64\xc5\xac\x1b\x58\x23\x42\x13\xf8\x1d\xa3\x28\x25\x62\xc1\xb5\x95\xd2\x01\x6c\xd6\xb7\x8e\xb4\x7b\xe8\x45\xd9\x1e\xd0\xdf\xb1\xb0\xbb\xd4\x17\x36\xcc\x34\x95\xa1\x1d\xd3\x76\x04\x9c\xdd\x88\xbe\xda\x63\xed\x31\x7a\x82\xce\xc5\xed\xbd\xd9\x8c\xcc\x04\xeb\x3f\xe0\x8b\x1c\x86\x76\xeb\x23\x14\x5e\x09\xbd\x34\x02\x10\xda\xde\xbe\xb0\x04\xf3\xa9\x60\xaf\x6d\x42\x25\x13\x5f\x2d\x88\xcf\x17\x4a\x98\x85\xca\xfd\x52\x0a\x35\xef\xb8\xbf\x81\x30\xb9\x9e\xb8\xa1\x47\x81\x4f\xbe\x9a\xb8\xbe\x47\x03\xb6\x3f\x29\x95\xb0\xed\x13\xbc\xa6\x7a\x53\xaf\x90\x42\xda\x91\xb6\xaf\x06\x13\xb0\xe6\xc4\x28\x42\x17\x6f\xf3\x02\x77\xdf\x9b\x11\x7a\x69\xaf\x55\x67\xc4\x11\x80\x7b\x07\x87\xa6\x8b\xbb\xed\x0c\xa5\x06\xab\x2d\x0d\x16\xd1\x52\x53\x18\x2b\x38\x70\x6c\xc2\xb9\x18\x38\x39\x12\x00\x1c\x10\xd3\xda\x4c\xf7\x16\x1d\x8b\x74\x14\xda\x72\x46\x8b\xf1\x1d\x13\x1f\xce\xcc\xb5\xa1\x86\xe8\xa5\x92\x35\x5f\x2b\x9c\x34\x89\x03\x2e\x94\x8f\xf2\xf2\x84\x14\x2b\xb8\x56\xf7\x3e\xc5\x0a\xae\x57\x55\x10\x9b\x0a\x82\x59\x86\x91\x75\xba\x4f\x8f\xe6\x5d\x14\xf7\x4e\x32\x6b\xd5\xb7\x0f\x86\x86\xea\x6b\xb3\x9f\xe2\x89\x57\x34\x31\x15\x0f\x4c\xe2\xf1\x21\xaf\xd4\x66\x1f\x7a\x4a\xd0\x10\xf4\xc3\x39\xcb\xb4\xf3\x17\x80\x55\x75\x05\x81\x7e\x0b\xde\xf1\x02\x6c\x38\xf3\x19\xa1\x0f\xe8\xd0\x54\x97\x21\xf8\x48\xd9\xad\x7a\x9c\x0b\x57\x28\xa3\xef\xc4\xf4\xb3\x46\x4d\xff\x44\x66\x2c\xbe\x7f\x5b\x08\x1c\x1f\xc2\xc6\xcb\x55\xcd\x94\xdd\x1e\xb6\xb5\x8e\x55\x57\x6a\x34\xd6\xf7\x1f\xaa\x66\xe5\x2f\xd6\xb2\x6a\xd5\x6a\xc5\x27\x1b\xb5\x6a\xd5\x64\x24\x34\xc9\x7c\x3c\x18\xdb\xcd\xc5\x64\xc7\xe7\x4f\xc8\x8f\x1b\xb5\x16\x37\xf2\x2a\xa6\xea\xc8\xab\x60\x97\x6a\x6c\x6b\xdd\x04\x13\x8f\x10\x07\xaf\x66\xaa\x9e\x21\x0d\xe2\x01\xaf\x51\x1f\x6d\x04\x2a\xa7\x17\x84\x18\x63\x08\x50\xaa\x6c\xea\xd3\xd3\x50\x81\x48\x53\x69\xac\x82\x04\xce\xfe\x7b\x53\x2c\xb6\xbb\xa5\x92\xd8\x49\x0d\x85\x7d\xfb\xc0\x9f\x3a\x56\x40\x4a\xa5\xea\x76\x50\x0f\xec\xfe\x89\xbe\x8b\x44\x4b\x42\xca\x40\x96\x99\x60\x5d\x60\xdd\xaa\x69\xc3\xcd\xf1\xa0\xfe\x41\xb9\x06\xd9\xd0\x69\xc4\xd6\xae\x3a\x4c\x98\x38\x79\x66\x4d\xab\x88\xa7\xed\x85\x11\xa3\x87\x6d\xe3\x1d\x57\xe7\x21\x59\x15\xf3\x1b\xf1\xf6\x61\x5d\x94\x75\x9e\x6c\x17\xea\x98\x78\x50\xdc\xcf\x6a\x31\x0a\xc6\x0e\xaa\x8e\xaf\x84\x3a\xbe\xba\x5c\x5f\x3b\xb9\xb7\x84\xeb\x7b\x44\x13\xce\x6b\xb5\xfc\x9d\x5b\x56\xcb\xe0\x64\xde\x06\x66\x8d\x73\x81\x63\x41\x03\x2e\xaf\x5d\x51\xb6\x04\x13\x4f\x6c\xf8\xf8\xb3\x1f\x06\x9d\x01\x4c\x77\xad\x4a\x2a\x55\x92\x0b\x95\x50\x0c\x78\x58\x81\x72\xc6\xf1\x66\xb9\x86\x34\x14\x56\x62\xc9\x75\xc1\x6e\x1f\xca\x50\x0f\x59\xae\xa8\x7c\x11\xae\x72\xf0\x38\x5c\x1c\x1e\x7a\xe5\xac\x3a\xc1\x36\xb6\x56\xae\xa1\xec\x4a\x35\x10\x60\xdb\xa4\xd0\xcc\x2a\x37\x9f\xfd\xc5\xfb\x2b\x38\x76\x9c\x67\xde\xd1\x6b\xfa\x12\x3d\xf3\x98\xeb\x57\x84\x13\xe8\xc7\xfa\x81\xd1\xec\xd0\xa6\x21\x60\x43\x85\x5a\xdd\x18\x29\xa3\xea\x76\xe4\x84\x40\x11\x25\xf5\x68\x27\xac\xef\xde\x5b\x01\xb6\x62\x07\x76\x5c\xd7\x2e\x1d\x68\x48\xec\xa4\xae\x7d\x3f\x60\x9a\x23\xb4\x31\xf6\xd0\xf1\x39\xfb\xb6\x2e\x9c\x90\xd7\xd8\xe6\xba\x70\x22\xf4\x69\xa2\x14\x54\xc4\x4e\x38\x9d\x8a\x6d\x7f\x3a\xf5\x77\x78\x48\xc8\x5b\xc0\x6b\x0e\x70\xa6\xf2\x51\x5f\xd6\x08\x9a\xf2\x80\x26\x3c\x72\xaa\x9c\xc7\xd3\xe9\xda\xe9\xbd\x15\x13\x74\x90\x91\x4e\xa7\x56\xca\x61\x60\x71\xbd\x96\x7b\x13\x52\x47\xbc\xa2\x5c\xa1\x28\x0d\x92\x98\x90\x8d\x3b\xb7\x35\xc1\xe3\x4e\xd6\xf3\xac\x1a\x2a\xa4\x84\xd0\x74\x9d\x57\xb7\xa1\x22\x03\x59\xc4\x8b\xb5\xb5\x9e\x58\xe9\x7a\xbc\xb1\x45\x68\x8d\x6c\xa4\x04\x56\x66\xf6\x7c\xd7\x49\x43\x6b\xcd\x8a\x77\xb8\x5f\x2a\xc5\xdb\x3c\x24\xa5\xd2\xd6\x0e\x3a\x1a\xdc\xda\x09\xea\xb1\x2d\x32\xff\xcf\x75\xb6\xb5\x2d\xea\xca\x64\x2d\xb1\x6b\xb6\x28\x1a\xdf\xce\x29\x5c\xc3\x7e\x6b\x8e\x7c\x22\x78\x50\xff\xd4\xb5\x7c\xba\x37\x10\xf4\x08\x1d\xd7\xdb\x17\x45\x86\xdc\xa7\xdf\x07\x8a\x17\x5f\x61\x59\x37\xd5\x16\xac\x27\x02\xdf\xd7\x09\x76\x33\xb6\x2f\x0c\xdc\x78\xbc\xe6\x2d\xa8\x79\x77\x60\xee\xe6\x1e\xf4\x0d\x6e\x14\x18\x43\xd0\x23\xc4\x0b\xce\xaf\xe7\x95\xbe\xcb\x75\xdd\x33\xe2\xf8\xab\x9d\x9b\x03\x54\xd3\x7d\x75\x5f\x03\x0f\x5d\x9d\xc7\x21\x8a\x7b\xde\xf3\xb3\x1b\x05\x33\xe7\x9a\x75\xe6\xfd\x7e\x98\x5e\xa1\xb3\x00\xf1\x75\x39\xed\x21\xe4\xca\xaf\xe0\xde\x73\xb1\x62\xd8\x59\xba\xec\x74\xba\xa6\x73\xce\x19\xa2\x53\xc2\xf4\xb7\xe1\x63\x4f\xa3\x6b\x65\x8a\x37\x0d\xa3\xa1\x89\x70\x0f\x3c\xaa\x44\x53\x26\x22\x90\x5e\xa5\x90\xa8\xc5\x55\x26\xe6\x2c\xc8\x52\xb1\xae\xc7\x7e\x27\xec\x2a\x8d\x1b\xfb\x2a\x06\xfa\x4d\x4f\x09\x0d\x3e\xd9\xc7\x0d\x2a\x3f\xd9\x7a\x3d\x66\xd4\xe7\x7b\xda\x0f\xce\x43\x48\x05\x75\x0d\x36\x7c\x60\x9f\x72\x31\x7c\x6e\x53\xdc\x88\xb5\xf4\x42\x28\x47\x23\xb6\x29\x7f\x71\x68\x03\x99\x98\xdb\x31\x98\x2d\x7a\x94\xb8\x9a\xf7\xba\x79\xbd\x69\xf6\xdd\x93\x30\xa2\xa0\x9b\x2b\x2e\x2a\xfe\x86\x96\xbd\xfc\xba\x17\x3c\x70\x4e\x7a\xea\x22\xa3\x4a\x66\x57\x48\x8e\xc5\xa3\xf7\x96\xf3\xe6\x6a\xe6\xa8\x3c\x77\xdd\xe5\x65\x83\xca\x4d\x7a\x1c\x0e\xbf\x87\xdd\xe1\x4a\x73\xf5\x3a\x73\x59\xf7\x6d\x63\x73\x06\x3b\xee\x6a\xd1\x53\x74\x31\xf7\x93\x28\xba\xd0\x1c\x1b\x6d\x7c\x4c\x1b\x1f\x9b\x71\x8e\x27\xdc\x2f\xc0\xf8\x2a\x3a\xef\x3a\xf6\x9c\x60\x5b\x22\xec\x3d\xe9\x59\xbe\x1b\x78\x34\x28\xe8\x08\x3c\x2f\x21\x25\xaa\x4a\x0a\x36\x9e\x14\x0b\xfb\x65\x15\x15\x78\xee\x39\xde\x06\x76\x22\xcb\xdf\x11\x6c\x7c\x9c\x0b\x4a\x7e\x3c\x0e\x3f\x86\xdd\xc7\x51\x7c\xf7\x71\xd0\x13\x81\x32\x82\x91\x0a\x3f\x4c\x07\xec\xe3\x8f\x30\x94\xf6\xc7\x7f\x94\xfd\xf2\x3f\x3e\xc6\x8f\x43\xf8\xc4\xd2\x8e\xaa\x36\xf4\xac\x95\x76\x21\xd9\xf5\x26\x8c\x83\x5d\x6f\x66\xea\xfe\x9c\xcb\xba\x70\x7b\x81\xb7\x83\x86\x45\xeb\x35\xbb\xaa\x1d\x7b\x54\x6a\x33\xe2\x04\xda\x3a\xca\xf2\x18\x32\x23\x17\x38\x0e\x1a\xf2\x17\xad\x3c\x11\x8f\x2c\x42\x7d\x35\x30\xe2\xf8\xec\xae\x6b\x85\x64\x86\x6e\x82\xfc\xa5\xda\xfc\x6d\x89\x18\x1b\x3d\x05\xb9\x18\xeb\x7b\x9e\xc2\xae\xce\xab\x52\x3e\x21\x0e\x71\x0a\x98\xec\xd5\xac\x58\x61\x75\xb4\x09\xec\x4a\xad\x78\xa7\xe3\xab\x7e\xf9\x6e\x50\xae\x79\x14\xb8\x7f\xe5\xca\x5d\xf3\xa1\x37\x57\xe5\x88\x3d\x89\x9d\x10\xd8\x20\xe8\x74\xf1\xcd\xaa\x40\x77\x4e\x8a\xad\x89\x0d\x4f\x83\x14\x78\xac\x2e\x72\x33\x37\x67\x55\x1a\xf2\x38\x73\xcb\x8f\xf9\x92\x32\x97\x6e\xe8\xc1\x6c\xc7\xea\x53\x2f\x73\xc2\x93\x0d\xec\x43\xbc\xb1\xe9\x24\x38\x63\x11\xbe\x68\x5a\x70\xee\x8f\xb5\x44\x58\x12\x78\xfd\x2e\x3e\x48\x2d\xf3\x48\x57\xe3\xbb\x69\xe8\x59\x41\xb9\x46\x6b\x85\xd7\xfb\x33\x43\xe8\xe4\x1b\xf2\xe5\x64\xc1\x38\xd1\xc7\xdd\x7b\xcb\xc7\x7b\xdb\xf1\x71\x65\xce\x86\x7e\x6b\x51\xf8\xbb\x0a\xd5\x9c\x1e\xd0\xc3\x39\x4c\xd3\x39\xe7\x98\x70\x72\x40\x8f\x8f\x34\xaf\x02\x28\xe5\x67\xa3\xde\x69\xda\xbb\xc7\xb0\x81\xae\xe2\xcc\x16\x1f\x24\x89\x3b\xfd\x22\x05\x02\xe7\x83\x42\xe0\xf0\xa0\x10\xb8\x6c\x90\x80\x5f\xde\xa9\x66\x52\x7f\x5e\xd6\xec\xd3\xb3\x83\xbf\x85\xd9\xce\xfb\x7c\x4d\x73\x3a\xf2\x9b\xaa\x29\x7a\xd6\xfd\x3e\x34\xc8\xee\x14\xb6\xe7\x27\xdd\x60\x7c\xc8\x0b\x78\xca\x91\x5c\x02\x75\x23\x69\x8d\x6e\x12\x5b\x57\x75\xaa\x5f\x52\xc5\x87\xeb\x5a\x38\xde\x1d\x29\xa7\x6c\x85\xa2\x1b\x56\x8d\x7d\xad\x7d\x5b\xc7\xbf\xc6\x11\xea\xe5\xfe\x1c\x5e\x55\x91\xf7\xb7\xfc\x08\x26\xf5\xfe\x59\xe4\x0f\xad\x1a\xf7\x42\x4d\x75\xe7\x59\xd0\x5f\x57\x54\xcf\x8b\x4e\xdd\x03\xe8\x0b\xa3\x89\x9f\xcd\x28\xbe\x9b\xa8\xbb\x2c\x2a\x52\x04\x9c\xa3\x24\x8f\x3f\xcf\xb9\xee\xab\xf6\xd8\xf0\xa2\xc2\x23\xfd\xdb\xb9\x35\xac\xe0\xc3\x57\x9e\x4d\xe9\xa7\xe3\xfa\x4f\xe8\x86\xff\x2c\x68\x2d\x9b\x81\x9b\x7d\x5e\x9d\xfd\x7a\xb6\x5a\x7f\x02\xbc\x48\x0f\xb4\x0c\x48\xff\x2b\x54\xaf\x32\xbe\x8f\xee\x73\xb3\x91\xfa\x6e\x18\x26\x13\x38\x23\x25\x5e\x58\xc9\x1f\xb1\xcb\x19\x99\x7d\x50\x35\xbf\x4b\x0f\xcc\x51\x01\xf9\xce\x5d\xe3\x17\xc4\x84\x52\x9f\xf3\xcb\x3b\xb2\xab\x75\x38\xf4\x6b\xa7\x82\x1f\x9e\x1a\xfd\x17\xfd\xd7\xbf\x68\xd5\xa3\x05\xce\xa4\x5c\xce\x3c\x06\x0c\x6d\x74\xbd\xe5\x7b\x45\xfb\x3b\xcb\xf4\x43\x08\xbb\xb5\x86\xea\xc8\x96\xac\xf0\xcd\x75\x4b\xef\xb7\xb2\x5e\x39\xa2\x0c\xf6\x55\xb3\x2c\x6d\xa3\x67\x41\xb2\x2c\x8a\x76\x8f\xf8\xb5\x4e\xd2\x1b\x4f\xbf\xc8\xaa\x72\x0e\xec\x20\x29\x1c\x0f\x1c\x8c\xd9\x30\x05\x13\x98\xda\xbc\xca\xe5\xbe\x53\x55\x30\x51\xf1\xfe\xdb\x81\xe6\xfd\x22\x88\x04\x0e\xe2\x2d\x28\xbe\x80\x28\x78\x84\xdc\x33\x4a\x2f\x11\x2a\x60\x7b\x34\xe5\x35\x27\xdd\xd6\x5b\xa8\x54\x82\x0a\xd6\x78\xa6\x23\x1d\xf3\xfb\x7b\x2b\x46\x76\x15\xd8\x5e\x33\x80\x98\x4a\x42\x51\x6e\xb5\x50\x1f\x00\xd8\xef\x26\x2a\xc9\x36\xbd\x7a\x80\xef\x7c\x28\x56\xe7\xcc\x57\x37\x33\xc3\xd7\x4e\x8c\x70\x28\x33\xb4\x54\x87\x86\x58\x94\x89\x29\x9d\xc9\x30\xb7\x9d\x5b\x75\xc8\xad\x02\x4d\x57\x5e\xa2\xf5\x4e\x13\xb2\xb1\x69\x0c\xa7\xbe\x2c\xaf\xf4\x69\x42\xe7\x8e\xdd\xf0\xa5\xa2\x8f\xe7\x7c\xfa\xfd\x2d\x8a\x57\xda\xc5\x55\xc4\x6e\x12\x53\xbe\x62\x58\xe5\x9f\xe7\x24\xb3\x64\x1a\xc5\xc0\x9d\xe5\xb9\xeb\xe6\x53\x3b\xd7\xc9\x76\xf8\x79\x9f\xbc\xf9\x73\xe3\x37\xbe\x08\x3b\xb7\x8e\x9c\x03\x4f\x68\x25\x51\x74\x75\x6b\x98\xd7\xbc\x4f\x1d\xbd\x94\x4d\xaf\xa3\x6c\x3c\x21\x95\x1c\x6f\x5b\x6d\x99\x11\xb9\xf2\x1b\x3d\xd1\xe6\x3a\x8e\x6c\xf7\xed\xc5\x56\xc6\xec\x5f\xed\x80\xea\x9c\x69\xd8\x8d\x87\x77\x76\x34\xf3\xe8\x49\x60\x77\x9a\xf4\x38\xb0\x77\x8f\xe9\xc0\xb7\xcf\xa9\xe8\x06\x77\x8f\x7d\x55\xfc\xc0\xb7\xab\x33\xc3\xa0\x66\xb0\x92\x5f\xde\x51\x0d\x96\x4f\x13\xfa\x41\x3b\x4d\x4d\x60\x29\xba\xa6\xab\xb4\x67\xba\x48\x23\xae\xde\x82\x39\x71\xdd\x0a\x39\xf4\xa7\x5b\x4e\xa0\x37\xe5\x64\x46\x31\x94\x42\x48\x7d\xeb\x78\xa0\x29\x20\x67\x2f\x4b\xe9\xa9\x32\xfa\x3b\x35\xf9\xd0\x6d\xe4\xaa\x3a\x93\x85\x3a\xd3\xf7\xeb\x2c\xa7\x2a\x94\xd5\xe9\x04\xfc\x6d\x6f\x64\x1b\xf0\x4f\x1b\x3f\x6d\x03\xf7\x67\x8e\xcf\xdf\x3a\xbf\xed\xb7\x9e\x18\xde\xd9\x21\xdd\x1b\xd9\x6b\x35\xda\x0b\xed\x40\x4b\x56\x03\xd6\xf8\x39\xa3\xb1\xc9\x11\x41\x0e\xbf\x98\xc1\xaf\x07\x6c\x6f\xa4\xf3\xdd\xfd\xb6\xa5\x7e\xb4\xaf\x94\x97\x8c\xac\x71\x89\xcb\x40\xff\x27\x7a\x87\xd3\x28\xd6\x9f\x31\x3d\x1f\xda\x82\x9e\x1e\xda\xfe\xac\xf8\x1c\x6f\xb7\x28\x7d\xd1\x3e\x5d\xcd\xd1\x10\x0a\x02\x56\x2c\x01\xd0\x4e\x20\xa8\xab\x12\x94\x25\xeb\xc3\x25\x0c\x17\x65\x2c\xad\x07\x95\xcd\x75\xc1\xe2\x43\xc8\x17\x72\x40\x07\xf8\xd2\xa5\xff\xe0\x9c\x1f\x0b\x74\xd3\x13\xba\xf2\x09\xe8\x27\xb5\x55\xae\x3a\x0b\x0a\x3b\x82\x5f\xfc\xd4\x00\x56\x2a\x7d\x30\x43\x18\x50\x9f\x4a\x81\x2a\x3f\x82\x1d\x69\x41\x27\x3b\xe2\xee\xb9\x57\x30\x7a\x4e\xd5\x75\xac\x40\x5c\x01\xb4\x4c\xc4\x1e\xdb\x6b\xfc\xd7\x41\xa9\xa4\xbe\x06\x0d\xa5\x3f\x79\x83\x0f\xb8\xd0\xf9\x0f\x80\x9c\xc6\x89\x40\x7b\x4c\x18\x9a\xcb\x21\x09\x0d\x3a\xe8\x27\x93\x94\x4a\x00\xe3\xdd\xaa\x97\xd9\x56\x11\x1a\x3a\x57\xd5\x5b\x0a\xf2\x16\xf1\xa6\x56\xd6\xc6\xd7\x50\x0a\xee\x45\xb9\x31\x6d\xac\x2a\xca\xaa\x8a\x3c\x2c\x56\x2e\x47\x8e\x01\x8c\xb0\xa7\xb2\xa6\x9d\x10\x62\x43\x1a\x91\x99\x50\x40\x4f\x64\x10\xaf\xb0\x08\xf1\x21\x74\x7c\xf4\xc2\xf5\x8a\x51\x01\x50\x0e\x62\xca\x7a\xe9\x7e\x9e\x53\x81\x40\xe3\x83\x25\x01\x7c\x09\x2a\x0c\xe0\x82\xbc\x65\x2e\x31\x53\xee\x17\x22\xc7\x42\x1f\x8b\x63\xa2\x6a\xc4\x91\x67\x92\xf6\x31\x29\x9e\x4f\xcc\x89\xdf\x9b\xd6\xa2\xe1\x03\x45\x88\x51\xed\x4f\x59\x6e\x28\x52\x8c\x46\x26\xfc\x99\x6d\x7e\xfe\x4a\x1c\xc1\x0f\x34\xdd\x2c\xcb\x21\x95\xe5\x28\x5b\xe4\x9b\x4b\xe4\x47\xf2\x36\x0e\xe7\xdf\x72\xdf\xde\x2b\xf2\x23\x08\x95\x3f\x04\xbc\x64\xf1\x3d\xad\x50\x36\xf7\xb4\xdb\x10\x25\x6b\x62\x3a\x15\xc6\x9c\x8d\xad\x8d\x7c\x16\xde\x69\x2b\x3b\xe2\xc1\x2f\xd8\x22\x2c\x8c\xa8\x44\x4b\x19\xf3\x36\xa0\x65\xfd\x48\xed\x21\x16\x46\xc4\x96\x45\x9f\x28\xa6\x7f\x5a\x2e\x7f\xdf\x31\x7a\x27\x15\x2b\xb9\xc7\x31\xbe\x6b\xf9\x8d\xfa\xec\x85\xcc\x48\xb9\x06\xc7\xee\x1e\x22\xaa\x34\x13\x35\x58\x01\xff\xdd\xb1\x82\xf7\x05\xfd\x5c\xb0\xd7\x19\x21\xf5\x80\xbd\x2a\xd9\x42\xc1\x02\xf1\xea\x2b\xd2\xc5\xb3\x6f\xd6\x45\x07\x89\xb1\x20\x84\x7e\xa5\x71\x6e\xbf\x4f\x38\xef\xec\xeb\x07\xcc\xc8\x37\x15\xde\x30\x4b\xf5\x82\xf9\xe2\x27\x80\x10\xa9\x6d\xe4\xc3\x1e\xa0\x21\xf5\xdd\xae\x87\x07\x99\xd0\x11\x7f\x9b\x39\x23\xd6\x91\xbc\xc7\x3a\xd2\x19\x69\x53\x40\xda\x80\x80\xf2\x83\x82\x53\x36\xe6\x31\x2c\x0c\x70\x09\xb7\xc2\x1a\x53\x9d\x13\x5f\x55\x13\x67\xc4\x76\x85\xc6\x71\xaa\x25\x1f\x5d\x40\xe7\x18\x0e\x91\xd8\xee\x71\x8e\xc4\x06\x6c\x18\xd6\x31\xef\x2a\x7c\xe6\x8c\x59\x1a\x94\x4a\xa6\x91\x3b\x69\x41\x04\xf0\x7b\x23\x76\xc9\xd7\xaa\x19\x51\x36\xe1\x55\x67\xb2\x3d\xc0\xd1\x38\x93\x72\x99\x40\x4f\xd8\x11\xde\x15\x69\x0c\x1a\xea\x6b\x42\x76\xe4\x4e\xbc\x19\x71\x52\xbc\x06\x86\x59\xb1\x74\xe6\xaa\x87\x7d\x1e\x13\xb7\xef\xd1\x11\x6b\xc6\xfc\x6d\x46\xaf\x9f\x2d\xf8\x04\xac\x13\x95\x27\xe5\xad\x19\xc1\x24\x3d\x41\xba\x67\x2a\xea\x12\xcd\x3a\x9f\xf4\xac\x11\xed\xb9\xbd\xc0\x23\xce\x84\xab\xa3\xf1\x61\x84\xe1\xe9\xb4\xea\x8c\x17\x9a\x84\xe6\x76\x3d\x47\x99\x2c\xba\x6a\x59\x13\xaa\x93\x8e\xbd\xf5\x31\x1d\x11\x07\x01\x58\x8f\x38\x48\xea\x8d\xc8\xec\xf9\x44\xa0\x0f\x80\xf1\x89\xc0\x6b\x77\x05\xda\xd4\x04\xc4\x66\xf8\x10\xd5\xe3\xb1\x3b\xf1\xa8\xe0\x3d\x25\x8c\x18\xf1\x1e\xfb\x75\x2f\xa8\xcf\x55\x0b\x7a\xc7\xf8\x66\xc7\xe0\x76\x78\x55\xbb\xad\xbb\x3e\x2e\x0b\xa2\x76\xc8\x0b\x8f\x28\x4c\xd6\x28\x73\x1f\xc3\x55\xd6\xec\x00\x26\x85\x6d\xdd\x5c\xad\x8d\xa0\xd1\x17\x5d\xde\xe0\x15\x65\x3c\x4b\x43\xa5\x58\xb5\x1f\x19\xa8\x94\x98\xb0\x82\x4a\x34\xe5\x51\x39\xa6\x5d\x1e\x95\x81\xb4\xc2\x93\x50\x45\xa7\xea\xc5\x23\xa2\x2c\x6f\x04\xc6\xec\x86\x7e\x46\x13\xb8\x03\x8f\x8e\xb9\xef\x0e\xbc\xdc\x5a\xc0\x58\xa5\x4e\xb2\x13\x32\x2a\x9e\x90\x31\xa1\x63\x34\xfb\x07\x27\x03\x8e\x87\x33\xce\x77\xf8\xc8\xec\x70\xcc\x3c\xb7\xc9\xcd\x46\x56\x9a\xd9\x3d\xc0\xc5\x0b\xfb\x7e\x02\xfb\x7e\xa4\xf7\xbd\xd9\xeb\xd7\x01\x34\x76\xfd\x6c\xc1\x27\xd5\x56\x30\x7b\x34\xa1\x30\x7f\x14\xb1\x0c\xc1\x6c\xf3\xbb\x4f\x1f\x4f\xe8\x06\x1e\x97\x3c\x07\x9c\x18\x1d\x8d\xef\x52\xe7\x0f\xcd\x1e\xaf\x3a\x7b\xdb\x13\x75\x68\xf6\xca\x65\x52\xdd\xde\x2b\x95\xac\xa4\xcc\xbb\x84\x8e\xf3\x03\xf4\x62\x4b\xfa\x6a\x27\x74\xfe\x20\x41\xb9\x3d\x38\x48\x1f\x4e\x7a\x00\x08\xd4\x8e\x4f\xca\x3c\x75\xd0\xd0\xe6\x98\xcc\x66\x7e\xbe\x30\xf8\x4a\xd0\x01\xb4\x36\x9d\x5a\x31\x4f\x2a\xf1\x4a\x32\x46\xb0\xce\x39\xe7\x83\xfd\xba\x5f\xe6\x41\x25\xb6\x55\xb8\xd3\x2c\x95\x2c\xbf\xac\x2f\xd0\x82\x4a\x0c\xcc\x84\xde\xf9\x6a\xb1\x23\xb3\xd8\x63\x1e\xe1\x3a\x17\x9d\x41\x71\x1f\x87\xe3\x0e\x76\x3d\xf6\x5a\xe6\xbe\x93\x19\xc9\xcd\xad\x86\xaf\x86\xc6\xad\x79\x17\x76\x05\xdc\xa0\x29\x35\x74\xb1\x71\xec\x91\x19\xac\x71\xc1\xf8\x68\x58\x7c\xd6\x89\xf7\x2e\x81\x2d\x9d\xdf\x4b\xb5\xc5\xdb\x86\x96\x52\xd6\x49\x93\xf0\xd5\xf6\xe9\x43\xa7\x6b\x57\xd1\x3b\x4b\x95\x73\xbf\x5e\x90\x9f\xd8\x09\xbd\xf6\x6d\xd7\x9b\xe1\xc3\xb4\xd9\xf2\x40\x1a\xf3\xb8\x58\x5d\xa2\x66\x0e\xf1\xb7\xd5\x05\x75\x6d\xc7\x77\x03\x38\x05\x85\x83\xfb\x7d\xa1\xe0\x0a\x0a\xb3\x40\x3b\x04\x15\xc1\x6e\xf6\xd7\xe1\xec\xd6\xb6\xe1\xb3\x1e\x6e\x58\xf0\x5b\xa9\x11\xbb\x4a\x63\x6e\x05\x15\xcb\x02\xaa\x61\x1d\x45\x92\x11\x21\x1b\x9b\x88\xb6\x16\x26\x21\xa3\x7c\x61\xa3\xc4\x8b\x8f\xe0\xc8\x9b\x98\x5b\x38\x31\xbf\xac\x33\xe2\xc4\x40\x39\x45\x4e\xe7\xde\x4a\x60\x42\x0a\x30\x29\x7f\xd4\xb8\x44\x02\xe5\xd0\x48\x5f\x36\xb3\xfe\x83\xdb\xf7\xd6\xad\xcd\x8a\x82\x3b\x1b\x9b\xda\x4b\x4c\xb8\x2d\xb5\x24\xc4\xf5\x1c\xc1\x8f\x71\x92\x8a\x36\x23\xae\x35\x31\x94\x4f\xe4\xde\x7f\x8c\xd8\xf3\x8e\x68\xb0\xa7\x64\x63\x66\x9a\x89\x41\xf3\x55\xda\x5d\x38\x48\xb4\xc7\xab\x4e\x4f\xc1\xee\x5e\x6e\xf7\x3c\x70\x7b\x1e\x1d\x65\xb0\x6c\x90\xc3\x32\xdf\xed\x79\x95\xa8\x62\x55\xb7\x7b\xf5\xd8\xae\x12\x5a\x03\xd0\x56\xdd\x1e\xe1\xee\xab\x8f\x10\x17\xd9\xe7\x54\x63\xc4\x31\x96\x42\x44\xb8\x87\x9c\x58\x5a\x8e\xe8\xab\x5d\x35\x30\x60\xa2\x60\xc0\x78\xe6\xd1\x06\xc0\xac\x06\x00\xc8\x01\x00\xc8\x46\x0e\x20\x07\xef\x00\xc8\x71\x7d\x6f\x19\x48\x56\x69\x77\x09\x48\x8e\x00\x48\x0e\xe6\x80\x64\x43\x81\xb0\x86\x86\x95\x8d\x1c\x18\x0e\x56\x03\xc3\xc6\x7b\xc0\xf0\xfa\xd9\x6a\x14\xc0\x6c\x4a\xbb\x73\x60\xf6\xa4\x67\x35\xe8\x40\x03\x35\xa5\xe6\xe4\xa4\x65\x3e\x29\x47\xe5\x78\xe6\x1b\x3a\xdf\xf9\xa0\xcc\xef\xa4\x95\x78\x0e\x74\x85\x15\xb9\x12\x74\x85\x15\x59\x00\x5d\x6a\x11\x13\xb3\x88\x0d\x9e\xc0\xfa\xfd\x16\xd8\x31\xd8\xe6\xb4\x91\xfb\x85\x2b\xfb\x84\x36\xcc\x61\x78\x29\x40\xb1\xc2\x4e\x3f\x3e\x59\x32\x73\x56\xd8\xea\x2b\x76\x98\xa9\xe3\x6a\x9e\x8a\x35\x15\x18\xd1\x81\xb4\xe6\x18\x41\xd8\x17\x65\x49\x53\x7d\x7a\x7c\x8a\x96\x22\x93\x4a\xea\xa0\x18\xcc\x4a\xcb\x3c\xbb\xcf\x7f\x03\x58\x96\x22\xd0\x4a\x3c\xf5\x0c\x32\x7f\x9c\xbd\xe4\x84\xe3\x26\x74\x6a\xd5\x6d\xee\x3b\x24\x28\xf3\x9b\x90\xfa\x1b\xbc\x56\xcd\x7d\x19\x9f\x4a\x2b\x28\xdf\xf7\xcb\x01\x15\x4c\x7e\x83\x6e\x14\x24\xa0\xb7\xad\xa2\x3e\x8e\x92\xfb\xed\x1a\xe9\x7d\x4b\xf3\xec\xe7\xfa\x6a\xce\x88\x8c\x3f\x05\x46\xa6\xde\xbc\x57\x83\xfd\xae\xf5\xf7\xb4\xe4\xe8\x87\xfa\x09\xff\x89\x9b\x0a\xb3\xf7\xd0\x28\x09\x71\x7e\x21\x2c\x80\xe8\xc4\x57\x52\xe9\x1f\x77\x74\xef\x48\xd0\x0b\x88\x4b\x13\x7e\x05\x71\x67\xfb\x10\xea\x3d\x70\x14\x18\xff\xd8\x57\x4e\xd3\xd5\xc5\xfa\xe6\xba\x25\x60\x2e\x05\xbe\x93\xaf\x6d\x7c\x26\x68\xac\xe1\xb1\xad\xaa\x13\x13\x41\xbf\x1f\x09\xfa\xeb\x00\x62\xaf\x63\x25\x10\xef\xef\xa3\x3c\x5c\xb0\x5e\x5f\x45\x1c\xec\x0a\x08\x9e\x4c\x54\x29\x79\x4c\xbb\x91\xa0\x7b\x77\x10\xd9\xfa\xa2\xf2\x04\xcf\x98\xe7\xb4\xa9\xa4\xe1\x93\x06\x84\x6e\xbf\xa8\xd0\x43\x53\xb9\x88\xbb\xfd\x82\xef\x83\x4f\x9b\x4e\xc0\x7b\x5d\x2b\x00\xbe\x05\x08\x7b\xbb\xd7\xb5\x24\xa9\x3f\x62\xd4\xcd\x83\xa5\x62\xa9\x54\x3f\x01\xfb\x19\x12\x5b\x05\x94\x30\x4d\xb0\x93\x53\x1e\x38\x82\x0d\x63\xc1\xaf\xa1\xf9\x46\x83\x9e\xe3\x18\xbe\xa8\xf0\xed\xbe\x0a\xdf\x00\x39\x7c\x72\x3a\x9d\x9e\x3b\x81\x9a\xae\xd6\xb1\xb6\x6f\x8e\x63\x69\xec\x0a\x7a\x75\x45\xef\x8f\x88\x23\xd5\x45\xc5\xf5\x71\x7e\xe5\xf1\x61\xe9\xce\xc3\x58\x46\xcf\x2f\x3c\x6e\x7a\x96\xa0\x0a\x1e\x05\x00\x8b\xe4\x3b\xec\xc8\x60\xff\x5d\x99\x9a\x60\x67\x4d\xd5\x9d\xa7\x7e\xd6\x1d\xc1\x7e\x06\x6a\x6a\x5f\x71\x75\x4e\x86\x2a\xd4\x1a\x0b\xaa\xfc\x02\xb7\xf5\xd4\xf7\x95\xfa\xb1\x23\xd8\xcb\xbd\x8a\x79\xc6\x12\xdf\xf5\x18\x2f\xc6\x82\x9e\x1f\x09\xea\xef\xeb\x3d\x29\xff\x69\x7c\xd1\x9d\x04\xfa\x5a\x54\x68\x2e\xaf\x54\xb2\xd6\x04\xfb\x15\x01\xb7\xfc\x4b\xd9\xd7\x5a\xe3\xca\xd0\x39\x29\x68\x97\x1f\xb5\x9b\x1f\x3b\xc5\x97\x27\x1f\x1f\x1e\x65\x98\x7e\xec\x0c\x3e\x3e\x76\xd3\xd7\x8f\x83\x51\xaf\xf7\xd8\x1f\x86\xf2\xe3\xf3\x5d\xd8\xfd\x28\xd2\xf4\xa3\x7a\x83\xf2\x51\xf4\x73\x55\x77\x7c\x20\xfe\x0f\xe2\xcc\x6e\xf1\xaa\x20\xfc\xe7\x3b\x8e\xd2\x47\xad\x99\xa3\xb2\xec\x4d\xde\xbb\xcb\xf8\x31\x73\x3e\x9c\x0a\xeb\x76\xf1\x66\x24\x7f\xac\xc7\x7e\x38\x27\xd9\x4d\x42\x41\x9f\xfe\xf5\x1b\xec\x31\xf5\xfd\x02\xdf\x4a\x0a\xab\x3c\x2a\xf9\x8e\x36\xee\x1f\xae\x71\xde\x3b\x2a\x95\x42\xb4\xf0\x5f\x17\xe8\x59\xb4\x18\x79\xdd\x40\x79\xed\x26\xb1\xa5\x79\x28\xf1\x5d\xbd\x9d\xc4\x3b\x3f\x9c\xee\xe6\x93\x47\x33\x5b\xff\x00\x10\x70\x74\x27\xa2\x98\xae\x5d\x88\xb1\xe7\x6f\x16\x71\x26\xba\xc3\xec\x7b\x34\xd7\xe7\x1f\x78\xe1\x1a\xed\x7a\xe6\x99\x60\x60\x60\x8b\xa1\xa0\x22\x13\xe1\x46\xf8\x32\x54\xcb\x6c\x9b\xf7\x26\x43\x62\x22\x74\x06\xc9\x7d\xed\x3e\xbb\x8e\x35\x6b\xac\x98\x66\xd2\xba\x4f\x00\xf8\x4c\xa3\x54\x5b\x61\x90\x82\x28\xe3\x07\xe2\xc5\xda\x54\x90\x27\xd4\xac\x14\xd0\x10\x73\x09\x81\xe6\xb9\x48\xa6\xd4\xa3\x13\xe2\x2c\x61\x30\x9f\xa0\x90\x89\xcf\x7a\x0f\x04\xd8\x4b\xd7\x73\x46\x19\x11\x7b\xd1\x40\x2a\x76\x93\x7e\x00\xd0\x3f\xa8\x6c\x02\xab\x90\x27\x8b\x13\x45\xe4\x22\x62\x90\x02\x12\xab\xdb\xa9\x26\x85\xf3\x6c\xad\x63\xcc\x16\x96\x37\x0d\xd9\x8b\xb7\xd6\x9c\x7f\x3a\x2e\xde\x53\xeb\xb9\xa4\x03\xae\xc7\x3d\xe6\x11\xbb\xdc\xa7\x13\x7e\xdd\xb2\x22\x3a\xa6\x03\x42\xf7\x78\xcd\xc1\x7b\x1e\xf6\xf0\x75\x3a\x85\xbf\x3b\x7b\xa4\x54\x9a\xb8\xc7\xde\xf6\x58\x0b\x01\xf7\xe8\x98\xdf\xdf\x5b\x63\x3a\x41\xa9\x48\xa1\xb8\x33\xe0\x7b\x05\x87\x7c\x03\xa7\x5c\x8e\x48\xde\xcf\xe3\x03\xec\x67\xa0\xfb\xd9\xc3\xe1\xce\x12\xe8\x67\x71\x38\x07\x4d\xcc\x66\x56\x16\xef\xb1\x75\x91\x58\xcd\x90\x6a\xa2\xe6\x44\x7a\x32\xd0\x50\xd3\xbb\xf3\xd1\x55\x85\x12\x7e\x73\x69\x8d\x60\xcd\x15\x97\x15\xf2\xc4\x15\x27\x9e\x5b\xf5\xa6\xd3\xaa\x93\xf2\x04\x76\x05\xfa\x71\xeb\xfe\x79\xbb\xa4\xea\x52\x28\x1b\x66\x37\xef\x43\x58\xe6\xa9\x1b\x79\xba\x88\x62\x0c\x11\xaa\x76\xd1\xc7\x20\x7d\x31\x46\x37\x5e\xed\xd0\x50\x89\xaa\x56\x60\x11\x55\xa9\x81\xcf\xbb\x40\xd2\x49\xfb\xdc\x91\x3c\xd1\x36\xc5\xb1\x63\x55\x94\x5c\x99\x3b\xa5\xef\x11\xbb\xd9\x47\xaf\x98\x34\xe0\x61\x59\xba\x55\xaf\x12\xd0\xb0\xcc\x8f\xee\xdd\x5f\x81\x67\x29\x6b\x91\xfa\xca\xe7\x7b\xc4\x3a\x3d\x4b\xbf\xae\x0d\x70\x28\x81\xf4\x80\x48\xc7\x0e\x01\x4a\x0d\x78\xa2\x6c\x91\xef\x89\xbe\x6e\x2e\x50\xcd\x85\x65\x94\x27\x53\xe5\x27\x6a\x3f\xb5\xc2\xca\xdc\xea\x2c\x57\x47\xcd\x41\xed\xf4\x2c\x1f\xd1\xf5\x77\x91\x9d\xee\xbd\x67\x24\x13\x9a\x9d\xec\x38\x43\xcc\x8c\x68\xf8\x28\xff\xb9\xfa\xa1\x32\xeb\xee\xea\x1e\x9c\x8d\xf4\x7b\xa6\xcd\x1d\x9f\x1d\x5a\x64\xa5\x26\x8c\x7e\x1b\xf4\x31\xee\x8c\xc3\xee\xc7\xe1\xe3\x47\xd9\x17\xcf\x1f\x87\x77\xe1\xc7\x7e\xf8\x34\x0a\x07\x00\xd8\xf1\xdd\x20\x40\xef\x4e\x64\xe9\xc7\x29\x08\xbf\xce\x8e\x48\x91\xe0\x02\x3a\x9c\x0b\x76\x66\x91\x4a\xcd\xa9\x6e\x73\xe1\x88\x4a\x45\xe9\xa1\x08\xe2\xf8\xec\x1a\x70\xfe\xcc\x90\x50\xfe\x9c\x4f\xd3\x22\x9f\xa3\x75\xae\xa6\x53\xcb\xe7\x12\x35\x5e\x14\xbd\xe9\x1b\x9d\x6e\x31\x9d\x5a\x02\xb8\x42\x1f\x08\x60\x54\x86\x6d\xaa\x36\x0c\x0f\x56\xf6\x73\xc1\xaa\xb6\x0c\x2e\xd0\xe6\xb8\x3f\x67\xd3\xab\x78\x5d\x22\xd8\x0f\x1a\xf0\xf8\xd1\x12\x38\xb6\xa7\x26\xf5\xdd\x3e\x9a\x04\xc8\xe2\xba\x10\x07\xd4\x55\x98\xc7\xf5\x4c\x5c\x94\xc7\x3d\x9a\xb2\x71\xd1\x86\x8b\x59\x24\x48\x52\x50\x90\x06\x18\xa8\x40\x05\xeb\x0a\x02\x56\x32\xfd\x93\x8f\x6a\x50\x3b\x41\x5d\xd8\x96\x28\x6f\xae\x07\x64\xe3\xb3\x32\x63\x13\xf1\x53\xd4\x73\x09\xb0\x19\x1a\x03\x4e\x53\x03\x8f\xdc\x57\x8f\x46\x2c\xec\x4a\x65\xd8\x28\xec\x4a\x1a\xf3\xa8\x12\x38\x62\x75\x57\x76\x8b\x5d\xd9\x85\xae\xf4\xff\x9b\xae\x38\x21\x76\x25\xc4\xf3\xbf\xeb\x41\x8c\xd4\x5d\x09\xb3\xb7\xe9\x90\x0b\x3f\x1c\x9f\xed\xf2\x37\xd4\xf7\x0b\x68\x1f\x15\xf9\x22\xad\xee\x17\xd3\xe1\x63\xcf\x96\xd4\x7f\x1c\x0e\x1f\x1f\xec\xd0\x28\xfa\x85\x95\x39\xa5\xfb\xdf\x05\x9d\x9a\x02\xd5\x70\x56\xd8\x3e\x05\x2b\x99\xc5\x4d\xa5\x8e\xc6\x4f\xa3\x6a\x37\x90\x78\x44\x64\xcf\x7a\xeb\x89\xe1\x30\xec\x77\x6d\x61\x54\x5a\xa2\x81\x30\x84\x7c\x38\x10\x5c\xce\x86\xc2\x3a\x43\xe5\xcc\x79\x69\xc2\x86\x3e\x6f\x3f\xe7\x6c\xff\x0c\x24\x3b\x0f\x2c\x41\xca\xd6\x20\x2c\x5b\x9b\x3b\x4a\x17\x56\x90\xba\xa9\xdb\x36\x35\x13\x52\x54\x9b\xfb\xd4\xb2\x32\x05\x4b\x81\x9d\x6b\x88\xa1\x36\x71\x10\xa7\xd6\x61\x44\x66\x9f\x94\xa6\xc7\xbc\x7b\x4e\xed\xc9\x44\x68\xe7\x25\x71\x6c\x0b\x7e\xfb\xc8\x6e\x9b\xbb\x97\xff\xde\x6f\x9d\x9e\x16\xbd\x96\xfc\x8c\x6c\xc1\x3b\xbe\x28\xc6\x1d\x47\x85\x02\x67\xe7\x3f\xae\x0e\xff\xbd\xbb\xb7\x77\x59\xcc\x32\x82\x2c\x27\x8f\xee\xae\xf4\xd8\xaf\xc3\xf3\xcb\xab\x7f\x37\x76\xaf\x9a\x0b\xae\xa6\x56\xe4\xb8\x3a\x3a\x6b\xce\x8a\xd3\xed\x17\xa7\x9b\x0e\x3b\x0f\xe1\xef\xc7\x6e\x08\x84\xf1\xcc\x19\x0a\xeb\x53\x6b\x71\x8e\xcd\x7c\xb8\xe7\x01\x1e\xf0\xe5\x89\x36\x39\xe6\xe6\x52\xb4\xcd\x5c\xb6\x3e\x17\xee\xd9\x47\x4d\xa0\x2b\xd4\xfd\xee\x8d\x5a\xbc\x54\x3f\x28\x8d\x4f\x95\x1a\x6e\x6e\x53\xb8\x9d\x79\x2e\xfa\x9c\xf3\xc7\x22\xcf\x10\x64\x19\xe2\xd3\x62\x06\xd1\x86\x45\x4a\x57\x68\xd9\xa4\x13\x2e\x8a\x23\x28\x02\xc0\x1f\x73\x12\x33\x27\xe0\xbf\x2f\xad\xa7\x8e\xe5\x93\xba\x6f\x7f\x06\xa4\xe3\xfe\x6e\x59\x01\xcd\x74\xa8\x6b\x5b\x84\xde\xf7\x04\xfc\x23\x74\x21\x69\x93\xd0\xc3\x9e\x80\x7f\x8b\x49\xff\x22\x34\x78\x14\xf0\x6f\x31\xe5\x2b\xa1\xd7\x8f\x02\xfe\x11\xcf\x11\x30\x53\xc1\x8a\x31\xcb\x76\x06\x2f\x1d\x5f\x77\x71\x8b\xd4\xb7\xa0\x8b\x3e\x76\xd1\x9f\xef\xe2\x79\x44\xcf\x23\x6c\xcb\x9f\xef\xe0\x75\x44\xaf\x97\x12\xfe\x45\xa8\x78\x14\xf0\x6f\x31\xe5\x2b\xa1\x07\x11\x3d\x88\x4c\xe7\x96\xe6\x7b\xf0\xb0\x84\x0d\x0d\xd7\xbd\x77\x53\xd7\x47\x5d\x07\x89\xbd\x78\xf4\xd5\x48\xf4\x86\xd1\x27\xb5\xf5\xd9\xae\x7d\x2d\x08\x01\xa1\xcc\x79\x46\xbf\xb3\x51\x53\xbf\x16\x3d\xd5\x8a\x63\x93\x39\xc3\xb8\xe7\x4b\xb0\xe7\x69\x20\x8c\x00\x01\x06\x80\xa4\x83\xd9\x7a\x81\x7a\xc0\xe6\x98\x6d\x22\x55\x18\x00\xcf\xf9\x32\xe0\xd1\x9a\xb0\x3b\x30\x42\x03\x5d\x32\xa5\x93\xf8\x74\xee\x81\x56\x7c\xaa\x2f\x27\x84\x11\xe3\xa0\xf0\xa8\xa8\xa6\x2f\x08\xd9\x18\x37\x05\x29\xd7\x1c\xb9\x13\xd4\x2d\xc0\x25\x7a\xda\x65\x25\x20\xd4\xa0\xd7\x8d\x80\xac\xab\xb7\xf2\x59\x7a\x50\x91\x79\x3a\x60\x85\x80\xcc\x66\x5a\xf1\x2e\x7f\x03\xab\xc7\xbc\xe0\x27\xd3\xc4\x4a\xbc\x3e\x11\x3b\x3c\x64\xdd\x9f\xe4\x2d\xe0\xa1\xfb\xc3\x57\xd8\x5c\x79\xa1\x53\x57\xb2\xca\x5c\x8e\x99\x49\x05\x62\x89\x99\x30\xd4\xe3\xd1\xdf\x6c\xf0\xfa\xe0\x3f\xa6\x54\x66\x11\xa3\x41\xf8\x53\x48\xd9\xe9\xc6\xf5\x41\x68\x9f\x1b\x06\x2a\x9d\x28\xef\x32\xe7\x83\x7a\x50\x96\x65\x61\x8b\xb2\x2c\xe7\x9a\xdf\x7e\xfd\x2a\x2c\x07\x76\x50\x84\x2b\x61\x7b\xfe\xc5\x87\xe2\xde\x64\x41\xad\x53\xa3\x97\xa7\x17\x83\x41\x86\x23\xf3\xbc\xff\xdc\xe7\x05\xd9\xfa\xcf\x25\x45\x52\xd8\x60\xba\x81\xb5\x2a\xfc\x5f\x9d\xbb\x18\x8f\xda\x7f\xc8\x5f\x83\xff\x31\xff\xaf\x67\x2b\x6c\xaf\x56\x19\xcc\xf5\x27\x27\x08\x2e\x63\xff\xdd\xac\x7a\x60\x33\xe2\x60\x0e\xe6\xcb\xf7\x98\xf1\x73\x7f\xa6\xf3\xec\x3d\x2c\x83\xbc\x73\x7f\x4e\xb1\x30\x6e\x17\x34\xc3\xe5\xa9\x99\xb7\xe0\x14\xce\x43\xd5\x31\xb0\x4f\x27\x97\x75\x22\xec\x8f\xda\x36\x0f\x48\xc0\x6b\xf9\xd3\x34\xc9\x03\x37\x41\x99\x46\xc0\xab\xfa\x15\xbb\x74\x9f\xa4\x67\x75\xf7\x89\x53\xa9\xad\xf1\xb0\x1e\xf0\x44\x58\xd2\xbd\x0b\x3c\x2b\x2c\xd7\x08\xad\x55\x89\x1d\x22\x2f\xe0\x48\x9d\xb9\x15\xaa\xcc\x12\xf6\x57\x85\x87\x95\x5a\x45\x42\x95\xd9\x1e\xaf\x18\x9a\xf5\x3e\xcc\xc8\x82\x89\xe0\xd5\xd9\x35\x8f\x61\xdc\x4e\x43\xcc\xbf\xc7\xd0\x39\xca\xe5\x22\xac\x77\x8f\x3c\xa4\xdd\xaf\xd9\x45\xcc\x97\x33\x57\x2a\xcb\x99\x61\x7d\x56\x3d\xf4\x28\x68\xc8\x4d\xc4\xfa\xc2\x5c\x91\x75\xd3\x57\xfd\x22\xec\x3e\x04\xba\x66\x30\xd7\x47\x91\xb5\xab\x45\xc9\xa2\x62\x8a\x6f\xe8\xfa\xc8\xaa\xce\x7f\xe8\xbf\x5f\x0d\xbe\x02\xfc\x0f\xeb\xb9\x7e\xbf\x9a\xe6\x7f\x5e\x4b\x6e\x65\x63\x09\xd6\xa6\x39\xa8\x8d\xcd\x91\xcc\x35\x9e\x07\x92\x17\xdc\x43\x5f\xce\xdf\x55\xf9\xe6\x3e\x77\x5b\x19\x9d\x73\x2a\x95\xc0\x21\x9d\xc8\xfa\xa5\xf2\xb9\x41\xa5\x06\x9c\x6b\xf0\xe7\x77\x70\xbf\x16\xa5\xe7\x57\xba\x19\x1a\xea\xcf\x1c\xd2\x68\x30\xcc\x52\xc1\x3a\xbe\xe5\x93\x8a\xf9\x0c\x08\xd9\xb6\x64\x39\x9c\xf3\x4f\x7d\xb5\x78\xb7\x36\x90\x08\x30\xf3\x6b\x24\xc1\x46\x31\x0b\xc6\x56\x40\x05\x4b\x8b\x9e\x75\x5b\x79\xa7\xd0\xad\xa5\x60\xc3\x08\xbd\x62\x66\x81\xa5\x4e\x55\x8a\xe5\xef\xda\x8b\x32\x76\xd7\xd3\x2f\xf4\xfc\x05\xe8\x8e\x3e\x65\x90\xf5\xfb\x89\xfc\x81\x19\x12\xea\x15\xe9\x1e\x87\xa4\xe0\x9f\xbf\xc0\x96\x75\xda\xf3\xa6\x96\xf3\x27\x74\xae\xaf\x5e\xb0\x9d\xde\x03\xbb\xac\xe3\x02\x4f\x9f\x7e\xad\x58\xeb\x73\xa1\x9e\x9b\x12\xc7\xdf\xe6\x81\x43\x42\xe5\x19\x9f\x42\xc2\x13\x42\x8c\x9a\x32\x34\x85\xf6\x23\x91\xdb\x8f\xdb\x96\xdc\xa8\x55\x09\x81\xe3\x10\x10\xea\xaf\xf1\x10\x1f\x5d\xea\xb2\x05\xf3\x1c\x05\x7b\x67\xed\xa5\x4b\x82\x83\x13\xb3\xf1\x7a\x57\x66\xe3\x0d\x5b\x66\xe3\x1d\x7c\x36\xb8\xe0\xa5\xc9\x43\x47\xf0\xa4\x9d\x79\x0d\xf5\xb3\x00\x6c\x00\x5d\xc7\x84\x5b\x80\x82\x37\x74\x4d\xbd\x53\xae\xe3\xd7\x45\x25\x98\xdd\x23\xd8\xed\xf8\x7c\x85\xca\x50\x5e\xf3\xba\x2e\x52\xd1\x55\xcc\x1c\x55\x6e\x18\xcd\x83\x6b\xdb\x30\x12\xdc\xd2\x6a\xa8\x3d\x73\x00\x7b\x13\xaa\x7b\xad\x99\x8c\xaa\x2d\x34\x80\xbc\x63\x4d\x6a\x50\xf5\xc7\xa1\x62\x17\x6a\xb6\x09\xe6\xbc\x81\xca\xad\xc1\xd5\x4b\xb3\x5c\xa3\xb5\x0d\x53\xe7\x2c\xa3\xe5\x0a\xe6\xc9\xf4\x56\x33\x9d\x2a\xb6\x9d\xed\x50\xa0\x61\x7c\x62\x1a\x35\x78\x3b\x6b\x55\xeb\x55\xa9\xa6\x7d\x8a\x75\x54\x6a\x64\x03\x3e\x8a\x4c\x65\xba\x0a\xab\xcb\x61\xf6\x6e\xe9\xc4\xac\xe4\xf5\xae\x59\xc9\xab\x5d\xb3\x92\x27\x63\xae\x99\x34\x29\x05\x8f\x1c\x53\x98\xeb\xb2\x75\x4d\xe9\xc8\xe1\xc6\xa6\x1d\x69\x11\xaf\x94\x82\xd4\x43\xde\xbf\xb2\x6a\x74\x78\x65\xe9\xac\x15\x9d\x91\x90\x8d\x5a\xf3\xb3\x6d\x99\x92\x52\xa0\xcd\x65\x9d\x8a\x4f\xe1\x15\x8b\xad\x63\x28\x1c\x24\x6d\x99\xe5\x01\xf6\xd5\x8e\x36\xc4\xf3\xa0\x6d\xad\xdc\xc5\xc8\x7d\x15\xf6\xab\xee\xba\x16\x40\x35\x3a\x85\xb7\x15\x77\x31\x9c\x53\x5d\x01\x21\xc4\xf6\xb7\x79\xe5\xbd\xfa\x2a\x3e\xad\x08\x2a\x69\xf0\x5f\xd4\x48\x23\xbe\xb9\xae\x73\x55\x24\x0d\x0b\x21\x5d\xcd\x62\xfd\x11\x0d\xb3\xfa\x89\x2d\x76\x16\xfb\x63\x5a\x0b\xc8\x62\x79\x9d\x8f\xfa\xa6\x5b\xf4\x83\x2c\x54\xe5\x6f\xf3\xd5\x35\x49\xf2\xe7\x7e\x99\x7a\x2b\x22\xab\xb8\xd8\xc5\xc5\x69\xca\xbb\x51\xa5\xb5\x7c\xaa\xf4\x02\xab\xf9\xa9\x88\x85\xb9\x0b\xca\xe1\x06\x92\x2d\xeb\x08\x04\x08\xf5\x77\x78\x45\xd4\xff\x72\x84\xf9\x00\x61\x0b\xfd\xed\x41\x98\xbb\x89\x98\xcb\xed\x60\x76\xcd\x53\x24\x76\xae\xd9\x27\xff\x3d\x52\x50\x0e\x67\xce\x35\x0b\x83\xf7\xd2\xc7\x27\x90\xbe\xff\xf8\x5e\xfa\xf5\x2e\xa4\x47\xdd\xf7\xd2\xaf\x76\xf1\xd9\xe9\x02\xe0\x32\x8c\x4f\xe1\xcc\x91\xf9\x5e\x15\x6f\x53\x9e\xe3\x7a\xa5\x66\x67\x4a\x2c\x62\xdd\xdf\xd1\x63\x5f\xf7\xcd\xd4\x02\x22\x14\xc4\x16\xeb\xfe\x76\x9e\x56\x29\x24\xe6\x73\x2a\x88\x5d\xc5\x37\xb4\x2b\x81\xf0\x12\x2c\x50\x48\x55\x0f\xb6\xa2\x07\x45\x36\x36\x6d\xb1\x63\xf6\x61\x61\x47\x40\x1f\xb6\xb3\xad\x9e\x37\x3a\xbf\x69\x6c\x1d\x5d\x00\x68\x0f\xed\x8c\xa8\xba\x03\xae\xd3\xdd\xf3\x3d\xe3\x8f\xea\xd3\x09\xea\xf1\xcc\xd1\xb1\x0f\xff\x77\xe9\x58\x25\x7b\x44\xca\x53\x17\xdb\xd0\x5d\xcb\xd0\x6c\x5f\x03\xc5\xbb\x81\x70\x4d\xd5\x1a\x79\x7c\x3a\xf1\x94\x72\xce\xbb\x34\xad\xce\xb6\x3e\xba\x2a\x30\xc6\xd8\x17\x60\x83\x91\xa8\xc3\x2c\x17\xb1\x45\x76\x84\xb3\x92\xb8\x7c\x97\xd2\x35\x95\x0f\xff\x5c\xb9\x22\x34\xb6\xdf\xa9\xfd\xc3\xbb\x14\xf0\x9f\xfb\xfe\xb6\xa2\xf3\xc0\x3c\x57\xb2\x5c\xdb\x79\xe3\x15\x31\x77\x0e\xa0\xc0\xec\x4f\x64\x74\x77\x99\x9c\xb9\xcb\xcc\xd5\x9d\x6c\x1a\x34\x37\x78\x42\xf8\x71\x91\x99\x31\x37\xea\x0f\x67\x03\x4c\x78\x68\x5b\x6e\x8d\x6e\xd2\x2d\x8f\xcc\xba\x48\x69\x3c\x1f\xbe\x73\x53\x71\x52\xb3\x08\xf5\x4d\x69\xb4\xc1\x4e\x1c\xf9\xf8\x51\x5d\x5f\x00\xb3\x08\x44\x5b\xa7\x6d\xf9\x06\x74\xb1\x4f\xbe\x95\x01\x79\x16\x06\x16\xa1\x82\x50\x5d\xdd\x99\x1e\xb8\xa3\x6d\x05\x5c\x9a\x1b\xd5\xc1\x13\x2d\x90\x70\x77\xed\x42\xec\xcc\x51\x7d\x3c\xa9\xbd\xd3\xc7\xbb\x98\xed\x3f\x42\x37\xb3\x60\xd4\xc5\x4b\xe4\x56\xb1\xf6\x8a\x9e\x24\x20\xf0\xe5\x5c\x92\xa0\x9a\x9a\x3a\xd9\xd4\x62\x7a\xf1\x62\x49\x1a\x10\x23\xa0\x50\x07\xb9\x4a\x1c\xb9\xc3\x45\xa9\x24\xb7\xb9\x9f\x8b\x33\x14\xbc\x99\xcb\xb7\x5c\x5b\x80\x4e\xee\x8b\x6b\x7d\x36\x40\x0a\x78\xee\x39\xea\x63\x7b\x81\x49\x5a\x45\xab\xb6\x3f\x1b\x0a\xe7\x3e\x12\x86\xc4\x01\x32\xd4\xc4\x55\x74\x36\xb2\x61\xe9\xa2\x15\x5d\x19\x59\xa2\x51\x75\x82\x29\x32\xbb\xe6\x8f\x1a\x87\x2c\x80\x70\x4d\xa8\x2d\x93\x9d\xef\x83\x56\xb1\x4c\xd6\xfe\x09\xb5\xb4\x3f\xff\x19\xb5\xdc\x47\x68\xee\xe0\x7d\xdc\x76\x70\xf2\x67\xdc\xd6\xbb\x2a\x9a\x06\x2a\x8a\x39\x1e\xaf\xcc\x34\x37\x4f\xb4\xa3\x01\xe0\x34\xf4\x6b\xdf\x21\xd7\x53\xda\x3c\x51\x31\x49\x60\xde\x88\x0e\xaf\xf8\xf0\x4a\xcb\xe8\x7c\x83\x8e\x03\x2d\xaf\xee\x0c\xd7\x75\xa6\x02\x24\xcf\x95\xa1\xe6\xde\x01\x29\xe7\x06\x13\xb1\x21\x58\x67\x08\xdc\x5e\xad\xba\x8e\x11\x65\xc1\x9a\x27\x15\x7f\x1d\xe3\x37\x04\x7b\xbc\xc2\x07\x39\xb8\xfd\x6a\x45\x58\x8c\x56\xe4\xaf\x79\x0f\x97\x6f\x11\x9c\x9b\xf6\x0b\xc8\x2d\x31\x8f\x25\x83\x89\xa9\x45\xd3\xaf\x49\x50\x6f\x1b\xcd\x0c\xbb\xba\x63\xe2\x2a\x85\xc8\x19\x59\x8d\x8a\x92\xe0\xbf\x40\x45\x49\xb0\x12\x15\x7d\x58\x42\x1a\x05\xda\xa0\x79\x42\x83\x7c\xca\x85\x32\xe8\x68\x02\xdb\xb9\x44\x48\x4f\x3c\x99\x03\xaf\xb0\x6e\x3b\x02\x88\x0b\x95\x01\x1b\x74\xaa\xdb\x9a\x60\x4b\x82\x6c\xdd\x02\x2d\xde\x98\xd8\xd5\x1d\x61\x6e\xa9\x4d\x7a\xa0\x37\x34\xe4\xa3\x3e\xaf\x68\xe0\x6a\x30\x40\x2e\x04\x7d\xbc\x5a\x17\x1b\xc8\x40\x8c\x0a\x3d\xd6\xb0\x31\x09\xb4\x92\x60\x40\x2a\xfe\x7f\x28\xca\xf9\xdf\x9c\x88\x6d\x51\xff\x7f\x68\x1e\x14\x28\x7c\x6f\x22\x96\x50\xb1\x9e\x88\xff\x83\xe1\x2b\xf9\x91\xc8\xb6\x62\x36\x64\xdf\x0c\x39\xc3\xec\x88\xb0\x76\x32\x4c\x5d\xc0\xe4\x9a\x89\x03\xb4\xad\xa9\x7e\x95\xd9\xce\x67\x35\xc7\xeb\x99\x97\x9d\x9d\xc5\x56\x0b\x13\xe9\x67\x97\x04\x50\x66\x7b\x55\xa3\x73\xe4\x43\x3d\xcb\xbb\xd0\xa6\xca\x30\x5b\x58\x10\xff\x3f\x5e\x10\xbc\xcb\x37\x60\xef\xcf\xb2\xbd\xa7\x55\xbc\x79\x2e\xde\x1b\x48\x83\xb9\x46\xb1\xc1\x5c\xa9\x6f\x10\xd7\xef\x7b\xc3\x90\x3f\x3f\x8a\xbf\x43\xbf\x7c\x78\xfa\x33\x01\xf3\xfb\x7e\xa3\x56\x35\xa4\x01\x52\x33\xca\xa2\x7f\x0f\x48\x16\x01\xa1\x4e\xdb\xd2\x7c\x57\x2a\x0a\xc4\x4b\x2a\x14\xf1\xe2\x6b\xfd\x8c\xc0\x3d\xf6\xc8\x32\x7d\x12\x18\x4d\x30\xd4\x2b\x91\x3c\x70\x95\xa9\x8d\x2a\xe7\x3e\x72\x3e\x9f\xff\x50\x12\xa6\x01\x8a\x6c\x7a\xb3\x80\xcf\x2f\x88\xaf\x14\x59\x90\xd2\x08\xd6\x79\x86\x8e\x0c\xdd\xb0\xa1\xb2\xc9\x0a\xe0\x1d\xf9\x88\xce\xea\x0d\x8d\x85\x1b\xe2\xbf\x1f\xa7\x99\xa5\xc1\x13\x95\xdc\xf5\xe8\x9a\x55\xdb\xe1\x01\xfa\x7a\xd7\xef\x30\x09\x79\x43\x73\x20\xf8\xed\xe4\xca\xee\x35\x1a\x61\x46\x27\xdc\x8e\xd0\x8c\xc7\xaf\x13\x61\xf9\x14\xa7\x24\x70\x43\x8f\x4c\xa7\xba\x5c\x88\x6f\x78\xe5\x6c\x05\xfd\x17\xac\xa4\xff\x80\x40\xd2\x6b\xfc\x2e\x01\xa8\xe4\x96\xb5\xea\xba\x5e\xf1\x05\x8a\xb5\xa6\x29\xd6\x61\x91\x02\x35\x83\x5d\x2c\xbb\x6e\xf9\x95\x1a\xd9\xf0\x0d\x89\x9a\x0b\x59\xf5\x69\x7f\x7e\x14\x8b\x94\x9c\x3a\xe0\xf9\x89\xb8\x9e\x33\xaf\xf3\x3a\x31\xce\x0f\xea\xc2\xae\x39\xb5\xcd\x6d\x1d\x6d\x00\xaa\x1c\x0a\x43\x4d\xe7\x1c\xd7\xeb\x64\xa3\xb6\x99\xb1\xf8\xc1\x50\xa8\xfb\x17\x75\x7e\x1f\xe6\x95\x0f\xa0\x50\x15\xb0\xff\xb5\xb2\x4f\xf5\xce\xad\x84\x2e\xeb\x86\x81\x3a\xc1\x8b\x28\xbc\x30\xa3\x8f\x0f\x6e\x13\x67\x49\x98\xe7\xf5\xaf\x13\xd3\xb6\xfb\x5b\x2e\x5e\xf4\xff\x11\xcf\xeb\x12\x73\xf5\x56\x74\x9d\x2b\x6a\x59\x41\x00\x98\xa2\x5a\xc3\xa0\xb6\x38\x81\x2b\x5b\x98\x0f\x96\x6b\x9b\x15\x33\x93\xe4\x7f\x74\xf9\xff\xa9\x6d\x12\x3a\xb7\x1e\xc2\x48\x02\x45\xb6\x10\x8f\x0f\xee\x19\xf0\xe6\xfa\xb8\x3c\x3e\xb0\x41\x38\x6c\x5d\x7d\xdf\x1f\xa5\xe9\x6d\x28\xfa\x08\x3a\x9d\xf9\x34\x58\x19\xd8\x76\xf3\xb1\x87\x8f\xa3\xfe\xc0\xaa\x52\xfc\xef\x3f\x63\x69\x8b\x79\x90\xf7\xda\x5e\x8d\x67\x56\xdd\xd8\x2c\x95\x45\x1c\xf0\xdf\x60\x92\x22\x94\xbf\xc9\x6d\x69\x6a\x91\xc4\x8d\xda\x6c\xff\xb7\xef\xd6\x94\x44\xf6\x2e\xbb\x22\x7d\x5f\xc6\x70\xf5\xce\x2e\x7d\x57\x70\x30\x7a\xaf\xc4\x3b\x04\x88\x81\xd8\x82\x00\x7c\xf5\x37\x6a\xd5\x8c\xd2\x47\x0c\xca\xbe\x7c\xfe\xb2\xf9\xaf\x2f\x5f\xbe\xd5\xfe\x55\xfd\xbc\xb9\x55\xfb\xb6\xae\x04\xe2\xa2\x12\x6c\xfb\x15\x51\x0f\x6c\x9f\xfc\x19\xb7\xde\x6a\x33\x2f\x5a\xf6\x19\x24\xdc\xad\x35\x3f\xd3\xad\xe6\x67\x5a\x6b\x7e\xa1\x35\xf8\xf8\xdc\xfc\x42\xbf\x36\xbf\xd0\xcf\xcd\x2d\xfa\xb5\xb9\x45\xff\xd5\xdc\xa2\xb5\x6f\xcd\x2d\xfa\x19\x42\xb5\x2a\x7c\x6e\xd6\xe0\xfb\xcb\xe7\xcd\xe6\x16\xfd\xf6\xf5\x0b\xe4\xac\x7e\xc1\x84\xaf\x9b\xff\xfa\xe7\x97\xaf\xcd\xcf\xf4\x9f\xdf\xbe\xfd\x6b\xf3\xf3\x37\xa8\xb0\xb6\xb5\xf5\xf5\x5f\x5b\x9b\xcd\xcf\xfa\x09\x48\x10\x2d\xa2\x5d\x23\x3f\x35\x1d\xc2\xf6\xbf\xfe\x9f\x54\x7e\x73\x62\x0c\xf6\xdc\x5f\x69\xb2\x28\xca\xc4\xd3\x41\x82\x08\x47\xe1\x84\x4d\x93\x8c\xbb\x55\x2b\x68\x3c\xe9\x93\x3b\xd8\x2c\x6b\x46\x58\x73\xbd\x83\x4d\x62\xac\xb5\xdd\x36\xb8\xa9\xcd\xfc\x2a\xcb\x58\x85\xe6\xcc\xa1\x0d\xa4\xae\xf0\xb6\xb1\x6e\x92\x95\xe4\x42\x91\x6a\x4f\x59\xb2\x6e\x2f\x90\x9a\x4b\xbc\x6d\x40\x83\x7d\x7d\xb9\xb3\x59\x7c\x2a\xd6\xcf\xf4\x91\x86\x9b\xbc\xc6\x01\xa2\x7f\xe1\xdc\x77\x36\x39\xf7\xeb\x02\xcf\x95\xfd\x39\xfb\x16\xa6\x83\x76\x4d\xc5\x0d\xef\x79\xcd\xfe\xa2\x48\x02\x0c\x09\x68\x6c\x76\xcd\x6f\xff\x1a\xec\x0f\x37\xd5\x01\x1f\xde\x67\xc3\x39\x32\x10\x24\x9b\x90\x09\x2a\x66\x2f\x1d\xa8\x4e\x64\x89\x6d\x3d\xa9\x86\x8e\x31\xe3\xab\x11\xb3\x8a\x5a\x36\xa4\x14\x45\xcc\x94\x2c\x66\xff\x62\x6c\xc2\xe4\xdd\x40\x6e\x5b\x47\x2a\x9a\x22\x9f\xbb\xec\x9e\xa4\xd0\x43\x87\xac\x84\x30\x90\xa5\x52\x29\x0c\x63\x99\x7d\xc2\x71\x98\x6d\xf2\x87\x81\xbc\xfa\xf9\x48\xcc\x92\xfe\xf5\x38\xb0\xd4\xea\x81\x7c\x26\x8e\x69\x78\xd5\x40\xe6\xa1\x1f\x64\x29\x97\x0b\x03\x59\x02\x3e\xf9\x7a\xc4\x4f\x4b\x33\x5c\x18\x47\x73\x71\x41\x3a\xcb\xd9\x57\x0c\xa4\xf9\xa7\x71\x68\x19\xc1\x04\x30\xc9\xf6\x9f\x46\xb4\x90\x56\xae\x79\x15\xb1\x6d\x24\x29\x85\x32\xda\x8c\xd2\xaa\xe5\x2c\x2e\xe6\x4a\x2c\x33\xdc\x34\x70\x51\x1f\x4e\x6a\x4c\xf3\x0e\xef\x75\xbd\x7a\x9f\xeb\xe8\xfb\xab\x52\x29\xdf\x5d\x06\x88\x41\xdb\xb9\x15\xb7\x1c\x34\x94\x4a\xd6\xe2\x34\x19\x20\x41\xe7\x9a\x5d\x0d\xc4\x57\xe2\xba\x42\x97\x15\x95\xae\xbb\xcb\x0d\x38\x29\x95\xcc\x18\x74\xd7\xf3\x1e\x7f\x2e\xf4\xb8\x52\xa1\x15\x93\x11\x16\xc3\x5a\xbd\xfe\xe6\xd4\xd2\x62\x9b\xab\xba\x9b\xa3\x9c\x41\x5b\x99\x85\xc1\x4b\x77\xc0\x3f\x6b\x55\x42\xf4\x5e\xd2\xc5\x32\xb8\xbe\x23\xea\x0a\xd4\x73\x2e\xea\x46\x20\x4c\x3f\x7f\xd9\xfa\xda\xdc\x52\x2a\x7c\x28\x21\xc6\x2f\x20\x8a\xb5\x96\x5a\x56\x7e\xce\x0d\xe4\xef\xdc\xf5\x53\x17\xbe\xcc\x56\x0d\x5f\x84\x66\xb1\x32\xa2\xd7\x37\xa4\xa0\xe0\xe7\xe5\x61\xdb\xf2\x15\x89\xa6\x94\x8d\xe8\x17\x63\xee\xc3\xd7\x44\xac\xe4\xbe\xfb\x43\xc2\x57\xc8\x6b\x6b\x5c\xd2\x88\xfb\x6e\x27\x54\x0f\x71\x7c\xf7\x0e\xbf\x12\xee\xb3\x18\xe9\xb4\x5f\x61\xf0\xd8\x95\x03\xe4\x11\x4c\xdc\x59\x27\x4d\x3b\x83\x2c\x21\xe5\xd5\x35\x1e\x21\x5f\x14\xe3\xdf\x04\xff\xfa\x5a\x93\x2f\x98\x4e\xc3\xe9\x34\x25\x40\x3d\x5f\x85\xd0\x43\x2b\x28\xd7\x4c\xff\x36\xd5\x53\x63\xcc\x50\xe6\x57\x21\x15\x65\x3e\x6c\x5b\x32\x4f\x4e\x01\xc2\x97\xf9\x75\xa4\x93\xa2\x2c\x09\x22\x42\x13\x1d\xaf\x8e\x4e\xe6\xa2\x5b\xa6\x7e\x5f\x47\x7f\x26\x05\xfb\x3d\xf9\xf4\x8f\xda\x45\x9d\x95\x73\x2a\xf3\xe9\x96\x66\xba\x8d\x0a\x97\x9a\xd6\x88\x4b\x3d\xad\x31\x97\x7a\x3e\x13\x2e\xf5\x7c\xa6\x5c\x2e\xcd\x67\x37\x8b\x5b\x98\xcf\x80\x07\x65\x9c\x82\x85\x75\x54\xba\x25\x71\x6c\xf6\x42\xe0\x40\x4e\x3d\xa5\xe1\xe2\x94\xfa\x9c\x1f\x47\x85\xac\x30\xb9\xf0\x77\x6e\x06\x75\xc6\xd1\x7c\xc6\xeb\x48\x67\xcc\xe7\x14\x22\x42\x13\x9d\xac\x8e\x4e\xe7\xa2\x5b\x61\x66\x61\x14\x53\xbb\xd9\x8c\x17\x8c\x5c\x2f\x29\xe8\x28\xaf\x6c\xdb\x3e\x5a\xf1\x14\xfc\x26\x2c\x8b\x55\xeb\x33\x6e\x1b\xd8\xcf\x79\xf8\x22\x8c\x3f\x05\x31\x9d\x0a\xce\xcf\xcd\x60\x3a\xe6\xac\x18\x2b\xac\x35\x1a\xf2\x2a\x8d\x78\x95\xc6\xbc\x8a\xe6\x33\x7c\x9e\x08\x4b\xa0\xc6\x5d\x15\x00\x5b\xad\x4a\x9c\x2f\xda\x52\x80\x15\xe4\x89\x5b\xb0\x81\x6a\x55\x52\xa9\xd1\x7f\x9a\x64\x99\x27\x7f\xd3\xc9\xb4\x56\x35\xa9\x61\x9e\x5a\xab\x99\xe4\xa8\x10\xf9\xc5\x44\xc6\x85\xc8\x7f\x9a\xc8\x24\x8f\xdc\xac\xd2\xcf\x18\x59\x00\x56\xb0\x15\x59\xeb\xea\xbb\x95\xc9\x9a\x68\x4c\x93\xa2\x25\x5a\x3d\xb5\x68\x5b\xff\xd5\xe3\x5c\x28\xd7\x7c\xd5\x82\xc5\x6f\xa1\x41\x83\x85\x69\x15\xc8\x47\xd6\x7d\x2a\x1d\xc9\xe1\xdb\x91\xbc\xba\x23\xeb\x95\x4f\x27\xc2\xaa\x48\x1a\x10\x5b\x9c\x0a\xbc\x0b\x32\x4e\x78\xf0\xbd\x46\xc0\xab\x3b\x61\xbd\x02\x69\x95\x10\x72\x7d\xd2\xe6\xac\x8a\x9a\xc8\x3f\x1f\xb0\x60\x61\x09\x21\xbf\xe9\x61\x95\xe7\xee\x8d\xaa\x45\xbb\xea\x54\xa2\x75\xd5\x8e\x70\xaa\xdb\x81\x63\x9c\xb8\x0c\xaf\xac\x00\xa6\x0d\x59\x8e\x08\xa1\xd5\xa9\xb0\x94\xd1\x82\xad\xed\x04\x27\x7f\x6b\x3d\x2e\x4b\x1a\xf2\x97\x36\x5a\xb0\xa2\xe1\x36\x30\x7c\xe1\x8e\xa8\xf8\x44\x19\xf3\x73\x42\x9e\x40\x26\x27\xcb\xa4\x8c\x1e\xe4\xf9\x54\xb6\x08\xb2\x39\xb2\xcc\x23\x27\xa8\xf0\x68\x96\x69\x56\xe5\x4f\x21\x4e\xfe\xff\x19\xca\xce\xfb\x43\x29\xfb\xd0\x49\x2e\xfe\x72\x2c\x59\x46\x93\xcf\x4a\xca\x35\xf2\x1f\xe5\x7d\x77\xe0\xf9\x22\xbe\xcc\xc1\x49\x1c\x44\x7e\x01\x34\xf7\x18\x07\xb5\xad\x0b\xcf\x15\x4e\xc5\x9c\xec\x1a\x6f\x4e\xb1\xbc\x4f\x1c\xb1\x81\x6e\xe4\x54\x4d\xfa\xad\x54\x45\x10\x07\x90\x4a\xa9\x54\x6b\x56\x6a\xd5\x1d\x75\xe9\xa8\x13\x0b\x6d\x21\xe1\x5d\xc0\xe0\xc1\xe9\x9c\xd5\x7b\x38\x25\x34\xcd\x0c\xdc\x66\x82\xd9\xd6\xa7\xec\x4a\xf1\x93\x11\xcc\x8e\x62\x23\x98\x95\xb1\x91\xc6\xa6\x99\xce\x54\xfb\x82\xc7\x99\x00\x37\xd1\xb7\xce\xff\xe6\x5a\x29\xfe\xe9\x41\xf0\xc3\xc7\xcc\xb3\xf1\xcd\x05\x84\x8c\xe4\x56\xc6\x2c\x4e\xb5\xfa\xfe\xa7\xc2\x99\x95\xa7\x4b\x26\x0c\x8c\x8e\x25\xbe\x51\x37\x5a\x96\x8e\xe4\x96\x2c\x07\xc8\x5a\xa9\x71\x47\x6d\xcb\xa8\x44\x4a\x42\x25\x15\x4c\xc6\x5a\xcb\xb2\x38\x19\xaf\xed\xf9\xb9\x58\x92\x4f\x3f\x25\xcb\xf2\x69\x99\x4d\x43\xfb\x22\x9b\x06\xdf\x4c\xc3\xc9\xbf\xcd\x34\xdc\x7c\xe2\xee\x44\x13\x5e\xa3\x08\x68\xaf\x42\xe8\x9f\x79\xe8\x78\x2e\xed\x38\x02\x88\x57\x08\x7d\xce\x43\x3f\x17\x73\x7e\xcd\x43\x71\x5c\x4c\x8b\xe3\x62\x2d\x71\x4c\xb7\xe6\x73\x56\xe7\xb3\xce\x07\xb7\xaa\x0b\x99\x17\xc2\xcd\xcf\x0b\xe1\x2f\x0b\xe1\x7f\x92\x82\xd1\xb9\xc9\x2a\xbd\x77\xdc\x85\xec\x29\xc1\xc9\x17\x6c\x14\xe3\x0a\xa1\x96\x29\x15\xac\x7d\x81\x9a\xaf\x54\xb0\x93\x7f\x93\xd9\x87\xd7\x15\x42\xfc\xdc\xb2\xec\xa1\x76\xb4\xf7\x94\x10\x6d\x5a\x56\xcf\xbe\x71\x7d\x51\x7c\x4e\x71\xf3\x49\xab\xa0\x8a\x6d\x1e\xb0\x9b\x0b\xf2\x36\xb4\x8d\x36\x3a\x0d\xb9\xcc\xa4\xdf\x91\xfa\x0e\x03\x8b\x38\x52\x6f\x50\x09\x07\x44\x01\x07\xce\x23\x12\x70\x37\x02\x78\xa1\x65\xed\x90\x7d\xff\xd1\x22\x15\xfc\x8a\xba\x16\x5a\xb9\x91\x66\xe3\x85\x84\x78\xb9\xf2\x7b\x4c\x03\x9e\x25\x45\xc4\x51\x3a\x5d\x61\xdb\x8a\x68\x56\xbc\xf0\x8a\xa0\xd0\x85\xd6\xa7\xa2\xa9\xed\x1a\xe7\x92\xb5\x3f\x95\x4a\x92\xdd\x5c\xec\x48\x38\x66\x34\xe5\x83\xb6\x05\xe1\x75\x48\x02\xba\x4a\x87\x81\x92\x72\x3d\xda\xe3\x1d\x41\x07\x3c\x45\xa6\x14\x1d\xa6\x77\xf5\xa7\x13\x6e\xf3\xc8\x81\xb0\xe2\x5c\xb4\xb1\x2c\x99\xe9\xfe\xea\xb1\x0f\x8c\x8d\x99\x54\x73\x56\x63\x2e\xe9\x84\xf7\xe8\x1e\x0f\x69\x83\x8f\xb5\xfe\xf2\xd8\x0c\x70\x42\xe8\x98\xa5\x3e\xa1\x3f\x96\xd3\xf6\x74\x5a\x7e\x47\x37\xd6\xcd\x4d\x48\xe5\x83\xf9\xde\x23\xa4\x62\x35\xca\x3f\xc8\xc6\xe6\xf6\x98\xb5\x2f\xc8\x5b\x30\xef\x59\x2b\xa9\x5b\x91\xb0\x7a\x64\x3a\x45\xa5\x65\x89\x88\xb9\x47\x43\x42\x28\x46\xe8\xe9\x0d\xe9\x28\x9b\x56\xf4\x22\x0c\x5c\x53\x8f\x2b\x1d\xe7\xd1\xdc\x6a\xa9\x72\x3d\x42\x9c\x1e\x0f\xd5\x05\xdd\x52\x4d\xb5\x62\x4d\xb3\xa4\x54\x8a\xb6\x43\x74\x66\x23\xd1\x6f\x59\xc8\xbb\xb4\xcb\xd3\x7c\x9d\x61\xda\xf5\x04\x74\x69\x8a\x53\xd2\xe3\x21\x32\x59\x34\xe4\xa1\x62\xfa\x42\x9e\xe6\xca\xd6\xbd\x2c\xd0\x03\xaa\xd9\x04\x22\x48\xb1\xc2\x72\x0f\xf6\x58\x5a\xe9\xed\x0c\x36\x36\x4b\x25\xe5\xb9\x0a\x36\x51\x8f\x76\x89\xba\xf7\x94\x70\x86\xde\x22\x2e\x9d\x2e\x8f\x9d\x94\x07\x4e\xa2\x1d\x33\x3b\x1d\x1b\x8f\x51\xc2\x53\x65\x18\xaa\xba\xcd\x13\x27\xa9\x54\x48\xe6\xde\x2c\x75\x13\x8f\xf9\x12\xb6\x42\x82\x01\x3d\xdf\x9d\x99\xf2\x74\x32\x53\xd9\x12\x1c\x73\xa4\x47\x96\x60\x09\x1a\xe1\xf0\x06\x59\x74\xb7\x18\xad\x56\x3a\x51\xf6\x0c\x2a\x5d\xf5\x4b\x2a\x56\x5a\x1e\x90\x8d\x0f\x9b\xdb\x11\x6b\x5f\x94\x4a\x09\xdb\x7b\xb0\xd4\xe4\x2a\x5d\xf4\x98\xcc\x00\x0c\x43\xaf\xbb\x3c\x42\x93\x75\xb1\x31\x59\xa7\x5d\xd0\xb9\x5d\xd5\xe3\x52\x29\x2a\x97\xd5\xe5\x1c\x1c\x55\x89\x7e\xae\xf4\x42\x04\xe6\x98\x2b\x6f\xec\xc5\x58\x38\xf0\xc0\x13\x4a\xe0\x23\x62\x65\x60\x31\xd2\x98\x37\xc8\x8e\x78\x90\x1d\x71\x1a\xc0\xf0\x1e\x7c\x4b\x92\x9d\xa8\xfc\xa5\x3a\x9d\xc6\x7a\x11\x3a\x82\x66\x05\xca\x59\x01\x00\x09\x28\x10\x8e\x15\x30\xe8\xd8\x6f\x92\x07\xca\xad\xcb\xe6\x8e\x44\xdb\x1d\x30\x3c\x60\x9a\xaa\xd0\x74\xcd\x89\x94\x21\xc7\x08\x40\x59\x97\x4b\xed\x86\x7f\x4b\x3f\x4c\xd5\x73\x57\x89\xf5\x1c\x96\x4a\xb1\xbe\xd3\x45\x97\x74\x84\xbc\x49\xbe\x56\xcd\xd6\x2d\xe6\xdd\x99\xe4\x6b\xb5\x19\x6c\x0d\x48\xd3\x4a\xf7\xca\x52\x19\x5e\xd3\xc5\x68\x69\x3f\x70\x63\x8f\x46\x6c\x38\x2a\x95\xd6\x22\xf6\xf4\xa2\x2f\xe9\x22\x75\x43\x37\x9b\xcd\xb2\x4d\x92\x99\x07\x0f\x8c\xc1\xfd\x39\x97\x84\xbb\xed\x65\x7a\x83\x76\x69\x8f\xbc\x85\xca\x2b\x18\x55\xab\xa3\xa0\x4b\xd1\x01\x4f\xac\xb5\xe7\x37\xcb\x01\xed\xf1\x9e\x7e\x56\x46\x5d\x7c\x49\x15\xd3\x1e\xf1\x1c\x01\x10\x30\x42\xe9\x42\x41\x3f\x0a\x45\x0a\x05\xad\x70\xc0\xec\xca\x72\x0a\x2c\x3a\x92\xfe\xb0\xcc\xbe\x79\x8e\x14\x64\xa6\xbf\x50\x55\x4c\x2f\xad\x23\x33\x13\xbc\x73\xd1\x66\x3b\xe8\x07\x17\xc4\x09\x8b\x11\x92\xe8\x67\xec\xe2\xc5\x8a\x68\xa8\x58\x83\x01\xaf\xd2\x11\x17\x5a\x51\xac\x13\x59\xc1\xce\x68\x3a\x1d\xed\x48\x32\x30\x0f\xbf\x21\x6b\xa0\xb2\x0c\xa0\x06\x43\xe7\xf8\x3c\x04\x02\x98\x0a\xb2\x01\x1f\x7e\x6e\xe9\xcd\x62\x5f\xb7\xb6\x7d\x1c\x3b\xaa\xfe\xf5\x68\x17\x69\x39\x1c\xfd\x53\x21\x86\xc6\x84\xb0\xe7\x43\xab\x40\x59\x85\xa7\xf3\x8f\x66\x94\xca\x2c\x1a\x16\x81\xaf\x72\xad\xba\xf0\x90\x44\xce\xfb\x46\xd8\x2b\x6a\x48\x25\xa3\x8c\x5e\xba\x1f\x09\xee\xcf\xf6\x10\x61\x3f\xac\x56\xfc\x72\x8f\xbd\x75\x53\x0c\x5d\x93\xec\xfd\xe9\x0d\xdb\xfd\x48\xcc\x88\xa3\x2a\x0c\xc6\x0b\x8e\xec\xcc\x8b\x01\xce\xaf\x62\x25\xc1\x7e\x40\xad\x5b\x94\x5c\x9d\x4f\x16\x28\xdf\xef\xc5\x3e\xb7\x5f\x4c\x97\x0f\xa1\xc7\xdf\xff\xd0\x63\x9d\xdf\x12\x45\x93\x57\xd8\xf3\xef\xed\xc5\xa7\x9d\xef\x17\xd9\xf5\x66\xc4\xf9\xfe\xbf\x31\x8e\xe8\x54\xac\xd0\xa9\xf8\xf9\x6f\x33\xa0\xdb\x0b\x43\xb3\x66\x2f\xa6\xae\xbf\x19\x92\xf5\x2e\x11\xfc\x67\xd7\x0a\xa8\xb4\xee\xc6\xd9\x0b\xcc\xfb\x3c\xf6\x3e\x8f\xed\xe4\xb1\x9d\x3c\x36\xce\x63\xe3\x3c\x36\xca\x63\xc3\x3c\xf6\xfc\xab\x89\x8c\xf2\xc8\x51\x37\xcb\xda\xcd\x63\xdb\xdf\xf8\x91\x8a\x94\x79\xe4\x6b\x64\x08\xec\xcb\xc3\xe2\xe3\xcb\xf8\x54\xac\xb4\x23\x00\x53\x73\x77\x2a\x68\xe7\x54\xd0\xcc\x9e\xc0\x87\xe8\x14\x1d\xf6\x89\x8e\x58\xe1\xad\x0f\x26\xd0\xe7\xf7\xa7\xda\x46\xbe\x22\x55\x1d\xc1\x13\xf3\xd6\x43\xeb\xae\x5e\x7f\xb3\x1e\xc7\xa2\xec\xb3\xb4\x87\xba\x17\x69\xcb\x85\x6f\x00\x41\x89\x29\xfc\xb6\x1f\xdb\x3e\xdb\x8f\xe9\x2d\xfc\xde\xc6\xf4\xe4\x9b\x0d\x99\xe8\xf1\x37\x3b\xa0\x87\xdf\xec\x87\x96\x1b\x78\xf4\xe8\x9b\x2d\x00\x98\xd1\xe6\xad\x2d\xdc\x03\xdf\xa3\x8d\x6f\xb6\x59\x1d\xba\x37\xb4\x43\xb6\x37\xa4\x23\x69\x87\x6c\x24\x69\x53\xa7\x45\x89\xa0\x8d\x5b\xdb\xf5\xe8\xf7\x6f\x76\x75\x06\x60\x4d\x79\x2c\x16\x28\xc4\xe0\x82\x1d\x89\x5c\x97\xe4\xed\x48\x40\xd6\xb3\x8e\x0d\xc0\x18\xd1\x8b\x9e\x66\x94\x21\x0b\xf7\x7e\xe2\xa1\x13\x3c\x74\x52\xda\xd0\xd4\x3b\x36\x58\x5b\x53\xc9\xf5\xaa\x5d\xa3\x50\x2b\x15\x2c\xfe\x99\xbf\x50\xc6\x2a\xb6\x31\x8b\x12\xa7\xb0\xf6\xbd\xd8\xc0\xf0\xb6\xd9\x21\x04\x11\x0b\x02\x57\xa0\x6b\xf6\x86\x8e\xf6\x76\x83\xab\xd4\xb2\xb0\xb3\x55\x8f\x0d\x05\x35\x82\x44\x0b\x66\xac\xac\x17\x9b\x50\x33\xbf\xb4\x46\x0a\xee\x16\xaa\x8e\xcf\x26\x2f\xdb\x3e\x93\x7b\x8e\xf1\xb3\x18\xff\x8f\xee\x8b\x22\x89\x7d\x4d\x93\x7e\x48\xb9\xb4\x12\xa5\xcf\xa0\xc9\x87\xb7\xa1\xb0\x13\x7a\x63\xa7\xe8\x34\x53\x1b\x76\xcf\x2c\xd4\x6c\xcd\xc8\x2c\x2e\x97\x67\x92\x07\x33\xc1\xa3\x7b\xec\x24\x6c\x20\x65\x84\x1b\x27\xd8\xc9\x67\x57\xc0\xe4\x46\xb3\x59\x50\x41\xe7\x6b\xc9\xff\xc7\xdb\x9b\x3f\x35\xae\x63\x0d\xa0\xbf\xf3\x57\xc0\xfd\xf8\x5c\x56\x47\x71\x27\xcc\xdc\x3b\x33\x36\xea\x14\x21\x04\x48\xb3\x74\xb3\x04\xba\x5d\xae\x57\xb2\x2d\x9b\x60\x63\x4c\x9c\x04\x08\xc9\xff\xfe\xea\x1c\x49\xb6\x13\xe8\x9e\x99\xaf\x5e\xbd\x99\xdb\xc4\xd6\x66\x2d\x47\x67\x91\xce\x02\x4b\xeb\x24\x1f\xc1\x8d\xff\xc2\x1b\xe8\x9b\xf7\xf7\x90\x12\xbf\x07\x93\x44\x83\x49\xb2\x02\x26\xf7\x1a\x4c\x7e\x9c\x48\x30\xb9\xeb\x97\x60\x72\xfe\x17\x40\x09\x76\x7d\x5f\x25\x8d\x12\x5e\x81\x8b\x3c\x18\x2c\xcf\x37\xc3\xd5\xb5\xdf\xa9\x2d\x38\xc5\x51\xc2\xeb\xe9\xc8\x0e\x97\xce\x5a\xd1\x15\xd8\x10\xb5\xbc\xbb\x3e\x6d\xd3\x08\xf2\x22\x2b\xfe\x46\x43\xd8\x4d\xd1\xbd\x19\xc9\xd2\xc7\x1c\x26\x22\xba\xc7\x10\xdb\x1f\x4c\x67\xcd\x06\xff\xbe\xbe\xcb\xe5\x09\x9b\xbc\x39\x6f\xff\xf9\x09\x9d\xc7\x10\xc7\x6f\x32\x3c\xc4\x15\x4e\x70\x6d\x86\x34\x85\x7d\x6f\xfd\xf8\x0e\x9f\x0c\xae\x4d\xe9\x61\x86\x03\xc6\xf9\x0c\x23\xfb\xf6\xff\xa8\x5c\x79\xd6\xf4\x80\x67\x2e\x0e\x67\x3f\x46\xe6\xc3\xf5\x47\x78\xfc\xf1\xde\xe4\x34\xaa\x9c\x08\xe0\xb2\xc1\x9a\x05\x34\xcd\xed\x04\x63\xdb\xd7\x4e\x7f\x92\x93\x0f\xbd\x7d\x5e\x8d\x4c\xdf\x3a\xfe\xe7\x87\x9e\xc1\xd7\x9d\x6a\x2c\xc9\x12\x84\xcf\x96\x13\xed\xfa\xd6\xc1\x0f\x19\x24\x25\x22\x2a\xac\x1f\x26\x45\xd2\xd1\x71\xca\x1e\x06\xdc\xf4\xad\xa3\x7f\xd2\x18\x44\x83\x9f\x57\x66\x6d\x2b\xf5\xe3\x06\x97\xfb\x88\x38\xbe\xf5\xf5\x9f\x8c\x31\x31\xe1\xc8\xa7\xdf\x0f\xb8\x99\xd6\xc2\x35\x66\x7a\x53\xa6\x6b\x7b\x51\x36\xe0\x5b\x03\xf5\x05\x94\x1d\xb7\x5a\xb4\x60\x01\x7e\x81\xd0\x29\x6b\xb6\x9d\x0c\x76\x64\x26\x77\xa4\x74\x0b\xae\xe4\x47\x3a\x67\x81\x39\x93\x3b\xb0\x89\x8d\x39\xcd\x36\x63\x53\xc3\x98\x7f\x61\x85\x61\x98\x53\x26\x9d\x4c\xa9\xc8\xca\xd6\xde\xa3\x49\xaa\xd8\xca\x5d\xf2\xd6\x65\x81\xd9\x5d\x69\x60\x14\x99\xdd\xdd\x79\xa3\xad\x8e\xe4\xe0\xb5\x39\xdf\xf5\xad\xde\x3f\xc9\x5b\x5e\xc6\x58\x59\x62\x88\x95\x2e\xbc\x27\x90\xf9\x43\xc6\x03\x90\xf1\x93\xf1\x3d\xf1\x2a\x81\xb3\x67\xdd\x36\xe7\x64\xd7\xb7\xf6\xff\x09\x9f\xd4\xdc\x32\x70\xb8\x3d\xeb\xf6\xcb\x1c\x84\x1f\x1d\xf3\x30\xc1\xc8\xa7\x98\x9d\x34\x1a\xcb\xee\x62\xb1\x91\x6a\xd4\x32\xa3\xb7\xf6\xbc\x8e\x5a\x7c\xc0\xe3\x0a\xbb\xa0\xb8\x84\x41\x85\x73\xf2\xd6\xde\x9d\xca\xa5\xb8\x37\x53\x3a\x6d\xb6\x31\x4e\x4b\x5e\xf9\x5d\x90\x7e\x8c\x85\x5c\xfd\x82\xbc\x4d\x99\x70\x0b\xcf\x99\x41\xdf\xe6\x9a\x65\x97\x2e\xbb\x53\x59\x28\x93\xa3\xeb\xb2\xd4\xcd\x3c\xda\x63\x53\xeb\x3c\x30\xbb\xd6\x84\x83\xd0\x1d\x9a\x3d\xea\x5b\xd3\x10\x9e\xb9\xf5\x1a\x75\xce\xdc\x3d\xcf\x3e\x53\xf1\xa7\xb3\x46\x1b\x5b\x31\x8c\xd4\xcd\x1a\x6d\xcf\xba\x6d\x76\xad\x5b\x00\xbf\x7f\x36\xce\xc8\xdb\xac\x9a\xd5\x79\xe5\xe9\xab\x27\x43\x27\x9f\xc9\x21\xcd\x80\x94\xa0\x9f\xb4\xb7\x9c\x15\x4e\xc2\xe6\x7a\x1d\xca\xd5\xcc\xc9\x1b\x67\x21\x5f\xeb\x79\xb3\x8d\x7d\xe7\x9a\x01\xa7\x65\x17\x60\x1c\xd6\x6d\x1d\x43\xa4\x34\xfe\x66\x27\xf4\x61\x9a\x4e\x46\x79\x8a\x11\x9d\xef\xb9\xcd\x41\x16\xd1\xbb\x69\xd5\xab\x7e\x6f\x4d\xf7\x54\xee\x21\xd7\xab\x85\xef\x26\xb5\xa8\x65\x4e\x22\x3d\x47\x37\x1a\x89\x2c\x9b\xb2\x08\xe4\xdf\x3d\x8e\x42\xfc\xb1\xdb\xf2\xa4\x03\xf6\xec\x84\x9b\x99\xf5\x42\x33\x77\xe0\xd1\xd4\xfa\x1a\x50\x6e\x9d\xff\x85\x01\x66\xda\x8c\x05\x9d\xbd\x81\x3d\x3a\x70\x60\x13\xa3\x8f\xe3\x94\xed\x40\xaa\x8c\xb4\x66\x4b\x59\xae\x9a\x84\x6a\xed\xa4\x83\x7e\xe8\x5c\x6e\x5d\x18\x86\x70\x33\xaf\xc2\x22\x85\x44\x7d\xd8\x92\x19\xaa\x49\x6a\xe4\xd6\x2d\xf9\xbc\x63\xc3\x0f\x05\x18\xc9\x3c\xf7\xe2\xd5\xa3\x33\x06\x5d\x2c\xe8\x94\x72\xd8\x84\x5b\x80\x4d\xe2\x6a\x0b\x74\x59\xac\x84\xc8\x8b\x07\x73\x46\xbb\x84\xbc\xcd\xab\x45\x86\x2d\xe5\xbe\x7a\x5f\x66\xe8\xfa\xe9\x2d\x2a\x41\x3f\xaa\x40\x3f\x6a\x34\x96\x73\x75\xde\x00\x90\x9f\x03\x21\x47\xc0\xbf\xb5\x0b\xba\xc7\x6d\x09\x24\xd8\x21\xe5\xf7\xd7\x57\x41\x6d\x0a\x74\x1d\xbc\x9a\xad\xb6\xc8\x54\xc6\xb5\xe1\xca\x05\xe7\xec\x99\x57\x45\xde\xb9\xe2\x5c\x92\x72\xd9\xeb\x2e\xe7\x25\x4e\xd7\xe8\xf5\xea\x17\x61\x81\x95\x82\xfb\xb2\x26\x11\x65\x75\xdc\x1d\xb2\x60\x64\x86\xa4\x13\xda\x2d\x27\x60\x6c\x6f\xd0\x31\x03\xc6\x29\x67\x41\xc3\x97\x1e\x54\xf0\x9c\xbd\xe9\x7f\xde\xa9\xfc\xa7\x34\xe0\x6d\xfd\x92\x27\x68\x86\x94\x37\x80\x0b\x45\x88\x3a\xe1\xcc\x75\xdb\x1e\x75\xff\x6c\xe1\x1f\xf8\xdb\xa2\x6d\xf9\xf7\x4f\xfc\xf9\x9b\x4c\xd3\xa9\x65\x7a\x2d\xa7\xca\x6b\xd1\xbf\xaa\xb4\x9d\xf2\xb1\x5e\xa0\x45\xff\x51\x7b\x5e\xcd\x69\xd1\xbf\xad\xbc\xfd\xb5\xf2\x06\x65\x3d\x7a\x57\xf6\x19\xda\x87\xbe\xb4\xa1\x1f\x3b\x2d\x3d\x8a\x76\x4b\xbe\xbf\x1f\x91\xec\x90\xec\x7e\xbb\xf5\xdb\x41\xea\xbe\xeb\xb1\xb6\x5b\xff\xd1\xe8\xab\x21\x57\x03\xf9\xfb\x7f\x33\x37\x3b\xff\xa7\x79\x5a\xcf\xad\xf5\x57\xff\xff\x4f\x99\xb0\x51\x2f\xd2\xf2\x3c\x10\x4d\xd8\xdf\x2a\x61\xee\xe0\xe3\x1b\x88\xcb\xbe\x16\xdd\x7c\xe6\x97\x31\x44\x43\xe2\x04\xd2\x10\x9b\xa2\xb7\x58\x2c\x30\xe0\xe6\xd9\x1d\xa1\xfd\x63\x8e\xf1\xbe\xa4\x08\xa8\x5c\x88\xf6\xe3\x9a\xf7\xac\x87\x7e\xe9\x3d\xeb\x6e\x5c\x4b\xbf\x88\x39\x6b\xed\xa2\x0f\x59\x9f\x8f\x0b\xed\x7c\x57\x37\x7e\x3d\xc0\xa3\x10\x74\x7c\x5b\x73\xa7\xeb\x84\xec\xd7\xe1\x06\x91\x5b\x44\x17\xbd\xba\x95\x9b\x01\x81\xee\xdf\xaa\x91\xfc\xd6\x09\xef\xbf\x0d\x6c\x25\x27\x66\x58\x06\x2e\x3c\x1d\xd5\x86\xf3\xfc\xc0\x56\x26\xe7\x79\x8f\x13\xed\xa8\x57\xde\x02\xb8\x47\xde\x16\xfb\x7e\xb7\x58\xa0\xb3\x66\xf6\xf3\xb8\x83\x7e\x88\x0f\x9f\x39\x3d\x27\x36\x3e\x6f\xe3\xb3\xa3\x4c\xfc\x9e\x1f\x56\x46\x1e\xb0\x37\x74\x20\x69\x07\xf4\x77\x33\x20\x85\xdd\xb5\x79\xb8\x18\x10\xba\x81\x37\x56\xdf\xea\x9d\x4c\x51\xe6\x0d\xd9\xed\x83\xa9\xaa\xb9\x7d\x8f\x4a\x77\xc8\x73\x51\xba\xa1\xbd\xeb\xbf\x6f\x2d\xc0\xe8\x2b\x2a\xbb\x2c\x79\x13\xf3\xd5\x69\xc8\x5f\x38\xa1\x5f\x8f\x39\xbd\xeb\xea\x4b\x38\xff\xcf\xd5\x22\xa7\x33\x4e\xe8\xc9\x31\xa7\xbd\x67\x0e\x73\x75\x53\xcf\xec\xf5\x30\x38\x51\xac\x2b\x0f\x63\xa9\x97\xee\x67\xe6\x5b\x34\x4a\x53\x74\xb4\xb4\x56\xe7\x67\x1f\xea\xdc\xfc\x5d\x87\x64\x9c\xbc\xaf\x81\x19\xb3\x7c\x75\x36\x38\xf4\xb5\xf5\x6e\x92\x12\x9c\x24\x0e\x93\x14\xac\xcc\x0d\x5f\xfd\xec\xe0\x88\x50\xdd\xcd\x1f\x27\xab\xdf\x2c\x9d\x04\xc6\xb9\x76\xfd\xcb\xff\x54\x24\x4e\xa5\xd3\xd2\xf3\x41\xcd\x6b\xaf\x76\x94\xeb\x5c\x3c\x4b\x08\x76\xbd\x4a\x22\xbe\x1e\xb1\x78\xb1\xf0\x2d\x15\x8e\x78\xc0\xcd\xab\x01\x21\x44\xe7\x5d\x69\xd7\x64\x23\xba\xf1\x5e\x4f\xf8\x6d\xe9\xf8\xd6\x0c\x08\x0e\xb7\x66\xa4\xc3\xad\x99\xcd\x9d\x47\x78\x8b\x88\x61\x98\xbe\x15\x31\x78\xac\x22\x98\xeb\x13\x97\x7e\x69\x68\xf8\xc0\x4e\x57\x96\x2a\x26\x20\x35\x17\xaa\xa7\xaa\x8c\xaa\x26\x94\x87\xdc\x2b\x51\xdb\x33\xd1\x9e\xb2\x77\x78\xd6\x6d\xce\x7d\x86\xde\xda\x9b\x21\xa7\x0f\xfc\xc5\x0e\xb9\x02\xe8\xb0\x8e\x3a\xa2\x3b\xce\x22\x27\x62\xe2\x72\x45\xe6\x85\xa5\x3f\x24\xe5\xf3\x8f\xe3\xf2\x44\x09\xca\x33\xc6\xbe\x1e\x29\xd4\x33\xc7\xd7\x1f\x3a\xcc\xe9\xe8\x4e\x9e\x61\xb9\x47\x1e\x63\xdf\xef\x94\x36\xdc\xc3\x50\x99\xb5\x29\xab\x0c\xc1\xa5\xd7\x67\x75\xed\xb7\x0a\xc4\x5d\xd8\xee\xbd\x88\xd3\xa3\x48\xf5\xe0\xe7\x09\x0b\xb5\x99\xfd\xf5\x48\x47\xeb\x3e\x50\xa6\xac\x03\xfe\xd1\x99\xdf\xf6\x85\xa9\xf0\x30\xe5\x2b\x7e\xe1\x2e\x94\x9b\x7a\xf4\xed\x87\x71\xc3\x98\x6f\x18\x5b\x11\xc7\x57\x93\xc3\xd7\x24\x2f\xab\xef\xfd\x29\xa4\x11\xb2\xbc\xb1\x46\xfb\xef\x1d\x6c\x09\x6e\x8d\xf6\x4d\xd5\xcf\xcf\xed\x16\xe5\x8b\x85\xeb\xd5\x8f\xfb\xfa\xc3\xd5\x3b\xf0\xe2\xda\x24\xd6\xd3\x1d\xfa\xfd\xb1\xce\x5f\xd8\x59\x86\xbb\x61\xc0\xcd\xed\x3e\xa9\x34\x51\xa6\x05\x5e\x25\x6d\x71\xeb\x62\x6e\x18\xfe\xa3\x19\xd0\x59\x1f\xba\xb8\x85\xcf\xb7\x13\x4e\x16\x8b\xeb\xb2\xee\x8f\x09\x6f\xa0\x1b\x92\x2d\x6e\x5d\x8f\x0c\xc3\x14\x8b\x45\xeb\x0b\x7c\x40\xeb\x12\x31\x78\x31\x0c\x68\x4f\x8e\xf4\x61\x08\xc2\x20\xf6\x01\x38\xc3\x10\x3d\x94\x43\x73\x30\x69\xd6\xf9\x0b\xf4\x4f\x70\x16\x3a\xdc\x0a\xf9\x84\x5f\xbd\xe6\x02\xa3\x76\xf4\x63\x16\x5a\x97\xfa\xc3\xf1\x1d\xfa\xcd\xfd\xb1\x92\x28\x64\xe2\xdd\x98\x05\xd6\xa5\x89\x49\xfb\x3d\x42\x6f\x8e\xb9\x35\xdb\x7b\x81\x5d\x3a\x1e\x85\xe9\x28\x13\x85\xe5\xf3\x42\xc0\x53\x5d\x95\xe6\xb0\x54\xa5\x0e\xc7\x8c\x3f\xa2\xef\x98\x01\x37\x67\x5f\x09\x3d\x3c\xe6\xb5\x63\x10\x06\x25\x80\x0e\x84\x63\xc6\xa6\x7d\xa5\x1d\x24\x81\xaf\x72\xd0\x24\x38\x5e\x1e\x5d\xea\x76\x0e\xba\x80\x87\x9e\x80\x43\xc4\x80\x0f\xcf\x57\x66\x40\x6b\xf9\xd3\xaf\xa8\x99\x24\x57\xa2\x96\xde\xd3\xf5\x04\xd4\x13\xef\xea\x4d\x64\x3d\x29\x9a\x84\x38\xc7\x73\x1f\x60\x89\x85\x3a\x55\x94\xa9\xfc\x85\x89\x32\x3e\x9c\x2a\x86\x58\x40\x77\x81\xea\x64\xfd\xc4\x5f\x6a\x05\x26\x5f\xab\x64\x98\x6a\x59\xf4\x8b\x4e\x42\x65\x2f\x9d\x5a\xb6\xc4\x74\x76\xd5\x62\x00\x95\x61\x96\x55\x91\x2d\xd6\x0c\x31\x7e\x9b\xcc\xdf\x62\x21\xef\x4c\xfb\x36\x07\x54\xe1\xe8\xa9\x05\x28\x92\x33\x5e\x1b\x24\xd6\xc4\x77\xc1\xad\xa2\xfa\x7a\xd5\x4f\x68\x4c\x17\x78\x0a\xca\xce\x10\x52\x3f\x83\x79\x5c\x11\x00\x3e\xf8\x0e\x5b\xed\x21\x03\xe4\x50\x89\x01\xf9\x89\xd6\x33\xad\x3a\xbb\x05\x5f\xac\x9c\x2f\x03\x00\xa2\x53\xfc\xcf\x00\xd6\xd2\x3d\xfe\xc3\xa8\x78\xe0\x93\xe0\x0e\x43\x92\xff\xd1\x80\x3d\xb0\x12\xa1\xfb\x69\xfd\xcc\x9e\x03\x02\x0e\x1b\x26\x9e\xc5\x9e\xbf\x78\x1d\xeb\x4f\xbb\x69\xfd\x89\x61\x0a\xfb\x2c\x68\xb6\x61\xf3\x44\x2c\x6c\x04\x9f\x30\x1f\xef\x86\xf8\x36\x7a\x09\xc3\x2e\xaa\x2d\xb8\x58\x1c\x67\x26\xb7\xd4\xaa\x3e\x00\x85\x94\x59\xc0\x1e\xb5\xe4\x45\x92\x3f\xec\x14\xea\xfb\xf0\x6d\x7b\x52\x7b\xd1\xf2\xf5\x64\x34\x49\x85\xcd\x81\xe2\xd1\x8c\x3f\x00\x23\xe3\x6f\x9b\x84\xc2\xe8\x6c\x98\x0a\xca\x73\x1b\xf6\x3e\xd5\x7b\xd9\xe6\xae\x98\x7b\x74\xf2\x60\x73\x6b\xf2\x40\xaf\xa0\xca\x95\xa0\x22\xb2\xa1\xe7\xf4\x36\xb4\xdf\x0e\x84\x7d\x6b\x72\xeb\xe4\x5f\x20\x87\x8e\x13\x7c\xc9\x73\xc0\xa8\xb4\x0c\x94\xa9\x0b\x5d\x1f\xd5\x0a\x9d\xff\x03\x0b\x0d\xee\xed\x80\x1e\xf8\xb6\x6f\x1d\xf8\xf4\x98\xdb\xbe\x75\xcc\xe9\xd5\x9d\xed\x5b\x57\x77\x52\x84\xe4\xd6\xe9\xa8\xbe\xfa\x93\xba\x14\xc7\x4b\x32\x32\xc5\x29\xa3\x80\xda\x3a\x33\x7c\xb6\x61\xf2\x3a\x72\x2a\x3b\xcf\xea\x36\xcc\x7e\xd1\x0f\xaf\x98\x41\xec\xb9\x6a\x0f\x56\xa5\xd1\xd6\x7b\x7a\x4f\x36\xa7\x82\x83\xbc\xc3\x19\x11\x50\x7c\xee\x06\xf3\x8f\xee\x86\xde\xf8\xbf\x6c\x4e\x27\x1c\x66\x8d\xd3\x5b\x9b\x5b\xb7\x52\x72\xae\x9d\x13\xa9\xe3\x23\xc5\x34\x61\xa0\x14\x8a\x21\xc3\x63\x06\x4b\xd0\xe9\x62\xaf\x22\x62\xef\xab\x07\x82\xb1\x3b\xe3\x8f\x3e\x37\x51\xfe\x8a\xcf\xff\x01\x5d\xbe\xb5\xf9\x6f\xbf\xf6\xe3\x44\x7e\x6d\x74\x6f\xe2\xa5\xe9\xc5\xc8\x8c\xde\x99\x17\x58\xb7\x9f\xe4\xcd\xd4\x8b\x3a\xf0\xbf\x12\x65\xc2\x62\x71\xa4\x3d\x97\x59\xb7\x84\x70\x0c\x84\x47\xc5\xbd\xe4\xa7\x60\x4a\xb8\xc5\xff\x45\x9c\x50\xa4\x62\x02\xa8\x8b\xff\x0b\xe3\xc0\x28\x41\xa5\x0e\xcc\x7b\x7b\x1c\x61\x39\x32\x0c\x33\x66\xf1\xbd\x19\x11\x42\x85\x61\x8c\xee\xcd\x18\x88\x24\xdd\x70\x85\x87\x74\x62\xfb\x46\xa9\x7d\xa2\xae\x00\x50\x93\x9b\xca\x9d\xde\xdb\x31\xb7\x23\x80\x9a\x18\x40\x49\xd4\xa1\xa5\xa8\x43\xcb\xf1\x50\x1b\x44\x48\x04\xf4\x85\x29\x44\x53\xbb\x51\xc1\xe9\xba\x52\xd3\x76\xe0\xcb\x43\xbd\x15\xa0\x70\x1e\xee\x61\x5f\xf6\xab\xe3\xd5\x88\x85\x9c\xc6\xac\xed\xc4\xbb\x90\x21\x4f\x98\x62\x7d\x5b\x81\x49\xb1\xd7\x94\xbf\xcd\xb6\xe7\x24\x30\xe4\xf2\x56\x38\x21\x64\x09\x2c\x12\x62\xbe\x88\xb5\x24\x08\xa6\x8c\x5b\x37\xa7\xa6\x4f\xdc\xe1\xdc\x63\x18\xd9\x37\x66\x2d\xa4\xb7\x9b\xa3\xac\x98\xf0\x2c\x10\x8f\xd1\xe6\xe4\x1a\xa7\xae\x3a\x17\x6e\xff\xeb\x1f\x28\x89\x12\xa2\xef\x45\xe4\x99\x18\xde\xa7\x59\x3e\xbd\x45\x5a\x0b\x00\x90\xd2\x98\xd0\x84\xbd\x4d\x43\x9b\x5b\xd3\x90\x76\x61\xaf\x75\x27\xf4\x0e\x70\xf9\x5d\x9f\xfe\x38\xb1\x39\x40\x0b\xcd\x24\xfe\x02\x6e\x93\x53\xb5\x43\x72\x16\x5b\x7c\xc4\xf5\x4c\x52\x35\x91\x34\xc2\x0f\xf4\x05\x7c\x20\xa1\xbe\xb5\x1d\x10\x59\x2f\x93\x27\xc3\x2c\x33\x0c\xf3\x62\x64\xe6\x78\x79\x50\x83\x3a\x6e\xdd\xb2\x41\x0d\xae\x10\x46\xb1\xe0\xe9\xe8\xb7\x05\x1d\xae\x63\x2b\x5a\x2f\x6c\xa3\xca\x29\x13\xb1\x29\x84\xf3\x0f\xda\x9a\x70\xcd\x70\x5a\x79\x6e\xc2\xbb\x9e\xb6\x51\x64\xa6\x95\xe3\xf9\xb2\xb5\x95\xcf\x55\xcf\xaf\xb5\xf4\x57\xe6\xe3\x16\x73\x3e\x1e\xe7\x6f\x3f\xf9\x7f\xdb\x79\xf8\x15\x2e\xdd\xbd\xcb\xa3\xc4\x0b\x98\x73\x10\x60\x7e\x31\x85\xff\xe9\x47\x3a\xd8\xfa\xe9\x88\x72\x62\x17\xfa\x2c\xb0\x86\xd7\x14\x8a\xde\x93\x01\xa3\x2e\x6c\x19\x6d\x9e\xf2\x95\x3d\x0b\x0d\x7c\xb4\x67\x73\x85\xec\xf5\x5e\x5b\xd9\xb9\xf3\x35\xcd\x50\x47\x13\xfa\xce\x2a\x9d\xef\x94\x6f\x72\x43\xb5\x4a\x66\xa2\xd9\x06\x1a\x50\xf1\x00\x75\xc6\x4a\x8a\x83\xbe\xd5\xe3\xee\xc0\x2b\xb9\x9f\x46\x9b\xc8\x18\xb6\xaa\x81\x92\x41\xb1\xab\x6f\x56\xed\x33\x5d\x3d\xd4\x4f\x30\xc8\x8b\x98\xa3\xa2\xbc\xec\x4d\x48\x55\x10\xc3\x46\x5b\x45\x02\x93\x84\x24\x3a\xd0\x85\xf8\x8b\xd9\xa6\x21\x5e\x10\x70\x90\xd2\x7a\xea\xca\x0a\x24\x35\xa0\x49\x9f\x43\x07\x17\x73\x78\x51\x76\x77\x5d\xc2\x0c\xb4\x5d\x55\xb4\xe7\x54\x34\x01\x4b\x73\xcf\xdd\xf6\xe8\xad\x44\xfd\x7d\x01\x04\x02\x97\x4c\x65\x5a\x67\x13\xb7\x05\xeb\xd6\xda\x65\x81\x61\x04\xbb\x2c\x44\xd0\xad\xb3\xda\xb3\x93\x95\x10\x0c\x82\x4b\x04\x78\x3d\x5a\x8b\x20\xa6\xa5\x57\xeb\x78\x1b\xe4\x5c\x1a\x58\x33\x82\x71\x5e\xa0\xac\x8e\x1f\x9d\x05\xe6\xf3\x15\x72\xa8\xd7\x23\xd8\x2b\x33\x02\x34\x7b\x25\x55\x15\x6f\xb6\x31\x97\x38\x12\x6b\xfb\xd6\xf4\xd8\xf4\x01\xd5\xf8\x80\x67\xb6\xda\x0a\x9f\x00\x67\x82\x2d\x83\x84\x2e\xfb\x25\xb9\x00\x19\xf6\x5a\x9b\x02\x01\xb9\x5e\xed\x72\xd9\xe1\x67\xe5\xc8\x4c\x70\x0a\xe2\x39\x02\xaf\x6f\x8d\x73\x53\x29\xfd\x87\xec\xe5\x0a\xf1\x1c\x91\x0b\xf1\x51\x53\x5a\x8e\x98\xd1\x98\xe1\x48\x82\x32\xc6\x4f\x5f\x98\xb1\xf4\xdf\x1a\xa1\xcc\x4f\x30\x32\x06\x3a\xc6\xaf\x3c\x1e\xc0\x7a\x05\xf4\xd6\x8e\xd5\x86\x42\x0a\xfe\x6e\x25\x24\xcb\xf2\x76\x7f\x2c\xf1\x2e\x05\x41\x8b\x82\x60\x45\xe5\xde\x78\x3d\x5e\x2c\x24\x73\x8c\x80\x38\x37\x8c\x03\x09\x4c\xd5\xda\x01\x7d\x76\x1e\x35\x7b\xe9\xb3\xcb\xd1\x5a\x78\x46\xcd\x55\x2b\x93\x41\x09\xf4\x86\xa1\xed\x17\x25\xe4\x4b\x8c\xfa\x04\x13\x71\xfe\x42\x0c\x63\xe7\x8b\x94\x1c\x4d\x9f\xdd\xdf\x9b\x3e\x95\x32\x23\x91\xe2\x21\x4c\xa5\xaf\x1e\x4f\x8f\x4d\xbd\x22\xe5\xa4\xca\xf5\xad\xa6\x56\xbc\xe7\xab\x6a\x8e\x6f\x14\xd6\x04\xd6\x2c\x80\x39\xf4\xeb\x53\xe8\x7f\x00\xe9\xd1\xc7\x73\x79\x50\x87\xea\x90\x53\xa9\x6c\x0a\xbc\x7b\x39\x4f\x32\x82\xf5\x6a\xb8\xf4\x90\xb5\x76\x79\x33\xe8\xb4\x6d\xe0\xdf\x59\xf8\x09\xb7\x77\xf8\x89\x13\x27\x90\x67\x05\xfc\x13\x3c\x40\x21\x9c\x0f\x1d\x33\x4f\xfb\x91\x08\x6a\x16\x2d\x01\xe3\x4b\xe2\xf8\x5b\x0a\x39\xa9\x2e\x5c\xac\x7e\x93\xc6\x3a\xdc\x8a\x72\xb0\x8e\xee\x9f\xbe\x8d\xdc\x54\x78\xee\x89\x67\x0a\x8a\x6a\xe1\x55\xfb\x68\x27\x50\xef\x27\x0d\xee\x4d\x41\x83\x46\xf8\xc9\xa7\x31\xa0\x38\x54\x43\x5b\xd6\x96\x67\x45\xb4\xd6\xac\xb2\x62\x97\x56\x44\x64\xc5\x93\x38\x01\xec\xc6\x00\x76\x63\xa0\x77\xa3\x64\x91\x5e\xae\x60\xdb\x08\x2b\x4e\x51\xf9\x5b\xdf\xc3\x87\xd6\xcd\x1e\x05\xf9\xff\x6a\xaf\xd9\xa6\x09\x1e\xd8\xed\x0f\x4d\xe0\x0f\x28\x30\x1f\x4a\x8f\xf5\x39\x26\xea\x56\x8e\x46\x2c\xa6\x31\x4b\x9d\x50\xf2\x36\xaf\x43\x53\x69\x00\x56\x5f\x05\xf6\x95\xa2\x8a\x79\x42\x05\x6d\xb7\x68\x08\xbc\x12\x74\x46\xea\xc2\x39\x25\x11\x04\x46\x4d\xb0\x96\x23\xa4\x9e\xa5\x40\xf5\xc7\xd0\x15\x1e\x8d\x94\x26\x29\x2e\xb8\xa6\x6f\x01\x80\x98\xb4\xbe\x04\x7e\x5a\x07\xed\x92\xe0\x24\x75\x5c\x11\xa6\xea\xb3\xb6\x5f\xb3\xed\xd9\xf2\x17\x8b\xf6\x17\xf4\x53\x8d\x8a\x3b\xdc\x9a\xe5\xa4\x76\x81\xa9\x6d\x90\x7c\x17\xef\x41\x7d\x40\x84\xb7\xe4\x33\x60\xcd\xbc\xd1\x26\xd2\xfb\x0a\xde\x15\x30\x99\xa7\x06\x10\x29\x5f\xe0\x71\x13\xe4\x30\xf2\x39\x00\xec\x2a\x1c\xd1\x6c\x6a\x5e\x13\xf3\xe3\x66\xf0\x49\x10\xa7\xbd\xab\x54\x70\x65\x69\xc3\x40\xed\xce\x84\x2c\xab\xd9\xf0\xe5\xfd\xac\x50\x21\xa4\xe1\x73\xc2\xb3\x6e\x95\x76\x02\x74\x07\x75\x52\xe3\x06\x0b\x28\xd6\x96\xed\x13\xe2\xc4\xec\x7c\x64\xfa\x04\xba\xa6\x1d\x94\x5b\x22\x6a\xc6\xd8\x29\xf9\x81\xb6\xd2\x35\x6f\x34\x88\xee\x58\x03\x3a\x46\xeb\x1d\x13\x51\xd5\x31\xbd\x2d\xea\xb1\xdc\xbb\xff\xcd\xb4\x56\xa6\x47\xbe\x72\xc6\x03\x8c\x8a\x40\x83\x4f\x17\xa3\x4d\x03\x8b\xae\x06\x1d\x37\x1a\x04\x0a\xc6\x1e\x96\x50\x85\x61\x07\x87\x86\x61\x16\x57\x78\xf4\x23\x0c\xa3\xb8\x32\xc5\xe7\x10\xc4\x14\x0c\xd9\x0b\xc3\x43\x87\xd3\xae\x6c\xc7\x03\x01\x3c\x42\xff\xf7\xb2\x6b\xef\x16\x3a\x61\x2b\xeb\x4c\x95\x4b\x6e\xd7\xa3\xa9\x03\x43\x50\x28\xe2\xea\x58\xb1\x22\x33\x0c\xe9\x05\xaf\xf0\x0c\xf2\x02\x96\x12\xfa\x56\x59\xea\xf1\xe2\xe2\x48\x3d\x5e\xe9\x54\x42\xb8\xb1\x47\x3e\xcb\xe7\x76\x8b\x50\xad\xcb\x5b\x55\xa9\x0d\x1c\x95\xfc\x61\xec\xb8\xd8\xb0\x23\x7d\x37\x6e\xb4\x3d\x6b\xc2\x3f\x63\xf2\x84\xd3\x2d\xb3\xf5\x25\x21\x38\x01\x89\xd4\x58\x6e\x7f\x91\x92\x4b\xb3\x8d\x01\xef\xb0\xc2\x2d\xa9\x2a\xc3\x10\xb1\xc9\x94\xb5\x9c\x54\x76\x31\x85\x69\x86\xae\x88\x46\xf4\x29\xf9\x14\xba\x69\x15\x86\xb4\xee\x51\x7c\xaf\x8e\x8f\x65\x58\xc9\xda\x51\xd2\x81\x8f\xc8\x54\x32\x9f\x07\xbe\xe6\x3f\x0f\xfc\x5f\x8b\xd6\xdc\x1a\xc6\x7c\x59\x3b\x54\xaf\x2c\x5d\xe5\xa7\x94\x53\x1e\xeb\x6e\x0c\x5f\xb8\x1b\x6f\x31\x56\xc4\xf0\x28\xb9\x11\x45\x61\xef\xc6\xe5\x79\x1d\x90\xdb\x77\xf9\xfd\xb8\x96\xff\xe3\x7d\xfe\x8f\x78\x85\xec\x1c\x57\xe1\x59\xd8\xc9\x7d\xc9\x55\x92\x92\x8b\xb5\xb5\x44\x15\x54\xf9\xfc\x45\xe7\xf3\x17\x5b\x49\x5a\x8e\xcf\x24\x41\xf0\x9b\xac\x4d\x83\x06\x6b\xd7\x79\x46\x54\x8b\xaa\x28\x0b\x32\x96\xd2\x00\x03\x2f\x21\xee\xc6\xa4\x36\x66\xe2\xb3\x95\xf1\xd6\x03\x38\x54\x19\x82\x5b\x51\x0b\x10\xa2\xcf\xf6\xee\xcd\x50\x2a\x51\xa2\x97\x77\x8c\x02\xd6\x22\x4b\x58\x0f\xb9\x74\x98\xac\x0e\x18\xfb\xc2\xf4\x09\x8d\xb8\x19\x20\xe7\x03\x65\xe4\x32\x4a\x4a\xee\x03\x86\x0d\x96\x2b\x93\xf4\x52\xdb\xf4\x9a\xb3\x31\x8c\xac\x94\x36\x49\xf5\xf2\x14\x10\xcd\x7d\x3d\x4b\x12\xf1\xed\x61\x5d\x28\x25\xd4\xc2\xc9\xc9\x02\x33\x70\x5f\x3d\xfd\x88\xca\x0f\xcb\x55\x22\x87\xd4\x0d\xe9\x9c\xe0\xd6\x6b\xd7\x1a\x65\x33\x31\x2e\x44\xf9\x61\xc5\x1d\xbc\xcb\x7a\x0a\x88\x83\xf7\x06\xa1\xfa\x15\x9a\xf2\xe1\x69\x4e\xcb\x6e\xd3\xf8\x3d\xd1\xa3\x09\x05\x31\xdf\x77\x24\x41\xe4\x43\x47\x2a\x6b\x5d\x67\x66\x2a\x0f\x48\xbe\xf5\x09\x71\xfc\x47\xfd\xfa\x3a\xe5\x44\xcb\xdf\x67\x65\xa1\x8b\x3e\xc6\x6a\xac\x6a\x7d\xef\x63\x80\xc6\xeb\xda\x49\xcb\x25\x34\x94\x2d\x16\xf9\x62\x51\x2c\x16\xd3\x4e\x62\x75\x6f\x59\xa9\x93\x96\xd1\x22\xe0\xa9\xe8\xf3\x60\xf2\x38\xb6\x73\x9a\x8f\x45\x34\x7a\xb1\x0b\x5a\x4c\x23\x78\x98\x2e\x6d\x33\xab\x7d\x71\x0e\xfd\xa0\x4f\x23\x33\x23\x86\xe1\x0f\xcd\x84\x66\x84\xd6\x0b\xec\xd5\x0b\x04\xaa\x80\x99\xb1\x54\x9f\xf5\x77\xa7\xf2\x18\x33\xb1\xd2\xdc\x7c\x93\xf1\x60\xec\x4c\x07\x86\xd9\x28\xcf\x0e\x33\xf7\x21\xf0\x68\x15\x1e\xc6\xce\x6a\xb1\x62\x96\x84\x1e\x97\x9f\xdc\x9f\xe2\x59\x52\x38\x04\x6c\xe5\x24\x2c\xb1\x8a\x07\x93\x38\x29\x73\x3d\x80\xc7\x90\xa0\x3a\xd6\xde\xd0\x0c\xa9\xa0\x01\xf0\x23\x81\xe4\x46\x02\xeb\x39\xa6\x11\xde\xe1\xd0\x00\x39\x88\xbf\xb7\xd0\xb2\x78\x8d\x81\x08\x58\xcb\x09\xa4\x32\x56\xd0\x68\x90\x90\xa5\x2e\xc6\x46\x0f\xa5\x71\x4f\xa4\x21\xc3\x3d\xd8\x43\xa3\xab\x15\x96\x42\x20\xbe\xea\x0b\x33\x52\x7c\x44\xb8\xc2\x47\xdc\x58\x59\xf0\xee\xe6\xa8\xc4\x7f\x0a\xbd\x18\xc6\xe5\xb5\x0e\x19\xa0\x5d\x5f\x09\x84\x65\xed\x97\xfc\xa1\x2f\x23\xf9\xad\x5c\x2e\xbd\x3b\xee\xae\xcb\x72\x34\x60\x56\xab\xfd\xc9\x04\xa1\xaa\x09\xe2\x15\xb0\x14\xf0\x0b\xf8\xa1\x26\x65\xe3\x35\x65\x11\x94\x72\x73\x11\x34\x03\xda\x22\xc4\x69\x7d\x81\xaa\xba\x74\x29\x68\x43\xa2\xe6\x7d\xad\xa7\xa0\x81\x85\x97\xcb\x8d\x1b\xab\x2f\x3e\xba\x8d\xd3\x1e\xd2\xd4\x69\x44\xc3\x2c\x25\x5a\x52\x9e\x4c\x7c\x52\x17\x98\xea\x4c\xae\x1c\xe1\xa0\xb2\xfb\x96\x77\x3e\xfe\x0a\x0d\xae\x1f\x5b\x05\xca\x15\x9b\xdf\x31\x7d\xc9\x16\xc9\xb3\xf7\xcf\x80\x3a\x1b\x80\x26\xed\xaa\x4e\x2d\xba\x1e\x2e\x5d\x00\xeb\x74\xf2\xaf\x5f\x19\x10\xe8\xa3\xe8\xba\x3c\x49\x6c\x74\x5a\x9b\xe7\xff\x6e\xcc\xba\xf2\x8a\x8c\x63\x73\x35\xd4\x1b\xeb\xfc\x1f\x2b\x2d\xf0\xd2\xa5\x9c\x9e\x28\x18\x8a\x9e\xa8\xcf\x6a\xa2\x1a\x6a\x0a\xe5\x98\x3e\x9a\x69\xf9\x19\xfd\x91\xeb\xa3\x5f\x1a\x47\xf4\x85\x1c\xd4\xc9\xbf\x24\x78\xd5\x54\xf0\x24\x7c\xe9\x28\x10\xee\x91\xa7\xa2\x40\x88\x03\xbb\x9c\x3d\x09\x49\x4d\xeb\xcf\xe5\x5a\x52\x2d\x1c\xcb\xf5\x8a\xa5\x44\x79\xb2\xef\x7f\x29\xef\x89\x0c\xc3\xdf\x2d\x0f\x67\x6c\xff\x4b\xe9\x37\x57\xd2\x50\xc8\x96\xae\x44\x4b\xb2\x59\x35\x7f\x34\x5c\x35\xc4\x90\xeb\xfe\x05\x38\x50\xf9\x58\x15\x1d\xaf\xdc\x2f\x69\xda\x2e\xf4\xc5\x54\xfd\xf8\xf5\xf1\x7a\xb1\x78\x7f\x24\x5b\xdf\x7e\x87\x1f\x19\x63\xd3\x4c\xdd\x0d\x47\x7e\x69\x57\xf3\xe3\x4e\xdb\x74\x74\x9f\xca\x28\x46\x5f\xf3\xd2\xc5\xf3\xf7\xb0\xf4\x8f\x79\x7d\xa5\x4d\x91\x6f\x33\xae\x6d\x91\x6f\x32\xae\x6d\xb2\x87\x19\xd7\x46\xd9\xc2\xe7\xac\x36\xc9\x47\xf5\xe3\x70\xb5\x64\xa1\x5a\xaf\x87\x31\xd7\xf1\x38\xfc\x66\xbb\xc9\xc9\xff\x06\x6b\x71\x3a\x36\xf9\xb2\x6a\xea\xeb\xb0\x0a\x54\xa3\x63\x0b\x59\x3f\xee\x80\xc7\x6c\x91\xcf\xa6\xff\xa9\xe6\xcf\x71\xe7\x8b\xca\x5a\x2c\x76\xbe\xf8\x75\x76\xa8\x3e\x3b\xd0\xd2\x91\x34\x80\x92\xa5\xd1\xaa\xfb\x36\xe3\xf5\x93\xf6\x36\x80\x03\xe6\x76\x38\x4c\x9f\xad\x0d\xb3\x7e\xdc\x49\x2e\x1b\x9f\x50\xa0\xfa\x14\x36\x39\x4c\x0b\x9a\xf8\x39\xfe\xae\xaa\xe7\xf8\x0d\x16\x56\x87\xf3\x3f\xee\x5c\xdf\xa3\x29\x4b\xac\x0b\xbc\x07\x1c\x66\xbc\xa3\x8f\xe6\x77\x3e\x25\xd6\x2d\xdd\xf9\x64\xe2\xa7\x9a\x89\x75\x4b\x88\x1d\xd1\x0c\xc0\xc1\xe7\x66\x22\x55\x1b\x29\x1a\x71\x66\xd6\x44\x38\xe9\x6e\x64\x18\x66\xbe\x92\x1f\x51\x41\xac\x89\x20\x52\xb3\x14\x0d\x14\xa4\x2e\x65\x62\x5d\xd0\x5b\x1b\xbe\x70\xfd\x97\x1d\x48\xb2\x20\xab\xc8\x80\x9b\x99\x15\xdf\xd1\x94\xbf\x3e\x4e\x27\x76\x46\x27\xc2\xce\x97\xa5\x7b\xf8\xb8\x5a\x88\xc1\x7b\x1d\x7a\xff\x53\xe0\x84\xac\xbd\xeb\x77\xda\x76\x58\x9b\x3c\xd7\xa3\x4a\x14\x40\x29\x40\xcd\x81\x5c\x04\x0e\x70\xd7\x88\x3f\x05\x34\xfe\x04\xa0\x0a\x32\xf9\x3d\x5e\x4f\x2c\x1f\xee\x57\xae\x88\xea\xbb\x14\x78\x7e\xeb\xb6\x62\xb3\xa3\xda\xe2\x9e\x94\x10\xc2\x59\xd5\x49\x0e\x40\x5d\x96\xbf\x5e\x55\xdf\xac\x9a\x7e\x2b\xa6\xb6\xb6\xcd\x2b\xa6\xd4\x77\x6f\x5f\x3c\x0c\x4f\x0c\xf4\xd3\xe6\xd6\x44\x2c\x16\xbe\x35\x11\xcb\x25\x85\xa2\x2d\x48\xdd\x6a\xd7\xd5\x3d\x4f\x91\xd5\xd6\x83\xf7\x81\x4b\x66\xdc\xba\xbe\x5a\x2c\xda\x34\x64\x65\xe7\x40\x94\x71\x42\x6b\x22\x00\x7d\x70\xd8\x66\x0e\x79\xf3\xa5\x61\x69\x09\xe3\xa5\x2b\x09\xdf\x51\x55\x05\x0d\xc8\xd2\x57\x76\x9d\xd0\xac\x0c\x2c\x00\x0d\x39\xe4\x2d\xa8\xd5\x17\x55\x7d\x28\x5f\xd6\xf7\xf5\x62\xbe\xbd\xde\xda\x82\xde\xbd\xd8\x3e\x2d\xa6\x76\x68\x15\xd3\x4f\xa2\xb6\xd1\xce\x56\x9c\xfe\xd7\xa7\x12\xc3\xb6\x7e\x30\x83\xa5\xc5\x9f\xe8\xb4\xed\x96\xbe\x88\x83\xf7\x92\x9e\x35\x82\x25\x6d\x91\x5d\x74\x3e\xf3\x49\x27\xbf\x89\x73\x9b\xd3\x73\xc1\x57\x4f\xe2\xbf\xae\x6e\x52\x09\x4a\xda\x9c\xf2\x7b\x88\x4c\x6f\x75\xd0\x15\x49\x23\x47\x98\xe7\xa0\x66\xd6\xb3\x32\x0a\x10\x19\x9d\xad\xd8\x3a\x07\xa4\xea\xef\x46\xbf\x9e\x71\x28\xa8\x2a\x27\xaa\xf2\x32\x7a\x37\xeb\xb2\xa9\xb5\x79\x4f\xaa\x56\xa0\x46\xd9\x4a\x24\x5b\xa9\xe6\x3e\x81\xb9\x8f\xa8\x38\xb7\x63\x4b\x9c\xd7\xc3\x0e\x9d\xbf\x53\xdd\x3c\x18\xba\x27\x5e\x65\x47\x16\xdd\x9b\x6e\x3e\xe3\x8d\x90\xfa\x87\x1e\x46\x0c\x50\x05\x95\xda\xd6\x2d\x1b\xd4\x35\x97\x8e\xe6\x52\xbd\x6d\x45\xe7\xed\x78\xce\x09\xfd\x9b\x34\x1a\x6d\x7d\xe1\x8b\xc5\xbf\x5a\xbb\x9c\x70\xf6\x37\xa5\xa7\x95\x25\x25\x8d\xc8\xbf\xb1\xde\x7d\xe9\x61\xe3\xfb\x5f\x6b\x1a\x86\xd3\xd2\xaa\xee\x62\x2d\xeb\xe2\x99\x13\x1a\x96\x1e\x16\x6f\x57\x73\xbf\x41\xee\x8e\xca\xec\x9f\xad\x66\xbe\xce\xa5\xa6\x9e\x24\x27\xb7\xab\xaa\x58\x73\xc8\xbc\x38\xe6\x34\x1b\xeb\xc6\x2f\xd7\x3e\xfd\xf3\x59\x73\xa7\xd3\xd0\x7d\x0d\xb4\x1b\xc7\x6f\x7f\xb1\xe3\x7a\xb1\x83\x27\x4e\xe8\x56\x9b\x2c\x7f\x98\xe7\x43\x7a\x30\x24\xce\x0d\x3b\x57\x0a\x5c\xfe\xf6\x07\x3e\xfd\x9f\x66\xd2\x33\xad\x9b\x07\x1e\x06\x9d\x99\xfd\x5c\xb3\xfd\xab\x8a\x56\xa6\x7f\x5c\x46\x3e\x57\xae\xd3\x50\x2d\x83\x63\xa0\x6f\x9b\xab\xc8\xdf\xbe\x74\x39\x7c\x63\x6d\xdf\xbc\xb3\x25\xd4\xee\x6e\xf4\x77\x35\xbe\xe5\x20\xd2\x29\xad\x3b\x39\x4a\x75\xfa\x5f\x53\x2f\x44\x07\x63\x2a\xda\x7f\xaa\x74\x6d\xef\x8f\x3b\xba\x94\x0a\xf0\x9f\x61\x35\x20\x27\xe2\x59\xf2\x0e\xd0\xdd\xf2\x66\x5d\xad\x3b\x55\x8b\x4c\xd5\x72\x52\xb5\x72\x54\x2d\x12\x55\x2b\x41\xd5\x54\xd3\x5f\x4c\xcc\xf7\x6f\xa6\xa0\x9c\x66\xd6\x54\xca\xf3\x4b\x90\x23\x55\x5b\x80\x26\xa7\x74\x56\x6a\x40\x3e\x3f\x40\x7f\x0d\x63\x2b\xac\x9c\x07\x28\x20\x27\xea\xb7\x33\x63\xdf\xb4\x8d\x18\xb1\xa7\xec\x74\x68\xe6\xf2\x34\x61\x53\x3b\x53\x07\x91\x68\xe0\x7d\x8a\x54\x6c\x8a\xfb\xdb\x4f\x05\x62\xa1\xb1\x34\x34\x54\x75\xe8\xd4\xba\x7b\xf9\x52\xe0\x29\xdf\xd4\x2a\xa6\xa4\xde\x30\x9d\x4a\x05\x3f\x6c\xb7\x9e\x81\x1c\xfe\x9c\xe1\xa0\xa4\xea\xa0\x8e\x77\xaf\x56\x3d\xe4\x84\x76\x55\xd0\xd5\x9c\xf6\x94\x30\xd3\x95\xda\xa0\x91\x8c\xb2\x4d\x08\xdd\x38\x5b\xcf\x51\x9a\xa1\xf4\xf4\x3d\x1c\x62\x9c\xfe\x2b\x19\xa7\x7f\x06\x28\xf0\x08\xa3\x62\x37\xba\xa8\x53\x39\x83\x76\xca\x94\x1b\xdf\x76\x7b\xcd\xae\xb7\x5c\xd2\x0b\x60\x49\x2e\xca\x40\xff\xdf\x7b\xd8\x80\x2c\x12\xa2\xcb\xc3\xd6\xee\x1c\xe9\x9d\x61\x54\xc5\xae\xe5\x77\xe2\x46\xbd\xa0\x2f\x8f\xa7\x19\xfb\xd6\xab\x97\x1d\x1c\x62\xd9\x64\xa5\x6c\xf0\x71\xd9\xc3\x03\x2c\x1b\xc8\x20\xf8\x2b\x35\x60\x4e\x2f\xd9\x05\xc6\x0e\x5c\x2c\xa6\x86\xd1\xda\x85\x15\xe9\x54\x95\xd5\xe0\xa3\xfa\x00\x89\x3d\x53\xed\x9f\xea\x3b\xb8\xa1\x6c\x04\x16\xb9\x34\xc9\x79\xe0\xac\xed\x3c\x70\x6c\xd1\x79\xe0\x8d\x06\xf9\x65\xb3\x67\xd8\xac\x13\xc9\x56\xa0\x01\x5d\x59\x4e\xd3\x7a\xf5\xb5\xa9\x9a\x48\x35\x60\xd9\x88\xa4\x48\xb7\x17\xe6\x05\xe5\xee\x9e\xd7\x04\xf0\x38\x0d\x3c\x42\x37\x06\x9c\xc5\x00\xa3\xa8\x7c\x72\xc4\x9d\xa9\x61\x98\x47\x9c\x01\x05\xcc\xe9\xd4\x7a\xbd\x45\xc8\xa4\x03\x3c\xaa\x6d\x11\x2a\xe5\x4d\x05\xfe\x86\x71\xc4\x11\x6e\x65\x25\x09\xa6\x74\x05\x74\x2f\xdc\x4b\x8f\x9d\x82\xdc\xcf\x4e\xfa\xdc\xbc\xa0\x2d\x3a\xa4\x11\x95\xde\x3a\x30\x18\xfd\xbb\x4e\xe9\xe9\xe3\x4c\xa5\xd0\x7a\x27\x65\x1c\x03\xec\x8f\xe4\x75\xf4\xac\x60\x92\x9c\x94\x01\x77\x1f\xb8\xd7\x60\xf8\xdb\x94\xee\xe9\x43\xf2\x96\xb3\x21\x6f\x0c\xb8\xdb\x2a\xa7\xb3\x05\x15\xc3\xb2\x5e\xc1\x42\xa8\x68\xed\x71\x7a\xf0\x62\x16\xb4\x70\x8b\x3d\x6f\xb1\x00\xcc\x74\x71\x61\xb6\x40\xa2\x97\x69\xd6\x2b\xcb\x4b\x35\xfd\x50\x6e\xcc\x69\x47\x27\x5c\x8d\xcc\x23\x6e\x89\xf3\x0f\x6e\xf4\x50\x89\x0a\x19\xbb\x2a\xb3\x86\x9f\xde\x5e\xec\x16\x7d\xb5\x07\xdc\xe5\xd6\xf5\x5f\x8d\xa0\x34\x23\x92\x48\x11\xef\xb1\x97\x4b\xdc\xe9\xf5\x5b\x40\x2e\xd9\x6b\x6e\x5d\x54\x76\x4a\x5c\x1b\x29\x29\x1c\x4d\x8f\x6d\xbf\x32\x44\x28\xfa\x74\xa3\xf0\x6d\xd9\x97\x89\xe8\x70\x85\x8d\xb5\x61\x82\x1c\x31\xb7\x6e\xe9\x90\x13\x65\x9c\xa4\xbe\x0b\x80\x0e\x73\x87\x13\x49\xf5\xb5\xff\x03\x6f\x76\x69\x6d\xf3\x2b\x0a\x78\x3a\x62\x27\x9a\x16\x09\x3a\xe4\x8d\x07\xde\x0c\x69\x48\x67\xd6\xdd\x0b\x21\xce\x90\x37\xd8\xf9\xc8\x1c\x70\xb2\x0c\x59\x0c\xc8\xab\x5a\x62\xf4\x1b\x02\xeb\x94\xff\x0e\xc1\x49\xfe\x58\x67\x14\x3e\xcb\x61\x38\xa9\x7d\x4e\xdf\x2f\x2f\x7c\x0d\x17\xb8\xaa\x30\x08\x58\xd1\xaf\x5e\x8f\x71\x37\xbd\xd8\x92\x42\x36\xe4\x47\x3e\xef\xd0\x57\x7b\xc8\xcb\xa5\x90\x5f\xc6\x49\xce\xad\x63\x68\x6f\x49\x9c\x94\xc5\x56\x2a\x62\x74\xbf\xe7\x7a\x4e\x4b\x59\x1f\x9a\xf0\xcd\x14\x26\xca\xb7\x46\x39\x1e\xd7\xf6\x53\x73\xc8\x9b\x09\xd5\xe4\x77\x28\x07\x73\x88\x80\xef\xb3\xd8\x42\x3b\x8c\x2e\x1f\xab\x86\xfc\xaa\x21\xbc\xe4\x91\x26\x0a\xb2\x15\x85\xbf\x3e\x68\x8b\x06\xf0\x3d\x4e\xc8\x8a\xf5\xf1\x37\xed\x8b\xb1\xf4\x9c\x26\xcf\x56\x7c\x53\x82\x4b\x48\xdc\xb1\xf7\x29\x6a\x88\x4f\x71\xe5\x6d\x4d\x7a\x07\x5e\x6a\x6f\x65\xd3\x10\x8f\x00\x81\xaa\x03\x53\x5c\x20\x53\x9c\x7f\x83\xbd\x7c\x67\x05\x8f\x85\x7a\x03\x49\xb3\x7f\xe6\x24\x8b\x85\x99\xb0\x9d\x2f\x5c\x11\xc2\x4e\xdb\x56\xb2\xb3\x68\x70\x2b\xce\xc9\xe7\x48\x05\x76\x90\x25\xa4\x44\x8b\x8f\x28\xd2\xd6\x6c\x7a\x53\xd6\xa2\xd2\xc0\x50\x37\xe6\x64\x0d\x96\x90\x54\x87\x9c\x52\x4d\x64\x1e\x5a\x08\x67\x2c\x50\x76\x9d\x43\x51\x19\x3b\x97\xf4\xca\x96\x70\x9b\xd2\x8c\xd0\x12\x6a\xed\x14\x38\xe3\xa4\x2e\x0b\x9c\x7c\x24\x0b\xf0\x8a\xe9\xa9\xcf\x40\x82\xd2\x7c\x8b\xea\xfe\x51\x41\xb9\x25\x6e\xa5\x2f\xb7\x66\xf4\xa9\x36\x3f\xe4\x73\xec\xa8\xb8\xe7\x61\x7d\x88\xae\xe7\x24\xd5\xf8\x92\x06\x53\xdf\xcc\x98\x4c\x4c\x3c\x8a\xfb\xc1\xa7\x99\xb4\x21\x84\xf5\x08\x69\x1b\xf8\x18\x39\xda\x4c\x6f\x7c\x2e\x77\xbd\xeb\xc1\xfe\x6d\x72\x60\xab\x01\x01\x14\xfd\xca\x12\x09\x37\x4b\xf6\xe1\xde\xcf\xac\xdb\xa6\xf5\xe7\xa7\xf8\x53\x84\xec\x61\x6b\x37\x57\xc4\xb9\x28\x77\x49\x0b\xcd\x1e\xd5\xb6\x08\xab\x1d\xd1\xc2\x0d\xa1\x65\xff\x4c\x22\xa7\x4c\x22\xa7\xa2\x92\xe8\xd3\xe5\xc6\x8d\xf5\xe3\x66\x3d\x70\xe2\x3b\x6e\xd3\x97\xdc\x66\xb0\xc2\x6d\x86\xff\x1f\xf3\x8b\xb7\x66\x5d\xb7\xa7\xe6\x82\x03\xe7\x5a\xc7\xd7\x0f\xa5\xf7\x0d\x89\x08\x09\x48\x3e\xb2\x53\xfe\x9f\xa5\x9d\x16\x2b\x0e\xd1\x05\xd0\xe9\xd0\x0c\x15\x12\xf4\x87\x52\xfd\xf1\xb0\xd4\x4d\xd4\x1c\x59\xf2\x91\x95\x4e\x50\x72\x5f\xe9\xc7\xd9\x9a\x6d\x4b\x59\xfd\x20\x35\xb1\x53\x9a\xa9\x0a\xf1\x7a\x4b\x39\x2d\x56\x8c\x50\x22\xc6\xd8\xdd\x61\xc7\xcc\x19\x00\x02\x4b\xd0\x63\x58\xd1\xa7\x05\x6b\xca\xe7\xd1\x01\x2d\x58\x0b\xd8\x0f\xd7\x93\xf7\xbf\xc8\x64\xf0\xaf\x92\xc9\xa8\xf1\x4b\xa3\xc8\x14\x44\xfa\xdc\x6a\x39\xc9\xae\x00\xce\x26\x69\x34\x48\xb4\xce\xd8\x04\x0d\x59\x0d\x56\x78\x23\xe9\xa4\x76\x46\x9a\xb1\xe6\x4e\xa6\xc0\x08\x44\x54\x9d\x6f\xee\xb9\x7b\xde\xe7\x1d\x42\x56\x89\xfe\xb4\xa4\xf9\x09\x6b\x3b\x09\xbe\xe3\xa7\xa6\x6e\xe2\x35\xd8\xd4\x4d\x80\xd6\x07\xc8\xbc\x84\x54\x00\xf3\x22\x80\x79\x81\x72\xd4\xfa\x93\x38\x35\x02\x1d\xac\xd0\xe7\x5a\xa4\x6d\x24\xce\x4e\x20\x95\xa9\x1c\xd4\xa3\x0a\x3e\xd4\xfb\x52\x1b\xa0\x39\x75\xfd\x55\x5a\xed\x97\xe4\x81\x7f\x40\xab\x7d\xb9\x1d\xfc\x3a\xad\xf6\xdf\xd3\xea\x00\xb6\x6a\x5e\xed\x54\x5f\x53\x6a\xff\xc3\xdd\x5a\x34\x7c\xeb\x96\x96\x6c\xdd\x0a\xc1\x5e\x2e\x97\xce\x8d\x75\x73\xca\x7e\x61\xa7\xf5\x1c\xb3\x66\x4d\x3c\x74\x7c\xeb\x66\x8f\x49\x32\xe2\xf8\xd6\x95\x7c\x0e\x42\xcf\x79\x7c\xd1\xe2\xeb\xb4\x30\x49\xed\xa2\xd9\xb9\xb1\xa6\xc5\x07\x12\xeb\x55\x8c\x72\x25\xdf\xfe\xe8\x94\xbd\xb6\xcf\x3b\x6f\xb7\xb6\xe6\xf5\xc2\xd1\x58\x60\x51\xbb\xd9\x5e\xda\x32\xc3\x9a\x3c\xe6\xb5\x8c\x76\xfd\xc4\xe2\x74\xf5\xec\x5a\x3c\x6f\xee\x9f\x28\x7f\xa2\xd6\x0b\xa1\xea\xe9\x95\xd4\xce\xc9\xce\x56\xaa\x5c\x8f\x4c\x3e\x8e\xa7\x0f\x22\x9b\x14\xb4\x77\x42\x55\x13\xc8\xed\x55\x75\xce\x7f\x5d\xe7\x43\xa5\x40\xbc\x98\x4d\x10\x39\x35\x02\x00\x08\x60\x71\x1b\x81\xbb\xe7\x91\x25\x55\x99\x6b\x9f\xf8\xfe\x91\x53\x49\x18\x8c\xa4\x1a\xe4\x93\x4f\x15\xb1\x21\x9f\x82\x5a\xbd\x6f\x1f\xcd\x00\x32\x67\xdc\x6d\x7b\xf5\x0f\xe8\x5b\xe6\xca\x92\xdc\x75\xb9\xf5\xd2\xf4\x25\x97\xc3\xad\xd7\xa6\x8f\x3b\xcf\xa3\x90\xde\xf8\xf7\xe9\x8d\x7a\x7a\xf3\x7d\xba\x47\xbf\x9d\xf0\xfa\x4d\xf7\xc5\x2f\xbc\x1c\x1d\xa7\xa6\x76\x97\x10\x10\xaa\x8f\xd6\x42\xad\xe6\x15\x34\xb9\x7e\xc4\x00\x50\x35\x00\xb8\xf8\x4f\x8e\xac\xa6\x5d\xde\x08\x29\x9f\xbc\x3f\xb2\x2a\xef\x1c\xb5\x69\x61\x53\x6f\x04\xb2\xfc\x61\x5e\xe8\x93\x99\x8b\xdf\x9d\xcc\xcc\xba\xf5\x93\x99\xff\xe2\x60\x66\xef\xdd\xc1\x0c\x80\x7a\xb9\x17\x3e\x3e\x99\xf9\x2d\x55\x5c\x3f\x83\x11\xbf\x3c\x78\x89\x4a\x2a\x14\xb3\xeb\x51\x65\xcb\xf0\x21\x38\xab\x83\x69\xea\x9b\x01\xe2\x2a\xf5\x51\x60\x17\xc9\x92\xca\xb0\x73\x78\xc8\x69\x0e\x45\x3d\x53\x52\xb8\x51\x66\x26\xd2\xdd\x0a\x52\x53\xf1\x8e\x93\xdf\x93\x47\x15\x59\x69\xcc\x2d\xcf\x5e\x3a\x59\x49\x43\xce\x8f\xa5\x70\x8c\x14\x24\x68\x46\x20\x71\xbf\xcb\x6d\xad\x9c\x26\xa4\x8a\x61\xc9\xd6\x45\xe4\xb0\x11\xd5\x0a\xae\x9c\xf5\x64\xeb\x44\x2b\x69\x44\x78\xae\x11\xaf\xd4\x91\xb7\xe3\x6d\x27\x50\x1f\xc1\xfb\xf1\x5f\x7e\x47\x8b\xe2\x91\x26\x76\x21\x10\xbb\x8c\xd6\x31\xa0\x3e\x93\x73\xc7\x52\x10\x0e\x42\x90\xce\x73\x56\x2f\xd3\x92\x62\x60\xca\xc2\x55\x49\x29\xd5\x92\x52\xf6\x9b\xf9\xc5\x42\x00\x6d\x65\x7b\x86\x91\x59\xc7\x92\xce\xad\x48\x50\x19\x90\x19\x61\x9f\xd3\xb5\xfb\xff\xbc\x81\x0a\x00\x9f\xea\x1c\x1a\xaa\x5b\xd6\xaa\x1f\xfa\xac\xf9\xaf\xd6\x8a\x7c\x55\x2f\x5d\xf4\x81\x9c\xbd\x13\xb7\x72\xfa\xaa\xd1\x7c\x43\x13\xff\xba\xb8\xb5\xa7\xe8\x29\xf4\x37\x50\x3c\x47\x6d\xd9\xf4\xa1\x64\xa8\xc4\x86\xc5\xa2\x45\x73\x96\x37\xc4\x47\x5d\xd5\xce\x09\x63\x2a\x9a\x51\xc5\x12\x14\xbb\x49\xc7\xf5\xec\xab\x8f\x36\x42\xcd\x50\xf5\xfd\x60\x04\x1b\x1d\x54\xe6\xe9\x6c\x6f\xcc\x0d\x03\x3e\x1b\x20\x17\x58\xdf\xdd\x7b\x03\xbb\xe8\x13\x1a\xa8\x24\xc9\xe2\x37\xdb\xef\xca\x6d\x60\xc3\x15\x7d\xbd\xac\xfb\x71\xcb\x69\x81\xf8\xab\x45\x4a\xea\xee\xbc\x67\xa3\xff\x0d\x82\x80\x4d\x2f\x7e\xcf\x7a\x06\xbf\x67\x3d\x83\x15\xd6\x53\xd8\xa8\x9b\xba\xc2\x61\x2a\xbe\x58\xb2\x99\x11\xf0\x96\x31\x13\xc4\x36\x23\xe0\x38\x63\xd6\x94\xcf\xa3\x03\x1a\x6b\x03\x20\xf1\xff\x0b\x1a\x12\xd2\xeb\x93\x92\x4f\x6a\xc8\x23\xfc\x08\x27\x00\x33\x9f\xbe\xc7\x09\x21\xe2\x04\xd1\x08\xb0\x8e\xde\xd6\x01\x6c\xeb\x94\xea\x53\x03\xc0\x67\x1f\x6d\x71\xc5\x4d\xd5\x61\xb8\x38\xd4\x0c\x68\xb0\x02\xc3\xb2\xd3\x82\x06\xcd\x10\x5a\xcb\x1a\x66\xd0\xcc\xc9\x2a\x58\x6f\x20\x5c\xd7\x79\xdb\x0f\x20\xb8\x9c\xc1\x15\x60\xca\x68\xbe\x82\x84\x10\x42\x91\x34\x56\xc0\x55\xa9\x2b\xbc\xbf\xd7\x27\x6f\x3e\x62\x1c\x84\xb3\x4a\x1c\x15\x5a\xf9\x24\x55\x6e\xc2\x3e\xb2\xe1\x5b\x13\x1f\x45\xc5\x31\xf3\x15\x1b\x01\xc9\x2e\x07\x75\x76\x39\x58\x91\x70\x2b\x4f\x1b\x29\xf0\xcc\x11\xf0\xcc\x31\xb2\xcc\x80\xc7\x82\x0f\xd9\xe5\x90\x06\xd6\x6d\x33\x29\x19\xe5\xff\x0b\x7b\x0c\xd8\xaa\xe2\x8f\x4f\x83\xff\x03\x7f\x7c\x71\xf7\xdf\xf1\xc7\x87\xde\x0a\x17\xac\xb8\x63\x3c\xf9\x59\x61\x9b\xeb\xab\xf6\x3e\x80\xfa\xd3\x58\x22\x81\xa7\x73\xf9\xdb\x55\xae\x08\xee\x15\x47\x90\x6a\x24\xa1\xde\x7b\x4a\x5e\x9d\xfa\x35\x2f\x09\xdf\x9e\x99\x72\x54\xf2\x7a\x2e\x93\x7f\x5c\xaf\x70\x5d\xea\xea\xf2\x87\x79\x39\xa4\x3f\xae\x81\x85\xba\x44\x16\x6a\xe3\xe4\x97\x41\x18\xdd\x83\x27\x45\xfe\x27\x13\xc6\x1f\x4d\x4e\x7f\x0e\xe8\xdd\x23\xd9\x62\xdf\x65\xf2\x99\x15\x8e\xd8\x36\xa0\x84\xe3\x3e\xfd\x76\xcc\xe9\xf6\x41\x45\x0b\x30\x93\x89\x03\x15\x07\xe9\xcc\x4a\xfc\x2d\x76\x1a\x57\x36\xce\xfd\xc7\x60\x5a\x6c\x4e\xf8\x38\x16\x93\xcd\x3f\x1a\x65\xa5\xc6\x1f\x9b\xa3\x62\x33\x7b\x9c\x6c\x16\xd3\x3c\x7f\x1c\x4f\x44\x88\x26\xcf\x93\x3b\xb1\x19\xdc\x3d\x16\x22\xdb\x0c\xee\xf8\x78\x82\x56\xd1\xd6\x1f\x44\xf7\xe5\x3e\x64\xc7\x99\xa9\x3b\x4e\xaf\x66\xbc\xcc\x4a\x7c\xc6\x6e\x7a\x1d\x3d\xdd\x18\xdb\xf5\x5a\x39\xcc\x90\x20\x82\x55\x30\x61\x5b\xc5\x28\x3d\xd3\xb1\x8e\xa6\x80\xb9\x2f\xcd\xa3\x03\x7a\x73\x45\xe8\x95\xda\xb0\x78\x8d\xaa\x82\x51\x9d\x69\xbf\x36\x8b\x45\x3d\x85\x8f\x05\x5f\x4d\x29\x26\x22\xcf\x45\xb8\x37\x16\x5c\x77\xed\x6a\xb5\xd7\xf3\x43\x62\x18\x65\xe6\xed\xdf\x57\x32\x67\x73\x8e\x96\x0e\xca\x7e\xef\xcc\xd1\x3a\x4f\x56\xe2\x2b\x1d\x9a\xd3\xd8\xc6\xdf\xfb\x43\xfb\x11\x30\xf3\x76\xad\xfa\xe8\x98\x5e\x5e\xd1\x73\xa2\x5c\x7a\xba\xc3\xb9\x57\xad\xc6\x75\x56\xe4\x22\x18\x45\x23\x11\x6e\x3e\x8e\x47\x22\x9b\x70\x00\x08\x98\xdf\x0d\x0d\x8e\x6f\xca\x3f\x47\x2f\x2e\x1f\x63\x4c\xc5\xed\x29\x41\xac\xec\x13\x36\x2f\x3b\x75\x15\xdb\x21\x3b\x1f\x3a\x42\x03\xb0\xe3\xb3\x8b\xa1\xf2\x94\x63\xc5\x91\xf4\xf8\xe5\x60\xd9\x8b\x3b\x3b\x64\x17\x43\x2a\x74\x26\xf5\xd9\xf9\x50\x93\xcd\x5e\xbc\xac\x94\x49\xd4\x6e\xb1\xae\x39\x46\x00\x6a\x39\xb1\x76\xae\x56\x9a\xbe\x46\x6e\x0c\x0c\x1a\xba\x67\x51\x9e\x72\x71\x2a\xdc\x62\x8f\x37\x12\x7a\x55\x78\x34\xa1\xdf\xef\xe8\xeb\xb1\xb4\xb7\x54\x6e\x7b\xaa\x69\xb9\x42\xf0\x6c\xf2\x97\x51\xb1\xf9\x30\x2d\x26\x9b\xbe\xd8\x7c\x8c\xa4\x41\xfe\x8c\xa7\x53\xa1\xe1\xef\x3e\x72\x13\x8f\xa5\x4e\x80\x3f\x78\x3a\x9b\x39\xd2\xf9\x0f\xbb\x3f\x34\x0c\x33\x63\xdc\x4a\xdd\x96\x67\x5d\x06\xd6\xdd\xa8\x98\x3c\xc6\x63\xfe\xd0\x9d\x06\x89\x98\x14\x32\x10\x6f\x50\xed\xba\xd2\xeb\x8b\x6f\xf5\xcc\x16\x61\xec\xe0\x8e\x8c\x6c\xad\x30\x75\x5d\xc2\xa0\x9c\xdf\xa2\x67\x87\xac\xad\xe1\x0c\x4d\xf4\x3a\xd1\x81\x2d\x0e\xb4\x4b\x6e\x39\xb5\x97\x87\x12\x36\xba\x3d\xf9\xbb\x3f\x90\xbf\xc1\x81\x1d\xb2\xaa\xf0\x32\xac\x5d\x6f\x86\x6c\xe3\xfb\x9d\xa3\xf1\x90\x9e\xc7\x80\xba\x59\xe1\xd1\x16\x0d\xe9\xfe\x11\xcd\x88\x23\xdc\x96\xa7\xb1\x55\x7d\x35\x7f\x1e\xcb\x4f\xdc\xf4\xec\x12\x72\x5a\x88\xf5\x51\xb3\xa1\x5a\x0f\x68\x4c\xae\x83\x24\x75\x08\x58\xb2\xe4\xc5\x2f\x4b\x2e\x87\x7a\x22\x9c\xcb\xa1\x25\xdc\xaf\x81\xa7\x71\x1e\x86\xed\x2e\xb1\xee\xd5\xaa\x05\xe1\x99\x54\xc4\xf1\xd1\x6e\x52\xb9\x67\x7a\x4f\x0d\x7e\x1e\x2f\x6d\x5f\x2f\xe0\x07\xf9\xdd\xde\xd2\xae\x1f\x53\x56\x8e\x5d\xea\x7b\x6e\xd0\xe0\x8d\xeb\x07\x4e\xf7\x8f\x39\xf5\xad\xc7\xa1\xb4\x2b\x86\x0f\xdf\x87\x9d\x1b\x74\xbb\x1d\x52\xf8\x0c\xb1\x6f\xe5\x1b\x71\x7c\xab\xc7\x51\x63\xcc\x3a\x7b\x82\xed\x55\xb9\xf9\x0c\xad\x69\xa2\x8c\x63\x02\xeb\xd4\x24\xd2\x63\xbb\x3c\xc4\x0c\xac\xe9\x83\x89\xe1\x6c\x02\xf7\xd8\x33\x23\xda\x02\xd6\xea\x9d\x01\x99\x36\x7d\xb0\x0e\xb8\x19\x51\x6e\xc5\xdc\x1d\x20\x8b\x43\x16\x8b\xf3\x25\x1a\x64\x87\x1c\x9d\xd8\x9e\x4d\xec\x94\x4e\x27\x76\x8c\xce\x7d\x53\x06\x8b\x6c\xc5\xdc\x9a\x3c\x3e\xa6\x93\x51\x4e\x12\x2b\x14\xec\x6a\x88\x1e\x15\x5b\x1e\x8d\x64\xc7\x95\x29\x0d\xf4\xdd\x8d\x3d\x16\x2d\x7d\x2b\xd5\xee\x24\x65\xcf\x43\x2b\xbc\xd5\xde\xe6\x05\xfb\x21\xfd\x0b\x50\x4c\x8d\x3c\x42\x7d\x0b\x39\x3c\x41\x68\x90\x98\x81\x75\x30\x36\x23\x82\x2a\xfe\x56\xea\x46\xb0\x7d\x98\x4e\x74\x7c\xeb\xdb\x13\x0b\xad\x83\xbf\x1c\xdf\x9a\x26\x38\x3b\xce\x86\x6f\xf5\x27\x2c\xb4\xfa\x13\xc7\xb7\xc6\x7d\xc9\x34\x5c\x22\x9a\xe2\x40\x5b\x01\xa4\x8a\xc4\xe1\x40\x6f\x57\xba\x05\xed\x6b\x57\xa8\xb0\x3e\xf0\x35\xac\x62\xf1\x30\x34\x43\xeb\x49\x10\x47\x30\x68\xd3\x85\x17\xaf\x72\xf1\x22\x48\x95\xca\x42\x57\xcc\xbd\x52\xe7\x40\x6c\xc9\x84\x9a\x6b\x8f\x34\xdd\x2c\xc4\x78\x24\x8a\xcd\xc7\x6c\x93\x6f\xc6\xa3\x99\xc8\x36\xdf\x21\x98\x3b\xb1\x59\xf0\x07\xb1\x59\xfa\xff\xf8\x83\xe0\x38\xdc\xd0\x3d\xf2\x3c\x66\x56\xcf\x8b\x45\x8b\x34\xda\x8e\x60\x30\x24\xd9\x89\xc5\x02\x47\xab\x5f\x99\x70\x84\xae\x27\xea\x95\xea\x17\x2b\x3f\xeb\x7b\xe4\x6d\x89\x5b\xe4\xcc\x09\xac\xaf\x78\x0a\xa0\xc4\x64\x73\x9d\x29\x0b\x59\x60\xa5\x2e\xc7\xc9\x08\xac\xfb\xd0\x30\x42\x94\x38\xd8\xcf\xe3\xd2\x19\xa6\xde\x0c\xd6\xa5\x19\xf5\xa9\xf5\x27\xa1\xb5\x14\xd1\xa7\x6d\xe2\x61\xd8\xb6\xbe\xe7\xf6\x3d\xfc\x22\x72\xf8\xa3\xd0\x0e\xad\x51\xa8\xb5\xd5\x0f\xe6\xca\xae\x46\xfb\xda\x3a\xb8\xb3\xdf\xee\x63\x3b\xa1\x17\x91\x9d\xd0\x1f\x33\x3b\x06\x28\xfc\x09\xbf\x6d\x8f\xbe\xb4\xed\xc3\x2e\x7d\x6d\xdb\xfd\x2e\x3d\xf2\xe1\xef\x09\xfe\x9d\x4d\xec\xad\x16\xbd\x38\x40\x93\x4c\x42\x47\x59\x28\x5e\xd0\xdc\x35\xb4\xfa\xf3\xa5\xf2\x76\x13\xaf\x3a\xf4\x52\x5d\x5b\x12\x00\xd2\xbe\x61\xc4\xd6\xfe\x9d\x09\x8f\x84\xfe\xdb\xde\xc6\xef\x3e\xe1\xf8\x2e\xf7\xd8\x56\x0b\x39\xeb\x9f\x66\x60\xa5\x6b\xc2\x95\xef\x06\xde\x62\x61\x86\x66\x20\xef\xf7\xb7\x00\x59\x1d\x18\x46\x68\xc2\x2f\x91\x06\xc2\x72\xb2\x03\x24\x29\x72\xc6\xbb\x3d\x78\xaf\xba\xd3\x6c\x2b\x83\xc1\x9c\xaf\xcd\x1c\x0e\xea\xf2\x98\xcb\x31\x6d\xc8\x0e\x36\xdb\xef\x6d\x0a\xb7\xf5\x09\xe5\xea\x05\xa5\xd6\xe1\x63\x18\x6c\xf7\x13\x6f\xd4\xe2\x72\x85\x78\x83\xd9\x64\x95\xa6\xdf\x67\x2c\xb5\xac\x90\x58\xdd\x57\x44\x0b\x7d\x45\xa8\x88\xd4\xca\x63\x04\x95\x01\x79\x2f\x1e\xcd\x9f\x0f\x9c\x28\xbb\x95\x8b\x47\xb3\x48\x39\x51\xa6\x9b\xc9\x31\xff\x08\xf3\xa2\xf9\xab\x61\x98\xed\x83\x3f\x95\x89\x1f\x27\x8b\x85\xd5\x6a\x7f\xd1\x6f\xa4\x13\xa9\x18\x0f\x76\xac\x1e\x96\x04\xd5\xa1\xce\xd0\x03\xab\xa2\x06\x3f\x8f\xed\xcb\x43\x9a\xb3\x16\x46\x53\x01\xbc\x40\xa7\xac\xe5\x4c\x77\x0b\x67\xaa\x31\xee\x0c\x73\xa6\x1e\x9d\x33\xbf\xcb\x1b\xd3\xc6\xb5\xa8\xbc\xbe\xfa\x8f\x26\x47\x02\x80\x59\x84\xbc\xe5\x8d\x86\xf2\x41\x0c\x0c\xb3\xe4\xf5\x1a\x67\x77\x74\x7e\xcc\xe9\xf0\x90\xd0\x1e\xe3\x6a\x47\xcc\x1b\xfd\x03\xda\xcf\xd0\xab\x6e\x8f\x31\xd6\xcf\xb8\x73\x66\x18\x66\x8f\xcd\xac\xfd\xd8\x0a\x7c\xad\xd0\x72\xc6\x2e\x74\x53\xee\xbc\x91\xde\xd1\xf4\xce\xa3\x67\x1d\xeb\x4f\xbb\x4d\xe8\x29\xfb\x56\xcb\x9c\x1c\xd3\xc9\x31\x2a\x8c\x5c\xb0\xd6\xee\xa9\xd3\xfa\xc2\x4e\x0d\xc3\x3c\x65\x7f\x11\xe7\xf4\x33\xdb\x71\x5a\xbb\x1b\x98\x80\x66\x5c\x52\xe5\xe6\x6d\xa9\xcc\xca\x66\x40\x23\xb6\x3d\xc3\x78\xe2\xe6\x25\x55\x6f\x5a\xa7\xa6\xfe\x95\xeb\x43\x7a\x7d\xe8\xd1\x1d\xe2\xd4\xc6\x38\x3c\xa0\xd7\x57\xf4\x3b\x41\xbf\x2b\x2a\xed\xf9\x6b\x69\xb1\xdb\x63\xdf\xae\xcd\x1e\xa1\x5d\xb6\x77\xcc\xdd\xae\x47\x1f\x38\xe3\x56\x0f\xf7\xf2\x00\x1e\xe3\xc8\x6d\x79\x92\x39\xd3\x8e\x48\xd0\x46\xf7\x88\xb3\x07\x4e\x51\xf1\x01\x0a\x1e\x71\x28\xf3\x20\xb5\xf6\x4b\x1b\x93\x21\x14\xb2\x04\xa7\x87\x82\x0d\xf0\x61\xe0\xeb\xf1\xc0\x17\xbe\x07\x6c\x7e\x4f\x33\xc1\xe6\xf7\x68\x76\x72\x6a\x12\xc3\x78\x18\x99\x3e\x50\x50\x04\x49\xc3\x30\xbf\x07\x2c\x84\x32\x01\x71\x1e\xb8\x74\x59\xf7\x3d\x30\x87\xd2\x1e\xeb\x81\xbf\xa8\xb7\xa7\x80\x2c\x9d\x2e\xeb\x9a\xd8\xcc\xaa\xbf\x0b\x86\x0d\x72\xda\x02\xe6\xfd\xf5\xca\x1c\xf2\x4a\xac\xde\xfc\x0e\x9b\x6a\xf9\x11\x91\x7e\xbd\x32\x0f\x05\x55\x75\x07\x3e\x6c\xfd\xb7\x31\xcf\x62\x61\x3f\x70\x9a\xec\xd9\xa7\xd5\x94\x8e\x26\x9c\xfe\x8d\x2c\x6b\xbe\xad\x59\x97\xbc\x3d\x70\x76\x55\x95\xb9\x1e\xd0\xc4\xda\x37\xbb\xd6\xf5\xc4\xea\x3f\x98\x40\x55\x37\x0e\x73\xde\xc8\x89\x33\xe0\xc0\x29\x74\xdd\xed\x8f\xec\xde\x33\x81\xf7\x17\x84\xfa\xa5\xf5\xca\x90\x5b\xd7\x7d\xd3\x97\xa6\x1b\x0e\x67\xdc\x6d\x7b\x4e\x65\x14\x72\x28\x20\x5b\x59\x76\xa8\x71\xba\x3e\x95\x0a\x5d\xd6\xf5\x81\xda\x54\xce\x11\x67\x45\x66\xf6\xdc\xbe\x47\x87\xc4\x09\x32\xf3\x88\xd3\x33\xe5\x42\x24\x60\x63\x99\x45\x9c\x22\x00\x8c\xab\x32\x44\x58\x1f\xd3\xe1\x21\x7d\xe0\x2b\xc0\x35\x95\x52\x92\x61\x98\x22\x6c\xb0\xb1\x68\xc0\x98\x11\xe7\x1c\x5f\x99\x2e\xe2\x12\xf5\xfb\xed\xca\x2c\xee\x08\x5e\xff\x9c\x5c\x99\x3b\xc4\x2b\x9f\xbb\x56\x91\x13\x8f\x10\x39\x4d\xc4\x49\x25\x4f\x02\x68\x75\x66\x8d\xc2\xc6\xcf\x9c\x53\xe9\xce\xea\x81\xd3\xed\x18\x48\x0a\x32\x4d\x03\x5e\xf9\xae\x9a\xa1\xef\xaa\x9b\xd8\x3e\xae\x6d\x91\x71\x9f\x8e\xfb\x1e\xdd\x6a\x49\xcb\x2b\x60\xaf\x5a\x34\xe6\xf6\x25\x3d\xf8\xd3\x9e\xd2\x1b\x61\xcf\xac\x1b\x41\x67\x91\x3c\x44\x91\x3e\x40\x7b\x34\xec\xdb\x67\x74\x3f\xb6\x8b\x80\x9e\x04\xf6\x11\xa7\xc3\x99\x2a\xd0\x97\xbf\xe8\x43\x2b\xa3\xe7\x07\x75\x98\xf8\xda\xe5\xc8\x04\x8e\x32\x71\x83\x0a\xfd\x43\xca\x43\xfb\x94\xfe\xfc\xbb\xdd\xde\xa1\x1b\xc1\xb3\xfd\xc1\x3e\xa5\xe7\x27\x76\x7d\x53\xcf\x06\x74\x36\xf0\x68\x9b\xd0\xa3\x13\xfb\x82\x26\xb6\xeb\xd1\x9f\xd7\xf0\xf7\x09\x3a\xfb\x24\x68\x7f\x6e\xbf\xdb\xdb\xf4\x60\x6e\x8b\x70\x49\x96\xf0\xbf\x8a\xa0\xdc\x96\x04\xa5\xb4\x94\xd6\xb6\xc8\xd2\x57\xa4\x72\x78\xa5\x62\x85\xba\x5e\x69\xc9\x7b\x64\x12\xa7\xd1\x48\x4b\xed\x0b\xab\x67\xa6\x84\xe6\x80\x20\xee\xcd\x94\xce\xee\x80\x45\x6c\x31\x96\x76\x1e\x0a\x3b\x29\xa4\x32\x33\x63\xa9\x61\xe4\x5b\x8c\x3d\x14\x25\x03\xb6\xf7\x28\x5d\x30\xe5\x98\x8a\x1a\x0e\xbb\xd5\xa9\xc4\x69\xce\x1b\x69\xe3\x1c\x59\xbd\xb7\x98\xdb\x6f\xcb\x6a\x41\xb3\xa5\x13\xb1\xb7\x69\x20\x67\xfc\x46\xa0\x9f\xed\xa5\x13\x4a\x6e\x75\xd9\x62\x2c\x36\x8c\x9c\x31\x96\x14\xa8\x60\x10\x00\xd9\x88\x19\x46\xd2\x12\xec\x0d\x97\x28\xae\x35\x47\xb1\xfd\x25\x95\x8d\x46\xd0\x22\x0a\x5e\x32\x2a\x98\x00\xca\x17\x33\xc6\x82\x83\xce\xdf\xed\xb6\xee\xb3\x6c\x3c\x6e\x36\x69\xb6\xc5\x98\x40\xde\xb2\xec\xfd\xcf\xac\x1c\x1b\xbb\x2d\x0c\x43\x00\xa6\xcb\x2b\xe6\x93\xe7\x1c\x7d\x23\x40\x22\x53\xbf\x78\x6f\x21\xbd\x6c\x43\x2f\xac\x69\x00\x1d\x89\x00\x0a\xe7\xcf\x76\x4e\x7f\xce\x6d\x55\x12\x46\x5b\x56\x87\x0a\x29\x3a\x66\xaf\x4f\xdf\xd5\x23\x6f\xc4\x6a\xfa\x36\x5a\x4e\x86\x11\xa6\x90\x21\x86\x05\x97\x6b\x19\x48\x2e\x3b\xc5\xb9\x87\x29\xdc\x65\xa2\x62\x8f\x2f\x25\x6b\xfc\x3f\x7f\x34\xd2\x46\x9c\x72\xe2\xe4\xc0\x40\x37\xda\x9e\x03\x13\x9a\x7a\x12\x77\xe3\x20\x0d\x23\xaf\xa4\x97\x5d\x06\x74\xc2\x30\xcc\x46\x43\xe0\xd4\x84\xae\xf0\x56\x67\x67\x1b\x66\x07\xdb\xb8\x11\x4c\x68\xfd\xfb\xf0\xd6\x0e\xe8\x34\xb1\x43\xda\x9f\xd8\x19\x3d\xf8\xcb\x4e\x6a\xb6\x0f\xfc\xb4\x66\x09\xbc\xc5\x98\x5f\xf5\x74\xff\x31\x9d\x3e\x64\xc8\x9b\x57\xac\x7b\xf0\x98\x15\xa3\x62\x22\xb2\x89\xbd\x29\x9e\xa6\x3c\xc5\xa3\xab\xf0\xf1\x81\x8f\xb2\xcd\x00\x6b\x14\x9b\x3c\x93\x27\x5a\xfa\x7d\x94\x55\xfc\x3e\x8a\x06\xd6\x1f\x2b\x9e\xfd\x6e\xd6\x63\x54\xe2\x76\xc1\xa8\x61\x6a\xb3\xc8\xab\xa7\x40\xf1\xdd\x95\xc3\x79\xdc\x37\xcd\x1d\x9a\xae\x6b\xf5\xc0\x58\x00\x92\x70\x4c\xc7\xab\xd2\x89\xee\x96\x1e\x93\x18\x4d\xee\xc4\x58\x4a\x22\x8f\xe3\xcd\xc7\x34\x6c\xe2\xb3\x2a\x07\x7d\xa5\x99\x92\x1a\xb1\x3f\x7f\xe8\x22\x7f\x28\x80\x8e\x70\xbf\xb6\x60\xbf\xb6\x9c\x9d\x2f\xb9\xd3\x68\xe4\x3a\xbe\x1f\xe4\xe4\xd2\x64\x23\xbe\x37\x73\xd8\xc9\x4e\x6a\x06\xc4\x81\xa9\x8f\x68\x41\x9c\xe2\xdd\x4e\x2c\x96\x4e\x01\x92\xa8\x9c\x57\xe6\xe6\x9e\x23\x00\x20\x0b\xe2\x64\x6e\xe0\xb1\x5c\x99\x3a\xdd\x08\x3b\x07\x28\x7e\x28\x00\x8c\x5b\x54\xed\xdd\xa5\x74\x41\x01\x9d\xc9\x77\x93\xaa\x33\x53\xb6\xd3\xc8\xe9\x6f\xba\x94\xff\xef\x8e\x61\x40\xbf\x42\x37\x6f\xb6\x11\xbc\xa0\x83\x3a\x22\x45\xe0\xa1\xd6\x17\xf4\x10\x63\xe9\x55\xfd\x45\xc4\xae\xf6\x3b\x76\x1d\x7a\xe9\x4e\x3d\x89\x3c\x0a\x52\xf5\x77\x46\x37\xe6\xcf\x76\x50\xf6\x37\x07\x1c\xaa\xa5\x49\x58\xe0\xd3\x98\xbc\x25\x2c\xaa\x02\x39\xe4\x2c\xc5\x81\x68\x1c\x99\x93\xb7\x0f\x87\x20\xf1\x23\xcb\x57\x11\x24\xcb\x0d\x23\xf8\x18\x43\xc2\xd7\x4a\x14\x99\xae\xa0\xc8\x1c\xf7\x78\xf4\xd1\xc2\x24\x2b\x28\x52\x20\x8a\x14\xd2\x15\xc4\x12\xf8\xf3\x74\xb1\x08\x14\xf0\x05\x08\x7c\xa8\x91\x18\x62\x9c\x03\xe6\x9b\x09\xb0\xff\x72\x0e\xd3\xfa\x04\x2a\x5c\x29\x5b\x4f\x2a\x5c\xa9\xbc\x4c\xd0\x94\xa5\x1a\x57\x42\xbf\xfd\xe3\xce\x8e\x42\x9a\x01\x22\xcd\xc5\x42\x26\x13\xe0\x24\x9b\x4d\x5a\x6c\x31\x16\xad\x48\xe6\x1a\x79\x06\x0a\x79\x46\x72\x99\x56\x91\xa7\x4a\x64\xea\x17\x91\x67\xac\x91\x67\xa2\x90\x67\xa2\x90\x27\xae\xa2\x2a\x29\x91\xa7\x7e\xc1\xa8\x8f\xcb\xb5\x89\x05\xe4\xb9\x21\x89\x0f\x67\x2d\x27\xc2\x03\x97\x12\x79\x4a\x68\x0d\x25\xf2\xcc\x71\x55\x04\x22\x4f\xfe\x11\xf2\xcc\x25\xf2\xf4\x99\x70\x79\x03\xb5\xb0\x42\x37\x47\xe4\xe9\x1f\x7b\x8b\x85\x7e\x91\x98\xd4\x37\x0c\xbf\x8e\x49\x03\x8d\x49\x39\x8d\x90\xc8\xf0\x8f\x30\x29\xb6\x71\x23\x18\x5f\xd6\x50\x69\x08\xa8\x54\x00\x2a\x8d\x00\x95\xc6\xcb\xe5\x8d\x35\x3a\x5c\x33\x1d\xe6\xaa\x1f\x6b\x16\xc1\xe8\xb5\x08\xe1\xa5\x42\x7d\x3f\xd6\x51\x5f\xe0\x1e\x01\xf2\x0b\xac\x98\xa3\x07\xa6\x1b\x41\x63\x29\x3a\xd1\x84\x8d\x06\x0d\xbf\x71\x2d\x68\xca\x84\xbb\xed\x2d\x16\x02\xbe\x82\xd6\x92\xd7\xbe\xf5\x7c\x68\xa6\xc8\xc5\xe6\xf2\xfd\x82\xcb\xf7\xc5\xe2\x9c\x16\x2c\x44\xb9\xaf\x65\xef\xd0\x29\xc8\x34\x31\x75\x13\x2d\x35\xc9\xac\x7f\xd8\x2d\x0c\x42\xca\xd8\xe5\xe1\x62\x11\x32\x56\xf4\xf0\x07\x6a\xed\x4e\xed\xad\x96\xd3\xc2\xb8\x33\xe6\x94\xe9\x0a\x7f\x11\x67\x2a\x85\x2b\x4c\x47\xd9\xca\x67\xb1\x75\x69\x26\x20\xe3\x71\x6b\xea\xbb\x26\xc7\xab\x0b\xc3\x90\x95\x50\xe1\xce\xff\xbc\x43\x6c\x9f\xfc\x2f\x16\x18\x78\xe8\xe1\xe5\xdb\xb5\xe9\x6b\x03\x13\xed\x12\xb4\xea\xc4\xfe\x80\xcc\x41\x1a\x94\xdd\xee\xd1\x49\xcf\x23\x74\x0e\x0c\xb4\x0f\xbc\xf5\xbc\x8c\x7f\x53\xd5\x0c\x0e\x88\x4a\x53\xa7\x02\xc5\x64\xfc\x98\x08\x1b\x2b\x4c\xb9\xbd\x43\xf1\x98\xc0\x97\x87\x04\xbd\x7f\x53\x6c\x2e\x96\x20\xaf\x1e\x43\x17\xbe\x8e\x39\xc8\x9f\x67\x9d\xae\xdd\xa3\x5d\xf6\xb6\xff\xa7\x1d\x3c\xca\xae\x9d\x8c\x39\x3d\x19\x73\x10\x53\x7b\x76\x97\xd0\x6e\x95\x35\x18\x73\xba\x31\x80\xbc\x53\xb2\x74\x8a\x72\x11\x94\x50\x59\x10\xa7\x07\xb2\x02\x7e\x57\x62\xaf\x33\x9c\x4a\x37\x69\x4c\x9f\x39\x9d\x3e\x73\x0f\x4f\x4b\xe8\x49\x46\x48\xcf\xca\x52\x76\xe6\x9c\x95\xad\x6c\x17\x9c\x6e\x17\x1c\x43\x7d\x9d\xd6\xa7\x81\xfd\x3c\xc6\x19\xd4\xab\xca\x8a\x1e\x39\x05\xf1\x1d\xab\x7d\x7d\xe1\xf4\xeb\x0b\xf7\xa8\xc4\x48\xaf\x07\x4b\x42\x1f\x47\xe6\x29\x41\xe1\x59\x26\x9e\xaa\xeb\xe6\x8b\xca\x55\x6b\xb5\xa4\xe5\x39\xd8\x25\xe3\xd6\xe8\xd0\x0c\x60\x96\x2e\x3b\x7c\xe5\x3c\xcc\xe6\xf5\xc3\x30\xe7\xd2\x30\xcc\x0b\xb6\xd5\x26\xcb\x4b\x86\x6b\xdb\x99\xdb\x7a\x25\xcf\x48\xf5\x01\xa2\x46\xd0\xed\x11\x29\x8b\xc3\x74\x3c\x4e\x38\xbd\x3c\xe6\x84\x0e\x01\x64\x86\xf0\xfb\xe6\xf3\x20\x89\xc7\x8f\xd3\x2c\xb4\xdf\xf6\x63\x68\x6b\x28\xdb\x5a\x2e\x1d\x75\xca\x0f\x1d\x35\x0c\xd5\x45\xc3\x30\x67\x4c\x0b\xe8\x0f\x9c\xf9\xc8\x04\x09\x34\x1d\xaf\xdc\x9d\x8d\x42\x1b\xf7\xd1\xad\x50\xfb\x4a\x0a\x44\x79\x85\xb5\x03\x24\x90\x5a\xce\x41\x7e\x57\x20\x73\xa9\xa4\x22\x9c\xe2\x71\x9f\x6e\x68\x91\x68\x16\x81\x3c\x25\x85\x1e\xbf\x14\x7a\x2e\x41\xe6\xe9\xd1\xef\x07\xf6\x29\xed\x81\x10\x33\x9c\xd9\x73\x90\x7c\xba\x52\xec\x09\x95\xd8\x13\xd3\xe4\xbd\xc8\x53\x80\xc8\x33\x55\x22\x8f\x94\x78\xf0\xb3\xc3\x03\x3a\x3c\xf0\x56\x44\x1e\x4c\x5f\x11\x77\x66\x6b\xe2\x8e\x2e\x74\x36\xa0\x67\xd2\xfe\xa6\x3f\xb7\x25\xf6\xba\xe8\x5c\xc8\x21\x25\x28\x01\xb5\x50\x02\xba\x92\x09\x87\x87\x34\x5f\x71\x20\x2d\x27\xb4\xbc\x06\x2e\xd3\xa3\x15\x7d\xc0\x18\xdf\xdc\xae\xef\x99\x6e\xd8\xf0\xa9\x5f\x57\x1e\x8c\xeb\x45\xdd\xb0\x71\x31\xe3\x0d\xde\xb8\x16\x0d\x9f\x86\x8d\xcb\x19\x6f\xf8\xb4\x96\x84\x09\xde\x52\x7b\x83\x3a\x94\x01\xaa\xb7\x92\x15\x3f\x15\x3e\x7b\xdb\xf7\x51\x3f\xfd\x05\xfe\x4e\xbf\xc1\x5f\x9c\x00\x3e\x16\xbc\x80\x07\x54\x5f\x7f\xea\x23\x1b\x53\x29\xc9\xbf\x2d\x95\x21\x40\xa2\x03\xe5\xaa\x60\x43\x89\x9b\x79\xc8\x4f\x49\x30\xc9\xc9\x62\xa1\x51\x2f\x3c\xfb\x7d\x3a\x65\xfc\xd1\x0c\x68\x6c\x16\xb4\x7f\x47\x68\xef\x98\x13\x7d\x83\x38\x55\xb7\x5b\xdd\x9e\xed\x5b\xfb\xbe\xa4\x99\xf5\xcb\xa5\xbb\x3d\x6e\xfb\xd6\xe1\xcb\xfb\x9c\xde\x18\x72\xa6\xdf\xde\xe7\xcc\x8e\x6d\xdf\x4a\xde\xa7\x17\x3d\xdb\x77\xf7\xf7\xbc\xf7\x39\x97\x87\xb6\x2f\x35\xa3\x56\xd3\xbf\xdb\xf2\x45\x7b\x28\x28\x89\xf0\x71\x36\xe3\xe9\x28\xdc\x1c\x65\x13\x31\x9e\xf1\x74\xb3\x98\xbc\xa6\xc2\xde\xfc\xa3\xb1\x31\x25\xce\x12\xd9\xfd\xb4\x93\xba\x85\xfa\x98\x0d\x8f\xc0\xc3\x2e\xdb\xbb\x38\xd0\x81\x67\x18\x2d\xc6\x70\x68\x68\x6b\x02\x4f\xcc\xc5\x3c\xb4\x5c\xd9\xf7\x5d\x55\xb0\xd9\xf6\x64\x8c\x88\xd6\x96\x2e\xff\xbf\x3b\x35\x7e\x60\x32\x0a\x92\xa6\xee\x48\xc5\xd1\x87\x22\x1a\x65\x22\xdc\xf4\x5f\x37\x79\xb6\x29\x66\x02\x20\xe0\xc1\x17\xe3\xcd\xc7\xa8\xc6\xd6\xab\x76\x71\x5e\x56\x1b\xde\x1b\x0b\xfe\x7f\x6f\x17\xc3\x8f\xe1\x34\x90\xb7\xa9\x8c\xd3\x09\x00\x70\x7d\x48\x88\x93\x01\x19\x93\xef\x09\x9a\x13\xe7\xec\x56\x27\xf4\x0f\x08\xfd\x79\x6f\x1e\x00\x7a\x3b\x87\x9c\xeb\xa1\x99\x53\x01\x95\xd6\xa8\x53\x2e\xa9\x52\x4e\xf7\x41\xce\x9e\x72\x7b\xba\x84\xf2\xe5\xa7\xa6\xe3\xd2\x0e\x5a\x26\xe4\x73\xed\xd8\x28\xa9\x12\xf7\xa1\x14\x9d\x55\x09\x93\x63\xf4\x6b\xf4\x0e\x64\xe9\x5c\x06\x16\x8d\xcc\x82\x3e\x1f\x12\x42\xf1\x94\x57\xbe\x0f\x0f\x08\xdd\x90\x68\xa6\x27\x5b\x82\xd4\xd9\x80\x00\x8e\x99\xb2\x37\x09\x1d\x53\x7d\x44\x4f\xc7\x09\xb7\x73\x3a\x49\xb8\xcd\x69\x91\x70\x3b\xa1\xfc\xd4\x9e\xd1\x97\x7b\xc0\x79\xcf\x76\x17\x90\x55\x6f\xe9\x70\x06\x60\x53\x8b\xf2\xc5\x75\x90\xb6\x9c\x71\xd8\x76\xbe\xf5\xd4\x07\x31\x7f\xba\x7c\xef\x80\xec\xba\x7e\xd7\xe3\x5e\x1e\xd2\xa2\x47\xf7\x07\xb4\xdb\xa3\xc1\x81\x47\x03\xf6\xb6\x74\x7e\xae\xb8\xe5\x04\x54\x13\xb8\xdc\x63\xfe\x12\xa6\xed\x7a\x84\x24\x28\xfd\xd8\x27\x83\xd6\x0a\x0b\x5c\xdf\x3d\xf2\x50\x13\xac\x52\xbe\x71\xb9\x57\x43\x84\xc3\xb5\x8b\x59\xbd\xf7\xfd\x4a\xa3\xa1\x76\x85\x0c\xac\xaa\xd5\x9f\xe0\x6d\x78\x09\x8a\xb7\xf2\x1e\xbe\x50\xf0\xb5\x19\xf0\x2c\x7b\x5c\xb9\xa7\x2f\x26\xe3\x51\x16\xff\xa1\x95\xc2\xf0\xae\xae\xa5\x05\xe6\x7a\x53\xbd\x4a\xaa\x35\x0b\xf2\xef\x5a\x0a\xcb\x73\x6a\x51\x3f\xa6\x0e\xdf\xeb\x10\xdc\x89\xcd\x97\xdf\xab\x10\xf4\x87\x66\x48\x61\x6c\x14\x59\x01\x69\xc5\xf1\x61\x43\xaf\xff\xb6\x21\x41\x03\xdd\x4a\x0d\x5d\xd5\x14\x43\x40\x28\x4c\x43\x1c\x7f\xe9\x90\xe9\xc3\xa9\xed\xd5\x8f\x2d\x7e\x39\x1d\x74\x73\x34\xd9\x2c\xee\x1e\xa7\x69\x08\x99\x93\x3b\xb1\x59\xae\x09\xde\x70\x06\x8f\xd9\x64\x94\x4d\x1f\xa7\x85\x3e\x08\x81\x21\xfc\x41\x9c\x8d\xfe\xd0\x0c\xea\xc3\x5e\x5e\xde\x9b\xdc\xba\x8f\xd6\x2e\xc4\xe4\x6c\xe3\xba\x05\x9e\xe2\xdb\x7e\xb3\x6e\xd1\xe3\x58\xde\xa7\xfe\xcf\x1f\x8d\xa0\xf1\xc7\xef\xd6\x11\x03\x9f\x84\xe5\x7d\x64\x19\x8d\xe9\xe9\x1c\xbe\x54\x06\xf0\xb8\x1b\x1b\x86\xd9\xda\x0d\x4b\x25\x9f\xb0\x54\xee\x09\xeb\x4a\x3d\x32\x2c\xc2\xdd\x98\xb5\xf0\x92\x4e\x0e\xa7\xb7\xea\x33\x5f\x46\x7f\x58\x12\x07\x33\xe3\xe8\xc3\xcc\xda\x16\x09\x4e\xb5\xfb\x2c\xd5\x9d\xe1\xd0\xe4\x84\xe8\x28\xe8\x4e\xe5\x5f\x04\xf7\xe4\x34\x91\xb7\xf4\x20\xcc\x61\x98\x17\x00\x50\x75\xca\x8a\xec\xb1\x90\xaa\x0f\xf2\xce\x5b\xac\x2b\x11\x08\xa9\x3a\xe0\x13\x9a\xb0\x9b\x21\x3a\xfe\xaf\xdd\x28\x84\xda\x15\x58\x22\x4f\x05\xbe\x24\xe4\x1d\xd9\x8b\x79\x2e\x57\x7f\xd3\xfc\xa3\x91\x34\xfe\x20\x80\xe8\xf1\xbc\x08\x0a\xfe\xcf\x1f\x8d\xa8\xf1\x87\xb5\x79\x58\x96\xd2\x90\x9c\x3d\x66\xcd\x4c\xc4\x7c\x32\x9a\xe1\xf9\x97\x8c\xa6\xfb\x12\xda\x21\x3d\x8a\xec\x98\x7e\x07\x5c\xb8\x44\xc3\xd4\x65\xe9\xbe\xf1\xc6\x7a\xfd\xe7\x07\x8a\x7c\x4a\xd1\x4b\xa9\x9e\x3d\x8d\xad\x28\x67\xec\xaa\x03\x7d\xb7\x6b\x8e\x03\x62\x79\x64\xb8\x9a\xd2\xf6\x3a\xdb\x03\xfb\x5d\x1a\xbf\xb3\xcf\x8b\xa5\x73\x63\xbd\xfc\x17\x1f\x54\x0d\xd5\x05\xda\xdb\x61\x1d\xe1\x49\x11\x5c\xe3\xc6\x0e\xd0\x77\x5b\x4b\xc7\x6e\xab\xe6\x12\x2a\x94\x50\x50\x2d\xf6\x8a\x16\x0b\xec\x67\xaa\x3c\xaa\x4a\xfd\x1f\xf4\x7a\xfa\x56\xe9\x4a\xd5\x14\x1c\x6a\xab\x2d\x95\x1c\xd0\x36\xf4\x3e\x72\x63\xeb\x49\x78\x34\x96\xea\x23\x82\xde\x0e\xcd\x98\x10\x1a\xb3\xd7\x2b\x33\xb1\x04\xa7\xb1\xf6\x33\x19\x1b\xc6\xc5\x35\x9a\x10\x2c\xc3\xd2\x5e\x03\x0f\xbc\xb1\x62\x8b\xd0\x08\x2a\x85\x50\x29\x22\xf4\xe2\xda\x0c\x69\x44\x48\xed\x58\x55\x9c\xfe\x4a\x21\x47\xe1\x54\xa7\xba\xfa\xab\x2e\x8e\x61\x7c\x52\xed\x45\x3b\x8c\xfd\x8f\x06\x87\x03\xa9\xc6\xe5\xc3\x1e\x89\xad\x1b\xe1\xd5\x74\x5f\xb4\xd6\x8c\xa0\x89\x1a\x72\x28\x87\x4c\x13\x78\xc1\xab\xc3\x64\x75\xfc\x61\x35\x21\x09\x26\x40\x09\xf4\x30\xf7\xbc\x02\x22\x95\x42\xa5\x75\xe6\x44\xa7\x5a\x63\xc9\xe4\xd6\x55\x08\xfc\xf0\x7d\xa8\xa3\xc4\xb1\xfb\x43\x62\x18\x97\xf7\xca\x35\x45\xb4\xe6\x33\x3f\x0b\xcc\x96\xba\xe1\x53\xe5\x4f\xe3\x7a\xd5\x50\xb7\x4d\x95\x26\x56\xb9\x36\xea\xdd\x1a\xed\x9b\x81\x2e\x44\xe8\xa1\x74\x0b\x00\xb0\x53\x22\x40\xfa\xcb\xaf\x8f\xf6\x4d\xe2\x1c\xd6\x75\xb1\xb4\x56\x72\xe5\xae\xd3\xd7\x5a\x7a\x12\xe9\x54\x9b\x4c\x69\xc2\xdd\xf4\x3a\xd9\x57\x15\x48\xee\x69\x8c\xc7\x3a\xb6\x0e\x90\x67\x18\xa2\x9c\x1b\xbf\xfc\x9a\x5f\xc3\xcd\x41\x99\x1a\xd4\xfa\x50\x06\x15\x34\x8c\x58\x35\x40\xbb\x3d\x35\x4b\xab\x3a\x97\x88\xb4\x56\xe7\xa6\xce\x2b\x63\xb9\x4d\x40\xec\x5a\x41\xe7\x79\x34\xb9\x53\x68\xaa\x46\xb9\xde\xa9\xa7\xa2\x92\x64\xf9\xf1\xfd\x81\xea\x54\xc0\xb3\x30\x15\x05\xf0\xe0\x85\x61\xdc\x95\xa3\xc3\x4c\x90\x50\x0d\xc3\x1c\x95\x6b\x76\x7f\x5a\x29\x96\x6a\xed\x51\xc3\x48\x56\x6b\x15\x01\x3a\xcc\x34\x0c\x33\xfd\x65\x45\x7f\xea\xfb\xa9\x28\x0c\xe3\xb1\x36\xd5\xb5\x75\xa9\x56\x45\x3e\x1e\xdc\x23\x30\x96\x2a\xac\xef\xfa\x8e\xae\x5a\x13\x7f\x4b\x2a\x32\xaa\xf9\x2b\x1f\x4a\x20\x7b\xa8\x75\x35\x10\x6c\xa8\x00\xa9\xf7\x51\xc8\x98\x4d\x6e\xcd\x7e\x2a\x3d\x61\xd9\x8b\xfd\xa8\xec\x8d\x06\x2b\x6e\x7d\x0d\xcb\x66\xd6\x08\xe5\x7f\xd1\x4c\x56\xf6\xeb\xb1\x7c\xca\xeb\xdb\x50\x6d\x25\xc3\xe0\x4a\xc3\xe0\x2a\x56\xb3\x00\x13\x42\x0c\xe3\xa9\x2c\x5d\x03\xf2\x7d\xed\x95\x7b\x23\xd0\x09\xda\xbb\x8e\xa4\xb4\x8e\xbf\xc5\xce\x0b\xc3\xf0\xb7\xd8\xd1\xa1\x8c\x70\x56\xa7\x28\x18\xd6\x4b\xb9\x0e\xd0\x36\x95\x68\x6e\x14\x68\xbb\x51\xed\x46\xa0\x11\x10\x74\xa5\xcb\xef\xd6\x5b\x69\x7d\xdc\x0a\xaa\xa6\xd7\xda\x81\xfa\xa8\x99\x15\x84\xde\x17\x16\xba\x87\x9e\x5a\xbd\xfd\xc8\x1a\xe5\x66\x48\x9c\x71\x39\xc2\xa2\x7c\x52\xa0\xb3\x58\x98\xdb\xda\x48\x41\xe9\xa4\x12\xfa\xf3\xa4\x44\x35\x25\xf4\xd5\xa9\x5c\xf4\x11\x7e\xdf\x0e\x68\xc8\x7e\x48\x96\x88\x68\x73\x28\x6d\xf7\xe2\xd7\xad\xe4\xa4\x9f\x26\xbc\x36\xaa\x66\x35\xc6\x37\x35\xe9\x40\xb2\x0e\xee\xeb\xee\x8c\x0e\xee\x55\x56\xc6\x7c\xeb\x64\x8e\xc1\x34\xfd\x9a\x7d\x5d\xce\xce\x69\xc1\xce\xf1\xbc\x1b\x4d\xf0\xb4\x91\xc7\xf4\x23\x53\x9d\x44\xc5\xd9\xf1\x89\x83\x5e\x42\xfc\x8f\x8c\x37\xb8\xeb\x7b\xfa\x0b\x95\x07\xba\x5f\x46\x34\xd8\x62\xe7\x4b\xe2\x3e\x08\xcf\xbc\x14\x64\xf9\x7b\x51\x27\x67\x53\x39\x4f\x4e\x81\x4f\x71\xb4\xce\xcd\x43\x89\xb7\x96\x0d\xa4\x1f\xbd\x26\x4d\x91\x73\x26\xcb\xa5\x3c\x7a\xc9\x0d\xa3\xe8\xe4\x0d\x9e\xf2\x46\x61\xe7\x9d\xdc\x2e\x3a\x85\x7d\x2e\xcd\xad\xf8\x8b\xb9\x23\x2d\x88\x44\x69\x41\x34\x5b\xcd\xa8\x9c\x11\xcd\x57\x33\x92\x32\xa3\xcb\x7c\xb4\xac\x69\x6e\xec\x7c\x2a\x68\xc2\xbe\x7f\x33\x03\x9a\x51\xbd\x90\xb4\x2b\x05\xdc\xd6\x6e\x82\x36\x79\x9d\x04\x5d\x11\xd8\xe7\xb4\xc7\x02\x73\x5a\x96\x43\x7b\xa0\x33\x19\xdf\x58\x7f\x09\x3f\xf1\x49\xe0\x47\x94\x27\xa4\x66\xaf\x79\x06\x9c\x45\x20\xbf\x93\xd3\x50\x7e\xe0\x8c\xb5\x76\x03\xf9\x81\x40\x7f\xe0\x94\xb9\x9e\x73\xba\xee\xdb\x68\xa7\x66\x50\x64\x4e\x17\x8b\x33\x62\x18\xa7\xeb\x36\x82\xa2\x21\x8b\x15\xcd\x1d\x28\x17\x4b\x93\xa3\xd3\x75\xa7\x46\x91\x2a\x36\x93\xc5\xd2\xf5\x62\xca\x9f\x11\x42\xa5\x74\x69\x24\xcb\xcf\x75\xb3\xb7\x17\xe6\xa9\xb4\xae\xf7\x4b\xeb\x7a\xd4\x2e\x95\x76\x2c\x69\xcd\xfb\x4a\xe9\xbb\x44\x28\xd7\x25\x53\xc3\x50\xdb\xe5\xb8\x0a\x96\x3e\xa5\x2f\xb6\x2f\xdd\xa4\x14\xf4\xd5\x16\xda\x90\xa7\xb7\x24\x6a\xaa\x0b\x9f\x25\xe8\x5f\xc2\x3e\x27\xf4\x0c\x8f\x95\x46\x7d\xe5\xa4\x22\xff\x38\x4a\xae\xf4\x4d\x51\xf4\x69\xe1\xdb\x01\xd4\xcd\xd7\x82\xe5\x6e\xa0\xc1\x0e\x85\x96\xea\x9d\x39\x53\x9d\x09\x42\xaf\xb9\xd2\x9b\xee\x92\x60\x0c\xda\x35\xe7\x2c\x61\x39\xc0\x10\xed\xa4\x15\x62\x52\x78\x4d\x34\x23\xaa\x5a\xa3\x82\xfa\xa5\x73\x96\xe8\xbd\x73\x96\xa8\x6c\x08\xe9\x9b\xcf\xca\x26\xaa\xa5\x78\xdf\x16\x45\x5c\x32\xca\x4d\xbf\x6e\xff\x1d\xeb\xab\x7f\xed\x9b\xfb\x0c\x95\x2e\x3b\x53\x95\x6e\xcf\xf4\x29\xae\x75\x15\xd6\xea\x3d\xac\xe2\xbe\x34\xa4\x01\xbb\x94\x07\x26\xbd\x8f\x5d\x4d\x6e\xb6\xb6\x40\xd8\x42\x14\xeb\x6b\x05\xf1\x90\x53\xe1\xfc\x5c\x71\x76\x40\xde\x38\x06\x77\x41\xcf\xbe\xa8\x83\x17\x8c\x4c\x41\x56\xa3\xfd\xa8\x30\x1c\x18\x68\x53\x30\x8e\xca\xa2\xda\xfd\x34\x67\xe1\xe7\x1d\xea\x03\x27\xe9\x4b\x87\xe2\x4d\x4e\x6a\xef\x4f\x41\x63\x2d\xf4\xce\xe9\xda\xf5\x1b\xe0\xf2\x52\x82\xc4\xc1\x01\x5a\x3e\xd3\x3c\x28\x4d\x98\x19\x22\x40\x37\xdb\xe4\xf3\xf3\xa9\x54\x6f\x17\x40\xcb\xcf\xac\x87\x67\xe0\x9c\x5f\x4e\xb9\x99\xd0\x52\x61\x28\x39\x5c\x75\x29\xe3\xa4\xbb\xa1\x12\x61\xd2\x1a\x93\x9f\xb0\x16\x93\x02\x69\x0a\x18\x7e\xb8\x7e\x4e\x50\x9e\x84\xb7\x68\xcb\x5b\x12\x9a\xb3\x66\x9b\x16\xac\xe5\x14\xbb\xa1\x94\x0c\x0a\x2d\x19\x4c\x19\xa4\x14\xd2\x13\x18\x72\x2f\xbe\x54\xcf\xdc\x6a\x4b\x33\xd1\xcc\x9d\xa2\xd6\x34\xb6\xa5\x6f\xf7\xa7\x56\x02\x15\x12\x32\xc3\xf0\xfc\x18\x04\xae\xe4\x7b\xe7\x0c\x6a\xd0\xae\x94\xa3\xe6\x1e\xed\x49\x41\x3a\xa5\xd3\x52\xd7\x90\xd0\x1e\x2c\x5e\x17\x16\xaf\x07\x78\xeb\x87\x1c\x8d\x13\xc1\xf4\x2b\xdd\xb6\x53\xd6\xda\xed\xa1\xb7\xf6\x0b\x96\xb9\x73\xcf\xb9\xbc\x36\x23\x7a\x86\xae\xec\x3b\x5d\x28\xd8\x6b\x5c\xb8\xa7\x1e\xb1\xe5\x0b\x21\x4e\x80\x4e\xed\xbf\x3d\x33\xed\xac\xf4\xdb\x33\xcd\x1b\x6d\xa2\x2f\x0b\xdf\xbb\x10\xf4\xd9\xdb\x30\xb2\xdf\xb2\xb1\x9d\xd2\xd7\x67\xdb\xa7\x93\xc4\x0e\xe8\x5d\x6a\xf3\xc6\x86\x19\x2e\x16\x71\x07\x3e\x61\xb7\x08\x7d\x4c\xed\x33\x3a\xec\xdb\x3f\x15\x70\x4e\x69\x4a\x21\x8f\x6e\xb5\xc8\x72\xa9\xce\x47\xa4\xb7\xed\xef\x02\x63\x41\xca\x09\xdd\x1f\xa0\xef\xfd\x99\x3b\xf0\xa8\x6f\x0d\x23\xcb\xff\x8b\xb5\xb6\x60\x72\x67\x6e\xd0\x6c\x7b\x1d\xf9\x03\x39\x77\x52\x22\x27\xce\xb6\xde\x00\x74\x4a\x0b\x98\x17\x9c\x68\x9f\x38\xf0\xc1\x06\x00\x72\x97\x05\x9d\x96\x9d\xd3\x4b\x16\x94\x9d\xd4\x57\x6e\x31\xba\xce\x05\x18\x2b\x41\x66\xc8\x5a\xce\x70\xb7\xe7\x0c\x1b\x0d\xb2\x5e\x85\xce\xdd\x13\xcf\xe4\xb4\x4d\xbb\xf4\x92\x06\xca\x47\xa0\x4a\xec\xa9\xc4\xe5\x72\x19\x2c\x16\xef\x8f\xa4\xc8\x5b\xff\xfd\x31\x8d\xc6\x0a\x35\xcd\x36\xd8\x2b\xa1\xdc\x2b\x42\xee\x95\x08\x10\xc1\xaa\xc2\xf7\x9a\xbf\x69\x7f\xa9\x4d\x99\x02\xb5\x0b\x6a\xd6\x4c\x7a\x0b\xa0\xe9\xfe\x0f\xf9\xe4\x08\x00\x84\xb4\xda\x43\x19\xbb\xbc\x36\x05\x45\xe5\x38\xd7\x3f\xa6\x49\xe1\xa9\x8d\xa0\x8c\xa3\x8a\x92\xed\x51\x9b\x20\x21\x6f\x53\x79\x27\x22\x57\x42\x76\xa8\x54\xd8\x9e\x49\xa8\xc6\x3d\x41\xe7\x6c\x06\x00\xdc\x65\x2d\xa7\xbb\x9b\xcb\x06\xbb\xb2\xc1\x1e\xcb\xdd\x2e\x90\x72\xf4\x47\x1f\x4b\xd0\xef\x49\xd0\x3f\x03\xd0\x9f\xab\xdb\x4b\x75\x8e\x75\xf6\xf1\x67\x33\xc3\x98\xa9\x1d\xb1\x0e\xd6\x45\xa3\x4d\x9c\x1e\x7b\x93\x47\xe5\x3d\xd4\xf2\x98\x5a\xbd\x3b\x37\xdf\xf3\xac\xfd\x58\xae\xac\x02\xed\x18\x40\xbb\x00\xd0\xc6\xd4\x3b\x80\xe4\xc7\xd4\x4e\xe9\xe3\x88\x43\xd5\xa4\x50\x80\xcd\xe9\x94\xc6\xb4\xa5\x40\x7a\x7b\x88\x00\x00\x20\x18\x13\x47\xf5\xaf\x07\xa0\xf0\x1f\xc2\xc1\xdd\x6f\x4e\x36\xf0\x90\x06\xd8\xc3\xdf\x41\x40\x70\xb0\x24\xce\x4f\x0c\xb5\xf6\x81\x57\x5d\x0d\x04\x8a\x56\x38\x3f\x57\x43\x35\x09\x14\x71\x13\xc2\xeb\x13\x5b\xa2\xa9\x48\x9f\x38\x69\x27\x9b\xf7\x91\xcb\xd1\x94\x45\xdb\x90\xd6\x8c\xcc\xbf\x3d\x53\xa1\xc3\x91\x4e\xe5\xe1\x88\x4f\x23\x5c\xcd\x59\xf5\xda\x46\x3d\x83\xf2\x75\x07\xb9\xf6\xf2\xf5\x6f\x1e\x70\x80\xcf\x57\x26\x3a\xa3\x9f\x42\x4d\xfd\x32\x83\x7a\xfa\x65\x0e\xb5\xf4\x4b\x54\x07\x92\x69\x19\x1a\x3a\x2a\x9f\x66\xe5\xd3\xfc\x17\x03\xed\xc2\xee\xd0\x53\x14\x02\x34\x75\xb5\xb6\xf9\x7c\x77\x06\x48\x35\xa4\x5d\x40\xaa\x05\xe4\x4d\x09\xc5\xdf\x88\xa0\xae\xd9\xb7\xb9\xdd\xeb\x70\x2b\xe8\x5b\xdd\x3f\x6d\xfc\xdd\xff\x93\x9e\x04\xf6\x18\x48\x16\x1a\x82\x10\x0d\x64\x3e\xdd\x78\x7d\xb6\x05\x8d\xee\xb9\x3d\xc5\x4b\xe7\xab\x47\x3b\xa2\xf1\x3d\xb7\x7b\x9d\xb9\x3d\xa3\x77\xf8\x34\xb3\xe7\x54\xc0\x13\x40\x60\x57\x42\x19\xf6\xae\xa0\xd2\x0f\xb3\xa3\x86\x81\xce\x81\x94\xa9\x37\xad\x87\x0c\x7e\x7d\xc7\x8b\xbc\xc3\x2c\x81\x95\xba\xf2\x5a\x37\x42\x38\xba\x3c\x24\x15\x2a\x8a\xac\xed\xb8\x13\xb9\xdb\x9e\x0d\x68\x45\x63\x18\xd8\xbe\x35\x37\xdc\xb8\xcd\x23\xdc\xe6\xa9\x54\x70\x92\x4a\xf2\x69\x55\xdd\x8d\x3d\xb7\xed\xd9\x6a\x87\xa7\x80\x87\x9e\xd5\xe9\x20\xd0\xe5\xea\xa8\x38\xd5\x57\xc0\x12\x4d\xc1\xa2\x22\xa2\xca\x89\x63\x2a\x0c\x95\x13\xc3\xd8\x82\x96\x31\x0a\x87\x44\x62\x89\xfc\x14\x1e\xd4\xe2\xde\x8c\x70\x6f\x66\xca\x2e\x27\x63\x5b\x18\xbc\x0b\x90\x7e\x52\x52\x31\xdc\xea\x2d\x98\xdb\x9c\x9e\x3e\xdb\x29\x6c\xec\x64\x49\x8b\x3b\x9e\x0b\x3b\xb2\xbe\x1f\xd0\xfd\xbf\xec\x4c\x93\xab\xd4\x30\xcc\x44\x93\xab\x6d\xed\x91\xd9\x87\xed\x1e\xc9\x55\x48\x56\xee\xea\x47\x1f\x9f\xbc\xb6\x9c\x40\x9f\x39\x06\x8d\x06\x91\x0b\x14\x10\x67\x7e\x2a\xa3\x27\xde\x98\xf5\xf5\x9b\xbf\x6f\x04\xf9\x42\x79\x8b\x16\xb2\x96\x13\xca\xe5\x08\xf5\x72\x08\x16\xb8\xd2\x2b\x01\x5e\x04\x49\xfd\x14\xf9\x54\xf4\x64\x54\x78\xe1\x4e\xe7\x5e\xe5\x02\xef\x3e\x72\x85\x3a\xc1\xbd\x1a\x99\xc2\x4a\x3e\xc0\x31\x5b\x18\x95\xfa\xbb\x50\x47\xe1\xe2\x79\xf3\x6b\x62\x72\xa0\xc3\x8f\x29\xc5\xdf\xd3\x67\xb2\x94\xe2\xf5\x99\xf5\x72\x4f\x05\x0b\x2e\xcd\x98\xf6\x4e\xb8\xe9\x13\x9a\x10\x9a\x3a\x93\xd2\x0e\xd5\xaf\x62\x2d\x44\x07\x76\xca\xfc\x32\xee\xa5\xb2\x25\x9d\x38\x3a\x10\x43\x2d\xd3\xfa\x53\xe7\x2e\xab\xd4\x65\x22\x3f\x94\xd2\x44\x71\x44\x42\xfd\xc2\x6a\xd4\x96\x23\xf9\x4f\x0e\xc2\x7d\xe8\xba\x3e\x17\x96\x64\x34\xaa\x31\x93\xf1\xaf\xf9\xc7\xcd\x16\x8e\x3e\x4e\x4c\x24\xb2\xf2\x57\x5e\xb0\xaa\xd5\xae\xa9\x37\x40\x4a\x26\x75\x91\xf5\xc2\x28\xa5\xd6\x1c\xd8\xc1\xa9\x5c\x94\xc2\xa3\x33\x79\xf5\x22\x35\xb7\x68\x97\xe5\xd5\xe6\xea\x69\x6b\xcd\xae\x62\x10\xa7\xab\x0c\x62\x44\xe8\x69\x85\x0f\x7b\x8b\x45\xc4\x81\xed\xf3\xad\xab\x10\xd5\x74\x12\x68\x7f\xce\x62\xb7\xf0\xd0\xe7\xe0\xf3\x5f\x20\x7d\xfd\x65\xcf\xe8\x14\x9e\x66\x7f\xd9\x73\xba\x07\x4f\x5d\x78\x7a\x85\xa7\xf9\x5f\xf6\x6c\x49\x4f\xd9\x56\xbb\xc2\x98\x17\xf4\xd2\x01\xe6\x33\xea\xc8\xee\x34\xdb\xb4\xab\xac\x37\x24\x2f\xa5\x0c\x4e\x9b\x6d\x55\xa0\x51\x15\x80\xbe\x74\xcc\x2e\xeb\x35\x52\x39\xd8\x5a\x9f\xe8\x05\xbe\x35\x7a\xf4\x12\xdf\x1b\x3d\x1a\x31\xa6\x9a\xd2\xc7\x59\x6c\x08\x98\x80\x9b\x43\xd2\xc1\xc2\xac\x67\xcb\x6a\x74\xa3\x55\x22\xfe\x2d\xc6\x4e\x65\xb1\x53\xd2\x89\x55\x31\xd9\x28\xb1\xcd\x0b\x76\xc9\xba\xec\xdf\x34\x7e\xc1\xba\xb6\x58\x2c\x4c\xa9\xa9\x45\xe8\x2f\x1a\xbf\x54\xc5\x2e\x65\x31\x45\x41\xce\x88\x63\x9e\x32\x24\x1d\x67\x84\x18\xc6\x54\x91\x95\x29\x43\x44\x95\xd3\x88\xe2\xf0\x4f\x89\xa3\x16\x07\xf5\x3a\xba\x48\x53\x90\x91\x3e\x7d\xb6\xbb\x34\x1b\xdb\x91\xc4\x57\x7a\x55\x2e\xcb\x55\xb9\xa0\x1f\xad\xde\xb0\x6f\x4f\x97\xcb\x02\xd1\x5d\xa1\xb0\x5a\xae\xb0\xda\xa9\xe2\x58\x0a\x9a\xd3\x6c\x85\x72\x96\x90\x52\x48\x5c\xe7\xe4\x15\x89\xf9\x18\x47\x4d\xe4\xce\xfa\xf9\xfe\x6a\x3f\x20\x6f\xdc\xda\x8e\x41\x80\xd4\xc6\x9d\x9d\x3d\x7d\xdc\x1d\x10\x5b\xa5\x5e\x1e\x1a\xc6\x6b\x95\x4c\xbb\xd5\xb3\x24\x67\xb5\x60\x6b\xbf\xa5\x67\xf2\x9c\x3a\xd2\x37\x40\x34\x56\xc4\x0d\x36\xa6\x75\x83\x56\x76\x71\x69\x65\x5a\xc9\x8e\x31\x90\x8e\x18\xf6\xd5\xc0\xb3\x43\x34\xc2\x92\x3b\x37\xad\x6f\xda\xc0\x9a\x26\x6e\x52\xbb\xfb\xa1\x85\xba\x21\xca\x6b\x2d\x64\x90\x23\xe9\x5c\x46\x73\xe0\x62\x56\xf2\xda\x65\x5e\x01\xbb\xee\xf9\xca\x14\xb0\x6d\x73\x68\xe4\xf9\xca\x8c\x24\xbb\x53\xe3\x63\x8a\x92\x67\xc9\x49\xbc\xce\xb3\x98\x53\x49\x11\x0b\x82\x11\x96\x22\x9a\x03\x80\x6d\xc5\x72\xce\x91\x6e\x16\x84\x46\x92\x7e\xe2\x2e\x07\xca\xf7\x62\x17\xf4\xd5\xce\x35\xa1\x8b\x01\x24\xa6\x23\x6e\x4f\x97\x54\xc1\x44\x4c\x7d\x9a\x11\x1a\x57\x2b\x5f\x2e\x40\xfa\x1f\x51\xb5\x3d\x4d\xd5\x24\xa8\x54\xeb\x87\xef\x95\xde\x9a\x5f\xa3\x30\xa6\xa6\x31\x64\x59\xf1\x1f\xef\x0d\x87\xb5\x29\x19\x10\x9d\x0e\x52\x9e\x6c\x5c\xb7\x16\x7b\xdb\x7e\xb6\x75\x89\xed\xe7\x0e\xfc\xb1\xdb\xb4\x78\x29\x13\x8b\x97\x0e\xfc\x81\xc4\xe0\x31\x17\x3a\xdd\xbd\xdf\xf3\x3a\xf8\xd7\xde\x6a\xd1\x49\xca\x6d\x6d\xb2\x56\x71\xcd\xf2\x52\x56\x9d\xb3\xd4\x6f\xd5\xd5\x1d\x2a\x6e\x80\xf2\x12\x55\xd3\x57\x48\x43\xea\x1a\x59\xc3\x19\x4d\x90\x43\xb2\xc4\x43\x7e\xc7\x8b\x51\x81\xfe\xba\x15\xd7\x74\x5f\x73\x06\xb6\xc5\x4c\x2c\x17\x88\xf1\x84\x8f\xb2\xc9\xab\xbc\x93\xc7\x00\x92\x5b\x2c\xd1\x0f\x29\x3e\x6c\x85\xb5\xf3\x8e\x9f\x23\x33\xb2\x12\xea\x03\x10\x07\x66\xb2\x58\xbc\xa1\xa1\x6a\xcb\x49\x77\x81\x4f\x51\xe7\x23\x0a\xa8\x21\x25\xd5\x56\x31\x5b\x39\xcc\xbe\xa2\x44\x01\x7a\xb3\x67\x91\x75\x12\x38\x85\xec\x5a\x26\x7f\xcc\xc8\xfa\xf1\x2f\x06\x7f\x16\x8b\xa9\x95\x1e\x99\xb2\xdc\x8f\x7f\xd1\xdc\xda\x1e\xb3\x29\x05\xe0\x8b\xac\xdb\x7f\xb1\x0d\xf8\xbb\x58\xc4\xb2\x50\x6e\x89\x3e\x83\x14\xe9\x48\xa4\xfd\xa5\xb0\xb6\x9f\x17\x8b\xf6\x97\xcc\xda\x7e\x26\x53\xe6\xdf\x98\x53\x34\x01\x93\xcd\x38\xed\x2d\x56\x58\xc5\x8b\x61\xb4\xb7\x58\x86\x0f\xa6\x0e\x95\x0d\xaf\x14\x32\xe1\xd3\xfb\xa7\xdc\x9c\x02\xbc\xca\x7a\xc4\x69\x31\x56\x58\x93\x94\x1b\x46\x62\x18\x5b\xc0\xb3\x19\x86\x89\x99\x72\xeb\x64\xac\x58\x26\x2c\x5f\x61\x0f\x7a\x75\xf1\x4b\x1a\x3a\xbf\x2d\xa9\xd2\x0a\x7b\xd3\x7b\xe5\x6d\xa9\x6d\x5b\x39\xf4\x46\x41\xce\x8f\xb9\x67\x18\xe3\x17\xd3\xa7\xf8\x5c\x1a\x5f\xbb\x17\xaf\x9e\x61\x9c\x3e\x63\xc6\xc5\x6b\x2d\xa3\xef\x19\xc6\x0f\x6e\xfa\xee\x28\xf0\x28\x3e\x6c\xfb\x1e\x85\x74\x52\x15\x3a\x0f\x3d\xc3\xc8\x7c\x55\x0a\x1f\x64\xa9\xf3\xb0\x5e\xec\xfb\x4b\xbd\x31\x7c\xaf\xcc\xbf\x61\x20\xe7\x39\x0f\x46\x93\xd7\x5a\x5b\x2b\xe9\x55\x4b\xc1\xab\x6e\x49\x7e\x27\xa8\x75\xd9\x92\x53\xb1\xda\x16\x16\x5b\xcd\x59\xaf\x80\xca\xb4\x86\x91\xf3\xb5\xe2\x98\x5e\x2b\x0c\xd3\x7b\xf5\x9a\x0b\xc3\x08\xa0\xe5\x6f\x2f\x58\x54\xa7\xae\x15\xbc\x1c\x85\xa2\xc0\xc3\xec\x6f\x2f\x9e\x55\xc0\xdb\x4a\xd6\x5a\xf1\x8b\x47\xe9\x93\xa6\xac\x31\x56\x09\x6c\x63\xad\xc4\x5a\xc5\x9e\xc8\x26\x65\xa5\x50\x64\x93\x7a\x06\xf9\x28\x42\xe7\xc1\xfa\xb9\xa7\x74\x90\xef\x94\x06\xb0\xb0\xcf\x5f\xbc\x8e\xfa\x05\x5a\xa1\x4a\x54\x16\xe0\x86\xc1\xa5\xff\x16\x9f\x30\xc6\x0e\xee\xf0\xfc\x15\x92\x80\x70\x04\xb8\xb1\x65\x27\x55\x00\x49\x41\x43\xd6\x1b\x99\xd2\x08\xe5\xf0\xc1\x0c\x09\x11\x1a\x84\xa5\x4a\x74\x58\x41\xb2\x4e\x58\x96\x9e\x26\x42\x77\xdf\xf7\xd0\x57\x0c\xfb\x71\x47\xde\x26\xe3\x57\x85\xb9\x66\x8f\x66\x48\x96\x01\x07\x8e\x3d\x26\x6f\x4b\xf9\xd5\x08\xfd\xdc\x45\x64\xa9\x5c\x58\x18\x86\xd9\x1f\x99\x21\xfd\x71\x47\x3a\x26\xde\xde\x26\x5f\xb9\x19\x12\xda\x3b\xe5\x84\x9e\x6f\x8e\xb2\x4d\x28\x73\x9f\x98\x82\x0a\xf7\xdc\x23\x34\x84\xc7\x73\x42\xe8\x37\xb1\x96\xfb\x4d\xe8\xec\x6f\x82\x10\x62\x0b\x06\xdb\x72\x8c\x43\x22\x4e\xc8\xc4\xb2\x9c\xa5\x90\xd4\x9c\x8e\x76\x33\xd3\x0d\xbd\x15\x07\x04\xab\xa1\x87\xac\x09\xae\xa3\x15\x0a\xd6\x97\xa4\x09\x33\x74\xa8\xcb\x03\x95\x26\xe0\x23\x87\xd5\x8b\xe4\xf9\x8f\xaa\x04\xce\x8e\xab\x17\xc1\x0e\xae\xd1\xa7\xa0\x52\xff\x0c\xac\xfd\xb8\x5a\xc6\x48\x4b\xc7\x89\xdb\x45\xe7\x04\xe9\x3b\x5f\xa2\x3e\xf3\x17\x8b\x73\x27\xd8\x62\xec\x70\x80\x1a\x60\xe7\xc2\xbc\xc9\xcc\x88\xba\x7e\xa3\xdf\xa7\x7e\xa3\xd7\x87\x6d\x80\x96\xfb\x84\x72\x6b\xff\xce\xbc\x80\x6c\xbf\x31\x9a\x72\xca\x2d\x9c\x25\xac\xdf\xeb\x4b\x0d\xb2\xb0\xac\x3f\x18\x50\xbf\x71\x88\x71\x79\xc7\x82\x10\x1a\xc0\x67\x55\xed\x74\x0f\x6a\x3f\x8d\xb0\xd1\x87\xc4\x3c\x95\xc9\x0f\x98\x7c\xe6\x13\x42\x96\x4e\x0a\xf8\x4c\xb0\x6f\x90\x75\xfc\xc2\xcb\xd9\xca\x98\xff\x68\x46\xf4\xe8\x85\x6b\x25\x96\x4c\x86\x58\x84\x7d\xc1\x32\xc0\xae\x03\xa8\x33\x58\x29\x80\xd8\x31\x23\x4e\x6a\x26\xa5\x9e\x76\x50\x49\x81\xda\xc3\x90\xbe\xc8\x2c\x7a\x76\x6a\x26\xf4\xb0\x6a\x23\xb0\x4e\x30\x66\x2c\x60\x71\xfc\xbb\x58\xf8\xd6\x49\xb0\x58\x40\x06\x51\x53\xbc\x91\x62\x96\x34\xe7\x38\x1c\x10\xaa\xde\xaf\x0e\xe1\xad\x6a\x6a\x38\xc3\xa6\x44\x9f\xe1\xdf\xaa\xa9\xe1\x4c\x37\x95\x62\x8e\x6c\xa9\xd7\x2f\xdf\x93\x31\x87\xd7\x95\x3b\xd5\xfd\x01\x76\x56\x65\xd1\xb5\xfe\x9e\x04\xcc\x7c\xdf\xd3\x14\xd3\x56\x3b\x7a\x12\x94\x1d\xd5\xfa\xeb\xd0\xee\x64\xcc\x57\x3e\x17\x1c\xd8\xbe\xf5\x6d\xce\xe0\x4f\xad\xb5\x6f\x73\xdd\x8a\x7e\xc7\x9a\x55\xcb\x64\xe9\x5b\x78\x00\xca\x92\x25\x47\xb7\x38\xc8\xff\x30\x4e\x03\xeb\x96\x73\x86\x7f\x17\x8b\x44\x12\xeb\x44\xbe\xd3\xb2\x0e\x01\x7a\x1c\xcb\xa5\x7e\x61\x31\x0d\xca\xc3\x85\x40\xc9\xb0\xfa\xe9\xe7\x31\xda\xd0\xcb\x9b\x59\xf1\xe9\xce\x9d\x87\x9e\x19\x93\x4f\xed\x16\xf9\xdc\x6e\x51\x09\x58\x9a\x07\x08\x49\x79\x9d\xbd\xfd\xcc\x42\xfa\x01\x50\x14\xbd\x12\x38\x74\x6f\xfc\x1b\x33\xa1\x5b\x2d\x22\xa1\x74\x43\x9e\x3e\x8a\xa6\xc8\x4c\x55\x82\x7c\xde\xc1\x20\x9f\xb5\x79\xab\x79\xaf\x5a\x6d\xa6\x5d\xe7\x6f\xfb\xa7\x35\xbf\xc6\x20\x60\x04\x37\xa6\x8a\x58\x26\x4f\x57\xfc\x9a\x27\x23\x47\x18\xc6\x96\xaf\x24\x1c\xe9\xd1\x48\x60\x30\x0d\x60\xc3\xef\x13\x33\x90\x0e\x57\x9e\x52\xb6\xb5\x05\x3f\x55\xf8\xe8\xca\xc3\xd4\x70\xfd\x9e\xec\xda\x47\x1d\xb6\x33\x2b\x1f\x1b\x86\x19\x5a\x77\x39\x20\x7d\x3a\x8c\xc9\x62\x11\x5a\xf1\xbd\x89\xcf\xe8\xf9\xcb\x3a\xe0\x48\x10\x34\xeb\xfb\x94\xda\x5b\x5b\x9c\x26\x23\xdb\xef\x6c\xb5\xec\xad\x36\x0d\x1e\x33\xb4\x29\xf6\x51\xbf\x2c\x58\x0f\x0c\x55\x29\x36\xa9\x9b\xb8\x9f\xc7\xc0\x83\x6f\xc7\xba\x3b\xda\xd5\x9d\xf2\xaa\x76\xa6\xe3\x40\x4a\x2d\xa9\xed\x98\x44\x0c\x0f\x24\x02\x4f\xca\x5b\xfa\xa5\xed\xd1\x8a\x5c\x44\x2c\xc9\xcd\x88\x86\x56\xcf\xe4\xd6\x0d\xe0\x2c\x5a\xea\xc3\x99\x31\x64\xc6\x94\x4b\x43\x41\x9a\x30\x81\xfe\xff\x98\x38\xe8\xc4\x76\xd4\xb8\x14\x8d\x18\x50\xe7\x4a\x30\x26\x69\xc5\xa4\x2c\xfa\x2b\x0d\x25\xad\x52\xb1\x58\xfc\xdc\xa7\x79\x4d\xd9\xa5\xca\xb8\xc8\xb9\x93\x30\xff\x7f\x77\x3a\x7e\xb3\x6d\xfb\x8e\xcf\x84\x95\xba\x89\xe7\x24\xf2\x41\xda\x8b\x0b\x14\xf5\x56\x35\xfd\x9c\x18\xa4\xbd\x84\x38\x91\x9e\xf7\x88\x38\xb1\x7e\x8e\x89\x93\xb0\xac\xf1\xad\xdb\xc0\x2e\xe7\xf0\x14\xeb\x96\xfc\x8f\x5a\xf2\x7f\xd3\x12\x7a\x9f\x58\x6f\x4d\x9e\x64\xaa\x26\xf9\x6a\x93\x14\x9b\xe4\x84\xd6\x9a\xa4\x65\x93\x1b\xa8\x8d\x28\xe7\xd2\xe1\xec\x2d\x19\xd5\x41\x23\xa1\xfb\x0f\x36\x87\x29\xa2\x77\xcf\x76\xaa\x8c\x86\x39\x1b\x9c\x96\x1e\x46\x83\x2a\x9c\x6c\x5d\x59\x67\xf0\xfe\x92\x57\x09\xe2\xe8\x4c\x0e\xbd\x56\xc3\xee\xe8\xf8\x25\x88\xb8\x09\x20\x2c\x5b\x58\x67\x13\x39\x2d\xa8\x56\xa3\xee\x2f\xb4\xc8\xe4\x2b\xf5\x56\x5e\x0e\xc6\x6d\x79\xa4\x71\xbc\xd7\x28\xdf\xff\xe6\x11\x18\x4e\xf9\xde\x5e\xcb\xdf\xf1\x48\x69\xfc\xcc\x6b\xe0\x12\xcb\xc6\xfd\x63\x8f\x96\xdf\xc1\x43\x4b\xcd\x5d\x01\x1c\x11\xa7\xce\x6f\xe1\xc7\x6b\xeb\x83\xaf\xd1\x4a\xd7\x6a\xf2\x7a\x62\x18\xf3\x91\x19\x13\xa9\x1d\xcc\xf0\x96\x73\x3e\x32\x23\xad\x78\xbd\x36\xf9\x52\xcb\x97\xb3\xa8\x31\x16\x6a\x89\xdf\xaa\x09\x48\x56\xa7\xaf\xed\xd9\xeb\xdd\xe2\xeb\x25\xd4\x04\x23\x07\xf9\x9b\x0e\xf2\xdf\xf6\x27\x91\x3d\x38\xf4\xb5\x93\x87\x81\x67\x18\x1b\x66\xc2\xae\x46\xe6\x47\xa7\xc3\x9b\x6a\x32\xd0\x27\x12\x6f\xb0\x71\xcc\x1b\x89\x56\x58\x6a\x24\x71\x19\xb3\x70\xf5\x63\x1c\x00\x4e\x00\xf8\xa1\xa2\x09\x05\xf4\xb5\xe2\x5a\xec\x5e\x1d\x36\x7c\x70\x5c\xf0\xf6\x98\xda\xdc\x7a\xa1\xa7\xcf\x36\xb7\x5e\x6b\x08\x3c\xf8\xc0\x87\xbe\x3c\xa4\x3e\x7d\x26\x6b\xee\xa6\x4a\x17\xb6\xd0\xd2\xeb\x5a\x43\xe2\xa3\x86\x5e\x28\xb7\x5e\x65\x0c\x1d\x14\xed\x51\x8b\x21\x0d\x69\xb2\x72\x52\xa1\xd8\x3b\x6b\x3a\xe2\x3a\xdc\x35\x22\x28\x19\xbd\xfd\x85\xd4\x54\x29\x65\xd2\xab\x72\xce\xc5\x3f\x68\x26\x96\x45\x1e\x53\xe2\xf8\xd6\xfe\x5f\x4a\x03\x4f\xdf\xc0\xc9\x4c\x18\x1a\x55\xd1\xe0\x53\x9a\xd1\x5c\xf3\x58\xd1\x8a\x92\x58\xca\x84\x93\xb1\xd0\xc9\x59\xb2\xa6\x14\x96\xb2\x80\x66\xcc\xa7\x39\xe3\xcb\x2a\x06\x48\x24\x4f\x33\x92\x46\x83\xc0\x3e\x62\x11\xe2\x4a\xca\x15\x99\x5f\x2c\xb8\xbe\x31\x1a\x45\xe6\xf6\xc8\x74\x4f\x63\xda\x7d\xe1\xb4\x77\x80\x6c\xeb\x33\x29\x7d\x35\xa8\x1a\x20\xda\x04\xcf\x8c\xf5\x0e\xf0\x90\x1b\x1e\x4f\x63\x87\x5b\xfc\x07\xdb\xd8\x6a\x39\xdc\x1a\xdd\x73\x56\x38\x05\xbb\xba\x30\xaf\x46\x26\xff\x0f\xee\x22\x52\xbc\x86\x40\xc0\xb3\xce\x4f\xf0\x02\x36\xb2\x5e\xee\xe5\xbd\xb6\xf4\xbd\xc5\xe5\xb1\x47\xa3\x31\xd5\x0e\xb8\x20\x65\x8a\xb8\xa7\x70\xa7\xea\x2a\x64\xce\x32\x7c\xc3\x9b\xca\xae\x7e\x69\x7b\xc4\x99\x59\x87\xff\x60\x73\x67\x66\x1d\xfd\x83\x75\x9d\xdc\xe4\x74\x46\xe7\x44\x3d\x74\xc9\x52\xa3\x4c\x18\xc6\x56\xbb\x06\xbf\x8f\xa5\x09\x06\x2f\xdd\xda\xae\x29\xf8\xe4\xf7\x4a\xc1\xc7\x1d\x78\xc4\xc9\xee\xcd\x60\x35\x84\x4d\xa5\xeb\x93\xde\x9b\xc1\x8d\x8e\xa2\x4e\xf5\xa3\x2f\x21\x47\x5b\x16\xf9\xd6\x95\x40\xac\x2b\x22\xb4\x77\xf9\x22\x88\x84\xd5\x90\x86\x0c\x72\xa2\x2a\xb2\x29\x2d\x3d\x42\xae\x28\xc0\xa7\x2c\x70\x23\xc0\x3d\xc1\x8d\xd4\x33\x29\x45\x1a\x69\xbc\x71\x34\x34\x7d\x9a\x68\xfc\x81\xe6\xa0\x66\xf2\xc9\x77\xcf\x5f\xbc\x5d\xf8\xbc\x7c\x24\xe4\x2d\x66\xca\x41\xeb\x72\x09\x72\x5b\x00\x68\x91\x54\xda\x06\x21\xcd\xb5\x69\x49\xc4\xe2\x95\x6e\x28\x11\xcf\x30\xa2\xdd\x10\xf9\x87\x50\x95\x24\x8e\xea\x5d\xcc\xf0\xcb\x11\x43\x67\x39\xcd\x36\x79\x0b\xb1\xb7\x34\x06\xc9\x4c\x7e\x35\x97\x23\x08\xdc\xa8\xd1\xae\xa3\xc0\x5c\x1e\x5f\x66\x2c\x6a\xec\x38\x99\xfc\x6c\x26\x41\xbc\xac\x92\x95\x27\x1f\x39\x79\x0b\x59\xa6\x9a\xac\xb7\xf1\xfe\x83\x4b\x3d\x3b\x1b\x39\xf9\x28\x3f\x63\x83\x7b\x33\xa1\x39\x71\xca\xbc\x0c\xf8\x86\x7c\x59\xc7\x5f\x37\x6b\x07\xdc\x56\x8f\xab\x0b\x2a\x4d\x84\xb5\xea\x74\x47\x89\x1a\xae\xef\xb9\xdb\x5e\x27\xb4\xae\x8f\x4c\xf5\x22\x8f\x2a\xed\xd0\xea\x0b\xd3\xaf\xa3\xbd\x9b\x8a\xbb\xad\x61\x3a\x6d\x6c\x10\x38\x01\x0b\x9d\x90\xf1\x0a\xc3\x29\xdd\x60\xa9\xad\x25\xd5\x82\x13\xf5\x7c\x28\x15\x68\xcf\x94\x5a\x1c\x3a\xaa\x0d\xa5\x6f\x6d\xcd\x03\xf8\x9e\xc3\xad\x33\xa9\x1e\x7d\x15\x77\xda\x8c\x65\x1d\x33\xdc\x0d\x0c\x43\xa0\x42\xdd\xf5\x77\xad\x69\x17\xd1\x90\xc6\x34\x20\xc4\x36\xc3\x2f\x1f\xe6\x07\x34\x06\xce\xda\xfe\x4d\x23\x01\x4d\x69\x08\xc0\xf9\x8b\x46\x42\x9a\xd2\x00\xf2\x6b\x9b\x74\xbc\xa6\x78\xe1\x5c\xde\x9b\xbe\xf5\x35\xac\x5f\x64\x84\xe4\x4d\xdc\xd4\x54\x99\xe3\xc8\x0d\x3d\x0a\xa5\x5c\xed\xbd\xfe\x38\xe7\x12\x07\x63\xf5\x40\xfc\xae\x7a\x2f\x96\xd5\x03\x51\x56\x3f\x52\xd5\xab\xa5\x2a\x3e\xec\xd7\x7f\xdd\xf0\xf8\x69\xbd\x61\x51\x83\x01\x74\xab\x6e\x18\xc1\x8b\x19\xd0\xcb\x91\xf2\xc6\x7f\x6b\x86\x14\x60\x90\x90\xe5\x0d\x74\x8c\xbd\x57\x27\x09\xb4\x3c\x00\x28\x67\x8f\x97\x90\x69\x1d\xa2\xe4\x61\x86\xec\xf2\xc2\x0c\x09\xe9\x70\xeb\xf9\x61\x8b\x15\x87\x8b\x85\xd6\xca\x0c\x14\x44\x05\x0a\x6c\x02\xad\x6c\xae\xf4\x33\xdd\x8b\xc0\x33\x43\x22\x05\x18\x7b\xab\x85\xae\xd5\xc7\x4f\xbf\xeb\x85\x94\x46\xe4\x87\x14\x5e\xda\x6a\x95\x18\x71\x0f\x3d\xfc\x41\xd7\x56\xf3\x84\xec\x23\x62\x30\xb1\x5e\x2d\x54\x2a\xe5\x9f\x77\x94\x57\xc9\x7e\x6a\x0a\xec\xb7\x40\xd5\xfa\x90\x0a\xec\xb5\x70\x0f\xbd\x66\x48\x68\x8c\x78\x35\xde\x1c\x65\x9b\x81\xf5\xb5\x8c\xd2\x7e\xc7\xcd\xb8\x72\x6d\x1e\x47\x6e\xe2\x95\xf1\x08\xb6\xcc\xf6\x17\x13\x0a\xbb\x09\x4a\x27\x9d\xda\xb3\x3b\xf0\xec\x16\x21\x1a\x23\x5f\x5e\xd4\x0b\x02\xdb\xb0\x87\x61\x56\x2e\x2f\xcc\xf3\x51\x3d\x8b\x40\x06\x3a\x3d\x5c\x2c\x32\x44\xd7\xa9\x61\x1c\xc1\xee\x49\xc9\x62\x91\xa9\xe7\x4c\x63\xef\xad\xb6\x93\x76\xb2\x8e\xa9\xc3\x2a\xa4\xb0\xa7\x33\x54\x6d\xd5\x31\xcb\x52\xb9\xb7\x31\x90\x09\xb1\xcd\x84\xa5\x72\xdf\x63\x3a\x26\x64\x32\x41\x16\x81\x6f\x4b\x55\x52\x9c\x99\x84\xec\x86\x8b\x85\x4e\x08\x42\xaf\x99\x92\xdd\xb0\xfc\xfa\x52\xbb\x80\x51\xcb\x7c\xfc\xef\x80\xed\x3f\x83\x21\xa4\x80\x7b\x9c\x82\xb0\x54\x2e\x23\x2e\xb7\x78\xb7\xdc\x0a\x74\xd4\x92\x84\x08\x7d\xa2\x36\x3f\xe1\x47\xab\x1f\xd5\x57\x3f\xd2\xd2\x91\x19\xe1\x42\x01\x2f\x4b\x08\x4e\x75\x48\x23\xb2\x58\x98\x01\x0b\xac\x51\xbf\x83\xab\x38\xea\x4b\xdc\xac\x0b\x04\xa4\xb3\xd5\xb6\xcd\xca\x16\x24\x16\x93\xbd\xb1\xe0\x26\x59\x2d\x81\x33\x54\xee\xe1\xa7\x8f\xb4\xc5\x52\x20\x93\x52\x3b\x56\xb0\x37\xee\xdb\xbe\x95\x26\x34\x7a\xcc\x26\x97\xa3\xb9\xb0\x7d\x2b\x7f\xa0\x69\x60\xfb\xd6\xed\x6c\x49\x23\x16\x3d\x9a\x21\x75\xc3\x31\xa7\x79\xcf\xa3\xe8\x36\x2e\xc0\xa4\xed\x27\x4e\x2f\x9f\x38\x1a\xb7\xdd\x64\x90\xc2\xc7\x9c\x46\x63\xee\xd1\x73\x00\x8c\x53\x4c\xf3\xc7\x9c\xc6\x90\xf6\x27\x40\xe2\x36\xa6\x05\x63\x4e\xef\x20\x6d\x78\x45\xbf\x1f\x12\xe7\xe7\x07\xda\xcb\x65\xac\x7f\xd7\xa3\x39\x73\x3d\xd4\x59\x9b\x26\x6b\xea\xca\x38\x1b\x27\x27\x80\x89\xac\x98\x03\x9d\x1c\xdd\x9b\x82\x72\xab\x38\xc3\xc7\x9c\x72\x34\x85\x2a\xad\x75\x94\x5b\xa3\xc5\x22\xc7\xe8\x72\x92\xef\xd4\xda\x5c\x21\xa1\x05\x0b\x80\x18\x16\x84\x4e\xb5\xb6\x7c\x43\xaa\xd0\x3b\x42\x2a\x7f\x4f\x99\xba\x1a\x9d\x2e\x29\xb7\xae\x03\xf6\x55\x4b\xc0\x53\xfa\x9d\x9e\xd3\xad\xb6\x72\xf0\x0f\xe4\x4c\x85\xce\x48\x81\x98\x38\xf9\x5a\x03\xd2\xc3\x14\xb6\x71\x52\xb5\x91\xd3\x08\x49\x4f\xc9\xa9\xe7\x4c\x3b\x25\x28\xd8\x31\xce\xdf\xf0\x89\x53\x01\xf3\xb7\xd5\x82\x7e\xca\xc4\xab\x27\x4e\x37\x2e\x9e\x20\xb5\x4d\xe8\x8c\xdd\x47\x1c\x92\x7f\x3e\xc9\x85\xcb\x61\xe9\xe6\x6a\xe9\xae\xcb\xa5\xeb\xb2\x5b\xac\x7d\xf3\xa4\x96\x2e\x87\xc5\xeb\xa9\xc5\xbb\x7d\x52\x8b\xd7\xde\x21\xf4\x4c\xad\xde\x8f\xa7\x8f\x56\x6f\xdd\x58\x1f\x36\x4c\x79\xe2\x27\x9f\xba\xbd\x4a\x14\xd0\x4f\xda\x7f\x4d\x20\x9d\x2b\x1d\x3f\x70\x2a\xe4\x80\x82\xc6\x64\xc6\x69\x41\x68\xa4\xdf\xfb\x4f\xa8\xe4\x17\xab\xa1\x05\x8d\x8b\x01\xcd\xe9\x8c\x38\x3f\xb8\x19\xd3\xeb\xa1\x19\xbb\x7d\x7d\x3d\xa6\x0f\xdb\x71\xb8\x41\xa3\x0b\xfd\x9d\x03\x54\xde\xca\xb6\xa2\x3d\x4e\x73\xda\x05\x98\x3c\x95\x29\xf1\x1e\xea\xc5\xa4\xec\x7a\x68\xa6\xb2\x15\x67\x5b\x7d\xf8\x0e\xc6\x7a\xa6\x03\x41\xb5\x9c\xa0\x12\x16\x82\x2a\x5a\x38\xa4\x05\xa5\xc1\xaf\x7c\xb3\x86\x72\x7c\x03\x5f\x25\xd0\xef\x41\x09\xb5\x81\x84\xda\x33\x42\x33\xc1\x06\xbe\x35\xa4\x45\xc0\x60\x02\xad\xfd\x18\x68\xa2\x72\xc7\x6b\x8b\xce\x5c\xd8\xdf\xf7\xe8\xc0\x87\x52\x78\x28\x69\x18\x8f\x99\xa9\x5f\x48\x67\x43\x3f\xca\x0a\x45\x00\x80\x3e\xf0\xb7\x18\x2b\x80\xbf\x51\x80\x1e\x28\x85\x23\x11\x32\xd7\x6a\x53\x6b\x87\x5a\x7f\xf3\xe8\x73\xc4\x8e\x1e\xcc\x81\x4f\xe8\x38\x81\x27\x75\x74\x76\x72\x20\x6f\x14\xe8\xc3\x1d\x2a\x7c\x85\x74\x3a\x32\x4f\x1f\xe8\x73\x44\xb0\x85\x32\xed\x4c\xa5\x3d\x47\xac\xff\x60\x9e\x3f\x98\xe3\x04\x83\xb0\x3d\x47\x1e\x7d\xb8\xa3\x02\x6f\x65\x7e\x70\xb3\x08\xa0\x9c\x14\x82\xa0\x2b\xce\xf7\xc0\x2a\xce\xe4\x9e\x50\x93\x55\xdf\x4d\x99\x40\x09\x92\x0e\x54\x90\x95\x33\xeb\x2a\xac\xef\x2c\xac\x4d\x8b\x80\x26\x34\xa3\x29\x6c\x34\x42\xa0\x49\xd8\xee\xeb\x8d\x9e\xd4\x1a\x55\x45\x60\x57\x12\xd4\x87\xe4\x64\xb9\x71\x63\x9d\x9c\xbc\x3b\xf4\x5c\x3f\xdb\xf4\x2d\xb4\xf4\xc7\x2b\x40\x1a\xb1\x37\x68\xc6\x76\x3d\x5a\x9c\xd9\xae\xb7\xac\xfb\x6b\x57\x7c\x4e\xe4\xf8\x2b\x95\xae\xc4\xcb\x04\x8f\x4a\x2a\x4d\xb1\x96\x13\xef\x8a\x35\x3d\x6c\x21\xa3\x4a\x24\x8d\x36\xcd\x58\x6b\x97\x7d\x1f\x99\x3e\x48\x58\xa1\x74\xd4\x9b\x10\xc3\x30\x53\x65\x59\x83\x47\x2a\x90\x46\xc5\x3f\xed\xac\x23\xb5\xdd\xe9\xf8\xf1\xf9\x58\xba\x05\x5f\xae\x84\xe8\x38\x7b\xe2\x8d\xa4\x71\xf5\xc0\x01\x9e\x03\x02\x1b\xb1\x23\x6d\x45\xa5\xbf\x4d\x3b\x82\x15\xc1\xc7\x32\x6e\x6b\x54\x27\x28\x5f\x4f\xdf\x45\x05\xa2\x78\x92\x40\x0b\x5a\x8a\xcd\xae\xfb\xd7\xdf\x29\xfe\xe7\x51\xb7\xbd\xf3\x4f\xaa\xfe\x79\xd4\xdd\xf9\xf3\x4f\xaa\xfe\x79\x9e\x52\x58\x63\xac\x00\x2e\x0e\xe4\xf9\x00\xdd\x4d\x49\x67\x62\xb4\x87\x82\x37\x0a\xa6\x67\x4c\x05\x0d\xf4\x81\x89\xf0\x91\xc4\x62\xdc\x4d\xdf\xdd\xf3\x08\x3d\x65\x3d\x26\x13\x2f\x58\x57\x46\xd9\x85\x82\x2a\x70\xa1\xd2\xbe\x47\x35\x34\xd6\x65\xbe\xf5\xa2\x2a\xbc\x2a\x4f\xd4\xa7\xcd\x8c\x0e\xd9\x25\x7d\xe0\xac\x99\xc9\xe8\xe3\x03\x8f\x1e\x71\x96\x35\x12\xe0\x0a\x3e\x0d\xb8\x73\xda\x3c\xe2\xbb\xa5\x9c\x63\x18\xa7\x0d\xfd\x0e\x14\xde\x30\xcc\x4b\x06\x49\x74\xc8\x4e\x1b\xaa\x1a\xb4\x97\x95\xee\xc0\xda\xbb\x03\x54\x06\x60\x17\xf4\x94\x0d\xe9\x50\x8a\xb4\x43\x86\x27\xd2\x23\x60\x15\x53\x0e\xdf\xe4\xd6\x76\x60\x0e\x61\x41\x03\xe5\x74\xfd\x88\xbb\x63\xef\x0b\x8c\xa5\x63\x06\x0c\x67\x20\x63\x7b\x03\x02\xdc\x40\x46\x33\x36\x3a\x40\x2f\x5c\xdb\xd7\xf6\x56\x9b\xa6\xdc\x17\xa9\x0a\x9c\x34\xa4\x3e\xb7\x13\x7a\x6c\xbb\xeb\xe1\x97\x8e\xaa\x00\xe3\xc3\x25\x9a\x62\x65\xca\x12\x6b\x35\x70\x52\x40\x37\x4e\x75\xd4\x24\xaa\xae\x47\x87\xee\x4d\x80\xd6\x5e\xa3\x47\xf4\xc3\x36\x24\x4e\xa0\x23\x1d\x48\x7d\xa8\x01\xaf\x14\xa2\x60\x80\x99\x47\x87\x7a\x60\x28\x39\x24\x04\x46\xfa\xb6\xa4\x87\x82\xa9\x2f\x75\xe9\x25\x01\xfc\x86\x73\x75\xc4\x2d\x9f\xb3\xde\xa3\x99\xd0\x83\x47\x22\xc1\x00\x08\xca\x99\x61\x6c\x4d\x4b\x7c\x7a\xf4\x60\x86\x04\xd0\xa9\xc4\x3a\x03\x9f\xce\x08\xb6\x11\xa1\x8d\x6d\x67\x7b\x60\x9f\xc3\x8e\xaf\x1a\x9a\xc3\x02\x08\x2b\x0d\xd8\x77\xfa\x83\x9b\x88\x0c\x08\x71\x26\xb6\x46\x8f\xb2\x7b\x02\x98\x39\x40\x67\x03\x1f\x9a\x3b\x03\xbc\x88\xe6\xa5\x99\x60\x30\x09\x80\x11\x9f\x46\xe6\x0e\xe9\xec\xd8\x2d\xfa\x12\xd5\x5e\xbe\x07\x6c\x9c\x00\xa6\x13\x21\xa1\xdf\x9e\xe8\x36\x34\x62\xf1\xc0\x24\xce\xb7\x27\xf6\x3d\x70\xc7\xde\x2e\xdb\x8e\xdc\xb1\x67\x18\xdf\x03\x77\x4f\xbe\xed\xc9\x00\x08\xdb\x11\xcc\xc9\xdd\x3d\xcc\x66\xf0\x62\x6e\x47\xb4\x08\x88\xb3\x1d\xc1\x64\x08\x74\xa8\xf2\x0c\x43\xdb\x1e\x90\xe7\x48\x42\xf9\xc0\x77\x7b\x73\xcf\x24\xd6\x0b\x81\x7e\x0c\x70\x13\x34\x5e\x22\xba\x1d\x59\x5f\x03\x36\x3a\x80\x87\x41\xc0\xf6\x06\xe5\xc5\x08\x36\x71\x5e\x10\x1c\x1e\x6c\x12\x68\x64\xec\x35\x1f\xee\xb0\x89\xd5\x66\x5f\x09\xdd\x90\x4d\x15\x7d\xd5\xd4\xe8\x40\x36\xf5\xce\x31\x07\x40\xd3\xa6\x9f\x3e\x06\xc9\x66\xfe\x58\x8c\x74\x74\x1f\xe0\xa3\xbf\x3d\x2d\x16\x38\xf6\x2f\xe5\xb7\x46\x91\x29\xc7\x3f\xc0\x2d\x8c\xee\x26\x43\xf6\xfd\x1b\x10\x0f\x9c\x3e\xaa\x8b\x52\x2c\xf1\x59\x16\x6f\xec\x10\x02\x33\x24\x42\xeb\x98\x8a\xd0\x9a\x28\xd2\x76\x7e\xcf\x8a\x00\xa6\xea\x6e\x9f\x6d\xb5\x2a\x8f\xa6\x58\xf7\x8b\x40\x83\xdf\xcf\x7f\x23\x58\x0c\x67\x78\x28\xbc\x0f\x87\xab\x07\x49\x75\x5b\x52\x87\x55\x43\xa6\xd6\x2c\xde\x8e\xac\x63\xe5\x15\xf7\xee\x5e\xc7\x63\x14\x21\x2b\x02\xd6\x02\x70\xc1\x44\x47\x84\xbb\xe3\xc4\x11\x61\xa3\x41\xa0\x02\x6a\xe5\x89\xe7\xcd\xd1\x57\xae\xe3\x69\x17\x81\xde\x92\x83\x2a\x8e\xf0\xdd\xbd\x2b\x42\x6f\x49\x08\x2d\x82\x06\xc3\x71\xcb\x39\xff\x45\x23\xe5\xb6\xc6\x39\x96\x6d\x14\xc1\x92\x20\xec\x1c\xfa\xac\xe5\x1c\x20\x34\xa9\xad\xf6\x1c\xd1\x17\xa0\x95\x99\x30\x8c\xf3\x7b\xc3\x30\xb7\x23\x2b\x14\x0c\xaf\x05\xdb\x54\x9e\xbd\x6f\xe8\xc3\xf7\xf3\xfb\x25\x71\x06\xd2\xd0\xf1\xfe\x2b\x37\xb7\x23\x82\x07\x58\xd3\xc5\x62\x4b\x18\x86\xb9\x35\xf0\x17\x8b\xf6\xee\xc0\x47\x1b\xd9\xc5\x62\xe0\x5b\x77\xfb\x44\xdf\xd6\x46\x55\x84\xa6\x23\x2e\xa3\xef\x3b\x30\xce\x2f\x43\x8e\xe8\xec\x50\x58\x2f\xac\x4b\x8f\xb8\x84\x56\x62\xcb\x94\x33\xc0\x71\x32\x71\x6f\x40\xd6\xc2\x37\x95\x25\x1a\x67\xee\xd8\x6b\xec\x94\x05\xa9\xfc\xc4\xe8\x80\x1e\x0a\xeb\x95\x9d\xe9\x45\x55\xd0\x80\xf5\x2e\xca\x6f\xd1\xb2\x43\x08\x26\x86\x61\x0a\x39\xa4\x2d\x35\x84\x37\xf4\x10\x33\x50\x5e\x31\x79\x0c\x70\x85\xb0\xf0\xe1\xd8\xb0\x4d\xa7\x1a\xe4\x4a\x97\xdf\xf5\x70\x19\xbc\x98\x40\x2c\x50\x16\x57\xe8\x2e\x81\xdf\xaf\x4f\x2c\x85\xd5\x3a\xe2\xf4\x50\x60\x0e\x00\x61\x1b\x1e\x8e\xd9\x3b\x34\x3e\xac\xa1\x71\x34\x12\xf7\xa0\x20\xae\xf8\x90\xb3\xa1\x25\xfe\xe9\x48\xa4\x2d\x39\xd2\x21\x10\xa0\x23\x5e\x86\xd5\x19\x72\x3a\xb4\x34\xab\x40\x94\x4b\x9c\x23\x4e\x9c\x8d\xcb\x26\x43\x12\xb6\x5c\x66\x8c\xc7\x9d\x96\xfd\xc0\x1d\xce\x2e\xee\x9c\xc2\x30\x22\x8c\x91\x80\xa4\xac\x45\x39\xbb\x8a\x69\x97\x95\xd4\x96\xf6\x14\xf9\x95\x82\x93\xb6\x3c\x56\x37\x28\x87\x7f\xda\x6f\x2f\x76\x97\xbe\xda\x3d\x3d\x84\x8c\xd6\xa2\x81\xd9\xda\x39\x63\xbe\x94\x84\xac\xb0\x03\xea\x4f\xb3\x30\x15\xf6\x69\xe7\x54\xe9\x55\xd6\x82\xf5\x9f\x7e\x10\xac\x1f\xe8\x7b\x0c\xd4\x1d\x83\xbe\xbc\x06\x9e\xe3\xb3\x1a\xcb\x55\x73\x12\x5e\x2a\x38\x66\xe8\xfa\x5b\x46\xda\x07\x9a\x0e\xa8\x1e\x29\x01\x88\x95\x67\xd2\xde\x34\x21\x8e\x5f\xf9\xd5\x55\x17\xd3\xf2\x88\x38\x65\x19\x36\xea\xeb\x46\x73\xe6\x43\x7b\x3a\x3c\x7b\x46\x73\x2b\xbe\x23\x4e\x0a\x0c\x85\x13\x4b\x8d\x87\xb8\x99\x02\x6b\x12\xff\xbf\xb4\xbd\xf9\x72\xdb\xb8\xb2\x38\xfc\x7f\x9e\x22\xfe\x2a\x3f\x15\x31\x82\x31\x72\xce\xc9\x9d\x73\xc9\x60\x54\xde\x63\x27\xde\xe2\x45\x8e\x59\xac\x53\x00\x09\x52\x32\x69\x4a\xd6\x62\x4b\xb6\xf4\xee\x5f\x75\x03\xe0\x22\xc9\x99\xcc\xbd\xe7\xa6\x52\x16\xb1\x37\x80\x46\xa3\x01\xf4\x52\x65\x2a\x9c\xa4\xbc\x4a\x25\x5e\xca\x93\x66\xe6\xa5\x7f\x56\xb9\x8c\xb4\x72\xbf\x9a\xf0\x74\x33\x2b\x3c\xca\x94\x77\xb0\x95\x3c\x45\xaf\x47\xba\x51\x27\x69\xa6\xe4\xf7\x8f\x28\x89\xd9\xfc\x48\x9f\x4a\x0b\xf8\x6f\x0c\x88\xd4\x3f\x9a\x9f\xc8\xb5\x16\xb7\xe6\x27\x26\x40\xbd\xec\x2c\x42\xff\x34\x1e\x0e\x50\x49\x5e\xf3\x14\xbd\x7d\xe3\xd0\xbc\xaa\xd2\x7d\x28\xdd\x8f\x7f\xb4\x16\xc0\xfb\x2d\xe3\xe7\x0b\xca\x5f\x5a\xec\x7c\xa1\x79\x15\x39\xdf\x3d\x19\x1b\x89\x93\xa6\x9e\xd6\x45\x0d\xa9\x62\x3a\x73\x13\x0b\x4e\xba\x99\xd4\xd0\xea\x7b\xd7\xe0\x95\x2a\xf0\xea\xc9\xe2\x95\xc6\xa9\x02\xa5\x76\x56\x24\xc7\xb5\x68\x78\xc4\x4f\xac\xb0\x72\xc8\xd2\x46\xe3\xce\x09\x97\x5e\x9d\x4a\x81\x4f\xc1\x6e\x78\xa4\xdf\x9b\x0a\x41\xc1\xc3\x3f\x30\x41\x8e\x30\xe5\xf0\x8f\x52\x32\x93\x7d\xd1\x49\xa1\x4e\xfa\xf2\x07\x21\x64\x01\xad\x3c\xc5\x68\x15\x0c\x3e\x0c\x71\xd5\x01\x63\x2f\x91\x34\x1a\xa7\x27\xc2\xa9\xba\x06\x1f\xfc\x4c\xc4\xbe\x22\x2e\xbf\x24\x2d\x7f\xba\xf2\x7e\x5a\xf4\x5f\xf9\x32\xf0\x22\x95\xa9\xb1\x7a\xaf\x8c\xfe\x57\xd8\x68\x6c\x7d\x2e\xce\x59\x40\x27\x11\x37\xf1\xc7\xf8\xd1\x47\x2d\x31\x19\xb0\xf0\x79\x83\x5f\xd8\x83\x94\x89\xc1\xb7\x3c\xa9\x43\x67\xdf\xbc\x90\xdd\x5d\xf3\xab\xef\x8e\x39\x95\x49\x1a\xd1\x8d\x2d\x74\xdf\x62\xea\x85\x81\xee\x0a\xcc\x62\xbc\x64\xdb\x1c\x64\x21\x60\x6c\x0e\x7a\x80\x19\x21\xa9\xbf\xee\x9a\x3b\x88\x0d\xe5\x8b\xc0\xf6\x26\xf6\x45\xa0\x8f\xc9\x46\x22\x2a\xc2\x28\x7f\x0a\x8b\xe9\x75\xe1\x25\x6c\x70\xc0\x85\x97\x20\x28\x40\x34\xd0\x02\x72\xdb\x09\xd9\x43\xea\xb4\x08\x3d\x11\x4e\x42\xfd\x80\x10\x17\x1d\x86\xb4\x88\x97\x18\x11\xa1\xd0\x83\x76\x78\xb2\x80\x9f\xe2\x40\x65\xde\x83\xcb\x43\x0b\x21\x98\x4f\x77\xcc\x7e\x2d\xe5\xd4\x74\xb4\x24\xa0\x64\xf9\x39\x5a\x58\xa0\x0b\x69\x0b\x73\xc9\x02\xc7\xb9\x85\xbe\x34\x7b\xd5\x46\xf1\x9f\x62\xf6\x78\xe0\x99\x51\xe2\xb5\x83\xe7\xbb\x16\xd2\x9e\x74\x49\x49\xef\x75\x81\x8f\x35\xa9\x9f\x68\xa7\x38\x8d\x46\xc6\x6e\xf0\x0f\x8b\x87\x15\x65\x08\x1d\x61\x15\x20\xac\x6d\x48\x23\x2e\x9e\xf9\x79\xc0\x06\x07\x5e\xe4\x0c\xe0\xac\x9a\xfa\x83\x80\x6f\xb4\x68\xe8\x0c\x28\x24\xf9\xa9\xee\x55\x7f\xe8\x0c\x50\xb4\x93\xa4\xe8\x28\x22\xf6\x07\x01\x9b\xde\xcf\xe7\x12\xa8\x6c\x25\x59\x87\xed\x20\x9c\xd8\x25\xba\xaa\x26\x76\x77\xe4\x9a\x31\xb9\x85\x55\x36\x16\xf8\x40\xa1\xf7\xe1\xdb\xbd\x6a\xda\x5e\x2d\xed\xf2\xb0\x9a\x76\x50\x4b\xdb\xa9\x95\xdb\xad\xa5\xed\x1e\x57\xd3\xbe\xd4\xd2\xc2\xfd\x6a\xda\x7e\x2d\x6d\x54\xab\x73\xc7\xa4\x2d\x2a\xd6\x72\x17\x1d\x00\x9f\xaf\x7b\xe2\x7d\x9d\xba\x15\x59\x81\x03\xe5\x48\x60\xff\x67\x6e\x45\x5a\x00\x23\x67\xc6\x59\xf4\xde\x4a\x3d\x95\xdb\xf2\xc7\xa1\x75\x12\x5d\xaf\x4e\xf1\xd5\xea\x68\xec\xc5\x3c\x34\xb6\xe7\xce\x60\xc9\x5e\x3c\x52\xe9\x1f\x04\xb0\x1e\x20\x76\xbf\xdb\x0e\xd9\xd5\x8b\x0f\x71\x81\x7f\x10\xb8\x21\x93\xa7\x5e\x5c\xf7\x76\x16\xd3\x5d\xe5\x86\x6c\xf6\x60\x85\x8d\x43\x36\x54\x40\xf0\xf8\xf0\x8b\x70\x42\x76\xb5\x4f\x25\x8a\xc1\x7b\x45\x77\x23\xb4\xf1\xa1\xd5\xb2\x63\x3a\x14\x51\x6f\x02\x9c\xc1\xfd\xb9\x1b\x2e\x16\x5e\x07\x26\x6c\x6d\x0f\x63\xfb\x10\xce\x1e\x15\x95\xac\x9f\x51\xc9\x4e\x9e\x81\xb6\xc6\x43\x9e\x74\x0a\xef\xb5\xa4\x94\xb8\xf3\x3a\x30\xc5\x6b\x6b\xeb\x96\x05\x60\x79\xa6\x54\xb2\x6e\x56\x16\x6d\xbf\x8e\xfb\x03\x37\xc4\x2d\x38\x53\xf1\xd8\x0d\x61\xd9\x3f\xa3\x95\x68\xe4\xcb\xbb\xaa\x97\x74\x21\x7a\x3b\xa0\xf1\xd0\xad\xb6\xbf\xb0\x76\xfc\x3a\x80\x28\xbf\xd0\x7a\x72\x2f\xa0\xf9\x7b\x54\x31\xa9\x27\xc5\x90\xe4\xbf\xbc\xe8\x47\x96\x8d\x10\xf5\x3e\xaa\x76\x98\x07\xc2\x89\xe8\x47\xe2\xdd\xc1\x6f\x84\x47\x40\x80\x6f\x13\xff\xfe\xbf\x8f\xed\x7f\xb8\x1f\x09\x30\x09\x85\x24\xa3\xba\x17\xcb\x0a\xcb\x5e\x9e\x6b\xcb\x20\x8a\x2b\x76\x2a\x7f\xff\x48\x2f\x85\x13\x52\xe8\xdb\xe6\xc7\xdf\x14\xa1\x03\x1d\x1c\x9a\xe0\x9d\x0e\x1e\x06\x4d\x45\x28\x8e\x51\x93\x2b\xe2\x61\x21\xcd\x24\xe1\xb0\x00\xaf\x38\xa8\xc6\x0d\x03\xba\x55\xf2\x8f\x43\x15\x8e\xdd\x10\x15\xa1\x51\x36\xfd\x5d\x07\xd6\xdc\xdb\xc8\x5d\xe8\x9f\xeb\x6b\x26\x98\x34\x94\x4c\x1d\xa7\xfc\xf9\xca\x09\x99\x12\x34\x64\xfb\x92\x8d\x4b\xc9\x08\x6b\xb1\xce\xba\x97\x97\x2c\x1f\x06\xec\x16\x25\xe6\xb2\x67\x9a\x68\xf6\x56\x6d\xe2\x03\xf6\x6f\x31\xf0\x52\xe6\x14\xa9\x9a\x95\xb8\x54\x3f\x23\x20\x86\xd0\x88\xf7\xcc\x0c\x25\xd4\x44\x8f\x53\x02\x6b\xac\x8c\x47\xbf\x14\x36\x18\x43\x30\x05\x7a\x5d\x75\xcf\x7b\x3c\x12\x74\xa3\x45\x2c\xb7\x24\x99\xfc\x2f\x34\x83\xb1\x52\xb9\xfc\x2f\x42\x68\xaa\x37\x45\xa2\x7d\xef\x28\xf3\x5b\x3c\x42\xbd\x7e\x7f\x74\xbf\x7f\x13\x4e\xc4\xa6\x34\x62\x33\x1a\xb3\x29\x8d\x61\x8d\xf7\x27\x63\x1c\xdf\x74\x05\x47\xab\xf7\x80\xdd\xce\x2a\xe3\x5d\x98\x6b\xb9\x8f\x7d\x89\xc3\x2e\xb9\x60\xb3\x33\x23\x4f\x1d\xa1\x2d\xb1\xe7\x2b\x27\x41\xcb\x87\xc5\xb8\xa3\x67\xc7\xd9\xf3\x9f\x5c\xb2\x97\x7f\xcd\xe7\x21\xcb\x87\x7f\xf2\xd8\xf8\xcb\x6f\x34\x62\x6b\xa6\xb6\x8a\xc2\xb1\xf5\xea\x0f\x1d\x8e\x08\xc5\x5f\x85\xc2\xff\x1a\x73\x56\x12\x12\xee\xa8\xaa\x25\x19\xd2\x9e\xc2\x6e\x0e\x73\x5a\xb3\x15\xd3\x6e\xb9\x5b\xae\xae\x7c\x8b\xb2\x8f\xbf\x39\xd1\x26\x9c\x95\x5b\x9c\xf3\x64\x3e\xc7\x89\x8e\x9b\x09\xf9\x8c\x5f\x11\x69\x34\x8a\xa8\x3f\xf5\x17\x69\x3b\x06\x21\x20\x12\x56\xa7\xce\x49\xdc\xb8\xc9\x13\xf3\x2c\x51\x38\xd1\xca\xc7\x82\xb2\x7f\x10\x9a\xf0\xb3\x82\xbd\xe4\x4e\xc8\xfa\x3d\xd1\x4e\xdd\x2d\xf2\x9b\x64\xe2\xfc\xf7\x8f\x9e\xe4\x8e\x6a\x77\xfd\x99\x0c\x5c\xa8\x8f\x38\xc9\x26\x66\xc5\xca\x93\x66\x48\x3c\xc4\x1e\x98\x93\x98\x78\x42\x7f\xa3\x38\xb2\xf5\x3d\xfe\x4d\x38\x66\x8e\x69\x21\x9f\xf6\xae\x03\x7b\xcf\xd2\xfa\x59\x2f\x22\x67\x1c\xaf\x09\x57\x2d\x2a\x0b\xc5\x2e\x30\xaa\x60\x62\xd1\xa4\x65\x64\x26\x16\x78\xab\xf5\xe4\x97\xc6\xcb\x29\x93\xff\xa2\xa1\x23\xd9\xd3\x7f\xa1\x3d\xd0\xa5\xc4\x67\x9d\x38\x45\xa4\x5e\x4e\x9c\xe9\xc4\x17\x48\xcc\x96\x13\xb7\x75\xe2\x0e\x24\xe6\xeb\xe8\x3d\x6c\x2d\x28\xd2\x07\x2b\x60\xef\xc6\x85\x01\xda\x87\x9f\x19\x3d\xb8\x71\x13\x36\xa5\x87\xf0\x33\xa3\xe3\x13\x37\x65\x53\x3a\x81\x9f\x19\x7d\x3a\x71\x33\x36\xa5\xcf\xf0\x33\x83\x65\x92\xd7\xd6\x46\xd2\xa9\x48\x4d\x6f\x84\xec\xe6\xa0\xb4\xa6\x6b\x05\x60\xb3\x08\x17\x47\xb1\x52\x34\xa9\xc5\xd5\x52\xac\x07\x55\x59\x0f\x51\xb1\x1e\xa2\xfa\x7a\xa8\xf0\x74\x71\x81\x43\xe8\xb1\x89\xa6\xbc\x45\x33\x2f\xe3\x00\x01\xca\x2e\x97\xa7\x3b\x09\xcb\x22\x63\xbb\xa9\x20\x70\xc8\xd3\xa1\xbd\x14\x9f\x18\x9d\x42\x6e\x08\x1b\x05\x66\xdf\xb6\xae\x63\xfc\xad\x80\xdd\x6e\xea\xcf\x56\xc0\x6e\xdd\x96\xab\x98\x38\x27\xbf\x65\x6c\x3f\x15\x74\xc2\xf5\x3b\x7e\xbe\x89\xea\xaa\x88\x89\xf1\xe6\xe8\xf7\x8f\x54\x2f\xab\x01\xcd\x71\x3e\x06\x6c\x4a\x07\x7c\xc0\x66\x74\xa4\x33\x8d\xe8\xc4\x3a\x2a\x42\x42\x6f\xae\xfc\xf1\x71\x81\x4d\xe9\x08\xa8\xd3\xe0\xc0\xcd\xd8\xe0\x60\x51\xf0\x4a\x49\xc9\x17\x9e\x2d\x1f\xdd\xf4\x43\x37\x8c\xa9\x79\x78\xb7\xf6\xa8\xdb\x86\x50\xf6\x33\xe2\x86\x55\x32\x4f\x36\x23\x76\x98\x89\xa6\x13\x31\x71\xde\xc4\xe5\x37\x7b\x6e\x46\xb8\x06\x2b\x07\xa6\xeb\x9b\x1a\x03\x2a\x0c\xf7\xd9\x2d\xb8\x41\xc9\x9e\xa5\xf1\x50\x3d\x13\x65\x64\xef\x5e\x47\x26\x65\x46\xff\x20\x28\x4c\xfc\x17\xc2\xd3\x65\x9f\x7a\x05\x2e\x15\xbe\xd8\x4f\xeb\x9e\xcf\x0b\x4c\x96\x74\xe6\x86\x8b\xe2\xce\xa9\x88\x0f\xe9\xcc\x95\x8b\xc5\xca\x7d\xed\x92\x17\xf6\xb2\xcd\xb8\x22\xf8\x63\x40\x42\x30\x60\x40\x61\xdc\x42\x42\x35\xe6\x06\x9a\xc8\x56\x58\x73\x59\x97\x4a\xd3\xa7\x2c\xc0\xe8\x7e\x8e\x7e\x3f\x42\x7c\x52\xdc\xe0\xdb\xca\x1e\x0a\x61\x92\x45\xee\xbc\x1c\xd1\xd0\xb8\x1e\x0d\xd9\x53\xc4\x23\x6f\x23\xd7\x45\x24\x9e\x00\xbb\x91\x63\xd2\x29\x1e\xc6\xe0\xf0\xa7\x4d\x76\xe8\x5c\x4e\xc8\xf2\x8c\xff\xd8\x27\x6b\x74\x27\x76\x97\xf0\xc2\x40\x85\xf5\x84\xec\x54\xfe\x56\xe5\xff\xca\x49\x3e\x2c\xc5\xd6\xb5\x9c\x37\x3e\xe6\x2d\xeb\xda\x96\x86\xe7\xf1\xc9\x11\xaa\xd7\xea\x77\x28\x1f\x6a\x24\xef\x48\x5b\xb0\x3d\x07\xa3\x38\x7f\x4e\xda\x61\x7b\xcb\x6d\xb9\xa1\xbb\x55\x02\x79\xf4\x46\x6b\x85\xb6\xef\xaf\xb5\xb3\xb1\x11\xba\x1b\xad\xb2\xda\x2f\x6f\x75\xa2\xaa\x58\xfc\x3f\xec\xc3\x47\x77\xab\xde\x87\xce\x4d\x75\x9c\x51\xe3\xb9\xea\x82\x89\x73\x1e\x6a\x61\x5c\x2b\x9e\x0e\x70\x95\xc5\xb1\x40\xc5\x10\x39\xe0\xdb\x7c\x2e\xb4\x0d\xd8\x15\x16\x40\x2b\xbf\x58\x73\xe4\x2c\x11\x83\x6a\x57\xc4\xbd\x23\x88\x69\xcc\x6f\x55\x5d\x02\xdc\xdd\xbc\xed\x1a\x85\xc6\x56\xfc\xbf\xb0\x3a\xa3\x47\x42\xa0\x22\xcd\x52\xa4\x24\x15\x83\xcd\x85\x52\xa6\x93\x34\x79\x44\x25\xfc\x51\x68\x0a\x26\x0f\x9d\x84\x50\xfc\x95\x40\xf8\x90\xc0\xed\xa5\xc2\x4d\xe8\x6e\x2a\x5c\x49\xf7\x53\xe1\xc6\x40\xd9\xc4\x82\x68\x99\xf1\x84\x4b\xf6\x84\x92\xb9\x1b\x49\xad\xd3\x15\x43\x3a\xd2\x18\xd2\x41\x65\x8a\xdc\x9e\xed\x05\x6f\x79\xe2\x73\xa2\x5d\x75\x78\xa2\xc9\x3f\x92\xd8\xc1\xa0\x08\xa8\xfe\x6d\x6e\x05\xb4\x55\xda\xf3\xd2\x4e\x88\x13\x36\x39\x47\x09\x59\x6f\xf0\x99\x8f\xbc\x41\xb3\x49\x47\x9b\x9b\x44\xe8\x84\x41\x40\xa5\xfe\x1a\x05\x54\x8f\x54\xc2\x1e\x0f\x7c\x11\xb0\x51\x2a\x74\x5d\x92\xb7\x3c\xf9\x39\xd1\x17\x0a\xb2\xd9\xc4\xb2\xa9\x2f\x75\x01\x61\x9b\xb4\xd9\xd0\xbd\x48\x91\x6f\x57\x42\xc6\x01\x37\xb5\xda\x22\x9c\xcb\xf9\x5c\x72\x9e\x58\x6f\x24\xed\x01\x43\xff\x15\x6c\x9c\xa2\xeb\xc6\x96\xf6\xf5\xc1\x13\x73\x27\xb6\x0a\xff\x3b\x9d\xa4\x7b\x80\x9f\x45\x17\x96\x20\x3a\xaa\x02\x74\x54\x03\xdc\x4e\x01\x6c\x81\xb9\x3e\xaa\x15\x88\x93\x2f\xcb\x5f\xa2\x01\xd8\xc2\xda\xb1\x5c\xb6\x76\x3c\x9f\x6f\xf4\x7a\xce\xed\x9b\x56\xba\xec\xad\xe0\x53\xbc\xb0\x82\x7d\xa1\x36\xea\xf5\xeb\xd6\x1d\x43\x7e\x0e\x50\xa1\xe8\x38\x84\xcc\x69\x8a\x6e\x01\x57\xf6\x10\x0b\xc3\x7c\x86\xc8\x9e\x62\x5a\x04\x69\xca\x70\xd5\x68\x0c\x0d\x39\x4b\x27\x6a\x6e\xc1\x51\x10\x78\x36\x27\xda\x54\x10\x52\x5e\xf8\xa7\x16\xb7\x36\x0c\x2f\xf1\x60\x8f\xe5\xaf\x2f\xff\x72\x15\x15\xe7\x6e\x4c\x0f\x33\xe1\x4a\xcb\x69\xb7\x5b\xae\xe3\xc4\xb0\x99\xaa\x4d\xa8\xac\xa6\x4f\x7f\x5e\xf5\x7f\x79\x0f\x0b\xc4\x76\xca\x2b\x04\x88\x2e\xba\x75\xab\x77\xf1\x41\xe9\x6b\x00\x4d\xd2\xaf\x98\x52\xb8\xfe\xe2\x48\x5f\xa1\x80\xb3\x57\x08\x89\x3b\xa1\xe9\x5e\x68\x8c\x58\xc6\x9b\x46\x5f\x38\x2e\x0d\xfe\x17\x2e\x46\xd0\xca\x25\x54\xb4\x45\x36\xf1\xb7\x55\xdd\xe7\x7e\xbc\xa5\x8e\x97\x45\x9e\x28\x4d\xd6\x4b\x1e\xc2\x9e\xf7\x21\x69\x87\xfe\x87\xc0\x97\xa5\xd1\x0f\xc0\x3e\x8a\x14\x05\x4d\xbf\xcb\xaa\x96\xb8\x57\x2a\xb6\xa0\x19\x0c\xe4\xb4\x4f\x72\x2e\xb4\x19\xb5\x78\x0b\x16\x3b\x7e\xa6\x97\x7c\x63\x4b\x7f\x8a\x1e\x7f\x7d\xd1\xb7\xd9\x74\x7f\xe2\xb6\x68\x96\xb9\x2d\xfa\xfd\xd8\x6d\xd1\xcb\x63\xb7\xb5\x58\xdc\x77\xfc\xaf\x01\x13\xf1\x8a\x94\x8b\xa9\xd4\x0f\x03\xae\x9d\xcc\xa1\x91\x4a\x53\x29\x7b\x51\xdc\xc8\xdf\x88\x1e\xdb\x9f\x70\x38\x3b\xd8\x60\x06\xd4\x67\x56\x04\xbf\x1f\xd7\x52\x2f\x21\x38\x23\x0b\x6f\x32\x70\xb0\xf1\x25\xec\x35\xdd\xf2\xe3\xc7\xc0\xd1\x9e\xce\xb4\x73\x63\x57\x2e\xc8\x82\x94\x83\x90\x56\xd8\x91\xa5\xa1\x38\xe0\x52\x7f\xec\x0d\x79\xa8\xbf\x64\x97\x47\xfa\x6b\x36\xd3\x4f\xb6\x3a\x43\x4b\xbf\x60\xc2\x80\xea\x98\xee\x05\x26\x2f\x7e\x38\x69\x87\x4e\xc6\xc4\xeb\xf0\x14\xa0\xf4\x3a\x6c\xa7\x6a\x5e\x5f\x37\xe4\xff\x90\xc0\x33\x98\xc6\x4c\xe8\x79\xec\x98\xaa\x88\x97\x76\x98\x62\x3b\xfe\xb7\x40\x5b\xab\xae\x4c\xe2\x45\x9d\x40\x1c\xb0\xe7\xb1\xf7\x1d\xd1\xbe\xa6\xc1\x61\x7b\x77\xc0\xba\xa1\x23\x29\x44\x68\x8d\x8d\xe7\xb1\x23\xb0\x09\x81\x30\xab\xe7\xf7\xb7\xa7\x0e\xd4\x33\x08\x81\x5d\xfa\xa6\x93\xe9\xf7\x2f\x14\xef\x3c\x07\x02\x4a\x95\xa8\x7a\x59\x6f\x7e\x6f\x88\xe5\x7e\x06\xc1\xde\x70\x09\x84\x8a\x1a\x6a\xb5\x32\x25\xbc\xeb\xbf\x53\x4b\x85\x7f\xb6\xab\x5e\x3a\xe7\x1a\xec\x6c\x22\xf4\x26\xeb\x5c\xe8\x88\x87\xc9\x52\x3f\xbe\x97\x65\x8e\x46\x98\xe5\x39\xb6\x65\xbe\xe8\x88\xe9\xd8\x46\x98\x5a\xcb\x1c\xa6\xd6\xe7\x22\xc7\xa1\x2e\xf2\x54\x44\x24\x3a\x62\x5c\x44\x1c\xed\x63\xc4\xac\x88\x10\x07\x18\x31\xd1\x11\x8b\x0e\x00\xbd\xc6\xb6\xf7\x5d\xe6\x98\x89\xd4\x13\x24\x20\x46\xc0\xf4\x4d\x37\xb9\x64\x53\xa0\x96\x9b\x28\x7d\x64\xdd\x19\xb4\x3c\x09\x0b\xb0\xa5\x7d\x71\x95\x2b\x49\x96\xcb\x88\x4a\x96\x5e\xce\xe7\x12\x57\xcb\xcd\x50\xd0\x57\x94\xd4\xc5\x05\x4a\xa7\xd2\x05\xfe\x5f\xaf\x50\xe0\xf6\xf5\xe2\x5c\x2c\x08\x16\xe3\x1b\x2d\xaa\x0b\x5e\xbd\x5d\xf0\xfb\xb1\x2d\x78\x79\xbc\x58\xa0\xb5\xf5\x0e\x4c\xc2\x5f\x77\x90\x86\xa6\x83\xa1\xed\x60\xb8\xda\x41\xc1\x85\x7f\xf1\x18\xe8\x8e\x8a\x00\xc8\x56\x4b\x6b\x3d\x02\x84\xd8\x6f\x24\x66\xd4\xf6\x3f\xac\xf4\x3f\x84\xfe\x63\x07\xae\xff\x4e\x07\x3a\x30\xff\x6b\xe0\x9f\x7d\x73\x70\x8f\xd4\x57\x7d\x63\x9c\x1b\xa4\xd9\xe7\x5f\xb4\xd6\x1c\x36\x75\x07\x4d\x4d\xa5\x2b\xe9\x8b\x72\xc3\x05\xda\x4f\x30\x74\xa5\xb0\xe9\x52\x84\x6f\x4e\xaa\x16\xec\x67\x33\xad\xba\x87\xf5\x74\x6c\x3d\x0b\x42\x33\x73\x05\x71\xda\xc7\x53\xba\x25\x53\x21\x02\x3b\x1d\x0b\xbe\x46\xb8\xd9\x00\xc8\x2b\x8d\x17\xad\x89\xb2\x0e\x94\x15\xaf\x50\x9d\x1b\xbb\x5c\x04\x42\x71\x3b\x14\xd4\x68\x46\x01\x39\x3d\xeb\xe3\x8d\xde\xbb\x0e\xac\x88\xb7\x86\xc8\xab\x41\x50\x74\xe8\x43\x75\x60\xc4\x02\x6b\x44\x68\x7e\xf4\x61\x61\x40\x57\x9e\xde\xae\xb4\x3e\xee\x45\xa5\x3f\x6a\xa3\x4d\x07\x43\xf5\xa4\xf2\xf1\x9e\x39\x18\xdf\x3a\xc2\x57\x8f\x01\x2a\x8e\x16\xcd\xdd\xe2\x20\x5a\xf2\xce\x44\x8c\x0a\xf8\x88\x66\x08\xc4\xf8\x6f\xf7\xec\xfb\x5b\x3d\xeb\x16\x3d\x9b\xfd\xed\x9e\xa9\xd1\x12\x1e\xd9\x4a\xf3\x01\xc2\x3f\x83\xec\x50\xf5\xe4\x6f\xc3\x7b\xf9\x16\xbc\x43\x03\xef\xbb\x0e\xec\x07\x7f\x13\xe0\xb8\x06\x30\x7d\xee\x2a\x95\xed\xa9\x6c\x2c\x5c\xc1\x22\x35\x16\xbd\xec\x97\xa6\x67\x88\xdd\xab\xde\x8b\x65\x9d\x65\x57\xbb\xc3\x30\x70\x9e\x55\x61\xe9\x23\x82\xc3\xa5\xbe\xd8\xb8\x1d\xb9\xfa\x4a\x2c\xac\xba\xed\xf7\x04\xec\xef\x7c\x70\xd4\x0e\x79\x57\x38\x91\xbf\x15\x10\xf7\x9f\x1c\xbd\x3b\xb7\x9d\x90\x43\x44\xbb\x48\x30\x2c\x22\x86\xb5\xe1\x58\xfc\xfc\x47\x40\x88\xfb\x8f\xb2\x90\xcd\x5f\xc9\x4a\x5c\x55\x44\x7b\x11\xba\x84\x0e\x69\x7c\xef\x2a\xfa\x65\xea\xc6\x0b\xcf\xac\xa9\x51\x53\xd2\xa8\xee\x32\x72\xcf\x8d\xf8\xeb\xed\xb3\x0b\x45\x6d\xbe\xc9\xa3\x58\xc9\x78\x76\xe8\x46\x65\x13\xe8\xeb\x2a\x22\xc6\xe1\x23\x7f\xbd\xbb\x70\x23\x5b\x3a\x7d\x5e\x2d\x7d\x0e\xa5\x5f\x0f\xfb\xc2\xb5\x55\xd8\xdc\x83\x35\xb9\xfb\x33\x51\x6d\x6c\xa9\xfe\xde\xac\x56\xc2\xde\x45\x09\x76\x1b\x09\x7d\x40\x5f\x4c\x06\x4e\xe7\x7f\xc8\xbc\x3d\x54\x98\xb7\xb4\x63\xd9\x23\x6a\xe2\x58\x2a\xcd\x02\x3e\xb7\x5c\x5b\xde\xe2\x1d\xeb\xf2\x63\xf1\xc3\x79\xe8\xd0\xb4\x43\xbc\x07\x64\x5e\xf3\x4f\x35\x54\x36\x05\xc5\x9a\x82\x25\x00\x9d\x3a\xfb\x73\xae\x8f\x67\xa9\xdc\x40\x8f\x2c\xfa\xeb\xee\xc8\x6a\xb9\x2f\x3c\xc1\x5f\x17\x15\x9f\x67\x70\x48\x33\x66\xeb\xac\xd1\x3a\xeb\x2e\xce\xf8\x8a\xdb\xbd\x76\xa2\x52\x5f\x55\xf1\x88\x59\x7d\x59\xb5\xe4\x30\x4a\xf9\x71\x60\x6c\x89\x27\xec\x06\x0d\xf0\x59\x3b\x6a\x29\x3f\x3e\x77\xfc\xd1\x11\x0d\x69\x1c\xc0\x76\x94\x06\xfc\x35\x54\xf9\x58\x0d\xdd\x84\xdd\xd8\x27\x4f\x2c\x66\xae\x1c\xd8\x0d\xbb\x3f\x6f\xeb\x1f\xd7\xc6\x61\xcc\xfd\xb9\x1b\xb1\xbb\x7f\x52\x8b\xb5\xf1\xa2\xd0\x9f\x7a\x2f\x16\xef\xf4\x58\x66\xe3\x35\x64\xc1\x6c\xeb\xd7\x13\x47\xf8\x62\x18\x00\x85\xb0\x94\xe2\xb6\x94\x1e\x29\x4f\x66\x5f\x46\xc5\x36\x35\x9b\x95\xf2\xef\xc2\x1e\xe2\xa4\x17\xf2\x90\x73\x61\x2e\x62\x4a\xc1\x29\xbc\x8e\xfa\x71\x22\xac\xcf\xe9\x08\x03\x21\x1c\x89\xc4\x9f\x51\x5b\xba\xe1\x42\xcf\xae\xd1\x86\xd6\x82\xcf\x86\x5c\x68\xe7\x4f\xe1\x06\x8f\xb4\x8f\xf7\xce\x1e\xfe\xc8\x7d\xfc\x19\x1d\xe1\xcf\xb3\xfe\xd9\x3b\x26\x6e\x08\xe7\x9a\xe2\x95\x56\xba\xf1\xa8\xe6\x30\xad\x72\x02\xdd\x70\xcc\x9d\xb3\x60\xe7\xda\xd7\xc5\x16\xc5\x4f\x7c\xb0\x34\xdf\xf8\xa6\x69\x3e\xb7\x83\xcd\x8f\x46\x15\xb1\x3c\xba\x22\xa5\x2a\xae\x6b\xa1\x0b\x86\xa8\x7d\xd8\x77\x9f\x8c\x8b\xc8\x29\x6a\x44\xce\xa8\xb2\xe4\x2d\x12\x55\xdd\x40\xc1\xf2\x56\x69\x36\x39\x6f\x19\x85\x00\xff\x72\x1a\xb0\x29\xcd\xcd\xd7\x8c\x0e\x78\xea\x7f\x7b\x09\xbc\x6c\x33\xfc\xcc\x07\x8d\x46\xb6\x19\xfe\xc9\x37\x07\x8d\x46\xbe\x19\x61\x44\xbe\x19\xe9\x08\x27\xe3\x4e\xb6\x19\x92\xdf\xf0\x6f\xd3\xc9\x37\x23\xf2\x1b\xfe\xa5\xd9\x67\x3e\xf8\x0d\x0a\x7f\x36\x56\xbb\x00\x17\x9f\x8f\x28\xba\x9b\x4f\x59\x7c\x8f\xb4\xb3\xa2\x11\xa0\x0a\xb3\xbb\x63\x17\x8d\xdf\x9c\xb3\x3d\x81\xc0\x2f\x59\x1a\x46\xeb\xc2\x68\x68\x98\x5d\x5f\x90\x46\x43\xd9\x91\x7a\x0d\xb1\x91\x64\x9f\x46\xd6\x8d\xe4\xfb\xf1\x42\xd3\xfa\x95\xc3\x78\xfd\xbe\xe5\x87\x5e\xd0\xc0\x50\xda\xed\xc3\xe4\xbb\xe8\x39\xcf\xfb\x82\x0a\xd8\x45\x2c\x9a\xdf\x46\xeb\x9f\x87\xe5\xf2\xde\x13\x96\x7b\x4f\x34\x2a\xdc\xe4\xe0\xaf\xdc\x37\x06\x86\x8c\xd5\xa9\x67\xf3\xbb\x77\xec\x6a\xdc\xed\x0a\x27\xc4\x1d\x24\xc4\xad\x22\x82\x45\x87\x71\x1f\x81\x30\x97\x8c\xd3\x7e\x13\x77\xfc\x0a\x69\x4e\xf6\xdd\xb0\x28\xee\xe9\xe2\x1a\x21\xee\xdd\xb0\x52\x54\xad\x16\x7d\xdc\xd3\x44\xfd\xac\x87\xaf\xbc\x45\xd6\xfe\x5e\x53\xd0\x7f\x68\x85\xf7\x76\xb5\xbe\x02\xca\x2f\x53\x37\x5a\xb8\x90\x54\x44\x55\x00\xd6\xc9\xcb\x2e\x8a\xad\xd4\xca\xfa\xce\x6a\x45\xb6\x02\x84\x9b\x99\x40\x70\x17\x15\x3a\x9c\x77\x2a\x1b\xc7\xf4\x09\xa8\x2c\x7e\x9e\x95\x9f\x0f\xfb\xf6\x62\xc3\xff\xfa\x12\x60\xf6\x72\xda\xef\x4a\xd1\xb6\x87\xfd\xda\xbd\xd9\x87\x1a\xef\x7d\xf6\xe4\x8b\x40\x0b\xb8\xe5\x88\x01\x93\x41\x24\xc6\xea\x6c\x00\xd9\x47\x7c\xcd\x2e\xf6\x45\xf0\xb8\xef\x08\x3a\x7e\xc4\x97\x41\x8c\xbb\x19\x9a\xc8\x91\x8e\xbc\x2b\x77\x16\x5d\x6b\xa2\xc6\xfb\xf9\x78\xd8\x53\xa3\xea\x5d\x81\xdd\x05\x04\xf7\x03\x2a\x79\xcb\x72\x58\x0f\xfb\x78\xb7\xf8\x39\xc4\xfb\xc5\xaa\x5e\xd1\xc3\xbe\x2f\x03\x2b\x6c\x73\xf6\x64\x4c\x72\x6f\x28\xff\xc7\x4b\x30\x9f\xe3\x8f\x43\xec\xc5\x96\x21\x15\xca\x3f\x7c\x0c\x1a\x8d\x0d\xfc\x75\x48\xfb\xdb\xb9\xa3\xb4\xd9\xa2\x33\x6a\xa1\xd7\x26\xc3\xd6\xfd\xd9\xd8\xd2\x07\x01\xb7\x9b\x3a\x66\x32\xfc\x08\xf7\x1c\x14\x0f\xa8\xec\x14\x15\x22\xf9\xa1\x4a\x24\x25\xeb\x45\xa5\x5f\xbb\x93\xde\x68\xd4\xcb\x93\xf7\x0f\x22\x8f\xc4\xb8\x3f\x9c\xbd\x3f\xda\xd3\x2e\x52\x43\xfb\xb4\xa4\x97\x9c\x61\xe0\xce\x9e\x7c\xa8\x20\x68\x03\xe1\xb0\x01\xd7\xa9\x86\xf8\x6b\x2f\x72\xe1\x4b\x8b\x94\x6a\xcb\x87\xf4\xa9\x37\xea\xc9\x4c\xd9\xa0\xca\x85\xcc\x54\x64\x83\xba\x35\x13\x5a\x50\xc0\x12\xf4\xef\x01\xb0\x12\x0f\x8d\x6c\xa1\x1d\xfc\xa9\x6d\xe3\xdb\xb9\x56\x63\x87\x51\x13\xec\xcb\xcf\x47\x2c\x84\x6a\x0c\x42\xf5\xbb\xb5\x9d\xd3\x11\xbc\x82\x78\x68\xe1\xab\x9b\x3a\x82\x54\x6d\x21\x95\x76\x6d\x4f\xed\xa9\x8c\x5d\x1f\x71\xf8\x33\x9f\xbf\x2e\x3c\x7b\xb3\x79\x7d\xe4\x85\x4c\x19\xbc\x0a\xfd\xc7\xed\x00\x93\x43\xfd\xed\x85\xbe\x0c\xd0\x8c\x43\x11\x2b\x03\x2f\x64\x87\x5d\x0e\x7f\x30\xd2\xd2\x4e\x76\xd8\x5d\xbc\xd3\xf0\xee\x8c\xd6\x59\xf3\xda\x10\xfe\xf9\x2c\x28\x7d\xdf\x5e\x0a\x76\xfb\x5c\xb9\x2c\x15\xfc\x47\xcf\x01\x88\xa0\xe5\xf5\xae\xf1\x0e\xbb\xfe\x87\x80\xf5\x22\xce\xa3\x05\xa1\x9b\x5b\x1b\xda\x57\x4b\xc8\xa1\x97\x21\x1c\x4e\x1f\xb5\xd4\xcf\x87\x40\x5b\x97\xdd\x99\x3a\x10\xc0\x18\x7f\xb0\x6d\x62\x6d\xc8\x48\x52\x0e\x73\xe7\x25\x13\x84\xd4\xa8\x87\x3c\x15\xe5\x4d\xa8\xe4\xa2\xa4\x0b\xfd\xda\x8b\xe3\x6b\x0f\xb5\xde\x5e\x17\xb4\x3f\x8c\xd4\xd0\xf5\x03\x7a\x3a\x46\x73\xac\x77\x4b\x4e\xd3\x2a\x0c\x4f\xa2\xc6\x5f\xd5\xcc\x18\xc6\x34\xef\x38\xf6\xed\xfe\x74\xec\xbf\x98\x2d\x4b\xaf\x41\x5b\xe2\xaa\x37\xce\x14\x94\x89\xf1\xf1\xf1\x74\x0c\x73\x13\x93\x45\xe8\x0f\xc2\xc0\x94\x99\xcf\x1d\x1d\x94\x01\x10\x84\xd0\x3f\x9d\x06\xda\xe9\x0c\xf1\x6c\x02\x84\x85\x51\xf6\x2d\x85\xd0\x4a\x89\xde\x4e\xbd\xdf\x3f\x9c\x41\x87\xca\x53\x41\xbc\x81\xa5\x43\x5f\xd5\x8c\xaf\x99\x1f\x53\x86\xa9\x7f\xe3\xf9\xb2\xc8\x8e\x80\xff\xac\x40\x74\x81\x05\x1e\xa7\xce\x60\xe5\xd6\xb6\x3c\xbc\xed\x1d\x1b\xe7\x8f\x27\xb2\x62\xf7\x2b\x44\xfc\x8e\xa8\xf4\x5f\x24\xae\xac\x8d\x16\x15\xac\x9f\x6b\xa7\x9e\x50\x7b\xe6\x87\x6c\x20\x83\xda\x21\xe1\x71\xa5\x93\x8f\xa6\x93\x8f\x7f\xd1\x49\xc1\x06\x72\x51\xe6\x7a\xb3\x6f\x55\x68\x4d\xe7\x1e\xd7\x76\xce\x10\x6c\x3d\x0c\x21\x99\xcf\xad\xec\x80\x1f\x02\x9d\x2d\xfa\x25\xd8\x33\x30\xeb\x40\x38\xf4\x41\x33\xa8\x76\x68\xd8\xa9\x7a\x43\xc2\x8d\xe4\x74\x5b\x50\xad\x6b\x2f\x64\x45\xd7\x1e\x05\xd9\xcd\xa6\x73\x31\xe4\x47\x00\xc8\xf1\xb6\xa0\x21\xda\x00\xd2\xf1\xfd\x5c\x94\x09\x1b\x2d\xbb\x45\xa5\x26\xf6\x5b\x35\xf6\x8b\xb0\x57\xe2\xcf\x47\xbc\xa3\x90\xc1\xc6\xe0\x48\xf1\x48\xdb\x08\x37\xc7\xa5\xff\xe6\x57\x50\xfa\x61\x2c\x68\xde\xb7\x97\xe2\x7d\x13\x3b\x18\x0b\x9a\x0c\x04\x59\x0c\x71\x68\x1f\x27\xd5\x5d\xae\x82\x9e\xa3\xaa\xa8\xc0\xca\xf1\x0e\x0e\x70\xa3\x0e\x1d\x76\x88\xf7\x6e\x84\x15\xed\xfe\xf7\x1b\x4a\xb6\x02\x66\x46\xa1\xe7\x2c\xa0\x69\x3c\x62\x47\x87\xa5\xd1\xd4\x98\x6f\x6c\xd1\x44\xef\x7f\xda\x3d\x07\xcd\x8c\xa5\xdc\x88\xdd\x47\x8d\x06\xfc\xd5\xd6\x3b\xee\x23\x82\x06\x7f\x36\x5a\x34\xe5\xbe\xe9\x2a\x35\x9d\x0b\x68\xc4\x95\xff\x05\x7e\x38\xdf\xd9\x23\x09\xf7\x8d\xa5\x5b\x65\x75\xad\xa9\xc8\x06\x5d\xa1\xc3\xe7\x6a\x41\x8b\xf4\xc2\x0d\x50\x3d\x5b\x19\x7d\xae\x16\x41\x69\x2d\x57\x1b\x8f\x8f\x4a\x1b\x82\x70\xb4\xd1\x0b\x20\x0a\x68\x54\x7c\x37\xb7\x02\x5a\x82\x11\x2d\xd5\x1f\x2d\x81\x21\x97\xd2\x65\xbd\xe1\xd2\x63\x79\x2f\x8e\xdf\x87\x5d\x31\x1c\xd7\x3d\xc9\xe2\xc6\x3c\xee\xaa\xf7\x61\xb7\x3f\x52\xb9\xc9\x02\xe7\x77\xd8\xa7\x25\x7f\x35\x9b\x8f\xd5\x67\x0e\x99\x36\x80\x8f\xc6\x2a\x1a\x8d\xb1\xb5\x26\x45\xb5\xf5\x0a\x6a\x7d\x26\x1f\xd9\x27\xb8\x94\x43\x40\xa1\xd9\x3c\x9a\xf2\x77\x0e\x9c\x5a\x20\x2b\xac\x9e\xd4\xef\x5b\x73\x33\xcf\x47\x34\x33\x16\x6d\xcc\x02\x32\x72\x06\x69\xa3\x11\xc3\x96\xa3\x1d\xa5\xe8\x6e\x85\xac\xfb\xdc\x68\x6c\x84\x2c\xed\xb5\x9d\x0a\x0c\xac\xfb\x4c\xe8\xa4\x12\xde\x7d\xa0\x21\xac\x50\x20\x3b\x66\x49\x95\x5a\xca\x5a\x6a\xff\xc1\x56\xf4\xd7\xe5\x36\x5a\xa6\xa0\x6b\x0d\x28\xbd\xc8\xa0\xd1\x28\x0b\x22\xd8\xa6\xe0\x56\x59\xd0\xba\x36\x9d\x38\x92\x0a\xf6\x94\x56\x9f\xf6\x4a\x96\x2a\x3a\xad\x58\x10\xb5\x92\xb6\x27\xd2\x98\x91\x19\x74\x1c\xb4\xb4\x01\xdf\x8f\xf8\x6d\xdc\xd2\x44\x78\x1c\x4e\x79\xec\x46\x9c\xc7\xc7\xa8\x12\x94\x18\x8b\x6e\xda\xd9\x56\xc6\xfb\x1d\x27\xb5\x4e\xc7\x5e\x23\x08\xc6\x76\x25\xe5\x10\x4a\x68\x88\x4e\x48\xbc\x8c\xe7\xde\x16\xe7\x11\x6e\x4c\xc7\x28\xea\x95\x17\xdf\x4e\xca\x63\x9a\xf1\x88\x18\x8f\x9f\x35\xdc\xb8\x73\x32\xc8\x58\xdb\x52\xed\xcc\x0c\x68\x06\xfb\xa1\x30\x46\x06\x09\x66\x86\xdd\x4e\x04\x6b\xb6\x60\x05\x2b\x1d\xe8\x38\x15\x2c\x97\xc4\x93\xd5\xc9\x19\xe8\x31\x96\x2b\x63\xcc\x32\x5f\xe0\x3e\xe2\x0e\x0c\xb6\xf8\x97\x61\xe0\x60\x80\xa6\xfe\xed\x4b\x60\x27\x49\x10\x52\x71\x79\xe4\x09\x98\x97\x01\x95\xec\x29\xa5\x2d\x3c\xa9\x16\xd3\x33\x58\x18\x2a\xb5\xf7\xdf\x6b\xcf\x8c\x48\xa3\x22\xeb\x2b\x02\x88\x55\xa4\xcc\xc5\x64\x9d\x38\x6d\xf0\x10\xa9\x12\xfc\xf5\xf4\xa7\xa3\x1d\x28\x1d\xc3\xc2\x70\x64\x33\xfe\x3d\x64\x83\x9e\x62\xaa\x07\x00\xfc\xbf\xd8\xb8\xa0\x88\x03\x38\x55\x59\x52\x50\xda\x73\x28\xa8\x81\x8e\x02\x82\x90\xd8\x7c\xc9\x6a\xbe\xa4\x92\x2f\xe6\xf2\xcf\xb8\xed\x87\x34\x09\x5c\x3f\xa1\xa8\x36\xb6\x42\x16\xf1\xe8\x59\x9d\x5e\xc5\x76\x1f\x8a\x49\x08\x29\x04\xa9\x5a\x5e\x21\x11\x04\x70\x71\x11\xb7\xcc\xab\x6f\x5d\x97\x27\x2c\x2a\x17\x45\x58\x5f\x14\x61\x75\x51\xa8\xd3\x25\x53\xa1\x52\xef\x0b\x4b\xb8\x57\x37\x7e\x47\x5e\x05\x6e\x1c\x22\xf0\xec\x35\x5f\xa4\x3c\x59\xed\x82\xa2\x10\xb4\x78\x54\x76\x01\x77\x4e\xb7\xcc\xb5\x1e\xdb\x84\x79\x89\x45\xdc\x51\x88\x3b\x05\xf8\xca\x22\xcd\xce\x5f\x20\x0d\x5a\x39\x03\x8c\x51\xb0\x99\xc5\x2b\xa4\x16\x1d\x28\xbf\xc8\x80\x4c\x0a\x21\x70\x84\x26\xb2\xd0\x6c\x6c\x55\x3c\x90\x25\x1c\xf6\xb7\x2d\x9a\x19\xb4\xf2\xce\x8e\x85\x16\x84\x4b\x4c\xcc\x26\x24\xa6\x7c\x73\xab\xea\xba\x0f\x49\x48\xb2\xc1\x33\x2f\x69\xf2\xb4\x74\x59\x92\xf9\x09\x6c\x4a\x4f\xd7\x4e\x48\x13\x38\x28\x01\x27\xbc\xc1\x07\xac\xa3\xac\xc8\x28\x7c\xa3\x75\x1c\xdd\x91\xd3\xb1\x9f\x07\xde\x76\xcf\x19\x91\xf9\x7c\x5c\x80\x3c\x22\x8b\x01\x4b\xfd\x28\x68\x34\xf4\x2f\x8b\x54\xe5\x53\x53\x50\x27\xe2\x45\x0c\x2d\xbb\x1b\xc1\x14\x45\xcb\x53\x34\xa0\xf6\xfc\xb7\xee\x27\x62\x69\x0f\xb6\xff\xc7\x0c\x36\x23\xf4\xb1\x57\x08\xd0\xa4\x8d\x46\xeb\x33\xfc\x1a\xa7\xad\xbc\xe0\x92\x1e\x27\x4e\x5c\xc7\x42\x35\x9f\x5b\xae\xaa\x1d\x5b\x65\x8c\x02\x2d\xc7\x9d\x52\x88\x0e\xce\x8d\xc8\xfe\x11\x4f\xda\x8d\xaa\x6a\x36\x2d\x3c\x7d\xc3\x42\x06\x79\x4d\x0c\x75\x48\xda\x89\x8b\x26\xa3\xa2\x36\x54\xe4\x02\x17\x89\xc7\xb9\x61\x18\x38\x43\x63\x50\x7e\xc4\x55\x3b\xd6\xfe\xe0\x8c\x1b\xa4\x8a\x98\x19\xf2\xa2\xcb\xc7\xd6\x11\x8d\x1b\x8d\x98\x45\x07\xc4\xc5\xc3\x6d\x2b\x00\x4e\x5c\xe7\x2a\xd2\x74\xd6\x01\xf1\x04\x07\x4e\x0b\x6f\x1c\x79\xd2\x6e\xb9\x5b\x55\x8f\x6d\x23\x03\x69\xda\x4e\xfd\x04\x41\x50\xed\x0b\xbd\x4d\x4b\x7d\x72\x06\x7c\xa9\xb5\x5d\x2b\x90\x6f\x07\xd5\x4d\x3d\x6b\x03\x82\xb9\xa6\x69\x2a\x59\xfc\x95\xe7\x54\x18\x07\x9c\xc5\x39\xb9\x18\xc3\x49\xe7\x2d\x23\x23\xe4\x55\x56\xe9\x3d\x06\xa8\x1e\xf2\x75\xb9\x89\x5d\x9d\x55\x0e\xd6\xda\x5d\x45\x27\x67\xdc\x08\x3d\x3a\x1a\xa1\x38\x0f\xe7\x73\x58\x47\xc2\xce\xed\xce\xbe\x70\x08\xa1\xbd\x7b\x07\xa3\xd0\x92\x66\xc9\x00\x3f\x15\x98\xb1\xcc\xfe\x1a\x54\xfb\xfe\x81\x1b\x86\x47\x87\x2f\x2f\x78\x62\x2e\x5e\xbe\x08\x34\x8b\x63\xa2\xe9\x87\x6d\xe2\x1d\x94\x41\xf3\x0b\x07\x84\xcd\x8f\xc0\x49\x3f\x69\x4e\xfa\xe9\x2d\x46\xba\xe0\x2f\x65\x80\xf6\x7e\xd1\xf6\x4d\xa4\xb4\x71\x0e\xc9\x0e\x5e\xe6\x73\x07\x27\x4f\x5b\xd1\x35\xd0\xc1\xf9\xdb\x1c\x49\x31\x51\xe0\xfa\xb3\x89\x9e\x49\xf4\x10\xef\x05\xeb\x3e\x5b\xb8\x4c\x52\x71\x6a\x2d\xc8\x59\xb8\x58\x18\x18\xab\xdb\x68\xa1\xbb\x56\xa1\x7a\x36\xdf\xce\x5f\xe6\x2b\xa5\x34\xcb\xfd\x01\xe1\x88\x46\xf6\xb8\x73\xf6\xa0\x4f\x43\x07\x70\x1a\xda\x22\x6d\x63\x8d\x6d\x33\x12\x54\xff\xdf\x8c\x80\xd1\xd4\xb1\x2d\xd4\x4c\x42\x6d\x25\x6a\x69\xc2\xde\x54\x53\xc7\x90\x9f\x42\x3d\x5f\xb6\x85\x7d\x9a\xc0\xf0\xd1\x76\xe9\x63\xa0\xd1\x78\xec\x21\xb1\xfd\x76\x8f\x3f\xc5\xad\xc9\x63\x0f\x55\x42\xac\x3b\xe4\xa2\x5e\xed\x07\x0f\x38\x3d\x52\x71\xf1\x31\x52\x40\xa0\xe0\xb7\x72\x9d\xe8\x10\xff\x38\x68\x4f\x13\xf7\x6b\x62\x68\xd5\x0d\xff\x00\x00\xdc\x1d\xd3\x6e\xbf\x76\x25\xfa\xdc\x29\xac\xc6\xa6\x92\xf3\xc1\x51\xf9\xcc\x35\xe8\x29\xff\xb2\x54\x10\x35\x00\x48\x94\xa9\x98\x91\x85\xd4\x6e\xf2\x43\x55\x05\x67\x5f\xb6\xe1\x0f\xbb\x35\xea\x2f\x68\x23\x56\x32\x85\xfa\x24\x98\xff\x6b\x04\x9f\x96\xbe\xee\xcb\xb6\x28\xf2\xa3\x0b\xd5\x2b\x45\x05\xe6\x5f\x6a\xb6\x66\x56\x32\x29\xaf\xc0\xce\x1e\xb8\xac\x48\x05\x4d\x3b\xcb\x7b\xff\x8d\x27\x0b\xe7\x19\x82\x63\x7f\x3d\xc9\xb7\x9a\xa8\x08\xe3\xc8\xdf\xb5\xcf\x80\xd2\xc0\x80\x6d\x31\x62\xd3\x26\xfc\xf9\x93\x0b\x36\x6d\x4b\x77\x53\x12\x1a\xb1\x19\xc4\xcd\x3e\x73\xc1\x66\xed\x4d\xe9\xd6\x9c\x71\x77\x4f\x6b\x32\xe2\x7b\xdf\x9c\x62\x10\xe9\xc5\x8d\xe3\x38\x92\x7d\x78\x6c\xff\xf3\x93\xeb\x48\x76\x1d\x35\x25\x1b\x44\xe4\xf7\x8f\xe4\xf7\xad\x7f\xb5\x36\xd9\x27\xf2\x5b\x97\x9d\x1f\x51\x2c\xc2\xc2\xc8\x7c\x44\x11\x0a\xc7\xd8\xd9\x67\xd3\xa6\xf4\x27\xb3\x80\x4d\x69\xc8\x66\xe6\x7b\x86\x62\x33\x7c\xfb\x1e\xd2\x69\x8b\x0a\x7f\x08\xdc\x18\x9b\xe9\xa8\x19\x46\x6d\x07\xeb\xc4\xda\x7b\xa7\xd5\x97\x4d\x7f\x84\x7e\xa9\x46\x40\x78\x75\x83\x2d\xed\xce\x5e\xa0\x42\x3e\x9e\x38\xb5\x8d\x43\x5b\xd5\xc7\x3f\x5a\x9c\x0b\x76\x28\xdb\x25\x7a\x34\x01\xca\x08\x90\xa4\x19\xb2\xd9\x26\xec\x07\xbf\x7f\x24\xee\x52\x06\x1d\x5d\xe4\x8a\xaa\xa2\x5d\xf7\xcb\x1c\x9c\x28\xd8\x65\xff\x0b\x9c\xec\x9f\xae\x4d\x7a\xf9\x44\x56\xd8\x9e\x3e\x49\xf4\x43\xc3\xfd\xa1\x6b\x12\x95\x49\xa9\x78\x65\xb0\x36\x44\x79\xa4\xed\xa9\xc1\xc7\x0d\xfb\xfe\x38\x9f\x47\xec\x86\x4a\x8d\x26\xc6\x06\x24\xe0\x02\x2a\x38\xc2\xdf\xcf\x92\x4d\xdb\x2d\x37\x82\x21\xa6\x11\x3e\xe9\x39\xf8\xf3\x59\xb2\x19\x26\x6c\xa3\x6b\x01\x7d\x87\x45\x68\xb4\xf2\xfa\x61\x9a\x46\x44\xb5\xad\xaf\x68\xfb\x5a\xc0\xd8\x8d\x9f\xc2\x7e\xb1\x16\xa0\x08\x4d\x3a\xb1\x69\xbb\x08\xb9\xf0\x45\x4b\x78\xf0\xcb\xd5\x60\x22\x64\x15\xc0\x16\x4b\xca\xce\xeb\x00\xea\xec\xb9\xa1\x81\xc4\x93\x3c\x64\x37\x5e\xc4\xa7\x85\x56\x18\xde\x95\x4c\x3f\x0b\x7c\xe5\x84\x91\x9b\xfe\x29\xb4\x91\x4c\x02\x8b\x87\x7f\xfc\x0d\x66\x7b\x33\x62\x53\x93\x77\x06\x79\x01\x18\xc8\x3c\xc3\xcc\x27\x21\x64\x9e\x35\xf9\x3b\xcc\x3d\xdb\x8c\x00\x9d\xed\x28\x2c\xea\x4b\x12\xb0\xb1\xc4\xdd\xf4\x74\x49\x55\x67\xdb\x93\x7a\x19\x00\x8d\x42\xc5\xd9\x50\xdb\x09\x95\x7a\x29\x48\x36\xd3\x6a\xa3\x14\x8d\x00\x54\xaa\xca\x56\xcf\xd1\x15\x89\x11\x9a\x00\xe9\x92\x40\xea\x68\xaa\x3f\xbf\x46\xe8\x79\x93\x8d\x1f\x68\xce\x53\xf8\x19\xf0\xc8\x93\xfe\xcd\x4b\xd0\x68\xe0\xcf\x06\x9a\x8f\x72\x72\xbe\x99\xd3\x54\x3b\x02\x44\x71\xde\x01\x47\x6f\x9f\x11\x0a\x16\xd3\x98\xa7\xfe\x43\x18\xb0\x7d\xe5\x0c\x08\x71\xad\xcb\xc0\x35\x39\x15\x4f\x2a\x39\x51\x4e\x38\x82\xed\x1f\x57\x23\x2c\x7f\xa3\xf0\xa0\xda\x21\x9b\xba\x0a\x97\xbf\x89\x8a\xdb\x21\x9b\xb9\xb1\xa7\x78\xc8\xa6\x9b\xd9\x6f\x02\x35\xb0\x67\xcd\xfc\x37\xb1\x44\xf3\x14\x8d\xab\xeb\xf0\xe1\x3f\x49\xd0\x36\xd9\x56\x41\xd3\x36\xd9\xd6\x0a\xbd\x7d\x8b\xb6\x55\xa4\xe4\xff\xcf\x88\x55\x49\x88\x96\xe9\x54\x49\xa0\x7e\xff\x58\x1d\x9a\x7e\x49\xa2\xaa\xe4\xa8\x4a\xae\x3c\x69\xc9\x95\x5d\xcb\x28\x37\xa2\x4d\x58\x4a\xce\x77\x8f\xf1\xc7\xfa\xa2\x80\xd9\x01\x02\x14\xc2\x8a\x9f\xcf\x43\x2f\xe4\xca\x3f\x84\x5a\x94\x3f\xb4\x4a\x7f\x61\x53\xa2\xa5\x59\x34\x0f\xcb\x15\xf0\x1e\x09\x8f\x9b\x8a\xa6\x66\x67\x13\x5c\x14\x16\xb0\x93\x3f\x53\x36\xb3\x7d\x0d\x9b\xf2\xf7\x8f\x34\x81\x91\x77\x6b\x51\x71\x13\xa2\xc2\xcf\x29\x9b\x96\x79\xd9\x16\x8d\x9b\xaa\x42\xb6\x71\xfa\x74\x94\x75\xda\x51\xce\x1b\xcc\x57\x85\x05\x2f\x47\x69\x56\xe3\xc1\xab\x7a\x39\x61\xe1\x6b\x32\x2a\xbe\x14\x59\x9b\x5e\xda\xc6\x04\xae\xa9\x88\x7d\xd5\x07\x7b\x74\x8f\x91\x01\x81\x52\x1c\x36\xe0\x88\xc6\xc4\x8b\xf9\x83\xfd\xd4\x07\x5d\x9d\x05\x38\xd9\x84\x3d\x66\x8d\x46\xc2\xd2\x5e\x5b\xf0\x17\x80\x2f\x41\x6e\x35\x26\xae\x23\xf5\xa2\xda\xfb\x6f\xe4\x16\xa8\xe0\xa7\x70\x42\x8a\xd8\x87\x10\x0e\x93\xc0\x98\x9c\x3d\xd0\xb8\x3c\x36\x0e\x86\x34\x62\x5f\xc7\xa4\xf4\xff\x61\xe1\x5c\xdb\x3b\xdb\x35\xcb\xec\xf1\x08\x45\x52\xf4\xed\x44\x6c\xac\x89\xc4\x3c\x33\x27\x11\x05\x64\x1a\x5d\x8d\x4e\xdb\x67\x29\x1e\x36\xf7\xa6\xc4\x55\x14\x8f\xe7\x48\x19\x58\xa4\x08\x74\x66\x7d\x97\x54\xd9\xa5\x1d\xe8\x52\x04\x5d\x32\x40\x48\x2d\x4e\x83\x1d\x0c\xb1\x83\x5b\x34\xd6\x1d\x54\xb6\x83\x21\x74\x30\xc4\x0e\x12\x57\x97\xd4\x97\x07\x1a\x68\x33\xb4\x16\x94\xeb\xd0\x4f\xb6\x03\x5f\x05\xf4\x5d\xca\x13\x18\xea\xb4\xed\xc4\x1c\x38\x8c\x04\x6f\x21\xf5\x47\x8a\xc0\xa6\x15\x60\x53\x04\x36\x41\xfb\xce\x00\x2c\x8d\x2a\xf7\x1a\x70\xd4\x80\x13\xc9\x52\x1b\xe6\x1a\x80\xa6\x70\x00\x0a\x16\x14\x58\x60\x73\x46\x4f\xe1\x64\x1e\xe9\x0b\x16\x3d\x85\xd1\x72\x0f\x93\x9f\xf4\x50\x4f\x65\x71\x8f\x0a\xac\x88\xc2\x7d\x01\xb5\xd2\xeb\x53\xd1\x2f\x13\xb5\x4f\x9f\x30\x28\xae\x24\x7e\xd6\x4f\x33\x29\xbb\xff\x6d\xdc\x3d\x59\x4c\x53\x06\xd3\x96\xc1\x54\x00\xa6\x42\x30\xbd\xc2\x6d\x8b\x99\x80\x14\x3d\x65\xd8\x86\xcb\x49\xc8\x78\x0a\x73\x90\xb5\x9d\x04\xe7\x00\x8d\x01\xe4\xfa\x23\x43\xd8\xb2\x0a\x6c\x99\x1e\x4d\xe2\x3a\xd9\xdb\x73\xb0\xa6\x19\x3b\x0f\x99\x99\x87\x77\xd9\x9a\xd1\x8f\xcd\xe8\x27\xba\x5b\xa9\xed\x56\x0c\xdd\x8a\xeb\xa3\xbf\x7a\x8e\x1f\xbc\x79\xc7\x2d\xed\x53\x88\x17\xe1\xd2\x57\x76\xbd\xeb\xe5\xaf\xb4\x63\xa2\xab\x9e\x13\xae\x7b\x7b\xc6\xeb\x5f\xe8\xc0\x82\x78\x37\x3d\x27\x59\xff\x3e\x0d\x03\x25\x58\xda\x5b\xc0\xa1\x01\x6f\x16\x61\x74\xaa\xcf\x95\xb5\x99\x8b\x96\x68\x44\x39\x73\x15\xaa\xf8\x78\xba\xd6\xe2\xd8\x89\xa4\x09\xe2\x5b\x0c\xa4\x05\xe8\x4e\x2e\x89\x17\xf1\xfe\x72\x94\x9e\xf6\x95\x7e\xe9\x7d\xf1\xe9\x1a\xd1\xb3\xb8\x0a\xb7\x06\x58\xed\x65\x37\xaa\xd3\x15\xbd\x5e\xeb\x61\x67\xa9\xd7\x51\xa5\xd7\x54\xd5\xfb\x1d\x9b\x7e\x9b\xa9\x8d\x56\xa7\xb6\xea\xfd\xe0\xad\x7e\x7b\x11\x8f\x8c\x42\xad\xa6\x29\x9a\x04\xc6\x34\x02\x0e\x0e\xef\x21\x51\xe6\xd4\xae\xbf\xc4\xac\xbf\xe8\xad\xa1\x28\x3a\xbd\x27\xaa\x73\xbc\xbe\xb7\xd0\xd5\x4a\x87\xb5\x69\x22\xb4\x15\x5e\xaf\xf4\xce\x89\xab\xda\x76\xb8\xf7\x67\xa8\x88\x39\x90\x6e\x48\x73\xe9\x8a\x05\x41\xc9\xd5\xda\x98\x65\x95\x31\x5b\x43\x7c\x97\x16\xc7\xba\x11\x2c\x06\xf0\xa5\xbc\x28\xd2\x17\x1c\xdd\xf1\x03\x3a\xde\x34\x8e\xd7\xe8\x65\xe8\xbe\x86\x99\x18\x8d\x4e\xc5\x83\x72\x6f\x0e\x16\x0b\x7a\xa0\x84\xbb\xd1\xa2\x87\x4a\xb8\xa1\xb5\xa1\x16\xd2\x7d\x25\x5c\x6c\xef\xc3\xb6\xfb\xb1\x45\x1f\xc4\x30\xe9\xe5\xee\xa7\xea\x35\xc9\xf6\xd2\xde\x6d\x5f\x80\x63\x2f\xe2\xbc\x77\x60\xee\x3a\x47\xaa\x5d\x51\x63\x18\x29\xe3\x32\x68\xa4\x8c\xf8\x55\x48\x5c\x5b\x10\xf8\x05\x94\xe0\x42\xa3\x13\x58\x09\x32\x1c\x4f\x1d\xe3\xe5\x12\x79\x8d\x91\x09\x51\x53\xcc\xdc\xac\x5c\xe5\x58\x3e\x36\x7b\x63\xf5\x0a\x63\x67\xe9\xc8\xff\xba\x28\x65\x30\x42\xb6\x2b\xd8\xe1\x2e\x79\x8d\xd8\xae\xe0\xf0\xa7\x90\x95\x01\x32\xb2\x2b\x68\x6c\xf3\x78\x90\xca\xce\xc6\x5c\xb1\x38\xf1\xe3\xc0\xa0\x62\xdc\xdc\x6a\xde\x0f\x9b\x18\x79\x1c\x20\x9d\xff\xf6\x85\xf5\xee\x68\xc6\x5b\x9f\x63\x60\xc2\x20\x9c\xdc\xd1\x98\xc7\x9f\xa1\x46\x9d\x71\x73\x4b\xd7\xf7\xed\x0b\x7f\xed\xdd\xb9\xaf\xda\xee\x50\xd6\x4e\xd9\x40\xb1\x9d\x89\x8b\xbf\x7b\xe7\x74\x67\xe2\x66\x0b\x9a\x14\x39\xe2\xb6\x32\x39\x54\x99\x23\x5e\xd0\xee\x9d\xb1\xc7\x9b\xd0\x23\xf7\xb5\x65\x03\x0b\xf8\x27\xd8\xce\xc8\x3a\x0e\x2c\x4e\x4e\xdb\x78\x2d\x16\xdd\xaf\x4a\x3b\xc3\x24\x59\x79\x37\x36\x52\x5a\xc8\x7f\x7b\x9d\x58\x92\xf5\x25\x31\x2a\x8c\x51\x9b\x20\xeb\x77\x51\xbe\x43\x97\x0a\xef\xdf\x2a\x55\x95\x90\x19\x29\x4f\xbc\xef\xe5\xef\x25\x9b\x3e\x35\x1a\xc6\x1c\x1c\x04\x7c\x11\xd8\x94\xb3\x6a\xca\x99\x4e\x41\xcb\xd5\xec\x61\x9f\x0a\xe2\xb5\x3e\x6b\x6d\x9f\x87\x7d\x3f\x53\x80\x5e\x5b\x35\x09\x9f\x5d\xbc\xcc\x7a\x7e\xb6\x66\xba\x9f\xdf\xbf\x9c\x19\xfc\xb9\x14\x1c\x96\xa9\x7e\x0d\x11\xe3\xc9\x83\xb9\x5a\x96\xe6\x9e\x3e\x9a\xea\x42\xaf\x97\xda\x19\x37\xfd\xf0\x4d\xa7\x98\xf2\xbb\x82\x43\xd2\xeb\x61\xd7\x08\x2a\x1e\xee\x9a\x92\x98\x7c\xdd\xd5\xc9\xb7\xcf\xc6\x16\xa0\xf7\xcd\x40\xf1\x6a\xed\xd8\xea\x6a\x27\xb7\xb5\x6a\xe3\x9e\x1e\x9c\x0b\xf3\xac\x62\x7d\x78\xf9\x3f\xa6\x81\xff\x38\x0b\x1c\x01\x5f\x84\x0a\x76\x59\xb8\xf7\xba\x14\x7c\xaf\x63\x3f\x31\x85\x10\x2a\xfc\x5d\x38\x7a\xda\x6e\x98\x0c\x10\xa9\x93\xb4\x4f\xd7\xa2\x8e\xdd\xb2\x8e\x5d\x81\x29\x98\xe1\xba\x6b\x33\x5c\x77\x8b\x0c\xd7\x5d\x4c\xc1\x0c\x17\xb9\xcd\x70\x91\x17\x19\x2e\x72\x4c\xc1\x0c\x71\xaf\xd1\xb0\xf1\x71\x0f\x23\x08\x59\xbc\x3b\x12\xce\x6e\x5d\x56\xc6\xba\x01\x42\xa3\x75\x1d\xef\xf9\xd9\xd1\xf2\x3d\xd8\xf3\x1d\xfd\xe6\x0b\x7d\xe3\xdb\xb9\xed\x2b\x81\x59\x12\xd4\x44\xe8\x5e\x79\x00\x7b\x91\x67\x17\x1f\x67\xaf\xbb\x45\xc4\x75\x97\xc0\x4c\x94\x85\xce\x66\xba\xd0\x45\x5e\xe4\xb9\xc8\x21\x22\xee\x15\x11\x71\xaf\x72\x98\x21\xde\x87\x15\xd8\x2b\x67\xe2\xb0\xe7\x48\xd2\x96\xee\xc6\x96\x57\x59\x22\xd8\x89\x93\x17\x3b\x7d\x8d\xc6\x4b\x5e\x9f\xb0\x22\xa6\x32\x43\x65\x2e\x3b\x25\x65\x8c\x9d\x83\x46\xc3\x09\xe7\xf3\x97\xb2\x33\x54\xe8\x2e\x95\x59\xed\x6c\x94\x31\x76\x1e\xaa\xd2\x45\x7b\x35\x91\x37\x24\xcd\x17\xce\x47\xe2\xf5\x2f\x9c\x90\xb6\x60\xad\xe1\xd7\x56\xd5\xae\x99\x3f\x7e\x09\x9c\xea\xc3\xc5\x7e\xc7\x21\xaf\x8b\x1f\xce\x7e\x87\x4e\xae\x89\xd7\xe1\xfb\x46\xf9\x35\xba\x58\xa3\x18\x80\x4c\x09\x1c\xcf\x73\x59\x1d\x2b\xf6\xf0\xdc\xde\xef\x30\xc5\xa2\x8b\xf2\xf1\xc3\xec\x1a\x70\x8c\x66\x97\x21\xeb\xf6\x46\xe3\x7e\x32\x14\x0f\x3b\x93\x30\x55\xe3\xa3\xb1\x7a\x18\xf9\x61\x80\x46\xc4\xbb\xcf\x0b\xaf\xc3\xd4\xbf\xdf\x14\x47\xb3\xf5\xab\x7f\xaf\xa9\x5f\xf3\x44\x6f\x35\x01\xb0\x06\xac\x23\xa0\x85\xce\xed\x5a\x2a\xf7\xf0\x6c\x69\x23\x36\xd2\xb9\xad\x34\x52\xa8\x5c\xfd\x4a\x33\xf6\x0d\xa4\x03\x3b\x73\x47\xd0\x97\xd0\x15\xec\x25\xd4\x16\xca\xae\x4f\xdf\xd2\xb4\x38\x7f\xf4\x21\x5b\xc0\x26\xa1\x57\xd3\xfe\x97\xed\x5a\xef\xaf\x4f\xab\xbd\x07\x5a\x28\x81\xfa\xad\x1f\xe6\xfd\x4c\x3d\xa8\x7c\x8c\x66\x53\x15\xc0\xd7\x11\x81\x35\x2f\xd7\x61\x47\x87\x6f\x5b\x4b\x03\x9e\x1a\x9f\xaa\x81\xcd\x5c\x9e\xe6\xd7\x23\xd7\x7f\x1d\xf7\xc6\x99\x72\xcf\xfb\x82\x3e\x89\x6c\xa2\xdc\x88\xdd\xc4\xac\x9b\x6d\xe2\xef\x38\x5d\x04\x0b\x37\x7c\x73\xa4\x24\xce\x79\x05\x05\x0f\x6a\x36\xc4\x2e\x6f\x96\xc5\xc7\xa8\x22\x8b\x1f\xce\x41\x87\x5e\xde\x10\xef\x00\xb7\x2b\xf5\xc7\xea\x53\x11\x5e\x42\xed\x77\x16\xde\x3b\x9d\x27\xfa\x63\xbd\x48\xb6\x16\x7a\xd8\x46\x39\xac\x3d\xed\xc8\x7c\xbf\x4b\x43\x2e\xdb\x5b\x6e\x8b\x46\xdc\x0f\xf0\xc4\x7e\x82\x07\x79\xc1\xbe\x38\x70\x02\x41\xf7\x0c\xf8\x24\x6a\x2b\x4a\x79\xe8\xa5\x9f\xe3\xd2\x9a\x52\xa6\xcd\xa5\x24\x34\x25\xde\x63\xcf\xc9\x48\xa3\xb1\x91\x0b\x07\x1d\x29\x69\x9e\x31\x6b\x34\x36\xb0\xf5\x53\xb4\x6e\x19\xa1\x83\x85\xf9\xbc\x65\x8d\x7d\x9c\x54\x8c\xbc\x4d\x9e\x84\xf1\x49\x52\x44\x3d\x41\x54\x5a\x8b\x9a\x42\x54\x56\x8b\x7a\x7e\x42\x5b\x4e\x55\x83\x71\xb3\x27\x34\xe8\x84\xf2\x44\x5f\x85\x37\xf2\x47\x8f\x81\x13\xd1\xdc\x88\x35\x79\x09\x4f\xe6\xf3\x11\xfb\xf1\xe0\xa1\xfd\x90\x8c\x8f\xbe\x0a\x67\x44\x8c\x2f\xa3\x78\xe0\x45\xec\x30\x71\xae\xe8\xc1\x21\x31\x0f\xc5\xa1\x97\x7c\x8e\x8b\xe1\x80\x33\xff\x77\xe1\x24\xa4\x79\x9b\x0a\x6a\x32\xa7\x84\xe6\x7e\xb2\x19\x06\xc6\x04\x95\x97\x7e\x2e\xbc\x43\xea\x04\xe8\xbe\x8f\x4e\x49\xc7\xba\x3d\x5d\x37\x0c\x75\x66\x1f\xa0\x23\x76\xf9\xe8\x10\x1a\xb1\x03\xe1\x24\xf8\x08\x92\x04\xd5\x8c\xe5\x9c\x08\xfe\xce\x2c\x97\x7c\x5b\xcf\x43\x8b\xb8\x67\xb4\x3a\x4d\xbd\xd8\xc9\x78\x2d\x4b\x4a\xe8\x86\xf3\x0b\x93\x65\xc4\x7e\x27\xbc\xc5\x39\x0c\xd4\x7c\x9e\x7d\x1e\x31\xf1\xd8\x6e\xb9\xd9\x9f\x7c\xc4\x86\x3f\xda\x23\x76\xfc\xc5\xd5\xc6\x32\xb2\x4d\x48\x23\xbf\x43\x4e\xd2\x1c\xb1\x64\x44\x9f\x78\xda\xdc\xda\x0c\x3d\xec\xc8\x84\x3e\x51\x07\xcd\x3f\x4c\xe8\x13\x01\x04\x68\x6e\x11\xef\xc9\x82\x06\x63\x99\x92\xf9\xfc\xc7\xae\x97\xfb\x29\x0c\xd4\x04\xc7\x0a\xc8\x4a\x02\x34\x25\x2d\xbc\x3b\xe0\x3a\x44\xbf\xa8\x82\xee\x3e\xb8\x4f\x85\xaf\xd4\x4c\xcb\x5c\xd1\x72\xb5\x3e\x99\xb5\x0a\x08\xb7\x08\x16\x0b\x6d\x58\xf5\x09\x3d\x59\xe2\x0c\x95\xe3\xf4\xe2\xa7\x81\x35\x24\x53\x8d\x97\xfc\xe9\xde\xd1\x20\x11\x3a\x68\x34\xa4\x1f\xaa\xc0\x59\x2b\xed\x82\x64\xfd\xc8\x6f\x05\x28\xea\x17\x71\x59\x8b\x28\xb6\xa3\xcf\x51\x7b\x73\xcb\x0d\xff\x8c\x60\xed\x2d\x60\x9e\xbf\x3e\x3b\xe9\x66\x48\x5f\x9e\xa0\x36\x5a\x97\xd6\x86\xfa\x5f\x34\xa9\xd4\xf4\x8c\xcb\x05\xf1\xde\x2d\x83\x59\x54\xb2\xf3\x24\x28\xf4\x05\xce\x2a\x06\xc5\x30\xad\x45\xb7\x9f\x4a\x9d\xe1\x6b\x6d\xd4\xfe\x64\xe2\x44\xd5\x8d\x71\x6a\x55\x1d\x0c\xac\xff\xfc\x53\xcc\xe7\xb2\xf2\xea\x5a\x5a\x54\xb2\x03\x69\x68\x07\xda\x22\xd1\x2e\x3a\xb5\x39\x92\xc8\x57\x01\xaf\x19\x68\x6b\x79\x70\xd0\xc8\x96\x14\x03\x25\x8a\x7e\xa1\x6a\xa0\xf1\x93\x54\xe8\x7e\xb5\x5b\x6e\xec\x41\x3d\x30\x35\x8e\xf9\x40\xcc\x09\x01\x8f\x14\x4d\xb4\x0f\x60\xd4\x79\x5a\xe0\xd4\x2a\x2e\x10\x94\xc8\xc2\x01\x91\xba\x69\x2c\x6f\xda\x16\xd6\xf2\x0b\xc4\xc5\x41\x45\xfe\xbc\xaa\xb0\x70\xb8\x24\x89\x41\x5e\xb7\x57\xc4\x7c\xa9\xa2\x89\x19\xd3\xde\x39\x17\x7d\x47\xd0\xce\x48\xd0\x7e\x6c\xa5\x8a\x1f\x53\xa1\xdf\xb0\xfd\x9b\x91\xa0\x97\x23\x11\xd0\x41\x2c\xe8\xd4\x96\xba\x2a\xd2\x2f\xd6\xa6\xf7\x53\xc1\x7f\x60\xfa\xd5\x48\xd0\xd3\x91\x08\xac\x70\x45\x91\x70\x56\x4f\x18\xa4\x82\x7f\xc7\x84\xeb\x91\xa0\xdf\xa1\xc6\x2d\x7b\x9a\x28\x92\xce\x97\x93\xe2\x1f\x1a\x8c\xbd\x47\x41\x2f\x8e\x04\xbd\xb0\xf0\x9f\xf0\x8d\xd6\xe2\x87\x73\xd8\xa1\xdb\x1d\xe2\x1d\xbe\xa5\x56\x51\x66\x2e\xdf\x36\x77\x5f\xcc\x0b\xa6\x3c\x30\xa7\xe9\x7f\xda\x07\x87\x8a\x86\x55\xef\xc0\x1d\x9d\x8a\xaa\xf4\xc8\x62\x61\xda\xc9\x3e\xad\x35\x02\xfc\x5e\x20\x93\x6a\x6c\xb3\x3c\x9e\x54\x51\x78\xac\x1f\x5b\x4c\xc6\x9b\x9e\x23\xd6\x9b\x1a\x12\xac\x93\x2c\xaa\xb7\x3c\x5f\x4a\x39\x27\x96\x71\xc1\x32\x3c\x71\xa3\x5d\x1b\x4f\xf8\x32\xe0\xc2\x2a\x9f\x48\xfc\xf4\x24\x4b\xb9\x64\xa9\x89\x92\x2c\xf5\xa4\x1f\x06\xa8\x1b\x5b\x55\x47\x81\x70\xc5\xd4\x59\xd5\x3e\xa2\xd5\xb7\x28\x4c\x59\x17\x30\x68\xc7\x68\xf0\x07\xaa\xc2\x90\x27\xf8\xb1\xb9\x85\xa8\x25\x16\x98\xcb\xae\x2b\x0f\xe4\x5f\x3b\x56\xd0\xa0\xec\x4b\x61\x1a\x70\x49\x99\xa6\xe0\x93\x65\x05\xd0\xe3\xa2\x82\x3d\x18\x83\x3d\x51\xab\x62\x4f\xfc\x4a\x1d\xdf\x8a\x3a\x76\xa1\x8e\xdd\x7a\x1d\xbb\xc2\x0b\xd9\xd9\x98\xc3\x1f\xab\xd4\xc3\xce\xc6\x3f\xa9\xf8\x9d\xc6\x8a\xd1\x3f\xdf\x10\xa4\x7f\x3d\x91\xae\xa0\x4f\xa9\xbd\xba\xa9\x89\x96\xd0\xc3\xb1\x1b\xd2\xed\xd4\x95\xec\xba\xbb\x40\x8f\x56\xd7\xdd\x9a\xea\x8f\x6a\x34\x6e\x9f\x1d\x13\x4d\x2b\x57\x06\x8a\xf8\xfd\x97\xa0\x94\x25\x34\x2a\x6b\x57\x39\x7b\xbc\xa1\x31\x57\x9c\xbf\x74\xe7\x73\xc5\xf9\x34\xa1\x0a\x82\x5f\x13\x1b\x4c\xb8\x59\x5d\x1b\xfc\x82\xa6\xe5\x6d\x53\xeb\x73\xa4\x2f\xfe\x69\xc6\x8f\xcf\x1c\xa9\x8f\xcb\x39\xdf\x42\x36\xa0\xd1\x70\x92\xf9\x3c\x05\x9e\xa6\xe5\x0d\xac\x89\xf1\x81\x75\xd9\x97\xf9\x83\x80\x4e\xf8\x88\x85\xfd\x6c\xf2\x90\xd3\x27\xd8\x8d\xfb\xcf\xf4\x85\x0b\xe0\xab\x27\x01\x1d\xf1\x17\x60\xac\x7b\xb1\xf3\x04\x88\x72\xea\xbc\xbe\x84\xee\x84\x76\x84\xfb\xb4\x28\x1c\x94\xbc\xb0\x97\x67\xb3\x40\xd3\x91\x7b\x52\x98\x08\x7d\x82\x03\xcf\x13\xcb\x71\xa1\xc6\xc0\x24\x34\x1a\xa7\x26\x35\x2a\x53\xeb\x7a\xf6\x7b\x6e\x81\xd0\xa3\xf6\x86\x60\x99\x3f\x0a\x58\x27\x71\x37\x60\xa1\x19\xed\x7e\x80\xea\xee\xc5\x9b\x9c\x0a\xa7\x6c\x63\x64\x5a\x39\x5b\x6d\x81\x8e\xc8\x62\x11\x37\x1a\xef\xf2\x46\x63\x43\xb0\x87\x67\x7c\x5d\xbe\xec\x39\x57\x3d\xa7\x7a\xa3\x59\x59\xd4\xa6\xab\xd2\x0e\x4d\x47\xb8\x12\xc6\x66\x41\x16\x84\xde\xf7\x08\x6d\x7d\xd6\x9e\x08\x9f\x2c\xc9\x89\x68\xd2\x1e\xb8\x7e\x40\x07\xfe\xc0\x5c\xd9\x12\x2f\xe3\xdb\x66\x52\xe8\x4b\xa2\x27\x7e\x69\x2a\x26\x7a\x16\xca\x21\xcf\x0b\x37\x0e\x7a\xf0\x4d\xc4\xa8\xd1\x78\x2e\xa9\x1b\x74\x16\x6a\xd7\x52\x4b\xbc\xb3\xe7\xe5\xfc\xc8\x4e\xbf\x97\xf0\xad\xcf\x79\x65\xfa\x2b\xed\xe6\xb6\xdd\x27\x9e\x43\xbb\xe8\xe7\xe2\xd1\x7f\x0a\x68\xd6\x76\x46\xbc\x45\xcb\xe9\x1b\xd1\x14\x28\x08\x4c\x5c\x52\x9d\xb8\x91\x76\xfa\x3b\x2d\xa1\xa9\xe6\x9b\x95\xe3\x21\xe1\x68\xce\x26\xb7\xe8\xb7\x31\x69\x34\x9c\xac\x5d\xd6\xd2\xa2\xd8\x70\xee\xe7\x7a\xb0\x02\xe2\xc6\x28\xe2\x7d\xd5\x73\xf2\xf5\x73\x72\xfa\x08\x8b\x17\x86\x3e\xc6\xce\xbd\xac\x69\x2a\x26\x84\x78\xb1\xd6\xc5\x1b\x48\x6f\x80\x5f\xfe\x78\x16\x78\xef\xf4\x38\x0e\xda\x02\x39\x05\xd6\x01\x88\xce\x8b\xde\xc6\x74\x00\xbd\x50\xd5\x9e\xc6\x74\x40\xe8\xb6\xb9\x8b\x1f\xa0\xc3\x64\x5d\x49\xdc\x68\x54\x6a\xb9\xa8\x54\x12\xea\xd6\x77\x05\x00\x70\xd8\xf5\x7e\x31\xff\x25\xde\x0a\x54\x32\xef\x09\x3f\x86\xf9\xdb\x29\x47\x39\x36\xf0\xc1\xce\x14\xb1\x13\x49\x1a\x0d\x67\x79\xb4\xfd\x87\x30\xa0\x31\xa1\xc5\x2e\xba\xa5\x8d\x43\xc7\x5c\xfa\xbb\x2f\x01\xfb\xf0\x8d\xc4\xfc\xa8\xe3\x84\x34\x06\xd4\x8a\xd9\xe0\x86\xd0\x98\x69\x37\x1e\xdc\x7e\xe0\x5e\x61\x03\xec\xc3\x35\x6c\xc6\x45\x15\x78\x7b\xa3\x70\x05\x21\xca\xc6\xc0\x52\x52\xc5\x07\x58\xa1\x46\xa7\x18\x18\x4c\x34\x4c\x7b\xf7\x42\xcd\x6a\x56\x38\xf0\x0a\x17\x33\xae\xe5\xea\x52\x55\x38\xd6\x44\x0b\x08\x48\x16\xf7\x48\xc8\xe2\x1e\x97\x9a\xca\xef\x9e\x0a\xee\xb3\x8f\x9f\x28\xdb\xa2\xac\xf5\x29\xa0\x7b\x18\xf1\x8f\x22\xbc\x5f\x84\x3f\x61\x44\x45\xec\xf8\x7c\x8d\x91\x6d\xfd\x94\x47\x13\x1e\xe3\x73\x9e\xb1\x27\x81\xa6\x24\x8c\x59\x09\x67\x63\xf7\xda\x89\xe1\x78\xb1\xc1\x63\x7f\xf2\x12\xcc\xe7\x7b\xd7\x4e\x82\xe8\x65\xd8\xca\xd8\xb0\x99\xed\xfd\x53\xe1\xee\x9e\x0a\x4f\xc1\xb6\xab\x9f\x43\x3d\xc5\xbe\xe5\x1c\xb7\x22\xf8\xf2\x42\x76\xa4\x2c\x13\xab\xd5\xfb\x53\xab\xde\x6f\x8e\xbf\x35\xeb\xfe\x17\xd6\xaa\xff\xf1\x1e\xbd\x4d\x5c\x80\x91\x4e\x84\xbb\x85\x1e\x4d\x8e\xd0\x2b\x86\xbd\x50\x5f\x90\x85\x75\xa5\x54\x7a\x70\xa8\x08\x7a\x59\xb9\x2a\x81\xc6\x2e\xbe\x3f\xce\xe7\x89\x96\xa9\xc2\x0f\x4f\x5a\x9f\x80\xc2\x3f\x0c\xa8\x40\xb9\x0a\xf4\x87\xa4\x05\xe6\xd6\xc0\x2b\x38\x82\x10\x19\x55\x53\x76\x2a\xe9\x6c\xea\x98\x38\x5a\xf1\x30\xb8\x29\x50\xaa\x64\xdc\x1f\xe8\x2f\x7f\x18\x34\x05\xfa\x1a\x6c\x0a\x82\xc6\xec\x25\xd5\xf9\x88\xc9\xc6\x05\x1d\xe8\xd8\x61\xd0\xfc\xf8\x9b\x20\xf4\x52\x07\xb7\x75\xf0\x0d\x75\x7a\x2b\xc7\x55\x38\xa8\x98\x3a\x8a\xbe\xdb\x68\x69\xa9\x40\xe8\x36\x5a\xd3\xc2\xaf\x99\xf6\x41\xdc\x3b\xe7\xb0\xab\xce\xe7\xe6\xf3\x6b\x42\x22\xbe\xad\x27\x98\x46\x7c\x94\x3b\x02\xf8\xe2\xf9\x3c\xd2\x2a\x21\x5b\x74\x63\x8b\x0a\x60\x7b\x09\x3d\x38\x05\xa0\x12\xaa\xf0\xb1\xf3\x2a\x15\x30\xdb\xc7\xbd\xb6\x23\x38\xfc\x52\xe0\xea\xbe\xbd\x04\x4d\x51\x0c\xd0\xef\x1f\x89\x8b\x32\x98\x09\xca\x66\xfc\xd2\x98\x66\xe5\x98\xca\xa6\xf8\xfd\x23\xa1\xb2\xc9\x45\xcd\xec\xe3\x45\x67\xf5\x5d\x18\xf1\x3a\x36\x26\x55\x14\x01\xfe\x40\x01\xfa\x92\xd7\x98\x7f\xed\xa0\x83\x63\x2f\x36\xb8\x19\x73\xf8\xf2\x62\x83\x9b\x78\x8c\xf2\x12\xd4\xed\x43\x8f\x2d\x92\x5d\x45\xed\x43\xa8\xc6\x3d\xb8\x76\x14\xdd\xd8\x32\x1f\x12\x0e\xf5\x5e\xc2\x0f\x76\xd1\xe3\x76\x79\xa9\xa3\xd8\xb7\x50\x3b\x32\xd0\xfe\x90\xf6\x4e\xc5\x92\x47\xa4\x9f\xa1\x39\xe4\xce\x2c\xa2\xd3\x01\x3f\x84\xea\x69\xda\xcc\xf5\x10\x22\xa0\x15\xd4\xcf\xe9\x40\x8c\xbb\xee\x60\x41\xbc\xb4\xc9\x21\xd3\x62\x11\x73\x07\xff\x47\x2c\x23\x8d\x46\xec\x87\x01\xfc\xb0\xb4\x7a\xe9\x61\x7d\xce\x26\x04\x00\x4e\xfd\x24\xa0\x1b\xe9\x7c\x9e\xb2\x0b\x35\x9f\x3b\x7b\xd7\x4e\x4a\x15\x99\xcf\x63\x28\x9f\x04\xfa\xaf\xff\x03\xef\xa7\x0b\x5a\x92\xa0\xad\x1f\x54\x4a\xd2\xc3\xc5\xef\x8e\x90\xb5\xe8\x1d\x3a\x8a\x25\x40\x21\xed\xec\x6c\x6e\xd1\x88\x2c\x34\xc3\xd9\x3b\x5c\x32\x4e\x26\x7c\x79\x14\xd4\xaf\x2d\x05\x2a\x5c\xf8\xc7\x41\x55\x77\x62\xa7\x2a\x03\x50\x72\x8f\x68\xfd\xb4\x34\x93\xd3\x6c\x16\xa6\x77\x9f\xae\xe1\xf0\x8f\x07\xa4\x72\xdf\xc9\xad\x9d\x5d\xd3\x8f\x18\xfb\x51\x45\xa9\x93\xff\x2b\x62\x69\xd6\x96\x17\x56\x68\x64\xc8\x8e\x7b\x80\x87\x11\x87\x2f\xf3\xee\x2c\xd9\xd7\x6f\x9e\xe2\x5b\xc6\xdb\x44\x86\x46\x57\xae\xbb\x54\xf1\x56\x21\xec\xfa\x73\x4a\x07\x85\x8d\x92\x17\x7f\xcc\xcd\xb3\xba\xd5\xfa\xea\x46\x4e\x46\x3c\x4d\xba\xc3\x7d\x54\xd1\xff\xf2\xe0\xec\x3e\x38\xa9\x36\x8c\xcd\xfa\x11\xa1\xd2\xc4\x65\x3a\x18\x9b\x60\xc2\xce\x5f\x2a\xb9\x2a\x55\x6a\xdf\x99\x31\xf5\x05\x95\x01\x01\x0e\x24\xcc\x1d\x93\x4e\x55\xd9\x3a\xda\xdc\xf6\x92\xf5\xa4\x38\xe5\x29\x3b\x95\x9e\xe0\x51\x41\x05\xbc\xd9\xd4\x89\x2c\x4d\x4d\xfc\xc3\xa0\x99\xfe\xfe\xb1\xb9\xc5\x3e\x01\x45\xa0\x09\x8a\xb5\xd6\x62\xd0\x03\x49\xda\xfc\x47\x53\x10\x9a\xf8\xdb\x45\x80\x10\xcf\x69\xfd\xc9\x23\x68\xcd\x1f\x06\xf3\x79\xeb\x4f\xfe\x4e\x87\xb6\x01\xb1\xcd\x9b\x23\xce\xc3\x2f\x13\xd9\x10\x35\xa6\xa3\x82\xc6\x46\x3f\xa7\xb1\x2f\x5d\x4b\x04\x90\xbc\xf6\x81\xbc\xa6\x35\xf2\x3a\x00\x5a\x6a\xc9\x6b\x48\x73\x2a\xd8\x63\x2a\xc8\xc2\xce\x66\x8d\x78\x64\x74\x57\xb9\xca\x52\x10\x53\x91\xd9\x24\x33\x18\x36\x43\x6f\x71\x70\xa2\x2a\x2d\xae\x11\xd1\x83\xba\x4c\x06\x1c\x1d\x4f\xfe\x98\xcf\x1d\xf8\xe1\xaf\x0b\xbd\x87\xc8\x62\x0f\x91\xd8\xbf\xd0\x00\x14\x99\xfd\xf3\x6b\xea\x68\x21\x60\x2d\x08\x18\x55\x23\xb5\xcb\xfc\x99\x15\xcc\xa9\x08\x0d\x0a\xeb\xa3\x4e\x2c\xc5\xa2\x70\xae\x17\x32\xa0\x6f\x3c\xf4\x2f\x60\x41\xe1\xfd\xf3\x37\xf4\xbc\x6e\x86\x55\xa1\x0b\x41\x73\x31\x35\xfa\xe6\xf8\x31\x15\x01\xa1\xda\x78\x75\xcc\x1e\x22\xfd\x0a\x2f\x9a\x4d\x82\x75\xb0\xab\x7b\x07\xa3\x85\x36\x96\x56\xad\xe7\x2a\xd1\xbe\x37\xb1\x1e\x49\xa3\xa2\x1e\xb5\xbe\x1e\x65\xeb\xc1\x18\x5f\xe2\xbb\x58\x39\xa8\xcf\xeb\x44\x96\x32\x63\xeb\xcb\x51\x85\xf7\x72\x55\xf8\x36\x57\xd6\x8f\x79\x65\xc7\xd2\x03\x56\xee\x5a\x9a\x5a\xe8\x58\x08\xd1\xff\xd9\x6e\xb5\x84\x4c\x06\x81\x70\xeb\x1a\x2a\xc0\x20\xeb\xb8\xa4\xd8\xcd\xf0\xe1\x50\xcf\x86\xde\x93\x36\x9d\x22\xad\xf9\xb1\x19\x57\x91\x4b\xdf\x0c\x1b\xa2\x6c\xb7\x9a\x98\x24\xb8\xd5\xc4\x01\xdd\x48\x60\xb5\xdb\xad\x26\xc1\xad\xe6\xe4\x58\x0b\x6b\x35\x1a\x1b\x08\x6c\xa3\x51\xd0\xe1\xf8\xaf\x37\x9a\x62\xb0\xf5\x4e\x53\xde\xc1\xfe\xcf\xf7\x8c\x62\xa3\x38\x79\x6b\xa3\x38\xac\x56\x8e\x44\x5d\xb2\xc3\x31\x0d\xf1\x89\xb3\x10\xd2\x52\x85\x5e\xcc\x76\xea\x85\x6c\x24\x79\xe4\x29\x38\xdd\x8c\x14\xdb\x19\xa1\x98\xdc\x76\x4a\x21\xa1\x02\xf7\xe9\x0a\x5b\x33\xeb\x38\x82\x5d\xe5\x66\x95\x6a\x0b\x9c\x16\x80\x42\xf6\x28\x5a\x50\x55\xa9\xe5\xa9\x0e\x20\x8a\x9c\x95\x75\x08\x16\xff\x28\xeb\x88\x6a\x16\xf4\x5f\xaa\x25\x7b\xb1\x83\x12\xce\xc3\xb2\x7c\x84\x26\x2b\xa0\x7c\xc4\x8f\x4d\xbf\x23\x3f\xb2\x52\x5a\x2b\xfd\x8e\xa0\xdf\x61\xb5\xdf\xa1\xee\x77\x84\xfd\x2e\x1b\x9e\xad\x36\xac\x2b\x2b\x5a\x21\x46\x20\xdf\x8e\x68\x65\x64\xb4\x60\x87\xd1\xa6\xb7\x33\x88\x46\xa8\x15\xb6\x4f\xe3\x95\xf6\x21\x81\xd4\x66\xf5\x6c\xcd\xf6\x7f\x64\xa7\x16\x30\xf1\x79\xea\xc4\x34\xf6\x13\x63\x76\x06\x58\x48\x08\x78\xb1\xaf\x02\x0e\x7f\x8a\x8b\xb9\x18\x83\x34\x79\x0b\x5e\xdd\x86\x17\xb3\xae\xe0\xa1\x97\x34\x1a\xe1\x0a\x7c\x90\x56\x99\x97\xed\xa5\xe1\x11\x6c\xbf\x67\x47\x08\xbe\x3d\xc1\x77\x2e\x1d\xe5\x3f\xbc\x04\x54\xb1\x8b\x2f\xd4\x7f\xd5\x8f\x36\x5a\x1a\xdd\x88\xa0\xc7\xfe\x41\xb0\x80\x93\xce\x87\x10\xf6\xae\xfd\x1e\x7f\x8d\x54\xdc\xcb\xb5\x88\x0a\x30\xd8\xa5\x02\x65\xb5\x41\x01\x03\x11\x69\xbf\x37\xcf\x53\x47\x50\x51\x8e\x02\xf0\x71\x30\x0a\xc2\x0f\x03\x2e\xec\xb5\x6d\x88\x9f\xb0\x57\x00\x7b\x2f\xf5\x9d\xe5\xbd\x74\xe0\x1b\x76\xce\xca\xb8\x8f\x56\xe9\xe5\xeb\x89\x74\x25\x7d\x4a\x5d\x3f\xa0\x87\x63\x37\xa2\xdb\xa9\x11\xbc\x89\x79\xa8\x2f\x37\x50\xdf\xdd\x5c\x6e\x48\x94\x6d\x49\x2c\x96\x16\x2a\x7a\x78\x13\x21\x86\x0a\x8f\x77\x52\xab\xea\x91\xc2\x03\x02\x5e\x3c\x96\xc2\x62\xb1\x95\x2e\x4f\x4a\x82\x91\xf1\xd0\xde\x2b\xa0\xd1\x3c\xc3\x4e\xa6\x34\xe1\x97\xb5\x8b\x9a\x15\xe3\xfb\x0b\x7b\xeb\x98\xe0\x65\x4d\xe2\x0f\x02\xd8\x46\x3f\x67\x1e\x19\x34\x9b\x5e\x8b\xf3\x41\x3b\xe1\x2d\x77\xc0\xd1\x55\x7c\x3b\xe1\x5a\x6e\xcc\x75\x32\x9e\x7d\x3e\xbe\x77\x12\x7f\xb0\xb9\x85\x65\xa8\x2d\x4c\xda\x83\xcd\x2d\x77\x40\x13\x7e\x01\x8d\x27\x7e\xa6\xa5\x59\xf0\xa6\x63\x61\x64\x88\x2a\x9e\x65\xb5\x3b\xf5\x2f\x30\x73\x31\x4d\x08\x1d\x4e\x9d\x1c\xc6\x9e\xa6\x70\xe6\xc3\xab\x1e\x61\xde\x64\xa8\x1e\x42\x27\xe7\xdf\x30\x3b\xa1\x39\xdb\x4f\xf8\xeb\x77\x57\xb2\xdb\x7f\x2e\x88\xf1\xd2\x68\x1e\x9e\xf2\x66\x93\xe4\x38\x62\x8e\x29\x97\xe8\x72\x39\xa1\x09\xdb\x16\xfc\x55\x0a\xd7\x1a\x21\xd8\x59\x2c\x08\x4d\xf4\x4e\x96\x13\xfa\x2e\xc3\x51\xcc\x03\x9a\xb0\x6f\x21\xcf\xd8\xb7\xd0\xc8\xbe\x87\xb9\x03\x51\x94\xfd\xc3\xde\xda\x84\xb5\x5b\x9b\xe8\x6f\xdf\xda\x00\xb3\x6e\x2a\xb9\x14\x04\xa6\xef\xfc\xd1\x4f\xf0\xc6\x26\xe6\x39\x54\x96\x70\xc9\x4e\x21\xae\x23\x02\x9a\xf3\xbc\x72\x63\x13\xb7\x8b\xc3\x83\x2b\x8b\x1b\x1b\x33\x60\x34\xd7\xb7\x35\xd8\x7b\xf8\x0b\x28\xc2\xf9\x97\x43\x7b\xce\x08\x8b\x4b\x30\xcd\x56\x95\x57\x62\x7a\xa4\x80\x4a\x55\x47\xb8\xf2\xc2\x67\x45\xad\xe9\x88\xe6\x3c\xd6\xfc\x47\xeb\x33\xcf\xbd\x7c\x73\x13\xed\x21\x26\x3c\xf6\x73\x60\x5c\x6b\xc7\x10\x83\xf5\xd2\xb8\xf0\x95\x86\xfb\x92\xc6\xd5\xaf\x44\x16\xcd\x58\x9a\x34\x1c\x57\xa2\xd1\x0b\xb8\x3a\x38\xac\x8c\x78\xae\xf9\xdf\x45\x71\xe9\x6a\xf1\x27\xa4\xa3\x37\xf1\x07\xd2\x48\xc5\x77\x7f\x1d\x49\x42\xc4\x8e\x77\x3f\x43\x8f\x0a\x76\xfc\x12\x72\x54\x85\xfe\xbe\x58\x25\x25\x2d\x3a\x35\xb4\xb6\x5c\xaf\x9e\x0b\xb5\xde\x7b\x9e\xa4\x8e\xb0\x36\xe4\x84\x3f\x0c\x36\xb8\xc4\x73\x80\xf0\xb7\xf1\x7b\x3b\xf0\x36\x90\x02\x6f\xc3\x64\x6e\x6b\x0b\x64\x68\xa6\x13\x69\xb7\xce\x8b\xb6\x3a\x75\x78\xdb\x84\x0f\x4d\xf8\x50\x87\x61\xdc\x31\x42\x33\xb6\xa6\x75\x6d\xf7\x26\x6c\x34\x72\xe9\x54\xa2\x80\x0e\xb6\x8a\x4c\x2c\x54\x56\xb4\x0e\x03\xfc\xe6\xbe\x12\xa2\x49\x6a\x2e\x35\x4f\x7b\x02\x92\x04\x44\x16\xc4\x07\xf7\x2b\x43\x7e\x8e\x90\x08\x86\x0a\xb6\x1f\x69\x7e\xcb\x8a\x20\xb4\xd1\x42\x73\x74\xd6\xa4\x49\x09\xc2\xd7\xa8\x02\xc2\xd7\xa8\x0a\xc2\xd7\xa8\x04\xe1\xcc\x82\xf0\x35\xfa\x19\x08\x5f\x23\x0d\x82\xfe\x2d\x2b\x42\x10\xb6\x00\x8a\x65\x10\xc2\xbe\x7e\xd8\x39\x36\x76\x6a\x8e\xcd\xed\xae\x49\x7e\xfe\x83\xbf\xc3\x8f\xa7\x3f\x74\xfa\x57\x9b\x5e\xd9\x4b\x8e\xea\xa6\x13\x8c\x9d\xba\xf9\x7c\x43\xae\x38\xc1\x49\x34\x5a\xd0\xd4\xa0\x47\xca\x8e\xef\xb9\x64\xc7\xf7\x5e\xca\xae\x80\x53\xbc\x52\x5e\xca\x14\xac\x47\x15\x7b\xc6\x7c\x51\x8c\xd3\x18\x56\x26\xb0\xe2\x63\xa4\xd1\x90\xc5\x97\xf0\xd5\x0b\x30\xac\x12\x7e\xc9\xab\x60\xfb\x12\x70\x0b\xfe\x3a\x29\xdb\x97\xa8\x2d\x8d\xae\x23\xa1\x79\xf8\x25\x00\xc2\x6d\x04\x41\xf8\x25\xde\x8e\x70\x52\x0a\x21\xa0\x2d\xe8\xd5\x4a\xa7\x86\x36\x35\x84\xd4\xd0\xa4\x5a\x4d\x42\x2e\xcd\x87\x3e\x87\x1e\x21\x7d\x3a\x12\xe4\x35\x65\x47\x82\x27\xf7\x0e\xfc\xe2\x4d\x2a\x86\x42\x0c\xe9\xbd\x0e\x52\x68\xce\x21\xca\x2b\xf9\xf8\x52\xd4\x00\xa8\x21\x00\x00\xbf\xc4\xcb\x4d\x28\xc7\xd0\x93\xf1\xda\x1b\x07\x74\xc4\x05\xbb\x8d\x50\x55\x11\xbd\xf8\x8d\xb8\x84\xf0\x30\x75\x46\xc4\x1b\xb0\xdb\x02\x42\x67\x44\x16\x0b\x84\xf2\x0a\xc6\x8e\x5d\xe9\xf3\x5c\xca\xae\xba\x1a\xd0\xab\x2e\xa1\xa1\x09\x85\x18\x02\x20\xaf\xba\x08\xe4\x55\x97\xbe\x5b\x82\xb0\x06\x20\xad\x01\x48\x7f\x01\x38\xba\x04\x9c\x9e\xdb\x5e\x84\x4a\x9d\xbd\x28\xd0\x76\xac\xa6\x30\x2b\xf7\x4e\x8a\x31\x84\x86\x53\x98\x87\x7b\x6d\x09\x92\x40\x85\x98\x42\x43\x8e\x31\xf4\x7b\x07\x6a\xfe\xde\x71\x42\x62\x4e\x1e\x23\x0b\xee\x37\x83\xac\xd8\x06\x00\x27\xed\xc7\x08\xfe\xa0\xf4\x9a\x55\x2d\xab\xc1\x61\x24\x8a\x4e\x0f\x84\x8e\xd7\x05\xd7\xbb\xf6\x11\x6c\x2c\xd0\x6f\xa9\x80\xe3\xfc\xd4\x49\xe8\x65\xcf\x94\x5a\x9b\x5f\x93\xfe\x09\x3b\xfb\x17\x3e\x37\x61\x99\x14\xca\xfc\xa4\x0d\x5b\xe6\xbc\x52\x06\x07\x25\xd1\x83\xe2\x7d\xef\x98\x4f\xf8\x4a\x8b\x2f\x3d\x66\x46\xeb\xc7\x4f\x68\x5a\xf5\xb2\xf5\x6d\xd9\x0a\x8a\xbd\x4d\x53\x6c\x5b\xa0\xd7\x2a\x3d\x8f\x0a\xe7\x31\x2b\xe6\x31\xd3\x2c\xa9\x99\x45\x4c\xf5\x64\x39\xad\x99\xb6\xb7\x08\x7c\xe4\x36\xea\x8f\xb2\xe9\xa6\xa0\xa9\xfe\xe2\xb2\x19\xd3\x08\xfd\x4d\x43\x78\xc6\x23\x9b\x69\x66\x1e\xf1\x2a\xe5\x66\x45\xb9\xd9\x52\xb9\x69\x59\x6e\x5a\x73\x40\xd2\x31\x06\x68\x97\xf4\x48\x90\x75\x06\x2a\xe4\x87\x01\x41\xc1\x88\x10\x98\xda\x6d\x01\x91\xf0\x6b\x55\x4b\xe1\x1b\x95\xa9\xa1\x6e\xcb\x2c\x63\xc0\xdb\xb7\x97\x65\xdf\xbf\x3b\x8a\x4d\xa9\x02\x90\x17\x35\xd9\x8c\xe3\x9a\x06\x2d\xdb\x1d\xa2\x3c\xee\xd5\xb3\xe6\x64\xb2\x46\x23\x64\x99\x15\x02\x00\xdc\x42\xcb\xe5\x75\x27\xf0\x55\xbc\xea\x45\x80\x57\xbd\x08\xce\x00\x40\xb4\x2f\x97\x1d\x52\xad\x60\x48\x64\xb1\xca\x13\x40\xed\x2f\x7b\xce\x9b\xd5\xdb\x02\x06\xa5\x3c\xed\x0b\xea\x24\x99\xcf\xf5\xd7\xdd\x51\xdb\x81\x59\xb5\xda\xae\xb8\xd7\xb5\x02\x17\x37\x1c\x6d\xdd\xbb\x48\x0b\x4d\x5a\x68\xd2\x4a\x2a\x1d\x56\x28\xb7\xa6\xd7\x21\xfc\xb6\x4f\x34\xee\x69\x0c\xa3\x06\xb3\x88\x7b\x8a\x03\x48\x8c\x63\xaa\xce\x5e\xa3\x71\x86\x31\xd5\x53\xe4\xe9\xf2\x20\xb3\x3d\x61\xc6\x99\xed\xe1\xe4\xc9\x46\xa3\xa2\xad\x42\x8d\xa7\xf5\xd7\x85\x76\x20\xbf\x2a\xb7\x66\x4e\x14\xfe\x87\x00\xf0\xcf\x87\x8f\x80\x4b\xb2\x20\x4b\x3a\x4a\x2b\x79\x93\x7a\xde\x9f\xd6\x1b\xf9\x32\xe0\xa6\xc0\xfa\xaa\x8b\x83\x05\xe4\xa9\xb8\xc3\x87\x12\x5e\xe4\x87\xc1\x06\x47\xe7\x75\xda\x4c\x2f\xf1\x14\x0a\xa0\x2c\xfe\xb2\x69\xe5\x9b\x66\x6d\x05\x08\x0a\xd6\xb1\xa8\x3e\xaf\xb4\x68\xc6\x5b\xe8\xa6\x8e\x0e\xb8\x1f\x78\x29\xda\xd3\x9f\xcf\x33\x6d\x73\x88\xe8\xb0\x3d\xc4\x45\x7e\x1a\xb4\x9d\x01\xbe\x98\xfc\x98\xba\xaf\xa3\x9e\x9b\x52\xf5\xe2\x6e\xb4\x16\xf4\x4e\x87\x33\x0c\x6f\xc1\xf1\x44\x7b\xd4\xd3\xde\x07\xfc\x34\xf0\x3f\x04\x0b\x42\xd3\x66\x93\xb8\x8e\xae\xde\x56\xab\xfc\x6c\xb5\xda\x77\xba\x9e\x7a\xbd\xad\xa5\x7a\x43\x3f\xd3\xf5\x12\xf7\x57\xc0\x5a\x2e\x5e\x07\x8b\x66\xcd\x26\x2c\xa2\xb3\x7b\xb6\x27\x78\x6e\xac\x3d\xad\x5d\x48\x2d\xce\x65\x5b\xe0\xd2\xf8\x93\x0b\x38\x6a\x9e\xf5\x1c\x41\xdc\xcb\x8e\x23\x7c\xb9\xb9\x15\x50\xe1\xcb\x80\xb2\x4f\x64\xe1\x21\xba\xde\x47\xed\x73\x44\xff\xc1\x92\x69\xd3\x8a\x33\x4f\xc9\xd4\x4b\x5b\xf8\x92\x8d\x7a\xbf\x85\xcd\x28\x70\x47\xb8\x5c\x74\x88\x2c\x88\x7b\xd5\x59\xa9\x60\x5d\xe1\xb2\x20\x59\xd4\x9f\x62\x56\x6d\x80\xe8\x95\xa4\xaa\x2b\x29\x6a\x34\x50\x6b\xbc\xa5\x5d\x71\xcc\xe7\x2d\x98\xa1\xe3\x80\xd8\x91\xf1\x03\x8a\x90\xf8\x35\xd5\x93\xaa\x51\xf8\x8a\x41\xb4\x78\x9d\x0e\x81\x74\x10\xdd\x17\xd6\x1f\xae\x1f\x68\xfa\x7b\x0c\xc4\x02\xdb\x2a\xef\x0a\x5a\x5e\xa6\x45\x26\x61\x76\x52\x3b\xc7\x19\x4c\x6c\x06\x67\xe0\x0a\x32\x38\xc7\xf7\x0e\x54\x93\x05\x84\xc6\x8e\xc2\x93\x3c\x31\xc0\xbc\xcf\xf8\xd9\x81\x70\x34\x03\x4b\xef\x9c\x6c\x8d\x9e\xa7\x60\xe1\xbe\xb6\x02\xb1\x6f\x0c\x37\x1a\x82\xe9\xcb\xc0\x1e\x41\x95\x2f\x02\x7c\x40\x2a\x5a\x93\xa6\x35\xa1\x9f\x69\x8c\x65\x2d\xdc\xb6\x0c\xb0\x12\x80\x15\x75\x60\xb3\x05\x82\x66\xc7\x34\x59\x42\x93\xf4\x6d\x34\x11\xbe\x44\xf4\xb0\x08\x91\xbe\xb1\x95\x20\x89\xaf\x5d\xc5\x69\x22\x5a\x84\xa5\x7e\x30\xd4\x8c\xba\x60\x37\xf8\xc5\x6e\xf0\xdb\xdc\x68\x17\x5f\xe6\xcd\xab\x08\xb3\xdd\xae\xd3\xc2\x37\xa9\x22\x0a\xf8\x76\xc1\xa4\xae\x90\x49\x41\xbc\x5c\xe2\x47\xc5\x53\xa3\x58\x58\x09\xbb\x63\x74\x10\x9a\xa2\x49\x89\xb0\xaf\xbf\x15\x60\x43\x0c\x7f\x0c\x5e\x20\xe5\x8e\xd6\x93\x39\x20\x8a\x3d\x27\xf5\x61\xcb\x0c\xc8\x7c\x6e\x3f\xb9\x1f\x10\x6a\xbe\x8d\x05\xad\x05\xf1\x2e\xef\x7f\x42\x7a\x4b\x73\x27\xbd\xa8\xd1\x30\x65\x61\xb3\x83\xbd\x6c\x84\x2e\xe5\xc2\x9e\x13\x92\x76\x52\x9b\xd1\x70\x41\x5c\x65\xed\x44\x63\x13\xe9\x92\x72\xab\xa8\x85\x63\xc8\x8b\x6f\x1c\xa8\xd1\x8a\x93\x97\xfc\x6c\xf2\xcc\xe1\xfa\xaa\xe7\x28\x2a\x81\x1b\xbb\xea\x39\xb1\x36\x97\xae\x87\x6f\xba\xc3\xe3\x7b\x47\xd1\x4c\xef\xfd\x65\x54\x48\xdf\xc5\x55\xf7\x70\x9d\x55\xd1\xe8\x96\x17\x7d\xc6\x7a\xac\xd0\x48\x79\x9f\x8f\xd1\x51\x80\x0e\x53\xb0\xde\x48\xdf\xce\x99\xb5\x6a\x5e\xe2\xe5\xd2\x3b\xbc\xf4\x33\xd8\x44\x42\x47\xd1\x9c\xfd\x98\x12\x38\x4f\x38\x31\xcd\xd9\xdd\x94\x78\x83\x46\x63\x63\x80\xf7\x2a\x79\xa3\xb1\x91\xe3\x97\x83\xc3\x39\x30\x2e\xf1\x73\x42\x16\xa6\x61\x7e\xdd\x71\xcc\x27\x4d\x4c\xd7\x6c\x2c\x7e\xd2\xb4\x86\xd8\xe7\xa7\x6b\x44\xbf\x57\xfa\xf7\x4b\x7d\x43\x97\x3f\xd8\xb5\x0a\x09\xd2\x66\xad\x80\x2e\xfd\x8e\x29\x34\x37\x51\x71\x19\xa5\xef\x25\x71\x4c\x06\xd5\xd1\x1c\x71\xa9\x25\x22\x5b\xde\xe4\x73\xe6\x4d\x2c\x24\x4f\x38\x50\x23\xf6\x63\x4a\x33\x3a\x21\xde\x53\xa3\xb1\xf1\xa4\x2f\x9e\x60\x34\x9e\xf4\xa3\x8f\x2e\x96\x63\x31\xe7\x09\xc7\x73\xc4\xee\xa6\x34\xa7\x13\x42\x8a\x12\xa9\x29\xf1\xb7\x86\xaf\x18\xbd\xeb\x9a\xda\x9a\xa6\x06\x21\x4b\xb9\x5c\x63\xdb\xea\xeb\x5b\xcc\x6e\x79\x67\xc7\xe2\x04\x78\x5e\x08\x86\x36\xe8\x20\x99\xdb\x15\x86\x01\x29\x67\xee\xa6\x2a\x72\x2c\x80\x55\x81\x9d\x47\xc0\x49\x7f\x12\x06\x9c\xcb\x1c\x1d\x4d\x4b\x1b\x22\xa2\xfe\x62\x7b\xfb\x00\x7d\x92\x0e\xa1\xd2\x3c\xfb\x6e\x86\x84\xee\x2a\x17\x2a\x66\xe7\xc0\x65\x9e\x2b\x1a\x12\xfb\xa6\x8b\xf9\x87\x10\x3d\x54\x3a\xef\x44\xe8\xbc\xa7\x92\x4a\xf8\x13\x12\x7a\x9b\xe8\xa8\xc7\x1e\x95\xf0\x27\x24\x34\xbc\x70\x05\xcb\x33\xba\xdf\x75\x05\xfb\x92\xd0\x81\x18\x8f\xd5\x30\x77\x05\x7b\x8a\xec\x06\xd3\x8b\x9d\x14\x98\x80\x46\x23\xed\x01\xd5\x81\x8e\x60\xbf\xe4\x8a\x46\x82\x71\xe7\xea\x1f\x03\xdb\x7c\x1c\xd8\x33\xac\xc2\x03\x2c\xaa\x21\x01\x00\xfa\xf0\x1a\x07\x28\x97\x29\x78\xb4\xb0\x56\x62\xa4\x67\xcd\xc5\x40\x7b\xf3\x79\x8e\x0a\x93\x17\xc5\x2a\x70\xfb\x3a\xbe\x8f\xf1\xc2\x7d\xd4\x60\x3d\xea\xe0\x6f\x0e\x74\xbc\x29\x7f\xd3\x2e\x48\xd6\xd9\x98\x29\xab\xd2\x57\x3d\xa5\xdf\x20\xf4\x33\x51\x08\x85\x7b\x85\x76\xf8\xe5\x7d\x95\xd8\xe1\x25\x51\x08\xa7\xdb\x18\x5d\x2f\x44\x7e\x1c\xf0\xe5\x2e\x2d\x2a\x9a\xd5\xe5\x61\xae\xfe\x76\x2e\xf9\x86\x9a\xcf\x9d\xb0\x2d\xff\xe4\x68\x66\xaa\xd1\x90\x9f\x39\x9a\x9a\x72\x37\xb6\x6c\x05\xce\x46\x84\x99\xc4\x9f\x3c\xf4\x0f\x83\x46\x43\x40\x9e\x30\xc2\x3c\xa4\xd1\xa8\x1a\xb3\xbb\xac\x37\x80\x47\x5a\x40\x37\x7d\x90\x05\x54\xc3\x08\x59\x44\xe8\xbb\x20\xb6\x5f\xb1\x5f\x5f\xf2\x4f\xf6\xfc\x8b\xea\xf7\xb2\x12\xb2\x32\xfe\xfa\x9a\x57\xe1\x56\xaf\x2f\xbb\xa4\xfe\xb9\x33\xf7\x5d\x47\xe5\xa8\xe9\x77\x45\x36\x35\x23\x05\x89\x40\x9d\xa6\x54\x56\x03\x4a\x9b\xa1\xab\xe7\x99\x55\xf3\xcc\x4c\x7b\xd5\xdb\xb1\x10\x2d\x02\x62\x29\xfc\xa2\xda\xa4\x20\x55\xf8\xd6\x61\xef\xb3\x10\x2c\x76\x24\xaa\x30\x25\x00\x93\x29\x79\x24\xfc\x24\xc0\xc2\xf6\x0b\xa1\xf9\xce\x23\x27\x64\xb7\x34\x64\xb7\xba\x61\x7b\xf3\xa4\xeb\xbb\xea\xbe\x55\xdf\x55\xd7\xd6\x67\xbf\xd6\xd7\x77\x7c\x0f\xf5\xc1\x5f\x27\x64\xc7\xf7\x1c\xf1\x93\x1d\xdf\x53\x88\xc4\x3e\x58\xe3\x87\x57\xaa\xb0\xc5\x8a\xdf\xef\xa0\x7d\x65\x5a\x83\x75\x7f\xa5\x6a\xf9\x55\x5c\xe6\x57\xda\x65\x84\x8a\x75\x76\x15\xa3\x95\x45\x3d\x44\x95\x8b\x22\x3d\x77\xb5\x6b\x1b\xec\x55\xf9\xbc\x9a\x72\x7d\xf9\x94\x04\xfa\x52\x45\x56\x42\x39\x5e\x75\x78\x79\xa3\x91\xfb\x23\x40\x04\x27\x37\xb7\x1b\x37\x1d\x7b\xd1\x41\x33\xf3\xab\xe0\xb4\xa2\xef\x42\x8a\xd4\x99\x49\x9d\x21\x60\x50\x19\x9a\x04\x6f\x7d\x86\x4f\x34\xf8\x4e\xf5\x08\x3a\x69\xdb\x44\x01\x5b\xe0\xb6\x48\xb3\xbc\x9c\xa1\xb5\xc4\x59\x2d\x71\xe5\x86\xe3\xb2\x53\x23\x06\x6b\xef\x7d\x23\xb3\x71\xc0\x20\xf4\x90\x8b\x9c\xcf\x81\x00\xb0\x1b\x42\x22\x76\xa3\x47\xf4\x06\x9f\x93\xa4\xf9\x0d\x09\x8d\xd8\x8d\x19\xec\x9b\xd8\xa6\xc5\x26\xd1\xc3\x7a\xe4\x88\x34\x1a\x58\x11\x7e\x39\x11\x93\x23\x5d\x42\x8e\x28\x44\x22\x71\xc4\xac\x61\x91\x35\x34\x59\x43\x93\x35\x84\xac\x61\x25\xab\x14\x45\xad\xf0\x05\x11\xb0\xf7\x30\x29\x74\x13\x25\x0f\x4b\x7f\x08\x8c\xa0\xb8\x73\x48\xe1\x1f\x04\xd0\x2c\xfe\x02\x19\x25\x34\x97\x3a\xc3\x4d\xc7\x31\x75\xfb\x67\x51\x40\xda\xf6\xcb\xdd\xa2\xa6\x25\x1d\x2f\x2b\xf1\xa4\x82\x89\xd7\x61\x89\x89\xd7\xf8\x6e\x62\x2c\x02\xb5\x02\x40\x1f\xce\x31\xbe\x12\xd3\x8e\xd8\x75\xa8\x3b\x78\x1d\x52\x48\x04\xd2\x6f\xc4\xae\x20\xad\x24\xaf\xef\xbe\x9c\x0a\x14\x16\xcc\xc7\x6a\x38\xe8\x67\x62\xac\xde\xd2\x7d\x3e\xbb\xd7\x17\x57\xa1\x2a\x6e\x23\x4a\x06\xb5\xb0\x92\x62\xe8\x34\xbe\xaa\xeb\xb7\x0f\x82\x7b\x80\xac\x3d\xa1\xc8\xf2\xed\xd9\xbe\xb3\xf8\x51\xe0\xa9\x46\x03\xa8\xb0\xf2\x5b\x01\x55\xfe\x56\x80\xd4\x58\x14\xd6\xe0\xb1\xf9\xaf\x91\xa5\xb1\x7f\xdd\xfc\x16\x3e\x7d\xeb\xe6\xab\xcf\x27\xc5\x41\xd7\xba\x71\xea\xe1\x15\xe0\x9a\xe6\xa3\x7a\xf3\xe6\xc1\xc4\xd8\x5d\x09\xfb\xe4\x55\xb2\xac\xaa\x30\xa8\x75\x0a\x4d\x36\x2d\xf2\xa2\x6a\x8e\x68\x8e\x53\x2d\xa9\x60\x2a\x80\x00\xbe\x88\x24\xfa\x0d\xb6\xd1\x48\x1a\x0d\x2d\x31\x98\xa0\xe0\x21\x44\xb2\x14\x0d\x8e\x91\xd7\x94\xa5\xd5\xc6\x34\xb7\x1d\x6b\xc1\x1f\x3c\x04\xb3\xd4\xcf\x02\x7e\xd9\x81\x32\xc0\x74\x27\xfa\x47\x2f\xbf\x98\x4d\x77\xa0\xa2\xe9\x0e\x72\xb0\x19\x7f\xa7\x8b\x4f\x77\xaa\xe5\x77\x03\x07\xcb\x4f\x77\x74\x05\xfa\x17\x1d\x3b\xb3\x27\x34\x49\xfd\x14\xb3\x83\x1e\x54\x04\xc1\xc4\x06\x9d\x94\x3d\xc5\xfa\x35\xe5\x29\x26\x34\xd5\xf1\x80\x85\xa6\x04\x35\x59\xb1\x2e\x89\xd2\xf9\x3c\x5d\x2c\xa4\x0f\xb4\x0e\x65\xaf\x6f\xac\x91\x8c\xa1\x6f\xcd\x1d\x5f\x3d\xc3\x27\x7a\x73\xf6\x87\x41\xa3\x31\x58\xca\x37\x2c\xf3\x0d\x4d\x3e\x7c\x50\x94\x6c\x9b\x97\xd9\xd8\xb6\xcd\xc5\xb6\x31\x93\x9d\xca\xa7\x3f\xcc\x54\x3e\xff\xa1\x79\x54\xc3\xa9\x9e\x8d\x8d\x88\x9a\xd6\x10\xc5\x98\x42\x49\xd4\xa8\x5c\x9c\x8d\x7d\x15\x78\x66\x26\x9f\xfe\x80\x80\x51\x95\x7a\xc6\x00\x8e\x38\xd0\xe0\x18\xc9\x29\x0c\x15\x84\x12\x13\xda\x10\xf7\x8e\xfe\x06\xbe\x10\x93\x52\x1d\x2c\x8d\xbf\xeb\x92\x74\xc0\x75\x46\x3a\xe2\x3a\x0b\x9d\xf0\x81\xd6\xc2\x82\x19\xcc\x6b\xc7\xad\x27\x9e\x7d\x9e\xb4\x07\x7e\x16\xb8\x03\x7f\xb2\xb9\x15\x78\xb9\x9f\x99\x5d\xe4\x89\x4d\xe9\x08\x43\xf4\x1d\x9c\xc2\xe1\x73\xa6\x13\x66\x3a\x61\x86\x96\x7f\x59\x27\x04\xb0\x3b\xa1\x9f\xbd\x04\x00\x32\x84\x93\x22\x9c\x62\x38\x2d\xc2\x4e\x06\x75\xd8\x74\x6a\x13\xa8\x20\xb4\xf3\xec\x40\x3d\x56\xac\x34\xf3\x0f\x03\x9a\xe1\x83\x79\x06\x13\x96\xa1\x01\x57\xe2\xc5\x6c\x1f\xf0\x9e\xed\x27\xb6\xc5\xfd\x44\xff\xb5\x2d\x42\x38\x2d\xc2\x58\xed\x7e\x42\xb1\x59\x1d\x49\x6d\x2a\xe2\xd7\x1a\xd7\xfc\x9d\xd2\x67\x51\xf4\xc2\xc5\xe2\x5d\x47\xdb\x19\x7f\xe6\xab\x17\x2a\x7a\x29\xe3\x9d\x83\x64\x97\x02\xad\xd1\x5d\x0a\x3d\xa5\x03\xb9\xc1\x13\x36\x90\xf3\x79\xec\x8f\x67\xc1\x06\x4f\xe0\x87\x18\x29\x10\x36\x90\x8d\x06\x9e\xfd\x6f\x3b\x4e\x74\x44\x13\x94\x9d\x81\x1c\x58\x33\x31\x0a\x56\x71\x2d\x9f\x3a\xa2\x10\x41\xe3\x32\x9f\x17\xb3\x1c\x1b\xca\x65\xe1\xbc\xda\x04\x12\xfc\xa0\x5a\x3c\x1d\x3d\xb9\x46\x47\xda\x95\xeb\xeb\xb0\xff\xec\x26\x54\x6b\x91\x19\xdb\x38\x95\x26\x4d\xe9\x78\xa9\xb4\xfa\x69\x69\x54\x19\x32\x32\x1d\x5e\xc2\x85\xfd\xdc\x48\xb4\xd8\x3a\xeb\x08\xce\x13\xd6\x41\x44\x7f\x09\xe1\xfb\x25\x9c\xcf\xdf\x84\x8e\x75\x84\x6d\x22\x41\x8b\x1b\xc4\xdb\x88\xe7\xf3\xe4\x97\xaa\xaa\x81\x1a\x57\xaa\x8a\x4d\x55\x85\x3a\x14\x80\x6a\xbe\x62\x76\xd8\x85\xc1\x3b\xec\x16\x23\xf9\x4e\x87\x6a\xf3\x74\xd8\x35\x02\x6d\xb5\x69\xaa\x66\xc3\x69\xaa\x65\x03\xb2\x54\xb7\x3e\x53\x03\xf7\x7c\x84\xd7\xf1\x6a\xc9\xf9\xc5\xd8\xba\x5d\x14\xfe\x97\x80\x9a\x0b\x4f\xfd\x34\xbf\xf0\x26\x03\xa7\xb3\xc6\x00\xce\xf1\xc4\x31\xa8\x4b\x05\x95\xda\xf6\x41\xcd\xc6\xcc\x6d\xa7\x7e\x3c\x52\xbe\x0c\xbc\x08\x5d\x2f\xa3\xdd\xcb\xc9\x98\x46\xfa\x94\xed\x46\x18\xb4\x26\x50\xaa\xbe\x80\x71\x5c\x43\x3b\xa8\xd1\xa2\x2a\xfa\xf1\xa3\x53\xbb\x88\xda\xbe\x77\xd0\xe3\xbd\x96\xf5\x3a\x0c\x9a\x40\xa0\x09\xe7\x5c\xb0\x69\xa3\x81\xa9\x33\xad\x6a\xa3\xff\x36\x81\xd0\xeb\xf4\x59\x7b\xa3\xe5\x6e\x6c\x55\xea\xbe\xaa\x89\x95\x1c\x4f\xac\x58\xc9\xd1\x84\x57\x97\xf0\xf5\xb2\xb8\x81\x16\x2c\x10\xfa\xc1\xa9\xdd\x72\xb7\x50\xc5\x10\x9f\x9d\x30\x94\xe9\xb4\x24\xc0\xcb\xdb\xaf\x91\x9f\x06\xc6\xa9\x4e\xe6\x2b\x20\x24\xf9\xb5\x83\x5f\x84\x89\x94\x0e\xb8\x28\x62\x85\x8d\x35\x0a\xe5\x85\xd9\xfa\xe7\x19\xaf\xcf\xa6\x65\x78\xdb\xc6\x00\xd0\x23\x7a\x9b\xfb\xb2\x3d\xed\x8d\x6e\x44\x36\x51\x8e\xa0\x09\x21\xae\x30\x53\xac\x6b\x99\xbe\x51\xcb\xa0\x3d\xa8\xd6\x72\x53\xad\x25\xad\xd6\x62\x98\x32\x9d\x6d\xb7\x2b\x86\xe3\xed\xa1\x12\x3b\xfd\x49\x1e\xf5\xf2\x64\xa7\x3f\x75\x4c\x4b\x69\x6e\x36\xa5\x19\x2a\x4a\x99\xd8\xcc\xc4\x4e\x67\x4e\x65\x76\x74\xda\x71\xbf\x56\x42\x4f\xac\x4e\xfa\xda\xaf\x17\xb3\x7e\xd0\xbe\x73\xd3\x96\xd1\xf2\x37\xe1\xcc\x84\x27\x26\x7c\xdc\xdf\xac\xe5\x1b\x9b\xf8\xaf\x26\x3e\xcb\x3d\xab\x62\xb8\x45\x3c\x2d\x7e\x12\x0d\x04\x0f\x75\xf6\x97\x2d\xeb\x73\x5a\x85\x82\x2b\xe3\x55\xed\x3b\x8f\x2b\x28\x72\xd7\xa9\xe9\xf6\xdf\x0e\x6d\xe1\x53\x61\x91\xea\xf4\xde\xce\xe5\xb9\x96\x18\x5d\x74\xf8\x1d\xda\x52\x3a\xaf\xb9\xcd\xae\x1b\x36\x3a\x15\x0b\xe2\x75\xd8\xfe\xf3\x1a\x8f\xd6\x09\x47\xa3\x45\xe2\xa5\xee\x74\xad\xc3\xee\x66\xcb\x31\x1f\x56\x62\xf2\xfd\x95\x3c\x7b\xcb\x31\x62\x25\xcf\xed\x4a\x9e\xce\x6a\xa9\xb8\x1e\xf3\xae\xf3\x96\x6f\x55\x6b\x1f\xec\xb5\x0b\x08\xe7\xbe\x3e\xf5\xd4\x73\xa7\x97\x47\xfd\xe7\x93\x7e\xa4\xdc\xc9\x01\x2d\x63\xdc\xd7\xc5\x82\x3e\xfd\x5a\xbe\x85\x1d\x7b\x76\x91\xdb\xe1\xbf\x1d\xb2\xe3\x49\xa3\xe1\xc4\xc6\x28\xde\x79\xc2\xd2\x9c\xcc\xe7\x8e\x60\xd8\x3a\x2b\xab\x60\xf9\xe4\x41\x0d\x7b\xe1\x49\xcf\xa0\xab\xce\x4b\x2b\x45\x8f\xfb\x7f\x51\x54\x4c\x79\x25\x2f\x29\x60\x38\x5a\x82\x21\x33\x30\x3c\xfd\x02\x0c\x59\x1d\x86\xaf\xfd\xbf\x28\x5a\x81\xe1\x6b\xbf\xe6\x8d\xe4\x43\x81\xae\x77\xeb\xbd\x91\x5c\x18\x53\xad\x3f\x9c\x0f\x1d\x7a\xd7\x21\x5e\x87\x7f\x30\x76\xbf\xaa\xe8\x56\x3f\xaa\x9d\xde\x3b\xe4\x27\x74\xc1\x50\xf2\xc2\xb8\x9c\xe0\xaf\x53\x17\x88\xf9\xcc\x05\xa2\xbd\x17\xb9\x2d\x9a\x29\xb7\xb5\x20\xcb\x38\x5c\x31\xc5\x75\x51\xb9\xed\x9d\x22\x79\x9d\x15\x10\xbf\xee\x45\xae\xdc\x34\x21\x36\x85\xca\x44\x11\x9c\xd1\xa9\x2b\xa1\x29\x83\x1c\xbd\x7d\x87\x2c\x56\x97\x46\xad\xf7\x4b\xc8\xbc\x6c\x07\xeb\x57\xfa\x1b\x92\x46\x43\x3a\x04\x57\x41\x6f\x7f\x15\xf5\xcd\x04\x79\xfa\x72\x76\x69\x30\x3d\xa1\x77\x80\x4a\x9b\xb7\x43\xed\x6e\xef\x78\x52\xcb\x0d\xfd\x2d\xba\xba\x17\xe1\x2b\xd6\xf3\xcc\x29\xd2\xc8\x26\x86\xa5\x36\x36\x9d\xe6\x9b\x11\x3e\x37\x1c\xf7\x37\x23\x2a\x8d\x81\x17\x45\x05\xbb\xf8\x4e\x68\x62\xae\x83\x63\x0c\x37\x05\x9b\x7c\xd7\x42\x52\xec\xe6\x3b\x9c\x71\x38\xe7\x6a\x3e\x6f\xfd\x19\x69\x2f\x52\x9c\xc7\xf3\x79\xeb\x73\x44\xe6\xf3\x0d\xc8\x42\xa0\x7e\x0e\x95\x1d\xf7\x79\xbc\x08\x35\xca\x97\x70\xce\x0a\x38\x33\x85\xb7\xf5\xd3\x12\xce\x19\xc0\x39\x45\x38\xd1\xc2\x7a\xbe\x19\x22\xc0\x5f\xfb\x9b\x61\x01\x67\x44\x05\xfb\x5e\x81\x53\x61\xb8\x29\xd8\xf8\x3b\xa1\x15\x20\x23\x00\x32\xb4\x40\x02\xc8\x9f\xc3\x02\x48\x7c\x03\xc8\x72\x0e\x95\x7d\xed\x73\x63\x82\x14\x0d\x9a\xd6\x24\x4f\xc5\xed\x2f\xaf\x14\x71\x6b\x56\x8a\xb8\xfd\xcf\xaf\x94\xfd\x09\x2e\x95\x2c\xc3\xb5\xb2\xfb\xd1\x6d\xd1\xbd\x8f\x7a\xad\xbc\xfb\x85\xc5\xf2\x0b\xad\xd2\x12\xc3\xf0\x77\xfb\xa3\x53\xfa\xb9\xbe\x10\x6c\xf7\x23\x2e\xb9\x02\xc9\x3e\xe2\xda\x2b\x90\x51\x98\xd9\xb0\xe9\xfb\x13\x5a\x96\xb4\x92\x4d\x5d\x26\xe4\xa8\x92\x65\xb3\x92\xa5\x78\x4c\x40\xf7\x16\x28\xbb\xeb\x01\xf2\x00\x1f\x59\xaf\x3a\xcb\x68\x09\x05\x41\xbc\xa8\x56\x9b\x65\x9b\x95\x64\xe2\x22\x1f\x8a\x0c\x21\x2f\xd9\x0d\xff\xcb\x63\xe0\x10\x16\xf7\xf8\x6b\xa6\xe2\xb1\x2b\xe8\xb8\x3f\x70\x43\xfa\xdc\x8b\xc6\x5d\x37\xa2\x5d\xd5\x4b\xba\x63\x57\x52\x2d\xc0\xfc\x75\x8f\xf6\x07\x22\xec\x8d\x67\x2e\xfb\xb8\x78\x9b\x6e\xd8\x29\x03\xea\x42\xab\xf8\xf1\x17\x14\xe0\x76\x48\xad\xad\xbf\x84\x56\xc8\x8b\x27\x81\x02\x84\x66\xf8\x6a\x80\xa3\x55\x96\xe7\x19\xba\x09\x21\x78\x62\x34\x81\xa6\x76\x5c\x02\xbd\x9e\xce\xb4\xe3\x12\x58\x4e\x65\x48\xbb\x09\x41\xfd\xb8\x0d\xce\xe3\x46\x23\xdc\x40\x63\xfb\xd6\xc8\xd4\xe4\xfb\x6f\x92\xbd\x6c\xe9\x35\x6f\x09\x4d\x5a\xac\xb6\x98\xe8\x17\x23\x24\x19\x31\xf1\xd4\x66\xfa\x39\x41\xbf\x69\x4e\xda\x54\xe4\xf7\x8f\x34\xe5\x6a\x33\xf9\xfd\x23\x55\x4d\x9e\xfc\xfe\x11\xc5\xba\x72\x9e\x7a\x12\x28\x82\x5a\x40\x13\x63\xd3\x84\xd0\xd4\xc1\x22\x0f\x1a\x4a\x0f\x4d\xe5\x3a\xb0\x29\x6c\xe5\xa2\x19\x42\xe5\xc2\x54\x1e\x72\xd5\x4c\x50\x69\x1c\xd6\xb1\xa0\x12\xd6\x71\xb8\xb4\x8e\x3b\x6c\xfb\xe3\x12\x01\x17\xda\x7f\xc8\x9a\x53\x84\x27\xb4\x0f\x91\xb5\x47\x88\xaa\x93\xe9\x5f\xa7\x09\xd2\xd2\x04\x69\x68\x42\x95\xed\xfa\x4f\xee\x9e\xa3\x50\xc0\x76\xc7\x12\x35\x1a\x4f\x86\x5a\x43\xe8\x28\x44\x55\xd1\x65\xde\xee\x7f\x4a\x20\xd6\x93\x85\xa3\x50\x58\xd2\x0e\x8d\x5a\x4e\x9a\x5d\x08\x5a\x83\x86\x2c\x6d\xbb\x75\xde\xf2\x7f\xb9\x7c\xce\x13\xba\x66\xdb\xac\xee\xa9\x5b\x9b\x4e\x05\xe2\xcd\x0a\xc4\xda\x9d\x48\x6d\xb3\xc4\xcd\xe7\xb8\xbf\x19\x7a\xb8\x97\x85\x9b\x4e\xb8\x09\x5f\xe4\x77\xe9\xe1\xb6\x16\x36\xa3\xdf\xa5\xb7\xb2\x79\xa1\xf9\xf2\xaf\xba\x5c\x56\x94\xcb\x4c\xb9\xaf\xb6\xdc\xff\x3d\x86\x86\x6f\x63\xe8\xe2\x87\x13\x6a\xa4\x0c\x01\x25\x97\xf8\xf7\x3a\x53\x82\xe7\xde\x2d\xa2\x47\x01\x98\x01\xdd\xfb\x82\x2d\xd0\xdd\x84\xdd\x57\x77\xaf\xd8\x87\xab\x5d\x2c\xa1\x8a\x7e\x0a\x55\xa4\xa1\x8a\x10\xaa\xea\x39\x63\x99\xed\xba\x1d\xd2\xe8\x97\xf0\xb5\x17\x3b\xb8\x6a\x22\x42\x5e\xa5\x03\xb3\x53\xe1\xb6\x5a\x7f\x0a\xf6\xdc\x55\x2a\xdb\x53\xd9\x58\x2f\x89\x08\xd0\xe1\x4f\x1e\xc1\xe1\xcf\x3c\x28\x79\xe8\x62\x04\x13\x7e\x8b\xe0\xfc\xa7\xb7\xa9\x22\xf7\x67\x1e\xb1\x97\xad\xd5\xcc\xbf\x9b\xcc\x35\x5e\x4d\x71\x27\x62\xc7\xfd\x66\x84\xa8\xf4\x91\xc6\x3c\x02\x5a\xab\x0b\x7c\xf4\x22\xe4\x9b\x36\x63\x2f\x42\x3a\xd9\x2c\x78\xa7\x10\xca\x7d\x85\x72\x19\x96\x53\x3c\x02\x02\x6a\xca\xd1\x48\xe3\x9a\xa2\x91\x46\xb1\x65\x5e\x06\x9a\xbe\x39\x15\xdc\x7f\xed\x8d\xf6\x73\x21\x33\x15\xb9\x4b\x26\x1a\xd8\xa5\xf3\x7c\xb0\x64\xc1\x5e\xcc\xe7\x46\x7c\xe0\x43\xcf\x11\x74\x67\x2c\x88\xb9\x40\xa1\x61\x3f\x1f\x8d\x87\x93\x70\xdc\x1f\xba\x1f\x3a\x0b\xfa\xab\x15\x57\xeb\xdb\x7d\xa3\x3e\x71\xfb\xeb\xf5\xad\x05\xf4\x62\xb6\xbe\xe2\xf0\x6f\x54\x5c\x03\x74\x2a\x08\x5d\xae\x4c\xfe\x6f\xa1\xbc\x7a\x03\xca\xe8\x76\x11\x54\x2e\x8f\x97\xd5\x65\xd9\xa5\x73\xda\x25\x1c\x9d\xf8\x15\x4e\xbc\x77\x45\x9e\xf7\xc7\xef\x27\x23\xf5\x5e\x4d\x07\x59\x7f\xa8\x86\xef\x9f\x7b\xe3\xee\x7b\xf1\x7e\xd0\x53\xda\x77\xf7\xff\x67\xe8\xaf\x5c\xbd\x98\xb8\x1d\x6a\x4d\x9b\xe5\x5b\x0a\x7b\xeb\x61\xae\x2b\x74\x60\xd6\xe7\x7e\xe0\xdd\x16\x4a\x39\x1d\xde\xc1\xa7\xbc\xa5\x3b\x0a\x4b\x49\x8c\xe1\x59\x26\xa9\x98\x08\xfa\x4f\xe2\x6d\xfd\x29\x70\xbf\xdf\xfa\xdd\x88\xbb\xcb\x4a\x9e\x0f\x63\x41\xd9\xc7\x4f\xc4\xdb\xfa\x2c\x91\x89\xdf\xfa\x5d\x5a\xa1\xb3\x32\x97\x9c\x08\xba\xc5\x3e\x01\x95\x3e\x2a\x22\xef\xc6\xe8\xce\xb1\x84\x58\x3d\xe3\xbd\x9d\x0e\xd3\x82\x5c\x14\x2e\xe7\xbd\x3b\xc7\x74\xa8\x26\x13\x27\xd8\xfe\xb3\x3d\x61\x17\x4f\x70\x15\x2b\x25\xb7\x75\x81\xa3\xf3\xca\x1d\x60\x88\xe1\xf2\x16\x30\xb2\xe9\x52\x1b\x0c\xc6\xb4\x30\xa0\x92\x6f\x98\x84\xad\x4d\x19\x34\x1a\x51\xe9\x0f\x6c\x23\x62\x62\x40\x43\x9d\xe1\x6b\xe4\x6f\x6d\x86\x41\xa1\x15\x8f\x19\x14\x64\x80\xda\x24\xbb\x74\x9e\x0e\x88\xbf\xbd\x1d\x78\xda\xbc\x41\x3b\xe4\x1b\x5b\xae\x36\x99\x80\xa3\xb7\x81\xa4\x1b\xa6\x57\x3d\xe3\x5d\x27\x72\x28\x77\xce\xcd\x69\x5d\x0e\x50\xf8\x89\x71\x83\xcd\x80\xc1\x30\xc3\x82\x32\x70\xea\xf9\x3d\x4a\x3e\x39\x06\x67\xec\x40\x52\x83\x39\x04\x3d\x1e\x2f\x56\xce\x3a\x6b\x06\x57\x92\x57\xc9\xc4\x8b\x53\xbe\x6c\xae\x9e\xf2\xdf\x2a\x76\x37\xab\x17\xfb\xf0\x6b\xc5\x3e\x2c\x15\xeb\xec\xfd\x52\xb1\xce\x5e\xb5\xd8\xbb\xce\xea\x6e\xb4\xa6\x64\x88\x62\x24\x7b\x98\x5e\x69\x72\xe5\xfe\xe0\xad\xa2\x22\x5e\x2e\x5a\x63\x15\x7f\x56\x34\xdf\x5f\x2e\xfa\xe1\x57\x01\xfe\xb0\x0a\xf0\xaf\xb6\x2a\x96\x5a\x85\x25\xf1\xe3\x27\xdb\x4c\xa1\x51\x82\x78\xbb\x8e\xf6\x75\x4e\x45\x95\xf8\xdd\x55\x89\x9f\x21\x5e\x86\x64\xf5\x2d\x91\x3a\xbd\xb7\xf4\xac\x20\x57\x2f\x48\xa1\x74\x7e\xed\xb4\xd4\xfb\x50\x90\xab\xf2\x06\x4c\xaf\x63\xc1\x64\xa3\x71\xe7\xfc\x58\xb7\x22\x1a\x8d\x75\x0b\xe3\x65\xdd\xc2\xe8\xd7\xd7\x85\x31\xb6\x7a\x6e\x57\x07\xbf\xb3\x34\x72\x3d\xe2\xbe\xac\x47\x5c\xe2\x9d\x9f\x9b\xd6\x25\xdd\xfa\xf4\x93\x05\xb3\x52\xc1\xdd\x6a\x05\xba\xfc\xfa\x75\xba\x52\x5e\xaf\xd3\x35\xe5\xdf\x5a\x0a\x2f\x6f\x2d\x85\x95\x3a\xde\xbd\xb5\x0e\x57\x80\xd0\xeb\x70\x5d\x27\xde\x58\x54\x2b\x40\xd8\x45\xf5\xd3\xf5\xb4\x52\xca\xae\xa7\x9f\x2e\xa5\x95\x52\x1f\xde\xea\xf0\xdb\x6b\x6a\x15\xde\xfd\x35\x75\x98\x99\xaf\x6f\xaf\x6b\x6a\xb0\xbb\x17\x02\x5e\x20\xba\xba\x5d\xe3\xe2\xe7\xbc\x78\x94\x10\x76\x25\x9d\xe4\x76\x25\x75\x63\xbb\x94\xa4\x36\xfd\x73\x76\xee\x28\xe2\x3d\x8d\x35\xc3\x6e\x52\xac\x46\x71\x9f\xc7\xf6\x0b\xf2\x9b\x54\x53\xfb\xad\x03\x9c\xbd\xba\xa5\x93\x31\x1c\x82\x95\x39\x04\xef\x54\x7b\xf2\x5d\xd7\xcb\x4e\x72\xe2\xa9\x5b\xa6\xd8\x8e\x3d\x1b\x60\xb7\xcf\x1f\x45\x0d\x59\x76\x84\xdd\x8b\x8c\x6b\x8c\x0f\x01\x9b\xca\x35\x83\x7e\x51\x2d\xa8\x5f\x26\x2e\x7f\xb1\x2e\x33\x0c\xf8\x58\x1a\x1e\xd1\xd7\xb1\x18\x26\x6a\x7c\xb4\xe7\x62\x8e\x17\x45\xa7\xae\xc9\xab\xcf\xdf\xe6\x7b\xa6\x31\xe6\x6a\xa9\x95\x6a\x6d\xbd\xa9\xf8\x7b\xd5\xbd\xeb\xb0\xef\x4b\xf5\x69\xde\xe3\xd7\x6b\xa9\x75\xa7\x3b\x2d\x4f\xef\x67\x7d\x58\x20\x12\xfb\xed\xab\xc7\x00\xa1\xff\xfa\x13\xe8\x93\xd1\xdf\x1d\x8b\xdb\xa5\xda\xc4\xff\x14\xee\xf3\x23\x2a\x4a\xb0\x35\x65\xf0\x3a\xec\xdb\x4f\xa0\x15\x07\x7f\x17\xda\x1f\xff\xbb\x91\xa6\xe5\x79\x52\x47\x96\xe1\x7a\x67\xc4\x71\x75\x0e\x6e\xf7\xea\x73\xf0\xae\xc3\x4e\xff\x53\xc3\xb6\x3f\x16\xd5\x71\xd3\x64\xdd\xeb\xb0\xb3\xff\x54\x03\xe9\x41\xb5\x7e\xbd\xed\x78\x1d\x76\xf2\x9f\xaa\x7f\xaf\xde\x81\x0f\xb6\x81\x9b\x75\x13\x7f\xd6\x07\xda\xfd\xeb\xf3\x65\xae\xa7\x74\xcc\x7e\x24\x16\xf5\xa5\xd0\x79\xa3\x8d\x0f\x7b\xff\xa9\x36\xde\x75\xd8\xf5\x1b\x8d\x88\xff\x60\x47\x8e\xd6\xb5\x71\x2a\xb4\x45\x5e\x54\xd0\x64\xf1\x7d\x8d\x82\xb6\xb0\xdc\x71\x9d\x84\x2e\x91\x4b\xad\x00\x5a\xaf\x0b\xd9\xad\xd5\x8a\xbe\xac\x5d\x58\x7a\x2b\xf2\x2a\x75\xb2\xc9\x2d\xaf\x04\xfd\x87\x30\xb0\x8a\x5e\x05\x98\x37\xcb\x0a\xc8\x4b\x66\xea\xe1\x78\x79\x5e\x00\xfa\x63\x1a\x50\x69\x5c\x04\x4e\xc6\x54\xb2\xaf\x2f\x9c\xef\x74\x09\xad\x00\xd9\x22\x08\xe4\x4b\xb4\x66\x94\xce\x59\x2a\x37\x50\x09\xd8\x56\x59\x18\x79\xd1\x10\xdd\x5d\xd0\x7a\x7f\xf5\xb4\x6e\x47\x62\xe5\x7e\xf3\x67\x75\xa1\x70\x4f\xa5\xa2\x8f\x9f\x0c\x54\x72\xf8\x73\xa8\xc4\x99\x35\x9e\xac\xa1\x59\xd7\xb3\x70\xa9\x0e\x7d\x23\x51\x81\xe1\x70\xb7\x0e\xd3\xe1\x2e\x6f\x95\x53\x8b\x11\x4d\xdd\xdd\xc3\xbe\xf0\x6a\x0d\xa0\x63\x26\x21\xd6\x5e\x2f\x5b\x30\xeb\x13\xce\x76\x5f\xbc\x32\x47\xd4\xe3\x3c\xd6\x5e\x92\x7b\x07\xa4\x82\x4d\x03\x83\x99\x93\x70\x69\x80\xf1\xd2\xf4\x50\xd6\xc6\x77\x7d\x8b\xe2\xa7\x2d\x8a\x35\x2d\xae\x9b\x06\xed\x9d\xe9\xea\x5f\x3f\x9b\x86\x5a\xd5\x2b\xb3\x32\x09\xd7\xcd\x4a\xbc\x6e\x66\x5f\x22\x61\x28\x5c\x32\x5c\xc5\xa0\xed\x48\x38\x98\x18\xad\x2b\x6b\x48\x66\x3e\x13\xf4\xb5\x97\x47\xca\x50\x8b\xbb\x0b\xc3\xc9\xae\xa3\x02\x16\x66\xed\x19\x47\x09\x68\xdd\x75\xd6\x4f\x43\x25\x16\xdd\xeb\xd9\x25\xb9\xba\x00\x3a\x4c\xac\x81\xbe\xde\xd6\xa1\x14\x0e\x71\x9d\xf8\x56\xf3\x7a\x6b\x90\xff\x5d\x87\xdd\xfd\x8c\x70\xa0\x60\xb6\xae\x52\x4f\xe3\xd5\xbf\x1c\x51\x51\xf5\x0d\xb9\x5d\xee\x9e\xe0\xaf\xb9\x74\x2d\xbc\x03\xf3\x39\x09\x17\x85\xc9\x05\xe3\xbf\xcb\x8b\xb4\xd1\x74\xab\xfc\xdf\x5e\xa2\x25\x42\x9b\xfa\x77\x23\xf6\x21\x99\xcf\xd1\x90\x77\xe7\xd6\x11\xe6\xb5\xa2\xe8\xa1\x5c\xa6\x40\x2f\x28\x0c\x1f\x2e\x47\x77\x84\x4d\x23\x64\x69\x5d\x21\x96\x7f\x58\xe7\x63\x0d\x40\xff\x32\xf5\x36\xb7\x36\x50\x93\xde\xd6\xa8\x25\x24\x39\x3a\x17\x33\x1d\x7d\x09\x5d\xb9\x84\x89\x78\x64\x5f\x37\xe8\xc5\xcc\x2d\x2d\x66\x68\xc6\x34\xb9\xda\xd8\x1b\x64\xeb\x5d\x87\x1d\xfe\x64\xe6\x68\x39\x33\x34\x2a\xb0\x48\x59\x44\xb3\xc4\xfe\xcb\xd4\x93\xd6\x9c\x7a\xa3\xe1\x6c\x6e\x71\x2e\xda\x55\x00\x3e\x7c\xe3\xaf\x93\xd0\x55\x74\x70\xe3\x46\x8b\xe5\xd1\x8d\x68\xd1\x77\x45\x05\x41\x6d\x8b\x15\xd2\xd5\x1d\xae\x90\x2e\xe3\xdf\xc9\x80\x40\x5e\x8d\x45\xde\x62\x82\x8d\x59\xde\x0f\xfb\xee\x5b\x0b\xc2\x5b\xbb\x7e\xaa\x56\x67\xe3\x63\xf7\x2f\xf3\xa8\x5a\x03\xe5\x46\xbd\x58\x22\x87\xf8\x6e\xae\x97\xd4\x07\xa4\x1d\xef\x3a\xac\xf7\xbf\xe9\x96\xc5\x8e\x9f\x02\x8c\x3b\x7d\x1d\xda\x75\xfc\x01\x5d\xe5\x0f\xaa\xf0\xff\x51\xef\x80\x10\x96\xfa\xed\xbf\xc1\xb2\x58\x37\x24\xba\x1f\xb7\xcf\x6b\x98\x8d\x83\xc7\x55\xd2\x53\x2d\xb9\xcc\xa3\x7c\x34\xe5\xf6\x7e\x52\xce\xef\xbf\x04\x86\xca\x57\xa3\x1c\xb2\xae\xa2\xfa\x49\xdd\x32\x74\x78\x32\x2f\xcf\xe5\xf1\xad\x3e\xb0\xd7\x07\x54\xd4\xd0\x09\x47\xab\xbc\x7b\x06\x74\xb6\x6e\x77\xb8\x60\xe7\x86\x76\xd5\x0d\x02\x4a\x82\x92\x33\xbe\x0c\x58\x22\x18\xbe\x0c\x08\x28\xad\x55\x34\xe3\xfe\xd0\x91\xbc\xe5\xc9\xcf\x82\x4d\x8c\xa6\x88\x2e\x31\x49\x57\x8b\x58\x7d\x1d\x3f\x0c\x16\x70\x2a\xb9\x5d\xbd\xe0\xaf\x8a\x93\x02\x60\xdf\x8a\xd3\x3c\x15\xf4\xd6\x09\xad\x80\xb1\x91\x1f\x15\x4e\x67\x68\x2e\x91\xcf\x1f\x05\x84\x6f\x6d\xf8\x42\x87\xef\x6c\xf8\x52\x87\x3f\xd8\xf0\x95\x0e\xff\xb0\xe1\xef\x3a\xfc\xdd\x86\xbf\xea\xb0\x1a\x99\xf0\xad\x0e\x5f\xda\xf4\x6f\x3a\x1c\xdb\xf4\x1f\x3a\x7c\x63\xd3\x4f\x75\xf8\xca\x86\xcf\x74\xf8\xda\x86\x4f\x74\x38\xb2\xe5\x6f\x74\x58\xda\x70\x47\x87\x43\x1b\xbe\xd6\xe1\x53\x5b\xfe\x48\x87\xcf\x6c\xf8\x58\x87\x4f\x6c\xf8\x8b\x0e\x3f\x3c\x9b\xf0\x4b\x84\xe1\xdc\x86\xb7\x75\x38\xb3\x61\x39\xc4\xf0\xa3\x0d\x87\x3a\x7c\x3b\x33\x61\x25\xf4\x78\xd9\xf0\xa1\xc4\x70\xc7\x86\xaf\xfe\x05\xc1\xd4\x06\x63\x5d\x3c\xb3\xe1\x44\x87\xef\x67\x82\x1a\x89\x58\x1d\x11\x8e\x4d\x86\x0f\x66\x3c\x6c\x58\xe8\x74\x69\xc3\x77\x3a\xfd\xfc\xd1\xb6\xff\x01\x82\x17\x36\x28\x34\x78\x67\x45\xb2\xc9\xbe\x6d\xc2\x5d\x5d\xdd\x85\x0d\xf7\x74\xf8\xd9\xe6\xdf\xd7\xf9\xa7\x36\x7c\xa0\xc3\x4f\x36\xbc\xf7\x28\xaa\xcb\x4d\x9c\x89\x9a\xff\x39\xcd\x3e\x84\x7a\xa1\x74\x12\xab\xdc\x15\xda\x6d\x49\x71\x93\x36\x19\x7b\x21\xf2\x02\x83\x23\xe0\x05\x84\xdd\x5d\x14\x8d\x88\x2b\x97\x22\xaa\x92\x63\x09\x2e\xf0\xef\x93\xaa\xaf\x50\x3d\x71\xdd\xca\x7b\x5a\x26\xf9\x55\xa2\x3f\x3b\x46\x57\xeb\xc2\xbc\x73\xdb\xdd\x52\xff\x6c\x7f\xaa\x94\x7a\x38\x29\xee\xb8\xbf\x19\x55\xa0\x5b\xc3\xec\x8e\x9e\x2d\x63\x5f\xc9\x7f\xa2\xbd\x12\x5c\x8d\x75\xf0\xb0\x92\xd4\xd5\xf6\xba\x3b\x1d\x43\xf3\x35\xae\xe6\x56\x80\x25\xb9\xa5\xdf\x27\xc4\xeb\xf0\x64\xdd\xdd\x9d\x6e\xb1\xeb\x10\xef\xb9\x72\x8b\x97\xac\xb9\xc5\x33\x7d\xee\xb0\x9b\x6f\x2b\x8a\x2f\x15\xab\x82\x76\x80\x70\xb8\xbb\x28\x0a\x70\xf3\xcd\xbf\x0c\xed\x10\x0e\x93\xc9\x83\xca\xc7\x23\xe3\xdb\x15\x73\xde\x1f\xa2\x8b\xf1\x9a\x97\x50\x74\x33\x7e\x79\x53\x89\xc1\x6d\xf1\xfc\x66\x4d\xe3\xda\xea\xd8\xdb\x00\x9c\xdf\xac\x05\x00\x5a\xa8\x79\xbd\x6b\xd1\x44\xef\x23\x5b\x6b\x54\x7b\xde\xae\x7e\x6f\xeb\xcd\xea\x1f\x4a\x33\xd1\x78\x81\x7d\xb2\xde\xf8\xcf\x9a\x4a\xf3\x93\x37\x2b\xfd\x72\xad\xef\x98\xbd\x0e\x3b\x8d\xd6\x40\x6a\x6b\x13\x46\x13\xb4\x60\x31\x7b\x23\xc1\xa5\xd5\x0f\x0d\x6d\x6c\x26\x79\x61\x8b\xb9\x30\x2d\xb9\xfd\x89\x6b\x90\x1f\x92\xa5\x7b\x20\xbd\x89\xfa\x13\x34\x24\xd5\xbd\xb5\x05\xfe\xfd\xef\xc1\xb0\x3f\xee\xff\xfb\xdf\xed\xa5\x30\xc7\xfe\xd0\x7d\xc3\xc8\x75\x6f\x35\x47\x01\x15\x14\x0b\x0b\x4b\x0c\x05\x31\x48\x71\x1a\x39\x83\x23\xe4\x42\xc5\x63\x55\xb0\xbe\x2a\xa0\xff\x90\x08\x07\xad\x14\x58\x6b\x8e\x7c\x70\x44\xbc\xef\x13\xff\x6b\xe0\xcb\x61\xb0\x2c\x9d\x42\x00\x79\x1e\x1e\xd6\x8c\x56\xde\x77\xf6\x76\x88\x17\xf2\xd0\x18\x44\x3e\xe8\x3b\xbb\x7d\x07\x35\x7b\x2d\xf7\x19\x12\x2f\xaa\x7c\xf7\xa7\x4e\x48\xd1\x6e\x99\xf1\xaf\x9f\x49\xe2\x85\x6c\xdc\x55\x0f\x40\x75\xf0\xd7\xa4\x6c\x7f\xb2\x24\x63\x83\x5f\x34\x1a\xea\x4c\x38\x61\xa9\x46\x08\xb1\x83\xa3\x46\xe3\x4b\xee\x84\x6c\xa8\x9e\xd4\x70\xa4\x76\xc5\x58\x25\xfd\x61\x4f\x8d\x88\x15\x3a\x31\x26\xd2\xf8\xf7\x6e\x5b\x8c\x5d\x79\xe8\x85\xbe\x0a\x78\x68\x2d\x59\x8f\x9e\x1d\xf8\xa6\x9b\x5b\xc4\x2b\x7c\x24\xac\xd4\xb6\x88\x75\xdb\xa3\x31\x7b\x08\x1d\x3b\xe2\xc6\xfc\x82\x95\x44\x38\xd8\x25\xde\x4d\xcf\x19\xdc\x3b\x92\x7d\x71\x08\x59\x77\x49\x23\xd9\xc3\xd0\x11\x84\x73\x79\x84\x77\x35\x21\xeb\x8d\xf6\x7a\x71\xcc\x37\xec\x8d\xc3\xf0\x99\x4b\x74\xbc\xbb\xc1\xaf\xda\x5b\x6e\xcb\x08\x8e\xf5\xb8\x64\x27\x0e\xf1\x92\x33\x6b\x30\x14\x09\x78\x6f\x74\x39\x16\x61\xaa\xa2\x46\x23\xd4\xa2\xf0\xc5\x07\x93\x62\xa4\xb2\x5e\xae\x56\x44\x25\x46\x6a\xfc\x5e\xbc\xcf\xfb\xf9\xe6\x8b\x1a\xf6\xdf\x43\xbe\x4d\xc8\x08\xfc\xd1\x7b\xf1\x7e\xa4\x6b\x2c\x24\x27\xde\x69\x4d\xda\x62\x6e\xfc\xc0\x4b\x7b\xe8\x0d\xc4\x89\x39\x1a\xc6\x2c\x15\x71\xb5\x1f\x91\x96\x97\xa0\x03\x2f\xf4\xc1\xa2\xe5\x27\x01\xdc\x7e\xcf\x89\xfd\x24\x20\x24\xe5\x0f\x5f\x85\xfe\x2e\x8c\x75\xe4\x65\x22\xfc\x7a\x86\x2d\x36\x90\x5f\x41\xd3\xef\x47\xdd\xfe\x24\x8b\xde\x4b\xf5\x5e\xbc\x47\x60\xde\xe7\xe2\x41\xbd\x07\xa8\xf3\xf7\x7d\xad\x5f\xf1\xbe\x2f\xef\x55\x38\x66\xff\x1f\xf1\x50\x29\x2c\x25\x8b\x90\x87\xfe\x97\xc0\x1f\x28\xe0\x58\x6f\x8e\x84\xaf\xc5\x0a\x76\x03\x47\x07\x4c\xce\xce\x51\xb1\x47\xe1\xa6\xb0\x93\x3b\xaa\xdc\xb4\x3e\x14\xc2\x16\xa7\x5d\xba\x53\x71\x7b\x79\xc1\x7b\x7d\x8b\x12\x86\x37\xb1\x0e\x31\x05\xbf\x5f\x4d\xd2\xbe\xc8\xcf\x53\x23\x39\x67\x1c\x79\xc1\xc9\xbd\x22\xd0\x71\x76\xa0\xb1\xcb\x6c\x6e\x66\x41\xdc\x0a\x96\xa7\x64\x3c\x9c\xbd\xda\x4d\x0f\x8d\x21\x7e\x2b\xda\x08\xa9\x00\x62\x1f\x0a\x38\xdb\x64\xb0\xda\xf5\xf8\x5d\x0e\x04\xf1\x2a\x27\x8d\x5b\xe1\xef\x6c\x07\x4e\x58\xec\xca\xa7\xd6\x4d\xbd\x13\x99\x98\x31\x7f\x67\xde\xb1\x6e\x05\xbb\x7b\x74\x6e\xcd\x43\xf8\x50\xf3\xb2\xd4\x1c\xb5\x66\xc3\xb7\x64\x7a\x05\xbb\x47\x4b\x30\x45\x30\xdb\x76\x08\x0d\xed\xbe\xdd\x76\xcc\x46\xff\x2d\x61\xc7\x9f\x2c\x93\xeb\x10\xe2\x86\xf6\x86\xa3\x14\xfb\x65\x92\x1a\xad\xf1\x1b\xd3\xd9\x31\x8d\xe8\xad\x23\xd8\x45\x4c\xed\xf5\x43\x39\x94\x6c\xe7\x05\xdd\x53\x43\x97\xee\x50\x2c\xcd\x74\x92\x9a\x5e\xdc\x0f\x4c\x2f\x54\xb9\x77\x1f\x92\x82\x3d\x50\xcf\xef\xd5\xad\xa3\x8a\x52\x66\x6f\x37\xac\x59\x6c\x6b\xc9\x7a\x18\x83\xe6\xa2\x63\x52\x67\x63\xce\x6f\x8c\xa9\xca\xd5\x89\xa6\xaf\x42\xba\x8a\x65\x29\x8d\xfb\xf9\xf8\xb2\xf7\xa2\x5c\xc5\x06\x0f\x0b\xaa\xd8\xee\x0b\x55\x2c\xea\x51\x85\xe6\xa5\x0d\x67\x1d\xb7\xcd\x2f\x1b\x29\xf7\xa9\xdf\x8b\xde\xb7\x0a\xf9\x9d\x87\x93\x25\x35\x47\xb4\x35\xa3\x0b\x84\xf7\x8e\xf5\x02\x1f\xdd\x97\x32\x1d\x64\x85\x89\xb2\x2c\x57\x7e\xe2\x48\xc0\x08\x47\x72\x79\x0c\xa3\xd6\xa2\x37\x87\x84\xa0\x61\x67\xcd\x05\x2a\x96\xca\xf6\x3b\x73\x6a\xd6\xd7\x1f\x11\x7f\xea\x59\x71\x55\x98\x3f\x6a\xf9\xb2\xd7\xf0\x59\xb8\x21\x3d\xfa\xe4\x2a\x2a\xba\x42\xef\xbe\xa7\xc2\x09\xa9\x22\xf4\xf8\x93\x1b\xd2\xd1\x58\x0c\xc7\x57\xbd\x07\xe5\x46\x54\xe5\x91\xfe\x6a\x4a\xbf\xb7\x1d\xd0\xaf\x9f\xdc\x16\x1d\xf7\x1e\xd4\x10\x0b\xde\x8c\x9d\xad\x16\xa1\x1f\x12\xe1\x4a\xf6\xf2\x89\x9e\xdd\xb8\x92\x9d\xdd\xd0\x2f\x9f\x50\x8e\x02\xdb\x3c\xfb\xe4\x10\x6a\x4f\x60\xdf\x12\x86\xa5\xe9\xcd\xc8\x4e\xd7\xd9\x27\x33\x00\xb4\x96\xc3\x9f\x05\x16\xea\x73\xae\xec\xf5\xdf\x39\x57\xb4\x6b\x69\x2d\xed\xd9\x2f\x02\x67\xd4\x03\x94\xe1\x82\x0f\x87\x58\xc1\x88\x71\xa3\x71\x0b\x3c\xf6\x85\xd9\xab\xd9\x98\xd4\x5f\x52\xbf\x59\xee\xf2\xd0\x9c\x85\x3b\xec\xfa\x69\x89\xa3\x29\xb7\x36\xbd\x25\x9b\x4d\xa3\x77\x6b\x85\x8e\xeb\x74\x3c\xec\x3f\x0c\x26\x63\xf5\x3e\xea\xc5\x31\xd2\x6e\x28\xac\xc9\xf6\xfb\xf1\x6c\xa0\x80\x06\x56\xa5\xb7\x4c\x3d\xe6\x10\xa0\x9d\x97\xa3\x68\xfc\x89\x43\x50\x9e\xfe\x8b\x71\xea\x6e\xb6\x1f\x2f\x86\x79\x3f\x4c\x1c\x1d\x43\xd1\x8d\x79\x8b\x94\xf4\x3e\xe1\x31\x7a\x85\x4f\x79\xe2\xa5\x9f\x95\xd7\x6c\xa6\x04\x0b\x18\xfd\x56\xb6\xe7\xa4\xc4\x78\xe3\x16\xda\x6f\x37\x1d\xf6\x33\xe5\xc2\xee\x47\x2b\x39\x65\x35\xa7\xac\xe6\x4c\x47\xe8\xa1\x27\xdc\x01\xc2\xb4\x64\x86\xd0\x6b\x36\x33\xf2\x6a\x2c\x69\xc7\x68\x77\x45\xfa\x47\x81\x93\xd1\x16\xd4\x1e\x86\xf0\x85\xae\x29\x4b\xed\xfe\xa4\x06\xec\xab\x36\xe9\x2c\x74\xa9\x14\x5b\x82\x52\x39\x1d\x10\x2f\x6f\xf2\x2d\x6f\x60\xab\x5c\x93\xb8\x58\x14\x26\xb9\xca\x41\x0e\xed\x51\xcb\xdc\x30\xc9\xd2\x95\xd5\xe5\xa1\x2b\x80\x3f\x3b\x49\xe8\xe5\x21\xbd\x4a\x88\x17\x4a\x47\x9a\x97\xa4\xca\x65\xd2\x68\xaf\xc8\x37\xda\xfb\x49\xbe\xa3\x91\x28\x32\xee\xfc\x2c\xe3\xce\x5e\x35\xdf\xf7\xee\x5b\xf9\xee\x8e\x74\xbe\xbb\xa3\xb7\x72\x0c\x4c\x8e\xc1\x11\xa1\x65\x8e\xc2\x8c\xa0\xec\x7a\x21\x07\x5e\xad\xb0\x90\x6a\x2e\x98\xfd\x2f\xc1\x7c\x7e\xe1\x45\x3a\xd1\xe8\x44\xe3\x0e\x17\x36\x1a\x1b\x51\xc9\xa2\x5c\xe7\xa3\x81\x0a\x7b\x71\xcf\x32\x20\x05\x26\x03\xbf\xd3\x68\x44\xa8\xaf\x51\x29\x70\x94\xc3\x32\x10\xe3\x9e\xcc\x54\xa5\xc4\x08\x8a\x20\x84\xe1\x7c\x1e\x55\xed\xe7\x44\x76\x82\x7a\xb1\xa3\xb9\xdf\x93\xa4\x62\x72\x70\x24\xde\xe8\x02\x1b\x29\x60\x05\xaf\x66\x03\xb5\xbe\x2b\x7f\x09\x5d\xa4\x62\x31\xc9\x80\xff\x82\x8a\x4a\x30\xab\x55\x03\x27\x1d\x55\xad\xe9\x01\xd7\x8b\x57\x65\xa8\x6c\xc9\xcd\xaf\xf6\x38\xad\x19\x3d\x6e\x7e\x0b\xcf\x2c\xd2\xe6\x42\xa1\x4c\x4c\x33\x6a\xe8\x85\xc3\xed\x12\x29\xef\x8e\xdc\x88\xd7\x6e\x5e\x4f\x12\x57\x30\xfd\xf8\x6a\xaa\x2f\x03\x68\x0d\x28\xaa\x45\x2d\xe0\xdc\x73\x0f\xa4\xe5\xcb\x17\x1a\xd1\xa4\x4b\x28\x86\x66\x10\x52\x36\x74\x77\x48\x23\x7a\x77\x48\x88\x27\x6d\xf6\x9d\x67\x38\x47\xdc\x1d\x9a\x1c\xfb\xdb\x10\xbc\x3e\x86\xb3\x43\xa3\x81\x51\xb7\xc7\x34\x84\x18\x4f\xb0\xd1\x43\xbf\x3f\xee\x7e\xeb\xe5\xaa\xd1\xd8\xd0\x06\x86\x26\xc3\x27\x05\x43\xa6\xb5\xd9\x8a\x20\x4c\xa7\x87\xc5\x9f\x9e\x05\x15\xf4\xfa\xd0\x04\x4f\x67\x10\x3c\x39\x42\x1b\x7c\x56\x66\x9e\x57\xbe\xb5\xff\x16\xc8\xda\x1f\x0a\x5a\x49\xa0\x2f\x7b\x55\x0c\x8a\xf5\x94\xa4\x90\x73\x77\x5b\xd0\x9b\x63\xda\x39\x26\x1e\x86\x87\xcf\x82\xf6\x9f\x05\x3d\x3d\x24\x5e\x76\x6b\x75\x64\x4b\x0a\x24\xdf\xf7\xf2\xf7\x18\xab\x46\xc4\x66\x50\x23\x5f\x06\x26\xff\x53\x99\xdf\xe4\x7d\x2a\xf3\x3e\x15\x79\x61\x8e\xc7\xfd\x7e\x36\xee\x0d\x8c\x23\x3d\x2d\x33\x8c\x2e\xc0\x4d\x02\x9c\x57\x11\xa8\xcb\x6d\x41\xcf\xb6\x05\xbd\xda\x16\x66\x2c\xae\x70\xb0\xbf\x1f\x9b\xe0\x77\x3d\xf6\x23\x13\xbc\xc6\x60\xb4\x23\x00\x37\xc7\xc3\x5e\x92\xa8\x21\xe7\xbb\x4f\x02\x9f\x86\x6c\xc4\xd7\x44\x83\x91\xa9\x44\xe5\x91\x57\x5c\xb2\x4b\x62\xc0\xd0\x09\xd6\x3e\x1e\x6c\x6e\xb3\x81\xea\xc7\xef\x25\xe7\xfb\x5d\xbb\xe4\xa4\x07\xb9\xbd\x4a\xee\x1d\x2d\xaa\xbb\xd0\x93\x76\x68\xe0\x84\x96\x44\xde\x7b\xd0\x77\xb3\xa6\xa5\xb6\xed\x71\x91\xc2\x25\x71\xcb\x66\xae\x70\x19\x6f\xed\xff\xe3\x37\x49\x57\x73\x52\xc9\xa2\xc9\x50\x07\x42\xd3\xf5\xaf\x8f\xd0\xf5\xd3\xb1\xa8\x4e\x78\x76\x5b\x79\x45\x40\x0b\xa5\x38\xac\x93\x6d\x41\x9f\xb6\x05\x82\xb7\x8c\x0c\x82\x25\xc3\x5e\x04\xa7\x2a\x58\x40\xc5\x77\x6d\x8d\x16\xb1\xb8\x4e\xf3\xc9\x83\x54\xc3\xb3\xf8\x52\x61\xa3\x23\x6f\x03\x4d\xf6\xdd\xce\x02\x6d\x1d\x2b\x04\x56\x43\xf7\x2c\xd4\x3d\x93\x2c\xec\x4f\xf2\x31\x0f\x9b\x5b\x28\x22\x50\x54\xb8\xdb\xcf\xfa\x43\x53\xfe\xc0\x14\x17\xa4\xd1\xf8\x21\x90\xc1\xab\x58\x9b\x4c\x6f\x2b\x0e\x90\xfc\xff\x9f\xba\x37\x6d\x6a\x63\x77\x16\x87\xdf\xe7\x53\x00\x97\xeb\x23\x61\x59\x8c\xc9\x21\xe7\x9c\x99\x28\x14\xfb\x12\x0c\x01\x12\x30\xb8\xa6\x6e\x69\x56\x1b\xdb\x63\xe3\x0d\xdb\xe0\xef\xfe\x54\xb7\xa4\x99\xf1\x42\xce\xef\xf7\xbc\xfb\x57\x52\x58\xd3\x92\x5a\xdd\x5a\x5b\x52\xab\x3b\x70\x05\xfc\x41\x22\x03\x0c\xaa\x4a\xf1\x58\xc0\x4e\x8e\x75\x0d\xf9\x2c\x60\x57\x27\x39\x65\xd2\xe7\x1c\x0e\x28\x08\xfa\xa7\x1a\xa4\x7e\x2d\x40\x83\x83\xbe\xc2\xec\xb9\x74\xf6\xc0\xfb\xf5\xa5\x33\x34\x90\x1b\x73\x3b\x5b\x23\x91\x57\x25\x75\xb4\x7e\x5c\xfe\x30\x33\x56\xc3\x0f\xdf\xe7\x9d\xa2\xab\xb4\x53\xd8\x16\xa5\x5a\xe9\xa7\xdc\xf3\x1c\x8f\x6f\xf6\x45\x20\x1d\x8f\x47\x41\xed\xe1\xc5\x25\x74\xf6\x3a\x80\x0c\x88\x5e\xf2\xf3\x04\x71\x4b\x5e\x49\xe8\xec\xd3\x03\x0f\x9e\x97\x74\x04\xd6\xc5\xa2\xfc\x1d\x64\x12\x75\xbb\xa2\x4d\xcd\x66\x74\x3d\xcf\x1f\xb2\x82\x7c\x35\xbd\x76\xfc\xda\xcb\xc4\x25\x5e\x36\x03\xf8\xe2\xe2\x9a\xf8\x94\x05\x62\xbd\xcc\x94\xb1\x23\x3f\x35\x73\xa4\xb7\xda\xca\x5c\x55\x64\x5c\x93\x47\x22\x42\xaf\xed\x31\xea\xd1\xff\x78\x29\x14\xd4\x2f\xec\x93\x61\x0d\x8d\xb5\xa4\xb8\x5e\xd6\x8e\x9f\x62\x3e\xf4\x59\x8b\x25\xfa\x64\xaa\xb9\xd7\xc2\x9c\xad\x5a\xd3\x45\x27\x75\x76\x82\xdf\xe8\x82\x1a\x31\xb4\x0a\x85\xf5\x24\xc3\xd2\x88\x48\xcc\xa7\xaf\x42\x74\x8e\xd4\xdb\xa0\x2c\x2a\xd0\x4e\x87\xd6\x49\xeb\xfd\x3d\xa1\xfc\x97\x9f\xc6\x19\x79\x68\xdd\x9a\x7d\x3a\x7c\x9d\x3b\x7c\x42\x2c\xcf\xe9\x65\x2c\x35\xad\x65\x6e\x6f\x94\xcc\x8d\x0a\x05\xdd\xf3\x95\x35\x28\x57\xd5\xa0\xe5\x04\xaa\xf2\x72\x26\x65\xa1\xb3\x31\xb3\x0b\x83\x4a\x0a\x75\x35\x6a\xeb\x50\x86\x2d\x0f\x6f\x4f\xd1\xdd\x52\xf7\xde\x0e\xd1\xf5\xbb\x76\x0d\x34\x9b\xe9\xfd\x1d\x59\xcf\x14\x41\xd0\xe6\x8c\xa6\x64\xf1\xe2\x79\xf3\x52\x98\x4d\x3f\x64\x2a\xa3\x05\xe2\x4f\x0f\xbc\xd5\xf8\xe8\x16\xb8\xff\x9a\xed\xef\x1f\x22\xde\xda\x25\x73\x9b\xcd\xfe\x2b\x9d\x7f\x6c\x2f\xf9\x4d\xc2\x70\x92\xf5\xe9\x5b\x60\xec\x20\x78\xfc\x67\x03\x3d\x01\x50\xc7\x9f\xdb\x76\x9b\xcf\x6c\xbb\xac\xb7\xd1\x55\xe2\xc3\x9e\xd9\x5f\xbd\x67\x36\x3b\x94\x1f\x46\x1b\xf6\x3c\xe1\xc9\xae\xde\xe2\x60\x98\xf8\xd4\x09\xc4\x81\xb6\xf2\xf5\x10\xb1\x54\x31\xc2\xbc\x3e\x31\x59\x6f\x7c\xee\x55\x74\xc3\xd2\xfc\x23\xfe\x1b\xdf\x6c\xe6\x7f\x38\x3e\x1f\xa0\xc1\x52\x9f\x0f\x5e\xe1\xf7\xf8\x02\x37\x88\xca\x79\xec\x09\x57\x27\x72\x87\x9d\x64\x10\x26\x83\x3e\xb6\xc6\x09\xa6\x08\x18\x44\xbf\x0e\x54\xb2\xa8\x35\xc4\x63\xf8\xac\xaa\xd4\x01\x3e\xea\x42\xcc\x51\xab\x8a\xcd\x48\x5e\x4d\x16\x6c\x82\x9a\xe4\xad\x85\xf6\x98\xd8\x91\x54\xbf\x87\xfa\xd7\xeb\xaa\xdf\xe3\x86\xfa\x8d\xd4\xef\x8c\x3a\xde\x1d\x09\xd8\xa7\x88\x16\x0a\xde\x1d\xf1\xf9\xf5\x0b\x8b\xe8\x1e\x99\x26\x24\xe0\x87\x92\x01\x80\x1f\x4a\x8a\xbe\x47\x4f\xf8\x95\x4f\x7c\x7e\xf9\x62\xce\x29\x92\x1b\xb2\x43\x59\xe7\x86\x44\xcc\x62\x21\x3f\x44\x69\x44\x03\xca\x2c\x48\x01\x91\x88\x6a\x83\x29\xba\x8b\xe2\x17\xc7\x24\xa2\x94\x61\x01\xc7\x0d\x55\xc0\x71\x63\xae\x00\xef\xf5\x83\x02\x8e\x1b\x0b\x05\x18\x40\x56\xc0\x29\x56\x35\x94\xe0\xf3\xf6\x2e\x81\x56\x51\x65\x45\xba\xac\x08\xcb\x9a\xfe\x22\x3e\x1b\x8e\x25\xc5\xa7\x79\x51\x43\x97\xe7\x25\x2c\xe2\xd7\x21\x09\x61\x09\x62\x11\x3f\xac\x93\x10\x6d\x2e\xe2\xed\xd2\x09\xaf\x7b\x24\xac\x9d\xba\x2c\xc4\x97\x9c\x61\xad\xe7\xb2\xb0\xb6\xef\xb2\xc8\x34\x2d\xf3\x6b\xc1\xc4\x25\x21\xe2\xa6\x58\xa2\x08\xa8\xed\x73\xbf\x8b\xb4\xcc\xf4\x48\x49\x75\xe6\x50\x57\x6e\xa6\x0f\xd9\x79\x3d\xe2\x2f\xaf\xc4\x33\xe3\x89\xa5\x53\x8c\x09\xb5\xe8\xcc\x19\x8f\x3f\x36\x3e\xd3\x7f\xdd\xd3\xbf\x38\xf4\xeb\xfb\x2e\xa1\x76\xcd\x55\x23\xbb\x53\x5f\x65\x49\x7f\x71\xc1\xe8\xd4\x61\xc1\x50\x67\x36\xa8\x8a\xf6\x9f\xac\x32\xfe\xaa\x55\xe6\x81\x07\xc3\x76\xf7\xf7\x67\x6d\xa9\xed\x60\xbe\xd9\x95\x7b\x92\xf7\x64\x2d\x09\x5c\xfb\x3a\xb7\x46\xd5\xaf\x73\x0f\xb8\x0e\x1e\x88\x84\x41\x21\xf9\x0f\x26\x71\x38\x48\x18\xb5\x7e\x97\x00\x04\x0d\x9b\xf7\x5f\x85\xcc\xaa\x36\x3b\x49\xb8\x9e\x7b\x07\x66\xce\xfa\x7c\x15\x6e\xed\x93\xdc\x2a\x0b\x7f\x85\xe4\x47\x65\x5c\x6c\x95\x75\x49\x98\x11\x6e\x2a\x52\xa7\xb8\x4b\x43\x3f\x4d\x08\x96\xe4\xeb\xdd\x0f\xd8\xbd\x8c\x9d\xdc\x09\x94\x7a\xa8\x7f\xb6\x4b\x17\x8e\xa0\x7e\x08\xc9\xcf\x77\x57\x1d\xe2\xb0\xb9\x73\x99\x97\xbc\xd2\x94\xa7\x4e\xb3\x7c\x41\xbc\x92\xac\x75\xa7\x2e\xdd\x26\x92\xeb\xc3\x29\x0d\x81\x02\xcb\xdf\x94\xfd\x55\xaf\x24\xf9\xf7\xdd\xaf\xe5\xe3\xcf\xdb\xe6\x50\xe9\xfa\x5e\x2f\x88\xea\xbc\xd5\x17\x65\x06\xe4\xc1\xb2\x09\xf5\x23\xeb\x32\x6f\xf8\x93\x48\xbe\x19\x4b\xbc\x31\x91\xfc\x62\x57\xf8\x0e\x20\x34\xcf\x12\x54\x6b\xf8\xec\x6d\x36\x7f\x98\x54\x79\x91\xba\xfb\x2b\x2e\x95\xe2\xfd\x92\x5c\x75\x19\x17\x0a\xe4\x75\xe1\x44\x2c\x3b\xa1\xd3\x4f\xcb\x1f\x78\x73\x5e\x5d\x6d\x4e\x79\x70\xdf\x98\x2c\x53\x86\x22\x60\xc4\x0e\x3a\x5d\xd8\x21\x76\xba\xda\x5e\x84\x84\xb1\xab\x4d\x46\xc8\xda\xbe\xab\x54\x06\x87\xad\x55\x23\x24\xa7\x7c\x79\xe3\xef\xc1\x97\x4d\xcc\x13\x7a\x9f\x0f\x5b\x44\x52\xba\xf7\xdb\xb2\xfc\xc0\x2d\x61\x54\x5a\x62\xc5\x77\x4b\x98\x66\x66\x1b\xc3\x35\xcf\x1f\x0d\x95\x1f\x86\x9d\x0f\x1e\x4e\xdb\xfa\xb0\xb0\xa9\x4f\xec\x29\x8b\xc3\xc1\x8a\xf8\x61\x2b\x8b\xae\x5e\x76\x7c\xdc\x45\xd8\x55\xf2\xe3\x42\x2a\x53\x75\x12\xa3\x1e\x73\x51\x37\xf3\x51\x99\xb1\x32\xbb\x4a\x6e\xe7\xe3\xee\xf3\x71\x77\xf3\x71\x3f\x3a\x8d\x64\x70\x24\x07\xc3\xb6\x5d\x25\x3f\xb3\x38\x54\x99\x3b\x98\xb3\x86\x95\x9f\x95\x7e\x60\xa3\x34\x9b\x0b\x7a\xa3\x4a\x02\xf1\x72\x77\x44\x78\x84\x92\x74\x06\x6b\x41\x4f\xbe\x26\x7c\x43\x2d\x92\xf2\x83\x5b\x0b\xe6\x89\xbb\x66\x7a\x23\x56\xbb\xf3\x5c\xf2\x83\x32\x29\x7e\x5e\xe2\x56\x83\xa9\x7c\x27\xfa\x4b\xc9\x74\xd7\x97\xc4\x83\x18\x73\xe8\xec\xab\xa8\xdf\x2c\xd3\x12\x86\x81\x06\x66\xe6\xbc\xbd\xda\x93\xe7\xd6\x2c\x97\x0f\x3a\x47\x72\x20\x7f\xdd\x5e\x92\xef\xa3\x39\x91\xbc\x8d\x1b\xb7\xb8\xba\xa4\x85\x90\x3f\x5d\x9b\x3d\x92\x76\x95\xc5\xd5\x9c\x5d\xbf\xe4\xf7\xf9\x0e\x2f\x74\xbe\x64\x21\x5f\xe7\xf7\xf9\x6e\xd8\xcf\x98\x55\xa6\x12\xb2\x76\x16\xb2\x76\x7f\x9f\x55\x1d\x18\xce\x1e\x49\x77\x21\xdf\xcb\x6f\xf2\x3d\x9d\x43\x8e\x17\x95\xe3\x05\xaf\xc6\x97\xce\x9c\xe7\xcf\x98\x73\x75\xd7\xfb\x0d\xe2\x87\x23\x40\xdc\x5b\x20\xa5\xff\x7b\x16\xd4\xd1\xe3\xec\x91\xf4\x55\xbe\xfe\x7f\x46\x50\xb6\x0d\x1f\xfc\x1e\xbf\x7f\xac\xab\x68\xb0\x40\xd7\xf0\x5f\xe9\x52\xf9\x86\x2a\xdf\xf0\xbf\xac\xa8\xd1\xbf\x37\x3a\x60\x1f\x2d\x50\xf5\xfa\x9b\x6c\xcf\xa7\x19\x55\xaf\x0b\xf9\xc6\x98\xef\xe7\x20\xd5\x30\xd1\xf7\x75\x28\x47\xab\xa9\x3d\xa7\xe0\xf2\xda\x14\x6f\x9b\x03\x34\xfc\x88\xdf\x4f\x27\x6a\xd8\x6d\xea\xdf\x53\xf5\xa3\xd5\x68\xae\xe2\x39\xad\x9b\xf3\x67\xf5\x3b\xc8\x21\x4c\x4d\xca\xf9\xa7\x62\x57\xdf\x4e\xff\xdc\x15\x3a\xe4\x5f\x89\xb2\x0a\x05\x0f\x2a\x6f\xa8\x7f\xe3\x8a\x58\xd7\x51\xb7\x15\x05\xfa\xa5\x7f\xc3\x7b\xf5\x1b\xdd\xe7\x9f\xda\x47\x69\xfa\x30\xc8\xc1\x3b\xe2\xad\x27\x93\x38\x54\xb2\x77\xfb\x4a\xfd\x06\x75\x3d\xf5\x63\x9a\xef\xcf\xe2\xed\xb4\x69\xbf\xb5\x1b\x89\x6d\xb1\xb6\x1c\xdb\xd6\x8c\x29\x57\xd1\x73\x30\x9d\xbc\xf9\x90\xc3\x1f\xdf\xa7\xe5\xca\xa1\xd1\x03\x1a\x57\xd9\xcf\x81\xbe\x09\x9f\x54\xc5\x5b\xd7\x97\xf6\xd9\x19\xeb\xf8\xd2\x9e\x9c\xb1\xdb\x89\x3d\x8e\x67\x6c\x5a\x15\x6f\x2f\xbb\xf6\x06\x92\x77\x17\xb6\x42\x7f\xd0\xe9\x55\x1a\xc9\x99\x4c\x82\x56\xb8\xc1\xba\x4b\x71\x72\x6c\xe2\xfa\x2b\xf2\xdd\xf9\xbd\x30\x4c\x36\x58\x6f\x45\x3e\x1d\x37\x63\xcd\x6b\x29\xde\xae\x87\xd2\xbe\xee\xb1\x97\xa1\xb4\x0f\x7a\x6c\x34\x94\xf6\x59\x8f\xdd\x0e\xa5\xfd\xab\x37\x63\x2d\x48\x81\xee\x39\x1a\x07\xec\x30\xb4\xf9\xee\x8c\xb5\x01\x96\x1e\x6f\xda\x6f\xb0\xca\x56\x43\xb3\xa2\x9e\x1e\xcc\x58\x88\x6f\x98\xcf\x41\x50\x91\xfe\xa0\x31\x6a\x0c\x26\xf6\x7a\x99\xa9\x43\x3a\xfb\xad\xdb\xe9\x2b\x7f\xda\x37\x33\xa6\xcd\x17\x0e\xc2\xf1\xe0\x87\x01\xf7\x4f\x53\x73\x85\x73\xf0\x1b\x96\x1e\x7a\x19\xef\xb8\x37\xb3\xd9\x8c\x25\x0b\x04\xa1\x00\x50\x0d\xf5\xa2\xff\x5f\x12\xb4\xaa\x60\x20\x68\x15\xa1\x1f\x11\xb4\x5f\x15\x6f\xe8\x47\xc9\x36\x1e\x4e\xb4\xcf\x92\x9b\x7d\xf6\x09\x6b\x73\x1a\xce\x28\x93\xe7\xb6\x5e\x17\xcb\x16\x2b\x7f\xa1\xec\xb1\x25\xed\xcf\x33\xe7\x41\x8c\x51\x63\xec\x37\x4a\x38\x4f\x11\x49\xaf\xda\x8d\xe5\xd5\x67\x91\xfc\xd2\xb7\x6d\x73\xc3\x3a\x27\x35\x6d\x9e\x98\xb3\x87\xcd\x13\xf3\x3e\x55\xcb\x24\xe7\x2d\x2d\xb3\x68\x3b\xf6\x3a\xc7\x53\x9a\xe3\x69\x31\x47\xfb\x31\xbd\xc1\xa6\xd4\x49\xd5\x1e\x6a\x1e\x6c\x05\x8d\xd1\xa2\xea\x0b\x31\x87\x1b\xa1\xbe\x8e\x6f\x6e\x12\x2f\x53\xfb\x39\xd5\x66\x72\x2f\xd9\x65\x7a\xd9\x7a\xa6\x69\x41\xbd\x73\x3d\x01\x18\x32\xcc\xb8\x1f\xd4\xce\x5d\x62\x31\x4b\x4b\xa4\xb7\x79\xb0\x32\x82\x65\xa9\x98\x01\xaf\x10\x5a\x2a\x53\x48\xea\x09\x1c\xc2\x1a\x11\x0e\x64\x9d\x7b\xc6\xfc\x5a\x7d\xea\x16\x0a\x1d\x73\xce\xe4\x29\x88\xc6\x1f\x06\x3c\xe8\xb4\x65\x23\xc1\x5b\x8d\x65\x10\xde\x6d\x2c\x83\x73\xb6\x25\xd3\x43\x9e\xcb\x9a\xd7\x73\x89\x51\x35\x0d\xb4\x8a\x54\xf5\x65\x59\x69\xdb\x3f\x15\x3f\xa0\xdd\xc3\x89\x64\xbb\xe6\x30\xe9\xe7\xae\x02\x3e\xbe\x66\xfe\x91\x5b\xf7\xe2\x1c\x60\xed\x61\xce\x94\x47\x5c\x51\xc0\xcb\x83\x1c\x30\x7c\x50\xc0\xef\xd3\x1c\x30\xd0\xc0\x9b\x5e\x0e\x18\xdd\x0b\xbf\x43\x24\xdb\x9f\x4a\xa6\xbb\x71\xeb\x5a\x9a\x06\x09\xef\xc5\x4b\xa2\x1f\x98\x65\x3d\x32\x77\x2e\xa7\x2f\x8b\x36\x01\x6f\xef\x18\xa6\x1a\x76\xd6\xa3\xfa\xde\xe8\xa0\x67\xab\xfe\xd2\xd6\x2d\x9e\xcc\x5d\x14\x9e\x99\xe8\xd1\xca\xe8\x5f\x26\xfa\x65\x65\xf4\xb5\x89\xee\x2e\x46\xeb\x3b\xb4\x25\xe4\x33\xbd\xf2\x79\xe9\xea\x81\x64\x37\xce\xd9\xdd\x4f\x58\x48\x85\xb8\xad\xe3\x56\x67\x73\xe1\x65\xe6\x7e\x42\x4e\x20\xa5\xec\x4b\xdc\x83\x29\x45\x34\x8d\x64\x2f\xb9\x96\x76\xfb\x5a\x66\x5e\x79\x72\xe2\x48\x77\xfe\xbc\xf7\xfe\x16\x36\xb8\x84\xce\x3d\xe3\x4f\x1d\x88\x9d\xbb\x04\x1f\x5d\x80\xa0\x7b\xd7\x20\x3e\x7b\x6e\xa4\x72\xec\x4f\xf8\xf6\xe8\xec\x01\x46\xcd\x1c\x79\x97\x66\x64\xd1\xf9\xd5\xdc\x9a\x39\x2f\xd9\x61\x6a\x7a\x60\x1e\x9b\x6e\xa3\xf7\xc9\x7a\x63\x5e\xfe\x48\xc9\xe5\x7e\xa4\x75\x41\x22\xa5\x90\xd0\xda\xfc\xa8\xf4\x7c\x69\x07\xaa\xd2\xd9\x38\x9e\x93\xce\x5e\x4c\x75\x48\xdc\x94\x5e\xaa\x03\x45\x09\x32\x85\x84\xaa\x4c\xcd\xc3\xd8\xa9\xe1\x18\xe3\xae\x9c\x7f\x7f\x66\x81\x13\xa8\x91\xad\xbd\x31\xf1\xab\x98\xff\x0c\x19\xfe\x86\x11\xc5\x81\xae\x26\x85\xc5\xa8\x99\xe3\xf3\xd3\xa6\x08\x1c\x85\x09\xcd\x90\x5d\xc5\xe8\xfd\xa7\xd7\x34\xa9\x55\xc7\x0e\x97\xa3\xc2\x88\xce\x97\x1c\xb0\x30\x5f\x9a\xd2\x9e\x8d\x95\x41\x3e\x2c\xe2\xe7\xae\xb2\xa0\x25\x7c\x2a\x95\xc0\xa3\xcf\x19\x2d\x65\x01\xed\x99\x9f\x36\x01\xd3\x8a\x12\x03\x3c\x8c\x83\xb1\xd5\x6e\x90\x90\xee\x11\x75\x54\x76\x24\x07\x21\x8b\x6a\xd7\xbe\x4b\xc2\x5a\x08\x03\xb2\xe8\x53\x6a\x47\x22\x2c\xfa\x4e\xa0\xbd\x9b\x29\x33\x8f\x29\xb6\xe3\x90\x44\xb4\x14\x50\xa0\xc9\x50\x8a\x16\x6f\xfc\x2b\xe1\x7f\x4d\xc9\x90\xe3\x52\x8e\xa4\x3d\xdf\x2e\x2b\x6f\xd4\xe1\xc3\xfb\xbb\xe4\xc1\x03\xf5\x91\x40\x16\x08\xec\xce\x7c\xc0\x8c\x83\x25\x75\x9c\x33\x89\xf6\xca\x42\xf8\x7c\xd0\xde\x0b\x6a\xc1\x8b\x4b\xa8\x1d\xd8\x65\x21\x3e\x29\x90\xad\x81\x4c\x82\x14\xe5\x3b\xca\x39\xaa\x07\xb3\x2e\xfb\xf5\x4a\x24\xef\xb0\x1e\xf6\x8b\x04\x3d\xf6\xf9\xb5\x89\xab\x04\x36\xfd\xcd\x61\xf1\xc6\x73\x08\x8a\x67\x3e\xed\xe8\x83\x7d\x7b\x6a\xe2\xee\x07\x92\xf5\xd2\x26\x5e\xad\xe7\x32\x34\xfd\x86\x17\xd2\x07\x92\xa0\xc5\x9f\xda\x8b\x6b\x9a\xca\xe3\xfb\x8e\xe4\x75\x0f\xd6\x18\x96\x26\xd7\x93\xf6\x3d\xa4\x49\x6f\xcb\x3d\xe2\xd7\x4e\x5d\x86\x4e\xad\x98\x0f\x49\xfd\xf9\xa4\x2c\x14\xfd\xf4\xfc\x28\x54\x59\x56\x1e\x5f\xea\x89\x97\xa5\x7a\x74\x41\x6d\x5a\xe5\xfd\x5d\x57\x84\x4e\x28\x06\xe9\x25\xd7\x7f\x8f\xa3\xa7\x71\x0c\xcd\x58\x54\xf2\x30\xd4\x35\xaf\xd4\x51\xf7\x6f\x3e\xc3\x0b\x66\x90\x2b\x33\x5c\xae\xca\xd0\xdd\x75\x85\xf2\x22\x16\x89\x5f\xcd\x74\xe6\x55\x33\x06\x6f\x93\xa8\xf6\x33\x70\xd9\x8f\x33\xb3\xc8\xff\x8c\xf5\x22\xaf\x27\x27\xba\x94\xf6\x26\x4d\x3b\xda\x5d\x4c\x1a\x88\x80\x4b\x62\x4c\x8e\x43\x9e\x20\x87\xfb\xd7\x6f\x70\x07\xec\x2c\x15\x34\x4e\x4e\xe6\x92\x31\xa5\x50\xb4\x79\xce\x6e\x13\xd8\xf5\x50\xea\x10\x23\xd7\xef\xb7\xe6\xbc\x57\x66\xb3\xb3\x10\x48\xed\x8c\x52\xad\x68\xa9\x0a\xf9\x1d\xf1\x7a\xcd\x7e\x7f\x27\xa3\xec\x99\xdd\xd9\x19\x3b\x3b\xa3\x2c\x85\xa0\x12\xc4\xe4\x2c\x4f\xba\xc7\x4e\x53\xd2\x1b\x95\x05\xd2\x83\x3a\x6c\x24\xe6\x93\x9f\xff\x67\x9c\x5a\x0b\xd9\xfe\x9b\x0a\xd2\x6e\x0e\x40\x7a\x33\xd6\x26\xb3\xcd\xed\x75\xce\x0c\x91\xcc\xb3\x20\x81\x7e\xc9\xa4\xa1\x3c\x98\xe1\xfa\x99\xa3\x5a\x42\xd9\x26\x05\x96\xea\x67\xb4\xca\x3c\xa1\x1f\xa5\x04\xf2\x72\xf7\xf0\xc3\xeb\x39\x6f\x71\xaa\xa3\xee\x57\xb9\x3c\x67\x31\xfc\x3e\xb6\x24\x6b\x42\x40\x79\x40\x6d\x89\xc0\x4c\x0b\x01\x4c\x0b\xe8\x99\x33\x14\x7c\x77\x2b\xaa\xf5\x8c\x4f\x02\x9c\xe2\x60\xf0\xdb\xf5\xda\xc0\x25\x5e\x29\xa4\x45\xbe\x8b\xea\x06\x93\x68\x2f\x0f\xb3\x71\x76\x70\x02\x7e\xdc\x26\x2d\xe8\xb9\x2c\x51\x87\xe4\x93\x68\x8f\x78\xa2\x5e\x3b\x76\x49\x08\x02\x6a\xff\x92\x20\xb0\xf6\x36\xb6\x2d\x36\xb1\xbd\x19\x83\x50\x11\xe7\x15\xf8\x74\xed\x85\x28\x08\x15\x61\xc6\x99\xc1\x6c\xc6\xfb\x92\x78\xac\xc9\x5a\x30\xad\x42\x1f\x7b\x45\xbe\xf9\xee\x16\x01\x14\xa5\x08\x27\x3d\x8b\x45\x78\x5d\x02\x48\x63\x16\x60\x7a\x6a\x7f\x48\x88\xc7\x26\xb0\x0b\x86\x90\x21\xc4\xd2\x84\xe4\xa2\x20\xf4\xaf\x84\x58\x9a\x94\x7d\x43\x0a\xd2\x80\xd4\xa4\x84\x18\xd9\x06\x2b\x2a\xd7\x84\xaf\xd7\x0b\x1e\xef\x31\xf9\x5b\x20\xbc\x62\xe0\x84\xc2\x2f\x86\xba\x5d\xfa\x97\x04\x69\x2b\x46\x6c\x62\xfb\x48\x5d\x50\xca\x85\x21\x54\x8c\xd2\x70\x58\x8a\x72\x69\x42\xcd\x68\x2e\x9c\x4b\xe3\xe9\xbc\x2e\x4a\xca\x31\x70\x99\x20\x19\x4e\x54\x14\x65\xdd\xa0\x72\x81\x82\x62\x1e\x3f\xe6\xd6\x35\x9c\xa5\x59\xa0\xa1\x04\x69\xa8\xfd\x11\xa6\x2c\x4f\x1e\x53\x86\x7f\x09\x93\xa2\x54\x2a\x4a\xe3\xac\x6d\xb2\x6b\x99\xfe\xf5\x82\x79\xbe\x7d\x5c\x2c\xcd\x12\x91\xdd\x0f\x81\x64\xab\x9c\x03\x29\x13\xab\xca\x98\x2a\x2e\x7b\x25\xe5\x63\xc2\x5e\x8e\xf7\x4b\xda\x1e\xeb\xbe\x9b\x6f\xd1\xc1\xef\x0a\xbd\xfc\xb8\x50\xdf\x2c\xc9\x15\xdf\x2d\xf9\x69\x81\x7e\x4a\x8d\x1f\xb8\x25\x5f\x17\x97\x9d\x4a\x5e\x2f\x39\xcd\x4e\xa5\x1b\x65\x2c\xdd\xc8\x3d\x2c\x12\x65\x81\xc2\x0d\x1f\xb4\x51\x4d\x64\x12\xe5\x1e\xf5\x78\x22\x2f\x4a\x79\x94\x45\x7b\x81\x16\xa4\x3c\x16\x50\xdb\xb8\x05\xf5\x72\x0e\x0a\x7d\xa3\xf8\x1b\x67\xbe\x25\x59\xb4\x97\x7a\x10\x65\x21\xb5\x0d\x12\x34\xbc\x6a\x2e\x1b\x2a\x75\x3b\x60\x97\x75\x3b\x9c\xcd\x1e\x78\xfb\xe6\x03\x19\x07\xab\x2c\x35\xe5\x9b\x13\x53\x2b\xf5\xf4\xb8\x3c\x0f\xbe\xac\x83\x8c\x56\x36\xb6\x2c\x34\x9f\x7a\xeb\x62\x8a\x46\x25\x6b\xdb\xdf\xf3\x6c\xc9\x40\xd8\xf2\xf7\xa4\xed\xa9\x1b\x9a\x5f\x23\xb9\xac\x80\xbc\xae\xd7\x09\xbe\x39\x98\xd7\x2a\xf1\x73\x44\x66\xca\x5e\x3e\xaf\xd4\x95\x63\x1c\x08\x5f\xd6\xb3\x3c\xbe\xe8\x65\xeb\x20\x9e\x16\x1c\xea\x8d\x83\x8f\xe2\x0a\x88\x20\x63\xb3\x63\xe9\xf0\x40\xbf\x91\x4b\x55\x6a\xb3\x13\xcf\xc3\xea\xa2\x93\x28\x99\x91\x11\xf2\x4a\x1d\x95\xdf\x42\x7e\x59\x17\x22\xd3\x46\x71\xb4\xfc\x09\x95\xef\x41\xe5\xfb\x33\xdc\xbb\xa0\xd0\x93\x29\xaa\xa4\xa5\x1c\x54\xe7\x9f\x48\x4e\xa2\x3d\x5c\x5a\x6a\xfb\xae\xad\x02\x3d\x17\x25\xcd\x34\xa2\x67\x22\xf6\x91\x12\x6f\x5d\x4c\xce\x0c\x85\x6a\x28\xa2\x36\x75\x2a\x01\xa2\xfe\x4e\x2a\x9a\xa9\x7b\xcb\x49\x94\x1a\x18\x87\xa5\x06\x25\xc1\x22\x08\x81\x25\xbe\xbb\x15\xe0\x52\x24\x79\x0c\x4b\x4e\x8c\xba\xcc\xf8\x55\xbf\x23\x91\x12\x1a\xd5\xf7\xe3\x33\x7c\xe3\x40\xc1\x3b\x47\x83\xac\x76\xea\x16\x41\xaa\x04\x5c\x3e\xe0\x62\x29\xae\x26\x43\x85\xee\x98\xc7\x88\x0b\xad\xa8\xc3\xe7\x24\xc6\xcf\x9e\x4b\x67\xde\xba\x38\x3b\x43\xe3\xe3\x83\x45\x66\x7a\x73\xcc\x74\x77\x5d\xa6\x26\xcd\x3c\x17\x29\x03\x6c\x8e\x01\xb6\xc0\x00\x9b\x67\x80\xda\x24\x47\xfd\xff\x2f\xc2\x29\xec\xa4\xcf\x5b\xf3\xc6\x7b\xaa\x79\x09\x98\x07\xf5\x39\x21\x67\x3c\x3f\x85\xad\xdc\x3a\x31\xdf\xcc\x25\x2c\x10\x24\x9b\x54\xf3\x69\xe8\x36\x9a\xdd\xe6\xe5\x6f\x46\x61\xea\x2d\x68\xf4\x94\x3e\x9f\x5d\x2a\x6f\xf9\x6c\xb0\x69\x07\xdb\xbc\x3c\x73\x24\xe0\xc8\x17\x64\xe6\x4b\xc0\xa1\xf2\xf2\xf2\x37\xb9\x97\x43\xa0\xf3\x4b\xc8\xaf\x4e\xbb\x53\x06\x8e\xaa\xa9\x46\x5c\x5c\x31\x8c\xac\xc3\x52\x86\x03\x4b\x8c\xe3\x42\x41\x31\xa9\x4c\xa3\x5a\xa8\xc2\xb4\x2e\xb9\x1c\xee\x11\x89\x07\xdd\xea\x91\x85\xe4\xfe\x29\xd4\x27\xc8\x66\x00\x57\xcf\x27\x24\x1f\xb4\x25\x93\x14\x62\xe4\x10\x1f\x4c\x50\x7b\xdd\x2b\x14\xe0\x53\x5d\x31\x43\x48\x45\xeb\x6b\x65\xd8\xcd\x0d\xda\x2b\xcd\xd4\xc8\xa1\x99\xf6\xc6\xe9\x96\x4a\xcf\x7a\xfe\xe9\xf6\xe1\x33\x29\x1f\x7f\x66\x5f\x8e\xff\x64\x92\x0f\x36\x53\xcf\x0c\xe7\xcf\x5c\x36\xcd\x01\x22\x35\x46\xb0\x73\xd0\xdb\x0a\xec\xcc\x48\x50\xf2\x29\xaa\x7b\xfe\xf6\x28\x0f\x5d\x06\xc0\x2a\x11\xe7\xf1\x78\xd8\x8a\x46\x7b\x4c\xc1\x22\xea\x58\xdf\x64\xed\x7a\xec\x6a\x5f\x0c\x72\x4c\xe2\x12\xba\xb1\x96\x22\x2a\x91\xb8\xe4\xab\x55\x5e\xfb\x0d\x29\x86\xca\x8c\x7f\x5c\x24\xb2\x14\xc1\xb2\x9d\x62\x3b\x98\x10\x9f\x3a\x32\xff\x8d\x2a\xb6\xed\x46\x22\x62\x07\xe9\x11\x72\xe5\x71\x6a\x6b\x53\x09\xf1\x6a\xab\x9c\x3f\x84\x54\xdb\xb7\xf4\x24\x52\x1f\xe8\x3c\x92\x75\x6d\x44\xe5\x57\xbc\x38\xc9\x4b\xbe\x39\x30\xce\x4d\xd3\xf1\x60\xce\x66\xe3\xfb\xf7\xf7\x49\x7a\x7e\x4a\xd9\xe5\x2b\xf1\x6a\xb2\xe7\xd6\xc6\x2e\xbb\x3b\xd3\xd6\x4d\x7e\xfe\xa7\x38\x73\x98\x72\xf3\xf9\x64\xf1\x35\x7a\xc7\xd1\x27\xb7\x7a\x99\xd5\x43\x6b\xfe\xfb\xb2\xfe\xfe\xfe\xeb\x95\xf8\x38\xa1\xe7\x07\xe6\x65\xee\x53\x8e\x67\x46\x61\xff\xa9\x85\x0e\x5f\xd4\x68\x9d\x44\x7b\x01\x9f\xd8\x01\x1f\xd3\x92\xcf\xdb\x57\x38\x97\xa9\xf5\x36\x36\x23\x9e\x35\x53\xf5\x78\x35\x45\xa8\x83\xce\x71\x6c\x87\x22\x86\x92\x4a\x11\x08\x51\x4d\xf8\x90\xe3\x52\x04\xc2\x4d\xfe\xc4\xf3\x6c\x31\x1d\xa4\x28\x49\xee\x5f\x29\x40\x2e\xed\x04\xd2\x02\xb0\xa8\xa3\x2f\xeb\x2c\x8f\x77\x16\x8a\xfd\x67\x02\x12\x32\x3e\x3b\x69\x5f\x15\x45\xe8\xf8\x3c\xa8\xc3\x12\x83\x0a\xb5\xaa\x86\x8a\x02\x3d\x34\x03\xfc\x2c\x83\x5f\x2a\x38\x4e\x0a\xce\x8f\x1f\x44\xf2\xcd\x13\x86\x23\x5b\x7d\x3d\xe9\x2f\x18\xa2\x8d\x8a\x58\xbc\x9d\xc0\x69\x04\x9a\xf3\x70\x40\x7c\x4a\xdf\x24\x54\xa5\x4f\xf3\xcf\xf1\x3a\x4e\xc0\xdb\x57\xe9\x29\xa9\xe4\x13\x5b\xf2\xb1\x13\xc0\x64\xe3\xf1\xa0\x0e\x65\xab\x63\x0e\xbf\x16\xbe\x28\x43\xec\x9f\x1e\xf8\x68\x77\xd1\x2c\x8b\x2a\xc8\x68\x80\x74\xb4\x07\x40\x21\xa1\xfa\xb3\x09\x23\x7c\x98\xd3\x9d\x6c\x3e\xc0\x64\x6c\x8e\x31\x02\xb1\xd9\x46\x13\x82\xaa\x4a\x60\xe8\x21\xc0\xa7\x8e\x11\x38\x02\xd4\x39\x82\x49\x3f\xd5\x44\x57\x67\xe6\x66\xb5\xc6\x3b\x9c\x36\x31\x38\x98\x41\x0e\xd3\x4c\xc8\xc3\x24\x28\x85\xb5\x89\x6b\x66\x22\xd5\x5b\x22\x91\x91\x13\x8b\x2a\xb9\x6b\x2b\x4d\x0c\xdc\x79\x55\x1b\x24\x62\x31\x65\xb1\x78\x52\xa1\x4c\x62\x12\x9e\x91\x97\x44\x4c\x3d\xa0\x15\xd6\xad\x09\x7a\x31\x51\x1f\x50\x20\x64\xf5\x44\xa4\x9d\xbb\x40\x7c\xc9\xa3\x5f\xcd\x27\x92\x14\xd1\x3d\xcf\x8e\x9c\x30\x47\xa1\xe3\x89\x8b\x67\xe2\xb1\x98\x96\xc2\xed\x1d\x27\x65\xcc\x63\x5e\x31\xa4\xce\x77\x49\x42\xa6\x7d\x97\x20\x3f\x38\xdd\x51\x07\x11\x08\x00\xc1\x26\x0c\x3f\xb4\xbb\x13\x08\x43\x32\x39\xd6\xb9\x55\x59\x41\x56\xb7\x88\x48\xa5\xcb\x55\xf1\xc0\xdc\xf8\x7c\x92\xd8\x3b\x61\x01\x22\xc1\xbf\x4c\xc9\xba\x7a\xdb\x37\x84\xb2\xf4\x0e\x27\x80\x89\xf6\x77\x53\xa2\xbe\x0e\xf6\x67\xe9\xc3\xbe\x55\xf3\x62\x6e\x62\xc4\x53\x52\x23\x6e\x9a\x8e\x3a\xcb\xcb\x03\x9d\xc5\x4d\x86\x5a\x2a\x40\xee\x9c\x5b\x27\x82\x14\x80\x07\xbb\x41\x29\x74\x2c\x81\x3e\x65\x48\x58\x12\x65\x16\x14\x45\x99\x45\x42\x3b\x00\x8a\x85\x0f\x4d\xe4\x0b\x3c\xf5\xcc\x6c\xd6\xc4\xe9\x3c\x97\xfa\x2b\xd7\x58\x63\x8a\xce\x14\xd5\x07\xea\xf8\xb6\x4a\x4d\x8d\x8b\x97\xb7\x22\x96\x08\xfe\x65\x2b\x72\xfc\x6f\x80\xc4\xff\x2a\x92\xf7\x77\xd2\x14\xa4\x59\x6c\xa1\x87\x85\x6d\x41\xfc\xaf\xf1\x1e\xff\x67\x2b\xb1\xcb\xbc\xbc\x15\xd3\x6d\x5f\x6b\x67\xfe\x68\x93\x66\x29\xda\xde\x61\xcd\x62\xb4\xbd\x43\x99\xff\x35\x7e\x7f\x27\x19\x87\x52\x2f\xb2\xd9\xf7\x6d\x85\x52\x36\xbd\x96\x24\x62\x1a\x41\x88\x4e\x3b\x75\x9e\x83\x09\x89\xb0\x17\xcb\xec\x5b\x75\x64\xb5\xbe\x85\x4c\xaf\x6f\xf9\xe7\x07\xd3\xf4\xce\xa0\x36\x71\xbf\x7a\xb5\x89\x8b\x6f\x79\xc2\x24\x28\x0a\xf8\x2a\x01\x9c\x7d\xc7\x44\x80\x1c\x5a\x2e\x4c\x82\x6f\x1e\xfc\x2d\x14\x08\xc6\x40\x9a\x92\xca\x55\xc2\x08\x94\x53\xf0\x2d\x09\x7e\x39\x39\xe4\x19\x2a\x98\xfc\x4e\x4e\x96\x26\x3f\x35\x21\xad\xe7\xd6\xb0\xcb\x57\xe2\x9b\x15\xd0\xe3\xb7\xc9\x9e\x7a\x34\xb6\x79\xbe\x77\x77\x66\x9b\x19\xf0\x76\x22\xed\xe3\x63\xdb\x3b\x51\x76\x1f\x1e\x3f\x52\xfb\x06\x94\xf9\x7e\x9e\xb3\x5c\xb4\xd0\x0b\x82\xdc\xae\x2e\x3d\xa1\x3b\x3a\x67\x66\x43\x87\xc3\x0e\xf6\x73\x38\xf4\x10\x78\x58\x87\x91\x10\xd8\x9e\x10\xa4\x2c\x44\xb0\x37\xa9\xf2\xae\x2f\xed\x49\x95\x77\x7c\x49\xd1\xca\xe0\xa4\xca\x6f\x27\x90\x71\x55\xe2\x8e\x4a\xdc\x9d\x4f\xdc\x48\x7e\xf4\x3a\x71\x2f\xec\xf7\x6d\x39\x53\x42\xc5\x53\xb4\xac\x6b\x58\x28\x90\xec\xc2\x88\x99\x0b\xa7\xcd\x13\x3d\x2a\x37\x4f\xd4\x7b\x61\x13\xf1\x64\x22\x9e\x74\x44\xb6\xef\x14\xeb\x65\x96\x5d\x69\x69\x83\x3c\xf3\xb9\x4f\x35\xf8\x34\x97\xf7\x12\x2f\x30\x75\x58\xc1\xcd\xeb\x91\xbc\xf4\x71\xac\x4c\x4f\xdd\xe4\xac\x5c\xd4\x5a\xa7\xac\x7d\xea\xd2\xd9\x23\x39\xae\x32\x79\x43\x9d\x63\xd4\x01\x6a\x7d\x5f\xb5\x38\x7a\x42\xb4\x4e\xb5\xf7\x7d\x74\x42\xeb\xf3\xd3\x84\x9a\xc7\xba\xf0\x21\x24\x5b\xb7\xd2\xb5\x46\x37\x2b\x24\xca\xa7\x41\x02\xd7\x2d\x27\x7d\x3d\xa1\x0b\xbd\x6f\x7e\xa4\x37\xb9\x2e\x24\x3f\x4d\xf6\x6a\xf8\xac\xfd\x07\xa9\xf6\x99\xe4\xbd\x88\xba\x76\xcd\x55\x8f\x8a\xf6\xaf\xa5\x78\x0b\xe4\xc4\xfe\xfb\xcb\x9f\xc7\xbb\xac\xde\x19\xf6\xec\xcf\x5f\x8e\x77\x59\xbb\x91\x0c\x07\xa1\x0d\x32\x75\x3f\xf4\x3b\x49\x60\x83\x88\xdd\x6e\xb4\x5a\x0d\xf3\x9d\xab\xa1\x93\x6a\xd6\x6b\x4f\xd1\xbc\x9f\xef\x0c\xec\x37\x58\x73\x7b\xbe\x4b\xfa\x21\x76\xdb\x1d\x21\x84\x5f\xbb\x70\xe9\x9b\x2f\xea\x92\xf8\x35\x4b\xa9\xc6\xbe\xa8\xa7\x4a\xeb\x11\x6a\xb5\xa2\xd0\xb3\x36\x48\xdf\x2e\xff\x71\x9e\x8c\x64\xab\x11\xac\xa9\xe7\x4e\xf8\x6c\xb9\x91\xf8\xbd\xb0\x1d\x26\x03\x7b\x6d\xe3\x8f\xa2\x2c\xfe\xb1\xc1\xff\xa0\xce\xcc\x17\xe5\x99\x27\xf6\xaf\x65\xcd\x73\x17\x4c\x6d\xfc\x16\x4b\x1e\x89\xa9\xf0\x2d\x2f\x9b\x74\x4e\xab\x79\x6b\x82\x17\x6e\xa9\x8c\x26\xf7\x0e\x3d\x97\x78\x54\x08\x31\xae\xef\xc9\x5a\x18\xba\xc4\x62\x1e\xb5\x25\x46\x1a\xbe\x35\xbe\x1d\x34\x25\x77\xe1\xee\xc9\x5a\xd9\xb5\x65\xcd\x72\x33\xf4\x07\x79\x3b\x65\x75\x89\x12\xbe\x20\xb2\xe4\xd3\xff\x3d\xa9\x12\x2f\xd3\xd2\x4e\xaf\xfe\x88\x2c\x79\xf9\x13\xb5\xc3\x65\x0c\xbe\x90\x25\xdf\xf1\x84\xc2\xe0\xff\xaf\xf0\x32\x34\xb0\xe4\xf8\x7b\x19\x32\x75\x94\xa6\xc2\x45\xaf\xe4\xe7\x3b\xff\xd9\x6a\xe5\xb1\x28\xaf\x61\xf5\x22\x80\xe7\xfd\xe6\xfb\xfb\x71\xb3\x50\x58\x3f\x6f\x92\xe7\x04\x36\x8e\xb2\xf6\xd3\x77\x85\xa8\x46\xf3\x57\xc8\x79\x3c\xb0\x6d\x54\x38\x98\xdc\xab\x1d\x9e\xb2\xf1\x58\xb2\xa7\xbe\x64\x97\x03\xc9\x86\xa7\xae\x3d\x3c\x55\x1a\x2a\xb3\x47\x72\xa6\x74\xaa\xce\xba\xe4\xac\x3a\xef\x7a\x59\x49\x86\x38\xcb\x0e\x4f\xe9\x7e\xb3\x50\x38\x6f\x92\xb2\x45\x0b\x05\x0b\xaa\xbd\xf5\xe2\xea\x50\xf3\xc5\x7d\x7f\x27\xe7\xc6\x9c\xe3\xb4\xa9\x55\xff\x5f\xd6\xd3\xeb\xab\x17\x5a\x7b\xf1\xb4\xa9\x19\x65\x52\x19\xb7\xc1\x34\x33\x3c\x02\x05\xad\x8b\xc3\xd3\xf7\xf7\xd6\x21\x46\xa5\x5d\x03\x08\x38\x3c\x55\x7a\xf9\x2f\xb5\x4e\xa0\xae\x2e\x1d\x20\x68\x67\xe7\x9f\x94\x14\xe2\xe5\x1e\x0a\xfb\x42\x15\xe0\x18\xaa\xd2\x0a\x7e\x18\x90\xc5\x39\x73\xbe\xda\xa1\x04\x5c\x07\x52\x5a\x7d\x3a\x63\x96\xae\xb0\x19\xcd\x09\x28\xe7\xd5\xec\xf9\x80\xe4\x11\x2c\x85\x55\xd8\x83\x47\x01\x2c\x7d\x1a\x6d\xee\xd4\xf4\x48\x3f\x22\xc6\x26\xdb\x87\x94\x37\x12\x9f\x47\x43\xab\x64\x3d\x72\x86\x2d\x31\x6f\xe4\xea\x6c\xde\x9c\x95\x69\xe7\x27\x92\x63\x51\x1b\xce\x51\x6c\xe4\x7a\xdb\x45\xea\xf2\x6a\x78\x95\x37\x2a\xf4\xfe\x7e\x7e\xc5\xef\xf1\xc5\x00\xf4\x84\x8b\x2a\x1b\x5e\x51\x27\xb8\x22\xc1\x8b\x5c\xf1\x1a\x03\x88\xbe\xa8\x92\x64\xd1\xfb\xf6\x77\x7d\x62\xd7\xab\xa4\xc8\x53\xc3\xe2\x9e\x90\xef\xef\xd7\xf8\x30\xfd\xb2\xea\x3c\x92\xef\x55\xd6\xab\x50\xe7\x41\x7c\xd7\x96\xbc\x9a\x2f\xc6\x26\xd7\x6d\x5b\x8a\xb2\x95\xa1\xad\x54\x89\xa9\xdb\xcb\xea\xfb\x3b\xb9\xac\x8a\xe3\xb1\x5c\x6b\x24\x6b\xa1\x44\x05\xe7\xe1\x69\x76\xbf\x71\x59\x9d\x3d\xf0\xeb\x33\xb1\x5e\x76\x1e\xf8\xf3\xd2\xaa\xf8\xa2\x56\xf1\x86\x24\x94\x3f\x93\xe1\xa9\xbe\xdd\xfa\xd5\x57\x46\x69\x8f\xa3\xb9\xb9\xfe\x3b\xd4\xf5\x71\xb4\xa4\x11\x7a\xed\xbd\xbf\x93\x94\xaf\x5a\x35\x70\xc9\xc9\x29\x7d\x7f\xbf\xa6\xce\x41\x8b\xfc\x6a\x42\xaf\x15\x22\xf5\x1f\x07\xe4\x58\xe6\xc0\x58\x12\xca\xf6\x2b\x46\x57\x69\x74\x4e\xa9\x03\x0c\x9a\xb4\x40\x58\xb7\x25\xfd\xb0\xde\x69\x05\x61\x4f\xe8\x52\xd2\x53\x0a\x49\xa8\x53\xb9\x24\x92\x9d\x9c\x32\x13\x87\x7b\xb9\x13\x2f\xcf\x2c\x52\x7e\xe2\x65\xdd\x24\xd3\x19\x4f\x67\x08\x69\x26\x07\x20\xe9\x7b\xac\x55\xc8\xff\x5a\x88\xb8\x3c\x52\x11\xc1\x35\xae\x26\x40\x2b\xd5\xf3\x8d\x54\x8a\x16\x07\xcd\x42\x61\x2e\x4b\x6d\xda\x67\x87\xa7\xec\xe8\xd4\x58\x4c\x69\xa4\xde\x95\xcc\x34\x20\x09\x55\xe5\x78\x78\x2a\x30\x35\x66\x03\xab\x0d\x99\x6a\xc4\x48\xe7\xd8\x1c\x47\x29\x6d\xa2\xd1\xd0\x68\x46\x41\x2d\x7d\x6f\x60\x8d\xa0\x41\xef\x70\x89\xf7\xb3\x70\x71\x88\x98\x1a\xc6\xb1\x92\x97\x56\xe6\x71\x2a\xb5\xd5\x4c\x3a\x51\x23\x75\x5d\xf2\xb0\x25\x81\xcf\x53\x3c\x65\x23\x94\x47\x9d\x5e\x1b\xa5\x63\x7d\x36\xa7\x41\xac\xb7\x2f\x61\xcc\xb7\x24\x4a\xbd\x2d\x29\xd6\x2d\x3a\x5b\xb0\x54\xf7\x7d\xe5\x20\xfe\x98\x42\x60\x72\x74\x2e\x36\xd0\x20\x47\xa9\x91\x74\x87\x83\x12\x86\x37\xa0\xe9\x5f\xfe\x5a\xb6\xf0\x09\x5d\xce\xc9\xdd\x65\x40\xbf\x99\xeb\x76\xb8\x82\xab\x9e\xb7\x7e\xa5\x27\x0e\x23\x68\x57\xda\x73\x52\x32\x9b\x3b\x35\xf4\x00\x57\xa1\x10\x8f\x09\x86\xd8\x35\x9d\x39\xfb\xcd\xbd\x87\x01\x91\xac\x6c\x51\x5b\x6a\x47\x82\xc1\x75\x3e\x17\x94\x64\x06\xcd\x29\x1f\x79\x59\x6f\x89\xfb\x69\xcf\x53\x01\x3d\x13\x98\xb1\x76\x96\xea\xff\x42\xfb\xa3\x25\xfc\xc6\xbc\x56\xd6\xce\x5f\xd9\xdc\x3f\xbf\x4a\x34\x5f\x52\xee\x71\xbd\x50\xb1\xd3\xfe\x5e\x3c\xce\x08\xd0\x29\xa9\x8e\x3d\x4a\xdb\xc1\x10\xc2\xa4\x3a\x34\x51\x76\xb2\xe7\x0f\xb2\x4d\xd5\xbd\xbf\x93\x3c\xce\x6b\xca\x1e\xb4\x68\xdc\x4b\xa0\x5e\x98\x91\x7b\x1f\x00\xb0\x1a\xc3\x12\x51\xd7\xca\x30\x5e\xb5\xb1\x6c\x0a\x56\xd5\x45\xb6\x02\x5d\x55\x33\xe1\x74\x7d\x5d\xaa\x36\x92\x86\xf1\x75\x71\x3d\xf7\x25\xf9\xb5\x37\x1b\xc9\xf9\xb7\x76\xf3\xf4\x3b\xb9\xc3\xc3\xe6\x4b\xae\x4a\xae\x61\xce\x7f\x7c\x9d\xcf\x9b\xf5\x20\xfc\xad\x3d\x7a\xa9\x11\x1f\xa0\x94\xa2\xdb\xf8\x93\x65\xbb\xef\xab\x0a\x90\xd4\xc9\x93\x62\x26\x04\xc5\x71\xec\xad\x7c\x20\x38\x87\xcb\xb4\xbd\x6d\xa8\xda\x9b\xeb\x04\xd7\x48\xcc\x41\xfb\xa3\x3d\x21\x4e\xb1\x55\x42\xf7\x08\xde\x4b\xce\x4d\xc7\x32\x6d\x19\x21\xa9\x9d\x6b\x7c\x4f\x8d\x08\x68\xf8\x34\x81\xbe\xdd\x90\x38\xd9\x79\x85\x42\xe5\x92\x78\xf3\xf3\xf6\x03\xf7\x82\x8f\x1e\x08\x5d\x7b\xea\x8c\x6e\xf8\xc1\xed\x64\x4a\xe6\xaa\x75\x63\xdd\x2c\x1c\xff\xb6\xae\xd8\xe9\x1c\xbb\xb4\xac\x38\x69\xf5\x91\x0f\xd7\x2e\x6d\x9d\xa9\xd2\x36\x26\xd1\xae\xcf\xde\xdf\xf3\xc9\x27\x73\xc9\x99\x9a\x06\xcc\xd0\xe8\x48\x63\x3d\xb7\x2d\x73\x03\xe4\x72\xbe\x9f\x4c\x73\x9d\x61\x3d\x5d\x49\xd2\x3a\x38\xac\x98\x47\xa5\xa3\xf3\x62\xef\x00\x92\xcc\x9c\x9f\xaf\xab\xba\xc9\x7a\xda\x0f\x6e\x03\x17\x7b\x41\x47\xce\x0d\xad\x34\xc1\xfb\x7b\xd6\xb6\x29\x5f\xab\xc7\x67\x3a\x04\xaf\xb5\xf8\x83\x51\x97\xea\xac\x2f\x18\x12\xd3\x7f\x0f\x7b\x52\x78\x7b\x9e\x7d\xde\xd3\xda\xe5\xad\x48\xec\x1e\x7f\x46\x91\xe8\xe4\x5a\x0a\xcb\x99\x74\xc9\xf5\x82\xe8\x9d\x6a\xfa\x80\xf8\x84\xf2\x51\x20\x82\xf7\xf7\xcd\xc3\x22\x39\xb9\x96\xc5\x22\xad\x35\x7d\x97\x7c\xfe\x42\x8b\xa3\x06\x49\x3f\x1c\xaf\xc1\xff\xcf\x97\xad\x96\x27\xfd\x66\xff\xff\xa0\x7b\xce\x01\xc4\xdb\xcc\xe8\x5f\x6a\x62\xb5\xda\x31\xfa\xa8\x35\xcf\xfa\x23\x34\x77\x42\x65\x6d\xea\xbb\x85\xc2\x3a\xfe\xa2\x99\xc1\xe0\x59\x92\x90\x45\x4c\xa2\xb1\x41\x1c\x24\x73\xe8\x6b\x81\x2b\x4e\xaf\x25\x09\x98\x47\x99\x4a\x6c\x6a\x80\x3d\x76\x65\x31\x40\xdd\xf6\xc1\xa9\x24\x21\x52\x4c\xd9\xdb\xa0\xd1\x0e\x3b\xc3\x81\xad\x2b\x86\xfd\x0c\x24\xea\x25\x39\xdd\x53\x49\x3c\x76\x86\xd8\x24\x2a\xaf\xeb\x8b\xbc\x86\x6f\x07\xec\x31\xc0\xcb\x73\xea\xdc\x2e\x57\x1d\x9a\xf7\x24\x92\x3f\x06\xb8\x6e\x3f\x06\xb2\x76\xa5\x55\x23\x1b\x7e\xa1\xf0\x03\x35\xa6\x7c\xb6\x5e\xc6\xd9\x29\x9b\x49\xcf\xb2\xdd\x9e\x1e\x8e\xb9\x0e\x02\xb9\x50\x4b\xc5\x2f\x14\x7c\xe2\xe5\xcf\xce\x4e\xcd\xd9\xd9\x62\x2e\xdf\x64\xb3\xa8\xe3\xa1\x21\x54\xf5\x00\x39\x67\x0a\x35\x87\xe6\x87\xee\x45\x0b\x55\x2a\x71\x63\xb3\xa7\x25\xfb\xa5\x48\x7b\x09\x22\xa2\x06\x9d\x39\xce\x2b\x1e\xe5\xf2\xb8\xd3\x89\x5b\x61\xa1\x30\xf7\xc9\x5b\x1d\x19\x84\xbd\xd5\x50\x1e\x8e\x64\xeb\x37\x51\x7c\xd4\xe8\x0f\x65\xab\x31\xc5\xe7\x94\x85\x02\xf9\x0f\x53\xe6\x87\x1b\xc4\x92\xb4\x16\x6a\x96\x8b\x2d\xf1\xe9\x13\xbe\xeb\xe9\x3c\x4a\xb1\xe1\x75\x7a\x41\xd8\xb3\xd7\x2c\x67\xad\x2b\x83\xa0\x91\xc4\x18\x6e\xcb\x5e\xdc\x48\x20\xb8\xc1\xba\xff\x51\xba\x35\xf5\x72\x65\x6d\x83\xbd\x40\xfa\xb8\x17\x86\x09\x9a\x65\xd9\x60\xbd\x14\x70\xd2\xeb\xb4\x37\x58\x3f\xfd\xfe\xd9\xd9\x60\x03\xf8\x6a\xcb\xe7\x4e\xef\x67\xc3\x6f\xf6\x37\xd8\x10\x01\x8d\x24\x05\x8c\x00\xd0\x0b\x03\x8d\xee\x55\x7f\x2a\x64\x63\xfd\x05\xa8\x26\x10\x9e\x84\xad\x56\xe7\x55\xa7\x9d\x66\x10\x95\x7c\x3f\x03\xfc\xec\x6c\xe4\x7a\xa5\xb4\xf2\x9a\x76\x4b\x07\x06\xe9\x2b\xb0\x1b\xa3\x71\xff\x22\x8d\xe1\x07\x79\x22\xde\xa4\x67\xbf\x1e\x65\xf6\x0d\x03\xed\x48\xfe\x7e\x9f\xb5\x7c\xfb\x9a\x79\x9d\x56\x60\xaf\x97\xd9\x4f\x1f\xfe\xde\x85\xd9\xfb\xb4\xe4\x59\x7e\x98\xfb\xe2\xe8\xdf\x72\x0f\xeb\xcb\xb9\xad\xff\xb8\xec\x41\x5d\x8a\x50\xbf\xd0\x88\xe6\xed\x4a\xe7\x9d\xc0\x8e\x1e\x44\xcd\x9d\x3d\x12\x69\x65\x8f\xc2\x0e\x1e\xa5\x30\x0f\x85\xf0\x75\xd0\xf3\x01\xd3\x0f\x86\xee\xf7\xd9\x10\x3d\x91\xb3\xc3\xc5\x44\x1b\xff\x13\xfd\x05\xff\x36\x4c\xda\xd6\x01\xa4\xdd\x99\x51\x76\x94\x4b\xab\x23\x37\x53\x44\xc7\xcb\x91\xaa\x14\xc8\x79\xb2\x58\x4a\x53\x3d\xfb\xfa\xcb\x14\xb2\xf1\x3f\xfe\x97\xcf\x9f\xcb\xd6\x86\x41\x77\xba\x4c\xd7\x9f\x5f\xfe\xfe\x33\x0c\x53\xba\xd2\xa2\x9d\x07\x21\x2d\xb5\x81\x3e\x95\xa2\x21\x61\x49\xf3\xd4\xef\xc1\x5f\xea\xf7\x66\xaa\x7e\x5f\x03\x61\x81\xf0\xfc\x64\xf6\xd9\x37\x27\x26\x74\x51\x35\xa1\xce\x8d\xd8\xf9\x0b\x92\x35\xff\xc2\xd4\xed\xcd\x34\xcd\xb9\x09\x1d\xbe\x9a\x90\x7e\xb3\x0e\xf9\xa2\x8f\xc4\x98\x53\x89\xde\x8c\x06\xcb\x4f\x71\x4e\xa5\xc0\xb8\xe4\xc3\xbc\x1d\x0f\x6f\xcc\x57\x3c\xe3\xe9\x78\x90\xf7\xd3\x82\x4c\x99\x7b\xcd\xf5\x1a\x98\x11\xf1\xf0\x64\x86\x04\x9a\x35\x92\xc2\xb3\xd2\xdd\x7c\x4e\x6c\xbc\x38\x2f\x14\x7c\x6d\xef\xf9\x52\x79\xec\x8d\xaf\x49\x4d\xc7\xb9\xac\x26\x5d\xe6\xa3\x29\x4c\x9f\x4f\x77\xf3\x86\x2d\x59\x6d\xd4\x93\xec\xec\x45\xb2\xfe\x89\xde\xf1\x06\x7d\x58\x25\xf4\x8b\xf4\x5c\xca\xbe\xd2\xfd\xe5\x7e\x3e\x5e\x47\xd6\x7e\x4c\x5d\x02\xab\x91\x96\xa9\x2e\xce\x85\x64\xbe\x45\x72\x1b\x87\xee\xc2\x2d\x3f\xa6\x3b\xf8\x4b\x2b\x41\x94\x53\x51\xf9\x66\x9a\x82\x94\x94\xf9\x74\xbf\x5c\x85\x87\xaf\x50\x85\xe9\x04\x13\x58\x79\xbd\xe2\xd1\x43\xed\xd0\x25\x6f\xc7\xa1\xed\xb1\x5e\xd3\xf6\xf5\x98\x0d\x66\xb0\x95\xad\xff\x3d\xef\xca\x70\x71\x23\x91\x55\x76\xde\x72\x94\x19\xbf\xd8\x63\x52\x33\x52\x74\xc5\x93\xbc\xbc\xbd\xa1\x15\x76\x79\x73\x8d\x56\xd5\x1e\x58\x72\xf6\x73\xed\xb4\x9c\x9c\x29\xde\x04\x95\xeb\x3d\xfa\x2f\x06\x74\xe9\x7f\x68\x41\x17\xdf\x3b\x2c\x92\x25\x79\xdd\x27\x1e\x3b\x3f\x66\x93\x41\xfa\xee\x47\xe6\x55\xf5\x7e\x46\x0b\xef\x22\xf0\x52\x1c\x2f\x97\x58\xc8\x3c\x7d\xc7\xbb\x80\x97\x69\x05\x62\xfe\xe7\xee\x96\x97\xaa\xc2\xdc\x6c\xef\x18\x4d\x99\x17\xb9\xbd\xe3\x48\xde\x09\x49\x54\xe2\xbb\x2c\x86\x3f\x1e\x3b\x78\x04\x69\xc9\xf1\x4a\xe2\xe0\x51\xf2\x2b\xcf\x31\x68\xfe\xd9\x42\x1d\xe9\x85\xe4\x87\x69\xf2\x9d\xad\x43\x95\x21\x14\xfc\xaf\xdd\x2d\x2f\xb5\xf2\xd4\x14\x96\xd3\xfc\xaa\x67\xdc\xda\x85\xeb\x34\x8d\x8d\xa7\x96\x30\xd0\xa6\xcb\x12\xd1\xe2\xbd\x26\xeb\x8a\x50\x0f\xb3\x16\xbe\x5d\xe9\xa7\xdf\x09\x65\xca\xfe\x7f\xf7\x92\x0d\x45\x54\x3c\x7e\x26\x5d\x10\x14\x47\x22\x2e\x9e\xa8\xb0\x93\xd4\xce\xa6\x2e\x19\xb2\x11\x75\x12\x3e\x8e\x48\xc4\x62\xe6\x31\x8f\x75\x8b\xff\x58\xac\x0f\x7f\x40\x98\xd2\xb9\xfb\x2c\xa4\x8e\xce\x8d\xe1\x84\x07\x72\x21\x73\xc8\x42\x95\x0f\x31\x40\x03\x24\x35\x0f\x3d\xa6\x48\xa5\x6e\xfc\x69\x6e\xc2\x6d\xd5\x4e\xdc\x19\x9e\x86\x1a\xdd\x84\x9b\x13\xbd\x11\xb8\xa8\x52\x0d\x40\x55\xbc\xb8\xa4\xaa\xf5\x33\xb6\x8e\xe4\xe7\x0d\x93\x9e\x59\x2c\x34\x46\x9d\x42\xd6\x38\x86\xff\x7a\x3d\x06\x39\x96\x69\x6c\x0a\x4b\x71\x35\x96\x8b\xea\xbf\x60\x71\x72\xf5\x7f\x33\x65\x5d\xc1\xff\xde\xf2\x58\x5f\x40\x33\xb3\xa1\xd0\x13\xc4\x56\x8b\x8d\x84\xde\x72\x79\x25\x3d\xf9\xd2\xed\x21\x9b\x9a\x86\x38\x30\x81\x23\x61\x16\x6e\x76\xa5\x7b\x4c\xf9\x4f\xe8\x32\x27\x92\x1c\xb1\x2b\x65\xf4\x4b\x75\x05\x31\xcc\xba\x40\x25\x6d\xde\xe6\xd6\xa8\x68\x4a\x60\xb7\xc2\x12\xa2\xf9\xbf\x2d\x76\x27\x6e\xf7\xba\x76\x9f\x25\xe2\x76\x6f\x6a\x1f\x38\x81\x6a\xba\x0a\xbb\xa3\x4e\xa8\x9a\x0e\xc3\xaa\xe1\x41\xc6\xc9\x92\x78\xb9\x24\x9e\x6e\x5d\x4c\x71\xab\xaf\x17\x0e\x5f\x0b\x05\x92\x08\x1d\xae\xa1\xb6\x62\x73\xbb\x45\xd1\xd6\x5d\x56\x52\xe9\x6a\x7b\x87\xb2\xac\xb4\xd2\xd5\xf6\xa7\x1d\xca\xee\x44\xe3\x98\xed\xfc\x6d\x7d\xad\xbc\xbf\xff\x63\x7d\xab\xec\x91\x3b\xd1\x3f\x61\x15\x61\x51\xfb\x1f\xeb\xab\xa8\x14\x0a\x3b\x5f\x34\x7c\xff\x82\x55\x44\x60\x74\xdd\x6e\xa8\x4d\x6e\x85\x79\xa5\xa6\x40\xa5\x80\x42\x92\xd2\x2d\x0b\x8a\xe2\x96\x85\x45\x55\x89\x57\xdb\x7f\x52\xdd\xb0\x09\xab\xb0\x10\xb5\xed\xef\xa0\x31\x8f\xa0\x19\x67\xd8\x0b\x0f\x40\xca\x80\x61\x88\x5f\x53\x10\x2b\xe0\x2b\x9b\x4e\xcd\xca\xa5\x57\x38\x1d\xd5\xfc\x4b\x78\x8e\x59\x28\x52\xc9\x49\x7b\x66\xeb\xaf\x70\x5c\x04\x2b\x0b\x1f\xa7\x59\xd0\x10\x52\x7f\xf9\x88\x09\x8a\xfc\x9d\x21\x9b\xdb\x74\x5d\xcb\xd6\xb0\x87\x17\x5c\xc3\xd8\xeb\x72\x9c\x39\xc9\x4c\x57\x1c\xcf\xca\x4f\xf6\x68\xba\x07\x7a\x25\x91\xd0\x49\x31\xcc\x8c\x7e\x9f\xcf\x4a\xdc\xda\xc9\xae\x0f\x75\xa5\xfb\xac\x0c\xe0\xbc\x75\xd6\x39\x9c\xba\x84\x4c\xe5\xbd\x73\xb3\xe5\x17\x0f\x9e\x09\xf9\xfc\xc5\x2a\xc1\x27\xdd\xde\x81\x09\xe1\xf3\x17\x2b\x8f\xc5\xb7\x32\xf5\xcd\x4c\x0d\xb5\xf9\x17\xea\x9c\xc6\xa8\x85\x01\x13\x70\x08\x0b\x81\xdc\xde\x51\xca\x6b\x37\x5b\x92\x5f\x9c\x7f\x84\x9d\xc5\x66\xfe\xc5\x21\xde\xd4\x5f\x9f\xe1\xa3\x25\x8e\x9f\x8d\x7a\xd2\x89\x0e\x25\x0a\xd6\x84\xa4\x27\x3a\x14\x89\x83\x67\x12\xa5\x18\xbb\x82\x5b\x7f\xe1\x68\xc7\xa4\x5d\x80\x9c\xe8\x50\xa4\xc7\xb3\x13\xa9\x01\x55\x6c\xb1\xb0\x18\x53\x27\xe2\x07\x5d\x12\x14\xfb\x2c\x2c\x76\x59\x50\x4a\x8a\x7d\xe0\xa3\xd4\x2c\x76\xb7\x77\xe0\x1b\xc2\x26\x55\x29\x29\xe9\xd8\x92\x8a\xed\xb3\xb0\xd4\x65\x29\xae\x96\x99\x1f\x80\x23\x87\xc4\x42\xf2\xf6\x26\xdd\xf3\xf9\x95\x4f\x62\x6a\xab\x6f\xe1\xc3\x8a\x07\x5d\xfa\xe1\x09\xaf\xe6\x42\x3d\xd5\xfd\x85\xf5\xe0\xc3\x88\x80\x38\x66\x31\x8f\x49\x7e\xc3\x3c\x3d\xc9\x49\xd8\x7a\xb0\x98\x52\xc7\x87\xd1\x10\x81\x1c\xcd\x62\xf8\xea\x84\x24\x80\x55\x2b\x84\x3f\x2d\x90\x96\x11\x0e\x0b\xaa\xe4\x3f\xa1\xf6\xf2\x8e\x6f\xce\x1e\x17\xfd\xb6\xff\x6e\xaf\x34\xa9\x18\x6f\xd3\xaf\xe3\xd4\x1e\xfb\xbd\x9f\x06\x0f\x5f\xd3\xe0\xe8\x31\x0d\x4e\x9a\x69\xf0\x54\x1a\xd3\x1b\x1d\x4f\x94\x2d\x1d\x7e\xde\xd4\x56\xc5\xb4\x65\x8d\x73\xfd\xb4\xfe\x4c\xff\x56\x35\xfc\x52\x7f\x7f\xd7\xbf\xf7\x1a\x7e\xac\xbf\xa7\x95\xdc\xbe\x67\xdc\x15\xeb\x1a\xff\xf4\x51\x58\xb3\x07\x71\xf6\xa8\x1d\xbb\xdf\x4c\xc5\xce\x87\x52\xf7\x7a\x76\x33\x05\x22\x38\xcb\x90\xe1\x70\xff\x37\x51\x7e\xb5\x38\x9e\x43\xda\xf1\x96\x91\xfe\x9b\x8c\x5f\x5f\xe1\xcf\xf2\x79\x53\xcb\xf8\xfd\x70\x80\xb6\x97\xfa\xab\x45\xfd\x71\x57\xe8\x5f\xbd\x44\xdf\xfb\xb5\x0b\x77\x1d\x15\x02\x34\x64\xd2\x44\x88\x8f\x90\xf5\xce\xb3\x16\xfd\x9a\xe9\xf4\x7a\xef\x9b\x4e\x31\x7a\x4c\xdf\xac\x37\x85\xbf\x42\x78\x2e\x2b\x55\x03\xd4\x92\xac\x5d\x33\x59\xb3\x5c\x76\xed\x52\xc7\x60\x3d\x7c\x65\x32\xbd\xea\x00\x21\x7b\xbe\x2e\xd2\x8e\x19\x59\x0b\xc7\x4c\x6a\x4e\xc3\xd5\x0b\xe6\x17\x9f\x32\x1d\x7e\x91\xdb\x1e\xac\x11\x2f\xcb\x26\x3c\x35\x6a\x7a\xfe\x98\xbd\x07\x4f\x5d\xab\x41\x57\x94\x5f\xb3\x2a\x71\xa4\x59\xae\xf5\xf1\xe9\xeb\xb8\x26\x5d\xc7\x83\x9d\xa0\xa9\x26\xfc\x3e\xd1\xe6\x2c\xef\x7d\xd8\xf5\xe8\x6a\x49\x83\xcf\x9b\x8b\xb7\xdf\x8f\xa9\xd6\x18\x9e\xfb\xa7\xcf\xc8\xb1\x54\x16\x88\x32\x0b\x05\x1a\x31\x2d\x7f\xf5\xb3\xe3\x45\xf5\xac\xa0\x5e\x9b\x06\xc8\xf0\x16\x32\xea\xa3\x06\x5b\x5a\x09\x11\x65\x81\xc8\xaa\x21\xa2\xce\x3a\xf1\xbf\xe6\xe3\xb7\xf2\xb1\xd4\x51\xfc\xc5\x02\x6b\x37\x60\x61\xb1\x0c\x33\xa8\xfa\x2a\x96\x41\x6a\x88\xbf\x89\x66\xa1\x40\x22\x11\xb3\xb0\x58\xa4\x4e\x13\x95\xf5\x48\x24\x9a\x2c\x28\x16\xe9\x2c\x4a\xf3\x52\x27\x2a\x89\x3f\x9d\xa6\xb8\x6b\x12\xea\x34\x61\x5e\x93\x1c\x2d\xe8\xa9\xc9\xa1\x11\x11\x2b\xd5\x0f\x6b\x89\x26\x7f\x26\x77\x7d\xf6\xd6\x1f\x4c\x5a\xa1\xdd\x81\xc5\x3b\x6c\xb5\xcc\x71\xd4\x0e\x7e\xf5\xbb\xd2\x87\x2f\x8b\xc9\x56\x23\x4e\xec\xc6\xf1\x0c\xe6\x7a\xc8\x7a\x7d\xa1\xcd\xbb\x37\x61\x26\x6b\xb1\x24\x6f\xd7\xbf\xe6\xb2\xae\xb0\x58\x5f\x58\x4e\xff\x6b\xe0\xf4\x4d\x43\x0e\x31\x6b\xf0\x3d\x57\xea\x4c\x63\x48\xd8\x30\xc3\x30\x12\x96\x33\xfa\x1a\x3a\x23\x93\x71\x8a\x19\x7f\x5c\x98\x8c\xdd\x47\x59\x8c\x8a\x07\xe7\x33\xea\xc4\xb5\x6e\xb1\xe8\x8a\xa9\x42\x33\x64\x53\x3a\x9b\x35\xd5\xec\x9a\xb0\x4f\x2d\x8a\x2f\xe0\x71\xe2\xdf\x8a\xa0\x32\x60\xf2\x71\xa4\x9e\x8e\xa0\x40\x6d\x44\x17\x2d\xe8\x36\x05\xd4\x56\x2d\x74\x71\x41\x92\x16\x89\x6b\xa1\xcb\x22\x16\xa1\xbf\x90\x45\xb9\x62\xfa\x58\x2c\xa6\x33\x5a\xda\x47\x71\xb0\xa5\x83\xa8\x4c\x67\xf8\xf4\xa1\xc9\xa7\x68\x40\x58\x42\xf0\xd7\x0b\x8a\x0d\x10\xbc\x39\x11\x12\x7a\x72\xe8\xa2\xb2\xe6\xe1\x2b\x6c\x49\xa0\x1f\x36\x79\xaf\x4b\xca\x5f\x93\xbd\xa4\x54\xb6\xff\x84\xc5\x66\x4a\x99\xf5\x35\x29\x14\x9a\xfc\xe9\x9e\xb4\x20\xf3\x89\x24\xd8\x6d\x43\x97\x49\xe8\xf3\xa1\x71\x1c\x69\x74\x3b\xa6\x15\xa3\x17\x28\xf9\x71\xa5\x50\x08\x2c\xd2\x64\x00\x66\xf0\xcd\x24\xbf\xbf\xcf\x12\x7f\xcf\x25\xbe\xcc\x12\x7f\x87\x74\x97\xf0\xa7\x9a\x4b\x7c\x96\x4b\x7c\x9e\x25\x3e\x83\x74\xe7\xf0\xe7\xe1\x9e\xb2\x26\xea\xd2\xc2\x4a\x39\xa9\xd0\xd9\xd2\x15\x9e\x69\xee\xdc\xc8\xc7\xfa\x73\x8a\x45\x49\xb3\x21\xaf\x87\x69\xb6\xce\xe5\xb5\x38\x62\xeb\x03\x4f\x71\xbf\x70\x1c\xcc\x1e\x49\x6c\x19\x2f\x6c\xfa\xe8\xe9\x06\xcf\x8a\x5e\x24\xfe\x4c\x2a\xd0\x0f\x56\x79\xa8\x32\x8a\x94\xc6\xaa\x8d\xaf\xad\xda\xe8\xed\x71\x4f\xea\x3b\x89\x46\x07\x2d\x06\xb0\x48\x3c\xeb\x50\x2c\xce\x41\xc4\xd6\x5e\x78\x42\xbd\xfb\xbf\x79\x7f\x8f\xd6\xcd\x26\xf8\xfd\x3d\xd6\xe1\x49\x45\xb1\x5a\x39\xd3\xfb\x83\xca\x59\xfe\x3e\xb2\x72\x86\x04\x80\x5c\xe0\x6b\x77\x6b\x5a\x76\x17\xa1\xd9\x75\x0b\x6d\xf2\x6e\x52\x11\xb1\x21\xaf\x72\xe6\x84\xa2\x02\x64\x9c\x9d\x31\x0b\x04\x91\xe9\x80\x84\xd4\x00\x27\x67\xac\x6c\x21\xf8\xd7\x8b\x02\xd7\xee\x06\xbd\x46\x12\x13\x9f\x77\x22\x42\x29\xbb\xc6\x7f\x29\x30\x01\xa0\xeb\x84\x22\xe0\x77\x64\xf0\x28\x19\x3e\x1d\x78\xba\xcf\xe1\x1c\x3e\x4a\xb6\x03\xd0\x9b\xe9\xba\x08\xd1\x3d\xd5\xcd\x54\x84\xcc\xd7\xab\x89\xae\xaf\x2b\x48\xdb\x7b\xc4\x17\x61\x18\xee\x43\x38\x56\xe1\x29\x84\x9b\x2a\xbc\x0f\xe1\x96\x0a\xbf\x42\x38\x51\xe1\x31\x84\xbb\xe2\x01\xc2\x2f\x8f\x92\xfd\xdc\x87\x0d\x3b\x7e\x4e\x40\xba\x3a\xa0\x6c\xa8\x3e\x47\x40\xe7\x81\x76\x76\x35\xad\xac\x8b\xf0\xfd\xdd\xe7\xc7\x95\x75\x11\x41\xe0\xfe\x7e\x5d\x7c\xea\x42\xe8\x7b\x65\x5d\xc4\x10\xb8\xac\xac\x8b\x26\x04\xaa\xf7\xeb\xa2\x0f\x81\xb3\xca\xba\x68\x41\xe0\xbc\xb2\x2e\x12\x08\x3c\xdc\xaf\x8b\x21\x05\x84\xc8\xdc\x71\x45\x44\x0c\x90\x89\x2e\x03\x4c\x22\x66\x80\x47\x34\x19\x60\x11\x7d\x06\x38\x44\x0b\x84\xc7\x8a\x48\x18\xe4\x17\x43\x53\x29\x4e\xa0\x9d\xe5\xfc\x69\x59\x6c\x70\x0a\xb5\x57\xff\x9b\x04\x30\x6b\xd5\xa0\xb6\x6b\xae\x13\xe9\xc9\x7b\x47\x28\x1f\x2b\x85\x82\xf2\xf0\x25\xc4\x71\x5d\x85\xcb\x54\x88\x9f\xb8\x52\x29\xe7\x59\xda\xd7\x57\xb1\x48\xb5\x72\x70\xed\xdc\x25\x31\xb3\xa8\x19\xb2\x1a\x50\x86\x1d\x67\x54\x3b\x74\x49\x9a\x82\xb2\x20\xf7\x5d\x86\xe5\x0d\xbf\xf9\xb1\x54\xdf\xb9\x05\x5b\xed\xab\x91\x26\xdc\x5a\xa3\x4b\xe9\x23\xd2\xfc\xcf\xa8\x69\xe2\x76\x37\x57\x58\x73\xa1\x30\xf8\x56\xc4\x29\x8f\x2e\x4a\xb6\x36\xc2\x15\x3e\x6f\x89\x40\x90\x46\x5b\x4a\xab\xcc\x10\xac\x34\x16\xbf\x34\xcc\x66\x4e\xd0\x20\x1b\xfa\x1e\x68\xee\xee\x87\x9f\xca\x61\x1c\x6e\xb0\xd8\x62\xc6\x6f\x92\x7c\x21\x38\x8b\x30\xfc\x0b\x45\x53\x07\x83\xdc\x6f\x85\xb2\x87\xd6\x2f\xd5\x3c\xc3\x9f\x22\x1d\x13\x87\x83\xc3\x4e\x32\x90\x8d\x24\xec\xe9\xb8\xae\xff\xff\xea\x55\x57\x3a\xef\xb6\xac\xb9\xeb\x43\x89\xd6\x61\x85\x37\xc3\xfb\x8c\xfe\x93\x14\x1b\xda\x8d\x04\x1f\x84\xe3\xc1\x06\x1b\x00\xa8\xdf\x6a\xf8\x61\x9f\x6f\xb0\x61\xfa\x75\xdf\xe8\x37\xbc\x46\xab\x31\x98\xfc\xac\xf7\xc2\x7e\xbd\xd3\x0a\x36\x58\xdb\xd2\xb1\x1b\x2c\x81\x60\x63\x1a\x6e\xb0\x11\xe6\x41\x1f\x6e\x67\x8d\xb8\xde\x6a\xc4\xf5\xc1\x59\x67\x14\xf6\x36\xd8\x2b\x44\x75\x1b\xe1\xdd\x40\xf6\x06\xfb\x49\xdc\x0a\x37\xd8\xd8\xc0\x00\xcf\xcf\x70\x3c\xb8\x03\xc9\x61\x83\x75\xac\x79\xf0\x06\xeb\xe6\x20\x07\x78\x33\xa7\xef\xbb\x26\x1a\xc5\x6d\xd8\x6f\x04\x43\x95\xe0\x12\xf5\x98\xd8\x74\x45\x94\xce\xf5\xa2\xd0\x9d\x75\xa0\xb4\x7d\x48\xa7\xac\xcc\x71\x54\x81\x0a\x03\xec\xbf\xaa\xe4\x83\x5c\x6c\xc3\xef\x24\x0f\x8d\x60\x50\xbf\xf3\x65\x2b\x3c\x91\xfe\x00\x90\x1d\x42\x8a\x46\xd2\x6a\x24\x61\xc9\x6b\x75\xfc\xe6\x06\x3b\x02\x50\xd0\xe8\x77\x5b\x72\xf2\xb3\x91\x4c\xb0\xec\xfe\x79\x72\x89\x78\x36\xd8\xb1\x8a\x8f\x22\xde\x69\x05\x47\x72\x20\x79\x23\x39\x0c\x93\x01\x54\xd4\x49\x1a\xd7\x48\x92\xb0\x77\xd8\xe8\xf9\xad\x90\xf7\x64\xd0\x18\xf6\x4d\x91\xa7\x2b\xd3\xa8\x2b\x4b\x93\xa6\x67\x89\x0d\x3f\xec\x41\xa7\x1e\x4c\x36\xd8\xd9\x93\x14\x9f\x36\x32\xe7\xc7\x8a\xbb\x73\x40\xf4\x4f\x08\xff\x36\x58\xdf\x12\x1b\x5f\x3e\xc3\xbf\x0d\x76\x01\x11\xd0\xf9\x1a\x68\x93\xcf\x10\xfe\x1d\xc1\x83\xac\xa9\x2e\x11\x50\xc7\x8a\xac\x60\x78\x85\x19\xbf\x0d\x76\x85\x51\xbe\xaa\xfd\x81\x25\x36\xfe\xe7\x9f\x7f\x2c\xcb\xb2\x36\xd8\x35\xc4\xfc\xcf\x9f\x7f\xfe\xb9\x91\x33\xe7\xa9\x3b\xee\xeb\xaf\xbc\x4e\xa9\x16\x1a\xa6\x57\xe9\xd9\xb7\xb6\xdd\x38\xb4\xd8\xeb\x2f\xea\x0c\x71\xdc\xde\xfd\x2d\x56\x9d\xfc\x63\x96\x13\x65\xd8\x59\xa2\xef\xb5\xec\x19\xb9\x41\x97\x9d\x4c\x07\x42\xf2\x6e\x23\xe4\x61\x03\x8f\x64\x20\xf9\x76\x00\x12\x5f\x24\x2c\x27\xfa\x1a\x28\x01\x28\xca\xc4\xa3\x58\x04\xb5\xc8\xe5\x7e\xc0\x9a\x2a\x14\x04\xac\xa5\x42\x8f\x15\x96\x88\x68\x2b\x64\x5d\x91\x14\x43\x27\xf9\xda\x2d\x14\xca\x7f\x5b\x48\x45\xe2\xf2\x6e\xe0\xd0\x91\xb9\x3f\x42\x10\x83\x79\x95\xa1\x6f\xaa\x56\xa1\x60\xe2\x5a\x08\x46\x0a\x5b\xa2\x5b\x2a\x3b\xad\x6f\x22\x71\x4a\xa5\xd6\x5c\xee\x96\xca\x3d\x93\xdc\xeb\x1a\x11\x77\x7a\xa5\x8f\x4c\xd8\x8f\x27\xb3\xa7\xe3\x5e\x97\x32\x3c\xe0\xd0\xcc\x33\x9d\x94\xe6\x5e\xce\xe7\x8d\xc4\xe4\xee\x72\x70\x0d\xb9\xcd\x1e\xea\x9f\x28\xe4\x91\x90\xbc\xe2\xa1\x53\x8b\x6e\x23\xac\xdd\x8d\x5d\xd6\x14\x5e\x6d\x38\x51\x4f\xe7\x79\xd5\x33\xdb\x1a\x4c\xc0\x8f\xa6\x2c\x11\x00\x86\x8a\x51\x47\x4b\x5d\x3c\x5a\x6a\xf2\x71\x31\xe1\xcd\x88\x8f\x59\x93\x4f\x54\x70\x42\x9d\x2e\x0f\xe4\xea\xb8\x62\x0b\x62\xc7\x11\xc6\xc6\x3a\x2a\x06\x38\xde\x6e\x27\xfc\x17\xfc\xe9\x06\x78\xc4\x9f\x43\x73\x56\x4f\xd1\x9c\xd5\x55\x11\xcb\x48\x34\x8a\xae\xc6\xa3\xde\x96\x9d\xf0\xbe\x24\x5d\x96\x68\x33\x34\x21\x9e\xea\x7b\xfc\x70\xf0\xfe\xee\xf1\xe4\x95\xce\xf1\xa8\xcf\xc1\x93\x94\xb9\x1c\x76\xca\x12\x43\xcf\x1c\xe1\x94\x01\x9e\x42\x81\xa4\xd1\x5e\x46\x2e\x06\x31\xd1\xc7\xb1\x14\x30\x1c\x0e\xe6\x31\xa4\xf5\xe6\x99\x7a\x63\xab\x62\x3f\xa9\x68\x3c\x5e\x3e\x51\x97\x19\x1e\x7f\xb8\xc4\x8b\x10\xe1\xf1\xf8\x75\x0f\xfe\x28\xde\x6d\x4f\xfd\x3a\x1e\xdf\x7c\xd9\xb3\x40\xfe\x69\x9e\xa0\xf2\xbe\xc7\xab\xd3\x3d\x40\xd0\x6d\x12\xe0\x2d\xad\x4b\x16\x52\x9b\x98\x36\x67\xaa\xcd\x75\x82\x52\x40\x19\x36\x42\x3e\x83\xc5\xca\x7f\xe3\xf5\xcc\x72\x14\x44\x7c\xfe\xa2\x23\xe7\x10\x41\xe9\x0b\x19\x80\x32\x06\x70\xcc\x82\x38\xcb\x1f\x26\x81\x68\x9d\x40\x5d\xeb\xb0\xac\xd5\x59\x48\x97\x39\x50\x75\x78\x3d\x4d\x6b\xf8\x7a\x0a\xcd\xdb\xfd\xb0\xf6\x75\xd1\xab\xba\x9b\x07\x3d\xcd\xd3\x3d\x36\x8f\x62\x32\x48\x51\x4c\x06\x1f\xa2\xc8\xb8\x40\x1c\x9e\xee\xb7\x0b\x1c\x38\x1e\xbf\x68\x14\x0a\x11\xbf\xff\xb3\x50\xb8\x79\x92\x44\xb2\x4f\x00\x62\xea\xf1\x8f\x2f\x3c\x7e\x99\xd0\x37\x9f\x57\x3d\xe5\x05\x4d\x71\x1b\x20\xb7\x00\x55\x0c\x99\xd0\x84\xb2\x00\x08\x5d\x11\x03\xfd\x2c\x00\x42\x11\x72\x5d\x37\x71\xd7\x75\x35\x46\x21\xec\x07\xea\x37\xd0\xbf\xbf\xf4\xaf\xae\x83\x0c\xf5\x59\x9a\x1d\xbb\xf9\x87\x88\x57\xa3\xed\x66\xe8\x73\x35\xa2\x81\x66\x30\xeb\xcd\x08\x8c\x66\x1f\x46\xf3\x12\xef\x9d\x7d\x2c\xa9\xb3\x9f\xe3\x3a\xac\x20\x2c\xac\xac\x86\xa9\x3a\x40\x68\x2e\xf7\x6a\xe8\x1c\x5d\x6a\xdc\xa9\xf6\xf1\x61\xa6\xf1\xf8\xe0\xbe\x50\x80\x14\x77\x01\xf1\x6a\x8d\xc0\x65\x1e\x1f\xde\xf3\x71\xb1\xc9\xc7\x2a\x38\x29\x36\xb1\x1b\x44\x95\x5a\xcf\x65\xfb\x17\xf0\xdf\xe3\x1e\x6e\x08\x9b\xe2\xe2\x07\xa9\xb5\x2d\xe6\xd5\xba\xbe\xeb\xc2\xce\xf0\x53\xc8\xd5\x81\xfa\x51\xa8\xce\xbb\x9b\x90\xd0\xe3\x7d\x0f\xaf\x12\x21\x7d\xb5\x6f\xd2\x33\xc9\xcf\x4e\x08\x44\x42\x4d\xe5\xd4\xcc\x14\x89\xe9\x13\x3a\xbe\xf9\x42\xf5\xe8\xd7\x4d\xa3\xdb\x05\x1b\x05\x5b\xc4\xd4\xb8\x9f\x73\xcf\x60\xea\xda\x51\x75\xad\xbb\x92\xee\x61\x0e\x36\xf6\xc7\xe8\x72\xa3\xc6\x49\xab\x30\x2b\x25\xef\x74\xef\xc7\x93\x3e\x61\xcc\x5c\x0e\x55\x89\xe4\x47\x03\x26\x29\x0b\x20\x5c\x0b\x26\x2e\x93\xea\xf5\xeb\x09\xae\x6e\xd3\x2b\xed\xf9\xd8\x9b\xf7\x7c\x2c\xbc\x5a\xec\xb2\x96\x08\xd5\x42\x98\x98\xc0\xd2\xba\xb6\xd9\xe0\xe3\x22\xdf\x65\x18\x9a\x14\xf9\x6e\xba\x1c\x85\x5f\x7e\x0f\x1f\xf6\xe6\xe1\xc3\x9e\xc1\x94\xc6\x84\x6a\x6c\x37\xf9\xa5\xcf\x12\xf8\xec\x84\xab\x8a\x64\x4d\x1e\x7c\x61\x4d\xde\xaf\x4b\x48\xe6\x93\x26\x97\xfb\xac\xa5\x42\x1e\x86\x42\x90\x0b\xa2\x5c\x28\x31\xdd\xe6\xfa\x94\x35\x75\xb7\x09\xb4\x85\xb4\x26\x54\xab\x12\xbd\xda\xbb\x2b\x8c\x0d\x4d\x13\xe2\x71\xaf\xab\xd5\x5b\x5f\x40\xf0\xd0\xdb\x3c\xf4\x5f\x63\xc4\x0e\x27\x53\xd0\x40\x37\x36\x4e\xe7\x86\xf8\xcc\x42\x49\x05\xbd\xd6\x28\x40\x19\x9a\x53\x03\x7c\xe1\x2b\x37\x36\x4e\x2a\xd7\xf8\xfa\x5d\x87\x57\x49\x95\x64\xeb\x3b\xda\x9a\xbb\xa2\xd1\xab\x7c\xa4\xa4\x7d\xfd\x82\x72\x4a\x7a\x9a\xec\xaf\x35\x92\x35\x8f\xb7\x74\x77\x6e\xd5\x7c\x97\xf7\x3d\x73\xe2\xa4\x07\x45\x5d\x12\x9f\xba\xd4\x99\xfc\xd2\x6f\xd9\xe9\x2c\x93\x1d\x6b\xfe\x57\x2d\x3b\xa6\x90\x0b\x77\xcf\xb2\xcb\xae\x93\x97\xd9\x7c\x97\x05\xd0\x89\x03\x1e\x04\x74\x66\x08\xad\xef\x2c\x54\xe6\x32\x5d\xd9\x78\x49\xab\x2c\xc0\x2a\x6b\xa1\xcb\x6b\xfc\x84\x0a\x53\x9f\x46\x5c\xfb\x37\xda\x58\x24\x42\x20\x27\x14\x21\x0f\x82\x94\xd2\x40\xbb\x0c\x8a\x60\x0e\xca\x5d\x3a\xdc\x3e\xad\xb0\xd8\x97\xf3\xe1\x11\x8b\x18\x1f\xcf\x37\xd5\xaf\xf3\x28\x49\x13\xb6\x1d\x68\x1d\xb2\x36\xf1\xdd\xed\xcf\x7c\xe7\xf3\x17\xad\x76\x10\x03\xa4\x18\xb0\x44\x34\x75\xa8\x2b\xee\xb0\x84\x88\x79\x68\x4a\x0e\x8d\xb7\xf6\x45\xcd\x65\x43\x67\x47\x08\x7f\x8f\xf8\xaa\x38\x26\x05\x16\x38\x14\xfd\x13\x6a\x23\xf4\x54\x01\x21\x72\x28\xf6\x2f\x96\x0e\xaf\xd5\x30\x1e\x99\xf3\xeb\xb0\x36\x72\xd9\x81\xe8\xd6\x46\x6e\xf6\x6a\xfb\x40\xc5\x1e\x89\x9b\x1f\xc4\x63\x53\x18\x2c\x31\x8b\xd8\x01\xbf\x3e\xa7\xec\xca\x40\xbd\x7d\xd6\x44\xe8\xcd\x39\x65\x15\x51\xb9\x94\x04\xbd\x6d\x5f\x12\x9f\x1d\x80\x28\xe5\xf4\x51\xfd\x29\xf8\x62\xef\xb0\xcd\x86\x0d\x09\xa6\xfc\xea\x0b\xd9\x7f\x26\x07\x7c\xc2\xa6\x7c\x72\x55\x9b\xb8\xf8\xab\x1e\xb8\x53\x16\x7e\xb1\x25\x1b\xf6\xec\x0a\xeb\x6b\xe7\xca\xa9\x36\x49\xdf\x52\x0a\x7f\x33\xca\x2e\xfd\x45\xfb\xe5\x7d\x0b\x55\xf9\x58\x35\x56\x29\xa6\xaf\xd2\x0e\x98\xdc\x57\x76\xd1\x6d\x64\xc1\x93\x76\xcc\x64\xe2\xd7\x3b\xca\xfb\xf2\xed\x2d\x81\xb5\x0a\x17\xaf\x73\xfb\x67\x83\x1c\xf1\xf3\x05\x0d\x2a\xad\x25\x3d\xb6\x2d\xf6\x69\x62\x13\xaf\x74\xc4\xcf\x61\x1b\xb5\xd5\x62\xad\x30\x89\x07\x75\xfb\x88\xc7\x75\x86\x65\xc8\xd9\x8c\xb2\xef\xbe\x3d\x64\x17\xbe\xbd\x7f\xc1\xfa\x9e\x7d\xc4\x07\xe1\x1e\x94\x6d\x5f\xb3\x53\xcf\xb6\x66\xec\xf5\x15\x88\xf0\x32\xba\x3c\xa4\xab\xf9\x5b\xba\xae\x7e\x47\x17\x90\x55\x2c\xd3\xad\xc4\x50\x74\xb5\x9a\xa2\xfe\x09\x50\x74\xa5\x28\xf2\x32\x8a\x26\xaf\x50\xfc\xf8\x55\xda\x43\xd6\x48\x82\x70\x6c\x4f\x61\xb6\x9b\xd1\xd4\x0f\x70\x3f\xb7\x84\xdc\x3d\x2d\x18\x3a\x34\xcb\x01\x76\xeb\x62\x04\x2b\x82\x0e\x25\xe2\x67\x83\xc4\x79\xc2\xd3\xc4\x37\x3f\x88\xcf\x24\xb4\x49\xc0\x3c\x16\xe0\x71\xaa\x86\x79\xfb\x2c\x54\xb0\xd4\xd4\xdb\x77\x3b\x66\x8f\x65\x5b\xf2\xe0\x1f\x56\x9d\xa8\xdf\xeb\x73\xbb\x89\x4d\xc1\x6e\xce\xed\x96\x0a\x6d\xde\xd9\x11\x93\x3f\xed\x68\x36\xa3\x4e\xfb\x99\x24\x2b\x2b\x6d\x4d\xf2\x2a\x8a\xca\x93\x19\x88\xf6\xf1\x33\x49\x7e\x97\x3a\xae\x49\xde\xff\xee\x72\xff\x9f\x52\x5c\xf3\x74\x50\xeb\xfd\x77\x45\xcd\x75\xac\xaf\x09\x5e\xad\x74\xa1\xaf\x27\xbc\xdb\xe9\x92\x9c\x6b\xe6\xbe\x7a\x10\x3f\x14\x16\x1b\x39\x23\xf1\x6a\x29\x4b\x87\x2c\x66\x5d\x14\xc6\xd6\x89\x25\x84\x48\xf0\x46\x75\xc4\x07\xdf\x0b\x85\xf2\xee\xd7\x21\x75\x28\x7c\xec\x91\x61\xb1\xc8\xfa\x85\x42\xf8\x4c\xba\xac\x4f\xa9\x3d\xc4\xdb\x2b\x5d\x0a\xc3\x22\xfb\x94\xb5\x21\xfa\x5f\x79\x55\xe8\xfb\x20\xde\x28\x74\x6c\x99\x1e\xea\xc8\x0c\xf6\x09\x81\x28\x56\x0c\xbe\xbf\xbf\x93\x91\x48\x1b\x65\x6d\x54\xab\x8e\x73\xaf\xc3\x5f\xad\x7c\xaf\xa0\x6f\x16\xce\x33\x50\x54\xcd\x72\xf9\xe6\x9d\xb0\xd8\x75\x83\x84\x94\xcb\x9f\xc2\xca\xdf\xc8\x81\x64\x81\x53\x52\x6c\xae\xd4\x9a\x22\xd4\x92\x45\x2d\x2e\x95\x5d\x90\x2c\x6a\x71\x11\x03\xc9\x5e\x50\x4b\xb0\x09\xd4\x84\x51\xda\x55\x6e\x92\x9c\x26\xaf\x84\xd2\x18\x00\x51\x17\xc0\x4d\xfe\x58\x66\xad\xbd\xa0\xd6\xd2\x19\x6a\x13\xb7\xb8\xab\x9c\x2e\x51\x6d\x2d\x06\xd3\x24\x94\xce\xa4\xf8\x99\xf6\x6b\x3c\xbd\x0d\xc4\x7a\xd9\x89\xc4\xdb\xcc\xc9\xce\x8b\x3f\x20\x53\xc2\x4f\x22\x48\xab\xd6\xdf\x77\x4b\x2d\xb4\x11\xd7\xe4\x9b\x77\x74\x1b\x36\xf9\xa4\x85\x86\x20\x55\x64\x93\xcb\x9f\x74\xdb\x67\x89\xba\x79\x4d\x8a\x1c\xb6\x5a\xea\xa3\x8b\x1f\x7d\x91\x7c\x6d\xf2\xeb\xf3\xf7\xf7\xee\xd7\x26\xbf\x39\x57\xef\x54\xfa\x4e\x54\x6b\x02\x1b\xe2\x6d\x62\x23\x2a\xe8\xff\x09\x74\xfd\x2e\x1b\x7c\xb7\xfb\x66\xa8\xbe\xb5\xe4\xa4\x33\x1c\xd8\x11\x40\xe7\xfc\x2d\xff\x5c\xb5\x62\xdd\x3f\xaf\xb4\x1c\xfc\xa6\xe7\x22\xe8\x3c\xda\x53\x55\x75\x52\x22\x92\x5f\x9f\x6f\x79\x45\x09\xbc\x31\xaf\x33\x18\x74\xda\x18\x53\x24\x92\xdf\x9c\x6f\xf9\x45\x09\xec\xc1\x94\x13\xc3\xb8\x88\xa1\x73\xa6\xc8\xf3\x56\x67\x40\xa8\x18\x74\xba\xa6\x2b\x59\xb0\xa0\xa1\xaf\x0e\x63\x08\x1d\xaa\x30\x60\x16\x9d\xd9\x39\xb0\x57\xab\x34\x88\x4f\x4b\x65\x17\x6b\x14\xe2\xb7\x77\x66\x78\xd1\xba\xb2\xa0\x10\x0b\xc2\xee\x91\xea\x3b\x89\x00\x0d\x23\xec\xbd\x69\xf2\xb5\x81\x4b\x44\x18\xaa\x02\xe7\x62\x74\x99\xc5\x32\x12\x8c\x49\x56\x95\x09\x9b\x94\xc8\x5c\x99\x4b\x28\x15\x5a\x5b\x1a\x3e\xa5\x56\xbf\x2a\xc5\x78\xe1\x25\x82\x9a\xef\xa6\xe6\xcd\x7d\x55\xab\x3e\xdf\xbc\x2b\x69\x2b\x6c\xcc\xa2\x90\x30\x12\x44\x16\xfd\x2d\x12\xee\x95\xed\x88\xd2\xed\x1d\x67\xbe\x79\x22\x6c\x9b\x52\xb4\x8a\x9e\x4f\x5e\x9e\x20\x4f\x55\x19\x06\xfa\xfb\xee\x02\x41\x9e\x08\x6a\x9e\xeb\x78\xc6\x4c\xa8\x6a\x4c\x8f\xcb\x9f\xab\x08\xf2\x3e\x26\xa8\x14\x99\x6e\xb1\x92\xa6\xcc\x32\x9a\xa6\x83\x85\xaa\xe4\x79\x2c\xfb\xcf\xc4\x67\x21\x0c\x68\x65\x82\xa9\x12\xa2\xd5\x1b\x5a\xf2\x01\x69\x58\x28\x2c\xe1\xcd\x94\x3f\x0c\x0e\x02\x78\xf9\x63\x39\x65\x99\x6e\x61\x6e\x35\x70\x7f\x9c\x48\xd4\x66\x5d\xb9\xa4\x9a\xbe\x0f\xb9\x8a\xc4\x83\x9f\xf7\x77\x8b\x66\x1e\xdb\x8a\x04\x2d\xb9\x22\xd0\x8c\x02\xa8\x5e\x48\x5c\xf1\x31\xf1\x6c\xb6\x7a\x36\x56\xd5\xa9\x2d\xde\x63\x1f\x41\xfc\x30\x1d\x29\x23\xf8\xd0\xc9\x3c\x33\x43\xa9\x54\xd0\x70\x88\x18\xdf\x57\x65\xae\x15\x82\x95\xba\xde\x9f\x9a\xe6\xba\xd4\xa3\x8b\x15\xeb\x63\x9d\x03\x1f\xca\x1e\xbc\x26\xde\x07\xe4\xb3\x59\xce\xac\xc2\xaf\xa7\x39\x43\x76\x8f\x0d\x22\x57\xda\x17\x07\x31\x41\x08\x6f\x46\x95\xe3\x00\x63\xa3\x54\xbb\x82\x46\x0f\x2f\xd0\xd5\x05\x08\x80\x7f\x7e\x28\xb3\xed\x18\x99\x6d\x66\xb8\x0b\x72\x92\xf6\x78\xee\xc1\x8e\x52\xaa\xf5\x84\xc7\xef\xc8\xd9\x31\x7b\xf8\x69\xde\x7c\xff\x2d\x2a\x30\xf4\x5f\x9f\x32\xcf\x23\x0f\xcf\x52\x58\xdf\x10\x7c\x14\xb3\x32\x75\x1e\xe7\x0e\xd6\x35\xca\xd9\x23\x19\x5b\xec\xf1\x17\x75\x2e\x25\x19\x5b\x73\x6f\xdf\x74\x79\x57\x3c\x68\x88\xe8\x42\x7b\xb1\xe2\xcf\x81\x38\x57\xea\xe5\xb5\xe3\x17\x97\xfd\x1c\xa5\x0e\xae\xf8\x0f\xbf\x20\xd6\xd3\x64\x59\x86\xd4\xad\x2e\x3f\xaa\x8b\x34\x94\x39\x66\x81\x2f\xd8\x90\x88\xb9\xaf\xe5\x78\xde\xdc\x15\xa6\x60\x7e\x47\x8e\x9f\xf0\x35\xdc\x42\x9a\xde\x7d\x3e\xcd\xc9\x93\x64\xfc\x4b\x4e\x20\xc9\xe9\x34\xfc\x52\x37\xa0\x52\x5d\x91\x5a\xdf\x34\xb0\x76\xee\x12\xc9\xca\x34\x73\x9e\x77\x15\xc6\x72\xd0\x18\x85\x6b\xe8\x6c\xaa\xbf\x26\x7b\xe1\x5a\x43\x9b\xaa\x89\x3a\xbd\x35\xb9\xd6\x6d\x84\x6b\xe8\xe7\x88\x6f\x50\x67\x6c\xf1\xb0\xf6\xdd\x77\xd3\xc7\x55\x33\x80\xc1\xfe\x6e\xf2\xf7\x0a\xfd\xb5\xeb\xfe\xcc\xf9\xa4\xe2\xc7\xab\xe2\x95\x29\x01\x9d\xe2\xf5\xef\x0f\x9e\x15\x5c\xa5\xfe\x96\x7f\xa9\x6b\xe8\x75\x71\x5c\xcf\x58\xf8\x61\x08\x5c\x53\x37\x75\x6b\x75\x39\x0a\xd7\xe4\x5a\xd4\xe8\xf5\x07\x6b\xca\x93\xf2\x5a\x27\x5a\x1b\x4c\xba\xe1\x5a\x1f\x87\x90\x76\x11\xe8\x39\xc6\x74\xb1\xde\xae\x7b\x7c\xdf\xa8\x2e\x1f\x46\xb5\x08\x37\x88\xa1\x12\xf3\xd4\xed\x8c\x51\x52\x2d\xf3\x2f\xe5\xbf\xb7\x3c\xde\x6d\x2b\x65\xac\x63\x17\x0d\x9d\x6f\x91\x72\xa9\xbc\x8d\x91\xb4\x14\x83\xac\x21\x64\xdd\xf8\xcc\x38\x69\x11\xe3\xad\xe1\xd4\x2d\x86\x0c\x47\x27\x7e\x60\x21\xf3\x29\x60\x8f\xa7\x12\x44\x10\x2e\xc6\x94\xda\x81\x10\xd7\xfd\x15\xd8\xb2\xb4\x18\x2e\x85\x4b\xf8\xa2\xda\xa9\x5b\x8a\xf3\x25\x22\xb6\xdb\xa3\x3d\xb2\xba\x64\x9c\x0d\x35\x27\x5b\xc4\x57\x16\xaf\x71\x0e\x8b\xa9\x26\x39\x25\x23\xc4\x29\x32\x5e\x20\x04\xcb\xf8\x0d\x5b\x98\x42\x3d\x45\xf3\x85\xc5\x52\xfb\x7d\x8a\x03\xf4\x31\xa1\xd6\x6e\x35\x67\x36\x45\xac\x84\xa9\x60\x7b\x47\x69\xbc\x1d\xbb\x44\xa5\x2e\xa2\x49\x5d\xa5\xb9\x6e\xc0\x40\x91\xca\xb9\xbd\x43\x1d\x0f\x86\x6f\x81\x34\xb7\x04\xff\x9b\xf9\x22\xde\xde\x65\x61\x49\xf8\x10\x85\x67\x21\xcf\x81\xb9\xca\x79\xf3\x03\x3b\xde\xf2\xb2\x01\xc7\x82\xc0\x6e\xe6\x01\x33\x16\xab\x54\x18\x33\x73\x3c\xf1\xd6\x6d\x84\xf6\x9b\x8f\xd7\x9d\xb6\xde\x25\xe3\xae\x1e\x52\xe1\x41\x08\xfc\x06\x01\x3b\x9a\xda\x3e\x0b\x1b\xb6\x97\x8d\xf9\xbd\x5a\x8b\xc5\xae\x5d\x8b\x59\xcb\x9d\xb1\x43\x09\xcb\x2b\x2a\x3b\xfc\x0b\x5a\x2c\x3c\x45\x58\xcb\x11\x64\xd0\x38\xf7\x4f\xa9\x25\x53\x27\x9a\xef\xd3\x8e\xc7\x0f\xf5\xbb\xa0\xc3\x88\x37\xba\x04\xbe\xa9\x1d\x09\xf1\xe3\x28\x0f\x7e\xd0\x28\xd0\xb3\x8b\x38\x3b\x2d\x14\xaa\xd9\x8d\xdb\x3e\xd3\x8f\xca\x0f\x23\x7e\x26\xe7\x4c\x2d\x3c\x3e\x2d\x99\x3c\xbf\x62\xa1\x78\x9b\xb1\x48\x3c\x80\x50\x06\xb3\x6b\xd7\x62\xd7\xf8\xd8\xac\x76\xe2\x6a\x0b\x81\x1e\x7f\x85\x21\xe9\xf1\xc6\xb3\x5a\xcf\x9d\x80\xff\xf0\xf7\x48\x20\x24\x74\x00\x16\x09\x8f\xda\x4d\x11\x88\xc8\x09\x79\xd2\xe9\xb5\x65\x6b\xf1\x55\x61\xa0\xce\x0a\xf0\x54\x41\xb2\x43\xe5\x74\x6f\x5d\xf8\xe8\x47\x86\x3a\x21\x7f\xf5\x16\xb3\x34\x73\x59\xe2\x55\x59\x1a\xcf\x8b\x59\xa2\x5c\x16\x6f\x39\x8b\x9e\xdd\xc2\x6c\xdd\x85\x9a\xcc\xd9\x6b\xbe\x62\xbe\xf0\x6a\x20\x24\xf0\x7d\x14\x63\xa5\x90\xaa\x1e\x61\x83\xad\xd7\xd8\x9a\xeb\xa0\xae\x0a\x7a\xfa\xd9\x61\x0f\x9e\x5d\x0b\xa4\x9b\xbe\x4b\xc7\x4b\xdb\x2c\x81\x2c\xe6\x93\xf8\xe2\xe1\x96\x04\x39\xcf\xa3\x7e\xed\xc2\xfd\x16\xee\xe1\x35\x08\x16\x59\x44\x15\x3e\x33\x3c\x4b\x92\x01\x1c\x87\x27\x86\x70\xf8\xe2\xf4\x9c\x35\xeb\xfd\xd3\x82\x15\xdc\x2b\x54\xf4\xff\xe5\xb1\x50\x78\xe9\x25\x69\xa4\xc2\xfc\x68\xca\x62\x11\xa0\x7f\xa9\xa6\xf8\xf1\x8b\xa4\x0d\x3f\x7d\x92\xec\x9a\x52\xd6\x12\xaa\x9f\x34\x59\x99\xb2\x44\x44\x1d\x1d\x3f\x7e\x92\xec\x4d\x7a\xb6\xcf\x5b\xcd\xec\x51\xac\xcf\xbb\xed\x19\x6c\xa9\x36\x0d\x9e\x8e\xc5\x2a\xe7\x92\xf9\xfc\x39\xd8\xbb\xb1\x3b\xe7\xb0\xc5\x4a\x23\xfb\x4f\x92\x5d\x9d\x4b\x36\x8e\x29\x1b\x8a\x5b\x03\x1e\x3e\x49\x56\xde\xfe\x6b\xc7\x82\x1d\xf2\xb9\x81\x1e\x3d\x49\xca\xa6\xe2\xa7\xf9\x9e\x3c\x49\xe6\x75\x25\x65\x07\x59\xce\x17\x0b\xc4\x0f\x0c\xd7\x0e\x9e\xa4\x2b\x76\x1c\x9f\xb7\xa0\x91\x7c\xfe\x3d\x81\x5f\x3c\x56\x63\x57\xac\xe2\x20\x49\xe4\x48\x48\xbd\x52\x9f\xc2\x4a\x6d\x95\x29\x3b\x12\x7e\x36\x93\x6c\x91\x72\xf1\x68\x0e\x06\xf3\x81\xc5\x8e\x5c\xbb\x76\xc4\x2c\x97\x5d\x89\xda\x7a\x99\xad\x5b\x2e\xab\x88\x9a\xc1\x15\x9d\x30\xbe\x4b\x99\xf9\x0c\x4f\x58\x99\xba\xd4\x26\x47\xa2\xa6\xb3\xa8\xf4\x65\x97\x3a\x3e\x4a\x1e\x66\x0e\x09\x61\xbe\x88\x60\xfa\x50\x0d\xa4\x66\x26\x15\x0e\x02\x9c\x47\xdc\x99\x93\x29\x1f\x7f\xaa\xae\x10\xf1\x03\xe1\xf3\x56\x4d\xe2\x81\x62\x59\x08\x8f\x4e\x2c\x12\xb0\x3e\x0b\x72\x77\x1e\xa1\x4a\x53\x8a\x5d\xc7\xc4\xb2\x90\x42\x38\xd4\xe1\xd9\x8c\xe1\xdb\xa7\x7c\x09\x66\x74\xf8\xe6\xfc\x56\x96\xca\xa8\x6d\x10\x64\x20\x0b\x00\x4e\x19\x2d\x47\x79\x7b\x13\x8b\x78\x0c\xe6\x37\xbb\xfc\x55\x16\x0a\xc4\x2b\x14\x82\x3d\x62\xa0\x2c\xa0\x4c\x17\x0f\x61\x6a\x7b\x30\x91\xbc\x4d\xf6\xed\x6a\xc8\x82\xc8\xae\x86\x33\x96\x4b\x4b\xed\x00\x5f\x5f\x2c\x25\x48\x11\xa0\x56\x2d\xbb\x13\xf3\xd5\x62\x8e\x45\xb0\xcd\xa1\x2b\xe0\x88\x6c\x04\xb6\x54\x07\x75\x1e\x9b\x77\xca\x78\x5c\xb7\xdf\x9e\x63\x3b\x60\xb7\x91\x1d\xb0\xc7\x91\x5d\x81\x76\x7b\x82\xdf\xb2\xcb\xc6\x65\xfb\xf4\x80\x4d\xca\xf6\xc9\x01\x3b\xf3\xe0\xef\x25\xfe\x1d\x0d\xec\x75\x8b\xdd\x1e\xdb\xeb\x16\xec\xc2\xd5\x61\x5e\xc8\x6e\xed\x68\x46\xed\xff\xa0\x54\x9c\xa9\x82\xc5\x9c\xc8\xd0\x7d\x5a\xbd\xac\x2d\xf5\xd8\x0d\x1b\xec\xd3\x85\x14\x6d\x59\xbb\x70\xd9\x99\x14\x16\xbb\x07\xe1\xf2\x5e\x7e\xbd\x90\x4e\xb1\x78\x2f\xb3\xe3\xfb\xd3\x10\x92\xdd\x4b\x97\x5d\x28\xab\x72\xec\xc6\x17\xa7\xd8\xbb\x4e\x43\x08\x04\x01\x4b\x42\x71\x84\x49\xfa\xbe\xb8\xc2\x40\x18\x08\x8b\xbd\x46\xc2\x62\xbd\xa6\xb0\x58\xbb\x2e\x2c\xa7\x5d\xff\x1a\x3b\xed\x7a\xb1\x48\x7b\xcd\xa2\x08\x40\x56\x6d\xd7\xd9\xbd\x2c\x96\xe9\xfb\xbb\xd2\x9b\xce\xd2\x15\x8b\xed\xba\xea\x31\xe3\x68\x29\x2d\xfb\xf1\x22\x02\x7e\x2c\x53\x18\xdb\xcc\x12\x59\x94\xd5\x9f\xd3\x68\x8b\xb2\xeb\x67\xf1\x1a\x6d\xf7\x9a\x4c\xc6\xe2\xfa\xb9\x38\xc6\x70\x35\x16\x32\x2e\x5d\x3f\x7f\x13\x43\xa7\x1a\xef\xbd\x46\x45\x31\x8e\xec\x30\x80\x1f\xb5\x5a\xf5\xc4\xe0\x49\x16\xcf\x24\x9b\x76\xd3\x81\x1e\xf7\x8a\x57\x4f\x92\x49\x3e\xf4\x6a\xed\xfa\xff\xe2\xef\x85\xeb\x52\x48\xf3\xe3\x17\x99\x76\x29\x6b\x4c\xf4\xb4\x37\xed\xb2\x0a\xd4\x05\x65\xc1\x21\x6c\x71\xd4\x34\x13\xf7\x8a\x77\x6d\x89\x44\xf6\xb2\xc9\x27\xee\x15\x2f\x9f\x24\x3b\xa0\xc5\x24\x64\x8f\x71\x36\x57\xc6\xbd\xe2\xf7\x27\xc9\x12\xd8\xc4\x66\xf3\x59\x2d\xee\x15\x2b\x4f\x92\xf5\x4e\x5c\xdc\x45\x8c\x23\xf1\x84\x65\x9e\x49\xd6\xae\xb3\xeb\x67\x26\x63\x36\x8e\xd8\x8f\x17\x56\x7f\x66\xd5\x98\x85\xec\xc6\x67\xa7\x21\xab\xf7\xd8\xa7\xe0\x90\x75\xd9\x63\x0c\xf4\x35\x26\x6c\xd0\x81\x69\xa4\x05\xdd\x6b\x1c\x51\xa7\x1a\x67\xa5\xc4\xbd\xe2\xc5\x93\x64\x7d\x10\xad\xaa\xf1\xfb\xfb\x88\x52\xe7\x8e\x6c\x46\x80\x73\xda\xad\x9d\x40\xcf\x61\xd5\x98\x3a\xf7\x52\x88\x0b\x59\x2a\x17\x0a\x11\x39\x93\xec\x42\x52\xe7\x4c\x16\x45\x79\x66\x7d\x0d\x61\xd0\x5d\x3f\x8b\x72\x29\x0c\x74\x13\x94\x81\xdc\x30\x80\x36\xd4\xfb\xdd\x30\xc0\x26\x9b\x42\x0f\x53\x7c\x94\xca\xf0\x7f\x81\x8f\x75\x2b\xe5\xe3\x00\xea\xc9\x62\x5d\x86\x5e\x72\xf0\x34\x16\xc8\x5c\x1f\x15\x0a\x77\xe4\x1a\x12\x37\x81\xbe\x52\x19\xfd\x88\x3a\xf7\x38\x7a\xfc\xc0\xbe\xf1\x61\x4a\x3c\x0d\xd9\x63\xc5\xbe\x80\xdd\x6f\x46\xfa\x2d\xb9\x98\x37\x04\xac\x75\xba\xb4\x01\x76\x4f\xdb\x5e\xef\x9c\xdb\x99\xfb\x98\x7d\x65\x3b\xfd\xa6\x9e\xc1\x82\xc8\x31\x36\xda\x73\xb0\xe2\xd9\x7e\x11\xd2\x17\xaf\x43\x73\x32\x7f\x9d\x5b\x78\x9f\x16\x4f\xe6\x91\xab\x84\x75\x59\x9f\x0d\xd9\x88\x4d\xd9\x01\xc3\x95\x47\x8d\x88\x5b\x58\x9a\x61\x82\xbe\xe5\x3f\xfc\xf7\xf7\xf2\x57\x31\xa4\x43\xa1\x8c\x9d\xdd\x81\x14\x76\x2f\xc2\x52\xe0\xc4\x63\x72\xc7\x22\xea\xdc\xf1\x20\x12\xb1\xf3\x28\xc9\x1d\x3b\x82\xcf\x6e\x28\xae\x9c\x3b\x75\xcd\x2c\xe0\x53\xcb\x5a\x4e\xb5\x4b\xee\x58\x93\x3a\xdf\xe1\xd7\x83\xa4\x0f\xb1\xa8\x38\x77\x7c\x38\x10\xd6\x57\xe1\xef\x81\x30\xc0\x87\x6d\xe2\x2b\xd9\xc1\xb9\xe3\xb7\xa2\xe5\x78\xa2\xbb\x35\x74\x86\x5b\xa2\xef\xdc\xf1\xe6\x89\xf0\x9c\x3b\x5e\x9d\x8a\xa1\x73\xc7\x7f\x05\xe2\xf3\x17\x6b\x2b\x28\x4a\x7e\xfa\x37\x14\xad\xbe\x43\xf5\x2d\x61\xa7\x8f\xfe\xf9\x3e\x7f\xb1\x4a\x90\x9a\x99\x2c\x25\x48\xcb\x30\x83\xaf\x1c\x0a\xfe\x38\xdf\x22\x10\x5b\xfa\xc7\xa2\xdb\xe5\xbf\x2d\x27\x4a\x81\xdd\x0c\x78\xc7\x27\xfb\x7a\x0b\x77\xfc\x79\xeb\x9e\x6e\x97\xad\xe2\x51\xe8\x34\xc5\xb5\x31\xa5\x3f\xcd\x5a\xb2\x29\x20\x79\xde\x0c\xfe\xc9\x29\x00\x6b\xd1\xbe\x9b\x87\xde\xd4\xed\xa6\x88\xf3\x90\xd7\x03\x09\x20\x68\xd7\x3b\xdd\xae\xfe\x58\x55\x5e\x23\x22\xeb\x2d\x63\x57\xf7\x0e\xea\x59\x8a\x03\x14\x00\x37\x7d\x72\x87\xfa\x0f\x9f\x0e\x68\xad\xe7\x3a\x07\xe2\x00\xc5\xc1\x3b\x1e\x55\xcc\x53\x7f\x98\x04\x9c\x3b\xbe\xf9\x22\xca\x42\xdc\x03\x32\xcc\x02\xbb\x7c\x80\xd2\x3b\x3e\xbc\x17\xc7\x97\x24\x61\x7a\xcb\x20\xb7\x77\xd8\xc1\xf6\x0e\xa5\xec\x8e\x0f\xee\xc5\xba\xa5\xd6\xe9\x7b\xd1\x2d\x1d\x38\x07\xa2\x5f\x82\xb2\xa1\x04\x27\x75\x98\x2f\x6b\x3d\x77\xfb\x9e\xc9\xda\xbe\xbb\x7d\x40\x9d\xd8\xc0\x77\xb6\xef\xd9\x0e\x40\x5a\xe2\xe6\x9e\x10\xbf\x18\xd1\xed\x9d\x22\x54\x32\x2b\xb3\x32\x75\x1a\xf6\xdb\x54\xdc\x64\x57\x85\xe8\x28\x57\x52\xa7\x29\xca\xce\x91\xda\xdf\xe1\x2c\x7e\x25\x2c\xe7\xea\xeb\x54\xdd\x56\x5e\xa9\x3e\xdb\x96\x62\x5a\xbb\x72\x9d\x8a\x68\xf1\xf1\x56\x5b\xf2\x71\xb1\xc5\x27\x10\x98\x38\x6d\x29\x2a\x5b\x95\x62\xb9\x44\x00\xae\x22\x21\x02\x63\xa9\x63\x7d\x6b\xcb\x3d\xf5\xec\xcf\x26\x6d\x29\xd4\x7b\xa9\xb6\xa4\x20\x06\x55\x4a\x6d\xc9\x2a\xc5\xb6\x74\xf3\x06\xed\x2b\xef\xef\xd6\x37\x58\x70\xe9\xdb\x54\xbd\x17\x54\x56\x7f\x1b\xb3\xa6\x38\x22\x4d\x86\x51\xb3\xa9\x68\xce\x1a\x11\xe1\x7f\x7e\x9b\x52\x6d\x95\x01\xeb\xae\x25\x5a\xda\x1a\x54\xab\xd6\x9e\xba\xa4\x34\x85\x7d\xcc\xf5\x25\x0c\xd2\x18\x2d\xe7\xdb\x6f\x12\x2b\xa2\x05\xec\xc7\xf8\x28\xb5\xe4\xb3\x9d\x2d\xa8\x2b\xea\x4c\x85\xe5\x40\x7f\x81\xba\x38\x12\x96\x73\xf4\x55\xaa\xba\x38\xa2\x6f\x57\xe2\xd3\xc1\x33\xa9\xd7\xc6\x81\x4b\x64\xed\xc8\xe5\x13\x86\x3f\x63\x9a\x43\xd0\x88\xc8\xd5\x37\x11\xbf\xbf\x5b\x42\x5c\xd1\x37\x29\xd6\xcb\x39\x06\xd4\x46\xfa\x0a\xfa\x9a\xb1\x72\x71\xc5\xa6\x74\x26\xc5\xb4\xd4\xfc\x0a\x18\x66\x52\xc8\xbd\x96\x12\xef\xef\x41\x96\x32\x7d\x85\x8f\xb7\xee\x19\xd4\xec\x81\x31\x22\x21\xee\x0b\x05\xa2\x7b\x0e\xc3\xce\x75\x05\x0d\xcc\xee\x4d\xff\x2a\xdd\x29\xb5\x9c\xed\x1d\xa6\x82\xfb\x2e\xf4\x36\x6d\x55\x5f\xe5\x2c\x3b\x77\xbc\x13\x45\xfd\x70\x90\xeb\x38\x30\x7b\x51\xac\xbf\x11\x75\x46\x10\x11\x21\x08\xe6\x88\x48\x1c\x41\x17\xbe\xb9\x27\x3e\xc2\x00\x78\x56\x57\xc0\x11\x75\xfa\x2a\xb5\xc7\x86\x10\x71\x3d\xcd\xa5\x06\x18\x00\x27\x03\x05\xec\x53\xe7\x16\x77\xff\x3b\x7f\x59\xdf\x04\xcc\x0f\x85\xc2\x3f\xd6\x57\x98\xd6\x60\xe9\xe9\xc3\x74\xf8\x8f\xf5\x0d\x22\xf6\x48\x1f\x26\x97\x7f\x2c\xd6\x07\x0a\x34\x7f\x09\x1f\x17\xbb\x2c\xe1\x13\x4a\x6d\x95\x00\xe7\x21\x4c\x02\x94\x52\xb6\xf3\x97\xf5\x15\xd0\x41\xfe\x6e\x20\x76\xfe\x02\x04\x67\xf5\x1c\x82\x52\x0e\x41\x37\xc0\xb2\x55\x12\xe0\x8a\xb2\xbe\x9e\x6a\x3f\xe1\x5c\xfb\xea\xb1\x3b\x5e\xf5\x04\xd6\xc4\xe1\x40\x28\xf2\xf9\xee\xd7\xc0\xb9\xe3\xc9\x6b\xfa\xfd\x2d\xc4\xd1\x8f\x6a\x5d\x10\x41\xef\xf8\xc3\xa5\xd0\x28\xcc\xb6\xef\x2e\x5b\xb0\x26\x39\x95\x57\x5f\x4c\x2d\xf4\xe0\xeb\x40\x25\xf8\x45\xd1\x0b\x8b\x53\x0b\xcd\x91\xa1\xab\x81\x50\xbc\x1d\xb6\x6d\x09\xf3\x1c\xf3\x3b\xc9\x20\x4c\x06\xb6\x9f\xbf\x73\xaa\x3e\xc9\x65\x0f\x57\x57\xa8\x6a\xa1\xb7\x16\xb1\x0e\x06\x01\x6b\x2a\x09\x13\x77\x87\xad\x6c\x8b\xb6\xaf\xb7\x68\xb0\x73\x4b\xf4\x5c\xfd\x79\x8b\x44\xc5\x98\x96\xd4\x18\x26\x9f\xb7\xe0\x0b\x60\x9f\xb7\x62\x4a\x61\xfb\x07\x1b\x2e\x7c\xa2\x92\xde\xc2\x5a\x4e\xff\x6b\x08\x22\x30\x8e\xa1\xbe\x79\xf6\x87\xa0\x3e\x6e\x54\x86\x46\xbd\x77\x84\xc7\xd9\x5f\xc5\xb0\xd6\xf5\x5d\x3a\x12\x21\x6f\xd5\x30\xec\x66\xbb\x97\xa9\x26\x3c\x6c\x38\x23\x31\xad\x4d\xf1\x5a\x09\xf6\x1d\x68\x87\xee\x40\x8f\x28\x12\x15\x47\xbc\x79\x02\xfd\x98\xff\xb5\xbb\x15\xc1\x3e\x4e\xc7\xc4\xc5\x11\xaf\x4e\x4d\x4c\x4c\xd9\x95\x20\x23\xde\x0d\x8a\x23\xfe\x2b\x00\xf0\x14\x26\x84\x2b\xf5\x44\xbd\x22\x2e\x60\x72\x38\x60\x71\xe9\x88\x6e\x27\x5b\x9f\xbf\x58\xec\x96\xdd\x39\x3b\x5b\x95\xaf\x90\xa9\x34\xc2\x9e\x79\x2b\xe0\xb7\x58\x61\x77\x02\xa1\x15\x56\xfe\xdb\xfa\x36\xdd\xbb\xd3\xa3\xfd\x0e\xbe\xa9\x7d\xab\x69\xb8\xc5\x4f\x6a\xdf\x89\x5b\xa1\xce\x36\xef\x57\x99\x68\x3f\xba\x24\x4d\x18\x36\x12\xe4\x07\xd8\xdf\x54\x56\xa5\xba\x27\x75\x2e\xfb\x8d\x84\xec\x3f\x13\x22\x4b\x9f\x9a\x7c\x42\xb7\x8f\x40\x78\x2a\xe3\xa6\xa8\x2d\x3f\xca\xf5\xe3\xbc\x34\x97\x75\x31\xe7\x50\xbc\x05\xff\xd8\xf7\xe4\xe8\x99\x5c\xc1\x0a\x4d\xf9\x84\x4d\xae\x6c\x7d\xd9\x8b\xf0\x5b\x03\xc7\xaf\x3b\xfd\x45\x99\xdc\xb7\x87\x4a\x57\x70\xdf\x9e\x5a\x64\xc4\x5a\x94\xf9\xff\xd8\xa3\x5a\x27\x70\xf5\x26\x67\x84\xba\x0e\x8e\xaa\x28\x32\xe4\x57\x5f\x44\x45\xdd\xab\x0f\x61\x28\x22\xa0\x2d\x99\xaf\x21\xb3\x59\x24\x3c\x9c\xc8\x4a\x51\x09\x55\x1e\x9c\x50\xdc\x3e\xa9\xd5\xec\xa4\x45\x72\x4e\xfe\x94\x0b\x40\xed\xf0\x2f\xa2\x0c\x96\x6e\xb6\xc3\x02\xd6\xa5\x8e\xb7\x2a\xcf\xa9\x5b\x8c\xd2\x4c\xca\xff\xd7\xa6\xcf\xca\xe8\x2a\x44\x3d\xbb\x6a\x28\xe7\x39\x68\x79\xe6\x8a\x7b\x5d\x91\xbf\x29\xd9\x4f\x1f\x42\x37\x1f\x16\x2e\x3a\xba\xe7\x74\xf6\x48\xf6\x2d\xd6\x7c\xa0\xce\x3e\x9e\xa3\xb7\x06\xab\xda\x43\xab\xa8\xfd\x1a\x12\x59\x93\x3d\x97\xce\x74\xea\x6a\xb0\xe8\x19\x49\x1f\x85\xa3\x05\xf9\xd7\x90\x1a\xb9\x08\xcd\xe5\x2b\xd1\xa8\x6d\xd9\xda\x82\x7e\xd9\x4d\x6f\x88\x94\xf4\x33\x30\x96\xc0\xef\x27\xb2\x28\xd9\xdb\xd0\xb7\x7d\x16\x3d\xab\xb5\x66\x4e\xd1\xea\xc0\x5a\xd4\x36\xd9\x5f\x64\x0e\x62\x62\x73\xb5\x87\xce\xe2\x7b\x27\xa8\xb5\xa0\x94\xe2\x5a\x52\xdc\xdf\x92\x68\x95\xfb\x72\x4c\x0c\xfb\x33\x0f\x37\x42\x4d\x3a\xd3\x99\xfc\x96\x54\x98\x46\xea\x86\x65\xf6\x48\x0e\x2c\xb6\xff\x40\x9d\x03\xac\x8e\x83\x0f\x9e\xd0\xf7\xff\xd4\x9f\x33\x9d\xb0\xb5\xa8\x1c\x98\x5e\x9d\x55\xa6\x2e\xf1\xd8\xfc\x53\xf6\x43\xcb\x78\x9d\x6a\x09\xc9\x5b\xef\xef\xfa\x26\xcd\x87\x2f\xc7\xaf\x79\xae\x80\x3f\x08\x4f\x4f\xec\x3c\x77\xf6\x49\x15\xd6\xff\xf3\x83\x87\xa2\x6f\x15\xcf\x96\x6c\xd4\x54\x36\x9d\xfa\x21\x8f\xc3\xc1\x71\x32\xe8\x35\xc2\x3e\xa1\xec\x74\x60\xfb\x6c\xbf\x69\x7b\xfc\x57\x7d\x86\x87\x74\xbf\xea\xfc\x4e\xf2\xea\xab\x5e\xdd\xc3\x42\xa1\xfa\x4a\x34\x98\x19\x1c\x9d\x3a\x09\x69\xad\x33\x75\x69\xee\x34\x48\xbd\xab\x48\xf8\xcb\x3d\x0b\x45\x24\xc4\xb4\xfe\xfe\x1e\x09\x31\x8e\x59\x0c\x9f\xdf\x63\xf3\xd9\x14\x1a\x4f\xa1\x60\x7d\x0d\xf8\xa8\xa9\xde\x99\x9c\x5f\x13\xaf\xf6\x38\x76\x29\x6b\x8a\xf2\xd7\x08\x55\x48\x9a\xac\x25\x2c\xa7\x85\x5f\x4e\xb1\xa8\x55\x00\x13\x11\xd5\x5a\x2e\xeb\x8a\x9c\x26\x1f\x4b\x44\x52\xd4\x0a\x7e\xdd\x2d\xd2\x2d\x95\xa9\xb3\x89\x6b\x50\x82\xea\xb6\x85\xc2\x7a\xb3\x50\x90\xff\x97\xba\xe0\x49\xe8\x2c\x2c\x14\x9a\x85\x82\x97\xc1\x22\x16\xd5\x22\x35\x9d\xab\x4e\xd5\xcf\x9f\xe5\x78\xda\x9e\x89\xb9\x0c\xf0\xf5\x43\x19\xdd\x1e\x35\x8f\x11\xaf\xe8\xe7\xd5\x0b\xe9\xff\xfa\xee\xcc\xc4\xba\x33\x6d\x25\x2b\x9c\x43\xca\x42\x44\xab\x9f\x21\x66\xc7\x26\x91\xe8\x13\xb4\x72\xb2\x5e\xfe\xa0\x12\x3e\x41\x2d\x64\x7a\x7b\x89\x7e\x43\xe8\xb5\x64\x2d\x71\xe9\x5b\x53\x34\xdf\xdf\xd7\x2d\x27\xa5\xd9\xdc\x91\x0d\x5e\xf5\x51\x5a\x57\x24\xec\x56\xf8\xec\x0e\x19\xe9\xe6\x70\xdd\xd5\x86\x13\x57\x25\xba\x17\x7a\xa3\xa7\x25\xda\x7b\x5e\x0f\x48\xb5\x4d\x34\x94\xfb\x1e\xa1\x6c\x1c\x32\xfe\x17\xec\x93\xf9\x61\x3d\x8d\xf9\x11\x16\x79\x99\x3a\x87\x16\xb9\x65\x5d\xca\xe3\x57\xf1\xa6\xce\x9c\xee\x67\xb3\x59\xce\xa7\x92\xdf\x92\x85\x82\xff\x7f\x69\x5b\xe9\xa7\x3c\x3e\x4c\x72\x78\x1d\xcd\xbd\x2e\x6a\xea\x40\x83\xc5\xd8\x66\xb9\x76\xf4\xe8\x4c\x57\x2c\x90\x1f\x09\x8f\x47\x0d\xea\xf3\xa8\x21\x22\x27\x24\x1e\xf4\xe6\x2e\x0e\x36\xfc\x3a\x94\x00\x38\xad\xc3\x8e\x3f\x7f\x21\xa1\x8a\x9f\xbb\x90\xe8\x36\x42\xfd\x16\xca\xcb\xd5\x4c\xa8\x6a\xc6\x17\x87\x5a\x3e\xf2\xf9\x65\x22\xde\x66\x8e\x27\x20\xe4\x68\xe5\xeb\xc5\xfb\x80\x30\x5f\x5b\x43\x69\x7f\xe1\xbb\x78\xf5\xfd\x79\x46\x1d\x8f\x5f\xab\xf4\xdf\x9b\x24\x00\x19\x88\x8f\x8b\x58\x0c\x1f\x33\xf5\x3d\xd1\xdf\x13\x48\xfc\x2b\x10\x21\xff\x15\x38\x1e\x48\x8a\x21\xef\x06\xf8\x12\x45\x84\x7c\xf3\xc5\x21\xbe\xf0\xf9\x45\x03\xed\x56\xdf\xff\xb9\x47\xa4\xf0\xb9\x1f\x14\x7d\x5d\xfa\x95\xb7\xbd\xc3\x20\x49\x30\x0f\x43\xed\xd1\x30\x9f\x48\x8a\x00\x33\x32\x5f\x04\x98\x1a\x56\x21\x2f\x97\xc2\xf1\xb8\x1f\x08\x59\x84\xd2\x83\x40\xf8\xc5\xc0\x91\xe2\xe8\x19\xa6\x0a\xdc\x4b\x3b\xbe\xfa\x52\x3b\x6b\xc7\x03\x69\xf8\x5a\x69\xc6\x2b\x81\x22\x55\x63\xc7\x87\x19\x67\xf5\x7c\xac\x3f\x17\xab\x46\x43\xc8\xab\x9e\x13\xa1\x35\xe9\xaa\x87\xcf\xa8\xf0\x8e\xdc\x4b\xdf\x31\x88\x5e\x42\xa2\x7c\x35\xf3\xcf\x54\x45\x5f\xd7\x05\xfc\x51\x1d\x58\x81\x7e\x05\xe2\x53\xa4\xd4\xe7\xf1\x91\x84\x88\xd4\xc3\x11\x7c\x41\x21\xe0\x4f\x51\x7f\x06\xf0\x19\xc0\xa7\xe6\xaf\x6a\x58\x64\x7e\x0a\x50\x5c\xaa\x0c\x86\xd1\x6a\x9e\xd7\xaa\x66\xa8\xaa\x78\x52\x21\xc3\x74\x35\xcf\xf7\x42\x4a\xbc\x8a\x1b\x88\x90\x1f\x0e\x1c\x0f\xa4\xfb\x90\x27\xaf\xce\xfc\xe3\x2b\x0f\xe4\xfa\x5e\x42\x42\xfe\x70\x99\x67\xfd\xa4\x25\x05\x24\xdb\x93\xb6\xcf\xc2\xd5\xab\xd1\x75\x93\x48\x43\x27\x64\x60\x12\x78\xf7\xb6\xe4\x5c\x6f\x80\x0a\x98\x87\x81\x74\xe6\xf1\xce\xbe\x08\x89\xc7\x4a\x65\x28\x2e\xac\xe0\x47\x79\xee\xd9\xc1\xe6\xf2\x4d\x5f\xb7\x11\x3a\x30\xf1\x1f\x4d\xd1\xce\xb5\x1a\x61\xc6\x86\x03\xf4\x73\x3c\x66\xd7\xe3\x8b\x79\xfc\xa2\x01\x7b\x30\x68\xf3\x8b\x86\x79\xdc\x20\xfa\x09\x91\xf9\xc6\xde\xa1\x6c\xd5\x38\x92\x0b\xe3\x48\xea\x71\x84\x6f\x27\x84\x34\x0f\x28\x80\x2a\x08\x6d\xbe\x08\xc9\x37\x5f\xd0\xe1\x57\xc6\x6b\x71\x87\xef\x16\xf3\x9d\x1f\xbb\xa7\x1a\x21\x12\x7b\xa9\x1a\x24\x92\x05\xf9\x4e\xcf\x16\x3b\x7d\x6e\x78\xe4\x3b\x38\x5b\xec\xfe\x41\x3e\x96\xe6\x94\x73\xe4\xe2\x2c\x75\x68\x11\x8f\x9f\x0e\x18\x9e\x70\x4d\x1e\x88\xe4\x3f\x13\x14\x8c\xf0\x9c\x5d\xd9\x42\x09\x78\xdf\x13\xbe\xe3\xf1\x7d\x74\x32\xd1\x0f\xf9\x41\x1f\x7b\xda\x7e\x93\x41\x5c\xde\x6a\x97\xf7\x7f\x4b\xbb\x36\x53\x44\x00\x45\x74\xaf\x64\x56\x46\x80\x4f\x30\x3e\xc4\x1d\x22\xee\x4c\xc2\xa9\xa3\x79\xfd\xb8\xba\x64\x14\xe3\x2a\x20\x4a\x48\xad\x57\x59\x5c\xa5\xce\x83\xa8\x6b\x87\x26\xed\x58\xce\x9b\xc9\x7c\xe0\xf7\x97\x62\xd1\xb4\x37\xac\xa0\x39\xb7\x2a\x73\x5a\x43\x90\xe5\xc7\xfd\x8a\x2c\x4a\xa0\xcc\x65\x5b\x92\x36\x21\xeb\x51\x79\x49\xac\xca\x65\x49\xa5\x6e\x34\xcf\x54\x59\x3d\xc0\x20\xa1\x7e\xde\x8b\xa6\x9f\x46\xab\x93\x35\xaa\x3a\xc9\x87\x0f\xff\x0f\x3b\xbd\x10\xdf\xf2\x6f\xb0\xb8\x3a\xf7\xf8\x1f\xad\x76\xe3\x5f\xfd\xf8\xbf\xaa\x9f\xf8\x9f\xb7\x65\x1c\xfe\xba\x3d\x17\x0a\xd2\x6c\x3a\xe3\xf1\x5c\xf2\xfa\xbe\x4b\x9d\xc3\xd7\x39\xd8\xcb\x24\x45\x11\x0c\xdb\x5d\x91\x05\x35\x34\x6f\x55\xa0\x6a\xac\x0a\x98\x22\x11\x7e\x89\x9a\xa8\xf8\x22\x3a\x92\x7e\xa8\x93\x3d\x77\x73\xc9\x32\xe3\x03\x55\x6d\x7c\x40\x05\xfa\xe1\x60\x1f\x6b\xc7\x94\xfb\x9c\x65\x9a\x8b\xe8\xd4\x75\x44\x2f\x6c\x77\x46\xe1\x5c\x9c\xff\x0c\xd5\x78\x37\x94\xac\x3d\x57\x53\x6d\x64\xb3\x9d\xd5\x54\x7b\xa9\xa6\xda\xb9\x9a\xca\x27\x37\x35\x95\x87\x61\x4d\xb5\x17\xc8\x6e\x1b\xb2\xdb\x0b\x64\xb7\x0d\xd9\x9f\xda\xcb\x74\xb7\x73\x74\xff\x1c\x4a\xd6\xcf\xe8\xee\xab\xa8\x4e\xbb\x3b\x1c\x84\x47\x8d\x28\x12\x0a\xf2\x6b\x04\x2c\x61\x98\xf5\x33\x96\xfa\x4b\x2c\xf5\x73\x2c\xe5\x93\x1b\x96\xf2\x30\x64\xa9\xbf\xc0\x52\xdf\xb0\xd4\x5f\x60\xa9\x6f\x58\xea\x2f\x73\xd4\xcf\x71\xb4\xba\x43\x1f\x0c\x3d\xaf\x65\xba\x74\x6f\xae\xa1\x7a\x48\x52\x2f\xe3\xaa\xb7\xc4\x55\x2f\xc7\x55\x3e\xb9\xe1\x2a\x0f\x43\xae\x7a\x0b\x5c\xf5\x0c\x57\xbd\x05\xae\x7a\x86\xab\xde\x32\x57\xbd\x7f\xe5\xea\x50\x26\x41\x2b\xec\x0f\x1a\x7e\x53\xb3\x36\xc8\x58\xfb\x24\x5f\xc8\x00\x09\x1b\x64\xbc\x0d\x96\x78\x1b\xe4\x78\xcb\x27\x37\xbc\xe5\x61\xc8\xdb\x60\x81\xb7\x81\xe1\x6d\xb0\xc0\xdb\xc0\xf0\x36\x58\xe6\x6d\xf0\xaf\xbc\x9d\x35\xfa\x83\x4e\xdc\x93\xed\x0d\xf6\x3a\xd7\x5e\xaf\x48\xd0\x6b\xc6\xd3\xeb\x12\x4f\xaf\x39\x9e\xf2\xc9\x0d\x4f\x79\x18\xf2\xf4\xba\xc0\xd3\xab\xe1\xe9\x75\x81\xa7\x57\xc3\xd3\xeb\x32\x4f\xaf\x39\x9e\x7e\x0d\x25\x1b\x66\x64\x0f\x97\xc6\xd5\x30\x37\xae\x30\xcc\x86\x19\x47\xc3\x25\x8e\x86\x39\x8e\xf2\xc9\x0d\x47\x79\x18\x72\xf4\x69\xb8\xc0\xd2\xd0\xb0\x34\x5c\x60\x69\x68\x58\x1a\x2e\xb3\x34\xfc\xf7\x2e\xd8\x69\x7b\x1d\xdd\xf9\x46\x73\xed\x34\x42\x92\x46\x19\x57\xa3\x25\xae\x46\x39\xae\xf2\xc9\x0d\x57\x79\x18\x72\x35\x5a\x60\x6a\x64\x98\x1a\x2d\x30\x35\x32\x4c\x8d\x96\x99\x1a\xe5\x98\xba\x1f\x4a\xd6\x9d\x23\xbb\x8b\x65\x76\x33\xb2\xbb\x4b\x64\x77\x73\x64\xe7\x93\x1b\xb2\xf3\x30\x24\xbb\xbb\x40\x76\xd7\x90\xdd\x5d\x20\xbb\x6b\xc8\xee\x2e\x93\xdd\xcd\x91\xfd\x30\x94\xac\x9e\x1b\xea\xf5\xa5\xfe\x55\xcf\xf5\x2f\x0c\xb3\x7a\xc6\x52\x7d\x89\xa5\x7a\x8e\xa5\x7c\x72\xc3\x52\x1e\x86\x2c\xd5\x17\x58\xaa\x1b\x96\xea\x0b\x2c\xd5\x0d\x4b\xf5\x65\x96\xea\x39\x96\xaa\x43\xc9\x5e\x32\x96\x5e\x96\x38\x7a\xc9\x71\x84\x61\xf6\x92\x71\xf4\xb2\xc4\xd1\x4b\x8e\xa3\x7c\x72\xc3\x51\x1e\x86\x1c\xbd\x2c\x70\xf4\x62\x38\x7a\x59\xe0\xe8\xc5\x70\xf4\xb2\xcc\xd1\xcb\xbf\x0e\x98\xbb\xae\xec\x35\x5b\x8d\xc4\x2c\x46\x9d\xb9\xde\xd7\x41\xaa\x3a\x19\x63\x9d\x25\xc6\x3a\x86\xb1\x4f\xe3\xf1\x5c\x7a\xc3\x59\x1e\x86\x9c\x75\x16\x38\xeb\x18\xce\x3a\x0b\x9c\x75\x0c\x67\x9d\x65\xce\x3a\xff\xce\xd9\x20\xec\x76\xc3\x60\xbf\x17\x4a\xcd\x5b\x32\xc7\x5b\x82\x74\x25\x19\x6f\xc9\x12\x6f\x49\xae\xd1\xf2\xc9\x0d\x6b\x79\x18\xb2\x96\x2c\xb0\x96\x18\xd6\x92\x05\xd6\x12\xc3\x5a\xb2\xcc\x5a\xf2\xaf\xac\xdd\xca\x24\x0e\xef\xc2\x56\xa8\xac\xff\x8c\xe7\xf8\x1a\x23\x51\xe3\x8c\xaf\xb1\x29\x1b\xb3\x09\xf5\xd9\xbe\xd1\xf0\xfe\x3c\xfc\xd7\x48\xfe\x3f\x6a\x0b\x2b\x87\x83\xfc\x31\x97\xfb\x0f\xf6\x47\xf9\x0f\xf6\xd6\x95\x7e\x53\xc6\x61\xdf\x5e\xab\xfd\xe1\x77\x7a\x21\xea\xc5\xff\xc1\xd6\xfe\x88\xe5\x30\x0e\x21\x10\x84\x91\x1c\xb6\x10\x16\x75\x7a\x6d\x89\xa1\x61\x03\xfe\x0e\xa4\xd7\x0a\xff\x70\xa1\xa8\x79\x62\xf1\x27\x20\x6f\x1b\xed\x4e\x30\x6c\x85\x1b\xf6\xc6\x5c\xd9\x1b\x6c\x63\x14\xf6\xfa\x10\xb2\x37\xca\xdc\xda\x60\x1b\x30\x8b\x74\x12\x20\x7e\xc3\xae\x6d\x0c\x1b\x08\xd2\xe4\x6c\xb0\x0d\x4d\xc4\x06\xdb\x88\x95\xbd\xb3\x0d\x45\xcb\xc6\x8a\xc2\x97\x6b\x6a\x4d\xe4\x1c\x0e\xad\xad\xa8\x2c\x67\xe6\x34\xa2\x35\xb2\x02\x4f\xdf\xef\x35\xba\x83\xfe\x5a\xa1\xb0\xf6\x71\x6c\x6d\xa1\x6a\x5d\xba\xf6\x46\xf2\x25\xe2\xd9\xb1\xc6\x24\xfe\x1b\x44\x4e\xd4\xe9\xad\xe1\xf9\x6f\x63\x4d\xac\x59\xce\x5a\x63\xed\xab\xc1\xc4\xd5\x1b\x5f\x67\xad\x51\x2c\xd2\xb5\xb7\x7f\xab\x04\x62\xca\x68\x00\xbf\x33\x4a\xa8\xf3\x5f\x10\xb2\x26\xf0\xed\x85\xce\xf8\xe9\xff\x0b\x00\x00\xff\xff\xb7\x00\xe1\x6b\x79\xa1\x0a\x00") - -func pagesAssetsJsGchartsJsBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsJsGchartsJs, - "pages/assets/js/gcharts.js", - ) -} - -func pagesAssetsJsGchartsJs() (*asset, error) { - bytes, err := pagesAssetsJsGchartsJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/js/gcharts.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsJsGoogleJsapiJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x3c\x7b\x77\x9b\xb8\xf2\xff\xe7\x53\x38\x3a\xfd\x39\x68\x4d\x30\xe0\xc4\x71\x4c\xb5\x39\x7d\xa4\xdd\x6e\x1f\xd9\x6d\xd2\xde\x7b\x97\x65\x73\x84\x10\x36\x0d\x06\x2f\xe0\x3c\x36\xe6\xbb\xff\x8e\x24\x30\x60\xcb\x49\x93\xb8\xfb\xc7\x36\x20\xcd\x8c\xe6\x3d\xa3\xc1\xf7\x06\xbe\xb2\x7d\x15\x44\x5e\x7c\x65\xef\x8c\xe2\x78\x14\xd2\x0f\x67\xe7\x3b\x0e\xbc\x95\x2c\x22\x25\xa2\x57\xad\xd7\x38\xa3\x0a\x84\xda\x88\x66\x67\xc1\x84\x2a\xd0\xca\x03\xbf\xb5\x4c\x65\xc7\x81\xad\xdb\xad\xe5\xb5\x16\x6a\xdd\xe6\xd6\x56\xbe\x25\xc5\xb0\x77\xc2\x18\x7b\x34\x91\xe3\x56\xbb\x05\x15\xb1\xa1\x89\x55\xed\x94\x26\x97\x01\xa1\x2f\x71\x4a\x5b\xa8\xb5\x33\xce\xb2\x69\x3a\xec\x76\xaf\xae\xae\xb4\x02\x90\xc4\x93\xee\xcc\x4b\x77\x96\x31\xdf\xf2\xb7\x17\xd3\x20\x5d\x46\xc6\xdf\xf0\x75\x81\x8d\xa7\x41\xca\x29\xb0\xb5\x15\x12\x2f\xa6\xc1\x7b\x7a\xc3\x50\xa3\x38\x4b\x67\xd3\x69\x18\x50\x6f\x05\xea\x3d\xbd\xf9\x4a\x93\xc0\x0f\xa8\xd7\x42\xad\x2c\x99\xd1\x65\x88\x0f\x31\xf6\xde\xe0\x20\x9c\x25\x8c\x0f\x1f\x87\xe9\x0a\xc8\x29\x25\x62\x57\x86\x2f\x44\xf9\x10\x13\x1c\x72\x41\x9a\xd2\xaf\x30\xf4\x2a\x0c\x68\x94\x31\xf0\x2c\x88\xa3\x16\x6a\x45\xb3\x30\x5c\x91\xcd\xf3\x02\xb6\x8d\xc3\xdf\x70\x82\x27\x29\xa3\xbb\x63\x6d\x29\xfe\x2c\x22\x6c\x5d\x81\xad\xdb\x4b\x9c\xb4\x3c\x44\x23\x12\x7b\xf4\xcb\xe7\x77\xaf\xe2\xc9\x34\x8e\x68\x94\xa9\x23\x24\xcc\xa8\x8e\x91\x17\x93\xd9\x84\x46\x99\x55\x22\xb6\x42\x05\xab\x2e\xbc\x4d\x68\x36\x4b\xa2\x16\xe6\x07\x22\x37\x67\xc4\x26\x08\x24\x74\x1a\x62\x42\x81\x1a\x21\x40\xc6\x38\x79\x91\x01\xf5\x6f\x04\x0a\xb7\x03\x6a\x82\x40\x2a\x9e\xe3\x59\x06\xd4\x0c\x81\xe9\x2c\x1d\x03\x75\x86\x40\x10\x79\xf4\xfa\xc4\x07\xea\x25\x02\x35\xbf\x00\xea\x15\x02\x11\x66\xc8\xd7\x08\x84\x34\x1a\x65\x63\xa0\xde\x20\x30\x4d\xe2\x2c\xce\x6e\xa6\x14\xa8\xff\x20\x20\xe4\x06\xea\x0b\x04\xd2\x99\x9b\x66\x49\x10\x8d\x80\xfa\x12\x81\x6f\x71\x10\x01\xf5\x15\x02\x59\xfc\x21\xbe\xa2\xc9\x2b\x46\xb3\x12\xe7\xb5\x82\x2b\x61\x5a\x41\xd4\x3a\x3e\x3a\xb6\xb1\x33\x64\xff\xa0\x5d\x63\x1b\x45\xf8\x32\x18\xe1\x2c\x4e\xb4\x59\x4a\x93\x17\x23\x1a\x65\xf6\x2b\x47\x81\xf6\xcc\x51\x30\xe4\x72\x1f\xa3\xdb\xbc\xa2\xf8\x46\x28\x88\x6d\x10\x54\xe9\xfb\x36\xb7\x88\xb6\xe0\x19\xb9\xf6\x8d\x63\x61\xed\x4b\xf9\x50\xed\xb0\x70\x25\xf9\xd6\x82\xde\x5b\x46\x4f\x25\x82\x22\x45\x2f\x92\x04\xdf\xd8\x37\x8e\x96\x86\x01\xa1\x1a\xc1\x61\xa8\xe0\x64\xc4\xad\x94\xaa\x26\x9c\xcf\x6d\xc7\x2a\x04\xaa\x9d\xbe\xb0\x17\x9e\x4e\xc3\x1b\xc5\x55\x99\x73\x45\x04\x67\xca\x9d\x04\x21\x84\x79\xbe\x60\xe5\x17\xa6\x2c\x8c\x8e\x93\x24\x4e\x14\x0c\x2d\xac\x65\xf1\x29\x57\x35\x5a\x3d\x2a\x1b\x07\xa9\x36\xa1\x69\x8a\x47\x34\x2f\x39\xc2\x15\xb1\x77\x42\x4f\x7e\x9c\x28\x42\x57\x58\x4b\xa7\x61\x90\x29\xdd\x3f\xb5\x2e\x54\x29\x1a\xa9\x3e\xd2\x2d\xff\x39\xb1\xaf\x9d\x5d\xc3\xf2\x3b\x1d\x48\x6d\x62\xfb\x8e\x33\x9f\x2b\xc5\x13\xba\xcd\x19\x68\xf1\x66\xb1\xbf\x02\xdc\x71\x90\x5b\x9d\xf5\x6b\xa9\x43\x6c\xbb\x0e\x22\x39\x4b\xa0\xef\x21\x3b\xf6\x3d\x7a\x67\xb1\xb7\x0f\xfc\xed\x03\xfa\xd5\x12\x81\x64\xff\xe3\x68\x97\xcc\xae\xef\x15\xd0\x0c\x2d\xa6\x20\x17\x93\x8b\x14\xa8\x35\x50\x68\x31\xfc\x8f\xe8\x36\x57\x3f\x31\xb4\x6a\x8b\x5e\xe2\x50\x4a\x88\x6d\xd4\x69\xb0\x77\x68\x6d\x85\x8a\x58\x52\x17\x2a\x2d\x78\x5f\x48\x43\x99\x19\xd8\x71\xee\x42\x67\x40\x03\x90\xc9\x61\x3e\x77\xed\x6b\x07\x66\xe3\x24\xbe\x6a\xfd\xa2\x80\x8f\xb1\x37\x0b\xe9\xb0\xb5\x03\x3a\xb8\x03\x76\x5a\x51\x9c\xb5\xfc\x78\x16\x79\xdb\x00\x5a\x60\x16\x79\xd4\x0f\x22\xea\x81\x6d\xc4\x7c\x2f\xf6\x5b\xae\x6d\x38\xed\xb6\xe2\x23\xd7\xd6\x1d\x95\x68\x53\x4c\x2e\xf0\x88\xa6\xa8\x7a\x64\x1e\x56\xdb\xb1\x33\x47\x61\x58\x50\x04\x83\x8f\xb0\x45\x10\x99\xcf\x6f\x73\xc6\x10\x8b\xa9\x34\xc3\x11\x61\xc4\xb9\xab\xcd\xe7\xb8\xdd\x06\xb1\xfb\x8d\x92\x0c\xa0\xf2\x5c\xb6\x56\x0a\x58\x5b\xb5\x5f\x3a\xf2\x0d\x2d\xa1\x97\x34\x49\x29\x2c\xfd\xe7\x02\xe9\xd6\xc5\x73\x6c\x5f\x3b\xd6\x05\xf3\x14\x05\xdb\x17\x0e\xb4\x68\x98\x52\xae\x30\xce\x0c\xfa\x68\x83\x21\xe8\xf8\x0e\xbc\x25\xed\xf6\x36\xd1\x42\x1c\x8d\x66\x78\x44\xdb\x6d\xa2\x85\x3c\x03\xb7\xdb\x4a\xb5\x8c\xca\x55\x68\x91\x76\x1b\x14\x69\x65\xc1\x05\x59\x38\x43\xbb\xad\x5c\xa0\xea\x55\xbd\xd0\x26\x38\x23\x63\xa5\xfb\x97\x6d\xff\xe9\xbc\xd8\xfd\x03\xef\xfe\xa3\xef\x1e\x6a\xe7\x4e\xe7\x59\x17\x72\xe8\x11\x37\xb8\x72\x01\xd5\x0a\x0f\x6d\x5d\x40\xce\x29\xa3\xd6\x6e\xb3\xcc\xbe\x5d\x23\x0b\xdb\xed\x6d\xac\xa5\x8a\x0b\xa5\x16\xf6\x99\x85\x27\xb3\x34\x6b\xb9\xb4\xc5\x9d\xcc\x6b\xb9\xd4\x8f\x13\xda\x7a\x7d\xf2\xb1\x15\x47\xac\x52\x31\xc3\x5f\x1c\x61\x6d\xa2\x30\xa7\x3a\x1a\xd9\x89\xa3\xd4\x18\xd7\xe1\x50\xe4\x74\xbe\x3d\x2c\xe1\xe6\xf3\xda\x6a\xce\x95\xba\x96\x83\x86\x8f\xe5\x70\xc9\xf1\x4b\x8f\xe7\x2f\x70\x51\xb7\xce\x50\xdd\xdd\xe1\xad\x7b\xa4\xe8\x08\x9d\xd8\xd7\xcc\x1b\x7f\x53\x46\x2a\x10\xc8\xbf\x43\x75\xfb\xb5\x02\x26\x69\x40\x01\x53\xc7\x6b\x05\xa4\xd8\xc7\x49\x50\xbe\x5d\xc4\xd1\xdf\x33\x9a\xc4\x09\x5b\x60\x90\xf1\x3f\x41\x18\x62\x00\xe7\xf3\x91\x16\x4f\x69\x82\x8f\x46\x1a\xf6\xbc\xe3\x4b\x56\x45\x83\x34\xa3\x11\x4d\x14\xf0\xfa\xe4\xe3\xab\x38\xca\x78\x65\x65\x8a\x03\xea\xef\xea\xb6\x01\x87\x8b\xb3\x8e\xc6\xda\x55\x12\x64\x54\x01\xcf\x53\x92\x04\xd3\xac\xe5\x51\x9f\x26\xad\x38\x4a\x28\xf6\x6e\xd2\x0c\x67\x94\x8c\x71\x34\xa2\x68\xa7\x19\xe7\x5e\x3c\xf9\xcc\x40\x14\xb8\xd3\x4a\x13\x82\xba\xdd\xe1\xcf\x7f\x5e\xf7\x48\x57\xd0\xf9\x19\xc0\xa1\x52\x13\x63\x3e\x6f\x4a\x01\xdb\x6d\x6e\xa4\x53\xd5\xd0\x21\x54\x4f\x58\xbc\x61\x08\x87\x35\xa5\x60\x58\x4f\x2f\x29\xcd\x4e\xb8\xa9\x5f\x15\x46\x5d\xa8\xfc\x0c\x5a\x55\x5d\xf9\xad\xcc\x2b\x2c\x30\x56\x34\x02\x57\x97\x98\xed\x99\x4e\x44\x4c\x09\xac\x2c\xc3\x64\xcc\xa1\x60\xe3\x4d\x01\x71\x04\x3a\x8c\x3c\x87\x2e\x6a\x17\xb6\xc5\xb2\x63\x2d\x9e\x90\xf0\x71\x7a\x84\xb1\x62\x13\x95\x3a\x70\x48\x6a\x15\x07\xe3\x5a\x7d\xae\xd5\x98\x32\xea\x5d\xa4\x5b\xae\x88\x7a\xb7\xd3\x81\x2c\xbd\x2b\x30\xe7\x89\xe8\x04\xd9\x4e\x2d\x0d\xff\x56\x2f\x51\x6c\x1f\xf3\x08\xa4\x51\xa6\xa5\x09\x39\x0e\x29\x6f\x73\x00\x89\x27\xd3\x90\x66\x14\x20\xc4\x72\x0c\xf6\x6e\x4e\x99\x65\xdb\x6d\x05\x6b\x12\x53\x33\xee\x55\xac\x4d\x71\x42\xa3\xec\x53\xec\x51\x2d\xa1\x93\xf8\x92\xbe\x1a\x07\xa1\xa7\x60\xa8\xfe\xae\x40\x28\xc9\xfd\xa5\x4f\xd4\xf3\xff\x6f\xa2\x86\xb8\x18\xdd\x8a\xe0\x1d\x6e\xeb\x6a\xc9\xcf\x70\x5b\xaf\xf5\x18\xa7\x0a\xbc\x75\xb1\x3d\xae\x71\xe8\x1c\xfd\xae\xc0\xa1\xfe\x5c\x84\x4c\xe5\x31\xb5\x4e\xe2\xf7\x9a\xe2\x30\xd2\x2d\xcc\x81\x2d\xdc\xe9\xc0\x13\x1b\x3b\x0a\xb4\x4e\x34\xd1\x60\x21\x3d\xaf\xf8\xf2\xd0\x72\x25\x0a\x7c\xa5\xec\x47\x2c\x20\xbc\x98\xe9\xeb\x48\xa1\x68\xac\x91\x84\xe2\x8c\x16\x0a\x55\xca\x6d\xa8\x52\x8d\xb7\x37\x20\xa3\xd7\x59\xf7\x1b\xbe\xc4\xc5\x8e\x4a\x99\x01\x90\x0b\x87\x80\xa4\x29\xa3\xd3\x6e\xcb\x08\x85\x41\x74\xb1\x4c\x86\x21\xa8\x54\x1b\x27\xd4\x47\xac\xa5\x49\x68\x88\x40\x9a\xdd\x84\x34\x1d\x53\x9a\x01\x68\x29\x18\x8d\xd9\xad\xa7\x20\x93\xbe\xbc\x39\xc3\xa3\x4f\x78\x42\x15\x30\xa6\xd8\x03\xd0\xd6\x1d\x38\x9f\x73\x30\x37\xf6\x6e\xea\xa6\xc4\xd3\x29\x8d\x3c\x61\xca\x15\x76\x04\x36\x64\x4d\x50\x1d\x8e\x8a\xec\x58\xd7\x4a\x99\x38\x76\xca\xc4\xc1\xc4\x05\x3b\x1d\xb7\xb3\x03\x5a\x72\x9d\x34\xf2\xc3\x4e\x5d\x33\x15\x31\xa6\x8f\x16\x97\x5c\x42\x8b\xc1\xb7\x96\xb5\xf1\xf3\xf3\x2e\x43\xfa\x79\x07\xe6\xd6\xd6\x8a\x4b\x72\xba\x2c\x6d\x9c\xe1\x51\xdd\x2d\x3d\x58\x8b\xa2\xdf\x6b\xbe\x00\x6f\x3f\x21\x2c\xf1\xed\xc4\x9f\xd4\xf1\x7f\xaf\xe3\x9f\x36\xf0\x17\x51\xcc\x1a\x6f\x0c\x57\xea\xab\xdb\x6e\xbb\xed\x36\x18\x02\x84\x5c\x3b\x72\x14\x9d\xe5\xf8\x8f\xb6\xcb\x6a\x02\xfb\xc3\x7b\xe5\x33\xc5\xb5\x5f\x38\x8a\x01\x55\x16\xfd\xd2\x68\x4b\xa6\x8d\x46\xeb\xb4\xce\xd1\xe7\x06\x47\xac\xf4\x62\xde\x55\x51\x92\xc2\x76\x9b\x65\x16\x28\x49\x36\x9d\xce\xa2\xc5\x67\xa7\x5a\xab\xad\xc1\x91\x68\x35\x88\x60\xf2\x8b\x42\xe0\x50\x21\xfc\xf9\xab\x42\xec\x2b\xd6\x41\xb9\x38\xa5\xa7\x53\x4a\x58\x03\x30\x4b\xb3\x78\x72\xca\x4f\x55\x0b\x4c\xfb\xca\x71\x10\x81\xb9\x4c\xa0\x86\x86\x3f\xd7\xe5\x11\xa9\xa3\x21\x94\xa0\x87\xb5\x09\x2f\xd4\x8e\x16\xb2\x8b\x8b\xc4\x03\xc2\xa2\xf2\x2d\x13\xab\x93\x3f\x59\xed\xf4\xc1\xdf\x81\x87\x40\x47\x59\x0c\x1a\xa0\xfd\xb7\xa3\xc0\xc5\xdd\x40\x31\xfa\xb0\xf3\x11\x67\x63\xcd\x0f\xe3\x38\x51\x8c\xe3\x83\x9f\xf8\x6b\x82\x23\x2f\x9e\x28\xb0\x09\x2a\x33\xa0\x88\xbd\xb7\xb3\xc0\x7b\x91\x8c\xce\xeb\x1c\x9e\x40\xeb\x5d\x09\x7d\x4e\xaf\xa7\x71\x92\x9d\xde\x4c\xdc\x38\x04\xea\xbb\xd5\xad\xdf\x12\xd6\x01\x64\x37\x40\xfd\xb5\x2e\x14\x96\xf6\xe7\xd9\x98\x4e\x68\xa3\xcb\xc7\x0d\x24\xed\x1d\x02\x2b\xb3\x0a\x92\xd2\x2e\x0f\xb9\x6e\x18\xc7\x17\x5d\x77\xe6\xba\x21\x1d\xcd\x26\x1a\x8b\x48\xeb\x83\x52\xc3\x57\xc1\xcb\x2f\x2f\x5f\x7e\x38\x7e\xfb\xe5\x63\xe3\x10\xed\x5d\xf3\x98\xf7\xf7\x1f\x33\x4a\x28\x8d\xd2\x8b\x1b\xe9\x29\x6f\x3f\x1f\x1f\x7f\x3a\x7d\xff\xbf\xe6\x21\xef\x17\xbd\x97\x78\xff\xf5\xfe\x53\x68\x3a\x4d\x68\x9a\xc6\xd2\x53\x8e\x4f\x7f\xfb\x7c\x7c\x7a\x7a\xd2\x3c\xa5\xa9\x66\xed\xe3\xfd\x87\xa4\xe3\x20\x92\xcb\x71\xfa\xcb\xbb\x4f\x4b\x42\x7c\x6c\x92\xff\x70\x3f\xf9\x49\x10\x05\x13\x1c\x06\x69\x26\x3d\xe3\xe3\xbb\x4f\xef\x3e\xbe\xf8\xf0\xee\xf4\xac\x79\xd0\x87\xe6\x41\x9f\xee\x3f\xe8\xd2\xec\x7a\xd4\xc7\xb3\x50\x7e\xd0\x57\xf3\xfc\xf5\xf1\x9b\x17\x5f\x3e\x2c\x1d\xf4\x09\x56\x55\xfe\x0b\x0b\x5e\x7e\x8d\x76\x11\xb6\xf8\x43\xcc\x9a\x1a\xfe\x14\x31\x9f\xe5\x4f\x74\xf1\xe4\x2f\x9e\xbe\xa1\x6d\x5d\x3c\x11\xb4\x6b\xe4\x5b\x5f\xd8\x05\x7f\xb4\xd4\x63\x8b\xfc\x05\x80\x75\x19\x07\x5e\x4b\xdf\x46\x6e\xbb\xad\x2c\x9e\x6b\x77\x23\x85\x74\x10\x68\x8f\x43\x04\x3a\x9e\x52\x6d\x40\xa8\x56\xd0\x51\x4c\xd2\xb4\x04\x8d\x67\xd9\x74\x96\x71\x70\xc0\x37\x10\xe8\x14\x20\x4b\x48\x71\xe8\x45\x78\x42\x17\x98\xd5\x4a\x71\x58\xb5\xd0\xc0\x2c\x6f\x9f\x25\xde\xe2\x9e\x2a\xb0\xca\x57\x08\x55\xd1\x60\xba\xf5\xab\x1a\xc7\xc0\xe9\x4d\x44\x90\x09\xea\x54\xb9\xfd\x4a\x00\xfe\x52\xd0\xe3\xcf\x4b\xac\xd3\xeb\x69\xc5\x35\xbd\x9e\xa2\x2c\x99\xd1\x06\xb9\x38\x1b\xd3\xe4\x7c\xca\x27\x70\x25\x28\x53\x44\x7d\x5d\xdc\xf7\xb6\x85\xd5\xe0\x6d\xe1\x0b\xc2\xea\xac\x91\x6b\xbc\x6b\xbf\x9e\xfe\x82\xd3\xf1\x82\xc3\x60\xc4\xf9\x93\x02\x41\x68\x6d\x89\xb6\xdb\x76\x54\xdf\x62\x45\xcc\x67\x75\x56\x78\x0f\xe4\x55\xd5\x2f\xab\x2a\x65\xb7\x0a\x5f\xd4\x51\xb8\x04\x4b\x97\x60\xc5\xa2\xed\x3b\xcb\x68\xc2\x4b\xf0\xa5\x50\x1a\xb5\x5f\x3a\x0a\x50\x01\x84\x79\xd1\xbf\x2f\xfc\xdc\xbe\x74\x3a\xa0\x7b\xe4\x07\x5c\xbf\x82\xed\x0e\x68\x5f\x22\xd0\xc1\x9d\x2a\x1a\x96\x87\x98\x1d\x92\x5b\xdc\x91\xb3\x46\x79\x13\xa5\x99\x4f\x41\x59\xeb\xe8\x22\x5c\x99\xdf\x12\x3e\xce\x37\x03\x5f\x71\x61\xe0\x2b\xab\x6d\x06\x24\xc8\xae\x90\x9c\xc5\x05\xc7\x2d\xab\x3f\x61\x3a\x14\x2d\xb3\x5b\xb6\xcc\xab\x64\x6c\xec\xb4\xdb\x44\xcc\x43\xb0\x63\x4f\x1c\xa5\xfb\xd7\x9f\xe9\x4f\xf3\x3f\xd3\x9f\x9e\x75\x55\x00\x20\x1f\x1c\x42\x8b\xcc\xe7\x8c\x22\x28\xf2\x03\x70\xa0\xe5\xb2\xb8\x66\x27\x89\x43\x48\x79\x88\x30\x56\xd1\x0f\x60\xc7\x99\xcf\x5d\x46\x9f\x3d\xc3\x72\xa6\xe6\xe6\xd6\x56\xa8\x30\xc5\xa8\xb2\xf8\xe6\x24\x32\xc5\x85\x2a\x65\x01\xbe\x1c\x0e\x4c\x2d\x14\x8a\xc9\x0d\x2b\xe0\xff\x51\xaa\x3d\xe1\x09\x62\xba\x62\x3b\xea\x14\x15\xa3\x38\xfd\x39\x9a\x5a\xd3\xdd\x5d\x71\x44\x8a\x88\x3d\x75\x2c\xda\x6e\xfb\xda\x4b\x25\xe5\xfe\x5c\xf8\x08\xe3\x3b\x75\x20\xe1\x53\x2a\x42\x95\xa9\x6a\x40\x95\x16\x2e\xe4\x17\xdb\xdc\x87\x8a\x5b\xe5\x05\x7b\x49\x61\xce\x6e\x18\x4c\xf9\xb7\xac\x05\xac\x07\xbb\x5b\x9f\x48\xa5\x71\x92\x29\x70\xe1\x67\x9c\xdb\x29\xd2\xad\xe9\xf3\x0b\xa6\xc0\x69\xa7\x03\x53\x74\x61\x4f\x1d\xb5\x71\x20\x93\x65\x0d\x13\xcc\xe8\xf3\x39\xd3\x11\x42\x9f\xf8\x56\x11\x54\xd2\x45\xed\x92\x26\x69\x10\x47\xa9\x68\xb0\x9c\xf9\x7c\xbd\xf3\xce\xe7\x65\x8c\x73\x91\xf0\x2c\x8b\x45\x77\x55\x47\xf2\x16\xf7\x25\xc1\xf1\x88\x1b\x52\xa5\xc5\x2d\x9a\x34\x8f\x5f\x14\xf0\xe2\x1d\x35\x5f\xf9\x08\xae\x34\xe0\x67\x16\xce\x7c\x00\xcd\x1a\xa0\x80\xa6\xf0\x73\xd1\x59\x7f\x2e\xe3\x7a\x29\x8d\xd8\x9f\x45\x5c\x3b\xa8\x8e\x66\x7f\x76\xea\xa5\xb0\xc6\x70\x23\xba\x89\x36\xc5\xd9\xb8\x43\xb4\x6f\x29\xe3\x9e\x68\xbc\x38\x34\xf0\xf8\xdd\x4d\x8e\x44\x52\x86\x95\x0b\x7d\xb5\xdb\x4a\x59\xd2\x0c\xb5\x28\x69\x4b\xad\xa6\x6a\x6c\x0b\x37\x27\xff\x67\xe8\x7a\x89\xc0\x2a\xdf\xfd\x4e\x51\x3a\x29\xda\xd6\xf3\x1c\x5a\xa2\x52\x86\x8d\x04\xb3\xbb\x20\xdf\x6e\x2b\xff\x55\x00\x0e\xcf\x4b\x1b\xa8\xe0\x5b\xa8\xad\xf6\xbe\xbb\x02\x1c\xaa\xdb\x3a\x54\x2b\x66\xca\x1a\x2e\xfe\x94\x03\x78\xcc\xda\x07\xf1\xe9\x25\xad\xe9\xb6\x32\xa3\xb2\xb2\x86\x6e\x73\x09\x64\x15\x1a\xc5\x01\x7c\xa2\xaf\xe8\x55\x18\x17\x37\x98\xda\x81\xe5\xe4\xe4\xb6\x96\x69\x1a\xfb\xae\xe3\x2c\x7a\x09\xba\x66\xdb\xb0\x6a\xa9\xc6\x97\x02\x59\x62\x66\x50\x32\x42\x91\x6e\x51\x91\xe6\x68\xa7\x03\x89\x4d\x1d\xed\x95\xb2\x84\x04\x2d\x8f\x86\x34\xa3\xad\x3b\xe8\xe6\x79\x51\x13\x26\x4b\xcd\x4d\x91\x1c\x75\x54\x25\x40\xfb\xda\x29\x80\xd3\xd5\x5b\xcc\xb6\x9e\xd7\x86\x63\xff\x59\xb4\x5e\x6f\xca\xd6\xeb\xef\x45\x73\x95\x20\x3d\xff\x0f\x23\xf3\xb2\xe1\x26\x62\xaf\xd3\x29\xc0\x8b\x9c\xc0\xfc\xca\xe2\xd0\xaf\x56\xa1\x4b\xa0\xd2\x65\x2b\xa4\xc2\xd5\x93\xdd\x5d\xb5\x14\x21\x29\xc6\x3a\x82\x2d\x55\x67\x37\xa5\x05\xc3\x5f\xcb\xd9\x8c\xb0\x23\x9e\xd0\x92\xef\xd7\xc8\x15\x0f\x53\x44\xc4\xc3\x4c\xd0\x1b\x33\xc3\xf1\xa7\x8b\xe6\xa8\xec\x92\x3b\x14\xbf\x7e\xbe\x15\xa7\x85\x9c\x1b\x98\xbf\x51\xbe\xaa\x5f\xa0\x15\x2a\x5f\xd7\x55\x1b\x59\x85\x21\x47\x82\x0a\x4f\xee\xb5\xea\xa2\x56\xcf\x68\xdd\x47\x16\x4d\x44\x9a\x7d\xe5\xc0\x61\xc9\xb5\x6e\x3d\x3c\x85\x12\x98\x43\xeb\xeb\x1d\x8e\x22\x61\xfc\x48\x68\xab\x38\x37\x17\xe8\x61\xdd\x75\x0a\x75\x6e\xeb\x56\x73\xae\x56\x88\x5b\x14\xf1\xca\x6a\x17\x36\x76\x54\x1d\x56\x5a\xcf\x45\x8f\xf6\x3f\x39\x4f\x58\x13\x3d\xc6\x91\xa7\x94\x8f\xb0\x03\x44\x4b\x0a\x87\x58\x4b\xe8\x88\x5e\x1f\xb9\xbc\xd3\x50\xfe\xd2\x7e\x7a\x06\xbb\x6a\xb1\x0a\x87\x00\x14\x1c\x2f\xb7\xfd\xf5\xef\x73\x85\x7d\xaf\x14\x0c\x55\xb6\x99\x5b\x5b\x1c\xe7\xed\xca\xcc\x4f\x44\x2d\x00\x16\xd6\x2e\xe8\x4d\xbb\xad\x50\xd1\xcd\xfe\x4f\xe1\x0b\xb5\x4b\x8c\xf8\xae\xce\x27\x63\x45\x7d\x6c\x42\x17\x8b\xaa\x0b\x59\xdf\x53\x1b\xcb\xf0\x8f\xe4\xed\x36\xd6\xd2\x34\x3c\xe2\xff\x0e\xb1\x36\x4b\x02\x96\x3b\x8a\x4f\x21\x8b\x59\x0c\x6f\x4f\x09\xe4\xa3\x57\x3c\x49\x6d\xdf\x39\xaa\x1d\xb1\x58\x54\x89\xed\x3b\x70\x08\xea\x1d\x37\xeb\x65\x4b\x60\xb6\x3d\x04\x2e\x4e\xe9\xb9\x17\x4f\x70\x10\xb1\x4d\xde\x44\x82\x71\x96\x4d\x87\xdd\xae\x80\xe9\x70\x46\x58\x41\x14\x0f\x33\x47\x01\x5d\xa0\x1e\x40\xb8\xc8\xc3\x8b\x98\xb9\xcd\xad\x5d\x03\x21\x97\x03\x1d\x01\xd6\x5d\xf3\x89\x26\x38\x02\x1d\x5a\xf6\xca\xa5\xd7\x75\x68\x61\xa5\xb4\x91\x1d\xea\x36\x62\xc6\xd1\xf8\xc7\x86\x84\x7a\x05\xf4\xd5\xf2\xd4\x4a\x44\xf8\xd2\xa8\x4a\x2c\x2e\xcd\xab\x8a\x45\x97\xa7\x64\x5e\xb7\x3e\xd3\xd1\xf1\xf5\x54\xe1\xe5\x37\xa3\x49\x04\xa1\x96\xd1\x34\x53\x30\x84\x05\x1f\x24\xaf\x33\xf4\xba\x96\x77\xce\x84\x4f\x35\x6f\xa9\x41\x99\x72\x58\x8a\xc9\xdf\x28\x67\x22\x69\x9c\xad\x26\x8d\x2a\xa4\xef\x8d\xe0\x6d\x83\x85\xf0\xd9\x52\x08\x37\x55\x35\xce\x05\x40\xd8\xfc\xf0\x7e\x26\x0b\x83\xc5\xad\x2b\x58\x6e\xe3\x2a\x85\x06\x1a\x0e\x03\x9c\xd2\xb4\xa1\xbc\xc5\x6a\x01\x6f\xb1\xbe\x00\x23\xc2\xdb\xd6\x75\x34\x65\x9f\xcb\xca\x9b\xcf\x4e\xeb\x2a\xc8\xc6\xad\x02\x45\xfe\xb1\x76\xe5\x12\xb5\xf4\x13\x98\x0e\xe8\x86\x81\x9b\x76\x2b\xaa\x5d\x4e\xa6\x5c\x58\xe1\xc8\xe6\x49\x74\x16\xb1\x7a\x9a\xd0\x34\xa5\xde\x11\xa8\xbf\x81\x21\xa8\xbd\xb0\x4c\x75\xb6\xae\x74\x1a\xb9\x68\x00\x30\xab\x5b\x7f\xb0\xf6\xda\xc3\x2b\x3d\x9a\x8f\xeb\x98\x04\xcf\xe7\xe2\xbb\xde\x2c\x12\x1f\xb1\x28\x86\x2a\xa3\xa0\xc3\x5c\x1d\xe1\x25\x63\xf9\x58\x11\xf7\x64\x65\x39\x5f\xd4\x73\xff\xc9\x94\x61\xa4\xed\xf6\xb6\xb1\x8d\xd0\xca\xba\x46\xd2\x00\xd6\x7f\x71\xa0\x5b\x44\x8c\x73\x09\xff\x76\x44\x1c\xe4\x29\xec\x8f\xf8\x81\x07\xcb\xaa\xf6\x5f\xe2\xc3\xed\xb9\xe6\x74\xba\x23\x15\x9c\x97\xd7\x0c\x81\xec\x96\xc8\xae\x40\x76\xef\x47\xe6\xc5\xe0\xad\xf2\x8c\xcf\x25\x54\xd0\xed\x8e\x46\xcd\x29\x52\x70\x94\xa2\x99\x97\xb6\x2f\x91\xd9\xc6\x5c\x05\xec\x5a\x5c\x5e\x72\x3a\xa0\x1d\x64\x08\x74\xdc\xc5\xad\x47\x35\x8e\xf7\x60\x9e\xab\xff\x5d\x49\xd9\xe4\x68\x84\x15\x56\x71\x58\x2f\x35\x54\x98\x0e\xd5\x3f\x58\x0d\x06\x09\xe8\xfc\x61\x5f\x3b\x45\x2d\xc1\x1d\xc5\x3d\x02\x73\xd0\x71\x87\x00\x40\x08\x55\xce\x23\xc5\xea\xfe\x73\x06\x75\xa4\x0f\x8d\xfd\xe3\x1e\x84\xb9\x4a\x1b\x36\x0c\x7c\xe5\x0f\x7e\x49\x13\x85\x6f\xab\xde\xcc\x5b\x3a\x42\x98\x67\x40\x9e\x47\x59\x16\x54\x30\xc2\xe2\x52\x2c\x52\xab\x0a\xc4\x4f\xb6\x98\x56\x9e\x29\xcc\x55\xd3\x0c\x67\xe9\x11\xe3\x8d\x09\xd7\xe6\xd2\x46\x04\x81\xce\x92\x2f\x75\xc0\xb9\xa4\xe7\xf6\x30\x84\xd6\x1f\xd5\x17\xac\x5c\x7d\x26\x9b\x13\xd0\xab\xd6\xbb\x09\x1e\x51\x95\xa0\x67\xda\x2f\x9d\x8e\xf5\x4c\x7b\xc1\xac\xe7\x5a\xae\x16\x47\xe2\xe7\x4c\x5a\x1c\xd1\x24\x89\x93\xba\xb4\x45\x2f\x2a\xa0\x73\xcb\xe5\x5f\xad\xb0\x25\x26\x0f\x39\xa3\xc2\x32\xff\x33\xed\x17\xa4\x57\x73\xe7\xc5\xc0\x9e\x92\x38\xf1\x5e\xa5\xc1\x69\x86\xd9\x5d\x09\xc3\x75\x30\x02\xe0\xbf\x92\x7d\x31\x04\xe7\xbc\xbf\x89\x93\x0f\xf1\x68\xc4\x7f\xe3\xf4\x0c\x5a\x5b\x5b\x39\x6c\x29\x65\x25\xaa\x3e\x12\x28\xb7\x80\x7f\xc8\x00\x43\xfb\x56\xfc\x86\x6a\x08\xdc\x38\xbe\x48\x81\x0a\xca\x8f\x0f\x60\x78\x0b\x66\x49\x00\x86\x65\xc1\xe3\x00\x75\x97\xe4\x0b\x5d\x3c\x0d\xb4\x6f\x0c\x31\x4d\xc3\x02\x38\x1d\x76\xbb\x34\x22\xc9\xcd\x34\xa3\xde\x1d\x18\x17\xf4\x86\x9d\x52\xcc\x4b\x86\xfc\x3d\x57\x41\x91\x8f\x1a\x5b\x97\x6c\xa3\xac\x75\x60\x98\x25\x33\xaa\x82\xa2\x6c\x0f\x6f\x41\xd9\x99\x35\x70\x16\x8b\xb9\x0a\xca\xd1\x64\x03\x60\x1c\x82\x3c\xcf\x73\x15\xf8\x94\x7a\x29\x50\x17\xba\xf0\x93\x80\x46\x1e\x89\xa3\x88\x92\xec\x2e\x9d\x2c\x8d\x7a\x1b\x78\xc5\x67\xba\xe6\xa2\x4c\x55\x8f\x24\xf2\x78\xed\xf1\x9f\x22\xd6\xd4\xc7\x75\x90\x4e\x13\x8a\x3d\xfe\x41\x90\x51\x0f\x3c\x1a\x65\x41\x76\x93\xc5\x71\x78\x11\x30\x25\x8c\x3c\x9c\x61\xb6\x33\x61\xff\x5e\x06\xe9\x0c\x87\xc1\x3f\xfc\xc7\x86\x35\xd5\xa5\x63\x2c\x7e\x62\xf7\xdd\x4a\x4b\xcd\x6e\x81\xd4\xad\x94\x23\x92\xe0\xe6\x44\xbc\xdb\x01\x16\xdc\x4f\xf0\xf4\xce\x18\x60\xfb\x75\xde\xd9\x3b\x1f\x57\xfe\x39\xd3\xf5\x9e\xb7\xf8\x75\xe9\x8a\x8d\x19\xe0\x2e\x9e\x06\xbb\x69\x1a\x7e\x27\x81\x1f\x13\x1d\xfc\x12\x50\x0b\x0e\x71\xee\x33\x83\xfd\x35\xfb\x7c\xf6\x2d\x96\xcc\x7b\xc2\x46\x05\xb5\x6f\x93\x3c\x91\xac\xd3\xd4\xe2\xd7\xb6\x6c\x8d\x45\x7f\x57\x12\x04\xf7\xc3\xff\xbb\x69\x81\x91\xe1\x4d\x2f\x18\x82\xbf\x94\xde\xbc\xa7\x69\x3f\xc1\x67\x20\x77\x58\xa8\x50\x9c\x90\x31\x50\x01\x8e\xa2\x38\xe3\x11\x90\x9e\x5f\x9a\x80\xe1\xdc\xf0\x5f\x13\x00\x15\x5c\xe1\x4b\x0a\x54\x10\x27\x17\xb3\xac\x16\x1f\x35\x94\x07\xc4\x48\x42\x2f\x03\x7a\x95\x16\xd9\x20\xed\xd6\x0f\x76\xe3\x38\x4b\xb3\x04\x4f\xb5\xcd\x85\xcf\xe6\x14\xa9\x02\x12\xcf\xa2\x2c\x69\x72\x32\x2a\x33\xef\x02\x4f\x05\x14\x27\x19\x53\xea\x34\x20\x17\x34\x61\xda\x65\x39\x19\xd0\xe2\x07\x1a\xc0\xc9\xe1\xf2\xaf\x99\x13\x9f\x95\xb2\x61\x61\x8f\xe1\x6d\x29\x1a\xe7\x79\x68\x80\x21\x30\x80\x0a\x86\x86\xa6\xf3\x47\x61\xd4\x31\x18\x02\xee\x55\x02\xad\x6b\x68\x7a\xd7\x1c\x60\x6a\xba\xa6\xbe\x7f\x38\xa0\x83\x83\xbd\x9e\x49\xfa\x7b\xd8\xd8\xdf\xdb\x1f\xf4\x88\xe9\x93\x7e\x17\xa8\xe0\x5b\x0a\x86\xe5\x68\xbe\x43\x23\xed\x9d\xd0\x37\x49\x97\xd6\xf9\xfc\x12\x54\x93\x51\xce\x8b\xf8\xf4\x02\x86\xe0\xbe\x93\x18\xbf\x9f\xe2\x93\xd0\xfb\x84\x27\x0c\xb7\x48\x64\xc3\xaf\xa5\xd1\x00\x93\x86\xa9\x6e\x58\xd7\xf9\x83\x04\x2f\x11\xb9\xe8\x07\xae\xb1\x7f\xb8\xb7\xe7\x9b\x3a\xd1\x3d\xd3\x3b\x70\x4d\xcf\xf4\x06\x07\x7b\x7a\x1f\x0f\x0e\x8d\xbe\x7b\x87\xe8\xeb\x64\xbc\x8f\x24\x90\xcb\x23\xaa\xf0\x43\x85\xe1\x58\x5c\x92\xbd\x81\xe9\x9b\x03\xe3\x80\x78\xfe\xe0\x70\x60\x52\xcf\x37\xe9\x7e\xbf\x7f\xe8\x1f\xd2\x1e\xee\x9b\x07\x9b\x33\xe2\x7d\x27\xad\x11\xb0\x51\x62\x97\xe5\xd4\x4b\x39\x75\x6d\x4f\xea\xad\x35\xe4\xae\xae\xed\x75\x07\x07\xbe\x7f\x60\x1a\x87\xf4\xd0\x1f\xe0\x81\xd1\xdf\xd3\xf5\x3e\x71\x7d\x73\xe0\xed\xd3\x43\xc3\xc0\xcb\xe2\xde\x67\xb5\xfb\xe8\x35\x85\x62\x5c\x72\xa1\x58\x3b\xb0\x2c\x4b\xaf\x94\xa5\x27\xb7\x59\x30\xc1\xdd\x9e\x08\xbb\x43\x63\xaf\xd7\x33\xcd\x9e\x49\x0e\xf1\x00\x13\x1d\xd3\x81\x87\xfb\x03\xd7\xd0\xf5\x3e\x7d\xa8\x08\xf7\xd1\x6b\x8a\xd0\x2b\xed\xc2\x53\xf5\x43\xfd\x8e\x21\x71\xb7\xeb\xb9\x7d\xff\x60\xff\xa0\xe7\xfb\x07\xec\xa8\xbe\x6e\x7a\x1e\xde\xa7\xfa\x21\x39\xd4\xcd\x7d\xd7\x7f\xa8\x10\xf7\xd1\x5b\xe3\x5c\x22\x7d\x3e\x54\x0a\x8e\xc5\xc5\xf0\x5c\x93\x39\xf1\x61\x8f\xea\x78\xe0\x51\xc3\xef\x9b\x7e\x6f\xbf\xd7\xf7\xf7\xf1\xc0\x3b\xf0\x7a\x0f\x15\xe3\x3e\x7a\x6b\xc4\xa8\xd7\xc7\x87\x0a\x53\xc3\xe5\x22\x51\x6a\x1e\xfa\x06\xee\x99\xa4\xb7\xd7\xf3\x29\xee\xf7\x4d\xd2\xa7\x86\xbb\x3f\xa0\xa4\xef\xe9\xde\x23\x52\xdb\x7d\x24\xd7\x48\x55\xd4\xb4\x87\x0a\x24\xd0\xb8\x2c\x06\xe9\xf7\x58\x1c\xba\x87\x9e\x4e\xf4\x81\x49\xfa\x7d\x1d\xef\x99\xfa\xa1\x71\x68\xf4\x0e\xf5\x95\xe4\x26\xcd\x6c\xf7\xa4\xb5\xfb\xce\x90\x09\x27\x29\xca\xd3\x90\x17\x65\xde\xaa\x60\x32\x0b\xe3\x99\xc4\x94\xda\x40\xeb\xf1\xae\xa7\x39\x59\x6a\x60\x15\x12\xdc\xb9\x9f\x73\xed\x1d\x32\xfd\x6d\x8a\xd8\x40\x33\x37\x49\xcc\xd8\x08\xb1\x5c\x05\xc5\x70\xb1\xd4\x1f\x37\x01\xd3\xa2\x5a\x38\x12\xd7\x82\x50\xc7\xe2\x95\x7b\xdf\xcd\x2c\x58\x31\x80\xa9\xf5\xa5\x3a\x73\x67\x41\xe8\x75\x6f\x66\x81\xb0\x66\xf5\x24\xe1\x72\x2d\xec\xee\x24\x88\x4a\x15\x98\x6b\x8c\xf3\x03\x0e\x3a\xf8\xb7\x0e\x1a\x68\x7a\xb2\xf7\x6f\x1d\x65\x26\x32\x0f\xfa\x21\x47\xfd\x2b\x07\xf5\xb4\xde\xdd\x76\x62\xff\xdd\x45\x9c\xfd\xb7\x20\xb8\x14\x17\x3d\x5e\xd7\x7b\x22\x10\x4c\xd6\x12\x94\x51\x61\x6a\x07\xfc\xf5\xa0\x7c\xe5\x61\x0e\x4a\x0d\xf3\xa5\x3e\x5f\xe8\x97\x10\x87\x4d\xfc\xc1\x32\xf8\x80\x67\xed\xd2\x1d\x84\x68\x8b\xf3\x45\xc7\x77\xe5\x17\xff\x83\xa6\xd5\xf8\x93\xe6\x85\x12\xfe\x3c\x4d\x88\x2c\x2f\x94\xfb\x95\xd5\xa4\xb9\xea\x41\x64\x96\x54\x28\xb4\x62\x16\xad\x11\x75\xfd\x38\x5a\x65\xdf\xd0\x74\xcd\x1c\x48\x8e\x2e\x10\xce\x3d\xea\xce\x46\x92\xa3\x8b\xfd\x2a\x41\xea\x9a\x79\xb0\x21\x3a\x87\x9b\xa1\x63\xc8\x54\xfa\x18\x3a\xb2\x02\xf7\x18\x3a\xb2\x54\xf3\x18\x3a\xfb\x1b\xa2\x23\x8b\xde\xc7\xd0\x91\x45\xc0\x63\xec\xbe\x21\x76\x36\x43\x66\x43\xca\xe9\x6f\x48\xa8\x0d\xc5\xc4\xa6\x5c\x67\x43\x29\x63\x53\x11\xb1\xa1\xcc\x63\x6c\xc8\x5a\x1b\x4a\x18\x1b\xb2\xb9\xb9\xa9\xf8\xdc\x50\x80\x9a\x1b\x72\x42\x73\x43\xd6\x32\x37\x64\x2e\xf3\xa9\xde\xbc\x7c\x37\x10\x97\x33\x56\x0f\xab\xab\xa5\x78\x17\x93\x82\xeb\x6c\x97\xc4\xc9\xea\xc8\xa3\xa7\x19\xd2\xf4\x55\x22\xec\xae\x63\xa6\x04\xa8\x5a\x3c\x79\x1e\x7c\x18\x21\x69\x6b\x67\x88\x6e\x4c\x0c\x96\xc4\x39\xfc\xd5\x58\xec\x72\x19\x27\x71\x9c\xc5\x71\x28\xbb\x78\xf6\xa4\x99\xbe\x44\x90\x30\x55\x6e\xed\xb2\xbe\xb3\xda\xa9\x4c\x68\x6c\x9c\xa2\xbc\x43\x7e\x1a\x45\x59\x14\x3e\x4d\xea\x4d\x53\x34\xa5\x09\xf0\x69\x14\x65\xb1\xf5\x34\x8a\x9b\xb6\xb5\xbc\x85\x7f\x1a\x45\x59\xa6\x7c\x0a\xc5\xbd\x8d\xfb\xe3\xde\xc6\xf5\xb8\xb7\x49\x3d\x4a\x53\x2a\xf3\x78\xe1\xfa\xe5\x7b\x31\xbc\xe3\x03\x7b\xce\x80\x88\x35\xfe\xda\x2b\x5f\x4d\xfe\xca\x8c\x22\x90\x17\xb4\x78\xa6\xfa\xf6\xf7\x8c\x26\xb2\x09\x8d\xb1\x66\x42\x23\x10\x76\xa5\x77\xe4\x6a\xaf\x76\xe1\x36\xc4\x45\x75\x33\x84\x64\x3a\x7e\x14\x21\x99\xf9\x1f\x45\x48\xd6\xed\x3c\x8e\x23\x59\xd4\x3c\x8e\x92\x2c\xeb\x3c\x8a\x92\xac\x41\x7d\x1c\x4b\xb2\xd4\xfa\x28\x4a\xb2\x16\xfe\x71\x2c\x6d\xc8\x97\x0e\x36\xe7\x94\x9b\xf3\x80\x0d\xb9\xf7\x81\xb4\x24\x3e\x8e\xa5\x8d\xe5\x00\x59\xff\xfc\x28\xd9\x36\xc4\xd1\xc1\xe6\x92\xc9\x86\x02\x77\x7f\x53\x66\xdb\xdf\x60\xc2\xdd\x5c\x2e\x79\xba\x03\xac\xfd\x9c\x61\x1c\x88\x2a\x79\xc0\xdf\x0f\x8a\xcf\x1b\x7c\x32\x6b\x94\x93\x59\x63\x09\x76\x9f\xbf\xef\x97\xb0\x83\xa2\x00\x0f\xca\x4f\xd4\x64\x9c\xc4\x13\xba\xeb\x27\xfc\x27\x38\xb2\x49\xa6\x44\x9e\x57\x6f\xde\x45\x69\x86\xc3\x50\x22\x4f\xb5\xd7\xd0\x8c\x7c\x86\xf4\x28\x42\xb2\xc8\x78\x18\xa1\x75\x97\xc2\xa5\x3b\x61\xf1\x7d\x72\xf1\xff\x99\xb7\xaa\x9e\x83\x35\xec\x2c\x70\x24\xec\x34\xf6\x84\x4c\xfd\x35\x7a\x7e\x30\x19\xf9\x1d\xf5\x11\xdc\xc8\x42\xf4\xfb\xc9\xac\x78\x70\xe9\xb1\x7a\xf9\x15\xae\x5f\xb4\x7a\xfd\xf2\xd2\x6a\xac\x40\x2c\xed\x8b\x94\xb8\x4c\x45\x2f\x7d\x5f\xeb\x09\x6b\x79\xf1\xb7\xf8\xbb\x2f\xb6\x0c\xb8\xcb\xfe\xd1\xae\x59\x6b\xdb\xf8\x61\xbf\x44\xc8\x25\xf0\x4a\xeb\x3f\x8a\xb4\xfc\xaa\xbb\x11\xd2\xf2\x7b\xf9\x86\xb8\x96\xf9\xf2\x86\x74\xfd\xc3\x14\x22\xbf\x60\x6f\x84\xb4\xbc\x09\xab\x60\x1f\x42\xf7\x9e\x0e\xe1\xc9\x44\xef\xf6\x8a\x47\x11\xdd\xfb\x71\x9a\xdd\xff\x71\x5e\xbc\xff\x23\x5d\xed\x87\x91\x96\x0f\x23\x36\x44\xfa\x47\xe8\x7a\x6d\xa9\x30\xab\xaa\xd0\x2f\x67\x09\xfd\xe6\x6b\xd9\xdb\x2c\x4d\x1a\x7a\x77\x4e\x1a\x7a\xcd\x49\x83\x51\x9f\x34\x48\xe7\x0c\xeb\x9b\xcc\xb5\xdd\x5c\xb3\x63\x91\xd7\x9e\x07\x91\x90\xd7\x98\x07\x72\xb1\xfe\x46\xf1\xdd\x5c\xac\xbf\x02\x7c\x37\x89\xf5\xcd\xff\x77\x0b\xf2\x64\x8b\xdc\x35\x3c\xfa\x4e\x12\xf2\x72\xf1\x20\x12\x77\xdd\xf1\xbe\x9b\xc4\x93\xfd\xc2\xbc\xe3\xca\xfa\x9d\x24\xe4\x09\xfe\x81\x24\x9e\xec\x5a\xf2\x5a\xf0\x40\x12\x4f\xb6\x88\x3c\x01\x3f\x90\x8b\x27\x3b\xb8\x3c\x57\x3f\x90\xc4\x53\xb8\x58\x9b\xd6\x97\x32\xf9\x5e\xbd\xf7\x5f\x4a\xeb\x66\x33\xad\xef\xdd\x99\xd6\xfb\xc5\xef\x2d\xf3\xad\xff\x0f\x00\x00\xff\xff\xac\xf9\x00\xe7\xe9\x5f\x00\x00") - -func pagesAssetsJsGoogleJsapiJsBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsJsGoogleJsapiJs, - "pages/assets/js/google-jsapi.js", - ) -} - -func pagesAssetsJsGoogleJsapiJs() (*asset, error) { - bytes, err := pagesAssetsJsGoogleJsapiJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/js/google-jsapi.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsJsJquery300MinJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\xfd\x7b\x97\xa3\x36\xb6\x30\x0e\xff\xff\x7c\x8a\x32\xd3\x87\xa0\xb2\x4c\xd9\x9d\x64\x9e\x13\x5c\x6a\x56\x27\x9d\x9e\xc9\x4c\x6e\x93\xee\x5c\x66\x30\x9d\x25\x40\x60\x5c\x18\x5c\x80\xab\xaa\x63\x98\xcf\xfe\x2e\x6d\x49\x20\x30\xee\x64\xce\x79\x9f\xb5\x7e\xab\x57\x97\x01\xdd\xa5\xad\xad\xbd\xb7\xf6\xe5\xe6\x7a\x76\xb5\xfb\xc7\x91\x95\xef\xaf\x1e\x3e\xb6\x9f\xdb\xab\xab\xe6\xca\x0a\xd1\xd5\xdf\xde\x5c\xbd\x2e\x8e\x79\x44\xeb\xb4\xc8\xaf\x68\x1e\x5d\x15\xf5\x96\x95\x57\x61\x91\xd7\x65\x1a\x1c\xeb\xa2\xac\xae\x9a\xab\xdd\x3d\x2f\x6a\x17\x65\x72\x93\xa5\x21\xcb\x2b\x76\x75\x7d\xf3\x7f\x66\xf1\x31\x0f\x79\x41\x8b\xe2\x00\x9d\x8c\x63\xc5\xae\xaa\xba\x4c\xc3\xda\x58\x1b\x45\xb0\x63\x61\x6d\x10\x52\xbf\x3f\xb0\x22\xbe\xda\x17\xd1\x31\x63\xa6\x79\x21\xc1\x66\x4f\x87\xa2\xac\x2b\x77\xf8\x4a\xa8\x1d\x15\xe1\x71\xcf\xf2\xda\x0d\x2c\x8a\x67\x4b\xe4\xf4\xad\xa2\x53\x1a\x5b\xb3\x3e\x0b\xaa\xb7\x65\xf1\x78\x95\xb3\xc7\xab\x2f\xcb\xb2\x28\x2d\x43\x8e\xb9\x64\xf7\xc7\xb4\x64\xd5\x15\xbd\x7a\x4c\xf3\xa8\x78\xbc\x7a\x4c\xeb\xed\x15\xbd\x52\x25\x0d\xb4\x2e\x59\x7d\x2c\xf3\xab\xc0\xa2\xa8\x75\xe0\xaf\x65\x1c\xf3\x88\xc5\x69\xce\x22\x63\xa6\xba\x2b\xca\xbb\xe2\xc7\xa9\xb7\x69\x85\x3f\x30\x0d\x0f\xb4\xbc\x0a\x89\xe7\xe3\x48\x1b\x09\x66\xe4\x3b\x98\x04\x3b\x61\xf5\xf7\x65\x51\x17\xbc\xee\xef\x62\x1c\x93\xd0\xae\xf8\x04\xe3\x84\x84\x76\x58\xe4\x21\xad\xf1\x96\x84\xf6\xe1\x58\x6d\x71\x4a\x42\x3b\xcd\x23\xf6\xf4\x5d\x8c\x77\xe4\xd4\xe2\x3b\xb2\xb3\xeb\xe2\x4d\x5d\xa6\x79\x82\x33\xb2\xb3\xb7\xb4\xfa\xee\x31\xff\xbe\x2c\x0e\xac\xac\xdf\xe3\x3d\xc9\xfa\xf4\x9c\xec\xed\x90\x66\x99\x25\x9a\x46\xb8\x20\xa7\x76\xad\xba\x7e\x75\x10\x9d\x0f\x48\xd0\x34\x91\xec\x76\x60\x87\x25\xa3\x35\xfb\x32\x63\xbc\xdb\x96\x51\x85\x65\x7a\xe0\x73\x15\xda\x35\x7b\xaa\x09\xc5\x81\xbd\x65\x34\xb2\xe9\xe1\xc0\xf2\xe8\x8b\x6d\x9a\x45\x56\x88\xec\x03\x2d\x59\x5e\x7f\x5b\x44\xcc\x2e\xd9\xbe\x78\x60\x2a\xa5\xe5\x15\xdf\x13\x03\x40\xd0\xc0\x25\x19\x4e\x9d\x5c\x02\xbe\x7e\xa5\x1d\xe7\x76\x9a\xa7\x35\xa4\xb4\xb8\x22\x37\xef\xbc\x4d\xb5\x39\xbe\xfe\xf2\xf5\xeb\xcd\xd3\xcb\xa5\x3f\x6f\x46\xef\xcf\x6e\x12\x5c\x93\x9b\x77\x8b\x7d\xb5\xb8\xc1\x47\x72\xb3\xb0\x3c\xba\xf8\xcd\x47\x37\x09\x7e\x98\x6e\x29\xb0\xeb\xe2\xc7\xc3\x81\x95\x5f\xd0\x8a\x59\xa8\x5d\xf3\x66\x49\x69\x1f\xd4\xa2\x90\x93\x00\x7d\xe7\x1e\x87\x45\x5e\xd5\xe5\x31\xac\x8b\xd2\x29\x71\xc6\xf2\xa4\xde\x3a\x4b\x5c\x17\x2f\xcb\x92\xbe\xef\xa1\xb2\xab\x3c\x16\xf3\xcd\x41\x04\xb5\x38\x61\xf5\x00\x72\xd5\x58\x8f\x59\x46\x08\x75\xf5\xcc\x0e\xbd\x5d\xba\xfc\xc9\xa3\x73\xfe\x63\x8b\xc6\x7c\x47\x7c\xf3\x5b\xcc\xe1\xe1\x4d\x4d\xc3\xbb\x41\x95\x7c\x72\x03\x52\xda\x7b\x56\x26\x0c\xaa\xb2\xb5\x4e\x5b\x08\xd3\x1e\xca\xed\x43\xc9\x1e\x04\x28\x10\x00\xe2\xa0\xc5\x8c\x86\xdb\xa9\x3e\x96\x36\x4f\x81\x0a\x31\x45\x2d\xde\xd3\xc3\x54\x36\x68\xb0\xeb\x99\x55\xda\x7b\x7a\xb0\x86\x1b\x24\xc0\x61\x97\x9d\x8a\x11\x07\x38\xe4\x0b\x8c\xf8\x1a\x73\xd0\x9f\x98\xc8\x51\xc5\x31\x07\xb7\xec\xbd\xec\x4f\x99\xc0\x9e\xaa\x78\x05\x71\x5a\x56\xf5\xa5\x0a\xd8\xbd\xb5\x44\x2d\xce\xe8\x07\xb3\x2c\x56\xa8\xc5\xec\x7e\x62\x5e\xb5\x95\xc0\x21\x99\xd3\xb9\xc5\x97\x29\x70\x96\xdd\xa4\x8e\xfa\x19\xbe\x20\x4b\xd3\x0c\x6f\x03\xd7\x83\x85\x0b\x7d\xdf\xf1\x7c\x5e\x7d\x1e\x5d\x1c\x65\xb7\x2a\x4d\x73\xbe\x80\x62\xe1\x9d\x2d\xae\x8a\xb2\x76\x42\x9b\xff\xe0\xea\x00\xd3\x16\xda\xe2\xa1\xc5\xa5\xcd\x9e\x6a\x96\x47\x04\xf6\x90\x7c\xd6\xda\xe3\xc3\xa1\x98\xcf\x7b\x84\x19\x8e\x71\x42\xba\x49\xf4\x96\x7e\xd3\x9c\x5a\xbc\x25\x2b\x9c\xf6\x9f\xd5\xb0\x77\x64\xb6\x5a\xc7\x1c\xaf\x06\x45\x91\x31\x9a\xf7\x58\x3c\x31\x4d\x6b\x47\x92\x41\x65\x5b\x59\xd9\x7c\x8e\xf0\x19\xda\x4f\x9a\xa6\xb4\xd3\xea\xb5\xea\x57\x82\x9a\xc6\x4a\xc8\xa9\x45\x78\x4b\x08\x49\x4d\xd3\x4a\x04\x64\x6e\x17\x0b\xb4\xde\xde\xa6\x6b\x5e\x51\x1a\x5b\x7c\xcb\xcc\x88\x45\x07\x2d\x21\xc4\xfb\x15\x5c\xa5\xf9\x15\x45\x21\x49\xbc\x00\x70\x2e\xff\x49\x66\x84\x44\xbc\x7b\xa6\xc9\x7f\x78\xab\xdf\x67\x34\xcd\xc5\x3c\x5b\x11\x6f\x98\x11\xd8\xc5\x76\x5a\xc1\xaf\x15\x21\x84\x5c\x8b\xb9\x16\x23\xb3\x15\xc7\xcb\xa6\x39\xcc\x10\x22\x37\xe4\xab\xe9\x40\xda\xb8\x4e\x48\x3d\xb5\x98\x77\x83\xa8\xf5\xb0\x76\x38\xc6\x11\x42\xce\x43\x91\x46\x57\x4b\xd9\x2b\xc8\x12\xa1\x0e\x88\x92\x7e\x01\xad\x13\x7b\x3a\xd0\x3c\x2a\x1c\x79\x8e\x19\x73\xeb\x7e\xfe\x0d\xad\xb7\x76\xc9\x3f\xef\x2d\x84\xec\x92\x1d\x32\x1a\x32\xeb\x66\xf3\xea\x26\xc1\x86\x81\x70\x5a\xfd\xc0\x68\xf4\xde\x99\x2d\x31\xe3\xa7\xe0\x00\x96\xc7\x27\x24\xdf\xcf\x79\x51\x1c\x74\x80\x6c\x71\xbf\x2e\x13\x1b\xdd\x50\x9f\x0c\x42\x48\x69\xf3\xf5\x84\x6a\xd2\xea\x67\x71\x28\x5e\x40\x73\x33\x42\x4d\x93\x12\x42\xa8\x2d\x4e\x4f\x5e\xe4\xdb\xe3\x9e\x95\x69\x38\x89\xc7\x64\xcd\x72\x66\x2c\x23\x3f\xee\x03\x56\xf2\x56\x83\xa6\x31\x2a\x38\xd7\xe0\x0d\x99\xe6\x2c\xad\xbe\xa5\xdf\x5a\x74\x71\xa0\x65\xc5\x5e\x67\x05\xad\x2d\x8a\xa0\x57\xda\xc2\x9c\x37\x83\x43\x59\xfd\xcc\x9a\xd1\xa6\x31\x3c\x01\xa7\x57\x22\xbf\x6f\xcc\x08\xb9\x13\x88\x8a\x22\x64\x9a\xd6\xcc\x0a\x08\xef\x14\x07\x9a\x90\x64\x0a\x87\x19\xda\x3e\x35\x90\x69\x06\xfa\xc6\xc5\xfa\x8c\x49\xf0\x0f\x4d\x53\x9e\xc7\x21\x22\x84\xe4\xa2\xab\x5f\xee\x0f\xf5\xfb\x4b\x5d\x5d\x6b\x10\x2e\xfb\xbc\x52\x9d\x5f\xb6\x98\x57\xfc\xa1\x13\x86\xce\x0d\xc3\x39\xdb\x86\x7c\xcc\xe7\xbd\xa3\xee\xce\xeb\x86\xed\x37\x8d\x2a\xe6\xa8\xf4\x16\x27\x59\x11\xd0\xec\xcb\x07\x9a\x0d\x1a\x3d\x00\x28\x84\x74\xcf\x32\x7e\xa6\x4e\x75\x88\x76\x30\x5b\x63\x63\x5f\x2d\x8c\x1e\x88\x8f\xf8\x01\x9d\x9d\x43\xfc\xbc\x06\x82\x04\x47\x64\xb9\x4e\x63\xeb\x91\xcf\xff\x89\xcf\x46\x48\xa8\xc4\x4d\xeb\xe8\x36\x5c\x47\x02\x41\x04\xb2\xe7\x5e\xe4\xe3\x08\xf3\x1f\x3e\xc5\xb3\x15\x0a\x4a\x46\xef\x5a\x96\x55\xec\x8a\x97\x8e\xc4\x5c\xfe\x6e\x09\xb5\x35\x69\x8b\xeb\x32\xdd\x7f\x68\x92\x0d\xc3\xb1\xf8\x44\xf7\x43\xaa\xf8\x9e\xe4\x67\xe6\x1d\x1b\x11\x0a\xfd\xc0\x38\x3c\x7b\xfe\x7a\xbc\x57\xac\x47\x49\xac\xf1\xf1\xba\xea\x5c\x0f\x71\x0f\xfa\xdd\x72\x79\xd4\x77\x28\x72\xb6\x12\xa4\x30\x45\x08\x87\x2d\x4e\xf3\xf3\x36\xb5\x23\x58\xf4\x3a\x70\x17\x2b\x27\x55\x90\x4c\x71\xc8\xbb\xcb\x9b\x1a\x75\x95\x4f\x99\xe8\xee\x3c\x50\x27\x42\x44\x96\x98\x9d\x2f\x02\xf5\xd8\x7c\xee\x93\xc0\x8b\xba\x51\xa9\x3c\x84\x61\x0e\x3d\x25\x3b\x9c\xf5\x4a\x35\x10\x61\xc6\x49\xe6\x98\x2c\xf9\x71\xa2\x9a\xda\x92\x59\xb8\x8e\x6f\x93\x75\x3c\x9f\xa3\x88\xcc\x02\x8b\x7a\xb1\x8f\x63\x84\xa3\x19\x21\x5b\xd3\x64\x70\xf6\xc2\xd7\x0e\x9b\xb2\x31\xb5\x22\x5a\x92\xad\x40\x13\x5b\xe2\xf9\x1d\x54\x01\x58\xf4\xe3\x89\x6f\x23\x68\x8e\x11\xd5\x1a\x0e\x11\x16\x0b\xc4\x4c\x73\x2b\x5a\x64\x68\xdd\xc1\x54\x2c\x60\xea\x77\x0b\x28\x6c\x2f\x69\x19\xcf\xc7\x5b\x4e\x24\x1e\xd3\xc8\x59\xe1\x43\x59\x3c\x4d\x02\x0a\x3f\xb1\x79\x5f\xcf\x20\x20\x30\x4d\xbe\x19\xf8\x71\x17\x10\x8a\x29\x09\x11\x1e\x1c\xaf\x14\x49\x9c\x71\x15\x11\x49\x6b\x76\xc7\x27\x7e\x8e\x30\x23\xe7\x14\x09\x95\x9d\x0b\x04\x2d\x82\x23\xc9\x92\x58\xe3\x0a\x10\xc7\x5e\xcc\xe6\xbd\x27\x54\xff\xe1\x67\x3c\xff\x9d\xcf\x31\xe3\xe7\xcc\xa3\xf3\x8a\xd6\xcc\xce\x8b\x47\x5c\x1d\x0f\x9c\xc3\x73\x8a\x16\x4d\xe1\xc7\x37\xef\xf7\x41\x91\xc1\x71\x1d\xe7\x9e\x78\xb3\xd3\x9a\x95\xb4\x2e\x4a\x9f\x84\x67\x9f\xf8\x78\x81\x4c\x35\x3e\x17\xb4\xc9\xd5\xb7\x70\x5c\x5c\x09\xfe\xe7\x4a\xcd\xc4\x15\xec\x88\x2b\xde\x8f\xab\x1f\x58\xf2\xe5\xd3\x41\xe2\x7a\x71\x20\xca\x86\x0d\xa0\xa6\x6a\xcb\xb8\x32\xd0\x88\xbf\xdb\x79\xdd\x21\x61\xcc\x83\xb9\xe1\x1b\x3e\xe1\x7c\xc4\xd7\xc5\x63\xc7\x47\xa0\x9e\xb1\x7a\xec\x4f\xb4\xd9\x8c\x9a\xa6\x21\x40\xcb\xe0\x60\x62\x9a\xb4\xa7\x28\xc7\xe7\x5d\x3f\x29\x33\xc2\x69\x8c\x19\x5f\x4f\x71\xc2\x5a\x94\x1f\x45\x06\xe5\x23\xe1\x07\x60\xd8\x34\x4b\x79\x2a\x76\x67\x64\x0f\x18\xc1\x8b\xa5\x69\x06\x8b\x95\x80\x4c\x60\xc1\x9e\xc8\xc4\x41\xa8\xc8\x41\xbc\xc5\x29\xde\xe1\x3b\x9c\xe1\x3d\xce\x71\x81\x0f\xf8\x1e\x97\xb8\xc2\x35\x3e\x12\xa3\x4a\x7f\xfb\x2d\x63\xc6\x7c\x75\xcd\x89\x08\x3e\x8d\xf8\x41\xe7\x6d\x1f\xc9\x12\x3f\x91\x25\x7e\x4f\xb6\xd4\x42\xf8\x37\xf1\xf3\x52\xfc\x7c\x3e\xcd\x86\x71\xa2\x80\x43\x70\x46\x66\x4b\x84\x97\x2d\xfe\x82\x9c\xda\x31\x37\xfb\x8a\xe3\x84\x2f\xc9\x2b\xfb\x50\x1c\xf0\x6b\xfe\xcb\x99\xe2\xbf\xa8\x87\xbf\x92\x57\x92\x77\xfe\x8a\x5c\xc2\x5b\x4b\xac\xed\xed\xf0\x36\x5a\x87\xe2\xc0\xa0\x5e\xe8\x03\x1d\x21\xfb\xa3\x68\x82\xc5\xaa\xc5\x7f\x23\x46\xb8\x65\xe1\x1d\x8b\x9a\x8a\x65\x2c\xac\x59\xd4\xd0\xea\x7d\x1e\x36\xf4\x58\x17\x71\x11\x1e\x2b\x78\x3a\x64\xf4\x7d\x03\x62\x93\x22\xab\x9a\x88\xc5\xac\x6c\xa2\xb4\xa2\x41\xc6\xa2\x66\x9b\x46\x11\xcb\x9b\xb4\xda\xd3\x43\x93\x15\xc5\xa1\xd9\x1f\xb3\x3a\x3d\x64\xac\x29\x0e\x2c\x6f\x4a\x46\xa3\x22\xcf\xde\x37\x52\x50\x11\x35\x55\x58\x1c\x58\x64\xe0\xbf\x13\xc3\xdb\x6c\x9e\x9e\x2f\x37\x9b\x7a\xb3\x29\x37\x9b\x7c\xb3\x89\x7d\x03\x7f\x4d\x0c\xcb\x75\x36\x9b\xcd\xc6\x6e\xbc\xcd\xe6\x71\xe1\x37\xde\xbb\xcd\x72\xb1\xd9\x3c\xd1\xa5\x8f\xe6\x06\xfe\x86\x18\x9b\x8d\x67\xcc\xff\x3e\x37\xae\x2d\x63\xfe\xf5\xdc\x40\x96\xeb\xc8\x77\xef\xfa\xdd\xb3\x66\xf6\x6f\xdf\x25\x48\x7e\x71\x9d\x8f\xac\xbe\xc6\x77\xfc\xf7\x23\x1f\x5d\xa3\x8f\x9a\x8d\x31\x4e\xd8\x18\x3c\x65\x63\x34\xb2\x5e\xd4\xc8\x5a\x36\x1b\xdf\xc0\xdf\x12\xc3\xe9\x1b\xdc\x6c\x2c\xcb\xfa\xcf\xab\x46\xcd\x38\xc5\x42\xde\x66\xe3\xfb\x8d\x31\xff\x66\x6e\xa0\x6b\xd4\xd8\xd7\x68\xb3\xe1\x4d\xe3\xef\x08\x87\x45\xb1\x9b\xad\xbf\xcf\x8d\xb9\x81\x8d\xc4\x40\xf8\x7b\xfd\xbb\xf1\x0e\xfa\x38\x87\x8a\xdf\xc9\x4a\x7d\xa4\x5a\x41\xd7\x62\x0c\xf3\x67\xb2\xf0\x3f\x26\x0a\x5f\x63\xf1\x63\x20\xfc\xc3\x54\xb2\xe5\xbd\x98\xff\x9b\x77\xf1\xef\x73\x03\x75\x59\xdf\x0c\xb2\x12\x95\xf5\xdd\x66\xe3\x7f\xb4\x31\xfc\x6b\x57\x9f\x3d\x68\xfb\xad\x5e\xe2\x5b\x84\x7f\x1c\x37\xf6\xf5\xdc\x78\x66\x20\xfc\x13\x39\x7d\xf5\xca\x19\xa4\xfd\x49\x4e\xbd\x81\xf0\x17\x5f\xbf\x7c\xf3\x66\x98\xba\xd9\xd8\x7d\xfa\xdb\x97\x7f\x19\xa6\x8a\xa4\xc6\xbb\xf6\x79\xf2\xcb\xb7\x6f\x7f\x70\x46\xed\x7e\x83\xf0\xf7\x6f\xbe\xfc\xf1\xd5\x77\xe3\x84\x6f\x11\xfe\xe2\xaf\x5f\x7d\x3d\xea\x8c\x63\x01\x54\x03\x5f\xde\x70\xce\xbb\xc9\xeb\x2d\xff\xbf\xe0\x2f\x68\x61\x85\xdb\x34\x8b\x9a\x22\x5e\x70\x74\x25\xc1\x45\xce\x0f\x7b\x60\x79\x53\x44\x51\x63\x59\xde\x7c\xe1\x37\xc8\xda\x6c\xa2\x6b\x94\x37\x3d\xc4\xca\x04\xf9\xbe\xd9\x44\x73\xd4\xa0\x6e\x32\x01\x34\x8c\xd4\x40\x98\x73\xab\xa3\x91\xf2\x9d\xf0\xb7\xb9\x81\x9e\xc9\x2c\x39\x63\x51\xf5\x45\x91\xd7\xec\xa9\x1e\x8f\x8d\x57\x27\x16\xd6\xe9\x7b\xc5\xee\x9b\xa4\x6e\x32\x31\xa2\x7e\x80\xc3\x31\x58\xae\xb3\xd8\x6c\x22\xe4\x42\xd7\xb5\x8e\x59\x2e\xf1\xde\x2d\xfc\xe6\x99\xec\x62\x8b\x7f\x26\x37\xbc\x57\x69\x7e\x38\xd6\x12\xd3\x34\xbc\x33\xb4\x64\xb4\x09\x8e\x75\x5d\xe4\xe8\xd9\x4d\x8a\x7f\x21\x37\xef\xb6\x9b\x88\x3f\xfe\x93\xdc\xbc\xf3\xde\x9d\xfc\xf9\xe6\xb4\xa9\xae\x37\x5e\x4e\xeb\xf4\x81\x5d\x6d\x1e\x6f\xf0\xbf\x44\x6d\x7f\xb2\x3c\x8e\x1a\xe6\xa8\xb1\x36\x8f\x73\xd4\x6c\x6c\xf5\x01\x3d\xbb\xc1\xcf\xc8\x8d\x37\xff\xb7\x7f\x83\x7f\x1d\x80\x17\x6c\x36\x6f\xb3\x89\xe8\x22\xf6\x4f\x2b\xfc\xe7\x16\x3a\xee\x36\x62\x54\xa8\xb1\xa1\xd3\x1c\x4e\x29\x25\x93\xa4\x15\x31\x96\x4f\xc6\x3c\x58\xfc\xf9\xd3\x4f\x3f\xfe\xb3\xa2\x75\x38\x99\x16\x35\x4d\xe8\x06\x4e\x74\xbb\x74\xc5\xb9\x6c\xc7\x65\xb1\xff\x62\x4b\xcb\x2f\x8a\x88\x59\xd1\x1c\x4a\x20\x67\x32\xf1\xc5\x8b\xd5\xb2\xf9\xf4\xd3\xe7\x9f\xfd\x19\xaf\x96\xcf\x3f\x36\xa3\xe6\xd3\x3f\x7f\xfc\x7c\x89\x5a\x1c\x50\x72\x63\x79\x1c\xfd\x3d\xad\xe2\xcd\xd3\xff\x8d\xfd\xe6\xdd\xc2\xdd\x44\xa8\x79\xb7\x78\x26\x11\xa3\x4c\x59\x6c\x8e\xaf\x5f\xbf\x7e\xcd\x67\xe1\x26\xc1\x21\xbd\x20\x18\x74\x8d\xcd\x92\x1f\xad\xd4\x35\x36\xc7\x38\x8e\x23\xc3\xa1\xe2\x7c\xb1\x96\x78\xb1\x42\x73\x63\xb3\x31\xe6\xd4\x0e\x65\xef\x5e\xd6\x96\x3a\x59\x16\x2b\xd4\x89\x5d\xad\xd5\x9f\xd1\xdc\xb8\x32\x1c\x91\xbd\xc5\x11\xd5\x09\xad\xbd\x05\xec\x0e\xa9\xa9\x35\xc9\x28\xa9\x03\x84\x33\x23\x4b\x7e\xe4\xc7\x45\xb9\x07\xd2\xa1\x69\x8c\x8c\x06\x2c\x33\xc4\xa1\x8e\x4f\x51\x5a\x3a\x46\x2f\x78\x35\x70\xce\x21\xd9\xc8\x58\xc2\xf2\xc8\x68\xd1\xba\x2e\xdf\x9f\xfe\x22\x29\xba\x57\xe4\xaf\x82\x84\x7b\xb0\x61\x07\xf2\x12\x15\xc2\xc3\xb7\x57\x9e\xfe\xae\x84\x90\x76\x5e\x44\xec\xed\xfb\x03\x6b\x43\x5a\x87\x5b\x2b\xa6\xe8\xf4\x17\x72\x82\x7a\x9d\x57\x32\x97\x3b\x9c\xd4\xd7\xb2\x59\x8a\x65\xb3\x01\x42\xed\x24\x23\x44\x35\xc6\x62\xfd\xb8\x4d\x33\xc6\x0f\x67\xc9\x4b\xcc\xe7\x3e\x5a\x77\x7c\x44\xb8\x58\xb5\x6d\xdb\xd1\x59\x09\x05\x08\x8c\x30\x13\x75\xc5\x78\x2b\x89\x98\x82\x13\x2f\x9c\xbe\x08\xec\xe2\x31\x67\xe5\xab\x9e\x54\x09\xdc\xa0\x1b\x8f\xf3\x19\xa7\xac\x23\x0e\xa2\x9e\xdf\xf1\x58\x33\x8d\x51\x9e\xd1\xa6\x59\xcd\x08\x79\x34\xcd\xcf\xc4\xcf\x0a\x5e\x3b\xca\x9a\x57\x30\x63\xa6\x69\x59\xbc\xe2\x41\x63\x4d\x13\x38\x0f\x68\x46\x48\x6e\x9a\x7b\x2b\x40\x18\x24\xed\x39\x3e\x20\xb8\xc4\x58\xc9\x7a\xad\x8c\xfc\xcb\x66\x4f\x2c\xe4\x04\x3b\x27\x4d\x62\x92\x79\x2b\x1f\xf2\x7c\x46\x78\x5b\x70\xe5\x61\xed\x48\x60\x27\xac\x96\x92\xf9\xcf\xdf\x7f\x15\x59\x31\x42\x83\x8e\xec\xec\x94\xc3\x4d\xdc\x7d\x14\xbc\xc7\x0e\xe1\x48\xb0\xc0\x69\x6c\x55\x20\xb5\xab\x26\xaa\x32\xcd\xda\x0a\xf0\x0e\x99\xe6\xef\xd5\xc3\x3b\x94\x79\xcf\x7d\x95\xae\x60\x2c\xc2\x7a\x17\xab\xcf\xdf\xbf\xa5\xc9\xb7\x74\x0f\xc2\x13\x0c\x3d\x84\xc1\x7d\xec\x23\xd3\x0c\x87\x39\xbf\xc8\x68\x55\xf1\xbc\x7c\xcd\xa6\x53\x7e\xb7\xb5\x2e\x27\x1f\x0d\x8e\xda\x34\xb6\x42\xfb\xbe\xa2\xa6\x39\x7b\xe9\x51\xbe\x27\x7d\xd3\xb4\x66\xf7\x4d\x33\xbb\xb7\x6b\x56\x01\x93\x2d\xd6\x02\xd6\xb4\x22\x01\x2e\x09\x5d\xab\xa9\x52\x22\x90\x19\x21\x02\x66\x78\xdd\x43\xb2\x1f\x9d\xac\x3b\xb1\x2e\x2f\x6b\x71\x7b\xc6\x2c\x23\x8d\x0c\x84\xdc\x3b\x72\xd7\x49\x04\x02\x8a\x43\x8a\x9c\xc0\xae\xc6\x19\xf1\x1d\x39\x22\x5c\x90\xc4\xa2\x08\x6f\x49\xa1\x48\x55\xb1\x11\xb6\x8b\x05\x2a\xbc\xad\x4f\x8c\x3f\x19\xf3\x3b\x3e\x82\x79\x45\x2d\xfe\x05\xad\x4b\x52\xd8\xbb\x22\xcd\x2d\x03\x1b\x08\x57\xe4\x99\x1a\x92\x69\xde\x53\x2b\xd0\x6e\x64\x50\xd3\x04\x7c\x32\x4a\xc4\x11\xc2\xd9\x2c\x56\x36\xdc\x77\xbc\x81\x03\xa8\x28\x5f\x66\x99\x55\xc2\xfc\x89\xdd\xfe\x84\x4e\x6d\x9c\xe6\x34\xcb\xde\x9f\xee\x08\x21\x47\xbe\x42\xe2\x8e\x67\x34\xe6\xb6\x6d\x65\xe5\xa9\xd5\x4b\x7c\xbe\xc7\xc6\xb3\x15\x3f\x91\x61\xa3\xf6\xbb\x97\x73\x07\x42\x30\xcd\xb9\xf1\xee\x73\x60\x85\x7c\x3f\x77\xf8\x10\x20\x2f\xe4\x43\x47\x2f\x22\x3b\xa4\xe1\x96\x7d\x0d\x53\x64\x9a\x11\xcb\x58\xcd\xae\x02\x8f\xda\xd5\x36\x8d\x6b\x0b\xf9\x38\xf0\x20\xaf\x4f\x98\xea\x4b\xd0\x37\x99\x52\x1d\xd5\x7a\x47\x9f\xcc\x96\x98\xf6\xe9\x3b\xda\x73\x6e\xf9\xf8\x26\x2c\x4e\x59\x16\x55\xac\x36\x04\x5e\x95\x52\xb8\x19\xb5\x02\x24\x67\xaa\x93\xb2\xcc\x56\xdd\x8c\xe9\xeb\xc0\x27\xee\xc2\x3d\x19\x60\x87\xfc\x98\x65\x1a\x7a\xbb\xa3\x43\x34\x29\xd9\xd3\xc6\xe0\xac\x7b\x38\x04\x14\xb6\x58\xa0\xc8\xa6\x75\x5d\xfe\x95\xe6\x51\xc6\xbc\xd0\x63\xbe\x4f\xb4\xb1\x67\x83\xda\x02\xd3\xa4\x38\xe2\x3c\xe6\x0a\xa4\xb3\x0a\x23\x8a\xf7\x40\x7b\xa7\x76\x55\x1c\xcb\x90\x7d\x95\x47\xec\x69\x11\xe8\x6f\x80\x3c\x07\x08\x28\x44\xa2\x3b\x21\x09\x6d\x7e\x18\xbd\x49\x83\x2c\xcd\x13\x8e\xd5\x42\x8d\xdb\x5a\xac\x3a\x11\x91\xbb\x72\x16\xab\xbe\x97\x7b\x7d\x85\xfa\x3b\xa4\xae\xdb\x17\xb6\xa1\xe2\x9f\x81\x94\x02\xf6\x98\xcf\x35\xdc\xe6\x11\x42\xb5\x39\xcd\xff\x57\xf5\x5b\x5a\x03\x4d\x63\x08\x12\x0d\xde\xd0\x85\xf6\x8a\x4b\xed\x29\x86\x5f\x1e\xee\xfc\xf0\x18\x02\x8a\x4e\x07\xac\xdc\xfe\xe4\x0f\xf4\x67\xad\xcc\xa0\x02\xbd\x34\x75\x82\xf1\x6b\x5a\xbd\xd2\x3e\x34\x8d\xfe\x65\x46\xc8\x8c\x9a\x26\xe3\x70\x3d\x55\x5a\x6b\x7d\xd4\x4d\x7d\xdc\x07\x7d\xdc\xa9\x46\xea\x68\xf4\x16\x99\x07\x58\x4f\x0a\x71\x24\xd6\x81\xe1\x98\x50\xcb\xf3\xb1\x02\x72\x1c\x20\x9c\x90\x78\x08\xf2\xc9\x62\x81\x42\x8f\x91\xd8\x4b\x7c\x8e\xd7\x39\xc4\x93\x99\x15\xf1\x1f\xfe\x8c\x50\xcb\xff\x75\x5d\xba\x1f\x6c\x7e\xd3\x9c\xba\xe9\xa7\x93\xc7\x97\x69\xd2\x36\x24\x09\xb5\xa5\x00\x8b\x9c\x5a\x1c\xf3\xf7\xb4\xfa\xe5\x9b\xaf\xcf\xe5\x2a\x20\xc8\xa5\x63\x62\x80\xa2\x4e\x62\x22\x5b\x50\x92\xfc\x59\x60\x9a\xc6\x5f\xdf\x7e\xf3\xf5\xf0\xa4\x69\xf1\x1e\x1a\x65\xb5\xaa\x64\x42\x84\xc3\x70\x42\xa8\x7b\xde\x98\xf3\xd0\xc9\x1b\x05\x05\xc2\x49\x89\x44\xdb\xd7\xc9\xb8\x37\xae\x95\x93\x04\x17\x24\x1f\x27\xe0\x03\x99\xc5\x56\x8e\xf0\x83\xa8\xc9\x62\x3c\x0f\x8b\xe9\x31\xab\x7f\x4a\xd9\x23\x32\x4d\xbe\x5d\x0e\x33\x42\x38\x21\xc4\x6c\x1a\x45\x5f\x3e\xb0\xbc\xfe\x3a\xad\x6a\x96\xb3\xd2\x3d\xff\x64\x19\xc7\x3c\x2b\x68\x64\xe0\x88\xe2\xd9\x0a\x39\x8c\x23\x2f\x1a\x6e\x21\x17\xaf\x50\x7b\xb5\x8c\x22\xef\xb3\x23\x84\x43\xc0\x74\x70\xf2\x54\x64\x77\x81\x90\x0e\x15\x35\x40\x8c\xd4\xc0\x33\x3a\x3a\xa4\xbb\x64\x03\xb5\xbc\xc6\xa9\x85\xbf\x58\xb7\xae\xfc\xa0\x0e\x8a\x2f\x8a\xbd\x38\x28\x0c\x84\x64\x73\xe7\x84\x90\x71\x6d\x20\x09\xc6\xe7\xad\x76\xf4\x0b\xf9\xa7\x38\xcb\xf3\x4b\x94\x90\x28\xc9\x09\xb7\x0b\x5d\x2c\x06\x5d\xa4\x88\x13\x74\x47\x3c\x1b\x55\xc8\xeb\x6a\x9a\xa9\xaf\xd6\x71\xdc\x4d\xde\x98\x6b\x45\x76\x9c\x66\x35\x2b\xed\xaf\x5e\x4d\xc1\x7d\x77\xe8\xff\x8a\x69\xaf\x79\x30\x39\x85\xe7\x24\x13\x3f\x20\xda\x16\xf3\x26\xf2\x68\xd8\x00\x3f\xb8\x38\x41\x36\xb1\x65\xc7\x44\xb1\x69\x1e\x7a\x6c\x3e\x22\x72\xfb\x2e\x85\xae\x17\xfa\x8e\xe7\xb7\x2d\x72\xfe\xf7\x83\x12\xcd\x5d\x44\x28\xdd\x38\x05\x6e\x3f\xff\x26\xc6\xdf\xf5\x8d\x13\xc7\x0f\x34\x3b\xb2\xff\x7f\xcf\x88\x10\xf7\x4e\xce\x0b\xe7\x3b\xa0\xc6\x90\xc4\x17\xfa\x87\x07\x1d\x53\x17\x92\x5e\xec\xaf\x19\x09\x26\x40\x88\x22\x8d\xa5\x8b\x09\x13\xdc\xdc\xff\xac\x09\x49\xcc\xc1\x82\xa9\xf9\x78\xfb\xf2\x2f\x64\x7a\xdf\xba\x53\x0c\xfe\xef\x4d\x95\x56\xfc\x22\x17\xe3\x00\x3f\xe1\x06\xe7\x14\x33\x55\x77\xfc\x93\x4c\x2e\x8e\x88\xe7\x63\x46\x96\xa3\xd9\x1f\x54\x0e\xb7\x3c\xd7\x20\x81\x40\x27\x45\x47\xc5\x70\xad\x86\x38\x55\x16\x6a\xd8\x5b\x72\x64\x61\x07\x34\x91\x22\x77\xe3\x0e\x5e\x40\x16\x38\x9e\x21\x8d\xcf\xfa\x8f\x81\x69\x58\xfc\x80\x3a\xc5\xa2\x0b\x5c\x18\x45\x2d\x2e\xf9\xc0\xef\xf9\x1f\xc1\x8b\xf5\xa8\x6d\x3c\x85\x70\xd7\x3e\xc2\x66\xe7\x68\x2c\xcf\x59\xc9\x8f\x4a\x62\xdc\xd2\xab\x34\x22\x1f\x19\xf3\xe3\xdc\xf8\xe8\xc5\xed\x0d\x7d\x71\x2b\x64\x68\xfd\xe7\xc5\xa6\xdc\x6c\x3e\xba\xda\x57\x34\xcb\x8a\xc7\x90\x1e\xea\x63\xc9\xc8\x47\x1f\xbd\xb8\x2d\x0e\x40\x13\x28\xf1\x3e\x7c\xbb\x11\x1f\x5f\xdc\xde\x88\xcf\x2f\x0c\x4c\xcf\x17\xda\xf0\x86\xd5\xbd\x23\x1f\x7d\xe4\x77\x48\xdd\x34\xef\xc5\xca\x18\xde\xf5\xbb\x67\x3e\xe9\x25\xed\x1f\x35\x1b\x63\x03\x32\xd8\xc9\x4a\x55\x4f\xfa\xaa\x9a\x46\x55\xd5\xcb\xf4\x5d\x07\xf6\x46\x23\x04\x99\x97\xea\x4a\xa3\x7f\x13\x31\xfe\xa9\xda\xfe\x4d\x2e\x94\x73\xe4\xa5\xc7\x44\x99\x3e\x69\xb2\x24\xfd\x13\x34\x37\xbf\x9e\x28\x6a\xff\xc9\x9e\x7b\xf3\x7f\xfb\x70\xcc\x8e\x96\x97\x8e\xd6\x73\x5b\xb2\x98\x7c\xf4\xd1\x55\x47\x54\x7e\xa4\x9e\x86\x0b\x3c\x99\x2e\x56\xef\x46\x5b\xbe\xf5\x05\x4e\x4e\x10\xf1\x68\x3d\x66\xc7\x39\xc8\x1b\xd8\x10\x37\x37\x30\x54\x1d\xfa\x02\x34\xca\x9e\x73\xe2\x01\x1b\xaf\x2e\x2d\x03\x4f\x27\xd1\x14\x6c\x40\x49\x21\x63\xee\x2e\x65\x0c\x84\x9f\xcf\x38\x2b\x36\xb1\x30\x2c\x87\x41\x4e\xd4\xd4\x25\x61\xc3\x51\x73\x61\x20\x7c\xb6\x6f\xba\x19\x9b\x2d\x2f\x37\xd3\x57\xf0\x47\xdb\x99\xaa\xe6\x1a\x3b\x4f\x06\xc2\xaa\x24\xb6\xaf\x1d\xbe\xf6\x88\x23\x80\x3d\xe7\x93\x59\xa5\xf2\x2b\x64\x50\x91\x42\x25\x35\x4d\x61\x3f\xb2\xe0\x2e\xad\xbf\x19\xe6\xe5\x09\xfb\xe2\xb7\x89\xaf\xc5\x54\xce\x6a\xf4\x91\x63\x97\x11\xf4\x85\x7c\x56\xc2\x22\xcf\x61\xe3\x41\x7e\x52\xc9\x6b\x6e\x0c\xb7\x38\xfd\x9b\x57\xcd\xf8\x3e\x87\x91\x95\x72\x64\x33\x62\xe0\x6f\x39\x54\xdf\x93\xfb\x6e\xc2\x34\xa9\xfa\xbd\x14\xcf\x34\x9c\x20\x2c\x49\x39\x95\xa7\xd4\xf3\x04\x6a\x3e\x0a\x3b\x2c\xf6\x9c\x9b\x53\x04\xfd\xf7\x45\x95\xf2\x6e\x23\x5c\x93\xa0\x69\xb4\x6c\x79\x4d\xd3\xbc\x42\xee\x94\x64\xf5\xb3\x01\x6b\xef\xd2\x31\x61\xef\x50\x1c\x09\x21\x69\xcf\x39\xae\xb5\xfb\xd9\xa8\x69\x66\xd6\x2c\x12\x12\xd0\xa8\xab\x88\x7f\x0d\xbb\xa6\xdd\xfe\xd1\x8a\x90\x43\x2f\x75\xdd\x34\x57\x7f\x36\x2f\xa6\x82\xf6\xdd\xf8\xe8\x4c\x63\x2b\x90\x02\x85\x80\x0c\x04\x5a\x3c\x45\x23\x10\x66\xcb\x75\x27\x78\xc1\x9f\x93\xc0\x3d\xab\x87\xea\x77\xbd\x19\xdf\x05\xcb\xb5\xb8\xb6\x98\x5d\xec\xd3\x62\x16\x5c\x4a\xea\x4e\x5d\x37\x72\xac\x88\x4c\x31\x7b\x84\x10\xeb\x5c\x20\x8c\xdc\xcb\x53\x10\x20\x67\x85\x57\x26\x9f\x75\xa1\xe7\xf9\x8a\x71\x16\x88\x45\x42\xb7\x6c\xba\x10\x34\x14\xb9\x7c\x7c\x79\xd3\x8c\xfa\x41\x08\x79\x30\xcd\xda\x7a\xc0\x14\xb9\x8b\x95\x13\x88\x5c\xc1\xa5\x5c\x01\x72\x57\xce\x9d\xfb\x95\x75\x87\x29\x5a\xf0\x9f\x00\x39\x4b\xe7\x13\x33\xe2\xa5\x57\x53\x0b\x74\x69\x62\xc3\x4e\x4f\xa8\x5f\x36\x20\x7e\xb4\xd7\x84\x78\xd4\xc7\x5b\xe2\x05\xbe\x10\xa3\x37\xcd\xac\x93\x39\xc3\x88\xba\x4e\xbb\x2b\x87\xf1\x97\x78\xaa\x83\xbc\x30\xd3\xe5\xd5\x52\xd6\xb5\x0e\x09\x5d\xf7\x02\x29\x0d\x7e\x12\xfb\x98\x0b\x91\x61\xc8\x73\x05\xd3\xb9\xb6\x7a\x2e\x29\x74\xf0\x22\x9f\x10\xb2\xf5\x22\x1f\x45\xf3\x79\x0f\x07\x19\x85\x34\x0c\x29\x8e\xcc\xf6\xc0\xbb\xbc\x55\xcf\x2b\x67\xd9\xe2\x1c\x39\x79\x8b\x13\xaa\xf0\xdd\xf4\x5d\x14\xdc\x6c\xe4\xc7\x2c\x13\x7f\x02\xa4\x17\xe9\xb0\xe7\xd9\x62\x4c\xc1\xa1\xba\x7f\xa0\x70\xff\xd0\xf1\x32\x6f\xb0\x41\x3e\x7a\xb6\xe2\xa4\x0b\x3e\xc3\xcb\xa6\x79\x00\x99\x79\xd0\xc9\xcc\xcb\xa6\x99\x95\x02\xeb\x04\x42\x29\x52\x93\xa2\x07\x08\x81\x64\x59\x6c\xa8\x0e\x69\x06\x40\xd1\x46\x4d\x33\x81\x68\x39\xa8\x2a\x6c\x24\xef\x54\xfa\x0f\x1d\xa6\xe9\x64\x8b\x52\xc0\xca\xd0\xa9\xed\x67\x28\xc0\xb9\x98\x1e\x8f\xfa\xea\xc4\x7a\xb1\x84\x99\x52\x18\x69\x72\x76\x7f\x67\x96\x94\xf9\x41\x42\x41\xca\x30\xaa\xe2\xc3\x85\x01\xf4\x19\x19\x48\x62\x47\x8a\x42\x3e\x8e\x09\x33\xcd\x2f\xc4\x2c\xe9\x39\xf1\x28\x27\x72\x19\xdc\x6f\xcd\x0e\x8a\xb7\x50\xe0\xd6\x69\x13\xc7\x6e\xec\xe8\xc2\x90\xa6\x99\x1d\xdc\x11\x6f\x1d\x20\xc7\x8a\xc9\x04\xd3\x09\x0b\x19\xdb\xd5\x81\x85\x69\x9c\xb2\xc8\x8d\x05\xe7\xe5\x80\x1c\x9a\x8f\x9f\x55\x21\x3d\x30\x72\xce\xbf\x8f\x14\x1e\xc5\xf5\x86\x28\x52\x96\x03\xc8\x3c\x57\x3f\x36\xde\xbc\xcf\x6b\xfa\x74\x05\x39\xf1\xd5\x31\x2f\x59\x58\x24\x79\xfa\x1b\x8b\xae\xd8\xd3\xa1\x64\x55\x95\x16\xb9\x73\x65\xcc\x65\x95\xc7\x3c\xbd\x3f\xb2\x37\x45\x39\x25\xff\xd2\x18\x2b\xc0\x03\x19\x99\x85\x76\xc4\x6a\x16\xd6\xaf\x8e\x87\x2c\x0d\x69\xcd\x2a\x7c\x47\x24\x4a\x7d\x53\x73\xd2\x05\xa4\xda\xe2\x62\x97\xd3\x30\x3c\xc1\xfa\x1c\xe1\x4c\xb1\x5d\x01\xa1\x5e\xcc\xd9\x2e\x38\x64\xbc\xd8\x07\xa1\x97\xe4\xb9\x62\x84\x34\xa1\x3b\x95\x3a\xf8\x20\x77\xc4\x2b\xa4\xe0\xf3\x0e\xa4\xf9\x98\xb6\x98\x91\x04\x26\xff\x2d\x7b\x9a\x1a\x40\x48\x0c\x03\x70\x65\xac\x9d\xd5\x3d\x3b\xce\x19\xbf\xb8\x69\x3e\x13\x3f\x2b\x78\x15\xcc\xda\x99\x46\x28\x18\xe8\x80\x3e\x43\x5e\x77\x58\x54\xff\x08\xda\xc4\x94\x50\x1b\x74\x17\x80\x36\x5c\xd3\x35\xff\xa0\xcb\xea\xc3\x39\x68\x3b\x77\x17\x86\x1f\x8b\xa6\x3f\xd1\x11\xac\xe8\xe9\x4f\x1c\x5a\x44\xbe\x7e\xde\x80\xc9\x87\x3a\x82\x5e\xa2\xd1\xe2\x48\x88\x32\x05\x7e\xa9\xc8\x49\xbb\xc8\x71\x3e\x5d\x62\x41\xa1\x7f\x5f\xb1\x63\x54\x38\x29\xc5\x80\x90\x9c\x9f\x70\xbf\x3b\x9c\x53\x8b\x39\x5b\xcb\x7f\x4b\x96\x81\xde\x83\x73\x32\x5e\x18\xce\xf9\x3d\xb8\x30\x0a\x99\x2d\x5b\x6c\x5c\x4d\xa4\xb7\xd8\x98\x77\x9f\x4b\xf6\x90\x16\xc7\x4a\x8e\x7e\x50\xf6\xdf\x97\x32\xb5\x2d\x3e\x94\xec\x35\x08\x8d\x9c\x13\x28\xcd\x4c\xc9\xb8\xbc\x95\x4f\xf8\x9f\xa1\x00\x09\x53\xef\x63\x9f\x58\xfc\x6f\xd3\x50\xef\x13\xf8\xfb\xa9\xdf\x34\xfa\x8e\x12\x39\x39\xaf\x06\x10\xf8\x9c\x43\x20\x94\x33\xf8\xbe\xf0\x3e\xf6\xe1\x42\x0c\xf7\xfa\x09\x9f\xa0\x56\x6a\xe3\x7c\xb0\x27\x03\x04\x83\x8d\xbc\xde\x8a\x06\x56\x7e\x57\xd3\xc7\xc8\x95\x9d\x53\xdb\xd9\xa2\xde\xd2\xe7\xfd\xfe\xc4\x27\x73\x8b\xff\xb8\xbc\xc7\xfc\xf1\xcf\x7e\xd3\xac\x90\xf3\xfc\xda\x32\xd8\x03\xcb\x45\x65\x1f\x83\xfa\x78\x14\xa9\x37\xc4\xcb\x7e\x2a\xca\xfe\x5f\x7f\x4e\xbd\xff\x3e\xcb\xe0\xf0\x1f\xd3\x1c\xb7\xd8\x2a\xd5\xa3\xa9\x7d\x33\xe3\xcd\x9b\x26\x9f\x1d\x05\x68\x3f\xd9\x30\x07\xf2\x26\x94\xd7\xe1\xf2\x6d\xe8\xc0\x80\x5c\x9e\x93\x0c\x67\xdc\x09\x4d\xf3\xad\xc8\x1e\xf2\x63\x2d\x20\x89\x15\xe2\xd9\x12\x89\x97\xce\xfa\xce\x32\x90\xd1\x5d\x47\x2c\x02\xb4\x50\xcf\x08\x16\x66\xc9\xeb\x5d\xf6\x73\x18\xf0\x11\x3f\xf7\x95\x6d\x1f\x7c\xd1\x57\xeb\x63\x84\x5a\x0e\xce\x02\x80\xde\xbe\xfc\xcb\x84\x31\xc4\x48\xee\x38\x7d\xe1\x25\xc4\x45\xee\x99\x22\xef\x6c\x20\x87\xd2\xc4\xae\xea\x72\x81\xa3\xc0\xe9\xbb\x2e\x29\x74\x14\x9a\x64\xe7\xdd\x7a\x2f\x6f\xd2\x3b\xb3\xb2\xa6\xb1\x82\x81\x32\x91\xf5\xae\xd3\x86\xa3\x73\x43\x68\x10\x35\xcf\x90\xc1\xe7\xf4\xbd\x45\xf1\x44\xbf\x02\xb1\x04\x13\x38\x2d\xec\x05\x4e\xda\x4b\xd3\xfc\xbe\xb0\x75\x2c\x68\x95\x22\x7f\x03\xc1\x4e\x6b\x51\x8b\x47\x1b\x77\xa0\x27\xdf\x7d\x56\x77\x52\x44\xd2\x03\x56\xa4\xd9\xd4\x09\x6d\x7a\xe6\x72\x5e\x90\xcf\x9b\x33\xe3\xd3\xc1\xe6\x1c\xa7\x1b\xe2\x93\xcb\x29\xd3\xd0\x51\x39\x5c\x36\x83\xd7\x77\xf2\x35\x34\xcd\x25\x21\x84\x75\x80\x16\x22\xc7\xb8\xee\x13\xf5\x84\x17\x8b\x95\x63\x3c\xd3\xd3\x04\x3c\xf5\xc0\x28\x9a\xfa\xb7\xcc\x62\x71\x64\xc1\x3a\x30\xfa\x8e\x63\x43\x50\x4d\x42\xe3\x4a\x1b\x51\x02\x8e\x39\xb8\xdb\x64\x1d\xa8\xaa\xba\xe7\x2b\xa8\x7d\x6e\x2c\x0c\x00\xde\x31\xb2\x51\xd6\x65\x52\x15\x87\x00\x6e\x01\xb2\xae\x07\x7a\x9c\x10\x23\xa3\x55\xad\x7f\x5f\x7c\x82\xf0\x96\x18\x52\x1f\x10\xba\xa1\x66\x97\x1f\x76\x91\x9c\x1f\xf7\x1c\x6a\x66\x33\x9d\xb9\xd0\xe0\x9d\xf7\x24\x15\xfd\x18\xe8\x34\x93\x78\x46\x48\xe2\x1a\xda\x69\x67\x4c\x9c\x00\xf7\x43\x2e\xa5\x24\x5b\xce\x80\x4d\x6f\x16\x5c\x91\x59\x6a\x9a\xb3\x2d\xae\xc9\x6c\xc5\x8f\xed\x7b\x38\x9d\x63\x45\x4a\x1c\xd0\x69\xdf\xf1\x17\x7b\xb2\xf7\x0e\x20\x02\xdf\xba\xfb\xcb\xdb\xaf\x74\xf8\xc8\xf7\x63\x32\x78\xb6\x5a\x17\xe4\x40\x8c\x22\xcf\x40\x05\x9c\x9a\xe6\xac\x30\xcd\xc1\x70\xda\x6e\xfb\xa7\xb1\x55\x10\x2f\x71\xef\xb5\xd3\xde\xb9\xb7\xf9\xf4\xc3\xb3\x8f\x13\xd3\xac\x78\xef\xee\x71\x46\xf6\xde\xd1\x6f\x1a\x8b\xff\x80\x3d\xde\x1d\xc9\xbc\xbd\xa4\xbc\xbe\x7a\xc5\x93\x06\xef\x90\x67\x47\xee\x3c\xea\x83\xea\x54\x4e\x76\x1c\x07\x82\x3e\xd3\xce\x5b\xf9\xb8\xe6\x14\xf1\xce\x7b\xee\xe3\x3d\x7f\xba\xd7\xb4\xca\xbc\xdc\xef\xa6\x63\x3e\xe7\x84\xb3\x69\xf2\x69\x69\x1a\xab\x26\x39\x59\xa2\xa6\x29\xec\x43\x71\xb0\x40\x19\x6a\x38\x13\xa6\x39\x9f\xd7\xa6\xb9\x07\xa6\xf3\xc4\x9b\x27\xde\x23\xce\x71\xed\xaf\x85\xa1\xcf\x40\xcd\x69\x4f\x82\xff\x37\x43\x43\xb8\x16\xb6\x42\x7f\x7c\x1c\xff\xe1\x8a\xcb\x81\xc2\x30\xfe\x67\x43\x50\x93\x53\xfb\x08\x8b\xf9\x1a\x5a\x36\xd5\x0b\xc2\x60\x18\x51\xd3\xd4\xff\x15\x11\x42\x96\xa6\x59\xdf\x44\x2f\xc8\xb2\x6d\x27\xce\xdd\xfe\x2e\x03\x28\x61\xa0\xd4\x2a\x98\xa4\xc8\xae\x58\x2d\x88\xa1\xca\xa3\x23\x6e\x47\xa3\x22\x8c\x63\x2e\x2f\xd0\x59\x74\x25\x2a\x10\x54\x7e\x67\xb9\xe3\x1d\x7d\x17\x18\x16\xa6\xd8\xb9\x95\x6b\x85\xc4\xa3\x98\x62\xc3\xc0\x81\x8f\xf5\xb6\x46\xd6\x02\x16\x1d\xb3\x4f\xba\x72\x01\xed\x6d\x80\x62\x02\x7c\xd5\x05\x95\x82\x88\x7c\xc5\xcf\x28\x2f\x01\x8a\x27\xf2\xc9\xcc\x0a\xf9\x0f\x7c\x69\xd1\xd4\xa9\xca\xab\x5b\xe2\x90\xa7\x32\x4e\x1a\x8a\xb9\x71\x4e\x79\x51\x3b\xe9\x50\xe6\x28\xce\x50\xcf\xc7\xd2\x43\xc0\xf6\x5c\x51\xaa\xbf\xd2\xe1\xd3\x31\x1c\x03\xc7\x6c\x9d\xb2\x63\x42\x22\x25\x25\x60\xd8\xf3\x39\x1a\xa5\xe7\xea\x63\x56\x4c\x12\x6f\xeb\x0b\x3a\x65\xcb\x87\x13\xf0\x9f\x18\x0d\x07\x83\x19\x8e\xfb\xe3\x18\x08\x1a\x1c\x71\x16\x9b\x57\x0f\x16\x4d\xf0\x11\x5e\x67\xa1\x80\xeb\xb6\x45\x78\x4b\xab\xf1\x18\x2f\x6a\xbb\x48\x85\x4d\x8d\x57\x6f\x11\x56\xac\xfa\x85\x5a\xe8\x98\x0e\xc2\xe7\xf5\x5a\x81\xce\xe5\x80\x3a\x4b\x9e\xb3\x92\x33\x5c\x4d\x03\x7c\x6e\x77\xde\x51\x7e\xde\xf1\x66\x33\x9a\x27\x17\x9a\xfc\x51\x92\x8f\x40\x27\x5c\x82\x5f\x28\x0f\xd0\x8b\xcf\xba\x38\x3a\x22\xce\xd4\x8c\xd6\x51\x71\x05\xd7\xa0\x07\x37\xb0\xa1\xa2\xb1\x06\xe1\xd3\x3e\x73\x78\x02\x6f\x7f\x9c\x26\xbe\x77\x76\x2b\x24\x1c\x35\x17\x0a\x9d\x9e\x25\xdc\x18\x76\xe3\x86\x73\x5b\x82\xc5\x58\x9a\x3a\x56\xfa\x42\xbd\x34\xb5\x45\xb8\xa6\xe5\xc0\x91\x81\xae\xb8\x5b\x84\x54\xc8\x76\xfb\x67\xbe\x2b\xb7\x83\xab\x6c\x71\xce\x03\xf9\x10\xd8\x69\xd4\xe2\xb2\x28\x26\x1d\x23\x50\x42\x48\xd1\x62\x30\xb0\xb9\x94\x9e\xdb\x34\xe4\xac\x9f\x14\x61\x9b\xa6\x35\x83\x26\x5f\x83\x55\x4e\xd3\x3f\x5b\x9c\xdc\x9c\xcd\x38\x56\x00\x99\x35\xb5\xb7\x25\x8b\x9b\xe6\xdf\xd4\xae\x69\x00\xfa\x6b\x60\x97\x0f\x57\x19\x4e\x41\xad\xd9\x0a\x61\x75\xb5\x01\xef\x4b\x84\xe5\xb5\xd7\x24\x75\xfe\x07\x35\xd1\x02\xde\x0b\x6a\x2b\x83\xa2\xc6\x10\xf7\x54\x5a\x92\xba\xfa\x6b\xb1\x7a\x9a\x26\xdd\x75\xfd\x30\xfd\xad\xab\x00\x06\x85\xfb\x0a\x41\x85\xbc\xc5\x6c\x7f\xa8\xdf\x0f\xaa\xfc\x43\x72\x80\x34\xb6\x7a\x81\xc4\xed\x9f\xa7\xec\x8f\x45\x1f\x26\x7a\x3b\xeb\x4e\x08\x1b\x5a\x87\xab\xe0\x2d\xa3\x11\x2b\xa7\xc6\xf6\x8b\xdc\x71\xdd\x9c\xa2\x16\xc3\x04\x4e\x65\xfe\x79\x22\xb3\xd0\xc4\xfb\x5f\x2e\x93\xa6\xcf\xa7\x80\x46\xfb\x14\xb4\x18\x0c\x45\xce\x6d\xb4\xc7\x55\x5d\x6a\xd3\x34\x0d\x5e\x43\x5f\xbf\x69\x5a\x82\x81\xb0\x02\x32\xe6\x55\x80\x18\x46\x9c\x57\x51\x65\xc6\xd2\x41\xe5\xfb\xe2\xa0\x21\x31\x35\x49\xde\xd2\x07\x1c\x37\x4a\xd6\x84\xa0\x5e\xb0\x58\xf1\x3c\xec\x7e\x9c\xa3\x67\x82\xbc\xf0\x76\xe9\x86\xf3\xc0\x09\x21\xe7\x03\xcb\xcf\x6b\xd3\x2c\xed\xd6\xe1\x6d\xb0\x0e\xe7\xe4\x39\xa2\x63\xed\x04\xda\x22\x5c\x44\xd1\x87\x8a\xaf\x7e\xa7\x78\x76\x36\x94\x81\xfd\x30\xe9\xfa\xba\x5e\x2c\x38\x11\xb3\x56\xd5\x44\x83\x6a\x92\x3f\x5c\xcd\x7c\x1e\xdd\x06\xd3\xb5\x80\x4e\x8e\x02\xf0\xbc\xde\x12\x0d\xdc\xef\x3b\x9b\xfd\x53\x49\xa3\xb4\x70\x66\x4b\x81\x46\x82\xe2\x89\x3f\xc7\x69\xc6\xf8\xef\x81\x56\xd5\x63\x51\x46\xfc\x39\xdd\xd3\x84\x7f\x6c\x51\x4f\x59\x05\x3e\xd9\x53\x2b\x40\x7d\x75\xd5\x31\xd8\xa7\x35\xcf\x5f\xb2\x8a\xd5\xe7\xf9\x73\x91\x5f\x29\x3c\x96\xd4\x42\xa7\xb6\xa4\x9a\x6b\x1b\xa5\xe9\x54\xf5\x3d\x1e\x90\x54\xc0\xc7\x97\x14\x27\x9c\xdb\xad\x8b\x3b\x96\xa7\xbf\x31\x32\x49\x04\xea\x66\xa3\xe4\x37\x25\x14\x48\x63\xeb\xae\xd3\x0b\x71\x97\xce\x5d\x27\x67\x5d\x6f\x09\xc5\x29\xa7\x7a\x76\xbc\x71\x25\x3e\x53\x94\x0a\x3a\x85\xa6\x39\xb3\x18\xf9\x87\xb0\x85\xd8\x82\xbb\x05\xbe\x45\xb6\x64\x2b\x2b\x61\xde\xd2\x57\x9c\x6e\xd3\x6c\x11\x4e\xa5\x44\x96\x78\x3e\xe2\x07\xdf\x6c\x85\x2d\x46\x7e\xe8\x6a\x00\x0b\x69\xa6\x94\xc3\x71\x2c\xb2\x9f\x84\x94\x3b\x14\xee\x13\xa0\x52\x8d\x04\xbb\x02\x45\x85\xbe\xd1\x8e\xb7\x16\x2b\x91\x5c\xa5\xf9\x95\x9a\x46\xc4\x3b\xfc\x93\x97\xf8\x5a\x9f\x77\x5e\xe2\x8b\x91\xf0\x27\x8b\x49\xb7\x11\xbf\xd3\x8b\x04\xcb\x2b\x18\x87\x5d\x6a\x3d\x8d\xad\x59\x28\xfd\x19\x74\x33\xbc\x95\xe9\xce\xd6\xed\x65\x67\xc8\xf9\xcd\xa2\x38\x45\xdd\xdc\x6b\x4e\x9f\x2a\xaa\x0e\x00\x81\x20\x97\x78\x60\x81\x63\x18\xeb\xe0\x36\x5c\x07\xf3\x39\x8a\xe6\x60\x5c\x2e\xee\x04\x7a\x35\xa3\xae\xa6\x9a\x0e\xed\xbf\x02\x3b\x4a\x4b\xcc\x38\x1d\xc1\x9e\x6a\x4e\x65\x37\x4d\x84\x13\x12\x9a\xa6\x2e\x7c\x25\x84\xc4\x78\x4b\x9e\xfa\xcb\xb3\x40\x9c\x43\xee\x80\x7f\x67\xbd\x2c\x3e\xf0\x22\x5f\xb1\x82\x81\x76\x0b\x9d\x74\xd2\x68\x59\xa2\x27\x5b\x3e\x24\x0b\xe0\x4c\xd1\x16\x20\x35\x3d\x6f\x63\xa2\x11\xd3\xa4\xb2\x96\xee\xb6\x79\x28\xf3\xbe\xdc\x3f\xb8\x8f\x08\x04\xf3\x16\xe8\xcc\x5b\x30\x62\xde\x82\x11\xf3\xc6\x4c\x93\x91\x0f\x58\x9d\x88\x46\x9b\x26\x58\x2b\x73\x1c\x8b\xb3\xac\x31\x27\xf3\x87\xec\x2a\x21\x64\xab\xe6\x69\xef\x3d\xf7\x09\x67\xca\x61\x9b\x7a\xb1\x4f\xf6\x18\xbe\x9d\x0f\xb0\x27\x00\xbb\xf5\x3e\x0e\xf4\xa7\x7b\x06\x6d\x30\xd5\x9d\xb4\x8c\x9e\xdb\x27\x80\xe3\x36\x8f\xf9\x32\xe3\x04\x41\xe1\x50\x7e\x70\x75\x2d\x3e\xd0\x73\xfc\xbc\x04\x08\xeb\x7c\x4f\x30\xf0\x3d\x21\xf8\x0a\x2f\xf2\x71\xa8\xdd\x39\xf4\xf6\xf8\x54\x17\x4f\xa9\xba\x38\x03\xe5\xf9\x78\x4b\x96\x38\xed\xb7\xc0\x8e\x08\xcf\x0d\x41\xe7\x7e\xc8\x8a\x09\x95\x0c\x14\x47\x51\xa1\x15\x43\x3d\x4d\x63\x25\xea\x42\x08\xef\x40\x89\x82\xbf\x6c\x91\xee\xd7\xa7\xeb\xc2\x93\xd6\x05\x8d\xd1\x8a\x4c\x73\xc6\xd9\x3c\xd3\xb4\x22\xf2\x44\xad\x08\xc1\xda\xcf\x98\xf8\xc6\xf8\x37\x9e\x1f\x0d\x14\xe5\x25\xe6\x1d\x41\xb5\x8f\x73\xfe\xa7\x20\x89\x1a\xcb\x81\xc4\x4d\xf3\x40\xad\xa0\x69\x8c\x6b\x03\x6f\x7b\x55\x10\x6f\xeb\x3b\x5b\xe0\x19\xef\xc9\x8c\x36\xcd\x2c\x36\xcd\xc0\x3d\x38\x8f\xd4\x3a\xe0\x3d\xa6\x50\x3d\x2e\x49\xe8\xb2\xa6\xb1\x62\x97\x3a\x45\xd3\x44\xc8\xf5\x7c\x27\x71\xee\xc1\xd2\xc3\x34\x43\xeb\x1e\x97\x22\x67\x84\x4e\x3b\xf2\x48\xad\x12\xe7\x08\x47\xd6\x0e\xf3\x89\xe5\x09\x77\x64\x37\x04\x84\x3b\xce\x92\x66\x64\xe7\xdd\xc1\x8c\x96\x5e\xee\xdd\xf9\x9c\x2b\xbd\x97\x4f\x19\x42\x6d\x77\xfb\xc5\xe9\x76\xf1\xc0\x1b\xf0\x7c\x7c\xd7\xa9\xd1\x0c\xeb\x2b\x45\x7d\x3b\xb1\x08\xf7\xde\x1d\xaf\x68\xcd\x80\xbe\x12\x3a\x88\x3b\x9c\xa2\xf6\x77\x8a\x5b\x3b\xc2\xdc\xaf\xac\x18\x67\xc8\xd9\xf3\x4f\x2f\x16\x2b\xd3\xb4\x62\x6f\xc7\x7b\x98\xf0\x1f\xde\x3d\xb1\xfd\x4b\x18\x30\x21\x24\x71\x4b\x75\x09\x58\x60\x55\x3f\x72\x4a\x84\x99\x2b\x7b\x90\xe0\x12\xa7\xc8\x51\x36\x57\x09\x2e\x07\xa6\x09\xef\x87\x48\x19\xc3\xf1\xda\xc3\x64\x42\x22\x5b\x5d\x79\x79\x70\xcf\xc0\xcf\x0c\x0e\xba\x49\xd3\x68\x49\xfc\x04\xc6\x29\x49\xdc\x95\xb3\xc4\x77\x97\x2c\x4c\x05\x2d\xbb\xc5\x9c\xbf\xc9\x2e\x64\xfa\xca\x0a\xb0\x60\x95\x65\xc6\x3d\xf1\x74\x51\x4a\xbf\xcf\x67\x09\x87\xdd\xa6\x09\x67\x84\xec\xf8\xa6\xb0\x02\x12\xa2\x1e\xd2\xee\x64\x76\x27\x93\x0f\xbd\x3f\x3a\x21\x4c\x60\xad\xbf\x4e\x6f\xe3\x75\x2a\xfc\x32\x84\xc3\xb1\xa6\x72\xac\x68\x4f\xbc\x9a\x5a\x47\x6a\xed\x11\x0e\x91\xdf\xe1\xbd\xb0\xa3\x69\xb4\xdc\x72\x9a\xc5\x0d\x2c\xff\x2a\x0f\x57\x84\x43\xef\xe8\x8b\x99\x66\x64\x3e\x4f\xd7\xec\x36\x5e\x33\xd1\xf2\xa0\x5d\xa6\xda\x1d\xc8\xcc\x9e\xa8\x95\xbe\x58\x99\xa6\xe8\x06\x3c\xf2\xf3\xb4\x93\x70\xa7\x8b\x15\x52\x0e\x53\xe4\xf9\x6e\x5c\x89\x4b\xae\x74\xf1\x5c\x54\xe9\x1a\xd7\x86\x63\x18\xad\xe6\xc7\x4b\x59\xc8\x85\x38\xbd\x65\xa6\xf9\xbe\xaf\x32\xc5\x8c\x63\x84\xdb\x58\x7c\xed\x84\xe6\xdd\x57\x38\xce\x51\xbb\x57\x14\xb3\xa2\x0c\xa0\x87\x3d\x80\xfd\x36\x34\xfe\xea\x04\x30\x9a\x23\x9f\x17\x4b\x1c\x93\x31\x8a\xc1\x77\xa2\x4c\x86\x0b\x7c\x8f\x4b\xb2\xc4\x15\x31\x96\x06\xae\x49\x6c\x9a\x9e\x8f\x8f\x7c\x67\x3d\x90\x1d\x7e\xe2\xa8\x06\xf4\x92\x95\x6a\xb6\xc5\x51\xce\x1d\xc2\xef\xc9\xe3\x9c\x08\x36\xe7\xc1\x5d\x39\x03\x57\x66\x4d\x63\xaf\xf0\x6f\xe4\xa9\xf3\xbd\x53\x94\xd6\x9d\xf0\x2a\x27\x34\x95\x92\xa6\xb9\x43\xeb\x6a\x46\xc8\x6f\xa6\x29\x9d\xc0\x65\xe4\xc9\xab\x7c\xb4\xae\xe6\x73\x81\x1a\x4c\x33\x43\xa7\x82\x2c\x71\xd2\x34\xd9\x99\x6a\x53\xde\x34\xd6\xde\xca\x38\x51\x35\x3b\x28\x09\xc8\x3d\xa1\x5e\x21\xb5\xd1\xef\xad\x8c\x97\xcc\xf1\x16\xa1\x93\xa4\x28\x33\x24\xe5\xc9\xbc\x37\x8f\xe4\x3d\x6a\x43\xd3\xb4\xac\x8c\xcc\xee\x79\x6b\xa6\x59\x2e\x16\x38\x36\xcd\x5a\x65\x07\x9c\x55\xce\x49\x85\x43\xd3\xe4\xfd\x2d\xa1\x4b\x5d\x73\x81\x68\xee\xde\xaa\xf1\x91\x4f\xad\xa6\x70\x5f\xbe\x58\x4a\x39\x72\xb5\x58\xa0\xda\xab\xfc\xa6\x39\xc2\x5f\x8b\xff\x90\x2f\x85\xa6\x48\x8a\xd0\xfa\xc8\x51\xce\x11\xb5\x0a\x8f\xa4\xf8\x88\xf0\x9d\x69\x72\xf4\x7d\xec\xd6\xd1\x34\xcb\xce\x5b\x13\x07\xd1\x81\x0a\x85\x95\xf6\x2a\x0a\x62\x6c\x78\x47\x1e\x10\xae\xdb\xde\x34\x82\x9f\x35\xc8\x89\x55\xbe\x2d\x49\x84\xd2\x5a\x9a\x4d\xf3\x02\x52\x07\x03\xfc\x37\xbd\xd4\x38\x81\x59\x8c\x4e\xe2\x7a\x30\x01\x0b\xe0\x1e\xf2\x94\xbe\xd5\x62\x81\x62\xf2\x9e\x5a\x81\x17\xfa\x08\xc7\xde\xd1\x77\x3b\x2d\x0b\x87\xa9\xa7\x75\x4c\x5e\x5a\x14\xff\xc6\xcf\x42\x7e\x42\xc6\x9d\x22\x01\xa1\x9a\xda\x7b\xda\xab\x18\x90\x4b\x32\xd3\xce\xcb\x0d\x99\x72\x81\x66\x9a\x14\xe7\x64\xc6\x4c\x33\xb1\x28\xd9\x77\xcd\xf0\x53\x08\x0e\x3d\x12\xc2\x9d\xc0\x0a\x04\x51\x12\xd1\xf3\x35\x4c\x49\x0e\xd2\x51\xed\x0e\x98\x73\x27\x72\x0d\x9e\x9b\xa6\xf1\xd5\x2b\x8e\x07\xac\x1d\x49\xbd\xa5\x8f\x24\xfb\xff\xd9\xc8\xd6\xf2\xc0\x37\x50\x87\x85\x52\xb8\xb0\x07\x2c\x04\xaa\x90\xc4\xea\x0c\x41\xac\x9d\x42\x69\x3a\xf7\x22\xe4\xa3\x01\xe2\x7d\x44\xde\xd2\xc7\x33\xcd\xbd\xcd\x1e\x2e\xb4\x07\x72\x3f\xdc\x23\x94\x54\xb1\x27\x82\xdc\x57\x63\x6b\x63\xf2\x93\xad\xfb\xc9\x50\x36\xc6\xee\xd2\x49\x87\x6b\x19\x2f\x16\xd0\x4d\x3e\xc2\xd8\xc7\xda\x38\xc0\x67\xad\x86\x4c\x39\xb5\x9a\x11\x31\x16\x79\xee\x32\x92\x7d\x68\x48\xd2\xb4\x39\x55\x47\xdf\xb4\x89\xb3\xb4\xe5\x4e\xd5\x61\x1c\xe3\x15\x1f\x22\xeb\xf4\x6e\x2b\x6a\xa5\x08\xcf\xe8\xd8\x90\x9c\xc3\x07\x0e\xd5\x0d\x92\x84\x28\x6b\xdf\x34\x5b\x8b\xe2\x1c\x21\x8b\x81\x16\x16\x0e\xf1\x2c\x68\x9a\x0f\xdb\x59\x83\x0f\x36\x5d\xd7\x88\x1c\x95\xe1\xae\x81\x94\xa6\x91\x54\xfa\x05\x93\xa7\x23\x3e\xd7\x57\x22\xb3\x59\x86\xf7\x16\xc2\x43\x3d\xd0\x0b\xb6\x5e\xab\x0f\xa8\xd5\x7e\xc0\x8a\x79\x42\x1f\xbf\x23\xee\xa7\xd4\xf2\xff\x24\x74\xf0\x0d\x6c\xfc\x49\x88\xb0\x7a\xe9\xe1\x48\x76\xc5\xf3\x73\x2e\xba\x69\xee\xa8\x90\x64\x35\x20\x7b\xdd\xb2\x34\xd9\xd6\xcd\x63\x1a\xd5\x5b\x03\x8f\x65\x30\x82\xbf\x9d\xb6\x0f\x0b\xb0\xd1\xdd\x0e\x0f\x59\x21\x77\xe5\x3c\x17\x06\x7c\xbd\x16\xdc\x99\xa6\xf7\xe4\xb8\x40\x5e\x77\x03\x46\x1e\xda\x48\x86\x2a\xfe\xb0\x19\x0c\x70\xb1\x69\xfc\xce\xa0\x45\xd6\x6e\xd4\xb2\xe4\xe4\x20\x4d\xf3\xf7\x85\x85\xfd\x44\x28\x4b\x4b\x50\xb6\xba\xb4\x64\xd2\x19\xe1\xa8\x4f\xbd\xa6\xbe\xec\xd6\xdf\xce\x3a\x04\x5c\xd5\x7a\x38\xf7\x5e\xe0\x83\xe8\xd8\x1d\xcd\xb5\x03\x7e\xf2\xa6\xf5\x08\x23\x4d\x8f\x30\xd2\xf5\x08\x11\x4e\x68\x0b\x96\x77\xb0\xe1\xc9\x13\xf8\x3a\x3d\x94\xe4\xa9\x57\x07\x93\x9f\x3c\xc3\x31\x84\xef\xd4\x43\xd9\x89\xa7\x4a\x5d\xff\x4f\xbd\x90\x27\xed\x2b\x2e\x85\x6b\xea\x27\xa5\x65\x07\x6e\xf0\x7e\xf9\xe6\xeb\x57\x45\x48\x9e\xc4\x23\x2e\x7b\x9d\xd0\xa7\xee\x91\xb7\x0b\x2a\x8e\x9d\x4a\xed\x93\xfc\x00\x8a\x9c\xef\x2f\x78\xba\x81\xd3\xae\xd3\xc1\x0c\xd5\xad\x0a\x05\x79\x09\x12\x9e\x42\x7a\xd1\xb9\x12\x0d\x68\x5f\x24\xd9\x52\x82\x45\x53\x65\x85\xea\x6a\x56\x9e\x7d\xb4\x3b\xa2\xa3\x16\xff\x76\xd1\xb5\x99\xe7\x4f\x48\xed\xc7\xe6\xfc\x74\x06\xb2\xed\x50\xd5\xac\xa9\xe4\xbd\x54\x53\x0d\x78\x77\x80\xe6\x7b\x79\xd1\xe7\x43\xaf\x6d\x7f\x50\x7f\x68\xe4\x1b\x8f\xf7\xf7\x0b\x72\xf3\xee\x56\x78\xe7\xf6\xde\x6d\x6e\x36\xcb\x17\x0e\xf8\x38\xab\x37\xe5\x26\xdf\xc4\xfe\x35\xf2\x86\xef\x9b\x1b\xf7\x85\xe5\x3a\xb7\x9b\x9b\xcd\xea\x45\x03\x8e\x90\x5e\x91\x9b\x77\xb6\xf7\xce\xf9\xd3\xc6\xdb\xd8\xd8\xbf\x7e\x76\xd3\x77\xf4\xcb\x91\x02\xcf\xc0\x15\x62\x80\xdc\xd2\x4e\x4a\x76\x18\xa8\x1f\x71\x2e\xa6\x33\xc1\x56\x5a\xcb\x11\x06\x85\xde\xb0\x45\x4e\x7f\x34\x4f\x95\x1e\x72\x54\xb2\xc8\x99\x0f\x99\xe0\x83\x45\x7b\x17\x9c\x9c\xd9\x92\x75\xbc\x52\x5a\xd5\x6e\x29\x59\x1b\xe9\xa3\xd3\xb1\x02\xa2\x7f\x42\xf8\x3f\xab\x7b\xec\xec\xa1\x45\xa8\x55\xf5\x5d\x00\xf5\xc0\x5b\xfa\xda\x65\x9e\x45\x89\xe1\xe4\x45\x6d\x81\x6a\x17\x32\x10\x16\x42\x2f\x75\xc2\x82\xc6\x8e\x3e\x6b\x40\xaf\x8c\xb4\xcb\x41\x83\xca\xf5\x22\xdf\xf1\x7c\x67\x98\xc5\xa2\x6a\x48\xc1\xd4\x90\xce\xbb\x8f\x35\x87\xd7\xd6\x09\xf4\x43\x27\x54\x05\x71\x34\x70\xe5\xcd\xe0\x4d\x77\xaa\xd9\xab\x90\x29\x24\x38\xf6\x6c\xce\xb7\xaa\x9c\x79\xed\xb6\x05\x64\xf3\x64\xb9\x0e\x6e\x23\x90\x99\x72\x72\xbe\x37\x87\x61\x5e\xe0\x63\x70\xef\xde\x0b\xd6\xa4\x18\x39\x24\xa3\x06\x3c\x1f\x61\xbd\x26\x31\x2f\x16\xc5\x50\x89\x66\xe7\xf9\x62\xe5\xea\x28\xd1\x0a\x91\x13\x76\xaa\x84\x13\x73\x36\x6a\xe7\x4b\xe9\x43\x1d\xe8\xd8\xd9\x0a\x81\x2f\xe8\xc9\x7b\xb6\x0f\x16\x5c\x0a\xe7\xc5\x53\x57\x7f\x33\x99\xf3\x5c\x99\xcf\x34\x5f\x76\xf4\x23\x88\xa9\xbb\x5e\x28\x5b\xf3\x56\x68\xd0\xbf\xc6\x7f\x11\xce\xcc\x36\xd5\xb5\x75\xeb\x6d\x1e\x37\x3f\xfb\xf3\x17\xc8\x7b\xf7\xc2\xbf\x6e\xfe\xa4\xfb\x33\xfb\x2b\xe9\xa2\x06\x4c\x42\x30\xc3\x31\x1c\x6e\x83\x75\xed\x48\xf9\xd7\x13\x9d\x14\xc8\x99\x18\xb7\x82\x6f\x5f\xfa\xa6\x69\xbc\x10\xcf\xbd\xb7\x2f\xbf\x77\xe3\xf9\x82\x7c\xec\x7a\x42\xd2\x00\xca\x12\xbe\xf3\x17\xe5\xcd\x09\x83\x45\x0b\xf3\x78\x76\x45\x89\x73\x0a\x32\xb0\x45\x84\x01\xd7\x0a\x9a\x26\x44\x72\xa5\x91\x73\xe6\xfd\x3d\xe8\xd2\xc0\xc4\x45\x79\x85\x0a\x48\x70\x95\xe6\x55\x4d\xf3\x90\x77\xb9\x74\xf9\x2e\x75\x02\xac\x87\x01\xc0\xa5\x0d\x6e\xb1\x39\xb1\x03\x25\x71\xa0\xb4\xd8\x60\x6b\x4e\xf8\xaa\x8a\x60\x59\xf1\x17\x62\x8d\xa0\xb5\x73\x37\xe7\x81\x70\x98\xcb\xae\xd2\xfc\x2a\x40\x03\x24\x0b\x1e\xef\x99\x8f\x5c\xf9\x60\x05\xfc\x4d\x8c\x0a\x34\x27\x19\x86\x2f\xba\xef\xfc\x8e\x7d\x23\xd1\xd8\x28\x9d\x79\xcf\x39\x4f\x68\x9a\xa2\xe2\xa5\x4f\x62\xac\xed\x62\xb2\x42\x58\xaf\x41\x33\x74\xeb\x0a\xd0\x61\x01\xb1\x17\x9d\x91\x93\x5c\xb7\x3f\xc9\xed\x92\xd1\xe8\xbd\x2b\x7f\x01\x42\xad\x92\x17\xe8\x5c\x39\x5b\xa2\x4a\xd4\xae\xff\xaa\x5d\xab\x71\x18\xc4\xaf\x49\x69\x45\x02\x7e\xbf\x12\xd0\x2b\x38\x83\xaa\x39\x94\xec\xc1\x72\x9d\x1f\xf3\x3a\xcd\x1a\xb0\x74\xbe\xc1\x7f\x23\x27\x50\x89\x2b\x59\x0e\x37\x84\x42\x77\xa5\xe2\xcf\xe0\xc5\x6d\xb6\xc4\xbc\x98\x33\x5b\x8a\x08\x15\x1d\x8e\xdb\xd2\x6a\xca\x73\xba\xea\x98\xce\x64\xeb\x1b\x79\x1a\x77\x09\xf7\x4b\xcb\x35\xbd\x0d\xd7\xf4\x0c\x7f\x89\x20\x11\x1e\xf5\x75\xfc\xd5\xe2\x30\x2b\x2a\xa6\x47\x54\x18\xba\xeb\x96\xe8\x55\x21\xdb\x98\x93\x4b\x09\x39\xc7\xb4\x82\xfe\x81\xdd\xd9\xa1\x05\x80\xad\x4e\xac\xdf\x23\x4a\x2f\xf2\xd7\xa1\x69\x86\x9c\x98\x59\x8f\xac\xb4\xc0\xcb\x57\xa7\xa7\xb0\x5a\x99\xa6\x95\xb8\x89\xd0\x7c\x91\xfa\xad\x63\xeb\xf9\x0b\xe7\x12\xf8\xd0\x46\xa7\xb8\xbb\x7e\x1e\x5c\xb6\x9d\x85\xa4\xe8\x6e\x40\x06\xf8\x38\x46\x4e\x0c\xea\x0b\x11\x7b\x9a\xd4\xe3\x70\x27\x7c\x79\xcb\xb3\xba\x04\xfb\x23\x01\xbc\x48\xf9\xe7\x16\x68\x57\xa1\x0c\x8e\x91\x1c\x89\x2b\x00\x39\xc9\x07\xdd\x13\x90\x5c\xf0\xb2\xe2\xfc\x3c\x87\xa2\x97\x59\x66\x29\x1c\xeb\x2c\x56\x2d\xa6\x51\xe4\x4c\x1a\x9e\x9d\x05\xf4\xd0\x46\x36\x88\x32\x92\xb0\xda\x42\xb8\x84\xc2\xe0\x0b\x9a\x46\xd1\xe7\xe3\xe8\x24\x7a\xa5\x34\x8a\x2c\xe5\x32\x7d\x14\xf7\xc2\x19\xbd\x2b\x60\xa5\x08\xb5\xba\x5f\xe5\xbf\x8b\xae\x8e\xc9\xed\xd5\x90\xdc\xee\xef\xe9\xa5\x77\xe8\xd3\x84\x9a\x8a\xd2\x0e\x39\x37\x7c\x0d\xa4\x39\x9a\x8e\x2b\xa5\x45\x94\xdc\xcf\x53\x43\xe4\x88\x41\xbf\xe5\x44\x5d\x6e\xd8\xf5\x97\xb4\xcc\xc7\xc5\xc0\x11\x7b\x3e\x56\x33\x91\x99\xf9\xf0\x07\xca\xbe\xa8\x15\x38\xe2\x52\xde\xb1\x66\xb3\xac\xfb\x65\x96\x5d\x1c\xc2\x44\xf5\x1f\xca\x7e\xa1\x85\xdf\x1f\xb3\xde\x0e\x0c\x9a\xd7\xf4\x07\xa6\x6a\xac\xab\xcd\x8b\x56\xe2\x65\x72\x5d\x7e\xb3\x2c\x7d\x91\x9b\xe6\xd4\x22\x8d\x87\x87\xd8\x36\x1d\x1e\x9e\x2c\xaf\xb3\xfc\x3c\xb3\x42\xd4\x13\x99\x39\xaf\x64\xa4\x71\x09\x4e\x85\x5c\x61\x85\xc8\xf2\xce\x7b\x93\x63\x41\x86\x9a\xed\x0f\x19\xad\x99\x01\x2a\x99\xa4\xcb\xd6\x34\x40\xd0\x8b\x3d\xe6\xf9\x98\xea\x9e\x39\xc1\x5c\x64\xb8\x61\xed\x38\xf7\xa8\xdf\x53\x3d\xda\xa5\x8c\x16\x87\x27\xe8\x69\x47\x03\xe6\x77\xa0\x7b\xff\x29\x82\x9b\xc7\x10\xe1\xc8\x34\xcf\xf0\x52\x04\x92\xb9\x8e\xe3\x88\xe0\x32\x42\xc3\xed\x2f\x38\xae\xfd\x1b\xe8\x00\x0f\x10\x05\x43\xf8\xab\x5e\x48\xc6\xec\x92\x3d\xb0\x12\x84\x1a\x78\x84\x5f\x18\x52\x24\xdf\xd7\xe4\xc6\x7b\x37\x60\x00\xe7\x37\x49\xbf\xf5\xbf\xe9\x37\xed\xa9\x93\x54\xcb\xfd\x2d\x0d\x63\xad\xaf\x41\xf0\x89\x87\x2a\xbf\x81\x17\xfa\x84\x9f\x5b\x38\x68\x4b\xfb\x0b\x9a\x65\x01\x0d\xef\xaa\x81\x21\x1e\x25\x13\x28\x99\xb7\xe8\xf4\x61\x59\x5a\x2c\xad\x3b\xbb\x4b\x5c\x71\xae\xc1\x0d\xf2\x62\x85\x53\x32\x3a\x5a\x19\x01\xa5\xc3\x22\x0f\x19\x8e\x48\x40\x66\xcb\xb5\xba\x98\x5d\xf3\x12\xe8\x14\x92\x44\x49\x5d\xa5\x08\x61\x3e\xdf\xde\xaa\x73\x05\xc5\xde\x56\x5d\x64\x85\xde\xd2\xc7\x21\x27\xc8\x40\xed\x1c\xcc\x17\xeb\xe2\xf0\x5d\xfe\x9a\x66\x95\xd0\x91\x89\x7b\xaf\xf2\xb3\x15\x6a\xa9\xbd\x67\xfb\xa2\x7c\x0f\xba\x27\xb3\x15\xe7\x2d\x66\x2b\xcc\xb3\xc6\x24\x74\x3d\xdf\x81\x08\x15\x3b\x72\x1a\x9c\x04\xbd\xee\xae\xbc\xec\x0e\x06\x75\x2f\x56\x38\x51\x67\x63\xaf\xd6\x7a\x15\x81\x26\xae\x58\x8b\x60\x1c\xf8\x49\xa7\xb5\x42\xbe\x29\x04\x9c\x98\x26\x84\x2e\xb3\x42\xd4\x34\xdd\x79\xeb\x80\xba\xa8\xe2\x25\x7b\x8a\x41\xf9\xc9\x0f\x91\x69\x42\x48\x31\xd4\x6a\x81\x08\xb0\xec\x68\xaa\xe0\xab\xc5\xc2\xb3\xe2\xc4\xb8\x14\xc4\x74\x61\x10\x26\x68\x18\x25\xce\x09\x49\x69\xcb\x60\x1a\x7c\x58\x38\x44\x9c\x96\x40\xb1\x12\x2f\x87\x78\x85\x70\x78\x4b\xb6\xa6\xb9\x5d\x2c\x5a\xd5\xf6\x98\x3e\xeb\x8e\xfd\xbe\x36\x8a\x63\x20\x4b\x62\xcd\x68\x79\xa4\xa4\x39\x58\x09\xd0\x6f\x92\xd5\x4b\x91\xde\x44\x4e\x46\x12\x71\x05\x03\x16\xa5\x83\xdc\x13\x4b\x3c\x8b\x5b\x9c\x15\xfa\x79\x3d\xae\x28\x6c\x9a\xa0\x69\x2c\x51\x9f\x6a\x9e\x17\x99\xac\x6e\xc6\x40\x1f\x91\xfd\x9c\xd6\x83\x40\x2e\x3d\x02\x67\x00\x8b\xe2\x02\x05\x74\xfa\xa5\x66\xb0\xab\x34\x84\x91\x13\xfa\x3d\x80\xe1\xa0\x69\xb4\x25\xe5\x75\x4f\xf4\x75\x67\xab\x46\xc7\xb1\xc1\xb4\x72\x93\xfd\x8d\xda\x0e\x8f\xec\x34\xfd\xa8\x6f\xf5\x35\xeb\x2f\x50\xbf\xeb\x2d\x99\xb5\xaf\xdf\x2b\xa5\x0e\x89\x78\xc1\x31\x28\x15\x4c\x53\x07\xf5\xe0\x03\xa1\x2c\xf6\x69\xc5\x90\xcb\x54\x84\x1d\x3b\x2a\x72\x06\x0c\x1e\x4d\x33\x0e\xfb\x53\xc5\xea\x2d\xcb\xfb\x32\x80\xcb\x9d\x40\xe2\x04\xc1\xb5\x60\x8f\xaa\x1b\xa7\x08\x29\x3f\xa4\xe0\xdb\x64\x9c\x0b\xb5\x6d\x8f\xcd\x5e\xb1\x98\x95\x83\x89\xe9\x2e\x87\x3d\xcf\xc8\x8b\x3a\x8d\xdf\x1b\xfc\xb8\x2d\x92\x92\x55\x95\x81\x35\xd4\x69\x19\x02\xb5\x80\x27\x94\xa9\xaf\xcf\x7d\xec\x19\x25\xab\x8a\xec\x81\x19\xd8\xe0\x03\x1d\x55\xc0\x91\xe2\xd5\x74\x2d\xc3\xa4\x25\x56\x15\x45\x86\xa8\x15\x1c\xf2\x62\x83\xcf\xda\xff\xb4\xd2\x15\x96\xf5\xf0\x4a\x7d\x1c\x11\xe3\xc0\xf2\x08\xc8\x09\x46\x4e\x55\x4d\xeb\x29\x48\x8b\x5a\x4c\xb3\x47\xfa\xbe\x9a\x0c\xfb\x07\xab\xd9\x03\x9f\x58\xd5\x33\x60\x34\x60\x7d\x8c\x49\x1b\x12\x58\x6c\xa9\xb2\xc0\xe9\xa1\xf4\x30\xe8\x85\xe0\xd4\xba\x1a\xfb\x23\x50\x2d\xe5\xd0\xc5\xa6\xc0\x73\x21\x9e\xa6\x0e\x74\xfe\xd7\x8b\xbc\x4f\x7c\x4e\x46\xcb\xa7\x75\xec\x45\xde\xca\xf7\xad\xb3\xc6\x19\xb8\x65\x9c\x8a\xc3\xb7\x1e\x03\xaf\x06\xf1\xdd\x23\xf0\x22\x02\x9e\x2c\x4e\x5c\x73\x18\x53\xdb\xc0\x96\xab\x2c\x27\x8e\xbf\x43\xc4\x4a\x27\xf0\x22\x6f\xe9\xcf\x0d\xbe\xc3\x0d\x5f\xb4\xcb\x44\xe8\xa3\xae\xf5\x16\xb5\x08\x53\xe1\x3d\x17\xf5\xad\xb5\x98\xcf\xa8\xae\x09\xa8\x59\x27\x2e\xfb\x1d\x9f\x58\x9d\x6a\xd8\xd8\x72\x45\xe4\xde\x8a\x98\x74\x5a\x70\x3c\xbc\x3b\x0f\xae\xb7\x03\x4e\xd6\x0a\x6e\x63\x24\x1d\xa3\x44\x72\xb2\x40\x11\x8a\x02\x0b\xda\x75\x4e\x0b\x5b\xca\x59\x0c\xe9\x19\xe1\xed\x56\xd8\x23\x5c\x55\x2c\x8b\x17\x30\x27\x47\xb8\xa2\x46\xeb\x1d\x38\x15\xfd\xa3\xb1\xbc\xf8\x72\x02\x40\x0d\x23\x02\xed\x90\xcb\xdc\x9d\x42\x27\x89\x15\xe3\x10\x7f\x8b\x19\x92\x8f\xdf\x71\x02\xcf\xb1\xe2\xf9\x1c\x7f\x38\x53\xf7\x35\x94\xeb\xc8\x97\x07\xf1\xb2\xd1\x8c\x90\x6f\x81\x68\x90\x98\x27\x25\x1c\xf7\x60\x8b\x35\x4d\xa8\x56\x19\x72\xc3\xb4\x70\xb2\xf6\x8e\x30\x77\xa7\x83\x3a\x47\xa2\x3b\x4b\x43\x66\x3d\x90\xdb\xec\x29\x64\x60\x3f\xf1\xd7\xa2\xb8\xe3\x40\x37\x9d\x62\x51\x7c\x67\x57\x9c\xc4\x7c\x5b\xd2\x90\x21\x1c\xcc\x57\x2f\x08\x3f\x4b\x79\x07\xbf\x9b\xe8\x60\x28\x41\x0e\x8e\x12\xd9\xb5\x75\xe0\xde\x59\xc8\xb1\xb4\x56\x12\x56\x03\xe5\x2a\x9a\xb7\xf4\x46\xc8\x85\x6c\x96\xb0\xfc\x66\xf5\xdb\x74\xcf\x8a\x63\x6d\xdd\xf1\xba\x3f\xb0\x7f\x39\xfa\xf6\x96\xbe\xf7\xb1\x0f\x4c\x73\x62\x2d\x31\x1d\xae\x23\x3f\x48\x9c\x6f\x31\x1d\xcc\x3e\x10\x88\x1f\x28\x14\x20\x37\x70\xbe\x85\x7c\xcf\x3f\x94\x2f\x42\x6e\xe4\x7c\x87\xd0\x70\x2f\xc9\xc7\x0f\x04\xfa\x73\xbb\xe3\x85\x62\x26\x2c\xe1\xe2\x73\x62\x3d\x9c\x20\xb9\x12\x12\x78\xcf\x39\x1d\x1d\x78\x9f\xfa\x6b\xe6\x05\x1c\xff\x90\x84\x77\x10\x6f\x4d\x13\x1e\x74\x74\x14\x91\x6d\x8b\x43\xef\xe3\x05\xf5\xbd\xe7\xbe\xf2\x6d\x86\x61\xd2\x9e\xfb\x36\xa7\x51\x10\x16\xa5\x02\x3e\x50\x4e\x03\x20\x1c\x7b\x81\xb7\xf4\xfd\x89\xa0\x57\x22\x65\x80\x64\x08\x21\xb1\x14\x0c\x3a\x17\x08\x8b\x41\x21\x92\x74\x84\x48\x8b\x30\xeb\x66\x2e\x46\x42\xee\x0a\xbb\x29\xc6\x31\xc2\x71\x8b\x1f\xb7\x6c\xd2\x56\x65\x1c\x7b\x33\x24\x01\x8e\x88\x0a\x3e\x89\xd9\x59\x14\x2f\x84\x13\x0d\xea\x2c\x84\xb7\x13\xbe\x5a\x7a\x74\x16\xa2\x53\xc4\x59\x46\x81\x45\xf9\xd3\xb8\xc9\x17\x2b\xf7\xac\x0d\x27\xc4\x8b\x45\xd0\x34\x89\xbe\x7d\x81\x19\x6c\x5b\x8e\xf3\x82\x5b\xc2\xf9\x40\x4e\x0b\x25\x02\x9d\x03\x7f\xa0\x72\xe3\x44\xee\x2c\x3c\x0b\x10\xee\x8e\x5a\xf0\x46\x0c\x67\xad\x85\x46\x61\x41\x99\x17\xfa\xa6\xc9\xff\x0a\x02\xa8\xbb\x0b\x4f\xc4\x19\x89\x34\xed\xa1\xef\x21\x37\x06\x82\x51\x35\xa4\x45\x5a\xeb\x01\x58\xb2\x99\xff\x20\x37\xef\xac\x2f\x1f\x68\xd6\x7c\x95\xd7\xac\xcc\x69\xd6\xfc\x40\xf3\x84\x35\x3f\xf0\x49\x64\x79\xc8\x1a\xe1\x9e\xa6\x01\x1d\xee\x1f\x7f\xf8\x0a\x01\x6e\x7e\x76\xb3\xbe\x84\x6b\xc8\x90\xe3\x01\x7e\xbe\x2a\x84\x93\x19\xf9\x68\x3f\xd2\x32\x37\xcd\xc0\x34\xff\x21\xef\xf6\xec\x9c\xee\x19\x1a\x67\x51\xc1\xab\xbb\x96\xae\xba\x96\x9c\x2b\x63\x1e\xd8\x7b\x56\x55\x34\x61\x38\x10\x78\x07\xc4\x1f\xa5\x90\x56\x7f\xa9\x72\x12\x9d\x10\x18\x20\x1e\x1d\xc7\xc2\xf1\x13\xb4\xa8\x85\x69\xf9\x61\x00\x46\x42\xe0\x0c\xb5\x4e\xc1\xd3\x0f\x62\x19\x28\xf2\x24\x3d\xe3\x0f\x35\x12\x46\xfd\xb1\x28\xea\x98\xa3\x9e\x02\xed\x22\x96\xae\x30\x64\xff\x99\xa6\xb5\x23\x9f\x07\x7b\x03\x3c\x8c\xcd\x96\xee\x62\x21\x2b\x86\x9c\x1c\x60\xa0\x02\xd4\x34\x56\xf7\x02\xee\xfc\x67\x22\x70\xca\x20\xff\x8b\x65\xd3\xfc\x30\x82\x5f\xaf\xf4\x41\xbe\xa8\x26\x10\x46\x45\xc4\xe0\x7a\xea\xe0\x0d\xc7\x37\xd2\x55\xff\xc8\x83\xf5\xab\xef\xbe\x91\x26\xa7\x5f\x17\x34\x62\x91\x81\xdf\x20\xfc\x7f\xe8\x74\x66\xe1\xbd\xfa\x4d\xd7\x9a\x85\x5a\x23\x2c\xf6\x87\x8c\xd5\xa0\xd6\x12\x89\xcf\x6f\xf8\x8e\x68\x1a\xc8\x2e\x99\x5f\x3d\xc5\x34\x67\xd1\xd8\x8b\x9f\x1d\x15\x6f\xc2\xb2\xc8\x32\x77\xb0\xd8\xb2\x1d\x70\x6f\x7c\xee\x7d\x7b\xb2\xef\x74\x22\xa3\xea\xb7\xd8\x3e\x6f\xc7\x8a\x75\x32\x7e\x9c\x22\x94\x26\x54\xe9\x09\x09\xd7\x5a\x2c\x0d\xa2\x71\xf3\xe8\xc4\xc8\x6c\x09\xf7\xa1\xdb\xab\x34\xbf\x0a\xd1\x5b\xa8\x76\x8b\x43\x6f\xeb\xe3\xd9\x12\xaa\xee\x4c\xfa\x07\x31\x74\x79\xc9\xf1\xb9\x05\xd1\x84\x67\x4b\x50\xc7\xb7\x12\xd7\xea\xef\xf4\x55\x74\x05\xe4\x58\x3b\x12\xe0\xe0\xec\xae\xb0\x63\x27\x7b\x39\x7c\x08\x4e\x2b\xe5\x7d\x57\x67\x0d\x10\x80\x15\x35\x0e\x71\xe2\x46\x4e\xa4\x62\x88\x6e\x7d\xbc\xc5\x2a\x49\xb3\x00\x60\x2e\x75\x76\xae\xea\x07\x72\x52\x37\x00\x6f\x31\x9c\x91\x8b\x5b\xfc\xe3\xd4\xf6\x1a\x5e\x72\x0b\xd7\x4f\xfa\xfb\x6c\xae\x5d\x81\xf7\x80\xfa\x13\xec\xea\xb4\xb2\x65\x00\x61\xa1\xdc\xc1\x9f\xe6\x3f\xd9\x10\x8f\xb1\x85\x5f\xb2\xc2\x3f\xe9\xc1\xce\xc1\x11\xd3\xd4\x69\xe4\xe9\xb5\x8d\xdc\xbd\x9c\x5a\xfc\xa3\x88\x48\xa8\xfb\x97\x1c\x96\x20\x81\x23\xc5\xf9\xc2\x51\x4b\x6f\xa7\x8f\xf5\x7c\x58\x2a\x4a\x07\x38\x2c\xf2\x38\x4d\x8e\x25\xc8\x37\xe0\xaa\x1c\xe1\xa0\xc5\x15\xab\x2f\x05\xf3\x14\x17\x4d\x30\x02\xe5\x3f\xf9\x2c\x4a\x26\x62\x5e\x69\x77\xc1\x69\xad\x00\xf9\x24\x5c\x0f\xe3\xc1\x8e\xf3\x44\x68\x18\xc7\x94\x8d\x43\xb9\x6b\x17\x26\x02\x28\xc1\xdd\xca\xa0\x33\xce\x68\x36\x38\x7f\x35\xf8\x30\xee\x55\x8b\x69\x18\xb2\xaa\xba\x24\xff\xee\x1b\x6a\x9a\x60\x42\x58\x1b\x98\x66\x97\x25\x74\xbb\x3b\x1a\xde\x57\x47\x5c\xd9\x54\xe2\x15\x87\x08\xf7\x57\x9e\x6e\xe8\x04\xe8\x5c\x62\x36\xb8\xd2\x1b\x83\xc2\x60\x2f\x02\xb3\xd3\xbd\x06\xe8\x34\x0c\x9a\xcd\xa9\x4e\x12\x80\x3c\x5a\x1b\xb0\x54\x65\xd1\x27\x00\x8b\x5b\xed\xab\xc8\xf5\x02\xdf\x09\x06\x32\xdd\x0b\xaa\xc3\x32\xfe\x4b\xe4\x05\x5e\xe8\xfb\xad\xa5\x4f\x11\x47\x0d\x5a\x68\x65\x2b\x42\xbf\x03\xad\x92\xd8\x93\x75\x8e\x52\x39\x9f\xb2\xa5\xd5\x2b\x5a\xd3\x3f\xbe\x55\xfa\x49\x91\x91\x3c\xf5\xfe\x04\x9c\x7a\xe2\xc5\x7f\x06\x9b\xcb\x9f\xf0\x2f\xf2\xf7\x9f\x52\xf3\xe1\x24\xd4\x1e\xae\x37\x6d\xb3\xf1\xd4\xb3\x8f\x9e\x41\xa0\x37\xef\xe5\xe2\x5f\xbe\x2e\x1f\x7f\xa6\xc5\xea\xae\xcb\x23\x1c\x29\xc0\x1b\xd2\xac\x62\x20\xf2\xe7\xdc\x23\x47\x81\xc2\x61\x14\x78\xc5\xe2\x27\xeb\x9c\xce\x0d\xc3\x9d\x53\xe7\x9f\x9d\x6a\xc6\xdf\xde\x7c\xf7\xad\x50\x1e\x00\x38\xd6\xcc\x08\x7e\x3d\xd3\x1a\xec\x41\x6e\xac\x5c\x04\x26\x15\xc4\x88\x68\x4d\x17\x9c\x74\x51\x1a\xbd\xff\xc2\xc6\xe2\x99\x69\x8c\x9d\x24\x84\x63\xe5\xc5\x08\x9d\x2b\x67\x84\x82\x39\x0c\xc9\x33\x2b\x44\x9a\x4f\xc8\x5f\x34\xd8\x16\xc7\x45\x48\x86\x1e\x13\x43\x4d\xf8\x35\xb5\x90\x9d\x21\xba\x4c\xb4\x28\x6a\x9a\x9f\xb5\xb7\x16\x47\xc3\x32\x83\xcd\xf9\x8b\x2d\x36\xaf\xea\x83\xdc\x4f\xaf\xc6\x45\xd0\xe9\x17\x49\x1e\x48\x27\x93\xbf\x7e\xa8\xd6\x9f\xc7\xb5\xfe\x7a\xb1\xda\x9f\x07\xd5\x02\x51\xa3\xe9\x0c\x9c\x35\x32\x8c\x07\x20\xaf\x90\x71\xc2\x39\xe4\x58\x53\xa4\x1d\xac\xb0\xd0\x8c\xd1\xae\x7f\xe0\x14\xfe\x05\xb0\x4c\x2c\x14\xc1\x62\xed\x8e\x7d\xf6\xb3\x48\xc1\x86\x9c\x44\xbe\xb4\x95\x81\x90\xb8\xf8\x38\xdb\xcc\x09\x50\xfd\x56\x44\xf8\x03\x90\xc7\x78\x09\x74\x51\xe7\x81\x4d\x80\x92\xb8\xb1\x1a\xa0\x6b\x29\x00\xfd\x14\x21\xfc\xab\xb0\xce\xf3\x22\x9f\x9f\xc2\x3f\x03\x5c\x8c\xbb\x80\x67\xcb\x4e\xc1\x52\x45\x89\x3a\x17\xac\x08\x14\x0a\x3c\xab\x46\x37\x0b\x48\x13\x1c\x21\x6a\x91\xf3\x56\x3c\x9f\x89\x51\xc1\xbc\x43\xc3\xc8\x81\x8c\xad\x20\xa7\x0b\x53\x1d\x07\xf7\x4a\xfa\x90\xe7\xd7\x8b\xe9\x02\xb6\x7f\xb7\x63\x1c\x04\x50\x2b\x5d\xc7\xe2\x73\x1e\x4f\xa4\xf0\x59\x98\x86\xd3\xe1\xc5\xfd\x79\x4b\x12\xd4\xba\x59\x10\xf0\xa6\x80\xed\xfe\xc8\x8e\x6c\xfa\xc4\xe6\xe3\xeb\x34\xb1\x02\x02\x86\x89\xf1\x93\x81\xe6\x06\x14\x32\x70\x44\x7e\xee\x4e\x2d\x1c\x9a\x26\x78\x9f\x1e\x1e\x28\x21\x72\x79\x2e\x6d\x67\xe8\xea\x39\x21\x42\x4e\xd4\xdf\x51\x41\x60\xbf\x16\x47\xec\xbc\x53\xe8\x04\xe1\xf8\x78\xfb\xc2\x61\x31\x29\x6d\xc8\x25\x1a\x8f\xba\x08\x5b\x10\x6c\xab\x33\xde\x26\xa5\xfd\x2b\x64\xe3\xac\x5f\xd5\xf9\x11\xd2\x64\x0a\xb6\x6c\x4d\x6c\xc5\xb5\x91\xe6\x9d\x18\x9d\xc8\x08\x39\x5a\x85\xd1\x62\x01\x26\x9f\x16\xef\x08\x91\xba\xba\xca\xed\xb0\x5e\x16\x61\x79\x34\xc5\x70\xf7\x87\xbb\x5b\x81\x04\xec\x43\x67\x91\x69\xc2\xee\x85\x8b\x24\x10\x46\x58\x1c\x63\xf4\x7d\x9d\x8e\x42\x2f\xa7\x1e\x72\x18\xeb\x0e\xf1\x88\x45\x08\x01\x09\x76\x53\x1d\xe2\x93\xb8\xa6\xba\x2c\x5c\x1f\x8b\x6a\x34\xbc\xe4\x05\xdd\x32\x87\xbe\x88\xcd\x34\xc6\x53\x53\xab\x24\xfa\xf9\x5c\xdd\x61\x4f\xa8\x11\x59\x22\xfc\x39\x9f\x40\xcc\x31\xc9\x19\xc4\xdf\x86\xae\x5a\x5b\x85\xea\xba\x70\x1d\x1d\xe5\xe6\x4c\x02\xfb\x10\x32\xba\xed\xb5\x1e\x42\x81\xdc\x09\x58\xae\x21\x15\x0a\xfe\x6a\xe5\xf8\x16\x06\x55\x9d\x1e\x34\xfa\xad\x33\x01\x9b\x1f\xde\x7e\x93\x95\x84\x19\xa3\xe5\x3f\x3e\x58\x8f\x84\x49\x01\xf1\xd8\xf3\x27\x65\x7a\x3a\xd5\xb7\xc2\x6c\x28\x5c\x12\x07\x05\x4e\x06\xea\x5d\x5b\x1d\xf6\x17\x8b\xa8\x69\xd8\x80\xcf\x8e\xb1\x17\xfb\x7c\x1b\x5c\x5e\x38\xb1\x10\x60\x8d\x24\xf7\xa3\x16\xe0\x4b\x22\x84\xd8\x4b\x7c\x4c\x07\xc0\x2a\x83\xc5\x00\x44\xf2\x33\x61\x3e\xc7\xf2\x0d\x80\x70\xdb\x73\x61\x5b\x4b\x17\xc9\x05\x9d\x30\x88\x52\x72\xe3\xcd\x17\xbe\xcb\xe9\xad\xe8\x7a\x63\x37\x68\x13\xcd\x2d\xd7\xf1\xd8\x97\x3e\x24\x6c\xa2\x79\x83\x6e\x64\xcc\x3b\x1c\x50\x32\x8e\x28\x0c\xe1\x88\x11\x69\x90\x65\xcc\x29\x9d\x1b\x08\x34\xdc\xff\xcb\xbf\xee\xa2\x0c\x87\x94\x78\xc6\xdb\xe2\x60\x60\xe3\x87\x34\xd9\xd6\x06\x36\x3e\x2f\xea\xba\xd8\x1b\xd8\xf8\x9a\xc5\xb5\xe1\x0f\x02\xc4\x0e\x63\xa4\x07\x4d\x43\xb1\x91\x17\xb9\x20\xe8\xec\xaa\x7e\x9f\x41\x70\x37\x08\x3d\xde\x18\x13\x5f\x39\x98\x75\x1a\x7c\x23\x67\xd5\x98\xb3\x6c\x5d\x75\xa5\x1d\xc2\xb6\x36\x64\x49\x43\x04\xa6\x1d\x73\xf8\x9d\x22\x2d\x4e\xc8\xa9\x05\x6e\x3d\x16\x5c\x53\xe2\xc5\xbe\x6a\xde\x8b\x7d\xdc\x3f\x92\x40\x84\x05\x0a\xbb\x28\xb0\x80\x89\x91\x5e\x5a\xcb\xcd\x2b\xea\x99\xad\x9e\xaa\x8d\xe9\x59\x27\xc8\x0a\x27\xe4\xf9\x12\x6f\x49\x74\xee\xf5\xf4\x2a\xb2\xc3\x63\x69\xe9\x7e\xea\xb5\xab\xff\x50\x9e\x17\xa0\xfa\x90\x12\x0e\x15\x3b\x4e\xb7\x86\xe0\xb0\xd6\x82\x0c\xdf\x42\x2c\x7d\x2f\xf0\x5d\xc3\x70\x8c\xc3\x93\x81\xf0\x1d\x19\x25\x35\x0d\x4f\x98\x11\xb2\x33\xcd\x79\x8a\x4c\x33\xa0\x42\xe3\xb7\x6b\x42\x78\xeb\xb8\x33\xcd\x3b\xef\x63\x1f\x0c\xa3\x4f\x3b\xb2\x6b\x1a\xfe\x8a\xd5\x1d\xf8\x1d\x99\xa7\x4d\xb3\x5a\x47\xc5\x55\x4c\xe2\xa6\x31\xec\x4f\x0d\x7c\x77\x43\x62\x5c\x8a\x99\x81\xce\xde\xcd\x77\x4a\xde\x19\xcf\x08\xb1\x62\xde\xef\x9b\x54\xaa\xbd\xc5\xa6\xb9\x58\x24\x1d\x35\xc3\x4f\xcc\x3b\x32\xbf\x6b\x1a\x5e\xf5\x92\x9f\x5c\xde\xca\x77\xef\xe6\x16\xff\x9d\xaf\xd0\x75\xe8\x3d\xf7\x9d\x39\xff\x8b\x23\xbe\x69\xec\x63\x9e\xd6\x64\x87\x23\xbb\xaa\x69\x59\x93\x3b\x1c\xd9\x2c\x8f\x08\x18\x18\x83\xdd\x46\x42\x61\xd5\xd5\x92\x6c\xa9\xee\x82\x77\x0c\x5f\x91\x66\xcf\x04\x8e\xaf\x75\x2e\xda\x65\x0e\xb8\xd4\x0d\x8a\xe8\xfd\x20\x3e\x49\x38\x32\x52\x03\x2f\x08\x12\x3c\x03\x0d\x3c\xf1\x87\xc2\x67\x76\x60\x2d\x4e\x58\x23\xc8\x8a\xf0\xce\x40\x18\xfa\x40\xd8\x20\xf4\x68\x4a\x47\xb6\x34\x9c\x66\x14\xca\x13\x4b\x9c\xf4\xbe\x2b\xe2\xdb\x64\x1d\xcf\xe7\x28\x02\x27\xe0\x30\x49\xef\x33\x06\x5e\x65\xa2\xe1\xae\xc3\x81\x6b\x75\x3d\xe0\xcb\x00\x70\x2d\x70\x57\xa4\x0d\xa1\x69\x84\xd1\xbb\x17\x73\x90\x1b\x55\x42\x20\x74\x9c\x21\xc4\x81\xa3\x4d\x1d\x51\x2b\x42\xaa\xde\x2d\x78\x8a\x40\x8e\x68\x71\xa6\xb5\x28\xbe\x60\x41\xf8\x6a\x0d\x0b\xa9\x14\xec\x3e\xb2\xec\xc6\x25\x6e\x6e\x98\x70\x70\xce\x87\x38\xea\x0f\x4f\x19\xe8\x53\x6a\x67\x75\xb5\x2d\x1e\x27\xb6\x59\x4a\xc5\xb9\x04\xd4\xe5\x36\x8d\xa6\xae\xd2\x65\x1e\xd4\xe2\xba\x48\x92\x6c\xea\xcc\x32\x82\xa2\xc8\x18\xd5\xef\x34\x5d\x49\x92\xf3\x86\x2d\xa9\x56\xce\x1b\x50\xcf\xe3\x83\x32\x92\xad\xb8\xa5\xf8\x55\x05\xd5\xab\x28\xdb\x76\xa7\xc1\x8e\x0a\xce\x5b\x39\x6b\x6a\xc0\x7d\x13\xd8\x1d\xdd\x51\x72\x33\xb4\x5d\x1a\x6a\xaa\xa1\x9b\x14\x67\xbc\xf8\xb3\x66\x73\x63\xb9\xce\x8e\x3e\xd0\x86\x85\x7b\x8a\xaa\xb0\x4c\x0f\xf5\x4d\x8a\xf7\x94\x9c\x84\xe7\x37\xc7\x5b\x61\x43\x45\x32\xda\x1f\xb3\x3a\x3d\x64\x8c\x7c\xa4\x9e\x3e\x7a\x61\x60\xa3\x8f\x61\xe4\xe3\x7a\xcb\x68\x24\x0a\x81\x41\xa9\x48\x97\x8f\x3e\x0e\x8b\xcc\xf1\x9e\x77\x89\xb7\x61\x91\x25\x65\x71\x3c\x88\x6c\xdd\x9b\x56\xa2\x2e\x07\x05\x6a\xbe\x1f\x65\xa5\xf0\xa8\x67\x8d\x1c\xef\xe3\x71\xd6\xdb\xba\x94\xd9\xcb\x17\x13\x65\x7e\x95\x06\x8b\x8e\xb7\xc4\x86\x81\x0d\xc3\x6f\xd7\x7b\x6a\x17\x87\x1a\x7a\x42\xc4\x73\x5a\xe4\x78\x4f\x6d\x28\xcd\x3f\xd5\x71\x51\xd4\xfc\x41\xf5\x18\x9e\xa9\xb8\xd1\xd8\xc3\x65\x36\x8d\xa0\xc4\x16\x5e\xa3\x1e\x25\xe5\xba\x73\x83\x8e\xe1\xbf\x1c\x8e\xef\x3c\xde\xdb\x85\x60\x8d\xc2\x6f\x0a\x72\xa6\x6b\x1a\x47\x3e\x72\x27\x82\x21\xa9\x1a\x3c\x1f\x8f\xe4\x77\xc2\xae\xce\xed\xf4\x3d\x29\xc8\x84\xc3\x61\xe4\xd8\x91\x83\x35\x40\xaf\x12\x35\x85\xb7\xd1\x3a\x9c\xcf\x91\xd8\xe9\xd4\x0b\x7d\x6c\x24\x59\x11\xd0\xec\xcb\x07\x9a\x19\x60\xa9\x2c\xd0\x4f\x30\x4e\x43\xc2\x20\xef\xc0\x81\xba\x31\xff\xe4\x6e\x1e\xe7\x6b\xcd\x90\xee\xfe\x92\xb7\x1c\xe5\xed\x0b\x67\x24\x90\x18\x5b\x21\xfe\xd7\x25\x4d\x00\x75\x23\xe5\x89\x66\x89\x8b\xbe\xb3\xf9\x6d\xb1\xce\x85\x79\x41\x4c\xa8\x97\xfb\x38\x16\x0e\x2a\x63\x34\x79\x35\x10\x23\xa4\x26\x66\x8f\x63\xcd\x6d\x4d\xec\x3b\x31\xea\xe2\x73\x1f\xa8\x90\x59\xc5\x08\x9d\x12\x02\xde\x1f\x06\x01\xbb\xc6\xb6\xcf\x51\xfa\xc0\x11\xec\x96\x58\x77\xf2\xc4\x8e\x51\xd3\x78\x02\x48\xd1\xb9\x7b\xfc\x94\xec\xa9\xb7\xf5\x9b\x66\x4f\x6d\x05\xd5\x38\xd1\x8c\x88\x53\x7e\xaa\x96\xf6\xb6\xde\x67\xdf\x97\x4c\x99\x58\xa0\x79\xca\xcf\xd7\x3b\x30\xf5\xd7\xfc\xcc\x24\x24\xe9\xdd\x2f\xaf\xfb\x01\x26\x83\x10\xfc\x09\xc9\x74\x05\xe5\x44\x77\x6d\x4a\x0c\x43\x88\x00\xa4\xbf\x0f\x35\xc2\xb7\xec\x09\xce\x44\x88\x4d\x91\x8d\x4a\xf0\xc5\xe8\x82\x30\xee\xbd\x5c\xba\xbd\x88\x40\x65\x47\x6a\x24\xc6\x38\x02\xe5\x46\x50\xf1\x51\x5e\x17\xd4\x34\xef\x88\x46\x51\xc6\xa3\x13\x3f\xe6\x3d\xce\xa9\x35\x9c\xfa\x18\x61\x43\xa0\x3e\x03\x6e\x63\x0a\x6a\x25\x08\x87\xe8\x74\xa7\xf5\x25\xf1\xee\x78\x5f\x32\xb5\x8a\xca\xe7\xa2\x81\x3a\x7b\xd5\xb8\x23\x6d\xb2\x76\x76\xa6\x90\x14\x5d\x86\xc2\x80\x0c\x83\xb7\x45\x17\x60\x21\x24\x67\x29\x2a\x3a\x5c\x38\x1d\x1d\x0e\x4e\x05\x08\x9a\x33\x4c\x56\x11\xf2\xb0\xd1\xc7\xca\x1b\xe7\x91\x11\xe3\x6a\x20\x65\x06\x14\x10\xc2\x85\x70\x11\xfa\x45\x56\xe4\x8c\xef\x2f\xfe\x0b\x6b\x3a\x5b\xa2\xd1\x5b\x07\x44\xca\xab\x28\x0e\x06\x96\xed\x7c\xfd\x69\xc9\xe8\x8b\xa7\xdb\x9b\xee\xd9\xc0\x85\x9d\x17\x50\xfd\x17\xa2\x14\x01\xab\xd7\x0b\x35\x0f\xac\xce\x2d\x71\x42\x96\x7c\xca\xc7\xc1\x81\x2b\x7e\xee\xdd\xb1\xf7\x37\xb8\x96\x07\xe8\xbe\x38\x56\xac\x39\x14\x69\x5e\xb3\xb2\x09\x85\x45\xf1\x9e\xe5\xc7\x26\x2a\x69\xd2\x44\x65\x71\x40\x4d\x98\xa5\xe1\xdd\x0d\x3e\x42\x19\xef\x9d\xed\x5f\x23\xce\x85\xd9\x96\x3d\x47\x0d\xd2\xd0\xd1\x03\xd5\x83\x1a\x74\x9f\x1f\xb5\xcf\xab\x81\x9f\x2d\x21\x23\xee\x18\x82\x81\xbb\xd8\x5e\xa7\xa8\x1d\x7a\x5f\xd2\x7d\x73\x01\xd5\x8b\xb7\xc3\x5b\xcb\xee\x3a\xe9\x74\xc6\xc9\x86\x20\x91\x8c\x9a\x26\xc4\x4a\xec\x8c\xfa\x4b\xcd\x00\x41\xfd\x5b\xa8\x3f\xf0\xb6\x3e\x8e\x35\x92\x2a\x8d\xa5\x51\x4c\x24\xfc\xdb\x10\xc2\x5c\x8b\x11\xce\x7f\x77\x75\x39\x32\xc1\x34\xcf\xaf\xb7\x42\x9e\x3b\xc2\x51\x97\x57\xbe\x6a\x5d\xe1\xb4\x34\x38\x2b\x67\xe4\x91\x76\x9b\x7a\xd6\x05\x57\xa2\xba\xbb\xfd\xd8\x34\xad\x84\x53\xcb\x53\x37\x93\xa5\x85\xec\x22\x8e\x2d\x0a\xda\x35\x53\x8a\x80\x2d\x66\x76\x72\x4c\x23\x92\xc0\x0f\xf8\x48\x83\xf7\x12\x7e\xe6\x73\xd0\x85\x3a\x17\x69\xb0\x07\x96\xd7\xc0\xb6\x4b\xa3\x05\x86\x23\xb8\x80\x6d\x65\x1a\x39\x89\x03\xcc\x39\x9d\x1b\x2f\x0d\xe2\x0e\xe8\xc7\x94\xf2\xfb\x8f\xef\x95\x58\x11\x49\x0f\xfd\xa1\xbd\x85\xa0\x32\xa5\x50\x88\xc7\x21\x89\xd5\x17\x50\xb3\x51\x9e\x09\x40\x34\x77\xc1\x5a\xac\xa4\x58\x04\x62\x16\x03\x0d\x47\x03\xc5\x56\x4a\xee\x45\xe7\x2b\xd4\x34\xda\x1b\x78\xf8\xb3\x12\x72\x2f\x9b\x14\xf7\xd6\xea\x6d\xa0\xbe\x21\x89\xe1\x09\xfa\xa3\xe4\xfd\x12\xd3\x56\x97\x69\x92\xb0\x12\x42\xb7\x8b\x20\xf4\xae\x4a\xe2\x84\x3c\x18\xf7\x2b\x36\x5c\x53\xeb\x91\xe1\x6a\x39\xae\x04\x3a\xc5\x40\xfa\x9d\x9b\x61\xf8\x78\x37\xbe\x74\xdb\x2d\x16\x68\x4b\x8e\xf2\xf0\x0c\xbc\x9d\x8f\xa4\x8f\xfc\x03\xd9\x7a\x2b\x1f\x17\xc4\xda\x7a\xcf\x65\x2c\x1b\xe9\xf6\xc4\x56\x7e\x4f\x10\xce\xc1\x9b\xbd\xea\x1c\x38\x8c\xa0\x99\x97\xfb\x4d\x73\x6a\x71\x4e\x2c\xe6\x66\x76\xc4\x32\x96\xf0\x33\xed\xfd\x81\x39\x99\x1d\xa4\x79\x04\xd7\x49\x4d\x93\xe3\x8b\x65\xef\x48\x2f\x7f\x06\x7f\x9a\x39\x2e\xca\x34\x81\x3a\x0e\xe2\xe6\x26\xc2\x72\x81\x9d\x10\xf3\x25\x72\xc4\x82\x61\xb5\xd4\x0e\xc3\xba\x07\x04\x07\x16\xfe\x82\x7b\x04\x69\x21\x8b\x30\x47\xe8\xd5\x81\x86\xcc\x29\xa4\x4f\x17\xdb\x40\x2d\x3f\x14\xad\x3d\x49\xbd\x9c\xcf\x8f\x7c\xe2\x64\xd1\xbe\x1b\xdd\x17\xc5\x31\xaf\xc9\x12\x67\xfc\x84\x38\x1e\x4c\x53\x3e\xf4\x5e\x08\x0a\x9c\xa0\x19\xdf\xb7\x4d\x73\xae\x97\x61\x9a\x13\xba\x1a\x39\x4e\x10\xc2\x19\x4f\xe0\xf3\xcc\x7f\x55\x75\x77\x08\xdf\x29\x00\x57\x00\x3b\xfc\x40\xc4\x74\x70\x6c\xe1\xee\x95\x89\xc3\xa8\xbf\xf3\x39\x5e\xe2\x3b\xe4\x48\xea\xe3\x0e\xa4\xfe\xb0\x1c\x62\x73\xf2\x51\x72\xbe\x6f\xf2\x3a\xf9\x8f\xed\xd2\xfe\xc2\xcd\x34\x07\x7b\xd6\x34\xf5\xfd\x84\x4e\xff\x19\xd0\xa6\xb1\xf5\xbf\x82\x5b\x74\xfa\x10\xd8\x46\xbf\x03\xb6\x02\x00\xa0\xc5\x2d\xd9\x42\x30\xa7\x51\xbc\x9c\xcd\xc6\x46\xc6\x5c\xc1\xd0\x66\x63\x5b\xae\x63\x5f\x6f\x36\x76\x83\x0c\x34\x37\x2c\xfe\xf4\x0c\x19\x70\xd5\x40\xf6\xe7\x8e\x97\xee\xc8\xde\x8b\x7d\x3c\x63\xa6\x79\x98\x11\x72\x67\x2b\xe8\x6f\x1a\x10\x92\xf2\xa5\x85\xef\x62\xed\xb7\xa6\x39\xdb\x0a\x20\xbe\xb3\x3b\x18\x46\x4d\x13\x99\xa6\xc8\x57\x75\x91\x00\x2d\xe3\xfa\x1a\xd4\x90\x9a\x66\xd6\x7f\x07\xb8\x1e\x38\x5a\xd2\xcb\x8c\xe0\x66\xb1\xc0\x99\x14\xd7\x70\x40\x17\x4f\x3d\x68\xa2\x75\x62\x9a\xb3\x7d\x7f\xab\xc8\x29\x58\x5a\x46\xc5\x63\xce\xb3\xab\x67\x55\xa0\xc0\x1d\xe2\x94\xfb\xa3\xd4\x55\xae\x2c\x8a\xf3\x3e\x87\xba\x34\x81\xbd\xd8\x76\x6a\x1f\x39\x3f\x99\x53\xa4\x96\xb4\xbb\xa3\xc8\xe7\x1c\x38\x00\x54\x67\x4b\xb4\x1e\x5f\xda\xa7\x00\x95\x5d\x6e\x43\x34\x72\x25\x80\xd2\x00\xb7\xd0\x12\xe1\x4e\x99\x68\xcb\xc6\xe2\xf4\x09\xd4\x8b\x94\xee\x14\xdf\x09\x20\x57\x96\xc6\x41\xa3\xcb\x0b\x84\x77\xc4\x12\x5b\x41\xb8\x55\x50\xad\x81\x2d\xa3\x27\x10\xbe\x2f\x25\x8a\x63\x18\xed\x52\xa5\xe0\x96\x73\x24\x24\xc0\xc2\xdb\xf6\xb8\x25\xe0\x27\x53\x2f\xd4\xd4\x42\xbd\x10\xb4\x3d\x82\x1e\xbc\x21\x18\x80\xb8\x08\x98\xdd\xd9\x87\x92\xbd\x92\x23\x6e\x9a\xc1\xab\x66\xbb\x1c\x88\x75\x42\xa7\x6d\xd7\x3f\x89\x79\x2a\x3d\x17\xde\x71\x72\x5c\xb1\x07\x56\x4c\xb6\x5e\xc8\xf9\x03\xd3\x9c\x05\x76\x5a\x7d\x5f\x16\x07\x9a\x40\x88\x81\x37\x75\x71\x38\xb0\xc8\xe2\x68\xc0\x0e\x8f\x65\xc9\xf2\x5a\x76\x2c\xb6\x59\xc6\xf6\x5a\xdc\x79\x2b\xe9\x8f\xf6\x4a\x04\xa7\x93\x15\x7e\xb5\xdf\xb3\x28\xa5\x35\x9b\xac\x39\xb0\xcb\x6e\x63\x40\x81\xfe\x55\x6c\x9c\x64\xb0\x71\xac\x40\x36\xf2\x5d\xb0\x23\x09\x0e\x6c\x7e\xe6\x90\x04\x7e\x30\x23\x96\x35\x5e\x99\xa4\xdb\xa2\xbe\x30\x4a\x15\xc5\x9b\x26\x51\xbd\x45\xf2\xd0\x96\x43\x4a\xb5\x1b\x61\x4e\x0a\x82\xcd\xc4\x31\xab\x09\x53\x46\x81\x56\x00\x36\xd4\x2c\xaf\x5f\x09\xe2\x9d\xf3\x41\x70\x59\xa8\x8d\xd0\x42\xa8\x77\x00\x68\x1f\x8a\xaa\x56\x2b\x66\x9a\xc3\xf7\xc1\x0a\x62\xd5\x1c\x28\xc2\x88\xd9\xbc\xac\x51\xc0\x81\x9a\x9f\x77\x29\x09\x86\x98\x00\xef\x08\xb5\x45\x40\x09\x70\xc0\x6c\x9a\x3b\x5d\x65\xc0\x32\x80\x2d\xd0\x3d\xe4\x53\x5b\xb8\xe0\x7f\x41\x56\x52\x13\x6f\x37\x23\xc2\x7f\xcb\x8e\xec\x06\xa6\xbd\x20\xd6\x93\xce\x96\xf4\x6a\x55\xad\xb3\xde\xaf\xff\xae\x0b\x88\x0d\xda\xa2\x48\xc8\x39\xa4\x49\xe7\xa9\xc5\xc2\x9b\x7d\x0a\x3b\x22\x22\x20\x41\x61\x24\xea\x30\xdc\xdc\xb8\x32\x7a\x81\x4e\xe2\x31\x9f\x93\xcd\x1e\xf3\x49\x34\xa0\x13\xdc\xd2\x62\xc2\x2d\x83\x74\x47\xb0\x03\xbb\x3f\xe9\xdb\x45\x24\xc9\x10\xa6\xbb\x2e\x84\x29\xc2\xa2\xc2\xb8\x73\x3c\x1f\x77\xa8\x71\x2b\x7d\x87\x73\x88\x70\x76\xda\x4a\xb4\xdd\xa2\xee\xa4\xb5\xca\x6d\xf0\xbb\xa5\x02\xe5\xfc\x0f\x3c\x9e\x03\x61\xcd\x21\x65\xb4\xae\xd3\x4a\x7c\xa5\x0d\xd8\xb6\xd7\x24\xc4\x14\x9f\x58\x7e\xdc\x33\xa5\xbf\x37\xd6\xe7\x03\x1d\xba\xb1\x45\x82\xc6\x05\x28\xe5\x12\xbe\x2f\xd2\x9c\x66\x50\x7f\xa7\x2c\x30\x95\x36\xb8\xe6\xf9\x60\xf1\xf3\x14\x8f\xfa\x23\xd5\xc2\x8b\x43\x95\xb7\xbe\xbf\x33\xba\xc7\x32\xad\xd5\xb3\xd4\x68\x04\xd9\x72\x8b\xe3\x74\xda\x11\x84\xd7\x69\x68\xfa\x2e\x75\xc0\xf3\xbe\x2d\x8f\x30\xd4\x62\x89\x28\x9c\x53\x56\xd0\xc8\x39\xe5\xc5\xe7\xc7\x40\x2a\x46\xca\x08\x29\x27\x49\xf8\x4f\xcc\xc2\x8c\x10\xce\x09\x0b\xef\x10\x36\x64\x1f\x4c\x45\x2c\x22\xa4\xe0\xd9\xaa\xc5\x03\xca\xc5\x80\x94\x34\x37\x5a\x1c\x64\xc7\xf2\x43\x6d\x90\x41\x1b\x3c\xf7\xa0\x09\xfe\xe1\x72\x0b\xc5\xb1\x36\x5a\x0c\xfb\xf2\x52\x1b\x86\x12\xc4\x73\x74\x00\x55\x0a\x8c\x20\xd4\x2c\x79\x49\xd3\xfc\x5c\x9e\x89\x52\x66\x33\xe8\x00\x64\x91\x3d\xe8\x64\xd2\xd3\x56\xfb\x12\x25\x61\x83\xc2\x21\x1e\xb0\xb8\x28\xd9\x31\x17\x33\xaf\xe3\xc4\xe1\xb1\xae\xd0\x31\x95\xb8\x91\x63\xab\x01\x90\x81\xc6\xe1\xe0\x8b\x2d\x1a\x05\xb1\x4a\x57\x0e\xb5\x6d\x2b\xf4\xf8\x3b\x2a\xe6\x4c\x41\x79\x52\xad\x9c\x37\x38\xa5\x6d\x2e\x75\xd0\xec\xf3\xaa\x06\x3a\x01\x03\x27\x42\x22\xb3\x6b\x51\x30\x1d\xeb\xdc\xe8\x0c\xbb\xaf\x3c\xea\x80\xea\xb0\xc8\x26\x3e\xa4\x95\x3c\x73\xbe\x17\x27\x10\x8b\x48\xe7\xb9\xb0\xfb\xd4\x34\xbd\x32\xd9\x59\xa2\x18\x4b\x3f\x39\xfc\x4c\x73\x1f\xa8\xf3\xa8\x9a\x14\x07\xbc\x5a\x2b\xd3\xfc\x58\x9c\x12\xf0\xa6\x07\xb9\x97\x5f\xfa\x93\xc1\xe9\xd6\x57\xc0\xc5\x80\x60\xa0\xc3\x77\x91\x05\x5c\x97\xb2\xa8\xcb\x32\x78\x97\xd7\x4d\x62\x0a\x70\x20\xd8\x44\x60\x3d\xd5\x59\x29\xd2\xd3\x3d\x7b\x53\xd3\xfd\x81\x88\x19\x55\xaf\x9c\x5c\xcd\x8b\x47\x4b\x1c\xe7\x42\x21\xa5\x47\x04\x70\x18\x0d\x71\x01\xe8\x09\x9e\xa1\x5b\x72\xd2\x1c\x45\x39\x32\x19\x9f\x2f\x03\x9f\xbf\x29\xe2\x49\x7c\xff\x00\x0d\x24\x32\xbc\x49\xf7\x47\x18\xbb\x33\x5b\xe1\x21\x75\x71\x6e\x9d\x7a\x0e\x2f\xeb\x4b\xc0\xf1\x40\x31\x35\xcd\x99\x4c\xee\x5a\x81\xc0\x46\x23\x1a\xa6\xc5\x23\x12\xe6\x3f\x69\xf8\x7c\x5c\x1f\x6a\xfa\x8c\x56\x12\x6d\x4f\xcd\xd2\x7f\xd2\x89\x0f\xcc\xf2\xef\xf5\x66\xaa\xa8\x25\x21\xec\xbc\xb7\x60\x60\x03\x2e\x6f\x68\x56\xff\x9d\xbd\xe7\x67\x51\x00\xc7\x06\x38\x96\x0a\xf9\x5e\xcf\xba\x03\x6c\x4b\xf3\x84\x45\x6f\x8b\x23\xc4\x1d\xe1\x5f\xea\x32\x93\xa5\x22\x56\xd3\x34\xe3\x4f\xb0\x18\xdf\x6f\x69\x05\x85\xf6\xac\xa6\x32\xcb\x81\x26\xec\x17\xf5\xf0\x4f\xfe\x00\x4a\x6b\x32\xf5\x21\x65\x8f\xfc\xd7\x08\xb7\xb4\x34\x64\x7b\xe5\x17\x7c\x3b\xce\x96\xf8\x4e\x64\xba\x63\xef\xd5\x17\x19\xc1\xa9\x7b\x12\x1d\xca\x52\x96\xd7\xbf\xf4\x8f\xd0\x4c\x11\xc7\x15\x13\x5f\xc5\x23\x7c\x95\xf2\xe6\xaf\x22\xed\x05\x0e\x1c\xde\xb1\xb0\x64\x2c\xff\xa5\x7f\x84\x12\x02\x29\x68\xe3\xaf\x0b\x29\x26\x16\x2f\xdd\xf7\xc7\x6d\x3a\xc9\xd1\x29\xda\x74\x3d\x72\xc2\x0a\xf9\x4d\xb3\xa2\x2a\x52\x15\xf8\x2c\x76\xa5\x9d\xa4\xad\x26\xc2\xed\x1f\x1d\x6a\x77\x73\xd1\x95\xd7\xf5\xc7\xeb\x51\x5d\x2b\x33\x70\x57\xce\x73\x33\x70\x3f\x76\x3e\x31\x03\xf7\xb9\xb3\x74\x64\x41\x01\x05\x4a\xa0\xca\x01\x04\x75\x60\x01\xa2\x79\xbe\x03\x4b\xc7\x80\xe7\xe2\x81\x95\x06\x86\xc7\x8c\xd1\x07\xa6\x3e\x1f\x6b\x43\x4d\xa2\xcc\x2e\xdf\x44\x01\xf9\x22\x8b\xa8\x24\x38\xd3\x47\xa7\xcd\x88\xed\xa1\x3e\x39\x0d\xc8\x81\x00\x2b\x51\x89\x13\x48\xca\xf4\x6c\xa6\x95\xff\x46\xcc\xc6\xb8\x18\xa2\x24\x74\x8c\x57\xa7\x69\x22\xe3\xd8\x46\x1c\xd7\x76\x37\x57\xe0\xbe\xa6\x69\xe4\x14\x92\xb8\x63\xc0\x74\xe9\xef\xb4\x58\x1b\xcb\x32\xe0\xdd\xf9\x4c\x6b\x71\x10\x78\x4c\xa9\x2b\x29\xaf\x45\xb4\x53\x1a\x84\xef\x2d\x2e\xf2\x73\xb9\xd8\xa5\xec\x78\xc5\x0b\xc4\xf1\x25\xfb\x17\xd0\xa7\x3d\xc7\x99\xfc\x4b\x37\x29\x8a\x26\x8a\xf4\x99\xc2\xa5\x45\x47\x3c\xbd\x10\xed\x47\x3d\x57\xeb\x46\xdd\x0c\xcd\x0d\xdb\x98\x6b\x49\x4e\x9f\x84\x7b\xae\x08\x47\x1d\xeb\x0a\x08\x6a\xf2\x02\x45\xc6\xb9\x00\xff\x81\x14\x09\x9c\x19\xc7\xe0\x61\x9b\x5e\x72\x0e\x18\xcc\x04\x83\xdb\x5b\xba\xf7\xee\x55\xc1\xa9\x48\x80\x83\x4e\x8b\x30\x54\xdc\x70\x48\x1e\xa5\x37\xb5\x8b\x17\x0e\x03\x45\x66\x1c\x0a\xbd\x69\xa9\x0e\xf2\x1b\xe8\x7c\xb8\x33\x5a\x32\xda\x04\x65\x13\x16\x59\xc3\xf6\x01\x8b\x9a\x6d\xd9\xa4\xfb\xa4\x01\x9a\xb3\xc9\xd2\xfc\xae\xe1\x58\xb1\x39\xd0\x92\xee\x91\x75\x59\x4d\xe4\x5a\x38\xb0\x44\x9b\x9b\x17\x37\x49\x8a\x5f\xf2\x06\xc4\x25\x69\x73\x0b\x7a\x37\xcd\x2d\xaf\xed\x26\xc5\x9f\x53\x72\x23\xaf\xf6\x36\xd5\xb5\xe5\x3a\xde\x3b\xe2\x37\x64\x53\x5d\xab\x1b\x3f\x1b\xdd\xa4\xf8\x0b\x4a\x6e\xde\xd5\xe5\x91\x6d\x6e\x2c\xfb\x1a\xdd\xe0\x57\xfc\xc3\xa6\xba\xbe\x9d\x59\xae\xb3\xf1\xbe\x78\xf5\xf2\xed\xcb\x8d\xd7\x2c\x16\xa8\xe1\x1f\xfc\x8d\xcf\x9f\x5f\x6c\xaa\xeb\x67\xba\xf1\xc8\x97\x74\x40\x1a\x0a\x2f\x55\xfc\x98\x30\x10\x27\xb1\xcf\xdd\xa1\x05\xfa\x0d\xb5\x51\x97\x06\x72\x4b\xcb\x78\x01\xca\x1c\x06\xa6\xc8\x5b\xfa\x4d\x43\x1d\xcd\x53\xca\xeb\x61\xf0\x20\xd8\x4d\x96\x40\x88\x97\x42\xdf\xcd\x8d\x1b\x63\x2e\x69\x4c\xad\xa6\xbf\xf4\x0a\x68\xe4\x0b\x29\xd1\x95\x58\xb1\xb3\x51\x73\xd5\x7e\xf5\x56\xbe\xa3\x48\xe4\xb3\x16\xf4\x5a\xff\x4a\x27\x85\x18\x38\x15\x7e\x1d\x46\xf1\x31\x39\x7b\x32\x94\x55\x5b\xb1\xa6\x93\x8e\x70\x42\x84\x5e\x46\x80\x63\x84\x77\x24\xee\xe5\xd6\x52\x1e\xa9\xa4\x3c\x38\xe9\x2f\x85\xd6\xdd\xc6\xd8\x49\xd7\x87\x4b\x1c\x91\x9d\xc7\xfc\xb1\xd2\x87\x7e\x61\x16\x60\x86\x79\x1e\x2f\xf4\x51\xfb\xcb\xb0\x53\x5b\xf2\x8b\xd6\xa9\x94\xe8\xee\xac\xb6\x08\xff\x22\xfb\x08\xce\x0e\xba\xa9\xf8\x6a\x14\x2b\xe4\x42\x00\xc5\xde\x85\x79\x68\x9a\xbb\xd1\xf1\x14\x28\x38\x25\x5d\xe4\x4b\x47\x16\x10\xda\x6a\x86\xba\x97\x86\x77\x90\x9f\xe9\x37\xce\x64\xe8\xf6\x5c\x53\xdd\xfb\x9b\xa6\x12\x1a\x10\x75\x0d\xe9\xf9\x38\x10\xdb\x96\x2f\x5c\xaf\xa7\xb2\xc4\xfb\xde\x1e\x35\x27\xfb\xc5\x0a\xdf\x83\x4f\x63\x5c\x0d\xdd\xa0\xdc\xc3\x2d\x43\xd5\x34\xfb\x17\xab\x09\xe3\xba\x7b\xd3\x9c\xe9\x17\xf4\xa6\xf9\xb9\x1c\xf1\xbd\xe6\xa9\x7d\x88\x66\x3a\x5f\x23\xd4\x66\xf7\x16\x43\xeb\xca\x34\x2d\x08\xa2\x7b\xaf\x89\xd6\x18\x8e\x41\x7f\xc4\x42\x08\xe1\xbf\x51\x2b\x56\x07\x05\x74\x68\x0f\x27\xd9\x3d\xb5\x38\x76\x5c\xfa\x23\xdd\x8b\xd9\x0a\x83\x6d\x6b\x4c\x98\xbe\x21\x57\x10\x4f\xbe\xd7\x29\xd1\xcd\x75\x62\x84\xe3\xa6\x89\xa4\xc0\x6b\x2b\x3d\xc5\xe5\xd4\x62\x9a\xc2\xc6\x6b\x00\x16\x15\x5a\x6e\x9d\xdd\xee\xd7\xd9\x7c\x8e\x76\x84\x61\xbe\x5f\x73\x88\xd0\x52\x0a\xd5\x01\x6b\x87\x67\x4b\x08\x11\x94\x72\x4e\x48\xe8\xb4\x6c\x71\x4e\xad\x5d\x5f\x23\x42\x38\x54\xa6\xb2\x99\x8f\x77\x38\x43\x22\xfe\x1a\x04\x7c\x21\x5b\x6f\xdb\x7b\xd6\x1d\x8d\x51\x74\x70\x8b\xff\x42\x11\x5f\xcf\x75\x76\x9b\xca\xce\x6c\x79\x55\x4a\x79\x64\xa7\x2b\x8f\xcc\xba\xad\xb8\x1b\x2a\x3e\x0d\x74\xa3\xef\xf0\x0e\x42\x3e\xd9\x55\x19\xba\xa5\xfd\x2b\x7b\xa0\xd9\x8f\x65\xc6\xf3\xa8\x67\x91\x88\x9c\x03\xaf\xbf\x57\xaa\xe9\x6c\xd9\x5e\x51\x08\x0d\x70\xd7\x8b\x54\x35\x94\xf2\xf7\xf3\xe8\x65\x98\x91\x60\xe0\xd4\x1b\x39\x14\xc7\x64\xb9\x96\xa1\x6d\x22\xa9\x71\x19\xcf\xe7\x28\x6c\x9a\xd5\x4c\xf7\xa6\x0d\xc4\x4c\xc6\x68\x0e\xfb\x3b\x17\xc1\xc2\xa2\x41\x54\x58\x2b\x1c\x8c\x30\x1a\x6b\xe7\x22\xd0\xc4\xe1\x45\xb5\xb5\x19\xd4\x31\xd0\xaa\xd5\x82\x35\x51\xdd\x7e\x4e\x57\x77\x9a\x0e\x55\xab\x26\xe8\x37\x8a\x8d\xdb\x67\xab\x17\xb7\x37\xcf\x9e\xbf\x30\x84\xef\xd8\x33\xfa\xa7\x23\x67\xa4\xe0\x98\x0e\x95\x52\x00\x6f\x7d\x40\xa3\x5d\xf8\xdd\x19\x2b\xb7\x88\xd9\xd3\x3d\xe1\xaf\x86\x1f\x84\x89\xa8\x88\x12\x60\x51\x24\x84\xcb\xa0\xca\xb4\xe5\x3b\x2a\xe7\x28\x54\xba\xb3\x8d\xc7\xf1\xe6\xbe\xa2\x56\xec\x45\x3e\x4e\xbc\xc8\x87\xf6\x03\xf0\x42\x8b\x84\x10\x39\x6e\x1a\x51\x1a\x74\xd2\x44\x85\x17\x2a\xfa\xeb\xa0\x22\xb8\x9e\x82\x93\x68\xdb\xfb\xb0\x80\x1e\x69\x9b\x33\xd1\xe2\xfc\x14\xd4\x4a\xf0\x2c\x35\x4d\x50\x81\xd4\x96\x74\x2b\x4c\x42\xf2\x33\xc3\x2e\x3d\xc6\x58\x04\x4a\xd6\x03\xfa\x1c\x80\xb1\xe3\x3b\xac\x10\xf4\x9e\x05\x3c\xa6\xb1\xf5\x23\xd8\xec\x83\x03\xea\xd0\xfb\xb9\x37\x8e\x85\x4f\xea\x88\xeb\xad\xaa\xd5\x17\xe6\x45\xbe\x3b\x22\xb9\x20\x24\xd8\xf0\xde\x0e\xf4\x63\xd4\xbd\xdd\x5a\x6f\x40\xd2\x76\x6d\xe8\xfd\xa2\xd9\x53\x5b\xfa\xab\x22\xff\xce\xa9\xf3\x08\x82\xa7\x4c\xfa\x48\xed\x88\x6d\xcd\x14\xee\x83\x19\xd1\x44\x0c\x60\x99\x67\x6c\x08\x48\xcf\x0d\xb7\xa9\x2b\x02\x55\x08\xfd\x63\xa9\xb4\x0c\xd1\x91\xd1\x19\x85\xba\x92\x97\x1c\x63\xf8\x1d\x7d\xfb\x6c\xfc\xa9\x69\x84\xd4\x4e\x57\x01\xa4\xbd\x35\x20\x3d\xb3\x8d\x42\x2d\x16\x8a\x68\x13\x7a\xda\x7f\xa3\x23\x46\x68\x30\x3c\x49\x16\x8d\x9a\x5f\x4d\x7c\xfb\x6c\xfc\x49\xd1\x6f\x5f\x76\x13\xbb\x1e\xea\xc3\x51\x21\x39\x3f\x94\xec\xff\x13\x5d\x4b\xf3\x8a\x95\xf5\xe7\x20\x16\xe6\x38\x6b\xe0\x12\x96\x77\x54\x48\x8c\xff\xe3\x7e\x42\xcb\x3a\x02\x1f\x7d\x18\x37\x2c\xb4\xe6\xf9\x92\xc5\xf5\x50\x5e\xfe\xff\xac\xb9\x41\x70\x11\xde\xf4\x99\xa3\xca\xce\x8f\x38\xc4\x2f\x90\x27\x99\x10\x87\x79\x81\x8f\x20\x9a\xc1\x38\x2a\x89\x35\x3a\xca\x28\x84\x22\xe0\x6c\xf6\x40\x75\x75\xc8\x0d\x4e\x1c\x1e\x9a\xa9\x94\x94\xae\x98\x26\x95\xbe\x3e\x08\x09\x5c\xea\x04\x62\x14\x9c\x88\x98\xb4\x09\x02\x1a\x66\x60\x36\xcb\x8f\xb7\x3f\xb8\xc3\x05\xa8\x48\x9b\x42\xd0\x06\x11\x34\xbb\x66\x20\x37\x34\xa1\x3e\x8b\xb4\xaf\x38\x96\x5e\x7f\x73\xd2\x8b\x05\x35\xcd\xd9\x4b\xda\xfb\xd4\x9d\xed\xa9\xd7\x29\x31\xd3\x0f\x29\x31\xfb\xe8\x44\xc9\x58\x45\x99\x22\xf0\x54\x09\xd7\xa9\x8a\xa7\x90\xe3\x08\xc5\x38\x56\xa3\xc8\x64\xe3\x05\x0b\xc4\x82\xe9\x7a\xa7\x7c\xa7\x90\xa5\x66\x95\xdf\x06\x12\xc2\x14\x92\x13\x3b\x1c\x6e\xb7\x2e\x63\x23\x49\x3a\x0c\xfd\x88\x2a\x19\xab\xd7\x59\x13\x7d\x00\xd2\x3b\xde\x65\x04\xde\xeb\x5e\xdf\x59\x6e\xed\xdb\xe5\xf9\xc8\x60\x8f\x49\xdb\x42\xd9\x17\xa9\x4e\x2e\x43\x79\xb4\x98\x2a\x8b\x67\x21\x6a\x85\x51\xbd\x2d\x1c\x43\x3c\x19\x0a\x6d\xf1\x4f\xf2\xd1\xc0\xfa\xd6\x72\x0c\x81\x2f\xd4\xd7\x97\xb0\x9b\x0d\xd8\xd4\x86\x9a\x80\x97\x59\xe6\x18\xda\x64\x4c\x88\xd6\x46\x0e\xa0\xe9\xc0\xa0\x49\x44\x29\x02\x4f\x36\x71\x17\x03\x6d\xb1\xc2\x09\x59\xae\x93\x5b\x12\xaf\x13\x4e\x64\x42\xa0\xc5\x58\x33\x80\x15\x1b\x82\x93\x5d\xa5\xc5\xbc\xc4\x47\x5e\xe0\x5b\x21\xc2\x4a\x85\x30\xc2\xa1\xf0\xfd\x3e\xd8\x9b\x9a\x4b\xe7\xa8\x77\xe9\x4c\xc9\xcd\xbb\x3d\x2d\x93\x34\xbf\xc1\xdf\x8c\x6d\x27\x95\xbd\xa4\x3b\x3b\x3c\x21\x61\x34\x39\x57\x36\x93\xdf\x52\x72\xbe\x9a\xa3\x88\x15\x1d\x83\x98\xb2\x47\x2d\x42\x4d\x68\x17\x07\x96\xb3\x12\xe4\x42\x14\x89\xde\x7e\x51\xec\x0f\xc7\x9a\x45\x6f\xc0\xac\x2e\x40\xed\x5a\x57\x26\xef\x28\xf6\x40\x5c\x3c\xa6\xe8\x94\x4a\x43\xa8\xb0\xaa\xde\xb2\xa7\x9a\x18\x41\xf1\xb4\xa8\xd2\xdf\xd2\x3c\x71\x82\xa2\x8c\x58\xb9\x08\x8a\xa7\xf5\x41\x86\x59\x73\x54\xac\xbb\xb5\xb4\x9c\x72\xc0\xfa\x6c\x2d\x06\xef\xd0\x63\x5d\xac\x45\x31\x67\x75\x78\x5a\x1f\x68\x14\xf1\x9a\xf8\x73\x5d\x1c\x9c\xd5\x7f\xad\x21\x26\x9a\xf3\xe9\xf2\xbf\x0c\x9c\xea\xba\xdc\x06\x2e\x87\x8a\xec\x5b\xe9\x85\x5a\x48\x4d\x86\x03\x4b\xd1\x3a\x24\xc6\xea\xbf\x0c\xa1\x08\x5a\x1c\x70\x42\x8c\xe7\x07\x61\x57\x6e\x8b\xce\x7c\xcd\xe2\x1a\x33\x62\x7c\xa2\x3e\x43\xcb\x58\x0d\x58\x64\x02\x43\x55\x62\x40\x77\x62\x2d\xaf\x96\xca\xfb\xa5\xf3\x0a\x5b\x4e\xa7\x83\x0b\xce\x76\x10\x20\xfe\x5c\xbf\x1e\x34\xef\x71\x7a\x21\x61\x9d\x76\x46\x76\xaa\x4f\x01\x0d\xef\x92\xb2\x38\xe6\xd1\x17\x59\x7a\x20\x86\xf4\x97\xce\x57\x80\xcf\xd6\x50\x83\x7d\xba\x88\x81\x0b\xd8\xe5\x25\xb0\x08\x30\x5b\xc3\x7a\x08\x21\xd3\xcd\xe1\xed\x39\x28\xc0\x42\x2e\xe5\x9a\xfd\xf7\xe1\x69\x2d\x02\xdb\x39\x4b\x58\xcd\xe5\x3a\x63\x71\xed\x2c\x3e\xfb\xec\xb3\xcf\xb4\xc5\x5e\x4a\x68\x58\xc0\x8a\x1f\x34\xe0\xa1\x01\xf8\xf9\x64\x86\xd8\x64\xdd\x52\xa7\x9a\x57\x85\x02\x9f\x0e\xe9\x13\xcb\x54\x60\xbf\x89\xb3\x3f\xb0\x20\xf6\x60\x50\x3c\xbd\x01\x40\xfd\x81\x65\xe9\x05\x57\xd1\x3c\x2b\x6b\x31\xd4\xf8\x4d\xbf\xa6\x17\x72\xc6\x1c\x29\x8b\xba\xbe\xe9\x60\xe8\x42\xde\xa4\x6d\x11\x6a\x2d\x2d\x68\xc3\x77\xf4\x12\x97\x07\xf3\xda\xdb\x6b\x85\x4d\xf3\x2d\xb0\x4d\x21\xe8\xa0\xc3\xc6\x55\x3a\x18\x20\x05\xb2\x02\xd4\x34\xa1\x17\xf8\xd8\xe0\x10\x9e\x0c\xa4\xfb\xe7\x7c\x21\x68\x55\x6b\xa6\xb4\x08\xe1\x59\x61\x8f\xc7\x6c\x21\xd3\xfc\x46\x9e\xac\x09\x32\xcd\xaf\xa9\x8a\xbe\x05\x5a\xfd\x5b\xb9\x3f\x18\xd9\xda\xfb\x34\xff\x19\x5e\x62\xfe\x42\x9f\xc4\x4b\xff\x5d\xfb\xaa\xca\x91\x04\xf3\x91\x3c\xca\x9c\xe2\x5b\xa4\x97\x61\x58\x2b\x15\x23\x4d\xc9\x2b\x71\x93\xb9\x61\x38\x5a\x10\xf1\xef\x07\x72\xda\xd3\xc0\x27\x55\x4f\x09\x59\x32\xa2\x8d\x94\x34\xd6\xd2\x13\x94\xd3\xc5\xed\x20\x01\xba\xa0\xbd\x2f\xf6\xee\x3f\xc0\x26\x23\x2f\x72\xd6\x80\x14\xd8\x72\x67\x8b\xd0\x63\xd4\x47\xf6\x1c\xdd\xe0\x1f\x78\xf2\x62\x71\x83\xdf\x50\x72\xea\x80\xd8\xe8\xa1\xf8\x21\xad\xd2\x20\xcd\xd2\xfa\xbd\x63\x6c\xd3\x28\x62\xb9\x81\x15\x5e\x94\x66\xb9\x2d\x7e\x4b\xc9\x29\x63\x75\xcd\xca\x37\x07\x1a\xf2\x0d\x62\x2c\x0d\x1c\x17\x79\xfd\xb3\xd8\x4c\xc6\x27\xcb\xa5\xd1\xe2\x1f\x29\xf1\x8c\x9f\x59\x70\x97\xd6\x06\x36\xbe\x29\x7e\x33\xb0\xb1\xaf\x0c\x1f\xff\x44\x2f\x60\x10\x09\x57\xdd\xac\xfd\x4c\x25\x4b\x40\x39\x57\xfa\x13\xed\xed\x1e\x94\xf7\xa6\x25\xa7\x99\x7e\x3c\x1c\x14\xcd\x34\x57\xf1\x11\x56\x08\x87\xe4\x47\x7a\xee\xac\x06\xfc\xfb\xfe\x48\xbd\xd0\x9f\x07\x78\x5c\x6f\xbf\x60\xbf\x50\x5d\xfd\x33\xac\xe0\x3a\xba\xf2\xe8\xc8\x9b\xda\x20\x89\xfc\x2c\x9c\x0f\x51\x84\x83\xbe\xa6\x7f\xd2\x51\x5c\x36\xa5\xcb\xdc\x07\x06\x73\x21\xb4\xf2\x9e\x3e\x59\x4b\x1c\x79\xcf\xfd\x85\x15\x36\xcd\x12\xa1\xb9\x15\x81\x81\x3b\x58\xb3\x3b\x5a\x9d\xff\xa2\x13\x7a\xd9\x64\x29\xad\x84\x43\x42\x88\x15\xb9\x12\xdd\x19\x8e\x42\x97\x06\x72\x3f\x71\x0c\x11\xc3\x13\x9c\x67\xac\x9c\xe5\x3a\xbe\xfd\x64\x1d\xcf\xc9\x73\x64\x08\x24\xa7\xac\xa0\x93\x79\xe7\x65\x20\x9c\x87\x60\x44\x3d\x5b\x42\x18\x89\xc8\xb5\xba\x1a\x55\xe6\x45\xef\x92\x40\x62\x4d\x63\x58\x48\xd5\x3e\x3b\x2f\x20\xbb\x29\xf2\xcf\x8d\x9f\x45\x8c\x51\x51\x0e\x39\x7a\x47\x26\xeb\xee\xbf\xce\xce\x7a\xfe\xe1\xba\x27\x82\xfd\x3f\x1b\xa3\x3c\x22\x10\x5b\x4c\x24\x32\x64\x88\x9f\xcc\x3d\x21\x31\xf0\xc6\xd0\x21\x70\x03\xcf\x56\xb8\xbf\xd5\xf8\xa6\xb3\x76\x74\x63\xc7\x8a\x48\x62\x9a\x56\x61\x9f\xa1\x7b\x0b\x35\x4d\xdc\xbb\x85\xe0\x2c\x18\x36\x38\x05\x62\x48\xf3\x9e\x98\x50\xcf\x10\x17\xe7\xc6\x3c\x38\x07\xfe\xa0\x03\x7e\x9f\x77\x19\x1c\x81\xbd\xce\x0a\x5a\x83\xb5\xe4\x12\xc7\x73\x05\x38\x1c\xc3\x4e\x01\x08\x00\xd4\x1c\xe0\x4d\x13\x1b\x86\x55\x25\xfc\xd0\x9c\x0a\xbe\xe3\xeb\xf7\xce\xe9\xdc\xab\x1e\xc8\xd2\x24\xc1\x07\x93\x65\xc8\xcc\x1d\x2f\x08\xe6\xf1\xa1\x6b\xac\x0c\x27\x04\xbd\xa9\xce\x35\x83\x73\xa2\x79\xba\x07\x5d\x88\xaf\x6a\x56\xc2\x03\x68\x9d\x0a\x75\xbd\xec\xb8\xef\x5f\xe3\x34\xcb\xbe\x93\xdd\xe0\xaf\x19\x7b\xfa\x4b\x59\x3c\xaa\xe7\x37\xdb\x32\xcd\xef\xe0\xad\xc7\x48\xb3\x25\xce\xd2\x9c\xfd\xb5\x7b\x2b\xfa\x0a\x04\x4d\x00\x0f\x87\x2d\x15\xda\x0b\x8f\x69\x54\x3c\xc2\xd3\x6f\x5f\x41\x34\x28\xfe\x54\x14\x7b\x50\xe1\x53\x3b\xde\x39\x19\x31\x9f\x5c\x3e\x7f\x55\x05\xf3\x6c\xb4\x18\x96\x6e\xe2\x9a\x58\xdc\xf7\x7e\x3c\x92\x6c\xfe\xf7\xe8\x5d\x2e\xbd\xe6\xb8\x03\x6f\xc7\xde\xf6\x52\xf2\x43\x77\xd2\x81\x56\xee\xe0\x34\x4e\x01\x2f\xfd\x42\xad\x2d\x12\x3e\x86\xd5\xe2\x81\xfb\x0b\xed\x75\xab\x19\x36\x87\x6e\x62\x9a\x46\xc2\x6a\x23\xcd\xaf\x12\x4d\x7f\xc1\x62\x24\x91\x1e\x85\x66\x2b\x1c\x21\xe4\x32\x67\xe7\x05\xbe\x63\xc5\x9d\x1d\x9b\xe6\xec\x0d\xa0\x94\x75\x28\x2e\x44\xc8\x34\x45\x10\x3d\x2b\x24\x71\xb7\x83\x62\x62\xe4\xb0\xee\x06\xc2\x82\xf9\xe7\xe4\xbf\xc4\x25\x2a\x49\xd6\x16\xce\xc1\x7b\xfd\xb9\xa3\x8f\x6d\xef\xe8\x03\x9d\xd3\x88\x4d\x63\xc8\xfb\x29\x50\xc3\xe8\x5d\x91\xf5\x34\xa2\xc1\xe9\x0c\x3e\x18\x62\xa4\xf9\x96\x95\x29\xc8\x68\x4d\xd3\xa8\x46\xf3\x40\x40\x9e\x9a\x48\x4f\x75\x7c\x35\xc1\x2a\xcc\xdd\xf1\x2f\x9d\xae\x29\x84\x78\x80\xea\xc2\x8e\x16\x40\x02\xc8\x27\xc0\xe1\x0f\xae\xef\xff\x64\x55\x87\x4b\xa9\xaf\xe0\x12\xf7\x5d\xeb\xdc\x6d\x48\xc4\x16\x21\x70\xc4\x51\xee\x69\x26\x5d\x71\x80\x4f\xc7\xb7\x14\x32\xbd\xa5\x02\x1b\xc1\x0e\x6e\x9a\xd0\xb5\x06\xe8\x85\xc9\xcb\xfb\x65\xd3\xa4\xd5\xeb\x34\x4f\x6b\x06\xc8\xae\x69\x96\x8e\x70\x28\xde\x31\xdd\x9e\x21\x48\x6e\x03\xcb\x93\xc8\x3f\x63\x8e\xb5\xb1\x91\x31\xa2\x51\x7b\x49\x79\x56\x9b\xfd\x43\xce\xd5\xb9\x4b\x1c\x7e\x12\x03\xa7\x05\xfa\x47\x3f\xb0\xb0\xae\xba\x50\x6a\x7c\xa7\x25\xac\xfe\x9c\xc3\x41\x9a\x27\x7d\x16\x0b\x09\x52\xcf\x7d\xa6\xa6\xc5\x61\xfc\xe9\x8d\x16\xa8\xb5\x23\xd8\xba\x3c\x2d\x3a\x73\x76\x3a\xf0\x7c\x13\x99\xe6\xb7\xf2\x5e\x21\x32\x4d\x89\x84\x23\xfc\xc7\xce\x91\x18\x69\x76\xa7\xc9\xf9\x06\x93\x2e\x6d\x2c\xd6\xd3\x0a\xa0\xbd\xaa\x0e\x11\x30\x92\xd4\x1c\xdc\x60\xa0\x48\x42\x9c\x28\x91\xbb\x9a\x6f\x8d\xcf\x24\xdf\x53\xab\xb0\xcf\x79\x07\x3c\x81\xf3\x45\xcf\x2c\x0d\x1c\x04\xfa\xef\x6b\xeb\xd7\x62\x72\xc2\x39\xd3\xb5\x80\x59\x3e\xf5\x65\x9c\x65\x3b\x31\xe3\x1f\xae\xa4\x45\xe2\xec\xd2\x44\x3c\x92\x8f\x37\x0c\xac\xb8\x39\xc3\xc0\x92\x0f\x94\xe4\xc0\xb9\x74\xa6\x03\x40\x3a\xe7\x20\x28\x6e\x2a\xfa\xc5\xd5\xef\x05\xe1\x72\xe8\xd4\x72\x94\x76\x6e\xe0\x1b\x2a\x83\xb4\x2b\x03\x39\x5e\xe8\xaf\xa3\xdb\x4f\xe0\xf2\x88\x79\x94\x93\x24\x91\xcf\xeb\x8f\xbd\xc8\x6f\x9a\xd8\x8b\x16\xcf\xe1\x77\xa9\x39\x54\x6a\xf1\xd7\x9d\xec\x50\xe1\xbf\xbe\x6b\x1c\xff\x90\x7f\x82\x93\xee\xc1\xc5\xc9\x18\xe5\x5c\x16\x84\x8e\xd8\x3b\x3e\x12\x4e\x47\xa6\xb1\x35\xf6\x05\x2b\xc6\x1c\x49\x7a\x88\xf5\xa6\x7a\xc9\x2d\x03\x81\x54\xec\x05\x5e\xe2\xfb\x3d\xa4\x79\x89\x2f\x0e\x0d\x35\x9c\xb8\x1d\xbb\x57\x0d\x5d\xdd\x61\x52\x88\x9c\x1e\x4c\x5b\xd0\xa4\x3a\xf7\x80\x38\x8c\x2b\xf8\xeb\x80\x10\x56\xca\x7c\xec\xf1\xea\x57\xda\x2b\xdc\x42\x8c\x59\x2d\x5f\x5b\xda\x6f\x1f\x19\xcb\xc9\xaf\x14\xeb\xf9\x86\x8a\xb9\xbf\x52\xcc\xcb\x4d\x58\x42\xe2\x58\xf9\x6b\xce\xd8\x5e\xe9\x55\x1f\xca\xe2\x40\x42\xa5\xb4\x54\xa5\x79\x42\xe0\xa2\x52\x3c\xf7\x4e\x28\x84\xde\x14\x38\x47\xa9\x48\xa0\xd4\x41\x69\x59\xab\xcb\x8c\x47\xa2\x74\x9d\x95\xb6\x28\xcb\x23\x12\x89\x47\xf0\xf9\x14\x8f\x4e\xc2\xb0\x3f\x09\x5b\x1c\x1e\xcb\x73\xe1\xab\x18\xe5\x41\x40\x4e\xd7\xdd\x0e\xce\xa8\x44\x87\xc2\x9b\x8a\xbc\xe4\xd2\xcb\x74\xdd\xef\xd3\x5b\x5c\x1e\x27\x42\x21\xe0\xf0\xf7\x1a\xd3\x27\xc0\x8e\x8e\x82\xd8\x93\x71\x25\x8b\x8a\x80\xb5\x1d\xcc\x99\xa7\xcd\xa5\xaf\xee\x34\xc6\x05\xaf\x29\x5e\xe2\xd5\x74\x9a\xbc\xa8\x13\xb5\xaa\x3b\x91\xe2\x91\x58\x6a\x56\x17\xfd\xec\xa3\xeb\x60\xde\xbf\x0d\xeb\xab\x6a\x76\x90\xf2\x70\xfd\x53\xaf\x0a\x22\xcc\xbc\x54\xfd\x2a\x9a\xab\x69\x82\x13\x09\x37\xec\xfc\x7b\x5e\x9a\xd4\x2e\x5d\xf8\xda\x6f\xf1\x19\xf4\x6a\x40\xaa\xa7\x61\xbd\x3e\x72\xea\x6c\x25\x46\xa7\xa6\x5c\x9b\xce\x5b\x00\x10\x9d\xbc\xcf\xda\x75\x9a\x52\x71\xe5\x9f\x3d\x51\xab\xaf\x1c\x1b\xc8\xcc\xe2\x40\x91\x69\xee\x30\xab\xa3\x98\x61\x4b\x7c\xc7\xe2\x3b\x28\x59\x04\xa6\x29\xd8\x18\x4e\x89\xb9\x81\xb3\x3c\x3b\x2d\x41\x24\xfe\x04\xb3\xda\xd5\x7f\xf6\xc5\xa2\xc8\xb9\xd8\xf5\x51\x27\x75\xbe\x5c\x94\xf6\xc1\x93\x73\x8f\x3e\x27\x47\x01\xb4\xf8\xa3\xd3\x21\xa5\xc1\x50\x20\x6d\x0e\x61\xf0\xc0\xee\x63\x30\xf9\x76\x05\x8e\xfc\xdf\x16\x07\x32\xf1\x19\x8e\xd4\xd3\x78\xcc\xa3\x81\xf0\x4d\x08\x1f\x06\x7a\x21\x53\x1d\x54\xea\xe2\x80\x65\x4e\x9c\xb3\xa1\xd3\xda\x1c\x2d\xae\x1e\xf9\x99\x77\x9e\x66\x7f\xba\x00\xa1\x43\x58\x54\x16\xbd\x86\xc7\xef\xbf\x42\x37\xcf\x35\x83\x1b\x03\xca\x1a\x10\xa8\xfd\x89\x9c\x81\x24\xee\x16\x88\x9c\x84\x3f\x6c\x1a\xe0\x20\xc0\x61\x20\x7c\x89\x08\x07\x61\x4d\xb5\x2d\x1e\x9b\x6d\x1a\x31\xf4\xec\x06\x47\x01\xb9\xe9\xfd\x40\x3e\xd3\x7c\x85\xb0\xc0\x42\xa7\x20\x00\xc7\x76\x42\xf2\xd4\xc5\x4b\x2c\xd9\xfd\x91\x55\xf5\x4b\xc5\x21\xbe\x2e\x85\xe3\xa7\xc9\xef\x16\x0b\x90\x33\x88\xa6\xc0\x02\xd1\x53\x50\x74\x7e\xa0\x19\x12\xaf\x35\x98\x18\x69\xea\x69\x71\xa0\x93\x19\xd3\xb1\x37\xa8\x52\x56\x6d\x11\xa6\x1c\xe0\xc1\x1c\xa4\xaf\x23\x09\xce\x23\x2a\x9f\xa4\x88\x99\x0a\x2d\xc1\x40\xca\x5d\x04\x29\x40\x9e\x2f\x02\x14\x12\xa0\x05\x30\xf3\x94\x94\x64\x1e\xfa\x84\x79\x9a\xb8\xc3\x27\x54\x8b\x72\x6b\x31\x5b\x32\xb0\x84\x49\xc9\x24\x3f\x93\xfb\x7e\x6c\x83\x29\x05\x26\xeb\x2e\xb0\x6b\x7e\xf0\xb1\x52\xf0\x0d\x9e\x8f\xec\xb0\xc8\x43\x5a\x0f\x92\x8c\x6b\x03\xe4\x07\x4b\x9c\x74\xd7\x4f\x9d\xe3\x39\xf0\x0d\xce\xbc\xd8\x17\xe8\x2f\xe4\x87\x74\xa7\x48\x17\x69\x8e\xfa\x82\x49\xe1\x71\xa7\xdf\x27\xa9\xff\x14\x24\x69\x8a\x27\xe0\x6f\x78\x2f\x34\xc6\x73\x4e\x8c\x14\x8a\xbd\xc5\x87\x01\x9f\x1c\x01\x15\xd2\x39\x07\xc1\x46\xfc\xc4\x01\x0d\x7c\xff\x00\x80\x49\x11\xf2\xd0\xe1\x2f\x78\x2c\xc6\x02\x5d\x24\xf6\x31\x87\xc4\xc8\x34\xad\xfe\x85\x2c\xf1\x96\x24\x9a\x2b\x5e\xac\xbf\xe8\x1e\x53\xfb\x32\x4d\xb3\xb5\x38\x0d\xd6\x7f\x99\xcf\xf1\xde\x16\x31\xe7\x74\xf0\x99\xfa\xd6\x17\x5a\x2c\x70\xef\xc7\x18\xba\x2a\xe7\xbe\x69\x92\xa1\x6f\x60\xd4\x4a\x8f\x80\x32\x06\x02\x84\xbd\x0f\x38\x08\x85\x81\x72\x70\x01\xc4\xb9\x14\x24\x43\x92\xf0\x54\x29\x76\x25\x70\x78\xe0\x5c\xc6\x3a\xb8\x06\xdf\x9d\x86\x63\x88\x09\x14\x06\x7c\xf0\x3c\x23\x9c\x84\x99\xdd\x6b\xc6\x5f\xf7\x5e\xe4\xa3\xb0\xc8\xeb\x34\x3f\xb2\xf5\x81\xcc\x96\x6d\xee\x45\x3e\xb9\x37\xcd\x7b\x20\x63\x7b\x7a\x2e\x42\x6d\x1a\x5b\x29\x99\xf0\x9f\x8f\xd3\xa6\x39\xfb\x9c\x23\x74\xca\xc6\xae\xe8\x4d\xd3\x0a\xed\xe2\x81\x95\x71\x56\x3c\x12\xaf\xe8\x9e\x71\xff\xf8\x8b\xf6\xfc\x4f\x1f\xef\xa0\x33\x9d\x77\x47\xb1\xda\x3b\x50\x7c\xec\xa0\xa5\xe7\x11\xc1\xf2\x7e\xcc\x39\xf6\x1e\x29\xef\x78\x39\xf7\x8e\xec\x1c\x2b\xa5\xe0\xea\x0d\x82\x94\x9c\xfb\x73\xdd\x4d\x57\x24\x0a\x21\x84\xb0\x65\xa4\x39\xc7\xd4\x50\x6b\xd3\xc8\xb7\x85\x10\xaa\x8b\x96\xc4\x11\xbc\x9b\x74\xf4\x2a\x24\x4d\x9c\xb1\x4b\xc1\x7f\x03\x44\x6b\xd2\xc0\xa8\xe8\x3c\x3f\xee\x5a\xa4\x0d\xfa\x8e\x74\x29\x78\x47\xfa\x71\x71\x8a\xf1\x0e\x04\x27\x9d\x07\xcb\x41\x8f\x40\xef\x53\xcd\x2a\x88\x2b\xbb\x55\xe8\x6e\x06\xa6\xc0\x59\xcb\xd7\x97\xf7\x96\xbe\xbe\x5e\x7a\xca\x4a\x4f\xf9\xa7\x9e\xf2\xdc\x6f\x11\xc2\x29\x99\xad\x7a\x50\xcf\x11\x1f\xfd\xbd\xab\xba\x90\xe6\x57\xf7\xa6\x69\x1d\xc8\xbd\x3c\x34\x90\x73\xaf\x7b\x18\x57\x68\x01\x9f\xd4\x2d\x06\x9f\x9d\xd8\x34\x2d\x55\x80\xcc\x0e\x08\x1f\x4c\x53\x5b\xdd\xff\x1f\x71\xef\xda\xe4\xb6\xad\xac\x0b\x7f\xdf\xbf\x42\xc2\xeb\x97\x45\x58\x18\x8d\xc6\x49\x9d\xda\x9b\x0a\xc2\x72\x1c\x67\x25\x6b\xd9\x71\x56\xec\xac\xe4\x14\xcd\x9d\x22\x78\x91\xa8\x91\x44\x99\xd2\xdc\x32\xd4\x7f\x3f\x85\x6e\x5c\x49\x8e\x93\xbd\x77\x9d\x3a\x1f\xec\x11\x41\x12\x24\x71\x69\x74\x37\xba\x9f\x67\xd8\xb8\x87\xae\x53\x1d\xc9\x5c\x0c\x09\x23\x73\x9c\xf7\x73\xc6\x3f\x93\x33\x83\xe2\x47\xac\x45\x78\x88\xe5\x0c\x89\x16\xac\x60\x3b\xca\xe0\xf2\x4f\xf2\x63\xe4\xf4\xa9\x95\xda\x79\x80\xbd\x53\xa9\xef\xeb\x12\xf5\x97\x2f\xbc\x40\xef\x8d\x18\x89\x79\x87\xd7\xc8\x31\x3b\x03\xa4\xb4\xeb\x57\x02\x12\x32\x25\x07\x00\x72\xd0\xb7\xef\x2a\x8a\x31\xc6\xb2\x3f\xf0\x02\x2e\x0d\x51\xca\x72\x45\xda\x03\x50\xac\x15\x33\x1c\x1b\x79\xda\xf3\x43\x15\xe8\x78\x42\x5b\x19\x7c\x4f\xf4\xb1\x92\x92\x14\x0a\xc2\x8a\xda\x7b\x8b\xd4\xbe\x6a\x45\xf1\x8d\xbb\x2e\x54\x4f\xcd\x53\x06\xcc\xcf\xa5\x02\xfd\x10\x00\x02\x6b\xbf\xfd\x7a\xb8\xb0\xc0\x4a\x75\x0d\x18\x0a\x18\x26\xe3\x60\x5c\xbb\x38\xd8\x23\xe3\x55\x83\x8c\x80\x96\x75\xa6\x3e\x19\xb4\x94\xab\xda\xcf\x84\xa3\x50\xed\x3b\x89\xae\xab\x60\xd3\x96\x3b\x3b\x37\x1b\xec\x2a\xa9\x36\xcc\x36\xc6\x08\xb9\x40\x44\xfa\x4b\x5b\x02\x9e\x78\x7e\x75\x51\x48\x53\x9b\xd5\x7c\x83\x2b\xef\xd1\x1a\xd4\x35\x18\xd4\xba\x3c\x59\xa5\xf3\xf6\x66\x1f\x5a\x27\xd0\xda\x61\x0f\x0c\x33\x96\x6c\x58\xc5\x64\x87\x54\x5f\x5d\x05\x41\x1d\xe7\x91\x14\x12\xc3\x8b\xae\x98\xec\xd1\xb5\x07\xf2\x9d\x01\x7e\x01\x9b\x5e\x01\xa7\xf4\xda\x40\x6d\x23\xe2\x40\xc6\x0e\xe0\xe9\x76\xb3\x0f\x04\x65\xcd\xe1\xe4\x94\x4d\x17\xec\x51\x05\xa1\xbe\x06\x95\x34\x7a\x3c\x33\x54\x4e\xa3\x81\xfd\x7b\x66\x39\x65\x3a\xd5\x52\xf9\x4e\xeb\xf2\x18\x09\x53\xf8\x0e\x4d\xac\x28\x67\xa6\x39\x23\xd3\xe0\xba\x0d\xa3\xdc\x34\x27\xc3\x56\x8a\x92\x94\x29\x48\x45\x79\xec\x92\x87\x9a\xad\x37\x65\xf7\x87\x19\xdb\x48\x4b\x0e\x28\xd6\xd5\xcf\xb9\xf7\x05\xa0\x1d\xa9\x13\xf8\x01\xa6\xed\x4d\x6f\x29\x88\x07\x56\x60\xa6\xe9\x08\x1f\xef\x82\x15\x5c\xc4\xbd\xee\x8d\xc0\xbb\x52\xba\xf9\xee\x98\x3d\xc2\xa7\x0b\x13\xd1\x65\xba\x3e\xc7\xae\xbf\x72\x12\x64\xc2\xbf\xde\xb1\x4c\xa4\x94\x46\x6b\x97\x1f\x53\x17\x2b\x4b\x53\xae\x7f\x1b\x30\x2d\xf0\x2d\x36\x22\xbc\x1e\x6d\x11\xea\x2b\x80\xde\x64\x33\xca\xe0\x86\x65\x4c\xdf\x6e\x74\x42\x9f\xe9\x0b\x52\x5f\x29\xc4\x6e\xb9\xba\xd9\x06\x2d\x2d\xf5\x64\x38\x41\xe1\x52\xde\xca\xb7\xbb\x7f\x50\x77\x82\x9b\xba\xb0\xc4\x94\xbb\xec\x10\x5e\xb3\x35\x20\xd0\xf8\x7c\xa9\xea\x1b\xc0\xb6\x0f\x02\xf7\x50\xa3\x11\x6d\x28\xdb\x58\x5e\x5b\x75\x85\x3e\x56\xf4\xb6\xaa\x54\xfe\xd6\x2f\xa7\xa9\xdf\x14\xe1\xad\x2a\x95\xbf\x8d\x7c\x51\x65\x78\x64\xec\x8d\x5d\xd9\x86\x66\xd2\xd4\x4c\xcf\xb0\x6c\x5f\xef\xa2\x0d\x43\x2a\x01\xb7\x01\xe4\xca\xb1\x39\xb7\x73\x63\xe0\xd8\x24\xa0\x6b\xc1\x1e\xb5\xba\x1e\x3d\x92\xe7\x24\x4a\x46\x10\x5d\x94\x23\xc9\x4e\x8a\x10\x09\x10\x94\x37\x2e\x0b\x73\x65\xdf\x32\xbb\x27\x2d\xa7\x67\x7e\x4e\xcf\x4c\x55\xdf\xf7\x23\x7a\x54\xc1\x34\x56\x3c\x00\x68\x32\x44\x19\xb7\x84\xfe\x4b\x37\xa0\x6d\x01\xf9\x9f\xbd\x08\xfa\x9c\x83\xd5\xe3\x5a\x1e\x79\xca\xfd\x43\x04\x47\xf2\x8a\x0c\xc5\x86\xc0\x30\x63\x35\x08\xa3\xa4\x16\xa9\x3d\xee\x13\x86\xc4\xfe\xf2\xa0\xeb\xc8\x68\xe4\x9f\x80\x59\xad\xa3\x04\x8f\x87\xb2\x2c\x06\x78\x0e\x28\x4b\xb2\x20\x18\x61\x9e\x71\x05\x65\x46\xa3\x47\x3d\x58\xa2\xbc\xeb\xa6\x79\x10\x88\x1e\x61\x26\xd0\xfd\x5a\xa9\x96\x69\xb9\x89\x97\x6a\xf6\x29\x07\x76\x25\x08\x84\xc3\xcb\x5a\xdd\xcf\x9b\xaa\x8a\x0b\x23\x0c\xf9\x22\xd2\xfb\x67\x26\xd1\xd2\x9e\x05\xeb\x5a\x1f\xc8\x65\x17\x4d\x78\xf9\x95\x47\xb7\x12\xa7\x38\xb1\xc5\x69\x34\x7e\x89\x91\xed\x7a\x33\xaf\xc0\xf1\x1b\x04\xea\xc7\x14\x77\x86\x42\x75\xc8\xd1\x0c\x2b\xe6\xcd\xb6\xe0\x85\x99\x4f\xcc\xfe\xf4\x49\x59\x3c\xf1\xd1\x6c\x0b\x2a\x2b\x6e\xb6\x85\xf5\xbf\xc9\xca\xd4\x23\x7b\x1c\x1b\xaa\x9c\x9e\xa5\x98\xf6\x7c\xe4\x55\x56\x94\x1f\x9a\xa7\xf3\x79\x11\x6c\x05\x83\x6e\x8b\x8c\x82\x1e\x6e\x76\xb4\xd9\x42\x63\x92\x4b\x65\x4d\x2a\x16\x30\x47\xcb\xd0\x6c\x90\x8b\x33\xcb\x54\xda\xb0\x3a\xf7\xd4\x26\x20\xef\x1b\x42\x19\x72\xd5\x40\xe3\x22\xc1\x75\x8f\xa7\x06\x95\x90\x6b\x04\xd6\x61\xfe\x90\x63\x15\x5d\x86\xa5\x06\x90\x46\x88\x95\xaa\xde\xd7\xc7\x35\xa1\x72\xf0\x80\x14\x0d\xa7\x0b\x7a\xb6\x54\xab\x78\x9e\xaf\x58\xd9\x75\x95\xea\x23\xc0\xf0\xb0\x19\xb8\x2b\xe5\x4b\xc5\xa6\x55\x17\xb1\x15\xed\xaf\x7d\xde\x14\x19\x4b\xbb\x97\x97\x2f\xb5\x26\x88\x22\x5d\x84\xb9\x79\x9b\x51\xae\x11\xcc\x12\x76\xf9\x46\x44\x10\x64\x2a\xb3\xf8\x34\xca\x90\x32\x9e\x3c\x8c\x2f\x31\x95\xd2\xc8\xc6\x9c\x7b\xcc\x24\xd0\xf2\x20\xaa\x8f\x90\x09\x6a\xdc\xdd\xb8\x68\x23\xbc\x93\xfc\x1f\x5e\x3d\x08\x0a\xc0\x8e\xa2\x96\x95\x10\x92\x40\x57\x23\x17\x1a\xc3\xdc\xde\x84\xcb\xbe\xc9\x2c\x2a\x2f\x2e\x96\xb4\x92\xb7\x48\xa9\xac\xd2\x43\x8c\x63\x36\x08\xe0\x94\x9e\x50\x52\x61\x86\x02\x39\xba\xb0\x53\x73\xca\x04\x9f\x5e\xb1\x4a\x83\xfb\x95\xec\x8a\xd2\xe5\x54\x04\x41\x2e\xc5\xce\x08\xf9\x0c\xf6\xfc\xa8\xeb\x50\x35\x6f\x68\xa8\x5d\x3e\xd7\xa6\x2c\x77\xdb\x4a\xea\xbb\x89\x6e\x57\x92\x02\x97\x85\xdf\xcc\xa9\xdf\xce\x45\x5c\x58\xed\x08\x4c\x03\x3d\x26\x81\x29\xd4\x63\xf0\x91\x9d\x0b\x58\xd7\xd8\xae\xf8\xd7\xc9\xca\x94\x16\x9c\xb0\x8d\x2a\xb0\x51\x05\x36\xaa\x4a\x19\x91\x6d\x29\x52\x33\xd2\xe5\x18\x83\x02\xdb\x96\xb2\x16\xd3\x8e\x02\xda\x11\x9d\x77\x8b\xa5\xf8\x6a\x05\x89\x11\x45\x22\xd2\x20\x90\xff\xab\x97\xf5\x0e\x1c\xe1\xa4\x87\xbb\xfe\xa8\x33\xf5\xb6\xc3\x95\x47\x86\xa1\xcf\x85\xa1\x37\xa6\xbf\x29\xae\xc9\x8c\xaa\x7d\x22\xd2\xa5\xfa\xeb\xae\x4c\xde\xfe\x17\xfa\xc3\xbb\x6e\x8c\x8a\x21\x1f\x0f\x20\xc4\xe9\xad\xc5\xd8\x4a\x84\x02\x5a\x12\x2b\x76\x63\xe6\x8f\xdb\xba\x28\xbf\x6d\xee\xf6\xd1\x4a\x28\x3f\x11\x65\x50\xf8\xcb\x01\x8a\xe0\xfd\x55\xd1\x07\x24\x89\x90\xc5\xea\x33\x29\x93\x82\xf7\x87\xbd\x0d\x25\xc2\x3a\xce\x50\xfe\xee\xe6\xe4\x9c\x80\x9a\xf0\x84\xaa\xc8\x9e\x53\xd5\x9d\xff\x3c\xb4\x7e\x28\xd5\xf5\x57\x0a\x2d\xa2\xe1\xf3\x70\x34\xf2\x24\xb5\xfe\xe1\xbe\xd0\x85\x3c\x19\xd8\x4c\xc7\x8b\x61\x4c\x58\x3f\xf0\x52\x7c\x95\x9b\x71\x37\x9b\xd1\x8c\x43\xc8\x6b\x16\xaa\xe0\x57\x9c\xb6\xb9\x19\x56\x17\x17\xec\x8a\x2e\x73\xe3\xe5\x53\x0e\xf5\xe6\x10\x82\x77\x59\x79\x9a\x1d\xf5\xd1\x47\x76\x56\x2f\xa1\x55\x16\xed\x8f\xcf\x5a\x40\xde\xf1\x7c\xde\xfc\xea\x0b\xe7\xb4\xfb\x59\x02\xe2\x18\x51\x28\x8a\x90\xea\x1b\x41\xf5\xf6\x2e\xc3\x08\x71\xe6\xac\xfb\xfc\xf1\xb8\x6d\xee\xa2\xff\xb5\x58\xb0\x2a\x3b\x9e\xa2\x17\x8b\x85\xdd\x3c\xf8\x72\xb1\x50\x0b\x6e\x51\x6e\xb3\x87\x1e\xd3\xb6\xe1\x91\x93\xd5\xc5\xae\xba\x21\x0d\x2f\x11\x09\xa4\xda\x01\x69\xee\x08\x78\x87\x81\xde\x59\x3f\x3d\x67\x7d\x2e\x35\xdc\x62\xf0\xfe\x19\xc6\x07\x99\x3d\x01\x05\xef\xd6\xdf\x27\x7d\x0a\x51\x9e\x89\xe1\x29\xc4\xce\x20\x48\x70\xfa\x59\xc0\x7a\xdc\x34\x24\x94\x2e\x15\xb8\x81\xc5\x47\xd3\xd8\xf1\xef\xf6\x9c\x20\xca\x21\x00\xd0\xb1\x46\xda\x01\x88\x57\x5d\x16\x3c\x57\x40\x1d\x65\xc1\x3e\xf3\x8e\xea\x5e\x4e\x4e\x44\xa3\x9e\x28\xc8\x7b\xd6\xcc\xe1\xc7\xbf\xf4\x79\x6e\x9e\xa4\x01\xe2\xb7\x82\xed\x04\x57\xb0\xc9\xd9\xe9\xd4\x7e\x0f\xd9\x9c\x4b\x4f\x67\x92\xe5\x9f\x0d\x2c\xc0\x5b\x9f\xdc\xb9\x67\x16\xce\xe1\xbf\x40\x9a\x66\x6f\x7a\x8a\xb7\x70\xf0\x5e\xbe\x77\xc8\xba\x93\xe5\x2a\xfe\x05\x92\x2f\xfd\x3b\xfe\x79\x21\xff\xd0\x01\x58\x37\xf7\x68\x47\x0c\xfe\x44\x0c\xd6\xe8\x41\x47\x2b\x84\x0a\x77\xdd\x4b\x47\xee\xba\x50\xea\x74\xd0\x86\x18\xc5\xd4\x4b\xeb\x82\xdd\x7b\x07\x9e\x5a\x0a\x69\x1d\xef\x15\x6f\x45\x64\xc0\xdf\x9d\x30\x09\x14\xe9\x3c\xc7\xf8\x70\xaf\x4d\x80\x26\xb8\xb4\x61\x6b\xa5\x1b\xbe\x57\xf0\xd2\x84\xad\x09\x4a\xe3\x22\x0a\x33\x9f\xd9\x40\xb0\x7c\x46\xe4\x28\xc6\x4a\x56\xa6\x12\x05\xf1\x01\x55\x68\x62\x47\xa8\xa0\xe0\x0a\x56\x3d\xd3\x8f\x67\xff\xa6\x90\xf0\x63\x4d\xc5\x0b\xb9\x56\xba\x05\x22\x04\xf6\x7e\xec\xd3\x41\x83\x83\x6d\xea\x8e\xcd\x20\x50\x23\x16\xe9\x14\x01\xce\x44\x03\x04\xaa\x35\x50\x8d\xdb\xa5\xbb\x53\x37\xa0\x7a\x50\x14\x94\x7a\x46\x48\xcd\x08\x81\xfa\xc6\xc6\x5f\x7f\xc3\x4e\x48\x35\xd9\x98\xb1\x52\xef\x1b\x10\xe4\xaa\x70\x72\x5e\x22\x2c\xed\x10\xa7\x24\x87\x11\xba\x15\xfd\x4d\x5f\xe6\x8b\x3f\xd0\xb2\x7b\xbd\x99\xab\xfd\x4b\xa7\x32\x34\xca\x0d\x44\xd8\x70\xf4\x20\xcb\x9d\x7a\xe9\xcb\x8f\x77\xb3\xcb\x15\x1d\xd5\x20\x76\x42\x05\x0c\x9a\x0e\x5c\x42\x91\x6f\xe4\x7a\xc4\x71\xbd\xe1\x6b\x82\xd6\xa5\x02\x2a\xeb\x5b\xa5\x0c\xfe\x87\x0d\x25\x15\xcd\xa9\x6a\x89\x57\x40\x80\xa0\xce\x57\x94\x95\x3a\xc1\x6c\xaf\x36\x89\x11\x89\x07\xa5\x5b\xa7\x81\x45\x3a\xc4\xe6\x02\xfe\xa6\x46\x5d\x98\x75\xf2\x8c\x2c\xf2\x45\xd2\x61\x88\x7a\xda\x17\x49\xb8\x79\xff\x79\x91\xd4\x03\x4f\xfd\xbc\x48\x72\xd2\x33\x12\xac\xfe\xbb\xfa\x3e\xc9\xd2\xae\xcb\xd2\xbe\x68\x1a\xbc\xdf\x7f\x4f\x34\x4d\x9e\x90\x34\x82\xdb\x17\x80\xa5\x13\x80\x01\x6c\xf8\x8d\x48\x3d\x31\xf2\xd7\xc5\x44\x06\x81\x83\x7f\x51\x24\xc8\x8b\x81\x93\xf2\xa0\xe7\x7b\x26\x30\x6e\x7a\x3c\x10\xa5\x27\x40\xc8\x29\x13\x10\x9f\x4b\x1c\x37\x27\x84\x13\xfe\xb0\x3f\x49\xed\x7b\x41\xa3\xbd\xd0\x30\x35\x1a\xd4\x86\x76\x5d\x33\x2c\x04\x00\xad\xb6\xac\xe2\x45\x74\x71\x25\xa7\xbc\x6a\x9d\xe8\x91\x54\x4d\x4b\x22\xb2\x3e\xed\xb6\xdf\x35\x2d\x61\x24\xdf\x66\xc7\x23\x89\xf0\xaf\xbc\x99\xc8\xae\xf3\x56\x5e\x10\xd5\x4e\x30\x87\x5e\x90\x9f\xf8\xac\xcc\x4b\x59\x35\xdb\xf5\xc2\x8b\xe8\xf0\x98\xf0\x74\x8d\xd0\x5a\x0c\x55\xac\x7e\x98\xc8\x48\xdd\x02\x20\xa3\xfd\x9b\xff\xea\x53\x7a\xd6\x87\xea\x29\xc2\x48\x5b\x66\xc5\xbb\xfd\xf6\x81\x30\xb2\xcb\xee\xdf\xc0\x14\x91\xcd\x54\x6e\xb7\x2a\xd1\x47\x1d\xfd\xa4\xc2\x12\x18\x69\x9b\xbb\xf7\x87\x6c\x2f\xcb\x9b\xad\xfa\x75\x73\x2c\xdf\x66\x07\xc2\x48\xd5\x66\xbb\xf2\x1b\x4c\x31\x60\x3a\xc5\xe0\x75\x81\x58\xbb\xae\x85\x23\x17\x79\x3d\x88\x11\x02\xc1\x5b\x2f\xc1\x64\x73\x83\xfe\x0e\xc2\x6d\x16\x97\x6d\xde\x34\xba\x82\xe3\x9f\x10\x27\x38\xe3\x93\xf0\x80\x4e\xdc\x75\x5d\xc5\xbf\xb9\x9c\x40\x30\x38\x68\xd7\x11\xe2\x93\xe7\x65\x45\xf1\x4a\x9e\x1b\x0b\x7d\xf3\x70\xe1\xc1\xcf\xdf\x73\xf6\xd1\xa7\xc5\x8a\x14\x5c\x8a\xde\x4e\x3f\x22\xcc\x3c\x90\xf5\x4f\x42\x65\x38\x2b\x84\xa1\xb1\x54\xf3\x8c\x3e\x0e\xda\x44\x2f\x56\x20\xaf\x6a\xc5\x21\x55\xf2\x4f\x22\xcc\xa5\xa9\x2e\x25\x4b\xee\x6c\xb8\x93\x09\x99\x1d\x44\x58\xd2\x99\x6c\xbe\xc7\x95\x43\xfb\x24\x92\x95\xbc\xdd\x21\xf6\x9e\x90\x59\x05\xd7\x41\x3e\x76\x31\xe3\x78\xb4\x5c\xf3\x83\x08\x0b\xca\xca\x29\xe7\x6b\x15\x08\x37\x68\x5d\xb6\xa6\xe7\xb3\x07\x13\xa0\xd2\x52\xff\x2f\xb7\xaf\xf3\x94\x3f\x69\xe2\xe9\x20\xcb\xdd\xb3\x23\xa5\xf8\xd2\xdf\x42\xc8\xff\xdb\x4e\xc1\xc3\xb1\xae\xf9\xfa\xe2\x8a\x16\xbc\x30\xc8\x3e\xe6\x0c\xfb\x9f\x74\x15\x1a\xe0\xfd\xae\x72\xf6\x1e\xd4\xe7\x2f\x9f\x62\x85\x14\x2e\x58\x17\xcf\x63\xe4\x72\x76\x06\xbf\xf2\x49\x78\xbd\x45\xa3\xfe\x0e\xc4\x48\x57\xe7\xb6\xab\x9d\xb7\xf4\xba\x3a\x37\x5d\x0d\x08\xf9\xf4\xfc\x04\x13\x25\x0e\x3c\x18\x76\x7e\xef\xf2\x9c\x3e\xa2\xba\xa8\x1e\x05\x8b\xf9\x48\x17\x0b\x5e\xa1\x92\x58\xce\xd7\xd9\x11\xdf\x44\xd0\xb8\xf4\xbe\x4b\x6a\xf0\xf6\xcb\x85\xda\xf9\xb6\x28\xd5\x41\x60\xda\x4f\x83\xae\x71\xfb\x01\x41\xf0\xab\xa5\x90\x27\xbf\xff\x6e\x16\xb4\xdf\x7f\x27\x06\xd4\xf8\xe8\x89\xbb\x41\x91\xe9\x68\xd1\x75\x19\xea\xa5\x84\x44\xae\x17\xd9\xaf\x17\x24\x23\x45\xd4\x0d\xf5\x59\xe3\x33\x96\x2f\x96\x82\xcb\x21\x97\xc9\x21\xe7\x8f\xfb\x42\x8d\xfb\xfe\x68\x0f\xd5\x70\x87\xd9\x80\x43\xde\x8c\x6b\x01\xe3\x59\xb3\x8a\x2d\x0d\x8f\x98\x52\x2c\x5b\xc1\x2f\x3f\xb6\x97\x2b\x5f\x4b\xbc\xcd\xb6\x4f\xc9\x13\x8d\x01\xb2\x84\x0c\xad\x27\xa6\x7b\xc1\x7b\xc3\x6e\xcc\x17\xaa\x14\xbb\x72\x39\x00\xab\x81\xd8\x8a\x22\xf6\x07\xa0\x1e\xa2\xb7\xd9\x36\xa4\x34\xca\x98\x26\x11\x2b\x39\x21\x91\xcd\x82\x52\xd3\xa5\x8c\xcb\x99\x3c\xe1\xc7\x6d\x94\x18\xb7\x81\x1b\xa1\xe5\x18\x86\x91\x72\x06\xca\xde\xcc\x66\x84\x9c\x29\x65\x52\xff\xba\xcd\xb6\x4e\x80\xb6\xa2\x1a\xe9\x17\x8f\xe3\x07\xa6\x10\xd0\xab\xd4\x48\xe1\x82\xdd\xda\x51\x58\x32\x02\xa6\x17\xe4\x58\x41\x5d\x68\x89\x95\x5a\xb2\x5a\xfc\x14\xf7\x65\xca\x91\x37\x29\x3f\xfb\x1a\xab\xe1\x6b\x84\x39\x17\x30\x6e\xed\x4b\xd0\x38\x8f\xa4\xb9\xa6\xbc\x2b\xa3\xa9\x1a\x5a\x3c\xb6\x40\x33\xad\x98\xdb\x72\xd9\x6e\xb9\x4e\x94\x71\x86\x93\xc9\x87\x84\x7d\xbb\xbf\xa6\xe6\xaa\x97\x71\x31\x87\xa7\x10\x10\x7d\x10\xa1\xc2\x97\xca\x28\x3d\x9f\x15\xb1\xd5\x13\xb5\xaa\x61\xab\xa9\x58\x8f\x20\x78\x7c\x55\x70\xc5\x95\x77\xea\xc2\xd0\x8f\x43\xb4\xf8\x9a\xaf\xc0\x93\x10\x01\xc1\xc7\x2a\xae\x66\x57\x91\x0d\xf0\x84\xf4\x8e\xea\xab\x45\x5c\x47\xab\xb8\x82\x10\xd5\x1a\x36\x6a\xeb\x0a\x4d\xdd\x94\x85\xd6\x13\xd5\x75\x05\xb0\x80\x06\xc1\x34\x37\x94\x1c\x41\x10\x4e\x73\x57\xf3\xd4\x27\xba\x6e\xfa\x4d\xe8\x9e\x61\x44\xb3\xca\x12\xaa\x91\xc9\xda\x30\x57\xd3\x81\xad\xcc\xf0\x58\x2a\x0a\x0c\x61\x80\xfa\xd6\x83\x5c\x2b\x37\x12\xca\x6b\x18\x39\x2f\xae\x4b\x9d\xc2\xe2\x86\xb3\x5a\x9e\xfa\x82\x97\xd2\x86\x0d\x0b\xab\xde\x5b\xb4\x19\x3b\x0e\x55\xad\x48\x0b\x4d\x59\x05\x62\x08\x36\xa7\x80\x6e\x48\x41\x21\x00\x48\xb1\xd7\x19\xfc\xe2\x8a\xb2\xea\x7c\xf6\xb4\x6e\xe5\x96\xb3\x7e\xc0\x9e\x36\xec\x4d\xc3\x74\xe8\x44\x80\x06\x1b\x64\xe8\x18\xd5\x56\x23\x78\x3a\xdf\x11\x66\xba\x69\x41\x80\x9e\xcf\xd6\xf3\x08\x46\x8e\xff\x44\xc0\x1a\x78\x52\x98\x0c\x60\x5f\xd5\xc0\x8e\x49\xb3\x27\x91\x76\x2c\x52\x25\x91\x8f\xca\x82\x57\xf4\x14\xf0\xa7\xd3\x4c\x12\xc0\x3d\xf1\xec\x72\x69\xe6\x96\x02\x9b\x63\x43\x66\x09\x39\xf0\x5d\x92\x47\x15\x49\x0c\x14\x64\x3c\x29\xbb\xae\x48\xd9\x81\x6f\x51\xc6\x0a\xa6\x90\x62\x63\xe4\x51\x8a\x04\xfb\xe4\x9c\x33\x70\xc8\x70\x81\xa5\x07\xb2\xfc\x61\x51\x02\xf4\x49\x6b\x5e\xf3\x92\xcb\xca\x99\x34\xce\xcb\x5e\xea\xae\x7b\x3c\x3d\x2a\x6b\xf4\x30\x1b\xd0\xfb\xc9\x81\x72\xb0\xaa\xd9\x1c\x94\xb2\x20\x08\x3f\xf1\x83\xf3\x4c\x76\xe0\x9f\xe6\x18\x97\x40\xd9\x27\xc5\x60\x46\xd9\x35\x77\x6e\x8d\x50\xd5\x96\x2d\x3d\x3b\x30\xc1\x85\x4b\x45\x22\x3c\xfa\x81\x03\x1b\x72\x60\x06\x01\x10\x02\xd5\xc7\x0f\xf8\x6a\xbc\x8a\x5f\x44\x5f\x30\xa7\x0d\xf8\x27\x4b\x87\xc7\x5c\xee\x24\xee\x5c\x14\x8f\x92\xa0\x7d\xfa\x53\x12\x34\x74\x07\x19\xfe\x23\x14\xd9\x4c\x28\x92\x07\xc0\x92\x55\x64\x11\x90\x51\xaa\x65\x70\x22\xd2\xc8\x9d\xca\x39\x03\xc7\xc6\x7e\x40\x9a\x75\x40\x08\xac\xaa\xeb\xa6\x7b\xdd\xfa\x5d\x67\x7e\xaa\xad\xaf\x92\xe5\x8a\xd7\x0a\x3d\x90\x55\x10\x4c\xf7\x73\x4d\xd3\xa2\x62\x2e\x7e\xad\xf7\x45\x73\x07\x81\xd4\x10\x18\xc5\xf7\x1e\x51\x5c\xd7\x1d\x98\xee\xf0\xcd\xec\x20\x97\xb9\x35\x5f\x3b\x02\x8e\x2e\xd7\xcb\x5e\x49\x83\x92\x0c\xf0\x76\xd6\xcb\x9a\x73\x1e\x96\x3e\xf6\x49\xd7\x01\xd0\x27\x5e\x57\xbb\x38\x49\x5d\x57\xab\xaa\xf0\xc5\xba\x2e\xa3\x67\x6b\x06\x84\x6b\xde\xa0\x1d\xf0\x39\xce\x2d\x9c\x0b\x7c\xf5\xf5\x55\xbc\x89\xf6\x86\xe9\x4e\x7e\xcb\x4e\x33\x95\xad\x9f\xa0\x29\xd3\xa4\x7e\x6b\xcd\x9d\x46\x28\xdb\x05\xc1\x4e\xb5\xe9\x9a\xe5\x94\xed\xf8\x75\x10\xac\x93\xeb\xd4\x39\x13\x04\xbf\x84\x6b\xea\xb2\x5e\x79\xb7\x98\x52\xdc\x6e\x1e\xf2\x60\x59\x97\x10\xbe\xfc\x41\xf6\xae\x18\x21\xa6\x08\xa9\xec\x69\xbd\x01\x15\x04\xf6\xb7\x7a\x5e\x33\x3f\xc0\xd6\x5a\xae\xc9\xe7\xa6\xbf\x84\x25\xed\xba\x6b\x74\xab\x19\xed\xae\x4c\x0e\xd0\x8c\xde\x28\x00\x12\xc3\x52\x7e\x5a\x0d\x84\xfd\xd7\x29\x8c\x4e\xcb\xa3\x68\xe6\x3a\x3f\x30\x59\x43\x38\x76\x4a\x0d\x78\x53\x45\x4d\x3d\x7a\xae\xa3\xe2\x90\x78\x22\x9e\xc2\x08\x49\x67\x96\xb3\x9c\xa1\x77\xbd\x47\xf9\xb1\x38\xd3\x65\xef\xf9\x61\x81\xd8\x6d\x82\x0e\x90\x36\x07\xc2\xb6\xcf\x37\xf3\x24\x0e\xbb\xae\x5b\xbe\xe8\x49\x63\x1c\xaa\xc2\xef\x15\x6b\xe7\x53\xa1\x69\x52\xeb\x76\x52\xb9\x27\x63\x75\xe6\x80\xf0\x69\xd7\x4e\x22\x57\x8c\x09\x2c\x1f\x13\xb5\xa2\x4c\xf4\x62\x32\x69\xcb\x63\xfd\x47\x39\xc1\x9c\xab\x09\xb0\x08\x4d\x0a\xb1\xc5\x1f\xc0\x8e\x50\x34\x77\x7b\xfc\x75\x73\xc0\xbf\xd2\x08\x9b\x18\x42\x85\x89\xe6\x50\x98\x58\xbe\x85\x89\xe5\x58\x98\x20\xf3\xc6\x04\x57\xf8\xc9\xf1\x46\xec\xea\xd3\xe4\xba\x7c\x80\x7a\xaf\xcb\x87\x43\x5b\x1e\x8f\xf2\xc7\xcd\x61\xe2\xd0\x27\x13\x27\x11\x78\x6c\xc3\xda\x77\xc0\xdb\x1d\x82\x81\xc7\x7a\x81\xf6\x2e\x2c\x87\x0a\x88\x2f\xd7\xac\x36\xaa\xd5\x46\xba\x77\x2d\x3f\xed\x33\x9d\x6b\xbf\x55\xaa\x09\xf6\x73\x43\x01\x62\x06\xbc\xa2\xaa\xb1\x39\x69\xf6\x9a\x68\xaa\xde\x4f\x32\x7b\x06\x93\x5d\xf3\x75\xf8\x88\x1c\x57\x86\x8f\x0a\xe9\xa8\x5c\xf2\xa8\xb1\x01\xe1\x6f\x6d\x2b\xb1\xae\xc6\x73\x28\x98\x21\x02\xf2\xb9\x18\xe9\x79\x39\x20\x4e\x44\x7d\xe9\xe6\xd0\x4f\x83\x55\xe0\x8e\x3d\x81\x8b\xe6\x8a\x4d\x1a\x28\x98\xa0\x4b\xb9\xe0\x0f\x59\x5a\x33\x1c\x8d\xcc\xbd\x96\x85\x65\xd7\x2d\xe8\xec\x0a\x00\x66\x91\xee\xf2\xbf\xff\xe0\x8b\xab\x65\x19\x7b\xd5\x97\x34\x0a\x8b\x51\xa6\x28\xfb\x36\x2a\x23\x41\x56\x00\x96\x0a\xa8\x5d\x27\xc1\xb3\xf9\xb6\xc9\x31\x46\xfa\xc6\x04\x29\xb0\x5b\x69\x21\xc7\x52\xe5\x02\x17\xfb\x6f\x6f\xdf\x0c\x11\xfb\xc0\xf7\x25\xba\x6e\x10\x8e\xa5\xb3\xfd\x41\x13\x04\x24\xca\x9c\x83\x38\xca\xe6\xdf\xbe\x7b\xfb\x93\xac\xb0\xa5\x58\xf1\x77\x6d\xb3\x7b\x0f\xb7\x83\x36\x56\xde\x9f\x2e\xef\x77\x5b\x42\x15\xcc\x64\x41\x1f\x35\xcf\xf5\xd9\x62\x00\x4e\x01\x3b\x4c\x6d\x6d\x1f\xbf\x79\xf8\x90\xad\xa4\xe5\x17\x12\xa8\xb2\x2d\xdb\xb6\x69\x9d\xbc\xa8\x76\x0e\x25\x21\xf9\x61\x7f\x9b\x6d\xeb\x62\xf2\xdb\xdb\x37\xd1\x84\xcc\x80\xed\x03\x9a\xe1\x4e\x7e\x6d\xf2\x31\x7d\x76\xc9\xee\xc1\x35\x10\x7f\xdc\x5f\xae\xd8\x83\x52\x4a\x71\x06\xab\x0d\xa7\xae\xde\x65\xab\xb2\x6b\xcb\x63\x79\xea\xaa\x7a\x5b\xc2\x0e\xd4\x1f\x9f\xdd\xaa\xba\x2e\x1f\x56\xe5\x9e\x5e\xd6\xd6\x3d\xfd\x52\xf4\x22\xfc\x46\xd3\xe9\xd5\x64\x11\x0e\xf8\x25\x2b\xe9\x63\xde\x75\x77\x7a\x57\x83\xc6\x45\x98\xc9\x11\x20\x6b\x9c\x91\x84\xcc\x86\xa4\x1c\x66\x57\xa6\x8c\x45\x44\xa4\xb2\x95\x12\x56\x6a\x1c\x7a\x4d\x19\x9e\x77\x9d\xbe\x73\xca\x79\x0b\x2b\xa9\x7c\x89\x02\x23\x82\xfd\xe8\x35\x41\xcd\xf3\x4a\xa8\x4e\x24\x65\x8a\x35\xc2\x98\xc9\x76\x7c\x7c\xf3\x14\x60\x2b\xc7\xe3\x96\x7c\xea\x40\x11\xd2\x48\x2c\x8b\x44\x47\x7d\xa5\xbc\xdc\xe7\x4d\x51\xfe\xf2\xf3\x0f\xaf\x9a\xdd\xa1\xd9\x23\x93\xde\x8c\x70\x32\x1b\x39\xe3\x9b\xe6\xc3\xd6\x05\x0c\xae\xf9\xe6\xd3\x4d\xd9\x3e\xa8\x75\xfc\xa7\x6d\x56\xef\x4d\x7c\xa5\x6e\x7c\x0f\xd3\x03\x23\xcc\x40\xc7\x65\xd6\x63\x61\x5a\xd1\x49\xae\x79\x29\xc2\x9c\x41\x12\x8d\x70\x40\x9e\x0a\xa5\xfd\x06\x84\xf6\x42\x4d\x8f\x65\x5b\x67\xdb\xfa\x8f\x31\x3c\x3f\xd5\xa2\xa1\x72\xc8\xa9\x0b\xf1\x3b\x28\xe4\x49\xbb\x45\x23\x15\x9c\x46\x30\x72\x31\x98\x45\xc5\x2a\xa0\xf7\xae\x54\x53\xca\xba\x1f\xb2\xd8\x55\xa9\x95\xb7\xf5\x4c\x75\xcc\xeb\xa0\x3a\xe3\x28\xf2\x12\xf9\x65\x73\xc9\x36\x56\xce\xac\xfa\x18\x92\x48\x1b\xfd\x84\x06\xc1\x1f\x6a\x30\x7b\xfe\x24\xa9\x5d\x3d\x08\x8b\x89\x8b\x67\x73\x0d\xff\x3e\x35\x9c\x14\x94\x9e\xa9\xff\x71\xee\xa8\x72\x1d\x68\x3e\x91\x13\x06\x4c\xf4\x7c\x65\x39\x8d\xd1\x4f\x96\x8f\xf8\xc9\x1e\xe5\x87\x44\x68\xe2\x28\x12\x48\x8b\x85\x7f\x2f\x18\xf9\xd8\x7e\xdc\x13\xb9\x16\x46\x23\x97\xe6\xe3\x97\x22\xdc\xaa\x96\xc8\xdf\x08\x7e\xf9\xff\xbf\x58\x5c\xae\xd8\x2b\xc1\x2f\xff\xbf\xf9\xf3\x67\x97\xec\x5b\xc1\x2f\xc3\x24\x0e\x52\xfa\x3b\x4f\xfe\x33\x48\x9f\x5f\xb2\xd7\x20\x6f\xe6\xcf\x63\x1a\x25\x93\x8f\xa7\xf4\x79\x98\xfc\xa7\xac\x31\x7d\x4e\x9f\x5d\xae\x76\xec\x3b\xbd\x23\x2e\x9a\x9b\x53\x97\x1d\x0e\xf2\xdf\xc5\xf1\xd4\xb4\x52\x78\xcd\x67\x17\x30\xec\x8e\x75\xb3\x07\x19\x26\xc5\x59\x77\x57\x17\x40\x7f\xf7\xec\x92\xfd\x4d\xdd\xfe\xb7\xd7\x1f\xba\xef\x5f\xbf\xfc\x96\x3e\xbb\x64\xdf\xcb\xb2\x8f\x97\x1f\x2f\x2f\xd9\x0f\x82\x3f\x9e\xd9\xdf\xe1\xff\x7f\x08\x4e\x9e\x5f\x12\x9d\x22\x4c\x9e\x13\xca\xde\x8c\x44\x42\x65\x84\x2e\xdf\x08\xd8\x76\xe5\x27\xfc\x6b\xa5\xe1\x5b\x77\xd7\xcd\x8f\x02\x1b\xae\x2e\x26\xd8\x57\x3e\x6b\xa9\xf3\x96\x17\xac\xea\x47\x21\xf8\x9e\xf6\xfe\x46\x50\x4e\xf5\x76\x08\xaf\x92\x52\x5a\x45\x64\x46\x38\xe7\x45\xb2\x48\xe3\xb0\xe0\x85\xc1\x49\xeb\x3a\xf2\x9c\x30\xcc\x6e\xcb\x20\x81\x35\x49\xa9\xc9\x0e\xc8\x29\x8d\xfa\xe7\xc0\x34\xcb\xdd\x64\xbc\x1f\xfb\xf2\x1e\xf1\x60\x32\xce\xf9\xdf\x85\x6d\x88\x55\xb8\xc6\xf3\xb5\x81\x77\x49\xd6\x29\x46\xb8\xa2\x34\x4a\xd6\x98\xef\xe0\x0c\x76\x75\xcb\x86\xaf\x55\x24\xf8\x53\x71\xd2\x9b\xae\xab\xba\xae\x4c\x36\x69\x5c\xc5\xd3\xb0\xe6\x1b\xaa\x02\x89\xa2\x10\x29\x8d\xa5\xa5\x67\x13\x1f\x36\x94\xad\xe4\x7f\xd3\x2b\x7a\xa6\xac\xd6\x4b\xf0\xca\xbd\x38\x59\xa4\xb4\xeb\xa6\x25\x64\x77\x04\xc1\x0a\x46\x80\xfd\xee\x77\xfd\x24\x44\xde\xce\xb3\x4d\x76\xff\xbe\x3c\x9d\xea\xfd\xea\x38\xaf\xb6\xd9\x49\x65\x73\x19\x1a\xeb\x1c\x57\x18\xeb\x33\x4e\xf2\x34\x08\xc2\xb0\x4c\xf2\x34\xce\xa2\xa2\xeb\xc2\x82\x3f\x9e\x29\x4d\xf2\x14\x4e\x5a\xf9\xea\xd0\x35\x4e\x17\x48\x9f\xe2\x00\x36\xfe\x34\x9e\x6f\xce\xb3\xb9\xda\x79\x3e\xb2\x9a\x67\xf6\xe3\x94\xe1\x4c\x9e\x03\x80\xac\xfc\xd4\xda\xf8\x5e\x4c\xba\x73\x01\x48\xa2\xd9\x7c\x57\xef\x94\xd5\x0f\x9e\xe5\x9f\xcb\xe3\xa1\xd9\x1f\xcb\xef\xcb\xac\x28\xdb\x90\x28\xd8\xf3\x8b\x0f\x48\x7f\x24\xc7\x63\x41\xcd\x7a\xba\x06\x0e\x7b\x08\x08\x97\xff\xa3\x68\x2b\x28\x7d\xac\x4d\x6f\x94\x74\x29\xda\x32\xbb\x86\x8c\xe9\x64\x91\xd6\xfb\x49\x4e\x2b\x78\x2d\x58\x7d\x2c\xf1\x56\x8e\x2e\x8b\x1a\x79\x9a\xe4\xb7\xdd\x96\x2d\x24\x61\x95\x33\x32\x21\x33\x79\x22\xa5\x8f\x15\x2f\x55\x8d\x2b\xc8\x84\x2f\xe9\x19\xf2\xbf\x57\xf2\x09\x26\xa8\xa4\x9a\xe2\xa7\x07\x81\x7d\x95\x8a\xb2\x3c\xa9\x52\xdb\xb0\xff\xec\x0f\x6f\x9b\xc8\x2f\x07\xfa\xb5\xdb\xa8\x6a\x5e\x41\x0b\x5c\x27\x57\x29\x32\x73\xc0\xaa\xe9\xbc\x2a\xdd\x24\xab\xfe\x1e\xbf\xf7\x29\xab\x74\x59\xf1\x6b\xdd\x1d\x7a\xa7\x13\xa0\x3b\xa5\xb1\x0c\x6d\xff\x5d\x5d\x6e\x8b\x63\x52\x21\x9d\xc4\x48\x79\xca\x05\x05\x86\x0d\x60\x64\x94\xaf\xf8\x1d\xac\x6c\x41\x10\x0a\xee\x16\x80\x75\xa1\x3f\x01\xb2\x75\x2b\xe6\x3c\x5e\x3e\x16\x47\x49\x25\xbb\xc4\xe8\x54\x04\xb8\xf5\xeb\x20\xa8\x21\x4e\x47\x76\xcb\x8a\x6f\x92\x1a\xba\xa1\x4a\xbb\x6e\x93\x90\xe7\xf0\x93\x4d\x57\xd4\x21\x88\x02\xb7\x62\xe9\x5a\x84\xeb\xe4\x2a\x55\x70\x77\xb6\x8a\xb5\xec\x49\x53\x0b\x1c\x51\xfa\xb8\x02\x98\xb5\x78\x05\xe4\x52\x91\xfc\x0f\xb2\x6b\x00\x1c\x52\x5e\xc3\xae\x4d\x4f\xca\x5a\xa9\x33\xb0\x56\x48\x98\x2d\x7f\x05\x41\x96\x90\xd3\xba\x6d\xee\x8e\x24\xa5\x82\xaf\x42\xad\x05\x4a\x95\x1e\x8f\x95\x9e\xbe\x35\x2b\xe4\xf1\x94\x9d\xca\xc8\xd3\xc4\x19\xfc\x89\x56\xf1\x36\x22\x3f\x36\x13\xec\xc2\x23\xa0\x69\xb4\xcd\x4e\x0e\xc7\x19\x99\x9c\x1a\xd9\x0a\x67\xbd\x7f\xac\xeb\x39\xde\x80\x95\x43\x98\x6c\xfa\x48\x9c\x1d\xbc\xc9\x2c\x3f\xd5\xb7\x65\xb4\x60\xdb\xec\x78\x7a\xdb\x14\x75\x55\x97\x05\x64\x95\x9e\x32\xc8\x2e\x75\xc5\x4c\xf4\x78\xd3\x6e\x23\xb5\xee\x30\xf0\x85\x90\xbf\xbd\xfe\x40\x58\x7d\x7c\xd3\xe4\xd9\x36\xfa\x4e\xab\x20\x02\x11\x4c\xf2\x66\x4b\x19\x72\x0b\x01\xe1\x64\xdb\xc8\xf7\x00\xbe\x15\x29\x57\x8e\x0f\xfb\x5c\xb1\x44\xcb\x49\x8d\xcc\xc7\xd9\xe1\xb0\xad\xd1\x96\xba\xbc\xbf\xb8\xbb\xbb\xbb\xa8\x9a\x76\x77\x71\xd3\x6e\x51\x3f\x2d\x96\x93\x7c\x2d\x1b\xe6\xc4\x7f\xf9\xf0\xdd\xc5\xbf\x13\x26\x6d\xb8\xc3\x49\x65\xe7\xfd\x43\x20\xfb\x08\x9a\x41\x07\xa9\x8c\x12\x64\x2b\xc0\x12\xf9\x93\xb0\x7b\x79\xec\x3d\x69\xb7\x65\x13\x63\x39\xb1\xcd\x11\xd0\x7a\x9d\x0b\x64\x89\xba\x62\x93\xdd\x66\x8a\x45\xe6\xac\xdf\xfd\x18\x3d\xca\x3a\x2f\x3f\x8a\xfb\xdd\xf6\xa3\xb8\xc4\x47\x5e\x7e\x14\xf2\xef\x25\xd6\x77\xf9\x51\xc8\xbf\x1f\xc5\xe5\x99\xf9\x73\x08\x6f\x26\xba\xf0\xb7\xb7\x6f\x88\xfa\x0a\x5d\xf4\xa1\xbc\x3f\xe9\xd7\xd2\x65\x7f\x7f\xff\xee\x47\x7c\x03\x35\x9b\x65\x0b\xc0\x2b\x92\x08\xcd\x41\x34\x06\x27\xf0\xcd\xc0\x33\x0a\x87\xb2\x16\x12\xc9\xbb\xd1\x7c\x54\xc5\xf2\xc3\x23\x6b\xaa\x9e\x99\xb3\xa8\x60\xcf\xeb\xae\xba\x3f\x45\xd3\xc5\xd9\x8c\x8d\x9b\x27\xc2\x02\x45\xfc\x4e\x84\xb0\x74\xf9\xab\x15\x65\x82\x46\xef\x44\xe8\x97\x02\x71\x8c\x2c\xb0\xac\x49\x6f\x45\xf8\x83\xa0\x50\xf8\xa1\xcd\xf6\xc7\x43\xd3\x9e\x64\xe1\xdf\x55\x61\x2f\xf3\x78\xcc\x07\x3f\xe0\x3d\xcc\x61\x7d\xec\x49\x57\x76\xcd\xb6\x6a\x7b\xc3\xbc\xd4\xcd\x21\x7c\x84\x14\xea\x03\x6f\xe6\xea\xb3\xbb\xae\x61\x9f\xec\x21\x6c\x35\x58\x70\xa4\x83\x32\x84\x68\xdc\x86\x07\x1a\xe9\xfd\x95\xa3\x97\x18\xcf\x4e\xbc\x9d\xbf\xca\xb6\x5b\x91\xe5\xd7\xc7\x90\x34\xfb\xbc\x9c\xec\xca\x5d\xd3\x3e\x10\xca\x6e\x78\x33\x97\x93\xf6\xe6\xf8\x0a\xd8\xfa\x1f\xcf\xec\x56\x8a\xfe\x3b\xf9\xdf\x3d\x27\x48\x4e\x5b\x16\x84\x3d\xf0\xc7\xb6\xcc\x8a\x87\xf7\x30\xc5\x81\x37\xde\x5f\x2b\x47\x40\xa9\xe4\x52\x81\x8b\xda\x9a\x3e\xae\xf9\xe3\xd9\x04\x4e\xbc\x16\x98\x95\xba\xa2\x74\x9d\x88\x21\x3f\x06\x17\xc9\x8b\xf4\x2c\xf8\x3a\xc9\x7a\x67\xce\x9e\x35\x20\xd0\x1a\x10\x67\xf9\x3e\x2f\xb7\x5b\xff\x95\x8e\x23\x46\xd5\xb5\x8a\x5c\x85\x9d\xc6\x9f\x11\x67\x68\xf0\x01\xce\xa0\xc2\xe7\x5c\x43\xba\xd4\xdd\xe0\x6d\x46\x8a\xba\x2e\x63\xb7\x49\x06\x6b\x14\xc6\xd3\x34\xb7\x65\xdb\xd6\x45\xf9\x56\xa9\x1a\x63\xd1\xa8\xf6\x31\x8d\x51\x49\x78\xa6\x6b\xb0\x5d\x34\xde\xca\x80\x0a\x71\x4d\x1f\x74\x96\x72\x96\x3c\xa8\x6e\x75\x13\xd8\x04\xda\xb8\x37\x89\x48\x79\x72\x03\xf9\x2b\x89\x48\x53\x9f\xce\x25\x13\x72\xd0\x8f\x04\x29\x76\xdd\xbd\x43\xe5\x5a\xce\xe1\xc2\x50\x50\xf6\x32\x5c\xe8\x50\x94\x33\x98\xec\x47\x03\x35\xf0\x40\x59\x33\xbf\x69\xb7\x3c\x0c\x45\xd7\xc1\xcf\xae\x53\xf2\x9c\xce\x08\xa1\xc6\xb8\xfa\x5e\x30\x47\x88\xcf\xc8\xe5\x25\x91\xf7\xc2\xbe\x40\x3e\xdf\x95\xa7\x75\x53\x74\x5d\xae\x08\xe5\x1a\x53\x82\x97\xb0\xc6\x2a\x2a\x3c\xb4\x07\x60\x03\xd0\xa7\xed\x0b\x42\x52\x15\x9b\xd1\xcc\xf3\xb6\x39\x1e\xbf\x6d\x76\x59\xbd\xa7\x8f\x9b\x71\x53\x48\x2e\xa1\x1b\xb4\x86\xe0\x63\x98\x3a\xc0\x3f\xcc\xab\x84\xbf\xe9\x7d\xcf\x4c\x1a\x52\xcd\xf1\x34\xc5\xb4\x7c\xe7\xc4\x06\xca\xd5\xaa\xfc\x07\x7d\xf4\xeb\x91\xa2\xaf\xae\xd4\x57\xc1\x16\x92\x5d\xd6\x6c\xa0\x95\x31\x17\xf4\x75\xea\x06\xae\xdd\x10\x78\x28\xdb\xb4\xcd\x0a\x80\x87\xcf\xb6\x94\xb2\x1f\xa5\xcc\x63\x0d\xcb\xd9\x03\x65\xd7\x5a\x7d\x7c\x58\x6e\xf5\x0e\x9c\x7c\x22\x2e\xa9\x6c\x1b\x04\x0b\x40\xae\xc1\x55\x7c\x36\x03\xbd\xdd\x73\xec\x13\x90\x66\xa7\xac\x3d\xd9\xfe\xc3\x3f\x3e\xa0\x35\x6b\x20\x66\x4a\x91\x0a\x4d\xff\xa6\x16\x72\xbc\x94\x32\xd5\xbe\x66\x78\xbc\x82\xc8\x0d\xef\xa6\xf8\x89\x06\x01\x4c\xdf\x66\xee\xac\xf1\x10\xcf\x64\xf7\x59\xff\x74\xc1\x07\x2c\x1e\xd5\x7a\xf8\xc7\xbc\xc7\x37\x82\x91\x19\x91\xb6\xe3\x5e\xbd\x21\xaa\xc5\x3a\x29\x91\x32\xd3\xfc\xd5\x8c\x87\xb7\xc2\xa0\x83\x93\x80\x44\x24\x26\x74\xa6\xfa\x41\x45\x9a\xe3\x11\xa0\x1c\x67\xf9\xba\xd4\x34\xb9\x15\xaf\x2c\x9f\xa1\x60\xe4\xd9\x15\xa1\x6c\x3f\x5e\x21\xf9\x9d\x93\xd9\x8d\x98\xcd\x26\xb3\xbd\x9e\x6f\x15\xfe\xac\x2b\xad\x62\x01\x2c\x83\xab\x73\x81\x7a\xfd\x30\xef\x0b\xc1\x90\xfc\x50\x5d\xe8\x6b\x2e\xde\xd7\xfb\xbc\x24\x6c\x70\x27\xec\xd9\x9c\xb2\xd5\xe7\x2a\xf9\xb1\xd9\x97\x17\x6f\xe5\x90\x26\xf6\x6a\x4a\x99\x33\x90\x6d\x67\xca\x23\xa7\xc7\xd4\x2e\x5e\xee\x96\xd1\xf1\x27\x79\x06\x1a\xf3\x6a\xa1\x6c\xec\x86\x97\xa0\xbd\x11\x57\x64\x80\x9d\xd4\xcc\x95\x5e\x97\xf8\x67\xd2\xf8\xc9\x33\x33\x65\x29\xf8\xc5\x31\x61\x13\x32\xfb\x87\x98\x91\xe5\xe4\x13\x5f\xcc\x17\x57\x24\x22\x84\x46\xb6\x1a\x80\x54\x00\x9b\x79\x27\x45\x72\x33\x5f\xe3\x72\x45\x47\xde\x77\xc7\xcc\xe9\x64\x87\xbc\x86\xcd\x1c\x99\x8a\xde\x97\xfb\x02\xe1\xe6\xcd\x21\x86\x41\x1c\xd8\x03\x6b\x28\xc7\x46\xbc\x36\xd1\x23\x0f\x4a\x66\x43\x25\xf7\x9c\xc0\x11\x61\xc8\x58\xdb\x58\xf4\x0b\xf6\x80\x08\x19\xcd\x5c\x29\xf2\xb2\x04\x10\x31\x1a\x74\xca\x53\x56\xf2\x1f\xa5\x5a\xa4\xe4\x06\xac\xf1\x0f\x73\xab\x1f\xf0\x2b\x29\x2b\x3e\xf5\xa4\x02\x50\x2e\x25\x0f\xac\x49\x3d\x49\xd3\xcc\x41\x31\x97\x3d\x70\xc2\x24\xbe\xaf\x17\xb0\x27\xfb\x14\x54\x9f\xfe\x0e\xa2\x2e\x27\xf4\xcc\xcc\xbd\x14\xa5\xf4\x35\x9f\x5e\xb1\x72\x7e\x94\x46\xc7\x2d\x7b\x49\xad\x70\x85\x95\x12\x0c\xa4\xc9\x1f\xcb\x97\xe1\xc5\x15\xfb\x83\x9e\x31\x2a\x13\x8e\xa4\xb5\x63\xb4\x3f\xe2\xc4\xa6\xbf\x44\x3f\x8d\x71\xdc\x80\x02\x77\xcb\xee\xd8\x3d\xcf\x97\xd7\x5d\x17\x5e\xf3\x29\x6c\x00\xf7\x32\x12\x6b\xd9\x5c\x6a\x7b\x78\xc5\xd7\x52\x1a\x31\xaf\xb1\xc4\xd7\x8b\xf8\xcb\x68\xc1\x36\x5c\x7c\xcd\x5f\x2c\x16\x41\x20\xbe\xfa\x62\xb1\xe8\xba\x2f\x16\x5f\x72\xce\x05\x93\xbd\x7c\xcb\x7f\x12\x61\xc3\x1e\x00\x26\xe5\x96\xff\x53\x1e\xdc\xb2\x07\x80\x3a\x89\xc3\xde\x54\xbf\xe3\x0f\x63\xce\x8c\x37\xd9\xf1\x64\x26\x37\xa1\xec\x6e\x4c\x2a\xf0\x3b\xca\x9e\xb8\x5f\x4e\x62\x73\x9b\x9a\xd1\xfc\x8e\x52\xf6\x02\x5f\xb4\xeb\xc8\xf7\xaf\x5f\x7e\x2b\x0d\x6a\x14\xe4\xf1\x3d\x27\xfb\x46\x53\x10\x44\xea\x7b\xb0\xf4\xb4\xd3\x2f\x12\x85\xf7\xfc\x16\xf4\x95\x92\xed\xf8\x2d\xca\xc7\x3d\xbf\xc5\xc1\xc6\x36\x7c\xba\x47\x89\x7b\xcf\xa6\x22\x08\xee\xbb\x4e\x8e\x5e\x65\xa6\x0a\x08\x4f\x17\x7c\x41\x29\xcc\x77\xd0\x7a\xb8\x30\x3f\x81\x1e\x28\xcc\xbb\xee\x5e\x2a\x1c\x6c\x13\x1f\x3d\x2c\x9d\x03\x4b\x76\xec\x9e\x3d\xa4\x34\x3a\xba\x60\x3a\x07\x39\x50\xef\xd9\x3e\xb5\x95\x4a\xf5\x2b\xbc\x91\x3a\xb3\xea\x4c\x6f\x88\x6f\x62\x1c\xe4\xca\xf4\x8d\xe0\xe8\x35\xbe\xa3\x1c\xf3\x6c\x13\xef\x22\x59\xdd\x09\xa0\xfe\x9c\x87\xa4\x54\xd6\x14\xf6\x66\xcb\x2b\x35\x1b\xcd\x8c\xb9\xb8\xd0\xeb\x2e\x6c\x8e\x8d\xad\xba\x0d\x44\xdc\x69\x0d\xf9\x01\x94\x62\x69\x76\x3d\x95\xa5\xd6\xea\x54\x1f\x96\x33\x02\x56\x1a\x85\x7b\xde\x83\xb1\x39\xae\x0f\xeb\x7b\x74\x80\x8f\x25\x38\xf5\xc2\xe0\x56\xe5\x89\x30\x72\x68\x8e\xa7\x21\x0a\x7c\x7f\x4f\xdc\xcb\x70\xef\x79\x7b\x21\x06\x16\x82\xb4\x0a\x00\x3b\xd7\x86\x15\x9a\x4d\x16\x74\x07\xec\xc5\x8c\xa9\x80\x30\x2d\x8e\xa3\x12\x5d\x10\x39\x53\x92\x2c\x02\xac\x90\xfe\xa6\x51\x10\x40\x70\xa6\xac\x55\x93\x0c\x8f\x85\xc8\xa9\x67\xba\x8f\x42\x77\x84\x79\x9c\x6e\x0b\x06\x8b\xb9\xe3\x73\xb8\x32\x5e\x89\x2b\xa6\xbd\x33\x10\xc9\xd1\xdb\x4f\xba\x6b\xb3\xc3\xcb\xed\x48\x44\xb3\xab\xa4\xc3\x72\xd5\xcf\x8f\x40\x3c\x07\x1b\x86\x9c\x2c\x52\x8c\x07\x56\xf0\xca\x03\xa2\x6a\x3a\x2f\x3f\x85\x0b\xea\x70\xcb\xe9\xcb\xfc\x64\x23\x8f\x7e\x52\xd7\xcc\xc4\xf8\xc6\x14\x60\x5e\xa1\x91\x97\x21\x1f\xa7\xd2\x9f\x91\x96\x53\xbe\xe1\xa0\xd4\xb2\x19\x1b\x32\x42\xcc\xd4\x50\xc6\x8f\x6c\x93\x1f\xf6\xfb\x71\x56\xe3\xbf\x90\x33\xe0\xa4\x87\x98\xaa\xfc\xe4\x10\xfa\xf9\x24\x01\x93\x07\x90\x73\x61\x5c\xce\xa1\x4d\xef\x8f\xf3\xb9\xea\xb7\x30\xa3\x91\x70\x18\x15\x29\xbe\xfd\x68\xfc\xb0\xf7\xde\xcb\xa7\x03\x72\x72\xff\xf5\xe5\x53\x84\x1f\x6f\x4e\x23\x7c\xd4\xcd\x7e\xf0\x30\x8f\x0d\x10\xba\x35\xcc\xe8\x7c\xdf\x9c\x42\x22\x9a\xe2\x81\x0c\x39\x6e\x6d\x26\x8d\x21\x39\xd4\x7b\x78\x9a\xba\x9c\x9e\x2d\xc6\x98\x4a\x58\x3d\x1c\xcb\x9b\xa2\x39\x6a\xe4\xc5\xe1\x2b\x4c\x7b\x17\x02\x1d\x95\x1c\x25\x30\x03\xc6\x4e\x8d\x55\x32\x0d\xb3\x39\x92\xe4\x00\xbe\x7f\xd7\xe9\x43\xa4\x7f\xf9\x0c\x2b\x04\x3c\xc6\xdb\xc2\xb8\x5f\xb7\x2e\x8c\x80\x54\x1a\x1c\x90\xf9\x6c\xfe\xdb\xdb\x37\xdf\x9f\x4e\x07\xa5\x8d\x29\xfd\x41\xd0\xc7\x33\x7a\x73\x7e\x16\xfc\x71\x01\xc0\x08\x57\x2f\x5e\x7c\x11\xbd\x58\x7c\x79\x66\xef\x45\x7f\x9f\xe4\x7e\xdd\x86\x74\x29\x75\xab\xf6\xc8\xa7\xd3\xf7\x22\x08\xc8\x5d\x7d\x5a\xbf\x6a\xcb\xa2\xdc\x9f\xea\x6c\x7b\x24\xf5\x7e\xf2\x5e\xb0\x06\x6e\xe4\xef\x05\x5c\xa6\x5e\xd6\xe8\x21\xe1\x20\x8e\x83\x15\xa8\x0a\xca\x9a\xbb\x4e\x56\x3c\x15\x9e\x0d\xab\x5d\xb2\x1e\x55\xaf\x1b\x65\xcb\x85\x7a\xbd\xba\x0a\xd7\x40\xd0\x18\x62\x20\x1e\x13\x60\xdb\x0a\xd4\xcb\xe4\xd1\xb1\x84\x60\x51\x48\x44\x3c\x1e\xef\x9a\xb6\x90\x12\xe0\x7e\xdd\xa2\x3b\xd1\xee\x05\xb8\x85\xeb\x64\x95\x72\xa7\x20\x59\xa5\x4b\x61\x9c\x1b\x41\xb0\x9e\xf7\x1d\x23\x63\x65\xa1\xbd\x45\x3e\xd3\xf9\xc2\xae\x2b\x13\xf2\xdb\x85\xea\xa0\xb2\xb8\x00\x42\xce\xb4\xeb\xc2\xd1\x72\x4e\xfc\x1e\x55\xe0\x9e\xf0\xda\x25\x5d\x0f\x35\xef\x15\x03\xaa\xcd\x65\x3e\xb6\x16\x38\x23\x27\x07\xaf\x5f\xc1\xd7\xf3\x66\xbf\x6d\x32\xfc\x01\xda\x09\xfc\x02\x5d\x15\x7e\x81\xca\x07\x6a\x0e\xc6\x9a\x41\x98\x21\x53\x6a\x38\x50\x51\xaf\xb5\x86\x1e\x29\xf5\x06\x4a\x07\xb0\x5f\x6b\xa5\x91\xc4\x55\xb8\x60\xea\x4a\x1a\xc9\x5e\xc4\x72\xb6\x76\x94\x1f\x79\xe2\x67\x91\xe8\xa2\xb4\xeb\x46\x2f\x43\xa7\x2c\xb0\x8d\xac\xcd\x8e\x8b\xb2\x9e\xe1\x0c\x1d\x89\x19\x72\xae\x2c\xef\x4f\xf1\xa3\xa8\xf7\x59\xfb\x10\xd9\xe2\x73\xf4\x08\xee\x5b\xff\xc2\x33\x5b\xcf\x47\xfd\x75\x21\x85\x24\x09\xd3\x92\x79\x48\x99\xdb\x9e\x79\xa8\xbf\xd6\xa6\x3e\x9b\x36\x8e\x6d\x6b\x17\xd1\x68\x7b\x3b\x9d\x26\x15\xd1\xb5\xa3\x84\x03\x3f\xd3\xa8\xb5\x91\x07\x41\x01\xc0\xcc\x2c\x97\xcf\xc7\xde\x42\x23\x63\x8d\xf6\x85\xf0\x0c\x59\xdc\x65\x45\x70\x27\x6d\x76\xd4\x8a\xd8\x06\xcd\x8e\xfa\x3c\x70\xb3\xc1\x63\xf2\x50\x67\xa3\x78\x6e\xe9\xd0\x1d\x7e\x99\x3b\x03\x00\x07\x41\x2f\x48\x73\xd4\x3d\x38\x6e\xfb\x7a\x6e\x65\xb3\x61\x81\x97\xa8\x9d\x09\xbb\xad\xc0\x26\xde\xce\xc3\x13\xe5\x65\xbe\x1b\x2d\xbf\xbf\xb0\x67\xbc\x0d\x0a\xf5\xb4\xcb\x8f\x22\x8c\x23\x59\x6b\x27\x2f\xa4\x58\x0c\xbb\x12\xde\x56\x02\x6c\x0a\xa8\x6a\xc6\x97\x7a\xd4\xa1\x5e\xdf\x66\x72\xa1\x65\xd9\x68\x63\x19\x15\xcc\x5b\x73\x0d\xd7\x33\xba\x59\xb0\xe1\xc0\xe1\x32\xbd\xa2\x6c\xd8\xa8\x08\xb1\x22\x95\x3b\xdb\x98\x56\x18\x8f\x3e\x03\xb6\x30\x3d\x27\xa2\xca\xe9\x59\x3e\x2d\x89\xa5\x6a\x41\xbe\xc2\xda\xbe\x26\x14\xa3\x7a\x1e\xd5\x76\x53\x94\xa9\x2e\x7d\x85\xc7\xec\xd8\xe6\x51\x26\x45\xf3\x99\xce\x9b\x7d\x48\xe4\x14\x99\x28\x33\xc8\x17\x52\x42\x07\x0e\xea\x50\x7b\x96\x05\x41\x15\x3a\x42\x05\xcd\xb3\x2f\x17\x5f\xc2\x12\x86\x87\xf2\x53\x0b\x70\x36\x78\xa0\x37\x42\x2a\x7c\x9f\x1b\xb1\x2a\x08\xe6\x83\xe0\x49\xca\x7e\x11\xfc\x32\xe4\xf4\x63\x1c\xc6\x3c\xe8\x9e\xd1\xee\x63\x8c\x21\x89\xce\x78\x94\xa6\xc6\x21\x22\xb9\xda\x95\xc0\x7d\xa6\x83\xde\xa4\x18\x72\x9c\x7c\x10\x18\xdf\x0d\x86\x0f\x66\x44\xcc\xc8\xef\xe8\xf4\xf2\x14\xe3\x0c\x82\x2e\xb2\xd1\x71\x21\x9f\x01\x5b\x51\x07\xc2\xbc\xcc\x93\x1e\x65\x97\x98\xc3\x45\x1a\x24\xed\x17\xe5\x71\x83\x35\x91\xc6\xe4\xa6\xdd\x92\x68\x90\x65\x26\x94\x4f\x0b\x9c\x8f\xe2\x7f\xea\x7c\xb4\xcf\x04\xe7\x60\x10\x10\xf9\x17\xb3\x90\xd7\x5d\x47\xf0\x2b\x80\xfc\xd7\x8b\xe8\xd0\xee\x79\xfd\x0d\xba\x45\x7b\x51\x7a\xfe\x49\x1a\xf7\x0a\x42\xa9\xc3\x7a\x25\x6c\x1d\x8b\x64\x9d\x72\xf9\x9f\x71\x4b\xfe\x82\x6e\xc9\x59\x69\x2e\xd7\x4d\x06\x4d\xe5\x78\x3f\x75\xd3\x69\x87\xa5\xba\x1c\x63\x00\x61\x51\xb7\xf1\x01\x6a\x6a\xe1\x9e\x61\xca\x87\xfb\x37\x2b\x1b\x1a\x5a\xce\xc8\xe4\x2e\x3b\x4e\xf6\xcd\x69\x22\xc7\x12\xf8\x34\x56\xc9\x22\x3d\x33\xbf\x61\x38\x1a\xb7\x00\x7f\x5d\xa6\x4c\xfe\xe7\xc1\xfd\x73\x13\x8c\x7d\x66\xc5\x08\x92\xb4\x11\x1f\x55\x0c\x61\xd4\x16\x58\x24\x2c\x69\x84\xd5\x41\x28\x25\x7c\xbc\xdf\xf4\x79\xaf\x29\xe5\x58\xbe\x39\xae\xc3\x92\x02\x23\x9d\xd7\x33\x15\x95\xb3\x74\x05\x06\xd6\x8a\x57\x96\x90\x42\x0b\x1c\x08\xd7\xc6\x7d\x89\xef\x3f\x00\x56\x08\xbc\xf6\x00\xcc\x8c\x17\xf3\x7a\x77\x40\x1b\x0b\xc6\xda\xc8\x4d\xa1\x1c\x97\xd2\x08\xb0\x78\x3b\x0e\xc5\xf5\x57\x72\x58\x7e\xfd\xd5\x25\xfe\x71\x0f\x08\x7b\x81\x82\xd4\xd8\x03\x4a\xc5\x3e\x43\x5e\x04\x6c\xe7\x42\x1d\x7d\xa7\x83\x93\x64\x6d\x31\x20\xd5\x98\x4d\xd2\xe5\x68\x1a\xb9\xda\x4e\x9d\x5e\x51\xbb\x85\xea\xd2\xb4\x8e\xb5\x46\x1c\x8a\xbf\xfa\xfd\x40\x76\xd5\xdb\xe7\x11\xd9\xb1\x94\x67\x70\x67\xa7\x30\x81\xd6\xb8\xc5\x23\x86\xf2\xb1\xa4\x34\x12\xbc\xa0\xac\xe2\xaf\x34\xf7\x3f\x5b\xf1\x69\x1e\x04\x49\xca\xaa\x38\xe9\x3f\xa2\x4a\xae\x52\x0a\x3c\x8b\x9f\x10\x9a\x5e\xb0\x15\x0c\x86\x95\xa1\xb0\x6b\xc3\x15\xb5\x32\xbc\x9d\xef\xca\x76\x55\x86\xb2\x3a\xd7\x0e\xd3\xde\x03\xd0\x95\x9e\x44\xa2\x61\x2b\x64\xdd\x58\xf3\xcc\x85\x10\xb0\x90\xe3\x98\xb0\x56\xf0\x83\x08\x35\xc7\xee\x9a\x52\x26\x8d\x75\x3c\x5a\x30\x79\xdc\x0f\xf5\xf5\xb7\xba\x23\x31\x82\x9a\x0b\x84\x26\x9c\xfc\xf4\xee\xfd\x07\x39\x35\x4d\xaa\x83\x1c\xf7\x03\x5f\x8a\x14\x95\x3d\x77\x0a\x06\x4f\xa8\x28\x12\xda\x03\xef\xcf\xe8\x63\x65\x67\x2e\x5b\xcd\xe5\xd5\x61\x11\xcb\x25\xb5\xa8\x6f\xe5\x7a\xaa\x2c\x71\x67\x54\x86\x19\xa5\x90\xba\x1b\x16\x68\x36\xeb\xe9\x9e\x07\x81\xef\xa6\x5a\x0d\x4c\x63\x0f\x5f\xb1\xea\x3a\x27\x34\x09\x34\x68\xc1\xb2\x14\x18\x3c\x94\xe3\xc2\x38\xc3\xec\x9e\x18\xb3\x9e\x3a\xd6\x73\xf3\xb9\x0e\x43\xcf\x95\xc8\xac\xf7\x7c\x48\xa8\xd8\xcf\x30\xf1\x4d\x7e\x58\xe1\x32\x3a\x62\xa8\x2b\xa0\xc4\x62\xdc\xcf\xb5\x6a\xcb\x43\x68\x50\x3c\x3d\x4f\x8a\x92\x15\xb0\xf8\x20\xb0\xbe\x9e\xfe\xac\x55\xc6\x38\x24\x69\xbc\x83\x9f\x4f\xe3\x23\xd9\x50\x08\x87\x03\x58\xf1\x56\x13\xca\xb6\x5c\x4a\x5a\xb6\xe3\x8f\xe7\x25\x91\x3a\x7c\x9d\x6b\xd2\x0e\x4d\xd0\xa1\xaf\xe6\x44\x13\xfd\x13\xca\xd6\x7c\xab\xde\x22\x44\xac\x5d\x55\x35\xf8\x46\x59\x6d\x0b\xb6\x40\x5e\xc8\x36\x3c\xb4\x24\xd9\x8a\xbf\xa3\xaa\xef\x01\x27\x8e\x5f\x53\xd8\xc7\xab\xdd\xf5\xfb\xe6\xd4\x40\x8a\x27\xdb\xc4\x61\xc1\xb7\xe6\x2d\x42\x60\x80\x04\x7e\xff\x52\x4a\x8d\xb2\x3a\xd1\x28\x5c\x0d\x99\x7a\x4b\xb7\xa8\x96\x45\x83\xa9\x05\x0e\x6d\xa1\xc1\xcc\x73\x0f\x07\x78\x4d\xa9\x06\x63\x16\x73\xc0\x49\x0d\x77\xf2\x2f\x1e\x5d\xac\xe5\xff\xb3\x95\xbd\x44\xbe\x08\x5c\x23\x7f\xa8\xe3\x8b\x35\xfc\x91\x8b\x2f\xb9\x39\x4a\x81\x2c\x4d\xf7\x58\x1a\xfa\xf5\x7e\xa5\x9f\xbb\xa3\xd1\x16\x5a\x6b\x87\xa4\x54\x8e\x9b\xb2\xe9\x77\x2e\xfd\x1c\xc4\x82\xd5\xbe\xc1\x3d\x37\xe6\x69\x83\xb1\x8c\xb5\xce\xcd\xe0\xd1\xb8\xb0\x42\xe7\x1b\x1b\x9c\x18\x37\xc7\xcc\x86\x3c\x3e\xe5\xfb\x91\x1d\x55\x3d\xc5\x2e\x09\x88\xb2\x3e\x4b\x7d\x2e\xf5\x2a\x75\xa0\x64\x36\x2c\x14\x4e\xce\x26\x7b\x3c\x35\x87\x08\xba\x7b\x56\xce\x0f\xd9\xaa\xfc\xdf\xf8\xce\x17\xf9\x3c\x87\xda\x3f\x34\x07\x26\x1b\x39\x2a\x54\x5b\xc3\x55\xbf\xf5\xae\x7a\x03\xd4\x96\x11\xd4\xb6\xc0\xeb\x17\xe7\x33\x33\x04\xee\x8e\xf4\xa9\x2b\xe3\x7d\xd5\x88\xa5\xcc\x24\xdb\xb1\x82\xfb\x75\xe8\x60\x62\x33\x96\x71\xe0\xe7\xee\x24\x8b\x05\xf2\xf9\x8f\x35\x4b\x14\xaa\xb4\x00\xec\x94\x9f\xd0\x77\x28\x5b\xcb\x29\x0d\x29\xfb\x26\xcc\xe4\xe3\x51\x52\x53\x08\xf1\xcd\xcc\x59\xaa\x5f\x0b\x1b\x4a\xcd\x3d\xb8\x1e\x79\x3a\x3f\x34\x07\xc3\xdb\x4d\xbd\xe6\x1a\x5e\x2b\x9b\xca\x5e\x7c\xa6\xd8\x05\x38\xea\xa1\xfe\x0b\xf3\x89\x48\xb5\xf5\x41\x0a\x59\x53\xaf\x1a\xf9\x58\x7d\xff\x52\x60\x32\xc5\x74\xc4\x33\x73\xbf\xf8\xbf\x94\x95\x31\x68\x2f\xed\x09\x87\x28\x0d\x2d\xc2\x46\xa4\x1d\xf8\xc5\xbd\x1b\xb5\x98\xed\xba\x36\x3b\xfb\x20\xbd\x86\x75\x2e\x22\xce\x88\x22\xcc\xb0\xd4\x61\xb9\x1a\x8f\x4f\xa4\xe4\x79\x97\x48\x59\xbe\x1c\xa0\xeb\x16\x9f\xa1\x16\xb5\xdc\xf4\x4b\xc7\x0f\xaf\x32\x6a\x33\x1a\x57\x3c\x8b\xfe\xa3\xcf\xf6\x54\xf1\xcc\x9d\x42\x2e\x5b\x71\x5c\xc5\x55\x22\xd2\x28\x4b\x8a\x14\x62\xdb\xc3\x2a\xae\x0c\xef\x5e\x98\xc7\x95\x3b\x7b\xa2\x92\xe5\x71\x19\x55\xee\xbc\xa3\x70\x2f\x2f\x81\x5c\xb4\x18\xe0\x01\xf6\x71\x99\xe5\xf2\x0b\x2b\xc0\xe7\x29\x8a\x81\x2a\xf7\x50\xdf\x97\xdb\x9f\x54\x67\x31\x3f\x99\xd3\xcd\x71\x55\xdc\xe8\x82\x32\x4d\x0a\x9f\x53\xb4\x17\xec\x1a\x91\x88\x14\x68\x6c\xa3\xfc\x4c\x9d\x4e\x55\xec\xe5\x86\x3f\x19\xc6\xb9\xe6\xf3\x1f\xe2\x20\xe3\x4d\x86\xf5\x16\xd4\x76\x32\xcb\xb4\xeb\x25\x12\x8c\x90\x88\x34\x37\x27\x28\x3e\xf7\xa0\x75\xa1\xa7\x0b\xa7\xa7\xad\x53\x98\xf7\xdb\x4d\x6a\xe0\x0e\xd8\xb4\xd1\xdb\x4b\xb9\xd2\xe6\x80\x87\x8a\x0c\x00\x15\x06\x2f\x6b\x96\xbb\x48\x13\xd0\x1b\x2d\xb3\x3f\x88\x00\xf3\xe1\xe9\x41\x24\x68\x0c\x51\xfa\x76\xe5\xc5\xcf\xa1\xb1\x48\xcc\x07\xa7\x91\x15\xd4\x7d\x89\x9d\x10\x94\xb0\x70\xd9\x7f\x80\xba\xa2\xc7\x62\x1c\x56\x23\x12\xde\xd0\xfd\x08\xb0\x8a\xc0\x12\x6d\xb6\x5b\x79\x3f\xab\xbc\x23\x7d\x81\xa6\xeb\xc7\x0b\xfc\x23\xfb\x70\xaa\xb3\x35\x60\xa0\xe3\xec\x97\x1f\xbf\xa6\x86\x8c\x12\xf1\x2f\xd6\xf4\x2c\x2d\x81\xb8\x8c\x74\xb0\x00\x40\x19\xf7\x12\x7e\x45\xed\x7a\x91\xfc\xfd\x5c\xad\xf3\x65\x2a\x1b\x9c\xe5\xb0\x2b\x34\xb8\xa5\x77\x43\x55\x99\x3b\xe8\x99\x69\x28\x84\x3f\xe1\x4f\x40\xd5\x52\xf1\x20\xdc\xec\x9f\xb8\xcb\xdc\x03\x28\xab\xbd\xc1\x15\x3b\x8f\x27\xcf\x9f\x13\xb5\x07\x27\x0b\x04\xcb\xba\x4e\x96\xb1\x5c\x4d\xdd\x75\xb3\x2d\x7e\x2e\xb3\xe2\xc1\xd3\x58\x33\x80\x58\xcd\x8a\x87\x5f\xb3\xfa\x34\x9b\x45\xea\x08\x58\x10\x40\xab\x82\xfc\x30\xee\x65\x8b\x69\x23\xf5\xef\xef\xdf\xfd\xc8\x9d\xa8\xe4\xd6\x24\xb1\xf1\x6f\x18\xd1\x4f\xb1\xc6\x0c\x02\x08\x07\x01\xfe\x9d\x67\xbb\x42\xff\x0e\x09\x06\xe2\x12\x96\xa4\x23\xcc\xd6\xad\x52\x5f\xfe\x25\x78\x36\xdf\xfc\x53\x5e\xc9\x7e\x95\xbf\x9f\xd9\x81\xbf\x6f\x5e\x35\xfb\x6a\x5b\xe7\x27\x3e\xa6\x6e\xcf\x9f\xc9\x95\x03\x94\xdf\x67\xfc\x57\x81\x34\x09\xaa\x2e\x73\x46\x1d\xfe\x4b\x50\xd6\x9e\x99\x00\xc0\x1a\x55\x26\x6f\x6b\x65\x31\x5d\xfe\xdb\xff\x09\x00\x00\xff\xff\x29\xff\x13\x14\x83\x52\x01\x00") - -func pagesAssetsJsJquery300MinJsBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsJsJquery300MinJs, - "pages/assets/js/jquery-3.0.0.min.js", - ) -} - -func pagesAssetsJsJquery300MinJs() (*asset, error) { - bytes, err := pagesAssetsJsJquery300MinJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/js/jquery-3.0.0.min.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsJsPopperMinJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x7c\x6b\x97\xdb\xb6\xb5\xe8\xf7\xfe\x0a\xea\x9c\x96\x00\x2c\x88\x23\xa5\x37\xf7\xdc\x4b\x19\xd1\x72\x9c\x71\xe3\xd4\xf6\xb8\xf6\xb8\x4e\x4a\x73\xc5\x1c\x11\x1a\x21\xa6\x08\x16\x80\xe6\x51\x49\xff\xfd\x2c\xbc\x48\x50\xe2\x8c\xd3\x7e\xf0\x88\xc4\x63\x63\xef\x8d\xfd\x06\xe8\xb3\x27\x7f\x88\x9e\xf3\xe6\x5e\xb0\xeb\xb5\x8a\xe0\x73\x14\xbd\xa0\x25\x15\x6c\xc9\xa3\x7f\xb0\x1b\x5e\xf1\xe8\x9b\xe9\xec\x7f\xfe\x10\xfd\xc0\xa4\x12\xec\x6a\xab\x68\x19\x6d\xeb\x92\x8a\x48\xad\x69\xf4\xfa\xe5\x65\xf4\x8a\x2d\x69\x2d\x69\x04\x2b\xf7\xa0\xa8\xd8\xc8\xa8\x10\x34\x2a\x54\xb4\x56\xaa\x49\xcf\xce\x78\x43\x6b\xc9\xb7\x62\x49\x13\x2e\xae\xcf\xdc\x50\x79\xf6\xfa\xe5\x25\x4a\xfe\x10\x3d\x39\x83\xab\x6d\xbd\x54\x8c\xd7\x90\x62\x85\x76\x80\x5f\xfd\x46\x97\x0a\x10\xa2\xee\x1b\xca\x57\x11\xbd\x6b\xb8\x50\x32\x8e\x81\x5e\x7d\xc5\x6a\x5a\x82\x91\xef\xdc\xf0\x72\x5b\xd1\x85\xfd\x49\xdc\x50\xa2\x20\x4a\x81\x07\xdb\x41\xb2\xb3\xe3\xd8\xfe\x26\xc5\xa6\x5c\xd8\x47\xa8\x50\x4a\x93\xb7\xbc\x69\xa8\xd0\x93\x0f\x08\xaa\x35\x93\xb8\xc5\x0c\xed\xc0\x56\xd2\x48\x33\x62\xa9\xc0\xdc\xb7\x47\x14\x52\xb4\x13\x54\x6d\x45\x1d\xd1\x38\x06\x99\x45\x3e\x7a\xe1\x06\xe4\x80\x10\xb2\x3b\x24\x8a\xbf\x57\x82\xd5\xd7\xc9\xb2\xa8\x2a\x48\xd1\xa1\x85\xa0\x2c\xd5\x6c\x05\x67\x23\x42\x68\x52\xf3\x92\x5e\xde\x37\x14\x59\xa8\x59\x3e\xbf\x29\x44\xc4\xc9\x35\x55\xcf\xf9\xa6\xd1\xbb\xf0\x5e\xdd\x57\x14\x52\x5c\x6f\xab\x0a\xcd\xdd\xea\x6a\xc1\x33\x95\xa7\xbc\x83\xcc\x3b\xdc\xc0\x8f\x97\xaf\x5f\x69\x54\x2c\xfc\x37\xc5\x86\x2e\x68\x4a\x93\xa6\x10\xb4\x56\x6f\x78\x49\xf7\x7b\x9a\xac\xb9\x54\xdd\xf4\x5a\x4f\x67\x2b\x38\xf2\xa8\x44\x25\x5f\x6e\x37\xb4\x56\xc9\x15\x2f\xef\xe7\xf2\x96\xa9\xe5\x1a\x76\x10\xd1\x6e\x59\x48\x6a\x97\x4a\xcd\xe3\xf7\x17\x3f\xfc\x02\x52\xcf\x9e\x84\xdf\xd6\x54\xfc\xd0\x03\x62\x86\xfd\xb7\x07\x1c\x8c\x35\xbd\x07\x4d\x3a\x23\x0a\x52\x84\x05\x61\x09\xbf\xa1\x62\x55\xf1\x5b\xdc\x04\x2f\x3f\x63\x19\xbc\xfd\xe2\xf9\x71\x06\x8b\xad\xe2\x7b\xb9\x14\xbc\xaa\xd0\x59\xa2\xa8\x54\x50\x8c\xe5\xb8\x41\x0b\x9a\xd6\x50\x73\x27\xd8\x06\xa1\xa9\xb5\x9c\xa6\x71\x4c\x13\xbe\x5a\x49\xaa\xde\x1a\xfe\x60\x46\x78\x1c\xf3\x96\x50\xbf\x04\x8b\x63\x4b\xe2\x88\x10\xfd\x6c\x28\xd7\xcf\x8b\x89\xde\xcb\x0c\x5c\xfe\x00\x30\xb8\x7c\xf6\xfd\xab\x73\x90\x27\xac\x2e\xe9\xdd\xc5\x0a\x76\x70\x50\x1c\x03\xa9\x0a\xc5\x96\x7a\x6b\x14\xe4\x18\x34\x5c\x32\x23\xb3\x68\x21\x20\x47\x29\x4f\xe9\xe2\x98\x71\x9e\x5b\xe7\x15\xd5\x3f\x69\xf9\x40\x47\x47\x5c\xe3\x89\x53\x81\x00\x38\x2a\x5a\x0a\x54\x1c\xc3\x56\x4e\xd4\x7e\x2f\x20\x4d\x56\x4c\x48\x0f\xee\xf9\x9a\x55\x25\xd2\x32\x14\xb0\x4d\x06\xf2\xaf\xc5\xd1\x88\x58\x27\x55\x0b\x9a\x4a\x18\x36\x04\x53\xcb\x56\xf0\x47\x74\xbf\x1f\x75\x92\xbf\xdf\x8f\x94\xfe\x77\xac\x0a\xd1\x43\x84\x3a\x0d\xa1\xc9\x92\x6f\xf4\x52\x9e\x53\x6f\x1d\x33\xa1\x42\xb1\x5e\x3c\xf9\xe1\xe2\xf9\x87\xd7\xe7\x6f\x2e\x7f\x7d\x7b\xf1\xfe\xe5\xe5\xcb\x8b\x37\xbf\xbe\xb8\x78\xf5\xea\xe2\xe3\xcb\x37\x7f\xd1\x7b\xbc\xa0\xa9\xc2\x35\xe1\x0b\x95\x52\x5c\x90\x76\xb9\xa5\xa0\x85\xa2\xef\x8a\xfa\x9a\x42\x34\x2f\x12\x49\xd5\x7b\x55\x08\x05\x19\x9e\x22\x6c\xde\xcf\xeb\x12\xd6\x78\x8a\x0c\x2a\x15\x29\x34\x2a\x1b\x5e\x3f\xab\x97\x54\x2a\x2e\x9e\xf3\x5a\x15\xac\xa6\x62\xce\x56\x90\x8e\x08\xa9\xe2\x58\xe9\x9f\xfd\x9e\x25\x4b\xdb\x29\x61\x8d\x3c\xa5\x0d\xac\xd0\xa2\x4a\x05\xac\x2c\xc4\x15\xd1\x8c\xf6\x72\xb7\x32\x9a\xba\x28\xa1\x7d\xc0\x0a\xa5\x9a\x99\x12\x2a\x64\x1a\x02\x26\x17\xdd\xce\xcf\x9e\x16\xe2\xda\x10\x24\x93\x8a\xd6\xd7\x6a\x1d\xc7\x37\x9c\x95\xd1\x74\x44\x48\xdb\x95\xcd\xf2\x45\xf8\x92\x02\xc5\x1b\x80\x39\x31\xbf\x5a\x32\x16\xc0\xea\xd4\x25\x6f\x40\xea\x9e\x5f\xd1\x95\x02\x98\x85\xd2\xc5\x56\xd0\x8a\x16\x21\x84\xed\xf7\xad\x64\x31\x8b\x4f\x4d\xbe\x22\xd6\x58\x9c\x8c\xb0\x6b\xb1\xfa\xda\x0d\xd9\xef\x6b\xcf\x12\x91\xf1\xfc\xe0\x8d\x87\x7e\x6e\x39\x50\x59\x31\xb3\x22\xf2\xcd\xef\xe3\xc1\x37\x79\x1c\x87\x6f\x98\x91\x02\x2a\x6c\x58\x80\x70\x6d\x5f\x2a\x4d\xb3\xb6\x4b\x7c\x31\x99\xa5\xb3\x79\x6b\xba\x14\x6f\xc6\x84\x3d\x11\x58\x5b\x31\xa5\xf8\xc6\xbf\xe9\x19\x63\x52\x9b\x67\xe3\x74\xdd\x4b\x87\xec\x2a\x44\x16\xdc\x39\x7e\x1b\xee\xa6\x40\x33\x1c\x33\x62\x5f\x09\xe1\x0b\xf0\x4e\x03\x01\x29\xf8\xde\x2c\x03\x3c\x0a\x4d\x21\x24\x7d\x51\xf1\x42\x41\x9a\x81\x2b\x2e\x4a\x2a\xc0\x98\x8f\xc1\x47\x56\xaa\x35\xc8\xf1\x6c\x8a\xc6\xc3\x83\x58\x6f\x50\x87\xd8\x46\x23\x86\x39\x66\xad\xb6\xff\x04\x55\x06\xac\x95\x04\x63\x9a\x63\x95\x39\x59\x30\x6f\x3c\x03\xcb\x8a\x69\x93\xee\xde\x82\x91\xbc\x37\x92\x51\x88\x16\xbd\x01\x63\x96\x81\x4d\x21\xae\x59\x0d\xc6\x10\xfc\x48\x0d\x91\xda\xb0\x2c\x80\x95\x39\xc3\x00\xf4\xd8\x38\xc7\x90\xd4\x71\x08\xe5\x69\x48\xcc\x1a\x5a\x16\x53\xd2\xf3\x68\x58\x91\x87\x2c\x0c\xe6\x44\xe3\x19\xc7\x27\x5e\x58\x79\xad\xdc\xad\x0d\x02\xe9\xa6\x45\x05\x1b\x96\x21\x7c\xab\x19\xaa\xdb\x2d\x67\x5d\xf3\xa1\xc3\x67\x19\x18\x51\x49\xe1\xee\x80\x29\xde\x19\x01\x49\x9d\xd0\xd0\xc4\x00\xc1\x56\x9e\x52\x2b\x63\x34\xb1\x4b\x1e\x02\xd2\xae\x3b\x37\xb6\x3b\x68\x1d\xd4\x68\x23\x25\xee\x77\xda\x3e\x5e\x53\xf5\x3d\xdf\xd6\x25\xab\xaf\x9f\x9b\xdd\x79\x47\x97\x0a\x5a\x13\xa3\x45\x9c\x86\x22\x4e\xbd\x88\xcf\xb9\x13\x69\xcc\xbd\x08\x63\xde\x89\x36\xe6\xad\x30\x1f\x96\x85\x09\x09\xd0\xee\x40\x2b\x49\xa3\xaf\xad\x29\xc8\x4e\x03\x4c\x2d\x5c\xac\x78\x93\x9a\xb5\x1c\xcb\x1c\xe0\x89\xeb\x76\x0c\xf6\x4b\x4f\xcc\xd0\x03\x6e\xc8\x50\x74\xb3\x86\x28\xdd\x1d\xb0\x24\x8d\x65\x9d\x8e\x6f\xac\x44\x7e\xb4\xaf\xc2\x01\x17\x16\x78\x49\x1a\xc7\xce\x6e\xe4\x8f\xee\x5d\xf8\x15\x85\x41\xae\x22\x3e\x3c\x30\xa0\x26\x12\x6f\xda\x16\x3b\x65\x52\x6a\xd6\x57\xfb\xfd\xc6\x6e\xc6\xb5\x09\x61\xe6\xd5\x84\xac\xe0\x35\x06\x77\x00\xe1\x8d\x7b\xbe\xd7\x26\xc4\xa2\x38\x21\x15\x16\x0e\x89\x09\xd9\x78\x73\xb6\x84\x22\xd8\xe0\x2d\xa4\x98\x5b\xa8\xcc\xc8\x24\x16\x1d\xfd\x5d\x68\x81\x1b\xa2\x45\x01\x4b\x72\x0d\x39\xc2\x25\xd1\xd1\x1c\x2e\x74\x90\x81\xf0\x8a\x04\xca\x5f\x24\x56\xf7\x2f\x79\x63\xc8\xd1\x7a\x8f\x37\x43\x23\xb4\xda\x75\x43\xd6\x64\x09\x77\x7a\xc7\x1a\xcd\x94\x89\x34\x7f\x57\xd8\xec\x67\x63\x78\x3a\x91\xf6\x67\xe3\xb6\xd3\xed\x84\xdf\xc7\xa6\x15\x5f\xcd\xac\x75\x62\x55\xf9\x92\x37\x64\x8a\xfd\x9b\x5e\x92\x4c\xf1\x88\xc5\xb1\xb0\x44\x6f\xfb\x98\xb5\x93\x0c\x4e\x57\x43\x9d\x1a\x86\xee\x9d\xaf\x0d\x8a\x64\x35\xd9\xe2\xb5\xdf\x51\xf7\x66\xf0\x24\x9b\xc9\x15\x5e\x3b\xb1\x70\x2f\x1d\x52\xdb\x3e\x52\x57\x6e\x7b\x20\x5b\xf0\xce\x83\x97\x28\xe5\x84\x90\x32\x08\x0c\xcb\x30\xdc\x83\x6b\x52\xc1\x35\xe6\x08\xe1\x75\xb7\xa7\x57\x61\x78\xf6\xb8\x53\xe4\x64\x6b\x5c\x04\x66\xe4\x27\xa8\x42\x89\xc6\xb7\xac\x2e\xf9\x6d\xc2\xea\x9a\x0a\x27\xe3\x53\xad\xc9\xdd\x38\x2b\x9c\xbd\x81\x5e\xc4\xa7\x5a\x8e\x0a\xa8\x10\x6e\x7a\xde\x4d\x12\xb3\xc7\xc2\x2a\xdb\x98\x07\x0c\xb7\x3b\xed\x94\xb3\xed\x31\xdc\xb6\xfb\xcd\xfc\x4e\xd7\x87\x79\x2b\xcb\x32\x90\xe5\x5b\x4f\x37\x7b\x28\x2c\x3d\x8e\x1d\x16\xa3\x59\x0a\x56\xec\x8e\x96\x36\x62\xa6\x61\xc4\xbc\xdf\xdf\x1e\x47\xf5\xf7\xc6\x6d\x31\xec\x84\xa7\xb1\xd4\x4c\x2d\xee\x53\x6d\x1e\x6c\x14\x6a\xa2\x95\x1b\x46\x6f\x75\xfa\xa8\x41\x0b\xd4\x90\x2b\x28\xd1\x5c\xdb\x31\x33\xb7\x98\x3b\xaf\x65\x73\x02\x33\x68\x01\x0b\xa2\x33\x09\x85\x10\x6e\x11\x2e\x5a\x52\xe2\x18\x16\x5f\xdb\x51\x84\x52\x60\x37\xc4\x42\xfc\xea\x84\xb4\x20\xc2\x45\x99\x5b\x58\x60\x69\x71\xf7\x1c\x0a\x17\x1f\xdd\x42\x89\x2c\xe1\x2b\xb2\x86\x5a\xab\x57\x4e\xe7\xf0\x92\xac\xac\x36\xce\x1b\x6b\xdc\x2b\xa3\x1c\x55\xb0\xbf\x8d\xd3\x11\xb2\x19\x9b\x4e\xdc\x38\xeb\x5f\x59\x75\xa9\xc2\x1d\x6f\xac\xda\x90\xe5\xd8\xf6\x5a\xfb\xdf\x90\xca\x5b\x31\x3f\x99\xe1\xc6\x7b\x93\xc6\xab\x1a\x6b\xd7\x32\xcf\xdd\xf6\x9d\x87\x8a\x61\x8d\x87\x76\x29\x96\x86\x36\xf1\x7d\x12\xe4\xbc\x37\x3e\x4e\xc1\xb5\x9d\x29\xc8\xb7\xbf\x2f\xe6\xfb\x36\x8c\x7b\xbf\xcd\xd3\xa9\xe6\xeb\x64\x66\xbc\x8a\x4f\xdd\x80\x4e\x29\x41\x1b\xa5\xd3\xb9\x15\xaa\x7b\xa8\x17\x14\xb8\x6e\xf5\x65\x37\x68\xf1\x94\xe1\x71\x63\xdd\x96\xf5\xef\xed\x40\xcb\x0a\x65\x7f\x4f\x4c\xa4\x77\xfc\xc3\x70\x5b\xee\x29\xf7\x70\xb0\x02\xee\x46\x2b\xbb\x5f\x4d\xcf\x8b\xb6\xa0\x0f\xb8\x24\x17\xa6\x68\x91\x7c\xa1\xf7\x12\x4a\x94\x6c\x8a\x26\xa8\xc9\xf4\x42\x93\x2f\xf4\x3e\xa5\x07\x2c\x33\x9a\xe3\x5d\x21\x68\x91\x9e\x43\xfd\x82\x0e\xe8\x80\x12\xc9\x85\x3a\xaa\xe6\xf8\x4d\x4a\xf4\xe0\x09\x35\x3f\x07\xed\x89\xca\x64\xc5\x2a\x45\x45\x6f\xa5\xfe\x5e\xb3\xd3\xbd\xfe\x8e\xf0\xd0\xe8\xc5\x31\xeb\x5a\x7e\x74\xee\x04\x57\x64\xfa\xb4\x70\x7b\xbd\x28\xb2\x69\xae\x29\x4b\x4b\xf7\x80\x57\x84\x26\xb2\xa9\x98\x82\x60\x02\x50\x36\xcb\x3d\xf4\x6a\x0c\x57\x0b\x30\x01\xe3\x55\x0a\x40\x60\x45\x2e\xac\x50\x79\x5b\x55\x42\xfd\xe2\x27\x6d\xf5\xe6\x07\x83\x5f\x75\x74\x9c\x96\x6c\x10\xe6\xa1\x8b\x52\x9d\xba\xf5\x02\x72\xdf\x6e\xc3\x58\x6d\xec\x07\x3a\xb5\xde\x0d\xce\x32\x31\xaf\xb6\xfc\x6e\xff\x7b\xd1\xca\xb8\xb5\xca\xfd\x90\x65\xcc\x5b\x23\x5d\x77\xc4\xdc\x75\xc4\xd8\x48\x0d\x08\x1b\xda\x5a\xe9\xb5\x5e\xc2\x0b\xa7\xcd\x14\xb5\xf8\x03\xdb\x02\x0e\x5d\x52\x24\x68\x53\x15\x4b\x0a\xcf\xf4\x94\xbd\x99\xbe\xb7\xa3\xf6\x8a\x37\x67\xd7\x78\x40\xe0\x54\x46\xf3\x30\xb8\x7d\xef\xf7\x81\x13\x1e\xee\xe0\x34\x77\x11\xac\xe6\x7d\x47\x37\xeb\x6b\x09\x6b\x95\x49\x10\x57\x9f\x71\xc4\x58\x32\x82\x0a\x8d\xf6\x82\x62\x61\xe8\xf1\x34\x4a\xdd\x50\xd9\x44\xcc\xd0\x59\xea\x06\x0b\x11\x68\x13\x6e\x42\xfb\x42\x37\xda\xe7\xd4\x77\xb6\x6c\xcd\x9a\x9c\xa8\xac\xc9\xc7\x2a\x2b\xf3\xb3\x6f\x26\xcc\xfc\xe0\x3a\x93\x39\xd1\x51\x83\x5c\xa8\x4c\xe6\x13\x96\x15\x79\xaa\xb2\x3b\x28\x51\x8e\x83\xbd\xb8\xec\x29\xd4\x33\x21\x8a\xfb\xa4\x11\x5c\x71\x75\xdf\xd0\x64\xc5\xea\x72\x61\x7f\x6c\x31\xd3\x69\x97\xd2\xec\xe9\x80\xfc\xe0\x59\xc8\x56\x70\x08\xc4\x4b\xcd\x82\xd6\xbe\x75\x4d\x43\xf6\x80\x66\x2a\xd7\x41\xe7\xc1\x27\x10\x1a\xc3\xc7\xc7\xb5\x80\x3d\xab\x43\xcd\x79\x0e\x5d\x86\x69\xeb\x03\xd6\x46\x1b\xaf\xaf\x4d\xa7\xac\xd8\x92\xc2\x29\xfe\x41\x47\x27\x75\xb1\xa1\x00\x33\xd4\x42\xac\x93\x15\x17\xe7\xc5\x72\xdd\x21\xaa\xd0\x4e\x65\x5d\x11\x38\x8f\xe3\x25\xaf\x25\xaf\x68\x72\x5b\x88\x1a\x82\xcf\x1b\x5e\xb2\x15\xa3\x22\xf1\x63\x3e\x47\x4c\x46\x25\x6d\x04\x5d\x16\x8a\x96\x38\xda\x4a\x1a\x05\xc3\xea\xcf\x23\xe0\x69\xed\x81\xde\xef\x55\xb2\xaa\xe7\x2a\xa1\x75\x71\x55\xd1\x32\x8e\x29\x64\x3a\xdc\xe3\x4e\xc7\x64\xd2\xd8\xda\xf2\xf2\xa4\x09\xe1\xae\x45\xd0\x15\x15\xb4\x5e\xd2\xde\xb8\xb6\x55\x5b\x0f\x06\x39\x56\x08\x1d\x10\x0e\xbc\xde\x1b\x68\xeb\x68\x6a\xcd\x64\x22\x55\xa1\x68\xc2\xe4\x0f\x54\x2a\xc1\xef\x69\xe9\x93\xdd\x1d\xab\xa5\x2a\xea\x25\x4d\x4d\x6d\x5b\x6a\x93\x24\x75\x92\x54\x08\xc1\x6f\xdf\x77\xaf\xca\x95\xfb\xcd\xdb\xaa\x62\x4d\x43\xcb\x74\x34\xc3\x0e\xa1\x74\x77\x38\xcc\xe9\x00\xd2\x17\xb0\x43\x00\x9b\x47\x4b\xa2\x7d\x0e\xc8\xa0\x89\x31\x06\xda\xd7\x92\x1b\x3b\x89\x37\x9a\x12\xd9\x75\xe0\x81\x15\x1e\x01\x8a\x7b\x50\xfc\x9e\xc9\x44\xa3\x9f\x5c\xe9\x04\xb4\x10\x8c\x4a\x1f\x47\x3f\x36\xba\x29\x4a\x9d\xad\x6a\x34\xb9\x60\xd7\xac\x2e\xaa\xb7\x2d\xba\x74\x10\x43\xb7\xbb\xef\x61\x88\xe0\x10\x01\xc1\x74\x74\x32\x3f\xf1\xb1\x2c\x01\xc5\x95\xe4\xd5\x56\x51\x80\x29\x79\x6e\xa1\xb6\x58\x62\x8a\x70\x6f\xa7\x9f\x9b\xfa\x64\xb9\xe8\x11\xc5\xeb\x0f\x4d\x59\x28\xed\x74\x52\x38\x34\x9c\x8c\xa6\xf8\x68\x86\xed\x31\x21\x74\x27\x5c\x5f\x7a\x76\x87\x26\x92\x6f\xe8\x89\xd3\xd6\x61\x99\x56\x4a\xe3\xb3\x9d\x16\x04\x65\x72\x6d\xde\x7a\x75\x8a\x8f\x7a\xe2\x8a\x0b\x68\x9d\x4b\x36\x9a\x61\xb0\x91\x00\x83\x8f\xf4\xea\x0b\xd3\x36\xf9\x35\xff\x17\xc0\xe0\x02\xe4\x26\xe4\x5b\xae\x0b\xf1\x4c\xc1\x29\x4a\x14\xff\xa0\x79\xf5\xbc\x90\x14\xa2\x31\x75\x76\x61\xa6\xed\xfe\x74\x5e\x3f\x55\xce\xef\x4f\x66\xf3\x7a\x3c\xf6\x2e\x5b\x65\x75\x8e\x05\x61\x0b\x00\xc6\x6c\xcc\x53\x5b\x9e\x1c\x38\x4e\xea\x15\x84\x12\xa3\x22\x99\xc8\xbd\x41\x14\x87\xa0\xd4\xdd\x11\xf3\x16\x76\x2e\x6b\x50\x03\x35\xab\xbf\x1c\xef\x22\x28\x9a\xa6\xba\x37\x6a\x07\xb4\xad\x08\x44\x27\x11\x74\xc3\x6f\xe8\x33\xaf\x88\x10\xdc\x4d\x5a\xb9\x01\x28\x54\x03\x8b\xa3\x09\xed\x08\x00\x03\x3d\x9d\x4c\x0d\xf5\x2a\xde\x0c\x76\x64\x1f\x21\x50\xa2\xa8\xe5\x8a\x8b\x0d\x40\x39\x01\x7e\xd9\x92\x49\xbd\xbb\xe7\x37\xb4\x56\xaf\x98\x54\xb4\xa6\x42\x42\xd4\x17\x25\x8b\xff\x45\xed\x38\x10\xc7\xe1\x02\xdd\x69\x80\x1b\x67\x4e\x16\x42\xfa\x2d\xb4\x8e\xc1\xdf\x3f\x98\x20\x77\xa7\x5f\x2a\x29\xe9\xaa\xd8\x56\xea\xef\x8c\xde\xa6\x36\xa5\xea\x20\xfc\xd8\xd5\x2f\x6d\x56\xd0\xa6\x6b\x34\xac\x99\x88\xd3\xc3\x96\x00\x28\x9d\x37\x49\x51\x96\x3d\xd2\x8d\xcf\xda\x35\x85\x94\xec\x86\xa6\xa3\xe9\x01\x61\xb1\xdf\xff\x08\x6b\xd8\x84\xc7\x1e\x6e\x71\xcc\x92\x66\x2b\xd7\xb0\x09\x54\xe1\x59\x87\x1a\x4f\xb6\x46\x67\x4d\xc1\x8c\x30\xac\xe9\x3e\x5d\x11\x08\x2a\xd9\xbf\x28\xc0\xbd\xe1\x7d\x24\x5c\x79\xad\x0e\x4e\x0d\x7e\x84\x02\xfb\xc2\xeb\xd1\x54\x9e\x84\xa9\xad\x44\x6d\x83\x33\x97\x44\x60\x9e\x50\x8d\x84\x3c\xb7\xba\xad\x25\x3a\x70\x40\x2f\x21\xda\x05\xa2\xdf\x1b\xba\xdf\x07\xe6\x87\x3c\x83\x8f\xd8\x6d\x7c\xec\x3f\xe4\x72\x4d\xcb\x6d\x45\xad\x29\x0b\x33\xfb\xd7\x3d\xab\x64\x18\x65\x85\xe9\x01\x5e\xa9\x90\x60\x84\x55\x9f\xe2\xd3\xe8\x81\xa2\x1d\x1d\x86\xe8\x59\xd8\x87\x78\x40\xfd\x06\xa2\x4d\xc4\xf1\x32\x24\xcb\xdb\x26\xcf\x5a\x37\xee\x88\xbb\x33\x1c\x1c\xdf\xbd\x7b\x84\xbb\x71\x0c\x97\xda\xa7\x57\xcf\x6a\xb6\x29\xf4\xf0\x17\xa2\xd8\x50\x38\xc4\xbe\x80\xbd\xe4\xf5\xe0\x3e\x98\xbe\x90\xcd\x1f\x82\x33\x64\x30\x22\x84\xc6\xf1\x88\xc9\x37\xc5\x1b\x18\x9e\x1f\x20\x14\xc7\x4c\xbe\x60\x35\x33\xde\xa3\x9b\xfe\x8b\xdd\xa5\x30\xbf\x54\xe8\x94\xd9\x6d\x6a\x05\xc0\xdc\x85\xe6\x2e\xa0\xf6\x41\xb4\x2d\x4c\xe3\x36\x62\x77\x09\xc6\x40\xe8\x1e\xc7\x1f\xa0\xca\x78\xae\x4d\x2a\x23\xa0\xb9\x03\xda\xd1\x5a\xa3\xc6\x75\x00\xce\xf3\x31\x0b\x5d\xd1\x6f\xff\x26\x8e\x1a\xc2\x7c\x34\x33\x81\x29\x3d\xb1\xd4\x5c\xc7\xde\x92\xaa\xa0\x05\x1b\x74\xc2\x25\x5f\xf4\x13\xca\xe3\xb8\x39\x74\xa8\x5e\x7b\x9d\x07\xc5\x35\x19\x8d\x58\x1c\x0f\xb8\xe1\xd6\x41\xeb\x69\x3a\xde\xd6\xa3\xba\x80\x34\x31\x35\xdc\xa7\xcc\xfe\xda\xa2\xeb\xa8\x2d\x92\x80\xcf\x60\xac\xc6\xe0\x33\x98\x1f\x05\xc9\xe6\xdc\xe8\x33\x18\x83\xc8\x7b\x2e\x1d\x24\x0b\xfa\xcf\x2d\x13\xb4\x8c\xae\xee\x23\x30\x16\xbd\xde\x3a\x32\x2b\x44\x8a\x47\xb7\x5c\x7c\xc1\xd1\x15\x8d\xe4\x56\x50\xdd\xc0\xea\x65\xb5\x2d\x69\xc4\x54\x74\x45\x57\x5c\x50\x3b\x7b\x04\xd0\xe1\x34\xf9\xfc\x6b\x20\x7b\xb4\x2e\xdd\xd1\x8e\x54\x85\xd0\x19\x97\xfd\xb5\x6d\xba\x37\x0d\x8e\xd1\xfe\xf9\x1f\x9c\x7a\x86\x27\x7e\x33\x1d\x74\x14\x5d\x96\x42\x75\x0a\x5e\xf8\x58\x83\x8f\x67\x28\x59\xf2\x7a\x59\x28\xd8\x36\x4e\x31\x47\xc1\x5d\x0c\x96\x08\x7a\x43\x85\x8e\x51\x52\xd6\x21\xf6\xf7\xbe\x1b\xaa\x09\x4d\x36\xe6\xc8\xe4\x0c\xc2\x45\xfa\x69\xb2\xff\x34\x46\x8b\x4f\xe5\x93\x4f\x89\xfe\x8b\x60\xf2\x04\x9d\x21\x2c\xc8\xb8\xd6\x38\x35\xa4\xce\xbe\xc9\xcd\xc6\x89\xae\x06\xc5\x56\x50\x67\x49\x4d\x57\xa5\xfa\x13\x70\x65\x3f\xe9\x2f\x69\x34\xee\x6e\xc6\x9f\x1a\x90\x4a\xc2\xe7\x57\x82\x16\x5f\xec\xe5\x8b\x3f\xb9\xbb\x1a\x7f\x12\x20\x75\xce\x2e\x95\x84\xd9\xbb\x17\x25\x59\x42\xd9\x92\x55\x66\x2a\x3f\x9b\x4d\xa7\x4f\xc4\xc1\xd4\x4b\xd7\x9a\xfd\xcd\x7e\x0f\x6e\x4c\xf1\xb2\x41\xae\x50\xea\x86\x17\xc4\x0f\x59\xfc\x04\x1f\x3a\x59\xfb\x3d\xa5\xe9\xf4\xab\xd3\x1f\xab\x80\x17\x0e\xe5\x36\x86\x6b\x77\xe3\x5f\xc7\xbb\x91\x4d\xf1\x34\xff\x6a\x79\x80\x21\xdc\xb4\x25\xa4\x33\xf8\x69\xbc\xff\x34\x41\x67\x0f\x96\xcd\x68\xa2\x04\xdb\x40\xed\x21\x64\xb0\x4b\x97\xb0\x19\x48\x96\x27\xf6\x12\x90\xa4\x85\xd0\x52\x81\xf7\x9f\xe4\x19\x3a\x20\x34\x6f\x32\x99\xc7\xb1\xa9\x47\xea\xc7\x6e\xb3\xb1\x0e\x1e\xfb\x4a\x7b\x61\xb3\x8a\x48\xd2\xa6\x10\x3a\xd4\xd7\x6a\x7a\xbb\x66\x8a\x46\xb2\x29\x96\x14\x4a\x64\xee\x68\x1d\xa7\xba\x45\xb4\xe4\x9b\x4d\x11\x41\x8c\x22\x9d\x2b\xd2\xa2\x4c\x5c\xc2\x5b\x92\xb3\x4f\xf2\x09\xfe\x24\x9f\xec\x3f\xc9\xf1\x19\x2e\x88\x41\x45\x2e\xb2\x26\x4f\xb3\xa6\x55\x02\xd9\x6a\x46\x66\xd0\xb4\x4c\x2a\x51\x36\xcd\x73\x84\x8f\xda\x66\x79\xee\x47\x7b\x08\x72\x3c\x43\x28\xef\x24\xa8\x38\xe2\x6a\xb7\x57\xd0\x5a\xe0\x91\x48\x05\x3a\x2d\xc4\x34\x64\x34\x0b\x8b\x4f\xe5\x76\x49\x07\x2b\x93\xc0\x98\x90\x8c\xb6\x69\x83\xe1\xb2\xd9\xfe\x31\xc0\x60\x12\xec\xbb\x42\x0b\xd8\x1b\x49\x94\x5e\x67\x8a\x29\x4a\x9b\xa3\xae\xb1\xed\x9b\xe9\x3e\xea\x89\x54\xe8\x80\xb3\xfc\x41\x41\xd1\xc6\xa1\xb6\x67\xc3\x5a\x58\x8a\x81\xa0\x44\xe3\x4d\x07\x7c\x93\x66\xcb\x07\xe3\xfc\x60\x9d\xa9\x7c\x4c\xf8\x13\x08\x26\x96\x34\x36\x99\xe5\xe6\x86\x02\xb2\x70\x03\x0b\xfb\x97\xe0\xba\x01\x66\x44\xb9\x7c\x14\xd7\xbd\x34\x57\xb4\xa7\x9b\x52\x87\xc8\x3e\xbd\x95\x44\x04\xe1\x43\x49\xea\xa3\x92\x5c\xeb\xb8\x3e\xc0\x31\x43\x8b\x6c\xcc\xf0\x34\x4f\xff\x05\x19\x6e\xb0\xc4\x25\x72\x7a\x45\x08\x29\x17\xd0\x1d\x0a\xf0\x6c\x9a\xbb\x73\x86\x09\xe1\xd9\x2c\x47\xbe\xe2\xf8\xd0\xb0\xb1\x1f\xe6\xae\xa7\x98\x41\xbe\xc3\x8c\x32\x87\x7e\x6e\x90\x0b\x1b\xec\x11\xdd\xc0\x40\x07\x4d\xa7\xe9\x36\xa3\x6f\x30\x3d\xf8\x34\xf5\x57\xf2\xba\x50\xeb\x64\xc3\x6a\xfc\xb3\x7d\x5c\x55\x9c\x0b\xfc\x93\x6b\x2f\xee\xf0\xdf\xc8\x50\x52\x69\xed\xd2\xf0\xfd\x45\x6f\xcf\xf0\x3f\x48\x06\xce\xcb\x6b\x0a\x30\xb8\x14\xac\xd4\x89\x1e\x06\x2f\x98\xa0\x2b\x7e\x07\x72\xfc\x47\x32\xc5\x94\x92\xe9\x9c\xd2\xa7\xff\x70\x72\x36\xa7\x74\x4c\x66\x88\xad\xe0\xdf\xe2\x78\xfa\x94\xd4\xc5\x0d\xbb\x2e\x14\x17\xc9\x56\x52\xf1\xec\x5a\xdb\x47\x2f\xbc\xff\xc8\x28\xcd\x11\xda\xfd\x91\xcc\xac\xf5\xb7\x77\xeb\xb0\xa2\xe4\x6f\x71\xec\x2c\xe7\x5b\xc1\x37\x4c\x52\xcc\x29\x51\x74\x71\x5a\x98\xef\x74\x2a\xb8\x18\xa9\x74\x80\xaf\xd5\xa0\x0f\x24\x11\x54\xf2\xea\x86\x42\x94\xa8\x35\xad\x61\x38\xc3\x28\x86\xb6\x88\xe8\x70\x48\xff\xdd\x65\x24\x55\x97\x6c\x43\xf9\x56\x0d\xc2\xc4\x7f\xd4\x50\x31\xa3\x24\xe8\x75\xe0\x7c\x49\x91\x99\xd8\xd0\xa8\x79\xc7\xb3\xa2\x69\xfe\x4e\x85\x64\xbc\xee\x8c\xeb\xeb\xf7\x2f\xcf\xa3\xd9\x14\x20\x84\xd9\x01\xd7\x01\xcc\xf6\xee\x1a\xa4\x91\xaf\xab\xf1\x55\xa4\x10\x52\x6b\xc1\x6f\xa3\x9a\xde\x46\x97\xf7\x0d\x3d\x17\x82\x0b\x08\x9e\x17\x75\xcd\x55\xb4\x2c\xaa\x4a\x9b\xd9\xaa\x90\x32\x2a\x64\x54\xb4\x14\x02\x74\xc0\xa2\x87\x73\x78\xc7\x54\x2f\xe6\xc5\x90\x1f\x55\x3a\x4c\x9d\x83\xdb\x12\x07\x4f\x68\xbd\xdd\x50\xa1\x83\x3e\x12\xbe\xec\xf7\xa3\x19\x36\x07\xd5\x2b\x76\xbd\xb5\xfd\xa3\x29\x06\x37\x45\xb5\xa5\x40\xc7\x6c\xa6\x5a\x79\x2b\x98\x72\x7d\x08\xbb\x88\xd8\x8a\xec\x5b\xc1\x1b\x2a\xd4\x3d\xa4\x98\x9b\x53\x14\xde\x86\x6c\x5d\xc5\xb5\x77\x41\x48\xc7\x9f\x50\x75\xf5\x65\xcc\x11\x66\xa6\x4d\x27\xc2\xea\x70\x80\x08\x37\x7d\x8e\xea\x90\xd8\x87\x50\x3a\x90\xa4\x8b\x87\x70\x50\x78\x67\x50\x4f\x39\xee\x88\x4c\x47\x53\x1c\x52\xa8\xdf\x3d\x45\x26\x2b\x4e\x4d\x29\x9a\x63\x7a\xc0\x92\xfa\x53\x2f\x9d\x35\x5f\xd7\xfb\x7d\x28\x87\x6d\x65\x0a\x73\x32\x9b\xf3\x93\x18\x72\xce\xc7\x63\xe4\x07\x31\x8d\xaa\x0a\x82\x49\x9e\x63\x85\x1c\xf4\xae\xbc\xbe\x2e\xe4\xc5\x6d\xed\x69\xb0\x17\x81\x35\x2b\xe2\x18\xd2\x8c\xe9\xcc\x84\xe5\x5d\x85\xfc\x80\x4b\x4a\x32\x73\xe0\x38\xb1\xa1\x2e\xb6\xa7\x8f\xf6\x67\xa2\x43\x5e\x93\x14\xb5\xbd\x36\x41\xd2\x2d\xb6\xcf\x9e\x28\xfa\x5e\x1f\xcb\xd8\x56\x3b\xc2\x9d\x1a\x86\x2f\x5d\xab\x9f\x68\x6c\xb1\x1d\x62\x4f\x42\x6c\x8b\xed\xce\x71\x41\x49\xe9\x63\xe0\x3f\x23\x5c\x51\xb2\x7b\xf1\xea\xe5\xdb\x14\xac\x2a\xd6\x00\xfc\xfc\xd5\xc5\xf3\xbf\x7e\x7c\xf9\xfe\x3c\x05\xcb\x8a\x2f\xbf\xdc\x32\x49\x01\x7e\x7e\xf1\xe1\xcd\xe5\xf9\xbb\xb0\x93\x6f\x6b\x45\x45\x37\xe6\x80\x57\xc3\xda\xa0\x60\x10\xb0\x99\x42\xb6\xf8\xfd\xd7\xfa\x16\xe1\x4b\xba\x3b\xcc\x6b\x9b\x29\x63\x85\x86\x0a\x0e\x03\x26\x44\x67\x3e\x54\xaa\xa3\x6c\xbb\x76\xa9\x3f\x3a\x58\x30\xf6\x8d\x70\x97\x87\xdb\xd7\xe4\xca\x1c\xce\xac\x99\x44\xfd\x72\x19\xb1\x97\xbe\x54\xf2\x83\x8d\xbf\x25\x16\xbd\x5c\x7d\x17\x94\x12\xd3\xd1\x0c\xb7\x25\x5c\xfd\xd2\x2b\x30\xa4\x59\x7e\x38\x2a\x8c\xdb\xab\xcb\xbf\xfd\x73\x4b\xc5\xfd\x42\x7b\xba\x94\x87\xe5\x3e\x6d\x0b\x99\xef\x66\xba\x9b\x3d\x50\x1c\x27\xbb\x03\xee\x1d\x14\x1f\x21\x1d\x94\x36\x45\xf7\x8c\x06\x52\x69\x8a\x76\xf5\x29\xfc\x8c\xe6\x27\x8c\xe8\xf5\xee\xf7\xbb\x43\x08\x7a\x21\x7a\xdd\xe9\xce\x84\x37\xfd\x2a\x6b\xef\x68\x7b\x98\xae\x47\xcf\xbb\x75\x2e\x9d\xd2\x03\x1e\xc6\xf7\xf1\x33\x6f\x97\x72\x4f\x94\x4f\xb9\x8f\x70\x1b\x3e\xb2\x0a\xcf\x90\x54\xc2\xeb\x57\xbc\x28\x51\x1c\xfb\x47\x58\x07\x41\x57\xed\x63\xb1\xba\xab\xa0\xe1\xda\x55\x71\xfc\x7a\x56\xf8\xdc\x8d\xbb\x86\xf4\x98\xd0\x2b\x25\xcd\x1b\x57\xa7\xb5\x18\x0c\x57\x78\x07\x4a\x50\xa4\x69\x73\x2b\x6d\xdc\x33\x73\x49\x00\xd8\x65\x01\xb6\x66\xfa\x54\x91\xde\x38\x0b\xa8\xd5\xe1\x70\xc0\x76\x52\x69\xc5\xfc\xe1\x59\x6f\x87\x66\x0d\xe1\xfb\x30\x88\x97\x83\x0b\x0f\x55\xb5\x1f\x86\xf1\xae\x07\x23\xd7\xee\x0c\x76\xd7\xb3\x69\xf2\x41\xb1\x4a\x92\xf0\x84\x81\xf4\x83\xc1\xc5\x75\xc5\xaf\x8a\xca\xd5\xa9\x91\xfb\xf4\xc4\x4c\xc3\xab\x20\xf8\x96\xa4\xa4\xba\xc1\x2b\x04\xd9\xb5\x5d\x6d\x34\x8b\x7b\xbb\xa1\x9d\xde\x51\xf9\xdd\x9c\xdd\xb9\xc3\x9d\x90\x98\x03\xf6\x87\x44\xfd\xd6\x56\x42\xd3\x9d\x5c\xb3\x95\x4a\x77\x46\x80\xd3\xd9\x74\x8a\x69\xb7\xca\xaa\x1e\x88\xdd\xc2\xc4\x81\x13\xd5\xcf\x09\x4c\x8e\xd1\xbf\x7a\xc1\x74\x3e\xdd\xdd\x08\x77\x69\x86\x20\xa1\x98\x37\xa4\xee\x92\x0e\x97\x9c\xb5\xee\x4a\xbb\xbd\xde\xd1\x7d\x49\x64\xff\xa4\xbe\xd0\x0d\x47\x87\xf2\xb8\x22\x3b\xe3\xc2\xd2\xc6\x98\x9c\x12\x8b\xac\xd4\x81\x7f\x5d\xf6\x5a\xc6\x22\x2b\xf2\x49\x93\x15\x39\x0a\xcf\x3c\x9d\xed\xb4\xe6\xaa\xc1\x95\x76\xdd\xed\xf5\xf3\xc3\xc1\x9d\x94\x7a\xbe\x7d\x73\xc2\xb7\xbf\xf8\x11\xd3\x03\x6e\x84\xd9\xbf\x0b\xf7\x01\x8b\x9f\xf4\xe7\x47\x98\xdd\xdd\x11\x57\xa7\x67\x9b\xf6\xcb\x0d\x1f\x93\xfa\x13\x95\x79\xd0\xd4\xf9\x06\x53\x25\x84\x9c\x08\xc8\x91\x3f\xd9\xbe\x3f\x9d\x8d\x87\x26\x63\xe5\x4f\x4a\x31\x47\xf3\x10\x11\xc2\xe6\xce\x3d\x27\x8d\x60\x5c\x30\x75\x6f\x2a\x26\x7d\xee\x61\x2d\xcc\x82\x6d\x0a\x71\x7f\x22\x47\x9c\x34\x19\x6d\x53\x48\xfd\xfc\x94\x65\x34\x8f\xe3\x91\x4a\xa8\x5c\x16\x0d\xfd\xc8\xd4\xfa\x9d\x47\xc5\xd0\xf0\x13\xd4\xe3\xb0\x1e\x87\x74\x64\x69\xef\x51\x73\xa4\x63\xbd\x25\xd7\xa8\x0d\xad\xd3\xa5\x97\xb4\x2f\x35\x35\x69\x32\xde\x43\xe1\xbb\xaf\xa0\x50\x93\x5f\xa1\x9e\x63\x50\x98\xc0\x10\xb2\xbb\xb0\xd5\xde\xba\x42\x2d\x86\x1c\xd7\xe8\x70\x78\xe4\x1a\x43\xab\x59\xa6\xe0\x92\xf9\x20\xac\x2f\xf6\x14\x2d\x40\x4b\x25\x48\x81\xe3\x2b\x98\x37\xad\x8c\xca\x4c\xe5\xe6\x64\xf7\xf4\xdc\xd9\x64\xb9\xd8\x6f\x55\xda\xae\x21\x7a\xa5\x77\xa7\x71\x39\x76\xbb\x9e\x7e\x8b\x4f\x64\x2f\xed\xdf\x91\x3c\xe0\x2f\x94\x36\x97\xfc\x9a\xaa\x35\x15\x5e\xb2\xff\xcf\xef\x32\x23\xde\x14\x68\x19\x77\x02\xa3\xad\x47\xe0\xfc\x42\x5b\x73\x64\x67\x04\xf9\x19\x37\xde\x54\xf4\xd1\x6f\x79\x66\x6e\xeb\x35\x0b\x47\x65\x67\x4d\x4b\xdd\xd8\xb7\x1f\xcd\x83\x97\x7a\x78\x26\xf3\xa7\x02\x32\x6d\x3c\x74\x20\x7f\xc4\xd9\xac\xcc\x89\xeb\x9d\x70\x6d\x44\x30\xcf\xca\xfc\x3b\xdd\x24\x1f\x9d\x20\xb5\x0c\x6b\x4b\x62\xee\x66\x78\xce\x7d\xfb\x98\x4d\xf0\xc7\x09\xa6\x3e\xfc\x22\x54\xe2\xf0\xcc\x59\x83\x03\x18\x84\xfb\x72\x7c\xa1\xb1\xd6\x99\xa3\xfb\xb2\x8a\xad\x20\x90\xe6\xcb\xc5\xce\x83\xd5\x26\xf1\xad\xc9\x89\x99\x48\x4c\x14\xf9\x9e\x56\x74\xa9\xb8\xd0\x0c\x1e\xd5\x1d\x68\x7b\x25\xd4\x7c\xee\x75\x32\x71\xe0\x13\xa8\x7e\x49\xf3\xe3\xb3\x77\x6f\x5e\xbe\xf9\x4b\x1a\x7d\x36\x14\x78\xfc\x3e\x47\x9b\xad\x54\xd1\x15\x8d\x96\x6b\x56\x95\x11\x5f\x45\x4c\xc9\xc8\x42\x8d\xdc\xa0\x11\x40\x98\xba\x03\xd1\x87\x45\x26\x30\x50\xa6\x4e\xeb\x64\xae\x24\x4d\x20\x73\x85\x97\xa9\x9e\x86\x74\x32\x25\x10\xae\x48\x71\x5a\x8e\x5c\xe9\xc6\xe0\xe3\x15\x73\x15\x57\xf1\x57\xfc\xd6\xdf\x64\xc0\x6b\x3d\x24\x14\xbb\x6b\xdd\x70\xe5\x3f\x64\x71\xba\xb8\x25\xaf\x60\x8d\xb2\x2a\x9f\x97\xd9\x75\x3e\xd9\x3e\x95\xd9\x26\x1f\x92\xa3\x4d\x3e\x21\xba\x6f\x02\xed\x40\x84\x70\x99\x6d\xf2\xf1\xf6\x3b\x99\x5d\x3f\x30\x63\x4c\xec\x90\x89\x1e\x32\x60\x26\x96\x27\x93\xac\xcf\xb8\xb2\xf3\xca\xac\xca\xcf\xbe\x99\x6c\xcf\xbe\xc1\xb7\x44\x0d\xf8\x20\x7c\x1f\xde\x63\xbc\xed\xbe\xde\x59\x99\xaf\x8d\xf0\xf9\x51\xb7\xff\x28\x69\xd5\xfb\x28\x09\xdf\x90\xab\xc9\x10\xbd\xf7\x93\x73\xaf\x96\x37\xe4\x27\xf8\x2b\x94\x59\x95\x4f\xb6\xf8\x06\xe1\xa9\xa6\xc6\x48\x4e\x7b\xec\x1a\x90\x67\x3a\x08\x64\x3a\xc3\x69\x28\x64\x78\x83\x4d\x45\x4f\x68\xf3\x06\x6f\xac\xad\x66\x78\x8d\x01\x40\x98\x69\xbd\xc4\xd4\xdb\xbb\xec\x6e\x62\xa6\xe7\xc0\x5e\x95\xf2\xaa\xfa\x7f\xbf\xe2\xbe\xd9\x0a\x7e\x79\x40\x47\xcd\xf9\x45\xa8\x94\x6c\x05\x69\xe2\xee\x61\xc5\x71\x78\x79\x8a\x90\x81\x3b\x4a\x7d\x6d\xe6\xff\x89\x43\x1f\x08\x2b\x90\xb9\xda\xf3\x90\xf6\xd4\xe4\x0e\x32\x84\x1f\x54\xb0\x59\xbe\xdf\x03\x80\x1b\x92\xe5\xfe\x4c\x4a\x25\x57\x74\x5d\xdc\x30\x2e\xec\xe1\x54\x54\xd1\xc4\x94\x0e\x1a\x92\x31\x5c\xe7\xc1\x21\x95\xee\xea\x8a\x05\x0d\xf9\x27\x64\xe8\xb8\xfb\xb8\xa4\x60\x46\xe1\xd1\xd4\x0f\xf4\x67\x5b\x0d\xe9\x16\x9e\x77\xb7\xd3\x4f\xfc\xae\xc4\xa5\xd9\x25\x36\x22\x44\xee\xf7\x8d\x2b\x2c\x10\x42\xca\xf1\x2c\xd8\x9b\xaf\x32\xc5\xec\x42\x71\x1a\xfe\x54\x64\xe8\x82\xd8\x8a\xfc\x8c\x37\xa4\x2d\x8d\xb3\x38\x5e\xc1\xc2\xde\x0a\x47\xdf\xad\xa0\xbd\x5d\x8f\xf6\xfb\x2e\xba\x70\x43\x4c\xfb\x53\x3d\xc2\x0e\xde\xef\x7d\x49\xdc\x0d\xb0\xa6\xc4\x02\x51\xbc\xd1\x03\xba\x72\xb8\x1b\xa3\xdb\x0d\x0c\x37\x18\xaf\x49\x08\xdb\x7e\xeb\x81\xf0\x92\xf4\x90\x72\xdf\x69\x21\x7c\x4d\x02\x20\xe6\x8b\x11\x84\xb7\xa4\xbf\x38\x6f\x61\x5f\xf5\xc8\x5c\x1f\xd1\xb4\xec\x11\x70\x7d\x8c\xed\x16\xdf\x7e\xc5\xbf\x33\x6d\x6f\x46\x23\x65\x34\xe7\xef\x85\x60\xa6\x5e\x23\xe3\x18\xde\xda\xef\xae\xdd\x97\x1e\x66\x69\xdd\xe4\xce\x98\x85\x59\x7b\x74\x3c\xe8\xda\xb5\x75\xa3\xb6\x68\x0e\x37\xfb\xfd\xd5\x7e\x7f\x6f\x5d\xb9\x53\x51\x32\x9a\x62\xd3\x61\xaf\x20\x34\x59\x39\x9e\xe5\x08\xdf\xc7\x31\x14\xe4\xaf\x50\xa0\xfe\x05\x48\x36\x86\xc2\xdc\x3a\x17\x29\x00\x03\x56\xd7\x7d\x11\x78\x2c\x3e\xef\x07\xb5\xfa\xf1\x1b\x87\xc8\xdc\x26\x1c\xb4\x3a\x14\xdb\x8a\x9d\x0d\x10\x0f\xd8\xab\x88\x2f\xe4\x3d\x1a\xf4\xb5\x5f\xce\x1c\xb0\x31\x5e\xde\x08\xfe\x4f\x68\x04\x67\xff\x59\xc2\xd8\x79\xe5\x9a\x30\x4f\xa8\x20\xac\x97\x1f\x3e\xee\x95\x39\x32\x79\x23\xe9\x84\xe5\xe4\xd6\x48\x70\x49\xbb\xe7\x85\x73\x22\x32\x9e\x4f\xa0\x5c\x98\x9e\xa3\x28\x30\x4f\xa7\xfd\xbd\xbc\x83\x03\xd7\x3a\xc9\x52\x87\x42\x3a\x98\x5b\xb3\x92\x7a\xde\xfc\xbf\x47\xa3\xe0\xc7\x62\x38\x0d\x05\x60\x70\x94\x37\x1e\x47\x71\x6a\xd0\xbc\x70\x72\x39\x0c\xf5\xb4\xfe\x75\xb2\x80\xbd\x2c\x57\x6c\xe8\x01\x05\xee\x41\x7b\x27\xff\xdd\xc9\x53\xa3\xf3\xfb\xbd\xfd\xe2\xe4\x3b\x67\x17\xf4\xbb\xe2\xcd\x77\x5e\xf3\xf5\xbb\xe9\x78\xea\xec\x89\xa1\x76\x6a\xc0\x6b\xda\x3a\x3a\xec\xbb\x39\x62\x4d\xba\x5b\xc9\x19\xb8\x9b\xf0\xad\x9a\xf0\xd5\xa4\x43\x03\xe4\x04\x00\x13\x62\x1a\x68\xb3\x47\xa0\xcd\x7e\x17\xb4\xd1\x2c\x4c\xe8\x97\xf6\x3b\x0e\x73\x5b\xb3\xdd\xc1\x6f\x7f\x5f\x86\x7e\x67\x12\x97\x7b\x5c\x9f\xfa\x80\xe6\xdf\xd8\x8e\xe0\xba\x68\xb8\x13\xd7\xcd\xf6\xd9\x72\x49\x2b\x2a\x8c\x7d\x9b\xb7\x75\xef\xe6\xf8\x5a\x40\x17\x43\x1f\xcd\xf9\x1c\xd9\x7a\x60\xb4\xe1\x37\xb4\x8c\x14\x8f\x3e\x87\xf4\x7e\xee\x2e\xf7\x14\x75\x19\xdd\xb2\xaa\x8a\x6a\xae\xec\xbd\x9e\x46\xeb\x3d\x2d\x23\x56\x47\xab\xad\xda\x0a\x1a\xdd\xd8\x43\x34\xa9\x83\x71\x5b\xd6\x4a\x7e\x93\xfe\xe2\xbc\xc4\x25\x2e\xba\xab\xfd\xcd\x42\x1d\x13\x90\x36\xb8\x22\x43\x15\x0c\xbc\x22\xd7\xb0\x42\x78\x43\x76\xfe\x4e\x6b\x5a\xb7\xd7\x5b\x0f\x78\xed\x3e\x51\xf9\x19\xd6\xce\x4d\x29\xde\x98\x37\xe3\x87\xdc\x47\x2a\xfa\xdd\x3b\x20\xfb\x11\x8b\x6e\xb1\xfe\xeb\x80\x97\x24\xf0\x32\xdc\x7f\x01\xe2\x33\xc3\x6d\x50\x2d\x60\xad\x99\x70\x91\xf9\x15\xe9\x5f\x99\xd5\x7a\x51\x06\xe0\x96\x8b\x89\xff\xfa\x6e\xec\x3f\x3f\x4d\xcd\x27\xa9\x58\x76\x70\xb7\x7a\x94\xb1\x32\x63\xf7\x25\x6a\x6a\xbf\x4e\xc5\x45\x1c\x5f\xa1\x4d\x76\x95\x13\xbb\x4a\x55\x28\xfa\xe7\x12\x82\xb1\x1c\x83\xe6\x0e\x47\x60\x5c\xda\x87\x29\x02\x78\x93\x2d\x73\x32\xc5\x9b\x6c\x6b\x7e\x12\xbd\x67\xcf\xd7\x45\x7d\x4d\x49\x80\x63\xf7\x71\xe3\x6d\x1f\xd1\x59\x3a\xc3\xf7\x3d\xa4\x66\xe9\x6c\x6e\x80\x96\x4f\x6e\x2d\x58\xf9\xe4\xbe\x0f\x78\x39\x06\x1a\x8b\xad\x39\x58\x3e\x27\xbb\xff\x0a\xee\x2c\xff\x57\x1a\x58\xc9\xe0\xab\xa0\x4e\x0d\x9d\x9b\x3b\xef\xe9\x66\x7b\x73\xcf\x77\x6f\xda\x86\x36\xa0\x7f\x1f\xf6\x1f\xc5\xf4\xfd\x31\xc6\xaf\x1d\x4b\xdb\x68\x8a\xef\xba\x1d\xbe\xf7\xdb\x79\xc0\x9d\xba\x79\x7d\xff\xff\x8f\x5a\x6c\x47\xd3\x2f\x83\x6e\xd9\xe3\xfc\xdb\x60\x6f\x9f\xe0\x30\x4d\x89\xe3\xf0\xfc\xa2\x4f\x4d\x7b\xd2\xf5\x0b\xec\x4f\x1a\xa0\xda\x9e\x1d\xa4\xfd\xb3\xd6\xf0\x23\xc9\x0b\x58\x63\x85\x29\xc2\x0d\xb9\x81\x3c\xbc\xfc\xa1\x9b\x31\xff\xfa\x17\x15\x27\x43\xfc\x67\x14\xed\xa5\xb8\xfe\xb5\xc8\xde\x95\x76\xdc\x20\xfc\x0b\x54\xb8\xd3\xec\xee\x0b\x08\xf3\xa9\xcb\xc9\xbe\x59\x13\x72\x38\x1c\xf0\x8a\x1e\xd0\xfc\x0f\x67\x67\xff\x1d\xd9\xff\x65\xea\x75\xd1\x34\xac\xbe\xfe\xf0\xee\x15\x71\xd5\x85\x0d\xab\x93\xdf\x64\xb2\x29\x9a\x3f\xfc\x6f\x00\x00\x00\xff\xff\x10\xa0\xcc\x28\xf4\x4a\x00\x00") - -func pagesAssetsJsPopperMinJsBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsJsPopperMinJs, - "pages/assets/js/popper.min.js", - ) -} - -func pagesAssetsJsPopperMinJs() (*asset, error) { - bytes, err := pagesAssetsJsPopperMinJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/js/popper.min.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsStylesBootstrap400Beta2MinCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x6b\x8f\xe3\x38\x92\x28\xfa\xfd\xfc\x0a\x6d\x16\x0a\x5d\x39\x6d\xb9\x24\xf9\x99\x4e\x54\x63\x66\x1a\xb3\x38\x03\x4c\xef\x87\x9d\xb3\xc0\x05\xfa\xd4\x05\xf4\xa0\x6d\x4d\x49\x96\xae\x24\x57\x2a\xc7\xf0\xfe\xf6\x0b\xbe\x24\x3e\x82\x94\xe4\x74\x76\xcf\x01\xce\xd6\x4e\xa7\x4c\x05\x23\x82\x8c\x60\x44\x90\x22\x83\x9f\xff\xf0\x6f\xff\xc3\xf9\x83\xf3\xe7\xa2\x68\xea\xa6\x0a\x4b\xe7\xfb\x72\xee\xcd\x3d\x37\x42\x4d\x38\x0f\x9c\x4f\xc7\xa6\x29\xeb\xdd\xe7\xcf\x07\xd4\x44\x1c\x66\x1e\x17\xf9\x23\xae\xf5\x73\x51\xbe\x56\xe9\xe1\xd8\x38\x81\xe7\xfb\x6e\xe0\xf9\x1b\xe7\x7f\x1d\x91\x80\xed\x4f\xe7\xe6\x58\x54\xb5\x11\xf8\x25\x6d\x1a\x54\xcd\x9c\xbf\x9e\xe2\x39\x06\xfa\x5b\x1a\xa3\x53\x8d\x12\xe7\x7c\x4a\x50\xe5\xfc\xf2\xd7\xff\x25\xb0\x90\x36\xc7\x73\x84\x89\x7f\x6e\x5e\xa2\xfa\x73\xc7\xcf\xe7\x28\x2b\xa2\xcf\x79\x58\x37\xa8\xfa\xfc\xb7\xbf\xfe\xfc\x97\xff\xf8\xfb\x5f\x30\x7f\x9f\x77\x55\x51\x34\x17\xd7\x8d\xb2\x33\xda\x7d\xf0\xbc\x4d\xb4\xdf\x3f\xbb\x6e\x7a\x4a\xd2\x43\xb1\xfb\xb0\x5e\xfb\xde\x3e\x78\x76\xdd\xf2\x5c\x95\x19\xda\x7d\x58\xef\x97\x41\xec\xe3\x82\xf4\xf4\x6d\xf7\x01\x6d\x17\x68\x1b\x3f\xbb\x6e\x85\x92\xdd\x87\x24\x5e\xac\x96\xab\x67\xd7\x2d\xaa\xf0\x74\x40\xbb\x0f\xfb\x64\x83\xfc\xe5\xb3\xeb\xbe\xa2\x2c\x2b\x5e\x76\x1f\xf6\xfb\xd8\xf7\x36\xcf\xae\x7b\xa8\x10\x3a\xed\x3e\x04\xdb\x70\x43\x6a\x34\x28\xcc\x76\x1f\x02\x2f\x7e\x7a\xc2\xaf\xe3\xd7\xf0\xb4\xfb\xe0\x6f\xc2\x20\xda\x3e\xbb\xee\xcb\x31\x6d\x30\x3a\xc2\xdb\xa1\x0a\x5f\x77\x1f\xb6\xeb\x2d\x7a\x5a\xb3\x9f\x6e\x12\x56\xdf\x76\x1f\x16\xcb\x45\xb8\xf4\x30\x73\x55\x9a\x87\xd5\xab\xd0\xa0\x1a\xc5\xc5\x29\x21\x65\x5d\xcd\xfa\x1c\xc7\xa8\xae\x05\x2e\xd2\xd3\xbe\x10\xc9\x86\xd5\x29\x3d\x1d\x04\xb6\x13\xdc\xae\x4a\x68\x69\x86\xc5\xb5\xfb\xb0\xdf\xee\x9f\xf6\x21\x01\x90\x18\x89\x2a\x14\x7e\x2b\x8b\xf4\xd4\xb8\x6d\xbd\x53\x4a\xea\x7c\xb7\xda\xac\xcb\x56\x2e\xcd\x93\xdd\x66\xbd\x55\x4b\xb3\xc3\xee\xe9\x29\x50\x4b\xdb\x6c\xe7\x07\x9e\x47\x8a\xf7\xc5\xa9\x71\xf7\x61\x9e\x66\xaf\x6e\x1d\x9e\x6a\xb7\x46\x55\xba\xdf\xb9\x61\x59\x66\xc8\xad\x5f\xeb\x06\xe5\xb3\x3f\x67\xe9\xe9\xdb\x2f\x61\xfc\x77\xf2\xf3\xdf\x8b\x53\x33\x7b\xf8\x3b\x3a\x14\xc8\xf9\xaf\xbf\x3e\xcc\xfe\xb3\x88\x8a\xa6\x98\x3d\xfc\x4f\x94\x7d\x47\x4d\x1a\x87\xce\x7f\xa0\x33\x7a\x98\xfd\xa9\x4a\xc3\x6c\xd6\x23\x9d\x3d\xfc\x09\x23\x75\x7e\x2e\xb2\xa2\x72\xfe\x92\x17\xff\x48\x1f\x7a\x3c\x7a\xc1\xdf\x5f\xf3\xa8\xc8\x1e\x14\x26\xf3\xe2\x54\xd4\x65\x18\xa3\xdd\xc3\xdf\xff\xfd\x97\xe2\x54\xb8\xff\x89\x0e\xe7\x2c\xac\x1e\x66\xbf\xa0\x53\x56\xcc\x7e\x29\x4e\x61\x5c\xcc\x7e\x2e\x4e\x75\x91\x85\xf5\xec\xe1\x6f\x69\x84\xaa\xb0\x49\x8b\x93\x83\xe1\x1f\x66\x0f\x3f\x17\xe7\x2a\x45\x95\xf3\x1f\xe8\xe5\x61\xd6\x21\xbc\xfe\x31\x47\x49\x1a\x3a\x65\x95\x9e\x9a\xcb\x1f\x66\xbb\x5d\xb8\xc7\x63\x68\xb7\x8b\xd0\xbe\xa8\xd0\xa5\x41\x6d\xe3\xd6\xc7\x30\x29\x5e\x76\xa7\xe2\x84\xfe\x2d\xcd\xcb\xa2\x6a\xc2\x53\xf3\x1c\x15\x2d\xfc\xe6\x1a\xce\xc2\xdd\xf7\xb4\x4e\x1b\x94\x50\x04\x09\x8a\x0b\xca\xce\x8e\x8c\xc5\x2c\x3d\xa1\x6b\x18\x45\xd5\xaf\x4d\xda\x64\xe8\x2b\x23\x7b\x89\x8b\x53\x83\x4e\xcd\xee\xc1\xf9\xf4\xe0\x84\x4d\x53\x7d\x22\xef\x1f\x9d\x87\xc7\x87\x6b\x59\xa1\x0b\x51\x6f\x97\xf6\x45\x59\x21\xf7\xa5\x0a\x4b\x81\x70\x94\x15\xf1\xb7\xff\xef\x5c\x34\x68\x86\xa1\xa3\xa2\x4a\x50\xb5\xf3\xcb\xd6\xa9\x8b\x2c\x4d\x9c\x0f\x4f\x4f\x4f\xcf\x65\x78\x40\x54\x35\xdc\xf4\x54\xa7\x09\xda\x85\xdf\x8b\x34\xb9\x36\x47\x14\x26\x97\x24\xad\xcb\x2c\x7c\xdd\x35\x61\x94\x21\x17\x17\xa1\xca\x3d\x54\xc5\xb9\xbc\xa6\xf9\x61\xd6\x54\x17\x53\xfd\x63\x30\x3b\x2e\x66\xe5\xa5\xa8\xca\x63\x78\xaa\x77\x8b\xe7\x97\x34\x29\x5e\xea\xdd\x82\xbe\x12\x2b\x92\xe6\xb2\x7a\xf3\x53\xf8\x3d\x0a\xab\x8e\x32\xee\xcc\xeb\x3c\x0a\x93\x03\xd4\x02\xcf\xf3\xae\x73\xc2\x1c\x7b\xe9\xc6\x45\x96\x85\x65\x8d\x76\xfc\x41\xe8\x10\x0a\xe9\x34\xc9\x8c\x3f\x1d\x2f\x51\x18\x7f\xc3\x0d\x3a\x25\xb8\x6a\x51\x11\x6b\xa1\xd5\x71\x29\x76\x94\xf4\x95\x85\xa2\x23\xc0\x59\x92\x24\x02\x96\x2b\xa0\x4c\x44\x63\xd2\x7f\x62\x43\xc1\x78\x8f\x8a\xf6\x7a\x6c\xf2\xec\x22\xa8\xfb\xae\x1f\x3e\xcf\x58\x51\xdc\x23\x22\xa6\xc3\x9f\xfb\xab\x67\xf7\x05\x45\xdf\xd2\xc6\xa5\x7a\x99\xfe\x13\xb9\x61\xf2\x8f\x73\xdd\xec\x7c\xcf\xfb\xf8\xec\xe6\xb5\xe5\x4d\xf1\x1d\x55\xfb\xac\x78\x71\xeb\xe6\x35\x43\xbb\x3a\xae\x8a\x2c\x8b\xc2\xaa\x47\x1a\x96\xee\x31\x3d\x1c\x89\xa9\x62\x9d\xd3\x54\xe1\xa9\x2e\xc3\x0a\x9d\x9a\xeb\x1f\x31\x96\xef\x29\x7a\xc1\x8d\xbc\xbc\xa4\x49\x73\xdc\x25\xe8\x7b\x1a\x23\x97\xfc\xb8\x86\x55\x93\xc6\x19\x9a\x85\x58\x2d\x66\x49\x1a\x66\xc5\x61\xb6\x4f\x0f\x71\x58\x62\xe5\xc7\x8f\xe7\x0a\xcd\xf6\x45\x81\xfb\x85\x2a\xd7\xec\x48\xb4\x6b\x96\x87\xe9\x69\x76\x0a\xbf\xcf\x6a\x14\x63\xe0\x4e\x1f\x88\x52\x5f\xa3\x22\x79\xbd\xe4\x61\x75\x48\x4f\x3b\xef\x59\xec\xae\x7f\x25\xbb\x45\xf8\xc2\x9d\xbf\xf3\x2b\x94\xd3\x9f\x2f\x54\x7c\x4b\xcf\x53\xc4\xb9\x7a\x66\xfa\x17\xf8\xc1\x2a\x78\x7a\x26\x92\x0b\xb3\xf4\x70\xda\x65\x68\xdf\x3c\x83\x8a\x7a\xfd\xb5\x09\xa3\xf4\x94\xa0\xf6\xcb\x83\xeb\x3f\x7c\xdd\xed\x8b\xf8\x5c\x5f\x8a\x73\x83\x91\xef\x3c\x41\x05\x8f\x95\xa8\x71\xcc\xb6\x60\x95\x7b\x66\x2c\x78\xcf\x5c\x25\x88\xb9\x8a\x32\x74\x3d\xfa\x33\x3a\x8e\x8f\xcb\xd9\x71\x35\x3b\xae\x59\x9f\xbb\x4d\x51\xee\xbc\x67\xf6\x23\x2a\x9a\xa6\xc8\x77\xf3\x55\x85\xf2\x6b\x69\x03\xc1\xdd\x40\x2d\x5d\x12\x36\xa1\x5b\x54\xe9\x21\x3d\x85\x99\x4b\xed\xde\x4c\xb0\x81\x66\x4b\x29\x2b\x3d\x04\xe1\x24\x45\xd3\xa0\xe4\x79\x10\x20\x3e\x57\x75\x51\xed\x8e\x28\x2b\x9f\xbb\x21\x48\x18\xf5\xae\x61\x92\x54\xa8\xae\x2f\x7a\x03\x98\x58\xc9\xa8\x39\x15\x55\x1e\x66\x92\x24\xd3\xd3\x11\x55\x69\x73\x4d\xb2\x59\x91\xcd\xce\xd9\x60\x7f\x14\x99\x53\x60\x58\xe7\x8c\xc1\x1d\x52\xc9\xe9\xeb\x75\x1c\x25\xcd\x45\xd4\xa0\x8d\xe7\x5d\x93\xe4\x02\xc8\x80\x13\xc1\x6a\xb3\xf3\x04\x37\xd0\x8d\x18\xc7\x73\x08\xe9\x64\x7f\xba\x08\xad\x49\x9b\x30\x4b\xe3\x6b\x34\xab\x9b\xaa\x38\x1d\x24\x72\x51\x91\x25\xa8\xba\xd6\x79\x98\x31\xfb\x44\x14\x7b\xeb\x7d\xbc\xd6\xe7\x68\x56\x9f\xcb\x4b\x59\xd4\x29\xe9\xe8\x0a\x65\x61\x93\x7e\x47\xc2\x00\xd8\xac\x3e\x4a\xbd\xe4\x3d\x7f\x47\xd8\x3c\x84\x19\xd3\xf1\x28\xac\x11\x71\x84\xf5\x39\xba\xb0\xd6\xb8\xf3\x60\x85\xf2\x2b\xc6\x8d\x7b\xcf\x9d\xe3\x5f\xe1\x85\xa9\x3f\x8b\xd1\x54\x29\x63\x87\xa1\x0f\x16\xc1\x70\x99\x14\xc8\xad\xbf\xa5\xe5\xae\x88\xfe\x81\xe2\xa6\xbe\x86\xbb\x23\x1e\x0e\x3d\xb1\xd5\x3a\x5a\x98\x55\xea\x1a\xee\x4e\x45\xf3\xe9\xd7\x63\x85\xf6\x5f\x1f\xe9\x33\x1f\x9a\x5f\x1f\x19\x16\xa6\x1a\x20\xcb\x76\x04\x74\x5c\xcf\xec\x30\x22\xc3\x6f\x25\xd5\x9b\x90\x6b\x5c\x24\x68\xf6\x2d\x4a\x70\x10\x31\xab\xc3\xbc\x94\xdc\x53\x17\x3c\xf5\x61\x94\x68\xf7\xb0\x45\xa8\xd0\xd0\x18\xe8\x2d\x4f\x78\x6e\x0a\xab\x7b\xba\x52\xaf\xa1\xa9\x72\x9a\x1f\x2e\x8a\x4a\xe5\x69\x92\x64\x88\x8f\x6c\x3e\x60\xb1\x8a\x7d\x3f\x90\x56\x93\x49\xcc\xe3\xa5\x23\x7e\x4c\x93\x04\x9d\xae\xbf\x56\x45\x86\xbe\x44\xe7\xa6\x29\x4e\x5f\x67\xe1\x2c\xac\x50\x38\xa3\x3f\x67\xe9\xa9\x3c\x37\xac\xcb\x5e\x4b\xf4\x85\x4c\x58\xbe\x3e\xce\xb2\x30\x42\xd9\xac\x46\x19\x8a\x9b\x59\x7d\xce\xf1\x34\x62\x86\x3b\x1f\x57\xbe\x10\x4f\x5c\x9c\xe3\xa3\x1b\x12\x6f\xb6\xcb\xc3\x53\x5a\x9e\x33\x22\x93\x67\xe3\x9b\xab\x3d\xb2\xb9\x32\x47\x7a\x29\xc3\x24\x49\x4f\x07\xd2\xbd\xf3\x0d\x31\x01\xbc\x88\xdb\x05\x5a\xca\x94\x99\xcd\x64\x54\x0f\xc3\xd0\xb9\x24\x8a\xa3\x15\xaf\xcd\xf1\x22\x80\x71\xdb\x46\x5a\xdb\xb9\xe4\xf4\x44\x46\x36\xb1\x33\xa0\x4f\xa0\x7d\xc7\xdb\x51\x85\x49\x7a\xae\xb1\x61\x22\xc5\x8a\xbe\xe1\x10\x8a\x99\x67\x5e\xb4\x2a\x5b\x07\xeb\x85\xc3\x07\x2e\xa9\xe1\x56\xb8\x7d\xa4\x45\x57\x51\x38\xb3\xa2\x6c\x68\x0c\xc1\xa4\xd1\x49\x01\x8c\x17\xf8\x40\xe9\x75\x96\x97\x40\x46\x5d\x24\x74\xd1\xdc\x25\x7b\x4b\xe9\xd2\x7e\x23\x76\x67\x5f\x54\x39\xd5\x3c\xa6\x34\xa8\x46\xcd\xd7\x19\xfd\x51\x9f\xa3\x3c\x6d\xbe\x72\x05\xc3\xf1\x9f\x43\xdf\x30\x0d\xbc\xf0\x66\x87\x65\x89\xc2\x2a\x3c\xc5\x68\x47\x5f\x5d\x25\xb8\xdd\xce\xcd\x8b\x7f\xb2\xce\x49\x4f\x27\x54\xcd\x44\x72\xc6\xd7\x8c\x01\xe0\x3d\x13\x90\xf6\x82\x2b\xdc\xce\x03\x06\x17\xe9\x1b\x8a\x39\x3e\xa2\xf8\x5b\x54\xb4\x5f\x67\x42\x21\x16\x7f\xf1\x15\x8e\x7e\x9f\x3b\xc4\x22\x9a\x24\x6c\x90\x84\x02\x17\x34\x69\x8e\xdc\xac\x88\xc3\x4c\x7a\x95\x17\xa7\xe6\x28\x95\x60\x40\xb0\x0f\xb3\xb4\x6e\x70\xc4\xdd\xe9\x87\x6c\x84\x2a\x44\xb4\x81\xdb\x94\xeb\x3e\x45\x59\x52\xa3\xe6\x92\xa7\x27\x1a\xe0\xee\xbc\x9e\xdf\xe7\x4e\xb9\xd8\x54\xc0\xbb\x66\xe8\x80\x4e\x89\x1c\xb8\x3e\xd3\x8a\x24\x08\xcf\xc3\xd6\x15\x7e\xaa\xa8\x64\x97\x2e\x98\x54\x5a\x00\x68\xe7\xb3\x6c\xfa\xc5\xd9\x21\x8d\x53\xae\x65\x55\x1c\x48\x54\x63\x72\xbe\xb4\xcb\x4e\xe7\x3c\x42\x15\xd6\x08\xd6\x6b\x44\xea\x6e\x5d\x62\xae\xa8\x9a\x1a\x00\x8b\x73\x23\x03\x5e\x18\x8b\xb8\x4b\x19\xf6\x1a\x85\x55\x7c\xfc\xca\x47\xbc\x5b\xec\xf7\x35\x6a\x76\x2e\x59\xa5\xd0\xc5\x24\x8c\x1b\x56\xb3\x27\x47\x0b\xdc\x18\x03\x66\x32\x6b\x26\xd8\xde\x17\x42\x3a\x41\x88\xf5\x75\xf6\x69\x86\xdc\x73\x99\x15\x61\xc2\xdb\x83\x05\xd1\x75\xb1\x79\x64\x16\xe7\x06\x9b\x08\xc8\x44\x5e\x99\x7b\xe8\x5e\x62\x45\x74\xd3\x06\xe5\xd7\x06\xe5\x65\x16\x36\x48\x9e\xfd\xfe\x4a\xfd\xd2\x57\xa9\x54\x9c\xa2\x1e\xfd\xd9\xfc\x18\xcc\xe6\xc7\xc5\x6c\x7e\x5c\xce\xe6\xc7\xd5\x6c\x7e\x5c\xcf\x8c\xd1\xbb\xae\x59\x90\x31\x64\x81\xdf\x4a\x9b\xa9\x04\xb2\xa2\x11\xfa\x47\x5f\x08\x0a\x03\x6a\xf6\x31\x4f\xc7\x40\x2c\xa7\xa5\x0b\x3c\xfd\x17\x15\x7a\xc3\xc0\x97\xb3\xe3\xf2\xa2\x6a\xfa\x15\x37\xe7\xb8\x92\xca\x03\xf6\x62\x8d\x1b\x25\xcf\xb2\xae\xf3\x0c\x85\x89\x0e\x2d\xb5\x69\xe1\x79\xd7\x39\xeb\x4d\x57\xe4\x7c\x0d\x40\xaa\xad\xef\x6b\x8a\x6d\x5b\xcd\x21\x2a\xe6\xba\x62\x0f\x2c\x27\xd6\x15\x3b\x69\x31\xae\xee\xb1\x12\x63\x30\x5f\x98\x25\x88\x61\x18\xb7\x5d\xdc\xac\x13\xd8\x6e\x4d\xa3\x3a\x44\xe1\x27\x6f\x86\xff\xcd\xfd\xc7\xeb\x9c\xcc\x05\x66\xc0\x8c\x40\x9d\xe9\x5e\xe7\x79\x58\x7d\x9b\xe1\xff\x74\xae\x63\x1e\x60\x7a\xfa\x9c\x36\xde\x6f\xd1\xe2\x3a\x27\x63\xe2\x7c\x22\x7e\x25\xe9\x02\x1c\x3a\xa3\x79\x26\x2f\x05\x97\x43\xa1\xe9\x18\x9b\x02\x4b\x06\x1d\x3c\x46\x35\x30\x1a\x30\x66\x61\xdd\xb8\xf1\x31\xcd\x92\x47\xde\x9f\x15\x1d\x25\x65\x7b\x9d\xa7\xa7\xb4\x49\xc3\x2c\xad\x73\xa1\x3f\x9e\xbc\x8f\xcf\x4a\x28\x70\x2e\x4b\x54\xc5\x61\x8d\xae\x73\x6d\x72\x06\xcc\x34\x25\x9d\xef\x2b\xb8\x74\xe1\x44\x71\x30\xb2\x20\xa4\x80\x0f\xa8\xdc\x2d\x46\x75\x6b\x8d\xff\x3b\xf0\xfc\xa5\xf3\xbf\x3d\xef\x4f\xde\xc3\x75\x9e\xe6\x07\x77\x9f\x9d\x53\x3c\xcf\x94\xbc\x95\x68\xd6\x09\x54\x73\x3c\xe7\xd1\x29\x4c\x33\x41\xc2\x44\x33\xc1\x75\x8b\x67\x70\xc1\xec\x59\x8e\x10\x19\x02\xd2\x6f\x74\x62\x19\x66\x99\x33\x0f\x6a\x07\x85\x35\x72\xd3\x13\x76\x37\xaa\x1b\x95\x18\x63\x73\x05\x58\xc2\xf4\xa5\x8b\x27\x0e\x90\x5d\x94\x46\x50\x07\xcd\x43\x6e\x59\xbe\x72\x37\xdb\x27\x4c\xf2\x9a\xf5\x9b\x97\xac\x31\x31\xa1\xcb\x2b\x94\x3b\xf3\xa5\xac\x3b\x02\x87\x51\xb2\xf4\x97\x1b\x48\x26\xf4\x43\x04\x24\x80\x6b\xf8\x93\x44\xc4\x53\xe2\x0c\x0d\x19\xf7\x0b\xdf\xa2\x64\x3c\x67\x44\x29\x34\xb6\xd8\x5a\x98\xca\x16\xe6\xea\x5b\x94\x38\x22\x05\x4f\x1c\x2d\x9e\x62\x84\x36\x9e\x47\xe6\xa1\xf2\x58\x19\x9a\x95\x82\x8c\x52\x96\x30\x36\x47\xe9\x16\x7d\x0a\x31\xd0\x51\xe2\xa2\x84\x3a\x39\x9a\x97\x15\x72\xe9\xac\x97\x4c\x02\xb1\x9a\x33\x6d\x5c\x2c\xbd\xb2\xed\xa6\xcc\xee\x2b\x9b\x1c\x5f\xe7\x78\x10\x87\x29\x0e\xd0\xf5\xb8\x92\xd9\x29\x7f\x55\x76\x51\x36\x35\x91\xa4\x44\xb2\x65\x24\xfc\x15\xd7\x90\xc8\x60\x62\xdf\x46\x3e\xf5\xe1\x2f\xf9\x08\xf5\x78\x11\xc8\xf6\x63\x71\x85\x79\xbc\x02\x95\xc8\x37\x2a\x43\xa5\x4d\x60\xa8\x44\x3e\x61\x19\x2a\x3d\xad\x0d\x95\xe8\x17\x2e\x43\x2d\xdf\xa7\x0c\xf6\x2f\x99\x9d\x7b\x87\x9e\x9b\x57\xc5\x4b\xa7\x79\x6e\x5e\xbb\xfb\x0c\xb5\x78\xb6\xc3\xcb\xf0\xef\x67\xfe\x82\x7c\xc5\xd9\xe1\xff\x3c\x2b\x3f\x25\x52\xae\x48\x9d\xd0\x22\x25\xd7\xf9\xa9\x70\x0f\xe7\xa6\x41\x55\x2d\x7b\x28\x4f\x59\x16\x14\x00\x7f\x9a\xc7\x45\x36\x13\x0b\x7e\x8d\xb3\xb0\xae\xff\xf0\x25\x2e\x32\xf7\xeb\x45\xee\x08\x4f\xee\x05\xef\x4a\x6b\x63\x50\x9f\xfd\xf1\xd8\x5f\xfe\x3b\xa0\x7f\xd9\x9f\x05\xfd\xb3\xa4\x7f\x56\xf4\xcf\x9a\xfe\xd9\xd0\x3f\x5b\xfa\xe7\x89\xfe\xc1\xbd\x48\x9f\xb2\x03\xff\xcb\x69\xe1\x27\xaf\x7f\x14\x4a\x83\xee\xb1\x7f\x5a\x74\x4f\xcb\xee\x69\xd5\x3d\xad\xbb\xa7\x4d\xf7\xb4\xed\x9e\x9e\xba\xa7\x9e\x9f\x3c\xe1\x7f\x39\x3f\xf8\xc9\xeb\x1f\x85\xd2\xa0\x7b\xec\x9f\x16\xdd\xd3\xb2\x7b\x5a\x75\x4f\xeb\xee\x69\xd3\x3d\x6d\xbb\xa7\xa7\xee\xa9\xe7\xa7\xce\xf9\x5f\xce\x0f\x7e\xf2\xfa\x47\xa1\x34\xe8\x1e\xfb\xa7\x45\xf7\xb4\xec\x9e\x56\xdd\xd3\xba\x7b\xda\x74\x4f\xdb\xee\xe9\xa9\x7b\xea\xf9\x69\x33\xfe\x97\xf3\xd3\xf6\xea\xd1\xf6\x1a\xd2\xf6\x4a\xd2\x76\x7a\xd2\x76\xaa\xd2\x76\xda\xd2\x76\x0a\xd3\x76\x3a\xd3\x76\x6a\xd3\x76\x9a\xd3\x76\xca\xd3\x52\xfd\x01\x56\xa7\xc5\xb9\x78\x7a\xea\x7c\xbd\x30\xcc\x6d\x23\x9f\xa8\xfd\xa5\x1b\xb5\x65\x85\xf6\xa8\xaa\x50\x42\x3d\x80\x47\x07\x6f\x14\xd6\x29\xf9\x7e\xdf\x81\x11\x2e\xbe\xa3\x9d\x4f\x01\x0e\x55\xf1\xb2\xf3\x95\x20\xe6\xda\x69\x7d\x87\x9f\x2c\x74\x12\xf3\x22\xff\xa2\x95\x98\xdd\xe1\x38\x68\xa0\x4b\x46\x9e\x8c\x60\x3b\x5f\x90\xff\xfb\xf8\x0c\x14\xf5\xf5\xbb\x32\x8a\x24\x90\x91\xf8\xeb\xf9\x1a\xff\xdf\x46\xc0\x22\x94\x09\x4d\xe9\x0a\x29\x9e\x85\x8c\x27\x58\x09\x08\xf0\x8f\xbe\x66\xb0\x62\x55\x96\x72\x95\xc5\x42\x6f\x80\x50\xd6\x23\xe8\x0b\x29\x9e\x95\x8c\x67\xe9\xeb\x4d\x10\xca\x7a\x3c\x7d\x21\xc5\xb3\x96\xf1\xac\x3c\x01\xc1\x4a\x5a\xd3\x59\x71\x31\x6e\x94\x2a\x80\x0c\x56\x90\x10\x56\x8a\x14\xb6\x32\x9e\x35\x20\x85\x35\x24\x85\xb5\x22\x85\x27\x19\xcf\x46\x94\xc2\x46\x92\xc2\x86\x4b\xc1\xf7\x14\x35\x02\xc4\xb0\x85\xc4\xb0\x55\xc4\xe0\x2b\xfa\xf8\x04\xc8\xe1\x09\x92\xc3\x93\x22\x07\x5f\xd5\x49\x4f\x94\x04\xb0\xbc\x76\x9d\xd3\xf8\x6a\x9f\x56\x75\xd3\x8f\x5a\x3a\x0b\x71\xfd\x67\xfe\xc0\xe1\x7c\x15\x86\x83\x74\x10\x81\x0a\x11\x30\x88\x80\x43\x2c\x54\x88\x05\x83\x58\x70\x88\xa5\x0a\xb1\x64\x10\x4b\x0e\xb1\x52\x21\x56\x0c\x62\xc5\x21\xd6\x2a\xc4\x9a\x41\xac\x39\xc4\x46\x85\xd8\x30\x88\x0d\x87\xd8\xaa\x10\x5b\x06\xb1\xe5\x10\x4f\x2a\xc4\x13\x83\x78\xea\x7a\xcc\xd3\xba\xcc\xe3\x7d\xe6\x75\x40\x7a\xbf\x76\x1d\xdb\xf7\xbd\xd6\xb5\x3e\xef\x5b\x1f\x77\x2e\x59\x2f\x74\xfd\x8b\x18\xcf\x08\x83\x85\xbd\x0f\xa4\xf7\xa2\x2d\x62\x00\x0b\x09\x80\x98\x1c\xf6\x66\x29\xbd\x11\x6d\x09\x03\x58\x49\x00\xa2\x91\x60\x00\x6b\x09\x80\xd8\x02\xf6\x66\x23\xbf\xd1\xf9\xde\x4a\x00\x6b\x9d\xef\x27\x09\x60\x23\xf0\xed\x7b\x72\x9f\xe8\x8c\xfb\x72\xaf\x09\xc3\xca\x16\xde\x63\xa7\xfe\x9e\x9e\x8e\x85\x0c\x6f\x75\x76\x38\xa8\xb9\x87\xbf\xc3\x11\xd1\x9d\x5c\x1e\x0e\xa9\xa6\x7b\x3d\x1c\x7e\xdd\xc9\xf1\xe1\xf8\xed\x4e\xbe\x0f\x07\x80\xd3\xdd\x1f\x0e\x16\xef\xe4\x01\x71\xb4\x79\x27\x27\x88\xc3\xd5\xe9\x7e\x90\xc4\xd2\x77\x72\x85\x24\x18\xbf\x93\x37\x24\xd1\xfc\x8d\x0e\xb1\xce\x47\xfb\x44\x69\x7c\x99\xdc\xa2\x34\x78\x4c\x9e\x51\x1a\x16\x26\xe7\x28\x8d\x02\x93\x7f\x94\xf4\xdb\xe4\x22\x25\xcd\x35\x79\x49\x49\x51\x4d\x8e\x52\x52\x41\x93\xaf\x94\x94\xcb\xe4\x2e\x65\x5d\x32\x7b\x4c\x59\x4f\xcc\x4e\x53\xd6\x01\x8b\xdf\xac\x73\x57\x76\x13\x9e\xf8\x6a\xc8\xab\x12\xf1\x0e\x38\x56\x22\x5d\x93\x6f\x25\x52\x1d\x70\xaf\x44\xa8\x03\x1e\x96\xc8\xd4\xe4\x64\x89\x2c\x07\xfc\x2c\x11\xe5\x80\xab\x25\x92\x34\x79\x5b\x2a\xc1\x01\x87\x4b\xc5\x67\xf0\xb9\xd6\xe5\x31\x3c\xb3\x7f\x4f\xa7\xcb\xd6\x0d\xde\xea\x74\xf3\xe4\x3e\x4e\x37\x4f\xee\xe6\x74\xf3\xe4\x16\xa7\x9b\x27\x77\x73\xba\x79\x72\x37\xa7\x9b\x27\xb7\x38\xdd\x3c\xb9\x9b\xd3\xcd\x93\xbb\x39\xdd\x3c\xb9\xc5\xe9\x92\x05\xb5\x3b\x39\x5d\xb2\x22\x77\x27\xa7\x4b\x96\xf4\x6e\x74\xba\x79\x32\xda\xe9\x4a\xe3\xcb\xe4\x74\xa5\xc1\x63\x72\xba\xd2\xb0\x30\x39\x5d\x69\x14\x98\x9c\xae\xa4\xdf\x26\xa7\x2b\x69\xae\xc9\xe9\x4a\x8a\x6a\x72\xba\x92\x0a\x9a\x9c\xae\xa4\x5c\x26\xa7\x2b\xeb\x92\xd9\xe9\xca\x7a\x62\x76\xba\xb2\x0e\x58\x9c\x6e\x9e\x18\x9d\x2e\x11\xb0\xdd\xe9\x12\xf1\x0e\x38\x5d\x22\x5d\x93\xd3\x25\x52\x1d\x70\xba\x44\xa8\x03\x4e\x97\xc8\xd4\xe4\x74\x89\x2c\x07\x9c\x2e\x11\xe5\x80\xd3\x25\x92\x34\x39\x5d\x2a\xc1\x01\xa7\x4b\xc5\x37\xde\xe9\xf6\x9f\x97\x32\x37\x3b\xbc\xa7\xd3\x65\x1f\x0f\xde\xea\x74\xb3\xc3\x7d\x9c\x6e\x76\xb8\x9b\xd3\xcd\x0e\xb7\x38\xdd\xec\x70\x37\xa7\x9b\x1d\xee\xe6\x74\xb3\xc3\x2d\x4e\x37\x3b\xdc\xcd\xe9\x66\x87\xbb\x39\xdd\xec\x70\x8b\xd3\x25\x5f\xd5\xee\xe4\x74\xc9\x67\xb9\x3b\x39\x5d\xf2\x5d\xef\x46\xa7\x9b\x1d\x46\x3b\x5d\x69\x7c\x99\x9c\xae\x34\x78\x4c\x4e\x57\x1a\x16\x26\xa7\x2b\x8d\x02\x93\xd3\x95\xf4\xdb\xe4\x74\x25\xcd\x35\x39\x5d\x49\x51\x4d\x4e\x57\x52\x41\x93\xd3\x95\x94\xcb\xe4\x74\x65\x5d\x32\x3b\x5d\x59\x4f\xcc\x4e\x57\xd6\x01\x8b\xd3\xcd\x0e\x46\xa7\x4b\x04\x6c\x77\xba\x44\xbc\x03\x4e\x97\x48\xd7\xe4\x74\x89\x54\x07\x9c\x2e\x11\xea\x80\xd3\x25\x32\x35\x39\x5d\x22\xcb\x01\xa7\x4b\x44\x39\xe0\x74\x89\x24\x4d\x4e\x97\x4a\x70\xc0\xe9\x52\xf1\x8d\x77\xba\xc2\xf6\x8c\xcc\x6d\xdf\xf5\x4b\x6a\x7b\x9f\x8f\xa9\xed\x9d\xbe\xa7\xb6\xf7\xfb\xa4\xda\xde\xf4\x55\xb5\xbd\xdf\x87\xd5\xf6\x7e\xdf\x56\xdb\x9b\x3e\xaf\xb6\xf7\xfb\xc2\xda\xde\xef\x23\x6b\x7b\xd3\x77\xd6\xf6\x8e\x9f\x5a\xdb\x3b\x7e\x6d\x6d\xdf\xf0\xc1\xb5\xcd\x46\x7b\x5d\x69\x7c\x99\xbc\xae\x34\x78\x4c\x5e\x57\x1a\x16\x26\xaf\x2b\x8d\x02\x93\xd7\x95\xf4\xdb\xe4\x75\x25\xcd\x35\x79\x5d\x49\x51\x4d\x5e\x57\x52\x41\x93\xd7\x95\x94\xcb\xe4\x75\x65\x5d\x32\x7b\x5d\x59\x4f\xcc\x5e\x57\xd6\x01\x8b\xd7\x6d\x33\xa3\xd7\x25\x02\xb6\x7b\x5d\x22\xde\x01\xaf\x4b\xa4\x6b\xf2\xba\x44\xaa\x03\x5e\x97\x08\x75\xc0\xeb\x12\x99\x9a\xbc\x2e\x91\xe5\x80\xd7\x25\xa2\x1c\xf0\xba\x44\x92\x26\xaf\x4b\x25\x38\xe0\x75\xa9\xf8\x4c\x5e\x97\xa5\x46\x30\x1f\x3a\x82\xce\x00\x58\x76\xa9\x82\x19\x14\xba\x2d\xbe\xf4\x8c\xa1\x72\xb4\xa8\x29\x4a\xf8\x34\xc1\x07\xf4\x84\x62\xb4\xef\x50\x1e\x51\x48\x52\x29\xa8\x47\x93\x08\x6b\xca\xf1\xec\xc0\x88\x25\x2a\x92\xd7\x1f\xc9\x7f\x2f\x02\x55\x23\x3c\xcf\x1d\x01\x9e\xad\x67\x79\x1e\xea\x5c\x48\xfa\x80\x7f\x08\x4d\x5e\x90\x3d\xf9\x72\x3e\x08\x20\x19\x84\x44\x74\x7a\x2e\x09\x53\x75\xda\x65\x10\x12\xd6\x97\x52\xaf\xf1\x28\xa0\x6c\xbb\x96\x35\x55\x5a\x62\x78\xdc\x5f\x4e\x53\xed\x4e\xcd\xd1\x2d\xf6\x6e\xf3\x5a\xa2\x4f\x45\x92\x3c\xea\x1d\x23\x9e\x01\xf1\x56\x8f\x1c\x13\x39\x7a\xdc\xe3\xa1\x27\x91\xed\x95\x37\x7d\x6d\x96\x76\x67\x26\xff\xfc\xa9\x6f\x59\x57\x02\xe5\xeb\x88\xb6\x49\xd8\x4b\x8b\x72\x22\xd7\x33\xf1\xf3\xe1\x69\x1f\x27\x63\xaa\x0a\xac\xd8\x80\x20\xee\x64\x12\x5d\x3a\xa1\x99\x5a\x20\x90\x10\xca\x20\x8c\x49\x92\xec\x51\x00\x32\xdd\x67\x2b\x32\xb5\x38\xde\x27\x41\xb2\x1e\x53\xd9\xd4\x66\x0d\x0c\xe2\x51\x26\xc3\x12\x26\xcd\xe4\x9f\x62\x8b\x79\x09\x88\x6b\x81\xd6\x71\x04\xb3\xcc\x32\x31\x99\x5a\x1b\xf9\xc9\x3e\x1a\x51\xd5\xd8\x56\x19\x08\xd4\x3e\x89\x44\x7a\xda\x17\x33\xe1\x59\x40\x4c\x7f\x82\x28\x10\x5a\x21\x98\x4b\x92\x58\xca\xd4\xba\x30\x4a\x12\xb4\x1a\xa8\x67\x6a\x9a\x08\x01\x31\x25\x23\x67\x19\xad\x66\xf2\x4f\x01\x77\x57\x02\x67\xd4\x41\x28\x0a\x41\x46\x79\xaa\x2c\x53\x1b\xf7\x7b\xb4\x0d\xfd\xe1\xaa\xa6\x66\x2a\x40\x06\xee\x04\x12\x34\x53\xd7\x4c\xfa\x25\x20\xe7\x05\x20\xa2\x55\x6c\x52\x54\x96\xff\xcb\xd8\x4a\x3f\xf2\xa2\xcd\x60\x4d\x53\x23\x65\x18\x90\x35\x89\x00\xc9\xe8\x33\x13\x7f\x08\x98\xd9\x6f\x10\x4b\xb2\x4f\xf6\x08\x64\x93\xe6\x33\x33\xb5\x0f\xc5\x28\xde\xc3\x56\x47\xa8\x68\x6a\x9e\x04\x02\xf1\x25\xa3\x4f\xc2\xea\xdb\x4c\x78\x96\xa4\x87\x7f\x82\x46\x66\x1d\x6f\x63\x58\x45\x49\x6a\x36\xa3\x85\x79\x8a\xa2\x08\xee\x92\xbe\x9e\x59\x6e\x3d\x04\x68\x18\x24\xe4\x61\xdc\xa4\xdf\xd1\x4c\xfa\x25\x60\xe6\x05\x00\x22\x93\xdf\x95\x98\xa1\xf5\xa7\xba\x6e\x23\x0a\x53\x9b\x65\x98\xf1\xcc\x3a\x73\x12\xd5\x90\x3e\xc3\xa1\xcd\x84\x63\x63\xac\x70\x11\x2c\xb6\x0b\xa4\xa0\x23\xba\x25\xe0\x5b\x3e\xad\xbc\x15\x74\x40\x8e\xc6\x60\x0a\x4a\x39\x30\xc3\xac\x8d\xe1\x4b\x84\x77\x64\xe5\x74\x9a\xa3\xf2\x53\x8e\xe4\xa0\xa6\x10\x48\x43\x0c\xea\x01\x30\xb7\x46\x7d\xc1\x6a\x35\xe3\xff\x13\x63\x3f\x01\xf5\x84\x30\x50\xc6\x86\xe5\xdc\x2d\x11\xf6\x0b\x34\x9b\x15\x59\x21\xa4\xc8\x2b\x54\x97\xc5\xa9\x4e\xbf\xe3\x28\xdc\x9c\x56\xa1\x3b\x17\xd7\xb2\x64\x32\x3c\x35\x41\x97\x50\x86\x9c\x96\xc3\x4e\x81\x24\x5e\x81\xb2\xcd\xe0\x22\x5c\xf9\x98\x92\x33\x1f\x7d\xf2\x19\x88\x15\x63\xd7\x03\x2d\xda\xac\x37\x70\x8b\x72\x4b\xa2\x88\xdf\xb8\x45\x79\x32\xa5\x45\x4f\x4f\x3e\xdc\xa2\xec\xf0\x2f\xd3\xa2\xec\x30\xa5\x45\xbe\xff\xf4\x04\x37\xa9\xcd\xfe\x65\x9a\xd4\x66\xe6\x26\x69\xd0\xff\x2a\x5c\x9b\x8d\xd4\xbe\xa8\x72\x37\x2e\x4e\x4d\x55\x58\xfa\xb8\x9f\x76\x93\xa5\x06\x87\xad\x38\x28\x69\xf6\x0c\x69\xf5\x8c\x96\x5d\x31\xd5\x69\x1e\x1e\x90\x9e\x45\x2c\x4b\xcb\x5d\x9f\x54\xa9\x05\x0e\xb0\xc7\x28\x59\x26\xf0\x11\x6a\xf1\x0c\xbb\x68\xc9\xc5\x83\xec\xce\xdc\x5f\xd5\xb3\x3e\x8d\xa8\xf6\x4e\xee\xa5\x1d\xe9\x77\xd4\x96\xe1\x29\xd1\x4d\xac\x7e\xb2\x58\xed\x65\x96\x76\x69\x54\xe7\x48\xbe\x67\xeb\x45\xc9\x7e\xdf\x25\x67\xf2\xc4\xcc\xa7\x9e\x83\xff\xd1\xb3\xde\xcc\x8f\xfb\xc1\x82\xda\xf8\x00\x7b\x0c\xa5\x05\x5d\x7a\x99\xf2\xdc\xb8\x65\x16\xc6\xe8\x48\xd2\xcc\x5d\xe4\x44\x55\x45\x19\xc6\x69\xf3\x4a\x8e\xe1\x8b\x08\x70\x0f\xdc\x5a\xf7\x6d\x95\xa7\x57\x49\xd2\x1a\x2b\x7f\x32\x93\x8a\x7f\xad\x50\x98\x14\xa7\xec\xf5\x2b\x14\xd6\xd2\x90\xa3\xc7\x48\x13\x4b\xc9\x78\x49\x2a\x32\xac\xfc\x3c\x93\x5b\x7e\xce\x9a\xb4\xcc\xd0\xd7\x47\x9e\x7b\x27\x0e\xb3\xf8\x53\x40\x35\xd1\xf9\xd1\x09\xca\xf6\x11\x44\x45\x34\x82\x76\xcc\xf7\x30\x3b\xa3\x31\xca\x21\xb7\x92\x24\xcc\x91\x5b\xe8\x92\x0c\x69\x4a\xfa\x4e\xf2\x55\x81\x40\xd1\x4c\x62\x62\x02\x33\xc2\x2d\x1f\xe1\x3f\x3a\xd8\xbb\xa8\xd9\xcc\x20\x10\x25\x5b\xa2\x6a\x05\x54\x92\xd8\x3d\xe9\x54\x07\x69\x8a\x00\x7a\x8a\x99\x21\x9a\x75\x0e\xd0\x0c\x06\x89\x06\x30\xd5\xf9\x76\x33\x44\x95\x66\xa0\x92\xd2\xc3\x2d\xe0\xfc\x70\xac\x58\xed\x45\x35\xb7\x8e\x24\xd9\x32\x0b\xd3\x53\x83\xda\xe6\x2d\x14\x54\x6b\x3d\xc6\x94\x51\x83\x0b\x64\x4f\x60\xbe\xa2\x6c\x1d\xcf\xc4\xab\x5c\x9c\x1d\x66\xa3\xe0\xea\x7c\x36\xa7\xc6\x82\xa4\x96\x73\xb3\xc3\x4f\x63\xea\x8d\xae\x24\x82\x85\x49\x52\x9c\xf4\x9a\xe2\xef\xa8\x39\x19\x51\x45\x8d\x52\xb9\xce\x6f\xe0\xd5\x52\x69\x80\x57\x5c\x73\x02\xaf\x83\xc9\x05\xac\x72\x50\xd9\xb4\xb3\x32\x96\x5b\x81\x2d\xe6\xc0\x1d\x35\x0b\x9b\x61\xf0\x81\x99\x4a\x06\x09\x32\x63\x1c\x35\x27\x9b\x39\xd7\x18\x9f\xe8\x0e\x4c\xf5\xb5\x1e\xb2\x22\x01\x88\xba\x75\x3e\xda\x0d\xf9\xf3\xad\x2f\x39\x22\x7d\x3c\xda\x86\x8c\x7d\x58\x8c\x1d\x39\x92\x7c\x09\x33\x70\xb6\xa5\x21\xe9\x2e\x34\xe9\x42\xe4\x6e\x91\x6e\x76\x78\x9b\x74\xfb\xfa\x6f\x97\x6e\x76\x98\x10\x64\x6c\x37\xba\x70\x09\x71\x20\xbd\x15\x7b\x4d\x3c\x88\x31\x31\x0f\xcf\x7b\x45\x40\xdf\x25\x91\x8a\x96\x47\x85\x24\x77\xe0\xf4\x58\x6e\x94\xee\xa7\x2d\x33\x8a\x96\x27\xa2\xc7\x44\x52\x61\x02\x39\x28\xc0\x76\x4b\xc9\x53\x85\xfa\x73\x1e\x44\x3a\x42\x21\x0b\xa1\x94\x4c\x5f\xda\x7b\x39\x7f\x05\xd3\x6f\x35\xc5\xb4\x58\x8d\xe6\x38\xed\x38\x0e\xa3\xba\xc8\xce\x0d\xd2\x65\xa3\x24\xa1\x91\x04\xc6\x51\x91\xcc\x6c\xb6\x7c\xb1\xb4\x03\x79\x26\x40\xad\x2e\xd0\x60\x30\xd9\xef\x75\xfe\x3d\xcc\xd2\xc4\xdd\x23\x94\xe0\x48\x42\x4a\x99\x08\xb0\xae\x1b\x74\xbe\x52\x47\xae\xf6\xe0\xe8\x9a\xa2\xc0\xfa\x0e\xf4\x06\xf9\xa6\x8d\xe7\xa6\xff\x74\x49\xfe\xe4\xdd\xea\x59\x22\xc9\x77\x5e\x79\xbd\x6a\xc8\x49\xba\x09\x33\xfe\x08\xe7\x62\x4d\x94\x45\x26\x5b\x4b\x6f\xe6\xaf\x37\xb3\xf5\xd3\x6c\xbe\x7d\x84\x3d\x51\x7c\xae\x9b\x22\x77\xb9\x6d\x20\x81\x7e\xaa\xcc\x49\x84\xe2\x97\x90\x3d\x86\x0d\x56\x3a\xa9\xf6\x0e\x86\x91\xec\x15\x29\x57\xd6\x2e\x79\xcf\xc2\xac\xb0\x44\xd7\x30\x43\xfc\xe5\x30\x5b\x06\x48\x9d\x39\x36\x0d\xb6\xcd\x61\x85\x6e\x25\x73\x58\x98\xf1\xff\x56\x34\x6f\x36\x00\xc7\x54\xca\xd0\x52\x1d\x9b\x15\xac\x43\x36\xdc\x33\x3a\xe6\xf1\x75\x4c\x64\xf4\x6e\x1d\xa4\x62\xae\xc2\xc7\x9a\x32\x63\x54\x2d\x53\xd7\x07\x3f\x6a\xa6\xc1\x40\xac\xaf\xbb\x33\x54\xbc\xc0\x2a\xca\x1d\xa1\x4c\xf7\xbf\xf5\xd7\x49\x1a\x87\x4d\x51\x99\xba\x54\xc2\xb3\x1b\x40\x62\x58\x36\x37\x28\xe3\x48\x16\x13\x54\xc7\x55\x4a\x6f\xdf\x78\x03\x93\x02\x1a\x43\x97\x91\xc4\xb9\x06\x66\xc8\xbb\x2e\x9e\x83\xb9\xe8\xeb\xef\xcc\x95\xed\x86\x65\x2c\x0b\x3c\x05\xe6\x9b\x58\x11\x2e\x75\x11\x58\xea\x12\xe4\x9a\x59\xb2\x9b\x34\x95\xf6\x0d\xd6\x2a\x3d\xdd\xc9\x23\xd2\xab\xab\x7a\x84\xff\x67\xf8\xc4\x20\xf0\x66\xab\xc5\x34\x9f\xc8\x5a\xa8\xdb\xdc\xee\x85\xd5\x64\x9a\xa0\x24\x93\xc7\x80\x14\x15\xe6\x7d\x6c\x62\xc9\xe4\x1d\x95\xd7\x63\xd8\x1b\xe3\x21\x25\x50\xab\xd6\x09\xdd\x0c\xfb\x48\x86\xea\xbf\x35\x7d\x04\xfc\xa4\x06\x6b\xf4\x95\x16\xac\x83\xa0\xe3\x7c\xa6\x85\xc2\xb4\x7a\xa3\x7c\xe7\x78\x6a\xf6\x6a\x13\x7c\x28\xab\x72\x8b\x17\x35\x56\xbd\xc0\xea\xac\x39\xa9\x8e\xef\xb7\x79\xd2\x41\x34\xa6\x4f\xd0\xb0\xd2\x8e\x66\x73\xb2\x37\x1d\x81\xc8\xd0\x75\xb2\xe7\x50\xf1\x4c\xf4\xa8\xb6\xea\x76\x83\x34\x9e\x8d\x09\x5e\x75\x0c\x9a\x29\x7e\x75\x94\x31\xd4\xe9\xdf\x60\xe5\x88\xde\x2b\x93\xdb\xe1\x65\x09\x72\xc5\x44\x55\xbc\x38\xfd\xd2\x84\x5c\xd4\x41\xd2\x99\x6d\x8c\x4e\x0d\xaa\x9e\xc9\x0f\x92\x8a\xbc\x66\x45\x12\x03\xe2\xf8\x14\x36\x7c\x5b\xf2\x7a\x89\x95\xe5\x0b\x5d\x86\xdb\x30\xc0\x99\x70\x4a\x2b\x8c\xbf\xf1\xc2\x7f\x9c\xeb\x26\xdd\xbf\xba\x3c\xd7\x38\x2b\x86\x17\x21\xa4\x56\xd1\x15\xa4\xd1\xec\x99\xce\x77\xdd\x5f\x04\x63\x98\x57\x3f\x6b\x4b\xcb\x1f\xc2\x91\x33\xc3\x82\x86\x11\xa1\xf0\xfd\xc5\x90\xe0\x5c\xac\x29\xac\x03\x5e\x7a\xa2\x66\x15\xfa\x7d\x74\x41\x3a\x81\x67\x4c\xce\x0d\x77\xb3\x69\xb1\xcb\x02\xad\xac\x71\x75\xab\x72\x10\x6d\xb6\x42\xa5\x2f\x79\xa9\xf8\x65\xe3\xfe\x3b\x75\xa4\xb5\x07\x8c\x7e\xb2\xeb\x89\xba\x09\x9b\x34\x7e\x1e\xb1\x62\x17\x80\x87\x3e\x50\xdb\x30\x61\x29\xa4\x8f\x61\xdd\x05\x35\x8a\x3a\x77\x33\x14\xd2\xed\xd7\x2b\x59\xa6\x07\x39\x50\x2f\x52\x14\x6e\xa8\xe2\x7a\x24\xdd\x7d\x43\x86\x34\x7c\x39\x18\xdf\x82\x70\xae\x51\xc5\x63\x37\x32\x49\x21\x77\x1e\x01\xa5\xb5\x5e\xa8\x15\x68\x7b\x43\xc4\x4f\x95\xb7\x6d\x62\x19\xdc\x55\xa2\x44\x38\x64\xc7\x88\xb8\x85\x64\x26\xed\x3b\x01\xde\x76\xfb\x4e\xd4\x77\x44\x10\xdc\x9b\xe2\x47\xba\xad\x0f\xbc\x59\x0e\xbf\x9f\x0b\xa0\xca\x5d\x72\x93\xf6\x8a\x60\x54\xfd\xae\x09\x8c\x8d\xff\xba\xf0\x2d\x11\xf3\xf5\xea\xda\x7f\x58\xe1\xaf\xd9\x47\x8a\xae\xf2\xe3\x9c\x6f\x9d\x1d\x06\xdd\x51\xd0\x0b\xb8\x21\xe8\x1a\xca\x4c\xf1\x2b\xa1\x7a\x74\x4e\x48\x3f\x2e\x15\xd8\x30\x57\x2e\xfa\x8e\x4e\x4d\xdd\x77\x0d\x3f\x30\x62\xdf\x25\xca\x2e\x36\x94\x23\x31\x5a\x28\x61\x91\x6f\x28\x34\xe1\x5a\x3f\x25\xea\x4e\x58\xcf\x5b\x07\x71\x2c\xe1\x12\x84\xd6\xa1\x1f\x0e\x88\x04\x91\x31\x89\x75\xf8\x24\xc9\x75\x28\x3b\x09\xbe\xa1\xd5\xe3\x65\x3d\xb2\xca\x8e\x57\xa9\x8f\xc5\xcb\x4f\x72\x2b\xaa\xa2\x4c\x8a\x17\xec\x0a\x0e\x87\x0c\x0d\xf6\x75\x10\xc7\x5a\x0b\x56\x71\xb4\x1f\xab\xf8\xbc\x17\xbb\x43\x36\x76\x8a\x6c\xcf\x91\xb2\x41\x8b\x5f\xf6\x22\xe2\x19\xa3\x2b\x9b\x60\x13\x6d\x97\x0a\xb6\x75\xbc\x59\x6d\x12\x05\x9b\xa8\x2d\x3d\x89\x61\x7d\xf1\x17\xcb\x99\xbf\x0c\x66\xfe\xca\x03\xda\xaa\xe8\x4c\x8f\xd8\xa2\x35\x13\x7a\x60\x82\xde\x8c\xad\x04\x68\x8e\xd0\x9a\x29\xba\x43\xbb\x59\xed\xfb\xf5\x1a\x6d\xd6\x56\xdd\x81\x7b\x94\x1e\x5b\x1a\xd8\x8b\x4e\x2f\xaf\x87\xd7\x50\x05\x2c\x63\x34\x27\xf0\xb7\xdb\xc5\x56\xc1\xe5\xa3\x0d\x5a\x2c\x25\x5c\x92\xde\x30\xf4\x93\x96\x34\x95\x16\xaa\x1a\xc3\x50\x5a\xf4\x65\x74\xab\xa7\x68\xcb\xa8\x2a\x90\xae\xf0\x56\x4c\xd1\x14\xda\xad\x6a\x5f\xc7\x9b\xe5\xc2\xee\x5e\x81\x5e\x4c\x4f\xfb\x62\x80\xd8\x26\x0c\x22\x4d\xb0\xa4\xb0\x47\x31\x46\x43\xfc\xc5\x76\xa9\x8d\x53\xdf\xdf\x84\xdb\xa8\x47\x24\xaa\x07\x41\x3c\x62\x4a\xbe\x98\xf9\xeb\x60\xe6\x6f\x97\x72\xb3\x14\xcd\x20\xd8\x2c\x6a\x31\xae\x9d\x13\x74\x62\x04\x3c\xa0\x10\x94\xf3\x49\xda\x40\xba\x50\x65\xdc\xdb\x78\x1b\xbb\xcf\x81\xfa\x8d\x9d\x95\xbb\x74\xa8\x7d\x70\xcf\x67\xec\x7b\x1b\x85\x20\x2d\x94\xb0\xc8\x4a\x01\xe3\x42\x5e\xb8\xf5\x3c\x05\x57\xb2\x78\x42\x9e\x27\xe1\x12\xf5\x82\xa3\x1f\xa1\x1a\xab\xd5\xcc\x7f\x5a\xcc\x36\x5a\x0b\x15\xe5\xe0\x28\x2d\xfa\x31\xba\xd5\x13\x54\x64\x5c\x15\x40\x4b\xba\x56\xc0\x8a\x02\xf7\x35\xed\x56\xa5\x05\xf1\xfa\x69\xe5\xd9\xcd\x06\xd0\x8b\xf4\xb8\xa1\x5d\x2f\xe9\xc2\xa1\x2a\x5a\xb6\x9a\xd8\x23\x19\x63\x3a\xe2\x6d\xb0\x58\x2c\x14\x54\x51\x12\xf8\x0b\x4f\x44\x25\x2a\x09\x43\x3e\x69\x45\x4f\x6e\x9d\xa2\x22\x0c\xa1\x45\x43\xc6\x36\x78\x82\x82\x8c\xaa\x01\xe8\x07\x6f\xc1\x14\x3b\x42\xfb\x53\xed\xe4\xc0\xdf\x07\x89\x5d\x3d\xf4\x0e\x24\x47\xea\x06\x8c\x88\x74\xdb\x9c\x54\x28\xe0\x18\x65\x42\x02\xb4\x46\x2a\xa6\x24\x44\x1e\x5a\x09\x98\x44\xdd\xa0\xa8\x47\xa8\xc6\x72\x3b\x0b\x96\x4f\xb3\x40\x8c\xac\x28\x36\x59\x37\x28\x42\x9b\xf1\x18\xd7\xda\x09\x9a\x31\xa6\x02\xa0\x18\x8c\xfb\x49\x66\x83\x74\xa5\x66\xa2\x93\xa7\x64\xc0\xbf\x40\xbd\x37\x7c\x40\x72\xb1\x5c\x84\x4b\x55\x0d\x69\x61\x8f\x62\x54\x44\xba\x08\x36\x81\xe6\x17\x93\xc0\x0f\x96\x3d\x22\xd9\x64\x54\xdf\x46\x68\xc5\x2a\x98\xad\xb6\xb3\xf5\x52\x6e\x94\x66\x2d\xaa\x6f\x36\x85\x18\xd7\xca\x49\x96\x62\x10\x1e\xb4\x13\x98\xf3\x49\xd1\x06\xe9\x40\x2d\x4c\xf2\x43\xdf\x6e\x25\xf4\x5e\xe3\x97\x3f\x2b\x0b\x22\x7c\x11\xc0\x7a\x08\x00\x3e\xab\x65\x5c\x37\x50\x48\x8d\x5b\x35\x19\x58\x8b\x50\x70\x8a\x8a\xa4\x92\xbb\x69\x15\x45\xc5\x2f\xeb\x97\x4a\xa2\x53\xb5\xf1\xbd\x08\x77\xcd\x04\x95\x9b\x56\x15\xd0\x3e\xad\x89\xd3\x96\x5a\x8c\x02\x9a\xba\xd4\xc2\xf9\xd0\x96\x5c\xf8\xd2\xc2\x5b\x75\x51\x5c\x8d\xd0\x88\x8d\xd1\xc6\xc1\x35\x0e\x0d\x2b\xa4\x8f\x6f\x5e\xa7\xd1\xa9\xc0\x5a\x09\xac\xdb\x8c\xef\x51\x53\x37\xdd\xa0\x99\x6f\x58\xc4\x01\x9a\x3a\x45\x3b\x2d\x02\x9b\xbe\x98\xd3\xf1\x22\x2f\xea\xf0\x85\x8c\xb7\x6a\xa7\xb8\xf6\xa1\x90\x1a\xe5\x67\x87\xd6\x53\x14\x9c\xa0\x66\xbe\x65\x25\x48\xc5\x6f\xd0\x49\x75\x65\x68\x7c\x2f\xc2\x5d\x73\x8b\x3e\xde\xba\x4c\xa4\x35\x71\x8a\x2e\x5a\x04\x34\x75\xb9\x88\xf3\x21\x2e\x1b\xf1\x85\x93\xb7\xaa\xa1\xb8\xd6\x22\xd2\x19\xb5\xb6\x34\xb4\x78\x23\x22\x84\x14\xf0\x0d\x6b\x4d\x12\x6a\x58\xf7\xe4\xb5\xa7\xf1\xfd\x06\x74\xc6\x0d\x5a\x77\xdb\x42\x94\xdc\xac\x49\x21\xa2\x59\x18\x93\x17\xa4\x38\x17\xca\xc2\x14\x5f\x8c\x79\xab\xce\x89\xeb\x37\x0a\xa9\x31\x6a\x37\xb8\x26\xa4\xe0\x84\x34\xef\x4d\xab\x59\x2a\x7e\x58\xfd\xb4\xd5\xad\xf1\xbd\x08\x77\xcd\x0d\x4a\x78\xf3\x52\x97\xd6\xc4\x29\xaa\x68\x11\xd0\xd4\x25\x2f\xce\x87\xbc\xf4\xc5\xd7\x7c\xde\xaa\x88\xe2\x32\x91\x4c\x69\x8c\x1e\x0e\xae\x3c\xc9\x28\x21\x35\x7c\xcb\x7a\x99\x82\x1d\x56\x42\x75\xfd\x6c\x7c\x07\x82\xbd\x72\x83\x0a\xde\xba\x98\xa6\x36\x6f\x8a\x02\x5a\x24\x33\x75\x51\x8d\xb3\x21\x2d\xae\xf1\x85\xa5\x37\x1b\x42\x61\x2d\x4a\x22\x24\xab\x1f\xcf\xaa\x35\x7d\x81\x4b\x42\x0a\x29\xe0\x9b\x16\xe5\x64\xec\xb0\x02\x2a\x8b\x74\xe3\x3b\x10\xea\x95\x1b\xd4\xef\xc6\x15\x3b\xa5\x69\xb0\xf2\xdd\x22\x97\xe9\x8b\x77\xfd\x40\xe8\x17\xf1\xf8\x42\xd6\x5b\x15\x50\x5c\xfb\x12\xe9\x8c\x31\x7f\x83\x8b\x69\x22\x42\xd8\xf8\xdd\xb8\xf2\x27\x21\x36\xd9\x3d\x71\x25\x70\x7c\xaf\x01\x5d\x71\x93\xcd\xbb\x65\x59\x50\x6e\xd6\x14\x7b\x67\x11\xc5\xc4\xe5\xc1\x2c\x3d\x7d\xbb\xa8\xdb\xfc\xa6\xae\x6e\x61\x24\xb2\x06\x79\xde\x6a\x1d\x2d\x9e\xd5\xad\x6b\xe7\x53\x82\x2a\xdc\xe6\x31\xd9\x47\x6c\xd4\xe4\xef\x0c\xa7\x5e\xad\xe0\x8a\x62\xa7\xf4\x7b\xc4\x08\x22\xf5\x13\xc3\x49\x57\x23\x71\x05\xa8\xcf\x3e\x40\xd2\x7f\x90\x3a\x87\x3b\xe6\x38\xe8\x69\xd4\xb9\x40\xa3\x4f\x68\x73\x97\x3c\x19\x18\x25\xd9\xe1\x69\x4c\x01\x26\xc0\xfc\x28\x80\x8b\xe7\xc6\xc8\x09\x72\xb2\xb1\xf7\xd7\xe6\xb5\x44\x5f\xa2\x73\xd3\x14\xa7\xaf\x3d\xf4\x4c\x78\x59\xa1\x1a\x35\x86\x77\xf5\x39\xca\x53\xf1\xa5\xb8\xad\x7e\xbe\x0f\x13\xd4\xed\x43\xf4\xc4\xad\x98\xac\x90\xee\xa3\xc4\xed\x0e\x2b\x0a\x4e\xc6\xd8\x45\x48\x10\x15\x17\x59\x16\x96\x35\x92\xce\xe4\xf5\xc5\x14\x5e\x3e\xc3\xd3\x54\x86\xd7\x2c\xd7\x5a\xf1\x72\x25\xe9\x17\x87\xa0\xa8\x34\x3b\x5a\x78\x76\xa5\x6f\x83\x66\xf2\xf2\xba\x34\x71\xbb\x63\x9a\x24\xe8\x24\xb6\x96\xc2\x38\xf3\x05\xdb\x34\x7a\xed\x4c\xc6\x8c\x3c\x9d\x4b\x1d\xf1\x55\x35\x2b\xbb\x5d\xb8\x6f\x50\x65\xdb\x22\xef\xf5\xdc\x88\x9b\xaf\xe7\xc1\x6a\xa5\xef\x3f\x66\xa5\x7c\x4f\xf4\xc3\x83\x98\x82\x7e\xbe\x40\x39\xdd\x97\xdb\x69\x21\xdd\xca\xdc\x95\x43\xa9\x85\xba\x84\x45\xec\x37\xa5\x0e\x56\xd1\x9b\x87\xf2\xb2\x79\xe5\x8d\x54\xf6\x8e\x77\xb0\x39\x3a\x9d\x6d\xa7\x29\x69\x85\xee\x50\xa5\xef\x79\x9e\x7c\xae\x72\x9f\x15\x61\xb3\xc3\x60\xcf\xc2\x35\x3b\x9e\x90\x8c\x89\x59\x02\xde\x85\xbb\x39\xcb\xc5\xe2\x39\x6a\xaa\xa7\x67\x39\xb6\x10\x76\x58\x13\xfc\x59\x5a\x37\x2c\xfd\x9f\x96\x29\x0f\xf6\x10\x83\xf9\xf3\xc4\xbc\xaf\xfe\x4a\x3f\xab\x49\x33\x43\x50\x95\x72\x94\x5e\xb3\x9c\x15\x60\x4d\x04\x6a\xfe\x0e\xaa\xe7\xdd\xa0\x71\xba\xba\x0e\xaa\x1e\xd4\xcc\x51\x2a\x98\xa4\xdf\xd3\x04\x55\x17\xa5\xbd\x9d\xda\xa8\x76\xc0\x7e\xb1\x43\x87\x36\x6d\x90\x25\x61\xab\xe2\x41\x7c\xea\x42\xe2\x0c\x85\xd5\x2e\x2a\x9a\xa3\xb6\xdd\xdf\xa8\x9a\xec\x5c\x18\xb4\xfb\xbf\x57\x45\x1c\x7e\x08\x39\x11\x25\x26\xf9\x2e\x77\xb9\x50\xde\x86\xb0\xf6\xb7\x7e\xa4\x85\x10\xa6\x51\xc0\x26\x41\x12\xc2\x2e\x56\x93\xc9\xb0\x9d\xe7\xc2\xf8\x19\x49\x84\x7f\x98\x94\x89\xf4\x11\x84\x4c\xe6\xa6\x8f\x32\xd2\x70\x83\xfc\x52\x0f\x71\x44\x61\x22\x8c\x27\x2a\x6e\x25\x12\x99\x0f\x24\x9b\x53\x8e\x9e\x33\x16\x75\xb1\x0a\x81\xc9\x4c\x88\x51\xf8\x90\xb4\xe4\xdb\xa1\xd9\x1f\xc9\x50\x57\x0f\xe5\x08\xc5\xa6\x33\x59\x3a\x29\x21\x28\x22\x2f\x58\x92\x29\x8d\xbe\x70\x44\xcd\x97\x8e\xa8\xd1\x5f\x46\xd4\x54\x09\x55\x02\x4c\x35\xb9\x4b\x08\x8c\xd5\xa5\xe9\x01\x84\x7e\xe8\xbd\x10\xd8\xf6\xe4\x75\xac\x06\x64\x02\x0e\x90\x59\x07\x3f\xfe\xa8\x74\x61\x5f\xa8\x49\xd8\xe9\x1f\xc1\x5a\xc2\x2b\xb3\x76\x80\x44\x81\xb7\x03\x18\x60\x36\x8c\x30\x72\x36\x2c\x96\x33\xa9\x6c\x69\x67\x34\x45\x91\x45\x61\x75\x8f\x1c\x57\xf2\x61\xb1\xba\x09\xab\x46\x3b\x2b\x46\xde\x93\x57\x12\x79\xf3\x61\x41\x45\xa0\x78\x2a\xb9\x23\xb7\x7b\xb9\xf1\x31\xcd\x12\x3a\xb9\xdc\x65\xa1\x5c\xa0\xfa\xa2\xc7\x8b\xec\xdb\x3d\x0d\xb1\x80\x53\xf5\x55\x66\xc8\x89\xc4\x9b\xa2\xa4\x6e\xb8\x63\x43\x76\xbc\xca\x4b\x8d\x72\x4f\x48\xef\x07\x49\xf5\x55\x4f\xac\x41\x8b\x1c\xe1\x66\x9a\x18\x92\xde\xa9\xfc\x30\x69\xf5\x31\x20\x0c\x30\x42\x66\xd4\x74\x0d\x88\x88\x61\xb3\x75\xbf\xda\x4d\xaa\x3d\x18\x85\x42\x5d\x7f\xb8\x8f\xf0\x18\x69\x9b\x08\x75\x45\xbc\x59\x4a\x3f\xaa\xad\x70\xeb\x32\x4b\x1b\x25\x79\xdc\x7c\xb5\x0e\xa4\xc4\xa9\x34\xcc\x63\xa5\x36\x44\x86\xa8\x4e\x9b\xb3\x1b\xaa\xf3\xa9\xfc\x48\x36\x95\xf4\xae\x2c\x18\xdd\xac\x94\x75\x02\xb6\x16\x61\xa5\x99\x1d\x46\xd2\x84\x48\x6a\x14\x3b\xaf\xdf\x99\xbe\x24\xad\x50\x4c\xfc\x6f\x5c\x64\xe7\xfc\xf4\x0c\x97\x2a\x07\x70\xa9\xad\x14\xcf\xdf\xf6\x76\x72\xca\x19\x5c\x88\x37\x67\x84\x9b\xb8\xa8\xcb\x1d\x80\x3f\x36\xba\x9b\x9f\x46\xb8\xad\x9f\x46\xb8\x2d\x15\x46\x76\x5b\x38\xe0\xc7\x5e\x4b\x3d\x07\x6d\x8a\x1e\x86\x8d\x8e\xc5\xde\xa8\x91\x88\xc5\x5e\x5c\x6c\x46\x60\xa4\x35\x55\xc8\xd9\x6c\xc4\xa0\x49\xd0\xcd\x94\x91\xd0\xdd\xcc\x33\x88\xf6\x46\x3b\x7d\x03\x2e\x83\xc1\xbe\x9f\x44\xde\xc5\x76\x03\x82\xfa\x35\x09\x9b\x90\xb5\x82\x2d\x22\xd6\x5f\x09\x66\x47\x58\x24\x24\x79\x04\xa2\xa2\xfd\x3a\x1b\x07\x8f\xd1\x17\x36\x60\xc1\x4b\x4d\xa5\x63\xa8\x4a\x49\x02\x2b\x4b\x64\x4d\x06\xdb\x42\xb6\xec\xe2\x3d\x3e\x83\x07\x97\xc5\x68\xd0\x3e\xa3\x1a\x93\xdf\xa0\x6e\x2a\xd4\xc4\x47\xc9\xc0\xf2\x32\xd1\xf2\x09\x54\x95\x44\x1a\x3a\x0f\xdd\x9c\xa2\x9f\x5f\xf9\xd2\xfc\xaa\xfb\xc5\x28\xa8\x37\x5f\x7a\x16\x7a\xdd\x74\xc6\x0c\xc1\x66\x47\x66\x00\x79\x9e\xb6\xb0\x50\x9b\x0d\x65\x34\x16\xb3\x22\xbc\x39\xa7\x84\xad\xd9\xc3\xa6\x08\xe0\x75\x72\xad\x5b\xdd\xc3\x88\x5e\x82\xd6\x0b\xb4\x6a\x17\x43\x3e\x06\x7b\x26\x7c\x6d\x4d\xca\x7e\xe9\x88\x9e\xa0\x62\xe0\x82\xa9\x91\xf7\x8a\x00\xed\x19\xce\x97\x7e\x4b\x46\x74\x9d\xcc\x84\x1c\xe9\x83\x39\xd1\x01\xc6\xa1\x44\xe0\xb7\xa4\xfa\x1e\x60\xdc\xf6\x61\x6c\x30\xd9\x37\xc1\x07\x1b\x69\x3b\x1c\xb3\xc8\xe2\xaa\xf5\xe0\x40\x1c\x33\xec\xa6\x0d\x32\x2d\xec\x50\x63\x82\xb1\x38\x46\x4e\xbc\x0d\xe8\x46\x52\x55\xc1\x04\x67\x37\xa6\xc6\xbd\xe6\x91\xc3\x3d\x7f\x91\x96\xf8\x87\x05\x2b\xaf\x1b\x8c\x30\xa8\x63\xc5\x32\x4d\x05\xc6\x57\x51\xba\x72\x92\xbc\xa6\xb1\xaa\x05\xa9\xf7\x5a\x3a\x11\xa5\xf0\xe3\x98\x3e\xbf\x88\x9f\x5e\x14\x35\xb0\x2f\xf4\x8e\x88\x7a\x7a\xd3\xe3\x81\x6b\xdc\xf0\xfd\x05\xfa\x47\x55\x08\x8e\x4c\xde\x80\xd5\x46\x08\x16\x0a\x74\xfa\x97\x7a\x8c\xd3\xbf\xb3\x85\x37\xae\x12\x8b\x1b\xd8\xd2\x3b\xf5\x0e\xe6\xe1\x22\x67\xfa\x87\x5a\x7e\x97\xc1\xd3\x2f\x6a\xab\x33\xe2\x49\x56\x58\x28\x1f\x6d\x7b\x4d\x4b\xa5\x53\x1a\xcb\xc8\x1b\xc4\x3f\xc0\x33\xa8\x16\xf6\x3a\xec\x5b\xc6\xc8\x16\x4e\x63\x6b\x1a\x43\xba\xe6\x2a\xd9\xdb\xde\xfc\x05\x29\x4f\x4f\x42\x5c\xa8\x2d\x63\xc9\x9f\xc2\xa8\x9e\xfa\x62\x5a\x62\x29\x83\x28\x30\x89\xe3\xac\xbb\x7e\x77\x51\x98\x07\x57\xde\x91\xf0\x04\xd9\xf2\xa4\x8e\x38\x73\x67\xc0\x4d\x7a\xdd\x96\x81\x55\xdd\xfe\x85\x03\x5c\x4c\x68\x36\x98\x07\x0c\xa4\x47\x95\xe2\xd6\xa6\x44\x8b\x64\x63\x6c\x0a\xff\x40\x3a\x25\x9f\x6c\xf7\xcd\x7b\x1a\x46\x20\xf1\x2b\xdf\xd5\x35\x9c\xa3\x4f\xda\x21\xc2\x37\x73\xd1\x3d\x22\xe0\xb7\x76\xfc\x9e\x6b\x22\xd1\x43\x7d\xae\xff\x4e\xe9\xf0\xa0\x2b\xec\xc5\xd2\x0a\x95\x28\xc4\xc0\xec\x49\x7c\xd7\x35\x97\x4e\x9c\x1c\x7d\xfe\x44\x3c\xe7\xca\xfb\xe8\xac\xbc\x8f\x7d\xbf\xb1\x50\xdc\x92\xec\x10\x9e\x50\x0d\xd7\x1f\x37\x94\xb4\x6d\xaf\xe7\x2a\xfb\xf4\x90\x84\x4d\xb8\x23\xbf\x3f\xd7\xdf\x0f\x3f\xb6\x79\xf6\x1c\x1f\xc3\xaa\x46\xcd\x97\x73\xb3\xdf\xce\x3e\x2e\x7e\xae\xbf\x1f\x9c\x36\xcf\x4e\xf5\x97\x1f\x8e\x4d\x53\xee\x3e\x7f\x7e\x79\x79\x99\xbf\x2c\xe6\x45\x75\xf8\x1c\x78\x9e\x87\x6b\xfe\xe0\x7c\x4f\xd1\xcb\x9f\x8b\xf6\xcb\x0f\x78\xf4\x6c\x9d\xed\x0f\x1f\x17\x7f\xf9\xb8\xf8\xb9\x0c\x9b\xa3\xb3\x4f\xb3\xec\xcb\x0f\x1f\x83\xc5\x7e\xbf\xff\xc1\x49\xbe\xfc\xf0\xcb\x7a\xbe\x5a\x2f\xe7\x9b\x55\xe6\x2e\xe6\xab\x27\x67\x31\x5f\xfb\x81\xeb\xcf\x57\x8b\x2d\xfe\xef\xea\x6f\x9e\xb3\x9c\x07\x6b\x27\x98\x3f\x6d\x96\xce\x66\x1e\xac\x9c\xad\x13\xcc\xfd\xa7\xc5\x3f\x7f\xf8\x4c\x11\x63\xaa\x1f\x17\x7f\x79\x78\x1c\xdb\x45\xd8\x2c\x35\xa8\xca\xd3\x53\xd8\xd8\x06\xaa\xf9\x70\xef\x6f\xd9\x83\x4b\x67\x29\xf6\x60\xdd\x54\xc5\x37\x24\xf7\xa1\xe7\x04\xc7\xa5\xb9\x3b\xc8\xa4\x6e\xb4\xba\x89\xba\x6a\xaa\xf9\x2f\xa6\x68\xee\xd2\x71\x97\x82\xaa\xc5\x69\x15\x67\xc8\xa9\xbe\xfc\xb0\xf8\x41\x56\x39\xb3\xca\x50\xee\x6b\xb7\x6e\x42\xdc\xac\x09\x0b\x59\xe3\xbe\xe5\x18\x29\x69\x69\x59\x95\x5d\x62\xca\xe8\x1f\xa8\xfd\xa3\x01\x1b\x8f\xfa\xa4\x5c\xf0\xa6\x7b\x8f\xba\xfb\x86\x3d\xef\xe3\xb3\xf9\xaa\x4e\x2d\x61\xa8\x3f\x67\x0b\x55\xf2\x82\x95\x7d\x05\x0a\xce\x7e\x2a\xec\x8a\xc2\x9e\xd2\x79\xdf\x11\xb6\x02\x6d\xd4\x62\xb1\xa0\xe3\x2b\x70\xbc\xbf\x91\x31\xf6\xcf\xdc\x73\xb0\x49\x5a\x1c\x97\xba\xf9\x71\x3a\x2f\xe1\x54\x74\xe7\x29\xed\x05\x83\x5f\xd8\x96\xad\xe3\x7b\xe5\xd4\xfb\x7a\xb9\x1f\x0c\xcb\x12\x85\x55\x78\x8a\x91\xe0\x06\xd5\x42\xe5\xb7\x22\x7e\x68\x0f\xb8\x76\x89\x2e\x58\x67\xf2\x55\xac\x12\x8e\xfe\x8e\x36\xbe\x9d\x8f\x2c\x80\xc3\x89\x4d\x15\xf2\x63\xf7\x88\xa9\x61\x0f\xab\x2e\x5e\x4d\xac\x07\xa5\x14\xc8\xad\x73\xeb\xc5\x80\xcf\x13\xee\x14\xed\x27\xd0\x9b\xd5\x47\x29\x2b\xbc\x25\x7e\xbf\x71\x34\x6a\xdf\x0d\xb4\x84\xf2\x17\x61\xf3\xed\x92\x06\xf7\xd3\x90\xef\x3c\x20\x94\x17\x12\xd6\xcb\xb1\xb6\x92\xbd\x5f\x3d\x65\xe1\xd1\xe1\xa1\x85\xda\x6a\x38\x2f\xa1\x81\x63\x4c\xef\x99\xdf\xd1\xa9\x6c\x45\x5e\x4d\x31\x5f\xa3\xcc\xd5\xef\x18\x9b\xf6\x37\x5e\x8f\x5e\x84\x87\x2e\x2e\xc8\xc2\xd3\xe1\x13\x3a\x3d\xca\x1b\x6f\xbb\x6d\xc1\x3f\x1f\x8b\xa2\x46\xd8\x0a\xa2\xf9\x7c\xfe\x00\xe3\xe0\x97\x1f\xc0\xe2\x20\x1f\xe0\xfb\x95\x8d\x67\xa6\x92\xe4\x99\x4b\x66\xad\x4c\x05\xee\x2d\xa7\xb7\x7e\xc6\xc0\xda\x48\xa9\xb1\x8d\xe8\x03\x9d\xc9\x7b\xa4\xeb\xc7\x3f\x57\xc5\x4b\x8d\x1e\xae\xf3\x53\xf8\xfd\x1e\xdb\xe6\xe4\xbc\xe9\xc0\x6d\xc5\xd2\xbe\x77\x42\x96\x1e\x56\xb2\xee\x77\x25\x5a\xc2\x41\xf9\x0a\x45\xf7\xdb\x96\x4f\x9b\x03\xcd\x4d\xa7\x7f\x30\x40\x13\x46\xb5\xfc\xa1\x5d\xec\xf8\x24\x49\x7a\x30\x87\x3c\x91\x0d\xd9\x72\xdb\xe8\x7a\x91\x0c\x46\x1a\x66\x4d\x66\x6e\x58\x7e\x95\xbf\xa0\x68\x8b\xec\x7c\xdc\xe8\xd4\xc4\xbe\x51\xde\xd0\x5e\x92\xdd\x28\x55\x36\xa7\xfb\x0b\x34\xd5\xd2\x79\xb7\x9e\xf6\xd2\xfb\x92\xec\x88\xee\xe9\x41\xfc\xcf\xe5\xed\xdd\x13\x2e\xdc\x4f\x12\x2a\x44\x87\x3a\xf9\x1e\xb5\xf1\x0c\x04\x33\x07\xd3\xf7\xa6\x60\xdc\x65\x9a\x65\xba\xfc\x21\xd1\x29\x90\xdd\x6e\x60\xe1\x1d\x3d\x55\xd8\xe1\x1a\xb5\xbe\x84\xa1\x71\x74\x28\xa8\xea\xd0\x57\x7d\xed\xfb\x2a\xc5\x42\xf7\x65\xa5\x38\x7e\xd7\x50\xb9\x65\x85\xf6\xa8\xaa\x50\xc2\x97\xde\x49\x69\x14\xd6\x29\xee\xa4\x1e\x8c\xd8\xde\xef\x68\xe7\x53\x80\x43\x55\xbc\xec\x7c\x88\x62\x13\x46\x7c\x07\xd8\x4f\xe4\x47\x19\x9e\xd4\xa3\x5d\x12\x0c\xd3\x08\x65\x23\xfd\x29\xfc\x1e\x85\xd5\x9b\x36\x5a\x0c\x6f\x0a\x9e\x76\xd5\x04\xdb\xdf\xa6\xed\x73\x23\x9f\x29\xdc\x08\x35\x2f\x08\x9d\x4c\x36\x2f\x0a\xab\x9f\xe6\xb8\x46\x98\x9e\x50\x35\xd3\x8b\xdc\x7d\x76\x4e\xa7\x4c\x05\x7f\x97\xe6\xf1\xb6\xb8\x51\x85\xc3\x5a\x30\x8a\x94\x43\x56\x3f\x80\x63\x56\x3f\x80\x97\x7c\x07\xce\x66\x9a\x0f\xb7\xc8\xac\x09\x26\xb4\x2f\x1b\x70\x31\x18\x70\x9a\x03\x1d\xb9\xb5\xf2\x06\x77\xca\x78\x11\x2c\xd0\xd0\x0d\xf1\x62\x25\xc3\x69\x3a\x76\x9f\x09\xdd\x1d\x2d\x91\x32\xde\x9f\x23\x4b\x13\x14\xe5\x4a\xd0\x71\xb7\x3b\xcc\x69\xb2\x30\x24\xf8\x17\x8c\x0c\xf9\x3d\x64\x67\xc6\x6f\xe4\xe1\xed\x21\x1f\x65\x2b\x6d\x6f\x86\x76\xcb\x08\x74\xfc\xd7\x70\x4c\xca\xea\xfb\x75\xc7\x20\xb0\xa1\x28\x23\x2f\x1d\xa1\x8e\x0c\xd4\x4d\xe3\xc2\x70\x0b\x0c\x9b\x52\xcd\x57\xc2\xba\xf6\x1c\x38\x91\xc7\xd6\x3a\xc4\x13\x79\x7d\x2b\xfb\xd5\x04\xfb\xfa\x32\x16\x96\x23\x5f\xa8\xd5\xcd\xea\x56\x9b\x15\xb9\x50\x8b\x71\x4e\x27\xbe\x64\x1f\x8d\x66\xf6\xc0\x97\xcc\x00\x0e\xa8\xb9\xe5\x26\x2f\x15\xf7\x45\xbf\xe8\x8a\x1d\x83\x03\x0b\xa7\x1e\x15\x51\xc9\x39\xa2\x09\x01\x2c\x44\x55\xbc\xa8\xe6\xa1\x2a\x5e\xec\x78\x8c\x23\x99\x4f\x81\x26\x55\xa7\x7d\x7a\x91\xa6\xaf\xf4\x44\x8b\x1d\x89\xc1\x04\x01\xdf\xf1\x64\x5b\x70\xab\x0a\xc8\x2e\x4e\x94\x99\x50\x60\x61\x5a\x3b\x50\x2e\x18\xf2\x7f\x4b\xf3\xb2\xa8\x9a\xf0\xd4\x48\x26\x5d\x28\x36\x19\xae\x2e\xe0\x62\x86\x6b\xa0\xe7\xb8\x05\x92\x23\x1f\x1d\x1c\x3e\xca\x8b\xad\x2d\x5d\xa8\x62\x13\x19\x3c\xe6\x80\x41\xb7\x59\x6f\x00\xdd\xcf\x13\x4b\x8f\x4b\x2f\x6f\x1e\x74\x9b\xf5\x16\x24\xfc\x9b\x0e\xba\x3c\xb9\xcf\xa0\x93\xf1\x4c\x1e\x74\xd6\xea\x63\x07\x9d\x8a\xe4\x8d\x83\x6e\xb2\x0a\xdc\x34\xe8\x04\xa6\x7f\xbf\x41\x27\x30\x31\x66\xd0\x61\xf0\xb7\x0d\xba\xa7\x27\x1f\xd0\xfd\xec\x60\xe9\x71\xe9\xe5\xcd\x83\xee\xe9\x29\x00\x09\xff\xa6\x83\x2e\x3b\xdc\x67\xd0\xc9\x78\x26\x0f\x3a\x6b\xf5\xb1\x83\x4e\x45\xf2\xc6\x41\x37\x59\x05\x6e\x1a\x74\x02\xd3\xbf\xdf\xa0\x13\x98\x18\x33\xe8\x30\xf8\xdb\x06\x9d\xef\x3f\x3d\x01\xca\xdf\x66\x96\x2e\x97\x5e\xde\x3c\xea\xfc\xc0\xf3\x40\xca\xbf\xe9\xb0\x6b\xb3\xfb\x0c\x3b\x19\xcf\xe4\x61\x67\xad\x3e\x76\xd8\xa9\x48\xde\x38\xec\x26\xeb\xc0\x4d\xc3\x4e\x60\xfa\xf7\x1b\x76\x02\x13\x63\x86\x1d\x06\x9f\x32\xec\xe4\xea\xbf\xa5\x7e\x9b\x25\x38\x79\x08\xcb\xd5\xef\x32\x6a\xde\x32\x64\xde\x3e\x5e\xee\x39\x58\xa6\xf4\xf3\x2d\xc3\xe4\xf7\x1f\x23\x53\x06\xc8\xa4\xd1\xc1\xab\x66\x74\xc3\x85\xb4\x10\x4a\x17\xef\xc5\xe4\x4d\x4f\x8f\xb6\x0a\xca\x8a\x10\x04\x21\xe6\xdb\x19\x85\x58\xd6\x0e\xbd\xe2\x6a\x54\x45\x2b\x67\x32\xa4\x89\xc3\xcd\x28\x42\xea\xe7\x28\x11\xc3\xc2\x8a\x81\x7e\x31\xe8\x3f\xa8\x8c\x61\x56\xfc\x2c\x33\x04\x5a\x1f\x8b\x17\x1b\x20\xf8\x39\x67\x94\x88\xb8\x4a\x42\xc2\x91\xbf\x77\x49\x79\xc0\x06\xd0\xd1\xd5\xc1\x37\xed\x80\x93\xf6\x28\x2d\xf0\xff\xff\x30\x62\x6b\x13\xb0\x55\x90\xf1\xed\xb0\xff\x9f\xaf\x1e\x7f\x60\xef\x68\x34\xf5\xe5\x87\xa0\x2b\xc8\xd2\x13\x8a\xc3\xf2\xcb\x0f\x84\xeb\xae\x38\x4f\x1b\x54\x65\x69\x9e\x36\x5f\x7e\xf0\x3d\xba\x2b\x6a\xe9\x6c\x8e\x41\xf0\xcb\xd2\xf1\x57\xf4\x6f\xb0\x38\x06\x01\xb0\xc5\x0e\xee\x27\xd4\x36\x53\x06\x04\x86\x77\xc2\x49\x82\x25\x35\xac\x63\x87\x81\x8c\x18\xd6\x49\x58\x7d\x03\xed\x4b\xf7\xe9\x13\x86\x52\xc8\x03\x00\x6a\x22\x59\x18\x99\xd1\x90\x04\xab\xd5\x8c\xff\x4f\xec\x3d\x73\x6d\x1b\x4b\x03\xc6\x44\x22\xb6\x19\x45\x0d\x34\x29\x12\x9e\xc0\x8a\xc7\x68\x58\x2c\x24\x15\xbb\x62\x81\x94\xcc\x8a\x0e\x67\xfc\x48\x0c\x33\x0c\x98\x12\x45\x3c\x80\x41\x91\x20\x7c\x43\x57\xfc\xab\x5a\x15\xcc\xb4\xd3\xff\xe7\x77\xb3\x2d\x72\x67\x29\xa6\x65\xd4\x10\x91\xec\x8b\x45\xc4\x90\x51\x81\x20\xf4\x61\x1d\x87\x55\xf2\xa6\x8f\xe7\x23\xbf\x6c\xf6\xb3\x64\xef\xf9\xa5\xa8\x12\x1a\x19\x46\x15\x0a\xbf\xb9\xf8\xf7\xc8\x94\x98\xdd\xae\x9d\xa1\x8c\x98\x81\x31\x25\x26\x6e\xf1\x4f\xc7\x4a\x3e\xeb\xe6\xa9\x07\xd1\x08\xd4\x9c\x7c\x70\xd5\x0e\x9b\x39\x42\x39\xcb\x83\x38\x9c\x3b\x63\xe4\x1e\x1f\x8d\x6e\x7f\x52\x4f\x27\xdb\xbf\xb3\xe5\x0d\x91\x29\x03\x27\x3c\x45\xda\x6e\x54\x24\xaf\x83\x1b\x48\xf8\xd7\x52\x5f\xaa\xda\xa4\x4d\x86\xd4\x9d\xe2\x1b\x01\xa0\x3e\x47\x12\x0c\xd9\x7c\xc3\x77\xa5\xea\x3b\x45\x09\x4e\xd4\x36\x62\x3b\x61\xa8\xc1\x7d\x61\x1d\xd4\x8f\xfd\xa3\xb4\x0b\x5d\x6e\x09\x4b\xca\xd8\x7d\x14\xe6\x3b\xc9\x03\x30\xd7\x81\xa6\xba\xa2\x26\x7a\x8b\xc7\x67\xd3\x5e\x33\x55\x63\x25\xea\x90\x52\x31\x81\x91\xfd\x88\xec\x4b\xb5\xeb\xf8\x65\xfb\xe8\x00\x45\x9e\xe3\x49\x08\x7f\x14\xf4\x67\xac\x0a\x77\x3d\xbc\x2f\x8a\xc6\xdc\x23\x63\x7b\x40\xce\x7c\x6a\x68\x3e\x25\x05\x28\x77\xb7\x09\xd2\x83\x9a\xab\x17\x49\xad\xa7\xbb\xfe\xe4\x03\xae\xf3\x35\x24\x50\x57\x4e\x69\x41\x8f\x87\x72\x50\x25\xbd\xb1\x4c\x82\xec\xe2\xb2\xd3\x90\xb0\xb1\xda\x69\x7e\x70\xb1\xee\x66\xe1\xeb\xe0\x56\xe2\x7e\x2f\x08\xdd\x22\x02\x8f\xc4\x34\x3f\x08\x69\xb1\x9e\x87\xb4\x47\xe0\xa3\x29\x4a\xa0\xa6\x6a\xcc\x74\x14\x46\xc3\x66\xa5\x46\x5b\x03\x10\x84\xec\x98\x99\x28\x60\xd3\x8c\x64\x13\x24\xe4\x4b\xbf\xe3\x39\x1a\x8e\xdb\xa1\x2e\x55\x56\x29\x7f\x55\xb6\x96\x0d\x09\x3d\x63\xfa\x42\x1a\xb0\x8c\x46\x8a\x94\xa3\xda\x2b\x25\xbb\x18\x29\xd1\xd9\x1a\xdd\xf0\x9d\x8f\xed\xc7\xc7\x67\xf1\x79\xb2\xcf\x97\xb6\x6c\x09\x1c\x76\x4a\x2c\x59\x60\xcc\x30\xe3\x98\x9e\x12\x7f\x27\x29\x31\x03\x78\xa3\x98\x28\x6b\xa3\xe5\x04\xd0\xb4\x75\x31\xec\xde\x84\xda\x3f\x4a\x7c\x33\x23\xa0\x64\x5b\x50\xeb\x98\xc2\x93\x49\x99\x3c\x6c\x48\x1d\xd9\x7e\x58\x76\xcc\x8e\xc4\xc2\xec\xc2\x44\x8e\x74\x8f\x31\x31\xcf\x85\x05\xa3\xb9\x89\x37\xe1\x00\x1b\x38\x84\xa9\x38\x65\xaf\xa0\x47\x94\x6c\x3f\x5c\x63\x1c\xff\x13\x82\xd4\x61\x3a\xc3\x42\x9c\x16\x99\x8a\x04\x47\xa6\xd2\x15\x18\x03\x72\x62\xdd\x03\xab\xd6\xde\xd9\xbd\xd1\x0a\xe2\xea\x58\x67\xbc\x53\xb3\x56\x83\xb6\x8c\x05\xde\x03\xd6\x8c\x61\xb8\xf0\xc3\x42\xf4\xb7\x1b\x17\xe7\x53\xb3\x5b\x3c\x2b\x3f\x15\xa8\x43\x58\x76\xfb\x22\xf5\x22\x90\x47\xdb\xce\x44\xfa\x61\x09\x4f\x09\x93\xb8\x3a\xe7\xd1\x1d\xcf\xa7\x74\xf1\xaa\x1e\xed\xf9\x74\x57\xe7\xd0\xfd\x0c\xd2\x39\x1d\x55\x3d\x7b\x9e\x49\x2c\xfd\xa3\x5a\xd0\x9d\xc3\xb1\x6e\x9c\xb5\x7f\x9e\x51\x92\xbb\x77\xdb\x33\x3f\x3f\x8c\xa0\x4f\xa6\x46\x1d\x17\xc6\xfb\x7c\xde\x8c\x89\xdd\xca\x23\xd7\x51\x8e\x72\xf0\x93\x38\x65\x78\x48\x4f\xa4\xda\xb0\xa0\x95\x7d\xd1\x9a\xb8\x40\xa9\x94\xe1\x01\x69\x73\x1b\x87\x16\x6b\xf3\x3f\x6f\xdc\xd9\x1c\x8b\x8d\xea\xc9\x89\x16\xbf\xa7\x66\x37\xaa\x36\xef\xab\x51\x60\x3d\x2a\x62\xef\x33\xea\x8c\x38\x34\x62\xb8\xa9\xbd\xc7\xcf\x97\x47\x45\x0a\xb2\xfe\x41\x27\x0e\x47\x9e\xce\xb9\x0a\x48\xcd\x2b\x4f\xd0\xc1\x30\x68\x62\xe6\x97\xad\x72\xe8\x2e\x58\x0d\x5d\x7d\x65\x38\xb4\x28\xf3\xc6\x97\xd3\xfa\x82\x31\x77\x63\x8d\x32\x1f\x4a\x5f\xb0\x61\x40\xf6\xbe\x08\x5d\xa3\x4e\xb5\xc7\xec\x48\x9f\xaf\x60\x8c\xb6\x61\x60\x52\xfc\xc5\x80\xde\x2f\xb8\x52\xc2\xd4\x26\x8e\x02\x80\x9a\x0e\x20\x91\xab\x73\xb0\xbb\x26\x5d\xac\x05\x23\xbc\xa5\xb7\x82\x21\x2b\x61\x64\xff\x26\x9b\x31\x68\x32\xa8\x63\x0a\x93\x83\xdd\xeb\xe0\xfe\xc2\xdd\xb5\x54\xcf\x85\x4b\x29\x3b\x37\x6a\xca\x4e\x20\x45\x27\x70\x8b\x8c\x72\xb2\x20\x0a\x6b\x44\xaf\x8d\x83\xbd\x28\x66\x96\x9e\xff\x55\x3e\xc5\x47\xcd\xc9\x61\x6d\xd1\x0d\x06\x3f\xc1\xc7\x10\x90\x45\x18\x75\xcb\xc3\x5a\x73\xa9\x6b\x2d\x63\x25\xb9\xf9\xa9\x43\x52\xa5\x79\x58\xbd\x8e\x3b\x81\x27\x55\xf9\xf5\x58\xa1\xfd\xd7\xee\x02\x10\xe0\x95\x76\x49\xe3\xe8\x7b\x6b\xd6\x41\x1c\x73\x72\xdd\x5d\xfb\x63\xee\xd6\xd7\x2a\x41\x5c\xaa\x2f\x6f\xe5\x73\x1d\x6f\x56\x9b\xa4\x23\x29\xdf\xc3\x6f\xbb\x75\x5d\xa9\x02\xf2\x28\xbd\xba\x95\x43\x1f\x6d\xd0\x62\xc9\xc9\x89\xf7\xb3\xdb\x2e\xe9\x16\xe1\x21\xde\x84\xf2\x9b\x19\xf3\x37\xe1\x36\xe2\x84\x94\x7b\xbc\x7d\xdf\x37\xde\xda\xac\x54\x81\xd8\x93\x5f\xc9\x97\x34\xf9\xfe\x58\x0e\x93\xc5\x13\xf2\x3c\x4e\x4e\xbe\xdf\xd9\x76\xab\xaf\x5c\x03\xe2\x4f\x7a\x73\x6b\x07\x46\x49\xe0\x2f\x3a\xf6\xa4\xdb\x7f\x0d\xdd\xc7\xaf\xdd\xed\x2b\x40\xcc\x89\x2f\x6e\xee\xba\x10\x79\x48\xe8\x88\x6a\xe0\x80\x6f\x77\x29\x6b\x07\x0f\x77\x5b\x57\x7e\xb3\xd6\x25\x81\x1f\x2c\xaf\xf3\x7f\x9c\xf3\xa8\x68\x2a\x21\xc9\x73\x60\x98\x34\x05\xe0\xa2\xbf\x61\x92\xb4\xb0\xcf\x43\x75\xaa\x4b\x4c\x95\x38\x30\x81\xa7\x51\x5b\xfa\xd4\x74\x09\xd7\x79\x98\xa1\xaa\x01\xbc\xc6\xa8\x4f\x3b\x7e\xef\x65\x27\x1d\xea\x23\x44\xc9\x47\x81\x7e\xf8\xb2\xf3\xa8\xfc\xa5\x76\x63\xeb\xc6\xe3\xdc\xba\x49\x5a\xe7\x69\x5d\xa7\x51\x86\x9c\x79\x9c\x15\xb5\x29\xa5\x45\xff\x59\xc0\xd0\x1c\x90\xb4\xe2\xdb\x3c\x6f\xe9\x6d\x81\x4b\xc5\x3f\xc4\x31\x5a\x69\xf1\x7b\xb4\x4d\x42\xec\xf3\x24\x54\xce\xb1\x12\x43\x15\x06\xfa\xb4\x8f\x13\x1d\x54\x6c\x7f\xc7\x41\xb0\x59\x05\x1c\x50\x73\x6c\xcb\xf5\x32\x5c\x82\x41\xf5\x06\x6d\x91\x7a\x5f\x73\x92\x24\x7b\xa4\x23\x83\x59\x8c\xf7\x49\x90\xac\x75\x60\x80\xc9\x00\x2d\xfc\xc5\xa2\x03\x95\xbd\x9a\xbf\x5a\x6d\x82\x25\x34\xe6\x97\x28\x49\x54\x16\xe3\x05\x5a\xc7\x91\x82\x0a\x66\x30\xf2\x93\x7d\xa4\x81\x42\x7d\x18\x05\xc8\xef\xd8\x13\x5d\x9a\x17\xaf\x96\x6b\xe0\x23\xe5\x87\xc4\x47\xf1\xde\x57\xe5\x8b\xd0\x0a\x45\x22\x1e\x98\xb1\x30\x4a\x12\x6c\xcc\x04\x38\x88\xab\x75\x10\xf7\x9d\xa6\xf8\xb3\xed\x6a\xbd\xf4\xa0\x4e\xdb\xef\xf7\x8b\x38\x51\xef\xe1\xde\x23\x14\x85\x0a\x2a\x98\xb7\xfd\x1e\x6d\x43\x5f\x05\x05\xd8\x5b\x2d\x16\x7b\xaf\x63\x4f\x76\x66\x9b\xc0\x8f\x41\x91\xee\xb7\xc9\x46\x13\xe9\x7e\x15\x0b\x22\xa5\x98\x0c\xcc\xf9\x91\x17\x6d\x14\x48\x80\xb7\xe5\x93\x1f\xf8\x9b\xde\x5c\x08\x9e\x6c\xeb\x6f\xfd\x6d\x00\xb1\x86\xf0\x3f\x95\xb5\x64\x9f\xec\x91\x84\x08\xe6\x0c\xc5\x28\xde\xaf\x65\x40\x80\xb1\xf5\x16\xff\xeb\x1b\xd0\xbb\x31\x3f\xf2\x51\x00\x39\xd9\x64\x9d\x6c\x93\x27\x75\x14\xac\xe3\x6d\x1c\x8a\x78\x0c\x43\xe0\x29\x8a\x22\x24\xc1\x41\x9a\xb6\xf4\x56\xde\xea\xfa\x47\xbe\x44\xf9\x0d\xbd\xee\xab\x30\x47\xb5\x53\x56\xc5\xa1\x42\x75\xed\x46\x61\xe5\xd6\x4d\x95\x96\xa8\xbe\xec\xab\x22\xbf\x40\x69\x33\x7d\x9a\x56\xa7\x29\xc0\xb7\x9e\xe3\x5d\xaf\x7f\x7c\x47\xdc\x73\x8e\x71\x78\x4d\x4c\xcc\x4d\xaa\x5e\x34\x2a\xcc\x7b\x37\xf0\x07\x7a\xfb\x82\xa6\xd8\xae\xfb\xdd\x9e\x31\xe5\x36\xa8\x31\xcb\x58\x32\x9f\xac\xff\x13\x7d\x27\x1a\xbd\x54\xda\x3d\xe0\x46\xa2\x53\xf3\x69\xb9\x4a\xd0\x61\x06\xec\x73\x5b\x3d\x3a\xc1\xea\xe3\x4c\x70\xf0\xda\xef\x95\xf7\xd1\x50\xd3\xfc\x66\xa3\xe0\x50\x7e\x3f\xea\xa7\xe7\xfb\x8c\x20\x52\x0b\xc3\x53\x9a\x87\x0d\x4a\xba\xe5\x7a\x5a\x80\xb5\x07\xd2\x44\xc7\xe7\x17\x6a\x3b\xe9\x69\x9f\x9e\xd2\x06\x3d\x4f\xae\x71\x9d\x93\xc8\x6d\xb2\x16\xd8\xae\x05\x63\x38\xd5\xbd\x46\xec\x4b\xe8\x55\xd8\x9b\xf2\x5b\xa7\xd8\xb8\xaa\xfb\x62\xdc\x90\xd4\x16\xb7\x28\xc8\x29\x89\xf4\xfb\x74\x4d\x38\x78\xdc\x6e\x78\x2b\x45\xef\x22\xf2\xf1\xd7\xe6\x1a\x30\xcb\xeb\xef\xec\x1e\x60\x73\x72\x42\x05\xcb\xf8\x35\x5a\x5b\x28\x4d\x73\x2c\x8d\x5b\x88\xd5\xf7\x05\xbd\xdf\x7e\x3b\xcb\x96\x3a\x6d\x9b\xd7\x1d\x3e\x64\x6a\x0d\x01\x55\xc2\xba\x95\x4d\x81\x15\x2e\x2e\x56\xb1\x8c\x4e\x4b\x49\x76\x82\xaa\x78\x99\xd6\xdc\xe3\xc3\x82\x80\x7a\x9f\x9d\xeb\xa3\xb6\xfb\x4c\xb9\x04\x44\xde\xd0\xa0\x4f\xea\x54\x7c\xb7\x6c\xce\x04\xf1\xdc\xb2\xd9\x12\x32\x1a\x63\xa7\x58\x6c\x36\x15\x9a\x10\xcc\xe8\x85\x65\xe3\xf0\x9b\xd1\x30\x35\x33\xbf\xa7\x37\x0c\xd8\x89\x31\x24\x03\x40\xca\x37\x12\x43\xbb\xd9\xd4\xd0\xc8\x10\xdf\x2c\x6f\x27\x36\xd7\xaf\x00\x87\x14\x93\xf2\xa0\x28\x26\xe9\x30\x0d\xf1\xf8\xb9\x27\x9b\x66\xea\x2d\xe8\x50\x98\x98\x37\xd0\xb0\xa1\x32\xca\xaf\x87\xb0\x4a\x50\x45\x34\x08\x26\xfb\x22\x53\x1f\xb0\xd9\xb3\x85\xad\x01\x39\xaa\x70\x76\x49\x72\x3e\x24\x49\xb2\xce\xd3\x51\x8f\x9c\xa0\xb3\xb9\x38\xd0\x06\x8a\xc0\xc8\x3a\x84\xdf\x8c\xc6\x2c\x41\xf6\xde\x2e\x3f\x09\xc9\x00\x90\xbc\x3c\x69\x6a\x37\x5b\x58\x30\x32\x34\x24\x39\x09\x6a\x60\xf5\x9c\xf1\x20\xc9\x8d\x75\x98\x86\x78\xd4\xca\x05\x5b\xa4\xd0\x99\xc7\xb5\x4d\x2c\xeb\x98\x0d\x08\x8c\xb2\x22\x2f\xad\x82\x12\xaa\xdb\x20\x64\x23\x69\x6a\x25\x5b\x62\x81\xf9\x18\x90\x8f\x00\x32\x60\x1e\x19\x75\xd9\x3c\xd2\xee\xd1\xb0\x8e\x5f\xc0\x21\x6b\x35\x3a\xe7\x0c\x81\x89\x6b\x10\xbf\x19\x8d\x51\x50\xfc\xbd\x55\x56\x32\x92\x01\x20\x49\x62\xb6\x76\x6f\x43\xdf\xcc\xf0\x80\xd0\x64\xa8\x81\xef\x7a\x8c\x07\x39\x4d\x3a\xed\x30\x0d\xf1\xd8\x95\x2d\xba\x88\xa5\xb3\x4f\xeb\x9b\xd8\x86\xb0\x1b\x91\x18\x65\xc6\x5e\x5b\x45\x26\xa1\xb0\xc3\x48\x02\x33\xb7\x98\x2e\xc6\x99\xb8\x19\x90\x97\x04\x64\x17\x17\xe7\x40\x12\x17\xeb\x2a\x0d\xef\xc8\xc5\x3e\xba\xae\xa7\xf3\x4e\xaa\x9b\x78\x06\x70\x9b\x50\x18\x45\x45\xdf\x5a\x25\x25\x22\xb0\x82\xc8\x03\xcb\xd4\x56\xb6\x34\x69\x60\x65\x40\x4c\x22\xcc\xc0\xa0\x62\xf4\xe5\x41\x45\x3b\x09\x90\xfe\x88\x95\x4f\xb6\xc8\x09\x29\x58\xf5\xcd\xac\x57\x2a\x66\x03\x02\xcb\x60\xaa\xbe\x0d\x0d\xa5\xae\xba\x0d\x42\x0e\x26\x4c\xad\x64\x4b\xb4\x30\x1f\x83\x83\xa8\x52\x93\x3d\x1b\xc2\x08\x46\x5d\x0e\x23\x68\xf7\xb0\xaf\x64\x34\x5f\x29\x99\x44\x4a\x1b\xa5\x56\xea\x15\xb4\xfa\x7e\x96\x6e\x62\xe0\xd1\x45\x97\xee\x56\x00\xbf\x6c\x1d\x8f\xe4\x92\xee\x6e\x19\x98\xaf\x18\x41\x3e\x7d\xa7\x3f\x94\xa9\x8f\x07\xaf\xde\x74\x48\x36\xab\x2b\xeb\x12\xf6\x89\x8f\x2d\xa3\x78\x86\xac\xa2\x9e\xe9\x96\x8d\xeb\x3c\x2f\x92\x30\x73\x8b\x12\x9d\x2e\xca\x4a\x30\x7b\xd7\xaf\xe1\xec\xd3\x16\x25\x03\x67\x8a\xf8\x94\xdf\xf7\x56\xfd\xdd\x58\x94\x79\x65\x9d\x59\xb8\x90\x83\xd0\x99\xef\xc3\x04\x39\x8c\x9f\x24\x0d\xb3\xe2\x70\x21\x2b\x9d\x94\x38\x6f\x00\x29\xda\x17\x55\xee\xcc\x17\xb5\x83\xc2\x1a\xb9\xc5\xb9\x79\x16\x20\x6f\x85\x98\x0d\x90\xd0\x5e\x53\x3c\x59\xd8\xa0\x4f\xde\xcc\x0d\x56\x1f\x1f\x9f\x2d\xef\x78\x33\x69\xfe\x72\xa9\x99\x76\xcc\x9e\x09\xad\xf7\x28\x8a\x8f\xe1\xec\xa4\xe8\xb6\x5d\x4f\xf3\x92\x57\x96\xca\x44\x22\xae\x2f\xd1\xd1\xf5\x4a\x72\x58\x93\xdd\x92\x41\xae\x75\x01\x2f\x2c\xa7\xa8\xd8\xfa\xfb\x6f\x71\x18\x58\xe1\x42\xbd\x68\xc5\x60\x06\xb2\xb4\xdc\xf5\x29\x85\x07\x0e\x00\x07\xda\xf1\x5f\xb2\xc1\x50\x55\x58\x17\x13\x48\xaa\xa2\xbc\x75\x84\x2c\xa1\xc8\xdd\xf3\x34\xfc\x64\x64\x88\xb7\xbb\x28\xaf\xb1\x46\x5d\x44\x03\x43\xdf\xb3\x83\xa8\xf7\x5c\x7c\x7f\x53\xb2\x72\x72\x8a\xcb\x78\x75\x82\xfc\x4d\xc9\xba\xa1\x14\xde\x00\x2a\x37\xdb\x51\x2c\xa3\x70\x84\x8c\x9e\x6f\x73\xc4\xff\x8a\xc3\x02\x3a\x89\xac\x5d\x3a\xde\xc9\xa0\x48\x5e\x2d\x37\xd2\x0e\x9e\x81\x26\x07\xed\x28\x2a\x76\x4a\xf6\xbd\xbe\x98\xa1\x53\x02\x27\xca\xc2\x2f\x20\x11\xc9\xe7\x6d\xbb\x15\x7e\x91\xd9\x9f\x80\xdb\x7b\xc5\x0d\xd6\x7c\xe5\x1a\xa8\x23\xde\xe2\x2c\x9d\xf5\x93\xeb\xd4\x71\x55\x64\x59\x14\x56\x6e\x8e\xc2\xfa\x6c\xbe\xa0\xe5\xe9\xe9\xe9\xa9\x6c\x99\xe9\x5a\x61\x73\xc5\x84\x45\x9e\x3b\xdf\x43\xf1\x59\x76\x14\x49\xa6\x51\xc8\x3b\xed\x79\xbd\xfe\x2c\x3c\x45\x65\xea\x5c\x00\x5d\x60\x50\x5b\x62\x4d\x5a\x27\x13\xd1\x6f\x69\x9d\x79\x53\x14\x59\x93\x96\x96\xbb\x47\x7d\x6f\xa3\xde\x39\xd9\xdd\x64\x44\xa2\x94\x7d\x98\xa7\xd9\xeb\x0e\x3b\xfa\x0c\xb9\xf5\x6b\xdd\xa0\x7c\xf6\xe7\x2c\x3d\x7d\xfb\x25\x8c\xff\x4e\x7e\xfe\x7b\x71\x6a\x66\x0f\x7f\x47\x87\x02\x39\xff\xf5\xd7\x87\xd9\x7f\x16\x51\xd1\x14\xb3\x87\xff\x89\xb2\xef\xa8\x49\xe3\xd0\xf9\x0f\x74\x46\x0f\xb3\x3f\x55\x69\x98\xcd\xea\xf0\x54\xbb\x35\xaa\xd2\xfd\xec\xe1\x4f\x18\xa9\xf3\x33\xb6\x54\xce\x5f\xf2\xe2\x1f\xe9\x43\x8f\x47\x2f\xf8\xfb\x6b\x1e\x15\xd9\x03\x0b\xa7\xd8\x91\x8b\x2a\x0f\xb3\xc1\x2b\xfd\x85\x0f\x63\x58\x91\xc4\xdf\xd4\x0e\x81\xe1\x91\x18\x7c\xf5\x05\xbd\xef\x24\x65\x19\x6a\xb0\xfb\xc0\x26\x0a\x6b\x3c\x63\x88\xa4\x95\x20\x19\x25\xa4\x12\x15\x4a\xda\xa6\x4c\x8a\xe8\xae\x68\x52\x91\x8e\x73\x6d\xd7\x38\x98\xb1\x42\x30\xe6\x4c\xe6\x8a\x15\x7f\xea\x5e\x38\xf3\xb0\xaa\x8a\x17\x40\x27\xa0\xab\x47\x57\x82\xe6\x63\xdb\x22\x23\xb1\x5c\x73\x64\xba\x83\x85\xbf\xa0\xf2\x23\xc6\xa0\xe7\x39\xaa\x5d\xf6\xe8\xe2\xd6\xff\xda\xba\x65\x16\xc6\x28\x47\xa7\xe6\xff\xfd\xd2\x14\xe5\xd7\x19\x04\xda\x60\x97\xc9\x2c\x0e\xb6\xbe\xde\x04\x84\xac\x21\x26\xbc\xbc\xb3\xfa\xcf\x2b\x53\x31\xf3\x2e\x1a\xa0\xd0\xf5\xa4\x74\xa0\x64\x51\xb6\x52\xf2\x7b\xda\x75\x9d\x64\x1c\xd2\xda\x67\x7d\x9f\x0a\x71\xfa\xa3\x38\x25\x46\x12\xee\x56\x9a\xe7\xaf\x9b\x0a\x38\xa2\xfc\xc7\x20\xb5\x75\x2d\xbb\xff\x8f\x76\x2e\x3f\x2b\x3c\x1d\xb7\xb5\x73\x45\x1a\x6a\xf7\x12\x1b\x3f\xa6\x77\xa5\x1e\xa6\x41\xc2\xe4\x3e\xa6\xca\x03\x77\x32\x3b\x98\x7a\x8b\xfa\x32\xb4\xb6\x6e\xa6\x20\xbc\x9f\xd9\x97\xc6\x1b\x90\x5b\xfb\x59\x22\x32\x5d\x8f\x3d\xde\xcf\xca\x27\xeb\xc9\xdd\x8c\x49\xc1\x9d\x8c\xdf\xdc\xa4\xc8\x04\xa5\xad\x83\x31\x00\xef\x5e\x16\xa0\xdf\x80\xda\xda\xbd\x02\x89\xae\x73\x95\x44\x41\xa3\xb4\x59\xeb\x67\x12\x0f\x03\xbd\xec\xa6\xa7\x13\xaa\x84\x68\x82\xa4\x12\xee\x62\xba\x45\xd9\x3a\x5b\x42\xab\x9b\x19\xe9\x07\x70\xc0\x79\x88\x69\x83\x57\x51\x92\xd5\x0a\xd3\xbe\x62\x6d\x9e\xb3\xd6\x23\x96\x8e\x55\x1c\x76\xfd\xdf\xc0\xe5\xff\x9c\xc0\xe5\x37\x99\x6a\x77\x3a\x36\x2d\xf6\x99\x6f\x85\x7b\xd7\xe7\x4b\x00\x11\xbb\x1b\x72\xa6\x15\x1b\xc3\x22\x99\xce\xa4\x20\xc9\x40\xc3\x34\xe6\x09\xf7\x06\x86\x47\x56\xc2\x66\x88\x3d\x1a\xe3\x31\x00\x14\xc7\x63\x4a\x02\x80\x89\x68\x3b\x93\x0b\x63\xd7\xa3\xb2\xa9\x98\x55\xc1\x4d\xa8\xc8\x4d\xb5\x95\x35\x1b\x7e\x20\xe8\x93\x3d\x1f\xf3\x8b\xb7\xb4\x6a\x24\x73\x1d\x59\x96\x64\x6a\xab\x67\x85\xda\x2a\x0b\x24\x54\x47\xa5\xb1\xb6\x7a\xbc\x6f\xc7\x6b\xdd\xc7\x19\x24\x09\x94\x3e\x11\x96\x78\x86\xad\x3f\x38\xae\xff\x38\x8a\x65\xba\xa3\x6c\x14\x9f\x3c\x18\x06\x80\x69\x30\x2c\x2d\x46\x4c\xd0\x69\x25\x20\x36\xe1\x57\x03\xe2\xe9\xb8\xa7\xe9\xb5\x21\x96\x1e\x60\xcf\x46\x63\x30\xe6\x96\x84\x44\x22\x90\x69\xda\x7e\x2b\xcb\x8c\x15\x40\x53\xc4\xa0\xfe\x36\xf5\x1e\x2d\x01\xa0\x17\x29\x47\x46\x05\x87\x26\x1e\xe3\xf5\xb9\x9b\x78\x00\xd0\x6c\xe2\x21\xc8\x66\x8a\x42\xab\x73\x0f\x23\x01\x65\xee\x71\x03\xf2\x69\x2a\x6d\x9a\xb7\x0c\x31\x68\xa3\x32\x62\x82\xa3\xd9\x9e\x69\x5a\x7d\x3b\xd7\x3c\xf9\x89\x36\xb6\xa4\x59\xd4\x6d\x7a\x3d\x5e\x0e\x50\x57\x12\x9e\x86\x14\x5b\x9e\xeb\x4d\xd6\x6c\x87\x43\xf3\x3c\x95\x63\x7a\x0e\xae\x62\x9f\x7e\xac\xbc\x8f\x60\x88\x18\x78\x5a\xae\x3b\x0f\x9c\x87\xe9\x1f\x28\xf6\x1b\xfc\x6f\x64\x7b\xd9\xdc\x16\x80\x25\x73\x5b\x79\xc5\x7b\xc2\x38\x96\x27\xb8\x06\xf4\xda\x04\x77\x32\xea\x69\x63\x18\x9e\x1a\xdb\x99\xb3\x51\x80\x66\xd0\x46\x9f\x44\x4d\xed\xb4\xe1\x7b\x1b\xc3\xd2\x5c\x1e\x70\x8c\x6f\x19\xba\x63\x3b\x5f\xef\x41\xc6\xcf\xd0\xc0\x15\x17\x0f\xc4\x61\xab\xa5\xab\x05\x92\xe5\x74\x1f\xc1\x84\x7d\x11\xda\x09\x61\x68\x66\x48\x46\x8c\xe5\x93\x5f\x84\xff\xd9\xf3\x84\x2e\x46\xa7\x09\x5d\x88\xe9\x3a\x15\x9b\x01\x25\x06\xe9\xcd\x4c\xf2\x0a\x37\x5f\x3a\xf4\x42\x52\x92\x15\xe7\x1a\x65\xfa\xf7\xbe\xfe\x1d\x5b\x8b\x31\x7d\x53\x27\x67\x80\xb4\x6d\x16\x7d\x65\xfb\x91\x19\xb2\x0c\x30\xfa\xf3\x9f\x40\xd1\xbe\x8d\x62\x4d\xf7\x38\x18\x36\x48\x8c\x7a\x0b\x6d\x9d\xe0\x15\xf9\x2b\xac\x1f\xfb\x30\x46\xee\xf7\xb4\x4e\xa3\x34\x4b\x9b\x57\xbe\x41\xc1\xf2\x8a\xd7\x2e\x51\x55\x97\x28\xa6\xd7\xf6\x7a\x74\x81\x4b\x2b\x52\xba\xd2\x3d\xa1\xb6\x99\x29\x65\x65\x85\xbe\x2b\x65\x86\xdb\xc1\xc7\xe1\x32\xf9\x21\xa8\xbe\x52\x84\xb5\x1d\x42\xa9\x14\xd1\xa9\x8c\x65\x8f\xc8\xff\xf3\x09\xde\x22\x82\xcb\xaf\x7f\xac\xcf\x65\x59\x54\x4d\xed\x7c\xfa\xa4\xe1\x60\x0b\x16\x65\x85\x6a\x54\x7d\x47\xee\x22\x79\x74\x8a\xca\xf9\x64\x03\xa0\xe9\xff\x7e\x9b\x96\x2d\x12\x6a\x4a\xc1\xe6\x75\x2f\xaf\x57\x26\x41\x08\xbd\xca\x06\xe6\xd6\xde\x99\x78\xc8\x18\xfa\x93\xbc\x7a\x97\x2e\xbd\x5f\x03\x16\x09\x61\xd3\xd6\x6d\xdd\x7b\x53\xcf\x99\xe4\x67\xef\x38\xd7\xd2\x73\xee\x6f\xdc\x75\xb7\xb4\x60\x91\x50\x36\x6d\x5d\xe7\x8a\x7d\xd7\xa1\xc7\xf1\x63\x55\x64\xaa\x91\xe0\xc5\x36\x3b\xd1\xef\x0f\xfa\x7d\xce\x4a\x33\x37\xb1\xfa\x68\xff\x40\x20\xed\x5f\x84\x9a\xdd\xed\x67\x04\x5f\xd2\xfd\xa4\x70\xcf\x18\x6b\x92\x97\xe3\x12\xd3\x74\x7b\xb3\x9e\xc5\x2f\xe8\xb0\x20\x84\x54\xc7\x3a\xa7\x7d\xd0\x0c\xbe\x26\xf7\x95\x18\x58\x1d\xbc\x3f\x3d\x10\xb6\xa5\x90\x67\x61\xb3\xa6\x78\xc6\x7b\xfa\x45\xe9\x36\x86\xde\x74\xb9\xca\xf0\x45\x2a\xce\x3e\xcd\xb2\x2f\x3f\x7c\x0c\x16\xfb\xfd\xfe\x07\xf9\x36\x96\xad\xb3\x15\x2f\x5a\x49\xbe\xfc\xf0\xcb\x6a\x1e\xac\x1c\x2f\x73\x97\x0e\xfd\xe7\xcf\x57\x2e\xfe\x5f\x40\xff\xe7\xb0\xbf\x2e\x2b\xff\x27\x70\x43\x8a\x59\x30\xff\x62\x6d\x0d\xe6\x1b\xd2\x56\x7f\xbe\xc2\xed\x74\x84\xf6\x91\x67\x5e\xbe\x74\xc9\x3f\x6b\x5b\xd3\x53\x92\xc6\x61\x53\x54\x35\x60\x48\x94\xad\x86\x64\x4a\xab\x7e\x85\x5b\x4d\xb0\x2f\x23\xcc\x06\x7c\x14\x9e\xa7\x6b\xff\xa8\x64\x67\xff\xa8\xa6\x5d\x05\x5b\xe6\x64\xa9\x6d\x2f\x9d\x27\xed\xa5\xeb\x7e\xf1\x5d\x57\xfd\xd8\x5a\xf4\x73\xfc\x4a\x2d\x20\x0c\xe1\xdf\xc4\x8c\xe0\xbe\x39\x35\x64\xf7\x18\x74\xc4\x1c\xbe\x6c\x07\xe6\x7c\x60\x5d\xc2\x15\x85\x32\x90\xc9\xb8\x4b\xcf\x21\x2f\x4d\x98\x29\xd3\x89\x20\xb4\xa7\x87\x9d\x9f\x7f\x27\xda\x3c\x70\x36\x9c\x0a\xef\x07\x6a\x58\x92\x44\x08\x26\xcd\xc5\x0a\xc2\xb3\x83\x75\xac\xe2\xc2\xfe\x1b\x72\xa7\x70\xb8\x33\x03\xe1\xfb\xb6\x2b\x56\xb4\xb9\xb0\xeb\x9c\x7a\x4a\x9e\x49\xf2\x62\xc8\x30\xd9\x5f\x10\xc9\x6b\x34\x45\xa9\x02\x37\x45\xa9\xc3\xe5\x69\x92\x64\x1a\x5e\x5a\xaa\x43\xb3\x05\x5d\x95\x0b\x52\x0a\xf0\x80\x9b\x03\x57\x11\x5e\x19\xea\x41\x0d\x60\xe5\x62\x8d\xe8\xd0\x1d\x0e\x37\x1d\xd2\x17\xc0\x43\x01\xbe\x3b\x4c\x22\x14\x51\xc7\x6d\x4a\x45\xa9\xd0\xed\x0f\x36\x9b\xd2\x50\xaa\x94\xf5\x03\xce\x52\xa1\x89\x3a\x4d\x30\xa9\x52\x67\x07\x72\x4d\xc9\x25\x35\xda\xca\xc1\x5c\xa1\xc8\x44\x97\xa6\x8d\x54\xe8\x92\x63\xa5\xa6\x94\x91\x2a\x51\xe9\x78\x29\xff\x6d\x24\x47\x92\x41\x2a\xe4\xf8\x11\x49\x53\x22\x48\x95\xa2\x7a\x54\x52\x28\x32\xd1\xa5\x29\x1e\x15\xba\xec\x90\x9f\x29\xbd\xa3\x4a\x56\x39\xec\xd7\x97\x98\x88\xd2\xc4\x8d\x0a\x51\x7a\x58\xcd\x94\xef\x44\xa5\x29\x1f\x5a\xeb\x0a\x8c\xcd\x24\xe9\x18\xb5\x66\x56\xdf\x00\x58\x9a\x8a\x51\x6f\xa4\x70\x04\x8b\xff\x36\x4a\x93\x24\x59\x54\xa5\x79\x4c\x1b\x83\xe9\x55\x20\x85\xd8\x52\x87\x17\x5e\x4a\xd5\xc8\x5a\xdb\x45\x4f\x74\x4d\xf7\x81\xeb\xa0\xae\xc7\x81\x3d\xe0\x65\x53\x94\x1d\x00\xcd\xa0\x01\x00\xd1\x45\x3d\x4f\x49\xe8\x01\x00\xb2\xaf\x10\x9e\x9a\x4c\x03\x00\x25\x2b\x8a\x1d\x20\xf5\x81\x00\x58\x67\xf7\x80\x1c\x24\x00\xb8\x60\xae\xe4\xf3\x7e\xaa\xa9\xea\x2a\x70\x0b\x23\x81\x6b\xd6\x85\x83\x53\xc3\x20\x9f\x56\x53\x8d\x02\x87\xed\x46\xb5\x92\xf2\x4e\x19\xd1\x1c\x9c\x0f\x46\x39\xf1\xa1\x3a\x10\xbb\xee\xa3\xa3\x48\x46\xad\x8e\xa0\x1e\x75\xf5\x4d\x81\xd5\x94\xbf\xe3\x9a\x6a\xaf\xc2\xb3\xd4\xd7\x44\x4b\x11\x7c\x5f\x09\x00\x37\x7c\x37\x89\x70\xf5\xb3\x3d\xb5\x0f\x84\xbd\x12\x7b\x62\xb0\xde\x70\xc2\x1f\x88\xc6\xd8\x5b\x4f\x8c\x74\x6c\x6d\xee\xc9\x90\x4f\x50\x13\x7b\x6a\x12\x81\x38\xad\xe2\x0c\x29\x82\x5b\x79\x1f\x21\x58\x4f\xbd\xa0\x44\x04\x8a\x33\x14\x56\xfb\xb4\xe5\x21\xae\xfc\x49\x8f\xbc\xc5\x11\xd3\x51\x8a\x54\x13\x17\xcf\x30\xa4\xd5\x7e\x11\x67\xe2\xd2\xd0\x57\x99\xa9\x43\x20\x34\x3a\x06\xa7\xf4\x32\xb8\x0c\x07\x00\x34\x61\x94\xf5\x14\xc9\x2f\x00\xc0\xad\x8a\x17\x19\x08\x97\x40\x80\x31\xca\x32\x05\x12\x17\xc9\xa0\x78\x9e\x74\xd3\xcd\xe8\x42\x0f\x68\x38\x84\x72\x18\x95\x00\x20\x60\x34\x9f\xb8\x49\xdc\x3a\x1f\x92\x58\x9d\x8f\x11\x5a\x07\x35\x5a\x6e\x75\x3e\x2c\xba\x3a\x1f\x96\x1e\x87\x19\x23\xc0\x0e\x76\x94\x0c\xeb\xfc\x6d\x62\xec\xfb\xe4\x5e\x92\x04\x44\xb9\x59\x6f\x99\x28\xf3\xc1\xc1\x97\x8f\x1a\x7f\xf9\xe4\x21\x98\x8f\x18\x85\xf9\x88\x81\x98\x4f\x18\x8b\xf9\xa4\xe1\x98\xbf\x71\x44\xe6\x77\x1f\x94\x96\x43\x6a\x89\x9b\x1d\x86\x44\x99\x1d\xc6\x88\xb2\x83\x1a\x2d\xca\xec\x30\x2c\xca\xec\x30\x2c\x4a\x0e\x33\x46\x94\x1d\xec\x28\x51\x66\x87\xb7\x89\xb2\xef\x93\x77\x14\xa5\x4f\xce\x01\x10\x59\xb6\xd9\x90\x2c\xdb\x6c\x8c\x2c\x3b\xa8\xd1\xb2\x6c\xb3\x61\x59\xb6\xd9\xb0\x2c\x39\xcc\x18\x59\x76\xb0\xa3\x64\xd9\x66\x6f\x93\x65\xdf\x27\x77\x93\xe5\x3c\xc1\x13\x92\x53\xa3\x74\x9d\x22\x35\x26\x71\x02\x79\x31\x54\x51\x7b\xbb\x47\xad\x48\x7b\x14\xee\x21\x0d\x51\xb1\xdf\xc2\xff\x14\xfd\x32\xa0\xb0\xa9\xfa\x75\x8e\xf2\x08\x87\xf3\xa8\x2e\x8b\x53\x9d\x7e\x87\xae\x85\x81\x76\x8e\x91\xc5\xd1\x3e\xcf\x86\xb6\x89\x43\x45\xab\xdd\xdb\xc6\x62\x56\x21\x50\x55\xab\x38\x5a\x09\xf9\xac\x37\xd3\x01\x49\x01\x50\x9e\x92\xdc\xd2\xc0\x8b\x22\xfa\x07\x8a\x1b\xe0\xc5\xf7\x34\x41\xc5\xf0\xb7\x49\xb6\x78\x0c\xad\x13\x77\x17\xef\xee\x3c\xbd\x49\x6e\xe0\x47\xaf\x4f\xfd\xda\xb8\xb0\x88\xbb\x0c\xe6\xdb\xd5\xc6\x5f\x2e\x3e\x02\xd5\xfc\xb5\xa9\xda\x6a\x3d\x0f\x56\x50\x95\x65\xf4\xba\x00\x6b\x6c\x40\x70\x3f\x7a\xf5\x41\x70\xfa\x41\x8d\x7c\x07\xc1\xb6\x06\xc8\x4f\x21\x19\x1c\x35\x4d\x85\x62\x8d\xc8\x5b\x9a\xba\x02\x42\x45\xdf\x98\xb1\xa9\xef\x7b\xc6\xdc\x0a\x7d\x47\x55\x8d\x0c\x0c\xf2\xd7\x56\x46\x75\x20\x89\x61\x1b\x09\x19\x62\xa8\x01\x46\x42\x2f\x55\x28\x5c\x88\xdb\xdd\xbd\xa8\xe2\x03\x5e\x30\x04\xf4\xb6\x28\x05\x05\x2d\x04\x91\xa8\xaf\x04\x3e\xf4\xe6\x76\x64\x4d\xed\xb4\x00\x5c\xe7\xca\x97\x33\x9a\x41\xe3\x22\x7f\x64\x23\x65\x02\x56\x30\x43\x83\x02\xa4\x63\x46\xa7\xe4\xa2\x65\x7b\x18\xc2\x2a\x81\xe8\x38\xe9\x47\x93\x0b\xf4\x4d\xd0\x82\x59\x05\xd0\xf1\xb2\xac\x20\x17\x30\x93\x88\x05\xb3\x94\x53\xc4\x46\x20\x24\x2b\x0b\x0a\xfe\x24\xad\x9b\x2a\x8d\xce\x0d\x1a\x24\x41\xeb\x8b\x14\x84\x1d\x16\xaa\x10\x85\xa3\x7d\x02\x62\x38\x79\x8a\x09\xa5\x24\x3d\x8a\x50\x16\x9f\x86\x0e\x99\xf9\x53\xc5\x26\x7e\x01\x33\xa0\xd4\x65\x26\x22\xec\x3e\x97\x29\x28\xf5\xcf\x65\x12\x52\xf3\xd7\x34\xde\x8f\x15\x6a\xe2\xa3\xde\x93\xa4\xd8\x80\x54\x7b\xcb\x71\x1a\x86\x18\x09\x1a\xc0\x71\x26\x55\xb3\xca\x08\x1c\x63\x3d\x62\x48\x52\xb6\x61\x26\x23\x55\xa5\xd5\xe3\x35\x48\xcc\x3c\xce\x64\xc4\xda\x28\xeb\x31\xeb\x43\x4d\x46\x6d\x1c\x68\x32\x05\x75\x98\xf5\x04\xc0\xb1\x06\xd1\x30\x8d\xb4\x5e\x9a\x8a\x8e\x88\xf2\x84\xf5\xa4\x23\x60\xd2\x94\x1a\x65\x7b\xb2\xff\xba\xc7\x4a\xd3\xdd\x13\xf5\xc3\x2f\x34\x9c\xb8\x8a\xf2\x46\xc2\xa6\x28\x9d\x80\x0e\xd6\x3a\x82\xcf\xa6\x72\x04\xab\xa4\x6f\x02\x4e\x48\xe1\x7a\x8c\xa0\xb6\x11\x7c\xaa\xaa\x09\x28\x0d\xba\x46\xb0\x9a\x14\x8d\xe0\xd4\x6d\x83\x80\xd5\x68\x20\x08\x5e\xb3\x7d\x60\x7d\xaa\x88\x5e\xea\x55\x58\xf6\x04\xaf\x2e\x78\xf3\xca\x23\x95\x41\x7e\xb7\x30\xaf\xce\xef\x1f\xe9\x51\xf6\xde\x35\xd8\xeb\xd8\xfe\x0d\xe2\xbd\x3a\x7f\x7b\xc8\x47\x96\x8b\xef\x12\xf5\x31\x6e\xde\x3d\xf0\xcb\xdf\x31\xf6\xab\xf3\x77\x09\xff\xb0\x52\xbc\x53\x04\x58\xe7\xef\x1f\x04\xd6\xf9\x7b\xc7\x81\x9a\x4c\xef\x11\x0a\xaa\xc2\x7c\x6b\x34\x08\x48\xf1\xcd\x01\x21\x16\xdf\x3b\xc5\x84\xf9\x7b\x85\x85\x9a\xb0\xee\x19\x19\xaa\x42\xbb\x57\x70\x08\x08\xef\x6e\xf1\x21\x34\x06\xef\x1e\x22\x02\x83\xf0\x3d\xa2\x44\x40\x6b\xee\x15\x28\xe2\x16\xdc\x37\x56\xd4\x34\xf1\x4e\xe1\xa2\xaa\x84\x77\x88\x18\x01\xfd\xbb\x47\xd0\x08\xda\x8f\xbb\xc5\x8d\x80\x32\xdc\x1e\x3a\x5a\x3e\x75\x12\xcc\x79\x72\xb7\xd8\x31\x4f\xee\x1f\x3b\x52\xf6\xde\x35\x76\xec\xd8\xfe\x0d\x62\xc7\x3c\x79\x7b\xec\x48\xbe\x4f\xdf\x25\x76\x64\xdc\xbc\x77\xec\x98\x27\xef\x18\x3b\xe6\xc9\xbb\xc4\x8e\x58\x29\xde\x29\x76\xcc\x93\xf7\x8f\x1d\xf3\xe4\x9d\x63\x47\x5d\xa6\xf7\x88\x1d\x55\x61\xbe\x35\x76\x04\xa4\xf8\xe6\xd8\x11\x8b\xef\x7d\x62\x47\xd2\xa7\xef\x11\x3b\xea\xc2\xba\x67\xec\xa8\x0a\xed\x5e\xb1\x23\x20\xbc\xbb\xc5\x8e\xd0\x18\xbc\x7b\xec\x08\x0c\xc2\x77\x88\x1d\x21\xad\xb9\x57\xec\x88\x5b\x70\xd7\xd8\x51\xd7\xc4\x3b\xc5\x8e\xaa\x12\xde\x21\x76\x04\xf4\xef\x1e\xb1\x23\x68\x3f\xee\x15\x3b\x42\xca\x70\xd7\xd8\x91\xef\xad\xa2\x6a\x76\xb8\x5b\xec\x98\x1d\xee\x1f\x3b\x52\xf6\xde\x35\x76\xec\xd8\xfe\x0d\x62\xc7\xec\xf0\xf6\xd8\x91\x6c\x88\xbb\x4b\xec\xc8\xb8\x79\xef\xd8\x31\x3b\xbc\x63\xec\x98\x1d\xde\x25\x76\xc4\x4a\xf1\x4e\xb1\x63\x76\x78\xff\xd8\x31\x3b\xbc\x73\xec\xa8\xcb\xf4\x1e\xb1\xa3\x2a\xcc\xb7\xc6\x8e\x80\x14\xdf\x1c\x3b\x62\xf1\xbd\x4f\xec\x48\xfa\xf4\x3d\x62\x47\x5d\x58\xf7\x8c\x1d\x55\xa1\xdd\x2b\x76\x04\x84\x77\xb7\xd8\x11\x1a\x83\x77\x8f\x1d\x81\x41\xf8\x0e\xb1\x23\xa4\x35\xf7\x8a\x1d\x71\x0b\xee\x1a\x3b\xea\x9a\x78\xa7\xd8\x51\x55\xc2\x3b\xc4\x8e\x80\xfe\xdd\x23\x76\x04\xed\xc7\xbd\x62\x47\x48\x19\xee\x1a\x3b\x76\x9b\xb9\x09\xea\x36\xbb\x5b\xf0\xd8\x66\xf7\x0f\x1e\x29\x7b\xef\x1a\x3c\x76\x6c\xff\x06\xc1\x63\x9b\xbd\x3d\x78\x24\x3b\xf0\xef\x12\x3c\x32\x6e\xde\x3b\x78\x6c\xb3\x77\x0c\x1e\xdb\xec\x5d\x82\x47\xac\x14\xef\x14\x3c\xb6\xd9\xfb\x07\x8f\x6d\xf6\xce\xc1\xa3\x2e\xd3\x7b\x04\x8f\xaa\x30\xdf\x1a\x3c\x02\x52\x7c\x73\xf0\x88\xc5\xf7\x3e\xc1\x23\xe9\xd3\xf7\x08\x1e\x75\x61\xdd\x33\x78\x54\x85\x76\xaf\xe0\x11\x10\xde\xdd\x82\x47\x68\x0c\xde\x3d\x78\x04\x06\xe1\x3b\x04\x8f\x90\xd6\xdc\x2b\x78\xc4\x2d\xb8\x6b\xf0\xa8\x6b\xe2\x9d\x82\x47\x55\x09\xef\x10\x3c\x02\xfa\x77\x8f\xe0\x11\xb4\x1f\xf7\x0a\x1e\x21\x65\x78\x43\xf0\x38\x27\x57\x19\xd3\x53\xfe\xf4\x56\x63\xfc\x28\xc7\x11\x18\x80\x66\x34\x10\xee\x3d\xd6\x41\xc8\x49\x2a\x0a\x01\x1f\xde\x02\x77\x55\xe2\x9a\x75\x3e\xcc\x40\x9d\x8f\xe1\x81\x9f\x0e\x07\xd9\xb0\x7e\xa1\xc7\xb5\xf3\x64\x98\x8f\x3c\x19\xc3\x07\x3f\xda\x3c\x96\x8f\x7e\xb5\x97\x48\xe3\x30\xcc\x47\x76\x18\xc3\x07\x3f\x97\x3b\x96\x0f\x61\xe6\x80\xab\xb7\xd9\x30\x23\x38\x7e\x1f\x66\x84\x1f\x2a\x85\x19\x99\xf3\x33\x65\xd8\x02\x34\x69\xdc\x9f\x31\xa3\xbf\x45\x7c\x1d\x28\x3f\x81\xa7\x9f\xc9\x03\xc1\xf9\x69\x35\xfd\xfc\x1a\x08\x4e\x6e\xe7\x55\x2e\xeb\x05\x01\xeb\x26\x8d\xbf\x09\xf7\xba\xf2\x9c\xa1\xb4\x5c\x18\x88\x42\x9b\xe4\x37\xd7\x39\xc1\x4e\xaf\x3a\xb4\xdd\x0e\xac\x5d\x96\xb5\xf0\x78\x5d\x7e\xd5\x9c\x5c\x7d\xf8\x5a\xe1\x85\x27\xa5\x59\x35\xb4\x82\xa6\x56\x55\x1a\xf0\xf8\x78\x99\xd3\x27\x99\x73\xb9\xaa\xda\x6c\xd6\xa4\x9e\x83\xc0\xbb\x5e\xe7\x75\xe5\x16\xa7\xec\x15\x38\x5b\xc8\xf4\xb2\x4f\xd8\xe7\x0b\xd7\x95\x69\x47\x2b\x9f\xc9\x8d\x52\x78\xaa\xc6\xd2\xaa\x7b\x8f\xca\x7d\x56\x78\x4a\xd3\x25\x8a\xc6\xd0\x6e\x19\x36\xc7\x5d\x7a\xaa\x51\xf3\x69\xe5\x7d\x7c\x7c\x06\x0b\xfb\x53\x8b\x8c\x55\x97\xe4\x63\x0a\xa3\x0c\xed\xd8\xbd\xf3\xc0\x1b\xf2\xa4\x2a\xb3\x78\x65\x36\x6b\x13\x79\xee\x9a\x42\x12\x5b\x67\x88\xb6\x85\xa6\x2d\xd4\xaf\xe4\xd2\x9b\x40\x72\x9b\xca\x3f\xaf\xf3\x17\x37\x58\x5d\x58\x46\xd1\x95\x94\x53\xe5\xc5\x5d\x79\x17\x7e\x61\xad\xf2\x66\xc3\xeb\x6c\xd4\x3a\xbe\xc7\x2b\xf9\x9e\x5c\xeb\x88\x29\xf1\x84\xa5\x2b\xe5\xd5\xca\xbb\x74\x57\xec\x2a\xaf\x36\x5d\xad\x8d\x5a\x0b\x13\x13\x8e\x8e\x8a\x2f\x73\xca\x4a\x7f\x39\x9c\x06\x70\xec\x00\x4c\x28\x5c\xef\xc2\xaf\xc3\x95\xca\x1b\xd7\x9b\xcd\xf3\xd7\xee\xb5\x9e\x83\x2a\xaf\x08\x48\xdb\x83\x00\xf9\xa7\xf2\x48\xc5\x03\xa5\x9e\xca\x33\x15\x95\x9e\x77\x2a\x77\x7d\xce\xa9\x9e\x47\x27\x6f\x5c\x9f\x90\xf1\xa5\xfb\x5e\x74\xb8\x8a\xc0\xb5\x3d\x9c\x78\x87\xb2\xc2\xb8\x82\x91\xdf\xf4\xa5\x83\x66\x2a\x52\xe1\x2e\x67\xb9\x09\x41\xd7\x04\xa0\x05\x01\xa1\x17\x48\x2d\x00\x1a\x10\x10\x5a\x81\xd2\x00\x80\x7f\x05\x1f\xe7\x1f\x60\x5f\x41\x49\xd9\xd7\xb9\x5f\x70\xee\x7d\x9d\xf9\x05\x21\xb6\x10\x99\xd7\xa0\x2a\x02\xd5\xf6\x50\x2c\x99\xa5\xce\xba\x82\x8d\xa7\x69\xd5\x39\x57\x10\xd2\x3c\x98\x1a\xe3\xcb\x8e\x71\xa8\xdf\x97\x84\xd8\x52\x62\x1d\xea\xf8\x25\xa1\xb5\x54\x98\x87\x7a\x5e\xc1\xc8\xd9\x87\xba\x5e\x41\x4a\x1b\x00\xf4\xfd\x8a\x37\x61\xa1\x37\x60\x45\xc8\xad\xc4\x06\x68\x50\x15\x81\x6a\x7b\x28\x96\xe8\x55\x67\x5e\xc1\xc6\x98\xd7\x00\x33\x15\x21\x4d\x14\xab\x80\x95\xae\xd7\xdf\x4b\x2a\xbd\x20\x06\xa6\x7c\xed\xdf\xeb\x16\xa6\x24\x16\xa6\x6c\x05\x18\xc0\xc4\x94\x91\x86\x09\xb2\x31\x65\xa6\x21\xd3\x8d\x4c\xe9\xfa\xfd\xcd\x16\xda\xf8\x2d\x89\x95\x29\x5f\x7b\x20\x83\x99\x29\x89\x99\x29\x5b\x01\xd0\x64\x67\xca\x48\xc3\x69\x34\x34\x65\xa6\xa1\x35\x58\x9a\xd2\x0d\xe4\x1b\x3a\x94\x66\x04\x84\x64\x20\x37\x03\x68\x45\x40\xc8\x05\x6a\x2b\x80\x46\xa8\x18\x4d\xd6\xa6\xcc\x34\xa4\xb0\xb9\x29\xdd\x45\xd7\x04\x75\x44\x97\xc4\xde\x94\xaf\x3d\x08\x68\x70\x4a\x62\x70\xca\x56\x00\x83\x2d\x4e\x19\x69\xf8\x0c\x26\xa7\xcc\x34\x94\xa0\xcd\x29\xdd\x65\xcf\x3d\x24\x81\x25\xa1\xb7\x94\xf9\x87\x44\xb0\x24\xe4\x96\x6a\x0b\x20\x19\xa8\x38\x8d\x76\xa7\xcc\x34\xb4\x06\xc3\x53\xba\xab\xae\x1d\xda\xd8\x26\x96\xa7\x7c\xed\x41\x40\xd3\x53\x12\xd3\x53\xb6\x02\x18\x6c\x7b\xca\x48\xc3\x67\x30\x3e\x65\xa6\xa1\x04\xad\x0f\x3b\x8c\xc0\x2c\xa7\xba\x60\x93\x37\xe4\x35\x31\x77\x02\x1c\x69\x84\x06\x5b\x71\xd8\x56\x82\xad\xba\xd0\x55\xb1\xa2\x20\x66\xd6\x1c\x0d\x3c\x83\x91\x93\x36\x29\xc0\xe6\x65\x84\x1c\x4f\xfc\x8d\xd1\x1c\x7e\x47\xf8\x11\x80\xc0\x98\x8e\x01\xb6\x12\x20\x1c\xd9\x81\x38\x0d\xf1\x1d\x88\x16\x8a\xf2\xea\xa1\x40\x0f\x03\x70\xaa\xc3\xe1\x1e\x83\x6e\x25\x68\x4b\xd0\x07\x62\xb7\x85\x7e\x20\x01\x63\x00\x58\x0f\xc4\x80\xf8\x3d\x27\x3f\x18\x09\x32\xe0\x56\x02\x36\xc7\x83\x20\x6e\x4b\x54\x08\xa2\x37\xc5\x86\xb5\x3d\x3c\xc4\xaf\x39\xed\xa1\x20\x91\xc1\xb6\x12\xac\x31\x54\x04\x31\x9b\x03\x46\x10\xb9\x21\x6c\xac\x87\x22\x47\x0c\xc0\x69\x0f\xc7\x8f\x0c\xba\x95\xa0\x2d\x51\x24\x88\xdd\x16\x4b\x82\x04\x8c\x11\x65\x6d\x0f\x2a\xf1\x6b\x4e\x7d\x28\xb4\x64\xb0\xad\x04\x6b\x0c\x30\x41\xcc\xe6\x30\x13\x44\x6e\x08\x36\x89\x71\x31\xc5\x9b\xd4\x04\x95\xaf\x12\x14\x18\x75\x32\xc8\x56\x86\x84\x63\x4f\x18\xab\x21\x02\x85\x11\x43\x71\x28\xb1\x26\xd6\x50\x94\x1a\x9e\xf2\x55\x02\x35\x07\xa4\x0c\xbc\x95\xc1\x2d\x61\x29\x8c\xdf\x16\x9c\xc2\x24\x8c\x21\x2a\x31\x2b\xb6\x28\x95\x1a\xa0\xf2\x55\x82\x34\xc6\xaa\x0c\xba\x95\xa1\xcd\x11\x2b\x8c\xdd\x12\xb7\xc2\x04\x4c\xd1\x2b\xb1\x2f\x96\x00\x96\x1a\xa2\xf2\x55\x02\x34\x85\xb1\x0c\xb8\x95\x81\x8d\xc1\x2c\x8c\xdb\x1c\xd2\xc2\xe8\x0d\x81\x2d\x31\x2e\xd6\xd8\x96\xda\xa1\xf2\x55\x02\x35\x47\xb8\x0c\xbc\x95\xc1\x2d\x71\x2e\x8c\xdf\x16\xed\xc2\x24\x8c\x31\x2f\xb1\x34\x96\xb0\x97\x9a\xa4\xf2\x55\x02\x34\x05\xbf\x0c\xb8\x95\x81\x8d\x21\x30\x8c\xdb\x1c\x08\xc3\xe8\x0d\xe1\x70\x3d\x18\x11\x33\x08\x6e\x9f\x47\xc4\xc5\x7d\x8d\x56\xad\x61\x8c\x8e\x2d\x54\xcc\x31\xb2\x85\x10\x14\x29\x5b\xbe\x74\xe5\x6e\x9e\x98\x43\x65\xfc\x8e\x70\x26\x00\x81\xa1\x32\x03\x6c\x25\x40\x38\x54\x06\x71\x1a\x42\x65\x10\x2d\x14\x2a\xe7\xc9\x40\xa8\x8c\x01\x38\xd5\xe1\x50\x99\x41\xb7\x12\xb4\x25\x54\x06\xb1\xdb\x42\x65\x90\x80\x31\x54\xce\x13\x7b\xa8\x8c\xdf\x73\xf2\x83\xa1\x32\x03\x6e\x25\x60\x73\xa8\x0c\xe2\xb6\x84\xca\x20\x7a\x53\xa8\x9c\x27\xd6\x50\x19\xbf\xe6\xb4\x87\x42\x65\x06\xdb\x4a\xb0\xc6\x50\x19\xc4\x6c\x0e\x95\x41\xe4\x86\x50\x39\x4f\x06\x42\x65\x0c\xc0\x69\x0f\x87\xca\x0c\xba\x95\xa0\x2d\xa1\x32\x88\xdd\x16\x2a\x83\x04\x8c\xa1\x72\x9e\x58\x43\x65\xfc\x9a\x53\x1f\x0a\x95\x19\x6c\x2b\xc1\x1a\x43\x65\x10\xb3\x39\x54\x06\x91\x1b\x42\x65\x62\x5c\x4c\xa1\x32\x35\x41\xe5\xab\x04\x05\x86\xca\x0c\xb2\x95\x21\xe1\x50\x19\xc6\x6a\x08\x95\x61\xc4\x50\xa8\x4c\xac\x89\x35\x54\xa6\x86\xa7\x7c\x95\x40\xcd\xa1\x32\x03\x6f\x65\x70\x4b\xa8\x0c\xe3\xb7\x85\xca\x30\x09\x63\xa8\x4c\xcc\x8a\x2d\x54\xa6\x06\xa8\x7c\x95\x20\x8d\xa1\x32\x83\x6e\x65\x68\x73\xa8\x0c\x63\xb7\x84\xca\x30\x01\x53\xa8\x4c\xec\x8b\x25\x54\xa6\x86\xa8\x7c\x95\x00\x4d\xa1\x32\x03\x6e\x65\x60\x63\xa8\x0c\xe3\x36\x87\xca\x30\x7a\x43\xa8\x4c\x8c\x8b\x35\x54\xa6\x76\xa8\x7c\x95\x40\xcd\xa1\x32\x03\x6f\x65\x70\x4b\xa8\x0c\xe3\xb7\x85\xca\x30\x09\x63\xa8\x4c\x2c\x8d\x25\x54\xa6\x26\xa9\x7c\x95\x00\x4d\xa1\x32\x03\x6e\x65\x60\x63\xa8\x0c\xe3\x36\x87\xca\x30\x7a\x43\xa8\xcc\x4f\x23\x9b\x43\x65\x06\xc1\xed\xf3\x88\x50\xb9\xaf\xd1\xaa\x35\x8c\xa1\xb2\x85\x8a\x39\x54\xb6\x10\x1a\x19\x2a\xf3\xcd\x58\xb9\x9b\x1d\xcc\xa1\x32\x7e\x47\x38\x13\x80\xc0\x50\x99\x01\xb6\x12\x20\x1c\x2a\x83\x38\x0d\xa1\x32\x88\x16\x0a\x95\xb3\xc3\x40\xa8\x8c\x01\x38\xd5\xe1\x50\x99\x41\xb7\x12\xb4\x25\x54\x06\xb1\xdb\x42\x65\x90\x80\x31\x54\xce\x0e\xf6\x50\x19\xbf\xe7\xe4\x07\x43\x65\x06\xdc\x4a\xc0\xe6\x50\x19\xc4\x6d\x09\x95\x41\xf4\xa6\x50\x39\x3b\x58\x43\x65\xfc\x9a\xd3\x1e\x0a\x95\x19\x6c\x2b\xc1\x1a\x43\x65\x10\xb3\x39\x54\x06\x91\x1b\x42\xe5\xec\x30\x10\x2a\x63\x00\x4e\x7b\x38\x54\x66\xd0\xad\x04\x6d\x09\x95\x41\xec\xb6\x50\x19\x24\x60\x0c\x95\xb3\x83\x35\x54\xc6\xaf\x39\xf5\xa1\x50\x99\xc1\xb6\x12\xac\x31\x54\x06\x31\x9b\x43\x65\x10\xb9\x21\x54\x26\xc6\xc5\x14\x2a\x53\x13\x54\xbe\x4a\x50\x60\xa8\xcc\x20\x5b\x19\x12\x0e\x95\x61\xac\x86\x50\x19\x46\x0c\x85\xca\xc4\x9a\x58\x43\x65\x6a\x78\xca\x57\x09\xd4\x1c\x2a\x33\xf0\x56\x06\xb7\x84\xca\x30\x7e\x5b\xa8\x0c\x93\x30\x86\xca\xc4\xac\xd8\x42\x65\x6a\x80\xca\x57\x09\xd2\x18\x2a\x33\xe8\x56\x86\x36\x87\xca\x30\x76\x4b\xa8\x0c\x13\x30\x85\xca\xc4\xbe\x58\x42\x65\x6a\x88\xca\x57\x09\xd0\x14\x2a\x33\xe0\x56\x06\x36\x86\xca\x30\x6e\x73\xa8\x0c\xa3\x37\x84\xca\xc4\xb8\x58\x43\x65\x6a\x87\xca\x57\x09\xd4\x1c\x2a\x33\xf0\x56\x06\xb7\x84\xca\x30\x7e\x5b\xa8\x0c\x93\x30\x86\xca\xc4\xd2\x58\x42\x65\x6a\x92\xca\x57\x09\xd0\x14\x2a\x33\xe0\x56\x06\x36\x86\xca\x30\x6e\x73\xa8\x0c\xa3\x37\x84\xca\xfc\xf0\xb5\x39\x54\x66\x10\xdc\x3e\x8f\x08\x95\xfb\x1a\xad\x5a\xc3\x18\x2a\x5b\xa8\x98\x43\x65\x0b\xa1\x91\xa1\x72\x77\x5e\x20\x77\xdb\xcc\x1c\x2b\xb7\x19\x8b\x6b\x05\x20\x30\x56\x6e\xf9\x6e\x58\x11\x10\x8e\x95\x41\x9c\x86\x58\x19\x44\x0b\xc5\xca\x6d\x36\x10\x2b\xb7\x19\x8b\x66\x05\x48\x73\xac\xdc\xf2\xed\xb1\x22\xb4\x25\x56\x06\xb1\xdb\x62\x65\x90\x80\x31\x56\x6e\x33\x7b\xac\xdc\x66\x2c\x9e\x15\x00\x8d\xb1\x72\xcb\xf7\xce\x8a\xc0\xe6\x58\x19\xc4\x6d\x89\x95\x41\xf4\xa6\x58\xb9\xcd\xac\xb1\x72\x9b\xb1\x88\x56\x80\x33\xc5\xca\x2d\xdf\x58\x2b\xc2\x1a\x63\x65\x10\xb3\x39\x56\x06\x91\x1b\x62\xe5\x36\x1b\x88\x95\xdb\x8c\x45\xb3\x02\xa4\x39\x56\x6e\xf9\x7e\x5b\x11\xda\x12\x2b\x83\xd8\x6d\xb1\x32\x48\xc0\x18\x2b\xb7\x99\x35\x56\x6e\x33\x16\xd1\x0a\x70\xa6\x58\xb9\xe5\xdb\x71\x45\x58\x63\xac\x0c\x62\x36\xc7\xca\x20\x72\x43\xac\x4c\x8c\x8b\x29\x56\xa6\x26\xa8\x7c\x95\xa0\xc0\x58\xb9\xe5\xbb\x75\x25\x48\x38\x56\x86\xb1\x1a\x62\x65\x18\x31\x14\x2b\x13\x6b\x62\x8d\x95\xa9\xe1\x29\x5f\x25\x50\x73\xac\xdc\xf2\xed\xbb\x12\xb8\x25\x56\x86\xf1\xdb\x62\x65\x98\x84\x31\x56\x26\x66\xc5\x16\x2b\x53\x03\x54\xbe\x4a\x90\xc6\x58\xb9\xe5\x7b\x7b\x25\x68\x73\xac\x0c\x63\xb7\xc4\xca\x30\x01\x53\xac\x4c\xec\x8b\x25\x56\xa6\x86\xa8\x7c\x95\x00\x4d\xb1\x72\xcb\x37\xfe\x4a\xc0\xc6\x58\x19\xc6\x6d\x8e\x95\x61\xf4\x86\x58\x99\x18\x17\x6b\xac\x4c\xed\x50\xf9\x2a\x81\x9a\x63\xe5\x96\xef\x07\x96\xc0\x2d\xb1\x32\x8c\xdf\x16\x2b\xc3\x24\x8c\xb1\x32\xb1\x34\x96\x58\x99\x9a\xa4\xf2\x55\x02\x34\xc5\xca\x2d\xdf\x2e\x2c\x01\x1b\x63\x65\x18\xb7\x39\x56\x86\xd1\x1b\x62\x65\x7e\xd6\xdc\x1c\x2b\xb7\x59\x1f\xc5\xca\xd0\xa6\x58\xb9\x15\xf6\x0f\x2b\x35\x8c\xb1\xb2\x85\x8a\x39\x56\xb6\x10\x02\x63\xe5\x79\x83\xda\xc6\x65\x79\x06\x2e\xe4\x07\x3d\xa1\xad\xa5\x1e\x60\xa0\x2c\xe3\x8b\x7e\x5a\x51\x83\x6c\xaa\xf3\x29\x0e\x1b\x74\x51\x0f\x3f\x92\xb7\x5d\x21\xca\xb2\xb4\xac\xd3\x1a\x38\x00\xc9\x10\x91\xb3\xbd\x02\x6b\xea\x01\x5f\xf2\x8a\x1e\xee\x15\xa0\xb4\x13\xbe\xe4\x1d\x3b\x48\x2f\xc0\x69\x67\xe4\xcd\xfb\xb7\x49\x2d\x7e\x0a\x7c\x88\xa1\xee\x24\xf8\x20\x4f\x7d\x52\x7a\x1b\x5b\x96\xcd\x32\xa4\x1a\x3f\x15\x3e\xc4\x57\x77\x32\x7c\x90\xaf\x3e\xe1\xe9\x44\xbe\xf8\x97\x09\x2a\xbd\xc3\x38\xbe\xba\x93\xe2\x83\x7c\xf5\xc9\xb4\x26\xf2\xd5\x4d\x03\x49\x3d\x7e\x6a\x7c\x88\xb1\xee\xe4\xf8\x20\x63\x7d\xa2\x06\x2b\x63\xac\x15\xc5\x0b\xaa\xe2\xb0\x46\x17\x36\x5a\xc2\x53\xbd\x2f\xaa\x7c\xd7\xbd\xd0\xf0\x9f\xcb\x12\xae\xd2\xbd\xd0\xf5\x3d\x2c\xd3\x26\xcc\xd2\x7f\x6a\x75\xfa\x37\x62\xa5\x7d\x71\x6a\xdc\x17\x72\x12\xd5\xcd\xe8\x79\xf9\xbe\x64\xb7\xf0\x3c\x13\x30\x3d\xef\x2b\x41\x2f\xcd\xd0\x51\x91\x25\x12\xec\x06\x80\x25\xec\xc5\x14\xac\x6e\x5e\x33\xb4\xa3\x25\x5a\x23\x89\xe5\xb8\xc4\x45\x56\x54\xbb\x0f\xfb\xfd\x5e\x03\x28\xab\x34\x0f\xab\x57\x0e\xe2\x79\x9b\x48\x82\x0a\x25\x30\x7a\x1e\x7a\xa6\x14\x1e\xb1\xc5\xea\x31\xac\x83\x58\x67\xa4\x46\x71\x71\x4a\x04\x4a\xdb\xf5\x16\x3d\xad\x75\x4a\x1d\xa0\x4c\xab\x2f\x96\xa8\xad\xe3\xcd\x6a\x93\xe8\xd4\xce\x71\x8c\xea\x9a\x43\x05\xdb\x70\xb3\x5c\x01\xb4\x28\x98\x42\x89\x15\x4a\x74\x7c\xb4\x41\x8b\xa5\x46\x27\x3d\xed\x8b\x0e\x64\x13\x06\xd1\x56\x27\x82\x61\x64\x0a\xa4\x44\x46\xef\x6f\xc2\x6d\xa4\x4b\x2f\xac\x4e\xe9\xe9\xd0\xcb\x2f\xf6\xbd\x8d\x4e\x81\x81\xc9\x44\x78\xa1\x44\x27\x59\x3c\x21\x59\x9d\x08\x6c\x12\x9e\x0e\x02\x50\xbc\x58\x41\xbd\x45\xa1\x64\x2a\xac\x4c\x22\x12\x25\x81\xbf\xd0\x89\xd0\x31\xc3\x9b\xb2\xdd\x3f\xed\x43\x9d\x06\x01\x92\x49\xd0\x22\xb9\x19\x21\xf2\xd0\x0a\x68\x46\xf5\x8d\x83\x2c\x96\x8b\x70\xe9\x41\x8d\xa8\xbe\xa9\x4d\xa8\xbe\x29\xd2\x48\x02\x3f\xd0\x85\x9d\x9f\x1b\x94\x18\xd5\x97\xc2\x1c\xd3\x04\x91\x61\xb9\xf3\x3e\x7b\x4e\xf8\x4c\xa1\x89\x69\x29\xc3\x0a\x9d\x1a\xea\xe2\xeb\x63\x98\x14\x2f\xf4\xc0\x7f\x14\xc6\xdf\x0e\x24\x81\x90\xab\x43\xf7\x59\x0b\x58\x4e\x81\x0b\xf9\x9b\x66\x69\xf3\xca\xd3\x0c\x88\x4c\xa4\x27\x00\x8e\x06\x17\x02\xd8\xff\xf8\xfc\x87\x0f\x4e\x5d\x9c\xab\x18\xfd\x12\x96\x65\x7a\x3a\xfc\xd7\x7f\xfe\xed\x4b\x54\x14\x4d\xdd\x54\x61\x39\xcf\xd3\xd3\x3c\xae\xeb\x79\x1e\x96\xce\x1f\x3e\xff\xff\x01\x00\x00\xff\xff\xc4\xaa\x95\x3d\x6f\xf1\x01\x00") - -func pagesAssetsStylesBootstrap400Beta2MinCssBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsStylesBootstrap400Beta2MinCss, - "pages/assets/styles/bootstrap-4.0.0-beta.2.min.css", - ) -} - -func pagesAssetsStylesBootstrap400Beta2MinCss() (*asset, error) { - bytes, err := pagesAssetsStylesBootstrap400Beta2MinCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/styles/bootstrap-4.0.0-beta.2.min.css", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsStylesBootstrapTheme311MinCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x5a\x4d\x6f\xdb\x38\x13\xbe\xe7\x57\xe8\x45\xf1\xa2\x4d\x61\xc9\xfa\xb0\x63\xcb\x41\x73\xd8\x6e\xb1\x08\xd0\xee\x65\x73\xd8\x2b\xbf\xe4\x08\xb5\x25\x81\xa2\x13\x17\x81\xff\xfb\x82\xa4\x64\x4b\x36\x69\xda\x94\xe5\x1c\x1a\x21\x68\x45\x51\xcf\x8c\x1e\x3e\x24\x67\x86\x19\x7e\xfe\xdf\x8d\xf3\xd9\xf9\x23\xcf\x59\xc9\x28\x28\x9c\x97\xc8\x0b\xbc\xc0\xf9\xf4\xcc\x58\x31\x1b\x0e\xe7\x84\xc1\xfa\x99\x87\xf2\xe5\x2d\xef\xfd\x35\x2f\x7e\xd1\x74\xfe\xcc\x9c\xd0\x0f\x02\x37\xf4\x83\x91\xf3\xf4\x9a\x32\x46\xe8\xc0\x79\xcc\x90\xc7\x3b\x7d\x4f\x11\xc9\x4a\x82\x9d\x55\x86\x09\x75\x7e\x3c\x3e\x49\xd0\x92\xa3\xa6\xec\x79\x05\x39\xde\x90\xbd\xc2\x72\xb8\x35\x31\x84\x8b\x1c\x0e\x97\xa0\x64\x84\x0e\xbf\x3f\x7e\xfd\xf6\xf7\x3f\xdf\xb8\xc9\xe1\xcd\x8d\x07\x59\xe6\x62\x92\x80\xd5\x82\x0d\xc4\x4d\x41\xd3\x25\xa0\xbf\xe4\x4d\xb9\x42\x88\x94\xa5\xbc\x49\xb3\x24\x97\xff\x7b\x05\x34\x4b\xb3\xb9\xbc\xc1\x20\x9b\x13\xfa\xc6\xc8\x9a\xb9\xe5\x33\xc0\xf9\xeb\xcc\x77\xdc\xa0\x58\x3b\xbe\x43\xe7\x10\x7c\xf2\x07\xfc\xf2\xc2\xdb\x7b\xf7\x95\xc0\x9f\x29\x73\x61\xbe\xae\xbb\xa6\x59\x49\x98\xe3\x3b\x8d\xfe\xe1\x78\x3c\xa8\x7f\xbd\x60\x7c\x3b\x90\x4f\xf9\x6f\x13\xcf\x9f\x8c\x6f\xef\x2f\x86\xb4\x69\x32\x31\x03\x88\xa5\x2f\xa4\x45\x48\xab\xad\xe2\xa5\xd5\xc6\xe9\x69\x35\x54\x2c\xb5\xda\x24\x59\xed\x26\x69\xd3\x53\xd8\xf4\x14\x36\xbd\x7d\x9b\x9e\xc2\xa6\x77\x68\xb3\x6a\x7a\x3b\x32\x06\x51\xb1\x76\xc6\x7b\xdc\x04\xa1\x9a\x65\x5d\x5f\xc1\x63\xf3\xfb\x6a\xbb\x10\xa0\x9f\x73\x9a\xaf\x32\xec\xa6\x4b\x30\x27\xb3\x2c\xcf\x48\x8b\xf5\xc3\x2e\xb5\xaf\x8b\x34\x23\x80\xba\x73\x0a\x70\x4a\x32\xf6\x89\xe5\xc5\xe0\x43\x92\x24\x8e\x3f\xf8\x40\x7c\x7e\x39\x81\xef\xff\xff\xf6\xfe\x00\xe1\xf0\x4d\x07\xe6\x8c\xe5\x4b\xf5\xfb\x49\xba\x60\x84\xce\x0a\x9a\xcf\x53\x3c\xfb\xf3\xdf\x47\x0e\xf2\x44\x41\x56\x26\x39\x5d\x7a\x3f\x52\x44\xf3\x32\x4f\x98\xb7\x05\x2c\x19\xa0\xec\x6b\xbe\xc8\x69\xc9\xe8\x97\x8f\x1c\x55\xfc\x7c\x1c\x38\x24\xc3\xad\x07\xd2\xd2\xc7\x81\xf3\x57\xf5\xf2\xd3\xaf\x82\x7c\xf1\x6d\xac\x92\x0c\xc0\x05\xc1\x5f\x12\xb0\x28\x49\xeb\xb3\x29\x29\x08\x60\x33\xf9\x8f\xbb\xbe\x87\x39\xc5\x84\xba\x88\x3b\x32\xfb\x80\x21\xbf\xee\xdb\x73\x55\x4e\x18\xee\xf9\x5e\x6f\x84\x50\x7b\x5a\x3c\xe7\x2f\x84\xb6\x54\x3b\x4b\x72\xb4\x2a\x9b\x23\x57\xbd\x2b\x3f\xb6\xe9\x59\x91\x97\x29\x4b\xf3\x4c\xac\x0e\xe3\x62\xad\x9f\x71\xed\x19\x71\x04\x5c\xf1\x6d\x9b\xe6\xfc\x39\x53\x51\xa3\x70\x0a\x11\xe0\xa2\x08\xf1\x1d\x02\xa1\x85\xa8\x34\x10\x97\xd0\x95\x84\x56\xe8\x4a\x5a\x7a\x57\x5d\x85\xf0\xee\x2e\x06\x2d\xee\x9b\x62\xa9\x9b\x74\x62\x91\x5f\x60\x16\x8b\x6a\x29\x6e\x2f\x95\x47\xc0\xb5\x0e\x57\x0b\xeb\x99\x62\x19\x23\x38\x1d\x23\x3e\xd2\xa3\x20\xbe\x1b\x05\x16\x62\xd1\x40\x5c\x42\x2c\x12\x5a\x21\x16\x69\xe9\x5d\xc5\x12\x91\x69\x12\x91\x16\xf7\x4d\xb1\xd4\x4d\x3a\xb1\xc8\x2f\x30\x8b\x45\xb5\x47\xb7\xf7\xd0\x23\xe0\x5a\x87\xf9\x8e\x7b\xae\x52\x20\xf2\x31\x11\x6b\x02\x00\x10\xdb\x2c\x2b\x1a\x88\x8b\x28\x45\x40\xab\x96\x15\x61\xe9\x7d\x97\x95\x29\x18\xa1\x78\x47\x7c\x53\x26\xe2\x5e\xbb\xa0\x08\xdf\xcd\x1a\x39\x88\xd9\x1a\x01\xd5\x11\x58\xad\x93\x55\xf8\x75\x6e\x24\xe3\x03\x3c\x12\xa3\x4b\x60\x1c\x05\x77\x36\xc1\x8c\x1a\xe2\x22\xf1\x8c\x80\x56\xc5\x33\xc2\xd2\xbb\x0a\x84\x44\x53\x1c\x44\x2d\xee\x9b\x1a\xa9\x9b\xb4\x41\x8a\xf8\x02\xb3\x4c\x54\x91\x7c\x3b\xd2\x3e\x02\xae\x75\xb8\x4a\x9c\xce\xd3\x0a\x8e\xc7\xd1\x48\x04\xae\x28\x08\x49\x08\x2c\xb4\xa2\x81\xb8\x84\x56\x24\xb4\x42\x2b\xd2\xd2\xbb\x6a\x05\xc6\x21\x0a\xa7\x4d\xea\x5b\xf1\xac\x6c\xd1\x29\x45\xfa\x7f\x42\x38\xab\xc8\xef\x5a\xe9\x97\x1e\x5a\xe9\x2c\x7b\x5e\x2d\x61\x06\xd2\xc5\xc0\x4b\x97\x73\x77\x7b\xab\x4a\xe3\x64\x24\x1f\x1a\xd2\x64\x7d\xaf\x8d\x87\x69\x5e\xe0\xfc\x35\x73\x97\x24\x5b\x3d\x2c\xd2\x07\x50\x53\xa4\x78\x72\x40\xd5\x29\x2b\xdd\x98\x5f\x62\x99\x9a\xf2\xcb\x66\xa5\x33\x42\xec\xcb\xe0\x22\x8b\xa0\xb0\xaa\x5a\x04\x85\x13\x0a\x61\x2b\x16\x04\xd1\x75\x9f\xe5\x4a\x18\x0f\x60\x9f\xe4\xed\x03\xf5\x18\xec\x1e\xdb\x0c\xc4\x2e\x4f\x89\xc6\x13\x02\x71\xa7\x54\x47\x07\xd1\xc7\x40\x68\xb3\x20\xe9\xc4\x49\x03\x21\xbb\x6e\xbc\x0c\xbc\x40\x40\xbb\x95\x1f\x92\x29\xbf\xec\xcb\x0f\xba\xf7\x7b\x11\xb1\xae\x32\x21\x9d\xe8\x65\x75\x96\xab\x1a\x7f\xba\x2a\x67\xa3\x62\xdd\xad\x06\xb8\x5f\x71\xb2\xaf\x01\xaa\x90\xf6\x15\xe1\xd4\xf7\x19\x78\xd9\xcd\xb7\x33\x75\x42\x20\xbf\xc4\x50\x47\xfc\xb2\x90\x8a\x19\xa2\x0f\xb5\x48\xab\x2a\xb5\x08\x27\x14\x6a\x31\x94\x16\xe3\x13\x07\x4f\xd7\x77\x3b\x3c\x90\x82\x0c\x0f\x9a\x83\xc3\x37\xa4\x37\x55\x55\xeb\x50\x02\x61\x03\x28\xcd\x5e\x08\x2d\x15\xb5\xc9\xa3\x23\x1a\x21\x7e\x89\x64\x2c\xb4\x49\xe6\x0c\xef\xf7\x31\x96\xd2\xa4\x2a\xc9\x13\x3f\x3d\xcc\xfc\x7d\x8e\x2f\x32\x97\x38\x5f\x9c\xb6\x29\xbf\x2c\x98\x37\xbc\xdf\x07\xf3\x5b\x82\x0f\x98\x17\x4e\x74\x9f\x45\x47\xea\xf3\x8a\xae\xda\x61\x69\xcf\x29\xd5\xa0\x29\xe6\x98\xea\x94\xa7\x61\xa3\x64\x80\xa5\xc8\xe5\x43\x57\x37\x25\xe9\x9a\x60\x45\x8b\x1c\xa1\xb7\xf6\x76\xe1\x6f\x3c\xb0\x20\x94\x9d\x3a\xb3\xad\x0e\x98\xc2\xed\x96\x70\x10\x13\x9f\xb7\xb7\x1c\x05\xaa\xbe\xc4\xb2\xd6\x88\x93\xc4\xc7\x53\x91\xb1\x4d\xc9\x18\x22\x9b\xa4\xcf\x08\xd1\x87\xfa\xa5\x55\x55\x3e\x28\x9c\x50\x45\x6b\xed\x34\x28\xc4\x10\x04\x35\x79\x16\xb5\x37\x1c\x13\x9c\x4c\xf8\x67\xc3\x18\x93\xc4\xe6\x9c\xc8\x0c\xd1\x0b\x73\xc2\xaa\x82\x39\xe9\x84\x91\xb9\x18\xa0\x84\x80\x9a\x39\xcb\xba\x14\x4a\xa6\x24\x92\x51\x2a\x49\x90\xd5\x21\x9b\x11\xa2\x97\x40\x57\x58\x55\x06\xba\xdc\x09\x23\x79\xc9\x98\x4c\x62\x52\x93\x67\x55\xa7\x49\x42\x4c\x64\xc5\x96\x4c\xf8\xe6\x6b\xc3\x9d\x11\xa2\x17\xee\x84\x55\x55\xa6\x2b\x9c\x30\x72\x87\x11\x98\x80\xc9\xc6\xe3\x4e\xd0\xf3\x97\xba\x46\xac\x2b\x13\xfd\x4e\xe1\xb2\x06\xe2\xba\xe1\x72\x5d\x3a\xd8\xe3\x6d\x47\x91\x0b\xc1\xb9\xf2\x6a\x24\xdf\xfe\x24\x00\x71\xb7\xfc\x5d\x03\x71\xdd\xfc\x5d\x38\x61\xa2\xa9\xfb\x61\xdd\x28\xc6\xa3\x51\xb7\xc3\x3a\x0d\x44\x1f\x74\xe9\xcf\xf1\x84\x13\x46\xba\x3a\x1d\x57\x45\x01\xf4\xb1\xcd\x0c\x34\x43\xf4\xc2\x95\xee\x24\x4b\x3a\x61\xe4\xaa\xf3\xe1\x0d\x8a\x27\x41\xd2\xed\xf0\x46\x03\xd1\xcb\x42\xaf\x3d\xd7\x11\x4e\x18\xe9\xea\x7a\x7c\x11\x47\x7e\x68\x15\xc9\x1a\x21\xfa\x89\xc7\x74\x27\x1b\xc2\x09\x15\x5b\x8b\xb4\x64\x2e\x77\xa9\x78\x3b\xa9\x0c\xd6\xbd\x7e\xbf\xb3\xe8\xa6\x8c\x2c\xb7\x7f\x05\xa6\x6e\xaf\xeb\xca\x9a\xa7\xb2\xac\xac\x4c\xf8\xaa\x1d\xe3\x70\xd8\x4e\xdd\xb3\xc2\xc9\x14\xda\x84\x44\x66\x88\xeb\xee\x59\xc2\x09\x63\x48\x24\xbb\x6d\xbc\x02\x64\xe4\x9c\x93\x9b\x93\x06\x9e\x8f\xbb\x00\xae\xab\x96\x0f\xd5\xed\x33\x01\xd8\x62\x39\xfb\x6d\x4e\x68\x6a\xda\xaa\x3f\x20\xea\x46\xdb\xef\x73\x9e\x52\xd3\x56\x05\x62\xdd\x68\xdb\x55\x25\xb0\x4f\x62\x64\xf3\x97\x0f\x66\x88\xab\x16\x36\xa4\x13\x7a\xda\x78\x40\xd6\x91\xb3\x6d\x3d\x02\x8d\x88\xdd\x81\x82\x19\xe2\xaa\x25\x0d\xe9\x84\x9e\xb3\x2a\x30\xeb\xb8\xb0\xed\x2a\x11\x20\x09\x91\x4d\xe4\x61\x86\xb8\x6e\x31\x43\x38\xa1\xa7\x4d\x06\x68\x1d\x59\xdb\xd5\x20\x20\x42\x76\xac\x19\x21\xae\x5b\xc6\x10\x4e\xa8\x58\x7b\x25\x8b\xc5\xb9\xd5\x0a\xb9\xc1\x75\xaa\x56\x18\x21\x7a\xa9\x56\xd4\x9b\xe2\xa9\xd5\x8a\x83\x2a\x0f\xbf\x4c\xf5\xf6\xe8\x30\x58\x19\x1c\x39\x9c\xd5\x96\xdb\xcf\xc5\xd9\xdc\xfc\x17\x00\x00\xff\xff\x3b\xfc\x2f\xb1\x82\x33\x00\x00") - -func pagesAssetsStylesBootstrapTheme311MinCssBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsStylesBootstrapTheme311MinCss, - "pages/assets/styles/bootstrap-theme-3.1.1.min.css", - ) -} - -func pagesAssetsStylesBootstrapTheme311MinCss() (*asset, error) { - bytes, err := pagesAssetsStylesBootstrapTheme311MinCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/styles/bootstrap-theme-3.1.1.min.css", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _pagesAssetsStylesContainersCss = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\xb9\xd7\x8e\xe3\x68\x9a\x28\x78\xdf\x4f\x91\x3b\x83\x05\xce\x39\xec\x6c\x7a\x57\x85\xbd\xa0\x11\x45\x27\x7a\x7f\xb3\xa0\x27\x25\x7a\x27\x92\x85\x79\xf7\x85\x22\x22\x23\xb3\x4c\x57\x75\xcf\x6c\x20\x95\x11\xfc\xf9\x7f\xde\x7f\xfa\xdb\x3f\xca\xbe\x2f\x9b\xfc\xeb\x56\xcf\x6b\xdc\xd4\x67\xbc\xd4\x7d\xf7\x75\xe9\xfb\x26\x89\xa7\x5f\x8a\xbe\x5b\xbe\xce\xf5\x99\xff\x04\x43\xd0\xff\xfd\x5f\x7f\x7a\xf9\xcb\x9f\xbe\xfd\x9a\xef\x43\x3f\x2d\x5f\xeb\xf7\x4b\x7f\xff\xff\x01\x55\x16\x2f\xf1\xff\x08\x4f\xb5\xb4\xcd\xd7\xb4\xcf\xf2\x5f\xda\x78\x2a\xeb\xee\xeb\x54\x97\xd5\xf2\xd3\x3f\xe0\xbc\xfd\x73\x51\xbf\x43\xbe\x78\x69\xe2\xee\xed\xed\xbb\xb6\x9e\xf9\x1b\x92\xa4\x6f\xb2\xbf\x40\xd2\x3f\xbe\x26\xeb\xb2\xf4\xdd\x2f\x43\x9c\x65\x75\x57\xfe\x84\x0c\xfb\x5f\xc0\x2c\x53\x1d\x77\x65\x93\xff\x32\xf4\x73\xfd\x7a\xf3\x53\x9c\xcc\x7d\xb3\x2e\xf9\xcf\xef\xcc\x43\x3f\x2f\xfd\xf0\x13\xf4\x17\x68\xd2\x78\x78\x7f\x8e\x93\x26\xff\xe5\x59\x67\x4b\xf5\x66\xe1\x9f\xbf\x71\x02\xfd\xfc\xae\x92\x9f\xa0\x9f\x93\x7e\xca\xf2\xe9\xf3\x8f\xaf\x69\xdf\x34\xf1\x30\xe7\x3f\x7d\xfb\xe3\x2f\x68\xcd\x6d\xdc\x34\x5f\xb3\x3a\x6e\xfa\xf2\x83\x14\x0e\x41\x7f\x29\x69\x52\x97\xbf\x06\xa2\xfe\x05\xa0\x1f\x69\xfd\xb9\x6b\xfc\x88\xff\xf7\xba\x4c\xe2\xf4\x51\x4e\xfd\xda\x65\x2f\x71\xfb\xe9\xa7\xff\x4c\xe1\x8c\x2e\x8a\x6f\xca\x80\x87\xfd\xcb\xdc\x37\x75\xf6\xe5\x3f\xd1\x18\x27\x49\xec\x53\x71\xd4\xbf\xc5\xe3\xd7\xe4\x5f\x67\xf3\x6b\x52\xfe\xf2\x7b\xbe\xb2\x2c\xfb\xf9\xf7\xfc\xbf\xf9\xc0\xcf\x4d\x5e\x2c\x7f\xe9\x0a\xbf\x62\x67\xa9\x97\xbf\x8a\xcd\x1f\x39\x7a\xbb\xfe\x07\x4c\xe5\x50\x9e\x15\xf9\xcf\x1f\x4f\x10\x04\xfd\x9c\xae\xd3\xdc\x4f\x3f\x0d\x7d\xdd\x2d\xf9\xf4\xa3\xb6\xbe\x73\x3f\xe5\x4d\xbc\xd4\x5b\xfe\xf3\x0f\x59\x07\x19\x96\x9f\x7f\x1b\x56\x3f\x6f\xf9\xb4\xd4\x69\xdc\x7c\x8d\x9b\xba\xec\x7e\x6a\xeb\x2c\x6b\xfe\x1d\x2f\xfc\x9a\xf6\xdd\x92\x77\xcb\xbf\x2e\xe8\x07\xc0\x1f\x88\x5a\x14\xc5\xa7\x34\xd8\xb0\xff\x8a\xd9\xae\x9f\xda\xb8\xf9\xb9\xdf\xf2\xa9\x68\xfa\xe7\x4f\xf1\xba\xf4\xff\xb6\x35\xbe\xa6\x4d\x3f\xff\xbb\x36\x79\x07\xfa\x81\xdd\x9f\x96\x29\xee\xe6\x21\x9e\xf2\x6e\xf9\xb2\x4e\xcd\xff\x7a\xbb\xf0\xff\x26\xfd\xfe\x8f\xb2\x2e\xfe\xf7\x97\xae\xff\x3a\xe5\x43\x1e\x2f\x5f\xe6\x74\xea\x9b\xe6\x4b\x9a\xbf\x19\xaa\x7a\x97\x04\xc6\x7f\x34\xd4\x6f\x52\x0e\x0c\x0d\xfb\x9b\xc7\xbd\xac\xf9\x91\x4b\xf0\x7f\x2f\x0c\x3e\xf4\xfb\xa5\x2e\xa6\xb8\xfd\x37\x84\xfd\x35\xdc\x8f\xd9\xe5\x1b\xe7\xe4\xdb\xc3\xef\xc2\x36\x69\xe2\xf4\xf1\x5f\xff\x48\xab\x78\x5a\xe6\xaf\x75\xd7\xd4\x5d\xfe\x35\x69\xfa\xf4\xf1\xcb\xef\xfd\x31\xab\xe7\xa1\x89\x8f\x9f\xbe\xb6\xfd\xf9\x79\xb7\xdf\x3f\xcf\x7f\x04\xff\xaf\xff\xf3\xe5\x55\x1c\xbe\xfc\x11\xea\xbf\xff\x9f\x9f\x8a\x7a\x9a\x97\xaf\x69\x55\x37\x19\xf0\x4f\xef\xfd\xf2\x6b\xc4\x9f\x6c\xb6\x79\xb7\xfe\x68\xd3\x37\xe7\xfb\x9e\x95\xdf\xd2\x54\x9a\x7e\xf9\x4f\x82\x20\x3e\xfe\x4b\xd3\xf4\xdb\x85\x79\x39\x9a\xfc\xa7\x37\xe9\xbf\x1d\x7d\xd8\x6a\xd8\xbf\x85\x67\x96\x17\xf1\xda\xbc\x47\xdc\x87\xf7\x7e\x81\xd1\x61\xff\xc2\x4c\x75\xdc\xfc\x7d\x8e\xbb\xf9\xeb\x9c\x4f\x75\xf1\xbd\x3a\xf4\xeb\xf2\xe2\xf1\xa7\xae\xef\xf2\x1f\x03\xe1\x0b\xf4\x07\xfe\xf2\xd2\x5e\x96\xef\x3f\x21\x10\x04\x41\xbf\x12\xeb\x5b\x25\xfc\x51\xba\x2c\xcb\xde\x5c\x15\x04\xe7\xb9\xf9\x47\x39\x2f\xf1\x52\xa7\xff\x48\xfb\x16\xcc\xb3\x7a\xe9\x27\xf0\x1d\xe6\x6b\x52\xfe\x63\xe8\xca\xff\xfd\xe5\xdd\x81\xbf\xee\x5f\x96\x7e\xf8\xf2\xca\x7d\xdf\x4b\xd7\x3f\xcf\x44\x4d\x3d\x2f\x1f\xba\x79\x13\xe1\x43\x30\x64\xd8\xff\x58\x34\xe8\xe7\x25\xdf\x97\xaf\x59\x9e\xf6\xd3\x9b\x5b\xbe\xbf\xfe\x27\x29\xe9\xf7\x12\x7e\xed\xd7\x25\x9f\x5e\xee\xf3\xf7\x3f\x7a\x5b\x77\xdd\xfb\xdb\x5f\xfe\xb9\xd9\x3e\x84\x89\xe3\xf8\xb7\x64\x97\x7e\xf8\x73\x9a\xbf\xfc\xa6\xaa\x7f\x77\x81\x97\xbd\xbe\x89\xf8\x87\x38\xbe\x73\xf6\x0d\xc7\x97\xaf\xf0\x67\x68\x7d\x20\x82\xbe\xbc\x8e\xbe\x21\x7a\x79\x0e\x36\xec\xbf\x0d\x89\x3f\xc6\xfa\x56\xac\x5e\x18\xff\xec\xfa\xb4\xfc\xf1\xf9\x77\x01\x3f\xd1\x7c\x24\xa7\xb7\x9c\xfb\xdf\xc0\xf8\x9d\xb1\x1f\xf1\xfc\xf3\xf8\xfd\x4b\xa1\xfe\x35\xd0\xbf\x66\xe7\x0d\xe5\x6f\xe4\xfb\xe9\xa7\xa9\xef\x97\x3f\x02\xfc\xe5\x2d\xab\x7c\xe4\x42\xe8\x4f\x2e\xfe\xa8\xc2\x7f\x15\xe4\x07\xa6\xfe\x55\x90\x8f\xc6\xf3\x57\x00\xef\x89\xe6\xcf\xa0\xb2\xa9\x1f\xb2\xfe\xf9\x87\x60\x7f\x78\xbf\x9e\x5f\x8d\x6d\xf6\x63\xbd\xae\xdb\xb8\x7c\x8f\xe5\xff\xab\x6e\x5f\xf3\x43\xdc\x2d\x3f\xf7\x43\x9c\xd6\xcb\xf1\xd3\x3f\xd0\x9f\xdf\x92\xfb\x0f\xcf\x45\xdd\x2c\xf9\xf4\x53\xdc\x0c\x55\xfc\xbf\x3e\xce\xff\x1f\x14\xfa\xdf\x7f\x4a\xf0\xcf\x35\xfb\x87\x11\xff\xa7\xa0\x9f\x1a\xfe\xf7\x41\x3f\x34\xfd\xef\x03\x7e\x2a\xfb\x23\xcf\xa0\x28\xfa\x83\xc6\x7e\x9d\x83\x68\x9a\xfe\xfe\xee\xcf\xc2\xec\x1b\xc5\x3f\x2b\x81\x7f\x68\xc1\xef\xf9\xf8\x95\x5a\x7e\x60\xe4\x33\x5b\xfd\xfa\xfc\x0f\xcd\x53\xbd\x5a\xb0\xff\x86\x6d\xfe\x39\xdc\xef\xf2\xf4\x37\x85\xa4\xc5\x97\xff\x24\xe8\xfc\xe3\x3f\x32\x2e\xfe\x82\xb5\x38\x7d\xb5\x18\x7f\x48\xbd\x1f\xf2\xee\x0f\x3a\xce\x24\x49\x7e\x9c\x4f\x3e\xab\x6c\xd2\x2f\x4b\xdf\xbe\x15\xbe\x3f\xa4\x54\xf4\xe9\x3a\xff\xb7\x5c\xf4\xcf\x20\xff\x89\x22\xfa\x29\xee\xca\x3f\x2e\x80\xdf\x52\xc0\x77\x03\xbe\xb5\x0b\x5f\xa0\x7f\xb5\x9a\x7d\x3a\xe8\x8f\xcd\xe9\x7b\xfd\x21\x5f\x05\xe9\x7b\x0b\xf1\xa7\xdd\xc3\xfb\xaf\x8f\xa6\xf2\xbd\x83\xf8\xde\x05\x7f\x45\x29\xea\xad\x28\xfe\x8b\x3c\x7d\x9b\x85\xdf\x57\x08\x7f\xa8\xc5\x5f\x5f\xf9\x6f\x98\xe1\x5f\x40\xf0\xdb\x22\xfd\xb1\xd1\xf8\xe3\x8a\xfe\x89\xef\xe5\x32\x7f\x4e\xf1\x75\xe3\x2f\xaa\xc6\x07\xc1\x6f\x33\xe7\x7f\x0b\xdb\xef\xd8\x7f\xc7\xf6\x2d\xe9\x7c\x2b\x7d\xdf\x46\xef\xa2\x28\xfe\x9a\xd0\x1f\x5e\xa8\xf2\xf4\xf1\xaf\x3a\xf4\x6f\xa9\x66\x59\xf6\x2b\xaa\xf5\x92\xb7\xbf\xfc\xd0\x60\xfe\x75\xf3\xfc\x4f\x7a\x4e\xe8\x57\xfd\x33\x99\xb7\x6f\x81\x81\xbc\x4d\x55\x55\xbd\xe4\x5f\xe7\x21\x4e\x5f\x20\xcf\x29\x1e\x7e\xc7\xc2\x6f\x9f\x5f\xad\xc4\xb7\x18\x7b\x97\x81\xcc\xdb\x6f\x14\x3e\xfc\x02\x79\xdb\x56\xfc\xa8\x84\xae\x7f\xd3\x4d\xd2\xef\x5f\x7e\x8b\xf0\xef\xbf\xb9\x58\xa7\x7d\xf7\xbb\x4b\xbf\xa6\x08\x23\xbf\xc7\x1f\xa7\x69\xde\xfc\x73\xb8\x0f\xc6\xa0\xdf\x00\xbe\x49\xf4\x6d\x0a\xff\x77\x94\xfd\x7b\x2c\x7f\x58\xfc\xde\xde\xbc\xb1\xf6\xf7\x7f\x03\xe0\x37\x0c\xa5\x69\xfa\x4f\xb2\xfd\x5f\xe0\x79\xa9\xf2\x97\xff\x69\x2f\xf2\x86\xa9\xaa\xcb\xaa\xf9\x5d\x0a\x7a\x7f\xf5\x2a\x66\x7f\xb4\x41\x22\x72\xba\xa0\x7e\x53\xd8\x7f\x7d\xf8\xee\xab\x59\xbf\x2c\xf9\xef\x87\xc7\xef\x93\xc3\xd7\xf7\x12\xf4\xea\xfb\x3f\x8f\x96\x7e\x78\x3d\xff\x81\x31\x3f\xfc\xec\xf7\x8c\xbe\x69\xe3\x07\x3e\xdf\x53\xf2\x4f\x9f\xc9\xf9\x73\x29\x41\x0c\xfb\xfb\x8e\x8b\xf8\x93\xed\xc4\xab\x41\xfe\xe3\xf1\xec\xdb\xae\x82\xf8\x23\xf6\x7e\xdb\x88\xff\x05\xcf\x7f\x78\xfd\x4d\x90\x37\x06\xdf\x98\x78\xe7\xe7\x47\x6a\xfd\xfb\x16\x76\xce\x9b\x3c\x5d\xfe\xd0\xc1\x7e\x4b\xf0\x2f\x21\x7e\xa3\xbc\xff\x49\x09\xc4\x5f\xe1\xfb\x05\xfa\xbd\x6e\xde\xe2\xe4\x97\xef\x2d\xe0\xcf\x59\x3d\xe5\xe9\x9b\xf2\x9b\x65\xfa\xf9\xbb\xc4\xdf\x4b\xfc\x9f\x59\xe8\x63\xa4\x7e\x37\xcd\xdb\xd1\xbf\x68\x8e\x77\x3e\x3e\x6a\xc4\x0f\xd6\xfe\x01\xdd\xef\xba\xa1\x37\xc0\xb6\xcb\xdb\xbe\xab\xd3\xaf\x55\xdd\x2d\xbf\xfc\x76\xa0\x5f\xbb\x2c\x9f\x7e\xb7\x78\xf9\x35\xe0\x9c\x0f\xf1\x14\x2f\xfd\xf4\xa3\x1a\x7e\xb5\xb7\xfc\x1e\x02\x6f\x0c\xbe\xe6\xe0\xbf\xfd\xed\x1f\x2f\x1b\x7c\x6d\xe2\x24\x6f\xbe\xfc\xf2\xb7\x2f\x5f\xbe\x7c\xf9\xdd\x72\xf3\x6f\xff\xf5\xb7\x7f\xac\x5d\xfd\xeb\x5b\x1f\x44\xa8\xb7\x9f\x9f\xbf\x03\xbe\x07\x66\xbd\xc4\x4d\x9d\xbe\x41\xbe\xb7\x93\x5f\xd3\x61\xfd\xa7\xf8\x7f\xc0\x07\xbd\xfd\xbc\x01\xd6\xdd\xef\x40\x7f\x43\xf4\xbf\xfe\xf6\x8f\x29\x7e\x7e\x7d\x49\x30\xff\x88\xbc\x88\xdb\xba\x39\x7e\xfa\xf2\x1f\x5c\xbf\x4e\x75\x3e\x7d\xd1\xf2\xe7\x7f\xbc\x93\xf9\xb1\x6c\x7d\x19\xa6\xfc\xeb\xab\x72\xbd\x93\x9b\xfb\xe6\x63\xab\x57\x2f\x4d\xfe\x6b\x8a\xc2\xdb\xcf\xdb\xbd\x21\x2e\x5f\x03\x5f\x9c\xe5\xd3\x97\x0a\xfe\xb8\xf6\xec\xa7\xec\x0d\xd5\x4f\x5f\x92\x29\x8f\x1f\x5f\x5f\x07\x6f\xd7\xdf\xbe\xcf\xf8\x3a\xf5\xcf\x3f\x64\x30\x7d\x67\xf0\x3f\xfe\xfe\xe5\x3f\xda\xbe\xeb\xdf\xf8\xfa\x8f\x1f\xb5\xf9\x32\xdd\x97\xb7\x76\xf2\xed\xf0\x07\x3f\xfa\xf2\xe6\x5e\xef\xc7\xbf\x49\x26\x5f\x96\x7e\x78\x7f\xf1\xb1\x6e\xfa\xf2\x89\xe0\xc7\x2e\xe6\x0b\xfa\x9b\xd3\x77\x87\xfd\xdd\xf1\x2b\x61\xfe\xee\xf0\x23\xb1\xbe\x9f\xff\xd7\xdf\xfe\x31\xaf\xc9\xab\xf6\xc4\xf5\xab\x57\xf9\xd8\x16\x7e\xad\xbb\x61\x5d\x3e\x04\xff\x15\x65\xec\x1b\xb6\xf7\x84\xf7\x05\x83\xde\xd1\xfc\x67\xd3\x97\xfd\x07\xc0\x47\x4e\xfd\x82\xbc\xed\x4b\x7f\xc7\x10\xf2\x79\xfa\xfb\xc4\xfc\x3d\x67\xfc\xee\xc6\xbb\x46\x3f\x58\xfd\xdd\xdb\xcf\x84\xf0\x6d\xdb\xfc\xdb\x0b\xef\x33\xfb\x2b\x85\xfd\x47\x16\x2f\xf1\x4f\x6f\xcf\xe0\xd0\x95\x3f\x27\xf1\x9c\x13\xd8\xdf\x6b\x8f\xd5\xad\x27\xa4\x5c\xcb\x9e\x61\x18\x46\xb3\xdd\xea\xe2\x96\x0c\xc3\x92\xee\xeb\xb1\xe6\x18\x89\x61\x18\x8e\x45\xcc\x01\x65\x18\x46\xb1\xfd\x86\x37\x61\xf6\x74\x1f\x19\x27\x5d\x1a\xc1\x3c\xc3\x5d\x77\x42\x44\x75\xa4\xf5\x66\x32\x4c\xae\x8d\x99\x8b\x66\xe1\x03\x4c\x7d\x63\x01\xd1\xc8\xa4\x7d\x73\xb9\x3f\xe7\x28\x9b\x4b\x93\xa9\x25\xe2\x29\x1d\x2c\x1b\xf5\x15\x67\x33\xd7\xeb\xe5\xc2\xca\xcc\x1e\xfa\x12\xd7\x84\xae\x60\x5d\x53\x5b\x08\x2e\xe5\xe2\x2a\xb6\x8c\x48\xd8\xc8\xf4\xeb\x35\x63\xeb\xbe\x8a\x6b\xd8\x4b\x75\x1d\x2b\x50\x25\x87\x8b\x60\xda\xc8\x1c\x25\x61\x70\xa5\x70\xfc\xec\xc0\x1b\x8e\x9f\x4f\x80\xb9\x58\x52\xfb\xc8\xe3\x3a\x2e\x19\xdc\xed\x5d\x4a\x5f\xca\xe2\x0e\xd1\xd2\x7e\x6b\xe9\x92\x91\x3c\x5b\x67\x2e\x12\xcb\xb7\x07\x25\x77\x6c\xea\x32\x8c\xc1\xf0\x79\x50\x01\x99\xca\x80\x20\x73\xdd\x92\x27\xc3\x31\x22\xef\xa9\xb5\x69\xef\x80\x08\x96\xe4\x60\xca\x4d\xca\x48\xf2\x85\xc1\x38\xc9\xc6\x9f\x33\xfb\x10\x24\xe6\xe0\x70\xf7\x60\x4d\xe6\x60\x4b\x66\x16\xf4\x33\x62\x7a\xa6\x61\x18\x26\x11\x1b\xca\xac\x25\x66\x2c\x21\x86\x34\x2c\xd9\x28\x5d\x06\x51\x5a\x07\x65\x53\x06\x51\xa4\x74\x34\x4b\xe6\x6e\x5e\x98\xd6\xae\x44\x99\x91\x99\xf5\xc9\x96\x5e\x28\xd8\x2a\xa3\x32\xcf\x92\x2b\xa7\x0b\x53\xab\xa5\xc3\x4c\xe5\x95\xf1\x93\xf0\xb0\x9e\x0a\xb3\x99\x2e\x93\xf5\x78\xf8\x60\x68\x26\x64\x38\xa6\x75\xa5\xf9\x64\x98\x52\x67\x24\xc6\xdc\x31\xe7\x34\x6f\xa5\xc3\xe8\xe5\x4d\x53\x40\x4c\x69\x8a\x54\xf2\x31\x9b\xb9\x30\xcf\xdb\xea\x9d\x51\xa6\x42\xf7\x9b\xbb\xca\x81\x79\xed\x8a\x83\xd2\xf9\x5a\xca\x55\x2e\x51\x05\x2e\xb4\xd2\xe1\x72\x0d\x65\x9c\x53\xd2\x06\x9f\xef\x17\xe8\xde\x31\xd0\xa9\xf3\x0c\xc3\x5c\xb7\xce\x7a\x16\x18\x66\xe0\x7c\x87\xaf\x4e\x85\xb7\x49\x97\xe8\x20\xb4\xc7\x2a\x10\x83\xec\x26\xdd\xb1\x8a\xca\x40\x60\x93\x9e\x1c\xcb\x30\xa6\x33\x83\x1b\xd2\x80\x0d\x9e\x85\x7c\x7a\x4b\xd9\x59\xf4\xc1\x98\x68\x12\x46\x1b\x7c\xe6\x7a\x2f\x00\x0f\x3a\x91\x67\x5b\xfa\xe5\x64\xe6\x5b\xab\xe6\xce\x9d\x32\x59\x22\xef\x3d\x5e\x32\x58\x28\xe5\xca\x59\x25\x6d\xaf\xee\x13\xe8\x89\x61\x33\x00\x9e\x46\x95\x00\x9c\x5a\x6c\x09\x65\xb2\x24\x80\xa0\xd3\x93\x11\xaf\xb1\x29\xb7\xcb\x53\xd1\x79\x30\x10\xaa\xa4\x8b\x57\xb7\x27\xbb\xe3\x69\x71\x37\x9f\x44\xf1\xc3\x00\x76\xcc\x03\xc1\x10\x1b\xa0\x5c\x82\x66\xef\x39\x0b\xe1\xb4\xfb\x52\x8b\xb9\x9c\xac\xed\x68\x8b\xbb\x83\x70\x91\xd2\xd6\xc3\x2a\x75\x28\x4e\x75\x17\xf1\x84\xe6\x22\x0d\xe5\x4d\x6e\xae\x1e\x20\xe3\x4c\xa1\xb8\xa4\xcb\xfc\x14\xc9\x95\x31\x15\x95\x6f\xee\x76\x56\xb2\x4c\xb1\xdd\x96\x3b\xdb\xab\x0f\x93\x31\xa3\xd3\x3c\xf2\x22\x65\x18\x59\x07\x81\x90\x66\x94\xe7\x85\x39\xa3\xfc\x81\x3d\x19\x66\xd3\xcb\x30\x50\x6a\x57\x80\xce\x2b\xc7\x30\x8c\xa5\x70\xac\x32\xb1\x2c\xfb\x3c\x59\x41\x39\x19\x7e\x38\x59\x31\x39\x19\xe1\x29\x57\xec\xc3\x62\x78\xce\x61\x0c\x96\xe5\xd8\xd5\x66\x44\x66\xac\xae\x72\xc4\x5e\x3d\x87\xd1\x97\xf2\xb2\x24\x0c\x7f\x1d\x19\xab\x5d\x2f\xe6\x72\xbb\xec\x3a\x83\x76\x18\x2b\xa7\x65\xbe\x3c\x85\x67\x54\x5e\x65\x92\xbb\xaa\xc7\x95\x33\x2d\xf6\x60\x4a\x27\xb4\x2f\x44\xcd\x0a\xf5\x7d\x29\xeb\xb3\x2c\x83\x36\xc4\x2e\x52\x2b\x48\x9a\xac\x30\x03\xc7\x0f\x35\x6b\x59\xd2\x1c\xbc\x9c\x90\x1b\x5d\x79\x7c\x78\xb0\x24\x81\xd2\x92\x56\x26\x7e\xf7\x76\x06\x18\xf8\xe4\xe0\x98\xa3\xde\x0e\x65\xbb\xa4\x7b\x23\x5d\x0f\xd7\x34\x5c\xa6\xf3\x98\x35\x2e\x8b\x6b\x3f\x5d\x7b\xd1\xb0\x32\xde\x34\x82\x90\xf3\xfb\x76\xb3\xae\x93\x99\x1b\x21\x87\xf4\x63\x61\xd9\x40\x05\x67\x0c\x4b\xd7\x3d\x7e\x2f\xb5\xcb\xce\xb7\xf1\x0d\xf1\x85\xf4\x2e\x65\x42\x28\x35\xe1\xb5\x4e\x44\xa1\x35\x1a\x9f\xf7\xfc\xfb\xe9\xdd\x45\xaf\x44\xb3\xca\x4d\x9e\x32\x5e\x91\xcf\xf2\xc1\xf4\x2b\x73\x01\x9e\x52\xd0\x9b\xe6\xb3\x3d\xb8\x87\xcc\x8a\xfe\x65\x0f\x4d\xa2\x6c\x48\x4e\x87\x2e\x53\x2f\x79\xcf\x96\xaf\x78\x91\x93\x0f\xc5\x19\x2f\x00\x24\x07\xbd\x0d\xa4\x16\x16\xde\xc7\xfd\x21\x54\xd7\x89\x4b\x56\xc9\xc2\xaa\xae\xf6\x72\xf9\x89\x39\x01\xae\x49\x32\x43\xca\x8f\xd5\xd2\xb9\xfa\xd2\x3c\x78\x59\xe6\xa0\x66\xb2\xb5\x45\x52\x63\xcb\x19\x78\xd2\xbe\x5c\xdb\xd4\xe1\x92\xe9\x71\x45\x65\x74\x35\xa5\xb9\xe7\x66\x49\xce\xad\x05\x67\x8c\xc7\x05\xb0\x01\xaa\xe3\x71\x35\x75\xf5\xd9\x97\xb0\xc7\x53\xee\x6b\xcb\x1e\x64\xd3\xb6\xef\x5e\x63\x00\xee\x65\x88\xa8\xc3\x1c\xda\x72\x6c\x44\x6d\x8c\x48\x97\x53\x46\x49\x1f\xe8\xd8\xf6\x91\x32\x6b\x98\xcd\xc5\xf2\xe1\x72\x5a\x70\x5b\x07\x5a\xbb\x47\xfc\x41\x98\x4b\x4f\x07\x66\xdb\x36\x5d\x5c\x64\xbd\x0a\x34\xd0\x5a\x76\x59\xb9\xe3\x42\x43\x73\x01\xd4\x6e\x3d\x0b\x74\x1d\x11\x1a\x50\xf6\x7c\x6a\x55\x89\xf0\x3b\x54\xd5\x0a\xdb\x4c\xd7\x60\x8e\x86\xbd\x46\xaf\x36\x10\x39\x4a\x28\x40\x78\x1e\x1d\x82\xf9\x84\x4f\x29\x69\xfd\x3c\xe4\xf1\x6a\xf3\xbc\x72\xa4\xeb\x81\x12\x22\x51\xb9\x0c\x2e\xd1\x78\xb1\x57\x0c\x41\x37\x36\x96\x97\xc2\x2e\x08\x07\xed\xc8\xc1\xf6\xe4\x99\xc0\x14\x34\x11\x3d\x3c\x22\x6f\x86\xf9\xfb\x68\x76\xae\x30\x6e\xde\x68\xc1\xde\x4a\x3c\x90\x69\xc6\xed\x0c\x56\x0c\xf7\x46\x5b\x01\xa1\x03\x01\x88\x70\x40\x7b\xd3\xe6\x3e\x16\xac\x91\xbb\xda\x8a\xe6\x86\x64\x71\xbd\x86\x50\x25\xcc\xe1\x11\x15\x42\x68\x2e\xd1\xe1\x95\xc6\xa4\x5e\xd7\xd0\xf1\xe5\x64\xde\xba\xd9\x11\x43\x01\xd8\x17\x44\x45\x97\x9b\x0b\x69\xe7\xd8\xc6\x73\x34\x08\x6d\x97\x47\xfb\x69\x5e\xf4\x7d\x12\x4b\x8a\xef\xa2\xee\x32\xe9\x52\x8a\x69\x67\x37\x2f\xcc\x01\x81\x6a\x22\xfa\xf1\x08\xb7\x53\x40\x2c\x1a\x3d\x10\xc8\x44\xc6\xe1\x0a\x1f\xa4\x95\x2c\x04\x3d\x6d\x59\xc0\x65\xa6\x0c\xcd\x5d\xe1\x12\x89\x33\xa1\x99\xd9\x12\xda\x34\x58\x6b\xef\x13\x08\x1a\x18\xc4\x9d\x74\x42\x60\xc1\x09\xb3\x83\x8f\xcd\xd5\x89\x0c\xb5\x2c\xd0\x5b\x68\xc5\x80\x05\x60\xda\xe0\x15\xb4\xc4\x33\x7d\x6a\x4c\x89\x3c\xd8\x66\xbe\x39\xd5\x9d\xba\x1d\x66\x08\x54\x53\x7b\x6d\x31\xa8\xe0\x2e\x58\x5c\x5a\x07\x52\x13\x8f\xd4\xea\x7b\x5a\x90\xfb\x23\xc7\xe4\x95\x10\x23\xe0\x06\xe7\x6c\x0a\x44\xe3\xbe\x89\x57\x65\xd6\x34\xbc\x41\xaf\x33\x15\xfa\xf2\x70\x5b\xd6\xc7\xae\x38\x02\xae\x62\xc3\x19\x59\x53\xdb\xc6\x04\x94\x38\x4e\x76\x3b\x6f\x07\x77\xa6\x93\x56\xcf\x47\x7e\xe8\x7a\xe6\xa7\x31\x8e\x57\xdb\xd2\x52\x08\x78\x68\x55\xec\x09\xdd\xcd\x53\xea\x33\x56\x77\x3c\x89\x9b\xee\x54\xd9\x28\xd2\x9a\x2d\x9f\x5b\x21\x04\xbc\xae\xf1\x69\x2f\x09\xa6\x4b\xe7\x07\xfa\x3c\x13\x08\xea\x7b\xc8\x6e\x5e\xe1\x3c\xe1\xe5\x99\x68\xa9\x15\x19\x15\x24\x99\x52\x0b\x69\x11\xb4\x10\x74\xc9\xbd\x1f\x9d\xad\x14\x9e\x93\x2c\xfd\x4e\x1a\xe7\xcc\xad\x47\x4c\x32\xc9\xa2\x17\x51\x45\xd7\x01\x92\x14\x89\x21\xa6\xcf\xf4\x52\xa1\xbe\x8e\x9a\x64\x21\xca\x50\x96\xee\x48\x22\x72\x14\x41\x38\x95\x76\xd3\x87\x5d\xe9\x78\xc2\xcb\xba\x2b\x92\x57\x29\x8e\x9e\x9a\x95\xb7\x36\xce\xab\x97\x21\x43\x9a\x3d\x73\x92\x38\x57\x06\x84\x28\xf2\x79\xf5\x70\x6b\x5a\xd7\x45\x81\x21\xd0\xbf\xb7\xe4\x9a\xa0\x0a\x1a\x25\x99\x93\x9d\x3c\x2a\x14\xf1\x46\x3a\x36\x91\x5c\xa9\x26\x7b\x9e\xe8\x66\x16\xce\x93\x86\xef\x75\x9a\x9e\xf7\x2e\xce\x93\x81\x52\xcf\x87\x9e\x6e\x41\x17\xe5\xbe\x47\x92\x9b\x85\x1b\x33\xfe\x6c\xbb\x25\x7c\x26\xe9\x3d\xd9\x85\xad\xdc\xd2\x85\x0c\xf9\x1e\x30\xfc\x80\x38\xd7\x07\x6f\xcc\x21\xc0\x0c\x34\xd1\x61\x39\x30\x4c\x58\x8d\x9e\x08\x20\xa1\xa4\x5f\x0c\x0d\xc0\x82\x47\x0e\x9c\x1b\x71\x80\x88\x01\xa8\x60\x95\x17\x92\x4f\xb9\x98\x10\x32\x22\xcb\xe4\x2e\xbb\x85\x97\xb8\x4c\x6e\x7c\xfc\xbc\x15\xac\xfc\xb8\x0c\x66\x0a\xb3\x21\x24\xac\xcf\x70\xe3\x79\xcc\x33\xcb\xa7\xcc\x7b\x8f\x22\x1d\xb4\xed\xc9\x16\xc7\x15\x6c\xee\x37\x7a\xef\x54\x79\xb2\x84\xb4\x97\x3a\xcb\x8b\xaf\x60\xff\x3c\xb9\xe8\x26\x2e\xa1\x75\xef\x13\x83\xd3\x28\xb3\x68\x81\x16\x70\xcf\xe1\x54\x43\xa9\xd6\x59\x31\x91\x6a\x4c\x44\x1e\x51\x6b\x15\x78\x61\x99\x83\x72\x57\x46\x75\x1d\xac\x45\xd0\xa0\x34\x70\x50\x55\x8b\x67\x5c\xe8\xc8\x88\x44\x74\x2a\x04\x86\xbb\xfa\x20\x11\x64\x44\xd2\x2e\xea\xa6\xeb\x30\xbb\xed\x7e\x27\xe5\x15\x2b\xd5\x7a\x5c\x25\x01\xab\xc0\x4a\xa0\xa2\xd4\xce\xd8\xdb\x83\xcb\x11\x19\xbf\x39\xe1\xce\x23\x32\x86\xde\x38\x1c\x39\xe2\x1b\x7e\x3e\xda\xc6\xf6\xb3\xab\xbe\xe2\xd9\x51\xaf\x56\xd1\x12\x29\xa9\x76\x5d\x4a\xf9\x8e\x17\x3d\xc4\x27\x56\x45\xa5\xdd\x90\x12\x88\x87\xb7\xd2\x6c\x98\xed\x7a\x01\x9b\x01\xc1\x35\xd1\x32\x8e\x4a\x5e\x05\x07\xf2\x81\xbe\x47\x6a\x37\xb9\xa2\xeb\xa5\xa7\x1e\x6b\x9c\x79\x43\x80\xe8\x1a\x44\x16\xae\x41\xc4\x52\x64\x58\x5d\x70\xbd\x3d\x1b\xc3\xad\x17\xfc\x61\xb5\xf6\x6a\x1b\xa7\xe3\x45\x17\x78\x21\xe6\x93\x6e\x76\xc4\x86\xf0\x46\x3e\xdc\x4e\xd1\x6c\xde\x6f\xfd\x85\xdb\x82\x9b\x9a\xf6\x0b\x44\xb7\xca\xb1\x3a\x7c\x6e\xe1\x78\x8b\x2a\x57\x5c\x17\x8f\xad\x78\x48\x60\x73\x52\xf4\xec\x25\x92\x77\x83\x62\x1d\x72\x47\xdc\xe4\xab\xe8\xa6\x12\xe5\x94\x0b\x73\xe8\xa3\x35\x66\xab\xb0\xe4\x2f\xe6\x89\x22\x09\x40\x6c\x8f\x3b\x87\x49\x7e\xa1\x22\xe6\x2c\x70\xd8\xac\x1a\xe1\x2a\x56\x11\x95\x33\xf5\x06\xf9\xa4\x50\xeb\xaa\xbb\x67\xa8\x7a\x17\x32\x77\x1a\x1e\xf9\xb5\x7b\x42\x1d\xaa\xc6\xb7\xf5\x68\x36\xd8\xc4\x9a\xca\xf6\x0a\x79\xcc\xb3\xf3\xb8\x37\x0a\x0f\x8d\x7e\x63\x1e\x2b\xe7\x9d\xb6\x37\x46\x8e\x7c\x20\xc4\x4a\x0b\x23\x1e\xee\x5e\xd5\xf8\x96\x47\x22\x63\x00\x7b\x8b\x5f\x1c\x7d\xd0\x78\xc0\x9c\x2a\x47\x3f\x6d\xf5\xd3\x9a\xee\x2d\xd6\x64\x7a\x40\x7b\x14\x1d\x34\x0b\xb2\x4c\xb9\x3d\x15\x0a\x99\x2f\x12\x41\x38\x53\x32\x9e\xa8\x9f\x00\x9b\x3d\xc1\xa3\x99\x05\x66\xb5\x31\xda\x64\x6d\xfb\x3d\x77\x93\x00\x81\x15\xb4\xb3\xab\xbc\x9d\xe0\xfb\x8c\x40\xaf\xec\xc0\x9c\x5e\xa5\xe5\x70\x72\xaa\xf1\x8c\x80\x4a\xa5\x8d\x06\x92\x0f\x30\x18\xa4\x8b\x0f\xc6\xc8\xb4\x90\x64\x24\x2f\x93\xbf\xd1\x30\x9a\x83\x37\xbd\xdc\x21\x4f\xa7\xc9\xad\xd1\x0f\x6a\xb1\x17\xcc\x43\x56\xda\x0a\x50\x38\x59\xd4\xb5\x5c\x10\xe3\xda\x4a\xc9\x3a\x81\x6d\xb1\x20\x98\x85\x66\xc6\x1e\x11\x46\x4e\x78\x24\x0b\x46\x02\x09\x2c\x63\x76\xa5\x67\x54\x01\xc0\x8d\x94\xe4\xc4\x93\x90\xbb\x85\x4b\x7a\xc7\x37\x2d\xc6\x6e\xc8\xb0\x2d\x6d\x97\xc3\xa9\xd0\x8f\xfc\x2c\xb3\x78\x7a\xe9\x50\x22\xa2\x72\x40\x33\x09\x45\xd4\x9f\xf4\xc9\x9f\x19\x10\x15\x64\x01\x73\xfa\x22\xe5\xf6\x66\xeb\x13\x0d\x4f\x1c\x72\x4f\x62\x86\xee\x13\x74\x23\xa4\xe3\xde\x59\x70\x2e\xba\x39\xb0\x80\x34\x40\x9e\xe2\x3d\x44\x03\x51\x0b\xe9\xa0\x1b\xb9\x4c\xe1\xd1\x1d\xc8\x6d\xee\x01\xe8\x5d\xa4\xe4\x79\xe7\x62\xa0\x91\xd9\x11\x2a\x76\xa8\x63\x1c\x51\x0c\xc3\x56\x90\xc0\x9d\x49\x01\xb9\xb1\x67\x10\xf9\x38\xd0\x00\x2c\x64\x8a\x26\xbb\x3b\x8c\x3e\x37\x91\x87\xa4\x2d\xab\x91\xc3\x47\x6d\x02\xa2\xa7\x3b\x2c\x16\x1d\x4f\x63\x6e\xbd\xf9\x08\x38\x45\x45\xa1\x92\x5e\x4a\x4d\x9d\x03\x39\xf9\x4c\x42\x39\xe8\x14\xe0\x30\x3e\x35\xef\x84\xc1\x7b\xa0\x36\x48\x91\x27\xe8\xb6\xaf\xcf\x64\x41\xb0\x16\xb5\x0e\x4c\x4e\x26\x18\x10\x13\x84\xb4\x32\x94\x5b\xf1\x1b\x2a\xc0\xc4\x1d\xad\x37\x50\x25\x63\x30\xef\x45\xa0\x04\xc7\x82\x74\x80\xd9\x0f\x98\x24\xe7\xb1\xf0\xc6\x96\x27\xa5\x45\x3c\x40\xe9\x5c\x98\xe7\xe0\xe0\x80\x10\x56\x54\xd0\xa3\xb8\x59\xb4\x7b\xb7\x6a\x5d\xbb\xe3\x50\x21\xee\xb3\x76\x9d\xd0\x23\xba\x11\x0e\x16\xe7\xc7\xb0\x1b\xc6\xd1\xe1\x3e\x88\x76\x53\x4a\x6c\x1d\x0a\xa2\x35\x00\x6d\x86\x6f\x9c\x21\xc5\x6c\x78\x4d\x01\xe0\xd4\xb5\x03\x85\xaa\xdb\x48\xb4\x9b\x3e\xa7\xf7\x7d\x07\xa8\xb3\x7b\xd0\x54\x9c\x50\x53\x4a\x26\x45\x0e\x60\x24\x39\x15\x3b\x09\x15\xad\x7d\xa7\x4c\x03\x37\x29\x5a\x24\x42\x2a\xef\xa0\x0b\x88\x1a\x6b\x46\x81\xdb\x73\xa3\x31\xe7\x04\x20\x50\x96\x22\xea\x35\xe7\x5d\xc3\xc7\x22\x5a\x0c\x0f\x32\x06\xc5\x80\x04\x47\x0f\xf8\xed\x75\x2e\xa7\x97\x2a\x4a\x9f\x0c\xa3\xd6\x37\x86\xe1\xb0\x3b\x13\xd4\x8d\x81\x86\xaf\x77\x62\x76\x69\x34\xcb\x2c\x72\xb6\x34\x6d\xe9\x6e\xdc\x99\xf5\x35\x29\x32\x25\x73\x69\x2e\xa6\x67\x61\xc8\x7a\x66\x19\xc2\x26\x30\xda\xa1\xa9\x2f\x59\xd2\xe5\x62\xcb\xea\x1d\x1d\x6a\x4b\x4f\xc2\x26\x5e\xea\x20\x6a\x56\x73\xc9\xd3\xfe\x3e\x47\xc8\xc3\x4f\x11\x1d\x3a\xa2\x05\x23\xad\x0d\x42\xad\x87\x3e\xb7\xc9\xd0\x36\x57\x8c\x84\x1b\x9f\xd2\x62\x78\x62\xda\x0a\xb2\x14\x91\x93\x1a\xf2\x0e\xb1\x8f\x92\x65\xef\xd2\x86\xf2\x84\x07\x88\x26\x2d\x48\xbd\x40\xf2\x18\xbf\xe1\x4f\x00\x7d\xd8\x6d\x8a\x9f\x64\x47\xdd\x54\x0a\x2b\xd8\xb4\xc9\x8a\x89\x37\xdf\x64\x62\x24\xae\xc4\x44\x86\xe0\x9f\x2e\x53\x30\x92\x39\xaf\x34\x94\x5f\xad\x46\x16\x31\x6e\x1a\x94\x50\xf8\x76\xc9\xf5\x60\x07\xa0\xe2\x24\x81\x1f\x9d\xdc\x96\x42\x29\xf0\x0e\x44\x1b\x64\x05\xd2\xf8\x3a\xe9\x53\x0b\x87\x8c\x07\x81\x02\xd8\x5d\xde\x40\x4c\x8d\x0b\xdb\xa8\xc3\xef\x3b\x48\xef\xba\x77\xa8\x1e\x72\xe4\x1a\x42\x2c\x8e\x68\x41\x85\x79\x31\x35\x7e\x22\x72\x88\xce\x0d\xd6\xb4\x91\x65\xb2\x1f\xd3\x21\x9c\x20\xa8\x5b\x3d\x17\xf0\xe8\x91\x9a\x2f\x2c\x2c\xe3\x6a\x0d\x88\xe9\x5c\xf5\x84\x0a\xee\x39\x2b\x90\xbf\xa2\x47\xe4\x6e\xc1\xe4\x41\x8e\x60\x79\x82\xff\x64\x2e\x43\x41\x02\x60\x79\x13\x79\x18\xee\xe3\xe4\x91\x52\x19\x8c\x92\x27\xdc\x0c\xb6\x0f\xb1\x49\x45\xe0\xfa\xbb\xac\xa5\xc2\xd6\x0b\xbd\x81\x60\x98\x82\xd9\xd4\xa4\x0d\x08\x74\xce\x98\x93\x9d\x2c\x25\x77\x37\x8e\x99\x83\xed\x79\xe6\x79\x13\xbb\xb3\x73\x05\xed\xa4\xd0\xad\xea\xee\x8f\x95\x1c\x97\x02\x88\x64\x65\x88\x25\xfc\xa9\xb9\x77\xf1\x99\xbe\xe1\x63\xe5\x19\x45\xe9\x01\x27\x3a\xc7\x03\x40\xf0\x91\x3e\x46\x20\x9b\xe1\x91\x1e\x24\x9e\x13\xcd\x37\x54\xe8\xd9\x51\x60\xeb\x50\xf3\xb2\xac\x9b\x1f\x08\x54\x1b\x40\x2c\x59\xb6\x9f\x3c\x5d\x99\x53\xbb\x93\xc0\x03\xa7\x00\xd9\xed\x6c\x16\x24\xd2\x86\xdd\x19\xd3\x58\xb1\x88\x7f\xce\x2a\xf7\x3c\x6e\x9b\x22\x27\xe8\xae\x8d\x74\x60\xcb\x39\x17\x3f\x24\x8a\x7f\xb7\x8b\x6a\xde\x28\x0a\x80\x69\x8b\xc2\x6c\x03\x14\xec\x07\x5e\x4a\xec\x59\xf9\x0e\x35\xaf\x9b\x3f\x25\xf0\x8e\x3d\xc3\x98\xf5\x9e\x13\xf5\xcd\x2e\x2c\x3b\xc6\xc8\x06\x92\x39\x08\xa6\x92\xbb\x41\x7a\x03\x1d\x78\xb8\xfa\xc9\xd2\x66\x81\x05\x69\x3a\xc4\x49\xca\x09\x80\xbd\x80\xf2\x0d\x34\x5c\x4d\x4a\xe5\x68\xad\xd7\x04\x10\x24\x86\xec\x1e\xb6\x72\x2f\xa0\xdc\x02\xc8\x90\xfa\x86\xf0\xc2\x98\xc7\xbc\xa9\x8e\x8b\xeb\xd7\xea\x99\x02\x53\xb9\xa5\x6a\x93\xee\x10\x90\x4e\xca\xb8\xfa\x89\x8c\x41\xd9\x08\xc7\xd0\xf9\xb0\x4b\xe6\x02\xd1\x5b\x42\x53\x44\xf5\xdc\xb3\xd8\xdf\xc8\x9a\x5e\x92\x1a\x2b\xfd\x0b\x46\xf1\xf3\x2c\x52\x1f\x8a\xe5\x52\x67\x40\xd6\x7c\xd3\x97\xce\x2b\xce\xc6\x1b\x97\x6c\xbb\xd6\x95\xbf\x05\x53\xdf\xaa\xf7\xd8\xdb\x18\xd6\x09\xe0\x2c\xa0\xcf\x51\xe4\x27\x2b\xdd\x82\x35\x08\x0a\x60\xdc\x2d\x54\x3b\xe6\xf5\x91\xdc\x98\xed\x6d\xee\x64\x18\x8e\xc1\x74\x0b\xd2\x37\x10\x46\x51\x0a\xbb\x9d\xda\xd9\x78\xc0\x06\xf9\xe5\xa8\xcc\xe3\x16\x90\x85\x9f\xf0\x89\x63\x98\x9c\x12\x5f\xc1\x4d\x17\x1d\xec\x50\x7c\x64\x19\x37\x50\x81\x1a\xd9\xf6\x40\x02\x5b\xb3\x41\x74\x18\xb2\x53\x28\xee\x8d\x3f\xa6\xd2\xb1\x5c\xac\x84\xdc\x6b\x06\x62\x1d\x27\x50\x9d\x0c\x0b\x37\x92\x1c\x89\x66\xa4\x98\x5e\xfa\x98\x26\x7a\x0d\x5c\x99\x32\x78\xe8\x22\xc9\x8b\xda\xd0\x53\xae\x07\x07\xd6\x13\xc6\xe9\x6f\x60\x4d\xb5\x9e\x4a\x58\xd8\x33\x06\x9c\xfb\xb7\x18\x5b\x7c\x67\xc7\xc6\xcd\xd8\x0f\xc0\x91\xf5\x6e\x46\x92\x89\x00\x3a\x43\xe0\xf6\x28\x5d\x10\x7c\x89\xdb\x5e\x49\x4c\xa7\xf4\x20\x54\x13\x30\x2c\xd5\xb3\x29\x83\x4e\x5d\xdd\x88\xcd\x8b\xab\xcc\x6f\x34\x8d\x0f\xb5\x44\xda\x9f\x1f\xb6\xb6\x67\xda\xb0\x21\x5c\x0f\x9a\x67\x6a\xb0\x31\x48\x48\x0f\x3b\x4f\x93\x6b\xd5\xc7\x57\x6c\x56\x38\x02\x20\x93\x16\xf6\xa3\x3a\xd1\x58\x9d\x4d\x82\x11\x44\x51\xa3\xbd\x3e\xa1\x5c\x3f\x57\x29\xa7\x23\xb2\x66\x8b\x9b\xc6\x96\x86\xc6\x5e\x63\xad\x60\x9f\xef\x26\xbf\x3d\x7d\x15\x1e\xb1\x9c\x02\x93\x19\x5c\xc9\x17\x9c\xf9\xd8\xd4\x2a\x8a\x7d\x54\x3e\x52\x82\x8e\x17\xd5\xbe\x4b\x03\x4e\x31\xf8\x83\xb0\x07\x5e\xeb\x08\x0c\xcb\x8b\x20\x7b\x64\xa2\xa3\x2f\x64\x25\xd0\xac\x1e\x72\xa0\xbc\x7f\xf8\xd0\xd3\x87\x2b\x6b\xeb\x8a\xa2\xe8\x41\xf1\x86\xa7\x41\x9c\x83\x7d\xac\x83\xbd\x7d\xa1\x8d\x15\x21\xb3\x75\x95\x04\x0a\x78\x8c\xa5\xd6\xec\x2b\x8d\x7a\x5a\x12\x6c\x5b\xb7\xdd\xc2\x29\xd0\xc1\xcc\xbb\xc9\x8d\x06\x14\x15\x9e\xb1\x79\xcc\x7d\xe7\xf3\xb8\x59\xad\x66\x85\xbe\xe0\xa4\xa0\x91\x06\xc4\x88\x2e\x00\x18\xe1\x38\x6e\xd8\x8f\x21\x5e\x91\x08\xb6\x82\x36\xf2\x47\xa4\xdd\x4c\x6e\x7d\xcc\x46\xa5\x8b\x3e\x41\xcc\x8e\xec\xc2\x9a\xe3\x92\x38\x71\xba\xae\xaa\xc0\xe6\x28\x24\x90\x80\x3f\xd4\x86\x0e\xa6\x81\x29\xdf\x43\xb7\xe6\x5d\x38\x40\xef\x2d\x92\x67\x14\x80\x8f\xbb\xbc\x18\x23\x1c\xaf\xbe\xda\xb4\x33\x04\x74\xfd\x4d\x62\xa6\x56\x3e\x52\x43\x24\x6b\x5c\x6f\x47\x62\x68\xa3\xab\x05\x00\xd3\x65\x6c\x80\x75\x0c\x40\x7a\x98\xb5\x45\xab\x42\x8e\x0c\x8d\x27\xf6\x86\x94\x13\xd5\xb3\x2e\x47\xcd\x1a\x0d\x2d\xda\x8c\x2a\x86\xc7\x19\x1e\x10\x32\x9b\xe8\x93\x30\x38\x05\x4f\xe7\xd1\x23\x08\xe9\x2e\x1d\x8f\xf3\xc9\x00\xe1\xd5\x7a\xe0\xb7\x9a\xdc\x81\x69\x3a\xc9\x2e\x4b\x06\x00\xcc\x85\xa8\x95\xd7\x0b\x76\x13\x8b\xf9\x33\x57\xa9\x14\x8a\x76\xe7\x94\x09\x3e\xdc\xc1\x18\x65\xf0\x3b\x75\xe4\xb2\x30\xc2\xf9\x56\xdf\xfd\x28\xe6\x7d\xe6\x95\x6c\xc8\x81\xc8\x7b\x28\x37\x34\x0f\xc0\xa4\x4b\x6b\x77\x58\x8c\xd1\x51\xb8\x28\x70\x3a\x0f\x74\xc0\x88\xaa\x00\x8a\xef\x41\x60\x82\xb7\x41\xb1\x41\x24\xb8\x9f\x6b\x76\x56\xb7\xce\xc1\x91\x75\xac\xb1\x45\xf5\xda\x33\x6e\xbc\x31\x2e\x7b\x8d\x85\x64\x9f\xc2\x7c\x3f\xa4\x72\x7d\x41\x33\x08\x10\x5d\x77\xf1\x86\xcc\x6f\xe4\xdb\x82\x5d\x71\x69\xa7\x3e\xd0\xd9\x60\x27\x9f\x33\xa1\xdf\xfb\x23\x6d\x64\xf0\x89\x56\x54\x70\x1f\x89\x75\x9a\x88\x75\x3a\x29\x50\xf5\x27\x01\xf7\x7c\xa1\x62\x10\x4c\x34\xb1\x20\x26\x4f\x3a\xf1\xc4\x73\x41\x0a\xb1\x7a\x58\x32\x4e\xfa\x8d\xe5\x0a\x57\x48\xc4\x7b\x9c\xfa\xe4\x51\x30\x47\xcf\x6f\x64\x2a\x6c\x9d\x01\x31\x43\x02\x96\x13\x84\x78\xc5\xb7\xfd\x18\x78\x7f\xf2\x60\xdf\x6d\x90\x07\x74\xdd\x7a\x83\xe5\xaf\x24\x1a\x90\x07\xac\x37\xce\x40\x2c\x14\x80\x73\xbc\x72\xcc\x93\x1a\x07\x67\x79\x05\x01\x0e\x13\xcf\x6f\xb1\xd5\xc7\xdc\xb4\x82\x5b\x00\x82\x41\x71\x2b\xa9\x58\xb0\x7c\x38\x9d\x83\x43\x48\xd7\xc0\x72\xad\xcb\x8d\xf1\x98\x07\xfb\x88\x44\x07\x06\xc0\x9b\x1d\xcd\xa8\xbb\x36\xd0\xa6\xa7\x8e\x1b\x9f\x19\x45\x51\x26\xba\x2a\x3d\x6b\x7c\xcf\x79\x8c\x3d\xdf\xa5\x33\x84\xa0\xb6\xa6\xdd\x11\x27\x58\xc7\x85\x0d\x92\xdf\x9f\x54\xba\x39\x99\x65\xce\x93\xd2\xe4\xab\x7d\xa9\xa4\x90\x53\x18\x49\xe3\x7d\xb8\x23\xa9\xfd\xd6\xfa\x70\x93\x80\x46\x40\x9e\xdc\xa6\x1e\x69\xd9\x89\x8c\x47\x55\xdf\xec\x5e\x49\xa3\xfd\x58\xe5\xfb\x0e\x81\x92\x41\x90\x0e\xe1\xec\xf0\xba\x0e\x90\x17\x78\x95\x99\x5e\xc7\x63\x70\x05\xb6\xe8\x6e\xac\xc5\x49\xe8\x15\x47\x83\x02\xc1\xb1\x23\xd3\xf9\x12\xd3\x95\xa6\xba\xc6\xee\x43\x4e\x9f\x22\xc6\x6d\x8f\x0f\x07\x65\xdd\x53\xa6\x40\x07\x17\x28\x90\x57\x36\x98\xde\xde\xca\x37\x32\x8c\xe1\x43\x65\x0f\x3c\x9c\x84\x7a\x4f\xc6\x8c\xef\x5b\xd6\x2c\xa5\x0b\xae\x3b\x03\x44\x64\xd3\x38\xae\x73\xb6\x2d\x47\x13\xd7\xde\xb8\x75\xe7\xb1\xd4\x56\xc9\x16\x92\xf5\x61\x2a\xc9\x56\x48\xe5\x98\x6b\xa9\x96\x88\xbc\x19\xa2\x74\x0e\xc5\xaa\xc1\x29\x02\xc9\x80\x27\x95\x06\xea\xf0\xa0\xc2\xde\x3b\x10\x4d\x93\xc7\xf0\x7a\x11\x22\xc3\x01\xc0\xfd\x71\xbc\xe5\x33\x5a\xec\x29\x89\xf6\xed\xc7\xb0\xaf\x9a\xb5\x86\x02\xc5\x06\x9f\x3d\xc4\x28\x70\x13\xec\x7a\x42\x15\x78\x30\x6d\x4b\xee\xed\x84\xe8\xa2\x70\xb2\x97\x4f\x76\x78\x09\x4e\xc8\x5d\xa0\xd6\x00\x07\x82\xe6\x76\xe1\x18\x7d\xa1\x17\x9a\xec\x4e\x9e\xc8\x34\x0f\x75\x20\xda\xac\x5c\xa4\x00\x31\x2a\x2a\x8b\xa7\x54\x7c\xe6\x2c\xa9\x75\xe8\xad\xab\x79\x1c\xb8\xfa\xb6\xcc\xbb\x88\xe6\xa4\x88\x66\x17\x97\xfd\xa0\x93\xa5\x73\xf6\xbe\x77\xa9\xac\xa4\x4d\x78\xb9\x63\xb9\xe0\x79\x99\x8b\x2e\xd7\xd4\x37\xdc\xad\xc5\xda\xbd\x3a\x59\xa3\x34\x01\xe7\x3d\x99\x48\x92\xe9\x0a\x56\xd4\x6b\xec\xc0\x9e\x8f\x06\xdb\x70\xd1\x82\x32\x98\x44\x17\x1c\xc4\xae\x6c\xe4\xe7\xad\x12\xa5\x9b\x0d\xd1\x7a\xa8\x5e\x58\x3d\x18\x01\x14\x70\x65\xd5\xf3\x02\x78\x77\xd7\x40\xbe\x3c\xec\x19\xaa\xce\x40\xd8\x6d\xb7\x56\x1c\xb6\xf8\x11\xb7\xd3\xd3\xc5\x98\x76\xfa\xfe\xaa\x43\x17\xf5\x06\x36\xe9\x12\xf8\xdd\xd8\x2e\x46\xa4\xe7\xdd\x14\x51\x48\xa2\x1e\x73\xa3\xe4\x98\xd9\x61\x2d\x05\xb7\x23\x41\x0c\x53\x3c\xae\xb3\x57\xce\xe5\x50\x28\x98\x3d\x32\x27\xd1\x52\x41\x4d\x67\xef\xa1\xc5\x5d\xee\xaf\x98\x07\xd0\x74\x71\xe6\xd2\xbe\xbb\x21\xaf\x7b\xcd\xe0\xce\xbe\x8a\x84\xa4\x9e\xb3\xe7\x7b\x5d\x58\x26\xc7\x85\x17\x1b\x59\xa7\x52\xa5\x1d\x6a\xb8\xe4\x60\x6e\xde\x81\xe0\x41\x8d\x4f\xfe\x29\x17\xb1\xc1\x3c\xdf\x8b\xbe\x0d\x89\xa5\xc1\x74\x0e\x16\x70\xe9\x34\xf6\x40\xe0\xf9\x59\x3b\x8c\x47\x64\x88\x75\x65\x05\x0d\xdb\xeb\xec\xd5\x74\xda\x58\xdc\xa9\x4d\x49\x10\x47\x47\xa2\x79\xbf\x39\x97\xa7\xe0\x2e\x0f\xa2\x3b\x28\x52\x09\xb7\x9e\x41\x0f\xe9\xa3\x04\x70\x97\x66\x76\x2e\xbb\x7e\xef\x89\x5b\x27\x1f\x26\x37\xae\x09\x0d\x62\x0a\x92\xad\x34\x99\xaf\x04\x80\xe5\x37\xd1\xde\xc3\xe5\x4c\x51\x3d\xb4\x00\x36\xce\x9d\x23\xaf\xe6\xb8\x6d\x87\x29\x5e\xb6\x04\x31\xf9\xdd\x94\x9c\x79\xb2\x89\xb9\x39\x4a\x8d\xba\x5f\xa9\xf1\xdd\xfe\xbc\xa4\xa4\x77\x43\x47\x75\x44\x5d\x79\xe5\xd5\x4f\x66\xc1\xab\x25\x09\x60\xaa\x10\xf7\x7a\x8f\x7c\x4f\xb6\x83\x3d\x0d\x84\x5b\xb4\x1d\x14\x3a\xd2\xdd\x06\x36\x74\x30\xbe\xfe\x89\x8f\xe9\x04\x6d\xd0\x05\x88\x79\x03\x3d\x65\x86\xaf\x33\xda\x14\xc4\xe0\x2a\x55\xdf\x6f\x00\xb9\x76\x93\x06\x67\x45\xd0\x9d\x0f\xda\x70\x9e\xc5\xf3\x1e\xcf\x65\x47\x3c\x2e\x85\x44\x7e\xe6\x20\x29\xcf\xe6\xa0\x40\xd5\x89\x7c\xc6\x14\x0f\xda\x23\x6c\x45\x6d\xf4\xf0\xde\xfa\x12\xdb\xb5\x2e\x96\x70\x23\xe8\xe0\xcc\xa7\x97\x17\x1b\x08\xe1\x77\xe2\x72\x33\xaa\xd5\x78\x1a\x15\x65\x54\xad\xdc\x46\xa9\x33\x66\x37\x88\xe8\x20\xa0\x81\xce\x7b\xd5\x75\xbc\xb6\x36\xf4\x36\xa4\x53\x93\xaa\x53\x91\x90\x41\x4c\x06\x36\x19\xe0\xee\x4e\xc1\x0f\xad\x70\xe6\x16\xf6\x47\xd8\x1f\x69\x2f\x1b\x96\x60\xcc\xd4\xe9\x49\x19\xec\x13\x8c\x40\xa0\x7f\xcd\x15\x05\x35\x61\x0f\x10\xf4\x76\x2a\xba\xa6\xdd\xa0\x2f\xd9\x98\x5c\xcf\x39\x11\x50\xfa\xd5\xcf\xcc\xc9\x75\x97\xd4\x3a\x55\xd1\x73\x9d\x89\x76\x50\xdc\xe7\x84\x09\xdb\x67\x9d\xaa\xe4\x83\x03\xf9\xc3\x53\x56\x16\xbd\x8b\x2d\x8d\xce\xc4\x3a\xbd\x3e\xaf\x1a\x58\xa5\x9e\xd0\x44\x6e\x73\x03\x0a\x8f\x72\x76\x0e\x11\xaa\xd0\x26\x82\x18\x91\x8f\xb4\x1d\x8e\x78\x1e\xda\x16\x1f\xe3\x76\x78\x7d\x8e\x78\x7e\xc0\x1a\x92\xa3\x8e\x36\x6d\x59\x32\xa5\xa4\xc8\xe0\xf2\xa3\xb2\x07\x27\x92\x1e\x76\x24\xa7\xea\x92\xce\xe0\x88\xc7\x53\x48\x50\x2a\x27\xd5\xb7\xbb\x54\xbf\x5c\x45\xa9\x27\x25\xe6\xcd\xf8\x9e\x26\xfd\xa8\xdc\xfb\x56\xaf\x43\xe2\x5a\x6b\xd6\x7c\xe3\x5a\x99\xc8\x8d\x2e\x07\xb0\xfc\x8c\xd6\x91\x5c\xc9\x91\xc3\x15\xc5\xb0\x6c\xbe\xd4\x01\xc6\xd8\xda\xf2\xbd\xe7\x7c\xb0\x37\x4f\x88\x7c\xb7\x79\x25\x52\xd6\x4c\x1b\xc0\xd8\x73\x79\x8c\x5b\x7c\x8d\xdb\x27\x74\x35\x51\x71\x2f\x27\xc5\x7e\x6c\x27\x65\xa8\x5e\x2c\x66\x87\x43\x88\x31\xa9\x7a\xf1\x14\x65\x7b\x3d\x7b\xe3\xe2\x8d\x9b\x10\x0e\x6d\xda\xc9\x63\xd8\xc9\x47\xd8\x8a\x0c\x26\x5e\x04\xfc\x88\xa4\x47\x10\x92\xe4\x04\x32\xf0\x23\xba\x5a\x37\xe7\xb2\x0f\x43\x1d\xb6\xf2\xbd\x47\xb4\x2a\x7c\x50\x0f\x37\x3e\x55\x61\x9f\xfd\x38\x6c\x15\x0e\x6c\xeb\xa0\x8d\xda\x68\x1f\x93\x96\x02\xd2\x44\x9d\x7c\x78\xcd\xd0\x55\x52\x57\x62\x53\xf7\x34\x59\x10\xc6\xc0\xb9\xcf\x38\x74\x03\x3c\x0f\x16\xfe\x81\x01\xf4\xae\xb3\x07\xbc\xf8\xd9\x18\x53\xf4\xc5\x7a\x84\xab\xcf\x73\xe0\xa2\x98\x98\x7a\xa6\x28\xc7\x87\xae\x03\xc1\xda\x3d\x3c\xf4\x17\xe5\x3b\x06\x18\x77\x0c\x31\xee\x18\xa0\xbd\x7e\x23\xc8\x13\x39\xfb\x93\xbe\xa9\x2f\xfd\x17\x09\xfb\x0c\xaf\xc6\xc6\x77\xf1\xe4\x12\x72\x9d\x5c\x45\x36\x0d\x22\x0c\x3b\x77\x2a\x10\xf6\xd4\x8f\xce\x40\xdc\xa3\xee\x66\x76\xb7\xe7\x69\x38\x68\x86\x8a\x67\x55\x5c\xb4\xbb\x7b\x4b\x6a\xf2\xe8\xa4\x03\xd1\x70\x06\x24\x19\x20\xff\x98\x9d\x84\xb7\xa4\x0b\x91\xe2\x6d\x63\x0d\xb8\xb9\x96\xc7\xb5\x1f\x55\x0e\xdb\xba\x93\x7b\xce\x2a\x2d\x8e\x34\xc0\xf8\x24\x9a\x93\x15\x16\x5d\x2b\x2c\x7f\xe5\xd4\xeb\xdb\xe7\x91\xbd\xfd\x1d\xb5\x56\xe3\x4f\xf2\x9b\x6c\xed\x7e\x2b\x44\x99\x32\xbb\xfd\x96\x76\x32\x67\x3e\x64\x3b\xb8\xb6\x14\xc4\x52\xe9\x2c\x7a\xe3\x0a\x8f\x45\xc3\x85\x88\xe6\x44\x70\x1e\xec\xc0\x4d\x06\x86\x8e\x20\x86\x02\xd4\xef\x18\xd0\x55\xae\x0a\xb0\x27\xf9\xd9\x1f\xd8\x65\xa7\x9f\xb3\x74\xaf\x79\xb0\xde\x9f\xba\x85\xa2\xf4\x5a\x4c\x44\xba\x8f\x9a\x5c\xa7\x64\x4e\x13\x54\xdf\x35\x42\x95\x2b\x8f\x84\x25\x8c\x08\xa9\xfa\x5c\x64\xfb\x58\x64\x9f\x94\x28\xcd\xc9\x24\x84\x0d\xdf\x47\x06\xef\x44\x64\x11\xae\x2b\x88\xd2\x38\x6a\x4d\x9a\x3c\x61\x80\x51\x3f\x5e\x69\x6f\x97\x9c\x07\xae\xdb\x6e\xa3\x5b\xd8\x0c\xb7\xe6\x0c\xb7\x54\xd0\xd2\x86\x03\x00\x42\x33\x24\x2d\x77\x40\x05\x5a\xdf\x8a\x5d\x51\xea\xbe\xbc\x8b\x8c\x43\x57\xe0\xf9\x51\x13\x2e\x0e\x4d\x2b\x4d\xc1\x33\x94\x51\x01\x9c\xf0\xb2\x81\x60\x25\x0f\x1c\x28\x3a\x1c\x28\x9a\x6b\xf9\xbc\xea\x61\x8e\x20\xfe\x49\x83\xa6\x46\x83\x05\x4a\x33\x4f\x9d\x2f\xa1\x57\x84\xe8\xd5\x6c\xdc\xd0\xd7\xec\xb8\xae\xf6\x63\xd0\x6d\x17\x97\x9d\x07\xae\x3a\x6f\x6d\x73\x63\xf0\xcf\x94\x7f\xa8\xb3\x50\xce\xc2\x01\xc0\x41\xb2\x63\x84\x27\x27\x08\xe8\x40\x19\x53\xe9\xe6\xab\x1f\x2b\x50\x14\x4d\x17\x9b\x35\x0e\xf6\xb3\x5f\x57\xe4\x1c\x05\x85\x6b\xe6\xc2\x8b\x22\x66\xcc\xe4\xbd\xdc\xbe\xe8\xf0\xd6\xea\x22\xa4\xe8\xa2\x6b\x1a\xdd\xdd\xb8\xe0\xcf\x0b\xac\x65\x81\x83\xd0\x45\x82\xa0\x33\x2e\x0c\x40\xd8\x5e\xf9\x8a\x4d\xaf\xc7\x2d\xda\xb4\xd8\x6f\x87\x38\x6e\x07\xc2\x6f\x86\xd7\xdf\xe0\xbd\x26\x22\x64\x9f\x27\x45\x3f\x47\x42\x3f\x67\x12\xa1\x43\x74\xa7\x8c\x9b\x45\x6e\x6d\x70\x0e\x8d\xef\x29\x70\x43\x96\x3c\x60\xde\x9f\xef\xbe\x65\x36\x96\x46\x46\x5d\x10\x2c\x34\x2b\xd2\x98\x23\xec\xf9\x2b\x86\xac\x47\xf4\xea\x4e\xc6\xf8\x31\x48\xd4\x4a\xa0\x8d\x3a\xe4\xd3\x42\xe6\xdb\x40\xe6\xe8\x40\xe4\xe8\x40\x16\x41\x38\x89\x26\xa2\x73\xad\x3b\x76\x35\x06\xdc\xce\xdb\x22\x9d\xd0\x72\x3b\xa1\xc5\x70\xa0\x46\xee\x32\xf4\xc0\x77\x7f\x5a\xc8\x9d\x0a\xaf\x6c\x8d\x6d\xa2\x3c\x6b\xd5\x4a\x17\x29\xdd\x19\xa0\x31\xdc\xa5\x1d\x02\x4a\x1e\x63\x80\xfc\x33\x26\x3d\x21\x6a\xd9\x07\x8c\x6d\xa0\xb8\xbf\xea\x0b\xf5\xf2\x25\xbc\x00\x07\xaa\x79\xd8\x8f\xe1\x76\x97\x28\xf4\x55\xb7\x5f\xb1\x2f\x5a\xae\x27\x5a\xda\x72\x97\x4e\x97\x08\x9c\xad\x73\x93\x85\x0e\xa6\x25\xdb\xb6\x07\xae\x3b\x25\x24\xb2\x68\x86\x66\x9d\x07\x16\x26\xc4\xb2\xe2\xd0\x9b\xee\x44\xa7\xe4\xed\x2e\x1d\xb7\xbb\x7c\xd0\xed\x9e\xf9\x42\x1d\x3a\x63\xa6\x3a\xd0\xa6\x9e\xb7\x53\x3a\x6f\xfb\xcd\x7e\x8c\xb7\x5b\x35\x15\x20\x74\x55\xe5\xcb\xe3\xbc\x9d\x37\x64\x45\xe1\xf1\x95\x7b\xd3\x4e\x4d\xc3\xea\x11\x7d\x44\x58\x2c\x96\xa4\x56\xc2\xfa\x5a\x35\xf1\xab\xfe\x6b\xbd\x09\x30\x1b\x49\x0a\x31\xf3\x51\xbb\x78\xb3\x91\xeb\x30\xe6\x99\x58\x7c\x42\x97\xc9\x18\x5e\x99\xcf\x8b\xa7\x18\x0a\x0c\x40\x2e\x82\x90\x94\x64\xb7\x3b\x72\xfe\xa4\xc2\xfb\x94\x9f\x80\x77\x64\x81\x85\x64\x9d\x85\x6c\x5b\xda\x11\x1b\xd5\xd8\x91\x9a\x90\x71\x24\xc0\x47\xbf\xa8\x9e\x7f\x87\x32\x46\x7c\x5e\x40\x77\x79\x6f\x50\x98\x8b\xaa\xda\x10\x2d\xf7\xcf\xfa\xc0\x02\xee\xad\xc6\x21\xeb\xb3\x13\x29\x2b\xcb\xee\xb3\xbb\xa9\x7b\x4d\x3c\x7d\x48\xb9\x30\x28\xae\xbf\x83\x94\x99\xe2\x37\x43\x26\x5d\x18\x4e\xba\x8b\xcf\x82\xaa\xbb\x6f\x03\x14\x47\x70\x32\xc6\x70\x1c\xa1\x21\xbb\x53\x3a\x9f\x73\x3b\x6f\x36\xe9\x04\xa4\x26\xc3\xbd\x6a\x68\x1d\x3e\x64\x9a\x11\x9f\xe2\xe7\x6c\xcb\xf7\xf5\x3d\x4f\x9e\x94\xc1\x13\xe6\x8d\xb9\xd9\x6e\x27\xc7\x8d\xab\x6c\x3d\x03\x30\xe0\x27\xdd\x81\x73\x3b\x99\xbe\x5c\x18\x49\xcd\x7b\x41\xb1\x63\x53\x2d\xbd\xef\xbb\x01\xb3\x19\xf6\x1b\xc8\x58\x8c\xcb\x75\x69\xcf\x30\xe0\xe7\xdc\x24\xd9\x10\xce\x39\xc8\xfd\x79\x33\x3d\x41\xb6\xa5\x07\xc4\x80\xd2\xf0\x39\xff\x40\x95\xe4\xe4\x46\x98\x31\x57\xdc\x34\xa5\xb2\xfe\xac\xb3\xaa\x7d\xb1\x74\xa9\x63\x38\xd5\x26\x40\x77\xbf\x39\x22\xc4\x14\xcc\xf7\x3d\xd1\xa5\x56\xb5\xa8\x81\xf4\x0a\xa6\x19\x8e\x8b\x2b\xc9\xc2\xda\x92\xc7\xae\xe0\xb7\x39\x80\x77\x5f\xbd\x0d\x64\x9a\x4c\x7f\x17\xce\xf8\xa9\x52\x77\xf4\x9b\xae\xf8\x91\x53\x5e\x2a\xac\x0d\xb2\x64\xa2\xcf\x7d\xd5\x45\xc9\x10\xf7\x29\xb1\x2e\xcf\xf8\xb8\x1e\xc9\x25\x0f\x58\x77\xec\x43\x05\x15\x2c\x0f\xba\x2c\x97\x8c\xe9\xd8\x07\x2a\xcf\x3c\x78\xdc\x52\xf6\xed\x95\x22\xea\x02\xab\xf1\x97\x27\x27\xc9\x7d\x94\x5c\x00\x16\xfc\xdc\x9f\x09\x4c\x10\x1e\xca\x85\xa9\x99\xf4\x42\xa6\xed\xd3\x00\xa5\xef\x39\x18\x23\xf4\xa1\x6f\x19\x96\x53\x9c\xb1\x70\x08\x30\x78\xc9\x88\x7e\xca\xa8\x94\xa7\xf5\x48\x6c\x96\x61\x6b\x34\xca\x6f\xd6\xd0\x33\x87\xc4\x7e\xea\x8e\x98\x55\xfe\x89\xba\x84\x18\x40\x8c\xc4\x10\xf7\x47\x0a\x2e\x0c\xdf\x7e\xe6\x88\x0b\x1b\x46\x17\xf7\xe2\x30\x4c\x05\xb9\x80\x8a\xfa\x25\xfb\x5d\x56\x96\xbf\xea\x09\xc5\xec\x6a\x3f\x54\x81\xe6\x30\xab\xc5\x18\xe5\xbb\xea\x18\xe3\x81\x31\x37\x61\xb5\xcb\x68\xb5\x7b\x26\xfd\x94\x93\x29\x55\x18\x2b\x1c\x96\xe1\x6b\x48\xca\x4e\xf7\xa9\x3e\x4c\xfe\x43\x3f\x17\x2e\xb4\x46\xbd\xe2\x4c\x0e\x53\xcc\x6b\x55\x7d\xf3\x4b\x89\x79\xde\xa3\xbe\xe7\x7a\x56\xd2\x8e\xe0\x48\xdd\x97\x6a\xdf\xf9\x63\x24\x6b\xd0\x8c\x83\xe1\x2f\x4c\x19\xdf\x5d\x54\x76\x39\x9f\x3c\xbd\xf8\xa3\x7f\x67\x64\xb1\x19\x98\x92\xdd\x73\x15\x4d\x1b\x86\xc1\xbf\xf3\xce\xb4\xb6\x25\x6b\x0c\xc7\xe8\x77\x2a\xe3\x2f\x4f\xe6\x47\xb9\xda\x47\x58\xd7\x0c\x53\x5f\x78\x00\x62\xf2\xe8\x5b\xdf\xc0\x98\xf8\xb0\xef\x50\x69\x32\xd8\x50\x47\x6d\x7c\x91\x4b\xe6\xfc\xb4\x05\x27\x1a\x37\xfd\x5a\x72\x8c\x2c\xac\xf6\xea\xdc\x4b\xf6\x87\x77\xf2\x9a\xcb\x15\x25\x4a\x2c\x23\x6a\x87\xc7\x08\xeb\x37\xbf\x67\x4d\x1c\xf4\x88\xc4\x09\x93\xc2\x64\xca\x7b\xdf\xc9\x76\xf4\x1b\x1b\xbd\x5a\xbd\xfb\x33\xef\x66\x4a\x36\x39\xc6\xb9\xec\x37\x88\x89\x18\xf6\x73\xf6\xd1\xac\x48\x15\xe2\x57\xda\xe9\x21\xda\x70\x0c\x45\x72\x1e\x8c\xf8\x19\x77\x30\x03\x19\x3c\x7d\xbb\x30\xba\x9a\xb5\x8f\xa8\x67\x56\x76\xfb\xc1\xb7\x50\x8b\xc7\xf4\x52\x98\x9d\x8b\xac\x7e\xf7\xab\x98\xe8\x16\x3c\x6d\x19\x96\xd5\xd4\xdf\xf8\x9c\xe4\x22\xf6\xa0\x91\xb9\xb1\xf5\x8c\xc9\xdb\x59\x90\x41\xbf\xf6\xb9\xcb\x7d\x22\x57\x7c\x5f\xbd\x13\x62\x42\xb6\xaf\xfa\xf8\x4a\x8a\x21\x59\x98\xfc\x0f\xb9\x86\xb7\xdb\x9a\x4e\x7b\xe6\xc1\xb0\x9c\x25\xbb\x8f\x45\x55\xd0\xdf\xc6\xf5\x98\xb4\xed\x83\x63\xf8\x0b\xac\xf1\x89\xc5\xde\xb8\xed\x7b\xbc\x5c\xa7\x2d\x81\xef\x99\x68\xbb\x46\xc9\x98\x2e\xb4\x4c\x04\xe0\x3c\x64\xf1\x85\x23\xfb\xc4\xb1\x3e\x88\x5c\x7f\xb8\x0e\xc3\xdc\x55\x0c\xbc\xa6\xd3\x38\xb6\x3c\xc6\x83\xdf\xe3\x55\x76\x0b\x90\x62\x2a\x62\x66\x2e\xda\x21\x3f\x88\xbc\x1d\x88\x62\x60\x00\xa6\xfb\xd4\x11\xcb\xc1\x11\x40\xe7\x13\x9d\xa9\xe2\x93\x93\x4e\x5d\x78\x6e\xa2\xd1\xdf\xde\x68\x59\x9f\xb4\xea\x71\x98\xe2\x9a\xce\xe2\xf1\x66\x30\x37\x0b\xa5\x16\x67\x38\x67\x6c\x7d\xab\x73\xdf\x73\xca\x6b\xda\x81\xc8\xe5\x80\xdb\x13\x63\x38\xa6\xb6\x65\x1e\x05\xb1\xc7\xe6\xd7\x66\x13\x33\x45\x9d\xd6\x0d\xd5\x30\xdf\x66\x3b\x35\x46\xe8\x35\xcb\x73\x59\x3c\x0b\xe6\x72\x69\xb6\x3b\x06\x48\x69\x5e\x70\xcc\x2e\x85\x82\xcf\xf0\xf8\xe5\x5b\xcc\x71\xdc\x55\xbc\xef\x4f\x3a\x35\x98\xcc\x8e\xe4\x9e\x0d\x39\xe6\xb2\x63\x79\xb1\xe4\x59\x86\xdb\x5e\xb3\x30\xca\x53\x28\xbe\xdb\x31\x15\x87\x4c\x25\x21\x6a\x5c\xb4\x33\x45\x20\xe6\xc1\x32\x3e\x89\x8c\xe9\x62\x68\x1a\xd1\xb8\x4a\xd3\xb3\x27\xfb\xbd\x6e\x00\x12\x72\xbb\xdf\xc9\x93\x34\x0c\xfe\x49\xe9\x10\xf3\x60\xcc\xe3\xb6\xa9\x5b\x01\xe6\xf9\x21\xdd\x25\xe4\x21\xdc\x2e\xc5\xe7\x4e\x5a\xd2\x32\xaa\xcf\x83\xc6\x83\x71\x58\x67\x0f\x88\x79\xf0\x66\x2d\xad\x1a\x5a\x90\x0c\x18\xb7\x83\x92\x98\x5c\xcb\x6c\x9f\x3b\x8c\x1b\xbf\x11\xe4\x24\xd0\xc0\x93\x7e\x62\x7c\xcd\x60\xec\x2d\x17\x27\x7c\x21\x70\xa8\xd9\x53\x1f\x62\x86\x12\xfe\xf4\x31\x91\x3f\x72\xfe\xd8\x36\x50\x6c\x5b\x47\xeb\x62\xd3\x67\x42\xc5\xb3\x47\x27\x9e\x37\x40\x24\x08\x3a\xb1\xb8\x96\xf3\x51\xc8\xf9\xbe\x23\xbf\xea\x28\x82\xd3\x38\xb9\x75\xfa\x59\xe3\x31\x63\xf3\xbd\x17\xd9\x41\x92\xa0\x93\xd3\xc3\x57\xf3\x58\x99\x18\x72\x01\xfe\x5b\x58\xb5\xda\x3d\x44\x41\x0c\x3b\xdf\xfa\x41\x88\x79\x70\xd2\x71\xeb\xf4\xa2\xe3\x49\xd0\xba\x58\x97\xc4\xe4\x56\x2e\xf9\xc4\xdf\x6b\xaa\x87\x16\x28\x74\xa3\xc0\x88\x0c\xa2\x98\xb1\xb9\x87\xcc\x85\x0f\xc3\x50\x25\x13\xbd\xee\xf3\xeb\xbe\x38\x7d\xe7\x47\x13\x43\xd8\x70\xec\x83\x00\x88\x80\x7b\xf1\xc3\x5c\x2c\xd7\x13\x8c\xe2\x34\xe9\xcd\x86\x34\xa1\x67\x03\xee\xfb\x8e\xe7\xa1\xd4\xe3\xd4\x75\xe7\x14\x21\xb6\xac\x5d\x14\x86\x13\xd4\x89\xce\xb6\x02\xe0\x00\x50\x7d\x52\x7e\x29\xa4\xfc\xf7\xdd\xcd\xf3\x6d\xcf\x6f\x60\x3c\x0b\x19\xcb\x38\x1b\x7c\xe6\xc6\xf7\x9b\x2d\xd5\xd2\x2c\x97\x1c\x43\x19\x30\xd0\x40\xfa\x00\xeb\x83\xa7\x0c\x70\x3e\x3e\x67\x9e\xdb\x60\x60\x83\xf3\x06\x7a\xcd\xc7\x4b\x76\x1f\x33\xe8\x49\x88\x21\x3d\x54\x1d\x99\x24\x64\x76\x9b\xaf\x8c\x59\x37\x6e\xef\x5d\xad\x47\x74\x0d\x1a\xfc\xb0\xe6\x75\x42\x6b\xcd\x1a\x35\x7b\xf4\xcc\xd1\xf3\xaa\xb0\xe5\x2c\x59\x7c\x34\xc7\x0a\x3f\xd7\x85\xde\xaa\x94\x2f\xd3\xfb\xda\x0d\x71\xb4\x69\x64\x17\x93\x26\x31\x58\xfe\x08\x23\x08\x1d\x93\xc7\x63\x50\x7d\xde\x60\x02\x92\xd8\x3f\x63\x92\x51\xb3\x69\x81\xc9\xfb\x40\x61\xd7\xd4\x0c\x46\x2d\x17\x5f\xa3\xa1\x3c\x3b\xe2\xab\x87\x6f\x73\xa3\x76\xb8\xc8\x49\x94\xe7\xa0\xd4\x83\x32\xd0\x86\x86\x2d\xee\xc3\x4e\xd4\x28\xd1\x62\x99\x8b\x37\x41\x6f\xb1\x48\xdc\xe7\xe4\xf5\xb9\xee\x7d\xde\x0d\x47\x1a\xd6\x30\x7b\x11\x85\x7d\x0e\x1f\x32\xe7\xc7\x27\xe2\x1f\x7a\x7d\x06\x42\xdb\xca\xda\x6b\xb6\x3c\x5e\xcd\xe1\xd9\x61\x4b\x34\x46\x6d\xd4\xa6\xed\x24\xc7\x13\x1b\x4f\x78\xa1\x70\xe2\x0e\x65\xd7\x1d\x8b\xb8\x5c\x4d\x03\x05\xf6\x51\x74\x52\x9b\x35\x50\x9b\x49\xf1\x4b\x6e\xfe\xfe\x7d\xd9\x4b\x87\xe0\x46\x5c\x11\xd0\x87\x35\xf3\x8a\x04\x9e\x60\x3d\xa2\x47\xd4\xc6\xef\x0d\xfb\xeb\x33\x26\x97\xfd\xe6\xdc\xd4\x2a\xa6\xe4\x57\xbf\xfc\x9a\x39\x40\x94\x66\x40\x94\x06\x33\x88\x36\x62\xfd\x1e\x1e\xcf\xe7\xc1\x85\xb8\x6e\x3f\xa6\xdb\x79\x6b\x64\xdb\x5d\x34\xdb\x1d\x14\xfb\x41\x19\xda\x59\x48\xd0\x68\x6b\x7c\x08\x18\x0b\x03\x42\x5a\x51\xa0\x74\x11\xc0\x34\xea\x10\xa8\x49\x94\x44\xdb\x28\x43\x30\xe2\xc3\xb2\x06\xaa\x46\x08\xf1\xac\xae\x9a\x8c\xfe\xb0\xdf\x64\xec\x48\x85\xa8\x71\xdd\xe0\x2c\x2f\x38\x8c\x54\xeb\x10\xd1\xce\x74\xd3\x8e\x74\x52\x8e\x79\x52\x1c\xa9\x36\x9a\xe3\x62\x6e\xa4\x32\x8c\x71\xbb\x4e\x2b\xb1\x92\x2b\xf9\x1a\x2e\x72\xb4\x21\xfd\x2b\xba\xab\x3d\x2d\x3c\x22\x3f\x6a\x23\x24\x6b\x22\xc4\x6b\xa2\x36\xe9\xe9\x60\x12\xc8\x23\xe5\x4b\x4c\xcf\x3a\x0f\xce\xd0\x0c\x5d\xc8\x1c\x42\xda\x13\xc2\x80\xe9\x04\xaa\x75\x0b\x50\x94\xa1\x89\x27\x8a\xe9\xfa\x67\xef\xc7\xc8\x97\xce\xa6\x0e\x80\x82\xb5\xbb\x2b\x68\x6c\xd0\x67\x42\x9f\x4e\xca\xc9\x95\xb3\x5a\x63\xbd\x72\xd9\x6f\x76\xa5\xa0\x4e\x34\x69\xd9\x26\xd6\xc3\x90\xf8\x30\x9d\x2b\x0d\xe1\xb7\xba\x4a\x15\x73\xeb\x1e\x6d\x3f\x2b\xdc\xb3\x57\xb8\xd7\xbc\xbf\x3b\xc6\x7e\x07\x0c\x38\xdf\x36\x02\x80\x97\xd8\x6f\x96\xd8\x47\x17\x12\x78\x4a\xb4\xe1\xad\x64\xb4\x05\x9a\x46\xa3\x12\x52\xde\x80\xcb\xa7\x5e\xf8\x27\x2b\xf6\xd8\xb4\x78\x23\xbe\xbb\x5e\x33\xc4\xae\xc0\xba\xde\xd1\x71\x7a\x75\xa5\x48\x94\x46\xb3\x22\x21\xaa\x39\xbe\xee\x8f\xc2\x50\xd2\x22\xa8\xcf\x3c\xb1\xa1\x41\xb5\xa1\x41\x71\x71\xdd\x61\xc6\x65\x5f\x97\x33\x45\xb4\x88\x02\x0b\x92\xa0\x7b\x48\xb7\x99\xbb\x77\x95\x0e\x49\x34\x4a\xf2\x33\x97\x3e\x19\x6b\xd5\x15\xdc\x1f\x81\xd4\x13\xa2\xd8\x6b\x66\x22\xf1\x76\x2b\x9c\x8b\x5a\xcc\x13\x34\xbf\xf7\xa4\x4e\x3d\x21\x0d\xa7\x88\xa2\xc3\x71\x64\xe6\xce\xfd\xe1\x3e\x5b\x17\xf2\x70\xdf\x6f\x06\xdb\x1f\x14\x7b\x64\x8b\x9a\x82\xdb\x18\xa9\x66\xbd\x2b\x80\xe2\x92\x89\xd1\xc1\xfb\x1b\x42\x2e\xed\xb0\xac\xe8\xad\x8e\x59\x9e\x60\x3e\x67\xcf\x4b\x4d\x05\x2b\x78\xaa\xe4\x19\x42\x6c\x55\x62\x49\x89\xab\x2d\x29\x3f\x66\x5f\x15\x0e\xe4\x56\xf7\xbd\x32\x57\xcd\xbe\xd2\x88\x76\x77\x21\x78\x49\xbc\x85\xb4\x90\xd9\x81\x8f\xf6\x63\x9f\x1d\xcf\x5d\xb5\x9b\xee\x15\xf0\x47\x48\x9f\xc7\x39\xb9\x5a\xc8\x32\xc6\x0f\x3a\x25\x13\x3d\x9a\x6e\x82\xb7\x06\xc1\xe4\x2d\x24\x46\x85\xda\x74\x01\x4b\x30\xbd\x8b\x8c\xf9\xee\x74\xb8\xe2\x05\xc1\x88\x4c\xe3\x13\x08\x3b\x72\xf0\xc6\x32\x38\x71\x02\x0e\xb7\xfb\x13\xd5\xa0\x62\xc7\x11\x94\x40\xa8\x7b\x1f\x8b\x1e\xec\x04\x9e\x46\xa6\xe7\x8d\x67\x66\x38\xba\x78\xa2\x45\xd0\xe9\xec\x3c\x7b\xe3\x39\x11\x8c\x04\x8a\x10\x7a\x56\xcf\xbe\x75\x86\xb3\x27\xd7\xa7\xd2\x93\x12\x94\xc0\x0d\x0d\xa2\x4e\xef\x2b\x1b\x0f\xa2\x44\x27\x7f\xab\x73\x65\xae\xc2\x1a\x4d\xcc\xd3\x88\xc9\xb5\x20\xc3\xfa\x82\xd6\x6f\xdf\x35\xc0\xc5\xb5\xa5\xa0\x4a\x73\xd3\xf3\x76\x1a\x9e\x96\xb8\x9d\x33\x10\x87\x3f\x22\x33\x22\x73\xf6\x63\x38\xa8\xbc\xf1\x1a\xdf\x6b\x07\x6b\xbc\xc9\xa3\xf9\x72\xa6\x99\xcc\xb6\xf3\x02\x84\xf1\xd5\xe4\xdb\xac\xb8\x6d\xad\x13\xcf\xa3\x47\xca\x75\x99\x6e\x9f\xb5\xb5\xf4\xc5\x80\xbc\xa3\xa2\x83\x3f\xdd\x8d\x22\x24\xee\x66\x8c\x5e\x14\xa8\xcd\x81\xa8\xb5\x54\x4a\x48\xda\xda\xb2\xde\x50\x26\xa5\x5b\x12\x40\xe9\x7c\x89\xec\x99\xa4\xe5\xc9\x83\xd4\xd7\xc9\x9b\xa8\xcd\x38\xcb\x8d\x08\x64\x85\x64\xc2\xe9\x92\x1a\xe8\xf5\x18\xa7\xe9\x4a\x06\xa1\x1a\x8c\x83\x32\x24\xd3\x9d\x5e\x56\x5f\x6d\xba\x1b\x54\x06\xdc\xf7\xfe\x5a\xac\x0e\x4d\x40\x69\x80\x4c\x54\xb4\xb6\xf2\x09\x06\xe8\x78\x52\xbc\xc8\x9d\xe8\xa0\xa7\xdd\x3d\xf4\x85\x35\x81\xf3\x19\xc8\x74\x10\xd4\xfb\xf4\x76\xef\x09\x0d\x92\x8e\xaa\x89\xda\x68\x0e\x54\x0a\x50\x0f\x20\xf0\x9a\x27\x72\x73\x84\x1d\xb8\xdd\xad\x76\x19\xe2\x3b\x94\xda\xab\x4b\xc0\x7e\x87\x82\x45\x91\xfa\x2a\x7e\x37\x1a\x46\xfc\xa8\x65\x0c\x03\x65\x81\xdf\x75\xcd\xb2\xef\x73\x0d\x3e\xb9\x09\x02\x1e\xa3\x47\xe0\xe1\x8c\x0e\x9e\xa2\x53\x11\x78\xd6\xb6\xac\x05\x41\x77\x6e\xcf\xb3\xbe\xaa\xbb\x2b\xa1\xe5\x23\x8a\xe3\x75\xbc\xd2\x4e\xea\x0a\x56\x60\xd7\x25\x95\x2c\x70\xa9\x8b\xce\x40\xe1\xed\x91\x61\x62\xbe\x38\xe7\x79\xb8\x17\x1c\xd1\x36\x5d\xb8\x5c\xd2\x6f\xb5\xd9\xf4\x37\x5d\x68\xda\xbc\xc8\x61\xc2\xde\x35\xe4\xe6\x7b\x42\x9e\x2d\xba\x76\x45\xb4\x3a\x1c\xea\x59\x41\x39\x12\x4d\x73\xbd\x3b\xab\x83\x16\x90\x0e\x82\x1e\x28\xd3\x0c\x50\xa6\x39\x57\xde\x9a\x7d\x35\x7e\x4a\x78\xa6\xb9\xd3\x9c\x30\x98\xce\xaf\x86\x0f\xa0\x4b\xe2\xaa\x3e\x21\xb2\xa1\x71\x87\x30\x8c\x6a\xe5\x23\x3d\x7d\xb3\x6a\x3e\x67\x0d\x51\x84\xe9\x22\x00\xf1\x29\x07\x2f\x67\x64\x9d\x6e\x65\xa0\xa4\xdc\xb8\x48\x74\x65\xef\x1a\xdc\xbc\x72\xfb\x96\x2c\x06\xcc\x92\x78\x7d\x2c\xdc\xc5\x8a\x27\x3f\xf2\xa2\xdc\x83\x09\x3a\xbe\x56\x58\xe1\xdc\xe3\xcd\x85\x35\x9b\x8a\x00\x30\x9f\x13\x61\xbf\xa5\xf3\xd9\xba\x47\x01\xa6\x47\xd7\x8f\xfa\xbd\xb5\xdb\x8b\x6a\x7c\xd4\x70\x89\x2b\x27\x21\x99\x26\x94\xa4\x5b\xaa\x93\x6d\x53\x98\x6a\xac\x7c\xa2\xe2\xe9\x38\xe1\x1c\xa8\xbe\xa9\x92\xf6\x09\xd1\x5b\x0c\x6c\xab\xa1\x95\xa9\xc0\xfa\x95\xc0\x70\xe5\x74\x24\x24\x08\x37\x53\x8d\xe9\xc2\xb0\x4f\xd9\xbe\xd2\xe4\x26\xde\x2b\x88\x28\x34\xe7\x4e\x99\x55\x18\xb4\xc3\x48\x8c\x69\x51\xe0\x8e\x61\xb0\xdc\xf1\xe9\x3f\x9c\x12\xb7\x51\x87\xd3\x3e\x08\xe4\x28\xfb\xb4\x6f\x7c\x6c\x3f\x56\x25\xa1\xdb\x43\xb7\xfb\xb1\x6e\xdb\x58\x0b\x41\x91\x02\x88\x1d\xc3\x52\x5d\x44\x63\xd2\x08\x2c\x3e\x95\xaf\xd6\x25\x5a\xb6\xad\xeb\xaa\x67\x39\xc4\x37\xab\x78\xf5\x88\xdb\x06\x0a\xad\x07\xe7\x68\xa9\x06\x9a\x72\x0c\x04\x71\xbb\x88\x80\x6a\x1a\x7d\xd8\x7c\xeb\x9b\x4b\x51\x01\x03\x80\xca\xbb\x0e\x81\x87\xc4\xf2\x97\xf9\xd5\x6e\x69\xcb\xb6\xf9\x01\x00\x8a\xdd\xed\xe1\x02\xb7\xbb\x44\xae\x88\x21\xb4\x16\x92\x76\x93\xc5\xfa\xb9\xd7\x0d\xcd\x8c\x24\xf7\x4b\x78\x9f\x0a\x5e\xee\x72\x18\xf2\x8a\x20\x2f\x8a\x59\x30\x78\x6d\x7c\xf9\xfc\x19\x2d\x6b\xd4\x63\x66\x39\x7f\xcb\x41\x3c\x87\x14\x06\x82\x76\xb9\x21\x5a\xf9\x32\x0e\x6a\xcd\x06\x45\x5a\x34\xcb\xc5\x62\x4c\x07\xbf\x68\xf9\x04\x16\x59\x48\xa5\x86\xc8\x9f\x3d\xe5\x56\x90\x79\x94\xd7\x12\x24\x11\x1f\xa1\x16\xe5\x58\x1b\x21\xc1\x60\xed\x4e\x02\xd0\xbc\x6e\xaf\x3e\xbe\x6e\x92\x10\x9e\xb6\x35\x50\xf7\x5e\xb2\xf4\x8b\x7b\xb9\x7d\xfa\xe8\x81\xb7\x67\x16\x03\x14\x30\x0c\xa6\xfc\x6a\xaa\x6a\x24\xd1\x0e\x38\x9b\x87\x7b\x44\x45\x3a\xb0\x4d\x44\x10\x74\x38\x1c\x89\xb6\xeb\x95\x65\xad\x9f\xdb\xd4\xb5\x70\xe2\xd8\xa1\x33\x15\x8c\x68\x47\x92\xbe\x75\x46\xff\x8a\xe7\x2a\x9d\x9a\x45\x98\x96\x10\xa3\x01\xa9\x9e\xcf\xc7\xb3\xe1\x6c\xee\xf2\x2d\xb5\x4b\x83\x0a\x80\x20\x9d\x83\x40\x8c\xaa\xb8\xa5\x74\x83\xe6\xb8\x8d\xb8\x6d\xe8\x10\x9b\x8f\x1b\x3f\x03\x72\xe0\x10\xd9\x81\xc7\x68\xb1\xb4\x89\x0e\x99\xcd\x63\x6c\xfc\x89\xe6\xb3\x7c\xf3\xc9\xe5\x3a\x79\x89\xc3\x27\xe0\x48\xea\x03\x41\xc5\x5e\x20\xd7\x61\xbb\x73\x8f\x41\xbf\x4f\x04\x87\x83\xa4\xb2\x13\x6b\xa9\x71\x04\x11\x5d\xbf\xcd\xc2\x97\x9b\x03\xd1\x60\xba\x81\x00\x0e\xde\x85\x7e\xc6\x64\x1b\x8e\x7d\x51\x4c\xa6\xa4\xe8\x33\x7e\x68\xad\x1d\x7b\xd5\x90\x8d\xcc\x4e\xc1\x3c\x57\xef\x52\x3d\xa2\x3c\xa7\x68\x04\x54\x4f\xaa\xad\x05\xe3\xfa\x44\x10\x6c\xde\x36\x5a\xf5\xe1\x1a\xd7\x6d\xe7\x81\x23\x21\x4d\x53\x95\x46\xe9\xbd\x6a\x9a\xce\xc7\x5e\x80\xe5\x05\x11\x24\xb1\xec\xba\x4d\x96\x7b\x55\x20\xbf\x84\xfc\x33\xda\xfc\x09\x9f\x95\xe2\x56\xcf\x24\x01\x6c\x6d\x5e\x14\xb4\x30\x2e\x99\xa4\xb4\xb1\xdf\x0d\x27\xfc\x44\x49\x24\x1d\x6d\xe9\xb4\x23\x15\x11\xcf\x0a\xa3\x35\xf8\x8e\x0d\x36\x34\x76\x6a\xf3\xf2\x9d\x96\x1d\x2f\xdc\x67\xac\x31\x26\x5f\x41\xc0\xbc\x81\x8c\xe9\x5e\x95\x3a\x24\x74\x74\x23\x99\xc2\xea\x06\x22\x3d\x54\x69\xdd\x11\xe0\xc5\x6b\xb0\xcb\xc3\x05\x81\x4d\x1f\x94\xb1\xc7\xab\x0d\x94\x85\x91\x0e\x6c\xee\xe1\x42\xda\x3d\xa6\xa9\x65\x98\x9c\x31\xed\x2d\x68\x59\x5e\x7d\x39\x56\xba\x6a\xcb\xe6\x17\x66\xfb\x46\x87\x3f\x5e\xee\x5d\x80\x1b\x69\x40\xb5\x2d\x5f\xa4\x5d\x49\x3b\x99\x3f\x01\xc8\xb0\xc3\xb6\xea\x1a\xeb\xc1\x59\x72\x42\x9e\xb8\xf7\x40\x97\xab\xd7\x57\x25\xbe\xac\xa8\x5a\x21\xa7\x3f\x11\xbd\x72\x00\xe0\x46\x74\x1d\xda\x20\x69\x27\x2b\xd5\x55\xaa\xa5\x5a\x01\x28\xb5\x05\xeb\x1e\xd1\x22\x0f\x33\xe9\xdb\x37\x7f\x67\x94\x99\xde\x16\x03\x04\x9b\xe9\x69\xe1\xb6\x00\x57\x66\x81\xd3\x34\x4d\xdc\x61\x60\x8d\x84\xfd\x92\x1a\x9d\xec\x76\x1a\x35\x72\x97\x21\x9e\xfc\x24\x09\x82\xdc\x6b\x86\xc4\xe4\x2a\x21\x9c\xb2\x04\xcc\x8b\x31\xea\x63\xa1\xba\x84\x93\x7c\xde\xee\x18\xad\xa4\x39\x76\xb0\x07\xcb\xa3\xda\x03\xa2\x00\xdb\x7a\xef\x7b\x19\x66\x20\xc0\xde\x0f\x5e\x4e\x6d\x29\xd5\x83\x88\x54\x81\xa6\x0f\xfa\x1e\x67\x7b\x5d\xdf\x3a\xfd\x9c\x2b\xa9\x20\xb9\xca\x8a\x11\x1a\x6c\xf8\xe8\xea\x5c\xa4\x27\x05\x7a\x42\x15\x9a\xdc\x7c\x09\x1d\x26\x14\x9a\xd8\xa5\xc1\x04\xbe\x87\x80\xa1\xc0\xe4\x6d\xbf\xd9\x17\x04\x80\xd6\xe3\x46\x77\x41\xc5\xa7\x00\x53\x4a\xef\x52\x71\x0f\x08\x0e\x3c\x01\x1e\xe2\x17\xad\x33\x1f\xbc\x8c\xde\x81\x2b\x3e\x37\x96\xa7\xe5\xde\x96\x94\xf4\xb6\xc0\xfa\x4c\x0a\xf4\x74\xed\x47\xe5\x2e\x8a\xe8\x0c\x29\xa7\xee\x78\x65\x25\x4c\x74\x0a\x82\x3a\x8f\x60\x65\x70\x5a\xf6\xbd\x45\x8c\x8b\x23\x5a\x48\xe6\x30\x23\x77\x05\x40\xe2\x5d\x1e\x5e\xb8\x4b\x84\x4e\x76\x0d\x39\x3d\x6b\x6f\x52\xc1\x0a\x18\x96\x6d\x1d\x2e\xd1\xc5\xd3\x2a\x33\x15\x79\xfe\x84\x42\xb1\xc2\x75\x05\x3d\x85\x88\x97\x69\x62\x13\xc4\xc7\x2e\x39\x71\xe8\x33\x1a\x3b\x69\x45\x51\xe4\x2e\x2c\xe4\x43\x57\x36\x8f\xda\xa6\x41\x7d\x78\xf5\xf2\xe7\x1b\x1d\xe3\xa3\xe7\xbc\x30\x51\x30\x82\xe8\xe0\x65\x79\xe6\x8c\x59\xdd\xe4\x47\x9e\x69\x9a\x06\xef\xa0\xe8\xdc\xea\x79\x39\xd2\xee\x92\x82\x80\x5b\x5d\x2a\x49\xf0\x4f\x01\xa6\x36\xa3\x73\xee\x27\x15\x27\x67\xe2\x70\xed\x75\x80\xf3\x61\xf1\x01\x3a\x5e\x5b\x7b\xc7\x06\x2f\x54\xe5\x18\xcd\x56\xbc\xb6\x2a\xfe\x86\x22\x04\xf4\x2e\x0f\x57\xd6\x8a\xb1\x89\xeb\x36\x10\x9e\x4f\xdd\x39\x24\xd1\x08\x64\x9c\xae\x26\xb1\xcb\xb9\xd5\x6d\x64\x2f\xef\xd8\x7e\x15\x2b\x88\x18\x8e\xf0\x0c\xae\x86\x01\x0e\xf2\x83\x6a\x2e\xca\xd3\xee\xdc\xb1\x59\x37\x00\xf5\x23\x77\x0d\x14\x81\x94\xdb\x44\x83\x4f\x2b\x8b\x5b\xf6\x72\x51\xc0\xcf\x18\xe2\xaa\x3e\x17\x79\x12\x3f\x6d\xe3\x72\x24\xcb\x81\x6d\x9d\xda\x70\x63\x78\x77\x15\xbb\x1d\xee\xe4\x01\x49\x46\x85\x39\x3b\x93\x45\xd1\x6d\x18\x2a\xd1\x00\x05\x29\x13\x4d\x68\x32\x4b\xe9\x35\xb3\x2c\xcd\xb2\x8d\x71\xd9\x7b\xe4\x61\x8b\x3e\x40\x11\x01\x83\xbd\x68\xc8\xc5\x67\xfc\xa4\x9b\x40\x6e\x0a\x01\xd0\xaf\x59\xb2\xb1\xe1\x3b\x9a\xf5\xaf\xfa\xba\x46\x4e\xcf\xd9\x48\xd4\xe2\xfd\xcd\x30\x14\xde\x8b\xdb\xbb\xb0\x38\x52\x7c\x8f\x40\x6a\xe7\xf4\xd7\x24\x08\x49\x3d\xd7\x7b\x92\x94\x1e\x67\xf9\x1a\xc1\x19\xdb\xb5\x58\x4f\x19\x97\x8c\xc6\xad\x40\xdd\x19\xc4\x91\x5a\xf9\xc8\x50\x72\x99\xb4\x8c\x63\xfa\x47\xf8\x31\x93\xea\x16\x42\x2d\xd6\xb0\xbb\xb4\xef\x27\x02\x85\x84\x50\xa2\x9d\x4c\x50\xda\xe5\xa6\x82\x05\x90\x03\xb4\x37\xc2\x3e\x84\xad\x7d\xc4\x4b\xd1\x4b\xae\xa7\xd9\x3d\xa9\xc9\x2c\xb1\x78\x0a\x88\x57\x5e\xe7\x40\xf5\x6c\x38\xf4\x7e\x6a\x2d\x61\x23\xf0\xe2\x30\x39\x47\x09\xeb\x4d\x78\xaf\x17\x0c\xce\x9b\xbb\x9e\x74\xe0\xf3\x22\x34\x31\x5c\x3f\x43\x03\x5b\xfc\x33\x3c\x05\x4c\x98\xd0\xe9\xa8\x11\x84\xa0\x2b\x07\x4f\xe5\x10\xbe\x6e\x05\x0a\x00\xb8\xe2\x3c\x90\x46\x28\x35\x79\x5c\x8a\xa2\xc8\x10\x5a\xa9\x67\xe9\x04\x6e\x71\xa2\x9f\x50\xce\xd3\x3a\x2b\x7d\xd6\x23\xce\x84\x53\x22\x5b\x91\xa8\x8d\x2a\x73\x96\xb8\x1b\x0d\x46\xf8\xe2\xc3\xee\x98\x55\x94\xb8\x8c\x9e\xda\x8c\x7b\xb2\x62\x21\x10\x48\x08\x49\x4e\xcf\xbb\x76\xe6\xa2\x51\x9a\xd0\xe6\x91\x20\x25\x19\x49\x88\x28\xae\xc1\x2f\x40\x26\x3a\x10\xa4\x5f\xee\x27\xe3\x73\xfc\x77\x3f\x06\xa6\x18\x0a\xae\xfb\x98\x08\xdc\xb3\xd4\xee\x09\xf2\xcc\x51\x94\x40\x4d\x0a\xe3\x2f\x61\xa2\x1d\xcf\x6d\x3c\xa0\x8a\xc7\x53\x24\x4c\x60\x18\xce\xdd\x86\xd6\x45\x89\x65\x9c\x0b\x68\x3c\xcd\x27\x38\xd2\xf9\x45\x81\x3b\x1e\x42\x7d\xed\x1e\x22\xc6\x8d\x0d\x25\xf9\xdb\x8e\xd3\xe4\x62\x5b\xe6\x3a\xb2\xe2\x73\xda\xd8\x0e\xab\x22\x23\xd1\x72\xdd\x5d\xa0\x04\x76\xf0\xe4\x65\xcb\x37\xfd\x2e\xed\x90\xbf\x09\xbb\x32\x4f\xea\x34\x81\xab\xbe\xf5\xa6\x26\x28\xf6\x03\x00\x68\x1c\xc1\x04\xee\xd5\x13\x3a\x0b\x4a\x22\x97\xfa\x72\xf9\xbe\x9b\xbd\xdd\x1b\x00\x5b\x1d\x89\x50\x6a\x8e\xf5\x0f\x9a\xa2\xc8\xcb\x7e\x31\x5b\x69\xa8\xfa\x25\xeb\x45\x72\xda\x82\x58\x3a\x1e\x82\x05\xf8\x8f\x41\xa6\x76\x00\x41\xa1\x30\x2d\x5d\xd8\x0a\xd7\xab\x48\xf3\x66\xef\xa7\xba\xc0\xd9\xd0\x32\x29\xbb\xce\xf6\x97\xcb\xa7\xce\x4b\x0a\x6e\x73\xa0\x30\x43\xd3\x55\x7d\x75\x69\xb3\x40\xdc\x99\x3a\xac\x81\x9b\x73\xd9\xb5\x1d\x3d\x4f\x78\xd4\xcc\x42\x01\xf1\x56\xe2\x6e\x37\x9e\xa6\x41\xd1\x75\x65\x96\x48\x06\x38\x06\x0a\x4d\x81\x95\x67\x29\x20\x24\x8a\x87\x8f\x3a\x6c\x98\x94\xfb\x36\xce\xf1\x12\x96\xf2\x6c\xb6\x5b\x94\x7a\xcd\x80\x60\x25\xaf\x7c\xbe\x46\x95\xcf\x79\x2d\xbe\x9c\x10\x06\xa1\x50\x5f\xa0\x2b\xba\x25\x5e\xa7\xa5\xa2\x08\x49\x76\x3d\x7a\xc4\x4a\x2c\x19\xe5\x27\xa7\xdb\x7b\x37\x5e\x3a\xde\x16\xa2\xfd\xaf\xf0\x62\x68\x7a\x97\xec\x0b\xba\x5c\x63\xef\x7a\xc7\xfa\x03\xed\x0c\x54\x9b\xfc\x58\xc4\xae\x3c\x92\x0f\x5e\x53\x18\xdd\x49\xdc\x8c\x86\x80\x93\x95\x88\xfb\x59\x66\x00\x96\xbf\xf2\xcf\x80\x07\x8b\x22\xeb\x35\x76\x6c\xb8\xee\xde\x41\xd7\x6b\x07\x51\xcd\x45\x62\xee\xcf\x6f\xfb\x11\x46\xa5\xc9\x1c\xa0\x81\x3b\x95\xdf\x61\xbd\x4a\x48\xf2\x74\x62\xde\x3c\x38\x48\xdc\xa6\xfb\xb2\xe2\xc0\x75\x0a\x7d\xa1\x22\xfc\x66\x20\x10\x00\xeb\xee\xd8\x65\x8b\x6c\xb7\x61\x67\x54\xd9\xa2\xe9\xe6\xc4\x09\x59\x70\x56\x4f\x3d\xb9\xb2\xe4\x3f\xe6\x69\x9e\xd9\xc8\x81\xcc\x87\x31\x6e\x71\x37\x2e\x72\x5f\xc1\x43\x5f\x60\xd3\x9d\x53\xa4\xfa\x76\xd7\x76\x02\xde\xa1\x0a\xed\x9d\x67\xaa\x41\x74\x86\xd0\x5e\x2a\xcc\x3b\xae\xda\xe3\x7c\x97\x36\x15\xce\x07\xc8\x05\x52\xe3\xea\x9f\x48\x54\x0a\x2c\xdf\x2f\xea\x7b\xfd\x64\x00\xcd\x67\x4b\x80\xea\xb5\xc0\xb2\xdd\x55\xd5\xb4\x67\xb0\xcc\x99\xa5\x0f\xe4\xdb\x4e\x10\x1d\xc8\x7c\x5b\xd0\xec\x99\x8a\x6c\x1d\xce\x72\x3d\x67\x75\x3b\x0c\xcf\x75\x40\x8d\xab\x12\xb4\xb4\x3e\x42\x48\xa0\x00\x46\xcd\x73\xe1\xdb\xce\xea\xba\x73\xc5\x45\x26\xac\x6e\x88\xf3\x6e\x40\xb2\x29\x91\x23\x66\x52\xba\xca\xf4\x05\xc1\x5e\x03\x51\xac\x71\xa5\x35\xc1\x20\x49\xb6\x6b\xe3\x14\xe2\x4e\xb9\x02\x11\xef\x80\x36\x24\x08\xb8\xc5\x3a\xd8\x93\x00\x95\x88\x6c\x99\x5e\xf7\x15\xf6\x95\xa7\xe3\x8d\x9b\x43\x44\xfb\xae\x2f\xd0\xda\x40\xf1\x1d\xca\x1b\x08\xcb\xc5\xea\x16\xc7\x61\xcb\x56\x6f\x7b\x32\xd9\x7e\x8d\x1d\x10\x6c\x38\x10\xad\x9e\x14\xf8\xe2\x1e\x10\xc7\xda\x1d\x5b\x04\x7d\x8d\x65\x28\x88\x8f\x40\x37\xc4\xae\xb7\x9a\x6e\xae\x6f\xd3\x82\x43\x14\x42\x9d\xf6\xb5\xfc\xcc\x81\xc6\xd1\xcf\xc4\x36\x61\xb3\xa7\xd6\xe5\xb1\x78\xe3\x8a\x24\x09\xac\x8e\x4f\x24\xef\xd0\x67\x63\x27\x93\x59\xe8\x42\x5a\x14\x08\x9e\x02\x59\xfc\x32\x61\x8e\x0e\x6d\xe1\x0f\x5a\xd8\xca\x75\xf1\x10\x58\xdb\x6f\xe4\xdc\xf5\x84\xd7\xcb\xe8\x6a\x3d\x20\xd1\x19\x86\x6a\x46\x97\x29\xca\x45\xf6\x91\xf1\xa9\xb0\x2d\x84\xca\x95\xa3\xa7\x0a\x65\xe1\x08\x45\x00\xd1\x9a\x9d\xe9\xc1\xb6\xa2\x6a\x77\xad\xfa\x58\xbf\x97\x44\x70\x9c\xc1\xd4\x40\x83\xe2\x0c\x18\x58\xc0\x38\x9e\xbb\x5e\x64\x05\xcd\x9e\x06\xa2\x89\xb2\x4d\x1d\xb6\xf2\xba\xf9\xc1\x69\x1f\x00\x38\xce\xf7\x7e\x20\xd6\x11\x26\xf0\xe8\x4c\x9a\x2b\x77\x2d\xc7\x89\xce\x54\xe1\x63\x76\x2d\x36\x85\x44\x41\xd0\x18\x92\x10\xb1\xc2\x28\x7f\xcd\xac\xe9\xf5\x99\x37\x87\x35\xe4\xd7\xba\xdf\x36\x32\xf5\x11\x80\x72\x3d\xcd\xc1\x40\xdd\x41\x55\x2f\x4e\xbc\x06\xcf\x73\x7f\x3c\x26\x6f\x82\x81\xe4\x81\x97\x11\xbb\xd3\x3d\xa9\x77\x24\xb9\x9e\xc0\x05\xd9\xb2\x38\x57\xef\xab\x0d\x83\x94\xd9\xf1\x54\x34\xf3\x0f\xfc\x6a\x75\x16\x55\x54\x26\x56\xa0\x64\x36\x93\x3a\xcf\xf7\x14\x9d\x1b\xb5\x54\x85\x73\xe7\x0c\xc7\x3c\x29\x2f\x9f\x37\xee\x35\x82\x80\xe0\x4e\xf8\x59\xec\xd7\xd4\x78\xeb\x9c\xe6\xa8\x7c\x34\xd1\xba\x5b\xbb\x43\x9c\xf0\xed\xbb\x84\x1b\x5b\xe4\xdd\x40\x16\xa0\x5f\x80\x44\x20\x41\xd7\xe8\x44\xd9\x14\x04\xcf\x36\x73\xaa\xec\xa1\x26\x5e\x3c\x15\x1b\x4a\x76\xdb\x34\x25\x79\xdc\xe2\x13\x45\x15\x23\x9e\x07\x8f\x44\x6b\xcf\x70\xbb\x7a\xaa\xdf\x0d\xb1\xc9\x67\xe3\xbe\x2f\x9b\xb7\x14\x6e\xb5\xd8\x28\x72\xc0\x89\x36\xc2\xe9\x6c\xab\xd8\x34\xae\xc3\xec\x77\xe8\xd4\xc0\x64\xb6\x02\x79\x27\x9f\x10\x10\xae\x13\x9c\x0f\x42\xfd\xff\x51\x75\x1d\x6b\xae\x22\xcd\xf2\x81\x58\x14\x1e\x6a\x29\x09\x09\x6f\x84\x87\x1d\xde\x7b\xcf\xd3\xdf\xaf\xcf\x3f\xa7\x67\xee\xba\xf5\xa9\x1b\xaa\x32\x33\x22\x33\x32\xfa\x0c\xd7\x5d\xef\xf9\x0e\xa7\x69\xd9\x96\xbf\x3d\x22\xcd\xab\x3b\x02\xb8\x6b\xb9\x3e\x62\x3a\x12\x24\x3a\x77\x00\x70\xae\x19\xf2\x6e\x2e\x50\x90\xd2\x77\x20\xfa\xeb\xb2\xf2\x7f\xf4\xc5\xdc\x43\x80\x4c\xb4\x79\x2b\x19\xbe\x2d\x73\xc8\x10\xc0\x40\xfa\x1d\x70\xd7\x07\xf7\x1e\xc7\x47\x4a\x1c\x82\xe8\xfd\xfe\xbb\xf8\x4a\x79\x24\x82\x5e\xef\x0c\xc8\x57\x1a\xdb\xf9\x13\x5f\xe7\x08\x83\x34\x9b\xf8\x34\x52\x4f\x9c\x68\x89\xbd\x84\x66\xad\x53\xb8\xd5\x40\xc8\xd7\xc2\x02\x0f\xb3\x1a\xeb\x73\x0d\x95\x78\x19\xb0\x5e\xd7\xed\x05\x39\x69\x9b\x95\xf7\xa9\xda\xb2\x1b\x6d\x38\x11\xa3\xab\x5c\x4f\xd3\x18\xb9\xd8\xb9\x09\x07\x19\xac\xcc\x9e\x32\x08\xd8\xa9\x9a\x61\x18\x06\x1d\x96\x1d\xee\x31\x2e\x55\x4e\x2f\x5d\xdf\xe6\xa9\x57\xe9\x37\x02\xfe\x7a\x4d\x67\x99\xde\x35\xeb\x15\x28\x5f\x38\xf9\xfb\x98\xff\x8c\x3d\xfe\x77\x26\x8f\xfd\x07\x03\xa5\x08\x13\x0d\x6c\xfd\xfd\x98\x7e\x3b\x61\xa9\xfb\xec\x53\x06\x85\x8a\x1d\x33\x3d\x86\xed\x37\x5b\xf4\x46\x7f\xaf\xed\xa2\x8d\x08\xc8\x3b\xb8\x33\xa4\x00\x11\x22\xdf\x89\x09\xf3\xa6\x63\x90\x5f\x85\xb2\x2d\x7c\xb4\xba\xdd\x26\xab\xb6\x83\x6a\x43\xfc\x82\xd4\x28\x8f\xfe\x4c\x0e\x19\x61\x7e\x7d\x94\x5f\x5f\x24\xbb\xcb\x72\x45\xee\x71\x1c\x53\x48\xd2\x2b\xf7\x97\xd0\xef\x1b\x23\x32\x86\xb0\x50\x5f\x99\x6f\x04\xef\x56\x2c\x44\x76\x35\xec\x35\x3e\x6c\xe2\xc7\x6a\x15\xd0\xc8\xb0\x97\xc5\xee\x0d\x25\xd9\xec\xf7\x60\x75\x2e\xc2\x92\xc5\xbd\x6a\x34\xe7\xf8\x12\x7d\xfe\xce\x93\x58\x71\x85\xc8\x01\x50\x98\xfb\x8a\x81\x53\xe4\xa6\xd3\x25\xf3\x05\x03\xcc\xc7\x6f\x24\x48\x5b\xbc\x91\x69\x0a\xef\x0c\x83\xb9\x4f\x8d\x90\x23\xaa\xa4\x97\x50\x36\x31\x80\xd0\x75\x38\x18\x52\x65\xaa\x86\x49\x79\x5c\x33\x62\x35\xa3\x12\xe1\xeb\xb6\xba\xdd\xfe\x55\x48\xa3\xfd\xdf\x3e\xc6\x31\x7c\x9e\x11\x4b\x74\xcf\x60\x21\xe2\xf5\x18\x1c\xc5\xa6\x50\x56\xb7\x51\xc8\x04\x6c\xf9\xc3\x25\x88\x95\xbe\x29\x68\x49\xcd\xd5\x8d\x53\xd6\x8f\xf4\x57\x70\x04\xc9\x95\xdb\xf0\x72\x3c\x61\xef\x66\xe3\xe4\x36\x88\x6d\x03\xe4\x03\x3e\x78\xe4\x72\xf1\x2c\xff\xed\xd7\x20\x07\x8e\xe0\xfb\x3e\x53\x5c\x53\xd9\x54\xc9\x30\x25\xb2\x6d\x72\x35\x8c\xaf\x11\x7a\x34\x6b\x70\x18\x0f\xa3\xd8\x96\x23\x5b\x42\x19\x3a\x0a\xca\x11\x01\x96\x44\x5e\x29\xce\xa4\x43\x28\x9c\x48\xde\x53\x6c\xfe\x55\x31\xc9\x76\xba\x71\x9a\x48\x89\x29\xdc\x42\xd5\x2b\xc2\x20\x9e\x80\x7d\xe2\x58\x7e\xb8\x23\x9d\x75\xb1\xd6\x21\xdb\x1f\xe5\x5f\x39\x5f\xe8\xf9\xe4\xbe\xa8\xc6\xa4\x1b\xbe\xcd\xf4\x96\x6b\x04\x44\xfc\xcf\x99\x0c\x82\xcd\x87\x9c\xac\xd5\x22\x43\xcf\x17\xe6\xab\xdc\x40\x6f\xbd\xd2\x56\xd3\x83\x25\xbf\xe9\xf3\x57\x5b\xa0\x3f\x99\x93\xa4\xf3\x4d\xa8\xcf\x66\xbf\xeb\x1f\xe0\xfa\xbf\x1a\xec\x46\x82\x37\x68\xca\xd5\x8c\x57\xb2\x1b\x3a\x71\x0f\x8b\xc1\x22\x0d\xf3\xd4\xf0\x94\xa4\x90\x37\xe3\xd2\xa9\xf1\x91\x2c\xb7\x5b\xee\xa6\xc0\x4b\xf1\x07\xaa\x9d\x6a\x2a\xe4\xc6\xc9\xbd\x1d\x02\xd4\xe7\x80\x96\x99\x61\xde\x21\x6f\x37\xb6\x9d\xe7\x84\x36\x5b\xf8\x4a\xa4\x4c\x0c\x4d\xa4\x1f\x99\x94\xb9\x71\x64\x2e\xdb\x5c\x17\x5e\x65\x20\x5c\x2f\xc7\xe4\xb3\x7e\x74\xd3\xd8\x67\x7b\x14\xd3\xf5\xf3\x1c\xa3\xa8\x93\x0a\xbf\xa5\x75\x54\x4c\xfe\xe2\xb3\x43\x4d\x1a\xcb\x9f\xc7\xd6\x4d\xfb\xb0\x8b\x1b\x01\xcc\x38\x8e\x53\x92\xed\x34\xd2\x1d\xc7\x3d\xb5\xc5\x1d\x85\x24\x39\x2e\x80\xc7\x4c\xab\x2a\x57\xd0\xc8\xe2\xe9\xc2\x85\x78\xd3\x24\x17\x62\xa5\x6b\x9e\x5a\x2b\xd6\x44\x4f\xb3\x61\x92\xa3\xfc\x4a\x20\xd1\xdd\x59\xb6\x66\xa9\x98\x57\x4f\xe7\x53\x06\xdd\x27\x9a\x89\xf8\x79\x7e\x11\x83\x2a\x57\x26\xf3\x77\x44\x23\x77\x97\xe6\xcf\x25\x82\xc8\x9d\x35\x94\xe7\x76\xa1\xe7\x4a\x3e\x15\x73\x8f\x88\xc3\x11\x62\xa4\xf5\xcb\xc9\xf1\x3a\x6e\x79\xc2\x1c\x06\x8f\x7d\x5c\x4a\xf1\x3b\x67\x12\xae\x65\xca\xdb\x57\x1a\xa0\xaf\x12\x1b\x1a\xe9\xca\xd3\xad\x73\x15\xd9\x40\x5e\x39\x4a\xe9\x75\xdd\x67\xb9\x7e\xa7\x01\x41\xa6\x66\x28\x37\x0b\x9e\xeb\x42\x8d\x5d\xa1\xce\x57\x66\x26\xe6\x86\xf9\xce\x84\x8d\x42\xf5\x7a\x63\xb6\x41\xba\xce\x0e\x84\x4b\xd5\x60\x9a\xed\x36\x1f\xe6\x8c\x66\x97\x22\x80\xef\xf5\x36\x45\x46\xbc\xd9\x9f\x34\xfa\xc0\x3b\x9c\xd8\x71\x62\x15\xca\x26\xf3\x14\x97\xdd\xc0\xac\x4d\x28\x26\xd9\x13\x3d\xce\x04\x4f\x13\xb7\xae\x45\xb3\x16\xc9\xec\xac\x88\xd7\xbb\xce\x9e\xcf\x4f\x91\x9e\xd2\x3f\x7a\x06\xee\x98\xa3\x79\x8a\x1a\x9f\x27\x7c\x8e\xe3\xc2\x13\xc9\x60\xee\xcd\x71\x9e\x64\xd3\xa2\x3e\x30\x9c\xcd\x0c\xfe\xb4\x89\xfb\x1a\xcd\x34\xff\x28\x6c\x1f\x61\xd1\x8e\x6e\x3b\x57\xe0\xc8\xf6\x93\xf8\xae\x66\x54\xbe\xc4\xfd\x34\xd1\x90\xcf\x77\x56\x00\xa7\xe8\x7e\x2c\x9f\xf3\xb8\x35\xcb\x01\x6a\x73\x37\x64\x97\xd8\x75\x59\x89\x0c\x38\x31\xc0\xa6\x6b\x6f\x05\x98\xcf\xf0\x1b\xc3\x24\x67\x45\xeb\xaf\x6e\xe1\xf1\xcc\x97\xb6\x58\xda\x8b\xc6\x2e\x1b\x6e\x5e\x3b\x4f\xe0\x07\x16\x0a\x30\xf0\xb4\x82\xe8\xf7\xb2\x1b\xab\x43\xf8\xfe\x69\xad\xdf\x83\x41\x30\x24\x47\x00\x02\x92\x53\x32\xfa\x06\x26\x56\x62\xe5\xb6\xae\xf7\x5c\xe1\x7b\x66\x40\x89\xac\x0f\xd6\xcb\x1c\xce\x59\x0d\x0b\xec\x01\x43\x50\x61\x3f\xab\xb4\x7e\x37\x2c\x00\x53\x47\x40\xe4\x30\xf7\x57\x32\xbb\xf4\x25\xd6\xe2\xf5\xcd\xe1\x71\x87\xc8\xc2\x0a\x05\x9c\xdf\x03\xff\xc1\xaf\x7f\xee\xa1\x94\xeb\xbd\x8c\xdb\x00\x7e\x8e\xc0\x3b\xb2\xfc\x44\xb8\x23\xe7\xde\x2b\x45\x7f\xe3\xb8\x84\x19\x48\x11\x64\x16\x84\xf2\x88\x04\x53\x67\xa4\x69\x99\xdc\xe7\xa0\x96\x1d\x1f\x50\xba\xdd\x8d\xa3\x52\x05\x98\xcf\x84\x48\x81\xc6\xee\x84\x65\x52\x02\x03\x6e\xc8\xeb\xcb\x07\x24\xb3\x40\x84\x6d\x75\x93\xa7\x15\x9f\x86\xd9\xe2\x57\x04\xd8\xb8\x28\x9e\xf3\xf6\xf5\x3a\x16\xab\x08\xdc\x7f\x7a\x9a\x5c\x61\xe1\xf9\x4c\x6f\x4e\xae\x71\x0d\x35\xc5\xaf\xa3\xd0\x23\x10\x22\xdd\x15\x9a\x0b\x1e\x8f\xe6\xba\x69\xb1\x87\x35\x2c\x84\x6d\xa9\x54\x4c\x45\x75\xea\xa7\xf0\x14\x6a\x89\xec\xa7\xc6\xc6\x03\x16\x81\xf2\x41\x1b\x38\x02\x07\x6c\xbf\x84\xe6\x42\x04\xc3\x30\xf6\x85\xb0\x89\x53\xa1\x34\x24\xf9\xf9\xec\xe4\xd2\xbb\x8b\x3c\x56\x92\x3f\xd2\xe9\xe4\x9f\xa5\xff\x37\x7f\x3c\x6e\x22\x45\xe1\x40\xeb\x35\x3b\x20\x4c\xb8\x3a\xd3\xb2\x88\x46\x66\x9c\x76\xcd\x2e\x14\xf1\x67\x7c\x9f\x03\x7a\xd6\xfa\x68\x61\x45\x9c\x7a\xb9\x32\x15\xce\x9a\x34\x17\xdd\xe7\xb2\xe5\x28\x6a\x4a\x95\xa8\xf3\x2b\x80\x86\x4f\xd8\xed\x82\x5d\x75\x5f\x93\xa8\xfc\xde\xf3\x9c\x57\xb4\x71\xd5\x6e\x31\xfe\xa9\x03\xad\x45\xe5\xa2\x81\x53\x4a\x84\xec\x28\xe4\xbe\xca\xbb\xe0\x7f\x9b\x92\x24\xa7\xf5\xf4\x69\x07\xba\x59\xa4\x82\x8b\x79\x6e\x33\xdf\xc6\xf5\x20\x14\x1c\xa4\x69\xb6\x37\x82\xf6\xe9\x16\x82\x58\x65\x8c\xa5\xd2\x5c\x6e\xba\x07\x2e\xd5\x03\xb9\x29\x17\xab\xd4\x4b\xb7\xfa\x4a\x73\x45\x8a\x84\x08\xc4\xdc\x34\x4e\xda\x08\x33\x8f\xcc\x3b\xad\xf4\x60\x67\x4b\xcd\x99\xe8\x7a\x0c\x87\x54\x10\x85\x1c\xa3\x0c\x89\xba\xa9\x73\x0d\xea\x6f\x51\xfc\xe6\x7f\x0d\x1c\xd9\x8c\x6a\xb5\x43\x5c\x35\xb6\x51\x49\xe1\x86\xa4\x93\xd1\x4c\x1e\x30\xe1\x93\x31\x49\xff\xc1\xb2\x01\xb6\xbb\x23\xbe\xbd\x67\xb5\x9c\xb0\xe4\x73\x60\x2a\x0d\xfd\x19\xa2\x95\xa7\x78\x29\x99\xb7\x63\xe7\xae\x5e\x75\x12\x12\x36\xc6\x1d\x83\xb0\x2d\x04\x56\x72\xa6\x14\xf7\x3e\xd5\xc8\x6b\x5f\xfd\x89\x67\x12\xc5\x0a\x0f\xfe\xf3\xfb\xdc\xcf\x2d\xed\x5d\xcc\x76\x30\xf5\xe2\xe8\xd9\x8e\x92\x46\x36\x58\x46\xbe\x46\xef\x5c\xe2\xf7\xc5\x21\x23\xaa\xcf\x00\xbb\x3d\xe0\x61\x30\x51\x70\x89\x6b\x46\xd9\x66\x81\x72\x3e\x7a\x18\x7f\xaa\x33\x98\x92\x89\x42\xbf\x5a\xb1\x30\xe7\x7b\x6e\x6f\x87\xd0\x08\x80\x5d\x18\x3c\xf5\xe7\xf1\xd2\x3a\xdb\xbd\x4a\xff\xe2\xe0\x6c\xe2\x56\xbf\x2c\xb6\xf1\x28\xa9\xbf\x7d\xd9\x27\x4b\x12\x17\xf7\xe8\x17\xde\x22\x27\x45\xbc\xc4\x2a\x32\x28\x01\xed\x26\x4c\xbe\x16\x17\xe7\xde\xd0\xb0\x09\x78\x47\x10\xee\xb1\x7e\x3b\xec\x2b\x7b\xaa\x7c\x2f\xfb\x47\x91\x3e\xbc\xd9\xa5\xa1\x19\x6a\xe7\x0d\x73\x3f\x47\xd2\x75\xb7\x28\xb1\xf1\x1a\xc3\x42\xd7\x3f\x0c\xa2\x11\x5a\xcb\x1a\xd5\xa8\x0b\xdb\xa0\x7e\x14\xfe\x2f\xff\xd2\xa8\x29\x52\xd8\x02\xc8\x9f\xbe\xf4\x91\xda\x40\x27\x4f\xae\xb9\xe5\x54\x73\x1e\x9b\x89\x13\xcb\x85\x33\x59\xc5\x60\xe9\x38\x90\x47\xe2\xa1\x12\x8f\x5e\xbb\x96\x53\xb5\x9a\xc1\x9a\xad\x89\x21\x2c\x4a\x94\xb2\x90\x4c\x70\x3a\x53\x67\xb6\x4a\x8c\x3b\x58\x4c\x80\x20\x04\x22\x66\x4f\x2d\x18\x96\xa7\xad\x97\x9b\xab\xf3\x8b\xd2\x3d\xff\xee\xce\xbe\x1e\xdc\x71\xa8\xdc\x67\x6c\x73\xb4\x4c\x83\x46\x7a\xa5\x7d\x84\x47\x32\x4a\xba\x04\xd4\x7b\x5e\x92\x5b\x61\xbd\x22\x17\xee\x0c\x64\x59\x36\xb0\x05\xf2\xfc\x4c\x69\xfd\x8d\xee\x44\x96\xab\x85\x83\x66\xbb\x54\x44\x91\xbe\x0a\x52\xe7\x9e\x83\xf6\xec\x85\xc1\xd1\x7d\x81\x59\xda\x34\xcf\x32\xdf\x75\x31\xd2\x8c\x03\x71\xba\x96\x15\xd5\x47\x42\x2d\x98\x90\x48\x95\x32\x51\x7e\x20\xab\xc9\xfd\xf6\x10\x8c\xfe\x55\x8e\x8e\x8f\x7c\xbf\xbe\xfa\x6a\xd8\xc4\xc0\xf9\xd3\x53\xad\x51\xba\xd4\xfa\xcb\xf2\x42\x0b\x63\x1f\xcb\x41\x73\xde\xac\x17\x07\xe4\x0b\x12\x89\x0e\x85\x11\x7a\x5e\x27\x39\x2f\x87\xea\x13\xba\xcf\xf7\xe1\x5e\xdd\xa9\xc8\x5f\x4d\x2f\xa1\xf9\x13\xf5\xc1\x35\x9c\x2c\xd1\x73\xec\x8e\xcf\xe2\xd8\xfa\x44\xb8\x69\xc4\x56\x51\x79\x94\xf1\xe9\xfb\xfb\x1f\xce\x5e\xbc\x14\x2a\x53\xda\xab\xa3\x55\x80\xee\xdc\x17\x35\x32\x04\x81\x84\x7a\x3f\xce\xd3\x5a\xa5\x69\xb5\xba\xab\xbf\x19\x36\xaf\x10\x80\x68\xf2\x13\xe4\xdb\xa7\x9b\xa2\x77\x29\x5a\xe8\xaa\x99\x0f\xf0\x22\x67\xbf\x7e\xe6\x60\x20\x1e\x2e\x88\x6b\x01\x10\x22\xe3\x07\x8a\xeb\xca\xfc\xb0\x22\x0f\x65\xcc\x67\x9c\x00\x0c\x93\xf4\x92\x15\x7d\x68\xa7\xfd\x64\xd2\x8e\x14\x8a\x33\xb1\xf2\xf7\x75\xff\x6a\xf8\xa4\x6a\xee\xc2\x2e\x24\x56\x12\xe9\xbe\xb9\x76\x25\xb4\x5e\x0f\xa4\x37\x15\x20\xcf\x80\xc4\xb8\xd3\x82\xe9\x55\xc8\x4f\xf2\x54\x0d\xa7\xb7\x51\x18\x00\xd4\x37\xe5\x0a\x54\x7b\x41\xc7\x42\xfd\xb4\xf4\x27\xd7\x3a\x96\x81\xcd\xf4\x5c\xa1\x27\x1a\x7e\x4e\xd4\xba\x49\x0d\xee\x91\xc0\x1d\x4f\x08\xc0\xde\x3e\xe0\x95\x10\x52\x93\x83\x00\x38\xfb\x22\xa0\xd9\xe3\x57\x2e\xa7\x9e\xae\x89\x67\x3d\x50\x53\xb5\xa2\x02\xd7\xd8\x77\x55\xbd\x7d\x17\xf3\x3e\x65\x60\xbe\xcd\xb7\x23\xba\xe1\x70\x3a\x88\xc0\x3b\x0d\xa5\xdb\x00\xd4\x4d\x83\x2a\xd8\x28\x7f\x1b\xd6\x50\xce\xea\x51\x72\x7b\x23\x19\xfd\x7e\x8a\x24\x62\xd4\x04\x60\x01\x38\x0f\xef\xd3\x45\xaa\xf6\x98\xdd\xe9\x5d\x3c\xfb\x19\xd2\xac\xca\x3d\x89\x78\xc5\xab\x54\xb5\x57\x77\x4c\x9d\xf6\x58\x58\xfa\x59\x93\x88\xf6\x12\xec\xe0\x93\xeb\x07\xf1\x7a\xfd\xd3\x7a\x55\x4f\xd3\xc3\x36\xe6\x7e\xe9\x93\x2b\x4f\x16\x59\xf8\x55\x2a\xbf\x88\x15\x64\x00\xec\x86\xcf\x40\xa7\xc3\xf6\xaf\xe8\xbc\xa1\x66\x27\xb8\x8e\x11\x99\x88\x52\x32\x89\x6b\x95\x0a\x0d\xfb\x81\x54\xe4\xec\xcf\xcf\xc7\x11\x19\x8d\x81\xdc\x82\x01\xee\xb2\x87\x92\x41\xa6\x11\xf3\x7e\xf8\x10\xaa\x09\xe0\x4d\x36\xff\xd0\xc9\x3a\x3a\x23\x2b\x55\x36\xf0\x0e\xf5\x78\xfd\xab\xad\xa5\xa2\x6e\xdf\x1b\xa1\x7f\x33\xfa\xb5\x4c\x72\x31\x24\xf6\x7c\x14\x08\x00\x15\x6b\x94\x9b\x71\x03\x1c\xc1\xf0\xc1\x0b\x85\x46\x18\x11\x36\x35\xed\x9f\xda\x41\xce\x56\xbb\x2a\x5f\x72\x51\x18\x85\xd2\x00\xc8\x0e\x5f\xa8\x4f\x22\x5e\x89\x3c\xef\xcf\x28\xb0\xe3\xc7\x27\x66\x74\xc9\x11\x63\x37\xda\x09\x33\x07\xe7\xb7\x57\xe2\x86\xe2\xbf\x71\xed\x2b\x3b\xe4\xc1\x4c\x3f\x0a\xae\xfc\x9d\xdb\xbe\x82\x37\x9d\xdb\xba\x5d\x90\xb2\xa1\x17\x2c\x39\xc8\x67\xd6\x3f\x8a\x9c\x60\x26\x7a\x9b\x88\x7d\xcb\x87\x1a\x8f\x62\x74\x52\xb3\x2a\xe8\x25\x02\x9c\xd8\xc7\xa8\x56\xd9\x1b\x16\xee\xf5\xd8\x7f\x62\xb0\xc3\xb6\x78\x20\x8b\x33\xae\x53\xa6\x04\x80\x7d\xe7\x20\x27\x3f\x5a\x15\xfb\x85\x74\x65\xfd\x53\x6e\x1b\xc0\x50\x70\x8d\x3d\xac\x28\xad\xda\x99\x1a\xf9\x75\xac\x8d\x30\x5b\xf3\x44\x6d\x84\x25\x56\xc6\xdf\x3c\xad\xbe\x92\x1f\x7a\x67\x49\x6a\xc3\x46\xf2\xfb\x20\xb3\x58\xfd\x41\x2b\x39\x08\xfb\xc5\x83\x46\x4a\xb2\xe4\x82\x18\x67\x66\xcc\x0c\x72\x38\x63\xb8\x80\xcd\xf8\xa2\x1a\x17\x88\x4e\x43\x55\x01\xff\x5c\xe7\xd7\x68\xef\xcb\x7a\xff\xd1\x04\xc9\x68\x71\xde\x37\x20\xfc\x37\x34\x6a\xaa\x50\x8c\xea\x58\x66\x39\x15\x86\xf7\x8d\x4b\x37\xa0\x97\x34\x9f\x3f\x91\x15\x88\x6b\x7f\xb3\x31\x7f\xaa\xe1\x12\xe0\xa0\x7b\xca\xd7\x6f\x1c\xab\x56\x9c\x2f\xb4\x5b\xaa\xf6\xfb\xbc\x9c\x51\x2c\x5a\x00\x5e\xec\xc5\xaa\xdc\xe3\x62\x01\x8a\xd0\x7a\xbd\x7f\xba\x10\x47\x88\x96\xfe\xe1\xe9\xa2\xea\xd2\x3b\xa4\xbb\x1c\x7c\xac\x84\x2a\xbf\xde\xe7\x61\xcb\x29\xd5\xb3\x57\x16\x0b\x5d\x58\x05\x88\x41\xec\xf9\x0e\xfa\x94\x7c\x6e\x89\x25\x15\x68\x4c\x3e\x3d\x6c\x8d\xd2\x0d\x75\x28\x87\x4f\x9f\x3f\x0c\xa7\x04\x3a\xb1\xfa\xda\xa7\x97\xc5\xfa\xaf\x3e\x93\x7b\xf4\x86\x8d\x43\x75\x60\x07\xbb\x0d\x87\x15\x6e\x79\x9e\xcf\x23\x07\xce\xf2\xcb\x6a\x54\xe2\x85\x42\x6f\x10\x51\x0b\x7d\x17\x0b\x51\x3a\x73\xe5\x6f\x50\x28\x43\xf5\x74\xcf\x61\x3f\xfb\x9e\x60\x22\x6d\x77\xfb\x27\x55\x90\x82\x48\x29\xed\x45\x4b\xab\x1e\xc4\x65\x38\x31\x04\x60\x88\x9c\x58\x58\xa1\x7c\x4f\x55\x50\x89\x97\x5a\x7d\x11\x86\x47\xd9\x19\x3e\x1f\x5a\x26\xff\x7b\x3e\x39\xcc\x19\x8a\xf1\x8a\x98\x42\xfc\xee\xe5\x1b\x8b\x72\xdf\x70\x5f\xdd\x01\xb0\x62\x86\x69\xb1\x5f\xc5\x72\xb6\x4e\x11\xe9\xc5\x89\xc0\x62\x04\x40\xbc\xf1\x29\x27\xbd\x76\x63\xfc\xe4\x22\x1a\xac\x12\x9f\x3f\xc3\x59\x0b\xcb\xf7\xb4\xb8\xdb\xaa\x28\x0c\x83\xbe\x93\x6d\xb1\x46\xb3\x0d\x67\x37\xfa\x79\x17\xa5\x34\x21\xfb\xca\x64\xbd\x87\x40\xc9\x29\xce\x9f\x77\xf2\xcd\x59\xfe\xf1\x1f\x4f\x81\x43\x3f\x35\x1b\x85\xb1\xf2\x8c\xc2\x27\x4b\xe8\x57\xa9\x94\x78\x97\x76\x61\x4b\xb1\x60\x70\x0c\xc0\xf4\x9f\xa0\x6b\x97\x0f\x2f\x0a\x13\x9b\xd7\xba\xdf\x57\x23\x5f\xce\xe3\xc4\x97\xdf\xf0\x25\x7c\xb6\x19\x43\x36\xbb\x09\x0d\x1e\x5c\x87\x19\xb2\xfc\xa7\x0c\x22\x84\x85\x8a\x92\xc6\x3b\x38\xfa\x93\x05\x79\x73\x7d\xff\xd4\x8e\x4b\x28\x38\x8e\xb9\x21\xa7\xbf\x5c\x49\x76\x5b\xab\xbf\x2b\x83\x80\x94\xae\x7e\x85\xbf\x7d\x06\x9e\xc3\x29\x8d\x8d\xf9\xe7\x12\xf3\x27\x9a\x2a\x89\x8c\x31\x70\xa2\x58\x44\x45\x78\x58\xdd\x16\x59\xd8\x25\xbe\x4d\x13\x9a\xf2\x66\x61\x26\xda\x02\x58\xd6\x6b\x9f\x72\xf9\xee\xb3\x99\x7e\x29\x1c\x2f\xa7\xdc\x94\x2a\x0c\x40\xd1\x26\x47\x26\x7a\xb6\xdd\xc4\xe0\x8e\x4b\x74\xe4\xa4\x22\x88\x22\x45\x53\x3f\xc8\x0c\x5f\x7a\x97\xef\xe1\x52\x6f\xa9\x31\x06\x89\x4d\x7a\xd9\x32\x09\xf3\x95\xfc\x6a\xb7\xb8\x90\x3f\x27\x4b\x3f\x6d\xa5\xed\x09\x40\xb2\x39\x75\xa9\x44\xdd\x22\x18\xcc\x68\xc0\x91\xee\x8b\x3d\xea\x14\xdf\x5f\x42\xb7\xd4\xed\x09\x84\xca\xe0\xdf\x60\xbd\x4e\xa9\xd3\x83\x36\xa7\x14\x9a\x80\x24\xfd\x93\x68\x9b\x1d\x48\xf4\x1e\xef\x19\x3e\xb5\x64\xf9\x55\xb9\x07\x9d\x1a\xfd\x19\xde\xef\x16\x90\x88\xb6\x7d\x7a\xc3\xa4\xf3\x60\x5e\xf6\x5b\x3d\x25\x35\xec\x25\x96\x13\x7e\xe5\xb7\xea\x95\x01\x6d\xb3\x9f\x69\xab\x78\x58\xea\x63\x50\x30\x59\x5f\x00\x69\x27\x55\xc1\x92\xce\xf3\xb5\xc6\x81\x03\x09\xc8\xbe\xb9\x27\x6b\x26\x5a\x4b\xef\x2e\xc5\x2d\xfe\x7e\x43\xf2\x88\x38\xd1\x6a\x4e\x27\x30\xe5\x74\xbb\x83\x24\x70\x01\xc2\x2a\xf7\xcd\x02\xf5\x7e\x95\x31\x69\x6b\x00\xc8\x2a\x69\x02\x08\xbe\x3c\xa6\xd9\x0e\x34\xea\xa3\x72\x2f\x03\x9e\x17\x5b\x8b\xb2\x8e\xb8\xef\x67\xff\x0f\x16\x7a\x16\x70\xfb\x1a\x46\x2d\xde\x68\xe3\x91\x2c\x97\x66\x04\x21\xb4\x0a\x51\x77\x74\x94\xb9\x84\xa3\x20\x1b\x04\x88\xbd\x56\x8b\xfa\x3a\x96\x58\xcb\xf5\xde\xa4\x0d\x13\xbc\xaf\xa0\x93\xaa\x27\xd7\x6d\x14\xa2\x35\xa1\x6c\x2b\xf9\x8b\xe3\x4d\x7c\xdc\xa3\x7b\xf5\x7d\x02\xf9\x28\x67\x91\x0b\x04\x58\x31\x37\x71\x67\xe1\x49\x46\xef\x3a\xf0\xa9\x42\x7c\x1d\xfb\x9d\xcd\xd8\x5e\xb5\x9f\x2c\x6c\x22\x9e\xf8\x18\x1c\xe8\x79\xb1\xfe\xcb\x07\xb8\x27\x23\xd2\xfa\x45\x6d\x6a\x54\xdb\xc3\x28\x3b\xfd\x39\x11\x01\xdd\x07\x79\x96\x65\xb9\xec\xdf\x2a\x6b\x18\x37\x43\x00\x4c\x9f\xbe\xb3\xd1\xdf\x1b\x11\x21\xa9\xde\xb8\xb9\x4e\xeb\xe5\x80\x65\xcd\xf4\xb6\x46\xc9\x42\x51\x73\x73\xf9\x51\x76\x64\x07\x82\x38\x8e\x01\xf8\xcc\xa0\xd7\x72\x80\x75\xb1\x60\xaa\xd3\x77\x04\xec\xa6\xe7\xba\x84\xe9\x4d\x94\x5e\x0c\xe6\xa3\x8e\x48\xba\x52\xbe\xbd\x5a\xd0\xae\x8f\xb9\xf4\xfe\xd5\x9d\x77\x96\xc4\xb7\x55\xd0\x28\xfa\x3b\x54\xad\xe6\xfe\x46\x75\x26\xfa\xf9\x7e\x07\x49\xbc\xa7\xa0\xcc\x00\x23\x35\xc0\x58\x89\x0c\xab\x42\x90\x59\xb4\x4f\x43\x80\xc0\x14\xbc\xfd\x9b\x15\xe0\xc6\xda\x43\x70\x3b\xd8\xc7\x32\x37\xea\x3b\x99\xfd\x05\x72\x08\xf3\xbe\xba\x63\x4c\xb3\x8c\x1c\x7c\x6b\x33\x19\x98\x24\xbf\xc8\x45\x4e\xa4\xdd\x4b\x8b\x40\xe7\xd8\xcd\xd7\xe5\x96\xe2\xbf\x8d\xcc\xb9\xd1\xe6\x24\xa8\x2d\x6d\x64\x86\x5a\x62\xa5\xfe\xe6\x60\x74\xb1\xdf\xe5\xcb\x94\x92\x81\x0e\x5a\xe9\x68\x8e\xc1\xcd\x43\x53\xe9\xd3\x79\x07\x4c\xbd\x02\x09\x20\xe5\xad\x40\x92\xde\xb2\x55\xb1\x88\x6a\xa6\x00\x57\x1e\xb4\x92\xa8\xa6\x9c\xb4\xb2\x75\x7d\x50\x6b\x88\x0f\xe5\x73\x31\x28\xdc\xcd\xec\x76\xf3\x8d\x60\xf2\xfd\xb6\xf3\xc6\x68\xdc\x26\x13\x6a\x52\xa0\x00\xeb\x37\x5c\xa2\x1e\xac\xf8\xd6\xe5\x19\xcb\xe6\x77\xf9\xf8\x52\x26\x63\x06\x73\x7c\xa6\xdf\xee\x5f\xdd\xb2\x17\x8a\x00\x9a\x5c\xf9\x0d\x3c\x4b\x92\x50\x3a\xcb\xc5\x69\x67\xea\x15\x9d\x5c\x80\x64\xf9\x7e\x11\x8d\x8e\x18\x14\x44\x30\x8a\x04\x7b\xf7\xf0\x38\xc4\x6e\x28\xb5\x8a\xe5\x54\xb3\xdf\x83\xb3\x36\xee\xb4\xda\x03\x62\xb4\xcc\xa9\x36\x64\x62\x10\x0c\xe6\x83\x9b\xcb\x01\x62\x50\x53\xd0\xe1\xde\x78\xeb\x23\x06\x00\x42\xec\xde\xeb\x7a\x2e\x8e\x41\x75\xf5\x3c\x9e\xe7\x36\xee\xfc\x9e\xd1\xbe\xa9\xdb\x28\xb8\xeb\xa2\x3d\x19\xc6\xfa\x07\xd4\xfc\xa4\x44\xc3\x7b\x85\xad\xd0\x0a\x7d\x4c\xa2\xe9\xa4\x6b\xf0\xb0\xa3\x5c\xde\x15\xac\xbf\x59\x08\xe0\xf8\x65\xd7\x10\x45\xf2\x7c\x64\x08\x02\xbd\x0a\x29\xfa\xbe\x84\x4f\xb9\x6b\xcd\x72\x14\xea\x61\x50\x22\xa5\x34\xf4\xfb\x41\xba\xba\x50\xc3\x13\xba\x2c\xab\xde\xc6\x8d\x59\x10\x8c\xf1\x36\x5b\x64\xfc\x32\x9e\x8c\x91\x02\x80\x08\xc8\x3c\xd1\x85\xd4\x1e\x7e\x8a\xa7\x46\x4c\x40\xab\xcd\xcc\x41\x59\x34\x4c\x9e\x19\x9e\xf5\xfe\xeb\x59\x73\x6b\xb2\x73\x5b\xf1\x5d\xe9\x21\xb9\x20\x92\xef\xfb\x3e\x0d\x15\x1f\x69\xbd\x2c\xcf\xb2\xc0\x37\x00\x42\xed\x44\x66\xf6\xf7\x48\xb1\xed\x9e\x23\x72\x1c\x33\x5f\xba\x90\x7c\x33\x2a\xde\x29\x1a\xcd\x6e\xd4\x5c\x2d\x7f\x1b\xb4\xb8\xe8\xaf\x7e\xa4\x93\x98\x2f\xa7\x8d\x8e\x60\xa0\x48\xc1\x9e\x6f\xbc\x22\x98\x68\x9a\x57\x84\x4a\xf9\x12\x64\x98\x3d\x07\xc1\x6a\x5c\xa5\xab\xb9\xa1\x7f\x45\x37\x93\x29\x46\x46\x2f\x4b\x8f\x84\xc5\x27\x31\xfe\xce\xae\xd5\xc7\x62\x3b\x98\x76\xd9\x57\xa5\x5b\x94\xce\x46\xdb\xd6\x43\xb7\xc3\xa2\x1c\x50\x24\x00\xe0\x0d\xc0\x89\xb8\x17\x12\x75\x93\xf1\x83\xb2\x10\x6d\xf6\x89\x84\x14\x44\x1e\x2b\x3f\x63\xec\x6d\x5f\xd0\x03\xb4\xc6\x46\x3f\x54\xf8\x10\x98\x9f\xfa\xe0\xb2\xdc\xb8\x11\x89\x6b\x69\xe1\x79\x24\x10\x41\x6a\x03\x83\xb9\x8f\x6c\xa0\x65\x59\x7c\xcd\x09\x26\x25\x7c\xac\x2a\xa6\x08\x99\x5d\x82\x4a\xaf\x9c\xa6\xae\xd3\xa6\xf4\x87\xc9\xff\xed\xf3\x76\x2f\x2f\x26\x2c\xa6\x4f\xde\x61\x3d\xbe\xe9\xde\x01\x91\xb5\xbb\xcc\x8e\xe4\x46\x1f\x82\x94\x48\x19\x06\xc3\xba\x24\x03\x98\xb9\xc7\x34\xdc\x2d\x6a\x0a\xbb\xbc\xf7\x05\x70\x17\x19\x84\x50\x9d\x9f\x78\xdd\x82\x2e\x9d\xb7\x3d\xf5\x90\xcb\x60\xad\xc8\xe6\x15\x5c\xba\x03\xdc\xdd\xdf\x51\x38\x12\xbd\x37\x11\xde\x0d\x80\x1b\x52\x80\x22\xa1\x8a\x00\x16\x97\xa8\x29\xea\xec\xfb\x66\x2f\xb9\xb5\xc7\x43\x39\xd7\xb6\xd9\x0f\xbe\x39\xd8\x0a\x92\x70\x80\x5c\xf8\x5b\x63\x9e\x61\x37\xc7\x0a\xb2\x14\x98\x43\xde\x97\xe8\x85\xbe\x0b\xd3\xa4\x18\x99\x8e\xda\x22\x61\xbd\x01\xc9\x70\x86\x91\x71\x47\xd6\x43\xd3\x4e\xe3\x79\x6a\x82\x24\xcb\x77\xc2\xc5\x0e\x89\xf8\xd8\x0e\xa1\x55\x6d\x56\xa0\xbd\x93\x7f\xae\x77\x81\x21\x51\x87\x27\xe0\x6b\xd2\x06\x85\xa4\x86\x91\xfb\x7e\x0f\xe0\xcb\x24\x36\xc6\x26\xc7\x53\x7f\x5e\x00\xd9\x9c\xdd\x00\x04\x39\x82\x91\x05\x76\x67\xc7\xc2\x48\x67\xe5\xd7\xa8\x2e\xb5\x16\x19\x37\xf2\x12\x04\x5b\xd9\x9d\x09\xac\xf1\xb0\xff\xd5\xb8\xde\x9a\xae\x3b\xd0\xb3\xd4\x4e\x2a\x87\xd3\x02\x54\xd0\xed\xb3\xf0\x81\x65\xd6\xcf\xf4\x14\x02\x84\xd1\x85\x95\x43\x98\x7c\xc5\x10\x6b\xfc\x74\xe0\x1e\xfc\x8e\xea\x20\x64\xc9\xe6\x4f\x6f\xc5\x0f\xf1\xf4\x11\xe3\xb2\xd2\x52\x8b\x1b\x1f\xfc\x3b\x8c\xbd\xf3\xfc\x7a\x22\xfb\x8a\xf6\xbb\x16\x5c\xba\x1a\x27\xbf\x1d\x10\xd2\x00\x60\x02\x00\x5b\x41\x6e\x20\x8b\x9f\xd8\x53\x3a\x33\x00\xc7\x7b\x82\x20\x8c\x4d\x20\x00\x5b\xbe\x05\xe8\x92\x35\x96\xcd\x20\xaf\xce\x60\x97\xb1\xe9\x69\x4d\x9e\x5c\x85\x2e\x16\xd9\x53\x66\xa7\xe8\x21\x5a\xe8\xa2\xfc\xa3\x0f\xb9\x49\xea\x32\xb5\x5c\x16\xab\x61\xb4\x80\x24\xee\x7e\x7c\x37\x0d\x4c\xc7\x18\x07\x00\x41\x20\x4b\xc1\x0c\x5c\xf3\xbd\xd6\xeb\x42\xc4\xe9\xe4\x74\x92\x89\xb6\x3e\x30\x49\xff\x91\x18\xbd\x39\x50\xd8\xc2\x84\x80\x0f\x1c\xee\x93\xc2\xcf\x47\xa1\x18\x0b\xad\x3f\x9f\x4a\xab\x72\x39\xfa\x58\xf8\x43\xd9\x35\xad\x7e\x1c\xaa\x91\xfb\xac\x5f\xb0\x33\xc3\x5c\xd7\xc0\xf8\x3e\x44\x8e\x24\xd3\x3d\x8f\x09\x16\x3f\x0e\xd5\x81\xe9\x23\x90\xec\xa9\xef\x62\x4c\xba\x41\x2a\x60\x33\xbd\x09\x79\x93\xfc\xd4\x77\x7b\x51\xd9\x2c\x57\x83\xa3\x04\xfc\x00\xdf\xa4\x56\x93\x1b\x4e\x3c\x2a\x83\x0f\x1e\x08\x57\xff\x37\x67\x52\x6c\xfd\x98\x7a\xd3\xe3\xcb\xc0\xc5\x52\x22\x67\xe0\xea\x22\x48\xae\xe5\x40\x83\x39\x10\x14\xa4\x28\x5c\xa5\xbd\xc8\x55\xbe\x80\x71\x27\x98\x64\x3b\x3b\xf3\x15\xbe\xa4\x5e\xcf\x11\x9e\x0a\x26\xa1\x99\x89\xef\x62\xd8\xb8\x87\xea\xc1\xe1\x6f\x96\x1d\xe9\x5c\x9b\x2d\xcf\xa2\x57\x59\xd6\x83\xdb\xfd\xb0\xb7\x9f\x13\x3f\x68\x00\x0a\x2f\xe3\x64\x0c\x82\x89\x73\x62\xdf\x31\xdc\xff\xdc\x09\xda\xf9\x4a\x5b\x9d\xa9\xd7\x9a\x4e\x2b\xe1\xe9\x27\xef\xfb\x16\xe9\xff\xc7\x27\xd6\x39\xc2\x17\x3a\xd1\x5d\x0d\x6e\xcd\x7c\x12\x69\xf4\x22\xd0\xb0\x93\xd0\x39\xd3\x6c\xf6\x3e\x00\x75\x56\xe2\xfa\x57\x23\x79\x58\x38\x99\x0b\x91\x04\x5b\x4b\xac\xc4\xd2\x02\x94\x41\x23\xc6\x88\x80\x71\xcd\xe7\xd8\x1b\x97\x98\x1f\x17\xa0\xa9\x06\xdd\x8e\xab\xfb\xb1\x1c\x35\x99\x06\xb7\xdb\x97\x74\x5c\xd7\xab\x0c\x9b\x22\x2f\x04\xfb\x0d\x0d\xef\x3a\xbc\xd0\x84\x6f\x39\x51\x2c\xa4\x7e\x69\xe6\x44\xf8\x34\xe5\x66\xac\x41\x20\x99\xd6\x9f\x6c\xfe\x81\x19\xc8\x37\x9c\xd9\x09\x76\x67\xd1\xce\x39\xf9\x01\xfb\xec\xaa\x52\xa6\xca\xf8\x73\x7e\xef\xf3\x9d\x3e\xfa\xe9\x55\xbb\x6e\x28\xf8\xbb\x9a\xd8\xf7\x53\x97\xbf\xff\xe1\x78\x92\xd3\x67\xb9\x76\x16\xea\xab\x44\x2e\x5f\xa5\xbe\x46\x33\x6d\x29\xb6\x55\xac\x5b\x2d\x6e\xf9\x0a\x2f\x01\x83\xc0\x99\x7b\x91\x55\x16\xc5\x7c\xfb\xf9\x13\xaa\xc3\x59\xad\xee\xb4\xba\xdd\x22\x2a\x7e\x19\x6e\xd5\xec\xd0\xbb\xa2\x92\x6e\xa3\x14\x0a\x38\xf3\xf7\xff\x72\xd5\xf1\xba\x25\x41\x68\x02\x4e\x98\x3f\xca\xdd\x35\x41\xb7\x87\xb5\x88\x18\xb2\xbb\x3d\xc8\x75\x43\xcb\x08\x9b\x72\xfe\x4a\xa0\xd9\x39\x7e\xe8\x50\x02\x95\xb0\x3f\xb8\xf9\x77\x66\xca\xbf\x3c\x49\xe8\xef\x24\xc4\xf4\x11\xb9\x31\xbb\x39\x55\x4b\xbf\x5e\xf0\x61\x7c\xe0\x41\xcd\xab\x3b\xb9\x56\xe5\x46\xde\x69\xe6\xec\x4b\x52\xb9\xef\x82\xe8\x9f\xc8\xa7\x74\x5f\x7f\xf9\xbc\xf9\x77\x2f\x32\xdc\x97\x7a\x74\x67\x4f\xb8\x26\xf7\x66\x73\xe9\xb5\xa3\xf5\x53\x37\x5e\xdf\x57\x3b\x06\x9d\xfc\x82\x59\x7b\xdb\x53\x6a\xb3\x41\x22\xd3\x82\x75\x09\x73\xb7\xb8\xe3\xe7\xf1\xdd\x38\xd0\xc9\xef\xcf\x5f\xec\x8c\x7a\x05\x9a\x14\x74\xdf\xfa\x19\xc9\x51\xeb\xa9\x8f\x2d\x9a\x13\x9c\xae\xbf\xb5\x55\xfd\xa6\xb2\x65\xab\x37\xb7\x46\x7d\x0e\x63\xd6\x7e\x57\xab\x32\x7b\xfc\xf3\xa9\x54\x41\xef\xfc\xcf\xa7\x8b\x0f\x25\x11\x01\x48\x12\xba\x11\x19\xc2\xd2\xcf\xec\x1a\x6c\x1f\x54\x4e\x61\xb0\xba\x13\xc9\x62\xee\x1b\x17\x94\x39\x99\xdb\xb0\x07\x54\xc8\x5e\x74\xfb\x61\xae\x65\x42\xb7\x1a\xab\xb9\xf1\xfd\x8c\x7f\x71\xeb\x5a\x43\xeb\x9a\x0f\xce\xc9\x1a\x7b\x58\xb1\x6d\x59\xe4\x22\x8e\xae\x07\x45\x22\xca\x5b\xeb\x6e\x6a\xd0\xb1\xc5\x16\xf7\xec\x41\x30\xe7\x25\x5c\x39\x7b\x7f\xff\xce\x71\x19\xb5\x46\x4a\x2e\xdb\x97\x35\x9b\x31\x6f\x0a\xe1\x0f\x39\xfe\xe4\x23\x96\x3b\xe6\x0b\xa3\xac\xbd\xfa\x3e\x6b\x0a\x2b\xef\x6f\x5e\x15\x65\x7e\xe4\x02\x28\x8c\xec\xdf\xfc\xae\x96\x35\x9a\x14\x4c\xdf\x5a\x66\x3b\x63\xa9\x72\xea\x6a\xae\x4f\xc4\x55\x9b\x4e\x59\x1b\x54\x61\xb9\x94\xc4\x9a\xf3\xeb\xc0\xfa\x1b\xb4\xfd\x6d\xad\x50\x0d\x3f\xcc\xf1\x1c\xf4\xa7\x15\x64\xc7\xaf\x7e\x59\xd1\x1a\x54\x5d\xa2\x2c\x2e\xa0\x30\x79\xbb\xcb\x22\x0d\x42\x1a\xd9\x20\x9c\xb5\xe1\x4c\xfb\x5c\x20\xb6\xf1\x52\x1a\x92\x3e\x29\xe3\x76\x70\x43\xfe\x7a\xbb\x44\xc7\xd2\xf1\xff\xea\x61\x08\x49\x84\x69\x7d\xca\x09\x04\x53\xe5\x24\x63\xe3\xee\xf7\x4b\xd3\xe2\x35\x1d\x7a\xef\x33\xe6\xca\x99\x7e\xdf\x52\x88\xe9\x9f\xf3\x6d\xbe\x5d\x79\xae\x00\x51\xff\x97\x03\xb4\x9d\xa5\x67\x4f\xcb\x78\xe1\x5a\x15\xac\xe6\x94\x0f\x0c\x6e\x84\x86\x34\xf2\xc7\x53\x18\xa0\x70\x18\x9a\x6b\xaa\xb5\x60\xc7\xef\x0e\xeb\xf2\x43\xf1\x6b\xca\xa5\xf2\x3f\xeb\x91\x2e\xcb\x31\x7a\xf1\xcf\xf7\x4c\x72\x35\x6c\xdf\xe4\xae\x85\xda\x31\x42\xda\xb5\x26\xf7\xa5\x7e\x3c\x56\x6c\xee\x8e\x72\xd6\x43\xff\x1c\x2f\xad\xf0\x4e\xf6\x52\xd9\x56\xb5\x3f\x6c\x4e\x73\xea\xb4\xdd\x4b\xc5\x6c\x93\x5c\x0f\x54\x49\xbc\xfe\x9b\x47\x6e\xc1\x44\x7d\x51\x97\x50\x59\xec\x42\x39\xba\xe6\x9b\xd9\xa7\x65\x94\x93\xc1\x13\xf9\x02\x61\xc6\xd2\xdb\xc5\xd0\xf9\xcc\x07\xd8\xc6\xc9\x93\x17\x6e\x6a\x7a\x5f\x33\xd1\xf4\xa3\x22\xec\xf7\xb3\xff\x1b\x47\xc3\xe6\x6b\x27\x82\xe1\xe4\x22\x16\x21\xf7\x08\xee\xf7\xbc\x0b\x14\x92\xf5\x65\x74\xa8\x27\x6d\x50\xc2\x97\xf6\x72\xee\x29\xdd\x0e\x66\xe7\xef\x88\x31\xe4\x2d\xcb\x23\xe3\x8b\xff\x07\xdb\x06\x93\xde\xd8\x4e\xbe\xc2\x76\xa9\x5a\x78\x85\x5d\xc0\xb3\x08\x15\xf3\x66\x2f\xaf\x84\x29\x17\xb2\xd3\x86\xdd\x3b\xec\xc2\x66\x71\x6c\x88\xba\x79\x83\xc5\xd4\x66\xc5\x78\x3b\x6a\xcf\xa9\x46\x93\x8a\xfd\x62\xf5\x7f\xbf\x4f\xa9\x5d\x6f\x74\x15\x51\xfb\xf3\x8c\x2e\xfc\x1e\xca\x21\xf8\xe8\xd6\x8f\x85\xad\x9d\x38\x66\x3b\xec\xe0\xbd\x9f\x8e\xdb\x86\x56\x72\xbf\x66\x8c\x0d\x67\xe3\x83\x73\x1a\x8e\x98\xb1\x57\x45\xb6\x95\x50\xc4\x6b\x7b\x46\xbf\xba\x17\x3e\x94\x26\xe8\xcb\x59\x62\xcb\xa7\x6a\xbd\xc9\x31\x4d\xbe\x1c\xb3\x45\xa0\xf9\x20\xc1\xec\x8b\xaa\x62\x21\x5b\xfd\x92\xaa\x34\x64\xe9\x93\xea\x81\x46\xef\xa1\x7a\x29\x15\x7e\x77\x51\xc6\x7e\xbb\x7f\xff\x3e\x3c\x54\x6f\x44\x79\x46\xed\x97\x3d\x17\x42\xbb\xc4\x4a\xac\x3a\x21\xc9\xbb\x1a\x82\x22\x13\xb1\x97\xb4\x19\x15\xc3\x75\xd4\x85\x04\xf7\x35\x63\x43\x6c\xa1\xab\x54\x05\x3c\xef\xce\x9d\x44\x67\xe9\xdc\x27\x4b\x81\xfa\x33\xf8\x72\xcf\xe1\x31\xff\xee\xc8\xab\x57\xd6\xbf\xa1\xb7\x6a\xed\x12\xcf\x69\x8c\x67\xab\x3b\x41\xa7\x1d\x23\x5f\xdd\x68\x38\x68\xd2\x6c\xa9\x9b\xcf\x44\xf1\x27\x3a\xb3\xcb\x38\x3d\xc9\xdc\xc5\xf8\x62\x7b\xd1\x9b\x2a\xc0\x78\xee\xdb\x8c\x8a\x3d\xb3\x39\x52\x5f\x7e\x35\xde\xcf\x4e\xb9\x9a\xd3\x49\x98\xf2\x5c\x62\xe1\x13\xc3\x86\x6c\xc4\x5c\xae\x8a\xe1\xcd\xbf\x01\x58\xeb\xa0\x93\x6a\xf8\xf6\x84\x67\x4b\x79\xee\x94\xfa\x6f\x93\xa1\x99\xc2\xfd\x0e\xf9\xa1\x86\x3c\xe5\x62\x87\x95\x74\x52\xcd\xed\xef\x67\x43\xfc\x9d\x15\x30\x2f\xa7\x97\xd8\x86\xea\xd5\xeb\xbc\x9b\x34\x5a\xfb\x23\x64\x11\x72\xb6\x0e\x77\x18\x97\xbc\x5e\x82\x89\xce\xb1\xeb\xfd\x34\xe1\xa8\xbd\xa8\x60\x11\x5f\x18\x3d\xab\xf1\xc5\x29\x2d\x06\xee\x60\x93\xef\x59\x1e\x5b\x61\x7f\x4b\xcb\x2f\x9f\xd4\x3a\x5b\xcf\x8b\x80\x37\x31\x13\x48\x8a\x72\x2d\x9b\xe6\xb8\x1f\x75\x77\xa0\xe3\xb6\xc1\xe4\x2f\xc6\x80\x4b\x45\x93\x25\xfe\x72\xc3\x9a\xec\x5e\xa6\x74\x35\xc0\x9e\x5a\x6f\x71\x43\x20\xfe\xd9\xfd\x53\x4f\x67\x17\xef\x32\xc8\xdb\x6d\x7c\xbe\xcd\xb7\x15\xb5\x37\xb6\x08\xf3\xf0\x6b\xe0\x76\x64\x3f\xf1\x13\xf2\x66\x13\x8b\x9a\x76\x17\xe8\x6c\x14\x6d\x74\x5b\xd1\xc7\xda\x3c\x15\xb8\x77\x78\x7f\xa3\xcf\x45\x45\xa3\x50\x84\xc7\x21\x2e\xd3\x00\x6a\xd6\xa9\xea\x81\xd6\xe5\x96\xf9\x4c\xd0\x9b\xbc\x09\x65\x45\xb6\xe9\x39\x54\x79\xb2\x11\xc6\x74\xc4\xfd\x7e\x85\xc3\xe7\xf7\x77\x48\x74\x33\xca\xb1\xac\x69\xf6\x97\x94\x54\xb1\x25\x98\x27\xf2\x00\x2a\x92\xe2\xbb\x7f\x9a\x44\xae\x16\x8f\x87\xf8\x78\x4a\xe6\xfb\xe3\xcc\xa9\x36\x68\xe2\xe4\xab\x76\x81\x4a\x82\xec\x97\x85\x25\x32\x67\xe2\x28\x68\xa9\xd9\x9e\xff\xb9\x57\x82\xe6\xb2\xc5\x9d\x51\xde\x92\xb8\x9e\xa8\xd9\x9d\x7a\x16\x82\xca\xfd\xc6\xf1\x53\x57\x6b\xc5\x0a\xcd\x75\x8e\x84\x5a\x24\xc1\x7b\xc8\x97\x76\xc6\x26\xf2\xe4\x1f\xa7\x0a\xcc\x73\xc5\x95\xd2\x2c\x39\x85\x7e\x1e\xe1\x9b\x19\xc5\x82\x8a\x88\xfc\xe2\xd3\x57\x42\x79\xdf\xe6\xc5\xbd\x14\xf4\x52\xeb\x01\xa7\xfc\x17\x13\x96\xcb\xae\x5e\x3c\x37\x89\x76\xfd\xcf\x8c\x86\x7b\xf4\xbc\xd9\x5d\x65\x0a\x36\x0d\xcf\x1a\x53\x68\xeb\xeb\x41\xf0\x8f\x73\xc6\x68\xac\xa6\xb7\xfc\xf5\x79\x6e\xcc\xd2\xcb\xed\x4b\xf2\x51\x08\x32\x85\x78\x95\xcf\x6b\xde\x47\x6a\x5c\xc3\x55\xd0\x50\x12\x45\x89\x32\x7b\xc9\xcd\xae\x6a\x8f\xb1\x48\x7f\x7b\x72\xd2\x2d\xee\x1c\x7e\x6c\x74\x2a\x94\xf2\x86\x90\x2c\xc9\x74\xc6\x44\xe1\xca\xd9\x2e\x58\x34\xbb\xf1\xa5\x5e\x49\x2b\x4d\x84\xfb\xa2\xde\x31\x06\x8d\x90\xde\x93\x01\x18\xb3\x35\x4c\x7c\x8d\x00\xa3\x5b\x70\xa6\x23\xfd\xe0\x8a\xcd\x06\x1a\x33\x7e\xd6\x7c\x40\xf0\x9b\x52\x90\x63\x49\xbf\xfe\x13\x5b\xd2\x4f\x9d\xee\x58\xfc\xe2\xd2\xdc\xc5\x2c\xe2\xe5\x5a\x30\xdc\xea\xef\xad\x52\x46\xd8\x9f\xb8\x6b\xf5\xbe\xd0\xfb\x99\xec\x88\x4d\x71\x21\x8d\xcc\x18\xf1\xf8\xfe\xbe\x33\xd4\x6c\xbc\x4f\x1f\x0b\xbe\x9f\x5d\x29\x9f\xad\xc3\x24\x56\xd2\x95\x0a\xe5\x7b\xa0\x37\x66\x6c\xf8\x6b\x53\xee\x4c\x15\x9f\xff\xee\x42\x52\xd7\x42\x68\x8d\x87\x2e\xc9\x57\xd1\x36\x04\x81\x25\xdd\xe5\xbd\xe7\x2b\x2d\xe9\x16\x6e\x5d\x09\x9a\x05\xdf\x4d\xb8\xe0\x31\x49\x4b\x95\x27\x60\xf7\x42\x42\x08\xd1\xf9\x5b\xb6\xfa\x48\x68\x8f\xb3\x34\xd6\x84\xd0\xee\xce\x9f\xc4\x5f\x4d\x09\xf7\xf4\x11\x5b\xe6\x45\x59\xab\x03\x4c\xb3\x9d\x4b\x4a\x60\x86\x11\xc4\xf3\x9d\x0a\x09\xb1\xdc\xac\x82\x3f\x4f\xd6\x19\x9f\xca\x09\x49\x44\xf8\xc1\xcc\x55\xcb\x37\x87\xf7\x22\x23\xb8\x7a\xee\xc6\x2e\xa3\xec\xb5\x44\xfc\x44\xf6\x6f\xe5\x42\xc3\x46\xad\x51\x62\x4f\xe0\x37\x4d\xc0\xd6\x6f\xe9\xaf\x47\x02\xd7\xc9\x15\x34\xb0\xf2\xd5\x58\x54\x45\x26\xda\x02\xd3\xdb\x60\x30\x7a\x3a\x26\xbe\xfe\x58\x15\x9f\xdd\x7a\x8b\xea\xfb\xda\x12\xef\x85\x41\x0e\x3f\x97\x93\xa1\x83\xc4\xbe\xef\x0e\xb2\x63\x8c\xce\xcf\xd0\xe1\x38\x9c\xf2\x27\xd2\x13\x49\x65\xa2\x29\x77\x55\x7e\xf0\xbf\x6c\xf5\xd2\xcd\x31\x6f\xf3\xfe\x77\xd6\xf4\x53\x1e\x4f\xd5\x7c\xe3\x41\xc4\x60\x5a\xd0\x5d\xa2\xbb\xe7\x80\x7b\x4e\x72\x31\x7c\x96\x07\x86\xe4\x66\x6f\x54\x9a\x28\x65\x68\x2a\x84\x62\x53\xa5\xc8\x89\xc6\xfc\x99\x04\xeb\xa7\x7c\xcf\x2a\x9b\x45\x2b\xce\x44\x67\x39\x41\xc9\xe9\xe5\x4b\x94\xf3\xb5\x24\xbd\x8f\x1f\x1f\x03\xc1\xe2\xf6\xcf\xd9\x7c\xfe\x9e\xcd\xe3\x91\x77\x9f\xd4\x91\xb5\x35\x50\x22\xd4\x7f\xc6\xfd\x44\xeb\xf5\xf0\x64\xc2\x3d\x04\xd1\x4e\x0c\xca\x9f\x49\x0d\x56\x8c\x96\x2d\x2f\xc7\x0b\x69\xf6\xad\x2f\xcd\xf6\x23\xe6\x48\xf6\xed\x7f\x72\xbd\xa7\xb6\x3e\xc3\x08\x82\xb0\x1a\x63\xfa\x92\x1c\xb2\x7f\x90\x5b\xbf\x37\x08\xe2\xc5\x62\xd9\xe7\x1f\xf1\x45\xfd\xce\xb2\x8c\xfa\xb1\x0b\xed\x67\x19\xb0\x76\x71\x2b\xde\x44\x83\xf7\x96\x73\x2b\x77\xa3\x03\x05\x19\xea\x6b\x64\xad\x42\x40\xa9\xe7\xa5\x48\x39\x42\xd5\xa8\x18\x3d\x44\xe5\x73\x89\xdf\x86\x01\x44\x51\x06\xcd\x44\x65\x71\x47\xf4\x33\x13\x07\xa2\x93\xd0\xdd\x6a\xc7\x31\x77\x42\x77\x82\xf6\x7d\x25\xdf\xaf\xf8\x37\x96\x8a\x07\x6c\x42\xdc\x97\xb6\x68\x75\x7a\x09\x07\xcf\xc1\x28\x13\x0c\x90\xc6\x63\x2f\xa2\xe9\xce\x17\x5e\x28\x87\xc6\x7b\x7d\x38\x95\xd6\xea\x00\xd7\x4a\x72\x98\xbd\x75\x8e\x40\x4a\x1a\xa2\xe8\xb0\x08\xc7\x71\xb4\xd7\x8c\xca\x2b\x9b\xd9\xd0\xdf\xf7\xd0\xad\x9d\xa0\xb6\xb8\xcf\x45\xd4\xb1\x8d\x42\x59\x35\x2b\x55\xf9\x49\x38\xbf\x73\x72\x71\xc9\x15\xe8\x4f\xc7\x20\xb1\x78\x10\xce\x91\x87\xba\x14\x1c\x88\x18\xb6\x96\xdb\xfe\x5c\x84\xea\xaa\xc4\x4a\xdc\xcf\x70\x64\x89\x52\xb1\xf0\xe5\x91\x26\x60\x4c\x85\x10\x4d\x7f\xde\xb1\x50\x92\x88\x94\x21\x6c\xe9\x79\xf0\x83\xa0\xcc\x3c\xcf\xed\x04\x03\xd1\x29\x4e\x7f\x82\xfe\xbd\xc2\x57\xc7\x41\x20\x14\xcb\xe3\x91\xab\xb9\xfa\x57\xd4\xab\x3f\x6c\xc9\xf2\x3f\xcb\x40\xb8\xc4\x4a\x95\x2b\xdc\x3f\x5b\x1e\xee\x39\x92\xc7\x45\x79\x9c\x8a\xfc\xc3\xff\xcf\xbe\x4c\x47\x94\xd0\xb8\x2f\xff\x29\xb4\x8f\x3c\x17\x3c\x8c\xf3\x45\xa7\xe9\x34\xba\x27\xf9\x7e\xf2\xa6\x4f\xd4\x95\x87\xc8\x0e\x0a\x89\x14\xe4\x0d\x25\x9b\xcb\x71\x3a\xbe\x82\x3f\x34\xf1\xf3\xfa\xf5\x50\xc9\x79\x2d\x73\xdc\x0f\x99\x29\x05\x1b\xa0\x9d\x85\x69\x5c\x20\xa9\x34\x46\x21\x76\x97\xef\x8a\x69\x62\x0d\x27\xd0\x19\xba\x1a\x76\x86\x20\xac\x3d\x52\xb4\x54\x05\xbd\x3e\x4f\xcc\x83\xee\x3e\x5c\x40\xa9\x8d\x95\x29\x0e\x4b\xa2\x7d\x3f\x54\x72\xd5\x49\x6b\x4e\xdd\x46\x8e\x08\xf7\xb7\xc6\x43\x52\xbb\xa9\xe7\xda\xf3\x56\xd3\x4a\x76\x73\x8a\xc1\x03\x2d\x9c\xdf\x78\x7c\xb2\x5f\x7a\x77\xaf\xbd\x61\x60\x96\xc4\xfc\x60\xd1\xe0\xcd\x22\xb0\x2b\xc7\xc8\xea\x15\x52\x55\x2b\xf1\xd2\x01\x42\x82\xdc\xa1\x5b\x87\x1c\x4d\xd4\x58\x1f\x78\x4d\x66\x9f\x32\xed\x57\x38\xc7\x78\xda\x0b\x93\xe5\x9c\x2a\xd0\x23\xa2\xef\x9e\x54\x4e\xdb\xb2\x1b\xba\xf1\x8a\xa3\xf6\x78\xd2\x3b\x06\xf7\xaf\xac\x21\x91\x82\x68\x7a\x25\x3e\x5f\xbf\xfa\x41\xa9\xbb\xd0\x52\x09\xcf\x6e\xdc\x19\x86\x0b\xe3\x87\x02\x0b\x19\xf3\x72\x04\xc9\xc1\xd0\x0a\x68\x4f\x04\x18\xc3\x20\x30\xb8\x54\x4e\xfe\xc8\x7a\x8f\x20\xa2\xf9\x60\x64\x77\x0e\x35\x88\xb1\x2c\x1d\x6b\x1d\xd6\x97\x02\xfe\xc0\x3b\x00\x36\x01\x50\xcf\x49\x12\x69\xbd\x5e\x7a\x89\x4e\x1b\x9e\xa6\x9c\xb3\x4e\x5e\xc7\x23\xdd\x09\xe6\xf7\x6c\x67\x33\xf0\x3e\x3f\xf9\x82\x1d\xee\x16\xfa\xf3\x7c\x53\xa8\x4f\xef\x0a\x10\x88\x9d\x10\x4c\xe0\xfb\x59\x0e\xf2\x85\x4e\xd4\x19\x1b\x30\xde\x9b\x2f\x4a\x49\xbe\xd4\xfd\x96\xad\x6f\x69\x37\xec\xf0\x08\xaf\xf7\xb2\x1f\xdb\x22\x64\xfe\x32\xfa\xe9\x45\xc5\x02\x53\x93\xdb\x8e\x60\x4b\x91\xc2\xac\x9d\xa7\xef\xfb\x2d\xbd\xf4\xf1\xf1\x46\xc7\x83\xc4\x2c\x6f\x5b\x2c\x8c\xf0\x18\xc5\xdd\x6e\x0b\xf6\x60\x13\x8e\x67\x2d\x24\xb6\x15\xa1\x61\xbf\x77\x7e\x03\x21\xf8\x14\xb1\x65\x68\x48\x36\xdf\x86\xaf\x23\xb4\x80\x23\xec\xdd\x68\xd6\x39\x23\xd4\x06\x10\x77\xaa\x34\xb4\x71\x09\x1c\xc1\x09\x02\xd0\x4f\x78\x2c\xd8\x28\x77\xe3\x94\xd3\xcf\x87\xad\x7a\x2c\xf2\x2a\xbf\x48\x8b\x7a\x53\x51\x82\xc4\xcd\x81\xe7\xce\xd1\xb5\xf7\x88\xd9\x5d\x8a\x01\xa0\x01\x28\x4e\x7c\x3e\xbe\x51\x6b\x33\x70\x43\x09\xe6\x53\x69\x16\x95\x7a\xaf\x3d\xae\x1f\x67\xfa\xcb\x6d\xe4\x67\x19\xb6\x6b\xb6\x68\x1b\x6d\xc3\x78\xc5\x19\x33\x5a\x1f\x6b\xba\xe2\xc6\x4b\x22\x40\xd3\x84\xac\x9c\xcc\x13\xbd\xed\xe0\x9e\xf7\x53\x5a\x5d\x65\xc5\x99\xfb\x33\x1a\x9e\x7e\x22\x6f\xde\xc4\x37\x2a\x56\x9e\x91\x70\x00\x7e\x07\x20\xdc\x95\x72\x32\x01\x9c\xfb\x1d\x54\x9f\x34\x4c\x13\x71\xb5\xbe\xcd\xd2\x35\x4d\x9c\x58\x0a\xc3\x90\x46\x78\xf0\xea\x33\xff\xf5\xb0\x10\x23\xf4\x56\x9f\x47\x28\x98\x4b\xfc\xe6\xd9\x9a\x7d\xe6\x80\x7c\x20\xdb\xae\x0f\xd3\x3d\xd8\x13\xbd\x8d\x3f\x77\x11\xa8\xfa\x65\xce\xb9\xee\xdc\x5e\x48\x30\xb0\x9d\x89\x69\xde\x70\xc5\x55\xd6\xd7\x1b\xd3\xec\x1c\x02\x1b\xb0\xbb\x75\x2b\xbd\xa1\x13\x84\x30\xcf\x0c\x71\x4f\x0e\x2d\x6b\xd1\x8e\x3c\xfb\xee\x7b\x45\xc9\x75\xba\x1f\x07\x63\xcb\x60\x74\x9e\xdc\x2f\xfe\xfe\x4e\xd3\x3e\xd3\xc8\x3c\xdd\xfe\x92\x70\xfb\x07\x47\xa5\x6d\x75\x67\x40\xbb\x00\xd9\xe2\x8d\xd9\xa8\xd3\x78\xd0\xb9\x8d\x98\x30\x07\xd8\xa8\xc5\x01\x36\x3c\xee\xf5\xa2\xf8\x82\x14\xb8\x70\x0f\xf2\x9d\xb6\x1b\x4c\xb7\x87\x01\x9f\xaa\x6d\xdf\xb6\x51\xc9\x01\xd3\x87\x3e\x33\x6e\x44\x9d\x9e\x3e\xb8\x53\x82\x9d\x49\xf5\x89\xf3\x7d\x69\x84\x89\x7f\xc5\xe3\xae\x9d\xf5\x20\x26\xd7\xaf\x34\xca\xc1\x65\x87\x5f\xcb\x3c\xc8\x91\xe7\x43\x1c\xdf\xdf\xf9\x2b\xe1\x1b\x40\xc1\x0e\x18\xec\x5c\x62\x9e\xad\x8f\xa7\xf6\x26\x98\x96\x06\x48\x84\xa7\xfd\x48\x3e\x6b\x9c\x69\x99\x15\xf6\x8a\x8c\x3c\xa0\x18\xec\x1f\x76\xe5\x35\x01\x10\x6a\x78\xc3\x78\x2d\x33\x78\x4f\x8c\x3e\x03\x86\xd9\xaf\x4d\x16\xd7\xf9\x61\x2e\x39\xff\x2c\x02\x9e\xb3\xf7\x44\x0a\xb3\x25\x38\xbc\x37\xfd\xaf\x97\x91\xcc\x70\xa8\x3f\xdb\xee\xf2\xc2\xdf\x57\x97\x4e\xd0\x64\x4d\x1c\x1d\x04\xf9\xe0\x32\x04\x26\x38\xbd\xcd\xe3\xd5\x11\xd8\xc7\xc9\x99\xb2\x07\xcc\xb9\xec\xfe\xfc\x34\xef\xf8\xd4\xed\x06\x8d\x0c\xe1\xfe\x30\xa5\x1f\xef\xc4\xf8\x11\xc7\xc7\x37\xc7\x11\x0a\x00\x42\x43\x73\x80\x15\xa1\xbf\x7f\x22\xaf\x9d\x11\xfa\xdc\xf3\xe4\xb1\x87\xa5\x40\xcc\x58\x87\xf3\x42\xb4\xe1\xeb\x14\x61\x63\xe0\xb8\x6f\x39\xe4\x7e\xef\x25\xf7\xd4\x50\x48\xdd\xa8\x3b\x73\xdc\x9c\xb6\x34\x13\x2e\x5a\xb5\x16\x82\x37\xce\x11\x03\x28\xc6\x63\x09\x8d\xb3\x9c\x1b\x5a\xf3\xb4\xcf\x04\x00\x85\x81\x61\x27\x33\x87\x35\x87\x33\x52\x1b\x1d\x8d\xa3\x9b\x91\x52\xf9\xad\x71\xf1\xf2\x09\xf4\xce\xdf\x7b\xdb\x27\xfc\xcc\xc7\x32\x6f\x5b\x23\x62\xdd\x19\x00\x95\x18\xe4\x0a\xc2\x05\xc7\x26\x1c\x1e\xd8\x71\xde\x8f\x48\x18\xa6\xe9\xb9\x8b\x82\xfa\xeb\xa9\xfa\x70\x88\x7d\xc6\x5a\xb4\xb3\x42\xf5\x3a\xc3\x2e\xec\xb2\x83\xcc\x3e\x8a\xaa\x73\xce\x12\xed\xbb\x0e\x99\x3b\xc0\x34\x2a\xe7\x46\x6d\x5f\xe1\x04\x10\x84\x81\xe9\x8a\xf3\x5c\xa7\xea\x8a\x39\x69\x0c\x9c\x29\x97\x9f\xfc\x6c\x69\xfc\x6f\x86\x8a\x5e\x85\xb8\x4a\x0e\xa8\xbe\x07\xcc\x12\xb2\x73\xf3\x5d\xf3\x94\xc8\x89\x95\x21\xe8\x7e\x99\x25\xeb\xd6\x3f\x6b\x4e\x68\x82\x3e\xa2\x27\xa3\x63\x3b\xc5\x63\xe6\x20\xfe\xab\x2f\x2a\xdd\x34\x75\x53\xdf\x24\x3a\x26\x20\x53\x8a\xfc\xc2\x13\x1e\xa9\x83\x69\x29\x60\xc0\x8e\x2c\xfe\xac\x77\x2b\x9f\x27\x14\xc8\x01\x46\x40\x40\x92\xc3\x3c\x9f\x26\x5e\x6a\x7b\x4e\x48\x1f\x7d\x44\xb7\x1a\x6f\x0d\x1b\x25\x13\x5d\x38\x43\x3c\x93\x00\x03\xf4\x0c\x40\x3e\x05\xe1\xec\x79\x99\x5e\xa1\xf9\x4e\xd0\x31\xc1\xf4\xf8\x4d\xe7\x36\x7b\x97\xa3\x2b\x8f\x8c\x07\x36\x55\x3f\x8f\x96\xbe\x18\xef\xe3\xba\x58\x4d\x07\xbf\x5a\x77\xfe\x69\xfa\x02\x81\xb9\x41\x90\x46\xc4\x73\xa0\x75\x5b\xf2\xbb\x8f\x42\xe6\x06\x05\xf6\x35\x26\xe0\x79\x80\x20\xb4\xfa\x6c\xe7\xc7\x29\xde\x09\xa0\x73\xda\x57\xc9\x1f\x68\xd1\x35\x70\xc3\x77\xac\x95\x35\x1f\xac\xab\x9d\xa2\xbe\x99\xe2\x99\x90\x42\x46\xa7\x00\x88\xb3\x1d\xdf\x08\xdc\xa9\x89\x9e\x00\xe0\xc9\x81\xbb\x07\xa0\xa3\x51\xa4\x71\xd2\xe1\xcb\xa4\x08\xae\x9f\x9e\xc2\x0b\xef\xcd\xa3\xac\x6d\xdf\xa4\xd3\xe5\xae\xf0\xf3\xf7\x2e\x79\xcf\x1f\x32\x83\x29\xed\x75\x9c\x8c\xf0\xd8\xf7\xd9\x0c\x29\x7e\x1c\xba\x3d\x34\x00\x10\xf7\x1e\xec\x2f\x0a\x77\x43\x65\xe6\xa5\x7d\x97\xa7\x09\x61\x28\x32\xfe\xf9\x3c\xe9\x66\x21\x17\xaf\x1d\x62\x98\x93\xde\xba\x46\xfc\x1c\xa2\x77\x6d\x92\x88\x6c\xa8\xf2\x3c\x33\x7d\x87\x80\x3c\x13\x41\x25\x2d\xdf\x97\x3c\xec\x07\xf0\x01\x73\x11\xe0\x5e\x09\x72\x66\xfd\x86\x6e\x9d\x09\x41\xe0\x3c\x96\x25\xb6\x31\xe1\xec\xfb\x34\xee\xbb\x05\xda\xfd\xf6\x0d\x3f\xc3\x66\x7a\x6c\x69\x40\x90\xe4\x3a\x11\x26\xac\x28\xb1\x48\xad\xe7\x48\x3a\x02\x60\xc2\x72\x3b\xfd\xde\x6a\x79\x87\x00\x20\xa1\x00\x73\xd3\x18\xbc\x37\x88\x56\xf5\xad\x66\x35\x03\x90\x73\x8c\xad\x8c\x40\x20\xa2\x49\x5d\x13\x67\x5f\xef\xba\x3c\xb8\xc7\x78\x46\x40\x94\xb8\x7d\xdf\x6f\xd5\x4b\x8b\x90\x75\x02\x84\x97\x32\xcc\x8d\xda\x0b\xf1\xaa\x19\xfd\xe7\x1c\x5f\x62\xce\x9d\xe5\xa9\x34\x93\x35\x13\xc4\xe6\x3e\xed\xc7\xfa\xcb\xa5\x78\x29\x5c\xfc\x93\x4a\x7d\x0f\x0b\x82\x3c\x86\x9a\xa4\x14\x4b\xf6\xf9\x0c\x7b\xbb\x2c\xcb\xb6\x01\xf0\x7c\xd2\x34\x7b\xed\xe6\x89\x8e\x72\x6b\x31\xcc\xbd\x67\x10\xa1\xfa\x04\xc8\x80\xfa\xae\xf8\x9d\x7e\x86\xfd\x63\x21\x00\x6a\xb6\x78\x65\x3b\x57\x88\xc9\x5b\xa0\xfd\x88\xd9\xc1\xbc\x03\xc0\xb4\x3b\xb8\x94\xf7\x56\x61\xcb\x26\xd0\x34\x02\x01\x29\x0a\x6e\x84\x05\x8a\xb1\x50\x6f\x71\x17\x22\x1a\x67\x83\x4c\x22\x76\x6d\x17\x69\xee\xfc\xfe\x6a\xcb\x03\xe5\x23\x36\xb3\x5d\xe6\x69\x12\xa5\x73\xf5\x67\xc5\xb4\x24\x11\xd1\xa7\x22\xb9\x1a\x66\x00\x8c\xd9\x07\x7b\xbc\x83\x85\x6e\x84\x6f\xb7\xb8\xdb\xce\xeb\x77\x9e\x01\xf6\xc1\xc9\x58\xb6\xbe\x7b\x04\x45\xbd\x12\xbd\x60\xb8\x8e\xf9\xe0\x65\x84\x70\x53\xdd\x81\xcb\x80\x24\x0d\xa0\x98\x35\xa4\x08\x00\x50\xdf\xf7\x2d\xd3\xca\xf6\x05\x82\x1d\x10\x00\xc0\x1d\x80\xd1\x07\x4c\x48\x02\x5e\x34\xe0\xb4\xe2\xe4\x3d\x4b\x95\x29\xa1\x43\x3c\x13\x4b\x5a\x3d\x31\xf5\x77\xe6\xa8\xc8\x8a\x3b\x61\xb9\x8b\x69\xdf\x20\x9d\xeb\xde\xef\x8b\xb2\x61\xbb\x60\xa8\x65\x22\x47\x38\x68\x10\x3d\x49\x9a\xeb\xb6\x6b\x9f\xe4\x0d\xe7\x8c\xd8\xe9\x94\x21\x88\xfd\x66\x00\x1b\x06\x39\x17\x04\xc3\x73\x67\x6c\x8a\x72\xbe\x95\x13\xcd\xfb\x0c\x84\xb3\x0a\x71\x26\x1d\xd7\x6a\x7a\x13\x9a\x9d\x02\x84\xe8\x73\xc0\x4e\x00\x5c\xed\x45\x94\x96\x29\x6d\x3b\x01\x19\x02\x90\xa8\x93\x6e\x5b\xee\x78\xce\x71\x90\x9f\xc7\x10\x6e\x7e\xcb\x52\xc1\xdc\xae\xb1\x87\xcd\xc2\xf7\xd0\xf2\x66\xf6\x41\x23\xbb\xff\x40\x24\xe5\x49\xfb\x28\xd1\x15\x14\xfd\x38\x4f\x72\xfe\x04\x7d\xc4\xcc\x51\x77\xa2\xa6\xe5\x26\x76\x91\xf2\x34\x93\x27\x7a\xd7\xb6\x27\xc9\x64\xdd\x79\x25\xad\x72\xa0\xf9\x0c\x41\x0d\xe8\xe6\x06\x08\xcd\x00\xaa\x63\x26\x5a\x9f\xf5\x24\xc3\xb5\x3a\xb8\x21\xc3\x36\x7d\xd9\x21\x4c\x13\x7a\xcf\x82\xd5\x24\x05\xab\x3a\x39\x18\x66\x33\xad\x60\x0e\xa6\x37\xc3\x0c\xb5\x10\x34\x99\x2e\x3c\x79\xc0\x43\x45\x6e\xad\x1d\x20\xd1\x0e\xb6\x5d\xd0\x6b\x3b\xbe\x35\x31\xa7\x4e\xdb\x30\xb8\x82\xd4\xf9\x5e\x5d\x26\xe8\xd2\x18\x85\xc6\x84\x47\xfa\xd7\x79\xaa\xbf\x5a\x06\xe5\x45\x46\xdd\x38\x71\x25\x8a\x04\x6b\xcd\x91\xfb\x20\x3c\xd7\x34\x05\x4f\x4a\x43\xd9\xd3\xea\x99\x89\xde\xea\x05\x61\x37\xde\x6b\xd7\x08\x21\x56\x3a\xec\xcc\xe6\x69\x22\x25\xbe\xdd\x00\x76\x09\x60\x81\x0d\x20\x49\x4d\x58\x74\xb9\x92\xba\xf2\x14\x44\xea\xda\x46\x4f\xcd\x0e\x73\x1c\xb9\x36\xd7\xea\x9c\xab\xf3\x9c\x54\xf0\x82\x70\x51\xb1\x6e\x03\xf2\x34\xd1\x34\x60\x83\xe8\xa7\x14\x20\x7b\x4d\x9e\x0e\x50\x3c\x6c\x0d\x76\x80\xb8\x39\x50\x3b\x7f\xef\xec\xe6\xc4\xc0\xa5\xdd\x05\x0a\x0d\xdb\xde\x6f\x7b\x49\xf8\xdd\x9b\x15\x66\x41\x9b\x35\x20\xf1\x27\xde\xb4\x4c\x94\x62\xef\x7f\x7c\x5a\x44\x32\xc9\x94\x66\xcf\x73\x78\x29\x1c\xe7\xc7\xca\x46\x16\x10\xb2\x0f\xbd\x9b\x28\x79\xa3\xaf\x9f\x04\x69\x3f\x80\xcd\x22\xb9\x51\x1d\xe2\x5b\x95\x9f\x0f\x31\x66\x98\xfb\xbe\xe7\x7d\x4f\xe6\x3d\x1d\xa7\xbd\x27\x2d\x4d\x10\xfa\xfa\x18\x7c\x89\xcc\xb1\x6e\xc5\x6a\x40\x17\x17\x74\x5c\xd7\x0b\xe3\xed\xdb\xdb\x14\xc3\xa2\x5f\xb0\x67\x84\x60\x8f\xfd\x97\x56\x92\xea\xbb\xcd\x1b\x63\x80\x6e\x24\x98\x1e\x29\xcb\x5d\x4d\xad\x75\x60\x0a\xe5\x02\xfe\xbe\x19\x3e\x4e\x13\x54\xcd\xc9\xc1\x7c\x8d\x04\x60\x4b\x82\x06\xfd\xe1\xe8\x61\xf3\xeb\xbd\x72\x1c\x3d\x0a\x90\x9d\x3f\x49\x36\xd1\x74\x78\xef\x00\x22\x79\x6c\x9b\x52\x4b\x79\x04\xce\xb8\x37\x85\xe8\x86\x91\xc7\xd1\x44\xb3\xae\x6a\x9b\xc9\xe6\x2b\x6d\x79\x53\xec\x79\xe1\x04\x31\x4d\xd3\x54\xb6\x73\xf7\x3e\xba\x1d\x08\x5a\xcc\x12\xea\x2d\xc5\x12\x42\x6f\xd8\x98\x39\x77\x0f\xa8\x7c\x1c\x56\x94\x22\x2f\xad\xae\x09\x9c\x96\x75\x90\x19\xf3\x1f\xb7\xeb\x60\xc0\x9e\x4e\x68\xcd\x33\xd3\xd2\x24\x85\x11\xfe\x7c\x6e\xbd\xdb\xed\x3c\xf3\x53\x5a\xee\xde\x3e\x47\x7c\x33\xd2\x2c\xcd\x9c\x55\x83\xe0\x8d\x0e\x81\xf5\xab\x4b\xe5\xb8\xd7\xa5\xd6\xc3\xca\x30\x37\xe1\x1d\x78\xc4\xde\x65\x34\x4d\xf3\x0f\x6e\xbd\xd9\xee\x8a\x35\x5a\xbe\x93\x5b\x35\x8c\x5d\x55\xa9\x2d\xcb\x11\xa1\x38\x02\x9d\x07\xb9\x94\xb9\x58\x4a\x80\x2f\xfa\x83\x33\x99\x38\x23\x56\x26\x0a\x10\x82\xa2\x28\x38\x37\xab\xc7\x64\x2e\xe6\xee\x4b\x5d\x40\x18\x68\xc4\xe7\x43\xad\x04\x90\x5a\x95\x5a\x5d\xdf\xef\x7b\xbc\xf3\x32\x3c\x86\xeb\x46\xbd\x34\x57\x67\x16\x3a\x66\xee\x71\x5c\xd7\x6d\xbb\xb1\x2f\x6f\x3f\x77\x98\x28\x25\x2b\x40\x48\x52\xfb\x99\x69\x57\x70\xdc\x4d\x52\xd7\x00\xa0\x23\x08\xee\x54\xf7\x84\xb8\x78\xfc\x72\xf4\xf7\x07\x81\x9b\x69\xeb\x44\xbe\xa9\xdb\x79\x60\x0c\xb1\xe3\x05\xe1\xef\x11\xfb\xa6\xeb\x80\x35\x8c\x5b\xbe\x2e\xb8\x13\xb1\xd4\x32\x14\x0d\x2f\xcf\xba\x58\x8d\x7f\x48\x82\x8b\xa6\x9f\x93\xc2\x42\xd7\xdf\xf3\x7c\xc2\xbc\xd5\x6b\x51\xee\xf3\x2c\x02\x61\x07\x09\x30\xae\x8a\x38\x55\x6d\x5b\x01\x90\x04\x80\x3f\x79\x7b\x2f\xfb\x97\x1a\xd5\x31\x73\x22\xdb\xba\xef\x06\xc3\xaf\x1d\x11\x87\x65\xd6\x8b\x0c\x52\xc9\xfc\xee\xcf\x33\xc1\x5e\xd5\x9e\xa5\x10\xc3\x2c\x2a\xd9\x94\x40\x08\x73\xa4\x32\x4d\x62\x53\xb3\xe2\xba\x4e\x4f\xa6\x40\x1c\xc6\x33\x53\xb2\x46\xb0\x44\x56\x61\xfc\x6a\xc5\x45\xed\x33\x40\x7d\x07\x30\xc0\x02\x85\x8f\x55\xd2\x33\x43\xb0\x89\xbe\xd1\xa6\xb6\xef\xa2\xd7\x33\xb8\x05\x12\xec\x38\x93\xee\x00\x9b\x19\x88\xfc\xa9\x95\x03\xda\xe3\x81\xc3\x0d\x59\xbd\xc7\x18\xa4\xa2\xd1\x8d\x60\xb4\x79\xfe\x6e\x9a\xa1\xe7\xb6\x96\x6b\x8f\xce\xd1\xb1\x08\xb1\xe7\x1d\x44\x53\xf9\x50\x09\x5c\x9c\xdd\xeb\x06\xb8\x86\x11\x6d\x72\x19\x03\xb2\xd3\x4d\xa2\x0b\x10\x61\xd2\x8d\x00\x39\x18\xd4\x3f\x5e\x6b\x03\xe8\x1a\xef\x45\x13\x1b\xbd\xcd\x09\x4b\x44\x6b\xb4\xfa\x33\xc3\x0c\xc3\xb0\x25\x4a\x9b\x4b\x1f\x7d\xfe\x92\x89\x6a\x80\xcd\x2c\x8f\x83\xf2\x3d\x6c\x67\x4a\x0c\xb0\xfb\xbb\x8b\x91\xef\x73\xff\xed\x47\x71\x9c\x0e\xeb\x94\x30\x0c\x1f\x55\x8e\x83\xf1\xdf\x1a\x04\x19\x00\xc4\x86\x44\xdb\xb2\xcb\xcf\xe4\x56\x6f\xe9\x60\x13\x4f\x3a\x12\xe1\xd9\x64\xbc\xb9\xc4\xdc\x37\xe0\x54\x46\xbd\x45\x9b\x6b\xdc\xef\xd5\x39\x45\x07\xbd\xd3\x73\x5d\x57\x43\x91\x43\x2f\x59\xd0\xb3\x60\x87\xae\xeb\xba\x7f\x2c\xde\xbe\x04\x76\x5b\xe8\x6a\x51\xc1\x22\xa7\xee\xcd\x88\xae\xa6\x30\x0c\x8d\x6f\x6b\x8b\x9c\x11\x93\x20\x9a\x80\x4d\x67\xe6\x87\x22\xf0\xea\xaf\xa5\xfb\x42\x15\x7e\x60\xce\xb0\xf5\x71\x69\xdc\x17\x55\xed\xf7\xa9\xdf\xea\xcd\x1f\x47\xf7\x3e\x9a\x66\x69\x1b\x79\xf4\xac\xd0\x6d\x5d\x37\xc1\xbb\x2c\x46\x91\x1e\xe6\x33\x0b\xf6\x99\x47\xe6\x99\x46\x26\x5f\xab\xa8\x35\xc2\x91\x7d\xa2\x97\xf9\x8a\xa5\xb7\x38\x0a\x00\xac\x11\x71\x20\xbc\x18\x38\x39\x4b\x24\x10\xd9\x66\xaf\x2d\x33\x47\x95\x02\xed\x9f\xe6\xd5\xb3\x10\x3e\x84\xbf\x83\x7e\x65\x48\x5a\xad\x9f\x25\x7e\xca\x7b\x9e\x41\x57\xd3\x20\xf5\xa0\x92\xf5\x4d\xd0\xad\x0d\xe1\xc9\xf8\x77\xdb\x0b\x76\x14\x33\x5f\x04\x41\x8c\x46\xde\x29\xc4\x1e\x9c\x6b\x9b\x1e\x80\xa5\xe4\x1f\xfc\x45\x46\xe9\x62\xff\xd4\xd7\x34\xcf\x52\x5e\x1e\xa0\x15\x4c\xce\xff\x82\xe2\xc1\x71\x96\x24\xa1\xe7\x91\x80\x40\x71\x22\x08\xf7\x21\xa2\x11\x80\xa6\x7b\x6c\x22\xbe\xf2\xb5\x8f\x2c\x47\xee\x53\x62\x47\x56\xc4\x1f\x55\xe3\xd7\x0b\x6b\x25\x6a\x76\x3e\xb6\xaa\xdb\x85\x7b\xc4\xf8\x72\xd3\xf0\x0d\x10\xb8\x87\x23\x25\xf3\x2a\xce\xdf\xfd\x91\xb7\xba\xfa\xf1\xd8\x00\xcf\xf3\xf9\xbe\x7f\x9f\x14\x43\x4e\xde\x47\xbb\xb1\xcf\xdb\xbe\x19\x0c\xea\xe7\xd2\x70\x53\x62\xac\x58\x7e\x97\x58\x77\x2d\x39\x89\x18\xd5\x7d\xdf\xd8\x4e\x3d\x3f\xfb\xbe\xf5\xfc\xbb\x2f\x1e\x8a\xf0\xd0\x7f\x63\x58\xfb\x6c\xbb\xfe\xa1\x7b\x16\xf6\xb8\xce\xbf\x8e\x8c\xab\x6d\x70\x39\x60\x92\x5b\x26\x41\x53\x1d\x04\x39\x2d\xbf\xf5\xe4\x8e\x00\x30\x14\xa9\x61\x08\x67\x08\xbe\x6d\xc3\x76\x82\xd0\x93\x68\xeb\x0c\x71\xba\x58\x1e\xb5\x85\x8a\x82\xb5\x02\xe5\x7e\xe8\xdf\xd9\xe7\x3b\xb6\x35\x1d\xe5\x18\x06\xa4\xd7\x4b\xcd\x74\x7f\x5e\x28\x37\xcd\xc6\x5c\x6e\xa7\x1e\x16\xa4\x94\x1b\xc6\x7b\x49\xef\xa5\xec\xa0\x93\x64\xd9\x75\x04\x21\x97\xc2\x28\x95\x30\x10\x25\x00\x01\x7d\x80\x28\x65\x69\x62\x5f\x87\x0a\x48\x23\x0f\x38\x79\xb8\xac\x5f\xec\x5a\x4d\x2f\x66\x02\x2a\xfc\xd0\x28\xc6\x0e\xc5\x1e\xfb\x0c\x45\x6b\x9f\xda\x55\x18\xb4\x54\x8d\xb2\xbf\x6f\xd4\x7a\x85\xdc\x89\x10\xf9\x7b\x68\xdf\x02\x71\x0f\xa4\xff\xa5\x6d\xab\x95\x6f\x2a\x5a\xbd\x03\xa0\x02\x67\x5f\x95\x96\xee\x9b\x4c\x4f\xd3\x30\xff\xff\xef\xdf\x0c\x1c\xc7\x19\x2c\x8b\x31\x5e\xd8\xf9\x53\xa2\xe8\xa0\x1b\xa7\x8a\x9d\x9c\xa6\x61\x1b\x16\xa8\x65\x3d\xb8\x2f\xd1\x99\xef\x94\xd4\xb9\xaf\x42\x30\x14\x27\x38\x83\x6a\xa5\x4c\x46\x41\x10\x84\xba\x69\xe2\xe7\x14\xf5\xf7\xee\xba\xa9\x95\x85\xdf\xe9\x5f\xbf\x50\x21\x60\xf2\x80\x61\xf6\xaa\x90\xde\x1d\x2f\xd8\x6f\xaf\x82\x00\x90\x47\x4a\xb9\x5d\x32\x66\xd9\x3c\xfa\xc0\x4a\xf5\xc6\x49\x89\xa5\xd7\xfd\x78\x23\x62\x0d\x93\x05\x67\xe6\x4f\xd5\x7e\x7f\x0f\x16\x34\x0b\x1a\xc1\xfb\xfb\xb1\x53\x15\x41\xb6\x37\x53\x2b\xe7\xf7\x71\x04\xbf\x18\xf0\xa3\xe2\x57\x5d\xd0\x9c\x00\x0a\x5c\xb5\x7b\x8a\x7c\xab\x46\x78\x8b\x61\xd5\xb2\x2f\xbf\xef\xb1\xd5\xc5\x19\x88\xbd\x84\x17\xb1\x77\x78\x96\x18\x42\x3d\xbe\x05\x67\x7c\x48\x4f\x99\x02\x6c\x62\x9c\x9d\x74\x8a\x07\xa4\x51\x12\x25\xfe\xfc\x63\x85\xfe\x72\x54\xe3\xd7\xcf\xf3\x24\xfc\x78\xfe\x63\x3f\xef\x04\xd9\x12\x81\x1d\x7b\x43\x00\x26\x6b\xa3\x4f\x3b\xc7\x8c\x78\x37\x18\x6e\x3c\xc3\x6c\x38\x88\x83\x85\x7b\x61\x3f\x48\x9d\xc3\x54\xc1\x71\xa6\xde\x79\x1c\x2c\xa2\x71\x0e\x8c\x33\xf3\xb9\x31\x1b\xad\xb4\x10\xf0\x89\x2b\x44\x96\xfa\xcb\x79\x1b\x5a\x1c\x52\x88\x50\x8e\xeb\xba\xe2\x01\x68\xac\xdd\x99\xea\x13\x6a\x73\x9c\x11\x0c\xd9\xe5\x20\x38\xe8\xfb\xa3\x4e\x6d\xce\x9c\x8f\x1b\x09\x47\xa3\x43\x22\xcf\xbb\xf1\x24\xc9\x72\x5a\x02\x81\xca\x89\x05\x31\x41\x62\x80\x2c\xf2\x56\x1d\xe1\xf2\x7e\xb5\xf6\x0e\x6f\x61\xab\xed\x10\x04\x61\xd5\xc7\x37\x85\x30\xf6\x7d\x9f\xd8\x61\x1a\x8c\xbb\xb9\xa3\xdc\xe3\x86\x08\xfb\xca\x47\xed\x8d\x5d\x49\xf9\x92\x4c\x9d\x81\xa4\x8f\xdf\x0b\xa3\x3b\x47\x6f\xa2\x7e\x0e\xc6\x9b\xa0\x10\x56\x7b\x96\xe2\x01\xa7\xd5\x1d\x88\x7c\xb3\x39\x7b\xca\x6c\x64\x32\x9a\xdf\x59\xad\x38\xef\xec\xee\xf9\xb3\x7b\x9d\x84\xfe\xe2\x8c\x1d\xbc\xaa\x1f\x28\x85\xf6\xe7\xed\xb9\x64\xa8\x9b\x02\xbc\x91\xaf\xfd\x0a\x46\x33\xa2\xba\x90\x34\x08\x60\xbc\x10\xe7\x55\xbe\x65\xe7\x7c\x63\xc0\xeb\xfb\x9d\xf9\x10\x73\x8e\xf3\xfe\x9d\x44\x34\x42\x6d\x13\xbe\xb6\xf9\x54\x0b\xbf\x3d\xd5\xd7\x9b\x95\xde\x06\x81\x7d\x5a\xe4\x63\x14\xf9\x2e\x28\x21\x11\xef\xe4\x97\x37\xc6\xfa\x8d\x18\x3b\xc3\x21\x08\x6d\x9c\x88\xee\x04\x1d\xdf\x8d\x53\x08\x32\x0d\x40\xd4\xab\x1c\x67\xac\x3f\x09\x8b\x80\x85\x37\x7a\x65\x50\x0d\x7c\x15\xb2\x7d\xe3\x69\x88\x7d\xd8\xf6\xd1\xff\xee\x35\xbd\xf9\x03\xc7\xaf\x04\xc9\xe7\xac\x8b\xbe\x41\x0e\xe9\x04\x64\x50\x21\x91\x47\xa3\xa8\x9c\x78\xb1\x83\xc6\xe4\x68\x85\x77\x74\x76\xb2\xf9\x3b\x27\x8c\x9d\x4b\xb8\x52\x95\xbf\x56\x4f\x83\xe1\xbe\x6f\x86\x38\xc7\x68\x7d\x96\xc0\x67\x80\x91\xe6\x69\xca\x5b\xa1\x1c\x3c\xc6\xaf\xf4\x9b\x8b\x5e\xe5\x14\x75\x03\x02\xd5\xb7\xc1\x0b\x20\x91\x28\x48\x67\xcb\xee\xcd\xa9\x99\x87\x0f\x9d\x2b\x40\xce\xb2\x0a\x25\x96\xc2\x8b\x7d\xa8\x31\x7f\xce\x10\xdc\x0c\x81\x8a\x65\x16\xce\xdb\x6a\x18\xbb\x8f\xb6\x13\x11\x73\x1c\xbd\x0d\x55\x91\x23\xb0\x4c\xb9\x21\xe3\x64\x87\xa3\x1a\x05\x5c\x6d\x04\xbf\xcf\x7f\x9e\x47\xd4\xc7\x29\x3a\x75\xc9\x14\x00\x28\x54\x41\x30\x7c\x86\x2d\x5f\xa6\x34\x5b\xe8\x6a\x8b\xfc\x03\x69\xe8\x74\xdb\xa0\x60\xa0\x64\xf3\x1e\xad\xca\xe1\xe5\xd3\x53\xc1\xf3\x8b\x61\x69\xef\xd0\x96\x63\x7c\x9a\x05\x36\x7d\xbe\x4f\xb7\xe1\xef\xb9\xba\x33\xdf\x94\xb8\x8f\xc7\x9f\x9f\x1f\xcf\xab\x98\xff\x6a\x2f\x1e\xca\x93\x58\x99\x1c\xe5\x1e\x98\x66\xa3\x47\x90\xaf\x4c\xb6\x2b\xd4\x47\x4c\x15\x8b\x40\xb1\xf2\x21\x8b\x89\x2e\x00\x46\xfa\x1e\x48\xef\x54\xad\xec\xb8\x95\x64\xea\xd2\xe3\x66\x05\x7c\x6d\x23\xe3\x44\x55\xec\x94\x3e\xf2\x68\x52\x08\xa5\xf1\x59\x41\x66\xaa\x01\x2c\xd7\xc5\x4e\xe4\xb6\x5d\x5f\x3d\x9c\x41\xfb\xc1\xe8\xd8\xf7\x1f\xcf\xbc\x97\x93\x71\x37\xd2\x67\x00\xb9\x59\xbb\x19\x0d\x5e\xf0\x67\x9e\xcd\x10\x4d\x30\x68\x79\x92\x67\xb5\x28\x3a\x22\x5e\x01\xb8\xba\x2c\x17\x95\x32\x32\xc6\xa9\x25\xe2\xf4\x16\xdb\xee\xf3\xfc\xc9\x9d\xc8\x09\xc9\x84\x2f\x07\xdc\x28\xb9\x95\xc9\x88\x3c\x1f\x41\x1e\x4c\x4c\x71\x95\xdc\x6f\x3d\x7a\x7e\x34\xfb\x7d\xb2\x90\x80\xc8\x5b\xdc\x3f\x35\x07\x50\xb4\x72\x95\x7c\xcb\x6c\x81\xc8\x28\x5f\x3d\x5f\xef\x04\x85\xbd\xc0\xcd\xeb\x86\x3b\xc1\xfc\x91\x9a\xdd\x46\x70\x1c\x81\x8c\x26\x29\xb2\xe3\x9e\x75\x80\x1b\x04\x00\xf5\x13\x0f\xbb\x6a\x7d\xf8\xfb\x34\x5d\xec\xae\xe7\xc8\x8d\x33\x44\x42\x2e\xc3\xf3\xda\x8b\xec\x77\xde\x75\xc2\x3c\xc6\x88\x3c\xab\x05\x3a\xb7\xa3\x4c\x35\x7c\x57\x28\x01\x62\x0b\x06\x16\xc6\x1e\xbb\x2c\x9f\xb7\xf3\xb7\xa6\xea\xc2\xdd\xca\xf2\xf7\xbc\xcf\xcc\x9f\x63\xa6\xa7\xa4\x69\x77\xad\xaa\x93\xc9\xb5\x3e\x49\x92\x65\x91\xb6\x60\xfd\xe1\xdb\x21\x17\xed\xd3\x84\x0e\x20\xb3\x3d\xbf\xe2\x33\xfc\x0a\xcd\xaf\x67\x7f\xc5\xef\xbb\x07\x96\x2c\x47\xe4\xde\xcc\x7b\xd7\x75\x7d\x97\x23\xc0\x50\xd0\xab\x3f\xe3\xa2\xc7\x71\xc1\x4f\x7c\x15\xdf\x03\x1a\xf6\xfb\xb4\x5e\x83\x8e\xad\x9c\x9d\xff\xe0\x82\x15\xae\x9a\x1c\x5c\x0d\x0d\x86\x79\x66\x18\x1c\xdd\x22\xbf\x22\xbc\x12\x41\xae\x1e\xd0\x80\x3f\x27\x57\x7d\xaa\x83\xf7\xeb\x29\xc4\x17\xfb\x0e\x94\x69\x2c\xd3\x5c\x5e\x63\xf3\x07\xab\x82\x04\xfd\x49\x51\x8a\x5a\x6a\x65\x2d\xd1\x59\x81\x02\x96\xd1\x73\x29\x54\xc4\x62\x46\xa2\x4b\xf2\xa8\x64\x9f\x11\x87\xae\x55\x37\x89\x21\x3d\x0b\xfb\xe9\xaf\xa0\x66\xfd\x9b\x0d\x88\x04\x53\x2a\x67\xd5\x9c\xe2\xe7\x9d\xb0\x55\xc8\x66\x7a\x7f\x35\xf2\x3b\x23\xbc\x09\x23\x08\xc6\x3d\xa9\x60\x70\xed\x87\x2d\xf3\x7f\x7b\x68\xef\x27\x6a\x10\xe0\x9a\x4c\x94\x49\x4f\x7f\xa6\x55\x4c\xb3\xfd\x74\x03\x62\x6d\x50\xb8\x5a\x7d\x5a\xa7\x6b\x88\x1e\x29\x1d\x2c\x5e\x3b\x72\x66\xd4\x15\xa1\x77\xc5\xdf\xba\x49\xb0\xe8\x50\x36\x60\x7b\x86\x09\xf8\x92\x43\xec\x2f\xd5\x9d\x27\xbb\xa6\xd1\x17\xc2\xb4\xef\x04\x53\xe6\xb8\x6c\x42\x5e\x10\x88\x16\x4d\x7a\x79\xf2\x1e\x3a\xf9\x8b\xc9\x4d\xfd\xa9\xfe\xcb\xe9\xbe\x7d\xc4\xcc\xdc\x0d\x2e\x5a\xe4\xb3\x82\x75\xa2\x42\xc3\x36\x00\x1f\x02\xc1\xc0\x89\x72\xe6\x2e\x18\x79\xb5\x0e\x58\x80\xac\x75\x2d\x5e\x7a\xfd\xf4\x41\xcb\x37\xe0\xe0\x68\xc8\xdc\xd5\xe4\x7e\xf7\xf1\xcc\xa6\x79\xca\x68\xb8\xaa\x7a\x18\xf4\xc9\x42\x1b\xfd\x2d\x94\x48\x85\x2d\x7d\xed\xaf\x5c\x86\xc7\x1a\x81\x92\xc3\x16\xda\x4a\x18\x04\x44\x9d\xaf\x69\x9e\x24\x06\xca\x53\x85\xfc\xdd\x81\xec\xce\xd8\xe3\xaf\x2e\x4e\x94\xde\x6d\xb4\xcf\x17\xb3\x13\xb0\xc8\xfa\x89\x96\x1f\x9a\x38\x42\x15\x1a\xdf\x3f\xfe\x02\x11\xde\x0e\xae\xe9\x7d\xf8\x57\x53\xfb\xd0\x4e\x09\x46\xb8\xc9\xc6\xc9\x5e\x47\xfa\xac\x76\x81\x6c\xa2\x5c\xa5\x83\x66\x67\x51\x3a\xd8\x5b\xd5\xbf\x2e\x95\x9c\xc3\x4e\xd3\x83\x83\x24\x74\xdb\xc3\x20\x8d\x41\x2d\xf5\xdd\x36\xf4\xdc\x5e\xf6\x3e\x9f\xef\xc1\xe7\x40\x39\xc4\x7b\x25\x98\x6a\xae\xc6\xd5\x57\x94\x99\x68\xb0\x76\xdd\xc2\x8a\x7c\xbc\xc0\xfe\x8f\xc6\xf7\xd9\x35\xce\xd1\x31\x4c\x4f\xec\x83\xf0\x3c\x2c\x59\x1f\x22\xe5\x95\xb3\x89\x60\xc0\xda\xc3\x96\x11\xfd\xa8\xf6\xc2\xe8\xb7\xd1\x13\x33\x8d\x2b\x42\x5d\x11\x83\xb3\x5e\x04\x12\xde\x39\xeb\xb4\x86\x35\x4e\x94\x7b\x43\xce\xea\x91\x8b\x44\xf7\xba\xf6\x67\x65\x23\xc7\x75\xdf\xd6\xcf\xb6\xfe\x1f\x55\xd7\xb5\xeb\x36\xcf\x6c\x1f\x48\x17\xea\xed\x52\xbd\xf7\xae\x3b\x75\xc9\xea\xcd\x2a\x4f\x7f\x90\x7c\xc9\xce\x7f\x0c\x18\x89\x01\x6f\x52\x34\x87\x53\xd6\x0c\xd7\xa0\x16\x21\xee\x7e\xf5\x8d\x40\x9a\x3a\x86\x29\x21\x45\x4c\x28\xaa\x2b\x3b\x63\xed\x04\xc0\xcc\xb3\xa9\x22\x61\xc8\x7f\xf7\x6e\x25\xed\x46\x18\xf0\xfc\x46\x74\x9f\x6a\x1e\x76\x91\x1f\xcc\x76\xeb\xf2\x97\x1c\xfc\xd2\xc5\x52\xd8\x5f\x71\x59\xa1\x79\x4c\xbf\x10\xb6\x7f\xc5\x6a\x71\x27\xb6\x42\xe6\xec\x98\x1c\xb4\xb2\xab\xe2\x0c\x9f\x70\x03\xbf\x78\x79\x8e\xc9\x15\x2c\xf4\xa9\xde\x80\x09\x80\x00\x82\x6e\x61\x07\x4c\xb6\x81\xc8\xb4\xed\x43\x10\x05\xd0\xb5\x7f\x0b\x4f\xa5\x5b\xd8\x7b\x6e\x2b\x6e\xd7\xf6\x7d\xae\x74\xac\x7d\x18\xf6\xfd\xf1\x41\xa5\xc4\xfb\x04\xd9\x2f\xcb\x61\xdf\x54\x2e\x75\x9f\xdd\x38\xe8\x03\x06\x08\x04\xdd\x86\x45\x74\x41\x4d\x94\x58\x28\x07\xc0\xc9\x9e\x80\xb9\x96\x78\x7e\xef\xd4\xb5\x00\x0f\xc5\xfc\x82\x7e\x82\x3d\xd9\x81\x98\x99\xff\xa0\xc4\x0d\xbe\xa8\x28\x17\x96\x86\x97\xe8\xf7\x0b\x42\xc8\x87\xaa\x79\x2e\x7d\xb6\x9c\xcf\xc8\xbc\xfe\x22\xbe\x47\x9f\xfe\x1a\x7a\xb7\x0b\xab\x38\xa9\x0e\x13\xf8\x0a\x37\xe2\xa6\xe9\xa0\x31\x06\xf5\xc3\x81\x38\x0a\x17\x21\x7f\x41\x80\xaf\x9e\x62\x54\xb1\x1d\xe8\xb7\x3c\x1a\x8e\xe3\xfc\x66\x11\x72\x2c\xa9\x3a\x66\x65\xa2\xdb\xb9\x87\x2f\x75\x8d\xea\xc2\x67\x7c\x03\xe2\xb3\x75\x3d\x50\x39\xa5\x08\x40\x50\x42\xcb\x9d\x56\x87\xdb\x88\x10\xb6\xba\x45\xdd\x07\xf2\xfd\x43\x3a\xbf\x67\xbd\x69\xda\x43\x4c\x1c\x08\x52\x93\xff\xa6\x00\x75\x4c\x53\x0b\x1d\x74\x07\xd1\x1d\x15\x7b\xe8\x91\x23\x6b\x09\xe2\xac\x6c\xc8\x93\xf2\x2f\x2e\xb2\x57\xd1\x21\x54\x9c\x24\xef\xb3\x1e\xb9\x0f\x40\xd2\xd1\x2f\xc7\x73\x20\x08\xb2\x2e\x54\xd4\x27\x22\xb7\xd2\x3b\x2e\x7f\x2b\x32\x39\xab\x73\x78\xd3\xf3\x03\x85\x9d\x9b\xf6\x1b\x38\x03\x67\xb5\x81\xb2\x31\xae\x38\xf4\xde\x74\x41\x01\xeb\x9d\x4f\xb2\x14\xc0\x72\xfb\x05\xa2\x71\x84\xb3\x7d\x36\x51\xed\xc4\xbb\x6c\x9a\xc8\xf3\xfc\xed\x67\xce\xfb\x35\xf2\xbf\xce\x0c\x48\x17\x83\xbd\x6a\x9b\xf6\x65\xf8\x69\x6b\xc8\x1f\xfe\x5e\xe3\x5a\xe5\x0b\x04\xdf\x06\xdd\x27\xb6\x6c\xc5\x7c\x13\x13\x52\xce\x49\x33\xac\x40\x1a\xd4\xe1\xe1\x16\xc0\x6f\x8a\x9c\x04\x54\x59\xf2\xaf\x73\xdc\x1f\x22\x0a\xe9\x79\xe8\x7f\xa9\xb5\x38\x6a\x03\xae\xe1\x74\xb4\xad\x0d\x01\x08\x33\x85\xc2\xad\x13\xa5\x0c\xfa\xea\xbc\x5f\xee\x99\xb4\xec\x38\x73\x83\x27\xd4\xf4\xd4\xb9\x6c\x1b\x09\xe0\x09\x54\x10\x93\x2b\xb6\xb6\xb1\x13\xd6\x87\xc4\xbb\x04\xb8\x8b\xfb\xc2\xf4\x7f\x5c\x82\xcb\x52\xda\x4b\xfc\x92\x24\xa8\xe3\x34\x00\xa8\x77\x90\x2e\xda\x49\x23\x67\x46\x10\x00\x70\xa8\x3a\xbc\x88\xfc\x14\xcb\x10\xa1\x0b\xb1\x89\x50\x95\xd4\xce\x51\xca\x3f\xf5\xb7\xd6\x87\xe3\x9c\x6f\xe1\x8e\xaf\xbd\x44\x37\x1a\x4c\x50\xee\x3d\xa9\x77\x0c\x4a\x18\x01\xb0\x6d\x95\xda\x26\x34\x69\xbf\xbb\xa2\x0a\x44\x4c\xbd\x3c\x91\x1c\xa2\xc6\x00\x53\x8c\xa7\xb2\xef\x78\xaa\x4b\xe0\x21\x48\x5c\x52\x47\xf6\x6d\xbe\xff\xfc\xa5\xe1\x40\x73\xe2\xf3\x45\xa9\xa6\xa7\xc6\xc2\x96\xfb\x4e\x9c\x4f\xd5\x78\x39\xfb\x46\xed\xc3\xac\x00\x1a\xe0\xd1\xaf\x56\x55\x34\xae\xaf\xa7\xfc\x1e\x00\xa8\x86\x71\xfc\xf9\x96\xe8\x03\x06\x17\xbb\x51\x10\x0c\x60\xe9\x62\xf4\xa3\x67\x18\x52\x4a\x1c\x80\x99\xeb\x26\x36\x83\xf0\x19\xeb\x27\x01\xd0\xc0\x06\xeb\x43\x77\x2d\xf8\x73\x78\x26\xbb\x95\xc7\x17\x35\xf5\xf0\x44\x55\x57\x51\x8b\x20\x1f\xe8\x7a\xcd\x46\x7c\x1f\xbc\x7c\xa1\xc0\x2c\x34\x3f\xc1\x91\x5a\x0a\x87\xfe\xd4\x2a\xa9\x1f\xfb\x29\x09\x60\xca\xbf\xc8\x6b\x43\xf8\x48\xa1\x08\xfd\x4d\x25\x65\x94\x5a\xf7\x6c\x21\xab\x23\x68\x5c\xd5\x75\x18\x06\xc7\x72\xfb\xea\xd9\xb8\x79\x44\xed\xe6\x00\x98\x7e\x91\x7c\x81\x73\xe9\x2e\x5e\x56\xae\xce\x88\x24\x91\x35\x9a\x7c\x51\x36\x2a\xb2\x2c\x2a\x44\x2f\x4c\x81\x06\xf3\x08\x3f\xab\x13\x08\x43\x34\x85\xcb\x60\xf5\x42\x31\x9f\x40\xcb\xef\x71\x35\x3b\x10\x30\xdf\xd1\xf4\xd0\x96\x24\xc8\x22\x21\x14\x67\x5b\x8e\xf9\x98\x0d\xc2\x1c\x5d\xda\x06\x3a\x45\x8c\x56\x19\x03\xff\xc9\xd3\x18\xea\x70\x59\xf6\x4b\x2d\x3b\xba\xd0\x12\xd0\x69\x22\x1a\xfb\x38\xba\x72\x57\xc6\xcf\x0d\x1c\x0e\x67\x04\x67\x70\xf6\x8d\x51\x3a\x75\x50\x98\x7e\x0a\x5a\xd7\x58\x3f\x3b\xe2\xaf\x4d\x7f\x4a\xb4\x35\xcc\xb6\x2f\xea\xa5\x84\x7c\x90\x56\xd2\x49\x94\x0e\x89\x92\xe7\x4a\xce\x50\x10\xca\xb3\xcd\x8f\x8b\x2c\x14\xc3\x30\x9e\x64\x1c\x8f\xbe\xf1\xa6\xe7\x69\xae\x85\xf4\x75\x9e\x44\xbd\x69\x68\x49\x9f\x08\x99\x54\xb6\xcc\x86\x8f\xb2\x6e\x36\x11\x1f\x7e\x18\x0e\x38\x1a\xc7\xf1\x60\x56\x34\x87\x30\xd5\x3f\xbd\x96\x75\x04\xb8\xea\x23\x0c\xa4\xe3\xb2\x00\x00\x49\xd9\xbc\xed\xda\x3e\x04\xe8\x56\xf5\x12\xc0\xb6\xe8\xf0\x0a\x6d\x4f\xc9\x5c\x23\x05\x55\x36\x8a\x77\x30\x40\x96\x2d\x46\x15\x6f\x94\xbd\x4b\xfb\x79\x5f\xef\x8b\xc6\x25\x7c\x47\x56\xb7\x12\x87\x0a\xe6\x24\xbe\xe8\x96\xf3\x12\xe1\xd8\xae\xe7\xb6\x86\xde\x37\xde\xf2\x13\x53\x59\xb0\x91\x9c\x55\x2c\x4f\x30\x3d\xd1\x2f\x3a\x75\x83\xab\xbf\x2d\x5c\xc6\x01\x6c\x56\x35\x8e\x1b\xd2\x3a\x14\x47\xac\x5b\xf4\x28\x3b\xb2\xf5\xd3\x5f\x88\xe7\x7c\xe6\x45\x64\xbe\xc5\x89\x1b\x71\xdf\x4a\x6e\xb1\x5a\x7c\x8b\xe5\x01\xd6\x75\x5b\x1e\x3c\x99\xe1\x15\xce\xe0\x23\x8f\xb5\x7d\x7c\x91\xd3\x6d\x2a\xc9\x1f\xae\x59\xaa\x7f\xf9\x5c\x02\xaa\x0f\x60\x12\x27\x30\x1d\x15\x28\x68\x68\x8b\x9a\x04\x25\x96\xe1\x7e\xee\x83\x65\x05\xf5\xea\x57\x12\xb7\x6c\x9d\xbf\xd1\x76\x20\x70\x31\x87\xa2\x1b\x84\xe9\x97\x4e\xfb\x7d\xea\x7b\xcf\x94\xe9\x9b\xc2\x0a\xcb\x9f\x8d\x48\xfc\xb2\xc1\xe8\x1d\x92\xaf\xf6\x3d\xd7\x50\xdb\x0b\x6e\x65\xb8\xa2\x31\x5f\x9a\x8e\xfc\xbe\x57\xe8\x3c\x72\x61\xfe\x70\x07\x71\xd7\xb8\x10\x09\x92\xa3\x18\x5c\x51\x72\x9d\x72\xc5\xa8\xce\x99\xdc\x5e\x3e\x98\x97\x75\xbb\x6b\x74\xf2\x9d\xde\xf0\x59\xa2\x63\xf3\x90\x91\xa3\x16\xd9\x85\x0a\x9b\x66\x2f\x0a\x32\x8d\xd7\xf0\xc5\x05\x9d\xec\xa5\xdb\xd2\xcf\x41\x80\x95\x02\xe4\x49\xdf\x4e\x03\x81\x1f\x27\x47\xc5\xc7\x52\xfb\x63\x9c\x6b\x7d\x52\xc6\xda\x90\x1d\xd1\xf6\xe5\x49\xb0\x4a\xb2\xca\x5b\x43\x6b\xda\x20\xc4\xc6\x78\x16\xc3\x2a\xeb\x49\xb3\x16\x14\xdf\x48\x43\x23\xfc\x4c\xc7\x0f\x55\x92\x4d\x06\xde\xa7\x09\xa1\x68\xde\xb5\xac\x45\xda\x4c\x12\xfe\xd4\xb7\x18\x4a\xb9\x9b\xdf\x2f\xc5\x3d\x94\xe8\x10\x22\x0a\x16\x5b\x8a\x49\x2f\x48\x94\xd6\x48\xd8\x61\x7b\xd0\xdf\x0c\xf9\xcd\xc2\x32\x13\x03\x1a\x62\xdf\x10\x6f\x6f\x7c\x30\xd4\x1e\xa8\x48\x1e\x26\x48\xb3\xbb\x31\xea\x97\x3f\x93\xea\x98\xec\x79\x5b\xd9\x83\x48\xcd\xee\x17\x17\x76\x2b\xe8\x9b\x2e\x9c\x01\x95\xdc\x0e\x6b\x4e\xb8\x19\xb2\xae\x03\x1a\x42\x25\x87\xe7\xf0\xf1\x16\xaa\xac\x6a\xd6\x8b\xdd\x45\xf5\x26\x54\x65\xcb\x1f\xb0\x46\x26\x7f\x23\x33\xa7\xe6\x82\xd6\x1b\x8e\x3c\x36\xb1\x98\xa3\x08\xb8\x44\xf4\xf3\xc4\x32\x0b\x5e\xe1\xd6\x6d\x7e\xea\x3e\x0d\xa6\x40\x8f\x05\xc4\x8c\xce\x4d\x40\x9b\xc2\xc6\x06\x42\x8e\x3a\xce\xb0\x25\x20\xb0\x37\x1b\x97\x2d\x82\x97\xfc\xbf\x36\x93\x7d\xe2\xee\x5f\x55\x50\x0e\xb9\xb6\x51\x8e\xf8\x82\x60\x40\x94\xd6\xe4\x2f\xa8\x95\xf2\xca\x50\xf6\xd9\x91\xb5\x1f\x0c\xd1\xc2\xdc\x65\x8f\xd0\x92\x64\x10\x69\x4e\x54\xf5\x4d\xed\xc9\x81\x8f\x19\x20\xb9\x05\xc8\x5a\x5e\xb3\xe8\xef\x52\x33\x61\x10\x9c\xd0\xcb\x47\x7c\xcf\x88\x73\x0f\x97\xa2\x01\xf7\x95\xdc\x7a\xd8\xfc\xdd\x47\x97\x3c\xc1\xaf\x8d\xca\xcf\xa2\x4f\x27\x43\x4f\x07\xbd\x64\x51\xd8\xa3\x3e\xfe\xb5\xc5\xbe\x73\xcb\x12\x40\xc3\x30\x8c\x42\x9d\x3b\x99\x1f\xce\x1b\x89\xd1\x28\x60\xdc\x8b\x19\x0f\xb4\x23\xce\xe1\xfb\xb4\xef\xe2\xc5\x28\x70\xa1\xd0\x5f\x6b\xe8\x02\x93\x0f\xce\xc8\x34\xfd\x10\x3e\xb6\xc3\xdd\xfc\xcc\xd3\x6a\x5f\xb8\x0d\xbf\x81\x6c\xde\x81\x4c\x1e\x74\x7e\x45\xd6\xd6\x47\x75\xa9\xac\xb6\x88\x4c\xbc\xf7\xed\xb6\x66\x8f\x02\x2d\x14\x3e\xd1\x39\x7b\x00\xd4\x24\x9b\xfd\xb9\x20\x93\x0e\x10\xf3\xf3\x4b\x29\x39\x90\x49\x27\x22\x73\x49\x2b\x2c\x4d\x7c\x51\xf0\x0d\x65\xf3\xd7\x63\xf2\x17\x65\xf1\x2d\x76\x6e\x14\x28\xcc\x63\xb6\xc7\x73\xf5\x21\x2b\xfc\xf4\xc7\xa9\x9b\xa6\x82\x5c\x8e\xf3\x1c\x30\x64\x31\x3a\x06\xfb\xe1\x6b\xe6\xba\x11\xa5\xa7\x21\x2f\x41\x0c\x98\xfc\x05\x33\x59\x08\x2c\x78\x2a\x9e\x69\x38\x0c\x7f\xfb\xaa\x4d\xc0\x35\x46\xcb\x5f\xc0\x76\x01\x1b\x5d\x2f\xa5\xb0\x7a\x87\xce\xc4\x3e\xe7\x78\x3b\x25\x36\x05\x9f\x60\xc6\xbb\xbf\xd6\xef\x22\x95\x1e\xb7\x3f\xc2\x6d\xfa\x51\xf8\xa6\x69\xec\x1d\x4c\x31\xda\x1d\xbd\xc2\x94\x97\xbe\xef\x47\xa9\x28\xd4\x3c\x80\x02\xce\x82\xa7\xa6\xbe\xfa\x3e\xdc\xbf\x66\x29\x43\x37\x50\x58\x6e\xde\x34\x10\x02\x50\xfa\xc2\x37\x62\x5b\x9b\x95\x6a\xfb\xa0\xed\xcd\xb6\x2b\xa6\x14\x29\x7f\xb3\xb1\xa9\xbf\x1c\xaa\xa6\x90\x6e\xc0\x1e\x6b\x1b\x40\xca\x71\x5d\xd7\x39\xff\x65\x87\x29\x05\x86\x22\x47\x1e\xff\xf5\x59\x72\x51\xcc\xe2\xda\xe6\x2a\x6c\x1d\xfc\xe4\x2e\x94\x49\xbf\xfc\x43\x6f\xa5\xf6\x70\xfd\x86\x64\x9c\xe1\x13\x47\xe4\x68\x95\x5d\x08\x02\x21\x23\x91\x2e\xdd\xaa\x26\x5b\x99\xe1\x53\xe6\x11\xdb\x79\x12\x53\xbf\x0e\xc1\x3a\x04\xca\x22\x2a\x2a\xab\xdf\x15\xa7\x64\x1d\x96\x72\x58\xe8\xac\x77\xdc\xc3\xf8\x6d\xc5\xdf\x5c\xea\xea\x81\x73\xae\xf2\x01\xc1\x1c\x96\xdd\x76\x4d\x06\xb9\xec\x0e\xfa\x5b\xe8\x5b\x5d\x26\x71\x9d\x90\x7e\x46\xc6\xa1\x1d\x9e\xb1\x59\xf5\xab\x87\x57\x50\x9c\xe6\x7c\x96\xbf\x5e\xe6\x3f\x91\xb3\x0e\xc1\x3c\x26\xa0\x88\xe9\x6c\xa6\xbb\x9c\xe6\x7a\xba\x0f\x09\x1f\x56\xed\x97\x64\x8f\xdc\x59\x61\xd9\x9c\x22\xfd\x72\xaf\x44\x5a\x6c\x53\xf0\xe5\xc6\xc8\xfa\x21\x62\xd7\x5d\x47\xb3\x7d\x8a\x7b\xe8\x81\x9a\xbe\x09\x7e\xbe\xbb\x2f\xd3\xe0\xf7\x19\x2b\x84\x19\xf9\x30\x5f\xb8\x9a\x7c\x5b\xab\x1c\x32\x50\xb6\x3e\x25\xa1\x8f\x2c\x02\x50\x9f\x7b\x62\x6b\xad\x5b\x91\xe3\x2d\xb0\xc9\x21\x28\x74\x74\xb9\x0d\x04\xdb\xf6\x3c\x7b\xa2\x19\x9f\xf6\x38\xda\x3f\x3c\xc1\xce\x71\xe2\x15\x42\x8d\x24\xfc\xe6\x38\x68\xa2\x25\xf7\xbc\x48\xf4\x06\x02\x50\x25\x1f\xb9\x15\x08\xbb\x3a\xa2\xe7\xb5\x69\xed\x1e\xac\x0f\x53\xfb\x6b\xb9\x21\xb9\x6e\xd9\x86\x79\x77\x54\xf0\xd8\xbe\xf9\x92\x66\x7b\x13\x73\xff\xfc\xe4\x2e\x58\x36\xce\x69\x60\xa1\x6a\x49\x6d\xb6\x27\x40\x23\xf2\x4b\x88\x9f\x91\x8a\xbb\x45\xdb\xc9\x1b\x5a\x84\xb0\xcb\xdd\x0c\xe5\xe5\x5d\x42\x9a\x6c\x5c\x87\x46\xff\x72\xa7\xd6\xed\x1b\x42\x7f\x73\x31\x08\x96\x47\xdb\x4b\x82\xef\x03\x33\xa6\xfc\xb2\x63\xea\x7f\x38\xba\x30\x04\xc4\x40\x03\xe8\xae\x01\x8a\xf6\xe8\x7a\x85\x1c\x47\x1e\xc2\x1e\x8a\xed\x69\x32\x7b\xa5\xd4\x93\x69\xf4\x41\x83\xa0\x70\xf8\x65\xab\x2b\xd9\x91\xba\x84\x13\x91\x0c\x8e\x96\x33\x1b\x97\x62\x8f\xc2\x8d\xd1\xe0\x86\x98\x4a\xe2\x2d\x6f\x00\x76\xc3\x11\xdc\x9f\xe6\x0f\xee\xcd\x1a\xc0\x05\x42\x2a\xab\xa9\xcd\x46\xef\x7e\x00\x1f\x19\x72\xe4\x73\x9c\xd6\xf3\xc7\xdd\xad\x52\xc0\x25\xd4\x88\x08\xe0\x93\xfb\x1d\x91\x77\xfe\x9a\xb2\xe1\xc3\xa0\x11\x5e\x1f\xeb\xeb\x93\x0f\x48\x61\xaf\x23\xb3\x58\x29\xb9\x54\x35\x1b\xff\x8b\x11\x08\xce\x6b\x90\x16\xad\x82\x7b\x44\x14\x71\x99\x4f\xe5\x94\xe2\x75\x4e\x66\xb9\x35\xaa\xb6\xf5\x2c\xbb\xb5\x79\x9b\x36\x47\xa6\x4a\x56\xd1\x47\xc3\x1b\x2e\x16\x58\xd1\x8d\x58\x77\x22\xb8\x2b\x05\x28\x20\x2e\xab\xc5\xa0\x66\xff\xdf\x98\x1e\x49\x93\x44\x18\x17\x0f\xe5\x0e\x52\x70\x6c\x29\x52\xad\x68\xf3\xd1\x51\x5a\x2f\xac\xb7\x3e\x2d\xfb\x04\xa7\xb9\x9b\x5a\x6d\xa9\x31\x4c\x87\xc7\x48\xba\xcf\x5c\x6a\xf7\x7c\x2b\x53\x91\xb7\x25\x6e\x2e\x59\x57\x3e\x3c\xb5\xe8\x7f\xfa\x55\x39\xef\x3a\xf9\xa0\x6b\xf8\xfd\x95\x14\xab\x96\x8d\xc7\x86\xd0\x71\x69\x40\x59\x43\x96\xc9\x34\x22\x29\x81\xb2\x2c\x8e\x68\xa7\x5e\xa3\xe5\xc0\x52\x93\x5a\xfb\x44\xf8\x20\x9b\x6e\x75\xd7\xdc\xc8\xc7\x2f\x6b\xc4\x39\x95\x0f\xb3\xef\xc0\xc9\x3f\x58\x64\xc4\xeb\x29\x69\x63\xbc\x9d\x24\xe5\x7b\x0e\x90\x1e\xaa\x71\x8c\x7f\xac\xae\x96\xb3\x04\x31\x61\xb7\x25\xef\x36\xb0\x36\x03\x9e\x38\x29\xfd\x5d\x5f\xf2\xcb\x7e\x20\x74\x43\xf2\xe4\x41\x0c\xc1\xda\xf3\xb6\x53\x2d\xb6\x31\x3b\x03\xf2\x9f\x48\x34\x62\x67\xc9\x1f\x28\xfa\x14\x99\x61\x6b\xca\xfe\x40\xb0\xf9\x06\xb0\xe9\xe7\xca\x1e\x80\xd4\x43\x23\xaf\x8d\xac\xf7\x19\x18\x67\xd9\x54\x13\x03\xee\xa2\x94\xcd\xf8\x9b\xa9\x5b\x04\x1f\x69\x15\xc2\xe5\xb7\xb0\xab\xe9\xbb\xe1\xfe\x4e\x9a\x2c\x31\xd3\x8f\xf3\x4f\x96\x15\x65\x11\xb0\xda\x72\x93\xc0\x21\x0f\x1a\x2e\xa1\x72\xca\x70\xd4\xc5\xc7\x39\x7d\x4c\x76\x82\x49\x60\x38\x0d\xab\x4c\x5e\xdb\x2d\xdd\x42\xbd\x3e\x02\xd3\xfe\xfe\x4e\xcc\x91\x1f\x1e\x47\x43\x3a\xaf\x11\x39\x62\xb4\x40\x22\x7f\x6a\xb0\x98\xcf\xe4\x14\x4f\x17\x7a\x6d\xbc\x11\xda\xba\x1e\x5b\x04\x9b\xbe\xb3\x47\xa5\x2b\x63\x81\x78\x8d\x17\x71\x78\x63\x10\x81\xa9\x21\xb0\x58\x15\x4f\xea\xba\xcf\xc7\x8c\x39\xb0\x14\x0c\x4b\x1e\x2d\xc1\x9e\x77\xe8\x87\xfe\xaf\x33\x6f\x5f\x26\x0f\xee\x84\xc3\xe7\xfb\x57\xf7\x73\x4a\xcc\x7d\x73\x98\x76\x5d\x5a\x0a\xc3\x30\xdc\xeb\xf4\xeb\xcc\x9f\xd7\xb0\x70\x0c\x43\x3f\xf1\xdc\x62\xdd\x0a\x7d\x6d\x19\xbe\xf9\x35\x96\x24\x14\x00\xbf\xc4\xb9\x3d\xd5\x06\x8b\xf2\x35\xe4\x8f\x28\x9e\xff\xfa\xe3\x29\x18\x24\x1b\xd7\x0a\xec\xdd\x47\xf0\xfd\xc3\xce\x11\xfe\x93\x79\x03\x01\xc7\x1f\xb4\x94\x85\x2d\x17\x2b\x10\x2a\xeb\x0a\xf2\x13\x7f\xc3\x2f\x49\xbb\x23\xd6\x15\xb3\x08\x5f\xb2\x68\x59\x87\x31\x14\x5b\x5b\x36\xde\x9d\xa8\xec\x03\xb5\xbf\x1a\x4b\xed\xc6\xf5\x07\x63\x77\x2e\xe3\x35\x48\x83\x6f\x7a\x58\xe5\x47\x73\xd1\x48\x34\xc2\xc7\x85\xbe\x7a\x88\x5a\xf5\x16\x2e\x0e\x68\xde\x27\xe8\x5c\x74\x17\x4e\xbd\x54\x6c\xf6\x61\x5e\xb5\x6e\x25\xce\x7c\x01\x63\x95\xf6\x66\xbe\xbd\xa8\x4d\x39\xee\xf5\x56\x2e\xe6\x1f\x87\xb8\xf2\xeb\x1c\x73\xea\x47\xf9\x6f\x9f\xf3\x0a\x31\xbb\x5e\x63\x96\x37\x14\x53\x64\x1a\xe7\x9c\x7f\x68\x6d\xc7\x8e\xf8\xf3\xa0\x27\x3e\x79\x49\xb3\xc3\xe3\x48\x9e\xc8\xa3\x2b\x3b\x72\x7c\x38\x2c\x66\xbf\xe4\x33\x8d\x9c\x14\x71\x3f\xb9\x07\xf9\xf2\x05\xdc\xe6\x15\xc2\xe6\xf8\x91\x3e\x3f\x48\xd1\x08\x12\x37\x3e\x7d\x19\x0d\x38\xf9\xd5\xe2\x47\xa7\xcc\x31\x49\xa8\x53\xf5\xf7\x25\x7f\x3b\x57\x5d\xd7\x71\x11\xeb\xe7\xd5\x7c\x44\xe6\xc7\xea\x8d\xbc\x44\xc7\x93\xbf\x85\xf9\xac\x53\x33\x25\xc1\x37\x3d\xe0\x0c\x63\x34\x3c\xf8\x91\x4b\xc7\x76\xd0\xd3\xfe\x8a\x55\x6a\xf1\xbe\x07\xf1\x65\x1a\x97\x9f\xb8\xb6\xe5\x6b\x1d\x5c\x69\xd9\xd2\xe1\x01\xc2\x47\x0f\xbf\x51\x14\x96\xb1\x0a\x8d\xde\x63\x59\xc6\x1d\x29\x93\xff\x4d\x9e\xf8\x69\xe4\x9f\xbb\x4c\x9c\x96\xff\x67\x57\x29\xf4\x0e\xf9\xff\x74\x0e\x52\xd2\xb5\x8f\xda\xa4\x77\xf9\xef\x8d\x27\x11\xc5\x8d\xf6\x63\xb2\x20\x4e\xfa\x5b\xe8\xc1\xb6\x36\xae\xc8\xe1\x07\xb0\x49\x56\x49\x5e\xe5\xd8\x4d\xe6\x98\x67\xcb\x88\xa0\x59\xc5\xce\x3e\x7f\x74\xc4\xbc\x2f\x38\xdf\x42\x10\x14\xf5\xa3\xf7\x4b\x82\xcf\x6d\x25\xc0\x18\x03\x0b\xb8\x7e\xd8\x31\xe1\x80\xab\xca\xb9\x6f\xb8\xb6\x01\x9a\x27\x99\xa6\xbb\x43\x18\x96\x61\x19\x1f\x34\x5d\x27\x99\xda\xde\x88\x76\xf7\x24\x4c\xfb\x2c\xad\xc9\x7f\x7d\x49\x8d\x4b\xd4\xae\x9a\xdc\xbe\x96\x7d\xbe\xdc\xc3\x30\xca\xc7\x65\xcb\x11\xfa\x7b\xf0\x4d\xe5\x47\xe6\x52\x59\x7a\x43\x4c\x1e\xcc\xd4\x93\x4a\x6d\x16\x89\x55\x1c\x0a\xeb\x7c\x51\x7d\x88\xea\xdd\x49\xab\x9d\x0b\xc9\x90\xdf\x19\xaf\x2d\x77\x0e\xcf\xaa\xe2\xfb\xf9\xa7\xfe\x6b\x56\x3f\xc6\x11\x4f\x94\xcc\x11\xf1\x89\x9a\x29\x4e\x6b\x83\x77\x87\x62\xe2\x2d\x3a\x1c\xfb\xc1\x91\xc3\x68\x94\x62\xdf\xf9\xfc\x7a\x3b\xf6\xbd\x0e\x01\x50\x5e\x29\x7b\x8f\x3c\x43\x8e\x2d\x43\xc6\xba\x6a\xd9\x52\xfc\xe5\xd0\xa0\xa2\x68\xa9\x50\x9f\xfc\xd5\x99\xf3\xb8\x8c\x29\x92\x4a\x6e\x90\xdb\xa0\xa8\x88\x4c\x1a\xd7\x28\xb5\xac\x99\xb4\x0b\xf5\xa9\x14\x62\x05\x4e\x0a\x35\xb4\xde\x03\x14\x21\xfd\xf5\xd0\x0f\xe3\x2e\x8f\x68\x9c\xa9\x38\x9c\x99\xf4\x99\x49\xeb\x7d\x2a\xfd\x1e\x41\xb8\xb7\xe4\x77\xd2\xd8\x49\x0b\xcc\xef\x4f\x5f\x5c\x57\xe6\xf1\xe7\x10\x5c\xe0\x24\xd3\x8c\x00\xb6\xd5\x2f\xcb\x5a\xb2\x8d\xc0\x43\xfa\xaf\x0c\x23\x37\x26\xd1\x76\x5a\xb9\x66\x0b\xa7\xee\x3d\x29\x8d\x17\xaa\x70\x19\x87\x28\x0d\x6a\xeb\x7a\x6e\xde\x29\x09\xd1\xa7\x77\x24\xa0\xa9\x92\x28\x75\xae\x7f\xf9\x4c\x51\x50\x16\x89\x6d\x0a\xd1\x03\xe6\x1e\xf2\xa3\x63\xcd\x86\x15\xd9\x4c\xfb\x28\x3f\x16\xa8\x46\x69\x9e\x53\x25\x04\xeb\xd1\x45\xa2\xe8\xc7\x15\x8b\xcb\x5f\x40\x02\x3a\x6b\x34\x44\x5d\xb8\x2c\xeb\xd8\xa4\xba\x27\x16\x66\x10\x06\x84\xcf\x8d\xb7\xc5\xc0\xf3\x3f\x75\xda\x85\x7b\xe1\xd5\x76\xf5\x13\xf8\x8e\x05\xff\xc9\x90\x63\xc9\x23\x7a\x2f\x6c\x7d\x7d\x5b\xc9\x7b\xe0\xf3\xd7\x7f\x3d\xb6\xe2\xdc\xb6\x02\xe0\xc4\xbc\x82\x3d\x8f\x08\x34\xa5\xc7\xe7\x5d\xb3\x51\xed\x51\xdf\x3b\x81\x69\xc4\x89\xd4\xa8\x4c\x7f\x50\x44\x5c\x69\xff\x1e\x1f\x97\x55\x16\x79\x26\xbd\xef\x70\x93\x38\x6e\xab\xf8\xf0\xbc\x6b\x3e\xe2\x5f\x13\x40\x1a\x60\x92\x6c\x30\xb1\x6c\xa6\xe4\xf8\x98\x44\xb7\xe5\x31\x16\x61\xdc\x2b\x74\xe8\x9e\xf8\xa1\xe3\x0a\x3d\xc8\x28\x3c\x75\xf4\xa2\x5b\xee\xd3\xaa\xff\x6a\xdb\x15\xc5\x57\xd1\xfd\x1d\x83\x57\x05\xf1\x06\x98\x48\x60\x5b\x89\xf3\xde\x73\xa1\x2f\xf1\x28\x9a\xa3\x92\x84\xcf\x1c\xa2\x5d\xb3\x7d\x31\x02\x28\xcf\x25\xea\xdb\xcb\x72\x91\x63\x8b\xd0\x83\x6c\xa9\x23\x04\xbe\x48\xe0\xee\xb5\x94\x8e\x15\xef\xf3\x8b\xf6\xd3\x1b\xce\x60\xe7\x28\x84\xc0\x22\xd3\xd0\x5a\x26\xab\x6e\x5e\x98\x10\xae\x51\x68\x0d\x75\xaf\x98\xcc\x6d\x04\x1e\xe0\x60\x95\x0b\x7c\x40\x70\x1b\xf9\x8c\xd4\x08\xd7\x84\xb5\x8f\x61\xb7\x99\x34\x2c\x51\x9e\xed\x10\x60\xdf\x83\x41\xdb\x75\xed\x63\x45\x96\x54\xea\x4f\x0f\x24\xb6\x39\x6c\xd2\x67\x48\x11\xfb\x6a\x37\x90\x0a\xa3\xc7\xcc\xb2\xb6\xad\xe4\x79\xef\xa9\x34\x52\xa8\x64\x45\x6c\xf5\x82\xd1\x3e\x45\x75\x8f\xfa\x65\x5a\x47\x2d\xc6\xb9\xc1\xa6\x06\xc4\xb4\x13\xd1\x50\x96\xe3\xe3\xaf\x60\x1c\x22\x18\x08\x00\x93\xcf\x60\x43\xdf\x4f\x06\xb3\x24\xe5\xbf\x39\x74\xbd\x6c\x9f\x56\x85\x8e\xbb\xa2\xf6\x5c\x52\xb7\xb3\xfc\x9e\xde\x68\x1a\x40\xa4\xc5\xdb\xf9\x86\x4d\x63\x2c\xb5\x0e\x97\x5b\x06\x1f\xd2\xfd\x5a\x5f\x78\x18\x0b\xd1\x58\x06\x23\x8a\xd1\x93\x05\x22\xfe\xaf\x4e\x4d\xb4\x4e\xed\x8a\x69\x21\xd2\xfe\xd1\x21\x55\x74\x83\x70\x4a\xe1\x52\xf7\x88\xaf\x4f\x54\x5e\x60\xa8\x28\x6e\xcb\xfa\x7b\x29\x4a\x85\x37\x3d\x5b\xe5\x68\x45\x7f\x33\xeb\xd7\x7b\x3f\xd7\xb1\x18\xb0\xc9\x5f\xde\xa0\x4c\x61\x9f\xe9\x22\xe9\xdf\xb8\x9f\x8f\x0a\xe1\x5e\xcb\x0f\xd5\x46\x56\x9f\x04\x1e\xc8\x0a\xab\x65\x8c\x08\x32\xb5\x55\x55\x44\xc4\x48\x78\x42\x58\x9d\x6a\xfb\xad\xa0\xea\x58\xb0\x5a\x5f\x40\xbc\x85\xb7\xd1\x3d\xbc\x4e\xf1\x8a\xee\x88\x7b\xee\x4a\xbe\x9b\x42\x69\x88\xd9\xf0\x7e\xee\xe1\x7c\x54\x53\x51\x99\x4c\x0d\x51\x22\x7f\x80\x70\xcd\x7f\x6d\xba\xf5\xec\x2b\xd3\x2a\xc2\x4e\x3f\xa6\x52\xa0\xfe\xe4\x88\x18\x86\xa3\xc0\x08\xa0\x74\x9c\x1a\x2e\x34\x04\x6f\xb0\x46\x78\xf5\x4b\x94\xc8\x13\xaf\x5d\xb6\xfa\x1c\xd9\xa6\xf1\xd0\x4f\x6c\xa3\xbc\x3e\x82\xee\x6b\x4f\xc1\x5e\x4b\x56\x2f\x72\x23\xe6\x27\x41\xf5\x81\x00\xe6\x35\x1b\xc3\x34\x89\x38\x8e\x23\xc2\xde\x2f\xca\x68\x8a\x2b\xf0\x59\x23\x68\xc0\x80\x73\x56\xbc\x31\x95\xc6\xac\x8e\x61\xbe\x38\xe3\x8d\xe8\xbe\x39\xcc\x86\x43\xa2\x51\x68\xf9\xc1\x2a\x9e\x09\xe6\x06\x9b\xd5\x9f\x7c\x1c\xff\x99\xac\x76\x20\x01\x49\xd4\x94\xc5\x0b\xe1\x0a\xad\xed\xe9\x51\x83\x33\xda\x27\x31\x2c\xe4\x2f\x11\x41\x19\xff\xdd\x6a\x10\x78\x0e\x79\xa0\x2a\x4f\xfa\x06\xb7\x88\xff\xda\x53\x3f\x40\x4d\x84\xfe\xea\x2b\x81\x8c\xf3\xa0\x6f\xdf\x26\xad\xaf\x7e\x40\xa5\x40\x34\xc9\x3f\x28\x30\xc7\xf3\x0a\x60\xb8\x9d\xea\x12\x5f\xfe\xfc\x12\x47\xbe\xa5\x51\x38\xa4\x48\x19\x47\xf0\x41\xfa\x44\xfd\x21\x92\x2d\x39\x54\x98\x28\xc7\xea\xa8\x6a\x0a\x43\xfd\xe0\xa8\xe3\xde\x98\x97\xcf\xfc\x2d\x33\x85\x65\x93\x63\x7d\xde\x6f\x8e\xf2\x24\x58\xfa\xbd\xdd\x63\x70\x5c\x10\x3d\x35\x38\x2c\xee\x18\xf6\xf6\x87\xfb\x80\x67\x95\x1c\xa1\x6a\xb7\xe8\x54\x04\x80\x91\x93\x46\x96\x50\x56\x9f\x62\x52\xd7\xac\x5b\x4b\x7f\x30\xfc\xd9\xbd\xf2\xf5\xdd\xef\xf8\x38\x2a\x3b\xde\xc6\x18\xc6\xb0\x83\x5f\xfd\xd4\xb7\x3a\x2e\xea\xb2\x70\x18\x52\xd1\x69\x84\x54\x1c\x47\xe9\x33\xa8\xcb\xa0\xf0\x0c\x64\x9b\x6f\x82\x04\xcc\x1a\xb1\xde\x9b\xfc\x87\x2f\x31\x9d\xea\x4a\xea\x5c\x29\x0e\xa1\x2b\xdc\x9a\x4d\x21\x4c\xff\xfa\xbd\x91\x76\xcd\xa6\x8c\x44\x5d\x57\xd0\x0c\x10\xda\xcc\x18\x8e\x11\xf4\x92\xf1\x4b\x25\xd9\x63\x9e\xbb\xa4\xeb\x1f\x5f\xc5\x41\x0b\x3e\xb6\xdc\x3c\x42\xa5\x95\x45\x20\xe9\x51\x98\x16\x19\x61\x68\x40\xf4\x6f\x9e\xf4\x43\xab\xe8\xfa\x82\x6a\xff\x7e\x6e\xa5\x3f\x7d\x14\x00\x61\xa0\x7e\x34\x77\x54\xd7\x6c\x52\x89\x2a\xfd\x9c\x38\x27\xa4\x23\x18\x7f\xc9\x91\x06\x7d\x58\xaa\xee\xc8\x24\xab\xbc\x89\x3b\x88\x77\x0e\x81\x69\x04\x66\x89\x34\xa7\x5d\xa3\x0d\x1b\xd5\x27\x66\x30\x6c\xca\x48\x8d\x09\x35\x46\x2c\xfe\x34\xec\x65\xdc\xea\x18\xbe\x11\xc7\x20\x23\x81\x00\xdf\x55\x3a\xb7\x0f\x96\xf0\x02\x6e\xfb\x58\xc8\x29\x21\x1a\x6b\xc1\xee\xe6\xfe\x4a\x55\x47\xe4\x81\xad\xfd\x39\x72\xc8\x87\x43\x97\x37\xc5\x6c\x83\xab\xfa\x0d\x43\x47\x00\xac\x5b\x64\xaa\x91\x40\x8f\x6f\x7c\xa0\x5b\xe8\xf5\x2b\x2b\xf4\xcc\x1f\x9b\xc8\x26\xa5\x6a\xf9\x01\x25\x36\x1d\x3f\x07\x90\xf8\xe4\x9c\x0a\xda\x03\x44\x4c\x0b\x51\xfd\x7e\x63\x5f\x01\x4b\xbd\x51\x43\xd2\xcf\x87\xae\xcc\xb2\x14\x13\xf7\x53\xda\x0b\xd7\x38\x2b\x68\x63\xda\x8a\xc7\xc8\x35\xc7\x71\x09\x6c\xd0\x3a\x04\x5b\x15\x27\x97\x37\x0a\x34\xee\x25\xef\x7f\x58\x0d\x77\x93\xe5\x4a\xd3\x94\xaf\xc6\xe7\x7a\xad\x92\x76\x23\xc6\x6b\xd0\xc6\x6b\xf8\xdc\x1a\xce\xed\x2c\xf5\xcf\x15\x61\x6d\xc8\x22\xd2\x85\x7c\x69\xba\x0e\x5c\xd9\x31\x15\x78\xd5\xb5\x65\xdb\x36\x62\xdd\xb6\x4c\xb2\x76\x7e\x47\x78\xea\x3f\x9f\x5f\x6c\x8b\x28\x44\xbf\xf2\xdd\xf5\xfc\xfc\x35\xb1\x98\xc1\x64\x85\x24\x80\x39\xbd\x2c\xde\xa1\x6d\xdf\x20\x2d\xc8\xe6\x4b\xca\x70\x3e\x6d\x55\xce\xdd\x6f\xfb\xd0\xcd\xbb\xbe\x94\xa2\x62\x26\xf8\x45\xa0\x01\x05\x7c\x06\x0d\xab\x06\xe6\x3f\x6e\x0d\x83\xeb\xa4\x16\xab\x3c\x2f\xf3\x61\x43\xb8\xf2\xad\x96\xc9\x3a\xd9\xe3\x7c\x86\x24\xe6\xb5\x5e\xe3\x11\x9c\x5e\xe2\x8a\xc5\x59\xa3\x30\xa5\xec\x05\xac\x49\xd4\x22\xed\xd0\xe7\x13\xc5\xe2\x1d\x7c\xd4\x75\x5c\x1d\xc6\x50\x67\xe0\x7f\x18\x8f\x4e\xd0\xfe\x52\xcf\x4b\xf3\xe5\x0d\xf3\xd9\xec\x34\xe7\x19\xcc\x7a\x8d\x57\xb8\x08\x99\x2b\x16\x57\x1a\xdd\x94\x9e\x56\xba\xde\xc0\x9a\xac\x53\x45\xe8\x91\xab\x7b\xac\xd2\x6f\x28\x83\xff\x04\xa8\x19\x2a\xda\xc8\xfe\xd4\x3b\x34\x42\x16\x7a\x6b\x25\xb7\x42\xb5\x38\xee\xef\x7d\x06\xbe\x94\xbd\x6f\xfb\x31\xec\x1a\xeb\x15\x53\x0a\x99\x6d\xa0\xa5\xbe\x92\x6b\x97\xec\x04\x6e\x2d\xe3\xb5\x48\x7c\x5f\x00\x46\x04\xec\xd4\x31\xd3\x5f\xea\xaf\x7a\x8f\x36\xc9\x39\x4d\xff\x9f\x44\x2b\xc7\x54\xc8\x5c\xa2\x89\x89\x13\xae\xdf\x10\x07\x6d\xb2\x96\xf1\x12\xa6\xec\x16\xb2\xee\xdd\x60\xbb\xc2\xcf\x6a\x3f\x64\x32\x0e\x7a\x7d\x93\x00\x63\xbc\xe6\x89\xf8\x81\x02\xb8\xe5\x15\xc4\x5c\x70\x43\x9d\xfa\x40\xeb\x1f\xf3\xaf\x6e\xdf\x95\x0f\xc1\x5e\xc9\xdc\x8c\x4d\xef\xd5\x2a\xf6\x65\x09\x1b\x46\xd4\x54\x9a\x61\xa9\xa1\xc4\xc6\x60\x3d\xe3\x46\xd4\x80\xed\xb5\x72\x09\x88\x09\x02\xbe\x70\xb5\x41\xc0\x48\xc1\x92\x53\x78\xc1\x1b\x25\x32\x3b\xff\xce\xfd\xce\x6c\xf1\xe8\x3f\xe3\x8a\x9d\xb7\x96\xfe\x8c\xf0\x2d\x2c\xa8\x93\x4f\xc4\x0e\x31\xc5\x21\x5c\x16\x43\x6f\xb4\x8e\xd6\x06\x2a\x8b\x2c\xde\xa7\x63\x5d\xb1\xc8\xbf\xa5\x3c\x83\x31\x01\xc6\x8a\xb1\x49\x21\x57\x3b\x36\xaf\x72\xf6\x45\x3f\xb1\x1c\xcc\xff\xad\x5d\x6c\xfa\xe6\x32\x79\x55\x83\xc7\x39\x1a\xb2\xdf\x2a\x30\x8a\x86\xed\x3c\x5d\x4f\x72\x4e\x0d\x03\x65\x0c\x76\xa4\x0e\x42\x3c\x55\xa9\x79\xa2\x16\x31\x9b\x25\x6c\x08\x18\x7b\xc5\x4a\x1e\xfb\x43\xb8\x1e\xe7\x27\xd8\x05\xbe\x3f\x3e\x0f\x77\x45\xe3\x7a\x26\xbd\xe7\xaa\xf9\x56\xe7\x64\x9c\xc7\x30\x5d\x4d\xc1\x3a\x5d\x1b\xe6\x7a\xab\xeb\x8b\x8e\x23\xa7\x39\x9f\xa1\x08\x60\x23\xa7\x09\x9d\xc7\xf3\xea\xa2\xe1\xf5\xfb\x36\x03\xbf\x37\xfe\x48\x35\x2d\x62\xbd\x9f\x38\x41\x88\x5c\x9f\xcb\xe5\xbb\xab\xe6\x86\x18\x97\x75\x58\xdc\x20\x14\xdd\x20\x92\xee\x88\xd5\xd4\x5b\xbc\x3d\x79\x1e\x85\x2a\x9b\x27\xb1\xcf\x7d\x53\x2d\x37\xf2\x4b\xe8\x11\x1c\x86\xdc\xa0\x64\x6c\x93\x48\x4f\x51\xb6\xf1\xbf\x5e\xf4\xa2\xe1\x3b\x94\x33\x59\x61\x30\x6a\x2f\x12\x5d\x48\x84\x84\xc3\x52\x84\x9d\xe7\x39\x5e\x1f\xfc\xe6\xf2\x14\x94\x51\x46\x86\xca\x2c\xdf\xfb\x89\x9f\x5f\xba\x1b\xbe\x4e\xe3\x2b\x7b\x26\x8f\xdd\x63\xf0\x0c\x26\x97\xc4\x78\xef\xfc\xe8\x13\x51\x31\xf9\xeb\xf6\xda\xd0\x80\x07\x3c\x11\x99\xff\xc6\xcb\x7c\x28\x6a\x7a\x61\x1e\xa4\x19\x17\x31\x5b\x23\x37\xeb\x1b\x2c\x05\xae\xf4\x56\x0a\x5b\x0b\x6d\xc0\x34\x0a\x68\xce\x77\x09\xb0\x4d\x4f\x49\x93\x77\x0a\xe1\x78\x05\x22\x62\xa4\x58\x12\xff\xe3\x9d\x61\x82\xb8\xcb\x7c\xc9\x85\xd2\xc5\x21\x07\xc7\x34\x20\xbf\xb4\x29\xb0\x59\xf5\x3b\xd5\xcd\x74\xb5\x5d\xcf\xf6\xe3\xcc\x30\xbd\x70\xad\x58\x08\x18\x20\x4b\xbd\x5f\x55\x18\x3b\x75\x0c\x87\x5e\xbe\x8a\xe5\x1f\x7e\x32\x7f\x55\xd9\xdd\x63\x67\x74\x6e\x54\xfb\x94\xe1\x5a\xe6\x3b\x9d\x6f\xe5\x44\xae\xc0\x12\x72\x73\xf6\x29\xd2\x0e\x8a\x1a\x48\x9a\xbf\xa2\xb1\x5c\x9e\x1a\xb8\x61\x98\xd4\xbc\xe1\x56\x8a\x75\x5f\x96\x39\x8f\xf1\x59\xca\xee\x1e\x5c\xe3\x85\x9a\x51\x12\xa4\xc5\xf7\x8f\x81\x68\xfd\x52\x28\xee\x30\xd1\xb5\x75\x05\xa6\x0b\x98\x28\x0a\xa5\xe9\x32\xd0\xda\xd1\xbc\x2b\xed\x8e\x09\xf1\x3e\xf3\x61\x1e\xcf\xf4\xb2\x58\xc8\x3a\x29\x93\x55\x14\xfc\x5d\x4a\x7b\x81\x4a\xe9\x6e\xe7\x94\xf0\x1a\xd9\xc7\xc2\x59\xfa\x4f\x9e\x3a\x2a\x49\xd7\x0d\x93\xe0\x20\xac\xad\x65\xdc\x41\x72\x25\x1b\xaa\x87\x26\x39\xf9\x8a\x98\xad\xe2\xca\xcd\x5a\xaa\xcb\x5f\xd5\x72\x03\xba\xa7\x5a\x03\x72\xc2\xc8\x48\xc1\xe7\x41\x7f\xf7\x72\xae\xcb\x7c\x2b\xb3\x2d\x75\x44\xf1\x65\x20\xa3\x57\x00\xfe\x63\xfc\xd4\xe1\x88\xe6\x27\xa0\x65\x87\x92\xd7\xc2\x3a\x79\x36\x0d\x8f\xfb\xd7\xdf\x1d\xf6\xd7\xf8\xae\xa1\xb3\x8e\xc1\x33\x42\xc8\x20\xf6\x81\xd5\x06\x5c\x93\x7c\x64\xa1\xd3\x73\x02\xbf\x91\x81\xf8\x86\x04\x89\xa6\xa4\x99\xb6\xa1\x78\x94\xc3\x9e\x33\xb4\xbc\xcd\x99\x7c\x7a\x90\x16\x00\x6a\xf7\xe7\xd8\xce\x86\xa8\x78\xba\xf2\xac\xbf\x5e\x51\xf7\x44\xe4\x4a\x5a\xa7\x53\x50\xcb\x61\x2f\x05\xdf\x14\xdc\x5c\xf3\x73\xc8\x60\x42\x33\xca\x17\x20\x5e\x16\x9b\xe9\x44\xbe\x58\xa7\x9b\x33\xd9\x16\x10\x53\x40\xa0\x08\x00\xdf\x20\x9e\xe1\xdf\x4a\x66\x13\xa9\xbd\x32\xa5\x59\x93\x48\xec\xf6\xf2\x63\x90\xda\x0b\xc2\x20\x12\x30\xba\xd1\xfc\xcf\xba\x2e\x8a\x69\xc5\x4b\xd1\xd5\xfd\x73\xc5\x9f\x61\xdf\xc5\x3e\x74\x41\x99\x00\x51\x80\x02\x81\xeb\x80\xe2\x84\x16\x94\x45\x9c\x4d\x56\x53\x5d\xab\x14\x94\x43\x4c\x74\x36\xd3\xa1\x4c\x1c\x3e\xeb\xba\x16\x18\x68\x96\xfc\x58\xfa\x4b\xad\xe3\xb1\x6e\x82\x85\xd8\x1e\x38\xb0\x90\xe5\x79\xa7\xf7\x8d\xc7\xe0\x2d\xff\x3a\x57\xd6\xf0\x62\x7f\xfc\x2a\x71\x10\x9a\x7e\x19\xcb\x71\x65\x8c\x88\x14\x61\xff\x57\xfc\xfd\x8e\x93\x51\xf4\xc9\x3a\x24\x8b\x34\xd3\xbf\xe7\x30\xef\xd6\x52\x2b\xfe\xa9\x46\xe9\xb8\xe4\x19\x94\x31\x50\x0c\xb4\x21\xc8\x24\x8a\x1a\x7e\xf7\x37\xe7\xb3\xfc\x8d\x24\x14\x01\x6e\xe4\xa4\xe0\x71\xa7\x07\x80\x2e\x6f\xa3\xa5\xec\xa5\xe4\xb0\x9d\x08\xd3\x30\xe9\xf4\x3e\x8d\x5b\x2c\x95\x07\x54\x45\x23\xe6\x71\x93\xd2\xfb\x83\x1d\x6b\x1a\xe7\x42\xbe\x48\xc4\x0f\x53\x03\x99\x07\xad\xeb\x46\xd4\x3c\x59\x5b\xc0\xdd\xc0\x71\x40\x8f\xc1\x35\x0a\xf3\x24\xa0\x36\xad\x83\xfd\x4c\xfc\x06\xdc\xf7\x21\xd0\x16\x58\x5b\x4a\xf5\x05\x71\xd1\x5a\x68\x2b\xf5\x8d\x2c\xe9\xe1\xd1\x53\x85\xd0\x15\xc5\x21\x0a\xc5\x5f\xff\x86\xa1\x19\xfe\x7e\xb9\x70\xde\x83\x19\xbe\x8c\xc0\x1b\x9a\xd0\xeb\x9a\x11\x76\xb7\xbb\x4c\x15\x55\xba\x66\x63\xbf\x0e\xc1\x64\x96\x7d\xc3\xbd\x98\xa1\xfc\xd1\x8f\x5d\x0f\x95\xc2\xdd\xcd\x2c\xa5\x19\x4b\xd7\x46\xc7\x74\x0c\xa8\x0d\xc2\xfb\xf3\xeb\x99\x7a\x68\x98\x8c\x65\x80\xac\x69\x07\x80\xe1\xe1\xb6\xf3\x78\x6b\xfc\x43\x8e\x8f\xab\xf6\x7b\xd0\x79\xa9\x2a\xf6\xeb\x03\x82\x3d\xb8\x21\x54\xa7\xcd\xdd\xaa\xe9\xc6\xf1\x92\x39\xa0\xfb\x8b\xd2\x47\x69\xf2\x8e\xce\x35\x29\x6e\x32\xae\xc0\xf1\x49\x00\x53\x1f\x3e\xae\xc3\x2d\xed\x02\x65\xc2\x5f\xff\x8a\x53\x5a\x5a\x9e\x06\xcf\x2d\x3f\xb2\xbe\x77\xaf\xbe\x0f\x09\x70\x87\x45\x48\x4d\x72\x9f\x20\xee\xef\x46\xef\xf8\xa8\x0d\x7f\x0a\xff\x18\x67\xe9\x4d\x76\xb4\x6f\x4b\x0e\x19\xbb\xf5\x88\x84\xad\x6e\x80\x59\x4b\x23\xe5\x62\xa8\x14\xef\xae\x61\xdf\x1f\x8e\x5a\xd6\x31\x46\xaa\x72\x6d\x3c\x52\x8e\xf9\x23\xe2\x40\x22\x50\xad\x61\xb5\x8f\xed\x6a\x72\xc4\x74\xff\x73\x37\x37\x9d\x3c\x63\x4a\x6c\x45\xbc\xc5\x23\x48\xbe\xf6\xeb\x4c\xfd\xd7\x65\xaf\xf9\xf6\x46\xe7\x6f\xbe\x97\x6b\x0c\x34\xd2\xd2\x51\xed\x7a\x7e\x6f\x7c\x21\x82\xee\x8e\x02\xc7\xba\x72\x8f\x5a\x7e\x38\x65\x67\x85\x1f\x3c\x50\x09\x6e\xe3\x45\x7c\x6f\x8d\x66\x06\xd4\xda\x47\x57\x7a\xaf\xf4\xda\xc8\xec\xa8\x0f\xf8\x98\x7d\x02\xf2\xe1\x3f\x1f\x45\x74\xbc\x8c\x03\xb9\x61\x97\x3b\x6a\x35\x4f\xea\x53\x93\xbf\xe4\xf3\x51\x03\xa6\x4a\xd8\xbf\xb5\x6b\x1a\x73\xdd\x7b\xb9\xd8\x33\x4e\xf5\x05\x15\x0d\x84\x32\x93\x26\x2d\x33\x69\xc6\x1b\x11\x11\x5f\x1f\xff\xdf\xfd\x55\x5f\xb4\x28\x54\xee\x3f\x35\x56\xb9\x59\x31\xfb\x8c\xfc\x98\x7e\xca\xda\x0d\xe9\xff\xf0\x5d\xb0\x3e\xf3\x5a\xd7\xfe\x16\x95\x6b\x63\x28\x8d\x41\x17\xfb\x4a\x00\x57\xb3\xef\xf8\xd3\x0b\x96\xeb\x98\x27\xe9\x97\x6e\xe6\xa9\x35\x5b\x24\x21\x99\x29\xd6\xdd\x70\xcb\x56\xc2\x2e\xf0\x3f\x94\xdf\xc2\x0d\x37\xfe\xc4\x7c\xdc\xc8\x76\xfd\x99\xac\x1a\xc3\x13\x9f\xd7\x10\x35\x35\x14\x9b\xf4\x1c\x0d\xe6\xdf\x9d\x74\x26\xe5\xec\xf9\xe1\x67\xfb\x21\x19\x51\xe5\xec\xf9\xe6\x74\xa6\x07\xfa\x46\xf8\x37\x0e\xd5\x46\xf6\xfd\x58\xae\x26\x87\xcc\xd4\xba\xe9\x31\x2c\xaa\x36\xaf\x06\x78\x1a\x33\x27\x11\xd9\xd5\xdd\x49\xf9\xb7\x67\x5c\xa5\xbe\x34\xd7\x28\xd6\x40\xe9\x86\xf3\xed\xb1\xa7\x13\xc6\x74\x4a\x73\x3e\xd5\x65\x8f\x01\x7e\x30\x1c\xfd\x97\xd1\x4e\x16\xe6\xab\xcb\xd7\x3b\x88\x33\xd7\x68\x27\xd8\xb9\x5f\xe4\x42\xac\x17\x7a\x9d\x1b\x6a\xec\x15\x47\xff\xd8\x66\xca\x0f\x10\xff\x43\x18\x8c\x69\x67\x76\x87\x09\x07\xce\x7d\x0c\x68\xe7\x8e\x00\x6f\xd8\xbf\x58\x99\x22\x82\x3e\x84\x5c\x9e\xcb\x88\x33\xc9\x52\x71\xca\x69\x58\x90\x88\xdc\x28\xa9\x4b\xc3\xfe\xef\x7a\x14\xad\x0d\xb5\x45\x94\x43\x06\x9c\xdb\xc1\x4d\x7b\x25\x1f\xbc\x46\x30\x1b\x90\x1f\xfe\xe9\x4b\x5c\x8a\x3c\x96\x71\xc4\x79\xdc\x84\x7d\x56\x0d\x96\x2f\xd6\x80\xe1\xdb\x42\xed\xc8\xe5\x66\xea\x9f\x79\x39\x8a\x6a\x1c\x48\x4c\xf2\x30\x13\xc3\x71\xe4\x3b\xb5\x01\xdf\x46\x73\x8e\x1a\x26\xd2\x21\x25\x1a\xde\x0d\x6f\x5a\xfb\x13\xc7\x2a\xf7\xf5\xde\xec\xb5\xb2\x78\xb7\x19\x6c\xb0\xdc\x4d\xc5\x48\x5a\xef\xca\x7f\xb1\x9c\x87\xf9\xe2\x16\xb3\x70\x33\x39\x6a\x86\xe8\x86\x83\xe7\xa9\xd6\xcc\x88\xcc\x19\xfd\xf4\xb3\xdf\x65\xce\xf5\x54\x1f\xd9\xbb\x46\xa1\x26\x69\x64\x88\x48\xae\xd9\xb7\xfb\xa9\x85\xe1\xae\x62\xc2\x61\x79\x76\x79\xc5\x68\xa1\xd9\x2e\x44\x47\x53\xbf\x66\xd0\x54\xca\xbf\x8b\x9b\xec\x05\x91\xf6\xce\x07\x6e\x2b\x18\x8d\x66\xb6\x08\xa4\x08\x05\x9b\xea\x76\x9a\xf0\xac\x20\x7b\xcc\xf3\x73\x47\xd6\x50\xc4\x14\x33\x02\xc6\x09\x5b\xe5\xa6\x27\x6b\xe0\xb4\x74\xe8\x47\x85\xcf\x7f\xb8\x8e\xae\x1d\x92\x38\x1f\x77\x18\x65\xde\x23\x02\xee\x45\x46\x6d\xad\x97\x4e\xd4\x81\x19\x23\x79\xff\xe3\x0d\x9c\xbf\x7c\xd9\x0f\xe6\xb4\xb0\x63\x63\x90\x84\x8c\x7b\xc2\x9b\x9c\x3d\x63\x1c\x97\x6a\xb6\x83\xbc\x3f\x7c\x05\xac\xb3\x4a\xce\x30\x94\xcb\x45\x2a\x13\x84\xbc\x81\xe3\xb5\x8f\xae\xed\x1a\xb3\xc0\x8e\x4d\x26\xf6\x45\xb2\x3f\xb5\xef\x6c\xa6\x6c\x9b\x32\x8b\xbf\xe4\xe3\x6d\x96\x9c\x13\x65\x25\xf0\x3e\xff\xf9\x34\x50\xf3\xd3\x57\xdc\x60\x38\x36\x31\xda\x6e\xe6\x38\x4c\x1a\x1d\xa5\xc7\x34\xf3\x81\x1d\x4e\x5f\x4f\x08\x51\xc4\x7f\x5c\xc8\xcc\x1e\x70\x4d\xb1\x34\xcd\xcc\x19\xb0\x54\xdf\x71\x5b\x98\x06\xc7\x86\xfb\xee\x74\x57\x24\xb0\xf5\x4f\x0c\xd2\x24\x0d\x15\xb0\x6c\xb4\xc2\xd1\x00\xe7\x21\x66\xaa\x1b\x37\xc3\x9c\xce\xfa\xa5\xaf\xd4\x4a\xe6\x32\x7f\xe2\x0a\x66\xf7\xd5\xaf\xca\x28\x25\x2f\x37\xe8\xc0\x76\x1e\x15\xa1\xc2\x23\x5e\xff\x7a\x16\xeb\x42\x02\x4b\xc6\x7b\x3f\x7c\x12\x36\x09\x0e\x3c\x3d\xeb\x8a\x7d\x14\xa5\x56\xc7\x82\x97\xcb\xd8\x2b\xc6\x61\xff\xfa\xdd\x1f\x6c\x71\x07\x41\x37\xa3\x23\x06\xa8\x16\x1f\x7e\x95\xc0\xe1\xdb\x42\x71\x3a\x47\xfc\xc7\xbb\xd6\x7a\xfc\xd7\xd1\x04\xe7\x6a\x66\xca\x2c\x1f\xc2\x61\xa4\x1e\x02\x06\xcc\x16\xb0\x52\xe1\xfe\xed\x9f\x33\x3b\x1f\xdc\x32\x66\x5e\x50\x93\x22\xab\x24\xf8\x53\xcc\xbd\xd0\xf4\x5e\x2b\x34\xea\x5f\x5c\xd7\x60\x39\xd7\xf8\xc8\x81\xd3\x3d\x3a\x77\x6a\x4e\x8b\x0a\xb7\x06\xe9\x22\xb3\xa2\x21\x27\xec\x3f\xf2\x22\x28\x4e\xb9\x32\x8d\x27\xf1\xe2\xd4\xc2\x19\x4a\x30\xd7\xa9\x05\x5a\xf2\xaf\x87\x76\xd4\x34\xa0\x3e\x3f\xbc\x72\x43\xb1\x44\x4e\x58\xc0\x6d\x65\xa0\x78\xef\x8f\x6e\x7a\x17\x6d\x09\x7f\xc5\xc4\x0d\xa9\x4c\x38\x4c\xc5\x36\xa3\xee\x1f\x93\xd5\x18\xf6\x5c\x03\x35\xf9\x89\x05\xd4\x5b\xf4\xfc\xc5\x51\xf8\xbc\x0b\x49\x39\xcd\xe3\x4c\x63\xc4\xc4\xfc\x5f\x4c\xf7\x5d\xb5\x5b\x12\x42\x06\xec\x5c\x35\xf9\x02\x18\x26\x75\x4c\x83\x69\xca\x5d\x19\x01\x13\x29\x3f\xbe\x1f\xce\x5d\x91\xea\xd2\x32\x93\x75\xab\xd6\xf7\x5e\xe9\x32\x29\x18\x86\x8e\x60\x0e\xbb\xd9\xe3\x02\xdf\xfd\xe3\xc1\x2c\xda\xcc\xa4\x82\x01\x17\x19\x3e\x5d\xc1\x06\xf2\x73\x33\xeb\x12\xda\xe9\x94\x88\x97\x88\xdd\x11\xda\xe2\x4f\x6e\x87\xb7\x3a\x7e\x70\x04\xdb\x43\xcc\x26\xca\xfd\xcc\x50\x34\x83\xe7\x9c\xc8\x38\x39\xe5\x2f\x0e\xca\x39\x06\xa2\x58\x22\xe3\x93\x37\x04\x3d\x7e\xf9\x4a\x0e\x23\x3b\x23\x73\x74\x3f\x71\x94\xe5\x19\xe6\xa6\xcc\x9c\xa2\xc6\x05\x74\xf9\x08\x78\xbb\x1c\xff\x74\x02\xf2\xff\x9e\xbf\xf2\x61\x46\xc0\x85\x21\x0c\xc3\x31\x5a\x13\x1b\x3b\x15\x84\x65\x3a\xa8\xc0\x2d\xc3\xf9\xe1\x2f\xe0\x18\xf4\x97\x6f\x31\x04\x8b\xcb\x02\x9e\x8a\x77\xcb\x98\xe4\xe6\xd2\x77\xee\xef\xcf\xbf\x9f\x1f\xfc\xf7\xdd\x94\xbd\x66\x4e\x5f\x90\x51\x09\x7a\xcf\x4f\x72\xf3\xb5\x1c\x90\xde\x58\x70\x92\xfe\x4d\xae\x32\xb9\xd1\x60\x01\x2b\x42\xa4\xcf\x87\x29\x6e\x99\x0d\x19\xb0\xcb\xbf\xe7\x77\xc6\x69\xe4\x41\x8b\xd9\x18\xcc\x63\x6a\x93\xa2\x7b\xc4\x85\x02\x26\x1e\x34\x55\x35\x88\x30\x61\xff\xc9\xb6\x3e\xa8\xbd\x42\x7d\xf2\xf7\x29\x20\xf8\x4d\x48\x05\xa4\x88\x7c\xad\x7c\x2e\x5b\x18\xc8\xe5\xff\xe9\x4a\x88\x65\x41\x7d\x52\x24\x0a\x16\xf3\x6f\x99\x6e\x81\xa7\x74\xf2\x17\xf7\x6c\x96\x6a\xe4\xb6\x90\x7a\xfe\xef\xdc\x4e\xc1\xb1\x5f\x73\x58\xb6\x51\x41\x6c\x4d\xf1\x81\xca\x46\xb4\xc6\x15\xfe\xff\x58\x5a\xfc\x82\xe4\x5d\xf2\x4b\x49\xdb\xe2\xb4\xc3\x43\x09\x43\x07\xf9\x32\x51\x61\x8c\x8c\x45\xe6\x7d\xa3\xfc\xdc\x4b\x62\x4f\xe1\xf4\x3f\x8f\x42\xf5\x5e\x3d\x41\x3b\x85\x8f\x3b\x14\xda\x48\xa1\xb9\x1d\xe7\xaa\x8b\x8f\x8e\x05\xc9\x0f\xf2\x73\xd5\x9a\x30\xfd\x9c\x47\x54\x67\x41\x59\x9e\x3c\x93\x43\xea\xf4\xc8\xb2\xa5\x89\xf8\x39\xb8\xc6\x88\x78\x6f\x1f\xba\x2d\xab\x85\x2c\x08\x43\xd3\xbe\xb2\x92\x17\x97\xa7\xe3\x32\x7e\x85\x08\xa9\x2f\x0a\x42\xa7\xa4\x3f\xf2\x32\xc2\x9e\xd6\x30\x26\x5e\x54\x1e\x2d\xd0\xd3\x97\xbe\x20\x93\xbf\xcb\x81\xd2\x44\x27\x32\xc0\xb5\x5b\xb5\x24\x2b\xde\x76\x57\xc9\x10\x2e\x5f\xb9\xe6\x53\x33\x8c\xc2\x14\x3f\x2f\xf1\xb9\x4a\xed\xa7\x7f\x31\xc7\xa0\x2c\xfb\x2a\x01\x88\x91\x7d\x18\x86\x47\x34\x65\x88\xd9\x61\x97\x67\xda\xaa\x6a\x7d\x12\xc4\x0a\x07\x47\xf2\x3f\xf1\x00\x35\x91\x71\x02\x86\xc7\xe2\x89\xd1\x39\xfc\x3f\x2e\x4b\x54\x73\xbd\x2c\x59\x99\x9a\xff\xec\x6c\xd2\xa6\x2b\x31\xaf\x29\x92\x4e\x0d\x25\x39\x49\x61\x5b\xe9\x66\xf0\x0c\x66\x85\x4d\x32\x8b\x26\x56\xdc\x18\xde\x82\x19\xa0\xce\x4e\x82\x51\x03\x46\x41\x80\xdf\x09\x3f\x39\x6c\xa3\x35\xad\x1e\x02\x3e\x73\xe4\xa7\xd9\xd7\x5c\xce\x18\xb4\x86\x6c\x3b\xb2\xf5\x29\xa6\xb6\x57\x25\x32\x28\x1e\x4a\x6e\xb1\x64\x17\xfb\xe3\x77\x29\xde\xa7\x1e\x76\x92\xa5\xe5\x69\xeb\x68\xae\xf9\x9f\x33\xba\xb0\xda\x82\x86\xe5\x72\xe1\x89\xa1\x9f\x74\xc2\x0e\x9b\x9b\x84\xf5\x70\x46\x6c\x53\x88\x86\xba\xd9\xc9\x75\x63\xf5\x74\x75\xb2\xf2\xc6\x21\xec\x25\x45\x01\x47\x6d\x7c\xb0\xed\x01\x9d\xde\xcd\x8f\x06\x1b\x7c\xfd\xf8\x8a\xbb\x1f\x5f\xd6\x72\x9a\xb7\xc2\x40\xdc\x28\xd3\x93\x47\x95\xbe\xf3\xc3\x50\xac\xa6\x60\x1d\xf1\xb8\xd4\x74\xf5\x6e\x34\x3f\xf8\x6f\x1f\x3f\x54\x79\x6c\x1f\x81\x94\x19\xc2\xbe\x61\x6b\x86\x49\x37\xdb\xfc\x2c\xff\xc4\x46\xc2\xe1\x79\x87\x41\x85\xc3\xff\x3b\x67\xf2\xe8\xbc\x0b\xfb\xd5\xbb\x92\xcd\x1e\x17\xab\x63\x02\x15\x30\x52\x15\x95\x5f\xa1\x75\xae\x0a\xd2\x24\x34\x7d\x3b\x97\xb2\xce\xa6\xba\x1f\x20\x30\x51\xa4\x45\x44\x30\x37\x88\xe4\x44\xa6\x4b\x9c\xad\xf9\xbe\x94\xcc\x0c\xf4\xe3\x4f\xb3\x4f\x6f\x10\x4e\x3e\xf2\xad\x2a\xf4\x6b\xc5\x80\xdb\x78\xce\x59\x47\x05\x8f\xe9\x07\xb4\x75\xef\x3b\xa0\x70\x2f\x52\xbd\x0c\x26\x32\xc8\x08\x86\x84\xcd\x04\xc5\xe9\x4e\xb2\xad\x14\x11\x6e\x34\x72\x09\x37\xed\x3f\x99\x67\x2c\xe3\x7c\x01\xe7\x26\x77\x73\xf8\xb2\x12\xdc\x90\x93\x43\xd8\x08\x82\xdc\x91\x90\x4a\x2e\x60\xdf\x95\x24\xd6\xb5\xc4\x5e\x9a\x3a\x18\xde\xa2\x06\x71\xc9\x99\x88\x94\x14\x14\x3e\xba\xc5\xbd\xf2\xa2\xe3\x0d\xed\x3f\x9d\xc1\xd3\x33\xf5\x91\x31\x52\xf4\xc2\x72\xcb\xd6\x79\xf0\xd2\x2d\x37\x61\x94\xc1\x61\xc2\xfa\x24\xb0\xac\xb4\x92\x7e\x87\x7a\x4b\x23\xe7\xfa\x2c\xcd\x21\xce\x67\xa7\x59\x73\xf7\xe5\xee\xc4\x49\xd8\xff\xb7\x2f\x0e\xb9\xb2\x36\xdf\x94\xef\x1e\x62\x51\x80\xfa\xa0\x4c\xd4\x77\xa4\xaa\x4b\xa8\xf0\x0d\x16\xe2\xe4\x18\x5c\x92\xba\x16\xe3\xa6\x26\xba\xae\xec\x21\x1c\x86\xc6\x99\xd7\x3e\xa7\xe6\x8f\x21\x68\x4d\xab\x72\xff\xf4\x81\xbc\xb0\x5f\xed\xae\x4c\x71\x2d\xc3\x28\x84\x7f\x59\x78\xee\x75\x33\xd9\xed\x4d\x13\x9c\xe2\x2e\xf1\xba\x4a\x72\xfb\xbc\x07\x43\x38\x91\x52\xb1\x47\x90\xb4\xe1\xbb\x37\x1c\x1f\x42\x2f\x71\x81\xc1\x21\x39\xa0\x57\xe0\x1b\x30\x81\xf2\xb3\x64\x5c\xe0\xed\xb4\xeb\x39\x71\x4f\xc7\xfd\x81\xab\x8c\xfb\xea\xc5\x18\x0e\x89\x45\xda\x10\x6d\xff\xbe\x40\xc1\xa1\xc4\xe2\x73\xb9\x6f\xbf\x5c\xf2\x46\xc9\xaf\x35\xaf\xeb\x2c\x69\xdc\xd7\x32\xad\x90\xbb\x2b\xdb\x9e\x4b\x55\xb3\x1b\x28\x10\x96\x9f\x7b\xc7\x9c\xd3\x20\x4f\xb4\xc5\x74\x32\x1b\xf1\xf9\xc0\x42\xca\x69\x9d\x66\x7c\xeb\x09\x4b\x25\xd1\x06\xcb\xa7\x90\x9a\x79\x08\x36\x13\xcc\x47\xe2\x5c\xb7\x86\xbf\x3d\xfa\x52\xdb\x4f\xda\x76\xef\xb2\x4e\xda\x46\x15\x06\xae\x13\x4a\xaf\xd0\xbc\xfe\xc3\xcb\xc8\x14\xa9\x1c\x75\xbc\xf7\x3a\xc9\xb7\x1e\x7a\xce\x5b\xce\x6d\x59\xc9\x1d\x20\xb6\x86\x32\x78\x8e\x6c\x92\x84\xfb\xa5\x27\x5c\x4f\xf6\xcf\x17\xcd\x48\xb4\xaa\x61\xe9\x33\x8d\x97\x13\x59\x55\xf9\x2a\x46\xf8\x4d\x9c\x19\xa7\xc4\x56\x7e\x0a\xa7\xfb\xc9\x79\xf5\x8c\xd5\xf1\xde\x93\x30\x05\x0d\xd3\xf6\x40\x95\xcb\x71\x90\x3b\xb0\x94\xf2\x72\x25\x3c\x37\xe5\x38\x65\xb2\x6b\x35\x2e\x3b\x48\x1d\x79\x36\x22\x33\xf7\x88\x92\x6e\x04\x57\x66\x8f\x41\x09\x25\xa7\xa4\x73\x36\x2a\x2b\xee\xe7\xc7\xd6\xf3\xfb\x47\xde\x7f\x19\x8a\x76\xf2\x07\xcd\x1e\x37\x85\xc1\xa4\xf9\x34\x3f\xca\x6b\x51\xf7\xf7\x43\x15\x7e\x1a\x03\x37\x72\x5e\x68\xae\x86\x08\x66\xe4\xa7\x21\xe5\x96\x0e\x56\x66\x23\x04\xd2\xf2\x13\x93\x59\x1e\x37\xc5\x74\x22\xa8\xb5\x9e\x95\x1e\x1b\x73\x44\x4c\x50\x77\xbd\x20\xe5\x98\x8e\x79\x05\xe6\x63\x3c\x06\xf7\x98\xc8\xfc\xe5\xcb\xca\xe4\x85\xaa\x59\xe6\x11\x7b\x7b\x53\x30\x4a\xbf\xc6\x64\xdb\xf2\x3d\x9c\x6e\xde\x95\xf5\xfa\x08\x3f\xb1\xab\xd1\xb0\x97\x93\x44\xf7\xde\x94\x37\x19\xc0\x70\x54\x80\xb3\xac\xf6\x25\xef\x44\x15\x5e\x4f\x71\x83\x19\xe0\x99\xe3\x43\x9b\xe9\x77\x55\xbf\x48\xf4\x64\x7d\x1d\xe0\x28\xde\x7e\x94\x19\x48\xf5\xca\x6d\x84\x40\xfc\xdf\xe7\x14\x0a\xc6\xd0\x93\xca\xf1\xe5\x08\x42\x46\xb0\xda\x53\xd8\x5f\xcf\x0f\x76\x59\x6a\x6b\x2d\x34\xb8\x10\x50\x29\xdf\x84\xee\x12\xea\x08\x46\x2b\x1a\x11\xeb\xa2\x35\xc0\xf1\x7e\x3f\x82\xdd\xf9\xf7\xb8\x60\x07\x25\x6b\x57\xab\x31\xf1\x8f\x4e\x8f\x59\xf6\x50\xe4\x84\xc0\x11\xea\xd7\x47\xc6\x0b\x5c\x36\x94\x4b\xe4\x84\x90\x28\xf5\x2c\x3b\x12\xcd\x32\xcd\x63\x40\xfd\xba\xca\x42\x1b\x7c\x03\xd9\x04\xe0\xce\xe4\x6b\x60\xd2\x42\x64\xd3\x0b\x12\xf1\xd3\x73\x8d\x66\xc0\xfc\xcb\x87\x23\x3d\x03\x7c\xe8\x78\x43\x13\xff\x3b\xfb\x4d\x03\xed\x8d\x69\x2f\xc6\xb7\x53\xba\x55\x11\xb4\x6e\xb3\xc0\xa5\x4c\x74\x3e\x79\xac\x29\xb7\x06\x2a\xfe\x50\xbf\xce\x58\x6c\x81\x46\xc8\xba\x03\xb7\xa6\x19\xf5\x1f\x6e\xf6\x6c\xbd\x29\xb6\x52\xf2\xd3\x17\x88\x61\x93\xd8\xc2\x3b\xda\xd2\xe6\x8d\xbf\x51\x0f\x8c\x8d\xd7\x78\xa1\xd7\x78\xd2\x2f\x85\xd1\x28\xa8\x15\x7c\xb9\x85\x61\x0e\xc0\x5d\xba\xdf\x31\xca\x66\x71\xfa\xe6\x8c\xf1\xfc\xd4\x30\xf6\x8a\xf5\x4e\x1d\xa3\xbc\xb6\x55\xf4\xe9\x2b\x12\x46\xd8\x1e\xe1\xba\x69\x3b\x7d\x3c\x3e\x44\x58\x6d\x4e\xd3\xb1\xf1\x65\xaf\x4c\x0e\xd6\xa9\xce\xbe\xec\xb1\xd3\x13\x55\x0f\x94\x9b\x21\xd1\x69\xe4\xc7\x2f\x9b\x26\xc6\x2c\xb3\x6f\x9c\xe2\x70\xff\xa3\xdb\x85\x46\xc0\x8b\xd3\x85\x2c\x65\x81\x91\xc1\x0d\x00\x3e\x34\x2d\xf0\xa8\x4b\x11\xaa\x65\xf6\xd6\x16\xda\xf8\xcc\x84\x39\xd9\x34\xfd\xf8\x3d\x0c\x97\xa5\xac\xa7\x99\x72\x5b\x38\x74\xea\xcd\x47\xa9\x5c\xe9\x2e\x76\x9c\xf9\x77\x2e\xd9\xa2\x9e\x91\x00\x10\x02\xef\x8c\x85\xf0\x70\xbe\x32\x02\xd8\x9f\x92\xdf\x4a\x18\x2d\xd7\x6a\xda\x46\x54\x16\x88\x29\x22\x50\x81\x81\xf9\x6c\xdc\x46\x0b\x49\xa7\xa0\x28\xf6\x07\xce\x48\xb4\x48\xd2\x4f\x7b\xc5\x42\xad\xde\x9c\x9c\x5a\x41\xa3\xfc\xe7\xbb\xdb\xcf\x1d\xbb\x1e\xae\x8d\x18\x40\x7e\x25\x6c\x72\x48\xd9\xaa\x81\xc4\x5b\xeb\x1a\x5c\x02\xd8\xf4\x23\x2e\x34\xde\xcf\x74\x02\x49\x86\xed\x74\xda\x16\xc7\xa3\xca\xaf\xd2\x2b\x19\x97\x8b\x97\xfb\x67\x9c\x62\x67\x65\x0c\x17\x7c\x37\xcd\xf4\xef\x1e\x61\xcb\x37\x2f\x1d\xc4\xab\xe1\xe7\x1b\x84\x63\xf7\x7e\xd4\x81\x92\xf9\xfe\xab\xac\x57\x2b\x30\xef\x9f\x78\x8a\x69\x58\xe0\xaa\x5d\x08\x2f\x98\xc9\xd9\x8b\xf2\x73\xc4\x2b\x38\x5d\x63\x09\x1f\x0e\x57\xde\xa8\x51\x17\x70\xec\xde\xc0\x00\x59\x92\x9b\xe2\x9f\x57\x06\xc5\xf1\x58\x54\xc1\x21\xd5\xa7\xff\x8b\x4d\x01\x9e\xa1\x3b\x10\x59\x24\xe7\xf5\xdd\xd6\xf1\xfc\xee\xdc\x31\x05\xac\xd8\x66\xf3\x3a\x2f\xe1\x29\x8f\x66\xe4\xba\xdd\xf4\x00\x53\x6f\x1b\x35\xd5\x27\x34\x7f\xca\x96\x27\xfc\xc1\x0a\xf1\x9e\x1a\x91\x9d\xa3\xbc\x54\xe9\x3d\x9b\x32\xc3\x30\xd8\xb4\xef\x3b\xd9\x44\x38\x9c\xd9\xba\x06\x3b\xbf\x8e\x51\x6c\x34\x9f\x37\x10\xb5\x34\x75\xf5\x8f\xca\xed\xf2\x65\x23\x7f\xe2\x5c\xbe\x6f\x90\x9d\xa7\x90\x0a\x46\x8a\x80\x48\xd6\x7d\xd3\xa8\x8b\x18\xd7\x75\xf1\x10\x06\x39\x96\xb6\x79\xf5\xa2\x73\xaf\x6b\xe3\xe4\x30\x53\x5a\xdc\xf0\xfe\x3b\x13\xbc\xbe\xe1\x72\x8f\xe1\x0d\x7a\x40\x1f\x75\xf5\x5e\x7d\x48\x23\xb6\x00\x71\x17\x22\x1d\xed\x0b\x83\x09\xb3\x91\xfc\x28\x46\xed\xbd\x5e\x73\x77\xc0\x27\x8e\x5c\xb2\x76\x7d\x8c\x6a\x58\xbc\xbf\x9c\xf4\x20\x37\xf6\xd2\xaf\x31\xe8\xfd\x80\xe5\x4f\x85\x6e\x16\x79\x6e\x8b\x46\x09\xb5\x35\x8d\xa0\x01\x67\x9a\x39\xba\xc9\x36\x72\x05\xd0\x38\xce\xbf\x38\x5a\xd6\x71\x33\xd4\x47\x11\x9a\x8c\x8e\x50\xe6\x72\x3b\xcc\x95\x13\xd5\x7e\x70\xfd\x38\x8e\xc7\xed\x22\xe4\x0b\xf8\xde\x9c\x88\x4b\x01\x76\xa7\x07\xbb\xb7\xbf\x79\xf4\x05\x9f\x92\xdf\x2c\xf8\x13\xe8\x5e\x35\xb1\x76\x01\xe3\x1b\x2d\x54\x2b\xaf\xe9\x6f\x74\x8a\x2f\xec\xa0\xfa\x01\x82\x68\xde\x3c\x83\xe9\x5c\x97\xdb\xc4\x0e\x17\x7f\x5f\x53\xcf\x32\x3f\xb1\x1c\xfb\x38\xf9\xc8\x55\xad\x09\xfb\xb1\x78\xf8\x79\x2e\x26\xff\xe5\x97\x84\xcb\x7b\x45\xd0\x8e\x32\x74\x97\xac\xf1\x76\xb6\xb1\x79\xcf\x5d\x60\xf9\x7f\x72\x43\x2d\xdf\x03\x52\xa4\x77\x3f\xd6\x23\x5f\x0a\xff\x23\xcb\xf8\x2f\xe7\xc4\xc5\x51\x3f\x8e\xe0\xae\x9a\x17\x70\x69\x97\x3d\xd1\xf1\xcd\xe3\x7b\xec\xe6\xbf\x87\xe6\xfc\xc1\x3f\x79\xbc\x27\xe0\x68\xa5\xa3\xec\x8d\x92\x85\xf5\x48\x06\x8f\x3d\x0d\x34\x5f\x5d\x75\x20\xb3\xf9\x00\x11\x84\xba\x9f\x72\x3b\x8a\x98\x9d\xae\xed\x68\x40\xbe\x91\xee\xfa\xfe\xa3\x37\xd8\x23\xdb\x2c\xb6\xac\xfc\x9b\x23\x9f\x04\x89\xfd\xe6\x04\x97\x66\xf0\x62\x05\x9f\xd2\x17\x4f\xec\x91\x21\xfe\xc7\x27\xbb\xae\x94\x89\xd5\xa6\xf7\x62\x3f\xd7\x04\x8b\x43\x6f\x8f\x15\x8c\x5d\x96\xf3\xb9\x91\xbf\xff\xe2\x0b\x53\x40\x3e\x9c\xde\x30\x2d\x65\xb4\xcf\xab\xc2\x1a\x5f\x9e\x07\x7d\x1a\x12\x68\xb6\xa4\xad\xb2\x76\x43\xb6\xff\x7a\x3a\xab\xbc\x3d\x63\x7a\x72\xd3\x77\x95\xaa\x03\x52\x89\x57\xc0\x54\x57\x6d\xb0\xc5\xff\xc4\x55\x2d\xf3\x30\xe7\x2b\x98\xef\x90\x6b\x65\x35\x12\x26\x26\x22\x11\x0f\xaa\x37\xa7\x94\x3f\x7e\x84\x74\x29\x56\xac\xf0\x65\xbe\xd6\x62\x61\x4e\x4f\xc5\x5f\x01\xe3\x96\x99\xbd\x35\x98\xc3\xbf\xff\x3f\x96\x61\xeb\x46\xf5\x84\x23\x21\xd6\x0e\x92\x14\x51\x84\x2f\xe0\xd4\x21\x0d\xfb\x9f\xf5\xce\x48\x8f\x74\x33\x8b\x62\xdf\xc8\xfb\xe0\x35\xca\x15\x8c\x29\x0c\x77\x03\xe4\x9c\xfb\x81\x0c\xec\x1f\x97\xf9\x9b\x90\x95\xff\xa9\xb4\xf2\x6d\x80\x64\xc5\x13\x2c\xc2\xf5\x8f\xa3\x16\xba\xf4\x2b\x9e\xfb\x9f\xb5\x7e\x14\x80\x67\xac\x87\xc9\xdb\x6c\x5d\xf9\xed\x2c\xad\x93\x3f\x52\x71\x88\x44\x25\x20\xfe\x5f\x6c\xf2\xeb\x19\x2d\x50\xc0\xc1\xd0\x63\xe5\xcf\xbc\x3b\x76\xc4\x2f\x8d\xfc\x83\xdf\xf1\x25\xe5\xb0\xe4\x64\xbf\xe2\xbc\x35\x9a\x7e\x47\xda\x5d\xe9\x83\xd9\x7c\xed\x76\x87\x8a\xff\x17\x07\x9b\xcb\x61\xf6\x9d\xbf\x36\xb2\x75\x55\xee\xfd\x86\x42\x78\x5b\xed\x1b\x30\x55\x75\x41\x68\x23\x3b\xdd\x5f\x1e\x45\xbe\x77\x17\xa5\xf7\x4b\x6b\x66\x28\xb2\x5d\xb2\x5d\xaa\x27\xe3\x29\x74\x43\xc0\x09\xe5\xb6\x8b\xff\x89\x3b\xd9\x31\x77\x50\xf9\xd4\x2a\x11\xa2\x2c\x87\x9e\x2c\x19\xae\xbe\x5d\xc0\x15\x64\x5b\xa8\x9c\xed\x40\xff\xd6\x32\xb1\xe2\x8b\xb1\xef\x2e\x52\x79\x9a\x8a\x03\x62\x2d\x68\xc0\xe4\x00\x5d\xc8\xec\x47\xf4\xfe\x07\x07\x50\x9e\x84\x41\x2a\x5f\x35\xa6\x6d\xce\x7b\xad\x9e\xbf\xf6\xfd\x40\xfe\x2e\xf3\x0c\xfb\x0f\x6f\xc2\x67\x92\xd2\xde\x33\x45\x4e\xc4\x4d\x97\x06\xc3\x46\xaa\x3e\x8e\x61\x53\xa7\x98\x47\xae\x5d\x90\x3f\x0f\xd3\x6d\xc3\x5f\x9c\xe5\xb9\x79\x97\x9d\x28\x5a\x2c\xd8\x88\xfe\x1c\xe1\x4c\xcb\x9f\x12\x66\x98\x5d\x76\x75\x3a\x09\x9c\xff\xf4\xbe\xa3\x11\x85\x3f\x2a\x16\xa8\xcc\xfb\x83\x60\xa8\xe1\x7d\xac\xe6\xde\x27\x4b\x30\x43\x51\x0c\xc3\xd5\x31\x04\xf7\x2f\x37\x95\xd1\xa5\x0f\x15\xf9\x34\xc8\x6c\xf2\x4c\xcb\xbf\x7f\x5b\xdb\x2c\x35\xf1\xd1\xe6\x81\x91\x23\xee\x8a\x16\xea\x10\x05\x8f\x19\x7f\xb0\x63\x83\x28\xfc\xae\x72\x35\x2b\xc7\x2a\xe7\xfa\xa0\xed\x60\x13\x85\x53\x98\x68\x19\x2a\xde\xf6\x0f\xf3\xe9\x5c\x75\x5e\x8c\x5d\x67\x33\x7d\x19\xa7\x6f\xc9\xa5\xfd\x0e\xf7\xae\xbb\x7c\xd4\x54\x58\x48\xae\xf1\xbe\x3b\x0d\x4e\x18\x02\x71\x1d\x15\x77\x2a\x0b\xc8\xeb\xff\x60\x71\x4e\xb2\x87\x11\x47\x24\xf5\xb0\x1e\xf0\xc0\x60\xb1\xf9\xb6\x6a\x6a\xab\x1f\xf6\x73\x53\x95\xe2\x7e\x0d\x22\x5b\x3e\x7d\x51\x1e\xd8\x52\xf0\x43\x6a\x74\xfc\x1a\xa6\x8e\xf7\x47\x07\x46\x8d\xce\xf0\x7d\xe7\x96\xa7\x7c\x4a\xba\x71\xb6\x81\x29\x75\x08\x72\x21\xd2\xf5\x48\x07\xaf\x62\xaa\xc6\x37\x65\x9d\xdd\xad\x7b\x45\x1d\xf6\x05\xb0\x9b\x09\x7f\x78\xff\x38\xb9\xc8\x3f\xa5\xa8\xc9\xc6\x39\x80\x36\xe7\xc3\x34\x64\xb5\x4f\x5b\x70\x9d\xeb\xb1\xe9\x50\x09\x36\x7f\xa1\x38\x18\x79\xde\xdb\x1c\x75\x8a\x83\x61\xb6\x39\xae\xa3\xb3\x53\x8f\xdd\x4c\x30\x3c\xff\xc9\xc1\x25\xa8\x18\xc7\x7f\xb5\xe9\x00\xa7\x9a\xae\xbe\x6b\xb6\xee\x32\xdb\x14\xa6\x8e\xcb\xf4\xf1\xc1\x4e\x2d\x5d\x44\x8c\xfc\x7a\xd8\xa4\x94\x79\x9a\x6d\x2e\x66\x1f\xb4\xad\x8d\x9d\xab\xa2\xa2\x26\xee\xff\xf3\x7b\x60\x5e\x7e\x69\x23\xa0\xcd\xfb\x35\xd1\xa6\x03\xbd\x55\xf8\xfc\xe6\xac\xf3\x47\x24\xe1\x1a\xc8\x7a\xcd\x3c\x0c\x87\xd4\x3e\x8c\xb6\x52\xd1\xa9\x78\x76\x51\x2d\xde\x76\x37\x0e\xaa\x6d\xb8\x0e\x3b\xfe\xe8\x5a\xee\x11\x5a\x0a\x61\xf0\x0a\xe5\xa6\xa2\xb6\xc3\x01\x0e\xc5\x04\x15\xef\x3d\x97\x3f\xee\x90\x28\x8b\x90\xc8\x2d\xb1\xac\xeb\xbc\x1f\x38\x56\x29\x47\x9d\x12\xb1\x3b\x8f\x7b\x46\xb6\xdf\x80\xfb\xa7\xf3\xd9\x46\x71\x5d\x71\x2f\xbf\x07\xac\x89\xfb\x1b\xd3\xf2\xce\xfd\x67\x2f\x9f\x62\x5c\x12\xae\x83\x10\xcd\xd6\x52\x5e\xa7\x19\xcc\xd2\xe6\xc1\x0d\x42\xd5\xcf\x3f\x4c\x5b\xe1\xaf\xbe\xb0\x09\xf8\x62\x5f\x53\xfa\xdf\xde\x25\x4d\xd9\x78\x91\x9e\x16\xfe\x5a\x8d\x6b\x6d\x83\xc0\xbe\x30\x8e\x18\x05\x58\x25\xb9\x2e\xa7\xdd\x2b\x63\xe4\x32\xbb\x58\x4b\xa8\xc0\x70\x18\x0f\x96\x47\x75\x30\x3d\x7d\x29\x68\xf4\x6e\xf9\x94\x6f\x47\x71\xf8\x1f\x8e\x50\x8e\xfd\x8a\x98\xed\x7a\xad\x2d\xba\x11\x7e\xa4\x56\xa4\x6a\x23\x71\x76\x6b\xfe\xd6\x89\xcd\x4b\xc9\x33\x06\x41\x06\x97\x9f\xa4\xe2\x1c\xaf\xf0\x9b\x42\xee\x81\x74\x5a\xfa\x0e\x86\xc7\x28\xcd\x00\x59\x83\xf2\x54\x6f\xd3\xaa\x6b\xd8\xf6\x7f\xb1\xee\x5a\xbf\x28\x2d\x59\x9f\x86\xe1\x33\x1c\xb4\xd3\x3c\x4f\x03\xed\x13\x60\xa6\x7e\x25\xf3\x35\x4b\x0d\x6e\xfa\xc1\x9d\xe9\x4b\x9e\x8d\xe7\x72\x4f\x2e\xe0\x10\xc0\x73\x60\x5e\x57\xe9\xac\xc7\x14\x3f\x38\x2d\xa3\xdd\x6a\xce\x50\x7a\xde\xb9\xa5\x00\x9b\x47\x11\x76\x5d\xe0\x74\x09\x62\x88\xf5\x9c\xf6\xb6\x8a\x25\x72\x3b\xc2\x11\x77\x57\x1f\xaa\x6e\x0b\xd5\xc7\x59\x66\xc8\x53\xa2\xe6\x93\xdc\x4e\x2b\xa6\x0a\x25\x38\x74\x27\x29\x06\xb7\xd9\x57\xfe\x61\xd3\xdf\x3e\x81\x8e\x06\x48\x85\x7e\x2d\x34\xf0\x12\x51\x46\xff\x9d\x33\x56\x53\x5d\xcd\xd5\x35\x9b\x52\xcc\x06\x6d\x74\x82\xe4\x63\x90\x6a\xf0\xb2\xc0\x35\x47\xa6\x3c\x9c\xaa\x77\xf6\xf7\x9e\xf5\x3c\x41\x4c\xb9\x87\x5a\xba\x0d\xcc\x73\x27\x3c\x9b\xd7\x54\x22\x4d\x75\xbf\x73\xfd\x30\xd0\x37\xcf\x9d\x59\xb0\xca\x59\x8a\x6e\x66\x48\x53\xd5\x12\x54\xc9\x73\x5b\x8b\x31\xfa\xa3\x53\x5b\xe4\xd5\x3f\x23\xaa\x3a\x94\x45\x40\x20\x0a\x04\xbc\xa4\xc9\xfe\x89\x94\xaa\x6a\x41\xdf\x2f\x1c\x12\xbe\xb2\xd0\xf6\x0b\x54\x4d\x6f\xd7\x15\x8e\x03\xbd\x93\xe1\x25\x36\xad\x34\x7a\x16\x7a\x6b\x08\xa3\x07\x9f\x77\x65\x73\x24\x6d\xb1\xe7\xdd\xf2\x2f\x89\x09\xd7\xea\xb1\xef\xf3\xf7\xde\x38\xc3\x32\x9f\x36\x50\xda\x9e\xea\x9d\x96\x78\x3a\x28\x6a\x92\x76\x9e\xf0\x17\x80\x90\x8c\x70\xd5\x04\xb6\x7c\xeb\x66\x9c\x05\x2b\xfb\x6f\xb6\xb7\x22\x33\xbb\xac\x24\x40\x92\xe4\xec\xdd\x2b\x79\xc5\xf2\xc2\x56\x0b\x9b\xca\x3d\x86\x71\xc8\x16\xac\xe7\x58\xed\xf3\x27\x91\xc6\x70\x8a\xec\x2a\x35\x52\xa4\xbd\x69\xe4\x2f\x8e\x6a\xb8\xad\x6b\x89\xc9\x5e\x16\x4c\x1e\x02\xc1\xc9\x4b\xf9\xa9\xc9\x9a\x27\x38\x45\xea\xb2\x63\xf8\x18\x12\xc7\xa9\x37\x3e\x76\x9a\x0e\x57\x9f\x4b\xd6\xb4\x69\xdd\xe5\xab\x5c\x1c\x14\x2b\xfe\x0c\xca\x24\x6d\xf9\x6a\xd1\xa2\xb8\xd7\x8a\xc7\x5a\xa4\x1d\x18\x71\xbd\xd1\xda\x6a\xca\xdc\x74\x22\x33\x87\x16\xbd\x76\x52\xe9\xc7\x23\x2d\x47\xe8\x41\xe2\x26\x3d\xee\xd8\x38\x12\xfe\x07\xd5\xdd\xcb\xf2\x1e\xd9\xa2\xb2\xea\x5d\xdc\x7b\x9a\x69\x21\x89\xca\xdd\x8a\x02\xcd\xfe\x5c\xa3\x63\x9e\xfe\x5f\x5d\xc1\x28\x72\x22\xe9\x4c\x6c\xaa\x7b\x8e\x89\x33\x2d\x1b\xcc\xeb\x9f\xd7\xa7\xc4\x41\x0b\x47\x0b\xe4\xce\xbd\xc2\xe1\x78\x0f\x47\x53\x11\xdc\x9f\x7b\x13\x46\xbb\xd6\x94\x6d\x25\xad\x45\xcb\x53\x8e\xb7\x7d\x88\x92\x29\xb2\xb1\x8c\x23\x31\x07\xa5\x92\x73\x7d\x38\x15\x99\xb2\x84\x26\xa7\x4e\xe3\xef\x72\x9c\x13\x6f\x73\x33\xd0\xb3\x39\x1a\xb2\xed\xae\x26\x7f\xd6\xd3\xdc\x9a\x8f\xe4\x20\x23\xf4\x24\x61\x7e\x3b\x65\xd5\x00\x5f\x3a\x23\x24\xf4\x8c\xab\x70\x3d\xc4\x8d\x8b\x55\x53\xf8\x15\x21\x25\xbb\xeb\x62\x56\xfb\xee\xa4\x35\x06\x8f\xb9\xd9\x9f\x5c\xd0\xe2\x77\x7d\xda\x90\xdb\xdc\xa5\x51\x7a\xfe\x3b\xdc\x7f\x27\xeb\x54\xd8\xda\x08\xd3\xd1\x3a\x81\x94\x18\x48\xda\x63\xdd\x11\x85\x30\x7d\x4d\x30\xd8\x25\xfc\x39\x2f\x8b\xbd\x74\x0e\x81\xcc\x7d\xeb\x3b\x46\xf9\x25\x1b\xc9\x2c\x7e\x86\x50\x4f\x91\x32\x48\x79\x3b\xeb\x55\xa3\x31\x3f\x09\xd4\xc1\xdd\xe3\xe5\xea\x1b\x66\x5b\x58\xe8\x7b\x49\x6a\xed\xd9\xb0\x6d\xa9\xc8\xa0\xfe\xb7\xae\x92\x11\xf8\x33\x9b\x3f\x6e\xc6\x57\x9a\x43\x05\x9d\x67\x2a\x2b\x81\x1f\xe5\x6c\xda\xde\xa9\x35\x88\x7c\x81\xd1\xd9\xae\x42\x8c\x46\xf8\x73\x3e\x16\xad\x74\xf6\x6e\xae\x27\xa6\xd3\x69\x67\x1e\x15\x19\x1b\xe3\xd7\x2d\xc9\x02\xea\x34\xff\x89\x97\xb8\x96\x4a\x64\x12\xa0\x51\xa1\xf1\x08\x71\x18\xf8\x14\x78\xa2\xff\x8b\x21\x30\x1c\x73\x6a\xbc\xe0\x7d\x72\x87\x88\xfd\x0e\x1f\x21\xb5\xd9\x58\x11\x0f\x4f\x19\xed\x6d\x8f\x00\x23\xe4\x40\x0f\x22\x47\x66\x48\x5a\x42\x4d\xad\x08\xeb\x89\x9c\xe7\x08\xb7\xa1\x5b\x81\x09\x8f\x59\xb8\x94\x53\xc2\x2e\xc9\x19\x2f\x89\x54\x8e\x4a\x9a\x19\x93\xc0\xb3\x05\x9e\xd9\x42\xc8\xb1\x35\xe7\xaf\x6f\xc2\x28\x1c\xd6\x99\x4a\x2c\x78\xbe\x35\x29\x7c\xf8\x1d\x56\xd3\x5d\x43\x8f\x3e\x48\x08\x88\x1f\xba\xf6\x18\x19\x6b\x28\x41\x5a\x4e\xa0\x72\x6e\xb5\xff\x64\x9b\xe9\x4a\x5f\x18\x59\x6f\xc0\x7e\x01\x7c\xc9\x22\x5c\x71\x50\x89\xb9\x10\xf3\x93\xa6\xba\x94\x69\xf3\xa6\xf4\xbf\xec\x3d\x76\x38\x99\xdd\x31\xcc\xc2\xf0\x78\xf1\xf7\x28\x29\x8d\x4e\x74\x6e\xff\x35\xdc\xb0\x23\xf3\x34\x37\x05\x14\xa1\x77\x3a\x5e\x69\x74\x66\xca\xd7\xb6\x80\xb5\xbc\x46\x0e\x92\x4f\x3b\x5e\x81\xf8\xb9\x6d\x0f\x98\x81\x31\xcb\xed\x14\x36\xb7\x0c\x3e\xe4\x74\xac\x3e\x17\xf5\xb9\xeb\x10\xa0\x3b\xc9\xc8\x92\x5d\xb8\x3b\xf0\x6d\x49\x95\x65\xa7\x99\x96\x9c\xce\x36\x58\x85\x85\x9f\xd3\x7f\x09\x94\x79\x18\xd3\x12\x2e\xf6\xef\x46\xca\xc2\x2d\xd9\xee\x0c\xa5\x53\xfa\x72\xa9\xdf\x6c\xd9\x1e\x72\x2d\x64\x8d\x28\x64\x27\xb0\x99\x7f\x29\xc6\xf6\xdc\x92\xce\x30\xe7\x06\xe3\x6a\xe1\x3e\x5a\xf6\x11\x26\x5a\x8c\x5e\xde\xb4\x13\x84\x75\x0c\xb6\x35\xb2\x78\x28\xf9\xe4\x69\x02\xef\x60\x39\x40\x91\x3b\x94\xf3\x58\xcb\x34\xa0\xad\xac\x37\xca\x26\xb5\x84\x6f\x49\x6e\xec\x59\x20\x16\x7e\x74\x08\x07\xa1\xbe\xd5\x22\x5e\xcc\x0e\xfa\x1c\x72\x33\x9c\x6d\x42\x5e\xd2\xe3\x91\xaa\x2e\x0e\x17\x82\x13\xf3\xe1\x49\xb6\x80\xed\x79\xf9\x78\x5c\xc0\xf7\x05\x09\x79\xb3\xd5\xc1\x64\x38\xb8\x73\xd5\x68\x45\xa2\x82\x6f\x8b\x10\xa0\xb2\xaa\x07\x75\x2c\x5a\xce\xfc\x9c\x4e\x72\x48\x96\xa1\x9c\x05\x9a\x1c\xc3\x74\x79\x4d\xb5\xb5\xd4\x1d\x39\xd3\x07\xf3\x3b\x0c\x67\xac\xff\x95\xab\x8a\x1d\x4c\x4f\x51\x7b\x5d\xb7\xd3\xc1\xe4\x8f\xfd\x79\xf3\x05\x33\xeb\xce\x32\x0b\x3a\x23\xe7\xea\xbd\xaa\x9c\xfc\xca\x02\x0a\xd9\xd7\xcb\xaa\x91\xba\xae\x30\xb0\x87\xc5\xd4\xcf\xa2\xac\xc0\x26\x97\x76\x00\x4d\x58\x9f\x23\x43\xcc\x55\xad\xc1\xd4\xde\x3b\xdf\xd6\xf7\x61\x3d\xc4\x13\x78\x7c\x25\xfe\x35\x67\xf4\xff\xe6\x14\x07\x23\x6d\x9c\x56\xa1\x86\xde\x18\xd0\x0e\xc2\x8b\x68\xc7\xc7\x91\xa8\x5a\xb2\x96\x71\x10\xa2\x6b\x5a\xa9\x61\xa0\x06\x69\xa0\x1f\x32\x5d\xf5\xc7\x61\x45\x20\x44\x83\x04\x07\x2d\xd1\xf2\x2d\xa0\x8e\x06\x66\x83\x55\x34\x17\x26\x3e\x7e\xb6\x84\x9a\xeb\xeb\xd5\x82\x6b\x46\x41\xa8\xf6\x25\x70\x6b\xcf\x79\xea\x95\x44\x50\x63\x5f\xd8\xdf\xad\xbe\x8d\x63\x77\x5c\xa5\x77\xa0\x3a\x1a\x94\xc7\xfd\xf8\x3e\x4f\xca\xe6\x74\x52\xf5\x87\x8a\x1b\xfc\xb3\x1e\xa8\x19\xf8\x68\xd7\x39\x8a\xd3\x11\xb1\x74\xbd\x04\x2e\xb8\xcc\x16\x66\x1b\x1c\xad\x9c\x22\x6e\x39\xb2\x5d\xa5\x1c\xa9\xc7\x70\xd6\x78\xb5\x14\x9b\xcc\x10\xbe\x2a\x8d\x70\x94\xda\x6f\xb4\x3a\x69\x8a\x85\xc5\x76\x88\x33\x25\x92\xba\xcd\xae\x66\xd4\x65\xbe\xe2\x60\x4d\x5d\x74\x7f\x73\xab\x8c\xa3\xdf\x50\xd4\xa1\x8f\xa2\x8e\x72\x5a\x8e\xfd\x11\x50\x90\x94\x40\xfb\x03\x66\xf8\x4e\x4d\xc7\xb6\x22\x1b\x4e\xa8\x84\x1b\x24\xfd\xa1\x86\x43\x8d\xe6\x79\xfd\x1c\xa8\xf9\x46\x38\x73\x89\x77\x35\xc5\xd1\x79\x2f\xdc\xec\xb2\xac\x20\x64\xbc\x53\xe6\xdf\x36\x2a\xf3\x89\x83\xc7\x58\xe1\xbc\xc6\xe7\xf6\x9e\x23\xfe\x9d\x69\x86\x71\x31\x7e\x23\x78\xf6\xf5\x55\x3b\xb5\x54\x61\xf2\xd2\x2d\x86\xce\xd0\x70\x5a\x89\xbb\xf2\x17\xcf\x96\x50\x5d\x4c\x6b\xe9\xef\x5e\x38\x07\xa8\x20\x20\x25\xe7\xb1\x78\x8d\x39\x1d\x22\xd0\x0a\x1f\x27\x8a\x96\x05\xc6\x35\xa1\x3b\xd5\x83\xc9\x52\xa0\xf9\x79\x83\x65\x4a\xe4\x8d\x63\xf8\x2b\x62\x1c\x8f\x01\xff\xd4\x2b\x32\x0c\xa7\x5d\xa3\xca\x68\x8f\xd7\x18\xd7\xe3\x1d\x6d\x3f\x0a\xfe\x5a\xfa\x9a\x81\x97\xed\x71\x56\x80\x98\x45\x60\x39\xee\xe0\x83\xf2\xb2\xb3\x8a\xc4\x00\x99\x54\xf4\x6a\x04\x00\xcf\x19\x02\xd8\xa0\x79\xec\xe6\x37\x58\x38\x95\x80\x8b\x22\xcd\xb0\xeb\xa5\x02\x83\x4b\x9c\x65\x61\xea\xf6\xc7\xc0\x0b\x89\x9e\x34\x62\xaa\xa6\x0c\xbe\x09\x77\x65\xd1\xa4\x55\xad\xb7\x86\xc6\x84\xeb\x68\x55\xfd\x7f\x5c\xbd\xc5\xb2\xec\xca\xce\x35\xfa\x40\x6e\x98\xa9\x69\x66\x66\xf7\x5c\x66\x66\x7c\xfa\x1b\x6b\xed\xfd\x9d\x73\xfe\x1b\xb3\x37\x23\x5c\x95\x95\x29\x69\x8c\xa1\x94\x25\xad\xbb\x7d\xce\x78\xa3\xd6\x00\xcd\x6b\xa2\xc8\xa9\xf8\x7e\xe2\xa1\x3e\x8c\x42\xdb\x3f\x26\x15\x47\xa4\xc0\x4f\x65\x87\xd6\x21\x58\xc7\xa0\x34\xe9\x81\x57\x07\x63\x39\xcc\x45\x70\x0a\x85\xa3\xfe\x7b\x5e\x35\x53\xef\x6b\x58\xab\xdc\x3d\x71\x86\xf2\xb9\x99\xd0\x01\x14\xb1\x04\x6b\x2f\x66\x66\xaa\xf4\x59\x09\xc7\xd2\xeb\x2e\x9f\x94\xf8\xf7\xc7\xb9\x15\x59\xc2\x07\x7a\xd2\x37\x40\x86\x6f\x65\x52\x7f\xf8\x85\xcc\xe0\xf2\x6f\x58\x8f\xe1\xf4\xaa\x3a\x65\xdf\x49\x83\x22\x8e\xc6\x09\x29\xb7\x34\x83\xc8\x1c\x7b\xf9\x4f\xf9\x08\xc3\xf0\x22\x10\x0f\x5a\xf0\x46\xae\x20\xf3\x2a\xef\x35\x99\xed\x82\x0e\x72\x03\xdf\xb5\xe9\xd0\xd0\x7f\x13\x3f\x03\x87\x68\xea\x53\x51\x07\x6c\x1d\x89\xd7\x4c\xe6\x83\x2a\x28\x2e\x37\x17\xfc\x56\x70\x7d\x9e\xd4\x93\x14\x65\xa1\xb7\x86\xde\xec\x2c\x58\x13\x4c\xf5\xca\x21\x7c\xd2\xa0\xe5\xff\x05\x20\x86\x11\x3c\xb6\x11\x9a\xd1\x33\xe3\x96\x72\xda\xd4\x97\x7e\xce\x44\xc4\x67\x59\xa9\xbf\xa8\x4a\x27\x93\x5d\x7a\x63\x98\x7a\x14\x10\xef\xd3\x24\x43\xc3\x76\xcb\x29\x80\xcf\x82\x70\xa6\x94\x72\x70\x0d\x7f\xfa\x14\x7f\x1f\x82\x6f\x3a\x44\x7b\x22\x96\x91\x3d\xb6\xfa\x2f\x46\x2a\x0c\xf6\x87\x0f\xa4\x77\xf4\x58\x48\xa9\x3f\x9c\x71\xc5\x9f\xcf\xdb\xa7\x69\xb6\xe4\x44\x4f\x5c\x9b\xe2\xa1\x88\x93\x84\x0e\x11\x57\x88\x5f\x25\x79\x4e\x34\x91\x4a\x33\x2e\x73\xce\xd8\xab\x4f\x33\xe8\x2f\x6f\xf1\x3e\x97\xea\xf9\x54\x54\xb5\x5c\xff\x8f\x3b\xf3\xad\xa1\x5e\xa6\xa9\x44\xd5\x58\x8e\x66\x1a\x8e\xdd\x9d\xf2\x59\x15\xb1\x33\x32\xde\xaf\x5b\x50\x5d\x4f\x84\xc0\xf6\x6a\x90\xd4\xc3\x90\x04\x8d\xd5\x47\x57\xbf\x1f\x6a\xd4\x60\xcf\xd5\x7b\x39\xfe\x1e\x9c\xe9\xb5\x54\x1a\x8e\x42\x33\x0c\x88\xf8\x52\x87\xd1\xb7\xda\x62\x0e\x45\xb9\xf4\xff\xd8\x32\x63\x8d\xab\x6a\xa4\x8d\xdd\xf6\x66\xb2\x8b\x93\xb9\x8a\x18\x2d\xbb\x7c\xc5\xab\x4c\xc7\x65\x5b\xa8\x25\x19\xd5\xfe\xf8\xf4\x47\x1b\x28\x52\xcc\x60\x4c\x3c\xe8\x7c\xbb\x9f\x7d\x02\x4b\x51\xb7\x3c\x84\xae\x76\x4c\x00\xe1\x3b\x06\x6e\xd9\xde\x7e\xb7\x89\xce\xca\x02\x7d\xc1\x8d\x13\xdb\x9d\xca\x1f\x33\xfa\x1f\x5f\xe5\x5d\xdc\x6c\x0e\x4e\xd0\x09\x69\xad\xc7\xa2\xd2\x5c\xd5\x1c\x7e\xdf\x40\x2c\xa1\xb5\x42\xd1\x39\x08\x5e\x36\x38\x84\xec\x4e\xa4\x40\x77\x3d\xbd\x83\x8e\x46\x5b\x21\x09\x6d\x8f\x2c\xd1\xe6\x3b\x6a\xfd\xe0\xa9\xbf\x68\x92\xa4\xe0\x52\x20\x1c\x2a\xe4\xdb\x73\xc2\xff\xb5\x2f\x53\xa8\xf5\x54\x8f\x36\x36\x51\x71\x2f\x30\xcb\x0d\xce\xf5\xb6\xb2\x74\xbb\x3f\x84\x5f\xf2\xc1\x70\xaf\xd7\x27\xb7\x16\xa8\x4c\x97\x53\x80\x98\xbf\x81\xae\x26\x10\xb2\xa3\x9f\x2f\x95\x27\x2c\x94\xe5\xd7\xef\xd7\x60\x2d\x90\x45\x52\x39\xb4\x84\xce\x0a\xe0\xcf\x1f\x60\xc7\xf0\xff\x68\x0c\x96\x31\xb9\xac\x0b\xbc\x3f\xf1\x8f\x5c\x56\x1b\x78\x09\xd5\xfb\x90\xec\xc9\xb6\x30\x1b\x42\x61\x3e\xc2\xf6\xd3\xa5\x19\x9e\x60\xab\xb7\xf2\xf4\xdd\xd0\x26\xa4\x3b\xaa\xea\x7e\x55\x81\xcd\x27\xdd\x48\x46\xda\x1b\xfd\x72\x13\x5c\x90\xa4\xf8\x15\x2a\x0b\xa2\x59\x1d\xb3\x9f\xca\xac\x40\x35\xf9\x5f\xae\xcf\x31\xe3\x79\x23\x61\x4a\x5b\x1e\xab\x16\x4b\x46\xfb\x2b\xca\xbe\xa4\x69\x98\x83\x91\x1e\xcb\x38\x13\xc0\x03\x54\xa8\x89\xa2\x45\x43\xdb\x17\x0d\x56\x17\x82\xfc\xd1\x4d\x8d\x6a\x6e\x5c\x98\xa8\xef\x00\x71\x79\x94\x5c\xb7\xe2\xc8\x58\x0e\xd5\xe8\xff\xf3\xd9\xaa\x50\x79\x7d\x90\x75\xe1\x3a\x04\xc2\xf1\x3e\x76\x37\xcc\x5e\x89\x24\x67\x48\xa1\xc8\x94\xd9\x0f\x60\x3f\x79\xf3\xc4\x24\xb2\x2a\xe4\xfe\xd7\x0f\x73\xbd\xcb\x13\x5a\xd5\x0a\x86\xd5\x8c\x9d\x0a\xdb\xe1\xfc\x2d\x2c\x5b\x0b\x5e\xaa\x60\xae\xb3\x2c\xec\x9d\x67\xff\x71\x43\xd1\x3c\xfd\x1a\xd3\x14\xc2\x89\xfb\xd6\x3d\xc2\xd5\x83\x9a\x1d\xee\x4d\x5d\xd9\x11\xa0\xb2\xd4\xad\x24\x8f\x95\x28\x5b\x60\x53\xa5\x44\x50\x78\xba\x48\x3f\x88\x63\x1e\x76\x34\x9b\xbe\xc6\x4b\x8c\x81\xea\xeb\xbf\x38\xd7\x0a\xe3\x12\x5a\x1d\x4c\x68\x48\xec\x5f\x2e\x21\x87\x6a\x66\x78\xac\x0a\x8d\xbf\x03\xa1\xc5\x40\x50\xdc\xda\x30\xbb\xc9\xdf\x42\x6d\x29\xa4\x59\xf8\xc9\x8d\xb1\x1c\x06\x98\xd3\x4c\xad\xfa\x03\x5e\x26\x35\xa7\xb2\xc8\x7f\x31\x9b\x61\x7a\x4f\x14\xfb\x3e\x99\xdb\x4d\x6d\xb3\xd8\xda\x0b\x7e\x2d\x9c\x55\xc0\x70\xca\xdc\xcd\xc6\x29\xda\x3a\x54\xfb\x23\x05\xd2\x97\x65\xde\x49\xfd\x72\x9b\x93\x4d\xfb\xce\x5d\xe6\xff\x1c\x89\x65\x62\xa1\x75\x17\x56\xfa\x90\xdc\x55\x8e\x3c\x45\xa3\xae\x99\x8e\x28\xa2\xfd\xb5\x70\x12\x79\x00\x3a\xdb\x21\xa6\x50\x5b\x1c\xf6\xf3\xea\x5e\x6b\x0c\x76\x73\x43\x37\xf6\xf8\xff\xe1\xdd\x0a\xaf\x7d\x48\xe2\x12\x72\x34\xb2\x69\x38\x7e\x9c\x17\x95\x18\xa1\x7a\xab\xef\x64\x5f\xc0\x83\x1e\xae\xf4\xc3\x59\xc9\x6f\x42\x86\x34\xd2\xb7\x26\x55\x5a\x8a\xc0\x10\xce\xf4\x5f\x9d\xf5\x28\x85\xe0\x85\xeb\x8d\x64\xcf\xbc\x34\x33\x08\x50\x6c\x63\xaa\xa3\xa1\x1b\x7b\xed\xda\xa2\xa3\x2d\x21\x21\x87\x73\xb6\x28\x12\x75\x89\xb7\xc0\x14\x8a\xfb\x3f\xba\xa6\xb6\xe7\xbc\xe3\x21\xc9\xb1\xf4\x3f\xfb\x67\xae\x42\x52\x61\x7f\xf8\x76\x0d\x93\x15\x88\x12\xd9\xd2\xc2\xa3\x01\x28\xbe\x8d\x5f\xa6\x37\x88\x4a\x12\xf4\xd9\xfd\x31\x78\xb1\x7e\x50\x43\x7a\x42\x7d\xef\xff\xe1\x80\xfa\x5b\xc9\x5f\xc7\x26\x66\x7b\x14\xaa\x30\x65\x7b\x9e\x56\x36\x9b\x6d\x4b\x4c\x71\x30\xa2\x3c\x0a\xb1\x6f\xdc\x9c\x36\xb9\x96\xb2\xc4\x5e\x50\x27\x06\x4b\xea\x6d\x2a\xfe\xd7\x18\xff\xc1\x27\xbb\x99\xdb\x5d\xcd\x9c\xb6\xff\xa4\xfa\x79\x47\xe7\x79\x04\xe6\xe0\x21\x14\x5a\xcf\xfc\xe8\x8d\xd5\x60\x2f\x67\x11\x93\x4f\x49\xd3\xb4\x7d\x84\x39\xdd\x9a\x96\xa5\x15\xff\xdf\x77\x94\xfe\x4e\x47\x16\xa1\x36\x72\x1e\x5e\xb2\xe0\xa8\x61\xe4\x3c\x9d\xcc\xe5\x6c\x36\x75\x7d\x22\x0e\x59\xc9\x16\xab\x7b\x2f\x7d\xde\xfe\x7d\xb5\xf9\x52\xdf\xfc\x61\x64\xcf\xcc\xd5\xee\x3f\x44\x9a\x65\x94\xd3\x1f\xf0\x95\xc3\x1a\xde\x4f\x7f\x7e\x62\x74\x65\xa3\xf4\xe7\x4d\x13\x04\x1b\x68\x83\xfc\x8b\x63\x77\x3d\xc2\x75\x72\x60\x6f\x78\xa5\x0c\xde\xb9\x57\xb7\x04\x2e\xbb\xf7\xbc\xf9\xbf\x4f\x51\x19\x5f\xdf\xa7\x6c\xa7\x71\xa7\x3c\xc2\x55\x54\x25\x8b\x93\x6c\x97\x38\xc3\xc7\x12\x14\xbf\x48\xfb\x00\x12\x6a\x69\x2a\x56\x5f\x1d\x53\xc0\x56\x04\x9e\xb8\xbb\x7f\xdf\xdd\xfb\xe3\x4b\x6b\xc0\x78\xae\xa5\x2a\x41\xff\x3e\x18\x81\x4c\xcc\xd0\xef\xf0\x08\x47\x2b\xec\xad\x81\x33\x0b\xb5\x34\xd4\x9e\xa7\xcc\x6d\x23\xdb\xeb\xb2\x38\xfe\x66\x27\x89\xf3\x5f\x48\xdc\xfd\xe6\xd5\xc2\x45\x9a\x24\x87\x9f\xaf\xb4\xe3\x32\x99\xcb\x42\x77\x45\xcd\x2f\x67\x92\xb6\x0e\x1e\x69\x86\xb4\xc6\x61\xdf\xfe\x46\x88\xef\x1d\xd8\x9c\x2d\x94\xf4\xbf\xf6\xc1\x39\x1a\xf3\xf1\x38\xc7\xc6\x1a\x3b\xbc\x67\xfe\xec\x66\x2b\x58\x6d\x92\x7e\xce\x3c\x46\x23\x6e\xf1\xe8\x5a\x79\x58\xec\xb7\x56\x2b\x2a\xbf\xff\xe1\x19\x0e\xa3\x84\x38\xbf\x3b\xac\x32\x29\x4e\x98\xb8\xc6\xac\x72\x8a\x9f\xa7\x5d\xd2\xf2\xa2\xc9\x40\x53\x49\x33\xb9\x1b\xfe\xff\x9e\xd1\x07\xbc\x8c\x5e\x5e\x31\xb0\x45\xfd\xdc\x44\xe4\x1a\x8d\x4f\x7b\x6e\xbd\xc2\x7b\xd5\xc6\xe6\xf6\x7b\xfc\x4c\x6e\xcb\x50\xf9\xb1\x37\x81\xff\x38\x34\xab\x29\xcb\x39\x50\x3a\x27\xda\x66\x9a\x0e\x3f\x3f\xd9\xb0\x9a\x49\xeb\xd7\x57\x2f\xf3\xce\x1f\x4e\x1e\xda\x7a\xcd\x39\x46\xeb\x2d\xe0\x7f\x72\x07\xba\xa0\x71\xb8\xc8\x78\x3f\x39\x97\xf9\x43\x54\x1c\x83\x91\x82\x68\x08\x9a\xde\x64\x77\xa7\x69\x4a\xf7\x2d\x3d\xd2\x0a\x7a\x9e\xb8\x89\xfc\x3f\x7e\xab\xaa\x3f\x33\x1b\xa2\x25\x54\x1a\x7e\x6d\x3a\xa8\xdc\xc2\xac\xf3\x1b\x86\x6d\xf0\xdf\x4f\x4c\x83\x28\x18\x1b\x66\xcc\x81\xa8\x59\x18\xb6\x67\xff\x77\x9d\xa7\x60\x56\xf5\x72\x77\xba\x31\x65\x24\x1f\x4b\x4c\x27\xb8\x6e\x28\x61\x16\xdc\x02\x13\xb9\x73\x56\x86\x19\xb5\x81\x61\x3d\xc7\xfc\x87\xda\xf4\xd1\x20\x36\x4c\xa2\x39\xc2\xd6\xe3\x67\xd6\xee\x4c\x33\x18\x5b\x98\xa4\x5d\xf0\x13\x94\x6a\x80\xac\x15\x52\xfb\xa4\x34\x6a\x83\x56\xfe\xef\x21\x8f\x6f\x8f\x70\xb4\xe0\x88\xe5\x64\x95\x37\xb2\x2e\x9a\x61\xed\x38\x98\x66\xb3\x7f\x1b\xaf\xa5\xbc\x2c\x2a\xfb\xa2\xb7\x4a\xed\xb0\x46\x6d\xff\x17\x23\x54\xc6\xf0\xb4\xa4\x1f\x83\x7b\xdc\xe9\x73\x6f\x19\xb3\xb7\x55\xa5\xa7\x40\xf5\x0d\x9c\x9a\x1c\xa3\x56\xbb\x87\x90\xed\x79\xe9\x7f\x74\x36\xdb\xbf\x72\x4e\xa4\x56\xdb\x0f\xef\xdd\x7b\xfe\xea\x18\x89\xb7\xcf\xa1\x33\xeb\x52\xf2\x61\x0b\x03\x95\x09\x46\x6d\xe6\x28\x77\x8a\xfc\x3f\x8e\xea\xf0\x7e\x28\x88\x84\xa9\xa5\xba\x98\xe9\x6e\x26\x3a\x0a\x43\x38\xb6\x77\x47\x3b\xac\x2d\x2e\xfb\x7a\x33\xe1\x61\x82\x20\x31\xff\xef\x73\xae\xea\x05\xbd\x5b\x2f\x8c\xa0\x2d\xb1\xf6\xe3\xb3\xa1\xe2\x73\xac\xeb\x2f\xdc\x9e\x7d\x3e\x09\x04\xc7\x98\x4e\x4c\x28\x8b\xb2\xdb\x9e\x7c\xec\xb3\x51\x03\x04\x28\xdb\xe2\x22\xed\x8d\x5c\x91\xec\x7a\xfd\xcf\xfe\xb2\x6a\x72\xf0\x5b\xe0\x18\x0d\x14\xb5\x59\x71\xfa\x83\x37\x8a\x76\xa9\x62\x36\x7d\x79\x7d\xd1\x00\xc4\xb9\xed\xdf\xb5\xd7\x06\x76\xbc\x7a\x1a\x8e\x24\x9a\x10\xbc\xa3\x69\xe1\xd0\x24\x1d\xa7\xb2\xea\xff\xea\x41\x9c\x1b\xf8\xa4\x8d\x59\x6a\x52\x3f\x49\xc9\xdc\x7b\x21\x15\x3c\xd6\x2e\xf8\xd9\xad\x06\xb6\x60\xe6\x85\x8e\x85\x0e\xd6\x30\xcf\x6c\xcb\x52\x72\x3f\x03\x7d\xa9\x72\x09\x99\xc9\xbd\x86\xf8\x2d\x58\xab\x04\x21\x26\x19\x77\xfb\x7f\x0b\xe4\x1c\xe3\xb7\x12\xe7\x45\xd2\x60\x5d\xaa\xd5\x92\xe1\x28\x89\xbd\xf6\x47\x55\x50\x82\x9b\x57\x67\x56\xf9\x8f\x79\x05\xa6\xae\x45\x65\xa8\x8d\xa6\x87\xa5\x19\x86\xe8\xbd\xac\x4d\xb2\xce\xa4\x05\xc5\xbb\xd3\x01\x8f\xa2\xda\x16\xaf\xd5\x96\x73\xd8\x25\xb9\x12\xac\x70\xb1\xba\x03\xaa\x38\xc6\xe3\x1d\xf7\x76\x84\x55\x66\xc6\x04\xb4\x26\x95\x6d\xfe\xf3\x7b\x14\xde\x80\x8a\xc9\xa5\xaa\x12\x04\x3d\xd4\xfd\x3e\x95\xf8\xd8\xae\x7f\x10\x53\xea\x23\x57\xcd\x4b\xb9\x51\x60\xaa\x11\x35\xd5\xd7\x1a\x07\x59\xe1\xd0\x3b\x5f\xcf\xdf\xbd\x4f\x3f\x36\x2f\x3f\x86\xf9\x78\xe3\xa7\xac\x5e\xf6\x3e\xb7\xe8\x58\xf4\x7a\xf6\xb0\xa4\xcc\x13\x5c\xea\x57\xa7\xd3\x01\x3a\xf0\x03\x48\x83\x69\x77\xda\x75\xdd\x13\xfe\xd8\xe2\x89\xfc\xb8\xe0\x3f\x66\xcc\xbc\xa1\x9b\x05\xfd\x33\x94\xfd\x34\xe3\x9a\xb9\x20\xa7\xac\xf4\x08\x77\xfc\xb2\x4b\x44\x2d\x7c\x21\x81\x6e\xf7\xcd\xf9\xcb\xbb\xef\x5a\xa7\x22\xd5\xa5\xe4\x1d\x89\x24\xc5\x9a\xc7\xd4\x97\x6a\x40\x4c\x91\x09\xa6\x67\xec\xa9\x61\x36\x39\xc6\xea\xa5\xff\xb5\x5b\xae\x0f\xda\x35\xec\x06\x27\xa8\xf7\x66\x2f\x7f\x23\xae\x1b\x87\x96\x1b\xc5\x3c\x76\xd9\xef\x53\x10\xd3\x0f\xc6\xad\x00\xa4\xb5\xa0\x05\x63\xa6\xab\x65\x1f\x67\x4e\x31\x70\x9a\xb0\x43\xa2\xbe\xa5\x34\x56\x25\x53\xe3\x68\x51\xe0\xf8\x4f\xe1\xff\x6b\xa2\xaf\x9f\xbe\x2e\x3b\x72\x0a\xa7\xe9\x48\xf6\xb9\x2b\x17\x91\xe5\x9b\xf9\x7d\xf6\x5b\xca\xa5\xd4\xf1\xc7\x2c\x49\x42\x5b\xde\x12\xfd\x00\x22\x8c\xd2\x3b\x7d\xfc\xb9\xcf\x4f\x08\x69\x02\x8b\xc7\x14\x36\x0b\xbd\x25\xb2\x03\xfc\x74\xda\xf4\xbf\x7c\xb7\x96\x9c\x4f\x4a\xa0\xa8\x7d\x86\x47\x50\xc2\x6c\x0b\xf0\x17\x2e\xa7\x46\xe9\x27\x2f\xdb\x64\x88\x56\xdc\x9c\x77\x20\xb5\xf2\x34\xfb\xa1\xaf\x93\x8a\x6a\xe8\x2f\x49\x4d\x82\x8f\x89\xe5\x53\xc6\x59\xca\x85\x89\x88\x96\x1a\xb3\x6e\xc4\x61\xf1\x5c\x2d\x81\x84\xf1\x7f\x39\x45\x30\xf2\x7d\x2b\x2b\x82\x12\x63\xfb\xfb\x6d\x6f\xbe\x46\xe0\x84\xae\xb4\xbf\x8a\x4e\x21\x17\xa8\xf9\x95\xa8\x6a\xd5\x0b\x28\xe3\x60\x4f\x1f\x66\x3f\xba\x88\xde\xe0\x76\xb2\xdc\x7c\xe6\xba\xd3\x30\x06\x45\x19\x4f\x0a\x31\xcf\xde\x9b\x6a\x9e\xb2\x3b\xac\xd1\xe8\xff\x1b\x63\xb8\x3f\x7e\xd9\x05\x19\x6f\x19\x3e\xdc\xe3\x44\x3b\xd9\xa3\x55\x88\x7d\x29\x41\xe3\x74\x6c\x19\x5c\xc4\x9e\x82\x42\x96\x87\x91\x0d\x11\x62\x46\xcd\xc9\x2b\xed\xb7\x44\x9c\x82\xd6\xee\xc9\x6f\x1e\x97\x7d\x98\x92\x61\xa6\x56\x82\xae\x9b\x2a\xe7\xc5\x82\x7b\x7f\x9c\xc2\x20\x4e\xff\x49\xf7\x1f\xc1\x06\x41\x34\x59\xc6\x03\x5c\xc4\x21\x1c\xa2\xc5\x2f\x23\x2e\x1b\x07\x65\xbc\x52\x58\x56\x01\x42\xec\x38\x2f\x42\xca\x4b\x5b\x4e\x62\x87\x61\x24\x36\x71\x67\x68\x46\xc9\xe3\xb2\x01\xc5\xd9\xe9\x37\x9f\x78\x5f\x63\xb3\x2b\xd4\x66\x58\x42\x8b\x38\x44\x8b\x2e\x50\xd5\x4a\x77\xcd\xe7\x73\x5c\x7e\x8d\x1d\x28\x7f\x60\x21\x48\x7f\x61\x5f\xbe\x09\x64\xed\xd8\x7b\x06\x2f\x6b\xb1\x96\x80\x44\x8e\xc6\x2a\x4a\x21\xbb\x10\x96\x19\x9e\x34\xb7\x0d\x84\xcf\x8e\xd1\xfc\xe5\xb6\x2c\x53\xae\xed\xb1\x86\x13\x00\x55\xda\x11\x91\x55\x04\x1f\xae\x92\xdb\xc5\xf8\xa9\xaf\xfa\x4f\xf2\xe1\x89\x83\x50\x66\x67\xcf\x94\x41\x1b\x63\x9c\x46\xe0\x5b\x7a\xdc\x21\x64\xf2\x33\x9c\x3e\xc2\xf1\x40\x8f\x97\xca\xf9\xa3\x0a\x4f\x6c\xd5\xb9\x3d\xcc\x80\x82\xec\x7f\xd7\x8f\x04\x1d\x97\x1d\x85\x47\xd2\x65\xc9\xec\x26\x83\xc6\xae\x17\xbe\xcc\x37\x0f\x04\xc0\xb6\x31\xae\xf3\x83\x4f\x26\x76\x85\x5b\x42\x4d\xb5\x04\x6e\x74\x26\x28\xfc\x73\x2c\x6b\x74\x9c\xbf\x89\x6c\xa9\xbc\xb8\x2e\x9b\x90\x0a\x9a\xc6\x5d\x7c\x53\x73\x87\x61\x6a\xb6\x01\xfb\x50\x0f\x5e\x59\x0d\x94\x04\x10\xc3\xf5\x30\x1f\x5c\x71\xf3\x6d\xc8\x37\x3a\x77\x59\x56\xd0\xda\x22\xe5\xf7\x03\xed\xa8\xb8\xa6\x58\x41\xb8\x79\xc9\x40\x46\x9f\x41\x05\xab\xfc\x94\xbe\x7f\x6d\x1a\x64\xb1\xcb\x55\x79\xa6\x58\xfb\xe6\x86\x85\xba\x58\x5f\xab\x51\xbb\xbf\x8c\x89\x55\x90\x8c\x28\x2c\x04\x20\x81\x34\x85\x33\x3a\x57\xeb\x99\x9d\xff\xec\x15\xde\xf6\x8b\x9e\xfe\xf4\x54\xe9\xf8\x9d\xab\x83\x76\xf3\xe7\x37\x1e\xa2\x70\x3e\xc5\xb9\x6d\x39\x45\x5f\xc9\xaa\x24\x47\xbc\x6b\x51\xfc\xb2\x49\xb4\x24\xc7\x8d\x2c\xf6\x6e\xbc\xd3\x3f\xdf\x9d\x34\xf5\x68\xd3\x00\xeb\xf9\x6a\xde\x4d\xb7\x5c\xf6\x21\x93\xee\x26\xfb\x87\x07\x38\xfa\x0c\xa0\xbf\x0d\xc6\x9c\xbc\x72\xd6\x41\x60\x18\x5e\x49\x98\xc7\x1c\x08\x6b\x27\x63\xee\xd6\x2d\xdb\x28\x70\xa6\x1f\x33\xac\xfb\x3a\x66\xec\x3f\xf9\x25\xc9\x0c\x29\x46\x2a\x47\x51\x03\xeb\x26\x0b\x97\x5a\x75\xe3\x2c\xf7\x1d\x73\xb1\x6e\x65\x10\xb5\x14\x5c\x2f\x93\x8e\xc3\x62\x9e\xe2\x5e\xa3\x97\xcf\x22\x08\xbc\x3a\xf8\x13\x5f\x88\xea\x42\x3c\x9f\xf0\x54\xa3\x34\xa4\xb9\xc7\x1c\x29\xe5\xff\xe6\x81\x04\xae\x5d\xd7\x75\xad\x2e\x34\xc1\x08\xd1\xe1\x34\xe1\x6f\xfc\x0d\x07\x3c\xd2\x46\x33\x7d\x24\x51\xb9\x00\x61\x79\x97\xb1\x9a\x00\x6c\x38\x76\x68\x0c\x00\x5a\xcf\xa4\xe5\x7d\xe8\x74\x89\x59\x4e\x28\x97\x72\x33\x71\xf8\xd8\xe1\x45\x44\xfc\xb2\xc4\x31\x83\xb6\xb3\xd1\xf4\xe1\x02\x3d\xde\x5a\x8d\xb9\x49\xb6\x92\x08\x8a\x7a\x48\xba\x94\xb5\x7f\xf3\xcb\x6c\x0b\x7f\x65\xf2\xae\xff\xe0\xec\x2f\xde\x38\x8a\x22\x38\x71\xb7\xb6\x5e\xce\x13\x7f\x49\x08\x9b\xd6\x52\x9c\x52\x97\xf2\x3e\x96\x94\x7b\xaa\x6e\x14\x80\xaf\xe2\x95\x0a\x55\xaf\x10\xb8\x61\xbf\xe3\x7b\x0b\xde\x80\x78\x5f\xd9\xc9\xe2\xe0\xd4\xfc\x56\xef\x79\x0b\xf4\x87\x84\xd1\x10\xcc\x43\x08\x42\xc2\x39\xa0\x27\x8d\x4e\x0c\x36\x69\x5b\x7d\xe8\x5e\x1e\xae\x47\x20\xb9\xe0\x04\xf3\xda\x1f\x5e\xda\x09\x49\x19\xcc\xee\xf3\x3d\x33\x56\xfc\xe1\x52\xcf\xbf\xfc\xce\x51\xb6\x68\x0b\x61\x92\x34\xeb\xe7\xf9\xb3\x1c\x5d\x17\x5a\x56\x1c\x8c\xc1\x69\x6c\xbc\xcc\x65\xfd\xc8\xb6\x9c\x30\x60\x44\x81\x24\x79\xdb\xbe\xb9\xe0\xe6\x78\x8b\x29\x79\x51\x8e\xad\x44\x4b\x12\x2d\xd1\xe5\x40\x46\xbc\xd3\x6b\x07\x26\x6a\xe2\x6c\x0c\x2f\x6c\xa8\x78\xa5\x45\x21\x76\x4d\x15\x32\xf3\x00\x3b\x4e\x1a\x19\xe1\x4c\x1b\xe9\xae\xc7\xa8\x49\x31\xcb\x0e\x6d\x19\xb6\xb7\xff\xcd\x71\x2f\xd1\xb6\xf6\x4c\xff\xf7\x4c\xf6\xdb\xd7\x0d\x8f\xbb\x1b\x19\xf7\xc3\x6c\x1f\x6f\x57\x0d\x0e\xed\x98\x56\x0a\x1c\x08\xe4\x03\xca\x9e\x02\xa7\xe2\x2b\x51\xda\x24\x03\x02\x75\xb4\x26\xd0\x05\x39\xb5\xd5\x48\x4d\x87\x08\x5e\x2c\xf5\xeb\x6b\xb0\xe7\xeb\x42\x3a\x7e\x3f\x5a\xbe\x3b\x85\xfe\xde\x6e\x7a\xa9\xc1\x69\xf5\x22\xb6\x3d\xb1\xa6\xf8\xa3\xe7\xff\xf9\x6e\x5e\x25\xca\x6f\xb7\xe5\xee\x56\xac\x3f\xb8\xc8\xa6\xcb\xef\xa5\x42\x05\x1b\x70\xc6\xb8\xff\x60\xc1\xfe\x4d\x7c\xbc\xb8\xd2\x8c\x4d\x96\xbf\x65\xc5\x19\xba\xb8\xc2\x49\x56\xfe\x05\x10\xad\x67\x97\x2a\xfc\xc1\x86\x48\xb9\x46\x3a\x6a\xc9\xa9\x80\x68\xd2\x45\xd2\x11\xca\x64\x86\x22\x89\x05\x8d\xbc\x67\x84\xc2\x43\xf6\xba\xc9\x5a\x83\xc8\x5b\x78\xbb\xea\x1d\x41\x6c\x1f\xa5\x47\x71\x69\x82\x09\xf9\xb5\x24\x47\xfc\x37\x1f\xd2\xe3\x74\xfb\x24\xef\xb8\x97\x75\xff\x27\x96\x7b\xbc\x61\x19\x52\x17\x78\x79\xd9\xd8\x0b\x6d\xa7\xe4\x2f\x33\x2a\x69\xa0\x89\x29\x80\xa6\xf5\x94\x17\x8e\x51\xe8\x2a\xae\x68\x65\xee\x39\x43\xed\x4d\x5d\x51\x33\x0b\xd7\x20\xd2\x4f\x53\x09\xdf\x7f\xcc\x2c\xd5\x54\xaf\x36\xd9\x55\xba\xbe\x69\xd4\x87\xe6\xf6\x33\xfc\xbd\x83\x10\x84\x25\x6f\xa4\xb4\x50\x01\xd2\xeb\x5a\x11\xb8\x4b\x86\xc3\xee\x63\xcc\x29\xf7\x1f\x12\xcf\x7a\x18\x82\xbf\xca\x5d\x33\x8c\xca\x89\xef\x7e\x68\x81\x45\xd4\x3c\x06\x4b\x18\xd5\xe9\x5f\xe1\xc6\x0b\xcc\xcc\x85\x28\xa4\x7f\x38\x21\x31\x20\xa7\x13\x2f\x8a\xd9\x25\xb0\xeb\x15\x48\x96\x6e\x27\xe9\x53\x8b\xb5\xd8\xaa\x67\x9a\xd0\x95\x5f\x22\x75\x0f\xd5\x51\xf0\x01\x6e\xff\x70\xf0\x97\x09\x61\x55\x46\xf9\xf2\xf8\xdd\x28\x25\x77\xad\x4c\xf7\xc7\x60\x48\xef\x6c\x7a\xbb\x08\x55\xfc\x53\xe4\xbd\xb5\x85\x69\x26\x8d\xfa\x0f\xe4\xb0\xaa\x2b\x88\xc1\x1f\x3d\xe3\x09\xd8\x0c\x2b\x7f\xfe\xcb\x32\xe6\x85\x33\x4b\xd6\x7d\x81\x85\x21\x6d\xbf\x0e\xef\x54\xf5\x69\x95\x6e\x87\xd8\x1f\x90\x1b\x8a\x4e\x2b\x9d\xd7\x81\xc3\x70\x5f\x22\xc7\x2f\x24\x2f\x17\x75\x69\xb8\x33\xd2\x79\xd1\x42\x71\xe5\x55\x61\xdc\x9e\x42\xf7\x05\x54\x81\x4d\xce\x81\x98\x86\xb0\x0f\x1a\xed\xa0\xa8\x0b\x88\xde\x2b\x65\x55\xdd\x27\x2d\x62\xd2\xa2\xe7\x16\xd8\x16\x8e\xb5\x5b\xfe\xac\x77\x8f\x4c\x49\x71\x08\xc7\x0d\x29\x50\x60\xfe\xd8\x0e\xb7\x04\xde\xfa\x14\x0c\xc6\x30\xba\x1a\x04\x91\xc4\xda\x9b\x45\x04\xc6\xef\xa9\x02\x7e\xf9\xe4\x52\x89\x67\x38\xcb\x86\x36\x32\xdd\xc9\x26\x84\x6e\xa1\xc0\xf3\x87\xca\xc8\xb5\x54\x36\x5e\x19\xd0\xa1\x17\x32\xfa\x4a\xde\x0e\x45\x8d\x42\xe8\xe4\xf2\x97\x14\x1c\x72\x81\x16\x68\x8e\xaa\x5a\xbd\x80\x3c\x09\x06\xf0\x69\x42\xa3\x67\xae\xfb\xc1\xc6\xe2\xd9\xf7\x5e\xbe\x04\xcc\x39\x3c\x01\x46\xe1\x42\xdb\xbd\xf5\xa5\x53\xc8\x1d\xaf\x37\x53\x43\xff\xfa\xb9\xac\xbf\xc6\x84\x0c\xd2\xdf\x5e\xc5\xbc\x34\xf9\x54\xe4\x84\xcc\x2a\x32\xb1\x05\x1a\x4f\x79\x98\x97\x9e\x74\x32\xfa\x06\x27\x72\xa0\x3b\x35\x8d\x34\xe1\x29\xe9\x5f\x5f\x37\x49\xa8\x55\x88\x27\xca\x1e\xd5\x92\x8f\x76\x0f\x67\xa5\x8e\x8e\x2b\xb3\xba\x4d\x20\xe9\x58\xcd\xc3\xaf\x2f\xca\x09\xb6\xb6\x21\x1f\x66\x05\x2b\x09\xc7\x4b\xdf\xc1\xd1\x58\xdf\x02\xa5\x07\x87\x6e\x98\xd3\x97\xd2\x96\xbb\x9e\x63\x11\x59\xd1\xf6\x7f\x34\xa9\x67\x10\x8a\xe0\x99\xbd\xd1\x4c\xed\x9f\x20\x80\x78\x3d\xfa\xe0\xc4\x42\x7a\xad\xec\x69\xa2\x63\xa9\xa8\x45\x1a\x93\x1f\xb8\xee\x60\x54\xf9\xf1\xa3\xd1\xbe\xb8\x2e\x9a\x89\x34\x26\x39\x06\x6d\x09\xb5\x09\xf6\xd2\x06\xa5\xdd\x75\x08\xb2\x4e\xad\xdb\x76\x0f\xa6\x3e\x5e\x10\x4e\x31\x3d\x52\xea\x5a\x6b\x7e\x3b\x2d\xdb\xc4\xbe\x4c\xef\xc1\x59\x87\xc0\x52\xd1\x74\x6a\x95\xca\x42\x92\x60\xdd\x44\xfe\xd8\x25\x83\x85\x6a\x64\x3a\x4b\x5b\xe6\x07\xaf\x28\x75\x61\x4d\xad\x69\x5c\xd6\x0c\xe4\x89\xea\x03\xa8\xea\x92\x0f\x8c\x3e\xd8\xd9\xe4\x40\x9a\x8e\xa2\x7c\x77\x4a\xe7\x8d\x7c\x7f\xe9\x41\xb0\xb0\x8e\xa8\xf9\x73\xf6\xba\xee\x3f\xb6\x3c\x6d\xf0\x09\x6a\xf1\x37\x5a\x47\xb2\xcf\x21\x33\x73\xcb\x87\x9b\x2a\x5c\xc4\xd8\x68\xba\xbd\xf9\x2b\xd1\x7d\x16\xad\x95\x56\x71\xed\xd4\x3d\x6c\x2d\xf8\x12\x65\x19\x95\x16\x68\x4b\xcd\x90\x38\x9d\x28\x78\x25\x4b\x12\x69\x72\xbb\x39\xa7\x25\xce\x43\xa9\x89\xb8\x00\x1b\x8f\xe7\xbc\x68\xda\x16\x14\x5f\x4d\x85\x27\xb3\x06\x5d\xcb\xd3\x44\x19\x42\x7d\xf9\x0c\xe0\x5a\x09\xca\x6e\x28\x3b\x2d\xc0\xba\xa1\xe5\xa5\xc8\xa2\x5e\xb5\x67\xa3\x46\x5e\x06\xe4\x17\x86\x62\xc1\xdf\x15\xc3\x8b\xbb\x97\xa8\xff\xfb\x63\x4d\x49\x27\x39\x7a\x4a\x9f\x23\x1a\x3d\x3f\xc3\x61\x31\x56\x84\x5f\x9a\xfb\x8b\x95\xba\x16\xf9\x6b\xbe\x69\x5e\x0f\x04\x61\x54\xfc\x3c\x3a\x5f\x43\x26\x10\xf9\xf6\xcb\x75\x48\xf1\x52\x05\x59\xc9\xd0\x56\xa1\xd7\xc2\x20\xa2\x5c\x4f\x01\xdb\x76\x80\x3f\xc2\xd5\xf4\xd6\xc1\x40\x36\x52\xc5\x63\x8d\x8e\xcf\xea\x29\x05\xab\xe9\xb5\xb3\x99\x73\x7e\xe9\x64\xe0\x77\x25\xa1\x29\x29\xc9\x33\x42\xaf\xb2\x13\xde\x1c\x1a\x33\x97\xa2\xf8\x11\xfb\xd9\xf8\x72\xa5\x21\x43\xb9\xc7\x88\xbd\xdc\x7e\x0e\xdb\xaf\xd2\x33\x97\xe2\x44\xd3\x1f\x89\x3d\x60\x71\xc4\x3f\x33\x6a\x7d\x99\x85\xcb\x27\x65\xc6\x3f\xe8\xe9\x3c\xfa\xdf\x76\xcb\x65\xce\xc8\x7f\x6d\x28\x2a\x4f\x6a\xcf\xac\x6f\x2b\xd6\x24\x58\x27\xe3\x3b\x5d\xac\x11\x88\x29\xf4\x36\xf2\xa8\xfd\x7d\x22\x3d\x33\x95\x5b\xff\x92\xe8\xa8\x7d\x83\x57\x3f\xd0\xc2\x9e\x8a\x2f\xc7\x9f\x1f\x05\x4e\xf4\x6f\xaa\x3e\x18\xde\x11\x15\x9d\x84\xc5\x7d\xa6\xf5\x07\xa5\x3b\x01\x17\xcb\x6b\x5c\x30\x42\xea\x68\x2f\xc9\x3f\xe5\x47\x59\x02\xcf\x91\x45\x0b\x60\x60\xfa\xfb\xd1\x27\x9d\x3d\x05\x67\xb8\x1e\x59\x00\xf0\x7b\x86\xaf\xc2\xdc\x2c\x2b\x28\x20\x0d\x4c\x12\x7d\x27\xcc\x5f\x4e\x5a\x2c\xba\x9a\x4a\xb6\xdc\x19\x6b\x09\x13\x87\xb7\x3a\xeb\x7b\x5d\xdc\xf3\xc5\xdb\x79\x5e\x86\x54\x7f\x24\xae\x42\x58\xd2\x74\x52\xda\xa9\x22\x78\x90\x11\x5c\x7e\x3b\x91\x1c\x58\xf0\xa0\xd2\xb9\xa1\x47\xfd\x87\x00\x3b\xef\x0a\x90\x42\x8f\x7c\x8b\xd6\x86\x5c\xad\x4d\xe2\x18\x28\x6b\xbe\x64\xd7\x8b\x51\xa0\xec\x32\x74\xaf\x02\xb1\xc4\x3c\xf6\x02\x11\x74\x2a\xcb\x13\x81\xad\xc4\xae\xcf\x6e\xdb\xe6\x7c\x4b\x6d\x92\xb2\x60\x35\xcb\x08\x82\x6b\xf9\x3b\x79\xc5\xe0\x4b\xbb\xab\xc9\x6a\x7f\x25\xe9\x19\x0e\x69\x90\xf1\xf6\xb2\x97\x5a\x90\x75\xce\x4f\xcd\x13\xa5\x0e\xb9\x75\x08\xbb\x2b\x31\x71\xa0\x3f\x7e\xfa\xfe\x21\xf7\x4b\x87\x89\xfa\x43\xfe\xf2\x23\x56\x1b\xf4\xfd\x44\xcb\xa7\x58\xe7\x28\x13\x76\xfc\xcf\xda\x02\xa3\xd5\xb9\xfa\x4a\x48\xa9\x89\xac\x58\xed\xcb\xcc\x09\xf5\x80\x89\xfe\x68\x21\x45\x91\xd7\x6c\x3c\xab\xd2\xfe\x62\xd0\xa3\xc3\x9a\x92\x8e\x48\xc7\x72\xc7\xb1\x14\x4b\x06\xf3\xd3\xac\x00\xaa\x2a\xb9\xba\xd6\x04\xa6\x66\x98\xbd\x61\x55\x41\x35\x26\xbf\xe5\x55\x9e\x03\xe4\x95\xb6\x97\x3f\x9a\xa6\x93\x81\xd4\x41\xbc\x2f\xaa\x73\xb5\x29\x86\xdd\x3b\x42\x22\x9e\xd7\x56\x67\xd3\x0f\x37\xc1\x26\xd7\xbb\x12\xce\xf9\x0f\x94\x19\x14\x3a\xba\x9e\xbe\x2e\x70\x84\x9b\x78\x0d\x9d\x25\x66\x92\x06\xf1\x1b\xbd\x0b\xee\x51\x7b\xef\xfd\xb5\xdb\x81\x96\x56\xb8\xbc\xfc\x39\x70\x9b\xf3\x15\x37\xa5\xbb\x8d\x1e\xb2\x69\x92\x3e\x06\xc5\x45\x95\x44\x9c\x41\x79\x47\x65\x9e\xdd\x1d\x56\xd1\x34\xe8\xb0\x7d\xb3\xa0\x09\x80\xac\x7e\x3f\x3c\x56\xf0\xb9\x16\x18\xc6\x9c\xa4\x1f\x9f\x84\xe2\x13\x8e\x14\xb3\x43\x52\x82\x58\x97\x78\x1b\x05\x07\xa4\x3e\xff\x73\x5c\xc7\xdc\xf3\xe1\x48\xe9\x31\x87\x24\xcb\xad\x70\x68\xe0\xe7\x90\xa3\x57\x44\x4c\x2a\x9a\x2c\xd1\x93\x84\xcb\xe9\xb8\x96\xed\xe7\xec\xb8\xdf\xe9\x7c\xb0\xbf\x4f\x12\x89\x6d\x1d\xb4\xf5\x03\x74\xa9\x31\x76\x9a\xb1\xa4\x4c\xdd\x94\x88\x8c\x30\xaf\xaf\xd5\x8e\x21\xdb\x07\x48\x5a\xa5\xe2\x48\xa8\xbf\xb0\x4a\x3b\x06\xeb\x74\x02\xc5\x48\x6b\x70\x76\x54\x16\xd7\xb0\x44\x61\x4c\xe9\x96\xa2\x14\xc6\x32\x0c\x4f\x48\x72\x05\x44\xf2\x28\xe9\x07\x01\x45\x2d\x8c\x9c\x37\xcc\xa3\x7c\xbe\xc7\x5f\xc5\x93\x2c\x70\x0e\x1a\xf0\x1e\x50\x30\x1c\x31\x04\xc4\x08\xf0\xfb\x62\xfb\x05\xaa\xef\xc4\x97\x5f\x39\xa2\x6b\xa1\x9f\x71\x45\x68\x4e\x9e\x12\x43\x93\xe9\xeb\x7d\x6b\x43\xb4\x7e\xfa\x0b\xfb\xd3\x9b\x4f\xe6\x97\x7f\xbc\xd6\x9b\xf1\x95\x27\x0e\xa3\x08\x62\xb4\xc1\xaf\xaa\x18\xfe\xde\xde\x66\x15\x8a\x61\x38\xa4\x59\xa4\x34\x0e\x73\xc5\x2e\x01\x26\x10\x8a\xc6\x7e\xe7\xfb\xb9\x5a\x1f\xbc\x03\xc9\xfc\x8a\x1b\x93\xbf\x40\x20\x59\xc5\x44\x85\x3e\xb9\xc1\x4a\x76\x92\x48\xc7\x46\x50\x73\xa8\x3d\x6c\xc2\x30\x9c\x63\xa9\x83\x61\x8e\x64\x5e\xc6\x17\x42\xee\x67\x2f\x42\x91\x97\x4a\x84\x15\x67\x60\x9c\xa0\x1f\x39\x23\x53\xf6\xe3\x33\xf8\x50\x5f\xeb\x1a\x8c\x66\x80\xf6\x26\x66\xff\xa9\x53\x01\xe2\x17\x78\x0d\x04\xa1\xa7\x4c\xc4\x8e\x9b\x14\x4f\x05\x0b\x29\x13\x2c\x51\x55\x72\x0f\x7a\x3d\x3c\xde\x22\x92\xa8\xd5\xa4\x02\xa8\x46\xb3\x0b\xbe\xaf\x88\xbc\x48\x49\xd3\x56\x15\xa8\xb4\xab\x38\x59\x57\x7c\xca\xea\xb9\xf6\x8f\xdf\x4b\x82\xa5\xba\x7b\xdc\xa9\x1f\x0a\x3e\x9c\xa5\x30\xb9\x99\x56\x30\x43\xfc\xed\xfb\xf2\xe8\x63\x81\x51\xa5\xf5\x4f\x1e\x9d\x5d\xe6\x5f\x3b\xef\x7a\x86\xe8\xd3\x86\xff\xc2\xb5\xcb\x8a\xd5\x1d\xf0\x72\xc9\x60\x51\x4c\xfc\x2c\xb5\x2d\xa4\x0c\x44\xd7\x57\x86\x43\x5b\x71\x51\xd8\xe9\x73\x57\x21\x30\xa4\x4d\x7c\xff\xc9\xba\x8e\x57\x2a\x2b\xce\x86\x5e\x0f\x6c\x45\x62\xcb\xb9\x4b\xce\x2b\x0d\x63\xe4\xa6\x9f\x4f\x05\x07\x16\x0f\xd8\xa9\x21\xa6\x3d\x21\xa4\x39\xb2\x05\x8c\x4e\x43\x17\x72\xf3\xc0\x36\xe5\x2b\x5b\xeb\xc6\x70\x9e\xf0\x01\xc5\x96\x8d\x0b\x27\x5b\xda\x83\x9f\x96\x1d\xfc\xa0\xe2\x9f\x94\x98\x36\xfa\x2a\xa9\x18\xea\x78\xdf\xdc\xe1\xbd\x4f\xa7\x52\xb9\x0c\x47\x91\x74\x84\xeb\x15\x66\x5b\x28\xd0\x3d\xd2\x04\x56\x03\x9d\x07\xf1\xab\x5b\x3e\x38\xe1\x97\xa7\xad\x65\xff\x49\xb3\xc6\x32\x1a\x6d\x22\x63\x46\x9e\xe8\xd7\xfa\xed\xa4\x10\x97\xd8\x2f\xe5\xaf\x7f\xfa\x21\x33\x9e\x31\x40\xfb\x54\x3f\x66\xc9\x91\xb1\x5c\xe1\xe5\x0c\x39\x66\xa7\xe1\x1b\xb8\x40\xcb\x0b\x88\x6b\x13\xfb\xf7\x1a\x88\x15\xa4\x19\x2e\xb7\xef\x99\x1f\x8b\x86\xcb\x26\x68\x57\xbd\xbd\xe7\xef\x48\x5f\xe2\xb4\x5d\xe2\x0a\x94\x53\xbd\x5b\x4e\x15\x46\xf2\x61\x13\x18\xa1\x88\x1d\x62\x21\x2d\xaf\x62\x78\xab\x45\x40\xd2\x53\xf2\x8a\xca\x00\x23\xd9\xe4\x53\xbd\x40\x6a\x45\xcd\xca\x71\x6f\x5a\x6e\xf1\x9b\xde\x6c\x39\x6c\x22\x2c\x98\xc0\x8c\x63\x4d\x55\xee\x91\xf9\x5b\x97\xc6\x71\xbc\xae\x52\x8c\x92\x9d\xc9\x25\xb6\xec\xbf\x69\x42\xa5\xcf\x0c\x8d\xb7\xd2\xce\x1a\x49\x10\x5d\xe9\x6b\xe5\x99\xb1\xc4\xf0\x23\xf2\x34\xd8\xde\x1c\x02\x75\xdf\x33\x7c\x3c\x8b\xca\xde\xcd\x18\xb0\x67\xf0\x21\xa0\x82\xcd\xdf\x54\x56\x0d\x38\x50\xd7\x99\x45\x06\x36\x73\x6f\xf4\x87\xdb\xb1\xcc\xc4\x5b\x8c\xb7\x06\xab\xde\x2e\x06\x81\xb5\xa6\xdc\xc1\xda\x42\x87\xad\xc6\x08\xca\x1f\x1d\x20\xf4\xde\x06\x79\x8c\x42\xf9\x07\x00\xca\xdd\x30\xc0\x54\xfb\x7f\x3d\xb2\xf3\x5c\x0a\xde\x72\x4c\xe2\x37\x55\xa1\x91\xf8\xd2\xe0\x31\x9b\xd5\x75\x57\x3a\xcc\xba\x20\xd1\x36\xef\x23\x77\xb8\x33\xaa\x2c\x6d\x4b\xf2\x92\x31\x50\x46\xd0\xfa\x15\x9d\x2b\x3a\x7f\xe8\xf2\xba\x43\x7b\x84\xf5\x64\x31\xde\x24\x47\xf9\x92\x0c\x2d\xb4\xea\x26\xd7\xe3\x08\x0d\xce\xb4\x70\x97\x87\xa3\xf0\x9c\xca\xb0\xb6\xde\x31\xcc\xd0\x18\xcb\x11\x6a\x8b\x13\x88\x86\xe4\x3d\xc1\xfe\x7f\x03\xe3\x14\xc8\x1a\x21\x1c\xa3\x8a\x1e\x26\x49\xdf\xb4\x20\x08\x1f\x2b\xb8\xbd\xaa\x80\xea\x9a\x57\x35\x47\x34\x1e\xb5\xb9\xfd\xc6\x6b\x8c\x85\x91\x7e\xce\xeb\xa3\x19\x5e\xe4\x82\x58\x1b\x02\x6f\xca\xf0\x6d\xf4\x3b\x5d\x16\x02\xd7\x9f\x3e\x39\x4c\xf5\x71\x81\xb3\x59\x1a\x08\xe4\x70\x16\x4b\x84\x64\xca\x80\x49\xc9\x13\x18\x4f\xe5\xbf\x07\x47\x6c\xc5\x70\x2f\x0c\x4b\x4c\x39\xc4\xae\xff\xb3\x11\xc1\x33\xa5\x41\x8b\x5d\x67\x28\x45\x67\x10\xf3\x50\xeb\x24\x68\x19\x12\xcf\x1f\xc5\xf4\x73\xb2\x48\xcd\xcc\xab\x2d\x3d\xf1\xcc\xb1\x6d\x95\x1e\xcd\x65\x14\x7a\x1a\x29\x3f\xd7\xc3\x2b\x15\xd6\x2e\xa9\xc4\x64\xfa\x8d\x16\xad\xcf\xd0\xf2\xfb\x1e\x8c\x74\x89\x90\x4d\xd9\x92\xf9\xbd\x0a\xc5\xab\xc6\x3a\x0c\x30\x22\x29\x86\x77\x2d\x44\x31\x3d\xc9\x1c\xb6\xcc\x3f\xf7\x37\xb4\x3a\x23\x45\xac\x55\x97\xe6\x40\x7f\xdc\x6f\xde\x35\xee\x30\x9b\xb0\x65\x44\xb5\xef\xd2\x0d\xc5\x1d\xf4\x41\x85\xc9\xa7\x43\xa8\x90\x7d\xe8\x0c\x81\x0d\xce\xda\xc0\xab\x9d\x23\x40\x7a\x68\x3c\xb5\xd6\x99\x43\x4e\xa9\xe0\xe2\x08\xe7\x43\x81\xb2\x20\xc9\x6b\x66\x6e\x85\x3f\x9c\x6d\xce\x09\x80\x82\x46\xe7\x55\x1c\xf2\x89\xe0\xec\x11\xff\x6d\xf1\x53\x8b\xd8\x3a\x44\x1b\x57\x0a\x43\xb5\x09\x83\x1b\x8a\x78\xf9\x1b\x09\x4b\xce\x8f\xd7\xc0\x0f\x6b\x81\x83\x15\x20\x52\xc1\x4a\xc8\x2d\xa7\xe8\xd4\x00\x46\x27\xf1\xf4\xe1\x65\x50\x8f\x20\xc1\x2c\x7d\xcb\xc9\x4f\x11\xe3\x76\xf4\x19\x20\x46\x53\x60\x98\xbe\x15\xb4\x06\x30\xa6\xa2\x78\x0d\x8b\xca\xce\x6d\xa5\x4f\x38\x7b\xaa\xf6\xdf\x1c\x39\xdd\xfe\xf9\x71\xf8\x87\x43\xc7\x8d\x0e\xc1\x92\xc6\xa2\x37\xc3\x40\x7f\xfb\xe6\xc4\xa4\x5b\x54\x50\x9f\x20\xd5\x30\x36\xf6\xaf\x18\x49\x09\xd5\xbf\xc5\x9d\x97\x30\x5e\x6e\xa3\xa7\x9f\x01\x90\xda\xac\x54\x40\x35\x4f\x38\xe8\x1f\xec\x97\xce\xb3\xca\xb2\x33\xac\x2c\xd7\xfd\xda\x10\x13\xce\xe9\x9f\x5a\xff\x7b\x69\x47\x5f\x45\xb6\x20\x5b\xa7\xe3\x0f\x42\xbc\xbf\x6a\x8a\x17\xb1\x3b\x10\x89\xd9\x67\x57\x5b\x0a\x77\x35\x15\x83\xaa\x35\x6d\x3e\xac\xab\xe2\x78\xa1\xf3\xfe\x70\x8b\x62\xca\xb5\x97\x08\x13\xe1\x2a\xfb\x53\x69\x53\x12\xe3\x93\xdb\xbd\x87\xda\x80\x9d\x9a\x73\x02\x9d\x06\xa8\x7d\x4c\x77\x24\x69\xf8\x49\xce\xae\x11\xfe\x79\xd0\xae\xff\x9f\x1d\x5d\x6e\x2b\x8d\x3e\x4e\x6b\x7d\xa8\xe2\x61\x79\xc4\x1c\x01\x12\x86\xbe\xf4\x6f\x66\x2c\xc8\x94\x61\x79\xc3\xe7\x69\xbc\x27\x3f\x33\x65\x9f\x61\xdb\xe9\x31\x70\x17\xe8\xa7\xb8\x58\xe0\xba\x01\x46\x11\x70\xd4\xc2\xeb\x71\x9d\xaf\xd7\x42\xa5\x29\x73\x52\x51\x63\xac\xb5\xe0\x10\x96\xb8\x9f\xc4\x59\xfc\xfe\x83\x09\x81\xe1\x78\x17\xa5\xd7\xaa\x04\x64\x1c\x04\x27\x96\x06\xa5\x50\x63\xb1\xfc\x41\x11\xa8\x60\xa7\x7f\xf7\x9b\x77\x7d\xe1\xd7\x01\x91\x2d\x7b\x92\x68\x53\x93\xfa\x6d\xcb\xf3\x8d\x9e\x71\x1d\x60\x5e\xb6\x54\x98\x87\x56\x27\x6c\x18\xbb\x2b\xaa\xad\xf2\xcc\x8f\x8e\x2a\x40\x4f\xdd\xfe\x3b\x07\x75\xf8\x7c\x67\xd6\x3d\x34\x22\x7e\x9e\x3b\xbe\xae\xda\x75\x07\x48\x72\x41\xfc\xe1\x3e\x97\x7a\x18\xe4\xc7\xf4\x86\xd4\x01\x26\x33\x82\xc1\xda\xc3\x53\x1b\x1e\xf8\x79\xdd\xea\xa2\x55\x41\x97\x38\x09\x92\x1b\xd5\xb6\x7b\x1f\x61\xa9\x01\x74\x78\x76\xcc\xdf\x54\xe6\xff\xba\xbd\xa6\x99\xb2\x38\x96\x03\x7e\xfa\x77\x03\xd7\x51\xfc\xd3\x70\xa5\xff\xf4\x6b\x8d\x62\x8e\xbc\x28\x98\xca\xba\x2c\xdb\x0f\xb1\x73\x49\x94\x54\x6c\x31\xd3\xf1\xec\x8d\x8d\xa1\x3e\xc4\xe1\x91\x7a\x06\x82\xa4\x2b\x4c\x51\xe0\x8e\x5a\x74\xb2\x26\xe3\xd0\xda\xf9\xf0\x4e\xf4\xf4\xd5\xf9\x8b\x09\x5a\x70\x99\x88\x65\xfe\xfa\x9e\x30\x3c\x5e\x3e\xf9\x17\x7a\x8c\x70\xba\xda\x13\xd8\x99\x3d\x5c\x14\x55\x15\xcf\x46\x64\x07\xd0\x7a\x46\x9a\x14\x1c\xba\x87\x54\xbf\x03\xd1\xfe\x6f\x76\xa6\x4c\x1b\xe7\xa8\x6a\xab\x98\xce\x78\x71\x5c\xb9\x76\xa7\x7a\x75\x85\x69\x50\xaf\x69\xbb\xa6\xcb\x4e\x4e\x97\x35\x49\x62\xac\x91\x31\xf1\x48\x79\x27\x95\xcf\xa8\x9c\x3a\x57\x17\xd9\x94\xa3\x0e\xad\xfa\xaa\x80\x54\xe6\xc5\x35\x61\xe7\x4b\x7a\x7b\xff\xc1\x9d\xfd\xf1\x19\x8e\xbf\x45\x35\xaa\x35\xdf\x23\xc0\xb8\x3a\xcb\x75\x25\xe1\x07\x0e\x4b\x77\x0c\xe1\x32\x46\x01\xca\x66\x19\x9d\x4d\x44\xc6\x69\x4c\xff\x44\x00\xcb\xb6\x87\xf4\x23\x16\x37\x89\xde\x7d\xd5\xae\xcd\xed\x00\x9a\xa0\xd5\x12\x14\x26\xc1\x1e\xde\xa7\x34\xae\xd3\xf3\x3e\x4e\xff\xf7\x7a\x2b\x7b\x49\x25\x8e\xbb\xe6\xc0\x88\xe4\x78\x7f\x5f\x1e\x70\x99\xdf\xb9\x34\x1a\x4f\xb2\x7b\xfe\x4c\x4b\x14\x82\x50\xec\xda\x5f\x04\x61\xa8\x49\x96\x3d\xc8\xef\xa0\xaa\x90\x69\x6a\x6b\x50\x09\x29\x39\x8c\x9e\xf6\x17\xa5\x62\xc4\x2b\x3f\x37\x14\x2c\x97\xc0\x1b\x4e\x2a\xd8\xfc\x7c\x11\x0d\x28\x72\x7a\x8f\xe2\xa1\x88\xc3\x05\x57\x71\x99\x67\x32\xfe\x0f\xa7\xce\x59\x85\x71\x6e\xeb\x8f\x66\x08\x4d\x75\x36\xd5\x85\x2d\x71\x68\xf2\xe3\x30\x3c\x92\xee\x2f\xff\xc7\x77\xa4\xaa\x80\x61\x18\x30\x28\xb1\x2a\x3d\x09\x61\x40\x3d\x72\x84\x2e\xc1\x5f\x00\x17\x01\x3e\x05\xa4\xf1\xf7\x52\x8b\xad\x6f\x11\x61\x5e\xbb\x42\xc8\xf4\xd1\x69\x9d\x33\xe5\x2e\xf0\x66\x35\x8f\x6a\x18\x02\x32\x4b\x26\x6d\x74\x42\xd5\xd2\x5f\xa6\x6b\xb4\xdb\xc6\x16\xb4\xc7\x67\xb4\x85\x6e\x77\x71\x09\xb5\x28\xac\x26\x6c\xd5\xdf\x05\x67\x55\x4f\xd5\xa0\xa8\x85\xcc\x2e\x40\xdc\x11\x59\x61\x69\xc8\x0d\xf5\x16\xf9\x42\xdb\x38\x17\x1e\x1b\x3b\xb8\x57\x50\x72\xd5\xda\x78\x6c\x64\xb0\x75\xbc\xd2\xb9\x7a\xfa\xf0\x9e\xd9\x67\xc3\xb9\xbf\xb2\xd4\x84\xbb\xd6\x27\x74\xa7\xec\x42\x76\x21\x55\x12\xec\xd4\xd7\xd3\xa6\x00\x32\x75\x81\xc6\xa7\x66\x3c\x7b\x51\x18\x86\xe5\x85\x7d\x0d\x42\x6c\xc2\x8c\x0a\x28\x57\xf2\x61\x84\x3d\xe6\xdd\x7b\x2c\x2b\x20\x85\x93\xf1\x09\x84\x39\xd2\xd5\xfe\xba\xce\xeb\x01\xbb\x7f\xe6\xc1\x9a\xae\xc6\x7a\x71\x8c\x0a\x22\xb6\x70\xe2\x9f\xf8\x88\xd0\x5b\xb6\x12\x8b\xad\x5e\x6e\x0a\x4b\x5b\xb8\x28\xbd\x9f\x4f\xf6\x6e\x54\xef\xe1\xae\xd0\xa9\xbf\xe7\xb2\x66\x28\x0a\xc4\x77\xb2\x61\x6f\x0f\x03\xd7\x0f\x39\x66\xfe\xf6\x58\xb5\x9f\x92\x5d\xee\xa9\xbb\xb9\xf8\x31\x3f\xc1\x19\x88\xa0\x9e\xca\x21\x7c\x79\xf9\x25\xd3\xa2\xeb\xb7\x1a\x97\xf0\xa8\xb9\x4f\xb7\x35\xfc\xed\x79\xe9\x3a\x30\x69\xe9\xaf\xb8\x99\xf8\xd7\x44\xb1\xdc\xa1\x04\x9c\x4a\xdd\xf3\xa8\xc4\xeb\x1c\x6a\x7f\x18\xe7\xa8\xa9\xd1\xfa\xb1\x21\x63\x60\xaa\x8a\xff\x91\x51\xb5\xf4\x77\x06\xa9\x9b\x3e\x35\x5e\xe4\xe5\x3a\x58\xdb\x9b\x2b\xc9\x49\x84\x21\xb6\x92\x8e\x4c\xc2\xef\x10\xd0\xb6\x0f\x25\xc6\x3f\xef\x9f\xce\x3f\x5a\x17\xa8\x30\xdb\xd4\x40\xf8\x2d\xc8\x40\x7c\x6a\xe3\x86\x14\x41\x2b\xdb\xaf\x2f\x19\x9f\x37\xb4\x60\x70\xdd\x4c\x97\x7c\xe8\x67\xc0\x51\xbf\xcc\x4b\xb9\xe0\x56\xa7\x23\x7b\xab\x25\x1e\xb1\x2f\xb8\xcc\xdb\xdf\x48\x58\x0e\xe6\xb8\xec\x7b\xa7\xb1\x7c\x85\x49\x04\x6c\x03\xb7\x0a\xa8\x13\xc0\x46\x30\xa6\x65\x8c\xa1\x0e\x91\xf4\xad\x05\xa2\xb9\xae\xf2\xc3\x48\x6b\xf5\x86\xc3\x6f\x09\x99\x24\x87\x51\x58\x25\x51\x20\xcb\xb5\xdc\xf6\xf7\x0e\xd0\xf0\x24\xba\x3c\xc9\x73\x5b\x04\xd4\xe2\x29\xb6\xb2\x41\x80\x80\xc5\x39\xa9\x77\x95\x2d\x75\x18\xb8\x8a\x5d\xc6\xe8\xa6\xfe\xe7\x42\x0c\x68\x4d\x95\x5a\xd5\xcb\x0f\x0e\x21\x48\xae\x1c\x55\x5f\x3c\x84\x1f\x04\x5d\x3a\xf7\x60\xdb\x90\x9b\xd4\x8f\x54\x02\xd1\x9f\x53\xf5\xae\xe2\x3c\x3b\xa5\x7b\xaa\x00\xbb\x07\x77\x50\x05\x8b\x49\x22\xe9\x44\x29\xdc\x06\x99\xeb\x3c\xf9\x85\xd9\x4a\x0b\x3d\xd9\xdd\xa6\xc0\xf8\xac\x60\x12\x2d\x64\x5a\x3b\xc4\x6f\x0e\xf3\xf8\xcd\xb8\xe9\x8e\x0e\xc6\xcd\x94\x29\xe0\x11\xde\xa7\xf6\xf6\x8b\xb9\x1c\x46\xd2\xdf\x21\x9c\xbc\xfa\xd5\xc5\xdd\x7d\xf6\x59\x57\xb5\xf2\xa6\xe9\x5c\xbd\x08\xdd\xdb\x89\x21\xa3\x24\x0a\x10\x0b\x8c\xa2\x26\xa7\xf0\xb3\x30\x6f\x14\x5d\x28\xf1\x54\x01\x3d\x2e\x7d\x68\x21\xcf\xfc\x42\xc3\x8d\xf4\x01\xe1\xff\xb9\xbc\xb5\xb8\x3d\xe5\xf5\xb4\x53\xce\x71\x07\xb4\x61\x9a\x02\x82\xcc\xee\x54\xa4\x08\x8a\x10\xaf\x16\xdf\x38\x28\xea\x61\x3c\x0a\xfa\x97\x80\xed\xed\xde\x0e\x99\x36\x9f\x0a\xba\x2c\xa1\xab\x4e\xbb\xae\xc0\xe0\x96\x00\x38\x7f\x80\x80\xfe\x1e\xe7\xb6\x11\x57\xf9\xcd\x77\x0e\xf9\x7d\x6e\x79\x03\x6e\xb9\xb2\xd8\x47\x49\x89\x20\x0e\x2e\xd7\x82\x56\x39\x41\x63\xe3\x35\x37\x52\x01\x15\xf7\x26\x3b\xc1\x69\x96\x0c\xde\xec\xb2\xcf\x88\x0e\xf8\x1f\x2c\x3f\xe3\x2f\x07\xca\xf2\xd1\xb9\x2b\x32\x77\x68\x84\x70\x5f\x15\x3e\xd1\x66\x94\xe4\x6f\x6c\xf9\xc9\x15\x05\xd8\xb2\xf6\xf6\xb3\x6b\x7e\x0d\x08\x5e\xdf\x3c\x42\xa1\xe8\xa6\xc6\xe8\x3f\xea\x03\xe0\x51\x38\xe4\xa5\x2d\xe7\x36\xf3\xb7\x86\xc4\x60\x53\x22\x8e\x88\xac\xb0\xc6\x60\x12\x2e\x28\xe4\x15\xfc\x8f\xf6\x5d\x68\xf2\x89\x02\xbc\xcd\x06\xf7\xe6\x59\xc3\x8b\xa5\x06\x8d\x52\xb3\xd0\xa0\x70\xbc\x98\x30\x97\xa9\x99\xe7\xa1\x4b\x04\x36\x5b\x68\x71\xa0\x84\x26\x3b\x79\xbf\xe6\xce\x6f\x97\xc3\xb6\x49\x55\x5d\x69\x35\xfd\xe7\xc4\x2a\x04\xd1\x99\x8e\x56\xe7\xe6\xe2\x51\x40\x25\x82\x59\xeb\x28\xf0\xc3\xa7\xcb\x13\xbc\xcb\xc3\xd6\xd6\x9d\xa1\x1d\xa4\x88\x30\xc4\xbd\x48\x34\x4a\xb0\x4a\x43\xad\x2c\x24\x11\xa2\x25\x5f\x40\x58\xec\x07\x59\x7f\x30\x5d\xd7\xb3\x23\xd1\x4e\x3d\x2a\xbb\xe3\x73\x87\x13\xcb\x54\x09\x03\xc8\x5b\xf0\xa8\x7f\xe6\xfb\x24\x12\x8b\x9f\x7e\xef\xab\xf3\xab\x03\x39\x95\x36\x4d\x4f\xa6\x97\x8b\x5e\x9d\x85\x6e\xba\xd3\x43\xbf\xc1\x1a\x29\x38\x0b\x86\xbb\xef\xa9\xde\x3b\x64\x24\x85\x44\x3d\xa3\xf0\xb6\x44\x3f\x59\x49\x00\x8f\x5b\x5f\x1e\xb2\x85\x51\x30\x62\x93\x01\xd6\x2f\xdf\x65\x92\x69\x2e\x0b\x1f\xe0\x98\x6b\xe3\xb6\x0c\xb2\xd0\x1b\x96\x32\x94\x18\x44\x6a\x74\xec\x3c\xc3\x1b\x28\x0b\x4d\x38\x63\xe3\x7c\x29\x1a\x7d\xe4\x2f\xe9\x7f\xf2\xbe\xb1\x7d\xac\x35\xde\x5c\x39\xd4\x6d\x1b\xad\xcd\x20\x1e\x9c\xf0\x1c\x56\xec\x50\x26\xf8\x05\xf6\x66\x51\xec\xf2\xcb\xe7\x6e\x07\x46\x8f\xaf\xee\xe6\x37\x57\x49\x57\xbc\x59\xd3\x49\xee\xbf\xfb\xdf\xb3\x61\xde\x7e\xd1\x93\xb6\x05\x3d\xda\x86\x5a\x5b\x7b\x57\x12\xa3\x53\xe0\x4d\x02\xe7\x31\x55\xa4\x88\x43\x6f\x19\xca\x70\x5c\xde\xa8\x0e\xaa\x7c\x7f\xe7\x2c\xe8\x69\xc5\xa5\x38\x21\x96\xc2\x52\xec\xc4\x09\xc3\x97\x1a\x56\x64\xe1\x84\xb2\x5d\xad\xf8\xf3\xb0\x3d\x4d\x96\xa5\x6a\xee\xfc\xaa\xe9\x4a\x7e\xf5\x54\x0b\x46\x22\x64\x50\xf3\x52\xb7\x12\x3b\x6a\xe0\xa8\x3e\x27\x99\x64\xd3\xb4\x28\x65\xc3\x1c\xb4\xcf\x15\xe3\xaa\x3d\x32\x7f\x2d\xf8\xcb\x10\x12\xbd\x75\xe4\xbb\x52\xb2\xf3\x8a\x36\x36\x42\x0d\xa0\xa4\x0c\xec\xdc\x68\x9b\x34\x4e\xf9\x57\x16\x9e\x02\xb4\x34\x78\x81\x68\x07\x67\xf5\x5d\xfd\xc3\xb7\x9e\x16\xd4\xbb\x6f\x32\x48\x6a\xae\x30\x64\x59\x3b\xaf\x3f\xf5\x2b\xe6\x87\xe9\xbe\xba\x0f\xaf\xd4\x7e\x23\x89\x5e\x33\xf5\xe6\x65\x23\x34\xf3\x0a\xbe\x60\x23\x19\x5c\xf2\x30\x9a\x7f\x58\xc9\x1e\x95\x10\xee\x96\xe0\xb1\x0b\x6d\x3f\x67\x72\xd5\xb1\xb5\xd7\x42\xf1\x90\x68\x07\xc8\xc0\x10\xde\xa7\xfe\x42\xcb\xb1\x46\x2d\x9c\x6d\x6a\xa6\xde\x30\x46\xa9\x7a\x4a\x51\x59\xb9\x9a\x71\xdf\x7a\x93\xaf\x0e\xfd\x0e\xf7\x8f\xe7\xb0\x2d\xe0\xba\x12\xc7\x70\x2f\x52\x68\x43\xd2\xa4\xb1\xe6\xdd\xeb\xd8\x75\x0b\xa9\xc5\x12\x4e\x21\x95\x8f\x9d\x04\xa3\x15\x1c\xac\x12\xff\xf0\x45\x95\x73\x97\x1e\x29\x2a\x03\x13\x04\x08\xf5\xd3\x28\x18\x50\x70\x42\x26\x63\xf4\xd5\xb6\x0d\xdb\xc6\x3f\xb7\x80\x98\x74\x8f\xba\xe0\x72\x84\xa8\x08\xd0\x54\xc5\xe3\x20\x65\x7f\xe7\x58\x48\x10\x47\x66\x53\x40\x41\x13\x83\x60\x06\x69\xe2\x62\xca\x47\x9a\x3b\x05\xda\x2f\xa5\x72\xad\xb9\x64\x5c\x81\x46\x08\x1d\x52\x2f\x5a\x6c\x8f\x4d\x74\x2b\xd5\xf5\x05\xc3\x01\x40\x4b\x8b\xe5\x3a\x26\x86\x02\x2a\xe0\xfd\x7b\x7f\x93\xd6\x0d\xf3\x53\x99\x8a\xa5\x9a\xf2\x21\x31\xa2\xb8\x3a\x47\x71\x05\xd4\x92\xc0\xf2\x52\x64\xe0\x45\xb2\xef\x4b\x6b\xdc\xa1\xfc\x69\x5d\x89\xd5\x9a\xfe\xa8\xda\xc4\xfd\xe7\x1c\x7e\xe4\x13\x1c\xae\xf1\x82\xc4\x70\x88\x18\xbd\xeb\xac\x6e\x9c\x96\x2c\x0e\x00\xfc\xab\x26\x7f\x99\xef\x78\x0d\x03\x6f\x94\x64\x29\x9d\x4f\x5d\x66\x88\xc9\x21\xa4\x36\x3a\x9e\x36\x81\xab\x8d\xc5\x47\xc9\x59\x39\x85\xf9\x1a\x3d\xad\xbf\x9e\x77\x7a\x25\x6a\x05\xaf\x3d\x41\xd4\x20\xc1\xe7\x71\xcb\xed\x61\x73\x1c\xbc\xfd\xd4\x7d\xc3\xc7\xb6\xb0\xea\x7e\x87\x57\xc7\x73\xb5\xdd\x4f\x7d\xff\xf4\x2f\x15\x95\x09\x8e\x7e\x70\xac\x3f\x9b\xb2\x9f\x17\xea\x21\xca\x4b\xa3\xb3\x08\x65\x46\xa6\xee\xb0\x56\xbb\xa3\x28\x30\x7b\x0c\x62\x4a\xed\x30\x51\x74\xa5\x41\x27\xc5\x89\x71\xf4\xfb\x7a\x9e\xd7\xb8\x3a\xec\xfb\xe4\x85\x8d\x44\x5f\xa4\x02\x58\x48\x10\xa9\x31\x0a\x9c\x6b\xdc\xdd\xbf\xa3\x22\x11\x85\x2e\x9b\xa5\xff\x63\x03\xe6\xf8\x81\x07\x69\x7d\xfb\x15\x5a\x4b\xa0\x7a\xf1\x90\x66\x91\xb8\x19\xbb\x46\x89\xb4\x79\x76\xb0\xb4\xc5\x12\x5c\xf0\x09\x54\x08\xee\x8d\x53\x5b\x13\xcd\x3f\x1a\x11\x8c\x8a\xa8\x95\x09\xd1\x54\xb8\x61\x9b\x67\xf3\x58\xd7\xb4\x64\x9b\xba\x06\x74\xd4\x44\x88\x16\x51\x60\x1d\xbd\xf4\xda\x08\x7e\xdc\x56\xa4\x00\xf5\x46\xcd\x5d\x5b\x97\xc1\xa4\x09\x32\xdf\x7e\x89\xf0\xda\xb4\xda\xc5\x99\x7e\xf5\xd3\xd4\xf8\xd4\x3d\xd8\x7b\xe3\x21\xcd\x94\x57\xcb\xc2\x92\xa1\x6f\x27\xad\x0d\x23\x8a\x55\x1b\x0f\x0c\x1d\x01\x9a\x04\xb4\xf6\xde\xa7\x8e\xdf\x2b\xe3\x9e\x6b\x79\xa8\x41\x7e\xe1\x06\x50\x26\x41\xa4\x0b\x37\xb7\xf8\xea\xc8\x3f\xfe\xc4\x8c\x1a\xa9\x43\x6b\xc1\xeb\xb8\x92\xd0\xec\x34\xa6\x8e\x8a\x98\xf9\x6f\xcc\x90\xd8\x3b\xdf\x26\x0a\x1b\xfa\x78\x0d\x5d\xad\x6e\x59\x43\x3d\x2d\x88\x23\xd2\xbc\x28\xa2\x70\x86\x32\xb3\x97\xd2\xd7\x56\xd4\x86\x30\x34\x0e\x64\xd4\x09\x9c\x98\xad\x5f\x2c\x01\xb3\xd8\xb2\x25\x44\x29\xc7\xdc\x11\xd0\x2e\x8b\x49\x92\xad\x01\x81\x5a\xb1\xdd\x76\x02\xfe\x70\x0b\x5e\xcb\xe5\xb0\x21\xf4\xb1\x85\x64\xc3\x80\x8a\x09\xdc\x10\x97\xcb\xf1\xcf\xce\x00\x2b\x0e\x18\x07\xbd\x45\x91\x0b\x87\x27\x1f\xb9\x33\x4d\x4b\x73\x5a\x8a\x70\x5d\xa0\xb7\x2c\xcd\x08\xc5\x31\xac\x30\xe0\xb5\x09\x58\x46\xe8\x4b\x50\x19\x3f\x15\x17\xc6\x24\x70\xf4\xb7\x3a\x9d\x9a\x75\xe4\x34\x3b\xd0\xf4\x28\xd0\x12\x6d\xd9\x9d\xca\x90\xca\xb2\x9b\x64\x8f\xed\x06\xac\xc0\xd5\x8f\x0c\x2a\xe1\xe6\x30\xaa\x74\x9f\xa2\xbb\xeb\xba\xa5\xfa\x6f\xff\xfd\xdb\x62\x03\xef\x8c\xf7\xc8\xb7\x38\xdb\x87\xc7\xfe\x1d\xcd\x62\x38\x2f\x18\xe9\x21\x62\x4f\xc6\x83\xaa\x3a\xd1\x71\x1b\x4d\xa6\x5b\x5e\xa2\xbd\x66\x3d\xda\xaa\x4f\x87\x53\x5b\x8b\xb1\x43\x13\x06\x73\xd7\x2a\x6e\x27\x65\x7a\x35\xa5\x56\x1a\xe8\x78\xcc\xa9\x04\x1a\xbd\xbe\x7d\x6e\xbf\x1f\x89\x53\xbe\x8b\x22\x35\xdd\x25\x7b\xa6\xd8\xee\x69\xd3\x4a\x17\x22\x9e\xee\xfe\x29\x06\x9d\xc6\x7b\xa0\x6e\x93\x00\x9a\x9c\x05\x4b\xd5\x60\x6c\xb6\x57\x11\xfe\xa2\xf4\x5b\x98\xe9\x5f\xb4\xba\xf9\x98\x50\x63\xaf\x34\xf2\x77\x8c\xb0\xd5\xb9\xca\xb3\x67\xd2\x65\xbf\x79\x3f\x18\x5a\xc2\x61\x49\x05\x61\x8e\x9a\x66\xda\xb8\x80\x2f\x24\x10\x39\x94\x91\xc4\xb2\x6e\x0a\x52\xe2\x6e\xbc\x87\xf3\x95\xc4\x7f\xf9\xb0\xc2\x18\xcb\x21\xce\x50\xbb\xe3\x72\x2f\xfb\x85\x8e\x75\x1b\xd9\xce\x0e\x47\xc4\x7c\x29\xc4\xd5\x0c\x14\x00\x9a\x53\x3e\x91\x3b\x44\xfd\x23\x74\x3c\xbc\xe7\xce\x87\x08\x52\x2b\x5d\xe2\xc9\x1b\x3f\xa3\xfc\x07\x02\x7e\x16\x03\x16\x89\x0f\x58\x9b\x3e\xc9\x03\x8c\x99\x6f\x92\xf0\x4a\x68\xe4\x56\xf5\xfe\x70\xf2\x4b\xb2\xcf\x09\x1a\x95\x70\xda\x31\xb7\x4e\x8b\x76\x94\xf6\xbe\x8d\x8b\xdb\xb0\x16\x58\xc3\x6c\x79\xf7\x43\x23\xf9\x74\x3b\x5b\x5f\xbe\xd0\xf1\xeb\x11\x0f\x50\x30\xaa\xed\x5d\x4c\x16\x2c\xc3\x6c\x5c\x86\x49\x35\xa9\x73\x31\xaa\xb4\xe3\x25\x78\x18\xc8\x82\x96\xfe\x1b\x7b\x62\x3a\x81\xef\x7d\xa1\x90\x42\xeb\x2c\x26\x48\xa3\xb0\x3e\xee\x1f\x8f\x55\xf9\x14\x96\x16\xf8\x0f\x96\x7d\x51\x36\xac\x86\xec\x25\x5e\x0a\x30\xaf\x05\x3d\x95\x29\x6c\x26\xef\x81\x10\xe1\x29\xd6\x47\x55\xd0\x42\xca\x43\x24\x76\xa0\x0f\xc6\xd0\xef\x16\x95\x14\xf8\xdd\xcb\xf5\xf0\x3c\x6b\x95\xf1\x4d\xe2\x22\xf7\xc1\x4c\xe9\x39\x67\xf1\x64\x32\x38\x38\xd7\x89\x4e\xfb\xac\xb8\x1d\xc8\xef\xad\xe0\xf6\x28\xa6\x08\x82\x63\x0a\x10\x49\x4d\xaa\xee\xcd\x5b\x9f\x77\x93\xc4\x7a\xfc\x3f\xb9\x66\x05\x15\x62\xff\x01\xbe\x9d\xc8\x21\x37\x39\xa3\xd6\x3f\x33\x78\x7c\x4b\xa6\x97\xfe\x2d\x6c\x7e\xe5\x7e\xf4\x8a\xe5\x84\x37\xed\x09\x56\x5a\xca\x41\x47\x10\x7e\x80\x14\x3f\x60\xbf\xeb\xa6\x5c\xe2\x0f\xa1\x71\x6c\x78\xeb\x74\x8b\x81\xf7\x93\x41\xdf\xb7\x73\x36\x6c\xea\xee\x27\x1a\x86\x58\x5f\xcf\x2b\xa6\x1d\x0a\x22\x05\x53\xf9\xf7\x5e\x34\x99\x38\x65\x9e\x7e\xd3\x2e\xc2\x69\xfa\xd1\x70\x23\x05\x49\x35\xd4\xb9\xb8\x97\xfa\x42\x62\x70\x35\xe3\xfc\xd1\xeb\x29\x27\x55\x1f\x59\x00\xa8\x3f\xbb\x26\xda\x59\xdf\xf2\xb9\xcf\x7c\x17\x06\xba\x41\x19\x2b\x55\xe0\xcf\x28\x2c\xfa\x39\x4d\x2c\xf9\x5b\x0f\xc5\xe8\x1a\x1b\x73\xc9\xa6\xb5\xf3\xac\xcb\xbc\x96\xca\xc8\xaf\x05\x36\xfe\x04\x67\xd4\x66\xef\x33\x38\xeb\x86\xf3\xb1\x35\xcd\x99\xb0\x59\x48\x9f\xfa\x9d\x12\xa5\x15\x54\x75\xb6\x17\xce\xf0\x26\x7f\x0b\x4a\xdd\x71\xd2\x71\xbf\x68\x4e\x3c\xf9\x6a\x80\x1d\xd8\xfc\xf0\xe3\x65\x3d\xae\xdf\x2f\xd2\x40\x6d\xb3\x50\xa0\xce\x15\xd8\x5a\xa3\x40\x92\x61\xea\x97\xf8\xe8\x52\x41\x6d\xfc\x31\x9f\x1a\xb2\x97\x8f\x1d\x8e\x3a\x6b\xf4\x57\x1e\xcb\x18\xce\x58\xed\xfc\xa7\x78\xb9\x17\x42\xc8\x3a\x11\x85\xea\xb4\x1f\xec\xaa\xc5\x6f\x8f\x85\xed\x09\x16\xbf\x62\x4d\x31\x39\x28\xb2\x0d\x4d\xc0\x60\x1c\x10\x66\x46\x93\xed\xf8\xf1\x13\x08\x24\x60\x9a\x53\xd6\x31\x1a\x5b\x78\x1f\x2f\x85\xa9\xed\x6a\x70\xec\x9a\xf0\xb3\x04\x9a\xfe\x3e\x73\x4d\x08\xda\x49\x81\xf5\x95\xa8\xfa\xe5\x14\x83\x1b\x3c\x9d\x38\xee\xde\x66\x81\xba\x17\x84\x5a\xab\x6d\xbb\xe6\x15\xe3\xd4\x91\x83\xbb\x67\x9d\x7d\xb4\x94\xc2\xe7\x1c\xf8\x59\x50\xb4\xc2\xca\x49\xf2\xd4\x19\xeb\x65\x4a\xca\xef\xdf\x7a\x03\x96\xa1\x5b\x56\x85\x46\x02\x1d\xd2\x32\x24\xe2\x80\xa8\x5b\xb6\x77\x36\x83\xa8\xc4\x2e\x77\x15\x29\x8c\x89\xdf\x74\xdc\xe8\xa6\xbf\x68\xee\xd5\x8f\xd9\xf4\x14\x55\xef\x60\x17\xb7\xe0\x55\xe6\xbc\x16\x46\x1d\xc7\xd2\x7e\x73\xa3\x0b\x50\xbe\x24\x0a\xac\x5d\x1d\x3b\xe4\x29\xdf\x9f\x6b\x15\x4c\x65\xf4\xde\xa4\x4c\xf7\x9f\xa8\x64\xe2\x21\x31\x71\x2e\x6d\xb7\x76\xbe\x41\xdb\x2e\x3a\x77\xcf\x54\x3e\x88\x30\x1c\xab\xcb\x3c\x0e\x01\x66\x13\xc7\xd8\x88\xdd\xf1\xf4\xe1\x37\x8a\xfa\x80\xfb\x02\x61\x18\xc7\x2f\xda\xda\x9b\x57\xda\x1b\x8a\x0b\xf8\x07\xfe\xad\xb5\x54\xb8\x5d\xc1\xad\x87\x75\x62\x5c\xf5\x42\x31\x9c\xd6\x38\x32\xa3\x54\x81\x83\x3d\x34\xb4\x47\xb6\x48\x3a\x89\xc1\x50\x04\xd6\xd0\xb9\x62\x47\x86\x28\x6b\xa7\x67\x69\x61\x53\x95\x12\xa2\x26\xa5\x50\x8a\xb8\xf0\x21\xe8\x5b\xce\x00\xc5\xed\x9d\xf6\x12\x66\xda\x30\x05\xe1\x5f\xfa\xab\x57\xbc\x9d\x34\x8e\xc5\x48\xfa\x16\x65\xa2\x0f\x49\xd5\x45\x7f\x86\x3a\x33\x10\x73\xe1\x79\xc2\xef\xfb\xf8\x2e\x84\x0a\xe1\x09\x35\x40\x3a\xdc\x62\x35\xe7\xaa\x42\x55\xf6\x49\x3d\x12\xc5\xbf\x7b\x3b\x0c\xda\x16\x72\xe9\xdb\xbd\xed\x4f\xa8\xeb\xd1\x37\xea\x59\x39\x1d\x03\x4c\x82\x3a\xd9\x06\x29\x78\x2a\xa0\xb2\x19\xd9\x10\x3c\x79\x08\xe9\x48\x9c\x36\xe8\x52\xf1\xdf\x57\x5f\xa5\xa1\x6f\x53\x73\xc7\x39\x48\x8c\x82\xf0\x34\x32\x91\x5f\x5d\xdc\x00\x14\x5a\x63\xdd\xc1\x56\x28\x68\x26\x01\x7a\x74\xe0\xf5\xb8\xdc\xcf\x7f\xec\x5f\xa9\xc7\x42\xe2\x62\xf6\x2b\xf2\x64\xe2\x83\xda\x7d\xcf\x8c\xe0\xd4\xf6\x4d\x38\xee\x6f\x25\x4f\xba\xbc\xa2\x17\x6c\xd9\xb1\xa8\x8c\xe1\xbc\x3a\x20\xc8\xab\x5e\x6c\xb0\xd2\x59\x02\xc8\xcf\x7b\x14\xa9\x48\xe2\x5c\xd6\x5c\x70\xfe\xd6\xfb\x0b\x0c\xc2\x6d\x81\x03\xb6\x56\xfb\x53\xfa\x09\x76\x5c\x36\xb2\xfb\xc1\x58\x85\xe7\x68\x91\xf9\xc6\x03\x1e\x74\x0b\xb5\x91\x60\xea\xc9\xdb\x72\x02\xd2\x9b\x7c\x37\xfe\x81\xda\xa6\x79\x19\xc5\x1d\xbb\x98\xc2\x81\x88\xee\xde\xec\x26\x69\x3d\x69\xeb\xc1\xe7\xa0\xdc\xbc\xe4\xad\xe9\x34\x55\xd6\xc4\xd8\x2f\x05\xb3\x2a\x89\x90\x2b\x71\x6c\x5a\xa0\xde\x62\x2d\x30\xdc\x1c\x0f\x67\x5c\xb6\x90\x11\xcb\x70\x22\x86\xb3\x7c\x99\xf9\xe9\xca\x38\x53\x20\x7d\x5d\xb4\x32\xe2\x37\x7a\xdd\xa2\x51\x81\xc7\xdd\x07\xba\x5b\xdc\xbe\xe3\x32\xab\x38\x1a\xaa\xf5\x4f\x0e\xb8\x5f\x12\xfc\x68\x38\xd6\xca\xdd\xc8\x32\x75\x53\x58\xf1\xb0\x92\x2f\x23\x1a\x0c\x5d\xdd\x69\xd2\x16\x16\xc2\x83\x34\xf0\x40\xe5\x33\x10\xf8\xee\x07\x62\xe5\x81\xea\x0a\x45\x76\x81\xb1\x8c\xfe\x90\x5b\x94\x7d\x06\x9c\x86\x31\x1d\xed\xbb\x55\x59\x52\x89\x20\x98\x5b\x8b\x32\x02\x0f\x22\xa3\xf2\xb1\xf1\x41\xc7\x4e\xf5\xa8\x35\xe7\x30\xfe\x8b\xdd\x6c\x9a\x5a\xbd\x67\x24\xe7\x26\xb2\x4e\xe4\x2f\x33\xa5\x95\x09\x38\xa1\xf1\xf3\xfc\x7d\xb3\xdf\xa7\xa3\x1f\xbc\x86\x3e\x93\x3c\x5c\xfd\xb7\x77\x87\x63\xfe\x16\xa4\xbd\xa2\x61\x5a\x94\xec\x26\xd1\x78\x74\x87\x02\xb9\xe7\x3b\xcf\xbd\x2d\x46\xcf\x81\x39\xcd\xc5\x47\xc0\x60\x8e\xed\xa0\x90\xb9\x47\xa3\xd0\xa6\x10\x13\x4f\x59\x03\x67\x0b\x56\x5b\x7b\x36\xd1\x50\x2d\xb2\xa7\xb4\xb9\x24\x7e\x6d\x20\x0b\x27\xec\xe9\x2a\xdf\xb0\x0b\xa7\x93\xac\x20\xd5\x57\x3d\x33\x2e\x8b\xd4\x0c\xc7\x90\xa1\x98\x46\x53\x57\x37\xe9\x20\x81\xd2\x1f\x6d\xb6\x9a\x4b\x79\x90\x14\xe0\xe9\xa7\x8f\x14\x13\x4e\xae\x30\xf1\xf1\xff\x04\x2f\x95\x85\x1f\x6d\x0f\xee\x54\x20\x18\x90\x5e\x26\xf6\x74\x39\x0f\xa6\x7f\x4d\x26\x4f\xa3\x6e\x5f\xb2\x51\x5b\xc5\xf3\x33\x4d\xc9\x54\xd2\x20\x53\x48\x1a\x3e\x65\x9a\xe3\x1c\x61\xa2\xdf\x52\xc3\x6c\x9c\xec\xef\x4e\xb8\x9e\xe3\x11\xc7\x1e\x77\x00\xa6\xaf\xab\xec\x66\x04\xc6\x61\x05\xe1\xe6\x04\x91\xa3\xfc\xaf\x2a\xaf\x05\xca\xa1\x53\x87\x81\xeb\x20\xce\x6f\x27\xcf\x3f\x7f\xdb\x49\x9c\xb3\xc6\x32\x4a\xa3\xef\x9e\xe8\x74\x9f\xdd\x40\x4a\x33\xd5\xd4\xc7\x1b\xc6\x6d\x0a\xa8\xcf\x1b\xe7\xcb\x6b\x57\xb4\x8a\xc1\x3f\xc3\x90\xdb\x25\xb4\x36\xd4\x4a\x79\x27\xf3\xbd\xec\x43\xf2\xf7\xd5\x35\x45\xdb\xc3\x21\xda\x43\x5f\xd8\xf2\x38\x1f\x7d\x3b\x2b\x2a\x7b\xba\x2a\x99\x20\x9e\x4f\x6e\x7f\x61\x2c\x06\x67\x14\xcb\xf6\x61\xba\xcd\xd6\x2a\xa8\x8c\x21\x03\x62\x92\x25\x32\x5d\x29\x76\x89\x84\xbd\x10\xe7\xf6\x02\x15\x0a\xc4\x28\x30\x2d\x58\xfd\x80\x02\xf5\xc1\x46\xf0\xfe\x94\xfd\x26\xd9\xf7\x0c\xee\xb1\x27\x8d\x7d\xa5\xb3\x99\x77\x32\x1e\x8a\x9c\x57\x4a\x10\xb7\x7a\xeb\x80\xeb\xff\xe9\xff\xd3\x5f\xe7\xb7\xe3\x86\x02\x2b\x2b\x6c\xc4\x23\xa6\x55\x44\xaf\x78\x16\x44\xa3\xa9\xb7\x30\x03\x18\x94\x0d\xba\xc9\x2c\xd1\xca\xb4\xce\xc1\x50\x54\x2d\xd1\xef\xaa\x05\x5e\x7b\xa7\x2c\xe7\xbe\x29\x61\xfd\x46\x6a\x2e\xd0\x71\x4d\x7a\x84\x5b\xd2\x71\xa6\x16\x76\x76\x93\x06\xbe\x3c\x36\xc4\xb5\xdd\xef\xa8\xa5\xe0\x31\x20\x86\x40\x92\x22\x66\x53\x62\xea\x94\xda\x6c\x5c\x96\x35\x43\xb6\x8d\x00\xae\x95\x00\xae\x8d\x00\xd6\xdf\xb8\x2c\xd6\x41\x7a\xd0\x41\xe6\x7a\xdd\xf2\xed\x8e\xb4\x70\xb4\x5c\x05\x3e\xf1\xbd\xf5\xbc\xd6\x64\xde\x79\x43\x99\x6e\x24\x7a\xc1\x84\xd3\x76\x3f\x36\x3d\x33\xdb\x0b\x79\x92\xe5\x2e\x62\xde\xe4\x8f\x5d\xe4\xbd\xd1\xf8\x33\xc7\xea\xa7\x2e\x3d\xdc\x90\x45\xe9\xdf\x58\x66\xca\xdd\x7c\x67\xb6\x3b\x77\xfc\x59\x50\x2e\xec\x15\x2b\xbf\x3c\xd8\xd4\x99\x6b\xba\x11\x7f\x27\x10\x5e\xeb\xf8\xec\x59\x39\x2d\x24\x76\x20\xf7\x3b\x56\x5a\xe1\xaf\xf9\x87\xe2\x52\x35\xe1\x40\x15\xc3\x8f\x17\x0c\xaa\xe7\x1c\x06\x94\xfc\xd3\x0f\xab\xfd\x63\x13\x9b\xf6\x77\x7c\xe5\xb2\x65\xc0\xd6\x83\x41\x7e\xd9\x26\x07\xfd\xb2\x5d\xe8\x9d\xd9\xea\x45\x79\x73\x5d\xa4\xb9\xb0\xbd\x7b\xd7\xd7\xc8\x9c\x2b\xb4\x3f\x22\xbd\x16\xa2\xce\x39\x3b\xd6\x86\xba\xfd\x65\x09\x40\x86\xd9\xe9\x06\x65\x36\x66\x8c\xce\xba\x82\x36\x32\x75\xaf\xab\x18\x71\xd1\x42\x09\x1c\xd7\x07\x60\x20\x78\x50\x17\xd1\xaf\x03\x34\xae\x1f\x52\xc2\x48\x8a\x49\xdf\x2d\x4e\xb5\xce\xdd\xb3\xd6\x6e\xda\x97\x23\x83\x66\xba\x05\x63\x34\xd4\xab\x80\x72\x6b\x55\x38\x46\x95\x96\xec\xd3\x08\x68\x77\x4f\x42\x95\x80\x35\xfd\x28\xc0\x96\x4f\x72\x74\x73\xe6\xf8\xa5\x48\x31\xa5\x48\x38\xc0\x73\xbb\x11\xfe\x1c\x72\x41\xe8\x06\xa1\xb8\x44\xd1\xa0\x66\xd6\xf8\x33\x46\x53\xec\x9e\x91\x61\x15\xd0\x7b\xca\x23\x5e\x1d\x8e\xa9\xb1\xfa\xd7\x11\xf9\x9d\xfe\x4a\xa9\x6d\x3c\x7d\x7c\xee\x91\x5b\xc5\xf6\xc5\x4d\x59\x96\xa9\x52\x71\x40\x80\xa7\x17\x99\x6f\xde\x13\xdc\xf8\x87\x02\x4c\xae\x71\xb0\xfc\x17\x73\xf8\xe3\xc3\x24\x92\x8d\x7f\xb6\xeb\xd8\x2c\xb0\x13\x45\x12\x45\x5f\x2b\x7e\xfb\x43\xf7\x82\xcc\x94\x3a\xb7\xc6\xa9\xed\xfb\x9e\x25\xb3\x25\x45\xfe\x5b\xd5\x5d\x5b\xd2\xba\x65\xe3\xf2\x27\x72\x63\xbb\xff\x08\x54\x61\xcb\x3c\x8d\x6c\x3a\x42\x5f\x55\x09\x8a\xfb\xad\x09\x9e\x3e\x3c\x54\xac\xd9\x76\x7a\x3e\xc6\x7b\xc1\xc9\x0f\xe5\xf9\xc3\x56\x7e\xde\x76\xe3\x61\x01\xdb\x7d\x52\x60\x83\xd3\xac\x57\x07\x78\x59\xf9\x92\x30\xdc\x4f\x50\xeb\x73\x8d\x88\xb8\x83\x27\x58\x28\x91\xe0\xf6\x39\xc2\x94\x50\x6d\x00\x78\xac\xd9\x78\xac\xe9\xf8\x01\x64\x01\x15\x60\xff\x52\x9b\xee\xce\x58\x66\xc6\x7a\xff\xaa\x52\xe7\x2e\x51\x3c\x20\x76\xc3\x51\xdc\x7d\xe8\x1e\x34\x69\x37\x50\x56\x6a\x7f\x14\xd7\xf1\x9b\x12\x74\x42\xf0\xc5\x8a\x51\xe2\xe0\x29\x87\x63\x12\xae\x0e\x38\x06\x47\xc7\xd4\xd7\x52\x47\x53\x5d\x6d\x09\xd6\xe3\x38\xae\xc3\xf2\x7b\xbc\xd8\x76\xfa\x03\x84\xc4\x88\x55\x21\x08\x45\x17\xba\x12\x1f\xa8\xc4\x86\xb2\x2f\x3a\x7e\x48\x8a\xda\x39\x16\xac\x2e\x94\xf4\xe9\x17\xd0\x39\x0c\xc9\x53\x8c\x65\x34\x76\x86\x4a\x5b\xee\x60\xc2\x94\x35\x7f\x39\xc7\x16\x5b\xb5\x27\xa1\x0a\x6b\xe4\x9b\xe7\x5d\x9c\xc5\xdc\xf6\x22\xb9\x0b\x5d\x7b\xfd\xe0\x4f\x6c\x19\xb4\xc1\xe7\xb0\x53\xcb\x7a\xa2\x10\xc6\xab\x82\x57\xb8\xa0\x49\x9b\x24\xe9\x62\x36\xd9\x06\x12\x18\xbf\x21\x54\xa1\x3b\xd1\xdf\x89\x6c\x30\x49\x03\x22\xdf\xc0\x2a\x0c\x31\x98\x54\x43\xb9\x25\x7f\xf8\x0b\xc8\x7c\xbf\x0c\xc4\x35\x7d\x2e\x4e\x9d\xce\xd2\x13\xb9\x5d\x48\xd3\xfe\xb7\x2d\x80\x30\x08\x4e\xe8\x1a\x53\xba\x19\x1f\xba\xff\xad\xc7\xd7\x09\xd1\x59\x6d\x5d\xd7\xc1\xea\x40\xe0\x0a\x4f\xcb\xa8\x79\xf7\xd5\xea\x66\x82\x95\x97\x61\x13\x57\x44\xda\x7b\xe6\x56\x39\x59\x7b\x87\xd7\x53\x98\x3a\xcd\xfd\x55\xae\xde\x12\xb9\xe8\x5c\x63\xc9\x59\xc1\x8d\x72\x70\x3a\xd9\xd0\x6e\x9e\x80\x14\xc7\xce\x76\xb3\xa2\x34\x37\xb9\x68\x51\x18\x41\x96\x38\x62\xde\xfa\x81\x9a\xac\xd5\x54\xb1\x76\x1f\x84\x7e\xf5\x2c\x5a\xb6\xd4\xe1\x14\x94\x15\x5a\xff\xa6\xb6\x3c\x75\x79\x74\xc6\x1a\x03\x76\x33\x69\xdd\x54\x69\x8b\x0d\x4e\x19\x3b\x0f\x80\x79\x65\xa3\x04\xb5\x12\xd7\x36\x59\xc0\x9b\xf0\xfc\x4c\xc7\xb3\x5a\xaf\xed\x69\x8d\x06\xbc\x0b\x59\x27\xf9\x21\x41\x9b\xed\x93\x10\x05\x98\x81\x2b\x46\x95\x86\x0f\xcc\x38\x5f\x5d\x5f\xbe\xae\xeb\x5a\x8c\xdf\xef\x9a\xec\x29\x85\xa9\x1c\x10\x74\xc1\xd9\x47\xf5\x06\x4d\x0a\x4e\xc6\x75\x6d\xcc\xf0\xfd\xe8\xcc\x6f\x38\x01\x02\xc6\xdc\x98\xe2\xf5\xb0\x26\x7f\xe9\x91\x6a\x1b\x9c\xd5\xc8\xd8\x94\x30\x4e\x9e\x05\xf7\x3c\x2d\x55\x08\xfd\x7d\x9b\x6b\x7e\x19\xc8\xc4\x1f\x08\x7a\xb2\x8d\xad\xf0\x11\x30\xf5\x2e\x6f\xe1\xda\x1c\xe7\xc5\xca\xdd\xb4\x05\x5c\x9d\xb3\x93\x85\xa6\x3b\x00\xfa\x3e\x59\x9c\x48\xf9\xdd\xe5\x5a\x22\x25\x0c\x5c\x74\x6a\x5a\xe3\x2b\x05\x7e\xb8\x1e\x30\xbe\x47\x5f\xba\x03\x40\x6a\x6b\xc1\x5b\x35\xc4\x3f\xe8\xe9\xb2\x32\x4f\x03\x95\x55\x5a\x1f\xfa\x3b\x41\xed\x7b\x5f\x6a\xa9\x0d\xbe\x0d\x6c\xaa\x7f\x5a\x34\x0d\x65\x2e\xc6\x5c\x73\xb4\x1c\x53\x11\x9c\xd2\x13\xc1\x5e\x50\x0d\x0f\x77\x02\x25\xb7\x05\xb0\x79\x55\x76\xe0\xf5\x87\x02\x05\xf6\x02\xe7\x94\xda\x05\xe4\x00\x2d\x15\xaf\x1f\xb5\x2e\xb9\x6b\xba\xd1\xee\x64\x1d\x89\x47\xb7\x01\x21\x0b\x00\x6a\x39\x41\x6b\x02\xf1\xbe\x7f\xc5\x22\x1a\x2f\x41\x64\x46\x62\xb4\x54\xc4\x79\x8e\x9e\xea\xec\x6d\x85\x28\x9e\x02\xc5\x68\xc9\xc5\x89\xfe\xfc\x03\x00\xf5\x26\x81\x91\x05\x2d\xe2\xf8\x40\x7f\xe6\x44\xe2\x18\xfd\x23\x51\x7c\xe9\xb3\x6e\xf4\x53\x1a\x99\xdf\x74\x7f\x09\x9c\x56\x55\x01\x36\x1e\xa6\x9a\x1e\x06\xf8\x63\x63\x24\x0b\xdc\x64\x6a\xdb\x68\x44\xa2\xd1\x44\x3b\xe7\x9f\xc0\xbe\xad\xc4\x92\x46\xa1\xce\xec\x16\x3a\xbd\xb8\x72\x8c\x9f\x5a\x3f\x19\x92\x9e\xbf\x91\xf4\x8a\x96\x49\x78\x63\x1b\xf2\xfd\x9d\x45\x56\x45\xa9\x5f\x63\xa8\xdb\x45\x48\x9d\x48\x26\x22\x4e\x7f\x7e\x74\x81\x57\x10\x0a\x45\x85\x84\xed\x53\xd6\xd7\x83\x89\xf5\x2c\xd5\xf4\x89\xfe\x8a\x13\x4b\x72\x1b\xf9\x15\xe7\x90\xa3\xa8\x8d\x89\x4b\x16\xb5\x73\xa4\x13\x43\x72\x09\xde\x05\x53\x40\x6e\x46\x17\xa2\xfe\x2c\xb0\x28\x25\xd1\x53\x9d\xa9\xf3\x18\xa5\x0e\x98\x5a\x66\x88\x89\x84\xf6\xda\xf3\x35\xbe\x84\x7a\xb1\xa6\x24\x28\x52\xf3\x1b\xb1\x8b\xbd\xd9\xc5\x78\x56\xee\xf4\xfb\x99\xde\x4a\x07\x49\xcc\x32\xe2\x07\xda\x24\x0d\xa0\x3f\xd0\x98\xc6\x2d\x3c\x11\x93\xcf\x51\x1e\xac\xec\xce\x5d\xd8\x7c\x05\x94\x40\x3a\x05\x87\xde\x6e\x74\x69\xd1\x99\x65\x57\x2f\x50\x19\x2e\xd6\x96\x4a\x53\x5c\xca\xc3\x88\x20\x89\x6c\xf6\x6c\x5a\xc8\xc7\x23\xe7\xd4\xfb\x07\xe8\x31\x6f\xde\x65\x66\x96\x8e\x88\x4c\x77\xf4\xa7\x89\xaa\x31\xba\x0a\x54\x94\xff\x1f\x49\x67\xad\x24\xbd\x0e\x05\xe1\x07\x72\x20\x33\x84\x63\x98\x31\x33\x67\x66\x66\xf6\xd3\xdf\xda\xff\x46\x5b\x9b\xb8\x64\xa9\x75\xfa\x6b\xd5\x19\xcb\x14\x4f\x74\xe4\xce\xd1\xa8\x2f\xe3\x95\x23\x18\x3f\x4b\x6a\x2e\xef\xd4\x52\xbe\x96\x63\x3e\x98\x94\x81\xd7\xc0\xca\x03\x53\xd9\x03\x44\xd4\x8e\x3e\x9a\x7a\xb1\xc6\xb8\x90\xfb\x8a\xe3\x89\xfe\x7b\xf3\xad\x34\x7e\x04\xf1\x90\x0c\xa5\x2a\xeb\x4a\x21\xc3\x35\x59\xf2\x54\x53\x3d\x2e\x3c\x7e\x1f\x7b\x29\x82\x82\x68\x13\x09\xc6\x81\x77\xb5\x5e\x51\xd8\xe3\x1a\x38\x83\x4a\x63\x74\x77\x0c\x1c\xe2\xf7\x4b\xd3\x14\x45\x5d\x44\x06\xe5\x85\x79\x64\xca\xc4\x08\x13\x54\x6b\xc8\xc1\x20\xa9\x3e\x80\x78\x0b\x74\x31\xf7\x7d\x3f\x40\xf6\x54\x61\x1d\xe7\x81\xfc\xdf\x44\xfd\xe0\x55\x74\x17\xe4\xb3\x0f\x61\x7b\xa9\xe3\x3d\xca\x88\x3e\xc6\x47\x28\xf2\x76\x2d\x60\x85\xf9\xdd\x04\x77\x7e\xed\x5d\x9f\x74\xd1\x1c\xde\xa9\xcf\xa8\x86\x53\x3c\x32\x37\xa8\x72\xa7\x47\xa4\xf2\x23\x81\x27\xf9\x91\xb8\x33\x3d\x54\x7a\x7b\xc3\x52\xbe\x1d\x67\xff\x70\x88\xd2\x27\x7d\x92\x88\xb6\x50\xfd\x72\x8b\x69\x43\x06\xba\x9e\xa3\xb9\xe7\x79\x51\x33\xd2\x3a\xb9\x33\x0d\x81\x7c\x30\x5e\x0a\x27\x8b\xd5\xf9\x2b\x0d\x7f\x60\x40\x2d\xcf\x16\xf1\x5c\x32\xf1\x22\xfc\x74\x8e\x33\xfb\xdc\x82\x04\x0b\xfa\x4e\x0a\x07\xef\xaa\x4d\xdb\xe6\x00\x93\xb9\xb1\xfb\xc3\x4e\x9e\xd1\x5c\x69\x6a\x3d\x32\x10\xc1\xf7\x51\x61\x88\x2f\x53\x84\x7e\xe8\xc3\xb9\x58\x33\x60\x27\xc6\x0d\xfa\x34\x5e\xe9\xee\x5f\x65\xd6\xd9\x4a\x93\x93\xa0\x9f\x93\xa0\x27\x08\x04\x60\xb3\x33\x7b\xaf\x46\x25\x36\xae\xb1\x67\x79\xa0\xbe\x49\xc4\xc1\xbf\x7b\xbe\x10\x3f\x0e\x45\x9c\x1e\x22\xb8\x78\xf9\x98\x57\xf6\x70\xdd\x7e\x36\x52\x48\x30\x2e\xf0\x2c\x13\x43\xe7\x2f\x75\xe7\x0e\x2b\x0c\x8e\x20\x61\x72\x15\x20\xb7\x52\xeb\xaa\x22\x14\x44\x75\x6a\xdd\xed\x32\x03\xfc\x18\x4b\x18\xd9\xef\x58\xe7\x1f\x66\xbe\x1d\xc7\xbe\xb5\x22\xfe\xb1\x59\xa0\x48\x8e\x1b\x1d\xa8\x19\x2c\xee\x77\x22\x65\x5a\xb8\x2d\x41\xf2\xd5\x8b\x59\xfd\x30\xbc\x61\x26\xde\xde\xec\x08\x8d\x73\xe0\x4f\x31\xe5\xe3\x16\xed\x6a\x25\x40\xcf\xf5\x9d\x51\x4a\x5a\xe9\xef\x9f\x1f\xfd\x71\x54\x6f\x12\x67\x95\xd3\x10\x4d\x5f\x7e\x46\x92\x16\xb1\x52\x3b\x84\xbd\x25\xda\xfa\xab\x3e\x82\xc7\x49\x54\x17\x3f\x31\xa2\x54\x29\x29\x85\x4a\x67\xdb\x25\x8a\x5a\xdf\xb7\x69\xfb\xd7\xfe\x0d\x8d\x83\xa6\x1f\x15\xd6\xed\x5c\x6c\x98\x05\x29\x76\x30\xb4\xf1\x36\x6b\xa3\x8b\xa6\xe6\x42\xc6\x73\xb1\xad\x9e\x92\xe7\x59\x01\xc1\x7d\x8f\xe0\xcb\xd3\x0f\xf3\xdf\xe4\x21\x00\xdc\xef\x1d\xaa\xfd\x05\x3d\xb6\xd4\x34\x8b\x3c\xbc\xf1\x4e\xbc\x14\x85\x19\x55\x25\x6b\x27\xe7\xe2\xcc\x95\x95\xc0\x14\xbf\x26\xde\xe0\x57\x9c\x97\x65\x10\x3e\x84\x36\x36\xd4\xe1\xda\x13\x5c\x80\x02\x6c\xb9\x34\x50\xd7\xb6\x6d\x67\x09\xa5\x31\x86\x8a\xb0\x86\xec\xa1\xcf\x14\x4b\xef\x1c\xa1\xef\xbc\xfa\x63\x98\xe8\x61\x8a\xed\x4a\xec\x18\x66\xfb\x2f\xb1\xd5\xdd\xb6\x59\xcc\x03\xbe\xed\x8d\x92\x80\x71\x93\x7b\x3f\x13\xe0\x02\x06\x7d\xf7\x87\x10\xaa\x77\x40\x1a\x24\x35\xb1\x16\x80\x12\xa3\x98\x21\x34\x73\x02\x97\x85\x27\xcd\xb2\xfd\xd8\xb7\x87\x84\x02\x73\xa1\x82\x7e\x77\x69\x08\xa7\x28\xf2\x4e\x8f\x87\xc8\xd5\x73\xb3\x24\xf7\xa8\xbc\xef\x0d\xdd\x76\x80\x61\x58\x2f\x46\xc1\xb7\xfe\xdb\x63\xe4\xb2\x2e\x39\x43\x40\x05\x63\xfe\x5a\xcf\xd8\x38\x59\x3c\x3a\x16\x12\x0b\xb5\xcd\xa9\xda\x2b\x55\x1f\x42\xb2\xc1\x6f\x23\xd4\xa4\x03\xec\x04\x8e\xcf\xdc\x6b\x55\xab\xd2\x27\x60\x25\xc1\x4f\xd6\x03\x69\x28\xec\x27\x84\xd3\x8a\x2d\x9c\x4c\x1d\xf3\x96\xd5\x79\xd7\xb0\x49\x50\xdf\x88\x5b\xaf\x90\x6a\x5a\x2c\x27\x24\x4a\xae\xfe\x90\x55\x3e\xd5\x6a\xe5\x28\xec\x3a\xc7\x57\xfe\xf6\x29\x9c\xf1\x82\x96\x31\x3f\xed\x67\x6d\x81\x3a\x57\x68\xe9\x4e\x83\x4b\xaf\x3b\xaa\x52\xed\x19\x02\x86\x04\x06\x53\x30\xe6\xb1\xe3\x1f\x81\x86\xb4\x3c\x3c\x80\xf2\xff\xfc\x3d\x7f\xd0\xe8\x3f\x1c\x4e\xd0\xa7\x7e\x1e\x00\x43\x13\x12\xa2\xf4\x8d\xdc\xe4\x3d\x31\x85\x2b\x33\xc4\x6f\x4b\x8f\x17\x84\xa5\x3a\x9e\x71\x53\xf0\x50\x69\xf8\x9a\x2a\xb3\x12\x24\x91\x1b\x58\x11\xbf\x45\xb2\xae\x54\x3f\x60\xe7\x4d\x1c\x61\x4f\x68\x01\xd8\x61\x12\x49\x47\x6c\x7d\x74\x28\xcf\xce\xbb\x33\x6a\x2a\xdf\xb0\x55\x6e\x21\x9c\xa4\x28\x0a\x1b\xe7\x79\x3f\xef\xea\xd6\xf6\x9f\xe7\x3b\x70\x98\x05\xdd\x97\xad\x8a\xff\xfb\x45\xec\x09\x4e\xf4\x20\xdd\x50\xcd\x10\xf9\x69\x40\x2e\x07\x4d\x75\xaa\x40\xf6\x79\xbe\xe0\x96\xe0\x91\x3c\xf5\x4a\x93\x87\xa0\x1b\x3a\xc1\xde\x9e\x0c\x5a\x2e\xc9\xfb\xe2\xb7\x9d\x89\x27\x68\x1b\x22\x85\xe8\x5c\x33\x74\xfd\x21\xe9\x72\xfe\x06\x0b\x1d\xe0\x37\x11\x33\x90\x06\xbb\x2e\x44\x95\xfb\x43\xab\x27\xb3\x65\x86\xc8\x56\xf8\xe6\xc8\x27\x46\x3d\x8d\xfb\xcc\xe1\x6a\x7e\x69\x70\x97\x21\xb6\x12\xd8\xcd\xd0\x9d\xfc\xed\xf5\x2b\xb2\xb9\x8f\x1d\xac\x7d\xf3\xaf\xcf\x35\xa5\x56\x82\x98\x41\x06\x72\x53\x53\x94\xce\xe3\xa6\x10\xa2\x8f\x0c\xa8\xa0\xbf\x32\x2f\x39\x84\x2b\xb3\x10\x90\xee\x28\x91\xd3\x87\xd8\x86\xef\x0c\x37\x67\xcf\x4c\xce\xfc\xee\x9d\xa2\xfa\x5a\x23\xe8\xc0\x48\xf1\x9d\x96\xa4\x70\xb6\xc3\xce\xba\x6d\x7b\x92\x42\x87\xed\xe6\x46\x97\x3e\x7d\x5b\x27\x16\x14\xc4\x38\x06\xbb\xb9\x13\x0e\xf7\xe5\x8a\x99\xbf\xa1\x29\x43\x3e\x45\x68\x14\xd7\xfb\x05\xe0\x7c\x57\x62\x03\x2e\x19\x3a\x91\x45\x8f\x21\xbc\xab\xcf\x49\x31\x44\xb2\x81\x03\xb3\x9a\x2f\x67\x40\xb8\x04\x67\x50\x61\x42\xbc\x6b\x6f\x18\x73\xba\xb0\xf3\x5b\xc5\xd0\x0c\x91\xf7\xc5\x28\xca\x3c\x01\xb4\x67\x8c\x09\xce\x78\x95\xf6\xf1\x2e\x49\xb9\xa3\x7c\x5e\xb9\x5a\x4e\x26\x36\x14\x14\x67\x9e\x63\x1b\x25\x04\xc5\x8b\xec\x69\xb0\x33\x04\x4d\x13\x28\x86\x11\xf8\x9d\x41\xd1\xbe\x33\x70\x62\xdd\xbf\x32\x67\x08\x12\x22\xe9\xf3\x7c\x5f\x18\xc6\x7e\xb5\x67\xd4\x66\x09\xea\xd6\x82\x4d\xbe\xba\x68\xa6\x36\xab\xf1\x9d\x04\x9e\xa5\xed\x3c\x18\xcf\x1c\x88\x9d\x8c\xee\xc1\xb7\xb9\x13\x65\x60\xc1\x68\xfc\x28\xc2\xa6\x0f\x00\xbd\xa0\xbc\xee\x57\xd2\xbe\x74\x61\x9a\x6d\x30\xa0\x60\x47\x55\x9c\x59\x83\xfd\xc7\x23\x48\x1a\x30\xc7\xba\x52\xef\xc3\xf4\xfb\x19\xba\xf9\x89\x6d\x28\x86\xfd\x9e\x17\x7d\x05\xb1\x5e\xc8\x67\x3b\x95\x1a\xba\x19\x09\xd4\x3e\x80\xd7\x2f\x00\x00\xa7\xd2\xf5\x64\x18\x8c\xc1\xb3\x4c\x15\x1a\x5f\x4d\x77\x88\x3a\xa8\xa9\x3c\x4a\x88\xff\x54\x96\x1e\x1b\xef\x94\xdd\x14\x46\xbd\xed\x2e\xb6\xf7\x4d\xe0\x16\x7d\xce\xe3\x49\x31\x12\x69\xb4\x55\x79\x1c\x17\x28\x97\x8f\xf0\xfb\x5e\xd7\xef\xcf\x9b\xe8\x82\x36\x41\x8f\xa4\xde\x63\x92\xf7\xd8\xdd\x67\x1d\x21\x7b\x2c\x37\x4c\x39\x76\x8e\xa2\x91\xaa\x26\xdd\x95\x23\x71\x03\xdf\x39\x52\xd4\x78\xc6\x2d\x49\x75\x63\x93\xb6\xbc\xa2\xf1\x4f\x5b\x07\xfb\x2c\x67\x31\xc0\x3c\x6b\xd0\x03\xdc\x54\x99\x52\x56\x55\x0a\x83\x5e\x8c\x29\x0a\x06\x41\x74\x86\x21\x1d\x98\x30\xf8\x23\x76\xe0\xfa\x02\xf9\x71\x8f\x0c\xf3\xa6\xd8\x4e\x1a\x9e\xe6\xce\xdb\x0d\x53\xe0\x0c\x8f\x13\xa4\x07\xea\x98\xfd\x98\x3c\xfb\x1a\x62\x1d\x1e\x65\xa3\x1b\x53\xf4\x25\x69\x66\x2f\xd1\x91\x90\x6b\xa3\xdb\xa7\x90\xf4\x1d\x9e\xc2\x14\x39\xc8\xda\x0a\x50\x04\x27\xfd\xf5\xa0\xa0\xad\x32\x6c\x9d\xfb\x07\x67\x00\xa4\x68\x65\x79\xd2\xe2\xf0\x02\x22\x36\x6a\x70\xfc\x71\xf0\x9c\x97\x45\x33\xfc\x12\x24\x84\x68\xfa\x07\x30\x0c\x1b\x45\xcf\x82\xb2\xcc\xce\x4d\x8d\x7c\x56\xb5\xc9\x8d\x44\xcf\xb5\xa0\x30\x8e\x5f\xa8\xf7\x0f\x92\x37\xe7\x6c\x0f\x85\xfb\x9e\xe1\x79\x42\xc5\x98\x9b\xe0\x85\x78\x2a\x66\xa0\x61\x08\x64\x2d\xa7\xa0\xf0\x81\x18\x86\xa1\x52\xfa\x47\x43\x19\x0d\x18\xe4\x4e\x93\x67\x1b\x2e\x84\xcb\x0c\x51\x6c\xce\xf1\x3c\xde\x22\xed\x0a\xc1\x0e\x7d\x26\xe3\x19\x06\x01\x8c\x51\xdb\x4e\x81\xf8\x0a\x6b\x93\xb4\x49\x51\xdb\xdb\x11\xd8\x70\x9e\xd8\x0a\x83\x12\x6a\xeb\xfd\x4b\xbc\xa2\x75\xfd\x28\xea\xc4\x62\x50\xff\x78\x97\xc7\x09\x50\xa7\x29\x85\x13\x14\x31\xaf\x21\xd6\x1e\x90\x67\x75\x7f\xf9\x99\x64\xa3\xb6\xcd\xdf\xf9\x8b\xa2\xf3\xde\x71\x17\xcb\x89\x1c\x83\x71\x0e\xce\xb3\x40\x96\xa4\xf1\x0e\x7a\xd1\x95\x7a\xfb\x7e\xaf\x06\xb9\x5f\xe8\xa6\x67\x9c\xbc\x3f\xe8\x28\x50\xbf\xaf\x35\x43\x27\x00\xa5\x88\x3d\x57\x62\x92\xdc\x4c\x50\xf4\x9b\xf4\xee\xfc\x72\x79\xb7\x70\xf7\x54\x88\xc5\x01\x31\x6c\xd6\xde\xc6\xf0\xc6\xc7\x69\x86\xc3\x70\x43\x38\x85\x91\xb2\x4c\xe7\x14\x55\x9e\xf4\x1f\xb9\x40\x39\x16\x86\x63\x87\xd4\xc7\xee\x6e\xcf\x06\xc4\x8a\x14\x7d\xec\x81\x4b\x5d\xa4\x59\x87\xa6\x19\xec\xe1\x1f\x3c\x20\xcc\xf9\x73\xf2\x37\x45\x13\x8e\x01\x8e\xbf\x67\xfd\xd5\xcc\xf1\x35\xd8\xb7\xa0\x30\x07\x82\x68\xf3\x88\x46\xe8\xf4\x4f\x8a\x70\x7c\x3f\xf8\x0e\x5c\xce\xd9\x70\x29\xfe\xed\xd9\x26\x6d\x59\x34\xce\x33\x69\xc0\x15\x83\x98\xff\x38\x7b\x19\x96\xfd\x8b\xfd\x58\xd7\x63\xfe\x38\x7a\xbb\x78\x57\xfd\x7c\x11\x86\xa6\x63\x83\x2a\xc7\x17\x73\x31\x32\x51\x67\xa0\x70\x99\x7c\x87\x5a\xd8\xc8\xd6\x39\xbc\x21\xd8\x7b\xbf\xa0\x0e\x6a\xbb\x35\x2b\xb2\xf9\x4f\x54\x82\xcc\x3b\x85\x24\x2c\x46\xd4\x01\xc5\x61\x85\xe6\xcc\x98\xc6\x7a\xc2\xfd\x0b\x00\x14\x6d\x7c\x88\xb2\x93\x74\xa6\x07\x5a\x1a\xe6\x09\x60\xa6\x2c\x4b\xc0\x53\x0c\xa0\xb3\xb6\xbe\xee\x5a\xac\x24\x01\x6a\x19\x82\x20\x21\x84\x40\x90\x97\x7a\xb6\x1d\xb8\x41\x93\xdc\xfb\xe6\xa7\x38\x79\xae\x73\x07\x27\x9e\x9f\x06\x9e\xe4\x46\x33\x5a\xce\x2d\xa7\xfe\xad\x8d\xfe\x55\xd3\xd9\x7f\xdc\xcd\x9c\x5e\x66\xac\x19\x4a\x36\xba\x89\xd8\x37\xa6\xb1\xcf\x76\x14\x32\x06\x88\x0b\x92\x96\x45\x6e\xea\xe7\x88\x2d\xcb\x96\x08\x6c\xf7\xcc\x37\x2b\x7c\x71\x4a\x17\x45\x53\x14\x60\x33\x4a\x77\x94\x2a\xcb\x2c\x3f\xf7\x16\x50\x8f\x8f\x78\x23\xdc\xdc\xe5\x8d\x89\xd9\x8f\x84\x40\xb9\x15\xfb\x7e\x61\x18\x87\x4e\x41\x99\x13\x5b\xa0\x02\x68\x3e\xf6\xb3\x30\xd2\x79\x26\x8e\x64\x68\xf9\xb0\x26\xd5\xc5\xd6\xbd\xb3\x3c\x29\x89\x81\x48\x3c\x83\xf2\x71\xbc\xb0\x67\x53\x01\xa0\x0a\x70\x13\xdc\x07\x6f\xc7\xb3\x9f\xe3\xcc\xa6\x3c\x3b\x3a\x43\xc5\x3f\x3e\xe8\x43\x34\x68\x34\x32\x9f\x7c\x5c\x99\xea\xe3\x0d\x4a\x61\x29\x20\xea\xba\xef\xdc\x7d\x93\xff\xf3\x92\x89\x99\x18\x1f\xf2\x18\x19\xd5\x65\xd0\xb2\xb7\x24\xb1\x3a\x81\x83\xd2\xfb\xd2\x50\x02\x00\x09\x30\xcf\xc8\x31\xe9\x07\x31\x50\x12\xc3\xc6\x16\x4b\x56\xa0\xb7\xf8\x7d\x9c\xe7\x43\xda\xa3\xdb\x43\x94\xde\x36\x00\x7b\x24\x2b\x1a\xd1\x77\xdf\xcf\x19\x1a\xc8\x36\x33\x44\xbe\x01\x80\xe4\x0c\x4d\x12\x58\x80\x87\x2c\x9e\x64\xa1\x53\x97\xe6\x70\x82\xd7\x71\x6e\x38\x17\xa3\x1e\x3a\x8e\x14\x2d\x44\x10\x96\xa0\x92\x13\x26\x51\xfb\x1a\x1a\x59\x51\x5c\xa6\xc9\xb5\x55\x18\x7e\xac\xc5\x9e\xda\x18\xc3\x37\xbe\x01\xd0\xe7\x4e\x2c\x87\x93\x08\x06\x72\x6b\xd4\xc8\x8f\x28\x37\x66\xe7\x53\xdf\xa7\x49\x2f\x73\xb0\xa6\x7d\x0d\x83\x02\x2a\xcb\x4b\x08\xeb\x26\x95\x9e\xc3\x5b\x6d\xe5\xcd\x87\x01\x36\x28\x1d\x80\xe9\x06\x34\xad\x88\x94\xf8\xb6\x28\xe2\x97\x33\xf4\x2c\xcb\x42\xee\x00\x32\xe1\xf2\x34\x47\xf2\x47\x9b\x38\xa1\x2d\x3f\xd8\x45\x48\xc6\x68\xcc\xf2\xe4\xf9\xfb\x66\x18\x5e\x85\x82\x08\xe3\xbb\x47\x16\xa9\x12\x4b\xcb\x33\x2c\x4b\x0f\x41\x7c\xac\x64\xc0\xe9\x53\xe7\x4d\xee\xe1\x0d\x3a\x0f\xa5\xf2\x73\x25\x8f\xd5\x22\xeb\xef\x8e\xd9\xf3\x6f\x74\x87\xd6\x88\x61\xa3\x81\xa2\x7c\xfa\x49\x3f\xe6\x25\xd0\xa0\xd0\xdb\x08\x8d\xb8\x62\x94\x48\xe0\x41\x80\xb9\xdf\x9d\x61\x1e\x12\xa7\x76\xf4\xfe\xe9\x1b\xed\x8a\x38\x18\x80\x09\xb0\x99\xe9\xf7\xc3\x4c\x59\x60\x92\xaa\x5d\x33\xe0\xaf\x0c\x50\xe2\xf3\x31\x4a\xe7\x85\x5e\x3c\x73\x02\x9f\x07\x44\xbd\x9f\x71\x7f\xc8\xb3\x68\x36\x86\x41\x31\x0c\x43\x98\xf7\x8b\x00\x1a\x87\x31\x4f\x9b\xb4\x49\x05\xa6\x09\x00\xdd\xf6\xfb\x59\x40\x54\x1c\xc3\x50\x69\xce\x68\x16\x93\xf7\xde\x36\x67\x5d\x28\x8b\x6c\xf4\x55\x1f\x2d\x4c\x05\xe7\x09\xe5\x88\xbc\x9e\xed\xe9\x22\x25\x48\x93\x3a\x53\xf6\x3d\x0a\xbe\x22\x23\xa9\xf5\x55\x7c\x9b\x97\x03\xd5\xd4\xdf\x3e\x85\xb9\x8d\xa8\x81\xd4\x6e\x1e\xd7\x60\x10\xad\xe9\x5f\xee\x4e\x20\x9a\x49\xd3\xc0\x94\x9a\x63\x2c\xcb\xd2\xce\xd9\x46\xf8\xaa\x0e\xbd\xb9\xed\x0b\x20\xfc\x06\x79\x5e\x72\xaa\xab\xb6\x56\x07\x19\xb8\x8f\x30\x04\x91\x93\x14\x85\xf6\x6b\x72\x9f\x0a\xfe\x6a\xb4\xc9\x50\x05\x76\x92\xd4\x4c\x00\x68\x7c\x0f\x30\xdc\x43\x3b\xc0\x32\x95\x1f\x10\x04\xf2\x38\x1d\x31\x70\x1c\x2e\x89\x84\x7c\xbe\x63\xac\xcd\x07\x31\x0d\xb1\xc2\x37\x3a\x51\x3c\xaf\x9a\xe7\x00\xe5\x89\x22\x51\x9d\xa0\xcd\x7d\xff\x4d\xbd\xea\x3f\xb0\xa3\x39\x7b\x9d\x99\xf5\x6c\xfb\x91\x35\x13\x90\x32\x47\xdb\x11\x52\xec\x35\xad\x5f\x07\x92\xc0\xf9\x73\x50\xf2\x58\x97\x91\x79\x11\x9c\xa1\x21\xc6\xb6\x0e\x71\x7a\xd0\x3c\xdb\x02\xff\x9b\xce\x2f\x04\x30\x9e\x3c\x5e\x47\x52\xf1\x52\x25\xeb\xfe\x47\xa9\xd6\x71\x06\xab\x77\x50\xb6\xa8\x8b\xf6\x95\x1b\x91\xa5\xc2\x70\x9e\x26\xd0\xde\x9c\xe5\x18\x62\x2d\xc6\x3c\x7f\x4c\x17\xf3\xd4\x49\x97\x0b\x0e\x8f\xd7\xe9\x67\xf5\x66\xef\x82\x61\x05\x5f\x6e\x97\xaf\xd6\x45\xa7\x7b\x71\x9c\xa6\xa6\x2f\x37\x41\x8c\xad\xf8\x66\xdf\xe7\xe7\x09\x96\xcd\x82\xc0\x91\x28\xd4\x6d\x37\x44\x8e\x2a\x41\x3e\xb1\x19\x54\x1c\x1b\x03\x93\x01\xb2\xaa\x32\x08\x7d\xe1\x58\x4a\x87\xdd\x32\xfe\xe5\x1f\x26\xa9\x1e\x73\xbb\x32\xfb\xc5\x88\x63\x3f\x31\x95\xbd\xe0\x74\x41\x86\x38\x49\x50\x4a\xa7\x18\x08\xc5\xb0\x36\xf1\xfc\x20\x88\x47\x96\x29\xe9\x5c\x7c\x7e\x77\x74\x04\x27\x65\x67\xcd\xed\x0a\x47\x99\x72\x19\x13\xaa\x5f\xf2\xf9\xf3\x97\x96\x88\x76\x92\x42\x5e\x8a\xa0\x72\xbc\x7b\xe3\x30\xdd\xec\x28\xfc\xc9\xc3\x9d\x0f\x41\x99\x2c\x0b\xc9\x18\xd7\x40\x99\x03\x3f\xba\xe9\x5a\xa8\xc5\x7d\x7f\xda\x36\xd0\x45\x9e\x41\x29\x71\xc7\xca\xb3\x24\x00\xc8\x33\x61\x21\x84\xb7\x7a\x38\x49\xb9\x93\xa3\x58\x7e\x75\x74\x34\x2d\x7d\xc7\xe9\x01\x15\xa7\xd5\x72\x1f\x9d\x36\x3c\x04\xb0\x80\xe6\xa1\xcf\x5b\x0d\x23\x11\x86\x38\xdc\x3f\x7a\x87\x6a\x70\xfe\x98\xb0\xe5\x48\xfb\xa8\x7e\x9b\x79\x3f\x0e\x51\x6c\xeb\x09\x93\x4b\x68\xe6\xe5\xa7\x3b\x90\x3a\x98\x82\x8b\xb2\xd0\x0b\x7f\xd8\x09\xc1\x6f\x3f\x14\x12\x72\x9a\xf1\x79\xee\x9b\xaf\xf1\x51\x59\xfe\x7e\x2a\xae\x74\x04\xff\x93\xf8\x52\xc5\x71\x52\x24\xd5\x80\x1a\x50\x05\x0f\x83\x09\x00\x7c\x3e\x52\xd9\x17\xac\xe5\x41\xf7\x33\xf9\xe3\x36\x9c\x30\x7e\xa5\x0c\xa1\x4a\x47\x3f\x68\x46\xe7\x23\xa7\x29\x17\xa5\x37\x10\x0e\x45\x69\x3a\xbe\x48\xef\x97\x74\x39\x32\xbf\x73\xe3\x03\x98\x2c\xff\x71\x46\xf3\x02\x9a\xfe\x5e\x65\x38\x0f\xd3\x55\x04\x24\x41\xe6\x98\x09\x4c\x18\x26\xd0\x7c\x8c\xdb\x15\x3f\xd6\x8d\x12\x5f\x74\xc8\x01\x43\x08\x39\x86\xe4\xae\x27\x7c\xec\x1b\x92\x3f\xb8\x18\x0f\x86\xc8\x0f\x1c\x2a\xad\x84\xc6\x9c\x2b\x56\xbe\x72\xfc\xef\x0c\x43\xdc\x50\x2b\xe1\x25\xab\xa7\xdc\xfe\xe7\x1d\x9f\xd3\x47\x99\x33\xd5\x51\x2c\xab\xb9\xae\x2e\x93\xaf\x45\xaa\x7e\x18\x9e\x58\x31\xe6\xcc\x77\xa4\xb2\x28\x17\x6d\xd8\x34\x4f\x8d\xba\x49\x1a\x5c\x82\xa7\x39\x96\x34\xad\x53\x62\xc6\xb4\xd8\x74\x37\xf2\x9c\x65\x4d\x68\xfd\xc2\x6b\xce\xe7\x4a\x3a\x68\xf0\x71\x6a\x14\x53\x66\xa8\x3e\x0e\x24\x88\x1b\xe3\x52\x34\x2e\xe8\x26\x80\x98\xd3\xc3\x02\x0e\xbb\xe9\xee\x24\x1f\x23\xce\x7d\xd4\x7e\x4b\xe2\x3a\xf7\xa7\x6a\x38\x58\xd9\xfa\xfc\x6a\x14\x4b\x9b\x28\x2b\xc2\x62\x99\x15\xe8\xa9\x80\x9b\x34\xf8\x6e\x14\xe2\xd4\x86\xbc\x2c\x98\xd7\xed\x88\x04\x42\xc1\xbc\x43\x7e\xe9\xcd\x07\xa9\xe7\xc0\xab\xc5\xe2\x18\x42\xd5\xcd\xcb\xb2\xe2\xbc\x93\x0e\xf6\xcd\x9a\x42\x7f\x2a\x65\xf2\xf4\x68\x1a\x9c\x0d\xcf\x30\x50\x49\xdb\x81\x69\x44\x14\x05\x4a\xed\xfc\xf7\x3e\x57\x34\xc7\x84\xc3\x42\xa5\x60\x62\xe3\x09\xfa\x79\x3f\xb0\x75\x1f\x79\x28\x26\xf1\xe3\x2d\x4f\x00\xd0\x00\xfd\x93\xf8\x0e\x04\xf2\x8c\x13\xe7\x63\x25\x62\x42\x09\x7e\x73\xaf\xdf\xe7\x9e\x96\x62\xb4\x69\x4b\x7f\x3b\xe6\x8a\x69\x62\x42\x68\x34\xbd\x5f\xb6\x09\x8f\x3e\xd8\xc2\xea\x9e\x27\x57\x10\x5d\x06\xa5\x34\x2a\x4d\x47\xd0\x32\x79\x71\x7f\x79\xa1\x30\xa8\xf8\x3c\xa1\x60\x18\x48\xdf\xb2\x1e\xf3\x8b\x01\x8d\x0e\xbb\xe7\xb7\xa1\x53\x19\x1c\x03\x63\x8b\xb4\x7a\xc3\x1f\xed\x36\xf4\xd9\xa5\xb4\xb8\x0f\x70\x8a\x97\xb9\x29\x84\x53\x8a\xd9\x11\xf4\x21\xb1\xd4\x3c\x61\x78\x4f\x8f\xbb\xec\xe8\x0d\x23\xa0\xb2\xf0\x72\x08\xed\x36\x9b\xe5\x04\x97\xcc\x77\xac\x86\x21\xd8\xbf\xad\x8e\x7e\x7f\x94\xac\xf9\x62\x6b\xcb\xab\x87\x0b\x85\x37\x5b\x0d\x61\x52\x95\x0e\x9f\xc9\x8e\x01\xd9\x34\x45\xd2\xfb\x9a\x5d\x40\x41\x15\x73\x3f\x7e\x68\x96\xe1\xba\x90\x47\x4c\x00\x02\x73\x61\x70\xa6\xc7\x3d\x59\xe2\xab\x06\xc9\x1e\x48\x11\xd0\x8d\x33\x58\xd7\x73\x86\xea\xed\x59\x49\x5e\x91\x78\x22\xd9\x8f\x17\x1a\x19\x6c\xa4\x09\x8c\xa9\x9e\xa5\xa5\x0f\x7d\x4f\x03\x0c\xc3\xc2\xf3\x1c\x01\x85\xdf\xf0\xa7\xaa\xd4\xa1\x48\x78\x98\x31\x4b\x40\xdf\x2f\x23\xac\x72\x18\x57\x8b\x11\x35\x3f\x40\xcd\x81\x52\xe4\x63\x44\x8e\xb1\x31\xba\xc2\x98\xbc\xf3\xa9\x13\xd3\x3e\xbe\x77\x7c\x57\x7f\xd9\x9c\xaf\xe3\xd6\x0e\x54\xf8\x0c\x0f\x14\x02\xf4\x8b\x15\xc0\xc7\xe1\x5b\x98\x4c\x11\x07\x63\x2f\x51\x0c\x4e\x6e\x63\xc9\x9b\xce\x3c\x5e\x88\xd4\x6d\xb6\x66\x70\xdb\xdc\xcb\x5b\xcb\x45\xaf\x71\x7d\x4c\xa1\xa6\x44\xfe\xf3\x1b\xc7\xbf\xcc\x9b\x19\x20\x67\x5e\x0b\xd3\xc9\x9c\x76\x99\x74\x8f\xd2\x45\x2c\x82\x90\x0e\xd0\x33\x52\xad\x12\x1a\x1e\xa5\xb3\x85\x49\x63\xc5\x59\x30\x68\x8a\x7a\x3c\x59\xd3\x84\x71\x9e\xbb\x44\xdd\x9d\xa1\xf5\x8f\x26\x2f\x5e\xb1\x2d\x34\x29\x34\x7e\x06\x94\x96\x4f\x56\x14\xcd\x49\x3c\x24\x0c\xef\xb7\x61\x9e\xd9\x59\x07\x6e\x7b\x8a\xa5\x39\xee\xfb\x79\x06\x58\x8e\xae\x41\x94\xb5\x5f\x83\x57\x1e\xdc\x98\x8b\xa0\x9f\x13\x51\xc4\xde\xa9\xc9\xb2\x32\x45\x81\x79\xac\x9e\x51\x60\xe9\x09\xce\x9f\x49\xb5\xeb\xea\xe7\x45\xdc\xdd\xa0\x84\xf2\x7e\xdc\x19\x84\x7e\x48\x32\x3f\x5e\x3e\x84\x11\x2b\x6c\x8e\x9f\x44\x98\x06\x53\xa0\xfb\x9a\xc0\x61\x16\x89\x12\x99\xc1\x91\xbb\xc3\xdb\x68\xd9\xac\xfa\x6d\x00\x7b\xcb\x9f\xaa\xa5\xf3\x17\xa3\x30\xec\x3c\x9d\xf0\xc4\x6d\x4e\xf2\x6c\xde\x66\xa1\x33\x3c\xb1\xdc\x80\x70\xba\x28\xe5\x2e\x5f\x09\xba\x62\x7e\x92\x11\xb2\x41\x31\x62\xcb\x8a\xc8\xa6\xbb\x0c\x87\xae\x84\x2e\x49\xf1\xfc\xe7\x37\x08\x04\xe8\xc7\xf2\x3c\x61\x11\x01\x74\x05\xdb\x8f\xe6\x23\x10\xbd\x99\xfa\x45\x56\xe1\x16\xe0\x26\x0d\x4d\x4f\x51\x00\x5d\xe0\x00\x67\x4e\x16\x6e\x2d\x74\x90\x96\xbd\x57\x71\x2f\xab\xcb\x86\x27\xae\xfd\xe4\x90\xf1\xe3\x1a\x3f\x0c\x7f\x88\x13\x3e\xa4\x1a\xa2\x21\x74\x8c\x8a\xc8\x20\x18\xdb\x8f\xf1\x4c\xd3\x4d\x1f\x11\xd2\x82\x41\xf3\x3e\xc1\x8b\xce\x65\x6a\x2c\x0f\x3d\x86\x2e\x9b\xb3\x04\xa7\xe7\x11\x7d\xc2\xbf\xcb\x8d\x61\xed\x9d\x86\xba\xa5\xbc\x44\x52\x9e\x9a\xae\x93\x29\x3d\x2c\x99\x67\x9c\xa9\xff\x07\x4c\xb4\x90\xed\xaa\x83\x30\xd4\x06\x09\x40\xac\x70\x51\xa4\xe6\x17\x63\x08\x5c\xa5\x28\xf4\xb1\x2f\xdc\xe5\x05\x30\x0a\x6b\xd2\xa2\x56\xaa\x26\x70\xb4\x0c\x52\x80\xea\x31\x73\xcc\xeb\xda\x8d\x8f\x43\x54\x70\xe1\xcb\xb6\x17\xff\xa4\x1f\xf2\xbe\x74\x56\xe0\xab\x60\x2f\xcc\x01\xd2\xfc\xd9\x8d\xa4\x89\xb5\xd4\xc3\x74\x86\x02\xd4\x69\x61\x2b\x82\x96\x75\xf2\xd0\x87\x92\x45\x82\xa1\x1c\x0d\xbe\xdb\xe2\xbc\x58\xde\x13\xe1\xec\xd7\x76\x06\xd4\x5b\x65\x7c\x50\x34\x79\x70\xce\x88\xe7\x71\x5a\xd2\xcc\xd5\x6f\xa0\xf0\x2b\x53\x4c\x91\x8a\xdb\x96\x06\x52\x10\x32\xfa\x88\x19\xc0\x88\x11\x3b\xb4\x0f\xd8\xa6\x2d\xc9\x47\xf1\x89\x50\x82\x06\x29\x9d\xc3\x3f\xe8\xa4\xc6\x2d\x8d\xe8\xb5\xb8\x95\x92\xd1\xec\x8c\x86\x19\x61\xea\xb3\x9f\x23\xeb\xcc\xe9\x5a\x3b\x6e\xef\x10\x8b\x86\x51\x38\x32\x73\xd4\x30\x11\x10\x4d\x79\x3b\xf2\x01\xa5\x40\x21\x84\x71\x3e\x13\xe5\x8f\xa6\xc2\x89\xd2\x4b\x25\xf7\xfe\x12\xad\xb0\x6c\x3e\xf1\x9d\x16\x24\x39\x8e\xc3\x0c\x50\x9c\x60\x72\xeb\x7d\x33\xb1\x2d\x5d\x7c\xbd\x02\x88\xdf\x4c\x96\x32\xa5\x0b\x00\x20\x0f\xe3\x08\x51\x0b\xb9\xad\x8f\xa7\xbb\x3e\x92\x63\x0c\x4e\x40\xf0\xb8\x0e\x8a\x69\x60\x2f\xfe\xc7\xda\x65\x09\x28\x95\xf8\x77\x5e\x78\x0b\x52\xd9\xb1\x52\x64\xa5\x82\x51\xf8\x1b\x9a\xfe\xed\x63\x78\x5c\x5f\x7d\x10\x0f\xe1\x94\x0e\x6a\x21\x91\xf1\xa5\xb5\x24\x11\x73\xee\xfd\xe3\x3b\x8a\xa2\x70\x71\x2f\x04\xe7\x39\xca\xd7\x2c\xa9\x29\x02\x00\xbb\x5f\x70\x9b\x32\xe3\xab\xd8\xab\xf4\x4a\x17\x81\x54\x17\xe3\x63\xf1\x7a\x03\xf0\x87\x29\xb6\x41\x9c\x7e\x03\xd3\x19\xbd\xa5\xff\xb5\x37\x99\x87\xe7\x46\x17\xa5\xd4\xf5\xbc\xc1\x51\xba\x9b\x63\x21\x66\xba\x18\x45\xa2\x11\x9e\x7b\xfb\x71\x5b\x1f\x40\x3c\x4c\xe6\x81\x83\xaf\x4e\x6a\x90\x72\xa6\xb8\x5b\x80\xe4\x70\x52\x92\x19\x76\x86\x00\x2d\xcf\xd5\x30\x9a\x67\xdd\x40\xb9\x14\x22\x55\x11\xac\xd3\xf9\x5f\x5b\xf0\x59\x9e\xbb\x37\xd6\x15\x3e\x4a\x78\x86\xc1\x68\xe8\x7b\x7a\x50\x7d\x2a\xcf\x77\x41\x7d\x6e\xe1\xe3\xd9\x2c\xcb\x5a\xd5\x97\x1d\x2a\xe1\xdf\x07\xb2\xda\x97\x09\x42\xbb\xac\x5f\xed\x61\x34\xa8\x64\x4e\x33\x8d\x43\x3b\x02\x39\x44\x8d\xe3\xda\xdf\xd4\x39\x14\x30\xe3\x9c\x1b\x5c\x0b\x98\x08\xb3\xc8\xce\xc5\x3e\x5d\xd0\xa0\x6c\xdb\xf8\x79\x3e\xdd\x5b\xc1\xbf\x09\xe3\xf1\xa0\x5e\x92\xb9\x8a\x7e\x54\x70\x6d\x69\x72\xef\xad\xf5\x68\xe3\x4b\xe9\x2d\x66\xbd\x10\xf3\x8d\x0e\x65\x27\xae\x67\xe2\x93\x6e\x12\xc2\xa3\x41\x43\x5f\x0f\x44\xd4\x1e\xcf\xe3\x24\x9d\xcb\xb6\xfc\x9b\xbc\x4d\xb9\x9c\xde\x7a\x9b\x0a\x85\x03\xf9\xe3\x4b\xf1\x13\x1b\x54\xc5\x13\xcd\xb2\x9b\xd9\xb4\xaf\x89\xeb\xf4\xce\x46\x19\xd8\xd9\x40\xa6\x38\xbe\x04\x26\x3e\xe6\xf3\x85\x08\xcd\x10\x73\x4e\xa0\xa8\xfe\x85\xa8\x34\x5c\xf4\x1f\x96\x32\x08\xa7\x50\xd4\x05\x4e\x8c\x22\x7d\x63\x44\x0e\x46\x71\x0e\x8c\x2e\xbe\x73\x32\xac\xd0\x89\x91\x86\x18\x88\xa4\x24\x89\xb4\x9b\x43\xd1\x96\x2a\x9b\xe2\x78\xd4\xb0\x6a\xd0\xc7\xb2\x34\xff\xcb\x5a\x1f\x36\xd1\x9a\xe9\xfd\xd0\x8f\xc4\x7e\xa4\x6f\xf3\x16\x67\x30\xf0\xf6\x71\x6b\xf1\xdd\x19\xa2\x48\x43\xa6\x33\x7b\x50\xb0\xd8\x0b\x9b\x32\x28\xa5\x3c\xdb\x8c\x93\x2a\xc4\x3e\x50\x88\x52\xbb\x2e\x92\x35\xc3\x5b\x9e\xc0\xe6\x9b\x22\xbc\x06\x9f\x2c\x77\xc1\x5f\x09\x1f\xc4\x4c\xea\xc1\xa3\x0c\xe7\x9a\xdd\xd6\x74\x95\x9a\x2c\x71\x12\xa7\x15\x3b\x5e\x2f\x13\xe6\x8d\x2f\x05\x1d\xc3\x54\x34\x7f\xe5\x12\x18\x1f\x13\x9f\xa2\x0a\x4d\xee\x1c\xf3\x6f\xf7\x4f\xde\x1d\x30\x94\x41\xae\xb0\xb6\xbb\x1b\x24\xe3\x73\x8c\x21\x14\xe9\x83\x9d\xd8\x4b\x6c\x4c\x02\x91\x9b\x09\xd2\x03\x1b\x43\x02\xdf\x02\x6d\x87\xc6\xa8\xf3\x18\x4d\x63\x2b\xed\x1b\xf8\x7d\xe8\xc3\xb9\xf6\x9a\x6e\xdf\xa0\xdb\x9a\xc0\x5b\xfb\xb9\x74\x44\x0f\xfd\x80\xbb\x06\xcb\xfe\x8c\x2d\x01\x45\x5a\x18\x26\xfd\x4b\x7d\xfb\x1b\xe2\xcf\xc2\x1e\x34\x38\x3c\x39\xa8\x15\xd7\xd6\x2e\x34\x6e\x6c\x4f\x12\x4a\x45\xfc\x9c\x75\x02\xbf\x5f\x06\x19\x4d\xaf\x1e\xfc\xde\x75\x15\x71\x35\x82\xf4\xbb\xa1\x49\xa4\xff\xa0\x60\x27\x94\xd0\x0e\xf4\x3d\x1a\x88\xbd\xe5\xca\x11\x78\x08\x92\x9f\x61\x8a\x0c\xeb\xf0\x12\x28\xaf\xb6\x01\x83\x0f\x80\x40\x9f\x44\xfd\x86\xf0\x8e\x28\xf1\x55\x9e\x58\xf8\x12\x93\xfb\xc9\xc2\x81\x38\xc2\xda\x12\x0a\x6b\xd5\xf2\x9f\xf5\xfa\x5e\x67\xca\xc3\x6b\x76\xb3\xe2\x8c\x18\xc5\x58\x9a\x57\xca\x46\x02\x9d\x6a\xef\xe0\x97\x45\xfa\x72\x1c\xb8\x7d\x8b\x9e\xd6\xab\xa5\xdf\xa9\x76\x6c\xa2\x3b\xd9\xce\x3a\x38\xbc\xbd\x69\xf0\x6c\x23\x94\xad\x7d\xf6\x22\x42\x4b\xa7\x35\xa8\xc0\x26\xf1\x88\xef\x7b\xa3\xa3\x32\xa7\x89\x5d\xa4\xda\x52\xb7\xe6\x62\x83\xce\x2c\x66\x2b\x7f\xe8\xc4\xbc\x68\x43\x7c\x58\x9f\x36\x47\x60\xac\x7a\x2f\xab\x08\x69\x41\x9e\x01\x95\x5a\x16\xed\xbe\x7b\xa3\xac\x1f\x78\xc5\x58\xca\xc8\x01\x55\x42\xad\xcd\x24\x4d\xdd\xe7\x37\x9b\xc6\x16\x20\x11\xa3\x9e\x3a\x18\xf5\xa7\x7b\x25\xf6\xe3\x14\xa8\x84\x27\xdd\x5c\x15\x98\x78\x12\x39\x34\xbf\x84\x6a\x8e\x04\x3d\xc8\x92\x53\x1a\x6b\x8f\x22\xc9\x3c\x7b\x4f\x72\x86\xab\x48\x27\x42\x2b\xad\xf1\x86\x6d\xad\xf4\x6e\x79\xd3\xc0\x39\x3f\xe7\x9c\xd7\xdb\x01\xb2\xab\xb6\xde\x4a\xe8\xb6\x3e\x48\xb4\xa7\xd9\xab\xb9\xa6\x0f\xe7\xbe\xe3\xf5\xc5\x01\xfe\xf5\xe8\xf8\x18\x89\x10\xf2\x1e\x50\x39\xb4\xbb\x53\xdb\x12\x64\x60\x5d\x25\xc9\x7f\x6c\x56\x10\x4a\x63\x73\x35\xa0\x77\xb1\xa5\x70\x92\x13\xb6\x66\x47\x10\xec\xb7\x96\x4a\xa0\x8f\xfd\xe3\x78\x9d\x6c\x0f\x0c\x4f\x9b\x21\x66\xdf\x26\x74\x36\x52\x27\x87\x83\x49\x47\x8b\xde\x78\xc2\x5a\x6e\x6d\x7e\x60\x25\x6f\x75\x06\x00\xbc\xe1\x4e\xe7\x66\x95\xc7\x0a\x23\x0d\x92\xd6\x82\x54\xcb\x2e\xb9\x37\xd3\xa2\xcc\x73\x12\x6c\xab\xe2\x74\xb3\xf2\xfc\x2d\xd7\xb4\x48\x4d\x4d\xef\xb5\xe6\x77\x9a\x3c\x99\xdf\x58\x17\xe7\x5c\xf9\x5a\x0a\x6b\xc9\x50\x78\x43\x61\x00\xe7\xed\xbf\xfb\x38\x6a\xdf\xf7\xc3\x3e\x0e\x82\x3e\x0e\xfc\x7e\x4e\xc2\x9e\x28\x42\x7c\xa9\xd9\x99\x93\xe8\xd2\xcc\x56\xf9\xb1\x04\xaf\x37\xef\xee\x3d\x17\x8d\x66\x2f\xb6\xb8\x49\xb3\x9d\xee\x0d\x4b\x27\xe4\x9e\x06\x58\xd1\x5a\x73\x7c\x7b\xc6\xee\xe2\x1f\x7b\x76\x40\x99\x4d\x19\xd1\xd3\x00\xd9\x79\xcf\xff\xea\xbe\xef\xfb\xae\xef\xc7\x41\xbc\x8a\x91\xca\xa6\xab\x83\x40\xd2\xb1\x42\xf3\x9a\x34\x93\xc2\x41\xe7\xc2\x55\xa7\x0a\x28\xfa\x48\xb9\xaa\xd2\x6e\xfe\xab\x93\x4c\xf1\x66\x87\x24\xf2\x2f\xd2\xc0\x7b\xb0\xd5\x5f\x05\xa6\x41\x09\x80\xda\x3f\xd4\x58\xcd\xb8\xa9\x44\x68\x71\x9e\x94\xe0\xc4\xba\x44\x0f\xbf\x6d\x55\x60\xc6\x9e\x1e\x89\xfb\x00\x11\x07\x8a\xdf\x25\xba\xe8\xa5\xae\xf5\x64\x94\x91\x9e\x9c\x25\x05\xf6\x7a\x45\x57\x85\x0f\xe6\x4e\xb6\x9e\xdc\xde\x90\x0b\x30\x23\xf0\x99\x2f\x6a\x8f\x92\x71\x2b\x43\xf2\x6b\xfe\x86\x54\x29\x09\x3b\x29\xce\x31\x29\xcd\x7e\xb1\x15\x55\x67\xea\x5c\xca\x51\x2b\x44\x3c\x97\xf0\x8e\xfd\x11\x42\xfa\x13\x72\x9e\xc7\x55\x09\x37\xec\x4b\x92\xe5\xc8\xf2\x45\xe9\xba\xae\x7e\x65\x3b\xd8\x3d\xc1\xb0\x14\xaa\x7d\xfa\xf5\x9c\x38\xbc\x03\x0d\xef\x4a\xfe\x47\xd2\x6a\x9a\x79\xa8\xb7\xbc\x4d\xe9\x67\x3d\xbf\x2d\x1a\xe4\x26\x19\xe6\x2d\xfd\xdd\x53\xfc\xbb\xbb\x54\xb8\x9d\x1c\x17\xba\x0b\x4e\xda\x2c\x6e\xb4\xb4\xcb\xd4\xa9\x54\xf1\x50\x22\xb8\xfe\xfa\xf2\x53\xc9\x8c\x18\xb4\xac\xca\xbd\x51\xc7\x1b\x37\x19\xed\x9e\x18\xda\x1d\x1b\x9a\x10\x88\xc7\xff\xbb\x93\x4c\x10\xac\x3d\x7c\x93\xae\x33\x32\x0b\x63\x82\x0d\xa3\x6f\x3d\x0e\xaf\xe1\xfc\xea\xf3\x6d\xa1\x03\x89\xee\x13\x69\x0c\xf3\x92\xfc\x49\xa6\x99\x96\x67\x5b\x35\xb5\xde\x54\xe6\x67\x20\xe0\xf3\xbd\x2a\x01\xa8\x0b\x39\xfc\x5b\x99\xf5\xa1\x4f\x45\xa1\x4f\xf5\x81\x77\xd5\x71\xf1\xe0\xeb\xb3\x83\xd0\x9f\x15\xad\xe5\x1f\x10\x19\x27\x9a\x66\xe8\xa4\xaf\xac\x40\x9f\x56\x09\x9b\x8c\x96\x1a\xcf\x3b\xc3\xa0\xc7\xa4\xc2\xc2\x0d\x8e\x87\x2e\x50\x2d\xb4\x53\x66\x50\xfb\xb9\x0a\x9c\x29\x5a\x7b\x45\xa6\xc7\x81\xca\x6f\x6e\x60\x51\xc1\x5b\x5b\x8b\x5b\xb9\xeb\xf5\xd2\xa3\xbd\xd9\xab\xb7\xd1\xad\xb9\xc2\xad\xb5\x11\xaa\xf3\xaa\x87\xec\x7f\x1a\x4a\x87\x8c\xaf\xf5\xce\xf6\x24\x56\x0b\xbf\xb7\xe7\x7f\xed\xc8\xfb\xb2\x7f\x32\xb5\x69\x50\x6a\xaf\xf1\x6e\x94\xf2\x6a\xaf\xfa\xd0\x06\x6d\x94\x8a\x39\xdc\xe1\xe2\x42\x29\x2d\x4f\xa5\x33\x77\x70\x7a\x19\xc1\xea\x93\x4c\x36\x96\xa2\x28\x62\x6d\xa9\xb2\x61\x11\xa3\xbe\x3e\xbc\xd3\x3e\x12\x56\xff\x0a\xe9\xef\xfe\x53\xff\x91\x0e\xc4\x90\x0e\xf1\x92\x0c\xf3\x3a\x93\x45\x3f\x27\xc1\x84\x59\x7f\xbb\x0a\x2a\xdb\x3b\x42\xe2\x21\xfe\xb7\x4b\xfe\xfe\xce\x49\x71\xa6\x14\x03\x39\xf1\xfa\xe5\x61\x32\x37\xbc\x26\xd6\x83\xd5\xc7\x5a\xca\xb8\x36\x1a\x88\x3f\x22\x54\xc3\xf5\xbb\x51\x45\xa6\x0a\xe4\x31\x2f\xc0\x8c\x66\xa5\x59\x8e\x20\x2d\x82\x07\x0a\x1c\xe2\xd1\xf5\xf1\xed\x5a\xd9\x09\x09\x24\xdb\xc3\x42\xb4\xa4\x6a\xa8\xd7\x18\x94\x29\x45\x31\x2e\x03\x4c\x73\x6c\xb7\xd1\x74\xe0\x5d\x76\xbc\x2f\xff\x78\x0d\x8d\x3b\xdf\x5a\x26\xd5\xe6\x31\x6b\x16\xd1\x2d\x8f\xff\xdc\xba\xeb\xbd\x09\x1a\x6f\xd1\xa0\x54\x29\xca\x56\x89\xc2\xfd\xc5\xb4\x7e\x4d\xd0\x8e\x91\xce\x1e\x33\x68\x48\xc8\xc2\xf1\x77\x0a\x6c\xb3\xed\xf3\x41\x6a\x7f\x5a\xb9\x2a\x3f\x19\x4d\xf8\x1e\x74\xc5\x96\x77\xe1\x53\x3d\xda\xaa\xbd\xda\xaa\x01\x73\x72\xbf\xb6\xe7\xff\xad\x86\xf5\x68\xad\xe9\x22\x8c\x19\x22\xcc\xe7\xd2\xf8\xdc\x82\xf5\xc2\x3f\x60\x5b\x31\x6d\xf4\x77\x05\x35\x8d\xd4\x19\x53\x65\xfc\x7c\xaa\x78\xa8\x10\x22\xbf\x32\x08\x4e\xe9\x35\xf5\xd0\x83\xab\x0f\xc8\x59\xa2\xca\x9d\x15\xda\x48\xa7\xe1\x62\x66\x84\x90\x44\xbe\xeb\x03\x91\xc8\x30\x23\x7a\x75\xf9\xed\xd4\x52\xc4\x77\x02\xe0\xf4\x01\x86\xea\xb2\x11\xcd\x15\x10\xcd\xf5\x50\xbd\x8d\x10\x24\x17\xbd\xd4\x74\x9d\x75\x56\x9c\x6e\x53\x3e\x95\xfc\x94\x23\x28\x4f\xec\x70\x3b\x82\x62\x88\x7e\x5e\x11\xe2\x82\xcc\xdb\x11\xeb\x8b\xc6\xe4\x57\xbe\x1c\x23\xa0\x98\xbb\xc2\x30\x8a\x19\x6b\x03\xb4\xa3\xea\x93\x78\x44\xdc\x8c\x15\x7c\xab\x69\xa4\xf6\xd2\xff\x3a\x70\x6e\x7e\x4b\xce\xea\x64\x9f\xef\x57\xa7\xfc\xcd\x47\x9a\xa0\xf9\x56\xa0\x69\x7c\x60\xe9\xe2\x47\x65\x7f\x55\x02\x77\xa7\xdb\xe9\x2a\x44\x76\x76\x85\xa5\x60\x69\x80\xa5\xfb\x82\xe6\x7b\x84\x22\x7b\x84\xea\x5d\xfc\xb3\x0d\x35\xe5\x22\x9e\x85\x73\xd1\x86\x73\xd1\x81\x96\xf2\x6c\x69\xf0\x27\x92\x61\x5e\x11\x68\x3c\x3b\x42\x2f\x4f\x6f\xd1\xdd\xc0\x57\x06\x1a\x12\xc2\xaf\x15\x7e\x2f\xcd\x40\x6f\x36\x98\x35\x82\x84\x34\x28\xaa\xec\xaa\x5c\x9f\x61\x3e\xd2\x0c\x4d\xab\x1b\xeb\xf1\x48\xb5\xa5\x81\xca\xd0\x94\x2c\xc1\x1a\x74\xd5\x2f\xe0\x9e\x60\x4d\x90\x1d\xba\x70\x23\xcd\x17\x38\x09\xfc\x75\x21\x93\x81\x6d\x94\xf5\xff\x4e\x24\xa2\x00\xb0\x9d\x87\x3d\x59\x74\xf3\xfb\xd0\x43\xe8\xe0\x70\x61\x86\x4f\xd4\x3b\x29\x32\xc7\xa3\x8f\x30\xe9\x1b\x67\x77\x74\x06\xb9\x0c\x2c\x11\x8a\xdb\x77\x4a\x7f\xc4\xae\x07\x6f\x6a\x0e\xae\x9f\xbe\xbd\xd9\x85\x1c\x81\xe1\x50\xac\xff\x6b\x3c\x35\x67\x2f\xe5\x63\x8a\xa4\xe2\x1d\x26\x63\xc3\x0d\xd1\x5c\x39\x8a\xf1\x26\x92\x3d\x18\xb0\xe2\x98\x42\x47\x83\x0f\x22\x34\x48\x74\x74\xf7\xc1\x9d\x0f\x43\x09\x65\x61\xef\x7a\xcd\xd5\x1f\x2c\x7f\x18\xd9\x9c\x1e\xa7\x9b\xe5\x9d\x64\x12\x74\x0d\xd0\x7d\xf5\x84\xd2\xda\x03\x52\x6f\x70\x70\x1e\x02\x3e\x53\x8f\x62\xd7\x1f\x61\xb4\x48\x17\xe7\x5b\x30\xc9\xdf\xf1\x2e\xd5\x87\x9e\xdd\x8e\x90\xdd\x8e\x30\x67\xac\x0c\x57\x12\x6a\xf6\x60\xcd\x5d\x1b\x49\xfe\x35\x5e\xfd\x0d\x6f\x5d\x93\x63\x5f\x48\x53\x71\x4e\x17\x38\xb5\x6b\x05\xce\x85\x0e\x34\xd2\x6c\x4c\xbf\x7d\xa7\x93\x31\x89\x15\xb7\x0f\x16\x71\xb6\x65\x1b\x42\x40\x07\xe4\xd9\x90\xf5\x9c\x10\x1c\x1a\x8c\xc8\xe1\xa6\xc3\x49\x7c\x16\xa5\x21\x4f\x1a\xc4\xc5\x9d\xfb\xad\xc6\x4c\x7e\x51\xb2\xc3\xfe\x0c\x30\x92\x09\x82\x66\x69\x3f\x1a\x3a\xf7\x97\x0f\x90\x3e\x2d\x01\x2a\x3b\x9c\x4b\x76\x43\x2f\x17\xb3\x08\x53\xfa\xe8\xb6\x6a\x16\x13\x5c\x4f\x28\xce\xf6\x47\x58\x08\x7a\x48\x7d\x09\xfc\x37\xa3\xb5\x97\x86\x81\x85\xe4\x61\xbe\x87\xa5\xc9\xe8\xd0\x48\x1c\xe5\xf8\x30\x07\x84\xe1\x07\xd8\x31\x95\xc8\x4e\x89\x2e\xf3\x0c\x48\xfe\x9e\x04\xf9\x98\xa0\xfd\x1c\x05\xf5\x14\xff\xec\x2e\xf9\x25\xcb\xbc\x38\xdd\xa2\xb4\x52\xc4\xb3\xa4\xc9\x50\x03\x6e\x70\xf0\x6e\x96\x21\x42\x5e\x99\x49\x2d\x59\x37\xc3\xed\xa3\xb2\x08\xd0\x01\x91\xdb\x55\xa2\x9b\x3a\x78\xc1\x4b\x8a\xf4\xd9\xa9\x00\xb9\x2a\x26\xfc\xad\x2e\x97\xbc\x6e\x7e\xa0\x6e\x47\x18\xcc\x81\xed\x01\x15\x2f\x76\x4c\xd4\xce\xe8\x23\xb9\x33\xca\x4a\x06\x95\x26\x76\xe2\xb8\xf6\x53\x6f\xb6\xf0\x06\x84\x7c\xa2\xdc\xfc\xa5\x3b\x4a\xe1\xd8\x40\xc3\x91\x25\xb0\x10\xc8\x4f\x2b\xb7\x32\xbd\x28\x30\x1b\x26\xf3\xd9\x26\xfd\x0f\x9d\x68\xea\xc7\x5b\x37\x28\x59\x92\x71\x26\xb3\x4a\x6a\xd9\x58\xee\xe6\x25\x31\x4e\x0c\x5b\x92\xa0\x9f\x03\x07\x77\x8a\x35\x79\xb3\xf0\x7b\x67\x01\x54\x86\xa7\x8c\x30\x6a\x80\xe8\x16\x5d\x80\x15\xfe\xd7\xe6\x86\x82\x52\x71\xaa\xa9\x53\x24\x33\xe7\x67\x06\x4c\x12\xa8\x2f\x3c\xb5\x6b\x56\x40\xe7\x0d\x8b\x28\x8c\x3d\x6a\xf2\x0c\x54\xcf\xc9\x87\xfb\x03\xd3\xa3\xf2\x9c\xf3\x0a\x17\x12\xb6\x84\x4a\x52\xab\x01\xba\xf7\x24\x1a\x75\xfe\xdb\x40\x69\x07\xc4\x0a\xd1\xdd\x20\xd5\x51\x98\xfc\x61\xc7\xcf\x3a\x8b\xa6\xd2\xd9\x69\xe7\xbe\x7c\x4d\x93\x85\x81\x97\x7a\xbc\x9d\x1f\x6a\x77\x3d\xc4\x78\x8b\xdd\xd9\x1e\x53\x50\x8e\xbe\xfd\xab\xfa\x4b\x71\x62\x96\xad\x02\xf7\xb1\x04\xff\x7b\xfb\xd5\x49\x5d\x74\x69\x76\xed\xad\x51\x7c\x9c\x9a\x27\xca\xd4\x30\x95\x17\x6b\xb4\xc4\x06\xb2\xa7\x7e\x94\x2c\xca\xb7\xf7\x9c\x86\x7b\x44\xfa\x4e\xe5\x78\x8c\xc5\x78\x97\x21\x67\x6c\xa6\xcf\x87\xfb\x7c\x1c\xcf\x66\x7d\x51\x90\xdb\x5b\x73\xc4\x16\x42\x7d\x15\x4f\x70\x3d\xf5\xba\x82\xfd\xce\xa9\x53\x73\x77\x48\x7c\xb6\x2a\xe7\x3f\x93\x9c\xee\xc3\x82\xb8\xcc\xcb\xe1\x0a\x79\xb4\x13\x74\x92\xe4\xd1\xf6\x40\x04\x40\xc6\xca\x1e\xce\xc3\x87\xaf\x68\xd0\x71\x74\xff\x44\xa4\x68\x91\x15\xfd\xad\xb4\xba\xdb\x88\xb9\x04\x9a\x3f\x6c\x00\xd0\x62\x56\x58\xcd\xd8\x32\x94\x7e\x1e\x66\xf0\x67\x55\x2e\x20\x44\x0b\xf6\xbd\xdc\x59\x9c\xc9\x1b\x54\x59\x05\x9e\x60\xa5\xe7\xd1\xa6\x8c\x85\xbe\x36\x93\xe3\xcc\x50\x47\xc2\x66\x2e\x92\x22\x2c\x87\x15\xd8\x73\x12\xf4\xee\xad\x14\xb7\x0e\x31\xd9\x03\x20\xb1\xeb\x9f\x76\xb4\xc8\x32\x23\xe9\xa3\xc0\x0b\x71\xac\x21\xd0\x76\xbd\xec\x78\x6b\xdf\xa0\xe0\x7b\x33\x26\x9c\x41\x20\x3b\xc3\xc5\x1c\x31\x4a\x37\x5f\x8c\xb5\x54\x96\xea\x51\xca\xad\x2f\xca\x5d\x16\x2a\x41\xb7\xf4\x47\x97\x46\x3b\x91\x46\x3b\xa6\x3b\xda\x06\x97\xa2\x38\xf8\x62\xb4\x1b\x9a\x9a\x76\xe7\x0b\xce\x40\x0a\xbe\xc6\x91\x96\x76\x8e\x37\xba\xaf\x49\x11\x9a\x83\xb9\xd6\x20\x44\xa6\xd2\x12\xbe\xec\xe4\x9f\x58\xba\x23\x14\x23\xf2\x1b\x66\x0e\x61\x4f\xce\xf2\x68\xac\x0b\x59\x95\x18\xc5\x40\x50\xee\x9e\x10\xb5\xa3\xcf\xd6\xca\x8a\xf8\x53\xb5\xf6\xcd\x6c\x06\x15\xf9\x4f\x56\xfa\xc3\xdc\x44\xb5\x90\x7f\xbb\xe1\x07\x2e\x73\x9b\xa9\xfc\x61\x16\xd4\x18\xdd\xba\xba\xba\x43\x44\x48\xa6\x74\x4b\x82\x5e\xb0\xd4\xb0\xe6\x25\x1e\xcc\xb7\xc0\xca\x13\xcb\x1f\x5d\x27\x21\xcc\x57\x9e\x25\x50\xfb\x87\xc8\x4f\xae\xd9\x7f\x85\x04\xff\x06\x2c\x18\xf9\xa1\x90\x5e\xa4\x37\x5b\xc6\x10\x24\x5b\x92\xd5\xf9\x02\xe7\x2b\xe3\x4f\x59\x9c\x62\xd7\x9a\x08\xcd\x24\xf7\x91\x7a\x89\x2e\xf2\x76\x85\x77\xe6\xa3\x3e\x3d\x34\xce\x92\x25\xd4\xcc\x43\x94\xfe\x0e\x15\x8d\xf6\x0c\xde\x3b\xae\x3d\xc6\x7c\xc0\x03\x9c\x3c\x95\x3e\x6c\x7f\x6a\xb0\xcc\x5b\x03\x91\x9d\x08\xe1\x7a\x8f\x66\xd6\xb7\xfa\xe2\x40\xe5\x87\x3d\x58\x67\xd7\xcf\xc3\x6f\x1f\x1f\xe1\x61\x8a\x3b\x4a\xe6\x98\xb9\x61\xdf\xce\x49\x41\xf1\xf6\x35\x57\x96\x4b\xe0\xd9\xfa\x50\x6c\x1f\x7c\x48\x44\x30\x1a\xb0\x4b\x4c\xa9\x93\xe5\x1e\x46\x73\x52\xd9\xa0\x52\xd9\x54\x5f\x3a\x2b\x67\xba\x04\x6f\xc7\x4d\x3e\xff\x21\x80\xf6\xfd\x54\xdf\xf2\x2f\x76\xd7\x82\x52\xe3\x06\x00\x9c\xe5\x71\x95\x57\x4d\xc2\xb4\x08\xd6\xf2\xb5\x64\x56\x92\x01\x20\x29\x87\xb3\x1c\x21\xb2\x25\x99\x53\xa1\x1e\xfd\xd8\xa0\x80\x8a\x05\x50\x00\x86\x2a\xf8\x37\x21\xc6\x0c\x00\xa3\xdf\x4b\x6e\x2f\xa5\x4b\x5a\xef\xaf\xa7\xc0\x14\x02\x8a\x84\x1b\x28\x7d\x02\xeb\xfa\x49\x77\x49\x45\xa7\x63\xb3\x38\x54\xf0\x2c\xa0\xd6\xe7\xb7\xb3\x49\x6c\xa8\x15\x9a\xfd\xf8\xf6\x4b\xd2\xa0\xd0\x82\xe8\x28\x35\x51\xf5\x57\x1a\xfb\x4d\x23\x9f\xa0\x3d\x00\xef\x60\x67\x50\xa9\xc9\xf8\xb8\xa6\x26\xfb\x10\xd9\xb9\x22\x10\x95\x9f\xe1\xf3\x2d\xc6\xe0\xc0\x1e\x79\x66\xa0\xd1\x2d\xbd\xd8\xb8\x63\x13\x2e\xe9\x3c\x05\xe5\x29\x5e\x30\x05\x35\x56\x5d\x85\x12\xf2\x4b\x21\x4f\x04\x90\xd5\x53\xf9\x75\x65\x2a\xc9\xa1\x4d\xd7\xc0\xb0\x3a\x30\x24\x03\x01\xf7\x80\x99\xf3\x03\xab\x9f\xf9\xc5\x7e\x22\x5f\xbf\xda\x43\x6f\x2e\x43\x96\x3b\xac\x08\xbc\x5e\xaa\xad\xc9\x12\x27\xb2\x5d\x60\x6c\x09\x42\x3a\x7b\x5d\xbb\x1b\x4d\xed\x08\x23\x3d\xb1\x3c\x54\x67\x24\x41\xa5\x34\x4b\xba\x4a\xf8\xb4\x07\x46\xed\x18\x9d\xa9\xdf\x03\x2b\x8f\x4e\x35\xbe\x48\x9f\x5d\x26\x43\x09\x01\xd1\xc5\x30\x19\xf1\x5c\x47\xe6\xfa\x86\x89\xfd\xed\x86\xe8\xfe\x66\xa1\xc0\x60\x3c\xcd\x7f\x75\xf7\xcf\x35\x8a\x23\xc4\xb3\x5b\xba\x84\x47\x7b\xb5\xd1\x8d\xeb\x48\x59\xbc\x9b\xc4\x2c\xf2\x8c\x76\xf7\x8b\x65\x66\xfb\x10\x86\x5b\xcb\xd0\xfe\xab\x2a\x6b\x11\xff\x9d\xbb\x78\xb6\x60\x33\x10\xc8\x7b\x7a\x6a\x30\x72\x74\xe7\xb6\x47\xf3\xd9\x25\x80\xd8\x32\x95\x78\x5f\x14\x46\x24\xe8\x7c\x60\x64\xf0\x47\x51\x4c\xe9\xfb\x5e\xef\x20\x34\x66\x7b\xfe\xd7\x43\x74\x97\x83\x37\x55\x79\xce\xf5\xed\x88\xfc\xd5\x5e\x6d\x31\x43\xe2\x81\x67\x15\x87\xcc\xf3\x0c\x57\x82\x3e\xb0\x74\x87\xe8\x47\xdb\x56\xe5\x19\xec\x96\x28\xcf\x10\x26\x7e\xbf\x7a\x8a\x09\x1a\x4a\xf5\x81\x38\xb0\x6d\xf5\x91\x6c\x94\x1d\x36\x58\x57\x5b\xc0\x17\xe5\xd9\xca\x7f\x20\x22\x3b\x5e\x57\x52\x28\x95\x1f\xd8\x9d\x85\xdf\xad\x9f\xbd\xf6\xec\x6f\xc3\x11\x6e\x2d\x14\x9f\x5a\xea\x9c\x72\x98\x07\x8d\x6d\xf2\x03\xb3\x0a\xf3\xe7\x48\x19\x53\x1c\xc2\x80\xb1\xbe\xac\xeb\xf2\x87\x1e\xea\x0f\xa6\x16\x98\xaa\x73\xf1\xd1\xb2\x5f\xb3\x05\x18\x78\x20\x47\xb1\xb5\x64\x9b\x51\x12\x3a\xa4\x28\x3a\x3c\x6e\x59\x3f\x23\x49\x40\xe4\x49\x64\xe5\xd8\x31\x0b\x92\x36\x77\x76\x24\x03\xaf\xfa\x55\x60\x28\xe2\xfd\xed\xd3\x38\x91\x28\x3a\x9c\xec\x3c\x2e\x50\x05\x7a\x13\xe2\x32\xe4\xa7\x58\x17\xb2\x65\x89\x03\xc3\xa5\xc8\xde\x4b\xe8\x09\x05\x33\x6c\x5e\x36\x66\x75\x3f\x9e\x9d\xee\x9f\x6f\x85\xfa\x43\x2c\x48\x71\x38\x7c\xa9\x6b\x23\xc5\xd5\xa6\xe0\xca\x28\x0f\xeb\x93\xc3\x01\xf3\xc5\x0f\x20\xcc\x4a\x36\x9e\xda\x4e\xfc\x25\x85\xc0\xff\x3a\x96\x79\x63\x09\x6d\xbe\x38\xe6\xee\x98\xdf\xdc\xa9\x3b\xa5\x4b\xc0\x7a\x7e\x5f\xe2\x3c\x54\xd1\xb9\xb9\xbf\xdc\x55\xc9\x82\xc7\x7d\xac\x91\x9f\x09\x7a\xe3\x20\x10\xa8\xcc\x3a\xf7\x4e\xd4\xe2\xe3\x48\x43\xa5\x8e\x16\x07\x21\x9b\x6d\xb0\xaf\x89\x85\x67\xba\xe8\xc6\xdb\xa0\x90\x85\x38\xfa\xe6\xc7\xba\x7e\x13\x79\xa8\x0e\x92\x85\x3d\xbe\x28\xcd\xa8\xdf\x59\x2a\xda\xda\x5f\x28\x0f\xeb\xa1\xe7\xb1\x8f\x8c\x69\x86\xc8\x3f\x92\xac\xee\x43\xfc\x73\xbd\x27\x17\xec\xcc\xc0\xa4\x31\x3f\x30\x13\xc3\xc8\x59\x41\xf7\x36\x10\x5a\xbf\x25\x68\x88\xe7\xf7\x9d\x81\xfa\xae\xbe\x43\xaf\x97\x12\x6d\x78\x27\x4e\x60\x4c\x2d\x43\x85\x4a\x92\x8d\xf9\xdd\xa8\xbf\xe0\x65\x40\x65\x4f\x4c\x89\x58\xd3\xf9\xef\x86\x2b\x3c\xa2\xf6\x95\xa0\x49\x78\xe7\x5d\xa2\xf1\xba\x57\xa3\x4c\x32\x08\x0c\xd6\xfa\xb2\xbe\xef\xfb\x79\x98\x63\x97\x69\xbc\x48\xc2\xe4\x68\xaa\x6f\xc6\xef\xd2\x29\x1e\x7a\xc3\x84\x96\x77\x76\x46\x7e\x1e\xc2\x7a\x40\x57\xd0\x96\x91\x45\x1b\xf1\xf5\xb5\x84\x3e\xe0\xf4\x28\x1c\xe8\xf8\xa9\xad\xca\xd3\x44\x68\x83\x6f\xb8\x68\xe1\x10\x1c\x62\xd4\x5b\x63\xfa\xef\x7c\xc9\x2a\xf3\x9b\xbf\x9c\xd6\x05\x13\xbe\x0c\xb6\x71\xb5\x48\x1e\x86\x07\x79\x8c\x14\xe3\xfc\x09\x3b\xf0\x7b\xd9\x1b\x7f\x84\xfc\xa8\xcd\x7b\xe0\xe0\x62\x8b\x79\xfe\xfd\x36\x74\x64\xd8\x6e\x1c\x3c\xd9\xf1\xfb\x28\xd3\x7e\xef\xbc\x30\xbf\x8a\x59\xdc\x47\xc8\xba\x4b\x02\x51\x2f\x60\x0b\x05\x40\x07\x7f\x39\x5a\x5d\x1e\x1e\x72\xf0\xcb\x66\xb7\x0f\x9a\x1c\x26\x26\x05\xcf\x7b\x11\x7c\xeb\x08\x3f\x2a\x3f\xd5\x7e\xba\x32\xe5\xb7\x42\xc1\xb2\x2e\xdf\xdd\xcc\x90\xd8\x4c\x7e\x36\x99\xcc\x63\x52\x42\x78\xfa\x0a\xb7\x66\x8f\x07\xee\x12\x13\xac\x70\x00\xbb\x21\xf5\x94\x46\x4e\xa0\x9d\x31\x53\x54\x92\x2a\x01\xe8\x06\x49\xbd\xc6\x0f\x39\xe5\x09\x2f\x4b\x54\xbc\xa3\xcc\x89\x51\x14\x23\x52\xfa\x18\xba\x35\x30\x5b\x89\xc6\x77\x94\xca\x11\x95\xf8\x49\x99\x21\xd6\x96\xc4\xca\xc6\xe0\x6a\x51\x04\x3a\x06\x66\x4a\xe7\x57\x50\x95\x29\x33\x0f\x00\xcb\xbf\x5e\xf1\x65\xa9\x66\x9a\x4b\x4c\x0a\xfe\xfd\x9c\xd5\xd4\xac\xc6\xb3\x44\xe6\x80\x4d\xbe\x5a\x9c\x62\x5d\xcb\x6b\x97\x9b\x56\xce\xc3\xbf\xc8\x14\xc9\x9b\xa8\xd5\x95\xa6\xa2\xcc\xf9\xbd\x8b\xf0\x9b\xed\xa1\xac\x22\xb8\x94\x44\xa6\x4b\x9a\xf6\x23\xe3\xe5\xf7\x5a\xbe\xcd\x1d\x6d\xa5\xe9\x5e\x93\x63\x61\xc9\xbe\x6c\x43\x02\x95\x29\xa0\xd9\x0f\xd9\x42\xbb\x39\xea\x63\x9e\x4c\x70\xa2\x8b\xad\x4d\x31\xb4\xf6\xe3\x37\x9d\xbb\x6a\xad\x30\xe9\xf2\x9a\xb4\xdb\xf2\xbf\x39\xca\x64\x57\x6e\x6d\xdf\x13\xa3\xea\x29\xf9\x1d\x6e\x7c\xd9\xbf\x42\xba\xf8\x17\xc7\x2e\xc8\x7c\xa3\x21\xde\x5f\x9c\xb6\x2b\x02\x5f\x8c\x6d\x17\xdd\x1f\xf2\x1b\x1c\xf1\x2e\x8e\x79\xc1\xa1\xec\x70\xa5\x2e\xd1\xc5\x25\x69\x26\x4f\xab\x0e\xeb\x31\xda\x9f\xab\x8f\x6c\x65\xfd\xfe\x6a\x33\xb9\xbb\x72\x07\x85\x3d\x61\xab\x29\xa3\x04\x2a\xdd\x9f\xc4\xf3\xfb\x5c\xfe\xd7\xf6\xca\xa6\xf7\xec\x09\x4f\xf2\x42\x8d\xb2\x8c\xff\x7c\xab\xe5\x8b\x90\x4c\x01\xa1\x26\xaa\xf2\xf7\x5c\x7e\xa0\xf0\x41\x91\x26\x98\x47\x93\x40\x20\x28\xff\x8c\xa8\x87\x85\x1b\xa2\x0d\x77\x86\x66\xb4\xb1\xd2\x4a\x4d\x6b\xf5\xfb\xcc\x9a\x1e\x77\x07\xd6\x95\x9f\x23\x54\x89\x66\x73\x0b\x39\x39\xe6\x25\xc2\x6e\xba\x9e\x88\x62\x76\x9a\x69\x91\x60\x86\xe9\x2b\xae\x17\x91\xae\x69\x08\x28\x37\x4d\xb2\x7b\xa2\xf4\xf1\xa2\x67\x07\x50\xa8\xfd\x9c\x49\xff\x49\xf7\x11\x4f\x4f\x33\xcf\x97\x5d\x46\x3f\x31\x70\x08\xe8\xc7\xb3\xf8\x16\xaa\xe7\xea\xab\xc6\x0f\x91\xe9\x0b\x12\xe3\x8a\xa1\x44\x9a\xd8\x91\xda\x65\x00\x20\xe8\x38\xd9\x83\x73\x24\xa1\x32\x9d\xd0\x52\x2b\xc5\xe2\x3b\xa9\x82\x1a\xf6\x0c\x8f\xc8\xc5\x04\x09\xeb\xad\x55\xf5\xc7\x11\x79\x83\x4b\xbd\x9a\x23\x09\xc7\xeb\x85\x18\x2f\x26\xea\x62\xd4\x9b\x22\x68\xca\x86\x55\x7e\x7c\x09\x46\x05\xad\x26\x88\xee\xf8\xef\x5e\x90\xcf\xa5\x5d\xdd\x48\xff\xfb\xc5\x9e\x12\x33\xe7\x40\xbf\xe3\x4b\x00\x10\xac\xd5\x24\x39\x5f\xf6\xa8\xa1\x36\x83\x4a\x23\x6c\x71\x68\xb4\xdf\x2f\xaa\xa5\xc1\xad\xbb\xf0\xa5\xfc\xf8\xfa\xa2\x0b\x63\x54\xf1\x8d\xaf\x0b\x13\xad\x97\x44\xfe\x30\x26\x45\x90\x44\x36\xa7\x3a\xca\x28\xa9\x68\x0e\xc4\x91\xb6\xf2\xf4\x9e\x48\xba\x61\x50\xb9\x23\x7a\xbd\x8a\xef\x0c\xe7\x06\x96\x43\x43\x6c\xc3\x91\x49\xb3\x5c\xca\xe0\x96\xe6\x0a\x68\x5e\xbd\x9b\x41\xd3\x35\xb5\x99\x32\xe3\x19\xc6\x58\xee\xcb\x02\x9d\xfc\xdb\xc4\x92\x1b\x91\x72\xf3\xb9\x3a\xf9\x62\x74\xd4\xf9\xfc\x31\xa3\x91\x9a\xe3\x29\x02\x10\xce\x52\xea\xfb\xac\x45\x9b\xe9\x4d\xdb\xd4\x3a\x91\x5c\x65\x7d\xc5\x7f\xdf\x4e\xbe\x61\x28\xd3\xb4\x34\x55\xde\x6a\x52\xcc\xd7\x4b\x62\x19\xbb\x65\xd9\x1c\x84\x67\xd8\x71\x60\xee\x0b\x92\x7e\x5c\xbf\x8d\x50\x89\xbb\xab\x60\x59\xc8\xa3\x3d\x0b\x36\x33\xc4\xac\x38\xf9\x62\x2a\xf1\x0f\xf8\x4d\x5b\x45\x4f\xba\x24\xf3\x0b\x5e\x52\xb4\xa0\x6f\x6e\x9f\xad\x08\x7d\x8a\xd8\xaf\x6d\x7c\x71\x9e\xe2\x9f\xae\x33\x46\xcc\xc1\x75\x33\x52\x5e\x36\xa3\xb3\x5d\xd7\x86\x1c\x3a\x74\x09\x6e\x91\xf4\x26\xe1\x26\xdc\x2a\x76\xfd\xe3\xba\x4a\x63\x6b\x8e\x65\x0b\xeb\x0c\x6e\x6f\xc0\x0c\x2f\x84\x89\x83\x1e\x50\x1c\x22\x4f\xaf\xfb\x74\x4f\xb5\x80\xef\x9a\xc2\xee\x21\xf3\x32\xb1\xbb\x6e\x8a\xac\x89\x2b\x77\x80\x68\x71\x2b\x71\x08\xa6\x22\x7d\x93\xbb\x1b\x68\x65\x6a\xcd\x15\x40\xb9\xa3\xe5\xb9\x91\xbe\x26\xa7\x18\x56\x62\x2b\x92\xa9\x63\x01\x23\x77\xa3\xc5\x60\x24\xe9\x96\x00\xe7\xd8\xb2\x57\x07\x95\x66\x37\xee\x49\xf7\x6b\x8d\xb0\xdc\x8d\x91\xe2\x20\x36\xda\x03\x78\x1e\x32\x48\x1b\xdd\x95\xdd\xd3\x74\xdf\x9e\x5c\x75\xe0\x5e\x8e\xb2\xd0\x50\x89\xc5\x36\x78\x08\x4b\xb6\x52\xcf\x30\x7e\x94\x53\x61\x57\x1d\xf4\x2c\x46\x60\x98\xa3\xfb\xda\x07\x4c\x97\x3f\x8f\x34\x4a\xd2\x47\x86\x37\xfa\xb3\xfa\xec\x0c\xa0\xb3\x8f\x3d\x7f\xec\x93\xc9\x1d\x6e\x8d\x57\xb8\x64\x4b\xbf\x77\x8d\xe3\xb9\x93\x06\xbc\xce\xce\xfb\xef\xd7\x2a\xe7\xc2\x55\x1f\x35\x6d\xc4\x65\x34\x9b\x21\x54\xc3\xc7\x1a\x9c\xe1\x7e\xff\x72\x21\x6a\xf2\x75\x97\x7f\x6d\xfc\xc9\x8d\xe9\x47\x3c\x80\xdb\x15\xa7\x5b\x80\x4b\xc0\x89\x58\x7b\x44\xa6\x7f\xaa\x22\xad\x22\x2f\x22\x6a\x6a\xd3\xeb\x8c\xe9\x68\xf1\x00\x1d\x6d\xeb\x93\xca\x57\x4d\xe7\x54\xda\xb1\xea\x0a\xc9\x24\xbb\xe8\xce\xb0\xf5\xa3\x6d\x5b\x24\xf1\x0c\x1c\x06\xab\x53\x58\x0e\x01\x1b\x84\xb6\x00\x69\xb6\xdc\xc1\xb5\x77\x77\x75\x2b\x04\xf1\xca\x25\x3b\x5f\x8b\xb3\x59\x2d\x3d\x27\x7c\x6c\x36\xbe\x4d\x85\xb2\xda\xb6\xf0\xdc\xd5\x01\x50\x22\x9a\x10\xd7\x0c\x66\xbb\x9f\xe3\x22\xba\xd8\x23\x57\x47\xeb\x6e\x4a\x27\x73\xa5\x09\x06\x3d\x98\xe8\xed\x79\x96\x79\xca\x40\xfe\x14\x29\x88\xcc\x62\x67\x8b\x55\xd3\x87\x37\xca\xf9\x6a\x72\x12\x2a\x98\x7d\x95\x7b\x37\xe6\xa0\x4a\x06\xa0\xa3\xbb\x27\xfb\xaf\xaa\x71\x0f\x39\x31\x2a\xdd\xdd\xdf\xb5\xd5\xab\x4b\x67\xc6\x3b\xc1\x49\xef\x96\xb3\xde\x64\xfb\x43\x2c\x98\x6e\x39\x26\x37\xa8\xf1\xd6\x77\xf7\x0b\x9c\x3a\x1b\x67\x88\xbb\xbc\xcf\xae\x72\x48\x1b\xf3\x35\x4c\x76\x7c\x06\xca\x26\x42\xbf\xeb\xdd\x13\x1f\xa6\xd6\xd8\xba\x3d\x55\xb8\x99\x16\x33\x33\xdd\xb7\x5b\x63\xca\xbb\x32\xa1\x66\xf4\xd6\x2e\x42\x60\xcc\x48\x74\x7e\x16\x0b\xfa\xe3\x47\x08\xf0\xf5\x87\xe4\xab\xcd\x10\x79\x27\x6d\x52\x0b\x8f\x8c\x3a\x46\xf4\x2f\xdb\xd9\x55\x26\xb4\xfc\xa4\x98\xec\x17\x65\xb2\xce\x6f\x06\x74\xef\x13\x6c\xeb\x0c\xa3\x35\x6b\x6b\x83\xf7\xd4\xee\x1e\x2f\xca\xc5\x18\x05\x7d\x83\x13\x99\xd1\x54\x73\xe2\xf5\x6c\x1d\xcc\xb8\xa8\x10\x13\x9d\x7d\x10\x28\x16\x6a\x29\x0f\xfd\x3e\x69\x76\x8a\xcf\x0e\x91\x6a\x4b\x3f\x0a\x56\x25\x39\xcf\x97\x4e\x9a\x87\x7d\xee\x62\x70\x65\x3a\x58\x56\x32\x39\xce\x81\xe2\xa1\xd3\x4b\x75\x42\x86\xb1\x39\x58\x04\xf4\x77\x0f\x14\x4b\x39\xaa\x0d\xec\xbd\x02\x12\xfa\x18\x02\xb6\x42\xac\x60\x22\x27\x48\x96\xe2\xd1\xd0\x3b\xd9\x7a\x7f\xb2\x2f\xdb\xae\xdf\xee\x08\xf9\xfa\x82\x5e\x40\xb4\xfe\x2d\x1f\x16\x62\x16\xda\x1d\x15\x38\xf8\x24\x66\x54\x52\x82\x86\x1c\x30\xee\x3d\x18\xb5\x23\x1d\xfa\x6d\xc5\x77\x46\xf9\x0b\x96\x42\x15\xf4\xaa\x83\xcb\xa6\xc2\x29\x76\xa2\x19\x24\x13\xb1\xb9\x63\x8b\xce\x75\x98\xf7\xb7\x41\xa2\x4d\x34\x29\xfe\xe4\x0d\xd2\xc2\x84\x67\x9b\x17\x86\xc1\x99\x81\xca\x8f\x3e\x64\x07\xc0\x6d\x3f\xb6\x8a\x44\xbe\x46\x1e\xca\xb8\x24\x39\x69\x96\x65\x5f\xfd\x3b\x0a\x3a\xb2\xf8\x8c\x2e\x41\x6c\x81\x9a\x17\x9f\x7a\x5f\xe0\x44\xfd\x76\x31\x5f\xfd\x79\xd8\xd3\xf1\x7e\x54\x18\x15\x1c\xb4\x87\x58\xe3\xe3\x05\x83\x50\x24\x0d\xc1\xfb\x54\xf1\xb8\xdd\xb1\x08\x23\xfa\x6b\xe3\x4c\x71\x49\x8a\x39\xae\xb8\xc2\x65\x23\x0b\x69\x62\xbf\xee\x18\x55\x3f\xd6\xc3\xcb\x5d\xd5\x7c\xbc\xaf\x1d\x8e\xef\xcc\x60\x32\x5f\x4b\x41\x9f\xf7\x5c\xce\x0d\x69\x7e\x58\x13\xfa\x03\x6e\x09\xe7\xf9\x26\xc9\x70\x67\xd1\x36\x8e\x78\x7e\x1f\xfd\xbe\xca\x33\x2d\x9f\x0a\xe4\xf6\xa2\xd7\x8e\xb7\xc9\x1f\x3b\xd8\xd4\xe1\x5b\x07\x17\x78\x39\x4d\xa2\x2b\x84\x38\xd2\xde\x1c\xdb\xcb\x1e\x31\x52\xe4\xeb\xbf\x00\x5d\x19\x05\x46\xaf\x7b\x93\xff\xf8\x4e\x80\x0b\x01\x4d\x97\xed\xc0\xac\x77\x4b\x2f\x25\x71\x47\xe5\x31\x51\xb3\xb7\xa6\xde\xf6\x7c\xed\x49\xb4\xd4\xc0\x0f\xb6\xad\x84\xe2\xf3\xcd\x80\x50\xa7\x03\xc2\x6b\xa3\x0f\xef\x6b\xca\xbb\x6d\x1f\x4b\x6d\x3f\xd1\x06\x7f\x2d\x42\x75\x8a\x28\x24\xb7\x69\xd8\xd2\x60\x50\xbf\xcd\xe3\xa1\x5a\x25\xd8\xdc\xda\x11\x86\x25\x40\x55\x9e\x1d\xd8\xac\x2b\xfd\x19\x22\xba\x9d\x6d\xbf\xba\x26\xd5\x5f\xeb\xf5\x8c\xb3\x24\x4e\xb7\xff\xc2\x74\xdf\xbe\x7c\x3d\x71\x53\x51\xf6\xf8\xc6\xf4\x9b\xd6\x93\xc2\xb6\x43\x20\x7c\xd9\xf3\x5c\xdb\xb2\xe6\x3f\x51\xfb\xc7\xee\xf5\x25\x73\x69\x72\x6f\x99\x78\x0e\x72\x12\x20\xfb\x8a\x90\x44\x72\x86\xd2\xef\x4b\xe8\x4e\xb3\xa9\xfc\x15\x8e\x17\x3d\x71\x7c\x2c\x8f\x66\x70\xa3\x86\xc0\x92\x5c\xe2\x70\x8e\xd2\x4e\x2f\x27\x7c\xd4\xce\x42\xa8\x82\x5e\x42\x55\xe6\x8d\xe5\xa0\x50\xfe\xa2\x04\xf7\x7e\x91\x5f\x2b\xb3\x84\x7f\x77\x5a\xbd\x40\x65\x08\xd7\xd1\x62\x58\x61\xe2\x48\xe0\xb0\x37\xbe\xa5\x50\x57\x86\x29\x0f\xd1\x9d\x6a\x47\x3e\x74\x71\x56\x93\xec\x78\x5f\x7f\x37\xc3\xf7\x2e\x74\xdb\xe6\x08\xfc\x58\xfd\xe5\x51\xec\xe3\xb3\x24\xc0\xd2\xb8\xfc\xa0\xe2\x35\x41\x77\x35\x32\x7f\x70\xdc\x08\xd4\x42\xef\xbb\xba\xc2\x2e\x7f\x1e\xe2\x18\x07\x9d\x53\x71\x55\xc0\x43\x98\x3a\x9e\xd8\x8a\xf2\xc2\xfa\x12\x2d\xdf\xef\x03\x2c\xdb\xa4\x47\xbb\xd8\x6b\x25\x70\x70\xf5\x57\x1a\x58\x22\x41\xfb\x5f\x3b\x18\x5f\xa2\xbe\x69\x93\xaf\x89\x3a\x72\xd0\xe3\x54\x9e\x6d\x8d\x35\x40\x7f\x44\x2e\x31\x3b\x69\xc5\x21\xb3\xfa\x84\x14\xa4\xed\x28\xdd\x9f\x68\x47\x8e\x05\x0e\x5d\x8d\x46\x2b\xa3\x3a\x6d\x3f\xa1\x2b\xb2\xf0\x1b\xf1\x9f\x00\xa4\x3e\x7e\x2d\x8e\xec\xe6\xd6\xad\xb5\x29\xca\x9c\x42\xcd\x49\x32\x0c\x95\xbf\x64\x98\x27\x40\xd0\xf4\xdf\xc3\x5d\x12\x49\x61\xa6\xf4\x31\x8a\xd9\xa8\xf2\x90\x04\x51\x67\xc3\x11\x23\x8e\x74\xcb\x0d\xf1\xc7\xac\x31\x9e\x07\x9e\x14\xbc\x31\x6a\xd3\xda\x90\x33\xe8\x3e\xa6\x17\x43\x44\xb7\x16\x7e\xf5\x00\xb7\xf8\x52\x62\x4a\x9e\x00\x78\xa4\x7c\x89\x22\xec\xf1\x1d\xb7\x3a\x7a\xc8\xcc\xd1\xfc\x8d\x23\x42\xf1\xd6\xa5\x13\x59\x5e\xfc\xe5\x51\xfe\xca\x44\xa8\x1c\x29\xfc\x0d\x54\x59\x7a\x6f\xe6\x90\x9f\x23\xe2\x38\xd9\xf1\x7a\xd8\x17\xf1\xbb\x22\x35\xd8\x60\xab\x40\xf8\xf2\x16\x6d\x40\xa0\x5c\xea\xcd\xaa\x1a\x1f\x79\xa8\xa2\xf7\xb5\xfc\x55\xd4\x1e\x5c\x08\x94\x66\xf3\xd6\xdf\xdc\x02\xed\xea\xc6\xce\x59\xa6\x68\xc4\xa6\x9e\xd8\xed\xfc\x65\xf0\xfa\xe9\x06\x97\x39\x46\xdf\x14\x26\x2e\xb4\x1f\x67\xd0\xa8\x3b\x50\x64\x12\xbc\xb7\x0b\xd1\x2a\xec\x58\x78\x77\x61\x70\x3d\xf1\x73\xcc\xef\xc8\x19\xef\xd5\x44\xe5\xad\x5d\x85\x0a\xdb\x71\x5b\xa7\x72\xd5\x3a\xbc\xf3\x9c\x07\xc8\xa1\x66\x0e\xd1\x8a\x7c\x4f\x17\x06\xb9\xa1\xb6\x8c\xe3\x27\x59\x10\x1b\x9a\x52\xef\x7e\x45\x3a\x45\x43\xde\xac\x38\x83\xf3\xc6\xf9\x8b\xd3\xd6\x16\xaa\xa8\xf4\x0c\x11\x46\xe1\x7f\xb9\x6f\x38\xc3\xb5\x3c\x9d\x87\xc8\x61\x97\x99\x52\x04\x65\xf0\xe1\xef\x55\x1e\x21\x37\x30\x4f\x31\x30\x72\x0b\xd3\x1d\x85\x3e\x21\x75\x65\xa8\x36\xee\x24\xf4\x01\x3b\x03\x4a\xe4\x52\xeb\x97\x10\xa2\x5e\xd8\xdc\x9f\x25\xbd\xb5\x64\xc8\xe3\xfb\x43\x59\xf5\xf9\xf3\xf8\x85\x28\x8e\x68\x61\x59\x4d\x3d\xc6\x74\x77\xba\xd9\xfc\x9e\xb6\xc7\x7f\x70\x93\xa9\x2f\x82\x2c\xc2\x53\x9d\x32\x4d\x63\x07\x53\xa1\x28\x66\xc7\xd2\x5f\xbe\x73\x1b\x4d\x7c\x66\x24\x2f\x83\xfa\xc2\x53\x36\xa9\x71\xd5\x78\x96\x5d\x9c\xa4\xc7\x3e\x95\x95\x90\x1c\x81\xfd\xd6\xba\xc8\x40\x37\x24\x46\x8a\x55\x38\x4a\x37\x2b\x8e\x4e\xf6\xe7\xf5\xf3\x63\x55\x4f\x7e\x6e\xbc\xfd\xf8\x38\x45\xbe\xdc\x97\xef\x5d\x36\x46\x14\xbe\x44\xd8\xf9\x37\x28\x60\x54\x9a\xfa\xc0\xd4\x4b\xde\x64\x6d\xa3\x47\xd3\xb8\xb5\xa4\x68\x6c\x51\x95\xb4\xd2\x71\xf6\x45\x11\x14\xca\x74\xb6\xf0\x1a\xc8\x17\x83\x42\xc7\x6e\x38\xf6\x8f\xd8\x5a\xdb\x68\x09\x21\x4d\x47\x4e\x82\xd9\xec\xd8\x88\x8a\xfe\x45\xba\x38\x3e\xd8\x89\xfd\x69\x47\x93\x55\x8e\x40\x48\xa6\x5c\x11\x88\xe2\x3b\x3d\x8f\x97\x66\x59\xe6\x09\xe4\x10\xc9\x96\xe5\xd6\x6f\x48\x42\x99\xc3\x85\x16\x90\xda\x39\x81\x28\xb6\x54\x80\x24\xf0\x9e\x94\x78\xa4\x89\xe9\x7c\xd3\x64\xfc\x23\x0c\xe2\x6f\xfc\x8b\x1e\x1c\x5b\x9a\x3c\x00\x70\x07\x41\x9d\x61\xfb\xce\xa4\x6e\x60\x7b\xb0\xca\x5b\x64\x04\x6b\xc7\xcc\x30\xb5\x49\xa7\xe4\x92\xbc\x4b\xa6\x80\x01\xe7\xb9\xec\xc1\x2e\xeb\x82\x94\x43\xb6\x88\x51\x3b\xa6\x02\x50\xd9\x1e\xfb\xa1\x31\x4b\x37\xc0\x25\xf0\x91\xa6\x3d\x4a\x2b\x39\x1f\x72\x9c\x4d\x71\xc5\x49\xc3\x91\x05\x48\x2d\x9a\xd9\x78\x33\xa6\xbd\x23\x2a\x41\xf7\x53\xde\xf6\xc4\x68\xa3\xbf\xff\x49\x24\xdd\xe9\x64\xea\xde\xb5\x88\x30\xa4\xaa\xaf\x28\xfc\xd6\x89\x02\xdd\xb1\xe4\x56\xcd\x97\x6a\x9f\xe3\xcf\x9f\x21\xba\xdb\x58\x41\x84\x9e\x5c\x1b\x5d\x9a\x4b\x97\xf7\x13\xb5\x86\xb7\xfa\x6f\x45\x3c\x70\x51\xef\x5a\xf4\xb9\x4e\x1e\x1b\x5f\xe2\xdd\xaa\xb1\x3d\x22\x37\x1e\x1a\x3a\xe6\x9c\xc4\x3d\x02\xd1\x9d\xdb\x78\x47\x51\x75\x6b\xe2\x33\x54\x9c\x21\xd5\x87\xcb\x23\x9f\xe8\xa1\x8f\x26\x75\x31\x05\x0d\xc5\xcf\xbe\xa7\xb5\x8a\xf2\xf4\x18\xf4\x74\xdd\x1a\x99\xab\x7e\x61\xf8\x24\x91\x1c\x25\xb5\xb1\x5d\x4f\x94\x6c\x02\x36\x8d\x51\xb5\xa1\xf5\x63\x5a\x65\xd6\xef\xe3\x60\x92\x01\x58\xe3\x03\x93\x55\x30\xfb\x6b\x82\x46\x59\x61\xb2\x11\x9e\xca\x94\x50\x40\x13\x3a\x34\x84\xe9\x4e\x8e\x21\xbe\xd9\xab\x95\x87\x60\x84\xc8\x4e\xdd\x24\x99\x33\x0e\x50\x64\x6d\x31\x63\x34\x1e\x9a\xd3\xd7\xdc\xa4\x74\x63\x1a\x8a\x35\xf4\x34\x44\xe5\xfa\x24\x55\x73\x9c\xfe\x65\x8a\x3c\xd9\xd9\x34\x11\x93\x55\xcd\x0a\x1f\x8b\x2d\xe8\x6f\xab\xcd\x03\x5f\xcf\x3c\x03\xf9\x8c\xed\xe5\xbf\xfd\xbc\x8f\x2a\xd2\x15\xf5\xfb\xb6\x9f\x59\x1a\xbc\x3e\x0e\xf6\x40\x8d\xb5\xf2\x03\x93\x27\xf4\x79\xf3\xe3\x1d\x56\x7f\xaf\xea\x47\x76\xbe\x3f\x64\xa7\x52\x58\x64\xd6\x13\xa1\x70\x26\x70\xd8\x3c\x0f\x73\x98\xfd\x5c\x25\x97\x4c\xc9\xb7\xee\x06\x48\xe9\x5c\x54\x6c\xbe\x07\x76\xc9\x50\x59\x57\x4c\x5c\xbd\xc6\x23\x78\x56\xe1\x98\x77\xe1\x28\x38\x31\xbb\x65\x39\xeb\x5a\x38\x5d\xdb\xcf\xbc\x0d\xfd\xbb\x1b\x9a\x48\xc0\x34\x99\x06\x7d\x50\xc5\xee\x51\x7d\x11\x93\x8e\x6b\x5a\x8f\x37\x14\xdf\xd7\x59\x73\x29\x0c\xa1\x92\x62\x28\x69\x28\x51\x0f\xa0\xfd\x5a\x2f\x52\xb9\xcf\x9b\x1d\x83\x41\x1d\x53\x34\x58\x99\x69\xd0\x27\xf3\x71\xbc\x7e\x7e\xd3\x05\x39\x61\x28\x57\xa6\x9f\x80\x13\xa9\x3e\x20\x10\x53\x4c\x41\xe1\x11\x93\xc8\x40\x90\x4e\x5f\x40\x7a\xb5\xc7\xa3\xc5\x24\x76\x8d\x44\x68\x6c\xcd\x14\xdd\x31\x5b\xbf\xdd\xbb\x8c\x75\x8f\xad\x37\xf1\xe8\xbf\x0b\x0e\xcc\x1f\xf8\x15\xe7\xd7\x49\x5c\xd2\xfd\x36\xb7\xd4\xbb\x32\x84\xa5\x3b\x09\x40\x46\xc9\x5d\x33\xf9\x1c\x1e\xcd\xfd\x83\x75\xf4\x78\x36\x06\xb5\x4a\xfe\xf3\x22\x62\x9b\x59\x67\xa0\x19\xf7\xae\x5a\xf4\x57\x74\x85\x6b\x97\xb8\xd5\xf9\xd4\x6c\x39\x12\x7f\xfc\xf9\xb9\xdd\x0d\x5b\x34\x4a\x2e\x08\x11\x4b\x44\x11\xef\xfc\x96\x0b\x47\x17\x55\xef\x1b\x27\x73\x73\xa4\x9d\xf1\x45\x95\xbb\x6f\x88\xd2\x1c\x43\x52\xff\xbd\xa4\xaf\x43\x6e\xec\x1c\x01\x78\x09\x44\x19\xa7\x26\x0c\x5f\x06\x04\x5c\x99\x86\xf2\x9b\x2d\x44\x76\x4e\xef\x4f\x9f\x82\xab\xfb\xf2\x51\x7e\x5d\x8b\xd2\x4c\xc5\xd8\x98\x56\xf0\x71\x6c\x9d\x51\xdd\xaa\xd8\xc6\xbf\xe2\x46\x1e\x1a\xe5\x1f\x04\x8d\x98\x51\x17\xf4\x74\xd3\x1a\x99\x4d\x2e\xa4\x90\xb5\x3b\xf7\x46\xde\x35\x08\x0f\xdc\x34\xc2\xc6\xdf\x6c\xb6\x40\x0c\x08\xbd\x5c\x8c\x99\x41\x21\xc2\x9a\x92\x5e\x22\x58\x91\x15\x11\x42\x97\xa1\xcb\x6c\x52\x9a\xe5\x08\x53\xe6\x80\x67\x57\x2e\xd8\x1b\x5c\x7d\x05\x30\x14\xa6\xf6\xe5\x98\x97\xa8\x47\x14\xcc\x47\xf2\x90\xde\x83\xfe\xf6\xfd\x28\xf8\x79\x44\xfe\x66\x45\xf6\x37\xb6\xee\xd4\xc5\xe1\x5b\xc7\x62\x35\x99\xa2\x6b\xd7\xe6\x91\xcf\x0d\x3f\x65\x6f\xc6\x44\xa5\x0c\x93\x25\x7d\xa6\x37\x94\x92\xc1\xa8\xfd\x47\xd3\x59\x2c\x59\xcb\x34\x5b\xf8\x82\x18\xe0\x36\xc4\x36\xee\xce\x0c\x77\x77\xae\xfe\x44\xbf\xdf\xf9\x07\x44\x74\x74\xec\x01\x55\x64\xad\x5c\x4f\x42\x65\x5d\x43\x31\x29\xd0\xf4\xc7\x49\xcb\x88\xed\xa8\x35\x7d\xb0\x11\x04\x15\x3a\xfe\xf0\xba\x47\x62\xb4\x9e\x55\xb6\xdf\x33\x34\x8d\x37\x2b\x21\xbe\x64\xef\x95\x12\xce\x54\x7e\x26\xcc\x6e\x47\x33\x10\xec\x9e\xfe\x8b\x36\x54\xf8\x61\x60\x8f\xf5\xdf\x2e\xc6\x3f\x86\xe1\x6a\x2c\xb3\x9a\xdb\x3d\x5f\x6c\x49\x83\x21\xfc\x4e\xf2\x87\x0d\xb5\xe3\x41\x91\x06\xbf\xb9\x39\x41\x44\xd1\x18\xab\xa4\x15\x17\x9a\xe1\x10\x95\x68\x18\xad\x84\xfe\x60\xa4\x67\x44\x83\xca\xee\x18\x29\x98\xeb\x59\xfa\xc0\xc5\x14\xf8\x5b\x30\x6a\x5e\x3a\x0e\x4d\x22\x7a\xfe\x09\xd1\x17\xa2\xd2\x8c\xfb\x63\x6f\xeb\xcb\x51\x5a\x4b\x9e\x9f\xe9\x4d\x11\xf9\xdc\x4c\x90\x7c\x8d\x9a\x4f\x51\xcb\xd8\x0e\x83\x2b\xec\x83\xc8\x4b\xfa\xee\x97\xc4\x3f\x72\x37\xc2\xfd\x3a\xb0\x84\xd5\x7b\xe5\x85\x19\xa0\x14\x49\xdf\x82\x92\xf4\x79\xa0\x44\xa9\xfc\x78\x41\xb9\xbf\x3d\x2d\x85\xa8\xd4\xd8\x06\x2a\x26\x17\xcd\x8e\x61\x49\x42\xc2\xca\x40\x68\xfa\x43\x3f\x53\xf2\x7a\x2a\xa7\x32\x1d\x55\xee\x9c\x0a\xa1\x41\xfb\x0a\x94\xa2\x52\xa3\x7a\xe1\xa2\x9d\xe3\x8e\x8f\x7f\xe6\x82\x1e\x78\x09\x01\xa9\xde\x8c\x48\x97\xba\x82\xee\x09\xcf\xe8\x25\x1d\xb0\xd9\x09\x44\x9c\xdb\x7a\xef\x2a\xb7\xae\xdb\x4a\x0e\xf9\xbf\x17\xf0\xeb\xba\x12\x3b\xf5\x81\xab\x83\x89\x38\x8f\xe0\x3b\xe2\xd8\x58\xf5\x2b\xfc\x60\xd4\x87\xf2\x08\x63\x4b\xa1\xfc\xb4\xfb\xfb\x59\x4c\x97\x67\x70\x69\x05\x85\x17\x3b\x27\x47\x9c\x4e\x4a\x4c\xff\xf5\x64\xb1\x2a\x3a\xd7\x28\x88\x3b\x16\x41\xe0\x04\x98\xd5\x07\xe6\xaa\xbe\x3b\xaa\xb1\x66\x27\x1b\x95\xc1\xfb\x70\x01\x80\x59\x4b\x4d\xcf\x04\xf0\xe1\x05\x82\x63\x16\xec\x4f\xe9\x16\x3f\xd0\xba\xf9\x58\x3f\x3b\xbd\x93\xdf\xec\x40\xa8\x36\x8f\x91\xee\xb4\xa4\x6e\x37\x01\xed\xcf\xf3\xa4\x96\xd8\x09\x49\x27\xf8\xb6\x49\xa2\xac\xea\x42\x33\xc3\x66\x30\x75\xf1\x21\x7c\x18\x7c\xcc\x5e\x5a\x06\x1b\x20\x98\xa3\x3e\x45\xad\x57\x8f\x9b\xce\x8e\x66\xca\x6f\x53\x8e\x39\x1b\x7f\x8f\x69\xd6\xb2\xb2\xe7\x59\x37\x8f\x0b\x51\x8a\xb5\x4c\xa6\xc7\x93\x1c\x8b\xe9\x14\x28\x79\x6c\xc1\x0a\xd4\x08\xb5\x80\x33\x71\x6e\x27\xaa\x19\x24\x71\x39\xcb\x20\x10\x26\x0c\x15\xac\x9d\xfe\x92\x1d\x89\x8f\x70\xb3\x6f\xfd\x33\xbc\x00\xae\xc0\x0f\x55\x30\xa2\xac\xa4\xc6\xd7\x9a\xf7\xf4\xb7\xe7\xe7\x01\xcf\xc8\xdc\x7f\xeb\x19\x5d\x61\xd2\xc0\x3e\x78\x59\xb9\x7e\xd1\x9c\x0e\x86\xf0\xfd\x10\xe4\x12\x3b\xc1\x52\x73\xeb\x99\x61\xed\x1e\x44\x3c\x13\xb8\xbc\x15\x75\x4e\xe4\xe7\x3f\x3e\xab\x25\x71\x6a\x7f\x24\x0d\x60\x41\x84\x94\x81\x06\x23\x48\x48\x3a\x73\xed\x91\xa0\x24\x14\xd2\x43\x40\xe4\xd1\x15\x6d\xd8\xe5\x1c\xcd\x75\xb1\x64\xdd\xa5\xfc\xd5\xb3\x28\xc3\x07\x2b\x86\xc3\x92\x09\x8f\x9e\x71\xa9\x8d\xc5\x46\x10\x14\x91\x83\x50\x8e\x63\x60\xb3\xc6\xdd\x42\x20\x9a\x1f\xe2\xea\x94\x55\x48\x41\xb3\x9a\xd3\x42\x97\x53\x06\x83\x10\xe3\x70\x8e\xab\x39\xd4\x1b\xa8\x0f\x7d\x0c\x33\x4c\x90\xc5\x9d\x9b\x52\x21\xfd\x08\xc4\x05\xda\x6d\x25\x80\x84\x06\x00\xad\x27\xdb\xad\x4c\xf2\x0b\x4d\x0a\x3f\x10\x9c\x73\x46\x29\x56\x29\x4e\x34\xc6\x4a\x0b\xc8\x6a\x8c\xe3\x2d\xa5\xaf\x41\xeb\xc1\x12\xa1\x9a\xc6\xcf\xd9\x9f\x36\x07\x29\x0c\xa3\x80\xaa\x3a\xea\x8d\xcf\x8b\x24\x8c\x86\xad\x38\x91\x34\x3c\xb6\xf9\x09\x7a\x99\x8b\x09\x71\xe0\x0c\x61\xd1\xf1\x0b\x9c\x98\x1a\xcb\x4d\xc6\x71\x74\x0f\xa2\xc1\xbe\xaa\x39\x0c\x58\x23\x57\x80\x8d\xce\xf1\xb2\xf2\x0e\x8a\xa8\x40\x68\x16\x4c\xbc\x94\x6d\xe5\x42\x13\xbf\x9d\x3e\x81\xfc\xce\x4d\x0d\xf7\x43\xb0\x16\xd8\x5d\x96\x97\x37\xef\x2d\xe9\xcf\x02\xa2\x40\x00\x11\x85\xf9\xa7\x4c\x37\x8c\x6f\x95\xf4\x50\xd0\xaf\x16\x7a\xdf\x54\xed\x1f\x08\x16\x00\xe9\xe2\xd5\x3e\x2e\x54\x67\x89\xb6\x42\xac\x18\x2d\x34\x42\xde\x2b\x6e\xa8\x78\x34\xf0\xec\x80\x85\x44\xde\xf9\x44\xaa\xf1\xe4\x7c\x9b\x7b\xc1\x8e\xd0\xa8\x03\xff\x0a\x6a\x7c\xf7\x4d\x3d\xc6\x2f\x6d\x7e\x71\x07\x3e\x29\x9b\x03\x99\x81\x66\x0d\xde\x13\x6b\x2c\x02\xaa\x27\xbd\xd3\xf4\x7c\x34\x08\x4e\x4f\x8d\x7e\xd8\xd3\xc6\x54\x6a\x39\xb3\x94\xd7\x6a\xbb\x12\x25\x9a\x9d\xba\x38\x06\xc3\x6a\x07\xe8\x4b\x81\xd6\x85\x92\xbb\xa5\x0a\x6d\xf0\x26\x1f\x2c\x96\xe4\xc9\x77\xfb\x2e\x77\x72\xcb\xf4\xd6\x36\xd0\x2d\x95\x3b\xc6\xce\x82\xef\x45\x98\xdd\x4c\xf2\xc8\x8d\x52\x9e\xc0\x0a\xf0\x69\xaa\x68\x76\x18\xe3\x93\x3e\x39\x30\xf4\xed\x6f\x58\xe1\xb4\x88\x14\xa8\x31\x7c\xdd\x9a\x6e\xa1\xab\xa0\xa1\xe4\x9f\x12\x30\x27\x6f\x57\x36\x1a\x35\xde\x9b\xaf\x71\x16\x67\xad\x78\x40\x20\x53\x72\x3e\x1b\x1a\x80\x61\xca\x20\x5a\x3b\x00\x76\xde\xb8\x3b\x37\x80\xd2\x2a\x35\x8f\xa4\x53\x1a\x00\xd2\x23\xfc\xfa\x9c\x1f\xb6\x22\x65\x6b\xfd\x59\x16\x38\xbd\x73\x5d\xe2\x38\xc0\x0b\x5e\xb2\x6c\x51\x80\x1c\x10\x48\xbc\x7a\x91\x83\x4e\x6d\x56\x18\x3b\x32\x3d\x88\x75\xa7\xe9\x41\x8b\x13\x85\xf1\x32\x6a\x31\x13\x4f\xb1\x53\xeb\x8c\x09\x8c\x05\x49\x54\xb2\x70\x0b\x0e\x6b\xf2\x30\xa3\x4a\x98\x73\xf7\x84\xc7\x5e\x05\xdb\x57\x98\xb5\xff\xa6\x2d\x46\xd8\x1a\xd2\xc3\x85\x23\xf8\xba\x2b\xaf\xc8\x85\x0e\x4d\xcf\xe6\xf4\x55\x22\x2d\xb8\x59\x69\x31\x12\x29\x08\x02\x18\xa1\xb0\xc2\xe9\x13\x31\xb5\xd4\x0b\xda\x57\x04\x8e\x13\x43\xa4\x87\xdd\x18\xe6\xa6\xb4\x65\xae\xf6\x2f\x79\xfa\x60\x72\x68\xdb\x72\xc3\xdb\x5d\x68\xf4\x80\x8f\x76\x73\xa1\xad\xa5\xba\x70\x20\xe5\x5e\xee\xe5\x72\xd8\xf0\x42\x26\xdd\x91\xcc\x80\x0a\xad\x7a\xfc\xb4\x2b\xb2\x92\x29\xa8\xed\xd6\xd8\x01\x02\x32\xf5\xed\xe7\xa7\x8d\xaa\x13\x1a\x23\xe3\xdc\xa2\x58\x7b\xb0\x1e\xbf\xe8\xf4\xdc\x1c\x54\xfa\x04\xc4\xa2\x5b\xac\xaa\x4d\xeb\x81\xcc\xad\x4f\x01\xac\x24\x6b\xa9\x89\x6d\xe8\xa0\x38\x0d\xb6\xc0\x13\x24\x42\x8c\x2c\xca\x2b\x82\x29\x4c\xc3\xd3\xa7\x54\x33\x63\x6c\xe1\xea\xb4\x15\x24\x61\xb3\xb7\x09\xc4\xce\x81\x8d\xb9\x57\xad\x5d\x76\x6c\xf5\xa3\x3c\x99\x44\x3c\xb3\xc2\x3f\xc3\xc1\x6e\x26\x50\xcf\x63\xf3\x60\x12\xaf\x6f\x31\x64\x4c\x1a\xd9\xe0\x6f\xf9\x5a\xff\xe7\xd8\xfe\x31\x7e\x59\x3a\x8a\xec\x7c\x63\x69\xeb\x9b\x12\xdf\x1e\xe1\x16\xda\xb7\x28\xb6\xbf\x46\xfb\x5d\x28\x49\x1c\x93\x83\xec\xc9\xc5\x39\x32\xef\x22\xb5\x5d\x0b\xf5\x3f\x3d\xfd\xad\xc5\x09\x3a\xf7\xe3\x64\x16\x27\xca\x92\x42\x07\x8c\x11\xf9\xb0\xc6\x98\x67\x27\xc5\x87\xc6\xb0\x81\x68\xa9\xc4\xb3\xcd\x00\x58\x9d\x68\xd6\x00\x91\xff\xb5\xa4\x03\xe5\xf0\x08\xe6\xb5\x3e\x3c\xaa\x58\x43\xc8\xa5\x06\x2a\xfc\x12\x6d\x78\x60\xe8\x5e\x5a\xd2\x4d\x55\x96\x6c\x03\xf2\xed\xb0\x2a\xd7\x2f\x5b\xb0\x7e\xe5\x41\x54\x15\xa2\x3c\x41\x84\xf4\xa3\x03\x56\x3b\x72\xa2\x2e\x67\xbb\x0f\x2e\x95\xbb\xd8\x77\x5a\xa7\x47\x12\x4a\x9d\x91\xcc\x6f\x0b\xe1\xfd\x50\xef\x40\x63\x2e\x6f\xfd\x71\x7f\x13\x14\xc9\x27\xe5\xd6\x79\x1b\x62\xd9\xd4\xec\xe6\x4e\x62\xc4\x5e\x11\x4a\xab\x93\xba\x07\x6c\x36\x28\x81\x80\x7f\xf7\x70\xa2\x69\xac\x9b\x06\xe6\x97\x56\x74\x99\x80\xa8\x8f\x40\xcb\xe2\xb7\x76\xda\x16\xd9\x80\xd6\xe7\xc3\xbf\x18\x3e\x38\xb3\xb2\xa6\xb8\x2c\x42\x1f\xb2\x9b\x1f\xc0\x58\xcf\xaa\xc9\x92\xac\x0d\xc4\xce\xac\x5c\xec\x73\x85\xe4\x3a\x35\x9f\xa5\x3d\xed\xf8\x81\x60\x5a\x8e\xad\x36\xde\x89\x92\x0f\xe7\x95\xf2\x1e\x6a\x5e\x72\xa1\xb1\xb2\x30\x41\x0b\x18\xbf\x65\x81\x09\xa2\x18\x2d\xc7\x9a\xbe\x79\xe8\xce\x1c\x6b\x7e\x4b\x8c\xd0\xad\x20\x31\x90\x47\x20\xf2\xaf\x6d\x55\x18\x94\x3a\x0e\xa3\x4a\xeb\xe1\x0d\x20\x3d\x7e\x55\x85\x8f\xc9\x58\x8a\xcd\xcf\xa1\x45\xa7\x4f\x4b\x99\x14\x9f\x13\x75\xe5\x76\xbe\xb9\x40\xd4\xdf\xd1\xd6\x25\x9e\x50\xe7\x9f\x67\xa7\x59\x52\x93\x89\x58\xc6\xa8\xf2\xe6\xcd\x4d\x95\xb1\xfc\xd1\x93\xbe\xa9\xef\xc2\xd7\x82\x24\xcc\xe0\x97\xc1\x34\x42\x16\x27\x21\xf1\x5e\x58\xf5\xeb\x4f\x28\x67\x75\xdf\x7a\x39\xab\x71\xf3\xe9\x33\xdb\x48\x08\x37\x76\xdb\x8c\x13\x2e\x59\x14\x9a\x38\xe3\xb8\x6e\x41\x8a\xf1\x73\xe6\xda\xff\x57\x9f\x6c\x31\x99\xfb\xc1\xdc\x71\xaa\x75\xac\x85\x90\xa0\xac\xe9\x58\x8b\x6b\x3a\x2e\xcb\x4b\x88\xbf\xbd\x10\x1e\xd1\x99\x63\x6c\xb0\x22\x98\xf6\x8a\x0b\x21\xd6\x7a\x96\x39\x96\xab\x09\xed\x29\x56\x2c\x89\xf4\x8f\x0a\x5d\x28\x1d\x97\x95\x3e\xbf\xb4\x71\x33\x4d\x07\xb0\xce\x62\x30\x49\xf2\x04\xc4\xe8\xe3\xed\xea\x8b\x15\xa8\xa4\xe2\x44\x53\xcd\x46\xb3\x79\x17\xc5\xf3\x0a\xbe\xe7\x94\xe7\x2c\x42\x29\xf0\x62\x1f\x75\xaa\x69\xbc\xcc\xd8\x6b\xc8\x16\x98\x84\xc8\x65\xa4\xfc\xc6\xc6\x2a\x4e\xab\x5b\xb5\x93\x3b\x41\xb7\x76\x5c\xc1\xb0\x42\x7b\xa1\x85\x49\xf2\xc2\x14\x5b\xfb\xa3\xdb\x27\xe5\x28\x7f\x07\x2a\x93\x28\xb8\x47\x06\xe7\x3a\xce\x59\xed\x15\xc1\xe2\x52\xc6\x64\x8c\x27\x11\x5c\xee\x0c\x26\x00\xf0\xa3\x56\x0e\xae\xbc\x8f\x87\xd8\x4e\xf0\xdd\xd2\x0f\x92\x90\x1d\x3c\xad\xb4\xf6\xf0\x6f\xdc\xcb\x9a\x8e\xbe\x09\xbb\x47\xe6\x42\xb8\xc5\x3b\x47\xba\xae\xc4\xc9\xb1\x0c\xa2\x11\xf5\xf8\x15\x57\x0f\x6b\xee\x7d\x76\x81\xf0\xce\xab\xda\xec\x68\x96\x04\x36\x64\xf0\x92\xa9\x44\xda\x40\x2b\xae\x8f\x8b\x3d\x10\xda\x17\x7a\xae\x9f\x02\x5a\xfd\x51\x00\x3e\x08\x28\x85\xa5\x75\x34\xa0\x5d\x6d\xa9\x93\x69\x98\x8c\xc6\x78\x99\x19\xff\xce\x42\xcf\x06\x41\x14\xd5\xb3\x20\xcd\x35\xe6\x2a\x5d\x3c\xfd\xfe\xf4\xdf\x0f\x8a\x88\x04\x7a\x15\xf0\xb0\x1d\x3c\xf1\x82\x12\x22\x62\xef\x9d\x21\x29\xc3\xa5\x7f\x2b\x36\xf9\x13\xc4\xb2\xa2\x4d\x07\x3c\x9a\xec\x85\x20\xa0\xdf\x02\x02\x74\xa1\xe2\xc7\xaa\xaf\xab\xa4\x2f\x1d\x21\x66\xb0\xd9\xab\x70\x1b\x7c\x1d\x77\x15\x84\xcf\x05\xb3\x85\xc3\x8a\x66\x07\x5a\xce\x1e\x94\xb6\x2f\xff\x76\x1a\xc1\x32\x29\x9f\xfe\xc5\x26\x64\x28\xe2\x6d\xfe\xee\xf9\xb7\xee\x37\x47\xde\x73\xbd\x49\xdd\x83\x6d\xda\x9c\x54\x27\xc4\x4d\x10\x5e\x5e\xe1\x38\x9a\x3e\x52\xfd\x3a\x55\x74\xfa\xa4\x16\x27\x6c\x11\xe4\x4e\x0a\xd6\x56\xe9\x9f\x63\x4b\xcd\xae\xde\x7f\xd2\xb9\x82\x7a\x85\x7b\xee\x92\x59\xce\x1c\xb2\x2b\xa9\x24\xbc\x1a\x6d\xc1\xcb\xf2\x19\xd3\x3f\x27\xd7\xd8\x34\x23\xb8\xae\x6c\x73\x3a\x51\x5a\xf6\x3e\xa7\xa2\xb3\xa3\xfa\xe8\x50\xab\x11\xc6\xd5\x21\x73\x8c\xcb\x8d\x62\xb7\xdb\x17\x71\x35\x0a\x45\x44\x01\x5e\xf2\xeb\xb9\x2c\xaa\x0b\x15\x17\x44\x58\x52\xc8\xcf\x84\xd8\xec\x91\x06\xab\xcb\x1b\x2b\xe2\x8f\x02\x2b\xb8\x61\x5d\xba\x3a\xaf\xaf\xb9\xef\x1c\xa2\x0f\x1a\x03\xcd\xc6\x71\xfb\x59\xdd\xd4\x04\x94\xd9\xd4\x92\xef\xa6\xb4\x3f\x9f\x41\x60\x1f\x74\xa3\x9a\x33\x3f\x58\xae\x26\xfe\x44\x9a\x40\x78\x08\x91\xaf\xc9\x27\x51\x88\xb4\xfd\xcd\x72\xcd\xd4\x32\x3f\x25\x48\xa1\x7b\xf5\x50\x4b\x28\x49\x0f\xe6\xe4\x39\xa6\x94\xef\x5a\xf7\xbc\x80\xd7\x1f\x6c\x03\x84\x52\x3d\x0b\xa2\x54\xcf\x24\xc3\x4f\xa1\xed\xa6\xae\x2d\x41\x34\x30\x54\x1f\xf4\x3a\xc6\x1d\x86\x54\x25\x21\x77\xa8\xfa\xc3\x9e\x89\x4f\xbd\xbc\x7a\x6b\x01\x15\xb2\x05\xc7\xef\x56\x74\xbc\xa1\x56\x46\x0b\xd1\x03\x19\x96\x34\xac\x65\x75\x9a\x47\xe5\x67\xd7\x82\x28\x82\x95\x0f\x1b\x5e\x0e\x6a\x02\x17\xf1\x09\x12\x59\xd3\x6d\xa5\x91\xa3\x91\xee\x77\x60\x80\xcc\x33\x76\x95\x30\x3d\x58\x7c\xc4\x1d\x60\x09\x10\x3d\x40\x28\xd4\xb2\x78\x1d\x57\x2d\xd3\x7c\x2a\xe2\x0d\x54\x44\x3f\x36\x86\x7f\x82\x6e\xc7\xda\x0c\x32\x38\x68\x5a\x92\x87\xa8\x43\x17\x73\xbd\xde\x43\x06\xbb\x1e\x01\x00\x96\xd4\x98\x14\x8e\x54\x63\xe5\x4f\xd0\x6c\x87\x2b\x4c\xb4\x2c\x75\xb1\x6f\x9d\x35\x13\x44\x13\x82\x9d\xfe\x73\x4a\xc0\xbb\x85\xcc\x89\xa4\x91\xfb\x90\x4a\x8f\x34\xab\xd9\x08\x47\x8b\x8f\xcd\x7d\xdb\xc6\x7b\x31\x80\xed\x06\xa6\xe5\x74\x5e\xff\xc4\x8f\x7e\x98\x06\x37\xb9\xc2\x7c\xfc\x37\x87\xec\x50\x63\xe0\xce\xff\xc6\xfc\x61\xeb\xbb\xd2\x9a\xce\xbc\x95\xd2\xad\xac\x09\x21\x8a\x4a\x0f\x9f\xe3\x42\x27\xf9\xd4\x54\x4c\x3a\x2d\x83\x38\x4a\x30\x67\x99\xbb\x6c\x0f\x40\xe3\xad\x8f\x61\xd0\xe7\xd1\x84\x3a\xe5\xb1\x52\xd7\x50\xa1\x07\xc9\xf1\xc9\xff\xbc\x67\x79\xed\xb4\x9a\x4f\x0a\x17\x53\xd5\x8d\x6c\x04\x50\x9d\xcd\x6e\xb7\x9c\xc0\x78\xce\x3a\xf8\x9b\xad\x45\x32\xc5\x74\xb7\x6b\x4f\xef\xbf\xe7\xd7\xa4\xe1\xaf\x87\x7c\xa2\xdc\xda\xb8\xe6\x53\x5d\xae\x28\xd8\xf0\xfc\x89\xbf\xcd\x88\x76\xdb\x39\x15\x9f\xc4\xea\x5f\x5e\xd8\x95\x1d\xe1\x1d\xbb\x83\x68\x2b\xe2\x93\x12\x94\x9e\x0d\x06\x40\x67\x3a\x06\xf1\x83\x69\xb0\x82\x24\xfe\x7e\x50\x09\xc3\x43\x83\x65\x15\x9c\xaa\x3e\x0a\x34\x2e\x34\xbb\x15\xad\x3b\x50\xb0\xfb\x76\xdd\xa5\xf1\x70\x4b\x56\x2e\x19\xc2\x9b\xc7\x18\x10\xc2\xcb\xec\x24\x3b\x07\x67\x13\x46\x5d\x2c\x7c\x7d\x2d\x04\xe3\x01\xb7\x5f\xd4\x5a\x56\x9c\xde\x6b\x07\xea\x2e\x19\x14\x29\xb7\x95\xd8\xaf\x50\xb3\xed\xce\xf1\x37\x9e\x49\x3a\x22\xde\x86\x90\xa3\x6a\xd7\x8e\x2d\x31\x55\x8f\xcd\x86\xe6\xf0\x77\x64\x2d\x16\x4a\xd6\xed\x52\xa5\xf1\xd9\xaf\xda\x58\x28\x89\xcf\x9a\x2c\xd7\xac\x20\x42\x47\xb8\x6b\xe5\x9b\x54\xe7\x68\x2f\x13\x45\x4b\x7f\x3e\x58\xcd\x40\x1a\x5e\x6c\xf0\x1b\xed\x57\x81\x90\x44\x13\x81\x71\x8a\x47\x05\xac\x3e\x5c\x27\xbb\xfd\xde\x43\x2d\x31\x33\xbc\xf7\xe5\x59\x7d\xf7\x2b\xcc\x08\xdd\x9b\x0b\x0b\x95\xc3\x5f\xa3\xaa\xb4\xde\xdf\x93\x43\x55\xf6\x8c\x08\x87\x5d\x80\xf0\xdb\xbd\xee\x37\x03\x55\xed\x60\xb7\xcb\xb2\xc2\x44\xe2\xf4\x1f\x94\xde\xa2\xbe\x94\x21\x93\x89\xe2\x38\xa7\x04\x37\x80\x50\xa2\x7b\xcc\x63\xe2\xd7\x8d\xfe\x58\xdb\x47\xad\x0d\x65\x1f\x87\xea\x17\x8e\x31\x3c\xb2\xca\x39\x10\x40\xaf\x0b\x25\x11\x01\x5e\x20\xa2\x52\xd6\xf4\x21\x85\x86\xfe\x74\xd4\x78\xc0\x8d\x98\x6b\xca\xad\xa9\xa0\x2d\xab\x01\x63\x60\x8a\x9b\x57\x4d\x73\xfb\xcb\x41\xc0\xa5\x4f\xc2\xa8\xb8\xea\x90\x82\xc7\x6a\x47\x34\xa9\x2d\x2d\x5c\x10\x64\x57\x45\xb4\x60\x3b\xa5\x68\x60\x6f\x86\x91\x19\x56\x71\x84\x9f\xcf\xbe\x67\xdc\x2f\x2f\x55\x5c\x7e\x6a\x58\x49\xf4\x17\x07\xd0\xe2\x91\xa0\x25\x78\xca\xce\x22\xf1\x6a\x0b\x58\x29\x35\x98\xb2\xf2\x6c\x4d\x23\x44\x11\x1b\x0c\x2c\xaf\x26\x5f\x63\x1d\xdb\x2d\x9c\x8b\x93\x04\x90\x19\xf7\xae\x70\xc7\xaf\x42\x66\xe3\x37\x33\xb1\xc8\x22\x68\x75\xfa\x3f\xc3\xb3\xbf\x02\xe0\xe2\x1e\x60\xeb\xf6\x77\x6f\xc6\xf4\xed\xec\x9a\x6f\x53\x4e\x78\xc6\x84\xc9\xa2\xcf\xed\x69\x0d\x44\x3f\x43\x8b\xee\x02\x0c\x75\x81\xe9\xa5\x5c\x4c\x3e\x1d\xf0\x8c\x3a\x24\x5e\xd9\x51\xb5\x59\x55\x3e\x17\xb0\xa9\x56\xc6\xf8\x6b\xa7\x4f\x28\x73\xf7\x4f\x8a\x48\xb9\x83\x01\xe6\x22\x44\x47\xa8\xe6\x5a\x2f\x6e\xda\x12\xf9\xcb\xf9\x23\xf5\x9e\x50\x13\x6a\x0e\x0b\xbb\xd7\xb8\x38\xa0\xb3\xf4\x1d\x36\x0f\x9e\x39\x85\xf0\x05\xc6\xc3\x51\x1a\x79\xfb\x44\xc4\x4f\x6f\xdc\xf1\x6d\xc4\x4e\x0e\xc9\x0c\xc2\x44\x2f\x6a\xe5\x1c\xfb\x3a\x10\xb2\xb8\x1e\x96\xca\xf5\xc9\x95\x25\x19\xcf\xab\xcb\xbb\x85\xa8\x6d\x3a\x2c\x15\xd9\x35\xc9\x17\xfd\xf4\x51\x94\xf4\x20\xba\x94\xe0\xd2\xfb\x80\xe2\xe7\xf8\x65\x7b\x74\xaa\xd8\xce\x9b\xf2\x50\x44\xa2\xf8\x6f\xe6\xa5\xbc\x03\x61\x70\xe9\xa4\x12\x49\x45\xd3\x43\xd9\xbe\xc0\x6e\x66\x36\xeb\xa1\x01\x15\x92\x77\xdb\xc2\xfc\xb3\x3c\x88\x5e\xc5\x88\xe4\x99\x98\x1f\x90\x8b\x16\xc9\xe2\x44\xdb\xfb\xd4\xea\xd8\x1f\x64\x54\x99\xac\x60\xc9\x0e\x29\x47\x0f\xac\xa4\x6b\x71\x5c\xd6\x58\x8c\x01\x4a\x93\x3e\x9c\x3a\x25\xf0\xb2\x4e\xf7\xd7\x40\x44\x45\x03\x05\x65\xfc\x92\x76\x37\xa6\x3d\xcc\x8c\x69\xb6\xff\xe2\xe3\x1a\xba\x66\xfe\xc4\x21\xfe\x40\xc3\x5b\xd6\x75\x5e\x69\x2b\xd6\xd8\x6a\xc2\x7f\x2f\x9d\xd7\x86\x9f\x63\x9f\x2f\x9a\xa0\xdf\x70\x3f\xb5\x92\x56\x8c\xbe\xbd\xc0\x9a\xbe\x17\xce\xaf\x5e\x95\x98\x08\x74\x51\x06\x9b\x44\x88\x3c\x6a\x2a\x31\x4f\x37\xca\x3a\x9f\x67\x6a\x3d\xd2\x06\x6c\x6f\xd0\xe4\xd7\xaa\x3f\xac\x32\xd3\xdd\x82\x9d\x20\xf0\x04\x7f\x89\x5b\xae\xde\xb5\xbc\x8c\x2c\x36\x09\xcd\x2e\x06\x59\x48\x11\x76\x28\xa3\x31\x4a\xe5\x6d\xc1\xa1\x20\x54\x9c\xa7\xf1\xa1\x00\x0e\xde\x19\x97\x55\xc5\x71\xeb\xc8\x90\xc7\x4b\xc3\x7d\x8c\x2e\x46\xcc\x39\xfb\x14\xe4\xb5\x20\x74\x6e\xe5\x06\x05\x2e\x15\x1a\x3d\x13\xd8\x5a\x7e\x58\xb8\x68\x48\x82\xe2\x8a\xe4\xdf\xdf\x1c\xe0\x14\x29\xde\x45\xb2\xd0\x0d\x75\xdf\xfa\xa6\x72\x33\x12\x28\x3f\xb8\x88\xd8\x25\x2a\x31\x1f\xea\x16\xb1\x73\x76\xc9\x74\xdc\xfa\xd2\x30\x4a\xef\x20\xb6\xbb\x50\x9e\x42\x24\x29\x36\x36\x6c\x55\xdb\xed\x94\x9a\xff\xf4\x81\x2e\xa7\xe0\x24\x8b\x38\x5b\xaf\x16\x5b\x13\x13\x28\x51\x6f\x81\xc0\x39\xd7\xad\x26\xe7\x6b\xed\xf7\xd2\xe5\x15\x25\x86\x4d\x2f\xe4\x31\x7e\x41\x7a\x02\x2c\x18\x69\x71\xb1\xdc\x75\x2b\xab\x5c\x7d\xb5\x64\x81\x08\x30\x59\xa2\x07\x40\x8e\x78\xec\x70\x2e\x16\x66\xe5\x5b\xf4\x49\xb0\x99\xf3\x2a\xd4\x39\x74\x0b\xce\x5a\xf0\x1e\x5c\x05\x77\xce\xb2\x7e\xdd\x63\x40\x1f\x3c\xc0\xa5\xae\x2b\xb1\x4b\x34\x40\x72\x69\x8c\xa2\xd2\xdd\xe1\xa0\xbc\xd1\x6a\x79\xe7\x92\xc0\xa2\x19\xbc\xa2\xce\xc7\x02\xee\x94\xa0\xb4\xc2\x09\xac\xff\xe3\xc2\x7f\xef\x29\xc9\x30\x52\x81\x07\x70\xfc\xac\x1e\x74\x02\x34\x23\xf0\x94\x54\x26\x1d\x29\xa4\x34\xa5\xde\x3d\xdb\x05\x5f\x7a\xa2\x6a\xce\x6b\x57\xe4\xf4\xdd\x37\x8d\xe4\x4c\x96\x22\xb0\xa9\x7b\xd0\x5f\xc1\x41\x82\x9d\xa4\xe1\xf0\xc7\x99\xbb\x32\x77\xce\x34\xaf\x6a\xbb\xb6\xc7\xdd\x72\xb0\x5e\xb9\xd0\xa6\xc2\xa5\x82\xdb\x53\x07\x93\x78\x67\x89\x04\xb8\xc2\x29\xd2\xbd\x1a\x2d\x6e\x05\x00\x7a\xbd\xf3\xdb\xe0\x15\xdd\x70\x20\x43\x40\xb7\xdb\xf1\x1d\xc9\xba\x67\xa6\xcb\x03\x60\x41\x5f\x68\xee\x28\x41\x8a\x4b\x59\xa0\x32\xd0\x06\x84\xd7\xea\xb0\x87\xc4\x29\x09\x65\x1b\xf4\x92\xfe\x99\x74\xb6\xbd\xc7\x26\xbf\x22\xc1\xe9\x56\x9b\x28\xbc\x85\xa2\x92\x7c\x4b\xe9\x72\xf7\x7f\xac\x67\x77\x69\xc6\x0c\x46\x1b\x92\xc7\x0b\xf0\xd5\x91\x2f\xc4\xba\x72\xc7\x01\x89\x62\x2f\x44\xc9\x5b\xd8\x46\x72\x17\xe5\xe7\x0b\x39\x4a\xc9\x99\xe4\xe8\xae\xea\x70\x3f\xf6\x26\x2c\xb6\xd1\xc7\xde\xaf\x29\x21\xd6\x27\x67\xce\x7f\x8c\x3d\x88\xfc\xbb\xc2\xe5\xb2\xa6\x3d\x62\x74\xc9\x2b\xcd\x3f\x6b\xfa\x3e\xe3\xa5\x76\xfe\x27\x79\x28\x65\xf0\x1e\x44\x99\xd7\x71\xba\xcf\x91\x05\xf0\x9f\xce\x55\xaa\xdd\x50\x23\xa0\x53\x95\xac\x5a\x68\x98\x3e\x80\xc1\x72\x4e\x1c\xfd\x70\x40\x69\x2b\x3f\x37\x02\xcd\xec\x3c\x98\x26\x26\x07\x2e\xbc\xb0\x96\x95\x4a\x93\x3c\x78\xe4\x85\x78\xaf\x5b\xbe\xc2\xbe\x61\xc5\xf5\x33\xd2\xa8\xb0\x89\x7e\x8a\xbb\x5f\xbc\xc5\x16\x30\x59\x58\x74\x47\x8f\x0f\x4d\x68\x19\xa7\xd7\xaf\xe1\x4c\xd6\x81\x97\x5b\xfa\xe2\x7e\xdd\x5a\xda\x4b\x2d\xaa\x2b\x0c\x38\x7c\x24\x6b\x3a\x6e\xab\xc8\xae\xf8\x4f\xa9\xbb\x56\x98\xdc\x73\x47\x00\xb0\x6a\xe1\xec\xf0\x95\xce\x8d\x55\xfc\xac\x46\x7b\xf6\x8d\x66\xc4\xb2\xea\x42\xcb\x6b\x53\x6f\x1d\x00\x0a\xfb\xf7\xf8\xc1\x50\xfa\x5b\xf0\xcd\xb8\x49\x08\x81\xe7\x17\x2f\x5d\x5a\xd1\x56\xab\xa0\xec\x50\x78\xda\xb8\x80\xb4\x08\x84\xe4\x1d\x48\xf0\x33\xa2\x8c\x50\xe5\x7e\x91\x5d\xba\xef\x08\x39\xba\x01\x10\x7e\x72\x49\xe5\xea\x39\x11\x9d\x99\x30\xbb\xcd\x98\x61\x54\xd7\x0b\x7a\x86\x89\x84\x71\x10\xfd\xe5\xce\x68\xeb\xf5\x55\x4f\xda\x3d\xfb\x24\x60\xe5\x36\x68\x97\xaf\x9b\xa5\x8d\x9e\x6d\xff\x90\x07\x84\xb9\x17\x96\x9d\x9b\x2e\x07\xcf\x44\x20\xef\x2d\xb5\xef\xfe\x57\x51\x8e\x73\x53\xbc\x63\xd2\x7b\x02\x56\x50\xc6\xe6\xcf\x6f\xa1\x74\xbe\x30\xa8\xb6\xe1\x2b\xea\x4c\xad\x85\x92\x34\x1c\x85\xc1\xa8\x64\x17\xf5\x6f\x27\xa3\xd2\xc6\x63\x70\x64\xe1\x39\x31\xdf\xee\x36\xc6\x73\x9c\xfa\xa1\xd9\x90\x2d\x08\x62\xfd\xfd\x1a\xa8\xb7\xa1\x61\xb0\x85\x8e\x39\x05\x29\x29\xdc\x00\xce\xa5\x69\x1d\x78\x45\x4f\xa3\xe6\x34\x63\x49\x2e\x38\xfb\x1a\x1e\xca\x8c\x57\x89\xc1\xa7\xc5\x78\x23\x5f\x11\x58\x63\xd9\xe9\x79\x1f\x02\xd0\xfc\xcb\x72\xb7\xc9\x52\x28\x35\x35\x57\x94\xa1\x1f\x00\xb2\x3d\xc4\x7d\xac\xdf\x9c\xa8\x0b\xd1\xd6\x86\xd5\x0e\x9e\x65\xcd\x4b\x64\x6a\x6e\x11\x98\xdc\xe4\x72\x06\x23\x14\xc3\x5d\xc9\x97\x53\xa6\xf2\x0e\x9a\x00\x1f\x71\xb8\xb6\x7d\x08\x35\x2c\xf5\xcc\xf8\xa0\xb7\x42\x44\x9c\x01\x08\x4a\x1d\x80\x4a\x03\x7e\x74\xf6\xa8\x6e\x2b\x74\xb0\x8e\xdd\xeb\x43\x5f\x5e\x07\x16\x13\x77\xcb\x59\xca\xb5\x60\x2d\x93\xc7\xbf\x16\xb5\x5d\xeb\xb9\x77\x22\x1f\x3d\xac\x57\x05\x89\x3e\xa9\x4b\x75\x07\xf6\xc3\x7f\x62\x0e\x4e\xae\x12\x74\x2c\x3a\xa1\x44\xcc\xd1\xdd\xbe\x8a\xdb\x7a\xef\x80\x0b\x7c\x2a\x9e\x1f\xb3\xc6\x46\x6c\x73\x5a\xb5\xcb\xd5\xe0\x74\x31\xd8\x9c\xa5\xc8\x6f\xe0\x6e\x8f\x06\x80\x75\xe8\x76\x1b\xd7\xa6\x8a\x06\x1e\xcf\x1f\xb0\x34\x5c\x56\xe0\xda\xc8\x39\x86\x40\xaf\x76\x04\x06\x02\x47\x89\x7f\xfa\x56\xbc\x49\x63\x97\xbd\xfd\x2c\xdc\x22\x8a\x60\x20\x6b\x3e\xaa\x79\xd9\x0f\xc7\x80\x26\x82\xf9\x9a\x8a\x3a\xa8\xa3\xbb\xee\x41\x34\xa5\xef\x4e\xd1\x4f\xac\x0d\x04\x18\x26\xe3\xd2\x39\x97\xd8\x5d\x40\x50\x55\x76\x18\x99\x6f\x00\x92\x6d\xf7\xe4\xa2\x58\x06\x75\x1f\xec\x31\x39\xd9\x02\xcd\xdd\x94\x78\x3e\x46\xf4\x47\x43\x82\x7d\x53\x5f\x19\xcb\x4d\xfe\xe9\xb1\xd4\x10\x39\xb6\x92\x1e\x2a\x63\x3f\xc8\x11\x70\x2c\x27\x0a\x04\x63\xd7\x82\xdf\x8a\x3f\xcf\x1b\xb9\x7e\x73\x5d\x38\xb0\x9b\x7e\xa4\x3d\xb2\xf7\x52\x97\x06\x05\xb5\x6a\xa7\x95\xa7\x80\x80\xc8\xe7\xd5\x2f\x56\x9f\xde\xb8\xac\xfb\xb6\x8d\xd8\x2e\x5f\xd0\x75\x30\xff\xc7\xba\xe1\x16\x7c\xce\x29\xe9\x50\x4d\xfd\xe2\x4b\x74\x95\x76\x9e\x55\xe4\xaa\x69\xa4\x04\x2b\x0b\x45\xdf\xdf\x8f\xb7\x97\x60\x47\xc7\xe4\xd3\xc3\x04\x34\xa3\x6c\x8e\xeb\x0c\x67\xbb\x78\xf5\x89\x77\x2c\x0e\x84\x66\xd1\xb1\xca\x0e\x84\xbe\xb2\x91\x30\x23\x04\x5d\xb0\xd3\xdb\x13\x91\xad\x6b\x1e\x97\xa9\xa6\x17\x8f\x93\xf6\x8a\x29\x43\x60\xf7\x88\xf0\xc2\xd2\x29\xa0\x32\x7f\x8f\xed\xdf\x3c\x5e\x74\x56\xf4\x33\xa0\x58\xae\xaf\x4f\x82\xa8\xad\x57\x03\xbd\xdf\x09\x34\x45\x8e\xe5\x8f\x51\x8d\xe9\x9a\xa4\x5a\xc2\x4f\x15\xcf\xaf\x0b\xdd\x06\xb7\x0f\x7e\xac\x83\x71\x0b\xf7\xa3\x40\xab\x7b\xb2\x6a\xc9\x6c\x41\x92\xbe\x05\x7d\xae\x05\xc9\x45\xb6\x8e\x4f\xc9\xdb\xd8\xb6\x93\x71\x50\xaf\x50\x09\x60\x9e\x41\xfe\x25\x61\x34\x74\xc9\x8e\x02\x76\x55\x13\xef\x81\x29\x8a\x5d\x55\x37\x97\x4a\x08\x98\xec\xad\x6f\x7e\xae\x1e\xf0\x35\x66\x56\x2f\x5c\x50\xeb\xbe\xe4\xdd\x5a\x58\x27\x68\x01\x45\xbd\x13\x05\x20\x77\x33\x21\x6a\x8e\x9c\xe3\x1d\x9e\x4b\xd3\x9d\xf1\xdb\x9a\x91\x34\x41\x97\x60\x06\xad\xc5\x2d\x62\x05\x42\x16\xd0\x40\xa6\x0a\x2b\xea\xa8\x17\xeb\xbc\xc3\xc6\x4b\x1b\x8f\x5a\x87\x10\x75\xb8\x89\xb6\x8c\xb6\x4a\x93\x36\x72\x28\xde\xf5\x86\x14\x26\xbc\x20\xeb\x9d\x38\xed\xc8\xc9\x3c\x30\x65\x24\x00\x4c\xae\x4d\x5e\x44\xd9\x2f\xa6\x93\xa3\xda\xf4\xe3\x9e\x12\xa7\xcb\x9e\x8c\x8b\x0f\x43\xb3\x03\x79\xf2\x4a\x8a\x31\xfa\xc5\xb9\x4a\xa8\x69\x02\x12\x6e\xaf\x31\x1d\x6d\x13\xf2\x49\x6b\x15\xb1\xbc\x19\x9a\x2e\x00\xa2\x5e\x61\x07\xdf\xbb\xda\x2f\x74\x17\x4f\xe1\x12\xb2\x9b\x47\x96\x3b\xa0\xec\x71\xd3\x1b\x71\x9d\x57\x8d\x06\xc4\x18\x86\xca\x47\xb7\x9b\xf0\x2b\x43\x2f\x94\xa4\xd9\x95\x72\x7f\x83\xe1\x85\x68\x87\xf7\x48\xbc\x5c\x3d\x4a\x9c\xdb\xfa\xcd\x3f\x84\x5e\xf8\xe3\x5f\x9d\xd9\x53\x7a\xce\x7c\xe5\x69\xed\x64\xd5\xea\xf5\xfb\x2a\x92\x30\xe6\xa6\xac\xf1\x83\x21\x21\xce\xed\xea\x02\xa5\x36\xf9\xa6\x7e\x47\x08\x98\xe6\x9a\xf2\x6e\x0e\xe4\x26\x28\x6c\x99\xfa\x9c\x16\x22\x2a\x4e\x14\x8f\x51\x11\xa1\xf3\x0b\xc4\x00\xf5\x3e\x42\x88\xae\x2a\x09\xd0\x3d\x3b\xe1\x44\xdd\x04\x2d\x20\x50\x93\x61\xf7\x26\x0a\x37\xca\x8b\xa9\x35\x2e\x81\x68\x0a\xa3\x80\x6d\x43\x28\x67\xa6\x93\x33\x7a\x70\x40\x9d\x3c\xed\x51\x2a\x4a\xaa\x29\x8b\x23\xe5\x00\x20\xcb\x3a\x7f\x2d\xf1\xd9\xb3\xf8\x11\xb2\x31\xfa\xdd\xb9\xcc\x1d\xe4\x44\xdf\x20\x49\xe6\xc7\x09\x74\x82\x02\xe5\x52\x0c\x08\xac\x72\x26\x63\x2a\x04\x71\x2f\xbb\x1e\xd5\x59\xb6\x74\x08\xba\x32\xe9\xd7\x85\x12\x58\x22\x74\x72\x88\xa6\x47\x0d\x91\xd5\xfe\x59\x28\x4c\x3b\x7e\x25\x4c\x17\x95\x8c\x3b\x96\x1b\x12\x8a\xbd\x20\xef\x02\x74\xb5\xe0\xf2\xca\xf8\x85\xe0\x5a\x99\x00\x8e\x9b\x0c\xac\xe3\xb0\x5e\xe8\x06\xb1\x6c\x08\x96\x8c\x42\xb8\x6e\xe3\x97\x16\x8a\xe9\xab\x91\x76\x09\x04\xc6\x71\x79\xc8\x33\x2d\x85\xf0\x96\x5c\x19\x46\x01\x2e\xf3\x68\x2e\x75\x9e\x5a\x4b\xdc\xe3\x2e\xbd\x01\x24\x97\x62\x73\x73\x2a\xdd\xe2\x39\x52\xe4\x9d\x5c\xd7\x2e\xa3\x3f\x46\x97\x86\xa1\x52\x06\x15\xa4\xcf\x3f\x31\xa5\xaa\x68\x3f\xc9\xe3\x1b\xbd\x64\x1f\xbb\x06\xac\x56\xa8\xb0\x3c\xb4\xb4\xca\xc8\x1a\xc9\x03\xa1\x71\xf0\xc5\xf3\x77\x52\xde\x20\x08\x82\xa8\xed\x71\xd6\x6c\x7c\xa5\xc3\x40\x7e\xac\x65\x23\xee\xfa\x85\x62\x99\x3b\xe7\xd6\x25\x0c\x87\x35\x9d\x96\x54\xdc\x12\x31\xd5\x07\xba\x44\xa4\xe2\x7c\x8c\xec\x17\xc7\xfe\x52\x8b\x50\x7f\xf5\x37\x1f\x48\xfc\x8c\xad\xea\xb9\x61\xb8\xd0\x29\xc4\xba\xae\x83\x01\x80\x14\x9a\x3d\xe0\x75\xa2\xd9\x6e\x91\x07\x6d\x79\x11\xec\x45\x3f\xc7\xf7\x03\x89\xc5\x22\x16\x2a\x24\x7b\xdf\xd2\x9b\x28\xce\x6d\x46\xd6\x3d\x92\x76\x09\x54\xf8\xd9\x2d\x3b\x79\xa2\x95\x67\xd3\x4f\xfd\xb9\x4f\x8b\x03\x2a\xc3\x4e\xa7\x00\x2e\xc2\xa2\x8d\x41\xb4\xdf\xa8\xef\x86\x72\x43\xaa\xc5\x95\x06\xc0\x8c\x25\xbf\x00\x27\x0c\x64\x22\x71\x53\x50\x80\x96\x7f\x2c\xc6\xe2\x65\xee\x00\x24\x12\xa6\x86\x88\xc3\xa8\xbc\x30\xa7\xd4\x17\x6e\xbd\xb2\xd0\xd5\xef\x17\x99\x5b\x81\x3e\xc2\x64\xc0\x69\x5d\x56\xbe\x9f\xa9\x23\x93\xd0\xa6\xf8\x0e\xc8\xba\x47\xb1\x66\x9a\x91\xf5\xee\xdf\xf6\x8d\x6f\xc3\x69\x82\xce\x22\x89\x58\xb7\xf5\xd9\xff\x75\x22\x18\xf1\x36\x1e\xd9\x3a\x15\x9d\x39\x15\xcf\x6d\x21\xca\x69\x26\x76\xc5\xa4\x20\x4b\x7e\x96\xcb\x0f\x74\x0e\x95\x3f\x3b\xfd\x52\x18\xac\x50\x37\xc0\x2d\xe7\x23\xc8\x02\xfd\x1e\x92\x09\x33\xd2\x9a\xde\x22\x0d\x83\xb3\xdb\x5d\x57\xf8\xc2\x0c\x3c\x23\x86\x25\xd9\xdd\xc1\xe5\x42\xc6\xfa\x0d\xa7\xea\xa0\xaf\xb6\x87\xec\x1e\x1c\x43\x84\xd6\x5c\x97\x2d\xad\x65\x81\xa7\xec\x2b\x4f\x79\xf9\xd3\x71\x8a\x2e\xef\x78\x26\x0c\xf5\x18\x89\x34\x1c\xae\x3b\x46\xb4\xc5\x10\x91\x3d\x1b\xbf\x72\x59\x03\x8e\xd3\x03\xc9\xb9\x26\x1c\xd8\x59\xc8\x7d\x75\xfa\x3b\xf9\xd9\x37\xbc\x10\xee\x26\xd5\x7b\x55\x5d\xd8\x36\x38\x37\x08\xbc\xe2\xd1\x46\xeb\xaa\x3b\x0f\xe1\x2b\xe3\x1b\x88\x54\x66\xee\x7c\xed\x1a\x10\x5a\x1b\x04\x2a\xc1\x26\x4c\xed\x31\x46\x34\x43\xb6\xe2\xea\x70\x51\x91\xf5\xfa\xda\x43\x2f\xd1\x17\xea\x89\xe6\xf0\xd7\xa4\x1e\xdd\x70\xfe\xa0\xb8\xfe\xa0\xa4\x74\x79\xad\x1b\x68\x3f\xab\xb1\xac\x62\x33\xff\xb7\x17\x79\x5a\xfe\x1d\x04\x61\x6e\x33\xf1\x37\x59\xe7\xb4\x12\xe6\xb1\xa5\x48\x47\x81\xe6\xef\xba\x6b\x38\x3b\xd6\xca\x76\x52\xeb\x0f\x1c\x91\xbd\x93\xb9\x1f\x34\x98\xd9\xdf\xb4\x66\x07\x52\x0b\xe6\x3b\x6d\x00\xa9\xf4\x53\xf1\x3b\xbe\xc5\x1c\xe6\x34\x3c\x2f\x94\xe4\x80\x22\xd9\x91\x54\xf6\x05\x41\x3a\x80\x4b\x53\x5f\xbd\xd3\x3f\x01\x5a\x0d\x67\xb5\xd8\xef\x5c\x7e\x02\x2b\xbb\xc2\xe3\x1b\xea\xd7\xe8\xe0\x19\xb7\xe5\xfc\xdd\xa1\x76\x10\x7c\xe2\xa5\xcd\x4d\x55\xe4\x81\x90\x38\xf0\xed\x1a\x4f\x89\xc9\x18\x0c\x4c\x94\x61\x44\xe9\xcd\x2d\x83\x5c\x6e\x1c\xa6\xe3\xb0\x6e\xc1\x0a\x97\xd7\xf4\x2a\x41\xdf\xea\xb5\x24\xb2\xbb\x35\x3d\x8d\xec\x0a\x03\x34\x28\xd4\xc4\x91\x93\xa2\xe6\xbc\xb8\x17\xb6\xc3\x03\x21\xff\x9a\xb2\xd0\x76\xdb\x82\x65\x07\xf2\x96\xfa\xf4\x73\x8b\xc8\x87\x1b\x8f\x40\x5c\xce\x5e\xb5\x16\x3b\xb5\x16\x07\xc0\x6a\x83\x69\x90\x0e\xc2\x60\x48\x02\xb8\x88\x42\xa8\x90\x02\xb8\x8a\x6e\x9d\x65\xfe\xbf\x95\x40\xe5\xfd\x5d\x10\x65\x15\xab\x6c\xc9\x1d\x5e\xab\xc4\x79\x4b\x8b\xb0\x16\x26\x58\x4a\x1e\x03\xf2\xc7\xd9\xb2\xd8\xaf\x05\xe6\x6f\x19\xd9\x37\x12\x45\xcd\xea\x88\xbc\x57\x6e\x23\x5c\x7f\x43\x12\xfe\xc5\xa4\xc9\x36\x36\xe2\xc6\xc8\xb1\xa4\xb7\x81\xd5\xac\x20\xc4\x62\xb3\xa9\x6f\xe8\x99\xc0\xe5\x7c\x39\x7d\xe2\x95\x5f\xfc\x1c\x3b\xf4\x63\xc9\x11\x96\xdf\x37\x3c\x30\xd5\x5f\x35\xeb\x13\x80\x2a\x08\x28\x2e\x3b\x4f\x3e\x29\xd4\x6b\xb9\x8f\x2c\xb1\x58\x8e\x64\xc5\xdc\x2b\xbe\x78\xae\xcc\x0e\x08\x9b\xb3\x10\x4f\x9a\x1c\x37\x41\x95\xc6\xe7\x42\x8d\x3c\xcd\x1c\x23\x43\x5d\x93\x1e\x62\xfb\xc4\x47\xa4\x5a\x40\x65\xfc\xee\x5a\xd8\xb7\x9f\xf4\x73\xfc\xe0\xef\x12\x9d\x3e\x41\xc1\x8f\x72\xe9\x10\x9f\x36\x02\xe8\x93\xbf\xff\x88\xce\x9c\x48\xcd\x80\x82\x36\x44\x57\xd2\x5c\x97\x6f\x5f\x7d\xeb\x2f\xe5\xd2\xfd\x3e\x4a\x79\x1d\xd9\x1c\xae\xa6\x2c\x38\x51\x7b\x1d\x68\xe0\x72\x97\x59\x65\x99\x00\xce\xa3\xce\xf5\x83\x82\x9f\x79\x2f\x61\xe2\x78\x07\xac\xbf\xc8\x61\x88\x05\x26\x64\x7b\xa3\x59\x21\xc1\xff\xb8\x8b\x08\x87\x25\xe6\x38\x1b\x70\x46\x7d\x2c\xe8\xf3\xf7\x9d\x7f\x6b\xca\x5b\x28\x82\x77\x03\xec\x2f\x47\x77\x0f\x05\x12\xe7\xb5\xbd\xd8\xc8\xaa\xee\xa4\xd4\xe2\x5a\x98\xdf\xd5\x06\xf8\xb1\x9b\x52\xb6\x54\x16\xcf\x30\x95\xc3\xf6\x57\x2d\xb1\xfb\x07\xc4\x4f\x5a\xc7\xd2\x43\x55\xbf\x25\x1d\x97\x30\x18\xec\x37\x1b\x96\x30\x08\x32\x00\xd6\xea\x16\xa0\xba\xc2\x62\x7a\xc1\xb6\x7f\x2f\x51\x54\x47\x47\xaf\x9f\x21\x7e\xa5\xe2\x70\x72\x82\xee\xc8\x15\x94\xf9\xf2\x56\x00\xa6\x20\xf6\x3b\xfe\xdb\xc3\x1f\x8f\xca\x8e\xa4\x86\xa7\x3f\x86\x27\x7c\xfa\xa7\xc3\x46\x11\x05\x10\x65\x31\x3d\x9b\x0c\x4b\x1a\x32\x56\x44\xe9\xbc\x8d\x1a\x5f\x8e\x3a\x81\xbf\xd4\xf1\xb8\xac\xf1\xa8\xba\x53\x02\x19\x4a\xd2\x86\xc3\x9c\xe1\xb9\xef\x96\x42\x74\x00\xe0\x0f\x15\x4d\x88\x83\xf9\x06\xba\x2d\x8c\x94\x4d\xe3\xe7\xfc\xab\x0f\xdf\x77\x22\x2f\xb4\xc9\x5f\xd5\xcd\xe8\xaf\xc5\x61\x11\x37\xaa\xdd\xfc\x66\xb4\xd1\x3b\x16\xea\x4f\x00\xc4\x6c\xa5\x73\x20\xd8\xa8\x4c\x5a\x00\x2e\xd8\x7a\x88\x5f\xd2\xef\xd7\x40\x4d\x35\x75\x08\x4a\x6b\x4a\xd5\x91\x8e\xf0\x01\x96\x99\x21\xbe\x0d\xdb\xfb\xb5\x2f\x34\x2e\x95\xee\xf0\x2a\x7a\xf1\xa1\x71\xb6\x7f\x0c\x22\xd0\x67\xbf\x87\xfc\x08\x5a\x77\x66\x87\x15\x7b\x55\xfe\x6e\xda\x71\x95\xf6\x7d\xe3\xc4\xc3\x25\x50\xe0\x89\x6a\xc2\x4f\xaf\xc7\x4f\x8f\x02\x78\x00\x4c\x29\x10\x97\x54\x7c\xd9\x91\x74\x4c\xce\x2c\x84\x97\x34\x1c\x96\x24\x1c\x9a\x38\xd6\x93\x3c\x5e\xdd\x61\xb1\xc5\xb5\x28\xbb\x98\x71\x91\x41\x60\xb0\xc2\xac\xf9\xf1\xa1\x2d\x0f\x3a\x9d\xf5\xf6\x5c\xae\x92\xad\x98\x02\xac\x6a\xa3\x83\xd5\x90\x6c\x02\x4d\x89\x42\x72\xb0\xcf\x91\x13\x7c\xc0\x45\x07\xe0\x6f\xc7\xd7\xb8\xad\xc5\xae\x7c\x69\xb3\xbf\xb9\xcc\xcc\xaf\xa6\xaa\x4a\x16\xdc\x8b\xd5\x33\xf3\x15\x5c\x47\x4f\x78\x63\xa8\xb0\xd6\x76\xdb\x82\x18\x2f\x2c\x70\x53\xe4\x8a\x7e\x1b\x98\x2a\xb2\xc7\xc6\x9a\xb3\x23\x8e\x8a\xc4\x6e\xf4\x4e\x60\xfd\x03\x38\x3a\xdd\x59\xd6\xa6\xac\x15\x4e\xe9\xe9\x52\xf0\x31\x1e\xf7\xb5\x8f\x6c\xff\xc7\x3a\xf9\x15\xc9\x7c\x40\xb3\x3d\xf9\xeb\x76\x5e\x66\x3a\xb7\xe0\x1f\xa9\x6c\xe4\x16\x4a\x32\x63\x04\xfc\xdb\xa9\x30\xda\x62\xc9\xcb\x0b\xb7\x75\xa4\x3d\xdf\x05\x41\xb2\xcd\xd4\x77\x9f\xc3\xc1\x89\xf7\x50\x0b\x4e\x28\x33\xc6\x37\xf0\xf7\x4f\xff\x0c\xc8\xf5\x3f\x06\xdf\xab\x0c\x29\xce\x6e\x71\xdc\x76\x8a\x10\x72\x14\xdb\x1b\x0a\xa3\x25\x2d\x87\x59\x75\x35\xcb\x55\x59\x40\xe2\x6e\x10\x5d\x9f\x44\x7f\xfd\x41\xf1\x9e\xb1\x65\x6e\x4f\xb2\x21\x6a\x8c\x4c\x0c\x14\xd0\x71\x93\x41\x89\x63\x40\x06\x94\x9a\x27\xaf\x44\x83\xa0\x0b\x92\x06\xfa\x8e\x22\xc9\x01\x3f\x63\x6e\x68\x42\x34\x9b\x2d\x3c\x4f\x34\xf7\x1c\xa1\xec\x93\x69\x4d\x34\x8a\xf2\xf2\xdf\xcc\x88\xce\x6a\xb0\xfd\x41\x65\x6d\xd5\xc6\x14\xfe\xd7\x82\xb8\xfb\x66\x87\x39\x91\x90\xa8\x80\x16\xfb\x78\x3e\x7c\xc4\xa5\x21\xd5\xf6\xd3\x8a\x9c\xcc\xb1\x58\xd7\xac\xcb\x9c\x8e\x4f\x7e\x8d\xea\xb8\xcc\x69\x61\xea\xd9\x1f\x9f\x0a\x0b\x35\x55\x2b\x4a\xfa\x81\xe2\xee\x5b\xfa\xa4\xc5\x89\x64\xde\x45\x16\x23\x7a\x90\x16\xd7\x48\x0b\xa7\x1f\x08\xc5\xc2\xc5\x0a\xa7\x58\x19\xfa\x75\x17\xd3\xcf\x70\xd9\xa1\xae\xd8\x6e\x2b\x95\x96\xd5\x4d\x1f\x0d\xb2\xcb\x6b\xc1\xd4\x8a\xfc\x1c\xec\x76\xe4\x74\x59\xd3\x11\xcf\x19\xfc\xd5\xd7\x72\x5c\xd6\xb4\xe9\x83\xdf\x99\xad\x64\x1e\x8e\xcb\x92\xa4\xe1\xbe\x31\x0f\xf6\x9b\x57\xbd\x55\x5c\x09\x94\x9a\x30\x69\xd3\x7a\xdc\x42\xc3\x88\x08\xf2\x8d\x47\xf8\xb0\x91\x54\x16\x7f\xb3\xa1\xac\xd5\x45\x83\x2a\xee\xee\x8c\xe1\xd2\xe5\xc9\xb3\x7f\xcc\x4c\x8f\xc1\xa5\x44\x43\x92\x8a\xcd\xee\x31\xc4\x8e\x3f\xc7\xa9\x3d\xa1\xd2\x48\x9c\x2c\x33\x7d\x74\x59\x13\xa4\xf3\x0c\x3a\x7d\x09\xee\x05\x3f\x57\xc8\xae\x57\x78\xf7\x4d\xfd\xd7\xeb\x79\xba\x08\x83\x73\xe3\xd9\xb0\x96\x61\x48\x42\xfa\xca\x90\x29\x3b\x20\xf2\xe0\x1e\x19\x27\xc2\xf1\xee\xea\x1d\x27\xd2\x71\x59\x9b\xde\xf9\xa5\x6e\x2b\x41\x74\x15\x05\x70\x11\x68\x6e\xbf\x30\xb0\xa5\xf5\xa6\x08\x30\xb2\xec\x62\x14\x60\xe1\xd2\x47\x71\xeb\x31\x42\xa9\x2c\x48\xbc\xf2\x6b\xb6\x01\xa1\xc3\x01\x2f\xf9\xb6\x89\xa3\xdf\xb7\x13\x25\xc1\x3e\xb5\xf6\x92\xe6\xe4\x15\x00\x58\xbe\xd5\xe7\x8f\xed\x8b\x61\x43\x9c\x76\x45\x4a\x95\x91\xa9\x4b\x92\xd2\xc6\xa1\xc8\x2a\x7d\x5d\x1e\x20\x49\xf3\x00\x06\x52\xac\x74\xb2\xf3\x64\xe1\x0f\x65\xf0\xc9\x4e\x17\x18\xa1\x8b\x51\x44\xc0\xe6\xb4\x12\xe3\xc2\xd8\xff\x3c\x64\x6e\x5d\x5c\xdc\x72\x8c\xaa\x6f\x29\x7c\xf8\x42\x77\x47\xd8\x1e\xdd\x60\x22\x0f\xa2\x28\xd8\xa7\x18\x25\xed\x3b\x79\x0b\xd9\xe7\xdb\x58\x48\x2c\x52\x9c\xdf\x86\x16\xd2\xbf\x73\x72\x7e\xf9\xb3\xb0\xd1\x88\x95\x83\xe2\x0e\x83\x1b\x11\xae\xd7\xff\x79\x43\x57\xea\x28\xb1\x2f\xb5\xa7\x54\x28\xb0\xa2\x33\x1b\x12\xd8\x48\xa8\x06\xe1\x62\xa1\xd8\xc2\xb4\xf1\xa1\x50\x3d\x57\xe4\x57\xde\x0f\xc1\x81\xc2\x8e\x73\x6c\xcc\x53\x44\x47\xdf\x00\x4b\x02\x65\xc0\x16\xfa\x3f\xc4\x9c\x55\xae\xa9\x11\x85\xf3\x92\x31\x33\x46\xe1\x1e\x81\x96\x6d\x44\xe6\x15\x3b\x80\x8e\x43\x1d\xf9\x12\x0a\xf3\x7f\x4f\xa5\xf5\xfd\x4e\x49\x2d\x48\xd1\xe2\x10\x7b\x39\xe0\xc8\xe0\x0f\x6a\x38\x4e\x36\x0d\x3e\x80\xe8\x93\xac\x50\x9a\x89\x39\xce\x34\x90\x4e\x40\x2a\x12\xd9\x82\x63\x0b\x08\x2a\x21\x8c\x04\x04\x8f\x07\x3f\x10\xb2\x6c\x44\x64\x53\x2a\x5d\x66\x65\x8d\xbb\x7b\x79\x36\xfc\x43\x53\x49\xd7\xcf\x87\x26\xb1\x1d\x0c\xbe\xf5\x82\x61\x55\x21\x1f\xf4\xd5\x1a\xf1\xab\x61\x7c\xa3\x1f\xb2\xe2\x42\xdf\x94\x2e\x65\x01\xe8\x15\xf0\xc3\x29\x52\xab\x94\x4a\xe1\xd1\xa1\x2e\xdc\x7a\x5c\xda\x38\xd6\x09\xf7\x77\x87\x4c\x2c\xb2\x6d\xcd\xe3\xca\xf4\x1a\x5c\x13\x1e\x5b\xba\x5b\xe3\x4f\xa0\x4a\xf3\xc5\x95\xdf\x9f\xef\xfb\x53\xcc\x5a\x96\x55\xae\x5e\x3b\x67\x06\x39\x44\xd0\x6d\xe7\x77\x5b\x70\xe4\x11\x0b\x37\x7a\xf4\x43\xc6\x1a\x68\x6e\xbc\x1e\x08\x51\x80\x16\x5b\xb2\xa3\x38\x05\x14\x06\xc1\x55\x08\x96\xc1\x04\x29\x58\x79\xad\x2f\xaf\x4e\x49\x95\x6a\xd4\x68\xf3\x76\x03\xba\x31\xc9\xde\x03\x95\xde\xf0\xee\x23\xe1\x57\xe2\x6a\x81\x07\x81\xd6\x03\xde\xb7\x9f\x44\xc1\x93\x5b\x22\xa7\x6e\x8f\xc8\x3f\xa6\x10\xce\xab\xda\x62\x85\x25\xb6\x99\x49\x75\x98\x3a\x64\xd1\x03\x7a\x1b\xe1\x88\x12\x68\x75\xd0\xcc\x1b\xc9\x0c\x3e\x62\x6d\x6e\xa2\xe3\x27\x5c\x71\x36\x2e\x36\xff\xcd\x57\xf7\x60\x24\x9b\xd6\x58\x66\x0d\x4f\xe0\xd9\x70\xc7\x43\x82\xbd\x87\xca\x94\x3c\x05\x02\x1a\xad\xd0\x3a\x56\x92\xf1\x29\x01\x79\x9d\xfa\xee\x6b\x2b\xb7\x2a\xed\x60\x40\xa2\x8f\xd3\x4b\x87\x57\xc4\x32\x32\x5b\x5e\xb2\x67\x4d\x28\xc1\xaa\xcd\x98\xca\x9d\xf1\x10\xa3\x34\xa7\x42\x33\xb3\x5b\x9d\xd7\xb6\x30\x3b\x5f\xfb\xc5\x40\x54\x71\x04\xdb\x2f\x2a\x7d\x07\xba\x4c\x2d\x61\x3a\x2e\xb3\x86\x53\x40\xc7\xc3\x76\xa3\xf6\x9a\x18\x12\x37\x63\x8c\x9b\x0d\xd3\x95\x54\x73\xc2\xc7\xd6\x09\x56\xab\x2e\xff\x60\xb5\xb3\xcb\x70\xa8\xbe\xfb\xe6\xe1\x14\xa5\x38\xd7\x38\xf1\x34\xfa\x6f\x7f\xde\x8f\xb3\x9f\x50\xc1\x81\xa8\xe9\x60\x4e\x90\xe5\x5a\x8c\x3d\x33\xc5\xb8\xd2\xb0\x9a\x04\x3c\x71\x20\x15\xc9\x20\x4d\xef\xcd\x9c\xbc\xa7\x02\xce\x90\xc7\x7a\x55\x6c\x64\xf7\xf7\xb7\x0e\xe6\x97\x01\x58\x71\xff\x30\x1a\x41\x1a\x39\x49\x0c\x9f\x01\xe3\x3e\x5d\xef\x15\xcc\xed\xe6\xb7\xca\x34\xbe\x14\x41\x9d\x21\x64\xa1\x79\x0f\x78\x63\xf2\x66\xe4\x67\xf4\xe2\xf3\x2a\x73\x55\xca\xa8\x1b\x0c\x80\xde\x44\x04\x9d\x56\xa5\xbc\xff\x8b\x78\xba\xa2\x7b\x76\x2e\x24\xef\x61\xa0\xfe\xc7\xda\xa1\xd4\xab\x26\x8b\x48\x44\x61\x4d\xb1\x5c\xa4\x5c\x7f\xdc\xbd\xc2\xc7\x76\x44\xf2\x40\x7b\xcd\x84\xc9\xfb\x71\x5e\xb7\xba\x7d\xeb\xbc\x93\x5f\x93\xf2\x73\x7f\xed\xdc\x93\xfa\xd7\xf9\x09\x6f\x3f\x8b\x61\xfb\x12\x3b\x0d\x08\xd9\xdc\x54\x52\x9e\xde\x8d\xe5\x9b\xea\x76\x5e\x2f\x22\xdc\x37\x16\x0d\xd2\x61\xdb\x4c\x94\x3d\x3b\x8d\xf6\x3f\xdf\xa1\x03\x9a\xd9\x61\xfa\x41\x17\x51\xf0\x54\xff\xee\xf9\x6f\xad\x36\x5c\x61\xb7\xee\x94\x4e\x85\x92\x06\x43\x2d\x9f\x49\x10\xf1\x4d\x9d\xf5\x4e\x0f\x15\x3c\xce\xfb\x22\x1f\x8c\x87\xaa\xb6\xf2\xf9\xf0\x7b\xfd\xe6\xe3\x48\x96\xa7\x25\x00\xea\x7d\xd8\xbd\xfe\xab\x3b\x2b\xfa\x6e\xb4\xe1\x05\xc1\x7b\xc3\xdf\x90\x65\xf4\x88\x18\xe5\x87\xed\x15\xc6\xb3\x27\xcb\x90\x5c\x52\x62\x0c\xb9\x23\x1f\xbd\x53\x0a\xd3\x35\x37\xa8\x81\xec\x5b\x47\xa8\x2f\xba\xfd\x92\x84\xce\xd8\x0d\xf2\x7c\x8f\xfe\x3d\x28\x6e\x78\xb7\xdc\xc6\x82\x7c\xdd\x5e\x58\x4d\x5a\x30\x26\xd2\xf5\x6b\xb9\x4e\x22\x38\xfd\xa0\xb9\xe8\x05\x53\x4d\x44\xd8\x1c\x72\x46\x5b\xdf\xea\x04\x0c\x5c\xb7\x88\x18\x7d\x11\xfc\x7c\xb0\x58\x98\xf4\xda\x02\x45\x70\xfc\xe8\x87\xe6\x3a\x1f\x5c\x16\xb6\x97\x26\x7c\x64\xa1\x7f\xb4\x7e\xaf\xb2\x4d\xb8\x0b\x95\x35\xb5\xf1\x68\x72\x75\x6c\x3b\xdc\x12\x87\xc3\x72\x46\x1e\xbe\xaf\x6d\x4c\xc8\x3c\x63\xff\x3e\x0d\x6a\x3c\xf5\xa5\x76\x8b\x34\xae\x8b\x28\xf1\x07\xab\xee\x5f\x61\xea\x5a\x92\x06\x35\xe0\xa4\x39\xd4\xff\x0a\x46\xa6\x8a\x98\x89\xad\xff\xe5\xbd\x5f\xc4\xe3\xf2\x13\x04\x3f\xef\x49\x5b\xe1\xe5\x9e\xd2\xf0\x1b\xbd\xea\xa6\xf8\xd4\x7a\x6a\x28\xd6\xdb\x3b\x28\xb5\x5d\x97\x79\x73\xec\x31\xf1\x03\x8b\x61\x5c\x47\xbf\xb2\x97\x32\x9b\x5b\x9f\x43\xcb\x5b\x20\xba\xff\x12\xa2\xd9\x5c\x5d\xeb\x9e\xb7\x5f\xd4\x98\xe3\x0c\x76\x33\x3e\x9a\xaa\xe4\x1b\x66\x05\x75\xec\x56\x22\x47\xd3\x7c\xeb\x11\xad\xfd\x46\xb2\x38\x8a\x12\x0d\x5a\xea\x1a\xe6\xb6\x34\x66\x82\xab\x63\x6b\x72\x97\x58\x02\x18\x17\xf0\xfa\x83\x31\x6e\xa5\x6a\x43\xde\x60\x23\x9b\xb3\xa2\x10\x3a\xb6\x9d\x66\x70\xb6\x7a\xf0\x3d\x67\x3f\xba\x5c\x01\xe6\xb5\x5e\x4e\xa6\xa4\x13\x7c\x1f\xff\x9a\x99\x27\x54\xba\x79\x0d\xbf\xa4\x16\xc8\x80\xd2\x47\xf0\xe0\x6f\x5d\x9a\x72\x60\x6c\xd7\xd4\x87\x4b\xbd\xb6\x43\x1d\xe9\xe6\x50\x64\xb4\x44\xee\x3d\xa1\xb9\x39\xf5\xa9\xf1\x17\x2f\x36\x11\xd9\xf5\x42\xb6\x59\x4e\xd2\xf6\xaf\x2c\xc8\xf3\xdb\x2f\x31\x2b\x90\xfe\x88\x36\xe2\x29\x2e\x82\x04\x6b\x46\xbc\x77\x7c\x1b\x1a\xc0\x89\xb6\x37\x35\x27\x92\x85\xa9\x27\xc6\x33\xf2\xbf\x7a\xb7\x92\x86\xf5\x2c\xb3\x4f\x53\x55\x5f\x11\x05\x14\xcd\x9a\x0e\x8a\xec\x50\x90\x93\x91\x24\xbd\xa2\x83\xb8\xce\x8b\xe7\x27\x16\x3a\x66\xbb\xa8\xc1\x58\xf5\xbd\xec\x4b\x08\x3d\xef\xd6\x38\x0c\xdd\x1e\xd4\xb1\x3a\xba\xe2\x93\x2b\x62\x0f\x6b\xe2\x83\xe6\x7b\xa6\x5d\x16\xff\x50\x40\xa4\x2d\x58\x1f\x2f\xe1\x25\xe0\x4a\x59\x7d\xb3\x90\xbe\x63\x84\x31\xe0\xd3\xb4\x9c\xcc\xb9\xc2\x0d\x48\x7f\x14\x58\x9c\xd3\x97\x3c\xee\x19\xf1\x0f\x84\x5b\x92\xf4\x2a\xd6\x85\x90\x95\x78\x12\x49\x6e\x73\x73\xf8\x97\x3f\x21\xb1\x34\x83\x51\xa9\xe7\xe3\xcd\x7c\x78\x96\x02\x19\x90\x69\x39\x89\x2e\x9c\xfa\x99\x52\xf4\x62\x3c\x4b\x70\x3e\x43\x3e\xf8\x5e\xe1\x15\x8f\x29\x17\xa8\xcb\x76\x83\xf7\x87\x9d\x24\xde\xdc\xea\xbd\x2e\x2c\x93\x2d\x03\x7f\xea\x32\x6d\x8b\xc2\xd7\x78\xdb\x77\x1b\x01\x5c\x1b\x8d\x1a\x4f\x6d\xe4\xe2\xb6\x73\x3e\x0f\xe8\x25\x92\x22\x55\xb4\x0d\x10\xd9\xf1\x82\x60\xfb\x1d\x6d\x08\xc4\x74\x20\xa4\xa7\x4c\x7c\x7e\x6a\x28\x49\xc3\x08\x5e\x8d\x28\x8a\x76\x88\xb7\x40\xdf\x42\x9c\x6a\x3b\xa7\x22\x8b\x77\xae\x40\x9a\xdf\xae\x3a\xfa\x44\x16\xeb\xe3\xbf\xb5\xff\x9e\xd2\xc9\x20\xf1\x17\xfa\x2f\x95\xa6\xf9\x9a\x69\xb5\xb4\x75\x9b\xde\xbd\xd6\x0b\x8a\xf5\x8e\x5e\x3a\x1c\x29\xc4\xef\x0d\xbd\x1a\xf2\x95\xbe\x33\x3c\x1f\x56\xbc\x3e\xb1\x5c\xf6\x3c\x5e\xa0\x48\xcf\x79\x15\x1a\xcd\x85\xce\xb0\xa8\x37\x84\x88\x15\x73\x41\xcc\xbc\xb7\xd6\x67\x92\xa5\x28\x38\xa7\x0e\x07\x68\x14\xab\x1e\xfc\x56\xe9\x32\x18\xb3\xf1\x2f\x27\x44\xd2\x05\xcf\x0b\xa3\x90\xa4\xf9\xef\xdb\x6f\x2e\xbd\x96\x16\x47\x25\xc1\x76\x9b\xdf\xef\x3e\x61\xe2\xc7\xb3\x58\x6e\x4a\x19\x49\xa5\x08\x7e\x66\xfd\xf2\xe6\xc7\x9a\x1d\x7c\x71\xa1\xdb\x83\x53\x44\x36\x43\x6f\x09\x11\x06\x78\x46\x31\x20\x36\xae\x3f\x29\x04\x5d\x9e\x50\x56\xa2\xed\x2e\x37\xae\x4a\x29\x90\x33\xe7\x0c\x9d\x33\xdb\x40\x7d\x98\x5d\x47\x0f\xdb\x55\xcd\x8b\x80\xae\x3f\x86\x0e\x9f\xc8\x77\xaa\x3d\x6f\x6f\x4e\x14\x60\x75\x71\xaf\x48\x7c\x61\x2e\x2b\xa6\xce\x4c\xf4\x0b\x65\x83\xc9\x2f\x86\xe9\x6d\xc9\x4b\x76\x98\x38\xb7\xa5\x3c\xd1\x39\xf0\x79\x1d\x53\x95\x26\x05\x2a\xf1\x86\x78\x3e\x1e\x50\x23\x0c\x86\xcc\xfc\x76\x2c\x8e\xec\x96\xf3\xd9\xbc\x93\x5f\xbd\x93\x09\xab\xac\xaa\x85\x02\x8a\xca\x9a\x3e\x60\xba\xfc\x81\xa4\x5f\xac\x53\xdf\x6b\x8b\xf2\x94\x2c\x9e\x3e\x51\x5c\x7f\x20\x0c\x25\x9a\x3a\x1c\xc7\xce\xfc\x2b\x76\x84\x38\x52\x34\x3b\x14\xb1\xba\xec\x94\xca\xa8\x82\xb4\xb7\xb7\x52\x48\xde\xe0\x5b\xad\x6a\x79\x89\x10\xed\x5b\xec\xfc\xd8\x6b\x43\xb6\x4c\x2b\x0d\x37\xb9\x9a\xe9\xdd\x71\x5d\x89\xfd\x8a\x28\x4d\x99\x14\x7b\x32\xba\x4d\xb4\x5e\x96\x19\x06\xb2\xd6\x9d\xd6\x86\xef\x68\x8f\xfd\xe2\xa5\x18\xce\x61\x2d\x90\xa9\xcd\x2b\xda\x7a\xa9\xd0\x1b\x41\xa0\xdc\x18\xa6\x03\x92\xb2\xdc\x62\x52\xa0\x6d\xaf\xfa\x1f\x7b\xe7\xbe\xf6\x43\x18\x78\x8f\xea\xdc\x76\x98\xc4\x86\x0c\x7e\xc6\x8d\x6e\x81\x08\x73\xca\x48\x60\x51\xdf\x5d\xb3\x8c\x22\xe9\x71\xb3\x18\xf0\x33\x9a\x12\xa4\xf8\xfb\x7b\xc4\xcd\xad\xbb\xa7\xcf\xde\x55\x6e\x4d\xf4\x71\x7b\xb0\x37\x00\xeb\x2e\x3f\x64\x0e\xdf\x0d\x18\x6e\xbb\xa3\x49\xc1\x24\xaa\xc1\x0e\x81\x11\x41\x1a\xc4\x4b\x04\xa4\x3f\xef\x07\x6b\xfb\x5e\x29\x80\xf2\xb2\x6d\xa4\x0d\xc4\xbe\xa9\x8f\x20\x11\x8d\x59\x4d\x38\x00\x1a\x08\xa9\x1d\x08\x81\x45\x28\xd2\x41\x60\x01\x88\xab\x87\x9a\x1c\x3c\xb8\x0e\xa5\x46\x29\x50\x82\xf9\x39\x8b\x99\xdd\xbb\x86\xff\xc6\x40\x65\x4a\x71\x6e\x34\xae\xd1\xc5\x30\x49\x03\xa3\x91\xc7\x7e\xdd\x8a\x6f\xb7\xae\x5b\x0a\xaf\xf8\x11\x92\x27\x42\x47\x74\x1c\x06\x63\x32\xe0\x67\x36\xe1\x20\x48\x95\x96\x04\x72\x34\x08\xe0\x4d\xd5\x2b\x20\x48\x14\xfa\x54\xba\x35\xb6\x12\xe7\x16\x92\x49\x9f\x86\xbf\x66\xce\xc1\x78\xaf\x64\x9b\x81\x5e\xec\x39\x4c\xb8\x14\x68\x39\x0c\xe7\x86\xa0\xf2\xe7\x2f\xa7\x6a\x8f\xa7\x76\x88\xe9\xb2\x89\xb0\xcc\xab\xd9\x42\x8c\x97\xc8\xbc\xdc\xfa\x4b\xf6\x62\xd0\xa2\xba\x33\xbb\xfe\xab\xb5\x70\xbf\x9e\xad\x29\xbb\xac\x18\x8b\x97\x79\xa3\x7b\x4b\xba\xb4\x24\xe8\x2d\x2c\x84\x3f\x61\xe5\x3a\x8d\x21\x09\xfd\x07\xca\xf9\xe2\xd9\x33\x02\x28\x94\xd9\x60\xee\x95\x15\xa4\x5e\xf8\x57\xd7\x3b\xb6\xf4\x3d\x36\x02\xa1\x01\xad\x51\x95\x76\x3e\x35\xee\xde\x35\xeb\xf1\xc3\x5f\x93\x00\xea\xb5\x41\x6b\xc6\xdd\x94\x61\x4e\xff\xfa\x25\x34\x7e\xf8\x93\x48\x00\x64\x87\x9b\x4f\x0c\x48\x88\x07\xe1\x44\xb3\x1d\xff\x45\xdf\xd3\x03\xb9\x6c\x99\x92\x48\xf2\xe9\x41\xa8\x94\xa4\x51\x40\xa0\x21\x55\xf3\x1d\x88\xc6\xc7\x19\xe8\x7b\xfd\xef\x92\xc6\x07\xee\xf7\x60\x0a\x60\x23\x6e\x7c\xc5\x23\x79\xf9\xd3\x04\x02\x77\x7d\xd8\x28\x17\x42\x36\x76\xca\xec\x9a\x9b\xfc\xf2\x48\xd0\x3b\x99\x9e\x62\xc9\x8f\x6c\x50\x6a\x16\xd7\x1d\x44\x4e\xe9\x17\xf5\x3d\x78\x01\x6a\x38\xe2\x4b\x0e\x89\x9f\x31\x4b\x18\x30\x66\xad\x13\x89\x75\x04\xf0\x7a\x30\x40\x9d\x3c\xdf\x2a\xd5\x88\xe6\x1d\xc8\xe9\xb1\x94\x65\xc5\x9f\x2c\xd7\xae\x04\xff\x71\xde\x7f\x07\x7b\x36\x99\x33\xef\x11\x0a\xe2\x91\x85\x3f\x79\xf8\x33\xed\x08\xb4\xd0\x68\xa1\x14\xab\x8c\x06\xdc\x2c\xa6\xe4\xcc\x46\xfc\x4f\xa2\x02\xe3\xab\xec\x3b\xb7\xa0\xb3\x85\xf2\xd2\x92\x5e\x30\x69\x82\x20\x09\x9b\x45\xe3\x8a\x2b\xf3\x97\xcc\xf6\x49\x59\xd0\x8e\x41\x56\xed\xb4\xfd\xfd\xe5\xec\x88\xc3\x22\xe2\x18\xc9\x8d\x7d\x2b\xcc\x91\x12\xd9\x5e\xb5\x07\xf1\xe5\x39\x60\x62\xc9\x89\x68\x80\x74\x97\x7d\x13\xc8\x3f\x36\xae\xc5\x65\x48\x92\xba\x1a\xf0\x8a\x4c\x53\x6f\x61\x19\x5b\xbc\xcf\x4c\x92\x3e\x98\x1a\x15\x35\x47\x35\x25\x50\x69\xed\xd4\x67\x50\x32\x51\x94\x30\xd4\x77\x1c\xc8\x1c\x25\x95\xa7\x61\x05\xc1\x46\x7c\x4a\xd5\x95\x5e\x6c\xe6\x58\x6c\xe6\xac\x02\x89\x92\x03\xad\x6f\x9f\x94\x37\xff\xd3\x68\x9a\x9e\x2e\x74\x0c\xfb\x85\x88\x26\x1c\x28\xbc\x78\xcd\x4d\xb2\x03\xea\x4d\xbd\xa9\xf4\x72\x66\xd1\xc3\xef\xf4\x5c\xd6\x9c\xaf\x8e\x51\x04\x59\x00\x1d\x38\xcf\x87\x8c\xbf\xe7\x45\xc3\xf2\x1c\x4c\xfe\xdf\x70\xb9\xba\x56\x63\x0a\xf5\x97\x69\xa5\x1c\x31\x15\xd7\xf5\xdc\xd4\x25\xbf\xe6\xfa\x7d\x1e\x7a\x7f\x13\x37\xd0\xc7\x17\x4a\xc4\x66\x87\x47\xf5\xed\x17\xdb\x8b\x24\xed\xc5\xce\xe7\x62\x6a\x9d\x0a\x7e\xa5\xcc\xca\x8e\x5c\x9a\x52\x08\x67\x08\x89\x13\x80\xbd\xd8\x3a\xd0\xc8\x90\x9c\x18\x22\x34\x92\xef\x27\x39\x50\x1a\xd6\x6c\x78\xac\xe9\xb8\xf1\x56\x71\x3f\x43\xc3\x08\x76\xca\xdb\x70\x61\x79\x70\x61\x7c\xb9\xc4\x63\xc0\x62\xfd\x7b\xb5\x79\x68\x1e\x74\x58\xae\xde\xc9\x9f\x0f\x1b\x36\xba\xa6\x63\x4f\x86\x2f\x50\x95\x3b\x52\x45\x28\x4d\x76\x30\xf1\x9a\x9b\xc3\xe4\xcf\x48\x5d\x13\xf5\xe1\x14\x98\x22\xcd\x1c\xeb\x8f\xd7\xe2\xaa\x2b\xec\xcc\x25\x9b\x99\x24\x44\x83\x78\x19\x7d\x1e\x04\xe1\x9d\xd1\xd5\xf4\xe1\xe0\x93\x72\xe2\xfb\x9f\x76\xf1\x51\xdf\x1a\xfd\xc9\x01\x78\x71\x05\xab\xf5\xe5\x28\x52\xd4\x05\x6f\x43\xc6\x6a\x7d\x58\x73\x53\x95\xce\x7f\xf2\xa7\x97\x96\x44\x0b\x82\x7f\x0a\x95\xc0\xb3\x28\xdd\x3c\xcc\xed\x9d\x68\x86\x94\xd4\x17\x36\x27\x94\xbc\x82\xf9\xee\x36\x27\x60\xb9\x79\x13\x1b\xe1\x0d\xaf\xa2\x54\xda\xe3\xb3\x9c\xc0\xd8\x8e\xf4\xce\xab\x7a\x65\x07\x42\x9f\x28\x48\x1e\x60\x80\xc0\x07\x59\x9e\x3e\xfc\xd2\x95\xb2\xc1\x04\x50\x29\x03\xd4\x1f\x6e\x90\xe4\x5a\x93\xab\x43\xf5\x42\xb8\xd0\x3c\xfa\x77\x1e\x35\x84\x49\x46\x72\x66\x03\x1e\xfe\x80\x49\xd2\x7a\xbc\x4c\x58\x67\xb1\x09\x7c\xcf\x1d\x20\xf6\xcf\x60\x0a\x82\x20\x63\x61\xe0\x9a\x30\x5e\x06\x65\xae\xfb\x39\x50\xd8\x72\x24\x2b\x04\xa2\xdb\x7f\x00\xa1\x76\xeb\x7d\xa0\xc4\x4e\x4a\x08\xc7\x7c\x12\x28\xfc\xd8\x7d\xb8\x89\x22\x33\xa0\x43\x76\xfd\x1f\xd3\x0b\xb3\x2f\xb0\xf8\xef\x4b\x5e\x20\xb7\x6e\x20\x73\x86\x9f\x1f\xb0\x37\x5e\x36\x8e\x28\xc4\x72\xdd\x72\x4e\xb3\xd3\xc3\x41\x16\x0b\x51\x46\xe7\x15\x6d\x3b\x62\x9c\xf8\x9e\x19\x5f\xf2\xf8\x17\x40\x1c\xe7\xb5\x91\x2b\x61\x36\x3d\x20\xcd\xa0\x04\xa0\x56\x69\xa9\x9d\xca\x93\x6a\x33\xa7\xbd\xb2\x5a\x71\xa3\xdd\x60\x37\x46\x0a\x05\x30\x2c\x0e\xf3\x9e\x4f\xd9\xbe\x22\x6f\x80\x6c\x7e\x94\x49\x5f\xb1\x92\xd2\xb7\x8d\x94\x7c\xb0\xc2\xff\xf2\x36\x2b\x21\xae\xf5\x98\xa5\x92\xd1\x00\x30\xc4\x30\xad\x7b\xbc\xdd\xe0\x9a\xfa\x52\xe8\xef\x6f\x1c\x65\x55\xd7\x0e\x4f\x52\x4c\xad\xd4\x6c\x4a\x97\x67\xb2\x68\xef\x48\xb7\xa1\x58\xc7\x9b\xc9\xdb\x58\x6e\xf8\x41\xe0\x3f\x0d\xfb\x17\x63\xae\x3c\x2d\x64\x39\xeb\x22\x1f\x10\x4f\x5a\x54\x92\x8a\x17\x5c\xe7\xa0\x40\x65\x1e\x51\x89\x2e\xb8\xb9\x40\xd7\x23\x93\x30\x08\xa2\xe4\x40\x35\xfe\x4b\x64\x29\x70\x75\x44\x1d\x5e\x19\x99\x31\x4f\xfd\x2e\x62\xc1\x47\x93\x4f\x33\x28\x04\x05\x8a\x90\x35\xbf\xab\x7a\x82\x43\x0a\xa1\x79\x2d\xb5\x16\xdb\xfe\xc6\x9f\x6a\x4d\x9e\xeb\xb3\xe7\xde\x4f\x69\xe8\xca\x61\xc5\x08\xdb\x14\x99\x67\xe3\xa6\x37\x32\x60\xf1\xc7\xbc\xda\xf4\x2d\xd4\xc4\x90\x71\x2c\xb2\x0d\xe7\xfe\x25\x97\x79\x11\xe4\x66\x35\x9a\xfd\x27\xda\x7f\xf4\x3d\x31\xa1\x70\x4f\x0b\x9a\x56\x68\x1d\xa1\x24\xa3\xd0\x08\xcb\x28\xac\x2b\xf1\xf7\xdd\x87\x9a\xab\x85\x99\x81\x80\xf9\xab\x6f\x3a\xcb\x3a\xfd\x1e\x74\xa5\xd5\x61\xb1\x75\xb7\x9c\x6c\x7a\x2c\xb2\x67\x29\xb2\x27\xc4\xa6\xd0\x57\x1e\x48\xce\x97\xec\xe8\x06\x03\x24\x78\x7e\x8b\x8f\xfd\x18\x59\x09\x35\xaf\x77\x30\x80\x69\x2c\xef\x19\xbe\x50\x18\x94\x3f\x85\xe6\xc3\x99\x8a\xd1\x85\x10\xeb\xf8\xc0\xfd\xc6\x72\xef\xc2\xd7\x3f\xfb\xb5\xfb\xdd\x39\xfd\x90\x02\x22\x81\xb6\x3c\x68\x56\xd3\x9f\x3d\x2a\x61\xc0\x66\xd7\x2c\x0a\x42\xef\x89\xc1\x80\x27\x91\xd6\x2b\x3a\x1e\x45\x27\xbe\x0d\x2d\xcc\xcd\xf0\x61\xc8\x7b\xa8\x69\x0f\x42\xbb\xab\x8f\xec\xbe\xf6\x23\x12\x73\x22\xd2\x7a\x16\x58\x38\x84\x1e\xdd\x4b\xb9\xbe\xe4\x9f\x32\x1b\xb1\xf3\xda\xfd\x46\x41\x40\x0f\x25\x64\x45\x91\x1d\x71\x06\x27\x02\x48\x21\xd1\xca\x8a\xca\x94\x0a\x00\x94\x6d\xe5\x9c\xb8\xa3\xc7\x17\xd3\x95\x18\x79\x33\x39\xa6\xb6\xff\x18\xcd\x7f\xaa\x3f\x1d\xf1\x5b\x79\x59\xd2\xf0\xc4\x4a\xe9\xc4\x2a\x69\xc0\x7b\x3a\x0f\xab\xce\x5f\x54\x4f\xa9\xee\x84\x3e\xbf\x94\x2c\x5e\x78\xc5\x44\xb6\x8e\x1f\x3c\x45\xd8\x9a\x51\xfc\xca\x43\x4f\x1e\x88\xa4\xb5\x4f\x30\xb1\x38\xbc\xb9\xe0\xb7\xbd\xfd\x57\x67\xc8\xda\xa8\xac\x05\x00\x40\xd5\x52\x39\x59\xf6\x7e\x1b\x83\xad\xcc\x09\xa8\x9e\x52\xe6\x38\x1b\xcb\x2d\x07\x2e\xb3\xfa\xda\x65\x1e\xe2\xe0\x77\xdf\xd4\xf6\xc9\xcf\x77\x66\x8e\x64\x4c\xc6\x5a\x5c\x2e\x88\xd6\x1f\x68\xaf\x15\xe9\x0f\xcd\x46\xde\xb6\x79\xd4\x36\x89\xf6\xcf\x23\x76\xb1\x5f\x29\x3b\xa6\x2b\xdd\x03\xf2\x49\x1f\xc7\xbc\x9e\xc4\x16\x0c\xe8\x12\xe3\xb0\x82\xa2\x76\xdb\x4a\x9e\x7a\xa8\x08\xbe\xd0\xdd\x7b\x62\xe9\x3e\x35\xab\x0c\xc3\xd4\x8c\x30\x08\x76\x60\x4f\xa8\x50\x60\x2a\x37\xaf\xee\xf8\x79\x41\x10\x04\x29\x5c\x5e\xbd\x07\x6b\x8c\x7d\x00\x39\xaa\xbc\xeb\xba\xae\xba\x30\x2f\xac\x0c\x4a\x0c\xfc\x3c\xab\x6a\x6e\x2f\xc2\xdc\xd0\x2f\xf8\x2f\x76\x87\xdb\x32\x79\xc0\x1c\x42\x4c\x3e\xe2\xdf\xb1\x8d\xca\x9a\x9e\x5b\x8d\xc9\xdc\x69\xd4\xbe\xc4\xde\x95\x97\xec\xd0\xbf\x33\x2b\xe4\xd1\x63\x7e\x87\x31\x7e\x36\x43\xce\xdb\x43\x01\x8e\xdc\x75\xc9\x57\xcf\xae\x70\xf0\x4c\xc6\xb3\xe4\x12\xb8\xe2\xa3\x7b\xc2\xa0\x70\xfe\x80\x08\xda\x83\xa1\x5a\x10\x69\xf0\x3b\xd5\x2d\x23\xdb\xad\xb0\x6b\xdc\x37\x7e\x09\x0d\xd2\xd7\x8b\xaf\x85\x39\xb9\xe1\x83\x43\x84\x29\xf1\x14\x50\x99\x2f\xdd\x79\xcb\x9a\x8c\xd0\x4f\xe1\xe2\x88\x5b\x54\xbb\xe7\x05\x6c\x45\xf3\x7b\x52\x6c\x01\xd1\x78\xf9\x4b\xb1\x34\x94\x2f\x55\xff\xcb\xbf\x6c\x1d\x8b\xb5\x30\x86\xf0\xdb\x2f\xa5\xce\xd8\xee\x00\xd0\x50\x2f\x6e\x46\x9c\x9b\x12\x96\x9e\x46\x03\xa3\x05\x5a\x30\x47\xe6\x42\x87\x52\xf9\x17\x01\xfb\xc1\xcf\x16\x34\x21\x50\xdc\xe9\x65\x63\x3f\x31\xfb\x81\xfc\xbb\xff\xcb\xc6\x62\x03\x2e\x3c\x9f\x65\xbd\x9e\x8a\xea\xa9\x6b\xa0\xe9\x26\x08\xda\xeb\x07\x1c\x34\x6b\x67\xe6\x38\xc3\xb9\x2c\x98\xa6\xcc\xd8\x76\x18\x61\x76\x1e\xd5\xed\x67\x20\xa6\x0a\x71\xc2\xc6\xe2\x42\x38\x36\x61\x67\x92\x34\xce\x6f\x21\xd2\xd1\x59\x62\xea\xd0\x5c\x88\x19\x1c\x12\x3c\xef\xa4\x69\xc3\x9f\x2b\xbd\xa5\x6b\x2c\xb1\xdd\xf0\xaa\x5c\x90\x94\xa9\x54\x1a\x9b\x7d\x66\x9c\xfa\x99\x3d\x8e\xed\x4c\xc8\x0c\x1c\xd4\x3b\xbc\xb3\x6c\x4d\xf3\xc1\xd2\x19\x37\xc5\x31\xff\xf8\x5e\x64\x7b\x47\xb5\x4d\xe4\x10\x9b\x86\x79\xc3\xa0\x5f\x64\xce\x64\xec\xa0\x76\x65\xd0\x22\x81\x7a\x66\x58\x5a\xe6\xa0\x9c\x1f\x4b\x7d\x78\xca\x3d\x19\x1d\xc1\x11\x83\x61\x29\x1c\x94\xcf\x1e\xec\x92\x4f\xaf\xc7\xfd\xc0\x3a\xfe\xf5\x2b\xb1\x7f\x76\xca\xeb\xc5\x43\x97\x82\x03\xc1\x96\x9b\xe8\xb0\xe3\x07\xba\x4b\x6c\xb1\xca\xd5\x83\x3e\x79\xd4\xea\x96\x70\x16\xce\xd6\xf4\x2c\x78\x5d\x2d\x8f\x66\x4d\x1d\xf6\x0b\x34\x4b\x38\xdf\x41\xb8\x56\x51\x2b\x6f\xcb\xd0\x92\x85\x77\x83\xc0\x0f\xb4\x87\xa4\x6f\xc2\x12\x7d\xe5\xf7\xe7\x77\xb6\x01\xa1\xd9\xb6\x8b\x67\xa4\xb0\x8a\x28\x80\x0d\x2d\x5b\x56\xb5\x9d\x69\x93\xf4\x44\x98\xbf\x81\x2d\xd8\x12\x9f\xe5\xf3\xd5\x95\xbd\x78\x0f\xfd\x9f\x0c\x1b\x9e\x7f\xed\xb2\x9b\x57\x3a\x13\x52\x9c\xd6\xde\xba\xf1\xb1\xe2\x9b\xce\xaa\xda\xca\xd7\xe7\xa7\xe5\x74\xc2\xd6\xb9\x6f\xbf\x1d\xcd\x28\x65\x05\xea\x08\x8b\x49\xbb\xfe\x1b\x8f\xe4\xa6\x1e\x51\x46\x87\xe4\x60\x01\x12\x81\x0c\xa3\xfd\x4e\x95\xb7\xb1\x3f\xf6\xf0\xc4\x84\xd2\x3f\xe1\xf1\x03\xd6\xae\x7f\x8a\xe6\xf6\xeb\xba\xaa\x1d\x93\xaa\xb6\xf0\xb7\x66\xda\x78\xac\xe9\xd2\x08\x87\xb3\x5e\xe5\x1d\x90\x2d\x8f\x3e\xb3\x03\xcb\x7d\x06\xad\x92\x57\xf6\xf1\x5c\xc6\x31\x7d\xcc\x6f\x92\xc3\xb9\xe6\xe3\xed\xe0\xdc\xff\xdb\x1f\x00\x93\xc3\xb9\x96\x87\x38\x79\xec\xc0\x1f\xe0\x06\x93\xa2\x98\xf4\xcc\x4d\xa9\x40\xf0\xf3\x03\xcb\xce\x0d\x47\x09\x29\xc0\x55\x04\x92\x89\x66\x98\x1a\x34\xde\xd1\x55\xd6\xe6\xb8\x2d\xd9\x60\x8a\x34\xbf\x9a\xe8\x58\x5f\xb0\x1d\x3e\xb1\x03\xb8\xa8\xce\xe9\x4b\xe0\x13\xcd\x0e\xcd\x85\x9f\xcc\x55\xda\x79\x55\x57\xbd\x91\x43\x4f\x33\x90\x3d\x4e\xdd\x79\xb3\xfe\x35\x0f\x78\xc0\xae\x67\x65\xaa\xb2\xb8\x7a\x5b\x31\xd3\x9d\x51\x1e\x4b\xda\x6c\x24\xcc\xad\xe5\x1f\x7e\xa9\x96\xa7\x6e\xf9\x13\xa5\x4a\xcf\xf0\x15\x25\x56\xce\x6d\x54\xda\xd8\x94\xbc\xb9\x56\x71\x0e\xca\x16\x43\xa4\x5b\x18\xc8\x38\x3e\x54\x03\x4e\x85\x8f\x4c\x59\x74\xa5\x38\x37\x31\xe0\x3e\x45\x60\xd6\x5f\xf7\xe0\x2d\xe8\xd5\x3f\x91\x87\x89\x7f\x35\xbc\x95\xad\x5d\x7f\x54\x7e\x02\x6d\xb3\xb6\xff\xfb\xef\xfb\xe9\x48\xc0\x26\xe1\xdf\x00\x66\xec\xf4\x20\x50\xf4\x94\x6f\xc6\xcd\x79\x51\xac\x4f\xa6\x98\x89\x5b\xe7\xc2\x7d\x52\x3a\x37\x7d\x13\x3d\xa7\x62\x8f\xeb\xc4\xab\xc9\x05\x21\x7b\x81\x06\xb7\x60\x66\xad\x0b\x6a\x38\xd6\x77\x4a\x94\xa0\x9c\xf8\x0c\x6b\x71\xb1\x84\x46\xe9\x09\x7f\x15\x5f\xa6\xbf\x84\x81\xee\x13\xd1\x66\xb8\x53\xe9\xbd\x89\xcf\x2d\xef\x66\xe0\x4c\xfd\xf6\x87\x02\x2a\xa1\x59\xec\xaf\xce\xbb\x1a\xce\x39\x50\x83\x68\xcb\xcb\xd1\xdf\xad\xeb\xa0\x76\xd3\xfa\xe8\x51\x97\xf2\xd2\xb2\x44\xad\xea\xba\xf0\x91\x5e\xf1\xeb\x81\x93\x66\xe3\xa4\x31\x24\x98\x92\xb4\x9b\x22\xd7\x08\x90\x60\xc3\x5d\x8c\x44\xc9\x9b\xeb\x02\x66\xb3\xc2\xaf\xe7\x3f\x1f\x3e\x4a\x88\x2c\xd0\x0e\x2f\xe5\x83\xbf\xb4\x3f\x3e\xda\x82\xf5\xd3\xba\x5f\xf8\x00\xa0\x4e\x1e\xe6\x27\x23\xf7\x60\x8f\xff\x04\x13\x81\x63\x98\x22\x4b\x69\x80\x7f\x38\xfb\x3d\x34\x5c\x2c\xd9\x4a\xec\x1b\xf3\x0e\xc1\x30\x24\x9c\x77\x72\x8c\x20\xf4\x8c\xd5\xf4\x5f\x2f\xf2\x2c\x61\x6e\xbb\xe5\x6d\xe4\x9d\x64\x0b\x3b\xfc\x40\x77\x2c\x24\xef\x40\x98\xc1\x25\xf3\xab\x7f\x9b\x66\xc0\x4f\xf9\x95\xea\x6f\xc1\x00\xb0\xbd\x91\xf0\x8b\x17\x81\xcb\x0d\x69\x61\x86\x24\x0c\x1e\xdf\xe6\x07\x82\x24\x81\xea\x68\x1a\x8e\x91\xeb\xbd\x5e\x0d\x76\x39\x80\xf9\x4e\x76\x20\xd3\x97\xe3\x37\x53\x0c\x3d\xf7\x81\xf0\xc6\xb8\x5b\x4c\x0e\x52\xf0\x4b\x16\xaf\xe9\xba\x32\x0b\xe5\xd7\x33\xfb\xd1\x14\x56\x20\x02\xf9\x14\x27\x72\x87\x0f\xd4\x92\x58\x4d\x5b\x10\xd1\x41\xc1\x96\x20\xb5\xac\x46\x1b\xfc\xfe\x6c\x2a\xb3\x5b\x49\x7d\xf7\xf5\x8c\x30\x33\xff\x8c\x91\x76\x6e\x20\xff\x98\xd1\x9c\x57\xa5\xfd\xf3\xca\xb6\x2e\x61\x27\x9a\xff\x31\xe5\x42\xfa\x83\xe4\x50\xef\xff\xb1\x74\xd6\x5a\xd3\x32\x4b\x14\xbe\x20\x02\xdc\x42\x9c\xc1\xdd\x32\xdc\xdd\xb9\xfa\xb3\xde\xef\x3f\x93\x4c\x32\xb0\x58\x3d\x5d\xb5\x9f\xdd\x54\x57\x5b\xef\x1b\x73\x75\xc9\x8f\xb4\x73\xcd\x0c\x1c\xd9\xd0\xf1\x4b\x0d\xc6\xc3\xa6\xb0\x99\x5d\xae\xd9\x05\x90\x93\x04\x99\x5c\x0b\x39\x80\x8d\x94\xab\xd7\x74\x5c\x52\x82\x2e\x25\x4e\xf8\x03\xcd\xf7\xcb\x1b\x67\x46\x32\x6b\xb2\xf5\x73\xc4\xdb\x38\x14\x1d\x5f\x61\xf7\x50\x75\xf7\x2d\x84\x17\xce\x1b\x52\x2a\xb7\x30\x8e\x6d\x48\xa5\x0e\xe1\xf8\x41\xec\x17\x21\x9d\xa3\x25\xb0\x36\xaf\xf1\x82\x39\x4e\x66\xaa\x0c\x04\xa3\x62\x23\xd3\x24\xce\xff\x75\x1f\x4e\x91\xec\x36\xf0\xfc\x9b\x3c\x2d\x33\x25\xaa\x82\x83\x56\x87\x21\xe6\x9c\xd9\x4d\x56\x9c\x08\x9b\xbe\x4b\x85\x5f\x80\xd1\xf9\xb0\x98\x9b\x3a\x6f\xfc\x5b\xaf\xda\x37\xe6\xa1\x67\x96\xed\xaa\x08\x6e\x4c\x48\x1b\xf1\x32\x29\xaf\xc9\x51\xfa\xed\x62\x30\x50\x34\xa7\x0f\x33\x56\x60\xea\x4c\x38\xce\xc5\xd8\xff\xd5\x2d\x3b\x24\x61\x88\x66\x07\x46\x9d\x16\xc8\xac\x8d\xbf\x0d\xef\x53\x5e\x32\x79\x9c\x17\x4c\xd2\x30\x42\xe5\xaa\x18\x07\x87\xba\x0c\x92\x29\x2c\x48\xc1\xc4\x1c\xb7\x2f\x03\x33\xff\xfb\xcd\xfe\xc4\xac\x71\x1c\xa4\x29\xf1\xec\x03\xbe\x54\xc7\xdf\xae\x70\x34\x71\x28\x53\x68\xd4\x30\xb7\x97\x1c\x48\x5b\x2f\x6a\x2a\x3d\xad\x72\x77\x6d\xf5\x60\x21\xcd\x05\xd2\xea\x0f\x8a\x4d\x95\x96\xce\x74\x0d\xcc\x88\x88\x30\xcc\x4a\x1b\x8f\xb2\xb7\x20\x8e\x58\x89\x75\x16\x1a\x47\x08\x6f\xaf\xee\xff\xdb\x57\x3d\xc8\x44\xf2\x20\xea\x13\xeb\x79\xfb\x16\x3f\x22\xe8\x67\xcf\xab\x50\x7c\xaf\x54\xa9\x8e\x45\x16\x45\x71\x3a\xf6\x02\xbe\x86\xf4\xbe\x6c\x47\xbd\x6b\xb1\x43\xb5\x05\x1f\x36\xa2\x40\xf6\xd8\xfb\xa7\xc7\x52\xdd\x72\xb7\x25\x83\x40\x65\x92\xbb\x69\x5b\xc4\x99\x23\x95\x09\x80\xf7\xec\x1b\x4f\x42\xd1\xe5\x35\xd9\xb8\xd9\xce\x2b\xa1\xb7\x4e\xe2\x9f\x21\x7f\xde\xe0\xcf\x60\x40\xcc\x8a\x8f\x49\xc4\x66\xd6\x4d\x8c\xb1\x78\x71\xf7\x29\x62\xaf\xa8\xe1\xeb\x50\x87\x15\x3a\x22\x9b\x0f\x1b\x9f\xad\x1d\x79\x16\x1d\x07\xfe\xe3\x65\xa3\x49\xa8\x1e\xab\xa9\xd8\xaa\x07\xc6\x77\x4b\x4f\x26\x4b\xf4\x30\x9d\xdb\x9c\x39\x3e\x58\xbf\x9f\x63\x66\x9b\x52\x5d\xf1\xae\x7f\xba\xe7\xcb\xfc\xac\x73\x77\x29\xbe\xe6\xed\x7f\xb3\xc6\xdd\xd7\x85\xaa\x19\x22\xe0\x8e\x66\x3c\x05\x73\xe4\x67\xa4\x0d\x41\x10\x84\x52\xec\x26\x55\x8e\x1a\x9f\xdc\x3d\x44\xc3\xe3\x1e\x0f\xd3\x54\xb5\x6b\xfe\x6c\x3b\x4c\x22\x39\xbd\x4b\xbc\xd8\x2a\x30\x8d\x29\xf3\xbb\xb9\x02\xd3\x40\xda\x70\xe6\x63\x54\xdd\x2a\x8f\x17\x06\x13\x0e\x13\x9a\xd8\xbf\x85\x7e\xc9\x16\x49\x6f\xd4\x30\xf5\x76\xeb\x57\xea\x16\x80\xd6\xf8\x31\xd3\x4d\x51\xa0\xf9\xf5\x99\xa7\xe8\xaf\x9b\xf8\x57\x00\x1b\x36\xc3\x06\xd4\xa8\x14\x51\x08\xef\xab\x64\xa6\x68\x76\x88\x02\x4f\xe6\x2c\x4e\xef\x77\x22\xcf\x80\xec\xfb\x05\xf7\xaf\x05\x07\x6b\xb4\xdf\x00\x3d\x16\x86\xd5\xc2\x3e\x5a\x3b\x3d\xec\x25\xcd\x36\xa7\x55\xb5\x18\x31\x95\x08\x5b\x3a\x02\xc2\x6f\x86\xd8\xef\xf0\xce\xb3\x35\xcd\x06\x54\x21\x91\xde\x43\x05\xa2\x13\x30\xb7\xdb\xaa\x01\xf4\x92\xa7\x56\x33\xc9\xca\xad\xeb\xba\x99\x8f\xee\xb4\xa3\x30\x46\xfe\x5b\x58\x6d\x6f\xb7\xf4\x4f\x7c\x47\x65\x4c\xe8\xb2\x4b\x04\x38\xfe\x08\x8b\x71\xde\xe8\xc3\x38\xa0\xb2\x70\xa0\x9a\x98\x7b\x5d\xd7\x74\xb7\xf2\x07\x30\xfd\x58\xa8\x39\xd6\xc1\xcf\x6c\x02\x62\x14\xca\xac\x76\x1f\x14\xaf\xc7\x6f\xa3\xba\xe8\x15\xce\x52\x05\xea\xa1\xc2\xf3\x27\x4b\x23\x33\x8c\xe3\xfe\xb4\xff\x4d\xe9\xf2\x8d\x63\xdc\x60\x37\x83\xcb\x3c\xd1\x1d\xfe\xc2\xc3\x16\x86\x85\xf3\xfa\xcc\x98\xbe\xe6\xdf\x71\x21\xaa\xd4\xcc\xc9\x98\x9c\xd9\x4c\x0a\x3f\x7b\xa9\xf4\x64\x64\x22\x1b\x94\xff\xf8\x6b\x8e\xd4\xd2\xea\x15\xe4\x85\x8e\x5f\x06\xbf\x12\x89\x4c\xd1\x86\x0e\x30\x6f\xdf\xa6\x21\x3a\x54\xce\xd7\x05\x72\x57\x64\xe7\x60\xd4\x1c\x05\x44\xbf\xae\xb1\x84\x50\xe0\xf4\x58\x72\x67\x0a\x2c\xd7\x2e\x6e\x38\x9c\xbf\x8d\x3b\xb7\x56\x7e\x18\x06\x41\x48\x92\x2e\xaf\x88\x7f\x23\x77\x37\xf1\x39\x65\xdb\x1d\xd3\x1b\xe7\x07\x02\xd7\x55\xed\x7a\xfb\x2a\x09\x76\xfb\x80\x7e\x3f\x4d\xcc\xb4\x1c\xd3\xaa\xee\x7c\xf7\xbe\x98\xdf\x8e\xf0\xb6\x9c\xe0\x30\x62\x27\x5d\xa6\x59\x96\xfb\x49\xc4\xb0\x02\xdd\xf3\xfc\xe3\x4e\xd3\xd5\xd7\xf5\xc7\xa9\x35\xd7\x38\xac\x6b\x5b\xbc\x2c\xd7\xd5\xc9\xe6\x24\x8c\xa3\x85\x13\x6c\xe5\xb6\x90\xe0\x46\x59\xf8\x37\x59\x66\xd0\x15\x60\x90\x18\x05\x1a\xc0\x41\x06\xad\x6a\xbb\xcc\x42\xcd\x32\xeb\x9e\x03\x45\xa5\xfa\x13\x80\xdc\x43\xe2\xfa\x9a\xb8\xde\xbd\x00\x65\x05\xcf\x73\x3f\x3e\x47\x7f\x88\xd1\xd5\x75\x24\x3d\x7b\xfa\x2a\x5d\x4b\x4f\xd1\xe9\x69\x15\x0b\xdd\xdc\xf8\xa6\x99\x57\xc3\x50\xdf\x0b\xa7\x92\xe1\x56\xb4\x76\xe1\x37\x31\xec\x6d\x16\xa5\xd5\xc9\xf6\x70\x89\x4d\x02\x81\xb5\x16\x02\x37\x6f\x44\x36\x01\x7a\x72\xa6\xc8\x9d\xf2\xf9\x3b\xdb\x11\x2c\xc7\xfd\x60\x0e\x3e\xb2\x40\x07\xf1\x46\x3e\xd6\xb3\x98\x12\xd8\x30\x8e\x9e\x00\x15\x8f\xd9\x81\xea\x26\x24\xfb\x54\x91\x7d\xc3\x86\xf3\x92\xbb\xe3\x0d\x8c\x75\xaa\xaa\xca\x94\x33\x8d\xec\xd4\x71\x5d\x6b\xac\xd2\x6d\xed\x60\x6c\xf6\x17\x66\x06\xf1\xe5\x05\xb1\xb8\xaa\xef\x72\xee\x16\x10\xb8\xea\xf5\xb8\xc4\x73\x13\x8f\x81\x02\x65\x79\x90\x22\xee\x6d\x0a\x94\x7a\xce\xef\xe5\x62\xdf\xf9\x31\x0f\xe7\x8e\x9b\xd1\x10\x07\x71\x8b\xc6\xae\xdc\x84\xc1\x90\x24\xc2\xb1\xc3\x20\x08\xd6\xf5\xce\xfc\xca\x97\x8a\x04\x4f\x78\xcc\xd7\xfd\x52\xb5\x9d\xe7\xf3\xb7\xeb\x31\x24\x1e\x3f\x4e\xef\xc7\x74\x6c\x66\x44\xc5\xe9\x12\x72\x02\x64\x7e\x8d\xae\x44\x14\xb2\x2e\x60\xd3\x7d\x73\xc8\xdb\x33\xfa\xec\x92\x1e\xb8\xa9\xcf\x35\xe5\x0e\x61\xd4\xd3\xbf\x7d\xf1\x29\x2b\x13\xdd\xc3\x3c\x64\x20\x0b\xa5\xc1\xbd\x0e\x81\xd2\x12\x5a\xa5\x4d\xa4\xf5\x2c\x28\xec\xaa\x95\xbd\x0e\x89\x12\x6d\x6d\xd4\xae\x35\xc6\xf4\x92\x19\x6b\xe4\x0b\xff\x1d\xcb\xf6\x52\x95\x85\xa6\x85\x5d\x77\x43\xb5\x41\x04\xb4\xdf\x07\x3c\x48\x4e\x9b\x6c\xbf\xd5\xac\x67\x83\xcf\x90\x64\xd8\x47\xbf\xb4\x64\x0e\x5a\x54\x5f\xda\x66\x6c\x7a\xa9\x4b\xe5\x81\x1b\xb0\xb5\xc2\xe2\xee\x5d\xcb\x51\xf6\x7d\xd8\x92\xb5\x8d\x8e\x34\xb1\x88\xfb\xa1\xc4\x63\xb1\xb6\x53\x5f\x36\x68\xc3\x97\x31\x7d\x7f\x8e\xbb\xae\xc3\x56\x7f\xf3\x81\x93\xb2\x25\x33\xe7\xd5\xec\xc6\x2e\xb9\xf4\x2e\x4e\xd3\x71\x58\x51\xf2\x80\x14\xf1\xaa\x1b\x1d\xb7\x16\x84\xfc\x7d\xb0\x21\x74\x0e\xc8\x49\x37\xea\x1e\xa4\xb8\xc2\xd9\x61\x4a\x99\x32\xb8\x93\xff\x2b\x65\x27\x10\x8b\x71\x2d\xfb\x45\x75\xe1\xb7\xb9\x0e\xc6\x66\x7e\x66\x84\xed\x01\x40\xb3\x54\x0a\x56\x13\x0a\xa2\x13\x2c\xf4\xfb\x7a\xae\xbe\x95\x1d\xab\xa3\x02\x60\xd7\x30\xf8\xc9\x41\x04\x0d\x5a\xe4\x4f\x14\x1b\x3f\x94\xbb\x81\x92\x54\xc4\x54\x7a\xa2\xe0\xf5\xce\xf8\xdc\xa8\x48\x3a\x16\x97\x4d\x16\x5c\xd9\xbd\x22\xa1\x80\xb0\x88\xcf\x9a\x3e\x4a\x9e\x3a\x44\x56\x6b\x87\xf8\x6d\x7b\xdc\xe5\xe0\x74\xde\x58\xda\xaa\x8d\x3b\x43\x95\x25\x8f\x1e\x5a\xda\xf4\x58\xca\x6a\x56\xa7\x5e\x86\x6e\x42\xe7\x50\x9b\xfa\x1e\xbc\xbb\x2a\x7f\xfc\x02\x43\x72\x3f\x86\x88\xce\x47\x28\x46\xef\x75\x4c\x75\xbf\x47\x77\x85\xd5\x81\x8e\xbd\x50\x32\x5c\xc0\x6f\x3d\x10\x1d\x28\x97\x3f\x9b\x61\x5a\xbd\xd3\xbf\xdf\x6b\xfc\x32\x9e\xa6\x75\xdf\xd6\xa4\x73\x1c\x04\x23\x63\x61\x45\x1c\x92\x32\x12\x1e\xfa\x1e\x54\x21\xd4\x82\x33\x1d\x93\xd1\xd1\x2a\x8b\x3a\x73\x4e\xa7\x65\x17\x32\x97\x49\x7b\xf3\x5e\x31\x85\x1e\x9b\xed\xb3\xfa\x00\xf0\xd2\x6b\xee\x61\xd3\x86\x47\xab\x16\x6b\xe3\x51\x39\xed\xa8\x69\x9c\x7d\xea\x1a\x2a\x6a\x7d\x77\x76\x52\x2e\xbb\x77\x8d\x3b\xd1\xea\x14\xb8\xf7\x0e\xd1\xa2\xc7\x57\xdb\xa4\x52\xca\xd9\x60\x82\x2e\x97\xd3\x7f\x8c\x97\x39\x24\x34\xda\xc6\xc9\x5b\x6a\x5b\xfb\xf4\x4b\x33\x51\xaf\xfe\x89\x73\x3a\x44\xc9\x89\x52\xf2\x5c\x45\x64\xcd\x41\x85\xec\xd0\xc7\xf8\xe5\x6d\x58\x56\xdf\xac\x87\x63\x9e\xee\x6a\x66\xc0\xa2\x35\x3d\xbf\xdd\x17\x44\xf6\x0e\x2b\x3d\xd5\x6c\x96\xe1\x98\x01\x3b\x45\xfe\x77\x06\x82\x15\x21\x6a\x92\xc3\xfe\xbe\xa5\x88\x32\x34\x69\x35\x60\xc0\x88\xfd\xbe\xc2\xaa\xef\xbd\x0e\xc2\x20\x08\x0e\x54\x63\xd8\xcd\x27\xc7\x63\x24\x4b\x7b\x7a\x39\xbf\xca\x4b\xcb\xe3\x0f\xc6\x64\x34\x79\xf1\xe5\x1c\xf5\x07\x8b\x19\x1c\x85\xfd\x15\x80\xac\x83\x69\x23\xcf\x4a\x77\xef\x9b\xba\xae\xed\xc8\xb1\x35\x8d\x16\x42\xe0\xaf\x65\xd4\x60\x94\x5c\xf7\x19\x46\xb3\x22\xa6\xc6\xb2\xc3\xb5\x25\x85\xdf\xa6\xf2\x7c\x09\x05\x00\x15\x98\x97\x5a\x0c\xa5\xdd\xab\x77\x24\xfd\x02\x9d\xd7\xde\x4d\x03\x2e\x6a\xe9\xa1\xe4\x81\x0d\x23\xa4\x7e\xfc\x25\x2b\x18\x09\x13\x34\xb2\xb9\x0b\xd3\xa7\x0c\xc3\xd9\x42\x93\x67\x2e\xe1\xe6\xeb\x3a\xaf\x84\x8b\x0a\x75\x44\xb5\xc0\x7b\xcf\x2a\x52\x05\xf3\x9e\x01\xcc\x1d\xff\x1a\x5f\x7d\x13\x8f\xd0\xaa\x26\x2e\xc5\x39\x95\x14\xc8\x40\x49\xfa\xc5\x2b\x80\x2a\xa9\x50\x95\x3b\xa7\x35\x11\x46\xa1\xec\x72\xc2\xce\xdf\xb9\xfd\x5b\x07\x3e\xfa\xb7\xc6\x4c\x4e\x68\x74\xcf\x4f\x64\x3d\x08\x96\x54\x6d\x52\x2d\x8c\x12\x67\x80\x7e\x67\x7f\xde\xdc\xaf\xd3\x27\xdc\x99\x33\x49\x73\xd0\x82\x73\x62\x4c\x0b\xb7\x00\x3a\x34\x17\xef\x33\xc1\x28\x58\x86\x1a\x46\x22\x7d\xcf\xed\x20\xde\xd4\x31\x52\xa9\xf6\x57\xb5\x5d\x91\xac\x18\x55\x53\x63\x15\x18\x21\x8b\xef\xd7\x8c\xfe\xba\x2e\xab\x2b\x00\x8d\x77\xd3\x5a\x89\x96\x68\xb6\x0b\x1c\xe0\xbc\x67\x6a\xd0\x55\x20\x93\x8c\xc0\xd8\xb7\x0f\xc2\xa3\xd3\x27\x2d\x57\x0c\xd2\xd8\x6c\xc2\xfb\x1e\x9d\x88\x5c\x73\xad\xb2\xf1\x8f\xdb\x38\x50\x6c\x41\xba\xc3\x4b\x08\x37\xf9\x63\x2d\x3d\xd6\x8e\xc4\x10\x2d\xae\x5f\x80\xed\x41\x12\x06\x53\x82\x14\x75\x7d\xdd\x6c\xe9\x77\x33\xbd\xa5\xd2\x86\x10\xc6\xc8\x67\x4a\xef\xb6\xa1\xf7\x3d\x33\x02\x1f\x59\x38\xbb\x77\xa6\x7c\x3b\x06\x54\xe7\x17\x2f\x96\xe0\x9d\x53\xb5\x20\xeb\x41\x76\x38\x59\x9c\x53\x75\xc0\xf2\x84\xf5\xaa\x94\x19\xe3\x4b\x15\x60\x71\x7a\x3e\x64\xcc\x04\x75\xfe\x31\x5b\x8d\xd4\x11\x12\x22\xb7\x44\xcf\x3a\xed\xbd\x52\xa9\xf0\x7b\x99\x94\x01\x18\x45\x03\x37\x99\xdd\x9c\x12\x27\xd9\xad\x36\xc5\xa8\xb5\xf8\xd2\xe5\xc4\x1f\xa4\xd8\xc2\x06\x72\x65\x27\xba\x98\xec\x80\x66\x21\x55\x45\x9f\x12\x5c\xff\x7a\xf5\x58\x28\x4a\xb9\x1a\xcf\xf4\x6f\x61\xf6\x13\x92\x16\xc0\xe6\xbf\xb9\xc6\x31\x83\x6f\x31\x8c\xf3\x07\x05\x8e\xda\x2f\x7e\xc7\x43\xe0\x9a\x9a\xfb\x26\xbc\xf7\x61\x69\x6f\xbe\x64\x62\x02\x78\xbf\x3e\xba\x81\x09\x79\x93\x27\x8f\xc4\x15\x2e\x4f\xfb\x38\xbd\x36\x0a\x36\x18\x1a\xba\x01\x7c\x9d\x68\x21\x7e\x5a\xce\x57\x94\x5b\x03\xd3\x71\xd4\xd4\x71\x08\x97\x4c\xc2\xc0\xe0\x30\x8c\xb9\xba\x42\xa4\xbe\x3b\x9e\x5f\x91\xb7\xf4\xbb\x75\x02\x56\x74\x74\xf1\xa8\x02\x85\x90\xaf\xea\x7b\x79\x10\x6d\xf0\xf5\xac\x47\x9f\xb2\x83\x99\xde\xd9\xbb\xc8\x48\x1a\xc0\xa8\x9c\x9b\x26\xf3\x5c\x59\xf8\xa3\x57\x03\x66\x57\x50\x36\x68\x22\x0c\x17\x51\xfc\x13\xd9\x3a\x17\xf5\x6f\xae\xa7\x03\x2f\x13\xab\xcc\xb1\x88\xc1\x00\x30\xdb\x9d\xfc\x57\xad\xd1\xf6\x80\xd6\x84\xdf\x02\x2f\xd4\x11\x4c\x98\xdf\x9e\x49\xcd\xec\x6a\x1a\x47\x9c\xd7\xd6\xb7\x8e\xd9\xbb\xd7\x45\x01\x95\x15\x5c\x20\xd6\x96\xd4\xd0\xb9\x32\xe5\x32\x0c\x83\x07\x70\x10\x38\x11\xf3\x45\x60\x6a\xec\x85\x92\x14\x91\x0f\xdf\x85\x82\x59\x4c\x18\x3e\x79\x59\xbb\x89\x0e\x54\xd5\x6e\x6b\x5f\x4c\xa8\xf5\xda\x69\x87\xad\x5d\x91\xab\x90\x3f\x95\x32\x7b\x48\xe7\xab\x0b\x26\x31\xf0\x66\xae\x07\xec\x6e\x53\xed\xe8\x4a\x9a\x63\x24\x18\x9c\xe8\x89\x6b\x90\x3a\x3d\x6a\x50\xec\x28\x70\xc3\x12\x3e\xb2\x48\xee\x1e\x28\xb3\x26\x2f\xa6\xc3\x2b\xba\x68\x60\x02\x12\x2e\x39\x43\xd2\x18\xeb\xe8\xc3\x97\xd0\x1f\x78\xfe\xd4\xeb\x5d\xe5\xf6\x1a\xb8\xb5\x05\x21\x88\xc4\x28\x98\xbe\x01\x65\xb6\x1a\xcb\x1c\x29\x79\x9e\x65\x0e\x00\x2c\x9f\xdc\x13\x28\x2b\xaf\x79\x67\x81\x66\x0f\x63\x56\xfe\xa5\x2e\x6d\x78\xf1\xd4\xab\xf2\x91\xd5\x20\xbb\x85\xd2\x39\x50\xf1\x11\xf8\xd5\x25\x50\xc4\x7a\x3b\xad\xfd\x6b\x71\x6f\x0e\x9b\x6f\x0f\xdd\xd2\xf4\x72\x59\x93\x1a\xc8\xe8\xe5\x47\xb8\x05\xfc\xf5\x17\x2f\x48\xfc\xa6\xaf\x4e\x2b\x84\x7d\x44\xd6\x3e\xea\xe3\x3e\xaf\xef\x79\x6b\x7d\x0a\x54\x32\x28\xe2\x9a\x73\x9b\x09\x0d\x94\x57\x26\x09\xc5\x89\xc8\x32\x28\x23\x64\x71\x1d\x21\x59\x28\x33\x60\x3f\xd7\x68\xf6\x90\xff\x63\x46\x0b\x91\x9c\x0a\x6a\x1c\x0c\x2a\xbd\xec\xd3\xdf\x7d\x53\xc5\xfc\x0c\x7b\x14\x4a\x18\x4c\x55\xdb\x79\x1d\xbd\x64\x24\x32\x0a\x2c\x65\x9c\xce\xf2\x12\x3c\xaf\x48\x04\xc0\x3d\x10\x9d\xfc\x25\xa0\x8b\xb7\x75\x4d\xe5\xab\xbc\xd3\x55\xdf\xe4\xd9\xed\x74\xa2\xe4\x8e\x85\xdd\xdb\x35\x05\x01\xc0\x0b\xcf\xb5\xa5\xd8\xc7\x10\x6c\x31\x14\xac\x76\xc7\x34\x3c\x67\x09\xb7\xa0\x51\x72\xd3\xc7\xa0\x1f\xa2\xad\xef\x95\x18\x2e\x11\x0c\x49\x20\xe0\xb3\x1f\x88\x4f\x51\xf1\x4c\xdf\x94\xa4\xd8\x55\x7a\x59\x3f\xb5\xc4\x6c\xec\xaa\x34\x12\xbb\x34\x71\x28\x72\xdc\x30\xbc\x12\x96\x2b\x30\xe3\xec\x1c\x2d\x38\x7b\x26\x5d\xd1\x86\x2a\x03\xbe\x17\x51\x04\xf7\x73\xa8\x51\x97\xf5\x42\x4c\xbd\xfc\x58\x55\x11\x77\xbc\xfa\xfd\x10\x58\xfd\x57\x8f\x4e\x9c\xdb\x5c\xdf\xb7\x58\xf4\x3a\x4f\x96\x08\x39\xa2\x75\x2c\xb0\x54\xa8\x7a\x42\x63\x0e\x7d\xe6\x33\xae\xe8\x18\xfd\x0a\x5a\xc4\x5f\xd0\x2b\x20\xdd\x10\xe3\xb2\x46\xc6\xf8\xa5\xc4\xbe\x49\x9e\xfd\x04\x04\xe5\xf2\xbf\x6f\x81\x24\x4f\x39\xa1\xa2\x4f\x06\x2f\x69\x66\x38\x3d\xdc\x25\x7f\x4b\x8e\x2d\x08\xa0\x48\x2e\x67\x83\x80\x70\x58\x92\xe2\x44\xfd\x21\x3a\x3f\xfc\xd6\xf9\xec\x40\x88\xe6\x4a\x84\x20\xb7\xb4\xfe\xbe\x73\x4b\x60\xf2\x10\x03\x2d\x1c\xed\x88\x8e\xe3\x41\xae\xee\x0d\x00\xcc\x2c\x08\xc8\x59\xa6\x1e\xf6\x30\xe7\xeb\x3c\x7d\x8e\x6d\xb9\xb1\xc2\x37\x75\xc6\x96\xca\xca\x9a\x60\x4e\xe0\xba\x8f\x38\xfc\xad\x5e\x83\x85\x20\xd9\x6f\x2d\x49\x8c\x2b\x4d\x85\x84\x34\x13\x8b\xd8\x37\x47\xf5\x48\x0b\xde\x1f\x9c\x80\x6e\x30\x1c\xd9\x89\x68\x09\x55\x03\xc9\x58\xfc\xe6\xca\x7c\xb1\xdd\x9e\x55\xae\xae\xdf\xff\x8f\x83\x89\x81\x12\xe5\x4c\x83\x36\x03\xce\xbf\x7d\xed\x67\x74\x8b\x83\x3f\x6f\x82\x4d\x55\xde\x32\xdf\x73\x81\x17\xcf\x92\x5f\xd1\x83\x91\xe5\x62\x2f\x22\x78\x41\x6f\x60\xbe\xdf\xc7\xf6\xf8\x62\xe3\xdd\x2b\xf2\x9c\x92\x84\x41\xe0\x07\x45\x3b\xfa\x90\x2d\x24\x06\x22\x71\x86\x91\xb5\x5b\x80\xd0\xf8\x89\x66\x07\xd2\x5c\x0b\xff\x9a\x9d\xf1\xa2\xc9\x0b\xb6\xb7\xbc\xf2\x68\x01\x65\x86\xd4\x30\xbb\xce\xbd\xfb\xf6\xfb\x12\x8a\xa4\xdc\xba\x0f\x44\x27\x64\xf1\xbb\xb9\x4a\x0f\x94\xe0\xa7\x80\x79\x9b\x81\xe8\x17\xc3\x25\x5f\xaa\xb7\x05\xfc\x54\x45\xa9\xd3\x18\x4a\x8d\x50\x19\x86\xdf\xab\x77\xf9\x74\x8a\xd5\x20\x66\xc2\xb7\x8f\x43\xb8\x41\x36\x31\xa4\xd7\x15\x66\x31\xd5\xfe\x56\xc7\xd9\xb7\x51\x04\x72\x96\xad\x1f\xb6\xa9\x65\xc0\xfd\x92\x84\xcf\x66\x5d\x26\x80\x69\x73\x09\xab\xf7\x9c\x1d\xe9\x2d\xa4\xe4\x35\xb0\x45\x8d\xf1\xa3\x80\xca\x14\xb0\x4b\xbc\x60\xed\x47\xc4\xac\x87\x14\x53\xd2\x69\x5d\xd9\x4b\x9c\xcb\x39\x1d\x5e\x59\x38\x93\x98\xa9\x6f\xf8\xf9\xa4\x60\xfa\xe8\xf9\x35\x22\x1c\x5a\xc6\x0f\xbc\x0e\x1d\xea\x7b\x7c\x16\x0e\x27\x4b\xbb\x47\xdd\x49\xf2\x43\xbc\xf9\x83\x90\x8e\xdb\x0a\xed\x81\xa6\x08\x6e\xd4\xd9\x3a\xad\xba\xfb\xd6\x81\xde\xab\x88\xd7\xd8\xe4\xfc\xb7\xa4\xe1\x40\x57\xe4\x24\x42\x06\xd7\xce\xed\xd9\x77\xc2\x6b\x9c\xa4\xb3\xbf\xd5\x2a\xd5\xec\x4c\x5e\xd6\xf4\x41\x0f\x1e\x87\x12\x31\x99\xcf\x5e\x0f\x47\x9d\x22\xc3\xf2\x77\x9f\xfd\x0b\x42\xec\x2d\x4c\x81\x59\x45\xa8\xed\x70\xe4\x08\x37\x00\xac\xe8\xb6\x88\x67\x25\x2d\xac\xc9\x9b\x2b\x89\x6b\x87\x7b\xad\xac\x51\x10\xa9\x1b\xba\x99\x62\xe1\x0d\x40\x6b\xdb\xf9\xd4\xfe\xe6\xce\xe0\x47\x8a\xe8\xe4\x11\x65\x46\xe6\x73\x0b\xe8\x98\x8e\xcb\xfa\xc7\x45\xfb\x68\x65\xf4\x40\x55\xf3\xdb\x5f\x1a\x09\xfe\x1a\x4e\x16\x41\xed\xa5\x58\xb0\xba\x84\xf7\xbd\x5d\xba\x3c\x91\x6e\x26\x52\x61\x7f\x71\x08\x87\x38\xb0\xfd\xd7\x53\xd0\x9a\x36\x81\xf8\xb1\xfa\xc8\x3b\x8a\xb4\xee\xf0\x4e\x9a\x2f\xbe\x13\x49\x0b\x3a\xe1\x85\xce\xdd\xbb\x03\x95\x15\xe9\xa1\x80\xeb\x99\x0d\x42\xba\xec\xa5\x3a\xa9\x9e\x97\xcb\xd9\xea\x39\x71\x4d\x75\xd1\xe1\x6f\x91\x72\xbe\x6b\x44\xba\x56\x68\x67\x06\xa5\xf0\xb9\x19\x9d\xd1\x3c\x13\x6d\x74\x21\xb2\x9b\x56\xe2\xcf\x3c\xd0\x3f\xfd\xc9\x64\xb7\x3f\xb4\x16\xad\x11\xf2\x05\x4c\xb9\x1b\x5e\xeb\x62\x28\xa9\x75\x1e\x98\xc0\x4b\xb4\x42\x65\xad\xed\x03\xf2\x70\x9b\x9a\x30\x3d\x01\xfb\xe9\x94\x4a\xf7\xc3\xa6\x85\x4f\x11\x05\x1e\xbf\x58\x33\xf8\x51\xa0\xd1\x7f\x49\x13\x47\x22\x61\x20\x49\x1a\x62\xab\xd4\x21\x9d\xd2\x47\x5f\x63\x90\xd1\x41\x80\x05\x06\x02\xc1\x03\xa5\x52\x3f\x63\x3a\x91\xcb\xfa\x64\xb9\x77\xcf\xa1\x76\xbc\xaa\xed\xe8\x92\x74\x7c\x9b\xad\x2a\x35\x58\xc2\x35\x36\x11\x38\xf9\xf5\x6d\xf0\x7d\x8d\x5f\x5e\x09\x38\x3a\x6f\x9a\x8b\x14\x66\x84\x4a\xcf\x4d\x55\x02\xb3\xe1\x73\x9a\x8e\xc6\xf8\x61\xb9\xa6\x0c\x53\x07\xd3\xcb\x84\x57\xeb\x4a\x02\xb4\x53\x25\x44\x62\x10\xe5\x34\xf3\x11\x93\xd6\x43\x2d\x31\x42\x4a\xd2\x85\x13\xb0\x3d\x9f\x3a\x2e\xeb\xe8\x86\x81\xd0\x52\x7a\xc9\xcf\xd7\xe7\xdd\x52\xa2\x07\x2e\x3d\x7b\x62\xab\x28\x89\xc3\x04\x10\xdd\x39\xef\x68\xf5\x49\x96\x67\x66\x8c\x70\xb8\x72\x11\xc6\x03\xde\x20\x3a\x79\x91\xe6\x88\x5d\xbf\xb7\x56\xfd\x32\xf9\xcd\x5f\x20\x30\xc7\xee\x49\xdc\x39\x9c\x16\xd5\xd3\xc7\x4e\xe2\x33\x79\x9e\x01\x41\xbc\xb0\xd3\x90\x3b\x50\xc1\x41\xab\x7e\x6e\x4f\xab\x94\x0c\xe8\xc0\xbb\xb4\xa0\xdf\x19\x71\x4a\x32\xc6\x12\x5f\x13\x66\xfb\xc3\x7b\x5b\x0e\x87\x25\x45\xa3\x0b\xfa\x89\x4d\x8d\xab\x86\xec\x89\x00\x6b\xa2\x19\x65\x32\x90\xc1\x87\xa3\x0f\xf2\xf5\x9b\x9f\xd1\x2b\x86\x0d\x4c\x07\x6c\x12\x7a\x03\x0a\x9f\x6f\xff\x08\xae\x60\x1f\x84\x4e\x5b\x3f\x9f\x63\x6c\x81\xa3\x3e\xeb\x23\x69\x7f\x83\x3f\x4f\xc1\x80\xea\x67\x3d\xa1\x45\xcd\x19\x90\xea\x4c\xcd\x0d\x6d\x3c\x6a\xa5\xd2\xfa\x0d\x3f\x28\x30\x6e\xb0\x4d\xef\x37\xc2\xae\xf3\xa3\x96\xac\x9f\x89\xfc\x69\xd6\xac\x89\x2d\xe2\x43\xfd\xba\x23\xc7\x96\xfe\x69\x38\x9a\x3d\x0f\xf3\x22\x1e\x2c\x5c\xed\xde\x06\xda\x92\x54\x64\xf1\x7b\xaf\x8d\x94\x7d\x6b\x89\x99\x9d\x61\xad\x66\xaf\x4e\x64\x45\xb6\x19\x37\x21\xa7\x66\xab\x0b\x9d\xe9\x84\xce\xf6\x77\x5f\x54\x98\x97\x02\x7b\x56\x78\x65\x26\xaa\x5e\x09\x03\x27\xfb\xfa\xcb\x78\x72\x73\x00\x31\x8c\xea\x7e\xdd\x43\x81\x42\xfb\xdc\x02\xaf\x7c\xd0\x3c\xc9\x02\x03\x70\x8b\xdf\xf7\xfd\x7c\xb1\x9f\x41\x88\x91\x60\xf0\x31\xfe\x40\xf4\xde\xb5\x39\x5f\xa3\xdb\x40\x57\x27\x3a\x1b\xe1\x01\x5b\x6b\xfa\xee\x13\x4f\x4f\xe4\xbc\x47\xda\xc3\xa8\x66\xea\x2e\xab\x37\xc5\x53\xc5\x12\x33\xac\xb3\x0b\x8a\x23\x4a\x5e\xd2\x27\x5a\x78\x3e\xac\x2b\xd3\x6c\x86\x43\x93\x3d\xc4\xfd\x63\x7a\x85\x4c\x91\x63\xe6\x81\x9b\xaa\xf9\x43\xf5\x06\xa5\x11\x2a\xd1\x1a\xe1\x15\xce\xf6\x0f\x3f\xf9\x1a\x33\x19\xf8\xc9\x17\xd1\xc5\x1c\x4e\x49\xf6\xf0\xc3\x23\xb8\x02\xec\xeb\xa2\x1c\x1b\x3c\x51\x98\xba\x33\x14\x0f\x82\x24\xf4\xdf\x2e\x7f\xf4\x4a\x86\x69\xc8\xcc\x99\x8c\xe0\x15\xfa\xe2\x3f\x1c\x02\x23\x68\x50\x5c\x7f\x15\x2d\x14\x44\x32\x2b\xd3\xc3\x32\x1a\xf0\xb4\x19\xb9\xb9\x13\xb1\xc1\xdf\x82\x91\x4c\x77\x41\x54\xd1\xd7\x56\xdb\x32\x23\x7f\x2d\x21\x10\x32\x33\x4d\x14\x55\x35\xaa\xe7\x16\x86\x4a\x78\xce\xee\x09\x8f\xc9\xb1\x71\x2a\x35\x9d\x42\x8b\xb8\xd4\xdc\x58\x92\x84\xc1\xa1\xad\x15\x7f\xef\x1a\xf3\xf7\xc8\x11\x7c\xa4\x2d\x59\x21\xbf\x3f\x0e\x29\x23\x6b\xec\x45\x04\x66\xa8\xaf\x35\xf2\x35\xcb\x24\x6a\x35\xdf\x6b\x73\xaf\x6e\x98\xc0\x79\x7a\x30\xaa\x50\xd0\xc3\xb9\xa1\xd2\x8c\x65\xd9\x34\x18\xb6\x5e\xec\x0a\x25\x71\xc3\x70\x6e\xa7\x0a\x44\xc7\xdf\xc4\x16\xe9\xcc\xcf\x0f\x3b\x98\x06\xf3\x58\x62\xaf\x9f\x7d\x39\xfd\x97\x7c\xce\x0c\x09\xac\xda\xf8\x7b\xdf\x77\xe1\x16\x1c\xc1\x85\x3b\x93\x7f\x46\x53\xf7\xac\x3f\x91\x23\x7c\xf4\x4c\x2c\x0d\x77\xf1\xfc\x12\xea\x54\x4a\x6d\x06\x11\x3c\x09\x03\x0c\x63\xfc\x32\x58\xee\x02\xb5\x3c\x03\xd9\x81\x02\x63\xfa\xd6\xe3\xd0\x6c\xdf\x70\xe1\x40\xf7\x84\x67\xfe\x5e\x1a\xdc\x96\xd7\x89\x56\xd9\x17\x75\x0f\xba\xb2\x37\x47\x8d\xef\xf7\x60\x80\xf2\x17\x1b\x2f\x5e\xf4\xca\xe8\x65\xc7\xab\x78\xad\x6c\xbd\x14\x42\x17\x60\x7e\xee\x0f\x55\x5a\x06\x49\x35\xf6\x81\x59\x52\x4f\x3b\x1c\x21\x37\x04\x9d\x5f\xb5\x42\xf6\x15\x35\xed\x41\x4d\x95\x54\xa6\xff\x8b\x09\xd6\x7b\x37\x51\xea\x9c\xdd\x9d\x9a\x05\xc2\xaa\xeb\x93\x2f\x58\xa0\x5b\x8c\x30\x2b\x10\x49\x09\xc1\xac\x40\x8d\x5c\x19\x86\xf1\x43\x8d\x46\x22\x97\xa0\x07\x12\x7a\x61\x33\x35\x24\xd8\x70\xfd\xbd\x0d\x91\x34\xd0\xc4\x6f\x54\xa6\x39\x1d\xf1\xf5\x37\xb4\x44\x10\x55\x3d\x6c\x7c\x79\x06\x4b\x10\x96\x5b\x18\x21\x85\x35\xd5\xd8\xb9\xb0\x0d\x2d\x12\xa1\xdb\x7f\x7d\x32\x1e\xbd\x75\xe8\x49\xbd\x03\x46\xab\x45\x50\xec\xab\x3a\x05\xc0\x09\x93\xbc\x64\xf9\x6d\xe0\x8b\x21\x46\xbd\xf4\x28\xa9\x7d\xd4\xc1\x27\xfe\xc1\xff\x31\x19\xd9\xd1\x88\x97\x60\x58\x5b\x7e\xe7\x6f\x00\x9b\x7c\x9b\x88\xae\x0a\x16\x09\x73\x6f\x17\xb3\xbf\x9c\x9c\x3b\xfd\xad\xe8\x53\x6b\x89\x75\x6d\x67\x81\xbb\x6f\x42\xff\x89\xcb\x5e\xf6\x4e\xbc\x87\x64\x83\x95\x50\x7b\x81\x7f\xba\x46\x01\x99\xbe\x05\x40\x69\xf3\x83\xe3\x8b\xcc\x5d\x96\x6a\x4f\x98\xcd\xdc\x30\x8a\xd4\x3d\x83\x51\x0c\x8b\xed\xf4\x99\xd4\x95\x3b\x78\xae\xfa\x4c\xe5\x53\xf7\x77\x3d\x71\x6e\xeb\x2a\xc6\x4c\x6c\xaa\x5d\x59\x12\x3b\x12\x74\xac\x67\xa4\x4b\xfd\xe3\x35\x8b\x1c\x57\xc2\x2f\x20\x82\xc6\x8d\x6a\xd4\xe2\x23\xd8\xd1\x35\x24\xeb\x30\x38\xb2\x13\xad\xd0\x69\x87\x32\x03\x9a\x97\xe3\x75\x32\xb2\x18\xe9\x92\xb6\xa4\x2e\x50\x0b\x61\x74\xce\xd8\xc3\x07\x64\x70\x05\xe9\x64\xc0\x37\xc2\xa9\x48\x1c\x92\xb2\x1a\x55\xbc\x50\xb3\x46\xef\x9a\x9c\xfd\xb9\xc2\xf5\xd0\x60\xa0\x95\x17\x54\xd0\xfd\x13\x81\xe6\x41\x46\x09\xea\x31\x6f\x62\xb9\x55\xbd\xa6\xa3\xd2\xfc\x54\xa7\xaf\xfb\x14\x63\x90\x22\xe8\xd9\x3a\x96\xba\x1e\x37\x53\x11\x86\x7e\x8f\xad\x96\xdf\x4e\x0a\xef\x77\x03\x99\x35\xa5\xe1\xb0\x78\x0c\xa8\xc1\xe6\xe4\x49\x5d\x71\x6a\x1a\xfa\xca\x50\x20\x80\x7c\xf2\xf8\x83\xe8\x08\xc1\x56\xff\x79\x4b\x4a\x92\x39\x44\x16\x14\xce\xee\x7f\x6c\xc4\x60\xf2\x4f\x1f\xbd\xbc\x2b\xe7\xaf\xce\xbf\x79\xe8\x1e\x94\x98\x07\x30\x1a\xbf\x42\x9f\x14\x31\xbf\x55\xae\x5f\xca\x68\x21\x67\x1f\x63\x6b\x55\x70\x85\x46\x0d\xb5\x81\xe0\x7c\x5f\x71\xb7\x01\x20\x8f\xeb\xb4\xa2\xdc\xd5\xe0\x42\x76\xd2\xd2\xaa\x7f\x62\xe9\x4c\x7c\x40\x1e\xab\xd4\xcc\x81\x6d\x09\xce\xed\x5b\x12\x68\xca\x9a\x18\x77\x72\x46\x4e\xef\xbc\xaa\x4b\x7c\x46\xfd\x8f\x3a\xc0\x1e\x04\x60\x77\x83\x09\x3c\x08\x44\x47\xb8\x19\x19\x10\x30\xca\x54\x10\xb9\x3a\x2f\xff\xf7\xe1\xa2\x6b\xf9\xce\xdf\x70\x63\x7b\x69\x96\xb1\x7c\x84\x76\xbf\x68\xee\x57\x5c\x48\xe7\x99\xe8\x47\xe1\x66\x32\x72\x37\x1a\x5d\x48\x6c\x22\x73\xdc\x50\xa2\xd0\x23\x32\xd0\xd7\x06\xe2\x8d\x0b\x37\xbe\x21\xf1\xf9\xf0\x11\x4b\xd1\xdd\xb4\x65\x7f\x0b\xcc\x2e\xb7\x8b\x7f\x62\x91\x4a\x42\x7c\x23\x83\x40\xe7\x03\xb9\x85\x7b\x99\xf4\xed\x21\x0f\x82\xdd\xef\xd6\x1b\x46\x05\x24\xd3\x9a\x5c\x34\x45\xec\x48\x79\xa9\x99\xde\x17\xf9\xe4\x68\xf5\x2c\x08\x88\x8d\xe4\xf0\x7e\xd9\x9a\xd5\xe9\x8b\x67\x6b\x22\xd4\x06\x84\xcb\x4e\x91\x46\x71\x30\x3b\x60\xf7\x88\x5c\x57\x9f\x3e\x9b\x89\xc4\xdb\x17\xd9\xac\x57\x97\x9e\xa9\x43\x2d\x40\xba\xcc\x95\xdd\x56\x2f\x9d\xab\xb5\x28\x1f\x9e\xc0\xce\xae\xd7\x6a\x83\x88\xc2\xc2\xf6\xd2\x38\xd1\xad\x6e\x48\xdb\x30\x46\x2f\x0b\x50\xe3\xce\x19\xbb\xc2\x04\xef\x4d\x27\xbd\xea\xd5\xc0\xd0\x3d\x1f\x19\xca\xb9\x75\xfb\x45\x4b\x74\x24\x2f\x40\x52\x56\x7c\x8b\x29\x60\x82\x2e\xe4\x0f\x87\x42\x8b\x13\x7f\xd2\x3a\x3a\x15\x8f\x83\x3f\x81\x67\xe9\x1f\x22\xb5\x32\x7b\xc7\xf6\x05\xd7\x48\x62\x86\xe3\x5a\x56\xd6\x98\xf0\x86\x1b\x6d\x03\x35\xda\x61\xd6\x90\xce\x86\xa2\x64\x4c\x49\xa2\x6b\xe5\xae\xfc\xe9\xcf\x03\x8e\x96\x42\x5e\x9a\x95\x4a\x52\x13\x07\x06\x38\xc2\x8f\xed\xff\x58\xfb\x36\x80\x64\x5c\x16\x84\xf4\x13\x6c\xad\xda\x67\x86\x4a\x10\xbc\xf3\x84\x28\x07\x94\xa4\xef\xa6\x14\x6c\x91\x8d\x03\xc7\xea\x88\xd9\xb3\xd9\xfa\x3c\x4e\x34\x6b\x91\xfc\xba\xf9\xec\xb1\xe0\x34\x00\x27\xf5\x9f\xce\x66\xc2\xa5\xe3\x95\x26\xbb\x6e\x44\xc2\x9f\x31\x7e\x65\xa5\x87\xe7\x78\xfc\x00\x77\x5c\xb6\x95\x04\x4e\x39\xd2\xa2\x4a\xb8\x22\x68\x2d\xc1\x59\xf7\x47\xa5\x2d\x7e\x80\x2f\xd1\x13\xfe\x08\x9d\xf3\x6a\x35\xc3\x03\x3f\xed\xb4\xba\x7f\xef\xfe\xe9\xf2\xf4\x83\x24\x1c\xce\xc5\x51\x58\x4d\xb9\x3a\x98\x14\xa9\x37\xeb\xb0\xb7\xa0\x2b\x7d\xb4\x2e\x02\x6d\x13\x33\xd4\x60\x24\x75\x10\x39\x1d\x33\x92\x06\xfa\x05\x6e\xc0\xa5\xea\x13\xd3\xa3\xde\xba\xad\x47\x8e\x9d\xbc\x05\x7d\x56\x1b\x37\x2f\xbd\x36\xe7\x20\x57\x58\xa5\xb8\xd0\xb4\x60\x43\x29\x31\x27\x84\x18\x93\x31\x09\x18\xda\x09\x87\x99\xc8\x28\x32\x67\xc0\x0b\x75\x11\x9d\x13\x62\xc3\xff\xb7\x6e\xb8\x39\x0b\x9a\xcc\x70\x10\x04\x01\xc0\xa3\x9c\x05\x4e\x04\x80\x0b\x07\x65\x85\x1b\x0c\x8b\xd6\x84\x92\x13\x0f\x11\xa5\x29\xc8\x48\x8c\x0e\x57\x82\x54\xa9\x75\xd9\x2c\x23\x93\x6a\x0d\x5e\xa8\x82\xdd\xd9\x80\x9b\x5e\x0d\xf3\xbe\x4d\xf1\x4a\xff\x97\xd8\x12\xc5\x85\x76\xc5\x9c\xbc\x19\x36\x3c\xd5\xfd\x28\xc6\x94\xbd\x74\x8f\x40\x10\x80\x3a\x5c\x75\xfd\x49\x01\xb5\xe9\xab\x0e\xe0\xf1\x89\x65\x51\x9e\x71\x5a\xd6\x6c\xbc\x2d\x92\xd6\x89\xca\x52\xb9\x79\x1f\xac\xf4\xf9\x38\x54\x1f\x5e\xbc\x6a\x96\x9a\x07\xf9\xba\xac\x7c\x52\x84\xf6\x65\xfd\xb6\x17\x17\xd9\x6f\x46\x0f\x84\x44\x5b\x9d\x9e\x3e\x9a\xec\xce\x0d\xcc\x1d\x0a\xac\xc4\x96\x28\x7f\x23\xb8\xd1\x80\x86\xe3\x9e\xe4\xb9\xb5\x0f\x76\xc9\xc0\x8d\x28\x2f\x4c\xf1\x32\x98\x1f\xe7\x86\xde\xb8\x68\x23\x00\x56\xeb\xb2\xa6\xbd\xa3\xf1\x0c\xa6\xfe\x6a\x31\x0e\x44\xd7\x1f\xe6\x01\xb4\x81\xdc\xf0\x7c\xd8\xb9\xb1\x62\xea\x16\x7c\x3f\xbe\x31\x04\x49\x0c\xcb\x0d\x0c\x24\x85\x1d\x51\x62\x79\xd1\x2b\xe9\xd9\x53\xa5\x60\x52\x8d\x84\xee\x06\x04\x3f\x9c\x82\xe9\x08\x6c\x15\x4c\xe3\x88\xc8\xa4\x17\x94\x37\x67\x87\x11\xeb\x4e\x77\x65\x27\xc3\xbe\x6b\x47\x2a\x4b\xf8\xcd\x95\x82\x8b\x3f\x78\xa5\xb3\x03\x3c\xad\xa8\x50\x33\xd1\x13\xd7\x4f\x6a\xf0\xee\xe2\x5a\x25\xde\x0f\x8d\x7b\xfb\x2a\xf1\xfe\x78\xe8\x5b\x20\xc0\xa2\x2b\x4b\x73\x05\x5a\x5e\x81\xe4\x36\xc5\x21\x09\x13\x7d\xf4\xf8\xe7\x25\x78\x46\x34\x5f\x4a\x69\x72\xc5\x08\xc9\x74\x5e\xd5\xba\x26\x19\x06\xec\xfa\x72\xdb\x9f\xa9\xc7\xcf\xac\x25\x7a\xcd\xb8\xc2\x69\xc5\xf5\x91\x04\xe9\x26\x08\x83\x51\x71\x2e\x96\xfe\x57\x27\x4d\x56\x97\xc4\x0f\xd4\xa3\x43\x99\x41\xb4\xd5\xe9\x0d\x34\x3e\xbf\x12\xef\x5c\xae\xfe\xa9\xf0\x91\x85\xcd\x9c\x0a\x02\x87\x7c\xf9\xa9\x89\x5e\x73\xe3\x73\x3e\xd9\xa3\xc0\x74\x04\x7d\xd2\xf2\xae\x33\x28\x55\x09\x4a\x46\x13\xf7\x8f\x57\xc3\x61\xc9\xfc\xca\x64\x29\xf1\x82\xf7\x41\xa9\x50\x30\xba\x50\x5c\x45\x8f\x28\x1b\xa8\xb2\xb2\x67\x19\xf1\xba\xc6\x02\x7b\x93\x4e\x2b\xe0\x07\x9e\x49\xf0\xe5\x17\x88\x57\x0b\x04\x14\xbf\xed\xf4\xe7\xc0\x9a\xbe\xa3\x1e\x84\x9b\x8f\xe9\x4e\x0d\xc6\xef\x38\xa8\xc5\xfe\xe3\xc5\xce\x04\x7f\x55\x9f\x9c\x99\x89\x4c\xdc\x63\x70\xda\x40\x38\x68\xcb\xc7\x26\x7f\x65\x08\x7d\xfd\xf2\x44\x0a\x06\xdc\xfd\xf3\xe6\xc3\x96\xc2\xc6\xbd\xe9\xae\xe0\xb0\xe0\xe5\xff\x79\xc6\x44\xfb\x8c\x94\x69\x6e\x57\xea\x2c\x0d\x6d\xe3\x51\x5f\x4c\x36\xad\x3e\x18\x20\xab\x05\x81\x72\x52\xe0\x76\x06\xb0\xb2\x36\x87\x2a\x40\xe4\xb8\x0e\x1f\xf3\xae\xcd\xc7\x65\x4d\x6b\x45\x9f\x2e\xbf\x20\xac\xf9\x34\x9d\xee\xc2\x02\x78\x48\xc2\x60\x47\x33\x50\xbc\x25\xf4\x43\x3e\x76\x4c\x2a\xa1\xb9\xc9\xc3\x94\xbf\xbd\x5f\xff\xf4\x2b\xe1\xf4\x6f\x01\xbf\x47\xe2\x55\x21\xfb\xc9\xfb\x28\x68\xe6\x5c\x31\x7c\x82\xe2\x00\x78\xbd\x38\x05\xa7\x47\x28\x0e\xae\xdf\xfe\x2c\x2f\x25\xee\x5d\xe6\xd9\xcb\x1a\xb7\x80\x20\xdc\x1e\x38\xc5\x08\x71\xae\x0c\x02\xa9\xa3\xa2\xab\x05\x67\x22\xf1\x29\x2a\x6e\x1b\x7e\x74\xcf\x01\xd5\x46\xcc\xb6\xcd\xd6\x13\xbe\xa6\xe3\x62\xc9\x1e\x76\x27\x78\x65\x1e\x1f\x06\xdb\xca\xfb\x6b\xef\xbd\xd2\x42\x62\x71\xb0\x49\xc5\x21\x22\xb1\x6c\xa2\xce\x0c\x84\xa0\x8a\xea\x40\xd2\x33\x8e\x06\xbc\x8c\x40\x52\xfe\x68\x50\x06\xe2\x3f\x7e\x3a\xed\x1b\x66\x29\xb0\x52\x3a\x02\x01\x1c\x43\xfa\x12\x1b\x5e\xcc\xea\x40\x18\x20\x39\x20\x16\x66\xac\xe3\xd9\xcb\x60\x48\x42\x94\x3c\x1a\xf3\xcb\x0b\x9d\x9f\x4b\xaf\x4f\x84\xa7\xa8\x54\xdf\x48\x8f\xf0\x05\x10\x0e\x8c\x80\xa0\x5f\xd4\x37\x39\xc2\x75\x2e\xb1\x52\xa4\x88\x6a\x80\x83\x50\x2a\x8e\xf1\x0b\x5b\x20\x0e\x92\x9f\x60\xca\xfa\xf4\xd3\xa5\x18\x7d\x73\xc6\xbd\x77\x4d\x5c\x91\x4c\x18\xef\xdb\xbc\xa2\x6d\x33\x46\x54\xb6\xd8\xb9\x0f\x91\x63\xcb\x7c\xd9\x3c\x2f\x15\x2e\x24\xbe\xb9\xcc\xae\x46\xf3\xeb\xd5\x29\x4d\xfa\xfa\xdd\x94\x51\xf2\x20\x45\xef\xa6\x01\xd9\x12\x8b\x97\xa5\x45\x4b\x5e\xb3\xc1\xf2\x02\x10\xad\x01\x5d\x64\x76\xb1\xd1\x29\xb7\xd9\xe5\xe6\x49\x04\x92\xc0\x18\x46\x73\xdd\x49\xb9\xa9\xb8\xf8\xb0\x3f\x0f\x25\x36\x7e\xf0\x73\x96\x4a\x75\xa9\x0b\x25\x17\xfc\xa5\x9f\x64\x27\xc2\xa2\x3a\x5e\xbc\x23\x8d\x63\x47\xe2\x9f\xf9\xab\xf8\xb4\x48\x29\x24\x9d\xe1\x15\xed\xa9\xb6\x4f\x85\xe8\x4f\xf5\x4b\x6b\xb8\xaa\xd3\x8a\x42\x9b\xe4\x51\x27\xf4\x03\xf1\x89\x2d\x1a\xf8\x1e\xa1\x9b\xdf\x31\xef\xbd\x49\x82\xe9\xe2\xa0\x24\x06\xca\x30\x96\xc0\x0c\xf9\x9e\x2c\x0f\xa6\xb3\x62\x47\xa1\x2c\x49\xfa\xf1\x2f\xae\xa2\x9b\x32\xe5\xb2\xbe\xf1\xe2\x74\xe7\x49\xca\xe3\x01\xaa\xfb\x02\x21\xab\xbf\x7c\xd3\x1e\xe5\xaf\x4f\x2a\x5e\xa3\xf6\x7b\x8c\xd3\xa7\xcd\x27\x64\xf2\xce\xfe\x4a\xd0\x67\xa3\x3a\xe5\x9b\x09\xbd\xe3\x9c\x38\x56\x2b\x73\x4a\xb8\xa4\x7f\xa7\xbc\xf5\xb1\x46\x7b\xa9\xeb\x42\x35\x5c\xef\xf6\x76\x26\xdc\xfe\x90\xa6\x4d\xdc\x97\x34\x1f\xf1\x93\xbc\xd4\xc1\x25\x0a\x73\x5a\xd4\x72\xd8\x33\xf5\x00\x5a\x05\xa3\xca\x2b\xca\x90\xd1\xb7\x66\xa5\xfa\xb1\xc3\xc4\x2f\xd0\xae\x49\xcf\xaf\x38\x3c\x73\xca\x20\x44\x2c\xaf\xea\x27\x4f\x4c\x3d\x82\x50\x28\xbf\x26\xc3\xdd\x51\x08\x1f\x59\xd9\x0e\x3e\x03\xa0\x77\x9c\x5b\xf2\xc4\x95\xd6\xcd\x30\x0c\xc7\x30\xae\xef\xb0\x01\x37\x6f\x2a\x64\x30\x44\xf7\xd0\xd4\xe1\x65\x10\x70\x71\x40\x65\xb9\xe8\xac\xf0\x2a\xeb\x99\x23\xef\x6b\x4c\x05\xb4\x21\x58\x9d\x10\x52\x99\xb3\xf9\xdc\x70\x11\x05\x8c\x5b\x58\x7c\x43\xbd\xb4\xbe\x0d\x2f\xf1\x55\xd9\x19\x49\xb4\x73\xf1\xcd\x8d\x91\xf9\x59\xdf\x83\x6f\xe8\x55\x75\xc1\x60\x88\xaa\x09\xef\xec\xb5\xb5\x35\x50\x65\x42\x63\x57\x5c\xd7\xf4\x0d\x5c\x4b\x44\x2e\xdd\x3b\x4f\xa8\x3d\x13\x78\x21\x7c\xa5\xc7\xf9\x29\x53\x65\xa6\x66\xa9\xa7\x70\xde\x94\x21\x58\x6c\xca\x28\x53\xe2\x5a\xb0\xde\x3a\x3f\xaf\xee\x96\x5a\x2b\x91\x18\x23\x40\x96\x27\x51\xb0\xf5\x9d\x40\xdd\xd1\x0e\x2d\x5e\xfd\xc8\x56\xc0\x10\x16\x49\x4c\x67\xec\x0e\xd4\xb8\x78\x1b\x32\xea\x3a\x7c\xd5\xd2\x6c\xb7\x95\x3c\x97\x16\xc9\xd6\xfc\x96\x84\x07\x0a\x70\x2f\x72\x73\xe0\x1a\xb5\x42\x2d\x73\xc1\x4d\x50\xe3\xcb\xff\xe6\x59\xd7\x4c\x83\xf0\xec\x5e\x8b\x53\x19\xcc\x80\x8f\x5a\x3a\x68\x76\x80\x00\x80\x95\x73\xfb\x0a\x8d\xe3\xbb\x20\x6a\x74\x31\xc2\xd7\x84\xb9\x6a\x2d\x23\x30\xe5\xa0\xa4\xa1\xdc\x3d\xf7\xad\x1b\x47\xae\xf3\x4a\x4f\x84\xc3\x52\xfd\xf2\x76\x7e\xf5\xce\x1a\x3e\xfc\x6f\xd0\xae\x80\x4f\xda\x58\x6c\xc0\xe3\x78\x47\x47\x77\xad\x4d\x75\x05\xda\x02\x51\xb1\x53\x4b\x72\xde\x06\x02\x7f\x8f\xcb\x23\x40\x82\x06\x88\x5b\x4f\x4b\xb7\x73\x10\x83\xaa\x94\xf8\x08\x7d\x05\xd1\xe8\x0c\x84\xd5\x60\x83\x01\x7f\x0b\x08\x45\x61\x68\x3b\xeb\xc8\x64\x82\x37\x23\xda\x90\xfe\x5b\x06\x83\x82\x94\x37\x9f\x54\x24\x3b\xee\x3b\x21\x39\x92\xaf\xfc\x70\x0e\x44\xc5\xcd\xcf\xa9\x7d\x0a\x6a\xf4\xa6\x5f\x66\x9a\x5d\x5d\xdb\x3a\x6e\x7a\xfd\x6b\xbd\x7e\x26\xe1\x3b\xdf\xdc\x7f\xd9\xcd\xfd\x7d\x93\xb4\xad\x69\xaf\xfc\xf0\x35\xf1\x61\xba\x92\xd1\x53\xd0\xe3\x3f\x0e\x54\xb5\xf5\xbd\x58\x66\x30\x3c\x1f\xa7\xc0\x92\x22\x52\x40\x73\x66\x24\xd2\xf0\x77\x09\xfd\xad\xc8\xfa\x9c\xef\x02\xb8\xf0\xa3\x6f\xa1\x2a\xe2\xc4\x9f\xdc\xa2\xd8\xde\xef\x04\xd4\x60\x02\xf1\x89\xe8\x33\xaa\x2a\xfd\x47\x35\x73\x52\x70\x7d\xee\x6b\x55\x1f\xa1\x72\x87\xea\x9f\xfe\xfd\xac\xab\x35\xe5\xef\x28\x69\x9a\x1a\x84\x7d\x5a\x7c\xa2\x52\xa6\x8e\x19\xbb\xdb\x64\x2e\xae\x9f\x55\xa3\xa3\x9f\x17\x43\x61\x4c\x24\x8b\x13\x34\xbf\x1c\x09\x0e\xea\x02\x29\x53\xe6\x91\x23\xd8\xac\x5f\x69\xcd\xdc\xb7\x94\xc7\x89\x64\x71\xae\xcb\xf1\x2a\xd1\x10\xe5\x29\x3d\x96\xeb\xd1\xaf\x7f\xec\x82\x06\x01\xb2\x00\xb5\xe1\x7b\xc0\x0d\xdf\xc3\xd1\xb7\xb8\x5f\x1b\xef\x2a\x46\x65\xc6\xf8\x09\x8f\xee\xaa\x1e\x06\x99\x50\x21\x17\xc5\x85\xaa\x5c\x3d\xff\x78\x84\x17\xd9\xab\xe2\xd7\x6a\x52\x4a\xf4\x20\x1b\xbf\x32\xbb\xda\x8e\x57\x2b\xfc\x0a\xb5\x9a\x78\xb0\xce\xe5\x93\xec\x4d\x89\x2f\xa2\x00\x0e\x83\x64\x8b\x0f\x61\xee\x73\x47\x88\x8a\x13\x45\x7b\x5f\x70\x25\xef\x51\xae\x0a\x5a\x71\x1a\x80\xe0\xcc\x58\xcf\x75\xdd\xb7\x95\xe5\xe6\x55\xdd\x37\xf5\xdd\x37\x01\xbb\x54\x95\xdb\x09\x54\xa1\x65\xf9\xd9\x53\x17\x4c\xb2\x9a\x30\x5d\xdf\xed\x9c\xa2\x8d\x57\xb5\xed\xd9\x20\x70\x19\x1b\x92\x47\x4b\x1a\x37\xff\x2f\xfd\x0f\x4b\x1a\xb6\x79\x30\xe0\xa5\x0f\xe3\x4c\x9c\x87\xf4\x08\x9b\x93\x99\xe2\x16\x6f\x23\x9e\x31\x49\x9d\x67\x03\x3b\x56\x51\xac\xed\x07\x62\x10\xfc\xab\xa5\x66\x7e\xec\x10\x1e\x1b\xb1\x16\xd3\x86\x93\x5e\x42\x91\xf1\x19\x41\xf2\x60\xe7\x87\xe6\x42\x74\x65\x76\xff\xae\xb5\x7e\xb1\x49\x55\x1a\xb2\x5c\x7d\x3a\xa8\x60\x8f\x97\x61\xc1\xd5\xf5\x8f\xb3\xd7\xb1\xd4\x42\xf8\xdc\x66\xe2\x76\x29\xd5\x2c\x7a\x5c\x2d\xc1\x0a\x26\xf2\x6b\x5e\xdb\x79\x5d\xe7\x55\x60\x9a\xbe\xb4\xe8\x69\xa2\x25\x20\x86\xff\x6e\x2f\xdd\xb7\x74\x44\xdb\x8d\x43\x12\xe1\x2e\xb3\x23\x24\x92\x3f\x20\xee\xe2\x3e\xad\x3f\x5a\x53\x07\x3b\x49\x7c\xd7\xe2\x7c\x69\x7f\x63\x11\x4f\x02\x1c\xc3\x45\x86\x4f\xd8\x68\x34\xcc\xd2\xfb\xdd\x5a\xd0\x66\xc7\xba\x78\xe4\x04\x43\x32\xab\xff\x1d\x2f\xbe\xa8\xae\x70\xb4\xd0\xf6\xaf\x47\x16\x06\x54\xa6\x6c\xad\x85\x52\x9e\x91\x5d\x92\x3c\x9a\x40\xf9\xa8\xd1\x4a\x06\xe8\xed\x77\xd0\xc4\xe5\xd1\x25\x58\xce\x13\xb3\xfe\x39\x5d\x3c\xbe\xfc\xf5\xd0\x8a\x6b\xf4\x82\xa9\x18\xc6\xc4\xb4\x1c\x57\xd5\x23\xb9\xaa\xd0\x95\xae\x5e\x3c\xc7\x60\xc3\x13\x52\x43\x3a\x42\xb4\xfa\x00\x09\x9d\xf7\x5e\xd8\x47\x83\xa0\x73\xde\x5b\x1e\xdd\xeb\x89\xf0\xb5\xa7\x18\xa1\x8f\x0b\xc9\x92\xc0\x0f\x04\x47\x4b\x06\x3a\x9f\xd4\x57\x2a\x3e\x2f\x16\x67\xab\x11\x2e\xb0\x4b\x68\x00\x25\xa7\x8f\x37\x87\xc5\xed\xc0\x07\xda\xc9\xc9\x44\xa3\x59\x97\x79\xfb\xd6\xf1\xe2\xec\x78\x3a\x87\x9f\x31\x39\x33\x1e\xb8\xa9\xd2\xd2\xea\x4a\x7a\xf4\xed\x26\x51\xf1\xa2\x22\x11\x0e\x23\xa7\x6f\x03\xca\x5a\xa3\x2a\xfb\xad\x5a\xdb\xfe\xba\x1f\x62\x94\x8f\xf6\x90\xf4\x4b\x0e\x60\x74\x48\xdf\xf7\xd1\x01\xa4\x36\x90\xfe\xe5\xff\x22\x49\x27\xcb\x6b\x34\xa7\x6e\x59\xd3\x71\x7d\xc0\xc6\xf0\x42\x78\xcf\xc4\xc7\xf7\xe9\x32\x59\xfd\x41\xf1\x5e\xf0\x42\xe5\xee\xa1\x13\xa3\x06\xa2\x0f\xc8\x33\xc9\xf9\x73\x1b\x57\x86\x18\x35\x56\x94\x4f\x1d\x87\x22\x8b\xc0\x3a\x7d\x5a\x20\x83\xf9\xa6\x9c\xc8\xca\xfc\x37\xce\xf8\x47\x9a\x36\x96\x1b\x33\x4a\xa9\xcb\x90\x5f\x11\x8e\x59\x96\x0c\x92\x70\x8b\xae\x07\x18\xbf\x06\xef\xe6\x7a\x78\x8d\x17\x3f\x7c\x84\xa3\x1b\xa2\xe3\x07\xc2\xa3\x7b\xfe\x67\x7e\x78\x8b\xa4\x05\xd0\xc5\xbb\x3f\x7a\xca\x59\x87\x30\x7c\x18\x5e\x0e\xdb\xdd\x2b\x54\x16\xfa\xd6\x20\xd1\x9f\x51\x46\xea\x45\xc9\x32\x01\xdb\xd3\x4b\xea\xf6\x0e\x8f\x13\xa2\x45\x11\x56\x1b\x0d\x55\xb4\xa4\x67\xf3\x9c\x76\x5b\x5b\x87\x16\xc2\x5e\x0e\xeb\x9e\x8f\x1a\x48\xd7\x42\x79\xe4\xbc\xfe\x60\x78\x3d\x56\x6e\x5a\x8b\xad\xc4\x61\x65\x63\x88\x4f\x49\xc8\xd6\x98\xa9\xad\xc8\x5a\x5c\x13\x91\x48\xce\x79\x6b\x80\x16\x6e\x30\xf4\xbb\xa2\x68\x23\xe9\x16\x0d\xec\x07\xcf\xc9\x35\x3e\x46\xf2\x40\x08\x2c\xae\x00\xb0\xaa\xe6\x22\x3d\xa3\x49\xc7\x2d\xf1\x09\x15\x82\x6b\xe6\x52\x6e\x89\x73\x3b\xb1\x10\xef\x33\xfd\xf5\x67\x19\x25\x00\x4b\x6c\x5f\x3d\xbc\x21\x83\xa7\x40\xf9\x49\x26\xdf\xda\xe0\x15\x41\xc9\xe2\x65\x55\x37\xa9\xd0\x10\x2d\x17\xc2\xed\x97\x34\x0e\xc5\x26\x0d\x07\x3c\xd4\x9e\x52\x5d\xd3\x7e\x21\xb5\x57\x64\xef\xf4\xab\xe2\x84\xf2\xa7\x38\xfe\xb3\x2c\xc6\x97\x7f\x46\xb8\x15\x27\x59\x76\xbd\x62\x9c\xe1\x27\x05\xc2\x11\xa2\xe5\xc9\x0b\x98\x2a\xb6\x08\x4e\x73\xb5\x1d\x1b\xe5\x15\x5d\x28\x61\x84\x9f\x97\xec\x08\xad\x00\x14\x50\xd1\x27\x9f\x47\x22\x14\x88\x8e\xef\x03\xdd\xd4\xe1\xb4\xbb\x23\x48\x76\x85\xf5\xaa\xd6\x58\x4c\x67\xfa\x9c\x9b\x92\x1f\x4d\x76\x67\x79\x90\x7d\xe7\xd6\x1b\x3a\xba\x3b\x64\x58\x25\x13\x28\x79\xa0\x52\xd7\x1c\x57\x32\x92\xd2\x5b\x9f\xfb\xaa\xd6\x3f\x4b\xbe\xce\x7b\xf6\x35\xd1\x04\x61\x65\x38\x42\xf8\x88\x81\x19\xca\x49\x1a\x95\x46\x1c\x98\x0e\x44\xcb\x68\xd4\x18\x3f\xbd\xbb\xd9\xf4\xb9\x36\xc6\xc5\xce\x3f\x8d\x87\x68\xcd\x9d\x87\xa0\xe7\xea\x5d\xdb\x60\x84\x2e\xbb\x7e\xb7\xb8\x7e\x71\xdd\x78\x8a\xa5\xa7\xdd\xc7\xaa\x42\x67\x8d\xaa\xfe\xf8\x3e\x73\x0e\x74\x45\x77\x52\xc8\x70\x40\xf6\x0e\xb8\x09\xe8\x07\xdd\x90\x6f\x36\x78\x63\x44\x63\xdb\x32\x3d\xd8\xb0\x22\x9e\xc4\xe2\xba\x89\x58\x43\xf6\x48\xf8\x44\x3c\x05\x22\xa8\x36\xa6\x65\xd5\x74\xd5\x7d\x53\xde\x8d\x26\x68\x50\x2f\x0d\xfd\xb3\xa1\xc4\x2a\x03\x68\x32\x28\x90\xb9\xb2\x64\x47\x09\xda\x9c\xbc\x2d\xda\x51\x06\x4b\x40\xb5\xc5\x56\x75\xda\x30\x4c\x97\x0d\xe9\x2b\xbb\xa9\x23\x02\xd8\xbe\x0f\x0b\x05\xc1\x36\xa3\x8d\x7b\x05\x49\x07\xf9\x92\x83\x9f\xe6\xbb\xf6\x93\xa9\xe6\xa2\x17\x41\x93\x75\x08\x41\xf0\x82\xff\x04\xf9\xb0\x8b\x72\x89\xf2\x40\x74\xb2\xe2\x44\x33\x1c\xc7\xc0\x55\xc3\x5f\xfa\x0f\xe8\xfb\x92\x4b\x4c\xaf\x27\xb2\x63\x24\xd9\xfe\x12\x88\x3c\x13\x9f\xe0\xc5\xab\xaa\xb9\x93\xd1\x0d\xac\xf9\x16\xf7\x5f\xc3\xfc\x26\xeb\x42\xa8\xca\xfa\x52\xe4\xa9\x7f\xca\x45\xf2\xb0\x0e\xa4\x54\x43\xf5\xa6\xaf\x65\x21\x7a\x64\x07\x42\x9a\x68\x70\xa7\xc7\x79\xca\x1e\x32\x05\x80\x37\xe1\x24\xa0\xb7\xd8\x69\x74\x31\x8c\x0b\x89\x19\xf7\x02\xff\xbd\x99\x41\x00\xd7\x9c\x19\x23\xbe\xc3\xcb\x4b\x98\x09\xf1\xc7\xa7\x32\xff\x60\x44\x71\xd9\x33\xef\x56\x8e\x0f\xb1\xac\x9d\xcb\x1a\x82\x5e\x2e\x6e\xd0\xb1\xd1\xd4\x8e\xf0\x98\x5f\x7e\x0c\xef\x19\x41\x21\x72\x5c\xd9\x06\x13\xa4\x33\x14\x56\x87\x65\xd3\x31\xa1\x1b\xbc\xb3\x5f\x9d\xfd\x68\xf6\x23\x2a\x12\xe8\x7a\x44\x83\xc9\x8e\xc2\x8b\x93\x6a\x10\x14\x0f\xb9\x7a\x56\x65\xfa\x01\xf3\x2b\xba\xa6\xb7\xd4\x27\x7d\xbb\xc5\x31\x59\x53\xf2\x18\xd1\x00\x3e\x64\x1c\x81\x5d\x61\x41\xe5\x07\x04\x23\xba\x04\xed\x38\x0f\xd7\x21\xff\x52\xfd\x97\x8f\xeb\x7a\x6e\xa8\x5d\xe2\x55\x45\x52\x63\x8e\x4d\x66\x74\x9d\x93\x29\x74\xce\xca\xbd\x29\xe7\xa3\x06\x5a\x0d\x54\x13\xfd\x65\x8d\x5f\x53\x7c\x2d\x05\x4e\x00\x46\x65\x04\x50\xed\x5f\x2a\x66\xf6\x47\x68\x38\x60\xd5\x91\xb3\x67\xd2\xe4\x2d\x70\x7e\x6e\xf1\x5d\x90\xe5\xd4\x8e\x5d\xcc\xaa\x0a\x6e\x85\x1b\x4c\xcb\x8e\x9f\x08\x4e\x07\x13\x60\xd5\xa2\x19\x93\xbb\xe6\xe4\x2d\x07\x4a\xf6\xbc\x05\xcc\x95\x42\x5f\x03\x80\x02\x20\x47\x06\x07\x42\x26\x1e\x4e\x11\xc5\x89\xba\x21\x1c\xf2\x49\xf0\xe1\x34\x70\x79\x37\x38\x9b\xbf\xe6\x06\xba\x99\xb0\x16\x5d\xd1\xec\x19\xa9\xac\xa3\xbc\xa2\x38\x8e\xd9\x86\x32\x14\x4f\xf8\xf2\x3d\x0a\x32\x4f\xb8\x75\x7b\x17\xb8\x76\x5e\x55\xec\x4d\x75\xf9\x83\x47\xde\xf2\x69\x81\x23\xf8\xe5\x42\x2f\x84\xb4\x50\x40\x13\xbb\xc3\x9c\x31\x63\x04\x9d\x4b\x80\xb2\xe6\x49\x8f\x70\x4b\x76\x24\x50\xfe\xd0\x34\x4c\x60\xc5\xf5\xaf\x1f\xa2\xfe\x11\x96\x3b\x35\x9e\xaf\xe4\x11\xfb\x1c\x38\x36\x81\x3e\x90\x9f\x51\xf2\xa7\xa1\xd9\x70\xe9\xc4\xba\xae\xf3\xd0\x3e\x89\x37\xd4\xa5\x74\x1c\x2b\x92\x65\xc7\x00\x7c\x29\x6b\xeb\x9c\xf9\xde\xbd\xc5\xd1\x27\x56\xcd\x06\x55\x5d\x3c\x66\x0f\x47\x56\x82\x97\x29\x7b\x29\x72\x74\x36\x75\x00\x68\x76\xd4\x61\x69\xf9\xa5\xac\x03\xf2\x53\xea\x70\x76\xc8\x2c\x54\x48\x5f\x76\x0d\xa8\x36\xb4\xc8\x42\x04\xac\xaa\x28\x6a\xa4\xc1\x14\xd0\x62\x0b\x00\x5c\x9e\xf2\x92\x6d\xb4\x4f\xb0\x86\xcb\x0c\x26\x36\x71\x78\x82\xd5\xb1\x65\xd7\xa3\x8f\x0a\x35\xe9\x56\x43\x98\xd7\x46\xd2\x2b\xb9\x20\x93\xb7\x9c\xf5\x0b\xae\xef\xb7\x50\xe0\x8e\x0a\x72\x95\xdb\xc2\xa1\xa5\xb0\x86\x85\x52\x4c\x43\xf6\xf6\xe6\x93\xb2\x13\x99\x35\x5b\xc3\x24\xa6\xac\x74\x00\x64\x01\x23\x70\xec\x81\xf2\xd8\xe0\x4e\xf3\x5e\x1d\x86\xd2\x14\xad\xb9\xf7\x4e\x9a\xdf\x41\x96\xdf\x91\x49\xf0\x91\x7a\x4a\x0b\x08\xc1\x99\x8d\x24\x37\x7e\xd5\x43\x55\xf2\xb3\xc1\xa4\xfc\xe4\xa1\xf2\x84\x3f\x62\x52\x42\xa3\xcb\x11\x80\x01\x8f\x84\xa2\x16\x7e\xcc\x75\x99\x7f\x20\xa2\x54\x18\xe0\x07\x85\xe3\xb2\x66\x07\xb2\x15\x1b\x9a\x26\x86\x74\xe7\x72\x7b\xe5\x9a\xe6\xce\x6b\x79\x91\x3b\x12\x5f\xd3\x47\x98\xdd\x7c\x80\x5e\xea\x1c\xb3\x08\x57\x91\x92\x9f\x21\x35\xd5\x94\x61\xe4\x1a\x4e\x81\x7f\xd6\x8c\xff\xe6\x9c\x43\x84\x7c\x9c\x50\x00\xfb\x8c\x39\xc4\x81\xae\xf9\x81\x17\x08\x2a\xa6\xa4\x50\xd9\x90\xcf\x88\xde\xa5\xc8\xb1\xe5\xf7\xa1\xfd\x57\x41\xaa\x7f\x7f\xfe\x31\x8d\xa0\x33\x35\xef\x9d\x67\x68\xcd\x83\x68\xcb\x85\x3a\xcb\xd5\x61\xa3\x0c\x0e\xe8\x38\xac\xe9\xc3\x9e\x6c\xda\xbb\x3f\x99\x1e\x33\x63\xe4\x23\x3b\x73\x2c\xf1\x19\xde\x27\x2d\xcc\x3f\x6f\xf2\x9c\x26\xfb\x98\x25\x54\xc9\x53\x04\x52\xdf\xac\x4c\xc4\x09\x67\x07\x1e\x9f\x51\xab\x7d\xba\x9f\x13\x90\xe1\xf9\x96\xcc\x63\x3d\x2f\x1c\x34\xf0\x65\x17\x00\x5a\x33\x54\x9a\x90\xb9\xfe\x6b\x0e\x99\x29\x3b\xbc\x23\xf0\x98\x22\x46\x97\x22\xc3\x80\x64\xce\xe2\xc3\x0a\xcf\xf0\x3e\x6c\x24\xfd\x1f\x8f\x29\x6e\x25\x3f\x54\x08\xb6\xe8\xeb\x52\xa5\x6f\x3c\xf0\x8e\x5e\xa9\x31\xbe\x78\x16\x17\x08\x09\xec\x01\x12\xa9\x00\xdf\xca\x37\x2d\x47\xf0\x47\xbf\xa4\xda\x22\x5d\x8d\x03\x84\x07\x0c\x97\xf6\xe5\x59\xc9\xd5\xf3\xae\x70\xe5\x42\x96\x8b\x41\x03\x14\x18\xa1\xf6\x17\x39\x0f\x51\x5a\x32\x55\x11\x40\x7e\xdc\x32\x1c\xd6\x23\x4c\xd0\x25\x81\x74\xa0\x97\x18\x74\x6e\x62\x54\x25\x5d\x30\xe7\x27\xfb\xc6\x41\x3a\x9f\xa3\xc6\x67\x43\x86\xd4\xb9\x8f\xce\x33\xb5\xf6\xb3\xc0\x6f\x4a\x10\xa7\x4f\xfe\x08\x45\x0a\xc7\x25\x2d\xc1\xf2\x8a\xce\x68\x12\x1f\xdb\x17\x38\x54\xe0\xfd\xc7\xe0\x1f\x0c\x50\x38\xe4\xe8\x12\xe0\xb5\x82\xdb\xf4\x1e\xea\x26\x37\xb8\x60\x8f\x0f\x97\x55\xdc\x8b\x11\xfd\x6f\x1e\x6d\x21\xb2\x6f\x21\xbc\x7b\x02\x6c\xb4\x45\x71\x45\x03\x5e\xa6\xfd\xa2\xc6\xa3\xd2\xc6\xbd\xd2\xda\xbd\xc2\x95\xc3\x9c\xf2\x7e\x91\xfe\x69\xca\xe4\xb1\xcf\x6f\x98\x97\x86\xd2\x15\x53\x16\x5f\x9a\xc0\x8b\x96\xd1\x37\xba\x44\xa3\x82\x0e\x53\x23\xf1\xca\xd8\xa9\xd1\xad\xdf\x2c\x13\xf4\x41\xd5\x9d\x57\xa3\x8b\xff\x1d\x80\x96\x19\xee\xdc\xfb\x38\x2f\xff\xf9\x6e\x07\x2a\x64\x1b\x36\x3c\xef\xdf\x56\x0d\xb8\x48\x45\x7b\xb5\x1a\xb0\x2a\x87\x29\xf8\xd7\xa2\xea\xef\x53\x44\x2d\x15\xfd\xa9\x54\x8b\x9d\x4a\xdb\xfb\x75\x2f\x2c\x51\x8f\x97\xd9\x88\x4b\xde\x94\x98\x95\xff\x97\x23\xe2\x68\xe1\x0f\xd2\x44\x43\x52\x7c\x95\x2a\x24\x09\xdb\x97\xd9\x3f\x4e\x60\x7a\x74\x6c\xa9\xd1\x53\xb6\xd9\x42\xe3\x7d\xa7\xc1\xde\x42\xa1\x14\x2f\x87\x20\x1c\x56\x15\x59\x9f\x2e\x0e\xc5\x87\x34\x6d\xa5\xec\x49\xd8\x9c\x2e\xe2\x33\x29\xb2\xa0\x35\x64\xce\xad\x89\xfa\x23\x99\x64\x4f\x25\x2f\x38\x37\x15\xf8\xd7\x80\x77\xa1\x81\xba\x4e\x52\xa9\x59\x53\x69\xd9\xd3\xc8\x44\xb3\x82\x26\xdc\x74\x5c\x56\xa2\x24\xc3\x99\x6c\xb0\x43\x68\x7c\x5f\x34\x9d\x1e\x07\x1c\xea\xdb\x27\x62\x50\xc2\x70\x58\x56\x67\x1a\xc4\x24\xf4\x27\x3e\x05\xbe\xf0\x2a\xae\xf5\x08\x2f\xd0\x1a\xca\xc8\x2e\xad\x4e\x66\x48\xf9\xcd\x87\x05\x27\x30\x90\xe2\x2d\x30\xcc\xdc\x22\x24\xb8\x71\x99\xe2\xc5\x12\xee\x59\x54\x55\x33\x55\x55\xe4\x98\x52\x0a\xa4\x9b\x68\x83\xb1\x46\xb4\x58\x34\x07\x2a\x6b\xfe\x1a\x4d\xe0\xc3\xd8\xea\x48\xc0\xfb\xee\xd2\x83\xff\x8c\x17\x5d\x45\x44\xd9\x74\xff\x0e\x05\x48\x91\x7f\xdf\x73\x3a\x36\x3d\x57\xaf\x6d\xe2\xfb\xb0\xe1\xf9\x8f\xff\x0b\x18\x9b\xb3\x16\xe0\x9a\x55\xd6\xa6\x71\xba\x02\x57\x58\xf8\xad\x03\x29\xbd\xd0\xa5\xbd\xd4\xa5\x11\xd4\xbc\xbd\xf5\xa2\x3a\x52\xd0\x0a\x8b\xf0\x5b\xc4\x5f\x20\x36\x76\x28\xfe\xab\xfa\xb2\x27\xfc\xcf\xf1\x84\xc1\x90\x00\x95\x07\xea\x86\xc5\xf7\x79\xb7\x10\x00\xb8\x80\x24\x48\x78\x99\x26\x1f\x63\x1b\x6d\x44\x61\x48\x5c\xe3\xd9\x55\xc5\x32\x6a\xe3\x23\x46\xc7\xdc\x06\xef\x5c\x8b\x31\x6e\xf1\x2e\xc9\x7c\x33\x23\xd0\xa1\xd9\x90\xc1\x47\xfe\xdf\xe3\x37\xfe\x6f\x48\xc2\x40\x74\x72\xff\xf2\x32\xe4\xec\x83\x22\x0c\x7e\x8d\xea\x9e\x1b\x41\x09\x81\xe8\x24\xf4\x67\x9d\xc5\xdf\xf8\x2a\xdf\x35\xdd\x98\x6f\x10\x61\xb3\x19\xe8\x7b\xe1\x95\x45\xb4\x4a\x7c\x14\x91\x88\x3a\x56\xd7\xe7\xdf\x6c\x91\x34\x50\x59\x53\x5c\xe8\x23\xf7\x22\xa5\x39\xba\x76\x88\x9f\x03\x8b\x98\x2f\xe5\x49\xcf\xaf\x26\x69\x9f\x86\x93\x70\xd9\x52\x20\xea\x83\x17\xb2\x39\x2e\xd1\x27\xbe\x73\x5f\xdc\x22\xae\xd8\x11\x7e\x8b\x24\x23\x08\xe7\xb8\x3f\x97\xfc\xd8\xea\xcf\xa3\x4e\x35\x66\x40\x45\x14\x26\xe5\x3d\x68\xe2\x0b\xe0\x65\xa9\x4b\xeb\xa5\x5d\xc9\x8e\x24\x56\xa8\xf5\xae\xbc\x96\x08\x86\x6e\x06\x9d\xee\x61\x1f\x59\x7b\xa9\x57\xe5\xe8\xbc\x67\x70\x9f\x03\x21\x69\x62\x1c\x1b\xf2\x87\x93\xe4\xf2\x5e\xe4\x86\xea\x52\x03\x4e\x39\xdf\x66\x07\x82\x8b\xe7\x4e\x54\x41\xb0\xa4\xc4\x19\x13\xfd\x2f\xa5\x95\x85\x7a\x66\xa2\xd0\xa7\x78\x56\xe7\x19\xd4\xb0\x52\xdc\x82\x15\x96\x64\x93\xd9\xfe\xed\xc1\x49\xf2\xf3\x8f\x25\x76\xe0\x25\x10\x3e\x07\xa2\x9a\x52\xb9\x7a\x85\x8f\x2c\xda\x43\x2c\x5c\x56\xe2\x24\x49\x8a\x07\x94\xfa\xb1\x32\x7f\x96\x49\x9a\xa0\xc7\x0f\xfe\x82\x2e\xfb\xf4\xef\x7b\x4a\xfe\x0e\x0f\xd9\x6c\x7c\xad\x69\x20\x2a\x41\xc8\xe2\xec\x92\xe8\x87\xc9\x9a\x18\x5b\x86\x57\x30\xef\x55\x22\x02\xec\xb9\xef\xf5\x07\x9f\x43\xe9\x50\xc9\x99\x05\xdc\x09\x66\x07\xfd\x50\xc4\xaa\x96\xd7\x87\x61\xeb\x46\x8c\x4b\x9f\x58\x2c\x95\x13\x85\x89\x53\xb4\x0c\x74\x0b\xe9\x86\x5e\xc0\x03\xcd\xf0\xe2\x4d\x6e\xdd\xdb\xbf\xfe\xbc\x14\x51\x25\x00\x89\xe3\x88\x33\xa1\x24\x21\xa2\x91\x0a\x14\xd7\xe6\xa7\xc5\x56\xfa\xcb\x47\x9a\x26\x98\x9e\x50\xe9\xdd\x8b\xcd\x27\xbc\x0c\xc9\x89\xa6\xe1\x3e\x51\x58\x23\x6a\x5e\x5a\xbf\xbb\x9a\x81\xa8\x27\xd3\x57\xa7\x0e\xba\x10\x6c\x64\x79\x67\xcf\x91\x4d\xaa\x48\x30\x24\x3e\x6d\x79\xb4\x6d\x6e\x05\xd3\xfc\x9c\xcb\xee\x85\xba\xe7\x6a\xca\xb0\x9f\x27\x76\x5d\xd5\xd9\x25\xfa\xbe\x64\xb9\x7b\xa6\x0b\x40\x7f\x15\x9b\xbb\x9a\xfe\xe5\x88\x35\x7d\x9f\xf3\xec\x12\x4b\x38\x15\x57\x4f\xc9\x99\x8c\x38\x40\xeb\xce\xc3\xff\x70\x30\x2f\x49\x3d\xb4\x5f\x73\x87\x71\x27\x0e\x45\x4c\x92\x7d\x5a\x50\x93\xd3\x0a\x1e\x74\x41\x93\x99\xc0\x98\xf0\xbe\x6b\x82\x77\xce\x13\x25\x9b\x86\xc0\xc8\xa3\x9c\x16\x62\xef\x56\x79\xa4\xf3\xe7\xc5\x9b\x23\xce\x86\x0f\xbf\x09\x44\xae\x80\x89\x54\xdf\x1d\x31\x9a\x18\xf9\x4b\x2a\x09\x5a\x40\xa1\x21\xff\x69\xbc\x2f\x5a\xbe\xc0\xac\xe2\x48\x26\xbb\x54\x46\xdd\x8d\x91\x5a\x1b\x23\x8a\x53\x6c\x4c\x79\xf1\x10\x3d\x28\x8e\x9f\xca\x81\x9a\xf5\x7a\xa1\x07\x27\xb5\xb9\xee\xb4\xa4\xe1\xa4\xbc\xba\xa9\x73\xe0\x39\x45\x9f\x32\xff\x98\x4e\x62\xc7\x6c\x22\xef\x57\x12\x7a\x9a\x4b\x7e\x2e\x74\x6c\x30\x4e\x16\x87\x88\xe4\x6a\x5b\x10\xf4\xb9\xc0\x80\x59\x3b\x86\xf9\x82\x27\xea\x3d\xbf\xf9\x57\xf3\x08\x59\xce\x2a\x26\xdf\x27\xef\x57\xe2\x92\x86\xdb\x85\x90\xec\x34\x60\x94\xc9\x71\x91\xb0\x3f\x67\xf5\x35\xf7\x9f\xe8\x76\x4d\xa5\xd3\xe5\x15\x3a\x98\x74\x46\x03\xfe\x27\x16\x69\x6b\x56\xe0\x86\x51\xa1\x61\x7a\x35\xce\x7b\x1f\x86\x28\x4d\x0c\x03\x2a\xdd\x4e\x1b\x50\x53\x40\x9f\x18\xd2\xf0\x02\x46\xe7\xa0\x3b\x69\xae\xdc\xb0\xe8\x9f\x0f\x5b\x91\xb6\xab\xfa\x8e\x28\xbf\xd1\x68\x7d\xd9\x80\x57\x4b\xc3\xf9\x04\xd3\x55\x94\x60\x3b\x7c\x07\xc2\x8c\x9f\x07\x2a\x94\xd7\xe9\xf6\x42\xb0\xbc\x24\xf9\x44\xc7\xae\xba\xc7\x00\xe8\xa6\x0d\x73\xcf\x2b\xdc\xaa\xbc\xb2\x0c\xee\x8e\x7d\x53\xa8\xdb\x5b\x64\xe3\x20\xc9\x91\xf4\x8a\x34\x58\xfd\xb1\x4c\x2d\x1d\x0e\x3a\xa6\x89\x39\x92\x09\x80\xdd\xb1\x00\x02\xb4\xeb\x0f\xea\x3b\x6a\xe0\xc1\x83\x8f\xcd\xbf\x36\x70\xad\xeb\xda\x2e\x4b\xa7\x67\x47\x76\x9b\xd6\xb3\xf4\x44\x75\x8c\x24\xcf\xb6\x0e\x3a\xaf\x25\x92\x15\x67\xc9\x31\x6d\xac\x23\xd4\x99\x38\xbb\x54\xf9\xc7\x98\xb4\xf1\x28\x4d\xb4\xe6\xf4\xb1\x64\x53\x14\xd5\x93\xe2\xa4\x5d\x10\xe1\xa5\x15\x2e\xb9\xf3\xa6\x12\x74\x71\xfd\x59\x17\x6d\xa8\xf2\xc6\xe6\xf3\x0c\x26\xe8\x6f\x79\x41\xa5\x75\x76\x4f\xd6\xb6\x76\xa7\x2d\x07\x09\xc2\x1b\x2c\xad\xd5\x9a\x29\xd4\xda\xc8\xf2\xd5\x27\x69\x84\x4a\x94\xed\xb1\x45\x50\xd1\xd7\x75\x5c\x1e\xa7\x81\xdd\x7d\xdb\x3f\x2e\xee\x35\x63\x9f\xa7\xed\xfe\x49\x24\x0d\xc0\x03\x0a\x65\x38\x6d\x48\x57\x05\x52\x1e\xe3\x96\x47\x96\xde\x0e\xb7\xcf\xb1\xc4\x76\x54\x19\xf2\xe0\x6a\x48\xb1\x7f\x71\x70\x01\x77\x8f\xd2\x95\xeb\x4a\xec\x60\x65\x35\xcc\x97\xc9\x31\x65\x8c\x54\x42\x00\x25\x13\x16\x26\x42\x5f\xd9\x0c\x4c\xb6\x03\x58\x52\xe7\x15\x3b\xb2\x35\x24\x0a\x63\x5f\xfe\xe9\xc4\x24\x50\x4a\xd1\x90\xa0\x31\x88\x8f\x1e\x58\x96\x6c\x44\xc4\x9f\xbf\xfe\x7e\x9d\xbe\xb3\x32\xff\x87\x1a\xb0\xee\xd9\x82\x18\x48\xc3\x9f\x56\xcf\x6f\xa2\xd3\xc5\x11\x9b\x85\x2e\x80\xdf\x4d\x40\x45\x14\x90\x25\xf8\xde\x0c\x31\x31\x63\xf4\x3e\x68\x67\xde\x31\x6c\x77\xd5\xac\xc6\x12\x85\x46\x67\xf0\x97\xec\x87\x24\x70\xf6\xf7\xad\x67\x95\xb9\x8b\x6a\x85\x96\xfc\x8c\x54\xb7\x9e\x7f\xec\xe2\xc2\x85\xf7\x23\x2c\xde\x99\x71\xbc\x8c\x86\x8e\xf5\x6e\x79\xb2\x26\xd8\x9c\x3a\x32\x98\xc7\x40\x6b\x4c\xb5\xda\x2d\x1d\x03\xd6\xce\xbd\x15\x65\x48\xaa\x8d\x00\xae\xdd\x24\x15\xea\x4e\x5d\xb5\xfa\xa0\x6a\xeb\x5d\xd8\xd0\x52\x74\xd1\x91\x5c\x60\x07\x74\x86\x32\x7d\xda\xb2\xc5\x58\x95\xe5\x8a\x4b\xe2\x62\x8f\x48\xad\xbb\x15\xde\x33\xdf\x30\x65\x44\x0d\xba\x1d\xd4\x15\x24\x39\xab\xd1\x89\xa1\x9c\xbe\x32\x38\x46\xc8\x3b\xa0\x54\xee\x5a\x3e\x09\xb8\x26\x17\xcb\xa2\x6c\x41\x8e\xc8\xff\x98\x2f\xb0\x33\x5a\x56\x27\x3c\xa1\x2c\x98\xd4\xee\x9d\x8c\x62\x28\x35\x7c\xcd\xd0\x17\x04\x39\xae\xb8\x3a\xd1\xd2\xb8\x17\xbc\x10\x35\x7c\xf8\x94\x1a\xce\xa9\xea\x32\xd1\x00\x2e\x1c\xc1\x50\x1d\x41\x6d\xf2\x23\xda\x86\xf6\xcb\x56\x54\x0f\x00\x81\x87\x54\xd3\x72\x07\xc1\x6a\x78\x34\xdb\x26\x09\x8f\x2c\xe0\x89\x6f\x2a\x37\x47\xe7\x8c\x63\x4c\x52\x58\x9d\xab\x73\x16\x44\x8d\xae\x6e\x5f\xb1\x44\x0f\x1c\x42\x3e\x9d\x05\x68\xee\xd1\xbb\x9a\xe0\x13\x39\x23\x9d\xd3\x89\x03\x2f\x34\x31\x91\xd9\xa5\x4e\xc1\x46\x88\x3c\x4e\x1d\xa6\x8b\xb2\xaa\x5f\x43\xea\xba\x07\xc1\xb6\x76\x18\x9c\x30\x1b\xbf\x02\x00\xac\x28\x58\x84\xd1\x43\x77\x82\x4e\x22\x2c\x9d\x3f\x11\x97\x19\xca\x8c\x39\x36\x54\x0e\x4f\x3c\xbe\x75\xdc\xc9\x12\xb5\x50\x61\xbd\x55\xf1\x08\x31\x97\x8b\x7b\xac\x30\x97\x5b\xb1\xcc\x1c\x29\x79\x66\xec\x1b\x2b\x3a\xfd\x33\xd2\x31\x79\x62\xb7\x16\xfb\xb1\x5e\x35\xa7\xe1\xd0\xb8\xfc\xcf\x77\x80\x60\xad\x85\xed\x58\xfd\xe1\xdf\x3b\xa9\x78\x64\x6a\x66\xf4\x94\x51\x91\x4d\x77\x5d\x56\xb5\xc1\xca\xa9\x17\x1b\xdb\xb1\x46\xbe\x75\xa6\x86\xc2\xa5\x67\x8f\x63\xbe\x24\x2a\x22\x9c\x57\xbd\xcb\x8b\xdb\xd0\xdc\xf7\xf2\x31\x0d\x78\x8f\x31\x2b\xbf\x99\x2b\xcc\x29\x07\xca\x8f\xb4\xd1\x5c\xe7\xc1\xf2\x23\xa0\xc2\x8a\x50\x32\x98\x68\xe2\xc6\x77\x78\x02\x01\xcd\x7c\xef\x3d\x8d\x68\xaf\x92\x60\x08\x40\x2c\x52\xfa\x8b\x69\x24\x35\x04\x4e\xf4\x45\x5e\x5c\xe2\x90\x63\x14\xaa\x25\xd2\x50\x6c\xaf\xa9\xdd\x92\x15\x8e\x97\x9f\x99\xad\xc4\xb9\xc7\xa3\x32\xd6\x53\x60\x6a\x1f\x90\xd1\xc6\x98\x7d\xd7\x2d\x93\x7a\xbd\xfc\x82\x3f\x8f\xe2\xf8\x7b\x48\xd2\xeb\x87\xdc\x8c\xe2\xe4\x5d\x91\x06\xe5\x11\x66\x30\x0c\x7c\x99\x2e\x55\x8b\x95\x9c\x69\x2c\x72\xfb\x75\x70\xdd\x5e\x67\xcc\x9d\xfd\x33\x06\x1a\x88\x68\xc2\xe4\xe1\xf4\x8a\x66\x33\x2c\x2d\x26\xc4\xd9\x2e\xe7\x7b\x18\xf0\x4b\xa5\x28\xd9\xdf\xd4\xad\x0c\x5c\xf1\xb1\xc2\x5c\x39\x00\xdc\x47\xa0\x08\xaf\x91\xdc\xd0\x19\xd6\x05\xc5\xa8\xea\xeb\x40\xfd\xf2\xc3\xa5\xa4\x0f\x44\xcf\x87\xcf\x3b\x35\xa5\x8a\xbd\xe9\x38\x1c\xd6\x56\x9e\xc0\x55\x8c\x24\xbf\xa3\x00\x9c\xc2\xc4\x03\x21\x83\x0e\xcc\xc3\x75\x25\x4e\x74\x1f\x4f\xd1\xbd\x00\x11\xbe\xc7\x6f\x3b\x10\xe2\xbd\x18\xc1\xb9\x2e\x62\x6e\xb2\x79\x8d\x11\x9e\x01\x93\xb6\x19\x41\xe4\x54\xee\x3c\x8c\x86\x42\xf6\x16\x58\x11\x15\x93\xc6\x31\xda\x5b\x28\x5a\x47\xd1\x91\x17\x3e\x79\x2e\x97\x24\x99\x48\x0c\x31\x84\xe7\xda\x88\x38\xe0\xc4\x2f\x2b\x4e\xd8\x7c\x0c\xec\x9b\xc0\x3c\xe4\x1f\xb6\xba\x64\xf8\x0b\xd1\x1b\xd3\x19\x0d\x07\x2f\x84\xc0\x8a\x19\x64\x6a\x8d\xbb\xcf\xbd\xc4\x75\x4f\xb6\x7b\x7a\x8d\xc0\x79\xa0\xba\xf0\xc7\xce\x99\x04\x50\xe4\x2e\x83\x07\x30\x45\xd8\xd4\xf6\xc3\xb8\xac\x69\x75\x91\x80\x48\x19\xdc\x02\x11\x15\xbc\xb2\x2c\x03\xae\x15\x25\x31\x56\x41\x7b\xa9\x45\x0e\x64\xc9\xf3\xd8\x96\x26\x9d\x43\xdd\x09\x90\x14\xb2\xab\x97\x66\xa7\x90\x7d\x12\x16\x53\xf1\x7d\x35\x6e\xbe\x78\xfe\xe7\xa1\x44\x2e\x03\x1f\xe8\x2c\xc9\xdd\x63\x6c\xd1\x5b\x20\xda\xf3\x03\xc9\x69\x80\x03\xce\xa3\x40\x9c\x17\xb1\xc2\xcd\x6b\x52\x88\x83\x47\xe8\x2d\x3d\xa6\x62\xef\xde\xb5\x56\xe0\x20\x80\x13\x82\x2e\x5b\xc1\xa4\x54\x4a\xe2\x9b\x4d\x78\xcf\xf3\xdd\x35\xee\x3e\x5a\xe9\x56\xd6\x61\x83\x09\x4c\xe5\xea\x7f\x05\xbf\xec\x2f\x17\xf9\xe6\x46\xf9\x1c\x5a\x88\x3f\xaf\xb9\xf4\x6f\x51\x5e\x8a\xcf\xb0\x56\xe4\x6e\x6a\xb0\x6f\xda\xdb\xfc\x7a\xef\xc3\x6f\x12\x21\x83\xcc\x80\xdc\x4e\x1e\xb6\x04\x71\x20\x3a\x8f\x3e\xa7\xdf\xc3\x3f\x3f\xf1\x7b\x66\x2a\xc3\x7e\xf3\x91\x9a\x1e\x17\xcb\xd5\xca\xae\x0f\x46\x32\xf8\x90\x21\xd5\x94\x3f\x95\xe9\xe1\x3d\x11\xb8\xb5\x3f\x8f\x92\x13\x8f\x4e\x6f\xc8\x60\x53\x1f\xbc\x86\x39\x06\x38\x52\x6e\x3d\x92\x2d\x5f\x43\xd6\xdf\xdf\x67\x57\x11\x18\xed\x43\xb8\x4d\x1b\x4c\xe8\x57\x45\x89\x8e\xed\x3f\x33\x96\x35\xe8\x46\xa9\x6d\xec\x29\x3d\xdc\x02\x43\x74\x97\xda\xd7\xfc\xa0\x58\x88\xec\xef\xa1\x2d\xb5\x0d\xbf\x1f\x0f\x1c\xec\x82\xc8\xfc\x42\x8d\x11\xc9\x3f\x18\xa4\xe3\x65\x44\x06\x3a\x6c\xf0\x9e\x04\x58\x63\x4b\x4c\x80\x93\x65\xc6\x48\x3a\xf0\xa0\x3f\xbe\x0f\xfb\xc5\x07\x9e\x96\x84\x2d\xb1\x06\xd2\x9e\x74\xc7\xb2\x48\xe0\x96\x04\x5a\x6a\x2b\x36\x7b\x36\xbe\xe0\x03\x15\xbc\x3f\xf1\x07\x88\x2e\xc3\x97\xfc\xcd\x0b\xaa\xea\xa8\x82\xc5\x5e\x73\x4b\xb7\xe2\x4c\x72\xa4\xa0\x9f\xf9\x09\x63\xc9\x44\x42\x35\xfe\x1f\x7b\xdf\xad\x73\x31\x8f\x6d\xd7\xdf\xc7\x70\x67\xa8\x50\x4e\x30\x5c\x48\xe7\x28\xe7\x1c\x3a\xe5\x9c\xb3\x00\xbf\xbb\x71\xbe\x01\x8c\x7f\xdc\xdd\x7e\x08\xa8\x10\x41\x70\x8b\xe4\x02\xf7\x5e\x14\xc9\xf5\x26\xba\xdc\x51\x74\xb4\x9f\x00\x48\x5c\xd4\xa4\x08\xc8\x17\x58\xb4\x44\x17\x08\x3a\x3b\x8b\x95\x99\x22\x13\x43\x7b\xcd\x0c\x77\xb2\x10\x8c\xc0\xad\xe9\x0d\xe8\xbd\x43\xe4\xfd\xe4\x08\xb5\xf1\xa8\x3e\xd3\xa4\xe8\x6d\x8c\x5c\x50\x42\x6a\x69\x9d\xc9\x8a\xd3\x2d\xcb\xba\xd0\xa2\x44\x4c\xa5\x8a\xa7\x31\x9a\xcb\xd7\x9d\xd0\x69\x06\x94\xfa\x36\xbc\x7e\x8b\x6d\x8f\xe4\x8f\x31\x82\x25\x7c\xfd\x63\xa3\x0b\x07\x19\x35\x61\x74\xb3\x6a\xef\x00\x18\x09\x48\x05\x45\xa5\x1d\x20\x6f\x70\x97\xa7\xd8\x02\x44\xa1\x8d\xbe\x50\xe5\xe1\x0b\x80\xe7\x89\x12\xdb\xa1\x27\xbd\x1c\xf8\xa3\x3b\x61\x74\x01\x96\x27\x61\x73\xb4\x49\xe6\x00\xbd\x26\xc1\x6e\x9f\x62\xc2\x5b\xc4\x97\x46\x48\x7d\x85\x09\x7c\x82\x13\x30\x51\xed\x22\x1c\xf1\xc8\xe3\xd8\xd7\xec\xaf\xa3\x34\x46\x84\x1e\x53\x2c\x13\x28\xe3\x84\xe8\xd2\x3b\x6b\x2c\x77\x4b\x9e\x71\x39\xdc\xc0\x29\x20\x6b\x01\xd1\x19\x96\x64\x94\x71\xd0\x68\xc7\x2e\xaa\x79\xf3\xc3\xff\x9a\xb5\xcf\x10\x19\x7c\x9f\x15\xca\x5d\x4d\xfd\x60\x07\xb9\x19\xe2\x17\x0c\x49\x1c\xbd\x80\x92\x46\x04\x3a\x9c\x89\xa2\x07\xe9\x5e\x5c\x21\x52\x17\xd5\x23\xcc\x7f\x84\x6e\x49\x9a\x89\xd0\x54\xe0\x28\xa2\x73\x48\xe8\x64\xa7\xee\x8e\x16\xda\x33\x82\xe4\xa7\x9e\x12\x91\xe4\x18\xaa\x8d\x00\x1d\x7d\xb2\x9e\xb7\x3d\x4f\x7a\xd4\x72\x22\x8c\x5a\x1b\x5b\xb9\x07\x92\xc5\xf7\xeb\x2a\x5e\x1f\x80\xb5\x94\xaf\x6f\x19\x27\x0b\x5a\x99\xc4\x46\x67\x59\xa4\xe5\x8e\x72\x7c\x5f\x75\xc6\x11\x7e\x91\xeb\x73\x4d\x8a\x3b\x63\x18\x17\x5e\xf5\xa2\x3e\x94\xa8\xa0\xfb\x4c\x13\x61\xc8\x24\x44\x51\x5d\x71\x34\xd4\xd3\x63\xda\x6b\x61\x47\xb9\x19\x9e\xc3\x2a\x2d\xca\xa7\x1d\x4e\x88\x5c\x8b\x52\x2d\x0f\xd4\xef\x2f\xd5\xf3\x79\xbb\x30\xe9\x9b\x48\xc6\x19\x30\x46\x64\x85\xc5\xf6\x42\x52\x7d\x95\x1f\x85\x4a\xbc\x5e\xb6\xbf\xec\x45\x16\x47\x88\x90\xf3\x12\x0b\xe3\xb2\x47\x8e\xd7\xcf\x8f\xfe\xf9\xd3\x27\x9b\xa5\x68\x41\x9b\xa8\x07\xc2\xc6\x8c\x36\x07\x06\xb0\xab\x30\x83\x30\xf1\xcd\x57\x73\xe2\xee\x4a\xc7\x3b\x4b\x3f\x8f\x6f\xc3\x0f\x90\x6d\x1e\xc3\x13\x0f\x17\x47\x8c\xff\xe0\x71\x79\xa0\x93\x9f\x45\x1f\x82\x3c\x94\x61\xf5\x37\x62\x0b\x51\x3a\xf6\xf1\x02\x6d\x2b\x10\x84\x80\x92\x68\xcd\x38\xda\x08\xaa\xc8\x0c\xe1\x0b\x9e\x86\x48\x38\xe3\x1c\x43\x78\x59\xa4\x0a\x9e\xed\x18\x40\x54\x7f\x24\x32\x44\x69\xd0\x6e\x68\xac\xf7\x28\xa7\x71\x2c\x4a\x35\x5e\xec\xc7\x13\x09\xf0\xbc\x9b\x04\x82\xf6\xd4\xa2\x4e\xf7\x16\x8b\x71\x55\x9e\x3c\x91\xa0\x35\xa6\x09\x3a\x65\x32\x4c\x90\x18\xf0\x98\x16\xa5\xdd\x40\x43\x47\x0b\x64\x71\x9d\x51\xed\x29\x49\x47\xca\x91\x04\xea\xd2\x1c\xab\x87\xe2\x78\x3b\x0a\xa6\xbd\xa7\x59\x0c\x14\x13\xfa\x38\xc6\xe8\x58\x1d\x0c\x28\xcc\x38\xf0\x7a\xbe\x7e\x43\x9b\xb3\xb9\x6c\x0b\xd4\x5b\x50\xef\x50\x4e\x37\x68\x56\x9c\xee\x08\xd4\xc0\x77\xe9\x09\xa4\x40\xf3\xc2\x37\x24\x01\x9b\x08\x08\xf1\x1b\xd8\x08\xea\xc3\x36\x78\xb4\xc5\x67\xf1\x81\x48\x07\xda\x59\x53\x6c\x7b\x84\x2c\x3a\xc8\xf0\x2f\x65\x5e\x94\x4a\xcb\xea\xb3\x23\x0b\xf3\x85\x1d\x07\x0e\x29\xc7\xa3\x42\xde\x4c\x09\x2a\xd6\x90\xb2\x39\xbc\xd7\x9a\xb0\x5a\xdc\x9e\x4e\x5b\x52\x02\x28\xf7\x2f\xcf\x29\x8f\x14\x63\x7f\x7b\xc4\xf6\xe1\x8d\x78\xf6\xf2\x5a\x5e\x94\x0d\x85\x75\x8e\x70\x3d\x82\x67\xbd\x23\x6d\x76\xec\xce\xe5\xe9\x67\x77\x4a\xa1\x51\x47\x2a\xac\x5f\x7c\x83\x72\x6d\x74\xa7\x16\xbc\x6f\xcb\x13\x59\x20\xfb\x32\x9d\xf2\xad\xaa\x49\xfa\xe8\x0a\x54\xc2\x8a\xcc\x7f\x60\x1a\x3c\x29\x3c\x3f\x1a\xc6\x7b\x79\xdf\xf5\x50\xf3\xbd\x37\xd8\x65\x9c\xcc\xe5\x6e\xc9\xfe\x86\x30\x5d\x7a\xf4\xb9\x52\xe2\x41\x6e\x75\xef\xec\x69\x61\x86\xbb\x21\xb6\x00\xdb\xbb\xf3\x36\x2d\xc9\xf0\xe3\x01\xc5\x92\x19\xa2\x53\x01\x6a\x9f\x1f\x03\xcc\xf3\x76\x16\xf8\x0f\x5c\x1a\xa3\x3b\xb8\xc3\xbc\x28\xf4\x99\xf9\xda\x6b\xbc\x60\xa5\x09\x34\x7b\x5a\x27\x2c\xb4\xf6\xf1\x6e\xac\x52\x8c\x29\xbd\x5c\x9a\x3b\x11\x41\x85\xad\x3b\x1e\xe4\x68\x26\xf3\x0d\xdd\xa0\x51\xca\x73\x52\xdb\x43\x98\xf1\x9d\x3d\xa2\xec\x32\x71\x31\xda\x89\x34\x7a\x61\x74\xd9\xb5\xd2\x3a\xd9\x5c\xdf\x8c\x34\xcc\xb1\x44\x52\xa3\xe5\x9d\xc7\xeb\xe5\x52\xbe\xce\x7c\x4d\x90\xce\x10\xbf\xf7\x46\xa4\x72\x05\x71\x73\xea\x94\xe8\x9d\x85\x30\x0d\xd2\xfb\x85\x3f\x66\xd5\x7d\x13\x5d\x04\x1c\xab\xf7\x4e\x07\x00\x66\xda\x55\x25\xfe\x48\x77\x02\xa3\xb2\xd2\x40\x51\xfd\xc9\x6a\x46\x01\x0a\xb7\xc3\x55\xbb\x82\x32\x55\x60\xab\xf4\xc9\xa8\x81\xaf\x23\x7f\xf5\x17\x44\x29\xd8\xf6\x96\x50\x7a\x8b\x05\x07\x8a\xcd\xee\x31\xc8\xa3\x44\x40\x59\x95\x66\x31\x3b\x42\x88\x94\xbf\x2d\x06\xa4\xe6\x28\x68\x2b\xce\x77\x3e\x7f\xff\xfc\x63\x05\x95\x46\x22\xe3\x14\x90\x48\xec\xb0\x51\x65\xa9\x42\xaf\x31\xba\xee\x8d\x81\xfd\x06\xf8\x93\x9a\x20\x7b\x63\xd0\xa6\x8c\x92\x34\xc7\x27\x4c\x33\xc8\x85\x59\x5f\x0f\x91\xea\xbf\xe8\xff\xc3\xf8\x84\xa4\x02\x9f\x06\x29\xdf\x0d\x29\x4d\xab\xa1\x8b\x63\x3c\xc7\x6f\x9f\xd0\x43\x3c\xc4\x74\xf1\xfa\x0b\x54\x9c\xe3\x91\x0e\xf8\x28\x3b\xb4\xc3\xb3\x57\x44\x35\xd2\x61\xd7\xea\x3a\x28\xcd\x34\xbb\xf5\x45\x1e\xd6\x7b\x65\x71\xec\x04\xad\xbd\x94\x26\x4a\x19\xdf\x6a\x21\xb2\x02\x26\xe2\x21\x1a\x08\xe0\xf0\x1e\x20\x4c\x10\x7d\x21\x0e\x75\xc1\xbe\xf5\x35\xd5\xd7\x09\x39\xdd\xae\xae\x98\x5d\x7e\xd7\xf9\xaa\xb2\xb0\x34\x14\x78\x5f\xbf\x88\xf0\x65\xc7\x0a\x6b\x14\xba\x15\x07\x48\xb4\xe9\xd0\xe3\xd9\x09\x4a\x15\x7e\x01\x4e\xa6\xac\x4c\x42\x42\x84\xaa\xd7\x1f\x20\x0f\xcf\xfb\x9a\x3c\x4f\xe4\xea\x34\x78\xb7\x8e\x66\xe5\xc1\x79\x79\x03\xf5\x1d\xe7\x41\xf8\x9a\x2a\xc5\x3b\x5b\x09\xb4\x2f\x2f\xeb\x33\x05\xb9\x31\xe6\x88\x08\xc8\x75\x8a\x50\xe7\x78\x0b\x58\x0e\x96\x07\x94\xe9\x22\x57\x4b\xce\x79\x7a\x22\x70\xae\x04\xba\xe8\x42\x61\x5d\x39\xd5\x6c\x6a\xd4\x4a\x8f\xd6\x10\x62\xed\x03\x64\xb1\xfa\xc0\x40\x2e\x57\x1f\x0b\x37\x65\x7d\x42\x26\x32\x33\x54\x75\xe0\xdd\xe6\x74\xff\x5c\x21\xaa\x30\xf9\x4e\xda\x7f\xf3\x35\x0e\x94\xe3\x93\xa9\xd0\xa7\x4a\x58\x13\x25\x7f\x7d\x73\x6f\xa9\x70\x5b\x00\x2d\x07\xbe\x1f\xc2\x30\xee\xad\x51\x9c\x7f\x42\x92\x06\x5a\x0f\x53\x39\x62\x58\x17\xb4\x9c\x91\x2d\xcc\x2f\x42\xef\x17\x38\x79\x8c\xaa\xd0\x5a\x90\x36\x93\x60\x9c\xf7\x64\x0f\x7f\xfd\x54\x9e\x28\xb1\xfb\x2f\x5f\x6b\x65\x8b\xb8\xc9\x4b\xe6\x0f\xee\x60\x74\x61\x7a\xb0\xe6\x1a\xee\xeb\xd6\x53\x29\x82\xd4\x61\x94\x7d\x4e\xad\xa7\x39\xbe\x80\x7a\x17\xca\xa3\xb5\xa2\x9b\x13\x75\xe8\xf5\x72\xe0\xc1\xba\xeb\xfb\xa1\x0f\xe5\xdc\xbd\xbf\x1f\x74\x57\x95\x67\x4f\xfd\x1e\x7a\x22\x1c\x7c\xba\x57\x7b\xb5\x59\x2b\x45\xfa\x00\xff\xf4\x60\x7b\x69\x16\xb0\x55\x79\xa8\x95\xbb\x1d\x09\x11\x0f\xde\x19\x2f\x9e\xb7\x7d\x3f\x0f\xb8\xa4\x53\x6a\x48\x77\xbd\x57\x53\x9d\x6b\x8d\x63\xed\x86\x72\x31\x7f\xe8\xf0\xbd\x41\x71\x9c\x66\x5a\x23\x77\x84\xb8\x65\xf5\xc3\x79\x9f\xf3\x84\xc9\x17\x94\xde\x0c\x55\x90\x6e\x4d\x6e\x68\x56\x1d\x42\x1f\x6a\xd3\x25\x79\x73\x50\x98\xfe\xe7\xed\x03\x76\x5f\x13\xe3\x07\xb5\x21\x1d\xf0\xd4\xd5\x53\xdc\xf8\x34\x97\x74\xcf\x10\x2a\xbf\x19\xe1\xd3\xbd\x26\x7c\xd1\xa8\xd0\x05\x09\x9f\x34\x38\x67\x2d\x8f\xa7\x4a\xf1\x7d\x10\x32\x9b\x49\x58\xe7\xa6\x41\xb9\x0f\xee\xda\xd4\x2e\x14\x0a\x22\x6d\xb3\xb5\x55\x94\x6d\xfa\x54\xc9\x92\x0c\xcb\x02\x94\x83\xf6\xe3\xd7\xaa\x03\xfd\x86\xe4\xdc\x2a\xca\xad\x33\x5d\x75\xa1\x46\x6a\xa5\xdb\x2c\x64\xd6\xed\xfe\xee\x04\x6e\xa6\x59\x41\xf6\x35\x81\xf7\x24\x58\xe3\x03\x22\x12\xdd\xba\x8f\x0f\x8b\x2d\x72\x93\x8e\x08\x4c\x87\xe9\x8e\x50\xe1\x53\x0a\xc8\x48\xaf\x09\xb2\xc3\x24\x3d\xb2\x77\x9e\x05\x5c\xe6\xf6\x76\xe8\xc3\x34\x0e\x26\x79\x02\x17\xa7\x39\x11\x5a\x6c\x04\x6d\xad\x9d\xfd\x3e\xbc\xfe\xd2\x83\x60\x39\xa2\x24\x9d\x68\xcf\xee\xb0\x14\x91\x3a\x54\x79\x7a\x0b\x1e\xc2\x4a\xd0\xcf\x89\xe5\x09\x40\xc0\xdf\x81\x5c\xc7\xa1\xef\x67\xb5\x76\xba\x5b\xe5\x5a\xb7\xfe\xb5\x5e\x8d\x34\xae\x4d\xfd\x3c\xfb\x9c\xe2\x4c\x75\x68\x2d\x4a\xed\xf2\x7b\x92\x3f\x46\xb3\x23\x64\x51\x9a\xe1\xc2\x47\xc7\x77\x22\x84\x1a\xca\x49\x7b\xf3\xcd\xf1\xad\x21\x32\x0f\xec\xdb\x19\x27\xa6\x63\xf5\x66\x2b\xdb\xe0\xf5\x37\x74\xed\x69\x90\xaf\xa1\xbd\x73\xbf\x8f\x85\x35\xcd\x34\xa8\x3f\x7a\x96\x01\xa0\x3b\xc3\xe9\x16\xc6\xfb\xf4\x61\x98\xaf\xd4\xfc\x69\xed\x36\xd8\x21\x95\xa8\x48\x3f\x60\x0e\xd1\x00\xb7\x91\x2b\x51\xf4\x30\x49\x0b\x6d\x81\x81\x07\xfd\x77\xce\x4a\x41\x4d\xf3\x19\xb1\x45\x69\x02\x32\x3f\x42\x92\x46\x54\x37\x1a\xea\x1a\x72\xcb\x06\xda\xd5\xf2\x84\xc8\xe2\xfc\x79\x62\xe0\x6c\xc9\x85\xc7\xd8\x5b\xfb\x92\x80\xeb\x76\xb8\x61\x73\xa6\x74\xe3\xa2\xdd\x12\x6a\x3b\xa4\xa2\xba\xe6\x9f\x29\xff\x00\x79\xb1\x21\xdf\x01\x4d\xf6\x01\x16\xaf\xd4\xe6\x18\xe6\xbb\xfc\xe2\x68\x54\x85\x5f\x1a\x24\xe8\x82\x02\x9a\xe9\xd9\x56\x05\xe8\xc1\xab\x52\xd8\x49\x30\xc6\x9f\x6f\xcc\x8b\x33\x9b\xad\x73\x18\x18\x86\x61\xb4\xe6\xa5\x55\x07\x92\x31\xa0\xb4\x39\x9f\x37\x43\x10\x69\x45\x18\xf7\x7b\xdb\xf3\x8d\x77\x27\xf3\x8d\x34\xc2\x74\x82\x34\xf1\x6f\x4d\xe1\xeb\xd3\x04\x89\x0b\xa6\xd8\x22\x4a\x61\x5a\x98\x36\xcb\xf7\x1b\x93\x26\x4e\xff\x1d\xde\xed\x13\xbc\x38\xc2\xf4\x54\xfc\x0c\x13\x18\x33\x65\x01\xb3\x06\x3b\xa8\xea\xb2\x54\xb8\x21\x5f\xb4\x7f\xc8\x5a\x61\x80\x56\x9a\x6d\x8d\xa8\x25\xa6\xd0\x8a\xe2\x6e\xc3\x8d\x37\x24\xd5\x11\xd0\x9e\xba\x50\xfd\x5b\xca\x3f\x2b\xec\x7b\xb1\xcf\xb4\x3e\x14\x68\x0c\xae\x0c\x01\xa5\x29\xa2\x0f\x20\xf2\x82\x5d\x25\xfb\xdb\xc1\xac\x95\x89\x3f\x18\xb2\x57\x26\xd4\xab\xa7\xa5\xec\x55\x6a\x7c\x95\x31\x8c\xf4\x01\x17\x62\x98\x9b\x08\x30\x5b\xec\xd0\xcb\x12\x5d\xe0\xec\xc0\x7a\xea\xd6\xfb\xe5\x98\xe7\xc0\x1f\x63\xba\x54\xd6\xf9\x4f\x7a\x48\x5f\x1d\xa4\x7c\xa1\xb2\xbf\xd6\x5c\x92\x65\x35\x1a\xf4\x76\x7c\x71\x82\x2e\x4c\x91\x82\xb3\x3d\xdc\x35\xc8\xbc\x01\xf3\x7e\x35\x54\x0f\xc8\x7c\x46\xd3\x59\x1f\xc0\xc4\x68\xe7\xb6\x62\x36\xc6\x10\x58\x10\x24\xfc\x13\x41\xc8\xfc\x0c\xa9\x54\xb8\xb3\x52\x94\x1f\xaf\x9f\x97\x60\x80\x82\xd5\x54\x59\xcf\xe7\x7d\xed\x5f\x07\xe7\xa1\x6d\x75\xae\x5d\x75\xa0\x5d\x75\xe8\x67\x63\xac\xcf\xb3\xad\xf2\xcf\x94\x4d\x01\x2a\xff\x90\x0d\x06\xeb\xb6\x37\x38\x6f\xed\xf3\xba\xbb\xfd\x62\x1a\x01\x0d\x56\x81\x44\xbd\x85\xb7\x1a\x71\x62\x19\xe6\xc3\x88\xb8\xe0\x8e\x25\x4a\xd0\xc5\x81\xa6\x34\x35\xc8\x4e\xd4\x9f\x28\x92\x8e\x31\xac\xbf\x64\x8e\xa9\x73\xb1\x2e\xc4\xbe\x26\x43\x3c\x24\xc8\xbe\xc6\x01\xdc\x47\x88\xf1\x15\x52\xdf\x32\x61\xdf\xf7\x13\xba\x38\xa7\x47\x6d\xa0\x5d\xf9\x05\x1e\x8e\xf9\x62\x58\xa4\x6f\x08\xf9\x0c\xfd\x9c\xec\x6d\x84\xc0\xad\x87\xa8\x7d\x83\x6e\x01\x99\x0b\x43\x7d\x31\xf4\x26\x62\x80\x02\x16\x7b\x0e\xd0\x05\x5e\x52\xf4\x00\x27\x41\x3f\x0f\xf6\x10\x0f\x7f\xbf\xff\x9a\x08\xe6\xa8\xeb\x37\x8b\xc2\x89\xa0\xfb\x6c\xc5\x30\x2c\x87\xcb\x36\xc7\x7b\x79\x18\xc2\xb4\xe9\x24\x42\xdd\xc1\x7a\x30\x2f\x89\xde\x7a\x8f\x5e\x49\x02\x0c\xb1\x8c\x78\x97\x45\xd8\xe3\x56\xa7\x7e\x10\xca\xe9\x70\xe3\x07\x7a\x07\x4d\x92\x7e\x86\xfa\x56\xfa\x91\x00\x44\x6f\x99\x49\xe8\x5d\xeb\xd6\x5c\x0f\xf9\xa1\x68\x4b\x93\x47\x6f\xa3\xcb\x2a\x7f\x30\x2e\x7b\x58\x76\xbc\x7e\x71\xba\x59\xb0\x87\x58\xb0\xc7\x99\x08\xc6\xf9\xf7\x5d\xbf\xda\x58\xcb\x12\xfc\x15\x8c\x29\xb3\xa7\x43\x9f\x2c\x6e\xab\x30\x85\xd6\x82\x12\x1d\xc1\x37\x44\x77\x2d\x44\x73\x39\x44\xaf\x23\x89\xfd\x54\xd5\xf4\xc1\xb0\x43\x6d\x66\xcd\xe5\x72\x00\x2c\xfe\x94\xd8\x92\xa2\x8f\x09\x67\xc4\x01\xb7\x73\x14\x90\x5d\x88\x63\x15\xee\x2e\xfd\x53\xf0\xbb\xb7\x74\xc0\x9b\x24\xe0\xf7\x14\x83\x36\x93\x31\xf6\xba\x94\x1f\x0a\x54\x1f\x6a\xd4\x80\x32\x7b\x69\x10\x3c\x2f\x5c\x7f\xa9\x53\x7d\x33\xd4\x7f\x2c\xa7\x2f\x71\xf3\x4f\x3a\xd2\xf3\xf1\xa2\x0c\xcb\xec\x5b\x65\xe2\x04\x8c\x93\xf2\xa9\xfe\x84\xab\x95\x56\xc2\x41\xdd\x67\x19\xd9\xaf\xbc\x4f\xf5\xb7\x6f\x4f\x69\x96\x25\xe8\x97\xa4\x4d\xad\x74\x67\x99\x05\x13\x86\xbe\x4f\xbe\x6c\xbf\xe8\xb9\xf8\xeb\x5f\xd7\xa2\x2e\x86\x91\x38\xa9\xe3\x06\x7f\x88\xc5\x97\xa0\x3f\xdd\x68\x3c\x19\x29\xbf\x1b\xa8\x92\xc0\xb4\xa9\x9f\x6b\xe3\x59\xcf\xeb\xa5\x81\x9f\x0b\xbf\xff\x73\x78\x5b\xd7\xcd\x4b\x22\x34\x44\xb8\x10\x4e\xe7\x8b\x45\xfb\xaf\x05\x50\xd9\x81\xf6\xaf\x07\xe9\xff\x82\x2b\xb4\xbb\xbf\xc7\x83\xf5\x34\xd0\x82\xba\x81\x74\xd7\xf2\xf8\xdc\xfc\x62\x1c\xff\x1b\x83\xa7\xb7\x7d\xbf\x08\x3b\x5c\xb0\xfb\xf8\x37\xa0\xb5\xe7\xff\x02\x38\x38\xf4\xc7\x4f\xb7\x73\xd2\xc8\xc7\x41\xdc\x47\xa1\x59\x94\xbf\xea\x73\x1b\x49\x8f\x15\xd7\xd1\x14\xd8\x8b\x7b\xf7\x3d\xfe\x5b\x51\xe0\xa8\x28\x63\xe0\xf9\xbe\xed\xfd\xda\xfe\x77\xb7\x8a\xcf\xe6\xa1\x0f\xe7\xcb\x07\xdf\x20\x85\x65\x2f\x28\xd1\x73\xd1\x86\x84\xd6\x5f\x7e\x8e\xa8\x4d\x20\xd2\x8a\x52\xe5\xa1\x8e\x77\x5b\xd5\xc5\xee\xe1\x27\x5b\xe5\xd7\x04\xb2\x80\xb7\x03\xc5\xfe\x78\xbd\xd4\x8b\x39\xc5\xed\x7d\x9c\xf8\x9c\xb4\x0c\xff\xda\xa0\xb8\xac\xeb\x7d\x9a\x38\xf8\xa1\xbf\xea\xef\xb5\x53\x61\xa3\x93\xe1\x3c\x42\x84\xaf\xbd\x21\xd0\x80\x7a\x1b\x2f\xb4\x76\x05\xa5\x44\x31\xae\x49\x30\x2f\xd2\x26\x31\x54\x95\xb6\xd8\xc5\xfc\xbf\x74\x71\x0a\xbc\xa7\x21\x36\x32\x1a\x83\x62\xe5\x9d\x59\xcc\x3f\xd2\xc7\xb2\xdf\x87\x63\xfe\x2d\x7d\x3b\x4e\x4b\x45\xe6\x9f\xe5\x38\xa6\x88\xc2\x2b\xfb\xb7\x62\x86\x65\xdf\x5b\xc6\xfe\x33\xcb\x62\xf1\xba\x64\xaf\x7f\x2b\x86\xb3\xa2\x70\x5f\xff\x34\xc1\x32\xe2\xc0\x53\xe2\xff\x6f\x33\xfb\x8f\xcd\xff\xd8\xfc\x6f\xd8\x3c\xa1\x72\x05\xea\x3e\x34\x76\x71\x40\xba\xbf\x5c\xc7\xf3\x0d\x5b\xc1\x3f\x91\x24\xfd\xef\xff\xf1\x3f\xff\xd7\x7f\xfd\x9f\xff\xfa\xbf\x01\x00\x00\xff\xff\xbb\x94\x2f\x4d\xe9\x06\x02\x00") - -func pagesAssetsStylesContainersCssBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsStylesContainersCss, - "pages/assets/styles/containers.css", - ) -} - -func pagesAssetsStylesContainersCss() (*asset, error) { - bytes, err := pagesAssetsStylesContainersCssBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/styles/containers.css", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "pages/assets/js/bootstrap-4.0.0-beta.2.min.js": pagesAssetsJsBootstrap400Beta2MinJs, - "pages/assets/js/containers.js": pagesAssetsJsContainersJs, - "pages/assets/js/gcharts.js": pagesAssetsJsGchartsJs, - "pages/assets/js/google-jsapi.js": pagesAssetsJsGoogleJsapiJs, - "pages/assets/js/jquery-3.0.0.min.js": pagesAssetsJsJquery300MinJs, - "pages/assets/js/popper.min.js": pagesAssetsJsPopperMinJs, - "pages/assets/styles/bootstrap-4.0.0-beta.2.min.css": pagesAssetsStylesBootstrap400Beta2MinCss, - "pages/assets/styles/bootstrap-theme-3.1.1.min.css": pagesAssetsStylesBootstrapTheme311MinCss, - "pages/assets/styles/containers.css": pagesAssetsStylesContainersCss, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "pages": {nil, map[string]*bintree{ - "assets": {nil, map[string]*bintree{ - "js": {nil, map[string]*bintree{ - "bootstrap-4.0.0-beta.2.min.js": {pagesAssetsJsBootstrap400Beta2MinJs, map[string]*bintree{}}, - "containers.js": {pagesAssetsJsContainersJs, map[string]*bintree{}}, - "gcharts.js": {pagesAssetsJsGchartsJs, map[string]*bintree{}}, - "google-jsapi.js": {pagesAssetsJsGoogleJsapiJs, map[string]*bintree{}}, - "jquery-3.0.0.min.js": {pagesAssetsJsJquery300MinJs, map[string]*bintree{}}, - "popper.min.js": {pagesAssetsJsPopperMinJs, map[string]*bintree{}}, - }}, - "styles": {nil, map[string]*bintree{ - "bootstrap-4.0.0-beta.2.min.css": {pagesAssetsStylesBootstrap400Beta2MinCss, map[string]*bintree{}}, - "bootstrap-theme-3.1.1.min.css": {pagesAssetsStylesBootstrapTheme311MinCss, map[string]*bintree{}}, - "containers.css": {pagesAssetsStylesContainersCss, map[string]*bintree{}}, - }}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/vendor/github.com/google/cadvisor/pages/static/static.go b/vendor/github.com/google/cadvisor/pages/static/static.go deleted file mode 100644 index 21a3ed4b..00000000 --- a/vendor/github.com/google/cadvisor/pages/static/static.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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. - -// Handler for /static content. - -package static - -import ( - "fmt" - "mime" - "net/http" - "net/url" - "path" - - "github.com/golang/glog" -) - -const StaticResource = "/static/" - -var popper, _ = Asset("pages/assets/js/popper.min.js") -var bootstrapJs, _ = Asset("pages/assets/js/bootstrap-4.0.0-beta.2.min.js") -var containersJs, _ = Asset("pages/assets/js/containers.js") -var gchartsJs, _ = Asset("pages/assets/js/gcharts.js") -var googleJsapiJs, _ = Asset("pages/assets/js/google-jsapi.js") -var jqueryJs, _ = Asset("pages/assets/js/jquery-3.0.0.min.js") - -var bootstrapCss, _ = Asset("pages/assets/styles/bootstrap-4.0.0-beta.2.min.css") -var bootstrapThemeCss, _ = Asset("pages/assets/styles/bootstrap-theme-3.1.1.min.css") -var containersCss, _ = Asset("pages/assets/styles/containers.css") - -var staticFiles = map[string][]byte{ - "popper.min.js": popper, - "bootstrap-4.0.0-beta.2.min.css": bootstrapCss, - "bootstrap-4.0.0-beta.2.min.js": bootstrapJs, - "bootstrap-theme-3.1.1.min.css": bootstrapThemeCss, - "containers.css": containersCss, - "containers.js": containersJs, - "gcharts.js": gchartsJs, - "google-jsapi.js": googleJsapiJs, - "jquery-3.0.0.min.js": jqueryJs, -} - -func HandleRequest(w http.ResponseWriter, u *url.URL) { - if len(u.Path) <= len(StaticResource) { - http.Error(w, fmt.Sprintf("unknown static resource %q", u.Path), http.StatusNotFound) - return - } - - // Get the static content if it exists. - resource := u.Path[len(StaticResource):] - content, ok := staticFiles[resource] - if !ok { - http.Error(w, fmt.Sprintf("unknown static resource %q", u.Path), http.StatusNotFound) - return - } - - // Set Content-Type if we were able to detect it. - contentType := mime.TypeByExtension(path.Ext(resource)) - if contentType != "" { - w.Header().Set("Content-Type", contentType) - } - - if _, err := w.Write(content); err != nil { - glog.Errorf("Failed to write response: %v", err) - } -} diff --git a/vendor/github.com/google/cadvisor/pages/templates.go b/vendor/github.com/google/cadvisor/pages/templates.go deleted file mode 100644 index 45f1c184..00000000 --- a/vendor/github.com/google/cadvisor/pages/templates.go +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// 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. -// generated by build/assets.sh; DO NOT EDIT - -// Code generated by go-bindata. -// sources: -// pages/assets/html/containers.html -// DO NOT EDIT! - -package pages - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _pagesAssetsHtmlContainersHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\xcd\x72\xdb\x38\x12\x3e\x4b\x4f\xd1\xc3\xda\xc3\x6c\x55\x48\xd9\x89\x2f\x9b\x95\x55\xa5\x51\x92\x1d\xed\x38\x76\xca\xb2\x67\x6a\x8e\x20\xd9\x22\x11\x43\x04\x06\x00\x25\x6b\x5d\x7e\xf7\x2d\x00\xa4\xc4\x5f\x29\xfe\xa9\x64\x74\xb1\x44\xa0\xbb\xbf\xfe\xba\x1b\x68\x10\x1e\xff\xe4\xfb\x43\x80\x19\x17\x5b\x49\x93\x54\xc3\xdb\x93\xd3\x33\xf8\x0f\xe7\x09\x43\x98\x67\x51\x00\x53\xc6\xe0\xda\x0c\x29\xb8\x46\x85\x72\x8d\x71\x30\x1c\x02\x5c\xd0\x08\x33\x85\x31\xe4\x59\x8c\x12\x74\x8a\x30\x15\x24\x4a\xb1\x1c\x79\x03\xbf\xa3\x54\x94\x67\xf0\x36\x38\x81\x9f\xcd\x04\xaf\x18\xf2\xfe\xf9\xef\x21\xc0\x96\xe7\xb0\x22\x5b\xc8\xb8\x86\x5c\x21\xe8\x94\x2a\x58\x52\x86\x80\xf7\x11\x0a\x0d\x34\x83\x88\xaf\x04\xa3\x24\x8b\x10\x36\x54\xa7\xd6\x4c\xa1\x24\x18\x02\xfc\x59\xa8\xe0\xa1\x26\x34\x03\x02\x11\x17\x5b\xe0\xcb\xea\x3c\x20\xda\xe0\x35\x9f\x54\x6b\xf1\x7e\x34\xda\x6c\x36\x01\xb1\x58\x03\x2e\x93\x11\x73\xf3\xd4\xe8\x62\x3e\xfb\x78\xb9\xf8\xe8\xbf\x0d\x4e\x8c\xc4\x6d\xc6\x50\x29\x90\xf8\x57\x4e\x25\xc6\x10\x6e\x81\x08\xc1\x68\x44\x42\x86\xc0\xc8\x06\xb8\x04\x92\x48\xc4\x18\x34\x37\x68\x37\x92\x6a\x9a\x25\x6f\x40\xf1\xa5\xde\x10\x89\x43\x80\x98\x2a\x2d\x69\x98\xeb\x1a\x55\x25\x36\xaa\x6a\x13\x78\x06\x24\x03\x6f\xba\x80\xf9\xc2\x83\x5f\xa6\x8b\xf9\xe2\xcd\x10\xe0\x8f\xf9\xcd\xaf\x57\xb7\x37\xf0\xc7\xf4\xfa\x7a\x7a\x79\x33\xff\xb8\x80\xab\x6b\x98\x5d\x5d\x7e\x98\xdf\xcc\xaf\x2e\x17\x70\xf5\x09\xa6\x97\x7f\xc2\x6f\xf3\xcb\x0f\x6f\x00\xa9\x4e\x51\x02\xde\x0b\x69\xf0\x73\x09\xd4\x90\x68\xe2\x06\xb0\x40\xac\x01\x58\x72\x07\x48\x09\x8c\xe8\x92\x46\xc0\x48\x96\xe4\x24\x41\x48\xf8\x1a\x65\x46\xb3\x04\x04\xca\x15\x55\x26\x94\x0a\x48\x16\x0f\x01\x18\x5d\x51\x4d\xb4\x7d\xd2\x72\x2a\x18\xfa\xfe\x64\x38\x1c\xa7\x7a\xc5\x26\x43\x80\x71\x8a\x24\x9e\xd8\x10\x8c\x35\xd5\x0c\x27\xd1\x34\x5e\x53\xc5\x25\xf8\xf0\xf0\x10\x7c\xa0\x4a\x30\xb2\xbd\x24\x2b\x7c\x7c\x1c\x8f\xdc\x14\x37\x5d\x45\x92\x0a\x0d\x4a\x46\xe7\xde\xc3\x43\x70\xcd\xb9\x7e\x7c\x54\xc6\x72\x34\x12\x5c\x08\x94\xc1\x8a\x66\xc1\x57\xe5\x4d\xc6\x23\x37\xb9\x90\xfc\xc9\xf7\xe1\x82\x68\x54\xda\xe6\x10\x65\x18\x1b\xec\xb0\xa2\x19\x5d\x52\x8c\x61\xb6\x58\x80\xc1\x69\x67\x33\x9a\xdd\x81\x44\x76\xee\x29\xbd\x65\xa8\x52\x44\xed\x41\x2a\x71\xd9\xb6\x1b\x72\xae\x95\x96\x44\xf8\x67\xc1\x49\x70\xe2\x87\xa8\x49\xf0\xd6\xe2\x88\x94\xf2\x26\xc3\x3d\x80\x2b\x61\x28\x22\xcc\xb0\xb3\xc2\x97\x9a\xb3\x4a\xfc\x77\xc1\x69\x70\xda\xb2\xf6\x14\x8d\x11\xcf\x4c\xb5\xa0\x54\x2d\xc0\x07\x19\xfb\x2f\x59\x93\x85\x0b\xc8\xce\x93\x43\x01\xfa\xfa\x57\x8e\x72\xeb\xbf\x33\x2c\xf5\x85\xe9\x90\xfc\x01\xa2\xfb\x35\xe9\xad\xc0\x73\x4f\xe3\xbd\x1e\x7d\x25\x6b\xe2\x9e\x7a\xdd\x06\x12\xbb\xcc\xf9\x5f\x15\x11\xb4\xa1\xf2\xd9\x3a\x2b\xe4\xbe\x12\xc8\x28\x25\x52\xb7\xb5\x8d\x47\x65\x59\x8d\x43\x1e\x6f\x0b\x03\x31\x5d\x43\xc4\x88\x52\xe7\xde\x0e\x89\xcb\x3e\x5f\xa5\x7c\x13\x11\x85\x1e\x4c\x8a\xe5\x70\x4c\x9a\x19\xe2\xed\x85\x99\xaf\x56\xfe\xe9\x5b\x0f\x68\x7c\xee\x31\x9e\x70\x6f\x27\x36\x22\xbb\xaf\x35\x7b\xa5\xc8\x64\x38\xa8\x0e\x08\x92\xa0\x6f\xc0\xa2\x34\x43\x66\x41\x38\x9d\xb4\xeb\x3e\x3d\x35\x72\xa3\x98\xae\xcd\x5f\xce\x4a\xf1\x50\x22\x89\x23\x99\xaf\x42\x27\xfd\xf0\x20\x49\x96\x20\xfc\x43\x10\x89\x99\x9e\xed\xdc\x7c\x7f\x0e\xc1\x97\xfa\x33\xf5\xf8\x68\x0d\x32\x3a\xa9\x38\xdb\x94\x0c\x2e\x68\x76\xf7\xf8\xe8\x4d\x3a\x86\x6e\xf0\x5e\x1b\x74\x64\x32\x1e\x31\x5a\x00\xc0\x2c\x36\x8a\xc7\x23\xce\xf6\xa4\x58\xe0\xee\xc7\xc3\x03\x5d\x42\x30\x57\x8e\xd4\x23\x5c\x41\xf1\x19\xa7\x67\x7b\x90\x41\x30\x8a\x79\x74\x67\x18\xfb\x60\xff\xc2\xde\x27\x07\x26\x3d\xeb\x31\xed\xc0\x55\x81\x2c\xf2\x30\xaa\x32\xf2\xb2\xd8\xbd\x9b\xd4\xf4\x8d\x47\xe9\xbb\x6a\xe0\x2a\xc2\x8c\x2a\xed\x27\x92\xe7\xa2\x11\x39\x55\x51\x60\xc3\xd6\x44\x38\xa8\x25\x67\x6d\x7e\x19\xac\xb6\x11\x9f\x6a\x5c\xd9\x20\xd6\xe6\xef\x23\xd8\x08\x5e\x85\xb5\x7e\x0a\x1d\x83\x2e\x06\x0b\x4d\x74\xfe\x1a\x04\x7e\x90\x74\x8d\x12\x9c\xbe\x26\x81\x39\x3b\xca\x9f\x4b\x0d\x65\xc5\x2d\x7f\x0d\x7c\x2e\xe5\x9d\x1a\xe8\xa0\x68\xac\x04\xc9\x4a\x2b\x46\x8d\xcf\x48\x88\xcc\x72\x57\xd5\x1d\xfc\x86\x5b\x43\x9d\x99\x3e\x81\xe6\xe0\xef\x84\xe5\xb6\x72\x9b\x75\x51\x67\xcd\x39\xbb\xc7\x36\x78\x1e\xb4\x85\xe6\x92\x24\x38\x0e\xe5\xa4\x00\x64\x54\xf5\x91\x35\xd8\x73\x65\xcd\xb7\xb8\xea\x47\xf5\x54\xbe\x2a\xfa\xdb\x7c\x55\x07\xeb\x7c\x0d\x76\x74\x0d\xc6\xa3\x9c\x59\x6f\x4a\x26\x8b\x07\x7d\xd9\xda\x55\xe3\xce\xab\xf9\x8a\x24\x78\x3c\x43\x61\xf7\xe9\x4f\x55\xa8\x7c\x4c\xce\x3a\xd5\x2e\x59\x2b\x23\x55\x5c\x4e\x9b\xd9\x2f\x5c\x9e\xf8\xd4\xca\x98\x7d\xab\x36\xcb\x84\x30\x94\xfb\xdf\xc7\x7c\xbb\x46\xc5\x73\x19\xa1\x9a\xae\x09\x65\xa6\xfb\x7e\x85\x1a\x9c\x2b\xce\x6c\x07\xdb\xa8\x3f\x67\x72\x26\xf2\xaa\xb1\xde\x44\xab\x30\xd1\x9b\x3f\x40\x22\x4d\xd7\xa6\xd7\x2f\x2c\xfa\xb6\xc5\x05\x41\x32\x64\xee\xbb\x37\x99\x7d\xb9\x75\xe1\xdf\x6b\x2c\x16\x6f\x81\x91\x81\x13\x5c\x98\x9e\x7b\xe7\xf8\x61\x93\x87\xea\x28\x25\xd2\xc4\xb1\xcc\x51\x21\x69\xa6\xdd\xc3\xb6\x31\xa8\xa9\xc9\x33\xba\x53\xa3\xaa\x6a\xda\xc8\xab\x41\xec\xf0\xe5\x33\xb9\x7f\x25\x77\x3e\x93\x7b\xb0\xaa\x1a\x1e\xcd\x78\xdd\xa1\xbd\xc5\x7e\x9f\x22\xfe\x22\x97\xd4\xdd\xcb\xdd\x99\x32\xc6\x37\xe6\x74\xc2\xdb\x41\x32\x16\x1a\x06\x21\xf8\x4c\xa2\x94\x66\x38\xcf\x96\x3c\xb8\xcc\x57\x56\xae\x5c\x63\xda\xe8\xcb\xa5\x66\xf7\xdb\x39\xf1\x19\x57\x5c\x6e\xbf\x6f\xc2\x3b\x9b\x07\x72\xde\x4d\x08\xdc\x4b\x07\xab\xe6\xe5\xf4\x56\x94\x35\x2b\x80\xfe\x0f\x0f\x18\xee\x4f\x9a\x42\xfe\x36\xa3\xfa\x80\xfc\x73\xb2\xaa\xd0\xf3\x4a\x85\xd2\x55\x24\x6d\xa7\x8f\xd6\x48\xaf\xbb\x85\xe4\x0b\x1c\x5d\x6c\x88\x78\xad\x45\x6e\x43\x44\xe7\xb2\xd0\xf6\xb8\x62\xf5\x19\x5e\x57\xa4\x8f\x78\xde\x2c\xbd\xc2\xbb\x5a\x17\xfa\xec\xcd\xec\x56\x99\xd6\xa8\xbf\x13\xb7\x95\x57\xd4\x9f\x90\x74\x45\xe4\xf6\x40\x1b\x60\x66\x19\x0b\x34\x4b\xda\x8d\x40\x7d\x5a\x51\xcc\x57\x6b\x94\x6b\x8a\x9b\xc3\xed\x41\xb5\x43\xc8\x0d\x62\x3f\x21\x79\x82\x5e\x5d\xa5\x39\xcd\xee\x5a\x86\x1f\xe2\xcd\x17\xc9\x23\x54\xea\x58\xb7\x53\x75\x47\x94\x22\xbe\xe6\xe2\x9b\x1c\xea\xe9\x33\xbe\xa3\x9b\xb6\xe5\xf8\x16\x07\x3b\xbc\x69\x18\x38\x9b\xdc\x70\x4d\x18\x94\x79\x78\x66\x33\xb3\xc2\x4f\x24\x72\x5f\x9b\x29\xbe\x0b\xbc\x7d\xa9\xb1\x27\x05\xca\x17\x50\x46\xd5\xec\xcb\x2d\x5c\x70\x12\xc3\x74\x8d\xf2\x80\x3e\xc6\x49\x5c\x57\xb4\x7b\x2f\x55\x45\x66\x31\x81\xb0\x47\x68\xd9\xab\x4c\xa0\xf4\xcd\xfe\xdf\x89\xaf\x5b\xe5\x2f\x12\xc9\x5d\xcc\x37\x59\x9f\x4e\xa7\x2a\x2c\xa7\xf5\x2a\x6d\xa7\xc6\xd1\xdd\xf9\x3b\xa6\x49\xb9\x51\x7f\xa7\x4c\x59\x59\x73\xc7\xc3\x10\xca\x51\xe3\x49\x05\x80\xe4\x1b\xe8\x3e\xf0\x1c\x0c\x61\x63\x5a\x7b\x39\xfe\x97\x3d\x5b\xd6\x5c\x95\x3c\x91\x68\x5f\xa3\x42\xeb\xd3\x35\xd1\x0f\x89\x84\xea\x0f\x3f\x36\x07\x55\xe9\x95\xeb\x88\x1b\x48\xb9\xf6\x1d\x15\x9d\x9a\xa1\xbe\x57\x29\xe9\xf3\x8c\x6d\xbd\xc9\xaf\x5c\x43\x19\x30\x77\x48\xee\x90\x6c\xb3\xf9\x14\xb8\x34\x5b\xf2\x06\xd8\x88\xb3\xf8\x39\x68\x67\x9c\xc5\xdf\x0a\x77\x30\xe8\xc4\xdd\xfd\xb0\x1d\xb9\x77\x5e\x35\xbb\x34\xde\x37\x57\x9f\x27\x16\xe5\x25\xea\x0d\x97\x77\x4f\xac\xca\xc1\xcb\xcb\xb1\x30\x5c\x6c\xf6\x4f\x29\xc4\x41\x73\x34\x96\x5c\x98\xe4\x6f\x17\x48\x98\x6b\xcd\x77\xf1\x0a\x75\x06\xa1\xce\xfc\x18\x97\x24\x67\x1a\x4a\x39\x5f\xf3\x24\x61\xe8\x15\xef\xb3\x9d\x90\xe3\x39\x73\x28\x7d\x85\x0c\x23\x7b\x04\xd8\x19\x83\x98\x68\x52\x88\x56\x30\x00\x91\x94\xf8\x29\x51\x82\x8b\x5c\x9c\x7b\x5a\xe6\x58\x3c\xc4\x7b\x41\xb2\x18\xe3\x73\x6f\x49\x98\xc2\x8e\x14\x73\xe9\xd5\x6d\xb8\x8c\x75\x77\x7e\xd5\x12\x33\x22\x12\x2b\x73\x07\x65\x26\x38\xcf\x5a\x2c\xe5\xac\xdb\xa4\xd7\x24\xd8\x5f\x61\x96\x7b\x20\xb9\xf1\xd8\x7d\xb7\x8e\xd9\xee\x92\x61\x1c\x6e\x0f\x32\xd6\xce\xf9\xe2\xf5\xd0\x81\xb4\x7d\xca\x82\x9c\x4a\x9e\x27\xa9\xc8\x75\x7b\x15\xdc\x2d\xcb\x25\xbc\x70\xab\x51\xb5\xb7\xef\x67\x98\xfd\x28\x25\xb7\xaf\x8f\x5b\x5b\x40\x69\x0b\xed\x8c\x7e\x63\x0d\xe7\x1b\x15\xfa\x49\xfd\xb0\x2d\xf3\x13\x65\xa8\xb6\x4a\xe3\xea\xdb\x3b\xc8\xe5\x4e\xc6\xed\x7d\x9d\x4d\x64\xbf\xa6\x9e\x65\x6a\x96\x2b\xcd\x57\x9f\x51\x4b\x1a\x3d\x95\x8f\x23\x8b\xd5\xe0\x10\x03\x53\x77\x51\x6e\xf2\x18\x0a\xeb\xcd\x15\xeb\x50\xae\x34\x7a\x29\xeb\x84\xbf\x72\x7a\x8e\xe6\xc3\xa0\x79\xd8\xec\xb8\x05\xf9\x61\xa9\xd1\x71\x77\x72\x2c\x3b\xbe\xad\xa9\x12\x60\xfa\x66\xdb\xd6\xbc\x6f\xae\x17\x34\x13\xb9\xae\xb5\xba\xd5\x1b\x12\x3f\x76\x17\x71\x7e\xc4\xf3\x4c\x7b\x9d\xfb\xf7\x6e\xeb\xee\x92\xb3\xea\x7b\xe4\xd6\x84\xe5\x78\x7e\x7a\xd2\x80\xdc\xbf\xd0\x74\x22\xac\x75\x83\x0d\x4d\xdd\x0b\xe0\x33\x39\x74\xcd\xc8\x51\x1a\x8b\x36\xe2\xef\xc9\x64\xad\xd5\x72\x56\x24\x67\xac\x62\x26\x64\x3c\xba\x6b\x32\xd0\xde\x1f\x9b\x3d\xf9\x2b\x86\xa5\x67\xe9\xee\x18\xac\x0e\x55\x06\x0e\x5f\xa5\x97\xc2\x4a\x13\xa9\xbf\x90\x04\x7f\x7e\x78\x08\x76\x37\xa8\xee\xc6\xf9\x0d\x98\x67\xb5\xf3\xb7\x7d\xd4\x3a\x6e\xd9\xa7\xee\x2a\xd7\x7e\x2d\xef\x75\xed\x3f\x31\x99\x4f\x2c\xc9\xc6\x5d\x8f\x18\x33\xf5\x9b\x98\x62\x52\xfd\xe6\xde\x5d\xd8\x8f\x47\xee\x3f\x64\xfe\x1f\x00\x00\xff\xff\x17\x71\xfc\x09\x84\x25\x00\x00") - -func pagesAssetsHtmlContainersHtmlBytes() ([]byte, error) { - return bindataRead( - _pagesAssetsHtmlContainersHtml, - "pages/assets/html/containers.html", - ) -} - -func pagesAssetsHtmlContainersHtml() (*asset, error) { - bytes, err := pagesAssetsHtmlContainersHtmlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "pages/assets/html/containers.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "pages/assets/html/containers.html": pagesAssetsHtmlContainersHtml, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "pages": {nil, map[string]*bintree{ - "assets": {nil, map[string]*bintree{ - "html": {nil, map[string]*bintree{ - "containers.html": {pagesAssetsHtmlContainersHtml, map[string]*bintree{}}, - }}, - }}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} diff --git a/vendor/github.com/google/cadvisor/storage/BUILD b/vendor/github.com/google/cadvisor/storage/BUILD index f40483d4..9095b36b 100644 --- a/vendor/github.com/google/cadvisor/storage/BUILD +++ b/vendor/github.com/google/cadvisor/storage/BUILD @@ -6,6 +6,7 @@ go_library( "common_flags.go", "storage.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/storage", importpath = "github.com/google/cadvisor/storage", visibility = ["//visibility:public"], deps = ["//vendor/github.com/google/cadvisor/info/v1:go_default_library"], diff --git a/vendor/github.com/google/cadvisor/storage/storage.go b/vendor/github.com/google/cadvisor/storage/storage.go index b420d4b1..dd950862 100644 --- a/vendor/github.com/google/cadvisor/storage/storage.go +++ b/vendor/github.com/google/cadvisor/storage/storage.go @@ -22,7 +22,7 @@ import ( ) type StorageDriver interface { - AddStats(ref info.ContainerReference, stats *info.ContainerStats) error + AddStats(cInfo *info.ContainerInfo, stats *info.ContainerStats) error // Close will clear the state of the storage driver. The elements // stored in the underlying storage may or may not be deleted depending diff --git a/vendor/github.com/google/cadvisor/summary/BUILD b/vendor/github.com/google/cadvisor/summary/BUILD index a98adb1d..8ecfc866 100644 --- a/vendor/github.com/google/cadvisor/summary/BUILD +++ b/vendor/github.com/google/cadvisor/summary/BUILD @@ -7,6 +7,7 @@ go_library( "percentiles.go", "summary.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/summary", importpath = "github.com/google/cadvisor/summary", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/utils/BUILD b/vendor/github.com/google/cadvisor/utils/BUILD index c33d70c7..2f402beb 100644 --- a/vendor/github.com/google/cadvisor/utils/BUILD +++ b/vendor/github.com/google/cadvisor/utils/BUILD @@ -7,6 +7,7 @@ go_library( "timed_store.go", "utils.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils", importpath = "github.com/google/cadvisor/utils", visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD b/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD index 9db55756..99ba2123 100644 --- a/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD +++ b/vendor/github.com/google/cadvisor/utils/cloudinfo/BUILD @@ -8,6 +8,7 @@ go_library( "cloudinfo.go", "gce.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/cloudinfo", importpath = "github.com/google/cadvisor/utils/cloudinfo", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/utils/cpuload/BUILD b/vendor/github.com/google/cadvisor/utils/cpuload/BUILD index 806f568d..c3bb700a 100644 --- a/vendor/github.com/google/cadvisor/utils/cpuload/BUILD +++ b/vendor/github.com/google/cadvisor/utils/cpuload/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["cpuload.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/cpuload", importpath = "github.com/google/cadvisor/utils/cpuload", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD b/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD index 0aea4be6..80040cab 100644 --- a/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD +++ b/vendor/github.com/google/cadvisor/utils/cpuload/netlink/BUILD @@ -9,6 +9,7 @@ go_library( "reader.go", ], cgo = True, + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/cpuload/netlink", importpath = "github.com/google/cadvisor/utils/cpuload/netlink", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/utils/docker/BUILD b/vendor/github.com/google/cadvisor/utils/docker/BUILD index 316032c1..ff066530 100644 --- a/vendor/github.com/google/cadvisor/utils/docker/BUILD +++ b/vendor/github.com/google/cadvisor/utils/docker/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["docker.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/docker", importpath = "github.com/google/cadvisor/utils/docker", visibility = ["//visibility:public"], deps = ["//vendor/github.com/docker/docker/api/types:go_default_library"], diff --git a/vendor/github.com/google/cadvisor/utils/oomparser/BUILD b/vendor/github.com/google/cadvisor/utils/oomparser/BUILD index e306eca4..fbd22a9c 100644 --- a/vendor/github.com/google/cadvisor/utils/oomparser/BUILD +++ b/vendor/github.com/google/cadvisor/utils/oomparser/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["oomparser.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/oomparser", importpath = "github.com/google/cadvisor/utils/oomparser", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/utils/sysfs/BUILD b/vendor/github.com/google/cadvisor/utils/sysfs/BUILD index 93e3c5cc..bbb0f546 100644 --- a/vendor/github.com/google/cadvisor/utils/sysfs/BUILD +++ b/vendor/github.com/google/cadvisor/utils/sysfs/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["sysfs.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/sysfs", importpath = "github.com/google/cadvisor/utils/sysfs", visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD b/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD index 3a310b50..d99ff978 100644 --- a/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD +++ b/vendor/github.com/google/cadvisor/utils/sysinfo/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["sysinfo.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/sysinfo", importpath = "github.com/google/cadvisor/utils/sysinfo", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/google/cadvisor/validate/validate.go b/vendor/github.com/google/cadvisor/validate/validate.go deleted file mode 100644 index c73311cf..00000000 --- a/vendor/github.com/google/cadvisor/validate/validate.go +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// 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. - -// Handler for /validate content. -// Validates cadvisor dependencies - kernel, os, docker setup. - -package validate - -import ( - "fmt" - "io/ioutil" - "log" - "net/http" - "path" - "strings" - - "github.com/google/cadvisor/container/docker" - "github.com/google/cadvisor/manager" - "github.com/google/cadvisor/utils" - - "github.com/opencontainers/runc/libcontainer/cgroups" -) - -const ( - ValidatePage = "/validate/" - Supported = "[Supported, but not recommended]" - Unsupported = "[Unsupported]" - Recommended = "[Supported and recommended]" - Unknown = "[Unknown]" - VersionFormat = "%d.%d%s" - OutputFormat = "%s: %s\n\t%s\n\n" -) - -func getMajorMinor(version string) (int, int, error) { - var major, minor int - var ign string - n, err := fmt.Sscanf(version, VersionFormat, &major, &minor, &ign) - if n != 3 || err != nil { - log.Printf("Failed to parse version for %s", version) - return -1, -1, err - } - return major, minor, nil -} - -func validateKernelVersion(version string) (string, string) { - desc := fmt.Sprintf("Kernel version is %s. Versions >= 2.6 are supported. 3.0+ are recommended.\n", version) - major, minor, err := getMajorMinor(version) - if err != nil { - desc = fmt.Sprintf("Could not parse kernel version. %s", desc) - return Unknown, desc - } - - if major < 2 { - return Unsupported, desc - } - - if major == 2 && minor < 6 { - return Unsupported, desc - } - - if major >= 3 { - return Recommended, desc - } - - return Supported, desc -} - -func validateDockerVersion(version string) (string, string) { - desc := fmt.Sprintf("Docker version is %s. Versions >= 1.0 are supported. 1.2+ are recommended.\n", version) - major, minor, err := getMajorMinor(version) - if err != nil { - desc = fmt.Sprintf("Could not parse docker version. %s\n\t", desc) - return Unknown, desc - } - if major < 1 { - return Unsupported, desc - } - - if major == 1 && minor < 2 { - return Supported, desc - } - - return Recommended, desc -} - -func getEnabledCgroups() (map[string]int, error) { - out, err := ioutil.ReadFile("/proc/cgroups") - if err != nil { - return nil, err - } - cgroups := make(map[string]int) - for i, line := range strings.Split(string(out), "\n") { - var cgroup string - var ign, enabled int - if i == 0 || line == "" { - continue - } - n, err := fmt.Sscanf(line, "%s %d %d %d", &cgroup, &ign, &ign, &enabled) - if n != 4 || err != nil { - if err == nil { - err = fmt.Errorf("failed to parse /proc/cgroup entry %s", line) - } - return nil, err - } - cgroups[cgroup] = enabled - } - return cgroups, nil -} - -func areCgroupsPresent(available map[string]int, desired []string) (bool, string) { - for _, cgroup := range desired { - enabled, ok := available[cgroup] - if !ok { - reason := fmt.Sprintf("Missing cgroup %s. Available cgroups: %v\n", cgroup, available) - return false, reason - } - if enabled != 1 { - reason := fmt.Sprintf("Cgroup %s not enabled. Available cgroups: %v\n", cgroup, available) - return false, reason - } - } - return true, "" -} - -func validateMemoryAccounting(available_cgroups map[string]int) string { - ok, _ := areCgroupsPresent(available_cgroups, []string{"memory"}) - if !ok { - return "\tHierarchical memory accounting status unknown: memory cgroup not enabled.\n" - } - mnt, err := cgroups.FindCgroupMountpoint("memory") - if err != nil { - return "\tHierarchical memory accounting status unknown: memory cgroup not mounted.\n" - } - hier, err := ioutil.ReadFile(path.Join(mnt, "memory.use_hierarchy")) - if err != nil { - return "\tHierarchical memory accounting status unknown: hierarchy interface unavailable.\n" - } - var enabled int - n, err := fmt.Sscanf(string(hier), "%d", &enabled) - if err != nil || n != 1 { - return "\tHierarchical memory accounting status unknown: hierarchy interface unreadable.\n" - } - if enabled == 1 { - return "\tHierarchical memory accounting enabled. Reported memory usage includes memory used by child containers.\n" - } - return "\tHierarchical memory accounting disabled. Memory usage does not include usage from child containers.\n" - -} - -func validateCgroups() (string, string) { - required_cgroups := []string{"cpu", "cpuacct"} - recommended_cgroups := []string{"memory", "blkio", "cpuset", "devices", "freezer"} - available_cgroups, err := getEnabledCgroups() - desc := fmt.Sprintf("\tFollowing cgroups are required: %v\n\tFollowing other cgroups are recommended: %v\n", required_cgroups, recommended_cgroups) - if err != nil { - desc = fmt.Sprintf("Could not parse /proc/cgroups.\n%s", desc) - return Unknown, desc - } - ok, out := areCgroupsPresent(available_cgroups, required_cgroups) - if !ok { - out += desc - return Unsupported, out - } - ok, out = areCgroupsPresent(available_cgroups, recommended_cgroups) - if !ok { - // supported, but not recommended. - out += desc - return Supported, out - } - out = fmt.Sprintf("Available cgroups: %v\n", available_cgroups) - out += desc - out += validateMemoryAccounting(available_cgroups) - return Recommended, out -} - -func validateDockerInfo() (string, string) { - info, err := docker.ValidateInfo() - if err != nil { - return Unsupported, fmt.Sprintf("Docker setup is invalid: %v", err) - } - - desc := fmt.Sprintf("Storage driver is %s.\n", info.Driver) - return Recommended, desc -} - -func validateCgroupMounts() (string, string) { - const recommendedMount = "/sys/fs/cgroup" - desc := fmt.Sprintf("\tAny cgroup mount point that is detectible and accessible is supported. %s is recommended as a standard location.\n", recommendedMount) - mnt, err := cgroups.FindCgroupMountpoint("cpu") - if err != nil { - out := "Could not locate cgroup mount point.\n" - out += desc - return Unknown, out - } - mnt = path.Dir(mnt) - if !utils.FileExists(mnt) { - out := fmt.Sprintf("Cgroup mount directory %s inaccessible.\n", mnt) - out += desc - return Unsupported, out - } - mounts, err := ioutil.ReadDir(mnt) - if err != nil { - out := fmt.Sprintf("Could not read cgroup mount directory %s.\n", mnt) - out += desc - return Unsupported, out - } - mountNames := "\tCgroup mount directories: " - for _, mount := range mounts { - mountNames += mount.Name() + " " - } - mountNames += "\n" - out := fmt.Sprintf("Cgroups are mounted at %s.\n", mnt) - out += mountNames - out += desc - info, err := ioutil.ReadFile("/proc/mounts") - if err != nil { - out := fmt.Sprintf("Could not read /proc/mounts.\n") - out += desc - return Unsupported, out - } - out += "\tCgroup mounts:\n" - for _, line := range strings.Split(string(info), "\n") { - if strings.Contains(line, " cgroup ") { - out += "\t" + line + "\n" - } - } - if mnt == recommendedMount { - return Recommended, out - } - return Supported, out -} - -func validateIoScheduler(containerManager manager.Manager) (string, string) { - var desc string - mi, err := containerManager.GetMachineInfo() - if err != nil { - return Unknown, "Machine info not available\n\t" - } - cfq := false - for _, disk := range mi.DiskMap { - desc += fmt.Sprintf("\t Disk %q Scheduler type %q.\n", disk.Name, disk.Scheduler) - if disk.Scheduler == "cfq" { - cfq = true - } - } - // Since we get lot of random block devices, report recommended if - // at least one of them is on cfq. Report Supported otherwise. - if cfq { - desc = "At least one device supports 'cfq' I/O scheduler. Some disk stats can be reported.\n" + desc - return Recommended, desc - } - desc = "None of the devices support 'cfq' I/O scheduler. No disk stats can be reported.\n" + desc - return Supported, desc -} - -func HandleRequest(w http.ResponseWriter, containerManager manager.Manager) error { - // Get cAdvisor version Info. - versionInfo, err := containerManager.GetVersionInfo() - if err != nil { - return err - } - - out := fmt.Sprintf("cAdvisor version: %s\n\n", versionInfo.CadvisorVersion) - - // No OS is preferred or unsupported as of now. - out += fmt.Sprintf("OS version: %s\n\n", versionInfo.ContainerOsVersion) - - kernelValidation, desc := validateKernelVersion(versionInfo.KernelVersion) - out += fmt.Sprintf(OutputFormat, "Kernel version", kernelValidation, desc) - - cgroupValidation, desc := validateCgroups() - out += fmt.Sprintf(OutputFormat, "Cgroup setup", cgroupValidation, desc) - - mountsValidation, desc := validateCgroupMounts() - out += fmt.Sprintf(OutputFormat, "Cgroup mount setup", mountsValidation, desc) - - dockerValidation, desc := validateDockerVersion(versionInfo.DockerVersion) - out += fmt.Sprintf(OutputFormat, "Docker version", dockerValidation, desc) - - dockerInfoValidation, desc := validateDockerInfo() - out += fmt.Sprintf(OutputFormat, "Docker driver setup", dockerInfoValidation, desc) - - ioSchedulerValidation, desc := validateIoScheduler(containerManager) - out += fmt.Sprintf(OutputFormat, "Block device setup", ioSchedulerValidation, desc) - - // Output debug info. - debugInfo := containerManager.DebugInfo() - for category, lines := range debugInfo { - out += fmt.Sprintf(OutputFormat, category, "", strings.Join(lines, "\n\t")) - } - - _, err = w.Write([]byte(out)) - return err -} diff --git a/vendor/github.com/google/cadvisor/version/BUILD b/vendor/github.com/google/cadvisor/version/BUILD index e4d4c6dc..fc7930a4 100644 --- a/vendor/github.com/google/cadvisor/version/BUILD +++ b/vendor/github.com/google/cadvisor/version/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["version.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/version", importpath = "github.com/google/cadvisor/version", visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/google/cadvisor/zfs/BUILD b/vendor/github.com/google/cadvisor/zfs/BUILD index c37c070d..20eb5cd4 100644 --- a/vendor/github.com/google/cadvisor/zfs/BUILD +++ b/vendor/github.com/google/cadvisor/zfs/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["watcher.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/google/cadvisor/zfs", importpath = "github.com/google/cadvisor/zfs", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/github.com/mattn/go-shellwords/BUILD b/vendor/github.com/mattn/go-shellwords/BUILD new file mode 100644 index 00000000..9a2bf453 --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/BUILD @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "shellwords.go", + "util_go15.go", + "util_posix.go", + "util_windows.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mattn/go-shellwords", + importpath = "github.com/mattn/go-shellwords", + visibility = ["//visibility:public"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mattn/go-shellwords/LICENSE b/vendor/github.com/mattn/go-shellwords/LICENSE new file mode 100644 index 00000000..740fa931 --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/mattn/go-shellwords/README.md b/vendor/github.com/mattn/go-shellwords/README.md new file mode 100644 index 00000000..b1d235c7 --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/README.md @@ -0,0 +1,47 @@ +# go-shellwords + +[![Coverage Status](https://coveralls.io/repos/mattn/go-shellwords/badge.png?branch=master)](https://coveralls.io/r/mattn/go-shellwords?branch=master) +[![Build Status](https://travis-ci.org/mattn/go-shellwords.svg?branch=master)](https://travis-ci.org/mattn/go-shellwords) + +Parse line as shell words. + +## Usage + +```go +args, err := shellwords.Parse("./foo --bar=baz") +// args should be ["./foo", "--bar=baz"] +``` + +```go +os.Setenv("FOO", "bar") +p := shellwords.NewParser() +p.ParseEnv = true +args, err := p.Parse("./foo $FOO") +// args should be ["./foo", "bar"] +``` + +```go +p := shellwords.NewParser() +p.ParseBacktick = true +args, err := p.Parse("./foo `echo $SHELL`") +// args should be ["./foo", "/bin/bash"] +``` + +```go +shellwords.ParseBacktick = true +p := shellwords.NewParser() +args, err := p.Parse("./foo `echo $SHELL`") +// args should be ["./foo", "/bin/bash"] +``` + +# Thanks + +This is based on cpan module [Parse::CommandLine](https://metacpan.org/pod/Parse::CommandLine). + +# License + +under the MIT License: http://mattn.mit-license.org/2017 + +# Author + +Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/mattn/go-shellwords/shellwords.go b/vendor/github.com/mattn/go-shellwords/shellwords.go new file mode 100644 index 00000000..bcd1e1f0 --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/shellwords.go @@ -0,0 +1,178 @@ +package shellwords + +import ( + "errors" + "os" + "regexp" +) + +var ( + ParseEnv bool = false + ParseBacktick bool = false +) + +var envRe = regexp.MustCompile(`\$({[a-zA-Z0-9_]+}|[a-zA-Z0-9_]+)`) + +func isSpace(r rune) bool { + switch r { + case ' ', '\t', '\r', '\n': + return true + } + return false +} + +func replaceEnv(s string) string { + return envRe.ReplaceAllStringFunc(s, func(s string) string { + s = s[1:] + if s[0] == '{' { + s = s[1 : len(s)-1] + } + return os.Getenv(s) + }) +} + +type Parser struct { + ParseEnv bool + ParseBacktick bool + Position int +} + +func NewParser() *Parser { + return &Parser{ParseEnv, ParseBacktick, 0} +} + +func (p *Parser) Parse(line string) ([]string, error) { + args := []string{} + buf := "" + var escaped, doubleQuoted, singleQuoted, backQuote, dollarQuote bool + backtick := "" + + pos := -1 + got := false + +loop: + for i, r := range line { + if escaped { + buf += string(r) + escaped = false + continue + } + + if r == '\\' { + if singleQuoted { + buf += string(r) + } else { + escaped = true + } + continue + } + + if isSpace(r) { + if singleQuoted || doubleQuoted || backQuote || dollarQuote { + buf += string(r) + backtick += string(r) + } else if got { + if p.ParseEnv { + buf = replaceEnv(buf) + } + args = append(args, buf) + buf = "" + got = false + } + continue + } + + switch r { + case '`': + if !singleQuoted && !doubleQuoted && !dollarQuote { + if p.ParseBacktick { + if backQuote { + out, err := shellRun(backtick) + if err != nil { + return nil, err + } + buf = out + } + backtick = "" + backQuote = !backQuote + continue + } + backtick = "" + backQuote = !backQuote + } + case ')': + if !singleQuoted && !doubleQuoted && !backQuote { + if p.ParseBacktick { + if dollarQuote { + out, err := shellRun(backtick) + if err != nil { + return nil, err + } + buf = out + } + backtick = "" + dollarQuote = !dollarQuote + continue + } + backtick = "" + dollarQuote = !dollarQuote + } + case '(': + if !singleQuoted && !doubleQuoted && !backQuote { + if !dollarQuote && len(buf) > 0 && buf == "$" { + dollarQuote = true + buf += "(" + continue + } else { + return nil, errors.New("invalid command line string") + } + } + case '"': + if !singleQuoted && !dollarQuote { + doubleQuoted = !doubleQuoted + continue + } + case '\'': + if !doubleQuoted && !dollarQuote { + singleQuoted = !singleQuoted + continue + } + case ';', '&', '|', '<', '>': + if !(escaped || singleQuoted || doubleQuoted || backQuote) { + if r == '>' && len(buf) > 0 { + if c := buf[0]; '0' <= c && c <= '9' { + i -= 1 + got = false + } + } + pos = i + break loop + } + } + + got = true + buf += string(r) + if backQuote || dollarQuote { + backtick += string(r) + } + } + + if got { + if p.ParseEnv { + buf = replaceEnv(buf) + } + args = append(args, buf) + } + + if escaped || singleQuoted || doubleQuoted || backQuote || dollarQuote { + return nil, errors.New("invalid command line string") + } + + p.Position = pos + + return args, nil +} + +func Parse(line string) ([]string, error) { + return NewParser().Parse(line) +} diff --git a/vendor/github.com/mattn/go-shellwords/util_go15.go b/vendor/github.com/mattn/go-shellwords/util_go15.go new file mode 100644 index 00000000..180f00f0 --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/util_go15.go @@ -0,0 +1,24 @@ +// +build !go1.6 + +package shellwords + +import ( + "os" + "os/exec" + "runtime" + "strings" +) + +func shellRun(line string) (string, error) { + var b []byte + var err error + if runtime.GOOS == "windows" { + b, err = exec.Command(os.Getenv("COMSPEC"), "/c", line).Output() + } else { + b, err = exec.Command(os.Getenv("SHELL"), "-c", line).Output() + } + if err != nil { + return "", err + } + return strings.TrimSpace(string(b)), nil +} diff --git a/vendor/github.com/mattn/go-shellwords/util_posix.go b/vendor/github.com/mattn/go-shellwords/util_posix.go new file mode 100644 index 00000000..eaf1011d --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/util_posix.go @@ -0,0 +1,22 @@ +// +build !windows,go1.6 + +package shellwords + +import ( + "errors" + "os" + "os/exec" + "strings" +) + +func shellRun(line string) (string, error) { + shell := os.Getenv("SHELL") + b, err := exec.Command(shell, "-c", line).Output() + if err != nil { + if eerr, ok := err.(*exec.ExitError); ok { + b = eerr.Stderr + } + return "", errors.New(err.Error() + ":" + string(b)) + } + return strings.TrimSpace(string(b)), nil +} diff --git a/vendor/github.com/mattn/go-shellwords/util_windows.go b/vendor/github.com/mattn/go-shellwords/util_windows.go new file mode 100644 index 00000000..e46f89a1 --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/util_windows.go @@ -0,0 +1,22 @@ +// +build windows,go1.6 + +package shellwords + +import ( + "errors" + "os" + "os/exec" + "strings" +) + +func shellRun(line string) (string, error) { + shell := os.Getenv("COMSPEC") + b, err := exec.Command(shell, "/c", line).Output() + if err != nil { + if eerr, ok := err.(*exec.ExitError); ok { + b = eerr.Stderr + } + return "", errors.New(err.Error() + ":" + string(b)) + } + return strings.TrimSpace(string(b)), nil +} diff --git a/vendor/github.com/mesos/mesos-go/LICENSE b/vendor/github.com/mesos/mesos-go/LICENSE new file mode 100644 index 00000000..ad410e11 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. \ No newline at end of file diff --git a/vendor/github.com/mesos/mesos-go/NOTICE b/vendor/github.com/mesos/mesos-go/NOTICE new file mode 100644 index 00000000..491bbe14 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/NOTICE @@ -0,0 +1,13 @@ +Copyright 2013-2015, Mesosphere, Inc. + +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. diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/BUILD new file mode 100644 index 00000000..839d29c4 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/BUILD @@ -0,0 +1,50 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "client.go", + "doc.go", + "filters.go", + "fixedpoint.go", + "labels.go", + "mesos.pb.go", + "mesos.pb_ffjson.go", + "ranges.go", + "resources.go", + "values.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib", + importpath = "github.com/mesos/mesos-go/api/v1/lib", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/roles:go_default_library", + "//vendor/github.com/pquerna/ffjson/fflib/v1:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/agent:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/client:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/debug:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/recordio:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/roles:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/BUILD new file mode 100644 index 00000000..ba63bab1 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/BUILD @@ -0,0 +1,35 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "agent.pb.go", + "agent.pb_ffjson.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/agent", + importpath = "github.com/mesos/mesos-go/api/v1/lib/agent", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/gogoproto:go_default_library", + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib:go_default_library", + "//vendor/github.com/pquerna/ffjson/fflib/v1:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb.go new file mode 100644 index 00000000..cc6a79f9 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb.go @@ -0,0 +1,17324 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: agent/agent.proto + +/* + Package agent is a generated protocol buffer package. + + It is generated from these files: + agent/agent.proto + + It has these top-level messages: + Call + Response + ProcessIO +*/ +package agent + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import mesos "github.com/mesos/mesos-go/api/v1/lib" +import _ "github.com/gogo/protobuf/gogoproto" + +import strconv "strconv" + +import bytes "bytes" + +import strings "strings" +import reflect "reflect" + +import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +// If a call of type `Call::FOO` requires additional parameters they can be +// included in the corresponding `Call::Foo` message. Similarly, if a call +// receives a synchronous response it will be returned as a `Response` +// message of type `Response::FOO`; see `Call::LaunchNestedContainerSession` +// and `Call::AttachContainerOutput` for exceptions. +type Call_Type int32 + +const ( + Call_UNKNOWN Call_Type = 0 + Call_GET_HEALTH Call_Type = 1 + Call_GET_FLAGS Call_Type = 2 + Call_GET_VERSION Call_Type = 3 + Call_GET_METRICS Call_Type = 4 + Call_GET_LOGGING_LEVEL Call_Type = 5 + Call_SET_LOGGING_LEVEL Call_Type = 6 + Call_LIST_FILES Call_Type = 7 + Call_READ_FILE Call_Type = 8 + Call_GET_STATE Call_Type = 9 + Call_GET_CONTAINERS Call_Type = 10 + // Retrieves the information about known frameworks. + Call_GET_FRAMEWORKS Call_Type = 11 + // Retrieves the information about known executors. + Call_GET_EXECUTORS Call_Type = 12 + // Retrieves the information about known operations. + Call_GET_OPERATIONS Call_Type = 31 + // Retrieves the information about known tasks. + Call_GET_TASKS Call_Type = 13 + // Retrieves the agent information. + Call_GET_AGENT Call_Type = 20 + // Retrieves the information about known resource providers. + Call_GET_RESOURCE_PROVIDERS Call_Type = 26 + // Calls for managing nested containers underneath an executor's container. + // Some of these calls are deprecated in favor of the calls + // for both standalone or nested containers further below. + Call_LAUNCH_NESTED_CONTAINER Call_Type = 14 + Call_WAIT_NESTED_CONTAINER Call_Type = 15 + Call_KILL_NESTED_CONTAINER Call_Type = 16 + Call_REMOVE_NESTED_CONTAINER Call_Type = 21 + // See 'LaunchNestedContainerSession' below. + Call_LAUNCH_NESTED_CONTAINER_SESSION Call_Type = 17 + Call_ATTACH_CONTAINER_INPUT Call_Type = 18 + Call_ATTACH_CONTAINER_OUTPUT Call_Type = 19 + // Calls for managing standalone containers + // or containers nested underneath another container. + Call_LAUNCH_CONTAINER Call_Type = 22 + Call_WAIT_CONTAINER Call_Type = 23 + Call_KILL_CONTAINER Call_Type = 24 + Call_REMOVE_CONTAINER Call_Type = 25 + Call_ADD_RESOURCE_PROVIDER_CONFIG Call_Type = 27 + Call_UPDATE_RESOURCE_PROVIDER_CONFIG Call_Type = 28 + Call_REMOVE_RESOURCE_PROVIDER_CONFIG Call_Type = 29 + // Prune unused container images. + Call_PRUNE_IMAGES Call_Type = 30 +) + +var Call_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "GET_HEALTH", + 2: "GET_FLAGS", + 3: "GET_VERSION", + 4: "GET_METRICS", + 5: "GET_LOGGING_LEVEL", + 6: "SET_LOGGING_LEVEL", + 7: "LIST_FILES", + 8: "READ_FILE", + 9: "GET_STATE", + 10: "GET_CONTAINERS", + 11: "GET_FRAMEWORKS", + 12: "GET_EXECUTORS", + 31: "GET_OPERATIONS", + 13: "GET_TASKS", + 20: "GET_AGENT", + 26: "GET_RESOURCE_PROVIDERS", + 14: "LAUNCH_NESTED_CONTAINER", + 15: "WAIT_NESTED_CONTAINER", + 16: "KILL_NESTED_CONTAINER", + 21: "REMOVE_NESTED_CONTAINER", + 17: "LAUNCH_NESTED_CONTAINER_SESSION", + 18: "ATTACH_CONTAINER_INPUT", + 19: "ATTACH_CONTAINER_OUTPUT", + 22: "LAUNCH_CONTAINER", + 23: "WAIT_CONTAINER", + 24: "KILL_CONTAINER", + 25: "REMOVE_CONTAINER", + 27: "ADD_RESOURCE_PROVIDER_CONFIG", + 28: "UPDATE_RESOURCE_PROVIDER_CONFIG", + 29: "REMOVE_RESOURCE_PROVIDER_CONFIG", + 30: "PRUNE_IMAGES", +} +var Call_Type_value = map[string]int32{ + "UNKNOWN": 0, + "GET_HEALTH": 1, + "GET_FLAGS": 2, + "GET_VERSION": 3, + "GET_METRICS": 4, + "GET_LOGGING_LEVEL": 5, + "SET_LOGGING_LEVEL": 6, + "LIST_FILES": 7, + "READ_FILE": 8, + "GET_STATE": 9, + "GET_CONTAINERS": 10, + "GET_FRAMEWORKS": 11, + "GET_EXECUTORS": 12, + "GET_OPERATIONS": 31, + "GET_TASKS": 13, + "GET_AGENT": 20, + "GET_RESOURCE_PROVIDERS": 26, + "LAUNCH_NESTED_CONTAINER": 14, + "WAIT_NESTED_CONTAINER": 15, + "KILL_NESTED_CONTAINER": 16, + "REMOVE_NESTED_CONTAINER": 21, + "LAUNCH_NESTED_CONTAINER_SESSION": 17, + "ATTACH_CONTAINER_INPUT": 18, + "ATTACH_CONTAINER_OUTPUT": 19, + "LAUNCH_CONTAINER": 22, + "WAIT_CONTAINER": 23, + "KILL_CONTAINER": 24, + "REMOVE_CONTAINER": 25, + "ADD_RESOURCE_PROVIDER_CONFIG": 27, + "UPDATE_RESOURCE_PROVIDER_CONFIG": 28, + "REMOVE_RESOURCE_PROVIDER_CONFIG": 29, + "PRUNE_IMAGES": 30, +} + +func (x Call_Type) Enum() *Call_Type { + p := new(Call_Type) + *p = x + return p +} +func (x Call_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Call_Type_name, int32(x)) +} +func (x *Call_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Call_Type_value, data, "Call_Type") + if err != nil { + return err + } + *x = Call_Type(value) + return nil +} +func (Call_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 0} } + +type Call_AttachContainerInput_Type int32 + +const ( + Call_AttachContainerInput_UNKNOWN Call_AttachContainerInput_Type = 0 + Call_AttachContainerInput_CONTAINER_ID Call_AttachContainerInput_Type = 1 + Call_AttachContainerInput_PROCESS_IO Call_AttachContainerInput_Type = 2 +) + +var Call_AttachContainerInput_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CONTAINER_ID", + 2: "PROCESS_IO", +} +var Call_AttachContainerInput_Type_value = map[string]int32{ + "UNKNOWN": 0, + "CONTAINER_ID": 1, + "PROCESS_IO": 2, +} + +func (x Call_AttachContainerInput_Type) Enum() *Call_AttachContainerInput_Type { + p := new(Call_AttachContainerInput_Type) + *p = x + return p +} +func (x Call_AttachContainerInput_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Call_AttachContainerInput_Type_name, int32(x)) +} +func (x *Call_AttachContainerInput_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Call_AttachContainerInput_Type_value, data, "Call_AttachContainerInput_Type") + if err != nil { + return err + } + *x = Call_AttachContainerInput_Type(value) + return nil +} +func (Call_AttachContainerInput_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 10, 0} +} + +// Each of the responses of type `FOO` corresponds to `Foo` message below. +type Response_Type int32 + +const ( + Response_UNKNOWN Response_Type = 0 + Response_GET_HEALTH Response_Type = 1 + Response_GET_FLAGS Response_Type = 2 + Response_GET_VERSION Response_Type = 3 + Response_GET_METRICS Response_Type = 4 + Response_GET_LOGGING_LEVEL Response_Type = 5 + Response_LIST_FILES Response_Type = 6 + Response_READ_FILE Response_Type = 7 + Response_GET_STATE Response_Type = 8 + Response_GET_CONTAINERS Response_Type = 9 + Response_GET_FRAMEWORKS Response_Type = 10 + Response_GET_EXECUTORS Response_Type = 11 + Response_GET_OPERATIONS Response_Type = 17 + Response_GET_TASKS Response_Type = 12 + Response_GET_AGENT Response_Type = 14 + Response_GET_RESOURCE_PROVIDERS Response_Type = 16 + Response_WAIT_NESTED_CONTAINER Response_Type = 13 + Response_WAIT_CONTAINER Response_Type = 15 +) + +var Response_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "GET_HEALTH", + 2: "GET_FLAGS", + 3: "GET_VERSION", + 4: "GET_METRICS", + 5: "GET_LOGGING_LEVEL", + 6: "LIST_FILES", + 7: "READ_FILE", + 8: "GET_STATE", + 9: "GET_CONTAINERS", + 10: "GET_FRAMEWORKS", + 11: "GET_EXECUTORS", + 17: "GET_OPERATIONS", + 12: "GET_TASKS", + 14: "GET_AGENT", + 16: "GET_RESOURCE_PROVIDERS", + 13: "WAIT_NESTED_CONTAINER", + 15: "WAIT_CONTAINER", +} +var Response_Type_value = map[string]int32{ + "UNKNOWN": 0, + "GET_HEALTH": 1, + "GET_FLAGS": 2, + "GET_VERSION": 3, + "GET_METRICS": 4, + "GET_LOGGING_LEVEL": 5, + "LIST_FILES": 6, + "READ_FILE": 7, + "GET_STATE": 8, + "GET_CONTAINERS": 9, + "GET_FRAMEWORKS": 10, + "GET_EXECUTORS": 11, + "GET_OPERATIONS": 17, + "GET_TASKS": 12, + "GET_AGENT": 14, + "GET_RESOURCE_PROVIDERS": 16, + "WAIT_NESTED_CONTAINER": 13, + "WAIT_CONTAINER": 15, +} + +func (x Response_Type) Enum() *Response_Type { + p := new(Response_Type) + *p = x + return p +} +func (x Response_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Response_Type_name, int32(x)) +} +func (x *Response_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Response_Type_value, data, "Response_Type") + if err != nil { + return err + } + *x = Response_Type(value) + return nil +} +func (Response_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 0} } + +type ProcessIO_Type int32 + +const ( + ProcessIO_UNKNOWN ProcessIO_Type = 0 + ProcessIO_DATA ProcessIO_Type = 1 + ProcessIO_CONTROL ProcessIO_Type = 2 +) + +var ProcessIO_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "DATA", + 2: "CONTROL", +} +var ProcessIO_Type_value = map[string]int32{ + "UNKNOWN": 0, + "DATA": 1, + "CONTROL": 2, +} + +func (x ProcessIO_Type) Enum() *ProcessIO_Type { + p := new(ProcessIO_Type) + *p = x + return p +} +func (x ProcessIO_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(ProcessIO_Type_name, int32(x)) +} +func (x *ProcessIO_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ProcessIO_Type_value, data, "ProcessIO_Type") + if err != nil { + return err + } + *x = ProcessIO_Type(value) + return nil +} +func (ProcessIO_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorAgent, []int{2, 0} } + +type ProcessIO_Data_Type int32 + +const ( + ProcessIO_Data_UNKNOWN ProcessIO_Data_Type = 0 + ProcessIO_Data_STDIN ProcessIO_Data_Type = 1 + ProcessIO_Data_STDOUT ProcessIO_Data_Type = 2 + ProcessIO_Data_STDERR ProcessIO_Data_Type = 3 +) + +var ProcessIO_Data_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "STDIN", + 2: "STDOUT", + 3: "STDERR", +} +var ProcessIO_Data_Type_value = map[string]int32{ + "UNKNOWN": 0, + "STDIN": 1, + "STDOUT": 2, + "STDERR": 3, +} + +func (x ProcessIO_Data_Type) Enum() *ProcessIO_Data_Type { + p := new(ProcessIO_Data_Type) + *p = x + return p +} +func (x ProcessIO_Data_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(ProcessIO_Data_Type_name, int32(x)) +} +func (x *ProcessIO_Data_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ProcessIO_Data_Type_value, data, "ProcessIO_Data_Type") + if err != nil { + return err + } + *x = ProcessIO_Data_Type(value) + return nil +} +func (ProcessIO_Data_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{2, 0, 0} +} + +type ProcessIO_Control_Type int32 + +const ( + ProcessIO_Control_UNKNOWN ProcessIO_Control_Type = 0 + ProcessIO_Control_TTY_INFO ProcessIO_Control_Type = 1 + ProcessIO_Control_HEARTBEAT ProcessIO_Control_Type = 2 +) + +var ProcessIO_Control_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "TTY_INFO", + 2: "HEARTBEAT", +} +var ProcessIO_Control_Type_value = map[string]int32{ + "UNKNOWN": 0, + "TTY_INFO": 1, + "HEARTBEAT": 2, +} + +func (x ProcessIO_Control_Type) Enum() *ProcessIO_Control_Type { + p := new(ProcessIO_Control_Type) + *p = x + return p +} +func (x ProcessIO_Control_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(ProcessIO_Control_Type_name, int32(x)) +} +func (x *ProcessIO_Control_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ProcessIO_Control_Type_value, data, "ProcessIO_Control_Type") + if err != nil { + return err + } + *x = ProcessIO_Control_Type(value) + return nil +} +func (ProcessIO_Control_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{2, 1, 0} +} + +// * +// Calls that can be sent to the v1 agent API. +// +// A call is described using the standard protocol buffer "union" +// trick, see +// https://developers.google.com/protocol-buffers/docs/techniques#union. +type Call struct { + Type Call_Type `protobuf:"varint,1,opt,name=type,enum=mesos.agent.Call_Type" json:"type"` + GetMetrics *Call_GetMetrics `protobuf:"bytes,2,opt,name=get_metrics,json=getMetrics" json:"get_metrics,omitempty"` + SetLoggingLevel *Call_SetLoggingLevel `protobuf:"bytes,3,opt,name=set_logging_level,json=setLoggingLevel" json:"set_logging_level,omitempty"` + ListFiles *Call_ListFiles `protobuf:"bytes,4,opt,name=list_files,json=listFiles" json:"list_files,omitempty"` + ReadFile *Call_ReadFile `protobuf:"bytes,5,opt,name=read_file,json=readFile" json:"read_file,omitempty"` + GetContainers *Call_GetContainers `protobuf:"bytes,20,opt,name=get_containers,json=getContainers" json:"get_containers,omitempty"` + LaunchNestedContainer *Call_LaunchNestedContainer `protobuf:"bytes,6,opt,name=launch_nested_container,json=launchNestedContainer" json:"launch_nested_container,omitempty"` + WaitNestedContainer *Call_WaitNestedContainer `protobuf:"bytes,7,opt,name=wait_nested_container,json=waitNestedContainer" json:"wait_nested_container,omitempty"` + KillNestedContainer *Call_KillNestedContainer `protobuf:"bytes,8,opt,name=kill_nested_container,json=killNestedContainer" json:"kill_nested_container,omitempty"` + RemoveNestedContainer *Call_RemoveNestedContainer `protobuf:"bytes,12,opt,name=remove_nested_container,json=removeNestedContainer" json:"remove_nested_container,omitempty"` + LaunchNestedContainerSession *Call_LaunchNestedContainerSession `protobuf:"bytes,9,opt,name=launch_nested_container_session,json=launchNestedContainerSession" json:"launch_nested_container_session,omitempty"` + AttachContainerInput *Call_AttachContainerInput `protobuf:"bytes,10,opt,name=attach_container_input,json=attachContainerInput" json:"attach_container_input,omitempty"` + AttachContainerOutput *Call_AttachContainerOutput `protobuf:"bytes,11,opt,name=attach_container_output,json=attachContainerOutput" json:"attach_container_output,omitempty"` + LaunchContainer *Call_LaunchContainer `protobuf:"bytes,13,opt,name=launch_container,json=launchContainer" json:"launch_container,omitempty"` + WaitContainer *Call_WaitContainer `protobuf:"bytes,14,opt,name=wait_container,json=waitContainer" json:"wait_container,omitempty"` + KillContainer *Call_KillContainer `protobuf:"bytes,15,opt,name=kill_container,json=killContainer" json:"kill_container,omitempty"` + RemoveContainer *Call_RemoveContainer `protobuf:"bytes,16,opt,name=remove_container,json=removeContainer" json:"remove_container,omitempty"` + AddResourceProviderConfig *Call_AddResourceProviderConfig `protobuf:"bytes,17,opt,name=add_resource_provider_config,json=addResourceProviderConfig" json:"add_resource_provider_config,omitempty"` + UpdateResourceProviderConfig *Call_UpdateResourceProviderConfig `protobuf:"bytes,18,opt,name=update_resource_provider_config,json=updateResourceProviderConfig" json:"update_resource_provider_config,omitempty"` + RemoveResourceProviderConfig *Call_RemoveResourceProviderConfig `protobuf:"bytes,19,opt,name=remove_resource_provider_config,json=removeResourceProviderConfig" json:"remove_resource_provider_config,omitempty"` + PruneImages *Call_PruneImages `protobuf:"bytes,21,opt,name=prune_images,json=pruneImages" json:"prune_images,omitempty"` +} + +func (m *Call) Reset() { *m = Call{} } +func (*Call) ProtoMessage() {} +func (*Call) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0} } + +func (m *Call) GetType() Call_Type { + if m != nil { + return m.Type + } + return Call_UNKNOWN +} + +func (m *Call) GetGetMetrics() *Call_GetMetrics { + if m != nil { + return m.GetMetrics + } + return nil +} + +func (m *Call) GetSetLoggingLevel() *Call_SetLoggingLevel { + if m != nil { + return m.SetLoggingLevel + } + return nil +} + +func (m *Call) GetListFiles() *Call_ListFiles { + if m != nil { + return m.ListFiles + } + return nil +} + +func (m *Call) GetReadFile() *Call_ReadFile { + if m != nil { + return m.ReadFile + } + return nil +} + +func (m *Call) GetGetContainers() *Call_GetContainers { + if m != nil { + return m.GetContainers + } + return nil +} + +func (m *Call) GetLaunchNestedContainer() *Call_LaunchNestedContainer { + if m != nil { + return m.LaunchNestedContainer + } + return nil +} + +func (m *Call) GetWaitNestedContainer() *Call_WaitNestedContainer { + if m != nil { + return m.WaitNestedContainer + } + return nil +} + +func (m *Call) GetKillNestedContainer() *Call_KillNestedContainer { + if m != nil { + return m.KillNestedContainer + } + return nil +} + +func (m *Call) GetRemoveNestedContainer() *Call_RemoveNestedContainer { + if m != nil { + return m.RemoveNestedContainer + } + return nil +} + +func (m *Call) GetLaunchNestedContainerSession() *Call_LaunchNestedContainerSession { + if m != nil { + return m.LaunchNestedContainerSession + } + return nil +} + +func (m *Call) GetAttachContainerInput() *Call_AttachContainerInput { + if m != nil { + return m.AttachContainerInput + } + return nil +} + +func (m *Call) GetAttachContainerOutput() *Call_AttachContainerOutput { + if m != nil { + return m.AttachContainerOutput + } + return nil +} + +func (m *Call) GetLaunchContainer() *Call_LaunchContainer { + if m != nil { + return m.LaunchContainer + } + return nil +} + +func (m *Call) GetWaitContainer() *Call_WaitContainer { + if m != nil { + return m.WaitContainer + } + return nil +} + +func (m *Call) GetKillContainer() *Call_KillContainer { + if m != nil { + return m.KillContainer + } + return nil +} + +func (m *Call) GetRemoveContainer() *Call_RemoveContainer { + if m != nil { + return m.RemoveContainer + } + return nil +} + +func (m *Call) GetAddResourceProviderConfig() *Call_AddResourceProviderConfig { + if m != nil { + return m.AddResourceProviderConfig + } + return nil +} + +func (m *Call) GetUpdateResourceProviderConfig() *Call_UpdateResourceProviderConfig { + if m != nil { + return m.UpdateResourceProviderConfig + } + return nil +} + +func (m *Call) GetRemoveResourceProviderConfig() *Call_RemoveResourceProviderConfig { + if m != nil { + return m.RemoveResourceProviderConfig + } + return nil +} + +func (m *Call) GetPruneImages() *Call_PruneImages { + if m != nil { + return m.PruneImages + } + return nil +} + +// Provides a snapshot of the current metrics tracked by the agent. +type Call_GetMetrics struct { + // If set, `timeout` would be used to determines the maximum amount of time + // the API will take to respond. If the timeout is exceeded, some metrics + // may not be included in the response. + Timeout *mesos.DurationInfo `protobuf:"bytes,1,opt,name=timeout" json:"timeout,omitempty"` +} + +func (m *Call_GetMetrics) Reset() { *m = Call_GetMetrics{} } +func (*Call_GetMetrics) ProtoMessage() {} +func (*Call_GetMetrics) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 0} } + +func (m *Call_GetMetrics) GetTimeout() *mesos.DurationInfo { + if m != nil { + return m.Timeout + } + return nil +} + +// Sets the logging verbosity level for a specified duration. Mesos uses +// [glog](https://github.com/google/glog) for logging. The library only uses +// verbose logging which means nothing will be output unless the verbosity +// level is set (by default it's 0, libprocess uses levels 1, 2, and 3). +type Call_SetLoggingLevel struct { + // The verbosity level. + Level uint32 `protobuf:"varint,1,req,name=level" json:"level"` + // The duration to keep verbosity level toggled. After this duration, the + // verbosity level of log would revert to the original level. + Duration mesos.DurationInfo `protobuf:"bytes,2,req,name=duration" json:"duration"` +} + +func (m *Call_SetLoggingLevel) Reset() { *m = Call_SetLoggingLevel{} } +func (*Call_SetLoggingLevel) ProtoMessage() {} +func (*Call_SetLoggingLevel) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 1} } + +func (m *Call_SetLoggingLevel) GetLevel() uint32 { + if m != nil { + return m.Level + } + return 0 +} + +func (m *Call_SetLoggingLevel) GetDuration() mesos.DurationInfo { + if m != nil { + return m.Duration + } + return mesos.DurationInfo{} +} + +// Provides the file listing for a directory. +type Call_ListFiles struct { + Path string `protobuf:"bytes,1,req,name=path" json:"path"` +} + +func (m *Call_ListFiles) Reset() { *m = Call_ListFiles{} } +func (*Call_ListFiles) ProtoMessage() {} +func (*Call_ListFiles) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 2} } + +func (m *Call_ListFiles) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +// Reads data from a file. +type Call_ReadFile struct { + // The path of file. + Path string `protobuf:"bytes,1,req,name=path" json:"path"` + // Initial offset in file to start reading from. + Offset uint64 `protobuf:"varint,2,req,name=offset" json:"offset"` + // The maximum number of bytes to read. The read length is capped at 16 + // memory pages. + Length *uint64 `protobuf:"varint,3,opt,name=length" json:"length,omitempty"` +} + +func (m *Call_ReadFile) Reset() { *m = Call_ReadFile{} } +func (*Call_ReadFile) ProtoMessage() {} +func (*Call_ReadFile) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 3} } + +func (m *Call_ReadFile) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *Call_ReadFile) GetOffset() uint64 { + if m != nil { + return m.Offset + } + return 0 +} + +func (m *Call_ReadFile) GetLength() uint64 { + if m != nil && m.Length != nil { + return *m.Length + } + return 0 +} + +// Lists active containers on the agent. +type Call_GetContainers struct { + ShowNested *bool `protobuf:"varint,1,opt,name=show_nested,json=showNested" json:"show_nested,omitempty"` + ShowStandalone *bool `protobuf:"varint,2,opt,name=show_standalone,json=showStandalone" json:"show_standalone,omitempty"` +} + +func (m *Call_GetContainers) Reset() { *m = Call_GetContainers{} } +func (*Call_GetContainers) ProtoMessage() {} +func (*Call_GetContainers) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 4} } + +func (m *Call_GetContainers) GetShowNested() bool { + if m != nil && m.ShowNested != nil { + return *m.ShowNested + } + return false +} + +func (m *Call_GetContainers) GetShowStandalone() bool { + if m != nil && m.ShowStandalone != nil { + return *m.ShowStandalone + } + return false +} + +// Deprecated in favor of `LaunchContainer`. +type Call_LaunchNestedContainer struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` + Command *mesos.CommandInfo `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"` + Container *mesos.ContainerInfo `protobuf:"bytes,3,opt,name=container" json:"container,omitempty"` +} + +func (m *Call_LaunchNestedContainer) Reset() { *m = Call_LaunchNestedContainer{} } +func (*Call_LaunchNestedContainer) ProtoMessage() {} +func (*Call_LaunchNestedContainer) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 5} +} + +func (m *Call_LaunchNestedContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +func (m *Call_LaunchNestedContainer) GetCommand() *mesos.CommandInfo { + if m != nil { + return m.Command + } + return nil +} + +func (m *Call_LaunchNestedContainer) GetContainer() *mesos.ContainerInfo { + if m != nil { + return m.Container + } + return nil +} + +// Deprecated in favor of `WaitContainer`. +type Call_WaitNestedContainer struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` +} + +func (m *Call_WaitNestedContainer) Reset() { *m = Call_WaitNestedContainer{} } +func (*Call_WaitNestedContainer) ProtoMessage() {} +func (*Call_WaitNestedContainer) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 6} } + +func (m *Call_WaitNestedContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +// Deprecated in favor of `KillContainer`. +type Call_KillNestedContainer struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` + Signal *int32 `protobuf:"varint,2,opt,name=signal" json:"signal,omitempty"` +} + +func (m *Call_KillNestedContainer) Reset() { *m = Call_KillNestedContainer{} } +func (*Call_KillNestedContainer) ProtoMessage() {} +func (*Call_KillNestedContainer) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 7} } + +func (m *Call_KillNestedContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +func (m *Call_KillNestedContainer) GetSignal() int32 { + if m != nil && m.Signal != nil { + return *m.Signal + } + return 0 +} + +// Deprecated in favor of `RemoveContainer`. +type Call_RemoveNestedContainer struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` +} + +func (m *Call_RemoveNestedContainer) Reset() { *m = Call_RemoveNestedContainer{} } +func (*Call_RemoveNestedContainer) ProtoMessage() {} +func (*Call_RemoveNestedContainer) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 8} +} + +func (m *Call_RemoveNestedContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +// Launches a nested container within an executor's tree of containers. +// The differences between this call and `LaunchNestedContainer` are: +// 1) The container's life-cycle is tied to the lifetime of the +// connection used to make this call, i.e., if the connection ever +// breaks, the container will be destroyed. +// 2) The nested container shares the same namespaces and cgroups as +// its parent container. +// 3) Results in a streaming response of type `ProcessIO`. So the call +// needs to be made on a persistent connection. +type Call_LaunchNestedContainerSession struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` + Command *mesos.CommandInfo `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"` + Container *mesos.ContainerInfo `protobuf:"bytes,3,opt,name=container" json:"container,omitempty"` +} + +func (m *Call_LaunchNestedContainerSession) Reset() { *m = Call_LaunchNestedContainerSession{} } +func (*Call_LaunchNestedContainerSession) ProtoMessage() {} +func (*Call_LaunchNestedContainerSession) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 9} +} + +func (m *Call_LaunchNestedContainerSession) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +func (m *Call_LaunchNestedContainerSession) GetCommand() *mesos.CommandInfo { + if m != nil { + return m.Command + } + return nil +} + +func (m *Call_LaunchNestedContainerSession) GetContainer() *mesos.ContainerInfo { + if m != nil { + return m.Container + } + return nil +} + +// Attaches the caller to the STDIN of the entry point of the container. +// Clients can use this to stream input data to a container. +// Note that this call needs to be made on a persistent connection by +// streaming a CONTAINER_ID message followed by one or more PROCESS_IO +// messages. +type Call_AttachContainerInput struct { + Type Call_AttachContainerInput_Type `protobuf:"varint,1,opt,name=type,enum=mesos.agent.Call_AttachContainerInput_Type" json:"type"` + ContainerID *mesos.ContainerID `protobuf:"bytes,2,opt,name=container_id,json=containerId" json:"container_id,omitempty"` + ProcessIO *ProcessIO `protobuf:"bytes,3,opt,name=process_io,json=processIo" json:"process_io,omitempty"` +} + +func (m *Call_AttachContainerInput) Reset() { *m = Call_AttachContainerInput{} } +func (*Call_AttachContainerInput) ProtoMessage() {} +func (*Call_AttachContainerInput) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 10} +} + +func (m *Call_AttachContainerInput) GetType() Call_AttachContainerInput_Type { + if m != nil { + return m.Type + } + return Call_AttachContainerInput_UNKNOWN +} + +func (m *Call_AttachContainerInput) GetContainerID() *mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return nil +} + +func (m *Call_AttachContainerInput) GetProcessIO() *ProcessIO { + if m != nil { + return m.ProcessIO + } + return nil +} + +// Attaches the caller to the STDOUT and STDERR of the entrypoint of +// the container. Clients can use this to stream output/error from the +// container. This call will result in a streaming response of `ProcessIO`; +// so this call needs to be made on a persistent connection. +type Call_AttachContainerOutput struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` +} + +func (m *Call_AttachContainerOutput) Reset() { *m = Call_AttachContainerOutput{} } +func (*Call_AttachContainerOutput) ProtoMessage() {} +func (*Call_AttachContainerOutput) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 11} +} + +func (m *Call_AttachContainerOutput) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +// Launches a either a "standalone" container on this agent +// or a nested container within another tree of containers. +// +// A standalone container is launched by specifying a ContainerID +// with no parent. Standalone containers bypass the normal offer cycle +// between the master and agent. Unlike other containers, a standalone +// container does not have an executor or any tasks. This means the +// standalone container does not report back to Mesos or any framework +// and must be supervised separately. +// +// A nested container is launched by specifying a ContainerID with +// another existing container (including standalone containers) +// as the parent. +// +// Returns 200 OK if the new container launch succeeds. +// Returns 202 Accepted if the requested ContainerID is already in use +// by a standalone or nested container. +// Returns 400 Bad Request if the container launch fails. +type Call_LaunchContainer struct { + // NOTE: Some characters cannot be used in the ID. All characters + // must be valid filesystem path characters. In addition, '/' and '.' + // are reserved. + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` + Command *mesos.CommandInfo `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"` + // NOTE: Nested containers may not specify resources and instead + // share resources with its parent container. + // + // TODO(josephw): These resources are purely used for isolation + // and are not accounted for by the Mesos master (if connected). + // It is the caller's responsibility to ensure that resources are + // not overcommitted (e.g. CPU and memory) or conflicting (e.g. ports + // and volumes). Once there is support for preempting tasks and a + // way to update the resources advertised by the agent, these standalone + // container resources should be accounted for by the master. + Resources []mesos.Resource `protobuf:"bytes,3,rep,name=resources" json:"resources"` + Container *mesos.ContainerInfo `protobuf:"bytes,4,opt,name=container" json:"container,omitempty"` +} + +func (m *Call_LaunchContainer) Reset() { *m = Call_LaunchContainer{} } +func (*Call_LaunchContainer) ProtoMessage() {} +func (*Call_LaunchContainer) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 12} } + +func (m *Call_LaunchContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +func (m *Call_LaunchContainer) GetCommand() *mesos.CommandInfo { + if m != nil { + return m.Command + } + return nil +} + +func (m *Call_LaunchContainer) GetResources() []mesos.Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *Call_LaunchContainer) GetContainer() *mesos.ContainerInfo { + if m != nil { + return m.Container + } + return nil +} + +// Waits for the standalone or nested container to terminate +// and returns the exit status. +// +// Returns 200 OK if and when the container exits. +// Returns 404 Not Found if the container does not exist. +type Call_WaitContainer struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` +} + +func (m *Call_WaitContainer) Reset() { *m = Call_WaitContainer{} } +func (*Call_WaitContainer) ProtoMessage() {} +func (*Call_WaitContainer) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 13} } + +func (m *Call_WaitContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +// Kills the standalone or nested container. The signal to be sent +// to the container can be specified in the 'signal' field. +// +// Returns 200 OK if the signal is sent successfully. +// Returns 404 Not Found if the container does not exist. +type Call_KillContainer struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` + // Defaults to SIGKILL. + Signal *int32 `protobuf:"varint,2,opt,name=signal" json:"signal,omitempty"` +} + +func (m *Call_KillContainer) Reset() { *m = Call_KillContainer{} } +func (*Call_KillContainer) ProtoMessage() {} +func (*Call_KillContainer) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 14} } + +func (m *Call_KillContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +func (m *Call_KillContainer) GetSignal() int32 { + if m != nil && m.Signal != nil { + return *m.Signal + } + return 0 +} + +// Removes a container's artifacts (runtime and sandbox directories). +// +// For nested containers, it is important to use this call if multiple +// nested containers are launched under the same parent container, because +// garbage collection only takes place at the parent container. Artifacts +// belonging to nested containers will not be garbage collected while +// the parent container is running. +// +// TODO(josephw): A standalone container's runtime directory is currently +// garbage collected as soon as the container exits. To allow the user to +// retrieve the exit status reliably, the runtime directory cannot be +// garbage collected immediately. Instead, the user will eventually be +// required to make this call after the standalone container has exited. +// Also, a standalone container's sandbox directory is currently not +// garbage collected and is only deleted via this call. +// +// Returns 200 OK if the removal is successful or if the parent container +// (for nested containers) does not exist. +// Returns 500 Internal Server Error if anything goes wrong, including +// if the container is still running or does not exist. +// +// TODO(josephw): Consider returning a 400 Bad Request instead of 500 +// Internal Server Error when the user tries to remove a running or +// nonexistent nested container. +type Call_RemoveContainer struct { + ContainerID mesos.ContainerID `protobuf:"bytes,1,req,name=container_id,json=containerId" json:"container_id"` +} + +func (m *Call_RemoveContainer) Reset() { *m = Call_RemoveContainer{} } +func (*Call_RemoveContainer) ProtoMessage() {} +func (*Call_RemoveContainer) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 15} } + +func (m *Call_RemoveContainer) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +// Adds a new resource provider config file. +// +// The content of the `info` field will be written into a new config file in +// the resource provider config directory, and a new resource provider will be +// launched asynchronously based on the config. Callers must not set the +// `info.id` field. This call is idempotent, so if a config file identical to +// the content of the `info` field already exists, this call will return +// without launching a resource provider. Note that if a config file is +// placed into the resource provider config directory out-of-band after the +// agent starts up, it will not be checked against this call. +// +// Returns 200 OK if a new config file is created, or an identical config file +// exists. +// Returns 400 Bad Request if `info` is not well-formed. +// Returns 403 Forbidden if the call is not authorized. +// Returns 409 Conflict if another config file that describes a +// resource provider of the same type and name exists, but the content is +// not identical. +// Returns 500 Internal Server Error if anything goes wrong. +type Call_AddResourceProviderConfig struct { + Info mesos.ResourceProviderInfo `protobuf:"bytes,1,req,name=info" json:"info"` +} + +func (m *Call_AddResourceProviderConfig) Reset() { *m = Call_AddResourceProviderConfig{} } +func (*Call_AddResourceProviderConfig) ProtoMessage() {} +func (*Call_AddResourceProviderConfig) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 16} +} + +func (m *Call_AddResourceProviderConfig) GetInfo() mesos.ResourceProviderInfo { + if m != nil { + return m.Info + } + return mesos.ResourceProviderInfo{} +} + +// Updates an existing resource provider config file. +// +// The content of the `info` field will be written into an existing config +// file that describes a resource provider of the specified type and name in +// the resource provider config directory, and the corresponding resource +// provider will be relaunched asynchronously to reflect the changes in the +// config. Callers must not set the `info.id` field. This call is idempotent, +// so if there is no change in the config, this call will return without +// relaunching the resource provider. Note that if a config file is placed +// into the resource provider config directory out-of-band after the agent +// starts up, it will not be checked against this call. +// +// Returns 200 OK if an existing config file is updated, or there is no change +// in the config file. +// Returns 400 Bad Request if `info` is not well-formed. +// Returns 403 Forbidden if the call is not authorized. +// Returns 404 Not Found if no config file describes a resource +// provider of the same type and name exists. +// Returns 500 Internal Server Error if anything goes wrong. +type Call_UpdateResourceProviderConfig struct { + Info mesos.ResourceProviderInfo `protobuf:"bytes,1,req,name=info" json:"info"` +} + +func (m *Call_UpdateResourceProviderConfig) Reset() { *m = Call_UpdateResourceProviderConfig{} } +func (*Call_UpdateResourceProviderConfig) ProtoMessage() {} +func (*Call_UpdateResourceProviderConfig) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 17} +} + +func (m *Call_UpdateResourceProviderConfig) GetInfo() mesos.ResourceProviderInfo { + if m != nil { + return m.Info + } + return mesos.ResourceProviderInfo{} +} + +// Removes a config file from the resource provider config directory. +// +// The config file that describes the resource provider of the specified type +// and name will be removed, and the corresponding resource provider will be +// terminated asynchronously. This call is idempotent, so if no matching +// config file exists, this call will return without terminating any resource +// provider. Note that if a config file is placed into the resource provider +// config directory out-of-band after the agent starts up, it will not be +// checked against this call. +// +// Returns 200 OK if the config file is removed, or no matching config file +// exists. +// Returns 403 Forbidden if the call is not authorized. +// Returns 500 Internal Server Error if anything goes wrong. +type Call_RemoveResourceProviderConfig struct { + Type string `protobuf:"bytes,1,req,name=type" json:"type"` + Name string `protobuf:"bytes,2,req,name=name" json:"name"` +} + +func (m *Call_RemoveResourceProviderConfig) Reset() { *m = Call_RemoveResourceProviderConfig{} } +func (*Call_RemoveResourceProviderConfig) ProtoMessage() {} +func (*Call_RemoveResourceProviderConfig) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{0, 18} +} + +func (m *Call_RemoveResourceProviderConfig) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Call_RemoveResourceProviderConfig) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +// Prune unused container images from image store. +// +// Images and layers referenced by active containers as well as +// image references specified in `excluded_images` will not be pruned. +type Call_PruneImages struct { + ExcludedImages []mesos.Image `protobuf:"bytes,1,rep,name=excluded_images,json=excludedImages" json:"excluded_images"` +} + +func (m *Call_PruneImages) Reset() { *m = Call_PruneImages{} } +func (*Call_PruneImages) ProtoMessage() {} +func (*Call_PruneImages) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{0, 19} } + +func (m *Call_PruneImages) GetExcludedImages() []mesos.Image { + if m != nil { + return m.ExcludedImages + } + return nil +} + +// * +// Synchronous responses for all calls made to the v1 agent API. +type Response struct { + Type Response_Type `protobuf:"varint,1,opt,name=type,enum=mesos.agent.Response_Type" json:"type"` + GetHealth *Response_GetHealth `protobuf:"bytes,2,opt,name=get_health,json=getHealth" json:"get_health,omitempty"` + GetFlags *Response_GetFlags `protobuf:"bytes,3,opt,name=get_flags,json=getFlags" json:"get_flags,omitempty"` + GetVersion *Response_GetVersion `protobuf:"bytes,4,opt,name=get_version,json=getVersion" json:"get_version,omitempty"` + GetMetrics *Response_GetMetrics `protobuf:"bytes,5,opt,name=get_metrics,json=getMetrics" json:"get_metrics,omitempty"` + GetLoggingLevel *Response_GetLoggingLevel `protobuf:"bytes,6,opt,name=get_logging_level,json=getLoggingLevel" json:"get_logging_level,omitempty"` + ListFiles *Response_ListFiles `protobuf:"bytes,7,opt,name=list_files,json=listFiles" json:"list_files,omitempty"` + ReadFile *Response_ReadFile `protobuf:"bytes,8,opt,name=read_file,json=readFile" json:"read_file,omitempty"` + GetState *Response_GetState `protobuf:"bytes,9,opt,name=get_state,json=getState" json:"get_state,omitempty"` + GetContainers *Response_GetContainers `protobuf:"bytes,10,opt,name=get_containers,json=getContainers" json:"get_containers,omitempty"` + GetFrameworks *Response_GetFrameworks `protobuf:"bytes,11,opt,name=get_frameworks,json=getFrameworks" json:"get_frameworks,omitempty"` + GetExecutors *Response_GetExecutors `protobuf:"bytes,12,opt,name=get_executors,json=getExecutors" json:"get_executors,omitempty"` + GetOperations *Response_GetOperations `protobuf:"bytes,18,opt,name=get_operations,json=getOperations" json:"get_operations,omitempty"` + GetTasks *Response_GetTasks `protobuf:"bytes,13,opt,name=get_tasks,json=getTasks" json:"get_tasks,omitempty"` + GetAgent *Response_GetAgent `protobuf:"bytes,15,opt,name=get_agent,json=getAgent" json:"get_agent,omitempty"` + GetResourceProviders *Response_GetResourceProviders `protobuf:"bytes,17,opt,name=get_resource_providers,json=getResourceProviders" json:"get_resource_providers,omitempty"` + WaitNestedContainer *Response_WaitNestedContainer `protobuf:"bytes,14,opt,name=wait_nested_container,json=waitNestedContainer" json:"wait_nested_container,omitempty"` + WaitContainer *Response_WaitContainer `protobuf:"bytes,16,opt,name=wait_container,json=waitContainer" json:"wait_container,omitempty"` +} + +func (m *Response) Reset() { *m = Response{} } +func (*Response) ProtoMessage() {} +func (*Response) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1} } + +func (m *Response) GetType() Response_Type { + if m != nil { + return m.Type + } + return Response_UNKNOWN +} + +func (m *Response) GetGetHealth() *Response_GetHealth { + if m != nil { + return m.GetHealth + } + return nil +} + +func (m *Response) GetGetFlags() *Response_GetFlags { + if m != nil { + return m.GetFlags + } + return nil +} + +func (m *Response) GetGetVersion() *Response_GetVersion { + if m != nil { + return m.GetVersion + } + return nil +} + +func (m *Response) GetGetMetrics() *Response_GetMetrics { + if m != nil { + return m.GetMetrics + } + return nil +} + +func (m *Response) GetGetLoggingLevel() *Response_GetLoggingLevel { + if m != nil { + return m.GetLoggingLevel + } + return nil +} + +func (m *Response) GetListFiles() *Response_ListFiles { + if m != nil { + return m.ListFiles + } + return nil +} + +func (m *Response) GetReadFile() *Response_ReadFile { + if m != nil { + return m.ReadFile + } + return nil +} + +func (m *Response) GetGetState() *Response_GetState { + if m != nil { + return m.GetState + } + return nil +} + +func (m *Response) GetGetContainers() *Response_GetContainers { + if m != nil { + return m.GetContainers + } + return nil +} + +func (m *Response) GetGetFrameworks() *Response_GetFrameworks { + if m != nil { + return m.GetFrameworks + } + return nil +} + +func (m *Response) GetGetExecutors() *Response_GetExecutors { + if m != nil { + return m.GetExecutors + } + return nil +} + +func (m *Response) GetGetOperations() *Response_GetOperations { + if m != nil { + return m.GetOperations + } + return nil +} + +func (m *Response) GetGetTasks() *Response_GetTasks { + if m != nil { + return m.GetTasks + } + return nil +} + +func (m *Response) GetGetAgent() *Response_GetAgent { + if m != nil { + return m.GetAgent + } + return nil +} + +func (m *Response) GetGetResourceProviders() *Response_GetResourceProviders { + if m != nil { + return m.GetResourceProviders + } + return nil +} + +func (m *Response) GetWaitNestedContainer() *Response_WaitNestedContainer { + if m != nil { + return m.WaitNestedContainer + } + return nil +} + +func (m *Response) GetWaitContainer() *Response_WaitContainer { + if m != nil { + return m.WaitContainer + } + return nil +} + +// `healthy` would be true if the agent is healthy. Delayed responses are also +// indicative of the poor health of the agent. +type Response_GetHealth struct { + Healthy bool `protobuf:"varint,1,req,name=healthy" json:"healthy"` +} + +func (m *Response_GetHealth) Reset() { *m = Response_GetHealth{} } +func (*Response_GetHealth) ProtoMessage() {} +func (*Response_GetHealth) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 0} } + +func (m *Response_GetHealth) GetHealthy() bool { + if m != nil { + return m.Healthy + } + return false +} + +// Contains the flag configuration of the agent. +type Response_GetFlags struct { + Flags []mesos.Flag `protobuf:"bytes,1,rep,name=flags" json:"flags"` +} + +func (m *Response_GetFlags) Reset() { *m = Response_GetFlags{} } +func (*Response_GetFlags) ProtoMessage() {} +func (*Response_GetFlags) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 1} } + +func (m *Response_GetFlags) GetFlags() []mesos.Flag { + if m != nil { + return m.Flags + } + return nil +} + +// Contains the version information of the agent. +type Response_GetVersion struct { + VersionInfo mesos.VersionInfo `protobuf:"bytes,1,req,name=version_info,json=versionInfo" json:"version_info"` +} + +func (m *Response_GetVersion) Reset() { *m = Response_GetVersion{} } +func (*Response_GetVersion) ProtoMessage() {} +func (*Response_GetVersion) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 2} } + +func (m *Response_GetVersion) GetVersionInfo() mesos.VersionInfo { + if m != nil { + return m.VersionInfo + } + return mesos.VersionInfo{} +} + +// Contains a snapshot of the current metrics. +type Response_GetMetrics struct { + Metrics []mesos.Metric `protobuf:"bytes,1,rep,name=metrics" json:"metrics"` +} + +func (m *Response_GetMetrics) Reset() { *m = Response_GetMetrics{} } +func (*Response_GetMetrics) ProtoMessage() {} +func (*Response_GetMetrics) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 3} } + +func (m *Response_GetMetrics) GetMetrics() []mesos.Metric { + if m != nil { + return m.Metrics + } + return nil +} + +// Contains the logging level of the agent. +type Response_GetLoggingLevel struct { + Level uint32 `protobuf:"varint,1,req,name=level" json:"level"` +} + +func (m *Response_GetLoggingLevel) Reset() { *m = Response_GetLoggingLevel{} } +func (*Response_GetLoggingLevel) ProtoMessage() {} +func (*Response_GetLoggingLevel) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 4} } + +func (m *Response_GetLoggingLevel) GetLevel() uint32 { + if m != nil { + return m.Level + } + return 0 +} + +// Contains the file listing(similar to `ls -l`) for a directory. +type Response_ListFiles struct { + FileInfos []mesos.FileInfo `protobuf:"bytes,1,rep,name=file_infos,json=fileInfos" json:"file_infos"` +} + +func (m *Response_ListFiles) Reset() { *m = Response_ListFiles{} } +func (*Response_ListFiles) ProtoMessage() {} +func (*Response_ListFiles) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 5} } + +func (m *Response_ListFiles) GetFileInfos() []mesos.FileInfo { + if m != nil { + return m.FileInfos + } + return nil +} + +// Contains the file data. +type Response_ReadFile struct { + // The size of file (in bytes). + Size uint64 `protobuf:"varint,1,req,name=size" json:"size"` + Data []byte `protobuf:"bytes,2,req,name=data" json:"data,omitempty"` +} + +func (m *Response_ReadFile) Reset() { *m = Response_ReadFile{} } +func (*Response_ReadFile) ProtoMessage() {} +func (*Response_ReadFile) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 6} } + +func (m *Response_ReadFile) GetSize() uint64 { + if m != nil { + return m.Size + } + return 0 +} + +func (m *Response_ReadFile) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// Contains full state of the agent i.e. information about the tasks, +// frameworks and executors running in the cluster. +type Response_GetState struct { + GetTasks *Response_GetTasks `protobuf:"bytes,1,opt,name=get_tasks,json=getTasks" json:"get_tasks,omitempty"` + GetExecutors *Response_GetExecutors `protobuf:"bytes,2,opt,name=get_executors,json=getExecutors" json:"get_executors,omitempty"` + GetFrameworks *Response_GetFrameworks `protobuf:"bytes,3,opt,name=get_frameworks,json=getFrameworks" json:"get_frameworks,omitempty"` +} + +func (m *Response_GetState) Reset() { *m = Response_GetState{} } +func (*Response_GetState) ProtoMessage() {} +func (*Response_GetState) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 7} } + +func (m *Response_GetState) GetGetTasks() *Response_GetTasks { + if m != nil { + return m.GetTasks + } + return nil +} + +func (m *Response_GetState) GetGetExecutors() *Response_GetExecutors { + if m != nil { + return m.GetExecutors + } + return nil +} + +func (m *Response_GetState) GetGetFrameworks() *Response_GetFrameworks { + if m != nil { + return m.GetFrameworks + } + return nil +} + +// Information about containers running on this agent. It contains +// ContainerStatus and ResourceStatistics along with some metadata +// of the containers. +type Response_GetContainers struct { + Containers []Response_GetContainers_Container `protobuf:"bytes,1,rep,name=containers" json:"containers"` +} + +func (m *Response_GetContainers) Reset() { *m = Response_GetContainers{} } +func (*Response_GetContainers) ProtoMessage() {} +func (*Response_GetContainers) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 8} } + +func (m *Response_GetContainers) GetContainers() []Response_GetContainers_Container { + if m != nil { + return m.Containers + } + return nil +} + +type Response_GetContainers_Container struct { + FrameworkID *mesos.FrameworkID `protobuf:"bytes,1,opt,name=framework_id,json=frameworkId" json:"framework_id,omitempty"` + ExecutorID *mesos.ExecutorID `protobuf:"bytes,2,opt,name=executor_id,json=executorId" json:"executor_id,omitempty"` + ExecutorName *string `protobuf:"bytes,3,opt,name=executor_name,json=executorName" json:"executor_name,omitempty"` + ContainerID mesos.ContainerID `protobuf:"bytes,4,req,name=container_id,json=containerId" json:"container_id"` + ContainerStatus *mesos.ContainerStatus `protobuf:"bytes,5,opt,name=container_status,json=containerStatus" json:"container_status,omitempty"` + ResourceStatistics *mesos.ResourceStatistics `protobuf:"bytes,6,opt,name=resource_statistics,json=resourceStatistics" json:"resource_statistics,omitempty"` +} + +func (m *Response_GetContainers_Container) Reset() { *m = Response_GetContainers_Container{} } +func (*Response_GetContainers_Container) ProtoMessage() {} +func (*Response_GetContainers_Container) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{1, 8, 0} +} + +func (m *Response_GetContainers_Container) GetFrameworkID() *mesos.FrameworkID { + if m != nil { + return m.FrameworkID + } + return nil +} + +func (m *Response_GetContainers_Container) GetExecutorID() *mesos.ExecutorID { + if m != nil { + return m.ExecutorID + } + return nil +} + +func (m *Response_GetContainers_Container) GetExecutorName() string { + if m != nil && m.ExecutorName != nil { + return *m.ExecutorName + } + return "" +} + +func (m *Response_GetContainers_Container) GetContainerID() mesos.ContainerID { + if m != nil { + return m.ContainerID + } + return mesos.ContainerID{} +} + +func (m *Response_GetContainers_Container) GetContainerStatus() *mesos.ContainerStatus { + if m != nil { + return m.ContainerStatus + } + return nil +} + +func (m *Response_GetContainers_Container) GetResourceStatistics() *mesos.ResourceStatistics { + if m != nil { + return m.ResourceStatistics + } + return nil +} + +// Information about all the frameworks known to the agent at the current +// time. +type Response_GetFrameworks struct { + Frameworks []Response_GetFrameworks_Framework `protobuf:"bytes,1,rep,name=frameworks" json:"frameworks"` + CompletedFrameworks []Response_GetFrameworks_Framework `protobuf:"bytes,2,rep,name=completed_frameworks,json=completedFrameworks" json:"completed_frameworks"` +} + +func (m *Response_GetFrameworks) Reset() { *m = Response_GetFrameworks{} } +func (*Response_GetFrameworks) ProtoMessage() {} +func (*Response_GetFrameworks) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 9} } + +func (m *Response_GetFrameworks) GetFrameworks() []Response_GetFrameworks_Framework { + if m != nil { + return m.Frameworks + } + return nil +} + +func (m *Response_GetFrameworks) GetCompletedFrameworks() []Response_GetFrameworks_Framework { + if m != nil { + return m.CompletedFrameworks + } + return nil +} + +type Response_GetFrameworks_Framework struct { + FrameworkInfo mesos.FrameworkInfo `protobuf:"bytes,1,req,name=framework_info,json=frameworkInfo" json:"framework_info"` +} + +func (m *Response_GetFrameworks_Framework) Reset() { *m = Response_GetFrameworks_Framework{} } +func (*Response_GetFrameworks_Framework) ProtoMessage() {} +func (*Response_GetFrameworks_Framework) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{1, 9, 0} +} + +func (m *Response_GetFrameworks_Framework) GetFrameworkInfo() mesos.FrameworkInfo { + if m != nil { + return m.FrameworkInfo + } + return mesos.FrameworkInfo{} +} + +// Lists information about all the executors known to the agent at the +// current time. +type Response_GetExecutors struct { + Executors []Response_GetExecutors_Executor `protobuf:"bytes,1,rep,name=executors" json:"executors"` + CompletedExecutors []Response_GetExecutors_Executor `protobuf:"bytes,2,rep,name=completed_executors,json=completedExecutors" json:"completed_executors"` +} + +func (m *Response_GetExecutors) Reset() { *m = Response_GetExecutors{} } +func (*Response_GetExecutors) ProtoMessage() {} +func (*Response_GetExecutors) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 10} } + +func (m *Response_GetExecutors) GetExecutors() []Response_GetExecutors_Executor { + if m != nil { + return m.Executors + } + return nil +} + +func (m *Response_GetExecutors) GetCompletedExecutors() []Response_GetExecutors_Executor { + if m != nil { + return m.CompletedExecutors + } + return nil +} + +type Response_GetExecutors_Executor struct { + ExecutorInfo mesos.ExecutorInfo `protobuf:"bytes,1,req,name=executor_info,json=executorInfo" json:"executor_info"` +} + +func (m *Response_GetExecutors_Executor) Reset() { *m = Response_GetExecutors_Executor{} } +func (*Response_GetExecutors_Executor) ProtoMessage() {} +func (*Response_GetExecutors_Executor) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{1, 10, 0} +} + +func (m *Response_GetExecutors_Executor) GetExecutorInfo() mesos.ExecutorInfo { + if m != nil { + return m.ExecutorInfo + } + return mesos.ExecutorInfo{} +} + +// Lists information about all operations known to the agent at the +// current time. +type Response_GetOperations struct { + Operations []mesos.Operation `protobuf:"bytes,1,rep,name=operations" json:"operations"` +} + +func (m *Response_GetOperations) Reset() { *m = Response_GetOperations{} } +func (*Response_GetOperations) ProtoMessage() {} +func (*Response_GetOperations) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 11} } + +func (m *Response_GetOperations) GetOperations() []mesos.Operation { + if m != nil { + return m.Operations + } + return nil +} + +// Lists information about all the tasks known to the agent at the current +// time. +type Response_GetTasks struct { + // Tasks that are pending in the agent's queue before an executor is + // launched. + PendingTasks []mesos.Task `protobuf:"bytes,1,rep,name=pending_tasks,json=pendingTasks" json:"pending_tasks"` + // Tasks that are enqueued for a launched executor that has not yet + // registered. + QueuedTasks []mesos.Task `protobuf:"bytes,2,rep,name=queued_tasks,json=queuedTasks" json:"queued_tasks"` + // Tasks that are running. + LaunchedTasks []mesos.Task `protobuf:"bytes,3,rep,name=launched_tasks,json=launchedTasks" json:"launched_tasks"` + // Tasks that are terminated but pending updates. + TerminatedTasks []mesos.Task `protobuf:"bytes,4,rep,name=terminated_tasks,json=terminatedTasks" json:"terminated_tasks"` + // Tasks that are terminated and updates acked. + CompletedTasks []mesos.Task `protobuf:"bytes,5,rep,name=completed_tasks,json=completedTasks" json:"completed_tasks"` +} + +func (m *Response_GetTasks) Reset() { *m = Response_GetTasks{} } +func (*Response_GetTasks) ProtoMessage() {} +func (*Response_GetTasks) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 12} } + +func (m *Response_GetTasks) GetPendingTasks() []mesos.Task { + if m != nil { + return m.PendingTasks + } + return nil +} + +func (m *Response_GetTasks) GetQueuedTasks() []mesos.Task { + if m != nil { + return m.QueuedTasks + } + return nil +} + +func (m *Response_GetTasks) GetLaunchedTasks() []mesos.Task { + if m != nil { + return m.LaunchedTasks + } + return nil +} + +func (m *Response_GetTasks) GetTerminatedTasks() []mesos.Task { + if m != nil { + return m.TerminatedTasks + } + return nil +} + +func (m *Response_GetTasks) GetCompletedTasks() []mesos.Task { + if m != nil { + return m.CompletedTasks + } + return nil +} + +// Contains the agent's information. +type Response_GetAgent struct { + AgentInfo *mesos.AgentInfo `protobuf:"bytes,1,opt,name=agent_info,json=agentInfo" json:"agent_info,omitempty"` +} + +func (m *Response_GetAgent) Reset() { *m = Response_GetAgent{} } +func (*Response_GetAgent) ProtoMessage() {} +func (*Response_GetAgent) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 13} } + +func (m *Response_GetAgent) GetAgentInfo() *mesos.AgentInfo { + if m != nil { + return m.AgentInfo + } + return nil +} + +// Lists information about all resource providers known to the agent +// at the current time. +type Response_GetResourceProviders struct { + ResourceProviders []Response_GetResourceProviders_ResourceProvider `protobuf:"bytes,1,rep,name=resource_providers,json=resourceProviders" json:"resource_providers"` +} + +func (m *Response_GetResourceProviders) Reset() { *m = Response_GetResourceProviders{} } +func (*Response_GetResourceProviders) ProtoMessage() {} +func (*Response_GetResourceProviders) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{1, 14} +} + +func (m *Response_GetResourceProviders) GetResourceProviders() []Response_GetResourceProviders_ResourceProvider { + if m != nil { + return m.ResourceProviders + } + return nil +} + +type Response_GetResourceProviders_ResourceProvider struct { + ResourceProviderInfo mesos.ResourceProviderInfo `protobuf:"bytes,1,req,name=resource_provider_info,json=resourceProviderInfo" json:"resource_provider_info"` + TotalResources []mesos.Resource `protobuf:"bytes,2,rep,name=total_resources,json=totalResources" json:"total_resources"` +} + +func (m *Response_GetResourceProviders_ResourceProvider) Reset() { + *m = Response_GetResourceProviders_ResourceProvider{} +} +func (*Response_GetResourceProviders_ResourceProvider) ProtoMessage() {} +func (*Response_GetResourceProviders_ResourceProvider) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{1, 14, 0} +} + +func (m *Response_GetResourceProviders_ResourceProvider) GetResourceProviderInfo() mesos.ResourceProviderInfo { + if m != nil { + return m.ResourceProviderInfo + } + return mesos.ResourceProviderInfo{} +} + +func (m *Response_GetResourceProviders_ResourceProvider) GetTotalResources() []mesos.Resource { + if m != nil { + return m.TotalResources + } + return nil +} + +// Returns termination information about the nested container. +type Response_WaitNestedContainer struct { + // Wait status of the lead process in the container. Note that this + // is the return value of `wait(2)`, so callers must use the `wait(2)` + // family of macros to extract whether the process exited cleanly and + // what the exit code was. + ExitStatus *int32 `protobuf:"varint,1,opt,name=exit_status,json=exitStatus" json:"exit_status,omitempty"` + // The `state` and `reason` fields may be populated if the Mesos agent + // terminates the container. In the absence of any special knowledge, + // executors should propagate this information via the `status` field + // of an `Update` call for the corresponding TaskID. + State *mesos.TaskState `protobuf:"varint,2,opt,name=state,enum=mesos.TaskState" json:"state,omitempty"` + Reason *mesos.TaskStatus_Reason `protobuf:"varint,3,opt,name=reason,enum=mesos.TaskStatus_Reason" json:"reason,omitempty"` + // This field will be populated if the task was terminated due to + // a resource limitation. + Limitation *mesos.TaskResourceLimitation `protobuf:"bytes,4,opt,name=limitation" json:"limitation,omitempty"` + Message *string `protobuf:"bytes,5,opt,name=message" json:"message,omitempty"` +} + +func (m *Response_WaitNestedContainer) Reset() { *m = Response_WaitNestedContainer{} } +func (*Response_WaitNestedContainer) ProtoMessage() {} +func (*Response_WaitNestedContainer) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{1, 15} +} + +func (m *Response_WaitNestedContainer) GetExitStatus() int32 { + if m != nil && m.ExitStatus != nil { + return *m.ExitStatus + } + return 0 +} + +func (m *Response_WaitNestedContainer) GetState() mesos.TaskState { + if m != nil && m.State != nil { + return *m.State + } + return mesos.TASK_STAGING +} + +func (m *Response_WaitNestedContainer) GetReason() mesos.TaskStatus_Reason { + if m != nil && m.Reason != nil { + return *m.Reason + } + return mesos.REASON_COMMAND_EXECUTOR_FAILED +} + +func (m *Response_WaitNestedContainer) GetLimitation() *mesos.TaskResourceLimitation { + if m != nil { + return m.Limitation + } + return nil +} + +func (m *Response_WaitNestedContainer) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +// Returns termination information about the standalone or nested container. +type Response_WaitContainer struct { + // Wait status of the lead process in the container. Note that this + // is the return value of `wait(2)`, so callers must use the `wait(2)` + // family of macros to extract whether the process exited cleanly and + // what the exit code was. + ExitStatus *int32 `protobuf:"varint,1,opt,name=exit_status,json=exitStatus" json:"exit_status,omitempty"` + // The `state` and `reason` fields may be populated if the Mesos agent + // terminates the container. In the absence of any special knowledge, + // executors should propagate this information via the `status` field + // of an `Update` call for the corresponding TaskID. + State *mesos.TaskState `protobuf:"varint,2,opt,name=state,enum=mesos.TaskState" json:"state,omitempty"` + Reason *mesos.TaskStatus_Reason `protobuf:"varint,3,opt,name=reason,enum=mesos.TaskStatus_Reason" json:"reason,omitempty"` + // This field will be populated if the task was terminated due to + // a resource limitation. + Limitation *mesos.TaskResourceLimitation `protobuf:"bytes,4,opt,name=limitation" json:"limitation,omitempty"` + Message *string `protobuf:"bytes,5,opt,name=message" json:"message,omitempty"` +} + +func (m *Response_WaitContainer) Reset() { *m = Response_WaitContainer{} } +func (*Response_WaitContainer) ProtoMessage() {} +func (*Response_WaitContainer) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{1, 16} } + +func (m *Response_WaitContainer) GetExitStatus() int32 { + if m != nil && m.ExitStatus != nil { + return *m.ExitStatus + } + return 0 +} + +func (m *Response_WaitContainer) GetState() mesos.TaskState { + if m != nil && m.State != nil { + return *m.State + } + return mesos.TASK_STAGING +} + +func (m *Response_WaitContainer) GetReason() mesos.TaskStatus_Reason { + if m != nil && m.Reason != nil { + return *m.Reason + } + return mesos.REASON_COMMAND_EXECUTOR_FAILED +} + +func (m *Response_WaitContainer) GetLimitation() *mesos.TaskResourceLimitation { + if m != nil { + return m.Limitation + } + return nil +} + +func (m *Response_WaitContainer) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +// * +// Streaming response to `Call::LAUNCH_NESTED_CONTAINER_SESSION` and +// `Call::ATTACH_CONTAINER_OUTPUT`. +// +// This message is also used to stream request data for +// `Call::ATTACH_CONTAINER_INPUT`. +type ProcessIO struct { + Type ProcessIO_Type `protobuf:"varint,1,opt,name=type,enum=mesos.agent.ProcessIO_Type" json:"type"` + Data *ProcessIO_Data `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` + Control *ProcessIO_Control `protobuf:"bytes,3,opt,name=control" json:"control,omitempty"` +} + +func (m *ProcessIO) Reset() { *m = ProcessIO{} } +func (*ProcessIO) ProtoMessage() {} +func (*ProcessIO) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{2} } + +func (m *ProcessIO) GetType() ProcessIO_Type { + if m != nil { + return m.Type + } + return ProcessIO_UNKNOWN +} + +func (m *ProcessIO) GetData() *ProcessIO_Data { + if m != nil { + return m.Data + } + return nil +} + +func (m *ProcessIO) GetControl() *ProcessIO_Control { + if m != nil { + return m.Control + } + return nil +} + +type ProcessIO_Data struct { + Type ProcessIO_Data_Type `protobuf:"varint,1,opt,name=type,enum=mesos.agent.ProcessIO_Data_Type" json:"type"` + Data []byte `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` +} + +func (m *ProcessIO_Data) Reset() { *m = ProcessIO_Data{} } +func (*ProcessIO_Data) ProtoMessage() {} +func (*ProcessIO_Data) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{2, 0} } + +func (m *ProcessIO_Data) GetType() ProcessIO_Data_Type { + if m != nil { + return m.Type + } + return ProcessIO_Data_UNKNOWN +} + +func (m *ProcessIO_Data) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +type ProcessIO_Control struct { + Type ProcessIO_Control_Type `protobuf:"varint,1,opt,name=type,enum=mesos.agent.ProcessIO_Control_Type" json:"type"` + TTYInfo *mesos.TTYInfo `protobuf:"bytes,2,opt,name=tty_info,json=ttyInfo" json:"tty_info,omitempty"` + Heartbeat *ProcessIO_Control_Heartbeat `protobuf:"bytes,3,opt,name=heartbeat" json:"heartbeat,omitempty"` +} + +func (m *ProcessIO_Control) Reset() { *m = ProcessIO_Control{} } +func (*ProcessIO_Control) ProtoMessage() {} +func (*ProcessIO_Control) Descriptor() ([]byte, []int) { return fileDescriptorAgent, []int{2, 1} } + +func (m *ProcessIO_Control) GetType() ProcessIO_Control_Type { + if m != nil { + return m.Type + } + return ProcessIO_Control_UNKNOWN +} + +func (m *ProcessIO_Control) GetTTYInfo() *mesos.TTYInfo { + if m != nil { + return m.TTYInfo + } + return nil +} + +func (m *ProcessIO_Control) GetHeartbeat() *ProcessIO_Control_Heartbeat { + if m != nil { + return m.Heartbeat + } + return nil +} + +type ProcessIO_Control_Heartbeat struct { + Interval *mesos.DurationInfo `protobuf:"bytes,1,opt,name=interval" json:"interval,omitempty"` +} + +func (m *ProcessIO_Control_Heartbeat) Reset() { *m = ProcessIO_Control_Heartbeat{} } +func (*ProcessIO_Control_Heartbeat) ProtoMessage() {} +func (*ProcessIO_Control_Heartbeat) Descriptor() ([]byte, []int) { + return fileDescriptorAgent, []int{2, 1, 0} +} + +func (m *ProcessIO_Control_Heartbeat) GetInterval() *mesos.DurationInfo { + if m != nil { + return m.Interval + } + return nil +} + +func init() { + proto.RegisterType((*Call)(nil), "mesos.agent.Call") + proto.RegisterType((*Call_GetMetrics)(nil), "mesos.agent.Call.GetMetrics") + proto.RegisterType((*Call_SetLoggingLevel)(nil), "mesos.agent.Call.SetLoggingLevel") + proto.RegisterType((*Call_ListFiles)(nil), "mesos.agent.Call.ListFiles") + proto.RegisterType((*Call_ReadFile)(nil), "mesos.agent.Call.ReadFile") + proto.RegisterType((*Call_GetContainers)(nil), "mesos.agent.Call.GetContainers") + proto.RegisterType((*Call_LaunchNestedContainer)(nil), "mesos.agent.Call.LaunchNestedContainer") + proto.RegisterType((*Call_WaitNestedContainer)(nil), "mesos.agent.Call.WaitNestedContainer") + proto.RegisterType((*Call_KillNestedContainer)(nil), "mesos.agent.Call.KillNestedContainer") + proto.RegisterType((*Call_RemoveNestedContainer)(nil), "mesos.agent.Call.RemoveNestedContainer") + proto.RegisterType((*Call_LaunchNestedContainerSession)(nil), "mesos.agent.Call.LaunchNestedContainerSession") + proto.RegisterType((*Call_AttachContainerInput)(nil), "mesos.agent.Call.AttachContainerInput") + proto.RegisterType((*Call_AttachContainerOutput)(nil), "mesos.agent.Call.AttachContainerOutput") + proto.RegisterType((*Call_LaunchContainer)(nil), "mesos.agent.Call.LaunchContainer") + proto.RegisterType((*Call_WaitContainer)(nil), "mesos.agent.Call.WaitContainer") + proto.RegisterType((*Call_KillContainer)(nil), "mesos.agent.Call.KillContainer") + proto.RegisterType((*Call_RemoveContainer)(nil), "mesos.agent.Call.RemoveContainer") + proto.RegisterType((*Call_AddResourceProviderConfig)(nil), "mesos.agent.Call.AddResourceProviderConfig") + proto.RegisterType((*Call_UpdateResourceProviderConfig)(nil), "mesos.agent.Call.UpdateResourceProviderConfig") + proto.RegisterType((*Call_RemoveResourceProviderConfig)(nil), "mesos.agent.Call.RemoveResourceProviderConfig") + proto.RegisterType((*Call_PruneImages)(nil), "mesos.agent.Call.PruneImages") + proto.RegisterType((*Response)(nil), "mesos.agent.Response") + proto.RegisterType((*Response_GetHealth)(nil), "mesos.agent.Response.GetHealth") + proto.RegisterType((*Response_GetFlags)(nil), "mesos.agent.Response.GetFlags") + proto.RegisterType((*Response_GetVersion)(nil), "mesos.agent.Response.GetVersion") + proto.RegisterType((*Response_GetMetrics)(nil), "mesos.agent.Response.GetMetrics") + proto.RegisterType((*Response_GetLoggingLevel)(nil), "mesos.agent.Response.GetLoggingLevel") + proto.RegisterType((*Response_ListFiles)(nil), "mesos.agent.Response.ListFiles") + proto.RegisterType((*Response_ReadFile)(nil), "mesos.agent.Response.ReadFile") + proto.RegisterType((*Response_GetState)(nil), "mesos.agent.Response.GetState") + proto.RegisterType((*Response_GetContainers)(nil), "mesos.agent.Response.GetContainers") + proto.RegisterType((*Response_GetContainers_Container)(nil), "mesos.agent.Response.GetContainers.Container") + proto.RegisterType((*Response_GetFrameworks)(nil), "mesos.agent.Response.GetFrameworks") + proto.RegisterType((*Response_GetFrameworks_Framework)(nil), "mesos.agent.Response.GetFrameworks.Framework") + proto.RegisterType((*Response_GetExecutors)(nil), "mesos.agent.Response.GetExecutors") + proto.RegisterType((*Response_GetExecutors_Executor)(nil), "mesos.agent.Response.GetExecutors.Executor") + proto.RegisterType((*Response_GetOperations)(nil), "mesos.agent.Response.GetOperations") + proto.RegisterType((*Response_GetTasks)(nil), "mesos.agent.Response.GetTasks") + proto.RegisterType((*Response_GetAgent)(nil), "mesos.agent.Response.GetAgent") + proto.RegisterType((*Response_GetResourceProviders)(nil), "mesos.agent.Response.GetResourceProviders") + proto.RegisterType((*Response_GetResourceProviders_ResourceProvider)(nil), "mesos.agent.Response.GetResourceProviders.ResourceProvider") + proto.RegisterType((*Response_WaitNestedContainer)(nil), "mesos.agent.Response.WaitNestedContainer") + proto.RegisterType((*Response_WaitContainer)(nil), "mesos.agent.Response.WaitContainer") + proto.RegisterType((*ProcessIO)(nil), "mesos.agent.ProcessIO") + proto.RegisterType((*ProcessIO_Data)(nil), "mesos.agent.ProcessIO.Data") + proto.RegisterType((*ProcessIO_Control)(nil), "mesos.agent.ProcessIO.Control") + proto.RegisterType((*ProcessIO_Control_Heartbeat)(nil), "mesos.agent.ProcessIO.Control.Heartbeat") + proto.RegisterEnum("mesos.agent.Call_Type", Call_Type_name, Call_Type_value) + proto.RegisterEnum("mesos.agent.Call_AttachContainerInput_Type", Call_AttachContainerInput_Type_name, Call_AttachContainerInput_Type_value) + proto.RegisterEnum("mesos.agent.Response_Type", Response_Type_name, Response_Type_value) + proto.RegisterEnum("mesos.agent.ProcessIO_Type", ProcessIO_Type_name, ProcessIO_Type_value) + proto.RegisterEnum("mesos.agent.ProcessIO_Data_Type", ProcessIO_Data_Type_name, ProcessIO_Data_Type_value) + proto.RegisterEnum("mesos.agent.ProcessIO_Control_Type", ProcessIO_Control_Type_name, ProcessIO_Control_Type_value) +} +func (x Call_Type) String() string { + s, ok := Call_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Call_AttachContainerInput_Type) String() string { + s, ok := Call_AttachContainerInput_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Response_Type) String() string { + s, ok := Response_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x ProcessIO_Type) String() string { + s, ok := ProcessIO_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x ProcessIO_Data_Type) String() string { + s, ok := ProcessIO_Data_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x ProcessIO_Control_Type) String() string { + s, ok := ProcessIO_Control_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (this *Call) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call) + if !ok { + that2, ok := that.(Call) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.GetMetrics.Equal(that1.GetMetrics) { + return fmt.Errorf("GetMetrics this(%v) Not Equal that(%v)", this.GetMetrics, that1.GetMetrics) + } + if !this.SetLoggingLevel.Equal(that1.SetLoggingLevel) { + return fmt.Errorf("SetLoggingLevel this(%v) Not Equal that(%v)", this.SetLoggingLevel, that1.SetLoggingLevel) + } + if !this.ListFiles.Equal(that1.ListFiles) { + return fmt.Errorf("ListFiles this(%v) Not Equal that(%v)", this.ListFiles, that1.ListFiles) + } + if !this.ReadFile.Equal(that1.ReadFile) { + return fmt.Errorf("ReadFile this(%v) Not Equal that(%v)", this.ReadFile, that1.ReadFile) + } + if !this.GetContainers.Equal(that1.GetContainers) { + return fmt.Errorf("GetContainers this(%v) Not Equal that(%v)", this.GetContainers, that1.GetContainers) + } + if !this.LaunchNestedContainer.Equal(that1.LaunchNestedContainer) { + return fmt.Errorf("LaunchNestedContainer this(%v) Not Equal that(%v)", this.LaunchNestedContainer, that1.LaunchNestedContainer) + } + if !this.WaitNestedContainer.Equal(that1.WaitNestedContainer) { + return fmt.Errorf("WaitNestedContainer this(%v) Not Equal that(%v)", this.WaitNestedContainer, that1.WaitNestedContainer) + } + if !this.KillNestedContainer.Equal(that1.KillNestedContainer) { + return fmt.Errorf("KillNestedContainer this(%v) Not Equal that(%v)", this.KillNestedContainer, that1.KillNestedContainer) + } + if !this.RemoveNestedContainer.Equal(that1.RemoveNestedContainer) { + return fmt.Errorf("RemoveNestedContainer this(%v) Not Equal that(%v)", this.RemoveNestedContainer, that1.RemoveNestedContainer) + } + if !this.LaunchNestedContainerSession.Equal(that1.LaunchNestedContainerSession) { + return fmt.Errorf("LaunchNestedContainerSession this(%v) Not Equal that(%v)", this.LaunchNestedContainerSession, that1.LaunchNestedContainerSession) + } + if !this.AttachContainerInput.Equal(that1.AttachContainerInput) { + return fmt.Errorf("AttachContainerInput this(%v) Not Equal that(%v)", this.AttachContainerInput, that1.AttachContainerInput) + } + if !this.AttachContainerOutput.Equal(that1.AttachContainerOutput) { + return fmt.Errorf("AttachContainerOutput this(%v) Not Equal that(%v)", this.AttachContainerOutput, that1.AttachContainerOutput) + } + if !this.LaunchContainer.Equal(that1.LaunchContainer) { + return fmt.Errorf("LaunchContainer this(%v) Not Equal that(%v)", this.LaunchContainer, that1.LaunchContainer) + } + if !this.WaitContainer.Equal(that1.WaitContainer) { + return fmt.Errorf("WaitContainer this(%v) Not Equal that(%v)", this.WaitContainer, that1.WaitContainer) + } + if !this.KillContainer.Equal(that1.KillContainer) { + return fmt.Errorf("KillContainer this(%v) Not Equal that(%v)", this.KillContainer, that1.KillContainer) + } + if !this.RemoveContainer.Equal(that1.RemoveContainer) { + return fmt.Errorf("RemoveContainer this(%v) Not Equal that(%v)", this.RemoveContainer, that1.RemoveContainer) + } + if !this.AddResourceProviderConfig.Equal(that1.AddResourceProviderConfig) { + return fmt.Errorf("AddResourceProviderConfig this(%v) Not Equal that(%v)", this.AddResourceProviderConfig, that1.AddResourceProviderConfig) + } + if !this.UpdateResourceProviderConfig.Equal(that1.UpdateResourceProviderConfig) { + return fmt.Errorf("UpdateResourceProviderConfig this(%v) Not Equal that(%v)", this.UpdateResourceProviderConfig, that1.UpdateResourceProviderConfig) + } + if !this.RemoveResourceProviderConfig.Equal(that1.RemoveResourceProviderConfig) { + return fmt.Errorf("RemoveResourceProviderConfig this(%v) Not Equal that(%v)", this.RemoveResourceProviderConfig, that1.RemoveResourceProviderConfig) + } + if !this.PruneImages.Equal(that1.PruneImages) { + return fmt.Errorf("PruneImages this(%v) Not Equal that(%v)", this.PruneImages, that1.PruneImages) + } + return nil +} +func (this *Call) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call) + if !ok { + that2, ok := that.(Call) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.GetMetrics.Equal(that1.GetMetrics) { + return false + } + if !this.SetLoggingLevel.Equal(that1.SetLoggingLevel) { + return false + } + if !this.ListFiles.Equal(that1.ListFiles) { + return false + } + if !this.ReadFile.Equal(that1.ReadFile) { + return false + } + if !this.GetContainers.Equal(that1.GetContainers) { + return false + } + if !this.LaunchNestedContainer.Equal(that1.LaunchNestedContainer) { + return false + } + if !this.WaitNestedContainer.Equal(that1.WaitNestedContainer) { + return false + } + if !this.KillNestedContainer.Equal(that1.KillNestedContainer) { + return false + } + if !this.RemoveNestedContainer.Equal(that1.RemoveNestedContainer) { + return false + } + if !this.LaunchNestedContainerSession.Equal(that1.LaunchNestedContainerSession) { + return false + } + if !this.AttachContainerInput.Equal(that1.AttachContainerInput) { + return false + } + if !this.AttachContainerOutput.Equal(that1.AttachContainerOutput) { + return false + } + if !this.LaunchContainer.Equal(that1.LaunchContainer) { + return false + } + if !this.WaitContainer.Equal(that1.WaitContainer) { + return false + } + if !this.KillContainer.Equal(that1.KillContainer) { + return false + } + if !this.RemoveContainer.Equal(that1.RemoveContainer) { + return false + } + if !this.AddResourceProviderConfig.Equal(that1.AddResourceProviderConfig) { + return false + } + if !this.UpdateResourceProviderConfig.Equal(that1.UpdateResourceProviderConfig) { + return false + } + if !this.RemoveResourceProviderConfig.Equal(that1.RemoveResourceProviderConfig) { + return false + } + if !this.PruneImages.Equal(that1.PruneImages) { + return false + } + return true +} +func (this *Call_GetMetrics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_GetMetrics) + if !ok { + that2, ok := that.(Call_GetMetrics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_GetMetrics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_GetMetrics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_GetMetrics but is not nil && this == nil") + } + if !this.Timeout.Equal(that1.Timeout) { + return fmt.Errorf("Timeout this(%v) Not Equal that(%v)", this.Timeout, that1.Timeout) + } + return nil +} +func (this *Call_GetMetrics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_GetMetrics) + if !ok { + that2, ok := that.(Call_GetMetrics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Timeout.Equal(that1.Timeout) { + return false + } + return true +} +func (this *Call_SetLoggingLevel) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_SetLoggingLevel) + if !ok { + that2, ok := that.(Call_SetLoggingLevel) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_SetLoggingLevel") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_SetLoggingLevel but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_SetLoggingLevel but is not nil && this == nil") + } + if this.Level != that1.Level { + return fmt.Errorf("Level this(%v) Not Equal that(%v)", this.Level, that1.Level) + } + if !this.Duration.Equal(&that1.Duration) { + return fmt.Errorf("Duration this(%v) Not Equal that(%v)", this.Duration, that1.Duration) + } + return nil +} +func (this *Call_SetLoggingLevel) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_SetLoggingLevel) + if !ok { + that2, ok := that.(Call_SetLoggingLevel) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Level != that1.Level { + return false + } + if !this.Duration.Equal(&that1.Duration) { + return false + } + return true +} +func (this *Call_ListFiles) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_ListFiles) + if !ok { + that2, ok := that.(Call_ListFiles) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_ListFiles") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_ListFiles but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_ListFiles but is not nil && this == nil") + } + if this.Path != that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + return nil +} +func (this *Call_ListFiles) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_ListFiles) + if !ok { + that2, ok := that.(Call_ListFiles) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Path != that1.Path { + return false + } + return true +} +func (this *Call_ReadFile) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_ReadFile) + if !ok { + that2, ok := that.(Call_ReadFile) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_ReadFile") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_ReadFile but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_ReadFile but is not nil && this == nil") + } + if this.Path != that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + if this.Offset != that1.Offset { + return fmt.Errorf("Offset this(%v) Not Equal that(%v)", this.Offset, that1.Offset) + } + if this.Length != nil && that1.Length != nil { + if *this.Length != *that1.Length { + return fmt.Errorf("Length this(%v) Not Equal that(%v)", *this.Length, *that1.Length) + } + } else if this.Length != nil { + return fmt.Errorf("this.Length == nil && that.Length != nil") + } else if that1.Length != nil { + return fmt.Errorf("Length this(%v) Not Equal that(%v)", this.Length, that1.Length) + } + return nil +} +func (this *Call_ReadFile) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_ReadFile) + if !ok { + that2, ok := that.(Call_ReadFile) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Path != that1.Path { + return false + } + if this.Offset != that1.Offset { + return false + } + if this.Length != nil && that1.Length != nil { + if *this.Length != *that1.Length { + return false + } + } else if this.Length != nil { + return false + } else if that1.Length != nil { + return false + } + return true +} +func (this *Call_GetContainers) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_GetContainers) + if !ok { + that2, ok := that.(Call_GetContainers) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_GetContainers") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_GetContainers but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_GetContainers but is not nil && this == nil") + } + if this.ShowNested != nil && that1.ShowNested != nil { + if *this.ShowNested != *that1.ShowNested { + return fmt.Errorf("ShowNested this(%v) Not Equal that(%v)", *this.ShowNested, *that1.ShowNested) + } + } else if this.ShowNested != nil { + return fmt.Errorf("this.ShowNested == nil && that.ShowNested != nil") + } else if that1.ShowNested != nil { + return fmt.Errorf("ShowNested this(%v) Not Equal that(%v)", this.ShowNested, that1.ShowNested) + } + if this.ShowStandalone != nil && that1.ShowStandalone != nil { + if *this.ShowStandalone != *that1.ShowStandalone { + return fmt.Errorf("ShowStandalone this(%v) Not Equal that(%v)", *this.ShowStandalone, *that1.ShowStandalone) + } + } else if this.ShowStandalone != nil { + return fmt.Errorf("this.ShowStandalone == nil && that.ShowStandalone != nil") + } else if that1.ShowStandalone != nil { + return fmt.Errorf("ShowStandalone this(%v) Not Equal that(%v)", this.ShowStandalone, that1.ShowStandalone) + } + return nil +} +func (this *Call_GetContainers) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_GetContainers) + if !ok { + that2, ok := that.(Call_GetContainers) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ShowNested != nil && that1.ShowNested != nil { + if *this.ShowNested != *that1.ShowNested { + return false + } + } else if this.ShowNested != nil { + return false + } else if that1.ShowNested != nil { + return false + } + if this.ShowStandalone != nil && that1.ShowStandalone != nil { + if *this.ShowStandalone != *that1.ShowStandalone { + return false + } + } else if this.ShowStandalone != nil { + return false + } else if that1.ShowStandalone != nil { + return false + } + return true +} +func (this *Call_LaunchNestedContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_LaunchNestedContainer) + if !ok { + that2, ok := that.(Call_LaunchNestedContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_LaunchNestedContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_LaunchNestedContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_LaunchNestedContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if !this.Container.Equal(that1.Container) { + return fmt.Errorf("Container this(%v) Not Equal that(%v)", this.Container, that1.Container) + } + return nil +} +func (this *Call_LaunchNestedContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_LaunchNestedContainer) + if !ok { + that2, ok := that.(Call_LaunchNestedContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if !this.Container.Equal(that1.Container) { + return false + } + return true +} +func (this *Call_WaitNestedContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_WaitNestedContainer) + if !ok { + that2, ok := that.(Call_WaitNestedContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_WaitNestedContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_WaitNestedContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_WaitNestedContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + return nil +} +func (this *Call_WaitNestedContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_WaitNestedContainer) + if !ok { + that2, ok := that.(Call_WaitNestedContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + return true +} +func (this *Call_KillNestedContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_KillNestedContainer) + if !ok { + that2, ok := that.(Call_KillNestedContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_KillNestedContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_KillNestedContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_KillNestedContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if this.Signal != nil && that1.Signal != nil { + if *this.Signal != *that1.Signal { + return fmt.Errorf("Signal this(%v) Not Equal that(%v)", *this.Signal, *that1.Signal) + } + } else if this.Signal != nil { + return fmt.Errorf("this.Signal == nil && that.Signal != nil") + } else if that1.Signal != nil { + return fmt.Errorf("Signal this(%v) Not Equal that(%v)", this.Signal, that1.Signal) + } + return nil +} +func (this *Call_KillNestedContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_KillNestedContainer) + if !ok { + that2, ok := that.(Call_KillNestedContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + if this.Signal != nil && that1.Signal != nil { + if *this.Signal != *that1.Signal { + return false + } + } else if this.Signal != nil { + return false + } else if that1.Signal != nil { + return false + } + return true +} +func (this *Call_RemoveNestedContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_RemoveNestedContainer) + if !ok { + that2, ok := that.(Call_RemoveNestedContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_RemoveNestedContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_RemoveNestedContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_RemoveNestedContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + return nil +} +func (this *Call_RemoveNestedContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_RemoveNestedContainer) + if !ok { + that2, ok := that.(Call_RemoveNestedContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + return true +} +func (this *Call_LaunchNestedContainerSession) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_LaunchNestedContainerSession) + if !ok { + that2, ok := that.(Call_LaunchNestedContainerSession) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_LaunchNestedContainerSession") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_LaunchNestedContainerSession but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_LaunchNestedContainerSession but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if !this.Container.Equal(that1.Container) { + return fmt.Errorf("Container this(%v) Not Equal that(%v)", this.Container, that1.Container) + } + return nil +} +func (this *Call_LaunchNestedContainerSession) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_LaunchNestedContainerSession) + if !ok { + that2, ok := that.(Call_LaunchNestedContainerSession) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if !this.Container.Equal(that1.Container) { + return false + } + return true +} +func (this *Call_AttachContainerInput) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_AttachContainerInput) + if !ok { + that2, ok := that.(Call_AttachContainerInput) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_AttachContainerInput") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_AttachContainerInput but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_AttachContainerInput but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.ContainerID.Equal(that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if !this.ProcessIO.Equal(that1.ProcessIO) { + return fmt.Errorf("ProcessIO this(%v) Not Equal that(%v)", this.ProcessIO, that1.ProcessIO) + } + return nil +} +func (this *Call_AttachContainerInput) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_AttachContainerInput) + if !ok { + that2, ok := that.(Call_AttachContainerInput) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.ContainerID.Equal(that1.ContainerID) { + return false + } + if !this.ProcessIO.Equal(that1.ProcessIO) { + return false + } + return true +} +func (this *Call_AttachContainerOutput) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_AttachContainerOutput) + if !ok { + that2, ok := that.(Call_AttachContainerOutput) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_AttachContainerOutput") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_AttachContainerOutput but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_AttachContainerOutput but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + return nil +} +func (this *Call_AttachContainerOutput) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_AttachContainerOutput) + if !ok { + that2, ok := that.(Call_AttachContainerOutput) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + return true +} +func (this *Call_LaunchContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_LaunchContainer) + if !ok { + that2, ok := that.(Call_LaunchContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_LaunchContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_LaunchContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_LaunchContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if !this.Container.Equal(that1.Container) { + return fmt.Errorf("Container this(%v) Not Equal that(%v)", this.Container, that1.Container) + } + return nil +} +func (this *Call_LaunchContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_LaunchContainer) + if !ok { + that2, ok := that.(Call_LaunchContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if !this.Container.Equal(that1.Container) { + return false + } + return true +} +func (this *Call_WaitContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_WaitContainer) + if !ok { + that2, ok := that.(Call_WaitContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_WaitContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_WaitContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_WaitContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + return nil +} +func (this *Call_WaitContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_WaitContainer) + if !ok { + that2, ok := that.(Call_WaitContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + return true +} +func (this *Call_KillContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_KillContainer) + if !ok { + that2, ok := that.(Call_KillContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_KillContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_KillContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_KillContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if this.Signal != nil && that1.Signal != nil { + if *this.Signal != *that1.Signal { + return fmt.Errorf("Signal this(%v) Not Equal that(%v)", *this.Signal, *that1.Signal) + } + } else if this.Signal != nil { + return fmt.Errorf("this.Signal == nil && that.Signal != nil") + } else if that1.Signal != nil { + return fmt.Errorf("Signal this(%v) Not Equal that(%v)", this.Signal, that1.Signal) + } + return nil +} +func (this *Call_KillContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_KillContainer) + if !ok { + that2, ok := that.(Call_KillContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + if this.Signal != nil && that1.Signal != nil { + if *this.Signal != *that1.Signal { + return false + } + } else if this.Signal != nil { + return false + } else if that1.Signal != nil { + return false + } + return true +} +func (this *Call_RemoveContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_RemoveContainer) + if !ok { + that2, ok := that.(Call_RemoveContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_RemoveContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_RemoveContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_RemoveContainer but is not nil && this == nil") + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + return nil +} +func (this *Call_RemoveContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_RemoveContainer) + if !ok { + that2, ok := that.(Call_RemoveContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + return true +} +func (this *Call_AddResourceProviderConfig) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_AddResourceProviderConfig) + if !ok { + that2, ok := that.(Call_AddResourceProviderConfig) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_AddResourceProviderConfig") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_AddResourceProviderConfig but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_AddResourceProviderConfig but is not nil && this == nil") + } + if !this.Info.Equal(&that1.Info) { + return fmt.Errorf("Info this(%v) Not Equal that(%v)", this.Info, that1.Info) + } + return nil +} +func (this *Call_AddResourceProviderConfig) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_AddResourceProviderConfig) + if !ok { + that2, ok := that.(Call_AddResourceProviderConfig) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Info.Equal(&that1.Info) { + return false + } + return true +} +func (this *Call_UpdateResourceProviderConfig) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_UpdateResourceProviderConfig) + if !ok { + that2, ok := that.(Call_UpdateResourceProviderConfig) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_UpdateResourceProviderConfig") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_UpdateResourceProviderConfig but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_UpdateResourceProviderConfig but is not nil && this == nil") + } + if !this.Info.Equal(&that1.Info) { + return fmt.Errorf("Info this(%v) Not Equal that(%v)", this.Info, that1.Info) + } + return nil +} +func (this *Call_UpdateResourceProviderConfig) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_UpdateResourceProviderConfig) + if !ok { + that2, ok := that.(Call_UpdateResourceProviderConfig) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Info.Equal(&that1.Info) { + return false + } + return true +} +func (this *Call_RemoveResourceProviderConfig) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_RemoveResourceProviderConfig) + if !ok { + that2, ok := that.(Call_RemoveResourceProviderConfig) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_RemoveResourceProviderConfig") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_RemoveResourceProviderConfig but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_RemoveResourceProviderConfig but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + return nil +} +func (this *Call_RemoveResourceProviderConfig) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_RemoveResourceProviderConfig) + if !ok { + that2, ok := that.(Call_RemoveResourceProviderConfig) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if this.Name != that1.Name { + return false + } + return true +} +func (this *Call_PruneImages) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Call_PruneImages) + if !ok { + that2, ok := that.(Call_PruneImages) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Call_PruneImages") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Call_PruneImages but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Call_PruneImages but is not nil && this == nil") + } + if len(this.ExcludedImages) != len(that1.ExcludedImages) { + return fmt.Errorf("ExcludedImages this(%v) Not Equal that(%v)", len(this.ExcludedImages), len(that1.ExcludedImages)) + } + for i := range this.ExcludedImages { + if !this.ExcludedImages[i].Equal(&that1.ExcludedImages[i]) { + return fmt.Errorf("ExcludedImages this[%v](%v) Not Equal that[%v](%v)", i, this.ExcludedImages[i], i, that1.ExcludedImages[i]) + } + } + return nil +} +func (this *Call_PruneImages) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Call_PruneImages) + if !ok { + that2, ok := that.(Call_PruneImages) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.ExcludedImages) != len(that1.ExcludedImages) { + return false + } + for i := range this.ExcludedImages { + if !this.ExcludedImages[i].Equal(&that1.ExcludedImages[i]) { + return false + } + } + return true +} +func (this *Response) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response) + if !ok { + that2, ok := that.(Response) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.GetHealth.Equal(that1.GetHealth) { + return fmt.Errorf("GetHealth this(%v) Not Equal that(%v)", this.GetHealth, that1.GetHealth) + } + if !this.GetFlags.Equal(that1.GetFlags) { + return fmt.Errorf("GetFlags this(%v) Not Equal that(%v)", this.GetFlags, that1.GetFlags) + } + if !this.GetVersion.Equal(that1.GetVersion) { + return fmt.Errorf("GetVersion this(%v) Not Equal that(%v)", this.GetVersion, that1.GetVersion) + } + if !this.GetMetrics.Equal(that1.GetMetrics) { + return fmt.Errorf("GetMetrics this(%v) Not Equal that(%v)", this.GetMetrics, that1.GetMetrics) + } + if !this.GetLoggingLevel.Equal(that1.GetLoggingLevel) { + return fmt.Errorf("GetLoggingLevel this(%v) Not Equal that(%v)", this.GetLoggingLevel, that1.GetLoggingLevel) + } + if !this.ListFiles.Equal(that1.ListFiles) { + return fmt.Errorf("ListFiles this(%v) Not Equal that(%v)", this.ListFiles, that1.ListFiles) + } + if !this.ReadFile.Equal(that1.ReadFile) { + return fmt.Errorf("ReadFile this(%v) Not Equal that(%v)", this.ReadFile, that1.ReadFile) + } + if !this.GetState.Equal(that1.GetState) { + return fmt.Errorf("GetState this(%v) Not Equal that(%v)", this.GetState, that1.GetState) + } + if !this.GetContainers.Equal(that1.GetContainers) { + return fmt.Errorf("GetContainers this(%v) Not Equal that(%v)", this.GetContainers, that1.GetContainers) + } + if !this.GetFrameworks.Equal(that1.GetFrameworks) { + return fmt.Errorf("GetFrameworks this(%v) Not Equal that(%v)", this.GetFrameworks, that1.GetFrameworks) + } + if !this.GetExecutors.Equal(that1.GetExecutors) { + return fmt.Errorf("GetExecutors this(%v) Not Equal that(%v)", this.GetExecutors, that1.GetExecutors) + } + if !this.GetOperations.Equal(that1.GetOperations) { + return fmt.Errorf("GetOperations this(%v) Not Equal that(%v)", this.GetOperations, that1.GetOperations) + } + if !this.GetTasks.Equal(that1.GetTasks) { + return fmt.Errorf("GetTasks this(%v) Not Equal that(%v)", this.GetTasks, that1.GetTasks) + } + if !this.GetAgent.Equal(that1.GetAgent) { + return fmt.Errorf("GetAgent this(%v) Not Equal that(%v)", this.GetAgent, that1.GetAgent) + } + if !this.GetResourceProviders.Equal(that1.GetResourceProviders) { + return fmt.Errorf("GetResourceProviders this(%v) Not Equal that(%v)", this.GetResourceProviders, that1.GetResourceProviders) + } + if !this.WaitNestedContainer.Equal(that1.WaitNestedContainer) { + return fmt.Errorf("WaitNestedContainer this(%v) Not Equal that(%v)", this.WaitNestedContainer, that1.WaitNestedContainer) + } + if !this.WaitContainer.Equal(that1.WaitContainer) { + return fmt.Errorf("WaitContainer this(%v) Not Equal that(%v)", this.WaitContainer, that1.WaitContainer) + } + return nil +} +func (this *Response) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response) + if !ok { + that2, ok := that.(Response) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.GetHealth.Equal(that1.GetHealth) { + return false + } + if !this.GetFlags.Equal(that1.GetFlags) { + return false + } + if !this.GetVersion.Equal(that1.GetVersion) { + return false + } + if !this.GetMetrics.Equal(that1.GetMetrics) { + return false + } + if !this.GetLoggingLevel.Equal(that1.GetLoggingLevel) { + return false + } + if !this.ListFiles.Equal(that1.ListFiles) { + return false + } + if !this.ReadFile.Equal(that1.ReadFile) { + return false + } + if !this.GetState.Equal(that1.GetState) { + return false + } + if !this.GetContainers.Equal(that1.GetContainers) { + return false + } + if !this.GetFrameworks.Equal(that1.GetFrameworks) { + return false + } + if !this.GetExecutors.Equal(that1.GetExecutors) { + return false + } + if !this.GetOperations.Equal(that1.GetOperations) { + return false + } + if !this.GetTasks.Equal(that1.GetTasks) { + return false + } + if !this.GetAgent.Equal(that1.GetAgent) { + return false + } + if !this.GetResourceProviders.Equal(that1.GetResourceProviders) { + return false + } + if !this.WaitNestedContainer.Equal(that1.WaitNestedContainer) { + return false + } + if !this.WaitContainer.Equal(that1.WaitContainer) { + return false + } + return true +} +func (this *Response_GetHealth) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetHealth) + if !ok { + that2, ok := that.(Response_GetHealth) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetHealth") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetHealth but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetHealth but is not nil && this == nil") + } + if this.Healthy != that1.Healthy { + return fmt.Errorf("Healthy this(%v) Not Equal that(%v)", this.Healthy, that1.Healthy) + } + return nil +} +func (this *Response_GetHealth) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetHealth) + if !ok { + that2, ok := that.(Response_GetHealth) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Healthy != that1.Healthy { + return false + } + return true +} +func (this *Response_GetFlags) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetFlags) + if !ok { + that2, ok := that.(Response_GetFlags) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetFlags") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetFlags but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetFlags but is not nil && this == nil") + } + if len(this.Flags) != len(that1.Flags) { + return fmt.Errorf("Flags this(%v) Not Equal that(%v)", len(this.Flags), len(that1.Flags)) + } + for i := range this.Flags { + if !this.Flags[i].Equal(&that1.Flags[i]) { + return fmt.Errorf("Flags this[%v](%v) Not Equal that[%v](%v)", i, this.Flags[i], i, that1.Flags[i]) + } + } + return nil +} +func (this *Response_GetFlags) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetFlags) + if !ok { + that2, ok := that.(Response_GetFlags) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Flags) != len(that1.Flags) { + return false + } + for i := range this.Flags { + if !this.Flags[i].Equal(&that1.Flags[i]) { + return false + } + } + return true +} +func (this *Response_GetVersion) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetVersion) + if !ok { + that2, ok := that.(Response_GetVersion) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetVersion") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetVersion but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetVersion but is not nil && this == nil") + } + if !this.VersionInfo.Equal(&that1.VersionInfo) { + return fmt.Errorf("VersionInfo this(%v) Not Equal that(%v)", this.VersionInfo, that1.VersionInfo) + } + return nil +} +func (this *Response_GetVersion) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetVersion) + if !ok { + that2, ok := that.(Response_GetVersion) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.VersionInfo.Equal(&that1.VersionInfo) { + return false + } + return true +} +func (this *Response_GetMetrics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetMetrics) + if !ok { + that2, ok := that.(Response_GetMetrics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetMetrics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetMetrics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetMetrics but is not nil && this == nil") + } + if len(this.Metrics) != len(that1.Metrics) { + return fmt.Errorf("Metrics this(%v) Not Equal that(%v)", len(this.Metrics), len(that1.Metrics)) + } + for i := range this.Metrics { + if !this.Metrics[i].Equal(&that1.Metrics[i]) { + return fmt.Errorf("Metrics this[%v](%v) Not Equal that[%v](%v)", i, this.Metrics[i], i, that1.Metrics[i]) + } + } + return nil +} +func (this *Response_GetMetrics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetMetrics) + if !ok { + that2, ok := that.(Response_GetMetrics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Metrics) != len(that1.Metrics) { + return false + } + for i := range this.Metrics { + if !this.Metrics[i].Equal(&that1.Metrics[i]) { + return false + } + } + return true +} +func (this *Response_GetLoggingLevel) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetLoggingLevel) + if !ok { + that2, ok := that.(Response_GetLoggingLevel) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetLoggingLevel") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetLoggingLevel but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetLoggingLevel but is not nil && this == nil") + } + if this.Level != that1.Level { + return fmt.Errorf("Level this(%v) Not Equal that(%v)", this.Level, that1.Level) + } + return nil +} +func (this *Response_GetLoggingLevel) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetLoggingLevel) + if !ok { + that2, ok := that.(Response_GetLoggingLevel) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Level != that1.Level { + return false + } + return true +} +func (this *Response_ListFiles) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_ListFiles) + if !ok { + that2, ok := that.(Response_ListFiles) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_ListFiles") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_ListFiles but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_ListFiles but is not nil && this == nil") + } + if len(this.FileInfos) != len(that1.FileInfos) { + return fmt.Errorf("FileInfos this(%v) Not Equal that(%v)", len(this.FileInfos), len(that1.FileInfos)) + } + for i := range this.FileInfos { + if !this.FileInfos[i].Equal(&that1.FileInfos[i]) { + return fmt.Errorf("FileInfos this[%v](%v) Not Equal that[%v](%v)", i, this.FileInfos[i], i, that1.FileInfos[i]) + } + } + return nil +} +func (this *Response_ListFiles) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_ListFiles) + if !ok { + that2, ok := that.(Response_ListFiles) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.FileInfos) != len(that1.FileInfos) { + return false + } + for i := range this.FileInfos { + if !this.FileInfos[i].Equal(&that1.FileInfos[i]) { + return false + } + } + return true +} +func (this *Response_ReadFile) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_ReadFile) + if !ok { + that2, ok := that.(Response_ReadFile) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_ReadFile") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_ReadFile but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_ReadFile but is not nil && this == nil") + } + if this.Size != that1.Size { + return fmt.Errorf("Size this(%v) Not Equal that(%v)", this.Size, that1.Size) + } + if !bytes.Equal(this.Data, that1.Data) { + return fmt.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data) + } + return nil +} +func (this *Response_ReadFile) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_ReadFile) + if !ok { + that2, ok := that.(Response_ReadFile) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Size != that1.Size { + return false + } + if !bytes.Equal(this.Data, that1.Data) { + return false + } + return true +} +func (this *Response_GetState) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetState) + if !ok { + that2, ok := that.(Response_GetState) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetState") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetState but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetState but is not nil && this == nil") + } + if !this.GetTasks.Equal(that1.GetTasks) { + return fmt.Errorf("GetTasks this(%v) Not Equal that(%v)", this.GetTasks, that1.GetTasks) + } + if !this.GetExecutors.Equal(that1.GetExecutors) { + return fmt.Errorf("GetExecutors this(%v) Not Equal that(%v)", this.GetExecutors, that1.GetExecutors) + } + if !this.GetFrameworks.Equal(that1.GetFrameworks) { + return fmt.Errorf("GetFrameworks this(%v) Not Equal that(%v)", this.GetFrameworks, that1.GetFrameworks) + } + return nil +} +func (this *Response_GetState) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetState) + if !ok { + that2, ok := that.(Response_GetState) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.GetTasks.Equal(that1.GetTasks) { + return false + } + if !this.GetExecutors.Equal(that1.GetExecutors) { + return false + } + if !this.GetFrameworks.Equal(that1.GetFrameworks) { + return false + } + return true +} +func (this *Response_GetContainers) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetContainers) + if !ok { + that2, ok := that.(Response_GetContainers) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetContainers") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetContainers but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetContainers but is not nil && this == nil") + } + if len(this.Containers) != len(that1.Containers) { + return fmt.Errorf("Containers this(%v) Not Equal that(%v)", len(this.Containers), len(that1.Containers)) + } + for i := range this.Containers { + if !this.Containers[i].Equal(&that1.Containers[i]) { + return fmt.Errorf("Containers this[%v](%v) Not Equal that[%v](%v)", i, this.Containers[i], i, that1.Containers[i]) + } + } + return nil +} +func (this *Response_GetContainers) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetContainers) + if !ok { + that2, ok := that.(Response_GetContainers) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Containers) != len(that1.Containers) { + return false + } + for i := range this.Containers { + if !this.Containers[i].Equal(&that1.Containers[i]) { + return false + } + } + return true +} +func (this *Response_GetContainers_Container) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetContainers_Container) + if !ok { + that2, ok := that.(Response_GetContainers_Container) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetContainers_Container") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetContainers_Container but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetContainers_Container but is not nil && this == nil") + } + if !this.FrameworkID.Equal(that1.FrameworkID) { + return fmt.Errorf("FrameworkID this(%v) Not Equal that(%v)", this.FrameworkID, that1.FrameworkID) + } + if !this.ExecutorID.Equal(that1.ExecutorID) { + return fmt.Errorf("ExecutorID this(%v) Not Equal that(%v)", this.ExecutorID, that1.ExecutorID) + } + if this.ExecutorName != nil && that1.ExecutorName != nil { + if *this.ExecutorName != *that1.ExecutorName { + return fmt.Errorf("ExecutorName this(%v) Not Equal that(%v)", *this.ExecutorName, *that1.ExecutorName) + } + } else if this.ExecutorName != nil { + return fmt.Errorf("this.ExecutorName == nil && that.ExecutorName != nil") + } else if that1.ExecutorName != nil { + return fmt.Errorf("ExecutorName this(%v) Not Equal that(%v)", this.ExecutorName, that1.ExecutorName) + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if !this.ContainerStatus.Equal(that1.ContainerStatus) { + return fmt.Errorf("ContainerStatus this(%v) Not Equal that(%v)", this.ContainerStatus, that1.ContainerStatus) + } + if !this.ResourceStatistics.Equal(that1.ResourceStatistics) { + return fmt.Errorf("ResourceStatistics this(%v) Not Equal that(%v)", this.ResourceStatistics, that1.ResourceStatistics) + } + return nil +} +func (this *Response_GetContainers_Container) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetContainers_Container) + if !ok { + that2, ok := that.(Response_GetContainers_Container) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.FrameworkID.Equal(that1.FrameworkID) { + return false + } + if !this.ExecutorID.Equal(that1.ExecutorID) { + return false + } + if this.ExecutorName != nil && that1.ExecutorName != nil { + if *this.ExecutorName != *that1.ExecutorName { + return false + } + } else if this.ExecutorName != nil { + return false + } else if that1.ExecutorName != nil { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + if !this.ContainerStatus.Equal(that1.ContainerStatus) { + return false + } + if !this.ResourceStatistics.Equal(that1.ResourceStatistics) { + return false + } + return true +} +func (this *Response_GetFrameworks) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetFrameworks) + if !ok { + that2, ok := that.(Response_GetFrameworks) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetFrameworks") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetFrameworks but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetFrameworks but is not nil && this == nil") + } + if len(this.Frameworks) != len(that1.Frameworks) { + return fmt.Errorf("Frameworks this(%v) Not Equal that(%v)", len(this.Frameworks), len(that1.Frameworks)) + } + for i := range this.Frameworks { + if !this.Frameworks[i].Equal(&that1.Frameworks[i]) { + return fmt.Errorf("Frameworks this[%v](%v) Not Equal that[%v](%v)", i, this.Frameworks[i], i, that1.Frameworks[i]) + } + } + if len(this.CompletedFrameworks) != len(that1.CompletedFrameworks) { + return fmt.Errorf("CompletedFrameworks this(%v) Not Equal that(%v)", len(this.CompletedFrameworks), len(that1.CompletedFrameworks)) + } + for i := range this.CompletedFrameworks { + if !this.CompletedFrameworks[i].Equal(&that1.CompletedFrameworks[i]) { + return fmt.Errorf("CompletedFrameworks this[%v](%v) Not Equal that[%v](%v)", i, this.CompletedFrameworks[i], i, that1.CompletedFrameworks[i]) + } + } + return nil +} +func (this *Response_GetFrameworks) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetFrameworks) + if !ok { + that2, ok := that.(Response_GetFrameworks) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Frameworks) != len(that1.Frameworks) { + return false + } + for i := range this.Frameworks { + if !this.Frameworks[i].Equal(&that1.Frameworks[i]) { + return false + } + } + if len(this.CompletedFrameworks) != len(that1.CompletedFrameworks) { + return false + } + for i := range this.CompletedFrameworks { + if !this.CompletedFrameworks[i].Equal(&that1.CompletedFrameworks[i]) { + return false + } + } + return true +} +func (this *Response_GetFrameworks_Framework) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetFrameworks_Framework) + if !ok { + that2, ok := that.(Response_GetFrameworks_Framework) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetFrameworks_Framework") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetFrameworks_Framework but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetFrameworks_Framework but is not nil && this == nil") + } + if !this.FrameworkInfo.Equal(&that1.FrameworkInfo) { + return fmt.Errorf("FrameworkInfo this(%v) Not Equal that(%v)", this.FrameworkInfo, that1.FrameworkInfo) + } + return nil +} +func (this *Response_GetFrameworks_Framework) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetFrameworks_Framework) + if !ok { + that2, ok := that.(Response_GetFrameworks_Framework) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.FrameworkInfo.Equal(&that1.FrameworkInfo) { + return false + } + return true +} +func (this *Response_GetExecutors) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetExecutors) + if !ok { + that2, ok := that.(Response_GetExecutors) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetExecutors") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetExecutors but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetExecutors but is not nil && this == nil") + } + if len(this.Executors) != len(that1.Executors) { + return fmt.Errorf("Executors this(%v) Not Equal that(%v)", len(this.Executors), len(that1.Executors)) + } + for i := range this.Executors { + if !this.Executors[i].Equal(&that1.Executors[i]) { + return fmt.Errorf("Executors this[%v](%v) Not Equal that[%v](%v)", i, this.Executors[i], i, that1.Executors[i]) + } + } + if len(this.CompletedExecutors) != len(that1.CompletedExecutors) { + return fmt.Errorf("CompletedExecutors this(%v) Not Equal that(%v)", len(this.CompletedExecutors), len(that1.CompletedExecutors)) + } + for i := range this.CompletedExecutors { + if !this.CompletedExecutors[i].Equal(&that1.CompletedExecutors[i]) { + return fmt.Errorf("CompletedExecutors this[%v](%v) Not Equal that[%v](%v)", i, this.CompletedExecutors[i], i, that1.CompletedExecutors[i]) + } + } + return nil +} +func (this *Response_GetExecutors) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetExecutors) + if !ok { + that2, ok := that.(Response_GetExecutors) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Executors) != len(that1.Executors) { + return false + } + for i := range this.Executors { + if !this.Executors[i].Equal(&that1.Executors[i]) { + return false + } + } + if len(this.CompletedExecutors) != len(that1.CompletedExecutors) { + return false + } + for i := range this.CompletedExecutors { + if !this.CompletedExecutors[i].Equal(&that1.CompletedExecutors[i]) { + return false + } + } + return true +} +func (this *Response_GetExecutors_Executor) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetExecutors_Executor) + if !ok { + that2, ok := that.(Response_GetExecutors_Executor) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetExecutors_Executor") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetExecutors_Executor but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetExecutors_Executor but is not nil && this == nil") + } + if !this.ExecutorInfo.Equal(&that1.ExecutorInfo) { + return fmt.Errorf("ExecutorInfo this(%v) Not Equal that(%v)", this.ExecutorInfo, that1.ExecutorInfo) + } + return nil +} +func (this *Response_GetExecutors_Executor) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetExecutors_Executor) + if !ok { + that2, ok := that.(Response_GetExecutors_Executor) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ExecutorInfo.Equal(&that1.ExecutorInfo) { + return false + } + return true +} +func (this *Response_GetOperations) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetOperations) + if !ok { + that2, ok := that.(Response_GetOperations) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetOperations") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetOperations but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetOperations but is not nil && this == nil") + } + if len(this.Operations) != len(that1.Operations) { + return fmt.Errorf("Operations this(%v) Not Equal that(%v)", len(this.Operations), len(that1.Operations)) + } + for i := range this.Operations { + if !this.Operations[i].Equal(&that1.Operations[i]) { + return fmt.Errorf("Operations this[%v](%v) Not Equal that[%v](%v)", i, this.Operations[i], i, that1.Operations[i]) + } + } + return nil +} +func (this *Response_GetOperations) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetOperations) + if !ok { + that2, ok := that.(Response_GetOperations) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Operations) != len(that1.Operations) { + return false + } + for i := range this.Operations { + if !this.Operations[i].Equal(&that1.Operations[i]) { + return false + } + } + return true +} +func (this *Response_GetTasks) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetTasks) + if !ok { + that2, ok := that.(Response_GetTasks) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetTasks") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetTasks but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetTasks but is not nil && this == nil") + } + if len(this.PendingTasks) != len(that1.PendingTasks) { + return fmt.Errorf("PendingTasks this(%v) Not Equal that(%v)", len(this.PendingTasks), len(that1.PendingTasks)) + } + for i := range this.PendingTasks { + if !this.PendingTasks[i].Equal(&that1.PendingTasks[i]) { + return fmt.Errorf("PendingTasks this[%v](%v) Not Equal that[%v](%v)", i, this.PendingTasks[i], i, that1.PendingTasks[i]) + } + } + if len(this.QueuedTasks) != len(that1.QueuedTasks) { + return fmt.Errorf("QueuedTasks this(%v) Not Equal that(%v)", len(this.QueuedTasks), len(that1.QueuedTasks)) + } + for i := range this.QueuedTasks { + if !this.QueuedTasks[i].Equal(&that1.QueuedTasks[i]) { + return fmt.Errorf("QueuedTasks this[%v](%v) Not Equal that[%v](%v)", i, this.QueuedTasks[i], i, that1.QueuedTasks[i]) + } + } + if len(this.LaunchedTasks) != len(that1.LaunchedTasks) { + return fmt.Errorf("LaunchedTasks this(%v) Not Equal that(%v)", len(this.LaunchedTasks), len(that1.LaunchedTasks)) + } + for i := range this.LaunchedTasks { + if !this.LaunchedTasks[i].Equal(&that1.LaunchedTasks[i]) { + return fmt.Errorf("LaunchedTasks this[%v](%v) Not Equal that[%v](%v)", i, this.LaunchedTasks[i], i, that1.LaunchedTasks[i]) + } + } + if len(this.TerminatedTasks) != len(that1.TerminatedTasks) { + return fmt.Errorf("TerminatedTasks this(%v) Not Equal that(%v)", len(this.TerminatedTasks), len(that1.TerminatedTasks)) + } + for i := range this.TerminatedTasks { + if !this.TerminatedTasks[i].Equal(&that1.TerminatedTasks[i]) { + return fmt.Errorf("TerminatedTasks this[%v](%v) Not Equal that[%v](%v)", i, this.TerminatedTasks[i], i, that1.TerminatedTasks[i]) + } + } + if len(this.CompletedTasks) != len(that1.CompletedTasks) { + return fmt.Errorf("CompletedTasks this(%v) Not Equal that(%v)", len(this.CompletedTasks), len(that1.CompletedTasks)) + } + for i := range this.CompletedTasks { + if !this.CompletedTasks[i].Equal(&that1.CompletedTasks[i]) { + return fmt.Errorf("CompletedTasks this[%v](%v) Not Equal that[%v](%v)", i, this.CompletedTasks[i], i, that1.CompletedTasks[i]) + } + } + return nil +} +func (this *Response_GetTasks) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetTasks) + if !ok { + that2, ok := that.(Response_GetTasks) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.PendingTasks) != len(that1.PendingTasks) { + return false + } + for i := range this.PendingTasks { + if !this.PendingTasks[i].Equal(&that1.PendingTasks[i]) { + return false + } + } + if len(this.QueuedTasks) != len(that1.QueuedTasks) { + return false + } + for i := range this.QueuedTasks { + if !this.QueuedTasks[i].Equal(&that1.QueuedTasks[i]) { + return false + } + } + if len(this.LaunchedTasks) != len(that1.LaunchedTasks) { + return false + } + for i := range this.LaunchedTasks { + if !this.LaunchedTasks[i].Equal(&that1.LaunchedTasks[i]) { + return false + } + } + if len(this.TerminatedTasks) != len(that1.TerminatedTasks) { + return false + } + for i := range this.TerminatedTasks { + if !this.TerminatedTasks[i].Equal(&that1.TerminatedTasks[i]) { + return false + } + } + if len(this.CompletedTasks) != len(that1.CompletedTasks) { + return false + } + for i := range this.CompletedTasks { + if !this.CompletedTasks[i].Equal(&that1.CompletedTasks[i]) { + return false + } + } + return true +} +func (this *Response_GetAgent) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetAgent) + if !ok { + that2, ok := that.(Response_GetAgent) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetAgent") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetAgent but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetAgent but is not nil && this == nil") + } + if !this.AgentInfo.Equal(that1.AgentInfo) { + return fmt.Errorf("AgentInfo this(%v) Not Equal that(%v)", this.AgentInfo, that1.AgentInfo) + } + return nil +} +func (this *Response_GetAgent) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetAgent) + if !ok { + that2, ok := that.(Response_GetAgent) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.AgentInfo.Equal(that1.AgentInfo) { + return false + } + return true +} +func (this *Response_GetResourceProviders) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetResourceProviders) + if !ok { + that2, ok := that.(Response_GetResourceProviders) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetResourceProviders") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetResourceProviders but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetResourceProviders but is not nil && this == nil") + } + if len(this.ResourceProviders) != len(that1.ResourceProviders) { + return fmt.Errorf("ResourceProviders this(%v) Not Equal that(%v)", len(this.ResourceProviders), len(that1.ResourceProviders)) + } + for i := range this.ResourceProviders { + if !this.ResourceProviders[i].Equal(&that1.ResourceProviders[i]) { + return fmt.Errorf("ResourceProviders this[%v](%v) Not Equal that[%v](%v)", i, this.ResourceProviders[i], i, that1.ResourceProviders[i]) + } + } + return nil +} +func (this *Response_GetResourceProviders) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetResourceProviders) + if !ok { + that2, ok := that.(Response_GetResourceProviders) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.ResourceProviders) != len(that1.ResourceProviders) { + return false + } + for i := range this.ResourceProviders { + if !this.ResourceProviders[i].Equal(&that1.ResourceProviders[i]) { + return false + } + } + return true +} +func (this *Response_GetResourceProviders_ResourceProvider) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_GetResourceProviders_ResourceProvider) + if !ok { + that2, ok := that.(Response_GetResourceProviders_ResourceProvider) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_GetResourceProviders_ResourceProvider") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_GetResourceProviders_ResourceProvider but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_GetResourceProviders_ResourceProvider but is not nil && this == nil") + } + if !this.ResourceProviderInfo.Equal(&that1.ResourceProviderInfo) { + return fmt.Errorf("ResourceProviderInfo this(%v) Not Equal that(%v)", this.ResourceProviderInfo, that1.ResourceProviderInfo) + } + if len(this.TotalResources) != len(that1.TotalResources) { + return fmt.Errorf("TotalResources this(%v) Not Equal that(%v)", len(this.TotalResources), len(that1.TotalResources)) + } + for i := range this.TotalResources { + if !this.TotalResources[i].Equal(&that1.TotalResources[i]) { + return fmt.Errorf("TotalResources this[%v](%v) Not Equal that[%v](%v)", i, this.TotalResources[i], i, that1.TotalResources[i]) + } + } + return nil +} +func (this *Response_GetResourceProviders_ResourceProvider) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_GetResourceProviders_ResourceProvider) + if !ok { + that2, ok := that.(Response_GetResourceProviders_ResourceProvider) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ResourceProviderInfo.Equal(&that1.ResourceProviderInfo) { + return false + } + if len(this.TotalResources) != len(that1.TotalResources) { + return false + } + for i := range this.TotalResources { + if !this.TotalResources[i].Equal(&that1.TotalResources[i]) { + return false + } + } + return true +} +func (this *Response_WaitNestedContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_WaitNestedContainer) + if !ok { + that2, ok := that.(Response_WaitNestedContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_WaitNestedContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_WaitNestedContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_WaitNestedContainer but is not nil && this == nil") + } + if this.ExitStatus != nil && that1.ExitStatus != nil { + if *this.ExitStatus != *that1.ExitStatus { + return fmt.Errorf("ExitStatus this(%v) Not Equal that(%v)", *this.ExitStatus, *that1.ExitStatus) + } + } else if this.ExitStatus != nil { + return fmt.Errorf("this.ExitStatus == nil && that.ExitStatus != nil") + } else if that1.ExitStatus != nil { + return fmt.Errorf("ExitStatus this(%v) Not Equal that(%v)", this.ExitStatus, that1.ExitStatus) + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return fmt.Errorf("State this(%v) Not Equal that(%v)", *this.State, *that1.State) + } + } else if this.State != nil { + return fmt.Errorf("this.State == nil && that.State != nil") + } else if that1.State != nil { + return fmt.Errorf("State this(%v) Not Equal that(%v)", this.State, that1.State) + } + if this.Reason != nil && that1.Reason != nil { + if *this.Reason != *that1.Reason { + return fmt.Errorf("Reason this(%v) Not Equal that(%v)", *this.Reason, *that1.Reason) + } + } else if this.Reason != nil { + return fmt.Errorf("this.Reason == nil && that.Reason != nil") + } else if that1.Reason != nil { + return fmt.Errorf("Reason this(%v) Not Equal that(%v)", this.Reason, that1.Reason) + } + if !this.Limitation.Equal(that1.Limitation) { + return fmt.Errorf("Limitation this(%v) Not Equal that(%v)", this.Limitation, that1.Limitation) + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", *this.Message, *that1.Message) + } + } else if this.Message != nil { + return fmt.Errorf("this.Message == nil && that.Message != nil") + } else if that1.Message != nil { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", this.Message, that1.Message) + } + return nil +} +func (this *Response_WaitNestedContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_WaitNestedContainer) + if !ok { + that2, ok := that.(Response_WaitNestedContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ExitStatus != nil && that1.ExitStatus != nil { + if *this.ExitStatus != *that1.ExitStatus { + return false + } + } else if this.ExitStatus != nil { + return false + } else if that1.ExitStatus != nil { + return false + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return false + } + } else if this.State != nil { + return false + } else if that1.State != nil { + return false + } + if this.Reason != nil && that1.Reason != nil { + if *this.Reason != *that1.Reason { + return false + } + } else if this.Reason != nil { + return false + } else if that1.Reason != nil { + return false + } + if !this.Limitation.Equal(that1.Limitation) { + return false + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return false + } + } else if this.Message != nil { + return false + } else if that1.Message != nil { + return false + } + return true +} +func (this *Response_WaitContainer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Response_WaitContainer) + if !ok { + that2, ok := that.(Response_WaitContainer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Response_WaitContainer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Response_WaitContainer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Response_WaitContainer but is not nil && this == nil") + } + if this.ExitStatus != nil && that1.ExitStatus != nil { + if *this.ExitStatus != *that1.ExitStatus { + return fmt.Errorf("ExitStatus this(%v) Not Equal that(%v)", *this.ExitStatus, *that1.ExitStatus) + } + } else if this.ExitStatus != nil { + return fmt.Errorf("this.ExitStatus == nil && that.ExitStatus != nil") + } else if that1.ExitStatus != nil { + return fmt.Errorf("ExitStatus this(%v) Not Equal that(%v)", this.ExitStatus, that1.ExitStatus) + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return fmt.Errorf("State this(%v) Not Equal that(%v)", *this.State, *that1.State) + } + } else if this.State != nil { + return fmt.Errorf("this.State == nil && that.State != nil") + } else if that1.State != nil { + return fmt.Errorf("State this(%v) Not Equal that(%v)", this.State, that1.State) + } + if this.Reason != nil && that1.Reason != nil { + if *this.Reason != *that1.Reason { + return fmt.Errorf("Reason this(%v) Not Equal that(%v)", *this.Reason, *that1.Reason) + } + } else if this.Reason != nil { + return fmt.Errorf("this.Reason == nil && that.Reason != nil") + } else if that1.Reason != nil { + return fmt.Errorf("Reason this(%v) Not Equal that(%v)", this.Reason, that1.Reason) + } + if !this.Limitation.Equal(that1.Limitation) { + return fmt.Errorf("Limitation this(%v) Not Equal that(%v)", this.Limitation, that1.Limitation) + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", *this.Message, *that1.Message) + } + } else if this.Message != nil { + return fmt.Errorf("this.Message == nil && that.Message != nil") + } else if that1.Message != nil { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", this.Message, that1.Message) + } + return nil +} +func (this *Response_WaitContainer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Response_WaitContainer) + if !ok { + that2, ok := that.(Response_WaitContainer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ExitStatus != nil && that1.ExitStatus != nil { + if *this.ExitStatus != *that1.ExitStatus { + return false + } + } else if this.ExitStatus != nil { + return false + } else if that1.ExitStatus != nil { + return false + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return false + } + } else if this.State != nil { + return false + } else if that1.State != nil { + return false + } + if this.Reason != nil && that1.Reason != nil { + if *this.Reason != *that1.Reason { + return false + } + } else if this.Reason != nil { + return false + } else if that1.Reason != nil { + return false + } + if !this.Limitation.Equal(that1.Limitation) { + return false + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return false + } + } else if this.Message != nil { + return false + } else if that1.Message != nil { + return false + } + return true +} +func (this *ProcessIO) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ProcessIO) + if !ok { + that2, ok := that.(ProcessIO) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ProcessIO") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ProcessIO but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ProcessIO but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Data.Equal(that1.Data) { + return fmt.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data) + } + if !this.Control.Equal(that1.Control) { + return fmt.Errorf("Control this(%v) Not Equal that(%v)", this.Control, that1.Control) + } + return nil +} +func (this *ProcessIO) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ProcessIO) + if !ok { + that2, ok := that.(ProcessIO) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.Data.Equal(that1.Data) { + return false + } + if !this.Control.Equal(that1.Control) { + return false + } + return true +} +func (this *ProcessIO_Data) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ProcessIO_Data) + if !ok { + that2, ok := that.(ProcessIO_Data) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ProcessIO_Data") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ProcessIO_Data but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ProcessIO_Data but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !bytes.Equal(this.Data, that1.Data) { + return fmt.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data) + } + return nil +} +func (this *ProcessIO_Data) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ProcessIO_Data) + if !ok { + that2, ok := that.(ProcessIO_Data) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !bytes.Equal(this.Data, that1.Data) { + return false + } + return true +} +func (this *ProcessIO_Control) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ProcessIO_Control) + if !ok { + that2, ok := that.(ProcessIO_Control) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ProcessIO_Control") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ProcessIO_Control but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ProcessIO_Control but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.TTYInfo.Equal(that1.TTYInfo) { + return fmt.Errorf("TTYInfo this(%v) Not Equal that(%v)", this.TTYInfo, that1.TTYInfo) + } + if !this.Heartbeat.Equal(that1.Heartbeat) { + return fmt.Errorf("Heartbeat this(%v) Not Equal that(%v)", this.Heartbeat, that1.Heartbeat) + } + return nil +} +func (this *ProcessIO_Control) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ProcessIO_Control) + if !ok { + that2, ok := that.(ProcessIO_Control) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.TTYInfo.Equal(that1.TTYInfo) { + return false + } + if !this.Heartbeat.Equal(that1.Heartbeat) { + return false + } + return true +} +func (this *ProcessIO_Control_Heartbeat) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ProcessIO_Control_Heartbeat) + if !ok { + that2, ok := that.(ProcessIO_Control_Heartbeat) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ProcessIO_Control_Heartbeat") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ProcessIO_Control_Heartbeat but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ProcessIO_Control_Heartbeat but is not nil && this == nil") + } + if !this.Interval.Equal(that1.Interval) { + return fmt.Errorf("Interval this(%v) Not Equal that(%v)", this.Interval, that1.Interval) + } + return nil +} +func (this *ProcessIO_Control_Heartbeat) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ProcessIO_Control_Heartbeat) + if !ok { + that2, ok := that.(ProcessIO_Control_Heartbeat) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Interval.Equal(that1.Interval) { + return false + } + return true +} +func (this *Call) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 25) + s = append(s, "&agent.Call{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.GetMetrics != nil { + s = append(s, "GetMetrics: "+fmt.Sprintf("%#v", this.GetMetrics)+",\n") + } + if this.SetLoggingLevel != nil { + s = append(s, "SetLoggingLevel: "+fmt.Sprintf("%#v", this.SetLoggingLevel)+",\n") + } + if this.ListFiles != nil { + s = append(s, "ListFiles: "+fmt.Sprintf("%#v", this.ListFiles)+",\n") + } + if this.ReadFile != nil { + s = append(s, "ReadFile: "+fmt.Sprintf("%#v", this.ReadFile)+",\n") + } + if this.GetContainers != nil { + s = append(s, "GetContainers: "+fmt.Sprintf("%#v", this.GetContainers)+",\n") + } + if this.LaunchNestedContainer != nil { + s = append(s, "LaunchNestedContainer: "+fmt.Sprintf("%#v", this.LaunchNestedContainer)+",\n") + } + if this.WaitNestedContainer != nil { + s = append(s, "WaitNestedContainer: "+fmt.Sprintf("%#v", this.WaitNestedContainer)+",\n") + } + if this.KillNestedContainer != nil { + s = append(s, "KillNestedContainer: "+fmt.Sprintf("%#v", this.KillNestedContainer)+",\n") + } + if this.RemoveNestedContainer != nil { + s = append(s, "RemoveNestedContainer: "+fmt.Sprintf("%#v", this.RemoveNestedContainer)+",\n") + } + if this.LaunchNestedContainerSession != nil { + s = append(s, "LaunchNestedContainerSession: "+fmt.Sprintf("%#v", this.LaunchNestedContainerSession)+",\n") + } + if this.AttachContainerInput != nil { + s = append(s, "AttachContainerInput: "+fmt.Sprintf("%#v", this.AttachContainerInput)+",\n") + } + if this.AttachContainerOutput != nil { + s = append(s, "AttachContainerOutput: "+fmt.Sprintf("%#v", this.AttachContainerOutput)+",\n") + } + if this.LaunchContainer != nil { + s = append(s, "LaunchContainer: "+fmt.Sprintf("%#v", this.LaunchContainer)+",\n") + } + if this.WaitContainer != nil { + s = append(s, "WaitContainer: "+fmt.Sprintf("%#v", this.WaitContainer)+",\n") + } + if this.KillContainer != nil { + s = append(s, "KillContainer: "+fmt.Sprintf("%#v", this.KillContainer)+",\n") + } + if this.RemoveContainer != nil { + s = append(s, "RemoveContainer: "+fmt.Sprintf("%#v", this.RemoveContainer)+",\n") + } + if this.AddResourceProviderConfig != nil { + s = append(s, "AddResourceProviderConfig: "+fmt.Sprintf("%#v", this.AddResourceProviderConfig)+",\n") + } + if this.UpdateResourceProviderConfig != nil { + s = append(s, "UpdateResourceProviderConfig: "+fmt.Sprintf("%#v", this.UpdateResourceProviderConfig)+",\n") + } + if this.RemoveResourceProviderConfig != nil { + s = append(s, "RemoveResourceProviderConfig: "+fmt.Sprintf("%#v", this.RemoveResourceProviderConfig)+",\n") + } + if this.PruneImages != nil { + s = append(s, "PruneImages: "+fmt.Sprintf("%#v", this.PruneImages)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_GetMetrics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_GetMetrics{") + if this.Timeout != nil { + s = append(s, "Timeout: "+fmt.Sprintf("%#v", this.Timeout)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_SetLoggingLevel) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Call_SetLoggingLevel{") + s = append(s, "Level: "+fmt.Sprintf("%#v", this.Level)+",\n") + s = append(s, "Duration: "+strings.Replace(this.Duration.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_ListFiles) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_ListFiles{") + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_ReadFile) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&agent.Call_ReadFile{") + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + s = append(s, "Offset: "+fmt.Sprintf("%#v", this.Offset)+",\n") + if this.Length != nil { + s = append(s, "Length: "+valueToGoStringAgent(this.Length, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_GetContainers) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Call_GetContainers{") + if this.ShowNested != nil { + s = append(s, "ShowNested: "+valueToGoStringAgent(this.ShowNested, "bool")+",\n") + } + if this.ShowStandalone != nil { + s = append(s, "ShowStandalone: "+valueToGoStringAgent(this.ShowStandalone, "bool")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_LaunchNestedContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&agent.Call_LaunchNestedContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.Container != nil { + s = append(s, "Container: "+fmt.Sprintf("%#v", this.Container)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_WaitNestedContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_WaitNestedContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_KillNestedContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Call_KillNestedContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + if this.Signal != nil { + s = append(s, "Signal: "+valueToGoStringAgent(this.Signal, "int32")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_RemoveNestedContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_RemoveNestedContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_LaunchNestedContainerSession) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&agent.Call_LaunchNestedContainerSession{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.Container != nil { + s = append(s, "Container: "+fmt.Sprintf("%#v", this.Container)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_AttachContainerInput) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&agent.Call_AttachContainerInput{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.ContainerID != nil { + s = append(s, "ContainerID: "+fmt.Sprintf("%#v", this.ContainerID)+",\n") + } + if this.ProcessIO != nil { + s = append(s, "ProcessIO: "+fmt.Sprintf("%#v", this.ProcessIO)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_AttachContainerOutput) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_AttachContainerOutput{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_LaunchContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&agent.Call_LaunchContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Container != nil { + s = append(s, "Container: "+fmt.Sprintf("%#v", this.Container)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_WaitContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_WaitContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_KillContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Call_KillContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + if this.Signal != nil { + s = append(s, "Signal: "+valueToGoStringAgent(this.Signal, "int32")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_RemoveContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_RemoveContainer{") + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_AddResourceProviderConfig) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_AddResourceProviderConfig{") + s = append(s, "Info: "+strings.Replace(this.Info.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_UpdateResourceProviderConfig) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_UpdateResourceProviderConfig{") + s = append(s, "Info: "+strings.Replace(this.Info.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_RemoveResourceProviderConfig) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Call_RemoveResourceProviderConfig{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Call_PruneImages) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Call_PruneImages{") + if this.ExcludedImages != nil { + s = append(s, "ExcludedImages: "+fmt.Sprintf("%#v", this.ExcludedImages)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 22) + s = append(s, "&agent.Response{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.GetHealth != nil { + s = append(s, "GetHealth: "+fmt.Sprintf("%#v", this.GetHealth)+",\n") + } + if this.GetFlags != nil { + s = append(s, "GetFlags: "+fmt.Sprintf("%#v", this.GetFlags)+",\n") + } + if this.GetVersion != nil { + s = append(s, "GetVersion: "+fmt.Sprintf("%#v", this.GetVersion)+",\n") + } + if this.GetMetrics != nil { + s = append(s, "GetMetrics: "+fmt.Sprintf("%#v", this.GetMetrics)+",\n") + } + if this.GetLoggingLevel != nil { + s = append(s, "GetLoggingLevel: "+fmt.Sprintf("%#v", this.GetLoggingLevel)+",\n") + } + if this.ListFiles != nil { + s = append(s, "ListFiles: "+fmt.Sprintf("%#v", this.ListFiles)+",\n") + } + if this.ReadFile != nil { + s = append(s, "ReadFile: "+fmt.Sprintf("%#v", this.ReadFile)+",\n") + } + if this.GetState != nil { + s = append(s, "GetState: "+fmt.Sprintf("%#v", this.GetState)+",\n") + } + if this.GetContainers != nil { + s = append(s, "GetContainers: "+fmt.Sprintf("%#v", this.GetContainers)+",\n") + } + if this.GetFrameworks != nil { + s = append(s, "GetFrameworks: "+fmt.Sprintf("%#v", this.GetFrameworks)+",\n") + } + if this.GetExecutors != nil { + s = append(s, "GetExecutors: "+fmt.Sprintf("%#v", this.GetExecutors)+",\n") + } + if this.GetOperations != nil { + s = append(s, "GetOperations: "+fmt.Sprintf("%#v", this.GetOperations)+",\n") + } + if this.GetTasks != nil { + s = append(s, "GetTasks: "+fmt.Sprintf("%#v", this.GetTasks)+",\n") + } + if this.GetAgent != nil { + s = append(s, "GetAgent: "+fmt.Sprintf("%#v", this.GetAgent)+",\n") + } + if this.GetResourceProviders != nil { + s = append(s, "GetResourceProviders: "+fmt.Sprintf("%#v", this.GetResourceProviders)+",\n") + } + if this.WaitNestedContainer != nil { + s = append(s, "WaitNestedContainer: "+fmt.Sprintf("%#v", this.WaitNestedContainer)+",\n") + } + if this.WaitContainer != nil { + s = append(s, "WaitContainer: "+fmt.Sprintf("%#v", this.WaitContainer)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetHealth) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetHealth{") + s = append(s, "Healthy: "+fmt.Sprintf("%#v", this.Healthy)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetFlags) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetFlags{") + if this.Flags != nil { + s = append(s, "Flags: "+fmt.Sprintf("%#v", this.Flags)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetVersion) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetVersion{") + s = append(s, "VersionInfo: "+strings.Replace(this.VersionInfo.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetMetrics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetMetrics{") + if this.Metrics != nil { + s = append(s, "Metrics: "+fmt.Sprintf("%#v", this.Metrics)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetLoggingLevel) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetLoggingLevel{") + s = append(s, "Level: "+fmt.Sprintf("%#v", this.Level)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_ListFiles) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_ListFiles{") + if this.FileInfos != nil { + s = append(s, "FileInfos: "+fmt.Sprintf("%#v", this.FileInfos)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_ReadFile) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Response_ReadFile{") + s = append(s, "Size: "+fmt.Sprintf("%#v", this.Size)+",\n") + if this.Data != nil { + s = append(s, "Data: "+valueToGoStringAgent(this.Data, "byte")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetState) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&agent.Response_GetState{") + if this.GetTasks != nil { + s = append(s, "GetTasks: "+fmt.Sprintf("%#v", this.GetTasks)+",\n") + } + if this.GetExecutors != nil { + s = append(s, "GetExecutors: "+fmt.Sprintf("%#v", this.GetExecutors)+",\n") + } + if this.GetFrameworks != nil { + s = append(s, "GetFrameworks: "+fmt.Sprintf("%#v", this.GetFrameworks)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetContainers) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetContainers{") + if this.Containers != nil { + s = append(s, "Containers: "+fmt.Sprintf("%#v", this.Containers)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetContainers_Container) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&agent.Response_GetContainers_Container{") + if this.FrameworkID != nil { + s = append(s, "FrameworkID: "+fmt.Sprintf("%#v", this.FrameworkID)+",\n") + } + if this.ExecutorID != nil { + s = append(s, "ExecutorID: "+fmt.Sprintf("%#v", this.ExecutorID)+",\n") + } + if this.ExecutorName != nil { + s = append(s, "ExecutorName: "+valueToGoStringAgent(this.ExecutorName, "string")+",\n") + } + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + if this.ContainerStatus != nil { + s = append(s, "ContainerStatus: "+fmt.Sprintf("%#v", this.ContainerStatus)+",\n") + } + if this.ResourceStatistics != nil { + s = append(s, "ResourceStatistics: "+fmt.Sprintf("%#v", this.ResourceStatistics)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetFrameworks) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Response_GetFrameworks{") + if this.Frameworks != nil { + s = append(s, "Frameworks: "+fmt.Sprintf("%#v", this.Frameworks)+",\n") + } + if this.CompletedFrameworks != nil { + s = append(s, "CompletedFrameworks: "+fmt.Sprintf("%#v", this.CompletedFrameworks)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetFrameworks_Framework) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetFrameworks_Framework{") + s = append(s, "FrameworkInfo: "+strings.Replace(this.FrameworkInfo.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetExecutors) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Response_GetExecutors{") + if this.Executors != nil { + s = append(s, "Executors: "+fmt.Sprintf("%#v", this.Executors)+",\n") + } + if this.CompletedExecutors != nil { + s = append(s, "CompletedExecutors: "+fmt.Sprintf("%#v", this.CompletedExecutors)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetExecutors_Executor) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetExecutors_Executor{") + s = append(s, "ExecutorInfo: "+strings.Replace(this.ExecutorInfo.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetOperations) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetOperations{") + if this.Operations != nil { + s = append(s, "Operations: "+fmt.Sprintf("%#v", this.Operations)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetTasks) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&agent.Response_GetTasks{") + if this.PendingTasks != nil { + s = append(s, "PendingTasks: "+fmt.Sprintf("%#v", this.PendingTasks)+",\n") + } + if this.QueuedTasks != nil { + s = append(s, "QueuedTasks: "+fmt.Sprintf("%#v", this.QueuedTasks)+",\n") + } + if this.LaunchedTasks != nil { + s = append(s, "LaunchedTasks: "+fmt.Sprintf("%#v", this.LaunchedTasks)+",\n") + } + if this.TerminatedTasks != nil { + s = append(s, "TerminatedTasks: "+fmt.Sprintf("%#v", this.TerminatedTasks)+",\n") + } + if this.CompletedTasks != nil { + s = append(s, "CompletedTasks: "+fmt.Sprintf("%#v", this.CompletedTasks)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetAgent) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetAgent{") + if this.AgentInfo != nil { + s = append(s, "AgentInfo: "+fmt.Sprintf("%#v", this.AgentInfo)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetResourceProviders) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.Response_GetResourceProviders{") + if this.ResourceProviders != nil { + s = append(s, "ResourceProviders: "+fmt.Sprintf("%#v", this.ResourceProviders)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_GetResourceProviders_ResourceProvider) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.Response_GetResourceProviders_ResourceProvider{") + s = append(s, "ResourceProviderInfo: "+strings.Replace(this.ResourceProviderInfo.GoString(), `&`, ``, 1)+",\n") + if this.TotalResources != nil { + s = append(s, "TotalResources: "+fmt.Sprintf("%#v", this.TotalResources)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_WaitNestedContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&agent.Response_WaitNestedContainer{") + if this.ExitStatus != nil { + s = append(s, "ExitStatus: "+valueToGoStringAgent(this.ExitStatus, "int32")+",\n") + } + if this.State != nil { + s = append(s, "State: "+valueToGoStringAgent(this.State, "mesos.TaskState")+",\n") + } + if this.Reason != nil { + s = append(s, "Reason: "+valueToGoStringAgent(this.Reason, "mesos.TaskStatus_Reason")+",\n") + } + if this.Limitation != nil { + s = append(s, "Limitation: "+fmt.Sprintf("%#v", this.Limitation)+",\n") + } + if this.Message != nil { + s = append(s, "Message: "+valueToGoStringAgent(this.Message, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Response_WaitContainer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&agent.Response_WaitContainer{") + if this.ExitStatus != nil { + s = append(s, "ExitStatus: "+valueToGoStringAgent(this.ExitStatus, "int32")+",\n") + } + if this.State != nil { + s = append(s, "State: "+valueToGoStringAgent(this.State, "mesos.TaskState")+",\n") + } + if this.Reason != nil { + s = append(s, "Reason: "+valueToGoStringAgent(this.Reason, "mesos.TaskStatus_Reason")+",\n") + } + if this.Limitation != nil { + s = append(s, "Limitation: "+fmt.Sprintf("%#v", this.Limitation)+",\n") + } + if this.Message != nil { + s = append(s, "Message: "+valueToGoStringAgent(this.Message, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ProcessIO) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&agent.ProcessIO{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Data != nil { + s = append(s, "Data: "+fmt.Sprintf("%#v", this.Data)+",\n") + } + if this.Control != nil { + s = append(s, "Control: "+fmt.Sprintf("%#v", this.Control)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ProcessIO_Data) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&agent.ProcessIO_Data{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Data != nil { + s = append(s, "Data: "+valueToGoStringAgent(this.Data, "byte")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ProcessIO_Control) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&agent.ProcessIO_Control{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.TTYInfo != nil { + s = append(s, "TTYInfo: "+fmt.Sprintf("%#v", this.TTYInfo)+",\n") + } + if this.Heartbeat != nil { + s = append(s, "Heartbeat: "+fmt.Sprintf("%#v", this.Heartbeat)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ProcessIO_Control_Heartbeat) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&agent.ProcessIO_Control_Heartbeat{") + if this.Interval != nil { + s = append(s, "Interval: "+fmt.Sprintf("%#v", this.Interval)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringAgent(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *Call) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Type)) + if m.GetMetrics != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetMetrics.ProtoSize())) + n1, err := m.GetMetrics.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if m.SetLoggingLevel != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.SetLoggingLevel.ProtoSize())) + n2, err := m.SetLoggingLevel.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.ListFiles != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ListFiles.ProtoSize())) + n3, err := m.ListFiles.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.ReadFile != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ReadFile.ProtoSize())) + n4, err := m.ReadFile.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.LaunchNestedContainer != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.LaunchNestedContainer.ProtoSize())) + n5, err := m.LaunchNestedContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.WaitNestedContainer != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.WaitNestedContainer.ProtoSize())) + n6, err := m.WaitNestedContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + if m.KillNestedContainer != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.KillNestedContainer.ProtoSize())) + n7, err := m.KillNestedContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + if m.LaunchNestedContainerSession != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.LaunchNestedContainerSession.ProtoSize())) + n8, err := m.LaunchNestedContainerSession.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + if m.AttachContainerInput != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.AttachContainerInput.ProtoSize())) + n9, err := m.AttachContainerInput.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + } + if m.AttachContainerOutput != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.AttachContainerOutput.ProtoSize())) + n10, err := m.AttachContainerOutput.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + } + if m.RemoveNestedContainer != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.RemoveNestedContainer.ProtoSize())) + n11, err := m.RemoveNestedContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + if m.LaunchContainer != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.LaunchContainer.ProtoSize())) + n12, err := m.LaunchContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + if m.WaitContainer != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.WaitContainer.ProtoSize())) + n13, err := m.WaitContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n13 + } + if m.KillContainer != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.KillContainer.ProtoSize())) + n14, err := m.KillContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + } + if m.RemoveContainer != nil { + dAtA[i] = 0x82 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.RemoveContainer.ProtoSize())) + n15, err := m.RemoveContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n15 + } + if m.AddResourceProviderConfig != nil { + dAtA[i] = 0x8a + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.AddResourceProviderConfig.ProtoSize())) + n16, err := m.AddResourceProviderConfig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + } + if m.UpdateResourceProviderConfig != nil { + dAtA[i] = 0x92 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.UpdateResourceProviderConfig.ProtoSize())) + n17, err := m.UpdateResourceProviderConfig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 + } + if m.RemoveResourceProviderConfig != nil { + dAtA[i] = 0x9a + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.RemoveResourceProviderConfig.ProtoSize())) + n18, err := m.RemoveResourceProviderConfig.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n18 + } + if m.GetContainers != nil { + dAtA[i] = 0xa2 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetContainers.ProtoSize())) + n19, err := m.GetContainers.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + } + if m.PruneImages != nil { + dAtA[i] = 0xaa + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.PruneImages.ProtoSize())) + n20, err := m.PruneImages.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n20 + } + return i, nil +} + +func (m *Call_GetMetrics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_GetMetrics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Timeout != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Timeout.ProtoSize())) + n21, err := m.Timeout.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n21 + } + return i, nil +} + +func (m *Call_SetLoggingLevel) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_SetLoggingLevel) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Level)) + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Duration.ProtoSize())) + n22, err := m.Duration.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n22 + return i, nil +} + +func (m *Call_ListFiles) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_ListFiles) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + return i, nil +} + +func (m *Call_ReadFile) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_ReadFile) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + dAtA[i] = 0x10 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Offset)) + if m.Length != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.Length)) + } + return i, nil +} + +func (m *Call_GetContainers) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_GetContainers) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ShowNested != nil { + dAtA[i] = 0x8 + i++ + if *m.ShowNested { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.ShowStandalone != nil { + dAtA[i] = 0x10 + i++ + if *m.ShowStandalone { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *Call_LaunchNestedContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_LaunchNestedContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n23, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n23 + if m.Command != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Command.ProtoSize())) + n24, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n24 + } + if m.Container != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Container.ProtoSize())) + n25, err := m.Container.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n25 + } + return i, nil +} + +func (m *Call_WaitNestedContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_WaitNestedContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n26, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n26 + return i, nil +} + +func (m *Call_KillNestedContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_KillNestedContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n27, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n27 + if m.Signal != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.Signal)) + } + return i, nil +} + +func (m *Call_RemoveNestedContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_RemoveNestedContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n28, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n28 + return i, nil +} + +func (m *Call_LaunchNestedContainerSession) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_LaunchNestedContainerSession) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n29, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n29 + if m.Command != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Command.ProtoSize())) + n30, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n30 + } + if m.Container != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Container.ProtoSize())) + n31, err := m.Container.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + } + return i, nil +} + +func (m *Call_AttachContainerInput) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_AttachContainerInput) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Type)) + if m.ContainerID != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n32, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n32 + } + if m.ProcessIO != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ProcessIO.ProtoSize())) + n33, err := m.ProcessIO.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n33 + } + return i, nil +} + +func (m *Call_AttachContainerOutput) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_AttachContainerOutput) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n34, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n34 + return i, nil +} + +func (m *Call_LaunchContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_LaunchContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n35, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n35 + if m.Command != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Command.ProtoSize())) + n36, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n36 + } + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Container != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Container.ProtoSize())) + n37, err := m.Container.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n37 + } + return i, nil +} + +func (m *Call_WaitContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_WaitContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n38, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n38 + return i, nil +} + +func (m *Call_KillContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_KillContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n39, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n39 + if m.Signal != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.Signal)) + } + return i, nil +} + +func (m *Call_RemoveContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_RemoveContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n40, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n40 + return i, nil +} + +func (m *Call_AddResourceProviderConfig) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_AddResourceProviderConfig) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Info.ProtoSize())) + n41, err := m.Info.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n41 + return i, nil +} + +func (m *Call_UpdateResourceProviderConfig) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_UpdateResourceProviderConfig) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Info.ProtoSize())) + n42, err := m.Info.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n42 + return i, nil +} + +func (m *Call_RemoveResourceProviderConfig) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_RemoveResourceProviderConfig) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + return i, nil +} + +func (m *Call_PruneImages) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Call_PruneImages) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.ExcludedImages) > 0 { + for _, msg := range m.ExcludedImages { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Type)) + if m.GetHealth != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetHealth.ProtoSize())) + n43, err := m.GetHealth.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n43 + } + if m.GetFlags != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetFlags.ProtoSize())) + n44, err := m.GetFlags.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n44 + } + if m.GetVersion != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetVersion.ProtoSize())) + n45, err := m.GetVersion.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n45 + } + if m.GetMetrics != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetMetrics.ProtoSize())) + n46, err := m.GetMetrics.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n46 + } + if m.GetLoggingLevel != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetLoggingLevel.ProtoSize())) + n47, err := m.GetLoggingLevel.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n47 + } + if m.ListFiles != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ListFiles.ProtoSize())) + n48, err := m.ListFiles.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n48 + } + if m.ReadFile != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ReadFile.ProtoSize())) + n49, err := m.ReadFile.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n49 + } + if m.GetState != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetState.ProtoSize())) + n50, err := m.GetState.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n50 + } + if m.GetContainers != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetContainers.ProtoSize())) + n51, err := m.GetContainers.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n51 + } + if m.GetFrameworks != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetFrameworks.ProtoSize())) + n52, err := m.GetFrameworks.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n52 + } + if m.GetExecutors != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetExecutors.ProtoSize())) + n53, err := m.GetExecutors.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n53 + } + if m.GetTasks != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetTasks.ProtoSize())) + n54, err := m.GetTasks.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n54 + } + if m.WaitNestedContainer != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.WaitNestedContainer.ProtoSize())) + n55, err := m.WaitNestedContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n55 + } + if m.GetAgent != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetAgent.ProtoSize())) + n56, err := m.GetAgent.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n56 + } + if m.WaitContainer != nil { + dAtA[i] = 0x82 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.WaitContainer.ProtoSize())) + n57, err := m.WaitContainer.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n57 + } + if m.GetResourceProviders != nil { + dAtA[i] = 0x8a + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetResourceProviders.ProtoSize())) + n58, err := m.GetResourceProviders.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n58 + } + if m.GetOperations != nil { + dAtA[i] = 0x92 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetOperations.ProtoSize())) + n59, err := m.GetOperations.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n59 + } + return i, nil +} + +func (m *Response_GetHealth) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetHealth) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + if m.Healthy { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + return i, nil +} + +func (m *Response_GetFlags) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetFlags) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Flags) > 0 { + for _, msg := range m.Flags { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetVersion) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetVersion) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.VersionInfo.ProtoSize())) + n60, err := m.VersionInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n60 + return i, nil +} + +func (m *Response_GetMetrics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetMetrics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Metrics) > 0 { + for _, msg := range m.Metrics { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetLoggingLevel) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetLoggingLevel) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Level)) + return i, nil +} + +func (m *Response_ListFiles) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_ListFiles) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.FileInfos) > 0 { + for _, msg := range m.FileInfos { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_ReadFile) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_ReadFile) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Size)) + if m.Data == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("data") + } else { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + return i, nil +} + +func (m *Response_GetState) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetState) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.GetTasks != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetTasks.ProtoSize())) + n61, err := m.GetTasks.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n61 + } + if m.GetExecutors != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetExecutors.ProtoSize())) + n62, err := m.GetExecutors.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n62 + } + if m.GetFrameworks != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.GetFrameworks.ProtoSize())) + n63, err := m.GetFrameworks.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n63 + } + return i, nil +} + +func (m *Response_GetContainers) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetContainers) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Containers) > 0 { + for _, msg := range m.Containers { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetContainers_Container) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetContainers_Container) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.FrameworkID != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.FrameworkID.ProtoSize())) + n64, err := m.FrameworkID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n64 + } + if m.ExecutorID != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ExecutorID.ProtoSize())) + n65, err := m.ExecutorID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n65 + } + if m.ExecutorName != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(*m.ExecutorName))) + i += copy(dAtA[i:], *m.ExecutorName) + } + dAtA[i] = 0x22 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n66, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n66 + if m.ContainerStatus != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ContainerStatus.ProtoSize())) + n67, err := m.ContainerStatus.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n67 + } + if m.ResourceStatistics != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ResourceStatistics.ProtoSize())) + n68, err := m.ResourceStatistics.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n68 + } + return i, nil +} + +func (m *Response_GetFrameworks) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetFrameworks) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Frameworks) > 0 { + for _, msg := range m.Frameworks { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.CompletedFrameworks) > 0 { + for _, msg := range m.CompletedFrameworks { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetFrameworks_Framework) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetFrameworks_Framework) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.FrameworkInfo.ProtoSize())) + n69, err := m.FrameworkInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n69 + return i, nil +} + +func (m *Response_GetExecutors) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetExecutors) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Executors) > 0 { + for _, msg := range m.Executors { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.CompletedExecutors) > 0 { + for _, msg := range m.CompletedExecutors { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetExecutors_Executor) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetExecutors_Executor) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ExecutorInfo.ProtoSize())) + n70, err := m.ExecutorInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n70 + return i, nil +} + +func (m *Response_GetOperations) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetOperations) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Operations) > 0 { + for _, msg := range m.Operations { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetTasks) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetTasks) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.PendingTasks) > 0 { + for _, msg := range m.PendingTasks { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.QueuedTasks) > 0 { + for _, msg := range m.QueuedTasks { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.LaunchedTasks) > 0 { + for _, msg := range m.LaunchedTasks { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.TerminatedTasks) > 0 { + for _, msg := range m.TerminatedTasks { + dAtA[i] = 0x22 + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.CompletedTasks) > 0 { + for _, msg := range m.CompletedTasks { + dAtA[i] = 0x2a + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetAgent) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetAgent) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.AgentInfo != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.AgentInfo.ProtoSize())) + n71, err := m.AgentInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n71 + } + return i, nil +} + +func (m *Response_GetResourceProviders) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetResourceProviders) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.ResourceProviders) > 0 { + for _, msg := range m.ResourceProviders { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_GetResourceProviders_ResourceProvider) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_GetResourceProviders_ResourceProvider) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.ResourceProviderInfo.ProtoSize())) + n72, err := m.ResourceProviderInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n72 + if len(m.TotalResources) > 0 { + for _, msg := range m.TotalResources { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Response_WaitNestedContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_WaitNestedContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ExitStatus != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.ExitStatus)) + } + if m.State != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.State)) + } + if m.Reason != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.Reason)) + } + if m.Limitation != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Limitation.ProtoSize())) + n73, err := m.Limitation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n73 + } + if m.Message != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + return i, nil +} + +func (m *Response_WaitContainer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Response_WaitContainer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ExitStatus != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.ExitStatus)) + } + if m.State != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.State)) + } + if m.Reason != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintAgent(dAtA, i, uint64(*m.Reason)) + } + if m.Limitation != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Limitation.ProtoSize())) + n74, err := m.Limitation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n74 + } + if m.Message != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + return i, nil +} + +func (m *ProcessIO) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProcessIO) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Type)) + if m.Data != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Data.ProtoSize())) + n75, err := m.Data.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n75 + } + if m.Control != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Control.ProtoSize())) + n76, err := m.Control.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n76 + } + return i, nil +} + +func (m *ProcessIO_Data) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProcessIO_Data) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Type)) + if m.Data != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + return i, nil +} + +func (m *ProcessIO_Control) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProcessIO_Control) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Type)) + if m.TTYInfo != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.TTYInfo.ProtoSize())) + n77, err := m.TTYInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n77 + } + if m.Heartbeat != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Heartbeat.ProtoSize())) + n78, err := m.Heartbeat.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n78 + } + return i, nil +} + +func (m *ProcessIO_Control_Heartbeat) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProcessIO_Control_Heartbeat) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Interval != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintAgent(dAtA, i, uint64(m.Interval.ProtoSize())) + n79, err := m.Interval.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n79 + } + return i, nil +} + +func encodeFixed64Agent(dAtA []byte, offset int, v uint64) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + dAtA[offset+4] = uint8(v >> 32) + dAtA[offset+5] = uint8(v >> 40) + dAtA[offset+6] = uint8(v >> 48) + dAtA[offset+7] = uint8(v >> 56) + return offset + 8 +} +func encodeFixed32Agent(dAtA []byte, offset int, v uint32) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + return offset + 4 +} +func encodeVarintAgent(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func NewPopulatedCall(r randyAgent, easy bool) *Call { + this := &Call{} + this.Type = Call_Type([]int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 31, 13, 20, 26, 14, 15, 16, 21, 17, 18, 19, 22, 23, 24, 25, 27, 28, 29, 30}[r.Intn(32)]) + if r.Intn(10) != 0 { + this.GetMetrics = NewPopulatedCall_GetMetrics(r, easy) + } + if r.Intn(10) != 0 { + this.SetLoggingLevel = NewPopulatedCall_SetLoggingLevel(r, easy) + } + if r.Intn(10) != 0 { + this.ListFiles = NewPopulatedCall_ListFiles(r, easy) + } + if r.Intn(10) != 0 { + this.ReadFile = NewPopulatedCall_ReadFile(r, easy) + } + if r.Intn(10) == 0 { + this.LaunchNestedContainer = NewPopulatedCall_LaunchNestedContainer(r, easy) + } + if r.Intn(10) == 0 { + this.WaitNestedContainer = NewPopulatedCall_WaitNestedContainer(r, easy) + } + if r.Intn(10) == 0 { + this.KillNestedContainer = NewPopulatedCall_KillNestedContainer(r, easy) + } + if r.Intn(10) == 0 { + this.LaunchNestedContainerSession = NewPopulatedCall_LaunchNestedContainerSession(r, easy) + } + if r.Intn(10) == 0 { + this.AttachContainerInput = NewPopulatedCall_AttachContainerInput(r, easy) + } + if r.Intn(10) == 0 { + this.AttachContainerOutput = NewPopulatedCall_AttachContainerOutput(r, easy) + } + if r.Intn(10) == 0 { + this.RemoveNestedContainer = NewPopulatedCall_RemoveNestedContainer(r, easy) + } + if r.Intn(10) == 0 { + this.LaunchContainer = NewPopulatedCall_LaunchContainer(r, easy) + } + if r.Intn(10) == 0 { + this.WaitContainer = NewPopulatedCall_WaitContainer(r, easy) + } + if r.Intn(10) == 0 { + this.KillContainer = NewPopulatedCall_KillContainer(r, easy) + } + if r.Intn(10) == 0 { + this.RemoveContainer = NewPopulatedCall_RemoveContainer(r, easy) + } + if r.Intn(10) != 0 { + this.AddResourceProviderConfig = NewPopulatedCall_AddResourceProviderConfig(r, easy) + } + if r.Intn(10) != 0 { + this.UpdateResourceProviderConfig = NewPopulatedCall_UpdateResourceProviderConfig(r, easy) + } + if r.Intn(10) != 0 { + this.RemoveResourceProviderConfig = NewPopulatedCall_RemoveResourceProviderConfig(r, easy) + } + if r.Intn(10) != 0 { + this.GetContainers = NewPopulatedCall_GetContainers(r, easy) + } + if r.Intn(10) != 0 { + this.PruneImages = NewPopulatedCall_PruneImages(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_GetMetrics(r randyAgent, easy bool) *Call_GetMetrics { + this := &Call_GetMetrics{} + if r.Intn(10) != 0 { + this.Timeout = mesos.NewPopulatedDurationInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_SetLoggingLevel(r randyAgent, easy bool) *Call_SetLoggingLevel { + this := &Call_SetLoggingLevel{} + this.Level = uint32(r.Uint32()) + v1 := mesos.NewPopulatedDurationInfo(r, easy) + this.Duration = *v1 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_ListFiles(r randyAgent, easy bool) *Call_ListFiles { + this := &Call_ListFiles{} + this.Path = string(randStringAgent(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_ReadFile(r randyAgent, easy bool) *Call_ReadFile { + this := &Call_ReadFile{} + this.Path = string(randStringAgent(r)) + this.Offset = uint64(uint64(r.Uint32())) + if r.Intn(10) != 0 { + v2 := uint64(uint64(r.Uint32())) + this.Length = &v2 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_GetContainers(r randyAgent, easy bool) *Call_GetContainers { + this := &Call_GetContainers{} + if r.Intn(10) != 0 { + v3 := bool(bool(r.Intn(2) == 0)) + this.ShowNested = &v3 + } + if r.Intn(10) != 0 { + v4 := bool(bool(r.Intn(2) == 0)) + this.ShowStandalone = &v4 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_LaunchNestedContainer(r randyAgent, easy bool) *Call_LaunchNestedContainer { + this := &Call_LaunchNestedContainer{} + v5 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v5 + if r.Intn(10) != 0 { + this.Command = mesos.NewPopulatedCommandInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Container = mesos.NewPopulatedContainerInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_WaitNestedContainer(r randyAgent, easy bool) *Call_WaitNestedContainer { + this := &Call_WaitNestedContainer{} + v6 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v6 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_KillNestedContainer(r randyAgent, easy bool) *Call_KillNestedContainer { + this := &Call_KillNestedContainer{} + v7 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v7 + if r.Intn(10) != 0 { + v8 := int32(r.Int31()) + if r.Intn(2) == 0 { + v8 *= -1 + } + this.Signal = &v8 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_RemoveNestedContainer(r randyAgent, easy bool) *Call_RemoveNestedContainer { + this := &Call_RemoveNestedContainer{} + v9 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v9 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_LaunchNestedContainerSession(r randyAgent, easy bool) *Call_LaunchNestedContainerSession { + this := &Call_LaunchNestedContainerSession{} + v10 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v10 + if r.Intn(10) != 0 { + this.Command = mesos.NewPopulatedCommandInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Container = mesos.NewPopulatedContainerInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_AttachContainerInput(r randyAgent, easy bool) *Call_AttachContainerInput { + this := &Call_AttachContainerInput{} + this.Type = Call_AttachContainerInput_Type([]int32{0, 1, 2}[r.Intn(3)]) + if r.Intn(10) == 0 { + this.ContainerID = mesos.NewPopulatedContainerID(r, easy) + } + if r.Intn(10) != 0 { + this.ProcessIO = NewPopulatedProcessIO(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_AttachContainerOutput(r randyAgent, easy bool) *Call_AttachContainerOutput { + this := &Call_AttachContainerOutput{} + v11 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v11 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_LaunchContainer(r randyAgent, easy bool) *Call_LaunchContainer { + this := &Call_LaunchContainer{} + v12 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v12 + if r.Intn(10) != 0 { + this.Command = mesos.NewPopulatedCommandInfo(r, easy) + } + if r.Intn(10) != 0 { + v13 := r.Intn(5) + this.Resources = make([]mesos.Resource, v13) + for i := 0; i < v13; i++ { + v14 := mesos.NewPopulatedResource(r, easy) + this.Resources[i] = *v14 + } + } + if r.Intn(10) != 0 { + this.Container = mesos.NewPopulatedContainerInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_WaitContainer(r randyAgent, easy bool) *Call_WaitContainer { + this := &Call_WaitContainer{} + v15 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v15 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_KillContainer(r randyAgent, easy bool) *Call_KillContainer { + this := &Call_KillContainer{} + v16 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v16 + if r.Intn(10) != 0 { + v17 := int32(r.Int31()) + if r.Intn(2) == 0 { + v17 *= -1 + } + this.Signal = &v17 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_RemoveContainer(r randyAgent, easy bool) *Call_RemoveContainer { + this := &Call_RemoveContainer{} + v18 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v18 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_AddResourceProviderConfig(r randyAgent, easy bool) *Call_AddResourceProviderConfig { + this := &Call_AddResourceProviderConfig{} + v19 := mesos.NewPopulatedResourceProviderInfo(r, easy) + this.Info = *v19 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_UpdateResourceProviderConfig(r randyAgent, easy bool) *Call_UpdateResourceProviderConfig { + this := &Call_UpdateResourceProviderConfig{} + v20 := mesos.NewPopulatedResourceProviderInfo(r, easy) + this.Info = *v20 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_RemoveResourceProviderConfig(r randyAgent, easy bool) *Call_RemoveResourceProviderConfig { + this := &Call_RemoveResourceProviderConfig{} + this.Type = string(randStringAgent(r)) + this.Name = string(randStringAgent(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCall_PruneImages(r randyAgent, easy bool) *Call_PruneImages { + this := &Call_PruneImages{} + if r.Intn(10) != 0 { + v21 := r.Intn(5) + this.ExcludedImages = make([]mesos.Image, v21) + for i := 0; i < v21; i++ { + v22 := mesos.NewPopulatedImage(r, easy) + this.ExcludedImages[i] = *v22 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse(r randyAgent, easy bool) *Response { + this := &Response{} + this.Type = Response_Type([]int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 17, 12, 14, 16, 13, 15}[r.Intn(18)]) + if r.Intn(10) != 0 { + this.GetHealth = NewPopulatedResponse_GetHealth(r, easy) + } + if r.Intn(10) != 0 { + this.GetFlags = NewPopulatedResponse_GetFlags(r, easy) + } + if r.Intn(10) != 0 { + this.GetVersion = NewPopulatedResponse_GetVersion(r, easy) + } + if r.Intn(10) != 0 { + this.GetMetrics = NewPopulatedResponse_GetMetrics(r, easy) + } + if r.Intn(10) != 0 { + this.GetLoggingLevel = NewPopulatedResponse_GetLoggingLevel(r, easy) + } + if r.Intn(10) != 0 { + this.ListFiles = NewPopulatedResponse_ListFiles(r, easy) + } + if r.Intn(10) != 0 { + this.ReadFile = NewPopulatedResponse_ReadFile(r, easy) + } + if r.Intn(10) == 0 { + this.GetState = NewPopulatedResponse_GetState(r, easy) + } + if r.Intn(10) == 0 { + this.GetContainers = NewPopulatedResponse_GetContainers(r, easy) + } + if r.Intn(10) != 0 { + this.GetFrameworks = NewPopulatedResponse_GetFrameworks(r, easy) + } + if r.Intn(10) != 0 { + this.GetExecutors = NewPopulatedResponse_GetExecutors(r, easy) + } + if r.Intn(10) == 0 { + this.GetTasks = NewPopulatedResponse_GetTasks(r, easy) + } + if r.Intn(10) != 0 { + this.WaitNestedContainer = NewPopulatedResponse_WaitNestedContainer(r, easy) + } + if r.Intn(10) != 0 { + this.GetAgent = NewPopulatedResponse_GetAgent(r, easy) + } + if r.Intn(10) != 0 { + this.WaitContainer = NewPopulatedResponse_WaitContainer(r, easy) + } + if r.Intn(10) != 0 { + this.GetResourceProviders = NewPopulatedResponse_GetResourceProviders(r, easy) + } + if r.Intn(10) != 0 { + this.GetOperations = NewPopulatedResponse_GetOperations(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetHealth(r randyAgent, easy bool) *Response_GetHealth { + this := &Response_GetHealth{} + this.Healthy = bool(bool(r.Intn(2) == 0)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetFlags(r randyAgent, easy bool) *Response_GetFlags { + this := &Response_GetFlags{} + if r.Intn(10) != 0 { + v23 := r.Intn(5) + this.Flags = make([]mesos.Flag, v23) + for i := 0; i < v23; i++ { + v24 := mesos.NewPopulatedFlag(r, easy) + this.Flags[i] = *v24 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetVersion(r randyAgent, easy bool) *Response_GetVersion { + this := &Response_GetVersion{} + v25 := mesos.NewPopulatedVersionInfo(r, easy) + this.VersionInfo = *v25 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetMetrics(r randyAgent, easy bool) *Response_GetMetrics { + this := &Response_GetMetrics{} + if r.Intn(10) != 0 { + v26 := r.Intn(5) + this.Metrics = make([]mesos.Metric, v26) + for i := 0; i < v26; i++ { + v27 := mesos.NewPopulatedMetric(r, easy) + this.Metrics[i] = *v27 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetLoggingLevel(r randyAgent, easy bool) *Response_GetLoggingLevel { + this := &Response_GetLoggingLevel{} + this.Level = uint32(r.Uint32()) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_ListFiles(r randyAgent, easy bool) *Response_ListFiles { + this := &Response_ListFiles{} + if r.Intn(10) != 0 { + v28 := r.Intn(5) + this.FileInfos = make([]mesos.FileInfo, v28) + for i := 0; i < v28; i++ { + v29 := mesos.NewPopulatedFileInfo(r, easy) + this.FileInfos[i] = *v29 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_ReadFile(r randyAgent, easy bool) *Response_ReadFile { + this := &Response_ReadFile{} + this.Size = uint64(uint64(r.Uint32())) + v30 := r.Intn(100) + this.Data = make([]byte, v30) + for i := 0; i < v30; i++ { + this.Data[i] = byte(r.Intn(256)) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetState(r randyAgent, easy bool) *Response_GetState { + this := &Response_GetState{} + if r.Intn(10) == 0 { + this.GetTasks = NewPopulatedResponse_GetTasks(r, easy) + } + if r.Intn(10) != 0 { + this.GetExecutors = NewPopulatedResponse_GetExecutors(r, easy) + } + if r.Intn(10) != 0 { + this.GetFrameworks = NewPopulatedResponse_GetFrameworks(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetContainers(r randyAgent, easy bool) *Response_GetContainers { + this := &Response_GetContainers{} + if r.Intn(10) == 0 { + v31 := r.Intn(5) + this.Containers = make([]Response_GetContainers_Container, v31) + for i := 0; i < v31; i++ { + v32 := NewPopulatedResponse_GetContainers_Container(r, easy) + this.Containers[i] = *v32 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetContainers_Container(r randyAgent, easy bool) *Response_GetContainers_Container { + this := &Response_GetContainers_Container{} + if r.Intn(10) != 0 { + this.FrameworkID = mesos.NewPopulatedFrameworkID(r, easy) + } + if r.Intn(10) != 0 { + this.ExecutorID = mesos.NewPopulatedExecutorID(r, easy) + } + if r.Intn(10) != 0 { + v33 := string(randStringAgent(r)) + this.ExecutorName = &v33 + } + v34 := mesos.NewPopulatedContainerID(r, easy) + this.ContainerID = *v34 + if r.Intn(10) == 0 { + this.ContainerStatus = mesos.NewPopulatedContainerStatus(r, easy) + } + if r.Intn(10) != 0 { + this.ResourceStatistics = mesos.NewPopulatedResourceStatistics(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetFrameworks(r randyAgent, easy bool) *Response_GetFrameworks { + this := &Response_GetFrameworks{} + if r.Intn(10) != 0 { + v35 := r.Intn(5) + this.Frameworks = make([]Response_GetFrameworks_Framework, v35) + for i := 0; i < v35; i++ { + v36 := NewPopulatedResponse_GetFrameworks_Framework(r, easy) + this.Frameworks[i] = *v36 + } + } + if r.Intn(10) != 0 { + v37 := r.Intn(5) + this.CompletedFrameworks = make([]Response_GetFrameworks_Framework, v37) + for i := 0; i < v37; i++ { + v38 := NewPopulatedResponse_GetFrameworks_Framework(r, easy) + this.CompletedFrameworks[i] = *v38 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetFrameworks_Framework(r randyAgent, easy bool) *Response_GetFrameworks_Framework { + this := &Response_GetFrameworks_Framework{} + v39 := mesos.NewPopulatedFrameworkInfo(r, easy) + this.FrameworkInfo = *v39 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetExecutors(r randyAgent, easy bool) *Response_GetExecutors { + this := &Response_GetExecutors{} + if r.Intn(10) != 0 { + v40 := r.Intn(5) + this.Executors = make([]Response_GetExecutors_Executor, v40) + for i := 0; i < v40; i++ { + v41 := NewPopulatedResponse_GetExecutors_Executor(r, easy) + this.Executors[i] = *v41 + } + } + if r.Intn(10) != 0 { + v42 := r.Intn(5) + this.CompletedExecutors = make([]Response_GetExecutors_Executor, v42) + for i := 0; i < v42; i++ { + v43 := NewPopulatedResponse_GetExecutors_Executor(r, easy) + this.CompletedExecutors[i] = *v43 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetExecutors_Executor(r randyAgent, easy bool) *Response_GetExecutors_Executor { + this := &Response_GetExecutors_Executor{} + v44 := mesos.NewPopulatedExecutorInfo(r, easy) + this.ExecutorInfo = *v44 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetOperations(r randyAgent, easy bool) *Response_GetOperations { + this := &Response_GetOperations{} + if r.Intn(10) != 0 { + v45 := r.Intn(5) + this.Operations = make([]mesos.Operation, v45) + for i := 0; i < v45; i++ { + v46 := mesos.NewPopulatedOperation(r, easy) + this.Operations[i] = *v46 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetTasks(r randyAgent, easy bool) *Response_GetTasks { + this := &Response_GetTasks{} + if r.Intn(10) == 0 { + v47 := r.Intn(5) + this.PendingTasks = make([]mesos.Task, v47) + for i := 0; i < v47; i++ { + v48 := mesos.NewPopulatedTask(r, easy) + this.PendingTasks[i] = *v48 + } + } + if r.Intn(10) == 0 { + v49 := r.Intn(5) + this.QueuedTasks = make([]mesos.Task, v49) + for i := 0; i < v49; i++ { + v50 := mesos.NewPopulatedTask(r, easy) + this.QueuedTasks[i] = *v50 + } + } + if r.Intn(10) == 0 { + v51 := r.Intn(5) + this.LaunchedTasks = make([]mesos.Task, v51) + for i := 0; i < v51; i++ { + v52 := mesos.NewPopulatedTask(r, easy) + this.LaunchedTasks[i] = *v52 + } + } + if r.Intn(10) == 0 { + v53 := r.Intn(5) + this.TerminatedTasks = make([]mesos.Task, v53) + for i := 0; i < v53; i++ { + v54 := mesos.NewPopulatedTask(r, easy) + this.TerminatedTasks[i] = *v54 + } + } + if r.Intn(10) == 0 { + v55 := r.Intn(5) + this.CompletedTasks = make([]mesos.Task, v55) + for i := 0; i < v55; i++ { + v56 := mesos.NewPopulatedTask(r, easy) + this.CompletedTasks[i] = *v56 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetAgent(r randyAgent, easy bool) *Response_GetAgent { + this := &Response_GetAgent{} + if r.Intn(10) != 0 { + this.AgentInfo = mesos.NewPopulatedAgentInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetResourceProviders(r randyAgent, easy bool) *Response_GetResourceProviders { + this := &Response_GetResourceProviders{} + if r.Intn(10) != 0 { + v57 := r.Intn(5) + this.ResourceProviders = make([]Response_GetResourceProviders_ResourceProvider, v57) + for i := 0; i < v57; i++ { + v58 := NewPopulatedResponse_GetResourceProviders_ResourceProvider(r, easy) + this.ResourceProviders[i] = *v58 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_GetResourceProviders_ResourceProvider(r randyAgent, easy bool) *Response_GetResourceProviders_ResourceProvider { + this := &Response_GetResourceProviders_ResourceProvider{} + v59 := mesos.NewPopulatedResourceProviderInfo(r, easy) + this.ResourceProviderInfo = *v59 + if r.Intn(10) != 0 { + v60 := r.Intn(5) + this.TotalResources = make([]mesos.Resource, v60) + for i := 0; i < v60; i++ { + v61 := mesos.NewPopulatedResource(r, easy) + this.TotalResources[i] = *v61 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_WaitNestedContainer(r randyAgent, easy bool) *Response_WaitNestedContainer { + this := &Response_WaitNestedContainer{} + if r.Intn(10) != 0 { + v62 := int32(r.Int31()) + if r.Intn(2) == 0 { + v62 *= -1 + } + this.ExitStatus = &v62 + } + if r.Intn(10) != 0 { + v63 := mesos.TaskState([]int32{6, 0, 1, 8, 2, 3, 4, 7, 5, 9, 10, 11, 12, 13}[r.Intn(14)]) + this.State = &v63 + } + if r.Intn(10) != 0 { + v64 := mesos.TaskStatus_Reason([]int32{0, 21, 19, 20, 8, 17, 22, 33, 23, 24, 1, 2, 3, 4, 5, 6, 27, 7, 9, 18, 10, 11, 31, 32, 12, 13, 30, 28, 29, 25, 26, 14, 15, 16}[r.Intn(34)]) + this.Reason = &v64 + } + if r.Intn(10) != 0 { + this.Limitation = mesos.NewPopulatedTaskResourceLimitation(r, easy) + } + if r.Intn(10) != 0 { + v65 := string(randStringAgent(r)) + this.Message = &v65 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResponse_WaitContainer(r randyAgent, easy bool) *Response_WaitContainer { + this := &Response_WaitContainer{} + if r.Intn(10) != 0 { + v66 := int32(r.Int31()) + if r.Intn(2) == 0 { + v66 *= -1 + } + this.ExitStatus = &v66 + } + if r.Intn(10) != 0 { + v67 := mesos.TaskState([]int32{6, 0, 1, 8, 2, 3, 4, 7, 5, 9, 10, 11, 12, 13}[r.Intn(14)]) + this.State = &v67 + } + if r.Intn(10) != 0 { + v68 := mesos.TaskStatus_Reason([]int32{0, 21, 19, 20, 8, 17, 22, 33, 23, 24, 1, 2, 3, 4, 5, 6, 27, 7, 9, 18, 10, 11, 31, 32, 12, 13, 30, 28, 29, 25, 26, 14, 15, 16}[r.Intn(34)]) + this.Reason = &v68 + } + if r.Intn(10) != 0 { + this.Limitation = mesos.NewPopulatedTaskResourceLimitation(r, easy) + } + if r.Intn(10) != 0 { + v69 := string(randStringAgent(r)) + this.Message = &v69 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedProcessIO(r randyAgent, easy bool) *ProcessIO { + this := &ProcessIO{} + this.Type = ProcessIO_Type([]int32{0, 1, 2}[r.Intn(3)]) + if r.Intn(10) != 0 { + this.Data = NewPopulatedProcessIO_Data(r, easy) + } + if r.Intn(10) != 0 { + this.Control = NewPopulatedProcessIO_Control(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedProcessIO_Data(r randyAgent, easy bool) *ProcessIO_Data { + this := &ProcessIO_Data{} + this.Type = ProcessIO_Data_Type([]int32{0, 1, 2, 3}[r.Intn(4)]) + if r.Intn(10) != 0 { + v70 := r.Intn(100) + this.Data = make([]byte, v70) + for i := 0; i < v70; i++ { + this.Data[i] = byte(r.Intn(256)) + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedProcessIO_Control(r randyAgent, easy bool) *ProcessIO_Control { + this := &ProcessIO_Control{} + this.Type = ProcessIO_Control_Type([]int32{0, 1, 2}[r.Intn(3)]) + if r.Intn(10) != 0 { + this.TTYInfo = mesos.NewPopulatedTTYInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Heartbeat = NewPopulatedProcessIO_Control_Heartbeat(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedProcessIO_Control_Heartbeat(r randyAgent, easy bool) *ProcessIO_Control_Heartbeat { + this := &ProcessIO_Control_Heartbeat{} + if r.Intn(10) != 0 { + this.Interval = mesos.NewPopulatedDurationInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +type randyAgent interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneAgent(r randyAgent) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringAgent(r randyAgent) string { + v71 := r.Intn(100) + tmps := make([]rune, v71) + for i := 0; i < v71; i++ { + tmps[i] = randUTF8RuneAgent(r) + } + return string(tmps) +} +func randUnrecognizedAgent(r randyAgent, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldAgent(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldAgent(dAtA []byte, r randyAgent, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateAgent(dAtA, uint64(key)) + v72 := r.Int63() + if r.Intn(2) == 0 { + v72 *= -1 + } + dAtA = encodeVarintPopulateAgent(dAtA, uint64(v72)) + case 1: + dAtA = encodeVarintPopulateAgent(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateAgent(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateAgent(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateAgent(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateAgent(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *Call) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Type)) + if m.GetMetrics != nil { + l = m.GetMetrics.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.SetLoggingLevel != nil { + l = m.SetLoggingLevel.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ListFiles != nil { + l = m.ListFiles.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ReadFile != nil { + l = m.ReadFile.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.LaunchNestedContainer != nil { + l = m.LaunchNestedContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.WaitNestedContainer != nil { + l = m.WaitNestedContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.KillNestedContainer != nil { + l = m.KillNestedContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.LaunchNestedContainerSession != nil { + l = m.LaunchNestedContainerSession.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.AttachContainerInput != nil { + l = m.AttachContainerInput.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.AttachContainerOutput != nil { + l = m.AttachContainerOutput.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.RemoveNestedContainer != nil { + l = m.RemoveNestedContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.LaunchContainer != nil { + l = m.LaunchContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.WaitContainer != nil { + l = m.WaitContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.KillContainer != nil { + l = m.KillContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.RemoveContainer != nil { + l = m.RemoveContainer.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + if m.AddResourceProviderConfig != nil { + l = m.AddResourceProviderConfig.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + if m.UpdateResourceProviderConfig != nil { + l = m.UpdateResourceProviderConfig.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + if m.RemoveResourceProviderConfig != nil { + l = m.RemoveResourceProviderConfig.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + if m.GetContainers != nil { + l = m.GetContainers.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + if m.PruneImages != nil { + l = m.PruneImages.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Call_GetMetrics) ProtoSize() (n int) { + var l int + _ = l + if m.Timeout != nil { + l = m.Timeout.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Call_SetLoggingLevel) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Level)) + l = m.Duration.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_ListFiles) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Path) + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_ReadFile) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Path) + n += 1 + l + sovAgent(uint64(l)) + n += 1 + sovAgent(uint64(m.Offset)) + if m.Length != nil { + n += 1 + sovAgent(uint64(*m.Length)) + } + return n +} + +func (m *Call_GetContainers) ProtoSize() (n int) { + var l int + _ = l + if m.ShowNested != nil { + n += 2 + } + if m.ShowStandalone != nil { + n += 2 + } + return n +} + +func (m *Call_LaunchNestedContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.Container != nil { + l = m.Container.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Call_WaitNestedContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_KillNestedContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + if m.Signal != nil { + n += 1 + sovAgent(uint64(*m.Signal)) + } + return n +} + +func (m *Call_RemoveNestedContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_LaunchNestedContainerSession) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.Container != nil { + l = m.Container.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Call_AttachContainerInput) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Type)) + if m.ContainerID != nil { + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ProcessIO != nil { + l = m.ProcessIO.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Call_AttachContainerOutput) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_LaunchContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + if m.Container != nil { + l = m.Container.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Call_WaitContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_KillContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + if m.Signal != nil { + n += 1 + sovAgent(uint64(*m.Signal)) + } + return n +} + +func (m *Call_RemoveContainer) ProtoSize() (n int) { + var l int + _ = l + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_AddResourceProviderConfig) ProtoSize() (n int) { + var l int + _ = l + l = m.Info.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_UpdateResourceProviderConfig) ProtoSize() (n int) { + var l int + _ = l + l = m.Info.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_RemoveResourceProviderConfig) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovAgent(uint64(l)) + l = len(m.Name) + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Call_PruneImages) ProtoSize() (n int) { + var l int + _ = l + if len(m.ExcludedImages) > 0 { + for _, e := range m.ExcludedImages { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Type)) + if m.GetHealth != nil { + l = m.GetHealth.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetFlags != nil { + l = m.GetFlags.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetVersion != nil { + l = m.GetVersion.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetMetrics != nil { + l = m.GetMetrics.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetLoggingLevel != nil { + l = m.GetLoggingLevel.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ListFiles != nil { + l = m.ListFiles.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ReadFile != nil { + l = m.ReadFile.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetState != nil { + l = m.GetState.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetContainers != nil { + l = m.GetContainers.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetFrameworks != nil { + l = m.GetFrameworks.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetExecutors != nil { + l = m.GetExecutors.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetTasks != nil { + l = m.GetTasks.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.WaitNestedContainer != nil { + l = m.WaitNestedContainer.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetAgent != nil { + l = m.GetAgent.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.WaitContainer != nil { + l = m.WaitContainer.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + if m.GetResourceProviders != nil { + l = m.GetResourceProviders.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + if m.GetOperations != nil { + l = m.GetOperations.ProtoSize() + n += 2 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Response_GetHealth) ProtoSize() (n int) { + var l int + _ = l + n += 2 + return n +} + +func (m *Response_GetFlags) ProtoSize() (n int) { + var l int + _ = l + if len(m.Flags) > 0 { + for _, e := range m.Flags { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetVersion) ProtoSize() (n int) { + var l int + _ = l + l = m.VersionInfo.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Response_GetMetrics) ProtoSize() (n int) { + var l int + _ = l + if len(m.Metrics) > 0 { + for _, e := range m.Metrics { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetLoggingLevel) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Level)) + return n +} + +func (m *Response_ListFiles) ProtoSize() (n int) { + var l int + _ = l + if len(m.FileInfos) > 0 { + for _, e := range m.FileInfos { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_ReadFile) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Size)) + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Response_GetState) ProtoSize() (n int) { + var l int + _ = l + if m.GetTasks != nil { + l = m.GetTasks.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetExecutors != nil { + l = m.GetExecutors.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.GetFrameworks != nil { + l = m.GetFrameworks.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Response_GetContainers) ProtoSize() (n int) { + var l int + _ = l + if len(m.Containers) > 0 { + for _, e := range m.Containers { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetContainers_Container) ProtoSize() (n int) { + var l int + _ = l + if m.FrameworkID != nil { + l = m.FrameworkID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ExecutorID != nil { + l = m.ExecutorID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ExecutorName != nil { + l = len(*m.ExecutorName) + n += 1 + l + sovAgent(uint64(l)) + } + l = m.ContainerID.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + if m.ContainerStatus != nil { + l = m.ContainerStatus.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.ResourceStatistics != nil { + l = m.ResourceStatistics.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Response_GetFrameworks) ProtoSize() (n int) { + var l int + _ = l + if len(m.Frameworks) > 0 { + for _, e := range m.Frameworks { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + if len(m.CompletedFrameworks) > 0 { + for _, e := range m.CompletedFrameworks { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetFrameworks_Framework) ProtoSize() (n int) { + var l int + _ = l + l = m.FrameworkInfo.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Response_GetExecutors) ProtoSize() (n int) { + var l int + _ = l + if len(m.Executors) > 0 { + for _, e := range m.Executors { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + if len(m.CompletedExecutors) > 0 { + for _, e := range m.CompletedExecutors { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetExecutors_Executor) ProtoSize() (n int) { + var l int + _ = l + l = m.ExecutorInfo.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + return n +} + +func (m *Response_GetOperations) ProtoSize() (n int) { + var l int + _ = l + if len(m.Operations) > 0 { + for _, e := range m.Operations { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetTasks) ProtoSize() (n int) { + var l int + _ = l + if len(m.PendingTasks) > 0 { + for _, e := range m.PendingTasks { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + if len(m.QueuedTasks) > 0 { + for _, e := range m.QueuedTasks { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + if len(m.LaunchedTasks) > 0 { + for _, e := range m.LaunchedTasks { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + if len(m.TerminatedTasks) > 0 { + for _, e := range m.TerminatedTasks { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + if len(m.CompletedTasks) > 0 { + for _, e := range m.CompletedTasks { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetAgent) ProtoSize() (n int) { + var l int + _ = l + if m.AgentInfo != nil { + l = m.AgentInfo.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Response_GetResourceProviders) ProtoSize() (n int) { + var l int + _ = l + if len(m.ResourceProviders) > 0 { + for _, e := range m.ResourceProviders { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_GetResourceProviders_ResourceProvider) ProtoSize() (n int) { + var l int + _ = l + l = m.ResourceProviderInfo.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + if len(m.TotalResources) > 0 { + for _, e := range m.TotalResources { + l = e.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + } + return n +} + +func (m *Response_WaitNestedContainer) ProtoSize() (n int) { + var l int + _ = l + if m.ExitStatus != nil { + n += 1 + sovAgent(uint64(*m.ExitStatus)) + } + if m.State != nil { + n += 1 + sovAgent(uint64(*m.State)) + } + if m.Reason != nil { + n += 1 + sovAgent(uint64(*m.Reason)) + } + if m.Limitation != nil { + l = m.Limitation.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *Response_WaitContainer) ProtoSize() (n int) { + var l int + _ = l + if m.ExitStatus != nil { + n += 1 + sovAgent(uint64(*m.ExitStatus)) + } + if m.State != nil { + n += 1 + sovAgent(uint64(*m.State)) + } + if m.Reason != nil { + n += 1 + sovAgent(uint64(*m.Reason)) + } + if m.Limitation != nil { + l = m.Limitation.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *ProcessIO) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Type)) + if m.Data != nil { + l = m.Data.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.Control != nil { + l = m.Control.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *ProcessIO_Data) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Type)) + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *ProcessIO_Control) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovAgent(uint64(m.Type)) + if m.TTYInfo != nil { + l = m.TTYInfo.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + if m.Heartbeat != nil { + l = m.Heartbeat.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func (m *ProcessIO_Control_Heartbeat) ProtoSize() (n int) { + var l int + _ = l + if m.Interval != nil { + l = m.Interval.ProtoSize() + n += 1 + l + sovAgent(uint64(l)) + } + return n +} + +func sovAgent(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozAgent(x uint64) (n int) { + return sovAgent(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Call) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `GetMetrics:` + strings.Replace(fmt.Sprintf("%v", this.GetMetrics), "Call_GetMetrics", "Call_GetMetrics", 1) + `,`, + `SetLoggingLevel:` + strings.Replace(fmt.Sprintf("%v", this.SetLoggingLevel), "Call_SetLoggingLevel", "Call_SetLoggingLevel", 1) + `,`, + `ListFiles:` + strings.Replace(fmt.Sprintf("%v", this.ListFiles), "Call_ListFiles", "Call_ListFiles", 1) + `,`, + `ReadFile:` + strings.Replace(fmt.Sprintf("%v", this.ReadFile), "Call_ReadFile", "Call_ReadFile", 1) + `,`, + `LaunchNestedContainer:` + strings.Replace(fmt.Sprintf("%v", this.LaunchNestedContainer), "Call_LaunchNestedContainer", "Call_LaunchNestedContainer", 1) + `,`, + `WaitNestedContainer:` + strings.Replace(fmt.Sprintf("%v", this.WaitNestedContainer), "Call_WaitNestedContainer", "Call_WaitNestedContainer", 1) + `,`, + `KillNestedContainer:` + strings.Replace(fmt.Sprintf("%v", this.KillNestedContainer), "Call_KillNestedContainer", "Call_KillNestedContainer", 1) + `,`, + `LaunchNestedContainerSession:` + strings.Replace(fmt.Sprintf("%v", this.LaunchNestedContainerSession), "Call_LaunchNestedContainerSession", "Call_LaunchNestedContainerSession", 1) + `,`, + `AttachContainerInput:` + strings.Replace(fmt.Sprintf("%v", this.AttachContainerInput), "Call_AttachContainerInput", "Call_AttachContainerInput", 1) + `,`, + `AttachContainerOutput:` + strings.Replace(fmt.Sprintf("%v", this.AttachContainerOutput), "Call_AttachContainerOutput", "Call_AttachContainerOutput", 1) + `,`, + `RemoveNestedContainer:` + strings.Replace(fmt.Sprintf("%v", this.RemoveNestedContainer), "Call_RemoveNestedContainer", "Call_RemoveNestedContainer", 1) + `,`, + `LaunchContainer:` + strings.Replace(fmt.Sprintf("%v", this.LaunchContainer), "Call_LaunchContainer", "Call_LaunchContainer", 1) + `,`, + `WaitContainer:` + strings.Replace(fmt.Sprintf("%v", this.WaitContainer), "Call_WaitContainer", "Call_WaitContainer", 1) + `,`, + `KillContainer:` + strings.Replace(fmt.Sprintf("%v", this.KillContainer), "Call_KillContainer", "Call_KillContainer", 1) + `,`, + `RemoveContainer:` + strings.Replace(fmt.Sprintf("%v", this.RemoveContainer), "Call_RemoveContainer", "Call_RemoveContainer", 1) + `,`, + `AddResourceProviderConfig:` + strings.Replace(fmt.Sprintf("%v", this.AddResourceProviderConfig), "Call_AddResourceProviderConfig", "Call_AddResourceProviderConfig", 1) + `,`, + `UpdateResourceProviderConfig:` + strings.Replace(fmt.Sprintf("%v", this.UpdateResourceProviderConfig), "Call_UpdateResourceProviderConfig", "Call_UpdateResourceProviderConfig", 1) + `,`, + `RemoveResourceProviderConfig:` + strings.Replace(fmt.Sprintf("%v", this.RemoveResourceProviderConfig), "Call_RemoveResourceProviderConfig", "Call_RemoveResourceProviderConfig", 1) + `,`, + `GetContainers:` + strings.Replace(fmt.Sprintf("%v", this.GetContainers), "Call_GetContainers", "Call_GetContainers", 1) + `,`, + `PruneImages:` + strings.Replace(fmt.Sprintf("%v", this.PruneImages), "Call_PruneImages", "Call_PruneImages", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_GetMetrics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_GetMetrics{`, + `Timeout:` + strings.Replace(fmt.Sprintf("%v", this.Timeout), "DurationInfo", "mesos.DurationInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_SetLoggingLevel) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_SetLoggingLevel{`, + `Level:` + fmt.Sprintf("%v", this.Level) + `,`, + `Duration:` + strings.Replace(strings.Replace(this.Duration.String(), "DurationInfo", "mesos.DurationInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_ListFiles) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_ListFiles{`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `}`, + }, "") + return s +} +func (this *Call_ReadFile) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_ReadFile{`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `Offset:` + fmt.Sprintf("%v", this.Offset) + `,`, + `Length:` + valueToStringAgent(this.Length) + `,`, + `}`, + }, "") + return s +} +func (this *Call_GetContainers) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_GetContainers{`, + `ShowNested:` + valueToStringAgent(this.ShowNested) + `,`, + `ShowStandalone:` + valueToStringAgent(this.ShowStandalone) + `,`, + `}`, + }, "") + return s +} +func (this *Call_LaunchNestedContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_LaunchNestedContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CommandInfo", "mesos.CommandInfo", 1) + `,`, + `Container:` + strings.Replace(fmt.Sprintf("%v", this.Container), "ContainerInfo", "mesos.ContainerInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_WaitNestedContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_WaitNestedContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_KillNestedContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_KillNestedContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `Signal:` + valueToStringAgent(this.Signal) + `,`, + `}`, + }, "") + return s +} +func (this *Call_RemoveNestedContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_RemoveNestedContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_LaunchNestedContainerSession) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_LaunchNestedContainerSession{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CommandInfo", "mesos.CommandInfo", 1) + `,`, + `Container:` + strings.Replace(fmt.Sprintf("%v", this.Container), "ContainerInfo", "mesos.ContainerInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_AttachContainerInput) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_AttachContainerInput{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `ContainerID:` + strings.Replace(fmt.Sprintf("%v", this.ContainerID), "ContainerID", "mesos.ContainerID", 1) + `,`, + `ProcessIO:` + strings.Replace(fmt.Sprintf("%v", this.ProcessIO), "ProcessIO", "ProcessIO", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_AttachContainerOutput) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_AttachContainerOutput{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_LaunchContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_LaunchContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CommandInfo", "mesos.CommandInfo", 1) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "mesos.Resource", 1), `&`, ``, 1) + `,`, + `Container:` + strings.Replace(fmt.Sprintf("%v", this.Container), "ContainerInfo", "mesos.ContainerInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_WaitContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_WaitContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_KillContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_KillContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `Signal:` + valueToStringAgent(this.Signal) + `,`, + `}`, + }, "") + return s +} +func (this *Call_RemoveContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_RemoveContainer{`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_AddResourceProviderConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_AddResourceProviderConfig{`, + `Info:` + strings.Replace(strings.Replace(this.Info.String(), "ResourceProviderInfo", "mesos.ResourceProviderInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_UpdateResourceProviderConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_UpdateResourceProviderConfig{`, + `Info:` + strings.Replace(strings.Replace(this.Info.String(), "ResourceProviderInfo", "mesos.ResourceProviderInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Call_RemoveResourceProviderConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_RemoveResourceProviderConfig{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} +func (this *Call_PruneImages) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Call_PruneImages{`, + `ExcludedImages:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ExcludedImages), "Image", "mesos.Image", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `GetHealth:` + strings.Replace(fmt.Sprintf("%v", this.GetHealth), "Response_GetHealth", "Response_GetHealth", 1) + `,`, + `GetFlags:` + strings.Replace(fmt.Sprintf("%v", this.GetFlags), "Response_GetFlags", "Response_GetFlags", 1) + `,`, + `GetVersion:` + strings.Replace(fmt.Sprintf("%v", this.GetVersion), "Response_GetVersion", "Response_GetVersion", 1) + `,`, + `GetMetrics:` + strings.Replace(fmt.Sprintf("%v", this.GetMetrics), "Response_GetMetrics", "Response_GetMetrics", 1) + `,`, + `GetLoggingLevel:` + strings.Replace(fmt.Sprintf("%v", this.GetLoggingLevel), "Response_GetLoggingLevel", "Response_GetLoggingLevel", 1) + `,`, + `ListFiles:` + strings.Replace(fmt.Sprintf("%v", this.ListFiles), "Response_ListFiles", "Response_ListFiles", 1) + `,`, + `ReadFile:` + strings.Replace(fmt.Sprintf("%v", this.ReadFile), "Response_ReadFile", "Response_ReadFile", 1) + `,`, + `GetState:` + strings.Replace(fmt.Sprintf("%v", this.GetState), "Response_GetState", "Response_GetState", 1) + `,`, + `GetContainers:` + strings.Replace(fmt.Sprintf("%v", this.GetContainers), "Response_GetContainers", "Response_GetContainers", 1) + `,`, + `GetFrameworks:` + strings.Replace(fmt.Sprintf("%v", this.GetFrameworks), "Response_GetFrameworks", "Response_GetFrameworks", 1) + `,`, + `GetExecutors:` + strings.Replace(fmt.Sprintf("%v", this.GetExecutors), "Response_GetExecutors", "Response_GetExecutors", 1) + `,`, + `GetTasks:` + strings.Replace(fmt.Sprintf("%v", this.GetTasks), "Response_GetTasks", "Response_GetTasks", 1) + `,`, + `WaitNestedContainer:` + strings.Replace(fmt.Sprintf("%v", this.WaitNestedContainer), "Response_WaitNestedContainer", "Response_WaitNestedContainer", 1) + `,`, + `GetAgent:` + strings.Replace(fmt.Sprintf("%v", this.GetAgent), "Response_GetAgent", "Response_GetAgent", 1) + `,`, + `WaitContainer:` + strings.Replace(fmt.Sprintf("%v", this.WaitContainer), "Response_WaitContainer", "Response_WaitContainer", 1) + `,`, + `GetResourceProviders:` + strings.Replace(fmt.Sprintf("%v", this.GetResourceProviders), "Response_GetResourceProviders", "Response_GetResourceProviders", 1) + `,`, + `GetOperations:` + strings.Replace(fmt.Sprintf("%v", this.GetOperations), "Response_GetOperations", "Response_GetOperations", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetHealth) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetHealth{`, + `Healthy:` + fmt.Sprintf("%v", this.Healthy) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetFlags) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetFlags{`, + `Flags:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Flags), "Flag", "mesos.Flag", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetVersion) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetVersion{`, + `VersionInfo:` + strings.Replace(strings.Replace(this.VersionInfo.String(), "VersionInfo", "mesos.VersionInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetMetrics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetMetrics{`, + `Metrics:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Metrics), "Metric", "mesos.Metric", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetLoggingLevel) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetLoggingLevel{`, + `Level:` + fmt.Sprintf("%v", this.Level) + `,`, + `}`, + }, "") + return s +} +func (this *Response_ListFiles) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_ListFiles{`, + `FileInfos:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.FileInfos), "FileInfo", "mesos.FileInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_ReadFile) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_ReadFile{`, + `Size:` + fmt.Sprintf("%v", this.Size) + `,`, + `Data:` + valueToStringAgent(this.Data) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetState) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetState{`, + `GetTasks:` + strings.Replace(fmt.Sprintf("%v", this.GetTasks), "Response_GetTasks", "Response_GetTasks", 1) + `,`, + `GetExecutors:` + strings.Replace(fmt.Sprintf("%v", this.GetExecutors), "Response_GetExecutors", "Response_GetExecutors", 1) + `,`, + `GetFrameworks:` + strings.Replace(fmt.Sprintf("%v", this.GetFrameworks), "Response_GetFrameworks", "Response_GetFrameworks", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetContainers) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetContainers{`, + `Containers:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Containers), "Response_GetContainers_Container", "Response_GetContainers_Container", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetContainers_Container) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetContainers_Container{`, + `FrameworkID:` + strings.Replace(fmt.Sprintf("%v", this.FrameworkID), "FrameworkID", "mesos.FrameworkID", 1) + `,`, + `ExecutorID:` + strings.Replace(fmt.Sprintf("%v", this.ExecutorID), "ExecutorID", "mesos.ExecutorID", 1) + `,`, + `ExecutorName:` + valueToStringAgent(this.ExecutorName) + `,`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "mesos.ContainerID", 1), `&`, ``, 1) + `,`, + `ContainerStatus:` + strings.Replace(fmt.Sprintf("%v", this.ContainerStatus), "ContainerStatus", "mesos.ContainerStatus", 1) + `,`, + `ResourceStatistics:` + strings.Replace(fmt.Sprintf("%v", this.ResourceStatistics), "ResourceStatistics", "mesos.ResourceStatistics", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetFrameworks) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetFrameworks{`, + `Frameworks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Frameworks), "Response_GetFrameworks_Framework", "Response_GetFrameworks_Framework", 1), `&`, ``, 1) + `,`, + `CompletedFrameworks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.CompletedFrameworks), "Response_GetFrameworks_Framework", "Response_GetFrameworks_Framework", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetFrameworks_Framework) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetFrameworks_Framework{`, + `FrameworkInfo:` + strings.Replace(strings.Replace(this.FrameworkInfo.String(), "FrameworkInfo", "mesos.FrameworkInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetExecutors) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetExecutors{`, + `Executors:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Executors), "Response_GetExecutors_Executor", "Response_GetExecutors_Executor", 1), `&`, ``, 1) + `,`, + `CompletedExecutors:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.CompletedExecutors), "Response_GetExecutors_Executor", "Response_GetExecutors_Executor", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetExecutors_Executor) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetExecutors_Executor{`, + `ExecutorInfo:` + strings.Replace(strings.Replace(this.ExecutorInfo.String(), "ExecutorInfo", "mesos.ExecutorInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetOperations) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetOperations{`, + `Operations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Operations), "Operation", "mesos.Operation", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetTasks) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetTasks{`, + `PendingTasks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.PendingTasks), "Task", "mesos.Task", 1), `&`, ``, 1) + `,`, + `QueuedTasks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.QueuedTasks), "Task", "mesos.Task", 1), `&`, ``, 1) + `,`, + `LaunchedTasks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LaunchedTasks), "Task", "mesos.Task", 1), `&`, ``, 1) + `,`, + `TerminatedTasks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.TerminatedTasks), "Task", "mesos.Task", 1), `&`, ``, 1) + `,`, + `CompletedTasks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.CompletedTasks), "Task", "mesos.Task", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetAgent) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetAgent{`, + `AgentInfo:` + strings.Replace(fmt.Sprintf("%v", this.AgentInfo), "AgentInfo", "mesos.AgentInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetResourceProviders) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetResourceProviders{`, + `ResourceProviders:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ResourceProviders), "Response_GetResourceProviders_ResourceProvider", "Response_GetResourceProviders_ResourceProvider", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_GetResourceProviders_ResourceProvider) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_GetResourceProviders_ResourceProvider{`, + `ResourceProviderInfo:` + strings.Replace(strings.Replace(this.ResourceProviderInfo.String(), "ResourceProviderInfo", "mesos.ResourceProviderInfo", 1), `&`, ``, 1) + `,`, + `TotalResources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.TotalResources), "Resource", "mesos.Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Response_WaitNestedContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_WaitNestedContainer{`, + `ExitStatus:` + valueToStringAgent(this.ExitStatus) + `,`, + `State:` + valueToStringAgent(this.State) + `,`, + `Reason:` + valueToStringAgent(this.Reason) + `,`, + `Limitation:` + strings.Replace(fmt.Sprintf("%v", this.Limitation), "TaskResourceLimitation", "mesos.TaskResourceLimitation", 1) + `,`, + `Message:` + valueToStringAgent(this.Message) + `,`, + `}`, + }, "") + return s +} +func (this *Response_WaitContainer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Response_WaitContainer{`, + `ExitStatus:` + valueToStringAgent(this.ExitStatus) + `,`, + `State:` + valueToStringAgent(this.State) + `,`, + `Reason:` + valueToStringAgent(this.Reason) + `,`, + `Limitation:` + strings.Replace(fmt.Sprintf("%v", this.Limitation), "TaskResourceLimitation", "mesos.TaskResourceLimitation", 1) + `,`, + `Message:` + valueToStringAgent(this.Message) + `,`, + `}`, + }, "") + return s +} +func (this *ProcessIO) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ProcessIO{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Data:` + strings.Replace(fmt.Sprintf("%v", this.Data), "ProcessIO_Data", "ProcessIO_Data", 1) + `,`, + `Control:` + strings.Replace(fmt.Sprintf("%v", this.Control), "ProcessIO_Control", "ProcessIO_Control", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ProcessIO_Data) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ProcessIO_Data{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Data:` + valueToStringAgent(this.Data) + `,`, + `}`, + }, "") + return s +} +func (this *ProcessIO_Control) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ProcessIO_Control{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `TTYInfo:` + strings.Replace(fmt.Sprintf("%v", this.TTYInfo), "TTYInfo", "mesos.TTYInfo", 1) + `,`, + `Heartbeat:` + strings.Replace(fmt.Sprintf("%v", this.Heartbeat), "ProcessIO_Control_Heartbeat", "ProcessIO_Control_Heartbeat", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ProcessIO_Control_Heartbeat) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ProcessIO_Control_Heartbeat{`, + `Interval:` + strings.Replace(fmt.Sprintf("%v", this.Interval), "DurationInfo", "mesos.DurationInfo", 1) + `,`, + `}`, + }, "") + return s +} +func valueToStringAgent(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Call) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Call: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Call: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Call_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetMetrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetMetrics == nil { + m.GetMetrics = &Call_GetMetrics{} + } + if err := m.GetMetrics.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SetLoggingLevel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SetLoggingLevel == nil { + m.SetLoggingLevel = &Call_SetLoggingLevel{} + } + if err := m.SetLoggingLevel.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListFiles", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ListFiles == nil { + m.ListFiles = &Call_ListFiles{} + } + if err := m.ListFiles.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadFile", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReadFile == nil { + m.ReadFile = &Call_ReadFile{} + } + if err := m.ReadFile.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LaunchNestedContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LaunchNestedContainer == nil { + m.LaunchNestedContainer = &Call_LaunchNestedContainer{} + } + if err := m.LaunchNestedContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitNestedContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WaitNestedContainer == nil { + m.WaitNestedContainer = &Call_WaitNestedContainer{} + } + if err := m.WaitNestedContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KillNestedContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.KillNestedContainer == nil { + m.KillNestedContainer = &Call_KillNestedContainer{} + } + if err := m.KillNestedContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LaunchNestedContainerSession", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LaunchNestedContainerSession == nil { + m.LaunchNestedContainerSession = &Call_LaunchNestedContainerSession{} + } + if err := m.LaunchNestedContainerSession.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AttachContainerInput", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AttachContainerInput == nil { + m.AttachContainerInput = &Call_AttachContainerInput{} + } + if err := m.AttachContainerInput.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AttachContainerOutput", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AttachContainerOutput == nil { + m.AttachContainerOutput = &Call_AttachContainerOutput{} + } + if err := m.AttachContainerOutput.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RemoveNestedContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RemoveNestedContainer == nil { + m.RemoveNestedContainer = &Call_RemoveNestedContainer{} + } + if err := m.RemoveNestedContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LaunchContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LaunchContainer == nil { + m.LaunchContainer = &Call_LaunchContainer{} + } + if err := m.LaunchContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WaitContainer == nil { + m.WaitContainer = &Call_WaitContainer{} + } + if err := m.WaitContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KillContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.KillContainer == nil { + m.KillContainer = &Call_KillContainer{} + } + if err := m.KillContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RemoveContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RemoveContainer == nil { + m.RemoveContainer = &Call_RemoveContainer{} + } + if err := m.RemoveContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AddResourceProviderConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AddResourceProviderConfig == nil { + m.AddResourceProviderConfig = &Call_AddResourceProviderConfig{} + } + if err := m.AddResourceProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdateResourceProviderConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UpdateResourceProviderConfig == nil { + m.UpdateResourceProviderConfig = &Call_UpdateResourceProviderConfig{} + } + if err := m.UpdateResourceProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RemoveResourceProviderConfig", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RemoveResourceProviderConfig == nil { + m.RemoveResourceProviderConfig = &Call_RemoveResourceProviderConfig{} + } + if err := m.RemoveResourceProviderConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetContainers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetContainers == nil { + m.GetContainers = &Call_GetContainers{} + } + if err := m.GetContainers.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PruneImages", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PruneImages == nil { + m.PruneImages = &Call_PruneImages{} + } + if err := m.PruneImages.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_GetMetrics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetMetrics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetMetrics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeout", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Timeout == nil { + m.Timeout = &mesos.DurationInfo{} + } + if err := m.Timeout.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_SetLoggingLevel) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SetLoggingLevel: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetLoggingLevel: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + m.Level = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Level |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Duration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("level") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("duration") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_ListFiles) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListFiles: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListFiles: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("path") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_ReadFile) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadFile: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadFile: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Offset", wireType) + } + m.Offset = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Offset |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Length", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Length = &v + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("path") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("offset") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_GetContainers) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetContainers: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetContainers: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ShowNested", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ShowNested = &b + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ShowStandalone", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ShowStandalone = &b + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_LaunchNestedContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LaunchNestedContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LaunchNestedContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &mesos.CommandInfo{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Container == nil { + m.Container = &mesos.ContainerInfo{} + } + if err := m.Container.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_WaitNestedContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WaitNestedContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WaitNestedContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_KillNestedContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KillNestedContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KillNestedContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Signal", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Signal = &v + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_RemoveNestedContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RemoveNestedContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RemoveNestedContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_LaunchNestedContainerSession) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LaunchNestedContainerSession: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LaunchNestedContainerSession: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &mesos.CommandInfo{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Container == nil { + m.Container = &mesos.ContainerInfo{} + } + if err := m.Container.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_AttachContainerInput) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AttachContainerInput: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AttachContainerInput: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Call_AttachContainerInput_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ContainerID == nil { + m.ContainerID = &mesos.ContainerID{} + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProcessIO", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ProcessIO == nil { + m.ProcessIO = &ProcessIO{} + } + if err := m.ProcessIO.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_AttachContainerOutput) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AttachContainerOutput: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AttachContainerOutput: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_LaunchContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LaunchContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LaunchContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &mesos.CommandInfo{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, mesos.Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Container == nil { + m.Container = &mesos.ContainerInfo{} + } + if err := m.Container.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_WaitContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WaitContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WaitContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_KillContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KillContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KillContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Signal", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Signal = &v + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_RemoveContainer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RemoveContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RemoveContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_AddResourceProviderConfig) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AddResourceProviderConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddResourceProviderConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Info.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("info") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_UpdateResourceProviderConfig) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UpdateResourceProviderConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateResourceProviderConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Info.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("info") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_RemoveResourceProviderConfig) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RemoveResourceProviderConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RemoveResourceProviderConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Call_PruneImages) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PruneImages: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PruneImages: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExcludedImages", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExcludedImages = append(m.ExcludedImages, mesos.Image{}) + if err := m.ExcludedImages[len(m.ExcludedImages)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Response: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Response: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Response_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetHealth", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetHealth == nil { + m.GetHealth = &Response_GetHealth{} + } + if err := m.GetHealth.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetFlags", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetFlags == nil { + m.GetFlags = &Response_GetFlags{} + } + if err := m.GetFlags.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetVersion", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetVersion == nil { + m.GetVersion = &Response_GetVersion{} + } + if err := m.GetVersion.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetMetrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetMetrics == nil { + m.GetMetrics = &Response_GetMetrics{} + } + if err := m.GetMetrics.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetLoggingLevel", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetLoggingLevel == nil { + m.GetLoggingLevel = &Response_GetLoggingLevel{} + } + if err := m.GetLoggingLevel.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListFiles", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ListFiles == nil { + m.ListFiles = &Response_ListFiles{} + } + if err := m.ListFiles.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadFile", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReadFile == nil { + m.ReadFile = &Response_ReadFile{} + } + if err := m.ReadFile.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetState == nil { + m.GetState = &Response_GetState{} + } + if err := m.GetState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetContainers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetContainers == nil { + m.GetContainers = &Response_GetContainers{} + } + if err := m.GetContainers.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetFrameworks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetFrameworks == nil { + m.GetFrameworks = &Response_GetFrameworks{} + } + if err := m.GetFrameworks.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetExecutors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetExecutors == nil { + m.GetExecutors = &Response_GetExecutors{} + } + if err := m.GetExecutors.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetTasks == nil { + m.GetTasks = &Response_GetTasks{} + } + if err := m.GetTasks.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitNestedContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WaitNestedContainer == nil { + m.WaitNestedContainer = &Response_WaitNestedContainer{} + } + if err := m.WaitNestedContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetAgent", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetAgent == nil { + m.GetAgent = &Response_GetAgent{} + } + if err := m.GetAgent.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WaitContainer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WaitContainer == nil { + m.WaitContainer = &Response_WaitContainer{} + } + if err := m.WaitContainer.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 17: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetResourceProviders", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetResourceProviders == nil { + m.GetResourceProviders = &Response_GetResourceProviders{} + } + if err := m.GetResourceProviders.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetOperations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetOperations == nil { + m.GetOperations = &Response_GetOperations{} + } + if err := m.GetOperations.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetHealth) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetHealth: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetHealth: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Healthy", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Healthy = bool(v != 0) + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("healthy") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetFlags) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetFlags: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetFlags: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Flags", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Flags = append(m.Flags, mesos.Flag{}) + if err := m.Flags[len(m.Flags)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetVersion) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetVersion: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetVersion: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VersionInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.VersionInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("version_info") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetMetrics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetMetrics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetMetrics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Metrics = append(m.Metrics, mesos.Metric{}) + if err := m.Metrics[len(m.Metrics)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetLoggingLevel) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetLoggingLevel: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetLoggingLevel: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + m.Level = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Level |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("level") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_ListFiles) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListFiles: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListFiles: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FileInfos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FileInfos = append(m.FileInfos, mesos.FileInfo{}) + if err := m.FileInfos[len(m.FileInfos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_ReadFile) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReadFile: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReadFile: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Size", wireType) + } + m.Size = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Size |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("size") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("data") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetTasks == nil { + m.GetTasks = &Response_GetTasks{} + } + if err := m.GetTasks.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetExecutors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetExecutors == nil { + m.GetExecutors = &Response_GetExecutors{} + } + if err := m.GetExecutors.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GetFrameworks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GetFrameworks == nil { + m.GetFrameworks = &Response_GetFrameworks{} + } + if err := m.GetFrameworks.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetContainers) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetContainers: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetContainers: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Containers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Containers = append(m.Containers, Response_GetContainers_Container{}) + if err := m.Containers[len(m.Containers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetContainers_Container) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Container: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Container: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.FrameworkID == nil { + m.FrameworkID = &mesos.FrameworkID{} + } + if err := m.FrameworkID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExecutorID == nil { + m.ExecutorID = &mesos.ExecutorID{} + } + if err := m.ExecutorID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ExecutorName = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ContainerStatus == nil { + m.ContainerStatus = &mesos.ContainerStatus{} + } + if err := m.ContainerStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceStatistics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ResourceStatistics == nil { + m.ResourceStatistics = &mesos.ResourceStatistics{} + } + if err := m.ResourceStatistics.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetFrameworks) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetFrameworks: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetFrameworks: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Frameworks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Frameworks = append(m.Frameworks, Response_GetFrameworks_Framework{}) + if err := m.Frameworks[len(m.Frameworks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletedFrameworks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CompletedFrameworks = append(m.CompletedFrameworks, Response_GetFrameworks_Framework{}) + if err := m.CompletedFrameworks[len(m.CompletedFrameworks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetFrameworks_Framework) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Framework: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Framework: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.FrameworkInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("framework_info") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetExecutors) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetExecutors: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetExecutors: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Executors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Executors = append(m.Executors, Response_GetExecutors_Executor{}) + if err := m.Executors[len(m.Executors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletedExecutors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CompletedExecutors = append(m.CompletedExecutors, Response_GetExecutors_Executor{}) + if err := m.CompletedExecutors[len(m.CompletedExecutors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetExecutors_Executor) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Executor: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Executor: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ExecutorInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("executor_info") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetOperations) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetOperations: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetOperations: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Operations = append(m.Operations, mesos.Operation{}) + if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetTasks) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetTasks: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetTasks: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PendingTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PendingTasks = append(m.PendingTasks, mesos.Task{}) + if err := m.PendingTasks[len(m.PendingTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QueuedTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.QueuedTasks = append(m.QueuedTasks, mesos.Task{}) + if err := m.QueuedTasks[len(m.QueuedTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LaunchedTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LaunchedTasks = append(m.LaunchedTasks, mesos.Task{}) + if err := m.LaunchedTasks[len(m.LaunchedTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TerminatedTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TerminatedTasks = append(m.TerminatedTasks, mesos.Task{}) + if err := m.TerminatedTasks[len(m.TerminatedTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletedTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CompletedTasks = append(m.CompletedTasks, mesos.Task{}) + if err := m.CompletedTasks[len(m.CompletedTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetAgent) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetAgent: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetAgent: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AgentInfo == nil { + m.AgentInfo = &mesos.AgentInfo{} + } + if err := m.AgentInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetResourceProviders) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GetResourceProviders: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetResourceProviders: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceProviders", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceProviders = append(m.ResourceProviders, Response_GetResourceProviders_ResourceProvider{}) + if err := m.ResourceProviders[len(m.ResourceProviders)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_GetResourceProviders_ResourceProvider) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceProvider: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceProvider: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceProviderInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceProviderInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalResources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TotalResources = append(m.TotalResources, mesos.Resource{}) + if err := m.TotalResources[len(m.TotalResources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("resource_provider_info") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_WaitNestedContainer) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WaitNestedContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WaitNestedContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExitStatus", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExitStatus = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var v mesos.TaskState + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (mesos.TaskState(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.State = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var v mesos.TaskStatus_Reason + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (mesos.TaskStatus_Reason(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Reason = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Limitation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Limitation == nil { + m.Limitation = &mesos.TaskResourceLimitation{} + } + if err := m.Limitation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Response_WaitContainer) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WaitContainer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WaitContainer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExitStatus", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExitStatus = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var v mesos.TaskState + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (mesos.TaskState(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.State = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var v mesos.TaskStatus_Reason + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (mesos.TaskStatus_Reason(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Reason = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Limitation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Limitation == nil { + m.Limitation = &mesos.TaskResourceLimitation{} + } + if err := m.Limitation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ProcessIO) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ProcessIO: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProcessIO: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (ProcessIO_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Data == nil { + m.Data = &ProcessIO_Data{} + } + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Control", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Control == nil { + m.Control = &ProcessIO_Control{} + } + if err := m.Control.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ProcessIO_Data) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Data: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Data: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (ProcessIO_Data_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ProcessIO_Control) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Control: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Control: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (ProcessIO_Control_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TTYInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TTYInfo == nil { + m.TTYInfo = &mesos.TTYInfo{} + } + if err := m.TTYInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Heartbeat", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Heartbeat == nil { + m.Heartbeat = &ProcessIO_Control_Heartbeat{} + } + if err := m.Heartbeat.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ProcessIO_Control_Heartbeat) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Heartbeat: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Heartbeat: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Interval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAgent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAgent + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Interval == nil { + m.Interval = &mesos.DurationInfo{} + } + if err := m.Interval.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAgent(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthAgent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipAgent(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAgent + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAgent + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAgent + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthAgent + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowAgent + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipAgent(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthAgent = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowAgent = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("agent/agent.proto", fileDescriptorAgent) } + +var fileDescriptorAgent = []byte{ + // 3053 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5a, 0x4d, 0x6c, 0x1b, 0xc7, + 0xf5, 0xf7, 0x52, 0x94, 0x44, 0x3e, 0x7e, 0xad, 0x46, 0x1f, 0xa6, 0xd7, 0x0a, 0xa5, 0xbf, 0x8c, + 0x24, 0xfe, 0xd7, 0xb5, 0xe5, 0x3a, 0x89, 0x1b, 0x44, 0x89, 0x51, 0x4a, 0x5c, 0xc9, 0xb4, 0x69, + 0x52, 0x9d, 0x5d, 0xd9, 0x4d, 0xda, 0x80, 0x5d, 0x8b, 0x2b, 0x6a, 0x61, 0x92, 0xcb, 0xee, 0x2e, + 0xe5, 0xb8, 0xa7, 0x1e, 0x7b, 0x6b, 0x0f, 0x05, 0x7a, 0xe9, 0xa1, 0x40, 0x2f, 0x01, 0xda, 0x73, + 0xdb, 0x53, 0xd1, 0x4b, 0x81, 0x14, 0xe8, 0x21, 0xc7, 0x02, 0x29, 0x8c, 0x5a, 0xb9, 0xb4, 0xa7, + 0xe6, 0xd0, 0x43, 0x4f, 0x45, 0x31, 0x5f, 0xbb, 0x4b, 0xee, 0x2e, 0xed, 0xb8, 0x46, 0x8a, 0xf6, + 0x22, 0xec, 0xbc, 0xf9, 0xbd, 0x37, 0x33, 0x6f, 0x66, 0xde, 0x7b, 0xf3, 0xa3, 0x60, 0xc1, 0xe8, + 0x9a, 0x03, 0x6f, 0x93, 0xfe, 0xbd, 0x32, 0x74, 0x6c, 0xcf, 0x46, 0xb9, 0xbe, 0xe9, 0xda, 0xee, + 0x15, 0x2a, 0x52, 0xae, 0x76, 0x2d, 0xef, 0x78, 0x74, 0xff, 0xca, 0xa1, 0xdd, 0xdf, 0xa4, 0x72, + 0xf6, 0xf7, 0x72, 0xd7, 0xde, 0x34, 0x86, 0xd6, 0xe6, 0xc9, 0x57, 0x36, 0x7b, 0xd6, 0x7d, 0x26, + 0x63, 0xea, 0xca, 0xe5, 0x90, 0x46, 0xd7, 0xee, 0xda, 0x9b, 0x54, 0x7c, 0x7f, 0x74, 0x44, 0x5b, + 0xb4, 0x41, 0xbf, 0x18, 0x7c, 0xe3, 0x93, 0x57, 0x20, 0xbd, 0x63, 0xf4, 0x7a, 0xe8, 0x2a, 0xa4, + 0xbd, 0x47, 0x43, 0xb3, 0x2c, 0xad, 0x4b, 0x17, 0x8b, 0xd7, 0x56, 0xae, 0x84, 0x66, 0x71, 0x85, + 0x00, 0xae, 0xe8, 0x8f, 0x86, 0xe6, 0x76, 0xfa, 0xa3, 0xc7, 0x6b, 0x67, 0x30, 0x45, 0xa2, 0x77, + 0x20, 0xd7, 0x35, 0xbd, 0x76, 0xdf, 0xf4, 0x1c, 0xeb, 0xd0, 0x2d, 0xa7, 0xd6, 0xa5, 0x8b, 0xb9, + 0x6b, 0xab, 0x51, 0xc5, 0x3d, 0xd3, 0xbb, 0xc3, 0x30, 0x18, 0xba, 0xfe, 0x37, 0xba, 0x03, 0x0b, + 0xae, 0xe9, 0xb5, 0x7b, 0x76, 0xb7, 0x6b, 0x0d, 0xba, 0xed, 0x9e, 0x79, 0x62, 0xf6, 0xca, 0x33, + 0xd4, 0xc8, 0xff, 0x45, 0x8d, 0x68, 0xa6, 0xd7, 0x60, 0xc8, 0x06, 0x01, 0xe2, 0x92, 0x3b, 0x2e, + 0x40, 0x6f, 0x01, 0xf4, 0x2c, 0xd7, 0x6b, 0x1f, 0x59, 0x3d, 0xd3, 0x2d, 0xa7, 0xa9, 0x9d, 0xf3, + 0x51, 0x3b, 0x0d, 0xcb, 0xf5, 0x76, 0x09, 0x04, 0x67, 0x7b, 0xe2, 0x13, 0x7d, 0x15, 0xb2, 0x8e, + 0x69, 0x74, 0xa8, 0x6e, 0x79, 0x96, 0xaa, 0x2a, 0x51, 0x55, 0x6c, 0x1a, 0x1d, 0x82, 0xc7, 0x19, + 0x87, 0x7f, 0xa1, 0x43, 0x38, 0xdb, 0x33, 0x46, 0x83, 0xc3, 0xe3, 0xf6, 0xc0, 0x74, 0x3d, 0xb3, + 0xd3, 0x3e, 0xb4, 0x07, 0x9e, 0x61, 0x0d, 0x4c, 0xa7, 0x3c, 0x47, 0xcd, 0xbc, 0x1a, 0x33, 0x03, + 0xaa, 0xd0, 0xa4, 0xf8, 0x1d, 0x01, 0xdf, 0x4e, 0x95, 0x25, 0xbc, 0xdc, 0x8b, 0xeb, 0x42, 0xef, + 0xc3, 0xf2, 0x43, 0xc3, 0xf2, 0xa2, 0x43, 0xcc, 0xd3, 0x21, 0x5e, 0x8e, 0x0e, 0x71, 0xcf, 0xb0, + 0xbc, 0xb8, 0x01, 0x16, 0x1f, 0x46, 0x3b, 0x88, 0xf9, 0x07, 0x56, 0xaf, 0x17, 0x35, 0x9f, 0x49, + 0x32, 0x7f, 0xdb, 0xea, 0xf5, 0x62, 0xcd, 0x3f, 0x88, 0x76, 0xa0, 0x11, 0xac, 0x25, 0xb8, 0xa8, + 0xed, 0x9a, 0xae, 0x6b, 0xd9, 0x83, 0x72, 0x96, 0x0e, 0x74, 0xe5, 0x19, 0x5d, 0xa5, 0x31, 0x2d, + 0xbc, 0xda, 0x9b, 0xd2, 0x8b, 0xbe, 0x05, 0x2b, 0x86, 0xe7, 0x19, 0x87, 0xc7, 0xa1, 0xf1, 0xac, + 0xc1, 0x70, 0xe4, 0x95, 0x81, 0x8e, 0xf6, 0x4a, 0x74, 0xb4, 0x2a, 0xc5, 0xfb, 0x96, 0xea, 0x04, + 0x8d, 0x97, 0x8c, 0x18, 0x29, 0x6a, 0xc3, 0xd9, 0x88, 0x75, 0x7b, 0xe4, 0x11, 0xf3, 0xb9, 0xa4, + 0x7d, 0x9f, 0x30, 0xdf, 0xa2, 0x70, 0xbc, 0x6c, 0xc4, 0x89, 0xc9, 0xc1, 0x72, 0xcc, 0xbe, 0x7d, + 0x62, 0x46, 0xb7, 0x25, 0x9f, 0x34, 0x00, 0xa6, 0x0a, 0xb1, 0x07, 0xcb, 0x89, 0xeb, 0x42, 0x0d, + 0x90, 0xf9, 0xd6, 0x04, 0xd6, 0x0b, 0x49, 0x17, 0x90, 0xed, 0x85, 0xaf, 0x8c, 0x4b, 0xbd, 0x71, + 0x01, 0xda, 0x85, 0x22, 0x3d, 0xa6, 0x81, 0xad, 0x22, 0xb5, 0xb5, 0x16, 0x7f, 0x3e, 0x03, 0x4b, + 0x85, 0x87, 0xe1, 0x26, 0xb1, 0x43, 0xcf, 0x63, 0x60, 0xa7, 0x94, 0x64, 0x87, 0x1c, 0xc4, 0x90, + 0x9d, 0x07, 0xe1, 0x26, 0x59, 0x1d, 0x77, 0x61, 0x60, 0x49, 0x4e, 0x5a, 0x1d, 0xf3, 0x5d, 0x68, + 0x75, 0xce, 0xb8, 0x00, 0xf5, 0x60, 0xd5, 0xe8, 0x74, 0xda, 0x8e, 0xe9, 0xda, 0x23, 0xe7, 0xd0, + 0x6c, 0x0f, 0x1d, 0xfb, 0xc4, 0xea, 0x98, 0x0e, 0x31, 0x7e, 0x64, 0x75, 0xcb, 0x0b, 0xd4, 0xf2, + 0xa5, 0x98, 0x6d, 0xef, 0x74, 0x30, 0x57, 0xda, 0xe7, 0x3a, 0x3b, 0x54, 0x05, 0x9f, 0x33, 0x92, + 0xba, 0xc8, 0xa5, 0x19, 0x0d, 0x3b, 0x86, 0x67, 0x26, 0x0f, 0x88, 0x92, 0x2e, 0xcd, 0x01, 0x55, + 0x4c, 0x18, 0x73, 0x75, 0x34, 0xa5, 0x97, 0x0c, 0xcb, 0x5d, 0x96, 0x38, 0xec, 0x62, 0xd2, 0xb0, + 0xcc, 0x83, 0x49, 0xc3, 0x3a, 0x53, 0x7a, 0xc9, 0x8e, 0x93, 0x44, 0xe2, 0x6f, 0x93, 0x5b, 0x5e, + 0x4a, 0xda, 0xf1, 0x3d, 0x33, 0x38, 0x29, 0x2e, 0x2e, 0x74, 0xc3, 0x4d, 0xf4, 0x35, 0xc8, 0x0f, + 0x9d, 0xd1, 0xc0, 0x6c, 0x5b, 0x7d, 0xa3, 0x6b, 0xba, 0xe5, 0x65, 0x6a, 0xe5, 0xa5, 0xa8, 0x95, + 0x7d, 0x82, 0xaa, 0x53, 0x10, 0xce, 0x0d, 0x83, 0x86, 0xb2, 0x05, 0x10, 0x64, 0x2b, 0x74, 0x19, + 0xe6, 0x3d, 0xab, 0x6f, 0xda, 0x23, 0x8f, 0x66, 0xc5, 0xdc, 0xb5, 0x45, 0x6e, 0xaa, 0x36, 0x72, + 0x0c, 0xcf, 0xb2, 0x07, 0xf5, 0xc1, 0x91, 0x8d, 0x05, 0x46, 0xe9, 0x40, 0x69, 0x22, 0x4b, 0x21, + 0x05, 0x66, 0x59, 0x5e, 0x93, 0xd6, 0x53, 0x17, 0x0b, 0x3c, 0x7b, 0x32, 0x11, 0x7a, 0x03, 0x32, + 0x1d, 0x6e, 0xa7, 0x9c, 0x5a, 0x4f, 0x25, 0x98, 0xe7, 0x3a, 0x3e, 0x54, 0x79, 0x19, 0xb2, 0x7e, + 0x0e, 0x43, 0x65, 0x48, 0x0f, 0x0d, 0xef, 0x98, 0x9a, 0xcf, 0x8a, 0xe4, 0x4c, 0x24, 0xca, 0x7b, + 0x90, 0x11, 0xf9, 0x2a, 0x19, 0x85, 0x56, 0x61, 0xce, 0x3e, 0x3a, 0x72, 0x4d, 0x8f, 0xce, 0x20, + 0xcd, 0xfb, 0xb8, 0x0c, 0xad, 0xc0, 0x5c, 0xcf, 0x1c, 0x74, 0xbd, 0x63, 0x9a, 0x96, 0xd3, 0x98, + 0xb7, 0x94, 0x77, 0xa1, 0x30, 0xb6, 0x0f, 0x68, 0x0d, 0x72, 0xee, 0xb1, 0xfd, 0x90, 0xc7, 0x2a, + 0xea, 0xac, 0x0c, 0x06, 0x22, 0x62, 0x21, 0x07, 0xbd, 0x0a, 0x25, 0x0a, 0x70, 0x3d, 0x63, 0xd0, + 0x31, 0x7a, 0xf6, 0xc0, 0xa4, 0xe5, 0x42, 0x06, 0x17, 0x89, 0x58, 0xf3, 0xa5, 0xca, 0xef, 0x24, + 0x58, 0x8e, 0x8d, 0xfa, 0xe8, 0x16, 0xe4, 0x43, 0x91, 0xbc, 0x43, 0x17, 0x93, 0xbb, 0x86, 0xb8, + 0xcb, 0x82, 0xf8, 0x5c, 0xdb, 0x5e, 0x24, 0x8b, 0x38, 0x7d, 0xbc, 0x96, 0x0b, 0x09, 0x71, 0xce, + 0x57, 0xae, 0x77, 0xd0, 0x97, 0x61, 0xfe, 0xd0, 0xee, 0xf7, 0x8d, 0x41, 0x87, 0x57, 0x2d, 0x81, + 0x19, 0x2a, 0x65, 0xfb, 0xca, 0x21, 0xe8, 0x1a, 0x64, 0x83, 0x08, 0xc2, 0x0a, 0x94, 0xa5, 0xc8, + 0xb0, 0x44, 0x23, 0x80, 0x29, 0x06, 0x2c, 0xc6, 0x24, 0xe1, 0x17, 0xb9, 0x08, 0xe5, 0x11, 0x2c, + 0xc6, 0x24, 0xe2, 0x17, 0xea, 0xa7, 0x15, 0x98, 0x73, 0xad, 0xee, 0xc0, 0xe8, 0x51, 0x37, 0xcd, + 0x62, 0xde, 0x52, 0x0e, 0x61, 0x39, 0x36, 0xd9, 0xbc, 0xd0, 0xf5, 0xfd, 0x41, 0x82, 0xd5, 0x69, + 0x05, 0xc0, 0x7f, 0xd9, 0x89, 0xf8, 0x30, 0x05, 0x4b, 0x71, 0x15, 0x06, 0x52, 0xc7, 0x0a, 0xef, + 0x4b, 0xcf, 0x56, 0x97, 0x44, 0xab, 0xf1, 0xdd, 0x09, 0x6f, 0x4c, 0x2e, 0x23, 0xf0, 0x46, 0x69, + 0xaa, 0x27, 0x6a, 0x00, 0x43, 0xc7, 0x3e, 0x34, 0x5d, 0xb7, 0x6d, 0xd9, 0x7c, 0x71, 0xe3, 0xaf, + 0x81, 0x7d, 0xd6, 0x5d, 0x6f, 0x6d, 0x17, 0x4e, 0x1f, 0xaf, 0x65, 0xfd, 0x26, 0xce, 0x72, 0xc5, + 0xba, 0xbd, 0xb1, 0x05, 0x69, 0x32, 0x43, 0x94, 0x83, 0xf9, 0x83, 0xe6, 0xed, 0x66, 0xeb, 0x5e, + 0x53, 0x3e, 0x83, 0x64, 0xc8, 0xef, 0xb4, 0x9a, 0x7a, 0xb5, 0xde, 0x54, 0x71, 0xbb, 0x5e, 0x93, + 0x25, 0x54, 0x04, 0xd8, 0xc7, 0xad, 0x1d, 0x55, 0xd3, 0xda, 0xf5, 0x96, 0x9c, 0x52, 0xd2, 0xdf, + 0xff, 0x59, 0x45, 0x22, 0xc7, 0x2b, 0xb6, 0x58, 0x7a, 0xa1, 0xc7, 0xeb, 0xef, 0x12, 0x94, 0x26, + 0x6a, 0x9a, 0xff, 0xe0, 0x89, 0x7a, 0x8d, 0xbc, 0x40, 0x58, 0x72, 0x74, 0xcb, 0x33, 0xeb, 0x33, + 0x17, 0x73, 0xd7, 0x4a, 0x1c, 0x2f, 0x92, 0x26, 0xdf, 0xed, 0x00, 0x37, 0x7e, 0x0c, 0xd3, 0xcf, + 0x76, 0x0c, 0xbf, 0x09, 0x85, 0xb1, 0xea, 0xeb, 0x85, 0xfa, 0xd4, 0x85, 0xc2, 0x58, 0x49, 0xf6, + 0x85, 0x04, 0xa3, 0xf7, 0xa1, 0x34, 0x51, 0xbd, 0xbd, 0xd0, 0x35, 0x61, 0x38, 0x97, 0x58, 0xc2, + 0xa1, 0x37, 0x20, 0x6d, 0x0d, 0x8e, 0x6c, 0x3e, 0xc0, 0xf9, 0x89, 0x1d, 0x13, 0xe0, 0x50, 0x1e, + 0xa7, 0x70, 0xe5, 0x00, 0x56, 0xa7, 0x55, 0x69, 0xcf, 0x6b, 0x16, 0xc3, 0xea, 0xb4, 0x2a, 0x8c, + 0xd4, 0x01, 0x3c, 0xd2, 0x84, 0xea, 0x00, 0x1a, 0x3c, 0xca, 0x90, 0x1e, 0x18, 0x7d, 0x93, 0x56, + 0x01, 0x7e, 0x0f, 0x91, 0x28, 0xb7, 0x20, 0x17, 0xaa, 0x96, 0xd0, 0x16, 0x94, 0xcc, 0x0f, 0x0e, + 0x7b, 0xa3, 0x8e, 0xd9, 0x11, 0x55, 0x96, 0x44, 0x4f, 0x6b, 0x9e, 0x4f, 0x92, 0xe2, 0xb8, 0x85, + 0xa2, 0x80, 0x32, 0xe5, 0x8d, 0xbf, 0xcd, 0xc6, 0x45, 0x85, 0x22, 0xc0, 0x9e, 0xaa, 0xb7, 0x6f, + 0xaa, 0xd5, 0x86, 0x7e, 0x53, 0x96, 0x50, 0x01, 0xb2, 0xa4, 0xbd, 0xdb, 0xa8, 0xee, 0x69, 0x72, + 0x0a, 0x95, 0x20, 0x47, 0x9a, 0x77, 0x55, 0xac, 0xd5, 0x5b, 0x4d, 0x79, 0x46, 0x08, 0xee, 0xa8, + 0x3a, 0xae, 0xef, 0x68, 0x72, 0x1a, 0x2d, 0xc3, 0x02, 0x11, 0x34, 0x5a, 0x7b, 0x7b, 0xf5, 0xe6, + 0x5e, 0xbb, 0xa1, 0xde, 0x55, 0x1b, 0xf2, 0x2c, 0x11, 0x6b, 0x11, 0xf1, 0x1c, 0x19, 0xae, 0x51, + 0xd7, 0xf4, 0xf6, 0x6e, 0xbd, 0xa1, 0x6a, 0xf2, 0x3c, 0x19, 0x0e, 0xab, 0xd5, 0x1a, 0x6d, 0xcb, + 0x19, 0x31, 0xba, 0xa6, 0x57, 0x75, 0x55, 0xce, 0x22, 0x04, 0x45, 0xd2, 0xf4, 0xc3, 0x96, 0x26, + 0x83, 0x90, 0xed, 0xe2, 0xea, 0x1d, 0xf5, 0x5e, 0x0b, 0xdf, 0xd6, 0xe4, 0x1c, 0x5a, 0x80, 0x02, + 0x91, 0xa9, 0xdf, 0x50, 0x77, 0x0e, 0xf4, 0x16, 0xd6, 0xe4, 0xbc, 0x80, 0xb5, 0xf6, 0x55, 0x5c, + 0xd5, 0xeb, 0xad, 0xa6, 0x26, 0xaf, 0x09, 0xeb, 0x7a, 0x55, 0xbb, 0xad, 0xc9, 0x05, 0xd1, 0xac, + 0xee, 0xa9, 0x4d, 0x5d, 0x5e, 0x42, 0x0a, 0xac, 0x90, 0x26, 0x56, 0xb5, 0xd6, 0x01, 0xde, 0x51, + 0xdb, 0xfb, 0xb8, 0x75, 0xb7, 0x5e, 0x23, 0x83, 0x2a, 0x68, 0x0d, 0xce, 0x36, 0xaa, 0x07, 0xcd, + 0x9d, 0x9b, 0xed, 0xa6, 0xaa, 0xe9, 0x6a, 0x2d, 0x98, 0x92, 0x5c, 0x54, 0x52, 0x19, 0x09, 0xbd, + 0x04, 0xcb, 0xf7, 0xaa, 0x75, 0x3d, 0xda, 0x5d, 0x12, 0xdd, 0xb7, 0xeb, 0x8d, 0x46, 0xb4, 0x5b, + 0xa6, 0xdd, 0x6b, 0x70, 0x16, 0xab, 0x77, 0x5a, 0x77, 0xd5, 0x28, 0x60, 0x99, 0x02, 0x2e, 0xc0, + 0x5a, 0xc2, 0xf8, 0x6d, 0x4d, 0xd5, 0xe8, 0xd6, 0x2c, 0x90, 0x05, 0x54, 0x75, 0xbd, 0xba, 0x73, + 0x33, 0xd4, 0x5b, 0x6f, 0xee, 0x1f, 0xe8, 0x32, 0x42, 0xe7, 0xe1, 0x6c, 0xa4, 0xaf, 0x75, 0xa0, + 0x93, 0xce, 0x45, 0xb4, 0x04, 0x32, 0xb7, 0x1e, 0x8c, 0xbb, 0x42, 0x3c, 0x48, 0x97, 0x14, 0xc8, + 0xce, 0x12, 0x19, 0x5d, 0x47, 0x20, 0x2b, 0x13, 0x6d, 0x3e, 0xf9, 0x40, 0x7a, 0x0e, 0xad, 0xc3, + 0x6a, 0xb5, 0x56, 0x8b, 0x7a, 0x93, 0x80, 0x76, 0xeb, 0x7b, 0xf2, 0x79, 0xb2, 0xa6, 0x83, 0xfd, + 0x5a, 0x55, 0x57, 0x93, 0x41, 0xab, 0x04, 0xc4, 0x8d, 0x27, 0x82, 0x5e, 0x22, 0x99, 0x6d, 0x1f, + 0x1f, 0x34, 0xd5, 0x76, 0xfd, 0x4e, 0x75, 0x4f, 0xd5, 0xe4, 0x0a, 0xcb, 0x64, 0x1b, 0xbf, 0xbf, + 0x40, 0xca, 0x70, 0x77, 0x68, 0x0f, 0x5c, 0x13, 0xbd, 0x3e, 0x96, 0xe8, 0xc7, 0x09, 0x26, 0x01, + 0x8a, 0xe6, 0xf5, 0x1b, 0x00, 0xe4, 0x71, 0x74, 0x6c, 0x1a, 0x3d, 0xef, 0x98, 0xa7, 0x92, 0xb5, + 0x78, 0xdd, 0x3d, 0xd3, 0xbb, 0x49, 0x61, 0x38, 0xdb, 0x15, 0x9f, 0x68, 0x0b, 0x48, 0xa3, 0x7d, + 0xd4, 0x33, 0xba, 0x2e, 0x4f, 0xe7, 0x95, 0x44, 0xf5, 0x5d, 0x82, 0xc2, 0x99, 0x2e, 0xff, 0x42, + 0x55, 0x46, 0xf1, 0x9d, 0x98, 0x0e, 0x25, 0x6a, 0x58, 0x8e, 0x59, 0x4f, 0x54, 0xbf, 0xcb, 0x70, + 0x94, 0xe6, 0xe3, 0xdf, 0xc2, 0x84, 0x60, 0x09, 0x67, 0x9f, 0x62, 0x22, 0x8e, 0x29, 0xfc, 0x3a, + 0x2c, 0x74, 0x23, 0x4c, 0xe1, 0x5c, 0x0c, 0x3b, 0x15, 0x36, 0x34, 0xce, 0x16, 0x76, 0x27, 0x1e, + 0x66, 0x37, 0xc6, 0xd8, 0xc2, 0xf9, 0x69, 0x5e, 0x8d, 0x65, 0x0c, 0xb7, 0xc2, 0x8c, 0x61, 0x66, + 0x9a, 0x57, 0x63, 0x58, 0x43, 0xbe, 0x25, 0xae, 0x67, 0x78, 0x26, 0x27, 0xbf, 0x92, 0xb7, 0x44, + 0x23, 0x28, 0xba, 0x25, 0xf4, 0x0b, 0xdd, 0x8a, 0x3c, 0x96, 0x19, 0xa1, 0x75, 0x21, 0xd1, 0x42, + 0xf2, 0x83, 0x99, 0xdb, 0x3a, 0x72, 0x8c, 0xbe, 0xf9, 0xd0, 0x76, 0x1e, 0xb8, 0x9c, 0xbd, 0x4a, + 0xb6, 0xb5, 0xeb, 0x43, 0xa9, 0xad, 0xa0, 0x89, 0xf6, 0x80, 0x08, 0xda, 0xe6, 0x07, 0xe6, 0xe1, + 0xc8, 0xb3, 0x1d, 0x97, 0xf3, 0x54, 0x1b, 0x89, 0xa6, 0x54, 0x81, 0xc4, 0xf9, 0x6e, 0xa8, 0x25, + 0xbc, 0xe3, 0x19, 0xee, 0x03, 0x97, 0xd3, 0x51, 0xc9, 0xde, 0xd1, 0x09, 0x8a, 0x7a, 0x87, 0x7e, + 0x25, 0x73, 0xa5, 0x8c, 0x8b, 0xfa, 0xff, 0x78, 0x43, 0x31, 0x4f, 0xb5, 0x78, 0xae, 0x94, 0xcf, + 0x8d, 0xaa, 0x73, 0x5a, 0x2a, 0x79, 0x6e, 0x55, 0x22, 0xa1, 0x73, 0xa3, 0x5f, 0xc4, 0xdb, 0x13, + 0x04, 0x99, 0x3c, 0xcd, 0xdb, 0x53, 0x49, 0xb2, 0x6f, 0xc3, 0x0a, 0x99, 0x48, 0x84, 0xa6, 0x71, + 0x39, 0x11, 0xf5, 0xa5, 0xc4, 0x59, 0x4d, 0xd6, 0x06, 0x2e, 0x5e, 0xea, 0xc6, 0x48, 0xc5, 0xd9, + 0xb0, 0x87, 0x26, 0x23, 0x1e, 0x5c, 0xce, 0x38, 0x25, 0x9f, 0x8d, 0x96, 0x0f, 0xa5, 0x67, 0x23, + 0x68, 0x2a, 0x97, 0x20, 0xeb, 0xc7, 0x26, 0x54, 0x81, 0x79, 0x16, 0xcc, 0x1e, 0xd1, 0x42, 0x24, + 0xc3, 0xa3, 0x9d, 0x10, 0x2a, 0xaf, 0x41, 0x46, 0x44, 0x22, 0xf4, 0x2a, 0xcc, 0xb2, 0xc0, 0xc5, + 0x8a, 0x8c, 0x1c, 0x1f, 0x9b, 0x74, 0x0a, 0x32, 0x85, 0xf6, 0x2b, 0x75, 0x4a, 0xdc, 0x88, 0x98, + 0xb3, 0x05, 0x79, 0x1e, 0xb2, 0xda, 0xa1, 0x3a, 0x4a, 0xd4, 0x7f, 0x1c, 0x15, 0x2a, 0x9f, 0x72, + 0x27, 0x81, 0x28, 0xca, 0x01, 0x89, 0xd0, 0xc5, 0xe6, 0x50, 0xe0, 0x56, 0x18, 0x40, 0x4c, 0x9e, + 0x63, 0x94, 0xcb, 0x50, 0xda, 0x7b, 0x76, 0x0e, 0x48, 0xa9, 0x86, 0xc9, 0x9c, 0xd7, 0x01, 0x48, + 0x38, 0xa1, 0x53, 0x16, 0xa3, 0x89, 0x47, 0x00, 0x41, 0x84, 0x26, 0x9c, 0x3d, 0xe2, 0x6d, 0x57, + 0x79, 0x73, 0x9c, 0xe8, 0x71, 0xad, 0xef, 0xb2, 0x02, 0x4f, 0x90, 0x39, 0x54, 0x82, 0x10, 0xa4, + 0x3b, 0x86, 0x67, 0xd0, 0x02, 0x2f, 0x8f, 0xe9, 0xb7, 0xf2, 0x27, 0x89, 0x7a, 0x9a, 0x85, 0x95, + 0xb1, 0x5b, 0x27, 0x7d, 0xce, 0x5b, 0x17, 0xb9, 0xfb, 0xa9, 0xe7, 0xbc, 0xfb, 0xd1, 0x80, 0x34, + 0xf3, 0xbc, 0x01, 0x49, 0xf9, 0xe7, 0xcc, 0x24, 0x4d, 0xa5, 0x01, 0x84, 0xc2, 0x26, 0x73, 0xf0, + 0xe5, 0x67, 0x08, 0x9b, 0xc1, 0x8b, 0x81, 0xfb, 0x34, 0x64, 0x46, 0xf9, 0xf1, 0x0c, 0x64, 0xc3, + 0xe4, 0x75, 0xde, 0x9f, 0x3c, 0x7b, 0x79, 0x84, 0x9f, 0x7e, 0xfe, 0xec, 0xc4, 0x2b, 0x3c, 0x24, + 0xc0, 0x39, 0x5f, 0xb1, 0xde, 0x41, 0xdb, 0x90, 0x13, 0xde, 0x0c, 0x1e, 0xf3, 0x0b, 0xdc, 0x8c, + 0xf0, 0x57, 0xbd, 0xb6, 0x5d, 0x3c, 0x7d, 0xbc, 0x06, 0x41, 0x1b, 0x83, 0xd0, 0xaa, 0x77, 0xd0, + 0x05, 0x28, 0xf8, 0x36, 0x68, 0x75, 0x4f, 0x7c, 0x99, 0xc5, 0x79, 0x21, 0x6c, 0x1a, 0x7d, 0x33, + 0xf2, 0x54, 0x4a, 0xff, 0x1b, 0x2f, 0xb4, 0x2a, 0xc8, 0xa1, 0x1f, 0x77, 0x3c, 0xc3, 0x1b, 0x89, + 0x7c, 0xbf, 0x32, 0x69, 0x4f, 0xa3, 0xbd, 0xb8, 0x74, 0x38, 0x2e, 0x40, 0xb7, 0x60, 0xd1, 0x8f, + 0x69, 0xc4, 0x82, 0xe5, 0x7a, 0xe4, 0xea, 0xb1, 0x64, 0x7f, 0x6e, 0xe2, 0x21, 0xa4, 0xf9, 0x00, + 0x8c, 0x9c, 0x88, 0x4c, 0xf9, 0x49, 0x8a, 0x1e, 0x80, 0x50, 0x8e, 0xd2, 0x00, 0x42, 0x47, 0xeb, + 0x69, 0x07, 0x20, 0x50, 0x0c, 0x36, 0x4e, 0x1c, 0x80, 0xc0, 0x0c, 0x3a, 0x82, 0xa5, 0x43, 0xbb, + 0x3f, 0xec, 0x99, 0x24, 0xe1, 0x84, 0xcc, 0xa7, 0x9e, 0xdf, 0xfc, 0xa2, 0x6f, 0x30, 0x74, 0x9e, + 0x9b, 0x90, 0xf5, 0x5b, 0xa8, 0x0a, 0xc5, 0xd0, 0x39, 0x0b, 0x62, 0xdc, 0x52, 0xe4, 0xa4, 0x05, + 0x41, 0xa3, 0x70, 0x14, 0x16, 0x2a, 0x3f, 0x48, 0x41, 0x3e, 0x7c, 0x15, 0x51, 0x0b, 0xb2, 0xc1, + 0x0d, 0x66, 0xce, 0xb9, 0xf4, 0xf4, 0x1b, 0xec, 0x9f, 0x46, 0x11, 0x9a, 0x7c, 0x1b, 0xe8, 0x3e, + 0x04, 0x0b, 0x19, 0x0b, 0x0e, 0xcf, 0x69, 0x1a, 0xf9, 0xd6, 0x7c, 0x88, 0x72, 0x0b, 0x32, 0xa2, + 0x81, 0x6e, 0x84, 0x0e, 0x7c, 0xc8, 0x27, 0x8b, 0x93, 0xd7, 0x26, 0x70, 0x89, 0x7f, 0x17, 0xa8, + 0x47, 0xf6, 0xe8, 0x79, 0x09, 0xf2, 0x16, 0xba, 0x0e, 0x10, 0xca, 0x7f, 0xcc, 0x25, 0x32, 0xb7, + 0xe6, 0xc3, 0xc4, 0x91, 0x08, 0x90, 0xca, 0x2f, 0x52, 0x34, 0xb2, 0xb2, 0xe0, 0x78, 0x1d, 0x0a, + 0x43, 0x73, 0xd0, 0x21, 0x95, 0xab, 0x88, 0xae, 0xe1, 0x5c, 0x46, 0x40, 0x62, 0x36, 0x1c, 0xc7, + 0xf4, 0x5e, 0x87, 0xfc, 0x77, 0x46, 0xe6, 0xc8, 0xec, 0x70, 0xb5, 0x54, 0x92, 0x5a, 0x8e, 0xc1, + 0x98, 0xd6, 0x9b, 0x50, 0x64, 0x3f, 0xcc, 0xf9, 0x7a, 0x33, 0x49, 0x7a, 0x05, 0x01, 0x64, 0x9a, + 0x6f, 0x83, 0xec, 0x99, 0x4e, 0xdf, 0x1a, 0x18, 0x9e, 0xaf, 0x9b, 0x4e, 0xd2, 0x2d, 0x05, 0x50, + 0xa6, 0xfd, 0x16, 0x94, 0x82, 0xbd, 0x66, 0xca, 0xb3, 0x49, 0xca, 0x45, 0x1f, 0x49, 0x75, 0x95, + 0x2d, 0xea, 0x2d, 0x56, 0x24, 0x6d, 0x02, 0xd0, 0x13, 0x21, 0x36, 0x50, 0x0a, 0xb9, 0x9c, 0x22, + 0x18, 0xa1, 0x65, 0x88, 0x4f, 0xe5, 0x97, 0x29, 0x58, 0x8a, 0x2b, 0x6b, 0xd0, 0x10, 0x50, 0x4c, + 0x79, 0xc4, 0x9c, 0xbf, 0xf5, 0xec, 0xe5, 0x51, 0x84, 0x76, 0xe1, 0x8b, 0x58, 0x70, 0x26, 0x91, + 0xca, 0xcf, 0x25, 0x90, 0x27, 0xd1, 0xe8, 0x1e, 0xac, 0x44, 0x7f, 0x4c, 0xfb, 0x7c, 0xec, 0xce, + 0x92, 0x13, 0xd3, 0x87, 0x6e, 0x40, 0xc9, 0xb3, 0x3d, 0xa3, 0xd7, 0x0e, 0x88, 0xc3, 0xd4, 0x34, + 0xe2, 0xb0, 0x48, 0xd1, 0x42, 0xe8, 0x2a, 0x7f, 0x95, 0xe2, 0x7f, 0xa3, 0x58, 0x23, 0xa9, 0xc7, + 0xf2, 0x44, 0x00, 0x97, 0x28, 0xd9, 0x06, 0x44, 0xc4, 0x63, 0xf4, 0x2b, 0x30, 0xcb, 0x9e, 0x2e, + 0x29, 0xfa, 0x90, 0x95, 0x43, 0x1b, 0xcc, 0x1e, 0x2b, 0xac, 0x1b, 0x5d, 0x85, 0x39, 0xc7, 0x34, + 0x5c, 0x7b, 0x40, 0x13, 0x4f, 0xf1, 0x5a, 0x79, 0x02, 0x38, 0x22, 0x53, 0x24, 0xfd, 0x98, 0xe3, + 0xd0, 0x3b, 0xe4, 0x55, 0xd6, 0xb7, 0x3c, 0xf6, 0xa3, 0x58, 0x7a, 0xec, 0xe7, 0x3b, 0xa2, 0x25, + 0x26, 0xdf, 0xf0, 0x41, 0x38, 0xa4, 0x80, 0xca, 0xa4, 0x56, 0x73, 0x5d, 0xa3, 0xcb, 0xfe, 0x89, + 0x23, 0x8b, 0x45, 0x53, 0xf9, 0x54, 0x9a, 0xa4, 0x3d, 0xff, 0x07, 0x57, 0xb9, 0xf1, 0x49, 0xea, + 0x8b, 0xe4, 0xd7, 0xc6, 0x89, 0xb4, 0xb9, 0x71, 0x22, 0x6d, 0x7e, 0x9c, 0x48, 0xcb, 0xc4, 0x10, + 0x69, 0xd9, 0x18, 0x22, 0x0d, 0xa2, 0x44, 0x5a, 0x2e, 0x86, 0x48, 0x5b, 0x18, 0x27, 0xd2, 0xf2, + 0xe3, 0x44, 0x5a, 0x71, 0x0a, 0x91, 0x26, 0x27, 0xf3, 0x64, 0x05, 0xca, 0x73, 0x45, 0x39, 0xa7, + 0x12, 0xe7, 0x72, 0x7e, 0x35, 0x0b, 0xc1, 0x6f, 0x1d, 0xe8, 0x8d, 0x31, 0x32, 0xe7, 0x7c, 0xfc, + 0x0f, 0x24, 0x51, 0x36, 0x67, 0xd3, 0xaf, 0xc3, 0xa3, 0xff, 0x9f, 0x14, 0xa8, 0xd5, 0x0c, 0xcf, + 0x60, 0x45, 0x3a, 0x7a, 0x13, 0xe6, 0x49, 0x8d, 0xe4, 0xd8, 0xbd, 0x58, 0xf2, 0x26, 0xd0, 0xd9, + 0x61, 0x28, 0x2c, 0xe0, 0xca, 0x8f, 0x24, 0x48, 0x13, 0x43, 0xe8, 0xad, 0xb1, 0xa9, 0xae, 0x4f, + 0x19, 0x33, 0x3a, 0x5f, 0x14, 0x9a, 0x2f, 0x7f, 0x37, 0x6c, 0xbc, 0x1d, 0x77, 0xca, 0xb2, 0x30, + 0xab, 0xe9, 0xb5, 0x7a, 0x53, 0x96, 0x10, 0xc0, 0x9c, 0xa6, 0xd7, 0x5a, 0x07, 0xba, 0x9c, 0xe2, + 0xdf, 0x2a, 0xc6, 0xf2, 0x0c, 0xff, 0x71, 0xe7, 0x37, 0x29, 0x98, 0xe7, 0x73, 0x45, 0xef, 0x8c, + 0xcd, 0xec, 0xc2, 0xf4, 0x95, 0x45, 0x27, 0x77, 0x1d, 0x32, 0x9e, 0xf7, 0x88, 0x05, 0x53, 0xe6, + 0xd0, 0xa2, 0xb8, 0x46, 0xfa, 0xbb, 0x34, 0x7e, 0xe6, 0x4e, 0x1f, 0xaf, 0xcd, 0xf3, 0x06, 0x9e, + 0xf7, 0xbc, 0x47, 0x34, 0x72, 0xee, 0x42, 0xf6, 0xd8, 0x34, 0x1c, 0xef, 0xbe, 0x69, 0x78, 0xdc, + 0xab, 0x17, 0x9f, 0x32, 0xf6, 0x4d, 0x81, 0xc7, 0x81, 0xaa, 0xf2, 0x36, 0x64, 0x7d, 0x39, 0xda, + 0x84, 0x8c, 0x35, 0xf0, 0x4c, 0xe7, 0xc4, 0xe8, 0x4d, 0xfb, 0x6f, 0x01, 0x1f, 0xb4, 0x71, 0x3d, + 0xce, 0x8d, 0x79, 0xc8, 0xe8, 0xfa, 0xbb, 0xed, 0x7a, 0x73, 0xb7, 0xc5, 0xae, 0xea, 0x4d, 0xb5, + 0x8a, 0xf5, 0x6d, 0xb5, 0xaa, 0x8b, 0x5f, 0xc7, 0x36, 0xae, 0xc6, 0xe9, 0x65, 0x20, 0x5d, 0xab, + 0xea, 0x55, 0x59, 0x22, 0x62, 0x72, 0x76, 0x71, 0xab, 0x21, 0x34, 0xb6, 0x77, 0x3e, 0x7e, 0x52, + 0x39, 0xf3, 0xc7, 0x27, 0x95, 0x33, 0x7f, 0x7e, 0x52, 0x91, 0x3e, 0x7b, 0x52, 0x91, 0xfe, 0xf1, + 0xa4, 0x22, 0x7d, 0xef, 0xb4, 0x22, 0x7d, 0x78, 0x5a, 0x91, 0x7e, 0x7d, 0x5a, 0x91, 0x7e, 0x7b, + 0x5a, 0x91, 0x3e, 0x3a, 0xad, 0x48, 0x1f, 0x9f, 0x56, 0xa4, 0xbf, 0x9c, 0x56, 0xce, 0x7c, 0x76, + 0x5a, 0x91, 0x7e, 0xf8, 0x69, 0xe5, 0xcc, 0x4f, 0x3f, 0xad, 0x48, 0xef, 0xcd, 0x52, 0x9f, 0xfc, + 0x2b, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x44, 0x30, 0x4d, 0xaa, 0x28, 0x00, 0x00, +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb_ffjson.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb_ffjson.go new file mode 100644 index 00000000..680617ae --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.pb_ffjson.go @@ -0,0 +1,15157 @@ +// DO NOT EDIT! +// Code generated by ffjson +// source: agent/agent.pb.go +// DO NOT EDIT! + +package agent + +import ( + "bytes" + "encoding/base64" + "errors" + "fmt" + "github.com/mesos/mesos-go/api/v1/lib" + fflib "github.com/pquerna/ffjson/fflib/v1" + "reflect" +) + +func (mj *Call) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.GetMetrics != nil { + if true { + buf.WriteString(`"get_metrics":`) + + { + + err = mj.GetMetrics.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.SetLoggingLevel != nil { + if true { + buf.WriteString(`"set_logging_level":`) + + { + + err = mj.SetLoggingLevel.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ListFiles != nil { + if true { + buf.WriteString(`"list_files":`) + + { + + err = mj.ListFiles.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ReadFile != nil { + if true { + buf.WriteString(`"read_file":`) + + { + + err = mj.ReadFile.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetContainers != nil { + if true { + buf.WriteString(`"get_containers":`) + + { + + err = mj.GetContainers.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.LaunchNestedContainer != nil { + if true { + buf.WriteString(`"launch_nested_container":`) + + { + + err = mj.LaunchNestedContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.WaitNestedContainer != nil { + if true { + buf.WriteString(`"wait_nested_container":`) + + { + + err = mj.WaitNestedContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.KillNestedContainer != nil { + if true { + buf.WriteString(`"kill_nested_container":`) + + { + + err = mj.KillNestedContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.RemoveNestedContainer != nil { + if true { + buf.WriteString(`"remove_nested_container":`) + + { + + err = mj.RemoveNestedContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.LaunchNestedContainerSession != nil { + if true { + buf.WriteString(`"launch_nested_container_session":`) + + { + + err = mj.LaunchNestedContainerSession.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.AttachContainerInput != nil { + if true { + buf.WriteString(`"attach_container_input":`) + + { + + err = mj.AttachContainerInput.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.AttachContainerOutput != nil { + if true { + buf.WriteString(`"attach_container_output":`) + + { + + err = mj.AttachContainerOutput.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.LaunchContainer != nil { + if true { + buf.WriteString(`"launch_container":`) + + { + + err = mj.LaunchContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.WaitContainer != nil { + if true { + buf.WriteString(`"wait_container":`) + + { + + err = mj.WaitContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.KillContainer != nil { + if true { + buf.WriteString(`"kill_container":`) + + { + + err = mj.KillContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.RemoveContainer != nil { + if true { + buf.WriteString(`"remove_container":`) + + { + + err = mj.RemoveContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.AddResourceProviderConfig != nil { + if true { + buf.WriteString(`"add_resource_provider_config":`) + + { + + err = mj.AddResourceProviderConfig.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.UpdateResourceProviderConfig != nil { + if true { + buf.WriteString(`"update_resource_provider_config":`) + + { + + err = mj.UpdateResourceProviderConfig.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.RemoveResourceProviderConfig != nil { + if true { + buf.WriteString(`"remove_resource_provider_config":`) + + { + + err = mj.RemoveResourceProviderConfig.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.PruneImages != nil { + if true { + buf.WriteString(`"prune_images":`) + + { + + err = mj.PruneImages.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Callbase = iota + ffj_t_Callno_such_key + + ffj_t_Call_Type + + ffj_t_Call_GetMetrics + + ffj_t_Call_SetLoggingLevel + + ffj_t_Call_ListFiles + + ffj_t_Call_ReadFile + + ffj_t_Call_GetContainers + + ffj_t_Call_LaunchNestedContainer + + ffj_t_Call_WaitNestedContainer + + ffj_t_Call_KillNestedContainer + + ffj_t_Call_RemoveNestedContainer + + ffj_t_Call_LaunchNestedContainerSession + + ffj_t_Call_AttachContainerInput + + ffj_t_Call_AttachContainerOutput + + ffj_t_Call_LaunchContainer + + ffj_t_Call_WaitContainer + + ffj_t_Call_KillContainer + + ffj_t_Call_RemoveContainer + + ffj_t_Call_AddResourceProviderConfig + + ffj_t_Call_UpdateResourceProviderConfig + + ffj_t_Call_RemoveResourceProviderConfig + + ffj_t_Call_PruneImages +) + +var ffj_key_Call_Type = []byte("type") + +var ffj_key_Call_GetMetrics = []byte("get_metrics") + +var ffj_key_Call_SetLoggingLevel = []byte("set_logging_level") + +var ffj_key_Call_ListFiles = []byte("list_files") + +var ffj_key_Call_ReadFile = []byte("read_file") + +var ffj_key_Call_GetContainers = []byte("get_containers") + +var ffj_key_Call_LaunchNestedContainer = []byte("launch_nested_container") + +var ffj_key_Call_WaitNestedContainer = []byte("wait_nested_container") + +var ffj_key_Call_KillNestedContainer = []byte("kill_nested_container") + +var ffj_key_Call_RemoveNestedContainer = []byte("remove_nested_container") + +var ffj_key_Call_LaunchNestedContainerSession = []byte("launch_nested_container_session") + +var ffj_key_Call_AttachContainerInput = []byte("attach_container_input") + +var ffj_key_Call_AttachContainerOutput = []byte("attach_container_output") + +var ffj_key_Call_LaunchContainer = []byte("launch_container") + +var ffj_key_Call_WaitContainer = []byte("wait_container") + +var ffj_key_Call_KillContainer = []byte("kill_container") + +var ffj_key_Call_RemoveContainer = []byte("remove_container") + +var ffj_key_Call_AddResourceProviderConfig = []byte("add_resource_provider_config") + +var ffj_key_Call_UpdateResourceProviderConfig = []byte("update_resource_provider_config") + +var ffj_key_Call_RemoveResourceProviderConfig = []byte("remove_resource_provider_config") + +var ffj_key_Call_PruneImages = []byte("prune_images") + +func (uj *Call) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Callbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Callno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Call_AttachContainerInput, kn) { + currentKey = ffj_t_Call_AttachContainerInput + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_AttachContainerOutput, kn) { + currentKey = ffj_t_Call_AttachContainerOutput + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_AddResourceProviderConfig, kn) { + currentKey = ffj_t_Call_AddResourceProviderConfig + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'g': + + if bytes.Equal(ffj_key_Call_GetMetrics, kn) { + currentKey = ffj_t_Call_GetMetrics + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_GetContainers, kn) { + currentKey = ffj_t_Call_GetContainers + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'k': + + if bytes.Equal(ffj_key_Call_KillNestedContainer, kn) { + currentKey = ffj_t_Call_KillNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_KillContainer, kn) { + currentKey = ffj_t_Call_KillContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Call_ListFiles, kn) { + currentKey = ffj_t_Call_ListFiles + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchNestedContainer, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchNestedContainerSession, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchContainer, kn) { + currentKey = ffj_t_Call_LaunchContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Call_PruneImages, kn) { + currentKey = ffj_t_Call_PruneImages + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Call_ReadFile, kn) { + currentKey = ffj_t_Call_ReadFile + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_RemoveNestedContainer, kn) { + currentKey = ffj_t_Call_RemoveNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_RemoveContainer, kn) { + currentKey = ffj_t_Call_RemoveContainer + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_RemoveResourceProviderConfig, kn) { + currentKey = ffj_t_Call_RemoveResourceProviderConfig + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Call_SetLoggingLevel, kn) { + currentKey = ffj_t_Call_SetLoggingLevel + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Call_Type, kn) { + currentKey = ffj_t_Call_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_Call_UpdateResourceProviderConfig, kn) { + currentKey = ffj_t_Call_UpdateResourceProviderConfig + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffj_key_Call_WaitNestedContainer, kn) { + currentKey = ffj_t_Call_WaitNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_WaitContainer, kn) { + currentKey = ffj_t_Call_WaitContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Call_PruneImages, kn) { + currentKey = ffj_t_Call_PruneImages + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_RemoveResourceProviderConfig, kn) { + currentKey = ffj_t_Call_RemoveResourceProviderConfig + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_UpdateResourceProviderConfig, kn) { + currentKey = ffj_t_Call_UpdateResourceProviderConfig + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_AddResourceProviderConfig, kn) { + currentKey = ffj_t_Call_AddResourceProviderConfig + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_RemoveContainer, kn) { + currentKey = ffj_t_Call_RemoveContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_KillContainer, kn) { + currentKey = ffj_t_Call_KillContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_WaitContainer, kn) { + currentKey = ffj_t_Call_WaitContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_LaunchContainer, kn) { + currentKey = ffj_t_Call_LaunchContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_AttachContainerOutput, kn) { + currentKey = ffj_t_Call_AttachContainerOutput + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_AttachContainerInput, kn) { + currentKey = ffj_t_Call_AttachContainerInput + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_LaunchNestedContainerSession, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_RemoveNestedContainer, kn) { + currentKey = ffj_t_Call_RemoveNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_KillNestedContainer, kn) { + currentKey = ffj_t_Call_KillNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_WaitNestedContainer, kn) { + currentKey = ffj_t_Call_WaitNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_LaunchNestedContainer, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_GetContainers, kn) { + currentKey = ffj_t_Call_GetContainers + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_ReadFile, kn) { + currentKey = ffj_t_Call_ReadFile + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_ListFiles, kn) { + currentKey = ffj_t_Call_ListFiles + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_SetLoggingLevel, kn) { + currentKey = ffj_t_Call_SetLoggingLevel + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_GetMetrics, kn) { + currentKey = ffj_t_Call_GetMetrics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_Type, kn) { + currentKey = ffj_t_Call_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Callno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_Type: + goto handle_Type + + case ffj_t_Call_GetMetrics: + goto handle_GetMetrics + + case ffj_t_Call_SetLoggingLevel: + goto handle_SetLoggingLevel + + case ffj_t_Call_ListFiles: + goto handle_ListFiles + + case ffj_t_Call_ReadFile: + goto handle_ReadFile + + case ffj_t_Call_GetContainers: + goto handle_GetContainers + + case ffj_t_Call_LaunchNestedContainer: + goto handle_LaunchNestedContainer + + case ffj_t_Call_WaitNestedContainer: + goto handle_WaitNestedContainer + + case ffj_t_Call_KillNestedContainer: + goto handle_KillNestedContainer + + case ffj_t_Call_RemoveNestedContainer: + goto handle_RemoveNestedContainer + + case ffj_t_Call_LaunchNestedContainerSession: + goto handle_LaunchNestedContainerSession + + case ffj_t_Call_AttachContainerInput: + goto handle_AttachContainerInput + + case ffj_t_Call_AttachContainerOutput: + goto handle_AttachContainerOutput + + case ffj_t_Call_LaunchContainer: + goto handle_LaunchContainer + + case ffj_t_Call_WaitContainer: + goto handle_WaitContainer + + case ffj_t_Call_KillContainer: + goto handle_KillContainer + + case ffj_t_Call_RemoveContainer: + goto handle_RemoveContainer + + case ffj_t_Call_AddResourceProviderConfig: + goto handle_AddResourceProviderConfig + + case ffj_t_Call_UpdateResourceProviderConfig: + goto handle_UpdateResourceProviderConfig + + case ffj_t_Call_RemoveResourceProviderConfig: + goto handle_RemoveResourceProviderConfig + + case ffj_t_Call_PruneImages: + goto handle_PruneImages + + case ffj_t_Callno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=agent.Call_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetMetrics: + + /* handler: uj.GetMetrics type=agent.Call_GetMetrics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetMetrics = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetMetrics == nil { + uj.GetMetrics = new(Call_GetMetrics) + } + + err = uj.GetMetrics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_SetLoggingLevel: + + /* handler: uj.SetLoggingLevel type=agent.Call_SetLoggingLevel kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.SetLoggingLevel = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.SetLoggingLevel == nil { + uj.SetLoggingLevel = new(Call_SetLoggingLevel) + } + + err = uj.SetLoggingLevel.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ListFiles: + + /* handler: uj.ListFiles type=agent.Call_ListFiles kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ListFiles = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ListFiles == nil { + uj.ListFiles = new(Call_ListFiles) + } + + err = uj.ListFiles.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ReadFile: + + /* handler: uj.ReadFile type=agent.Call_ReadFile kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ReadFile = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ReadFile == nil { + uj.ReadFile = new(Call_ReadFile) + } + + err = uj.ReadFile.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetContainers: + + /* handler: uj.GetContainers type=agent.Call_GetContainers kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetContainers = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetContainers == nil { + uj.GetContainers = new(Call_GetContainers) + } + + err = uj.GetContainers.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LaunchNestedContainer: + + /* handler: uj.LaunchNestedContainer type=agent.Call_LaunchNestedContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.LaunchNestedContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.LaunchNestedContainer == nil { + uj.LaunchNestedContainer = new(Call_LaunchNestedContainer) + } + + err = uj.LaunchNestedContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_WaitNestedContainer: + + /* handler: uj.WaitNestedContainer type=agent.Call_WaitNestedContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.WaitNestedContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.WaitNestedContainer == nil { + uj.WaitNestedContainer = new(Call_WaitNestedContainer) + } + + err = uj.WaitNestedContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_KillNestedContainer: + + /* handler: uj.KillNestedContainer type=agent.Call_KillNestedContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.KillNestedContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.KillNestedContainer == nil { + uj.KillNestedContainer = new(Call_KillNestedContainer) + } + + err = uj.KillNestedContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RemoveNestedContainer: + + /* handler: uj.RemoveNestedContainer type=agent.Call_RemoveNestedContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.RemoveNestedContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.RemoveNestedContainer == nil { + uj.RemoveNestedContainer = new(Call_RemoveNestedContainer) + } + + err = uj.RemoveNestedContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LaunchNestedContainerSession: + + /* handler: uj.LaunchNestedContainerSession type=agent.Call_LaunchNestedContainerSession kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.LaunchNestedContainerSession = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.LaunchNestedContainerSession == nil { + uj.LaunchNestedContainerSession = new(Call_LaunchNestedContainerSession) + } + + err = uj.LaunchNestedContainerSession.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AttachContainerInput: + + /* handler: uj.AttachContainerInput type=agent.Call_AttachContainerInput kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AttachContainerInput = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AttachContainerInput == nil { + uj.AttachContainerInput = new(Call_AttachContainerInput) + } + + err = uj.AttachContainerInput.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AttachContainerOutput: + + /* handler: uj.AttachContainerOutput type=agent.Call_AttachContainerOutput kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AttachContainerOutput = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AttachContainerOutput == nil { + uj.AttachContainerOutput = new(Call_AttachContainerOutput) + } + + err = uj.AttachContainerOutput.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LaunchContainer: + + /* handler: uj.LaunchContainer type=agent.Call_LaunchContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.LaunchContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.LaunchContainer == nil { + uj.LaunchContainer = new(Call_LaunchContainer) + } + + err = uj.LaunchContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_WaitContainer: + + /* handler: uj.WaitContainer type=agent.Call_WaitContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.WaitContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.WaitContainer == nil { + uj.WaitContainer = new(Call_WaitContainer) + } + + err = uj.WaitContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_KillContainer: + + /* handler: uj.KillContainer type=agent.Call_KillContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.KillContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.KillContainer == nil { + uj.KillContainer = new(Call_KillContainer) + } + + err = uj.KillContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RemoveContainer: + + /* handler: uj.RemoveContainer type=agent.Call_RemoveContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.RemoveContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.RemoveContainer == nil { + uj.RemoveContainer = new(Call_RemoveContainer) + } + + err = uj.RemoveContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AddResourceProviderConfig: + + /* handler: uj.AddResourceProviderConfig type=agent.Call_AddResourceProviderConfig kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AddResourceProviderConfig = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AddResourceProviderConfig == nil { + uj.AddResourceProviderConfig = new(Call_AddResourceProviderConfig) + } + + err = uj.AddResourceProviderConfig.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UpdateResourceProviderConfig: + + /* handler: uj.UpdateResourceProviderConfig type=agent.Call_UpdateResourceProviderConfig kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.UpdateResourceProviderConfig = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.UpdateResourceProviderConfig == nil { + uj.UpdateResourceProviderConfig = new(Call_UpdateResourceProviderConfig) + } + + err = uj.UpdateResourceProviderConfig.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RemoveResourceProviderConfig: + + /* handler: uj.RemoveResourceProviderConfig type=agent.Call_RemoveResourceProviderConfig kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.RemoveResourceProviderConfig = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.RemoveResourceProviderConfig == nil { + uj.RemoveResourceProviderConfig = new(Call_RemoveResourceProviderConfig) + } + + err = uj.RemoveResourceProviderConfig.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_PruneImages: + + /* handler: uj.PruneImages type=agent.Call_PruneImages kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.PruneImages = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.PruneImages == nil { + uj.PruneImages = new(Call_PruneImages) + } + + err = uj.PruneImages.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_AddResourceProviderConfig) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_AddResourceProviderConfig) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"info":`) + + { + + err = mj.Info.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_AddResourceProviderConfigbase = iota + ffj_t_Call_AddResourceProviderConfigno_such_key + + ffj_t_Call_AddResourceProviderConfig_Info +) + +var ffj_key_Call_AddResourceProviderConfig_Info = []byte("info") + +func (uj *Call_AddResourceProviderConfig) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_AddResourceProviderConfig) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_AddResourceProviderConfigbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_AddResourceProviderConfigno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_Call_AddResourceProviderConfig_Info, kn) { + currentKey = ffj_t_Call_AddResourceProviderConfig_Info + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_AddResourceProviderConfig_Info, kn) { + currentKey = ffj_t_Call_AddResourceProviderConfig_Info + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_AddResourceProviderConfigno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_AddResourceProviderConfig_Info: + goto handle_Info + + case ffj_t_Call_AddResourceProviderConfigno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Info: + + /* handler: uj.Info type=mesos.ResourceProviderInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Info.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_AttachContainerInput) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_AttachContainerInput) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.ContainerID != nil { + if true { + buf.WriteString(`"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ProcessIO != nil { + if true { + buf.WriteString(`"process_io":`) + + { + + err = mj.ProcessIO.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_AttachContainerInputbase = iota + ffj_t_Call_AttachContainerInputno_such_key + + ffj_t_Call_AttachContainerInput_Type + + ffj_t_Call_AttachContainerInput_ContainerID + + ffj_t_Call_AttachContainerInput_ProcessIO +) + +var ffj_key_Call_AttachContainerInput_Type = []byte("type") + +var ffj_key_Call_AttachContainerInput_ContainerID = []byte("container_id") + +var ffj_key_Call_AttachContainerInput_ProcessIO = []byte("process_io") + +func (uj *Call_AttachContainerInput) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_AttachContainerInput) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_AttachContainerInputbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_AttachContainerInputno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_AttachContainerInput_ContainerID, kn) { + currentKey = ffj_t_Call_AttachContainerInput_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Call_AttachContainerInput_ProcessIO, kn) { + currentKey = ffj_t_Call_AttachContainerInput_ProcessIO + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Call_AttachContainerInput_Type, kn) { + currentKey = ffj_t_Call_AttachContainerInput_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Call_AttachContainerInput_ProcessIO, kn) { + currentKey = ffj_t_Call_AttachContainerInput_ProcessIO + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_AttachContainerInput_ContainerID, kn) { + currentKey = ffj_t_Call_AttachContainerInput_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_AttachContainerInput_Type, kn) { + currentKey = ffj_t_Call_AttachContainerInput_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_AttachContainerInputno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_AttachContainerInput_Type: + goto handle_Type + + case ffj_t_Call_AttachContainerInput_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_AttachContainerInput_ProcessIO: + goto handle_ProcessIO + + case ffj_t_Call_AttachContainerInputno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=agent.Call_AttachContainerInput_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ContainerID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ContainerID == nil { + uj.ContainerID = new(mesos.ContainerID) + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ProcessIO: + + /* handler: uj.ProcessIO type=agent.ProcessIO kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ProcessIO = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ProcessIO == nil { + uj.ProcessIO = new(ProcessIO) + } + + err = uj.ProcessIO.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_AttachContainerOutput) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_AttachContainerOutput) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_AttachContainerOutputbase = iota + ffj_t_Call_AttachContainerOutputno_such_key + + ffj_t_Call_AttachContainerOutput_ContainerID +) + +var ffj_key_Call_AttachContainerOutput_ContainerID = []byte("container_id") + +func (uj *Call_AttachContainerOutput) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_AttachContainerOutput) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_AttachContainerOutputbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_AttachContainerOutputno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_AttachContainerOutput_ContainerID, kn) { + currentKey = ffj_t_Call_AttachContainerOutput_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Call_AttachContainerOutput_ContainerID, kn) { + currentKey = ffj_t_Call_AttachContainerOutput_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_AttachContainerOutputno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_AttachContainerOutput_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_AttachContainerOutputno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_GetContainers) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_GetContainers) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ShowNested != nil { + if true { + if *mj.ShowNested { + buf.WriteString(`"show_nested":true`) + } else { + buf.WriteString(`"show_nested":false`) + } + buf.WriteByte(',') + } + } + if mj.ShowStandalone != nil { + if true { + if *mj.ShowStandalone { + buf.WriteString(`"show_standalone":true`) + } else { + buf.WriteString(`"show_standalone":false`) + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_GetContainersbase = iota + ffj_t_Call_GetContainersno_such_key + + ffj_t_Call_GetContainers_ShowNested + + ffj_t_Call_GetContainers_ShowStandalone +) + +var ffj_key_Call_GetContainers_ShowNested = []byte("show_nested") + +var ffj_key_Call_GetContainers_ShowStandalone = []byte("show_standalone") + +func (uj *Call_GetContainers) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_GetContainers) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_GetContainersbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_GetContainersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 's': + + if bytes.Equal(ffj_key_Call_GetContainers_ShowNested, kn) { + currentKey = ffj_t_Call_GetContainers_ShowNested + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_GetContainers_ShowStandalone, kn) { + currentKey = ffj_t_Call_GetContainers_ShowStandalone + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Call_GetContainers_ShowStandalone, kn) { + currentKey = ffj_t_Call_GetContainers_ShowStandalone + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_GetContainers_ShowNested, kn) { + currentKey = ffj_t_Call_GetContainers_ShowNested + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_GetContainersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_GetContainers_ShowNested: + goto handle_ShowNested + + case ffj_t_Call_GetContainers_ShowStandalone: + goto handle_ShowStandalone + + case ffj_t_Call_GetContainersno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ShowNested: + + /* handler: uj.ShowNested type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.ShowNested = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.ShowNested = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ShowStandalone: + + /* handler: uj.ShowStandalone type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.ShowStandalone = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.ShowStandalone = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_GetMetrics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_GetMetrics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Timeout != nil { + if true { + buf.WriteString(`"timeout":`) + + { + + err = mj.Timeout.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_GetMetricsbase = iota + ffj_t_Call_GetMetricsno_such_key + + ffj_t_Call_GetMetrics_Timeout +) + +var ffj_key_Call_GetMetrics_Timeout = []byte("timeout") + +func (uj *Call_GetMetrics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_GetMetrics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_GetMetricsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_GetMetricsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 't': + + if bytes.Equal(ffj_key_Call_GetMetrics_Timeout, kn) { + currentKey = ffj_t_Call_GetMetrics_Timeout + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_GetMetrics_Timeout, kn) { + currentKey = ffj_t_Call_GetMetrics_Timeout + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_GetMetricsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_GetMetrics_Timeout: + goto handle_Timeout + + case ffj_t_Call_GetMetricsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Timeout: + + /* handler: uj.Timeout type=mesos.DurationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Timeout = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Timeout == nil { + uj.Timeout = new(mesos.DurationInfo) + } + + err = uj.Timeout.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_KillContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_KillContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Signal != nil { + if true { + buf.WriteString(`"signal":`) + fflib.FormatBits2(buf, uint64(*mj.Signal), 10, *mj.Signal < 0) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_KillContainerbase = iota + ffj_t_Call_KillContainerno_such_key + + ffj_t_Call_KillContainer_ContainerID + + ffj_t_Call_KillContainer_Signal +) + +var ffj_key_Call_KillContainer_ContainerID = []byte("container_id") + +var ffj_key_Call_KillContainer_Signal = []byte("signal") + +func (uj *Call_KillContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_KillContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_KillContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_KillContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_KillContainer_ContainerID, kn) { + currentKey = ffj_t_Call_KillContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Call_KillContainer_Signal, kn) { + currentKey = ffj_t_Call_KillContainer_Signal + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Call_KillContainer_Signal, kn) { + currentKey = ffj_t_Call_KillContainer_Signal + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_KillContainer_ContainerID, kn) { + currentKey = ffj_t_Call_KillContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_KillContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_KillContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_KillContainer_Signal: + goto handle_Signal + + case ffj_t_Call_KillContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Signal: + + /* handler: uj.Signal type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Signal = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int32(tval) + uj.Signal = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_KillNestedContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_KillNestedContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Signal != nil { + if true { + buf.WriteString(`"signal":`) + fflib.FormatBits2(buf, uint64(*mj.Signal), 10, *mj.Signal < 0) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_KillNestedContainerbase = iota + ffj_t_Call_KillNestedContainerno_such_key + + ffj_t_Call_KillNestedContainer_ContainerID + + ffj_t_Call_KillNestedContainer_Signal +) + +var ffj_key_Call_KillNestedContainer_ContainerID = []byte("container_id") + +var ffj_key_Call_KillNestedContainer_Signal = []byte("signal") + +func (uj *Call_KillNestedContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_KillNestedContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_KillNestedContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_KillNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_KillNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_KillNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Call_KillNestedContainer_Signal, kn) { + currentKey = ffj_t_Call_KillNestedContainer_Signal + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Call_KillNestedContainer_Signal, kn) { + currentKey = ffj_t_Call_KillNestedContainer_Signal + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_KillNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_KillNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_KillNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_KillNestedContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_KillNestedContainer_Signal: + goto handle_Signal + + case ffj_t_Call_KillNestedContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Signal: + + /* handler: uj.Signal type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Signal = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int32(tval) + uj.Signal = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_LaunchContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_LaunchContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Container != nil { + if true { + buf.WriteString(`"container":`) + + { + + err = mj.Container.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_LaunchContainerbase = iota + ffj_t_Call_LaunchContainerno_such_key + + ffj_t_Call_LaunchContainer_ContainerID + + ffj_t_Call_LaunchContainer_Command + + ffj_t_Call_LaunchContainer_Resources + + ffj_t_Call_LaunchContainer_Container +) + +var ffj_key_Call_LaunchContainer_ContainerID = []byte("container_id") + +var ffj_key_Call_LaunchContainer_Command = []byte("command") + +var ffj_key_Call_LaunchContainer_Resources = []byte("resources") + +var ffj_key_Call_LaunchContainer_Container = []byte("container") + +func (uj *Call_LaunchContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_LaunchContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_LaunchContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_LaunchContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_LaunchContainer_ContainerID, kn) { + currentKey = ffj_t_Call_LaunchContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchContainer_Command, kn) { + currentKey = ffj_t_Call_LaunchContainer_Command + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchContainer_Container, kn) { + currentKey = ffj_t_Call_LaunchContainer_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Call_LaunchContainer_Resources, kn) { + currentKey = ffj_t_Call_LaunchContainer_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_LaunchContainer_Container, kn) { + currentKey = ffj_t_Call_LaunchContainer_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_LaunchContainer_Resources, kn) { + currentKey = ffj_t_Call_LaunchContainer_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_LaunchContainer_Command, kn) { + currentKey = ffj_t_Call_LaunchContainer_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_LaunchContainer_ContainerID, kn) { + currentKey = ffj_t_Call_LaunchContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_LaunchContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_LaunchContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_LaunchContainer_Command: + goto handle_Command + + case ffj_t_Call_LaunchContainer_Resources: + goto handle_Resources + + case ffj_t_Call_LaunchContainer_Container: + goto handle_Container + + case ffj_t_Call_LaunchContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(mesos.CommandInfo) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []mesos.Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources mesos.Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Container: + + /* handler: uj.Container type=mesos.ContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Container = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Container == nil { + uj.Container = new(mesos.ContainerInfo) + } + + err = uj.Container.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_LaunchNestedContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_LaunchNestedContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Container != nil { + if true { + buf.WriteString(`"container":`) + + { + + err = mj.Container.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_LaunchNestedContainerbase = iota + ffj_t_Call_LaunchNestedContainerno_such_key + + ffj_t_Call_LaunchNestedContainer_ContainerID + + ffj_t_Call_LaunchNestedContainer_Command + + ffj_t_Call_LaunchNestedContainer_Container +) + +var ffj_key_Call_LaunchNestedContainer_ContainerID = []byte("container_id") + +var ffj_key_Call_LaunchNestedContainer_Command = []byte("command") + +var ffj_key_Call_LaunchNestedContainer_Container = []byte("container") + +func (uj *Call_LaunchNestedContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_LaunchNestedContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_LaunchNestedContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_LaunchNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_LaunchNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchNestedContainer_Command, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer_Command + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchNestedContainer_Container, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_LaunchNestedContainer_Container, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_LaunchNestedContainer_Command, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_LaunchNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_LaunchNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_LaunchNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_LaunchNestedContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_LaunchNestedContainer_Command: + goto handle_Command + + case ffj_t_Call_LaunchNestedContainer_Container: + goto handle_Container + + case ffj_t_Call_LaunchNestedContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(mesos.CommandInfo) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Container: + + /* handler: uj.Container type=mesos.ContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Container = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Container == nil { + uj.Container = new(mesos.ContainerInfo) + } + + err = uj.Container.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_LaunchNestedContainerSession) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_LaunchNestedContainerSession) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Container != nil { + if true { + buf.WriteString(`"container":`) + + { + + err = mj.Container.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_LaunchNestedContainerSessionbase = iota + ffj_t_Call_LaunchNestedContainerSessionno_such_key + + ffj_t_Call_LaunchNestedContainerSession_ContainerID + + ffj_t_Call_LaunchNestedContainerSession_Command + + ffj_t_Call_LaunchNestedContainerSession_Container +) + +var ffj_key_Call_LaunchNestedContainerSession_ContainerID = []byte("container_id") + +var ffj_key_Call_LaunchNestedContainerSession_Command = []byte("command") + +var ffj_key_Call_LaunchNestedContainerSession_Container = []byte("container") + +func (uj *Call_LaunchNestedContainerSession) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_LaunchNestedContainerSession) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_LaunchNestedContainerSessionbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_LaunchNestedContainerSessionno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_LaunchNestedContainerSession_ContainerID, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchNestedContainerSession_Command, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession_Command + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Call_LaunchNestedContainerSession_Container, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_LaunchNestedContainerSession_Container, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_LaunchNestedContainerSession_Command, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Call_LaunchNestedContainerSession_ContainerID, kn) { + currentKey = ffj_t_Call_LaunchNestedContainerSession_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_LaunchNestedContainerSessionno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_LaunchNestedContainerSession_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_LaunchNestedContainerSession_Command: + goto handle_Command + + case ffj_t_Call_LaunchNestedContainerSession_Container: + goto handle_Container + + case ffj_t_Call_LaunchNestedContainerSessionno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(mesos.CommandInfo) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Container: + + /* handler: uj.Container type=mesos.ContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Container = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Container == nil { + uj.Container = new(mesos.ContainerInfo) + } + + err = uj.Container.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_ListFiles) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_ListFiles) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"path":`) + fflib.WriteJsonString(buf, string(mj.Path)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_ListFilesbase = iota + ffj_t_Call_ListFilesno_such_key + + ffj_t_Call_ListFiles_Path +) + +var ffj_key_Call_ListFiles_Path = []byte("path") + +func (uj *Call_ListFiles) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_ListFiles) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_ListFilesbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_ListFilesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_Call_ListFiles_Path, kn) { + currentKey = ffj_t_Call_ListFiles_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_ListFiles_Path, kn) { + currentKey = ffj_t_Call_ListFiles_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_ListFilesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_ListFiles_Path: + goto handle_Path + + case ffj_t_Call_ListFilesno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Path = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_PruneImages) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_PruneImages) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"excluded_images":`) + if mj.ExcludedImages != nil { + buf.WriteString(`[`) + for i, v := range mj.ExcludedImages { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_PruneImagesbase = iota + ffj_t_Call_PruneImagesno_such_key + + ffj_t_Call_PruneImages_ExcludedImages +) + +var ffj_key_Call_PruneImages_ExcludedImages = []byte("excluded_images") + +func (uj *Call_PruneImages) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_PruneImages) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_PruneImagesbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_PruneImagesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_Call_PruneImages_ExcludedImages, kn) { + currentKey = ffj_t_Call_PruneImages_ExcludedImages + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Call_PruneImages_ExcludedImages, kn) { + currentKey = ffj_t_Call_PruneImages_ExcludedImages + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_PruneImagesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_PruneImages_ExcludedImages: + goto handle_ExcludedImages + + case ffj_t_Call_PruneImagesno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ExcludedImages: + + /* handler: uj.ExcludedImages type=[]mesos.Image kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.ExcludedImages = nil + } else { + + uj.ExcludedImages = []mesos.Image{} + + wantVal := true + + for { + + var tmp_uj__ExcludedImages mesos.Image + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__ExcludedImages type=mesos.Image kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__ExcludedImages.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.ExcludedImages = append(uj.ExcludedImages, tmp_uj__ExcludedImages) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_ReadFile) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_ReadFile) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "path":`) + fflib.WriteJsonString(buf, string(mj.Path)) + buf.WriteString(`,"offset":`) + fflib.FormatBits2(buf, uint64(mj.Offset), 10, false) + buf.WriteByte(',') + if mj.Length != nil { + if true { + buf.WriteString(`"length":`) + fflib.FormatBits2(buf, uint64(*mj.Length), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_ReadFilebase = iota + ffj_t_Call_ReadFileno_such_key + + ffj_t_Call_ReadFile_Path + + ffj_t_Call_ReadFile_Offset + + ffj_t_Call_ReadFile_Length +) + +var ffj_key_Call_ReadFile_Path = []byte("path") + +var ffj_key_Call_ReadFile_Offset = []byte("offset") + +var ffj_key_Call_ReadFile_Length = []byte("length") + +func (uj *Call_ReadFile) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_ReadFile) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_ReadFilebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_ReadFileno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'l': + + if bytes.Equal(ffj_key_Call_ReadFile_Length, kn) { + currentKey = ffj_t_Call_ReadFile_Length + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'o': + + if bytes.Equal(ffj_key_Call_ReadFile_Offset, kn) { + currentKey = ffj_t_Call_ReadFile_Offset + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Call_ReadFile_Path, kn) { + currentKey = ffj_t_Call_ReadFile_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_ReadFile_Length, kn) { + currentKey = ffj_t_Call_ReadFile_Length + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Call_ReadFile_Offset, kn) { + currentKey = ffj_t_Call_ReadFile_Offset + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_ReadFile_Path, kn) { + currentKey = ffj_t_Call_ReadFile_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_ReadFileno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_ReadFile_Path: + goto handle_Path + + case ffj_t_Call_ReadFile_Offset: + goto handle_Offset + + case ffj_t_Call_ReadFile_Length: + goto handle_Length + + case ffj_t_Call_ReadFileno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Path = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Offset: + + /* handler: uj.Offset type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Offset = uint64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Length: + + /* handler: uj.Length type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Length = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Length = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_RemoveContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_RemoveContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_RemoveContainerbase = iota + ffj_t_Call_RemoveContainerno_such_key + + ffj_t_Call_RemoveContainer_ContainerID +) + +var ffj_key_Call_RemoveContainer_ContainerID = []byte("container_id") + +func (uj *Call_RemoveContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_RemoveContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_RemoveContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_RemoveContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_RemoveContainer_ContainerID, kn) { + currentKey = ffj_t_Call_RemoveContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Call_RemoveContainer_ContainerID, kn) { + currentKey = ffj_t_Call_RemoveContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_RemoveContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_RemoveContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_RemoveContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_RemoveNestedContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_RemoveNestedContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_RemoveNestedContainerbase = iota + ffj_t_Call_RemoveNestedContainerno_such_key + + ffj_t_Call_RemoveNestedContainer_ContainerID +) + +var ffj_key_Call_RemoveNestedContainer_ContainerID = []byte("container_id") + +func (uj *Call_RemoveNestedContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_RemoveNestedContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_RemoveNestedContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_RemoveNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_RemoveNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_RemoveNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Call_RemoveNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_RemoveNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_RemoveNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_RemoveNestedContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_RemoveNestedContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_RemoveResourceProviderConfig) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_RemoveResourceProviderConfig) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"type":`) + fflib.WriteJsonString(buf, string(mj.Type)) + buf.WriteString(`,"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_RemoveResourceProviderConfigbase = iota + ffj_t_Call_RemoveResourceProviderConfigno_such_key + + ffj_t_Call_RemoveResourceProviderConfig_Type + + ffj_t_Call_RemoveResourceProviderConfig_Name +) + +var ffj_key_Call_RemoveResourceProviderConfig_Type = []byte("type") + +var ffj_key_Call_RemoveResourceProviderConfig_Name = []byte("name") + +func (uj *Call_RemoveResourceProviderConfig) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_RemoveResourceProviderConfig) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_RemoveResourceProviderConfigbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_RemoveResourceProviderConfigno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_Call_RemoveResourceProviderConfig_Name, kn) { + currentKey = ffj_t_Call_RemoveResourceProviderConfig_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Call_RemoveResourceProviderConfig_Type, kn) { + currentKey = ffj_t_Call_RemoveResourceProviderConfig_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_RemoveResourceProviderConfig_Name, kn) { + currentKey = ffj_t_Call_RemoveResourceProviderConfig_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_RemoveResourceProviderConfig_Type, kn) { + currentKey = ffj_t_Call_RemoveResourceProviderConfig_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_RemoveResourceProviderConfigno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_RemoveResourceProviderConfig_Type: + goto handle_Type + + case ffj_t_Call_RemoveResourceProviderConfig_Name: + goto handle_Name + + case ffj_t_Call_RemoveResourceProviderConfigno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Type = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_SetLoggingLevel) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_SetLoggingLevel) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"level":`) + fflib.FormatBits2(buf, uint64(mj.Level), 10, false) + buf.WriteString(`,"duration":`) + + { + + err = mj.Duration.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_SetLoggingLevelbase = iota + ffj_t_Call_SetLoggingLevelno_such_key + + ffj_t_Call_SetLoggingLevel_Level + + ffj_t_Call_SetLoggingLevel_Duration +) + +var ffj_key_Call_SetLoggingLevel_Level = []byte("level") + +var ffj_key_Call_SetLoggingLevel_Duration = []byte("duration") + +func (uj *Call_SetLoggingLevel) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_SetLoggingLevel) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_SetLoggingLevelbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_SetLoggingLevelno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_Call_SetLoggingLevel_Duration, kn) { + currentKey = ffj_t_Call_SetLoggingLevel_Duration + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Call_SetLoggingLevel_Level, kn) { + currentKey = ffj_t_Call_SetLoggingLevel_Level + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_SetLoggingLevel_Duration, kn) { + currentKey = ffj_t_Call_SetLoggingLevel_Duration + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_SetLoggingLevel_Level, kn) { + currentKey = ffj_t_Call_SetLoggingLevel_Level + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_SetLoggingLevelno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_SetLoggingLevel_Level: + goto handle_Level + + case ffj_t_Call_SetLoggingLevel_Duration: + goto handle_Duration + + case ffj_t_Call_SetLoggingLevelno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Level: + + /* handler: uj.Level type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Level = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Duration: + + /* handler: uj.Duration type=mesos.DurationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Duration.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_UpdateResourceProviderConfig) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_UpdateResourceProviderConfig) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"info":`) + + { + + err = mj.Info.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_UpdateResourceProviderConfigbase = iota + ffj_t_Call_UpdateResourceProviderConfigno_such_key + + ffj_t_Call_UpdateResourceProviderConfig_Info +) + +var ffj_key_Call_UpdateResourceProviderConfig_Info = []byte("info") + +func (uj *Call_UpdateResourceProviderConfig) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_UpdateResourceProviderConfig) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_UpdateResourceProviderConfigbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_UpdateResourceProviderConfigno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_Call_UpdateResourceProviderConfig_Info, kn) { + currentKey = ffj_t_Call_UpdateResourceProviderConfig_Info + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Call_UpdateResourceProviderConfig_Info, kn) { + currentKey = ffj_t_Call_UpdateResourceProviderConfig_Info + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_UpdateResourceProviderConfigno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_UpdateResourceProviderConfig_Info: + goto handle_Info + + case ffj_t_Call_UpdateResourceProviderConfigno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Info: + + /* handler: uj.Info type=mesos.ResourceProviderInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Info.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_WaitContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_WaitContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_WaitContainerbase = iota + ffj_t_Call_WaitContainerno_such_key + + ffj_t_Call_WaitContainer_ContainerID +) + +var ffj_key_Call_WaitContainer_ContainerID = []byte("container_id") + +func (uj *Call_WaitContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_WaitContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_WaitContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_WaitContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_WaitContainer_ContainerID, kn) { + currentKey = ffj_t_Call_WaitContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Call_WaitContainer_ContainerID, kn) { + currentKey = ffj_t_Call_WaitContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_WaitContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_WaitContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_WaitContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Call_WaitNestedContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Call_WaitNestedContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Call_WaitNestedContainerbase = iota + ffj_t_Call_WaitNestedContainerno_such_key + + ffj_t_Call_WaitNestedContainer_ContainerID +) + +var ffj_key_Call_WaitNestedContainer_ContainerID = []byte("container_id") + +func (uj *Call_WaitNestedContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Call_WaitNestedContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Call_WaitNestedContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Call_WaitNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Call_WaitNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_WaitNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Call_WaitNestedContainer_ContainerID, kn) { + currentKey = ffj_t_Call_WaitNestedContainer_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Call_WaitNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Call_WaitNestedContainer_ContainerID: + goto handle_ContainerID + + case ffj_t_Call_WaitNestedContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ProcessIO) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ProcessIO) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Data != nil { + if true { + buf.WriteString(`"data":`) + + { + + err = mj.Data.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Control != nil { + if true { + buf.WriteString(`"control":`) + + { + + err = mj.Control.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ProcessIObase = iota + ffj_t_ProcessIOno_such_key + + ffj_t_ProcessIO_Type + + ffj_t_ProcessIO_Data + + ffj_t_ProcessIO_Control +) + +var ffj_key_ProcessIO_Type = []byte("type") + +var ffj_key_ProcessIO_Data = []byte("data") + +var ffj_key_ProcessIO_Control = []byte("control") + +func (uj *ProcessIO) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ProcessIO) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ProcessIObase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ProcessIOno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_ProcessIO_Control, kn) { + currentKey = ffj_t_ProcessIO_Control + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_ProcessIO_Data, kn) { + currentKey = ffj_t_ProcessIO_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ProcessIO_Type, kn) { + currentKey = ffj_t_ProcessIO_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Control, kn) { + currentKey = ffj_t_ProcessIO_Control + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Data, kn) { + currentKey = ffj_t_ProcessIO_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Type, kn) { + currentKey = ffj_t_ProcessIO_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ProcessIOno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ProcessIO_Type: + goto handle_Type + + case ffj_t_ProcessIO_Data: + goto handle_Data + + case ffj_t_ProcessIO_Control: + goto handle_Control + + case ffj_t_ProcessIOno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=agent.ProcessIO_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Data: + + /* handler: uj.Data type=agent.ProcessIO_Data kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Data = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Data == nil { + uj.Data = new(ProcessIO_Data) + } + + err = uj.Data.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Control: + + /* handler: uj.Control type=agent.ProcessIO_Control kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Control = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Control == nil { + uj.Control = new(ProcessIO_Control) + } + + err = uj.Control.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ProcessIO_Control) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ProcessIO_Control) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.TTYInfo != nil { + if true { + buf.WriteString(`"tty_info":`) + + { + + err = mj.TTYInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Heartbeat != nil { + if true { + buf.WriteString(`"heartbeat":`) + + { + + err = mj.Heartbeat.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ProcessIO_Controlbase = iota + ffj_t_ProcessIO_Controlno_such_key + + ffj_t_ProcessIO_Control_Type + + ffj_t_ProcessIO_Control_TTYInfo + + ffj_t_ProcessIO_Control_Heartbeat +) + +var ffj_key_ProcessIO_Control_Type = []byte("type") + +var ffj_key_ProcessIO_Control_TTYInfo = []byte("tty_info") + +var ffj_key_ProcessIO_Control_Heartbeat = []byte("heartbeat") + +func (uj *ProcessIO_Control) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ProcessIO_Control) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ProcessIO_Controlbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ProcessIO_Controlno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffj_key_ProcessIO_Control_Heartbeat, kn) { + currentKey = ffj_t_ProcessIO_Control_Heartbeat + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ProcessIO_Control_Type, kn) { + currentKey = ffj_t_ProcessIO_Control_Type + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ProcessIO_Control_TTYInfo, kn) { + currentKey = ffj_t_ProcessIO_Control_TTYInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Control_Heartbeat, kn) { + currentKey = ffj_t_ProcessIO_Control_Heartbeat + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ProcessIO_Control_TTYInfo, kn) { + currentKey = ffj_t_ProcessIO_Control_TTYInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Control_Type, kn) { + currentKey = ffj_t_ProcessIO_Control_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ProcessIO_Controlno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ProcessIO_Control_Type: + goto handle_Type + + case ffj_t_ProcessIO_Control_TTYInfo: + goto handle_TTYInfo + + case ffj_t_ProcessIO_Control_Heartbeat: + goto handle_Heartbeat + + case ffj_t_ProcessIO_Controlno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=agent.ProcessIO_Control_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TTYInfo: + + /* handler: uj.TTYInfo type=mesos.TTYInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.TTYInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.TTYInfo == nil { + uj.TTYInfo = new(mesos.TTYInfo) + } + + err = uj.TTYInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Heartbeat: + + /* handler: uj.Heartbeat type=agent.ProcessIO_Control_Heartbeat kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Heartbeat = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Heartbeat == nil { + uj.Heartbeat = new(ProcessIO_Control_Heartbeat) + } + + err = uj.Heartbeat.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ProcessIO_Control_Heartbeat) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ProcessIO_Control_Heartbeat) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Interval != nil { + if true { + buf.WriteString(`"interval":`) + + { + + err = mj.Interval.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ProcessIO_Control_Heartbeatbase = iota + ffj_t_ProcessIO_Control_Heartbeatno_such_key + + ffj_t_ProcessIO_Control_Heartbeat_Interval +) + +var ffj_key_ProcessIO_Control_Heartbeat_Interval = []byte("interval") + +func (uj *ProcessIO_Control_Heartbeat) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ProcessIO_Control_Heartbeat) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ProcessIO_Control_Heartbeatbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ProcessIO_Control_Heartbeatno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_ProcessIO_Control_Heartbeat_Interval, kn) { + currentKey = ffj_t_ProcessIO_Control_Heartbeat_Interval + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Control_Heartbeat_Interval, kn) { + currentKey = ffj_t_ProcessIO_Control_Heartbeat_Interval + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ProcessIO_Control_Heartbeatno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ProcessIO_Control_Heartbeat_Interval: + goto handle_Interval + + case ffj_t_ProcessIO_Control_Heartbeatno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Interval: + + /* handler: uj.Interval type=mesos.DurationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Interval = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Interval == nil { + uj.Interval = new(mesos.DurationInfo) + } + + err = uj.Interval.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ProcessIO_Data) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ProcessIO_Data) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if len(mj.Data) != 0 { + buf.WriteString(`"data":`) + if mj.Data != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.Data)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ProcessIO_Database = iota + ffj_t_ProcessIO_Datano_such_key + + ffj_t_ProcessIO_Data_Type + + ffj_t_ProcessIO_Data_Data +) + +var ffj_key_ProcessIO_Data_Type = []byte("type") + +var ffj_key_ProcessIO_Data_Data = []byte("data") + +func (uj *ProcessIO_Data) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ProcessIO_Data) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ProcessIO_Database + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ProcessIO_Datano_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_ProcessIO_Data_Data, kn) { + currentKey = ffj_t_ProcessIO_Data_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ProcessIO_Data_Type, kn) { + currentKey = ffj_t_ProcessIO_Data_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Data_Data, kn) { + currentKey = ffj_t_ProcessIO_Data_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ProcessIO_Data_Type, kn) { + currentKey = ffj_t_ProcessIO_Data_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ProcessIO_Datano_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ProcessIO_Data_Type: + goto handle_Type + + case ffj_t_ProcessIO_Data_Data: + goto handle_Data + + case ffj_t_ProcessIO_Datano_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=agent.ProcessIO_Data_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Data: + + /* handler: uj.Data type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Data = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.Data).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.GetHealth != nil { + if true { + buf.WriteString(`"get_health":`) + + { + + err = mj.GetHealth.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetFlags != nil { + if true { + buf.WriteString(`"get_flags":`) + + { + + err = mj.GetFlags.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetVersion != nil { + if true { + buf.WriteString(`"get_version":`) + + { + + err = mj.GetVersion.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetMetrics != nil { + if true { + buf.WriteString(`"get_metrics":`) + + { + + err = mj.GetMetrics.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetLoggingLevel != nil { + if true { + buf.WriteString(`"get_logging_level":`) + + { + + err = mj.GetLoggingLevel.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ListFiles != nil { + if true { + buf.WriteString(`"list_files":`) + + { + + err = mj.ListFiles.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ReadFile != nil { + if true { + buf.WriteString(`"read_file":`) + + { + + err = mj.ReadFile.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetState != nil { + if true { + buf.WriteString(`"get_state":`) + + { + + err = mj.GetState.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetContainers != nil { + if true { + buf.WriteString(`"get_containers":`) + + { + + err = mj.GetContainers.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetFrameworks != nil { + if true { + buf.WriteString(`"get_frameworks":`) + + { + + err = mj.GetFrameworks.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetExecutors != nil { + if true { + buf.WriteString(`"get_executors":`) + + { + + err = mj.GetExecutors.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetOperations != nil { + if true { + buf.WriteString(`"get_operations":`) + + { + + err = mj.GetOperations.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetTasks != nil { + if true { + buf.WriteString(`"get_tasks":`) + + { + + err = mj.GetTasks.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetAgent != nil { + if true { + buf.WriteString(`"get_agent":`) + + { + + err = mj.GetAgent.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetResourceProviders != nil { + if true { + buf.WriteString(`"get_resource_providers":`) + + { + + err = mj.GetResourceProviders.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.WaitNestedContainer != nil { + if true { + buf.WriteString(`"wait_nested_container":`) + + { + + err = mj.WaitNestedContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.WaitContainer != nil { + if true { + buf.WriteString(`"wait_container":`) + + { + + err = mj.WaitContainer.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Responsebase = iota + ffj_t_Responseno_such_key + + ffj_t_Response_Type + + ffj_t_Response_GetHealth + + ffj_t_Response_GetFlags + + ffj_t_Response_GetVersion + + ffj_t_Response_GetMetrics + + ffj_t_Response_GetLoggingLevel + + ffj_t_Response_ListFiles + + ffj_t_Response_ReadFile + + ffj_t_Response_GetState + + ffj_t_Response_GetContainers + + ffj_t_Response_GetFrameworks + + ffj_t_Response_GetExecutors + + ffj_t_Response_GetOperations + + ffj_t_Response_GetTasks + + ffj_t_Response_GetAgent + + ffj_t_Response_GetResourceProviders + + ffj_t_Response_WaitNestedContainer + + ffj_t_Response_WaitContainer +) + +var ffj_key_Response_Type = []byte("type") + +var ffj_key_Response_GetHealth = []byte("get_health") + +var ffj_key_Response_GetFlags = []byte("get_flags") + +var ffj_key_Response_GetVersion = []byte("get_version") + +var ffj_key_Response_GetMetrics = []byte("get_metrics") + +var ffj_key_Response_GetLoggingLevel = []byte("get_logging_level") + +var ffj_key_Response_ListFiles = []byte("list_files") + +var ffj_key_Response_ReadFile = []byte("read_file") + +var ffj_key_Response_GetState = []byte("get_state") + +var ffj_key_Response_GetContainers = []byte("get_containers") + +var ffj_key_Response_GetFrameworks = []byte("get_frameworks") + +var ffj_key_Response_GetExecutors = []byte("get_executors") + +var ffj_key_Response_GetOperations = []byte("get_operations") + +var ffj_key_Response_GetTasks = []byte("get_tasks") + +var ffj_key_Response_GetAgent = []byte("get_agent") + +var ffj_key_Response_GetResourceProviders = []byte("get_resource_providers") + +var ffj_key_Response_WaitNestedContainer = []byte("wait_nested_container") + +var ffj_key_Response_WaitContainer = []byte("wait_container") + +func (uj *Response) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Responsebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Responseno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'g': + + if bytes.Equal(ffj_key_Response_GetHealth, kn) { + currentKey = ffj_t_Response_GetHealth + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetFlags, kn) { + currentKey = ffj_t_Response_GetFlags + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetVersion, kn) { + currentKey = ffj_t_Response_GetVersion + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetMetrics, kn) { + currentKey = ffj_t_Response_GetMetrics + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetLoggingLevel, kn) { + currentKey = ffj_t_Response_GetLoggingLevel + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetState, kn) { + currentKey = ffj_t_Response_GetState + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetContainers, kn) { + currentKey = ffj_t_Response_GetContainers + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetFrameworks, kn) { + currentKey = ffj_t_Response_GetFrameworks + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetExecutors, kn) { + currentKey = ffj_t_Response_GetExecutors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetOperations, kn) { + currentKey = ffj_t_Response_GetOperations + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetTasks, kn) { + currentKey = ffj_t_Response_GetTasks + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetAgent, kn) { + currentKey = ffj_t_Response_GetAgent + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetResourceProviders, kn) { + currentKey = ffj_t_Response_GetResourceProviders + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Response_ListFiles, kn) { + currentKey = ffj_t_Response_ListFiles + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Response_ReadFile, kn) { + currentKey = ffj_t_Response_ReadFile + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Response_Type, kn) { + currentKey = ffj_t_Response_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffj_key_Response_WaitNestedContainer, kn) { + currentKey = ffj_t_Response_WaitNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_WaitContainer, kn) { + currentKey = ffj_t_Response_WaitContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Response_WaitContainer, kn) { + currentKey = ffj_t_Response_WaitContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitNestedContainer, kn) { + currentKey = ffj_t_Response_WaitNestedContainer + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetResourceProviders, kn) { + currentKey = ffj_t_Response_GetResourceProviders + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetAgent, kn) { + currentKey = ffj_t_Response_GetAgent + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetTasks, kn) { + currentKey = ffj_t_Response_GetTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetOperations, kn) { + currentKey = ffj_t_Response_GetOperations + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetExecutors, kn) { + currentKey = ffj_t_Response_GetExecutors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetFrameworks, kn) { + currentKey = ffj_t_Response_GetFrameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetContainers, kn) { + currentKey = ffj_t_Response_GetContainers + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetState, kn) { + currentKey = ffj_t_Response_GetState + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Response_ReadFile, kn) { + currentKey = ffj_t_Response_ReadFile + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_ListFiles, kn) { + currentKey = ffj_t_Response_ListFiles + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetLoggingLevel, kn) { + currentKey = ffj_t_Response_GetLoggingLevel + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetMetrics, kn) { + currentKey = ffj_t_Response_GetMetrics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetVersion, kn) { + currentKey = ffj_t_Response_GetVersion + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetFlags, kn) { + currentKey = ffj_t_Response_GetFlags + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetHealth, kn) { + currentKey = ffj_t_Response_GetHealth + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Response_Type, kn) { + currentKey = ffj_t_Response_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Responseno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_Type: + goto handle_Type + + case ffj_t_Response_GetHealth: + goto handle_GetHealth + + case ffj_t_Response_GetFlags: + goto handle_GetFlags + + case ffj_t_Response_GetVersion: + goto handle_GetVersion + + case ffj_t_Response_GetMetrics: + goto handle_GetMetrics + + case ffj_t_Response_GetLoggingLevel: + goto handle_GetLoggingLevel + + case ffj_t_Response_ListFiles: + goto handle_ListFiles + + case ffj_t_Response_ReadFile: + goto handle_ReadFile + + case ffj_t_Response_GetState: + goto handle_GetState + + case ffj_t_Response_GetContainers: + goto handle_GetContainers + + case ffj_t_Response_GetFrameworks: + goto handle_GetFrameworks + + case ffj_t_Response_GetExecutors: + goto handle_GetExecutors + + case ffj_t_Response_GetOperations: + goto handle_GetOperations + + case ffj_t_Response_GetTasks: + goto handle_GetTasks + + case ffj_t_Response_GetAgent: + goto handle_GetAgent + + case ffj_t_Response_GetResourceProviders: + goto handle_GetResourceProviders + + case ffj_t_Response_WaitNestedContainer: + goto handle_WaitNestedContainer + + case ffj_t_Response_WaitContainer: + goto handle_WaitContainer + + case ffj_t_Responseno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=agent.Response_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetHealth: + + /* handler: uj.GetHealth type=agent.Response_GetHealth kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetHealth = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetHealth == nil { + uj.GetHealth = new(Response_GetHealth) + } + + err = uj.GetHealth.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetFlags: + + /* handler: uj.GetFlags type=agent.Response_GetFlags kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetFlags = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetFlags == nil { + uj.GetFlags = new(Response_GetFlags) + } + + err = uj.GetFlags.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetVersion: + + /* handler: uj.GetVersion type=agent.Response_GetVersion kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetVersion = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetVersion == nil { + uj.GetVersion = new(Response_GetVersion) + } + + err = uj.GetVersion.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetMetrics: + + /* handler: uj.GetMetrics type=agent.Response_GetMetrics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetMetrics = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetMetrics == nil { + uj.GetMetrics = new(Response_GetMetrics) + } + + err = uj.GetMetrics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetLoggingLevel: + + /* handler: uj.GetLoggingLevel type=agent.Response_GetLoggingLevel kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetLoggingLevel = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetLoggingLevel == nil { + uj.GetLoggingLevel = new(Response_GetLoggingLevel) + } + + err = uj.GetLoggingLevel.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ListFiles: + + /* handler: uj.ListFiles type=agent.Response_ListFiles kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ListFiles = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ListFiles == nil { + uj.ListFiles = new(Response_ListFiles) + } + + err = uj.ListFiles.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ReadFile: + + /* handler: uj.ReadFile type=agent.Response_ReadFile kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ReadFile = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ReadFile == nil { + uj.ReadFile = new(Response_ReadFile) + } + + err = uj.ReadFile.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetState: + + /* handler: uj.GetState type=agent.Response_GetState kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetState = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetState == nil { + uj.GetState = new(Response_GetState) + } + + err = uj.GetState.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetContainers: + + /* handler: uj.GetContainers type=agent.Response_GetContainers kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetContainers = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetContainers == nil { + uj.GetContainers = new(Response_GetContainers) + } + + err = uj.GetContainers.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetFrameworks: + + /* handler: uj.GetFrameworks type=agent.Response_GetFrameworks kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetFrameworks = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetFrameworks == nil { + uj.GetFrameworks = new(Response_GetFrameworks) + } + + err = uj.GetFrameworks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetExecutors: + + /* handler: uj.GetExecutors type=agent.Response_GetExecutors kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetExecutors = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetExecutors == nil { + uj.GetExecutors = new(Response_GetExecutors) + } + + err = uj.GetExecutors.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetOperations: + + /* handler: uj.GetOperations type=agent.Response_GetOperations kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetOperations = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetOperations == nil { + uj.GetOperations = new(Response_GetOperations) + } + + err = uj.GetOperations.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetTasks: + + /* handler: uj.GetTasks type=agent.Response_GetTasks kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetTasks = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetTasks == nil { + uj.GetTasks = new(Response_GetTasks) + } + + err = uj.GetTasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetAgent: + + /* handler: uj.GetAgent type=agent.Response_GetAgent kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetAgent = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetAgent == nil { + uj.GetAgent = new(Response_GetAgent) + } + + err = uj.GetAgent.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetResourceProviders: + + /* handler: uj.GetResourceProviders type=agent.Response_GetResourceProviders kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetResourceProviders = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetResourceProviders == nil { + uj.GetResourceProviders = new(Response_GetResourceProviders) + } + + err = uj.GetResourceProviders.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_WaitNestedContainer: + + /* handler: uj.WaitNestedContainer type=agent.Response_WaitNestedContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.WaitNestedContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.WaitNestedContainer == nil { + uj.WaitNestedContainer = new(Response_WaitNestedContainer) + } + + err = uj.WaitNestedContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_WaitContainer: + + /* handler: uj.WaitContainer type=agent.Response_WaitContainer kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.WaitContainer = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.WaitContainer == nil { + uj.WaitContainer = new(Response_WaitContainer) + } + + err = uj.WaitContainer.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetAgent) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetAgent) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.AgentInfo != nil { + if true { + buf.WriteString(`"agent_info":`) + + { + + err = mj.AgentInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetAgentbase = iota + ffj_t_Response_GetAgentno_such_key + + ffj_t_Response_GetAgent_AgentInfo +) + +var ffj_key_Response_GetAgent_AgentInfo = []byte("agent_info") + +func (uj *Response_GetAgent) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetAgent) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetAgentbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetAgentno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Response_GetAgent_AgentInfo, kn) { + currentKey = ffj_t_Response_GetAgent_AgentInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetAgent_AgentInfo, kn) { + currentKey = ffj_t_Response_GetAgent_AgentInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetAgentno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetAgent_AgentInfo: + goto handle_AgentInfo + + case ffj_t_Response_GetAgentno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_AgentInfo: + + /* handler: uj.AgentInfo type=mesos.AgentInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AgentInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AgentInfo == nil { + uj.AgentInfo = new(mesos.AgentInfo) + } + + err = uj.AgentInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetContainers) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetContainers) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"containers":`) + if mj.Containers != nil { + buf.WriteString(`[`) + for i, v := range mj.Containers { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetContainersbase = iota + ffj_t_Response_GetContainersno_such_key + + ffj_t_Response_GetContainers_Containers +) + +var ffj_key_Response_GetContainers_Containers = []byte("containers") + +func (uj *Response_GetContainers) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetContainers) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetContainersbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetContainersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Response_GetContainers_Containers, kn) { + currentKey = ffj_t_Response_GetContainers_Containers + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetContainers_Containers, kn) { + currentKey = ffj_t_Response_GetContainers_Containers + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetContainersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetContainers_Containers: + goto handle_Containers + + case ffj_t_Response_GetContainersno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Containers: + + /* handler: uj.Containers type=[]agent.Response_GetContainers_Container kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Containers = nil + } else { + + uj.Containers = []Response_GetContainers_Container{} + + wantVal := true + + for { + + var tmp_uj__Containers Response_GetContainers_Container + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Containers type=agent.Response_GetContainers_Container kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Containers.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Containers = append(uj.Containers, tmp_uj__Containers) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetContainers_Container) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetContainers_Container) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.FrameworkID != nil { + if true { + buf.WriteString(`"framework_id":`) + + { + + err = mj.FrameworkID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ExecutorID != nil { + if true { + buf.WriteString(`"executor_id":`) + + { + + err = mj.ExecutorID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ExecutorName != nil { + if true { + buf.WriteString(`"executor_name":`) + fflib.WriteJsonString(buf, string(*mj.ExecutorName)) + buf.WriteByte(',') + } + } + buf.WriteString(`"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.ContainerStatus != nil { + if true { + buf.WriteString(`"container_status":`) + + { + + err = mj.ContainerStatus.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ResourceStatistics != nil { + if true { + buf.WriteString(`"resource_statistics":`) + + { + + err = mj.ResourceStatistics.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetContainers_Containerbase = iota + ffj_t_Response_GetContainers_Containerno_such_key + + ffj_t_Response_GetContainers_Container_FrameworkID + + ffj_t_Response_GetContainers_Container_ExecutorID + + ffj_t_Response_GetContainers_Container_ExecutorName + + ffj_t_Response_GetContainers_Container_ContainerID + + ffj_t_Response_GetContainers_Container_ContainerStatus + + ffj_t_Response_GetContainers_Container_ResourceStatistics +) + +var ffj_key_Response_GetContainers_Container_FrameworkID = []byte("framework_id") + +var ffj_key_Response_GetContainers_Container_ExecutorID = []byte("executor_id") + +var ffj_key_Response_GetContainers_Container_ExecutorName = []byte("executor_name") + +var ffj_key_Response_GetContainers_Container_ContainerID = []byte("container_id") + +var ffj_key_Response_GetContainers_Container_ContainerStatus = []byte("container_status") + +var ffj_key_Response_GetContainers_Container_ResourceStatistics = []byte("resource_statistics") + +func (uj *Response_GetContainers_Container) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetContainers_Container) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetContainers_Containerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetContainers_Containerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Response_GetContainers_Container_ContainerID, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetContainers_Container_ContainerStatus, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ContainerStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_Response_GetContainers_Container_ExecutorID, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetContainers_Container_ExecutorName, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ExecutorName + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_Response_GetContainers_Container_FrameworkID, kn) { + currentKey = ffj_t_Response_GetContainers_Container_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Response_GetContainers_Container_ResourceStatistics, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ResourceStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetContainers_Container_ResourceStatistics, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ResourceStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetContainers_Container_ContainerStatus, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ContainerStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetContainers_Container_ContainerID, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetContainers_Container_ExecutorName, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ExecutorName + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetContainers_Container_ExecutorID, kn) { + currentKey = ffj_t_Response_GetContainers_Container_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetContainers_Container_FrameworkID, kn) { + currentKey = ffj_t_Response_GetContainers_Container_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetContainers_Containerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetContainers_Container_FrameworkID: + goto handle_FrameworkID + + case ffj_t_Response_GetContainers_Container_ExecutorID: + goto handle_ExecutorID + + case ffj_t_Response_GetContainers_Container_ExecutorName: + goto handle_ExecutorName + + case ffj_t_Response_GetContainers_Container_ContainerID: + goto handle_ContainerID + + case ffj_t_Response_GetContainers_Container_ContainerStatus: + goto handle_ContainerStatus + + case ffj_t_Response_GetContainers_Container_ResourceStatistics: + goto handle_ResourceStatistics + + case ffj_t_Response_GetContainers_Containerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_FrameworkID: + + /* handler: uj.FrameworkID type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.FrameworkID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.FrameworkID == nil { + uj.FrameworkID = new(mesos.FrameworkID) + } + + err = uj.FrameworkID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ExecutorID: + + /* handler: uj.ExecutorID type=mesos.ExecutorID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ExecutorID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ExecutorID == nil { + uj.ExecutorID = new(mesos.ExecutorID) + } + + err = uj.ExecutorID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ExecutorName: + + /* handler: uj.ExecutorName type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.ExecutorName = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.ExecutorName = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerStatus: + + /* handler: uj.ContainerStatus type=mesos.ContainerStatus kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ContainerStatus = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ContainerStatus == nil { + uj.ContainerStatus = new(mesos.ContainerStatus) + } + + err = uj.ContainerStatus.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ResourceStatistics: + + /* handler: uj.ResourceStatistics type=mesos.ResourceStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ResourceStatistics = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ResourceStatistics == nil { + uj.ResourceStatistics = new(mesos.ResourceStatistics) + } + + err = uj.ResourceStatistics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetExecutors) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetExecutors) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"executors":`) + if mj.Executors != nil { + buf.WriteString(`[`) + for i, v := range mj.Executors { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"completed_executors":`) + if mj.CompletedExecutors != nil { + buf.WriteString(`[`) + for i, v := range mj.CompletedExecutors { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetExecutorsbase = iota + ffj_t_Response_GetExecutorsno_such_key + + ffj_t_Response_GetExecutors_Executors + + ffj_t_Response_GetExecutors_CompletedExecutors +) + +var ffj_key_Response_GetExecutors_Executors = []byte("executors") + +var ffj_key_Response_GetExecutors_CompletedExecutors = []byte("completed_executors") + +func (uj *Response_GetExecutors) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetExecutors) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetExecutorsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetExecutorsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Response_GetExecutors_CompletedExecutors, kn) { + currentKey = ffj_t_Response_GetExecutors_CompletedExecutors + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_Response_GetExecutors_Executors, kn) { + currentKey = ffj_t_Response_GetExecutors_Executors + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetExecutors_CompletedExecutors, kn) { + currentKey = ffj_t_Response_GetExecutors_CompletedExecutors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetExecutors_Executors, kn) { + currentKey = ffj_t_Response_GetExecutors_Executors + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetExecutorsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetExecutors_Executors: + goto handle_Executors + + case ffj_t_Response_GetExecutors_CompletedExecutors: + goto handle_CompletedExecutors + + case ffj_t_Response_GetExecutorsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Executors: + + /* handler: uj.Executors type=[]agent.Response_GetExecutors_Executor kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Executors = nil + } else { + + uj.Executors = []Response_GetExecutors_Executor{} + + wantVal := true + + for { + + var tmp_uj__Executors Response_GetExecutors_Executor + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Executors type=agent.Response_GetExecutors_Executor kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Executors.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Executors = append(uj.Executors, tmp_uj__Executors) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CompletedExecutors: + + /* handler: uj.CompletedExecutors type=[]agent.Response_GetExecutors_Executor kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.CompletedExecutors = nil + } else { + + uj.CompletedExecutors = []Response_GetExecutors_Executor{} + + wantVal := true + + for { + + var tmp_uj__CompletedExecutors Response_GetExecutors_Executor + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__CompletedExecutors type=agent.Response_GetExecutors_Executor kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__CompletedExecutors.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.CompletedExecutors = append(uj.CompletedExecutors, tmp_uj__CompletedExecutors) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetExecutors_Executor) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetExecutors_Executor) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"executor_info":`) + + { + + err = mj.ExecutorInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetExecutors_Executorbase = iota + ffj_t_Response_GetExecutors_Executorno_such_key + + ffj_t_Response_GetExecutors_Executor_ExecutorInfo +) + +var ffj_key_Response_GetExecutors_Executor_ExecutorInfo = []byte("executor_info") + +func (uj *Response_GetExecutors_Executor) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetExecutors_Executor) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetExecutors_Executorbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetExecutors_Executorno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_Response_GetExecutors_Executor_ExecutorInfo, kn) { + currentKey = ffj_t_Response_GetExecutors_Executor_ExecutorInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Response_GetExecutors_Executor_ExecutorInfo, kn) { + currentKey = ffj_t_Response_GetExecutors_Executor_ExecutorInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetExecutors_Executorno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetExecutors_Executor_ExecutorInfo: + goto handle_ExecutorInfo + + case ffj_t_Response_GetExecutors_Executorno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ExecutorInfo: + + /* handler: uj.ExecutorInfo type=mesos.ExecutorInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ExecutorInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetFlags) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetFlags) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"flags":`) + if mj.Flags != nil { + buf.WriteString(`[`) + for i, v := range mj.Flags { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetFlagsbase = iota + ffj_t_Response_GetFlagsno_such_key + + ffj_t_Response_GetFlags_Flags +) + +var ffj_key_Response_GetFlags_Flags = []byte("flags") + +func (uj *Response_GetFlags) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetFlags) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetFlagsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetFlagsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'f': + + if bytes.Equal(ffj_key_Response_GetFlags_Flags, kn) { + currentKey = ffj_t_Response_GetFlags_Flags + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetFlags_Flags, kn) { + currentKey = ffj_t_Response_GetFlags_Flags + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetFlagsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetFlags_Flags: + goto handle_Flags + + case ffj_t_Response_GetFlagsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Flags: + + /* handler: uj.Flags type=[]mesos.Flag kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Flags = nil + } else { + + uj.Flags = []mesos.Flag{} + + wantVal := true + + for { + + var tmp_uj__Flags mesos.Flag + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Flags type=mesos.Flag kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Flags.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Flags = append(uj.Flags, tmp_uj__Flags) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetFrameworks) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetFrameworks) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"frameworks":`) + if mj.Frameworks != nil { + buf.WriteString(`[`) + for i, v := range mj.Frameworks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"completed_frameworks":`) + if mj.CompletedFrameworks != nil { + buf.WriteString(`[`) + for i, v := range mj.CompletedFrameworks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetFrameworksbase = iota + ffj_t_Response_GetFrameworksno_such_key + + ffj_t_Response_GetFrameworks_Frameworks + + ffj_t_Response_GetFrameworks_CompletedFrameworks +) + +var ffj_key_Response_GetFrameworks_Frameworks = []byte("frameworks") + +var ffj_key_Response_GetFrameworks_CompletedFrameworks = []byte("completed_frameworks") + +func (uj *Response_GetFrameworks) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetFrameworks) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetFrameworksbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetFrameworksno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Response_GetFrameworks_CompletedFrameworks, kn) { + currentKey = ffj_t_Response_GetFrameworks_CompletedFrameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_Response_GetFrameworks_Frameworks, kn) { + currentKey = ffj_t_Response_GetFrameworks_Frameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetFrameworks_CompletedFrameworks, kn) { + currentKey = ffj_t_Response_GetFrameworks_CompletedFrameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetFrameworks_Frameworks, kn) { + currentKey = ffj_t_Response_GetFrameworks_Frameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetFrameworksno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetFrameworks_Frameworks: + goto handle_Frameworks + + case ffj_t_Response_GetFrameworks_CompletedFrameworks: + goto handle_CompletedFrameworks + + case ffj_t_Response_GetFrameworksno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Frameworks: + + /* handler: uj.Frameworks type=[]agent.Response_GetFrameworks_Framework kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Frameworks = nil + } else { + + uj.Frameworks = []Response_GetFrameworks_Framework{} + + wantVal := true + + for { + + var tmp_uj__Frameworks Response_GetFrameworks_Framework + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Frameworks type=agent.Response_GetFrameworks_Framework kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Frameworks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Frameworks = append(uj.Frameworks, tmp_uj__Frameworks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CompletedFrameworks: + + /* handler: uj.CompletedFrameworks type=[]agent.Response_GetFrameworks_Framework kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.CompletedFrameworks = nil + } else { + + uj.CompletedFrameworks = []Response_GetFrameworks_Framework{} + + wantVal := true + + for { + + var tmp_uj__CompletedFrameworks Response_GetFrameworks_Framework + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__CompletedFrameworks type=agent.Response_GetFrameworks_Framework kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__CompletedFrameworks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.CompletedFrameworks = append(uj.CompletedFrameworks, tmp_uj__CompletedFrameworks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetFrameworks_Framework) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetFrameworks_Framework) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"framework_info":`) + + { + + err = mj.FrameworkInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetFrameworks_Frameworkbase = iota + ffj_t_Response_GetFrameworks_Frameworkno_such_key + + ffj_t_Response_GetFrameworks_Framework_FrameworkInfo +) + +var ffj_key_Response_GetFrameworks_Framework_FrameworkInfo = []byte("framework_info") + +func (uj *Response_GetFrameworks_Framework) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetFrameworks_Framework) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetFrameworks_Frameworkbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetFrameworks_Frameworkno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'f': + + if bytes.Equal(ffj_key_Response_GetFrameworks_Framework_FrameworkInfo, kn) { + currentKey = ffj_t_Response_GetFrameworks_Framework_FrameworkInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetFrameworks_Framework_FrameworkInfo, kn) { + currentKey = ffj_t_Response_GetFrameworks_Framework_FrameworkInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetFrameworks_Frameworkno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetFrameworks_Framework_FrameworkInfo: + goto handle_FrameworkInfo + + case ffj_t_Response_GetFrameworks_Frameworkno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_FrameworkInfo: + + /* handler: uj.FrameworkInfo type=mesos.FrameworkInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.FrameworkInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetHealth) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetHealth) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + if mj.Healthy { + buf.WriteString(`{"healthy":true`) + } else { + buf.WriteString(`{"healthy":false`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetHealthbase = iota + ffj_t_Response_GetHealthno_such_key + + ffj_t_Response_GetHealth_Healthy +) + +var ffj_key_Response_GetHealth_Healthy = []byte("healthy") + +func (uj *Response_GetHealth) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetHealth) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetHealthbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetHealthno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffj_key_Response_GetHealth_Healthy, kn) { + currentKey = ffj_t_Response_GetHealth_Healthy + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Response_GetHealth_Healthy, kn) { + currentKey = ffj_t_Response_GetHealth_Healthy + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetHealthno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetHealth_Healthy: + goto handle_Healthy + + case ffj_t_Response_GetHealthno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Healthy: + + /* handler: uj.Healthy type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + } else { + tmpb := fs.Output.Bytes() + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + uj.Healthy = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + uj.Healthy = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetLoggingLevel) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetLoggingLevel) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"level":`) + fflib.FormatBits2(buf, uint64(mj.Level), 10, false) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetLoggingLevelbase = iota + ffj_t_Response_GetLoggingLevelno_such_key + + ffj_t_Response_GetLoggingLevel_Level +) + +var ffj_key_Response_GetLoggingLevel_Level = []byte("level") + +func (uj *Response_GetLoggingLevel) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetLoggingLevel) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetLoggingLevelbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetLoggingLevelno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'l': + + if bytes.Equal(ffj_key_Response_GetLoggingLevel_Level, kn) { + currentKey = ffj_t_Response_GetLoggingLevel_Level + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Response_GetLoggingLevel_Level, kn) { + currentKey = ffj_t_Response_GetLoggingLevel_Level + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetLoggingLevelno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetLoggingLevel_Level: + goto handle_Level + + case ffj_t_Response_GetLoggingLevelno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Level: + + /* handler: uj.Level type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Level = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetMetrics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetMetrics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"metrics":`) + if mj.Metrics != nil { + buf.WriteString(`[`) + for i, v := range mj.Metrics { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetMetricsbase = iota + ffj_t_Response_GetMetricsno_such_key + + ffj_t_Response_GetMetrics_Metrics +) + +var ffj_key_Response_GetMetrics_Metrics = []byte("metrics") + +func (uj *Response_GetMetrics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetMetrics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetMetricsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetMetricsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'm': + + if bytes.Equal(ffj_key_Response_GetMetrics_Metrics, kn) { + currentKey = ffj_t_Response_GetMetrics_Metrics + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetMetrics_Metrics, kn) { + currentKey = ffj_t_Response_GetMetrics_Metrics + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetMetricsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetMetrics_Metrics: + goto handle_Metrics + + case ffj_t_Response_GetMetricsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Metrics: + + /* handler: uj.Metrics type=[]mesos.Metric kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Metrics = nil + } else { + + uj.Metrics = []mesos.Metric{} + + wantVal := true + + for { + + var tmp_uj__Metrics mesos.Metric + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Metrics type=mesos.Metric kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Metrics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Metrics = append(uj.Metrics, tmp_uj__Metrics) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetOperations) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetOperations) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"operations":`) + if mj.Operations != nil { + buf.WriteString(`[`) + for i, v := range mj.Operations { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetOperationsbase = iota + ffj_t_Response_GetOperationsno_such_key + + ffj_t_Response_GetOperations_Operations +) + +var ffj_key_Response_GetOperations_Operations = []byte("operations") + +func (uj *Response_GetOperations) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetOperations) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetOperationsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetOperationsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'o': + + if bytes.Equal(ffj_key_Response_GetOperations_Operations, kn) { + currentKey = ffj_t_Response_GetOperations_Operations + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetOperations_Operations, kn) { + currentKey = ffj_t_Response_GetOperations_Operations + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetOperationsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetOperations_Operations: + goto handle_Operations + + case ffj_t_Response_GetOperationsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Operations: + + /* handler: uj.Operations type=[]mesos.Operation kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Operations = nil + } else { + + uj.Operations = []mesos.Operation{} + + wantVal := true + + for { + + var tmp_uj__Operations mesos.Operation + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Operations type=mesos.Operation kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Operations.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Operations = append(uj.Operations, tmp_uj__Operations) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetResourceProviders) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetResourceProviders) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"resource_providers":`) + if mj.ResourceProviders != nil { + buf.WriteString(`[`) + for i, v := range mj.ResourceProviders { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetResourceProvidersbase = iota + ffj_t_Response_GetResourceProvidersno_such_key + + ffj_t_Response_GetResourceProviders_ResourceProviders +) + +var ffj_key_Response_GetResourceProviders_ResourceProviders = []byte("resource_providers") + +func (uj *Response_GetResourceProviders) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetResourceProviders) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetResourceProvidersbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetResourceProvidersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Response_GetResourceProviders_ResourceProviders, kn) { + currentKey = ffj_t_Response_GetResourceProviders_ResourceProviders + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetResourceProviders_ResourceProviders, kn) { + currentKey = ffj_t_Response_GetResourceProviders_ResourceProviders + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetResourceProvidersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetResourceProviders_ResourceProviders: + goto handle_ResourceProviders + + case ffj_t_Response_GetResourceProvidersno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ResourceProviders: + + /* handler: uj.ResourceProviders type=[]agent.Response_GetResourceProviders_ResourceProvider kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.ResourceProviders = nil + } else { + + uj.ResourceProviders = []Response_GetResourceProviders_ResourceProvider{} + + wantVal := true + + for { + + var tmp_uj__ResourceProviders Response_GetResourceProviders_ResourceProvider + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__ResourceProviders type=agent.Response_GetResourceProviders_ResourceProvider kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__ResourceProviders.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.ResourceProviders = append(uj.ResourceProviders, tmp_uj__ResourceProviders) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetResourceProviders_ResourceProvider) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetResourceProviders_ResourceProvider) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"resource_provider_info":`) + + { + + err = mj.ResourceProviderInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"total_resources":`) + if mj.TotalResources != nil { + buf.WriteString(`[`) + for i, v := range mj.TotalResources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetResourceProviders_ResourceProviderbase = iota + ffj_t_Response_GetResourceProviders_ResourceProviderno_such_key + + ffj_t_Response_GetResourceProviders_ResourceProvider_ResourceProviderInfo + + ffj_t_Response_GetResourceProviders_ResourceProvider_TotalResources +) + +var ffj_key_Response_GetResourceProviders_ResourceProvider_ResourceProviderInfo = []byte("resource_provider_info") + +var ffj_key_Response_GetResourceProviders_ResourceProvider_TotalResources = []byte("total_resources") + +func (uj *Response_GetResourceProviders_ResourceProvider) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetResourceProviders_ResourceProvider) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetResourceProviders_ResourceProviderbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetResourceProviders_ResourceProviderno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Response_GetResourceProviders_ResourceProvider_ResourceProviderInfo, kn) { + currentKey = ffj_t_Response_GetResourceProviders_ResourceProvider_ResourceProviderInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Response_GetResourceProviders_ResourceProvider_TotalResources, kn) { + currentKey = ffj_t_Response_GetResourceProviders_ResourceProvider_TotalResources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetResourceProviders_ResourceProvider_TotalResources, kn) { + currentKey = ffj_t_Response_GetResourceProviders_ResourceProvider_TotalResources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetResourceProviders_ResourceProvider_ResourceProviderInfo, kn) { + currentKey = ffj_t_Response_GetResourceProviders_ResourceProvider_ResourceProviderInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetResourceProviders_ResourceProviderno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetResourceProviders_ResourceProvider_ResourceProviderInfo: + goto handle_ResourceProviderInfo + + case ffj_t_Response_GetResourceProviders_ResourceProvider_TotalResources: + goto handle_TotalResources + + case ffj_t_Response_GetResourceProviders_ResourceProviderno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ResourceProviderInfo: + + /* handler: uj.ResourceProviderInfo type=mesos.ResourceProviderInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ResourceProviderInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TotalResources: + + /* handler: uj.TotalResources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.TotalResources = nil + } else { + + uj.TotalResources = []mesos.Resource{} + + wantVal := true + + for { + + var tmp_uj__TotalResources mesos.Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__TotalResources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__TotalResources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.TotalResources = append(uj.TotalResources, tmp_uj__TotalResources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetState) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetState) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.GetTasks != nil { + if true { + buf.WriteString(`"get_tasks":`) + + { + + err = mj.GetTasks.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetExecutors != nil { + if true { + buf.WriteString(`"get_executors":`) + + { + + err = mj.GetExecutors.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GetFrameworks != nil { + if true { + buf.WriteString(`"get_frameworks":`) + + { + + err = mj.GetFrameworks.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetStatebase = iota + ffj_t_Response_GetStateno_such_key + + ffj_t_Response_GetState_GetTasks + + ffj_t_Response_GetState_GetExecutors + + ffj_t_Response_GetState_GetFrameworks +) + +var ffj_key_Response_GetState_GetTasks = []byte("get_tasks") + +var ffj_key_Response_GetState_GetExecutors = []byte("get_executors") + +var ffj_key_Response_GetState_GetFrameworks = []byte("get_frameworks") + +func (uj *Response_GetState) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetState) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetStatebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetStateno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'g': + + if bytes.Equal(ffj_key_Response_GetState_GetTasks, kn) { + currentKey = ffj_t_Response_GetState_GetTasks + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetState_GetExecutors, kn) { + currentKey = ffj_t_Response_GetState_GetExecutors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Response_GetState_GetFrameworks, kn) { + currentKey = ffj_t_Response_GetState_GetFrameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetState_GetFrameworks, kn) { + currentKey = ffj_t_Response_GetState_GetFrameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetState_GetExecutors, kn) { + currentKey = ffj_t_Response_GetState_GetExecutors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetState_GetTasks, kn) { + currentKey = ffj_t_Response_GetState_GetTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetStateno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetState_GetTasks: + goto handle_GetTasks + + case ffj_t_Response_GetState_GetExecutors: + goto handle_GetExecutors + + case ffj_t_Response_GetState_GetFrameworks: + goto handle_GetFrameworks + + case ffj_t_Response_GetStateno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_GetTasks: + + /* handler: uj.GetTasks type=agent.Response_GetTasks kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetTasks = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetTasks == nil { + uj.GetTasks = new(Response_GetTasks) + } + + err = uj.GetTasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetExecutors: + + /* handler: uj.GetExecutors type=agent.Response_GetExecutors kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetExecutors = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetExecutors == nil { + uj.GetExecutors = new(Response_GetExecutors) + } + + err = uj.GetExecutors.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GetFrameworks: + + /* handler: uj.GetFrameworks type=agent.Response_GetFrameworks kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GetFrameworks = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GetFrameworks == nil { + uj.GetFrameworks = new(Response_GetFrameworks) + } + + err = uj.GetFrameworks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetTasks) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetTasks) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"pending_tasks":`) + if mj.PendingTasks != nil { + buf.WriteString(`[`) + for i, v := range mj.PendingTasks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"queued_tasks":`) + if mj.QueuedTasks != nil { + buf.WriteString(`[`) + for i, v := range mj.QueuedTasks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"launched_tasks":`) + if mj.LaunchedTasks != nil { + buf.WriteString(`[`) + for i, v := range mj.LaunchedTasks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"terminated_tasks":`) + if mj.TerminatedTasks != nil { + buf.WriteString(`[`) + for i, v := range mj.TerminatedTasks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"completed_tasks":`) + if mj.CompletedTasks != nil { + buf.WriteString(`[`) + for i, v := range mj.CompletedTasks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetTasksbase = iota + ffj_t_Response_GetTasksno_such_key + + ffj_t_Response_GetTasks_PendingTasks + + ffj_t_Response_GetTasks_QueuedTasks + + ffj_t_Response_GetTasks_LaunchedTasks + + ffj_t_Response_GetTasks_TerminatedTasks + + ffj_t_Response_GetTasks_CompletedTasks +) + +var ffj_key_Response_GetTasks_PendingTasks = []byte("pending_tasks") + +var ffj_key_Response_GetTasks_QueuedTasks = []byte("queued_tasks") + +var ffj_key_Response_GetTasks_LaunchedTasks = []byte("launched_tasks") + +var ffj_key_Response_GetTasks_TerminatedTasks = []byte("terminated_tasks") + +var ffj_key_Response_GetTasks_CompletedTasks = []byte("completed_tasks") + +func (uj *Response_GetTasks) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetTasks) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetTasksbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetTasksno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Response_GetTasks_CompletedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_CompletedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Response_GetTasks_LaunchedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_LaunchedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Response_GetTasks_PendingTasks, kn) { + currentKey = ffj_t_Response_GetTasks_PendingTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'q': + + if bytes.Equal(ffj_key_Response_GetTasks_QueuedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_QueuedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Response_GetTasks_TerminatedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_TerminatedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetTasks_CompletedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_CompletedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetTasks_TerminatedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_TerminatedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetTasks_LaunchedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_LaunchedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetTasks_QueuedTasks, kn) { + currentKey = ffj_t_Response_GetTasks_QueuedTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_GetTasks_PendingTasks, kn) { + currentKey = ffj_t_Response_GetTasks_PendingTasks + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetTasksno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetTasks_PendingTasks: + goto handle_PendingTasks + + case ffj_t_Response_GetTasks_QueuedTasks: + goto handle_QueuedTasks + + case ffj_t_Response_GetTasks_LaunchedTasks: + goto handle_LaunchedTasks + + case ffj_t_Response_GetTasks_TerminatedTasks: + goto handle_TerminatedTasks + + case ffj_t_Response_GetTasks_CompletedTasks: + goto handle_CompletedTasks + + case ffj_t_Response_GetTasksno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_PendingTasks: + + /* handler: uj.PendingTasks type=[]mesos.Task kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.PendingTasks = nil + } else { + + uj.PendingTasks = []mesos.Task{} + + wantVal := true + + for { + + var tmp_uj__PendingTasks mesos.Task + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__PendingTasks type=mesos.Task kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__PendingTasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.PendingTasks = append(uj.PendingTasks, tmp_uj__PendingTasks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_QueuedTasks: + + /* handler: uj.QueuedTasks type=[]mesos.Task kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.QueuedTasks = nil + } else { + + uj.QueuedTasks = []mesos.Task{} + + wantVal := true + + for { + + var tmp_uj__QueuedTasks mesos.Task + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__QueuedTasks type=mesos.Task kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__QueuedTasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.QueuedTasks = append(uj.QueuedTasks, tmp_uj__QueuedTasks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LaunchedTasks: + + /* handler: uj.LaunchedTasks type=[]mesos.Task kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.LaunchedTasks = nil + } else { + + uj.LaunchedTasks = []mesos.Task{} + + wantVal := true + + for { + + var tmp_uj__LaunchedTasks mesos.Task + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__LaunchedTasks type=mesos.Task kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__LaunchedTasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.LaunchedTasks = append(uj.LaunchedTasks, tmp_uj__LaunchedTasks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TerminatedTasks: + + /* handler: uj.TerminatedTasks type=[]mesos.Task kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.TerminatedTasks = nil + } else { + + uj.TerminatedTasks = []mesos.Task{} + + wantVal := true + + for { + + var tmp_uj__TerminatedTasks mesos.Task + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__TerminatedTasks type=mesos.Task kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__TerminatedTasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.TerminatedTasks = append(uj.TerminatedTasks, tmp_uj__TerminatedTasks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CompletedTasks: + + /* handler: uj.CompletedTasks type=[]mesos.Task kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.CompletedTasks = nil + } else { + + uj.CompletedTasks = []mesos.Task{} + + wantVal := true + + for { + + var tmp_uj__CompletedTasks mesos.Task + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__CompletedTasks type=mesos.Task kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__CompletedTasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.CompletedTasks = append(uj.CompletedTasks, tmp_uj__CompletedTasks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_GetVersion) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_GetVersion) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"version_info":`) + + { + + err = mj.VersionInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_GetVersionbase = iota + ffj_t_Response_GetVersionno_such_key + + ffj_t_Response_GetVersion_VersionInfo +) + +var ffj_key_Response_GetVersion_VersionInfo = []byte("version_info") + +func (uj *Response_GetVersion) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_GetVersion) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_GetVersionbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_GetVersionno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_Response_GetVersion_VersionInfo, kn) { + currentKey = ffj_t_Response_GetVersion_VersionInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_GetVersion_VersionInfo, kn) { + currentKey = ffj_t_Response_GetVersion_VersionInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_GetVersionno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_GetVersion_VersionInfo: + goto handle_VersionInfo + + case ffj_t_Response_GetVersionno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_VersionInfo: + + /* handler: uj.VersionInfo type=mesos.VersionInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.VersionInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_ListFiles) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_ListFiles) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"file_infos":`) + if mj.FileInfos != nil { + buf.WriteString(`[`) + for i, v := range mj.FileInfos { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_ListFilesbase = iota + ffj_t_Response_ListFilesno_such_key + + ffj_t_Response_ListFiles_FileInfos +) + +var ffj_key_Response_ListFiles_FileInfos = []byte("file_infos") + +func (uj *Response_ListFiles) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_ListFiles) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_ListFilesbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_ListFilesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'f': + + if bytes.Equal(ffj_key_Response_ListFiles_FileInfos, kn) { + currentKey = ffj_t_Response_ListFiles_FileInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_ListFiles_FileInfos, kn) { + currentKey = ffj_t_Response_ListFiles_FileInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_ListFilesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_ListFiles_FileInfos: + goto handle_FileInfos + + case ffj_t_Response_ListFilesno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_FileInfos: + + /* handler: uj.FileInfos type=[]mesos.FileInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.FileInfos = nil + } else { + + uj.FileInfos = []mesos.FileInfo{} + + wantVal := true + + for { + + var tmp_uj__FileInfos mesos.FileInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__FileInfos type=mesos.FileInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__FileInfos.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.FileInfos = append(uj.FileInfos, tmp_uj__FileInfos) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_ReadFile) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_ReadFile) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "size":`) + fflib.FormatBits2(buf, uint64(mj.Size), 10, false) + buf.WriteByte(',') + if len(mj.Data) != 0 { + buf.WriteString(`"data":`) + if mj.Data != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.Data)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_ReadFilebase = iota + ffj_t_Response_ReadFileno_such_key + + ffj_t_Response_ReadFile_Size + + ffj_t_Response_ReadFile_Data +) + +var ffj_key_Response_ReadFile_Size = []byte("size") + +var ffj_key_Response_ReadFile_Data = []byte("data") + +func (uj *Response_ReadFile) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_ReadFile) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_ReadFilebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_ReadFileno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_Response_ReadFile_Data, kn) { + currentKey = ffj_t_Response_ReadFile_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Response_ReadFile_Size, kn) { + currentKey = ffj_t_Response_ReadFile_Size + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Response_ReadFile_Data, kn) { + currentKey = ffj_t_Response_ReadFile_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_ReadFile_Size, kn) { + currentKey = ffj_t_Response_ReadFile_Size + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_ReadFileno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_ReadFile_Size: + goto handle_Size + + case ffj_t_Response_ReadFile_Data: + goto handle_Data + + case ffj_t_Response_ReadFileno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Size: + + /* handler: uj.Size type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Size = uint64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Data: + + /* handler: uj.Data type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Data = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.Data).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_WaitContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_WaitContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ExitStatus != nil { + if true { + buf.WriteString(`"exit_status":`) + fflib.FormatBits2(buf, uint64(*mj.ExitStatus), 10, *mj.ExitStatus < 0) + buf.WriteByte(',') + } + } + if mj.State != nil { + if true { + buf.WriteString(`"state":`) + + { + + obj, err = mj.State.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Reason != nil { + if true { + buf.WriteString(`"reason":`) + + { + + obj, err = mj.Reason.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Limitation != nil { + if true { + buf.WriteString(`"limitation":`) + + { + + err = mj.Limitation.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Message != nil { + if true { + buf.WriteString(`"message":`) + fflib.WriteJsonString(buf, string(*mj.Message)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_WaitContainerbase = iota + ffj_t_Response_WaitContainerno_such_key + + ffj_t_Response_WaitContainer_ExitStatus + + ffj_t_Response_WaitContainer_State + + ffj_t_Response_WaitContainer_Reason + + ffj_t_Response_WaitContainer_Limitation + + ffj_t_Response_WaitContainer_Message +) + +var ffj_key_Response_WaitContainer_ExitStatus = []byte("exit_status") + +var ffj_key_Response_WaitContainer_State = []byte("state") + +var ffj_key_Response_WaitContainer_Reason = []byte("reason") + +var ffj_key_Response_WaitContainer_Limitation = []byte("limitation") + +var ffj_key_Response_WaitContainer_Message = []byte("message") + +func (uj *Response_WaitContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_WaitContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_WaitContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_WaitContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_Response_WaitContainer_ExitStatus, kn) { + currentKey = ffj_t_Response_WaitContainer_ExitStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Response_WaitContainer_Limitation, kn) { + currentKey = ffj_t_Response_WaitContainer_Limitation + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_Response_WaitContainer_Message, kn) { + currentKey = ffj_t_Response_WaitContainer_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Response_WaitContainer_Reason, kn) { + currentKey = ffj_t_Response_WaitContainer_Reason + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Response_WaitContainer_State, kn) { + currentKey = ffj_t_Response_WaitContainer_State + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitContainer_Message, kn) { + currentKey = ffj_t_Response_WaitContainer_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Response_WaitContainer_Limitation, kn) { + currentKey = ffj_t_Response_WaitContainer_Limitation + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitContainer_Reason, kn) { + currentKey = ffj_t_Response_WaitContainer_Reason + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitContainer_State, kn) { + currentKey = ffj_t_Response_WaitContainer_State + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitContainer_ExitStatus, kn) { + currentKey = ffj_t_Response_WaitContainer_ExitStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_WaitContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_WaitContainer_ExitStatus: + goto handle_ExitStatus + + case ffj_t_Response_WaitContainer_State: + goto handle_State + + case ffj_t_Response_WaitContainer_Reason: + goto handle_Reason + + case ffj_t_Response_WaitContainer_Limitation: + goto handle_Limitation + + case ffj_t_Response_WaitContainer_Message: + goto handle_Message + + case ffj_t_Response_WaitContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ExitStatus: + + /* handler: uj.ExitStatus type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ExitStatus = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int32(tval) + uj.ExitStatus = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_State: + + /* handler: uj.State type=mesos.TaskState kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.State = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.State == nil { + uj.State = new(mesos.TaskState) + } + + err = uj.State.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Reason: + + /* handler: uj.Reason type=mesos.TaskStatus_Reason kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Reason = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Reason == nil { + uj.Reason = new(mesos.TaskStatus_Reason) + } + + err = uj.Reason.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Limitation: + + /* handler: uj.Limitation type=mesos.TaskResourceLimitation kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Limitation = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Limitation == nil { + uj.Limitation = new(mesos.TaskResourceLimitation) + } + + err = uj.Limitation.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Message: + + /* handler: uj.Message type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Message = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Message = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Response_WaitNestedContainer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Response_WaitNestedContainer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ExitStatus != nil { + if true { + buf.WriteString(`"exit_status":`) + fflib.FormatBits2(buf, uint64(*mj.ExitStatus), 10, *mj.ExitStatus < 0) + buf.WriteByte(',') + } + } + if mj.State != nil { + if true { + buf.WriteString(`"state":`) + + { + + obj, err = mj.State.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Reason != nil { + if true { + buf.WriteString(`"reason":`) + + { + + obj, err = mj.Reason.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Limitation != nil { + if true { + buf.WriteString(`"limitation":`) + + { + + err = mj.Limitation.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Message != nil { + if true { + buf.WriteString(`"message":`) + fflib.WriteJsonString(buf, string(*mj.Message)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Response_WaitNestedContainerbase = iota + ffj_t_Response_WaitNestedContainerno_such_key + + ffj_t_Response_WaitNestedContainer_ExitStatus + + ffj_t_Response_WaitNestedContainer_State + + ffj_t_Response_WaitNestedContainer_Reason + + ffj_t_Response_WaitNestedContainer_Limitation + + ffj_t_Response_WaitNestedContainer_Message +) + +var ffj_key_Response_WaitNestedContainer_ExitStatus = []byte("exit_status") + +var ffj_key_Response_WaitNestedContainer_State = []byte("state") + +var ffj_key_Response_WaitNestedContainer_Reason = []byte("reason") + +var ffj_key_Response_WaitNestedContainer_Limitation = []byte("limitation") + +var ffj_key_Response_WaitNestedContainer_Message = []byte("message") + +func (uj *Response_WaitNestedContainer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Response_WaitNestedContainer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Response_WaitNestedContainerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Response_WaitNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_Response_WaitNestedContainer_ExitStatus, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_ExitStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Response_WaitNestedContainer_Limitation, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_Limitation + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_Response_WaitNestedContainer_Message, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Response_WaitNestedContainer_Reason, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_Reason + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Response_WaitNestedContainer_State, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_State + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitNestedContainer_Message, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Response_WaitNestedContainer_Limitation, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_Limitation + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitNestedContainer_Reason, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_Reason + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitNestedContainer_State, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_State + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Response_WaitNestedContainer_ExitStatus, kn) { + currentKey = ffj_t_Response_WaitNestedContainer_ExitStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Response_WaitNestedContainerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Response_WaitNestedContainer_ExitStatus: + goto handle_ExitStatus + + case ffj_t_Response_WaitNestedContainer_State: + goto handle_State + + case ffj_t_Response_WaitNestedContainer_Reason: + goto handle_Reason + + case ffj_t_Response_WaitNestedContainer_Limitation: + goto handle_Limitation + + case ffj_t_Response_WaitNestedContainer_Message: + goto handle_Message + + case ffj_t_Response_WaitNestedContainerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ExitStatus: + + /* handler: uj.ExitStatus type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ExitStatus = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int32(tval) + uj.ExitStatus = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_State: + + /* handler: uj.State type=mesos.TaskState kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.State = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.State == nil { + uj.State = new(mesos.TaskState) + } + + err = uj.State.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Reason: + + /* handler: uj.Reason type=mesos.TaskStatus_Reason kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Reason = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Reason == nil { + uj.Reason = new(mesos.TaskStatus_Reason) + } + + err = uj.Reason.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Limitation: + + /* handler: uj.Limitation type=mesos.TaskResourceLimitation kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Limitation = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Limitation == nil { + uj.Limitation = new(mesos.TaskResourceLimitation) + } + + err = uj.Limitation.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Message: + + /* handler: uj.Message type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Message = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Message = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.proto b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.proto new file mode 100644 index 00000000..f1ec6180 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/agent.proto @@ -0,0 +1,706 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. + +syntax = "proto2"; + +package mesos.agent; + +import "github.com/mesos/mesos-go/api/v1/lib/mesos.proto"; +import "github.com/gogo/protobuf/gogoproto/gogo.proto"; + +option go_package = "agent"; +option (gogoproto.benchgen_all) = true; +option (gogoproto.enum_stringer_all) = true; +option (gogoproto.equal_all) = true; +option (gogoproto.goproto_enum_prefix_all) = false; +option (gogoproto.goproto_enum_stringer_all) = false; +option (gogoproto.goproto_stringer_all) = false; +option (gogoproto.goproto_unrecognized_all) = false; +option (gogoproto.gostring_all) = true; +option (gogoproto.marshaler_all) = true; +option (gogoproto.populate_all) = true; +option (gogoproto.protosizer_all) = true; +option (gogoproto.stringer_all) = true; +option (gogoproto.testgen_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.verbose_equal_all) = true; + +/** + * Calls that can be sent to the v1 agent API. + * + * A call is described using the standard protocol buffer "union" + * trick, see + * https://developers.google.com/protocol-buffers/docs/techniques#union. + */ +message Call { + // If a call of type `Call::FOO` requires additional parameters they can be + // included in the corresponding `Call::Foo` message. Similarly, if a call + // receives a synchronous response it will be returned as a `Response` + // message of type `Response::FOO`; see `Call::LaunchNestedContainerSession` + // and `Call::AttachContainerOutput` for exceptions. + enum Type { + UNKNOWN = 0; + + GET_HEALTH = 1; // Retrieves the agent's health status. + GET_FLAGS = 2; // Retrieves the agent's flag configuration. + GET_VERSION = 3; // Retrieves the agent's version information. + GET_METRICS = 4; // See 'GetMetrics' below. + + GET_LOGGING_LEVEL = 5; // Retrieves the agent's logging level. + SET_LOGGING_LEVEL = 6; // See 'SetLoggingLevel' below. + + LIST_FILES = 7; + READ_FILE = 8; // See 'ReadFile' below. + + GET_STATE = 9; + + GET_CONTAINERS = 10; + + // Retrieves the information about known frameworks. + GET_FRAMEWORKS = 11; + + // Retrieves the information about known executors. + GET_EXECUTORS = 12; + + // Retrieves the information about known operations. + GET_OPERATIONS = 31; + + // Retrieves the information about known tasks. + GET_TASKS = 13; + + // Retrieves the agent information. + GET_AGENT = 20; + + // Retrieves the information about known resource providers. + GET_RESOURCE_PROVIDERS = 26; + + // Calls for managing nested containers underneath an executor's container. + // Some of these calls are deprecated in favor of the calls + // for both standalone or nested containers further below. + LAUNCH_NESTED_CONTAINER = 14 [deprecated = true]; + WAIT_NESTED_CONTAINER = 15 [deprecated = true]; + KILL_NESTED_CONTAINER = 16 [deprecated = true]; + REMOVE_NESTED_CONTAINER = 21 [deprecated = true]; + + // See 'LaunchNestedContainerSession' below. + LAUNCH_NESTED_CONTAINER_SESSION = 17; + + ATTACH_CONTAINER_INPUT = 18; // See 'AttachContainerInput' below. + ATTACH_CONTAINER_OUTPUT = 19; // see 'AttachContainerOutput' below. + + // Calls for managing standalone containers + // or containers nested underneath another container. + LAUNCH_CONTAINER = 22; // See 'LaunchContainer' below. + WAIT_CONTAINER = 23; // See 'WaitContainer' below. + KILL_CONTAINER = 24; // See 'KillContainer' below. + REMOVE_CONTAINER = 25; // See 'RemoveContainer' below. + + ADD_RESOURCE_PROVIDER_CONFIG = 27; // See 'AddResourceProviderConfig' below. // NOLINT + UPDATE_RESOURCE_PROVIDER_CONFIG = 28; // See 'UpdateResourceProviderConfig' below. // NOLINT + REMOVE_RESOURCE_PROVIDER_CONFIG = 29; // See 'RemoveResourceProviderConfig' below. // NOLINT + + // Prune unused container images. + PRUNE_IMAGES = 30; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Provides a snapshot of the current metrics tracked by the agent. + message GetMetrics { + // If set, `timeout` would be used to determines the maximum amount of time + // the API will take to respond. If the timeout is exceeded, some metrics + // may not be included in the response. + optional DurationInfo timeout = 1; + } + + // Sets the logging verbosity level for a specified duration. Mesos uses + // [glog](https://github.com/google/glog) for logging. The library only uses + // verbose logging which means nothing will be output unless the verbosity + // level is set (by default it's 0, libprocess uses levels 1, 2, and 3). + message SetLoggingLevel { + // The verbosity level. + required uint32 level = 1 [(gogoproto.nullable) = false]; + // The duration to keep verbosity level toggled. After this duration, the + // verbosity level of log would revert to the original level. + required DurationInfo duration = 2 [(gogoproto.nullable) = false]; + } + + // Provides the file listing for a directory. + message ListFiles { + required string path = 1 [(gogoproto.nullable) = false]; + } + + // Reads data from a file. + message ReadFile { + // The path of file. + required string path = 1 [(gogoproto.nullable) = false]; + + // Initial offset in file to start reading from. + required uint64 offset = 2 [(gogoproto.nullable) = false]; + + // The maximum number of bytes to read. The read length is capped at 16 + // memory pages. + optional uint64 length = 3; + } + + // Lists active containers on the agent. + message GetContainers { + optional bool show_nested = 1; + optional bool show_standalone = 2; + } + + // Deprecated in favor of `LaunchContainer`. + message LaunchNestedContainer { + required ContainerID container_id = 1 [(gogoproto.customname) = "ContainerID", (gogoproto.nullable) = false]; + optional CommandInfo command = 2; + optional ContainerInfo container = 3; + } + + // Deprecated in favor of `WaitContainer`. + message WaitNestedContainer { + required ContainerID container_id = 1 [(gogoproto.customname) = "ContainerID", (gogoproto.nullable) = false]; + } + + // Deprecated in favor of `KillContainer`. + message KillNestedContainer { + required ContainerID container_id = 1 [(gogoproto.customname) = "ContainerID", (gogoproto.nullable) = false]; + optional int32 signal = 2; + } + + // Deprecated in favor of `RemoveContainer`. + message RemoveNestedContainer { + required ContainerID container_id = 1 [(gogoproto.customname) = "ContainerID", (gogoproto.nullable) = false]; + } + + // Launches a nested container within an executor's tree of containers. + // The differences between this call and `LaunchNestedContainer` are: + // 1) The container's life-cycle is tied to the lifetime of the + // connection used to make this call, i.e., if the connection ever + // breaks, the container will be destroyed. + // 2) The nested container shares the same namespaces and cgroups as + // its parent container. + // 3) Results in a streaming response of type `ProcessIO`. So the call + // needs to be made on a persistent connection. + message LaunchNestedContainerSession { + required ContainerID container_id = 1 [(gogoproto.customname) = "ContainerID", (gogoproto.nullable) = false]; + optional CommandInfo command = 2; + optional ContainerInfo container = 3; + } + + // Attaches the caller to the STDIN of the entry point of the container. + // Clients can use this to stream input data to a container. + // Note that this call needs to be made on a persistent connection by + // streaming a CONTAINER_ID message followed by one or more PROCESS_IO + // messages. + message AttachContainerInput { + enum Type { + UNKNOWN = 0; + CONTAINER_ID = 1; + PROCESS_IO = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + optional ContainerID container_id = 2 [(gogoproto.customname) = "ContainerID"]; + optional ProcessIO process_io = 3 [(gogoproto.customname) = "ProcessIO"]; + } + + // Attaches the caller to the STDOUT and STDERR of the entrypoint of + // the container. Clients can use this to stream output/error from the + // container. This call will result in a streaming response of `ProcessIO`; + // so this call needs to be made on a persistent connection. + message AttachContainerOutput { + required ContainerID container_id = 1 [(gogoproto.customname) = "ContainerID", (gogoproto.nullable) = false]; + } + + // Launches a either a "standalone" container on this agent + // or a nested container within another tree of containers. + // + // A standalone container is launched by specifying a ContainerID + // with no parent. Standalone containers bypass the normal offer cycle + // between the master and agent. Unlike other containers, a standalone + // container does not have an executor or any tasks. This means the + // standalone container does not report back to Mesos or any framework + // and must be supervised separately. + // + // A nested container is launched by specifying a ContainerID with + // another existing container (including standalone containers) + // as the parent. + // + // Returns 200 OK if the new container launch succeeds. + // Returns 202 Accepted if the requested ContainerID is already in use + // by a standalone or nested container. + // Returns 400 Bad Request if the container launch fails. + message LaunchContainer { + // NOTE: Some characters cannot be used in the ID. All characters + // must be valid filesystem path characters. In addition, '/' and '.' + // are reserved. + required ContainerID container_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ContainerID"]; + + optional CommandInfo command = 2; + + // NOTE: Nested containers may not specify resources and instead + // share resources with its parent container. + // + // TODO(josephw): These resources are purely used for isolation + // and are not accounted for by the Mesos master (if connected). + // It is the caller's responsibility to ensure that resources are + // not overcommitted (e.g. CPU and memory) or conflicting (e.g. ports + // and volumes). Once there is support for preempting tasks and a + // way to update the resources advertised by the agent, these standalone + // container resources should be accounted for by the master. + repeated Resource resources = 3 [(gogoproto.nullable) = false]; + + optional ContainerInfo container = 4; + } + + // Waits for the standalone or nested container to terminate + // and returns the exit status. + // + // Returns 200 OK if and when the container exits. + // Returns 404 Not Found if the container does not exist. + message WaitContainer { + required ContainerID container_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ContainerID"]; + } + + // Kills the standalone or nested container. The signal to be sent + // to the container can be specified in the 'signal' field. + // + // Returns 200 OK if the signal is sent successfully. + // Returns 404 Not Found if the container does not exist. + message KillContainer { + required ContainerID container_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ContainerID"]; + + // Defaults to SIGKILL. + optional int32 signal = 2; + } + + // Removes a container's artifacts (runtime and sandbox directories). + // + // For nested containers, it is important to use this call if multiple + // nested containers are launched under the same parent container, because + // garbage collection only takes place at the parent container. Artifacts + // belonging to nested containers will not be garbage collected while + // the parent container is running. + // + // TODO(josephw): A standalone container's runtime directory is currently + // garbage collected as soon as the container exits. To allow the user to + // retrieve the exit status reliably, the runtime directory cannot be + // garbage collected immediately. Instead, the user will eventually be + // required to make this call after the standalone container has exited. + // Also, a standalone container's sandbox directory is currently not + // garbage collected and is only deleted via this call. + // + // Returns 200 OK if the removal is successful or if the parent container + // (for nested containers) does not exist. + // Returns 500 Internal Server Error if anything goes wrong, including + // if the container is still running or does not exist. + // + // TODO(josephw): Consider returning a 400 Bad Request instead of 500 + // Internal Server Error when the user tries to remove a running or + // nonexistent nested container. + message RemoveContainer { + required ContainerID container_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ContainerID"]; + } + + // Adds a new resource provider config file. + // + // The content of the `info` field will be written into a new config file in + // the resource provider config directory, and a new resource provider will be + // launched asynchronously based on the config. Callers must not set the + // `info.id` field. This call is idempotent, so if a config file identical to + // the content of the `info` field already exists, this call will return + // without launching a resource provider. Note that if a config file is + // placed into the resource provider config directory out-of-band after the + // agent starts up, it will not be checked against this call. + // + // Returns 200 OK if a new config file is created, or an identical config file + // exists. + // Returns 400 Bad Request if `info` is not well-formed. + // Returns 403 Forbidden if the call is not authorized. + // Returns 409 Conflict if another config file that describes a + // resource provider of the same type and name exists, but the content is + // not identical. + // Returns 500 Internal Server Error if anything goes wrong. + message AddResourceProviderConfig { + required ResourceProviderInfo info = 1 [(gogoproto.nullable) = false]; + } + + // Updates an existing resource provider config file. + // + // The content of the `info` field will be written into an existing config + // file that describes a resource provider of the specified type and name in + // the resource provider config directory, and the corresponding resource + // provider will be relaunched asynchronously to reflect the changes in the + // config. Callers must not set the `info.id` field. This call is idempotent, + // so if there is no change in the config, this call will return without + // relaunching the resource provider. Note that if a config file is placed + // into the resource provider config directory out-of-band after the agent + // starts up, it will not be checked against this call. + // + // Returns 200 OK if an existing config file is updated, or there is no change + // in the config file. + // Returns 400 Bad Request if `info` is not well-formed. + // Returns 403 Forbidden if the call is not authorized. + // Returns 404 Not Found if no config file describes a resource + // provider of the same type and name exists. + // Returns 500 Internal Server Error if anything goes wrong. + message UpdateResourceProviderConfig { + required ResourceProviderInfo info = 1 [(gogoproto.nullable) = false]; + } + + // Removes a config file from the resource provider config directory. + // + // The config file that describes the resource provider of the specified type + // and name will be removed, and the corresponding resource provider will be + // terminated asynchronously. This call is idempotent, so if no matching + // config file exists, this call will return without terminating any resource + // provider. Note that if a config file is placed into the resource provider + // config directory out-of-band after the agent starts up, it will not be + // checked against this call. + // + // Returns 200 OK if the config file is removed, or no matching config file + // exists. + // Returns 403 Forbidden if the call is not authorized. + // Returns 500 Internal Server Error if anything goes wrong. + message RemoveResourceProviderConfig { + required string type = 1 [(gogoproto.nullable) = false]; + required string name = 2 [(gogoproto.nullable) = false]; + } + + // Prune unused container images from image store. + // + // Images and layers referenced by active containers as well as + // image references specified in `excluded_images` will not be pruned. + message PruneImages { + repeated Image excluded_images = 1 [(gogoproto.nullable) = false]; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + + optional GetMetrics get_metrics = 2; + optional SetLoggingLevel set_logging_level = 3; + optional ListFiles list_files = 4; + optional ReadFile read_file = 5; + + optional GetContainers get_containers = 20; + + optional LaunchNestedContainer launch_nested_container = 6 + [deprecated = true]; + + optional WaitNestedContainer wait_nested_container = 7 [deprecated = true]; + optional KillNestedContainer kill_nested_container = 8 [deprecated = true]; + optional RemoveNestedContainer remove_nested_container = 12 + [deprecated = true]; + + optional LaunchNestedContainerSession launch_nested_container_session = 9; + optional AttachContainerInput attach_container_input = 10; + optional AttachContainerOutput attach_container_output = 11; + optional LaunchContainer launch_container = 13; + optional WaitContainer wait_container = 14; + optional KillContainer kill_container = 15; + optional RemoveContainer remove_container = 16; + + optional AddResourceProviderConfig add_resource_provider_config = 17; + optional UpdateResourceProviderConfig update_resource_provider_config = 18; + optional RemoveResourceProviderConfig remove_resource_provider_config = 19; + + optional PruneImages prune_images = 21; +} + + +/** + * Synchronous responses for all calls made to the v1 agent API. + */ +message Response { + // Each of the responses of type `FOO` corresponds to `Foo` message below. + enum Type { + UNKNOWN = 0; + + GET_HEALTH = 1; // See 'GetHealth' below. + GET_FLAGS = 2; // See 'GetFlags' below. + GET_VERSION = 3; // See 'GetVersion' below. + GET_METRICS = 4; // See 'GetMetrics' below. + + GET_LOGGING_LEVEL = 5; // See 'GetLoggingLevel' below. + + LIST_FILES = 6; + READ_FILE = 7; // See 'ReadFile' below. + + GET_STATE = 8; + + GET_CONTAINERS = 9; + GET_FRAMEWORKS = 10; // See 'GetFrameworks' below. + GET_EXECUTORS = 11; // See 'GetExecutors' below. + GET_OPERATIONS = 17; // See 'GetOperations' below. + GET_TASKS = 12; // See 'GetTasks' below. + GET_AGENT = 14; // See 'GetAgent' below. + GET_RESOURCE_PROVIDERS = 16; // See 'GetResourceProviders' below. + + WAIT_NESTED_CONTAINER = 13 [deprecated = true]; + WAIT_CONTAINER = 15; // See 'WaitContainer' below. + + option (gogoproto.goproto_enum_prefix) = true; + } + + // `healthy` would be true if the agent is healthy. Delayed responses are also + // indicative of the poor health of the agent. + message GetHealth { + required bool healthy = 1 [(gogoproto.nullable) = false]; + } + + // Contains the flag configuration of the agent. + message GetFlags { + repeated Flag flags = 1 [(gogoproto.nullable) = false]; + } + + // Contains the version information of the agent. + message GetVersion { + required VersionInfo version_info = 1 [(gogoproto.nullable) = false]; + } + + // Contains a snapshot of the current metrics. + message GetMetrics { + repeated Metric metrics = 1 [(gogoproto.nullable) = false]; + } + + // Contains the logging level of the agent. + message GetLoggingLevel { + required uint32 level = 1 [(gogoproto.nullable) = false]; + } + + // Contains the file listing(similar to `ls -l`) for a directory. + message ListFiles { + repeated FileInfo file_infos = 1 [(gogoproto.nullable) = false]; + } + + // Contains the file data. + message ReadFile { + // The size of file (in bytes). + required uint64 size = 1 [(gogoproto.nullable) = false]; + + required bytes data = 2; + } + + // Contains full state of the agent i.e. information about the tasks, + // frameworks and executors running in the cluster. + message GetState { + optional GetTasks get_tasks = 1; + optional GetExecutors get_executors = 2; + optional GetFrameworks get_frameworks = 3; + } + + // Information about containers running on this agent. It contains + // ContainerStatus and ResourceStatistics along with some metadata + // of the containers. + message GetContainers { + message Container { + optional FrameworkID framework_id = 1 [(gogoproto.customname) = "FrameworkID"]; + optional ExecutorID executor_id = 2 [(gogoproto.customname) = "ExecutorID"]; + optional string executor_name = 3; + required ContainerID container_id = 4 [(gogoproto.customname) = "ContainerID", (gogoproto.nullable) = false]; + optional ContainerStatus container_status = 5; + optional ResourceStatistics resource_statistics = 6; + } + + repeated Container containers = 1 [(gogoproto.nullable) = false]; + } + + // Information about all the frameworks known to the agent at the current + // time. + message GetFrameworks { + message Framework { + required FrameworkInfo framework_info = 1 [(gogoproto.nullable) = false]; + } + + repeated Framework frameworks = 1 [(gogoproto.nullable) = false]; + repeated Framework completed_frameworks = 2 [(gogoproto.nullable) = false]; + } + + // Lists information about all the executors known to the agent at the + // current time. + message GetExecutors { + message Executor { + required ExecutorInfo executor_info = 1 [(gogoproto.nullable) = false]; + } + + repeated Executor executors = 1 [(gogoproto.nullable) = false]; + repeated Executor completed_executors = 2 [(gogoproto.nullable) = false]; + } + + // Lists information about all operations known to the agent at the + // current time. + message GetOperations { + repeated Operation operations = 1 [(gogoproto.nullable) = false]; + } + + // Lists information about all the tasks known to the agent at the current + // time. + message GetTasks { + // Tasks that are pending in the agent's queue before an executor is + // launched. + repeated Task pending_tasks = 1 [(gogoproto.nullable) = false]; + + // Tasks that are enqueued for a launched executor that has not yet + // registered. + repeated Task queued_tasks = 2 [(gogoproto.nullable) = false]; + + // Tasks that are running. + repeated Task launched_tasks = 3 [(gogoproto.nullable) = false]; + + // Tasks that are terminated but pending updates. + repeated Task terminated_tasks = 4 [(gogoproto.nullable) = false]; + + // Tasks that are terminated and updates acked. + repeated Task completed_tasks = 5 [(gogoproto.nullable) = false]; + } + + // Contains the agent's information. + message GetAgent { + optional AgentInfo agent_info = 1; + } + + // Lists information about all resource providers known to the agent + // at the current time. + message GetResourceProviders { + message ResourceProvider { + required ResourceProviderInfo resource_provider_info = 1 [(gogoproto.nullable) = false]; + repeated Resource total_resources = 2 [(gogoproto.nullable) = false]; + } + + repeated ResourceProvider resource_providers = 1 [(gogoproto.nullable) = false]; + } + + // Returns termination information about the nested container. + message WaitNestedContainer { + // Wait status of the lead process in the container. Note that this + // is the return value of `wait(2)`, so callers must use the `wait(2)` + // family of macros to extract whether the process exited cleanly and + // what the exit code was. + optional int32 exit_status = 1; + + // The `state` and `reason` fields may be populated if the Mesos agent + // terminates the container. In the absence of any special knowledge, + // executors should propagate this information via the `status` field + // of an `Update` call for the corresponding TaskID. + optional TaskState state = 2; + optional TaskStatus.Reason reason = 3; + + // This field will be populated if the task was terminated due to + // a resource limitation. + optional TaskResourceLimitation limitation = 4; + + optional string message = 5; + } + + // Returns termination information about the standalone or nested container. + message WaitContainer { + // Wait status of the lead process in the container. Note that this + // is the return value of `wait(2)`, so callers must use the `wait(2)` + // family of macros to extract whether the process exited cleanly and + // what the exit code was. + optional int32 exit_status = 1; + + // The `state` and `reason` fields may be populated if the Mesos agent + // terminates the container. In the absence of any special knowledge, + // executors should propagate this information via the `status` field + // of an `Update` call for the corresponding TaskID. + optional TaskState state = 2; + optional TaskStatus.Reason reason = 3; + + // This field will be populated if the task was terminated due to + // a resource limitation. + optional TaskResourceLimitation limitation = 4; + + optional string message = 5; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + + optional GetHealth get_health = 2; + optional GetFlags get_flags = 3; + optional GetVersion get_version = 4; + optional GetMetrics get_metrics = 5; + optional GetLoggingLevel get_logging_level = 6; + optional ListFiles list_files = 7; + optional ReadFile read_file = 8; + optional GetState get_state = 9; + optional GetContainers get_containers = 10; + optional GetFrameworks get_frameworks = 11; + optional GetExecutors get_executors = 12; + optional GetOperations get_operations = 18; + optional GetTasks get_tasks = 13; + optional GetAgent get_agent = 15; + optional GetResourceProviders get_resource_providers = 17; + optional WaitNestedContainer wait_nested_container = 14; + optional WaitContainer wait_container = 16; +} + + +/** + * Streaming response to `Call::LAUNCH_NESTED_CONTAINER_SESSION` and + * `Call::ATTACH_CONTAINER_OUTPUT`. + * + * This message is also used to stream request data for + * `Call::ATTACH_CONTAINER_INPUT`. + */ +message ProcessIO { + enum Type { + UNKNOWN = 0; + DATA = 1; + CONTROL = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + message Data { + enum Type { + UNKNOWN = 0; + STDIN = 1; + STDOUT = 2; + STDERR = 3; + + option (gogoproto.goproto_enum_prefix) = true; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + optional bytes data = 2; + } + + + message Control { + enum Type { + UNKNOWN = 0; + TTY_INFO = 1; + HEARTBEAT = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + message Heartbeat { + optional DurationInfo interval = 1; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + optional TTYInfo tty_info = 2 [(gogoproto.customname) = "TTYInfo"]; + optional Heartbeat heartbeat = 3; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + optional Data data = 2; + optional Control control = 3; +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/BUILD new file mode 100644 index 00000000..1ab26e88 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "calls.go", + "calls_generated.go", + "gen.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls", + importpath = "github.com/mesos/mesos-go/api/v1/lib/agent/calls", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/mesos/mesos-go/api/v1/lib:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/agent:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls.go new file mode 100644 index 00000000..c2acacc2 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls.go @@ -0,0 +1,258 @@ +package calls + +import ( + "time" + + "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/agent" +) + +func GetHealth() *agent.Call { return &agent.Call{Type: agent.Call_GET_HEALTH} } + +func GetFlags() *agent.Call { return &agent.Call{Type: agent.Call_GET_FLAGS} } + +func GetVersion() *agent.Call { return &agent.Call{Type: agent.Call_GET_VERSION} } + +func GetMetrics(d *time.Duration) (call *agent.Call) { + call = &agent.Call{ + Type: agent.Call_GET_METRICS, + GetMetrics: &agent.Call_GetMetrics{}, + } + if d != nil { + call.GetMetrics.Timeout = &mesos.DurationInfo{ + Nanoseconds: d.Nanoseconds(), + } + } + return +} + +func GetLoggingLevel() *agent.Call { return &agent.Call{Type: agent.Call_GET_LOGGING_LEVEL} } + +func SetLoggingLevel(level uint32, d time.Duration) *agent.Call { + return &agent.Call{ + Type: agent.Call_SET_LOGGING_LEVEL, + SetLoggingLevel: &agent.Call_SetLoggingLevel{ + Duration: mesos.DurationInfo{Nanoseconds: d.Nanoseconds()}, + Level: level, + }, + } +} + +func ListFiles(path string) *agent.Call { + return &agent.Call{ + Type: agent.Call_LIST_FILES, + ListFiles: &agent.Call_ListFiles{ + Path: path, + }, + } +} + +func ReadFile(path string, offset uint64) *agent.Call { + return &agent.Call{ + Type: agent.Call_READ_FILE, + ReadFile: &agent.Call_ReadFile{ + Path: path, + Offset: offset, + }, + } +} + +func ReadFileWithLength(path string, offset, length uint64) (call *agent.Call) { + call = ReadFile(path, offset) + call.ReadFile.Length = &length + return +} + +func GetState() *agent.Call { return &agent.Call{Type: agent.Call_GET_STATE} } + +func GetContainers() *agent.Call { return &agent.Call{Type: agent.Call_GET_CONTAINERS} } + +func GetFrameworks() *agent.Call { return &agent.Call{Type: agent.Call_GET_FRAMEWORKS} } + +func GetExecutors() *agent.Call { return &agent.Call{Type: agent.Call_GET_EXECUTORS} } + +func GetOperations() *agent.Call { return &agent.Call{Type: agent.Call_GET_OPERATIONS} } + +func GetTasks() *agent.Call { return &agent.Call{Type: agent.Call_GET_TASKS} } + +func GetAgent() *agent.Call { return &agent.Call{Type: agent.Call_GET_AGENT} } + +func GetResourceProviders() *agent.Call { return &agent.Call{Type: agent.Call_GET_RESOURCE_PROVIDERS} } + +func LaunchNestedContainer(cid mesos.ContainerID, cmd *mesos.CommandInfo, ci *mesos.ContainerInfo) *agent.Call { + return &agent.Call{ + Type: agent.Call_LAUNCH_NESTED_CONTAINER, + LaunchNestedContainer: &agent.Call_LaunchNestedContainer{ + ContainerID: cid, + Command: cmd, + Container: ci, + }, + } +} + +func LaunchContainer(cid mesos.ContainerID, cmd *mesos.CommandInfo, ci *mesos.ContainerInfo, r []mesos.Resource) *agent.Call { + return &agent.Call{ + Type: agent.Call_LAUNCH_CONTAINER, + LaunchContainer: &agent.Call_LaunchContainer{ + ContainerID: cid, + Command: cmd, + Container: ci, + Resources: r, + }, + } +} + +func WaitNestedContainer(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_WAIT_NESTED_CONTAINER, + WaitNestedContainer: &agent.Call_WaitNestedContainer{ + ContainerID: cid, + }, + } +} + +func WaitContainer(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_WAIT_CONTAINER, + WaitContainer: &agent.Call_WaitContainer{ + ContainerID: cid, + }, + } +} + +func KillNestedContainer(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_KILL_NESTED_CONTAINER, + KillNestedContainer: &agent.Call_KillNestedContainer{ + ContainerID: cid, + }, + } +} + +func KillContainer(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_KILL_CONTAINER, + KillContainer: &agent.Call_KillContainer{ + ContainerID: cid, + }, + } +} + +func RemoveNestedContainer(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_REMOVE_NESTED_CONTAINER, + RemoveNestedContainer: &agent.Call_RemoveNestedContainer{ + ContainerID: cid, + }, + } +} + +func RemoveContainer(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_REMOVE_CONTAINER, + RemoveContainer: &agent.Call_RemoveContainer{ + ContainerID: cid, + }, + } +} + +func LaunchNestedContainerSession(cid mesos.ContainerID, cmd *mesos.CommandInfo, ci *mesos.ContainerInfo) *agent.Call { + return &agent.Call{ + Type: agent.Call_LAUNCH_NESTED_CONTAINER_SESSION, + LaunchNestedContainerSession: &agent.Call_LaunchNestedContainerSession{ + ContainerID: cid, + Command: cmd, + Container: ci, + }, + } +} + +func AttachContainerOutput(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_ATTACH_CONTAINER_OUTPUT, + AttachContainerOutput: &agent.Call_AttachContainerOutput{ + ContainerID: cid, + }, + } +} + +// AttachContainerInput returns a Call that is used to initiate attachment to a container's stdin. +// Callers should first send this Call followed by one or more AttachContainerInputXxx calls. +func AttachContainerInput(cid mesos.ContainerID) *agent.Call { + return &agent.Call{ + Type: agent.Call_ATTACH_CONTAINER_INPUT, + AttachContainerInput: &agent.Call_AttachContainerInput{ + Type: agent.Call_AttachContainerInput_CONTAINER_ID, + ContainerID: &cid, + }, + } +} + +func AttachContainerInputData(data []byte) *agent.Call { + return &agent.Call{ + Type: agent.Call_ATTACH_CONTAINER_INPUT, + AttachContainerInput: &agent.Call_AttachContainerInput{ + Type: agent.Call_AttachContainerInput_PROCESS_IO, + ProcessIO: &agent.ProcessIO{ + Type: agent.ProcessIO_DATA, + Data: &agent.ProcessIO_Data{ + Type: agent.ProcessIO_Data_STDIN, + Data: data, + }, + }, + }, + } +} + +func AttachContainerInputTTY(t *mesos.TTYInfo) *agent.Call { + return &agent.Call{ + Type: agent.Call_ATTACH_CONTAINER_INPUT, + AttachContainerInput: &agent.Call_AttachContainerInput{ + Type: agent.Call_AttachContainerInput_PROCESS_IO, + ProcessIO: &agent.ProcessIO{ + Type: agent.ProcessIO_CONTROL, + Control: &agent.ProcessIO_Control{ + Type: agent.ProcessIO_Control_TTY_INFO, + TTYInfo: t, + }, + }, + }, + } +} + +func AddResourceProviderConfig(rpi mesos.ResourceProviderInfo) *agent.Call { + return &agent.Call{ + Type: agent.Call_ADD_RESOURCE_PROVIDER_CONFIG, + AddResourceProviderConfig: &agent.Call_AddResourceProviderConfig{ + Info: rpi, + }, + } +} + +func UpdateResourceProviderConfig(rpi mesos.ResourceProviderInfo) *agent.Call { + return &agent.Call{ + Type: agent.Call_UPDATE_RESOURCE_PROVIDER_CONFIG, + UpdateResourceProviderConfig: &agent.Call_UpdateResourceProviderConfig{ + Info: rpi, + }, + } +} + +func RemoveResourceProviderConfig(typ, name string) *agent.Call { + return &agent.Call{ + Type: agent.Call_REMOVE_RESOURCE_PROVIDER_CONFIG, + RemoveResourceProviderConfig: &agent.Call_RemoveResourceProviderConfig{ + Type: typ, + Name: name, + }, + } +} + +func PruneImages(excluded []mesos.Image) *agent.Call { + return &agent.Call{ + Type: agent.Call_PRUNE_IMAGES, + PruneImages: &agent.Call_PruneImages{ + ExcludedImages: excluded, + }, + } +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls_generated.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls_generated.go new file mode 100644 index 00000000..98816f55 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/calls_generated.go @@ -0,0 +1,129 @@ +package calls + +// go generate -import github.com/mesos/mesos-go/api/v1/lib/agent -type C:agent.Call +// GENERATED CODE FOLLOWS; DO NOT EDIT. + +import ( + "context" + + "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/encoding" + + "github.com/mesos/mesos-go/api/v1/lib/agent" +) + +type ( + // Request generates a Call that's sent to a Mesos agent. Subsequent invocations are expected to + // yield equivalent calls. Intended for use w/ non-streaming requests to an agent. + Request interface { + Call() *agent.Call + } + + // RequestFunc is the functional adaptation of Request. + RequestFunc func() *agent.Call + + // RequestStreaming generates a Call that's send to a Mesos agent. Subsequent invocations MAY generate + // different Call objects. No more Call objects are expected once a nil is returned to signal the end of + // of the request stream. + RequestStreaming interface { + Request + IsStreaming() + } + + // RequestStreamingFunc is the functional adaptation of RequestStreaming. + RequestStreamingFunc func() *agent.Call + + // Send issues a Request to a Mesos agent and properly manages Call-specific mechanics. + Sender interface { + Send(context.Context, Request) (mesos.Response, error) + } + + // SenderFunc is the functional adaptation of the Sender interface + SenderFunc func(context.Context, Request) (mesos.Response, error) +) + +func (f RequestFunc) Call() *agent.Call { return f() } + +func (f RequestFunc) Marshaler() encoding.Marshaler { + // avoid returning (*agent.Call)(nil) for interface type + if call := f(); call != nil { + return call + } + return nil +} + +func (f RequestStreamingFunc) Push(c ...*agent.Call) RequestStreamingFunc { return Push(f, c...) } + +func (f RequestStreamingFunc) Marshaler() encoding.Marshaler { + // avoid returning (*agent.Call)(nil) for interface type + if call := f(); call != nil { + return call + } + return nil +} + +func (f RequestStreamingFunc) IsStreaming() {} + +func (f RequestStreamingFunc) Call() *agent.Call { return f() } + +// Push prepends one or more calls onto a request stream. If no calls are given then the original stream is returned. +func Push(r RequestStreaming, c ...*agent.Call) RequestStreamingFunc { + return func() *agent.Call { + if len(c) == 0 { + return r.Call() + } + head := c[0] + c = c[1:] + return head + } +} + +// Empty generates a stream that always returns nil. +func Empty() RequestStreamingFunc { return func() *agent.Call { return nil } } + +var ( + _ = Request(RequestFunc(nil)) + _ = RequestStreaming(RequestStreamingFunc(nil)) + _ = Sender(SenderFunc(nil)) +) + +// NonStreaming returns a RequestFunc that always generates the same Call. +func NonStreaming(c *agent.Call) RequestFunc { return func() *agent.Call { return c } } + +// FromChan returns a streaming request that fetches calls from the given channel until it closes. +// If a nil chan is specified then the returned func will always generate nil. +func FromChan(ch <-chan *agent.Call) RequestStreamingFunc { + if ch == nil { + // avoid blocking forever if we're handed a nil chan + return func() *agent.Call { return nil } + } + return func() *agent.Call { + if m, ok := <-ch; ok { + return m + } + return nil + } +} + +// Send implements the Sender interface for SenderFunc +func (f SenderFunc) Send(ctx context.Context, r Request) (mesos.Response, error) { + return f(ctx, r) +} + +// IgnoreResponse generates a sender that closes any non-nil response received by Mesos. +func IgnoreResponse(s Sender) SenderFunc { + return func(ctx context.Context, r Request) (mesos.Response, error) { + resp, err := s.Send(ctx, r) + if resp != nil { + resp.Close() + } + return nil, err + } +} + +// SendNoData is a convenience func that executes the given Call using the provided Sender +// and always drops the response data. +func SendNoData(ctx context.Context, sender Sender, r Request) (err error) { + _, err = IgnoreResponse(sender).Send(ctx, r) + return +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/gen.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/gen.go new file mode 100644 index 00000000..53693c06 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls/gen.go @@ -0,0 +1,3 @@ +package calls + +//go:generate go run ../../extras/gen/sender.go ../../extras/gen/gen.go -import github.com/mesos/mesos-go/api/v1/lib/agent -type C:agent.Call diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/client.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/client.go new file mode 100644 index 00000000..233fe362 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/client.go @@ -0,0 +1,71 @@ +package mesos + +// DEPRECATED in favor of github.com/mesos/mesos-go/api/v1/lib/client + +import ( + "io" + + "github.com/mesos/mesos-go/api/v1/lib/encoding" +) + +// A Client represents a Mesos API client which can send Calls and return +// a streaming Decoder from which callers can read Events from, an io.Closer to +// close the event stream on graceful termination and an error in case of failure. +type Client interface { + Do(encoding.Marshaler) (Response, error) +} + +// ClientFunc is a functional adapter of the Client interface +type ClientFunc func(encoding.Marshaler) (Response, error) + +// Do implements Client +func (cf ClientFunc) Do(m encoding.Marshaler) (Response, error) { return cf(m) } + +// Response captures the output of a Mesos API operation. Callers are responsible for invoking +// Close when they're finished processing the response otherwise there may be connection leaks. +type Response interface { + io.Closer + encoding.Decoder +} + +// ResponseDecorator optionally modifies the behavior of a Response +type ResponseDecorator interface { + Decorate(Response) Response +} + +// ResponseDecoratorFunc is the functional adapter for ResponseDecorator +type ResponseDecoratorFunc func(Response) Response + +func (f ResponseDecoratorFunc) Decorate(r Response) Response { return f(r) } + +// CloseFunc is the functional adapter for io.Closer +type CloseFunc func() error + +// Close implements io.Closer +func (f CloseFunc) Close() error { return f() } + +// ResponseWrapper delegates to optional overrides for invocations of Response methods. +type ResponseWrapper struct { + Response Response + Closer io.Closer + Decoder encoding.Decoder +} + +func (wrapper *ResponseWrapper) Close() error { + if wrapper.Closer != nil { + return wrapper.Closer.Close() + } + if wrapper.Response != nil { + return wrapper.Response.Close() + } + return nil +} + +func (wrapper *ResponseWrapper) Decode(u encoding.Unmarshaler) error { + if wrapper.Decoder != nil { + return wrapper.Decoder.Decode(u) + } + return wrapper.Response.Decode(u) +} + +var _ = Response(&ResponseWrapper{}) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/client/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/client/BUILD new file mode 100644 index 00000000..7ab28b0b --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/client/BUILD @@ -0,0 +1,24 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["client.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/client", + importpath = "github.com/mesos/mesos-go/api/v1/lib/client", + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/client/client.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/client/client.go new file mode 100644 index 00000000..0f0d0dd8 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/client/client.go @@ -0,0 +1,54 @@ +package client + +import ( + "github.com/mesos/mesos-go/api/v1/lib/encoding" +) + +type ( + // ResponseClass indicates the kind of response that a caller is expecting from Mesos. + ResponseClass int + + // Request is a non-streaming request from the client to the server. + // Marshaler always returns the same object; the object is sent once to the server and then + // a response is expected. + Request interface { + Marshaler() encoding.Marshaler + } + + // RequestStreaming is a streaming request from the client to the server. + // Marshaler returns a new object for upon each invocation, nil when there are no more objects to send. + // Client implementations are expected to differentiate between Request and RequestStreaming either by + // type-switching or by attempting interface conversion. + RequestStreaming interface { + Request + IsStreaming() + } + + RequestFunc func() encoding.Marshaler + RequestStreamingFunc func() encoding.Marshaler +) + +var ( + _ = Request(RequestFunc(nil)) + _ = RequestStreaming(RequestStreamingFunc(nil)) +) + +func (f RequestFunc) Marshaler() encoding.Marshaler { return f() } +func (f RequestStreamingFunc) Marshaler() encoding.Marshaler { return f() } +func (f RequestStreamingFunc) IsStreaming() {} + +// RequestSingleton generates a non-streaming Request that always returns the same marshaler +func RequestSingleton(m encoding.Marshaler) Request { + return RequestFunc(func() encoding.Marshaler { return m }) +} + +const ( + ResponseClassSingleton ResponseClass = iota + ResponseClassStreaming + ResponseClassNoData + + // ResponseClassAuto should be used with versions of Mesos prior to 1.2.x. + // Otherwise, this type is deprecated and callers should use ResponseClassSingleton + // or ResponseClassStreaming instead. + ResponseClassAuto +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/debug/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/debug/BUILD new file mode 100644 index 00000000..bf364511 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/debug/BUILD @@ -0,0 +1,23 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["logger.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/debug", + importpath = "github.com/mesos/mesos-go/api/v1/lib/debug", + visibility = ["//visibility:public"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/debug/logger.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/debug/logger.go new file mode 100644 index 00000000..571be7d9 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/debug/logger.go @@ -0,0 +1,17 @@ +package debug + +import "log" + +type Logger bool + +func (d Logger) Log(v ...interface{}) { + if d { + log.Print(v...) + } +} + +func (d Logger) Logf(s string, v ...interface{}) { + if d { + log.Printf(s, v...) + } +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/doc.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/doc.go new file mode 100644 index 00000000..9c749fe3 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/doc.go @@ -0,0 +1,3 @@ +// Package mesos presents common v1 HTTP API message types in addition to extension APIs that +// aim to simplify use of the machine-generated code. +package mesos diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/BUILD new file mode 100644 index 00000000..9f1c225c --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/BUILD @@ -0,0 +1,33 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["types.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding", + importpath = "github.com/mesos/mesos-go/api/v1/lib/encoding", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json:all-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/BUILD new file mode 100644 index 00000000..cacb6859 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/BUILD @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["codecs.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs", + importpath = "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/codecs.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/codecs.go new file mode 100644 index 00000000..bff5aa89 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs/codecs.go @@ -0,0 +1,33 @@ +package codecs + +import ( + "github.com/mesos/mesos-go/api/v1/lib/encoding" + "github.com/mesos/mesos-go/api/v1/lib/encoding/json" + "github.com/mesos/mesos-go/api/v1/lib/encoding/proto" +) + +const ( + // MediaTypeProtobuf is the Protobuf serialization format media type. + MediaTypeProtobuf = encoding.MediaType("application/x-protobuf") + // MediaTypeJSON is the JSON serialiation format media type. + MediaTypeJSON = encoding.MediaType("application/json") + + NameProtobuf = "protobuf" + NameJSON = "json" +) + +// ByMediaType are pre-configured default Codecs, ready to use OOTB +var ByMediaType = map[encoding.MediaType]encoding.Codec{ + MediaTypeProtobuf: encoding.Codec{ + Name: NameProtobuf, + Type: MediaTypeProtobuf, + NewEncoder: proto.NewEncoder, + NewDecoder: proto.NewDecoder, + }, + MediaTypeJSON: encoding.Codec{ + Name: NameJSON, + Type: MediaTypeJSON, + NewEncoder: json.NewEncoder, + NewDecoder: json.NewDecoder, + }, +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/BUILD new file mode 100644 index 00000000..d7ec906f --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/BUILD @@ -0,0 +1,26 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "decoder.go", + "framing.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing", + importpath = "github.com/mesos/mesos-go/api/v1/lib/encoding/framing", + visibility = ["//visibility:public"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/decoder.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/decoder.go new file mode 100644 index 00000000..51e159c8 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/decoder.go @@ -0,0 +1,34 @@ +package framing + +type ( + // UnmarshalFunc translates bytes to objects + UnmarshalFunc func([]byte, interface{}) error + + // Decoder reads and decodes Protobuf messages from an io.Reader. + Decoder interface { + // Decode reads the next encoded message from its input and stores it + // in the value pointed to by m. If m isn't a proto.Message, Decode will panic. + Decode(interface{}) error + } + + // DecoderFunc is the functional adaptation of Decoder + DecoderFunc func(interface{}) error +) + +func (f DecoderFunc) Decode(m interface{}) error { return f(m) } + +var _ = Decoder(DecoderFunc(nil)) + +// NewDecoder returns a new Decoder that reads from the given frame Reader. +func NewDecoder(r Reader, uf UnmarshalFunc) DecoderFunc { + return func(m interface{}) error { + // Note: the buf returned by ReadFrame will change over time, it can't be sub-sliced + // and then those sub-slices retained. Examination of generated proto code seems to indicate + // that byte buffers are copied vs. referenced by sub-slice (gogo protoc). + frame, err := r.ReadFrame() + if err != nil { + return err + } + return uf(frame, m) + } +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/framing.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/framing.go new file mode 100644 index 00000000..0e05720b --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing/framing.go @@ -0,0 +1,70 @@ +package framing + +import ( + "io" + "io/ioutil" +) + +type Error string + +func (err Error) Error() string { return string(err) } + +const ( + ErrorUnderrun = Error("frame underrun, unexpected EOF") + ErrorBadSize = Error("bad frame size") + ErrorOversizedFrame = Error("oversized frame, max size exceeded") +) + +type ( + // Reader generates data frames from some source, returning io.EOF when the end of the input stream is + // detected. + Reader interface { + ReadFrame() (frame []byte, err error) + } + + // ReaderFunc is the functional adaptation of Reader. + ReaderFunc func() ([]byte, error) + + // Writer sends whole frames to some endpoint; returns io.ErrShortWrite if the frame is only partially written. + Writer interface { + WriteFrame(frame []byte) error + } + + // WriterFunc is the functional adaptation of Writer. + WriterFunc func([]byte) error +) + +func (f ReaderFunc) ReadFrame() ([]byte, error) { return f() } +func (f WriterFunc) WriteFrame(b []byte) error { return f(b) } + +var _ = Reader(ReaderFunc(nil)) +var _ = Writer(WriterFunc(nil)) + +// EOFReaderFunc always returns nil, io.EOF; it implements the ReaderFunc API. +func EOFReaderFunc() ([]byte, error) { return nil, io.EOF } + +var _ = ReaderFunc(EOFReaderFunc) // sanity check + +// ReadAll returns a reader func that returns the complete contents of `r` in a single frame. +// A zero length frame is treated as an "end of stream" condition, returning io.EOF. +func ReadAll(r io.Reader) ReaderFunc { + return func() (b []byte, err error) { + b, err = ioutil.ReadAll(r) + if len(b) == 0 && err == nil { + err = io.EOF + } + return + } +} + +// WriterFor adapts an io.Writer to the Writer interface. All buffers are written to `w` without decoration or +// modification. +func WriterFor(w io.Writer) WriterFunc { + return func(b []byte) error { + n, err := w.Write(b) + if err == nil && n != len(b) { + return io.ErrShortWrite + } + return err + } +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/BUILD new file mode 100644 index 00000000..eb59dfe2 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/BUILD @@ -0,0 +1,27 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["json.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json", + importpath = "github.com/mesos/mesos-go/api/v1/lib/encoding/json", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/json.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/json.go new file mode 100644 index 00000000..d7fc2843 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json/json.go @@ -0,0 +1,28 @@ +package json + +import ( + "encoding/json" + + "github.com/mesos/mesos-go/api/v1/lib/encoding" + "github.com/mesos/mesos-go/api/v1/lib/encoding/framing" +) + +// NewEncoder returns a new Encoder of Calls to JSON messages written to +// the given io.Writer. +func NewEncoder(s encoding.Sink) encoding.Encoder { + w := s() + return encoding.EncoderFunc(func(m encoding.Marshaler) error { + b, err := json.Marshal(m) + if err != nil { + return err + } + return w.WriteFrame(b) + }) +} + +// NewDecoder returns a new Decoder of JSON messages read from the given source. +func NewDecoder(s encoding.Source) encoding.Decoder { + r := s() + dec := framing.NewDecoder(r, json.Unmarshal) + return encoding.DecoderFunc(func(u encoding.Unmarshaler) error { return dec.Decode(u) }) +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/BUILD new file mode 100644 index 00000000..b7a09655 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/BUILD @@ -0,0 +1,31 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "encoding.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto", + importpath = "github.com/mesos/mesos-go/api/v1/lib/encoding/proto", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/doc.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/doc.go new file mode 100644 index 00000000..789cdf87 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/doc.go @@ -0,0 +1,4 @@ +// Package proto implements protobuf utilities such as functional options to +// construct complex structs and encoders and decoders composable with +// io.ReadWriters. +package proto diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/encoding.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/encoding.go new file mode 100644 index 00000000..4300e490 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto/encoding.go @@ -0,0 +1,30 @@ +package proto + +import ( + "github.com/gogo/protobuf/proto" + "github.com/mesos/mesos-go/api/v1/lib/encoding" + "github.com/mesos/mesos-go/api/v1/lib/encoding/framing" +) + +// NewEncoder returns a new Encoder of Calls to Protobuf messages written to +// the given io.Writer. +func NewEncoder(s encoding.Sink) encoding.Encoder { + w := s() + return encoding.EncoderFunc(func(m encoding.Marshaler) error { + b, err := proto.Marshal(m.(proto.Message)) + if err != nil { + return err + } + return w.WriteFrame(b) + }) +} + +// NewDecoder returns a new Decoder of Protobuf messages read from the given Source. +func NewDecoder(s encoding.Source) encoding.Decoder { + r := s() + var ( + uf = func(b []byte, m interface{}) error { return proto.Unmarshal(b, m.(proto.Message)) } + dec = framing.NewDecoder(r, uf) + ) + return encoding.DecoderFunc(func(u encoding.Unmarshaler) error { return dec.Decode(u) }) +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/types.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/types.go new file mode 100644 index 00000000..75530814 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/types.go @@ -0,0 +1,111 @@ +package encoding + +import ( + "encoding/json" + "io" + + pb "github.com/gogo/protobuf/proto" + "github.com/mesos/mesos-go/api/v1/lib/encoding/framing" +) + +type MediaType string + +// ContentType returns the HTTP Content-Type associated with the MediaType +func (m MediaType) ContentType() string { return string(m) } + +type ( + Source func() framing.Reader + Sink func() framing.Writer + + // A Codec composes encoding and decoding of a serialization format. + Codec struct { + Name string + Type MediaType + NewEncoder func(Sink) Encoder + NewDecoder func(Source) Decoder + } + + SourceFactory interface { + NewSource(r io.Reader) Source + } + SourceFactoryFunc func(r io.Reader) Source + + SinkFactory interface { + NewSink(w io.Writer) Sink + } + SinkFactoryFunc func(w io.Writer) Sink +) + +func (f SourceFactoryFunc) NewSource(r io.Reader) Source { return f(r) } + +func (f SinkFactoryFunc) NewSink(w io.Writer) Sink { return f(w) } + +var ( + _ = SourceFactory(SourceFactoryFunc(nil)) + _ = SinkFactory(SinkFactoryFunc(nil)) +) + +// SourceReader returns a Source that buffers all input from the given io.Reader +// and returns the contents in a single frame. +func SourceReader(r io.Reader) Source { + ch := make(chan framing.ReaderFunc, 1) + ch <- framing.ReadAll(r) + return func() framing.Reader { + select { + case f := <-ch: + return f + default: + return framing.ReaderFunc(framing.EOFReaderFunc) + } + } +} + +// SinkWriter returns a Sink that sends a frame to an io.Writer with no decoration. +func SinkWriter(w io.Writer) Sink { return func() framing.Writer { return framing.WriterFor(w) } } + +// String implements the fmt.Stringer interface. +func (c *Codec) String() string { + if c == nil { + return "" + } + return c.Name +} + +type ( + // Marshaler composes the supported marshaling formats. + Marshaler interface { + pb.Marshaler + json.Marshaler + } + // Unmarshaler composes the supporter unmarshaling formats. + Unmarshaler interface { + pb.Unmarshaler + json.Unmarshaler + } + // An Encoder encodes a given Marshaler or returns an error in case of failure. + Encoder interface { + Encode(Marshaler) error + } + + // EncoderFunc is the functional adapter for Encoder + EncoderFunc func(Marshaler) error + + // A Decoder decodes a given Unmarshaler or returns an error in case of failure. + Decoder interface { + Decode(Unmarshaler) error + } + + // DecoderFunc is the functional adapter for Decoder + DecoderFunc func(Unmarshaler) error +) + +// Decode implements the Decoder interface +func (f DecoderFunc) Decode(u Unmarshaler) error { return f(u) } + +// Encode implements the Encoder interface +func (f EncoderFunc) Encode(m Marshaler) error { return f(m) } + +var ( + _ = Encoder(EncoderFunc(nil)) + _ = Decoder(DecoderFunc(nil)) +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/filters.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/filters.go new file mode 100644 index 00000000..73cbf588 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/filters.go @@ -0,0 +1,26 @@ +package mesos + +import "time" + +type FilterOpt func(*Filters) + +func (f *Filters) With(opts ...FilterOpt) *Filters { + for _, o := range opts { + o(f) + } + return f +} + +func RefuseSeconds(d time.Duration) FilterOpt { + return func(f *Filters) { + s := d.Seconds() + f.RefuseSeconds = &s + } +} + +func OptionalFilters(fo ...FilterOpt) *Filters { + if len(fo) == 0 { + return nil + } + return (&Filters{}).With(fo...) +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/fixedpoint.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/fixedpoint.go new file mode 100644 index 00000000..c330309b --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/fixedpoint.go @@ -0,0 +1,35 @@ +package mesos + +// fixed point scalar math from mesos:src/common/values.cpp +// -- +// We manipulate scalar values by converting them from floating point to a +// fixed point representation, doing a calculation, and then converting +// the result back to floating point. We deliberately only preserve three +// decimal digits of precision in the fixed point representation. This +// ensures that client applications see predictable numerical behavior, at +// the expense of sacrificing some precision. + +import "math" + +func convertToFloat64(f int64) float64 { + // NOTE: We do the conversion from fixed point via integer division + // and then modulus, rather than a single floating point division. + // This ensures that we only apply floating point division to inputs + // in the range [0,999], which is easier to check for correctness. + var ( + quotient = float64(f / 1000) + remainder = float64(f%1000) / 1000.0 + ) + return quotient + remainder +} + +func convertToFixed64(f float64) int64 { + return round64(f * 1000) +} + +func round64(f float64) int64 { + if math.Abs(f) < 0.5 { + return 0 + } + return int64(f + math.Copysign(0.5, f)) +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/BUILD new file mode 100644 index 00000000..a1adabc1 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/BUILD @@ -0,0 +1,40 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "auth_basic.go", + "http.go", + "opts.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli", + importpath = "github.com/mesos/mesos-go/api/v1/lib/httpcli", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/mesos/mesos-go/api/v1/lib:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/client:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/debug:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/recordio:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/BUILD new file mode 100644 index 00000000..243b4e82 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/BUILD @@ -0,0 +1,23 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["apierrors.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors", + importpath = "github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors", + visibility = ["//visibility:public"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/apierrors.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/apierrors.go new file mode 100644 index 00000000..c5d6335b --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors/apierrors.go @@ -0,0 +1,161 @@ +package apierrors + +import ( + "io" + "io/ioutil" + "net/http" +) + +// Code is a Mesos HTTP v1 API response status code +type Code int + +const ( + // MsgNotLeader is returned by Do calls that are sent to a non leading Mesos master. + MsgNotLeader = "call sent to a non-leading master" + // MsgAuth is returned by Do calls that are not successfully authenticated. + MsgAuth = "call not authenticated" + // MsgUnsubscribed is returned by Do calls that are sent before a subscription is established. + MsgUnsubscribed = "no subscription established" + // MsgVersion is returned by Do calls that are sent to an incompatible API version. + MsgVersion = "incompatible API version" + // MsgMalformed is returned by Do calls that are malformed. + MsgMalformed = "malformed request" + // MsgMediaType is returned by Do calls that are sent with an unsupported media type. + MsgMediaType = "unsupported media type" + // MsgRateLimit is returned by Do calls that are rate limited. This is a temporary condition + // that should clear. + MsgRateLimit = "rate limited" + // MsgUnavailable is returned by Do calls that are sent to a master or agent that's in recovery, or + // does not yet realize that it's the leader. This is a temporary condition that should clear. + MsgUnavailable = "mesos server unavailable" + // MsgNotFound could happen if the master or agent libprocess has not yet set up http routes. + MsgNotFound = "mesos http endpoint not found" + + CodeNotLeader = Code(http.StatusTemporaryRedirect) + CodeNotAuthenticated = Code(http.StatusUnauthorized) + CodeUnsubscribed = Code(http.StatusForbidden) + CodeIncompatibleVersion = Code(http.StatusConflict) + CodeMalformedRequest = Code(http.StatusBadRequest) + CodeUnsupportedMediaType = Code(http.StatusNotAcceptable) + CodeRateLimitExceeded = Code(http.StatusTooManyRequests) + CodeMesosUnavailable = Code(http.StatusServiceUnavailable) + CodeNotFound = Code(http.StatusNotFound) + + MaxSizeDetails = 4 * 1024 // MaxSizeDetails limits the length of the details message read from a response body +) + +var ( + // ErrorTable maps HTTP response codes to their respective Mesos v1 API error messages. + ErrorTable = map[Code]string{ + CodeNotLeader: MsgNotLeader, + CodeMalformedRequest: MsgMalformed, + CodeIncompatibleVersion: MsgVersion, + CodeUnsubscribed: MsgUnsubscribed, + CodeNotAuthenticated: MsgAuth, + CodeUnsupportedMediaType: MsgMediaType, + CodeNotFound: MsgNotFound, + CodeMesosUnavailable: MsgUnavailable, + CodeRateLimitExceeded: MsgRateLimit, + } +) + +// Error captures HTTP v1 API error codes and messages generated by Mesos. +type Error struct { + code Code // code is the HTTP response status code generated by Mesos + message string // message briefly summarizes the nature of the error, possibly includes details from Mesos +} + +// IsError returns true for all HTTP status codes that are not considered informational or successful. +func (code Code) IsError() bool { + return code >= 300 +} + +// FromResponse returns an `*Error` for a response containing a status code that indicates an error condition. +// The response body (if any) is captured in the Error.Details field. +// Returns nil for nil responses and responses with non-error status codes. +// See IsErrorCode. +func FromResponse(res *http.Response) error { + if res == nil { + return nil + } + + code := Code(res.StatusCode) + if !code.IsError() { + // non-error HTTP response codes don't generate errors + return nil + } + + var details string + + if res.Body != nil { + defer res.Body.Close() + buf, _ := ioutil.ReadAll(io.LimitReader(res.Body, MaxSizeDetails)) + details = string(buf) + } + + return code.Error(details) +} + +// Error generates an error from the given status code and detail string. +func (code Code) Error(details string) error { + if !code.IsError() { + return nil + } + err := &Error{ + code: code, + message: ErrorTable[code], + } + if details != "" { + err.message = err.message + ": " + details + } + return err +} + +// Error implements error interface +func (e *Error) Error() string { return e.message } + +// Temporary returns true if the error is a temporary condition that should eventually clear. +func (e *Error) Temporary() bool { + switch e.code { + // TODO(jdef): NotFound **could** be a temporary error because there's a race at mesos startup in which the + // HTTP server responds before the internal listeners have been initialized. But it could also be reported + // because the client is accessing an invalid endpoint; as of right now, a client cannot distinguish between + // these cases. + // https://issues.apache.org/jira/browse/MESOS-7697 + case CodeRateLimitExceeded, CodeMesosUnavailable: + return true + default: + return false + } +} + +// CodesIndicatingSubscriptionLoss is a set of apierror.Code entries which each indicate that +// the event subscription stream has been severed between the scheduler and mesos. It's respresented +// as a public map variable so that clients can program additional error codes (if such are discovered) +// without hacking the code of the mesos-go library directly. +var CodesIndicatingSubscriptionLoss = func(codes ...Code) map[Code]struct{} { + result := make(map[Code]struct{}, len(codes)) + for _, code := range codes { + result[code] = struct{}{} + } + return result +}( + // expand this list as we discover other errors that guarantee we've lost our event subscription. + CodeUnsubscribed, +) + +// SubscriptionLoss returns true if the error indicates that the event subscription stream has been severed +// between mesos and a mesos client. +func (e *Error) SubscriptionLoss() (result bool) { + _, result = CodesIndicatingSubscriptionLoss[e.code] + return +} + +// Matches returns true if the given error is an API error with a matching error code +func (code Code) Matches(err error) bool { + if err == nil { + return !code.IsError() + } + apiErr, ok := err.(*Error) + return ok && apiErr.code == code +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/auth_basic.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/auth_basic.go new file mode 100644 index 00000000..5cad3e9d --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/auth_basic.go @@ -0,0 +1,33 @@ +package httpcli + +import ( + "net/http" +) + +// roundTripperFunc is the functional adaptation of http.RoundTripper +type roundTripperFunc func(*http.Request) (*http.Response, error) + +// RoundTrip implements RoundTripper for roundTripperFunc +func (f roundTripperFunc) RoundTrip(req *http.Request) (*http.Response, error) { return f(req) } + +// BasicAuth generates a functional config option that sets HTTP Basic authentication for a Client +func BasicAuth(username, passwd string) ConfigOpt { + // TODO(jdef) this could be more efficient. according to the stdlib we're not supposed to + // mutate the original Request, so we copy here (including headers). another approach would + // be to generate a functional RequestOpt that adds the right header. + return WrapRoundTripper(func(rt http.RoundTripper) http.RoundTripper { + return roundTripperFunc(func(req *http.Request) (*http.Response, error) { + var h http.Header + if req.Header != nil { + h = make(http.Header, len(req.Header)) + for k, v := range req.Header { + h[k] = append(make([]string, 0, len(v)), v...) + } + } + clonedReq := *req + clonedReq.Header = h + clonedReq.SetBasicAuth(username, passwd) + return rt.RoundTrip(&clonedReq) + }) + }) +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/http.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/http.go new file mode 100644 index 00000000..55bf9649 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/http.go @@ -0,0 +1,614 @@ +package httpcli + +import ( + "bytes" + "context" + "crypto/tls" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "sync" + "time" + + "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/client" + logger "github.com/mesos/mesos-go/api/v1/lib/debug" + "github.com/mesos/mesos-go/api/v1/lib/encoding" + "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" + "github.com/mesos/mesos-go/api/v1/lib/encoding/framing" + "github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors" + "github.com/mesos/mesos-go/api/v1/lib/recordio" +) + +func noRedirect(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse } + +// ProtocolError is returned when we receive a response from Mesos that is outside of the HTTP API specification. +// Receipt of the following will yield protocol errors: +// - any unexpected non-error HTTP response codes (e.g. 199) +// - any unexpected Content-Type +type ProtocolError string + +// Error implements error interface +func (pe ProtocolError) Error() string { return string(pe) } + +const ( + debug = logger.Logger(false) + mediaTypeRecordIO = encoding.MediaType("application/recordio") +) + +// DoFunc sends an HTTP request and returns an HTTP response. +// +// An error is returned if caused by client policy (such as +// http.Client.CheckRedirect), or if there was an HTTP protocol error. A +// non-2xx response doesn't cause an error. +// +// When err is nil, resp always contains a non-nil resp.Body. +// +// Callers should close resp.Body when done reading from it. If resp.Body is +// not closed, an underlying RoundTripper (typically Transport) may not be able +// to re-use a persistent TCP connection to the server for a subsequent +// "keep-alive" request. +// +// The request Body, if non-nil, will be closed by an underlying Transport, +// even on errors. +type DoFunc func(*http.Request) (*http.Response, error) + +// Response captures the output of a Mesos HTTP API operation. Callers are responsible for invoking +// Close when they're finished processing the response otherwise there may be connection leaks. +type Response struct { + io.Closer + encoding.Decoder + Header http.Header +} + +// ErrorMapperFunc generates an error for the given response. +type ErrorMapperFunc func(*http.Response) error + +// ResponseHandler is invoked to process an HTTP response. Callers SHALL invoke Close for +// a non-nil Response, even when errors are returned. +type ResponseHandler func(*http.Response, client.ResponseClass, error) (mesos.Response, error) + +// A Client is a Mesos HTTP APIs client. +type Client struct { + url string + do DoFunc + header http.Header + codec encoding.Codec + errorMapper ErrorMapperFunc + requestOpts []RequestOpt + buildRequestFunc func(client.Request, client.ResponseClass, ...RequestOpt) (*http.Request, error) + handleResponse ResponseHandler +} + +var ( + DefaultCodec = codecs.ByMediaType[codecs.MediaTypeProtobuf] + DefaultHeaders = http.Header{} + + // DefaultConfigOpt represents the default client config options. + DefaultConfigOpt = []ConfigOpt{ + Transport(func(t *http.Transport) { + // all calls should be ack'd by the server within this interval. + t.ResponseHeaderTimeout = 15 * time.Second + t.MaxIdleConnsPerHost = 2 // don't depend on go's default + }), + } + + DefaultErrorMapper = ErrorMapperFunc(apierrors.FromResponse) +) + +// New returns a new Client with the given Opts applied. +// Callers are expected to configure the URL, Do, and Codec options prior to +// invoking Do. +func New(opts ...Opt) *Client { + c := &Client{ + codec: DefaultCodec, + do: With(DefaultConfigOpt...), + header: cloneHeaders(DefaultHeaders), + errorMapper: DefaultErrorMapper, + } + c.buildRequestFunc = c.buildRequest + c.handleResponse = c.HandleResponse + c.With(opts...) + return c +} + +func cloneHeaders(hs http.Header) http.Header { + result := make(http.Header) + for k, v := range hs { + cloned := make([]string, len(v)) + copy(cloned, v) + result[k] = cloned + } + return result +} + +// Endpoint returns the current Mesos API endpoint URL that the caller is set to invoke +func (c *Client) Endpoint() string { + return c.url +} + +// RequestOpt defines a functional option for an http.Request. +type RequestOpt func(*http.Request) + +// RequestOpts is a convenience type +type RequestOpts []RequestOpt + +// Apply this set of request options to the given HTTP request. +func (opts RequestOpts) Apply(req *http.Request) { + // apply per-request options + for _, o := range opts { + if o != nil { + o(req) + } + } +} + +// With applies the given Opts to a Client and returns itself. +func (c *Client) With(opts ...Opt) Opt { + return Opts(opts).Merged().Apply(c) +} + +// WithTemporary configures the Client with the temporary option and returns the results of +// invoking f(). Changes made to the Client by the temporary option are reverted before this +// func returns. +func (c *Client) WithTemporary(opt Opt, f func() error) error { + if opt != nil { + undo := c.With(opt) + defer c.With(undo) + } + return f() +} + +// Mesos returns a mesos.Client variant backed by this implementation. +// Deprecated. +func (c *Client) Mesos(opts ...RequestOpt) mesos.Client { + return mesos.ClientFunc(func(m encoding.Marshaler) (mesos.Response, error) { + return c.Do(m, opts...) + }) +} + +func prepareForResponse(rc client.ResponseClass, codec encoding.Codec) (RequestOpts, error) { + // We need to tell Mesos both the content-type and message-content-type that we're expecting, otherwise + // the server may give us validation problems, or else send back a vague content-type (w/o a + // message-content-type). In order to communicate these things we need to understand the desired response + // type from the perspective of the caller --> client.ResponseClass. + var accept RequestOpts + switch rc { + case client.ResponseClassSingleton, client.ResponseClassAuto, client.ResponseClassNoData: + accept = append(accept, Header("Accept", codec.Type.ContentType())) + case client.ResponseClassStreaming: + accept = append(accept, Header("Accept", mediaTypeRecordIO.ContentType())) + accept = append(accept, Header("Message-Accept", codec.Type.ContentType())) + default: + return nil, ProtocolError(fmt.Sprintf("illegal response class requested: %v", rc)) + } + return accept, nil +} + +// buildRequest is a factory func that generates and returns an http.Request for the +// given marshaler and request options. +func (c *Client) buildRequest(cr client.Request, rc client.ResponseClass, opt ...RequestOpt) (*http.Request, error) { + if crs, ok := cr.(client.RequestStreaming); ok { + return c.buildRequestStream(crs.Marshaler, rc, opt...) + } + accept, err := prepareForResponse(rc, c.codec) + if err != nil { + return nil, err + } + + //TODO(jdef): use a pool to allocate these (and reduce garbage)? + // .. or else, use a pipe (like streaming does) to avoid the intermediate buffer? + var body bytes.Buffer + if err := c.codec.NewEncoder(encoding.SinkWriter(&body)).Encode(cr.Marshaler()); err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", c.url, &body) + if err != nil { + return nil, err + } + + helper := HTTPRequestHelper{req} + return helper. + withOptions(c.requestOpts, opt). + withHeaders(c.header). + withHeader("Content-Type", c.codec.Type.ContentType()). + withHeader("Accept", c.codec.Type.ContentType()). + withOptions(accept). + Request, nil +} + +func (c *Client) buildRequestStream(f func() encoding.Marshaler, rc client.ResponseClass, opt ...RequestOpt) (*http.Request, error) { + accept, err := prepareForResponse(rc, c.codec) + if err != nil { + return nil, err + } + + var ( + pr, pw = io.Pipe() + enc = c.codec.NewEncoder(func() framing.Writer { return recordio.NewWriter(pw) }) + ) + req, err := http.NewRequest("POST", c.url, pr) + if err != nil { + pw.Close() // ignore error + return nil, err + } + + go func() { + var closeOnce sync.Once + defer closeOnce.Do(func() { + pw.Close() + }) + for { + m := f() + if m == nil { + // no more messages to send; end of the stream + break + } + err := enc.Encode(m) + if err != nil { + closeOnce.Do(func() { + pw.CloseWithError(err) + }) + break + } + } + }() + + helper := HTTPRequestHelper{req} + return helper. + withOptions(c.requestOpts, opt). + withHeaders(c.header). + withHeader("Content-Type", mediaTypeRecordIO.ContentType()). + withHeader("Message-Content-Type", c.codec.Type.ContentType()). + withOptions(accept). + Request, nil +} + +func validateSuccessfulResponse(codec encoding.Codec, res *http.Response, rc client.ResponseClass) error { + switch res.StatusCode { + case http.StatusOK: + ct := res.Header.Get("Content-Type") + switch rc { + case client.ResponseClassNoData: + if ct != "" { + return ProtocolError(fmt.Sprintf("unexpected content type: %q", ct)) + } + case client.ResponseClassSingleton, client.ResponseClassAuto: + if ct != codec.Type.ContentType() { + return ProtocolError(fmt.Sprintf("unexpected content type: %q", ct)) + } + case client.ResponseClassStreaming: + if ct != mediaTypeRecordIO.ContentType() { + return ProtocolError(fmt.Sprintf("unexpected content type: %q", ct)) + } + ct = res.Header.Get("Message-Content-Type") + if ct != codec.Type.ContentType() { + return ProtocolError(fmt.Sprintf("unexpected message content type: %q", ct)) + } + default: + return ProtocolError(fmt.Sprintf("unsupported response-class: %q", rc)) + } + + case http.StatusAccepted: + // nothing to validate, we're not expecting any response entity in this case. + // TODO(jdef) perhaps check Content-Length == 0 here? + } + return nil +} + +func newSourceFactory(rc client.ResponseClass) encoding.SourceFactoryFunc { + switch rc { + case client.ResponseClassNoData: + return nil + case client.ResponseClassSingleton: + return encoding.SourceReader + case client.ResponseClassStreaming, client.ResponseClassAuto: + return recordIOSourceFactory + default: + panic(fmt.Sprintf("unsupported response-class: %q", rc)) + } +} + +func recordIOSourceFactory(r io.Reader) encoding.Source { + return func() framing.Reader { return recordio.NewReader(r) } +} + +// HandleResponse parses an HTTP response from a Mesos service endpoint, transforming the +// raw HTTP response into a mesos.Response. +func (c *Client) HandleResponse(res *http.Response, rc client.ResponseClass, err error) (mesos.Response, error) { + if err != nil { + if res != nil && res.Body != nil { + res.Body.Close() + } + return nil, err + } + + result := &Response{ + Closer: res.Body, + Header: res.Header, + } + if err = c.errorMapper(res); err != nil { + return result, err + } + + err = validateSuccessfulResponse(c.codec, res, rc) + if err != nil { + res.Body.Close() + return nil, err + } + + switch res.StatusCode { + case http.StatusOK: + debug.Log("request OK, decoding response") + + sf := newSourceFactory(rc) + if sf == nil { + if rc != client.ResponseClassNoData { + panic("nil Source for response that expected data") + } + // we don't expect any data. drain the response body and close it (compliant with golang's expectations + // for http/1.1 keepalive support. + defer res.Body.Close() + _, err = io.Copy(ioutil.Discard, res.Body) + return nil, err + } + + result.Decoder = c.codec.NewDecoder(sf.NewSource(res.Body)) + + case http.StatusAccepted: + debug.Log("request Accepted") + + // noop; no decoder for these types of calls + defer res.Body.Close() + _, err = io.Copy(ioutil.Discard, res.Body) + return nil, err + + default: + debug.Log("unexpected HTTP status", res.StatusCode) + + defer res.Body.Close() + io.Copy(ioutil.Discard, res.Body) // intentionally discard any error here + return nil, ProtocolError(fmt.Sprintf("unexpected mesos HTTP response code: %d", res.StatusCode)) + } + + return result, nil +} + +// Do is deprecated in favor of Send. +func (c *Client) Do(m encoding.Marshaler, opt ...RequestOpt) (res mesos.Response, err error) { + return c.Send(client.RequestSingleton(m), client.ResponseClassAuto, opt...) +} + +// Send sends a Call and returns (a) a Response (should be closed when finished) that +// contains a either a streaming or non-streaming Decoder from which callers can read +// objects from, and; (b) an error in case of failure. Callers are expected to *always* +// close a non-nil Response if one is returned. For operations which are successful but +// also for which there are no expected result objects the embedded Decoder will be nil. +// The provided ResponseClass determines whether the client implementation will attempt +// to decode a result as a single obeject or as an object stream. When working with +// versions of Mesos prior to v1.2.x callers MUST use ResponseClassAuto. +func (c *Client) Send(cr client.Request, rc client.ResponseClass, opt ...RequestOpt) (res mesos.Response, err error) { + var ( + hreq *http.Request + hres *http.Response + ) + hreq, err = c.buildRequestFunc(cr, rc, opt...) + if err == nil { + hres, err = c.do(hreq) + res, err = c.handleResponse(hres, rc, err) + } + return +} + +// ErrorMapper returns am Opt that overrides the existing error mapping behavior of the client. +func ErrorMapper(em ErrorMapperFunc) Opt { + return func(c *Client) Opt { + old := c.errorMapper + c.errorMapper = em + return ErrorMapper(old) + } +} + +// Endpoint returns an Opt that sets a Client's URL. +func Endpoint(rawurl string) Opt { + return func(c *Client) Opt { + old := c.url + c.url = rawurl + return Endpoint(old) + } +} + +// WrapDoer returns an Opt that decorates a Client's DoFunc +func WrapDoer(f func(DoFunc) DoFunc) Opt { + return func(c *Client) Opt { + old := c.do + c.do = f(c.do) + return Do(old) + } +} + +// Do returns an Opt that sets a Client's DoFunc +func Do(do DoFunc) Opt { + return func(c *Client) Opt { + old := c.do + c.do = do + return Do(old) + } +} + +// Codec returns an Opt that sets a Client's Codec. +func Codec(codec encoding.Codec) Opt { + return func(c *Client) Opt { + old := c.codec + c.codec = codec + return Codec(old) + } +} + +// DefaultHeader returns an Opt that adds a header to an Client's headers. +func DefaultHeader(k, v string) Opt { + return func(c *Client) Opt { + old, found := c.header[k] + old = append([]string{}, old...) // clone + c.header.Add(k, v) + return func(c *Client) Opt { + if found { + c.header[k] = old + } else { + c.header.Del(k) + } + return DefaultHeader(k, v) + } + } +} + +// HandleResponse returns a functional config option to set the HTTP response handler of the client. +func HandleResponse(f ResponseHandler) Opt { + return func(c *Client) Opt { + old := c.handleResponse + c.handleResponse = f + return HandleResponse(old) + } +} + +// RequestOptions returns an Opt that applies the given set of options to every Client request. +func RequestOptions(opts ...RequestOpt) Opt { + if len(opts) == 0 { + return nil + } + return func(c *Client) Opt { + old := append([]RequestOpt{}, c.requestOpts...) + c.requestOpts = opts + return RequestOptions(old...) + } +} + +// Header returns an RequestOpt that adds a header value to an HTTP requests's header. +func Header(k, v string) RequestOpt { return func(r *http.Request) { r.Header.Add(k, v) } } + +// Close returns a RequestOpt that determines whether to close the underlying connection after sending the request. +func Close(b bool) RequestOpt { return func(r *http.Request) { r.Close = b } } + +// Context returns a RequestOpt that sets the request's Context (ctx must be non-nil) +func Context(ctx context.Context) RequestOpt { + return func(r *http.Request) { + r2 := r.WithContext(ctx) + *r = *r2 + } +} + +type Config struct { + client *http.Client + dialer *net.Dialer + transport *http.Transport +} + +type ConfigOpt func(*Config) + +// With returns a DoFunc that executes HTTP round-trips. +// The default implementation provides reasonable defaults for timeouts: +// keep-alive, connection, request/response read/write, and TLS handshake. +// Callers can customize configuration by specifying one or more ConfigOpt's. +func With(opt ...ConfigOpt) DoFunc { + var ( + dialer = &net.Dialer{ + LocalAddr: &net.TCPAddr{IP: net.IPv4zero}, + KeepAlive: 30 * time.Second, + Timeout: 5 * time.Second, + } + transport = &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: dialer.Dial, + ResponseHeaderTimeout: 5 * time.Second, + TLSClientConfig: &tls.Config{InsecureSkipVerify: false}, + TLSHandshakeTimeout: 5 * time.Second, + } + config = &Config{ + dialer: dialer, + transport: transport, + client: &http.Client{ + Transport: transport, + CheckRedirect: noRedirect, // so we can actually see the 307 redirects + }, + } + ) + for _, o := range opt { + if o != nil { + o(config) + } + } + return config.client.Do +} + +// Timeout returns an ConfigOpt that sets a Config's response header timeout, tls handshake timeout, +// and dialer timeout. +func Timeout(d time.Duration) ConfigOpt { + return func(c *Config) { + c.transport.ResponseHeaderTimeout = d + c.transport.TLSHandshakeTimeout = d + c.dialer.Timeout = d + } +} + +// RoundTripper returns a ConfigOpt that sets a Config's round-tripper. +func RoundTripper(rt http.RoundTripper) ConfigOpt { + return func(c *Config) { + c.client.Transport = rt + } +} + +// TLSConfig returns a ConfigOpt that sets a Config's TLS configuration. +func TLSConfig(tc *tls.Config) ConfigOpt { + return func(c *Config) { + c.transport.TLSClientConfig = tc + } +} + +// Transport returns a ConfigOpt that allows tweaks of the default Config's http.Transport +func Transport(modifyTransport func(*http.Transport)) ConfigOpt { + return func(c *Config) { + if modifyTransport != nil { + modifyTransport(c.transport) + } + } +} + +// WrapRoundTripper allows a caller to customize a configuration's HTTP exchanger. Useful +// for authentication protocols that operate over stock HTTP. +func WrapRoundTripper(f func(http.RoundTripper) http.RoundTripper) ConfigOpt { + return func(c *Config) { + if f != nil { + if rt := f(c.client.Transport); rt != nil { + c.client.Transport = rt + } + } + } +} + +// HTTPRequestHelper wraps an http.Request and provides utility funcs to simplify code elsewhere +type HTTPRequestHelper struct { + *http.Request +} + +func (r *HTTPRequestHelper) withOptions(optsets ...RequestOpts) *HTTPRequestHelper { + for _, opts := range optsets { + opts.Apply(r.Request) + } + return r +} + +func (r *HTTPRequestHelper) withHeaders(hh http.Header) *HTTPRequestHelper { + for k, v := range hh { + r.Header[k] = v + debug.Log("request header " + k + ": " + v[0]) + } + return r +} + +func (r *HTTPRequestHelper) withHeader(key, value string) *HTTPRequestHelper { + r.Header.Set(key, value) + return r +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/opts.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/opts.go new file mode 100644 index 00000000..c0f3ef2b --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/opts.go @@ -0,0 +1,53 @@ +package httpcli + +type ( + // Opt defines a functional option for the HTTP client type. A functional option + // must return an Opt that acts as an "undo" if applied to the same Client. + Opt func(*Client) Opt + // Opts represents a series of functional options + Opts []Opt +) + +// Apply is a nil-safe application of an Opt: if the receiver is nil then this func +// simply returns nil, otherwise it returns the result invoking the receiving Opt +// with the given Client. +func (o Opt) Apply(c *Client) (result Opt) { + if o != nil { + result = o(c) + } + return +} + +// Merged generates a single Opt that applies all the functional options, in-order +func (opts Opts) Merged() Opt { + if len(opts) == 0 { + return nil + } + return func(c *Client) Opt { + var ( + size = len(opts) + undo = make(Opts, size) + ) + size-- // make this a zero-based offset + for i, opt := range opts { + if opt != nil { + undo[size-i] = opt(c) + } + } + return undo.Merged() + } +} + +// And combines two functional options into a single Opt +func (o Opt) And(other Opt) Opt { + if o == nil { + if other == nil { + return nil + } + return other + } + if other == nil { + return o + } + return Opts{o, other}.Merged() +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/labels.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/labels.go new file mode 100644 index 00000000..ecf50553 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/labels.go @@ -0,0 +1,95 @@ +package mesos + +import ( + "bytes" + "io" +) + +type labelList []Label // convenience type, for working with unwrapped Label slices + +// Equivalent returns true if left and right have the same labels. Order is not important. +func (left *Labels) Equivalent(right *Labels) bool { + return labelList(left.GetLabels()).Equivalent(labelList(right.GetLabels())) +} + +// Equivalent returns true if left and right have the same labels. Order is not important. +func (left labelList) Equivalent(right labelList) bool { + if len(left) != len(right) { + return false + } else { + for i := range left { + found := false + for j := range right { + if left[i].Equivalent(right[j]) { + found = true + break + } + } + if !found { + return false + } + } + return true + } +} + +// Equivalent returns true if left and right represent the same Label. +func (left Label) Equivalent(right Label) bool { + if left.Key != right.Key { + return false + } + if left.Value == nil { + return right.Value == nil + } else { + return right.Value != nil && *left.Value == *right.Value + } +} + +func (left Label) writeTo(w io.Writer) (n int64, err error) { + write := func(s string) { + if err != nil { + return + } + var n2 int + n2, err = io.WriteString(w, s) + n += int64(n2) + } + write(left.Key) + if s := left.GetValue(); s != "" { + write("=") + write(s) + } + return +} + +func (left *Labels) writeTo(w io.Writer) (n int64, err error) { + var ( + lab = left.GetLabels() + n2 int + n3 int64 + ) + for i := range lab { + if i > 0 { + n2, err = io.WriteString(w, ",") + n += int64(n2) + if err != nil { + break + } + } + n3, err = lab[i].writeTo(w) + n += n3 + if err != nil { + break + } + } + return +} + +func (left *Labels) Format() string { + if left == nil { + return "" + } + var b bytes.Buffer + left.writeTo(&b) + return b.String() +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb.go new file mode 100644 index 00000000..45ff8199 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb.go @@ -0,0 +1,72498 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: mesos.proto + +/* + Package mesos is a generated protocol buffer package. + + It is generated from these files: + mesos.proto + + It has these top-level messages: + FrameworkID + OfferID + AgentID + TaskID + ExecutorID + ContainerID + ResourceProviderID + OperationID + TimeInfo + DurationInfo + Address + URL + Unavailability + MachineID + MachineInfo + FrameworkInfo + CheckInfo + HealthCheck + KillPolicy + CommandInfo + ExecutorInfo + DomainInfo + MasterInfo + AgentInfo + CSIPluginContainerInfo + CSIPluginInfo + ResourceProviderInfo + Value + Attribute + Resource + TrafficControlStatistics + IpStatistics + IcmpStatistics + TcpStatistics + UdpStatistics + SNMPStatistics + DiskStatistics + ResourceStatistics + ResourceUsage + PerfStatistics + Request + Offer + InverseOffer + TaskInfo + TaskGroupInfo + Task + TaskResourceLimitation + UUID + Operation + OperationStatus + CheckStatusInfo + TaskStatus + Filters + Environment + Parameter + Parameters + Credential + Credentials + Secret + RateLimit + RateLimits + Image + MountPropagation + Volume + NetworkInfo + CapabilityInfo + LinuxInfo + RLimitInfo + TTYInfo + ContainerInfo + ContainerStatus + CgroupInfo + Labels + Label + Port + Ports + DiscoveryInfo + WeightInfo + VersionInfo + Flag + Role + Metric + FileInfo + Device + DeviceAccess + DeviceWhitelist +*/ +package mesos + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" +import _ "github.com/gogo/protobuf/gogoproto" + +import strconv "strconv" + +import bytes "bytes" + +import strings "strings" +import reflect "reflect" + +import github_com_gogo_protobuf_proto "github.com/gogo/protobuf/proto" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +// * +// Status is used to indicate the state of the scheduler and executor +// driver after function calls. +type Status int32 + +const ( + DRIVER_NOT_STARTED Status = 1 + DRIVER_RUNNING Status = 2 + DRIVER_ABORTED Status = 3 + DRIVER_STOPPED Status = 4 +) + +var Status_name = map[int32]string{ + 1: "DRIVER_NOT_STARTED", + 2: "DRIVER_RUNNING", + 3: "DRIVER_ABORTED", + 4: "DRIVER_STOPPED", +} +var Status_value = map[string]int32{ + "DRIVER_NOT_STARTED": 1, + "DRIVER_RUNNING": 2, + "DRIVER_ABORTED": 3, + "DRIVER_STOPPED": 4, +} + +func (x Status) Enum() *Status { + p := new(Status) + *p = x + return p +} +func (x Status) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Status_name, int32(x)) +} +func (x *Status) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Status_value, data, "Status") + if err != nil { + return err + } + *x = Status(value) + return nil +} +func (Status) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{0} } + +// * +// Describes possible task states. IMPORTANT: Mesos assumes tasks that +// enter terminal states (see below) imply the task is no longer +// running and thus clean up any thing associated with the task +// (ultimately offering any resources being consumed by that task to +// another task). +type TaskState int32 + +const ( + TASK_STAGING TaskState = 6 + TASK_STARTING TaskState = 0 + TASK_RUNNING TaskState = 1 + // NOTE: This should only be sent when the framework has + // the TASK_KILLING_STATE capability. + TASK_KILLING TaskState = 8 + // The task finished successfully on its own without external interference. + TASK_FINISHED TaskState = 2 + TASK_FAILED TaskState = 3 + TASK_KILLED TaskState = 4 + TASK_ERROR TaskState = 7 + // In Mesos 1.3, this will only be sent when the framework does NOT + // opt-in to the PARTITION_AWARE capability. + // + // NOTE: This state is not always terminal. For example, tasks might + // transition from TASK_LOST to TASK_RUNNING or other states when a + // partitioned agent reregisters. + TASK_LOST TaskState = 5 + // The task failed to launch because of a transient error. The + // task's executor never started running. Unlike TASK_ERROR, the + // task description is valid -- attempting to launch the task again + // may be successful. + TASK_DROPPED TaskState = 9 + // The task was running on an agent that has lost contact with the + // master, typically due to a network failure or partition. The task + // may or may not still be running. + TASK_UNREACHABLE TaskState = 10 + // The task is no longer running. This can occur if the agent has + // been terminated along with all of its tasks (e.g., the host that + // was running the agent was rebooted). It might also occur if the + // task was terminated due to an agent or containerizer error, or if + // the task was preempted by the QoS controller in an + // oversubscription scenario. + TASK_GONE TaskState = 11 + // The task was running on an agent that the master cannot contact; + // the operator has asserted that the agent has been shutdown, but + // this has not been directly confirmed by the master. If the + // operator is correct, the task is not running and this is a + // terminal state; if the operator is mistaken, the task may still + // be running and might return to RUNNING in the future. + TASK_GONE_BY_OPERATOR TaskState = 12 + // The master has no knowledge of the task. This is typically + // because either (a) the master never had knowledge of the task, or + // (b) the master forgot about the task because it garbage collected + // its metadata about the task. The task may or may not still be + // running. + TASK_UNKNOWN TaskState = 13 +) + +var TaskState_name = map[int32]string{ + 6: "TASK_STAGING", + 0: "TASK_STARTING", + 1: "TASK_RUNNING", + 8: "TASK_KILLING", + 2: "TASK_FINISHED", + 3: "TASK_FAILED", + 4: "TASK_KILLED", + 7: "TASK_ERROR", + 5: "TASK_LOST", + 9: "TASK_DROPPED", + 10: "TASK_UNREACHABLE", + 11: "TASK_GONE", + 12: "TASK_GONE_BY_OPERATOR", + 13: "TASK_UNKNOWN", +} +var TaskState_value = map[string]int32{ + "TASK_STAGING": 6, + "TASK_STARTING": 0, + "TASK_RUNNING": 1, + "TASK_KILLING": 8, + "TASK_FINISHED": 2, + "TASK_FAILED": 3, + "TASK_KILLED": 4, + "TASK_ERROR": 7, + "TASK_LOST": 5, + "TASK_DROPPED": 9, + "TASK_UNREACHABLE": 10, + "TASK_GONE": 11, + "TASK_GONE_BY_OPERATOR": 12, + "TASK_UNKNOWN": 13, +} + +func (x TaskState) Enum() *TaskState { + p := new(TaskState) + *p = x + return p +} +func (x TaskState) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(TaskState_name, int32(x)) +} +func (x *TaskState) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(TaskState_value, data, "TaskState") + if err != nil { + return err + } + *x = TaskState(value) + return nil +} +func (TaskState) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{1} } + +// * +// Describes possible operation states. +type OperationState int32 + +const ( + // Default value if the enum is not set. See MESOS-4997. + OPERATION_UNSUPPORTED OperationState = 0 + // Initial state. + OPERATION_PENDING OperationState = 1 + // TERMINAL: The operation was successfully applied. + OPERATION_FINISHED OperationState = 2 + // TERMINAL: The operation failed to apply. + OPERATION_FAILED OperationState = 3 + // TERMINAL: The operation description contains an error. + OPERATION_ERROR OperationState = 4 + // TERMINAL: The operation was dropped due to a transient error. + OPERATION_DROPPED OperationState = 5 + // The operation affects an agent that has lost contact with the master, + // typically due to a network failure or partition. The operation may or may + // not still be pending. + OPERATION_UNREACHABLE OperationState = 6 + // The operation affected an agent that the master cannot contact; + // the operator has asserted that the agent has been shutdown, but this has + // not been directly confirmed by the master. + // + // If the operator is correct, the operation is not pending and this is a + // terminal state; if the operator is mistaken, the operation may still be + // pending and might return to a different state in the future. + OPERATION_GONE_BY_OPERATOR OperationState = 7 + // The operation affects an agent that the master recovered from its + // state, but that agent has not yet re-registered. + // + // The operation can transition to `OPERATION_UNREACHABLE` if the + // corresponding agent is marked as unreachable, and will transition to + // another status if the agent re-registers. + OPERATION_RECOVERING OperationState = 8 + // The master has no knowledge of the operation. This is typically + // because either (a) the master never had knowledge of the operation, or + // (b) the master forgot about the operation because it garbage collected + // its metadata about the operation. The operation may or may not still be + // pending. + OPERATION_UNKNOWN OperationState = 9 +) + +var OperationState_name = map[int32]string{ + 0: "OPERATION_UNSUPPORTED", + 1: "OPERATION_PENDING", + 2: "OPERATION_FINISHED", + 3: "OPERATION_FAILED", + 4: "OPERATION_ERROR", + 5: "OPERATION_DROPPED", + 6: "OPERATION_UNREACHABLE", + 7: "OPERATION_GONE_BY_OPERATOR", + 8: "OPERATION_RECOVERING", + 9: "OPERATION_UNKNOWN", +} +var OperationState_value = map[string]int32{ + "OPERATION_UNSUPPORTED": 0, + "OPERATION_PENDING": 1, + "OPERATION_FINISHED": 2, + "OPERATION_FAILED": 3, + "OPERATION_ERROR": 4, + "OPERATION_DROPPED": 5, + "OPERATION_UNREACHABLE": 6, + "OPERATION_GONE_BY_OPERATOR": 7, + "OPERATION_RECOVERING": 8, + "OPERATION_UNKNOWN": 9, +} + +func (x OperationState) Enum() *OperationState { + p := new(OperationState) + *p = x + return p +} +func (x OperationState) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(OperationState_name, int32(x)) +} +func (x *OperationState) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(OperationState_value, data, "OperationState") + if err != nil { + return err + } + *x = OperationState(value) + return nil +} +func (OperationState) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{2} } + +// Describes the several states that a machine can be in. A `Mode` +// applies to a machine and to all associated agents on the machine. +type MachineInfo_Mode int32 + +const ( + // In this mode, a machine is behaving normally; + // offering resources, executing tasks, etc. + UP MachineInfo_Mode = 1 + // In this mode, all agents on the machine are expected to cooperate with + // frameworks to drain resources. In general, draining is done ahead of + // a pending `unavailability`. The resources should be drained so as to + // maximize utilization prior to the maintenance but without knowingly + // violating the frameworks' requirements. + DRAINING MachineInfo_Mode = 2 + // In this mode, a machine is not running any tasks and will not offer + // any of its resources. Agents on the machine will not be allowed to + // register with the master. + DOWN MachineInfo_Mode = 3 +) + +var MachineInfo_Mode_name = map[int32]string{ + 1: "UP", + 2: "DRAINING", + 3: "DOWN", +} +var MachineInfo_Mode_value = map[string]int32{ + "UP": 1, + "DRAINING": 2, + "DOWN": 3, +} + +func (x MachineInfo_Mode) Enum() *MachineInfo_Mode { + p := new(MachineInfo_Mode) + *p = x + return p +} +func (x MachineInfo_Mode) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(MachineInfo_Mode_name, int32(x)) +} +func (x *MachineInfo_Mode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MachineInfo_Mode_value, data, "MachineInfo_Mode") + if err != nil { + return err + } + *x = MachineInfo_Mode(value) + return nil +} +func (MachineInfo_Mode) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{14, 0} } + +type FrameworkInfo_Capability_Type int32 + +const ( + // This must be the first enum value in this list, to + // ensure that if 'type' is not set, the default value + // is UNKNOWN. This enables enum values to be added + // in a backwards-compatible way. See: MESOS-4997. + FrameworkInfo_Capability_UNKNOWN FrameworkInfo_Capability_Type = 0 + // Receive offers with revocable resources. See 'Resource' + // message for details. + FrameworkInfo_Capability_REVOCABLE_RESOURCES FrameworkInfo_Capability_Type = 1 + // Receive the TASK_KILLING TaskState when a task is being + // killed by an executor. The executor will examine this + // capability to determine whether it can send TASK_KILLING. + FrameworkInfo_Capability_TASK_KILLING_STATE FrameworkInfo_Capability_Type = 2 + // Indicates whether the framework is aware of GPU resources. + // Frameworks that are aware of GPU resources are expected to + // avoid placing non-GPU workloads on GPU agents, in order + // to avoid occupying a GPU agent and preventing GPU workloads + // from running! Currently, if a framework is unaware of GPU + // resources, it will not be offered *any* of the resources on + // an agent with GPUs. This restriction is in place because we + // do not have a revocation mechanism that ensures GPU workloads + // can evict GPU agent occupants if necessary. + // + // TODO(bmahler): As we add revocation we can relax the + // restriction here. See MESOS-5634 for more information. + FrameworkInfo_Capability_GPU_RESOURCES FrameworkInfo_Capability_Type = 3 + // Receive offers with resources that are shared. + FrameworkInfo_Capability_SHARED_RESOURCES FrameworkInfo_Capability_Type = 4 + // Indicates that (1) the framework is prepared to handle the + // following TaskStates: TASK_UNREACHABLE, TASK_DROPPED, + // TASK_GONE, TASK_GONE_BY_OPERATOR, and TASK_UNKNOWN, and (2) + // the framework will assume responsibility for managing + // partitioned tasks that reregister with the master. + // + // Frameworks that enable this capability can define how they + // would like to handle partitioned tasks. Frameworks will + // receive TASK_UNREACHABLE for tasks on agents that are + // partitioned from the master. + // + // Without this capability, frameworks will receive TASK_LOST + // for tasks on partitioned agents. + // NOTE: Prior to Mesos 1.5, such tasks will be killed by Mesos + // when the agent reregisters (unless the master has failed over). + // However due to the lack of benefit in maintaining different + // behaviors depending on whether the master has failed over + // (see MESOS-7215), as of 1.5, Mesos will not kill these + // tasks in either case. + FrameworkInfo_Capability_PARTITION_AWARE FrameworkInfo_Capability_Type = 5 + // This expresses the ability for the framework to be + // "multi-tenant" via using the newly introduced `roles` + // field, and examining `Offer.allocation_info` to determine + // which role the offers are being made to. We also + // expect that "single-tenant" schedulers eventually + // provide this and move away from the deprecated + // `role` field. + FrameworkInfo_Capability_MULTI_ROLE FrameworkInfo_Capability_Type = 6 + // This capability has two effects for a framework. + // + // (1) The framework is offered resources in a new format. + // + // The offered resources have the `Resource.reservations` field set + // rather than `Resource.role` and `Resource.reservation`. In short, + // an empty `reservations` field denotes unreserved resources, and + // each `ReservationInfo` in the `reservations` field denotes a + // reservation that refines the previous one. + // + // See the 'Resource Format' section for more details. + // + // (2) The framework can create refined reservations. + // + // A framework can refine an existing reservation via the + // `Resource.reservations` field. For example, a reservation for role + // `eng` can be refined to `eng/front_end`. + // + // See `ReservationInfo.reservations` for more details. + // + // NOTE: Without this capability, a framework is not offered resources + // that have refined reservations. A resource is said to have refined + // reservations if it uses the `Resource.reservations` field, and + // `Resource.reservations_size() > 1`. + FrameworkInfo_Capability_RESERVATION_REFINEMENT FrameworkInfo_Capability_Type = 7 + // Indicates that the framework is prepared to receive offers + // for agents whose region is different from the master's + // region. Network links between hosts in different regions + // typically have higher latency and lower bandwidth than + // network links within a region, so frameworks should be + // careful to only place suitable workloads in remote regions. + // Frameworks that are not region-aware will never receive + // offers for remote agents; region-aware frameworks are assumed + // to implement their own logic to decide which workloads (if + // any) are suitable for placement on remote agents. + FrameworkInfo_Capability_REGION_AWARE FrameworkInfo_Capability_Type = 8 +) + +var FrameworkInfo_Capability_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "REVOCABLE_RESOURCES", + 2: "TASK_KILLING_STATE", + 3: "GPU_RESOURCES", + 4: "SHARED_RESOURCES", + 5: "PARTITION_AWARE", + 6: "MULTI_ROLE", + 7: "RESERVATION_REFINEMENT", + 8: "REGION_AWARE", +} +var FrameworkInfo_Capability_Type_value = map[string]int32{ + "UNKNOWN": 0, + "REVOCABLE_RESOURCES": 1, + "TASK_KILLING_STATE": 2, + "GPU_RESOURCES": 3, + "SHARED_RESOURCES": 4, + "PARTITION_AWARE": 5, + "MULTI_ROLE": 6, + "RESERVATION_REFINEMENT": 7, + "REGION_AWARE": 8, +} + +func (x FrameworkInfo_Capability_Type) Enum() *FrameworkInfo_Capability_Type { + p := new(FrameworkInfo_Capability_Type) + *p = x + return p +} +func (x FrameworkInfo_Capability_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(FrameworkInfo_Capability_Type_name, int32(x)) +} +func (x *FrameworkInfo_Capability_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(FrameworkInfo_Capability_Type_value, data, "FrameworkInfo_Capability_Type") + if err != nil { + return err + } + *x = FrameworkInfo_Capability_Type(value) + return nil +} +func (FrameworkInfo_Capability_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{15, 0, 0} +} + +type CheckInfo_Type int32 + +const ( + CheckInfo_UNKNOWN CheckInfo_Type = 0 + CheckInfo_COMMAND CheckInfo_Type = 1 + CheckInfo_HTTP CheckInfo_Type = 2 + CheckInfo_TCP CheckInfo_Type = 3 +) + +var CheckInfo_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "COMMAND", + 2: "HTTP", + 3: "TCP", +} +var CheckInfo_Type_value = map[string]int32{ + "UNKNOWN": 0, + "COMMAND": 1, + "HTTP": 2, + "TCP": 3, +} + +func (x CheckInfo_Type) Enum() *CheckInfo_Type { + p := new(CheckInfo_Type) + *p = x + return p +} +func (x CheckInfo_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(CheckInfo_Type_name, int32(x)) +} +func (x *CheckInfo_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(CheckInfo_Type_value, data, "CheckInfo_Type") + if err != nil { + return err + } + *x = CheckInfo_Type(value) + return nil +} +func (CheckInfo_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{16, 0} } + +type HealthCheck_Type int32 + +const ( + HealthCheck_UNKNOWN HealthCheck_Type = 0 + HealthCheck_COMMAND HealthCheck_Type = 1 + HealthCheck_HTTP HealthCheck_Type = 2 + HealthCheck_TCP HealthCheck_Type = 3 +) + +var HealthCheck_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "COMMAND", + 2: "HTTP", + 3: "TCP", +} +var HealthCheck_Type_value = map[string]int32{ + "UNKNOWN": 0, + "COMMAND": 1, + "HTTP": 2, + "TCP": 3, +} + +func (x HealthCheck_Type) Enum() *HealthCheck_Type { + p := new(HealthCheck_Type) + *p = x + return p +} +func (x HealthCheck_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(HealthCheck_Type_name, int32(x)) +} +func (x *HealthCheck_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(HealthCheck_Type_value, data, "HealthCheck_Type") + if err != nil { + return err + } + *x = HealthCheck_Type(value) + return nil +} +func (HealthCheck_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{17, 0} } + +type ExecutorInfo_Type int32 + +const ( + ExecutorInfo_UNKNOWN ExecutorInfo_Type = 0 + // Mesos provides a simple built-in default executor that frameworks can + // leverage to run shell commands and containers. + // + // NOTES: + // + // 1) `command` must not be set when using a default executor. + // + // 2) Default executor only accepts a *single* `LAUNCH` or `LAUNCH_GROUP` + // operation. + // + // 3) If `container` is set, `container.type` must be `MESOS` + // and `container.mesos.image` must not be set. + ExecutorInfo_DEFAULT ExecutorInfo_Type = 1 + // For frameworks that need custom functionality to run tasks, a `CUSTOM` + // executor can be used. Note that `command` must be set when using a + // `CUSTOM` executor. + ExecutorInfo_CUSTOM ExecutorInfo_Type = 2 +) + +var ExecutorInfo_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "DEFAULT", + 2: "CUSTOM", +} +var ExecutorInfo_Type_value = map[string]int32{ + "UNKNOWN": 0, + "DEFAULT": 1, + "CUSTOM": 2, +} + +func (x ExecutorInfo_Type) Enum() *ExecutorInfo_Type { + p := new(ExecutorInfo_Type) + *p = x + return p +} +func (x ExecutorInfo_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(ExecutorInfo_Type_name, int32(x)) +} +func (x *ExecutorInfo_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ExecutorInfo_Type_value, data, "ExecutorInfo_Type") + if err != nil { + return err + } + *x = ExecutorInfo_Type(value) + return nil +} +func (ExecutorInfo_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{20, 0} } + +type MasterInfo_Capability_Type int32 + +const ( + MasterInfo_Capability_UNKNOWN MasterInfo_Capability_Type = 0 + // The master can handle slaves whose state + // changes after reregistering. + MasterInfo_Capability_AGENT_UPDATE MasterInfo_Capability_Type = 1 +) + +var MasterInfo_Capability_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "AGENT_UPDATE", +} +var MasterInfo_Capability_Type_value = map[string]int32{ + "UNKNOWN": 0, + "AGENT_UPDATE": 1, +} + +func (x MasterInfo_Capability_Type) Enum() *MasterInfo_Capability_Type { + p := new(MasterInfo_Capability_Type) + *p = x + return p +} +func (x MasterInfo_Capability_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(MasterInfo_Capability_Type_name, int32(x)) +} +func (x *MasterInfo_Capability_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MasterInfo_Capability_Type_value, data, "MasterInfo_Capability_Type") + if err != nil { + return err + } + *x = MasterInfo_Capability_Type(value) + return nil +} +func (MasterInfo_Capability_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{22, 0, 0} +} + +type AgentInfo_Capability_Type int32 + +const ( + // This must be the first enum value in this list, to + // ensure that if 'type' is not set, the default value + // is UNKNOWN. This enables enum values to be added + // in a backwards-compatible way. See: MESOS-4997. + AgentInfo_Capability_UNKNOWN AgentInfo_Capability_Type = 0 + // This expresses the ability for the agent to be able + // to launch tasks of a 'multi-role' framework. + AgentInfo_Capability_MULTI_ROLE AgentInfo_Capability_Type = 1 + // This expresses the ability for the agent to be able to launch + // tasks, reserve resources, and create volumes using resources + // allocated to a 'hierarchical-role'. + // NOTE: This capability is required specifically for creating + // volumes because a hierchical role includes '/' (slashes) in them. + // Agents with this capability know to transform the '/' (slashes) + // into ' ' (spaces). + AgentInfo_Capability_HIERARCHICAL_ROLE AgentInfo_Capability_Type = 2 + // This capability has three effects for an agent. + // + // (1) The format of the checkpointed resources, and + // the resources reported to master. + // + // These resources are reported in the "pre-reservation-refinement" + // format if none of the resources have refined reservations. If any + // of the resources have refined reservations, they are reported in + // the "post-reservation-refinement" format. The purpose is to allow + // downgrading of an agent as well as communication with a pre-1.4.0 + // master until the reservation refinement feature is actually used. + // + // See the 'Resource Format' section for more details. + // + // (2) The format of the resources reported by the HTTP endpoints. + // + // For resources reported by agent endpoints, the + // "pre-reservation-refinement" format is "injected" if possible. + // That is, resources without refined reservations will have the + // `Resource.role` and `Resource.reservation` set, whereas + // resources with refined reservations will not. + // + // See the 'Resource Format' section for more details. + // + // (3) The ability for the agent to launch tasks, reserve resources, and + // create volumes using resources that have refined reservations. + // + // See `ReservationInfo.reservations` section for more details. + // + // NOTE: Resources are said to have refined reservations if it uses the + // `Resource.reservations` field, and `Resource.reservations_size() > 1`. + AgentInfo_Capability_RESERVATION_REFINEMENT AgentInfo_Capability_Type = 3 + // This expresses the ability for the agent to handle resource + // provider related operations. This includes the following: + // + // (1) The ability to report resources that are provided by some + // local resource providers through the resource provider API. + // + // (2) The ability to provide operation feedback. + AgentInfo_Capability_RESOURCE_PROVIDER AgentInfo_Capability_Type = 4 + // This expresses the capability for the agent to handle persistent volume + // resize operations safely. This capability is turned on by default. + AgentInfo_Capability_RESIZE_VOLUME AgentInfo_Capability_Type = 5 +) + +var AgentInfo_Capability_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "MULTI_ROLE", + 2: "HIERARCHICAL_ROLE", + 3: "RESERVATION_REFINEMENT", + 4: "RESOURCE_PROVIDER", + 5: "RESIZE_VOLUME", +} +var AgentInfo_Capability_Type_value = map[string]int32{ + "UNKNOWN": 0, + "MULTI_ROLE": 1, + "HIERARCHICAL_ROLE": 2, + "RESERVATION_REFINEMENT": 3, + "RESOURCE_PROVIDER": 4, + "RESIZE_VOLUME": 5, +} + +func (x AgentInfo_Capability_Type) Enum() *AgentInfo_Capability_Type { + p := new(AgentInfo_Capability_Type) + *p = x + return p +} +func (x AgentInfo_Capability_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(AgentInfo_Capability_Type_name, int32(x)) +} +func (x *AgentInfo_Capability_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(AgentInfo_Capability_Type_value, data, "AgentInfo_Capability_Type") + if err != nil { + return err + } + *x = AgentInfo_Capability_Type(value) + return nil +} +func (AgentInfo_Capability_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{23, 0, 0} +} + +type CSIPluginContainerInfo_Service int32 + +const ( + CSIPluginContainerInfo_UNKNOWN CSIPluginContainerInfo_Service = 0 + CSIPluginContainerInfo_CONTROLLER_SERVICE CSIPluginContainerInfo_Service = 1 + CSIPluginContainerInfo_NODE_SERVICE CSIPluginContainerInfo_Service = 2 +) + +var CSIPluginContainerInfo_Service_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CONTROLLER_SERVICE", + 2: "NODE_SERVICE", +} +var CSIPluginContainerInfo_Service_value = map[string]int32{ + "UNKNOWN": 0, + "CONTROLLER_SERVICE": 1, + "NODE_SERVICE": 2, +} + +func (x CSIPluginContainerInfo_Service) Enum() *CSIPluginContainerInfo_Service { + p := new(CSIPluginContainerInfo_Service) + *p = x + return p +} +func (x CSIPluginContainerInfo_Service) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(CSIPluginContainerInfo_Service_name, int32(x)) +} +func (x *CSIPluginContainerInfo_Service) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(CSIPluginContainerInfo_Service_value, data, "CSIPluginContainerInfo_Service") + if err != nil { + return err + } + *x = CSIPluginContainerInfo_Service(value) + return nil +} +func (CSIPluginContainerInfo_Service) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{24, 0} +} + +type Value_Type int32 + +const ( + SCALAR Value_Type = 0 + RANGES Value_Type = 1 + SET Value_Type = 2 + TEXT Value_Type = 3 +) + +var Value_Type_name = map[int32]string{ + 0: "SCALAR", + 1: "RANGES", + 2: "SET", + 3: "TEXT", +} +var Value_Type_value = map[string]int32{ + "SCALAR": 0, + "RANGES": 1, + "SET": 2, + "TEXT": 3, +} + +func (x Value_Type) Enum() *Value_Type { + p := new(Value_Type) + *p = x + return p +} +func (x Value_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Value_Type_name, int32(x)) +} +func (x *Value_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Value_Type_value, data, "Value_Type") + if err != nil { + return err + } + *x = Value_Type(value) + return nil +} +func (Value_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{27, 0} } + +type Resource_ReservationInfo_Type int32 + +const ( + Resource_ReservationInfo_UNKNOWN Resource_ReservationInfo_Type = 0 + Resource_ReservationInfo_STATIC Resource_ReservationInfo_Type = 1 + Resource_ReservationInfo_DYNAMIC Resource_ReservationInfo_Type = 2 +) + +var Resource_ReservationInfo_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "STATIC", + 2: "DYNAMIC", +} +var Resource_ReservationInfo_Type_value = map[string]int32{ + "UNKNOWN": 0, + "STATIC": 1, + "DYNAMIC": 2, +} + +func (x Resource_ReservationInfo_Type) Enum() *Resource_ReservationInfo_Type { + p := new(Resource_ReservationInfo_Type) + *p = x + return p +} +func (x Resource_ReservationInfo_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Resource_ReservationInfo_Type_name, int32(x)) +} +func (x *Resource_ReservationInfo_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Resource_ReservationInfo_Type_value, data, "Resource_ReservationInfo_Type") + if err != nil { + return err + } + *x = Resource_ReservationInfo_Type(value) + return nil +} +func (Resource_ReservationInfo_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{29, 1, 0} +} + +type Resource_DiskInfo_Source_Type int32 + +const ( + Resource_DiskInfo_Source_UNKNOWN Resource_DiskInfo_Source_Type = 0 + Resource_DiskInfo_Source_PATH Resource_DiskInfo_Source_Type = 1 + Resource_DiskInfo_Source_MOUNT Resource_DiskInfo_Source_Type = 2 + Resource_DiskInfo_Source_BLOCK Resource_DiskInfo_Source_Type = 3 + Resource_DiskInfo_Source_RAW Resource_DiskInfo_Source_Type = 4 +) + +var Resource_DiskInfo_Source_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "PATH", + 2: "MOUNT", + 3: "BLOCK", + 4: "RAW", +} +var Resource_DiskInfo_Source_Type_value = map[string]int32{ + "UNKNOWN": 0, + "PATH": 1, + "MOUNT": 2, + "BLOCK": 3, + "RAW": 4, +} + +func (x Resource_DiskInfo_Source_Type) Enum() *Resource_DiskInfo_Source_Type { + p := new(Resource_DiskInfo_Source_Type) + *p = x + return p +} +func (x Resource_DiskInfo_Source_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Resource_DiskInfo_Source_Type_name, int32(x)) +} +func (x *Resource_DiskInfo_Source_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Resource_DiskInfo_Source_Type_value, data, "Resource_DiskInfo_Source_Type") + if err != nil { + return err + } + *x = Resource_DiskInfo_Source_Type(value) + return nil +} +func (Resource_DiskInfo_Source_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{29, 2, 1, 0} +} + +type Offer_Operation_Type int32 + +const ( + Offer_Operation_UNKNOWN Offer_Operation_Type = 0 + Offer_Operation_LAUNCH Offer_Operation_Type = 1 + Offer_Operation_LAUNCH_GROUP Offer_Operation_Type = 6 + Offer_Operation_RESERVE Offer_Operation_Type = 2 + Offer_Operation_UNRESERVE Offer_Operation_Type = 3 + Offer_Operation_CREATE Offer_Operation_Type = 4 + Offer_Operation_DESTROY Offer_Operation_Type = 5 + Offer_Operation_GROW_VOLUME Offer_Operation_Type = 11 + Offer_Operation_SHRINK_VOLUME Offer_Operation_Type = 12 + Offer_Operation_CREATE_DISK Offer_Operation_Type = 13 + Offer_Operation_DESTROY_DISK Offer_Operation_Type = 14 +) + +var Offer_Operation_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "LAUNCH", + 6: "LAUNCH_GROUP", + 2: "RESERVE", + 3: "UNRESERVE", + 4: "CREATE", + 5: "DESTROY", + 11: "GROW_VOLUME", + 12: "SHRINK_VOLUME", + 13: "CREATE_DISK", + 14: "DESTROY_DISK", +} +var Offer_Operation_Type_value = map[string]int32{ + "UNKNOWN": 0, + "LAUNCH": 1, + "LAUNCH_GROUP": 6, + "RESERVE": 2, + "UNRESERVE": 3, + "CREATE": 4, + "DESTROY": 5, + "GROW_VOLUME": 11, + "SHRINK_VOLUME": 12, + "CREATE_DISK": 13, + "DESTROY_DISK": 14, +} + +func (x Offer_Operation_Type) Enum() *Offer_Operation_Type { + p := new(Offer_Operation_Type) + *p = x + return p +} +func (x Offer_Operation_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Offer_Operation_Type_name, int32(x)) +} +func (x *Offer_Operation_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Offer_Operation_Type_value, data, "Offer_Operation_Type") + if err != nil { + return err + } + *x = Offer_Operation_Type(value) + return nil +} +func (Offer_Operation_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 0} +} + +// Describes the source of the task status update. +type TaskStatus_Source int32 + +const ( + SOURCE_MASTER TaskStatus_Source = 0 + SOURCE_AGENT TaskStatus_Source = 1 + SOURCE_EXECUTOR TaskStatus_Source = 2 +) + +var TaskStatus_Source_name = map[int32]string{ + 0: "SOURCE_MASTER", + 1: "SOURCE_AGENT", + 2: "SOURCE_EXECUTOR", +} +var TaskStatus_Source_value = map[string]int32{ + "SOURCE_MASTER": 0, + "SOURCE_AGENT": 1, + "SOURCE_EXECUTOR": 2, +} + +func (x TaskStatus_Source) Enum() *TaskStatus_Source { + p := new(TaskStatus_Source) + *p = x + return p +} +func (x TaskStatus_Source) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(TaskStatus_Source_name, int32(x)) +} +func (x *TaskStatus_Source) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(TaskStatus_Source_value, data, "TaskStatus_Source") + if err != nil { + return err + } + *x = TaskStatus_Source(value) + return nil +} +func (TaskStatus_Source) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{51, 0} } + +// Detailed reason for the task status update. +// Refer to docs/task-state-reasons.md for additional explanation. +type TaskStatus_Reason int32 + +const ( + // TODO(jieyu): The default value when a caller doesn't check for + // presence is 0 and so ideally the 0 reason is not a valid one. + // Since this is not used anywhere, consider removing this reason. + REASON_COMMAND_EXECUTOR_FAILED TaskStatus_Reason = 0 + REASON_CONTAINER_LAUNCH_FAILED TaskStatus_Reason = 21 + REASON_CONTAINER_LIMITATION TaskStatus_Reason = 19 + REASON_CONTAINER_LIMITATION_DISK TaskStatus_Reason = 20 + REASON_CONTAINER_LIMITATION_MEMORY TaskStatus_Reason = 8 + REASON_CONTAINER_PREEMPTED TaskStatus_Reason = 17 + REASON_CONTAINER_UPDATE_FAILED TaskStatus_Reason = 22 + REASON_MAX_COMPLETION_TIME_REACHED TaskStatus_Reason = 33 + REASON_EXECUTOR_REGISTRATION_TIMEOUT TaskStatus_Reason = 23 + REASON_EXECUTOR_REREGISTRATION_TIMEOUT TaskStatus_Reason = 24 + REASON_EXECUTOR_TERMINATED TaskStatus_Reason = 1 + REASON_EXECUTOR_UNREGISTERED TaskStatus_Reason = 2 + REASON_FRAMEWORK_REMOVED TaskStatus_Reason = 3 + REASON_GC_ERROR TaskStatus_Reason = 4 + REASON_INVALID_FRAMEWORKID TaskStatus_Reason = 5 + REASON_INVALID_OFFERS TaskStatus_Reason = 6 + REASON_IO_SWITCHBOARD_EXITED TaskStatus_Reason = 27 + REASON_MASTER_DISCONNECTED TaskStatus_Reason = 7 + REASON_RECONCILIATION TaskStatus_Reason = 9 + REASON_RESOURCES_UNKNOWN TaskStatus_Reason = 18 + REASON_AGENT_DISCONNECTED TaskStatus_Reason = 10 + REASON_AGENT_REMOVED TaskStatus_Reason = 11 + REASON_AGENT_REMOVED_BY_OPERATOR TaskStatus_Reason = 31 + REASON_AGENT_REREGISTERED TaskStatus_Reason = 32 + REASON_AGENT_RESTARTED TaskStatus_Reason = 12 + REASON_AGENT_UNKNOWN TaskStatus_Reason = 13 + REASON_TASK_KILLED_DURING_LAUNCH TaskStatus_Reason = 30 + REASON_TASK_CHECK_STATUS_UPDATED TaskStatus_Reason = 28 + REASON_TASK_HEALTH_CHECK_STATUS_UPDATED TaskStatus_Reason = 29 + REASON_TASK_GROUP_INVALID TaskStatus_Reason = 25 + REASON_TASK_GROUP_UNAUTHORIZED TaskStatus_Reason = 26 + REASON_TASK_INVALID TaskStatus_Reason = 14 + REASON_TASK_UNAUTHORIZED TaskStatus_Reason = 15 + REASON_TASK_UNKNOWN TaskStatus_Reason = 16 +) + +var TaskStatus_Reason_name = map[int32]string{ + 0: "REASON_COMMAND_EXECUTOR_FAILED", + 21: "REASON_CONTAINER_LAUNCH_FAILED", + 19: "REASON_CONTAINER_LIMITATION", + 20: "REASON_CONTAINER_LIMITATION_DISK", + 8: "REASON_CONTAINER_LIMITATION_MEMORY", + 17: "REASON_CONTAINER_PREEMPTED", + 22: "REASON_CONTAINER_UPDATE_FAILED", + 33: "REASON_MAX_COMPLETION_TIME_REACHED", + 23: "REASON_EXECUTOR_REGISTRATION_TIMEOUT", + 24: "REASON_EXECUTOR_REREGISTRATION_TIMEOUT", + 1: "REASON_EXECUTOR_TERMINATED", + 2: "REASON_EXECUTOR_UNREGISTERED", + 3: "REASON_FRAMEWORK_REMOVED", + 4: "REASON_GC_ERROR", + 5: "REASON_INVALID_FRAMEWORKID", + 6: "REASON_INVALID_OFFERS", + 27: "REASON_IO_SWITCHBOARD_EXITED", + 7: "REASON_MASTER_DISCONNECTED", + 9: "REASON_RECONCILIATION", + 18: "REASON_RESOURCES_UNKNOWN", + 10: "REASON_AGENT_DISCONNECTED", + 11: "REASON_AGENT_REMOVED", + 31: "REASON_AGENT_REMOVED_BY_OPERATOR", + 32: "REASON_AGENT_REREGISTERED", + 12: "REASON_AGENT_RESTARTED", + 13: "REASON_AGENT_UNKNOWN", + 30: "REASON_TASK_KILLED_DURING_LAUNCH", + 28: "REASON_TASK_CHECK_STATUS_UPDATED", + 29: "REASON_TASK_HEALTH_CHECK_STATUS_UPDATED", + 25: "REASON_TASK_GROUP_INVALID", + 26: "REASON_TASK_GROUP_UNAUTHORIZED", + 14: "REASON_TASK_INVALID", + 15: "REASON_TASK_UNAUTHORIZED", + 16: "REASON_TASK_UNKNOWN", +} +var TaskStatus_Reason_value = map[string]int32{ + "REASON_COMMAND_EXECUTOR_FAILED": 0, + "REASON_CONTAINER_LAUNCH_FAILED": 21, + "REASON_CONTAINER_LIMITATION": 19, + "REASON_CONTAINER_LIMITATION_DISK": 20, + "REASON_CONTAINER_LIMITATION_MEMORY": 8, + "REASON_CONTAINER_PREEMPTED": 17, + "REASON_CONTAINER_UPDATE_FAILED": 22, + "REASON_MAX_COMPLETION_TIME_REACHED": 33, + "REASON_EXECUTOR_REGISTRATION_TIMEOUT": 23, + "REASON_EXECUTOR_REREGISTRATION_TIMEOUT": 24, + "REASON_EXECUTOR_TERMINATED": 1, + "REASON_EXECUTOR_UNREGISTERED": 2, + "REASON_FRAMEWORK_REMOVED": 3, + "REASON_GC_ERROR": 4, + "REASON_INVALID_FRAMEWORKID": 5, + "REASON_INVALID_OFFERS": 6, + "REASON_IO_SWITCHBOARD_EXITED": 27, + "REASON_MASTER_DISCONNECTED": 7, + "REASON_RECONCILIATION": 9, + "REASON_RESOURCES_UNKNOWN": 18, + "REASON_AGENT_DISCONNECTED": 10, + "REASON_AGENT_REMOVED": 11, + "REASON_AGENT_REMOVED_BY_OPERATOR": 31, + "REASON_AGENT_REREGISTERED": 32, + "REASON_AGENT_RESTARTED": 12, + "REASON_AGENT_UNKNOWN": 13, + "REASON_TASK_KILLED_DURING_LAUNCH": 30, + "REASON_TASK_CHECK_STATUS_UPDATED": 28, + "REASON_TASK_HEALTH_CHECK_STATUS_UPDATED": 29, + "REASON_TASK_GROUP_INVALID": 25, + "REASON_TASK_GROUP_UNAUTHORIZED": 26, + "REASON_TASK_INVALID": 14, + "REASON_TASK_UNAUTHORIZED": 15, + "REASON_TASK_UNKNOWN": 16, +} + +func (x TaskStatus_Reason) Enum() *TaskStatus_Reason { + p := new(TaskStatus_Reason) + *p = x + return p +} +func (x TaskStatus_Reason) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(TaskStatus_Reason_name, int32(x)) +} +func (x *TaskStatus_Reason) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(TaskStatus_Reason_value, data, "TaskStatus_Reason") + if err != nil { + return err + } + *x = TaskStatus_Reason(value) + return nil +} +func (TaskStatus_Reason) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{51, 1} } + +type Environment_Variable_Type int32 + +const ( + Environment_Variable_UNKNOWN Environment_Variable_Type = 0 + Environment_Variable_VALUE Environment_Variable_Type = 1 + Environment_Variable_SECRET Environment_Variable_Type = 2 +) + +var Environment_Variable_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "VALUE", + 2: "SECRET", +} +var Environment_Variable_Type_value = map[string]int32{ + "UNKNOWN": 0, + "VALUE": 1, + "SECRET": 2, +} + +func (x Environment_Variable_Type) Enum() *Environment_Variable_Type { + p := new(Environment_Variable_Type) + *p = x + return p +} +func (x Environment_Variable_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Environment_Variable_Type_name, int32(x)) +} +func (x *Environment_Variable_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Environment_Variable_Type_value, data, "Environment_Variable_Type") + if err != nil { + return err + } + *x = Environment_Variable_Type(value) + return nil +} +func (Environment_Variable_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{53, 0, 0} +} + +type Secret_Type int32 + +const ( + Secret_UNKNOWN Secret_Type = 0 + Secret_REFERENCE Secret_Type = 1 + Secret_VALUE Secret_Type = 2 +) + +var Secret_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "REFERENCE", + 2: "VALUE", +} +var Secret_Type_value = map[string]int32{ + "UNKNOWN": 0, + "REFERENCE": 1, + "VALUE": 2, +} + +func (x Secret_Type) Enum() *Secret_Type { + p := new(Secret_Type) + *p = x + return p +} +func (x Secret_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Secret_Type_name, int32(x)) +} +func (x *Secret_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Secret_Type_value, data, "Secret_Type") + if err != nil { + return err + } + *x = Secret_Type(value) + return nil +} +func (Secret_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{58, 0} } + +type Image_Type int32 + +const ( + Image_APPC Image_Type = 1 + Image_DOCKER Image_Type = 2 +) + +var Image_Type_name = map[int32]string{ + 1: "APPC", + 2: "DOCKER", +} +var Image_Type_value = map[string]int32{ + "APPC": 1, + "DOCKER": 2, +} + +func (x Image_Type) Enum() *Image_Type { + p := new(Image_Type) + *p = x + return p +} +func (x Image_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Image_Type_name, int32(x)) +} +func (x *Image_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Image_Type_value, data, "Image_Type") + if err != nil { + return err + } + *x = Image_Type(value) + return nil +} +func (Image_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{61, 0} } + +type MountPropagation_Mode int32 + +const ( + MountPropagation_UNKNOWN MountPropagation_Mode = 0 + // The volume in a container will receive new mounts from the host + // or other containers, but filesystems mounted inside the + // container won't be propagated to the host or other containers. + // This is currently the default behavior for all volumes. + MountPropagation_HOST_TO_CONTAINER MountPropagation_Mode = 1 + // The volume in a container will receive new mounts from the host + // or other containers, and its own mounts will be propagated from + // the container to the host or other containers. + MountPropagation_BIDIRECTIONAL MountPropagation_Mode = 2 +) + +var MountPropagation_Mode_name = map[int32]string{ + 0: "UNKNOWN", + 1: "HOST_TO_CONTAINER", + 2: "BIDIRECTIONAL", +} +var MountPropagation_Mode_value = map[string]int32{ + "UNKNOWN": 0, + "HOST_TO_CONTAINER": 1, + "BIDIRECTIONAL": 2, +} + +func (x MountPropagation_Mode) Enum() *MountPropagation_Mode { + p := new(MountPropagation_Mode) + *p = x + return p +} +func (x MountPropagation_Mode) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(MountPropagation_Mode_name, int32(x)) +} +func (x *MountPropagation_Mode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MountPropagation_Mode_value, data, "MountPropagation_Mode") + if err != nil { + return err + } + *x = MountPropagation_Mode(value) + return nil +} +func (MountPropagation_Mode) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{62, 0} +} + +type Volume_Mode int32 + +const ( + RW Volume_Mode = 1 + RO Volume_Mode = 2 +) + +var Volume_Mode_name = map[int32]string{ + 1: "RW", + 2: "RO", +} +var Volume_Mode_value = map[string]int32{ + "RW": 1, + "RO": 2, +} + +func (x Volume_Mode) Enum() *Volume_Mode { + p := new(Volume_Mode) + *p = x + return p +} +func (x Volume_Mode) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Volume_Mode_name, int32(x)) +} +func (x *Volume_Mode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Volume_Mode_value, data, "Volume_Mode") + if err != nil { + return err + } + *x = Volume_Mode(value) + return nil +} +func (Volume_Mode) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{63, 0} } + +type Volume_Source_Type int32 + +const ( + // This must be the first enum value in this list, to + // ensure that if 'type' is not set, the default value + // is UNKNOWN. This enables enum values to be added + // in a backwards-compatible way. See: MESOS-4997. + Volume_Source_UNKNOWN Volume_Source_Type = 0 + // TODO(gyliu513): Add IMAGE as volume source type. + Volume_Source_DOCKER_VOLUME Volume_Source_Type = 1 + Volume_Source_HOST_PATH Volume_Source_Type = 4 + Volume_Source_SANDBOX_PATH Volume_Source_Type = 2 + Volume_Source_SECRET Volume_Source_Type = 3 +) + +var Volume_Source_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "DOCKER_VOLUME", + 4: "HOST_PATH", + 2: "SANDBOX_PATH", + 3: "SECRET", +} +var Volume_Source_Type_value = map[string]int32{ + "UNKNOWN": 0, + "DOCKER_VOLUME": 1, + "HOST_PATH": 4, + "SANDBOX_PATH": 2, + "SECRET": 3, +} + +func (x Volume_Source_Type) Enum() *Volume_Source_Type { + p := new(Volume_Source_Type) + *p = x + return p +} +func (x Volume_Source_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Volume_Source_Type_name, int32(x)) +} +func (x *Volume_Source_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Volume_Source_Type_value, data, "Volume_Source_Type") + if err != nil { + return err + } + *x = Volume_Source_Type(value) + return nil +} +func (Volume_Source_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{63, 0, 0} +} + +type Volume_Source_SandboxPath_Type int32 + +const ( + Volume_Source_SandboxPath_UNKNOWN Volume_Source_SandboxPath_Type = 0 + Volume_Source_SandboxPath_SELF Volume_Source_SandboxPath_Type = 1 + Volume_Source_SandboxPath_PARENT Volume_Source_SandboxPath_Type = 2 +) + +var Volume_Source_SandboxPath_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SELF", + 2: "PARENT", +} +var Volume_Source_SandboxPath_Type_value = map[string]int32{ + "UNKNOWN": 0, + "SELF": 1, + "PARENT": 2, +} + +func (x Volume_Source_SandboxPath_Type) Enum() *Volume_Source_SandboxPath_Type { + p := new(Volume_Source_SandboxPath_Type) + *p = x + return p +} +func (x Volume_Source_SandboxPath_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(Volume_Source_SandboxPath_Type_name, int32(x)) +} +func (x *Volume_Source_SandboxPath_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Volume_Source_SandboxPath_Type_value, data, "Volume_Source_SandboxPath_Type") + if err != nil { + return err + } + *x = Volume_Source_SandboxPath_Type(value) + return nil +} +func (Volume_Source_SandboxPath_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{63, 0, 2, 0} +} + +type NetworkInfo_Protocol int32 + +const ( + IPv4 NetworkInfo_Protocol = 1 + IPv6 NetworkInfo_Protocol = 2 +) + +var NetworkInfo_Protocol_name = map[int32]string{ + 1: "IPv4", + 2: "IPv6", +} +var NetworkInfo_Protocol_value = map[string]int32{ + "IPv4": 1, + "IPv6": 2, +} + +func (x NetworkInfo_Protocol) Enum() *NetworkInfo_Protocol { + p := new(NetworkInfo_Protocol) + *p = x + return p +} +func (x NetworkInfo_Protocol) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(NetworkInfo_Protocol_name, int32(x)) +} +func (x *NetworkInfo_Protocol) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(NetworkInfo_Protocol_value, data, "NetworkInfo_Protocol") + if err != nil { + return err + } + *x = NetworkInfo_Protocol(value) + return nil +} +func (NetworkInfo_Protocol) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{64, 0} } + +// We start the actual values at an offset(1000) because Protobuf 2 +// uses the first value as the default one. Separating the default +// value from the real first value helps to disambiguate them. This +// is especially valuable for backward compatibility. +// See: MESOS-4997. +type CapabilityInfo_Capability int32 + +const ( + CapabilityInfo_UNKNOWN CapabilityInfo_Capability = 0 + CapabilityInfo_CHOWN CapabilityInfo_Capability = 1000 + CapabilityInfo_DAC_OVERRIDE CapabilityInfo_Capability = 1001 + CapabilityInfo_DAC_READ_SEARCH CapabilityInfo_Capability = 1002 + CapabilityInfo_FOWNER CapabilityInfo_Capability = 1003 + CapabilityInfo_FSETID CapabilityInfo_Capability = 1004 + CapabilityInfo_KILL CapabilityInfo_Capability = 1005 + CapabilityInfo_SETGID CapabilityInfo_Capability = 1006 + CapabilityInfo_SETUID CapabilityInfo_Capability = 1007 + CapabilityInfo_SETPCAP CapabilityInfo_Capability = 1008 + CapabilityInfo_LINUX_IMMUTABLE CapabilityInfo_Capability = 1009 + CapabilityInfo_NET_BIND_SERVICE CapabilityInfo_Capability = 1010 + CapabilityInfo_NET_BROADCAST CapabilityInfo_Capability = 1011 + CapabilityInfo_NET_ADMIN CapabilityInfo_Capability = 1012 + CapabilityInfo_NET_RAW CapabilityInfo_Capability = 1013 + CapabilityInfo_IPC_LOCK CapabilityInfo_Capability = 1014 + CapabilityInfo_IPC_OWNER CapabilityInfo_Capability = 1015 + CapabilityInfo_SYS_MODULE CapabilityInfo_Capability = 1016 + CapabilityInfo_SYS_RAWIO CapabilityInfo_Capability = 1017 + CapabilityInfo_SYS_CHROOT CapabilityInfo_Capability = 1018 + CapabilityInfo_SYS_PTRACE CapabilityInfo_Capability = 1019 + CapabilityInfo_SYS_PACCT CapabilityInfo_Capability = 1020 + CapabilityInfo_SYS_ADMIN CapabilityInfo_Capability = 1021 + CapabilityInfo_SYS_BOOT CapabilityInfo_Capability = 1022 + CapabilityInfo_SYS_NICE CapabilityInfo_Capability = 1023 + CapabilityInfo_SYS_RESOURCE CapabilityInfo_Capability = 1024 + CapabilityInfo_SYS_TIME CapabilityInfo_Capability = 1025 + CapabilityInfo_SYS_TTY_CONFIG CapabilityInfo_Capability = 1026 + CapabilityInfo_MKNOD CapabilityInfo_Capability = 1027 + CapabilityInfo_LEASE CapabilityInfo_Capability = 1028 + CapabilityInfo_AUDIT_WRITE CapabilityInfo_Capability = 1029 + CapabilityInfo_AUDIT_CONTROL CapabilityInfo_Capability = 1030 + CapabilityInfo_SETFCAP CapabilityInfo_Capability = 1031 + CapabilityInfo_MAC_OVERRIDE CapabilityInfo_Capability = 1032 + CapabilityInfo_MAC_ADMIN CapabilityInfo_Capability = 1033 + CapabilityInfo_SYSLOG CapabilityInfo_Capability = 1034 + CapabilityInfo_WAKE_ALARM CapabilityInfo_Capability = 1035 + CapabilityInfo_BLOCK_SUSPEND CapabilityInfo_Capability = 1036 + CapabilityInfo_AUDIT_READ CapabilityInfo_Capability = 1037 +) + +var CapabilityInfo_Capability_name = map[int32]string{ + 0: "UNKNOWN", + 1000: "CHOWN", + 1001: "DAC_OVERRIDE", + 1002: "DAC_READ_SEARCH", + 1003: "FOWNER", + 1004: "FSETID", + 1005: "KILL", + 1006: "SETGID", + 1007: "SETUID", + 1008: "SETPCAP", + 1009: "LINUX_IMMUTABLE", + 1010: "NET_BIND_SERVICE", + 1011: "NET_BROADCAST", + 1012: "NET_ADMIN", + 1013: "NET_RAW", + 1014: "IPC_LOCK", + 1015: "IPC_OWNER", + 1016: "SYS_MODULE", + 1017: "SYS_RAWIO", + 1018: "SYS_CHROOT", + 1019: "SYS_PTRACE", + 1020: "SYS_PACCT", + 1021: "SYS_ADMIN", + 1022: "SYS_BOOT", + 1023: "SYS_NICE", + 1024: "SYS_RESOURCE", + 1025: "SYS_TIME", + 1026: "SYS_TTY_CONFIG", + 1027: "MKNOD", + 1028: "LEASE", + 1029: "AUDIT_WRITE", + 1030: "AUDIT_CONTROL", + 1031: "SETFCAP", + 1032: "MAC_OVERRIDE", + 1033: "MAC_ADMIN", + 1034: "SYSLOG", + 1035: "WAKE_ALARM", + 1036: "BLOCK_SUSPEND", + 1037: "AUDIT_READ", +} +var CapabilityInfo_Capability_value = map[string]int32{ + "UNKNOWN": 0, + "CHOWN": 1000, + "DAC_OVERRIDE": 1001, + "DAC_READ_SEARCH": 1002, + "FOWNER": 1003, + "FSETID": 1004, + "KILL": 1005, + "SETGID": 1006, + "SETUID": 1007, + "SETPCAP": 1008, + "LINUX_IMMUTABLE": 1009, + "NET_BIND_SERVICE": 1010, + "NET_BROADCAST": 1011, + "NET_ADMIN": 1012, + "NET_RAW": 1013, + "IPC_LOCK": 1014, + "IPC_OWNER": 1015, + "SYS_MODULE": 1016, + "SYS_RAWIO": 1017, + "SYS_CHROOT": 1018, + "SYS_PTRACE": 1019, + "SYS_PACCT": 1020, + "SYS_ADMIN": 1021, + "SYS_BOOT": 1022, + "SYS_NICE": 1023, + "SYS_RESOURCE": 1024, + "SYS_TIME": 1025, + "SYS_TTY_CONFIG": 1026, + "MKNOD": 1027, + "LEASE": 1028, + "AUDIT_WRITE": 1029, + "AUDIT_CONTROL": 1030, + "SETFCAP": 1031, + "MAC_OVERRIDE": 1032, + "MAC_ADMIN": 1033, + "SYSLOG": 1034, + "WAKE_ALARM": 1035, + "BLOCK_SUSPEND": 1036, + "AUDIT_READ": 1037, +} + +func (x CapabilityInfo_Capability) Enum() *CapabilityInfo_Capability { + p := new(CapabilityInfo_Capability) + *p = x + return p +} +func (x CapabilityInfo_Capability) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(CapabilityInfo_Capability_name, int32(x)) +} +func (x *CapabilityInfo_Capability) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(CapabilityInfo_Capability_value, data, "CapabilityInfo_Capability") + if err != nil { + return err + } + *x = CapabilityInfo_Capability(value) + return nil +} +func (CapabilityInfo_Capability) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{65, 0} +} + +type RLimitInfo_RLimit_Type int32 + +const ( + RLimitInfo_RLimit_UNKNOWN RLimitInfo_RLimit_Type = 0 + RLimitInfo_RLimit_RLMT_AS RLimitInfo_RLimit_Type = 1 + RLimitInfo_RLimit_RLMT_CORE RLimitInfo_RLimit_Type = 2 + RLimitInfo_RLimit_RLMT_CPU RLimitInfo_RLimit_Type = 3 + RLimitInfo_RLimit_RLMT_DATA RLimitInfo_RLimit_Type = 4 + RLimitInfo_RLimit_RLMT_FSIZE RLimitInfo_RLimit_Type = 5 + RLimitInfo_RLimit_RLMT_LOCKS RLimitInfo_RLimit_Type = 6 + RLimitInfo_RLimit_RLMT_MEMLOCK RLimitInfo_RLimit_Type = 7 + RLimitInfo_RLimit_RLMT_MSGQUEUE RLimitInfo_RLimit_Type = 8 + RLimitInfo_RLimit_RLMT_NICE RLimitInfo_RLimit_Type = 9 + RLimitInfo_RLimit_RLMT_NOFILE RLimitInfo_RLimit_Type = 10 + RLimitInfo_RLimit_RLMT_NPROC RLimitInfo_RLimit_Type = 11 + RLimitInfo_RLimit_RLMT_RSS RLimitInfo_RLimit_Type = 12 + RLimitInfo_RLimit_RLMT_RTPRIO RLimitInfo_RLimit_Type = 13 + RLimitInfo_RLimit_RLMT_RTTIME RLimitInfo_RLimit_Type = 14 + RLimitInfo_RLimit_RLMT_SIGPENDING RLimitInfo_RLimit_Type = 15 + RLimitInfo_RLimit_RLMT_STACK RLimitInfo_RLimit_Type = 16 +) + +var RLimitInfo_RLimit_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "RLMT_AS", + 2: "RLMT_CORE", + 3: "RLMT_CPU", + 4: "RLMT_DATA", + 5: "RLMT_FSIZE", + 6: "RLMT_LOCKS", + 7: "RLMT_MEMLOCK", + 8: "RLMT_MSGQUEUE", + 9: "RLMT_NICE", + 10: "RLMT_NOFILE", + 11: "RLMT_NPROC", + 12: "RLMT_RSS", + 13: "RLMT_RTPRIO", + 14: "RLMT_RTTIME", + 15: "RLMT_SIGPENDING", + 16: "RLMT_STACK", +} +var RLimitInfo_RLimit_Type_value = map[string]int32{ + "UNKNOWN": 0, + "RLMT_AS": 1, + "RLMT_CORE": 2, + "RLMT_CPU": 3, + "RLMT_DATA": 4, + "RLMT_FSIZE": 5, + "RLMT_LOCKS": 6, + "RLMT_MEMLOCK": 7, + "RLMT_MSGQUEUE": 8, + "RLMT_NICE": 9, + "RLMT_NOFILE": 10, + "RLMT_NPROC": 11, + "RLMT_RSS": 12, + "RLMT_RTPRIO": 13, + "RLMT_RTTIME": 14, + "RLMT_SIGPENDING": 15, + "RLMT_STACK": 16, +} + +func (x RLimitInfo_RLimit_Type) Enum() *RLimitInfo_RLimit_Type { + p := new(RLimitInfo_RLimit_Type) + *p = x + return p +} +func (x RLimitInfo_RLimit_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(RLimitInfo_RLimit_Type_name, int32(x)) +} +func (x *RLimitInfo_RLimit_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RLimitInfo_RLimit_Type_value, data, "RLimitInfo_RLimit_Type") + if err != nil { + return err + } + *x = RLimitInfo_RLimit_Type(value) + return nil +} +func (RLimitInfo_RLimit_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{67, 0, 0} +} + +// All container implementation types. +type ContainerInfo_Type int32 + +const ( + ContainerInfo_DOCKER ContainerInfo_Type = 1 + ContainerInfo_MESOS ContainerInfo_Type = 2 +) + +var ContainerInfo_Type_name = map[int32]string{ + 1: "DOCKER", + 2: "MESOS", +} +var ContainerInfo_Type_value = map[string]int32{ + "DOCKER": 1, + "MESOS": 2, +} + +func (x ContainerInfo_Type) Enum() *ContainerInfo_Type { + p := new(ContainerInfo_Type) + *p = x + return p +} +func (x ContainerInfo_Type) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(ContainerInfo_Type_name, int32(x)) +} +func (x *ContainerInfo_Type) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ContainerInfo_Type_value, data, "ContainerInfo_Type") + if err != nil { + return err + } + *x = ContainerInfo_Type(value) + return nil +} +func (ContainerInfo_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptorMesos, []int{69, 0} } + +// Network options. +type ContainerInfo_DockerInfo_Network int32 + +const ( + ContainerInfo_DockerInfo_HOST ContainerInfo_DockerInfo_Network = 1 + ContainerInfo_DockerInfo_BRIDGE ContainerInfo_DockerInfo_Network = 2 + ContainerInfo_DockerInfo_NONE ContainerInfo_DockerInfo_Network = 3 + ContainerInfo_DockerInfo_USER ContainerInfo_DockerInfo_Network = 4 +) + +var ContainerInfo_DockerInfo_Network_name = map[int32]string{ + 1: "HOST", + 2: "BRIDGE", + 3: "NONE", + 4: "USER", +} +var ContainerInfo_DockerInfo_Network_value = map[string]int32{ + "HOST": 1, + "BRIDGE": 2, + "NONE": 3, + "USER": 4, +} + +func (x ContainerInfo_DockerInfo_Network) Enum() *ContainerInfo_DockerInfo_Network { + p := new(ContainerInfo_DockerInfo_Network) + *p = x + return p +} +func (x ContainerInfo_DockerInfo_Network) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(ContainerInfo_DockerInfo_Network_name, int32(x)) +} +func (x *ContainerInfo_DockerInfo_Network) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ContainerInfo_DockerInfo_Network_value, data, "ContainerInfo_DockerInfo_Network") + if err != nil { + return err + } + *x = ContainerInfo_DockerInfo_Network(value) + return nil +} +func (ContainerInfo_DockerInfo_Network) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{69, 0, 0} +} + +type CgroupInfo_Blkio_Operation int32 + +const ( + CgroupInfo_Blkio_UNKNOWN CgroupInfo_Blkio_Operation = 0 + CgroupInfo_Blkio_TOTAL CgroupInfo_Blkio_Operation = 1 + CgroupInfo_Blkio_READ CgroupInfo_Blkio_Operation = 2 + CgroupInfo_Blkio_WRITE CgroupInfo_Blkio_Operation = 3 + CgroupInfo_Blkio_SYNC CgroupInfo_Blkio_Operation = 4 + CgroupInfo_Blkio_ASYNC CgroupInfo_Blkio_Operation = 5 +) + +var CgroupInfo_Blkio_Operation_name = map[int32]string{ + 0: "UNKNOWN", + 1: "TOTAL", + 2: "READ", + 3: "WRITE", + 4: "SYNC", + 5: "ASYNC", +} +var CgroupInfo_Blkio_Operation_value = map[string]int32{ + "UNKNOWN": 0, + "TOTAL": 1, + "READ": 2, + "WRITE": 3, + "SYNC": 4, + "ASYNC": 5, +} + +func (x CgroupInfo_Blkio_Operation) Enum() *CgroupInfo_Blkio_Operation { + p := new(CgroupInfo_Blkio_Operation) + *p = x + return p +} +func (x CgroupInfo_Blkio_Operation) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(CgroupInfo_Blkio_Operation_name, int32(x)) +} +func (x *CgroupInfo_Blkio_Operation) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(CgroupInfo_Blkio_Operation_value, data, "CgroupInfo_Blkio_Operation") + if err != nil { + return err + } + *x = CgroupInfo_Blkio_Operation(value) + return nil +} +func (CgroupInfo_Blkio_Operation) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{71, 0, 0} +} + +type DiscoveryInfo_Visibility int32 + +const ( + FRAMEWORK DiscoveryInfo_Visibility = 0 + CLUSTER DiscoveryInfo_Visibility = 1 + EXTERNAL DiscoveryInfo_Visibility = 2 +) + +var DiscoveryInfo_Visibility_name = map[int32]string{ + 0: "FRAMEWORK", + 1: "CLUSTER", + 2: "EXTERNAL", +} +var DiscoveryInfo_Visibility_value = map[string]int32{ + "FRAMEWORK": 0, + "CLUSTER": 1, + "EXTERNAL": 2, +} + +func (x DiscoveryInfo_Visibility) Enum() *DiscoveryInfo_Visibility { + p := new(DiscoveryInfo_Visibility) + *p = x + return p +} +func (x DiscoveryInfo_Visibility) MarshalJSON() ([]byte, error) { + return proto.MarshalJSONEnum(DiscoveryInfo_Visibility_name, int32(x)) +} +func (x *DiscoveryInfo_Visibility) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(DiscoveryInfo_Visibility_value, data, "DiscoveryInfo_Visibility") + if err != nil { + return err + } + *x = DiscoveryInfo_Visibility(value) + return nil +} +func (DiscoveryInfo_Visibility) EnumDescriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{76, 0} +} + +// * +// A unique ID assigned to a framework. A framework can reuse this ID +// in order to do failover (see MesosSchedulerDriver). +type FrameworkID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *FrameworkID) Reset() { *m = FrameworkID{} } +func (*FrameworkID) ProtoMessage() {} +func (*FrameworkID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{0} } + +func (m *FrameworkID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// A unique ID assigned to an offer. +type OfferID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *OfferID) Reset() { *m = OfferID{} } +func (*OfferID) ProtoMessage() {} +func (*OfferID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{1} } + +func (m *OfferID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// A unique ID assigned to an agent. Currently, an agent gets a new ID +// whenever it (re)registers with Mesos. Framework writers shouldn't +// assume any binding between an agent ID and and a hostname. +type AgentID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *AgentID) Reset() { *m = AgentID{} } +func (*AgentID) ProtoMessage() {} +func (*AgentID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{2} } + +func (m *AgentID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// A framework-generated ID to distinguish a task. The ID must remain +// unique while the task is active. A framework can reuse an ID _only_ +// if the previous task with the same ID has reached a terminal state +// (e.g., TASK_FINISHED, TASK_KILLED, etc.). However, reusing task IDs +// is strongly discouraged (MESOS-2198). +type TaskID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *TaskID) Reset() { *m = TaskID{} } +func (*TaskID) ProtoMessage() {} +func (*TaskID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{3} } + +func (m *TaskID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// A framework-generated ID to distinguish an executor. Only one +// executor with the same ID can be active on the same agent at a +// time. However, reusing executor IDs is discouraged. +type ExecutorID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *ExecutorID) Reset() { *m = ExecutorID{} } +func (*ExecutorID) ProtoMessage() {} +func (*ExecutorID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{4} } + +func (m *ExecutorID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// ID used to uniquely identify a container. If the `parent` is not +// specified, the ID is a UUID generated by the agent to uniquely +// identify the container of an executor run. If the `parent` field is +// specified, it represents a nested container. +type ContainerID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` + Parent *ContainerID `protobuf:"bytes,2,opt,name=parent" json:"parent,omitempty"` +} + +func (m *ContainerID) Reset() { *m = ContainerID{} } +func (*ContainerID) ProtoMessage() {} +func (*ContainerID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{5} } + +func (m *ContainerID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *ContainerID) GetParent() *ContainerID { + if m != nil { + return m.Parent + } + return nil +} + +// * +// A unique ID assigned to a resource provider. Currently, a resource +// provider gets a new ID whenever it (re)registers with Mesos. +type ResourceProviderID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *ResourceProviderID) Reset() { *m = ResourceProviderID{} } +func (*ResourceProviderID) ProtoMessage() {} +func (*ResourceProviderID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{6} } + +func (m *ResourceProviderID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// A framework-generated ID to distinguish an operation. The ID +// must be unique within the framework. +type OperationID struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *OperationID) Reset() { *m = OperationID{} } +func (*OperationID) ProtoMessage() {} +func (*OperationID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{7} } + +func (m *OperationID) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// Represents time since the epoch, in nanoseconds. +type TimeInfo struct { + Nanoseconds int64 `protobuf:"varint,1,req,name=nanoseconds" json:"nanoseconds"` +} + +func (m *TimeInfo) Reset() { *m = TimeInfo{} } +func (*TimeInfo) ProtoMessage() {} +func (*TimeInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{8} } + +func (m *TimeInfo) GetNanoseconds() int64 { + if m != nil { + return m.Nanoseconds + } + return 0 +} + +// * +// Represents duration in nanoseconds. +type DurationInfo struct { + Nanoseconds int64 `protobuf:"varint,1,req,name=nanoseconds" json:"nanoseconds"` +} + +func (m *DurationInfo) Reset() { *m = DurationInfo{} } +func (*DurationInfo) ProtoMessage() {} +func (*DurationInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{9} } + +func (m *DurationInfo) GetNanoseconds() int64 { + if m != nil { + return m.Nanoseconds + } + return 0 +} + +// * +// A network address. +// +// TODO(bmahler): Use this more widely. +type Address struct { + // May contain a hostname, IP address, or both. + Hostname *string `protobuf:"bytes,1,opt,name=hostname" json:"hostname,omitempty"` + IP *string `protobuf:"bytes,2,opt,name=ip" json:"ip,omitempty"` + Port int32 `protobuf:"varint,3,req,name=port" json:"port"` +} + +func (m *Address) Reset() { *m = Address{} } +func (*Address) ProtoMessage() {} +func (*Address) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{10} } + +func (m *Address) GetHostname() string { + if m != nil && m.Hostname != nil { + return *m.Hostname + } + return "" +} + +func (m *Address) GetIP() string { + if m != nil && m.IP != nil { + return *m.IP + } + return "" +} + +func (m *Address) GetPort() int32 { + if m != nil { + return m.Port + } + return 0 +} + +// * +// Represents a URL. +type URL struct { + Scheme string `protobuf:"bytes,1,req,name=scheme" json:"scheme"` + Address Address `protobuf:"bytes,2,req,name=address" json:"address"` + Path *string `protobuf:"bytes,3,opt,name=path" json:"path,omitempty"` + Query []Parameter `protobuf:"bytes,4,rep,name=query" json:"query"` + Fragment *string `protobuf:"bytes,5,opt,name=fragment" json:"fragment,omitempty"` +} + +func (m *URL) Reset() { *m = URL{} } +func (*URL) ProtoMessage() {} +func (*URL) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{11} } + +func (m *URL) GetScheme() string { + if m != nil { + return m.Scheme + } + return "" +} + +func (m *URL) GetAddress() Address { + if m != nil { + return m.Address + } + return Address{} +} + +func (m *URL) GetPath() string { + if m != nil && m.Path != nil { + return *m.Path + } + return "" +} + +func (m *URL) GetQuery() []Parameter { + if m != nil { + return m.Query + } + return nil +} + +func (m *URL) GetFragment() string { + if m != nil && m.Fragment != nil { + return *m.Fragment + } + return "" +} + +// * +// Represents an interval, from a given start time over a given duration. +// This interval pertains to an unavailability event, such as maintenance, +// and is not a generic interval. +type Unavailability struct { + Start TimeInfo `protobuf:"bytes,1,req,name=start" json:"start"` + // When added to `start`, this represents the end of the interval. + // If unspecified, the duration is assumed to be infinite. + Duration *DurationInfo `protobuf:"bytes,2,opt,name=duration" json:"duration,omitempty"` +} + +func (m *Unavailability) Reset() { *m = Unavailability{} } +func (*Unavailability) ProtoMessage() {} +func (*Unavailability) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{12} } + +func (m *Unavailability) GetStart() TimeInfo { + if m != nil { + return m.Start + } + return TimeInfo{} +} + +func (m *Unavailability) GetDuration() *DurationInfo { + if m != nil { + return m.Duration + } + return nil +} + +// * +// Represents a single machine, which may hold one or more agents. +// +// NOTE: In order to match an agent to a machine, both the `hostname` and +// `ip` must match the values advertised by the agent to the master. +// Hostname is not case-sensitive. +type MachineID struct { + Hostname *string `protobuf:"bytes,1,opt,name=hostname" json:"hostname,omitempty"` + IP *string `protobuf:"bytes,2,opt,name=ip" json:"ip,omitempty"` +} + +func (m *MachineID) Reset() { *m = MachineID{} } +func (*MachineID) ProtoMessage() {} +func (*MachineID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{13} } + +func (m *MachineID) GetHostname() string { + if m != nil && m.Hostname != nil { + return *m.Hostname + } + return "" +} + +func (m *MachineID) GetIP() string { + if m != nil && m.IP != nil { + return *m.IP + } + return "" +} + +// * +// Holds information about a single machine, its `mode`, and any other +// relevant information which may affect the behavior of the machine. +type MachineInfo struct { + ID MachineID `protobuf:"bytes,1,req,name=id" json:"id"` + Mode *MachineInfo_Mode `protobuf:"varint,2,opt,name=mode,enum=mesos.MachineInfo_Mode" json:"mode,omitempty"` + // Signifies that the machine may be unavailable during the given interval. + // See comments in `Unavailability` and for the `unavailability` fields + // in `Offer` and `InverseOffer` for more information. + Unavailability *Unavailability `protobuf:"bytes,3,opt,name=unavailability" json:"unavailability,omitempty"` +} + +func (m *MachineInfo) Reset() { *m = MachineInfo{} } +func (*MachineInfo) ProtoMessage() {} +func (*MachineInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{14} } + +func (m *MachineInfo) GetID() MachineID { + if m != nil { + return m.ID + } + return MachineID{} +} + +func (m *MachineInfo) GetMode() MachineInfo_Mode { + if m != nil && m.Mode != nil { + return *m.Mode + } + return UP +} + +func (m *MachineInfo) GetUnavailability() *Unavailability { + if m != nil { + return m.Unavailability + } + return nil +} + +// * +// Describes a framework. +type FrameworkInfo struct { + // Used to determine the Unix user that an executor or task should be + // launched as. + // + // When using the MesosSchedulerDriver, if the field is set to an + // empty string, it will automagically set it to the current user. + // + // When using the HTTP Scheduler API, the user has to be set + // explicitly. + User string `protobuf:"bytes,1,req,name=user" json:"user"` + // Name of the framework that shows up in the Mesos Web UI. + Name string `protobuf:"bytes,2,req,name=name" json:"name"` + // Note that 'id' is only available after a framework has + // registered, however, it is included here in order to facilitate + // scheduler failover (i.e., if it is set then the + // MesosSchedulerDriver expects the scheduler is performing + // failover). + ID *FrameworkID `protobuf:"bytes,3,opt,name=id" json:"id,omitempty"` + // The amount of time (in seconds) that the master will wait for the + // scheduler to failover before it tears down the framework by + // killing all its tasks/executors. This should be non-zero if a + // framework expects to reconnect after a failure and not lose its + // tasks/executors. + // + // NOTE: To avoid accidental destruction of tasks, production + // frameworks typically set this to a large value (e.g., 1 week). + FailoverTimeout *float64 `protobuf:"fixed64,4,opt,name=failover_timeout,json=failoverTimeout,def=0" json:"failover_timeout,omitempty"` + // If set, agents running tasks started by this framework will write + // the framework pid, executor pids and status updates to disk. If + // the agent exits (e.g., due to a crash or as part of upgrading + // Mesos), this checkpointed data allows the restarted agent to + // reconnect to executors that were started by the old instance of + // the agent. Enabling checkpointing improves fault tolerance, at + // the cost of a (usually small) increase in disk I/O. + Checkpoint *bool `protobuf:"varint,5,opt,name=checkpoint,def=0" json:"checkpoint,omitempty"` + // Roles are the entities to which allocations are made. + // The framework must have at least one role in order to + // be offered resources. Note that `role` is deprecated + // in favor of `roles` and only one of these fields must + // be used. Since we cannot distinguish between empty + // `roles` and the default unset `role`, we require that + // frameworks set the `MULTI_ROLE` capability if + // setting the `roles` field. + Role *string `protobuf:"bytes,6,opt,name=role,def=*" json:"role,omitempty"` + Roles []string `protobuf:"bytes,12,rep,name=roles" json:"roles,omitempty"` + // Used to indicate the current host from which the scheduler is + // registered in the Mesos Web UI. If set to an empty string Mesos + // will automagically set it to the current hostname if one is + // available. + Hostname *string `protobuf:"bytes,7,opt,name=hostname" json:"hostname,omitempty"` + // This field should match the credential's principal the framework + // uses for authentication. This field is used for framework API + // rate limiting and dynamic reservations. It should be set even + // if authentication is not enabled if these features are desired. + Principal *string `protobuf:"bytes,8,opt,name=principal" json:"principal,omitempty"` + // This field allows a framework to advertise its web UI, so that + // the Mesos web UI can link to it. It is expected to be a full URL, + // for example http://my-scheduler.example.com:8080/. + WebUiURL *string `protobuf:"bytes,9,opt,name=webui_url,json=webuiUrl" json:"webui_url,omitempty"` + // This field allows a framework to advertise its set of + // capabilities (e.g., ability to receive offers for revocable + // resources). + Capabilities []FrameworkInfo_Capability `protobuf:"bytes,10,rep,name=capabilities" json:"capabilities"` + // Labels are free-form key value pairs supplied by the framework + // scheduler (e.g., to describe additional functionality offered by + // the framework). These labels are not interpreted by Mesos itself. + // Labels should not contain duplicate key-value pairs. + Labels *Labels `protobuf:"bytes,11,opt,name=labels" json:"labels,omitempty"` +} + +func (m *FrameworkInfo) Reset() { *m = FrameworkInfo{} } +func (*FrameworkInfo) ProtoMessage() {} +func (*FrameworkInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{15} } + +const Default_FrameworkInfo_FailoverTimeout float64 = 0 +const Default_FrameworkInfo_Checkpoint bool = false +const Default_FrameworkInfo_Role string = "*" + +func (m *FrameworkInfo) GetUser() string { + if m != nil { + return m.User + } + return "" +} + +func (m *FrameworkInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *FrameworkInfo) GetID() *FrameworkID { + if m != nil { + return m.ID + } + return nil +} + +func (m *FrameworkInfo) GetFailoverTimeout() float64 { + if m != nil && m.FailoverTimeout != nil { + return *m.FailoverTimeout + } + return Default_FrameworkInfo_FailoverTimeout +} + +func (m *FrameworkInfo) GetCheckpoint() bool { + if m != nil && m.Checkpoint != nil { + return *m.Checkpoint + } + return Default_FrameworkInfo_Checkpoint +} + +func (m *FrameworkInfo) GetRole() string { + if m != nil && m.Role != nil { + return *m.Role + } + return Default_FrameworkInfo_Role +} + +func (m *FrameworkInfo) GetRoles() []string { + if m != nil { + return m.Roles + } + return nil +} + +func (m *FrameworkInfo) GetHostname() string { + if m != nil && m.Hostname != nil { + return *m.Hostname + } + return "" +} + +func (m *FrameworkInfo) GetPrincipal() string { + if m != nil && m.Principal != nil { + return *m.Principal + } + return "" +} + +func (m *FrameworkInfo) GetWebUiURL() string { + if m != nil && m.WebUiURL != nil { + return *m.WebUiURL + } + return "" +} + +func (m *FrameworkInfo) GetCapabilities() []FrameworkInfo_Capability { + if m != nil { + return m.Capabilities + } + return nil +} + +func (m *FrameworkInfo) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +type FrameworkInfo_Capability struct { + // Enum fields should be optional, see: MESOS-4997. + Type FrameworkInfo_Capability_Type `protobuf:"varint,1,opt,name=type,enum=mesos.FrameworkInfo_Capability_Type" json:"type"` +} + +func (m *FrameworkInfo_Capability) Reset() { *m = FrameworkInfo_Capability{} } +func (*FrameworkInfo_Capability) ProtoMessage() {} +func (*FrameworkInfo_Capability) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{15, 0} +} + +func (m *FrameworkInfo_Capability) GetType() FrameworkInfo_Capability_Type { + if m != nil { + return m.Type + } + return FrameworkInfo_Capability_UNKNOWN +} + +// * +// Describes a general non-interpreting non-killing check for a task or +// executor (or any arbitrary process/command). A type is picked by +// specifying one of the optional fields. Specifying more than one type +// is an error. +// +// NOTE: This API is subject to change and the related feature is experimental. +type CheckInfo struct { + // The type of the check. + Type CheckInfo_Type `protobuf:"varint,1,opt,name=type,enum=mesos.CheckInfo_Type" json:"type"` + // Command check. + Command *CheckInfo_Command `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"` + // HTTP check. + HTTP *CheckInfo_Http `protobuf:"bytes,3,opt,name=http" json:"http,omitempty"` + // TCP check. + TCP *CheckInfo_Tcp `protobuf:"bytes,7,opt,name=tcp" json:"tcp,omitempty"` + // Amount of time to wait to start checking the task after it + // transitions to `TASK_RUNNING` or `TASK_STARTING` if the latter + // is used by the executor. + DelaySeconds *float64 `protobuf:"fixed64,4,opt,name=delay_seconds,json=delaySeconds,def=15" json:"delay_seconds,omitempty"` + // Interval between check attempts, i.e., amount of time to wait after + // the previous check finished or timed out to start the next check. + IntervalSeconds *float64 `protobuf:"fixed64,5,opt,name=interval_seconds,json=intervalSeconds,def=10" json:"interval_seconds,omitempty"` + // Amount of time to wait for the check to complete. Zero means infinite + // timeout. + // + // After this timeout, the check attempt is aborted and no result is + // reported. Note that this may be considered a state change and hence + // may trigger a check status change delivery to the corresponding + // scheduler. See `CheckStatusInfo` for more details. + TimeoutSeconds *float64 `protobuf:"fixed64,6,opt,name=timeout_seconds,json=timeoutSeconds,def=20" json:"timeout_seconds,omitempty"` +} + +func (m *CheckInfo) Reset() { *m = CheckInfo{} } +func (*CheckInfo) ProtoMessage() {} +func (*CheckInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{16} } + +const Default_CheckInfo_DelaySeconds float64 = 15 +const Default_CheckInfo_IntervalSeconds float64 = 10 +const Default_CheckInfo_TimeoutSeconds float64 = 20 + +func (m *CheckInfo) GetType() CheckInfo_Type { + if m != nil { + return m.Type + } + return CheckInfo_UNKNOWN +} + +func (m *CheckInfo) GetCommand() *CheckInfo_Command { + if m != nil { + return m.Command + } + return nil +} + +func (m *CheckInfo) GetHTTP() *CheckInfo_Http { + if m != nil { + return m.HTTP + } + return nil +} + +func (m *CheckInfo) GetTCP() *CheckInfo_Tcp { + if m != nil { + return m.TCP + } + return nil +} + +func (m *CheckInfo) GetDelaySeconds() float64 { + if m != nil && m.DelaySeconds != nil { + return *m.DelaySeconds + } + return Default_CheckInfo_DelaySeconds +} + +func (m *CheckInfo) GetIntervalSeconds() float64 { + if m != nil && m.IntervalSeconds != nil { + return *m.IntervalSeconds + } + return Default_CheckInfo_IntervalSeconds +} + +func (m *CheckInfo) GetTimeoutSeconds() float64 { + if m != nil && m.TimeoutSeconds != nil { + return *m.TimeoutSeconds + } + return Default_CheckInfo_TimeoutSeconds +} + +// Describes a command check. If applicable, enters mount and/or network +// namespaces of the task. +type CheckInfo_Command struct { + Command CommandInfo `protobuf:"bytes,1,req,name=command" json:"command"` +} + +func (m *CheckInfo_Command) Reset() { *m = CheckInfo_Command{} } +func (*CheckInfo_Command) ProtoMessage() {} +func (*CheckInfo_Command) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{16, 0} } + +func (m *CheckInfo_Command) GetCommand() CommandInfo { + if m != nil { + return m.Command + } + return CommandInfo{} +} + +// Describes an HTTP check. Sends a GET request to +// http://:port/path. Note that is not configurable and is +// resolved automatically to 127.0.0.1. +type CheckInfo_Http struct { + // Port to send the HTTP request. + Port uint32 `protobuf:"varint,1,req,name=port" json:"port"` + // HTTP request path. + Path *string `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"` +} + +func (m *CheckInfo_Http) Reset() { *m = CheckInfo_Http{} } +func (*CheckInfo_Http) ProtoMessage() {} +func (*CheckInfo_Http) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{16, 1} } + +func (m *CheckInfo_Http) GetPort() uint32 { + if m != nil { + return m.Port + } + return 0 +} + +func (m *CheckInfo_Http) GetPath() string { + if m != nil && m.Path != nil { + return *m.Path + } + return "" +} + +// Describes a TCP check, i.e. based on establishing a TCP connection to +// the specified port. Note that is not configurable and is resolved +// automatically to 127.0.0.1. +type CheckInfo_Tcp struct { + Port uint32 `protobuf:"varint,1,req,name=port" json:"port"` +} + +func (m *CheckInfo_Tcp) Reset() { *m = CheckInfo_Tcp{} } +func (*CheckInfo_Tcp) ProtoMessage() {} +func (*CheckInfo_Tcp) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{16, 2} } + +func (m *CheckInfo_Tcp) GetPort() uint32 { + if m != nil { + return m.Port + } + return 0 +} + +// * +// Describes a health check for a task or executor (or any arbitrary +// process/command). A type is picked by specifying one of the +// optional fields. Specifying more than one type is an error. +type HealthCheck struct { + // Amount of time to wait to start health checking the task after it + // transitions to `TASK_RUNNING` or `TASK_STATING` if the latter is + // used by the executor. + DelaySeconds *float64 `protobuf:"fixed64,2,opt,name=delay_seconds,json=delaySeconds,def=15" json:"delay_seconds,omitempty"` + // Interval between health checks, i.e., amount of time to wait after + // the previous health check finished or timed out to start the next + // health check. + IntervalSeconds *float64 `protobuf:"fixed64,3,opt,name=interval_seconds,json=intervalSeconds,def=10" json:"interval_seconds,omitempty"` + // Amount of time to wait for the health check to complete. After this + // timeout, the health check is aborted and treated as a failure. Zero + // means infinite timeout. + TimeoutSeconds *float64 `protobuf:"fixed64,4,opt,name=timeout_seconds,json=timeoutSeconds,def=20" json:"timeout_seconds,omitempty"` + // Number of consecutive failures until the task is killed by the executor. + ConsecutiveFailures *uint32 `protobuf:"varint,5,opt,name=consecutive_failures,json=consecutiveFailures,def=3" json:"consecutive_failures,omitempty"` + // Amount of time after the task is launched during which health check + // failures are ignored. Once a check succeeds for the first time, + // the grace period does not apply anymore. Note that it includes + // `delay_seconds`, i.e., setting `grace_period_seconds` < `delay_seconds` + // has no effect. + GracePeriodSeconds *float64 `protobuf:"fixed64,6,opt,name=grace_period_seconds,json=gracePeriodSeconds,def=10" json:"grace_period_seconds,omitempty"` + // The type of health check. + Type HealthCheck_Type `protobuf:"varint,8,opt,name=type,enum=mesos.HealthCheck_Type" json:"type"` + // Command health check. + Command *CommandInfo `protobuf:"bytes,7,opt,name=command" json:"command,omitempty"` + // HTTP health check. + HTTP *HealthCheck_HTTPCheckInfo `protobuf:"bytes,1,opt,name=http" json:"http,omitempty"` + // TCP health check. + TCP *HealthCheck_TCPCheckInfo `protobuf:"bytes,9,opt,name=tcp" json:"tcp,omitempty"` +} + +func (m *HealthCheck) Reset() { *m = HealthCheck{} } +func (*HealthCheck) ProtoMessage() {} +func (*HealthCheck) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{17} } + +const Default_HealthCheck_DelaySeconds float64 = 15 +const Default_HealthCheck_IntervalSeconds float64 = 10 +const Default_HealthCheck_TimeoutSeconds float64 = 20 +const Default_HealthCheck_ConsecutiveFailures uint32 = 3 +const Default_HealthCheck_GracePeriodSeconds float64 = 10 + +func (m *HealthCheck) GetDelaySeconds() float64 { + if m != nil && m.DelaySeconds != nil { + return *m.DelaySeconds + } + return Default_HealthCheck_DelaySeconds +} + +func (m *HealthCheck) GetIntervalSeconds() float64 { + if m != nil && m.IntervalSeconds != nil { + return *m.IntervalSeconds + } + return Default_HealthCheck_IntervalSeconds +} + +func (m *HealthCheck) GetTimeoutSeconds() float64 { + if m != nil && m.TimeoutSeconds != nil { + return *m.TimeoutSeconds + } + return Default_HealthCheck_TimeoutSeconds +} + +func (m *HealthCheck) GetConsecutiveFailures() uint32 { + if m != nil && m.ConsecutiveFailures != nil { + return *m.ConsecutiveFailures + } + return Default_HealthCheck_ConsecutiveFailures +} + +func (m *HealthCheck) GetGracePeriodSeconds() float64 { + if m != nil && m.GracePeriodSeconds != nil { + return *m.GracePeriodSeconds + } + return Default_HealthCheck_GracePeriodSeconds +} + +func (m *HealthCheck) GetType() HealthCheck_Type { + if m != nil { + return m.Type + } + return HealthCheck_UNKNOWN +} + +func (m *HealthCheck) GetCommand() *CommandInfo { + if m != nil { + return m.Command + } + return nil +} + +func (m *HealthCheck) GetHTTP() *HealthCheck_HTTPCheckInfo { + if m != nil { + return m.HTTP + } + return nil +} + +func (m *HealthCheck) GetTCP() *HealthCheck_TCPCheckInfo { + if m != nil { + return m.TCP + } + return nil +} + +// Describes an HTTP health check. Sends a GET request to +// scheme://:port/path. Note that is not configurable and is +// resolved automatically, in most cases to 127.0.0.1. Default executors +// treat return codes between 200 and 399 as success; custom executors +// may employ a different strategy, e.g. leveraging the `statuses` field. +type HealthCheck_HTTPCheckInfo struct { + Protocol *NetworkInfo_Protocol `protobuf:"varint,5,opt,name=protocol,enum=mesos.NetworkInfo_Protocol,def=1" json:"protocol,omitempty"` + // Currently "http" and "https" are supported. + Scheme *string `protobuf:"bytes,3,opt,name=scheme" json:"scheme,omitempty"` + // Port to send the HTTP request. + Port uint32 `protobuf:"varint,1,req,name=port" json:"port"` + // HTTP request path. + Path *string `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"` + // NOTE: It is up to the custom executor to interpret and act on this + // field. Setting this field has no effect on the default executors. + // + // TODO(haosdent): Deprecate this field when we add better support for + // success and possibly failure statuses, e.g. ranges of success and + // failure statuses. + Statuses []uint32 `protobuf:"varint,4,rep,name=statuses" json:"statuses,omitempty"` +} + +func (m *HealthCheck_HTTPCheckInfo) Reset() { *m = HealthCheck_HTTPCheckInfo{} } +func (*HealthCheck_HTTPCheckInfo) ProtoMessage() {} +func (*HealthCheck_HTTPCheckInfo) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{17, 0} +} + +const Default_HealthCheck_HTTPCheckInfo_Protocol NetworkInfo_Protocol = IPv4 + +func (m *HealthCheck_HTTPCheckInfo) GetProtocol() NetworkInfo_Protocol { + if m != nil && m.Protocol != nil { + return *m.Protocol + } + return Default_HealthCheck_HTTPCheckInfo_Protocol +} + +func (m *HealthCheck_HTTPCheckInfo) GetScheme() string { + if m != nil && m.Scheme != nil { + return *m.Scheme + } + return "" +} + +func (m *HealthCheck_HTTPCheckInfo) GetPort() uint32 { + if m != nil { + return m.Port + } + return 0 +} + +func (m *HealthCheck_HTTPCheckInfo) GetPath() string { + if m != nil && m.Path != nil { + return *m.Path + } + return "" +} + +func (m *HealthCheck_HTTPCheckInfo) GetStatuses() []uint32 { + if m != nil { + return m.Statuses + } + return nil +} + +// Describes a TCP health check, i.e. based on establishing +// a TCP connection to the specified port. +type HealthCheck_TCPCheckInfo struct { + Protocol *NetworkInfo_Protocol `protobuf:"varint,2,opt,name=protocol,enum=mesos.NetworkInfo_Protocol,def=1" json:"protocol,omitempty"` + // Port expected to be open. + Port uint32 `protobuf:"varint,1,req,name=port" json:"port"` +} + +func (m *HealthCheck_TCPCheckInfo) Reset() { *m = HealthCheck_TCPCheckInfo{} } +func (*HealthCheck_TCPCheckInfo) ProtoMessage() {} +func (*HealthCheck_TCPCheckInfo) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{17, 1} +} + +const Default_HealthCheck_TCPCheckInfo_Protocol NetworkInfo_Protocol = IPv4 + +func (m *HealthCheck_TCPCheckInfo) GetProtocol() NetworkInfo_Protocol { + if m != nil && m.Protocol != nil { + return *m.Protocol + } + return Default_HealthCheck_TCPCheckInfo_Protocol +} + +func (m *HealthCheck_TCPCheckInfo) GetPort() uint32 { + if m != nil { + return m.Port + } + return 0 +} + +// * +// Describes a kill policy for a task. Currently does not express +// different policies (e.g. hitting HTTP endpoints), only controls +// how long to wait between graceful and forcible task kill: +// +// graceful kill --------------> forcible kill +// grace_period +// +// Kill policies are best-effort, because machine failures / forcible +// terminations may occur. +// +// NOTE: For executor-less command-based tasks, the kill is performed +// via sending a signal to the task process: SIGTERM for the graceful +// kill and SIGKILL for the forcible kill. For the docker executor-less +// tasks the grace period is passed to 'docker stop --time'. +type KillPolicy struct { + // The grace period specifies how long to wait before forcibly + // killing the task. It is recommended to attempt to gracefully + // kill the task (and send TASK_KILLING) to indicate that the + // graceful kill is in progress. Once the grace period elapses, + // if the task has not terminated, a forcible kill should occur. + // The task should not assume that it will always be allotted + // the full grace period. For example, the executor may be + // shutdown more quickly by the agent, or failures / forcible + // terminations may occur. + GracePeriod *DurationInfo `protobuf:"bytes,1,opt,name=grace_period,json=gracePeriod" json:"grace_period,omitempty"` +} + +func (m *KillPolicy) Reset() { *m = KillPolicy{} } +func (*KillPolicy) ProtoMessage() {} +func (*KillPolicy) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{18} } + +func (m *KillPolicy) GetGracePeriod() *DurationInfo { + if m != nil { + return m.GracePeriod + } + return nil +} + +// * +// Describes a command, executed via: '/bin/sh -c value'. Any URIs specified +// are fetched before executing the command. If the executable field for an +// uri is set, executable file permission is set on the downloaded file. +// Otherwise, if the downloaded file has a recognized archive extension +// (currently [compressed] tar and zip) it is extracted into the executor's +// working directory. This extraction can be disabled by setting `extract` to +// false. In addition, any environment variables are set before executing +// the command (so they can be used to "parameterize" your command). +type CommandInfo struct { + URIs []CommandInfo_URI `protobuf:"bytes,1,rep,name=uris" json:"uris"` + Environment *Environment `protobuf:"bytes,2,opt,name=environment" json:"environment,omitempty"` + // There are two ways to specify the command: + // 1) If 'shell == true', the command will be launched via shell + // (i.e., /bin/sh -c 'value'). The 'value' specified will be + // treated as the shell command. The 'arguments' will be ignored. + // 2) If 'shell == false', the command will be launched by passing + // arguments to an executable. The 'value' specified will be + // treated as the filename of the executable. The 'arguments' + // will be treated as the arguments to the executable. This is + // similar to how POSIX exec families launch processes (i.e., + // execlp(value, arguments(0), arguments(1), ...)). + // NOTE: The field 'value' is changed from 'required' to 'optional' + // in 0.20.0. It will only cause issues if a new framework is + // connecting to an old master. + Shell *bool `protobuf:"varint,6,opt,name=shell,def=1" json:"shell,omitempty"` + Value *string `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` + Arguments []string `protobuf:"bytes,7,rep,name=arguments" json:"arguments,omitempty"` + // Enables executor and tasks to run as a specific user. If the user + // field is present both in FrameworkInfo and here, the CommandInfo + // user value takes precedence. + User *string `protobuf:"bytes,5,opt,name=user" json:"user,omitempty"` +} + +func (m *CommandInfo) Reset() { *m = CommandInfo{} } +func (*CommandInfo) ProtoMessage() {} +func (*CommandInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{19} } + +const Default_CommandInfo_Shell bool = true + +func (m *CommandInfo) GetURIs() []CommandInfo_URI { + if m != nil { + return m.URIs + } + return nil +} + +func (m *CommandInfo) GetEnvironment() *Environment { + if m != nil { + return m.Environment + } + return nil +} + +func (m *CommandInfo) GetShell() bool { + if m != nil && m.Shell != nil { + return *m.Shell + } + return Default_CommandInfo_Shell +} + +func (m *CommandInfo) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +func (m *CommandInfo) GetArguments() []string { + if m != nil { + return m.Arguments + } + return nil +} + +func (m *CommandInfo) GetUser() string { + if m != nil && m.User != nil { + return *m.User + } + return "" +} + +type CommandInfo_URI struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` + Executable *bool `protobuf:"varint,2,opt,name=executable" json:"executable,omitempty"` + // In case the fetched file is recognized as an archive, extract + // its contents into the sandbox. Note that a cached archive is + // not copied from the cache to the sandbox in case extraction + // originates from an archive in the cache. + Extract *bool `protobuf:"varint,3,opt,name=extract,def=1" json:"extract,omitempty"` + // If this field is "true", the fetcher cache will be used. If not, + // fetching bypasses the cache and downloads directly into the + // sandbox directory, no matter whether a suitable cache file is + // available or not. The former directs the fetcher to download to + // the file cache, then copy from there to the sandbox. Subsequent + // fetch attempts with the same URI will omit downloading and copy + // from the cache as long as the file is resident there. Cache files + // may get evicted at any time, which then leads to renewed + // downloading. See also "docs/fetcher.md" and + // "docs/fetcher-cache-internals.md". + Cache *bool `protobuf:"varint,4,opt,name=cache" json:"cache,omitempty"` + // The fetcher's default behavior is to use the URI string's basename to + // name the local copy. If this field is provided, the local copy will be + // named with its value instead. If there is a directory component (which + // must be a relative path), the local copy will be stored in that + // subdirectory inside the sandbox. + OutputFile *string `protobuf:"bytes,5,opt,name=output_file,json=outputFile" json:"output_file,omitempty"` +} + +func (m *CommandInfo_URI) Reset() { *m = CommandInfo_URI{} } +func (*CommandInfo_URI) ProtoMessage() {} +func (*CommandInfo_URI) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{19, 0} } + +const Default_CommandInfo_URI_Extract bool = true + +func (m *CommandInfo_URI) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *CommandInfo_URI) GetExecutable() bool { + if m != nil && m.Executable != nil { + return *m.Executable + } + return false +} + +func (m *CommandInfo_URI) GetExtract() bool { + if m != nil && m.Extract != nil { + return *m.Extract + } + return Default_CommandInfo_URI_Extract +} + +func (m *CommandInfo_URI) GetCache() bool { + if m != nil && m.Cache != nil { + return *m.Cache + } + return false +} + +func (m *CommandInfo_URI) GetOutputFile() string { + if m != nil && m.OutputFile != nil { + return *m.OutputFile + } + return "" +} + +// * +// Describes information about an executor. +type ExecutorInfo struct { + // For backwards compatibility, if this field is not set when using `LAUNCH` + // operation, Mesos will infer the type by checking if `command` is set + // (`CUSTOM`) or unset (`DEFAULT`). `type` must be set when using + // `LAUNCH_GROUP` operation. + // + // TODO(vinod): Add support for explicitly setting `type` to `DEFAULT` in + // `LAUNCH` operation. + Type ExecutorInfo_Type `protobuf:"varint,15,opt,name=type,enum=mesos.ExecutorInfo_Type" json:"type"` + ExecutorID ExecutorID `protobuf:"bytes,1,req,name=executor_id,json=executorId" json:"executor_id"` + FrameworkID *FrameworkID `protobuf:"bytes,8,opt,name=framework_id,json=frameworkId" json:"framework_id,omitempty"` + Command *CommandInfo `protobuf:"bytes,7,opt,name=command" json:"command,omitempty"` + // Executor provided with a container will launch the container + // with the executor's CommandInfo and we expect the container to + // act as a Mesos executor. + Container *ContainerInfo `protobuf:"bytes,11,opt,name=container" json:"container,omitempty"` + Resources []Resource `protobuf:"bytes,5,rep,name=resources" json:"resources"` + Name *string `protobuf:"bytes,9,opt,name=name" json:"name,omitempty"` + // 'source' is an identifier style string used by frameworks to + // track the source of an executor. This is useful when it's + // possible for different executor ids to be related semantically. + // + // NOTE: 'source' is exposed alongside the resource usage of the + // executor via JSON on the agent. This allows users to import usage + // information into a time series database for monitoring. + // + // This field is deprecated since 1.0. Please use labels for + // free-form metadata instead. + Source *string `protobuf:"bytes,10,opt,name=source" json:"source,omitempty"` + // This field can be used to pass arbitrary bytes to an executor. + Data []byte `protobuf:"bytes,4,opt,name=data" json:"data,omitempty"` + // Service discovery information for the executor. It is not + // interpreted or acted upon by Mesos. It is up to a service + // discovery system to use this information as needed and to handle + // executors without service discovery information. + Discovery *DiscoveryInfo `protobuf:"bytes,12,opt,name=discovery" json:"discovery,omitempty"` + // When shutting down an executor the agent will wait in a + // best-effort manner for the grace period specified here + // before forcibly destroying the container. The executor + // must not assume that it will always be allotted the full + // grace period, as the agent may decide to allot a shorter + // period and failures / forcible terminations may occur. + ShutdownGracePeriod *DurationInfo `protobuf:"bytes,13,opt,name=shutdown_grace_period,json=shutdownGracePeriod" json:"shutdown_grace_period,omitempty"` + // Labels are free-form key value pairs which are exposed through + // master and agent endpoints. Labels will not be interpreted or + // acted upon by Mesos itself. As opposed to the data field, labels + // will be kept in memory on master and agent processes. Therefore, + // labels should be used to tag executors with lightweight metadata. + // Labels should not contain duplicate key-value pairs. + Labels *Labels `protobuf:"bytes,14,opt,name=labels" json:"labels,omitempty"` +} + +func (m *ExecutorInfo) Reset() { *m = ExecutorInfo{} } +func (*ExecutorInfo) ProtoMessage() {} +func (*ExecutorInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{20} } + +func (m *ExecutorInfo) GetType() ExecutorInfo_Type { + if m != nil { + return m.Type + } + return ExecutorInfo_UNKNOWN +} + +func (m *ExecutorInfo) GetExecutorID() ExecutorID { + if m != nil { + return m.ExecutorID + } + return ExecutorID{} +} + +func (m *ExecutorInfo) GetFrameworkID() *FrameworkID { + if m != nil { + return m.FrameworkID + } + return nil +} + +func (m *ExecutorInfo) GetCommand() *CommandInfo { + if m != nil { + return m.Command + } + return nil +} + +func (m *ExecutorInfo) GetContainer() *ContainerInfo { + if m != nil { + return m.Container + } + return nil +} + +func (m *ExecutorInfo) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *ExecutorInfo) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *ExecutorInfo) GetSource() string { + if m != nil && m.Source != nil { + return *m.Source + } + return "" +} + +func (m *ExecutorInfo) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *ExecutorInfo) GetDiscovery() *DiscoveryInfo { + if m != nil { + return m.Discovery + } + return nil +} + +func (m *ExecutorInfo) GetShutdownGracePeriod() *DurationInfo { + if m != nil { + return m.ShutdownGracePeriod + } + return nil +} + +func (m *ExecutorInfo) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +// * +// Describes a domain. A domain is a collection of hosts that have +// similar characteristics. Mesos currently only supports "fault +// domains", which identify groups of hosts with similar failure +// characteristics. +// +// Frameworks can generally assume that network links between hosts in +// the same fault domain have lower latency, higher bandwidth, and better +// availability than network links between hosts in different domains. +// Schedulers may prefer to place network-intensive workloads in the +// same domain, as this may improve performance. Conversely, a single +// failure that affects a host in a domain may be more likely to +// affect other hosts in the same domain; hence, schedulers may prefer +// to place workloads that require high availability in multiple +// domains. (For example, all the hosts in a single rack might lose +// power or network connectivity simultaneously.) +// +// There are two kinds of fault domains: regions and zones. Regions +// offer the highest degree of fault isolation, but network latency +// between regions is typically high (typically >50 ms). Zones offer a +// modest degree of fault isolation along with reasonably low network +// latency (typically <10 ms). +// +// The mapping from fault domains to physical infrastructure is up to +// the operator to configure. In cloud environments, regions and zones +// can be mapped to the "region" and "availability zone" concepts +// exposed by most cloud providers, respectively. In on-premise +// deployments, regions and zones can be mapped to data centers and +// racks, respectively. +// +// Both masters and agents can be configured with domains. Frameworks +// can compare the domains of two hosts to determine if the hosts are +// in the same zone, in different zones in the same region, or in +// different regions. Note that all masters in a given Mesos cluster +// must be in the same region. +type DomainInfo struct { + FaultDomain *DomainInfo_FaultDomain `protobuf:"bytes,1,opt,name=fault_domain,json=faultDomain" json:"fault_domain,omitempty"` +} + +func (m *DomainInfo) Reset() { *m = DomainInfo{} } +func (*DomainInfo) ProtoMessage() {} +func (*DomainInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{21} } + +func (m *DomainInfo) GetFaultDomain() *DomainInfo_FaultDomain { + if m != nil { + return m.FaultDomain + } + return nil +} + +type DomainInfo_FaultDomain struct { + Region DomainInfo_FaultDomain_RegionInfo `protobuf:"bytes,1,req,name=region" json:"region"` + Zone DomainInfo_FaultDomain_ZoneInfo `protobuf:"bytes,2,req,name=zone" json:"zone"` +} + +func (m *DomainInfo_FaultDomain) Reset() { *m = DomainInfo_FaultDomain{} } +func (*DomainInfo_FaultDomain) ProtoMessage() {} +func (*DomainInfo_FaultDomain) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{21, 0} } + +func (m *DomainInfo_FaultDomain) GetRegion() DomainInfo_FaultDomain_RegionInfo { + if m != nil { + return m.Region + } + return DomainInfo_FaultDomain_RegionInfo{} +} + +func (m *DomainInfo_FaultDomain) GetZone() DomainInfo_FaultDomain_ZoneInfo { + if m != nil { + return m.Zone + } + return DomainInfo_FaultDomain_ZoneInfo{} +} + +type DomainInfo_FaultDomain_RegionInfo struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` +} + +func (m *DomainInfo_FaultDomain_RegionInfo) Reset() { *m = DomainInfo_FaultDomain_RegionInfo{} } +func (*DomainInfo_FaultDomain_RegionInfo) ProtoMessage() {} +func (*DomainInfo_FaultDomain_RegionInfo) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{21, 0, 0} +} + +func (m *DomainInfo_FaultDomain_RegionInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +type DomainInfo_FaultDomain_ZoneInfo struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` +} + +func (m *DomainInfo_FaultDomain_ZoneInfo) Reset() { *m = DomainInfo_FaultDomain_ZoneInfo{} } +func (*DomainInfo_FaultDomain_ZoneInfo) ProtoMessage() {} +func (*DomainInfo_FaultDomain_ZoneInfo) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{21, 0, 1} +} + +func (m *DomainInfo_FaultDomain_ZoneInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +// * +// Describes a master. This will probably have more fields in the +// future which might be used, for example, to link a framework webui +// to a master webui. +type MasterInfo struct { + ID string `protobuf:"bytes,1,req,name=id" json:"id"` + // The IP address (only IPv4) as a packed 4-bytes integer, + // stored in network order. Deprecated, use `address.ip` instead. + IP uint32 `protobuf:"varint,2,req,name=ip" json:"ip"` + // The TCP port the Master is listening on for incoming + // HTTP requests; deprecated, use `address.port` instead. + Port *uint32 `protobuf:"varint,3,req,name=port,def=5050" json:"port,omitempty"` + // In the default implementation, this will contain information + // about both the IP address, port and Master name; it should really + // not be relied upon by external tooling/frameworks and be + // considered an "internal" implementation field. + PID *string `protobuf:"bytes,4,opt,name=pid" json:"pid,omitempty"` + // The server's hostname, if available; it may be unreliable + // in environments where the DNS configuration does not resolve + // internal hostnames (eg, some public cloud providers). + // Deprecated, use `address.hostname` instead. + Hostname *string `protobuf:"bytes,5,opt,name=hostname" json:"hostname,omitempty"` + // The running Master version, as a string; taken from the + // generated "master/version.hpp". + Version *string `protobuf:"bytes,6,opt,name=version" json:"version,omitempty"` + // The full IP address (supports both IPv4 and IPv6 formats) + // and supersedes the use of `ip`, `port` and `hostname`. + // Since Mesos 0.24. + Address *Address `protobuf:"bytes,7,opt,name=address" json:"address,omitempty"` + // The domain that this master belongs to. All masters in a Mesos + // cluster should belong to the same region. + Domain *DomainInfo `protobuf:"bytes,8,opt,name=domain" json:"domain,omitempty"` + Capabilities []MasterInfo_Capability `protobuf:"bytes,9,rep,name=capabilities" json:"capabilities"` +} + +func (m *MasterInfo) Reset() { *m = MasterInfo{} } +func (*MasterInfo) ProtoMessage() {} +func (*MasterInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{22} } + +const Default_MasterInfo_Port uint32 = 5050 + +func (m *MasterInfo) GetID() string { + if m != nil { + return m.ID + } + return "" +} + +func (m *MasterInfo) GetIP() uint32 { + if m != nil { + return m.IP + } + return 0 +} + +func (m *MasterInfo) GetPort() uint32 { + if m != nil && m.Port != nil { + return *m.Port + } + return Default_MasterInfo_Port +} + +func (m *MasterInfo) GetPID() string { + if m != nil && m.PID != nil { + return *m.PID + } + return "" +} + +func (m *MasterInfo) GetHostname() string { + if m != nil && m.Hostname != nil { + return *m.Hostname + } + return "" +} + +func (m *MasterInfo) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +func (m *MasterInfo) GetAddress() *Address { + if m != nil { + return m.Address + } + return nil +} + +func (m *MasterInfo) GetDomain() *DomainInfo { + if m != nil { + return m.Domain + } + return nil +} + +func (m *MasterInfo) GetCapabilities() []MasterInfo_Capability { + if m != nil { + return m.Capabilities + } + return nil +} + +type MasterInfo_Capability struct { + Type MasterInfo_Capability_Type `protobuf:"varint,1,opt,name=type,enum=mesos.MasterInfo_Capability_Type" json:"type"` +} + +func (m *MasterInfo_Capability) Reset() { *m = MasterInfo_Capability{} } +func (*MasterInfo_Capability) ProtoMessage() {} +func (*MasterInfo_Capability) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{22, 0} } + +func (m *MasterInfo_Capability) GetType() MasterInfo_Capability_Type { + if m != nil { + return m.Type + } + return MasterInfo_Capability_UNKNOWN +} + +// * +// Describes an agent. Note that the 'id' field is only available +// after an agent is registered with the master, and is made available +// here to facilitate re-registration. +type AgentInfo struct { + Hostname string `protobuf:"bytes,1,req,name=hostname" json:"hostname"` + Port *int32 `protobuf:"varint,8,opt,name=port,def=5051" json:"port,omitempty"` + // The configured resources at the agent. This does not include any + // dynamic reservations or persistent volumes that may currently + // exist at the agent. + Resources []Resource `protobuf:"bytes,3,rep,name=resources" json:"resources"` + Attributes []Attribute `protobuf:"bytes,5,rep,name=attributes" json:"attributes"` + ID *AgentID `protobuf:"bytes,6,opt,name=id" json:"id,omitempty"` + // The domain that this agent belongs to. If the agent's region + // differs from the master's region, it will not appear in resource + // offers to frameworks that have not enabled the REGION_AWARE + // capability. + Domain *DomainInfo `protobuf:"bytes,10,opt,name=domain" json:"domain,omitempty"` +} + +func (m *AgentInfo) Reset() { *m = AgentInfo{} } +func (*AgentInfo) ProtoMessage() {} +func (*AgentInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{23} } + +const Default_AgentInfo_Port int32 = 5051 + +func (m *AgentInfo) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *AgentInfo) GetPort() int32 { + if m != nil && m.Port != nil { + return *m.Port + } + return Default_AgentInfo_Port +} + +func (m *AgentInfo) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *AgentInfo) GetAttributes() []Attribute { + if m != nil { + return m.Attributes + } + return nil +} + +func (m *AgentInfo) GetID() *AgentID { + if m != nil { + return m.ID + } + return nil +} + +func (m *AgentInfo) GetDomain() *DomainInfo { + if m != nil { + return m.Domain + } + return nil +} + +type AgentInfo_Capability struct { + // Enum fields should be optional, see: MESOS-4997. + Type AgentInfo_Capability_Type `protobuf:"varint,1,opt,name=type,enum=mesos.AgentInfo_Capability_Type" json:"type"` +} + +func (m *AgentInfo_Capability) Reset() { *m = AgentInfo_Capability{} } +func (*AgentInfo_Capability) ProtoMessage() {} +func (*AgentInfo_Capability) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{23, 0} } + +func (m *AgentInfo_Capability) GetType() AgentInfo_Capability_Type { + if m != nil { + return m.Type + } + return AgentInfo_Capability_UNKNOWN +} + +// * +// Describes the container configuration to run a CSI plugin component. +type CSIPluginContainerInfo struct { + Services []CSIPluginContainerInfo_Service `protobuf:"varint,1,rep,name=services,enum=mesos.CSIPluginContainerInfo_Service" json:"services,omitempty"` + Command *CommandInfo `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"` + Resources []Resource `protobuf:"bytes,3,rep,name=resources" json:"resources"` + Container *ContainerInfo `protobuf:"bytes,4,opt,name=container" json:"container,omitempty"` +} + +func (m *CSIPluginContainerInfo) Reset() { *m = CSIPluginContainerInfo{} } +func (*CSIPluginContainerInfo) ProtoMessage() {} +func (*CSIPluginContainerInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{24} } + +func (m *CSIPluginContainerInfo) GetServices() []CSIPluginContainerInfo_Service { + if m != nil { + return m.Services + } + return nil +} + +func (m *CSIPluginContainerInfo) GetCommand() *CommandInfo { + if m != nil { + return m.Command + } + return nil +} + +func (m *CSIPluginContainerInfo) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *CSIPluginContainerInfo) GetContainer() *ContainerInfo { + if m != nil { + return m.Container + } + return nil +} + +// * +// Describes a CSI plugin. +type CSIPluginInfo struct { + // The type of the CSI service. This uniquely identifies a CSI + // implementation. For instance: + // org.apache.mesos.csi.test + // + // Please follow to Java package naming convention + // (https://en.wikipedia.org/wiki/Java_package#Package_naming_conventions) + // to avoid conflicts on type names. + Type string `protobuf:"bytes,1,req,name=type" json:"type"` + // The name of the CSI service. There could be mutliple instances of a + // type of CSI service. The name field is used to distinguish these + // instances. It should be a legal Java identifier + // (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) + // to avoid conflicts on concatenation of type and name. + Name string `protobuf:"bytes,2,req,name=name" json:"name"` + // A list of container configurations to run CSI plugin components. + // The controller service will be served by the first configuration + // that contains `CONTROLLER_SERVICE`, and the node service will be + // served by the first configuration that contains `NODE_SERVICE`. + Containers []CSIPluginContainerInfo `protobuf:"bytes,3,rep,name=containers" json:"containers"` +} + +func (m *CSIPluginInfo) Reset() { *m = CSIPluginInfo{} } +func (*CSIPluginInfo) ProtoMessage() {} +func (*CSIPluginInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{25} } + +func (m *CSIPluginInfo) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *CSIPluginInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *CSIPluginInfo) GetContainers() []CSIPluginContainerInfo { + if m != nil { + return m.Containers + } + return nil +} + +// * +// Describes a resource provider. Note that the 'id' field is only available +// after a resource provider is registered with the master, and is made +// available here to facilitate re-registration. +type ResourceProviderInfo struct { + ID *ResourceProviderID `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` + Attributes []Attribute `protobuf:"bytes,2,rep,name=attributes" json:"attributes"` + // The type of the resource provider. This uniquely identifies a + // resource provider implementation. For instance: + // org.apache.mesos.rp.local.storage + // + // Please follow to Java package naming convention + // (https://en.wikipedia.org/wiki/Java_package#Package_naming_conventions) + // to avoid conflicts on type names. + Type string `protobuf:"bytes,3,req,name=type" json:"type"` + // The name of the resource provider. There could be multiple + // instances of a type of resource provider. The name field is used + // to distinguish these instances. It should be a legal Java identifier + // (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) + // to avoid conflicts on concatenation of type and name. + Name string `protobuf:"bytes,4,req,name=name" json:"name"` + // The stack of default reservations. If this field is not empty, it + // indicates that resources from this resource provider are reserved + // by default, except for the resources that have been reserved or + // unreserved through operations. The first `ReservationInfo` + // may have type `STATIC` or `DYNAMIC`, but the rest must have + // `DYNAMIC`. One can create a new reservation on top of an existing + // one by pushing a new `ReservationInfo` to the back. The last + // `ReservationInfo` in this stack is the "current" reservation. The + // new reservation's role must be a child of the current one. + DefaultReservations []Resource_ReservationInfo `protobuf:"bytes,5,rep,name=default_reservations,json=defaultReservations" json:"default_reservations"` + Storage *ResourceProviderInfo_Storage `protobuf:"bytes,6,opt,name=storage" json:"storage,omitempty"` +} + +func (m *ResourceProviderInfo) Reset() { *m = ResourceProviderInfo{} } +func (*ResourceProviderInfo) ProtoMessage() {} +func (*ResourceProviderInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{26} } + +func (m *ResourceProviderInfo) GetID() *ResourceProviderID { + if m != nil { + return m.ID + } + return nil +} + +func (m *ResourceProviderInfo) GetAttributes() []Attribute { + if m != nil { + return m.Attributes + } + return nil +} + +func (m *ResourceProviderInfo) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *ResourceProviderInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ResourceProviderInfo) GetDefaultReservations() []Resource_ReservationInfo { + if m != nil { + return m.DefaultReservations + } + return nil +} + +func (m *ResourceProviderInfo) GetStorage() *ResourceProviderInfo_Storage { + if m != nil { + return m.Storage + } + return nil +} + +// Storage resource provider related information. +type ResourceProviderInfo_Storage struct { + Plugin CSIPluginInfo `protobuf:"bytes,1,req,name=plugin" json:"plugin"` +} + +func (m *ResourceProviderInfo_Storage) Reset() { *m = ResourceProviderInfo_Storage{} } +func (*ResourceProviderInfo_Storage) ProtoMessage() {} +func (*ResourceProviderInfo_Storage) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{26, 0} +} + +func (m *ResourceProviderInfo_Storage) GetPlugin() CSIPluginInfo { + if m != nil { + return m.Plugin + } + return CSIPluginInfo{} +} + +// * +// Describes an Attribute or Resource "value". A value is described +// using the standard protocol buffer "union" trick. +type Value struct { + Type Value_Type `protobuf:"varint,1,req,name=type,enum=mesos.Value_Type" json:"type"` + Scalar *Value_Scalar `protobuf:"bytes,2,opt,name=scalar" json:"scalar,omitempty"` + Ranges *Value_Ranges `protobuf:"bytes,3,opt,name=ranges" json:"ranges,omitempty"` + Set *Value_Set `protobuf:"bytes,4,opt,name=set" json:"set,omitempty"` + Text *Value_Text `protobuf:"bytes,5,opt,name=text" json:"text,omitempty"` +} + +func (m *Value) Reset() { *m = Value{} } +func (*Value) ProtoMessage() {} +func (*Value) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{27} } + +func (m *Value) GetType() Value_Type { + if m != nil { + return m.Type + } + return SCALAR +} + +func (m *Value) GetScalar() *Value_Scalar { + if m != nil { + return m.Scalar + } + return nil +} + +func (m *Value) GetRanges() *Value_Ranges { + if m != nil { + return m.Ranges + } + return nil +} + +func (m *Value) GetSet() *Value_Set { + if m != nil { + return m.Set + } + return nil +} + +func (m *Value) GetText() *Value_Text { + if m != nil { + return m.Text + } + return nil +} + +type Value_Scalar struct { + // Scalar values are represented using floating point. To reduce + // the chance of unpredictable floating point behavior due to + // roundoff error, Mesos only supports three decimal digits of + // precision for scalar resource values. That is, floating point + // values are converted to a fixed point format that supports + // three decimal digits of precision, and then converted back to + // floating point on output. Any additional precision in scalar + // resource values is discarded (via rounding). + Value float64 `protobuf:"fixed64,1,req,name=value" json:"value"` +} + +func (m *Value_Scalar) Reset() { *m = Value_Scalar{} } +func (*Value_Scalar) ProtoMessage() {} +func (*Value_Scalar) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{27, 0} } + +func (m *Value_Scalar) GetValue() float64 { + if m != nil { + return m.Value + } + return 0 +} + +type Value_Range struct { + Begin uint64 `protobuf:"varint,1,req,name=begin" json:"begin"` + End uint64 `protobuf:"varint,2,req,name=end" json:"end"` +} + +func (m *Value_Range) Reset() { *m = Value_Range{} } +func (*Value_Range) ProtoMessage() {} +func (*Value_Range) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{27, 1} } + +func (m *Value_Range) GetBegin() uint64 { + if m != nil { + return m.Begin + } + return 0 +} + +func (m *Value_Range) GetEnd() uint64 { + if m != nil { + return m.End + } + return 0 +} + +type Value_Ranges struct { + Range []Value_Range `protobuf:"bytes,1,rep,name=range" json:"range"` +} + +func (m *Value_Ranges) Reset() { *m = Value_Ranges{} } +func (*Value_Ranges) ProtoMessage() {} +func (*Value_Ranges) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{27, 2} } + +func (m *Value_Ranges) GetRange() []Value_Range { + if m != nil { + return m.Range + } + return nil +} + +type Value_Set struct { + Item []string `protobuf:"bytes,1,rep,name=item" json:"item,omitempty"` +} + +func (m *Value_Set) Reset() { *m = Value_Set{} } +func (*Value_Set) ProtoMessage() {} +func (*Value_Set) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{27, 3} } + +func (m *Value_Set) GetItem() []string { + if m != nil { + return m.Item + } + return nil +} + +type Value_Text struct { + Value string `protobuf:"bytes,1,req,name=value" json:"value"` +} + +func (m *Value_Text) Reset() { *m = Value_Text{} } +func (*Value_Text) ProtoMessage() {} +func (*Value_Text) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{27, 4} } + +func (m *Value_Text) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// Describes an attribute that can be set on a machine. For now, +// attributes and resources share the same "value" type, but this may +// change in the future and attributes may only be string based. +type Attribute struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + Type Value_Type `protobuf:"varint,2,req,name=type,enum=mesos.Value_Type" json:"type"` + Scalar *Value_Scalar `protobuf:"bytes,3,opt,name=scalar" json:"scalar,omitempty"` + Ranges *Value_Ranges `protobuf:"bytes,4,opt,name=ranges" json:"ranges,omitempty"` + Set *Value_Set `protobuf:"bytes,6,opt,name=set" json:"set,omitempty"` + Text *Value_Text `protobuf:"bytes,5,opt,name=text" json:"text,omitempty"` +} + +func (m *Attribute) Reset() { *m = Attribute{} } +func (*Attribute) ProtoMessage() {} +func (*Attribute) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{28} } + +func (m *Attribute) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Attribute) GetType() Value_Type { + if m != nil { + return m.Type + } + return SCALAR +} + +func (m *Attribute) GetScalar() *Value_Scalar { + if m != nil { + return m.Scalar + } + return nil +} + +func (m *Attribute) GetRanges() *Value_Ranges { + if m != nil { + return m.Ranges + } + return nil +} + +func (m *Attribute) GetSet() *Value_Set { + if m != nil { + return m.Set + } + return nil +} + +func (m *Attribute) GetText() *Value_Text { + if m != nil { + return m.Text + } + return nil +} + +// * +// Describes a resource from a resource provider. The `name` field is +// a string like "cpus" or "mem" that indicates which kind of resource +// this is; the rest of the fields describe the properties of the +// resource. A resource can take on one of three types: scalar +// (double), a list of finite and discrete ranges (e.g., [1-10, +// 20-30]), or a set of items. A resource is described using the +// standard protocol buffer "union" trick. +// +// Note that "disk" and "mem" resources are scalar values expressed in +// megabytes. Fractional "cpus" values are allowed (e.g., "0.5"), +// which correspond to partial shares of a CPU. +type Resource struct { + ProviderID *ResourceProviderID `protobuf:"bytes,12,opt,name=provider_id,json=providerId" json:"provider_id,omitempty"` + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + Type *Value_Type `protobuf:"varint,2,req,name=type,enum=mesos.Value_Type" json:"type,omitempty"` + Scalar *Value_Scalar `protobuf:"bytes,3,opt,name=scalar" json:"scalar,omitempty"` + Ranges *Value_Ranges `protobuf:"bytes,4,opt,name=ranges" json:"ranges,omitempty"` + Set *Value_Set `protobuf:"bytes,5,opt,name=set" json:"set,omitempty"` + // The role that this resource is reserved for. If "*", this indicates + // that the resource is unreserved. Otherwise, the resource will only + // be offered to frameworks that belong to this role. + // + // NOTE: Frameworks must not set this field if `reservations` is set. + // See the 'Resource Format' section for more details. + // + // TODO(mpark): Deprecate once `reservations` is no longer experimental. + Role *string `protobuf:"bytes,6,opt,name=role,def=*" json:"role,omitempty"` + AllocationInfo *Resource_AllocationInfo `protobuf:"bytes,11,opt,name=allocation_info,json=allocationInfo" json:"allocation_info,omitempty"` + // If this is set, this resource was dynamically reserved by an + // operator or a framework. Otherwise, this resource is either unreserved + // or statically reserved by an operator via the --resources flag. + // + // NOTE: Frameworks must not set this field if `reservations` is set. + // See the 'Resource Format' section for more details. + // + // TODO(mpark): Deprecate once `reservations` is no longer experimental. + Reservation *Resource_ReservationInfo `protobuf:"bytes,8,opt,name=reservation" json:"reservation,omitempty"` + // The stack of reservations. If this field is empty, it indicates that this + // resource is unreserved. Otherwise, the resource is reserved. The first + // `ReservationInfo` may have type `STATIC` or `DYNAMIC`, but the rest must + // have `DYNAMIC`. One can create a new reservation on top of an existing + // one by pushing a new `ReservationInfo` to the back. The last + // `ReservationInfo` in this stack is the "current" reservation. The new + // reservation's role must be a child of the current reservation's role. + // + // NOTE: Frameworks must not set this field if `reservation` is set. + // See the 'Resource Format' section for more details. + // + // TODO(mpark): Deprecate `role` and `reservation` once this is stable. + Reservations []Resource_ReservationInfo `protobuf:"bytes,13,rep,name=reservations" json:"reservations"` + Disk *Resource_DiskInfo `protobuf:"bytes,7,opt,name=disk" json:"disk,omitempty"` + // If this is set, the resources are revocable, i.e., any tasks or + // executors launched using these resources could get preempted or + // throttled at any time. This could be used by frameworks to run + // best effort tasks that do not need strict uptime or performance + // guarantees. Note that if this is set, 'disk' or 'reservation' + // cannot be set. + Revocable *Resource_RevocableInfo `protobuf:"bytes,9,opt,name=revocable" json:"revocable,omitempty"` + // If this is set, the resources are shared, i.e. multiple tasks + // can be launched using this resource and all of them shall refer + // to the same physical resource on the cluster. Note that only + // persistent volumes can be shared currently. + Shared *Resource_SharedInfo `protobuf:"bytes,10,opt,name=shared" json:"shared,omitempty"` +} + +func (m *Resource) Reset() { *m = Resource{} } +func (*Resource) ProtoMessage() {} +func (*Resource) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{29} } + +const Default_Resource_Role string = "*" + +func (m *Resource) GetProviderID() *ResourceProviderID { + if m != nil { + return m.ProviderID + } + return nil +} + +func (m *Resource) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Resource) GetType() Value_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return SCALAR +} + +func (m *Resource) GetScalar() *Value_Scalar { + if m != nil { + return m.Scalar + } + return nil +} + +func (m *Resource) GetRanges() *Value_Ranges { + if m != nil { + return m.Ranges + } + return nil +} + +func (m *Resource) GetSet() *Value_Set { + if m != nil { + return m.Set + } + return nil +} + +func (m *Resource) GetRole() string { + if m != nil && m.Role != nil { + return *m.Role + } + return Default_Resource_Role +} + +func (m *Resource) GetAllocationInfo() *Resource_AllocationInfo { + if m != nil { + return m.AllocationInfo + } + return nil +} + +func (m *Resource) GetReservation() *Resource_ReservationInfo { + if m != nil { + return m.Reservation + } + return nil +} + +func (m *Resource) GetReservations() []Resource_ReservationInfo { + if m != nil { + return m.Reservations + } + return nil +} + +func (m *Resource) GetDisk() *Resource_DiskInfo { + if m != nil { + return m.Disk + } + return nil +} + +func (m *Resource) GetRevocable() *Resource_RevocableInfo { + if m != nil { + return m.Revocable + } + return nil +} + +func (m *Resource) GetShared() *Resource_SharedInfo { + if m != nil { + return m.Shared + } + return nil +} + +// This was initially introduced to support MULTI_ROLE capable +// frameworks. Frameworks that are not MULTI_ROLE capable can +// continue to assume that the offered resources are allocated +// to their role. +type Resource_AllocationInfo struct { + // If set, this resource is allocated to a role. Note that in the + // future, this may be unset and the scheduler may be responsible + // for allocating to one of its roles. + Role *string `protobuf:"bytes,1,opt,name=role" json:"role,omitempty"` +} + +func (m *Resource_AllocationInfo) Reset() { *m = Resource_AllocationInfo{} } +func (*Resource_AllocationInfo) ProtoMessage() {} +func (*Resource_AllocationInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{29, 0} } + +func (m *Resource_AllocationInfo) GetRole() string { + if m != nil && m.Role != nil { + return *m.Role + } + return "" +} + +type Resource_ReservationInfo struct { + // The type of this reservation. + // + // NOTE: This field must not be set for `Resource.reservation`. + // See the 'Resource Format' section for more details. + Type *Resource_ReservationInfo_Type `protobuf:"varint,4,opt,name=type,enum=mesos.Resource_ReservationInfo_Type" json:"type,omitempty"` + // The role to which this reservation is made for. + // + // NOTE: This field must not be set for `Resource.reservation`. + // See the 'Resource Format' section for more details. + Role *string `protobuf:"bytes,3,opt,name=role" json:"role,omitempty"` + // Indicates the principal, if any, of the framework or operator + // that reserved this resource. If reserved by a framework, the + // field should match the `FrameworkInfo.principal`. It is used in + // conjunction with the `UnreserveResources` ACL to determine + // whether the entity attempting to unreserve this resource is + // permitted to do so. + Principal *string `protobuf:"bytes,1,opt,name=principal" json:"principal,omitempty"` + // Labels are free-form key value pairs that can be used to + // associate arbitrary metadata with a reserved resource. For + // example, frameworks can use labels to identify the intended + // purpose for a portion of the resources the framework has + // reserved at a given agent. Labels should not contain duplicate + // key-value pairs. + Labels *Labels `protobuf:"bytes,2,opt,name=labels" json:"labels,omitempty"` +} + +func (m *Resource_ReservationInfo) Reset() { *m = Resource_ReservationInfo{} } +func (*Resource_ReservationInfo) ProtoMessage() {} +func (*Resource_ReservationInfo) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{29, 1} +} + +func (m *Resource_ReservationInfo) GetType() Resource_ReservationInfo_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return Resource_ReservationInfo_UNKNOWN +} + +func (m *Resource_ReservationInfo) GetRole() string { + if m != nil && m.Role != nil { + return *m.Role + } + return "" +} + +func (m *Resource_ReservationInfo) GetPrincipal() string { + if m != nil && m.Principal != nil { + return *m.Principal + } + return "" +} + +func (m *Resource_ReservationInfo) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +type Resource_DiskInfo struct { + Persistence *Resource_DiskInfo_Persistence `protobuf:"bytes,1,opt,name=persistence" json:"persistence,omitempty"` + // Describes how this disk resource will be mounted in the + // container. If not set, the disk resource will be used as the + // sandbox. Otherwise, it will be mounted according to the + // 'container_path' inside 'volume'. The 'host_path' inside + // 'volume' is ignored. + // NOTE: If 'volume' is set but 'persistence' is not set, the + // volume will be automatically garbage collected after + // task/executor terminates. Currently, if 'persistence' is set, + // 'volume' must be set. + Volume *Volume `protobuf:"bytes,2,opt,name=volume" json:"volume,omitempty"` + Source *Resource_DiskInfo_Source `protobuf:"bytes,3,opt,name=source" json:"source,omitempty"` +} + +func (m *Resource_DiskInfo) Reset() { *m = Resource_DiskInfo{} } +func (*Resource_DiskInfo) ProtoMessage() {} +func (*Resource_DiskInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{29, 2} } + +func (m *Resource_DiskInfo) GetPersistence() *Resource_DiskInfo_Persistence { + if m != nil { + return m.Persistence + } + return nil +} + +func (m *Resource_DiskInfo) GetVolume() *Volume { + if m != nil { + return m.Volume + } + return nil +} + +func (m *Resource_DiskInfo) GetSource() *Resource_DiskInfo_Source { + if m != nil { + return m.Source + } + return nil +} + +// Describes a persistent disk volume. +// +// A persistent disk volume will not be automatically garbage +// collected if the task/executor/agent terminates, but will be +// re-offered to the framework(s) belonging to the 'role'. +// +// NOTE: Currently, we do not allow persistent disk volumes +// without a reservation (i.e., 'role' cannot be '*'). +type Resource_DiskInfo_Persistence struct { + // A unique ID for the persistent disk volume. This ID must be + // unique per role on each agent. Although it is possible to use + // the same ID on different agents in the cluster and to reuse + // IDs after a volume with that ID has been destroyed, both + // practices are discouraged. + ID string `protobuf:"bytes,1,req,name=id" json:"id"` + // This field indicates the principal of the operator or + // framework that created this volume. It is used in conjunction + // with the "destroy" ACL to determine whether an entity + // attempting to destroy the volume is permitted to do so. + // + // NOTE: This field should match the FrameworkInfo.principal of + // the framework that created the volume. + Principal *string `protobuf:"bytes,2,opt,name=principal" json:"principal,omitempty"` +} + +func (m *Resource_DiskInfo_Persistence) Reset() { *m = Resource_DiskInfo_Persistence{} } +func (*Resource_DiskInfo_Persistence) ProtoMessage() {} +func (*Resource_DiskInfo_Persistence) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{29, 2, 0} +} + +func (m *Resource_DiskInfo_Persistence) GetID() string { + if m != nil { + return m.ID + } + return "" +} + +func (m *Resource_DiskInfo_Persistence) GetPrincipal() string { + if m != nil && m.Principal != nil { + return *m.Principal + } + return "" +} + +// Describes where a disk originates from. +type Resource_DiskInfo_Source struct { + Type Resource_DiskInfo_Source_Type `protobuf:"varint,1,req,name=type,enum=mesos.Resource_DiskInfo_Source_Type" json:"type"` + Path *Resource_DiskInfo_Source_Path `protobuf:"bytes,2,opt,name=path" json:"path,omitempty"` + Mount *Resource_DiskInfo_Source_Mount `protobuf:"bytes,3,opt,name=mount" json:"mount,omitempty"` + // An identifier for this source. This field maps onto CSI + // volume IDs and is not expected to be set by frameworks. + ID *string `protobuf:"bytes,4,opt,name=id" json:"id,omitempty"` + // Additional metadata for this source. This field maps onto CSI + // volume metadata and is not expected to be set by frameworks. + Metadata *Labels `protobuf:"bytes,5,opt,name=metadata" json:"metadata,omitempty"` + // This field serves as an indirection to a set of storage + // vendor specific disk parameters which describe the properties + // of the disk. The operator will setup mappings between a + // profile name to a set of vendor specific disk parameters. And + // the framework will do disk selection based on profile names, + // instead of vendor specific disk parameters. + // + // Also see the DiskProfileAdaptor module. + Profile *string `protobuf:"bytes,6,opt,name=profile" json:"profile,omitempty"` +} + +func (m *Resource_DiskInfo_Source) Reset() { *m = Resource_DiskInfo_Source{} } +func (*Resource_DiskInfo_Source) ProtoMessage() {} +func (*Resource_DiskInfo_Source) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{29, 2, 1} +} + +func (m *Resource_DiskInfo_Source) GetType() Resource_DiskInfo_Source_Type { + if m != nil { + return m.Type + } + return Resource_DiskInfo_Source_UNKNOWN +} + +func (m *Resource_DiskInfo_Source) GetPath() *Resource_DiskInfo_Source_Path { + if m != nil { + return m.Path + } + return nil +} + +func (m *Resource_DiskInfo_Source) GetMount() *Resource_DiskInfo_Source_Mount { + if m != nil { + return m.Mount + } + return nil +} + +func (m *Resource_DiskInfo_Source) GetID() string { + if m != nil && m.ID != nil { + return *m.ID + } + return "" +} + +func (m *Resource_DiskInfo_Source) GetMetadata() *Labels { + if m != nil { + return m.Metadata + } + return nil +} + +func (m *Resource_DiskInfo_Source) GetProfile() string { + if m != nil && m.Profile != nil { + return *m.Profile + } + return "" +} + +// A folder that can be located on a separate disk device. This +// can be shared and carved up as necessary between frameworks. +type Resource_DiskInfo_Source_Path struct { + // Path to the folder (e.g., /mnt/raid/disk0). If the path is a + // relative path, it is relative to the agent work directory. + Root *string `protobuf:"bytes,1,opt,name=root" json:"root,omitempty"` +} + +func (m *Resource_DiskInfo_Source_Path) Reset() { *m = Resource_DiskInfo_Source_Path{} } +func (*Resource_DiskInfo_Source_Path) ProtoMessage() {} +func (*Resource_DiskInfo_Source_Path) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{29, 2, 1, 0} +} + +func (m *Resource_DiskInfo_Source_Path) GetRoot() string { + if m != nil && m.Root != nil { + return *m.Root + } + return "" +} + +// A mounted file-system set up by the Agent administrator. This +// can only be used exclusively: a framework cannot accept a +// partial amount of this disk. +type Resource_DiskInfo_Source_Mount struct { + // Path to mount point (e.g., /mnt/raid/disk0). If the path is a + // relative path, it is relative to the agent work directory. + Root *string `protobuf:"bytes,1,opt,name=root" json:"root,omitempty"` +} + +func (m *Resource_DiskInfo_Source_Mount) Reset() { *m = Resource_DiskInfo_Source_Mount{} } +func (*Resource_DiskInfo_Source_Mount) ProtoMessage() {} +func (*Resource_DiskInfo_Source_Mount) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{29, 2, 1, 1} +} + +func (m *Resource_DiskInfo_Source_Mount) GetRoot() string { + if m != nil && m.Root != nil { + return *m.Root + } + return "" +} + +type Resource_RevocableInfo struct { +} + +func (m *Resource_RevocableInfo) Reset() { *m = Resource_RevocableInfo{} } +func (*Resource_RevocableInfo) ProtoMessage() {} +func (*Resource_RevocableInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{29, 3} } + +// Allow the resource to be shared across tasks. +type Resource_SharedInfo struct { +} + +func (m *Resource_SharedInfo) Reset() { *m = Resource_SharedInfo{} } +func (*Resource_SharedInfo) ProtoMessage() {} +func (*Resource_SharedInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{29, 4} } + +// * +// When the network bandwidth caps are enabled and the container +// is over its limit, outbound packets may be either delayed or +// dropped completely either because it exceeds the maximum bandwidth +// allocation for a single container (the cap) or because the combined +// network traffic of multiple containers on the host exceeds the +// transmit capacity of the host (the share). We can report the +// following statistics for each of these conditions exported directly +// from the Linux Traffic Control Queueing Discipline. +// +// id : name of the limiter, e.g. 'tx_bw_cap' +// backlog : number of packets currently delayed +// bytes : total bytes seen +// drops : number of packets dropped in total +// overlimits : number of packets which exceeded allocation +// packets : total packets seen +// qlen : number of packets currently queued +// rate_bps : throughput in bytes/sec +// rate_pps : throughput in packets/sec +// requeues : number of times a packet has been delayed due to +// locking or device contention issues +// +// More information on the operation of Linux Traffic Control can be +// found at http://www.lartc.org/lartc.html. +type TrafficControlStatistics struct { + ID string `protobuf:"bytes,1,req,name=id" json:"id"` + Backlog *uint64 `protobuf:"varint,2,opt,name=backlog" json:"backlog,omitempty"` + Bytes *uint64 `protobuf:"varint,3,opt,name=bytes" json:"bytes,omitempty"` + Drops *uint64 `protobuf:"varint,4,opt,name=drops" json:"drops,omitempty"` + Overlimits *uint64 `protobuf:"varint,5,opt,name=overlimits" json:"overlimits,omitempty"` + Packets *uint64 `protobuf:"varint,6,opt,name=packets" json:"packets,omitempty"` + Qlen *uint64 `protobuf:"varint,7,opt,name=qlen" json:"qlen,omitempty"` + RateBPS *uint64 `protobuf:"varint,8,opt,name=ratebps" json:"ratebps,omitempty"` + RatePPS *uint64 `protobuf:"varint,9,opt,name=ratepps" json:"ratepps,omitempty"` + Requeues *uint64 `protobuf:"varint,10,opt,name=requeues" json:"requeues,omitempty"` +} + +func (m *TrafficControlStatistics) Reset() { *m = TrafficControlStatistics{} } +func (*TrafficControlStatistics) ProtoMessage() {} +func (*TrafficControlStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{30} } + +func (m *TrafficControlStatistics) GetID() string { + if m != nil { + return m.ID + } + return "" +} + +func (m *TrafficControlStatistics) GetBacklog() uint64 { + if m != nil && m.Backlog != nil { + return *m.Backlog + } + return 0 +} + +func (m *TrafficControlStatistics) GetBytes() uint64 { + if m != nil && m.Bytes != nil { + return *m.Bytes + } + return 0 +} + +func (m *TrafficControlStatistics) GetDrops() uint64 { + if m != nil && m.Drops != nil { + return *m.Drops + } + return 0 +} + +func (m *TrafficControlStatistics) GetOverlimits() uint64 { + if m != nil && m.Overlimits != nil { + return *m.Overlimits + } + return 0 +} + +func (m *TrafficControlStatistics) GetPackets() uint64 { + if m != nil && m.Packets != nil { + return *m.Packets + } + return 0 +} + +func (m *TrafficControlStatistics) GetQlen() uint64 { + if m != nil && m.Qlen != nil { + return *m.Qlen + } + return 0 +} + +func (m *TrafficControlStatistics) GetRateBPS() uint64 { + if m != nil && m.RateBPS != nil { + return *m.RateBPS + } + return 0 +} + +func (m *TrafficControlStatistics) GetRatePPS() uint64 { + if m != nil && m.RatePPS != nil { + return *m.RatePPS + } + return 0 +} + +func (m *TrafficControlStatistics) GetRequeues() uint64 { + if m != nil && m.Requeues != nil { + return *m.Requeues + } + return 0 +} + +type IpStatistics struct { + Forwarding *int64 `protobuf:"varint,1,opt,name=Forwarding" json:"Forwarding,omitempty"` + DefaultTTL *int64 `protobuf:"varint,2,opt,name=DefaultTTL" json:"DefaultTTL,omitempty"` + InReceives *int64 `protobuf:"varint,3,opt,name=InReceives" json:"InReceives,omitempty"` + InHdrErrors *int64 `protobuf:"varint,4,opt,name=InHdrErrors" json:"InHdrErrors,omitempty"` + InAddrErrors *int64 `protobuf:"varint,5,opt,name=InAddrErrors" json:"InAddrErrors,omitempty"` + ForwDatagrams *int64 `protobuf:"varint,6,opt,name=ForwDatagrams" json:"ForwDatagrams,omitempty"` + InUnknownProtos *int64 `protobuf:"varint,7,opt,name=InUnknownProtos" json:"InUnknownProtos,omitempty"` + InDiscards *int64 `protobuf:"varint,8,opt,name=InDiscards" json:"InDiscards,omitempty"` + InDelivers *int64 `protobuf:"varint,9,opt,name=InDelivers" json:"InDelivers,omitempty"` + OutRequests *int64 `protobuf:"varint,10,opt,name=OutRequests" json:"OutRequests,omitempty"` + OutDiscards *int64 `protobuf:"varint,11,opt,name=OutDiscards" json:"OutDiscards,omitempty"` + OutNoRoutes *int64 `protobuf:"varint,12,opt,name=OutNoRoutes" json:"OutNoRoutes,omitempty"` + ReasmTimeout *int64 `protobuf:"varint,13,opt,name=ReasmTimeout" json:"ReasmTimeout,omitempty"` + ReasmReqds *int64 `protobuf:"varint,14,opt,name=ReasmReqds" json:"ReasmReqds,omitempty"` + ReasmOKs *int64 `protobuf:"varint,15,opt,name=ReasmOKs" json:"ReasmOKs,omitempty"` + ReasmFails *int64 `protobuf:"varint,16,opt,name=ReasmFails" json:"ReasmFails,omitempty"` + FragOKs *int64 `protobuf:"varint,17,opt,name=FragOKs" json:"FragOKs,omitempty"` + FragFails *int64 `protobuf:"varint,18,opt,name=FragFails" json:"FragFails,omitempty"` + FragCreates *int64 `protobuf:"varint,19,opt,name=FragCreates" json:"FragCreates,omitempty"` +} + +func (m *IpStatistics) Reset() { *m = IpStatistics{} } +func (*IpStatistics) ProtoMessage() {} +func (*IpStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{31} } + +func (m *IpStatistics) GetForwarding() int64 { + if m != nil && m.Forwarding != nil { + return *m.Forwarding + } + return 0 +} + +func (m *IpStatistics) GetDefaultTTL() int64 { + if m != nil && m.DefaultTTL != nil { + return *m.DefaultTTL + } + return 0 +} + +func (m *IpStatistics) GetInReceives() int64 { + if m != nil && m.InReceives != nil { + return *m.InReceives + } + return 0 +} + +func (m *IpStatistics) GetInHdrErrors() int64 { + if m != nil && m.InHdrErrors != nil { + return *m.InHdrErrors + } + return 0 +} + +func (m *IpStatistics) GetInAddrErrors() int64 { + if m != nil && m.InAddrErrors != nil { + return *m.InAddrErrors + } + return 0 +} + +func (m *IpStatistics) GetForwDatagrams() int64 { + if m != nil && m.ForwDatagrams != nil { + return *m.ForwDatagrams + } + return 0 +} + +func (m *IpStatistics) GetInUnknownProtos() int64 { + if m != nil && m.InUnknownProtos != nil { + return *m.InUnknownProtos + } + return 0 +} + +func (m *IpStatistics) GetInDiscards() int64 { + if m != nil && m.InDiscards != nil { + return *m.InDiscards + } + return 0 +} + +func (m *IpStatistics) GetInDelivers() int64 { + if m != nil && m.InDelivers != nil { + return *m.InDelivers + } + return 0 +} + +func (m *IpStatistics) GetOutRequests() int64 { + if m != nil && m.OutRequests != nil { + return *m.OutRequests + } + return 0 +} + +func (m *IpStatistics) GetOutDiscards() int64 { + if m != nil && m.OutDiscards != nil { + return *m.OutDiscards + } + return 0 +} + +func (m *IpStatistics) GetOutNoRoutes() int64 { + if m != nil && m.OutNoRoutes != nil { + return *m.OutNoRoutes + } + return 0 +} + +func (m *IpStatistics) GetReasmTimeout() int64 { + if m != nil && m.ReasmTimeout != nil { + return *m.ReasmTimeout + } + return 0 +} + +func (m *IpStatistics) GetReasmReqds() int64 { + if m != nil && m.ReasmReqds != nil { + return *m.ReasmReqds + } + return 0 +} + +func (m *IpStatistics) GetReasmOKs() int64 { + if m != nil && m.ReasmOKs != nil { + return *m.ReasmOKs + } + return 0 +} + +func (m *IpStatistics) GetReasmFails() int64 { + if m != nil && m.ReasmFails != nil { + return *m.ReasmFails + } + return 0 +} + +func (m *IpStatistics) GetFragOKs() int64 { + if m != nil && m.FragOKs != nil { + return *m.FragOKs + } + return 0 +} + +func (m *IpStatistics) GetFragFails() int64 { + if m != nil && m.FragFails != nil { + return *m.FragFails + } + return 0 +} + +func (m *IpStatistics) GetFragCreates() int64 { + if m != nil && m.FragCreates != nil { + return *m.FragCreates + } + return 0 +} + +type IcmpStatistics struct { + InMsgs *int64 `protobuf:"varint,1,opt,name=InMsgs" json:"InMsgs,omitempty"` + InErrors *int64 `protobuf:"varint,2,opt,name=InErrors" json:"InErrors,omitempty"` + InCsumErrors *int64 `protobuf:"varint,3,opt,name=InCsumErrors" json:"InCsumErrors,omitempty"` + InDestUnreachs *int64 `protobuf:"varint,4,opt,name=InDestUnreachs" json:"InDestUnreachs,omitempty"` + InTimeExcds *int64 `protobuf:"varint,5,opt,name=InTimeExcds" json:"InTimeExcds,omitempty"` + InParmProbs *int64 `protobuf:"varint,6,opt,name=InParmProbs" json:"InParmProbs,omitempty"` + InSrcQuenchs *int64 `protobuf:"varint,7,opt,name=InSrcQuenchs" json:"InSrcQuenchs,omitempty"` + InRedirects *int64 `protobuf:"varint,8,opt,name=InRedirects" json:"InRedirects,omitempty"` + InEchos *int64 `protobuf:"varint,9,opt,name=InEchos" json:"InEchos,omitempty"` + InEchoReps *int64 `protobuf:"varint,10,opt,name=InEchoReps" json:"InEchoReps,omitempty"` + InTimestamps *int64 `protobuf:"varint,11,opt,name=InTimestamps" json:"InTimestamps,omitempty"` + InTimestampReps *int64 `protobuf:"varint,12,opt,name=InTimestampReps" json:"InTimestampReps,omitempty"` + InAddrMasks *int64 `protobuf:"varint,13,opt,name=InAddrMasks" json:"InAddrMasks,omitempty"` + InAddrMaskReps *int64 `protobuf:"varint,14,opt,name=InAddrMaskReps" json:"InAddrMaskReps,omitempty"` + OutMsgs *int64 `protobuf:"varint,15,opt,name=OutMsgs" json:"OutMsgs,omitempty"` + OutErrors *int64 `protobuf:"varint,16,opt,name=OutErrors" json:"OutErrors,omitempty"` + OutDestUnreachs *int64 `protobuf:"varint,17,opt,name=OutDestUnreachs" json:"OutDestUnreachs,omitempty"` + OutTimeExcds *int64 `protobuf:"varint,18,opt,name=OutTimeExcds" json:"OutTimeExcds,omitempty"` + OutParmProbs *int64 `protobuf:"varint,19,opt,name=OutParmProbs" json:"OutParmProbs,omitempty"` + OutSrcQuenchs *int64 `protobuf:"varint,20,opt,name=OutSrcQuenchs" json:"OutSrcQuenchs,omitempty"` + OutRedirects *int64 `protobuf:"varint,21,opt,name=OutRedirects" json:"OutRedirects,omitempty"` + OutEchos *int64 `protobuf:"varint,22,opt,name=OutEchos" json:"OutEchos,omitempty"` + OutEchoReps *int64 `protobuf:"varint,23,opt,name=OutEchoReps" json:"OutEchoReps,omitempty"` + OutTimestamps *int64 `protobuf:"varint,24,opt,name=OutTimestamps" json:"OutTimestamps,omitempty"` + OutTimestampReps *int64 `protobuf:"varint,25,opt,name=OutTimestampReps" json:"OutTimestampReps,omitempty"` + OutAddrMasks *int64 `protobuf:"varint,26,opt,name=OutAddrMasks" json:"OutAddrMasks,omitempty"` + OutAddrMaskReps *int64 `protobuf:"varint,27,opt,name=OutAddrMaskReps" json:"OutAddrMaskReps,omitempty"` +} + +func (m *IcmpStatistics) Reset() { *m = IcmpStatistics{} } +func (*IcmpStatistics) ProtoMessage() {} +func (*IcmpStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{32} } + +func (m *IcmpStatistics) GetInMsgs() int64 { + if m != nil && m.InMsgs != nil { + return *m.InMsgs + } + return 0 +} + +func (m *IcmpStatistics) GetInErrors() int64 { + if m != nil && m.InErrors != nil { + return *m.InErrors + } + return 0 +} + +func (m *IcmpStatistics) GetInCsumErrors() int64 { + if m != nil && m.InCsumErrors != nil { + return *m.InCsumErrors + } + return 0 +} + +func (m *IcmpStatistics) GetInDestUnreachs() int64 { + if m != nil && m.InDestUnreachs != nil { + return *m.InDestUnreachs + } + return 0 +} + +func (m *IcmpStatistics) GetInTimeExcds() int64 { + if m != nil && m.InTimeExcds != nil { + return *m.InTimeExcds + } + return 0 +} + +func (m *IcmpStatistics) GetInParmProbs() int64 { + if m != nil && m.InParmProbs != nil { + return *m.InParmProbs + } + return 0 +} + +func (m *IcmpStatistics) GetInSrcQuenchs() int64 { + if m != nil && m.InSrcQuenchs != nil { + return *m.InSrcQuenchs + } + return 0 +} + +func (m *IcmpStatistics) GetInRedirects() int64 { + if m != nil && m.InRedirects != nil { + return *m.InRedirects + } + return 0 +} + +func (m *IcmpStatistics) GetInEchos() int64 { + if m != nil && m.InEchos != nil { + return *m.InEchos + } + return 0 +} + +func (m *IcmpStatistics) GetInEchoReps() int64 { + if m != nil && m.InEchoReps != nil { + return *m.InEchoReps + } + return 0 +} + +func (m *IcmpStatistics) GetInTimestamps() int64 { + if m != nil && m.InTimestamps != nil { + return *m.InTimestamps + } + return 0 +} + +func (m *IcmpStatistics) GetInTimestampReps() int64 { + if m != nil && m.InTimestampReps != nil { + return *m.InTimestampReps + } + return 0 +} + +func (m *IcmpStatistics) GetInAddrMasks() int64 { + if m != nil && m.InAddrMasks != nil { + return *m.InAddrMasks + } + return 0 +} + +func (m *IcmpStatistics) GetInAddrMaskReps() int64 { + if m != nil && m.InAddrMaskReps != nil { + return *m.InAddrMaskReps + } + return 0 +} + +func (m *IcmpStatistics) GetOutMsgs() int64 { + if m != nil && m.OutMsgs != nil { + return *m.OutMsgs + } + return 0 +} + +func (m *IcmpStatistics) GetOutErrors() int64 { + if m != nil && m.OutErrors != nil { + return *m.OutErrors + } + return 0 +} + +func (m *IcmpStatistics) GetOutDestUnreachs() int64 { + if m != nil && m.OutDestUnreachs != nil { + return *m.OutDestUnreachs + } + return 0 +} + +func (m *IcmpStatistics) GetOutTimeExcds() int64 { + if m != nil && m.OutTimeExcds != nil { + return *m.OutTimeExcds + } + return 0 +} + +func (m *IcmpStatistics) GetOutParmProbs() int64 { + if m != nil && m.OutParmProbs != nil { + return *m.OutParmProbs + } + return 0 +} + +func (m *IcmpStatistics) GetOutSrcQuenchs() int64 { + if m != nil && m.OutSrcQuenchs != nil { + return *m.OutSrcQuenchs + } + return 0 +} + +func (m *IcmpStatistics) GetOutRedirects() int64 { + if m != nil && m.OutRedirects != nil { + return *m.OutRedirects + } + return 0 +} + +func (m *IcmpStatistics) GetOutEchos() int64 { + if m != nil && m.OutEchos != nil { + return *m.OutEchos + } + return 0 +} + +func (m *IcmpStatistics) GetOutEchoReps() int64 { + if m != nil && m.OutEchoReps != nil { + return *m.OutEchoReps + } + return 0 +} + +func (m *IcmpStatistics) GetOutTimestamps() int64 { + if m != nil && m.OutTimestamps != nil { + return *m.OutTimestamps + } + return 0 +} + +func (m *IcmpStatistics) GetOutTimestampReps() int64 { + if m != nil && m.OutTimestampReps != nil { + return *m.OutTimestampReps + } + return 0 +} + +func (m *IcmpStatistics) GetOutAddrMasks() int64 { + if m != nil && m.OutAddrMasks != nil { + return *m.OutAddrMasks + } + return 0 +} + +func (m *IcmpStatistics) GetOutAddrMaskReps() int64 { + if m != nil && m.OutAddrMaskReps != nil { + return *m.OutAddrMaskReps + } + return 0 +} + +type TcpStatistics struct { + RtoAlgorithm *int64 `protobuf:"varint,1,opt,name=RtoAlgorithm" json:"RtoAlgorithm,omitempty"` + RtoMin *int64 `protobuf:"varint,2,opt,name=RtoMin" json:"RtoMin,omitempty"` + RtoMax *int64 `protobuf:"varint,3,opt,name=RtoMax" json:"RtoMax,omitempty"` + MaxConn *int64 `protobuf:"varint,4,opt,name=MaxConn" json:"MaxConn,omitempty"` + ActiveOpens *int64 `protobuf:"varint,5,opt,name=ActiveOpens" json:"ActiveOpens,omitempty"` + PassiveOpens *int64 `protobuf:"varint,6,opt,name=PassiveOpens" json:"PassiveOpens,omitempty"` + AttemptFails *int64 `protobuf:"varint,7,opt,name=AttemptFails" json:"AttemptFails,omitempty"` + EstabResets *int64 `protobuf:"varint,8,opt,name=EstabResets" json:"EstabResets,omitempty"` + CurrEstab *int64 `protobuf:"varint,9,opt,name=CurrEstab" json:"CurrEstab,omitempty"` + InSegs *int64 `protobuf:"varint,10,opt,name=InSegs" json:"InSegs,omitempty"` + OutSegs *int64 `protobuf:"varint,11,opt,name=OutSegs" json:"OutSegs,omitempty"` + RetransSegs *int64 `protobuf:"varint,12,opt,name=RetransSegs" json:"RetransSegs,omitempty"` + InErrs *int64 `protobuf:"varint,13,opt,name=InErrs" json:"InErrs,omitempty"` + OutRsts *int64 `protobuf:"varint,14,opt,name=OutRsts" json:"OutRsts,omitempty"` + InCsumErrors *int64 `protobuf:"varint,15,opt,name=InCsumErrors" json:"InCsumErrors,omitempty"` +} + +func (m *TcpStatistics) Reset() { *m = TcpStatistics{} } +func (*TcpStatistics) ProtoMessage() {} +func (*TcpStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{33} } + +func (m *TcpStatistics) GetRtoAlgorithm() int64 { + if m != nil && m.RtoAlgorithm != nil { + return *m.RtoAlgorithm + } + return 0 +} + +func (m *TcpStatistics) GetRtoMin() int64 { + if m != nil && m.RtoMin != nil { + return *m.RtoMin + } + return 0 +} + +func (m *TcpStatistics) GetRtoMax() int64 { + if m != nil && m.RtoMax != nil { + return *m.RtoMax + } + return 0 +} + +func (m *TcpStatistics) GetMaxConn() int64 { + if m != nil && m.MaxConn != nil { + return *m.MaxConn + } + return 0 +} + +func (m *TcpStatistics) GetActiveOpens() int64 { + if m != nil && m.ActiveOpens != nil { + return *m.ActiveOpens + } + return 0 +} + +func (m *TcpStatistics) GetPassiveOpens() int64 { + if m != nil && m.PassiveOpens != nil { + return *m.PassiveOpens + } + return 0 +} + +func (m *TcpStatistics) GetAttemptFails() int64 { + if m != nil && m.AttemptFails != nil { + return *m.AttemptFails + } + return 0 +} + +func (m *TcpStatistics) GetEstabResets() int64 { + if m != nil && m.EstabResets != nil { + return *m.EstabResets + } + return 0 +} + +func (m *TcpStatistics) GetCurrEstab() int64 { + if m != nil && m.CurrEstab != nil { + return *m.CurrEstab + } + return 0 +} + +func (m *TcpStatistics) GetInSegs() int64 { + if m != nil && m.InSegs != nil { + return *m.InSegs + } + return 0 +} + +func (m *TcpStatistics) GetOutSegs() int64 { + if m != nil && m.OutSegs != nil { + return *m.OutSegs + } + return 0 +} + +func (m *TcpStatistics) GetRetransSegs() int64 { + if m != nil && m.RetransSegs != nil { + return *m.RetransSegs + } + return 0 +} + +func (m *TcpStatistics) GetInErrs() int64 { + if m != nil && m.InErrs != nil { + return *m.InErrs + } + return 0 +} + +func (m *TcpStatistics) GetOutRsts() int64 { + if m != nil && m.OutRsts != nil { + return *m.OutRsts + } + return 0 +} + +func (m *TcpStatistics) GetInCsumErrors() int64 { + if m != nil && m.InCsumErrors != nil { + return *m.InCsumErrors + } + return 0 +} + +type UdpStatistics struct { + InDatagrams *int64 `protobuf:"varint,1,opt,name=InDatagrams" json:"InDatagrams,omitempty"` + NoPorts *int64 `protobuf:"varint,2,opt,name=NoPorts" json:"NoPorts,omitempty"` + InErrors *int64 `protobuf:"varint,3,opt,name=InErrors" json:"InErrors,omitempty"` + OutDatagrams *int64 `protobuf:"varint,4,opt,name=OutDatagrams" json:"OutDatagrams,omitempty"` + RcvbufErrors *int64 `protobuf:"varint,5,opt,name=RcvbufErrors" json:"RcvbufErrors,omitempty"` + SndbufErrors *int64 `protobuf:"varint,6,opt,name=SndbufErrors" json:"SndbufErrors,omitempty"` + InCsumErrors *int64 `protobuf:"varint,7,opt,name=InCsumErrors" json:"InCsumErrors,omitempty"` + IgnoredMulti *int64 `protobuf:"varint,8,opt,name=IgnoredMulti" json:"IgnoredMulti,omitempty"` +} + +func (m *UdpStatistics) Reset() { *m = UdpStatistics{} } +func (*UdpStatistics) ProtoMessage() {} +func (*UdpStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{34} } + +func (m *UdpStatistics) GetInDatagrams() int64 { + if m != nil && m.InDatagrams != nil { + return *m.InDatagrams + } + return 0 +} + +func (m *UdpStatistics) GetNoPorts() int64 { + if m != nil && m.NoPorts != nil { + return *m.NoPorts + } + return 0 +} + +func (m *UdpStatistics) GetInErrors() int64 { + if m != nil && m.InErrors != nil { + return *m.InErrors + } + return 0 +} + +func (m *UdpStatistics) GetOutDatagrams() int64 { + if m != nil && m.OutDatagrams != nil { + return *m.OutDatagrams + } + return 0 +} + +func (m *UdpStatistics) GetRcvbufErrors() int64 { + if m != nil && m.RcvbufErrors != nil { + return *m.RcvbufErrors + } + return 0 +} + +func (m *UdpStatistics) GetSndbufErrors() int64 { + if m != nil && m.SndbufErrors != nil { + return *m.SndbufErrors + } + return 0 +} + +func (m *UdpStatistics) GetInCsumErrors() int64 { + if m != nil && m.InCsumErrors != nil { + return *m.InCsumErrors + } + return 0 +} + +func (m *UdpStatistics) GetIgnoredMulti() int64 { + if m != nil && m.IgnoredMulti != nil { + return *m.IgnoredMulti + } + return 0 +} + +type SNMPStatistics struct { + IPStats *IpStatistics `protobuf:"bytes,1,opt,name=ip_stats,json=ipStats" json:"ip_stats,omitempty"` + ICMPStats *IcmpStatistics `protobuf:"bytes,2,opt,name=icmp_stats,json=icmpStats" json:"icmp_stats,omitempty"` + TCPStats *TcpStatistics `protobuf:"bytes,3,opt,name=tcp_stats,json=tcpStats" json:"tcp_stats,omitempty"` + UDPStats *UdpStatistics `protobuf:"bytes,4,opt,name=udp_stats,json=udpStats" json:"udp_stats,omitempty"` +} + +func (m *SNMPStatistics) Reset() { *m = SNMPStatistics{} } +func (*SNMPStatistics) ProtoMessage() {} +func (*SNMPStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{35} } + +func (m *SNMPStatistics) GetIPStats() *IpStatistics { + if m != nil { + return m.IPStats + } + return nil +} + +func (m *SNMPStatistics) GetICMPStats() *IcmpStatistics { + if m != nil { + return m.ICMPStats + } + return nil +} + +func (m *SNMPStatistics) GetTCPStats() *TcpStatistics { + if m != nil { + return m.TCPStats + } + return nil +} + +func (m *SNMPStatistics) GetUDPStats() *UdpStatistics { + if m != nil { + return m.UDPStats + } + return nil +} + +type DiskStatistics struct { + Source *Resource_DiskInfo_Source `protobuf:"bytes,1,opt,name=source" json:"source,omitempty"` + Persistence *Resource_DiskInfo_Persistence `protobuf:"bytes,2,opt,name=persistence" json:"persistence,omitempty"` + LimitBytes *uint64 `protobuf:"varint,3,opt,name=limit_bytes,json=limitBytes" json:"limit_bytes,omitempty"` + UsedBytes *uint64 `protobuf:"varint,4,opt,name=used_bytes,json=usedBytes" json:"used_bytes,omitempty"` +} + +func (m *DiskStatistics) Reset() { *m = DiskStatistics{} } +func (*DiskStatistics) ProtoMessage() {} +func (*DiskStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{36} } + +func (m *DiskStatistics) GetSource() *Resource_DiskInfo_Source { + if m != nil { + return m.Source + } + return nil +} + +func (m *DiskStatistics) GetPersistence() *Resource_DiskInfo_Persistence { + if m != nil { + return m.Persistence + } + return nil +} + +func (m *DiskStatistics) GetLimitBytes() uint64 { + if m != nil && m.LimitBytes != nil { + return *m.LimitBytes + } + return 0 +} + +func (m *DiskStatistics) GetUsedBytes() uint64 { + if m != nil && m.UsedBytes != nil { + return *m.UsedBytes + } + return 0 +} + +// * +// A snapshot of resource usage statistics. +type ResourceStatistics struct { + Timestamp float64 `protobuf:"fixed64,1,req,name=timestamp" json:"timestamp"` + Processes *uint32 `protobuf:"varint,30,opt,name=processes" json:"processes,omitempty"` + Threads *uint32 `protobuf:"varint,31,opt,name=threads" json:"threads,omitempty"` + // CPU Usage Information: + // Total CPU time spent in user mode, and kernel mode. + CPUsUserTimeSecs *float64 `protobuf:"fixed64,2,opt,name=cpus_user_time_secs,json=cpusUserTimeSecs" json:"cpus_user_time_secs,omitempty"` + CPUsSystemTimeSecs *float64 `protobuf:"fixed64,3,opt,name=cpus_system_time_secs,json=cpusSystemTimeSecs" json:"cpus_system_time_secs,omitempty"` + // Number of CPUs allocated. + CPUsLimit *float64 `protobuf:"fixed64,4,opt,name=cpus_limit,json=cpusLimit" json:"cpus_limit,omitempty"` + // cpu.stat on process throttling (for contention issues). + CPUsNrPeriods *uint32 `protobuf:"varint,7,opt,name=cpus_nr_periods,json=cpusNrPeriods" json:"cpus_nr_periods,omitempty"` + CPUsNrThrottled *uint32 `protobuf:"varint,8,opt,name=cpus_nr_throttled,json=cpusNrThrottled" json:"cpus_nr_throttled,omitempty"` + CPUsThrottledTimeSecs *float64 `protobuf:"fixed64,9,opt,name=cpus_throttled_time_secs,json=cpusThrottledTimeSecs" json:"cpus_throttled_time_secs,omitempty"` + // mem_total_bytes was added in 0.23.0 to represent the total memory + // of a process in RAM (as opposed to in Swap). This was previously + // reported as mem_rss_bytes, which was also changed in 0.23.0 to + // represent only the anonymous memory usage, to keep in sync with + // Linux kernel's (arguably erroneous) use of terminology. + MemTotalBytes *uint64 `protobuf:"varint,36,opt,name=mem_total_bytes,json=memTotalBytes" json:"mem_total_bytes,omitempty"` + // Total memory + swap usage. This is set if swap is enabled. + MemTotalMemswBytes *uint64 `protobuf:"varint,37,opt,name=mem_total_memsw_bytes,json=memTotalMemswBytes" json:"mem_total_memsw_bytes,omitempty"` + // Hard memory limit for a container. + MemLimitBytes *uint64 `protobuf:"varint,6,opt,name=mem_limit_bytes,json=memLimitBytes" json:"mem_limit_bytes,omitempty"` + // Soft memory limit for a container. + MemSoftLimitBytes *uint64 `protobuf:"varint,38,opt,name=mem_soft_limit_bytes,json=memSoftLimitBytes" json:"mem_soft_limit_bytes,omitempty"` + // TODO(chzhcn) mem_file_bytes and mem_anon_bytes are deprecated in + // 0.23.0 and will be removed in 0.24.0. + MemFileBytes *uint64 `protobuf:"varint,10,opt,name=mem_file_bytes,json=memFileBytes" json:"mem_file_bytes,omitempty"` + MemAnonBytes *uint64 `protobuf:"varint,11,opt,name=mem_anon_bytes,json=memAnonBytes" json:"mem_anon_bytes,omitempty"` + // mem_cache_bytes is added in 0.23.0 to represent page cache usage. + MemCacheBytes *uint64 `protobuf:"varint,39,opt,name=mem_cache_bytes,json=memCacheBytes" json:"mem_cache_bytes,omitempty"` + // Since 0.23.0, mem_rss_bytes is changed to represent only + // anonymous memory usage. Note that neither its requiredness, type, + // name nor numeric tag has been changed. + MemRSSBytes *uint64 `protobuf:"varint,5,opt,name=mem_rss_bytes,json=memRssBytes" json:"mem_rss_bytes,omitempty"` + MemMappedFileBytes *uint64 `protobuf:"varint,12,opt,name=mem_mapped_file_bytes,json=memMappedFileBytes" json:"mem_mapped_file_bytes,omitempty"` + // This is only set if swap is enabled. + MemSwapBytes *uint64 `protobuf:"varint,40,opt,name=mem_swap_bytes,json=memSwapBytes" json:"mem_swap_bytes,omitempty"` + MemUnevictableBytes *uint64 `protobuf:"varint,41,opt,name=mem_unevictable_bytes,json=memUnevictableBytes" json:"mem_unevictable_bytes,omitempty"` + // Number of occurrences of different levels of memory pressure + // events reported by memory cgroup. Pressure listening (re)starts + // with these values set to 0 when agent (re)starts. See + // https://www.kernel.org/doc/Documentation/cgroups/memory.txt for + // more details. + MemLowPressureCounter *uint64 `protobuf:"varint,32,opt,name=mem_low_pressure_counter,json=memLowPressureCounter" json:"mem_low_pressure_counter,omitempty"` + MemMediumPressureCounter *uint64 `protobuf:"varint,33,opt,name=mem_medium_pressure_counter,json=memMediumPressureCounter" json:"mem_medium_pressure_counter,omitempty"` + MemCriticalPressureCounter *uint64 `protobuf:"varint,34,opt,name=mem_critical_pressure_counter,json=memCriticalPressureCounter" json:"mem_critical_pressure_counter,omitempty"` + // Disk Usage Information for executor working directory. + DiskLimitBytes *uint64 `protobuf:"varint,26,opt,name=disk_limit_bytes,json=diskLimitBytes" json:"disk_limit_bytes,omitempty"` + DiskUsedBytes *uint64 `protobuf:"varint,27,opt,name=disk_used_bytes,json=diskUsedBytes" json:"disk_used_bytes,omitempty"` + // Per disk (resource) statistics. + DiskStatistics []DiskStatistics `protobuf:"bytes,43,rep,name=disk_statistics,json=diskStatistics" json:"disk_statistics"` + // Cgroups blkio statistics. + BlkioStatistics *CgroupInfo_Blkio_Statistics `protobuf:"bytes,44,opt,name=blkio_statistics,json=blkioStatistics" json:"blkio_statistics,omitempty"` + // Perf statistics. + Perf *PerfStatistics `protobuf:"bytes,13,opt,name=perf" json:"perf,omitempty"` + // Network Usage Information: + NetRxPackets *uint64 `protobuf:"varint,14,opt,name=net_rx_packets,json=netRxPackets" json:"net_rx_packets,omitempty"` + NetRxBytes *uint64 `protobuf:"varint,15,opt,name=net_rx_bytes,json=netRxBytes" json:"net_rx_bytes,omitempty"` + NetRxErrors *uint64 `protobuf:"varint,16,opt,name=net_rx_errors,json=netRxErrors" json:"net_rx_errors,omitempty"` + NetRxDropped *uint64 `protobuf:"varint,17,opt,name=net_rx_dropped,json=netRxDropped" json:"net_rx_dropped,omitempty"` + NetTxPackets *uint64 `protobuf:"varint,18,opt,name=net_tx_packets,json=netTxPackets" json:"net_tx_packets,omitempty"` + NetTxBytes *uint64 `protobuf:"varint,19,opt,name=net_tx_bytes,json=netTxBytes" json:"net_tx_bytes,omitempty"` + NetTxErrors *uint64 `protobuf:"varint,20,opt,name=net_tx_errors,json=netTxErrors" json:"net_tx_errors,omitempty"` + NetTxDropped *uint64 `protobuf:"varint,21,opt,name=net_tx_dropped,json=netTxDropped" json:"net_tx_dropped,omitempty"` + // The kernel keeps track of RTT (round-trip time) for its TCP + // sockets. RTT is a way to tell the latency of a container. + NetTCPRttMicrosecsP50 *float64 `protobuf:"fixed64,22,opt,name=net_tcp_rtt_microsecs_p50,json=netTcpRttMicrosecsP50" json:"net_tcp_rtt_microsecs_p50,omitempty"` + NetTCPRttMicrosecsP90 *float64 `protobuf:"fixed64,23,opt,name=net_tcp_rtt_microsecs_p90,json=netTcpRttMicrosecsP90" json:"net_tcp_rtt_microsecs_p90,omitempty"` + NetTCPRttMicrosecsP95 *float64 `protobuf:"fixed64,24,opt,name=net_tcp_rtt_microsecs_p95,json=netTcpRttMicrosecsP95" json:"net_tcp_rtt_microsecs_p95,omitempty"` + NetTCPRttMicrosecsP99 *float64 `protobuf:"fixed64,25,opt,name=net_tcp_rtt_microsecs_p99,json=netTcpRttMicrosecsP99" json:"net_tcp_rtt_microsecs_p99,omitempty"` + NetTCPActiveConnections *float64 `protobuf:"fixed64,28,opt,name=net_tcp_active_connections,json=netTcpActiveConnections" json:"net_tcp_active_connections,omitempty"` + NetTCPTimeWaitConnections *float64 `protobuf:"fixed64,29,opt,name=net_tcp_time_wait_connections,json=netTcpTimeWaitConnections" json:"net_tcp_time_wait_connections,omitempty"` + // Network traffic flowing into or out of a container can be delayed + // or dropped due to congestion or policy inside and outside the + // container. + NetTrafficControlStatistics []TrafficControlStatistics `protobuf:"bytes,35,rep,name=net_traffic_control_statistics,json=netTrafficControlStatistics" json:"net_traffic_control_statistics"` + // Network SNMP statistics for each container. + NetSNMPStatistics *SNMPStatistics `protobuf:"bytes,42,opt,name=net_snmp_statistics,json=netSnmpStatistics" json:"net_snmp_statistics,omitempty"` +} + +func (m *ResourceStatistics) Reset() { *m = ResourceStatistics{} } +func (*ResourceStatistics) ProtoMessage() {} +func (*ResourceStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{37} } + +func (m *ResourceStatistics) GetTimestamp() float64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *ResourceStatistics) GetProcesses() uint32 { + if m != nil && m.Processes != nil { + return *m.Processes + } + return 0 +} + +func (m *ResourceStatistics) GetThreads() uint32 { + if m != nil && m.Threads != nil { + return *m.Threads + } + return 0 +} + +func (m *ResourceStatistics) GetCPUsUserTimeSecs() float64 { + if m != nil && m.CPUsUserTimeSecs != nil { + return *m.CPUsUserTimeSecs + } + return 0 +} + +func (m *ResourceStatistics) GetCPUsSystemTimeSecs() float64 { + if m != nil && m.CPUsSystemTimeSecs != nil { + return *m.CPUsSystemTimeSecs + } + return 0 +} + +func (m *ResourceStatistics) GetCPUsLimit() float64 { + if m != nil && m.CPUsLimit != nil { + return *m.CPUsLimit + } + return 0 +} + +func (m *ResourceStatistics) GetCPUsNrPeriods() uint32 { + if m != nil && m.CPUsNrPeriods != nil { + return *m.CPUsNrPeriods + } + return 0 +} + +func (m *ResourceStatistics) GetCPUsNrThrottled() uint32 { + if m != nil && m.CPUsNrThrottled != nil { + return *m.CPUsNrThrottled + } + return 0 +} + +func (m *ResourceStatistics) GetCPUsThrottledTimeSecs() float64 { + if m != nil && m.CPUsThrottledTimeSecs != nil { + return *m.CPUsThrottledTimeSecs + } + return 0 +} + +func (m *ResourceStatistics) GetMemTotalBytes() uint64 { + if m != nil && m.MemTotalBytes != nil { + return *m.MemTotalBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemTotalMemswBytes() uint64 { + if m != nil && m.MemTotalMemswBytes != nil { + return *m.MemTotalMemswBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemLimitBytes() uint64 { + if m != nil && m.MemLimitBytes != nil { + return *m.MemLimitBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemSoftLimitBytes() uint64 { + if m != nil && m.MemSoftLimitBytes != nil { + return *m.MemSoftLimitBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemFileBytes() uint64 { + if m != nil && m.MemFileBytes != nil { + return *m.MemFileBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemAnonBytes() uint64 { + if m != nil && m.MemAnonBytes != nil { + return *m.MemAnonBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemCacheBytes() uint64 { + if m != nil && m.MemCacheBytes != nil { + return *m.MemCacheBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemRSSBytes() uint64 { + if m != nil && m.MemRSSBytes != nil { + return *m.MemRSSBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemMappedFileBytes() uint64 { + if m != nil && m.MemMappedFileBytes != nil { + return *m.MemMappedFileBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemSwapBytes() uint64 { + if m != nil && m.MemSwapBytes != nil { + return *m.MemSwapBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemUnevictableBytes() uint64 { + if m != nil && m.MemUnevictableBytes != nil { + return *m.MemUnevictableBytes + } + return 0 +} + +func (m *ResourceStatistics) GetMemLowPressureCounter() uint64 { + if m != nil && m.MemLowPressureCounter != nil { + return *m.MemLowPressureCounter + } + return 0 +} + +func (m *ResourceStatistics) GetMemMediumPressureCounter() uint64 { + if m != nil && m.MemMediumPressureCounter != nil { + return *m.MemMediumPressureCounter + } + return 0 +} + +func (m *ResourceStatistics) GetMemCriticalPressureCounter() uint64 { + if m != nil && m.MemCriticalPressureCounter != nil { + return *m.MemCriticalPressureCounter + } + return 0 +} + +func (m *ResourceStatistics) GetDiskLimitBytes() uint64 { + if m != nil && m.DiskLimitBytes != nil { + return *m.DiskLimitBytes + } + return 0 +} + +func (m *ResourceStatistics) GetDiskUsedBytes() uint64 { + if m != nil && m.DiskUsedBytes != nil { + return *m.DiskUsedBytes + } + return 0 +} + +func (m *ResourceStatistics) GetDiskStatistics() []DiskStatistics { + if m != nil { + return m.DiskStatistics + } + return nil +} + +func (m *ResourceStatistics) GetBlkioStatistics() *CgroupInfo_Blkio_Statistics { + if m != nil { + return m.BlkioStatistics + } + return nil +} + +func (m *ResourceStatistics) GetPerf() *PerfStatistics { + if m != nil { + return m.Perf + } + return nil +} + +func (m *ResourceStatistics) GetNetRxPackets() uint64 { + if m != nil && m.NetRxPackets != nil { + return *m.NetRxPackets + } + return 0 +} + +func (m *ResourceStatistics) GetNetRxBytes() uint64 { + if m != nil && m.NetRxBytes != nil { + return *m.NetRxBytes + } + return 0 +} + +func (m *ResourceStatistics) GetNetRxErrors() uint64 { + if m != nil && m.NetRxErrors != nil { + return *m.NetRxErrors + } + return 0 +} + +func (m *ResourceStatistics) GetNetRxDropped() uint64 { + if m != nil && m.NetRxDropped != nil { + return *m.NetRxDropped + } + return 0 +} + +func (m *ResourceStatistics) GetNetTxPackets() uint64 { + if m != nil && m.NetTxPackets != nil { + return *m.NetTxPackets + } + return 0 +} + +func (m *ResourceStatistics) GetNetTxBytes() uint64 { + if m != nil && m.NetTxBytes != nil { + return *m.NetTxBytes + } + return 0 +} + +func (m *ResourceStatistics) GetNetTxErrors() uint64 { + if m != nil && m.NetTxErrors != nil { + return *m.NetTxErrors + } + return 0 +} + +func (m *ResourceStatistics) GetNetTxDropped() uint64 { + if m != nil && m.NetTxDropped != nil { + return *m.NetTxDropped + } + return 0 +} + +func (m *ResourceStatistics) GetNetTCPRttMicrosecsP50() float64 { + if m != nil && m.NetTCPRttMicrosecsP50 != nil { + return *m.NetTCPRttMicrosecsP50 + } + return 0 +} + +func (m *ResourceStatistics) GetNetTCPRttMicrosecsP90() float64 { + if m != nil && m.NetTCPRttMicrosecsP90 != nil { + return *m.NetTCPRttMicrosecsP90 + } + return 0 +} + +func (m *ResourceStatistics) GetNetTCPRttMicrosecsP95() float64 { + if m != nil && m.NetTCPRttMicrosecsP95 != nil { + return *m.NetTCPRttMicrosecsP95 + } + return 0 +} + +func (m *ResourceStatistics) GetNetTCPRttMicrosecsP99() float64 { + if m != nil && m.NetTCPRttMicrosecsP99 != nil { + return *m.NetTCPRttMicrosecsP99 + } + return 0 +} + +func (m *ResourceStatistics) GetNetTCPActiveConnections() float64 { + if m != nil && m.NetTCPActiveConnections != nil { + return *m.NetTCPActiveConnections + } + return 0 +} + +func (m *ResourceStatistics) GetNetTCPTimeWaitConnections() float64 { + if m != nil && m.NetTCPTimeWaitConnections != nil { + return *m.NetTCPTimeWaitConnections + } + return 0 +} + +func (m *ResourceStatistics) GetNetTrafficControlStatistics() []TrafficControlStatistics { + if m != nil { + return m.NetTrafficControlStatistics + } + return nil +} + +func (m *ResourceStatistics) GetNetSNMPStatistics() *SNMPStatistics { + if m != nil { + return m.NetSNMPStatistics + } + return nil +} + +// * +// Describes a snapshot of the resource usage for executors. +type ResourceUsage struct { + Executors []ResourceUsage_Executor `protobuf:"bytes,1,rep,name=executors" json:"executors"` + // Agent's total resources including checkpointed dynamic + // reservations and persistent volumes. + Total []Resource `protobuf:"bytes,2,rep,name=total" json:"total"` +} + +func (m *ResourceUsage) Reset() { *m = ResourceUsage{} } +func (*ResourceUsage) ProtoMessage() {} +func (*ResourceUsage) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{38} } + +func (m *ResourceUsage) GetExecutors() []ResourceUsage_Executor { + if m != nil { + return m.Executors + } + return nil +} + +func (m *ResourceUsage) GetTotal() []Resource { + if m != nil { + return m.Total + } + return nil +} + +type ResourceUsage_Executor struct { + ExecutorInfo ExecutorInfo `protobuf:"bytes,1,req,name=executor_info,json=executorInfo" json:"executor_info"` + // This includes resources used by the executor itself + // as well as its active tasks. + Allocated []Resource `protobuf:"bytes,2,rep,name=allocated" json:"allocated"` + // Current resource usage. If absent, the containerizer + // cannot provide resource usage. + Statistics *ResourceStatistics `protobuf:"bytes,3,opt,name=statistics" json:"statistics,omitempty"` + // The container id for the executor specified in the executor_info field. + ContainerID ContainerID `protobuf:"bytes,4,req,name=container_id,json=containerId" json:"container_id"` + // Non-terminal tasks. + Tasks []ResourceUsage_Executor_Task `protobuf:"bytes,5,rep,name=tasks" json:"tasks"` +} + +func (m *ResourceUsage_Executor) Reset() { *m = ResourceUsage_Executor{} } +func (*ResourceUsage_Executor) ProtoMessage() {} +func (*ResourceUsage_Executor) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{38, 0} } + +func (m *ResourceUsage_Executor) GetExecutorInfo() ExecutorInfo { + if m != nil { + return m.ExecutorInfo + } + return ExecutorInfo{} +} + +func (m *ResourceUsage_Executor) GetAllocated() []Resource { + if m != nil { + return m.Allocated + } + return nil +} + +func (m *ResourceUsage_Executor) GetStatistics() *ResourceStatistics { + if m != nil { + return m.Statistics + } + return nil +} + +func (m *ResourceUsage_Executor) GetContainerID() ContainerID { + if m != nil { + return m.ContainerID + } + return ContainerID{} +} + +func (m *ResourceUsage_Executor) GetTasks() []ResourceUsage_Executor_Task { + if m != nil { + return m.Tasks + } + return nil +} + +type ResourceUsage_Executor_Task struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + ID TaskID `protobuf:"bytes,2,req,name=id" json:"id"` + Resources []Resource `protobuf:"bytes,3,rep,name=resources" json:"resources"` + Labels *Labels `protobuf:"bytes,4,opt,name=labels" json:"labels,omitempty"` +} + +func (m *ResourceUsage_Executor_Task) Reset() { *m = ResourceUsage_Executor_Task{} } +func (*ResourceUsage_Executor_Task) ProtoMessage() {} +func (*ResourceUsage_Executor_Task) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{38, 0, 0} +} + +func (m *ResourceUsage_Executor_Task) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *ResourceUsage_Executor_Task) GetID() TaskID { + if m != nil { + return m.ID + } + return TaskID{} +} + +func (m *ResourceUsage_Executor_Task) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *ResourceUsage_Executor_Task) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +// * +// Describes a sample of events from "perf stat". Only available on +// Linux. +// +// NOTE: Each optional field matches the name of a perf event (see +// "perf list") with the following changes: +// 1. Names are downcased. +// 2. Hyphens ('-') are replaced with underscores ('_'). +// 3. Events with alternate names use the name "perf stat" returns, +// e.g., for the event "cycles OR cpu-cycles" perf always returns +// cycles. +type PerfStatistics struct { + Timestamp float64 `protobuf:"fixed64,1,req,name=timestamp" json:"timestamp"` + Duration float64 `protobuf:"fixed64,2,req,name=duration" json:"duration"` + // Hardware event. + Cycles *uint64 `protobuf:"varint,3,opt,name=cycles" json:"cycles,omitempty"` + StalledCyclesFrontend *uint64 `protobuf:"varint,4,opt,name=stalled_cycles_frontend,json=stalledCyclesFrontend" json:"stalled_cycles_frontend,omitempty"` + StalledCyclesBackend *uint64 `protobuf:"varint,5,opt,name=stalled_cycles_backend,json=stalledCyclesBackend" json:"stalled_cycles_backend,omitempty"` + Instructions *uint64 `protobuf:"varint,6,opt,name=instructions" json:"instructions,omitempty"` + CacheReferences *uint64 `protobuf:"varint,7,opt,name=cache_references,json=cacheReferences" json:"cache_references,omitempty"` + CacheMisses *uint64 `protobuf:"varint,8,opt,name=cache_misses,json=cacheMisses" json:"cache_misses,omitempty"` + Branches *uint64 `protobuf:"varint,9,opt,name=branches" json:"branches,omitempty"` + BranchMisses *uint64 `protobuf:"varint,10,opt,name=branch_misses,json=branchMisses" json:"branch_misses,omitempty"` + BusCycles *uint64 `protobuf:"varint,11,opt,name=bus_cycles,json=busCycles" json:"bus_cycles,omitempty"` + RefCycles *uint64 `protobuf:"varint,12,opt,name=ref_cycles,json=refCycles" json:"ref_cycles,omitempty"` + // Software event. + CPUClock *float64 `protobuf:"fixed64,13,opt,name=cpu_clock,json=cpuClock" json:"cpu_clock,omitempty"` + TaskClock *float64 `protobuf:"fixed64,14,opt,name=task_clock,json=taskClock" json:"task_clock,omitempty"` + PageFaults *uint64 `protobuf:"varint,15,opt,name=page_faults,json=pageFaults" json:"page_faults,omitempty"` + MinorFaults *uint64 `protobuf:"varint,16,opt,name=minor_faults,json=minorFaults" json:"minor_faults,omitempty"` + MajorFaults *uint64 `protobuf:"varint,17,opt,name=major_faults,json=majorFaults" json:"major_faults,omitempty"` + ContextSwitches *uint64 `protobuf:"varint,18,opt,name=context_switches,json=contextSwitches" json:"context_switches,omitempty"` + CPUMigrations *uint64 `protobuf:"varint,19,opt,name=cpu_migrations,json=cpuMigrations" json:"cpu_migrations,omitempty"` + AlignmentFaults *uint64 `protobuf:"varint,20,opt,name=alignment_faults,json=alignmentFaults" json:"alignment_faults,omitempty"` + EmulationFaults *uint64 `protobuf:"varint,21,opt,name=emulation_faults,json=emulationFaults" json:"emulation_faults,omitempty"` + // Hardware cache event. + L1DcacheLoads *uint64 `protobuf:"varint,22,opt,name=l1_dcache_loads,json=l1DcacheLoads" json:"l1_dcache_loads,omitempty"` + L1DcacheLoadMisses *uint64 `protobuf:"varint,23,opt,name=l1_dcache_load_misses,json=l1DcacheLoadMisses" json:"l1_dcache_load_misses,omitempty"` + L1DcacheStores *uint64 `protobuf:"varint,24,opt,name=l1_dcache_stores,json=l1DcacheStores" json:"l1_dcache_stores,omitempty"` + L1DcacheStoreMisses *uint64 `protobuf:"varint,25,opt,name=l1_dcache_store_misses,json=l1DcacheStoreMisses" json:"l1_dcache_store_misses,omitempty"` + L1DcachePrefetches *uint64 `protobuf:"varint,26,opt,name=l1_dcache_prefetches,json=l1DcachePrefetches" json:"l1_dcache_prefetches,omitempty"` + L1DcachePrefetchMisses *uint64 `protobuf:"varint,27,opt,name=l1_dcache_prefetch_misses,json=l1DcachePrefetchMisses" json:"l1_dcache_prefetch_misses,omitempty"` + L1IcacheLoads *uint64 `protobuf:"varint,28,opt,name=l1_icache_loads,json=l1IcacheLoads" json:"l1_icache_loads,omitempty"` + L1IcacheLoadMisses *uint64 `protobuf:"varint,29,opt,name=l1_icache_load_misses,json=l1IcacheLoadMisses" json:"l1_icache_load_misses,omitempty"` + L1IcachePrefetches *uint64 `protobuf:"varint,30,opt,name=l1_icache_prefetches,json=l1IcachePrefetches" json:"l1_icache_prefetches,omitempty"` + L1IcachePrefetchMisses *uint64 `protobuf:"varint,31,opt,name=l1_icache_prefetch_misses,json=l1IcachePrefetchMisses" json:"l1_icache_prefetch_misses,omitempty"` + LLCLoads *uint64 `protobuf:"varint,32,opt,name=llc_loads,json=llcLoads" json:"llc_loads,omitempty"` + LLCLoadMisses *uint64 `protobuf:"varint,33,opt,name=llc_load_misses,json=llcLoadMisses" json:"llc_load_misses,omitempty"` + LLCStores *uint64 `protobuf:"varint,34,opt,name=llc_stores,json=llcStores" json:"llc_stores,omitempty"` + LLCStoreMisses *uint64 `protobuf:"varint,35,opt,name=llc_store_misses,json=llcStoreMisses" json:"llc_store_misses,omitempty"` + LLCPrefetches *uint64 `protobuf:"varint,36,opt,name=llc_prefetches,json=llcPrefetches" json:"llc_prefetches,omitempty"` + LLCPrefetchMisses *uint64 `protobuf:"varint,37,opt,name=llc_prefetch_misses,json=llcPrefetchMisses" json:"llc_prefetch_misses,omitempty"` + DTLBLoads *uint64 `protobuf:"varint,38,opt,name=dtlb_loads,json=dtlbLoads" json:"dtlb_loads,omitempty"` + DTLBLoadMisses *uint64 `protobuf:"varint,39,opt,name=dtlb_load_misses,json=dtlbLoadMisses" json:"dtlb_load_misses,omitempty"` + DTLBStores *uint64 `protobuf:"varint,40,opt,name=dtlb_stores,json=dtlbStores" json:"dtlb_stores,omitempty"` + DTLBStoreMisses *uint64 `protobuf:"varint,41,opt,name=dtlb_store_misses,json=dtlbStoreMisses" json:"dtlb_store_misses,omitempty"` + DTLBPrefetches *uint64 `protobuf:"varint,42,opt,name=dtlb_prefetches,json=dtlbPrefetches" json:"dtlb_prefetches,omitempty"` + DTLBPrefetchMisses *uint64 `protobuf:"varint,43,opt,name=dtlb_prefetch_misses,json=dtlbPrefetchMisses" json:"dtlb_prefetch_misses,omitempty"` + ITLBLoads *uint64 `protobuf:"varint,44,opt,name=itlb_loads,json=itlbLoads" json:"itlb_loads,omitempty"` + ITLBLoadMisses *uint64 `protobuf:"varint,45,opt,name=itlb_load_misses,json=itlbLoadMisses" json:"itlb_load_misses,omitempty"` + BranchLoads *uint64 `protobuf:"varint,46,opt,name=branch_loads,json=branchLoads" json:"branch_loads,omitempty"` + BranchLoadMisses *uint64 `protobuf:"varint,47,opt,name=branch_load_misses,json=branchLoadMisses" json:"branch_load_misses,omitempty"` + NodeLoads *uint64 `protobuf:"varint,48,opt,name=node_loads,json=nodeLoads" json:"node_loads,omitempty"` + NodeLoadMisses *uint64 `protobuf:"varint,49,opt,name=node_load_misses,json=nodeLoadMisses" json:"node_load_misses,omitempty"` + NodeStores *uint64 `protobuf:"varint,50,opt,name=node_stores,json=nodeStores" json:"node_stores,omitempty"` + NodeStoreMisses *uint64 `protobuf:"varint,51,opt,name=node_store_misses,json=nodeStoreMisses" json:"node_store_misses,omitempty"` + NodePrefetches *uint64 `protobuf:"varint,52,opt,name=node_prefetches,json=nodePrefetches" json:"node_prefetches,omitempty"` + NodePrefetchMisses *uint64 `protobuf:"varint,53,opt,name=node_prefetch_misses,json=nodePrefetchMisses" json:"node_prefetch_misses,omitempty"` +} + +func (m *PerfStatistics) Reset() { *m = PerfStatistics{} } +func (*PerfStatistics) ProtoMessage() {} +func (*PerfStatistics) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{39} } + +func (m *PerfStatistics) GetTimestamp() float64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *PerfStatistics) GetDuration() float64 { + if m != nil { + return m.Duration + } + return 0 +} + +func (m *PerfStatistics) GetCycles() uint64 { + if m != nil && m.Cycles != nil { + return *m.Cycles + } + return 0 +} + +func (m *PerfStatistics) GetStalledCyclesFrontend() uint64 { + if m != nil && m.StalledCyclesFrontend != nil { + return *m.StalledCyclesFrontend + } + return 0 +} + +func (m *PerfStatistics) GetStalledCyclesBackend() uint64 { + if m != nil && m.StalledCyclesBackend != nil { + return *m.StalledCyclesBackend + } + return 0 +} + +func (m *PerfStatistics) GetInstructions() uint64 { + if m != nil && m.Instructions != nil { + return *m.Instructions + } + return 0 +} + +func (m *PerfStatistics) GetCacheReferences() uint64 { + if m != nil && m.CacheReferences != nil { + return *m.CacheReferences + } + return 0 +} + +func (m *PerfStatistics) GetCacheMisses() uint64 { + if m != nil && m.CacheMisses != nil { + return *m.CacheMisses + } + return 0 +} + +func (m *PerfStatistics) GetBranches() uint64 { + if m != nil && m.Branches != nil { + return *m.Branches + } + return 0 +} + +func (m *PerfStatistics) GetBranchMisses() uint64 { + if m != nil && m.BranchMisses != nil { + return *m.BranchMisses + } + return 0 +} + +func (m *PerfStatistics) GetBusCycles() uint64 { + if m != nil && m.BusCycles != nil { + return *m.BusCycles + } + return 0 +} + +func (m *PerfStatistics) GetRefCycles() uint64 { + if m != nil && m.RefCycles != nil { + return *m.RefCycles + } + return 0 +} + +func (m *PerfStatistics) GetCPUClock() float64 { + if m != nil && m.CPUClock != nil { + return *m.CPUClock + } + return 0 +} + +func (m *PerfStatistics) GetTaskClock() float64 { + if m != nil && m.TaskClock != nil { + return *m.TaskClock + } + return 0 +} + +func (m *PerfStatistics) GetPageFaults() uint64 { + if m != nil && m.PageFaults != nil { + return *m.PageFaults + } + return 0 +} + +func (m *PerfStatistics) GetMinorFaults() uint64 { + if m != nil && m.MinorFaults != nil { + return *m.MinorFaults + } + return 0 +} + +func (m *PerfStatistics) GetMajorFaults() uint64 { + if m != nil && m.MajorFaults != nil { + return *m.MajorFaults + } + return 0 +} + +func (m *PerfStatistics) GetContextSwitches() uint64 { + if m != nil && m.ContextSwitches != nil { + return *m.ContextSwitches + } + return 0 +} + +func (m *PerfStatistics) GetCPUMigrations() uint64 { + if m != nil && m.CPUMigrations != nil { + return *m.CPUMigrations + } + return 0 +} + +func (m *PerfStatistics) GetAlignmentFaults() uint64 { + if m != nil && m.AlignmentFaults != nil { + return *m.AlignmentFaults + } + return 0 +} + +func (m *PerfStatistics) GetEmulationFaults() uint64 { + if m != nil && m.EmulationFaults != nil { + return *m.EmulationFaults + } + return 0 +} + +func (m *PerfStatistics) GetL1DcacheLoads() uint64 { + if m != nil && m.L1DcacheLoads != nil { + return *m.L1DcacheLoads + } + return 0 +} + +func (m *PerfStatistics) GetL1DcacheLoadMisses() uint64 { + if m != nil && m.L1DcacheLoadMisses != nil { + return *m.L1DcacheLoadMisses + } + return 0 +} + +func (m *PerfStatistics) GetL1DcacheStores() uint64 { + if m != nil && m.L1DcacheStores != nil { + return *m.L1DcacheStores + } + return 0 +} + +func (m *PerfStatistics) GetL1DcacheStoreMisses() uint64 { + if m != nil && m.L1DcacheStoreMisses != nil { + return *m.L1DcacheStoreMisses + } + return 0 +} + +func (m *PerfStatistics) GetL1DcachePrefetches() uint64 { + if m != nil && m.L1DcachePrefetches != nil { + return *m.L1DcachePrefetches + } + return 0 +} + +func (m *PerfStatistics) GetL1DcachePrefetchMisses() uint64 { + if m != nil && m.L1DcachePrefetchMisses != nil { + return *m.L1DcachePrefetchMisses + } + return 0 +} + +func (m *PerfStatistics) GetL1IcacheLoads() uint64 { + if m != nil && m.L1IcacheLoads != nil { + return *m.L1IcacheLoads + } + return 0 +} + +func (m *PerfStatistics) GetL1IcacheLoadMisses() uint64 { + if m != nil && m.L1IcacheLoadMisses != nil { + return *m.L1IcacheLoadMisses + } + return 0 +} + +func (m *PerfStatistics) GetL1IcachePrefetches() uint64 { + if m != nil && m.L1IcachePrefetches != nil { + return *m.L1IcachePrefetches + } + return 0 +} + +func (m *PerfStatistics) GetL1IcachePrefetchMisses() uint64 { + if m != nil && m.L1IcachePrefetchMisses != nil { + return *m.L1IcachePrefetchMisses + } + return 0 +} + +func (m *PerfStatistics) GetLLCLoads() uint64 { + if m != nil && m.LLCLoads != nil { + return *m.LLCLoads + } + return 0 +} + +func (m *PerfStatistics) GetLLCLoadMisses() uint64 { + if m != nil && m.LLCLoadMisses != nil { + return *m.LLCLoadMisses + } + return 0 +} + +func (m *PerfStatistics) GetLLCStores() uint64 { + if m != nil && m.LLCStores != nil { + return *m.LLCStores + } + return 0 +} + +func (m *PerfStatistics) GetLLCStoreMisses() uint64 { + if m != nil && m.LLCStoreMisses != nil { + return *m.LLCStoreMisses + } + return 0 +} + +func (m *PerfStatistics) GetLLCPrefetches() uint64 { + if m != nil && m.LLCPrefetches != nil { + return *m.LLCPrefetches + } + return 0 +} + +func (m *PerfStatistics) GetLLCPrefetchMisses() uint64 { + if m != nil && m.LLCPrefetchMisses != nil { + return *m.LLCPrefetchMisses + } + return 0 +} + +func (m *PerfStatistics) GetDTLBLoads() uint64 { + if m != nil && m.DTLBLoads != nil { + return *m.DTLBLoads + } + return 0 +} + +func (m *PerfStatistics) GetDTLBLoadMisses() uint64 { + if m != nil && m.DTLBLoadMisses != nil { + return *m.DTLBLoadMisses + } + return 0 +} + +func (m *PerfStatistics) GetDTLBStores() uint64 { + if m != nil && m.DTLBStores != nil { + return *m.DTLBStores + } + return 0 +} + +func (m *PerfStatistics) GetDTLBStoreMisses() uint64 { + if m != nil && m.DTLBStoreMisses != nil { + return *m.DTLBStoreMisses + } + return 0 +} + +func (m *PerfStatistics) GetDTLBPrefetches() uint64 { + if m != nil && m.DTLBPrefetches != nil { + return *m.DTLBPrefetches + } + return 0 +} + +func (m *PerfStatistics) GetDTLBPrefetchMisses() uint64 { + if m != nil && m.DTLBPrefetchMisses != nil { + return *m.DTLBPrefetchMisses + } + return 0 +} + +func (m *PerfStatistics) GetITLBLoads() uint64 { + if m != nil && m.ITLBLoads != nil { + return *m.ITLBLoads + } + return 0 +} + +func (m *PerfStatistics) GetITLBLoadMisses() uint64 { + if m != nil && m.ITLBLoadMisses != nil { + return *m.ITLBLoadMisses + } + return 0 +} + +func (m *PerfStatistics) GetBranchLoads() uint64 { + if m != nil && m.BranchLoads != nil { + return *m.BranchLoads + } + return 0 +} + +func (m *PerfStatistics) GetBranchLoadMisses() uint64 { + if m != nil && m.BranchLoadMisses != nil { + return *m.BranchLoadMisses + } + return 0 +} + +func (m *PerfStatistics) GetNodeLoads() uint64 { + if m != nil && m.NodeLoads != nil { + return *m.NodeLoads + } + return 0 +} + +func (m *PerfStatistics) GetNodeLoadMisses() uint64 { + if m != nil && m.NodeLoadMisses != nil { + return *m.NodeLoadMisses + } + return 0 +} + +func (m *PerfStatistics) GetNodeStores() uint64 { + if m != nil && m.NodeStores != nil { + return *m.NodeStores + } + return 0 +} + +func (m *PerfStatistics) GetNodeStoreMisses() uint64 { + if m != nil && m.NodeStoreMisses != nil { + return *m.NodeStoreMisses + } + return 0 +} + +func (m *PerfStatistics) GetNodePrefetches() uint64 { + if m != nil && m.NodePrefetches != nil { + return *m.NodePrefetches + } + return 0 +} + +func (m *PerfStatistics) GetNodePrefetchMisses() uint64 { + if m != nil && m.NodePrefetchMisses != nil { + return *m.NodePrefetchMisses + } + return 0 +} + +// * +// Describes a request for resources that can be used by a framework +// to proactively influence the allocator. If 'agent_id' is provided +// then this request is assumed to only apply to resources on that +// agent. +type Request struct { + AgentID *AgentID `protobuf:"bytes,1,opt,name=agent_id,json=agentId" json:"agent_id,omitempty"` + Resources []Resource `protobuf:"bytes,2,rep,name=resources" json:"resources"` +} + +func (m *Request) Reset() { *m = Request{} } +func (*Request) ProtoMessage() {} +func (*Request) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{40} } + +func (m *Request) GetAgentID() *AgentID { + if m != nil { + return m.AgentID + } + return nil +} + +func (m *Request) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +// * +// Describes some resources available on an agent. An offer only +// contains resources from a single agent. +type Offer struct { + ID OfferID `protobuf:"bytes,1,req,name=id" json:"id"` + FrameworkID FrameworkID `protobuf:"bytes,2,req,name=framework_id,json=frameworkId" json:"framework_id"` + AgentID AgentID `protobuf:"bytes,3,req,name=agent_id,json=agentId" json:"agent_id"` + Hostname string `protobuf:"bytes,4,req,name=hostname" json:"hostname"` + // URL for reaching the agent running on the host. + URL *URL `protobuf:"bytes,8,opt,name=url" json:"url,omitempty"` + // The domain of the agent. + Domain *DomainInfo `protobuf:"bytes,11,opt,name=domain" json:"domain,omitempty"` + Resources []Resource `protobuf:"bytes,5,rep,name=resources" json:"resources"` + Attributes []Attribute `protobuf:"bytes,7,rep,name=attributes" json:"attributes"` + // Executors of the same framework running on this agent. + ExecutorIDs []ExecutorID `protobuf:"bytes,6,rep,name=executor_ids,json=executorIds" json:"executor_ids"` + // Signifies that the resources in this Offer may be unavailable during + // the given interval. Any tasks launched using these resources may be + // killed when the interval arrives. For example, these resources may be + // part of a planned maintenance schedule. + // + // This field only provides information about a planned unavailability. + // The unavailability interval may not necessarily start at exactly this + // interval, nor last for exactly the duration of this interval. + // The unavailability may also be forever! See comments in + // `Unavailability` for more details. + Unavailability *Unavailability `protobuf:"bytes,9,opt,name=unavailability" json:"unavailability,omitempty"` + // An offer represents resources allocated to *one* of the + // roles managed by the scheduler. (Therefore, each + // `Offer.resources[i].allocation_info` will match the + // top level `Offer.allocation_info`). + AllocationInfo *Resource_AllocationInfo `protobuf:"bytes,10,opt,name=allocation_info,json=allocationInfo" json:"allocation_info,omitempty"` +} + +func (m *Offer) Reset() { *m = Offer{} } +func (*Offer) ProtoMessage() {} +func (*Offer) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{41} } + +func (m *Offer) GetID() OfferID { + if m != nil { + return m.ID + } + return OfferID{} +} + +func (m *Offer) GetFrameworkID() FrameworkID { + if m != nil { + return m.FrameworkID + } + return FrameworkID{} +} + +func (m *Offer) GetAgentID() AgentID { + if m != nil { + return m.AgentID + } + return AgentID{} +} + +func (m *Offer) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *Offer) GetURL() *URL { + if m != nil { + return m.URL + } + return nil +} + +func (m *Offer) GetDomain() *DomainInfo { + if m != nil { + return m.Domain + } + return nil +} + +func (m *Offer) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *Offer) GetAttributes() []Attribute { + if m != nil { + return m.Attributes + } + return nil +} + +func (m *Offer) GetExecutorIDs() []ExecutorID { + if m != nil { + return m.ExecutorIDs + } + return nil +} + +func (m *Offer) GetUnavailability() *Unavailability { + if m != nil { + return m.Unavailability + } + return nil +} + +func (m *Offer) GetAllocationInfo() *Resource_AllocationInfo { + if m != nil { + return m.AllocationInfo + } + return nil +} + +// Defines an operation that can be performed against offers. +type Offer_Operation struct { + Type Offer_Operation_Type `protobuf:"varint,1,opt,name=type,enum=mesos.Offer_Operation_Type" json:"type"` + // NOTE: The `id` field will allow frameworks to indicate that they wish to + // receive feedback about an operation. Since this feature is not yet + // implemented, the `id` field should NOT be set at present. See MESOS-8054. + ID *OperationID `protobuf:"bytes,12,opt,name=id" json:"id,omitempty"` + Launch *Offer_Operation_Launch `protobuf:"bytes,2,opt,name=launch" json:"launch,omitempty"` + LaunchGroup *Offer_Operation_LaunchGroup `protobuf:"bytes,7,opt,name=launch_group,json=launchGroup" json:"launch_group,omitempty"` + Reserve *Offer_Operation_Reserve `protobuf:"bytes,3,opt,name=reserve" json:"reserve,omitempty"` + Unreserve *Offer_Operation_Unreserve `protobuf:"bytes,4,opt,name=unreserve" json:"unreserve,omitempty"` + Create *Offer_Operation_Create `protobuf:"bytes,5,opt,name=create" json:"create,omitempty"` + Destroy *Offer_Operation_Destroy `protobuf:"bytes,6,opt,name=destroy" json:"destroy,omitempty"` + GrowVolume *Offer_Operation_GrowVolume `protobuf:"bytes,13,opt,name=grow_volume,json=growVolume" json:"grow_volume,omitempty"` + ShrinkVolume *Offer_Operation_ShrinkVolume `protobuf:"bytes,14,opt,name=shrink_volume,json=shrinkVolume" json:"shrink_volume,omitempty"` + CreateDisk *Offer_Operation_CreateDisk `protobuf:"bytes,15,opt,name=create_disk,json=createDisk" json:"create_disk,omitempty"` + DestroyDisk *Offer_Operation_DestroyDisk `protobuf:"bytes,16,opt,name=destroy_disk,json=destroyDisk" json:"destroy_disk,omitempty"` +} + +func (m *Offer_Operation) Reset() { *m = Offer_Operation{} } +func (*Offer_Operation) ProtoMessage() {} +func (*Offer_Operation) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{41, 0} } + +func (m *Offer_Operation) GetType() Offer_Operation_Type { + if m != nil { + return m.Type + } + return Offer_Operation_UNKNOWN +} + +func (m *Offer_Operation) GetID() *OperationID { + if m != nil { + return m.ID + } + return nil +} + +func (m *Offer_Operation) GetLaunch() *Offer_Operation_Launch { + if m != nil { + return m.Launch + } + return nil +} + +func (m *Offer_Operation) GetLaunchGroup() *Offer_Operation_LaunchGroup { + if m != nil { + return m.LaunchGroup + } + return nil +} + +func (m *Offer_Operation) GetReserve() *Offer_Operation_Reserve { + if m != nil { + return m.Reserve + } + return nil +} + +func (m *Offer_Operation) GetUnreserve() *Offer_Operation_Unreserve { + if m != nil { + return m.Unreserve + } + return nil +} + +func (m *Offer_Operation) GetCreate() *Offer_Operation_Create { + if m != nil { + return m.Create + } + return nil +} + +func (m *Offer_Operation) GetDestroy() *Offer_Operation_Destroy { + if m != nil { + return m.Destroy + } + return nil +} + +func (m *Offer_Operation) GetGrowVolume() *Offer_Operation_GrowVolume { + if m != nil { + return m.GrowVolume + } + return nil +} + +func (m *Offer_Operation) GetShrinkVolume() *Offer_Operation_ShrinkVolume { + if m != nil { + return m.ShrinkVolume + } + return nil +} + +func (m *Offer_Operation) GetCreateDisk() *Offer_Operation_CreateDisk { + if m != nil { + return m.CreateDisk + } + return nil +} + +func (m *Offer_Operation) GetDestroyDisk() *Offer_Operation_DestroyDisk { + if m != nil { + return m.DestroyDisk + } + return nil +} + +// TODO(vinod): Deprecate this in favor of `LaunchGroup` below. +type Offer_Operation_Launch struct { + TaskInfos []TaskInfo `protobuf:"bytes,1,rep,name=task_infos,json=taskInfos" json:"task_infos"` +} + +func (m *Offer_Operation_Launch) Reset() { *m = Offer_Operation_Launch{} } +func (*Offer_Operation_Launch) ProtoMessage() {} +func (*Offer_Operation_Launch) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 0} +} + +func (m *Offer_Operation_Launch) GetTaskInfos() []TaskInfo { + if m != nil { + return m.TaskInfos + } + return nil +} + +// Unlike `Launch` above, all the tasks in a `task_group` are +// atomically delivered to an executor. +// +// `NetworkInfo` set on executor will be shared by all tasks in +// the task group. +// +// TODO(vinod): Any volumes set on executor could be used by a +// task by explicitly setting `Volume.source` in its resources. +type Offer_Operation_LaunchGroup struct { + Executor ExecutorInfo `protobuf:"bytes,1,req,name=executor" json:"executor"` + TaskGroup TaskGroupInfo `protobuf:"bytes,2,req,name=task_group,json=taskGroup" json:"task_group"` +} + +func (m *Offer_Operation_LaunchGroup) Reset() { *m = Offer_Operation_LaunchGroup{} } +func (*Offer_Operation_LaunchGroup) ProtoMessage() {} +func (*Offer_Operation_LaunchGroup) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 1} +} + +func (m *Offer_Operation_LaunchGroup) GetExecutor() ExecutorInfo { + if m != nil { + return m.Executor + } + return ExecutorInfo{} +} + +func (m *Offer_Operation_LaunchGroup) GetTaskGroup() TaskGroupInfo { + if m != nil { + return m.TaskGroup + } + return TaskGroupInfo{} +} + +type Offer_Operation_Reserve struct { + Resources []Resource `protobuf:"bytes,1,rep,name=resources" json:"resources"` +} + +func (m *Offer_Operation_Reserve) Reset() { *m = Offer_Operation_Reserve{} } +func (*Offer_Operation_Reserve) ProtoMessage() {} +func (*Offer_Operation_Reserve) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 2} +} + +func (m *Offer_Operation_Reserve) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +type Offer_Operation_Unreserve struct { + Resources []Resource `protobuf:"bytes,1,rep,name=resources" json:"resources"` +} + +func (m *Offer_Operation_Unreserve) Reset() { *m = Offer_Operation_Unreserve{} } +func (*Offer_Operation_Unreserve) ProtoMessage() {} +func (*Offer_Operation_Unreserve) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 3} +} + +func (m *Offer_Operation_Unreserve) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +type Offer_Operation_Create struct { + Volumes []Resource `protobuf:"bytes,1,rep,name=volumes" json:"volumes"` +} + +func (m *Offer_Operation_Create) Reset() { *m = Offer_Operation_Create{} } +func (*Offer_Operation_Create) ProtoMessage() {} +func (*Offer_Operation_Create) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 4} +} + +func (m *Offer_Operation_Create) GetVolumes() []Resource { + if m != nil { + return m.Volumes + } + return nil +} + +type Offer_Operation_Destroy struct { + Volumes []Resource `protobuf:"bytes,1,rep,name=volumes" json:"volumes"` +} + +func (m *Offer_Operation_Destroy) Reset() { *m = Offer_Operation_Destroy{} } +func (*Offer_Operation_Destroy) ProtoMessage() {} +func (*Offer_Operation_Destroy) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 5} +} + +func (m *Offer_Operation_Destroy) GetVolumes() []Resource { + if m != nil { + return m.Volumes + } + return nil +} + +// Grow a volume by an additional disk resource. +// NOTE: This is currently experimental and only for persistent volumes +// created on ROOT/PATH disk. +type Offer_Operation_GrowVolume struct { + Volume Resource `protobuf:"bytes,1,req,name=volume" json:"volume"` + Addition Resource `protobuf:"bytes,2,req,name=addition" json:"addition"` +} + +func (m *Offer_Operation_GrowVolume) Reset() { *m = Offer_Operation_GrowVolume{} } +func (*Offer_Operation_GrowVolume) ProtoMessage() {} +func (*Offer_Operation_GrowVolume) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 6} +} + +func (m *Offer_Operation_GrowVolume) GetVolume() Resource { + if m != nil { + return m.Volume + } + return Resource{} +} + +func (m *Offer_Operation_GrowVolume) GetAddition() Resource { + if m != nil { + return m.Addition + } + return Resource{} +} + +// Shrink a volume by the size specified in the `subtract` field. +// NOTE: This is currently experimental and only for persistent volumes +// created on ROOT/PATH disk. +type Offer_Operation_ShrinkVolume struct { + Volume Resource `protobuf:"bytes,1,req,name=volume" json:"volume"` + // See comments in `Value.Scalar` for maximum precision supported. + Subtract Value_Scalar `protobuf:"bytes,2,req,name=subtract" json:"subtract"` +} + +func (m *Offer_Operation_ShrinkVolume) Reset() { *m = Offer_Operation_ShrinkVolume{} } +func (*Offer_Operation_ShrinkVolume) ProtoMessage() {} +func (*Offer_Operation_ShrinkVolume) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 7} +} + +func (m *Offer_Operation_ShrinkVolume) GetVolume() Resource { + if m != nil { + return m.Volume + } + return Resource{} +} + +func (m *Offer_Operation_ShrinkVolume) GetSubtract() Value_Scalar { + if m != nil { + return m.Subtract + } + return Value_Scalar{} +} + +// Create a `MOUNT` or `BLOCK` disk resource from a `RAW` disk resource. +// NOTE: For the time being, this API is subject to change and the related +// feature is experimental. +type Offer_Operation_CreateDisk struct { + Source Resource `protobuf:"bytes,1,req,name=source" json:"source"` + // NOTE: Only `MOUNT` or `BLOCK` is allowed in the `target_type` field. + TargetType Resource_DiskInfo_Source_Type `protobuf:"varint,2,req,name=target_type,json=targetType,enum=mesos.Resource_DiskInfo_Source_Type" json:"target_type"` +} + +func (m *Offer_Operation_CreateDisk) Reset() { *m = Offer_Operation_CreateDisk{} } +func (*Offer_Operation_CreateDisk) ProtoMessage() {} +func (*Offer_Operation_CreateDisk) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 8} +} + +func (m *Offer_Operation_CreateDisk) GetSource() Resource { + if m != nil { + return m.Source + } + return Resource{} +} + +func (m *Offer_Operation_CreateDisk) GetTargetType() Resource_DiskInfo_Source_Type { + if m != nil { + return m.TargetType + } + return Resource_DiskInfo_Source_UNKNOWN +} + +// Destroy a `MOUNT` or `BLOCK` disk resource. This will result in a `RAW` +// disk resource. +// NOTE: For the time being, this API is subject to change and the related +// feature is experimental. +type Offer_Operation_DestroyDisk struct { + // NOTE: Only a `MOUNT` or `BLOCK` disk is allowed in the `source` field. + Source Resource `protobuf:"bytes,1,req,name=source" json:"source"` +} + +func (m *Offer_Operation_DestroyDisk) Reset() { *m = Offer_Operation_DestroyDisk{} } +func (*Offer_Operation_DestroyDisk) ProtoMessage() {} +func (*Offer_Operation_DestroyDisk) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{41, 0, 9} +} + +func (m *Offer_Operation_DestroyDisk) GetSource() Resource { + if m != nil { + return m.Source + } + return Resource{} +} + +// * +// A request to return some resources occupied by a framework. +type InverseOffer struct { + // This is the same OfferID as found in normal offers, which allows + // re-use of some of the OfferID-only messages. + OfferID OfferID `protobuf:"bytes,1,req,name=id" json:"id"` + // URL for reaching the agent running on the host. This enables some + // optimizations as described in MESOS-3012, such as allowing the + // scheduler driver to bypass the master and talk directly with an agent. + URL *URL `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` + // The framework that should release its resources. + // If no specifics are provided (i.e. which agent), all the framework's + // resources are requested back. + FrameworkID FrameworkID `protobuf:"bytes,3,req,name=framework_id,json=frameworkId" json:"framework_id"` + // Specified if the resources need to be released from a particular agent. + // All the framework's resources on this agent are requested back, + // unless further qualified by the `resources` field. + AgentID *AgentID `protobuf:"bytes,4,opt,name=agent_id,json=agentId" json:"agent_id,omitempty"` + // This InverseOffer represents a planned unavailability event in the + // specified interval. Any tasks running on the given framework or agent + // may be killed when the interval arrives. Therefore, frameworks should + // aim to gracefully terminate tasks prior to the arrival of the interval. + // + // For reserved resources, the resources are expected to be returned to the + // framework after the unavailability interval. This is an expectation, + // not a guarantee. For example, if the unavailability duration is not set, + // the resources may be removed permanently. + // + // For other resources, there is no guarantee that requested resources will + // be returned after the unavailability interval. The allocator has no + // obligation to re-offer these resources to the prior framework after + // the unavailability. + Unavailability Unavailability `protobuf:"bytes,5,req,name=unavailability" json:"unavailability"` + // A list of resources being requested back from the framework, + // on the agent identified by `agent_id`. If no resources are specified + // then all resources are being requested back. For the purpose of + // maintenance, this field is always empty (maintenance always requests + // all resources back). + Resources []Resource `protobuf:"bytes,6,rep,name=resources" json:"resources"` +} + +func (m *InverseOffer) Reset() { *m = InverseOffer{} } +func (*InverseOffer) ProtoMessage() {} +func (*InverseOffer) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{42} } + +func (m *InverseOffer) GetOfferID() OfferID { + if m != nil { + return m.OfferID + } + return OfferID{} +} + +func (m *InverseOffer) GetURL() *URL { + if m != nil { + return m.URL + } + return nil +} + +func (m *InverseOffer) GetFrameworkID() FrameworkID { + if m != nil { + return m.FrameworkID + } + return FrameworkID{} +} + +func (m *InverseOffer) GetAgentID() *AgentID { + if m != nil { + return m.AgentID + } + return nil +} + +func (m *InverseOffer) GetUnavailability() Unavailability { + if m != nil { + return m.Unavailability + } + return Unavailability{} +} + +func (m *InverseOffer) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +// * +// Describes a task. Passed from the scheduler all the way to an +// executor (see SchedulerDriver::launchTasks and +// Executor::launchTask). Either ExecutorInfo or CommandInfo should be set. +// A different executor can be used to launch this task, and subsequent tasks +// meant for the same executor can reuse the same ExecutorInfo struct. +type TaskInfo struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + TaskID TaskID `protobuf:"bytes,2,req,name=task_id,json=taskId" json:"task_id"` + AgentID AgentID `protobuf:"bytes,3,req,name=agent_id,json=agentId" json:"agent_id"` + Resources []Resource `protobuf:"bytes,4,rep,name=resources" json:"resources"` + Executor *ExecutorInfo `protobuf:"bytes,5,opt,name=executor" json:"executor,omitempty"` + Command *CommandInfo `protobuf:"bytes,7,opt,name=command" json:"command,omitempty"` + // Task provided with a container will launch the container as part + // of this task paired with the task's CommandInfo. + Container *ContainerInfo `protobuf:"bytes,9,opt,name=container" json:"container,omitempty"` + // A health check for the task. Implemented for executor-less + // command-based tasks. For tasks that specify an executor, it is + // the executor's responsibility to implement the health checking. + HealthCheck *HealthCheck `protobuf:"bytes,8,opt,name=health_check,json=healthCheck" json:"health_check,omitempty"` + // A general check for the task. Implemented for all built-in executors. + // For tasks that specify an executor, it is the executor's responsibility + // to implement checking support. Executors should (all built-in executors + // will) neither interpret nor act on the check's result. + // + // NOTE: Check support in built-in executors is experimental. + // + // TODO(alexr): Consider supporting multiple checks per task. + Check *CheckInfo `protobuf:"bytes,13,opt,name=check" json:"check,omitempty"` + // A kill policy for the task. Implemented for executor-less + // command-based and docker tasks. For tasks that specify an + // executor, it is the executor's responsibility to implement + // the kill policy. + KillPolicy *KillPolicy `protobuf:"bytes,12,opt,name=kill_policy,json=killPolicy" json:"kill_policy,omitempty"` + Data []byte `protobuf:"bytes,6,opt,name=data" json:"data,omitempty"` + // Labels are free-form key value pairs which are exposed through + // master and agent endpoints. Labels will not be interpreted or + // acted upon by Mesos itself. As opposed to the data field, labels + // will be kept in memory on master and agent processes. Therefore, + // labels should be used to tag tasks with light-weight meta-data. + // Labels should not contain duplicate key-value pairs. + Labels *Labels `protobuf:"bytes,10,opt,name=labels" json:"labels,omitempty"` + // Service discovery information for the task. It is not interpreted + // or acted upon by Mesos. It is up to a service discovery system + // to use this information as needed and to handle tasks without + // service discovery information. + Discovery *DiscoveryInfo `protobuf:"bytes,11,opt,name=discovery" json:"discovery,omitempty"` + // Maximum duration for task completion. If the task is non-terminal at the + // end of this duration, it will fail with the reason + // `REASON_MAX_COMPLETION_TIME_REACHED`. Mesos supports this field for + // executor-less tasks, and tasks that use Docker or default executors. + // It is the executor's responsibility to implement this, so it might not be + // supported by all custom executors. + MaxCompletionTime *DurationInfo `protobuf:"bytes,14,opt,name=max_completion_time,json=maxCompletionTime" json:"max_completion_time,omitempty"` +} + +func (m *TaskInfo) Reset() { *m = TaskInfo{} } +func (*TaskInfo) ProtoMessage() {} +func (*TaskInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{43} } + +func (m *TaskInfo) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *TaskInfo) GetTaskID() TaskID { + if m != nil { + return m.TaskID + } + return TaskID{} +} + +func (m *TaskInfo) GetAgentID() AgentID { + if m != nil { + return m.AgentID + } + return AgentID{} +} + +func (m *TaskInfo) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *TaskInfo) GetExecutor() *ExecutorInfo { + if m != nil { + return m.Executor + } + return nil +} + +func (m *TaskInfo) GetCommand() *CommandInfo { + if m != nil { + return m.Command + } + return nil +} + +func (m *TaskInfo) GetContainer() *ContainerInfo { + if m != nil { + return m.Container + } + return nil +} + +func (m *TaskInfo) GetHealthCheck() *HealthCheck { + if m != nil { + return m.HealthCheck + } + return nil +} + +func (m *TaskInfo) GetCheck() *CheckInfo { + if m != nil { + return m.Check + } + return nil +} + +func (m *TaskInfo) GetKillPolicy() *KillPolicy { + if m != nil { + return m.KillPolicy + } + return nil +} + +func (m *TaskInfo) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *TaskInfo) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +func (m *TaskInfo) GetDiscovery() *DiscoveryInfo { + if m != nil { + return m.Discovery + } + return nil +} + +func (m *TaskInfo) GetMaxCompletionTime() *DurationInfo { + if m != nil { + return m.MaxCompletionTime + } + return nil +} + +// * +// Describes a group of tasks that belong to an executor. The +// executor will receive the task group in a single message to +// allow the group to be launched "atomically". +// +// NOTES: +// 1) `NetworkInfo` must not be set inside task's `ContainerInfo`. +// 2) `TaskInfo.executor` doesn't need to set. If set, it should match +// `LaunchGroup.executor`. +type TaskGroupInfo struct { + Tasks []TaskInfo `protobuf:"bytes,1,rep,name=tasks" json:"tasks"` +} + +func (m *TaskGroupInfo) Reset() { *m = TaskGroupInfo{} } +func (*TaskGroupInfo) ProtoMessage() {} +func (*TaskGroupInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{44} } + +func (m *TaskGroupInfo) GetTasks() []TaskInfo { + if m != nil { + return m.Tasks + } + return nil +} + +// * +// Describes a task, similar to `TaskInfo`. +// +// `Task` is used in some of the Mesos messages found below. +// `Task` is used instead of `TaskInfo` if: +// 1) we need additional IDs, such as a specific +// framework, executor, or agent; or +// 2) we do not need the additional data, such as the command run by the +// task or the health checks. These additional fields may be large and +// unnecessary for some Mesos messages. +// +// `Task` is generally constructed from a `TaskInfo`. See protobuf::createTask. +type Task struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + TaskID TaskID `protobuf:"bytes,2,req,name=task_id,json=taskId" json:"task_id"` + FrameworkID FrameworkID `protobuf:"bytes,3,req,name=framework_id,json=frameworkId" json:"framework_id"` + ExecutorID *ExecutorID `protobuf:"bytes,4,opt,name=executor_id,json=executorId" json:"executor_id,omitempty"` + AgentID AgentID `protobuf:"bytes,5,req,name=agent_id,json=agentId" json:"agent_id"` + State *TaskState `protobuf:"varint,6,req,name=state,enum=mesos.TaskState" json:"state,omitempty"` + Resources []Resource `protobuf:"bytes,7,rep,name=resources" json:"resources"` + Statuses []TaskStatus `protobuf:"bytes,8,rep,name=statuses" json:"statuses"` + // These fields correspond to the state and uuid of the latest + // status update forwarded to the master. + // NOTE: Either both the fields must be set or both must be unset. + StatusUpdateState *TaskState `protobuf:"varint,9,opt,name=status_update_state,json=statusUpdateState,enum=mesos.TaskState" json:"status_update_state,omitempty"` + StatusUpdateUUID []byte `protobuf:"bytes,10,opt,name=status_update_uuid,json=statusUpdateUuid" json:"status_update_uuid,omitempty"` + Labels *Labels `protobuf:"bytes,11,opt,name=labels" json:"labels,omitempty"` + // Service discovery information for the task. It is not interpreted + // or acted upon by Mesos. It is up to a service discovery system + // to use this information as needed and to handle tasks without + // service discovery information. + Discovery *DiscoveryInfo `protobuf:"bytes,12,opt,name=discovery" json:"discovery,omitempty"` + // Container information for the task. + Container *ContainerInfo `protobuf:"bytes,13,opt,name=container" json:"container,omitempty"` + // Specific user under which task is running. + User *string `protobuf:"bytes,14,opt,name=user" json:"user,omitempty"` +} + +func (m *Task) Reset() { *m = Task{} } +func (*Task) ProtoMessage() {} +func (*Task) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{45} } + +func (m *Task) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Task) GetTaskID() TaskID { + if m != nil { + return m.TaskID + } + return TaskID{} +} + +func (m *Task) GetFrameworkID() FrameworkID { + if m != nil { + return m.FrameworkID + } + return FrameworkID{} +} + +func (m *Task) GetExecutorID() *ExecutorID { + if m != nil { + return m.ExecutorID + } + return nil +} + +func (m *Task) GetAgentID() AgentID { + if m != nil { + return m.AgentID + } + return AgentID{} +} + +func (m *Task) GetState() TaskState { + if m != nil && m.State != nil { + return *m.State + } + return TASK_STAGING +} + +func (m *Task) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +func (m *Task) GetStatuses() []TaskStatus { + if m != nil { + return m.Statuses + } + return nil +} + +func (m *Task) GetStatusUpdateState() TaskState { + if m != nil && m.StatusUpdateState != nil { + return *m.StatusUpdateState + } + return TASK_STAGING +} + +func (m *Task) GetStatusUpdateUUID() []byte { + if m != nil { + return m.StatusUpdateUUID + } + return nil +} + +func (m *Task) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +func (m *Task) GetDiscovery() *DiscoveryInfo { + if m != nil { + return m.Discovery + } + return nil +} + +func (m *Task) GetContainer() *ContainerInfo { + if m != nil { + return m.Container + } + return nil +} + +func (m *Task) GetUser() string { + if m != nil && m.User != nil { + return *m.User + } + return "" +} + +// * +// Describes a resource limitation that caused a task failure. +type TaskResourceLimitation struct { + // This field contains the resource whose limits were violated. + // + // NOTE: 'Resources' is used here because the resource may span + // multiple roles (e.g. `"mem(*):1;mem(role):2"`). + Resources []Resource `protobuf:"bytes,1,rep,name=resources" json:"resources"` +} + +func (m *TaskResourceLimitation) Reset() { *m = TaskResourceLimitation{} } +func (*TaskResourceLimitation) ProtoMessage() {} +func (*TaskResourceLimitation) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{46} } + +func (m *TaskResourceLimitation) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +// * +// Describes a UUID. +type UUID struct { + Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` +} + +func (m *UUID) Reset() { *m = UUID{} } +func (*UUID) ProtoMessage() {} +func (*UUID) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{47} } + +func (m *UUID) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +// * +// Describes an operation, similar to `Offer.Operation`, with +// some additional information. +type Operation struct { + FrameworkID *FrameworkID `protobuf:"bytes,1,opt,name=framework_id,json=frameworkId" json:"framework_id,omitempty"` + AgentID *AgentID `protobuf:"bytes,2,opt,name=agent_id,json=agentId" json:"agent_id,omitempty"` + Info Offer_Operation `protobuf:"bytes,3,req,name=info" json:"info"` + LatestStatus OperationStatus `protobuf:"bytes,4,req,name=latest_status,json=latestStatus" json:"latest_status"` + // All the statuses known to this operation. Some of the statuses in this + // list might not have been acknowledged yet. The statuses are ordered. + Statuses []OperationStatus `protobuf:"bytes,5,rep,name=statuses" json:"statuses"` + // This is the internal UUID for the operation, which is kept independently + // from the framework-specified operation ID, which is optional. + UUID UUID `protobuf:"bytes,6,req,name=uuid" json:"uuid"` +} + +func (m *Operation) Reset() { *m = Operation{} } +func (*Operation) ProtoMessage() {} +func (*Operation) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{48} } + +func (m *Operation) GetFrameworkID() *FrameworkID { + if m != nil { + return m.FrameworkID + } + return nil +} + +func (m *Operation) GetAgentID() *AgentID { + if m != nil { + return m.AgentID + } + return nil +} + +func (m *Operation) GetInfo() Offer_Operation { + if m != nil { + return m.Info + } + return Offer_Operation{} +} + +func (m *Operation) GetLatestStatus() OperationStatus { + if m != nil { + return m.LatestStatus + } + return OperationStatus{} +} + +func (m *Operation) GetStatuses() []OperationStatus { + if m != nil { + return m.Statuses + } + return nil +} + +func (m *Operation) GetUUID() UUID { + if m != nil { + return m.UUID + } + return UUID{} +} + +// * +// Describes the current status of an operation. +type OperationStatus struct { + // While frameworks will only receive status updates for operations on which + // they have set an ID, this field is optional because this message is also + // used internally by Mesos components when the operation's ID has not been + // set. + OperationID *OperationID `protobuf:"bytes,1,opt,name=operation_id,json=operationId" json:"operation_id,omitempty"` + State OperationState `protobuf:"varint,2,req,name=state,enum=mesos.OperationState" json:"state"` + Message *string `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + // Converted resources after applying the operation. This only + // applies if the `state` is `OPERATION_FINISHED`. + ConvertedResources []Resource `protobuf:"bytes,4,rep,name=converted_resources,json=convertedResources" json:"converted_resources"` + // Statuses that are delivered reliably to the scheduler will + // include a `uuid`. The status is considered delivered once + // it is acknowledged by the scheduler. + UUID *UUID `protobuf:"bytes,5,opt,name=uuid" json:"uuid,omitempty"` +} + +func (m *OperationStatus) Reset() { *m = OperationStatus{} } +func (*OperationStatus) ProtoMessage() {} +func (*OperationStatus) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{49} } + +func (m *OperationStatus) GetOperationID() *OperationID { + if m != nil { + return m.OperationID + } + return nil +} + +func (m *OperationStatus) GetState() OperationState { + if m != nil { + return m.State + } + return OPERATION_UNSUPPORTED +} + +func (m *OperationStatus) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +func (m *OperationStatus) GetConvertedResources() []Resource { + if m != nil { + return m.ConvertedResources + } + return nil +} + +func (m *OperationStatus) GetUUID() *UUID { + if m != nil { + return m.UUID + } + return nil +} + +// * +// Describes the status of a check. Type and the corresponding field, i.e., +// `command` or `http` must be set. If the result of the check is not available +// (e.g., the check timed out), these fields must contain empty messages, i.e., +// `exit_code` or `status_code` will be unset. +// +// NOTE: This API is subject to change and the related feature is experimental. +type CheckStatusInfo struct { + // The type of the check this status corresponds to. + Type *CheckInfo_Type `protobuf:"varint,1,opt,name=type,enum=mesos.CheckInfo_Type" json:"type,omitempty"` + // Status of a command check. + Command *CheckStatusInfo_Command `protobuf:"bytes,2,opt,name=command" json:"command,omitempty"` + // Status of an HTTP check. + HTTP *CheckStatusInfo_Http `protobuf:"bytes,3,opt,name=http" json:"http,omitempty"` + // Status of a TCP check. + TCP *CheckStatusInfo_Tcp `protobuf:"bytes,4,opt,name=tcp" json:"tcp,omitempty"` +} + +func (m *CheckStatusInfo) Reset() { *m = CheckStatusInfo{} } +func (*CheckStatusInfo) ProtoMessage() {} +func (*CheckStatusInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{50} } + +func (m *CheckStatusInfo) GetType() CheckInfo_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return CheckInfo_UNKNOWN +} + +func (m *CheckStatusInfo) GetCommand() *CheckStatusInfo_Command { + if m != nil { + return m.Command + } + return nil +} + +func (m *CheckStatusInfo) GetHTTP() *CheckStatusInfo_Http { + if m != nil { + return m.HTTP + } + return nil +} + +func (m *CheckStatusInfo) GetTCP() *CheckStatusInfo_Tcp { + if m != nil { + return m.TCP + } + return nil +} + +type CheckStatusInfo_Command struct { + // Exit code of a command check. It is the result of calling + // `WEXITSTATUS()` on `waitpid()` termination information on + // Posix and calling `GetExitCodeProcess()` on Windows. + ExitCode *int32 `protobuf:"varint,1,opt,name=exit_code,json=exitCode" json:"exit_code,omitempty"` +} + +func (m *CheckStatusInfo_Command) Reset() { *m = CheckStatusInfo_Command{} } +func (*CheckStatusInfo_Command) ProtoMessage() {} +func (*CheckStatusInfo_Command) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{50, 0} } + +func (m *CheckStatusInfo_Command) GetExitCode() int32 { + if m != nil && m.ExitCode != nil { + return *m.ExitCode + } + return 0 +} + +type CheckStatusInfo_Http struct { + // HTTP status code of an HTTP check. + StatusCode *uint32 `protobuf:"varint,1,opt,name=status_code,json=statusCode" json:"status_code,omitempty"` +} + +func (m *CheckStatusInfo_Http) Reset() { *m = CheckStatusInfo_Http{} } +func (*CheckStatusInfo_Http) ProtoMessage() {} +func (*CheckStatusInfo_Http) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{50, 1} } + +func (m *CheckStatusInfo_Http) GetStatusCode() uint32 { + if m != nil && m.StatusCode != nil { + return *m.StatusCode + } + return 0 +} + +type CheckStatusInfo_Tcp struct { + // Whether a TCP connection succeeded. + Succeeded *bool `protobuf:"varint,1,opt,name=succeeded" json:"succeeded,omitempty"` +} + +func (m *CheckStatusInfo_Tcp) Reset() { *m = CheckStatusInfo_Tcp{} } +func (*CheckStatusInfo_Tcp) ProtoMessage() {} +func (*CheckStatusInfo_Tcp) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{50, 2} } + +func (m *CheckStatusInfo_Tcp) GetSucceeded() bool { + if m != nil && m.Succeeded != nil { + return *m.Succeeded + } + return false +} + +// * +// Describes the current status of a task. +type TaskStatus struct { + TaskID TaskID `protobuf:"bytes,1,req,name=task_id,json=taskId" json:"task_id"` + State *TaskState `protobuf:"varint,2,req,name=state,enum=mesos.TaskState" json:"state,omitempty"` + Message *string `protobuf:"bytes,4,opt,name=message" json:"message,omitempty"` + Source *TaskStatus_Source `protobuf:"varint,9,opt,name=source,enum=mesos.TaskStatus_Source" json:"source,omitempty"` + Reason *TaskStatus_Reason `protobuf:"varint,10,opt,name=reason,enum=mesos.TaskStatus_Reason" json:"reason,omitempty"` + Data []byte `protobuf:"bytes,3,opt,name=data" json:"data,omitempty"` + AgentID *AgentID `protobuf:"bytes,5,opt,name=agent_id,json=agentId" json:"agent_id,omitempty"` + ExecutorID *ExecutorID `protobuf:"bytes,7,opt,name=executor_id,json=executorId" json:"executor_id,omitempty"` + Timestamp *float64 `protobuf:"fixed64,6,opt,name=timestamp" json:"timestamp,omitempty"` + // Statuses that are delivered reliably to the scheduler will + // include a 'uuid'. The status is considered delivered once + // it is acknowledged by the scheduler. Schedulers can choose + // to either explicitly acknowledge statuses or let the scheduler + // driver implicitly acknowledge (default). + // + // TODO(bmahler): This is currently overwritten in the scheduler + // driver and executor driver, but executors will need to set this + // to a valid RFC-4122 UUID if using the HTTP API. + UUID []byte `protobuf:"bytes,11,opt,name=uuid" json:"uuid,omitempty"` + // Describes whether the task has been determined to be healthy (true) or + // unhealthy (false) according to the `health_check` field in `TaskInfo`. + Healthy *bool `protobuf:"varint,8,opt,name=healthy" json:"healthy,omitempty"` + // Contains check status for the check specified in the corresponding + // `TaskInfo`. If no check has been specified, this field must be + // absent, otherwise it must be present even if the check status is + // not available yet. If the status update is triggered for a different + // reason than `REASON_TASK_CHECK_STATUS_UPDATED`, this field will contain + // the last known value. + // + // NOTE: A check-related task status update is triggered if and only if + // the value or presence of any field in `CheckStatusInfo` changes. + // + // NOTE: Check support in built-in executors is experimental. + CheckStatus *CheckStatusInfo `protobuf:"bytes,15,opt,name=check_status,json=checkStatus" json:"check_status,omitempty"` + // Labels are free-form key value pairs which are exposed through + // master and agent endpoints. Labels will not be interpreted or + // acted upon by Mesos itself. As opposed to the data field, labels + // will be kept in memory on master and agent processes. Therefore, + // labels should be used to tag TaskStatus message with light-weight + // meta-data. Labels should not contain duplicate key-value pairs. + Labels *Labels `protobuf:"bytes,12,opt,name=labels" json:"labels,omitempty"` + // Container related information that is resolved dynamically such as + // network address. + ContainerStatus *ContainerStatus `protobuf:"bytes,13,opt,name=container_status,json=containerStatus" json:"container_status,omitempty"` + // The time (according to the master's clock) when the agent where + // this task was running became unreachable. This is only set on + // status updates for tasks running on agents that are unreachable + // (e.g., partitioned away from the master). + UnreachableTime *TimeInfo `protobuf:"bytes,14,opt,name=unreachable_time,json=unreachableTime" json:"unreachable_time,omitempty"` + // If the reason field indicates a container resource limitation, + // this field optionally contains additional information. + Limitation *TaskResourceLimitation `protobuf:"bytes,16,opt,name=limitation" json:"limitation,omitempty"` +} + +func (m *TaskStatus) Reset() { *m = TaskStatus{} } +func (*TaskStatus) ProtoMessage() {} +func (*TaskStatus) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{51} } + +func (m *TaskStatus) GetTaskID() TaskID { + if m != nil { + return m.TaskID + } + return TaskID{} +} + +func (m *TaskStatus) GetState() TaskState { + if m != nil && m.State != nil { + return *m.State + } + return TASK_STAGING +} + +func (m *TaskStatus) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +func (m *TaskStatus) GetSource() TaskStatus_Source { + if m != nil && m.Source != nil { + return *m.Source + } + return SOURCE_MASTER +} + +func (m *TaskStatus) GetReason() TaskStatus_Reason { + if m != nil && m.Reason != nil { + return *m.Reason + } + return REASON_COMMAND_EXECUTOR_FAILED +} + +func (m *TaskStatus) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +func (m *TaskStatus) GetAgentID() *AgentID { + if m != nil { + return m.AgentID + } + return nil +} + +func (m *TaskStatus) GetExecutorID() *ExecutorID { + if m != nil { + return m.ExecutorID + } + return nil +} + +func (m *TaskStatus) GetTimestamp() float64 { + if m != nil && m.Timestamp != nil { + return *m.Timestamp + } + return 0 +} + +func (m *TaskStatus) GetUUID() []byte { + if m != nil { + return m.UUID + } + return nil +} + +func (m *TaskStatus) GetHealthy() bool { + if m != nil && m.Healthy != nil { + return *m.Healthy + } + return false +} + +func (m *TaskStatus) GetCheckStatus() *CheckStatusInfo { + if m != nil { + return m.CheckStatus + } + return nil +} + +func (m *TaskStatus) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +func (m *TaskStatus) GetContainerStatus() *ContainerStatus { + if m != nil { + return m.ContainerStatus + } + return nil +} + +func (m *TaskStatus) GetUnreachableTime() *TimeInfo { + if m != nil { + return m.UnreachableTime + } + return nil +} + +func (m *TaskStatus) GetLimitation() *TaskResourceLimitation { + if m != nil { + return m.Limitation + } + return nil +} + +// * +// Describes possible filters that can be applied to unused resources +// (see SchedulerDriver::launchTasks) to influence the allocator. +type Filters struct { + // Time to consider unused resources refused. Note that all unused + // resources will be considered refused and use the default value + // (below) regardless of whether Filters was passed to + // SchedulerDriver::launchTasks. You MUST pass Filters with this + // field set to change this behavior (i.e., get another offer which + // includes unused resources sooner or later than the default). + // + // If this field is set to a number of seconds greater than 31536000 + // (365 days), then the resources will be considered refused for 365 + // days. If it is set to a negative number, then the default value + // will be used. + RefuseSeconds *float64 `protobuf:"fixed64,1,opt,name=refuse_seconds,json=refuseSeconds,def=5" json:"refuse_seconds,omitempty"` +} + +func (m *Filters) Reset() { *m = Filters{} } +func (*Filters) ProtoMessage() {} +func (*Filters) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{52} } + +const Default_Filters_RefuseSeconds float64 = 5 + +func (m *Filters) GetRefuseSeconds() float64 { + if m != nil && m.RefuseSeconds != nil { + return *m.RefuseSeconds + } + return Default_Filters_RefuseSeconds +} + +// * +// Describes a collection of environment variables. This is used with +// CommandInfo in order to set environment variables before running a +// command. The contents of each variable may be specified as a string +// or a Secret; only one of `value` and `secret` must be set. +type Environment struct { + Variables []Environment_Variable `protobuf:"bytes,1,rep,name=variables" json:"variables"` +} + +func (m *Environment) Reset() { *m = Environment{} } +func (*Environment) ProtoMessage() {} +func (*Environment) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{53} } + +func (m *Environment) GetVariables() []Environment_Variable { + if m != nil { + return m.Variables + } + return nil +} + +type Environment_Variable struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + // In Mesos 1.2, the `Environment.variables.value` message was made + // optional. The default type for `Environment.variables.type` is now VALUE, + // which requires `value` to be set, maintaining backward compatibility. + // + // TODO(greggomann): The default can be removed in Mesos 2.1 (MESOS-7134). + Type *Environment_Variable_Type `protobuf:"varint,3,opt,name=type,enum=mesos.Environment_Variable_Type,def=1" json:"type,omitempty"` + // Only one of `value` and `secret` must be set. + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + Secret *Secret `protobuf:"bytes,4,opt,name=secret" json:"secret,omitempty"` +} + +func (m *Environment_Variable) Reset() { *m = Environment_Variable{} } +func (*Environment_Variable) ProtoMessage() {} +func (*Environment_Variable) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{53, 0} } + +const Default_Environment_Variable_Type Environment_Variable_Type = Environment_Variable_VALUE + +func (m *Environment_Variable) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Environment_Variable) GetType() Environment_Variable_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return Default_Environment_Variable_Type +} + +func (m *Environment_Variable) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +func (m *Environment_Variable) GetSecret() *Secret { + if m != nil { + return m.Secret + } + return nil +} + +// * +// A generic (key, value) pair used in various places for parameters. +type Parameter struct { + Key string `protobuf:"bytes,1,req,name=key" json:"key"` + Value string `protobuf:"bytes,2,req,name=value" json:"value"` +} + +func (m *Parameter) Reset() { *m = Parameter{} } +func (*Parameter) ProtoMessage() {} +func (*Parameter) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{54} } + +func (m *Parameter) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *Parameter) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +// * +// Collection of Parameter. +type Parameters struct { + Parameter []Parameter `protobuf:"bytes,1,rep,name=parameter" json:"parameter"` +} + +func (m *Parameters) Reset() { *m = Parameters{} } +func (*Parameters) ProtoMessage() {} +func (*Parameters) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{55} } + +func (m *Parameters) GetParameter() []Parameter { + if m != nil { + return m.Parameter + } + return nil +} + +// * +// Credential used in various places for authentication and +// authorization. +// +// NOTE: A 'principal' is different from 'FrameworkInfo.user'. The +// former is used for authentication and authorization while the +// latter is used to determine the default user under which the +// framework's executors/tasks are run. +type Credential struct { + Principal string `protobuf:"bytes,1,req,name=principal" json:"principal"` + Secret *string `protobuf:"bytes,2,opt,name=secret" json:"secret,omitempty"` +} + +func (m *Credential) Reset() { *m = Credential{} } +func (*Credential) ProtoMessage() {} +func (*Credential) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{56} } + +func (m *Credential) GetPrincipal() string { + if m != nil { + return m.Principal + } + return "" +} + +func (m *Credential) GetSecret() string { + if m != nil && m.Secret != nil { + return *m.Secret + } + return "" +} + +// * +// Credentials used for framework authentication, HTTP authentication +// (where the common 'username' and 'password' are captured as +// 'principal' and 'secret' respectively), etc. +type Credentials struct { + Credentials []Credential `protobuf:"bytes,1,rep,name=credentials" json:"credentials"` +} + +func (m *Credentials) Reset() { *m = Credentials{} } +func (*Credentials) ProtoMessage() {} +func (*Credentials) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{57} } + +func (m *Credentials) GetCredentials() []Credential { + if m != nil { + return m.Credentials + } + return nil +} + +// * +// Secret used to pass privileged information. It is designed to provide +// pass-by-value or pass-by-reference semantics, where the REFERENCE type can be +// used by custom modules which interact with a secure back-end. +type Secret struct { + Type Secret_Type `protobuf:"varint,1,opt,name=type,enum=mesos.Secret_Type" json:"type"` + // Only one of `reference` and `value` must be set. + Reference *Secret_Reference `protobuf:"bytes,2,opt,name=reference" json:"reference,omitempty"` + Value *Secret_Value `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` +} + +func (m *Secret) Reset() { *m = Secret{} } +func (*Secret) ProtoMessage() {} +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{58} } + +func (m *Secret) GetType() Secret_Type { + if m != nil { + return m.Type + } + return Secret_UNKNOWN +} + +func (m *Secret) GetReference() *Secret_Reference { + if m != nil { + return m.Reference + } + return nil +} + +func (m *Secret) GetValue() *Secret_Value { + if m != nil { + return m.Value + } + return nil +} + +// Can be used by modules to refer to a secret stored in a secure back-end. +// The `key` field is provided to permit reference to a single value within a +// secret containing arbitrary key-value pairs. +// +// For example, given a back-end secret store with a secret named +// "my-secret" containing the following key-value pairs: +// +// { +// "username": "my-user", +// "password": "my-password +// } +// +// the username could be referred to in a `Secret` by specifying +// "my-secret" for the `name` and "username" for the `key`. +type Secret_Reference struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + Key *string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` +} + +func (m *Secret_Reference) Reset() { *m = Secret_Reference{} } +func (*Secret_Reference) ProtoMessage() {} +func (*Secret_Reference) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{58, 0} } + +func (m *Secret_Reference) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Secret_Reference) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +// Used to pass the value of a secret. +type Secret_Value struct { + Data []byte `protobuf:"bytes,1,req,name=data" json:"data,omitempty"` +} + +func (m *Secret_Value) Reset() { *m = Secret_Value{} } +func (*Secret_Value) ProtoMessage() {} +func (*Secret_Value) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{58, 1} } + +func (m *Secret_Value) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// * +// Rate (queries per second, QPS) limit for messages from a framework to master. +// Strictly speaking they are the combined rate from all frameworks of the same +// principal. +type RateLimit struct { + // Leaving QPS unset gives it unlimited rate (i.e., not throttled), + // which also implies unlimited capacity. + QPS *float64 `protobuf:"fixed64,1,opt,name=qps" json:"qps,omitempty"` + // Principal of framework(s) to be throttled. Should match + // FrameworkInfo.principal and Credential.principal (if using authentication). + Principal string `protobuf:"bytes,2,req,name=principal" json:"principal"` + // Max number of outstanding messages from frameworks of this principal + // allowed by master before the next message is dropped and an error is sent + // back to the sender. Messages received before the capacity is reached are + // still going to be processed after the error is sent. + // If unspecified, this principal is assigned unlimited capacity. + // NOTE: This value is ignored if 'qps' is not set. + Capacity *uint64 `protobuf:"varint,3,opt,name=capacity" json:"capacity,omitempty"` +} + +func (m *RateLimit) Reset() { *m = RateLimit{} } +func (*RateLimit) ProtoMessage() {} +func (*RateLimit) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{59} } + +func (m *RateLimit) GetQPS() float64 { + if m != nil && m.QPS != nil { + return *m.QPS + } + return 0 +} + +func (m *RateLimit) GetPrincipal() string { + if m != nil { + return m.Principal + } + return "" +} + +func (m *RateLimit) GetCapacity() uint64 { + if m != nil && m.Capacity != nil { + return *m.Capacity + } + return 0 +} + +// * +// Collection of RateLimit. +// Frameworks without rate limits defined here are not throttled unless +// 'aggregate_default_qps' is specified. +type RateLimits struct { + // Items should have unique principals. + Limits []RateLimit `protobuf:"bytes,1,rep,name=limits" json:"limits"` + // All the frameworks not specified in 'limits' get this default rate. + // This rate is an aggregate rate for all of them, i.e., their combined + // traffic is throttled together at this rate. + AggregateDefaultQPS *float64 `protobuf:"fixed64,2,opt,name=aggregate_default_qps,json=aggregateDefaultQps" json:"aggregate_default_qps,omitempty"` + // All the frameworks not specified in 'limits' get this default capacity. + // This is an aggregate value similar to 'aggregate_default_qps'. + AggregateDefaultCapacity *uint64 `protobuf:"varint,3,opt,name=aggregate_default_capacity,json=aggregateDefaultCapacity" json:"aggregate_default_capacity,omitempty"` +} + +func (m *RateLimits) Reset() { *m = RateLimits{} } +func (*RateLimits) ProtoMessage() {} +func (*RateLimits) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{60} } + +func (m *RateLimits) GetLimits() []RateLimit { + if m != nil { + return m.Limits + } + return nil +} + +func (m *RateLimits) GetAggregateDefaultQPS() float64 { + if m != nil && m.AggregateDefaultQPS != nil { + return *m.AggregateDefaultQPS + } + return 0 +} + +func (m *RateLimits) GetAggregateDefaultCapacity() uint64 { + if m != nil && m.AggregateDefaultCapacity != nil { + return *m.AggregateDefaultCapacity + } + return 0 +} + +// * +// Describe an image used by tasks or executors. Note that it's only +// for tasks or executors launched by MesosContainerizer currently. +type Image struct { + Type *Image_Type `protobuf:"varint,1,req,name=type,enum=mesos.Image_Type" json:"type,omitempty"` + // Only one of the following image messages should be set to match + // the type. + Appc *Image_Appc `protobuf:"bytes,2,opt,name=appc" json:"appc,omitempty"` + Docker *Image_Docker `protobuf:"bytes,3,opt,name=docker" json:"docker,omitempty"` + // With this flag set to false, the mesos containerizer will pull + // the docker/appc image from the registry even if the image is + // already downloaded on the agent. + Cached *bool `protobuf:"varint,4,opt,name=cached,def=1" json:"cached,omitempty"` +} + +func (m *Image) Reset() { *m = Image{} } +func (*Image) ProtoMessage() {} +func (*Image) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{61} } + +const Default_Image_Cached bool = true + +func (m *Image) GetType() Image_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return Image_APPC +} + +func (m *Image) GetAppc() *Image_Appc { + if m != nil { + return m.Appc + } + return nil +} + +func (m *Image) GetDocker() *Image_Docker { + if m != nil { + return m.Docker + } + return nil +} + +func (m *Image) GetCached() bool { + if m != nil && m.Cached != nil { + return *m.Cached + } + return Default_Image_Cached +} + +// Protobuf for specifying an Appc container image. See: +// https://github.com/appc/spec/blob/master/spec/aci.md +type Image_Appc struct { + // The name of the image. + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + // An image ID is a string of the format "hash-value", where + // "hash" is the hash algorithm used and "value" is the hex + // encoded string of the digest. Currently the only permitted + // hash algorithm is sha512. + ID *string `protobuf:"bytes,2,opt,name=id" json:"id,omitempty"` + // Optional labels. Suggested labels: "version", "os", and "arch". + Labels *Labels `protobuf:"bytes,3,opt,name=labels" json:"labels,omitempty"` +} + +func (m *Image_Appc) Reset() { *m = Image_Appc{} } +func (*Image_Appc) ProtoMessage() {} +func (*Image_Appc) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{61, 0} } + +func (m *Image_Appc) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Image_Appc) GetID() string { + if m != nil && m.ID != nil { + return *m.ID + } + return "" +} + +func (m *Image_Appc) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +type Image_Docker struct { + // The name of the image. Expected format: + // [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG|@TYPE:DIGEST] + // + // See: https://docs.docker.com/reference/commandline/pull/ + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + // Credential to authenticate with docker registry. + // NOTE: This is not encrypted, therefore framework and operators + // should enable SSL when passing this information. + // + // This field has never been used in Mesos before and is + // deprecated since Mesos 1.3. Please use `config` below + // (see MESOS-7088 for details). + Credential *Credential `protobuf:"bytes,2,opt,name=credential" json:"credential,omitempty"` + // Docker config containing credentials to authenticate with + // docker registry. The secret is expected to be a docker + // config file in JSON format with UTF-8 character encoding. + Config *Secret `protobuf:"bytes,3,opt,name=config" json:"config,omitempty"` +} + +func (m *Image_Docker) Reset() { *m = Image_Docker{} } +func (*Image_Docker) ProtoMessage() {} +func (*Image_Docker) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{61, 1} } + +func (m *Image_Docker) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Image_Docker) GetCredential() *Credential { + if m != nil { + return m.Credential + } + return nil +} + +func (m *Image_Docker) GetConfig() *Secret { + if m != nil { + return m.Config + } + return nil +} + +// * +// Describes how the mount will be propagated for a volume. See the +// following doc for more details about mount propagation: +// https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt +type MountPropagation struct { + Mode *MountPropagation_Mode `protobuf:"varint,1,opt,name=mode,enum=mesos.MountPropagation_Mode" json:"mode,omitempty"` +} + +func (m *MountPropagation) Reset() { *m = MountPropagation{} } +func (*MountPropagation) ProtoMessage() {} +func (*MountPropagation) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{62} } + +func (m *MountPropagation) GetMode() MountPropagation_Mode { + if m != nil && m.Mode != nil { + return *m.Mode + } + return MountPropagation_UNKNOWN +} + +// * +// Describes a volume mapping either from host to container or vice +// versa. Both paths can either refer to a directory or a file. +type Volume struct { + // TODO(gyliu513): Make this as `optional` after deprecation cycle of 1.0. + Mode *Volume_Mode `protobuf:"varint,3,req,name=mode,enum=mesos.Volume_Mode" json:"mode,omitempty"` + // Path pointing to a directory or file in the container. If the + // path is a relative path, it is relative to the container work + // directory. If the path is an absolute path, that path must + // already exist. + ContainerPath string `protobuf:"bytes,1,req,name=container_path,json=containerPath" json:"container_path"` + // Absolute path pointing to a directory or file on the host or a + // path relative to the container work directory. + HostPath *string `protobuf:"bytes,2,opt,name=host_path,json=hostPath" json:"host_path,omitempty"` + // The source of the volume is an Image which describes a root + // filesystem which will be provisioned by Mesos. + Image *Image `protobuf:"bytes,4,opt,name=image" json:"image,omitempty"` + Source *Volume_Source `protobuf:"bytes,5,opt,name=source" json:"source,omitempty"` +} + +func (m *Volume) Reset() { *m = Volume{} } +func (*Volume) ProtoMessage() {} +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{63} } + +func (m *Volume) GetMode() Volume_Mode { + if m != nil && m.Mode != nil { + return *m.Mode + } + return RW +} + +func (m *Volume) GetContainerPath() string { + if m != nil { + return m.ContainerPath + } + return "" +} + +func (m *Volume) GetHostPath() string { + if m != nil && m.HostPath != nil { + return *m.HostPath + } + return "" +} + +func (m *Volume) GetImage() *Image { + if m != nil { + return m.Image + } + return nil +} + +func (m *Volume) GetSource() *Volume_Source { + if m != nil { + return m.Source + } + return nil +} + +// Describes where a volume originates from. +type Volume_Source struct { + // Enum fields should be optional, see: MESOS-4997. + Type Volume_Source_Type `protobuf:"varint,1,opt,name=type,enum=mesos.Volume_Source_Type" json:"type"` + // The source of the volume created by docker volume driver. + DockerVolume *Volume_Source_DockerVolume `protobuf:"bytes,2,opt,name=docker_volume,json=dockerVolume" json:"docker_volume,omitempty"` + HostPath *Volume_Source_HostPath `protobuf:"bytes,5,opt,name=host_path,json=hostPath" json:"host_path,omitempty"` + SandboxPath *Volume_Source_SandboxPath `protobuf:"bytes,3,opt,name=sandbox_path,json=sandboxPath" json:"sandbox_path,omitempty"` + // The volume/secret isolator uses the secret-fetcher module (third-party or + // internal) downloads the secret and makes it available at container_path. + Secret *Secret `protobuf:"bytes,4,opt,name=secret" json:"secret,omitempty"` +} + +func (m *Volume_Source) Reset() { *m = Volume_Source{} } +func (*Volume_Source) ProtoMessage() {} +func (*Volume_Source) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{63, 0} } + +func (m *Volume_Source) GetType() Volume_Source_Type { + if m != nil { + return m.Type + } + return Volume_Source_UNKNOWN +} + +func (m *Volume_Source) GetDockerVolume() *Volume_Source_DockerVolume { + if m != nil { + return m.DockerVolume + } + return nil +} + +func (m *Volume_Source) GetHostPath() *Volume_Source_HostPath { + if m != nil { + return m.HostPath + } + return nil +} + +func (m *Volume_Source) GetSandboxPath() *Volume_Source_SandboxPath { + if m != nil { + return m.SandboxPath + } + return nil +} + +func (m *Volume_Source) GetSecret() *Secret { + if m != nil { + return m.Secret + } + return nil +} + +type Volume_Source_DockerVolume struct { + // Driver of the volume, it can be flocker, convoy, raxrey etc. + Driver *string `protobuf:"bytes,1,opt,name=driver" json:"driver,omitempty"` + // Name of the volume. + Name string `protobuf:"bytes,2,req,name=name" json:"name"` + // Volume driver specific options. + DriverOptions *Parameters `protobuf:"bytes,3,opt,name=driver_options,json=driverOptions" json:"driver_options,omitempty"` +} + +func (m *Volume_Source_DockerVolume) Reset() { *m = Volume_Source_DockerVolume{} } +func (*Volume_Source_DockerVolume) ProtoMessage() {} +func (*Volume_Source_DockerVolume) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{63, 0, 0} +} + +func (m *Volume_Source_DockerVolume) GetDriver() string { + if m != nil && m.Driver != nil { + return *m.Driver + } + return "" +} + +func (m *Volume_Source_DockerVolume) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Volume_Source_DockerVolume) GetDriverOptions() *Parameters { + if m != nil { + return m.DriverOptions + } + return nil +} + +// Absolute path pointing to a directory or file on the host. +type Volume_Source_HostPath struct { + Path string `protobuf:"bytes,1,req,name=path" json:"path"` + MountPropagation *MountPropagation `protobuf:"bytes,2,opt,name=mount_propagation,json=mountPropagation" json:"mount_propagation,omitempty"` +} + +func (m *Volume_Source_HostPath) Reset() { *m = Volume_Source_HostPath{} } +func (*Volume_Source_HostPath) ProtoMessage() {} +func (*Volume_Source_HostPath) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{63, 0, 1} +} + +func (m *Volume_Source_HostPath) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *Volume_Source_HostPath) GetMountPropagation() *MountPropagation { + if m != nil { + return m.MountPropagation + } + return nil +} + +// Describe a path from a container's sandbox. The container can +// be the current container (SELF), or its parent container +// (PARENT). PARENT allows all child containers to share a volume +// from their parent container's sandbox. It'll be an error if +// the current container is a top level container. +type Volume_Source_SandboxPath struct { + Type Volume_Source_SandboxPath_Type `protobuf:"varint,1,opt,name=type,enum=mesos.Volume_Source_SandboxPath_Type" json:"type"` + // A path relative to the corresponding container's sandbox. + // Note that upwards traversal (i.e. ../../abc) is not allowed. + Path string `protobuf:"bytes,2,req,name=path" json:"path"` +} + +func (m *Volume_Source_SandboxPath) Reset() { *m = Volume_Source_SandboxPath{} } +func (*Volume_Source_SandboxPath) ProtoMessage() {} +func (*Volume_Source_SandboxPath) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{63, 0, 2} +} + +func (m *Volume_Source_SandboxPath) GetType() Volume_Source_SandboxPath_Type { + if m != nil { + return m.Type + } + return Volume_Source_SandboxPath_UNKNOWN +} + +func (m *Volume_Source_SandboxPath) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +// * +// Describes a network request from a framework as well as network resolution +// provided by Mesos. +// +// A framework may request the network isolator on the Agent to isolate the +// container in a network namespace and create a virtual network interface. +// The `NetworkInfo` message describes the properties of that virtual +// interface, including the IP addresses and network isolation policy +// (network group membership). +// +// The NetworkInfo message is not interpreted by the Master or Agent and is +// intended to be used by Agent and Master modules implementing network +// isolation. If the modules are missing, the message is simply ignored. In +// future, the task launch will fail if there is no module providing the +// network isolation capabilities (MESOS-3390). +// +// An executor, Agent, or an Agent module may append NetworkInfos inside +// TaskStatus::container_status to provide information such as the container IP +// address and isolation groups. +type NetworkInfo struct { + // When included in a ContainerInfo, each of these represent a + // request for an IP address. Each request can specify an explicit address + // or the IP protocol to use. + // + // When included in a TaskStatus message, these inform the framework + // scheduler about the IP addresses that are bound to the container + // interface. When there are no custom network isolator modules installed, + // this field is filled in automatically with the Agent IP address. + IPAddresses []NetworkInfo_IPAddress `protobuf:"bytes,5,rep,name=ip_addresses,json=ipAddresses" json:"ip_addresses"` + // Name of the network which will be used by network isolator to determine + // the network that the container joins. It's up to the network isolator + // to decide how to interpret this field. + Name *string `protobuf:"bytes,6,opt,name=name" json:"name,omitempty"` + // A group is the name given to a set of logically-related interfaces that + // are allowed to communicate among themselves. Network traffic is allowed + // between two container interfaces that share at least one network group. + // For example, one might want to create separate groups for isolating dev, + // testing, qa and prod deployment environments. + Groups []string `protobuf:"bytes,3,rep,name=groups" json:"groups,omitempty"` + // To tag certain metadata to be used by Isolator/IPAM, e.g., rack, etc. + Labels *Labels `protobuf:"bytes,4,opt,name=labels" json:"labels,omitempty"` + PortMappings []NetworkInfo_PortMapping `protobuf:"bytes,7,rep,name=port_mappings,json=portMappings" json:"port_mappings"` +} + +func (m *NetworkInfo) Reset() { *m = NetworkInfo{} } +func (*NetworkInfo) ProtoMessage() {} +func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{64} } + +func (m *NetworkInfo) GetIPAddresses() []NetworkInfo_IPAddress { + if m != nil { + return m.IPAddresses + } + return nil +} + +func (m *NetworkInfo) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *NetworkInfo) GetGroups() []string { + if m != nil { + return m.Groups + } + return nil +} + +func (m *NetworkInfo) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +func (m *NetworkInfo) GetPortMappings() []NetworkInfo_PortMapping { + if m != nil { + return m.PortMappings + } + return nil +} + +// Specifies a request for an IP address, or reports the assigned container +// IP address. +// +// Users can request an automatically assigned IP (for example, via an +// IPAM service) or a specific IP by adding a NetworkInfo to the +// ContainerInfo for a task. On a request, specifying neither `protocol` +// nor `ip_address` means that any available address may be assigned. +type NetworkInfo_IPAddress struct { + // Specify IP address requirement. Set protocol to the desired value to + // request the network isolator on the Agent to assign an IP address to the + // container being launched. If a specific IP address is specified in + // ip_address, this field should not be set. + Protocol *NetworkInfo_Protocol `protobuf:"varint,1,opt,name=protocol,enum=mesos.NetworkInfo_Protocol,def=1" json:"protocol,omitempty"` + // Statically assigned IP provided by the Framework. This IP will be + // assigned to the container by the network isolator module on the Agent. + // This field should not be used with the protocol field above. + // + // If an explicit address is requested but is unavailable, the network + // isolator should fail the task. + IPAddress *string `protobuf:"bytes,2,opt,name=ip_address,json=ipAddress" json:"ip_address,omitempty"` +} + +func (m *NetworkInfo_IPAddress) Reset() { *m = NetworkInfo_IPAddress{} } +func (*NetworkInfo_IPAddress) ProtoMessage() {} +func (*NetworkInfo_IPAddress) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{64, 0} } + +const Default_NetworkInfo_IPAddress_Protocol NetworkInfo_Protocol = IPv4 + +func (m *NetworkInfo_IPAddress) GetProtocol() NetworkInfo_Protocol { + if m != nil && m.Protocol != nil { + return *m.Protocol + } + return Default_NetworkInfo_IPAddress_Protocol +} + +func (m *NetworkInfo_IPAddress) GetIPAddress() string { + if m != nil && m.IPAddress != nil { + return *m.IPAddress + } + return "" +} + +// Specifies a port mapping request for the task on this network. +type NetworkInfo_PortMapping struct { + HostPort uint32 `protobuf:"varint,1,req,name=host_port,json=hostPort" json:"host_port"` + ContainerPort uint32 `protobuf:"varint,2,req,name=container_port,json=containerPort" json:"container_port"` + // Protocol to expose as (ie: tcp, udp). + Protocol *string `protobuf:"bytes,3,opt,name=protocol" json:"protocol,omitempty"` +} + +func (m *NetworkInfo_PortMapping) Reset() { *m = NetworkInfo_PortMapping{} } +func (*NetworkInfo_PortMapping) ProtoMessage() {} +func (*NetworkInfo_PortMapping) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{64, 1} } + +func (m *NetworkInfo_PortMapping) GetHostPort() uint32 { + if m != nil { + return m.HostPort + } + return 0 +} + +func (m *NetworkInfo_PortMapping) GetContainerPort() uint32 { + if m != nil { + return m.ContainerPort + } + return 0 +} + +func (m *NetworkInfo_PortMapping) GetProtocol() string { + if m != nil && m.Protocol != nil { + return *m.Protocol + } + return "" +} + +// * +// Encapsulation of `Capabilities` supported by Linux. +// Reference: http://linux.die.net/man/7/capabilities. +type CapabilityInfo struct { + Capabilities []CapabilityInfo_Capability `protobuf:"varint,1,rep,name=capabilities,enum=mesos.CapabilityInfo_Capability" json:"capabilities,omitempty"` +} + +func (m *CapabilityInfo) Reset() { *m = CapabilityInfo{} } +func (*CapabilityInfo) ProtoMessage() {} +func (*CapabilityInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{65} } + +func (m *CapabilityInfo) GetCapabilities() []CapabilityInfo_Capability { + if m != nil { + return m.Capabilities + } + return nil +} + +// * +// Encapsulation for Linux specific configuration. +// E.g, capabilities, limits etc. +type LinuxInfo struct { + // Since 1.4.0, deprecated in favor of `effective_capabilities`. + CapabilityInfo *CapabilityInfo `protobuf:"bytes,1,opt,name=capability_info,json=capabilityInfo" json:"capability_info,omitempty"` + // The set of capabilities that are allowed but not initially + // granted to tasks. + BoundingCapabilities *CapabilityInfo `protobuf:"bytes,2,opt,name=bounding_capabilities,json=boundingCapabilities" json:"bounding_capabilities,omitempty"` + // Represents the set of capabilities that the task will + // be executed with. + EffectiveCapabilities *CapabilityInfo `protobuf:"bytes,3,opt,name=effective_capabilities,json=effectiveCapabilities" json:"effective_capabilities,omitempty"` + // If set as 'true', the container shares the pid namespace with + // its parent. If the container is a top level container, it will + // share the pid namespace with the agent. If the container is a + // nested container, it will share the pid namespace with its + // parent container. This field will be ignored if 'namespaces/pid' + // isolator is not enabled. + SharePIDNamespace *bool `protobuf:"varint,4,opt,name=share_pid_namespace,json=sharePidNamespace" json:"share_pid_namespace,omitempty"` +} + +func (m *LinuxInfo) Reset() { *m = LinuxInfo{} } +func (*LinuxInfo) ProtoMessage() {} +func (*LinuxInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{66} } + +func (m *LinuxInfo) GetCapabilityInfo() *CapabilityInfo { + if m != nil { + return m.CapabilityInfo + } + return nil +} + +func (m *LinuxInfo) GetBoundingCapabilities() *CapabilityInfo { + if m != nil { + return m.BoundingCapabilities + } + return nil +} + +func (m *LinuxInfo) GetEffectiveCapabilities() *CapabilityInfo { + if m != nil { + return m.EffectiveCapabilities + } + return nil +} + +func (m *LinuxInfo) GetSharePIDNamespace() bool { + if m != nil && m.SharePIDNamespace != nil { + return *m.SharePIDNamespace + } + return false +} + +// * +// Encapsulation for POSIX rlimits, see +// http://pubs.opengroup.org/onlinepubs/009695399/functions/getrlimit.html. +// Note that some types might only be defined for Linux. +// We use a custom prefix to avoid conflict with existing system macros +// (e.g., `RLIMIT_CPU` or `NOFILE`). +type RLimitInfo struct { + Rlimits []RLimitInfo_RLimit `protobuf:"bytes,1,rep,name=rlimits" json:"rlimits"` +} + +func (m *RLimitInfo) Reset() { *m = RLimitInfo{} } +func (*RLimitInfo) ProtoMessage() {} +func (*RLimitInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{67} } + +func (m *RLimitInfo) GetRlimits() []RLimitInfo_RLimit { + if m != nil { + return m.Rlimits + } + return nil +} + +type RLimitInfo_RLimit struct { + Type RLimitInfo_RLimit_Type `protobuf:"varint,1,opt,name=type,enum=mesos.RLimitInfo_RLimit_Type" json:"type"` + // Either both are set or both are not set. + // If both are not set, it represents unlimited. + // If both are set, we require `soft` <= `hard`. + Hard *uint64 `protobuf:"varint,2,opt,name=hard" json:"hard,omitempty"` + Soft *uint64 `protobuf:"varint,3,opt,name=soft" json:"soft,omitempty"` +} + +func (m *RLimitInfo_RLimit) Reset() { *m = RLimitInfo_RLimit{} } +func (*RLimitInfo_RLimit) ProtoMessage() {} +func (*RLimitInfo_RLimit) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{67, 0} } + +func (m *RLimitInfo_RLimit) GetType() RLimitInfo_RLimit_Type { + if m != nil { + return m.Type + } + return RLimitInfo_RLimit_UNKNOWN +} + +func (m *RLimitInfo_RLimit) GetHard() uint64 { + if m != nil && m.Hard != nil { + return *m.Hard + } + return 0 +} + +func (m *RLimitInfo_RLimit) GetSoft() uint64 { + if m != nil && m.Soft != nil { + return *m.Soft + } + return 0 +} + +// * +// Describes the information about (pseudo) TTY that can +// be attached to a process running in a container. +type TTYInfo struct { + WindowSize *TTYInfo_WindowSize `protobuf:"bytes,1,opt,name=window_size,json=windowSize" json:"window_size,omitempty"` +} + +func (m *TTYInfo) Reset() { *m = TTYInfo{} } +func (*TTYInfo) ProtoMessage() {} +func (*TTYInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{68} } + +func (m *TTYInfo) GetWindowSize() *TTYInfo_WindowSize { + if m != nil { + return m.WindowSize + } + return nil +} + +type TTYInfo_WindowSize struct { + Rows uint32 `protobuf:"varint,1,req,name=rows" json:"rows"` + Columns uint32 `protobuf:"varint,2,req,name=columns" json:"columns"` +} + +func (m *TTYInfo_WindowSize) Reset() { *m = TTYInfo_WindowSize{} } +func (*TTYInfo_WindowSize) ProtoMessage() {} +func (*TTYInfo_WindowSize) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{68, 0} } + +func (m *TTYInfo_WindowSize) GetRows() uint32 { + if m != nil { + return m.Rows + } + return 0 +} + +func (m *TTYInfo_WindowSize) GetColumns() uint32 { + if m != nil { + return m.Columns + } + return 0 +} + +// * +// Describes a container configuration and allows extensible +// configurations for different container implementations. +// +// NOTE: `ContainerInfo` may be specified, e.g., by a task, even if no +// container image is provided. In this case neither `MesosInfo` nor +// `DockerInfo` is set, the required `type` must be `MESOS`. This is to +// address a case when a task without an image, e.g., a shell script +// with URIs, wants to use features originally designed for containers, +// for example custom network isolation via `NetworkInfo`. +type ContainerInfo struct { + Type *ContainerInfo_Type `protobuf:"varint,1,req,name=type,enum=mesos.ContainerInfo_Type" json:"type,omitempty"` + Volumes []Volume `protobuf:"bytes,2,rep,name=volumes" json:"volumes"` + Hostname *string `protobuf:"bytes,4,opt,name=hostname" json:"hostname,omitempty"` + // Only one of the following *Info messages should be set to match + // the type. + Docker *ContainerInfo_DockerInfo `protobuf:"bytes,3,opt,name=docker" json:"docker,omitempty"` + Mesos *ContainerInfo_MesosInfo `protobuf:"bytes,5,opt,name=mesos" json:"mesos,omitempty"` + // A list of network requests. A framework can request multiple IP addresses + // for the container. + NetworkInfos []NetworkInfo `protobuf:"bytes,7,rep,name=network_infos,json=networkInfos" json:"network_infos"` + // Linux specific information for the container. + LinuxInfo *LinuxInfo `protobuf:"bytes,8,opt,name=linux_info,json=linuxInfo" json:"linux_info,omitempty"` + // (POSIX only) rlimits of the container. + RlimitInfo *RLimitInfo `protobuf:"bytes,9,opt,name=rlimit_info,json=rlimitInfo" json:"rlimit_info,omitempty"` + // If specified a tty will be attached to the container entrypoint. + TTYInfo *TTYInfo `protobuf:"bytes,10,opt,name=tty_info,json=ttyInfo" json:"tty_info,omitempty"` +} + +func (m *ContainerInfo) Reset() { *m = ContainerInfo{} } +func (*ContainerInfo) ProtoMessage() {} +func (*ContainerInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{69} } + +func (m *ContainerInfo) GetType() ContainerInfo_Type { + if m != nil && m.Type != nil { + return *m.Type + } + return ContainerInfo_DOCKER +} + +func (m *ContainerInfo) GetVolumes() []Volume { + if m != nil { + return m.Volumes + } + return nil +} + +func (m *ContainerInfo) GetHostname() string { + if m != nil && m.Hostname != nil { + return *m.Hostname + } + return "" +} + +func (m *ContainerInfo) GetDocker() *ContainerInfo_DockerInfo { + if m != nil { + return m.Docker + } + return nil +} + +func (m *ContainerInfo) GetMesos() *ContainerInfo_MesosInfo { + if m != nil { + return m.Mesos + } + return nil +} + +func (m *ContainerInfo) GetNetworkInfos() []NetworkInfo { + if m != nil { + return m.NetworkInfos + } + return nil +} + +func (m *ContainerInfo) GetLinuxInfo() *LinuxInfo { + if m != nil { + return m.LinuxInfo + } + return nil +} + +func (m *ContainerInfo) GetRlimitInfo() *RLimitInfo { + if m != nil { + return m.RlimitInfo + } + return nil +} + +func (m *ContainerInfo) GetTTYInfo() *TTYInfo { + if m != nil { + return m.TTYInfo + } + return nil +} + +type ContainerInfo_DockerInfo struct { + // The docker image that is going to be passed to the registry. + Image string `protobuf:"bytes,1,req,name=image" json:"image"` + Network *ContainerInfo_DockerInfo_Network `protobuf:"varint,2,opt,name=network,enum=mesos.ContainerInfo_DockerInfo_Network,def=1" json:"network,omitempty"` + PortMappings []ContainerInfo_DockerInfo_PortMapping `protobuf:"bytes,3,rep,name=port_mappings,json=portMappings" json:"port_mappings"` + Privileged *bool `protobuf:"varint,4,opt,name=privileged,def=0" json:"privileged,omitempty"` + // Allowing arbitrary parameters to be passed to docker CLI. + // Note that anything passed to this field is not guaranteed + // to be supported moving forward, as we might move away from + // the docker CLI. + Parameters []Parameter `protobuf:"bytes,5,rep,name=parameters" json:"parameters"` + // With this flag set to true, the docker containerizer will + // pull the docker image from the registry even if the image + // is already downloaded on the agent. + ForcePullImage *bool `protobuf:"varint,6,opt,name=force_pull_image,json=forcePullImage" json:"force_pull_image,omitempty"` + // The name of volume driver plugin. + VolumeDriver *string `protobuf:"bytes,7,opt,name=volume_driver,json=volumeDriver" json:"volume_driver,omitempty"` +} + +func (m *ContainerInfo_DockerInfo) Reset() { *m = ContainerInfo_DockerInfo{} } +func (*ContainerInfo_DockerInfo) ProtoMessage() {} +func (*ContainerInfo_DockerInfo) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{69, 0} +} + +const Default_ContainerInfo_DockerInfo_Network ContainerInfo_DockerInfo_Network = ContainerInfo_DockerInfo_HOST +const Default_ContainerInfo_DockerInfo_Privileged bool = false + +func (m *ContainerInfo_DockerInfo) GetImage() string { + if m != nil { + return m.Image + } + return "" +} + +func (m *ContainerInfo_DockerInfo) GetNetwork() ContainerInfo_DockerInfo_Network { + if m != nil && m.Network != nil { + return *m.Network + } + return Default_ContainerInfo_DockerInfo_Network +} + +func (m *ContainerInfo_DockerInfo) GetPortMappings() []ContainerInfo_DockerInfo_PortMapping { + if m != nil { + return m.PortMappings + } + return nil +} + +func (m *ContainerInfo_DockerInfo) GetPrivileged() bool { + if m != nil && m.Privileged != nil { + return *m.Privileged + } + return Default_ContainerInfo_DockerInfo_Privileged +} + +func (m *ContainerInfo_DockerInfo) GetParameters() []Parameter { + if m != nil { + return m.Parameters + } + return nil +} + +func (m *ContainerInfo_DockerInfo) GetForcePullImage() bool { + if m != nil && m.ForcePullImage != nil { + return *m.ForcePullImage + } + return false +} + +func (m *ContainerInfo_DockerInfo) GetVolumeDriver() string { + if m != nil && m.VolumeDriver != nil { + return *m.VolumeDriver + } + return "" +} + +type ContainerInfo_DockerInfo_PortMapping struct { + HostPort uint32 `protobuf:"varint,1,req,name=host_port,json=hostPort" json:"host_port"` + ContainerPort uint32 `protobuf:"varint,2,req,name=container_port,json=containerPort" json:"container_port"` + // Protocol to expose as (ie: tcp, udp). + Protocol *string `protobuf:"bytes,3,opt,name=protocol" json:"protocol,omitempty"` +} + +func (m *ContainerInfo_DockerInfo_PortMapping) Reset() { *m = ContainerInfo_DockerInfo_PortMapping{} } +func (*ContainerInfo_DockerInfo_PortMapping) ProtoMessage() {} +func (*ContainerInfo_DockerInfo_PortMapping) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{69, 0, 0} +} + +func (m *ContainerInfo_DockerInfo_PortMapping) GetHostPort() uint32 { + if m != nil { + return m.HostPort + } + return 0 +} + +func (m *ContainerInfo_DockerInfo_PortMapping) GetContainerPort() uint32 { + if m != nil { + return m.ContainerPort + } + return 0 +} + +func (m *ContainerInfo_DockerInfo_PortMapping) GetProtocol() string { + if m != nil && m.Protocol != nil { + return *m.Protocol + } + return "" +} + +type ContainerInfo_MesosInfo struct { + Image *Image `protobuf:"bytes,1,opt,name=image" json:"image,omitempty"` +} + +func (m *ContainerInfo_MesosInfo) Reset() { *m = ContainerInfo_MesosInfo{} } +func (*ContainerInfo_MesosInfo) ProtoMessage() {} +func (*ContainerInfo_MesosInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{69, 1} } + +func (m *ContainerInfo_MesosInfo) GetImage() *Image { + if m != nil { + return m.Image + } + return nil +} + +// * +// Container related information that is resolved during container +// setup. The information is sent back to the framework as part of the +// TaskStatus message. +type ContainerStatus struct { + ContainerID *ContainerID `protobuf:"bytes,4,opt,name=container_id,json=containerId" json:"container_id,omitempty"` + // This field can be reliably used to identify the container IP address. + NetworkInfos []NetworkInfo `protobuf:"bytes,1,rep,name=network_infos,json=networkInfos" json:"network_infos"` + // Information about Linux control group (cgroup). + CgroupInfo *CgroupInfo `protobuf:"bytes,2,opt,name=cgroup_info,json=cgroupInfo" json:"cgroup_info,omitempty"` + // Information about Executor PID. + ExecutorPID *uint32 `protobuf:"varint,3,opt,name=executor_pid,json=executorPid" json:"executor_pid,omitempty"` +} + +func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } +func (*ContainerStatus) ProtoMessage() {} +func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{70} } + +func (m *ContainerStatus) GetContainerID() *ContainerID { + if m != nil { + return m.ContainerID + } + return nil +} + +func (m *ContainerStatus) GetNetworkInfos() []NetworkInfo { + if m != nil { + return m.NetworkInfos + } + return nil +} + +func (m *ContainerStatus) GetCgroupInfo() *CgroupInfo { + if m != nil { + return m.CgroupInfo + } + return nil +} + +func (m *ContainerStatus) GetExecutorPID() uint32 { + if m != nil && m.ExecutorPID != nil { + return *m.ExecutorPID + } + return 0 +} + +// * +// Linux control group (cgroup) information. +type CgroupInfo struct { + NetCLS *CgroupInfo_NetCls `protobuf:"bytes,1,opt,name=net_cls,json=netCls" json:"net_cls,omitempty"` +} + +func (m *CgroupInfo) Reset() { *m = CgroupInfo{} } +func (*CgroupInfo) ProtoMessage() {} +func (*CgroupInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{71} } + +func (m *CgroupInfo) GetNetCLS() *CgroupInfo_NetCls { + if m != nil { + return m.NetCLS + } + return nil +} + +// Configuration of a blkio cgroup subsystem. +type CgroupInfo_Blkio struct { +} + +func (m *CgroupInfo_Blkio) Reset() { *m = CgroupInfo_Blkio{} } +func (*CgroupInfo_Blkio) ProtoMessage() {} +func (*CgroupInfo_Blkio) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{71, 0} } + +// Describes a stat value without the device descriptor part. +type CgroupInfo_Blkio_Value struct { + Op *CgroupInfo_Blkio_Operation `protobuf:"varint,1,opt,name=op,enum=mesos.CgroupInfo_Blkio_Operation" json:"op,omitempty"` + Value *uint64 `protobuf:"varint,2,opt,name=value" json:"value,omitempty"` +} + +func (m *CgroupInfo_Blkio_Value) Reset() { *m = CgroupInfo_Blkio_Value{} } +func (*CgroupInfo_Blkio_Value) ProtoMessage() {} +func (*CgroupInfo_Blkio_Value) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{71, 0, 0} +} + +func (m *CgroupInfo_Blkio_Value) GetOp() CgroupInfo_Blkio_Operation { + if m != nil && m.Op != nil { + return *m.Op + } + return CgroupInfo_Blkio_UNKNOWN +} + +func (m *CgroupInfo_Blkio_Value) GetValue() uint64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type CgroupInfo_Blkio_CFQ struct { +} + +func (m *CgroupInfo_Blkio_CFQ) Reset() { *m = CgroupInfo_Blkio_CFQ{} } +func (*CgroupInfo_Blkio_CFQ) ProtoMessage() {} +func (*CgroupInfo_Blkio_CFQ) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{71, 0, 1} } + +type CgroupInfo_Blkio_CFQ_Statistics struct { + // Stats are grouped by block devices. If `device` is not + // set, it represents `Total`. + Device *Device_Number `protobuf:"bytes,1,opt,name=device" json:"device,omitempty"` + // blkio.sectors + Sectors *uint64 `protobuf:"varint,2,opt,name=sectors" json:"sectors,omitempty"` + // blkio.time + Time *uint64 `protobuf:"varint,3,opt,name=time" json:"time,omitempty"` + // blkio.io_serviced + IOServiced []CgroupInfo_Blkio_Value `protobuf:"bytes,4,rep,name=io_serviced,json=ioServiced" json:"io_serviced"` + // blkio.io_service_bytes + IOServiceBytes []CgroupInfo_Blkio_Value `protobuf:"bytes,5,rep,name=io_service_bytes,json=ioServiceBytes" json:"io_service_bytes"` + // blkio.io_service_time + IOServiceTime []CgroupInfo_Blkio_Value `protobuf:"bytes,6,rep,name=io_service_time,json=ioServiceTime" json:"io_service_time"` + // blkio.io_wait_time + IOWaitTime []CgroupInfo_Blkio_Value `protobuf:"bytes,7,rep,name=io_wait_time,json=ioWaitTime" json:"io_wait_time"` + // blkio.io_merged + IOMerged []CgroupInfo_Blkio_Value `protobuf:"bytes,8,rep,name=io_merged,json=ioMerged" json:"io_merged"` + // blkio.io_queued + IOQueued []CgroupInfo_Blkio_Value `protobuf:"bytes,9,rep,name=io_queued,json=ioQueued" json:"io_queued"` +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) Reset() { *m = CgroupInfo_Blkio_CFQ_Statistics{} } +func (*CgroupInfo_Blkio_CFQ_Statistics) ProtoMessage() {} +func (*CgroupInfo_Blkio_CFQ_Statistics) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{71, 0, 1, 0} +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetDevice() *Device_Number { + if m != nil { + return m.Device + } + return nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetSectors() uint64 { + if m != nil && m.Sectors != nil { + return *m.Sectors + } + return 0 +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetTime() uint64 { + if m != nil && m.Time != nil { + return *m.Time + } + return 0 +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetIOServiced() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOServiced + } + return nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetIOServiceBytes() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOServiceBytes + } + return nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetIOServiceTime() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOServiceTime + } + return nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetIOWaitTime() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOWaitTime + } + return nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetIOMerged() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOMerged + } + return nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) GetIOQueued() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOQueued + } + return nil +} + +type CgroupInfo_Blkio_Throttling struct { +} + +func (m *CgroupInfo_Blkio_Throttling) Reset() { *m = CgroupInfo_Blkio_Throttling{} } +func (*CgroupInfo_Blkio_Throttling) ProtoMessage() {} +func (*CgroupInfo_Blkio_Throttling) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{71, 0, 2} +} + +type CgroupInfo_Blkio_Throttling_Statistics struct { + // Stats are grouped by block devices. If `device` is not + // set, it represents `Total`. + Device *Device_Number `protobuf:"bytes,1,opt,name=device" json:"device,omitempty"` + // blkio.throttle.io_serviced + IOServiced []CgroupInfo_Blkio_Value `protobuf:"bytes,2,rep,name=io_serviced,json=ioServiced" json:"io_serviced"` + // blkio.throttle.io_service_bytes + IOServiceBytes []CgroupInfo_Blkio_Value `protobuf:"bytes,3,rep,name=io_service_bytes,json=ioServiceBytes" json:"io_service_bytes"` +} + +func (m *CgroupInfo_Blkio_Throttling_Statistics) Reset() { + *m = CgroupInfo_Blkio_Throttling_Statistics{} +} +func (*CgroupInfo_Blkio_Throttling_Statistics) ProtoMessage() {} +func (*CgroupInfo_Blkio_Throttling_Statistics) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{71, 0, 2, 0} +} + +func (m *CgroupInfo_Blkio_Throttling_Statistics) GetDevice() *Device_Number { + if m != nil { + return m.Device + } + return nil +} + +func (m *CgroupInfo_Blkio_Throttling_Statistics) GetIOServiced() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOServiced + } + return nil +} + +func (m *CgroupInfo_Blkio_Throttling_Statistics) GetIOServiceBytes() []CgroupInfo_Blkio_Value { + if m != nil { + return m.IOServiceBytes + } + return nil +} + +type CgroupInfo_Blkio_Statistics struct { + CFQ []CgroupInfo_Blkio_CFQ_Statistics `protobuf:"bytes,1,rep,name=cfq" json:"cfq"` + CFQRecursive []CgroupInfo_Blkio_CFQ_Statistics `protobuf:"bytes,2,rep,name=cfq_recursive,json=cfqRecursive" json:"cfq_recursive"` + Throttling []*CgroupInfo_Blkio_Throttling_Statistics `protobuf:"bytes,3,rep,name=throttling" json:"throttling,omitempty"` +} + +func (m *CgroupInfo_Blkio_Statistics) Reset() { *m = CgroupInfo_Blkio_Statistics{} } +func (*CgroupInfo_Blkio_Statistics) ProtoMessage() {} +func (*CgroupInfo_Blkio_Statistics) Descriptor() ([]byte, []int) { + return fileDescriptorMesos, []int{71, 0, 3} +} + +func (m *CgroupInfo_Blkio_Statistics) GetCFQ() []CgroupInfo_Blkio_CFQ_Statistics { + if m != nil { + return m.CFQ + } + return nil +} + +func (m *CgroupInfo_Blkio_Statistics) GetCFQRecursive() []CgroupInfo_Blkio_CFQ_Statistics { + if m != nil { + return m.CFQRecursive + } + return nil +} + +func (m *CgroupInfo_Blkio_Statistics) GetThrottling() []*CgroupInfo_Blkio_Throttling_Statistics { + if m != nil { + return m.Throttling + } + return nil +} + +// Configuration of a net_cls cgroup subsystem. +type CgroupInfo_NetCls struct { + // The 32-bit classid consists of two parts, a 16 bit major handle + // and a 16-bit minor handle. The major and minor handle are + // represented using the format 0xAAAABBBB, where 0xAAAA is the + // 16-bit major handle and 0xBBBB is the 16-bit minor handle. + ClassID *uint32 `protobuf:"varint,1,opt,name=classid" json:"classid,omitempty"` +} + +func (m *CgroupInfo_NetCls) Reset() { *m = CgroupInfo_NetCls{} } +func (*CgroupInfo_NetCls) ProtoMessage() {} +func (*CgroupInfo_NetCls) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{71, 1} } + +func (m *CgroupInfo_NetCls) GetClassID() uint32 { + if m != nil && m.ClassID != nil { + return *m.ClassID + } + return 0 +} + +// * +// Collection of labels. Labels should not contain duplicate key-value +// pairs. +type Labels struct { + Labels []Label `protobuf:"bytes,1,rep,name=labels" json:"labels"` +} + +func (m *Labels) Reset() { *m = Labels{} } +func (*Labels) ProtoMessage() {} +func (*Labels) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{72} } + +func (m *Labels) GetLabels() []Label { + if m != nil { + return m.Labels + } + return nil +} + +// * +// Key, value pair used to store free form user-data. +type Label struct { + Key string `protobuf:"bytes,1,req,name=key" json:"key"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *Label) Reset() { *m = Label{} } +func (*Label) ProtoMessage() {} +func (*Label) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{73} } + +func (m *Label) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *Label) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +// * +// Named port used for service discovery. +type Port struct { + // Port number on which the framework exposes a service. + Number uint32 `protobuf:"varint,1,req,name=number" json:"number"` + // Name of the service hosted on this port. + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + // Layer 4-7 protocol on which the framework exposes its services. + Protocol *string `protobuf:"bytes,3,opt,name=protocol" json:"protocol,omitempty"` + // This field restricts discovery within a framework (FRAMEWORK), + // within a Mesos cluster (CLUSTER), or places no restrictions (EXTERNAL). + // The visibility setting for a Port overrides the general visibility setting + // in the DiscoveryInfo. + Visibility *DiscoveryInfo_Visibility `protobuf:"varint,4,opt,name=visibility,enum=mesos.DiscoveryInfo_Visibility" json:"visibility,omitempty"` + // This can be used to decorate the message with metadata to be + // interpreted by external applications such as firewalls. + Labels *Labels `protobuf:"bytes,5,opt,name=labels" json:"labels,omitempty"` +} + +func (m *Port) Reset() { *m = Port{} } +func (*Port) ProtoMessage() {} +func (*Port) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{74} } + +func (m *Port) GetNumber() uint32 { + if m != nil { + return m.Number + } + return 0 +} + +func (m *Port) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *Port) GetProtocol() string { + if m != nil && m.Protocol != nil { + return *m.Protocol + } + return "" +} + +func (m *Port) GetVisibility() DiscoveryInfo_Visibility { + if m != nil && m.Visibility != nil { + return *m.Visibility + } + return FRAMEWORK +} + +func (m *Port) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +// * +// Collection of ports. +type Ports struct { + Ports []Port `protobuf:"bytes,1,rep,name=ports" json:"ports"` +} + +func (m *Ports) Reset() { *m = Ports{} } +func (*Ports) ProtoMessage() {} +func (*Ports) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{75} } + +func (m *Ports) GetPorts() []Port { + if m != nil { + return m.Ports + } + return nil +} + +// * +// Service discovery information. +// The visibility field restricts discovery within a framework (FRAMEWORK), +// within a Mesos cluster (CLUSTER), or places no restrictions (EXTERNAL). +// Each port in the ports field also has an optional visibility field. +// If visibility is specified for a port, it overrides the default service-wide +// DiscoveryInfo.visibility for that port. +// The environment, location, and version fields provide first class support for +// common attributes used to differentiate between similar services. The +// environment may receive values such as PROD/QA/DEV, the location field may +// receive values like EAST-US/WEST-US/EUROPE/AMEA, and the version field may +// receive values like v2.0/v0.9. The exact use of these fields is up to each +// service discovery system. +type DiscoveryInfo struct { + Visibility DiscoveryInfo_Visibility `protobuf:"varint,1,req,name=visibility,enum=mesos.DiscoveryInfo_Visibility" json:"visibility"` + Name *string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` + Environment *string `protobuf:"bytes,3,opt,name=environment" json:"environment,omitempty"` + Location *string `protobuf:"bytes,4,opt,name=location" json:"location,omitempty"` + Version *string `protobuf:"bytes,5,opt,name=version" json:"version,omitempty"` + Ports *Ports `protobuf:"bytes,6,opt,name=ports" json:"ports,omitempty"` + Labels *Labels `protobuf:"bytes,7,opt,name=labels" json:"labels,omitempty"` +} + +func (m *DiscoveryInfo) Reset() { *m = DiscoveryInfo{} } +func (*DiscoveryInfo) ProtoMessage() {} +func (*DiscoveryInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{76} } + +func (m *DiscoveryInfo) GetVisibility() DiscoveryInfo_Visibility { + if m != nil { + return m.Visibility + } + return FRAMEWORK +} + +func (m *DiscoveryInfo) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *DiscoveryInfo) GetEnvironment() string { + if m != nil && m.Environment != nil { + return *m.Environment + } + return "" +} + +func (m *DiscoveryInfo) GetLocation() string { + if m != nil && m.Location != nil { + return *m.Location + } + return "" +} + +func (m *DiscoveryInfo) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +func (m *DiscoveryInfo) GetPorts() *Ports { + if m != nil { + return m.Ports + } + return nil +} + +func (m *DiscoveryInfo) GetLabels() *Labels { + if m != nil { + return m.Labels + } + return nil +} + +// * +// Named WeightInfo to indicate resource allocation +// priority between the different roles. +type WeightInfo struct { + Weight float64 `protobuf:"fixed64,1,req,name=weight" json:"weight"` + // Related role name. + Role *string `protobuf:"bytes,2,opt,name=role" json:"role,omitempty"` +} + +func (m *WeightInfo) Reset() { *m = WeightInfo{} } +func (*WeightInfo) ProtoMessage() {} +func (*WeightInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{77} } + +func (m *WeightInfo) GetWeight() float64 { + if m != nil { + return m.Weight + } + return 0 +} + +func (m *WeightInfo) GetRole() string { + if m != nil && m.Role != nil { + return *m.Role + } + return "" +} + +// * +// Version information of a component. +type VersionInfo struct { + Version string `protobuf:"bytes,1,req,name=version" json:"version"` + BuildDate *string `protobuf:"bytes,2,opt,name=build_date,json=buildDate" json:"build_date,omitempty"` + BuildTime *float64 `protobuf:"fixed64,3,opt,name=build_time,json=buildTime" json:"build_time,omitempty"` + BuildUser *string `protobuf:"bytes,4,opt,name=build_user,json=buildUser" json:"build_user,omitempty"` + GitSHA *string `protobuf:"bytes,5,opt,name=git_sha,json=gitSha" json:"git_sha,omitempty"` + GitBranch *string `protobuf:"bytes,6,opt,name=git_branch,json=gitBranch" json:"git_branch,omitempty"` + GitTag *string `protobuf:"bytes,7,opt,name=git_tag,json=gitTag" json:"git_tag,omitempty"` +} + +func (m *VersionInfo) Reset() { *m = VersionInfo{} } +func (*VersionInfo) ProtoMessage() {} +func (*VersionInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{78} } + +func (m *VersionInfo) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *VersionInfo) GetBuildDate() string { + if m != nil && m.BuildDate != nil { + return *m.BuildDate + } + return "" +} + +func (m *VersionInfo) GetBuildTime() float64 { + if m != nil && m.BuildTime != nil { + return *m.BuildTime + } + return 0 +} + +func (m *VersionInfo) GetBuildUser() string { + if m != nil && m.BuildUser != nil { + return *m.BuildUser + } + return "" +} + +func (m *VersionInfo) GetGitSHA() string { + if m != nil && m.GitSHA != nil { + return *m.GitSHA + } + return "" +} + +func (m *VersionInfo) GetGitBranch() string { + if m != nil && m.GitBranch != nil { + return *m.GitBranch + } + return "" +} + +func (m *VersionInfo) GetGitTag() string { + if m != nil && m.GitTag != nil { + return *m.GitTag + } + return "" +} + +// * +// Flag consists of a name and optionally its value. +type Flag struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` +} + +func (m *Flag) Reset() { *m = Flag{} } +func (*Flag) ProtoMessage() {} +func (*Flag) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{79} } + +func (m *Flag) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Flag) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +// * +// Describes a Role. Roles can be used to specify that certain resources are +// reserved for the use of one or more frameworks. +type Role struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + Weight float64 `protobuf:"fixed64,2,req,name=weight" json:"weight"` + Frameworks []FrameworkID `protobuf:"bytes,3,rep,name=frameworks" json:"frameworks"` + Resources []Resource `protobuf:"bytes,4,rep,name=resources" json:"resources"` +} + +func (m *Role) Reset() { *m = Role{} } +func (*Role) ProtoMessage() {} +func (*Role) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{80} } + +func (m *Role) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Role) GetWeight() float64 { + if m != nil { + return m.Weight + } + return 0 +} + +func (m *Role) GetFrameworks() []FrameworkID { + if m != nil { + return m.Frameworks + } + return nil +} + +func (m *Role) GetResources() []Resource { + if m != nil { + return m.Resources + } + return nil +} + +// * +// Metric consists of a name and optionally its value. +type Metric struct { + Name string `protobuf:"bytes,1,req,name=name" json:"name"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (*Metric) ProtoMessage() {} +func (*Metric) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{81} } + +func (m *Metric) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Metric) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +// * +// Describes a File. +type FileInfo struct { + // Absolute path to the file. + Path string `protobuf:"bytes,1,req,name=path" json:"path"` + // Number of hard links. + Nlink *int32 `protobuf:"varint,2,opt,name=nlink" json:"nlink,omitempty"` + // Total size in bytes. + Size *uint64 `protobuf:"varint,3,opt,name=size" json:"size,omitempty"` + // Last modification time. + Mtime *TimeInfo `protobuf:"bytes,4,opt,name=mtime" json:"mtime,omitempty"` + // Represents a file's mode and permission bits. The bits have the same + // definition on all systems and is portable. + Mode *uint32 `protobuf:"varint,5,opt,name=mode" json:"mode,omitempty"` + // User ID of owner. + UID *string `protobuf:"bytes,6,opt,name=uid" json:"uid,omitempty"` + // Group ID of owner. + GID *string `protobuf:"bytes,7,opt,name=gid" json:"gid,omitempty"` +} + +func (m *FileInfo) Reset() { *m = FileInfo{} } +func (*FileInfo) ProtoMessage() {} +func (*FileInfo) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{82} } + +func (m *FileInfo) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *FileInfo) GetNlink() int32 { + if m != nil && m.Nlink != nil { + return *m.Nlink + } + return 0 +} + +func (m *FileInfo) GetSize() uint64 { + if m != nil && m.Size != nil { + return *m.Size + } + return 0 +} + +func (m *FileInfo) GetMtime() *TimeInfo { + if m != nil { + return m.Mtime + } + return nil +} + +func (m *FileInfo) GetMode() uint32 { + if m != nil && m.Mode != nil { + return *m.Mode + } + return 0 +} + +func (m *FileInfo) GetUID() string { + if m != nil && m.UID != nil { + return *m.UID + } + return "" +} + +func (m *FileInfo) GetGID() string { + if m != nil && m.GID != nil { + return *m.GID + } + return "" +} + +// * +// Describes information abount a device. +type Device struct { + Path *string `protobuf:"bytes,1,opt,name=path" json:"path,omitempty"` + Number *Device_Number `protobuf:"bytes,2,opt,name=number" json:"number,omitempty"` +} + +func (m *Device) Reset() { *m = Device{} } +func (*Device) ProtoMessage() {} +func (*Device) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{83} } + +func (m *Device) GetPath() string { + if m != nil && m.Path != nil { + return *m.Path + } + return "" +} + +func (m *Device) GetNumber() *Device_Number { + if m != nil { + return m.Number + } + return nil +} + +type Device_Number struct { + MajorNumber *uint64 `protobuf:"varint,1,req,name=major_number,json=majorNumber" json:"major_number,omitempty"` + MinorNumber *uint64 `protobuf:"varint,2,req,name=minor_number,json=minorNumber" json:"minor_number,omitempty"` +} + +func (m *Device_Number) Reset() { *m = Device_Number{} } +func (*Device_Number) ProtoMessage() {} +func (*Device_Number) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{83, 0} } + +func (m *Device_Number) GetMajorNumber() uint64 { + if m != nil && m.MajorNumber != nil { + return *m.MajorNumber + } + return 0 +} + +func (m *Device_Number) GetMinorNumber() uint64 { + if m != nil && m.MinorNumber != nil { + return *m.MinorNumber + } + return 0 +} + +// * +// Describes a device whitelist entry that expose from host to container. +type DeviceAccess struct { + Device Device `protobuf:"bytes,1,req,name=device" json:"device"` + Access DeviceAccess_Access `protobuf:"bytes,2,req,name=access" json:"access"` +} + +func (m *DeviceAccess) Reset() { *m = DeviceAccess{} } +func (*DeviceAccess) ProtoMessage() {} +func (*DeviceAccess) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{84} } + +func (m *DeviceAccess) GetDevice() Device { + if m != nil { + return m.Device + } + return Device{} +} + +func (m *DeviceAccess) GetAccess() DeviceAccess_Access { + if m != nil { + return m.Access + } + return DeviceAccess_Access{} +} + +type DeviceAccess_Access struct { + Read *bool `protobuf:"varint,1,opt,name=read" json:"read,omitempty"` + Write *bool `protobuf:"varint,2,opt,name=write" json:"write,omitempty"` + Mknod *bool `protobuf:"varint,3,opt,name=mknod" json:"mknod,omitempty"` +} + +func (m *DeviceAccess_Access) Reset() { *m = DeviceAccess_Access{} } +func (*DeviceAccess_Access) ProtoMessage() {} +func (*DeviceAccess_Access) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{84, 0} } + +func (m *DeviceAccess_Access) GetRead() bool { + if m != nil && m.Read != nil { + return *m.Read + } + return false +} + +func (m *DeviceAccess_Access) GetWrite() bool { + if m != nil && m.Write != nil { + return *m.Write + } + return false +} + +func (m *DeviceAccess_Access) GetMknod() bool { + if m != nil && m.Mknod != nil { + return *m.Mknod + } + return false +} + +type DeviceWhitelist struct { + AllowedDevices []DeviceAccess `protobuf:"bytes,1,rep,name=allowed_devices,json=allowedDevices" json:"allowed_devices"` +} + +func (m *DeviceWhitelist) Reset() { *m = DeviceWhitelist{} } +func (*DeviceWhitelist) ProtoMessage() {} +func (*DeviceWhitelist) Descriptor() ([]byte, []int) { return fileDescriptorMesos, []int{85} } + +func (m *DeviceWhitelist) GetAllowedDevices() []DeviceAccess { + if m != nil { + return m.AllowedDevices + } + return nil +} + +func init() { + proto.RegisterType((*FrameworkID)(nil), "mesos.FrameworkID") + proto.RegisterType((*OfferID)(nil), "mesos.OfferID") + proto.RegisterType((*AgentID)(nil), "mesos.AgentID") + proto.RegisterType((*TaskID)(nil), "mesos.TaskID") + proto.RegisterType((*ExecutorID)(nil), "mesos.ExecutorID") + proto.RegisterType((*ContainerID)(nil), "mesos.ContainerID") + proto.RegisterType((*ResourceProviderID)(nil), "mesos.ResourceProviderID") + proto.RegisterType((*OperationID)(nil), "mesos.OperationID") + proto.RegisterType((*TimeInfo)(nil), "mesos.TimeInfo") + proto.RegisterType((*DurationInfo)(nil), "mesos.DurationInfo") + proto.RegisterType((*Address)(nil), "mesos.Address") + proto.RegisterType((*URL)(nil), "mesos.URL") + proto.RegisterType((*Unavailability)(nil), "mesos.Unavailability") + proto.RegisterType((*MachineID)(nil), "mesos.MachineID") + proto.RegisterType((*MachineInfo)(nil), "mesos.MachineInfo") + proto.RegisterType((*FrameworkInfo)(nil), "mesos.FrameworkInfo") + proto.RegisterType((*FrameworkInfo_Capability)(nil), "mesos.FrameworkInfo.Capability") + proto.RegisterType((*CheckInfo)(nil), "mesos.CheckInfo") + proto.RegisterType((*CheckInfo_Command)(nil), "mesos.CheckInfo.Command") + proto.RegisterType((*CheckInfo_Http)(nil), "mesos.CheckInfo.Http") + proto.RegisterType((*CheckInfo_Tcp)(nil), "mesos.CheckInfo.Tcp") + proto.RegisterType((*HealthCheck)(nil), "mesos.HealthCheck") + proto.RegisterType((*HealthCheck_HTTPCheckInfo)(nil), "mesos.HealthCheck.HTTPCheckInfo") + proto.RegisterType((*HealthCheck_TCPCheckInfo)(nil), "mesos.HealthCheck.TCPCheckInfo") + proto.RegisterType((*KillPolicy)(nil), "mesos.KillPolicy") + proto.RegisterType((*CommandInfo)(nil), "mesos.CommandInfo") + proto.RegisterType((*CommandInfo_URI)(nil), "mesos.CommandInfo.URI") + proto.RegisterType((*ExecutorInfo)(nil), "mesos.ExecutorInfo") + proto.RegisterType((*DomainInfo)(nil), "mesos.DomainInfo") + proto.RegisterType((*DomainInfo_FaultDomain)(nil), "mesos.DomainInfo.FaultDomain") + proto.RegisterType((*DomainInfo_FaultDomain_RegionInfo)(nil), "mesos.DomainInfo.FaultDomain.RegionInfo") + proto.RegisterType((*DomainInfo_FaultDomain_ZoneInfo)(nil), "mesos.DomainInfo.FaultDomain.ZoneInfo") + proto.RegisterType((*MasterInfo)(nil), "mesos.MasterInfo") + proto.RegisterType((*MasterInfo_Capability)(nil), "mesos.MasterInfo.Capability") + proto.RegisterType((*AgentInfo)(nil), "mesos.AgentInfo") + proto.RegisterType((*AgentInfo_Capability)(nil), "mesos.AgentInfo.Capability") + proto.RegisterType((*CSIPluginContainerInfo)(nil), "mesos.CSIPluginContainerInfo") + proto.RegisterType((*CSIPluginInfo)(nil), "mesos.CSIPluginInfo") + proto.RegisterType((*ResourceProviderInfo)(nil), "mesos.ResourceProviderInfo") + proto.RegisterType((*ResourceProviderInfo_Storage)(nil), "mesos.ResourceProviderInfo.Storage") + proto.RegisterType((*Value)(nil), "mesos.Value") + proto.RegisterType((*Value_Scalar)(nil), "mesos.Value.Scalar") + proto.RegisterType((*Value_Range)(nil), "mesos.Value.Range") + proto.RegisterType((*Value_Ranges)(nil), "mesos.Value.Ranges") + proto.RegisterType((*Value_Set)(nil), "mesos.Value.Set") + proto.RegisterType((*Value_Text)(nil), "mesos.Value.Text") + proto.RegisterType((*Attribute)(nil), "mesos.Attribute") + proto.RegisterType((*Resource)(nil), "mesos.Resource") + proto.RegisterType((*Resource_AllocationInfo)(nil), "mesos.Resource.AllocationInfo") + proto.RegisterType((*Resource_ReservationInfo)(nil), "mesos.Resource.ReservationInfo") + proto.RegisterType((*Resource_DiskInfo)(nil), "mesos.Resource.DiskInfo") + proto.RegisterType((*Resource_DiskInfo_Persistence)(nil), "mesos.Resource.DiskInfo.Persistence") + proto.RegisterType((*Resource_DiskInfo_Source)(nil), "mesos.Resource.DiskInfo.Source") + proto.RegisterType((*Resource_DiskInfo_Source_Path)(nil), "mesos.Resource.DiskInfo.Source.Path") + proto.RegisterType((*Resource_DiskInfo_Source_Mount)(nil), "mesos.Resource.DiskInfo.Source.Mount") + proto.RegisterType((*Resource_RevocableInfo)(nil), "mesos.Resource.RevocableInfo") + proto.RegisterType((*Resource_SharedInfo)(nil), "mesos.Resource.SharedInfo") + proto.RegisterType((*TrafficControlStatistics)(nil), "mesos.TrafficControlStatistics") + proto.RegisterType((*IpStatistics)(nil), "mesos.IpStatistics") + proto.RegisterType((*IcmpStatistics)(nil), "mesos.IcmpStatistics") + proto.RegisterType((*TcpStatistics)(nil), "mesos.TcpStatistics") + proto.RegisterType((*UdpStatistics)(nil), "mesos.UdpStatistics") + proto.RegisterType((*SNMPStatistics)(nil), "mesos.SNMPStatistics") + proto.RegisterType((*DiskStatistics)(nil), "mesos.DiskStatistics") + proto.RegisterType((*ResourceStatistics)(nil), "mesos.ResourceStatistics") + proto.RegisterType((*ResourceUsage)(nil), "mesos.ResourceUsage") + proto.RegisterType((*ResourceUsage_Executor)(nil), "mesos.ResourceUsage.Executor") + proto.RegisterType((*ResourceUsage_Executor_Task)(nil), "mesos.ResourceUsage.Executor.Task") + proto.RegisterType((*PerfStatistics)(nil), "mesos.PerfStatistics") + proto.RegisterType((*Request)(nil), "mesos.Request") + proto.RegisterType((*Offer)(nil), "mesos.Offer") + proto.RegisterType((*Offer_Operation)(nil), "mesos.Offer.Operation") + proto.RegisterType((*Offer_Operation_Launch)(nil), "mesos.Offer.Operation.Launch") + proto.RegisterType((*Offer_Operation_LaunchGroup)(nil), "mesos.Offer.Operation.LaunchGroup") + proto.RegisterType((*Offer_Operation_Reserve)(nil), "mesos.Offer.Operation.Reserve") + proto.RegisterType((*Offer_Operation_Unreserve)(nil), "mesos.Offer.Operation.Unreserve") + proto.RegisterType((*Offer_Operation_Create)(nil), "mesos.Offer.Operation.Create") + proto.RegisterType((*Offer_Operation_Destroy)(nil), "mesos.Offer.Operation.Destroy") + proto.RegisterType((*Offer_Operation_GrowVolume)(nil), "mesos.Offer.Operation.GrowVolume") + proto.RegisterType((*Offer_Operation_ShrinkVolume)(nil), "mesos.Offer.Operation.ShrinkVolume") + proto.RegisterType((*Offer_Operation_CreateDisk)(nil), "mesos.Offer.Operation.CreateDisk") + proto.RegisterType((*Offer_Operation_DestroyDisk)(nil), "mesos.Offer.Operation.DestroyDisk") + proto.RegisterType((*InverseOffer)(nil), "mesos.InverseOffer") + proto.RegisterType((*TaskInfo)(nil), "mesos.TaskInfo") + proto.RegisterType((*TaskGroupInfo)(nil), "mesos.TaskGroupInfo") + proto.RegisterType((*Task)(nil), "mesos.Task") + proto.RegisterType((*TaskResourceLimitation)(nil), "mesos.TaskResourceLimitation") + proto.RegisterType((*UUID)(nil), "mesos.UUID") + proto.RegisterType((*Operation)(nil), "mesos.Operation") + proto.RegisterType((*OperationStatus)(nil), "mesos.OperationStatus") + proto.RegisterType((*CheckStatusInfo)(nil), "mesos.CheckStatusInfo") + proto.RegisterType((*CheckStatusInfo_Command)(nil), "mesos.CheckStatusInfo.Command") + proto.RegisterType((*CheckStatusInfo_Http)(nil), "mesos.CheckStatusInfo.Http") + proto.RegisterType((*CheckStatusInfo_Tcp)(nil), "mesos.CheckStatusInfo.Tcp") + proto.RegisterType((*TaskStatus)(nil), "mesos.TaskStatus") + proto.RegisterType((*Filters)(nil), "mesos.Filters") + proto.RegisterType((*Environment)(nil), "mesos.Environment") + proto.RegisterType((*Environment_Variable)(nil), "mesos.Environment.Variable") + proto.RegisterType((*Parameter)(nil), "mesos.Parameter") + proto.RegisterType((*Parameters)(nil), "mesos.Parameters") + proto.RegisterType((*Credential)(nil), "mesos.Credential") + proto.RegisterType((*Credentials)(nil), "mesos.Credentials") + proto.RegisterType((*Secret)(nil), "mesos.Secret") + proto.RegisterType((*Secret_Reference)(nil), "mesos.Secret.Reference") + proto.RegisterType((*Secret_Value)(nil), "mesos.Secret.Value") + proto.RegisterType((*RateLimit)(nil), "mesos.RateLimit") + proto.RegisterType((*RateLimits)(nil), "mesos.RateLimits") + proto.RegisterType((*Image)(nil), "mesos.Image") + proto.RegisterType((*Image_Appc)(nil), "mesos.Image.Appc") + proto.RegisterType((*Image_Docker)(nil), "mesos.Image.Docker") + proto.RegisterType((*MountPropagation)(nil), "mesos.MountPropagation") + proto.RegisterType((*Volume)(nil), "mesos.Volume") + proto.RegisterType((*Volume_Source)(nil), "mesos.Volume.Source") + proto.RegisterType((*Volume_Source_DockerVolume)(nil), "mesos.Volume.Source.DockerVolume") + proto.RegisterType((*Volume_Source_HostPath)(nil), "mesos.Volume.Source.HostPath") + proto.RegisterType((*Volume_Source_SandboxPath)(nil), "mesos.Volume.Source.SandboxPath") + proto.RegisterType((*NetworkInfo)(nil), "mesos.NetworkInfo") + proto.RegisterType((*NetworkInfo_IPAddress)(nil), "mesos.NetworkInfo.IPAddress") + proto.RegisterType((*NetworkInfo_PortMapping)(nil), "mesos.NetworkInfo.PortMapping") + proto.RegisterType((*CapabilityInfo)(nil), "mesos.CapabilityInfo") + proto.RegisterType((*LinuxInfo)(nil), "mesos.LinuxInfo") + proto.RegisterType((*RLimitInfo)(nil), "mesos.RLimitInfo") + proto.RegisterType((*RLimitInfo_RLimit)(nil), "mesos.RLimitInfo.RLimit") + proto.RegisterType((*TTYInfo)(nil), "mesos.TTYInfo") + proto.RegisterType((*TTYInfo_WindowSize)(nil), "mesos.TTYInfo.WindowSize") + proto.RegisterType((*ContainerInfo)(nil), "mesos.ContainerInfo") + proto.RegisterType((*ContainerInfo_DockerInfo)(nil), "mesos.ContainerInfo.DockerInfo") + proto.RegisterType((*ContainerInfo_DockerInfo_PortMapping)(nil), "mesos.ContainerInfo.DockerInfo.PortMapping") + proto.RegisterType((*ContainerInfo_MesosInfo)(nil), "mesos.ContainerInfo.MesosInfo") + proto.RegisterType((*ContainerStatus)(nil), "mesos.ContainerStatus") + proto.RegisterType((*CgroupInfo)(nil), "mesos.CgroupInfo") + proto.RegisterType((*CgroupInfo_Blkio)(nil), "mesos.CgroupInfo.Blkio") + proto.RegisterType((*CgroupInfo_Blkio_Value)(nil), "mesos.CgroupInfo.Blkio.Value") + proto.RegisterType((*CgroupInfo_Blkio_CFQ)(nil), "mesos.CgroupInfo.Blkio.CFQ") + proto.RegisterType((*CgroupInfo_Blkio_CFQ_Statistics)(nil), "mesos.CgroupInfo.Blkio.CFQ.Statistics") + proto.RegisterType((*CgroupInfo_Blkio_Throttling)(nil), "mesos.CgroupInfo.Blkio.Throttling") + proto.RegisterType((*CgroupInfo_Blkio_Throttling_Statistics)(nil), "mesos.CgroupInfo.Blkio.Throttling.Statistics") + proto.RegisterType((*CgroupInfo_Blkio_Statistics)(nil), "mesos.CgroupInfo.Blkio.Statistics") + proto.RegisterType((*CgroupInfo_NetCls)(nil), "mesos.CgroupInfo.NetCls") + proto.RegisterType((*Labels)(nil), "mesos.Labels") + proto.RegisterType((*Label)(nil), "mesos.Label") + proto.RegisterType((*Port)(nil), "mesos.Port") + proto.RegisterType((*Ports)(nil), "mesos.Ports") + proto.RegisterType((*DiscoveryInfo)(nil), "mesos.DiscoveryInfo") + proto.RegisterType((*WeightInfo)(nil), "mesos.WeightInfo") + proto.RegisterType((*VersionInfo)(nil), "mesos.VersionInfo") + proto.RegisterType((*Flag)(nil), "mesos.Flag") + proto.RegisterType((*Role)(nil), "mesos.Role") + proto.RegisterType((*Metric)(nil), "mesos.Metric") + proto.RegisterType((*FileInfo)(nil), "mesos.FileInfo") + proto.RegisterType((*Device)(nil), "mesos.Device") + proto.RegisterType((*Device_Number)(nil), "mesos.Device.Number") + proto.RegisterType((*DeviceAccess)(nil), "mesos.DeviceAccess") + proto.RegisterType((*DeviceAccess_Access)(nil), "mesos.DeviceAccess.Access") + proto.RegisterType((*DeviceWhitelist)(nil), "mesos.DeviceWhitelist") + proto.RegisterEnum("mesos.Status", Status_name, Status_value) + proto.RegisterEnum("mesos.TaskState", TaskState_name, TaskState_value) + proto.RegisterEnum("mesos.OperationState", OperationState_name, OperationState_value) + proto.RegisterEnum("mesos.MachineInfo_Mode", MachineInfo_Mode_name, MachineInfo_Mode_value) + proto.RegisterEnum("mesos.FrameworkInfo_Capability_Type", FrameworkInfo_Capability_Type_name, FrameworkInfo_Capability_Type_value) + proto.RegisterEnum("mesos.CheckInfo_Type", CheckInfo_Type_name, CheckInfo_Type_value) + proto.RegisterEnum("mesos.HealthCheck_Type", HealthCheck_Type_name, HealthCheck_Type_value) + proto.RegisterEnum("mesos.ExecutorInfo_Type", ExecutorInfo_Type_name, ExecutorInfo_Type_value) + proto.RegisterEnum("mesos.MasterInfo_Capability_Type", MasterInfo_Capability_Type_name, MasterInfo_Capability_Type_value) + proto.RegisterEnum("mesos.AgentInfo_Capability_Type", AgentInfo_Capability_Type_name, AgentInfo_Capability_Type_value) + proto.RegisterEnum("mesos.CSIPluginContainerInfo_Service", CSIPluginContainerInfo_Service_name, CSIPluginContainerInfo_Service_value) + proto.RegisterEnum("mesos.Value_Type", Value_Type_name, Value_Type_value) + proto.RegisterEnum("mesos.Resource_ReservationInfo_Type", Resource_ReservationInfo_Type_name, Resource_ReservationInfo_Type_value) + proto.RegisterEnum("mesos.Resource_DiskInfo_Source_Type", Resource_DiskInfo_Source_Type_name, Resource_DiskInfo_Source_Type_value) + proto.RegisterEnum("mesos.Offer_Operation_Type", Offer_Operation_Type_name, Offer_Operation_Type_value) + proto.RegisterEnum("mesos.TaskStatus_Source", TaskStatus_Source_name, TaskStatus_Source_value) + proto.RegisterEnum("mesos.TaskStatus_Reason", TaskStatus_Reason_name, TaskStatus_Reason_value) + proto.RegisterEnum("mesos.Environment_Variable_Type", Environment_Variable_Type_name, Environment_Variable_Type_value) + proto.RegisterEnum("mesos.Secret_Type", Secret_Type_name, Secret_Type_value) + proto.RegisterEnum("mesos.Image_Type", Image_Type_name, Image_Type_value) + proto.RegisterEnum("mesos.MountPropagation_Mode", MountPropagation_Mode_name, MountPropagation_Mode_value) + proto.RegisterEnum("mesos.Volume_Mode", Volume_Mode_name, Volume_Mode_value) + proto.RegisterEnum("mesos.Volume_Source_Type", Volume_Source_Type_name, Volume_Source_Type_value) + proto.RegisterEnum("mesos.Volume_Source_SandboxPath_Type", Volume_Source_SandboxPath_Type_name, Volume_Source_SandboxPath_Type_value) + proto.RegisterEnum("mesos.NetworkInfo_Protocol", NetworkInfo_Protocol_name, NetworkInfo_Protocol_value) + proto.RegisterEnum("mesos.CapabilityInfo_Capability", CapabilityInfo_Capability_name, CapabilityInfo_Capability_value) + proto.RegisterEnum("mesos.RLimitInfo_RLimit_Type", RLimitInfo_RLimit_Type_name, RLimitInfo_RLimit_Type_value) + proto.RegisterEnum("mesos.ContainerInfo_Type", ContainerInfo_Type_name, ContainerInfo_Type_value) + proto.RegisterEnum("mesos.ContainerInfo_DockerInfo_Network", ContainerInfo_DockerInfo_Network_name, ContainerInfo_DockerInfo_Network_value) + proto.RegisterEnum("mesos.CgroupInfo_Blkio_Operation", CgroupInfo_Blkio_Operation_name, CgroupInfo_Blkio_Operation_value) + proto.RegisterEnum("mesos.DiscoveryInfo_Visibility", DiscoveryInfo_Visibility_name, DiscoveryInfo_Visibility_value) +} +func (x Status) String() string { + s, ok := Status_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x TaskState) String() string { + s, ok := TaskState_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x OperationState) String() string { + s, ok := OperationState_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x MachineInfo_Mode) String() string { + s, ok := MachineInfo_Mode_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x FrameworkInfo_Capability_Type) String() string { + s, ok := FrameworkInfo_Capability_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x CheckInfo_Type) String() string { + s, ok := CheckInfo_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x HealthCheck_Type) String() string { + s, ok := HealthCheck_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x ExecutorInfo_Type) String() string { + s, ok := ExecutorInfo_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x MasterInfo_Capability_Type) String() string { + s, ok := MasterInfo_Capability_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x AgentInfo_Capability_Type) String() string { + s, ok := AgentInfo_Capability_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x CSIPluginContainerInfo_Service) String() string { + s, ok := CSIPluginContainerInfo_Service_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Value_Type) String() string { + s, ok := Value_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Resource_ReservationInfo_Type) String() string { + s, ok := Resource_ReservationInfo_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Resource_DiskInfo_Source_Type) String() string { + s, ok := Resource_DiskInfo_Source_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Offer_Operation_Type) String() string { + s, ok := Offer_Operation_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x TaskStatus_Source) String() string { + s, ok := TaskStatus_Source_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x TaskStatus_Reason) String() string { + s, ok := TaskStatus_Reason_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Environment_Variable_Type) String() string { + s, ok := Environment_Variable_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Secret_Type) String() string { + s, ok := Secret_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Image_Type) String() string { + s, ok := Image_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x MountPropagation_Mode) String() string { + s, ok := MountPropagation_Mode_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Volume_Mode) String() string { + s, ok := Volume_Mode_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Volume_Source_Type) String() string { + s, ok := Volume_Source_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x Volume_Source_SandboxPath_Type) String() string { + s, ok := Volume_Source_SandboxPath_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x NetworkInfo_Protocol) String() string { + s, ok := NetworkInfo_Protocol_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x CapabilityInfo_Capability) String() string { + s, ok := CapabilityInfo_Capability_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x RLimitInfo_RLimit_Type) String() string { + s, ok := RLimitInfo_RLimit_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x ContainerInfo_Type) String() string { + s, ok := ContainerInfo_Type_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x ContainerInfo_DockerInfo_Network) String() string { + s, ok := ContainerInfo_DockerInfo_Network_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x CgroupInfo_Blkio_Operation) String() string { + s, ok := CgroupInfo_Blkio_Operation_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (x DiscoveryInfo_Visibility) String() string { + s, ok := DiscoveryInfo_Visibility_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} +func (this *FrameworkID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*FrameworkID) + if !ok { + that2, ok := that.(FrameworkID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *FrameworkID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *FrameworkID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *FrameworkID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *FrameworkID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*FrameworkID) + if !ok { + that2, ok := that.(FrameworkID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *OfferID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*OfferID) + if !ok { + that2, ok := that.(OfferID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *OfferID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *OfferID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *OfferID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *OfferID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*OfferID) + if !ok { + that2, ok := that.(OfferID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *AgentID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*AgentID) + if !ok { + that2, ok := that.(AgentID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *AgentID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *AgentID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *AgentID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *AgentID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*AgentID) + if !ok { + that2, ok := that.(AgentID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *TaskID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TaskID) + if !ok { + that2, ok := that.(TaskID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TaskID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TaskID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TaskID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *TaskID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TaskID) + if !ok { + that2, ok := that.(TaskID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *ExecutorID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ExecutorID) + if !ok { + that2, ok := that.(ExecutorID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ExecutorID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ExecutorID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ExecutorID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *ExecutorID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ExecutorID) + if !ok { + that2, ok := that.(ExecutorID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *ContainerID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ContainerID) + if !ok { + that2, ok := that.(ContainerID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ContainerID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ContainerID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ContainerID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + if !this.Parent.Equal(that1.Parent) { + return fmt.Errorf("Parent this(%v) Not Equal that(%v)", this.Parent, that1.Parent) + } + return nil +} +func (this *ContainerID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ContainerID) + if !ok { + that2, ok := that.(ContainerID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if !this.Parent.Equal(that1.Parent) { + return false + } + return true +} +func (this *ResourceProviderID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ResourceProviderID) + if !ok { + that2, ok := that.(ResourceProviderID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ResourceProviderID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ResourceProviderID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ResourceProviderID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *ResourceProviderID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ResourceProviderID) + if !ok { + that2, ok := that.(ResourceProviderID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *OperationID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*OperationID) + if !ok { + that2, ok := that.(OperationID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *OperationID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *OperationID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *OperationID but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *OperationID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*OperationID) + if !ok { + that2, ok := that.(OperationID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *TimeInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TimeInfo) + if !ok { + that2, ok := that.(TimeInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TimeInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TimeInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TimeInfo but is not nil && this == nil") + } + if this.Nanoseconds != that1.Nanoseconds { + return fmt.Errorf("Nanoseconds this(%v) Not Equal that(%v)", this.Nanoseconds, that1.Nanoseconds) + } + return nil +} +func (this *TimeInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TimeInfo) + if !ok { + that2, ok := that.(TimeInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Nanoseconds != that1.Nanoseconds { + return false + } + return true +} +func (this *DurationInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DurationInfo) + if !ok { + that2, ok := that.(DurationInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DurationInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DurationInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DurationInfo but is not nil && this == nil") + } + if this.Nanoseconds != that1.Nanoseconds { + return fmt.Errorf("Nanoseconds this(%v) Not Equal that(%v)", this.Nanoseconds, that1.Nanoseconds) + } + return nil +} +func (this *DurationInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DurationInfo) + if !ok { + that2, ok := that.(DurationInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Nanoseconds != that1.Nanoseconds { + return false + } + return true +} +func (this *Address) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Address) + if !ok { + that2, ok := that.(Address) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Address") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Address but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Address but is not nil && this == nil") + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", *this.Hostname, *that1.Hostname) + } + } else if this.Hostname != nil { + return fmt.Errorf("this.Hostname == nil && that.Hostname != nil") + } else if that1.Hostname != nil { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", this.Hostname, that1.Hostname) + } + if this.IP != nil && that1.IP != nil { + if *this.IP != *that1.IP { + return fmt.Errorf("IP this(%v) Not Equal that(%v)", *this.IP, *that1.IP) + } + } else if this.IP != nil { + return fmt.Errorf("this.IP == nil && that.IP != nil") + } else if that1.IP != nil { + return fmt.Errorf("IP this(%v) Not Equal that(%v)", this.IP, that1.IP) + } + if this.Port != that1.Port { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", this.Port, that1.Port) + } + return nil +} +func (this *Address) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Address) + if !ok { + that2, ok := that.(Address) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return false + } + } else if this.Hostname != nil { + return false + } else if that1.Hostname != nil { + return false + } + if this.IP != nil && that1.IP != nil { + if *this.IP != *that1.IP { + return false + } + } else if this.IP != nil { + return false + } else if that1.IP != nil { + return false + } + if this.Port != that1.Port { + return false + } + return true +} +func (this *URL) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*URL) + if !ok { + that2, ok := that.(URL) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *URL") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *URL but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *URL but is not nil && this == nil") + } + if this.Scheme != that1.Scheme { + return fmt.Errorf("Scheme this(%v) Not Equal that(%v)", this.Scheme, that1.Scheme) + } + if !this.Address.Equal(&that1.Address) { + return fmt.Errorf("Address this(%v) Not Equal that(%v)", this.Address, that1.Address) + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", *this.Path, *that1.Path) + } + } else if this.Path != nil { + return fmt.Errorf("this.Path == nil && that.Path != nil") + } else if that1.Path != nil { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + if len(this.Query) != len(that1.Query) { + return fmt.Errorf("Query this(%v) Not Equal that(%v)", len(this.Query), len(that1.Query)) + } + for i := range this.Query { + if !this.Query[i].Equal(&that1.Query[i]) { + return fmt.Errorf("Query this[%v](%v) Not Equal that[%v](%v)", i, this.Query[i], i, that1.Query[i]) + } + } + if this.Fragment != nil && that1.Fragment != nil { + if *this.Fragment != *that1.Fragment { + return fmt.Errorf("Fragment this(%v) Not Equal that(%v)", *this.Fragment, *that1.Fragment) + } + } else if this.Fragment != nil { + return fmt.Errorf("this.Fragment == nil && that.Fragment != nil") + } else if that1.Fragment != nil { + return fmt.Errorf("Fragment this(%v) Not Equal that(%v)", this.Fragment, that1.Fragment) + } + return nil +} +func (this *URL) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*URL) + if !ok { + that2, ok := that.(URL) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Scheme != that1.Scheme { + return false + } + if !this.Address.Equal(&that1.Address) { + return false + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return false + } + } else if this.Path != nil { + return false + } else if that1.Path != nil { + return false + } + if len(this.Query) != len(that1.Query) { + return false + } + for i := range this.Query { + if !this.Query[i].Equal(&that1.Query[i]) { + return false + } + } + if this.Fragment != nil && that1.Fragment != nil { + if *this.Fragment != *that1.Fragment { + return false + } + } else if this.Fragment != nil { + return false + } else if that1.Fragment != nil { + return false + } + return true +} +func (this *Unavailability) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Unavailability) + if !ok { + that2, ok := that.(Unavailability) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Unavailability") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Unavailability but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Unavailability but is not nil && this == nil") + } + if !this.Start.Equal(&that1.Start) { + return fmt.Errorf("Start this(%v) Not Equal that(%v)", this.Start, that1.Start) + } + if !this.Duration.Equal(that1.Duration) { + return fmt.Errorf("Duration this(%v) Not Equal that(%v)", this.Duration, that1.Duration) + } + return nil +} +func (this *Unavailability) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Unavailability) + if !ok { + that2, ok := that.(Unavailability) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Start.Equal(&that1.Start) { + return false + } + if !this.Duration.Equal(that1.Duration) { + return false + } + return true +} +func (this *MachineID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*MachineID) + if !ok { + that2, ok := that.(MachineID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *MachineID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *MachineID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *MachineID but is not nil && this == nil") + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", *this.Hostname, *that1.Hostname) + } + } else if this.Hostname != nil { + return fmt.Errorf("this.Hostname == nil && that.Hostname != nil") + } else if that1.Hostname != nil { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", this.Hostname, that1.Hostname) + } + if this.IP != nil && that1.IP != nil { + if *this.IP != *that1.IP { + return fmt.Errorf("IP this(%v) Not Equal that(%v)", *this.IP, *that1.IP) + } + } else if this.IP != nil { + return fmt.Errorf("this.IP == nil && that.IP != nil") + } else if that1.IP != nil { + return fmt.Errorf("IP this(%v) Not Equal that(%v)", this.IP, that1.IP) + } + return nil +} +func (this *MachineID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*MachineID) + if !ok { + that2, ok := that.(MachineID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return false + } + } else if this.Hostname != nil { + return false + } else if that1.Hostname != nil { + return false + } + if this.IP != nil && that1.IP != nil { + if *this.IP != *that1.IP { + return false + } + } else if this.IP != nil { + return false + } else if that1.IP != nil { + return false + } + return true +} +func (this *MachineInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*MachineInfo) + if !ok { + that2, ok := that.(MachineInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *MachineInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *MachineInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *MachineInfo but is not nil && this == nil") + } + if !this.ID.Equal(&that1.ID) { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", *this.Mode, *that1.Mode) + } + } else if this.Mode != nil { + return fmt.Errorf("this.Mode == nil && that.Mode != nil") + } else if that1.Mode != nil { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", this.Mode, that1.Mode) + } + if !this.Unavailability.Equal(that1.Unavailability) { + return fmt.Errorf("Unavailability this(%v) Not Equal that(%v)", this.Unavailability, that1.Unavailability) + } + return nil +} +func (this *MachineInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*MachineInfo) + if !ok { + that2, ok := that.(MachineInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ID.Equal(&that1.ID) { + return false + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return false + } + } else if this.Mode != nil { + return false + } else if that1.Mode != nil { + return false + } + if !this.Unavailability.Equal(that1.Unavailability) { + return false + } + return true +} +func (this *FrameworkInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*FrameworkInfo) + if !ok { + that2, ok := that.(FrameworkInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *FrameworkInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *FrameworkInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *FrameworkInfo but is not nil && this == nil") + } + if this.User != that1.User { + return fmt.Errorf("User this(%v) Not Equal that(%v)", this.User, that1.User) + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if !this.ID.Equal(that1.ID) { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if this.FailoverTimeout != nil && that1.FailoverTimeout != nil { + if *this.FailoverTimeout != *that1.FailoverTimeout { + return fmt.Errorf("FailoverTimeout this(%v) Not Equal that(%v)", *this.FailoverTimeout, *that1.FailoverTimeout) + } + } else if this.FailoverTimeout != nil { + return fmt.Errorf("this.FailoverTimeout == nil && that.FailoverTimeout != nil") + } else if that1.FailoverTimeout != nil { + return fmt.Errorf("FailoverTimeout this(%v) Not Equal that(%v)", this.FailoverTimeout, that1.FailoverTimeout) + } + if this.Checkpoint != nil && that1.Checkpoint != nil { + if *this.Checkpoint != *that1.Checkpoint { + return fmt.Errorf("Checkpoint this(%v) Not Equal that(%v)", *this.Checkpoint, *that1.Checkpoint) + } + } else if this.Checkpoint != nil { + return fmt.Errorf("this.Checkpoint == nil && that.Checkpoint != nil") + } else if that1.Checkpoint != nil { + return fmt.Errorf("Checkpoint this(%v) Not Equal that(%v)", this.Checkpoint, that1.Checkpoint) + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", *this.Role, *that1.Role) + } + } else if this.Role != nil { + return fmt.Errorf("this.Role == nil && that.Role != nil") + } else if that1.Role != nil { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", this.Role, that1.Role) + } + if len(this.Roles) != len(that1.Roles) { + return fmt.Errorf("Roles this(%v) Not Equal that(%v)", len(this.Roles), len(that1.Roles)) + } + for i := range this.Roles { + if this.Roles[i] != that1.Roles[i] { + return fmt.Errorf("Roles this[%v](%v) Not Equal that[%v](%v)", i, this.Roles[i], i, that1.Roles[i]) + } + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", *this.Hostname, *that1.Hostname) + } + } else if this.Hostname != nil { + return fmt.Errorf("this.Hostname == nil && that.Hostname != nil") + } else if that1.Hostname != nil { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", this.Hostname, that1.Hostname) + } + if this.Principal != nil && that1.Principal != nil { + if *this.Principal != *that1.Principal { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", *this.Principal, *that1.Principal) + } + } else if this.Principal != nil { + return fmt.Errorf("this.Principal == nil && that.Principal != nil") + } else if that1.Principal != nil { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", this.Principal, that1.Principal) + } + if this.WebUiURL != nil && that1.WebUiURL != nil { + if *this.WebUiURL != *that1.WebUiURL { + return fmt.Errorf("WebUiURL this(%v) Not Equal that(%v)", *this.WebUiURL, *that1.WebUiURL) + } + } else if this.WebUiURL != nil { + return fmt.Errorf("this.WebUiURL == nil && that.WebUiURL != nil") + } else if that1.WebUiURL != nil { + return fmt.Errorf("WebUiURL this(%v) Not Equal that(%v)", this.WebUiURL, that1.WebUiURL) + } + if len(this.Capabilities) != len(that1.Capabilities) { + return fmt.Errorf("Capabilities this(%v) Not Equal that(%v)", len(this.Capabilities), len(that1.Capabilities)) + } + for i := range this.Capabilities { + if !this.Capabilities[i].Equal(&that1.Capabilities[i]) { + return fmt.Errorf("Capabilities this[%v](%v) Not Equal that[%v](%v)", i, this.Capabilities[i], i, that1.Capabilities[i]) + } + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + return nil +} +func (this *FrameworkInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*FrameworkInfo) + if !ok { + that2, ok := that.(FrameworkInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.User != that1.User { + return false + } + if this.Name != that1.Name { + return false + } + if !this.ID.Equal(that1.ID) { + return false + } + if this.FailoverTimeout != nil && that1.FailoverTimeout != nil { + if *this.FailoverTimeout != *that1.FailoverTimeout { + return false + } + } else if this.FailoverTimeout != nil { + return false + } else if that1.FailoverTimeout != nil { + return false + } + if this.Checkpoint != nil && that1.Checkpoint != nil { + if *this.Checkpoint != *that1.Checkpoint { + return false + } + } else if this.Checkpoint != nil { + return false + } else if that1.Checkpoint != nil { + return false + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return false + } + } else if this.Role != nil { + return false + } else if that1.Role != nil { + return false + } + if len(this.Roles) != len(that1.Roles) { + return false + } + for i := range this.Roles { + if this.Roles[i] != that1.Roles[i] { + return false + } + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return false + } + } else if this.Hostname != nil { + return false + } else if that1.Hostname != nil { + return false + } + if this.Principal != nil && that1.Principal != nil { + if *this.Principal != *that1.Principal { + return false + } + } else if this.Principal != nil { + return false + } else if that1.Principal != nil { + return false + } + if this.WebUiURL != nil && that1.WebUiURL != nil { + if *this.WebUiURL != *that1.WebUiURL { + return false + } + } else if this.WebUiURL != nil { + return false + } else if that1.WebUiURL != nil { + return false + } + if len(this.Capabilities) != len(that1.Capabilities) { + return false + } + for i := range this.Capabilities { + if !this.Capabilities[i].Equal(&that1.Capabilities[i]) { + return false + } + } + if !this.Labels.Equal(that1.Labels) { + return false + } + return true +} +func (this *FrameworkInfo_Capability) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*FrameworkInfo_Capability) + if !ok { + that2, ok := that.(FrameworkInfo_Capability) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *FrameworkInfo_Capability") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *FrameworkInfo_Capability but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *FrameworkInfo_Capability but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + return nil +} +func (this *FrameworkInfo_Capability) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*FrameworkInfo_Capability) + if !ok { + that2, ok := that.(FrameworkInfo_Capability) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + return true +} +func (this *CheckInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckInfo) + if !ok { + that2, ok := that.(CheckInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckInfo but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if !this.HTTP.Equal(that1.HTTP) { + return fmt.Errorf("HTTP this(%v) Not Equal that(%v)", this.HTTP, that1.HTTP) + } + if !this.TCP.Equal(that1.TCP) { + return fmt.Errorf("TCP this(%v) Not Equal that(%v)", this.TCP, that1.TCP) + } + if this.DelaySeconds != nil && that1.DelaySeconds != nil { + if *this.DelaySeconds != *that1.DelaySeconds { + return fmt.Errorf("DelaySeconds this(%v) Not Equal that(%v)", *this.DelaySeconds, *that1.DelaySeconds) + } + } else if this.DelaySeconds != nil { + return fmt.Errorf("this.DelaySeconds == nil && that.DelaySeconds != nil") + } else if that1.DelaySeconds != nil { + return fmt.Errorf("DelaySeconds this(%v) Not Equal that(%v)", this.DelaySeconds, that1.DelaySeconds) + } + if this.IntervalSeconds != nil && that1.IntervalSeconds != nil { + if *this.IntervalSeconds != *that1.IntervalSeconds { + return fmt.Errorf("IntervalSeconds this(%v) Not Equal that(%v)", *this.IntervalSeconds, *that1.IntervalSeconds) + } + } else if this.IntervalSeconds != nil { + return fmt.Errorf("this.IntervalSeconds == nil && that.IntervalSeconds != nil") + } else if that1.IntervalSeconds != nil { + return fmt.Errorf("IntervalSeconds this(%v) Not Equal that(%v)", this.IntervalSeconds, that1.IntervalSeconds) + } + if this.TimeoutSeconds != nil && that1.TimeoutSeconds != nil { + if *this.TimeoutSeconds != *that1.TimeoutSeconds { + return fmt.Errorf("TimeoutSeconds this(%v) Not Equal that(%v)", *this.TimeoutSeconds, *that1.TimeoutSeconds) + } + } else if this.TimeoutSeconds != nil { + return fmt.Errorf("this.TimeoutSeconds == nil && that.TimeoutSeconds != nil") + } else if that1.TimeoutSeconds != nil { + return fmt.Errorf("TimeoutSeconds this(%v) Not Equal that(%v)", this.TimeoutSeconds, that1.TimeoutSeconds) + } + return nil +} +func (this *CheckInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckInfo) + if !ok { + that2, ok := that.(CheckInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if !this.HTTP.Equal(that1.HTTP) { + return false + } + if !this.TCP.Equal(that1.TCP) { + return false + } + if this.DelaySeconds != nil && that1.DelaySeconds != nil { + if *this.DelaySeconds != *that1.DelaySeconds { + return false + } + } else if this.DelaySeconds != nil { + return false + } else if that1.DelaySeconds != nil { + return false + } + if this.IntervalSeconds != nil && that1.IntervalSeconds != nil { + if *this.IntervalSeconds != *that1.IntervalSeconds { + return false + } + } else if this.IntervalSeconds != nil { + return false + } else if that1.IntervalSeconds != nil { + return false + } + if this.TimeoutSeconds != nil && that1.TimeoutSeconds != nil { + if *this.TimeoutSeconds != *that1.TimeoutSeconds { + return false + } + } else if this.TimeoutSeconds != nil { + return false + } else if that1.TimeoutSeconds != nil { + return false + } + return true +} +func (this *CheckInfo_Command) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckInfo_Command) + if !ok { + that2, ok := that.(CheckInfo_Command) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckInfo_Command") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckInfo_Command but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckInfo_Command but is not nil && this == nil") + } + if !this.Command.Equal(&that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + return nil +} +func (this *CheckInfo_Command) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckInfo_Command) + if !ok { + that2, ok := that.(CheckInfo_Command) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Command.Equal(&that1.Command) { + return false + } + return true +} +func (this *CheckInfo_Http) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckInfo_Http) + if !ok { + that2, ok := that.(CheckInfo_Http) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckInfo_Http") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckInfo_Http but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckInfo_Http but is not nil && this == nil") + } + if this.Port != that1.Port { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", this.Port, that1.Port) + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", *this.Path, *that1.Path) + } + } else if this.Path != nil { + return fmt.Errorf("this.Path == nil && that.Path != nil") + } else if that1.Path != nil { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + return nil +} +func (this *CheckInfo_Http) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckInfo_Http) + if !ok { + that2, ok := that.(CheckInfo_Http) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Port != that1.Port { + return false + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return false + } + } else if this.Path != nil { + return false + } else if that1.Path != nil { + return false + } + return true +} +func (this *CheckInfo_Tcp) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckInfo_Tcp) + if !ok { + that2, ok := that.(CheckInfo_Tcp) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckInfo_Tcp") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckInfo_Tcp but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckInfo_Tcp but is not nil && this == nil") + } + if this.Port != that1.Port { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", this.Port, that1.Port) + } + return nil +} +func (this *CheckInfo_Tcp) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckInfo_Tcp) + if !ok { + that2, ok := that.(CheckInfo_Tcp) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Port != that1.Port { + return false + } + return true +} +func (this *HealthCheck) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*HealthCheck) + if !ok { + that2, ok := that.(HealthCheck) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *HealthCheck") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *HealthCheck but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *HealthCheck but is not nil && this == nil") + } + if this.DelaySeconds != nil && that1.DelaySeconds != nil { + if *this.DelaySeconds != *that1.DelaySeconds { + return fmt.Errorf("DelaySeconds this(%v) Not Equal that(%v)", *this.DelaySeconds, *that1.DelaySeconds) + } + } else if this.DelaySeconds != nil { + return fmt.Errorf("this.DelaySeconds == nil && that.DelaySeconds != nil") + } else if that1.DelaySeconds != nil { + return fmt.Errorf("DelaySeconds this(%v) Not Equal that(%v)", this.DelaySeconds, that1.DelaySeconds) + } + if this.IntervalSeconds != nil && that1.IntervalSeconds != nil { + if *this.IntervalSeconds != *that1.IntervalSeconds { + return fmt.Errorf("IntervalSeconds this(%v) Not Equal that(%v)", *this.IntervalSeconds, *that1.IntervalSeconds) + } + } else if this.IntervalSeconds != nil { + return fmt.Errorf("this.IntervalSeconds == nil && that.IntervalSeconds != nil") + } else if that1.IntervalSeconds != nil { + return fmt.Errorf("IntervalSeconds this(%v) Not Equal that(%v)", this.IntervalSeconds, that1.IntervalSeconds) + } + if this.TimeoutSeconds != nil && that1.TimeoutSeconds != nil { + if *this.TimeoutSeconds != *that1.TimeoutSeconds { + return fmt.Errorf("TimeoutSeconds this(%v) Not Equal that(%v)", *this.TimeoutSeconds, *that1.TimeoutSeconds) + } + } else if this.TimeoutSeconds != nil { + return fmt.Errorf("this.TimeoutSeconds == nil && that.TimeoutSeconds != nil") + } else if that1.TimeoutSeconds != nil { + return fmt.Errorf("TimeoutSeconds this(%v) Not Equal that(%v)", this.TimeoutSeconds, that1.TimeoutSeconds) + } + if this.ConsecutiveFailures != nil && that1.ConsecutiveFailures != nil { + if *this.ConsecutiveFailures != *that1.ConsecutiveFailures { + return fmt.Errorf("ConsecutiveFailures this(%v) Not Equal that(%v)", *this.ConsecutiveFailures, *that1.ConsecutiveFailures) + } + } else if this.ConsecutiveFailures != nil { + return fmt.Errorf("this.ConsecutiveFailures == nil && that.ConsecutiveFailures != nil") + } else if that1.ConsecutiveFailures != nil { + return fmt.Errorf("ConsecutiveFailures this(%v) Not Equal that(%v)", this.ConsecutiveFailures, that1.ConsecutiveFailures) + } + if this.GracePeriodSeconds != nil && that1.GracePeriodSeconds != nil { + if *this.GracePeriodSeconds != *that1.GracePeriodSeconds { + return fmt.Errorf("GracePeriodSeconds this(%v) Not Equal that(%v)", *this.GracePeriodSeconds, *that1.GracePeriodSeconds) + } + } else if this.GracePeriodSeconds != nil { + return fmt.Errorf("this.GracePeriodSeconds == nil && that.GracePeriodSeconds != nil") + } else if that1.GracePeriodSeconds != nil { + return fmt.Errorf("GracePeriodSeconds this(%v) Not Equal that(%v)", this.GracePeriodSeconds, that1.GracePeriodSeconds) + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if !this.HTTP.Equal(that1.HTTP) { + return fmt.Errorf("HTTP this(%v) Not Equal that(%v)", this.HTTP, that1.HTTP) + } + if !this.TCP.Equal(that1.TCP) { + return fmt.Errorf("TCP this(%v) Not Equal that(%v)", this.TCP, that1.TCP) + } + return nil +} +func (this *HealthCheck) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*HealthCheck) + if !ok { + that2, ok := that.(HealthCheck) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.DelaySeconds != nil && that1.DelaySeconds != nil { + if *this.DelaySeconds != *that1.DelaySeconds { + return false + } + } else if this.DelaySeconds != nil { + return false + } else if that1.DelaySeconds != nil { + return false + } + if this.IntervalSeconds != nil && that1.IntervalSeconds != nil { + if *this.IntervalSeconds != *that1.IntervalSeconds { + return false + } + } else if this.IntervalSeconds != nil { + return false + } else if that1.IntervalSeconds != nil { + return false + } + if this.TimeoutSeconds != nil && that1.TimeoutSeconds != nil { + if *this.TimeoutSeconds != *that1.TimeoutSeconds { + return false + } + } else if this.TimeoutSeconds != nil { + return false + } else if that1.TimeoutSeconds != nil { + return false + } + if this.ConsecutiveFailures != nil && that1.ConsecutiveFailures != nil { + if *this.ConsecutiveFailures != *that1.ConsecutiveFailures { + return false + } + } else if this.ConsecutiveFailures != nil { + return false + } else if that1.ConsecutiveFailures != nil { + return false + } + if this.GracePeriodSeconds != nil && that1.GracePeriodSeconds != nil { + if *this.GracePeriodSeconds != *that1.GracePeriodSeconds { + return false + } + } else if this.GracePeriodSeconds != nil { + return false + } else if that1.GracePeriodSeconds != nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if !this.HTTP.Equal(that1.HTTP) { + return false + } + if !this.TCP.Equal(that1.TCP) { + return false + } + return true +} +func (this *HealthCheck_HTTPCheckInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*HealthCheck_HTTPCheckInfo) + if !ok { + that2, ok := that.(HealthCheck_HTTPCheckInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *HealthCheck_HTTPCheckInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *HealthCheck_HTTPCheckInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *HealthCheck_HTTPCheckInfo but is not nil && this == nil") + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", *this.Protocol, *that1.Protocol) + } + } else if this.Protocol != nil { + return fmt.Errorf("this.Protocol == nil && that.Protocol != nil") + } else if that1.Protocol != nil { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", this.Protocol, that1.Protocol) + } + if this.Scheme != nil && that1.Scheme != nil { + if *this.Scheme != *that1.Scheme { + return fmt.Errorf("Scheme this(%v) Not Equal that(%v)", *this.Scheme, *that1.Scheme) + } + } else if this.Scheme != nil { + return fmt.Errorf("this.Scheme == nil && that.Scheme != nil") + } else if that1.Scheme != nil { + return fmt.Errorf("Scheme this(%v) Not Equal that(%v)", this.Scheme, that1.Scheme) + } + if this.Port != that1.Port { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", this.Port, that1.Port) + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", *this.Path, *that1.Path) + } + } else if this.Path != nil { + return fmt.Errorf("this.Path == nil && that.Path != nil") + } else if that1.Path != nil { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + if len(this.Statuses) != len(that1.Statuses) { + return fmt.Errorf("Statuses this(%v) Not Equal that(%v)", len(this.Statuses), len(that1.Statuses)) + } + for i := range this.Statuses { + if this.Statuses[i] != that1.Statuses[i] { + return fmt.Errorf("Statuses this[%v](%v) Not Equal that[%v](%v)", i, this.Statuses[i], i, that1.Statuses[i]) + } + } + return nil +} +func (this *HealthCheck_HTTPCheckInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*HealthCheck_HTTPCheckInfo) + if !ok { + that2, ok := that.(HealthCheck_HTTPCheckInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return false + } + } else if this.Protocol != nil { + return false + } else if that1.Protocol != nil { + return false + } + if this.Scheme != nil && that1.Scheme != nil { + if *this.Scheme != *that1.Scheme { + return false + } + } else if this.Scheme != nil { + return false + } else if that1.Scheme != nil { + return false + } + if this.Port != that1.Port { + return false + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return false + } + } else if this.Path != nil { + return false + } else if that1.Path != nil { + return false + } + if len(this.Statuses) != len(that1.Statuses) { + return false + } + for i := range this.Statuses { + if this.Statuses[i] != that1.Statuses[i] { + return false + } + } + return true +} +func (this *HealthCheck_TCPCheckInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*HealthCheck_TCPCheckInfo) + if !ok { + that2, ok := that.(HealthCheck_TCPCheckInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *HealthCheck_TCPCheckInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *HealthCheck_TCPCheckInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *HealthCheck_TCPCheckInfo but is not nil && this == nil") + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", *this.Protocol, *that1.Protocol) + } + } else if this.Protocol != nil { + return fmt.Errorf("this.Protocol == nil && that.Protocol != nil") + } else if that1.Protocol != nil { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", this.Protocol, that1.Protocol) + } + if this.Port != that1.Port { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", this.Port, that1.Port) + } + return nil +} +func (this *HealthCheck_TCPCheckInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*HealthCheck_TCPCheckInfo) + if !ok { + that2, ok := that.(HealthCheck_TCPCheckInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return false + } + } else if this.Protocol != nil { + return false + } else if that1.Protocol != nil { + return false + } + if this.Port != that1.Port { + return false + } + return true +} +func (this *KillPolicy) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*KillPolicy) + if !ok { + that2, ok := that.(KillPolicy) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *KillPolicy") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *KillPolicy but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *KillPolicy but is not nil && this == nil") + } + if !this.GracePeriod.Equal(that1.GracePeriod) { + return fmt.Errorf("GracePeriod this(%v) Not Equal that(%v)", this.GracePeriod, that1.GracePeriod) + } + return nil +} +func (this *KillPolicy) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*KillPolicy) + if !ok { + that2, ok := that.(KillPolicy) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.GracePeriod.Equal(that1.GracePeriod) { + return false + } + return true +} +func (this *CommandInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CommandInfo) + if !ok { + that2, ok := that.(CommandInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CommandInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CommandInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CommandInfo but is not nil && this == nil") + } + if len(this.URIs) != len(that1.URIs) { + return fmt.Errorf("URIs this(%v) Not Equal that(%v)", len(this.URIs), len(that1.URIs)) + } + for i := range this.URIs { + if !this.URIs[i].Equal(&that1.URIs[i]) { + return fmt.Errorf("URIs this[%v](%v) Not Equal that[%v](%v)", i, this.URIs[i], i, that1.URIs[i]) + } + } + if !this.Environment.Equal(that1.Environment) { + return fmt.Errorf("Environment this(%v) Not Equal that(%v)", this.Environment, that1.Environment) + } + if this.Shell != nil && that1.Shell != nil { + if *this.Shell != *that1.Shell { + return fmt.Errorf("Shell this(%v) Not Equal that(%v)", *this.Shell, *that1.Shell) + } + } else if this.Shell != nil { + return fmt.Errorf("this.Shell == nil && that.Shell != nil") + } else if that1.Shell != nil { + return fmt.Errorf("Shell this(%v) Not Equal that(%v)", this.Shell, that1.Shell) + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", *this.Value, *that1.Value) + } + } else if this.Value != nil { + return fmt.Errorf("this.Value == nil && that.Value != nil") + } else if that1.Value != nil { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + if len(this.Arguments) != len(that1.Arguments) { + return fmt.Errorf("Arguments this(%v) Not Equal that(%v)", len(this.Arguments), len(that1.Arguments)) + } + for i := range this.Arguments { + if this.Arguments[i] != that1.Arguments[i] { + return fmt.Errorf("Arguments this[%v](%v) Not Equal that[%v](%v)", i, this.Arguments[i], i, that1.Arguments[i]) + } + } + if this.User != nil && that1.User != nil { + if *this.User != *that1.User { + return fmt.Errorf("User this(%v) Not Equal that(%v)", *this.User, *that1.User) + } + } else if this.User != nil { + return fmt.Errorf("this.User == nil && that.User != nil") + } else if that1.User != nil { + return fmt.Errorf("User this(%v) Not Equal that(%v)", this.User, that1.User) + } + return nil +} +func (this *CommandInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CommandInfo) + if !ok { + that2, ok := that.(CommandInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.URIs) != len(that1.URIs) { + return false + } + for i := range this.URIs { + if !this.URIs[i].Equal(&that1.URIs[i]) { + return false + } + } + if !this.Environment.Equal(that1.Environment) { + return false + } + if this.Shell != nil && that1.Shell != nil { + if *this.Shell != *that1.Shell { + return false + } + } else if this.Shell != nil { + return false + } else if that1.Shell != nil { + return false + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return false + } + } else if this.Value != nil { + return false + } else if that1.Value != nil { + return false + } + if len(this.Arguments) != len(that1.Arguments) { + return false + } + for i := range this.Arguments { + if this.Arguments[i] != that1.Arguments[i] { + return false + } + } + if this.User != nil && that1.User != nil { + if *this.User != *that1.User { + return false + } + } else if this.User != nil { + return false + } else if that1.User != nil { + return false + } + return true +} +func (this *CommandInfo_URI) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CommandInfo_URI) + if !ok { + that2, ok := that.(CommandInfo_URI) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CommandInfo_URI") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CommandInfo_URI but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CommandInfo_URI but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + if this.Executable != nil && that1.Executable != nil { + if *this.Executable != *that1.Executable { + return fmt.Errorf("Executable this(%v) Not Equal that(%v)", *this.Executable, *that1.Executable) + } + } else if this.Executable != nil { + return fmt.Errorf("this.Executable == nil && that.Executable != nil") + } else if that1.Executable != nil { + return fmt.Errorf("Executable this(%v) Not Equal that(%v)", this.Executable, that1.Executable) + } + if this.Extract != nil && that1.Extract != nil { + if *this.Extract != *that1.Extract { + return fmt.Errorf("Extract this(%v) Not Equal that(%v)", *this.Extract, *that1.Extract) + } + } else if this.Extract != nil { + return fmt.Errorf("this.Extract == nil && that.Extract != nil") + } else if that1.Extract != nil { + return fmt.Errorf("Extract this(%v) Not Equal that(%v)", this.Extract, that1.Extract) + } + if this.Cache != nil && that1.Cache != nil { + if *this.Cache != *that1.Cache { + return fmt.Errorf("Cache this(%v) Not Equal that(%v)", *this.Cache, *that1.Cache) + } + } else if this.Cache != nil { + return fmt.Errorf("this.Cache == nil && that.Cache != nil") + } else if that1.Cache != nil { + return fmt.Errorf("Cache this(%v) Not Equal that(%v)", this.Cache, that1.Cache) + } + if this.OutputFile != nil && that1.OutputFile != nil { + if *this.OutputFile != *that1.OutputFile { + return fmt.Errorf("OutputFile this(%v) Not Equal that(%v)", *this.OutputFile, *that1.OutputFile) + } + } else if this.OutputFile != nil { + return fmt.Errorf("this.OutputFile == nil && that.OutputFile != nil") + } else if that1.OutputFile != nil { + return fmt.Errorf("OutputFile this(%v) Not Equal that(%v)", this.OutputFile, that1.OutputFile) + } + return nil +} +func (this *CommandInfo_URI) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CommandInfo_URI) + if !ok { + that2, ok := that.(CommandInfo_URI) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + if this.Executable != nil && that1.Executable != nil { + if *this.Executable != *that1.Executable { + return false + } + } else if this.Executable != nil { + return false + } else if that1.Executable != nil { + return false + } + if this.Extract != nil && that1.Extract != nil { + if *this.Extract != *that1.Extract { + return false + } + } else if this.Extract != nil { + return false + } else if that1.Extract != nil { + return false + } + if this.Cache != nil && that1.Cache != nil { + if *this.Cache != *that1.Cache { + return false + } + } else if this.Cache != nil { + return false + } else if that1.Cache != nil { + return false + } + if this.OutputFile != nil && that1.OutputFile != nil { + if *this.OutputFile != *that1.OutputFile { + return false + } + } else if this.OutputFile != nil { + return false + } else if that1.OutputFile != nil { + return false + } + return true +} +func (this *ExecutorInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ExecutorInfo) + if !ok { + that2, ok := that.(ExecutorInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ExecutorInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ExecutorInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ExecutorInfo but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.ExecutorID.Equal(&that1.ExecutorID) { + return fmt.Errorf("ExecutorID this(%v) Not Equal that(%v)", this.ExecutorID, that1.ExecutorID) + } + if !this.FrameworkID.Equal(that1.FrameworkID) { + return fmt.Errorf("FrameworkID this(%v) Not Equal that(%v)", this.FrameworkID, that1.FrameworkID) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if !this.Container.Equal(that1.Container) { + return fmt.Errorf("Container this(%v) Not Equal that(%v)", this.Container, that1.Container) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", *this.Name, *that1.Name) + } + } else if this.Name != nil { + return fmt.Errorf("this.Name == nil && that.Name != nil") + } else if that1.Name != nil { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Source != nil && that1.Source != nil { + if *this.Source != *that1.Source { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", *this.Source, *that1.Source) + } + } else if this.Source != nil { + return fmt.Errorf("this.Source == nil && that.Source != nil") + } else if that1.Source != nil { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", this.Source, that1.Source) + } + if !bytes.Equal(this.Data, that1.Data) { + return fmt.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data) + } + if !this.Discovery.Equal(that1.Discovery) { + return fmt.Errorf("Discovery this(%v) Not Equal that(%v)", this.Discovery, that1.Discovery) + } + if !this.ShutdownGracePeriod.Equal(that1.ShutdownGracePeriod) { + return fmt.Errorf("ShutdownGracePeriod this(%v) Not Equal that(%v)", this.ShutdownGracePeriod, that1.ShutdownGracePeriod) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + return nil +} +func (this *ExecutorInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ExecutorInfo) + if !ok { + that2, ok := that.(ExecutorInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.ExecutorID.Equal(&that1.ExecutorID) { + return false + } + if !this.FrameworkID.Equal(that1.FrameworkID) { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if !this.Container.Equal(that1.Container) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return false + } + } else if this.Name != nil { + return false + } else if that1.Name != nil { + return false + } + if this.Source != nil && that1.Source != nil { + if *this.Source != *that1.Source { + return false + } + } else if this.Source != nil { + return false + } else if that1.Source != nil { + return false + } + if !bytes.Equal(this.Data, that1.Data) { + return false + } + if !this.Discovery.Equal(that1.Discovery) { + return false + } + if !this.ShutdownGracePeriod.Equal(that1.ShutdownGracePeriod) { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + return true +} +func (this *DomainInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DomainInfo) + if !ok { + that2, ok := that.(DomainInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DomainInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DomainInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DomainInfo but is not nil && this == nil") + } + if !this.FaultDomain.Equal(that1.FaultDomain) { + return fmt.Errorf("FaultDomain this(%v) Not Equal that(%v)", this.FaultDomain, that1.FaultDomain) + } + return nil +} +func (this *DomainInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DomainInfo) + if !ok { + that2, ok := that.(DomainInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.FaultDomain.Equal(that1.FaultDomain) { + return false + } + return true +} +func (this *DomainInfo_FaultDomain) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DomainInfo_FaultDomain) + if !ok { + that2, ok := that.(DomainInfo_FaultDomain) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DomainInfo_FaultDomain") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DomainInfo_FaultDomain but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DomainInfo_FaultDomain but is not nil && this == nil") + } + if !this.Region.Equal(&that1.Region) { + return fmt.Errorf("Region this(%v) Not Equal that(%v)", this.Region, that1.Region) + } + if !this.Zone.Equal(&that1.Zone) { + return fmt.Errorf("Zone this(%v) Not Equal that(%v)", this.Zone, that1.Zone) + } + return nil +} +func (this *DomainInfo_FaultDomain) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DomainInfo_FaultDomain) + if !ok { + that2, ok := that.(DomainInfo_FaultDomain) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Region.Equal(&that1.Region) { + return false + } + if !this.Zone.Equal(&that1.Zone) { + return false + } + return true +} +func (this *DomainInfo_FaultDomain_RegionInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DomainInfo_FaultDomain_RegionInfo) + if !ok { + that2, ok := that.(DomainInfo_FaultDomain_RegionInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DomainInfo_FaultDomain_RegionInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DomainInfo_FaultDomain_RegionInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DomainInfo_FaultDomain_RegionInfo but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + return nil +} +func (this *DomainInfo_FaultDomain_RegionInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DomainInfo_FaultDomain_RegionInfo) + if !ok { + that2, ok := that.(DomainInfo_FaultDomain_RegionInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + return true +} +func (this *DomainInfo_FaultDomain_ZoneInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DomainInfo_FaultDomain_ZoneInfo) + if !ok { + that2, ok := that.(DomainInfo_FaultDomain_ZoneInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DomainInfo_FaultDomain_ZoneInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DomainInfo_FaultDomain_ZoneInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DomainInfo_FaultDomain_ZoneInfo but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + return nil +} +func (this *DomainInfo_FaultDomain_ZoneInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DomainInfo_FaultDomain_ZoneInfo) + if !ok { + that2, ok := that.(DomainInfo_FaultDomain_ZoneInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + return true +} +func (this *MasterInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*MasterInfo) + if !ok { + that2, ok := that.(MasterInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *MasterInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *MasterInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *MasterInfo but is not nil && this == nil") + } + if this.ID != that1.ID { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if this.IP != that1.IP { + return fmt.Errorf("IP this(%v) Not Equal that(%v)", this.IP, that1.IP) + } + if this.Port != nil && that1.Port != nil { + if *this.Port != *that1.Port { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", *this.Port, *that1.Port) + } + } else if this.Port != nil { + return fmt.Errorf("this.Port == nil && that.Port != nil") + } else if that1.Port != nil { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", this.Port, that1.Port) + } + if this.PID != nil && that1.PID != nil { + if *this.PID != *that1.PID { + return fmt.Errorf("PID this(%v) Not Equal that(%v)", *this.PID, *that1.PID) + } + } else if this.PID != nil { + return fmt.Errorf("this.PID == nil && that.PID != nil") + } else if that1.PID != nil { + return fmt.Errorf("PID this(%v) Not Equal that(%v)", this.PID, that1.PID) + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", *this.Hostname, *that1.Hostname) + } + } else if this.Hostname != nil { + return fmt.Errorf("this.Hostname == nil && that.Hostname != nil") + } else if that1.Hostname != nil { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", this.Hostname, that1.Hostname) + } + if this.Version != nil && that1.Version != nil { + if *this.Version != *that1.Version { + return fmt.Errorf("Version this(%v) Not Equal that(%v)", *this.Version, *that1.Version) + } + } else if this.Version != nil { + return fmt.Errorf("this.Version == nil && that.Version != nil") + } else if that1.Version != nil { + return fmt.Errorf("Version this(%v) Not Equal that(%v)", this.Version, that1.Version) + } + if !this.Address.Equal(that1.Address) { + return fmt.Errorf("Address this(%v) Not Equal that(%v)", this.Address, that1.Address) + } + if !this.Domain.Equal(that1.Domain) { + return fmt.Errorf("Domain this(%v) Not Equal that(%v)", this.Domain, that1.Domain) + } + if len(this.Capabilities) != len(that1.Capabilities) { + return fmt.Errorf("Capabilities this(%v) Not Equal that(%v)", len(this.Capabilities), len(that1.Capabilities)) + } + for i := range this.Capabilities { + if !this.Capabilities[i].Equal(&that1.Capabilities[i]) { + return fmt.Errorf("Capabilities this[%v](%v) Not Equal that[%v](%v)", i, this.Capabilities[i], i, that1.Capabilities[i]) + } + } + return nil +} +func (this *MasterInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*MasterInfo) + if !ok { + that2, ok := that.(MasterInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ID != that1.ID { + return false + } + if this.IP != that1.IP { + return false + } + if this.Port != nil && that1.Port != nil { + if *this.Port != *that1.Port { + return false + } + } else if this.Port != nil { + return false + } else if that1.Port != nil { + return false + } + if this.PID != nil && that1.PID != nil { + if *this.PID != *that1.PID { + return false + } + } else if this.PID != nil { + return false + } else if that1.PID != nil { + return false + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return false + } + } else if this.Hostname != nil { + return false + } else if that1.Hostname != nil { + return false + } + if this.Version != nil && that1.Version != nil { + if *this.Version != *that1.Version { + return false + } + } else if this.Version != nil { + return false + } else if that1.Version != nil { + return false + } + if !this.Address.Equal(that1.Address) { + return false + } + if !this.Domain.Equal(that1.Domain) { + return false + } + if len(this.Capabilities) != len(that1.Capabilities) { + return false + } + for i := range this.Capabilities { + if !this.Capabilities[i].Equal(&that1.Capabilities[i]) { + return false + } + } + return true +} +func (this *MasterInfo_Capability) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*MasterInfo_Capability) + if !ok { + that2, ok := that.(MasterInfo_Capability) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *MasterInfo_Capability") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *MasterInfo_Capability but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *MasterInfo_Capability but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + return nil +} +func (this *MasterInfo_Capability) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*MasterInfo_Capability) + if !ok { + that2, ok := that.(MasterInfo_Capability) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + return true +} +func (this *AgentInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*AgentInfo) + if !ok { + that2, ok := that.(AgentInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *AgentInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *AgentInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *AgentInfo but is not nil && this == nil") + } + if this.Hostname != that1.Hostname { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", this.Hostname, that1.Hostname) + } + if this.Port != nil && that1.Port != nil { + if *this.Port != *that1.Port { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", *this.Port, *that1.Port) + } + } else if this.Port != nil { + return fmt.Errorf("this.Port == nil && that.Port != nil") + } else if that1.Port != nil { + return fmt.Errorf("Port this(%v) Not Equal that(%v)", this.Port, that1.Port) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if len(this.Attributes) != len(that1.Attributes) { + return fmt.Errorf("Attributes this(%v) Not Equal that(%v)", len(this.Attributes), len(that1.Attributes)) + } + for i := range this.Attributes { + if !this.Attributes[i].Equal(&that1.Attributes[i]) { + return fmt.Errorf("Attributes this[%v](%v) Not Equal that[%v](%v)", i, this.Attributes[i], i, that1.Attributes[i]) + } + } + if !this.ID.Equal(that1.ID) { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if !this.Domain.Equal(that1.Domain) { + return fmt.Errorf("Domain this(%v) Not Equal that(%v)", this.Domain, that1.Domain) + } + return nil +} +func (this *AgentInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*AgentInfo) + if !ok { + that2, ok := that.(AgentInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Hostname != that1.Hostname { + return false + } + if this.Port != nil && that1.Port != nil { + if *this.Port != *that1.Port { + return false + } + } else if this.Port != nil { + return false + } else if that1.Port != nil { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if len(this.Attributes) != len(that1.Attributes) { + return false + } + for i := range this.Attributes { + if !this.Attributes[i].Equal(&that1.Attributes[i]) { + return false + } + } + if !this.ID.Equal(that1.ID) { + return false + } + if !this.Domain.Equal(that1.Domain) { + return false + } + return true +} +func (this *AgentInfo_Capability) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*AgentInfo_Capability) + if !ok { + that2, ok := that.(AgentInfo_Capability) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *AgentInfo_Capability") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *AgentInfo_Capability but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *AgentInfo_Capability but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + return nil +} +func (this *AgentInfo_Capability) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*AgentInfo_Capability) + if !ok { + that2, ok := that.(AgentInfo_Capability) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + return true +} +func (this *CSIPluginContainerInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CSIPluginContainerInfo) + if !ok { + that2, ok := that.(CSIPluginContainerInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CSIPluginContainerInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CSIPluginContainerInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CSIPluginContainerInfo but is not nil && this == nil") + } + if len(this.Services) != len(that1.Services) { + return fmt.Errorf("Services this(%v) Not Equal that(%v)", len(this.Services), len(that1.Services)) + } + for i := range this.Services { + if this.Services[i] != that1.Services[i] { + return fmt.Errorf("Services this[%v](%v) Not Equal that[%v](%v)", i, this.Services[i], i, that1.Services[i]) + } + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if !this.Container.Equal(that1.Container) { + return fmt.Errorf("Container this(%v) Not Equal that(%v)", this.Container, that1.Container) + } + return nil +} +func (this *CSIPluginContainerInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CSIPluginContainerInfo) + if !ok { + that2, ok := that.(CSIPluginContainerInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Services) != len(that1.Services) { + return false + } + for i := range this.Services { + if this.Services[i] != that1.Services[i] { + return false + } + } + if !this.Command.Equal(that1.Command) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if !this.Container.Equal(that1.Container) { + return false + } + return true +} +func (this *CSIPluginInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CSIPluginInfo) + if !ok { + that2, ok := that.(CSIPluginInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CSIPluginInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CSIPluginInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CSIPluginInfo but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if len(this.Containers) != len(that1.Containers) { + return fmt.Errorf("Containers this(%v) Not Equal that(%v)", len(this.Containers), len(that1.Containers)) + } + for i := range this.Containers { + if !this.Containers[i].Equal(&that1.Containers[i]) { + return fmt.Errorf("Containers this[%v](%v) Not Equal that[%v](%v)", i, this.Containers[i], i, that1.Containers[i]) + } + } + return nil +} +func (this *CSIPluginInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CSIPluginInfo) + if !ok { + that2, ok := that.(CSIPluginInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if this.Name != that1.Name { + return false + } + if len(this.Containers) != len(that1.Containers) { + return false + } + for i := range this.Containers { + if !this.Containers[i].Equal(&that1.Containers[i]) { + return false + } + } + return true +} +func (this *ResourceProviderInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ResourceProviderInfo) + if !ok { + that2, ok := that.(ResourceProviderInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ResourceProviderInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ResourceProviderInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ResourceProviderInfo but is not nil && this == nil") + } + if !this.ID.Equal(that1.ID) { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if len(this.Attributes) != len(that1.Attributes) { + return fmt.Errorf("Attributes this(%v) Not Equal that(%v)", len(this.Attributes), len(that1.Attributes)) + } + for i := range this.Attributes { + if !this.Attributes[i].Equal(&that1.Attributes[i]) { + return fmt.Errorf("Attributes this[%v](%v) Not Equal that[%v](%v)", i, this.Attributes[i], i, that1.Attributes[i]) + } + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if len(this.DefaultReservations) != len(that1.DefaultReservations) { + return fmt.Errorf("DefaultReservations this(%v) Not Equal that(%v)", len(this.DefaultReservations), len(that1.DefaultReservations)) + } + for i := range this.DefaultReservations { + if !this.DefaultReservations[i].Equal(&that1.DefaultReservations[i]) { + return fmt.Errorf("DefaultReservations this[%v](%v) Not Equal that[%v](%v)", i, this.DefaultReservations[i], i, that1.DefaultReservations[i]) + } + } + if !this.Storage.Equal(that1.Storage) { + return fmt.Errorf("Storage this(%v) Not Equal that(%v)", this.Storage, that1.Storage) + } + return nil +} +func (this *ResourceProviderInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ResourceProviderInfo) + if !ok { + that2, ok := that.(ResourceProviderInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ID.Equal(that1.ID) { + return false + } + if len(this.Attributes) != len(that1.Attributes) { + return false + } + for i := range this.Attributes { + if !this.Attributes[i].Equal(&that1.Attributes[i]) { + return false + } + } + if this.Type != that1.Type { + return false + } + if this.Name != that1.Name { + return false + } + if len(this.DefaultReservations) != len(that1.DefaultReservations) { + return false + } + for i := range this.DefaultReservations { + if !this.DefaultReservations[i].Equal(&that1.DefaultReservations[i]) { + return false + } + } + if !this.Storage.Equal(that1.Storage) { + return false + } + return true +} +func (this *ResourceProviderInfo_Storage) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ResourceProviderInfo_Storage) + if !ok { + that2, ok := that.(ResourceProviderInfo_Storage) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ResourceProviderInfo_Storage") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ResourceProviderInfo_Storage but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ResourceProviderInfo_Storage but is not nil && this == nil") + } + if !this.Plugin.Equal(&that1.Plugin) { + return fmt.Errorf("Plugin this(%v) Not Equal that(%v)", this.Plugin, that1.Plugin) + } + return nil +} +func (this *ResourceProviderInfo_Storage) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ResourceProviderInfo_Storage) + if !ok { + that2, ok := that.(ResourceProviderInfo_Storage) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Plugin.Equal(&that1.Plugin) { + return false + } + return true +} +func (this *Value) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Value) + if !ok { + that2, ok := that.(Value) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Value") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Value but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Value but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Scalar.Equal(that1.Scalar) { + return fmt.Errorf("Scalar this(%v) Not Equal that(%v)", this.Scalar, that1.Scalar) + } + if !this.Ranges.Equal(that1.Ranges) { + return fmt.Errorf("Ranges this(%v) Not Equal that(%v)", this.Ranges, that1.Ranges) + } + if !this.Set.Equal(that1.Set) { + return fmt.Errorf("Set this(%v) Not Equal that(%v)", this.Set, that1.Set) + } + if !this.Text.Equal(that1.Text) { + return fmt.Errorf("Text this(%v) Not Equal that(%v)", this.Text, that1.Text) + } + return nil +} +func (this *Value) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Value) + if !ok { + that2, ok := that.(Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.Scalar.Equal(that1.Scalar) { + return false + } + if !this.Ranges.Equal(that1.Ranges) { + return false + } + if !this.Set.Equal(that1.Set) { + return false + } + if !this.Text.Equal(that1.Text) { + return false + } + return true +} +func (this *Value_Scalar) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Value_Scalar) + if !ok { + that2, ok := that.(Value_Scalar) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Value_Scalar") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Value_Scalar but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Value_Scalar but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *Value_Scalar) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Value_Scalar) + if !ok { + that2, ok := that.(Value_Scalar) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *Value_Range) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Value_Range) + if !ok { + that2, ok := that.(Value_Range) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Value_Range") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Value_Range but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Value_Range but is not nil && this == nil") + } + if this.Begin != that1.Begin { + return fmt.Errorf("Begin this(%v) Not Equal that(%v)", this.Begin, that1.Begin) + } + if this.End != that1.End { + return fmt.Errorf("End this(%v) Not Equal that(%v)", this.End, that1.End) + } + return nil +} +func (this *Value_Range) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Value_Range) + if !ok { + that2, ok := that.(Value_Range) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Begin != that1.Begin { + return false + } + if this.End != that1.End { + return false + } + return true +} +func (this *Value_Ranges) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Value_Ranges) + if !ok { + that2, ok := that.(Value_Ranges) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Value_Ranges") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Value_Ranges but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Value_Ranges but is not nil && this == nil") + } + if len(this.Range) != len(that1.Range) { + return fmt.Errorf("Range this(%v) Not Equal that(%v)", len(this.Range), len(that1.Range)) + } + for i := range this.Range { + if !this.Range[i].Equal(&that1.Range[i]) { + return fmt.Errorf("Range this[%v](%v) Not Equal that[%v](%v)", i, this.Range[i], i, that1.Range[i]) + } + } + return nil +} +func (this *Value_Ranges) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Value_Ranges) + if !ok { + that2, ok := that.(Value_Ranges) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Range) != len(that1.Range) { + return false + } + for i := range this.Range { + if !this.Range[i].Equal(&that1.Range[i]) { + return false + } + } + return true +} +func (this *Value_Set) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Value_Set) + if !ok { + that2, ok := that.(Value_Set) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Value_Set") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Value_Set but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Value_Set but is not nil && this == nil") + } + if len(this.Item) != len(that1.Item) { + return fmt.Errorf("Item this(%v) Not Equal that(%v)", len(this.Item), len(that1.Item)) + } + for i := range this.Item { + if this.Item[i] != that1.Item[i] { + return fmt.Errorf("Item this[%v](%v) Not Equal that[%v](%v)", i, this.Item[i], i, that1.Item[i]) + } + } + return nil +} +func (this *Value_Set) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Value_Set) + if !ok { + that2, ok := that.(Value_Set) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Item) != len(that1.Item) { + return false + } + for i := range this.Item { + if this.Item[i] != that1.Item[i] { + return false + } + } + return true +} +func (this *Value_Text) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Value_Text) + if !ok { + that2, ok := that.(Value_Text) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Value_Text") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Value_Text but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Value_Text but is not nil && this == nil") + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *Value_Text) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Value_Text) + if !ok { + that2, ok := that.(Value_Text) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *Attribute) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Attribute) + if !ok { + that2, ok := that.(Attribute) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Attribute") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Attribute but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Attribute but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Scalar.Equal(that1.Scalar) { + return fmt.Errorf("Scalar this(%v) Not Equal that(%v)", this.Scalar, that1.Scalar) + } + if !this.Ranges.Equal(that1.Ranges) { + return fmt.Errorf("Ranges this(%v) Not Equal that(%v)", this.Ranges, that1.Ranges) + } + if !this.Set.Equal(that1.Set) { + return fmt.Errorf("Set this(%v) Not Equal that(%v)", this.Set, that1.Set) + } + if !this.Text.Equal(that1.Text) { + return fmt.Errorf("Text this(%v) Not Equal that(%v)", this.Text, that1.Text) + } + return nil +} +func (this *Attribute) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Attribute) + if !ok { + that2, ok := that.(Attribute) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Type != that1.Type { + return false + } + if !this.Scalar.Equal(that1.Scalar) { + return false + } + if !this.Ranges.Equal(that1.Ranges) { + return false + } + if !this.Set.Equal(that1.Set) { + return false + } + if !this.Text.Equal(that1.Text) { + return false + } + return true +} +func (this *Resource) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource) + if !ok { + that2, ok := that.(Resource) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource but is not nil && this == nil") + } + if !this.ProviderID.Equal(that1.ProviderID) { + return fmt.Errorf("ProviderID this(%v) Not Equal that(%v)", this.ProviderID, that1.ProviderID) + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", *this.Type, *that1.Type) + } + } else if this.Type != nil { + return fmt.Errorf("this.Type == nil && that.Type != nil") + } else if that1.Type != nil { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Scalar.Equal(that1.Scalar) { + return fmt.Errorf("Scalar this(%v) Not Equal that(%v)", this.Scalar, that1.Scalar) + } + if !this.Ranges.Equal(that1.Ranges) { + return fmt.Errorf("Ranges this(%v) Not Equal that(%v)", this.Ranges, that1.Ranges) + } + if !this.Set.Equal(that1.Set) { + return fmt.Errorf("Set this(%v) Not Equal that(%v)", this.Set, that1.Set) + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", *this.Role, *that1.Role) + } + } else if this.Role != nil { + return fmt.Errorf("this.Role == nil && that.Role != nil") + } else if that1.Role != nil { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", this.Role, that1.Role) + } + if !this.AllocationInfo.Equal(that1.AllocationInfo) { + return fmt.Errorf("AllocationInfo this(%v) Not Equal that(%v)", this.AllocationInfo, that1.AllocationInfo) + } + if !this.Reservation.Equal(that1.Reservation) { + return fmt.Errorf("Reservation this(%v) Not Equal that(%v)", this.Reservation, that1.Reservation) + } + if len(this.Reservations) != len(that1.Reservations) { + return fmt.Errorf("Reservations this(%v) Not Equal that(%v)", len(this.Reservations), len(that1.Reservations)) + } + for i := range this.Reservations { + if !this.Reservations[i].Equal(&that1.Reservations[i]) { + return fmt.Errorf("Reservations this[%v](%v) Not Equal that[%v](%v)", i, this.Reservations[i], i, that1.Reservations[i]) + } + } + if !this.Disk.Equal(that1.Disk) { + return fmt.Errorf("Disk this(%v) Not Equal that(%v)", this.Disk, that1.Disk) + } + if !this.Revocable.Equal(that1.Revocable) { + return fmt.Errorf("Revocable this(%v) Not Equal that(%v)", this.Revocable, that1.Revocable) + } + if !this.Shared.Equal(that1.Shared) { + return fmt.Errorf("Shared this(%v) Not Equal that(%v)", this.Shared, that1.Shared) + } + return nil +} +func (this *Resource) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource) + if !ok { + that2, ok := that.(Resource) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ProviderID.Equal(that1.ProviderID) { + return false + } + if this.Name != that1.Name { + return false + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return false + } + } else if this.Type != nil { + return false + } else if that1.Type != nil { + return false + } + if !this.Scalar.Equal(that1.Scalar) { + return false + } + if !this.Ranges.Equal(that1.Ranges) { + return false + } + if !this.Set.Equal(that1.Set) { + return false + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return false + } + } else if this.Role != nil { + return false + } else if that1.Role != nil { + return false + } + if !this.AllocationInfo.Equal(that1.AllocationInfo) { + return false + } + if !this.Reservation.Equal(that1.Reservation) { + return false + } + if len(this.Reservations) != len(that1.Reservations) { + return false + } + for i := range this.Reservations { + if !this.Reservations[i].Equal(&that1.Reservations[i]) { + return false + } + } + if !this.Disk.Equal(that1.Disk) { + return false + } + if !this.Revocable.Equal(that1.Revocable) { + return false + } + if !this.Shared.Equal(that1.Shared) { + return false + } + return true +} +func (this *Resource_AllocationInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_AllocationInfo) + if !ok { + that2, ok := that.(Resource_AllocationInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_AllocationInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_AllocationInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_AllocationInfo but is not nil && this == nil") + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", *this.Role, *that1.Role) + } + } else if this.Role != nil { + return fmt.Errorf("this.Role == nil && that.Role != nil") + } else if that1.Role != nil { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", this.Role, that1.Role) + } + return nil +} +func (this *Resource_AllocationInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_AllocationInfo) + if !ok { + that2, ok := that.(Resource_AllocationInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return false + } + } else if this.Role != nil { + return false + } else if that1.Role != nil { + return false + } + return true +} +func (this *Resource_ReservationInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_ReservationInfo) + if !ok { + that2, ok := that.(Resource_ReservationInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_ReservationInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_ReservationInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_ReservationInfo but is not nil && this == nil") + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", *this.Type, *that1.Type) + } + } else if this.Type != nil { + return fmt.Errorf("this.Type == nil && that.Type != nil") + } else if that1.Type != nil { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", *this.Role, *that1.Role) + } + } else if this.Role != nil { + return fmt.Errorf("this.Role == nil && that.Role != nil") + } else if that1.Role != nil { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", this.Role, that1.Role) + } + if this.Principal != nil && that1.Principal != nil { + if *this.Principal != *that1.Principal { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", *this.Principal, *that1.Principal) + } + } else if this.Principal != nil { + return fmt.Errorf("this.Principal == nil && that.Principal != nil") + } else if that1.Principal != nil { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", this.Principal, that1.Principal) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + return nil +} +func (this *Resource_ReservationInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_ReservationInfo) + if !ok { + that2, ok := that.(Resource_ReservationInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return false + } + } else if this.Type != nil { + return false + } else if that1.Type != nil { + return false + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return false + } + } else if this.Role != nil { + return false + } else if that1.Role != nil { + return false + } + if this.Principal != nil && that1.Principal != nil { + if *this.Principal != *that1.Principal { + return false + } + } else if this.Principal != nil { + return false + } else if that1.Principal != nil { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + return true +} +func (this *Resource_DiskInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_DiskInfo) + if !ok { + that2, ok := that.(Resource_DiskInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_DiskInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_DiskInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_DiskInfo but is not nil && this == nil") + } + if !this.Persistence.Equal(that1.Persistence) { + return fmt.Errorf("Persistence this(%v) Not Equal that(%v)", this.Persistence, that1.Persistence) + } + if !this.Volume.Equal(that1.Volume) { + return fmt.Errorf("Volume this(%v) Not Equal that(%v)", this.Volume, that1.Volume) + } + if !this.Source.Equal(that1.Source) { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", this.Source, that1.Source) + } + return nil +} +func (this *Resource_DiskInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_DiskInfo) + if !ok { + that2, ok := that.(Resource_DiskInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Persistence.Equal(that1.Persistence) { + return false + } + if !this.Volume.Equal(that1.Volume) { + return false + } + if !this.Source.Equal(that1.Source) { + return false + } + return true +} +func (this *Resource_DiskInfo_Persistence) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_DiskInfo_Persistence) + if !ok { + that2, ok := that.(Resource_DiskInfo_Persistence) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_DiskInfo_Persistence") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_DiskInfo_Persistence but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_DiskInfo_Persistence but is not nil && this == nil") + } + if this.ID != that1.ID { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if this.Principal != nil && that1.Principal != nil { + if *this.Principal != *that1.Principal { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", *this.Principal, *that1.Principal) + } + } else if this.Principal != nil { + return fmt.Errorf("this.Principal == nil && that.Principal != nil") + } else if that1.Principal != nil { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", this.Principal, that1.Principal) + } + return nil +} +func (this *Resource_DiskInfo_Persistence) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_DiskInfo_Persistence) + if !ok { + that2, ok := that.(Resource_DiskInfo_Persistence) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ID != that1.ID { + return false + } + if this.Principal != nil && that1.Principal != nil { + if *this.Principal != *that1.Principal { + return false + } + } else if this.Principal != nil { + return false + } else if that1.Principal != nil { + return false + } + return true +} +func (this *Resource_DiskInfo_Source) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_DiskInfo_Source) + if !ok { + that2, ok := that.(Resource_DiskInfo_Source) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_DiskInfo_Source") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_DiskInfo_Source but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_DiskInfo_Source but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Path.Equal(that1.Path) { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + if !this.Mount.Equal(that1.Mount) { + return fmt.Errorf("Mount this(%v) Not Equal that(%v)", this.Mount, that1.Mount) + } + if this.ID != nil && that1.ID != nil { + if *this.ID != *that1.ID { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", *this.ID, *that1.ID) + } + } else if this.ID != nil { + return fmt.Errorf("this.ID == nil && that.ID != nil") + } else if that1.ID != nil { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if !this.Metadata.Equal(that1.Metadata) { + return fmt.Errorf("Metadata this(%v) Not Equal that(%v)", this.Metadata, that1.Metadata) + } + if this.Profile != nil && that1.Profile != nil { + if *this.Profile != *that1.Profile { + return fmt.Errorf("Profile this(%v) Not Equal that(%v)", *this.Profile, *that1.Profile) + } + } else if this.Profile != nil { + return fmt.Errorf("this.Profile == nil && that.Profile != nil") + } else if that1.Profile != nil { + return fmt.Errorf("Profile this(%v) Not Equal that(%v)", this.Profile, that1.Profile) + } + return nil +} +func (this *Resource_DiskInfo_Source) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_DiskInfo_Source) + if !ok { + that2, ok := that.(Resource_DiskInfo_Source) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.Path.Equal(that1.Path) { + return false + } + if !this.Mount.Equal(that1.Mount) { + return false + } + if this.ID != nil && that1.ID != nil { + if *this.ID != *that1.ID { + return false + } + } else if this.ID != nil { + return false + } else if that1.ID != nil { + return false + } + if !this.Metadata.Equal(that1.Metadata) { + return false + } + if this.Profile != nil && that1.Profile != nil { + if *this.Profile != *that1.Profile { + return false + } + } else if this.Profile != nil { + return false + } else if that1.Profile != nil { + return false + } + return true +} +func (this *Resource_DiskInfo_Source_Path) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_DiskInfo_Source_Path) + if !ok { + that2, ok := that.(Resource_DiskInfo_Source_Path) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_DiskInfo_Source_Path") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_DiskInfo_Source_Path but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_DiskInfo_Source_Path but is not nil && this == nil") + } + if this.Root != nil && that1.Root != nil { + if *this.Root != *that1.Root { + return fmt.Errorf("Root this(%v) Not Equal that(%v)", *this.Root, *that1.Root) + } + } else if this.Root != nil { + return fmt.Errorf("this.Root == nil && that.Root != nil") + } else if that1.Root != nil { + return fmt.Errorf("Root this(%v) Not Equal that(%v)", this.Root, that1.Root) + } + return nil +} +func (this *Resource_DiskInfo_Source_Path) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_DiskInfo_Source_Path) + if !ok { + that2, ok := that.(Resource_DiskInfo_Source_Path) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Root != nil && that1.Root != nil { + if *this.Root != *that1.Root { + return false + } + } else if this.Root != nil { + return false + } else if that1.Root != nil { + return false + } + return true +} +func (this *Resource_DiskInfo_Source_Mount) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_DiskInfo_Source_Mount) + if !ok { + that2, ok := that.(Resource_DiskInfo_Source_Mount) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_DiskInfo_Source_Mount") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_DiskInfo_Source_Mount but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_DiskInfo_Source_Mount but is not nil && this == nil") + } + if this.Root != nil && that1.Root != nil { + if *this.Root != *that1.Root { + return fmt.Errorf("Root this(%v) Not Equal that(%v)", *this.Root, *that1.Root) + } + } else if this.Root != nil { + return fmt.Errorf("this.Root == nil && that.Root != nil") + } else if that1.Root != nil { + return fmt.Errorf("Root this(%v) Not Equal that(%v)", this.Root, that1.Root) + } + return nil +} +func (this *Resource_DiskInfo_Source_Mount) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_DiskInfo_Source_Mount) + if !ok { + that2, ok := that.(Resource_DiskInfo_Source_Mount) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Root != nil && that1.Root != nil { + if *this.Root != *that1.Root { + return false + } + } else if this.Root != nil { + return false + } else if that1.Root != nil { + return false + } + return true +} +func (this *Resource_RevocableInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_RevocableInfo) + if !ok { + that2, ok := that.(Resource_RevocableInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_RevocableInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_RevocableInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_RevocableInfo but is not nil && this == nil") + } + return nil +} +func (this *Resource_RevocableInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_RevocableInfo) + if !ok { + that2, ok := that.(Resource_RevocableInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + return true +} +func (this *Resource_SharedInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Resource_SharedInfo) + if !ok { + that2, ok := that.(Resource_SharedInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Resource_SharedInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Resource_SharedInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Resource_SharedInfo but is not nil && this == nil") + } + return nil +} +func (this *Resource_SharedInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Resource_SharedInfo) + if !ok { + that2, ok := that.(Resource_SharedInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + return true +} +func (this *TrafficControlStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TrafficControlStatistics) + if !ok { + that2, ok := that.(TrafficControlStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TrafficControlStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TrafficControlStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TrafficControlStatistics but is not nil && this == nil") + } + if this.ID != that1.ID { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if this.Backlog != nil && that1.Backlog != nil { + if *this.Backlog != *that1.Backlog { + return fmt.Errorf("Backlog this(%v) Not Equal that(%v)", *this.Backlog, *that1.Backlog) + } + } else if this.Backlog != nil { + return fmt.Errorf("this.Backlog == nil && that.Backlog != nil") + } else if that1.Backlog != nil { + return fmt.Errorf("Backlog this(%v) Not Equal that(%v)", this.Backlog, that1.Backlog) + } + if this.Bytes != nil && that1.Bytes != nil { + if *this.Bytes != *that1.Bytes { + return fmt.Errorf("Bytes this(%v) Not Equal that(%v)", *this.Bytes, *that1.Bytes) + } + } else if this.Bytes != nil { + return fmt.Errorf("this.Bytes == nil && that.Bytes != nil") + } else if that1.Bytes != nil { + return fmt.Errorf("Bytes this(%v) Not Equal that(%v)", this.Bytes, that1.Bytes) + } + if this.Drops != nil && that1.Drops != nil { + if *this.Drops != *that1.Drops { + return fmt.Errorf("Drops this(%v) Not Equal that(%v)", *this.Drops, *that1.Drops) + } + } else if this.Drops != nil { + return fmt.Errorf("this.Drops == nil && that.Drops != nil") + } else if that1.Drops != nil { + return fmt.Errorf("Drops this(%v) Not Equal that(%v)", this.Drops, that1.Drops) + } + if this.Overlimits != nil && that1.Overlimits != nil { + if *this.Overlimits != *that1.Overlimits { + return fmt.Errorf("Overlimits this(%v) Not Equal that(%v)", *this.Overlimits, *that1.Overlimits) + } + } else if this.Overlimits != nil { + return fmt.Errorf("this.Overlimits == nil && that.Overlimits != nil") + } else if that1.Overlimits != nil { + return fmt.Errorf("Overlimits this(%v) Not Equal that(%v)", this.Overlimits, that1.Overlimits) + } + if this.Packets != nil && that1.Packets != nil { + if *this.Packets != *that1.Packets { + return fmt.Errorf("Packets this(%v) Not Equal that(%v)", *this.Packets, *that1.Packets) + } + } else if this.Packets != nil { + return fmt.Errorf("this.Packets == nil && that.Packets != nil") + } else if that1.Packets != nil { + return fmt.Errorf("Packets this(%v) Not Equal that(%v)", this.Packets, that1.Packets) + } + if this.Qlen != nil && that1.Qlen != nil { + if *this.Qlen != *that1.Qlen { + return fmt.Errorf("Qlen this(%v) Not Equal that(%v)", *this.Qlen, *that1.Qlen) + } + } else if this.Qlen != nil { + return fmt.Errorf("this.Qlen == nil && that.Qlen != nil") + } else if that1.Qlen != nil { + return fmt.Errorf("Qlen this(%v) Not Equal that(%v)", this.Qlen, that1.Qlen) + } + if this.RateBPS != nil && that1.RateBPS != nil { + if *this.RateBPS != *that1.RateBPS { + return fmt.Errorf("RateBPS this(%v) Not Equal that(%v)", *this.RateBPS, *that1.RateBPS) + } + } else if this.RateBPS != nil { + return fmt.Errorf("this.RateBPS == nil && that.RateBPS != nil") + } else if that1.RateBPS != nil { + return fmt.Errorf("RateBPS this(%v) Not Equal that(%v)", this.RateBPS, that1.RateBPS) + } + if this.RatePPS != nil && that1.RatePPS != nil { + if *this.RatePPS != *that1.RatePPS { + return fmt.Errorf("RatePPS this(%v) Not Equal that(%v)", *this.RatePPS, *that1.RatePPS) + } + } else if this.RatePPS != nil { + return fmt.Errorf("this.RatePPS == nil && that.RatePPS != nil") + } else if that1.RatePPS != nil { + return fmt.Errorf("RatePPS this(%v) Not Equal that(%v)", this.RatePPS, that1.RatePPS) + } + if this.Requeues != nil && that1.Requeues != nil { + if *this.Requeues != *that1.Requeues { + return fmt.Errorf("Requeues this(%v) Not Equal that(%v)", *this.Requeues, *that1.Requeues) + } + } else if this.Requeues != nil { + return fmt.Errorf("this.Requeues == nil && that.Requeues != nil") + } else if that1.Requeues != nil { + return fmt.Errorf("Requeues this(%v) Not Equal that(%v)", this.Requeues, that1.Requeues) + } + return nil +} +func (this *TrafficControlStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TrafficControlStatistics) + if !ok { + that2, ok := that.(TrafficControlStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ID != that1.ID { + return false + } + if this.Backlog != nil && that1.Backlog != nil { + if *this.Backlog != *that1.Backlog { + return false + } + } else if this.Backlog != nil { + return false + } else if that1.Backlog != nil { + return false + } + if this.Bytes != nil && that1.Bytes != nil { + if *this.Bytes != *that1.Bytes { + return false + } + } else if this.Bytes != nil { + return false + } else if that1.Bytes != nil { + return false + } + if this.Drops != nil && that1.Drops != nil { + if *this.Drops != *that1.Drops { + return false + } + } else if this.Drops != nil { + return false + } else if that1.Drops != nil { + return false + } + if this.Overlimits != nil && that1.Overlimits != nil { + if *this.Overlimits != *that1.Overlimits { + return false + } + } else if this.Overlimits != nil { + return false + } else if that1.Overlimits != nil { + return false + } + if this.Packets != nil && that1.Packets != nil { + if *this.Packets != *that1.Packets { + return false + } + } else if this.Packets != nil { + return false + } else if that1.Packets != nil { + return false + } + if this.Qlen != nil && that1.Qlen != nil { + if *this.Qlen != *that1.Qlen { + return false + } + } else if this.Qlen != nil { + return false + } else if that1.Qlen != nil { + return false + } + if this.RateBPS != nil && that1.RateBPS != nil { + if *this.RateBPS != *that1.RateBPS { + return false + } + } else if this.RateBPS != nil { + return false + } else if that1.RateBPS != nil { + return false + } + if this.RatePPS != nil && that1.RatePPS != nil { + if *this.RatePPS != *that1.RatePPS { + return false + } + } else if this.RatePPS != nil { + return false + } else if that1.RatePPS != nil { + return false + } + if this.Requeues != nil && that1.Requeues != nil { + if *this.Requeues != *that1.Requeues { + return false + } + } else if this.Requeues != nil { + return false + } else if that1.Requeues != nil { + return false + } + return true +} +func (this *IpStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*IpStatistics) + if !ok { + that2, ok := that.(IpStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *IpStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *IpStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *IpStatistics but is not nil && this == nil") + } + if this.Forwarding != nil && that1.Forwarding != nil { + if *this.Forwarding != *that1.Forwarding { + return fmt.Errorf("Forwarding this(%v) Not Equal that(%v)", *this.Forwarding, *that1.Forwarding) + } + } else if this.Forwarding != nil { + return fmt.Errorf("this.Forwarding == nil && that.Forwarding != nil") + } else if that1.Forwarding != nil { + return fmt.Errorf("Forwarding this(%v) Not Equal that(%v)", this.Forwarding, that1.Forwarding) + } + if this.DefaultTTL != nil && that1.DefaultTTL != nil { + if *this.DefaultTTL != *that1.DefaultTTL { + return fmt.Errorf("DefaultTTL this(%v) Not Equal that(%v)", *this.DefaultTTL, *that1.DefaultTTL) + } + } else if this.DefaultTTL != nil { + return fmt.Errorf("this.DefaultTTL == nil && that.DefaultTTL != nil") + } else if that1.DefaultTTL != nil { + return fmt.Errorf("DefaultTTL this(%v) Not Equal that(%v)", this.DefaultTTL, that1.DefaultTTL) + } + if this.InReceives != nil && that1.InReceives != nil { + if *this.InReceives != *that1.InReceives { + return fmt.Errorf("InReceives this(%v) Not Equal that(%v)", *this.InReceives, *that1.InReceives) + } + } else if this.InReceives != nil { + return fmt.Errorf("this.InReceives == nil && that.InReceives != nil") + } else if that1.InReceives != nil { + return fmt.Errorf("InReceives this(%v) Not Equal that(%v)", this.InReceives, that1.InReceives) + } + if this.InHdrErrors != nil && that1.InHdrErrors != nil { + if *this.InHdrErrors != *that1.InHdrErrors { + return fmt.Errorf("InHdrErrors this(%v) Not Equal that(%v)", *this.InHdrErrors, *that1.InHdrErrors) + } + } else if this.InHdrErrors != nil { + return fmt.Errorf("this.InHdrErrors == nil && that.InHdrErrors != nil") + } else if that1.InHdrErrors != nil { + return fmt.Errorf("InHdrErrors this(%v) Not Equal that(%v)", this.InHdrErrors, that1.InHdrErrors) + } + if this.InAddrErrors != nil && that1.InAddrErrors != nil { + if *this.InAddrErrors != *that1.InAddrErrors { + return fmt.Errorf("InAddrErrors this(%v) Not Equal that(%v)", *this.InAddrErrors, *that1.InAddrErrors) + } + } else if this.InAddrErrors != nil { + return fmt.Errorf("this.InAddrErrors == nil && that.InAddrErrors != nil") + } else if that1.InAddrErrors != nil { + return fmt.Errorf("InAddrErrors this(%v) Not Equal that(%v)", this.InAddrErrors, that1.InAddrErrors) + } + if this.ForwDatagrams != nil && that1.ForwDatagrams != nil { + if *this.ForwDatagrams != *that1.ForwDatagrams { + return fmt.Errorf("ForwDatagrams this(%v) Not Equal that(%v)", *this.ForwDatagrams, *that1.ForwDatagrams) + } + } else if this.ForwDatagrams != nil { + return fmt.Errorf("this.ForwDatagrams == nil && that.ForwDatagrams != nil") + } else if that1.ForwDatagrams != nil { + return fmt.Errorf("ForwDatagrams this(%v) Not Equal that(%v)", this.ForwDatagrams, that1.ForwDatagrams) + } + if this.InUnknownProtos != nil && that1.InUnknownProtos != nil { + if *this.InUnknownProtos != *that1.InUnknownProtos { + return fmt.Errorf("InUnknownProtos this(%v) Not Equal that(%v)", *this.InUnknownProtos, *that1.InUnknownProtos) + } + } else if this.InUnknownProtos != nil { + return fmt.Errorf("this.InUnknownProtos == nil && that.InUnknownProtos != nil") + } else if that1.InUnknownProtos != nil { + return fmt.Errorf("InUnknownProtos this(%v) Not Equal that(%v)", this.InUnknownProtos, that1.InUnknownProtos) + } + if this.InDiscards != nil && that1.InDiscards != nil { + if *this.InDiscards != *that1.InDiscards { + return fmt.Errorf("InDiscards this(%v) Not Equal that(%v)", *this.InDiscards, *that1.InDiscards) + } + } else if this.InDiscards != nil { + return fmt.Errorf("this.InDiscards == nil && that.InDiscards != nil") + } else if that1.InDiscards != nil { + return fmt.Errorf("InDiscards this(%v) Not Equal that(%v)", this.InDiscards, that1.InDiscards) + } + if this.InDelivers != nil && that1.InDelivers != nil { + if *this.InDelivers != *that1.InDelivers { + return fmt.Errorf("InDelivers this(%v) Not Equal that(%v)", *this.InDelivers, *that1.InDelivers) + } + } else if this.InDelivers != nil { + return fmt.Errorf("this.InDelivers == nil && that.InDelivers != nil") + } else if that1.InDelivers != nil { + return fmt.Errorf("InDelivers this(%v) Not Equal that(%v)", this.InDelivers, that1.InDelivers) + } + if this.OutRequests != nil && that1.OutRequests != nil { + if *this.OutRequests != *that1.OutRequests { + return fmt.Errorf("OutRequests this(%v) Not Equal that(%v)", *this.OutRequests, *that1.OutRequests) + } + } else if this.OutRequests != nil { + return fmt.Errorf("this.OutRequests == nil && that.OutRequests != nil") + } else if that1.OutRequests != nil { + return fmt.Errorf("OutRequests this(%v) Not Equal that(%v)", this.OutRequests, that1.OutRequests) + } + if this.OutDiscards != nil && that1.OutDiscards != nil { + if *this.OutDiscards != *that1.OutDiscards { + return fmt.Errorf("OutDiscards this(%v) Not Equal that(%v)", *this.OutDiscards, *that1.OutDiscards) + } + } else if this.OutDiscards != nil { + return fmt.Errorf("this.OutDiscards == nil && that.OutDiscards != nil") + } else if that1.OutDiscards != nil { + return fmt.Errorf("OutDiscards this(%v) Not Equal that(%v)", this.OutDiscards, that1.OutDiscards) + } + if this.OutNoRoutes != nil && that1.OutNoRoutes != nil { + if *this.OutNoRoutes != *that1.OutNoRoutes { + return fmt.Errorf("OutNoRoutes this(%v) Not Equal that(%v)", *this.OutNoRoutes, *that1.OutNoRoutes) + } + } else if this.OutNoRoutes != nil { + return fmt.Errorf("this.OutNoRoutes == nil && that.OutNoRoutes != nil") + } else if that1.OutNoRoutes != nil { + return fmt.Errorf("OutNoRoutes this(%v) Not Equal that(%v)", this.OutNoRoutes, that1.OutNoRoutes) + } + if this.ReasmTimeout != nil && that1.ReasmTimeout != nil { + if *this.ReasmTimeout != *that1.ReasmTimeout { + return fmt.Errorf("ReasmTimeout this(%v) Not Equal that(%v)", *this.ReasmTimeout, *that1.ReasmTimeout) + } + } else if this.ReasmTimeout != nil { + return fmt.Errorf("this.ReasmTimeout == nil && that.ReasmTimeout != nil") + } else if that1.ReasmTimeout != nil { + return fmt.Errorf("ReasmTimeout this(%v) Not Equal that(%v)", this.ReasmTimeout, that1.ReasmTimeout) + } + if this.ReasmReqds != nil && that1.ReasmReqds != nil { + if *this.ReasmReqds != *that1.ReasmReqds { + return fmt.Errorf("ReasmReqds this(%v) Not Equal that(%v)", *this.ReasmReqds, *that1.ReasmReqds) + } + } else if this.ReasmReqds != nil { + return fmt.Errorf("this.ReasmReqds == nil && that.ReasmReqds != nil") + } else if that1.ReasmReqds != nil { + return fmt.Errorf("ReasmReqds this(%v) Not Equal that(%v)", this.ReasmReqds, that1.ReasmReqds) + } + if this.ReasmOKs != nil && that1.ReasmOKs != nil { + if *this.ReasmOKs != *that1.ReasmOKs { + return fmt.Errorf("ReasmOKs this(%v) Not Equal that(%v)", *this.ReasmOKs, *that1.ReasmOKs) + } + } else if this.ReasmOKs != nil { + return fmt.Errorf("this.ReasmOKs == nil && that.ReasmOKs != nil") + } else if that1.ReasmOKs != nil { + return fmt.Errorf("ReasmOKs this(%v) Not Equal that(%v)", this.ReasmOKs, that1.ReasmOKs) + } + if this.ReasmFails != nil && that1.ReasmFails != nil { + if *this.ReasmFails != *that1.ReasmFails { + return fmt.Errorf("ReasmFails this(%v) Not Equal that(%v)", *this.ReasmFails, *that1.ReasmFails) + } + } else if this.ReasmFails != nil { + return fmt.Errorf("this.ReasmFails == nil && that.ReasmFails != nil") + } else if that1.ReasmFails != nil { + return fmt.Errorf("ReasmFails this(%v) Not Equal that(%v)", this.ReasmFails, that1.ReasmFails) + } + if this.FragOKs != nil && that1.FragOKs != nil { + if *this.FragOKs != *that1.FragOKs { + return fmt.Errorf("FragOKs this(%v) Not Equal that(%v)", *this.FragOKs, *that1.FragOKs) + } + } else if this.FragOKs != nil { + return fmt.Errorf("this.FragOKs == nil && that.FragOKs != nil") + } else if that1.FragOKs != nil { + return fmt.Errorf("FragOKs this(%v) Not Equal that(%v)", this.FragOKs, that1.FragOKs) + } + if this.FragFails != nil && that1.FragFails != nil { + if *this.FragFails != *that1.FragFails { + return fmt.Errorf("FragFails this(%v) Not Equal that(%v)", *this.FragFails, *that1.FragFails) + } + } else if this.FragFails != nil { + return fmt.Errorf("this.FragFails == nil && that.FragFails != nil") + } else if that1.FragFails != nil { + return fmt.Errorf("FragFails this(%v) Not Equal that(%v)", this.FragFails, that1.FragFails) + } + if this.FragCreates != nil && that1.FragCreates != nil { + if *this.FragCreates != *that1.FragCreates { + return fmt.Errorf("FragCreates this(%v) Not Equal that(%v)", *this.FragCreates, *that1.FragCreates) + } + } else if this.FragCreates != nil { + return fmt.Errorf("this.FragCreates == nil && that.FragCreates != nil") + } else if that1.FragCreates != nil { + return fmt.Errorf("FragCreates this(%v) Not Equal that(%v)", this.FragCreates, that1.FragCreates) + } + return nil +} +func (this *IpStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*IpStatistics) + if !ok { + that2, ok := that.(IpStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Forwarding != nil && that1.Forwarding != nil { + if *this.Forwarding != *that1.Forwarding { + return false + } + } else if this.Forwarding != nil { + return false + } else if that1.Forwarding != nil { + return false + } + if this.DefaultTTL != nil && that1.DefaultTTL != nil { + if *this.DefaultTTL != *that1.DefaultTTL { + return false + } + } else if this.DefaultTTL != nil { + return false + } else if that1.DefaultTTL != nil { + return false + } + if this.InReceives != nil && that1.InReceives != nil { + if *this.InReceives != *that1.InReceives { + return false + } + } else if this.InReceives != nil { + return false + } else if that1.InReceives != nil { + return false + } + if this.InHdrErrors != nil && that1.InHdrErrors != nil { + if *this.InHdrErrors != *that1.InHdrErrors { + return false + } + } else if this.InHdrErrors != nil { + return false + } else if that1.InHdrErrors != nil { + return false + } + if this.InAddrErrors != nil && that1.InAddrErrors != nil { + if *this.InAddrErrors != *that1.InAddrErrors { + return false + } + } else if this.InAddrErrors != nil { + return false + } else if that1.InAddrErrors != nil { + return false + } + if this.ForwDatagrams != nil && that1.ForwDatagrams != nil { + if *this.ForwDatagrams != *that1.ForwDatagrams { + return false + } + } else if this.ForwDatagrams != nil { + return false + } else if that1.ForwDatagrams != nil { + return false + } + if this.InUnknownProtos != nil && that1.InUnknownProtos != nil { + if *this.InUnknownProtos != *that1.InUnknownProtos { + return false + } + } else if this.InUnknownProtos != nil { + return false + } else if that1.InUnknownProtos != nil { + return false + } + if this.InDiscards != nil && that1.InDiscards != nil { + if *this.InDiscards != *that1.InDiscards { + return false + } + } else if this.InDiscards != nil { + return false + } else if that1.InDiscards != nil { + return false + } + if this.InDelivers != nil && that1.InDelivers != nil { + if *this.InDelivers != *that1.InDelivers { + return false + } + } else if this.InDelivers != nil { + return false + } else if that1.InDelivers != nil { + return false + } + if this.OutRequests != nil && that1.OutRequests != nil { + if *this.OutRequests != *that1.OutRequests { + return false + } + } else if this.OutRequests != nil { + return false + } else if that1.OutRequests != nil { + return false + } + if this.OutDiscards != nil && that1.OutDiscards != nil { + if *this.OutDiscards != *that1.OutDiscards { + return false + } + } else if this.OutDiscards != nil { + return false + } else if that1.OutDiscards != nil { + return false + } + if this.OutNoRoutes != nil && that1.OutNoRoutes != nil { + if *this.OutNoRoutes != *that1.OutNoRoutes { + return false + } + } else if this.OutNoRoutes != nil { + return false + } else if that1.OutNoRoutes != nil { + return false + } + if this.ReasmTimeout != nil && that1.ReasmTimeout != nil { + if *this.ReasmTimeout != *that1.ReasmTimeout { + return false + } + } else if this.ReasmTimeout != nil { + return false + } else if that1.ReasmTimeout != nil { + return false + } + if this.ReasmReqds != nil && that1.ReasmReqds != nil { + if *this.ReasmReqds != *that1.ReasmReqds { + return false + } + } else if this.ReasmReqds != nil { + return false + } else if that1.ReasmReqds != nil { + return false + } + if this.ReasmOKs != nil && that1.ReasmOKs != nil { + if *this.ReasmOKs != *that1.ReasmOKs { + return false + } + } else if this.ReasmOKs != nil { + return false + } else if that1.ReasmOKs != nil { + return false + } + if this.ReasmFails != nil && that1.ReasmFails != nil { + if *this.ReasmFails != *that1.ReasmFails { + return false + } + } else if this.ReasmFails != nil { + return false + } else if that1.ReasmFails != nil { + return false + } + if this.FragOKs != nil && that1.FragOKs != nil { + if *this.FragOKs != *that1.FragOKs { + return false + } + } else if this.FragOKs != nil { + return false + } else if that1.FragOKs != nil { + return false + } + if this.FragFails != nil && that1.FragFails != nil { + if *this.FragFails != *that1.FragFails { + return false + } + } else if this.FragFails != nil { + return false + } else if that1.FragFails != nil { + return false + } + if this.FragCreates != nil && that1.FragCreates != nil { + if *this.FragCreates != *that1.FragCreates { + return false + } + } else if this.FragCreates != nil { + return false + } else if that1.FragCreates != nil { + return false + } + return true +} +func (this *IcmpStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*IcmpStatistics) + if !ok { + that2, ok := that.(IcmpStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *IcmpStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *IcmpStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *IcmpStatistics but is not nil && this == nil") + } + if this.InMsgs != nil && that1.InMsgs != nil { + if *this.InMsgs != *that1.InMsgs { + return fmt.Errorf("InMsgs this(%v) Not Equal that(%v)", *this.InMsgs, *that1.InMsgs) + } + } else if this.InMsgs != nil { + return fmt.Errorf("this.InMsgs == nil && that.InMsgs != nil") + } else if that1.InMsgs != nil { + return fmt.Errorf("InMsgs this(%v) Not Equal that(%v)", this.InMsgs, that1.InMsgs) + } + if this.InErrors != nil && that1.InErrors != nil { + if *this.InErrors != *that1.InErrors { + return fmt.Errorf("InErrors this(%v) Not Equal that(%v)", *this.InErrors, *that1.InErrors) + } + } else if this.InErrors != nil { + return fmt.Errorf("this.InErrors == nil && that.InErrors != nil") + } else if that1.InErrors != nil { + return fmt.Errorf("InErrors this(%v) Not Equal that(%v)", this.InErrors, that1.InErrors) + } + if this.InCsumErrors != nil && that1.InCsumErrors != nil { + if *this.InCsumErrors != *that1.InCsumErrors { + return fmt.Errorf("InCsumErrors this(%v) Not Equal that(%v)", *this.InCsumErrors, *that1.InCsumErrors) + } + } else if this.InCsumErrors != nil { + return fmt.Errorf("this.InCsumErrors == nil && that.InCsumErrors != nil") + } else if that1.InCsumErrors != nil { + return fmt.Errorf("InCsumErrors this(%v) Not Equal that(%v)", this.InCsumErrors, that1.InCsumErrors) + } + if this.InDestUnreachs != nil && that1.InDestUnreachs != nil { + if *this.InDestUnreachs != *that1.InDestUnreachs { + return fmt.Errorf("InDestUnreachs this(%v) Not Equal that(%v)", *this.InDestUnreachs, *that1.InDestUnreachs) + } + } else if this.InDestUnreachs != nil { + return fmt.Errorf("this.InDestUnreachs == nil && that.InDestUnreachs != nil") + } else if that1.InDestUnreachs != nil { + return fmt.Errorf("InDestUnreachs this(%v) Not Equal that(%v)", this.InDestUnreachs, that1.InDestUnreachs) + } + if this.InTimeExcds != nil && that1.InTimeExcds != nil { + if *this.InTimeExcds != *that1.InTimeExcds { + return fmt.Errorf("InTimeExcds this(%v) Not Equal that(%v)", *this.InTimeExcds, *that1.InTimeExcds) + } + } else if this.InTimeExcds != nil { + return fmt.Errorf("this.InTimeExcds == nil && that.InTimeExcds != nil") + } else if that1.InTimeExcds != nil { + return fmt.Errorf("InTimeExcds this(%v) Not Equal that(%v)", this.InTimeExcds, that1.InTimeExcds) + } + if this.InParmProbs != nil && that1.InParmProbs != nil { + if *this.InParmProbs != *that1.InParmProbs { + return fmt.Errorf("InParmProbs this(%v) Not Equal that(%v)", *this.InParmProbs, *that1.InParmProbs) + } + } else if this.InParmProbs != nil { + return fmt.Errorf("this.InParmProbs == nil && that.InParmProbs != nil") + } else if that1.InParmProbs != nil { + return fmt.Errorf("InParmProbs this(%v) Not Equal that(%v)", this.InParmProbs, that1.InParmProbs) + } + if this.InSrcQuenchs != nil && that1.InSrcQuenchs != nil { + if *this.InSrcQuenchs != *that1.InSrcQuenchs { + return fmt.Errorf("InSrcQuenchs this(%v) Not Equal that(%v)", *this.InSrcQuenchs, *that1.InSrcQuenchs) + } + } else if this.InSrcQuenchs != nil { + return fmt.Errorf("this.InSrcQuenchs == nil && that.InSrcQuenchs != nil") + } else if that1.InSrcQuenchs != nil { + return fmt.Errorf("InSrcQuenchs this(%v) Not Equal that(%v)", this.InSrcQuenchs, that1.InSrcQuenchs) + } + if this.InRedirects != nil && that1.InRedirects != nil { + if *this.InRedirects != *that1.InRedirects { + return fmt.Errorf("InRedirects this(%v) Not Equal that(%v)", *this.InRedirects, *that1.InRedirects) + } + } else if this.InRedirects != nil { + return fmt.Errorf("this.InRedirects == nil && that.InRedirects != nil") + } else if that1.InRedirects != nil { + return fmt.Errorf("InRedirects this(%v) Not Equal that(%v)", this.InRedirects, that1.InRedirects) + } + if this.InEchos != nil && that1.InEchos != nil { + if *this.InEchos != *that1.InEchos { + return fmt.Errorf("InEchos this(%v) Not Equal that(%v)", *this.InEchos, *that1.InEchos) + } + } else if this.InEchos != nil { + return fmt.Errorf("this.InEchos == nil && that.InEchos != nil") + } else if that1.InEchos != nil { + return fmt.Errorf("InEchos this(%v) Not Equal that(%v)", this.InEchos, that1.InEchos) + } + if this.InEchoReps != nil && that1.InEchoReps != nil { + if *this.InEchoReps != *that1.InEchoReps { + return fmt.Errorf("InEchoReps this(%v) Not Equal that(%v)", *this.InEchoReps, *that1.InEchoReps) + } + } else if this.InEchoReps != nil { + return fmt.Errorf("this.InEchoReps == nil && that.InEchoReps != nil") + } else if that1.InEchoReps != nil { + return fmt.Errorf("InEchoReps this(%v) Not Equal that(%v)", this.InEchoReps, that1.InEchoReps) + } + if this.InTimestamps != nil && that1.InTimestamps != nil { + if *this.InTimestamps != *that1.InTimestamps { + return fmt.Errorf("InTimestamps this(%v) Not Equal that(%v)", *this.InTimestamps, *that1.InTimestamps) + } + } else if this.InTimestamps != nil { + return fmt.Errorf("this.InTimestamps == nil && that.InTimestamps != nil") + } else if that1.InTimestamps != nil { + return fmt.Errorf("InTimestamps this(%v) Not Equal that(%v)", this.InTimestamps, that1.InTimestamps) + } + if this.InTimestampReps != nil && that1.InTimestampReps != nil { + if *this.InTimestampReps != *that1.InTimestampReps { + return fmt.Errorf("InTimestampReps this(%v) Not Equal that(%v)", *this.InTimestampReps, *that1.InTimestampReps) + } + } else if this.InTimestampReps != nil { + return fmt.Errorf("this.InTimestampReps == nil && that.InTimestampReps != nil") + } else if that1.InTimestampReps != nil { + return fmt.Errorf("InTimestampReps this(%v) Not Equal that(%v)", this.InTimestampReps, that1.InTimestampReps) + } + if this.InAddrMasks != nil && that1.InAddrMasks != nil { + if *this.InAddrMasks != *that1.InAddrMasks { + return fmt.Errorf("InAddrMasks this(%v) Not Equal that(%v)", *this.InAddrMasks, *that1.InAddrMasks) + } + } else if this.InAddrMasks != nil { + return fmt.Errorf("this.InAddrMasks == nil && that.InAddrMasks != nil") + } else if that1.InAddrMasks != nil { + return fmt.Errorf("InAddrMasks this(%v) Not Equal that(%v)", this.InAddrMasks, that1.InAddrMasks) + } + if this.InAddrMaskReps != nil && that1.InAddrMaskReps != nil { + if *this.InAddrMaskReps != *that1.InAddrMaskReps { + return fmt.Errorf("InAddrMaskReps this(%v) Not Equal that(%v)", *this.InAddrMaskReps, *that1.InAddrMaskReps) + } + } else if this.InAddrMaskReps != nil { + return fmt.Errorf("this.InAddrMaskReps == nil && that.InAddrMaskReps != nil") + } else if that1.InAddrMaskReps != nil { + return fmt.Errorf("InAddrMaskReps this(%v) Not Equal that(%v)", this.InAddrMaskReps, that1.InAddrMaskReps) + } + if this.OutMsgs != nil && that1.OutMsgs != nil { + if *this.OutMsgs != *that1.OutMsgs { + return fmt.Errorf("OutMsgs this(%v) Not Equal that(%v)", *this.OutMsgs, *that1.OutMsgs) + } + } else if this.OutMsgs != nil { + return fmt.Errorf("this.OutMsgs == nil && that.OutMsgs != nil") + } else if that1.OutMsgs != nil { + return fmt.Errorf("OutMsgs this(%v) Not Equal that(%v)", this.OutMsgs, that1.OutMsgs) + } + if this.OutErrors != nil && that1.OutErrors != nil { + if *this.OutErrors != *that1.OutErrors { + return fmt.Errorf("OutErrors this(%v) Not Equal that(%v)", *this.OutErrors, *that1.OutErrors) + } + } else if this.OutErrors != nil { + return fmt.Errorf("this.OutErrors == nil && that.OutErrors != nil") + } else if that1.OutErrors != nil { + return fmt.Errorf("OutErrors this(%v) Not Equal that(%v)", this.OutErrors, that1.OutErrors) + } + if this.OutDestUnreachs != nil && that1.OutDestUnreachs != nil { + if *this.OutDestUnreachs != *that1.OutDestUnreachs { + return fmt.Errorf("OutDestUnreachs this(%v) Not Equal that(%v)", *this.OutDestUnreachs, *that1.OutDestUnreachs) + } + } else if this.OutDestUnreachs != nil { + return fmt.Errorf("this.OutDestUnreachs == nil && that.OutDestUnreachs != nil") + } else if that1.OutDestUnreachs != nil { + return fmt.Errorf("OutDestUnreachs this(%v) Not Equal that(%v)", this.OutDestUnreachs, that1.OutDestUnreachs) + } + if this.OutTimeExcds != nil && that1.OutTimeExcds != nil { + if *this.OutTimeExcds != *that1.OutTimeExcds { + return fmt.Errorf("OutTimeExcds this(%v) Not Equal that(%v)", *this.OutTimeExcds, *that1.OutTimeExcds) + } + } else if this.OutTimeExcds != nil { + return fmt.Errorf("this.OutTimeExcds == nil && that.OutTimeExcds != nil") + } else if that1.OutTimeExcds != nil { + return fmt.Errorf("OutTimeExcds this(%v) Not Equal that(%v)", this.OutTimeExcds, that1.OutTimeExcds) + } + if this.OutParmProbs != nil && that1.OutParmProbs != nil { + if *this.OutParmProbs != *that1.OutParmProbs { + return fmt.Errorf("OutParmProbs this(%v) Not Equal that(%v)", *this.OutParmProbs, *that1.OutParmProbs) + } + } else if this.OutParmProbs != nil { + return fmt.Errorf("this.OutParmProbs == nil && that.OutParmProbs != nil") + } else if that1.OutParmProbs != nil { + return fmt.Errorf("OutParmProbs this(%v) Not Equal that(%v)", this.OutParmProbs, that1.OutParmProbs) + } + if this.OutSrcQuenchs != nil && that1.OutSrcQuenchs != nil { + if *this.OutSrcQuenchs != *that1.OutSrcQuenchs { + return fmt.Errorf("OutSrcQuenchs this(%v) Not Equal that(%v)", *this.OutSrcQuenchs, *that1.OutSrcQuenchs) + } + } else if this.OutSrcQuenchs != nil { + return fmt.Errorf("this.OutSrcQuenchs == nil && that.OutSrcQuenchs != nil") + } else if that1.OutSrcQuenchs != nil { + return fmt.Errorf("OutSrcQuenchs this(%v) Not Equal that(%v)", this.OutSrcQuenchs, that1.OutSrcQuenchs) + } + if this.OutRedirects != nil && that1.OutRedirects != nil { + if *this.OutRedirects != *that1.OutRedirects { + return fmt.Errorf("OutRedirects this(%v) Not Equal that(%v)", *this.OutRedirects, *that1.OutRedirects) + } + } else if this.OutRedirects != nil { + return fmt.Errorf("this.OutRedirects == nil && that.OutRedirects != nil") + } else if that1.OutRedirects != nil { + return fmt.Errorf("OutRedirects this(%v) Not Equal that(%v)", this.OutRedirects, that1.OutRedirects) + } + if this.OutEchos != nil && that1.OutEchos != nil { + if *this.OutEchos != *that1.OutEchos { + return fmt.Errorf("OutEchos this(%v) Not Equal that(%v)", *this.OutEchos, *that1.OutEchos) + } + } else if this.OutEchos != nil { + return fmt.Errorf("this.OutEchos == nil && that.OutEchos != nil") + } else if that1.OutEchos != nil { + return fmt.Errorf("OutEchos this(%v) Not Equal that(%v)", this.OutEchos, that1.OutEchos) + } + if this.OutEchoReps != nil && that1.OutEchoReps != nil { + if *this.OutEchoReps != *that1.OutEchoReps { + return fmt.Errorf("OutEchoReps this(%v) Not Equal that(%v)", *this.OutEchoReps, *that1.OutEchoReps) + } + } else if this.OutEchoReps != nil { + return fmt.Errorf("this.OutEchoReps == nil && that.OutEchoReps != nil") + } else if that1.OutEchoReps != nil { + return fmt.Errorf("OutEchoReps this(%v) Not Equal that(%v)", this.OutEchoReps, that1.OutEchoReps) + } + if this.OutTimestamps != nil && that1.OutTimestamps != nil { + if *this.OutTimestamps != *that1.OutTimestamps { + return fmt.Errorf("OutTimestamps this(%v) Not Equal that(%v)", *this.OutTimestamps, *that1.OutTimestamps) + } + } else if this.OutTimestamps != nil { + return fmt.Errorf("this.OutTimestamps == nil && that.OutTimestamps != nil") + } else if that1.OutTimestamps != nil { + return fmt.Errorf("OutTimestamps this(%v) Not Equal that(%v)", this.OutTimestamps, that1.OutTimestamps) + } + if this.OutTimestampReps != nil && that1.OutTimestampReps != nil { + if *this.OutTimestampReps != *that1.OutTimestampReps { + return fmt.Errorf("OutTimestampReps this(%v) Not Equal that(%v)", *this.OutTimestampReps, *that1.OutTimestampReps) + } + } else if this.OutTimestampReps != nil { + return fmt.Errorf("this.OutTimestampReps == nil && that.OutTimestampReps != nil") + } else if that1.OutTimestampReps != nil { + return fmt.Errorf("OutTimestampReps this(%v) Not Equal that(%v)", this.OutTimestampReps, that1.OutTimestampReps) + } + if this.OutAddrMasks != nil && that1.OutAddrMasks != nil { + if *this.OutAddrMasks != *that1.OutAddrMasks { + return fmt.Errorf("OutAddrMasks this(%v) Not Equal that(%v)", *this.OutAddrMasks, *that1.OutAddrMasks) + } + } else if this.OutAddrMasks != nil { + return fmt.Errorf("this.OutAddrMasks == nil && that.OutAddrMasks != nil") + } else if that1.OutAddrMasks != nil { + return fmt.Errorf("OutAddrMasks this(%v) Not Equal that(%v)", this.OutAddrMasks, that1.OutAddrMasks) + } + if this.OutAddrMaskReps != nil && that1.OutAddrMaskReps != nil { + if *this.OutAddrMaskReps != *that1.OutAddrMaskReps { + return fmt.Errorf("OutAddrMaskReps this(%v) Not Equal that(%v)", *this.OutAddrMaskReps, *that1.OutAddrMaskReps) + } + } else if this.OutAddrMaskReps != nil { + return fmt.Errorf("this.OutAddrMaskReps == nil && that.OutAddrMaskReps != nil") + } else if that1.OutAddrMaskReps != nil { + return fmt.Errorf("OutAddrMaskReps this(%v) Not Equal that(%v)", this.OutAddrMaskReps, that1.OutAddrMaskReps) + } + return nil +} +func (this *IcmpStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*IcmpStatistics) + if !ok { + that2, ok := that.(IcmpStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.InMsgs != nil && that1.InMsgs != nil { + if *this.InMsgs != *that1.InMsgs { + return false + } + } else if this.InMsgs != nil { + return false + } else if that1.InMsgs != nil { + return false + } + if this.InErrors != nil && that1.InErrors != nil { + if *this.InErrors != *that1.InErrors { + return false + } + } else if this.InErrors != nil { + return false + } else if that1.InErrors != nil { + return false + } + if this.InCsumErrors != nil && that1.InCsumErrors != nil { + if *this.InCsumErrors != *that1.InCsumErrors { + return false + } + } else if this.InCsumErrors != nil { + return false + } else if that1.InCsumErrors != nil { + return false + } + if this.InDestUnreachs != nil && that1.InDestUnreachs != nil { + if *this.InDestUnreachs != *that1.InDestUnreachs { + return false + } + } else if this.InDestUnreachs != nil { + return false + } else if that1.InDestUnreachs != nil { + return false + } + if this.InTimeExcds != nil && that1.InTimeExcds != nil { + if *this.InTimeExcds != *that1.InTimeExcds { + return false + } + } else if this.InTimeExcds != nil { + return false + } else if that1.InTimeExcds != nil { + return false + } + if this.InParmProbs != nil && that1.InParmProbs != nil { + if *this.InParmProbs != *that1.InParmProbs { + return false + } + } else if this.InParmProbs != nil { + return false + } else if that1.InParmProbs != nil { + return false + } + if this.InSrcQuenchs != nil && that1.InSrcQuenchs != nil { + if *this.InSrcQuenchs != *that1.InSrcQuenchs { + return false + } + } else if this.InSrcQuenchs != nil { + return false + } else if that1.InSrcQuenchs != nil { + return false + } + if this.InRedirects != nil && that1.InRedirects != nil { + if *this.InRedirects != *that1.InRedirects { + return false + } + } else if this.InRedirects != nil { + return false + } else if that1.InRedirects != nil { + return false + } + if this.InEchos != nil && that1.InEchos != nil { + if *this.InEchos != *that1.InEchos { + return false + } + } else if this.InEchos != nil { + return false + } else if that1.InEchos != nil { + return false + } + if this.InEchoReps != nil && that1.InEchoReps != nil { + if *this.InEchoReps != *that1.InEchoReps { + return false + } + } else if this.InEchoReps != nil { + return false + } else if that1.InEchoReps != nil { + return false + } + if this.InTimestamps != nil && that1.InTimestamps != nil { + if *this.InTimestamps != *that1.InTimestamps { + return false + } + } else if this.InTimestamps != nil { + return false + } else if that1.InTimestamps != nil { + return false + } + if this.InTimestampReps != nil && that1.InTimestampReps != nil { + if *this.InTimestampReps != *that1.InTimestampReps { + return false + } + } else if this.InTimestampReps != nil { + return false + } else if that1.InTimestampReps != nil { + return false + } + if this.InAddrMasks != nil && that1.InAddrMasks != nil { + if *this.InAddrMasks != *that1.InAddrMasks { + return false + } + } else if this.InAddrMasks != nil { + return false + } else if that1.InAddrMasks != nil { + return false + } + if this.InAddrMaskReps != nil && that1.InAddrMaskReps != nil { + if *this.InAddrMaskReps != *that1.InAddrMaskReps { + return false + } + } else if this.InAddrMaskReps != nil { + return false + } else if that1.InAddrMaskReps != nil { + return false + } + if this.OutMsgs != nil && that1.OutMsgs != nil { + if *this.OutMsgs != *that1.OutMsgs { + return false + } + } else if this.OutMsgs != nil { + return false + } else if that1.OutMsgs != nil { + return false + } + if this.OutErrors != nil && that1.OutErrors != nil { + if *this.OutErrors != *that1.OutErrors { + return false + } + } else if this.OutErrors != nil { + return false + } else if that1.OutErrors != nil { + return false + } + if this.OutDestUnreachs != nil && that1.OutDestUnreachs != nil { + if *this.OutDestUnreachs != *that1.OutDestUnreachs { + return false + } + } else if this.OutDestUnreachs != nil { + return false + } else if that1.OutDestUnreachs != nil { + return false + } + if this.OutTimeExcds != nil && that1.OutTimeExcds != nil { + if *this.OutTimeExcds != *that1.OutTimeExcds { + return false + } + } else if this.OutTimeExcds != nil { + return false + } else if that1.OutTimeExcds != nil { + return false + } + if this.OutParmProbs != nil && that1.OutParmProbs != nil { + if *this.OutParmProbs != *that1.OutParmProbs { + return false + } + } else if this.OutParmProbs != nil { + return false + } else if that1.OutParmProbs != nil { + return false + } + if this.OutSrcQuenchs != nil && that1.OutSrcQuenchs != nil { + if *this.OutSrcQuenchs != *that1.OutSrcQuenchs { + return false + } + } else if this.OutSrcQuenchs != nil { + return false + } else if that1.OutSrcQuenchs != nil { + return false + } + if this.OutRedirects != nil && that1.OutRedirects != nil { + if *this.OutRedirects != *that1.OutRedirects { + return false + } + } else if this.OutRedirects != nil { + return false + } else if that1.OutRedirects != nil { + return false + } + if this.OutEchos != nil && that1.OutEchos != nil { + if *this.OutEchos != *that1.OutEchos { + return false + } + } else if this.OutEchos != nil { + return false + } else if that1.OutEchos != nil { + return false + } + if this.OutEchoReps != nil && that1.OutEchoReps != nil { + if *this.OutEchoReps != *that1.OutEchoReps { + return false + } + } else if this.OutEchoReps != nil { + return false + } else if that1.OutEchoReps != nil { + return false + } + if this.OutTimestamps != nil && that1.OutTimestamps != nil { + if *this.OutTimestamps != *that1.OutTimestamps { + return false + } + } else if this.OutTimestamps != nil { + return false + } else if that1.OutTimestamps != nil { + return false + } + if this.OutTimestampReps != nil && that1.OutTimestampReps != nil { + if *this.OutTimestampReps != *that1.OutTimestampReps { + return false + } + } else if this.OutTimestampReps != nil { + return false + } else if that1.OutTimestampReps != nil { + return false + } + if this.OutAddrMasks != nil && that1.OutAddrMasks != nil { + if *this.OutAddrMasks != *that1.OutAddrMasks { + return false + } + } else if this.OutAddrMasks != nil { + return false + } else if that1.OutAddrMasks != nil { + return false + } + if this.OutAddrMaskReps != nil && that1.OutAddrMaskReps != nil { + if *this.OutAddrMaskReps != *that1.OutAddrMaskReps { + return false + } + } else if this.OutAddrMaskReps != nil { + return false + } else if that1.OutAddrMaskReps != nil { + return false + } + return true +} +func (this *TcpStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TcpStatistics) + if !ok { + that2, ok := that.(TcpStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TcpStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TcpStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TcpStatistics but is not nil && this == nil") + } + if this.RtoAlgorithm != nil && that1.RtoAlgorithm != nil { + if *this.RtoAlgorithm != *that1.RtoAlgorithm { + return fmt.Errorf("RtoAlgorithm this(%v) Not Equal that(%v)", *this.RtoAlgorithm, *that1.RtoAlgorithm) + } + } else if this.RtoAlgorithm != nil { + return fmt.Errorf("this.RtoAlgorithm == nil && that.RtoAlgorithm != nil") + } else if that1.RtoAlgorithm != nil { + return fmt.Errorf("RtoAlgorithm this(%v) Not Equal that(%v)", this.RtoAlgorithm, that1.RtoAlgorithm) + } + if this.RtoMin != nil && that1.RtoMin != nil { + if *this.RtoMin != *that1.RtoMin { + return fmt.Errorf("RtoMin this(%v) Not Equal that(%v)", *this.RtoMin, *that1.RtoMin) + } + } else if this.RtoMin != nil { + return fmt.Errorf("this.RtoMin == nil && that.RtoMin != nil") + } else if that1.RtoMin != nil { + return fmt.Errorf("RtoMin this(%v) Not Equal that(%v)", this.RtoMin, that1.RtoMin) + } + if this.RtoMax != nil && that1.RtoMax != nil { + if *this.RtoMax != *that1.RtoMax { + return fmt.Errorf("RtoMax this(%v) Not Equal that(%v)", *this.RtoMax, *that1.RtoMax) + } + } else if this.RtoMax != nil { + return fmt.Errorf("this.RtoMax == nil && that.RtoMax != nil") + } else if that1.RtoMax != nil { + return fmt.Errorf("RtoMax this(%v) Not Equal that(%v)", this.RtoMax, that1.RtoMax) + } + if this.MaxConn != nil && that1.MaxConn != nil { + if *this.MaxConn != *that1.MaxConn { + return fmt.Errorf("MaxConn this(%v) Not Equal that(%v)", *this.MaxConn, *that1.MaxConn) + } + } else if this.MaxConn != nil { + return fmt.Errorf("this.MaxConn == nil && that.MaxConn != nil") + } else if that1.MaxConn != nil { + return fmt.Errorf("MaxConn this(%v) Not Equal that(%v)", this.MaxConn, that1.MaxConn) + } + if this.ActiveOpens != nil && that1.ActiveOpens != nil { + if *this.ActiveOpens != *that1.ActiveOpens { + return fmt.Errorf("ActiveOpens this(%v) Not Equal that(%v)", *this.ActiveOpens, *that1.ActiveOpens) + } + } else if this.ActiveOpens != nil { + return fmt.Errorf("this.ActiveOpens == nil && that.ActiveOpens != nil") + } else if that1.ActiveOpens != nil { + return fmt.Errorf("ActiveOpens this(%v) Not Equal that(%v)", this.ActiveOpens, that1.ActiveOpens) + } + if this.PassiveOpens != nil && that1.PassiveOpens != nil { + if *this.PassiveOpens != *that1.PassiveOpens { + return fmt.Errorf("PassiveOpens this(%v) Not Equal that(%v)", *this.PassiveOpens, *that1.PassiveOpens) + } + } else if this.PassiveOpens != nil { + return fmt.Errorf("this.PassiveOpens == nil && that.PassiveOpens != nil") + } else if that1.PassiveOpens != nil { + return fmt.Errorf("PassiveOpens this(%v) Not Equal that(%v)", this.PassiveOpens, that1.PassiveOpens) + } + if this.AttemptFails != nil && that1.AttemptFails != nil { + if *this.AttemptFails != *that1.AttemptFails { + return fmt.Errorf("AttemptFails this(%v) Not Equal that(%v)", *this.AttemptFails, *that1.AttemptFails) + } + } else if this.AttemptFails != nil { + return fmt.Errorf("this.AttemptFails == nil && that.AttemptFails != nil") + } else if that1.AttemptFails != nil { + return fmt.Errorf("AttemptFails this(%v) Not Equal that(%v)", this.AttemptFails, that1.AttemptFails) + } + if this.EstabResets != nil && that1.EstabResets != nil { + if *this.EstabResets != *that1.EstabResets { + return fmt.Errorf("EstabResets this(%v) Not Equal that(%v)", *this.EstabResets, *that1.EstabResets) + } + } else if this.EstabResets != nil { + return fmt.Errorf("this.EstabResets == nil && that.EstabResets != nil") + } else if that1.EstabResets != nil { + return fmt.Errorf("EstabResets this(%v) Not Equal that(%v)", this.EstabResets, that1.EstabResets) + } + if this.CurrEstab != nil && that1.CurrEstab != nil { + if *this.CurrEstab != *that1.CurrEstab { + return fmt.Errorf("CurrEstab this(%v) Not Equal that(%v)", *this.CurrEstab, *that1.CurrEstab) + } + } else if this.CurrEstab != nil { + return fmt.Errorf("this.CurrEstab == nil && that.CurrEstab != nil") + } else if that1.CurrEstab != nil { + return fmt.Errorf("CurrEstab this(%v) Not Equal that(%v)", this.CurrEstab, that1.CurrEstab) + } + if this.InSegs != nil && that1.InSegs != nil { + if *this.InSegs != *that1.InSegs { + return fmt.Errorf("InSegs this(%v) Not Equal that(%v)", *this.InSegs, *that1.InSegs) + } + } else if this.InSegs != nil { + return fmt.Errorf("this.InSegs == nil && that.InSegs != nil") + } else if that1.InSegs != nil { + return fmt.Errorf("InSegs this(%v) Not Equal that(%v)", this.InSegs, that1.InSegs) + } + if this.OutSegs != nil && that1.OutSegs != nil { + if *this.OutSegs != *that1.OutSegs { + return fmt.Errorf("OutSegs this(%v) Not Equal that(%v)", *this.OutSegs, *that1.OutSegs) + } + } else if this.OutSegs != nil { + return fmt.Errorf("this.OutSegs == nil && that.OutSegs != nil") + } else if that1.OutSegs != nil { + return fmt.Errorf("OutSegs this(%v) Not Equal that(%v)", this.OutSegs, that1.OutSegs) + } + if this.RetransSegs != nil && that1.RetransSegs != nil { + if *this.RetransSegs != *that1.RetransSegs { + return fmt.Errorf("RetransSegs this(%v) Not Equal that(%v)", *this.RetransSegs, *that1.RetransSegs) + } + } else if this.RetransSegs != nil { + return fmt.Errorf("this.RetransSegs == nil && that.RetransSegs != nil") + } else if that1.RetransSegs != nil { + return fmt.Errorf("RetransSegs this(%v) Not Equal that(%v)", this.RetransSegs, that1.RetransSegs) + } + if this.InErrs != nil && that1.InErrs != nil { + if *this.InErrs != *that1.InErrs { + return fmt.Errorf("InErrs this(%v) Not Equal that(%v)", *this.InErrs, *that1.InErrs) + } + } else if this.InErrs != nil { + return fmt.Errorf("this.InErrs == nil && that.InErrs != nil") + } else if that1.InErrs != nil { + return fmt.Errorf("InErrs this(%v) Not Equal that(%v)", this.InErrs, that1.InErrs) + } + if this.OutRsts != nil && that1.OutRsts != nil { + if *this.OutRsts != *that1.OutRsts { + return fmt.Errorf("OutRsts this(%v) Not Equal that(%v)", *this.OutRsts, *that1.OutRsts) + } + } else if this.OutRsts != nil { + return fmt.Errorf("this.OutRsts == nil && that.OutRsts != nil") + } else if that1.OutRsts != nil { + return fmt.Errorf("OutRsts this(%v) Not Equal that(%v)", this.OutRsts, that1.OutRsts) + } + if this.InCsumErrors != nil && that1.InCsumErrors != nil { + if *this.InCsumErrors != *that1.InCsumErrors { + return fmt.Errorf("InCsumErrors this(%v) Not Equal that(%v)", *this.InCsumErrors, *that1.InCsumErrors) + } + } else if this.InCsumErrors != nil { + return fmt.Errorf("this.InCsumErrors == nil && that.InCsumErrors != nil") + } else if that1.InCsumErrors != nil { + return fmt.Errorf("InCsumErrors this(%v) Not Equal that(%v)", this.InCsumErrors, that1.InCsumErrors) + } + return nil +} +func (this *TcpStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TcpStatistics) + if !ok { + that2, ok := that.(TcpStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.RtoAlgorithm != nil && that1.RtoAlgorithm != nil { + if *this.RtoAlgorithm != *that1.RtoAlgorithm { + return false + } + } else if this.RtoAlgorithm != nil { + return false + } else if that1.RtoAlgorithm != nil { + return false + } + if this.RtoMin != nil && that1.RtoMin != nil { + if *this.RtoMin != *that1.RtoMin { + return false + } + } else if this.RtoMin != nil { + return false + } else if that1.RtoMin != nil { + return false + } + if this.RtoMax != nil && that1.RtoMax != nil { + if *this.RtoMax != *that1.RtoMax { + return false + } + } else if this.RtoMax != nil { + return false + } else if that1.RtoMax != nil { + return false + } + if this.MaxConn != nil && that1.MaxConn != nil { + if *this.MaxConn != *that1.MaxConn { + return false + } + } else if this.MaxConn != nil { + return false + } else if that1.MaxConn != nil { + return false + } + if this.ActiveOpens != nil && that1.ActiveOpens != nil { + if *this.ActiveOpens != *that1.ActiveOpens { + return false + } + } else if this.ActiveOpens != nil { + return false + } else if that1.ActiveOpens != nil { + return false + } + if this.PassiveOpens != nil && that1.PassiveOpens != nil { + if *this.PassiveOpens != *that1.PassiveOpens { + return false + } + } else if this.PassiveOpens != nil { + return false + } else if that1.PassiveOpens != nil { + return false + } + if this.AttemptFails != nil && that1.AttemptFails != nil { + if *this.AttemptFails != *that1.AttemptFails { + return false + } + } else if this.AttemptFails != nil { + return false + } else if that1.AttemptFails != nil { + return false + } + if this.EstabResets != nil && that1.EstabResets != nil { + if *this.EstabResets != *that1.EstabResets { + return false + } + } else if this.EstabResets != nil { + return false + } else if that1.EstabResets != nil { + return false + } + if this.CurrEstab != nil && that1.CurrEstab != nil { + if *this.CurrEstab != *that1.CurrEstab { + return false + } + } else if this.CurrEstab != nil { + return false + } else if that1.CurrEstab != nil { + return false + } + if this.InSegs != nil && that1.InSegs != nil { + if *this.InSegs != *that1.InSegs { + return false + } + } else if this.InSegs != nil { + return false + } else if that1.InSegs != nil { + return false + } + if this.OutSegs != nil && that1.OutSegs != nil { + if *this.OutSegs != *that1.OutSegs { + return false + } + } else if this.OutSegs != nil { + return false + } else if that1.OutSegs != nil { + return false + } + if this.RetransSegs != nil && that1.RetransSegs != nil { + if *this.RetransSegs != *that1.RetransSegs { + return false + } + } else if this.RetransSegs != nil { + return false + } else if that1.RetransSegs != nil { + return false + } + if this.InErrs != nil && that1.InErrs != nil { + if *this.InErrs != *that1.InErrs { + return false + } + } else if this.InErrs != nil { + return false + } else if that1.InErrs != nil { + return false + } + if this.OutRsts != nil && that1.OutRsts != nil { + if *this.OutRsts != *that1.OutRsts { + return false + } + } else if this.OutRsts != nil { + return false + } else if that1.OutRsts != nil { + return false + } + if this.InCsumErrors != nil && that1.InCsumErrors != nil { + if *this.InCsumErrors != *that1.InCsumErrors { + return false + } + } else if this.InCsumErrors != nil { + return false + } else if that1.InCsumErrors != nil { + return false + } + return true +} +func (this *UdpStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*UdpStatistics) + if !ok { + that2, ok := that.(UdpStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *UdpStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *UdpStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *UdpStatistics but is not nil && this == nil") + } + if this.InDatagrams != nil && that1.InDatagrams != nil { + if *this.InDatagrams != *that1.InDatagrams { + return fmt.Errorf("InDatagrams this(%v) Not Equal that(%v)", *this.InDatagrams, *that1.InDatagrams) + } + } else if this.InDatagrams != nil { + return fmt.Errorf("this.InDatagrams == nil && that.InDatagrams != nil") + } else if that1.InDatagrams != nil { + return fmt.Errorf("InDatagrams this(%v) Not Equal that(%v)", this.InDatagrams, that1.InDatagrams) + } + if this.NoPorts != nil && that1.NoPorts != nil { + if *this.NoPorts != *that1.NoPorts { + return fmt.Errorf("NoPorts this(%v) Not Equal that(%v)", *this.NoPorts, *that1.NoPorts) + } + } else if this.NoPorts != nil { + return fmt.Errorf("this.NoPorts == nil && that.NoPorts != nil") + } else if that1.NoPorts != nil { + return fmt.Errorf("NoPorts this(%v) Not Equal that(%v)", this.NoPorts, that1.NoPorts) + } + if this.InErrors != nil && that1.InErrors != nil { + if *this.InErrors != *that1.InErrors { + return fmt.Errorf("InErrors this(%v) Not Equal that(%v)", *this.InErrors, *that1.InErrors) + } + } else if this.InErrors != nil { + return fmt.Errorf("this.InErrors == nil && that.InErrors != nil") + } else if that1.InErrors != nil { + return fmt.Errorf("InErrors this(%v) Not Equal that(%v)", this.InErrors, that1.InErrors) + } + if this.OutDatagrams != nil && that1.OutDatagrams != nil { + if *this.OutDatagrams != *that1.OutDatagrams { + return fmt.Errorf("OutDatagrams this(%v) Not Equal that(%v)", *this.OutDatagrams, *that1.OutDatagrams) + } + } else if this.OutDatagrams != nil { + return fmt.Errorf("this.OutDatagrams == nil && that.OutDatagrams != nil") + } else if that1.OutDatagrams != nil { + return fmt.Errorf("OutDatagrams this(%v) Not Equal that(%v)", this.OutDatagrams, that1.OutDatagrams) + } + if this.RcvbufErrors != nil && that1.RcvbufErrors != nil { + if *this.RcvbufErrors != *that1.RcvbufErrors { + return fmt.Errorf("RcvbufErrors this(%v) Not Equal that(%v)", *this.RcvbufErrors, *that1.RcvbufErrors) + } + } else if this.RcvbufErrors != nil { + return fmt.Errorf("this.RcvbufErrors == nil && that.RcvbufErrors != nil") + } else if that1.RcvbufErrors != nil { + return fmt.Errorf("RcvbufErrors this(%v) Not Equal that(%v)", this.RcvbufErrors, that1.RcvbufErrors) + } + if this.SndbufErrors != nil && that1.SndbufErrors != nil { + if *this.SndbufErrors != *that1.SndbufErrors { + return fmt.Errorf("SndbufErrors this(%v) Not Equal that(%v)", *this.SndbufErrors, *that1.SndbufErrors) + } + } else if this.SndbufErrors != nil { + return fmt.Errorf("this.SndbufErrors == nil && that.SndbufErrors != nil") + } else if that1.SndbufErrors != nil { + return fmt.Errorf("SndbufErrors this(%v) Not Equal that(%v)", this.SndbufErrors, that1.SndbufErrors) + } + if this.InCsumErrors != nil && that1.InCsumErrors != nil { + if *this.InCsumErrors != *that1.InCsumErrors { + return fmt.Errorf("InCsumErrors this(%v) Not Equal that(%v)", *this.InCsumErrors, *that1.InCsumErrors) + } + } else if this.InCsumErrors != nil { + return fmt.Errorf("this.InCsumErrors == nil && that.InCsumErrors != nil") + } else if that1.InCsumErrors != nil { + return fmt.Errorf("InCsumErrors this(%v) Not Equal that(%v)", this.InCsumErrors, that1.InCsumErrors) + } + if this.IgnoredMulti != nil && that1.IgnoredMulti != nil { + if *this.IgnoredMulti != *that1.IgnoredMulti { + return fmt.Errorf("IgnoredMulti this(%v) Not Equal that(%v)", *this.IgnoredMulti, *that1.IgnoredMulti) + } + } else if this.IgnoredMulti != nil { + return fmt.Errorf("this.IgnoredMulti == nil && that.IgnoredMulti != nil") + } else if that1.IgnoredMulti != nil { + return fmt.Errorf("IgnoredMulti this(%v) Not Equal that(%v)", this.IgnoredMulti, that1.IgnoredMulti) + } + return nil +} +func (this *UdpStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*UdpStatistics) + if !ok { + that2, ok := that.(UdpStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.InDatagrams != nil && that1.InDatagrams != nil { + if *this.InDatagrams != *that1.InDatagrams { + return false + } + } else if this.InDatagrams != nil { + return false + } else if that1.InDatagrams != nil { + return false + } + if this.NoPorts != nil && that1.NoPorts != nil { + if *this.NoPorts != *that1.NoPorts { + return false + } + } else if this.NoPorts != nil { + return false + } else if that1.NoPorts != nil { + return false + } + if this.InErrors != nil && that1.InErrors != nil { + if *this.InErrors != *that1.InErrors { + return false + } + } else if this.InErrors != nil { + return false + } else if that1.InErrors != nil { + return false + } + if this.OutDatagrams != nil && that1.OutDatagrams != nil { + if *this.OutDatagrams != *that1.OutDatagrams { + return false + } + } else if this.OutDatagrams != nil { + return false + } else if that1.OutDatagrams != nil { + return false + } + if this.RcvbufErrors != nil && that1.RcvbufErrors != nil { + if *this.RcvbufErrors != *that1.RcvbufErrors { + return false + } + } else if this.RcvbufErrors != nil { + return false + } else if that1.RcvbufErrors != nil { + return false + } + if this.SndbufErrors != nil && that1.SndbufErrors != nil { + if *this.SndbufErrors != *that1.SndbufErrors { + return false + } + } else if this.SndbufErrors != nil { + return false + } else if that1.SndbufErrors != nil { + return false + } + if this.InCsumErrors != nil && that1.InCsumErrors != nil { + if *this.InCsumErrors != *that1.InCsumErrors { + return false + } + } else if this.InCsumErrors != nil { + return false + } else if that1.InCsumErrors != nil { + return false + } + if this.IgnoredMulti != nil && that1.IgnoredMulti != nil { + if *this.IgnoredMulti != *that1.IgnoredMulti { + return false + } + } else if this.IgnoredMulti != nil { + return false + } else if that1.IgnoredMulti != nil { + return false + } + return true +} +func (this *SNMPStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*SNMPStatistics) + if !ok { + that2, ok := that.(SNMPStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *SNMPStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *SNMPStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *SNMPStatistics but is not nil && this == nil") + } + if !this.IPStats.Equal(that1.IPStats) { + return fmt.Errorf("IPStats this(%v) Not Equal that(%v)", this.IPStats, that1.IPStats) + } + if !this.ICMPStats.Equal(that1.ICMPStats) { + return fmt.Errorf("ICMPStats this(%v) Not Equal that(%v)", this.ICMPStats, that1.ICMPStats) + } + if !this.TCPStats.Equal(that1.TCPStats) { + return fmt.Errorf("TCPStats this(%v) Not Equal that(%v)", this.TCPStats, that1.TCPStats) + } + if !this.UDPStats.Equal(that1.UDPStats) { + return fmt.Errorf("UDPStats this(%v) Not Equal that(%v)", this.UDPStats, that1.UDPStats) + } + return nil +} +func (this *SNMPStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*SNMPStatistics) + if !ok { + that2, ok := that.(SNMPStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.IPStats.Equal(that1.IPStats) { + return false + } + if !this.ICMPStats.Equal(that1.ICMPStats) { + return false + } + if !this.TCPStats.Equal(that1.TCPStats) { + return false + } + if !this.UDPStats.Equal(that1.UDPStats) { + return false + } + return true +} +func (this *DiskStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DiskStatistics) + if !ok { + that2, ok := that.(DiskStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DiskStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DiskStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DiskStatistics but is not nil && this == nil") + } + if !this.Source.Equal(that1.Source) { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", this.Source, that1.Source) + } + if !this.Persistence.Equal(that1.Persistence) { + return fmt.Errorf("Persistence this(%v) Not Equal that(%v)", this.Persistence, that1.Persistence) + } + if this.LimitBytes != nil && that1.LimitBytes != nil { + if *this.LimitBytes != *that1.LimitBytes { + return fmt.Errorf("LimitBytes this(%v) Not Equal that(%v)", *this.LimitBytes, *that1.LimitBytes) + } + } else if this.LimitBytes != nil { + return fmt.Errorf("this.LimitBytes == nil && that.LimitBytes != nil") + } else if that1.LimitBytes != nil { + return fmt.Errorf("LimitBytes this(%v) Not Equal that(%v)", this.LimitBytes, that1.LimitBytes) + } + if this.UsedBytes != nil && that1.UsedBytes != nil { + if *this.UsedBytes != *that1.UsedBytes { + return fmt.Errorf("UsedBytes this(%v) Not Equal that(%v)", *this.UsedBytes, *that1.UsedBytes) + } + } else if this.UsedBytes != nil { + return fmt.Errorf("this.UsedBytes == nil && that.UsedBytes != nil") + } else if that1.UsedBytes != nil { + return fmt.Errorf("UsedBytes this(%v) Not Equal that(%v)", this.UsedBytes, that1.UsedBytes) + } + return nil +} +func (this *DiskStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DiskStatistics) + if !ok { + that2, ok := that.(DiskStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Source.Equal(that1.Source) { + return false + } + if !this.Persistence.Equal(that1.Persistence) { + return false + } + if this.LimitBytes != nil && that1.LimitBytes != nil { + if *this.LimitBytes != *that1.LimitBytes { + return false + } + } else if this.LimitBytes != nil { + return false + } else if that1.LimitBytes != nil { + return false + } + if this.UsedBytes != nil && that1.UsedBytes != nil { + if *this.UsedBytes != *that1.UsedBytes { + return false + } + } else if this.UsedBytes != nil { + return false + } else if that1.UsedBytes != nil { + return false + } + return true +} +func (this *ResourceStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ResourceStatistics) + if !ok { + that2, ok := that.(ResourceStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ResourceStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ResourceStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ResourceStatistics but is not nil && this == nil") + } + if this.Timestamp != that1.Timestamp { + return fmt.Errorf("Timestamp this(%v) Not Equal that(%v)", this.Timestamp, that1.Timestamp) + } + if this.Processes != nil && that1.Processes != nil { + if *this.Processes != *that1.Processes { + return fmt.Errorf("Processes this(%v) Not Equal that(%v)", *this.Processes, *that1.Processes) + } + } else if this.Processes != nil { + return fmt.Errorf("this.Processes == nil && that.Processes != nil") + } else if that1.Processes != nil { + return fmt.Errorf("Processes this(%v) Not Equal that(%v)", this.Processes, that1.Processes) + } + if this.Threads != nil && that1.Threads != nil { + if *this.Threads != *that1.Threads { + return fmt.Errorf("Threads this(%v) Not Equal that(%v)", *this.Threads, *that1.Threads) + } + } else if this.Threads != nil { + return fmt.Errorf("this.Threads == nil && that.Threads != nil") + } else if that1.Threads != nil { + return fmt.Errorf("Threads this(%v) Not Equal that(%v)", this.Threads, that1.Threads) + } + if this.CPUsUserTimeSecs != nil && that1.CPUsUserTimeSecs != nil { + if *this.CPUsUserTimeSecs != *that1.CPUsUserTimeSecs { + return fmt.Errorf("CPUsUserTimeSecs this(%v) Not Equal that(%v)", *this.CPUsUserTimeSecs, *that1.CPUsUserTimeSecs) + } + } else if this.CPUsUserTimeSecs != nil { + return fmt.Errorf("this.CPUsUserTimeSecs == nil && that.CPUsUserTimeSecs != nil") + } else if that1.CPUsUserTimeSecs != nil { + return fmt.Errorf("CPUsUserTimeSecs this(%v) Not Equal that(%v)", this.CPUsUserTimeSecs, that1.CPUsUserTimeSecs) + } + if this.CPUsSystemTimeSecs != nil && that1.CPUsSystemTimeSecs != nil { + if *this.CPUsSystemTimeSecs != *that1.CPUsSystemTimeSecs { + return fmt.Errorf("CPUsSystemTimeSecs this(%v) Not Equal that(%v)", *this.CPUsSystemTimeSecs, *that1.CPUsSystemTimeSecs) + } + } else if this.CPUsSystemTimeSecs != nil { + return fmt.Errorf("this.CPUsSystemTimeSecs == nil && that.CPUsSystemTimeSecs != nil") + } else if that1.CPUsSystemTimeSecs != nil { + return fmt.Errorf("CPUsSystemTimeSecs this(%v) Not Equal that(%v)", this.CPUsSystemTimeSecs, that1.CPUsSystemTimeSecs) + } + if this.CPUsLimit != nil && that1.CPUsLimit != nil { + if *this.CPUsLimit != *that1.CPUsLimit { + return fmt.Errorf("CPUsLimit this(%v) Not Equal that(%v)", *this.CPUsLimit, *that1.CPUsLimit) + } + } else if this.CPUsLimit != nil { + return fmt.Errorf("this.CPUsLimit == nil && that.CPUsLimit != nil") + } else if that1.CPUsLimit != nil { + return fmt.Errorf("CPUsLimit this(%v) Not Equal that(%v)", this.CPUsLimit, that1.CPUsLimit) + } + if this.CPUsNrPeriods != nil && that1.CPUsNrPeriods != nil { + if *this.CPUsNrPeriods != *that1.CPUsNrPeriods { + return fmt.Errorf("CPUsNrPeriods this(%v) Not Equal that(%v)", *this.CPUsNrPeriods, *that1.CPUsNrPeriods) + } + } else if this.CPUsNrPeriods != nil { + return fmt.Errorf("this.CPUsNrPeriods == nil && that.CPUsNrPeriods != nil") + } else if that1.CPUsNrPeriods != nil { + return fmt.Errorf("CPUsNrPeriods this(%v) Not Equal that(%v)", this.CPUsNrPeriods, that1.CPUsNrPeriods) + } + if this.CPUsNrThrottled != nil && that1.CPUsNrThrottled != nil { + if *this.CPUsNrThrottled != *that1.CPUsNrThrottled { + return fmt.Errorf("CPUsNrThrottled this(%v) Not Equal that(%v)", *this.CPUsNrThrottled, *that1.CPUsNrThrottled) + } + } else if this.CPUsNrThrottled != nil { + return fmt.Errorf("this.CPUsNrThrottled == nil && that.CPUsNrThrottled != nil") + } else if that1.CPUsNrThrottled != nil { + return fmt.Errorf("CPUsNrThrottled this(%v) Not Equal that(%v)", this.CPUsNrThrottled, that1.CPUsNrThrottled) + } + if this.CPUsThrottledTimeSecs != nil && that1.CPUsThrottledTimeSecs != nil { + if *this.CPUsThrottledTimeSecs != *that1.CPUsThrottledTimeSecs { + return fmt.Errorf("CPUsThrottledTimeSecs this(%v) Not Equal that(%v)", *this.CPUsThrottledTimeSecs, *that1.CPUsThrottledTimeSecs) + } + } else if this.CPUsThrottledTimeSecs != nil { + return fmt.Errorf("this.CPUsThrottledTimeSecs == nil && that.CPUsThrottledTimeSecs != nil") + } else if that1.CPUsThrottledTimeSecs != nil { + return fmt.Errorf("CPUsThrottledTimeSecs this(%v) Not Equal that(%v)", this.CPUsThrottledTimeSecs, that1.CPUsThrottledTimeSecs) + } + if this.MemTotalBytes != nil && that1.MemTotalBytes != nil { + if *this.MemTotalBytes != *that1.MemTotalBytes { + return fmt.Errorf("MemTotalBytes this(%v) Not Equal that(%v)", *this.MemTotalBytes, *that1.MemTotalBytes) + } + } else if this.MemTotalBytes != nil { + return fmt.Errorf("this.MemTotalBytes == nil && that.MemTotalBytes != nil") + } else if that1.MemTotalBytes != nil { + return fmt.Errorf("MemTotalBytes this(%v) Not Equal that(%v)", this.MemTotalBytes, that1.MemTotalBytes) + } + if this.MemTotalMemswBytes != nil && that1.MemTotalMemswBytes != nil { + if *this.MemTotalMemswBytes != *that1.MemTotalMemswBytes { + return fmt.Errorf("MemTotalMemswBytes this(%v) Not Equal that(%v)", *this.MemTotalMemswBytes, *that1.MemTotalMemswBytes) + } + } else if this.MemTotalMemswBytes != nil { + return fmt.Errorf("this.MemTotalMemswBytes == nil && that.MemTotalMemswBytes != nil") + } else if that1.MemTotalMemswBytes != nil { + return fmt.Errorf("MemTotalMemswBytes this(%v) Not Equal that(%v)", this.MemTotalMemswBytes, that1.MemTotalMemswBytes) + } + if this.MemLimitBytes != nil && that1.MemLimitBytes != nil { + if *this.MemLimitBytes != *that1.MemLimitBytes { + return fmt.Errorf("MemLimitBytes this(%v) Not Equal that(%v)", *this.MemLimitBytes, *that1.MemLimitBytes) + } + } else if this.MemLimitBytes != nil { + return fmt.Errorf("this.MemLimitBytes == nil && that.MemLimitBytes != nil") + } else if that1.MemLimitBytes != nil { + return fmt.Errorf("MemLimitBytes this(%v) Not Equal that(%v)", this.MemLimitBytes, that1.MemLimitBytes) + } + if this.MemSoftLimitBytes != nil && that1.MemSoftLimitBytes != nil { + if *this.MemSoftLimitBytes != *that1.MemSoftLimitBytes { + return fmt.Errorf("MemSoftLimitBytes this(%v) Not Equal that(%v)", *this.MemSoftLimitBytes, *that1.MemSoftLimitBytes) + } + } else if this.MemSoftLimitBytes != nil { + return fmt.Errorf("this.MemSoftLimitBytes == nil && that.MemSoftLimitBytes != nil") + } else if that1.MemSoftLimitBytes != nil { + return fmt.Errorf("MemSoftLimitBytes this(%v) Not Equal that(%v)", this.MemSoftLimitBytes, that1.MemSoftLimitBytes) + } + if this.MemFileBytes != nil && that1.MemFileBytes != nil { + if *this.MemFileBytes != *that1.MemFileBytes { + return fmt.Errorf("MemFileBytes this(%v) Not Equal that(%v)", *this.MemFileBytes, *that1.MemFileBytes) + } + } else if this.MemFileBytes != nil { + return fmt.Errorf("this.MemFileBytes == nil && that.MemFileBytes != nil") + } else if that1.MemFileBytes != nil { + return fmt.Errorf("MemFileBytes this(%v) Not Equal that(%v)", this.MemFileBytes, that1.MemFileBytes) + } + if this.MemAnonBytes != nil && that1.MemAnonBytes != nil { + if *this.MemAnonBytes != *that1.MemAnonBytes { + return fmt.Errorf("MemAnonBytes this(%v) Not Equal that(%v)", *this.MemAnonBytes, *that1.MemAnonBytes) + } + } else if this.MemAnonBytes != nil { + return fmt.Errorf("this.MemAnonBytes == nil && that.MemAnonBytes != nil") + } else if that1.MemAnonBytes != nil { + return fmt.Errorf("MemAnonBytes this(%v) Not Equal that(%v)", this.MemAnonBytes, that1.MemAnonBytes) + } + if this.MemCacheBytes != nil && that1.MemCacheBytes != nil { + if *this.MemCacheBytes != *that1.MemCacheBytes { + return fmt.Errorf("MemCacheBytes this(%v) Not Equal that(%v)", *this.MemCacheBytes, *that1.MemCacheBytes) + } + } else if this.MemCacheBytes != nil { + return fmt.Errorf("this.MemCacheBytes == nil && that.MemCacheBytes != nil") + } else if that1.MemCacheBytes != nil { + return fmt.Errorf("MemCacheBytes this(%v) Not Equal that(%v)", this.MemCacheBytes, that1.MemCacheBytes) + } + if this.MemRSSBytes != nil && that1.MemRSSBytes != nil { + if *this.MemRSSBytes != *that1.MemRSSBytes { + return fmt.Errorf("MemRSSBytes this(%v) Not Equal that(%v)", *this.MemRSSBytes, *that1.MemRSSBytes) + } + } else if this.MemRSSBytes != nil { + return fmt.Errorf("this.MemRSSBytes == nil && that.MemRSSBytes != nil") + } else if that1.MemRSSBytes != nil { + return fmt.Errorf("MemRSSBytes this(%v) Not Equal that(%v)", this.MemRSSBytes, that1.MemRSSBytes) + } + if this.MemMappedFileBytes != nil && that1.MemMappedFileBytes != nil { + if *this.MemMappedFileBytes != *that1.MemMappedFileBytes { + return fmt.Errorf("MemMappedFileBytes this(%v) Not Equal that(%v)", *this.MemMappedFileBytes, *that1.MemMappedFileBytes) + } + } else if this.MemMappedFileBytes != nil { + return fmt.Errorf("this.MemMappedFileBytes == nil && that.MemMappedFileBytes != nil") + } else if that1.MemMappedFileBytes != nil { + return fmt.Errorf("MemMappedFileBytes this(%v) Not Equal that(%v)", this.MemMappedFileBytes, that1.MemMappedFileBytes) + } + if this.MemSwapBytes != nil && that1.MemSwapBytes != nil { + if *this.MemSwapBytes != *that1.MemSwapBytes { + return fmt.Errorf("MemSwapBytes this(%v) Not Equal that(%v)", *this.MemSwapBytes, *that1.MemSwapBytes) + } + } else if this.MemSwapBytes != nil { + return fmt.Errorf("this.MemSwapBytes == nil && that.MemSwapBytes != nil") + } else if that1.MemSwapBytes != nil { + return fmt.Errorf("MemSwapBytes this(%v) Not Equal that(%v)", this.MemSwapBytes, that1.MemSwapBytes) + } + if this.MemUnevictableBytes != nil && that1.MemUnevictableBytes != nil { + if *this.MemUnevictableBytes != *that1.MemUnevictableBytes { + return fmt.Errorf("MemUnevictableBytes this(%v) Not Equal that(%v)", *this.MemUnevictableBytes, *that1.MemUnevictableBytes) + } + } else if this.MemUnevictableBytes != nil { + return fmt.Errorf("this.MemUnevictableBytes == nil && that.MemUnevictableBytes != nil") + } else if that1.MemUnevictableBytes != nil { + return fmt.Errorf("MemUnevictableBytes this(%v) Not Equal that(%v)", this.MemUnevictableBytes, that1.MemUnevictableBytes) + } + if this.MemLowPressureCounter != nil && that1.MemLowPressureCounter != nil { + if *this.MemLowPressureCounter != *that1.MemLowPressureCounter { + return fmt.Errorf("MemLowPressureCounter this(%v) Not Equal that(%v)", *this.MemLowPressureCounter, *that1.MemLowPressureCounter) + } + } else if this.MemLowPressureCounter != nil { + return fmt.Errorf("this.MemLowPressureCounter == nil && that.MemLowPressureCounter != nil") + } else if that1.MemLowPressureCounter != nil { + return fmt.Errorf("MemLowPressureCounter this(%v) Not Equal that(%v)", this.MemLowPressureCounter, that1.MemLowPressureCounter) + } + if this.MemMediumPressureCounter != nil && that1.MemMediumPressureCounter != nil { + if *this.MemMediumPressureCounter != *that1.MemMediumPressureCounter { + return fmt.Errorf("MemMediumPressureCounter this(%v) Not Equal that(%v)", *this.MemMediumPressureCounter, *that1.MemMediumPressureCounter) + } + } else if this.MemMediumPressureCounter != nil { + return fmt.Errorf("this.MemMediumPressureCounter == nil && that.MemMediumPressureCounter != nil") + } else if that1.MemMediumPressureCounter != nil { + return fmt.Errorf("MemMediumPressureCounter this(%v) Not Equal that(%v)", this.MemMediumPressureCounter, that1.MemMediumPressureCounter) + } + if this.MemCriticalPressureCounter != nil && that1.MemCriticalPressureCounter != nil { + if *this.MemCriticalPressureCounter != *that1.MemCriticalPressureCounter { + return fmt.Errorf("MemCriticalPressureCounter this(%v) Not Equal that(%v)", *this.MemCriticalPressureCounter, *that1.MemCriticalPressureCounter) + } + } else if this.MemCriticalPressureCounter != nil { + return fmt.Errorf("this.MemCriticalPressureCounter == nil && that.MemCriticalPressureCounter != nil") + } else if that1.MemCriticalPressureCounter != nil { + return fmt.Errorf("MemCriticalPressureCounter this(%v) Not Equal that(%v)", this.MemCriticalPressureCounter, that1.MemCriticalPressureCounter) + } + if this.DiskLimitBytes != nil && that1.DiskLimitBytes != nil { + if *this.DiskLimitBytes != *that1.DiskLimitBytes { + return fmt.Errorf("DiskLimitBytes this(%v) Not Equal that(%v)", *this.DiskLimitBytes, *that1.DiskLimitBytes) + } + } else if this.DiskLimitBytes != nil { + return fmt.Errorf("this.DiskLimitBytes == nil && that.DiskLimitBytes != nil") + } else if that1.DiskLimitBytes != nil { + return fmt.Errorf("DiskLimitBytes this(%v) Not Equal that(%v)", this.DiskLimitBytes, that1.DiskLimitBytes) + } + if this.DiskUsedBytes != nil && that1.DiskUsedBytes != nil { + if *this.DiskUsedBytes != *that1.DiskUsedBytes { + return fmt.Errorf("DiskUsedBytes this(%v) Not Equal that(%v)", *this.DiskUsedBytes, *that1.DiskUsedBytes) + } + } else if this.DiskUsedBytes != nil { + return fmt.Errorf("this.DiskUsedBytes == nil && that.DiskUsedBytes != nil") + } else if that1.DiskUsedBytes != nil { + return fmt.Errorf("DiskUsedBytes this(%v) Not Equal that(%v)", this.DiskUsedBytes, that1.DiskUsedBytes) + } + if len(this.DiskStatistics) != len(that1.DiskStatistics) { + return fmt.Errorf("DiskStatistics this(%v) Not Equal that(%v)", len(this.DiskStatistics), len(that1.DiskStatistics)) + } + for i := range this.DiskStatistics { + if !this.DiskStatistics[i].Equal(&that1.DiskStatistics[i]) { + return fmt.Errorf("DiskStatistics this[%v](%v) Not Equal that[%v](%v)", i, this.DiskStatistics[i], i, that1.DiskStatistics[i]) + } + } + if !this.BlkioStatistics.Equal(that1.BlkioStatistics) { + return fmt.Errorf("BlkioStatistics this(%v) Not Equal that(%v)", this.BlkioStatistics, that1.BlkioStatistics) + } + if !this.Perf.Equal(that1.Perf) { + return fmt.Errorf("Perf this(%v) Not Equal that(%v)", this.Perf, that1.Perf) + } + if this.NetRxPackets != nil && that1.NetRxPackets != nil { + if *this.NetRxPackets != *that1.NetRxPackets { + return fmt.Errorf("NetRxPackets this(%v) Not Equal that(%v)", *this.NetRxPackets, *that1.NetRxPackets) + } + } else if this.NetRxPackets != nil { + return fmt.Errorf("this.NetRxPackets == nil && that.NetRxPackets != nil") + } else if that1.NetRxPackets != nil { + return fmt.Errorf("NetRxPackets this(%v) Not Equal that(%v)", this.NetRxPackets, that1.NetRxPackets) + } + if this.NetRxBytes != nil && that1.NetRxBytes != nil { + if *this.NetRxBytes != *that1.NetRxBytes { + return fmt.Errorf("NetRxBytes this(%v) Not Equal that(%v)", *this.NetRxBytes, *that1.NetRxBytes) + } + } else if this.NetRxBytes != nil { + return fmt.Errorf("this.NetRxBytes == nil && that.NetRxBytes != nil") + } else if that1.NetRxBytes != nil { + return fmt.Errorf("NetRxBytes this(%v) Not Equal that(%v)", this.NetRxBytes, that1.NetRxBytes) + } + if this.NetRxErrors != nil && that1.NetRxErrors != nil { + if *this.NetRxErrors != *that1.NetRxErrors { + return fmt.Errorf("NetRxErrors this(%v) Not Equal that(%v)", *this.NetRxErrors, *that1.NetRxErrors) + } + } else if this.NetRxErrors != nil { + return fmt.Errorf("this.NetRxErrors == nil && that.NetRxErrors != nil") + } else if that1.NetRxErrors != nil { + return fmt.Errorf("NetRxErrors this(%v) Not Equal that(%v)", this.NetRxErrors, that1.NetRxErrors) + } + if this.NetRxDropped != nil && that1.NetRxDropped != nil { + if *this.NetRxDropped != *that1.NetRxDropped { + return fmt.Errorf("NetRxDropped this(%v) Not Equal that(%v)", *this.NetRxDropped, *that1.NetRxDropped) + } + } else if this.NetRxDropped != nil { + return fmt.Errorf("this.NetRxDropped == nil && that.NetRxDropped != nil") + } else if that1.NetRxDropped != nil { + return fmt.Errorf("NetRxDropped this(%v) Not Equal that(%v)", this.NetRxDropped, that1.NetRxDropped) + } + if this.NetTxPackets != nil && that1.NetTxPackets != nil { + if *this.NetTxPackets != *that1.NetTxPackets { + return fmt.Errorf("NetTxPackets this(%v) Not Equal that(%v)", *this.NetTxPackets, *that1.NetTxPackets) + } + } else if this.NetTxPackets != nil { + return fmt.Errorf("this.NetTxPackets == nil && that.NetTxPackets != nil") + } else if that1.NetTxPackets != nil { + return fmt.Errorf("NetTxPackets this(%v) Not Equal that(%v)", this.NetTxPackets, that1.NetTxPackets) + } + if this.NetTxBytes != nil && that1.NetTxBytes != nil { + if *this.NetTxBytes != *that1.NetTxBytes { + return fmt.Errorf("NetTxBytes this(%v) Not Equal that(%v)", *this.NetTxBytes, *that1.NetTxBytes) + } + } else if this.NetTxBytes != nil { + return fmt.Errorf("this.NetTxBytes == nil && that.NetTxBytes != nil") + } else if that1.NetTxBytes != nil { + return fmt.Errorf("NetTxBytes this(%v) Not Equal that(%v)", this.NetTxBytes, that1.NetTxBytes) + } + if this.NetTxErrors != nil && that1.NetTxErrors != nil { + if *this.NetTxErrors != *that1.NetTxErrors { + return fmt.Errorf("NetTxErrors this(%v) Not Equal that(%v)", *this.NetTxErrors, *that1.NetTxErrors) + } + } else if this.NetTxErrors != nil { + return fmt.Errorf("this.NetTxErrors == nil && that.NetTxErrors != nil") + } else if that1.NetTxErrors != nil { + return fmt.Errorf("NetTxErrors this(%v) Not Equal that(%v)", this.NetTxErrors, that1.NetTxErrors) + } + if this.NetTxDropped != nil && that1.NetTxDropped != nil { + if *this.NetTxDropped != *that1.NetTxDropped { + return fmt.Errorf("NetTxDropped this(%v) Not Equal that(%v)", *this.NetTxDropped, *that1.NetTxDropped) + } + } else if this.NetTxDropped != nil { + return fmt.Errorf("this.NetTxDropped == nil && that.NetTxDropped != nil") + } else if that1.NetTxDropped != nil { + return fmt.Errorf("NetTxDropped this(%v) Not Equal that(%v)", this.NetTxDropped, that1.NetTxDropped) + } + if this.NetTCPRttMicrosecsP50 != nil && that1.NetTCPRttMicrosecsP50 != nil { + if *this.NetTCPRttMicrosecsP50 != *that1.NetTCPRttMicrosecsP50 { + return fmt.Errorf("NetTCPRttMicrosecsP50 this(%v) Not Equal that(%v)", *this.NetTCPRttMicrosecsP50, *that1.NetTCPRttMicrosecsP50) + } + } else if this.NetTCPRttMicrosecsP50 != nil { + return fmt.Errorf("this.NetTCPRttMicrosecsP50 == nil && that.NetTCPRttMicrosecsP50 != nil") + } else if that1.NetTCPRttMicrosecsP50 != nil { + return fmt.Errorf("NetTCPRttMicrosecsP50 this(%v) Not Equal that(%v)", this.NetTCPRttMicrosecsP50, that1.NetTCPRttMicrosecsP50) + } + if this.NetTCPRttMicrosecsP90 != nil && that1.NetTCPRttMicrosecsP90 != nil { + if *this.NetTCPRttMicrosecsP90 != *that1.NetTCPRttMicrosecsP90 { + return fmt.Errorf("NetTCPRttMicrosecsP90 this(%v) Not Equal that(%v)", *this.NetTCPRttMicrosecsP90, *that1.NetTCPRttMicrosecsP90) + } + } else if this.NetTCPRttMicrosecsP90 != nil { + return fmt.Errorf("this.NetTCPRttMicrosecsP90 == nil && that.NetTCPRttMicrosecsP90 != nil") + } else if that1.NetTCPRttMicrosecsP90 != nil { + return fmt.Errorf("NetTCPRttMicrosecsP90 this(%v) Not Equal that(%v)", this.NetTCPRttMicrosecsP90, that1.NetTCPRttMicrosecsP90) + } + if this.NetTCPRttMicrosecsP95 != nil && that1.NetTCPRttMicrosecsP95 != nil { + if *this.NetTCPRttMicrosecsP95 != *that1.NetTCPRttMicrosecsP95 { + return fmt.Errorf("NetTCPRttMicrosecsP95 this(%v) Not Equal that(%v)", *this.NetTCPRttMicrosecsP95, *that1.NetTCPRttMicrosecsP95) + } + } else if this.NetTCPRttMicrosecsP95 != nil { + return fmt.Errorf("this.NetTCPRttMicrosecsP95 == nil && that.NetTCPRttMicrosecsP95 != nil") + } else if that1.NetTCPRttMicrosecsP95 != nil { + return fmt.Errorf("NetTCPRttMicrosecsP95 this(%v) Not Equal that(%v)", this.NetTCPRttMicrosecsP95, that1.NetTCPRttMicrosecsP95) + } + if this.NetTCPRttMicrosecsP99 != nil && that1.NetTCPRttMicrosecsP99 != nil { + if *this.NetTCPRttMicrosecsP99 != *that1.NetTCPRttMicrosecsP99 { + return fmt.Errorf("NetTCPRttMicrosecsP99 this(%v) Not Equal that(%v)", *this.NetTCPRttMicrosecsP99, *that1.NetTCPRttMicrosecsP99) + } + } else if this.NetTCPRttMicrosecsP99 != nil { + return fmt.Errorf("this.NetTCPRttMicrosecsP99 == nil && that.NetTCPRttMicrosecsP99 != nil") + } else if that1.NetTCPRttMicrosecsP99 != nil { + return fmt.Errorf("NetTCPRttMicrosecsP99 this(%v) Not Equal that(%v)", this.NetTCPRttMicrosecsP99, that1.NetTCPRttMicrosecsP99) + } + if this.NetTCPActiveConnections != nil && that1.NetTCPActiveConnections != nil { + if *this.NetTCPActiveConnections != *that1.NetTCPActiveConnections { + return fmt.Errorf("NetTCPActiveConnections this(%v) Not Equal that(%v)", *this.NetTCPActiveConnections, *that1.NetTCPActiveConnections) + } + } else if this.NetTCPActiveConnections != nil { + return fmt.Errorf("this.NetTCPActiveConnections == nil && that.NetTCPActiveConnections != nil") + } else if that1.NetTCPActiveConnections != nil { + return fmt.Errorf("NetTCPActiveConnections this(%v) Not Equal that(%v)", this.NetTCPActiveConnections, that1.NetTCPActiveConnections) + } + if this.NetTCPTimeWaitConnections != nil && that1.NetTCPTimeWaitConnections != nil { + if *this.NetTCPTimeWaitConnections != *that1.NetTCPTimeWaitConnections { + return fmt.Errorf("NetTCPTimeWaitConnections this(%v) Not Equal that(%v)", *this.NetTCPTimeWaitConnections, *that1.NetTCPTimeWaitConnections) + } + } else if this.NetTCPTimeWaitConnections != nil { + return fmt.Errorf("this.NetTCPTimeWaitConnections == nil && that.NetTCPTimeWaitConnections != nil") + } else if that1.NetTCPTimeWaitConnections != nil { + return fmt.Errorf("NetTCPTimeWaitConnections this(%v) Not Equal that(%v)", this.NetTCPTimeWaitConnections, that1.NetTCPTimeWaitConnections) + } + if len(this.NetTrafficControlStatistics) != len(that1.NetTrafficControlStatistics) { + return fmt.Errorf("NetTrafficControlStatistics this(%v) Not Equal that(%v)", len(this.NetTrafficControlStatistics), len(that1.NetTrafficControlStatistics)) + } + for i := range this.NetTrafficControlStatistics { + if !this.NetTrafficControlStatistics[i].Equal(&that1.NetTrafficControlStatistics[i]) { + return fmt.Errorf("NetTrafficControlStatistics this[%v](%v) Not Equal that[%v](%v)", i, this.NetTrafficControlStatistics[i], i, that1.NetTrafficControlStatistics[i]) + } + } + if !this.NetSNMPStatistics.Equal(that1.NetSNMPStatistics) { + return fmt.Errorf("NetSNMPStatistics this(%v) Not Equal that(%v)", this.NetSNMPStatistics, that1.NetSNMPStatistics) + } + return nil +} +func (this *ResourceStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ResourceStatistics) + if !ok { + that2, ok := that.(ResourceStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Timestamp != that1.Timestamp { + return false + } + if this.Processes != nil && that1.Processes != nil { + if *this.Processes != *that1.Processes { + return false + } + } else if this.Processes != nil { + return false + } else if that1.Processes != nil { + return false + } + if this.Threads != nil && that1.Threads != nil { + if *this.Threads != *that1.Threads { + return false + } + } else if this.Threads != nil { + return false + } else if that1.Threads != nil { + return false + } + if this.CPUsUserTimeSecs != nil && that1.CPUsUserTimeSecs != nil { + if *this.CPUsUserTimeSecs != *that1.CPUsUserTimeSecs { + return false + } + } else if this.CPUsUserTimeSecs != nil { + return false + } else if that1.CPUsUserTimeSecs != nil { + return false + } + if this.CPUsSystemTimeSecs != nil && that1.CPUsSystemTimeSecs != nil { + if *this.CPUsSystemTimeSecs != *that1.CPUsSystemTimeSecs { + return false + } + } else if this.CPUsSystemTimeSecs != nil { + return false + } else if that1.CPUsSystemTimeSecs != nil { + return false + } + if this.CPUsLimit != nil && that1.CPUsLimit != nil { + if *this.CPUsLimit != *that1.CPUsLimit { + return false + } + } else if this.CPUsLimit != nil { + return false + } else if that1.CPUsLimit != nil { + return false + } + if this.CPUsNrPeriods != nil && that1.CPUsNrPeriods != nil { + if *this.CPUsNrPeriods != *that1.CPUsNrPeriods { + return false + } + } else if this.CPUsNrPeriods != nil { + return false + } else if that1.CPUsNrPeriods != nil { + return false + } + if this.CPUsNrThrottled != nil && that1.CPUsNrThrottled != nil { + if *this.CPUsNrThrottled != *that1.CPUsNrThrottled { + return false + } + } else if this.CPUsNrThrottled != nil { + return false + } else if that1.CPUsNrThrottled != nil { + return false + } + if this.CPUsThrottledTimeSecs != nil && that1.CPUsThrottledTimeSecs != nil { + if *this.CPUsThrottledTimeSecs != *that1.CPUsThrottledTimeSecs { + return false + } + } else if this.CPUsThrottledTimeSecs != nil { + return false + } else if that1.CPUsThrottledTimeSecs != nil { + return false + } + if this.MemTotalBytes != nil && that1.MemTotalBytes != nil { + if *this.MemTotalBytes != *that1.MemTotalBytes { + return false + } + } else if this.MemTotalBytes != nil { + return false + } else if that1.MemTotalBytes != nil { + return false + } + if this.MemTotalMemswBytes != nil && that1.MemTotalMemswBytes != nil { + if *this.MemTotalMemswBytes != *that1.MemTotalMemswBytes { + return false + } + } else if this.MemTotalMemswBytes != nil { + return false + } else if that1.MemTotalMemswBytes != nil { + return false + } + if this.MemLimitBytes != nil && that1.MemLimitBytes != nil { + if *this.MemLimitBytes != *that1.MemLimitBytes { + return false + } + } else if this.MemLimitBytes != nil { + return false + } else if that1.MemLimitBytes != nil { + return false + } + if this.MemSoftLimitBytes != nil && that1.MemSoftLimitBytes != nil { + if *this.MemSoftLimitBytes != *that1.MemSoftLimitBytes { + return false + } + } else if this.MemSoftLimitBytes != nil { + return false + } else if that1.MemSoftLimitBytes != nil { + return false + } + if this.MemFileBytes != nil && that1.MemFileBytes != nil { + if *this.MemFileBytes != *that1.MemFileBytes { + return false + } + } else if this.MemFileBytes != nil { + return false + } else if that1.MemFileBytes != nil { + return false + } + if this.MemAnonBytes != nil && that1.MemAnonBytes != nil { + if *this.MemAnonBytes != *that1.MemAnonBytes { + return false + } + } else if this.MemAnonBytes != nil { + return false + } else if that1.MemAnonBytes != nil { + return false + } + if this.MemCacheBytes != nil && that1.MemCacheBytes != nil { + if *this.MemCacheBytes != *that1.MemCacheBytes { + return false + } + } else if this.MemCacheBytes != nil { + return false + } else if that1.MemCacheBytes != nil { + return false + } + if this.MemRSSBytes != nil && that1.MemRSSBytes != nil { + if *this.MemRSSBytes != *that1.MemRSSBytes { + return false + } + } else if this.MemRSSBytes != nil { + return false + } else if that1.MemRSSBytes != nil { + return false + } + if this.MemMappedFileBytes != nil && that1.MemMappedFileBytes != nil { + if *this.MemMappedFileBytes != *that1.MemMappedFileBytes { + return false + } + } else if this.MemMappedFileBytes != nil { + return false + } else if that1.MemMappedFileBytes != nil { + return false + } + if this.MemSwapBytes != nil && that1.MemSwapBytes != nil { + if *this.MemSwapBytes != *that1.MemSwapBytes { + return false + } + } else if this.MemSwapBytes != nil { + return false + } else if that1.MemSwapBytes != nil { + return false + } + if this.MemUnevictableBytes != nil && that1.MemUnevictableBytes != nil { + if *this.MemUnevictableBytes != *that1.MemUnevictableBytes { + return false + } + } else if this.MemUnevictableBytes != nil { + return false + } else if that1.MemUnevictableBytes != nil { + return false + } + if this.MemLowPressureCounter != nil && that1.MemLowPressureCounter != nil { + if *this.MemLowPressureCounter != *that1.MemLowPressureCounter { + return false + } + } else if this.MemLowPressureCounter != nil { + return false + } else if that1.MemLowPressureCounter != nil { + return false + } + if this.MemMediumPressureCounter != nil && that1.MemMediumPressureCounter != nil { + if *this.MemMediumPressureCounter != *that1.MemMediumPressureCounter { + return false + } + } else if this.MemMediumPressureCounter != nil { + return false + } else if that1.MemMediumPressureCounter != nil { + return false + } + if this.MemCriticalPressureCounter != nil && that1.MemCriticalPressureCounter != nil { + if *this.MemCriticalPressureCounter != *that1.MemCriticalPressureCounter { + return false + } + } else if this.MemCriticalPressureCounter != nil { + return false + } else if that1.MemCriticalPressureCounter != nil { + return false + } + if this.DiskLimitBytes != nil && that1.DiskLimitBytes != nil { + if *this.DiskLimitBytes != *that1.DiskLimitBytes { + return false + } + } else if this.DiskLimitBytes != nil { + return false + } else if that1.DiskLimitBytes != nil { + return false + } + if this.DiskUsedBytes != nil && that1.DiskUsedBytes != nil { + if *this.DiskUsedBytes != *that1.DiskUsedBytes { + return false + } + } else if this.DiskUsedBytes != nil { + return false + } else if that1.DiskUsedBytes != nil { + return false + } + if len(this.DiskStatistics) != len(that1.DiskStatistics) { + return false + } + for i := range this.DiskStatistics { + if !this.DiskStatistics[i].Equal(&that1.DiskStatistics[i]) { + return false + } + } + if !this.BlkioStatistics.Equal(that1.BlkioStatistics) { + return false + } + if !this.Perf.Equal(that1.Perf) { + return false + } + if this.NetRxPackets != nil && that1.NetRxPackets != nil { + if *this.NetRxPackets != *that1.NetRxPackets { + return false + } + } else if this.NetRxPackets != nil { + return false + } else if that1.NetRxPackets != nil { + return false + } + if this.NetRxBytes != nil && that1.NetRxBytes != nil { + if *this.NetRxBytes != *that1.NetRxBytes { + return false + } + } else if this.NetRxBytes != nil { + return false + } else if that1.NetRxBytes != nil { + return false + } + if this.NetRxErrors != nil && that1.NetRxErrors != nil { + if *this.NetRxErrors != *that1.NetRxErrors { + return false + } + } else if this.NetRxErrors != nil { + return false + } else if that1.NetRxErrors != nil { + return false + } + if this.NetRxDropped != nil && that1.NetRxDropped != nil { + if *this.NetRxDropped != *that1.NetRxDropped { + return false + } + } else if this.NetRxDropped != nil { + return false + } else if that1.NetRxDropped != nil { + return false + } + if this.NetTxPackets != nil && that1.NetTxPackets != nil { + if *this.NetTxPackets != *that1.NetTxPackets { + return false + } + } else if this.NetTxPackets != nil { + return false + } else if that1.NetTxPackets != nil { + return false + } + if this.NetTxBytes != nil && that1.NetTxBytes != nil { + if *this.NetTxBytes != *that1.NetTxBytes { + return false + } + } else if this.NetTxBytes != nil { + return false + } else if that1.NetTxBytes != nil { + return false + } + if this.NetTxErrors != nil && that1.NetTxErrors != nil { + if *this.NetTxErrors != *that1.NetTxErrors { + return false + } + } else if this.NetTxErrors != nil { + return false + } else if that1.NetTxErrors != nil { + return false + } + if this.NetTxDropped != nil && that1.NetTxDropped != nil { + if *this.NetTxDropped != *that1.NetTxDropped { + return false + } + } else if this.NetTxDropped != nil { + return false + } else if that1.NetTxDropped != nil { + return false + } + if this.NetTCPRttMicrosecsP50 != nil && that1.NetTCPRttMicrosecsP50 != nil { + if *this.NetTCPRttMicrosecsP50 != *that1.NetTCPRttMicrosecsP50 { + return false + } + } else if this.NetTCPRttMicrosecsP50 != nil { + return false + } else if that1.NetTCPRttMicrosecsP50 != nil { + return false + } + if this.NetTCPRttMicrosecsP90 != nil && that1.NetTCPRttMicrosecsP90 != nil { + if *this.NetTCPRttMicrosecsP90 != *that1.NetTCPRttMicrosecsP90 { + return false + } + } else if this.NetTCPRttMicrosecsP90 != nil { + return false + } else if that1.NetTCPRttMicrosecsP90 != nil { + return false + } + if this.NetTCPRttMicrosecsP95 != nil && that1.NetTCPRttMicrosecsP95 != nil { + if *this.NetTCPRttMicrosecsP95 != *that1.NetTCPRttMicrosecsP95 { + return false + } + } else if this.NetTCPRttMicrosecsP95 != nil { + return false + } else if that1.NetTCPRttMicrosecsP95 != nil { + return false + } + if this.NetTCPRttMicrosecsP99 != nil && that1.NetTCPRttMicrosecsP99 != nil { + if *this.NetTCPRttMicrosecsP99 != *that1.NetTCPRttMicrosecsP99 { + return false + } + } else if this.NetTCPRttMicrosecsP99 != nil { + return false + } else if that1.NetTCPRttMicrosecsP99 != nil { + return false + } + if this.NetTCPActiveConnections != nil && that1.NetTCPActiveConnections != nil { + if *this.NetTCPActiveConnections != *that1.NetTCPActiveConnections { + return false + } + } else if this.NetTCPActiveConnections != nil { + return false + } else if that1.NetTCPActiveConnections != nil { + return false + } + if this.NetTCPTimeWaitConnections != nil && that1.NetTCPTimeWaitConnections != nil { + if *this.NetTCPTimeWaitConnections != *that1.NetTCPTimeWaitConnections { + return false + } + } else if this.NetTCPTimeWaitConnections != nil { + return false + } else if that1.NetTCPTimeWaitConnections != nil { + return false + } + if len(this.NetTrafficControlStatistics) != len(that1.NetTrafficControlStatistics) { + return false + } + for i := range this.NetTrafficControlStatistics { + if !this.NetTrafficControlStatistics[i].Equal(&that1.NetTrafficControlStatistics[i]) { + return false + } + } + if !this.NetSNMPStatistics.Equal(that1.NetSNMPStatistics) { + return false + } + return true +} +func (this *ResourceUsage) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ResourceUsage) + if !ok { + that2, ok := that.(ResourceUsage) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ResourceUsage") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ResourceUsage but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ResourceUsage but is not nil && this == nil") + } + if len(this.Executors) != len(that1.Executors) { + return fmt.Errorf("Executors this(%v) Not Equal that(%v)", len(this.Executors), len(that1.Executors)) + } + for i := range this.Executors { + if !this.Executors[i].Equal(&that1.Executors[i]) { + return fmt.Errorf("Executors this[%v](%v) Not Equal that[%v](%v)", i, this.Executors[i], i, that1.Executors[i]) + } + } + if len(this.Total) != len(that1.Total) { + return fmt.Errorf("Total this(%v) Not Equal that(%v)", len(this.Total), len(that1.Total)) + } + for i := range this.Total { + if !this.Total[i].Equal(&that1.Total[i]) { + return fmt.Errorf("Total this[%v](%v) Not Equal that[%v](%v)", i, this.Total[i], i, that1.Total[i]) + } + } + return nil +} +func (this *ResourceUsage) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ResourceUsage) + if !ok { + that2, ok := that.(ResourceUsage) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Executors) != len(that1.Executors) { + return false + } + for i := range this.Executors { + if !this.Executors[i].Equal(&that1.Executors[i]) { + return false + } + } + if len(this.Total) != len(that1.Total) { + return false + } + for i := range this.Total { + if !this.Total[i].Equal(&that1.Total[i]) { + return false + } + } + return true +} +func (this *ResourceUsage_Executor) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ResourceUsage_Executor) + if !ok { + that2, ok := that.(ResourceUsage_Executor) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ResourceUsage_Executor") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ResourceUsage_Executor but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ResourceUsage_Executor but is not nil && this == nil") + } + if !this.ExecutorInfo.Equal(&that1.ExecutorInfo) { + return fmt.Errorf("ExecutorInfo this(%v) Not Equal that(%v)", this.ExecutorInfo, that1.ExecutorInfo) + } + if len(this.Allocated) != len(that1.Allocated) { + return fmt.Errorf("Allocated this(%v) Not Equal that(%v)", len(this.Allocated), len(that1.Allocated)) + } + for i := range this.Allocated { + if !this.Allocated[i].Equal(&that1.Allocated[i]) { + return fmt.Errorf("Allocated this[%v](%v) Not Equal that[%v](%v)", i, this.Allocated[i], i, that1.Allocated[i]) + } + } + if !this.Statistics.Equal(that1.Statistics) { + return fmt.Errorf("Statistics this(%v) Not Equal that(%v)", this.Statistics, that1.Statistics) + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if len(this.Tasks) != len(that1.Tasks) { + return fmt.Errorf("Tasks this(%v) Not Equal that(%v)", len(this.Tasks), len(that1.Tasks)) + } + for i := range this.Tasks { + if !this.Tasks[i].Equal(&that1.Tasks[i]) { + return fmt.Errorf("Tasks this[%v](%v) Not Equal that[%v](%v)", i, this.Tasks[i], i, that1.Tasks[i]) + } + } + return nil +} +func (this *ResourceUsage_Executor) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ResourceUsage_Executor) + if !ok { + that2, ok := that.(ResourceUsage_Executor) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ExecutorInfo.Equal(&that1.ExecutorInfo) { + return false + } + if len(this.Allocated) != len(that1.Allocated) { + return false + } + for i := range this.Allocated { + if !this.Allocated[i].Equal(&that1.Allocated[i]) { + return false + } + } + if !this.Statistics.Equal(that1.Statistics) { + return false + } + if !this.ContainerID.Equal(&that1.ContainerID) { + return false + } + if len(this.Tasks) != len(that1.Tasks) { + return false + } + for i := range this.Tasks { + if !this.Tasks[i].Equal(&that1.Tasks[i]) { + return false + } + } + return true +} +func (this *ResourceUsage_Executor_Task) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ResourceUsage_Executor_Task) + if !ok { + that2, ok := that.(ResourceUsage_Executor_Task) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ResourceUsage_Executor_Task") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ResourceUsage_Executor_Task but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ResourceUsage_Executor_Task but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if !this.ID.Equal(&that1.ID) { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + return nil +} +func (this *ResourceUsage_Executor_Task) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ResourceUsage_Executor_Task) + if !ok { + that2, ok := that.(ResourceUsage_Executor_Task) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if !this.ID.Equal(&that1.ID) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if !this.Labels.Equal(that1.Labels) { + return false + } + return true +} +func (this *PerfStatistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*PerfStatistics) + if !ok { + that2, ok := that.(PerfStatistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *PerfStatistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *PerfStatistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *PerfStatistics but is not nil && this == nil") + } + if this.Timestamp != that1.Timestamp { + return fmt.Errorf("Timestamp this(%v) Not Equal that(%v)", this.Timestamp, that1.Timestamp) + } + if this.Duration != that1.Duration { + return fmt.Errorf("Duration this(%v) Not Equal that(%v)", this.Duration, that1.Duration) + } + if this.Cycles != nil && that1.Cycles != nil { + if *this.Cycles != *that1.Cycles { + return fmt.Errorf("Cycles this(%v) Not Equal that(%v)", *this.Cycles, *that1.Cycles) + } + } else if this.Cycles != nil { + return fmt.Errorf("this.Cycles == nil && that.Cycles != nil") + } else if that1.Cycles != nil { + return fmt.Errorf("Cycles this(%v) Not Equal that(%v)", this.Cycles, that1.Cycles) + } + if this.StalledCyclesFrontend != nil && that1.StalledCyclesFrontend != nil { + if *this.StalledCyclesFrontend != *that1.StalledCyclesFrontend { + return fmt.Errorf("StalledCyclesFrontend this(%v) Not Equal that(%v)", *this.StalledCyclesFrontend, *that1.StalledCyclesFrontend) + } + } else if this.StalledCyclesFrontend != nil { + return fmt.Errorf("this.StalledCyclesFrontend == nil && that.StalledCyclesFrontend != nil") + } else if that1.StalledCyclesFrontend != nil { + return fmt.Errorf("StalledCyclesFrontend this(%v) Not Equal that(%v)", this.StalledCyclesFrontend, that1.StalledCyclesFrontend) + } + if this.StalledCyclesBackend != nil && that1.StalledCyclesBackend != nil { + if *this.StalledCyclesBackend != *that1.StalledCyclesBackend { + return fmt.Errorf("StalledCyclesBackend this(%v) Not Equal that(%v)", *this.StalledCyclesBackend, *that1.StalledCyclesBackend) + } + } else if this.StalledCyclesBackend != nil { + return fmt.Errorf("this.StalledCyclesBackend == nil && that.StalledCyclesBackend != nil") + } else if that1.StalledCyclesBackend != nil { + return fmt.Errorf("StalledCyclesBackend this(%v) Not Equal that(%v)", this.StalledCyclesBackend, that1.StalledCyclesBackend) + } + if this.Instructions != nil && that1.Instructions != nil { + if *this.Instructions != *that1.Instructions { + return fmt.Errorf("Instructions this(%v) Not Equal that(%v)", *this.Instructions, *that1.Instructions) + } + } else if this.Instructions != nil { + return fmt.Errorf("this.Instructions == nil && that.Instructions != nil") + } else if that1.Instructions != nil { + return fmt.Errorf("Instructions this(%v) Not Equal that(%v)", this.Instructions, that1.Instructions) + } + if this.CacheReferences != nil && that1.CacheReferences != nil { + if *this.CacheReferences != *that1.CacheReferences { + return fmt.Errorf("CacheReferences this(%v) Not Equal that(%v)", *this.CacheReferences, *that1.CacheReferences) + } + } else if this.CacheReferences != nil { + return fmt.Errorf("this.CacheReferences == nil && that.CacheReferences != nil") + } else if that1.CacheReferences != nil { + return fmt.Errorf("CacheReferences this(%v) Not Equal that(%v)", this.CacheReferences, that1.CacheReferences) + } + if this.CacheMisses != nil && that1.CacheMisses != nil { + if *this.CacheMisses != *that1.CacheMisses { + return fmt.Errorf("CacheMisses this(%v) Not Equal that(%v)", *this.CacheMisses, *that1.CacheMisses) + } + } else if this.CacheMisses != nil { + return fmt.Errorf("this.CacheMisses == nil && that.CacheMisses != nil") + } else if that1.CacheMisses != nil { + return fmt.Errorf("CacheMisses this(%v) Not Equal that(%v)", this.CacheMisses, that1.CacheMisses) + } + if this.Branches != nil && that1.Branches != nil { + if *this.Branches != *that1.Branches { + return fmt.Errorf("Branches this(%v) Not Equal that(%v)", *this.Branches, *that1.Branches) + } + } else if this.Branches != nil { + return fmt.Errorf("this.Branches == nil && that.Branches != nil") + } else if that1.Branches != nil { + return fmt.Errorf("Branches this(%v) Not Equal that(%v)", this.Branches, that1.Branches) + } + if this.BranchMisses != nil && that1.BranchMisses != nil { + if *this.BranchMisses != *that1.BranchMisses { + return fmt.Errorf("BranchMisses this(%v) Not Equal that(%v)", *this.BranchMisses, *that1.BranchMisses) + } + } else if this.BranchMisses != nil { + return fmt.Errorf("this.BranchMisses == nil && that.BranchMisses != nil") + } else if that1.BranchMisses != nil { + return fmt.Errorf("BranchMisses this(%v) Not Equal that(%v)", this.BranchMisses, that1.BranchMisses) + } + if this.BusCycles != nil && that1.BusCycles != nil { + if *this.BusCycles != *that1.BusCycles { + return fmt.Errorf("BusCycles this(%v) Not Equal that(%v)", *this.BusCycles, *that1.BusCycles) + } + } else if this.BusCycles != nil { + return fmt.Errorf("this.BusCycles == nil && that.BusCycles != nil") + } else if that1.BusCycles != nil { + return fmt.Errorf("BusCycles this(%v) Not Equal that(%v)", this.BusCycles, that1.BusCycles) + } + if this.RefCycles != nil && that1.RefCycles != nil { + if *this.RefCycles != *that1.RefCycles { + return fmt.Errorf("RefCycles this(%v) Not Equal that(%v)", *this.RefCycles, *that1.RefCycles) + } + } else if this.RefCycles != nil { + return fmt.Errorf("this.RefCycles == nil && that.RefCycles != nil") + } else if that1.RefCycles != nil { + return fmt.Errorf("RefCycles this(%v) Not Equal that(%v)", this.RefCycles, that1.RefCycles) + } + if this.CPUClock != nil && that1.CPUClock != nil { + if *this.CPUClock != *that1.CPUClock { + return fmt.Errorf("CPUClock this(%v) Not Equal that(%v)", *this.CPUClock, *that1.CPUClock) + } + } else if this.CPUClock != nil { + return fmt.Errorf("this.CPUClock == nil && that.CPUClock != nil") + } else if that1.CPUClock != nil { + return fmt.Errorf("CPUClock this(%v) Not Equal that(%v)", this.CPUClock, that1.CPUClock) + } + if this.TaskClock != nil && that1.TaskClock != nil { + if *this.TaskClock != *that1.TaskClock { + return fmt.Errorf("TaskClock this(%v) Not Equal that(%v)", *this.TaskClock, *that1.TaskClock) + } + } else if this.TaskClock != nil { + return fmt.Errorf("this.TaskClock == nil && that.TaskClock != nil") + } else if that1.TaskClock != nil { + return fmt.Errorf("TaskClock this(%v) Not Equal that(%v)", this.TaskClock, that1.TaskClock) + } + if this.PageFaults != nil && that1.PageFaults != nil { + if *this.PageFaults != *that1.PageFaults { + return fmt.Errorf("PageFaults this(%v) Not Equal that(%v)", *this.PageFaults, *that1.PageFaults) + } + } else if this.PageFaults != nil { + return fmt.Errorf("this.PageFaults == nil && that.PageFaults != nil") + } else if that1.PageFaults != nil { + return fmt.Errorf("PageFaults this(%v) Not Equal that(%v)", this.PageFaults, that1.PageFaults) + } + if this.MinorFaults != nil && that1.MinorFaults != nil { + if *this.MinorFaults != *that1.MinorFaults { + return fmt.Errorf("MinorFaults this(%v) Not Equal that(%v)", *this.MinorFaults, *that1.MinorFaults) + } + } else if this.MinorFaults != nil { + return fmt.Errorf("this.MinorFaults == nil && that.MinorFaults != nil") + } else if that1.MinorFaults != nil { + return fmt.Errorf("MinorFaults this(%v) Not Equal that(%v)", this.MinorFaults, that1.MinorFaults) + } + if this.MajorFaults != nil && that1.MajorFaults != nil { + if *this.MajorFaults != *that1.MajorFaults { + return fmt.Errorf("MajorFaults this(%v) Not Equal that(%v)", *this.MajorFaults, *that1.MajorFaults) + } + } else if this.MajorFaults != nil { + return fmt.Errorf("this.MajorFaults == nil && that.MajorFaults != nil") + } else if that1.MajorFaults != nil { + return fmt.Errorf("MajorFaults this(%v) Not Equal that(%v)", this.MajorFaults, that1.MajorFaults) + } + if this.ContextSwitches != nil && that1.ContextSwitches != nil { + if *this.ContextSwitches != *that1.ContextSwitches { + return fmt.Errorf("ContextSwitches this(%v) Not Equal that(%v)", *this.ContextSwitches, *that1.ContextSwitches) + } + } else if this.ContextSwitches != nil { + return fmt.Errorf("this.ContextSwitches == nil && that.ContextSwitches != nil") + } else if that1.ContextSwitches != nil { + return fmt.Errorf("ContextSwitches this(%v) Not Equal that(%v)", this.ContextSwitches, that1.ContextSwitches) + } + if this.CPUMigrations != nil && that1.CPUMigrations != nil { + if *this.CPUMigrations != *that1.CPUMigrations { + return fmt.Errorf("CPUMigrations this(%v) Not Equal that(%v)", *this.CPUMigrations, *that1.CPUMigrations) + } + } else if this.CPUMigrations != nil { + return fmt.Errorf("this.CPUMigrations == nil && that.CPUMigrations != nil") + } else if that1.CPUMigrations != nil { + return fmt.Errorf("CPUMigrations this(%v) Not Equal that(%v)", this.CPUMigrations, that1.CPUMigrations) + } + if this.AlignmentFaults != nil && that1.AlignmentFaults != nil { + if *this.AlignmentFaults != *that1.AlignmentFaults { + return fmt.Errorf("AlignmentFaults this(%v) Not Equal that(%v)", *this.AlignmentFaults, *that1.AlignmentFaults) + } + } else if this.AlignmentFaults != nil { + return fmt.Errorf("this.AlignmentFaults == nil && that.AlignmentFaults != nil") + } else if that1.AlignmentFaults != nil { + return fmt.Errorf("AlignmentFaults this(%v) Not Equal that(%v)", this.AlignmentFaults, that1.AlignmentFaults) + } + if this.EmulationFaults != nil && that1.EmulationFaults != nil { + if *this.EmulationFaults != *that1.EmulationFaults { + return fmt.Errorf("EmulationFaults this(%v) Not Equal that(%v)", *this.EmulationFaults, *that1.EmulationFaults) + } + } else if this.EmulationFaults != nil { + return fmt.Errorf("this.EmulationFaults == nil && that.EmulationFaults != nil") + } else if that1.EmulationFaults != nil { + return fmt.Errorf("EmulationFaults this(%v) Not Equal that(%v)", this.EmulationFaults, that1.EmulationFaults) + } + if this.L1DcacheLoads != nil && that1.L1DcacheLoads != nil { + if *this.L1DcacheLoads != *that1.L1DcacheLoads { + return fmt.Errorf("L1DcacheLoads this(%v) Not Equal that(%v)", *this.L1DcacheLoads, *that1.L1DcacheLoads) + } + } else if this.L1DcacheLoads != nil { + return fmt.Errorf("this.L1DcacheLoads == nil && that.L1DcacheLoads != nil") + } else if that1.L1DcacheLoads != nil { + return fmt.Errorf("L1DcacheLoads this(%v) Not Equal that(%v)", this.L1DcacheLoads, that1.L1DcacheLoads) + } + if this.L1DcacheLoadMisses != nil && that1.L1DcacheLoadMisses != nil { + if *this.L1DcacheLoadMisses != *that1.L1DcacheLoadMisses { + return fmt.Errorf("L1DcacheLoadMisses this(%v) Not Equal that(%v)", *this.L1DcacheLoadMisses, *that1.L1DcacheLoadMisses) + } + } else if this.L1DcacheLoadMisses != nil { + return fmt.Errorf("this.L1DcacheLoadMisses == nil && that.L1DcacheLoadMisses != nil") + } else if that1.L1DcacheLoadMisses != nil { + return fmt.Errorf("L1DcacheLoadMisses this(%v) Not Equal that(%v)", this.L1DcacheLoadMisses, that1.L1DcacheLoadMisses) + } + if this.L1DcacheStores != nil && that1.L1DcacheStores != nil { + if *this.L1DcacheStores != *that1.L1DcacheStores { + return fmt.Errorf("L1DcacheStores this(%v) Not Equal that(%v)", *this.L1DcacheStores, *that1.L1DcacheStores) + } + } else if this.L1DcacheStores != nil { + return fmt.Errorf("this.L1DcacheStores == nil && that.L1DcacheStores != nil") + } else if that1.L1DcacheStores != nil { + return fmt.Errorf("L1DcacheStores this(%v) Not Equal that(%v)", this.L1DcacheStores, that1.L1DcacheStores) + } + if this.L1DcacheStoreMisses != nil && that1.L1DcacheStoreMisses != nil { + if *this.L1DcacheStoreMisses != *that1.L1DcacheStoreMisses { + return fmt.Errorf("L1DcacheStoreMisses this(%v) Not Equal that(%v)", *this.L1DcacheStoreMisses, *that1.L1DcacheStoreMisses) + } + } else if this.L1DcacheStoreMisses != nil { + return fmt.Errorf("this.L1DcacheStoreMisses == nil && that.L1DcacheStoreMisses != nil") + } else if that1.L1DcacheStoreMisses != nil { + return fmt.Errorf("L1DcacheStoreMisses this(%v) Not Equal that(%v)", this.L1DcacheStoreMisses, that1.L1DcacheStoreMisses) + } + if this.L1DcachePrefetches != nil && that1.L1DcachePrefetches != nil { + if *this.L1DcachePrefetches != *that1.L1DcachePrefetches { + return fmt.Errorf("L1DcachePrefetches this(%v) Not Equal that(%v)", *this.L1DcachePrefetches, *that1.L1DcachePrefetches) + } + } else if this.L1DcachePrefetches != nil { + return fmt.Errorf("this.L1DcachePrefetches == nil && that.L1DcachePrefetches != nil") + } else if that1.L1DcachePrefetches != nil { + return fmt.Errorf("L1DcachePrefetches this(%v) Not Equal that(%v)", this.L1DcachePrefetches, that1.L1DcachePrefetches) + } + if this.L1DcachePrefetchMisses != nil && that1.L1DcachePrefetchMisses != nil { + if *this.L1DcachePrefetchMisses != *that1.L1DcachePrefetchMisses { + return fmt.Errorf("L1DcachePrefetchMisses this(%v) Not Equal that(%v)", *this.L1DcachePrefetchMisses, *that1.L1DcachePrefetchMisses) + } + } else if this.L1DcachePrefetchMisses != nil { + return fmt.Errorf("this.L1DcachePrefetchMisses == nil && that.L1DcachePrefetchMisses != nil") + } else if that1.L1DcachePrefetchMisses != nil { + return fmt.Errorf("L1DcachePrefetchMisses this(%v) Not Equal that(%v)", this.L1DcachePrefetchMisses, that1.L1DcachePrefetchMisses) + } + if this.L1IcacheLoads != nil && that1.L1IcacheLoads != nil { + if *this.L1IcacheLoads != *that1.L1IcacheLoads { + return fmt.Errorf("L1IcacheLoads this(%v) Not Equal that(%v)", *this.L1IcacheLoads, *that1.L1IcacheLoads) + } + } else if this.L1IcacheLoads != nil { + return fmt.Errorf("this.L1IcacheLoads == nil && that.L1IcacheLoads != nil") + } else if that1.L1IcacheLoads != nil { + return fmt.Errorf("L1IcacheLoads this(%v) Not Equal that(%v)", this.L1IcacheLoads, that1.L1IcacheLoads) + } + if this.L1IcacheLoadMisses != nil && that1.L1IcacheLoadMisses != nil { + if *this.L1IcacheLoadMisses != *that1.L1IcacheLoadMisses { + return fmt.Errorf("L1IcacheLoadMisses this(%v) Not Equal that(%v)", *this.L1IcacheLoadMisses, *that1.L1IcacheLoadMisses) + } + } else if this.L1IcacheLoadMisses != nil { + return fmt.Errorf("this.L1IcacheLoadMisses == nil && that.L1IcacheLoadMisses != nil") + } else if that1.L1IcacheLoadMisses != nil { + return fmt.Errorf("L1IcacheLoadMisses this(%v) Not Equal that(%v)", this.L1IcacheLoadMisses, that1.L1IcacheLoadMisses) + } + if this.L1IcachePrefetches != nil && that1.L1IcachePrefetches != nil { + if *this.L1IcachePrefetches != *that1.L1IcachePrefetches { + return fmt.Errorf("L1IcachePrefetches this(%v) Not Equal that(%v)", *this.L1IcachePrefetches, *that1.L1IcachePrefetches) + } + } else if this.L1IcachePrefetches != nil { + return fmt.Errorf("this.L1IcachePrefetches == nil && that.L1IcachePrefetches != nil") + } else if that1.L1IcachePrefetches != nil { + return fmt.Errorf("L1IcachePrefetches this(%v) Not Equal that(%v)", this.L1IcachePrefetches, that1.L1IcachePrefetches) + } + if this.L1IcachePrefetchMisses != nil && that1.L1IcachePrefetchMisses != nil { + if *this.L1IcachePrefetchMisses != *that1.L1IcachePrefetchMisses { + return fmt.Errorf("L1IcachePrefetchMisses this(%v) Not Equal that(%v)", *this.L1IcachePrefetchMisses, *that1.L1IcachePrefetchMisses) + } + } else if this.L1IcachePrefetchMisses != nil { + return fmt.Errorf("this.L1IcachePrefetchMisses == nil && that.L1IcachePrefetchMisses != nil") + } else if that1.L1IcachePrefetchMisses != nil { + return fmt.Errorf("L1IcachePrefetchMisses this(%v) Not Equal that(%v)", this.L1IcachePrefetchMisses, that1.L1IcachePrefetchMisses) + } + if this.LLCLoads != nil && that1.LLCLoads != nil { + if *this.LLCLoads != *that1.LLCLoads { + return fmt.Errorf("LLCLoads this(%v) Not Equal that(%v)", *this.LLCLoads, *that1.LLCLoads) + } + } else if this.LLCLoads != nil { + return fmt.Errorf("this.LLCLoads == nil && that.LLCLoads != nil") + } else if that1.LLCLoads != nil { + return fmt.Errorf("LLCLoads this(%v) Not Equal that(%v)", this.LLCLoads, that1.LLCLoads) + } + if this.LLCLoadMisses != nil && that1.LLCLoadMisses != nil { + if *this.LLCLoadMisses != *that1.LLCLoadMisses { + return fmt.Errorf("LLCLoadMisses this(%v) Not Equal that(%v)", *this.LLCLoadMisses, *that1.LLCLoadMisses) + } + } else if this.LLCLoadMisses != nil { + return fmt.Errorf("this.LLCLoadMisses == nil && that.LLCLoadMisses != nil") + } else if that1.LLCLoadMisses != nil { + return fmt.Errorf("LLCLoadMisses this(%v) Not Equal that(%v)", this.LLCLoadMisses, that1.LLCLoadMisses) + } + if this.LLCStores != nil && that1.LLCStores != nil { + if *this.LLCStores != *that1.LLCStores { + return fmt.Errorf("LLCStores this(%v) Not Equal that(%v)", *this.LLCStores, *that1.LLCStores) + } + } else if this.LLCStores != nil { + return fmt.Errorf("this.LLCStores == nil && that.LLCStores != nil") + } else if that1.LLCStores != nil { + return fmt.Errorf("LLCStores this(%v) Not Equal that(%v)", this.LLCStores, that1.LLCStores) + } + if this.LLCStoreMisses != nil && that1.LLCStoreMisses != nil { + if *this.LLCStoreMisses != *that1.LLCStoreMisses { + return fmt.Errorf("LLCStoreMisses this(%v) Not Equal that(%v)", *this.LLCStoreMisses, *that1.LLCStoreMisses) + } + } else if this.LLCStoreMisses != nil { + return fmt.Errorf("this.LLCStoreMisses == nil && that.LLCStoreMisses != nil") + } else if that1.LLCStoreMisses != nil { + return fmt.Errorf("LLCStoreMisses this(%v) Not Equal that(%v)", this.LLCStoreMisses, that1.LLCStoreMisses) + } + if this.LLCPrefetches != nil && that1.LLCPrefetches != nil { + if *this.LLCPrefetches != *that1.LLCPrefetches { + return fmt.Errorf("LLCPrefetches this(%v) Not Equal that(%v)", *this.LLCPrefetches, *that1.LLCPrefetches) + } + } else if this.LLCPrefetches != nil { + return fmt.Errorf("this.LLCPrefetches == nil && that.LLCPrefetches != nil") + } else if that1.LLCPrefetches != nil { + return fmt.Errorf("LLCPrefetches this(%v) Not Equal that(%v)", this.LLCPrefetches, that1.LLCPrefetches) + } + if this.LLCPrefetchMisses != nil && that1.LLCPrefetchMisses != nil { + if *this.LLCPrefetchMisses != *that1.LLCPrefetchMisses { + return fmt.Errorf("LLCPrefetchMisses this(%v) Not Equal that(%v)", *this.LLCPrefetchMisses, *that1.LLCPrefetchMisses) + } + } else if this.LLCPrefetchMisses != nil { + return fmt.Errorf("this.LLCPrefetchMisses == nil && that.LLCPrefetchMisses != nil") + } else if that1.LLCPrefetchMisses != nil { + return fmt.Errorf("LLCPrefetchMisses this(%v) Not Equal that(%v)", this.LLCPrefetchMisses, that1.LLCPrefetchMisses) + } + if this.DTLBLoads != nil && that1.DTLBLoads != nil { + if *this.DTLBLoads != *that1.DTLBLoads { + return fmt.Errorf("DTLBLoads this(%v) Not Equal that(%v)", *this.DTLBLoads, *that1.DTLBLoads) + } + } else if this.DTLBLoads != nil { + return fmt.Errorf("this.DTLBLoads == nil && that.DTLBLoads != nil") + } else if that1.DTLBLoads != nil { + return fmt.Errorf("DTLBLoads this(%v) Not Equal that(%v)", this.DTLBLoads, that1.DTLBLoads) + } + if this.DTLBLoadMisses != nil && that1.DTLBLoadMisses != nil { + if *this.DTLBLoadMisses != *that1.DTLBLoadMisses { + return fmt.Errorf("DTLBLoadMisses this(%v) Not Equal that(%v)", *this.DTLBLoadMisses, *that1.DTLBLoadMisses) + } + } else if this.DTLBLoadMisses != nil { + return fmt.Errorf("this.DTLBLoadMisses == nil && that.DTLBLoadMisses != nil") + } else if that1.DTLBLoadMisses != nil { + return fmt.Errorf("DTLBLoadMisses this(%v) Not Equal that(%v)", this.DTLBLoadMisses, that1.DTLBLoadMisses) + } + if this.DTLBStores != nil && that1.DTLBStores != nil { + if *this.DTLBStores != *that1.DTLBStores { + return fmt.Errorf("DTLBStores this(%v) Not Equal that(%v)", *this.DTLBStores, *that1.DTLBStores) + } + } else if this.DTLBStores != nil { + return fmt.Errorf("this.DTLBStores == nil && that.DTLBStores != nil") + } else if that1.DTLBStores != nil { + return fmt.Errorf("DTLBStores this(%v) Not Equal that(%v)", this.DTLBStores, that1.DTLBStores) + } + if this.DTLBStoreMisses != nil && that1.DTLBStoreMisses != nil { + if *this.DTLBStoreMisses != *that1.DTLBStoreMisses { + return fmt.Errorf("DTLBStoreMisses this(%v) Not Equal that(%v)", *this.DTLBStoreMisses, *that1.DTLBStoreMisses) + } + } else if this.DTLBStoreMisses != nil { + return fmt.Errorf("this.DTLBStoreMisses == nil && that.DTLBStoreMisses != nil") + } else if that1.DTLBStoreMisses != nil { + return fmt.Errorf("DTLBStoreMisses this(%v) Not Equal that(%v)", this.DTLBStoreMisses, that1.DTLBStoreMisses) + } + if this.DTLBPrefetches != nil && that1.DTLBPrefetches != nil { + if *this.DTLBPrefetches != *that1.DTLBPrefetches { + return fmt.Errorf("DTLBPrefetches this(%v) Not Equal that(%v)", *this.DTLBPrefetches, *that1.DTLBPrefetches) + } + } else if this.DTLBPrefetches != nil { + return fmt.Errorf("this.DTLBPrefetches == nil && that.DTLBPrefetches != nil") + } else if that1.DTLBPrefetches != nil { + return fmt.Errorf("DTLBPrefetches this(%v) Not Equal that(%v)", this.DTLBPrefetches, that1.DTLBPrefetches) + } + if this.DTLBPrefetchMisses != nil && that1.DTLBPrefetchMisses != nil { + if *this.DTLBPrefetchMisses != *that1.DTLBPrefetchMisses { + return fmt.Errorf("DTLBPrefetchMisses this(%v) Not Equal that(%v)", *this.DTLBPrefetchMisses, *that1.DTLBPrefetchMisses) + } + } else if this.DTLBPrefetchMisses != nil { + return fmt.Errorf("this.DTLBPrefetchMisses == nil && that.DTLBPrefetchMisses != nil") + } else if that1.DTLBPrefetchMisses != nil { + return fmt.Errorf("DTLBPrefetchMisses this(%v) Not Equal that(%v)", this.DTLBPrefetchMisses, that1.DTLBPrefetchMisses) + } + if this.ITLBLoads != nil && that1.ITLBLoads != nil { + if *this.ITLBLoads != *that1.ITLBLoads { + return fmt.Errorf("ITLBLoads this(%v) Not Equal that(%v)", *this.ITLBLoads, *that1.ITLBLoads) + } + } else if this.ITLBLoads != nil { + return fmt.Errorf("this.ITLBLoads == nil && that.ITLBLoads != nil") + } else if that1.ITLBLoads != nil { + return fmt.Errorf("ITLBLoads this(%v) Not Equal that(%v)", this.ITLBLoads, that1.ITLBLoads) + } + if this.ITLBLoadMisses != nil && that1.ITLBLoadMisses != nil { + if *this.ITLBLoadMisses != *that1.ITLBLoadMisses { + return fmt.Errorf("ITLBLoadMisses this(%v) Not Equal that(%v)", *this.ITLBLoadMisses, *that1.ITLBLoadMisses) + } + } else if this.ITLBLoadMisses != nil { + return fmt.Errorf("this.ITLBLoadMisses == nil && that.ITLBLoadMisses != nil") + } else if that1.ITLBLoadMisses != nil { + return fmt.Errorf("ITLBLoadMisses this(%v) Not Equal that(%v)", this.ITLBLoadMisses, that1.ITLBLoadMisses) + } + if this.BranchLoads != nil && that1.BranchLoads != nil { + if *this.BranchLoads != *that1.BranchLoads { + return fmt.Errorf("BranchLoads this(%v) Not Equal that(%v)", *this.BranchLoads, *that1.BranchLoads) + } + } else if this.BranchLoads != nil { + return fmt.Errorf("this.BranchLoads == nil && that.BranchLoads != nil") + } else if that1.BranchLoads != nil { + return fmt.Errorf("BranchLoads this(%v) Not Equal that(%v)", this.BranchLoads, that1.BranchLoads) + } + if this.BranchLoadMisses != nil && that1.BranchLoadMisses != nil { + if *this.BranchLoadMisses != *that1.BranchLoadMisses { + return fmt.Errorf("BranchLoadMisses this(%v) Not Equal that(%v)", *this.BranchLoadMisses, *that1.BranchLoadMisses) + } + } else if this.BranchLoadMisses != nil { + return fmt.Errorf("this.BranchLoadMisses == nil && that.BranchLoadMisses != nil") + } else if that1.BranchLoadMisses != nil { + return fmt.Errorf("BranchLoadMisses this(%v) Not Equal that(%v)", this.BranchLoadMisses, that1.BranchLoadMisses) + } + if this.NodeLoads != nil && that1.NodeLoads != nil { + if *this.NodeLoads != *that1.NodeLoads { + return fmt.Errorf("NodeLoads this(%v) Not Equal that(%v)", *this.NodeLoads, *that1.NodeLoads) + } + } else if this.NodeLoads != nil { + return fmt.Errorf("this.NodeLoads == nil && that.NodeLoads != nil") + } else if that1.NodeLoads != nil { + return fmt.Errorf("NodeLoads this(%v) Not Equal that(%v)", this.NodeLoads, that1.NodeLoads) + } + if this.NodeLoadMisses != nil && that1.NodeLoadMisses != nil { + if *this.NodeLoadMisses != *that1.NodeLoadMisses { + return fmt.Errorf("NodeLoadMisses this(%v) Not Equal that(%v)", *this.NodeLoadMisses, *that1.NodeLoadMisses) + } + } else if this.NodeLoadMisses != nil { + return fmt.Errorf("this.NodeLoadMisses == nil && that.NodeLoadMisses != nil") + } else if that1.NodeLoadMisses != nil { + return fmt.Errorf("NodeLoadMisses this(%v) Not Equal that(%v)", this.NodeLoadMisses, that1.NodeLoadMisses) + } + if this.NodeStores != nil && that1.NodeStores != nil { + if *this.NodeStores != *that1.NodeStores { + return fmt.Errorf("NodeStores this(%v) Not Equal that(%v)", *this.NodeStores, *that1.NodeStores) + } + } else if this.NodeStores != nil { + return fmt.Errorf("this.NodeStores == nil && that.NodeStores != nil") + } else if that1.NodeStores != nil { + return fmt.Errorf("NodeStores this(%v) Not Equal that(%v)", this.NodeStores, that1.NodeStores) + } + if this.NodeStoreMisses != nil && that1.NodeStoreMisses != nil { + if *this.NodeStoreMisses != *that1.NodeStoreMisses { + return fmt.Errorf("NodeStoreMisses this(%v) Not Equal that(%v)", *this.NodeStoreMisses, *that1.NodeStoreMisses) + } + } else if this.NodeStoreMisses != nil { + return fmt.Errorf("this.NodeStoreMisses == nil && that.NodeStoreMisses != nil") + } else if that1.NodeStoreMisses != nil { + return fmt.Errorf("NodeStoreMisses this(%v) Not Equal that(%v)", this.NodeStoreMisses, that1.NodeStoreMisses) + } + if this.NodePrefetches != nil && that1.NodePrefetches != nil { + if *this.NodePrefetches != *that1.NodePrefetches { + return fmt.Errorf("NodePrefetches this(%v) Not Equal that(%v)", *this.NodePrefetches, *that1.NodePrefetches) + } + } else if this.NodePrefetches != nil { + return fmt.Errorf("this.NodePrefetches == nil && that.NodePrefetches != nil") + } else if that1.NodePrefetches != nil { + return fmt.Errorf("NodePrefetches this(%v) Not Equal that(%v)", this.NodePrefetches, that1.NodePrefetches) + } + if this.NodePrefetchMisses != nil && that1.NodePrefetchMisses != nil { + if *this.NodePrefetchMisses != *that1.NodePrefetchMisses { + return fmt.Errorf("NodePrefetchMisses this(%v) Not Equal that(%v)", *this.NodePrefetchMisses, *that1.NodePrefetchMisses) + } + } else if this.NodePrefetchMisses != nil { + return fmt.Errorf("this.NodePrefetchMisses == nil && that.NodePrefetchMisses != nil") + } else if that1.NodePrefetchMisses != nil { + return fmt.Errorf("NodePrefetchMisses this(%v) Not Equal that(%v)", this.NodePrefetchMisses, that1.NodePrefetchMisses) + } + return nil +} +func (this *PerfStatistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*PerfStatistics) + if !ok { + that2, ok := that.(PerfStatistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Timestamp != that1.Timestamp { + return false + } + if this.Duration != that1.Duration { + return false + } + if this.Cycles != nil && that1.Cycles != nil { + if *this.Cycles != *that1.Cycles { + return false + } + } else if this.Cycles != nil { + return false + } else if that1.Cycles != nil { + return false + } + if this.StalledCyclesFrontend != nil && that1.StalledCyclesFrontend != nil { + if *this.StalledCyclesFrontend != *that1.StalledCyclesFrontend { + return false + } + } else if this.StalledCyclesFrontend != nil { + return false + } else if that1.StalledCyclesFrontend != nil { + return false + } + if this.StalledCyclesBackend != nil && that1.StalledCyclesBackend != nil { + if *this.StalledCyclesBackend != *that1.StalledCyclesBackend { + return false + } + } else if this.StalledCyclesBackend != nil { + return false + } else if that1.StalledCyclesBackend != nil { + return false + } + if this.Instructions != nil && that1.Instructions != nil { + if *this.Instructions != *that1.Instructions { + return false + } + } else if this.Instructions != nil { + return false + } else if that1.Instructions != nil { + return false + } + if this.CacheReferences != nil && that1.CacheReferences != nil { + if *this.CacheReferences != *that1.CacheReferences { + return false + } + } else if this.CacheReferences != nil { + return false + } else if that1.CacheReferences != nil { + return false + } + if this.CacheMisses != nil && that1.CacheMisses != nil { + if *this.CacheMisses != *that1.CacheMisses { + return false + } + } else if this.CacheMisses != nil { + return false + } else if that1.CacheMisses != nil { + return false + } + if this.Branches != nil && that1.Branches != nil { + if *this.Branches != *that1.Branches { + return false + } + } else if this.Branches != nil { + return false + } else if that1.Branches != nil { + return false + } + if this.BranchMisses != nil && that1.BranchMisses != nil { + if *this.BranchMisses != *that1.BranchMisses { + return false + } + } else if this.BranchMisses != nil { + return false + } else if that1.BranchMisses != nil { + return false + } + if this.BusCycles != nil && that1.BusCycles != nil { + if *this.BusCycles != *that1.BusCycles { + return false + } + } else if this.BusCycles != nil { + return false + } else if that1.BusCycles != nil { + return false + } + if this.RefCycles != nil && that1.RefCycles != nil { + if *this.RefCycles != *that1.RefCycles { + return false + } + } else if this.RefCycles != nil { + return false + } else if that1.RefCycles != nil { + return false + } + if this.CPUClock != nil && that1.CPUClock != nil { + if *this.CPUClock != *that1.CPUClock { + return false + } + } else if this.CPUClock != nil { + return false + } else if that1.CPUClock != nil { + return false + } + if this.TaskClock != nil && that1.TaskClock != nil { + if *this.TaskClock != *that1.TaskClock { + return false + } + } else if this.TaskClock != nil { + return false + } else if that1.TaskClock != nil { + return false + } + if this.PageFaults != nil && that1.PageFaults != nil { + if *this.PageFaults != *that1.PageFaults { + return false + } + } else if this.PageFaults != nil { + return false + } else if that1.PageFaults != nil { + return false + } + if this.MinorFaults != nil && that1.MinorFaults != nil { + if *this.MinorFaults != *that1.MinorFaults { + return false + } + } else if this.MinorFaults != nil { + return false + } else if that1.MinorFaults != nil { + return false + } + if this.MajorFaults != nil && that1.MajorFaults != nil { + if *this.MajorFaults != *that1.MajorFaults { + return false + } + } else if this.MajorFaults != nil { + return false + } else if that1.MajorFaults != nil { + return false + } + if this.ContextSwitches != nil && that1.ContextSwitches != nil { + if *this.ContextSwitches != *that1.ContextSwitches { + return false + } + } else if this.ContextSwitches != nil { + return false + } else if that1.ContextSwitches != nil { + return false + } + if this.CPUMigrations != nil && that1.CPUMigrations != nil { + if *this.CPUMigrations != *that1.CPUMigrations { + return false + } + } else if this.CPUMigrations != nil { + return false + } else if that1.CPUMigrations != nil { + return false + } + if this.AlignmentFaults != nil && that1.AlignmentFaults != nil { + if *this.AlignmentFaults != *that1.AlignmentFaults { + return false + } + } else if this.AlignmentFaults != nil { + return false + } else if that1.AlignmentFaults != nil { + return false + } + if this.EmulationFaults != nil && that1.EmulationFaults != nil { + if *this.EmulationFaults != *that1.EmulationFaults { + return false + } + } else if this.EmulationFaults != nil { + return false + } else if that1.EmulationFaults != nil { + return false + } + if this.L1DcacheLoads != nil && that1.L1DcacheLoads != nil { + if *this.L1DcacheLoads != *that1.L1DcacheLoads { + return false + } + } else if this.L1DcacheLoads != nil { + return false + } else if that1.L1DcacheLoads != nil { + return false + } + if this.L1DcacheLoadMisses != nil && that1.L1DcacheLoadMisses != nil { + if *this.L1DcacheLoadMisses != *that1.L1DcacheLoadMisses { + return false + } + } else if this.L1DcacheLoadMisses != nil { + return false + } else if that1.L1DcacheLoadMisses != nil { + return false + } + if this.L1DcacheStores != nil && that1.L1DcacheStores != nil { + if *this.L1DcacheStores != *that1.L1DcacheStores { + return false + } + } else if this.L1DcacheStores != nil { + return false + } else if that1.L1DcacheStores != nil { + return false + } + if this.L1DcacheStoreMisses != nil && that1.L1DcacheStoreMisses != nil { + if *this.L1DcacheStoreMisses != *that1.L1DcacheStoreMisses { + return false + } + } else if this.L1DcacheStoreMisses != nil { + return false + } else if that1.L1DcacheStoreMisses != nil { + return false + } + if this.L1DcachePrefetches != nil && that1.L1DcachePrefetches != nil { + if *this.L1DcachePrefetches != *that1.L1DcachePrefetches { + return false + } + } else if this.L1DcachePrefetches != nil { + return false + } else if that1.L1DcachePrefetches != nil { + return false + } + if this.L1DcachePrefetchMisses != nil && that1.L1DcachePrefetchMisses != nil { + if *this.L1DcachePrefetchMisses != *that1.L1DcachePrefetchMisses { + return false + } + } else if this.L1DcachePrefetchMisses != nil { + return false + } else if that1.L1DcachePrefetchMisses != nil { + return false + } + if this.L1IcacheLoads != nil && that1.L1IcacheLoads != nil { + if *this.L1IcacheLoads != *that1.L1IcacheLoads { + return false + } + } else if this.L1IcacheLoads != nil { + return false + } else if that1.L1IcacheLoads != nil { + return false + } + if this.L1IcacheLoadMisses != nil && that1.L1IcacheLoadMisses != nil { + if *this.L1IcacheLoadMisses != *that1.L1IcacheLoadMisses { + return false + } + } else if this.L1IcacheLoadMisses != nil { + return false + } else if that1.L1IcacheLoadMisses != nil { + return false + } + if this.L1IcachePrefetches != nil && that1.L1IcachePrefetches != nil { + if *this.L1IcachePrefetches != *that1.L1IcachePrefetches { + return false + } + } else if this.L1IcachePrefetches != nil { + return false + } else if that1.L1IcachePrefetches != nil { + return false + } + if this.L1IcachePrefetchMisses != nil && that1.L1IcachePrefetchMisses != nil { + if *this.L1IcachePrefetchMisses != *that1.L1IcachePrefetchMisses { + return false + } + } else if this.L1IcachePrefetchMisses != nil { + return false + } else if that1.L1IcachePrefetchMisses != nil { + return false + } + if this.LLCLoads != nil && that1.LLCLoads != nil { + if *this.LLCLoads != *that1.LLCLoads { + return false + } + } else if this.LLCLoads != nil { + return false + } else if that1.LLCLoads != nil { + return false + } + if this.LLCLoadMisses != nil && that1.LLCLoadMisses != nil { + if *this.LLCLoadMisses != *that1.LLCLoadMisses { + return false + } + } else if this.LLCLoadMisses != nil { + return false + } else if that1.LLCLoadMisses != nil { + return false + } + if this.LLCStores != nil && that1.LLCStores != nil { + if *this.LLCStores != *that1.LLCStores { + return false + } + } else if this.LLCStores != nil { + return false + } else if that1.LLCStores != nil { + return false + } + if this.LLCStoreMisses != nil && that1.LLCStoreMisses != nil { + if *this.LLCStoreMisses != *that1.LLCStoreMisses { + return false + } + } else if this.LLCStoreMisses != nil { + return false + } else if that1.LLCStoreMisses != nil { + return false + } + if this.LLCPrefetches != nil && that1.LLCPrefetches != nil { + if *this.LLCPrefetches != *that1.LLCPrefetches { + return false + } + } else if this.LLCPrefetches != nil { + return false + } else if that1.LLCPrefetches != nil { + return false + } + if this.LLCPrefetchMisses != nil && that1.LLCPrefetchMisses != nil { + if *this.LLCPrefetchMisses != *that1.LLCPrefetchMisses { + return false + } + } else if this.LLCPrefetchMisses != nil { + return false + } else if that1.LLCPrefetchMisses != nil { + return false + } + if this.DTLBLoads != nil && that1.DTLBLoads != nil { + if *this.DTLBLoads != *that1.DTLBLoads { + return false + } + } else if this.DTLBLoads != nil { + return false + } else if that1.DTLBLoads != nil { + return false + } + if this.DTLBLoadMisses != nil && that1.DTLBLoadMisses != nil { + if *this.DTLBLoadMisses != *that1.DTLBLoadMisses { + return false + } + } else if this.DTLBLoadMisses != nil { + return false + } else if that1.DTLBLoadMisses != nil { + return false + } + if this.DTLBStores != nil && that1.DTLBStores != nil { + if *this.DTLBStores != *that1.DTLBStores { + return false + } + } else if this.DTLBStores != nil { + return false + } else if that1.DTLBStores != nil { + return false + } + if this.DTLBStoreMisses != nil && that1.DTLBStoreMisses != nil { + if *this.DTLBStoreMisses != *that1.DTLBStoreMisses { + return false + } + } else if this.DTLBStoreMisses != nil { + return false + } else if that1.DTLBStoreMisses != nil { + return false + } + if this.DTLBPrefetches != nil && that1.DTLBPrefetches != nil { + if *this.DTLBPrefetches != *that1.DTLBPrefetches { + return false + } + } else if this.DTLBPrefetches != nil { + return false + } else if that1.DTLBPrefetches != nil { + return false + } + if this.DTLBPrefetchMisses != nil && that1.DTLBPrefetchMisses != nil { + if *this.DTLBPrefetchMisses != *that1.DTLBPrefetchMisses { + return false + } + } else if this.DTLBPrefetchMisses != nil { + return false + } else if that1.DTLBPrefetchMisses != nil { + return false + } + if this.ITLBLoads != nil && that1.ITLBLoads != nil { + if *this.ITLBLoads != *that1.ITLBLoads { + return false + } + } else if this.ITLBLoads != nil { + return false + } else if that1.ITLBLoads != nil { + return false + } + if this.ITLBLoadMisses != nil && that1.ITLBLoadMisses != nil { + if *this.ITLBLoadMisses != *that1.ITLBLoadMisses { + return false + } + } else if this.ITLBLoadMisses != nil { + return false + } else if that1.ITLBLoadMisses != nil { + return false + } + if this.BranchLoads != nil && that1.BranchLoads != nil { + if *this.BranchLoads != *that1.BranchLoads { + return false + } + } else if this.BranchLoads != nil { + return false + } else if that1.BranchLoads != nil { + return false + } + if this.BranchLoadMisses != nil && that1.BranchLoadMisses != nil { + if *this.BranchLoadMisses != *that1.BranchLoadMisses { + return false + } + } else if this.BranchLoadMisses != nil { + return false + } else if that1.BranchLoadMisses != nil { + return false + } + if this.NodeLoads != nil && that1.NodeLoads != nil { + if *this.NodeLoads != *that1.NodeLoads { + return false + } + } else if this.NodeLoads != nil { + return false + } else if that1.NodeLoads != nil { + return false + } + if this.NodeLoadMisses != nil && that1.NodeLoadMisses != nil { + if *this.NodeLoadMisses != *that1.NodeLoadMisses { + return false + } + } else if this.NodeLoadMisses != nil { + return false + } else if that1.NodeLoadMisses != nil { + return false + } + if this.NodeStores != nil && that1.NodeStores != nil { + if *this.NodeStores != *that1.NodeStores { + return false + } + } else if this.NodeStores != nil { + return false + } else if that1.NodeStores != nil { + return false + } + if this.NodeStoreMisses != nil && that1.NodeStoreMisses != nil { + if *this.NodeStoreMisses != *that1.NodeStoreMisses { + return false + } + } else if this.NodeStoreMisses != nil { + return false + } else if that1.NodeStoreMisses != nil { + return false + } + if this.NodePrefetches != nil && that1.NodePrefetches != nil { + if *this.NodePrefetches != *that1.NodePrefetches { + return false + } + } else if this.NodePrefetches != nil { + return false + } else if that1.NodePrefetches != nil { + return false + } + if this.NodePrefetchMisses != nil && that1.NodePrefetchMisses != nil { + if *this.NodePrefetchMisses != *that1.NodePrefetchMisses { + return false + } + } else if this.NodePrefetchMisses != nil { + return false + } else if that1.NodePrefetchMisses != nil { + return false + } + return true +} +func (this *Request) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Request) + if !ok { + that2, ok := that.(Request) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Request") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Request but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Request but is not nil && this == nil") + } + if !this.AgentID.Equal(that1.AgentID) { + return fmt.Errorf("AgentID this(%v) Not Equal that(%v)", this.AgentID, that1.AgentID) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + return nil +} +func (this *Request) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Request) + if !ok { + that2, ok := that.(Request) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.AgentID.Equal(that1.AgentID) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + return true +} +func (this *Offer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer) + if !ok { + that2, ok := that.(Offer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer but is not nil && this == nil") + } + if !this.ID.Equal(&that1.ID) { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if !this.FrameworkID.Equal(&that1.FrameworkID) { + return fmt.Errorf("FrameworkID this(%v) Not Equal that(%v)", this.FrameworkID, that1.FrameworkID) + } + if !this.AgentID.Equal(&that1.AgentID) { + return fmt.Errorf("AgentID this(%v) Not Equal that(%v)", this.AgentID, that1.AgentID) + } + if this.Hostname != that1.Hostname { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", this.Hostname, that1.Hostname) + } + if !this.URL.Equal(that1.URL) { + return fmt.Errorf("URL this(%v) Not Equal that(%v)", this.URL, that1.URL) + } + if !this.Domain.Equal(that1.Domain) { + return fmt.Errorf("Domain this(%v) Not Equal that(%v)", this.Domain, that1.Domain) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if len(this.Attributes) != len(that1.Attributes) { + return fmt.Errorf("Attributes this(%v) Not Equal that(%v)", len(this.Attributes), len(that1.Attributes)) + } + for i := range this.Attributes { + if !this.Attributes[i].Equal(&that1.Attributes[i]) { + return fmt.Errorf("Attributes this[%v](%v) Not Equal that[%v](%v)", i, this.Attributes[i], i, that1.Attributes[i]) + } + } + if len(this.ExecutorIDs) != len(that1.ExecutorIDs) { + return fmt.Errorf("ExecutorIDs this(%v) Not Equal that(%v)", len(this.ExecutorIDs), len(that1.ExecutorIDs)) + } + for i := range this.ExecutorIDs { + if !this.ExecutorIDs[i].Equal(&that1.ExecutorIDs[i]) { + return fmt.Errorf("ExecutorIDs this[%v](%v) Not Equal that[%v](%v)", i, this.ExecutorIDs[i], i, that1.ExecutorIDs[i]) + } + } + if !this.Unavailability.Equal(that1.Unavailability) { + return fmt.Errorf("Unavailability this(%v) Not Equal that(%v)", this.Unavailability, that1.Unavailability) + } + if !this.AllocationInfo.Equal(that1.AllocationInfo) { + return fmt.Errorf("AllocationInfo this(%v) Not Equal that(%v)", this.AllocationInfo, that1.AllocationInfo) + } + return nil +} +func (this *Offer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer) + if !ok { + that2, ok := that.(Offer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ID.Equal(&that1.ID) { + return false + } + if !this.FrameworkID.Equal(&that1.FrameworkID) { + return false + } + if !this.AgentID.Equal(&that1.AgentID) { + return false + } + if this.Hostname != that1.Hostname { + return false + } + if !this.URL.Equal(that1.URL) { + return false + } + if !this.Domain.Equal(that1.Domain) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if len(this.Attributes) != len(that1.Attributes) { + return false + } + for i := range this.Attributes { + if !this.Attributes[i].Equal(&that1.Attributes[i]) { + return false + } + } + if len(this.ExecutorIDs) != len(that1.ExecutorIDs) { + return false + } + for i := range this.ExecutorIDs { + if !this.ExecutorIDs[i].Equal(&that1.ExecutorIDs[i]) { + return false + } + } + if !this.Unavailability.Equal(that1.Unavailability) { + return false + } + if !this.AllocationInfo.Equal(that1.AllocationInfo) { + return false + } + return true +} +func (this *Offer_Operation) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation) + if !ok { + that2, ok := that.(Offer_Operation) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.ID.Equal(that1.ID) { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if !this.Launch.Equal(that1.Launch) { + return fmt.Errorf("Launch this(%v) Not Equal that(%v)", this.Launch, that1.Launch) + } + if !this.LaunchGroup.Equal(that1.LaunchGroup) { + return fmt.Errorf("LaunchGroup this(%v) Not Equal that(%v)", this.LaunchGroup, that1.LaunchGroup) + } + if !this.Reserve.Equal(that1.Reserve) { + return fmt.Errorf("Reserve this(%v) Not Equal that(%v)", this.Reserve, that1.Reserve) + } + if !this.Unreserve.Equal(that1.Unreserve) { + return fmt.Errorf("Unreserve this(%v) Not Equal that(%v)", this.Unreserve, that1.Unreserve) + } + if !this.Create.Equal(that1.Create) { + return fmt.Errorf("Create this(%v) Not Equal that(%v)", this.Create, that1.Create) + } + if !this.Destroy.Equal(that1.Destroy) { + return fmt.Errorf("Destroy this(%v) Not Equal that(%v)", this.Destroy, that1.Destroy) + } + if !this.GrowVolume.Equal(that1.GrowVolume) { + return fmt.Errorf("GrowVolume this(%v) Not Equal that(%v)", this.GrowVolume, that1.GrowVolume) + } + if !this.ShrinkVolume.Equal(that1.ShrinkVolume) { + return fmt.Errorf("ShrinkVolume this(%v) Not Equal that(%v)", this.ShrinkVolume, that1.ShrinkVolume) + } + if !this.CreateDisk.Equal(that1.CreateDisk) { + return fmt.Errorf("CreateDisk this(%v) Not Equal that(%v)", this.CreateDisk, that1.CreateDisk) + } + if !this.DestroyDisk.Equal(that1.DestroyDisk) { + return fmt.Errorf("DestroyDisk this(%v) Not Equal that(%v)", this.DestroyDisk, that1.DestroyDisk) + } + return nil +} +func (this *Offer_Operation) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation) + if !ok { + that2, ok := that.(Offer_Operation) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.ID.Equal(that1.ID) { + return false + } + if !this.Launch.Equal(that1.Launch) { + return false + } + if !this.LaunchGroup.Equal(that1.LaunchGroup) { + return false + } + if !this.Reserve.Equal(that1.Reserve) { + return false + } + if !this.Unreserve.Equal(that1.Unreserve) { + return false + } + if !this.Create.Equal(that1.Create) { + return false + } + if !this.Destroy.Equal(that1.Destroy) { + return false + } + if !this.GrowVolume.Equal(that1.GrowVolume) { + return false + } + if !this.ShrinkVolume.Equal(that1.ShrinkVolume) { + return false + } + if !this.CreateDisk.Equal(that1.CreateDisk) { + return false + } + if !this.DestroyDisk.Equal(that1.DestroyDisk) { + return false + } + return true +} +func (this *Offer_Operation_Launch) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_Launch) + if !ok { + that2, ok := that.(Offer_Operation_Launch) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_Launch") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_Launch but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_Launch but is not nil && this == nil") + } + if len(this.TaskInfos) != len(that1.TaskInfos) { + return fmt.Errorf("TaskInfos this(%v) Not Equal that(%v)", len(this.TaskInfos), len(that1.TaskInfos)) + } + for i := range this.TaskInfos { + if !this.TaskInfos[i].Equal(&that1.TaskInfos[i]) { + return fmt.Errorf("TaskInfos this[%v](%v) Not Equal that[%v](%v)", i, this.TaskInfos[i], i, that1.TaskInfos[i]) + } + } + return nil +} +func (this *Offer_Operation_Launch) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_Launch) + if !ok { + that2, ok := that.(Offer_Operation_Launch) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.TaskInfos) != len(that1.TaskInfos) { + return false + } + for i := range this.TaskInfos { + if !this.TaskInfos[i].Equal(&that1.TaskInfos[i]) { + return false + } + } + return true +} +func (this *Offer_Operation_LaunchGroup) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_LaunchGroup) + if !ok { + that2, ok := that.(Offer_Operation_LaunchGroup) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_LaunchGroup") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_LaunchGroup but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_LaunchGroup but is not nil && this == nil") + } + if !this.Executor.Equal(&that1.Executor) { + return fmt.Errorf("Executor this(%v) Not Equal that(%v)", this.Executor, that1.Executor) + } + if !this.TaskGroup.Equal(&that1.TaskGroup) { + return fmt.Errorf("TaskGroup this(%v) Not Equal that(%v)", this.TaskGroup, that1.TaskGroup) + } + return nil +} +func (this *Offer_Operation_LaunchGroup) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_LaunchGroup) + if !ok { + that2, ok := that.(Offer_Operation_LaunchGroup) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Executor.Equal(&that1.Executor) { + return false + } + if !this.TaskGroup.Equal(&that1.TaskGroup) { + return false + } + return true +} +func (this *Offer_Operation_Reserve) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_Reserve) + if !ok { + that2, ok := that.(Offer_Operation_Reserve) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_Reserve") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_Reserve but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_Reserve but is not nil && this == nil") + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + return nil +} +func (this *Offer_Operation_Reserve) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_Reserve) + if !ok { + that2, ok := that.(Offer_Operation_Reserve) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + return true +} +func (this *Offer_Operation_Unreserve) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_Unreserve) + if !ok { + that2, ok := that.(Offer_Operation_Unreserve) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_Unreserve") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_Unreserve but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_Unreserve but is not nil && this == nil") + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + return nil +} +func (this *Offer_Operation_Unreserve) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_Unreserve) + if !ok { + that2, ok := that.(Offer_Operation_Unreserve) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + return true +} +func (this *Offer_Operation_Create) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_Create) + if !ok { + that2, ok := that.(Offer_Operation_Create) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_Create") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_Create but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_Create but is not nil && this == nil") + } + if len(this.Volumes) != len(that1.Volumes) { + return fmt.Errorf("Volumes this(%v) Not Equal that(%v)", len(this.Volumes), len(that1.Volumes)) + } + for i := range this.Volumes { + if !this.Volumes[i].Equal(&that1.Volumes[i]) { + return fmt.Errorf("Volumes this[%v](%v) Not Equal that[%v](%v)", i, this.Volumes[i], i, that1.Volumes[i]) + } + } + return nil +} +func (this *Offer_Operation_Create) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_Create) + if !ok { + that2, ok := that.(Offer_Operation_Create) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Volumes) != len(that1.Volumes) { + return false + } + for i := range this.Volumes { + if !this.Volumes[i].Equal(&that1.Volumes[i]) { + return false + } + } + return true +} +func (this *Offer_Operation_Destroy) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_Destroy) + if !ok { + that2, ok := that.(Offer_Operation_Destroy) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_Destroy") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_Destroy but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_Destroy but is not nil && this == nil") + } + if len(this.Volumes) != len(that1.Volumes) { + return fmt.Errorf("Volumes this(%v) Not Equal that(%v)", len(this.Volumes), len(that1.Volumes)) + } + for i := range this.Volumes { + if !this.Volumes[i].Equal(&that1.Volumes[i]) { + return fmt.Errorf("Volumes this[%v](%v) Not Equal that[%v](%v)", i, this.Volumes[i], i, that1.Volumes[i]) + } + } + return nil +} +func (this *Offer_Operation_Destroy) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_Destroy) + if !ok { + that2, ok := that.(Offer_Operation_Destroy) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Volumes) != len(that1.Volumes) { + return false + } + for i := range this.Volumes { + if !this.Volumes[i].Equal(&that1.Volumes[i]) { + return false + } + } + return true +} +func (this *Offer_Operation_GrowVolume) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_GrowVolume) + if !ok { + that2, ok := that.(Offer_Operation_GrowVolume) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_GrowVolume") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_GrowVolume but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_GrowVolume but is not nil && this == nil") + } + if !this.Volume.Equal(&that1.Volume) { + return fmt.Errorf("Volume this(%v) Not Equal that(%v)", this.Volume, that1.Volume) + } + if !this.Addition.Equal(&that1.Addition) { + return fmt.Errorf("Addition this(%v) Not Equal that(%v)", this.Addition, that1.Addition) + } + return nil +} +func (this *Offer_Operation_GrowVolume) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_GrowVolume) + if !ok { + that2, ok := that.(Offer_Operation_GrowVolume) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Volume.Equal(&that1.Volume) { + return false + } + if !this.Addition.Equal(&that1.Addition) { + return false + } + return true +} +func (this *Offer_Operation_ShrinkVolume) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_ShrinkVolume) + if !ok { + that2, ok := that.(Offer_Operation_ShrinkVolume) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_ShrinkVolume") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_ShrinkVolume but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_ShrinkVolume but is not nil && this == nil") + } + if !this.Volume.Equal(&that1.Volume) { + return fmt.Errorf("Volume this(%v) Not Equal that(%v)", this.Volume, that1.Volume) + } + if !this.Subtract.Equal(&that1.Subtract) { + return fmt.Errorf("Subtract this(%v) Not Equal that(%v)", this.Subtract, that1.Subtract) + } + return nil +} +func (this *Offer_Operation_ShrinkVolume) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_ShrinkVolume) + if !ok { + that2, ok := that.(Offer_Operation_ShrinkVolume) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Volume.Equal(&that1.Volume) { + return false + } + if !this.Subtract.Equal(&that1.Subtract) { + return false + } + return true +} +func (this *Offer_Operation_CreateDisk) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_CreateDisk) + if !ok { + that2, ok := that.(Offer_Operation_CreateDisk) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_CreateDisk") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_CreateDisk but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_CreateDisk but is not nil && this == nil") + } + if !this.Source.Equal(&that1.Source) { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", this.Source, that1.Source) + } + if this.TargetType != that1.TargetType { + return fmt.Errorf("TargetType this(%v) Not Equal that(%v)", this.TargetType, that1.TargetType) + } + return nil +} +func (this *Offer_Operation_CreateDisk) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_CreateDisk) + if !ok { + that2, ok := that.(Offer_Operation_CreateDisk) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Source.Equal(&that1.Source) { + return false + } + if this.TargetType != that1.TargetType { + return false + } + return true +} +func (this *Offer_Operation_DestroyDisk) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Offer_Operation_DestroyDisk) + if !ok { + that2, ok := that.(Offer_Operation_DestroyDisk) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Offer_Operation_DestroyDisk") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Offer_Operation_DestroyDisk but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Offer_Operation_DestroyDisk but is not nil && this == nil") + } + if !this.Source.Equal(&that1.Source) { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", this.Source, that1.Source) + } + return nil +} +func (this *Offer_Operation_DestroyDisk) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Offer_Operation_DestroyDisk) + if !ok { + that2, ok := that.(Offer_Operation_DestroyDisk) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Source.Equal(&that1.Source) { + return false + } + return true +} +func (this *InverseOffer) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*InverseOffer) + if !ok { + that2, ok := that.(InverseOffer) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *InverseOffer") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *InverseOffer but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *InverseOffer but is not nil && this == nil") + } + if !this.OfferID.Equal(&that1.OfferID) { + return fmt.Errorf("OfferID this(%v) Not Equal that(%v)", this.OfferID, that1.OfferID) + } + if !this.URL.Equal(that1.URL) { + return fmt.Errorf("URL this(%v) Not Equal that(%v)", this.URL, that1.URL) + } + if !this.FrameworkID.Equal(&that1.FrameworkID) { + return fmt.Errorf("FrameworkID this(%v) Not Equal that(%v)", this.FrameworkID, that1.FrameworkID) + } + if !this.AgentID.Equal(that1.AgentID) { + return fmt.Errorf("AgentID this(%v) Not Equal that(%v)", this.AgentID, that1.AgentID) + } + if !this.Unavailability.Equal(&that1.Unavailability) { + return fmt.Errorf("Unavailability this(%v) Not Equal that(%v)", this.Unavailability, that1.Unavailability) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + return nil +} +func (this *InverseOffer) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*InverseOffer) + if !ok { + that2, ok := that.(InverseOffer) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.OfferID.Equal(&that1.OfferID) { + return false + } + if !this.URL.Equal(that1.URL) { + return false + } + if !this.FrameworkID.Equal(&that1.FrameworkID) { + return false + } + if !this.AgentID.Equal(that1.AgentID) { + return false + } + if !this.Unavailability.Equal(&that1.Unavailability) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + return true +} +func (this *TaskInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TaskInfo) + if !ok { + that2, ok := that.(TaskInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TaskInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TaskInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TaskInfo but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if !this.TaskID.Equal(&that1.TaskID) { + return fmt.Errorf("TaskID this(%v) Not Equal that(%v)", this.TaskID, that1.TaskID) + } + if !this.AgentID.Equal(&that1.AgentID) { + return fmt.Errorf("AgentID this(%v) Not Equal that(%v)", this.AgentID, that1.AgentID) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if !this.Executor.Equal(that1.Executor) { + return fmt.Errorf("Executor this(%v) Not Equal that(%v)", this.Executor, that1.Executor) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if !this.Container.Equal(that1.Container) { + return fmt.Errorf("Container this(%v) Not Equal that(%v)", this.Container, that1.Container) + } + if !this.HealthCheck.Equal(that1.HealthCheck) { + return fmt.Errorf("HealthCheck this(%v) Not Equal that(%v)", this.HealthCheck, that1.HealthCheck) + } + if !this.Check.Equal(that1.Check) { + return fmt.Errorf("Check this(%v) Not Equal that(%v)", this.Check, that1.Check) + } + if !this.KillPolicy.Equal(that1.KillPolicy) { + return fmt.Errorf("KillPolicy this(%v) Not Equal that(%v)", this.KillPolicy, that1.KillPolicy) + } + if !bytes.Equal(this.Data, that1.Data) { + return fmt.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + if !this.Discovery.Equal(that1.Discovery) { + return fmt.Errorf("Discovery this(%v) Not Equal that(%v)", this.Discovery, that1.Discovery) + } + if !this.MaxCompletionTime.Equal(that1.MaxCompletionTime) { + return fmt.Errorf("MaxCompletionTime this(%v) Not Equal that(%v)", this.MaxCompletionTime, that1.MaxCompletionTime) + } + return nil +} +func (this *TaskInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TaskInfo) + if !ok { + that2, ok := that.(TaskInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if !this.TaskID.Equal(&that1.TaskID) { + return false + } + if !this.AgentID.Equal(&that1.AgentID) { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if !this.Executor.Equal(that1.Executor) { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if !this.Container.Equal(that1.Container) { + return false + } + if !this.HealthCheck.Equal(that1.HealthCheck) { + return false + } + if !this.Check.Equal(that1.Check) { + return false + } + if !this.KillPolicy.Equal(that1.KillPolicy) { + return false + } + if !bytes.Equal(this.Data, that1.Data) { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + if !this.Discovery.Equal(that1.Discovery) { + return false + } + if !this.MaxCompletionTime.Equal(that1.MaxCompletionTime) { + return false + } + return true +} +func (this *TaskGroupInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TaskGroupInfo) + if !ok { + that2, ok := that.(TaskGroupInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TaskGroupInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TaskGroupInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TaskGroupInfo but is not nil && this == nil") + } + if len(this.Tasks) != len(that1.Tasks) { + return fmt.Errorf("Tasks this(%v) Not Equal that(%v)", len(this.Tasks), len(that1.Tasks)) + } + for i := range this.Tasks { + if !this.Tasks[i].Equal(&that1.Tasks[i]) { + return fmt.Errorf("Tasks this[%v](%v) Not Equal that[%v](%v)", i, this.Tasks[i], i, that1.Tasks[i]) + } + } + return nil +} +func (this *TaskGroupInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TaskGroupInfo) + if !ok { + that2, ok := that.(TaskGroupInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Tasks) != len(that1.Tasks) { + return false + } + for i := range this.Tasks { + if !this.Tasks[i].Equal(&that1.Tasks[i]) { + return false + } + } + return true +} +func (this *Task) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Task) + if !ok { + that2, ok := that.(Task) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Task") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Task but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Task but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if !this.TaskID.Equal(&that1.TaskID) { + return fmt.Errorf("TaskID this(%v) Not Equal that(%v)", this.TaskID, that1.TaskID) + } + if !this.FrameworkID.Equal(&that1.FrameworkID) { + return fmt.Errorf("FrameworkID this(%v) Not Equal that(%v)", this.FrameworkID, that1.FrameworkID) + } + if !this.ExecutorID.Equal(that1.ExecutorID) { + return fmt.Errorf("ExecutorID this(%v) Not Equal that(%v)", this.ExecutorID, that1.ExecutorID) + } + if !this.AgentID.Equal(&that1.AgentID) { + return fmt.Errorf("AgentID this(%v) Not Equal that(%v)", this.AgentID, that1.AgentID) + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return fmt.Errorf("State this(%v) Not Equal that(%v)", *this.State, *that1.State) + } + } else if this.State != nil { + return fmt.Errorf("this.State == nil && that.State != nil") + } else if that1.State != nil { + return fmt.Errorf("State this(%v) Not Equal that(%v)", this.State, that1.State) + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + if len(this.Statuses) != len(that1.Statuses) { + return fmt.Errorf("Statuses this(%v) Not Equal that(%v)", len(this.Statuses), len(that1.Statuses)) + } + for i := range this.Statuses { + if !this.Statuses[i].Equal(&that1.Statuses[i]) { + return fmt.Errorf("Statuses this[%v](%v) Not Equal that[%v](%v)", i, this.Statuses[i], i, that1.Statuses[i]) + } + } + if this.StatusUpdateState != nil && that1.StatusUpdateState != nil { + if *this.StatusUpdateState != *that1.StatusUpdateState { + return fmt.Errorf("StatusUpdateState this(%v) Not Equal that(%v)", *this.StatusUpdateState, *that1.StatusUpdateState) + } + } else if this.StatusUpdateState != nil { + return fmt.Errorf("this.StatusUpdateState == nil && that.StatusUpdateState != nil") + } else if that1.StatusUpdateState != nil { + return fmt.Errorf("StatusUpdateState this(%v) Not Equal that(%v)", this.StatusUpdateState, that1.StatusUpdateState) + } + if !bytes.Equal(this.StatusUpdateUUID, that1.StatusUpdateUUID) { + return fmt.Errorf("StatusUpdateUUID this(%v) Not Equal that(%v)", this.StatusUpdateUUID, that1.StatusUpdateUUID) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + if !this.Discovery.Equal(that1.Discovery) { + return fmt.Errorf("Discovery this(%v) Not Equal that(%v)", this.Discovery, that1.Discovery) + } + if !this.Container.Equal(that1.Container) { + return fmt.Errorf("Container this(%v) Not Equal that(%v)", this.Container, that1.Container) + } + if this.User != nil && that1.User != nil { + if *this.User != *that1.User { + return fmt.Errorf("User this(%v) Not Equal that(%v)", *this.User, *that1.User) + } + } else if this.User != nil { + return fmt.Errorf("this.User == nil && that.User != nil") + } else if that1.User != nil { + return fmt.Errorf("User this(%v) Not Equal that(%v)", this.User, that1.User) + } + return nil +} +func (this *Task) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Task) + if !ok { + that2, ok := that.(Task) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if !this.TaskID.Equal(&that1.TaskID) { + return false + } + if !this.FrameworkID.Equal(&that1.FrameworkID) { + return false + } + if !this.ExecutorID.Equal(that1.ExecutorID) { + return false + } + if !this.AgentID.Equal(&that1.AgentID) { + return false + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return false + } + } else if this.State != nil { + return false + } else if that1.State != nil { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + if len(this.Statuses) != len(that1.Statuses) { + return false + } + for i := range this.Statuses { + if !this.Statuses[i].Equal(&that1.Statuses[i]) { + return false + } + } + if this.StatusUpdateState != nil && that1.StatusUpdateState != nil { + if *this.StatusUpdateState != *that1.StatusUpdateState { + return false + } + } else if this.StatusUpdateState != nil { + return false + } else if that1.StatusUpdateState != nil { + return false + } + if !bytes.Equal(this.StatusUpdateUUID, that1.StatusUpdateUUID) { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + if !this.Discovery.Equal(that1.Discovery) { + return false + } + if !this.Container.Equal(that1.Container) { + return false + } + if this.User != nil && that1.User != nil { + if *this.User != *that1.User { + return false + } + } else if this.User != nil { + return false + } else if that1.User != nil { + return false + } + return true +} +func (this *TaskResourceLimitation) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TaskResourceLimitation) + if !ok { + that2, ok := that.(TaskResourceLimitation) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TaskResourceLimitation") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TaskResourceLimitation but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TaskResourceLimitation but is not nil && this == nil") + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + return nil +} +func (this *TaskResourceLimitation) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TaskResourceLimitation) + if !ok { + that2, ok := that.(TaskResourceLimitation) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + return true +} +func (this *UUID) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*UUID) + if !ok { + that2, ok := that.(UUID) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *UUID") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *UUID but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *UUID but is not nil && this == nil") + } + if !bytes.Equal(this.Value, that1.Value) { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *UUID) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*UUID) + if !ok { + that2, ok := that.(UUID) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !bytes.Equal(this.Value, that1.Value) { + return false + } + return true +} +func (this *Operation) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Operation) + if !ok { + that2, ok := that.(Operation) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Operation") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Operation but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Operation but is not nil && this == nil") + } + if !this.FrameworkID.Equal(that1.FrameworkID) { + return fmt.Errorf("FrameworkID this(%v) Not Equal that(%v)", this.FrameworkID, that1.FrameworkID) + } + if !this.AgentID.Equal(that1.AgentID) { + return fmt.Errorf("AgentID this(%v) Not Equal that(%v)", this.AgentID, that1.AgentID) + } + if !this.Info.Equal(&that1.Info) { + return fmt.Errorf("Info this(%v) Not Equal that(%v)", this.Info, that1.Info) + } + if !this.LatestStatus.Equal(&that1.LatestStatus) { + return fmt.Errorf("LatestStatus this(%v) Not Equal that(%v)", this.LatestStatus, that1.LatestStatus) + } + if len(this.Statuses) != len(that1.Statuses) { + return fmt.Errorf("Statuses this(%v) Not Equal that(%v)", len(this.Statuses), len(that1.Statuses)) + } + for i := range this.Statuses { + if !this.Statuses[i].Equal(&that1.Statuses[i]) { + return fmt.Errorf("Statuses this[%v](%v) Not Equal that[%v](%v)", i, this.Statuses[i], i, that1.Statuses[i]) + } + } + if !this.UUID.Equal(&that1.UUID) { + return fmt.Errorf("UUID this(%v) Not Equal that(%v)", this.UUID, that1.UUID) + } + return nil +} +func (this *Operation) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Operation) + if !ok { + that2, ok := that.(Operation) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.FrameworkID.Equal(that1.FrameworkID) { + return false + } + if !this.AgentID.Equal(that1.AgentID) { + return false + } + if !this.Info.Equal(&that1.Info) { + return false + } + if !this.LatestStatus.Equal(&that1.LatestStatus) { + return false + } + if len(this.Statuses) != len(that1.Statuses) { + return false + } + for i := range this.Statuses { + if !this.Statuses[i].Equal(&that1.Statuses[i]) { + return false + } + } + if !this.UUID.Equal(&that1.UUID) { + return false + } + return true +} +func (this *OperationStatus) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*OperationStatus) + if !ok { + that2, ok := that.(OperationStatus) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *OperationStatus") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *OperationStatus but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *OperationStatus but is not nil && this == nil") + } + if !this.OperationID.Equal(that1.OperationID) { + return fmt.Errorf("OperationID this(%v) Not Equal that(%v)", this.OperationID, that1.OperationID) + } + if this.State != that1.State { + return fmt.Errorf("State this(%v) Not Equal that(%v)", this.State, that1.State) + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", *this.Message, *that1.Message) + } + } else if this.Message != nil { + return fmt.Errorf("this.Message == nil && that.Message != nil") + } else if that1.Message != nil { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", this.Message, that1.Message) + } + if len(this.ConvertedResources) != len(that1.ConvertedResources) { + return fmt.Errorf("ConvertedResources this(%v) Not Equal that(%v)", len(this.ConvertedResources), len(that1.ConvertedResources)) + } + for i := range this.ConvertedResources { + if !this.ConvertedResources[i].Equal(&that1.ConvertedResources[i]) { + return fmt.Errorf("ConvertedResources this[%v](%v) Not Equal that[%v](%v)", i, this.ConvertedResources[i], i, that1.ConvertedResources[i]) + } + } + if !this.UUID.Equal(that1.UUID) { + return fmt.Errorf("UUID this(%v) Not Equal that(%v)", this.UUID, that1.UUID) + } + return nil +} +func (this *OperationStatus) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*OperationStatus) + if !ok { + that2, ok := that.(OperationStatus) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.OperationID.Equal(that1.OperationID) { + return false + } + if this.State != that1.State { + return false + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return false + } + } else if this.Message != nil { + return false + } else if that1.Message != nil { + return false + } + if len(this.ConvertedResources) != len(that1.ConvertedResources) { + return false + } + for i := range this.ConvertedResources { + if !this.ConvertedResources[i].Equal(&that1.ConvertedResources[i]) { + return false + } + } + if !this.UUID.Equal(that1.UUID) { + return false + } + return true +} +func (this *CheckStatusInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckStatusInfo) + if !ok { + that2, ok := that.(CheckStatusInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckStatusInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckStatusInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckStatusInfo but is not nil && this == nil") + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", *this.Type, *that1.Type) + } + } else if this.Type != nil { + return fmt.Errorf("this.Type == nil && that.Type != nil") + } else if that1.Type != nil { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Command.Equal(that1.Command) { + return fmt.Errorf("Command this(%v) Not Equal that(%v)", this.Command, that1.Command) + } + if !this.HTTP.Equal(that1.HTTP) { + return fmt.Errorf("HTTP this(%v) Not Equal that(%v)", this.HTTP, that1.HTTP) + } + if !this.TCP.Equal(that1.TCP) { + return fmt.Errorf("TCP this(%v) Not Equal that(%v)", this.TCP, that1.TCP) + } + return nil +} +func (this *CheckStatusInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckStatusInfo) + if !ok { + that2, ok := that.(CheckStatusInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return false + } + } else if this.Type != nil { + return false + } else if that1.Type != nil { + return false + } + if !this.Command.Equal(that1.Command) { + return false + } + if !this.HTTP.Equal(that1.HTTP) { + return false + } + if !this.TCP.Equal(that1.TCP) { + return false + } + return true +} +func (this *CheckStatusInfo_Command) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckStatusInfo_Command) + if !ok { + that2, ok := that.(CheckStatusInfo_Command) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckStatusInfo_Command") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckStatusInfo_Command but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckStatusInfo_Command but is not nil && this == nil") + } + if this.ExitCode != nil && that1.ExitCode != nil { + if *this.ExitCode != *that1.ExitCode { + return fmt.Errorf("ExitCode this(%v) Not Equal that(%v)", *this.ExitCode, *that1.ExitCode) + } + } else if this.ExitCode != nil { + return fmt.Errorf("this.ExitCode == nil && that.ExitCode != nil") + } else if that1.ExitCode != nil { + return fmt.Errorf("ExitCode this(%v) Not Equal that(%v)", this.ExitCode, that1.ExitCode) + } + return nil +} +func (this *CheckStatusInfo_Command) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckStatusInfo_Command) + if !ok { + that2, ok := that.(CheckStatusInfo_Command) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ExitCode != nil && that1.ExitCode != nil { + if *this.ExitCode != *that1.ExitCode { + return false + } + } else if this.ExitCode != nil { + return false + } else if that1.ExitCode != nil { + return false + } + return true +} +func (this *CheckStatusInfo_Http) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckStatusInfo_Http) + if !ok { + that2, ok := that.(CheckStatusInfo_Http) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckStatusInfo_Http") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckStatusInfo_Http but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckStatusInfo_Http but is not nil && this == nil") + } + if this.StatusCode != nil && that1.StatusCode != nil { + if *this.StatusCode != *that1.StatusCode { + return fmt.Errorf("StatusCode this(%v) Not Equal that(%v)", *this.StatusCode, *that1.StatusCode) + } + } else if this.StatusCode != nil { + return fmt.Errorf("this.StatusCode == nil && that.StatusCode != nil") + } else if that1.StatusCode != nil { + return fmt.Errorf("StatusCode this(%v) Not Equal that(%v)", this.StatusCode, that1.StatusCode) + } + return nil +} +func (this *CheckStatusInfo_Http) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckStatusInfo_Http) + if !ok { + that2, ok := that.(CheckStatusInfo_Http) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.StatusCode != nil && that1.StatusCode != nil { + if *this.StatusCode != *that1.StatusCode { + return false + } + } else if this.StatusCode != nil { + return false + } else if that1.StatusCode != nil { + return false + } + return true +} +func (this *CheckStatusInfo_Tcp) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CheckStatusInfo_Tcp) + if !ok { + that2, ok := that.(CheckStatusInfo_Tcp) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CheckStatusInfo_Tcp") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CheckStatusInfo_Tcp but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CheckStatusInfo_Tcp but is not nil && this == nil") + } + if this.Succeeded != nil && that1.Succeeded != nil { + if *this.Succeeded != *that1.Succeeded { + return fmt.Errorf("Succeeded this(%v) Not Equal that(%v)", *this.Succeeded, *that1.Succeeded) + } + } else if this.Succeeded != nil { + return fmt.Errorf("this.Succeeded == nil && that.Succeeded != nil") + } else if that1.Succeeded != nil { + return fmt.Errorf("Succeeded this(%v) Not Equal that(%v)", this.Succeeded, that1.Succeeded) + } + return nil +} +func (this *CheckStatusInfo_Tcp) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CheckStatusInfo_Tcp) + if !ok { + that2, ok := that.(CheckStatusInfo_Tcp) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Succeeded != nil && that1.Succeeded != nil { + if *this.Succeeded != *that1.Succeeded { + return false + } + } else if this.Succeeded != nil { + return false + } else if that1.Succeeded != nil { + return false + } + return true +} +func (this *TaskStatus) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TaskStatus) + if !ok { + that2, ok := that.(TaskStatus) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TaskStatus") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TaskStatus but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TaskStatus but is not nil && this == nil") + } + if !this.TaskID.Equal(&that1.TaskID) { + return fmt.Errorf("TaskID this(%v) Not Equal that(%v)", this.TaskID, that1.TaskID) + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return fmt.Errorf("State this(%v) Not Equal that(%v)", *this.State, *that1.State) + } + } else if this.State != nil { + return fmt.Errorf("this.State == nil && that.State != nil") + } else if that1.State != nil { + return fmt.Errorf("State this(%v) Not Equal that(%v)", this.State, that1.State) + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", *this.Message, *that1.Message) + } + } else if this.Message != nil { + return fmt.Errorf("this.Message == nil && that.Message != nil") + } else if that1.Message != nil { + return fmt.Errorf("Message this(%v) Not Equal that(%v)", this.Message, that1.Message) + } + if this.Source != nil && that1.Source != nil { + if *this.Source != *that1.Source { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", *this.Source, *that1.Source) + } + } else if this.Source != nil { + return fmt.Errorf("this.Source == nil && that.Source != nil") + } else if that1.Source != nil { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", this.Source, that1.Source) + } + if this.Reason != nil && that1.Reason != nil { + if *this.Reason != *that1.Reason { + return fmt.Errorf("Reason this(%v) Not Equal that(%v)", *this.Reason, *that1.Reason) + } + } else if this.Reason != nil { + return fmt.Errorf("this.Reason == nil && that.Reason != nil") + } else if that1.Reason != nil { + return fmt.Errorf("Reason this(%v) Not Equal that(%v)", this.Reason, that1.Reason) + } + if !bytes.Equal(this.Data, that1.Data) { + return fmt.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data) + } + if !this.AgentID.Equal(that1.AgentID) { + return fmt.Errorf("AgentID this(%v) Not Equal that(%v)", this.AgentID, that1.AgentID) + } + if !this.ExecutorID.Equal(that1.ExecutorID) { + return fmt.Errorf("ExecutorID this(%v) Not Equal that(%v)", this.ExecutorID, that1.ExecutorID) + } + if this.Timestamp != nil && that1.Timestamp != nil { + if *this.Timestamp != *that1.Timestamp { + return fmt.Errorf("Timestamp this(%v) Not Equal that(%v)", *this.Timestamp, *that1.Timestamp) + } + } else if this.Timestamp != nil { + return fmt.Errorf("this.Timestamp == nil && that.Timestamp != nil") + } else if that1.Timestamp != nil { + return fmt.Errorf("Timestamp this(%v) Not Equal that(%v)", this.Timestamp, that1.Timestamp) + } + if !bytes.Equal(this.UUID, that1.UUID) { + return fmt.Errorf("UUID this(%v) Not Equal that(%v)", this.UUID, that1.UUID) + } + if this.Healthy != nil && that1.Healthy != nil { + if *this.Healthy != *that1.Healthy { + return fmt.Errorf("Healthy this(%v) Not Equal that(%v)", *this.Healthy, *that1.Healthy) + } + } else if this.Healthy != nil { + return fmt.Errorf("this.Healthy == nil && that.Healthy != nil") + } else if that1.Healthy != nil { + return fmt.Errorf("Healthy this(%v) Not Equal that(%v)", this.Healthy, that1.Healthy) + } + if !this.CheckStatus.Equal(that1.CheckStatus) { + return fmt.Errorf("CheckStatus this(%v) Not Equal that(%v)", this.CheckStatus, that1.CheckStatus) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + if !this.ContainerStatus.Equal(that1.ContainerStatus) { + return fmt.Errorf("ContainerStatus this(%v) Not Equal that(%v)", this.ContainerStatus, that1.ContainerStatus) + } + if !this.UnreachableTime.Equal(that1.UnreachableTime) { + return fmt.Errorf("UnreachableTime this(%v) Not Equal that(%v)", this.UnreachableTime, that1.UnreachableTime) + } + if !this.Limitation.Equal(that1.Limitation) { + return fmt.Errorf("Limitation this(%v) Not Equal that(%v)", this.Limitation, that1.Limitation) + } + return nil +} +func (this *TaskStatus) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TaskStatus) + if !ok { + that2, ok := that.(TaskStatus) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.TaskID.Equal(&that1.TaskID) { + return false + } + if this.State != nil && that1.State != nil { + if *this.State != *that1.State { + return false + } + } else if this.State != nil { + return false + } else if that1.State != nil { + return false + } + if this.Message != nil && that1.Message != nil { + if *this.Message != *that1.Message { + return false + } + } else if this.Message != nil { + return false + } else if that1.Message != nil { + return false + } + if this.Source != nil && that1.Source != nil { + if *this.Source != *that1.Source { + return false + } + } else if this.Source != nil { + return false + } else if that1.Source != nil { + return false + } + if this.Reason != nil && that1.Reason != nil { + if *this.Reason != *that1.Reason { + return false + } + } else if this.Reason != nil { + return false + } else if that1.Reason != nil { + return false + } + if !bytes.Equal(this.Data, that1.Data) { + return false + } + if !this.AgentID.Equal(that1.AgentID) { + return false + } + if !this.ExecutorID.Equal(that1.ExecutorID) { + return false + } + if this.Timestamp != nil && that1.Timestamp != nil { + if *this.Timestamp != *that1.Timestamp { + return false + } + } else if this.Timestamp != nil { + return false + } else if that1.Timestamp != nil { + return false + } + if !bytes.Equal(this.UUID, that1.UUID) { + return false + } + if this.Healthy != nil && that1.Healthy != nil { + if *this.Healthy != *that1.Healthy { + return false + } + } else if this.Healthy != nil { + return false + } else if that1.Healthy != nil { + return false + } + if !this.CheckStatus.Equal(that1.CheckStatus) { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + if !this.ContainerStatus.Equal(that1.ContainerStatus) { + return false + } + if !this.UnreachableTime.Equal(that1.UnreachableTime) { + return false + } + if !this.Limitation.Equal(that1.Limitation) { + return false + } + return true +} +func (this *Filters) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Filters) + if !ok { + that2, ok := that.(Filters) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Filters") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Filters but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Filters but is not nil && this == nil") + } + if this.RefuseSeconds != nil && that1.RefuseSeconds != nil { + if *this.RefuseSeconds != *that1.RefuseSeconds { + return fmt.Errorf("RefuseSeconds this(%v) Not Equal that(%v)", *this.RefuseSeconds, *that1.RefuseSeconds) + } + } else if this.RefuseSeconds != nil { + return fmt.Errorf("this.RefuseSeconds == nil && that.RefuseSeconds != nil") + } else if that1.RefuseSeconds != nil { + return fmt.Errorf("RefuseSeconds this(%v) Not Equal that(%v)", this.RefuseSeconds, that1.RefuseSeconds) + } + return nil +} +func (this *Filters) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Filters) + if !ok { + that2, ok := that.(Filters) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.RefuseSeconds != nil && that1.RefuseSeconds != nil { + if *this.RefuseSeconds != *that1.RefuseSeconds { + return false + } + } else if this.RefuseSeconds != nil { + return false + } else if that1.RefuseSeconds != nil { + return false + } + return true +} +func (this *Environment) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Environment) + if !ok { + that2, ok := that.(Environment) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Environment") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Environment but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Environment but is not nil && this == nil") + } + if len(this.Variables) != len(that1.Variables) { + return fmt.Errorf("Variables this(%v) Not Equal that(%v)", len(this.Variables), len(that1.Variables)) + } + for i := range this.Variables { + if !this.Variables[i].Equal(&that1.Variables[i]) { + return fmt.Errorf("Variables this[%v](%v) Not Equal that[%v](%v)", i, this.Variables[i], i, that1.Variables[i]) + } + } + return nil +} +func (this *Environment) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Environment) + if !ok { + that2, ok := that.(Environment) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Variables) != len(that1.Variables) { + return false + } + for i := range this.Variables { + if !this.Variables[i].Equal(&that1.Variables[i]) { + return false + } + } + return true +} +func (this *Environment_Variable) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Environment_Variable) + if !ok { + that2, ok := that.(Environment_Variable) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Environment_Variable") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Environment_Variable but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Environment_Variable but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", *this.Type, *that1.Type) + } + } else if this.Type != nil { + return fmt.Errorf("this.Type == nil && that.Type != nil") + } else if that1.Type != nil { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", *this.Value, *that1.Value) + } + } else if this.Value != nil { + return fmt.Errorf("this.Value == nil && that.Value != nil") + } else if that1.Value != nil { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + if !this.Secret.Equal(that1.Secret) { + return fmt.Errorf("Secret this(%v) Not Equal that(%v)", this.Secret, that1.Secret) + } + return nil +} +func (this *Environment_Variable) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Environment_Variable) + if !ok { + that2, ok := that.(Environment_Variable) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return false + } + } else if this.Type != nil { + return false + } else if that1.Type != nil { + return false + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return false + } + } else if this.Value != nil { + return false + } else if that1.Value != nil { + return false + } + if !this.Secret.Equal(that1.Secret) { + return false + } + return true +} +func (this *Parameter) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Parameter) + if !ok { + that2, ok := that.(Parameter) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Parameter") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Parameter but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Parameter but is not nil && this == nil") + } + if this.Key != that1.Key { + return fmt.Errorf("Key this(%v) Not Equal that(%v)", this.Key, that1.Key) + } + if this.Value != that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *Parameter) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Parameter) + if !ok { + that2, ok := that.(Parameter) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Key != that1.Key { + return false + } + if this.Value != that1.Value { + return false + } + return true +} +func (this *Parameters) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Parameters) + if !ok { + that2, ok := that.(Parameters) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Parameters") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Parameters but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Parameters but is not nil && this == nil") + } + if len(this.Parameter) != len(that1.Parameter) { + return fmt.Errorf("Parameter this(%v) Not Equal that(%v)", len(this.Parameter), len(that1.Parameter)) + } + for i := range this.Parameter { + if !this.Parameter[i].Equal(&that1.Parameter[i]) { + return fmt.Errorf("Parameter this[%v](%v) Not Equal that[%v](%v)", i, this.Parameter[i], i, that1.Parameter[i]) + } + } + return nil +} +func (this *Parameters) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Parameters) + if !ok { + that2, ok := that.(Parameters) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Parameter) != len(that1.Parameter) { + return false + } + for i := range this.Parameter { + if !this.Parameter[i].Equal(&that1.Parameter[i]) { + return false + } + } + return true +} +func (this *Credential) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Credential) + if !ok { + that2, ok := that.(Credential) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Credential") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Credential but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Credential but is not nil && this == nil") + } + if this.Principal != that1.Principal { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", this.Principal, that1.Principal) + } + if this.Secret != nil && that1.Secret != nil { + if *this.Secret != *that1.Secret { + return fmt.Errorf("Secret this(%v) Not Equal that(%v)", *this.Secret, *that1.Secret) + } + } else if this.Secret != nil { + return fmt.Errorf("this.Secret == nil && that.Secret != nil") + } else if that1.Secret != nil { + return fmt.Errorf("Secret this(%v) Not Equal that(%v)", this.Secret, that1.Secret) + } + return nil +} +func (this *Credential) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Credential) + if !ok { + that2, ok := that.(Credential) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Principal != that1.Principal { + return false + } + if this.Secret != nil && that1.Secret != nil { + if *this.Secret != *that1.Secret { + return false + } + } else if this.Secret != nil { + return false + } else if that1.Secret != nil { + return false + } + return true +} +func (this *Credentials) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Credentials) + if !ok { + that2, ok := that.(Credentials) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Credentials") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Credentials but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Credentials but is not nil && this == nil") + } + if len(this.Credentials) != len(that1.Credentials) { + return fmt.Errorf("Credentials this(%v) Not Equal that(%v)", len(this.Credentials), len(that1.Credentials)) + } + for i := range this.Credentials { + if !this.Credentials[i].Equal(&that1.Credentials[i]) { + return fmt.Errorf("Credentials this[%v](%v) Not Equal that[%v](%v)", i, this.Credentials[i], i, that1.Credentials[i]) + } + } + return nil +} +func (this *Credentials) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Credentials) + if !ok { + that2, ok := that.(Credentials) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Credentials) != len(that1.Credentials) { + return false + } + for i := range this.Credentials { + if !this.Credentials[i].Equal(&that1.Credentials[i]) { + return false + } + } + return true +} +func (this *Secret) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Secret) + if !ok { + that2, ok := that.(Secret) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Secret") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Secret but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Secret but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Reference.Equal(that1.Reference) { + return fmt.Errorf("Reference this(%v) Not Equal that(%v)", this.Reference, that1.Reference) + } + if !this.Value.Equal(that1.Value) { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *Secret) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Secret) + if !ok { + that2, ok := that.(Secret) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.Reference.Equal(that1.Reference) { + return false + } + if !this.Value.Equal(that1.Value) { + return false + } + return true +} +func (this *Secret_Reference) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Secret_Reference) + if !ok { + that2, ok := that.(Secret_Reference) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Secret_Reference") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Secret_Reference but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Secret_Reference but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Key != nil && that1.Key != nil { + if *this.Key != *that1.Key { + return fmt.Errorf("Key this(%v) Not Equal that(%v)", *this.Key, *that1.Key) + } + } else if this.Key != nil { + return fmt.Errorf("this.Key == nil && that.Key != nil") + } else if that1.Key != nil { + return fmt.Errorf("Key this(%v) Not Equal that(%v)", this.Key, that1.Key) + } + return nil +} +func (this *Secret_Reference) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Secret_Reference) + if !ok { + that2, ok := that.(Secret_Reference) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Key != nil && that1.Key != nil { + if *this.Key != *that1.Key { + return false + } + } else if this.Key != nil { + return false + } else if that1.Key != nil { + return false + } + return true +} +func (this *Secret_Value) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Secret_Value) + if !ok { + that2, ok := that.(Secret_Value) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Secret_Value") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Secret_Value but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Secret_Value but is not nil && this == nil") + } + if !bytes.Equal(this.Data, that1.Data) { + return fmt.Errorf("Data this(%v) Not Equal that(%v)", this.Data, that1.Data) + } + return nil +} +func (this *Secret_Value) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Secret_Value) + if !ok { + that2, ok := that.(Secret_Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !bytes.Equal(this.Data, that1.Data) { + return false + } + return true +} +func (this *RateLimit) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*RateLimit) + if !ok { + that2, ok := that.(RateLimit) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *RateLimit") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *RateLimit but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *RateLimit but is not nil && this == nil") + } + if this.QPS != nil && that1.QPS != nil { + if *this.QPS != *that1.QPS { + return fmt.Errorf("QPS this(%v) Not Equal that(%v)", *this.QPS, *that1.QPS) + } + } else if this.QPS != nil { + return fmt.Errorf("this.QPS == nil && that.QPS != nil") + } else if that1.QPS != nil { + return fmt.Errorf("QPS this(%v) Not Equal that(%v)", this.QPS, that1.QPS) + } + if this.Principal != that1.Principal { + return fmt.Errorf("Principal this(%v) Not Equal that(%v)", this.Principal, that1.Principal) + } + if this.Capacity != nil && that1.Capacity != nil { + if *this.Capacity != *that1.Capacity { + return fmt.Errorf("Capacity this(%v) Not Equal that(%v)", *this.Capacity, *that1.Capacity) + } + } else if this.Capacity != nil { + return fmt.Errorf("this.Capacity == nil && that.Capacity != nil") + } else if that1.Capacity != nil { + return fmt.Errorf("Capacity this(%v) Not Equal that(%v)", this.Capacity, that1.Capacity) + } + return nil +} +func (this *RateLimit) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*RateLimit) + if !ok { + that2, ok := that.(RateLimit) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.QPS != nil && that1.QPS != nil { + if *this.QPS != *that1.QPS { + return false + } + } else if this.QPS != nil { + return false + } else if that1.QPS != nil { + return false + } + if this.Principal != that1.Principal { + return false + } + if this.Capacity != nil && that1.Capacity != nil { + if *this.Capacity != *that1.Capacity { + return false + } + } else if this.Capacity != nil { + return false + } else if that1.Capacity != nil { + return false + } + return true +} +func (this *RateLimits) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*RateLimits) + if !ok { + that2, ok := that.(RateLimits) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *RateLimits") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *RateLimits but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *RateLimits but is not nil && this == nil") + } + if len(this.Limits) != len(that1.Limits) { + return fmt.Errorf("Limits this(%v) Not Equal that(%v)", len(this.Limits), len(that1.Limits)) + } + for i := range this.Limits { + if !this.Limits[i].Equal(&that1.Limits[i]) { + return fmt.Errorf("Limits this[%v](%v) Not Equal that[%v](%v)", i, this.Limits[i], i, that1.Limits[i]) + } + } + if this.AggregateDefaultQPS != nil && that1.AggregateDefaultQPS != nil { + if *this.AggregateDefaultQPS != *that1.AggregateDefaultQPS { + return fmt.Errorf("AggregateDefaultQPS this(%v) Not Equal that(%v)", *this.AggregateDefaultQPS, *that1.AggregateDefaultQPS) + } + } else if this.AggregateDefaultQPS != nil { + return fmt.Errorf("this.AggregateDefaultQPS == nil && that.AggregateDefaultQPS != nil") + } else if that1.AggregateDefaultQPS != nil { + return fmt.Errorf("AggregateDefaultQPS this(%v) Not Equal that(%v)", this.AggregateDefaultQPS, that1.AggregateDefaultQPS) + } + if this.AggregateDefaultCapacity != nil && that1.AggregateDefaultCapacity != nil { + if *this.AggregateDefaultCapacity != *that1.AggregateDefaultCapacity { + return fmt.Errorf("AggregateDefaultCapacity this(%v) Not Equal that(%v)", *this.AggregateDefaultCapacity, *that1.AggregateDefaultCapacity) + } + } else if this.AggregateDefaultCapacity != nil { + return fmt.Errorf("this.AggregateDefaultCapacity == nil && that.AggregateDefaultCapacity != nil") + } else if that1.AggregateDefaultCapacity != nil { + return fmt.Errorf("AggregateDefaultCapacity this(%v) Not Equal that(%v)", this.AggregateDefaultCapacity, that1.AggregateDefaultCapacity) + } + return nil +} +func (this *RateLimits) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*RateLimits) + if !ok { + that2, ok := that.(RateLimits) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Limits) != len(that1.Limits) { + return false + } + for i := range this.Limits { + if !this.Limits[i].Equal(&that1.Limits[i]) { + return false + } + } + if this.AggregateDefaultQPS != nil && that1.AggregateDefaultQPS != nil { + if *this.AggregateDefaultQPS != *that1.AggregateDefaultQPS { + return false + } + } else if this.AggregateDefaultQPS != nil { + return false + } else if that1.AggregateDefaultQPS != nil { + return false + } + if this.AggregateDefaultCapacity != nil && that1.AggregateDefaultCapacity != nil { + if *this.AggregateDefaultCapacity != *that1.AggregateDefaultCapacity { + return false + } + } else if this.AggregateDefaultCapacity != nil { + return false + } else if that1.AggregateDefaultCapacity != nil { + return false + } + return true +} +func (this *Image) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Image) + if !ok { + that2, ok := that.(Image) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Image") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Image but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Image but is not nil && this == nil") + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", *this.Type, *that1.Type) + } + } else if this.Type != nil { + return fmt.Errorf("this.Type == nil && that.Type != nil") + } else if that1.Type != nil { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.Appc.Equal(that1.Appc) { + return fmt.Errorf("Appc this(%v) Not Equal that(%v)", this.Appc, that1.Appc) + } + if !this.Docker.Equal(that1.Docker) { + return fmt.Errorf("Docker this(%v) Not Equal that(%v)", this.Docker, that1.Docker) + } + if this.Cached != nil && that1.Cached != nil { + if *this.Cached != *that1.Cached { + return fmt.Errorf("Cached this(%v) Not Equal that(%v)", *this.Cached, *that1.Cached) + } + } else if this.Cached != nil { + return fmt.Errorf("this.Cached == nil && that.Cached != nil") + } else if that1.Cached != nil { + return fmt.Errorf("Cached this(%v) Not Equal that(%v)", this.Cached, that1.Cached) + } + return nil +} +func (this *Image) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Image) + if !ok { + that2, ok := that.(Image) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return false + } + } else if this.Type != nil { + return false + } else if that1.Type != nil { + return false + } + if !this.Appc.Equal(that1.Appc) { + return false + } + if !this.Docker.Equal(that1.Docker) { + return false + } + if this.Cached != nil && that1.Cached != nil { + if *this.Cached != *that1.Cached { + return false + } + } else if this.Cached != nil { + return false + } else if that1.Cached != nil { + return false + } + return true +} +func (this *Image_Appc) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Image_Appc) + if !ok { + that2, ok := that.(Image_Appc) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Image_Appc") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Image_Appc but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Image_Appc but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.ID != nil && that1.ID != nil { + if *this.ID != *that1.ID { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", *this.ID, *that1.ID) + } + } else if this.ID != nil { + return fmt.Errorf("this.ID == nil && that.ID != nil") + } else if that1.ID != nil { + return fmt.Errorf("ID this(%v) Not Equal that(%v)", this.ID, that1.ID) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + return nil +} +func (this *Image_Appc) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Image_Appc) + if !ok { + that2, ok := that.(Image_Appc) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.ID != nil && that1.ID != nil { + if *this.ID != *that1.ID { + return false + } + } else if this.ID != nil { + return false + } else if that1.ID != nil { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + return true +} +func (this *Image_Docker) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Image_Docker) + if !ok { + that2, ok := that.(Image_Docker) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Image_Docker") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Image_Docker but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Image_Docker but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if !this.Credential.Equal(that1.Credential) { + return fmt.Errorf("Credential this(%v) Not Equal that(%v)", this.Credential, that1.Credential) + } + if !this.Config.Equal(that1.Config) { + return fmt.Errorf("Config this(%v) Not Equal that(%v)", this.Config, that1.Config) + } + return nil +} +func (this *Image_Docker) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Image_Docker) + if !ok { + that2, ok := that.(Image_Docker) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if !this.Credential.Equal(that1.Credential) { + return false + } + if !this.Config.Equal(that1.Config) { + return false + } + return true +} +func (this *MountPropagation) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*MountPropagation) + if !ok { + that2, ok := that.(MountPropagation) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *MountPropagation") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *MountPropagation but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *MountPropagation but is not nil && this == nil") + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", *this.Mode, *that1.Mode) + } + } else if this.Mode != nil { + return fmt.Errorf("this.Mode == nil && that.Mode != nil") + } else if that1.Mode != nil { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", this.Mode, that1.Mode) + } + return nil +} +func (this *MountPropagation) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*MountPropagation) + if !ok { + that2, ok := that.(MountPropagation) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return false + } + } else if this.Mode != nil { + return false + } else if that1.Mode != nil { + return false + } + return true +} +func (this *Volume) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Volume) + if !ok { + that2, ok := that.(Volume) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Volume") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Volume but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Volume but is not nil && this == nil") + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", *this.Mode, *that1.Mode) + } + } else if this.Mode != nil { + return fmt.Errorf("this.Mode == nil && that.Mode != nil") + } else if that1.Mode != nil { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", this.Mode, that1.Mode) + } + if this.ContainerPath != that1.ContainerPath { + return fmt.Errorf("ContainerPath this(%v) Not Equal that(%v)", this.ContainerPath, that1.ContainerPath) + } + if this.HostPath != nil && that1.HostPath != nil { + if *this.HostPath != *that1.HostPath { + return fmt.Errorf("HostPath this(%v) Not Equal that(%v)", *this.HostPath, *that1.HostPath) + } + } else if this.HostPath != nil { + return fmt.Errorf("this.HostPath == nil && that.HostPath != nil") + } else if that1.HostPath != nil { + return fmt.Errorf("HostPath this(%v) Not Equal that(%v)", this.HostPath, that1.HostPath) + } + if !this.Image.Equal(that1.Image) { + return fmt.Errorf("Image this(%v) Not Equal that(%v)", this.Image, that1.Image) + } + if !this.Source.Equal(that1.Source) { + return fmt.Errorf("Source this(%v) Not Equal that(%v)", this.Source, that1.Source) + } + return nil +} +func (this *Volume) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Volume) + if !ok { + that2, ok := that.(Volume) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return false + } + } else if this.Mode != nil { + return false + } else if that1.Mode != nil { + return false + } + if this.ContainerPath != that1.ContainerPath { + return false + } + if this.HostPath != nil && that1.HostPath != nil { + if *this.HostPath != *that1.HostPath { + return false + } + } else if this.HostPath != nil { + return false + } else if that1.HostPath != nil { + return false + } + if !this.Image.Equal(that1.Image) { + return false + } + if !this.Source.Equal(that1.Source) { + return false + } + return true +} +func (this *Volume_Source) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Volume_Source) + if !ok { + that2, ok := that.(Volume_Source) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Volume_Source") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Volume_Source but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Volume_Source but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if !this.DockerVolume.Equal(that1.DockerVolume) { + return fmt.Errorf("DockerVolume this(%v) Not Equal that(%v)", this.DockerVolume, that1.DockerVolume) + } + if !this.HostPath.Equal(that1.HostPath) { + return fmt.Errorf("HostPath this(%v) Not Equal that(%v)", this.HostPath, that1.HostPath) + } + if !this.SandboxPath.Equal(that1.SandboxPath) { + return fmt.Errorf("SandboxPath this(%v) Not Equal that(%v)", this.SandboxPath, that1.SandboxPath) + } + if !this.Secret.Equal(that1.Secret) { + return fmt.Errorf("Secret this(%v) Not Equal that(%v)", this.Secret, that1.Secret) + } + return nil +} +func (this *Volume_Source) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Volume_Source) + if !ok { + that2, ok := that.(Volume_Source) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if !this.DockerVolume.Equal(that1.DockerVolume) { + return false + } + if !this.HostPath.Equal(that1.HostPath) { + return false + } + if !this.SandboxPath.Equal(that1.SandboxPath) { + return false + } + if !this.Secret.Equal(that1.Secret) { + return false + } + return true +} +func (this *Volume_Source_DockerVolume) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Volume_Source_DockerVolume) + if !ok { + that2, ok := that.(Volume_Source_DockerVolume) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Volume_Source_DockerVolume") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Volume_Source_DockerVolume but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Volume_Source_DockerVolume but is not nil && this == nil") + } + if this.Driver != nil && that1.Driver != nil { + if *this.Driver != *that1.Driver { + return fmt.Errorf("Driver this(%v) Not Equal that(%v)", *this.Driver, *that1.Driver) + } + } else if this.Driver != nil { + return fmt.Errorf("this.Driver == nil && that.Driver != nil") + } else if that1.Driver != nil { + return fmt.Errorf("Driver this(%v) Not Equal that(%v)", this.Driver, that1.Driver) + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if !this.DriverOptions.Equal(that1.DriverOptions) { + return fmt.Errorf("DriverOptions this(%v) Not Equal that(%v)", this.DriverOptions, that1.DriverOptions) + } + return nil +} +func (this *Volume_Source_DockerVolume) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Volume_Source_DockerVolume) + if !ok { + that2, ok := that.(Volume_Source_DockerVolume) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Driver != nil && that1.Driver != nil { + if *this.Driver != *that1.Driver { + return false + } + } else if this.Driver != nil { + return false + } else if that1.Driver != nil { + return false + } + if this.Name != that1.Name { + return false + } + if !this.DriverOptions.Equal(that1.DriverOptions) { + return false + } + return true +} +func (this *Volume_Source_HostPath) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Volume_Source_HostPath) + if !ok { + that2, ok := that.(Volume_Source_HostPath) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Volume_Source_HostPath") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Volume_Source_HostPath but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Volume_Source_HostPath but is not nil && this == nil") + } + if this.Path != that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + if !this.MountPropagation.Equal(that1.MountPropagation) { + return fmt.Errorf("MountPropagation this(%v) Not Equal that(%v)", this.MountPropagation, that1.MountPropagation) + } + return nil +} +func (this *Volume_Source_HostPath) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Volume_Source_HostPath) + if !ok { + that2, ok := that.(Volume_Source_HostPath) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Path != that1.Path { + return false + } + if !this.MountPropagation.Equal(that1.MountPropagation) { + return false + } + return true +} +func (this *Volume_Source_SandboxPath) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Volume_Source_SandboxPath) + if !ok { + that2, ok := that.(Volume_Source_SandboxPath) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Volume_Source_SandboxPath") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Volume_Source_SandboxPath but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Volume_Source_SandboxPath but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if this.Path != that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + return nil +} +func (this *Volume_Source_SandboxPath) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Volume_Source_SandboxPath) + if !ok { + that2, ok := that.(Volume_Source_SandboxPath) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if this.Path != that1.Path { + return false + } + return true +} +func (this *NetworkInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*NetworkInfo) + if !ok { + that2, ok := that.(NetworkInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *NetworkInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *NetworkInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *NetworkInfo but is not nil && this == nil") + } + if len(this.IPAddresses) != len(that1.IPAddresses) { + return fmt.Errorf("IPAddresses this(%v) Not Equal that(%v)", len(this.IPAddresses), len(that1.IPAddresses)) + } + for i := range this.IPAddresses { + if !this.IPAddresses[i].Equal(&that1.IPAddresses[i]) { + return fmt.Errorf("IPAddresses this[%v](%v) Not Equal that[%v](%v)", i, this.IPAddresses[i], i, that1.IPAddresses[i]) + } + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", *this.Name, *that1.Name) + } + } else if this.Name != nil { + return fmt.Errorf("this.Name == nil && that.Name != nil") + } else if that1.Name != nil { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if len(this.Groups) != len(that1.Groups) { + return fmt.Errorf("Groups this(%v) Not Equal that(%v)", len(this.Groups), len(that1.Groups)) + } + for i := range this.Groups { + if this.Groups[i] != that1.Groups[i] { + return fmt.Errorf("Groups this[%v](%v) Not Equal that[%v](%v)", i, this.Groups[i], i, that1.Groups[i]) + } + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + if len(this.PortMappings) != len(that1.PortMappings) { + return fmt.Errorf("PortMappings this(%v) Not Equal that(%v)", len(this.PortMappings), len(that1.PortMappings)) + } + for i := range this.PortMappings { + if !this.PortMappings[i].Equal(&that1.PortMappings[i]) { + return fmt.Errorf("PortMappings this[%v](%v) Not Equal that[%v](%v)", i, this.PortMappings[i], i, that1.PortMappings[i]) + } + } + return nil +} +func (this *NetworkInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*NetworkInfo) + if !ok { + that2, ok := that.(NetworkInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.IPAddresses) != len(that1.IPAddresses) { + return false + } + for i := range this.IPAddresses { + if !this.IPAddresses[i].Equal(&that1.IPAddresses[i]) { + return false + } + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return false + } + } else if this.Name != nil { + return false + } else if that1.Name != nil { + return false + } + if len(this.Groups) != len(that1.Groups) { + return false + } + for i := range this.Groups { + if this.Groups[i] != that1.Groups[i] { + return false + } + } + if !this.Labels.Equal(that1.Labels) { + return false + } + if len(this.PortMappings) != len(that1.PortMappings) { + return false + } + for i := range this.PortMappings { + if !this.PortMappings[i].Equal(&that1.PortMappings[i]) { + return false + } + } + return true +} +func (this *NetworkInfo_IPAddress) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*NetworkInfo_IPAddress) + if !ok { + that2, ok := that.(NetworkInfo_IPAddress) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *NetworkInfo_IPAddress") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *NetworkInfo_IPAddress but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *NetworkInfo_IPAddress but is not nil && this == nil") + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", *this.Protocol, *that1.Protocol) + } + } else if this.Protocol != nil { + return fmt.Errorf("this.Protocol == nil && that.Protocol != nil") + } else if that1.Protocol != nil { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", this.Protocol, that1.Protocol) + } + if this.IPAddress != nil && that1.IPAddress != nil { + if *this.IPAddress != *that1.IPAddress { + return fmt.Errorf("IPAddress this(%v) Not Equal that(%v)", *this.IPAddress, *that1.IPAddress) + } + } else if this.IPAddress != nil { + return fmt.Errorf("this.IPAddress == nil && that.IPAddress != nil") + } else if that1.IPAddress != nil { + return fmt.Errorf("IPAddress this(%v) Not Equal that(%v)", this.IPAddress, that1.IPAddress) + } + return nil +} +func (this *NetworkInfo_IPAddress) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*NetworkInfo_IPAddress) + if !ok { + that2, ok := that.(NetworkInfo_IPAddress) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return false + } + } else if this.Protocol != nil { + return false + } else if that1.Protocol != nil { + return false + } + if this.IPAddress != nil && that1.IPAddress != nil { + if *this.IPAddress != *that1.IPAddress { + return false + } + } else if this.IPAddress != nil { + return false + } else if that1.IPAddress != nil { + return false + } + return true +} +func (this *NetworkInfo_PortMapping) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*NetworkInfo_PortMapping) + if !ok { + that2, ok := that.(NetworkInfo_PortMapping) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *NetworkInfo_PortMapping") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *NetworkInfo_PortMapping but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *NetworkInfo_PortMapping but is not nil && this == nil") + } + if this.HostPort != that1.HostPort { + return fmt.Errorf("HostPort this(%v) Not Equal that(%v)", this.HostPort, that1.HostPort) + } + if this.ContainerPort != that1.ContainerPort { + return fmt.Errorf("ContainerPort this(%v) Not Equal that(%v)", this.ContainerPort, that1.ContainerPort) + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", *this.Protocol, *that1.Protocol) + } + } else if this.Protocol != nil { + return fmt.Errorf("this.Protocol == nil && that.Protocol != nil") + } else if that1.Protocol != nil { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", this.Protocol, that1.Protocol) + } + return nil +} +func (this *NetworkInfo_PortMapping) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*NetworkInfo_PortMapping) + if !ok { + that2, ok := that.(NetworkInfo_PortMapping) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.HostPort != that1.HostPort { + return false + } + if this.ContainerPort != that1.ContainerPort { + return false + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return false + } + } else if this.Protocol != nil { + return false + } else if that1.Protocol != nil { + return false + } + return true +} +func (this *CapabilityInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CapabilityInfo) + if !ok { + that2, ok := that.(CapabilityInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CapabilityInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CapabilityInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CapabilityInfo but is not nil && this == nil") + } + if len(this.Capabilities) != len(that1.Capabilities) { + return fmt.Errorf("Capabilities this(%v) Not Equal that(%v)", len(this.Capabilities), len(that1.Capabilities)) + } + for i := range this.Capabilities { + if this.Capabilities[i] != that1.Capabilities[i] { + return fmt.Errorf("Capabilities this[%v](%v) Not Equal that[%v](%v)", i, this.Capabilities[i], i, that1.Capabilities[i]) + } + } + return nil +} +func (this *CapabilityInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CapabilityInfo) + if !ok { + that2, ok := that.(CapabilityInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Capabilities) != len(that1.Capabilities) { + return false + } + for i := range this.Capabilities { + if this.Capabilities[i] != that1.Capabilities[i] { + return false + } + } + return true +} +func (this *LinuxInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*LinuxInfo) + if !ok { + that2, ok := that.(LinuxInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *LinuxInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *LinuxInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *LinuxInfo but is not nil && this == nil") + } + if !this.CapabilityInfo.Equal(that1.CapabilityInfo) { + return fmt.Errorf("CapabilityInfo this(%v) Not Equal that(%v)", this.CapabilityInfo, that1.CapabilityInfo) + } + if !this.BoundingCapabilities.Equal(that1.BoundingCapabilities) { + return fmt.Errorf("BoundingCapabilities this(%v) Not Equal that(%v)", this.BoundingCapabilities, that1.BoundingCapabilities) + } + if !this.EffectiveCapabilities.Equal(that1.EffectiveCapabilities) { + return fmt.Errorf("EffectiveCapabilities this(%v) Not Equal that(%v)", this.EffectiveCapabilities, that1.EffectiveCapabilities) + } + if this.SharePIDNamespace != nil && that1.SharePIDNamespace != nil { + if *this.SharePIDNamespace != *that1.SharePIDNamespace { + return fmt.Errorf("SharePIDNamespace this(%v) Not Equal that(%v)", *this.SharePIDNamespace, *that1.SharePIDNamespace) + } + } else if this.SharePIDNamespace != nil { + return fmt.Errorf("this.SharePIDNamespace == nil && that.SharePIDNamespace != nil") + } else if that1.SharePIDNamespace != nil { + return fmt.Errorf("SharePIDNamespace this(%v) Not Equal that(%v)", this.SharePIDNamespace, that1.SharePIDNamespace) + } + return nil +} +func (this *LinuxInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*LinuxInfo) + if !ok { + that2, ok := that.(LinuxInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.CapabilityInfo.Equal(that1.CapabilityInfo) { + return false + } + if !this.BoundingCapabilities.Equal(that1.BoundingCapabilities) { + return false + } + if !this.EffectiveCapabilities.Equal(that1.EffectiveCapabilities) { + return false + } + if this.SharePIDNamespace != nil && that1.SharePIDNamespace != nil { + if *this.SharePIDNamespace != *that1.SharePIDNamespace { + return false + } + } else if this.SharePIDNamespace != nil { + return false + } else if that1.SharePIDNamespace != nil { + return false + } + return true +} +func (this *RLimitInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*RLimitInfo) + if !ok { + that2, ok := that.(RLimitInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *RLimitInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *RLimitInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *RLimitInfo but is not nil && this == nil") + } + if len(this.Rlimits) != len(that1.Rlimits) { + return fmt.Errorf("Rlimits this(%v) Not Equal that(%v)", len(this.Rlimits), len(that1.Rlimits)) + } + for i := range this.Rlimits { + if !this.Rlimits[i].Equal(&that1.Rlimits[i]) { + return fmt.Errorf("Rlimits this[%v](%v) Not Equal that[%v](%v)", i, this.Rlimits[i], i, that1.Rlimits[i]) + } + } + return nil +} +func (this *RLimitInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*RLimitInfo) + if !ok { + that2, ok := that.(RLimitInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Rlimits) != len(that1.Rlimits) { + return false + } + for i := range this.Rlimits { + if !this.Rlimits[i].Equal(&that1.Rlimits[i]) { + return false + } + } + return true +} +func (this *RLimitInfo_RLimit) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*RLimitInfo_RLimit) + if !ok { + that2, ok := that.(RLimitInfo_RLimit) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *RLimitInfo_RLimit") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *RLimitInfo_RLimit but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *RLimitInfo_RLimit but is not nil && this == nil") + } + if this.Type != that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if this.Hard != nil && that1.Hard != nil { + if *this.Hard != *that1.Hard { + return fmt.Errorf("Hard this(%v) Not Equal that(%v)", *this.Hard, *that1.Hard) + } + } else if this.Hard != nil { + return fmt.Errorf("this.Hard == nil && that.Hard != nil") + } else if that1.Hard != nil { + return fmt.Errorf("Hard this(%v) Not Equal that(%v)", this.Hard, that1.Hard) + } + if this.Soft != nil && that1.Soft != nil { + if *this.Soft != *that1.Soft { + return fmt.Errorf("Soft this(%v) Not Equal that(%v)", *this.Soft, *that1.Soft) + } + } else if this.Soft != nil { + return fmt.Errorf("this.Soft == nil && that.Soft != nil") + } else if that1.Soft != nil { + return fmt.Errorf("Soft this(%v) Not Equal that(%v)", this.Soft, that1.Soft) + } + return nil +} +func (this *RLimitInfo_RLimit) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*RLimitInfo_RLimit) + if !ok { + that2, ok := that.(RLimitInfo_RLimit) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != that1.Type { + return false + } + if this.Hard != nil && that1.Hard != nil { + if *this.Hard != *that1.Hard { + return false + } + } else if this.Hard != nil { + return false + } else if that1.Hard != nil { + return false + } + if this.Soft != nil && that1.Soft != nil { + if *this.Soft != *that1.Soft { + return false + } + } else if this.Soft != nil { + return false + } else if that1.Soft != nil { + return false + } + return true +} +func (this *TTYInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TTYInfo) + if !ok { + that2, ok := that.(TTYInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TTYInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TTYInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TTYInfo but is not nil && this == nil") + } + if !this.WindowSize.Equal(that1.WindowSize) { + return fmt.Errorf("WindowSize this(%v) Not Equal that(%v)", this.WindowSize, that1.WindowSize) + } + return nil +} +func (this *TTYInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TTYInfo) + if !ok { + that2, ok := that.(TTYInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.WindowSize.Equal(that1.WindowSize) { + return false + } + return true +} +func (this *TTYInfo_WindowSize) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*TTYInfo_WindowSize) + if !ok { + that2, ok := that.(TTYInfo_WindowSize) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *TTYInfo_WindowSize") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *TTYInfo_WindowSize but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *TTYInfo_WindowSize but is not nil && this == nil") + } + if this.Rows != that1.Rows { + return fmt.Errorf("Rows this(%v) Not Equal that(%v)", this.Rows, that1.Rows) + } + if this.Columns != that1.Columns { + return fmt.Errorf("Columns this(%v) Not Equal that(%v)", this.Columns, that1.Columns) + } + return nil +} +func (this *TTYInfo_WindowSize) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*TTYInfo_WindowSize) + if !ok { + that2, ok := that.(TTYInfo_WindowSize) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Rows != that1.Rows { + return false + } + if this.Columns != that1.Columns { + return false + } + return true +} +func (this *ContainerInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ContainerInfo) + if !ok { + that2, ok := that.(ContainerInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ContainerInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ContainerInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ContainerInfo but is not nil && this == nil") + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", *this.Type, *that1.Type) + } + } else if this.Type != nil { + return fmt.Errorf("this.Type == nil && that.Type != nil") + } else if that1.Type != nil { + return fmt.Errorf("Type this(%v) Not Equal that(%v)", this.Type, that1.Type) + } + if len(this.Volumes) != len(that1.Volumes) { + return fmt.Errorf("Volumes this(%v) Not Equal that(%v)", len(this.Volumes), len(that1.Volumes)) + } + for i := range this.Volumes { + if !this.Volumes[i].Equal(&that1.Volumes[i]) { + return fmt.Errorf("Volumes this[%v](%v) Not Equal that[%v](%v)", i, this.Volumes[i], i, that1.Volumes[i]) + } + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", *this.Hostname, *that1.Hostname) + } + } else if this.Hostname != nil { + return fmt.Errorf("this.Hostname == nil && that.Hostname != nil") + } else if that1.Hostname != nil { + return fmt.Errorf("Hostname this(%v) Not Equal that(%v)", this.Hostname, that1.Hostname) + } + if !this.Docker.Equal(that1.Docker) { + return fmt.Errorf("Docker this(%v) Not Equal that(%v)", this.Docker, that1.Docker) + } + if !this.Mesos.Equal(that1.Mesos) { + return fmt.Errorf("Mesos this(%v) Not Equal that(%v)", this.Mesos, that1.Mesos) + } + if len(this.NetworkInfos) != len(that1.NetworkInfos) { + return fmt.Errorf("NetworkInfos this(%v) Not Equal that(%v)", len(this.NetworkInfos), len(that1.NetworkInfos)) + } + for i := range this.NetworkInfos { + if !this.NetworkInfos[i].Equal(&that1.NetworkInfos[i]) { + return fmt.Errorf("NetworkInfos this[%v](%v) Not Equal that[%v](%v)", i, this.NetworkInfos[i], i, that1.NetworkInfos[i]) + } + } + if !this.LinuxInfo.Equal(that1.LinuxInfo) { + return fmt.Errorf("LinuxInfo this(%v) Not Equal that(%v)", this.LinuxInfo, that1.LinuxInfo) + } + if !this.RlimitInfo.Equal(that1.RlimitInfo) { + return fmt.Errorf("RlimitInfo this(%v) Not Equal that(%v)", this.RlimitInfo, that1.RlimitInfo) + } + if !this.TTYInfo.Equal(that1.TTYInfo) { + return fmt.Errorf("TTYInfo this(%v) Not Equal that(%v)", this.TTYInfo, that1.TTYInfo) + } + return nil +} +func (this *ContainerInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ContainerInfo) + if !ok { + that2, ok := that.(ContainerInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Type != nil && that1.Type != nil { + if *this.Type != *that1.Type { + return false + } + } else if this.Type != nil { + return false + } else if that1.Type != nil { + return false + } + if len(this.Volumes) != len(that1.Volumes) { + return false + } + for i := range this.Volumes { + if !this.Volumes[i].Equal(&that1.Volumes[i]) { + return false + } + } + if this.Hostname != nil && that1.Hostname != nil { + if *this.Hostname != *that1.Hostname { + return false + } + } else if this.Hostname != nil { + return false + } else if that1.Hostname != nil { + return false + } + if !this.Docker.Equal(that1.Docker) { + return false + } + if !this.Mesos.Equal(that1.Mesos) { + return false + } + if len(this.NetworkInfos) != len(that1.NetworkInfos) { + return false + } + for i := range this.NetworkInfos { + if !this.NetworkInfos[i].Equal(&that1.NetworkInfos[i]) { + return false + } + } + if !this.LinuxInfo.Equal(that1.LinuxInfo) { + return false + } + if !this.RlimitInfo.Equal(that1.RlimitInfo) { + return false + } + if !this.TTYInfo.Equal(that1.TTYInfo) { + return false + } + return true +} +func (this *ContainerInfo_DockerInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ContainerInfo_DockerInfo) + if !ok { + that2, ok := that.(ContainerInfo_DockerInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ContainerInfo_DockerInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ContainerInfo_DockerInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ContainerInfo_DockerInfo but is not nil && this == nil") + } + if this.Image != that1.Image { + return fmt.Errorf("Image this(%v) Not Equal that(%v)", this.Image, that1.Image) + } + if this.Network != nil && that1.Network != nil { + if *this.Network != *that1.Network { + return fmt.Errorf("Network this(%v) Not Equal that(%v)", *this.Network, *that1.Network) + } + } else if this.Network != nil { + return fmt.Errorf("this.Network == nil && that.Network != nil") + } else if that1.Network != nil { + return fmt.Errorf("Network this(%v) Not Equal that(%v)", this.Network, that1.Network) + } + if len(this.PortMappings) != len(that1.PortMappings) { + return fmt.Errorf("PortMappings this(%v) Not Equal that(%v)", len(this.PortMappings), len(that1.PortMappings)) + } + for i := range this.PortMappings { + if !this.PortMappings[i].Equal(&that1.PortMappings[i]) { + return fmt.Errorf("PortMappings this[%v](%v) Not Equal that[%v](%v)", i, this.PortMappings[i], i, that1.PortMappings[i]) + } + } + if this.Privileged != nil && that1.Privileged != nil { + if *this.Privileged != *that1.Privileged { + return fmt.Errorf("Privileged this(%v) Not Equal that(%v)", *this.Privileged, *that1.Privileged) + } + } else if this.Privileged != nil { + return fmt.Errorf("this.Privileged == nil && that.Privileged != nil") + } else if that1.Privileged != nil { + return fmt.Errorf("Privileged this(%v) Not Equal that(%v)", this.Privileged, that1.Privileged) + } + if len(this.Parameters) != len(that1.Parameters) { + return fmt.Errorf("Parameters this(%v) Not Equal that(%v)", len(this.Parameters), len(that1.Parameters)) + } + for i := range this.Parameters { + if !this.Parameters[i].Equal(&that1.Parameters[i]) { + return fmt.Errorf("Parameters this[%v](%v) Not Equal that[%v](%v)", i, this.Parameters[i], i, that1.Parameters[i]) + } + } + if this.ForcePullImage != nil && that1.ForcePullImage != nil { + if *this.ForcePullImage != *that1.ForcePullImage { + return fmt.Errorf("ForcePullImage this(%v) Not Equal that(%v)", *this.ForcePullImage, *that1.ForcePullImage) + } + } else if this.ForcePullImage != nil { + return fmt.Errorf("this.ForcePullImage == nil && that.ForcePullImage != nil") + } else if that1.ForcePullImage != nil { + return fmt.Errorf("ForcePullImage this(%v) Not Equal that(%v)", this.ForcePullImage, that1.ForcePullImage) + } + if this.VolumeDriver != nil && that1.VolumeDriver != nil { + if *this.VolumeDriver != *that1.VolumeDriver { + return fmt.Errorf("VolumeDriver this(%v) Not Equal that(%v)", *this.VolumeDriver, *that1.VolumeDriver) + } + } else if this.VolumeDriver != nil { + return fmt.Errorf("this.VolumeDriver == nil && that.VolumeDriver != nil") + } else if that1.VolumeDriver != nil { + return fmt.Errorf("VolumeDriver this(%v) Not Equal that(%v)", this.VolumeDriver, that1.VolumeDriver) + } + return nil +} +func (this *ContainerInfo_DockerInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ContainerInfo_DockerInfo) + if !ok { + that2, ok := that.(ContainerInfo_DockerInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Image != that1.Image { + return false + } + if this.Network != nil && that1.Network != nil { + if *this.Network != *that1.Network { + return false + } + } else if this.Network != nil { + return false + } else if that1.Network != nil { + return false + } + if len(this.PortMappings) != len(that1.PortMappings) { + return false + } + for i := range this.PortMappings { + if !this.PortMappings[i].Equal(&that1.PortMappings[i]) { + return false + } + } + if this.Privileged != nil && that1.Privileged != nil { + if *this.Privileged != *that1.Privileged { + return false + } + } else if this.Privileged != nil { + return false + } else if that1.Privileged != nil { + return false + } + if len(this.Parameters) != len(that1.Parameters) { + return false + } + for i := range this.Parameters { + if !this.Parameters[i].Equal(&that1.Parameters[i]) { + return false + } + } + if this.ForcePullImage != nil && that1.ForcePullImage != nil { + if *this.ForcePullImage != *that1.ForcePullImage { + return false + } + } else if this.ForcePullImage != nil { + return false + } else if that1.ForcePullImage != nil { + return false + } + if this.VolumeDriver != nil && that1.VolumeDriver != nil { + if *this.VolumeDriver != *that1.VolumeDriver { + return false + } + } else if this.VolumeDriver != nil { + return false + } else if that1.VolumeDriver != nil { + return false + } + return true +} +func (this *ContainerInfo_DockerInfo_PortMapping) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ContainerInfo_DockerInfo_PortMapping) + if !ok { + that2, ok := that.(ContainerInfo_DockerInfo_PortMapping) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ContainerInfo_DockerInfo_PortMapping") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ContainerInfo_DockerInfo_PortMapping but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ContainerInfo_DockerInfo_PortMapping but is not nil && this == nil") + } + if this.HostPort != that1.HostPort { + return fmt.Errorf("HostPort this(%v) Not Equal that(%v)", this.HostPort, that1.HostPort) + } + if this.ContainerPort != that1.ContainerPort { + return fmt.Errorf("ContainerPort this(%v) Not Equal that(%v)", this.ContainerPort, that1.ContainerPort) + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", *this.Protocol, *that1.Protocol) + } + } else if this.Protocol != nil { + return fmt.Errorf("this.Protocol == nil && that.Protocol != nil") + } else if that1.Protocol != nil { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", this.Protocol, that1.Protocol) + } + return nil +} +func (this *ContainerInfo_DockerInfo_PortMapping) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ContainerInfo_DockerInfo_PortMapping) + if !ok { + that2, ok := that.(ContainerInfo_DockerInfo_PortMapping) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.HostPort != that1.HostPort { + return false + } + if this.ContainerPort != that1.ContainerPort { + return false + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return false + } + } else if this.Protocol != nil { + return false + } else if that1.Protocol != nil { + return false + } + return true +} +func (this *ContainerInfo_MesosInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ContainerInfo_MesosInfo) + if !ok { + that2, ok := that.(ContainerInfo_MesosInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ContainerInfo_MesosInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ContainerInfo_MesosInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ContainerInfo_MesosInfo but is not nil && this == nil") + } + if !this.Image.Equal(that1.Image) { + return fmt.Errorf("Image this(%v) Not Equal that(%v)", this.Image, that1.Image) + } + return nil +} +func (this *ContainerInfo_MesosInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ContainerInfo_MesosInfo) + if !ok { + that2, ok := that.(ContainerInfo_MesosInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Image.Equal(that1.Image) { + return false + } + return true +} +func (this *ContainerStatus) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*ContainerStatus) + if !ok { + that2, ok := that.(ContainerStatus) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *ContainerStatus") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *ContainerStatus but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *ContainerStatus but is not nil && this == nil") + } + if !this.ContainerID.Equal(that1.ContainerID) { + return fmt.Errorf("ContainerID this(%v) Not Equal that(%v)", this.ContainerID, that1.ContainerID) + } + if len(this.NetworkInfos) != len(that1.NetworkInfos) { + return fmt.Errorf("NetworkInfos this(%v) Not Equal that(%v)", len(this.NetworkInfos), len(that1.NetworkInfos)) + } + for i := range this.NetworkInfos { + if !this.NetworkInfos[i].Equal(&that1.NetworkInfos[i]) { + return fmt.Errorf("NetworkInfos this[%v](%v) Not Equal that[%v](%v)", i, this.NetworkInfos[i], i, that1.NetworkInfos[i]) + } + } + if !this.CgroupInfo.Equal(that1.CgroupInfo) { + return fmt.Errorf("CgroupInfo this(%v) Not Equal that(%v)", this.CgroupInfo, that1.CgroupInfo) + } + if this.ExecutorPID != nil && that1.ExecutorPID != nil { + if *this.ExecutorPID != *that1.ExecutorPID { + return fmt.Errorf("ExecutorPID this(%v) Not Equal that(%v)", *this.ExecutorPID, *that1.ExecutorPID) + } + } else if this.ExecutorPID != nil { + return fmt.Errorf("this.ExecutorPID == nil && that.ExecutorPID != nil") + } else if that1.ExecutorPID != nil { + return fmt.Errorf("ExecutorPID this(%v) Not Equal that(%v)", this.ExecutorPID, that1.ExecutorPID) + } + return nil +} +func (this *ContainerStatus) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*ContainerStatus) + if !ok { + that2, ok := that.(ContainerStatus) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.ContainerID.Equal(that1.ContainerID) { + return false + } + if len(this.NetworkInfos) != len(that1.NetworkInfos) { + return false + } + for i := range this.NetworkInfos { + if !this.NetworkInfos[i].Equal(&that1.NetworkInfos[i]) { + return false + } + } + if !this.CgroupInfo.Equal(that1.CgroupInfo) { + return false + } + if this.ExecutorPID != nil && that1.ExecutorPID != nil { + if *this.ExecutorPID != *that1.ExecutorPID { + return false + } + } else if this.ExecutorPID != nil { + return false + } else if that1.ExecutorPID != nil { + return false + } + return true +} +func (this *CgroupInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo) + if !ok { + that2, ok := that.(CgroupInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo but is not nil && this == nil") + } + if !this.NetCLS.Equal(that1.NetCLS) { + return fmt.Errorf("NetCLS this(%v) Not Equal that(%v)", this.NetCLS, that1.NetCLS) + } + return nil +} +func (this *CgroupInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo) + if !ok { + that2, ok := that.(CgroupInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.NetCLS.Equal(that1.NetCLS) { + return false + } + return true +} +func (this *CgroupInfo_Blkio) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_Blkio) + if !ok { + that2, ok := that.(CgroupInfo_Blkio) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_Blkio") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_Blkio but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_Blkio but is not nil && this == nil") + } + return nil +} +func (this *CgroupInfo_Blkio) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_Blkio) + if !ok { + that2, ok := that.(CgroupInfo_Blkio) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + return true +} +func (this *CgroupInfo_Blkio_Value) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_Blkio_Value) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Value) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_Blkio_Value") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_Blkio_Value but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_Blkio_Value but is not nil && this == nil") + } + if this.Op != nil && that1.Op != nil { + if *this.Op != *that1.Op { + return fmt.Errorf("Op this(%v) Not Equal that(%v)", *this.Op, *that1.Op) + } + } else if this.Op != nil { + return fmt.Errorf("this.Op == nil && that.Op != nil") + } else if that1.Op != nil { + return fmt.Errorf("Op this(%v) Not Equal that(%v)", this.Op, that1.Op) + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", *this.Value, *that1.Value) + } + } else if this.Value != nil { + return fmt.Errorf("this.Value == nil && that.Value != nil") + } else if that1.Value != nil { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *CgroupInfo_Blkio_Value) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_Blkio_Value) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Value) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Op != nil && that1.Op != nil { + if *this.Op != *that1.Op { + return false + } + } else if this.Op != nil { + return false + } else if that1.Op != nil { + return false + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return false + } + } else if this.Value != nil { + return false + } else if that1.Value != nil { + return false + } + return true +} +func (this *CgroupInfo_Blkio_CFQ) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_Blkio_CFQ) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_CFQ) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_Blkio_CFQ") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_Blkio_CFQ but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_Blkio_CFQ but is not nil && this == nil") + } + return nil +} +func (this *CgroupInfo_Blkio_CFQ) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_Blkio_CFQ) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_CFQ) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + return true +} +func (this *CgroupInfo_Blkio_CFQ_Statistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_Blkio_CFQ_Statistics) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_CFQ_Statistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_Blkio_CFQ_Statistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_Blkio_CFQ_Statistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_Blkio_CFQ_Statistics but is not nil && this == nil") + } + if !this.Device.Equal(that1.Device) { + return fmt.Errorf("Device this(%v) Not Equal that(%v)", this.Device, that1.Device) + } + if this.Sectors != nil && that1.Sectors != nil { + if *this.Sectors != *that1.Sectors { + return fmt.Errorf("Sectors this(%v) Not Equal that(%v)", *this.Sectors, *that1.Sectors) + } + } else if this.Sectors != nil { + return fmt.Errorf("this.Sectors == nil && that.Sectors != nil") + } else if that1.Sectors != nil { + return fmt.Errorf("Sectors this(%v) Not Equal that(%v)", this.Sectors, that1.Sectors) + } + if this.Time != nil && that1.Time != nil { + if *this.Time != *that1.Time { + return fmt.Errorf("Time this(%v) Not Equal that(%v)", *this.Time, *that1.Time) + } + } else if this.Time != nil { + return fmt.Errorf("this.Time == nil && that.Time != nil") + } else if that1.Time != nil { + return fmt.Errorf("Time this(%v) Not Equal that(%v)", this.Time, that1.Time) + } + if len(this.IOServiced) != len(that1.IOServiced) { + return fmt.Errorf("IOServiced this(%v) Not Equal that(%v)", len(this.IOServiced), len(that1.IOServiced)) + } + for i := range this.IOServiced { + if !this.IOServiced[i].Equal(&that1.IOServiced[i]) { + return fmt.Errorf("IOServiced this[%v](%v) Not Equal that[%v](%v)", i, this.IOServiced[i], i, that1.IOServiced[i]) + } + } + if len(this.IOServiceBytes) != len(that1.IOServiceBytes) { + return fmt.Errorf("IOServiceBytes this(%v) Not Equal that(%v)", len(this.IOServiceBytes), len(that1.IOServiceBytes)) + } + for i := range this.IOServiceBytes { + if !this.IOServiceBytes[i].Equal(&that1.IOServiceBytes[i]) { + return fmt.Errorf("IOServiceBytes this[%v](%v) Not Equal that[%v](%v)", i, this.IOServiceBytes[i], i, that1.IOServiceBytes[i]) + } + } + if len(this.IOServiceTime) != len(that1.IOServiceTime) { + return fmt.Errorf("IOServiceTime this(%v) Not Equal that(%v)", len(this.IOServiceTime), len(that1.IOServiceTime)) + } + for i := range this.IOServiceTime { + if !this.IOServiceTime[i].Equal(&that1.IOServiceTime[i]) { + return fmt.Errorf("IOServiceTime this[%v](%v) Not Equal that[%v](%v)", i, this.IOServiceTime[i], i, that1.IOServiceTime[i]) + } + } + if len(this.IOWaitTime) != len(that1.IOWaitTime) { + return fmt.Errorf("IOWaitTime this(%v) Not Equal that(%v)", len(this.IOWaitTime), len(that1.IOWaitTime)) + } + for i := range this.IOWaitTime { + if !this.IOWaitTime[i].Equal(&that1.IOWaitTime[i]) { + return fmt.Errorf("IOWaitTime this[%v](%v) Not Equal that[%v](%v)", i, this.IOWaitTime[i], i, that1.IOWaitTime[i]) + } + } + if len(this.IOMerged) != len(that1.IOMerged) { + return fmt.Errorf("IOMerged this(%v) Not Equal that(%v)", len(this.IOMerged), len(that1.IOMerged)) + } + for i := range this.IOMerged { + if !this.IOMerged[i].Equal(&that1.IOMerged[i]) { + return fmt.Errorf("IOMerged this[%v](%v) Not Equal that[%v](%v)", i, this.IOMerged[i], i, that1.IOMerged[i]) + } + } + if len(this.IOQueued) != len(that1.IOQueued) { + return fmt.Errorf("IOQueued this(%v) Not Equal that(%v)", len(this.IOQueued), len(that1.IOQueued)) + } + for i := range this.IOQueued { + if !this.IOQueued[i].Equal(&that1.IOQueued[i]) { + return fmt.Errorf("IOQueued this[%v](%v) Not Equal that[%v](%v)", i, this.IOQueued[i], i, that1.IOQueued[i]) + } + } + return nil +} +func (this *CgroupInfo_Blkio_CFQ_Statistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_Blkio_CFQ_Statistics) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_CFQ_Statistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Device.Equal(that1.Device) { + return false + } + if this.Sectors != nil && that1.Sectors != nil { + if *this.Sectors != *that1.Sectors { + return false + } + } else if this.Sectors != nil { + return false + } else if that1.Sectors != nil { + return false + } + if this.Time != nil && that1.Time != nil { + if *this.Time != *that1.Time { + return false + } + } else if this.Time != nil { + return false + } else if that1.Time != nil { + return false + } + if len(this.IOServiced) != len(that1.IOServiced) { + return false + } + for i := range this.IOServiced { + if !this.IOServiced[i].Equal(&that1.IOServiced[i]) { + return false + } + } + if len(this.IOServiceBytes) != len(that1.IOServiceBytes) { + return false + } + for i := range this.IOServiceBytes { + if !this.IOServiceBytes[i].Equal(&that1.IOServiceBytes[i]) { + return false + } + } + if len(this.IOServiceTime) != len(that1.IOServiceTime) { + return false + } + for i := range this.IOServiceTime { + if !this.IOServiceTime[i].Equal(&that1.IOServiceTime[i]) { + return false + } + } + if len(this.IOWaitTime) != len(that1.IOWaitTime) { + return false + } + for i := range this.IOWaitTime { + if !this.IOWaitTime[i].Equal(&that1.IOWaitTime[i]) { + return false + } + } + if len(this.IOMerged) != len(that1.IOMerged) { + return false + } + for i := range this.IOMerged { + if !this.IOMerged[i].Equal(&that1.IOMerged[i]) { + return false + } + } + if len(this.IOQueued) != len(that1.IOQueued) { + return false + } + for i := range this.IOQueued { + if !this.IOQueued[i].Equal(&that1.IOQueued[i]) { + return false + } + } + return true +} +func (this *CgroupInfo_Blkio_Throttling) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_Blkio_Throttling) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Throttling) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_Blkio_Throttling") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_Blkio_Throttling but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_Blkio_Throttling but is not nil && this == nil") + } + return nil +} +func (this *CgroupInfo_Blkio_Throttling) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_Blkio_Throttling) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Throttling) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + return true +} +func (this *CgroupInfo_Blkio_Throttling_Statistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_Blkio_Throttling_Statistics) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Throttling_Statistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_Blkio_Throttling_Statistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_Blkio_Throttling_Statistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_Blkio_Throttling_Statistics but is not nil && this == nil") + } + if !this.Device.Equal(that1.Device) { + return fmt.Errorf("Device this(%v) Not Equal that(%v)", this.Device, that1.Device) + } + if len(this.IOServiced) != len(that1.IOServiced) { + return fmt.Errorf("IOServiced this(%v) Not Equal that(%v)", len(this.IOServiced), len(that1.IOServiced)) + } + for i := range this.IOServiced { + if !this.IOServiced[i].Equal(&that1.IOServiced[i]) { + return fmt.Errorf("IOServiced this[%v](%v) Not Equal that[%v](%v)", i, this.IOServiced[i], i, that1.IOServiced[i]) + } + } + if len(this.IOServiceBytes) != len(that1.IOServiceBytes) { + return fmt.Errorf("IOServiceBytes this(%v) Not Equal that(%v)", len(this.IOServiceBytes), len(that1.IOServiceBytes)) + } + for i := range this.IOServiceBytes { + if !this.IOServiceBytes[i].Equal(&that1.IOServiceBytes[i]) { + return fmt.Errorf("IOServiceBytes this[%v](%v) Not Equal that[%v](%v)", i, this.IOServiceBytes[i], i, that1.IOServiceBytes[i]) + } + } + return nil +} +func (this *CgroupInfo_Blkio_Throttling_Statistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_Blkio_Throttling_Statistics) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Throttling_Statistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Device.Equal(that1.Device) { + return false + } + if len(this.IOServiced) != len(that1.IOServiced) { + return false + } + for i := range this.IOServiced { + if !this.IOServiced[i].Equal(&that1.IOServiced[i]) { + return false + } + } + if len(this.IOServiceBytes) != len(that1.IOServiceBytes) { + return false + } + for i := range this.IOServiceBytes { + if !this.IOServiceBytes[i].Equal(&that1.IOServiceBytes[i]) { + return false + } + } + return true +} +func (this *CgroupInfo_Blkio_Statistics) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_Blkio_Statistics) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Statistics) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_Blkio_Statistics") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_Blkio_Statistics but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_Blkio_Statistics but is not nil && this == nil") + } + if len(this.CFQ) != len(that1.CFQ) { + return fmt.Errorf("CFQ this(%v) Not Equal that(%v)", len(this.CFQ), len(that1.CFQ)) + } + for i := range this.CFQ { + if !this.CFQ[i].Equal(&that1.CFQ[i]) { + return fmt.Errorf("CFQ this[%v](%v) Not Equal that[%v](%v)", i, this.CFQ[i], i, that1.CFQ[i]) + } + } + if len(this.CFQRecursive) != len(that1.CFQRecursive) { + return fmt.Errorf("CFQRecursive this(%v) Not Equal that(%v)", len(this.CFQRecursive), len(that1.CFQRecursive)) + } + for i := range this.CFQRecursive { + if !this.CFQRecursive[i].Equal(&that1.CFQRecursive[i]) { + return fmt.Errorf("CFQRecursive this[%v](%v) Not Equal that[%v](%v)", i, this.CFQRecursive[i], i, that1.CFQRecursive[i]) + } + } + if len(this.Throttling) != len(that1.Throttling) { + return fmt.Errorf("Throttling this(%v) Not Equal that(%v)", len(this.Throttling), len(that1.Throttling)) + } + for i := range this.Throttling { + if !this.Throttling[i].Equal(that1.Throttling[i]) { + return fmt.Errorf("Throttling this[%v](%v) Not Equal that[%v](%v)", i, this.Throttling[i], i, that1.Throttling[i]) + } + } + return nil +} +func (this *CgroupInfo_Blkio_Statistics) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_Blkio_Statistics) + if !ok { + that2, ok := that.(CgroupInfo_Blkio_Statistics) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.CFQ) != len(that1.CFQ) { + return false + } + for i := range this.CFQ { + if !this.CFQ[i].Equal(&that1.CFQ[i]) { + return false + } + } + if len(this.CFQRecursive) != len(that1.CFQRecursive) { + return false + } + for i := range this.CFQRecursive { + if !this.CFQRecursive[i].Equal(&that1.CFQRecursive[i]) { + return false + } + } + if len(this.Throttling) != len(that1.Throttling) { + return false + } + for i := range this.Throttling { + if !this.Throttling[i].Equal(that1.Throttling[i]) { + return false + } + } + return true +} +func (this *CgroupInfo_NetCls) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*CgroupInfo_NetCls) + if !ok { + that2, ok := that.(CgroupInfo_NetCls) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *CgroupInfo_NetCls") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *CgroupInfo_NetCls but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *CgroupInfo_NetCls but is not nil && this == nil") + } + if this.ClassID != nil && that1.ClassID != nil { + if *this.ClassID != *that1.ClassID { + return fmt.Errorf("ClassID this(%v) Not Equal that(%v)", *this.ClassID, *that1.ClassID) + } + } else if this.ClassID != nil { + return fmt.Errorf("this.ClassID == nil && that.ClassID != nil") + } else if that1.ClassID != nil { + return fmt.Errorf("ClassID this(%v) Not Equal that(%v)", this.ClassID, that1.ClassID) + } + return nil +} +func (this *CgroupInfo_NetCls) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*CgroupInfo_NetCls) + if !ok { + that2, ok := that.(CgroupInfo_NetCls) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.ClassID != nil && that1.ClassID != nil { + if *this.ClassID != *that1.ClassID { + return false + } + } else if this.ClassID != nil { + return false + } else if that1.ClassID != nil { + return false + } + return true +} +func (this *Labels) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Labels) + if !ok { + that2, ok := that.(Labels) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Labels") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Labels but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Labels but is not nil && this == nil") + } + if len(this.Labels) != len(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", len(this.Labels), len(that1.Labels)) + } + for i := range this.Labels { + if !this.Labels[i].Equal(&that1.Labels[i]) { + return fmt.Errorf("Labels this[%v](%v) Not Equal that[%v](%v)", i, this.Labels[i], i, that1.Labels[i]) + } + } + return nil +} +func (this *Labels) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Labels) + if !ok { + that2, ok := that.(Labels) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Labels) != len(that1.Labels) { + return false + } + for i := range this.Labels { + if !this.Labels[i].Equal(&that1.Labels[i]) { + return false + } + } + return true +} +func (this *Label) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Label) + if !ok { + that2, ok := that.(Label) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Label") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Label but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Label but is not nil && this == nil") + } + if this.Key != that1.Key { + return fmt.Errorf("Key this(%v) Not Equal that(%v)", this.Key, that1.Key) + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", *this.Value, *that1.Value) + } + } else if this.Value != nil { + return fmt.Errorf("this.Value == nil && that.Value != nil") + } else if that1.Value != nil { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *Label) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Label) + if !ok { + that2, ok := that.(Label) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Key != that1.Key { + return false + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return false + } + } else if this.Value != nil { + return false + } else if that1.Value != nil { + return false + } + return true +} +func (this *Port) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Port) + if !ok { + that2, ok := that.(Port) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Port") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Port but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Port but is not nil && this == nil") + } + if this.Number != that1.Number { + return fmt.Errorf("Number this(%v) Not Equal that(%v)", this.Number, that1.Number) + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", *this.Name, *that1.Name) + } + } else if this.Name != nil { + return fmt.Errorf("this.Name == nil && that.Name != nil") + } else if that1.Name != nil { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", *this.Protocol, *that1.Protocol) + } + } else if this.Protocol != nil { + return fmt.Errorf("this.Protocol == nil && that.Protocol != nil") + } else if that1.Protocol != nil { + return fmt.Errorf("Protocol this(%v) Not Equal that(%v)", this.Protocol, that1.Protocol) + } + if this.Visibility != nil && that1.Visibility != nil { + if *this.Visibility != *that1.Visibility { + return fmt.Errorf("Visibility this(%v) Not Equal that(%v)", *this.Visibility, *that1.Visibility) + } + } else if this.Visibility != nil { + return fmt.Errorf("this.Visibility == nil && that.Visibility != nil") + } else if that1.Visibility != nil { + return fmt.Errorf("Visibility this(%v) Not Equal that(%v)", this.Visibility, that1.Visibility) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + return nil +} +func (this *Port) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Port) + if !ok { + that2, ok := that.(Port) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Number != that1.Number { + return false + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return false + } + } else if this.Name != nil { + return false + } else if that1.Name != nil { + return false + } + if this.Protocol != nil && that1.Protocol != nil { + if *this.Protocol != *that1.Protocol { + return false + } + } else if this.Protocol != nil { + return false + } else if that1.Protocol != nil { + return false + } + if this.Visibility != nil && that1.Visibility != nil { + if *this.Visibility != *that1.Visibility { + return false + } + } else if this.Visibility != nil { + return false + } else if that1.Visibility != nil { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + return true +} +func (this *Ports) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Ports) + if !ok { + that2, ok := that.(Ports) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Ports") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Ports but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Ports but is not nil && this == nil") + } + if len(this.Ports) != len(that1.Ports) { + return fmt.Errorf("Ports this(%v) Not Equal that(%v)", len(this.Ports), len(that1.Ports)) + } + for i := range this.Ports { + if !this.Ports[i].Equal(&that1.Ports[i]) { + return fmt.Errorf("Ports this[%v](%v) Not Equal that[%v](%v)", i, this.Ports[i], i, that1.Ports[i]) + } + } + return nil +} +func (this *Ports) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Ports) + if !ok { + that2, ok := that.(Ports) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.Ports) != len(that1.Ports) { + return false + } + for i := range this.Ports { + if !this.Ports[i].Equal(&that1.Ports[i]) { + return false + } + } + return true +} +func (this *DiscoveryInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DiscoveryInfo) + if !ok { + that2, ok := that.(DiscoveryInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DiscoveryInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DiscoveryInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DiscoveryInfo but is not nil && this == nil") + } + if this.Visibility != that1.Visibility { + return fmt.Errorf("Visibility this(%v) Not Equal that(%v)", this.Visibility, that1.Visibility) + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", *this.Name, *that1.Name) + } + } else if this.Name != nil { + return fmt.Errorf("this.Name == nil && that.Name != nil") + } else if that1.Name != nil { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Environment != nil && that1.Environment != nil { + if *this.Environment != *that1.Environment { + return fmt.Errorf("Environment this(%v) Not Equal that(%v)", *this.Environment, *that1.Environment) + } + } else if this.Environment != nil { + return fmt.Errorf("this.Environment == nil && that.Environment != nil") + } else if that1.Environment != nil { + return fmt.Errorf("Environment this(%v) Not Equal that(%v)", this.Environment, that1.Environment) + } + if this.Location != nil && that1.Location != nil { + if *this.Location != *that1.Location { + return fmt.Errorf("Location this(%v) Not Equal that(%v)", *this.Location, *that1.Location) + } + } else if this.Location != nil { + return fmt.Errorf("this.Location == nil && that.Location != nil") + } else if that1.Location != nil { + return fmt.Errorf("Location this(%v) Not Equal that(%v)", this.Location, that1.Location) + } + if this.Version != nil && that1.Version != nil { + if *this.Version != *that1.Version { + return fmt.Errorf("Version this(%v) Not Equal that(%v)", *this.Version, *that1.Version) + } + } else if this.Version != nil { + return fmt.Errorf("this.Version == nil && that.Version != nil") + } else if that1.Version != nil { + return fmt.Errorf("Version this(%v) Not Equal that(%v)", this.Version, that1.Version) + } + if !this.Ports.Equal(that1.Ports) { + return fmt.Errorf("Ports this(%v) Not Equal that(%v)", this.Ports, that1.Ports) + } + if !this.Labels.Equal(that1.Labels) { + return fmt.Errorf("Labels this(%v) Not Equal that(%v)", this.Labels, that1.Labels) + } + return nil +} +func (this *DiscoveryInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DiscoveryInfo) + if !ok { + that2, ok := that.(DiscoveryInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Visibility != that1.Visibility { + return false + } + if this.Name != nil && that1.Name != nil { + if *this.Name != *that1.Name { + return false + } + } else if this.Name != nil { + return false + } else if that1.Name != nil { + return false + } + if this.Environment != nil && that1.Environment != nil { + if *this.Environment != *that1.Environment { + return false + } + } else if this.Environment != nil { + return false + } else if that1.Environment != nil { + return false + } + if this.Location != nil && that1.Location != nil { + if *this.Location != *that1.Location { + return false + } + } else if this.Location != nil { + return false + } else if that1.Location != nil { + return false + } + if this.Version != nil && that1.Version != nil { + if *this.Version != *that1.Version { + return false + } + } else if this.Version != nil { + return false + } else if that1.Version != nil { + return false + } + if !this.Ports.Equal(that1.Ports) { + return false + } + if !this.Labels.Equal(that1.Labels) { + return false + } + return true +} +func (this *WeightInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*WeightInfo) + if !ok { + that2, ok := that.(WeightInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *WeightInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *WeightInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *WeightInfo but is not nil && this == nil") + } + if this.Weight != that1.Weight { + return fmt.Errorf("Weight this(%v) Not Equal that(%v)", this.Weight, that1.Weight) + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", *this.Role, *that1.Role) + } + } else if this.Role != nil { + return fmt.Errorf("this.Role == nil && that.Role != nil") + } else if that1.Role != nil { + return fmt.Errorf("Role this(%v) Not Equal that(%v)", this.Role, that1.Role) + } + return nil +} +func (this *WeightInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*WeightInfo) + if !ok { + that2, ok := that.(WeightInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Weight != that1.Weight { + return false + } + if this.Role != nil && that1.Role != nil { + if *this.Role != *that1.Role { + return false + } + } else if this.Role != nil { + return false + } else if that1.Role != nil { + return false + } + return true +} +func (this *VersionInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*VersionInfo) + if !ok { + that2, ok := that.(VersionInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *VersionInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *VersionInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *VersionInfo but is not nil && this == nil") + } + if this.Version != that1.Version { + return fmt.Errorf("Version this(%v) Not Equal that(%v)", this.Version, that1.Version) + } + if this.BuildDate != nil && that1.BuildDate != nil { + if *this.BuildDate != *that1.BuildDate { + return fmt.Errorf("BuildDate this(%v) Not Equal that(%v)", *this.BuildDate, *that1.BuildDate) + } + } else if this.BuildDate != nil { + return fmt.Errorf("this.BuildDate == nil && that.BuildDate != nil") + } else if that1.BuildDate != nil { + return fmt.Errorf("BuildDate this(%v) Not Equal that(%v)", this.BuildDate, that1.BuildDate) + } + if this.BuildTime != nil && that1.BuildTime != nil { + if *this.BuildTime != *that1.BuildTime { + return fmt.Errorf("BuildTime this(%v) Not Equal that(%v)", *this.BuildTime, *that1.BuildTime) + } + } else if this.BuildTime != nil { + return fmt.Errorf("this.BuildTime == nil && that.BuildTime != nil") + } else if that1.BuildTime != nil { + return fmt.Errorf("BuildTime this(%v) Not Equal that(%v)", this.BuildTime, that1.BuildTime) + } + if this.BuildUser != nil && that1.BuildUser != nil { + if *this.BuildUser != *that1.BuildUser { + return fmt.Errorf("BuildUser this(%v) Not Equal that(%v)", *this.BuildUser, *that1.BuildUser) + } + } else if this.BuildUser != nil { + return fmt.Errorf("this.BuildUser == nil && that.BuildUser != nil") + } else if that1.BuildUser != nil { + return fmt.Errorf("BuildUser this(%v) Not Equal that(%v)", this.BuildUser, that1.BuildUser) + } + if this.GitSHA != nil && that1.GitSHA != nil { + if *this.GitSHA != *that1.GitSHA { + return fmt.Errorf("GitSHA this(%v) Not Equal that(%v)", *this.GitSHA, *that1.GitSHA) + } + } else if this.GitSHA != nil { + return fmt.Errorf("this.GitSHA == nil && that.GitSHA != nil") + } else if that1.GitSHA != nil { + return fmt.Errorf("GitSHA this(%v) Not Equal that(%v)", this.GitSHA, that1.GitSHA) + } + if this.GitBranch != nil && that1.GitBranch != nil { + if *this.GitBranch != *that1.GitBranch { + return fmt.Errorf("GitBranch this(%v) Not Equal that(%v)", *this.GitBranch, *that1.GitBranch) + } + } else if this.GitBranch != nil { + return fmt.Errorf("this.GitBranch == nil && that.GitBranch != nil") + } else if that1.GitBranch != nil { + return fmt.Errorf("GitBranch this(%v) Not Equal that(%v)", this.GitBranch, that1.GitBranch) + } + if this.GitTag != nil && that1.GitTag != nil { + if *this.GitTag != *that1.GitTag { + return fmt.Errorf("GitTag this(%v) Not Equal that(%v)", *this.GitTag, *that1.GitTag) + } + } else if this.GitTag != nil { + return fmt.Errorf("this.GitTag == nil && that.GitTag != nil") + } else if that1.GitTag != nil { + return fmt.Errorf("GitTag this(%v) Not Equal that(%v)", this.GitTag, that1.GitTag) + } + return nil +} +func (this *VersionInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*VersionInfo) + if !ok { + that2, ok := that.(VersionInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Version != that1.Version { + return false + } + if this.BuildDate != nil && that1.BuildDate != nil { + if *this.BuildDate != *that1.BuildDate { + return false + } + } else if this.BuildDate != nil { + return false + } else if that1.BuildDate != nil { + return false + } + if this.BuildTime != nil && that1.BuildTime != nil { + if *this.BuildTime != *that1.BuildTime { + return false + } + } else if this.BuildTime != nil { + return false + } else if that1.BuildTime != nil { + return false + } + if this.BuildUser != nil && that1.BuildUser != nil { + if *this.BuildUser != *that1.BuildUser { + return false + } + } else if this.BuildUser != nil { + return false + } else if that1.BuildUser != nil { + return false + } + if this.GitSHA != nil && that1.GitSHA != nil { + if *this.GitSHA != *that1.GitSHA { + return false + } + } else if this.GitSHA != nil { + return false + } else if that1.GitSHA != nil { + return false + } + if this.GitBranch != nil && that1.GitBranch != nil { + if *this.GitBranch != *that1.GitBranch { + return false + } + } else if this.GitBranch != nil { + return false + } else if that1.GitBranch != nil { + return false + } + if this.GitTag != nil && that1.GitTag != nil { + if *this.GitTag != *that1.GitTag { + return false + } + } else if this.GitTag != nil { + return false + } else if that1.GitTag != nil { + return false + } + return true +} +func (this *Flag) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Flag) + if !ok { + that2, ok := that.(Flag) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Flag") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Flag but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Flag but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", *this.Value, *that1.Value) + } + } else if this.Value != nil { + return fmt.Errorf("this.Value == nil && that.Value != nil") + } else if that1.Value != nil { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *Flag) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Flag) + if !ok { + that2, ok := that.(Flag) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return false + } + } else if this.Value != nil { + return false + } else if that1.Value != nil { + return false + } + return true +} +func (this *Role) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Role) + if !ok { + that2, ok := that.(Role) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Role") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Role but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Role but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Weight != that1.Weight { + return fmt.Errorf("Weight this(%v) Not Equal that(%v)", this.Weight, that1.Weight) + } + if len(this.Frameworks) != len(that1.Frameworks) { + return fmt.Errorf("Frameworks this(%v) Not Equal that(%v)", len(this.Frameworks), len(that1.Frameworks)) + } + for i := range this.Frameworks { + if !this.Frameworks[i].Equal(&that1.Frameworks[i]) { + return fmt.Errorf("Frameworks this[%v](%v) Not Equal that[%v](%v)", i, this.Frameworks[i], i, that1.Frameworks[i]) + } + } + if len(this.Resources) != len(that1.Resources) { + return fmt.Errorf("Resources this(%v) Not Equal that(%v)", len(this.Resources), len(that1.Resources)) + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return fmt.Errorf("Resources this[%v](%v) Not Equal that[%v](%v)", i, this.Resources[i], i, that1.Resources[i]) + } + } + return nil +} +func (this *Role) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Role) + if !ok { + that2, ok := that.(Role) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Weight != that1.Weight { + return false + } + if len(this.Frameworks) != len(that1.Frameworks) { + return false + } + for i := range this.Frameworks { + if !this.Frameworks[i].Equal(&that1.Frameworks[i]) { + return false + } + } + if len(this.Resources) != len(that1.Resources) { + return false + } + for i := range this.Resources { + if !this.Resources[i].Equal(&that1.Resources[i]) { + return false + } + } + return true +} +func (this *Metric) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Metric) + if !ok { + that2, ok := that.(Metric) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Metric") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Metric but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Metric but is not nil && this == nil") + } + if this.Name != that1.Name { + return fmt.Errorf("Name this(%v) Not Equal that(%v)", this.Name, that1.Name) + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", *this.Value, *that1.Value) + } + } else if this.Value != nil { + return fmt.Errorf("this.Value == nil && that.Value != nil") + } else if that1.Value != nil { + return fmt.Errorf("Value this(%v) Not Equal that(%v)", this.Value, that1.Value) + } + return nil +} +func (this *Metric) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Metric) + if !ok { + that2, ok := that.(Metric) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Name != that1.Name { + return false + } + if this.Value != nil && that1.Value != nil { + if *this.Value != *that1.Value { + return false + } + } else if this.Value != nil { + return false + } else if that1.Value != nil { + return false + } + return true +} +func (this *FileInfo) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*FileInfo) + if !ok { + that2, ok := that.(FileInfo) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *FileInfo") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *FileInfo but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *FileInfo but is not nil && this == nil") + } + if this.Path != that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + if this.Nlink != nil && that1.Nlink != nil { + if *this.Nlink != *that1.Nlink { + return fmt.Errorf("Nlink this(%v) Not Equal that(%v)", *this.Nlink, *that1.Nlink) + } + } else if this.Nlink != nil { + return fmt.Errorf("this.Nlink == nil && that.Nlink != nil") + } else if that1.Nlink != nil { + return fmt.Errorf("Nlink this(%v) Not Equal that(%v)", this.Nlink, that1.Nlink) + } + if this.Size != nil && that1.Size != nil { + if *this.Size != *that1.Size { + return fmt.Errorf("Size this(%v) Not Equal that(%v)", *this.Size, *that1.Size) + } + } else if this.Size != nil { + return fmt.Errorf("this.Size == nil && that.Size != nil") + } else if that1.Size != nil { + return fmt.Errorf("Size this(%v) Not Equal that(%v)", this.Size, that1.Size) + } + if !this.Mtime.Equal(that1.Mtime) { + return fmt.Errorf("Mtime this(%v) Not Equal that(%v)", this.Mtime, that1.Mtime) + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", *this.Mode, *that1.Mode) + } + } else if this.Mode != nil { + return fmt.Errorf("this.Mode == nil && that.Mode != nil") + } else if that1.Mode != nil { + return fmt.Errorf("Mode this(%v) Not Equal that(%v)", this.Mode, that1.Mode) + } + if this.UID != nil && that1.UID != nil { + if *this.UID != *that1.UID { + return fmt.Errorf("UID this(%v) Not Equal that(%v)", *this.UID, *that1.UID) + } + } else if this.UID != nil { + return fmt.Errorf("this.UID == nil && that.UID != nil") + } else if that1.UID != nil { + return fmt.Errorf("UID this(%v) Not Equal that(%v)", this.UID, that1.UID) + } + if this.GID != nil && that1.GID != nil { + if *this.GID != *that1.GID { + return fmt.Errorf("GID this(%v) Not Equal that(%v)", *this.GID, *that1.GID) + } + } else if this.GID != nil { + return fmt.Errorf("this.GID == nil && that.GID != nil") + } else if that1.GID != nil { + return fmt.Errorf("GID this(%v) Not Equal that(%v)", this.GID, that1.GID) + } + return nil +} +func (this *FileInfo) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*FileInfo) + if !ok { + that2, ok := that.(FileInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Path != that1.Path { + return false + } + if this.Nlink != nil && that1.Nlink != nil { + if *this.Nlink != *that1.Nlink { + return false + } + } else if this.Nlink != nil { + return false + } else if that1.Nlink != nil { + return false + } + if this.Size != nil && that1.Size != nil { + if *this.Size != *that1.Size { + return false + } + } else if this.Size != nil { + return false + } else if that1.Size != nil { + return false + } + if !this.Mtime.Equal(that1.Mtime) { + return false + } + if this.Mode != nil && that1.Mode != nil { + if *this.Mode != *that1.Mode { + return false + } + } else if this.Mode != nil { + return false + } else if that1.Mode != nil { + return false + } + if this.UID != nil && that1.UID != nil { + if *this.UID != *that1.UID { + return false + } + } else if this.UID != nil { + return false + } else if that1.UID != nil { + return false + } + if this.GID != nil && that1.GID != nil { + if *this.GID != *that1.GID { + return false + } + } else if this.GID != nil { + return false + } else if that1.GID != nil { + return false + } + return true +} +func (this *Device) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Device) + if !ok { + that2, ok := that.(Device) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Device") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Device but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Device but is not nil && this == nil") + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", *this.Path, *that1.Path) + } + } else if this.Path != nil { + return fmt.Errorf("this.Path == nil && that.Path != nil") + } else if that1.Path != nil { + return fmt.Errorf("Path this(%v) Not Equal that(%v)", this.Path, that1.Path) + } + if !this.Number.Equal(that1.Number) { + return fmt.Errorf("Number this(%v) Not Equal that(%v)", this.Number, that1.Number) + } + return nil +} +func (this *Device) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Device) + if !ok { + that2, ok := that.(Device) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Path != nil && that1.Path != nil { + if *this.Path != *that1.Path { + return false + } + } else if this.Path != nil { + return false + } else if that1.Path != nil { + return false + } + if !this.Number.Equal(that1.Number) { + return false + } + return true +} +func (this *Device_Number) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*Device_Number) + if !ok { + that2, ok := that.(Device_Number) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *Device_Number") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *Device_Number but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *Device_Number but is not nil && this == nil") + } + if this.MajorNumber != nil && that1.MajorNumber != nil { + if *this.MajorNumber != *that1.MajorNumber { + return fmt.Errorf("MajorNumber this(%v) Not Equal that(%v)", *this.MajorNumber, *that1.MajorNumber) + } + } else if this.MajorNumber != nil { + return fmt.Errorf("this.MajorNumber == nil && that.MajorNumber != nil") + } else if that1.MajorNumber != nil { + return fmt.Errorf("MajorNumber this(%v) Not Equal that(%v)", this.MajorNumber, that1.MajorNumber) + } + if this.MinorNumber != nil && that1.MinorNumber != nil { + if *this.MinorNumber != *that1.MinorNumber { + return fmt.Errorf("MinorNumber this(%v) Not Equal that(%v)", *this.MinorNumber, *that1.MinorNumber) + } + } else if this.MinorNumber != nil { + return fmt.Errorf("this.MinorNumber == nil && that.MinorNumber != nil") + } else if that1.MinorNumber != nil { + return fmt.Errorf("MinorNumber this(%v) Not Equal that(%v)", this.MinorNumber, that1.MinorNumber) + } + return nil +} +func (this *Device_Number) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*Device_Number) + if !ok { + that2, ok := that.(Device_Number) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.MajorNumber != nil && that1.MajorNumber != nil { + if *this.MajorNumber != *that1.MajorNumber { + return false + } + } else if this.MajorNumber != nil { + return false + } else if that1.MajorNumber != nil { + return false + } + if this.MinorNumber != nil && that1.MinorNumber != nil { + if *this.MinorNumber != *that1.MinorNumber { + return false + } + } else if this.MinorNumber != nil { + return false + } else if that1.MinorNumber != nil { + return false + } + return true +} +func (this *DeviceAccess) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DeviceAccess) + if !ok { + that2, ok := that.(DeviceAccess) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DeviceAccess") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DeviceAccess but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DeviceAccess but is not nil && this == nil") + } + if !this.Device.Equal(&that1.Device) { + return fmt.Errorf("Device this(%v) Not Equal that(%v)", this.Device, that1.Device) + } + if !this.Access.Equal(&that1.Access) { + return fmt.Errorf("Access this(%v) Not Equal that(%v)", this.Access, that1.Access) + } + return nil +} +func (this *DeviceAccess) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DeviceAccess) + if !ok { + that2, ok := that.(DeviceAccess) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if !this.Device.Equal(&that1.Device) { + return false + } + if !this.Access.Equal(&that1.Access) { + return false + } + return true +} +func (this *DeviceAccess_Access) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DeviceAccess_Access) + if !ok { + that2, ok := that.(DeviceAccess_Access) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DeviceAccess_Access") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DeviceAccess_Access but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DeviceAccess_Access but is not nil && this == nil") + } + if this.Read != nil && that1.Read != nil { + if *this.Read != *that1.Read { + return fmt.Errorf("Read this(%v) Not Equal that(%v)", *this.Read, *that1.Read) + } + } else if this.Read != nil { + return fmt.Errorf("this.Read == nil && that.Read != nil") + } else if that1.Read != nil { + return fmt.Errorf("Read this(%v) Not Equal that(%v)", this.Read, that1.Read) + } + if this.Write != nil && that1.Write != nil { + if *this.Write != *that1.Write { + return fmt.Errorf("Write this(%v) Not Equal that(%v)", *this.Write, *that1.Write) + } + } else if this.Write != nil { + return fmt.Errorf("this.Write == nil && that.Write != nil") + } else if that1.Write != nil { + return fmt.Errorf("Write this(%v) Not Equal that(%v)", this.Write, that1.Write) + } + if this.Mknod != nil && that1.Mknod != nil { + if *this.Mknod != *that1.Mknod { + return fmt.Errorf("Mknod this(%v) Not Equal that(%v)", *this.Mknod, *that1.Mknod) + } + } else if this.Mknod != nil { + return fmt.Errorf("this.Mknod == nil && that.Mknod != nil") + } else if that1.Mknod != nil { + return fmt.Errorf("Mknod this(%v) Not Equal that(%v)", this.Mknod, that1.Mknod) + } + return nil +} +func (this *DeviceAccess_Access) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DeviceAccess_Access) + if !ok { + that2, ok := that.(DeviceAccess_Access) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if this.Read != nil && that1.Read != nil { + if *this.Read != *that1.Read { + return false + } + } else if this.Read != nil { + return false + } else if that1.Read != nil { + return false + } + if this.Write != nil && that1.Write != nil { + if *this.Write != *that1.Write { + return false + } + } else if this.Write != nil { + return false + } else if that1.Write != nil { + return false + } + if this.Mknod != nil && that1.Mknod != nil { + if *this.Mknod != *that1.Mknod { + return false + } + } else if this.Mknod != nil { + return false + } else if that1.Mknod != nil { + return false + } + return true +} +func (this *DeviceWhitelist) VerboseEqual(that interface{}) error { + if that == nil { + if this == nil { + return nil + } + return fmt.Errorf("that == nil && this != nil") + } + + that1, ok := that.(*DeviceWhitelist) + if !ok { + that2, ok := that.(DeviceWhitelist) + if ok { + that1 = &that2 + } else { + return fmt.Errorf("that is not of type *DeviceWhitelist") + } + } + if that1 == nil { + if this == nil { + return nil + } + return fmt.Errorf("that is type *DeviceWhitelist but is nil && this != nil") + } else if this == nil { + return fmt.Errorf("that is type *DeviceWhitelist but is not nil && this == nil") + } + if len(this.AllowedDevices) != len(that1.AllowedDevices) { + return fmt.Errorf("AllowedDevices this(%v) Not Equal that(%v)", len(this.AllowedDevices), len(that1.AllowedDevices)) + } + for i := range this.AllowedDevices { + if !this.AllowedDevices[i].Equal(&that1.AllowedDevices[i]) { + return fmt.Errorf("AllowedDevices this[%v](%v) Not Equal that[%v](%v)", i, this.AllowedDevices[i], i, that1.AllowedDevices[i]) + } + } + return nil +} +func (this *DeviceWhitelist) Equal(that interface{}) bool { + if that == nil { + if this == nil { + return true + } + return false + } + + that1, ok := that.(*DeviceWhitelist) + if !ok { + that2, ok := that.(DeviceWhitelist) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + if this == nil { + return true + } + return false + } else if this == nil { + return false + } + if len(this.AllowedDevices) != len(that1.AllowedDevices) { + return false + } + for i := range this.AllowedDevices { + if !this.AllowedDevices[i].Equal(&that1.AllowedDevices[i]) { + return false + } + } + return true +} +func (this *FrameworkID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.FrameworkID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *OfferID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.OfferID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *AgentID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.AgentID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TaskID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.TaskID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ExecutorID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.ExecutorID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ContainerID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.ContainerID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.Parent != nil { + s = append(s, "Parent: "+fmt.Sprintf("%#v", this.Parent)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ResourceProviderID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.ResourceProviderID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *OperationID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.OperationID{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TimeInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.TimeInfo{") + s = append(s, "Nanoseconds: "+fmt.Sprintf("%#v", this.Nanoseconds)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DurationInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.DurationInfo{") + s = append(s, "Nanoseconds: "+fmt.Sprintf("%#v", this.Nanoseconds)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Address) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.Address{") + if this.Hostname != nil { + s = append(s, "Hostname: "+valueToGoStringMesos(this.Hostname, "string")+",\n") + } + if this.IP != nil { + s = append(s, "IP: "+valueToGoStringMesos(this.IP, "string")+",\n") + } + s = append(s, "Port: "+fmt.Sprintf("%#v", this.Port)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *URL) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.URL{") + s = append(s, "Scheme: "+fmt.Sprintf("%#v", this.Scheme)+",\n") + s = append(s, "Address: "+strings.Replace(this.Address.GoString(), `&`, ``, 1)+",\n") + if this.Path != nil { + s = append(s, "Path: "+valueToGoStringMesos(this.Path, "string")+",\n") + } + if this.Query != nil { + s = append(s, "Query: "+fmt.Sprintf("%#v", this.Query)+",\n") + } + if this.Fragment != nil { + s = append(s, "Fragment: "+valueToGoStringMesos(this.Fragment, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Unavailability) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Unavailability{") + s = append(s, "Start: "+strings.Replace(this.Start.GoString(), `&`, ``, 1)+",\n") + if this.Duration != nil { + s = append(s, "Duration: "+fmt.Sprintf("%#v", this.Duration)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MachineID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.MachineID{") + if this.Hostname != nil { + s = append(s, "Hostname: "+valueToGoStringMesos(this.Hostname, "string")+",\n") + } + if this.IP != nil { + s = append(s, "IP: "+valueToGoStringMesos(this.IP, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MachineInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.MachineInfo{") + s = append(s, "ID: "+strings.Replace(this.ID.GoString(), `&`, ``, 1)+",\n") + if this.Mode != nil { + s = append(s, "Mode: "+valueToGoStringMesos(this.Mode, "MachineInfo_Mode")+",\n") + } + if this.Unavailability != nil { + s = append(s, "Unavailability: "+fmt.Sprintf("%#v", this.Unavailability)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FrameworkInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 16) + s = append(s, "&mesos.FrameworkInfo{") + s = append(s, "User: "+fmt.Sprintf("%#v", this.User)+",\n") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.ID != nil { + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + } + if this.FailoverTimeout != nil { + s = append(s, "FailoverTimeout: "+valueToGoStringMesos(this.FailoverTimeout, "float64")+",\n") + } + if this.Checkpoint != nil { + s = append(s, "Checkpoint: "+valueToGoStringMesos(this.Checkpoint, "bool")+",\n") + } + if this.Role != nil { + s = append(s, "Role: "+valueToGoStringMesos(this.Role, "string")+",\n") + } + if this.Roles != nil { + s = append(s, "Roles: "+fmt.Sprintf("%#v", this.Roles)+",\n") + } + if this.Hostname != nil { + s = append(s, "Hostname: "+valueToGoStringMesos(this.Hostname, "string")+",\n") + } + if this.Principal != nil { + s = append(s, "Principal: "+valueToGoStringMesos(this.Principal, "string")+",\n") + } + if this.WebUiURL != nil { + s = append(s, "WebUiURL: "+valueToGoStringMesos(this.WebUiURL, "string")+",\n") + } + if this.Capabilities != nil { + s = append(s, "Capabilities: "+fmt.Sprintf("%#v", this.Capabilities)+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FrameworkInfo_Capability) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.FrameworkInfo_Capability{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&mesos.CheckInfo{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.HTTP != nil { + s = append(s, "HTTP: "+fmt.Sprintf("%#v", this.HTTP)+",\n") + } + if this.TCP != nil { + s = append(s, "TCP: "+fmt.Sprintf("%#v", this.TCP)+",\n") + } + if this.DelaySeconds != nil { + s = append(s, "DelaySeconds: "+valueToGoStringMesos(this.DelaySeconds, "float64")+",\n") + } + if this.IntervalSeconds != nil { + s = append(s, "IntervalSeconds: "+valueToGoStringMesos(this.IntervalSeconds, "float64")+",\n") + } + if this.TimeoutSeconds != nil { + s = append(s, "TimeoutSeconds: "+valueToGoStringMesos(this.TimeoutSeconds, "float64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckInfo_Command) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CheckInfo_Command{") + s = append(s, "Command: "+strings.Replace(this.Command.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckInfo_Http) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.CheckInfo_Http{") + s = append(s, "Port: "+fmt.Sprintf("%#v", this.Port)+",\n") + if this.Path != nil { + s = append(s, "Path: "+valueToGoStringMesos(this.Path, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckInfo_Tcp) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CheckInfo_Tcp{") + s = append(s, "Port: "+fmt.Sprintf("%#v", this.Port)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *HealthCheck) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 13) + s = append(s, "&mesos.HealthCheck{") + if this.DelaySeconds != nil { + s = append(s, "DelaySeconds: "+valueToGoStringMesos(this.DelaySeconds, "float64")+",\n") + } + if this.IntervalSeconds != nil { + s = append(s, "IntervalSeconds: "+valueToGoStringMesos(this.IntervalSeconds, "float64")+",\n") + } + if this.TimeoutSeconds != nil { + s = append(s, "TimeoutSeconds: "+valueToGoStringMesos(this.TimeoutSeconds, "float64")+",\n") + } + if this.ConsecutiveFailures != nil { + s = append(s, "ConsecutiveFailures: "+valueToGoStringMesos(this.ConsecutiveFailures, "uint32")+",\n") + } + if this.GracePeriodSeconds != nil { + s = append(s, "GracePeriodSeconds: "+valueToGoStringMesos(this.GracePeriodSeconds, "float64")+",\n") + } + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.HTTP != nil { + s = append(s, "HTTP: "+fmt.Sprintf("%#v", this.HTTP)+",\n") + } + if this.TCP != nil { + s = append(s, "TCP: "+fmt.Sprintf("%#v", this.TCP)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *HealthCheck_HTTPCheckInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.HealthCheck_HTTPCheckInfo{") + if this.Protocol != nil { + s = append(s, "Protocol: "+valueToGoStringMesos(this.Protocol, "NetworkInfo_Protocol")+",\n") + } + if this.Scheme != nil { + s = append(s, "Scheme: "+valueToGoStringMesos(this.Scheme, "string")+",\n") + } + s = append(s, "Port: "+fmt.Sprintf("%#v", this.Port)+",\n") + if this.Path != nil { + s = append(s, "Path: "+valueToGoStringMesos(this.Path, "string")+",\n") + } + if this.Statuses != nil { + s = append(s, "Statuses: "+fmt.Sprintf("%#v", this.Statuses)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *HealthCheck_TCPCheckInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.HealthCheck_TCPCheckInfo{") + if this.Protocol != nil { + s = append(s, "Protocol: "+valueToGoStringMesos(this.Protocol, "NetworkInfo_Protocol")+",\n") + } + s = append(s, "Port: "+fmt.Sprintf("%#v", this.Port)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *KillPolicy) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.KillPolicy{") + if this.GracePeriod != nil { + s = append(s, "GracePeriod: "+fmt.Sprintf("%#v", this.GracePeriod)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CommandInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&mesos.CommandInfo{") + if this.URIs != nil { + s = append(s, "URIs: "+fmt.Sprintf("%#v", this.URIs)+",\n") + } + if this.Environment != nil { + s = append(s, "Environment: "+fmt.Sprintf("%#v", this.Environment)+",\n") + } + if this.Shell != nil { + s = append(s, "Shell: "+valueToGoStringMesos(this.Shell, "bool")+",\n") + } + if this.Value != nil { + s = append(s, "Value: "+valueToGoStringMesos(this.Value, "string")+",\n") + } + if this.Arguments != nil { + s = append(s, "Arguments: "+fmt.Sprintf("%#v", this.Arguments)+",\n") + } + if this.User != nil { + s = append(s, "User: "+valueToGoStringMesos(this.User, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CommandInfo_URI) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.CommandInfo_URI{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + if this.Executable != nil { + s = append(s, "Executable: "+valueToGoStringMesos(this.Executable, "bool")+",\n") + } + if this.Extract != nil { + s = append(s, "Extract: "+valueToGoStringMesos(this.Extract, "bool")+",\n") + } + if this.Cache != nil { + s = append(s, "Cache: "+valueToGoStringMesos(this.Cache, "bool")+",\n") + } + if this.OutputFile != nil { + s = append(s, "OutputFile: "+valueToGoStringMesos(this.OutputFile, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ExecutorInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 16) + s = append(s, "&mesos.ExecutorInfo{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "ExecutorID: "+strings.Replace(this.ExecutorID.GoString(), `&`, ``, 1)+",\n") + if this.FrameworkID != nil { + s = append(s, "FrameworkID: "+fmt.Sprintf("%#v", this.FrameworkID)+",\n") + } + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.Container != nil { + s = append(s, "Container: "+fmt.Sprintf("%#v", this.Container)+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringMesos(this.Name, "string")+",\n") + } + if this.Source != nil { + s = append(s, "Source: "+valueToGoStringMesos(this.Source, "string")+",\n") + } + if this.Data != nil { + s = append(s, "Data: "+valueToGoStringMesos(this.Data, "byte")+",\n") + } + if this.Discovery != nil { + s = append(s, "Discovery: "+fmt.Sprintf("%#v", this.Discovery)+",\n") + } + if this.ShutdownGracePeriod != nil { + s = append(s, "ShutdownGracePeriod: "+fmt.Sprintf("%#v", this.ShutdownGracePeriod)+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DomainInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.DomainInfo{") + if this.FaultDomain != nil { + s = append(s, "FaultDomain: "+fmt.Sprintf("%#v", this.FaultDomain)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DomainInfo_FaultDomain) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.DomainInfo_FaultDomain{") + s = append(s, "Region: "+strings.Replace(this.Region.GoString(), `&`, ``, 1)+",\n") + s = append(s, "Zone: "+strings.Replace(this.Zone.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DomainInfo_FaultDomain_RegionInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.DomainInfo_FaultDomain_RegionInfo{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DomainInfo_FaultDomain_ZoneInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.DomainInfo_FaultDomain_ZoneInfo{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MasterInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 13) + s = append(s, "&mesos.MasterInfo{") + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + s = append(s, "IP: "+fmt.Sprintf("%#v", this.IP)+",\n") + if this.Port != nil { + s = append(s, "Port: "+valueToGoStringMesos(this.Port, "uint32")+",\n") + } + if this.PID != nil { + s = append(s, "PID: "+valueToGoStringMesos(this.PID, "string")+",\n") + } + if this.Hostname != nil { + s = append(s, "Hostname: "+valueToGoStringMesos(this.Hostname, "string")+",\n") + } + if this.Version != nil { + s = append(s, "Version: "+valueToGoStringMesos(this.Version, "string")+",\n") + } + if this.Address != nil { + s = append(s, "Address: "+fmt.Sprintf("%#v", this.Address)+",\n") + } + if this.Domain != nil { + s = append(s, "Domain: "+fmt.Sprintf("%#v", this.Domain)+",\n") + } + if this.Capabilities != nil { + s = append(s, "Capabilities: "+fmt.Sprintf("%#v", this.Capabilities)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MasterInfo_Capability) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.MasterInfo_Capability{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *AgentInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&mesos.AgentInfo{") + s = append(s, "Hostname: "+fmt.Sprintf("%#v", this.Hostname)+",\n") + if this.Port != nil { + s = append(s, "Port: "+valueToGoStringMesos(this.Port, "int32")+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Attributes != nil { + s = append(s, "Attributes: "+fmt.Sprintf("%#v", this.Attributes)+",\n") + } + if this.ID != nil { + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + } + if this.Domain != nil { + s = append(s, "Domain: "+fmt.Sprintf("%#v", this.Domain)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *AgentInfo_Capability) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.AgentInfo_Capability{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CSIPluginContainerInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.CSIPluginContainerInfo{") + if this.Services != nil { + s = append(s, "Services: "+fmt.Sprintf("%#v", this.Services)+",\n") + } + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Container != nil { + s = append(s, "Container: "+fmt.Sprintf("%#v", this.Container)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CSIPluginInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.CSIPluginInfo{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Containers != nil { + s = append(s, "Containers: "+fmt.Sprintf("%#v", this.Containers)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ResourceProviderInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&mesos.ResourceProviderInfo{") + if this.ID != nil { + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + } + if this.Attributes != nil { + s = append(s, "Attributes: "+fmt.Sprintf("%#v", this.Attributes)+",\n") + } + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.DefaultReservations != nil { + s = append(s, "DefaultReservations: "+fmt.Sprintf("%#v", this.DefaultReservations)+",\n") + } + if this.Storage != nil { + s = append(s, "Storage: "+fmt.Sprintf("%#v", this.Storage)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ResourceProviderInfo_Storage) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.ResourceProviderInfo_Storage{") + s = append(s, "Plugin: "+strings.Replace(this.Plugin.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.Value{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Scalar != nil { + s = append(s, "Scalar: "+fmt.Sprintf("%#v", this.Scalar)+",\n") + } + if this.Ranges != nil { + s = append(s, "Ranges: "+fmt.Sprintf("%#v", this.Ranges)+",\n") + } + if this.Set != nil { + s = append(s, "Set: "+fmt.Sprintf("%#v", this.Set)+",\n") + } + if this.Text != nil { + s = append(s, "Text: "+fmt.Sprintf("%#v", this.Text)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value_Scalar) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Value_Scalar{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value_Range) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Value_Range{") + s = append(s, "Begin: "+fmt.Sprintf("%#v", this.Begin)+",\n") + s = append(s, "End: "+fmt.Sprintf("%#v", this.End)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value_Ranges) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Value_Ranges{") + if this.Range != nil { + s = append(s, "Range: "+fmt.Sprintf("%#v", this.Range)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value_Set) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Value_Set{") + if this.Item != nil { + s = append(s, "Item: "+fmt.Sprintf("%#v", this.Item)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Value_Text) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Value_Text{") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Attribute) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&mesos.Attribute{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Scalar != nil { + s = append(s, "Scalar: "+fmt.Sprintf("%#v", this.Scalar)+",\n") + } + if this.Ranges != nil { + s = append(s, "Ranges: "+fmt.Sprintf("%#v", this.Ranges)+",\n") + } + if this.Set != nil { + s = append(s, "Set: "+fmt.Sprintf("%#v", this.Set)+",\n") + } + if this.Text != nil { + s = append(s, "Text: "+fmt.Sprintf("%#v", this.Text)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 17) + s = append(s, "&mesos.Resource{") + if this.ProviderID != nil { + s = append(s, "ProviderID: "+fmt.Sprintf("%#v", this.ProviderID)+",\n") + } + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Type != nil { + s = append(s, "Type: "+valueToGoStringMesos(this.Type, "Value_Type")+",\n") + } + if this.Scalar != nil { + s = append(s, "Scalar: "+fmt.Sprintf("%#v", this.Scalar)+",\n") + } + if this.Ranges != nil { + s = append(s, "Ranges: "+fmt.Sprintf("%#v", this.Ranges)+",\n") + } + if this.Set != nil { + s = append(s, "Set: "+fmt.Sprintf("%#v", this.Set)+",\n") + } + if this.Role != nil { + s = append(s, "Role: "+valueToGoStringMesos(this.Role, "string")+",\n") + } + if this.AllocationInfo != nil { + s = append(s, "AllocationInfo: "+fmt.Sprintf("%#v", this.AllocationInfo)+",\n") + } + if this.Reservation != nil { + s = append(s, "Reservation: "+fmt.Sprintf("%#v", this.Reservation)+",\n") + } + if this.Reservations != nil { + s = append(s, "Reservations: "+fmt.Sprintf("%#v", this.Reservations)+",\n") + } + if this.Disk != nil { + s = append(s, "Disk: "+fmt.Sprintf("%#v", this.Disk)+",\n") + } + if this.Revocable != nil { + s = append(s, "Revocable: "+fmt.Sprintf("%#v", this.Revocable)+",\n") + } + if this.Shared != nil { + s = append(s, "Shared: "+fmt.Sprintf("%#v", this.Shared)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_AllocationInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Resource_AllocationInfo{") + if this.Role != nil { + s = append(s, "Role: "+valueToGoStringMesos(this.Role, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_ReservationInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.Resource_ReservationInfo{") + if this.Type != nil { + s = append(s, "Type: "+valueToGoStringMesos(this.Type, "Resource_ReservationInfo_Type")+",\n") + } + if this.Role != nil { + s = append(s, "Role: "+valueToGoStringMesos(this.Role, "string")+",\n") + } + if this.Principal != nil { + s = append(s, "Principal: "+valueToGoStringMesos(this.Principal, "string")+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_DiskInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.Resource_DiskInfo{") + if this.Persistence != nil { + s = append(s, "Persistence: "+fmt.Sprintf("%#v", this.Persistence)+",\n") + } + if this.Volume != nil { + s = append(s, "Volume: "+fmt.Sprintf("%#v", this.Volume)+",\n") + } + if this.Source != nil { + s = append(s, "Source: "+fmt.Sprintf("%#v", this.Source)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_DiskInfo_Persistence) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Resource_DiskInfo_Persistence{") + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + if this.Principal != nil { + s = append(s, "Principal: "+valueToGoStringMesos(this.Principal, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_DiskInfo_Source) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&mesos.Resource_DiskInfo_Source{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Path != nil { + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + } + if this.Mount != nil { + s = append(s, "Mount: "+fmt.Sprintf("%#v", this.Mount)+",\n") + } + if this.ID != nil { + s = append(s, "ID: "+valueToGoStringMesos(this.ID, "string")+",\n") + } + if this.Metadata != nil { + s = append(s, "Metadata: "+fmt.Sprintf("%#v", this.Metadata)+",\n") + } + if this.Profile != nil { + s = append(s, "Profile: "+valueToGoStringMesos(this.Profile, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_DiskInfo_Source_Path) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Resource_DiskInfo_Source_Path{") + if this.Root != nil { + s = append(s, "Root: "+valueToGoStringMesos(this.Root, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_DiskInfo_Source_Mount) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Resource_DiskInfo_Source_Mount{") + if this.Root != nil { + s = append(s, "Root: "+valueToGoStringMesos(this.Root, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_RevocableInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 4) + s = append(s, "&mesos.Resource_RevocableInfo{") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Resource_SharedInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 4) + s = append(s, "&mesos.Resource_SharedInfo{") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TrafficControlStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 14) + s = append(s, "&mesos.TrafficControlStatistics{") + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + if this.Backlog != nil { + s = append(s, "Backlog: "+valueToGoStringMesos(this.Backlog, "uint64")+",\n") + } + if this.Bytes != nil { + s = append(s, "Bytes: "+valueToGoStringMesos(this.Bytes, "uint64")+",\n") + } + if this.Drops != nil { + s = append(s, "Drops: "+valueToGoStringMesos(this.Drops, "uint64")+",\n") + } + if this.Overlimits != nil { + s = append(s, "Overlimits: "+valueToGoStringMesos(this.Overlimits, "uint64")+",\n") + } + if this.Packets != nil { + s = append(s, "Packets: "+valueToGoStringMesos(this.Packets, "uint64")+",\n") + } + if this.Qlen != nil { + s = append(s, "Qlen: "+valueToGoStringMesos(this.Qlen, "uint64")+",\n") + } + if this.RateBPS != nil { + s = append(s, "RateBPS: "+valueToGoStringMesos(this.RateBPS, "uint64")+",\n") + } + if this.RatePPS != nil { + s = append(s, "RatePPS: "+valueToGoStringMesos(this.RatePPS, "uint64")+",\n") + } + if this.Requeues != nil { + s = append(s, "Requeues: "+valueToGoStringMesos(this.Requeues, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *IpStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 23) + s = append(s, "&mesos.IpStatistics{") + if this.Forwarding != nil { + s = append(s, "Forwarding: "+valueToGoStringMesos(this.Forwarding, "int64")+",\n") + } + if this.DefaultTTL != nil { + s = append(s, "DefaultTTL: "+valueToGoStringMesos(this.DefaultTTL, "int64")+",\n") + } + if this.InReceives != nil { + s = append(s, "InReceives: "+valueToGoStringMesos(this.InReceives, "int64")+",\n") + } + if this.InHdrErrors != nil { + s = append(s, "InHdrErrors: "+valueToGoStringMesos(this.InHdrErrors, "int64")+",\n") + } + if this.InAddrErrors != nil { + s = append(s, "InAddrErrors: "+valueToGoStringMesos(this.InAddrErrors, "int64")+",\n") + } + if this.ForwDatagrams != nil { + s = append(s, "ForwDatagrams: "+valueToGoStringMesos(this.ForwDatagrams, "int64")+",\n") + } + if this.InUnknownProtos != nil { + s = append(s, "InUnknownProtos: "+valueToGoStringMesos(this.InUnknownProtos, "int64")+",\n") + } + if this.InDiscards != nil { + s = append(s, "InDiscards: "+valueToGoStringMesos(this.InDiscards, "int64")+",\n") + } + if this.InDelivers != nil { + s = append(s, "InDelivers: "+valueToGoStringMesos(this.InDelivers, "int64")+",\n") + } + if this.OutRequests != nil { + s = append(s, "OutRequests: "+valueToGoStringMesos(this.OutRequests, "int64")+",\n") + } + if this.OutDiscards != nil { + s = append(s, "OutDiscards: "+valueToGoStringMesos(this.OutDiscards, "int64")+",\n") + } + if this.OutNoRoutes != nil { + s = append(s, "OutNoRoutes: "+valueToGoStringMesos(this.OutNoRoutes, "int64")+",\n") + } + if this.ReasmTimeout != nil { + s = append(s, "ReasmTimeout: "+valueToGoStringMesos(this.ReasmTimeout, "int64")+",\n") + } + if this.ReasmReqds != nil { + s = append(s, "ReasmReqds: "+valueToGoStringMesos(this.ReasmReqds, "int64")+",\n") + } + if this.ReasmOKs != nil { + s = append(s, "ReasmOKs: "+valueToGoStringMesos(this.ReasmOKs, "int64")+",\n") + } + if this.ReasmFails != nil { + s = append(s, "ReasmFails: "+valueToGoStringMesos(this.ReasmFails, "int64")+",\n") + } + if this.FragOKs != nil { + s = append(s, "FragOKs: "+valueToGoStringMesos(this.FragOKs, "int64")+",\n") + } + if this.FragFails != nil { + s = append(s, "FragFails: "+valueToGoStringMesos(this.FragFails, "int64")+",\n") + } + if this.FragCreates != nil { + s = append(s, "FragCreates: "+valueToGoStringMesos(this.FragCreates, "int64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *IcmpStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 31) + s = append(s, "&mesos.IcmpStatistics{") + if this.InMsgs != nil { + s = append(s, "InMsgs: "+valueToGoStringMesos(this.InMsgs, "int64")+",\n") + } + if this.InErrors != nil { + s = append(s, "InErrors: "+valueToGoStringMesos(this.InErrors, "int64")+",\n") + } + if this.InCsumErrors != nil { + s = append(s, "InCsumErrors: "+valueToGoStringMesos(this.InCsumErrors, "int64")+",\n") + } + if this.InDestUnreachs != nil { + s = append(s, "InDestUnreachs: "+valueToGoStringMesos(this.InDestUnreachs, "int64")+",\n") + } + if this.InTimeExcds != nil { + s = append(s, "InTimeExcds: "+valueToGoStringMesos(this.InTimeExcds, "int64")+",\n") + } + if this.InParmProbs != nil { + s = append(s, "InParmProbs: "+valueToGoStringMesos(this.InParmProbs, "int64")+",\n") + } + if this.InSrcQuenchs != nil { + s = append(s, "InSrcQuenchs: "+valueToGoStringMesos(this.InSrcQuenchs, "int64")+",\n") + } + if this.InRedirects != nil { + s = append(s, "InRedirects: "+valueToGoStringMesos(this.InRedirects, "int64")+",\n") + } + if this.InEchos != nil { + s = append(s, "InEchos: "+valueToGoStringMesos(this.InEchos, "int64")+",\n") + } + if this.InEchoReps != nil { + s = append(s, "InEchoReps: "+valueToGoStringMesos(this.InEchoReps, "int64")+",\n") + } + if this.InTimestamps != nil { + s = append(s, "InTimestamps: "+valueToGoStringMesos(this.InTimestamps, "int64")+",\n") + } + if this.InTimestampReps != nil { + s = append(s, "InTimestampReps: "+valueToGoStringMesos(this.InTimestampReps, "int64")+",\n") + } + if this.InAddrMasks != nil { + s = append(s, "InAddrMasks: "+valueToGoStringMesos(this.InAddrMasks, "int64")+",\n") + } + if this.InAddrMaskReps != nil { + s = append(s, "InAddrMaskReps: "+valueToGoStringMesos(this.InAddrMaskReps, "int64")+",\n") + } + if this.OutMsgs != nil { + s = append(s, "OutMsgs: "+valueToGoStringMesos(this.OutMsgs, "int64")+",\n") + } + if this.OutErrors != nil { + s = append(s, "OutErrors: "+valueToGoStringMesos(this.OutErrors, "int64")+",\n") + } + if this.OutDestUnreachs != nil { + s = append(s, "OutDestUnreachs: "+valueToGoStringMesos(this.OutDestUnreachs, "int64")+",\n") + } + if this.OutTimeExcds != nil { + s = append(s, "OutTimeExcds: "+valueToGoStringMesos(this.OutTimeExcds, "int64")+",\n") + } + if this.OutParmProbs != nil { + s = append(s, "OutParmProbs: "+valueToGoStringMesos(this.OutParmProbs, "int64")+",\n") + } + if this.OutSrcQuenchs != nil { + s = append(s, "OutSrcQuenchs: "+valueToGoStringMesos(this.OutSrcQuenchs, "int64")+",\n") + } + if this.OutRedirects != nil { + s = append(s, "OutRedirects: "+valueToGoStringMesos(this.OutRedirects, "int64")+",\n") + } + if this.OutEchos != nil { + s = append(s, "OutEchos: "+valueToGoStringMesos(this.OutEchos, "int64")+",\n") + } + if this.OutEchoReps != nil { + s = append(s, "OutEchoReps: "+valueToGoStringMesos(this.OutEchoReps, "int64")+",\n") + } + if this.OutTimestamps != nil { + s = append(s, "OutTimestamps: "+valueToGoStringMesos(this.OutTimestamps, "int64")+",\n") + } + if this.OutTimestampReps != nil { + s = append(s, "OutTimestampReps: "+valueToGoStringMesos(this.OutTimestampReps, "int64")+",\n") + } + if this.OutAddrMasks != nil { + s = append(s, "OutAddrMasks: "+valueToGoStringMesos(this.OutAddrMasks, "int64")+",\n") + } + if this.OutAddrMaskReps != nil { + s = append(s, "OutAddrMaskReps: "+valueToGoStringMesos(this.OutAddrMaskReps, "int64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TcpStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 19) + s = append(s, "&mesos.TcpStatistics{") + if this.RtoAlgorithm != nil { + s = append(s, "RtoAlgorithm: "+valueToGoStringMesos(this.RtoAlgorithm, "int64")+",\n") + } + if this.RtoMin != nil { + s = append(s, "RtoMin: "+valueToGoStringMesos(this.RtoMin, "int64")+",\n") + } + if this.RtoMax != nil { + s = append(s, "RtoMax: "+valueToGoStringMesos(this.RtoMax, "int64")+",\n") + } + if this.MaxConn != nil { + s = append(s, "MaxConn: "+valueToGoStringMesos(this.MaxConn, "int64")+",\n") + } + if this.ActiveOpens != nil { + s = append(s, "ActiveOpens: "+valueToGoStringMesos(this.ActiveOpens, "int64")+",\n") + } + if this.PassiveOpens != nil { + s = append(s, "PassiveOpens: "+valueToGoStringMesos(this.PassiveOpens, "int64")+",\n") + } + if this.AttemptFails != nil { + s = append(s, "AttemptFails: "+valueToGoStringMesos(this.AttemptFails, "int64")+",\n") + } + if this.EstabResets != nil { + s = append(s, "EstabResets: "+valueToGoStringMesos(this.EstabResets, "int64")+",\n") + } + if this.CurrEstab != nil { + s = append(s, "CurrEstab: "+valueToGoStringMesos(this.CurrEstab, "int64")+",\n") + } + if this.InSegs != nil { + s = append(s, "InSegs: "+valueToGoStringMesos(this.InSegs, "int64")+",\n") + } + if this.OutSegs != nil { + s = append(s, "OutSegs: "+valueToGoStringMesos(this.OutSegs, "int64")+",\n") + } + if this.RetransSegs != nil { + s = append(s, "RetransSegs: "+valueToGoStringMesos(this.RetransSegs, "int64")+",\n") + } + if this.InErrs != nil { + s = append(s, "InErrs: "+valueToGoStringMesos(this.InErrs, "int64")+",\n") + } + if this.OutRsts != nil { + s = append(s, "OutRsts: "+valueToGoStringMesos(this.OutRsts, "int64")+",\n") + } + if this.InCsumErrors != nil { + s = append(s, "InCsumErrors: "+valueToGoStringMesos(this.InCsumErrors, "int64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *UdpStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 12) + s = append(s, "&mesos.UdpStatistics{") + if this.InDatagrams != nil { + s = append(s, "InDatagrams: "+valueToGoStringMesos(this.InDatagrams, "int64")+",\n") + } + if this.NoPorts != nil { + s = append(s, "NoPorts: "+valueToGoStringMesos(this.NoPorts, "int64")+",\n") + } + if this.InErrors != nil { + s = append(s, "InErrors: "+valueToGoStringMesos(this.InErrors, "int64")+",\n") + } + if this.OutDatagrams != nil { + s = append(s, "OutDatagrams: "+valueToGoStringMesos(this.OutDatagrams, "int64")+",\n") + } + if this.RcvbufErrors != nil { + s = append(s, "RcvbufErrors: "+valueToGoStringMesos(this.RcvbufErrors, "int64")+",\n") + } + if this.SndbufErrors != nil { + s = append(s, "SndbufErrors: "+valueToGoStringMesos(this.SndbufErrors, "int64")+",\n") + } + if this.InCsumErrors != nil { + s = append(s, "InCsumErrors: "+valueToGoStringMesos(this.InCsumErrors, "int64")+",\n") + } + if this.IgnoredMulti != nil { + s = append(s, "IgnoredMulti: "+valueToGoStringMesos(this.IgnoredMulti, "int64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *SNMPStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.SNMPStatistics{") + if this.IPStats != nil { + s = append(s, "IPStats: "+fmt.Sprintf("%#v", this.IPStats)+",\n") + } + if this.ICMPStats != nil { + s = append(s, "ICMPStats: "+fmt.Sprintf("%#v", this.ICMPStats)+",\n") + } + if this.TCPStats != nil { + s = append(s, "TCPStats: "+fmt.Sprintf("%#v", this.TCPStats)+",\n") + } + if this.UDPStats != nil { + s = append(s, "UDPStats: "+fmt.Sprintf("%#v", this.UDPStats)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DiskStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.DiskStatistics{") + if this.Source != nil { + s = append(s, "Source: "+fmt.Sprintf("%#v", this.Source)+",\n") + } + if this.Persistence != nil { + s = append(s, "Persistence: "+fmt.Sprintf("%#v", this.Persistence)+",\n") + } + if this.LimitBytes != nil { + s = append(s, "LimitBytes: "+valueToGoStringMesos(this.LimitBytes, "uint64")+",\n") + } + if this.UsedBytes != nil { + s = append(s, "UsedBytes: "+valueToGoStringMesos(this.UsedBytes, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ResourceStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 48) + s = append(s, "&mesos.ResourceStatistics{") + s = append(s, "Timestamp: "+fmt.Sprintf("%#v", this.Timestamp)+",\n") + if this.Processes != nil { + s = append(s, "Processes: "+valueToGoStringMesos(this.Processes, "uint32")+",\n") + } + if this.Threads != nil { + s = append(s, "Threads: "+valueToGoStringMesos(this.Threads, "uint32")+",\n") + } + if this.CPUsUserTimeSecs != nil { + s = append(s, "CPUsUserTimeSecs: "+valueToGoStringMesos(this.CPUsUserTimeSecs, "float64")+",\n") + } + if this.CPUsSystemTimeSecs != nil { + s = append(s, "CPUsSystemTimeSecs: "+valueToGoStringMesos(this.CPUsSystemTimeSecs, "float64")+",\n") + } + if this.CPUsLimit != nil { + s = append(s, "CPUsLimit: "+valueToGoStringMesos(this.CPUsLimit, "float64")+",\n") + } + if this.CPUsNrPeriods != nil { + s = append(s, "CPUsNrPeriods: "+valueToGoStringMesos(this.CPUsNrPeriods, "uint32")+",\n") + } + if this.CPUsNrThrottled != nil { + s = append(s, "CPUsNrThrottled: "+valueToGoStringMesos(this.CPUsNrThrottled, "uint32")+",\n") + } + if this.CPUsThrottledTimeSecs != nil { + s = append(s, "CPUsThrottledTimeSecs: "+valueToGoStringMesos(this.CPUsThrottledTimeSecs, "float64")+",\n") + } + if this.MemTotalBytes != nil { + s = append(s, "MemTotalBytes: "+valueToGoStringMesos(this.MemTotalBytes, "uint64")+",\n") + } + if this.MemTotalMemswBytes != nil { + s = append(s, "MemTotalMemswBytes: "+valueToGoStringMesos(this.MemTotalMemswBytes, "uint64")+",\n") + } + if this.MemLimitBytes != nil { + s = append(s, "MemLimitBytes: "+valueToGoStringMesos(this.MemLimitBytes, "uint64")+",\n") + } + if this.MemSoftLimitBytes != nil { + s = append(s, "MemSoftLimitBytes: "+valueToGoStringMesos(this.MemSoftLimitBytes, "uint64")+",\n") + } + if this.MemFileBytes != nil { + s = append(s, "MemFileBytes: "+valueToGoStringMesos(this.MemFileBytes, "uint64")+",\n") + } + if this.MemAnonBytes != nil { + s = append(s, "MemAnonBytes: "+valueToGoStringMesos(this.MemAnonBytes, "uint64")+",\n") + } + if this.MemCacheBytes != nil { + s = append(s, "MemCacheBytes: "+valueToGoStringMesos(this.MemCacheBytes, "uint64")+",\n") + } + if this.MemRSSBytes != nil { + s = append(s, "MemRSSBytes: "+valueToGoStringMesos(this.MemRSSBytes, "uint64")+",\n") + } + if this.MemMappedFileBytes != nil { + s = append(s, "MemMappedFileBytes: "+valueToGoStringMesos(this.MemMappedFileBytes, "uint64")+",\n") + } + if this.MemSwapBytes != nil { + s = append(s, "MemSwapBytes: "+valueToGoStringMesos(this.MemSwapBytes, "uint64")+",\n") + } + if this.MemUnevictableBytes != nil { + s = append(s, "MemUnevictableBytes: "+valueToGoStringMesos(this.MemUnevictableBytes, "uint64")+",\n") + } + if this.MemLowPressureCounter != nil { + s = append(s, "MemLowPressureCounter: "+valueToGoStringMesos(this.MemLowPressureCounter, "uint64")+",\n") + } + if this.MemMediumPressureCounter != nil { + s = append(s, "MemMediumPressureCounter: "+valueToGoStringMesos(this.MemMediumPressureCounter, "uint64")+",\n") + } + if this.MemCriticalPressureCounter != nil { + s = append(s, "MemCriticalPressureCounter: "+valueToGoStringMesos(this.MemCriticalPressureCounter, "uint64")+",\n") + } + if this.DiskLimitBytes != nil { + s = append(s, "DiskLimitBytes: "+valueToGoStringMesos(this.DiskLimitBytes, "uint64")+",\n") + } + if this.DiskUsedBytes != nil { + s = append(s, "DiskUsedBytes: "+valueToGoStringMesos(this.DiskUsedBytes, "uint64")+",\n") + } + if this.DiskStatistics != nil { + s = append(s, "DiskStatistics: "+fmt.Sprintf("%#v", this.DiskStatistics)+",\n") + } + if this.BlkioStatistics != nil { + s = append(s, "BlkioStatistics: "+fmt.Sprintf("%#v", this.BlkioStatistics)+",\n") + } + if this.Perf != nil { + s = append(s, "Perf: "+fmt.Sprintf("%#v", this.Perf)+",\n") + } + if this.NetRxPackets != nil { + s = append(s, "NetRxPackets: "+valueToGoStringMesos(this.NetRxPackets, "uint64")+",\n") + } + if this.NetRxBytes != nil { + s = append(s, "NetRxBytes: "+valueToGoStringMesos(this.NetRxBytes, "uint64")+",\n") + } + if this.NetRxErrors != nil { + s = append(s, "NetRxErrors: "+valueToGoStringMesos(this.NetRxErrors, "uint64")+",\n") + } + if this.NetRxDropped != nil { + s = append(s, "NetRxDropped: "+valueToGoStringMesos(this.NetRxDropped, "uint64")+",\n") + } + if this.NetTxPackets != nil { + s = append(s, "NetTxPackets: "+valueToGoStringMesos(this.NetTxPackets, "uint64")+",\n") + } + if this.NetTxBytes != nil { + s = append(s, "NetTxBytes: "+valueToGoStringMesos(this.NetTxBytes, "uint64")+",\n") + } + if this.NetTxErrors != nil { + s = append(s, "NetTxErrors: "+valueToGoStringMesos(this.NetTxErrors, "uint64")+",\n") + } + if this.NetTxDropped != nil { + s = append(s, "NetTxDropped: "+valueToGoStringMesos(this.NetTxDropped, "uint64")+",\n") + } + if this.NetTCPRttMicrosecsP50 != nil { + s = append(s, "NetTCPRttMicrosecsP50: "+valueToGoStringMesos(this.NetTCPRttMicrosecsP50, "float64")+",\n") + } + if this.NetTCPRttMicrosecsP90 != nil { + s = append(s, "NetTCPRttMicrosecsP90: "+valueToGoStringMesos(this.NetTCPRttMicrosecsP90, "float64")+",\n") + } + if this.NetTCPRttMicrosecsP95 != nil { + s = append(s, "NetTCPRttMicrosecsP95: "+valueToGoStringMesos(this.NetTCPRttMicrosecsP95, "float64")+",\n") + } + if this.NetTCPRttMicrosecsP99 != nil { + s = append(s, "NetTCPRttMicrosecsP99: "+valueToGoStringMesos(this.NetTCPRttMicrosecsP99, "float64")+",\n") + } + if this.NetTCPActiveConnections != nil { + s = append(s, "NetTCPActiveConnections: "+valueToGoStringMesos(this.NetTCPActiveConnections, "float64")+",\n") + } + if this.NetTCPTimeWaitConnections != nil { + s = append(s, "NetTCPTimeWaitConnections: "+valueToGoStringMesos(this.NetTCPTimeWaitConnections, "float64")+",\n") + } + if this.NetTrafficControlStatistics != nil { + s = append(s, "NetTrafficControlStatistics: "+fmt.Sprintf("%#v", this.NetTrafficControlStatistics)+",\n") + } + if this.NetSNMPStatistics != nil { + s = append(s, "NetSNMPStatistics: "+fmt.Sprintf("%#v", this.NetSNMPStatistics)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ResourceUsage) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.ResourceUsage{") + if this.Executors != nil { + s = append(s, "Executors: "+fmt.Sprintf("%#v", this.Executors)+",\n") + } + if this.Total != nil { + s = append(s, "Total: "+fmt.Sprintf("%#v", this.Total)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ResourceUsage_Executor) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.ResourceUsage_Executor{") + s = append(s, "ExecutorInfo: "+strings.Replace(this.ExecutorInfo.GoString(), `&`, ``, 1)+",\n") + if this.Allocated != nil { + s = append(s, "Allocated: "+fmt.Sprintf("%#v", this.Allocated)+",\n") + } + if this.Statistics != nil { + s = append(s, "Statistics: "+fmt.Sprintf("%#v", this.Statistics)+",\n") + } + s = append(s, "ContainerID: "+strings.Replace(this.ContainerID.GoString(), `&`, ``, 1)+",\n") + if this.Tasks != nil { + s = append(s, "Tasks: "+fmt.Sprintf("%#v", this.Tasks)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ResourceUsage_Executor_Task) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.ResourceUsage_Executor_Task{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "ID: "+strings.Replace(this.ID.GoString(), `&`, ``, 1)+",\n") + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *PerfStatistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 57) + s = append(s, "&mesos.PerfStatistics{") + s = append(s, "Timestamp: "+fmt.Sprintf("%#v", this.Timestamp)+",\n") + s = append(s, "Duration: "+fmt.Sprintf("%#v", this.Duration)+",\n") + if this.Cycles != nil { + s = append(s, "Cycles: "+valueToGoStringMesos(this.Cycles, "uint64")+",\n") + } + if this.StalledCyclesFrontend != nil { + s = append(s, "StalledCyclesFrontend: "+valueToGoStringMesos(this.StalledCyclesFrontend, "uint64")+",\n") + } + if this.StalledCyclesBackend != nil { + s = append(s, "StalledCyclesBackend: "+valueToGoStringMesos(this.StalledCyclesBackend, "uint64")+",\n") + } + if this.Instructions != nil { + s = append(s, "Instructions: "+valueToGoStringMesos(this.Instructions, "uint64")+",\n") + } + if this.CacheReferences != nil { + s = append(s, "CacheReferences: "+valueToGoStringMesos(this.CacheReferences, "uint64")+",\n") + } + if this.CacheMisses != nil { + s = append(s, "CacheMisses: "+valueToGoStringMesos(this.CacheMisses, "uint64")+",\n") + } + if this.Branches != nil { + s = append(s, "Branches: "+valueToGoStringMesos(this.Branches, "uint64")+",\n") + } + if this.BranchMisses != nil { + s = append(s, "BranchMisses: "+valueToGoStringMesos(this.BranchMisses, "uint64")+",\n") + } + if this.BusCycles != nil { + s = append(s, "BusCycles: "+valueToGoStringMesos(this.BusCycles, "uint64")+",\n") + } + if this.RefCycles != nil { + s = append(s, "RefCycles: "+valueToGoStringMesos(this.RefCycles, "uint64")+",\n") + } + if this.CPUClock != nil { + s = append(s, "CPUClock: "+valueToGoStringMesos(this.CPUClock, "float64")+",\n") + } + if this.TaskClock != nil { + s = append(s, "TaskClock: "+valueToGoStringMesos(this.TaskClock, "float64")+",\n") + } + if this.PageFaults != nil { + s = append(s, "PageFaults: "+valueToGoStringMesos(this.PageFaults, "uint64")+",\n") + } + if this.MinorFaults != nil { + s = append(s, "MinorFaults: "+valueToGoStringMesos(this.MinorFaults, "uint64")+",\n") + } + if this.MajorFaults != nil { + s = append(s, "MajorFaults: "+valueToGoStringMesos(this.MajorFaults, "uint64")+",\n") + } + if this.ContextSwitches != nil { + s = append(s, "ContextSwitches: "+valueToGoStringMesos(this.ContextSwitches, "uint64")+",\n") + } + if this.CPUMigrations != nil { + s = append(s, "CPUMigrations: "+valueToGoStringMesos(this.CPUMigrations, "uint64")+",\n") + } + if this.AlignmentFaults != nil { + s = append(s, "AlignmentFaults: "+valueToGoStringMesos(this.AlignmentFaults, "uint64")+",\n") + } + if this.EmulationFaults != nil { + s = append(s, "EmulationFaults: "+valueToGoStringMesos(this.EmulationFaults, "uint64")+",\n") + } + if this.L1DcacheLoads != nil { + s = append(s, "L1DcacheLoads: "+valueToGoStringMesos(this.L1DcacheLoads, "uint64")+",\n") + } + if this.L1DcacheLoadMisses != nil { + s = append(s, "L1DcacheLoadMisses: "+valueToGoStringMesos(this.L1DcacheLoadMisses, "uint64")+",\n") + } + if this.L1DcacheStores != nil { + s = append(s, "L1DcacheStores: "+valueToGoStringMesos(this.L1DcacheStores, "uint64")+",\n") + } + if this.L1DcacheStoreMisses != nil { + s = append(s, "L1DcacheStoreMisses: "+valueToGoStringMesos(this.L1DcacheStoreMisses, "uint64")+",\n") + } + if this.L1DcachePrefetches != nil { + s = append(s, "L1DcachePrefetches: "+valueToGoStringMesos(this.L1DcachePrefetches, "uint64")+",\n") + } + if this.L1DcachePrefetchMisses != nil { + s = append(s, "L1DcachePrefetchMisses: "+valueToGoStringMesos(this.L1DcachePrefetchMisses, "uint64")+",\n") + } + if this.L1IcacheLoads != nil { + s = append(s, "L1IcacheLoads: "+valueToGoStringMesos(this.L1IcacheLoads, "uint64")+",\n") + } + if this.L1IcacheLoadMisses != nil { + s = append(s, "L1IcacheLoadMisses: "+valueToGoStringMesos(this.L1IcacheLoadMisses, "uint64")+",\n") + } + if this.L1IcachePrefetches != nil { + s = append(s, "L1IcachePrefetches: "+valueToGoStringMesos(this.L1IcachePrefetches, "uint64")+",\n") + } + if this.L1IcachePrefetchMisses != nil { + s = append(s, "L1IcachePrefetchMisses: "+valueToGoStringMesos(this.L1IcachePrefetchMisses, "uint64")+",\n") + } + if this.LLCLoads != nil { + s = append(s, "LLCLoads: "+valueToGoStringMesos(this.LLCLoads, "uint64")+",\n") + } + if this.LLCLoadMisses != nil { + s = append(s, "LLCLoadMisses: "+valueToGoStringMesos(this.LLCLoadMisses, "uint64")+",\n") + } + if this.LLCStores != nil { + s = append(s, "LLCStores: "+valueToGoStringMesos(this.LLCStores, "uint64")+",\n") + } + if this.LLCStoreMisses != nil { + s = append(s, "LLCStoreMisses: "+valueToGoStringMesos(this.LLCStoreMisses, "uint64")+",\n") + } + if this.LLCPrefetches != nil { + s = append(s, "LLCPrefetches: "+valueToGoStringMesos(this.LLCPrefetches, "uint64")+",\n") + } + if this.LLCPrefetchMisses != nil { + s = append(s, "LLCPrefetchMisses: "+valueToGoStringMesos(this.LLCPrefetchMisses, "uint64")+",\n") + } + if this.DTLBLoads != nil { + s = append(s, "DTLBLoads: "+valueToGoStringMesos(this.DTLBLoads, "uint64")+",\n") + } + if this.DTLBLoadMisses != nil { + s = append(s, "DTLBLoadMisses: "+valueToGoStringMesos(this.DTLBLoadMisses, "uint64")+",\n") + } + if this.DTLBStores != nil { + s = append(s, "DTLBStores: "+valueToGoStringMesos(this.DTLBStores, "uint64")+",\n") + } + if this.DTLBStoreMisses != nil { + s = append(s, "DTLBStoreMisses: "+valueToGoStringMesos(this.DTLBStoreMisses, "uint64")+",\n") + } + if this.DTLBPrefetches != nil { + s = append(s, "DTLBPrefetches: "+valueToGoStringMesos(this.DTLBPrefetches, "uint64")+",\n") + } + if this.DTLBPrefetchMisses != nil { + s = append(s, "DTLBPrefetchMisses: "+valueToGoStringMesos(this.DTLBPrefetchMisses, "uint64")+",\n") + } + if this.ITLBLoads != nil { + s = append(s, "ITLBLoads: "+valueToGoStringMesos(this.ITLBLoads, "uint64")+",\n") + } + if this.ITLBLoadMisses != nil { + s = append(s, "ITLBLoadMisses: "+valueToGoStringMesos(this.ITLBLoadMisses, "uint64")+",\n") + } + if this.BranchLoads != nil { + s = append(s, "BranchLoads: "+valueToGoStringMesos(this.BranchLoads, "uint64")+",\n") + } + if this.BranchLoadMisses != nil { + s = append(s, "BranchLoadMisses: "+valueToGoStringMesos(this.BranchLoadMisses, "uint64")+",\n") + } + if this.NodeLoads != nil { + s = append(s, "NodeLoads: "+valueToGoStringMesos(this.NodeLoads, "uint64")+",\n") + } + if this.NodeLoadMisses != nil { + s = append(s, "NodeLoadMisses: "+valueToGoStringMesos(this.NodeLoadMisses, "uint64")+",\n") + } + if this.NodeStores != nil { + s = append(s, "NodeStores: "+valueToGoStringMesos(this.NodeStores, "uint64")+",\n") + } + if this.NodeStoreMisses != nil { + s = append(s, "NodeStoreMisses: "+valueToGoStringMesos(this.NodeStoreMisses, "uint64")+",\n") + } + if this.NodePrefetches != nil { + s = append(s, "NodePrefetches: "+valueToGoStringMesos(this.NodePrefetches, "uint64")+",\n") + } + if this.NodePrefetchMisses != nil { + s = append(s, "NodePrefetchMisses: "+valueToGoStringMesos(this.NodePrefetchMisses, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Request) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Request{") + if this.AgentID != nil { + s = append(s, "AgentID: "+fmt.Sprintf("%#v", this.AgentID)+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 15) + s = append(s, "&mesos.Offer{") + s = append(s, "ID: "+strings.Replace(this.ID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "FrameworkID: "+strings.Replace(this.FrameworkID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "AgentID: "+strings.Replace(this.AgentID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "Hostname: "+fmt.Sprintf("%#v", this.Hostname)+",\n") + if this.URL != nil { + s = append(s, "URL: "+fmt.Sprintf("%#v", this.URL)+",\n") + } + if this.Domain != nil { + s = append(s, "Domain: "+fmt.Sprintf("%#v", this.Domain)+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Attributes != nil { + s = append(s, "Attributes: "+fmt.Sprintf("%#v", this.Attributes)+",\n") + } + if this.ExecutorIDs != nil { + s = append(s, "ExecutorIDs: "+fmt.Sprintf("%#v", this.ExecutorIDs)+",\n") + } + if this.Unavailability != nil { + s = append(s, "Unavailability: "+fmt.Sprintf("%#v", this.Unavailability)+",\n") + } + if this.AllocationInfo != nil { + s = append(s, "AllocationInfo: "+fmt.Sprintf("%#v", this.AllocationInfo)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 16) + s = append(s, "&mesos.Offer_Operation{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.ID != nil { + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + } + if this.Launch != nil { + s = append(s, "Launch: "+fmt.Sprintf("%#v", this.Launch)+",\n") + } + if this.LaunchGroup != nil { + s = append(s, "LaunchGroup: "+fmt.Sprintf("%#v", this.LaunchGroup)+",\n") + } + if this.Reserve != nil { + s = append(s, "Reserve: "+fmt.Sprintf("%#v", this.Reserve)+",\n") + } + if this.Unreserve != nil { + s = append(s, "Unreserve: "+fmt.Sprintf("%#v", this.Unreserve)+",\n") + } + if this.Create != nil { + s = append(s, "Create: "+fmt.Sprintf("%#v", this.Create)+",\n") + } + if this.Destroy != nil { + s = append(s, "Destroy: "+fmt.Sprintf("%#v", this.Destroy)+",\n") + } + if this.GrowVolume != nil { + s = append(s, "GrowVolume: "+fmt.Sprintf("%#v", this.GrowVolume)+",\n") + } + if this.ShrinkVolume != nil { + s = append(s, "ShrinkVolume: "+fmt.Sprintf("%#v", this.ShrinkVolume)+",\n") + } + if this.CreateDisk != nil { + s = append(s, "CreateDisk: "+fmt.Sprintf("%#v", this.CreateDisk)+",\n") + } + if this.DestroyDisk != nil { + s = append(s, "DestroyDisk: "+fmt.Sprintf("%#v", this.DestroyDisk)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_Launch) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Offer_Operation_Launch{") + if this.TaskInfos != nil { + s = append(s, "TaskInfos: "+fmt.Sprintf("%#v", this.TaskInfos)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_LaunchGroup) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Offer_Operation_LaunchGroup{") + s = append(s, "Executor: "+strings.Replace(this.Executor.GoString(), `&`, ``, 1)+",\n") + s = append(s, "TaskGroup: "+strings.Replace(this.TaskGroup.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_Reserve) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Offer_Operation_Reserve{") + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_Unreserve) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Offer_Operation_Unreserve{") + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_Create) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Offer_Operation_Create{") + if this.Volumes != nil { + s = append(s, "Volumes: "+fmt.Sprintf("%#v", this.Volumes)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_Destroy) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Offer_Operation_Destroy{") + if this.Volumes != nil { + s = append(s, "Volumes: "+fmt.Sprintf("%#v", this.Volumes)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_GrowVolume) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Offer_Operation_GrowVolume{") + s = append(s, "Volume: "+strings.Replace(this.Volume.GoString(), `&`, ``, 1)+",\n") + s = append(s, "Addition: "+strings.Replace(this.Addition.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_ShrinkVolume) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Offer_Operation_ShrinkVolume{") + s = append(s, "Volume: "+strings.Replace(this.Volume.GoString(), `&`, ``, 1)+",\n") + s = append(s, "Subtract: "+strings.Replace(this.Subtract.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_CreateDisk) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Offer_Operation_CreateDisk{") + s = append(s, "Source: "+strings.Replace(this.Source.GoString(), `&`, ``, 1)+",\n") + s = append(s, "TargetType: "+fmt.Sprintf("%#v", this.TargetType)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Offer_Operation_DestroyDisk) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Offer_Operation_DestroyDisk{") + s = append(s, "Source: "+strings.Replace(this.Source.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *InverseOffer) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&mesos.InverseOffer{") + s = append(s, "OfferID: "+strings.Replace(this.OfferID.GoString(), `&`, ``, 1)+",\n") + if this.URL != nil { + s = append(s, "URL: "+fmt.Sprintf("%#v", this.URL)+",\n") + } + s = append(s, "FrameworkID: "+strings.Replace(this.FrameworkID.GoString(), `&`, ``, 1)+",\n") + if this.AgentID != nil { + s = append(s, "AgentID: "+fmt.Sprintf("%#v", this.AgentID)+",\n") + } + s = append(s, "Unavailability: "+strings.Replace(this.Unavailability.GoString(), `&`, ``, 1)+",\n") + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TaskInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 18) + s = append(s, "&mesos.TaskInfo{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "TaskID: "+strings.Replace(this.TaskID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "AgentID: "+strings.Replace(this.AgentID.GoString(), `&`, ``, 1)+",\n") + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Executor != nil { + s = append(s, "Executor: "+fmt.Sprintf("%#v", this.Executor)+",\n") + } + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.Container != nil { + s = append(s, "Container: "+fmt.Sprintf("%#v", this.Container)+",\n") + } + if this.HealthCheck != nil { + s = append(s, "HealthCheck: "+fmt.Sprintf("%#v", this.HealthCheck)+",\n") + } + if this.Check != nil { + s = append(s, "Check: "+fmt.Sprintf("%#v", this.Check)+",\n") + } + if this.KillPolicy != nil { + s = append(s, "KillPolicy: "+fmt.Sprintf("%#v", this.KillPolicy)+",\n") + } + if this.Data != nil { + s = append(s, "Data: "+valueToGoStringMesos(this.Data, "byte")+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + if this.Discovery != nil { + s = append(s, "Discovery: "+fmt.Sprintf("%#v", this.Discovery)+",\n") + } + if this.MaxCompletionTime != nil { + s = append(s, "MaxCompletionTime: "+fmt.Sprintf("%#v", this.MaxCompletionTime)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TaskGroupInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.TaskGroupInfo{") + if this.Tasks != nil { + s = append(s, "Tasks: "+fmt.Sprintf("%#v", this.Tasks)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Task) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 18) + s = append(s, "&mesos.Task{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "TaskID: "+strings.Replace(this.TaskID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "FrameworkID: "+strings.Replace(this.FrameworkID.GoString(), `&`, ``, 1)+",\n") + if this.ExecutorID != nil { + s = append(s, "ExecutorID: "+fmt.Sprintf("%#v", this.ExecutorID)+",\n") + } + s = append(s, "AgentID: "+strings.Replace(this.AgentID.GoString(), `&`, ``, 1)+",\n") + if this.State != nil { + s = append(s, "State: "+valueToGoStringMesos(this.State, "TaskState")+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + if this.Statuses != nil { + s = append(s, "Statuses: "+fmt.Sprintf("%#v", this.Statuses)+",\n") + } + if this.StatusUpdateState != nil { + s = append(s, "StatusUpdateState: "+valueToGoStringMesos(this.StatusUpdateState, "TaskState")+",\n") + } + if this.StatusUpdateUUID != nil { + s = append(s, "StatusUpdateUUID: "+valueToGoStringMesos(this.StatusUpdateUUID, "byte")+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + if this.Discovery != nil { + s = append(s, "Discovery: "+fmt.Sprintf("%#v", this.Discovery)+",\n") + } + if this.Container != nil { + s = append(s, "Container: "+fmt.Sprintf("%#v", this.Container)+",\n") + } + if this.User != nil { + s = append(s, "User: "+valueToGoStringMesos(this.User, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TaskResourceLimitation) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.TaskResourceLimitation{") + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *UUID) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.UUID{") + if this.Value != nil { + s = append(s, "Value: "+valueToGoStringMesos(this.Value, "byte")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Operation) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 10) + s = append(s, "&mesos.Operation{") + if this.FrameworkID != nil { + s = append(s, "FrameworkID: "+fmt.Sprintf("%#v", this.FrameworkID)+",\n") + } + if this.AgentID != nil { + s = append(s, "AgentID: "+fmt.Sprintf("%#v", this.AgentID)+",\n") + } + s = append(s, "Info: "+strings.Replace(this.Info.GoString(), `&`, ``, 1)+",\n") + s = append(s, "LatestStatus: "+strings.Replace(this.LatestStatus.GoString(), `&`, ``, 1)+",\n") + if this.Statuses != nil { + s = append(s, "Statuses: "+fmt.Sprintf("%#v", this.Statuses)+",\n") + } + s = append(s, "UUID: "+strings.Replace(this.UUID.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *OperationStatus) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.OperationStatus{") + if this.OperationID != nil { + s = append(s, "OperationID: "+fmt.Sprintf("%#v", this.OperationID)+",\n") + } + s = append(s, "State: "+fmt.Sprintf("%#v", this.State)+",\n") + if this.Message != nil { + s = append(s, "Message: "+valueToGoStringMesos(this.Message, "string")+",\n") + } + if this.ConvertedResources != nil { + s = append(s, "ConvertedResources: "+fmt.Sprintf("%#v", this.ConvertedResources)+",\n") + } + if this.UUID != nil { + s = append(s, "UUID: "+fmt.Sprintf("%#v", this.UUID)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckStatusInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.CheckStatusInfo{") + if this.Type != nil { + s = append(s, "Type: "+valueToGoStringMesos(this.Type, "CheckInfo_Type")+",\n") + } + if this.Command != nil { + s = append(s, "Command: "+fmt.Sprintf("%#v", this.Command)+",\n") + } + if this.HTTP != nil { + s = append(s, "HTTP: "+fmt.Sprintf("%#v", this.HTTP)+",\n") + } + if this.TCP != nil { + s = append(s, "TCP: "+fmt.Sprintf("%#v", this.TCP)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckStatusInfo_Command) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CheckStatusInfo_Command{") + if this.ExitCode != nil { + s = append(s, "ExitCode: "+valueToGoStringMesos(this.ExitCode, "int32")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckStatusInfo_Http) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CheckStatusInfo_Http{") + if this.StatusCode != nil { + s = append(s, "StatusCode: "+valueToGoStringMesos(this.StatusCode, "uint32")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CheckStatusInfo_Tcp) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CheckStatusInfo_Tcp{") + if this.Succeeded != nil { + s = append(s, "Succeeded: "+valueToGoStringMesos(this.Succeeded, "bool")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TaskStatus) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 20) + s = append(s, "&mesos.TaskStatus{") + s = append(s, "TaskID: "+strings.Replace(this.TaskID.GoString(), `&`, ``, 1)+",\n") + if this.State != nil { + s = append(s, "State: "+valueToGoStringMesos(this.State, "TaskState")+",\n") + } + if this.Message != nil { + s = append(s, "Message: "+valueToGoStringMesos(this.Message, "string")+",\n") + } + if this.Source != nil { + s = append(s, "Source: "+valueToGoStringMesos(this.Source, "TaskStatus_Source")+",\n") + } + if this.Reason != nil { + s = append(s, "Reason: "+valueToGoStringMesos(this.Reason, "TaskStatus_Reason")+",\n") + } + if this.Data != nil { + s = append(s, "Data: "+valueToGoStringMesos(this.Data, "byte")+",\n") + } + if this.AgentID != nil { + s = append(s, "AgentID: "+fmt.Sprintf("%#v", this.AgentID)+",\n") + } + if this.ExecutorID != nil { + s = append(s, "ExecutorID: "+fmt.Sprintf("%#v", this.ExecutorID)+",\n") + } + if this.Timestamp != nil { + s = append(s, "Timestamp: "+valueToGoStringMesos(this.Timestamp, "float64")+",\n") + } + if this.UUID != nil { + s = append(s, "UUID: "+valueToGoStringMesos(this.UUID, "byte")+",\n") + } + if this.Healthy != nil { + s = append(s, "Healthy: "+valueToGoStringMesos(this.Healthy, "bool")+",\n") + } + if this.CheckStatus != nil { + s = append(s, "CheckStatus: "+fmt.Sprintf("%#v", this.CheckStatus)+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + if this.ContainerStatus != nil { + s = append(s, "ContainerStatus: "+fmt.Sprintf("%#v", this.ContainerStatus)+",\n") + } + if this.UnreachableTime != nil { + s = append(s, "UnreachableTime: "+fmt.Sprintf("%#v", this.UnreachableTime)+",\n") + } + if this.Limitation != nil { + s = append(s, "Limitation: "+fmt.Sprintf("%#v", this.Limitation)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Filters) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Filters{") + if this.RefuseSeconds != nil { + s = append(s, "RefuseSeconds: "+valueToGoStringMesos(this.RefuseSeconds, "float64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Environment) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Environment{") + if this.Variables != nil { + s = append(s, "Variables: "+fmt.Sprintf("%#v", this.Variables)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Environment_Variable) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.Environment_Variable{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Type != nil { + s = append(s, "Type: "+valueToGoStringMesos(this.Type, "Environment_Variable_Type")+",\n") + } + if this.Value != nil { + s = append(s, "Value: "+valueToGoStringMesos(this.Value, "string")+",\n") + } + if this.Secret != nil { + s = append(s, "Secret: "+fmt.Sprintf("%#v", this.Secret)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Parameter) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Parameter{") + s = append(s, "Key: "+fmt.Sprintf("%#v", this.Key)+",\n") + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Parameters) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Parameters{") + if this.Parameter != nil { + s = append(s, "Parameter: "+fmt.Sprintf("%#v", this.Parameter)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Credential) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Credential{") + s = append(s, "Principal: "+fmt.Sprintf("%#v", this.Principal)+",\n") + if this.Secret != nil { + s = append(s, "Secret: "+valueToGoStringMesos(this.Secret, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Credentials) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Credentials{") + if this.Credentials != nil { + s = append(s, "Credentials: "+fmt.Sprintf("%#v", this.Credentials)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Secret) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.Secret{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Reference != nil { + s = append(s, "Reference: "+fmt.Sprintf("%#v", this.Reference)+",\n") + } + if this.Value != nil { + s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Secret_Reference) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Secret_Reference{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Key != nil { + s = append(s, "Key: "+valueToGoStringMesos(this.Key, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Secret_Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Secret_Value{") + if this.Data != nil { + s = append(s, "Data: "+valueToGoStringMesos(this.Data, "byte")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *RateLimit) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.RateLimit{") + if this.QPS != nil { + s = append(s, "QPS: "+valueToGoStringMesos(this.QPS, "float64")+",\n") + } + s = append(s, "Principal: "+fmt.Sprintf("%#v", this.Principal)+",\n") + if this.Capacity != nil { + s = append(s, "Capacity: "+valueToGoStringMesos(this.Capacity, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *RateLimits) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.RateLimits{") + if this.Limits != nil { + s = append(s, "Limits: "+fmt.Sprintf("%#v", this.Limits)+",\n") + } + if this.AggregateDefaultQPS != nil { + s = append(s, "AggregateDefaultQPS: "+valueToGoStringMesos(this.AggregateDefaultQPS, "float64")+",\n") + } + if this.AggregateDefaultCapacity != nil { + s = append(s, "AggregateDefaultCapacity: "+valueToGoStringMesos(this.AggregateDefaultCapacity, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Image) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.Image{") + if this.Type != nil { + s = append(s, "Type: "+valueToGoStringMesos(this.Type, "Image_Type")+",\n") + } + if this.Appc != nil { + s = append(s, "Appc: "+fmt.Sprintf("%#v", this.Appc)+",\n") + } + if this.Docker != nil { + s = append(s, "Docker: "+fmt.Sprintf("%#v", this.Docker)+",\n") + } + if this.Cached != nil { + s = append(s, "Cached: "+valueToGoStringMesos(this.Cached, "bool")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Image_Appc) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.Image_Appc{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.ID != nil { + s = append(s, "ID: "+valueToGoStringMesos(this.ID, "string")+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Image_Docker) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.Image_Docker{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Credential != nil { + s = append(s, "Credential: "+fmt.Sprintf("%#v", this.Credential)+",\n") + } + if this.Config != nil { + s = append(s, "Config: "+fmt.Sprintf("%#v", this.Config)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *MountPropagation) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.MountPropagation{") + if this.Mode != nil { + s = append(s, "Mode: "+valueToGoStringMesos(this.Mode, "MountPropagation_Mode")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Volume) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.Volume{") + if this.Mode != nil { + s = append(s, "Mode: "+valueToGoStringMesos(this.Mode, "Volume_Mode")+",\n") + } + s = append(s, "ContainerPath: "+fmt.Sprintf("%#v", this.ContainerPath)+",\n") + if this.HostPath != nil { + s = append(s, "HostPath: "+valueToGoStringMesos(this.HostPath, "string")+",\n") + } + if this.Image != nil { + s = append(s, "Image: "+fmt.Sprintf("%#v", this.Image)+",\n") + } + if this.Source != nil { + s = append(s, "Source: "+fmt.Sprintf("%#v", this.Source)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Volume_Source) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.Volume_Source{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.DockerVolume != nil { + s = append(s, "DockerVolume: "+fmt.Sprintf("%#v", this.DockerVolume)+",\n") + } + if this.HostPath != nil { + s = append(s, "HostPath: "+fmt.Sprintf("%#v", this.HostPath)+",\n") + } + if this.SandboxPath != nil { + s = append(s, "SandboxPath: "+fmt.Sprintf("%#v", this.SandboxPath)+",\n") + } + if this.Secret != nil { + s = append(s, "Secret: "+fmt.Sprintf("%#v", this.Secret)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Volume_Source_DockerVolume) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.Volume_Source_DockerVolume{") + if this.Driver != nil { + s = append(s, "Driver: "+valueToGoStringMesos(this.Driver, "string")+",\n") + } + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.DriverOptions != nil { + s = append(s, "DriverOptions: "+fmt.Sprintf("%#v", this.DriverOptions)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Volume_Source_HostPath) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Volume_Source_HostPath{") + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + if this.MountPropagation != nil { + s = append(s, "MountPropagation: "+fmt.Sprintf("%#v", this.MountPropagation)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Volume_Source_SandboxPath) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Volume_Source_SandboxPath{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *NetworkInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.NetworkInfo{") + if this.IPAddresses != nil { + s = append(s, "IPAddresses: "+fmt.Sprintf("%#v", this.IPAddresses)+",\n") + } + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringMesos(this.Name, "string")+",\n") + } + if this.Groups != nil { + s = append(s, "Groups: "+fmt.Sprintf("%#v", this.Groups)+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + if this.PortMappings != nil { + s = append(s, "PortMappings: "+fmt.Sprintf("%#v", this.PortMappings)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *NetworkInfo_IPAddress) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.NetworkInfo_IPAddress{") + if this.Protocol != nil { + s = append(s, "Protocol: "+valueToGoStringMesos(this.Protocol, "NetworkInfo_Protocol")+",\n") + } + if this.IPAddress != nil { + s = append(s, "IPAddress: "+valueToGoStringMesos(this.IPAddress, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *NetworkInfo_PortMapping) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.NetworkInfo_PortMapping{") + s = append(s, "HostPort: "+fmt.Sprintf("%#v", this.HostPort)+",\n") + s = append(s, "ContainerPort: "+fmt.Sprintf("%#v", this.ContainerPort)+",\n") + if this.Protocol != nil { + s = append(s, "Protocol: "+valueToGoStringMesos(this.Protocol, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CapabilityInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CapabilityInfo{") + if this.Capabilities != nil { + s = append(s, "Capabilities: "+fmt.Sprintf("%#v", this.Capabilities)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *LinuxInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.LinuxInfo{") + if this.CapabilityInfo != nil { + s = append(s, "CapabilityInfo: "+fmt.Sprintf("%#v", this.CapabilityInfo)+",\n") + } + if this.BoundingCapabilities != nil { + s = append(s, "BoundingCapabilities: "+fmt.Sprintf("%#v", this.BoundingCapabilities)+",\n") + } + if this.EffectiveCapabilities != nil { + s = append(s, "EffectiveCapabilities: "+fmt.Sprintf("%#v", this.EffectiveCapabilities)+",\n") + } + if this.SharePIDNamespace != nil { + s = append(s, "SharePIDNamespace: "+valueToGoStringMesos(this.SharePIDNamespace, "bool")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *RLimitInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.RLimitInfo{") + if this.Rlimits != nil { + s = append(s, "Rlimits: "+fmt.Sprintf("%#v", this.Rlimits)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *RLimitInfo_RLimit) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.RLimitInfo_RLimit{") + s = append(s, "Type: "+fmt.Sprintf("%#v", this.Type)+",\n") + if this.Hard != nil { + s = append(s, "Hard: "+valueToGoStringMesos(this.Hard, "uint64")+",\n") + } + if this.Soft != nil { + s = append(s, "Soft: "+valueToGoStringMesos(this.Soft, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TTYInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.TTYInfo{") + if this.WindowSize != nil { + s = append(s, "WindowSize: "+fmt.Sprintf("%#v", this.WindowSize)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *TTYInfo_WindowSize) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.TTYInfo_WindowSize{") + s = append(s, "Rows: "+fmt.Sprintf("%#v", this.Rows)+",\n") + s = append(s, "Columns: "+fmt.Sprintf("%#v", this.Columns)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ContainerInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 13) + s = append(s, "&mesos.ContainerInfo{") + if this.Type != nil { + s = append(s, "Type: "+valueToGoStringMesos(this.Type, "ContainerInfo_Type")+",\n") + } + if this.Volumes != nil { + s = append(s, "Volumes: "+fmt.Sprintf("%#v", this.Volumes)+",\n") + } + if this.Hostname != nil { + s = append(s, "Hostname: "+valueToGoStringMesos(this.Hostname, "string")+",\n") + } + if this.Docker != nil { + s = append(s, "Docker: "+fmt.Sprintf("%#v", this.Docker)+",\n") + } + if this.Mesos != nil { + s = append(s, "Mesos: "+fmt.Sprintf("%#v", this.Mesos)+",\n") + } + if this.NetworkInfos != nil { + s = append(s, "NetworkInfos: "+fmt.Sprintf("%#v", this.NetworkInfos)+",\n") + } + if this.LinuxInfo != nil { + s = append(s, "LinuxInfo: "+fmt.Sprintf("%#v", this.LinuxInfo)+",\n") + } + if this.RlimitInfo != nil { + s = append(s, "RlimitInfo: "+fmt.Sprintf("%#v", this.RlimitInfo)+",\n") + } + if this.TTYInfo != nil { + s = append(s, "TTYInfo: "+fmt.Sprintf("%#v", this.TTYInfo)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ContainerInfo_DockerInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&mesos.ContainerInfo_DockerInfo{") + s = append(s, "Image: "+fmt.Sprintf("%#v", this.Image)+",\n") + if this.Network != nil { + s = append(s, "Network: "+valueToGoStringMesos(this.Network, "ContainerInfo_DockerInfo_Network")+",\n") + } + if this.PortMappings != nil { + s = append(s, "PortMappings: "+fmt.Sprintf("%#v", this.PortMappings)+",\n") + } + if this.Privileged != nil { + s = append(s, "Privileged: "+valueToGoStringMesos(this.Privileged, "bool")+",\n") + } + if this.Parameters != nil { + s = append(s, "Parameters: "+fmt.Sprintf("%#v", this.Parameters)+",\n") + } + if this.ForcePullImage != nil { + s = append(s, "ForcePullImage: "+valueToGoStringMesos(this.ForcePullImage, "bool")+",\n") + } + if this.VolumeDriver != nil { + s = append(s, "VolumeDriver: "+valueToGoStringMesos(this.VolumeDriver, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ContainerInfo_DockerInfo_PortMapping) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.ContainerInfo_DockerInfo_PortMapping{") + s = append(s, "HostPort: "+fmt.Sprintf("%#v", this.HostPort)+",\n") + s = append(s, "ContainerPort: "+fmt.Sprintf("%#v", this.ContainerPort)+",\n") + if this.Protocol != nil { + s = append(s, "Protocol: "+valueToGoStringMesos(this.Protocol, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ContainerInfo_MesosInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.ContainerInfo_MesosInfo{") + if this.Image != nil { + s = append(s, "Image: "+fmt.Sprintf("%#v", this.Image)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *ContainerStatus) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.ContainerStatus{") + if this.ContainerID != nil { + s = append(s, "ContainerID: "+fmt.Sprintf("%#v", this.ContainerID)+",\n") + } + if this.NetworkInfos != nil { + s = append(s, "NetworkInfos: "+fmt.Sprintf("%#v", this.NetworkInfos)+",\n") + } + if this.CgroupInfo != nil { + s = append(s, "CgroupInfo: "+fmt.Sprintf("%#v", this.CgroupInfo)+",\n") + } + if this.ExecutorPID != nil { + s = append(s, "ExecutorPID: "+valueToGoStringMesos(this.ExecutorPID, "uint32")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CgroupInfo{") + if this.NetCLS != nil { + s = append(s, "NetCLS: "+fmt.Sprintf("%#v", this.NetCLS)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_Blkio) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 4) + s = append(s, "&mesos.CgroupInfo_Blkio{") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_Blkio_Value) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.CgroupInfo_Blkio_Value{") + if this.Op != nil { + s = append(s, "Op: "+valueToGoStringMesos(this.Op, "CgroupInfo_Blkio_Operation")+",\n") + } + if this.Value != nil { + s = append(s, "Value: "+valueToGoStringMesos(this.Value, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_Blkio_CFQ) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 4) + s = append(s, "&mesos.CgroupInfo_Blkio_CFQ{") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_Blkio_CFQ_Statistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 13) + s = append(s, "&mesos.CgroupInfo_Blkio_CFQ_Statistics{") + if this.Device != nil { + s = append(s, "Device: "+fmt.Sprintf("%#v", this.Device)+",\n") + } + if this.Sectors != nil { + s = append(s, "Sectors: "+valueToGoStringMesos(this.Sectors, "uint64")+",\n") + } + if this.Time != nil { + s = append(s, "Time: "+valueToGoStringMesos(this.Time, "uint64")+",\n") + } + if this.IOServiced != nil { + s = append(s, "IOServiced: "+fmt.Sprintf("%#v", this.IOServiced)+",\n") + } + if this.IOServiceBytes != nil { + s = append(s, "IOServiceBytes: "+fmt.Sprintf("%#v", this.IOServiceBytes)+",\n") + } + if this.IOServiceTime != nil { + s = append(s, "IOServiceTime: "+fmt.Sprintf("%#v", this.IOServiceTime)+",\n") + } + if this.IOWaitTime != nil { + s = append(s, "IOWaitTime: "+fmt.Sprintf("%#v", this.IOWaitTime)+",\n") + } + if this.IOMerged != nil { + s = append(s, "IOMerged: "+fmt.Sprintf("%#v", this.IOMerged)+",\n") + } + if this.IOQueued != nil { + s = append(s, "IOQueued: "+fmt.Sprintf("%#v", this.IOQueued)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_Blkio_Throttling) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 4) + s = append(s, "&mesos.CgroupInfo_Blkio_Throttling{") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_Blkio_Throttling_Statistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.CgroupInfo_Blkio_Throttling_Statistics{") + if this.Device != nil { + s = append(s, "Device: "+fmt.Sprintf("%#v", this.Device)+",\n") + } + if this.IOServiced != nil { + s = append(s, "IOServiced: "+fmt.Sprintf("%#v", this.IOServiced)+",\n") + } + if this.IOServiceBytes != nil { + s = append(s, "IOServiceBytes: "+fmt.Sprintf("%#v", this.IOServiceBytes)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_Blkio_Statistics) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.CgroupInfo_Blkio_Statistics{") + if this.CFQ != nil { + s = append(s, "CFQ: "+fmt.Sprintf("%#v", this.CFQ)+",\n") + } + if this.CFQRecursive != nil { + s = append(s, "CFQRecursive: "+fmt.Sprintf("%#v", this.CFQRecursive)+",\n") + } + if this.Throttling != nil { + s = append(s, "Throttling: "+fmt.Sprintf("%#v", this.Throttling)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *CgroupInfo_NetCls) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.CgroupInfo_NetCls{") + if this.ClassID != nil { + s = append(s, "ClassID: "+valueToGoStringMesos(this.ClassID, "uint32")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Labels) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Labels{") + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Label) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Label{") + s = append(s, "Key: "+fmt.Sprintf("%#v", this.Key)+",\n") + if this.Value != nil { + s = append(s, "Value: "+valueToGoStringMesos(this.Value, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Port) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 9) + s = append(s, "&mesos.Port{") + s = append(s, "Number: "+fmt.Sprintf("%#v", this.Number)+",\n") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringMesos(this.Name, "string")+",\n") + } + if this.Protocol != nil { + s = append(s, "Protocol: "+valueToGoStringMesos(this.Protocol, "string")+",\n") + } + if this.Visibility != nil { + s = append(s, "Visibility: "+valueToGoStringMesos(this.Visibility, "DiscoveryInfo_Visibility")+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Ports) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.Ports{") + if this.Ports != nil { + s = append(s, "Ports: "+fmt.Sprintf("%#v", this.Ports)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DiscoveryInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&mesos.DiscoveryInfo{") + s = append(s, "Visibility: "+fmt.Sprintf("%#v", this.Visibility)+",\n") + if this.Name != nil { + s = append(s, "Name: "+valueToGoStringMesos(this.Name, "string")+",\n") + } + if this.Environment != nil { + s = append(s, "Environment: "+valueToGoStringMesos(this.Environment, "string")+",\n") + } + if this.Location != nil { + s = append(s, "Location: "+valueToGoStringMesos(this.Location, "string")+",\n") + } + if this.Version != nil { + s = append(s, "Version: "+valueToGoStringMesos(this.Version, "string")+",\n") + } + if this.Ports != nil { + s = append(s, "Ports: "+fmt.Sprintf("%#v", this.Ports)+",\n") + } + if this.Labels != nil { + s = append(s, "Labels: "+fmt.Sprintf("%#v", this.Labels)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *WeightInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.WeightInfo{") + s = append(s, "Weight: "+fmt.Sprintf("%#v", this.Weight)+",\n") + if this.Role != nil { + s = append(s, "Role: "+valueToGoStringMesos(this.Role, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *VersionInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&mesos.VersionInfo{") + s = append(s, "Version: "+fmt.Sprintf("%#v", this.Version)+",\n") + if this.BuildDate != nil { + s = append(s, "BuildDate: "+valueToGoStringMesos(this.BuildDate, "string")+",\n") + } + if this.BuildTime != nil { + s = append(s, "BuildTime: "+valueToGoStringMesos(this.BuildTime, "float64")+",\n") + } + if this.BuildUser != nil { + s = append(s, "BuildUser: "+valueToGoStringMesos(this.BuildUser, "string")+",\n") + } + if this.GitSHA != nil { + s = append(s, "GitSHA: "+valueToGoStringMesos(this.GitSHA, "string")+",\n") + } + if this.GitBranch != nil { + s = append(s, "GitBranch: "+valueToGoStringMesos(this.GitBranch, "string")+",\n") + } + if this.GitTag != nil { + s = append(s, "GitTag: "+valueToGoStringMesos(this.GitTag, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Flag) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Flag{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Value != nil { + s = append(s, "Value: "+valueToGoStringMesos(this.Value, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Role) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&mesos.Role{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + s = append(s, "Weight: "+fmt.Sprintf("%#v", this.Weight)+",\n") + if this.Frameworks != nil { + s = append(s, "Frameworks: "+fmt.Sprintf("%#v", this.Frameworks)+",\n") + } + if this.Resources != nil { + s = append(s, "Resources: "+fmt.Sprintf("%#v", this.Resources)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Metric) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Metric{") + s = append(s, "Name: "+fmt.Sprintf("%#v", this.Name)+",\n") + if this.Value != nil { + s = append(s, "Value: "+valueToGoStringMesos(this.Value, "float64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *FileInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 11) + s = append(s, "&mesos.FileInfo{") + s = append(s, "Path: "+fmt.Sprintf("%#v", this.Path)+",\n") + if this.Nlink != nil { + s = append(s, "Nlink: "+valueToGoStringMesos(this.Nlink, "int32")+",\n") + } + if this.Size != nil { + s = append(s, "Size: "+valueToGoStringMesos(this.Size, "uint64")+",\n") + } + if this.Mtime != nil { + s = append(s, "Mtime: "+fmt.Sprintf("%#v", this.Mtime)+",\n") + } + if this.Mode != nil { + s = append(s, "Mode: "+valueToGoStringMesos(this.Mode, "uint32")+",\n") + } + if this.UID != nil { + s = append(s, "UID: "+valueToGoStringMesos(this.UID, "string")+",\n") + } + if this.GID != nil { + s = append(s, "GID: "+valueToGoStringMesos(this.GID, "string")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Device) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Device{") + if this.Path != nil { + s = append(s, "Path: "+valueToGoStringMesos(this.Path, "string")+",\n") + } + if this.Number != nil { + s = append(s, "Number: "+fmt.Sprintf("%#v", this.Number)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *Device_Number) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.Device_Number{") + if this.MajorNumber != nil { + s = append(s, "MajorNumber: "+valueToGoStringMesos(this.MajorNumber, "uint64")+",\n") + } + if this.MinorNumber != nil { + s = append(s, "MinorNumber: "+valueToGoStringMesos(this.MinorNumber, "uint64")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DeviceAccess) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&mesos.DeviceAccess{") + s = append(s, "Device: "+strings.Replace(this.Device.GoString(), `&`, ``, 1)+",\n") + s = append(s, "Access: "+strings.Replace(this.Access.GoString(), `&`, ``, 1)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DeviceAccess_Access) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&mesos.DeviceAccess_Access{") + if this.Read != nil { + s = append(s, "Read: "+valueToGoStringMesos(this.Read, "bool")+",\n") + } + if this.Write != nil { + s = append(s, "Write: "+valueToGoStringMesos(this.Write, "bool")+",\n") + } + if this.Mknod != nil { + s = append(s, "Mknod: "+valueToGoStringMesos(this.Mknod, "bool")+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DeviceWhitelist) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&mesos.DeviceWhitelist{") + if this.AllowedDevices != nil { + s = append(s, "AllowedDevices: "+fmt.Sprintf("%#v", this.AllowedDevices)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} +func valueToGoStringMesos(v interface{}, typ string) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +} +func (m *FrameworkID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FrameworkID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *OfferID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OfferID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *AgentID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AgentID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *TaskID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TaskID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *ExecutorID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExecutorID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *ContainerID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + if m.Parent != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Parent.ProtoSize())) + n1, err := m.Parent.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + return i, nil +} + +func (m *ResourceProviderID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceProviderID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *OperationID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OperationID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *TimeInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimeInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Nanoseconds)) + return i, nil +} + +func (m *DurationInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DurationInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Nanoseconds)) + return i, nil +} + +func (m *Address) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Address) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Hostname != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Hostname))) + i += copy(dAtA[i:], *m.Hostname) + } + if m.IP != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.IP))) + i += copy(dAtA[i:], *m.IP) + } + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Port)) + return i, nil +} + +func (m *URL) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *URL) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Scheme))) + i += copy(dAtA[i:], m.Scheme) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Address.ProtoSize())) + n2, err := m.Address.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + if m.Path != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Path))) + i += copy(dAtA[i:], *m.Path) + } + if len(m.Query) > 0 { + for _, msg := range m.Query { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Fragment != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Fragment))) + i += copy(dAtA[i:], *m.Fragment) + } + return i, nil +} + +func (m *Unavailability) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Unavailability) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Start.ProtoSize())) + n3, err := m.Start.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + if m.Duration != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Duration.ProtoSize())) + n4, err := m.Duration.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + return i, nil +} + +func (m *MachineID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Hostname != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Hostname))) + i += copy(dAtA[i:], *m.Hostname) + } + if m.IP != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.IP))) + i += copy(dAtA[i:], *m.IP) + } + return i, nil +} + +func (m *MachineInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MachineInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ID.ProtoSize())) + n5, err := m.ID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + if m.Mode != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Mode)) + } + if m.Unavailability != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Unavailability.ProtoSize())) + n6, err := m.Unavailability.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + return i, nil +} + +func (m *FrameworkInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FrameworkInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.ID != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ID.ProtoSize())) + n7, err := m.ID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + if m.FailoverTimeout != nil { + dAtA[i] = 0x21 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.FailoverTimeout)))) + } + if m.Checkpoint != nil { + dAtA[i] = 0x28 + i++ + if *m.Checkpoint { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Role != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Role))) + i += copy(dAtA[i:], *m.Role) + } + if m.Hostname != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Hostname))) + i += copy(dAtA[i:], *m.Hostname) + } + if m.Principal != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Principal))) + i += copy(dAtA[i:], *m.Principal) + } + if m.WebUiURL != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.WebUiURL))) + i += copy(dAtA[i:], *m.WebUiURL) + } + if len(m.Capabilities) > 0 { + for _, msg := range m.Capabilities { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Labels != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n8, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + dAtA[i] = 0x62 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *FrameworkInfo_Capability) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FrameworkInfo_Capability) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + return i, nil +} + +func (m *CheckInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.Command != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Command.ProtoSize())) + n9, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + } + if m.HTTP != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.HTTP.ProtoSize())) + n10, err := m.HTTP.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + } + if m.DelaySeconds != nil { + dAtA[i] = 0x21 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.DelaySeconds)))) + } + if m.IntervalSeconds != nil { + dAtA[i] = 0x29 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.IntervalSeconds)))) + } + if m.TimeoutSeconds != nil { + dAtA[i] = 0x31 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.TimeoutSeconds)))) + } + if m.TCP != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TCP.ProtoSize())) + n11, err := m.TCP.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + return i, nil +} + +func (m *CheckInfo_Command) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckInfo_Command) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Command.ProtoSize())) + n12, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + return i, nil +} + +func (m *CheckInfo_Http) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckInfo_Http) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Port)) + if m.Path != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Path))) + i += copy(dAtA[i:], *m.Path) + } + return i, nil +} + +func (m *CheckInfo_Tcp) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckInfo_Tcp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Port)) + return i, nil +} + +func (m *HealthCheck) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HealthCheck) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.HTTP != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.HTTP.ProtoSize())) + n13, err := m.HTTP.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n13 + } + if m.DelaySeconds != nil { + dAtA[i] = 0x11 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.DelaySeconds)))) + } + if m.IntervalSeconds != nil { + dAtA[i] = 0x19 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.IntervalSeconds)))) + } + if m.TimeoutSeconds != nil { + dAtA[i] = 0x21 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.TimeoutSeconds)))) + } + if m.ConsecutiveFailures != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ConsecutiveFailures)) + } + if m.GracePeriodSeconds != nil { + dAtA[i] = 0x31 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.GracePeriodSeconds)))) + } + if m.Command != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Command.ProtoSize())) + n14, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + } + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.TCP != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TCP.ProtoSize())) + n15, err := m.TCP.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n15 + } + return i, nil +} + +func (m *HealthCheck_HTTPCheckInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HealthCheck_HTTPCheckInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Port)) + if m.Path != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Path))) + i += copy(dAtA[i:], *m.Path) + } + if m.Scheme != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Scheme))) + i += copy(dAtA[i:], *m.Scheme) + } + if len(m.Statuses) > 0 { + for _, num := range m.Statuses { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(num)) + } + } + if m.Protocol != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Protocol)) + } + return i, nil +} + +func (m *HealthCheck_TCPCheckInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HealthCheck_TCPCheckInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Port)) + if m.Protocol != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Protocol)) + } + return i, nil +} + +func (m *KillPolicy) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *KillPolicy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.GracePeriod != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.GracePeriod.ProtoSize())) + n16, err := m.GracePeriod.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + } + return i, nil +} + +func (m *CommandInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.URIs) > 0 { + for _, msg := range m.URIs { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Environment != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Environment.ProtoSize())) + n17, err := m.Environment.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 + } + if m.Value != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Value))) + i += copy(dAtA[i:], *m.Value) + } + if m.User != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.User))) + i += copy(dAtA[i:], *m.User) + } + if m.Shell != nil { + dAtA[i] = 0x30 + i++ + if *m.Shell { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + dAtA[i] = 0x3a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *CommandInfo_URI) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CommandInfo_URI) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + if m.Executable != nil { + dAtA[i] = 0x10 + i++ + if *m.Executable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Extract != nil { + dAtA[i] = 0x18 + i++ + if *m.Extract { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Cache != nil { + dAtA[i] = 0x20 + i++ + if *m.Cache { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.OutputFile != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.OutputFile))) + i += copy(dAtA[i:], *m.OutputFile) + } + return i, nil +} + +func (m *ExecutorInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExecutorInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ExecutorID.ProtoSize())) + n18, err := m.ExecutorID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n18 + if m.Data != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Command != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Command.ProtoSize())) + n19, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + } + if m.FrameworkID != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.FrameworkID.ProtoSize())) + n20, err := m.FrameworkID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n20 + } + if m.Name != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Name))) + i += copy(dAtA[i:], *m.Name) + } + if m.Source != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Source))) + i += copy(dAtA[i:], *m.Source) + } + if m.Container != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Container.ProtoSize())) + n21, err := m.Container.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n21 + } + if m.Discovery != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Discovery.ProtoSize())) + n22, err := m.Discovery.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n22 + } + if m.ShutdownGracePeriod != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ShutdownGracePeriod.ProtoSize())) + n23, err := m.ShutdownGracePeriod.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n23 + } + if m.Labels != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n24, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n24 + } + dAtA[i] = 0x78 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + return i, nil +} + +func (m *DomainInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DomainInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.FaultDomain != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.FaultDomain.ProtoSize())) + n25, err := m.FaultDomain.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n25 + } + return i, nil +} + +func (m *DomainInfo_FaultDomain) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DomainInfo_FaultDomain) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Region.ProtoSize())) + n26, err := m.Region.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n26 + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Zone.ProtoSize())) + n27, err := m.Zone.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n27 + return i, nil +} + +func (m *DomainInfo_FaultDomain_RegionInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DomainInfo_FaultDomain_RegionInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + return i, nil +} + +func (m *DomainInfo_FaultDomain_ZoneInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DomainInfo_FaultDomain_ZoneInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + return i, nil +} + +func (m *MasterInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MasterInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.ID))) + i += copy(dAtA[i:], m.ID) + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.IP)) + if m.Port == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("port") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Port)) + } + if m.PID != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.PID))) + i += copy(dAtA[i:], *m.PID) + } + if m.Hostname != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Hostname))) + i += copy(dAtA[i:], *m.Hostname) + } + if m.Version != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Version))) + i += copy(dAtA[i:], *m.Version) + } + if m.Address != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Address.ProtoSize())) + n28, err := m.Address.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n28 + } + if m.Domain != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Domain.ProtoSize())) + n29, err := m.Domain.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n29 + } + if len(m.Capabilities) > 0 { + for _, msg := range m.Capabilities { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *MasterInfo_Capability) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MasterInfo_Capability) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + return i, nil +} + +func (m *AgentInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AgentInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Hostname))) + i += copy(dAtA[i:], m.Hostname) + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Attributes) > 0 { + for _, msg := range m.Attributes { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.ID != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ID.ProtoSize())) + n30, err := m.ID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n30 + } + if m.Port != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Port)) + } + if m.Domain != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Domain.ProtoSize())) + n31, err := m.Domain.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + } + return i, nil +} + +func (m *AgentInfo_Capability) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AgentInfo_Capability) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + return i, nil +} + +func (m *CSIPluginContainerInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CSIPluginContainerInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Services) > 0 { + for _, num := range m.Services { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(num)) + } + } + if m.Command != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Command.ProtoSize())) + n32, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n32 + } + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Container != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Container.ProtoSize())) + n33, err := m.Container.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n33 + } + return i, nil +} + +func (m *CSIPluginInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CSIPluginInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if len(m.Containers) > 0 { + for _, msg := range m.Containers { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ResourceProviderInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceProviderInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ID.ProtoSize())) + n34, err := m.ID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n34 + } + if len(m.Attributes) > 0 { + for _, msg := range m.Attributes { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if len(m.DefaultReservations) > 0 { + for _, msg := range m.DefaultReservations { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Storage != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Storage.ProtoSize())) + n35, err := m.Storage.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n35 + } + return i, nil +} + +func (m *ResourceProviderInfo_Storage) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceProviderInfo_Storage) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Plugin.ProtoSize())) + n36, err := m.Plugin.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n36 + return i, nil +} + +func (m *Value) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Value) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.Scalar != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Scalar.ProtoSize())) + n37, err := m.Scalar.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n37 + } + if m.Ranges != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Ranges.ProtoSize())) + n38, err := m.Ranges.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n38 + } + if m.Set != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Set.ProtoSize())) + n39, err := m.Set.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n39 + } + if m.Text != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Text.ProtoSize())) + n40, err := m.Text.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n40 + } + return i, nil +} + +func (m *Value_Scalar) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Value_Scalar) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x9 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(m.Value)))) + return i, nil +} + +func (m *Value_Range) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Value_Range) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Begin)) + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.End)) + return i, nil +} + +func (m *Value_Ranges) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Value_Ranges) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Range) > 0 { + for _, msg := range m.Range { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Value_Set) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Value_Set) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Item) > 0 { + for _, s := range m.Item { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *Value_Text) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Value_Text) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *Attribute) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Attribute) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.Scalar != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Scalar.ProtoSize())) + n41, err := m.Scalar.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n41 + } + if m.Ranges != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Ranges.ProtoSize())) + n42, err := m.Ranges.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n42 + } + if m.Text != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Text.ProtoSize())) + n43, err := m.Text.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n43 + } + if m.Set != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Set.ProtoSize())) + n44, err := m.Set.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n44 + } + return i, nil +} + +func (m *Resource) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.Type == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } else { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Type)) + } + if m.Scalar != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Scalar.ProtoSize())) + n45, err := m.Scalar.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n45 + } + if m.Ranges != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Ranges.ProtoSize())) + n46, err := m.Ranges.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n46 + } + if m.Set != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Set.ProtoSize())) + n47, err := m.Set.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n47 + } + if m.Role != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Role))) + i += copy(dAtA[i:], *m.Role) + } + if m.Disk != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Disk.ProtoSize())) + n48, err := m.Disk.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n48 + } + if m.Reservation != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Reservation.ProtoSize())) + n49, err := m.Reservation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n49 + } + if m.Revocable != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Revocable.ProtoSize())) + n50, err := m.Revocable.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n50 + } + if m.Shared != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Shared.ProtoSize())) + n51, err := m.Shared.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n51 + } + if m.AllocationInfo != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AllocationInfo.ProtoSize())) + n52, err := m.AllocationInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n52 + } + if m.ProviderID != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ProviderID.ProtoSize())) + n53, err := m.ProviderID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n53 + } + if len(m.Reservations) > 0 { + for _, msg := range m.Reservations { + dAtA[i] = 0x6a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Resource_AllocationInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_AllocationInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Role != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Role))) + i += copy(dAtA[i:], *m.Role) + } + return i, nil +} + +func (m *Resource_ReservationInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_ReservationInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Principal != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Principal))) + i += copy(dAtA[i:], *m.Principal) + } + if m.Labels != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n54, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n54 + } + if m.Role != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Role))) + i += copy(dAtA[i:], *m.Role) + } + if m.Type != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Type)) + } + return i, nil +} + +func (m *Resource_DiskInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_DiskInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Persistence != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Persistence.ProtoSize())) + n55, err := m.Persistence.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n55 + } + if m.Volume != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Volume.ProtoSize())) + n56, err := m.Volume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n56 + } + if m.Source != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Source.ProtoSize())) + n57, err := m.Source.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n57 + } + return i, nil +} + +func (m *Resource_DiskInfo_Persistence) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_DiskInfo_Persistence) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.ID))) + i += copy(dAtA[i:], m.ID) + if m.Principal != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Principal))) + i += copy(dAtA[i:], *m.Principal) + } + return i, nil +} + +func (m *Resource_DiskInfo_Source) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_DiskInfo_Source) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.Path != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Path.ProtoSize())) + n58, err := m.Path.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n58 + } + if m.Mount != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Mount.ProtoSize())) + n59, err := m.Mount.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n59 + } + if m.ID != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.ID))) + i += copy(dAtA[i:], *m.ID) + } + if m.Metadata != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Metadata.ProtoSize())) + n60, err := m.Metadata.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n60 + } + if m.Profile != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Profile))) + i += copy(dAtA[i:], *m.Profile) + } + return i, nil +} + +func (m *Resource_DiskInfo_Source_Path) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_DiskInfo_Source_Path) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Root != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Root))) + i += copy(dAtA[i:], *m.Root) + } + return i, nil +} + +func (m *Resource_DiskInfo_Source_Mount) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_DiskInfo_Source_Mount) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Root != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Root))) + i += copy(dAtA[i:], *m.Root) + } + return i, nil +} + +func (m *Resource_RevocableInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_RevocableInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *Resource_SharedInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Resource_SharedInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *TrafficControlStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TrafficControlStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.ID))) + i += copy(dAtA[i:], m.ID) + if m.Backlog != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Backlog)) + } + if m.Bytes != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Bytes)) + } + if m.Drops != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Drops)) + } + if m.Overlimits != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Overlimits)) + } + if m.Packets != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Packets)) + } + if m.Qlen != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Qlen)) + } + if m.RateBPS != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RateBPS)) + } + if m.RatePPS != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RatePPS)) + } + if m.Requeues != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Requeues)) + } + return i, nil +} + +func (m *IpStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IpStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Forwarding != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Forwarding)) + } + if m.DefaultTTL != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DefaultTTL)) + } + if m.InReceives != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InReceives)) + } + if m.InHdrErrors != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InHdrErrors)) + } + if m.InAddrErrors != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InAddrErrors)) + } + if m.ForwDatagrams != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ForwDatagrams)) + } + if m.InUnknownProtos != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InUnknownProtos)) + } + if m.InDiscards != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InDiscards)) + } + if m.InDelivers != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InDelivers)) + } + if m.OutRequests != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutRequests)) + } + if m.OutDiscards != nil { + dAtA[i] = 0x58 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutDiscards)) + } + if m.OutNoRoutes != nil { + dAtA[i] = 0x60 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutNoRoutes)) + } + if m.ReasmTimeout != nil { + dAtA[i] = 0x68 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ReasmTimeout)) + } + if m.ReasmReqds != nil { + dAtA[i] = 0x70 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ReasmReqds)) + } + if m.ReasmOKs != nil { + dAtA[i] = 0x78 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ReasmOKs)) + } + if m.ReasmFails != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ReasmFails)) + } + if m.FragOKs != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.FragOKs)) + } + if m.FragFails != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.FragFails)) + } + if m.FragCreates != nil { + dAtA[i] = 0x98 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.FragCreates)) + } + return i, nil +} + +func (m *IcmpStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IcmpStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.InMsgs != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InMsgs)) + } + if m.InErrors != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InErrors)) + } + if m.InCsumErrors != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InCsumErrors)) + } + if m.InDestUnreachs != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InDestUnreachs)) + } + if m.InTimeExcds != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InTimeExcds)) + } + if m.InParmProbs != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InParmProbs)) + } + if m.InSrcQuenchs != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InSrcQuenchs)) + } + if m.InRedirects != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InRedirects)) + } + if m.InEchos != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InEchos)) + } + if m.InEchoReps != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InEchoReps)) + } + if m.InTimestamps != nil { + dAtA[i] = 0x58 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InTimestamps)) + } + if m.InTimestampReps != nil { + dAtA[i] = 0x60 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InTimestampReps)) + } + if m.InAddrMasks != nil { + dAtA[i] = 0x68 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InAddrMasks)) + } + if m.InAddrMaskReps != nil { + dAtA[i] = 0x70 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InAddrMaskReps)) + } + if m.OutMsgs != nil { + dAtA[i] = 0x78 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutMsgs)) + } + if m.OutErrors != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutErrors)) + } + if m.OutDestUnreachs != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutDestUnreachs)) + } + if m.OutTimeExcds != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutTimeExcds)) + } + if m.OutParmProbs != nil { + dAtA[i] = 0x98 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutParmProbs)) + } + if m.OutSrcQuenchs != nil { + dAtA[i] = 0xa0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutSrcQuenchs)) + } + if m.OutRedirects != nil { + dAtA[i] = 0xa8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutRedirects)) + } + if m.OutEchos != nil { + dAtA[i] = 0xb0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutEchos)) + } + if m.OutEchoReps != nil { + dAtA[i] = 0xb8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutEchoReps)) + } + if m.OutTimestamps != nil { + dAtA[i] = 0xc0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutTimestamps)) + } + if m.OutTimestampReps != nil { + dAtA[i] = 0xc8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutTimestampReps)) + } + if m.OutAddrMasks != nil { + dAtA[i] = 0xd0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutAddrMasks)) + } + if m.OutAddrMaskReps != nil { + dAtA[i] = 0xd8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutAddrMaskReps)) + } + return i, nil +} + +func (m *TcpStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TcpStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.RtoAlgorithm != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RtoAlgorithm)) + } + if m.RtoMin != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RtoMin)) + } + if m.RtoMax != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RtoMax)) + } + if m.MaxConn != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MaxConn)) + } + if m.ActiveOpens != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ActiveOpens)) + } + if m.PassiveOpens != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.PassiveOpens)) + } + if m.AttemptFails != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.AttemptFails)) + } + if m.EstabResets != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.EstabResets)) + } + if m.CurrEstab != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.CurrEstab)) + } + if m.InSegs != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InSegs)) + } + if m.OutSegs != nil { + dAtA[i] = 0x58 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutSegs)) + } + if m.RetransSegs != nil { + dAtA[i] = 0x60 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RetransSegs)) + } + if m.InErrs != nil { + dAtA[i] = 0x68 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InErrs)) + } + if m.OutRsts != nil { + dAtA[i] = 0x70 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutRsts)) + } + if m.InCsumErrors != nil { + dAtA[i] = 0x78 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InCsumErrors)) + } + return i, nil +} + +func (m *UdpStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UdpStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.InDatagrams != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InDatagrams)) + } + if m.NoPorts != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NoPorts)) + } + if m.InErrors != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InErrors)) + } + if m.OutDatagrams != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.OutDatagrams)) + } + if m.RcvbufErrors != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RcvbufErrors)) + } + if m.SndbufErrors != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.SndbufErrors)) + } + if m.InCsumErrors != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.InCsumErrors)) + } + if m.IgnoredMulti != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.IgnoredMulti)) + } + return i, nil +} + +func (m *SNMPStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SNMPStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.IPStats != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.IPStats.ProtoSize())) + n61, err := m.IPStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n61 + } + if m.ICMPStats != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ICMPStats.ProtoSize())) + n62, err := m.ICMPStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n62 + } + if m.TCPStats != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TCPStats.ProtoSize())) + n63, err := m.TCPStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n63 + } + if m.UDPStats != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.UDPStats.ProtoSize())) + n64, err := m.UDPStats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n64 + } + return i, nil +} + +func (m *DiskStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DiskStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Source != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Source.ProtoSize())) + n65, err := m.Source.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n65 + } + if m.Persistence != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Persistence.ProtoSize())) + n66, err := m.Persistence.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n66 + } + if m.LimitBytes != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.LimitBytes)) + } + if m.UsedBytes != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.UsedBytes)) + } + return i, nil +} + +func (m *ResourceStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x9 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(m.Timestamp)))) + if m.CPUsUserTimeSecs != nil { + dAtA[i] = 0x11 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.CPUsUserTimeSecs)))) + } + if m.CPUsSystemTimeSecs != nil { + dAtA[i] = 0x19 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.CPUsSystemTimeSecs)))) + } + if m.CPUsLimit != nil { + dAtA[i] = 0x21 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.CPUsLimit)))) + } + if m.MemRSSBytes != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemRSSBytes)) + } + if m.MemLimitBytes != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemLimitBytes)) + } + if m.CPUsNrPeriods != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.CPUsNrPeriods)) + } + if m.CPUsNrThrottled != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.CPUsNrThrottled)) + } + if m.CPUsThrottledTimeSecs != nil { + dAtA[i] = 0x49 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.CPUsThrottledTimeSecs)))) + } + if m.MemFileBytes != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemFileBytes)) + } + if m.MemAnonBytes != nil { + dAtA[i] = 0x58 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemAnonBytes)) + } + if m.MemMappedFileBytes != nil { + dAtA[i] = 0x60 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemMappedFileBytes)) + } + if m.Perf != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Perf.ProtoSize())) + n67, err := m.Perf.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n67 + } + if m.NetRxPackets != nil { + dAtA[i] = 0x70 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetRxPackets)) + } + if m.NetRxBytes != nil { + dAtA[i] = 0x78 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetRxBytes)) + } + if m.NetRxErrors != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetRxErrors)) + } + if m.NetRxDropped != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetRxDropped)) + } + if m.NetTxPackets != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetTxPackets)) + } + if m.NetTxBytes != nil { + dAtA[i] = 0x98 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetTxBytes)) + } + if m.NetTxErrors != nil { + dAtA[i] = 0xa0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetTxErrors)) + } + if m.NetTxDropped != nil { + dAtA[i] = 0xa8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NetTxDropped)) + } + if m.NetTCPRttMicrosecsP50 != nil { + dAtA[i] = 0xb1 + i++ + dAtA[i] = 0x1 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.NetTCPRttMicrosecsP50)))) + } + if m.NetTCPRttMicrosecsP90 != nil { + dAtA[i] = 0xb9 + i++ + dAtA[i] = 0x1 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.NetTCPRttMicrosecsP90)))) + } + if m.NetTCPRttMicrosecsP95 != nil { + dAtA[i] = 0xc1 + i++ + dAtA[i] = 0x1 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.NetTCPRttMicrosecsP95)))) + } + if m.NetTCPRttMicrosecsP99 != nil { + dAtA[i] = 0xc9 + i++ + dAtA[i] = 0x1 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.NetTCPRttMicrosecsP99)))) + } + if m.DiskLimitBytes != nil { + dAtA[i] = 0xd0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DiskLimitBytes)) + } + if m.DiskUsedBytes != nil { + dAtA[i] = 0xd8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DiskUsedBytes)) + } + if m.NetTCPActiveConnections != nil { + dAtA[i] = 0xe1 + i++ + dAtA[i] = 0x1 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.NetTCPActiveConnections)))) + } + if m.NetTCPTimeWaitConnections != nil { + dAtA[i] = 0xe9 + i++ + dAtA[i] = 0x1 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.NetTCPTimeWaitConnections)))) + } + if m.Processes != nil { + dAtA[i] = 0xf0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Processes)) + } + if m.Threads != nil { + dAtA[i] = 0xf8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Threads)) + } + if m.MemLowPressureCounter != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemLowPressureCounter)) + } + if m.MemMediumPressureCounter != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemMediumPressureCounter)) + } + if m.MemCriticalPressureCounter != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemCriticalPressureCounter)) + } + if len(m.NetTrafficControlStatistics) > 0 { + for _, msg := range m.NetTrafficControlStatistics { + dAtA[i] = 0x9a + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.MemTotalBytes != nil { + dAtA[i] = 0xa0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemTotalBytes)) + } + if m.MemTotalMemswBytes != nil { + dAtA[i] = 0xa8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemTotalMemswBytes)) + } + if m.MemSoftLimitBytes != nil { + dAtA[i] = 0xb0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemSoftLimitBytes)) + } + if m.MemCacheBytes != nil { + dAtA[i] = 0xb8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemCacheBytes)) + } + if m.MemSwapBytes != nil { + dAtA[i] = 0xc0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemSwapBytes)) + } + if m.MemUnevictableBytes != nil { + dAtA[i] = 0xc8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MemUnevictableBytes)) + } + if m.NetSNMPStatistics != nil { + dAtA[i] = 0xd2 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.NetSNMPStatistics.ProtoSize())) + n68, err := m.NetSNMPStatistics.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n68 + } + if len(m.DiskStatistics) > 0 { + for _, msg := range m.DiskStatistics { + dAtA[i] = 0xda + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.BlkioStatistics != nil { + dAtA[i] = 0xe2 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.BlkioStatistics.ProtoSize())) + n69, err := m.BlkioStatistics.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n69 + } + return i, nil +} + +func (m *ResourceUsage) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceUsage) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Executors) > 0 { + for _, msg := range m.Executors { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Total) > 0 { + for _, msg := range m.Total { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ResourceUsage_Executor) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceUsage_Executor) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ExecutorInfo.ProtoSize())) + n70, err := m.ExecutorInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n70 + if len(m.Allocated) > 0 { + for _, msg := range m.Allocated { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Statistics != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Statistics.ProtoSize())) + n71, err := m.Statistics.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n71 + } + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n72, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n72 + if len(m.Tasks) > 0 { + for _, msg := range m.Tasks { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ResourceUsage_Executor_Task) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceUsage_Executor_Task) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ID.ProtoSize())) + n73, err := m.ID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n73 + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Labels != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n74, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n74 + } + return i, nil +} + +func (m *PerfStatistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PerfStatistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x9 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(m.Timestamp)))) + dAtA[i] = 0x11 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(m.Duration)))) + if m.Cycles != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Cycles)) + } + if m.StalledCyclesFrontend != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.StalledCyclesFrontend)) + } + if m.StalledCyclesBackend != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.StalledCyclesBackend)) + } + if m.Instructions != nil { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Instructions)) + } + if m.CacheReferences != nil { + dAtA[i] = 0x38 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.CacheReferences)) + } + if m.CacheMisses != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.CacheMisses)) + } + if m.Branches != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Branches)) + } + if m.BranchMisses != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.BranchMisses)) + } + if m.BusCycles != nil { + dAtA[i] = 0x58 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.BusCycles)) + } + if m.RefCycles != nil { + dAtA[i] = 0x60 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.RefCycles)) + } + if m.CPUClock != nil { + dAtA[i] = 0x69 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.CPUClock)))) + } + if m.TaskClock != nil { + dAtA[i] = 0x71 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.TaskClock)))) + } + if m.PageFaults != nil { + dAtA[i] = 0x78 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.PageFaults)) + } + if m.MinorFaults != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MinorFaults)) + } + if m.MajorFaults != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MajorFaults)) + } + if m.ContextSwitches != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ContextSwitches)) + } + if m.CPUMigrations != nil { + dAtA[i] = 0x98 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.CPUMigrations)) + } + if m.AlignmentFaults != nil { + dAtA[i] = 0xa0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.AlignmentFaults)) + } + if m.EmulationFaults != nil { + dAtA[i] = 0xa8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.EmulationFaults)) + } + if m.L1DcacheLoads != nil { + dAtA[i] = 0xb0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1DcacheLoads)) + } + if m.L1DcacheLoadMisses != nil { + dAtA[i] = 0xb8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1DcacheLoadMisses)) + } + if m.L1DcacheStores != nil { + dAtA[i] = 0xc0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1DcacheStores)) + } + if m.L1DcacheStoreMisses != nil { + dAtA[i] = 0xc8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1DcacheStoreMisses)) + } + if m.L1DcachePrefetches != nil { + dAtA[i] = 0xd0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1DcachePrefetches)) + } + if m.L1DcachePrefetchMisses != nil { + dAtA[i] = 0xd8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1DcachePrefetchMisses)) + } + if m.L1IcacheLoads != nil { + dAtA[i] = 0xe0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1IcacheLoads)) + } + if m.L1IcacheLoadMisses != nil { + dAtA[i] = 0xe8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1IcacheLoadMisses)) + } + if m.L1IcachePrefetches != nil { + dAtA[i] = 0xf0 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1IcachePrefetches)) + } + if m.L1IcachePrefetchMisses != nil { + dAtA[i] = 0xf8 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.L1IcachePrefetchMisses)) + } + if m.LLCLoads != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.LLCLoads)) + } + if m.LLCLoadMisses != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.LLCLoadMisses)) + } + if m.LLCStores != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.LLCStores)) + } + if m.LLCStoreMisses != nil { + dAtA[i] = 0x98 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.LLCStoreMisses)) + } + if m.LLCPrefetches != nil { + dAtA[i] = 0xa0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.LLCPrefetches)) + } + if m.LLCPrefetchMisses != nil { + dAtA[i] = 0xa8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.LLCPrefetchMisses)) + } + if m.DTLBLoads != nil { + dAtA[i] = 0xb0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DTLBLoads)) + } + if m.DTLBLoadMisses != nil { + dAtA[i] = 0xb8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DTLBLoadMisses)) + } + if m.DTLBStores != nil { + dAtA[i] = 0xc0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DTLBStores)) + } + if m.DTLBStoreMisses != nil { + dAtA[i] = 0xc8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DTLBStoreMisses)) + } + if m.DTLBPrefetches != nil { + dAtA[i] = 0xd0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DTLBPrefetches)) + } + if m.DTLBPrefetchMisses != nil { + dAtA[i] = 0xd8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.DTLBPrefetchMisses)) + } + if m.ITLBLoads != nil { + dAtA[i] = 0xe0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ITLBLoads)) + } + if m.ITLBLoadMisses != nil { + dAtA[i] = 0xe8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ITLBLoadMisses)) + } + if m.BranchLoads != nil { + dAtA[i] = 0xf0 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.BranchLoads)) + } + if m.BranchLoadMisses != nil { + dAtA[i] = 0xf8 + i++ + dAtA[i] = 0x2 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.BranchLoadMisses)) + } + if m.NodeLoads != nil { + dAtA[i] = 0x80 + i++ + dAtA[i] = 0x3 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NodeLoads)) + } + if m.NodeLoadMisses != nil { + dAtA[i] = 0x88 + i++ + dAtA[i] = 0x3 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NodeLoadMisses)) + } + if m.NodeStores != nil { + dAtA[i] = 0x90 + i++ + dAtA[i] = 0x3 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NodeStores)) + } + if m.NodeStoreMisses != nil { + dAtA[i] = 0x98 + i++ + dAtA[i] = 0x3 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NodeStoreMisses)) + } + if m.NodePrefetches != nil { + dAtA[i] = 0xa0 + i++ + dAtA[i] = 0x3 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NodePrefetches)) + } + if m.NodePrefetchMisses != nil { + dAtA[i] = 0xa8 + i++ + dAtA[i] = 0x3 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.NodePrefetchMisses)) + } + return i, nil +} + +func (m *Request) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Request) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.AgentID != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AgentID.ProtoSize())) + n75, err := m.AgentID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n75 + } + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Offer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ID.ProtoSize())) + n76, err := m.ID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n76 + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.FrameworkID.ProtoSize())) + n77, err := m.FrameworkID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n77 + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AgentID.ProtoSize())) + n78, err := m.AgentID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n78 + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Hostname))) + i += copy(dAtA[i:], m.Hostname) + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.ExecutorIDs) > 0 { + for _, msg := range m.ExecutorIDs { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Attributes) > 0 { + for _, msg := range m.Attributes { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.URL != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.URL.ProtoSize())) + n79, err := m.URL.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n79 + } + if m.Unavailability != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Unavailability.ProtoSize())) + n80, err := m.Unavailability.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n80 + } + if m.AllocationInfo != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AllocationInfo.ProtoSize())) + n81, err := m.AllocationInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n81 + } + if m.Domain != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Domain.ProtoSize())) + n82, err := m.Domain.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n82 + } + return i, nil +} + +func (m *Offer_Operation) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.Launch != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Launch.ProtoSize())) + n83, err := m.Launch.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n83 + } + if m.Reserve != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Reserve.ProtoSize())) + n84, err := m.Reserve.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n84 + } + if m.Unreserve != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Unreserve.ProtoSize())) + n85, err := m.Unreserve.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n85 + } + if m.Create != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Create.ProtoSize())) + n86, err := m.Create.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n86 + } + if m.Destroy != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Destroy.ProtoSize())) + n87, err := m.Destroy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n87 + } + if m.LaunchGroup != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.LaunchGroup.ProtoSize())) + n88, err := m.LaunchGroup.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n88 + } + if m.ID != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ID.ProtoSize())) + n89, err := m.ID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n89 + } + if m.GrowVolume != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.GrowVolume.ProtoSize())) + n90, err := m.GrowVolume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n90 + } + if m.ShrinkVolume != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ShrinkVolume.ProtoSize())) + n91, err := m.ShrinkVolume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n91 + } + if m.CreateDisk != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.CreateDisk.ProtoSize())) + n92, err := m.CreateDisk.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n92 + } + if m.DestroyDisk != nil { + dAtA[i] = 0x82 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.DestroyDisk.ProtoSize())) + n93, err := m.DestroyDisk.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n93 + } + return i, nil +} + +func (m *Offer_Operation_Launch) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_Launch) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.TaskInfos) > 0 { + for _, msg := range m.TaskInfos { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Offer_Operation_LaunchGroup) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_LaunchGroup) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Executor.ProtoSize())) + n94, err := m.Executor.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n94 + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TaskGroup.ProtoSize())) + n95, err := m.TaskGroup.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n95 + return i, nil +} + +func (m *Offer_Operation_Reserve) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_Reserve) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Offer_Operation_Unreserve) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_Unreserve) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Offer_Operation_Create) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_Create) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Volumes) > 0 { + for _, msg := range m.Volumes { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Offer_Operation_Destroy) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_Destroy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Volumes) > 0 { + for _, msg := range m.Volumes { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Offer_Operation_GrowVolume) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_GrowVolume) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Volume.ProtoSize())) + n96, err := m.Volume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n96 + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Addition.ProtoSize())) + n97, err := m.Addition.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n97 + return i, nil +} + +func (m *Offer_Operation_ShrinkVolume) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_ShrinkVolume) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Volume.ProtoSize())) + n98, err := m.Volume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n98 + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Subtract.ProtoSize())) + n99, err := m.Subtract.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n99 + return i, nil +} + +func (m *Offer_Operation_CreateDisk) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_CreateDisk) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Source.ProtoSize())) + n100, err := m.Source.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n100 + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TargetType)) + return i, nil +} + +func (m *Offer_Operation_DestroyDisk) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Offer_Operation_DestroyDisk) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Source.ProtoSize())) + n101, err := m.Source.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n101 + return i, nil +} + +func (m *InverseOffer) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InverseOffer) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.OfferID.ProtoSize())) + n102, err := m.OfferID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n102 + if m.URL != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.URL.ProtoSize())) + n103, err := m.URL.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n103 + } + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.FrameworkID.ProtoSize())) + n104, err := m.FrameworkID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n104 + if m.AgentID != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AgentID.ProtoSize())) + n105, err := m.AgentID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n105 + } + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Unavailability.ProtoSize())) + n106, err := m.Unavailability.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n106 + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *TaskInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TaskID.ProtoSize())) + n107, err := m.TaskID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n107 + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AgentID.ProtoSize())) + n108, err := m.AgentID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n108 + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Executor != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Executor.ProtoSize())) + n109, err := m.Executor.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n109 + } + if m.Data != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + if m.Command != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Command.ProtoSize())) + n110, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n110 + } + if m.HealthCheck != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.HealthCheck.ProtoSize())) + n111, err := m.HealthCheck.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n111 + } + if m.Container != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Container.ProtoSize())) + n112, err := m.Container.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n112 + } + if m.Labels != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n113, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n113 + } + if m.Discovery != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Discovery.ProtoSize())) + n114, err := m.Discovery.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n114 + } + if m.KillPolicy != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.KillPolicy.ProtoSize())) + n115, err := m.KillPolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n115 + } + if m.Check != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Check.ProtoSize())) + n116, err := m.Check.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n116 + } + if m.MaxCompletionTime != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.MaxCompletionTime.ProtoSize())) + n117, err := m.MaxCompletionTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n117 + } + return i, nil +} + +func (m *TaskGroupInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TaskGroupInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Tasks) > 0 { + for _, msg := range m.Tasks { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Task) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Task) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TaskID.ProtoSize())) + n118, err := m.TaskID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n118 + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.FrameworkID.ProtoSize())) + n119, err := m.FrameworkID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n119 + if m.ExecutorID != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ExecutorID.ProtoSize())) + n120, err := m.ExecutorID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n120 + } + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AgentID.ProtoSize())) + n121, err := m.AgentID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n121 + if m.State == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("state") + } else { + dAtA[i] = 0x30 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.State)) + } + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Statuses) > 0 { + for _, msg := range m.Statuses { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.StatusUpdateState != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.StatusUpdateState)) + } + if m.StatusUpdateUUID != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.StatusUpdateUUID))) + i += copy(dAtA[i:], m.StatusUpdateUUID) + } + if m.Labels != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n122, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n122 + } + if m.Discovery != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Discovery.ProtoSize())) + n123, err := m.Discovery.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n123 + } + if m.Container != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Container.ProtoSize())) + n124, err := m.Container.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n124 + } + if m.User != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.User))) + i += copy(dAtA[i:], *m.User) + } + return i, nil +} + +func (m *TaskResourceLimitation) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TaskResourceLimitation) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *UUID) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UUID) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Value == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + return i, nil +} + +func (m *Operation) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Operation) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.FrameworkID != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.FrameworkID.ProtoSize())) + n125, err := m.FrameworkID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n125 + } + if m.AgentID != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AgentID.ProtoSize())) + n126, err := m.AgentID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n126 + } + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Info.ProtoSize())) + n127, err := m.Info.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n127 + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.LatestStatus.ProtoSize())) + n128, err := m.LatestStatus.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n128 + if len(m.Statuses) > 0 { + for _, msg := range m.Statuses { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.UUID.ProtoSize())) + n129, err := m.UUID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n129 + return i, nil +} + +func (m *OperationStatus) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OperationStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.OperationID != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.OperationID.ProtoSize())) + n130, err := m.OperationID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n130 + } + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.State)) + if m.Message != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + if len(m.ConvertedResources) > 0 { + for _, msg := range m.ConvertedResources { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.UUID != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.UUID.ProtoSize())) + n131, err := m.UUID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n131 + } + return i, nil +} + +func (m *CheckStatusInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckStatusInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Type)) + } + if m.Command != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Command.ProtoSize())) + n132, err := m.Command.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n132 + } + if m.HTTP != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.HTTP.ProtoSize())) + n133, err := m.HTTP.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n133 + } + if m.TCP != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TCP.ProtoSize())) + n134, err := m.TCP.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n134 + } + return i, nil +} + +func (m *CheckStatusInfo_Command) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckStatusInfo_Command) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ExitCode != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ExitCode)) + } + return i, nil +} + +func (m *CheckStatusInfo_Http) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckStatusInfo_Http) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.StatusCode != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.StatusCode)) + } + return i, nil +} + +func (m *CheckStatusInfo_Tcp) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CheckStatusInfo_Tcp) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Succeeded != nil { + dAtA[i] = 0x8 + i++ + if *m.Succeeded { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *TaskStatus) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TaskStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TaskID.ProtoSize())) + n135, err := m.TaskID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n135 + if m.State == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("state") + } else { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.State)) + } + if m.Data != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + if m.Message != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Message))) + i += copy(dAtA[i:], *m.Message) + } + if m.AgentID != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.AgentID.ProtoSize())) + n136, err := m.AgentID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n136 + } + if m.Timestamp != nil { + dAtA[i] = 0x31 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.Timestamp)))) + } + if m.ExecutorID != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ExecutorID.ProtoSize())) + n137, err := m.ExecutorID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n137 + } + if m.Healthy != nil { + dAtA[i] = 0x40 + i++ + if *m.Healthy { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Source != nil { + dAtA[i] = 0x48 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Source)) + } + if m.Reason != nil { + dAtA[i] = 0x50 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Reason)) + } + if m.UUID != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.UUID))) + i += copy(dAtA[i:], m.UUID) + } + if m.Labels != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n138, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n138 + } + if m.ContainerStatus != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ContainerStatus.ProtoSize())) + n139, err := m.ContainerStatus.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n139 + } + if m.UnreachableTime != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.UnreachableTime.ProtoSize())) + n140, err := m.UnreachableTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n140 + } + if m.CheckStatus != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.CheckStatus.ProtoSize())) + n141, err := m.CheckStatus.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n141 + } + if m.Limitation != nil { + dAtA[i] = 0x82 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Limitation.ProtoSize())) + n142, err := m.Limitation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n142 + } + return i, nil +} + +func (m *Filters) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Filters) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.RefuseSeconds != nil { + dAtA[i] = 0x9 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.RefuseSeconds)))) + } + return i, nil +} + +func (m *Environment) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Environment) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Variables) > 0 { + for _, msg := range m.Variables { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Environment_Variable) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Environment_Variable) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.Value != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Value))) + i += copy(dAtA[i:], *m.Value) + } + if m.Type != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Type)) + } + if m.Secret != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Secret.ProtoSize())) + n143, err := m.Secret.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n143 + } + return i, nil +} + +func (m *Parameter) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Parameter) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + return i, nil +} + +func (m *Parameters) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Parameters) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Parameter) > 0 { + for _, msg := range m.Parameter { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Credential) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Credential) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Principal))) + i += copy(dAtA[i:], m.Principal) + if m.Secret != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Secret))) + i += copy(dAtA[i:], *m.Secret) + } + return i, nil +} + +func (m *Credentials) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Credentials) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Credentials) > 0 { + for _, msg := range m.Credentials { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Secret) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Secret) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.Reference != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Reference.ProtoSize())) + n144, err := m.Reference.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n144 + } + if m.Value != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Value.ProtoSize())) + n145, err := m.Value.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n145 + } + return i, nil +} + +func (m *Secret_Reference) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Secret_Reference) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.Key != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Key))) + i += copy(dAtA[i:], *m.Key) + } + return i, nil +} + +func (m *Secret_Value) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Secret_Value) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Data == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("data") + } else { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Data))) + i += copy(dAtA[i:], m.Data) + } + return i, nil +} + +func (m *RateLimit) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RateLimit) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.QPS != nil { + dAtA[i] = 0x9 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.QPS)))) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Principal))) + i += copy(dAtA[i:], m.Principal) + if m.Capacity != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Capacity)) + } + return i, nil +} + +func (m *RateLimits) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RateLimits) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Limits) > 0 { + for _, msg := range m.Limits { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.AggregateDefaultQPS != nil { + dAtA[i] = 0x11 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.AggregateDefaultQPS)))) + } + if m.AggregateDefaultCapacity != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.AggregateDefaultCapacity)) + } + return i, nil +} + +func (m *Image) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Image) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Type)) + } + if m.Appc != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Appc.ProtoSize())) + n146, err := m.Appc.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n146 + } + if m.Docker != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Docker.ProtoSize())) + n147, err := m.Docker.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n147 + } + if m.Cached != nil { + dAtA[i] = 0x20 + i++ + if *m.Cached { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *Image_Appc) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Image_Appc) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.ID != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.ID))) + i += copy(dAtA[i:], *m.ID) + } + if m.Labels != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n148, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n148 + } + return i, nil +} + +func (m *Image_Docker) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Image_Docker) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.Credential != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Credential.ProtoSize())) + n149, err := m.Credential.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n149 + } + if m.Config != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Config.ProtoSize())) + n150, err := m.Config.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n150 + } + return i, nil +} + +func (m *MountPropagation) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MountPropagation) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Mode != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Mode)) + } + return i, nil +} + +func (m *Volume) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Volume) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.ContainerPath))) + i += copy(dAtA[i:], m.ContainerPath) + if m.HostPath != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.HostPath))) + i += copy(dAtA[i:], *m.HostPath) + } + if m.Mode == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("mode") + } else { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Mode)) + } + if m.Image != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Image.ProtoSize())) + n151, err := m.Image.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n151 + } + if m.Source != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Source.ProtoSize())) + n152, err := m.Source.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n152 + } + return i, nil +} + +func (m *Volume_Source) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Volume_Source) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.DockerVolume != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.DockerVolume.ProtoSize())) + n153, err := m.DockerVolume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n153 + } + if m.SandboxPath != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.SandboxPath.ProtoSize())) + n154, err := m.SandboxPath.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n154 + } + if m.Secret != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Secret.ProtoSize())) + n155, err := m.Secret.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n155 + } + if m.HostPath != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.HostPath.ProtoSize())) + n156, err := m.HostPath.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n156 + } + return i, nil +} + +func (m *Volume_Source_DockerVolume) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Volume_Source_DockerVolume) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Driver != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Driver))) + i += copy(dAtA[i:], *m.Driver) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.DriverOptions != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.DriverOptions.ProtoSize())) + n157, err := m.DriverOptions.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n157 + } + return i, nil +} + +func (m *Volume_Source_HostPath) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Volume_Source_HostPath) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + if m.MountPropagation != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.MountPropagation.ProtoSize())) + n158, err := m.MountPropagation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n158 + } + return i, nil +} + +func (m *Volume_Source_SandboxPath) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Volume_Source_SandboxPath) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + return i, nil +} + +func (m *NetworkInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetworkInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Groups) > 0 { + for _, s := range m.Groups { + dAtA[i] = 0x1a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.Labels != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n159, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n159 + } + if len(m.IPAddresses) > 0 { + for _, msg := range m.IPAddresses { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Name != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Name))) + i += copy(dAtA[i:], *m.Name) + } + if len(m.PortMappings) > 0 { + for _, msg := range m.PortMappings { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *NetworkInfo_IPAddress) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetworkInfo_IPAddress) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Protocol != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Protocol)) + } + if m.IPAddress != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.IPAddress))) + i += copy(dAtA[i:], *m.IPAddress) + } + return i, nil +} + +func (m *NetworkInfo_PortMapping) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NetworkInfo_PortMapping) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.HostPort)) + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ContainerPort)) + if m.Protocol != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Protocol))) + i += copy(dAtA[i:], *m.Protocol) + } + return i, nil +} + +func (m *CapabilityInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CapabilityInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Capabilities) > 0 { + for _, num := range m.Capabilities { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(num)) + } + } + return i, nil +} + +func (m *LinuxInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LinuxInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.CapabilityInfo != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.CapabilityInfo.ProtoSize())) + n160, err := m.CapabilityInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n160 + } + if m.BoundingCapabilities != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.BoundingCapabilities.ProtoSize())) + n161, err := m.BoundingCapabilities.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n161 + } + if m.EffectiveCapabilities != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.EffectiveCapabilities.ProtoSize())) + n162, err := m.EffectiveCapabilities.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n162 + } + if m.SharePIDNamespace != nil { + dAtA[i] = 0x20 + i++ + if *m.SharePIDNamespace { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *RLimitInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RLimitInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Rlimits) > 0 { + for _, msg := range m.Rlimits { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *RLimitInfo_RLimit) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RLimitInfo_RLimit) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Type)) + if m.Hard != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Hard)) + } + if m.Soft != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Soft)) + } + return i, nil +} + +func (m *TTYInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TTYInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.WindowSize != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.WindowSize.ProtoSize())) + n163, err := m.WindowSize.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n163 + } + return i, nil +} + +func (m *TTYInfo_WindowSize) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TTYInfo_WindowSize) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Rows)) + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Columns)) + return i, nil +} + +func (m *ContainerInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Type == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Type)) + } + if len(m.Volumes) > 0 { + for _, msg := range m.Volumes { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Docker != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Docker.ProtoSize())) + n164, err := m.Docker.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n164 + } + if m.Hostname != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Hostname))) + i += copy(dAtA[i:], *m.Hostname) + } + if m.Mesos != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Mesos.ProtoSize())) + n165, err := m.Mesos.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n165 + } + if len(m.NetworkInfos) > 0 { + for _, msg := range m.NetworkInfos { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.LinuxInfo != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.LinuxInfo.ProtoSize())) + n166, err := m.LinuxInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n166 + } + if m.RlimitInfo != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.RlimitInfo.ProtoSize())) + n167, err := m.RlimitInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n167 + } + if m.TTYInfo != nil { + dAtA[i] = 0x52 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.TTYInfo.ProtoSize())) + n168, err := m.TTYInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n168 + } + return i, nil +} + +func (m *ContainerInfo_DockerInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerInfo_DockerInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Image))) + i += copy(dAtA[i:], m.Image) + if m.Network != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Network)) + } + if len(m.PortMappings) > 0 { + for _, msg := range m.PortMappings { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Privileged != nil { + dAtA[i] = 0x20 + i++ + if *m.Privileged { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if len(m.Parameters) > 0 { + for _, msg := range m.Parameters { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.ForcePullImage != nil { + dAtA[i] = 0x30 + i++ + if *m.ForcePullImage { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.VolumeDriver != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.VolumeDriver))) + i += copy(dAtA[i:], *m.VolumeDriver) + } + return i, nil +} + +func (m *ContainerInfo_DockerInfo_PortMapping) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerInfo_DockerInfo_PortMapping) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.HostPort)) + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ContainerPort)) + if m.Protocol != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Protocol))) + i += copy(dAtA[i:], *m.Protocol) + } + return i, nil +} + +func (m *ContainerInfo_MesosInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerInfo_MesosInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Image != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Image.ProtoSize())) + n169, err := m.Image.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n169 + } + return i, nil +} + +func (m *ContainerStatus) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.NetworkInfos) > 0 { + for _, msg := range m.NetworkInfos { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.CgroupInfo != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.CgroupInfo.ProtoSize())) + n170, err := m.CgroupInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n170 + } + if m.ExecutorPID != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ExecutorPID)) + } + if m.ContainerID != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.ContainerID.ProtoSize())) + n171, err := m.ContainerID.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n171 + } + return i, nil +} + +func (m *CgroupInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.NetCLS != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.NetCLS.ProtoSize())) + n172, err := m.NetCLS.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n172 + } + return i, nil +} + +func (m *CgroupInfo_Blkio) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_Blkio) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *CgroupInfo_Blkio_Value) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_Blkio_Value) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Op != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Op)) + } + if m.Value != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Value)) + } + return i, nil +} + +func (m *CgroupInfo_Blkio_CFQ) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_Blkio_CFQ) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Device != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Device.ProtoSize())) + n173, err := m.Device.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n173 + } + if m.Sectors != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Sectors)) + } + if m.Time != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Time)) + } + if len(m.IOServiced) > 0 { + for _, msg := range m.IOServiced { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.IOServiceBytes) > 0 { + for _, msg := range m.IOServiceBytes { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.IOServiceTime) > 0 { + for _, msg := range m.IOServiceTime { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.IOWaitTime) > 0 { + for _, msg := range m.IOWaitTime { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.IOMerged) > 0 { + for _, msg := range m.IOMerged { + dAtA[i] = 0x42 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.IOQueued) > 0 { + for _, msg := range m.IOQueued { + dAtA[i] = 0x4a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *CgroupInfo_Blkio_Throttling) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_Blkio_Throttling) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *CgroupInfo_Blkio_Throttling_Statistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_Blkio_Throttling_Statistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Device != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Device.ProtoSize())) + n174, err := m.Device.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n174 + } + if len(m.IOServiced) > 0 { + for _, msg := range m.IOServiced { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.IOServiceBytes) > 0 { + for _, msg := range m.IOServiceBytes { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *CgroupInfo_Blkio_Statistics) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_Blkio_Statistics) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.CFQ) > 0 { + for _, msg := range m.CFQ { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.CFQRecursive) > 0 { + for _, msg := range m.CFQRecursive { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Throttling) > 0 { + for _, msg := range m.Throttling { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *CgroupInfo_NetCls) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CgroupInfo_NetCls) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ClassID != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.ClassID)) + } + return i, nil +} + +func (m *Labels) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Labels) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Labels) > 0 { + for _, msg := range m.Labels { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Label) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Label) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + if m.Value != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Value))) + i += copy(dAtA[i:], *m.Value) + } + return i, nil +} + +func (m *Port) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Port) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Number)) + if m.Name != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Name))) + i += copy(dAtA[i:], *m.Name) + } + if m.Protocol != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Protocol))) + i += copy(dAtA[i:], *m.Protocol) + } + if m.Visibility != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Visibility)) + } + if m.Labels != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n175, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n175 + } + return i, nil +} + +func (m *Ports) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Ports) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Ports) > 0 { + for _, msg := range m.Ports { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *DiscoveryInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DiscoveryInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Visibility)) + if m.Name != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Name))) + i += copy(dAtA[i:], *m.Name) + } + if m.Environment != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Environment))) + i += copy(dAtA[i:], *m.Environment) + } + if m.Location != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Location))) + i += copy(dAtA[i:], *m.Location) + } + if m.Version != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Version))) + i += copy(dAtA[i:], *m.Version) + } + if m.Ports != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Ports.ProtoSize())) + n176, err := m.Ports.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n176 + } + if m.Labels != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Labels.ProtoSize())) + n177, err := m.Labels.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n177 + } + return i, nil +} + +func (m *WeightInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WeightInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0x9 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(m.Weight)))) + if m.Role != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Role))) + i += copy(dAtA[i:], *m.Role) + } + return i, nil +} + +func (m *VersionInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VersionInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Version))) + i += copy(dAtA[i:], m.Version) + if m.BuildDate != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.BuildDate))) + i += copy(dAtA[i:], *m.BuildDate) + } + if m.BuildTime != nil { + dAtA[i] = 0x19 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.BuildTime)))) + } + if m.BuildUser != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.BuildUser))) + i += copy(dAtA[i:], *m.BuildUser) + } + if m.GitSHA != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.GitSHA))) + i += copy(dAtA[i:], *m.GitSHA) + } + if m.GitBranch != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.GitBranch))) + i += copy(dAtA[i:], *m.GitBranch) + } + if m.GitTag != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.GitTag))) + i += copy(dAtA[i:], *m.GitTag) + } + return i, nil +} + +func (m *Flag) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Flag) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.Value != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Value))) + i += copy(dAtA[i:], *m.Value) + } + return i, nil +} + +func (m *Role) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Role) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x11 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(m.Weight)))) + if len(m.Frameworks) > 0 { + for _, msg := range m.Frameworks { + dAtA[i] = 0x1a + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Resources) > 0 { + for _, msg := range m.Resources { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *Metric) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Metric) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.Value != nil { + dAtA[i] = 0x11 + i++ + i = encodeFixed64Mesos(dAtA, i, uint64(math.Float64bits(float64(*m.Value)))) + } + return i, nil +} + +func (m *FileInfo) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *FileInfo) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + if m.Nlink != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Nlink)) + } + if m.Size != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Size)) + } + if m.Mtime != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Mtime.ProtoSize())) + n178, err := m.Mtime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n178 + } + if m.Mode != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.Mode)) + } + if m.UID != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.UID))) + i += copy(dAtA[i:], *m.UID) + } + if m.GID != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.GID))) + i += copy(dAtA[i:], *m.GID) + } + return i, nil +} + +func (m *Device) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Device) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Path != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(len(*m.Path))) + i += copy(dAtA[i:], *m.Path) + } + if m.Number != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Number.ProtoSize())) + n179, err := m.Number.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n179 + } + return i, nil +} + +func (m *Device_Number) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Device_Number) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.MajorNumber == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("major_number") + } else { + dAtA[i] = 0x8 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MajorNumber)) + } + if m.MinorNumber == nil { + return 0, github_com_gogo_protobuf_proto.NewRequiredNotSetError("minor_number") + } else { + dAtA[i] = 0x10 + i++ + i = encodeVarintMesos(dAtA, i, uint64(*m.MinorNumber)) + } + return i, nil +} + +func (m *DeviceAccess) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAccess) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Device.ProtoSize())) + n180, err := m.Device.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n180 + dAtA[i] = 0x12 + i++ + i = encodeVarintMesos(dAtA, i, uint64(m.Access.ProtoSize())) + n181, err := m.Access.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n181 + return i, nil +} + +func (m *DeviceAccess_Access) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceAccess_Access) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Read != nil { + dAtA[i] = 0x8 + i++ + if *m.Read { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Write != nil { + dAtA[i] = 0x10 + i++ + if *m.Write { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.Mknod != nil { + dAtA[i] = 0x18 + i++ + if *m.Mknod { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *DeviceWhitelist) Marshal() (dAtA []byte, err error) { + size := m.ProtoSize() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceWhitelist) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.AllowedDevices) > 0 { + for _, msg := range m.AllowedDevices { + dAtA[i] = 0xa + i++ + i = encodeVarintMesos(dAtA, i, uint64(msg.ProtoSize())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func encodeFixed64Mesos(dAtA []byte, offset int, v uint64) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + dAtA[offset+4] = uint8(v >> 32) + dAtA[offset+5] = uint8(v >> 40) + dAtA[offset+6] = uint8(v >> 48) + dAtA[offset+7] = uint8(v >> 56) + return offset + 8 +} +func encodeFixed32Mesos(dAtA []byte, offset int, v uint32) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + return offset + 4 +} +func encodeVarintMesos(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func NewPopulatedFrameworkID(r randyMesos, easy bool) *FrameworkID { + this := &FrameworkID{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOfferID(r randyMesos, easy bool) *OfferID { + this := &OfferID{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedAgentID(r randyMesos, easy bool) *AgentID { + this := &AgentID{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTaskID(r randyMesos, easy bool) *TaskID { + this := &TaskID{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedExecutorID(r randyMesos, easy bool) *ExecutorID { + this := &ExecutorID{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedContainerID(r randyMesos, easy bool) *ContainerID { + this := &ContainerID{} + this.Value = string(randStringMesos(r)) + if r.Intn(10) == 0 { + this.Parent = NewPopulatedContainerID(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResourceProviderID(r randyMesos, easy bool) *ResourceProviderID { + this := &ResourceProviderID{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOperationID(r randyMesos, easy bool) *OperationID { + this := &OperationID{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTimeInfo(r randyMesos, easy bool) *TimeInfo { + this := &TimeInfo{} + this.Nanoseconds = int64(r.Int63()) + if r.Intn(2) == 0 { + this.Nanoseconds *= -1 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDurationInfo(r randyMesos, easy bool) *DurationInfo { + this := &DurationInfo{} + this.Nanoseconds = int64(r.Int63()) + if r.Intn(2) == 0 { + this.Nanoseconds *= -1 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedAddress(r randyMesos, easy bool) *Address { + this := &Address{} + if r.Intn(10) != 0 { + v1 := string(randStringMesos(r)) + this.Hostname = &v1 + } + if r.Intn(10) != 0 { + v2 := string(randStringMesos(r)) + this.IP = &v2 + } + this.Port = int32(r.Int31()) + if r.Intn(2) == 0 { + this.Port *= -1 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedURL(r randyMesos, easy bool) *URL { + this := &URL{} + this.Scheme = string(randStringMesos(r)) + v3 := NewPopulatedAddress(r, easy) + this.Address = *v3 + if r.Intn(10) != 0 { + v4 := string(randStringMesos(r)) + this.Path = &v4 + } + if r.Intn(10) != 0 { + v5 := r.Intn(5) + this.Query = make([]Parameter, v5) + for i := 0; i < v5; i++ { + v6 := NewPopulatedParameter(r, easy) + this.Query[i] = *v6 + } + } + if r.Intn(10) != 0 { + v7 := string(randStringMesos(r)) + this.Fragment = &v7 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedUnavailability(r randyMesos, easy bool) *Unavailability { + this := &Unavailability{} + v8 := NewPopulatedTimeInfo(r, easy) + this.Start = *v8 + if r.Intn(10) != 0 { + this.Duration = NewPopulatedDurationInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedMachineID(r randyMesos, easy bool) *MachineID { + this := &MachineID{} + if r.Intn(10) != 0 { + v9 := string(randStringMesos(r)) + this.Hostname = &v9 + } + if r.Intn(10) != 0 { + v10 := string(randStringMesos(r)) + this.IP = &v10 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedMachineInfo(r randyMesos, easy bool) *MachineInfo { + this := &MachineInfo{} + v11 := NewPopulatedMachineID(r, easy) + this.ID = *v11 + if r.Intn(10) != 0 { + v12 := MachineInfo_Mode([]int32{1, 2, 3}[r.Intn(3)]) + this.Mode = &v12 + } + if r.Intn(10) != 0 { + this.Unavailability = NewPopulatedUnavailability(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedFrameworkInfo(r randyMesos, easy bool) *FrameworkInfo { + this := &FrameworkInfo{} + this.User = string(randStringMesos(r)) + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + this.ID = NewPopulatedFrameworkID(r, easy) + } + if r.Intn(10) != 0 { + v13 := float64(r.Float64()) + if r.Intn(2) == 0 { + v13 *= -1 + } + this.FailoverTimeout = &v13 + } + if r.Intn(10) != 0 { + v14 := bool(bool(r.Intn(2) == 0)) + this.Checkpoint = &v14 + } + if r.Intn(10) != 0 { + v15 := string(randStringMesos(r)) + this.Role = &v15 + } + if r.Intn(10) != 0 { + v16 := string(randStringMesos(r)) + this.Hostname = &v16 + } + if r.Intn(10) != 0 { + v17 := string(randStringMesos(r)) + this.Principal = &v17 + } + if r.Intn(10) != 0 { + v18 := string(randStringMesos(r)) + this.WebUiURL = &v18 + } + if r.Intn(10) != 0 { + v19 := r.Intn(5) + this.Capabilities = make([]FrameworkInfo_Capability, v19) + for i := 0; i < v19; i++ { + v20 := NewPopulatedFrameworkInfo_Capability(r, easy) + this.Capabilities[i] = *v20 + } + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if r.Intn(10) != 0 { + v21 := r.Intn(10) + this.Roles = make([]string, v21) + for i := 0; i < v21; i++ { + this.Roles[i] = string(randStringMesos(r)) + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedFrameworkInfo_Capability(r randyMesos, easy bool) *FrameworkInfo_Capability { + this := &FrameworkInfo_Capability{} + this.Type = FrameworkInfo_Capability_Type([]int32{0, 1, 2, 3, 4, 5, 6, 7, 8}[r.Intn(9)]) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckInfo(r randyMesos, easy bool) *CheckInfo { + this := &CheckInfo{} + this.Type = CheckInfo_Type([]int32{0, 1, 2, 3}[r.Intn(4)]) + if r.Intn(10) != 0 { + this.Command = NewPopulatedCheckInfo_Command(r, easy) + } + if r.Intn(10) != 0 { + this.HTTP = NewPopulatedCheckInfo_Http(r, easy) + } + if r.Intn(10) != 0 { + v22 := float64(r.Float64()) + if r.Intn(2) == 0 { + v22 *= -1 + } + this.DelaySeconds = &v22 + } + if r.Intn(10) != 0 { + v23 := float64(r.Float64()) + if r.Intn(2) == 0 { + v23 *= -1 + } + this.IntervalSeconds = &v23 + } + if r.Intn(10) != 0 { + v24 := float64(r.Float64()) + if r.Intn(2) == 0 { + v24 *= -1 + } + this.TimeoutSeconds = &v24 + } + if r.Intn(10) != 0 { + this.TCP = NewPopulatedCheckInfo_Tcp(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckInfo_Command(r randyMesos, easy bool) *CheckInfo_Command { + this := &CheckInfo_Command{} + v25 := NewPopulatedCommandInfo(r, easy) + this.Command = *v25 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckInfo_Http(r randyMesos, easy bool) *CheckInfo_Http { + this := &CheckInfo_Http{} + this.Port = uint32(r.Uint32()) + if r.Intn(10) != 0 { + v26 := string(randStringMesos(r)) + this.Path = &v26 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckInfo_Tcp(r randyMesos, easy bool) *CheckInfo_Tcp { + this := &CheckInfo_Tcp{} + this.Port = uint32(r.Uint32()) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedHealthCheck(r randyMesos, easy bool) *HealthCheck { + this := &HealthCheck{} + if r.Intn(10) != 0 { + this.HTTP = NewPopulatedHealthCheck_HTTPCheckInfo(r, easy) + } + if r.Intn(10) != 0 { + v27 := float64(r.Float64()) + if r.Intn(2) == 0 { + v27 *= -1 + } + this.DelaySeconds = &v27 + } + if r.Intn(10) != 0 { + v28 := float64(r.Float64()) + if r.Intn(2) == 0 { + v28 *= -1 + } + this.IntervalSeconds = &v28 + } + if r.Intn(10) != 0 { + v29 := float64(r.Float64()) + if r.Intn(2) == 0 { + v29 *= -1 + } + this.TimeoutSeconds = &v29 + } + if r.Intn(10) != 0 { + v30 := uint32(r.Uint32()) + this.ConsecutiveFailures = &v30 + } + if r.Intn(10) != 0 { + v31 := float64(r.Float64()) + if r.Intn(2) == 0 { + v31 *= -1 + } + this.GracePeriodSeconds = &v31 + } + if r.Intn(10) != 0 { + this.Command = NewPopulatedCommandInfo(r, easy) + } + this.Type = HealthCheck_Type([]int32{0, 1, 2, 3}[r.Intn(4)]) + if r.Intn(10) != 0 { + this.TCP = NewPopulatedHealthCheck_TCPCheckInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedHealthCheck_HTTPCheckInfo(r randyMesos, easy bool) *HealthCheck_HTTPCheckInfo { + this := &HealthCheck_HTTPCheckInfo{} + this.Port = uint32(r.Uint32()) + if r.Intn(10) != 0 { + v32 := string(randStringMesos(r)) + this.Path = &v32 + } + if r.Intn(10) != 0 { + v33 := string(randStringMesos(r)) + this.Scheme = &v33 + } + if r.Intn(10) != 0 { + v34 := r.Intn(10) + this.Statuses = make([]uint32, v34) + for i := 0; i < v34; i++ { + this.Statuses[i] = uint32(r.Uint32()) + } + } + if r.Intn(10) != 0 { + v35 := NetworkInfo_Protocol([]int32{1, 2}[r.Intn(2)]) + this.Protocol = &v35 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedHealthCheck_TCPCheckInfo(r randyMesos, easy bool) *HealthCheck_TCPCheckInfo { + this := &HealthCheck_TCPCheckInfo{} + this.Port = uint32(r.Uint32()) + if r.Intn(10) != 0 { + v36 := NetworkInfo_Protocol([]int32{1, 2}[r.Intn(2)]) + this.Protocol = &v36 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedKillPolicy(r randyMesos, easy bool) *KillPolicy { + this := &KillPolicy{} + if r.Intn(10) != 0 { + this.GracePeriod = NewPopulatedDurationInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCommandInfo(r randyMesos, easy bool) *CommandInfo { + this := &CommandInfo{} + if r.Intn(10) != 0 { + v37 := r.Intn(5) + this.URIs = make([]CommandInfo_URI, v37) + for i := 0; i < v37; i++ { + v38 := NewPopulatedCommandInfo_URI(r, easy) + this.URIs[i] = *v38 + } + } + if r.Intn(10) != 0 { + this.Environment = NewPopulatedEnvironment(r, easy) + } + if r.Intn(10) != 0 { + v39 := string(randStringMesos(r)) + this.Value = &v39 + } + if r.Intn(10) != 0 { + v40 := string(randStringMesos(r)) + this.User = &v40 + } + if r.Intn(10) != 0 { + v41 := bool(bool(r.Intn(2) == 0)) + this.Shell = &v41 + } + if r.Intn(10) != 0 { + v42 := r.Intn(10) + this.Arguments = make([]string, v42) + for i := 0; i < v42; i++ { + this.Arguments[i] = string(randStringMesos(r)) + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCommandInfo_URI(r randyMesos, easy bool) *CommandInfo_URI { + this := &CommandInfo_URI{} + this.Value = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v43 := bool(bool(r.Intn(2) == 0)) + this.Executable = &v43 + } + if r.Intn(10) != 0 { + v44 := bool(bool(r.Intn(2) == 0)) + this.Extract = &v44 + } + if r.Intn(10) != 0 { + v45 := bool(bool(r.Intn(2) == 0)) + this.Cache = &v45 + } + if r.Intn(10) != 0 { + v46 := string(randStringMesos(r)) + this.OutputFile = &v46 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedExecutorInfo(r randyMesos, easy bool) *ExecutorInfo { + this := &ExecutorInfo{} + v47 := NewPopulatedExecutorID(r, easy) + this.ExecutorID = *v47 + if r.Intn(10) != 0 { + v48 := r.Intn(100) + this.Data = make([]byte, v48) + for i := 0; i < v48; i++ { + this.Data[i] = byte(r.Intn(256)) + } + } + if r.Intn(10) != 0 { + v49 := r.Intn(5) + this.Resources = make([]Resource, v49) + for i := 0; i < v49; i++ { + v50 := NewPopulatedResource(r, easy) + this.Resources[i] = *v50 + } + } + if r.Intn(10) != 0 { + this.Command = NewPopulatedCommandInfo(r, easy) + } + if r.Intn(10) != 0 { + this.FrameworkID = NewPopulatedFrameworkID(r, easy) + } + if r.Intn(10) != 0 { + v51 := string(randStringMesos(r)) + this.Name = &v51 + } + if r.Intn(10) != 0 { + v52 := string(randStringMesos(r)) + this.Source = &v52 + } + if r.Intn(10) != 0 { + this.Container = NewPopulatedContainerInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Discovery = NewPopulatedDiscoveryInfo(r, easy) + } + if r.Intn(10) != 0 { + this.ShutdownGracePeriod = NewPopulatedDurationInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + this.Type = ExecutorInfo_Type([]int32{0, 1, 2}[r.Intn(3)]) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDomainInfo(r randyMesos, easy bool) *DomainInfo { + this := &DomainInfo{} + if r.Intn(10) != 0 { + this.FaultDomain = NewPopulatedDomainInfo_FaultDomain(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDomainInfo_FaultDomain(r randyMesos, easy bool) *DomainInfo_FaultDomain { + this := &DomainInfo_FaultDomain{} + v53 := NewPopulatedDomainInfo_FaultDomain_RegionInfo(r, easy) + this.Region = *v53 + v54 := NewPopulatedDomainInfo_FaultDomain_ZoneInfo(r, easy) + this.Zone = *v54 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDomainInfo_FaultDomain_RegionInfo(r randyMesos, easy bool) *DomainInfo_FaultDomain_RegionInfo { + this := &DomainInfo_FaultDomain_RegionInfo{} + this.Name = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDomainInfo_FaultDomain_ZoneInfo(r randyMesos, easy bool) *DomainInfo_FaultDomain_ZoneInfo { + this := &DomainInfo_FaultDomain_ZoneInfo{} + this.Name = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedMasterInfo(r randyMesos, easy bool) *MasterInfo { + this := &MasterInfo{} + this.ID = string(randStringMesos(r)) + this.IP = uint32(r.Uint32()) + v55 := uint32(r.Uint32()) + this.Port = &v55 + if r.Intn(10) != 0 { + v56 := string(randStringMesos(r)) + this.PID = &v56 + } + if r.Intn(10) != 0 { + v57 := string(randStringMesos(r)) + this.Hostname = &v57 + } + if r.Intn(10) != 0 { + v58 := string(randStringMesos(r)) + this.Version = &v58 + } + if r.Intn(10) != 0 { + this.Address = NewPopulatedAddress(r, easy) + } + if r.Intn(10) != 0 { + this.Domain = NewPopulatedDomainInfo(r, easy) + } + if r.Intn(10) != 0 { + v59 := r.Intn(5) + this.Capabilities = make([]MasterInfo_Capability, v59) + for i := 0; i < v59; i++ { + v60 := NewPopulatedMasterInfo_Capability(r, easy) + this.Capabilities[i] = *v60 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedMasterInfo_Capability(r randyMesos, easy bool) *MasterInfo_Capability { + this := &MasterInfo_Capability{} + this.Type = MasterInfo_Capability_Type([]int32{0, 1}[r.Intn(2)]) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedAgentInfo(r randyMesos, easy bool) *AgentInfo { + this := &AgentInfo{} + this.Hostname = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v61 := r.Intn(5) + this.Resources = make([]Resource, v61) + for i := 0; i < v61; i++ { + v62 := NewPopulatedResource(r, easy) + this.Resources[i] = *v62 + } + } + if r.Intn(10) != 0 { + v63 := r.Intn(5) + this.Attributes = make([]Attribute, v63) + for i := 0; i < v63; i++ { + v64 := NewPopulatedAttribute(r, easy) + this.Attributes[i] = *v64 + } + } + if r.Intn(10) != 0 { + this.ID = NewPopulatedAgentID(r, easy) + } + if r.Intn(10) != 0 { + v65 := int32(r.Int31()) + if r.Intn(2) == 0 { + v65 *= -1 + } + this.Port = &v65 + } + if r.Intn(10) != 0 { + this.Domain = NewPopulatedDomainInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedAgentInfo_Capability(r randyMesos, easy bool) *AgentInfo_Capability { + this := &AgentInfo_Capability{} + this.Type = AgentInfo_Capability_Type([]int32{0, 1, 2, 3, 4, 5}[r.Intn(6)]) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCSIPluginContainerInfo(r randyMesos, easy bool) *CSIPluginContainerInfo { + this := &CSIPluginContainerInfo{} + if r.Intn(10) != 0 { + v66 := r.Intn(10) + this.Services = make([]CSIPluginContainerInfo_Service, v66) + for i := 0; i < v66; i++ { + this.Services[i] = CSIPluginContainerInfo_Service([]int32{0, 1, 2}[r.Intn(3)]) + } + } + if r.Intn(10) != 0 { + this.Command = NewPopulatedCommandInfo(r, easy) + } + if r.Intn(10) != 0 { + v67 := r.Intn(5) + this.Resources = make([]Resource, v67) + for i := 0; i < v67; i++ { + v68 := NewPopulatedResource(r, easy) + this.Resources[i] = *v68 + } + } + if r.Intn(10) != 0 { + this.Container = NewPopulatedContainerInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCSIPluginInfo(r randyMesos, easy bool) *CSIPluginInfo { + this := &CSIPluginInfo{} + this.Type = string(randStringMesos(r)) + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v69 := r.Intn(5) + this.Containers = make([]CSIPluginContainerInfo, v69) + for i := 0; i < v69; i++ { + v70 := NewPopulatedCSIPluginContainerInfo(r, easy) + this.Containers[i] = *v70 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResourceProviderInfo(r randyMesos, easy bool) *ResourceProviderInfo { + this := &ResourceProviderInfo{} + if r.Intn(10) != 0 { + this.ID = NewPopulatedResourceProviderID(r, easy) + } + if r.Intn(10) != 0 { + v71 := r.Intn(5) + this.Attributes = make([]Attribute, v71) + for i := 0; i < v71; i++ { + v72 := NewPopulatedAttribute(r, easy) + this.Attributes[i] = *v72 + } + } + this.Type = string(randStringMesos(r)) + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v73 := r.Intn(5) + this.DefaultReservations = make([]Resource_ReservationInfo, v73) + for i := 0; i < v73; i++ { + v74 := NewPopulatedResource_ReservationInfo(r, easy) + this.DefaultReservations[i] = *v74 + } + } + if r.Intn(10) != 0 { + this.Storage = NewPopulatedResourceProviderInfo_Storage(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResourceProviderInfo_Storage(r randyMesos, easy bool) *ResourceProviderInfo_Storage { + this := &ResourceProviderInfo_Storage{} + v75 := NewPopulatedCSIPluginInfo(r, easy) + this.Plugin = *v75 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedValue(r randyMesos, easy bool) *Value { + this := &Value{} + this.Type = Value_Type([]int32{0, 1, 2, 3}[r.Intn(4)]) + if r.Intn(10) != 0 { + this.Scalar = NewPopulatedValue_Scalar(r, easy) + } + if r.Intn(10) != 0 { + this.Ranges = NewPopulatedValue_Ranges(r, easy) + } + if r.Intn(10) != 0 { + this.Set = NewPopulatedValue_Set(r, easy) + } + if r.Intn(10) != 0 { + this.Text = NewPopulatedValue_Text(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedValue_Scalar(r randyMesos, easy bool) *Value_Scalar { + this := &Value_Scalar{} + this.Value = float64(r.Float64()) + if r.Intn(2) == 0 { + this.Value *= -1 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedValue_Range(r randyMesos, easy bool) *Value_Range { + this := &Value_Range{} + this.Begin = uint64(uint64(r.Uint32())) + this.End = uint64(uint64(r.Uint32())) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedValue_Ranges(r randyMesos, easy bool) *Value_Ranges { + this := &Value_Ranges{} + if r.Intn(10) != 0 { + v76 := r.Intn(5) + this.Range = make([]Value_Range, v76) + for i := 0; i < v76; i++ { + v77 := NewPopulatedValue_Range(r, easy) + this.Range[i] = *v77 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedValue_Set(r randyMesos, easy bool) *Value_Set { + this := &Value_Set{} + if r.Intn(10) != 0 { + v78 := r.Intn(10) + this.Item = make([]string, v78) + for i := 0; i < v78; i++ { + this.Item[i] = string(randStringMesos(r)) + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedValue_Text(r randyMesos, easy bool) *Value_Text { + this := &Value_Text{} + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedAttribute(r randyMesos, easy bool) *Attribute { + this := &Attribute{} + this.Name = string(randStringMesos(r)) + this.Type = Value_Type([]int32{0, 1, 2, 3}[r.Intn(4)]) + if r.Intn(10) != 0 { + this.Scalar = NewPopulatedValue_Scalar(r, easy) + } + if r.Intn(10) != 0 { + this.Ranges = NewPopulatedValue_Ranges(r, easy) + } + if r.Intn(10) != 0 { + this.Text = NewPopulatedValue_Text(r, easy) + } + if r.Intn(10) != 0 { + this.Set = NewPopulatedValue_Set(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource(r randyMesos, easy bool) *Resource { + this := &Resource{} + this.Name = string(randStringMesos(r)) + v79 := Value_Type([]int32{0, 1, 2, 3}[r.Intn(4)]) + this.Type = &v79 + if r.Intn(10) != 0 { + this.Scalar = NewPopulatedValue_Scalar(r, easy) + } + if r.Intn(10) != 0 { + this.Ranges = NewPopulatedValue_Ranges(r, easy) + } + if r.Intn(10) != 0 { + this.Set = NewPopulatedValue_Set(r, easy) + } + if r.Intn(10) != 0 { + v80 := string(randStringMesos(r)) + this.Role = &v80 + } + if r.Intn(10) != 0 { + this.Disk = NewPopulatedResource_DiskInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Reservation = NewPopulatedResource_ReservationInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Revocable = NewPopulatedResource_RevocableInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Shared = NewPopulatedResource_SharedInfo(r, easy) + } + if r.Intn(10) != 0 { + this.AllocationInfo = NewPopulatedResource_AllocationInfo(r, easy) + } + if r.Intn(10) != 0 { + this.ProviderID = NewPopulatedResourceProviderID(r, easy) + } + if r.Intn(10) != 0 { + v81 := r.Intn(5) + this.Reservations = make([]Resource_ReservationInfo, v81) + for i := 0; i < v81; i++ { + v82 := NewPopulatedResource_ReservationInfo(r, easy) + this.Reservations[i] = *v82 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_AllocationInfo(r randyMesos, easy bool) *Resource_AllocationInfo { + this := &Resource_AllocationInfo{} + if r.Intn(10) != 0 { + v83 := string(randStringMesos(r)) + this.Role = &v83 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_ReservationInfo(r randyMesos, easy bool) *Resource_ReservationInfo { + this := &Resource_ReservationInfo{} + if r.Intn(10) != 0 { + v84 := string(randStringMesos(r)) + this.Principal = &v84 + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if r.Intn(10) != 0 { + v85 := string(randStringMesos(r)) + this.Role = &v85 + } + if r.Intn(10) != 0 { + v86 := Resource_ReservationInfo_Type([]int32{0, 1, 2}[r.Intn(3)]) + this.Type = &v86 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_DiskInfo(r randyMesos, easy bool) *Resource_DiskInfo { + this := &Resource_DiskInfo{} + if r.Intn(10) != 0 { + this.Persistence = NewPopulatedResource_DiskInfo_Persistence(r, easy) + } + if r.Intn(10) != 0 { + this.Volume = NewPopulatedVolume(r, easy) + } + if r.Intn(10) != 0 { + this.Source = NewPopulatedResource_DiskInfo_Source(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_DiskInfo_Persistence(r randyMesos, easy bool) *Resource_DiskInfo_Persistence { + this := &Resource_DiskInfo_Persistence{} + this.ID = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v87 := string(randStringMesos(r)) + this.Principal = &v87 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_DiskInfo_Source(r randyMesos, easy bool) *Resource_DiskInfo_Source { + this := &Resource_DiskInfo_Source{} + this.Type = Resource_DiskInfo_Source_Type([]int32{0, 1, 2, 3, 4}[r.Intn(5)]) + if r.Intn(10) != 0 { + this.Path = NewPopulatedResource_DiskInfo_Source_Path(r, easy) + } + if r.Intn(10) != 0 { + this.Mount = NewPopulatedResource_DiskInfo_Source_Mount(r, easy) + } + if r.Intn(10) != 0 { + v88 := string(randStringMesos(r)) + this.ID = &v88 + } + if r.Intn(10) != 0 { + this.Metadata = NewPopulatedLabels(r, easy) + } + if r.Intn(10) != 0 { + v89 := string(randStringMesos(r)) + this.Profile = &v89 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_DiskInfo_Source_Path(r randyMesos, easy bool) *Resource_DiskInfo_Source_Path { + this := &Resource_DiskInfo_Source_Path{} + if r.Intn(10) != 0 { + v90 := string(randStringMesos(r)) + this.Root = &v90 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_DiskInfo_Source_Mount(r randyMesos, easy bool) *Resource_DiskInfo_Source_Mount { + this := &Resource_DiskInfo_Source_Mount{} + if r.Intn(10) != 0 { + v91 := string(randStringMesos(r)) + this.Root = &v91 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_RevocableInfo(r randyMesos, easy bool) *Resource_RevocableInfo { + this := &Resource_RevocableInfo{} + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResource_SharedInfo(r randyMesos, easy bool) *Resource_SharedInfo { + this := &Resource_SharedInfo{} + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTrafficControlStatistics(r randyMesos, easy bool) *TrafficControlStatistics { + this := &TrafficControlStatistics{} + this.ID = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v92 := uint64(uint64(r.Uint32())) + this.Backlog = &v92 + } + if r.Intn(10) != 0 { + v93 := uint64(uint64(r.Uint32())) + this.Bytes = &v93 + } + if r.Intn(10) != 0 { + v94 := uint64(uint64(r.Uint32())) + this.Drops = &v94 + } + if r.Intn(10) != 0 { + v95 := uint64(uint64(r.Uint32())) + this.Overlimits = &v95 + } + if r.Intn(10) != 0 { + v96 := uint64(uint64(r.Uint32())) + this.Packets = &v96 + } + if r.Intn(10) != 0 { + v97 := uint64(uint64(r.Uint32())) + this.Qlen = &v97 + } + if r.Intn(10) != 0 { + v98 := uint64(uint64(r.Uint32())) + this.RateBPS = &v98 + } + if r.Intn(10) != 0 { + v99 := uint64(uint64(r.Uint32())) + this.RatePPS = &v99 + } + if r.Intn(10) != 0 { + v100 := uint64(uint64(r.Uint32())) + this.Requeues = &v100 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedIpStatistics(r randyMesos, easy bool) *IpStatistics { + this := &IpStatistics{} + if r.Intn(10) != 0 { + v101 := int64(r.Int63()) + if r.Intn(2) == 0 { + v101 *= -1 + } + this.Forwarding = &v101 + } + if r.Intn(10) != 0 { + v102 := int64(r.Int63()) + if r.Intn(2) == 0 { + v102 *= -1 + } + this.DefaultTTL = &v102 + } + if r.Intn(10) != 0 { + v103 := int64(r.Int63()) + if r.Intn(2) == 0 { + v103 *= -1 + } + this.InReceives = &v103 + } + if r.Intn(10) != 0 { + v104 := int64(r.Int63()) + if r.Intn(2) == 0 { + v104 *= -1 + } + this.InHdrErrors = &v104 + } + if r.Intn(10) != 0 { + v105 := int64(r.Int63()) + if r.Intn(2) == 0 { + v105 *= -1 + } + this.InAddrErrors = &v105 + } + if r.Intn(10) != 0 { + v106 := int64(r.Int63()) + if r.Intn(2) == 0 { + v106 *= -1 + } + this.ForwDatagrams = &v106 + } + if r.Intn(10) != 0 { + v107 := int64(r.Int63()) + if r.Intn(2) == 0 { + v107 *= -1 + } + this.InUnknownProtos = &v107 + } + if r.Intn(10) != 0 { + v108 := int64(r.Int63()) + if r.Intn(2) == 0 { + v108 *= -1 + } + this.InDiscards = &v108 + } + if r.Intn(10) != 0 { + v109 := int64(r.Int63()) + if r.Intn(2) == 0 { + v109 *= -1 + } + this.InDelivers = &v109 + } + if r.Intn(10) != 0 { + v110 := int64(r.Int63()) + if r.Intn(2) == 0 { + v110 *= -1 + } + this.OutRequests = &v110 + } + if r.Intn(10) != 0 { + v111 := int64(r.Int63()) + if r.Intn(2) == 0 { + v111 *= -1 + } + this.OutDiscards = &v111 + } + if r.Intn(10) != 0 { + v112 := int64(r.Int63()) + if r.Intn(2) == 0 { + v112 *= -1 + } + this.OutNoRoutes = &v112 + } + if r.Intn(10) != 0 { + v113 := int64(r.Int63()) + if r.Intn(2) == 0 { + v113 *= -1 + } + this.ReasmTimeout = &v113 + } + if r.Intn(10) != 0 { + v114 := int64(r.Int63()) + if r.Intn(2) == 0 { + v114 *= -1 + } + this.ReasmReqds = &v114 + } + if r.Intn(10) != 0 { + v115 := int64(r.Int63()) + if r.Intn(2) == 0 { + v115 *= -1 + } + this.ReasmOKs = &v115 + } + if r.Intn(10) != 0 { + v116 := int64(r.Int63()) + if r.Intn(2) == 0 { + v116 *= -1 + } + this.ReasmFails = &v116 + } + if r.Intn(10) != 0 { + v117 := int64(r.Int63()) + if r.Intn(2) == 0 { + v117 *= -1 + } + this.FragOKs = &v117 + } + if r.Intn(10) != 0 { + v118 := int64(r.Int63()) + if r.Intn(2) == 0 { + v118 *= -1 + } + this.FragFails = &v118 + } + if r.Intn(10) != 0 { + v119 := int64(r.Int63()) + if r.Intn(2) == 0 { + v119 *= -1 + } + this.FragCreates = &v119 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedIcmpStatistics(r randyMesos, easy bool) *IcmpStatistics { + this := &IcmpStatistics{} + if r.Intn(10) != 0 { + v120 := int64(r.Int63()) + if r.Intn(2) == 0 { + v120 *= -1 + } + this.InMsgs = &v120 + } + if r.Intn(10) != 0 { + v121 := int64(r.Int63()) + if r.Intn(2) == 0 { + v121 *= -1 + } + this.InErrors = &v121 + } + if r.Intn(10) != 0 { + v122 := int64(r.Int63()) + if r.Intn(2) == 0 { + v122 *= -1 + } + this.InCsumErrors = &v122 + } + if r.Intn(10) != 0 { + v123 := int64(r.Int63()) + if r.Intn(2) == 0 { + v123 *= -1 + } + this.InDestUnreachs = &v123 + } + if r.Intn(10) != 0 { + v124 := int64(r.Int63()) + if r.Intn(2) == 0 { + v124 *= -1 + } + this.InTimeExcds = &v124 + } + if r.Intn(10) != 0 { + v125 := int64(r.Int63()) + if r.Intn(2) == 0 { + v125 *= -1 + } + this.InParmProbs = &v125 + } + if r.Intn(10) != 0 { + v126 := int64(r.Int63()) + if r.Intn(2) == 0 { + v126 *= -1 + } + this.InSrcQuenchs = &v126 + } + if r.Intn(10) != 0 { + v127 := int64(r.Int63()) + if r.Intn(2) == 0 { + v127 *= -1 + } + this.InRedirects = &v127 + } + if r.Intn(10) != 0 { + v128 := int64(r.Int63()) + if r.Intn(2) == 0 { + v128 *= -1 + } + this.InEchos = &v128 + } + if r.Intn(10) != 0 { + v129 := int64(r.Int63()) + if r.Intn(2) == 0 { + v129 *= -1 + } + this.InEchoReps = &v129 + } + if r.Intn(10) != 0 { + v130 := int64(r.Int63()) + if r.Intn(2) == 0 { + v130 *= -1 + } + this.InTimestamps = &v130 + } + if r.Intn(10) != 0 { + v131 := int64(r.Int63()) + if r.Intn(2) == 0 { + v131 *= -1 + } + this.InTimestampReps = &v131 + } + if r.Intn(10) != 0 { + v132 := int64(r.Int63()) + if r.Intn(2) == 0 { + v132 *= -1 + } + this.InAddrMasks = &v132 + } + if r.Intn(10) != 0 { + v133 := int64(r.Int63()) + if r.Intn(2) == 0 { + v133 *= -1 + } + this.InAddrMaskReps = &v133 + } + if r.Intn(10) != 0 { + v134 := int64(r.Int63()) + if r.Intn(2) == 0 { + v134 *= -1 + } + this.OutMsgs = &v134 + } + if r.Intn(10) != 0 { + v135 := int64(r.Int63()) + if r.Intn(2) == 0 { + v135 *= -1 + } + this.OutErrors = &v135 + } + if r.Intn(10) != 0 { + v136 := int64(r.Int63()) + if r.Intn(2) == 0 { + v136 *= -1 + } + this.OutDestUnreachs = &v136 + } + if r.Intn(10) != 0 { + v137 := int64(r.Int63()) + if r.Intn(2) == 0 { + v137 *= -1 + } + this.OutTimeExcds = &v137 + } + if r.Intn(10) != 0 { + v138 := int64(r.Int63()) + if r.Intn(2) == 0 { + v138 *= -1 + } + this.OutParmProbs = &v138 + } + if r.Intn(10) != 0 { + v139 := int64(r.Int63()) + if r.Intn(2) == 0 { + v139 *= -1 + } + this.OutSrcQuenchs = &v139 + } + if r.Intn(10) != 0 { + v140 := int64(r.Int63()) + if r.Intn(2) == 0 { + v140 *= -1 + } + this.OutRedirects = &v140 + } + if r.Intn(10) != 0 { + v141 := int64(r.Int63()) + if r.Intn(2) == 0 { + v141 *= -1 + } + this.OutEchos = &v141 + } + if r.Intn(10) != 0 { + v142 := int64(r.Int63()) + if r.Intn(2) == 0 { + v142 *= -1 + } + this.OutEchoReps = &v142 + } + if r.Intn(10) != 0 { + v143 := int64(r.Int63()) + if r.Intn(2) == 0 { + v143 *= -1 + } + this.OutTimestamps = &v143 + } + if r.Intn(10) != 0 { + v144 := int64(r.Int63()) + if r.Intn(2) == 0 { + v144 *= -1 + } + this.OutTimestampReps = &v144 + } + if r.Intn(10) != 0 { + v145 := int64(r.Int63()) + if r.Intn(2) == 0 { + v145 *= -1 + } + this.OutAddrMasks = &v145 + } + if r.Intn(10) != 0 { + v146 := int64(r.Int63()) + if r.Intn(2) == 0 { + v146 *= -1 + } + this.OutAddrMaskReps = &v146 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTcpStatistics(r randyMesos, easy bool) *TcpStatistics { + this := &TcpStatistics{} + if r.Intn(10) != 0 { + v147 := int64(r.Int63()) + if r.Intn(2) == 0 { + v147 *= -1 + } + this.RtoAlgorithm = &v147 + } + if r.Intn(10) != 0 { + v148 := int64(r.Int63()) + if r.Intn(2) == 0 { + v148 *= -1 + } + this.RtoMin = &v148 + } + if r.Intn(10) != 0 { + v149 := int64(r.Int63()) + if r.Intn(2) == 0 { + v149 *= -1 + } + this.RtoMax = &v149 + } + if r.Intn(10) != 0 { + v150 := int64(r.Int63()) + if r.Intn(2) == 0 { + v150 *= -1 + } + this.MaxConn = &v150 + } + if r.Intn(10) != 0 { + v151 := int64(r.Int63()) + if r.Intn(2) == 0 { + v151 *= -1 + } + this.ActiveOpens = &v151 + } + if r.Intn(10) != 0 { + v152 := int64(r.Int63()) + if r.Intn(2) == 0 { + v152 *= -1 + } + this.PassiveOpens = &v152 + } + if r.Intn(10) != 0 { + v153 := int64(r.Int63()) + if r.Intn(2) == 0 { + v153 *= -1 + } + this.AttemptFails = &v153 + } + if r.Intn(10) != 0 { + v154 := int64(r.Int63()) + if r.Intn(2) == 0 { + v154 *= -1 + } + this.EstabResets = &v154 + } + if r.Intn(10) != 0 { + v155 := int64(r.Int63()) + if r.Intn(2) == 0 { + v155 *= -1 + } + this.CurrEstab = &v155 + } + if r.Intn(10) != 0 { + v156 := int64(r.Int63()) + if r.Intn(2) == 0 { + v156 *= -1 + } + this.InSegs = &v156 + } + if r.Intn(10) != 0 { + v157 := int64(r.Int63()) + if r.Intn(2) == 0 { + v157 *= -1 + } + this.OutSegs = &v157 + } + if r.Intn(10) != 0 { + v158 := int64(r.Int63()) + if r.Intn(2) == 0 { + v158 *= -1 + } + this.RetransSegs = &v158 + } + if r.Intn(10) != 0 { + v159 := int64(r.Int63()) + if r.Intn(2) == 0 { + v159 *= -1 + } + this.InErrs = &v159 + } + if r.Intn(10) != 0 { + v160 := int64(r.Int63()) + if r.Intn(2) == 0 { + v160 *= -1 + } + this.OutRsts = &v160 + } + if r.Intn(10) != 0 { + v161 := int64(r.Int63()) + if r.Intn(2) == 0 { + v161 *= -1 + } + this.InCsumErrors = &v161 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedUdpStatistics(r randyMesos, easy bool) *UdpStatistics { + this := &UdpStatistics{} + if r.Intn(10) != 0 { + v162 := int64(r.Int63()) + if r.Intn(2) == 0 { + v162 *= -1 + } + this.InDatagrams = &v162 + } + if r.Intn(10) != 0 { + v163 := int64(r.Int63()) + if r.Intn(2) == 0 { + v163 *= -1 + } + this.NoPorts = &v163 + } + if r.Intn(10) != 0 { + v164 := int64(r.Int63()) + if r.Intn(2) == 0 { + v164 *= -1 + } + this.InErrors = &v164 + } + if r.Intn(10) != 0 { + v165 := int64(r.Int63()) + if r.Intn(2) == 0 { + v165 *= -1 + } + this.OutDatagrams = &v165 + } + if r.Intn(10) != 0 { + v166 := int64(r.Int63()) + if r.Intn(2) == 0 { + v166 *= -1 + } + this.RcvbufErrors = &v166 + } + if r.Intn(10) != 0 { + v167 := int64(r.Int63()) + if r.Intn(2) == 0 { + v167 *= -1 + } + this.SndbufErrors = &v167 + } + if r.Intn(10) != 0 { + v168 := int64(r.Int63()) + if r.Intn(2) == 0 { + v168 *= -1 + } + this.InCsumErrors = &v168 + } + if r.Intn(10) != 0 { + v169 := int64(r.Int63()) + if r.Intn(2) == 0 { + v169 *= -1 + } + this.IgnoredMulti = &v169 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedSNMPStatistics(r randyMesos, easy bool) *SNMPStatistics { + this := &SNMPStatistics{} + if r.Intn(10) != 0 { + this.IPStats = NewPopulatedIpStatistics(r, easy) + } + if r.Intn(10) != 0 { + this.ICMPStats = NewPopulatedIcmpStatistics(r, easy) + } + if r.Intn(10) != 0 { + this.TCPStats = NewPopulatedTcpStatistics(r, easy) + } + if r.Intn(10) != 0 { + this.UDPStats = NewPopulatedUdpStatistics(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDiskStatistics(r randyMesos, easy bool) *DiskStatistics { + this := &DiskStatistics{} + if r.Intn(10) != 0 { + this.Source = NewPopulatedResource_DiskInfo_Source(r, easy) + } + if r.Intn(10) != 0 { + this.Persistence = NewPopulatedResource_DiskInfo_Persistence(r, easy) + } + if r.Intn(10) != 0 { + v170 := uint64(uint64(r.Uint32())) + this.LimitBytes = &v170 + } + if r.Intn(10) != 0 { + v171 := uint64(uint64(r.Uint32())) + this.UsedBytes = &v171 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResourceStatistics(r randyMesos, easy bool) *ResourceStatistics { + this := &ResourceStatistics{} + this.Timestamp = float64(r.Float64()) + if r.Intn(2) == 0 { + this.Timestamp *= -1 + } + if r.Intn(10) != 0 { + v172 := float64(r.Float64()) + if r.Intn(2) == 0 { + v172 *= -1 + } + this.CPUsUserTimeSecs = &v172 + } + if r.Intn(10) != 0 { + v173 := float64(r.Float64()) + if r.Intn(2) == 0 { + v173 *= -1 + } + this.CPUsSystemTimeSecs = &v173 + } + if r.Intn(10) != 0 { + v174 := float64(r.Float64()) + if r.Intn(2) == 0 { + v174 *= -1 + } + this.CPUsLimit = &v174 + } + if r.Intn(10) != 0 { + v175 := uint64(uint64(r.Uint32())) + this.MemRSSBytes = &v175 + } + if r.Intn(10) != 0 { + v176 := uint64(uint64(r.Uint32())) + this.MemLimitBytes = &v176 + } + if r.Intn(10) != 0 { + v177 := uint32(r.Uint32()) + this.CPUsNrPeriods = &v177 + } + if r.Intn(10) != 0 { + v178 := uint32(r.Uint32()) + this.CPUsNrThrottled = &v178 + } + if r.Intn(10) != 0 { + v179 := float64(r.Float64()) + if r.Intn(2) == 0 { + v179 *= -1 + } + this.CPUsThrottledTimeSecs = &v179 + } + if r.Intn(10) != 0 { + v180 := uint64(uint64(r.Uint32())) + this.MemFileBytes = &v180 + } + if r.Intn(10) != 0 { + v181 := uint64(uint64(r.Uint32())) + this.MemAnonBytes = &v181 + } + if r.Intn(10) != 0 { + v182 := uint64(uint64(r.Uint32())) + this.MemMappedFileBytes = &v182 + } + if r.Intn(10) != 0 { + this.Perf = NewPopulatedPerfStatistics(r, easy) + } + if r.Intn(10) != 0 { + v183 := uint64(uint64(r.Uint32())) + this.NetRxPackets = &v183 + } + if r.Intn(10) != 0 { + v184 := uint64(uint64(r.Uint32())) + this.NetRxBytes = &v184 + } + if r.Intn(10) != 0 { + v185 := uint64(uint64(r.Uint32())) + this.NetRxErrors = &v185 + } + if r.Intn(10) != 0 { + v186 := uint64(uint64(r.Uint32())) + this.NetRxDropped = &v186 + } + if r.Intn(10) != 0 { + v187 := uint64(uint64(r.Uint32())) + this.NetTxPackets = &v187 + } + if r.Intn(10) != 0 { + v188 := uint64(uint64(r.Uint32())) + this.NetTxBytes = &v188 + } + if r.Intn(10) != 0 { + v189 := uint64(uint64(r.Uint32())) + this.NetTxErrors = &v189 + } + if r.Intn(10) != 0 { + v190 := uint64(uint64(r.Uint32())) + this.NetTxDropped = &v190 + } + if r.Intn(10) != 0 { + v191 := float64(r.Float64()) + if r.Intn(2) == 0 { + v191 *= -1 + } + this.NetTCPRttMicrosecsP50 = &v191 + } + if r.Intn(10) != 0 { + v192 := float64(r.Float64()) + if r.Intn(2) == 0 { + v192 *= -1 + } + this.NetTCPRttMicrosecsP90 = &v192 + } + if r.Intn(10) != 0 { + v193 := float64(r.Float64()) + if r.Intn(2) == 0 { + v193 *= -1 + } + this.NetTCPRttMicrosecsP95 = &v193 + } + if r.Intn(10) != 0 { + v194 := float64(r.Float64()) + if r.Intn(2) == 0 { + v194 *= -1 + } + this.NetTCPRttMicrosecsP99 = &v194 + } + if r.Intn(10) != 0 { + v195 := uint64(uint64(r.Uint32())) + this.DiskLimitBytes = &v195 + } + if r.Intn(10) != 0 { + v196 := uint64(uint64(r.Uint32())) + this.DiskUsedBytes = &v196 + } + if r.Intn(10) != 0 { + v197 := float64(r.Float64()) + if r.Intn(2) == 0 { + v197 *= -1 + } + this.NetTCPActiveConnections = &v197 + } + if r.Intn(10) != 0 { + v198 := float64(r.Float64()) + if r.Intn(2) == 0 { + v198 *= -1 + } + this.NetTCPTimeWaitConnections = &v198 + } + if r.Intn(10) != 0 { + v199 := uint32(r.Uint32()) + this.Processes = &v199 + } + if r.Intn(10) != 0 { + v200 := uint32(r.Uint32()) + this.Threads = &v200 + } + if r.Intn(10) != 0 { + v201 := uint64(uint64(r.Uint32())) + this.MemLowPressureCounter = &v201 + } + if r.Intn(10) != 0 { + v202 := uint64(uint64(r.Uint32())) + this.MemMediumPressureCounter = &v202 + } + if r.Intn(10) != 0 { + v203 := uint64(uint64(r.Uint32())) + this.MemCriticalPressureCounter = &v203 + } + if r.Intn(10) != 0 { + v204 := r.Intn(5) + this.NetTrafficControlStatistics = make([]TrafficControlStatistics, v204) + for i := 0; i < v204; i++ { + v205 := NewPopulatedTrafficControlStatistics(r, easy) + this.NetTrafficControlStatistics[i] = *v205 + } + } + if r.Intn(10) != 0 { + v206 := uint64(uint64(r.Uint32())) + this.MemTotalBytes = &v206 + } + if r.Intn(10) != 0 { + v207 := uint64(uint64(r.Uint32())) + this.MemTotalMemswBytes = &v207 + } + if r.Intn(10) != 0 { + v208 := uint64(uint64(r.Uint32())) + this.MemSoftLimitBytes = &v208 + } + if r.Intn(10) != 0 { + v209 := uint64(uint64(r.Uint32())) + this.MemCacheBytes = &v209 + } + if r.Intn(10) != 0 { + v210 := uint64(uint64(r.Uint32())) + this.MemSwapBytes = &v210 + } + if r.Intn(10) != 0 { + v211 := uint64(uint64(r.Uint32())) + this.MemUnevictableBytes = &v211 + } + if r.Intn(10) != 0 { + this.NetSNMPStatistics = NewPopulatedSNMPStatistics(r, easy) + } + if r.Intn(10) != 0 { + v212 := r.Intn(5) + this.DiskStatistics = make([]DiskStatistics, v212) + for i := 0; i < v212; i++ { + v213 := NewPopulatedDiskStatistics(r, easy) + this.DiskStatistics[i] = *v213 + } + } + if r.Intn(10) != 0 { + this.BlkioStatistics = NewPopulatedCgroupInfo_Blkio_Statistics(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResourceUsage(r randyMesos, easy bool) *ResourceUsage { + this := &ResourceUsage{} + if r.Intn(10) == 0 { + v214 := r.Intn(5) + this.Executors = make([]ResourceUsage_Executor, v214) + for i := 0; i < v214; i++ { + v215 := NewPopulatedResourceUsage_Executor(r, easy) + this.Executors[i] = *v215 + } + } + if r.Intn(10) != 0 { + v216 := r.Intn(5) + this.Total = make([]Resource, v216) + for i := 0; i < v216; i++ { + v217 := NewPopulatedResource(r, easy) + this.Total[i] = *v217 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResourceUsage_Executor(r randyMesos, easy bool) *ResourceUsage_Executor { + this := &ResourceUsage_Executor{} + v218 := NewPopulatedExecutorInfo(r, easy) + this.ExecutorInfo = *v218 + if r.Intn(10) != 0 { + v219 := r.Intn(5) + this.Allocated = make([]Resource, v219) + for i := 0; i < v219; i++ { + v220 := NewPopulatedResource(r, easy) + this.Allocated[i] = *v220 + } + } + if r.Intn(10) != 0 { + this.Statistics = NewPopulatedResourceStatistics(r, easy) + } + v221 := NewPopulatedContainerID(r, easy) + this.ContainerID = *v221 + if r.Intn(10) != 0 { + v222 := r.Intn(5) + this.Tasks = make([]ResourceUsage_Executor_Task, v222) + for i := 0; i < v222; i++ { + v223 := NewPopulatedResourceUsage_Executor_Task(r, easy) + this.Tasks[i] = *v223 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedResourceUsage_Executor_Task(r randyMesos, easy bool) *ResourceUsage_Executor_Task { + this := &ResourceUsage_Executor_Task{} + this.Name = string(randStringMesos(r)) + v224 := NewPopulatedTaskID(r, easy) + this.ID = *v224 + if r.Intn(10) != 0 { + v225 := r.Intn(5) + this.Resources = make([]Resource, v225) + for i := 0; i < v225; i++ { + v226 := NewPopulatedResource(r, easy) + this.Resources[i] = *v226 + } + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedPerfStatistics(r randyMesos, easy bool) *PerfStatistics { + this := &PerfStatistics{} + this.Timestamp = float64(r.Float64()) + if r.Intn(2) == 0 { + this.Timestamp *= -1 + } + this.Duration = float64(r.Float64()) + if r.Intn(2) == 0 { + this.Duration *= -1 + } + if r.Intn(10) != 0 { + v227 := uint64(uint64(r.Uint32())) + this.Cycles = &v227 + } + if r.Intn(10) != 0 { + v228 := uint64(uint64(r.Uint32())) + this.StalledCyclesFrontend = &v228 + } + if r.Intn(10) != 0 { + v229 := uint64(uint64(r.Uint32())) + this.StalledCyclesBackend = &v229 + } + if r.Intn(10) != 0 { + v230 := uint64(uint64(r.Uint32())) + this.Instructions = &v230 + } + if r.Intn(10) != 0 { + v231 := uint64(uint64(r.Uint32())) + this.CacheReferences = &v231 + } + if r.Intn(10) != 0 { + v232 := uint64(uint64(r.Uint32())) + this.CacheMisses = &v232 + } + if r.Intn(10) != 0 { + v233 := uint64(uint64(r.Uint32())) + this.Branches = &v233 + } + if r.Intn(10) != 0 { + v234 := uint64(uint64(r.Uint32())) + this.BranchMisses = &v234 + } + if r.Intn(10) != 0 { + v235 := uint64(uint64(r.Uint32())) + this.BusCycles = &v235 + } + if r.Intn(10) != 0 { + v236 := uint64(uint64(r.Uint32())) + this.RefCycles = &v236 + } + if r.Intn(10) != 0 { + v237 := float64(r.Float64()) + if r.Intn(2) == 0 { + v237 *= -1 + } + this.CPUClock = &v237 + } + if r.Intn(10) != 0 { + v238 := float64(r.Float64()) + if r.Intn(2) == 0 { + v238 *= -1 + } + this.TaskClock = &v238 + } + if r.Intn(10) != 0 { + v239 := uint64(uint64(r.Uint32())) + this.PageFaults = &v239 + } + if r.Intn(10) != 0 { + v240 := uint64(uint64(r.Uint32())) + this.MinorFaults = &v240 + } + if r.Intn(10) != 0 { + v241 := uint64(uint64(r.Uint32())) + this.MajorFaults = &v241 + } + if r.Intn(10) != 0 { + v242 := uint64(uint64(r.Uint32())) + this.ContextSwitches = &v242 + } + if r.Intn(10) != 0 { + v243 := uint64(uint64(r.Uint32())) + this.CPUMigrations = &v243 + } + if r.Intn(10) != 0 { + v244 := uint64(uint64(r.Uint32())) + this.AlignmentFaults = &v244 + } + if r.Intn(10) != 0 { + v245 := uint64(uint64(r.Uint32())) + this.EmulationFaults = &v245 + } + if r.Intn(10) != 0 { + v246 := uint64(uint64(r.Uint32())) + this.L1DcacheLoads = &v246 + } + if r.Intn(10) != 0 { + v247 := uint64(uint64(r.Uint32())) + this.L1DcacheLoadMisses = &v247 + } + if r.Intn(10) != 0 { + v248 := uint64(uint64(r.Uint32())) + this.L1DcacheStores = &v248 + } + if r.Intn(10) != 0 { + v249 := uint64(uint64(r.Uint32())) + this.L1DcacheStoreMisses = &v249 + } + if r.Intn(10) != 0 { + v250 := uint64(uint64(r.Uint32())) + this.L1DcachePrefetches = &v250 + } + if r.Intn(10) != 0 { + v251 := uint64(uint64(r.Uint32())) + this.L1DcachePrefetchMisses = &v251 + } + if r.Intn(10) != 0 { + v252 := uint64(uint64(r.Uint32())) + this.L1IcacheLoads = &v252 + } + if r.Intn(10) != 0 { + v253 := uint64(uint64(r.Uint32())) + this.L1IcacheLoadMisses = &v253 + } + if r.Intn(10) != 0 { + v254 := uint64(uint64(r.Uint32())) + this.L1IcachePrefetches = &v254 + } + if r.Intn(10) != 0 { + v255 := uint64(uint64(r.Uint32())) + this.L1IcachePrefetchMisses = &v255 + } + if r.Intn(10) != 0 { + v256 := uint64(uint64(r.Uint32())) + this.LLCLoads = &v256 + } + if r.Intn(10) != 0 { + v257 := uint64(uint64(r.Uint32())) + this.LLCLoadMisses = &v257 + } + if r.Intn(10) != 0 { + v258 := uint64(uint64(r.Uint32())) + this.LLCStores = &v258 + } + if r.Intn(10) != 0 { + v259 := uint64(uint64(r.Uint32())) + this.LLCStoreMisses = &v259 + } + if r.Intn(10) != 0 { + v260 := uint64(uint64(r.Uint32())) + this.LLCPrefetches = &v260 + } + if r.Intn(10) != 0 { + v261 := uint64(uint64(r.Uint32())) + this.LLCPrefetchMisses = &v261 + } + if r.Intn(10) != 0 { + v262 := uint64(uint64(r.Uint32())) + this.DTLBLoads = &v262 + } + if r.Intn(10) != 0 { + v263 := uint64(uint64(r.Uint32())) + this.DTLBLoadMisses = &v263 + } + if r.Intn(10) != 0 { + v264 := uint64(uint64(r.Uint32())) + this.DTLBStores = &v264 + } + if r.Intn(10) != 0 { + v265 := uint64(uint64(r.Uint32())) + this.DTLBStoreMisses = &v265 + } + if r.Intn(10) != 0 { + v266 := uint64(uint64(r.Uint32())) + this.DTLBPrefetches = &v266 + } + if r.Intn(10) != 0 { + v267 := uint64(uint64(r.Uint32())) + this.DTLBPrefetchMisses = &v267 + } + if r.Intn(10) != 0 { + v268 := uint64(uint64(r.Uint32())) + this.ITLBLoads = &v268 + } + if r.Intn(10) != 0 { + v269 := uint64(uint64(r.Uint32())) + this.ITLBLoadMisses = &v269 + } + if r.Intn(10) != 0 { + v270 := uint64(uint64(r.Uint32())) + this.BranchLoads = &v270 + } + if r.Intn(10) != 0 { + v271 := uint64(uint64(r.Uint32())) + this.BranchLoadMisses = &v271 + } + if r.Intn(10) != 0 { + v272 := uint64(uint64(r.Uint32())) + this.NodeLoads = &v272 + } + if r.Intn(10) != 0 { + v273 := uint64(uint64(r.Uint32())) + this.NodeLoadMisses = &v273 + } + if r.Intn(10) != 0 { + v274 := uint64(uint64(r.Uint32())) + this.NodeStores = &v274 + } + if r.Intn(10) != 0 { + v275 := uint64(uint64(r.Uint32())) + this.NodeStoreMisses = &v275 + } + if r.Intn(10) != 0 { + v276 := uint64(uint64(r.Uint32())) + this.NodePrefetches = &v276 + } + if r.Intn(10) != 0 { + v277 := uint64(uint64(r.Uint32())) + this.NodePrefetchMisses = &v277 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedRequest(r randyMesos, easy bool) *Request { + this := &Request{} + if r.Intn(10) != 0 { + this.AgentID = NewPopulatedAgentID(r, easy) + } + if r.Intn(10) != 0 { + v278 := r.Intn(5) + this.Resources = make([]Resource, v278) + for i := 0; i < v278; i++ { + v279 := NewPopulatedResource(r, easy) + this.Resources[i] = *v279 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer(r randyMesos, easy bool) *Offer { + this := &Offer{} + v280 := NewPopulatedOfferID(r, easy) + this.ID = *v280 + v281 := NewPopulatedFrameworkID(r, easy) + this.FrameworkID = *v281 + v282 := NewPopulatedAgentID(r, easy) + this.AgentID = *v282 + this.Hostname = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v283 := r.Intn(5) + this.Resources = make([]Resource, v283) + for i := 0; i < v283; i++ { + v284 := NewPopulatedResource(r, easy) + this.Resources[i] = *v284 + } + } + if r.Intn(10) != 0 { + v285 := r.Intn(5) + this.ExecutorIDs = make([]ExecutorID, v285) + for i := 0; i < v285; i++ { + v286 := NewPopulatedExecutorID(r, easy) + this.ExecutorIDs[i] = *v286 + } + } + if r.Intn(10) != 0 { + v287 := r.Intn(5) + this.Attributes = make([]Attribute, v287) + for i := 0; i < v287; i++ { + v288 := NewPopulatedAttribute(r, easy) + this.Attributes[i] = *v288 + } + } + if r.Intn(10) != 0 { + this.URL = NewPopulatedURL(r, easy) + } + if r.Intn(10) != 0 { + this.Unavailability = NewPopulatedUnavailability(r, easy) + } + if r.Intn(10) != 0 { + this.AllocationInfo = NewPopulatedResource_AllocationInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Domain = NewPopulatedDomainInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation(r randyMesos, easy bool) *Offer_Operation { + this := &Offer_Operation{} + this.Type = Offer_Operation_Type([]int32{0, 1, 6, 2, 3, 4, 5, 11, 12, 13, 14}[r.Intn(11)]) + if r.Intn(10) != 0 { + this.Launch = NewPopulatedOffer_Operation_Launch(r, easy) + } + if r.Intn(10) != 0 { + this.Reserve = NewPopulatedOffer_Operation_Reserve(r, easy) + } + if r.Intn(10) != 0 { + this.Unreserve = NewPopulatedOffer_Operation_Unreserve(r, easy) + } + if r.Intn(10) != 0 { + this.Create = NewPopulatedOffer_Operation_Create(r, easy) + } + if r.Intn(10) != 0 { + this.Destroy = NewPopulatedOffer_Operation_Destroy(r, easy) + } + if r.Intn(10) != 0 { + this.LaunchGroup = NewPopulatedOffer_Operation_LaunchGroup(r, easy) + } + if r.Intn(10) != 0 { + this.ID = NewPopulatedOperationID(r, easy) + } + if r.Intn(10) != 0 { + this.GrowVolume = NewPopulatedOffer_Operation_GrowVolume(r, easy) + } + if r.Intn(10) != 0 { + this.ShrinkVolume = NewPopulatedOffer_Operation_ShrinkVolume(r, easy) + } + if r.Intn(10) != 0 { + this.CreateDisk = NewPopulatedOffer_Operation_CreateDisk(r, easy) + } + if r.Intn(10) != 0 { + this.DestroyDisk = NewPopulatedOffer_Operation_DestroyDisk(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_Launch(r randyMesos, easy bool) *Offer_Operation_Launch { + this := &Offer_Operation_Launch{} + if r.Intn(10) != 0 { + v289 := r.Intn(5) + this.TaskInfos = make([]TaskInfo, v289) + for i := 0; i < v289; i++ { + v290 := NewPopulatedTaskInfo(r, easy) + this.TaskInfos[i] = *v290 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_LaunchGroup(r randyMesos, easy bool) *Offer_Operation_LaunchGroup { + this := &Offer_Operation_LaunchGroup{} + v291 := NewPopulatedExecutorInfo(r, easy) + this.Executor = *v291 + v292 := NewPopulatedTaskGroupInfo(r, easy) + this.TaskGroup = *v292 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_Reserve(r randyMesos, easy bool) *Offer_Operation_Reserve { + this := &Offer_Operation_Reserve{} + if r.Intn(10) != 0 { + v293 := r.Intn(5) + this.Resources = make([]Resource, v293) + for i := 0; i < v293; i++ { + v294 := NewPopulatedResource(r, easy) + this.Resources[i] = *v294 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_Unreserve(r randyMesos, easy bool) *Offer_Operation_Unreserve { + this := &Offer_Operation_Unreserve{} + if r.Intn(10) != 0 { + v295 := r.Intn(5) + this.Resources = make([]Resource, v295) + for i := 0; i < v295; i++ { + v296 := NewPopulatedResource(r, easy) + this.Resources[i] = *v296 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_Create(r randyMesos, easy bool) *Offer_Operation_Create { + this := &Offer_Operation_Create{} + if r.Intn(10) != 0 { + v297 := r.Intn(5) + this.Volumes = make([]Resource, v297) + for i := 0; i < v297; i++ { + v298 := NewPopulatedResource(r, easy) + this.Volumes[i] = *v298 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_Destroy(r randyMesos, easy bool) *Offer_Operation_Destroy { + this := &Offer_Operation_Destroy{} + if r.Intn(10) != 0 { + v299 := r.Intn(5) + this.Volumes = make([]Resource, v299) + for i := 0; i < v299; i++ { + v300 := NewPopulatedResource(r, easy) + this.Volumes[i] = *v300 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_GrowVolume(r randyMesos, easy bool) *Offer_Operation_GrowVolume { + this := &Offer_Operation_GrowVolume{} + v301 := NewPopulatedResource(r, easy) + this.Volume = *v301 + v302 := NewPopulatedResource(r, easy) + this.Addition = *v302 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_ShrinkVolume(r randyMesos, easy bool) *Offer_Operation_ShrinkVolume { + this := &Offer_Operation_ShrinkVolume{} + v303 := NewPopulatedResource(r, easy) + this.Volume = *v303 + v304 := NewPopulatedValue_Scalar(r, easy) + this.Subtract = *v304 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_CreateDisk(r randyMesos, easy bool) *Offer_Operation_CreateDisk { + this := &Offer_Operation_CreateDisk{} + v305 := NewPopulatedResource(r, easy) + this.Source = *v305 + this.TargetType = Resource_DiskInfo_Source_Type([]int32{0, 1, 2, 3, 4}[r.Intn(5)]) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOffer_Operation_DestroyDisk(r randyMesos, easy bool) *Offer_Operation_DestroyDisk { + this := &Offer_Operation_DestroyDisk{} + v306 := NewPopulatedResource(r, easy) + this.Source = *v306 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedInverseOffer(r randyMesos, easy bool) *InverseOffer { + this := &InverseOffer{} + v307 := NewPopulatedOfferID(r, easy) + this.OfferID = *v307 + if r.Intn(10) != 0 { + this.URL = NewPopulatedURL(r, easy) + } + v308 := NewPopulatedFrameworkID(r, easy) + this.FrameworkID = *v308 + if r.Intn(10) != 0 { + this.AgentID = NewPopulatedAgentID(r, easy) + } + v309 := NewPopulatedUnavailability(r, easy) + this.Unavailability = *v309 + if r.Intn(10) != 0 { + v310 := r.Intn(5) + this.Resources = make([]Resource, v310) + for i := 0; i < v310; i++ { + v311 := NewPopulatedResource(r, easy) + this.Resources[i] = *v311 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTaskInfo(r randyMesos, easy bool) *TaskInfo { + this := &TaskInfo{} + this.Name = string(randStringMesos(r)) + v312 := NewPopulatedTaskID(r, easy) + this.TaskID = *v312 + v313 := NewPopulatedAgentID(r, easy) + this.AgentID = *v313 + if r.Intn(10) != 0 { + v314 := r.Intn(5) + this.Resources = make([]Resource, v314) + for i := 0; i < v314; i++ { + v315 := NewPopulatedResource(r, easy) + this.Resources[i] = *v315 + } + } + if r.Intn(10) != 0 { + this.Executor = NewPopulatedExecutorInfo(r, easy) + } + if r.Intn(10) != 0 { + v316 := r.Intn(100) + this.Data = make([]byte, v316) + for i := 0; i < v316; i++ { + this.Data[i] = byte(r.Intn(256)) + } + } + if r.Intn(10) != 0 { + this.Command = NewPopulatedCommandInfo(r, easy) + } + if r.Intn(10) != 0 { + this.HealthCheck = NewPopulatedHealthCheck(r, easy) + } + if r.Intn(10) != 0 { + this.Container = NewPopulatedContainerInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if r.Intn(10) != 0 { + this.Discovery = NewPopulatedDiscoveryInfo(r, easy) + } + if r.Intn(10) != 0 { + this.KillPolicy = NewPopulatedKillPolicy(r, easy) + } + if r.Intn(10) != 0 { + this.Check = NewPopulatedCheckInfo(r, easy) + } + if r.Intn(10) != 0 { + this.MaxCompletionTime = NewPopulatedDurationInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTaskGroupInfo(r randyMesos, easy bool) *TaskGroupInfo { + this := &TaskGroupInfo{} + if r.Intn(10) != 0 { + v317 := r.Intn(5) + this.Tasks = make([]TaskInfo, v317) + for i := 0; i < v317; i++ { + v318 := NewPopulatedTaskInfo(r, easy) + this.Tasks[i] = *v318 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTask(r randyMesos, easy bool) *Task { + this := &Task{} + this.Name = string(randStringMesos(r)) + v319 := NewPopulatedTaskID(r, easy) + this.TaskID = *v319 + v320 := NewPopulatedFrameworkID(r, easy) + this.FrameworkID = *v320 + if r.Intn(10) != 0 { + this.ExecutorID = NewPopulatedExecutorID(r, easy) + } + v321 := NewPopulatedAgentID(r, easy) + this.AgentID = *v321 + v322 := TaskState([]int32{6, 0, 1, 8, 2, 3, 4, 7, 5, 9, 10, 11, 12, 13}[r.Intn(14)]) + this.State = &v322 + if r.Intn(10) != 0 { + v323 := r.Intn(5) + this.Resources = make([]Resource, v323) + for i := 0; i < v323; i++ { + v324 := NewPopulatedResource(r, easy) + this.Resources[i] = *v324 + } + } + if r.Intn(10) == 0 { + v325 := r.Intn(5) + this.Statuses = make([]TaskStatus, v325) + for i := 0; i < v325; i++ { + v326 := NewPopulatedTaskStatus(r, easy) + this.Statuses[i] = *v326 + } + } + if r.Intn(10) != 0 { + v327 := TaskState([]int32{6, 0, 1, 8, 2, 3, 4, 7, 5, 9, 10, 11, 12, 13}[r.Intn(14)]) + this.StatusUpdateState = &v327 + } + if r.Intn(10) != 0 { + v328 := r.Intn(100) + this.StatusUpdateUUID = make([]byte, v328) + for i := 0; i < v328; i++ { + this.StatusUpdateUUID[i] = byte(r.Intn(256)) + } + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if r.Intn(10) != 0 { + this.Discovery = NewPopulatedDiscoveryInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Container = NewPopulatedContainerInfo(r, easy) + } + if r.Intn(10) != 0 { + v329 := string(randStringMesos(r)) + this.User = &v329 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTaskResourceLimitation(r randyMesos, easy bool) *TaskResourceLimitation { + this := &TaskResourceLimitation{} + if r.Intn(10) != 0 { + v330 := r.Intn(5) + this.Resources = make([]Resource, v330) + for i := 0; i < v330; i++ { + v331 := NewPopulatedResource(r, easy) + this.Resources[i] = *v331 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedUUID(r randyMesos, easy bool) *UUID { + this := &UUID{} + v332 := r.Intn(100) + this.Value = make([]byte, v332) + for i := 0; i < v332; i++ { + this.Value[i] = byte(r.Intn(256)) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOperation(r randyMesos, easy bool) *Operation { + this := &Operation{} + if r.Intn(10) != 0 { + this.FrameworkID = NewPopulatedFrameworkID(r, easy) + } + if r.Intn(10) != 0 { + this.AgentID = NewPopulatedAgentID(r, easy) + } + v333 := NewPopulatedOffer_Operation(r, easy) + this.Info = *v333 + v334 := NewPopulatedOperationStatus(r, easy) + this.LatestStatus = *v334 + if r.Intn(10) != 0 { + v335 := r.Intn(5) + this.Statuses = make([]OperationStatus, v335) + for i := 0; i < v335; i++ { + v336 := NewPopulatedOperationStatus(r, easy) + this.Statuses[i] = *v336 + } + } + v337 := NewPopulatedUUID(r, easy) + this.UUID = *v337 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedOperationStatus(r randyMesos, easy bool) *OperationStatus { + this := &OperationStatus{} + if r.Intn(10) != 0 { + this.OperationID = NewPopulatedOperationID(r, easy) + } + this.State = OperationState([]int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}[r.Intn(10)]) + if r.Intn(10) != 0 { + v338 := string(randStringMesos(r)) + this.Message = &v338 + } + if r.Intn(10) != 0 { + v339 := r.Intn(5) + this.ConvertedResources = make([]Resource, v339) + for i := 0; i < v339; i++ { + v340 := NewPopulatedResource(r, easy) + this.ConvertedResources[i] = *v340 + } + } + if r.Intn(10) != 0 { + this.UUID = NewPopulatedUUID(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckStatusInfo(r randyMesos, easy bool) *CheckStatusInfo { + this := &CheckStatusInfo{} + if r.Intn(10) != 0 { + v341 := CheckInfo_Type([]int32{0, 1, 2, 3}[r.Intn(4)]) + this.Type = &v341 + } + if r.Intn(10) != 0 { + this.Command = NewPopulatedCheckStatusInfo_Command(r, easy) + } + if r.Intn(10) != 0 { + this.HTTP = NewPopulatedCheckStatusInfo_Http(r, easy) + } + if r.Intn(10) != 0 { + this.TCP = NewPopulatedCheckStatusInfo_Tcp(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckStatusInfo_Command(r randyMesos, easy bool) *CheckStatusInfo_Command { + this := &CheckStatusInfo_Command{} + if r.Intn(10) != 0 { + v342 := int32(r.Int31()) + if r.Intn(2) == 0 { + v342 *= -1 + } + this.ExitCode = &v342 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckStatusInfo_Http(r randyMesos, easy bool) *CheckStatusInfo_Http { + this := &CheckStatusInfo_Http{} + if r.Intn(10) != 0 { + v343 := uint32(r.Uint32()) + this.StatusCode = &v343 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCheckStatusInfo_Tcp(r randyMesos, easy bool) *CheckStatusInfo_Tcp { + this := &CheckStatusInfo_Tcp{} + if r.Intn(10) != 0 { + v344 := bool(bool(r.Intn(2) == 0)) + this.Succeeded = &v344 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTaskStatus(r randyMesos, easy bool) *TaskStatus { + this := &TaskStatus{} + v345 := NewPopulatedTaskID(r, easy) + this.TaskID = *v345 + v346 := TaskState([]int32{6, 0, 1, 8, 2, 3, 4, 7, 5, 9, 10, 11, 12, 13}[r.Intn(14)]) + this.State = &v346 + if r.Intn(10) != 0 { + v347 := r.Intn(100) + this.Data = make([]byte, v347) + for i := 0; i < v347; i++ { + this.Data[i] = byte(r.Intn(256)) + } + } + if r.Intn(10) != 0 { + v348 := string(randStringMesos(r)) + this.Message = &v348 + } + if r.Intn(10) != 0 { + this.AgentID = NewPopulatedAgentID(r, easy) + } + if r.Intn(10) != 0 { + v349 := float64(r.Float64()) + if r.Intn(2) == 0 { + v349 *= -1 + } + this.Timestamp = &v349 + } + if r.Intn(10) != 0 { + this.ExecutorID = NewPopulatedExecutorID(r, easy) + } + if r.Intn(10) != 0 { + v350 := bool(bool(r.Intn(2) == 0)) + this.Healthy = &v350 + } + if r.Intn(10) != 0 { + v351 := TaskStatus_Source([]int32{0, 1, 2}[r.Intn(3)]) + this.Source = &v351 + } + if r.Intn(10) != 0 { + v352 := TaskStatus_Reason([]int32{0, 21, 19, 20, 8, 17, 22, 33, 23, 24, 1, 2, 3, 4, 5, 6, 27, 7, 9, 18, 10, 11, 31, 32, 12, 13, 30, 28, 29, 25, 26, 14, 15, 16}[r.Intn(34)]) + this.Reason = &v352 + } + if r.Intn(10) != 0 { + v353 := r.Intn(100) + this.UUID = make([]byte, v353) + for i := 0; i < v353; i++ { + this.UUID[i] = byte(r.Intn(256)) + } + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if r.Intn(10) == 0 { + this.ContainerStatus = NewPopulatedContainerStatus(r, easy) + } + if r.Intn(10) != 0 { + this.UnreachableTime = NewPopulatedTimeInfo(r, easy) + } + if r.Intn(10) != 0 { + this.CheckStatus = NewPopulatedCheckStatusInfo(r, easy) + } + if r.Intn(10) != 0 { + this.Limitation = NewPopulatedTaskResourceLimitation(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedFilters(r randyMesos, easy bool) *Filters { + this := &Filters{} + if r.Intn(10) != 0 { + v354 := float64(r.Float64()) + if r.Intn(2) == 0 { + v354 *= -1 + } + this.RefuseSeconds = &v354 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedEnvironment(r randyMesos, easy bool) *Environment { + this := &Environment{} + if r.Intn(10) != 0 { + v355 := r.Intn(5) + this.Variables = make([]Environment_Variable, v355) + for i := 0; i < v355; i++ { + v356 := NewPopulatedEnvironment_Variable(r, easy) + this.Variables[i] = *v356 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedEnvironment_Variable(r randyMesos, easy bool) *Environment_Variable { + this := &Environment_Variable{} + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v357 := string(randStringMesos(r)) + this.Value = &v357 + } + if r.Intn(10) != 0 { + v358 := Environment_Variable_Type([]int32{0, 1, 2}[r.Intn(3)]) + this.Type = &v358 + } + if r.Intn(10) != 0 { + this.Secret = NewPopulatedSecret(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedParameter(r randyMesos, easy bool) *Parameter { + this := &Parameter{} + this.Key = string(randStringMesos(r)) + this.Value = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedParameters(r randyMesos, easy bool) *Parameters { + this := &Parameters{} + if r.Intn(10) != 0 { + v359 := r.Intn(5) + this.Parameter = make([]Parameter, v359) + for i := 0; i < v359; i++ { + v360 := NewPopulatedParameter(r, easy) + this.Parameter[i] = *v360 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCredential(r randyMesos, easy bool) *Credential { + this := &Credential{} + this.Principal = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v361 := string(randStringMesos(r)) + this.Secret = &v361 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCredentials(r randyMesos, easy bool) *Credentials { + this := &Credentials{} + if r.Intn(10) != 0 { + v362 := r.Intn(5) + this.Credentials = make([]Credential, v362) + for i := 0; i < v362; i++ { + v363 := NewPopulatedCredential(r, easy) + this.Credentials[i] = *v363 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedSecret(r randyMesos, easy bool) *Secret { + this := &Secret{} + this.Type = Secret_Type([]int32{0, 1, 2}[r.Intn(3)]) + if r.Intn(10) != 0 { + this.Reference = NewPopulatedSecret_Reference(r, easy) + } + if r.Intn(10) != 0 { + this.Value = NewPopulatedSecret_Value(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedSecret_Reference(r randyMesos, easy bool) *Secret_Reference { + this := &Secret_Reference{} + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v364 := string(randStringMesos(r)) + this.Key = &v364 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedSecret_Value(r randyMesos, easy bool) *Secret_Value { + this := &Secret_Value{} + v365 := r.Intn(100) + this.Data = make([]byte, v365) + for i := 0; i < v365; i++ { + this.Data[i] = byte(r.Intn(256)) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedRateLimit(r randyMesos, easy bool) *RateLimit { + this := &RateLimit{} + if r.Intn(10) != 0 { + v366 := float64(r.Float64()) + if r.Intn(2) == 0 { + v366 *= -1 + } + this.QPS = &v366 + } + this.Principal = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v367 := uint64(uint64(r.Uint32())) + this.Capacity = &v367 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedRateLimits(r randyMesos, easy bool) *RateLimits { + this := &RateLimits{} + if r.Intn(10) != 0 { + v368 := r.Intn(5) + this.Limits = make([]RateLimit, v368) + for i := 0; i < v368; i++ { + v369 := NewPopulatedRateLimit(r, easy) + this.Limits[i] = *v369 + } + } + if r.Intn(10) != 0 { + v370 := float64(r.Float64()) + if r.Intn(2) == 0 { + v370 *= -1 + } + this.AggregateDefaultQPS = &v370 + } + if r.Intn(10) != 0 { + v371 := uint64(uint64(r.Uint32())) + this.AggregateDefaultCapacity = &v371 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedImage(r randyMesos, easy bool) *Image { + this := &Image{} + v372 := Image_Type([]int32{1, 2}[r.Intn(2)]) + this.Type = &v372 + if r.Intn(10) != 0 { + this.Appc = NewPopulatedImage_Appc(r, easy) + } + if r.Intn(10) != 0 { + this.Docker = NewPopulatedImage_Docker(r, easy) + } + if r.Intn(10) != 0 { + v373 := bool(bool(r.Intn(2) == 0)) + this.Cached = &v373 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedImage_Appc(r randyMesos, easy bool) *Image_Appc { + this := &Image_Appc{} + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v374 := string(randStringMesos(r)) + this.ID = &v374 + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedImage_Docker(r randyMesos, easy bool) *Image_Docker { + this := &Image_Docker{} + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + this.Credential = NewPopulatedCredential(r, easy) + } + if r.Intn(10) != 0 { + this.Config = NewPopulatedSecret(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedMountPropagation(r randyMesos, easy bool) *MountPropagation { + this := &MountPropagation{} + if r.Intn(10) != 0 { + v375 := MountPropagation_Mode([]int32{0, 1, 2}[r.Intn(3)]) + this.Mode = &v375 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedVolume(r randyMesos, easy bool) *Volume { + this := &Volume{} + this.ContainerPath = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v376 := string(randStringMesos(r)) + this.HostPath = &v376 + } + v377 := Volume_Mode([]int32{1, 2}[r.Intn(2)]) + this.Mode = &v377 + if r.Intn(10) != 0 { + this.Image = NewPopulatedImage(r, easy) + } + if r.Intn(10) != 0 { + this.Source = NewPopulatedVolume_Source(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedVolume_Source(r randyMesos, easy bool) *Volume_Source { + this := &Volume_Source{} + this.Type = Volume_Source_Type([]int32{0, 1, 4, 2, 3}[r.Intn(5)]) + if r.Intn(10) != 0 { + this.DockerVolume = NewPopulatedVolume_Source_DockerVolume(r, easy) + } + if r.Intn(10) != 0 { + this.SandboxPath = NewPopulatedVolume_Source_SandboxPath(r, easy) + } + if r.Intn(10) != 0 { + this.Secret = NewPopulatedSecret(r, easy) + } + if r.Intn(10) != 0 { + this.HostPath = NewPopulatedVolume_Source_HostPath(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedVolume_Source_DockerVolume(r randyMesos, easy bool) *Volume_Source_DockerVolume { + this := &Volume_Source_DockerVolume{} + if r.Intn(10) != 0 { + v378 := string(randStringMesos(r)) + this.Driver = &v378 + } + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + this.DriverOptions = NewPopulatedParameters(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedVolume_Source_HostPath(r randyMesos, easy bool) *Volume_Source_HostPath { + this := &Volume_Source_HostPath{} + this.Path = string(randStringMesos(r)) + if r.Intn(10) != 0 { + this.MountPropagation = NewPopulatedMountPropagation(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedVolume_Source_SandboxPath(r randyMesos, easy bool) *Volume_Source_SandboxPath { + this := &Volume_Source_SandboxPath{} + this.Type = Volume_Source_SandboxPath_Type([]int32{0, 1, 2}[r.Intn(3)]) + this.Path = string(randStringMesos(r)) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedNetworkInfo(r randyMesos, easy bool) *NetworkInfo { + this := &NetworkInfo{} + if r.Intn(10) != 0 { + v379 := r.Intn(10) + this.Groups = make([]string, v379) + for i := 0; i < v379; i++ { + this.Groups[i] = string(randStringMesos(r)) + } + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if r.Intn(10) != 0 { + v380 := r.Intn(5) + this.IPAddresses = make([]NetworkInfo_IPAddress, v380) + for i := 0; i < v380; i++ { + v381 := NewPopulatedNetworkInfo_IPAddress(r, easy) + this.IPAddresses[i] = *v381 + } + } + if r.Intn(10) != 0 { + v382 := string(randStringMesos(r)) + this.Name = &v382 + } + if r.Intn(10) != 0 { + v383 := r.Intn(5) + this.PortMappings = make([]NetworkInfo_PortMapping, v383) + for i := 0; i < v383; i++ { + v384 := NewPopulatedNetworkInfo_PortMapping(r, easy) + this.PortMappings[i] = *v384 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedNetworkInfo_IPAddress(r randyMesos, easy bool) *NetworkInfo_IPAddress { + this := &NetworkInfo_IPAddress{} + if r.Intn(10) != 0 { + v385 := NetworkInfo_Protocol([]int32{1, 2}[r.Intn(2)]) + this.Protocol = &v385 + } + if r.Intn(10) != 0 { + v386 := string(randStringMesos(r)) + this.IPAddress = &v386 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedNetworkInfo_PortMapping(r randyMesos, easy bool) *NetworkInfo_PortMapping { + this := &NetworkInfo_PortMapping{} + this.HostPort = uint32(r.Uint32()) + this.ContainerPort = uint32(r.Uint32()) + if r.Intn(10) != 0 { + v387 := string(randStringMesos(r)) + this.Protocol = &v387 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCapabilityInfo(r randyMesos, easy bool) *CapabilityInfo { + this := &CapabilityInfo{} + if r.Intn(10) != 0 { + v388 := r.Intn(10) + this.Capabilities = make([]CapabilityInfo_Capability, v388) + for i := 0; i < v388; i++ { + this.Capabilities[i] = CapabilityInfo_Capability([]int32{0, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037}[r.Intn(39)]) + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedLinuxInfo(r randyMesos, easy bool) *LinuxInfo { + this := &LinuxInfo{} + if r.Intn(10) != 0 { + this.CapabilityInfo = NewPopulatedCapabilityInfo(r, easy) + } + if r.Intn(10) != 0 { + this.BoundingCapabilities = NewPopulatedCapabilityInfo(r, easy) + } + if r.Intn(10) != 0 { + this.EffectiveCapabilities = NewPopulatedCapabilityInfo(r, easy) + } + if r.Intn(10) != 0 { + v389 := bool(bool(r.Intn(2) == 0)) + this.SharePIDNamespace = &v389 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedRLimitInfo(r randyMesos, easy bool) *RLimitInfo { + this := &RLimitInfo{} + if r.Intn(10) != 0 { + v390 := r.Intn(5) + this.Rlimits = make([]RLimitInfo_RLimit, v390) + for i := 0; i < v390; i++ { + v391 := NewPopulatedRLimitInfo_RLimit(r, easy) + this.Rlimits[i] = *v391 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedRLimitInfo_RLimit(r randyMesos, easy bool) *RLimitInfo_RLimit { + this := &RLimitInfo_RLimit{} + this.Type = RLimitInfo_RLimit_Type([]int32{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}[r.Intn(17)]) + if r.Intn(10) != 0 { + v392 := uint64(uint64(r.Uint32())) + this.Hard = &v392 + } + if r.Intn(10) != 0 { + v393 := uint64(uint64(r.Uint32())) + this.Soft = &v393 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTTYInfo(r randyMesos, easy bool) *TTYInfo { + this := &TTYInfo{} + if r.Intn(10) != 0 { + this.WindowSize = NewPopulatedTTYInfo_WindowSize(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedTTYInfo_WindowSize(r randyMesos, easy bool) *TTYInfo_WindowSize { + this := &TTYInfo_WindowSize{} + this.Rows = uint32(r.Uint32()) + this.Columns = uint32(r.Uint32()) + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedContainerInfo(r randyMesos, easy bool) *ContainerInfo { + this := &ContainerInfo{} + v394 := ContainerInfo_Type([]int32{1, 2}[r.Intn(2)]) + this.Type = &v394 + if r.Intn(10) != 0 { + v395 := r.Intn(5) + this.Volumes = make([]Volume, v395) + for i := 0; i < v395; i++ { + v396 := NewPopulatedVolume(r, easy) + this.Volumes[i] = *v396 + } + } + if r.Intn(10) != 0 { + this.Docker = NewPopulatedContainerInfo_DockerInfo(r, easy) + } + if r.Intn(10) != 0 { + v397 := string(randStringMesos(r)) + this.Hostname = &v397 + } + if r.Intn(10) != 0 { + this.Mesos = NewPopulatedContainerInfo_MesosInfo(r, easy) + } + if r.Intn(10) != 0 { + v398 := r.Intn(5) + this.NetworkInfos = make([]NetworkInfo, v398) + for i := 0; i < v398; i++ { + v399 := NewPopulatedNetworkInfo(r, easy) + this.NetworkInfos[i] = *v399 + } + } + if r.Intn(10) != 0 { + this.LinuxInfo = NewPopulatedLinuxInfo(r, easy) + } + if r.Intn(10) != 0 { + this.RlimitInfo = NewPopulatedRLimitInfo(r, easy) + } + if r.Intn(10) != 0 { + this.TTYInfo = NewPopulatedTTYInfo(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedContainerInfo_DockerInfo(r randyMesos, easy bool) *ContainerInfo_DockerInfo { + this := &ContainerInfo_DockerInfo{} + this.Image = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v400 := ContainerInfo_DockerInfo_Network([]int32{1, 2, 3, 4}[r.Intn(4)]) + this.Network = &v400 + } + if r.Intn(10) != 0 { + v401 := r.Intn(5) + this.PortMappings = make([]ContainerInfo_DockerInfo_PortMapping, v401) + for i := 0; i < v401; i++ { + v402 := NewPopulatedContainerInfo_DockerInfo_PortMapping(r, easy) + this.PortMappings[i] = *v402 + } + } + if r.Intn(10) != 0 { + v403 := bool(bool(r.Intn(2) == 0)) + this.Privileged = &v403 + } + if r.Intn(10) != 0 { + v404 := r.Intn(5) + this.Parameters = make([]Parameter, v404) + for i := 0; i < v404; i++ { + v405 := NewPopulatedParameter(r, easy) + this.Parameters[i] = *v405 + } + } + if r.Intn(10) != 0 { + v406 := bool(bool(r.Intn(2) == 0)) + this.ForcePullImage = &v406 + } + if r.Intn(10) != 0 { + v407 := string(randStringMesos(r)) + this.VolumeDriver = &v407 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedContainerInfo_DockerInfo_PortMapping(r randyMesos, easy bool) *ContainerInfo_DockerInfo_PortMapping { + this := &ContainerInfo_DockerInfo_PortMapping{} + this.HostPort = uint32(r.Uint32()) + this.ContainerPort = uint32(r.Uint32()) + if r.Intn(10) != 0 { + v408 := string(randStringMesos(r)) + this.Protocol = &v408 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedContainerInfo_MesosInfo(r randyMesos, easy bool) *ContainerInfo_MesosInfo { + this := &ContainerInfo_MesosInfo{} + if r.Intn(10) != 0 { + this.Image = NewPopulatedImage(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedContainerStatus(r randyMesos, easy bool) *ContainerStatus { + this := &ContainerStatus{} + if r.Intn(10) != 0 { + v409 := r.Intn(5) + this.NetworkInfos = make([]NetworkInfo, v409) + for i := 0; i < v409; i++ { + v410 := NewPopulatedNetworkInfo(r, easy) + this.NetworkInfos[i] = *v410 + } + } + if r.Intn(10) != 0 { + this.CgroupInfo = NewPopulatedCgroupInfo(r, easy) + } + if r.Intn(10) != 0 { + v411 := uint32(r.Uint32()) + this.ExecutorPID = &v411 + } + if r.Intn(10) == 0 { + this.ContainerID = NewPopulatedContainerID(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo(r randyMesos, easy bool) *CgroupInfo { + this := &CgroupInfo{} + if r.Intn(10) != 0 { + this.NetCLS = NewPopulatedCgroupInfo_NetCls(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_Blkio(r randyMesos, easy bool) *CgroupInfo_Blkio { + this := &CgroupInfo_Blkio{} + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_Blkio_Value(r randyMesos, easy bool) *CgroupInfo_Blkio_Value { + this := &CgroupInfo_Blkio_Value{} + if r.Intn(10) != 0 { + v412 := CgroupInfo_Blkio_Operation([]int32{0, 1, 2, 3, 4, 5}[r.Intn(6)]) + this.Op = &v412 + } + if r.Intn(10) != 0 { + v413 := uint64(uint64(r.Uint32())) + this.Value = &v413 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_Blkio_CFQ(r randyMesos, easy bool) *CgroupInfo_Blkio_CFQ { + this := &CgroupInfo_Blkio_CFQ{} + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_Blkio_CFQ_Statistics(r randyMesos, easy bool) *CgroupInfo_Blkio_CFQ_Statistics { + this := &CgroupInfo_Blkio_CFQ_Statistics{} + if r.Intn(10) != 0 { + this.Device = NewPopulatedDevice_Number(r, easy) + } + if r.Intn(10) != 0 { + v414 := uint64(uint64(r.Uint32())) + this.Sectors = &v414 + } + if r.Intn(10) != 0 { + v415 := uint64(uint64(r.Uint32())) + this.Time = &v415 + } + if r.Intn(10) != 0 { + v416 := r.Intn(5) + this.IOServiced = make([]CgroupInfo_Blkio_Value, v416) + for i := 0; i < v416; i++ { + v417 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOServiced[i] = *v417 + } + } + if r.Intn(10) != 0 { + v418 := r.Intn(5) + this.IOServiceBytes = make([]CgroupInfo_Blkio_Value, v418) + for i := 0; i < v418; i++ { + v419 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOServiceBytes[i] = *v419 + } + } + if r.Intn(10) != 0 { + v420 := r.Intn(5) + this.IOServiceTime = make([]CgroupInfo_Blkio_Value, v420) + for i := 0; i < v420; i++ { + v421 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOServiceTime[i] = *v421 + } + } + if r.Intn(10) != 0 { + v422 := r.Intn(5) + this.IOWaitTime = make([]CgroupInfo_Blkio_Value, v422) + for i := 0; i < v422; i++ { + v423 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOWaitTime[i] = *v423 + } + } + if r.Intn(10) != 0 { + v424 := r.Intn(5) + this.IOMerged = make([]CgroupInfo_Blkio_Value, v424) + for i := 0; i < v424; i++ { + v425 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOMerged[i] = *v425 + } + } + if r.Intn(10) != 0 { + v426 := r.Intn(5) + this.IOQueued = make([]CgroupInfo_Blkio_Value, v426) + for i := 0; i < v426; i++ { + v427 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOQueued[i] = *v427 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_Blkio_Throttling(r randyMesos, easy bool) *CgroupInfo_Blkio_Throttling { + this := &CgroupInfo_Blkio_Throttling{} + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_Blkio_Throttling_Statistics(r randyMesos, easy bool) *CgroupInfo_Blkio_Throttling_Statistics { + this := &CgroupInfo_Blkio_Throttling_Statistics{} + if r.Intn(10) != 0 { + this.Device = NewPopulatedDevice_Number(r, easy) + } + if r.Intn(10) != 0 { + v428 := r.Intn(5) + this.IOServiced = make([]CgroupInfo_Blkio_Value, v428) + for i := 0; i < v428; i++ { + v429 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOServiced[i] = *v429 + } + } + if r.Intn(10) != 0 { + v430 := r.Intn(5) + this.IOServiceBytes = make([]CgroupInfo_Blkio_Value, v430) + for i := 0; i < v430; i++ { + v431 := NewPopulatedCgroupInfo_Blkio_Value(r, easy) + this.IOServiceBytes[i] = *v431 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_Blkio_Statistics(r randyMesos, easy bool) *CgroupInfo_Blkio_Statistics { + this := &CgroupInfo_Blkio_Statistics{} + if r.Intn(10) != 0 { + v432 := r.Intn(5) + this.CFQ = make([]CgroupInfo_Blkio_CFQ_Statistics, v432) + for i := 0; i < v432; i++ { + v433 := NewPopulatedCgroupInfo_Blkio_CFQ_Statistics(r, easy) + this.CFQ[i] = *v433 + } + } + if r.Intn(10) != 0 { + v434 := r.Intn(5) + this.CFQRecursive = make([]CgroupInfo_Blkio_CFQ_Statistics, v434) + for i := 0; i < v434; i++ { + v435 := NewPopulatedCgroupInfo_Blkio_CFQ_Statistics(r, easy) + this.CFQRecursive[i] = *v435 + } + } + if r.Intn(10) != 0 { + v436 := r.Intn(5) + this.Throttling = make([]*CgroupInfo_Blkio_Throttling_Statistics, v436) + for i := 0; i < v436; i++ { + this.Throttling[i] = NewPopulatedCgroupInfo_Blkio_Throttling_Statistics(r, easy) + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedCgroupInfo_NetCls(r randyMesos, easy bool) *CgroupInfo_NetCls { + this := &CgroupInfo_NetCls{} + if r.Intn(10) != 0 { + v437 := uint32(r.Uint32()) + this.ClassID = &v437 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedLabels(r randyMesos, easy bool) *Labels { + this := &Labels{} + if r.Intn(10) != 0 { + v438 := r.Intn(5) + this.Labels = make([]Label, v438) + for i := 0; i < v438; i++ { + v439 := NewPopulatedLabel(r, easy) + this.Labels[i] = *v439 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedLabel(r randyMesos, easy bool) *Label { + this := &Label{} + this.Key = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v440 := string(randStringMesos(r)) + this.Value = &v440 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedPort(r randyMesos, easy bool) *Port { + this := &Port{} + this.Number = uint32(r.Uint32()) + if r.Intn(10) != 0 { + v441 := string(randStringMesos(r)) + this.Name = &v441 + } + if r.Intn(10) != 0 { + v442 := string(randStringMesos(r)) + this.Protocol = &v442 + } + if r.Intn(10) != 0 { + v443 := DiscoveryInfo_Visibility([]int32{0, 1, 2}[r.Intn(3)]) + this.Visibility = &v443 + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedPorts(r randyMesos, easy bool) *Ports { + this := &Ports{} + if r.Intn(10) != 0 { + v444 := r.Intn(5) + this.Ports = make([]Port, v444) + for i := 0; i < v444; i++ { + v445 := NewPopulatedPort(r, easy) + this.Ports[i] = *v445 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDiscoveryInfo(r randyMesos, easy bool) *DiscoveryInfo { + this := &DiscoveryInfo{} + this.Visibility = DiscoveryInfo_Visibility([]int32{0, 1, 2}[r.Intn(3)]) + if r.Intn(10) != 0 { + v446 := string(randStringMesos(r)) + this.Name = &v446 + } + if r.Intn(10) != 0 { + v447 := string(randStringMesos(r)) + this.Environment = &v447 + } + if r.Intn(10) != 0 { + v448 := string(randStringMesos(r)) + this.Location = &v448 + } + if r.Intn(10) != 0 { + v449 := string(randStringMesos(r)) + this.Version = &v449 + } + if r.Intn(10) != 0 { + this.Ports = NewPopulatedPorts(r, easy) + } + if r.Intn(10) != 0 { + this.Labels = NewPopulatedLabels(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedWeightInfo(r randyMesos, easy bool) *WeightInfo { + this := &WeightInfo{} + this.Weight = float64(r.Float64()) + if r.Intn(2) == 0 { + this.Weight *= -1 + } + if r.Intn(10) != 0 { + v450 := string(randStringMesos(r)) + this.Role = &v450 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedVersionInfo(r randyMesos, easy bool) *VersionInfo { + this := &VersionInfo{} + this.Version = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v451 := string(randStringMesos(r)) + this.BuildDate = &v451 + } + if r.Intn(10) != 0 { + v452 := float64(r.Float64()) + if r.Intn(2) == 0 { + v452 *= -1 + } + this.BuildTime = &v452 + } + if r.Intn(10) != 0 { + v453 := string(randStringMesos(r)) + this.BuildUser = &v453 + } + if r.Intn(10) != 0 { + v454 := string(randStringMesos(r)) + this.GitSHA = &v454 + } + if r.Intn(10) != 0 { + v455 := string(randStringMesos(r)) + this.GitBranch = &v455 + } + if r.Intn(10) != 0 { + v456 := string(randStringMesos(r)) + this.GitTag = &v456 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedFlag(r randyMesos, easy bool) *Flag { + this := &Flag{} + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v457 := string(randStringMesos(r)) + this.Value = &v457 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedRole(r randyMesos, easy bool) *Role { + this := &Role{} + this.Name = string(randStringMesos(r)) + this.Weight = float64(r.Float64()) + if r.Intn(2) == 0 { + this.Weight *= -1 + } + if r.Intn(10) != 0 { + v458 := r.Intn(5) + this.Frameworks = make([]FrameworkID, v458) + for i := 0; i < v458; i++ { + v459 := NewPopulatedFrameworkID(r, easy) + this.Frameworks[i] = *v459 + } + } + if r.Intn(10) != 0 { + v460 := r.Intn(5) + this.Resources = make([]Resource, v460) + for i := 0; i < v460; i++ { + v461 := NewPopulatedResource(r, easy) + this.Resources[i] = *v461 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedMetric(r randyMesos, easy bool) *Metric { + this := &Metric{} + this.Name = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v462 := float64(r.Float64()) + if r.Intn(2) == 0 { + v462 *= -1 + } + this.Value = &v462 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedFileInfo(r randyMesos, easy bool) *FileInfo { + this := &FileInfo{} + this.Path = string(randStringMesos(r)) + if r.Intn(10) != 0 { + v463 := int32(r.Int31()) + if r.Intn(2) == 0 { + v463 *= -1 + } + this.Nlink = &v463 + } + if r.Intn(10) != 0 { + v464 := uint64(uint64(r.Uint32())) + this.Size = &v464 + } + if r.Intn(10) != 0 { + this.Mtime = NewPopulatedTimeInfo(r, easy) + } + if r.Intn(10) != 0 { + v465 := uint32(r.Uint32()) + this.Mode = &v465 + } + if r.Intn(10) != 0 { + v466 := string(randStringMesos(r)) + this.UID = &v466 + } + if r.Intn(10) != 0 { + v467 := string(randStringMesos(r)) + this.GID = &v467 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDevice(r randyMesos, easy bool) *Device { + this := &Device{} + if r.Intn(10) != 0 { + v468 := string(randStringMesos(r)) + this.Path = &v468 + } + if r.Intn(10) != 0 { + this.Number = NewPopulatedDevice_Number(r, easy) + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDevice_Number(r randyMesos, easy bool) *Device_Number { + this := &Device_Number{} + v469 := uint64(uint64(r.Uint32())) + this.MajorNumber = &v469 + v470 := uint64(uint64(r.Uint32())) + this.MinorNumber = &v470 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDeviceAccess(r randyMesos, easy bool) *DeviceAccess { + this := &DeviceAccess{} + v471 := NewPopulatedDevice(r, easy) + this.Device = *v471 + v472 := NewPopulatedDeviceAccess_Access(r, easy) + this.Access = *v472 + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDeviceAccess_Access(r randyMesos, easy bool) *DeviceAccess_Access { + this := &DeviceAccess_Access{} + if r.Intn(10) != 0 { + v473 := bool(bool(r.Intn(2) == 0)) + this.Read = &v473 + } + if r.Intn(10) != 0 { + v474 := bool(bool(r.Intn(2) == 0)) + this.Write = &v474 + } + if r.Intn(10) != 0 { + v475 := bool(bool(r.Intn(2) == 0)) + this.Mknod = &v475 + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +func NewPopulatedDeviceWhitelist(r randyMesos, easy bool) *DeviceWhitelist { + this := &DeviceWhitelist{} + if r.Intn(10) != 0 { + v476 := r.Intn(5) + this.AllowedDevices = make([]DeviceAccess, v476) + for i := 0; i < v476; i++ { + v477 := NewPopulatedDeviceAccess(r, easy) + this.AllowedDevices[i] = *v477 + } + } + if !easy && r.Intn(10) != 0 { + } + return this +} + +type randyMesos interface { + Float32() float32 + Float64() float64 + Int63() int64 + Int31() int32 + Uint32() uint32 + Intn(n int) int +} + +func randUTF8RuneMesos(r randyMesos) rune { + ru := r.Intn(62) + if ru < 10 { + return rune(ru + 48) + } else if ru < 36 { + return rune(ru + 55) + } + return rune(ru + 61) +} +func randStringMesos(r randyMesos) string { + v478 := r.Intn(100) + tmps := make([]rune, v478) + for i := 0; i < v478; i++ { + tmps[i] = randUTF8RuneMesos(r) + } + return string(tmps) +} +func randUnrecognizedMesos(r randyMesos, maxFieldNumber int) (dAtA []byte) { + l := r.Intn(5) + for i := 0; i < l; i++ { + wire := r.Intn(4) + if wire == 3 { + wire = 5 + } + fieldNumber := maxFieldNumber + r.Intn(100) + dAtA = randFieldMesos(dAtA, r, fieldNumber, wire) + } + return dAtA +} +func randFieldMesos(dAtA []byte, r randyMesos, fieldNumber int, wire int) []byte { + key := uint32(fieldNumber)<<3 | uint32(wire) + switch wire { + case 0: + dAtA = encodeVarintPopulateMesos(dAtA, uint64(key)) + v479 := r.Int63() + if r.Intn(2) == 0 { + v479 *= -1 + } + dAtA = encodeVarintPopulateMesos(dAtA, uint64(v479)) + case 1: + dAtA = encodeVarintPopulateMesos(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + case 2: + dAtA = encodeVarintPopulateMesos(dAtA, uint64(key)) + ll := r.Intn(100) + dAtA = encodeVarintPopulateMesos(dAtA, uint64(ll)) + for j := 0; j < ll; j++ { + dAtA = append(dAtA, byte(r.Intn(256))) + } + default: + dAtA = encodeVarintPopulateMesos(dAtA, uint64(key)) + dAtA = append(dAtA, byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256)), byte(r.Intn(256))) + } + return dAtA +} +func encodeVarintPopulateMesos(dAtA []byte, v uint64) []byte { + for v >= 1<<7 { + dAtA = append(dAtA, uint8(uint64(v)&0x7f|0x80)) + v >>= 7 + } + dAtA = append(dAtA, uint8(v)) + return dAtA +} +func (m *FrameworkID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *OfferID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *AgentID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *TaskID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *ExecutorID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *ContainerID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + if m.Parent != nil { + l = m.Parent.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ResourceProviderID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *OperationID) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *TimeInfo) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Nanoseconds)) + return n +} + +func (m *DurationInfo) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Nanoseconds)) + return n +} + +func (m *Address) ProtoSize() (n int) { + var l int + _ = l + if m.Hostname != nil { + l = len(*m.Hostname) + n += 1 + l + sovMesos(uint64(l)) + } + if m.IP != nil { + l = len(*m.IP) + n += 1 + l + sovMesos(uint64(l)) + } + n += 1 + sovMesos(uint64(m.Port)) + return n +} + +func (m *URL) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Scheme) + n += 1 + l + sovMesos(uint64(l)) + l = m.Address.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.Path != nil { + l = len(*m.Path) + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Query) > 0 { + for _, e := range m.Query { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Fragment != nil { + l = len(*m.Fragment) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Unavailability) ProtoSize() (n int) { + var l int + _ = l + l = m.Start.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.Duration != nil { + l = m.Duration.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *MachineID) ProtoSize() (n int) { + var l int + _ = l + if m.Hostname != nil { + l = len(*m.Hostname) + n += 1 + l + sovMesos(uint64(l)) + } + if m.IP != nil { + l = len(*m.IP) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *MachineInfo) ProtoSize() (n int) { + var l int + _ = l + l = m.ID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.Mode != nil { + n += 1 + sovMesos(uint64(*m.Mode)) + } + if m.Unavailability != nil { + l = m.Unavailability.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *FrameworkInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.User) + n += 1 + l + sovMesos(uint64(l)) + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.ID != nil { + l = m.ID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.FailoverTimeout != nil { + n += 9 + } + if m.Checkpoint != nil { + n += 2 + } + if m.Role != nil { + l = len(*m.Role) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Hostname != nil { + l = len(*m.Hostname) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Principal != nil { + l = len(*m.Principal) + n += 1 + l + sovMesos(uint64(l)) + } + if m.WebUiURL != nil { + l = len(*m.WebUiURL) + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Capabilities) > 0 { + for _, e := range m.Capabilities { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Roles) > 0 { + for _, s := range m.Roles { + l = len(s) + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *FrameworkInfo_Capability) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + return n +} + +func (m *CheckInfo) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.HTTP != nil { + l = m.HTTP.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.DelaySeconds != nil { + n += 9 + } + if m.IntervalSeconds != nil { + n += 9 + } + if m.TimeoutSeconds != nil { + n += 9 + } + if m.TCP != nil { + l = m.TCP.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CheckInfo_Command) ProtoSize() (n int) { + var l int + _ = l + l = m.Command.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *CheckInfo_Http) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Port)) + if m.Path != nil { + l = len(*m.Path) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CheckInfo_Tcp) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Port)) + return n +} + +func (m *HealthCheck) ProtoSize() (n int) { + var l int + _ = l + if m.HTTP != nil { + l = m.HTTP.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.DelaySeconds != nil { + n += 9 + } + if m.IntervalSeconds != nil { + n += 9 + } + if m.TimeoutSeconds != nil { + n += 9 + } + if m.ConsecutiveFailures != nil { + n += 1 + sovMesos(uint64(*m.ConsecutiveFailures)) + } + if m.GracePeriodSeconds != nil { + n += 9 + } + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + n += 1 + sovMesos(uint64(m.Type)) + if m.TCP != nil { + l = m.TCP.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *HealthCheck_HTTPCheckInfo) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Port)) + if m.Path != nil { + l = len(*m.Path) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Scheme != nil { + l = len(*m.Scheme) + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Statuses) > 0 { + for _, e := range m.Statuses { + n += 1 + sovMesos(uint64(e)) + } + } + if m.Protocol != nil { + n += 1 + sovMesos(uint64(*m.Protocol)) + } + return n +} + +func (m *HealthCheck_TCPCheckInfo) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Port)) + if m.Protocol != nil { + n += 1 + sovMesos(uint64(*m.Protocol)) + } + return n +} + +func (m *KillPolicy) ProtoSize() (n int) { + var l int + _ = l + if m.GracePeriod != nil { + l = m.GracePeriod.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CommandInfo) ProtoSize() (n int) { + var l int + _ = l + if len(m.URIs) > 0 { + for _, e := range m.URIs { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Environment != nil { + l = m.Environment.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Value != nil { + l = len(*m.Value) + n += 1 + l + sovMesos(uint64(l)) + } + if m.User != nil { + l = len(*m.User) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Shell != nil { + n += 2 + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + l = len(s) + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *CommandInfo_URI) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + if m.Executable != nil { + n += 2 + } + if m.Extract != nil { + n += 2 + } + if m.Cache != nil { + n += 2 + } + if m.OutputFile != nil { + l = len(*m.OutputFile) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ExecutorInfo) ProtoSize() (n int) { + var l int + _ = l + l = m.ExecutorID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.FrameworkID != nil { + l = m.FrameworkID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Source != nil { + l = len(*m.Source) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Container != nil { + l = m.Container.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Discovery != nil { + l = m.Discovery.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ShutdownGracePeriod != nil { + l = m.ShutdownGracePeriod.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + n += 1 + sovMesos(uint64(m.Type)) + return n +} + +func (m *DomainInfo) ProtoSize() (n int) { + var l int + _ = l + if m.FaultDomain != nil { + l = m.FaultDomain.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *DomainInfo_FaultDomain) ProtoSize() (n int) { + var l int + _ = l + l = m.Region.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.Zone.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *DomainInfo_FaultDomain_RegionInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *DomainInfo_FaultDomain_ZoneInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *MasterInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.ID) + n += 1 + l + sovMesos(uint64(l)) + n += 1 + sovMesos(uint64(m.IP)) + if m.Port != nil { + n += 1 + sovMesos(uint64(*m.Port)) + } + if m.PID != nil { + l = len(*m.PID) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Hostname != nil { + l = len(*m.Hostname) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Version != nil { + l = len(*m.Version) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Address != nil { + l = m.Address.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Domain != nil { + l = m.Domain.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Capabilities) > 0 { + for _, e := range m.Capabilities { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *MasterInfo_Capability) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + return n +} + +func (m *AgentInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Hostname) + n += 1 + l + sovMesos(uint64(l)) + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.Attributes) > 0 { + for _, e := range m.Attributes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.ID != nil { + l = m.ID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Port != nil { + n += 1 + sovMesos(uint64(*m.Port)) + } + if m.Domain != nil { + l = m.Domain.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *AgentInfo_Capability) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + return n +} + +func (m *CSIPluginContainerInfo) ProtoSize() (n int) { + var l int + _ = l + if len(m.Services) > 0 { + for _, e := range m.Services { + n += 1 + sovMesos(uint64(e)) + } + } + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Container != nil { + l = m.Container.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CSIPluginInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovMesos(uint64(l)) + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if len(m.Containers) > 0 { + for _, e := range m.Containers { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *ResourceProviderInfo) ProtoSize() (n int) { + var l int + _ = l + if m.ID != nil { + l = m.ID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Attributes) > 0 { + for _, e := range m.Attributes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + l = len(m.Type) + n += 1 + l + sovMesos(uint64(l)) + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if len(m.DefaultReservations) > 0 { + for _, e := range m.DefaultReservations { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Storage != nil { + l = m.Storage.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ResourceProviderInfo_Storage) ProtoSize() (n int) { + var l int + _ = l + l = m.Plugin.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *Value) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + if m.Scalar != nil { + l = m.Scalar.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Ranges != nil { + l = m.Ranges.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Set != nil { + l = m.Set.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Text != nil { + l = m.Text.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Value_Scalar) ProtoSize() (n int) { + var l int + _ = l + n += 9 + return n +} + +func (m *Value_Range) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Begin)) + n += 1 + sovMesos(uint64(m.End)) + return n +} + +func (m *Value_Ranges) ProtoSize() (n int) { + var l int + _ = l + if len(m.Range) > 0 { + for _, e := range m.Range { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Value_Set) ProtoSize() (n int) { + var l int + _ = l + if len(m.Item) > 0 { + for _, s := range m.Item { + l = len(s) + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Value_Text) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *Attribute) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + n += 1 + sovMesos(uint64(m.Type)) + if m.Scalar != nil { + l = m.Scalar.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Ranges != nil { + l = m.Ranges.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Text != nil { + l = m.Text.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Set != nil { + l = m.Set.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Resource) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.Type != nil { + n += 1 + sovMesos(uint64(*m.Type)) + } + if m.Scalar != nil { + l = m.Scalar.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Ranges != nil { + l = m.Ranges.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Set != nil { + l = m.Set.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Role != nil { + l = len(*m.Role) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Disk != nil { + l = m.Disk.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Reservation != nil { + l = m.Reservation.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Revocable != nil { + l = m.Revocable.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Shared != nil { + l = m.Shared.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.AllocationInfo != nil { + l = m.AllocationInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ProviderID != nil { + l = m.ProviderID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Reservations) > 0 { + for _, e := range m.Reservations { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Resource_AllocationInfo) ProtoSize() (n int) { + var l int + _ = l + if m.Role != nil { + l = len(*m.Role) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Resource_ReservationInfo) ProtoSize() (n int) { + var l int + _ = l + if m.Principal != nil { + l = len(*m.Principal) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Role != nil { + l = len(*m.Role) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Type != nil { + n += 1 + sovMesos(uint64(*m.Type)) + } + return n +} + +func (m *Resource_DiskInfo) ProtoSize() (n int) { + var l int + _ = l + if m.Persistence != nil { + l = m.Persistence.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Volume != nil { + l = m.Volume.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Source != nil { + l = m.Source.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Resource_DiskInfo_Persistence) ProtoSize() (n int) { + var l int + _ = l + l = len(m.ID) + n += 1 + l + sovMesos(uint64(l)) + if m.Principal != nil { + l = len(*m.Principal) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Resource_DiskInfo_Source) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + if m.Path != nil { + l = m.Path.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Mount != nil { + l = m.Mount.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ID != nil { + l = len(*m.ID) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Metadata != nil { + l = m.Metadata.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Profile != nil { + l = len(*m.Profile) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Resource_DiskInfo_Source_Path) ProtoSize() (n int) { + var l int + _ = l + if m.Root != nil { + l = len(*m.Root) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Resource_DiskInfo_Source_Mount) ProtoSize() (n int) { + var l int + _ = l + if m.Root != nil { + l = len(*m.Root) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Resource_RevocableInfo) ProtoSize() (n int) { + var l int + _ = l + return n +} + +func (m *Resource_SharedInfo) ProtoSize() (n int) { + var l int + _ = l + return n +} + +func (m *TrafficControlStatistics) ProtoSize() (n int) { + var l int + _ = l + l = len(m.ID) + n += 1 + l + sovMesos(uint64(l)) + if m.Backlog != nil { + n += 1 + sovMesos(uint64(*m.Backlog)) + } + if m.Bytes != nil { + n += 1 + sovMesos(uint64(*m.Bytes)) + } + if m.Drops != nil { + n += 1 + sovMesos(uint64(*m.Drops)) + } + if m.Overlimits != nil { + n += 1 + sovMesos(uint64(*m.Overlimits)) + } + if m.Packets != nil { + n += 1 + sovMesos(uint64(*m.Packets)) + } + if m.Qlen != nil { + n += 1 + sovMesos(uint64(*m.Qlen)) + } + if m.RateBPS != nil { + n += 1 + sovMesos(uint64(*m.RateBPS)) + } + if m.RatePPS != nil { + n += 1 + sovMesos(uint64(*m.RatePPS)) + } + if m.Requeues != nil { + n += 1 + sovMesos(uint64(*m.Requeues)) + } + return n +} + +func (m *IpStatistics) ProtoSize() (n int) { + var l int + _ = l + if m.Forwarding != nil { + n += 1 + sovMesos(uint64(*m.Forwarding)) + } + if m.DefaultTTL != nil { + n += 1 + sovMesos(uint64(*m.DefaultTTL)) + } + if m.InReceives != nil { + n += 1 + sovMesos(uint64(*m.InReceives)) + } + if m.InHdrErrors != nil { + n += 1 + sovMesos(uint64(*m.InHdrErrors)) + } + if m.InAddrErrors != nil { + n += 1 + sovMesos(uint64(*m.InAddrErrors)) + } + if m.ForwDatagrams != nil { + n += 1 + sovMesos(uint64(*m.ForwDatagrams)) + } + if m.InUnknownProtos != nil { + n += 1 + sovMesos(uint64(*m.InUnknownProtos)) + } + if m.InDiscards != nil { + n += 1 + sovMesos(uint64(*m.InDiscards)) + } + if m.InDelivers != nil { + n += 1 + sovMesos(uint64(*m.InDelivers)) + } + if m.OutRequests != nil { + n += 1 + sovMesos(uint64(*m.OutRequests)) + } + if m.OutDiscards != nil { + n += 1 + sovMesos(uint64(*m.OutDiscards)) + } + if m.OutNoRoutes != nil { + n += 1 + sovMesos(uint64(*m.OutNoRoutes)) + } + if m.ReasmTimeout != nil { + n += 1 + sovMesos(uint64(*m.ReasmTimeout)) + } + if m.ReasmReqds != nil { + n += 1 + sovMesos(uint64(*m.ReasmReqds)) + } + if m.ReasmOKs != nil { + n += 1 + sovMesos(uint64(*m.ReasmOKs)) + } + if m.ReasmFails != nil { + n += 2 + sovMesos(uint64(*m.ReasmFails)) + } + if m.FragOKs != nil { + n += 2 + sovMesos(uint64(*m.FragOKs)) + } + if m.FragFails != nil { + n += 2 + sovMesos(uint64(*m.FragFails)) + } + if m.FragCreates != nil { + n += 2 + sovMesos(uint64(*m.FragCreates)) + } + return n +} + +func (m *IcmpStatistics) ProtoSize() (n int) { + var l int + _ = l + if m.InMsgs != nil { + n += 1 + sovMesos(uint64(*m.InMsgs)) + } + if m.InErrors != nil { + n += 1 + sovMesos(uint64(*m.InErrors)) + } + if m.InCsumErrors != nil { + n += 1 + sovMesos(uint64(*m.InCsumErrors)) + } + if m.InDestUnreachs != nil { + n += 1 + sovMesos(uint64(*m.InDestUnreachs)) + } + if m.InTimeExcds != nil { + n += 1 + sovMesos(uint64(*m.InTimeExcds)) + } + if m.InParmProbs != nil { + n += 1 + sovMesos(uint64(*m.InParmProbs)) + } + if m.InSrcQuenchs != nil { + n += 1 + sovMesos(uint64(*m.InSrcQuenchs)) + } + if m.InRedirects != nil { + n += 1 + sovMesos(uint64(*m.InRedirects)) + } + if m.InEchos != nil { + n += 1 + sovMesos(uint64(*m.InEchos)) + } + if m.InEchoReps != nil { + n += 1 + sovMesos(uint64(*m.InEchoReps)) + } + if m.InTimestamps != nil { + n += 1 + sovMesos(uint64(*m.InTimestamps)) + } + if m.InTimestampReps != nil { + n += 1 + sovMesos(uint64(*m.InTimestampReps)) + } + if m.InAddrMasks != nil { + n += 1 + sovMesos(uint64(*m.InAddrMasks)) + } + if m.InAddrMaskReps != nil { + n += 1 + sovMesos(uint64(*m.InAddrMaskReps)) + } + if m.OutMsgs != nil { + n += 1 + sovMesos(uint64(*m.OutMsgs)) + } + if m.OutErrors != nil { + n += 2 + sovMesos(uint64(*m.OutErrors)) + } + if m.OutDestUnreachs != nil { + n += 2 + sovMesos(uint64(*m.OutDestUnreachs)) + } + if m.OutTimeExcds != nil { + n += 2 + sovMesos(uint64(*m.OutTimeExcds)) + } + if m.OutParmProbs != nil { + n += 2 + sovMesos(uint64(*m.OutParmProbs)) + } + if m.OutSrcQuenchs != nil { + n += 2 + sovMesos(uint64(*m.OutSrcQuenchs)) + } + if m.OutRedirects != nil { + n += 2 + sovMesos(uint64(*m.OutRedirects)) + } + if m.OutEchos != nil { + n += 2 + sovMesos(uint64(*m.OutEchos)) + } + if m.OutEchoReps != nil { + n += 2 + sovMesos(uint64(*m.OutEchoReps)) + } + if m.OutTimestamps != nil { + n += 2 + sovMesos(uint64(*m.OutTimestamps)) + } + if m.OutTimestampReps != nil { + n += 2 + sovMesos(uint64(*m.OutTimestampReps)) + } + if m.OutAddrMasks != nil { + n += 2 + sovMesos(uint64(*m.OutAddrMasks)) + } + if m.OutAddrMaskReps != nil { + n += 2 + sovMesos(uint64(*m.OutAddrMaskReps)) + } + return n +} + +func (m *TcpStatistics) ProtoSize() (n int) { + var l int + _ = l + if m.RtoAlgorithm != nil { + n += 1 + sovMesos(uint64(*m.RtoAlgorithm)) + } + if m.RtoMin != nil { + n += 1 + sovMesos(uint64(*m.RtoMin)) + } + if m.RtoMax != nil { + n += 1 + sovMesos(uint64(*m.RtoMax)) + } + if m.MaxConn != nil { + n += 1 + sovMesos(uint64(*m.MaxConn)) + } + if m.ActiveOpens != nil { + n += 1 + sovMesos(uint64(*m.ActiveOpens)) + } + if m.PassiveOpens != nil { + n += 1 + sovMesos(uint64(*m.PassiveOpens)) + } + if m.AttemptFails != nil { + n += 1 + sovMesos(uint64(*m.AttemptFails)) + } + if m.EstabResets != nil { + n += 1 + sovMesos(uint64(*m.EstabResets)) + } + if m.CurrEstab != nil { + n += 1 + sovMesos(uint64(*m.CurrEstab)) + } + if m.InSegs != nil { + n += 1 + sovMesos(uint64(*m.InSegs)) + } + if m.OutSegs != nil { + n += 1 + sovMesos(uint64(*m.OutSegs)) + } + if m.RetransSegs != nil { + n += 1 + sovMesos(uint64(*m.RetransSegs)) + } + if m.InErrs != nil { + n += 1 + sovMesos(uint64(*m.InErrs)) + } + if m.OutRsts != nil { + n += 1 + sovMesos(uint64(*m.OutRsts)) + } + if m.InCsumErrors != nil { + n += 1 + sovMesos(uint64(*m.InCsumErrors)) + } + return n +} + +func (m *UdpStatistics) ProtoSize() (n int) { + var l int + _ = l + if m.InDatagrams != nil { + n += 1 + sovMesos(uint64(*m.InDatagrams)) + } + if m.NoPorts != nil { + n += 1 + sovMesos(uint64(*m.NoPorts)) + } + if m.InErrors != nil { + n += 1 + sovMesos(uint64(*m.InErrors)) + } + if m.OutDatagrams != nil { + n += 1 + sovMesos(uint64(*m.OutDatagrams)) + } + if m.RcvbufErrors != nil { + n += 1 + sovMesos(uint64(*m.RcvbufErrors)) + } + if m.SndbufErrors != nil { + n += 1 + sovMesos(uint64(*m.SndbufErrors)) + } + if m.InCsumErrors != nil { + n += 1 + sovMesos(uint64(*m.InCsumErrors)) + } + if m.IgnoredMulti != nil { + n += 1 + sovMesos(uint64(*m.IgnoredMulti)) + } + return n +} + +func (m *SNMPStatistics) ProtoSize() (n int) { + var l int + _ = l + if m.IPStats != nil { + l = m.IPStats.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ICMPStats != nil { + l = m.ICMPStats.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.TCPStats != nil { + l = m.TCPStats.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.UDPStats != nil { + l = m.UDPStats.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *DiskStatistics) ProtoSize() (n int) { + var l int + _ = l + if m.Source != nil { + l = m.Source.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Persistence != nil { + l = m.Persistence.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.LimitBytes != nil { + n += 1 + sovMesos(uint64(*m.LimitBytes)) + } + if m.UsedBytes != nil { + n += 1 + sovMesos(uint64(*m.UsedBytes)) + } + return n +} + +func (m *ResourceStatistics) ProtoSize() (n int) { + var l int + _ = l + n += 9 + if m.CPUsUserTimeSecs != nil { + n += 9 + } + if m.CPUsSystemTimeSecs != nil { + n += 9 + } + if m.CPUsLimit != nil { + n += 9 + } + if m.MemRSSBytes != nil { + n += 1 + sovMesos(uint64(*m.MemRSSBytes)) + } + if m.MemLimitBytes != nil { + n += 1 + sovMesos(uint64(*m.MemLimitBytes)) + } + if m.CPUsNrPeriods != nil { + n += 1 + sovMesos(uint64(*m.CPUsNrPeriods)) + } + if m.CPUsNrThrottled != nil { + n += 1 + sovMesos(uint64(*m.CPUsNrThrottled)) + } + if m.CPUsThrottledTimeSecs != nil { + n += 9 + } + if m.MemFileBytes != nil { + n += 1 + sovMesos(uint64(*m.MemFileBytes)) + } + if m.MemAnonBytes != nil { + n += 1 + sovMesos(uint64(*m.MemAnonBytes)) + } + if m.MemMappedFileBytes != nil { + n += 1 + sovMesos(uint64(*m.MemMappedFileBytes)) + } + if m.Perf != nil { + l = m.Perf.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.NetRxPackets != nil { + n += 1 + sovMesos(uint64(*m.NetRxPackets)) + } + if m.NetRxBytes != nil { + n += 1 + sovMesos(uint64(*m.NetRxBytes)) + } + if m.NetRxErrors != nil { + n += 2 + sovMesos(uint64(*m.NetRxErrors)) + } + if m.NetRxDropped != nil { + n += 2 + sovMesos(uint64(*m.NetRxDropped)) + } + if m.NetTxPackets != nil { + n += 2 + sovMesos(uint64(*m.NetTxPackets)) + } + if m.NetTxBytes != nil { + n += 2 + sovMesos(uint64(*m.NetTxBytes)) + } + if m.NetTxErrors != nil { + n += 2 + sovMesos(uint64(*m.NetTxErrors)) + } + if m.NetTxDropped != nil { + n += 2 + sovMesos(uint64(*m.NetTxDropped)) + } + if m.NetTCPRttMicrosecsP50 != nil { + n += 10 + } + if m.NetTCPRttMicrosecsP90 != nil { + n += 10 + } + if m.NetTCPRttMicrosecsP95 != nil { + n += 10 + } + if m.NetTCPRttMicrosecsP99 != nil { + n += 10 + } + if m.DiskLimitBytes != nil { + n += 2 + sovMesos(uint64(*m.DiskLimitBytes)) + } + if m.DiskUsedBytes != nil { + n += 2 + sovMesos(uint64(*m.DiskUsedBytes)) + } + if m.NetTCPActiveConnections != nil { + n += 10 + } + if m.NetTCPTimeWaitConnections != nil { + n += 10 + } + if m.Processes != nil { + n += 2 + sovMesos(uint64(*m.Processes)) + } + if m.Threads != nil { + n += 2 + sovMesos(uint64(*m.Threads)) + } + if m.MemLowPressureCounter != nil { + n += 2 + sovMesos(uint64(*m.MemLowPressureCounter)) + } + if m.MemMediumPressureCounter != nil { + n += 2 + sovMesos(uint64(*m.MemMediumPressureCounter)) + } + if m.MemCriticalPressureCounter != nil { + n += 2 + sovMesos(uint64(*m.MemCriticalPressureCounter)) + } + if len(m.NetTrafficControlStatistics) > 0 { + for _, e := range m.NetTrafficControlStatistics { + l = e.ProtoSize() + n += 2 + l + sovMesos(uint64(l)) + } + } + if m.MemTotalBytes != nil { + n += 2 + sovMesos(uint64(*m.MemTotalBytes)) + } + if m.MemTotalMemswBytes != nil { + n += 2 + sovMesos(uint64(*m.MemTotalMemswBytes)) + } + if m.MemSoftLimitBytes != nil { + n += 2 + sovMesos(uint64(*m.MemSoftLimitBytes)) + } + if m.MemCacheBytes != nil { + n += 2 + sovMesos(uint64(*m.MemCacheBytes)) + } + if m.MemSwapBytes != nil { + n += 2 + sovMesos(uint64(*m.MemSwapBytes)) + } + if m.MemUnevictableBytes != nil { + n += 2 + sovMesos(uint64(*m.MemUnevictableBytes)) + } + if m.NetSNMPStatistics != nil { + l = m.NetSNMPStatistics.ProtoSize() + n += 2 + l + sovMesos(uint64(l)) + } + if len(m.DiskStatistics) > 0 { + for _, e := range m.DiskStatistics { + l = e.ProtoSize() + n += 2 + l + sovMesos(uint64(l)) + } + } + if m.BlkioStatistics != nil { + l = m.BlkioStatistics.ProtoSize() + n += 2 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ResourceUsage) ProtoSize() (n int) { + var l int + _ = l + if len(m.Executors) > 0 { + for _, e := range m.Executors { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.Total) > 0 { + for _, e := range m.Total { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *ResourceUsage_Executor) ProtoSize() (n int) { + var l int + _ = l + l = m.ExecutorInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if len(m.Allocated) > 0 { + for _, e := range m.Allocated { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Statistics != nil { + l = m.Statistics.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + l = m.ContainerID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if len(m.Tasks) > 0 { + for _, e := range m.Tasks { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *ResourceUsage_Executor_Task) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + l = m.ID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *PerfStatistics) ProtoSize() (n int) { + var l int + _ = l + n += 9 + n += 9 + if m.Cycles != nil { + n += 1 + sovMesos(uint64(*m.Cycles)) + } + if m.StalledCyclesFrontend != nil { + n += 1 + sovMesos(uint64(*m.StalledCyclesFrontend)) + } + if m.StalledCyclesBackend != nil { + n += 1 + sovMesos(uint64(*m.StalledCyclesBackend)) + } + if m.Instructions != nil { + n += 1 + sovMesos(uint64(*m.Instructions)) + } + if m.CacheReferences != nil { + n += 1 + sovMesos(uint64(*m.CacheReferences)) + } + if m.CacheMisses != nil { + n += 1 + sovMesos(uint64(*m.CacheMisses)) + } + if m.Branches != nil { + n += 1 + sovMesos(uint64(*m.Branches)) + } + if m.BranchMisses != nil { + n += 1 + sovMesos(uint64(*m.BranchMisses)) + } + if m.BusCycles != nil { + n += 1 + sovMesos(uint64(*m.BusCycles)) + } + if m.RefCycles != nil { + n += 1 + sovMesos(uint64(*m.RefCycles)) + } + if m.CPUClock != nil { + n += 9 + } + if m.TaskClock != nil { + n += 9 + } + if m.PageFaults != nil { + n += 1 + sovMesos(uint64(*m.PageFaults)) + } + if m.MinorFaults != nil { + n += 2 + sovMesos(uint64(*m.MinorFaults)) + } + if m.MajorFaults != nil { + n += 2 + sovMesos(uint64(*m.MajorFaults)) + } + if m.ContextSwitches != nil { + n += 2 + sovMesos(uint64(*m.ContextSwitches)) + } + if m.CPUMigrations != nil { + n += 2 + sovMesos(uint64(*m.CPUMigrations)) + } + if m.AlignmentFaults != nil { + n += 2 + sovMesos(uint64(*m.AlignmentFaults)) + } + if m.EmulationFaults != nil { + n += 2 + sovMesos(uint64(*m.EmulationFaults)) + } + if m.L1DcacheLoads != nil { + n += 2 + sovMesos(uint64(*m.L1DcacheLoads)) + } + if m.L1DcacheLoadMisses != nil { + n += 2 + sovMesos(uint64(*m.L1DcacheLoadMisses)) + } + if m.L1DcacheStores != nil { + n += 2 + sovMesos(uint64(*m.L1DcacheStores)) + } + if m.L1DcacheStoreMisses != nil { + n += 2 + sovMesos(uint64(*m.L1DcacheStoreMisses)) + } + if m.L1DcachePrefetches != nil { + n += 2 + sovMesos(uint64(*m.L1DcachePrefetches)) + } + if m.L1DcachePrefetchMisses != nil { + n += 2 + sovMesos(uint64(*m.L1DcachePrefetchMisses)) + } + if m.L1IcacheLoads != nil { + n += 2 + sovMesos(uint64(*m.L1IcacheLoads)) + } + if m.L1IcacheLoadMisses != nil { + n += 2 + sovMesos(uint64(*m.L1IcacheLoadMisses)) + } + if m.L1IcachePrefetches != nil { + n += 2 + sovMesos(uint64(*m.L1IcachePrefetches)) + } + if m.L1IcachePrefetchMisses != nil { + n += 2 + sovMesos(uint64(*m.L1IcachePrefetchMisses)) + } + if m.LLCLoads != nil { + n += 2 + sovMesos(uint64(*m.LLCLoads)) + } + if m.LLCLoadMisses != nil { + n += 2 + sovMesos(uint64(*m.LLCLoadMisses)) + } + if m.LLCStores != nil { + n += 2 + sovMesos(uint64(*m.LLCStores)) + } + if m.LLCStoreMisses != nil { + n += 2 + sovMesos(uint64(*m.LLCStoreMisses)) + } + if m.LLCPrefetches != nil { + n += 2 + sovMesos(uint64(*m.LLCPrefetches)) + } + if m.LLCPrefetchMisses != nil { + n += 2 + sovMesos(uint64(*m.LLCPrefetchMisses)) + } + if m.DTLBLoads != nil { + n += 2 + sovMesos(uint64(*m.DTLBLoads)) + } + if m.DTLBLoadMisses != nil { + n += 2 + sovMesos(uint64(*m.DTLBLoadMisses)) + } + if m.DTLBStores != nil { + n += 2 + sovMesos(uint64(*m.DTLBStores)) + } + if m.DTLBStoreMisses != nil { + n += 2 + sovMesos(uint64(*m.DTLBStoreMisses)) + } + if m.DTLBPrefetches != nil { + n += 2 + sovMesos(uint64(*m.DTLBPrefetches)) + } + if m.DTLBPrefetchMisses != nil { + n += 2 + sovMesos(uint64(*m.DTLBPrefetchMisses)) + } + if m.ITLBLoads != nil { + n += 2 + sovMesos(uint64(*m.ITLBLoads)) + } + if m.ITLBLoadMisses != nil { + n += 2 + sovMesos(uint64(*m.ITLBLoadMisses)) + } + if m.BranchLoads != nil { + n += 2 + sovMesos(uint64(*m.BranchLoads)) + } + if m.BranchLoadMisses != nil { + n += 2 + sovMesos(uint64(*m.BranchLoadMisses)) + } + if m.NodeLoads != nil { + n += 2 + sovMesos(uint64(*m.NodeLoads)) + } + if m.NodeLoadMisses != nil { + n += 2 + sovMesos(uint64(*m.NodeLoadMisses)) + } + if m.NodeStores != nil { + n += 2 + sovMesos(uint64(*m.NodeStores)) + } + if m.NodeStoreMisses != nil { + n += 2 + sovMesos(uint64(*m.NodeStoreMisses)) + } + if m.NodePrefetches != nil { + n += 2 + sovMesos(uint64(*m.NodePrefetches)) + } + if m.NodePrefetchMisses != nil { + n += 2 + sovMesos(uint64(*m.NodePrefetchMisses)) + } + return n +} + +func (m *Request) ProtoSize() (n int) { + var l int + _ = l + if m.AgentID != nil { + l = m.AgentID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Offer) ProtoSize() (n int) { + var l int + _ = l + l = m.ID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.FrameworkID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.AgentID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = len(m.Hostname) + n += 1 + l + sovMesos(uint64(l)) + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.ExecutorIDs) > 0 { + for _, e := range m.ExecutorIDs { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.Attributes) > 0 { + for _, e := range m.Attributes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.URL != nil { + l = m.URL.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Unavailability != nil { + l = m.Unavailability.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.AllocationInfo != nil { + l = m.AllocationInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Domain != nil { + l = m.Domain.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Offer_Operation) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + if m.Launch != nil { + l = m.Launch.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Reserve != nil { + l = m.Reserve.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Unreserve != nil { + l = m.Unreserve.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Create != nil { + l = m.Create.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Destroy != nil { + l = m.Destroy.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.LaunchGroup != nil { + l = m.LaunchGroup.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ID != nil { + l = m.ID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.GrowVolume != nil { + l = m.GrowVolume.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ShrinkVolume != nil { + l = m.ShrinkVolume.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.CreateDisk != nil { + l = m.CreateDisk.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.DestroyDisk != nil { + l = m.DestroyDisk.ProtoSize() + n += 2 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Offer_Operation_Launch) ProtoSize() (n int) { + var l int + _ = l + if len(m.TaskInfos) > 0 { + for _, e := range m.TaskInfos { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Offer_Operation_LaunchGroup) ProtoSize() (n int) { + var l int + _ = l + l = m.Executor.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.TaskGroup.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *Offer_Operation_Reserve) ProtoSize() (n int) { + var l int + _ = l + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Offer_Operation_Unreserve) ProtoSize() (n int) { + var l int + _ = l + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Offer_Operation_Create) ProtoSize() (n int) { + var l int + _ = l + if len(m.Volumes) > 0 { + for _, e := range m.Volumes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Offer_Operation_Destroy) ProtoSize() (n int) { + var l int + _ = l + if len(m.Volumes) > 0 { + for _, e := range m.Volumes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Offer_Operation_GrowVolume) ProtoSize() (n int) { + var l int + _ = l + l = m.Volume.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.Addition.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *Offer_Operation_ShrinkVolume) ProtoSize() (n int) { + var l int + _ = l + l = m.Volume.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.Subtract.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *Offer_Operation_CreateDisk) ProtoSize() (n int) { + var l int + _ = l + l = m.Source.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + n += 1 + sovMesos(uint64(m.TargetType)) + return n +} + +func (m *Offer_Operation_DestroyDisk) ProtoSize() (n int) { + var l int + _ = l + l = m.Source.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *InverseOffer) ProtoSize() (n int) { + var l int + _ = l + l = m.OfferID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.URL != nil { + l = m.URL.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + l = m.FrameworkID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.AgentID != nil { + l = m.AgentID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + l = m.Unavailability.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *TaskInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + l = m.TaskID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.AgentID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Executor != nil { + l = m.Executor.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.HealthCheck != nil { + l = m.HealthCheck.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Container != nil { + l = m.Container.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Discovery != nil { + l = m.Discovery.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.KillPolicy != nil { + l = m.KillPolicy.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Check != nil { + l = m.Check.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.MaxCompletionTime != nil { + l = m.MaxCompletionTime.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *TaskGroupInfo) ProtoSize() (n int) { + var l int + _ = l + if len(m.Tasks) > 0 { + for _, e := range m.Tasks { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Task) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + l = m.TaskID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.FrameworkID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.ExecutorID != nil { + l = m.ExecutorID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + l = m.AgentID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.State != nil { + n += 1 + sovMesos(uint64(*m.State)) + } + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.Statuses) > 0 { + for _, e := range m.Statuses { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.StatusUpdateState != nil { + n += 1 + sovMesos(uint64(*m.StatusUpdateState)) + } + if m.StatusUpdateUUID != nil { + l = len(m.StatusUpdateUUID) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Discovery != nil { + l = m.Discovery.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Container != nil { + l = m.Container.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.User != nil { + l = len(*m.User) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *TaskResourceLimitation) ProtoSize() (n int) { + var l int + _ = l + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *UUID) ProtoSize() (n int) { + var l int + _ = l + if m.Value != nil { + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Operation) ProtoSize() (n int) { + var l int + _ = l + if m.FrameworkID != nil { + l = m.FrameworkID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.AgentID != nil { + l = m.AgentID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + l = m.Info.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.LatestStatus.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if len(m.Statuses) > 0 { + for _, e := range m.Statuses { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + l = m.UUID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *OperationStatus) ProtoSize() (n int) { + var l int + _ = l + if m.OperationID != nil { + l = m.OperationID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + n += 1 + sovMesos(uint64(m.State)) + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.ConvertedResources) > 0 { + for _, e := range m.ConvertedResources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.UUID != nil { + l = m.UUID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CheckStatusInfo) ProtoSize() (n int) { + var l int + _ = l + if m.Type != nil { + n += 1 + sovMesos(uint64(*m.Type)) + } + if m.Command != nil { + l = m.Command.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.HTTP != nil { + l = m.HTTP.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.TCP != nil { + l = m.TCP.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CheckStatusInfo_Command) ProtoSize() (n int) { + var l int + _ = l + if m.ExitCode != nil { + n += 1 + sovMesos(uint64(*m.ExitCode)) + } + return n +} + +func (m *CheckStatusInfo_Http) ProtoSize() (n int) { + var l int + _ = l + if m.StatusCode != nil { + n += 1 + sovMesos(uint64(*m.StatusCode)) + } + return n +} + +func (m *CheckStatusInfo_Tcp) ProtoSize() (n int) { + var l int + _ = l + if m.Succeeded != nil { + n += 2 + } + return n +} + +func (m *TaskStatus) ProtoSize() (n int) { + var l int + _ = l + l = m.TaskID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + if m.State != nil { + n += 1 + sovMesos(uint64(*m.State)) + } + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Message != nil { + l = len(*m.Message) + n += 1 + l + sovMesos(uint64(l)) + } + if m.AgentID != nil { + l = m.AgentID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Timestamp != nil { + n += 9 + } + if m.ExecutorID != nil { + l = m.ExecutorID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Healthy != nil { + n += 2 + } + if m.Source != nil { + n += 1 + sovMesos(uint64(*m.Source)) + } + if m.Reason != nil { + n += 1 + sovMesos(uint64(*m.Reason)) + } + if m.UUID != nil { + l = len(m.UUID) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ContainerStatus != nil { + l = m.ContainerStatus.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.UnreachableTime != nil { + l = m.UnreachableTime.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.CheckStatus != nil { + l = m.CheckStatus.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Limitation != nil { + l = m.Limitation.ProtoSize() + n += 2 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Filters) ProtoSize() (n int) { + var l int + _ = l + if m.RefuseSeconds != nil { + n += 9 + } + return n +} + +func (m *Environment) ProtoSize() (n int) { + var l int + _ = l + if len(m.Variables) > 0 { + for _, e := range m.Variables { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Environment_Variable) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.Value != nil { + l = len(*m.Value) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Type != nil { + n += 1 + sovMesos(uint64(*m.Type)) + } + if m.Secret != nil { + l = m.Secret.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Parameter) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovMesos(uint64(l)) + l = len(m.Value) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *Parameters) ProtoSize() (n int) { + var l int + _ = l + if len(m.Parameter) > 0 { + for _, e := range m.Parameter { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Credential) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Principal) + n += 1 + l + sovMesos(uint64(l)) + if m.Secret != nil { + l = len(*m.Secret) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Credentials) ProtoSize() (n int) { + var l int + _ = l + if len(m.Credentials) > 0 { + for _, e := range m.Credentials { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Secret) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + if m.Reference != nil { + l = m.Reference.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Value != nil { + l = m.Value.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Secret_Reference) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.Key != nil { + l = len(*m.Key) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Secret_Value) ProtoSize() (n int) { + var l int + _ = l + if m.Data != nil { + l = len(m.Data) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *RateLimit) ProtoSize() (n int) { + var l int + _ = l + if m.QPS != nil { + n += 9 + } + l = len(m.Principal) + n += 1 + l + sovMesos(uint64(l)) + if m.Capacity != nil { + n += 1 + sovMesos(uint64(*m.Capacity)) + } + return n +} + +func (m *RateLimits) ProtoSize() (n int) { + var l int + _ = l + if len(m.Limits) > 0 { + for _, e := range m.Limits { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.AggregateDefaultQPS != nil { + n += 9 + } + if m.AggregateDefaultCapacity != nil { + n += 1 + sovMesos(uint64(*m.AggregateDefaultCapacity)) + } + return n +} + +func (m *Image) ProtoSize() (n int) { + var l int + _ = l + if m.Type != nil { + n += 1 + sovMesos(uint64(*m.Type)) + } + if m.Appc != nil { + l = m.Appc.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Docker != nil { + l = m.Docker.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Cached != nil { + n += 2 + } + return n +} + +func (m *Image_Appc) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.ID != nil { + l = len(*m.ID) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Image_Docker) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.Credential != nil { + l = m.Credential.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Config != nil { + l = m.Config.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *MountPropagation) ProtoSize() (n int) { + var l int + _ = l + if m.Mode != nil { + n += 1 + sovMesos(uint64(*m.Mode)) + } + return n +} + +func (m *Volume) ProtoSize() (n int) { + var l int + _ = l + l = len(m.ContainerPath) + n += 1 + l + sovMesos(uint64(l)) + if m.HostPath != nil { + l = len(*m.HostPath) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Mode != nil { + n += 1 + sovMesos(uint64(*m.Mode)) + } + if m.Image != nil { + l = m.Image.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Source != nil { + l = m.Source.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Volume_Source) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + if m.DockerVolume != nil { + l = m.DockerVolume.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.SandboxPath != nil { + l = m.SandboxPath.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Secret != nil { + l = m.Secret.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.HostPath != nil { + l = m.HostPath.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Volume_Source_DockerVolume) ProtoSize() (n int) { + var l int + _ = l + if m.Driver != nil { + l = len(*m.Driver) + n += 1 + l + sovMesos(uint64(l)) + } + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.DriverOptions != nil { + l = m.DriverOptions.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Volume_Source_HostPath) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Path) + n += 1 + l + sovMesos(uint64(l)) + if m.MountPropagation != nil { + l = m.MountPropagation.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Volume_Source_SandboxPath) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + l = len(m.Path) + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *NetworkInfo) ProtoSize() (n int) { + var l int + _ = l + if len(m.Groups) > 0 { + for _, s := range m.Groups { + l = len(s) + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.IPAddresses) > 0 { + for _, e := range m.IPAddresses { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.PortMappings) > 0 { + for _, e := range m.PortMappings { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *NetworkInfo_IPAddress) ProtoSize() (n int) { + var l int + _ = l + if m.Protocol != nil { + n += 1 + sovMesos(uint64(*m.Protocol)) + } + if m.IPAddress != nil { + l = len(*m.IPAddress) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *NetworkInfo_PortMapping) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.HostPort)) + n += 1 + sovMesos(uint64(m.ContainerPort)) + if m.Protocol != nil { + l = len(*m.Protocol) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CapabilityInfo) ProtoSize() (n int) { + var l int + _ = l + if len(m.Capabilities) > 0 { + for _, e := range m.Capabilities { + n += 1 + sovMesos(uint64(e)) + } + } + return n +} + +func (m *LinuxInfo) ProtoSize() (n int) { + var l int + _ = l + if m.CapabilityInfo != nil { + l = m.CapabilityInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.BoundingCapabilities != nil { + l = m.BoundingCapabilities.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.EffectiveCapabilities != nil { + l = m.EffectiveCapabilities.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.SharePIDNamespace != nil { + n += 2 + } + return n +} + +func (m *RLimitInfo) ProtoSize() (n int) { + var l int + _ = l + if len(m.Rlimits) > 0 { + for _, e := range m.Rlimits { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *RLimitInfo_RLimit) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Type)) + if m.Hard != nil { + n += 1 + sovMesos(uint64(*m.Hard)) + } + if m.Soft != nil { + n += 1 + sovMesos(uint64(*m.Soft)) + } + return n +} + +func (m *TTYInfo) ProtoSize() (n int) { + var l int + _ = l + if m.WindowSize != nil { + l = m.WindowSize.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *TTYInfo_WindowSize) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Rows)) + n += 1 + sovMesos(uint64(m.Columns)) + return n +} + +func (m *ContainerInfo) ProtoSize() (n int) { + var l int + _ = l + if m.Type != nil { + n += 1 + sovMesos(uint64(*m.Type)) + } + if len(m.Volumes) > 0 { + for _, e := range m.Volumes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Docker != nil { + l = m.Docker.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Hostname != nil { + l = len(*m.Hostname) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Mesos != nil { + l = m.Mesos.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.NetworkInfos) > 0 { + for _, e := range m.NetworkInfos { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.LinuxInfo != nil { + l = m.LinuxInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.RlimitInfo != nil { + l = m.RlimitInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.TTYInfo != nil { + l = m.TTYInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ContainerInfo_DockerInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Image) + n += 1 + l + sovMesos(uint64(l)) + if m.Network != nil { + n += 1 + sovMesos(uint64(*m.Network)) + } + if len(m.PortMappings) > 0 { + for _, e := range m.PortMappings { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.Privileged != nil { + n += 2 + } + if len(m.Parameters) > 0 { + for _, e := range m.Parameters { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.ForcePullImage != nil { + n += 2 + } + if m.VolumeDriver != nil { + l = len(*m.VolumeDriver) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ContainerInfo_DockerInfo_PortMapping) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.HostPort)) + n += 1 + sovMesos(uint64(m.ContainerPort)) + if m.Protocol != nil { + l = len(*m.Protocol) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ContainerInfo_MesosInfo) ProtoSize() (n int) { + var l int + _ = l + if m.Image != nil { + l = m.Image.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *ContainerStatus) ProtoSize() (n int) { + var l int + _ = l + if len(m.NetworkInfos) > 0 { + for _, e := range m.NetworkInfos { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if m.CgroupInfo != nil { + l = m.CgroupInfo.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.ExecutorPID != nil { + n += 1 + sovMesos(uint64(*m.ExecutorPID)) + } + if m.ContainerID != nil { + l = m.ContainerID.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CgroupInfo) ProtoSize() (n int) { + var l int + _ = l + if m.NetCLS != nil { + l = m.NetCLS.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *CgroupInfo_Blkio) ProtoSize() (n int) { + var l int + _ = l + return n +} + +func (m *CgroupInfo_Blkio_Value) ProtoSize() (n int) { + var l int + _ = l + if m.Op != nil { + n += 1 + sovMesos(uint64(*m.Op)) + } + if m.Value != nil { + n += 1 + sovMesos(uint64(*m.Value)) + } + return n +} + +func (m *CgroupInfo_Blkio_CFQ) ProtoSize() (n int) { + var l int + _ = l + return n +} + +func (m *CgroupInfo_Blkio_CFQ_Statistics) ProtoSize() (n int) { + var l int + _ = l + if m.Device != nil { + l = m.Device.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Sectors != nil { + n += 1 + sovMesos(uint64(*m.Sectors)) + } + if m.Time != nil { + n += 1 + sovMesos(uint64(*m.Time)) + } + if len(m.IOServiced) > 0 { + for _, e := range m.IOServiced { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.IOServiceBytes) > 0 { + for _, e := range m.IOServiceBytes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.IOServiceTime) > 0 { + for _, e := range m.IOServiceTime { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.IOWaitTime) > 0 { + for _, e := range m.IOWaitTime { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.IOMerged) > 0 { + for _, e := range m.IOMerged { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.IOQueued) > 0 { + for _, e := range m.IOQueued { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *CgroupInfo_Blkio_Throttling) ProtoSize() (n int) { + var l int + _ = l + return n +} + +func (m *CgroupInfo_Blkio_Throttling_Statistics) ProtoSize() (n int) { + var l int + _ = l + if m.Device != nil { + l = m.Device.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if len(m.IOServiced) > 0 { + for _, e := range m.IOServiced { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.IOServiceBytes) > 0 { + for _, e := range m.IOServiceBytes { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *CgroupInfo_Blkio_Statistics) ProtoSize() (n int) { + var l int + _ = l + if len(m.CFQ) > 0 { + for _, e := range m.CFQ { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.CFQRecursive) > 0 { + for _, e := range m.CFQRecursive { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.Throttling) > 0 { + for _, e := range m.Throttling { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *CgroupInfo_NetCls) ProtoSize() (n int) { + var l int + _ = l + if m.ClassID != nil { + n += 1 + sovMesos(uint64(*m.ClassID)) + } + return n +} + +func (m *Labels) ProtoSize() (n int) { + var l int + _ = l + if len(m.Labels) > 0 { + for _, e := range m.Labels { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Label) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovMesos(uint64(l)) + if m.Value != nil { + l = len(*m.Value) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Port) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Number)) + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Protocol != nil { + l = len(*m.Protocol) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Visibility != nil { + n += 1 + sovMesos(uint64(*m.Visibility)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Ports) ProtoSize() (n int) { + var l int + _ = l + if len(m.Ports) > 0 { + for _, e := range m.Ports { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *DiscoveryInfo) ProtoSize() (n int) { + var l int + _ = l + n += 1 + sovMesos(uint64(m.Visibility)) + if m.Name != nil { + l = len(*m.Name) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Environment != nil { + l = len(*m.Environment) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Location != nil { + l = len(*m.Location) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Version != nil { + l = len(*m.Version) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Ports != nil { + l = m.Ports.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Labels != nil { + l = m.Labels.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *WeightInfo) ProtoSize() (n int) { + var l int + _ = l + n += 9 + if m.Role != nil { + l = len(*m.Role) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *VersionInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Version) + n += 1 + l + sovMesos(uint64(l)) + if m.BuildDate != nil { + l = len(*m.BuildDate) + n += 1 + l + sovMesos(uint64(l)) + } + if m.BuildTime != nil { + n += 9 + } + if m.BuildUser != nil { + l = len(*m.BuildUser) + n += 1 + l + sovMesos(uint64(l)) + } + if m.GitSHA != nil { + l = len(*m.GitSHA) + n += 1 + l + sovMesos(uint64(l)) + } + if m.GitBranch != nil { + l = len(*m.GitBranch) + n += 1 + l + sovMesos(uint64(l)) + } + if m.GitTag != nil { + l = len(*m.GitTag) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Flag) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.Value != nil { + l = len(*m.Value) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Role) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + n += 9 + if len(m.Frameworks) > 0 { + for _, e := range m.Frameworks { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + if len(m.Resources) > 0 { + for _, e := range m.Resources { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func (m *Metric) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovMesos(uint64(l)) + if m.Value != nil { + n += 9 + } + return n +} + +func (m *FileInfo) ProtoSize() (n int) { + var l int + _ = l + l = len(m.Path) + n += 1 + l + sovMesos(uint64(l)) + if m.Nlink != nil { + n += 1 + sovMesos(uint64(*m.Nlink)) + } + if m.Size != nil { + n += 1 + sovMesos(uint64(*m.Size)) + } + if m.Mtime != nil { + l = m.Mtime.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + if m.Mode != nil { + n += 1 + sovMesos(uint64(*m.Mode)) + } + if m.UID != nil { + l = len(*m.UID) + n += 1 + l + sovMesos(uint64(l)) + } + if m.GID != nil { + l = len(*m.GID) + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Device) ProtoSize() (n int) { + var l int + _ = l + if m.Path != nil { + l = len(*m.Path) + n += 1 + l + sovMesos(uint64(l)) + } + if m.Number != nil { + l = m.Number.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + return n +} + +func (m *Device_Number) ProtoSize() (n int) { + var l int + _ = l + if m.MajorNumber != nil { + n += 1 + sovMesos(uint64(*m.MajorNumber)) + } + if m.MinorNumber != nil { + n += 1 + sovMesos(uint64(*m.MinorNumber)) + } + return n +} + +func (m *DeviceAccess) ProtoSize() (n int) { + var l int + _ = l + l = m.Device.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + l = m.Access.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + return n +} + +func (m *DeviceAccess_Access) ProtoSize() (n int) { + var l int + _ = l + if m.Read != nil { + n += 2 + } + if m.Write != nil { + n += 2 + } + if m.Mknod != nil { + n += 2 + } + return n +} + +func (m *DeviceWhitelist) ProtoSize() (n int) { + var l int + _ = l + if len(m.AllowedDevices) > 0 { + for _, e := range m.AllowedDevices { + l = e.ProtoSize() + n += 1 + l + sovMesos(uint64(l)) + } + } + return n +} + +func sovMesos(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozMesos(x uint64) (n int) { + return sovMesos(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *FrameworkID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FrameworkID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *OfferID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&OfferID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *AgentID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AgentID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *TaskID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TaskID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *ExecutorID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExecutorID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `Parent:` + strings.Replace(fmt.Sprintf("%v", this.Parent), "ContainerID", "ContainerID", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceProviderID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceProviderID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *OperationID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&OperationID{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *TimeInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TimeInfo{`, + `Nanoseconds:` + fmt.Sprintf("%v", this.Nanoseconds) + `,`, + `}`, + }, "") + return s +} +func (this *DurationInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DurationInfo{`, + `Nanoseconds:` + fmt.Sprintf("%v", this.Nanoseconds) + `,`, + `}`, + }, "") + return s +} +func (this *Address) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Address{`, + `Hostname:` + valueToStringMesos(this.Hostname) + `,`, + `IP:` + valueToStringMesos(this.IP) + `,`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `}`, + }, "") + return s +} +func (this *URL) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&URL{`, + `Scheme:` + fmt.Sprintf("%v", this.Scheme) + `,`, + `Address:` + strings.Replace(strings.Replace(this.Address.String(), "Address", "Address", 1), `&`, ``, 1) + `,`, + `Path:` + valueToStringMesos(this.Path) + `,`, + `Query:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Query), "Parameter", "Parameter", 1), `&`, ``, 1) + `,`, + `Fragment:` + valueToStringMesos(this.Fragment) + `,`, + `}`, + }, "") + return s +} +func (this *Unavailability) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Unavailability{`, + `Start:` + strings.Replace(strings.Replace(this.Start.String(), "TimeInfo", "TimeInfo", 1), `&`, ``, 1) + `,`, + `Duration:` + strings.Replace(fmt.Sprintf("%v", this.Duration), "DurationInfo", "DurationInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *MachineID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MachineID{`, + `Hostname:` + valueToStringMesos(this.Hostname) + `,`, + `IP:` + valueToStringMesos(this.IP) + `,`, + `}`, + }, "") + return s +} +func (this *MachineInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MachineInfo{`, + `ID:` + strings.Replace(strings.Replace(this.ID.String(), "MachineID", "MachineID", 1), `&`, ``, 1) + `,`, + `Mode:` + valueToStringMesos(this.Mode) + `,`, + `Unavailability:` + strings.Replace(fmt.Sprintf("%v", this.Unavailability), "Unavailability", "Unavailability", 1) + `,`, + `}`, + }, "") + return s +} +func (this *FrameworkInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FrameworkInfo{`, + `User:` + fmt.Sprintf("%v", this.User) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ID:` + strings.Replace(fmt.Sprintf("%v", this.ID), "FrameworkID", "FrameworkID", 1) + `,`, + `FailoverTimeout:` + valueToStringMesos(this.FailoverTimeout) + `,`, + `Checkpoint:` + valueToStringMesos(this.Checkpoint) + `,`, + `Role:` + valueToStringMesos(this.Role) + `,`, + `Hostname:` + valueToStringMesos(this.Hostname) + `,`, + `Principal:` + valueToStringMesos(this.Principal) + `,`, + `WebUiURL:` + valueToStringMesos(this.WebUiURL) + `,`, + `Capabilities:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Capabilities), "FrameworkInfo_Capability", "FrameworkInfo_Capability", 1), `&`, ``, 1) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `Roles:` + fmt.Sprintf("%v", this.Roles) + `,`, + `}`, + }, "") + return s +} +func (this *FrameworkInfo_Capability) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FrameworkInfo_Capability{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `}`, + }, "") + return s +} +func (this *CheckInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckInfo{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CheckInfo_Command", "CheckInfo_Command", 1) + `,`, + `HTTP:` + strings.Replace(fmt.Sprintf("%v", this.HTTP), "CheckInfo_Http", "CheckInfo_Http", 1) + `,`, + `DelaySeconds:` + valueToStringMesos(this.DelaySeconds) + `,`, + `IntervalSeconds:` + valueToStringMesos(this.IntervalSeconds) + `,`, + `TimeoutSeconds:` + valueToStringMesos(this.TimeoutSeconds) + `,`, + `TCP:` + strings.Replace(fmt.Sprintf("%v", this.TCP), "CheckInfo_Tcp", "CheckInfo_Tcp", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CheckInfo_Command) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckInfo_Command{`, + `Command:` + strings.Replace(strings.Replace(this.Command.String(), "CommandInfo", "CommandInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CheckInfo_Http) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckInfo_Http{`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `Path:` + valueToStringMesos(this.Path) + `,`, + `}`, + }, "") + return s +} +func (this *CheckInfo_Tcp) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckInfo_Tcp{`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `}`, + }, "") + return s +} +func (this *HealthCheck) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HealthCheck{`, + `HTTP:` + strings.Replace(fmt.Sprintf("%v", this.HTTP), "HealthCheck_HTTPCheckInfo", "HealthCheck_HTTPCheckInfo", 1) + `,`, + `DelaySeconds:` + valueToStringMesos(this.DelaySeconds) + `,`, + `IntervalSeconds:` + valueToStringMesos(this.IntervalSeconds) + `,`, + `TimeoutSeconds:` + valueToStringMesos(this.TimeoutSeconds) + `,`, + `ConsecutiveFailures:` + valueToStringMesos(this.ConsecutiveFailures) + `,`, + `GracePeriodSeconds:` + valueToStringMesos(this.GracePeriodSeconds) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CommandInfo", "CommandInfo", 1) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `TCP:` + strings.Replace(fmt.Sprintf("%v", this.TCP), "HealthCheck_TCPCheckInfo", "HealthCheck_TCPCheckInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *HealthCheck_HTTPCheckInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HealthCheck_HTTPCheckInfo{`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `Path:` + valueToStringMesos(this.Path) + `,`, + `Scheme:` + valueToStringMesos(this.Scheme) + `,`, + `Statuses:` + fmt.Sprintf("%v", this.Statuses) + `,`, + `Protocol:` + valueToStringMesos(this.Protocol) + `,`, + `}`, + }, "") + return s +} +func (this *HealthCheck_TCPCheckInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HealthCheck_TCPCheckInfo{`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `Protocol:` + valueToStringMesos(this.Protocol) + `,`, + `}`, + }, "") + return s +} +func (this *KillPolicy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&KillPolicy{`, + `GracePeriod:` + strings.Replace(fmt.Sprintf("%v", this.GracePeriod), "DurationInfo", "DurationInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CommandInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CommandInfo{`, + `URIs:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.URIs), "CommandInfo_URI", "CommandInfo_URI", 1), `&`, ``, 1) + `,`, + `Environment:` + strings.Replace(fmt.Sprintf("%v", this.Environment), "Environment", "Environment", 1) + `,`, + `Value:` + valueToStringMesos(this.Value) + `,`, + `User:` + valueToStringMesos(this.User) + `,`, + `Shell:` + valueToStringMesos(this.Shell) + `,`, + `Arguments:` + fmt.Sprintf("%v", this.Arguments) + `,`, + `}`, + }, "") + return s +} +func (this *CommandInfo_URI) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CommandInfo_URI{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `Executable:` + valueToStringMesos(this.Executable) + `,`, + `Extract:` + valueToStringMesos(this.Extract) + `,`, + `Cache:` + valueToStringMesos(this.Cache) + `,`, + `OutputFile:` + valueToStringMesos(this.OutputFile) + `,`, + `}`, + }, "") + return s +} +func (this *ExecutorInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExecutorInfo{`, + `ExecutorID:` + strings.Replace(strings.Replace(this.ExecutorID.String(), "ExecutorID", "ExecutorID", 1), `&`, ``, 1) + `,`, + `Data:` + valueToStringMesos(this.Data) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CommandInfo", "CommandInfo", 1) + `,`, + `FrameworkID:` + strings.Replace(fmt.Sprintf("%v", this.FrameworkID), "FrameworkID", "FrameworkID", 1) + `,`, + `Name:` + valueToStringMesos(this.Name) + `,`, + `Source:` + valueToStringMesos(this.Source) + `,`, + `Container:` + strings.Replace(fmt.Sprintf("%v", this.Container), "ContainerInfo", "ContainerInfo", 1) + `,`, + `Discovery:` + strings.Replace(fmt.Sprintf("%v", this.Discovery), "DiscoveryInfo", "DiscoveryInfo", 1) + `,`, + `ShutdownGracePeriod:` + strings.Replace(fmt.Sprintf("%v", this.ShutdownGracePeriod), "DurationInfo", "DurationInfo", 1) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `}`, + }, "") + return s +} +func (this *DomainInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DomainInfo{`, + `FaultDomain:` + strings.Replace(fmt.Sprintf("%v", this.FaultDomain), "DomainInfo_FaultDomain", "DomainInfo_FaultDomain", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DomainInfo_FaultDomain) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DomainInfo_FaultDomain{`, + `Region:` + strings.Replace(strings.Replace(this.Region.String(), "DomainInfo_FaultDomain_RegionInfo", "DomainInfo_FaultDomain_RegionInfo", 1), `&`, ``, 1) + `,`, + `Zone:` + strings.Replace(strings.Replace(this.Zone.String(), "DomainInfo_FaultDomain_ZoneInfo", "DomainInfo_FaultDomain_ZoneInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DomainInfo_FaultDomain_RegionInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DomainInfo_FaultDomain_RegionInfo{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} +func (this *DomainInfo_FaultDomain_ZoneInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DomainInfo_FaultDomain_ZoneInfo{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} +func (this *MasterInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MasterInfo{`, + `ID:` + fmt.Sprintf("%v", this.ID) + `,`, + `IP:` + fmt.Sprintf("%v", this.IP) + `,`, + `Port:` + valueToStringMesos(this.Port) + `,`, + `PID:` + valueToStringMesos(this.PID) + `,`, + `Hostname:` + valueToStringMesos(this.Hostname) + `,`, + `Version:` + valueToStringMesos(this.Version) + `,`, + `Address:` + strings.Replace(fmt.Sprintf("%v", this.Address), "Address", "Address", 1) + `,`, + `Domain:` + strings.Replace(fmt.Sprintf("%v", this.Domain), "DomainInfo", "DomainInfo", 1) + `,`, + `Capabilities:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Capabilities), "MasterInfo_Capability", "MasterInfo_Capability", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *MasterInfo_Capability) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MasterInfo_Capability{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `}`, + }, "") + return s +} +func (this *AgentInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AgentInfo{`, + `Hostname:` + fmt.Sprintf("%v", this.Hostname) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Attributes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Attributes), "Attribute", "Attribute", 1), `&`, ``, 1) + `,`, + `ID:` + strings.Replace(fmt.Sprintf("%v", this.ID), "AgentID", "AgentID", 1) + `,`, + `Port:` + valueToStringMesos(this.Port) + `,`, + `Domain:` + strings.Replace(fmt.Sprintf("%v", this.Domain), "DomainInfo", "DomainInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *AgentInfo_Capability) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&AgentInfo_Capability{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `}`, + }, "") + return s +} +func (this *CSIPluginContainerInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CSIPluginContainerInfo{`, + `Services:` + fmt.Sprintf("%v", this.Services) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CommandInfo", "CommandInfo", 1) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Container:` + strings.Replace(fmt.Sprintf("%v", this.Container), "ContainerInfo", "ContainerInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CSIPluginInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CSIPluginInfo{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Containers:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Containers), "CSIPluginContainerInfo", "CSIPluginContainerInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceProviderInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceProviderInfo{`, + `ID:` + strings.Replace(fmt.Sprintf("%v", this.ID), "ResourceProviderID", "ResourceProviderID", 1) + `,`, + `Attributes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Attributes), "Attribute", "Attribute", 1), `&`, ``, 1) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `DefaultReservations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.DefaultReservations), "Resource_ReservationInfo", "Resource_ReservationInfo", 1), `&`, ``, 1) + `,`, + `Storage:` + strings.Replace(fmt.Sprintf("%v", this.Storage), "ResourceProviderInfo_Storage", "ResourceProviderInfo_Storage", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceProviderInfo_Storage) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceProviderInfo_Storage{`, + `Plugin:` + strings.Replace(strings.Replace(this.Plugin.String(), "CSIPluginInfo", "CSIPluginInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Scalar:` + strings.Replace(fmt.Sprintf("%v", this.Scalar), "Value_Scalar", "Value_Scalar", 1) + `,`, + `Ranges:` + strings.Replace(fmt.Sprintf("%v", this.Ranges), "Value_Ranges", "Value_Ranges", 1) + `,`, + `Set:` + strings.Replace(fmt.Sprintf("%v", this.Set), "Value_Set", "Value_Set", 1) + `,`, + `Text:` + strings.Replace(fmt.Sprintf("%v", this.Text), "Value_Text", "Value_Text", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Value_Scalar) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_Scalar{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *Value_Range) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_Range{`, + `Begin:` + fmt.Sprintf("%v", this.Begin) + `,`, + `End:` + fmt.Sprintf("%v", this.End) + `,`, + `}`, + }, "") + return s +} +func (this *Value_Ranges) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_Ranges{`, + `Range:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Range), "Value_Range", "Value_Range", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Value_Set) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_Set{`, + `Item:` + fmt.Sprintf("%v", this.Item) + `,`, + `}`, + }, "") + return s +} +func (this *Value_Text) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Value_Text{`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *Attribute) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Attribute{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Scalar:` + strings.Replace(fmt.Sprintf("%v", this.Scalar), "Value_Scalar", "Value_Scalar", 1) + `,`, + `Ranges:` + strings.Replace(fmt.Sprintf("%v", this.Ranges), "Value_Ranges", "Value_Ranges", 1) + `,`, + `Text:` + strings.Replace(fmt.Sprintf("%v", this.Text), "Value_Text", "Value_Text", 1) + `,`, + `Set:` + strings.Replace(fmt.Sprintf("%v", this.Set), "Value_Set", "Value_Set", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Resource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Type:` + valueToStringMesos(this.Type) + `,`, + `Scalar:` + strings.Replace(fmt.Sprintf("%v", this.Scalar), "Value_Scalar", "Value_Scalar", 1) + `,`, + `Ranges:` + strings.Replace(fmt.Sprintf("%v", this.Ranges), "Value_Ranges", "Value_Ranges", 1) + `,`, + `Set:` + strings.Replace(fmt.Sprintf("%v", this.Set), "Value_Set", "Value_Set", 1) + `,`, + `Role:` + valueToStringMesos(this.Role) + `,`, + `Disk:` + strings.Replace(fmt.Sprintf("%v", this.Disk), "Resource_DiskInfo", "Resource_DiskInfo", 1) + `,`, + `Reservation:` + strings.Replace(fmt.Sprintf("%v", this.Reservation), "Resource_ReservationInfo", "Resource_ReservationInfo", 1) + `,`, + `Revocable:` + strings.Replace(fmt.Sprintf("%v", this.Revocable), "Resource_RevocableInfo", "Resource_RevocableInfo", 1) + `,`, + `Shared:` + strings.Replace(fmt.Sprintf("%v", this.Shared), "Resource_SharedInfo", "Resource_SharedInfo", 1) + `,`, + `AllocationInfo:` + strings.Replace(fmt.Sprintf("%v", this.AllocationInfo), "Resource_AllocationInfo", "Resource_AllocationInfo", 1) + `,`, + `ProviderID:` + strings.Replace(fmt.Sprintf("%v", this.ProviderID), "ResourceProviderID", "ResourceProviderID", 1) + `,`, + `Reservations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Reservations), "Resource_ReservationInfo", "Resource_ReservationInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_AllocationInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_AllocationInfo{`, + `Role:` + valueToStringMesos(this.Role) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_ReservationInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_ReservationInfo{`, + `Principal:` + valueToStringMesos(this.Principal) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `Role:` + valueToStringMesos(this.Role) + `,`, + `Type:` + valueToStringMesos(this.Type) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_DiskInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_DiskInfo{`, + `Persistence:` + strings.Replace(fmt.Sprintf("%v", this.Persistence), "Resource_DiskInfo_Persistence", "Resource_DiskInfo_Persistence", 1) + `,`, + `Volume:` + strings.Replace(fmt.Sprintf("%v", this.Volume), "Volume", "Volume", 1) + `,`, + `Source:` + strings.Replace(fmt.Sprintf("%v", this.Source), "Resource_DiskInfo_Source", "Resource_DiskInfo_Source", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_DiskInfo_Persistence) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_DiskInfo_Persistence{`, + `ID:` + fmt.Sprintf("%v", this.ID) + `,`, + `Principal:` + valueToStringMesos(this.Principal) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_DiskInfo_Source) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_DiskInfo_Source{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Path:` + strings.Replace(fmt.Sprintf("%v", this.Path), "Resource_DiskInfo_Source_Path", "Resource_DiskInfo_Source_Path", 1) + `,`, + `Mount:` + strings.Replace(fmt.Sprintf("%v", this.Mount), "Resource_DiskInfo_Source_Mount", "Resource_DiskInfo_Source_Mount", 1) + `,`, + `ID:` + valueToStringMesos(this.ID) + `,`, + `Metadata:` + strings.Replace(fmt.Sprintf("%v", this.Metadata), "Labels", "Labels", 1) + `,`, + `Profile:` + valueToStringMesos(this.Profile) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_DiskInfo_Source_Path) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_DiskInfo_Source_Path{`, + `Root:` + valueToStringMesos(this.Root) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_DiskInfo_Source_Mount) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_DiskInfo_Source_Mount{`, + `Root:` + valueToStringMesos(this.Root) + `,`, + `}`, + }, "") + return s +} +func (this *Resource_RevocableInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_RevocableInfo{`, + `}`, + }, "") + return s +} +func (this *Resource_SharedInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Resource_SharedInfo{`, + `}`, + }, "") + return s +} +func (this *TrafficControlStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TrafficControlStatistics{`, + `ID:` + fmt.Sprintf("%v", this.ID) + `,`, + `Backlog:` + valueToStringMesos(this.Backlog) + `,`, + `Bytes:` + valueToStringMesos(this.Bytes) + `,`, + `Drops:` + valueToStringMesos(this.Drops) + `,`, + `Overlimits:` + valueToStringMesos(this.Overlimits) + `,`, + `Packets:` + valueToStringMesos(this.Packets) + `,`, + `Qlen:` + valueToStringMesos(this.Qlen) + `,`, + `RateBPS:` + valueToStringMesos(this.RateBPS) + `,`, + `RatePPS:` + valueToStringMesos(this.RatePPS) + `,`, + `Requeues:` + valueToStringMesos(this.Requeues) + `,`, + `}`, + }, "") + return s +} +func (this *IpStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&IpStatistics{`, + `Forwarding:` + valueToStringMesos(this.Forwarding) + `,`, + `DefaultTTL:` + valueToStringMesos(this.DefaultTTL) + `,`, + `InReceives:` + valueToStringMesos(this.InReceives) + `,`, + `InHdrErrors:` + valueToStringMesos(this.InHdrErrors) + `,`, + `InAddrErrors:` + valueToStringMesos(this.InAddrErrors) + `,`, + `ForwDatagrams:` + valueToStringMesos(this.ForwDatagrams) + `,`, + `InUnknownProtos:` + valueToStringMesos(this.InUnknownProtos) + `,`, + `InDiscards:` + valueToStringMesos(this.InDiscards) + `,`, + `InDelivers:` + valueToStringMesos(this.InDelivers) + `,`, + `OutRequests:` + valueToStringMesos(this.OutRequests) + `,`, + `OutDiscards:` + valueToStringMesos(this.OutDiscards) + `,`, + `OutNoRoutes:` + valueToStringMesos(this.OutNoRoutes) + `,`, + `ReasmTimeout:` + valueToStringMesos(this.ReasmTimeout) + `,`, + `ReasmReqds:` + valueToStringMesos(this.ReasmReqds) + `,`, + `ReasmOKs:` + valueToStringMesos(this.ReasmOKs) + `,`, + `ReasmFails:` + valueToStringMesos(this.ReasmFails) + `,`, + `FragOKs:` + valueToStringMesos(this.FragOKs) + `,`, + `FragFails:` + valueToStringMesos(this.FragFails) + `,`, + `FragCreates:` + valueToStringMesos(this.FragCreates) + `,`, + `}`, + }, "") + return s +} +func (this *IcmpStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&IcmpStatistics{`, + `InMsgs:` + valueToStringMesos(this.InMsgs) + `,`, + `InErrors:` + valueToStringMesos(this.InErrors) + `,`, + `InCsumErrors:` + valueToStringMesos(this.InCsumErrors) + `,`, + `InDestUnreachs:` + valueToStringMesos(this.InDestUnreachs) + `,`, + `InTimeExcds:` + valueToStringMesos(this.InTimeExcds) + `,`, + `InParmProbs:` + valueToStringMesos(this.InParmProbs) + `,`, + `InSrcQuenchs:` + valueToStringMesos(this.InSrcQuenchs) + `,`, + `InRedirects:` + valueToStringMesos(this.InRedirects) + `,`, + `InEchos:` + valueToStringMesos(this.InEchos) + `,`, + `InEchoReps:` + valueToStringMesos(this.InEchoReps) + `,`, + `InTimestamps:` + valueToStringMesos(this.InTimestamps) + `,`, + `InTimestampReps:` + valueToStringMesos(this.InTimestampReps) + `,`, + `InAddrMasks:` + valueToStringMesos(this.InAddrMasks) + `,`, + `InAddrMaskReps:` + valueToStringMesos(this.InAddrMaskReps) + `,`, + `OutMsgs:` + valueToStringMesos(this.OutMsgs) + `,`, + `OutErrors:` + valueToStringMesos(this.OutErrors) + `,`, + `OutDestUnreachs:` + valueToStringMesos(this.OutDestUnreachs) + `,`, + `OutTimeExcds:` + valueToStringMesos(this.OutTimeExcds) + `,`, + `OutParmProbs:` + valueToStringMesos(this.OutParmProbs) + `,`, + `OutSrcQuenchs:` + valueToStringMesos(this.OutSrcQuenchs) + `,`, + `OutRedirects:` + valueToStringMesos(this.OutRedirects) + `,`, + `OutEchos:` + valueToStringMesos(this.OutEchos) + `,`, + `OutEchoReps:` + valueToStringMesos(this.OutEchoReps) + `,`, + `OutTimestamps:` + valueToStringMesos(this.OutTimestamps) + `,`, + `OutTimestampReps:` + valueToStringMesos(this.OutTimestampReps) + `,`, + `OutAddrMasks:` + valueToStringMesos(this.OutAddrMasks) + `,`, + `OutAddrMaskReps:` + valueToStringMesos(this.OutAddrMaskReps) + `,`, + `}`, + }, "") + return s +} +func (this *TcpStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TcpStatistics{`, + `RtoAlgorithm:` + valueToStringMesos(this.RtoAlgorithm) + `,`, + `RtoMin:` + valueToStringMesos(this.RtoMin) + `,`, + `RtoMax:` + valueToStringMesos(this.RtoMax) + `,`, + `MaxConn:` + valueToStringMesos(this.MaxConn) + `,`, + `ActiveOpens:` + valueToStringMesos(this.ActiveOpens) + `,`, + `PassiveOpens:` + valueToStringMesos(this.PassiveOpens) + `,`, + `AttemptFails:` + valueToStringMesos(this.AttemptFails) + `,`, + `EstabResets:` + valueToStringMesos(this.EstabResets) + `,`, + `CurrEstab:` + valueToStringMesos(this.CurrEstab) + `,`, + `InSegs:` + valueToStringMesos(this.InSegs) + `,`, + `OutSegs:` + valueToStringMesos(this.OutSegs) + `,`, + `RetransSegs:` + valueToStringMesos(this.RetransSegs) + `,`, + `InErrs:` + valueToStringMesos(this.InErrs) + `,`, + `OutRsts:` + valueToStringMesos(this.OutRsts) + `,`, + `InCsumErrors:` + valueToStringMesos(this.InCsumErrors) + `,`, + `}`, + }, "") + return s +} +func (this *UdpStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UdpStatistics{`, + `InDatagrams:` + valueToStringMesos(this.InDatagrams) + `,`, + `NoPorts:` + valueToStringMesos(this.NoPorts) + `,`, + `InErrors:` + valueToStringMesos(this.InErrors) + `,`, + `OutDatagrams:` + valueToStringMesos(this.OutDatagrams) + `,`, + `RcvbufErrors:` + valueToStringMesos(this.RcvbufErrors) + `,`, + `SndbufErrors:` + valueToStringMesos(this.SndbufErrors) + `,`, + `InCsumErrors:` + valueToStringMesos(this.InCsumErrors) + `,`, + `IgnoredMulti:` + valueToStringMesos(this.IgnoredMulti) + `,`, + `}`, + }, "") + return s +} +func (this *SNMPStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SNMPStatistics{`, + `IPStats:` + strings.Replace(fmt.Sprintf("%v", this.IPStats), "IpStatistics", "IpStatistics", 1) + `,`, + `ICMPStats:` + strings.Replace(fmt.Sprintf("%v", this.ICMPStats), "IcmpStatistics", "IcmpStatistics", 1) + `,`, + `TCPStats:` + strings.Replace(fmt.Sprintf("%v", this.TCPStats), "TcpStatistics", "TcpStatistics", 1) + `,`, + `UDPStats:` + strings.Replace(fmt.Sprintf("%v", this.UDPStats), "UdpStatistics", "UdpStatistics", 1) + `,`, + `}`, + }, "") + return s +} +func (this *DiskStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DiskStatistics{`, + `Source:` + strings.Replace(fmt.Sprintf("%v", this.Source), "Resource_DiskInfo_Source", "Resource_DiskInfo_Source", 1) + `,`, + `Persistence:` + strings.Replace(fmt.Sprintf("%v", this.Persistence), "Resource_DiskInfo_Persistence", "Resource_DiskInfo_Persistence", 1) + `,`, + `LimitBytes:` + valueToStringMesos(this.LimitBytes) + `,`, + `UsedBytes:` + valueToStringMesos(this.UsedBytes) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceStatistics{`, + `Timestamp:` + fmt.Sprintf("%v", this.Timestamp) + `,`, + `CPUsUserTimeSecs:` + valueToStringMesos(this.CPUsUserTimeSecs) + `,`, + `CPUsSystemTimeSecs:` + valueToStringMesos(this.CPUsSystemTimeSecs) + `,`, + `CPUsLimit:` + valueToStringMesos(this.CPUsLimit) + `,`, + `MemRSSBytes:` + valueToStringMesos(this.MemRSSBytes) + `,`, + `MemLimitBytes:` + valueToStringMesos(this.MemLimitBytes) + `,`, + `CPUsNrPeriods:` + valueToStringMesos(this.CPUsNrPeriods) + `,`, + `CPUsNrThrottled:` + valueToStringMesos(this.CPUsNrThrottled) + `,`, + `CPUsThrottledTimeSecs:` + valueToStringMesos(this.CPUsThrottledTimeSecs) + `,`, + `MemFileBytes:` + valueToStringMesos(this.MemFileBytes) + `,`, + `MemAnonBytes:` + valueToStringMesos(this.MemAnonBytes) + `,`, + `MemMappedFileBytes:` + valueToStringMesos(this.MemMappedFileBytes) + `,`, + `Perf:` + strings.Replace(fmt.Sprintf("%v", this.Perf), "PerfStatistics", "PerfStatistics", 1) + `,`, + `NetRxPackets:` + valueToStringMesos(this.NetRxPackets) + `,`, + `NetRxBytes:` + valueToStringMesos(this.NetRxBytes) + `,`, + `NetRxErrors:` + valueToStringMesos(this.NetRxErrors) + `,`, + `NetRxDropped:` + valueToStringMesos(this.NetRxDropped) + `,`, + `NetTxPackets:` + valueToStringMesos(this.NetTxPackets) + `,`, + `NetTxBytes:` + valueToStringMesos(this.NetTxBytes) + `,`, + `NetTxErrors:` + valueToStringMesos(this.NetTxErrors) + `,`, + `NetTxDropped:` + valueToStringMesos(this.NetTxDropped) + `,`, + `NetTCPRttMicrosecsP50:` + valueToStringMesos(this.NetTCPRttMicrosecsP50) + `,`, + `NetTCPRttMicrosecsP90:` + valueToStringMesos(this.NetTCPRttMicrosecsP90) + `,`, + `NetTCPRttMicrosecsP95:` + valueToStringMesos(this.NetTCPRttMicrosecsP95) + `,`, + `NetTCPRttMicrosecsP99:` + valueToStringMesos(this.NetTCPRttMicrosecsP99) + `,`, + `DiskLimitBytes:` + valueToStringMesos(this.DiskLimitBytes) + `,`, + `DiskUsedBytes:` + valueToStringMesos(this.DiskUsedBytes) + `,`, + `NetTCPActiveConnections:` + valueToStringMesos(this.NetTCPActiveConnections) + `,`, + `NetTCPTimeWaitConnections:` + valueToStringMesos(this.NetTCPTimeWaitConnections) + `,`, + `Processes:` + valueToStringMesos(this.Processes) + `,`, + `Threads:` + valueToStringMesos(this.Threads) + `,`, + `MemLowPressureCounter:` + valueToStringMesos(this.MemLowPressureCounter) + `,`, + `MemMediumPressureCounter:` + valueToStringMesos(this.MemMediumPressureCounter) + `,`, + `MemCriticalPressureCounter:` + valueToStringMesos(this.MemCriticalPressureCounter) + `,`, + `NetTrafficControlStatistics:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.NetTrafficControlStatistics), "TrafficControlStatistics", "TrafficControlStatistics", 1), `&`, ``, 1) + `,`, + `MemTotalBytes:` + valueToStringMesos(this.MemTotalBytes) + `,`, + `MemTotalMemswBytes:` + valueToStringMesos(this.MemTotalMemswBytes) + `,`, + `MemSoftLimitBytes:` + valueToStringMesos(this.MemSoftLimitBytes) + `,`, + `MemCacheBytes:` + valueToStringMesos(this.MemCacheBytes) + `,`, + `MemSwapBytes:` + valueToStringMesos(this.MemSwapBytes) + `,`, + `MemUnevictableBytes:` + valueToStringMesos(this.MemUnevictableBytes) + `,`, + `NetSNMPStatistics:` + strings.Replace(fmt.Sprintf("%v", this.NetSNMPStatistics), "SNMPStatistics", "SNMPStatistics", 1) + `,`, + `DiskStatistics:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.DiskStatistics), "DiskStatistics", "DiskStatistics", 1), `&`, ``, 1) + `,`, + `BlkioStatistics:` + strings.Replace(fmt.Sprintf("%v", this.BlkioStatistics), "CgroupInfo_Blkio_Statistics", "CgroupInfo_Blkio_Statistics", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceUsage) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceUsage{`, + `Executors:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Executors), "ResourceUsage_Executor", "ResourceUsage_Executor", 1), `&`, ``, 1) + `,`, + `Total:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Total), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceUsage_Executor) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceUsage_Executor{`, + `ExecutorInfo:` + strings.Replace(strings.Replace(this.ExecutorInfo.String(), "ExecutorInfo", "ExecutorInfo", 1), `&`, ``, 1) + `,`, + `Allocated:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Allocated), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Statistics:` + strings.Replace(fmt.Sprintf("%v", this.Statistics), "ResourceStatistics", "ResourceStatistics", 1) + `,`, + `ContainerID:` + strings.Replace(strings.Replace(this.ContainerID.String(), "ContainerID", "ContainerID", 1), `&`, ``, 1) + `,`, + `Tasks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Tasks), "ResourceUsage_Executor_Task", "ResourceUsage_Executor_Task", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceUsage_Executor_Task) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceUsage_Executor_Task{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ID:` + strings.Replace(strings.Replace(this.ID.String(), "TaskID", "TaskID", 1), `&`, ``, 1) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `}`, + }, "") + return s +} +func (this *PerfStatistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PerfStatistics{`, + `Timestamp:` + fmt.Sprintf("%v", this.Timestamp) + `,`, + `Duration:` + fmt.Sprintf("%v", this.Duration) + `,`, + `Cycles:` + valueToStringMesos(this.Cycles) + `,`, + `StalledCyclesFrontend:` + valueToStringMesos(this.StalledCyclesFrontend) + `,`, + `StalledCyclesBackend:` + valueToStringMesos(this.StalledCyclesBackend) + `,`, + `Instructions:` + valueToStringMesos(this.Instructions) + `,`, + `CacheReferences:` + valueToStringMesos(this.CacheReferences) + `,`, + `CacheMisses:` + valueToStringMesos(this.CacheMisses) + `,`, + `Branches:` + valueToStringMesos(this.Branches) + `,`, + `BranchMisses:` + valueToStringMesos(this.BranchMisses) + `,`, + `BusCycles:` + valueToStringMesos(this.BusCycles) + `,`, + `RefCycles:` + valueToStringMesos(this.RefCycles) + `,`, + `CPUClock:` + valueToStringMesos(this.CPUClock) + `,`, + `TaskClock:` + valueToStringMesos(this.TaskClock) + `,`, + `PageFaults:` + valueToStringMesos(this.PageFaults) + `,`, + `MinorFaults:` + valueToStringMesos(this.MinorFaults) + `,`, + `MajorFaults:` + valueToStringMesos(this.MajorFaults) + `,`, + `ContextSwitches:` + valueToStringMesos(this.ContextSwitches) + `,`, + `CPUMigrations:` + valueToStringMesos(this.CPUMigrations) + `,`, + `AlignmentFaults:` + valueToStringMesos(this.AlignmentFaults) + `,`, + `EmulationFaults:` + valueToStringMesos(this.EmulationFaults) + `,`, + `L1DcacheLoads:` + valueToStringMesos(this.L1DcacheLoads) + `,`, + `L1DcacheLoadMisses:` + valueToStringMesos(this.L1DcacheLoadMisses) + `,`, + `L1DcacheStores:` + valueToStringMesos(this.L1DcacheStores) + `,`, + `L1DcacheStoreMisses:` + valueToStringMesos(this.L1DcacheStoreMisses) + `,`, + `L1DcachePrefetches:` + valueToStringMesos(this.L1DcachePrefetches) + `,`, + `L1DcachePrefetchMisses:` + valueToStringMesos(this.L1DcachePrefetchMisses) + `,`, + `L1IcacheLoads:` + valueToStringMesos(this.L1IcacheLoads) + `,`, + `L1IcacheLoadMisses:` + valueToStringMesos(this.L1IcacheLoadMisses) + `,`, + `L1IcachePrefetches:` + valueToStringMesos(this.L1IcachePrefetches) + `,`, + `L1IcachePrefetchMisses:` + valueToStringMesos(this.L1IcachePrefetchMisses) + `,`, + `LLCLoads:` + valueToStringMesos(this.LLCLoads) + `,`, + `LLCLoadMisses:` + valueToStringMesos(this.LLCLoadMisses) + `,`, + `LLCStores:` + valueToStringMesos(this.LLCStores) + `,`, + `LLCStoreMisses:` + valueToStringMesos(this.LLCStoreMisses) + `,`, + `LLCPrefetches:` + valueToStringMesos(this.LLCPrefetches) + `,`, + `LLCPrefetchMisses:` + valueToStringMesos(this.LLCPrefetchMisses) + `,`, + `DTLBLoads:` + valueToStringMesos(this.DTLBLoads) + `,`, + `DTLBLoadMisses:` + valueToStringMesos(this.DTLBLoadMisses) + `,`, + `DTLBStores:` + valueToStringMesos(this.DTLBStores) + `,`, + `DTLBStoreMisses:` + valueToStringMesos(this.DTLBStoreMisses) + `,`, + `DTLBPrefetches:` + valueToStringMesos(this.DTLBPrefetches) + `,`, + `DTLBPrefetchMisses:` + valueToStringMesos(this.DTLBPrefetchMisses) + `,`, + `ITLBLoads:` + valueToStringMesos(this.ITLBLoads) + `,`, + `ITLBLoadMisses:` + valueToStringMesos(this.ITLBLoadMisses) + `,`, + `BranchLoads:` + valueToStringMesos(this.BranchLoads) + `,`, + `BranchLoadMisses:` + valueToStringMesos(this.BranchLoadMisses) + `,`, + `NodeLoads:` + valueToStringMesos(this.NodeLoads) + `,`, + `NodeLoadMisses:` + valueToStringMesos(this.NodeLoadMisses) + `,`, + `NodeStores:` + valueToStringMesos(this.NodeStores) + `,`, + `NodeStoreMisses:` + valueToStringMesos(this.NodeStoreMisses) + `,`, + `NodePrefetches:` + valueToStringMesos(this.NodePrefetches) + `,`, + `NodePrefetchMisses:` + valueToStringMesos(this.NodePrefetchMisses) + `,`, + `}`, + }, "") + return s +} +func (this *Request) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Request{`, + `AgentID:` + strings.Replace(fmt.Sprintf("%v", this.AgentID), "AgentID", "AgentID", 1) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer{`, + `ID:` + strings.Replace(strings.Replace(this.ID.String(), "OfferID", "OfferID", 1), `&`, ``, 1) + `,`, + `FrameworkID:` + strings.Replace(strings.Replace(this.FrameworkID.String(), "FrameworkID", "FrameworkID", 1), `&`, ``, 1) + `,`, + `AgentID:` + strings.Replace(strings.Replace(this.AgentID.String(), "AgentID", "AgentID", 1), `&`, ``, 1) + `,`, + `Hostname:` + fmt.Sprintf("%v", this.Hostname) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `ExecutorIDs:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ExecutorIDs), "ExecutorID", "ExecutorID", 1), `&`, ``, 1) + `,`, + `Attributes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Attributes), "Attribute", "Attribute", 1), `&`, ``, 1) + `,`, + `URL:` + strings.Replace(fmt.Sprintf("%v", this.URL), "URL", "URL", 1) + `,`, + `Unavailability:` + strings.Replace(fmt.Sprintf("%v", this.Unavailability), "Unavailability", "Unavailability", 1) + `,`, + `AllocationInfo:` + strings.Replace(fmt.Sprintf("%v", this.AllocationInfo), "Resource_AllocationInfo", "Resource_AllocationInfo", 1) + `,`, + `Domain:` + strings.Replace(fmt.Sprintf("%v", this.Domain), "DomainInfo", "DomainInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Launch:` + strings.Replace(fmt.Sprintf("%v", this.Launch), "Offer_Operation_Launch", "Offer_Operation_Launch", 1) + `,`, + `Reserve:` + strings.Replace(fmt.Sprintf("%v", this.Reserve), "Offer_Operation_Reserve", "Offer_Operation_Reserve", 1) + `,`, + `Unreserve:` + strings.Replace(fmt.Sprintf("%v", this.Unreserve), "Offer_Operation_Unreserve", "Offer_Operation_Unreserve", 1) + `,`, + `Create:` + strings.Replace(fmt.Sprintf("%v", this.Create), "Offer_Operation_Create", "Offer_Operation_Create", 1) + `,`, + `Destroy:` + strings.Replace(fmt.Sprintf("%v", this.Destroy), "Offer_Operation_Destroy", "Offer_Operation_Destroy", 1) + `,`, + `LaunchGroup:` + strings.Replace(fmt.Sprintf("%v", this.LaunchGroup), "Offer_Operation_LaunchGroup", "Offer_Operation_LaunchGroup", 1) + `,`, + `ID:` + strings.Replace(fmt.Sprintf("%v", this.ID), "OperationID", "OperationID", 1) + `,`, + `GrowVolume:` + strings.Replace(fmt.Sprintf("%v", this.GrowVolume), "Offer_Operation_GrowVolume", "Offer_Operation_GrowVolume", 1) + `,`, + `ShrinkVolume:` + strings.Replace(fmt.Sprintf("%v", this.ShrinkVolume), "Offer_Operation_ShrinkVolume", "Offer_Operation_ShrinkVolume", 1) + `,`, + `CreateDisk:` + strings.Replace(fmt.Sprintf("%v", this.CreateDisk), "Offer_Operation_CreateDisk", "Offer_Operation_CreateDisk", 1) + `,`, + `DestroyDisk:` + strings.Replace(fmt.Sprintf("%v", this.DestroyDisk), "Offer_Operation_DestroyDisk", "Offer_Operation_DestroyDisk", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_Launch) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_Launch{`, + `TaskInfos:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.TaskInfos), "TaskInfo", "TaskInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_LaunchGroup) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_LaunchGroup{`, + `Executor:` + strings.Replace(strings.Replace(this.Executor.String(), "ExecutorInfo", "ExecutorInfo", 1), `&`, ``, 1) + `,`, + `TaskGroup:` + strings.Replace(strings.Replace(this.TaskGroup.String(), "TaskGroupInfo", "TaskGroupInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_Reserve) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_Reserve{`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_Unreserve) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_Unreserve{`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_Create) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_Create{`, + `Volumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Volumes), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_Destroy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_Destroy{`, + `Volumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Volumes), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_GrowVolume) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_GrowVolume{`, + `Volume:` + strings.Replace(strings.Replace(this.Volume.String(), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Addition:` + strings.Replace(strings.Replace(this.Addition.String(), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_ShrinkVolume) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_ShrinkVolume{`, + `Volume:` + strings.Replace(strings.Replace(this.Volume.String(), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Subtract:` + strings.Replace(strings.Replace(this.Subtract.String(), "Value_Scalar", "Value_Scalar", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_CreateDisk) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_CreateDisk{`, + `Source:` + strings.Replace(strings.Replace(this.Source.String(), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `TargetType:` + fmt.Sprintf("%v", this.TargetType) + `,`, + `}`, + }, "") + return s +} +func (this *Offer_Operation_DestroyDisk) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Offer_Operation_DestroyDisk{`, + `Source:` + strings.Replace(strings.Replace(this.Source.String(), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *InverseOffer) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&InverseOffer{`, + `OfferID:` + strings.Replace(strings.Replace(this.OfferID.String(), "OfferID", "OfferID", 1), `&`, ``, 1) + `,`, + `URL:` + strings.Replace(fmt.Sprintf("%v", this.URL), "URL", "URL", 1) + `,`, + `FrameworkID:` + strings.Replace(strings.Replace(this.FrameworkID.String(), "FrameworkID", "FrameworkID", 1), `&`, ``, 1) + `,`, + `AgentID:` + strings.Replace(fmt.Sprintf("%v", this.AgentID), "AgentID", "AgentID", 1) + `,`, + `Unavailability:` + strings.Replace(strings.Replace(this.Unavailability.String(), "Unavailability", "Unavailability", 1), `&`, ``, 1) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *TaskInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TaskInfo{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `TaskID:` + strings.Replace(strings.Replace(this.TaskID.String(), "TaskID", "TaskID", 1), `&`, ``, 1) + `,`, + `AgentID:` + strings.Replace(strings.Replace(this.AgentID.String(), "AgentID", "AgentID", 1), `&`, ``, 1) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Executor:` + strings.Replace(fmt.Sprintf("%v", this.Executor), "ExecutorInfo", "ExecutorInfo", 1) + `,`, + `Data:` + valueToStringMesos(this.Data) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CommandInfo", "CommandInfo", 1) + `,`, + `HealthCheck:` + strings.Replace(fmt.Sprintf("%v", this.HealthCheck), "HealthCheck", "HealthCheck", 1) + `,`, + `Container:` + strings.Replace(fmt.Sprintf("%v", this.Container), "ContainerInfo", "ContainerInfo", 1) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `Discovery:` + strings.Replace(fmt.Sprintf("%v", this.Discovery), "DiscoveryInfo", "DiscoveryInfo", 1) + `,`, + `KillPolicy:` + strings.Replace(fmt.Sprintf("%v", this.KillPolicy), "KillPolicy", "KillPolicy", 1) + `,`, + `Check:` + strings.Replace(fmt.Sprintf("%v", this.Check), "CheckInfo", "CheckInfo", 1) + `,`, + `MaxCompletionTime:` + strings.Replace(fmt.Sprintf("%v", this.MaxCompletionTime), "DurationInfo", "DurationInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *TaskGroupInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TaskGroupInfo{`, + `Tasks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Tasks), "TaskInfo", "TaskInfo", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Task) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Task{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `TaskID:` + strings.Replace(strings.Replace(this.TaskID.String(), "TaskID", "TaskID", 1), `&`, ``, 1) + `,`, + `FrameworkID:` + strings.Replace(strings.Replace(this.FrameworkID.String(), "FrameworkID", "FrameworkID", 1), `&`, ``, 1) + `,`, + `ExecutorID:` + strings.Replace(fmt.Sprintf("%v", this.ExecutorID), "ExecutorID", "ExecutorID", 1) + `,`, + `AgentID:` + strings.Replace(strings.Replace(this.AgentID.String(), "AgentID", "AgentID", 1), `&`, ``, 1) + `,`, + `State:` + valueToStringMesos(this.State) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `Statuses:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Statuses), "TaskStatus", "TaskStatus", 1), `&`, ``, 1) + `,`, + `StatusUpdateState:` + valueToStringMesos(this.StatusUpdateState) + `,`, + `StatusUpdateUUID:` + valueToStringMesos(this.StatusUpdateUUID) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `Discovery:` + strings.Replace(fmt.Sprintf("%v", this.Discovery), "DiscoveryInfo", "DiscoveryInfo", 1) + `,`, + `Container:` + strings.Replace(fmt.Sprintf("%v", this.Container), "ContainerInfo", "ContainerInfo", 1) + `,`, + `User:` + valueToStringMesos(this.User) + `,`, + `}`, + }, "") + return s +} +func (this *TaskResourceLimitation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TaskResourceLimitation{`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *UUID) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UUID{`, + `Value:` + valueToStringMesos(this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *Operation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Operation{`, + `FrameworkID:` + strings.Replace(fmt.Sprintf("%v", this.FrameworkID), "FrameworkID", "FrameworkID", 1) + `,`, + `AgentID:` + strings.Replace(fmt.Sprintf("%v", this.AgentID), "AgentID", "AgentID", 1) + `,`, + `Info:` + strings.Replace(strings.Replace(this.Info.String(), "Offer_Operation", "Offer_Operation", 1), `&`, ``, 1) + `,`, + `LatestStatus:` + strings.Replace(strings.Replace(this.LatestStatus.String(), "OperationStatus", "OperationStatus", 1), `&`, ``, 1) + `,`, + `Statuses:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Statuses), "OperationStatus", "OperationStatus", 1), `&`, ``, 1) + `,`, + `UUID:` + strings.Replace(strings.Replace(this.UUID.String(), "UUID", "UUID", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *OperationStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&OperationStatus{`, + `OperationID:` + strings.Replace(fmt.Sprintf("%v", this.OperationID), "OperationID", "OperationID", 1) + `,`, + `State:` + fmt.Sprintf("%v", this.State) + `,`, + `Message:` + valueToStringMesos(this.Message) + `,`, + `ConvertedResources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ConvertedResources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `UUID:` + strings.Replace(fmt.Sprintf("%v", this.UUID), "UUID", "UUID", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CheckStatusInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckStatusInfo{`, + `Type:` + valueToStringMesos(this.Type) + `,`, + `Command:` + strings.Replace(fmt.Sprintf("%v", this.Command), "CheckStatusInfo_Command", "CheckStatusInfo_Command", 1) + `,`, + `HTTP:` + strings.Replace(fmt.Sprintf("%v", this.HTTP), "CheckStatusInfo_Http", "CheckStatusInfo_Http", 1) + `,`, + `TCP:` + strings.Replace(fmt.Sprintf("%v", this.TCP), "CheckStatusInfo_Tcp", "CheckStatusInfo_Tcp", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CheckStatusInfo_Command) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckStatusInfo_Command{`, + `ExitCode:` + valueToStringMesos(this.ExitCode) + `,`, + `}`, + }, "") + return s +} +func (this *CheckStatusInfo_Http) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckStatusInfo_Http{`, + `StatusCode:` + valueToStringMesos(this.StatusCode) + `,`, + `}`, + }, "") + return s +} +func (this *CheckStatusInfo_Tcp) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CheckStatusInfo_Tcp{`, + `Succeeded:` + valueToStringMesos(this.Succeeded) + `,`, + `}`, + }, "") + return s +} +func (this *TaskStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TaskStatus{`, + `TaskID:` + strings.Replace(strings.Replace(this.TaskID.String(), "TaskID", "TaskID", 1), `&`, ``, 1) + `,`, + `State:` + valueToStringMesos(this.State) + `,`, + `Data:` + valueToStringMesos(this.Data) + `,`, + `Message:` + valueToStringMesos(this.Message) + `,`, + `AgentID:` + strings.Replace(fmt.Sprintf("%v", this.AgentID), "AgentID", "AgentID", 1) + `,`, + `Timestamp:` + valueToStringMesos(this.Timestamp) + `,`, + `ExecutorID:` + strings.Replace(fmt.Sprintf("%v", this.ExecutorID), "ExecutorID", "ExecutorID", 1) + `,`, + `Healthy:` + valueToStringMesos(this.Healthy) + `,`, + `Source:` + valueToStringMesos(this.Source) + `,`, + `Reason:` + valueToStringMesos(this.Reason) + `,`, + `UUID:` + valueToStringMesos(this.UUID) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `ContainerStatus:` + strings.Replace(fmt.Sprintf("%v", this.ContainerStatus), "ContainerStatus", "ContainerStatus", 1) + `,`, + `UnreachableTime:` + strings.Replace(fmt.Sprintf("%v", this.UnreachableTime), "TimeInfo", "TimeInfo", 1) + `,`, + `CheckStatus:` + strings.Replace(fmt.Sprintf("%v", this.CheckStatus), "CheckStatusInfo", "CheckStatusInfo", 1) + `,`, + `Limitation:` + strings.Replace(fmt.Sprintf("%v", this.Limitation), "TaskResourceLimitation", "TaskResourceLimitation", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Filters) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Filters{`, + `RefuseSeconds:` + valueToStringMesos(this.RefuseSeconds) + `,`, + `}`, + }, "") + return s +} +func (this *Environment) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Environment{`, + `Variables:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Variables), "Environment_Variable", "Environment_Variable", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Environment_Variable) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Environment_Variable{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Value:` + valueToStringMesos(this.Value) + `,`, + `Type:` + valueToStringMesos(this.Type) + `,`, + `Secret:` + strings.Replace(fmt.Sprintf("%v", this.Secret), "Secret", "Secret", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Parameter) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Parameter{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *Parameters) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Parameters{`, + `Parameter:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Parameter), "Parameter", "Parameter", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Credential) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Credential{`, + `Principal:` + fmt.Sprintf("%v", this.Principal) + `,`, + `Secret:` + valueToStringMesos(this.Secret) + `,`, + `}`, + }, "") + return s +} +func (this *Credentials) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Credentials{`, + `Credentials:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Credentials), "Credential", "Credential", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Secret) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Secret{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Reference:` + strings.Replace(fmt.Sprintf("%v", this.Reference), "Secret_Reference", "Secret_Reference", 1) + `,`, + `Value:` + strings.Replace(fmt.Sprintf("%v", this.Value), "Secret_Value", "Secret_Value", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Secret_Reference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Secret_Reference{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Key:` + valueToStringMesos(this.Key) + `,`, + `}`, + }, "") + return s +} +func (this *Secret_Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Secret_Value{`, + `Data:` + valueToStringMesos(this.Data) + `,`, + `}`, + }, "") + return s +} +func (this *RateLimit) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RateLimit{`, + `QPS:` + valueToStringMesos(this.QPS) + `,`, + `Principal:` + fmt.Sprintf("%v", this.Principal) + `,`, + `Capacity:` + valueToStringMesos(this.Capacity) + `,`, + `}`, + }, "") + return s +} +func (this *RateLimits) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RateLimits{`, + `Limits:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Limits), "RateLimit", "RateLimit", 1), `&`, ``, 1) + `,`, + `AggregateDefaultQPS:` + valueToStringMesos(this.AggregateDefaultQPS) + `,`, + `AggregateDefaultCapacity:` + valueToStringMesos(this.AggregateDefaultCapacity) + `,`, + `}`, + }, "") + return s +} +func (this *Image) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Image{`, + `Type:` + valueToStringMesos(this.Type) + `,`, + `Appc:` + strings.Replace(fmt.Sprintf("%v", this.Appc), "Image_Appc", "Image_Appc", 1) + `,`, + `Docker:` + strings.Replace(fmt.Sprintf("%v", this.Docker), "Image_Docker", "Image_Docker", 1) + `,`, + `Cached:` + valueToStringMesos(this.Cached) + `,`, + `}`, + }, "") + return s +} +func (this *Image_Appc) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Image_Appc{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `ID:` + valueToStringMesos(this.ID) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Image_Docker) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Image_Docker{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Credential:` + strings.Replace(fmt.Sprintf("%v", this.Credential), "Credential", "Credential", 1) + `,`, + `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "Secret", "Secret", 1) + `,`, + `}`, + }, "") + return s +} +func (this *MountPropagation) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MountPropagation{`, + `Mode:` + valueToStringMesos(this.Mode) + `,`, + `}`, + }, "") + return s +} +func (this *Volume) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Volume{`, + `ContainerPath:` + fmt.Sprintf("%v", this.ContainerPath) + `,`, + `HostPath:` + valueToStringMesos(this.HostPath) + `,`, + `Mode:` + valueToStringMesos(this.Mode) + `,`, + `Image:` + strings.Replace(fmt.Sprintf("%v", this.Image), "Image", "Image", 1) + `,`, + `Source:` + strings.Replace(fmt.Sprintf("%v", this.Source), "Volume_Source", "Volume_Source", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Volume_Source) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Volume_Source{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `DockerVolume:` + strings.Replace(fmt.Sprintf("%v", this.DockerVolume), "Volume_Source_DockerVolume", "Volume_Source_DockerVolume", 1) + `,`, + `SandboxPath:` + strings.Replace(fmt.Sprintf("%v", this.SandboxPath), "Volume_Source_SandboxPath", "Volume_Source_SandboxPath", 1) + `,`, + `Secret:` + strings.Replace(fmt.Sprintf("%v", this.Secret), "Secret", "Secret", 1) + `,`, + `HostPath:` + strings.Replace(fmt.Sprintf("%v", this.HostPath), "Volume_Source_HostPath", "Volume_Source_HostPath", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Volume_Source_DockerVolume) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Volume_Source_DockerVolume{`, + `Driver:` + valueToStringMesos(this.Driver) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `DriverOptions:` + strings.Replace(fmt.Sprintf("%v", this.DriverOptions), "Parameters", "Parameters", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Volume_Source_HostPath) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Volume_Source_HostPath{`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `MountPropagation:` + strings.Replace(fmt.Sprintf("%v", this.MountPropagation), "MountPropagation", "MountPropagation", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Volume_Source_SandboxPath) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Volume_Source_SandboxPath{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `}`, + }, "") + return s +} +func (this *NetworkInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NetworkInfo{`, + `Groups:` + fmt.Sprintf("%v", this.Groups) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `IPAddresses:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IPAddresses), "NetworkInfo_IPAddress", "NetworkInfo_IPAddress", 1), `&`, ``, 1) + `,`, + `Name:` + valueToStringMesos(this.Name) + `,`, + `PortMappings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.PortMappings), "NetworkInfo_PortMapping", "NetworkInfo_PortMapping", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *NetworkInfo_IPAddress) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NetworkInfo_IPAddress{`, + `Protocol:` + valueToStringMesos(this.Protocol) + `,`, + `IPAddress:` + valueToStringMesos(this.IPAddress) + `,`, + `}`, + }, "") + return s +} +func (this *NetworkInfo_PortMapping) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NetworkInfo_PortMapping{`, + `HostPort:` + fmt.Sprintf("%v", this.HostPort) + `,`, + `ContainerPort:` + fmt.Sprintf("%v", this.ContainerPort) + `,`, + `Protocol:` + valueToStringMesos(this.Protocol) + `,`, + `}`, + }, "") + return s +} +func (this *CapabilityInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CapabilityInfo{`, + `Capabilities:` + fmt.Sprintf("%v", this.Capabilities) + `,`, + `}`, + }, "") + return s +} +func (this *LinuxInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&LinuxInfo{`, + `CapabilityInfo:` + strings.Replace(fmt.Sprintf("%v", this.CapabilityInfo), "CapabilityInfo", "CapabilityInfo", 1) + `,`, + `BoundingCapabilities:` + strings.Replace(fmt.Sprintf("%v", this.BoundingCapabilities), "CapabilityInfo", "CapabilityInfo", 1) + `,`, + `EffectiveCapabilities:` + strings.Replace(fmt.Sprintf("%v", this.EffectiveCapabilities), "CapabilityInfo", "CapabilityInfo", 1) + `,`, + `SharePIDNamespace:` + valueToStringMesos(this.SharePIDNamespace) + `,`, + `}`, + }, "") + return s +} +func (this *RLimitInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RLimitInfo{`, + `Rlimits:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Rlimits), "RLimitInfo_RLimit", "RLimitInfo_RLimit", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *RLimitInfo_RLimit) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RLimitInfo_RLimit{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Hard:` + valueToStringMesos(this.Hard) + `,`, + `Soft:` + valueToStringMesos(this.Soft) + `,`, + `}`, + }, "") + return s +} +func (this *TTYInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TTYInfo{`, + `WindowSize:` + strings.Replace(fmt.Sprintf("%v", this.WindowSize), "TTYInfo_WindowSize", "TTYInfo_WindowSize", 1) + `,`, + `}`, + }, "") + return s +} +func (this *TTYInfo_WindowSize) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TTYInfo_WindowSize{`, + `Rows:` + fmt.Sprintf("%v", this.Rows) + `,`, + `Columns:` + fmt.Sprintf("%v", this.Columns) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerInfo{`, + `Type:` + valueToStringMesos(this.Type) + `,`, + `Volumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Volumes), "Volume", "Volume", 1), `&`, ``, 1) + `,`, + `Docker:` + strings.Replace(fmt.Sprintf("%v", this.Docker), "ContainerInfo_DockerInfo", "ContainerInfo_DockerInfo", 1) + `,`, + `Hostname:` + valueToStringMesos(this.Hostname) + `,`, + `Mesos:` + strings.Replace(fmt.Sprintf("%v", this.Mesos), "ContainerInfo_MesosInfo", "ContainerInfo_MesosInfo", 1) + `,`, + `NetworkInfos:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.NetworkInfos), "NetworkInfo", "NetworkInfo", 1), `&`, ``, 1) + `,`, + `LinuxInfo:` + strings.Replace(fmt.Sprintf("%v", this.LinuxInfo), "LinuxInfo", "LinuxInfo", 1) + `,`, + `RlimitInfo:` + strings.Replace(fmt.Sprintf("%v", this.RlimitInfo), "RLimitInfo", "RLimitInfo", 1) + `,`, + `TTYInfo:` + strings.Replace(fmt.Sprintf("%v", this.TTYInfo), "TTYInfo", "TTYInfo", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerInfo_DockerInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerInfo_DockerInfo{`, + `Image:` + fmt.Sprintf("%v", this.Image) + `,`, + `Network:` + valueToStringMesos(this.Network) + `,`, + `PortMappings:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.PortMappings), "ContainerInfo_DockerInfo_PortMapping", "ContainerInfo_DockerInfo_PortMapping", 1), `&`, ``, 1) + `,`, + `Privileged:` + valueToStringMesos(this.Privileged) + `,`, + `Parameters:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Parameters), "Parameter", "Parameter", 1), `&`, ``, 1) + `,`, + `ForcePullImage:` + valueToStringMesos(this.ForcePullImage) + `,`, + `VolumeDriver:` + valueToStringMesos(this.VolumeDriver) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerInfo_DockerInfo_PortMapping) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerInfo_DockerInfo_PortMapping{`, + `HostPort:` + fmt.Sprintf("%v", this.HostPort) + `,`, + `ContainerPort:` + fmt.Sprintf("%v", this.ContainerPort) + `,`, + `Protocol:` + valueToStringMesos(this.Protocol) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerInfo_MesosInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerInfo_MesosInfo{`, + `Image:` + strings.Replace(fmt.Sprintf("%v", this.Image), "Image", "Image", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ContainerStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerStatus{`, + `NetworkInfos:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.NetworkInfos), "NetworkInfo", "NetworkInfo", 1), `&`, ``, 1) + `,`, + `CgroupInfo:` + strings.Replace(fmt.Sprintf("%v", this.CgroupInfo), "CgroupInfo", "CgroupInfo", 1) + `,`, + `ExecutorPID:` + valueToStringMesos(this.ExecutorPID) + `,`, + `ContainerID:` + strings.Replace(fmt.Sprintf("%v", this.ContainerID), "ContainerID", "ContainerID", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CgroupInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo{`, + `NetCLS:` + strings.Replace(fmt.Sprintf("%v", this.NetCLS), "CgroupInfo_NetCls", "CgroupInfo_NetCls", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_Blkio) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_Blkio{`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_Blkio_Value) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_Blkio_Value{`, + `Op:` + valueToStringMesos(this.Op) + `,`, + `Value:` + valueToStringMesos(this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_Blkio_CFQ) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_Blkio_CFQ{`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_Blkio_CFQ_Statistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_Blkio_CFQ_Statistics{`, + `Device:` + strings.Replace(fmt.Sprintf("%v", this.Device), "Device_Number", "Device_Number", 1) + `,`, + `Sectors:` + valueToStringMesos(this.Sectors) + `,`, + `Time:` + valueToStringMesos(this.Time) + `,`, + `IOServiced:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOServiced), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `IOServiceBytes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOServiceBytes), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `IOServiceTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOServiceTime), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `IOWaitTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOWaitTime), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `IOMerged:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOMerged), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `IOQueued:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOQueued), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_Blkio_Throttling) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_Blkio_Throttling{`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_Blkio_Throttling_Statistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_Blkio_Throttling_Statistics{`, + `Device:` + strings.Replace(fmt.Sprintf("%v", this.Device), "Device_Number", "Device_Number", 1) + `,`, + `IOServiced:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOServiced), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `IOServiceBytes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.IOServiceBytes), "CgroupInfo_Blkio_Value", "CgroupInfo_Blkio_Value", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_Blkio_Statistics) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_Blkio_Statistics{`, + `CFQ:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.CFQ), "CgroupInfo_Blkio_CFQ_Statistics", "CgroupInfo_Blkio_CFQ_Statistics", 1), `&`, ``, 1) + `,`, + `CFQRecursive:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.CFQRecursive), "CgroupInfo_Blkio_CFQ_Statistics", "CgroupInfo_Blkio_CFQ_Statistics", 1), `&`, ``, 1) + `,`, + `Throttling:` + strings.Replace(fmt.Sprintf("%v", this.Throttling), "CgroupInfo_Blkio_Throttling_Statistics", "CgroupInfo_Blkio_Throttling_Statistics", 1) + `,`, + `}`, + }, "") + return s +} +func (this *CgroupInfo_NetCls) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CgroupInfo_NetCls{`, + `ClassID:` + valueToStringMesos(this.ClassID) + `,`, + `}`, + }, "") + return s +} +func (this *Labels) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Labels{`, + `Labels:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Labels), "Label", "Label", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Label) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Label{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Value:` + valueToStringMesos(this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *Port) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Port{`, + `Number:` + fmt.Sprintf("%v", this.Number) + `,`, + `Name:` + valueToStringMesos(this.Name) + `,`, + `Protocol:` + valueToStringMesos(this.Protocol) + `,`, + `Visibility:` + valueToStringMesos(this.Visibility) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Ports) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Ports{`, + `Ports:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Ports), "Port", "Port", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DiscoveryInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DiscoveryInfo{`, + `Visibility:` + fmt.Sprintf("%v", this.Visibility) + `,`, + `Name:` + valueToStringMesos(this.Name) + `,`, + `Environment:` + valueToStringMesos(this.Environment) + `,`, + `Location:` + valueToStringMesos(this.Location) + `,`, + `Version:` + valueToStringMesos(this.Version) + `,`, + `Ports:` + strings.Replace(fmt.Sprintf("%v", this.Ports), "Ports", "Ports", 1) + `,`, + `Labels:` + strings.Replace(fmt.Sprintf("%v", this.Labels), "Labels", "Labels", 1) + `,`, + `}`, + }, "") + return s +} +func (this *WeightInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&WeightInfo{`, + `Weight:` + fmt.Sprintf("%v", this.Weight) + `,`, + `Role:` + valueToStringMesos(this.Role) + `,`, + `}`, + }, "") + return s +} +func (this *VersionInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VersionInfo{`, + `Version:` + fmt.Sprintf("%v", this.Version) + `,`, + `BuildDate:` + valueToStringMesos(this.BuildDate) + `,`, + `BuildTime:` + valueToStringMesos(this.BuildTime) + `,`, + `BuildUser:` + valueToStringMesos(this.BuildUser) + `,`, + `GitSHA:` + valueToStringMesos(this.GitSHA) + `,`, + `GitBranch:` + valueToStringMesos(this.GitBranch) + `,`, + `GitTag:` + valueToStringMesos(this.GitTag) + `,`, + `}`, + }, "") + return s +} +func (this *Flag) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Flag{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Value:` + valueToStringMesos(this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *Role) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Role{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Weight:` + fmt.Sprintf("%v", this.Weight) + `,`, + `Frameworks:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Frameworks), "FrameworkID", "FrameworkID", 1), `&`, ``, 1) + `,`, + `Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "Resource", "Resource", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *Metric) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Metric{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Value:` + valueToStringMesos(this.Value) + `,`, + `}`, + }, "") + return s +} +func (this *FileInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&FileInfo{`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `Nlink:` + valueToStringMesos(this.Nlink) + `,`, + `Size:` + valueToStringMesos(this.Size) + `,`, + `Mtime:` + strings.Replace(fmt.Sprintf("%v", this.Mtime), "TimeInfo", "TimeInfo", 1) + `,`, + `Mode:` + valueToStringMesos(this.Mode) + `,`, + `UID:` + valueToStringMesos(this.UID) + `,`, + `GID:` + valueToStringMesos(this.GID) + `,`, + `}`, + }, "") + return s +} +func (this *Device) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Device{`, + `Path:` + valueToStringMesos(this.Path) + `,`, + `Number:` + strings.Replace(fmt.Sprintf("%v", this.Number), "Device_Number", "Device_Number", 1) + `,`, + `}`, + }, "") + return s +} +func (this *Device_Number) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Device_Number{`, + `MajorNumber:` + valueToStringMesos(this.MajorNumber) + `,`, + `MinorNumber:` + valueToStringMesos(this.MinorNumber) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAccess) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceAccess{`, + `Device:` + strings.Replace(strings.Replace(this.Device.String(), "Device", "Device", 1), `&`, ``, 1) + `,`, + `Access:` + strings.Replace(strings.Replace(this.Access.String(), "DeviceAccess_Access", "DeviceAccess_Access", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceAccess_Access) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceAccess_Access{`, + `Read:` + valueToStringMesos(this.Read) + `,`, + `Write:` + valueToStringMesos(this.Write) + `,`, + `Mknod:` + valueToStringMesos(this.Mknod) + `,`, + `}`, + }, "") + return s +} +func (this *DeviceWhitelist) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DeviceWhitelist{`, + `AllowedDevices:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedDevices), "DeviceAccess", "DeviceAccess", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func valueToStringMesos(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *FrameworkID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FrameworkID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FrameworkID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OfferID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OfferID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OfferID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AgentID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AgentID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AgentID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TaskID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TaskID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TaskID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExecutorID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExecutorID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExecutorID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parent", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Parent == nil { + m.Parent = &ContainerID{} + } + if err := m.Parent.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceProviderID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceProviderID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceProviderID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OperationID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OperationID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OperationID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimeInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimeInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimeInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nanoseconds", wireType) + } + m.Nanoseconds = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nanoseconds |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("nanoseconds") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DurationInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DurationInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DurationInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nanoseconds", wireType) + } + m.Nanoseconds = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nanoseconds |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("nanoseconds") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Address) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Address: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Address: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Hostname = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IP", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.IP = &s + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *URL) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: URL: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: URL: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scheme", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Scheme = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Address.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Path = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Query = append(m.Query, Parameter{}) + if err := m.Query[len(m.Query)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fragment", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Fragment = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("scheme") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("address") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Unavailability) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Unavailability: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Unavailability: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Start.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Duration == nil { + m.Duration = &DurationInfo{} + } + if err := m.Duration.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("start") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineID) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Hostname = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IP", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.IP = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MachineInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MachineInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MachineInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + var v MachineInfo_Mode + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (MachineInfo_Mode(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Mode = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Unavailability", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Unavailability == nil { + m.Unavailability = &Unavailability{} + } + if err := m.Unavailability.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FrameworkInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FrameworkInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FrameworkInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ID == nil { + m.ID = &FrameworkID{} + } + if err := m.ID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field FailoverTimeout", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.FailoverTimeout = &v2 + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Checkpoint", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Checkpoint = &b + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Role = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Hostname = &s + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Principal", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Principal = &s + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WebUiURL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.WebUiURL = &s + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capabilities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Capabilities = append(m.Capabilities, FrameworkInfo_Capability{}) + if err := m.Capabilities[len(m.Capabilities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("user") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FrameworkInfo_Capability) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Capability: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Capability: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (FrameworkInfo_Capability_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CheckInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CheckInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (CheckInfo_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &CheckInfo_Command{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HTTP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.HTTP == nil { + m.HTTP = &CheckInfo_Http{} + } + if err := m.HTTP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field DelaySeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.DelaySeconds = &v2 + case 5: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field IntervalSeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.IntervalSeconds = &v2 + case 6: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.TimeoutSeconds = &v2 + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TCP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TCP == nil { + m.TCP = &CheckInfo_Tcp{} + } + if err := m.TCP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckInfo_Command) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Command: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Command: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("command") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckInfo_Http) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Http: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Http: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Path = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckInfo_Tcp) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Tcp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Tcp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HealthCheck) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HealthCheck: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HealthCheck: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HTTP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.HTTP == nil { + m.HTTP = &HealthCheck_HTTPCheckInfo{} + } + if err := m.HTTP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field DelaySeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.DelaySeconds = &v2 + case 3: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field IntervalSeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.IntervalSeconds = &v2 + case 4: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.TimeoutSeconds = &v2 + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsecutiveFailures", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ConsecutiveFailures = &v + case 6: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field GracePeriodSeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.GracePeriodSeconds = &v2 + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &CommandInfo{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (HealthCheck_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TCP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TCP == nil { + m.TCP = &HealthCheck_TCPCheckInfo{} + } + if err := m.TCP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HealthCheck_HTTPCheckInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HTTPCheckInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HTTPCheckInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Path = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scheme", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Scheme = &s + iNdEx = postIndex + case 4: + if wireType == 0 { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Statuses = append(m.Statuses, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Statuses = append(m.Statuses, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Statuses", wireType) + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var v NetworkInfo_Protocol + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (NetworkInfo_Protocol(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Protocol = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HealthCheck_TCPCheckInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TCPCheckInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TCPCheckInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var v NetworkInfo_Protocol + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (NetworkInfo_Protocol(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Protocol = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *KillPolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: KillPolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: KillPolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GracePeriod", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GracePeriod == nil { + m.GracePeriod = &DurationInfo{} + } + if err := m.GracePeriod.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CommandInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CommandInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CommandInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URIs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URIs = append(m.URIs, CommandInfo_URI{}) + if err := m.URIs[len(m.URIs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Environment == nil { + m.Environment = &Environment{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Value = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.User = &s + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Shell", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Shell = &b + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Arguments = append(m.Arguments, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CommandInfo_URI) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: URI: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: URI: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Executable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Executable = &b + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Extract", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Extract = &b + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Cache", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Cache = &b + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OutputFile", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.OutputFile = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExecutorInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExecutorInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExecutorInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ExecutorID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &CommandInfo{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.FrameworkID == nil { + m.FrameworkID = &FrameworkID{} + } + if err := m.FrameworkID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Source = &s + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Container == nil { + m.Container = &ContainerInfo{} + } + if err := m.Container.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Discovery", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Discovery == nil { + m.Discovery = &DiscoveryInfo{} + } + if err := m.Discovery.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShutdownGracePeriod", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ShutdownGracePeriod == nil { + m.ShutdownGracePeriod = &DurationInfo{} + } + if err := m.ShutdownGracePeriod.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (ExecutorInfo_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("executor_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DomainInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DomainInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DomainInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FaultDomain", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.FaultDomain == nil { + m.FaultDomain = &DomainInfo_FaultDomain{} + } + if err := m.FaultDomain.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DomainInfo_FaultDomain) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FaultDomain: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FaultDomain: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Region", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Region.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Zone", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Zone.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("region") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("zone") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DomainInfo_FaultDomain_RegionInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RegionInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RegionInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DomainInfo_FaultDomain_ZoneInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ZoneInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ZoneInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MasterInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MasterInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MasterInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IP", wireType) + } + m.IP = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.IP |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Port = &v + hasFields[0] |= uint64(0x00000004) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.PID = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Hostname = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Version = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Address == nil { + m.Address = &Address{} + } + if err := m.Address.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Domain", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Domain == nil { + m.Domain = &DomainInfo{} + } + if err := m.Domain.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Capabilities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Capabilities = append(m.Capabilities, MasterInfo_Capability{}) + if err := m.Capabilities[len(m.Capabilities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("ip") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MasterInfo_Capability) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Capability: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Capability: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (MasterInfo_Capability_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AgentInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AgentInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AgentInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Attributes = append(m.Attributes, Attribute{}) + if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ID == nil { + m.ID = &AgentID{} + } + if err := m.ID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Port = &v + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Domain", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Domain == nil { + m.Domain = &DomainInfo{} + } + if err := m.Domain.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("hostname") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AgentInfo_Capability) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Capability: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Capability: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (AgentInfo_Capability_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CSIPluginContainerInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CSIPluginContainerInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CSIPluginContainerInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v CSIPluginContainerInfo_Service + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (CSIPluginContainerInfo_Service(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Services = append(m.Services, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v CSIPluginContainerInfo_Service + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (CSIPluginContainerInfo_Service(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Services = append(m.Services, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Services", wireType) + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &CommandInfo{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Container == nil { + m.Container = &ContainerInfo{} + } + if err := m.Container.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CSIPluginInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CSIPluginInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CSIPluginInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Containers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Containers = append(m.Containers, CSIPluginContainerInfo{}) + if err := m.Containers[len(m.Containers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceProviderInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceProviderInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceProviderInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ID == nil { + m.ID = &ResourceProviderID{} + } + if err := m.ID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Attributes = append(m.Attributes, Attribute{}) + if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultReservations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultReservations = append(m.DefaultReservations, Resource_ReservationInfo{}) + if err := m.DefaultReservations[len(m.DefaultReservations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Storage", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Storage == nil { + m.Storage = &ResourceProviderInfo_Storage{} + } + if err := m.Storage.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceProviderInfo_Storage) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Storage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Storage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Plugin", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Plugin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("plugin") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Value) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Value_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scalar", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Scalar == nil { + m.Scalar = &Value_Scalar{} + } + if err := m.Scalar.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ranges", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ranges == nil { + m.Ranges = &Value_Ranges{} + } + if err := m.Ranges.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Set", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Set == nil { + m.Set = &Value_Set{} + } + if err := m.Set.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Text == nil { + m.Text = &Value_Text{} + } + if err := m.Text.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Value_Scalar) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Scalar: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Scalar: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + m.Value = float64(math.Float64frombits(v)) + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Value_Range) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Range: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Range: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Begin", wireType) + } + m.Begin = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Begin |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field End", wireType) + } + m.End = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.End |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("begin") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("end") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Value_Ranges) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ranges: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ranges: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Range", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Range = append(m.Range, Value_Range{}) + if err := m.Range[len(m.Range)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Value_Set) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Set: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Set: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Item", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Item = append(m.Item, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Value_Text) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Text: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Text: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Attribute) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Attribute: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Attribute: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Value_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scalar", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Scalar == nil { + m.Scalar = &Value_Scalar{} + } + if err := m.Scalar.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ranges", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ranges == nil { + m.Ranges = &Value_Ranges{} + } + if err := m.Ranges.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Text", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Text == nil { + m.Text = &Value_Text{} + } + if err := m.Text.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Set", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Set == nil { + m.Set = &Value_Set{} + } + if err := m.Set.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Resource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Resource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v Value_Type + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (Value_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scalar", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Scalar == nil { + m.Scalar = &Value_Scalar{} + } + if err := m.Scalar.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ranges", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ranges == nil { + m.Ranges = &Value_Ranges{} + } + if err := m.Ranges.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Set", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Set == nil { + m.Set = &Value_Set{} + } + if err := m.Set.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Role = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Disk", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Disk == nil { + m.Disk = &Resource_DiskInfo{} + } + if err := m.Disk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reservation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Reservation == nil { + m.Reservation = &Resource_ReservationInfo{} + } + if err := m.Reservation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Revocable", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Revocable == nil { + m.Revocable = &Resource_RevocableInfo{} + } + if err := m.Revocable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shared", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Shared == nil { + m.Shared = &Resource_SharedInfo{} + } + if err := m.Shared.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AllocationInfo == nil { + m.AllocationInfo = &Resource_AllocationInfo{} + } + if err := m.AllocationInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProviderID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ProviderID == nil { + m.ProviderID = &ResourceProviderID{} + } + if err := m.ProviderID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reservations", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reservations = append(m.Reservations, Resource_ReservationInfo{}) + if err := m.Reservations[len(m.Reservations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_AllocationInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AllocationInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AllocationInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Role = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_ReservationInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ReservationInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReservationInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Principal", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Principal = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Role = &s + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v Resource_ReservationInfo_Type + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (Resource_ReservationInfo_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_DiskInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DiskInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DiskInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Persistence", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Persistence == nil { + m.Persistence = &Resource_DiskInfo_Persistence{} + } + if err := m.Persistence.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Volume == nil { + m.Volume = &Volume{} + } + if err := m.Volume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &Resource_DiskInfo_Source{} + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_DiskInfo_Persistence) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Persistence: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Persistence: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Principal", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Principal = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_DiskInfo_Source) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Source: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Source: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Resource_DiskInfo_Source_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Path == nil { + m.Path = &Resource_DiskInfo_Source_Path{} + } + if err := m.Path.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mount", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Mount == nil { + m.Mount = &Resource_DiskInfo_Source_Mount{} + } + if err := m.Mount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ID = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Metadata == nil { + m.Metadata = &Labels{} + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Profile", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Profile = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_DiskInfo_Source_Path) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Path: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Path: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Root", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Root = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_DiskInfo_Source_Mount) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Mount: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Mount: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Root", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Root = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_RevocableInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RevocableInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RevocableInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Resource_SharedInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SharedInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SharedInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TrafficControlStatistics) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TrafficControlStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TrafficControlStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Backlog", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Backlog = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Bytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Bytes = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Drops", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Drops = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Overlimits", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Overlimits = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Packets", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Packets = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Qlen", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Qlen = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RateBPS", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RateBPS = &v + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RatePPS", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RatePPS = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Requeues", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Requeues = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IpStatistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IpStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IpStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Forwarding", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Forwarding = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultTTL", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DefaultTTL = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InReceives", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InReceives = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InHdrErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InHdrErrors = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InAddrErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InAddrErrors = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ForwDatagrams", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ForwDatagrams = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InUnknownProtos", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InUnknownProtos = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InDiscards", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InDiscards = &v + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InDelivers", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InDelivers = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutRequests", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutRequests = &v + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutDiscards", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutDiscards = &v + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutNoRoutes", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutNoRoutes = &v + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReasmTimeout", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReasmTimeout = &v + case 14: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReasmReqds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReasmReqds = &v + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReasmOKs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReasmOKs = &v + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReasmFails", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReasmFails = &v + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FragOKs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FragOKs = &v + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FragFails", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FragFails = &v + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FragCreates", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.FragCreates = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IcmpStatistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IcmpStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IcmpStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InMsgs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InMsgs = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InErrors = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InCsumErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InCsumErrors = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InDestUnreachs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InDestUnreachs = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InTimeExcds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InTimeExcds = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InParmProbs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InParmProbs = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InSrcQuenchs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InSrcQuenchs = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InRedirects", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InRedirects = &v + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InEchos", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InEchos = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InEchoReps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InEchoReps = &v + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InTimestamps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InTimestamps = &v + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InTimestampReps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InTimestampReps = &v + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InAddrMasks", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InAddrMasks = &v + case 14: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InAddrMaskReps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InAddrMaskReps = &v + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutMsgs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutMsgs = &v + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutErrors = &v + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutDestUnreachs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutDestUnreachs = &v + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutTimeExcds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutTimeExcds = &v + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutParmProbs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutParmProbs = &v + case 20: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutSrcQuenchs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutSrcQuenchs = &v + case 21: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutRedirects", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutRedirects = &v + case 22: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutEchos", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutEchos = &v + case 23: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutEchoReps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutEchoReps = &v + case 24: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutTimestamps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutTimestamps = &v + case 25: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutTimestampReps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutTimestampReps = &v + case 26: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutAddrMasks", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutAddrMasks = &v + case 27: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutAddrMaskReps", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutAddrMaskReps = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TcpStatistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TcpStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TcpStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RtoAlgorithm", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RtoAlgorithm = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RtoMin", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RtoMin = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RtoMax", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RtoMax = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxConn", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MaxConn = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ActiveOpens", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ActiveOpens = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PassiveOpens", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PassiveOpens = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AttemptFails", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AttemptFails = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EstabResets", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.EstabResets = &v + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrEstab", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CurrEstab = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InSegs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InSegs = &v + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutSegs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutSegs = &v + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RetransSegs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RetransSegs = &v + case 13: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InErrs", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InErrs = &v + case 14: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutRsts", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutRsts = &v + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InCsumErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InCsumErrors = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UdpStatistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UdpStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UdpStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InDatagrams", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InDatagrams = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NoPorts", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NoPorts = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InErrors = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field OutDatagrams", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.OutDatagrams = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RcvbufErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RcvbufErrors = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SndbufErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.SndbufErrors = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InCsumErrors", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InCsumErrors = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IgnoredMulti", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IgnoredMulti = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SNMPStatistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SNMPStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SNMPStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.IPStats == nil { + m.IPStats = &IpStatistics{} + } + if err := m.IPStats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ICMPStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ICMPStats == nil { + m.ICMPStats = &IcmpStatistics{} + } + if err := m.ICMPStats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TCPStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TCPStats == nil { + m.TCPStats = &TcpStatistics{} + } + if err := m.TCPStats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UDPStats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UDPStats == nil { + m.UDPStats = &UdpStatistics{} + } + if err := m.UDPStats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DiskStatistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DiskStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DiskStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &Resource_DiskInfo_Source{} + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Persistence", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Persistence == nil { + m.Persistence = &Resource_DiskInfo_Persistence{} + } + if err := m.Persistence.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LimitBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LimitBytes = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UsedBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.UsedBytes = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceStatistics) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + m.Timestamp = float64(math.Float64frombits(v)) + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUsUserTimeSecs", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.CPUsUserTimeSecs = &v2 + case 3: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUsSystemTimeSecs", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.CPUsSystemTimeSecs = &v2 + case 4: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUsLimit", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.CPUsLimit = &v2 + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemRSSBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemRSSBytes = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemLimitBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemLimitBytes = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUsNrPeriods", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CPUsNrPeriods = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUsNrThrottled", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CPUsNrThrottled = &v + case 9: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUsThrottledTimeSecs", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.CPUsThrottledTimeSecs = &v2 + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemFileBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemFileBytes = &v + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemAnonBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemAnonBytes = &v + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemMappedFileBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemMappedFileBytes = &v + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Perf", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Perf == nil { + m.Perf = &PerfStatistics{} + } + if err := m.Perf.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetRxPackets", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetRxPackets = &v + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetRxBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetRxBytes = &v + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetRxErrors", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetRxErrors = &v + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetRxDropped", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetRxDropped = &v + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTxPackets", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetTxPackets = &v + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTxBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetTxBytes = &v + case 20: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTxErrors", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetTxErrors = &v + case 21: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTxDropped", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NetTxDropped = &v + case 22: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTCPRttMicrosecsP50", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.NetTCPRttMicrosecsP50 = &v2 + case 23: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTCPRttMicrosecsP90", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.NetTCPRttMicrosecsP90 = &v2 + case 24: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTCPRttMicrosecsP95", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.NetTCPRttMicrosecsP95 = &v2 + case 25: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTCPRttMicrosecsP99", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.NetTCPRttMicrosecsP99 = &v2 + case 26: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DiskLimitBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DiskLimitBytes = &v + case 27: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DiskUsedBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DiskUsedBytes = &v + case 28: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTCPActiveConnections", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.NetTCPActiveConnections = &v2 + case 29: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTCPTimeWaitConnections", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.NetTCPTimeWaitConnections = &v2 + case 30: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Processes", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Processes = &v + case 31: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Threads", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Threads = &v + case 32: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemLowPressureCounter", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemLowPressureCounter = &v + case 33: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemMediumPressureCounter", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemMediumPressureCounter = &v + case 34: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemCriticalPressureCounter", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemCriticalPressureCounter = &v + case 35: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetTrafficControlStatistics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NetTrafficControlStatistics = append(m.NetTrafficControlStatistics, TrafficControlStatistics{}) + if err := m.NetTrafficControlStatistics[len(m.NetTrafficControlStatistics)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 36: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemTotalBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemTotalBytes = &v + case 37: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemTotalMemswBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemTotalMemswBytes = &v + case 38: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemSoftLimitBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemSoftLimitBytes = &v + case 39: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemCacheBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemCacheBytes = &v + case 40: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemSwapBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemSwapBytes = &v + case 41: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MemUnevictableBytes", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MemUnevictableBytes = &v + case 42: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetSNMPStatistics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NetSNMPStatistics == nil { + m.NetSNMPStatistics = &SNMPStatistics{} + } + if err := m.NetSNMPStatistics.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 43: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DiskStatistics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DiskStatistics = append(m.DiskStatistics, DiskStatistics{}) + if err := m.DiskStatistics[len(m.DiskStatistics)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 44: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BlkioStatistics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BlkioStatistics == nil { + m.BlkioStatistics = &CgroupInfo_Blkio_Statistics{} + } + if err := m.BlkioStatistics.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("timestamp") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceUsage) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceUsage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceUsage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Executors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Executors = append(m.Executors, ResourceUsage_Executor{}) + if err := m.Executors[len(m.Executors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Total", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Total = append(m.Total, Resource{}) + if err := m.Total[len(m.Total)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceUsage_Executor) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Executor: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Executor: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ExecutorInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Allocated", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Allocated = append(m.Allocated, Resource{}) + if err := m.Allocated[len(m.Allocated)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Statistics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Statistics == nil { + m.Statistics = &ResourceStatistics{} + } + if err := m.Statistics.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tasks = append(m.Tasks, ResourceUsage_Executor_Task{}) + if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("executor_info") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceUsage_Executor_Task) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Task: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Task: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PerfStatistics) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PerfStatistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PerfStatistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + m.Timestamp = float64(math.Float64frombits(v)) + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + m.Duration = float64(math.Float64frombits(v)) + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Cycles", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Cycles = &v + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StalledCyclesFrontend", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.StalledCyclesFrontend = &v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StalledCyclesBackend", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.StalledCyclesBackend = &v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Instructions", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Instructions = &v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CacheReferences", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CacheReferences = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CacheMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CacheMisses = &v + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Branches", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Branches = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BranchMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.BranchMisses = &v + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BusCycles", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.BusCycles = &v + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RefCycles", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.RefCycles = &v + case 13: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUClock", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.CPUClock = &v2 + case 14: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskClock", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.TaskClock = &v2 + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PageFaults", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PageFaults = &v + case 16: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinorFaults", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MinorFaults = &v + case 17: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MajorFaults", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MajorFaults = &v + case 18: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContextSwitches", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ContextSwitches = &v + case 19: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CPUMigrations", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CPUMigrations = &v + case 20: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AlignmentFaults", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AlignmentFaults = &v + case 21: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EmulationFaults", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.EmulationFaults = &v + case 22: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1DcacheLoads", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1DcacheLoads = &v + case 23: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1DcacheLoadMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1DcacheLoadMisses = &v + case 24: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1DcacheStores", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1DcacheStores = &v + case 25: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1DcacheStoreMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1DcacheStoreMisses = &v + case 26: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1DcachePrefetches", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1DcachePrefetches = &v + case 27: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1DcachePrefetchMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1DcachePrefetchMisses = &v + case 28: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1IcacheLoads", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1IcacheLoads = &v + case 29: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1IcacheLoadMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1IcacheLoadMisses = &v + case 30: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1IcachePrefetches", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1IcachePrefetches = &v + case 31: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field L1IcachePrefetchMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.L1IcachePrefetchMisses = &v + case 32: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LLCLoads", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LLCLoads = &v + case 33: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LLCLoadMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LLCLoadMisses = &v + case 34: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LLCStores", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LLCStores = &v + case 35: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LLCStoreMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LLCStoreMisses = &v + case 36: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LLCPrefetches", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LLCPrefetches = &v + case 37: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LLCPrefetchMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LLCPrefetchMisses = &v + case 38: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DTLBLoads", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DTLBLoads = &v + case 39: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DTLBLoadMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DTLBLoadMisses = &v + case 40: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DTLBStores", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DTLBStores = &v + case 41: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DTLBStoreMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DTLBStoreMisses = &v + case 42: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DTLBPrefetches", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DTLBPrefetches = &v + case 43: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DTLBPrefetchMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DTLBPrefetchMisses = &v + case 44: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ITLBLoads", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ITLBLoads = &v + case 45: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ITLBLoadMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ITLBLoadMisses = &v + case 46: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BranchLoads", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.BranchLoads = &v + case 47: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BranchLoadMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.BranchLoadMisses = &v + case 48: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeLoads", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NodeLoads = &v + case 49: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeLoadMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NodeLoadMisses = &v + case 50: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeStores", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NodeStores = &v + case 51: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeStoreMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NodeStoreMisses = &v + case 52: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodePrefetches", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NodePrefetches = &v + case 53: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NodePrefetchMisses", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.NodePrefetchMisses = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("timestamp") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("duration") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Request) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Request: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Request: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AgentID == nil { + m.AgentID = &AgentID{} + } + if err := m.AgentID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Offer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Offer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.FrameworkID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AgentID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorIDs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExecutorIDs = append(m.ExecutorIDs, ExecutorID{}) + if err := m.ExecutorIDs[len(m.ExecutorIDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Attributes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Attributes = append(m.Attributes, Attribute{}) + if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.URL == nil { + m.URL = &URL{} + } + if err := m.URL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Unavailability", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Unavailability == nil { + m.Unavailability = &Unavailability{} + } + if err := m.Unavailability.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AllocationInfo == nil { + m.AllocationInfo = &Resource_AllocationInfo{} + } + if err := m.AllocationInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Domain", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Domain == nil { + m.Domain = &DomainInfo{} + } + if err := m.Domain.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("framework_id") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("agent_id") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("hostname") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Operation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Operation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Offer_Operation_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Launch", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Launch == nil { + m.Launch = &Offer_Operation_Launch{} + } + if err := m.Launch.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reserve", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Reserve == nil { + m.Reserve = &Offer_Operation_Reserve{} + } + if err := m.Reserve.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Unreserve", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Unreserve == nil { + m.Unreserve = &Offer_Operation_Unreserve{} + } + if err := m.Unreserve.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Create", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Create == nil { + m.Create = &Offer_Operation_Create{} + } + if err := m.Create.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Destroy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Destroy == nil { + m.Destroy = &Offer_Operation_Destroy{} + } + if err := m.Destroy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LaunchGroup", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LaunchGroup == nil { + m.LaunchGroup = &Offer_Operation_LaunchGroup{} + } + if err := m.LaunchGroup.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ID == nil { + m.ID = &OperationID{} + } + if err := m.ID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GrowVolume", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GrowVolume == nil { + m.GrowVolume = &Offer_Operation_GrowVolume{} + } + if err := m.GrowVolume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShrinkVolume", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ShrinkVolume == nil { + m.ShrinkVolume = &Offer_Operation_ShrinkVolume{} + } + if err := m.ShrinkVolume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreateDisk", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CreateDisk == nil { + m.CreateDisk = &Offer_Operation_CreateDisk{} + } + if err := m.CreateDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestroyDisk", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DestroyDisk == nil { + m.DestroyDisk = &Offer_Operation_DestroyDisk{} + } + if err := m.DestroyDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_Launch) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Launch: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Launch: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskInfos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TaskInfos = append(m.TaskInfos, TaskInfo{}) + if err := m.TaskInfos[len(m.TaskInfos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_LaunchGroup) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LaunchGroup: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LaunchGroup: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Executor", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Executor.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskGroup", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TaskGroup.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("executor") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("task_group") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_Reserve) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Reserve: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Reserve: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_Unreserve) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Unreserve: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Unreserve: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_Create) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Create: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Create: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volumes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Volumes = append(m.Volumes, Resource{}) + if err := m.Volumes[len(m.Volumes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_Destroy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Destroy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Destroy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volumes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Volumes = append(m.Volumes, Resource{}) + if err := m.Volumes[len(m.Volumes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_GrowVolume) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GrowVolume: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GrowVolume: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Volume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Addition", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Addition.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("volume") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("addition") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_ShrinkVolume) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ShrinkVolume: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ShrinkVolume: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Volume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Subtract", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Subtract.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("volume") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("subtract") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_CreateDisk) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateDisk: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateDisk: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetType", wireType) + } + m.TargetType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TargetType |= (Resource_DiskInfo_Source_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("source") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("target_type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Offer_Operation_DestroyDisk) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DestroyDisk: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DestroyDisk: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("source") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InverseOffer) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InverseOffer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InverseOffer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OfferID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.OfferID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.URL == nil { + m.URL = &URL{} + } + if err := m.URL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.FrameworkID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AgentID == nil { + m.AgentID = &AgentID{} + } + if err := m.AgentID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Unavailability", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Unavailability.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("id") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("framework_id") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("unavailability") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TaskInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TaskInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TaskInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TaskID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AgentID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Executor", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Executor == nil { + m.Executor = &ExecutorInfo{} + } + if err := m.Executor.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &CommandInfo{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HealthCheck", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.HealthCheck == nil { + m.HealthCheck = &HealthCheck{} + } + if err := m.HealthCheck.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Container == nil { + m.Container = &ContainerInfo{} + } + if err := m.Container.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Discovery", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Discovery == nil { + m.Discovery = &DiscoveryInfo{} + } + if err := m.Discovery.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KillPolicy", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.KillPolicy == nil { + m.KillPolicy = &KillPolicy{} + } + if err := m.KillPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Check", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Check == nil { + m.Check = &CheckInfo{} + } + if err := m.Check.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxCompletionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxCompletionTime == nil { + m.MaxCompletionTime = &DurationInfo{} + } + if err := m.MaxCompletionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("task_id") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("agent_id") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TaskGroupInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TaskGroupInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TaskGroupInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tasks = append(m.Tasks, TaskInfo{}) + if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Task) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Task: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Task: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TaskID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.FrameworkID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExecutorID == nil { + m.ExecutorID = &ExecutorID{} + } + if err := m.ExecutorID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AgentID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000008) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var v TaskState + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (TaskState(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.State = &v + hasFields[0] |= uint64(0x00000010) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Statuses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Statuses = append(m.Statuses, TaskStatus{}) + if err := m.Statuses[len(m.Statuses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdateState", wireType) + } + var v TaskState + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (TaskState(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.StatusUpdateState = &v + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdateUUID", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StatusUpdateUUID = append(m.StatusUpdateUUID[:0], dAtA[iNdEx:postIndex]...) + if m.StatusUpdateUUID == nil { + m.StatusUpdateUUID = []byte{} + } + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Discovery", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Discovery == nil { + m.Discovery = &DiscoveryInfo{} + } + if err := m.Discovery.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Container", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Container == nil { + m.Container = &ContainerInfo{} + } + if err := m.Container.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.User = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("task_id") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("framework_id") + } + if hasFields[0]&uint64(0x00000008) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("agent_id") + } + if hasFields[0]&uint64(0x00000010) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("state") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TaskResourceLimitation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TaskResourceLimitation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TaskResourceLimitation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UUID) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UUID: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UUID: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Operation) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Operation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Operation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.FrameworkID == nil { + m.FrameworkID = &FrameworkID{} + } + if err := m.FrameworkID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AgentID == nil { + m.AgentID = &AgentID{} + } + if err := m.AgentID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Info.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LatestStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LatestStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Statuses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Statuses = append(m.Statuses, OperationStatus{}) + if err := m.Statuses[len(m.Statuses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UUID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000004) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("info") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("latest_status") + } + if hasFields[0]&uint64(0x00000004) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("uuid") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OperationStatus) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OperationStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OperationStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OperationID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.OperationID == nil { + m.OperationID = &OperationID{} + } + if err := m.OperationID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + m.State = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.State |= (OperationState(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConvertedResources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConvertedResources = append(m.ConvertedResources, Resource{}) + if err := m.ConvertedResources[len(m.ConvertedResources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UUID == nil { + m.UUID = &UUID{} + } + if err := m.UUID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("state") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckStatusInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CheckStatusInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CheckStatusInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v CheckInfo_Type + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (CheckInfo_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Command == nil { + m.Command = &CheckStatusInfo_Command{} + } + if err := m.Command.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HTTP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.HTTP == nil { + m.HTTP = &CheckStatusInfo_Http{} + } + if err := m.HTTP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TCP", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TCP == nil { + m.TCP = &CheckStatusInfo_Tcp{} + } + if err := m.TCP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckStatusInfo_Command) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Command: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Command: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExitCode", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExitCode = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckStatusInfo_Http) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Http: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Http: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StatusCode", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.StatusCode = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CheckStatusInfo_Tcp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Tcp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Tcp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Succeeded", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Succeeded = &b + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TaskStatus) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TaskStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TaskStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TaskID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var v TaskState + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (TaskState(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.State = &v + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Message = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AgentID == nil { + m.AgentID = &AgentID{} + } + if err := m.AgentID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.Timestamp = &v2 + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ExecutorID == nil { + m.ExecutorID = &ExecutorID{} + } + if err := m.ExecutorID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Healthy", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Healthy = &b + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var v TaskStatus_Source + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (TaskStatus_Source(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Source = &v + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var v TaskStatus_Reason + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (TaskStatus_Reason(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Reason = &v + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UUID", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UUID = append(m.UUID[:0], dAtA[iNdEx:postIndex]...) + if m.UUID == nil { + m.UUID = []byte{} + } + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ContainerStatus == nil { + m.ContainerStatus = &ContainerStatus{} + } + if err := m.ContainerStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnreachableTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UnreachableTime == nil { + m.UnreachableTime = &TimeInfo{} + } + if err := m.UnreachableTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CheckStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CheckStatus == nil { + m.CheckStatus = &CheckStatusInfo{} + } + if err := m.CheckStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Limitation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Limitation == nil { + m.Limitation = &TaskResourceLimitation{} + } + if err := m.Limitation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("task_id") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("state") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Filters) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Filters: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Filters: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field RefuseSeconds", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.RefuseSeconds = &v2 + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Environment) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Environment: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Environment: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Variables", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Variables = append(m.Variables, Environment_Variable{}) + if err := m.Variables[len(m.Variables)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Environment_Variable) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Variable: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Variable: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Value = &s + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v Environment_Variable_Type + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (Environment_Variable_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Secret", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Secret == nil { + m.Secret = &Secret{} + } + if err := m.Secret.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Parameter) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Parameter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Parameter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("key") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("value") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Parameters) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Parameters: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Parameters: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Parameter = append(m.Parameter, Parameter{}) + if err := m.Parameter[len(m.Parameter)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Credential) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Credential: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Credential: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Principal", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Principal = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Secret", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Secret = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("principal") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Credentials) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Credentials: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Credentials: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Credentials", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Credentials = append(m.Credentials, Credential{}) + if err := m.Credentials[len(m.Credentials)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Secret) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Secret: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Secret: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Secret_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reference", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Reference == nil { + m.Reference = &Secret_Reference{} + } + if err := m.Reference.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Value == nil { + m.Value = &Secret_Value{} + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Secret_Reference) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Reference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Reference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Key = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Secret_Value) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...) + if m.Data == nil { + m.Data = []byte{} + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("data") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RateLimit) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RateLimit: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RateLimit: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field QPS", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.QPS = &v2 + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Principal", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Principal = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Capacity = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("principal") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RateLimits) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RateLimits: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RateLimits: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Limits", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Limits = append(m.Limits, RateLimit{}) + if err := m.Limits[len(m.Limits)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field AggregateDefaultQPS", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.AggregateDefaultQPS = &v2 + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AggregateDefaultCapacity", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AggregateDefaultCapacity = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Image) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Image: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Image: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v Image_Type + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (Image_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Appc", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Appc == nil { + m.Appc = &Image_Appc{} + } + if err := m.Appc.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Docker", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Docker == nil { + m.Docker = &Image_Docker{} + } + if err := m.Docker.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Cached", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Cached = &b + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Image_Appc) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Appc: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Appc: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.ID = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Image_Docker) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Docker: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Docker: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Credential", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Credential == nil { + m.Credential = &Credential{} + } + if err := m.Credential.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Config == nil { + m.Config = &Secret{} + } + if err := m.Config.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MountPropagation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MountPropagation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MountPropagation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + var v MountPropagation_Mode + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (MountPropagation_Mode(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Mode = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Volume) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Volume: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Volume: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContainerPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.HostPath = &s + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + var v Volume_Mode + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (Volume_Mode(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Mode = &v + hasFields[0] |= uint64(0x00000002) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Image", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Image == nil { + m.Image = &Image{} + } + if err := m.Image.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &Volume_Source{} + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_path") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("mode") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Volume_Source) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Source: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Source: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Volume_Source_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DockerVolume", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DockerVolume == nil { + m.DockerVolume = &Volume_Source_DockerVolume{} + } + if err := m.DockerVolume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SandboxPath", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SandboxPath == nil { + m.SandboxPath = &Volume_Source_SandboxPath{} + } + if err := m.SandboxPath.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Secret", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Secret == nil { + m.Secret = &Secret{} + } + if err := m.Secret.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostPath", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.HostPath == nil { + m.HostPath = &Volume_Source_HostPath{} + } + if err := m.HostPath.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Volume_Source_DockerVolume) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DockerVolume: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DockerVolume: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Driver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Driver = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DriverOptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.DriverOptions == nil { + m.DriverOptions = &Parameters{} + } + if err := m.DriverOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Volume_Source_HostPath) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HostPath: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HostPath: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MountPropagation", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MountPropagation == nil { + m.MountPropagation = &MountPropagation{} + } + if err := m.MountPropagation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("path") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Volume_Source_SandboxPath) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SandboxPath: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SandboxPath: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (Volume_Source_SandboxPath_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("path") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NetworkInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NetworkInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NetworkInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Groups", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Groups = append(m.Groups, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPAddresses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IPAddresses = append(m.IPAddresses, NetworkInfo_IPAddress{}) + if err := m.IPAddresses[len(m.IPAddresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PortMappings", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PortMappings = append(m.PortMappings, NetworkInfo_PortMapping{}) + if err := m.PortMappings[len(m.PortMappings)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NetworkInfo_IPAddress) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IPAddress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IPAddress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var v NetworkInfo_Protocol + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (NetworkInfo_Protocol(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Protocol = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IPAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.IPAddress = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NetworkInfo_PortMapping) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PortMapping: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PortMapping: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HostPort", wireType) + } + m.HostPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HostPort |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerPort", wireType) + } + m.ContainerPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContainerPort |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Protocol = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("host_port") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CapabilityInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CapabilityInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CapabilityInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v CapabilityInfo_Capability + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (CapabilityInfo_Capability(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Capabilities = append(m.Capabilities, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + packedLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + for iNdEx < postIndex { + var v CapabilityInfo_Capability + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (CapabilityInfo_Capability(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Capabilities = append(m.Capabilities, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Capabilities", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LinuxInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LinuxInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LinuxInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CapabilityInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CapabilityInfo == nil { + m.CapabilityInfo = &CapabilityInfo{} + } + if err := m.CapabilityInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BoundingCapabilities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BoundingCapabilities == nil { + m.BoundingCapabilities = &CapabilityInfo{} + } + if err := m.BoundingCapabilities.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EffectiveCapabilities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.EffectiveCapabilities == nil { + m.EffectiveCapabilities = &CapabilityInfo{} + } + if err := m.EffectiveCapabilities.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SharePIDNamespace", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.SharePIDNamespace = &b + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RLimitInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RLimitInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RLimitInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Rlimits", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Rlimits = append(m.Rlimits, RLimitInfo_RLimit{}) + if err := m.Rlimits[len(m.Rlimits)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RLimitInfo_RLimit) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RLimit: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RLimit: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= (RLimitInfo_RLimit_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hard", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Hard = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Soft", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Soft = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TTYInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TTYInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TTYInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WindowSize", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WindowSize == nil { + m.WindowSize = &TTYInfo_WindowSize{} + } + if err := m.WindowSize.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TTYInfo_WindowSize) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WindowSize: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WindowSize: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Rows", wireType) + } + m.Rows = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Rows |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Columns", wireType) + } + m.Columns = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Columns |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("rows") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("columns") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var v ContainerInfo_Type + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (ContainerInfo_Type(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Type = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volumes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Volumes = append(m.Volumes, Volume{}) + if err := m.Volumes[len(m.Volumes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Docker", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Docker == nil { + m.Docker = &ContainerInfo_DockerInfo{} + } + if err := m.Docker.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Hostname = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mesos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Mesos == nil { + m.Mesos = &ContainerInfo_MesosInfo{} + } + if err := m.Mesos.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetworkInfos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NetworkInfos = append(m.NetworkInfos, NetworkInfo{}) + if err := m.NetworkInfos[len(m.NetworkInfos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LinuxInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LinuxInfo == nil { + m.LinuxInfo = &LinuxInfo{} + } + if err := m.LinuxInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RlimitInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RlimitInfo == nil { + m.RlimitInfo = &RLimitInfo{} + } + if err := m.RlimitInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TTYInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TTYInfo == nil { + m.TTYInfo = &TTYInfo{} + } + if err := m.TTYInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("type") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerInfo_DockerInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DockerInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DockerInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Image", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Image = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Network", wireType) + } + var v ContainerInfo_DockerInfo_Network + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (ContainerInfo_DockerInfo_Network(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Network = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PortMappings", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PortMappings = append(m.PortMappings, ContainerInfo_DockerInfo_PortMapping{}) + if err := m.PortMappings[len(m.PortMappings)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Privileged", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Privileged = &b + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Parameters = append(m.Parameters, Parameter{}) + if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ForcePullImage", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.ForcePullImage = &b + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeDriver", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.VolumeDriver = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("image") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerInfo_DockerInfo_PortMapping) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PortMapping: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PortMapping: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HostPort", wireType) + } + m.HostPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HostPort |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerPort", wireType) + } + m.ContainerPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContainerPort |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Protocol = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("host_port") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("container_port") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerInfo_MesosInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MesosInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MesosInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Image", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Image == nil { + m.Image = &Image{} + } + if err := m.Image.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContainerStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetworkInfos", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NetworkInfos = append(m.NetworkInfos, NetworkInfo{}) + if err := m.NetworkInfos[len(m.NetworkInfos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CgroupInfo", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CgroupInfo == nil { + m.CgroupInfo = &CgroupInfo{} + } + if err := m.CgroupInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorPID", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExecutorPID = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerID", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ContainerID == nil { + m.ContainerID = &ContainerID{} + } + if err := m.ContainerID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CgroupInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CgroupInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NetCLS", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NetCLS == nil { + m.NetCLS = &CgroupInfo_NetCls{} + } + if err := m.NetCLS.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_Blkio) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Blkio: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Blkio: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_Blkio_Value) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Value: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Value: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Op", wireType) + } + var v CgroupInfo_Blkio_Operation + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (CgroupInfo_Blkio_Operation(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Op = &v + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Value = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_Blkio_CFQ) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CFQ: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CFQ: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_Blkio_CFQ_Statistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Statistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Statistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Device == nil { + m.Device = &Device_Number{} + } + if err := m.Device.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sectors", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Sectors = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Time = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOServiced", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOServiced = append(m.IOServiced, CgroupInfo_Blkio_Value{}) + if err := m.IOServiced[len(m.IOServiced)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOServiceBytes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOServiceBytes = append(m.IOServiceBytes, CgroupInfo_Blkio_Value{}) + if err := m.IOServiceBytes[len(m.IOServiceBytes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOServiceTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOServiceTime = append(m.IOServiceTime, CgroupInfo_Blkio_Value{}) + if err := m.IOServiceTime[len(m.IOServiceTime)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOWaitTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOWaitTime = append(m.IOWaitTime, CgroupInfo_Blkio_Value{}) + if err := m.IOWaitTime[len(m.IOWaitTime)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOMerged", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOMerged = append(m.IOMerged, CgroupInfo_Blkio_Value{}) + if err := m.IOMerged[len(m.IOMerged)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOQueued", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOQueued = append(m.IOQueued, CgroupInfo_Blkio_Value{}) + if err := m.IOQueued[len(m.IOQueued)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_Blkio_Throttling) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Throttling: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Throttling: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_Blkio_Throttling_Statistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Statistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Statistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Device == nil { + m.Device = &Device_Number{} + } + if err := m.Device.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOServiced", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOServiced = append(m.IOServiced, CgroupInfo_Blkio_Value{}) + if err := m.IOServiced[len(m.IOServiced)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IOServiceBytes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.IOServiceBytes = append(m.IOServiceBytes, CgroupInfo_Blkio_Value{}) + if err := m.IOServiceBytes[len(m.IOServiceBytes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_Blkio_Statistics) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Statistics: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Statistics: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CFQ", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CFQ = append(m.CFQ, CgroupInfo_Blkio_CFQ_Statistics{}) + if err := m.CFQ[len(m.CFQ)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CFQRecursive", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CFQRecursive = append(m.CFQRecursive, CgroupInfo_Blkio_CFQ_Statistics{}) + if err := m.CFQRecursive[len(m.CFQRecursive)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Throttling", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Throttling = append(m.Throttling, &CgroupInfo_Blkio_Throttling_Statistics{}) + if err := m.Throttling[len(m.Throttling)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CgroupInfo_NetCls) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NetCls: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NetCls: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ClassID", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ClassID = &v + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Labels) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Labels: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Labels: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Labels = append(m.Labels, Label{}) + if err := m.Labels[len(m.Labels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Label) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Label: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Label: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Value = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("key") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Port) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Port: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Port: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Number", wireType) + } + m.Number = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Number |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Protocol = &s + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Visibility", wireType) + } + var v DiscoveryInfo_Visibility + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (DiscoveryInfo_Visibility(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Visibility = &v + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("number") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ports) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ports: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ports: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ports = append(m.Ports, Port{}) + if err := m.Ports[len(m.Ports)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DiscoveryInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DiscoveryInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DiscoveryInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Visibility", wireType) + } + m.Visibility = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Visibility |= (DiscoveryInfo_Visibility(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Name = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Environment = &s + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Location", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Location = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Version = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ports == nil { + m.Ports = &Ports{} + } + if err := m.Ports.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Labels == nil { + m.Labels = &Labels{} + } + if err := m.Labels.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("visibility") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WeightInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: WeightInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WeightInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + m.Weight = float64(math.Float64frombits(v)) + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Role = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("weight") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VersionInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VersionInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VersionInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BuildDate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.BuildDate = &s + iNdEx = postIndex + case 3: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field BuildTime", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.BuildTime = &v2 + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BuildUser", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.BuildUser = &s + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitSHA", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.GitSHA = &s + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitBranch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.GitBranch = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitTag", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.GitTag = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("version") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Flag) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Flag: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Flag: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Value = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Role) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Role: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Role: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + m.Weight = float64(math.Float64frombits(v)) + hasFields[0] |= uint64(0x00000002) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Frameworks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Frameworks = append(m.Frameworks, FrameworkID{}) + if err := m.Frameworks[len(m.Frameworks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Resources = append(m.Resources, Resource{}) + if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("weight") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Metric) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Metric: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Metric: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + iNdEx += 8 + v = uint64(dAtA[iNdEx-8]) + v |= uint64(dAtA[iNdEx-7]) << 8 + v |= uint64(dAtA[iNdEx-6]) << 16 + v |= uint64(dAtA[iNdEx-5]) << 24 + v |= uint64(dAtA[iNdEx-4]) << 32 + v |= uint64(dAtA[iNdEx-3]) << 40 + v |= uint64(dAtA[iNdEx-2]) << 48 + v |= uint64(dAtA[iNdEx-1]) << 56 + v2 := float64(math.Float64frombits(v)) + m.Value = &v2 + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("name") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FileInfo) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FileInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FileInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nlink", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Nlink = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Size", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Size = &v + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mtime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Mtime == nil { + m.Mtime = &TimeInfo{} + } + if err := m.Mtime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + var v uint32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Mode = &v + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.UID = &s + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.GID = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("path") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Device) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Device: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.Path = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Number", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Number == nil { + m.Number = &Device_Number{} + } + if err := m.Number.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Device_Number) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Number: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Number: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MajorNumber", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MajorNumber = &v + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinorNumber", wireType) + } + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MinorNumber = &v + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("major_number") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("minor_number") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAccess) Unmarshal(dAtA []byte) error { + var hasFields [1]uint64 + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceAccess: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceAccess: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Device", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Device.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000001) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Access", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Access.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + hasFields[0] |= uint64(0x00000002) + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + if hasFields[0]&uint64(0x00000001) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("device") + } + if hasFields[0]&uint64(0x00000002) == 0 { + return github_com_gogo_protobuf_proto.NewRequiredNotSetError("access") + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceAccess_Access) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Access: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Access: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Read", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Read = &b + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Write", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Write = &b + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Mknod", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.Mknod = &b + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceWhitelist) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DeviceWhitelist: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceWhitelist: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedDevices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMesos + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMesos + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedDevices = append(m.AllowedDevices, DeviceAccess{}) + if err := m.AllowedDevices[len(m.AllowedDevices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMesos(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthMesos + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipMesos(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMesos + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMesos + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMesos + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthMesos + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMesos + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipMesos(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthMesos = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowMesos = fmt.Errorf("proto: integer overflow") +) + +func init() { proto.RegisterFile("mesos.proto", fileDescriptorMesos) } + +var fileDescriptorMesos = []byte{ + // 12024 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0xbd, 0x5d, 0x90, 0x1b, 0x49, + 0x72, 0x18, 0xbc, 0xf8, 0x07, 0x12, 0xc0, 0x4c, 0xb3, 0x66, 0x38, 0x3b, 0x04, 0xc9, 0x19, 0x2e, + 0x76, 0xc9, 0x25, 0x97, 0x5c, 0xfe, 0xed, 0x72, 0x6f, 0xc9, 0xbd, 0xdd, 0x3d, 0x0c, 0xd0, 0x33, + 0xd3, 0x47, 0xfc, 0x5d, 0x01, 0x20, 0x77, 0x2f, 0x14, 0x81, 0x68, 0x02, 0x3d, 0x33, 0x2d, 0x02, + 0x68, 0x6c, 0x77, 0x63, 0x48, 0xde, 0xcb, 0x77, 0xfa, 0x2c, 0xc9, 0x27, 0x5b, 0xb2, 0xfd, 0xe0, + 0x3f, 0xd9, 0x7e, 0xb0, 0x43, 0x0f, 0xd2, 0x83, 0xe5, 0x90, 0x64, 0x87, 0xc3, 0xe1, 0x70, 0xd8, + 0x7e, 0xf0, 0x8f, 0xde, 0xac, 0x7b, 0x53, 0x84, 0x23, 0x68, 0xdd, 0x48, 0x0e, 0x4b, 0xb6, 0x6c, + 0x9d, 0x25, 0xd9, 0x92, 0x6d, 0x59, 0x76, 0xd4, 0x6f, 0x57, 0x03, 0x18, 0xcc, 0x70, 0x4f, 0x0a, + 0x3f, 0x01, 0x95, 0x95, 0x99, 0x55, 0x95, 0x95, 0x55, 0x95, 0x59, 0x55, 0x9d, 0x05, 0xd9, 0xa1, + 0xe5, 0x39, 0xde, 0xcd, 0xb1, 0xeb, 0xf8, 0x0e, 0x4a, 0xd0, 0x44, 0xe1, 0xdd, 0x7d, 0xdb, 0x3f, + 0x98, 0x3c, 0xb9, 0xd9, 0x73, 0x86, 0xb7, 0xf6, 0x9d, 0x7d, 0xe7, 0x16, 0xcd, 0x7d, 0x32, 0xd9, + 0xa3, 0x29, 0x9a, 0xa0, 0xff, 0x18, 0x55, 0xf1, 0x1a, 0x64, 0xb7, 0x5d, 0x73, 0x68, 0x3d, 0x73, + 0xdc, 0xa7, 0x46, 0x05, 0x15, 0x20, 0x71, 0x68, 0x0e, 0x26, 0xd6, 0x7a, 0xe4, 0x52, 0xf4, 0x6a, + 0x66, 0x2b, 0xfe, 0xcb, 0x2f, 0x37, 0x5f, 0xc3, 0x0c, 0x54, 0xbc, 0x0c, 0xa9, 0xc6, 0xde, 0x9e, + 0xe5, 0x9e, 0x8c, 0x56, 0xda, 0xb7, 0x46, 0xfe, 0x09, 0x68, 0x6f, 0x41, 0xb2, 0x6d, 0x7a, 0x27, + 0x95, 0x79, 0x15, 0x40, 0x7f, 0x6e, 0xf5, 0x26, 0xbe, 0x73, 0x52, 0xb1, 0x1d, 0xc8, 0x96, 0x9d, + 0x91, 0x6f, 0xda, 0xa3, 0x93, 0x6a, 0x88, 0xde, 0x81, 0xe4, 0xd8, 0x74, 0xad, 0x91, 0xbf, 0x1e, + 0xbd, 0x14, 0xb9, 0x9a, 0xbd, 0x8b, 0x6e, 0x32, 0x39, 0x2a, 0xf4, 0x98, 0x63, 0x14, 0x6f, 0x03, + 0xc2, 0x96, 0xe7, 0x4c, 0xdc, 0x9e, 0xd5, 0x74, 0x9d, 0x43, 0xbb, 0x7f, 0x62, 0xfb, 0xaf, 0x41, + 0xb6, 0x31, 0xb6, 0x5c, 0xd3, 0xb7, 0x9d, 0xd1, 0x09, 0xa8, 0x77, 0x21, 0xdd, 0xb6, 0x87, 0x96, + 0x31, 0xda, 0x73, 0xd0, 0x15, 0xc8, 0x8e, 0xcc, 0x91, 0xe3, 0x59, 0x3d, 0x67, 0xd4, 0xf7, 0x28, + 0x76, 0x8c, 0x63, 0xab, 0x19, 0xc5, 0x0f, 0x20, 0x57, 0x99, 0x70, 0xee, 0xaf, 0x42, 0xf7, 0x18, + 0x52, 0xa5, 0x7e, 0xdf, 0xb5, 0x3c, 0x0f, 0x15, 0x20, 0x7d, 0xe0, 0x78, 0xfe, 0xc8, 0x1c, 0x92, + 0x5a, 0x45, 0xae, 0x66, 0xb0, 0x4c, 0xa3, 0x35, 0x88, 0xda, 0x63, 0x2a, 0x97, 0xcc, 0x56, 0xf2, + 0xe8, 0xe5, 0x66, 0xd4, 0x68, 0xe2, 0xa8, 0x3d, 0x46, 0xeb, 0x10, 0x1f, 0x3b, 0xae, 0xbf, 0x1e, + 0xbb, 0x14, 0xbd, 0x9a, 0xe0, 0xfc, 0x29, 0xa4, 0xf8, 0x8b, 0x11, 0x88, 0x75, 0x70, 0x15, 0x5d, + 0x80, 0xa4, 0xd7, 0x3b, 0xb0, 0x86, 0xe1, 0x96, 0x72, 0x18, 0xba, 0x09, 0x29, 0x93, 0x15, 0xbf, + 0x1e, 0xbd, 0x14, 0xbd, 0x9a, 0xbd, 0xbb, 0xc4, 0x85, 0xce, 0x2b, 0xc5, 0xd1, 0x05, 0x12, 0x42, + 0x10, 0x1f, 0x9b, 0xfe, 0xc1, 0x7a, 0x8c, 0xd6, 0x8f, 0xfe, 0x47, 0x37, 0x20, 0xf1, 0xc5, 0xc4, + 0x72, 0x5f, 0xac, 0xc7, 0x2f, 0xc5, 0xae, 0x66, 0xef, 0x6a, 0x9c, 0x43, 0xd3, 0x24, 0x0a, 0xec, + 0x5b, 0xae, 0x10, 0x2e, 0x45, 0x22, 0xad, 0xdc, 0x73, 0xcd, 0xfd, 0x21, 0xe9, 0xe7, 0x04, 0x6b, + 0xa5, 0x48, 0x17, 0x47, 0xb0, 0xd4, 0x19, 0x99, 0x87, 0xa6, 0x3d, 0x30, 0x9f, 0xd8, 0x03, 0xdb, + 0x7f, 0x81, 0xae, 0x43, 0xc2, 0xf3, 0x4d, 0xd7, 0xa7, 0x95, 0xcf, 0xde, 0x5d, 0xe6, 0xbc, 0x45, + 0xf7, 0x08, 0xd6, 0x14, 0x07, 0xdd, 0x82, 0x74, 0x9f, 0xf7, 0x01, 0x57, 0xa1, 0x15, 0x8e, 0xaf, + 0x76, 0x0d, 0x96, 0x48, 0xc5, 0x4f, 0x21, 0x53, 0x33, 0x7b, 0x07, 0xf6, 0xc8, 0xa2, 0x1a, 0xf1, + 0xca, 0xe2, 0x2f, 0xfe, 0x9b, 0x08, 0x64, 0x05, 0x07, 0xd2, 0xeb, 0x37, 0x20, 0x6a, 0xf7, 0x79, + 0x5d, 0x85, 0x1c, 0x64, 0x09, 0x5b, 0x40, 0x2a, 0x4b, 0xa9, 0x2b, 0x38, 0x6a, 0xf7, 0xd1, 0x75, + 0x88, 0x0f, 0x9d, 0xbe, 0x45, 0xf9, 0x2e, 0xdd, 0x7d, 0x7d, 0x0a, 0x7f, 0xb4, 0xe7, 0xdc, 0xac, + 0x39, 0x7d, 0x0b, 0x53, 0x24, 0xf4, 0x31, 0x2c, 0x4d, 0x42, 0xb2, 0xa1, 0x7d, 0x90, 0xbd, 0x7b, + 0x96, 0x93, 0x85, 0x05, 0x87, 0xa7, 0x90, 0x8b, 0x57, 0x20, 0x4e, 0x98, 0xa1, 0x24, 0x44, 0x3b, + 0x4d, 0x2d, 0x82, 0x72, 0x90, 0xae, 0xe0, 0x92, 0x51, 0x37, 0xea, 0x3b, 0x5a, 0x14, 0xa5, 0x21, + 0x5e, 0x69, 0x3c, 0xae, 0x6b, 0xb1, 0xe2, 0x6f, 0x24, 0x20, 0x1f, 0xcc, 0x3c, 0xa4, 0x4d, 0xeb, + 0x10, 0x9f, 0x78, 0x96, 0x1b, 0x52, 0x1f, 0x0a, 0x21, 0x39, 0x54, 0x5a, 0x51, 0x35, 0x87, 0xca, + 0xeb, 0x1d, 0x2a, 0x87, 0x58, 0x68, 0x18, 0x2b, 0xf3, 0x19, 0x97, 0x21, 0x93, 0xc2, 0x0d, 0xd0, + 0xf6, 0x4c, 0x7b, 0xe0, 0x1c, 0x5a, 0x6e, 0xd7, 0xb7, 0x87, 0x96, 0x33, 0xf1, 0xd7, 0xe3, 0x97, + 0x22, 0x57, 0x23, 0x0f, 0x22, 0xb7, 0xf1, 0xb2, 0xc8, 0x6a, 0xb3, 0x1c, 0x74, 0x19, 0xa0, 0x77, + 0x60, 0xf5, 0x9e, 0x8e, 0x1d, 0x9b, 0x2b, 0x50, 0xfa, 0x41, 0x62, 0xcf, 0x1c, 0x78, 0x16, 0x56, + 0x32, 0xd0, 0x39, 0x88, 0xbb, 0xce, 0xc0, 0x5a, 0x4f, 0x92, 0x2e, 0x7b, 0x10, 0x79, 0x67, 0x2b, + 0xba, 0x1e, 0xc1, 0x14, 0x14, 0xea, 0xe7, 0xd4, 0x54, 0x3f, 0x5f, 0x80, 0xcc, 0xd8, 0xb5, 0x47, + 0x3d, 0x7b, 0x6c, 0x0e, 0xd6, 0xd3, 0x34, 0x33, 0x00, 0xa0, 0x6b, 0x90, 0x79, 0x66, 0x3d, 0x99, + 0xd8, 0xdd, 0x89, 0x3b, 0x58, 0xcf, 0x50, 0x65, 0xc8, 0x1d, 0xbd, 0xdc, 0x4c, 0x3f, 0xb6, 0x9e, + 0x74, 0xec, 0x0e, 0xae, 0xe2, 0x34, 0xcd, 0xee, 0xb8, 0x03, 0x64, 0x40, 0xae, 0x67, 0x8e, 0x99, + 0xf0, 0x6d, 0xcb, 0x5b, 0x07, 0x3a, 0x34, 0x36, 0x67, 0x44, 0x41, 0x3a, 0xb9, 0x2c, 0x10, 0x5f, + 0x70, 0x19, 0x86, 0x48, 0xd1, 0x65, 0x48, 0x0e, 0xcc, 0x27, 0xd6, 0xc0, 0x5b, 0xcf, 0x52, 0x79, + 0xe6, 0x39, 0x93, 0x2a, 0x05, 0x62, 0x9e, 0x89, 0x56, 0x21, 0x41, 0x9a, 0xe7, 0xad, 0xe7, 0x2e, + 0xc5, 0xae, 0x66, 0x30, 0x4b, 0x14, 0xfe, 0x4a, 0x14, 0x20, 0xe0, 0x8f, 0x3e, 0x81, 0xb8, 0xff, + 0x62, 0xcc, 0xf4, 0x7b, 0xe9, 0xee, 0x5b, 0x27, 0x54, 0xe7, 0x66, 0xfb, 0xc5, 0xd8, 0x12, 0xfd, + 0x4a, 0xe8, 0x8a, 0xff, 0x2a, 0x02, 0x71, 0x02, 0x44, 0x59, 0x48, 0x75, 0xea, 0x0f, 0xeb, 0x44, + 0x67, 0x5e, 0x43, 0xaf, 0xc3, 0x0a, 0xd6, 0x1f, 0x35, 0xca, 0xa5, 0xad, 0xaa, 0xde, 0xc5, 0x7a, + 0xab, 0xd1, 0xc1, 0x65, 0xbd, 0xa5, 0x45, 0xd0, 0x1a, 0xa0, 0x76, 0xa9, 0xf5, 0xb0, 0xfb, 0xd0, + 0xa8, 0x56, 0x8d, 0xfa, 0x4e, 0xb7, 0xd5, 0x2e, 0xb5, 0x75, 0x2d, 0x8a, 0xce, 0x40, 0x7e, 0xa7, + 0xd9, 0x51, 0x50, 0x63, 0x68, 0x15, 0xb4, 0xd6, 0x6e, 0x09, 0xeb, 0x15, 0x05, 0x1a, 0x47, 0x2b, + 0xb0, 0xdc, 0x2c, 0xe1, 0xb6, 0xd1, 0x36, 0x1a, 0xf5, 0x6e, 0xe9, 0x71, 0x09, 0xeb, 0x5a, 0x02, + 0x2d, 0x01, 0xd4, 0x3a, 0xd5, 0xb6, 0xd1, 0xc5, 0x8d, 0xaa, 0xae, 0x25, 0x51, 0x01, 0xd6, 0xb0, + 0xde, 0xd2, 0xf1, 0xa3, 0x12, 0x45, 0xc3, 0xfa, 0xb6, 0x51, 0xd7, 0x6b, 0x7a, 0xbd, 0xad, 0xa5, + 0x90, 0x06, 0x39, 0xac, 0xef, 0x04, 0xd4, 0xe9, 0x42, 0xfc, 0x3b, 0x3f, 0xb3, 0x11, 0x29, 0xfe, + 0xdd, 0x38, 0x64, 0xca, 0x44, 0x5d, 0xa8, 0x8a, 0xdf, 0x0a, 0x89, 0x45, 0x8c, 0x28, 0x99, 0x3f, + 0x23, 0x07, 0x74, 0x17, 0x52, 0x3d, 0x67, 0x38, 0x34, 0x47, 0x7d, 0x3e, 0xd1, 0xac, 0xcf, 0xd0, + 0x94, 0x59, 0x3e, 0x16, 0x88, 0xe8, 0x3d, 0x88, 0x1f, 0xf8, 0xfe, 0x78, 0x6a, 0xd8, 0x06, 0x04, + 0xbb, 0xbe, 0x3f, 0xde, 0x4a, 0x1f, 0xbd, 0xdc, 0x8c, 0xef, 0xb6, 0xdb, 0x4d, 0x4c, 0x91, 0xd1, + 0xdb, 0x90, 0xef, 0x5b, 0x03, 0xf3, 0x45, 0x57, 0x2c, 0x24, 0x6c, 0x64, 0x44, 0xef, 0xdc, 0xc3, + 0x39, 0x9a, 0xd1, 0x62, 0x70, 0xf4, 0x2e, 0x68, 0xf6, 0xc8, 0xb7, 0xdc, 0x43, 0x73, 0x20, 0x71, + 0x13, 0x1c, 0xf7, 0x36, 0x5e, 0x16, 0x79, 0x02, 0xfd, 0x3a, 0x2c, 0xf3, 0xb1, 0x26, 0xb1, 0x93, + 0x0c, 0xfb, 0xee, 0x6d, 0xbc, 0xc4, 0xb3, 0x04, 0xf2, 0x2d, 0x88, 0xf9, 0xbd, 0x31, 0x1d, 0x2c, + 0xd9, 0xbb, 0xab, 0xb3, 0xd2, 0xe9, 0x8d, 0xb7, 0x52, 0x47, 0x2f, 0x37, 0x63, 0xed, 0x72, 0x13, + 0x13, 0xcc, 0xc2, 0xc7, 0x90, 0xe2, 0xcd, 0x57, 0x25, 0xc5, 0xa6, 0xc5, 0x60, 0x55, 0xa7, 0x50, + 0x65, 0x16, 0x17, 0x88, 0x85, 0xf7, 0x21, 0x4e, 0x84, 0x21, 0x17, 0x37, 0x42, 0x98, 0x57, 0x17, + 0x37, 0xb9, 0x0c, 0x45, 0x83, 0x65, 0xa8, 0xb0, 0x09, 0xb1, 0x76, 0x6f, 0x01, 0x51, 0xf1, 0xfe, + 0x3c, 0xdd, 0xcd, 0x42, 0xaa, 0xdc, 0xa8, 0xd5, 0x4a, 0xf5, 0x8a, 0x16, 0x21, 0xd3, 0x20, 0x91, + 0xbd, 0x16, 0x45, 0x29, 0x20, 0xad, 0xd1, 0x62, 0x5c, 0x5d, 0x7e, 0x29, 0x09, 0xd9, 0x5d, 0xcb, + 0x1c, 0xf8, 0x07, 0xb4, 0xd9, 0x64, 0x1c, 0xd1, 0xbe, 0x8c, 0x50, 0x91, 0x5c, 0xe2, 0x4d, 0x52, + 0x30, 0x6e, 0x12, 0x3e, 0x52, 0x44, 0x27, 0x77, 0x6b, 0xf4, 0x15, 0xba, 0x35, 0xf6, 0x4a, 0xdd, + 0x1a, 0x3f, 0xb6, 0x5b, 0xdf, 0x87, 0xd5, 0x9e, 0x33, 0xf2, 0x88, 0x19, 0x67, 0x1f, 0x5a, 0x5d, + 0x32, 0xd3, 0x4e, 0x5c, 0x8b, 0xa9, 0x4d, 0xfe, 0x41, 0xe4, 0x3d, 0xbc, 0xa2, 0x64, 0x6f, 0xf3, + 0x5c, 0x42, 0xb5, 0xef, 0x9a, 0x3d, 0xab, 0x3b, 0xb6, 0x5c, 0xdb, 0xe9, 0x4f, 0xab, 0xcf, 0x9d, + 0xdb, 0x18, 0xd1, 0xfc, 0x26, 0xcd, 0x16, 0x65, 0xdd, 0x08, 0xd4, 0x20, 0x35, 0x65, 0xdc, 0x49, + 0x35, 0x08, 0x86, 0xca, 0x1d, 0x3e, 0x1e, 0xd3, 0xa1, 0x85, 0x51, 0x15, 0xef, 0xcc, 0x88, 0x7c, + 0xc0, 0x74, 0x34, 0x43, 0x99, 0x6f, 0xce, 0xa3, 0x28, 0x2b, 0xfd, 0x11, 0x56, 0xd7, 0x5f, 0x88, + 0x40, 0x3e, 0xd4, 0x5f, 0xaf, 0xa6, 0x79, 0x68, 0x4d, 0x9a, 0x58, 0xcc, 0x2c, 0x12, 0xc6, 0x55, + 0x01, 0xd2, 0x9e, 0x6f, 0xfa, 0x13, 0xcf, 0xf2, 0xa8, 0x6d, 0x94, 0xc7, 0x32, 0x8d, 0x3e, 0x86, + 0x34, 0xb5, 0xf4, 0x7b, 0xce, 0x80, 0x0a, 0x7c, 0xe9, 0xee, 0x79, 0x5e, 0xe9, 0xba, 0xe5, 0xcb, + 0xb9, 0xb8, 0xc9, 0x51, 0x1e, 0xc4, 0x8d, 0xe6, 0xe1, 0xfb, 0x58, 0x92, 0x14, 0xf6, 0x21, 0xa7, + 0x36, 0x68, 0x41, 0x85, 0xd5, 0x82, 0xa2, 0xaf, 0x5c, 0xd0, 0x0f, 0x32, 0x68, 0x2a, 0x00, 0x0f, + 0xed, 0xc1, 0xa0, 0xe9, 0x0c, 0xec, 0xde, 0x0b, 0xf4, 0x01, 0xe4, 0x54, 0xbd, 0xe1, 0x43, 0x67, + 0xae, 0x81, 0x96, 0x55, 0x14, 0xa8, 0xf8, 0x47, 0x51, 0xe2, 0x41, 0x48, 0x25, 0x41, 0x1f, 0x42, + 0x7c, 0xe2, 0xda, 0xc4, 0xa2, 0x26, 0x2b, 0xea, 0xda, 0xac, 0x1a, 0xdd, 0xec, 0x60, 0x63, 0x2b, + 0xc7, 0x4d, 0xad, 0x78, 0x07, 0x1b, 0x1e, 0xa6, 0x14, 0xe8, 0x7d, 0xc8, 0x5a, 0xa3, 0x43, 0xdb, + 0x75, 0x46, 0xc3, 0x59, 0x27, 0x43, 0x0f, 0x72, 0xb0, 0x8a, 0x46, 0xd6, 0x55, 0xe6, 0x28, 0xb0, + 0xbe, 0xe5, 0xbe, 0x0a, 0xe2, 0x46, 0x11, 0xb3, 0x60, 0x99, 0x39, 0x54, 0x80, 0x84, 0x77, 0x60, + 0x0d, 0x06, 0x74, 0x28, 0xa4, 0x1f, 0xc4, 0x7d, 0x77, 0x62, 0x61, 0x06, 0x22, 0x86, 0x85, 0xe9, + 0xee, 0x4f, 0x08, 0x47, 0x6f, 0x3d, 0x45, 0x57, 0xe8, 0x00, 0x50, 0xf8, 0xeb, 0xd4, 0x56, 0x37, + 0x16, 0x7a, 0x47, 0x1b, 0x00, 0x16, 0x75, 0xb9, 0xcc, 0x27, 0x03, 0x66, 0x32, 0xa6, 0xb1, 0x02, + 0x41, 0x1b, 0x90, 0xb2, 0x9e, 0xfb, 0xae, 0xd9, 0xf3, 0x69, 0x4d, 0x45, 0xf9, 0x02, 0x48, 0xda, + 0xd1, 0x33, 0x7b, 0x07, 0x16, 0x9d, 0x10, 0xd2, 0x98, 0x25, 0xd0, 0x26, 0x64, 0x9d, 0x89, 0x3f, + 0x9e, 0xf8, 0xdd, 0x3d, 0x7b, 0x60, 0xf1, 0xe6, 0x00, 0x03, 0x6d, 0xdb, 0x03, 0xab, 0xf8, 0x63, + 0x09, 0xc8, 0x49, 0x57, 0x8f, 0xc8, 0x7f, 0x1b, 0xb2, 0x16, 0x4f, 0x77, 0xa5, 0xad, 0x7b, 0x46, + 0x48, 0x51, 0x3a, 0x85, 0x5b, 0x88, 0xf7, 0x80, 0xe2, 0x28, 0x8a, 0xfa, 0x3a, 0xae, 0xd1, 0x27, + 0x12, 0xec, 0x9b, 0xbe, 0x49, 0xab, 0x93, 0xc3, 0xf4, 0x3f, 0x7a, 0x0f, 0x32, 0x2e, 0xf7, 0xea, + 0xc8, 0x34, 0x14, 0x53, 0x2c, 0x7e, 0xe1, 0xed, 0x71, 0xa1, 0x04, 0x78, 0xaf, 0x38, 0xb5, 0x6c, + 0x43, 0x6e, 0x4f, 0x98, 0x3b, 0xa4, 0xfe, 0xe9, 0x63, 0x6d, 0xd4, 0xe5, 0xa3, 0x97, 0x9b, 0xaa, + 0x13, 0x8e, 0xb3, 0x92, 0x90, 0x55, 0x9f, 0x5a, 0x90, 0x19, 0xa6, 0x00, 0xd4, 0x7a, 0x2c, 0x40, + 0x92, 0x55, 0x6a, 0x1d, 0xa8, 0x71, 0x48, 0x6c, 0x4e, 0x0e, 0x41, 0x77, 0x21, 0xd3, 0x13, 0x7e, + 0x2c, 0x37, 0xe4, 0x56, 0x67, 0xfc, 0x5b, 0x52, 0xd3, 0x00, 0x8d, 0xd0, 0xf4, 0x6d, 0xaf, 0x47, + 0xcc, 0xdf, 0x17, 0xeb, 0xb9, 0x10, 0x4d, 0x45, 0xc0, 0x19, 0x8d, 0x44, 0x43, 0x3b, 0x70, 0xd6, + 0x3b, 0x98, 0xf8, 0x7d, 0xe7, 0xd9, 0xa8, 0x1b, 0x1a, 0x6f, 0xf9, 0xe3, 0xc7, 0xdb, 0x8a, 0xa0, + 0xd8, 0x09, 0xc6, 0x9d, 0x62, 0x76, 0x2e, 0x2d, 0x32, 0x3b, 0xef, 0xf2, 0xa9, 0x7a, 0x99, 0x4e, + 0x2d, 0xeb, 0xd3, 0x7a, 0x30, 0xcf, 0x7a, 0x2a, 0xde, 0x3d, 0x66, 0x4e, 0xa9, 0xe8, 0xdb, 0xa5, + 0x4e, 0xb5, 0xad, 0x45, 0x10, 0x40, 0xb2, 0xdc, 0x69, 0xb5, 0x1b, 0x35, 0x2d, 0xca, 0x27, 0x93, + 0x7f, 0x18, 0x05, 0xa8, 0x38, 0x43, 0xd3, 0x66, 0xee, 0xf5, 0xd7, 0x20, 0xb7, 0x67, 0x4e, 0x06, + 0x7e, 0xb7, 0x4f, 0x61, 0x7c, 0x36, 0xb9, 0x28, 0x5a, 0x27, 0x11, 0x6f, 0x6e, 0x13, 0x2c, 0x96, + 0xc6, 0xd9, 0xbd, 0x20, 0x51, 0xf8, 0xf7, 0x11, 0xc8, 0x2a, 0x99, 0x68, 0x1b, 0x92, 0xae, 0xb5, + 0x4f, 0x5c, 0x47, 0xa6, 0xd2, 0x57, 0x17, 0xf2, 0xba, 0x89, 0x29, 0xae, 0x62, 0xbd, 0x70, 0x6a, + 0xf4, 0x35, 0x88, 0x7f, 0xcb, 0x19, 0x59, 0xdc, 0x9d, 0xbe, 0xb2, 0x98, 0xcb, 0x37, 0x9d, 0x91, + 0xea, 0xc7, 0x52, 0xca, 0xc2, 0x15, 0x80, 0x80, 0xbb, 0x74, 0xb2, 0x22, 0xd3, 0x4e, 0x56, 0xe1, + 0x2d, 0x48, 0x0b, 0xfa, 0xe3, 0xb1, 0x8a, 0xff, 0x22, 0x06, 0x50, 0x33, 0x3d, 0x9f, 0xa9, 0x17, + 0x2a, 0x48, 0x0f, 0x35, 0x33, 0xe3, 0x8f, 0x16, 0xb8, 0x97, 0x4b, 0x96, 0x90, 0x20, 0x6f, 0x76, + 0xa3, 0x21, 0xff, 0x20, 0x7e, 0xef, 0xf6, 0xbd, 0xdb, 0x7c, 0x81, 0x39, 0x07, 0xb1, 0xb1, 0xdd, + 0xa7, 0xe3, 0x38, 0xc3, 0x16, 0xd6, 0xa6, 0x51, 0xc1, 0x04, 0x16, 0x72, 0xb5, 0x12, 0x53, 0xae, + 0xd6, 0x3a, 0xa4, 0x0e, 0x2d, 0xd7, 0x23, 0x02, 0xa7, 0x4e, 0x1a, 0x16, 0x49, 0x74, 0x35, 0xd8, + 0x93, 0x60, 0x03, 0x7a, 0x6a, 0x4f, 0x22, 0xd8, 0x8d, 0xb8, 0x06, 0x49, 0xde, 0xff, 0x6c, 0x18, + 0x9f, 0x99, 0x91, 0x36, 0xe6, 0x08, 0x64, 0xdc, 0x87, 0x1c, 0xb2, 0x0c, 0x9d, 0x5d, 0x2e, 0x48, + 0x9f, 0x5b, 0x08, 0xe8, 0x04, 0x6f, 0xac, 0x70, 0x18, 0xf2, 0xa7, 0x3e, 0x0a, 0x39, 0x0e, 0x6f, + 0x2c, 0xe2, 0x36, 0x3b, 0x0c, 0xae, 0xcf, 0x1b, 0x06, 0x1a, 0xe4, 0x4a, 0x3b, 0x7a, 0xbd, 0xdd, + 0xed, 0x34, 0x2b, 0xc4, 0x59, 0x8a, 0x70, 0xfd, 0xff, 0xb7, 0x31, 0xc8, 0xb0, 0xfd, 0x3b, 0xd2, + 0x8b, 0x97, 0x42, 0x7b, 0x15, 0x41, 0x97, 0x07, 0xe2, 0x0d, 0x4d, 0xa5, 0xb1, 0x53, 0x4e, 0xa5, + 0x1f, 0x00, 0x98, 0xbe, 0xef, 0xda, 0x4f, 0x26, 0xbe, 0x9c, 0x80, 0xc5, 0x36, 0x46, 0x49, 0x64, + 0x70, 0x32, 0x05, 0x13, 0x5d, 0xa1, 0x4a, 0x95, 0x0c, 0x77, 0x16, 0xdb, 0x6c, 0x0c, 0xb9, 0xfa, + 0x42, 0x89, 0x48, 0x6f, 0x25, 0xa8, 0x12, 0xdd, 0xe1, 0x4a, 0x14, 0xf4, 0x24, 0x9c, 0xd0, 0x93, + 0x85, 0xef, 0x46, 0x42, 0x5d, 0xf0, 0x20, 0xd4, 0x05, 0x97, 0x42, 0xa5, 0x9f, 0xd4, 0x03, 0x3f, + 0x3e, 0xd7, 0x9d, 0x0d, 0xfb, 0x97, 0x11, 0x74, 0x16, 0xce, 0xec, 0x1a, 0x3a, 0x2e, 0xe1, 0xf2, + 0xae, 0x51, 0x2e, 0x55, 0x19, 0x38, 0xba, 0xc0, 0xed, 0x8c, 0x11, 0x12, 0xe1, 0xc6, 0x76, 0x9b, + 0xb8, 0xf1, 0xc8, 0xa8, 0xe8, 0x58, 0x8b, 0x13, 0xbf, 0x17, 0xeb, 0x2d, 0xe3, 0x9b, 0x7a, 0xf7, + 0x51, 0xa3, 0xda, 0xa9, 0xe9, 0x5a, 0x82, 0xf7, 0xee, 0x3f, 0x8e, 0xc2, 0x5a, 0xb9, 0x65, 0x34, + 0x07, 0x93, 0x7d, 0x7b, 0x14, 0x5a, 0x0f, 0x50, 0x09, 0xd2, 0x9e, 0xe5, 0x1e, 0xda, 0xa4, 0x1f, + 0x89, 0xcd, 0xb3, 0x74, 0xf7, 0xb2, 0x58, 0x37, 0xe6, 0x12, 0xdc, 0x6c, 0x31, 0x6c, 0x2c, 0xc9, + 0xd4, 0x15, 0x32, 0x7a, 0xf2, 0x0a, 0xf9, 0xa5, 0x34, 0x27, 0xb4, 0xbc, 0xc5, 0x4f, 0xb5, 0xbc, + 0x15, 0xb7, 0x21, 0xc5, 0xeb, 0x1a, 0x96, 0xff, 0x1a, 0xa0, 0x72, 0xa3, 0xde, 0xc6, 0x8d, 0x6a, + 0x55, 0xc7, 0x5d, 0x22, 0x61, 0xa3, 0x4c, 0xfa, 0x41, 0x83, 0x5c, 0xbd, 0x51, 0xd1, 0x25, 0x44, + 0x2c, 0x0d, 0xdf, 0x89, 0x40, 0x5e, 0xca, 0x42, 0xcc, 0x86, 0x5c, 0x27, 0x94, 0xd9, 0x90, 0xba, + 0x09, 0xc7, 0x6f, 0x59, 0x95, 0x01, 0x64, 0xd5, 0x44, 0xbb, 0x2f, 0x2e, 0x94, 0xb4, 0x18, 0x08, + 0x01, 0x59, 0xf1, 0xa7, 0x62, 0xb0, 0x3a, 0xb3, 0x2f, 0x4d, 0x6a, 0x74, 0x87, 0x4f, 0xbb, 0x44, + 0x30, 0xe7, 0xa6, 0xa4, 0x19, 0x6c, 0x60, 0x87, 0x06, 0x4b, 0x78, 0x30, 0x46, 0x4f, 0x3d, 0x18, + 0x45, 0xe3, 0x63, 0xc7, 0x36, 0x3e, 0x3e, 0xd3, 0xf8, 0xcf, 0x60, 0xb5, 0x6f, 0xb1, 0x05, 0xd5, + 0xb5, 0x88, 0xde, 0x50, 0xe3, 0x40, 0x4c, 0x01, 0x9b, 0x53, 0x15, 0x26, 0x7f, 0x04, 0x8e, 0x22, + 0x88, 0x15, 0xce, 0x42, 0xc9, 0x25, 0x7e, 0x4e, 0xca, 0xf3, 0x1d, 0xd7, 0xdc, 0xb7, 0xf8, 0xfc, + 0xf0, 0xe6, 0x71, 0xad, 0xa7, 0xba, 0xcb, 0x50, 0xb1, 0xa0, 0x29, 0x7c, 0x0c, 0x29, 0x0e, 0x43, + 0x77, 0x21, 0x39, 0xa6, 0x9d, 0xc0, 0x17, 0xe8, 0xd5, 0xe9, 0xce, 0x51, 0x17, 0x63, 0x86, 0x59, + 0xfc, 0xcd, 0x18, 0x24, 0x1e, 0x51, 0xf3, 0xf9, 0xba, 0xa2, 0x12, 0x4b, 0x72, 0x7a, 0xa1, 0x79, + 0xb3, 0xce, 0xe4, 0x75, 0xe2, 0xd0, 0x99, 0x03, 0xd3, 0x9d, 0xda, 0x46, 0x66, 0xe8, 0x2d, 0x9a, + 0x85, 0x39, 0x0a, 0x41, 0x76, 0xcd, 0xd1, 0xbe, 0xe5, 0xf1, 0x9d, 0x9d, 0x30, 0x32, 0xa6, 0x59, + 0x98, 0xa3, 0xa0, 0x22, 0xc4, 0x3c, 0xcb, 0xe7, 0x23, 0x44, 0x0b, 0xb3, 0xb5, 0x7c, 0x4c, 0x32, + 0xd1, 0x65, 0x88, 0xfb, 0xd6, 0x73, 0xb6, 0xb9, 0x99, 0x9d, 0xae, 0xaa, 0xf5, 0xdc, 0xc7, 0x34, + 0xbb, 0xf0, 0x16, 0x24, 0x59, 0x4d, 0xc2, 0x6e, 0x43, 0x24, 0xe4, 0x36, 0x14, 0x3e, 0x82, 0x04, + 0xad, 0x02, 0x41, 0x7a, 0x62, 0x09, 0xe9, 0xc5, 0x05, 0x12, 0x05, 0xa1, 0x35, 0x88, 0x59, 0x74, + 0x72, 0x08, 0x72, 0x08, 0xa0, 0xf0, 0x21, 0x24, 0x59, 0xfd, 0xd1, 0x4d, 0x48, 0xd0, 0x16, 0x70, + 0xb7, 0x0b, 0xcd, 0xb6, 0x51, 0x70, 0xa4, 0x68, 0x85, 0x73, 0x10, 0x6b, 0x59, 0xd4, 0x5b, 0xb6, + 0x7d, 0x6b, 0x48, 0xa9, 0x32, 0x98, 0xfe, 0x2f, 0x14, 0x21, 0x4e, 0x5a, 0xb1, 0xf0, 0x04, 0xe6, + 0x0e, 0x9f, 0x97, 0x01, 0x92, 0xad, 0x72, 0xa9, 0x5a, 0xc2, 0xda, 0x6b, 0xe4, 0x3f, 0x2e, 0xd5, + 0x77, 0xe8, 0xc6, 0x62, 0x0a, 0x62, 0x2d, 0xbd, 0xcd, 0x36, 0xae, 0xdb, 0xfa, 0x67, 0x6d, 0x2d, + 0x56, 0xfc, 0x83, 0x08, 0x64, 0xe4, 0xb0, 0x38, 0xde, 0x1e, 0x92, 0x8a, 0x10, 0x7d, 0x35, 0x45, + 0x88, 0xbd, 0x8a, 0x22, 0xc4, 0x4f, 0x56, 0x84, 0xd3, 0x75, 0xb2, 0xd0, 0x97, 0xe4, 0x02, 0x7d, + 0x29, 0xfe, 0x5a, 0x0e, 0xd2, 0x62, 0x34, 0x2d, 0x68, 0xf8, 0xe5, 0x13, 0x1a, 0xfe, 0xa7, 0xde, + 0x64, 0xde, 0x96, 0xc4, 0x22, 0xdd, 0x5f, 0xb0, 0x6f, 0x7f, 0x03, 0xe2, 0x7d, 0xdb, 0x7b, 0xca, + 0x6d, 0xc2, 0xf5, 0xe9, 0x39, 0xa9, 0x62, 0x7b, 0x74, 0x2b, 0x03, 0x53, 0x2c, 0x54, 0x82, 0xac, + 0x32, 0x93, 0x71, 0xfb, 0xf0, 0xa4, 0x89, 0x0c, 0xab, 0x34, 0xe8, 0x23, 0xb2, 0x10, 0x1e, 0x3a, + 0x3d, 0xea, 0x70, 0x67, 0x42, 0x0e, 0x86, 0xc2, 0x80, 0x23, 0xb0, 0xc5, 0x4d, 0xe2, 0x93, 0xd9, + 0xca, 0x3b, 0x30, 0x5d, 0xab, 0xcf, 0x0d, 0x9a, 0xc2, 0x34, 0x65, 0x8b, 0xe6, 0x32, 0xcb, 0x86, + 0x61, 0xa2, 0x1d, 0x58, 0x36, 0x07, 0x03, 0xa7, 0x47, 0x8b, 0xef, 0xda, 0xa3, 0x3d, 0x87, 0x7b, + 0x8a, 0x1b, 0xd3, 0xc4, 0x25, 0x89, 0x46, 0x19, 0x2c, 0x99, 0xa1, 0x34, 0xfa, 0x3a, 0x64, 0xc7, + 0x7c, 0x5a, 0x25, 0x3e, 0x6e, 0xee, 0xa4, 0x65, 0x67, 0x89, 0xf8, 0xe9, 0x41, 0x1a, 0x83, 0xa0, + 0x36, 0xfa, 0xc8, 0x80, 0x5c, 0x68, 0x49, 0xc8, 0xbf, 0xca, 0x92, 0x10, 0x22, 0x2d, 0xbc, 0x05, + 0x4b, 0xe1, 0x8a, 0x93, 0xf9, 0x81, 0x76, 0x37, 0x3b, 0x6f, 0xa3, 0xff, 0x0b, 0xbf, 0x1a, 0x81, + 0xe5, 0x29, 0x6e, 0xe1, 0x73, 0x99, 0xc8, 0xf4, 0xb9, 0x4c, 0xe0, 0xaa, 0x46, 0x17, 0xb9, 0xaa, + 0xa2, 0xb0, 0x58, 0x50, 0x18, 0xfa, 0x90, 0x0f, 0x8a, 0x78, 0xe8, 0x40, 0xe4, 0xb8, 0x56, 0x29, + 0xe3, 0x64, 0xbe, 0x13, 0x4b, 0xe6, 0xab, 0x76, 0xa9, 0x6d, 0x94, 0xb5, 0x08, 0x75, 0x68, 0x3f, + 0xaf, 0x97, 0x6a, 0x46, 0x59, 0x58, 0x2a, 0x85, 0xbf, 0x96, 0x80, 0xb4, 0xd0, 0x53, 0xb4, 0x0d, + 0xd9, 0x31, 0xf1, 0x78, 0x3c, 0xdf, 0x1a, 0xf5, 0x2c, 0x6e, 0x1b, 0xbc, 0x75, 0x9c, 0x5a, 0xdf, + 0x6c, 0x06, 0xb8, 0x58, 0x25, 0x24, 0xad, 0x3f, 0x74, 0x06, 0x93, 0xa1, 0x35, 0xd5, 0xfa, 0x47, + 0x14, 0x88, 0x79, 0x26, 0xfa, 0x8a, 0xdc, 0x9c, 0x88, 0xcd, 0x1f, 0x0b, 0xb2, 0xa4, 0x16, 0x4d, + 0x8b, 0x9d, 0x8b, 0xc2, 0x0e, 0x64, 0x95, 0xb2, 0x17, 0x3a, 0x90, 0xa1, 0x6e, 0x8a, 0x4e, 0x75, + 0x53, 0xe1, 0xa7, 0x63, 0x90, 0x64, 0xbc, 0x95, 0x73, 0xa8, 0xe8, 0x3c, 0xb1, 0x4f, 0x55, 0x65, + 0x76, 0x5e, 0xfe, 0x50, 0xd9, 0x85, 0xcd, 0x9e, 0x4c, 0xdf, 0x34, 0xfd, 0x03, 0xbe, 0x57, 0xfb, + 0x11, 0x24, 0x86, 0xce, 0x64, 0xe4, 0x73, 0x29, 0x5c, 0x3e, 0x89, 0xb4, 0x46, 0x90, 0x31, 0xa3, + 0xa1, 0xc7, 0xc0, 0xc2, 0xd3, 0x55, 0x4d, 0xb5, 0x6b, 0x90, 0x1e, 0x5a, 0xbe, 0x49, 0xf7, 0xb3, + 0x12, 0xf3, 0x54, 0x50, 0x66, 0x13, 0xb7, 0x77, 0xec, 0x3a, 0x74, 0xb3, 0x8d, 0xbb, 0xbd, 0x3c, + 0x59, 0x28, 0x40, 0x9c, 0xd4, 0x93, 0xa9, 0xa9, 0xe3, 0x07, 0x63, 0xc2, 0xf1, 0x0b, 0xe7, 0x21, + 0x41, 0x2b, 0x32, 0x2f, 0xb3, 0xb8, 0x35, 0x4f, 0x13, 0xd3, 0x10, 0x6f, 0x96, 0xda, 0xbb, 0x5a, + 0x04, 0x65, 0x20, 0x51, 0x6b, 0x74, 0xea, 0x64, 0xb5, 0xcc, 0x40, 0x62, 0xab, 0xda, 0x28, 0x3f, + 0xd4, 0x62, 0x64, 0x05, 0xc5, 0xa5, 0xc7, 0x5a, 0x9c, 0x6b, 0xe6, 0x32, 0xe4, 0x43, 0x53, 0x59, + 0x21, 0x07, 0x10, 0xcc, 0x50, 0xc5, 0x7f, 0x10, 0x85, 0xf5, 0xb6, 0x6b, 0xee, 0xed, 0xd9, 0x3d, + 0x62, 0x02, 0xbb, 0xce, 0xa0, 0xe5, 0x9b, 0xbe, 0xed, 0xf9, 0x76, 0xcf, 0x5b, 0xa8, 0x11, 0xeb, + 0x90, 0x7a, 0x62, 0xf6, 0x9e, 0x0e, 0x9c, 0x7d, 0xda, 0x57, 0x71, 0x2c, 0x92, 0x68, 0x15, 0x12, + 0x4f, 0x5e, 0xf8, 0xdc, 0x6a, 0x8a, 0x63, 0x96, 0x20, 0xd0, 0xbe, 0xeb, 0x8c, 0xd9, 0x7a, 0x12, + 0xc7, 0x2c, 0x81, 0x36, 0x00, 0x9c, 0x43, 0xcb, 0x1d, 0xd8, 0x43, 0xdb, 0x67, 0xe7, 0x13, 0x71, + 0xac, 0x40, 0xa8, 0x50, 0xcd, 0xde, 0x53, 0xcb, 0x67, 0xc7, 0x10, 0x71, 0x2c, 0x92, 0x44, 0x5e, + 0x5f, 0x0c, 0xac, 0x11, 0x5d, 0x34, 0xe2, 0x98, 0xfe, 0x47, 0x97, 0x21, 0xe5, 0x9a, 0xbe, 0xf5, + 0x64, 0xec, 0xd1, 0x65, 0x21, 0xbe, 0x95, 0x3d, 0x7a, 0xb9, 0x99, 0xc2, 0xa6, 0x6f, 0x6d, 0x35, + 0x5b, 0x58, 0xe4, 0x09, 0xb4, 0xf1, 0xd8, 0xa3, 0x93, 0xbf, 0x82, 0xd6, 0x14, 0x68, 0xe3, 0x31, + 0xbd, 0xb5, 0xe1, 0x5a, 0x5f, 0x4c, 0xac, 0x09, 0x3d, 0xe5, 0x25, 0xa5, 0xc8, 0x74, 0xf1, 0x47, + 0x13, 0x90, 0x33, 0xc6, 0x8a, 0xa8, 0x36, 0x00, 0xb6, 0x1d, 0xf7, 0x99, 0xe9, 0xf6, 0xed, 0xd1, + 0x3e, 0xed, 0xc4, 0x18, 0x56, 0x20, 0x24, 0xbf, 0xc2, 0x8c, 0xe8, 0x76, 0xbb, 0x4a, 0x25, 0x16, + 0xc3, 0x0a, 0x84, 0xe4, 0x1b, 0x23, 0x6c, 0xf5, 0x2c, 0xfb, 0x90, 0x4b, 0x2e, 0x86, 0x15, 0x08, + 0xba, 0x04, 0x59, 0x63, 0xb4, 0xdb, 0x77, 0x75, 0xd7, 0x75, 0x5c, 0x26, 0xc4, 0x18, 0x56, 0x41, + 0xa8, 0x08, 0x39, 0x63, 0x54, 0xea, 0x4b, 0x94, 0x04, 0x45, 0x09, 0xc1, 0xd0, 0x5b, 0x90, 0x27, + 0x75, 0xaa, 0x98, 0xbe, 0xb9, 0xef, 0x9a, 0x43, 0x26, 0xd4, 0x18, 0x0e, 0x03, 0xd1, 0x55, 0x58, + 0x36, 0x46, 0x9d, 0xd1, 0xd3, 0x91, 0xf3, 0x6c, 0x44, 0x8f, 0x0f, 0xd8, 0x76, 0x4d, 0x0c, 0x4f, + 0x83, 0x59, 0xad, 0x2b, 0xb6, 0xd7, 0x33, 0xdd, 0x3e, 0x93, 0x39, 0xad, 0xb5, 0x80, 0xf0, 0x7c, + 0x6b, 0x60, 0x1f, 0x12, 0xd7, 0x2b, 0x23, 0xf3, 0x39, 0x84, 0xb4, 0xaa, 0x31, 0xf1, 0x31, 0x91, + 0xaa, 0xe7, 0x33, 0x29, 0xc7, 0xb0, 0x0a, 0xe2, 0x18, 0xb2, 0x88, 0xac, 0xc4, 0x90, 0x65, 0x30, + 0x8c, 0xba, 0x83, 0x1d, 0xea, 0x4e, 0xe5, 0x24, 0x86, 0x00, 0x11, 0xc9, 0x60, 0xcb, 0xf4, 0x86, + 0xfc, 0xa6, 0x01, 0xdd, 0x30, 0x8d, 0xe1, 0x10, 0x8c, 0xd4, 0x94, 0xa6, 0xb1, 0xf5, 0x45, 0x9f, + 0x6d, 0x8c, 0xc6, 0xb0, 0x02, 0x21, 0xca, 0x40, 0x53, 0x8d, 0x87, 0x1e, 0xdd, 0x11, 0x8d, 0x61, + 0x99, 0x96, 0xb4, 0xdb, 0xa6, 0x3d, 0xf0, 0xd6, 0x35, 0x85, 0x96, 0x42, 0x88, 0x12, 0x6f, 0xbb, + 0xe6, 0x3e, 0x21, 0x3d, 0x43, 0x33, 0x45, 0x92, 0x4c, 0xab, 0xe4, 0x2f, 0x23, 0x44, 0x34, 0x2f, + 0x00, 0x90, 0x96, 0x91, 0x44, 0xd9, 0xb5, 0x4c, 0xd2, 0xb2, 0x15, 0xd6, 0x32, 0x05, 0x54, 0xfc, + 0xa7, 0x29, 0x58, 0x32, 0x7a, 0x43, 0x55, 0x11, 0xd7, 0x20, 0x69, 0x8c, 0x6a, 0xde, 0xbe, 0xc7, + 0x95, 0x90, 0xa7, 0x48, 0x03, 0x8c, 0x11, 0x57, 0x0d, 0xa6, 0x7e, 0x32, 0xcd, 0x54, 0xa7, 0xec, + 0x4d, 0x86, 0x3c, 0x3f, 0x26, 0x54, 0x27, 0x80, 0xa1, 0x2b, 0xb0, 0x44, 0x3a, 0xce, 0xf3, 0x3b, + 0x23, 0xd7, 0x32, 0x7b, 0x07, 0x42, 0x07, 0xa7, 0xa0, 0x4c, 0x51, 0x89, 0x54, 0xf5, 0xe7, 0xbd, + 0xbe, 0xd0, 0x42, 0x15, 0xc4, 0x30, 0x9a, 0xa6, 0x3b, 0x6c, 0xba, 0xce, 0x13, 0xa1, 0x82, 0x2a, + 0x88, 0xd5, 0xa7, 0xe5, 0xf6, 0xbe, 0x31, 0xb1, 0x46, 0xa4, 0xa4, 0x94, 0xa8, 0x4f, 0x00, 0x63, + 0x5c, 0xb0, 0xd5, 0xb7, 0x5d, 0xab, 0xe7, 0x0b, 0xdd, 0x53, 0x41, 0x44, 0xec, 0xc6, 0x48, 0xef, + 0x1d, 0x38, 0x42, 0xf3, 0x44, 0x92, 0xa9, 0x25, 0xf9, 0x8b, 0xad, 0xb1, 0xd0, 0x3a, 0x05, 0xc2, + 0xca, 0x27, 0x15, 0xf6, 0x7c, 0x73, 0x38, 0x16, 0x5a, 0x17, 0x82, 0xb1, 0x41, 0x22, 0xd3, 0x94, + 0x51, 0x4e, 0x0c, 0x92, 0x10, 0x98, 0xd5, 0x94, 0x0c, 0xc2, 0x9a, 0xe9, 0x3d, 0xf5, 0xb8, 0xf6, + 0xa9, 0x20, 0x26, 0x5b, 0x91, 0xa4, 0xac, 0x96, 0x84, 0x6c, 0x55, 0x28, 0x69, 0x51, 0x63, 0xe2, + 0xd3, 0xce, 0x65, 0x3a, 0x28, 0x92, 0x44, 0x91, 0x1a, 0x13, 0x9f, 0x77, 0x1f, 0xd3, 0xc0, 0x00, + 0x40, 0xea, 0x4a, 0x46, 0x8c, 0xda, 0x79, 0x4c, 0x11, 0xa7, 0xc1, 0xa4, 0xe5, 0x8d, 0x89, 0x1f, + 0x74, 0x1f, 0xd3, 0xc9, 0x10, 0x8c, 0xe3, 0x04, 0x1d, 0xb8, 0x22, 0x71, 0x82, 0x1e, 0x7c, 0x0b, + 0xf2, 0x8d, 0x89, 0xaf, 0x74, 0xe1, 0x2a, 0x9b, 0x68, 0x42, 0x40, 0xce, 0x29, 0xe8, 0xc4, 0xb3, + 0x92, 0x53, 0xd0, 0x8b, 0x05, 0x48, 0x93, 0x86, 0xd0, 0x6e, 0x5c, 0x63, 0x7a, 0x2b, 0xd2, 0x7c, + 0xe8, 0xcb, 0x8e, 0x7c, 0x5d, 0x0e, 0x7d, 0xd9, 0x93, 0xac, 0x1e, 0x4a, 0x57, 0xae, 0xcb, 0x7a, + 0x28, 0x7d, 0xf9, 0x0e, 0x68, 0x2a, 0x80, 0x32, 0x3b, 0x47, 0x11, 0x67, 0xe0, 0xbc, 0xce, 0x41, + 0x77, 0x16, 0x64, 0x9d, 0x83, 0xfe, 0x64, 0xf2, 0x0e, 0x75, 0xe8, 0x79, 0x29, 0x6f, 0x15, 0x5c, + 0xfc, 0x6e, 0x0c, 0xf2, 0xed, 0x9e, 0x3a, 0x7e, 0xc9, 0x64, 0xe5, 0x3b, 0xa5, 0xc1, 0xbe, 0xe3, + 0xda, 0xfe, 0xc1, 0x90, 0x8f, 0xe2, 0x10, 0x8c, 0x8c, 0x71, 0xec, 0x3b, 0x35, 0x7b, 0xc4, 0x47, + 0x32, 0x4f, 0x09, 0xb8, 0xf9, 0x9c, 0x8f, 0x60, 0x9e, 0x22, 0x7a, 0x53, 0x33, 0x9f, 0x97, 0x9d, + 0xd1, 0x88, 0x0f, 0x5a, 0x91, 0x24, 0x12, 0x2c, 0xf5, 0x7c, 0xfb, 0xd0, 0x6a, 0x8c, 0xad, 0x91, + 0x1c, 0xad, 0x0a, 0x88, 0xd4, 0xa7, 0x69, 0x7a, 0x9e, 0x44, 0x61, 0xc3, 0x35, 0x04, 0x23, 0x38, + 0x25, 0xdf, 0xb7, 0x86, 0x63, 0x9f, 0xcd, 0x64, 0x7c, 0xbc, 0xaa, 0x30, 0x52, 0x92, 0xee, 0xf9, + 0xe6, 0x13, 0x62, 0x78, 0x07, 0xe3, 0x55, 0x01, 0x11, 0x1d, 0x2e, 0x4f, 0x5c, 0x97, 0x82, 0xf8, + 0x88, 0x0d, 0x00, 0x6c, 0x5e, 0x6b, 0x59, 0xfb, 0x62, 0xbc, 0xf2, 0x14, 0x1f, 0x13, 0x34, 0x23, + 0x2b, 0xc7, 0x04, 0xcd, 0xb9, 0x04, 0x59, 0x6c, 0xf9, 0xae, 0x39, 0xf2, 0x68, 0x2e, 0x5f, 0x18, + 0x14, 0x10, 0xe3, 0xa9, 0xbb, 0xae, 0x18, 0x94, 0x3c, 0xc5, 0x79, 0x62, 0xb2, 0x24, 0x2d, 0x49, + 0x9e, 0x24, 0x39, 0x33, 0x53, 0x2e, 0xcf, 0xce, 0x94, 0xc5, 0xbf, 0x19, 0x85, 0x7c, 0xa7, 0xaf, + 0xf6, 0x29, 0x9d, 0x01, 0x82, 0x45, 0x37, 0x22, 0x66, 0x80, 0x60, 0xc9, 0x5d, 0x87, 0x54, 0xdd, + 0x69, 0x3a, 0xae, 0x2f, 0x26, 0x67, 0x91, 0x0c, 0xcd, 0xdb, 0xb1, 0xd9, 0x79, 0x9b, 0x0c, 0x60, + 0xc9, 0x38, 0x2e, 0x75, 0x31, 0xe0, 0x4c, 0xf4, 0xa9, 0x77, 0xf8, 0x64, 0xb2, 0x17, 0x36, 0x0b, + 0x54, 0x18, 0xc1, 0x69, 0x8d, 0xfa, 0x01, 0x0e, 0xef, 0x63, 0x15, 0x36, 0xd3, 0xf2, 0xd4, 0x9c, + 0x35, 0x82, 0xe0, 0xec, 0x8f, 0x1c, 0xd7, 0xea, 0xd7, 0x26, 0x03, 0xdf, 0xe6, 0x9d, 0x1c, 0x82, + 0x15, 0xff, 0x72, 0x14, 0x96, 0x5a, 0xf5, 0x5a, 0x53, 0x11, 0xcf, 0x47, 0x90, 0xb6, 0xc7, 0x5d, + 0xcf, 0x37, 0x7d, 0x6f, 0xea, 0xf2, 0x80, 0x6a, 0x62, 0x31, 0x2b, 0xcd, 0xa0, 0x84, 0x1e, 0x4e, + 0xd9, 0x34, 0xcb, 0x43, 0x65, 0x00, 0xbb, 0x37, 0x14, 0xe4, 0xd1, 0xd0, 0x15, 0xac, 0xf0, 0xd2, + 0xb8, 0x95, 0x3f, 0x7a, 0xb9, 0x99, 0x31, 0xca, 0x35, 0xce, 0x22, 0x63, 0xf3, 0x6c, 0x0f, 0x7d, + 0x0a, 0x19, 0xbf, 0x27, 0x78, 0xc4, 0x42, 0x9b, 0xdc, 0xa1, 0xd1, 0xc9, 0x6e, 0x05, 0xb6, 0xcb, + 0x9c, 0x43, 0xda, 0xef, 0x05, 0x0c, 0x26, 0x7d, 0xc1, 0x20, 0xbc, 0x4b, 0x1e, 0x52, 0x05, 0xc6, + 0xa0, 0x53, 0x11, 0x0c, 0x26, 0x2c, 0xd3, 0x2b, 0x7e, 0x37, 0x02, 0x4b, 0xc4, 0x43, 0x51, 0xc4, + 0x12, 0xf8, 0x75, 0x91, 0x57, 0xf2, 0xeb, 0xa6, 0xfd, 0xcf, 0xe8, 0x97, 0xf5, 0x3f, 0x37, 0x21, + 0x4b, 0xcd, 0xf0, 0xae, 0x6a, 0xce, 0x03, 0x05, 0x6d, 0x51, 0x9b, 0xfe, 0x22, 0xc0, 0xc4, 0xb3, + 0xfa, 0x3c, 0x9f, 0x19, 0xf6, 0x19, 0x02, 0xa1, 0xd9, 0xc5, 0x5f, 0x5a, 0x09, 0xee, 0x72, 0x87, + 0x66, 0xb8, 0x8c, 0x2f, 0xa6, 0xd4, 0xd0, 0xc6, 0x66, 0x00, 0x46, 0x65, 0x58, 0xe9, 0x8d, 0x27, + 0x5e, 0x77, 0xe2, 0xf1, 0xbb, 0xa3, 0x5d, 0xcf, 0xea, 0xf1, 0xcb, 0x54, 0x5b, 0xab, 0x47, 0x2f, + 0x37, 0xb5, 0x72, 0xb3, 0xe3, 0x75, 0x3c, 0x76, 0x7d, 0xb4, 0x65, 0xf5, 0x3c, 0xac, 0x11, 0x02, + 0x15, 0x82, 0x0c, 0x38, 0x4b, 0x99, 0x78, 0x2f, 0x3c, 0xdf, 0x1a, 0x2a, 0x6c, 0xe8, 0x3d, 0xab, + 0xad, 0xb5, 0xa3, 0x97, 0x9b, 0x88, 0xb0, 0x69, 0xd1, 0x7c, 0xc9, 0x08, 0x11, 0xa2, 0x30, 0x0c, + 0xdd, 0x00, 0xa0, 0xac, 0x68, 0xe3, 0xd9, 0xcd, 0x2b, 0xa6, 0x4e, 0x84, 0xbe, 0x4a, 0x80, 0x38, + 0x43, 0x10, 0xe8, 0x5f, 0xf4, 0x1e, 0xe4, 0x87, 0xd6, 0xb0, 0xeb, 0x7a, 0x1e, 0x17, 0x0d, 0x75, + 0x6c, 0xd8, 0xbd, 0x83, 0x9a, 0x35, 0xc4, 0xad, 0x16, 0x15, 0x10, 0xce, 0x0e, 0xad, 0x21, 0xf6, + 0x3c, 0x26, 0xcc, 0x2b, 0xb0, 0x4c, 0x88, 0x54, 0x89, 0x33, 0x97, 0x87, 0xf0, 0xaa, 0x06, 0x42, + 0xbf, 0x0f, 0xcb, 0xb4, 0x2a, 0x23, 0x97, 0x5f, 0x00, 0x60, 0x63, 0x31, 0xbf, 0x75, 0xe6, 0xe8, + 0xe5, 0x66, 0x9e, 0xd4, 0xa7, 0xee, 0xb2, 0x93, 0x7e, 0x0f, 0xe7, 0x09, 0xa6, 0x4c, 0xa2, 0x4f, + 0xe1, 0x8c, 0x20, 0xf5, 0x0f, 0x5c, 0xc7, 0xf7, 0x07, 0x16, 0xbb, 0x27, 0x91, 0xdf, 0x5a, 0x39, + 0x7a, 0xb9, 0xb9, 0xcc, 0x88, 0xdb, 0x22, 0x0b, 0x2f, 0x33, 0x72, 0x09, 0x40, 0x18, 0xd6, 0x29, + 0x03, 0x49, 0xad, 0x08, 0x35, 0x43, 0x85, 0x72, 0xee, 0xe8, 0xe5, 0xe6, 0x59, 0xc2, 0x47, 0x12, + 0x49, 0xb9, 0xd2, 0xce, 0x98, 0x01, 0xa3, 0xb7, 0x60, 0x89, 0xb4, 0x9b, 0x78, 0xca, 0xbc, 0xd9, + 0xcc, 0xd9, 0xca, 0x0d, 0xad, 0xe1, 0xb6, 0x3d, 0xb0, 0x58, 0xab, 0x39, 0x96, 0x39, 0x72, 0x46, + 0x1c, 0x2b, 0x2b, 0xb1, 0x4a, 0x23, 0x67, 0xc4, 0xb0, 0xee, 0xc0, 0x59, 0x82, 0x35, 0x34, 0xc7, + 0x63, 0xab, 0xaf, 0xb2, 0xcc, 0x51, 0x64, 0x34, 0xb4, 0x86, 0x35, 0x9a, 0x17, 0x30, 0xbe, 0x06, + 0xf1, 0xb1, 0xe5, 0xee, 0xf1, 0x5b, 0x14, 0x62, 0xe6, 0x68, 0x5a, 0xee, 0x5e, 0xa0, 0xb2, 0x98, + 0xa2, 0x90, 0x3a, 0x8c, 0x2c, 0xbf, 0xeb, 0x3e, 0xef, 0x0a, 0x9f, 0x74, 0x89, 0xd5, 0x61, 0x64, + 0xf9, 0xf8, 0x79, 0x93, 0x3b, 0xa6, 0x97, 0x20, 0xc7, 0xb1, 0x58, 0xd1, 0xcb, 0x6c, 0xd8, 0x50, + 0x1c, 0x56, 0x64, 0x11, 0xf2, 0x1c, 0xc3, 0x0a, 0x0c, 0xb6, 0x38, 0xce, 0x52, 0x14, 0xe9, 0xa9, + 0x89, 0xb2, 0x88, 0xa3, 0x3c, 0xb6, 0xfa, 0xd4, 0x62, 0x13, 0x65, 0x55, 0x18, 0x4c, 0x60, 0xf9, + 0x41, 0x8d, 0x90, 0xc4, 0x6a, 0x4f, 0xd7, 0xc8, 0x17, 0x35, 0x5a, 0x91, 0x35, 0x6a, 0x87, 0x6b, + 0xe4, 0xcb, 0x1a, 0xad, 0xca, 0x1a, 0xb5, 0xa7, 0x6a, 0xe4, 0x07, 0x35, 0x3a, 0xab, 0x94, 0x25, + 0x6a, 0xd4, 0x82, 0x73, 0x14, 0xab, 0x37, 0xee, 0xba, 0xbe, 0xdf, 0x1d, 0xda, 0x3d, 0xd7, 0x21, + 0xea, 0xd1, 0x1d, 0xdf, 0xbb, 0x4d, 0xed, 0x37, 0xae, 0x22, 0x75, 0xcb, 0x6f, 0x97, 0x9b, 0xd8, + 0xf7, 0x6b, 0x02, 0xa3, 0x79, 0xef, 0x36, 0x3e, 0x4b, 0x78, 0xf5, 0xc6, 0x53, 0xe0, 0x05, 0x4c, + 0xef, 0xdf, 0xa6, 0x56, 0xdf, 0xf1, 0x4c, 0xef, 0xcf, 0x67, 0x7a, 0x7f, 0x21, 0xd3, 0x7b, 0xd4, + 0x4c, 0x5c, 0xc0, 0xf4, 0xde, 0x7c, 0xa6, 0xf7, 0x16, 0x31, 0xbd, 0x4f, 0x4d, 0xca, 0x05, 0x4c, + 0xef, 0xcf, 0x67, 0x7a, 0x1f, 0x5d, 0x05, 0xad, 0x6f, 0x7b, 0x4f, 0x43, 0x53, 0x43, 0x81, 0xca, + 0x7e, 0x89, 0xc0, 0x95, 0xb9, 0xe1, 0x0a, 0x2c, 0x53, 0x4c, 0x65, 0x56, 0x3e, 0xcf, 0xe6, 0x10, + 0x02, 0xee, 0x88, 0x99, 0x19, 0x7d, 0x06, 0x05, 0x51, 0x4d, 0x93, 0xda, 0x7a, 0xdd, 0x9e, 0x33, + 0x1a, 0x59, 0x3d, 0xb6, 0x11, 0x7c, 0x81, 0xd6, 0xf3, 0xfc, 0xd1, 0xcb, 0xcd, 0xd7, 0x59, 0x3d, + 0x99, 0x3d, 0x58, 0x0e, 0x50, 0xf0, 0xeb, 0xac, 0xa6, 0x33, 0x19, 0xa8, 0x0b, 0x17, 0x05, 0x67, + 0x3a, 0x35, 0x3c, 0x33, 0x6d, 0x3f, 0xc4, 0xfc, 0x22, 0x65, 0x7e, 0xf1, 0xe8, 0xe5, 0xe6, 0x39, + 0xc6, 0x9c, 0x4c, 0x04, 0x8f, 0x4d, 0xdb, 0x57, 0xd9, 0x9f, 0x63, 0xec, 0xe7, 0x64, 0xb1, 0x9d, + 0x48, 0xa7, 0x67, 0x79, 0x9e, 0xe5, 0xad, 0x6f, 0x90, 0xb9, 0x0b, 0x07, 0x00, 0x62, 0x47, 0xf9, + 0x07, 0xae, 0x65, 0xf6, 0xbd, 0xf5, 0x4d, 0x9a, 0x27, 0x92, 0xe8, 0x2b, 0xb0, 0x4e, 0xa7, 0x57, + 0xe7, 0x59, 0x77, 0xec, 0x5a, 0x9e, 0x37, 0x71, 0x49, 0xa3, 0x27, 0x23, 0xdf, 0x72, 0xd7, 0x2f, + 0x51, 0x19, 0x91, 0xa9, 0xa3, 0xea, 0x3c, 0x6b, 0xf2, 0xdc, 0x32, 0xcb, 0x44, 0x1f, 0xc3, 0x79, + 0x3a, 0xa7, 0x58, 0x7d, 0x7b, 0x32, 0x9c, 0xa5, 0x7d, 0x83, 0xd2, 0x12, 0xde, 0x35, 0x8a, 0x31, + 0x4d, 0x5e, 0x82, 0x8b, 0x84, 0xbc, 0xe7, 0xda, 0xbe, 0xdd, 0x33, 0x07, 0xb3, 0x0c, 0x8a, 0x94, + 0x41, 0x61, 0x68, 0x0d, 0xcb, 0x1c, 0x67, 0x9a, 0xc5, 0x0f, 0xc3, 0x06, 0x95, 0x29, 0xdb, 0xa6, + 0x23, 0xd2, 0xf4, 0x5d, 0x67, 0x40, 0x8d, 0x0d, 0x36, 0x3f, 0xad, 0xbf, 0x19, 0xda, 0xba, 0x3f, + 0x6e, 0x3f, 0x8f, 0x2f, 0xb3, 0xe7, 0x89, 0x70, 0x8f, 0xdb, 0xf2, 0xe3, 0xab, 0x90, 0xef, 0xf8, + 0xe6, 0x80, 0x6b, 0xd0, 0x5b, 0x72, 0x15, 0x6a, 0x13, 0x68, 0x68, 0xa6, 0x65, 0x78, 0x43, 0x6b, + 0xe8, 0x3d, 0xe3, 0xd8, 0x97, 0xe5, 0x4c, 0x4b, 0xb1, 0x6b, 0x24, 0x8b, 0x91, 0xdc, 0x82, 0x55, + 0x42, 0xe2, 0x39, 0x7b, 0x7e, 0x48, 0x95, 0xaf, 0x50, 0x8a, 0x33, 0x43, 0x6b, 0xd8, 0x72, 0xf6, + 0xfc, 0xb0, 0x36, 0x53, 0xd1, 0x99, 0xbd, 0x03, 0x31, 0x8f, 0xbf, 0x2d, 0xeb, 0x52, 0x26, 0xd0, + 0xd0, 0xda, 0xe0, 0x3d, 0x33, 0xc7, 0x1c, 0xed, 0xaa, 0x5c, 0x1b, 0x5a, 0xcf, 0xcc, 0x31, 0xc3, + 0xba, 0xcb, 0x6a, 0x3c, 0x19, 0x59, 0x87, 0x76, 0x8f, 0xde, 0xac, 0xe4, 0xc8, 0xd7, 0x28, 0xf2, + 0xca, 0xd0, 0x1a, 0x76, 0x82, 0x3c, 0x46, 0xf3, 0x43, 0xb0, 0x42, 0x24, 0xef, 0x8d, 0xb8, 0x81, + 0xc9, 0xc5, 0xfd, 0x4e, 0x68, 0xad, 0x08, 0x5b, 0xb3, 0x5b, 0x67, 0x8f, 0x5e, 0x6e, 0x9e, 0xa9, + 0x5b, 0x7e, 0x18, 0x8c, 0xcf, 0x8c, 0x2c, 0xbf, 0x35, 0x0a, 0x6d, 0xd5, 0x54, 0xf8, 0x68, 0x55, + 0x38, 0x5f, 0xa7, 0x1d, 0x79, 0x36, 0xb8, 0x0b, 0xf8, 0x74, 0xa6, 0xfb, 0xe8, 0x98, 0x57, 0xb8, + 0xd4, 0x40, 0x7b, 0x32, 0x78, 0x6a, 0x3b, 0x2a, 0x9b, 0x1b, 0xb4, 0x82, 0x45, 0x71, 0x8e, 0xbe, + 0xef, 0x3a, 0x93, 0x31, 0xb5, 0xf5, 0xb6, 0x08, 0xe6, 0x4d, 0xa5, 0x5a, 0xcb, 0x94, 0x36, 0x00, + 0x14, 0x7f, 0x37, 0x0e, 0x79, 0x61, 0xb4, 0x75, 0x3c, 0x73, 0xdf, 0x42, 0x25, 0xc8, 0x88, 0xdb, + 0x9d, 0xe2, 0x72, 0xee, 0xf4, 0x69, 0x19, 0x45, 0x94, 0x77, 0x03, 0x85, 0x39, 0x27, 0xa9, 0xd0, + 0x75, 0x48, 0x50, 0x4d, 0xe1, 0x97, 0x1d, 0x8e, 0xb9, 0x75, 0xc2, 0x70, 0x0a, 0xdf, 0x8f, 0x41, + 0x5a, 0xb0, 0x42, 0x9f, 0x40, 0x3e, 0xb8, 0x94, 0x3a, 0xda, 0x73, 0xf8, 0x15, 0x81, 0x95, 0x39, + 0xd7, 0x11, 0xc5, 0xc9, 0x94, 0xa5, 0x5e, 0x6a, 0x7d, 0x0f, 0x32, 0xfc, 0x08, 0xcd, 0xea, 0x2f, + 0x2e, 0x3d, 0xc0, 0x43, 0xf7, 0x01, 0x14, 0x61, 0xc6, 0xe6, 0x1e, 0xb2, 0x29, 0x32, 0x54, 0x90, + 0xd1, 0xd7, 0x21, 0x27, 0x6f, 0x8d, 0x74, 0xe9, 0x91, 0x42, 0x74, 0xfe, 0x07, 0x8f, 0x5b, 0x2b, + 0x7c, 0x43, 0x5d, 0xfd, 0x8a, 0x12, 0x67, 0x25, 0xb1, 0xd1, 0x47, 0x9f, 0x40, 0xc2, 0xa7, 0x7b, + 0x0c, 0xec, 0xb2, 0x46, 0x71, 0xa1, 0xd0, 0x6f, 0xb6, 0x4d, 0xef, 0xa9, 0x14, 0x24, 0x21, 0x2b, + 0xfc, 0x6c, 0x04, 0xe2, 0x04, 0xba, 0xe0, 0xe8, 0xf8, 0x1a, 0xdd, 0xe1, 0x67, 0x37, 0x1a, 0xc5, + 0xc9, 0x06, 0xfb, 0x4a, 0x74, 0x66, 0xc3, 0xff, 0x4b, 0xdd, 0x1e, 0x0a, 0x0e, 0xf0, 0xe2, 0x0b, + 0x0e, 0xf0, 0x8a, 0x7f, 0x61, 0x05, 0x96, 0xc2, 0x26, 0xd7, 0xa9, 0xbc, 0x84, 0x4b, 0xa1, 0xcf, + 0x02, 0x03, 0x14, 0x09, 0x25, 0x1e, 0x7e, 0xef, 0x45, 0x6f, 0x20, 0xbd, 0x17, 0x9e, 0x42, 0x1f, + 0xc0, 0xeb, 0x9e, 0x6f, 0x0e, 0x88, 0x05, 0xcb, 0x20, 0xdd, 0x3d, 0xd7, 0x19, 0xf9, 0xd6, 0xa8, + 0xcf, 0xdd, 0x98, 0xb3, 0x3c, 0xbb, 0x4c, 0x73, 0xb7, 0x79, 0x26, 0x7a, 0x1f, 0xd6, 0xa6, 0xe8, + 0x9e, 0x10, 0x23, 0x6b, 0xd4, 0xe7, 0x67, 0x17, 0xab, 0x21, 0xb2, 0x2d, 0x96, 0x47, 0xfc, 0x62, + 0x7b, 0xe4, 0xf9, 0xee, 0x84, 0xaf, 0x81, 0xcc, 0xae, 0x0f, 0xc1, 0xd0, 0x35, 0xd0, 0xd8, 0x44, + 0xe7, 0x5a, 0x7b, 0x96, 0x4b, 0xfc, 0x2f, 0x8f, 0x9f, 0x6d, 0x2c, 0x53, 0x38, 0x96, 0x60, 0xf4, + 0x06, 0xe4, 0x18, 0xea, 0xd0, 0xa6, 0xab, 0x60, 0x9a, 0x19, 0x6b, 0x14, 0x56, 0xa3, 0x20, 0x54, + 0x80, 0xf4, 0x13, 0xd7, 0x1c, 0xf5, 0x0e, 0x2c, 0x7e, 0xc6, 0x81, 0x65, 0x1a, 0xbd, 0x09, 0x79, + 0xf6, 0x5f, 0xd0, 0x73, 0x7b, 0x9b, 0x01, 0x39, 0x83, 0x8b, 0x00, 0x4f, 0x26, 0x1e, 0x6f, 0x24, + 0xb7, 0xb5, 0x33, 0x4f, 0x26, 0x1e, 0x6b, 0x18, 0xc9, 0x76, 0xad, 0x3d, 0x91, 0xcd, 0xac, 0xeb, + 0x8c, 0x6b, 0xed, 0xf1, 0xec, 0x6b, 0x40, 0xbc, 0xa1, 0x6e, 0x6f, 0xe0, 0xf4, 0x9e, 0x52, 0xcb, + 0x3a, 0xc2, 0x1c, 0xdf, 0x72, 0xb3, 0x53, 0x26, 0x30, 0x9c, 0xee, 0x8d, 0x27, 0xf4, 0x1f, 0xe1, + 0x44, 0xb4, 0x95, 0xe3, 0x12, 0x83, 0x3a, 0x82, 0x33, 0x04, 0xc2, 0xb2, 0x37, 0x21, 0x3b, 0x36, + 0xf7, 0xad, 0x2e, 0x3d, 0x28, 0x91, 0xc6, 0x34, 0x01, 0xd1, 0xdb, 0xb6, 0x54, 0x18, 0x43, 0x7b, + 0xe4, 0xb8, 0x02, 0x83, 0xdb, 0xd2, 0x14, 0xa6, 0xa0, 0x98, 0x3f, 0x1c, 0xa0, 0x9c, 0xe1, 0x28, + 0x04, 0xc6, 0x51, 0x88, 0xf4, 0x49, 0x17, 0x3f, 0xf7, 0xbb, 0xde, 0x33, 0xdb, 0xa7, 0x72, 0x43, + 0x5c, 0xfa, 0x0c, 0xde, 0xe2, 0x60, 0xf4, 0x21, 0x2c, 0x91, 0xb6, 0x0d, 0xed, 0x7d, 0x97, 0x1f, + 0x9c, 0x53, 0x7b, 0x5a, 0xba, 0x5f, 0x35, 0x99, 0x41, 0xdd, 0xaf, 0x20, 0x49, 0x0a, 0x31, 0x07, + 0xf6, 0x3e, 0xfd, 0xfa, 0x40, 0xd4, 0x85, 0x19, 0xda, 0xcb, 0x12, 0x1e, 0xd4, 0xc7, 0x1a, 0x4e, + 0x06, 0xec, 0xbe, 0x00, 0x47, 0x65, 0xe6, 0xf6, 0xb2, 0x84, 0x73, 0xd4, 0x2b, 0xb0, 0x3c, 0xb8, + 0xd3, 0xed, 0x33, 0x8d, 0x18, 0x38, 0xc4, 0xf4, 0x59, 0x63, 0xab, 0xe4, 0xe0, 0x4e, 0x85, 0x42, + 0xab, 0x04, 0x48, 0x56, 0xec, 0x30, 0x9e, 0xe8, 0xfe, 0xd7, 0xd9, 0x8a, 0xad, 0x62, 0x73, 0x25, + 0xb8, 0x0a, 0x5a, 0x40, 0xe2, 0xf9, 0x8e, 0x6b, 0xb1, 0x0d, 0xd4, 0x38, 0x5e, 0x12, 0xd8, 0x2d, + 0x0a, 0x45, 0xef, 0xc1, 0xda, 0x14, 0xa6, 0xe0, 0x7e, 0x8e, 0xad, 0xae, 0x21, 0x7c, 0xce, 0xfe, + 0x36, 0xac, 0x06, 0x44, 0x63, 0xa2, 0xf7, 0x4c, 0xf0, 0x85, 0x70, 0x85, 0x9a, 0x32, 0x07, 0xdd, + 0x87, 0x73, 0xb3, 0x14, 0xa2, 0x24, 0x66, 0xe9, 0xae, 0x4d, 0x93, 0xf1, 0xc2, 0x98, 0x98, 0x6c, + 0x55, 0x4c, 0x17, 0x84, 0x98, 0x8c, 0x19, 0x31, 0xd9, 0xb3, 0x62, 0xba, 0x28, 0x6a, 0x65, 0x4c, + 0x8b, 0x89, 0xb5, 0xc3, 0x9e, 0x69, 0xc7, 0x46, 0x98, 0x62, 0xa6, 0x1d, 0xf6, 0xfc, 0x76, 0x6c, + 0x8a, 0x76, 0x18, 0xf3, 0xda, 0x71, 0x0d, 0x32, 0x83, 0x41, 0x8f, 0xb7, 0x80, 0x1a, 0xae, 0x6c, + 0x68, 0x55, 0xab, 0x65, 0xda, 0x00, 0x9c, 0x1e, 0x0c, 0x7a, 0xac, 0x29, 0xf7, 0x61, 0x59, 0xa0, + 0x0a, 0xde, 0x6f, 0x04, 0xaa, 0xca, 0x09, 0x18, 0x5b, 0x9c, 0xe7, 0x54, 0xbc, 0x94, 0x1b, 0x00, + 0x84, 0x94, 0xf7, 0x39, 0x35, 0x51, 0xd9, 0x7e, 0x47, 0xb5, 0x5a, 0x66, 0x5d, 0x8e, 0x49, 0x35, + 0x78, 0xef, 0x7f, 0x15, 0x34, 0x89, 0x2d, 0x4a, 0x7a, 0x93, 0xd2, 0xa0, 0xa3, 0x97, 0x9b, 0x4b, + 0x82, 0x86, 0x17, 0xb5, 0x24, 0x08, 0x79, 0x59, 0x1f, 0x02, 0x81, 0xa8, 0x82, 0x7b, 0x2b, 0x54, + 0xcb, 0x40, 0x6e, 0xb4, 0x96, 0x8a, 0x18, 0x75, 0x58, 0x51, 0x29, 0x45, 0xd1, 0xd4, 0x04, 0x65, + 0x76, 0x98, 0x42, 0xce, 0x4b, 0x3f, 0xa3, 0xb0, 0x08, 0x1a, 0xdb, 0xf7, 0x07, 0x4f, 0xb8, 0x4c, + 0xaf, 0x04, 0x8d, 0xad, 0xb4, 0xab, 0x5b, 0x4c, 0xa8, 0x19, 0x82, 0xc0, 0xa4, 0xfa, 0x55, 0xd0, + 0x24, 0xb6, 0x28, 0xf1, 0xed, 0xa0, 0xb1, 0x82, 0x46, 0x34, 0x56, 0x10, 0xf2, 0xb2, 0x6e, 0x41, + 0x96, 0x52, 0x73, 0xc9, 0x52, 0x43, 0x95, 0xdd, 0xd2, 0x21, 0x84, 0x5c, 0xb4, 0xb4, 0x3a, 0x5c, + 0xb6, 0x9f, 0xc2, 0x99, 0x80, 0x40, 0x94, 0x47, 0x4d, 0x56, 0xb6, 0x67, 0x23, 0xc9, 0x78, 0x81, + 0xcb, 0x92, 0x96, 0x97, 0xf8, 0x11, 0x50, 0x90, 0x2a, 0xdf, 0x77, 0xc2, 0xd5, 0x55, 0x04, 0x4c, + 0xab, 0xab, 0x48, 0x78, 0x17, 0x56, 0x43, 0xc4, 0xa2, 0x02, 0xd7, 0x29, 0x07, 0xba, 0x83, 0xa6, + 0x72, 0xe0, 0x75, 0x40, 0x2a, 0x97, 0x40, 0xc8, 0x76, 0x20, 0xe4, 0x1b, 0x81, 0x90, 0x8d, 0x40, + 0xc8, 0xb6, 0x2a, 0x64, 0x7b, 0x5a, 0xc8, 0xef, 0x06, 0xb5, 0x36, 0xa6, 0x84, 0x6c, 0x87, 0x85, + 0xfc, 0x06, 0xf0, 0xc5, 0x8c, 0x97, 0x76, 0x93, 0x4d, 0xf8, 0x0c, 0xc6, 0x0a, 0xb8, 0x01, 0x48, + 0x41, 0x11, 0x45, 0xdc, 0xa2, 0x88, 0x5a, 0x80, 0x18, 0xac, 0x86, 0x23, 0xa7, 0x2f, 0xe6, 0x8d, + 0xdb, 0x6c, 0xb9, 0x23, 0x10, 0xc6, 0xec, 0x2a, 0x68, 0x32, 0x5b, 0xb0, 0xba, 0xc3, 0xe6, 0x49, + 0x81, 0xc4, 0x19, 0x6d, 0x42, 0x96, 0x62, 0xf2, 0xee, 0xbf, 0xcb, 0x77, 0x62, 0x9c, 0xbe, 0x98, + 0x48, 0xdf, 0x81, 0x33, 0x01, 0x82, 0xe0, 0xf5, 0x1e, 0x9b, 0xf9, 0x25, 0x1a, 0x67, 0xf6, 0x36, + 0x50, 0x90, 0xda, 0xb3, 0xef, 0x07, 0xa5, 0x2a, 0xbd, 0x78, 0x1b, 0x56, 0x43, 0x88, 0x82, 0xef, + 0x3d, 0x36, 0x41, 0xa9, 0xd8, 0x8c, 0x75, 0xf1, 0x10, 0x52, 0xfc, 0x08, 0x1e, 0x7d, 0x00, 0x69, + 0x73, 0x9f, 0xac, 0x58, 0xf2, 0x9a, 0xf3, 0xf4, 0x87, 0x00, 0x74, 0x63, 0x9e, 0x27, 0x70, 0x8a, + 0x22, 0x1b, 0x53, 0xf6, 0x62, 0xf4, 0x74, 0xf6, 0x62, 0xf1, 0x47, 0x56, 0x20, 0x41, 0x63, 0x9e, + 0xf0, 0x40, 0x03, 0x91, 0x50, 0xe8, 0x0a, 0x1e, 0x0d, 0x65, 0xc6, 0x34, 0xfd, 0xfa, 0xd4, 0xa7, + 0x5f, 0xd1, 0x90, 0xd1, 0xad, 0x7e, 0xfa, 0x25, 0x8d, 0xee, 0x63, 0x3f, 0xff, 0x7a, 0xa0, 0x34, + 0x37, 0x16, 0x0e, 0x9c, 0xc1, 0x9b, 0xbb, 0xcc, 0x79, 0xcc, 0x36, 0x59, 0xfd, 0x78, 0x23, 0x7e, + 0xf2, 0xc7, 0x1b, 0xa7, 0xfd, 0x0e, 0xce, 0x80, 0x9c, 0xf2, 0x61, 0x1e, 0x31, 0x1f, 0x63, 0xf3, + 0xbf, 0xcc, 0x93, 0xad, 0x0b, 0x60, 0x1e, 0xce, 0x06, 0x9f, 0xe6, 0x4d, 0x7f, 0x07, 0x92, 0x3a, + 0xf5, 0xd5, 0xf3, 0xcb, 0x10, 0x9b, 0xb8, 0x03, 0x7e, 0xd9, 0x12, 0xc4, 0xc9, 0x06, 0xae, 0xb2, + 0xcf, 0x82, 0x3a, 0xb8, 0x8a, 0x49, 0xfe, 0x9c, 0x50, 0x16, 0x99, 0x57, 0x08, 0x65, 0x31, 0xef, + 0x9a, 0x24, 0x7c, 0xa9, 0x6b, 0x92, 0xc1, 0x47, 0x27, 0xd9, 0x93, 0x3e, 0x3a, 0xf9, 0x8b, 0x4b, + 0x90, 0x91, 0xe1, 0x63, 0xd0, 0xbd, 0xd0, 0x37, 0x27, 0xe7, 0x55, 0xbd, 0xbb, 0x29, 0xb1, 0x66, + 0x6f, 0xad, 0xdd, 0x23, 0x6e, 0xce, 0x64, 0xd4, 0x13, 0xf7, 0xd6, 0x2e, 0x1e, 0x43, 0x58, 0xa5, + 0x48, 0x98, 0x23, 0xa3, 0x0f, 0x21, 0xc5, 0xae, 0x51, 0x8a, 0xab, 0x7b, 0x1b, 0xc7, 0xd0, 0xb1, + 0xdb, 0x8a, 0x16, 0x16, 0xe8, 0xe8, 0x13, 0xc8, 0x4c, 0x46, 0x82, 0x36, 0x1e, 0xfa, 0x56, 0x7d, + 0x9a, 0xb6, 0x23, 0xf0, 0x70, 0x40, 0x42, 0x2a, 0xdc, 0xa3, 0x77, 0x48, 0xf8, 0xad, 0xb6, 0xe3, + 0x2a, 0xcc, 0x2e, 0x9a, 0x60, 0x8e, 0x4c, 0x2a, 0xdc, 0xb7, 0x3c, 0xdf, 0x75, 0x5e, 0xf0, 0x8b, + 0xcb, 0xc7, 0x55, 0xb8, 0xc2, 0xb0, 0xb0, 0x40, 0x47, 0x3a, 0xe4, 0x58, 0xa3, 0xbb, 0x74, 0x33, + 0x82, 0xdf, 0xf5, 0x2d, 0x2e, 0x94, 0xd3, 0x0e, 0xc1, 0xc4, 0xd9, 0x41, 0x90, 0xe0, 0xb3, 0x42, + 0x2e, 0xf4, 0xad, 0x8b, 0x12, 0xfc, 0x27, 0x74, 0x77, 0x6f, 0x0b, 0xb2, 0xfb, 0xae, 0xf3, 0xac, + 0xcb, 0xef, 0x50, 0xb2, 0x0d, 0xfe, 0x37, 0x8e, 0x29, 0x71, 0xc7, 0x75, 0x9e, 0xf1, 0x7b, 0x95, + 0xb0, 0x2f, 0xff, 0xa3, 0x5d, 0xc8, 0x7b, 0x07, 0xae, 0x3d, 0x7a, 0x2a, 0xb8, 0x2c, 0x85, 0x3e, + 0x75, 0x98, 0xe6, 0xd2, 0xa2, 0xb8, 0x9c, 0x4f, 0xce, 0x53, 0x52, 0xa4, 0x36, 0x4c, 0x88, 0x5d, + 0x7a, 0xd7, 0x79, 0x79, 0x61, 0x6d, 0x98, 0xd8, 0x2b, 0xb6, 0xf7, 0x14, 0x43, 0x4f, 0xfe, 0x27, + 0x42, 0xe4, 0xf2, 0x64, 0x4c, 0xb4, 0x85, 0x42, 0xe4, 0x7d, 0x40, 0xb9, 0x64, 0xfb, 0x41, 0xa2, + 0xf0, 0x09, 0x24, 0x99, 0x80, 0xd1, 0xfb, 0xdc, 0xf9, 0x22, 0x43, 0x4d, 0xec, 0xed, 0x2c, 0xab, + 0xdb, 0x00, 0xc1, 0xb6, 0x0a, 0xf5, 0xc9, 0x48, 0xda, 0x2b, 0xfc, 0x7f, 0x90, 0x55, 0x3a, 0x08, + 0xdd, 0x83, 0xb4, 0x98, 0x62, 0x4e, 0xde, 0x9d, 0x91, 0xa8, 0xe8, 0x3e, 0x2f, 0x9b, 0xe9, 0x43, + 0x34, 0xf4, 0xe5, 0x07, 0x29, 0x7b, 0x47, 0x6c, 0x5a, 0xa9, 0x15, 0xa0, 0xc0, 0xc2, 0x27, 0x64, + 0x75, 0x62, 0x8a, 0x1c, 0x9a, 0x50, 0x23, 0xa7, 0x9b, 0x50, 0x0b, 0x5f, 0x83, 0x8c, 0x1c, 0x15, + 0x5f, 0x8e, 0xc3, 0x7d, 0x48, 0xb2, 0x3e, 0x42, 0xb7, 0x20, 0xc5, 0x54, 0xe3, 0x04, 0x62, 0x81, + 0x55, 0x78, 0x00, 0x29, 0xde, 0x33, 0xaf, 0x4e, 0x3b, 0x02, 0x08, 0x14, 0x15, 0xbd, 0x2b, 0xef, + 0x07, 0x87, 0x63, 0x28, 0x4d, 0x51, 0x8b, 0x7b, 0xc2, 0x77, 0x20, 0x6d, 0xf6, 0xfb, 0xb6, 0xdc, + 0x2d, 0x39, 0x96, 0x40, 0xa2, 0x15, 0x7c, 0xc8, 0xa9, 0x2a, 0xfd, 0xaa, 0x25, 0xde, 0x83, 0xb4, + 0x37, 0x79, 0xc2, 0x3e, 0x5d, 0x8f, 0x86, 0x34, 0x43, 0xfd, 0xe6, 0x40, 0x94, 0x2a, 0x50, 0x0b, + 0xdf, 0x89, 0x00, 0x04, 0x23, 0x80, 0x14, 0x2a, 0xcf, 0xc1, 0x17, 0x15, 0xca, 0x4f, 0xbf, 0x1f, + 0x42, 0xd6, 0x37, 0xdd, 0x7d, 0xcb, 0xef, 0x2a, 0x1f, 0x45, 0xbc, 0xca, 0x45, 0x64, 0x60, 0xe4, + 0x04, 0x52, 0xf8, 0x2a, 0x64, 0x95, 0x61, 0xf4, 0x8a, 0x55, 0x29, 0xfe, 0xfd, 0xc8, 0x31, 0x57, + 0xc9, 0xab, 0xa5, 0x4e, 0xbd, 0xbc, 0xcb, 0xbe, 0x7c, 0x63, 0xff, 0xbb, 0x3b, 0xb8, 0xd1, 0x69, + 0x6a, 0x49, 0x82, 0xca, 0x3e, 0x3e, 0xd4, 0xb5, 0x28, 0xca, 0x43, 0xa6, 0x53, 0x17, 0xc9, 0x18, + 0xfd, 0x78, 0x1a, 0xeb, 0xa5, 0xb6, 0xae, 0xc5, 0xd9, 0x57, 0xd5, 0xad, 0x36, 0x6e, 0x7c, 0xae, + 0x25, 0xd0, 0x32, 0x64, 0x77, 0x70, 0xe3, 0xb1, 0xf8, 0xf8, 0x30, 0x8b, 0xce, 0x40, 0xbe, 0xb5, + 0x8b, 0x8d, 0xfa, 0x43, 0x01, 0xca, 0x11, 0x1c, 0x46, 0xdc, 0xad, 0x18, 0xad, 0x87, 0x5a, 0x9e, + 0x94, 0xcd, 0x39, 0x30, 0xc8, 0x12, 0xff, 0xea, 0xee, 0x37, 0xa2, 0x90, 0x33, 0x46, 0x87, 0x96, + 0xeb, 0x59, 0xcc, 0x14, 0xbb, 0xb5, 0xc0, 0x14, 0x93, 0xc6, 0x10, 0x07, 0xd0, 0x99, 0x97, 0x5b, + 0x0b, 0xd1, 0x13, 0xac, 0x85, 0x69, 0xb3, 0x2d, 0xf6, 0x03, 0x98, 0x6d, 0xaa, 0x95, 0x1a, 0x7f, + 0x05, 0x2b, 0xb5, 0x3c, 0x63, 0xb1, 0x24, 0x68, 0x2d, 0xe6, 0x5b, 0x2c, 0x62, 0x0b, 0x7e, 0xca, + 0x6e, 0x09, 0x4d, 0x21, 0xc9, 0x53, 0x9a, 0xba, 0x3f, 0x9b, 0x80, 0xb4, 0x98, 0x63, 0x17, 0xec, + 0xd0, 0x7e, 0x00, 0x29, 0x36, 0x45, 0x1f, 0xb3, 0x4d, 0xbb, 0xc4, 0x45, 0xc3, 0x83, 0xfb, 0xe1, + 0x24, 0x9d, 0xa7, 0x7f, 0x30, 0x3b, 0x36, 0xd4, 0x9e, 0xf8, 0x29, 0xad, 0xd4, 0x5b, 0xca, 0x32, + 0x90, 0x08, 0xdd, 0xe2, 0x51, 0x97, 0x01, 0x65, 0x01, 0x10, 0x71, 0x22, 0x92, 0x4a, 0x9c, 0x88, + 0x57, 0x0b, 0xf9, 0x70, 0x0f, 0x72, 0x07, 0x34, 0x10, 0x4c, 0x97, 0x06, 0x08, 0x9b, 0x0a, 0xf9, + 0xa0, 0xc4, 0x88, 0xc1, 0xd9, 0x03, 0x25, 0xc6, 0x4f, 0xe8, 0x93, 0xd6, 0xcc, 0xe9, 0x22, 0x36, + 0x04, 0x1b, 0xd9, 0xb0, 0x38, 0x68, 0x82, 0x12, 0xd8, 0x21, 0x7b, 0xba, 0xc0, 0x0e, 0x77, 0x21, + 0xfb, 0xd4, 0x1e, 0x0c, 0xba, 0x63, 0x1a, 0x4e, 0x85, 0x1b, 0x37, 0xc2, 0x62, 0x0d, 0xe2, 0xac, + 0x60, 0x78, 0x1a, 0xc4, 0x5c, 0xb9, 0x02, 0x09, 0xd6, 0xe4, 0x7c, 0xe8, 0x9b, 0x2b, 0x19, 0x36, + 0x06, 0xb3, 0x6c, 0x54, 0x86, 0x95, 0xa1, 0xf9, 0xbc, 0xdb, 0x73, 0x86, 0xe3, 0x81, 0x45, 0xad, + 0x6a, 0xdf, 0x96, 0x56, 0xcc, 0xdc, 0x90, 0x11, 0x67, 0x86, 0xe6, 0xf3, 0xb2, 0x44, 0x6f, 0xdb, + 0x43, 0xab, 0xf8, 0x55, 0xc8, 0x87, 0x16, 0x64, 0x7a, 0x9c, 0x43, 0x0f, 0x26, 0x16, 0x5a, 0x0c, + 0x0c, 0xa7, 0xf8, 0xef, 0x12, 0x27, 0x9e, 0x42, 0x7c, 0x59, 0x1d, 0xff, 0x93, 0x9c, 0x40, 0xb6, + 0xc2, 0xd1, 0x4f, 0xe2, 0xa1, 0x5e, 0x50, 0x7c, 0xac, 0xa5, 0x05, 0x91, 0x4f, 0xd4, 0x31, 0x97, + 0x78, 0xc5, 0x31, 0x77, 0x85, 0xc6, 0x43, 0xf4, 0xad, 0xf5, 0x24, 0x5d, 0xb0, 0x34, 0x45, 0x02, + 0x2d, 0x02, 0xc7, 0x2c, 0x3b, 0x3c, 0x36, 0x53, 0xa7, 0x1c, 0x9b, 0xef, 0x29, 0xf1, 0x8a, 0xd2, + 0x21, 0xef, 0x51, 0xf0, 0x9f, 0x78, 0x72, 0x19, 0x16, 0x81, 0x8c, 0xbe, 0x06, 0x2b, 0xec, 0x7f, + 0x77, 0x32, 0xee, 0x13, 0xc3, 0x95, 0xd5, 0x2f, 0x43, 0x5d, 0xa3, 0xd9, 0xfa, 0x9d, 0x61, 0xc8, + 0x1d, 0x8a, 0x4b, 0x41, 0x68, 0x0b, 0x50, 0x98, 0xc3, 0x64, 0x62, 0xb3, 0xcf, 0xe6, 0x72, 0xec, + 0x12, 0x57, 0x4b, 0x21, 0xe9, 0x74, 0x8c, 0x0a, 0xd6, 0x54, 0x26, 0x9d, 0x89, 0xdd, 0x3f, 0x6d, + 0x90, 0xbc, 0x2f, 0x13, 0x51, 0x25, 0x34, 0x0f, 0xe4, 0x4f, 0x37, 0x0f, 0x88, 0xf0, 0x40, 0x4b, + 0x41, 0x78, 0xa0, 0x62, 0x0d, 0xd6, 0xda, 0xf4, 0x42, 0x2f, 0x13, 0x37, 0x3d, 0xc1, 0x66, 0xee, + 0xe4, 0x97, 0xb1, 0x2d, 0x8b, 0x17, 0x20, 0x4e, 0x64, 0x11, 0xc4, 0x27, 0x22, 0x03, 0x26, 0x27, + 0x3e, 0xa0, 0xfd, 0xad, 0xa8, 0xea, 0xaf, 0x4e, 0x07, 0xbd, 0x89, 0x7c, 0xc9, 0xa0, 0x37, 0xea, + 0xf2, 0x19, 0x7d, 0x85, 0xe5, 0xf3, 0x36, 0xc4, 0xa9, 0x9b, 0xce, 0x46, 0xde, 0xda, 0x7c, 0x4f, + 0x44, 0x8c, 0x75, 0x9b, 0x45, 0x3d, 0xc8, 0x0f, 0x4c, 0xdf, 0xf2, 0xfc, 0x2e, 0xeb, 0x6a, 0x7e, + 0x42, 0xba, 0x36, 0xed, 0xcc, 0x85, 0x94, 0x32, 0xc7, 0x48, 0x18, 0x0c, 0x7d, 0xa8, 0x68, 0x73, + 0x22, 0x14, 0x2c, 0x6a, 0x3e, 0x75, 0xa0, 0xd2, 0xef, 0x42, 0x9c, 0xaa, 0x60, 0x92, 0x96, 0x99, + 0x15, 0x6b, 0x7c, 0xc7, 0xa8, 0x28, 0x71, 0xa5, 0x88, 0x1e, 0x52, 0xb4, 0xe2, 0x4f, 0x47, 0x61, + 0x79, 0x8a, 0x25, 0x91, 0xb8, 0x23, 0x40, 0xb3, 0x12, 0x57, 0x7d, 0x51, 0x2a, 0x71, 0x05, 0x80, + 0xb3, 0x92, 0xd0, 0xe8, 0xa3, 0x3b, 0x62, 0xbc, 0x33, 0x03, 0xf5, 0xec, 0xbc, 0x16, 0x58, 0x4a, + 0x14, 0x54, 0xfa, 0xe9, 0x73, 0x6a, 0x68, 0x79, 0x9e, 0xb9, 0x2f, 0xbe, 0x74, 0x14, 0x49, 0xb4, + 0x0d, 0x2b, 0x3d, 0x87, 0x98, 0x6c, 0xbe, 0xd5, 0xef, 0x9e, 0x72, 0xe9, 0x46, 0x92, 0x02, 0xcb, + 0x79, 0xe2, 0x1a, 0x97, 0x0f, 0x5b, 0xbf, 0x43, 0xf2, 0x49, 0x4f, 0xc9, 0xe6, 0x65, 0x14, 0x96, + 0xe9, 0x72, 0xc3, 0xe4, 0xc2, 0xb7, 0x5d, 0x4e, 0x8e, 0xb6, 0x28, 0xbf, 0xf3, 0x9b, 0x8a, 0x5c, + 0xb1, 0xa1, 0x62, 0x07, 0x3c, 0x67, 0xa3, 0x2d, 0xde, 0x0f, 0x45, 0x5b, 0x3c, 0x7f, 0x0c, 0xd9, + 0xdc, 0x98, 0x8b, 0xf7, 0x58, 0x28, 0xb9, 0x78, 0xe8, 0xbb, 0xdd, 0x69, 0xca, 0xd9, 0xa0, 0x87, + 0x57, 0x82, 0xa0, 0x87, 0xe7, 0x21, 0x63, 0x3d, 0xa7, 0x37, 0x9a, 0xfa, 0xac, 0x99, 0x09, 0x62, + 0xd0, 0xd8, 0x7e, 0xd9, 0xe9, 0x5b, 0x85, 0xb7, 0x79, 0x74, 0xc3, 0x4d, 0xc8, 0xf2, 0x69, 0x4f, + 0xa2, 0xe5, 0xd9, 0x25, 0x81, 0x89, 0x47, 0x11, 0xdf, 0x64, 0x01, 0x0d, 0x2f, 0x40, 0xc6, 0x9b, + 0xf4, 0x7a, 0x96, 0xd5, 0xb7, 0x98, 0x1e, 0xa5, 0x71, 0x00, 0x28, 0xfe, 0xcc, 0x32, 0x40, 0x30, + 0x3b, 0xab, 0x6b, 0x64, 0xe4, 0x55, 0xd6, 0xc8, 0x2b, 0x61, 0x3d, 0x3b, 0x76, 0x5d, 0x11, 0xd6, + 0x58, 0x4c, 0xb1, 0xc6, 0x14, 0x85, 0x8b, 0x87, 0x15, 0xee, 0x83, 0xd0, 0x4a, 0x77, 0xfa, 0xf9, + 0xe2, 0x82, 0x7a, 0xaa, 0x9f, 0xe4, 0x87, 0xbd, 0xf2, 0x3c, 0x7f, 0x6a, 0x0d, 0x4e, 0x7d, 0x99, + 0x35, 0x78, 0x1d, 0x52, 0xcc, 0xd6, 0x7b, 0x41, 0xcd, 0xc1, 0x34, 0x16, 0x49, 0x74, 0x5b, 0x3a, + 0x6f, 0x99, 0x50, 0x48, 0xab, 0x40, 0xc8, 0xd3, 0x17, 0xa9, 0x6f, 0x43, 0xd2, 0xb5, 0x4c, 0xcf, + 0x61, 0xb1, 0x6b, 0xe6, 0x52, 0x60, 0x9a, 0x8f, 0x39, 0x1e, 0xba, 0xc0, 0x07, 0x50, 0x96, 0xae, + 0x71, 0x53, 0x63, 0x46, 0x59, 0xcb, 0x72, 0x8b, 0xd6, 0xb2, 0x12, 0x3b, 0x8c, 0x66, 0x77, 0x48, + 0xf8, 0x2c, 0xc9, 0x96, 0xa7, 0xb5, 0xe9, 0xe5, 0x89, 0xd5, 0x82, 0x1d, 0x52, 0x2b, 0x00, 0xf4, + 0x00, 0xb4, 0x09, 0xfb, 0xa6, 0x87, 0x5e, 0x74, 0x52, 0x8c, 0xbe, 0xe9, 0x40, 0xcb, 0x78, 0x59, + 0x41, 0x24, 0x40, 0x74, 0x1f, 0x72, 0xd4, 0x78, 0x14, 0x45, 0x2f, 0x87, 0x8b, 0x0e, 0x0f, 0x17, + 0x9c, 0xed, 0x05, 0x00, 0xf4, 0x31, 0xb0, 0xeb, 0xe1, 0xec, 0x4a, 0x86, 0x16, 0xda, 0x5a, 0x9c, + 0xbf, 0x44, 0x62, 0x85, 0xa0, 0xb8, 0x25, 0x3f, 0x23, 0x26, 0xfe, 0x2b, 0x0b, 0xb2, 0x53, 0x2b, + 0xb5, 0xda, 0x3a, 0x66, 0xf1, 0x93, 0x38, 0x88, 0x86, 0x51, 0xd2, 0x22, 0x68, 0x05, 0x96, 0x39, + 0x44, 0xff, 0x4c, 0x2f, 0x77, 0xda, 0x0d, 0xac, 0x45, 0x8b, 0xbf, 0x9d, 0x86, 0x24, 0xeb, 0x14, + 0x54, 0x84, 0x0d, 0xac, 0x97, 0x5a, 0x8d, 0x7a, 0x97, 0xc7, 0x34, 0x94, 0x78, 0xdd, 0xed, 0x92, + 0x51, 0xd5, 0x2b, 0xda, 0x6b, 0x21, 0x9c, 0x7a, 0xbb, 0x64, 0xd4, 0x75, 0xdc, 0xe5, 0x1e, 0x39, + 0xc7, 0x39, 0x8b, 0x36, 0xe1, 0xfc, 0x2c, 0x8e, 0x51, 0x33, 0xda, 0x34, 0x3e, 0x90, 0xb6, 0x82, + 0xde, 0x82, 0x4b, 0x0b, 0x10, 0x98, 0x77, 0xbd, 0x8a, 0xae, 0x40, 0x71, 0x11, 0x56, 0x4d, 0xaf, + 0x35, 0xf0, 0xe7, 0x5a, 0x1a, 0x6d, 0x40, 0x61, 0x06, 0xaf, 0x89, 0x75, 0xbd, 0xd6, 0x6c, 0xeb, + 0x15, 0xed, 0xcc, 0xdc, 0x2a, 0xb3, 0x98, 0x52, 0xa2, 0xca, 0x6b, 0x4a, 0x59, 0xb5, 0xd2, 0x67, + 0xa4, 0xf9, 0xcd, 0xaa, 0x4e, 0x4b, 0x69, 0x1b, 0x35, 0xbd, 0x8b, 0xf5, 0x52, 0x79, 0x57, 0xaf, + 0x68, 0x6f, 0xa0, 0xab, 0xf0, 0x16, 0xc7, 0x93, 0xa2, 0xc1, 0xfa, 0x8e, 0xd1, 0x6a, 0xe3, 0x92, + 0x44, 0x6f, 0x74, 0xda, 0xda, 0xeb, 0xe8, 0x1d, 0xb8, 0x32, 0x8b, 0x39, 0x17, 0x77, 0x5d, 0x69, + 0x81, 0xc4, 0x6d, 0xeb, 0xb8, 0x66, 0xd4, 0x4b, 0xa4, 0x05, 0x11, 0x74, 0x09, 0x2e, 0x4c, 0xe7, + 0x77, 0xea, 0x8c, 0x97, 0x8e, 0xf5, 0x8a, 0x16, 0x45, 0x17, 0x60, 0x9d, 0x63, 0x6c, 0xe3, 0x52, + 0x4d, 0x7f, 0xdc, 0xc0, 0x0f, 0xbb, 0x58, 0xaf, 0x35, 0x1e, 0xe9, 0x15, 0x2d, 0x46, 0x3a, 0x9e, + 0xe7, 0xee, 0x94, 0xbb, 0x3a, 0xc6, 0x0d, 0xac, 0xc5, 0x95, 0x42, 0x8d, 0xfa, 0xa3, 0x52, 0xd5, + 0xa8, 0x04, 0xa4, 0x46, 0x45, 0x4b, 0xa0, 0x73, 0x70, 0x76, 0x2a, 0xbf, 0xb1, 0xbd, 0xad, 0xe3, + 0x96, 0x96, 0x54, 0xea, 0x63, 0x34, 0xba, 0xad, 0xc7, 0x46, 0xbb, 0xbc, 0xbb, 0xd5, 0x28, 0x61, + 0xa2, 0x2f, 0x06, 0xa9, 0xf1, 0x79, 0x85, 0x39, 0xd3, 0x47, 0xd2, 0xa7, 0xe5, 0x46, 0xbd, 0xae, + 0x97, 0x49, 0x7e, 0x4a, 0x61, 0x8e, 0xf5, 0x72, 0xa3, 0x5e, 0x36, 0xaa, 0x06, 0x53, 0x8e, 0x8c, + 0xd2, 0x14, 0x19, 0xff, 0xb8, 0x2b, 0x36, 0x83, 0x10, 0xba, 0x08, 0xe7, 0x78, 0x2e, 0x0b, 0x0e, + 0x16, 0xe2, 0x0b, 0x68, 0x1d, 0x56, 0x43, 0xd9, 0x42, 0x06, 0x59, 0x45, 0xe7, 0x42, 0x39, 0xdd, + 0xad, 0xcf, 0xbb, 0x8d, 0xa6, 0x8e, 0x4b, 0x64, 0x34, 0x6c, 0xce, 0xb0, 0x17, 0x5d, 0x46, 0xc5, + 0x7c, 0x89, 0x45, 0xba, 0x0a, 0x65, 0xb7, 0xda, 0x25, 0x4c, 0x8a, 0xce, 0xcd, 0x14, 0x2d, 0xea, + 0x9c, 0x57, 0x8a, 0x96, 0x31, 0xa0, 0xf5, 0x4a, 0xb7, 0xd2, 0xc1, 0x46, 0x7d, 0x87, 0x0f, 0x1e, + 0x6d, 0x63, 0x1a, 0xab, 0xbc, 0xab, 0x97, 0x1f, 0xd2, 0x38, 0xd1, 0x9d, 0x16, 0x57, 0xd7, 0x8a, + 0x76, 0x01, 0x5d, 0x87, 0xb7, 0x55, 0xac, 0x5d, 0xbd, 0x54, 0x6d, 0xef, 0xce, 0x47, 0xbe, 0xa8, + 0xb4, 0x86, 0x22, 0xd3, 0x2d, 0x33, 0xd1, 0x9b, 0xda, 0x39, 0x65, 0x60, 0x28, 0xd9, 0x9d, 0x7a, + 0xa9, 0xd3, 0xde, 0x6d, 0x60, 0xe3, 0x9b, 0x7a, 0x45, 0x2b, 0xb0, 0x88, 0xd6, 0x01, 0x8e, 0x20, + 0x5e, 0x52, 0xba, 0x89, 0x66, 0x84, 0xc8, 0x96, 0xa7, 0xc9, 0x84, 0x2c, 0xb4, 0xe2, 0x7b, 0x90, + 0xda, 0xb6, 0x07, 0xbe, 0x45, 0xbf, 0xb2, 0x5c, 0x72, 0xad, 0xbd, 0x89, 0x67, 0x75, 0x83, 0xb7, + 0x01, 0x68, 0xb0, 0xf3, 0x7b, 0x38, 0xcf, 0x32, 0x78, 0xcc, 0xdc, 0xe2, 0xdf, 0x89, 0x42, 0x56, + 0x09, 0x4b, 0x8a, 0x3e, 0x85, 0xcc, 0xa1, 0xe9, 0xda, 0x64, 0x06, 0x16, 0x6e, 0xc2, 0xf9, 0xd9, + 0xe8, 0xa5, 0x37, 0x1f, 0x71, 0x1c, 0xe1, 0x32, 0x48, 0x9a, 0xc2, 0xaf, 0x44, 0x20, 0x2d, 0x72, + 0x17, 0xf8, 0xd9, 0xd2, 0xa3, 0x88, 0xaa, 0x11, 0x4f, 0x3f, 0x92, 0x61, 0xa5, 0xd4, 0x38, 0x6b, + 0xf3, 0x0a, 0xa6, 0x06, 0xdc, 0x83, 0xc4, 0xa3, 0x52, 0xb5, 0xa3, 0x73, 0x3b, 0xee, 0x32, 0x24, + 0x3d, 0xab, 0xe7, 0xca, 0xc8, 0x47, 0x62, 0x49, 0x6b, 0x51, 0x20, 0xe6, 0x99, 0xc5, 0xdb, 0xf3, + 0x36, 0x42, 0x33, 0xc0, 0x58, 0xb1, 0xb0, 0x90, 0x2d, 0xbd, 0x8c, 0xf5, 0xb6, 0x8c, 0xfd, 0xf5, + 0x29, 0x64, 0xe4, 0x3b, 0x03, 0x68, 0x0d, 0x62, 0x4f, 0xad, 0x17, 0xa1, 0x16, 0x11, 0x40, 0x10, + 0x69, 0x28, 0x3a, 0x1b, 0x69, 0x68, 0x0b, 0x40, 0x32, 0xf0, 0xd0, 0xfb, 0x90, 0x19, 0x8b, 0x14, + 0x17, 0xf1, 0x71, 0xcf, 0x19, 0x04, 0x88, 0xc5, 0x5d, 0xba, 0x11, 0xdd, 0xb7, 0x46, 0xbe, 0x6d, + 0x0e, 0x50, 0x31, 0x1c, 0xab, 0x24, 0x28, 0x51, 0x89, 0x58, 0xb2, 0x26, 0xe5, 0x11, 0xe5, 0x11, + 0x83, 0x99, 0x00, 0x76, 0x21, 0x1b, 0x70, 0xf2, 0xd0, 0x7d, 0x7a, 0x1a, 0x24, 0x92, 0xbc, 0x42, + 0xc2, 0xd2, 0x09, 0x10, 0xc5, 0xbb, 0x12, 0x0a, 0x6e, 0xf1, 0x67, 0xa2, 0x90, 0x64, 0xd2, 0x45, + 0x37, 0x42, 0xf6, 0x36, 0x0a, 0x89, 0x7e, 0xde, 0x21, 0x65, 0x46, 0xde, 0x2d, 0xe4, 0x46, 0xf7, + 0xeb, 0x61, 0x12, 0x79, 0xc7, 0x10, 0x07, 0x98, 0xe8, 0x9a, 0x1a, 0x26, 0x37, 0xd8, 0x34, 0xe2, + 0x24, 0x74, 0x23, 0x5f, 0x84, 0xa4, 0xfa, 0x0a, 0x64, 0x24, 0x8b, 0x05, 0x6a, 0xa8, 0xb1, 0xde, + 0x64, 0x02, 0x22, 0x7f, 0x0b, 0xe7, 0x45, 0x30, 0x2f, 0x61, 0x85, 0x32, 0x97, 0x97, 0xfe, 0x2f, + 0xbe, 0x37, 0x4f, 0x77, 0xf2, 0x90, 0xc1, 0xfa, 0xb6, 0x8e, 0xf5, 0x3a, 0x8d, 0x20, 0x27, 0x55, + 0x49, 0xa8, 0xcf, 0x1e, 0x64, 0xb0, 0xe9, 0x33, 0x43, 0x03, 0x9d, 0x83, 0xd8, 0x17, 0x63, 0x3e, + 0x1c, 0x99, 0x6d, 0xff, 0x8d, 0x66, 0x0b, 0x13, 0x58, 0xb8, 0x4f, 0xa3, 0xf3, 0xfb, 0xb4, 0x00, + 0xe9, 0x9e, 0x39, 0x36, 0x7b, 0xe2, 0x69, 0x86, 0x38, 0x96, 0xe9, 0xe2, 0xbf, 0x8e, 0x00, 0xc8, + 0x82, 0x3c, 0x74, 0x13, 0x92, 0x3c, 0x96, 0x45, 0x58, 0xc7, 0x24, 0x8a, 0x38, 0x21, 0xe0, 0xf1, + 0x2d, 0x1e, 0xc2, 0x59, 0x73, 0x7f, 0xdf, 0xb5, 0xf6, 0xe9, 0xc1, 0x20, 0x0f, 0xd4, 0x46, 0xea, + 0xca, 0xbe, 0x74, 0x7b, 0xfd, 0xe8, 0xe5, 0xe6, 0x4a, 0x49, 0x20, 0xf0, 0x70, 0x11, 0xa4, 0xee, + 0x2b, 0xe6, 0x34, 0x70, 0xec, 0xa1, 0xaf, 0x42, 0x61, 0x96, 0xd9, 0x54, 0xcd, 0xd7, 0xa7, 0x09, + 0xcb, 0xa2, 0x25, 0x3f, 0x17, 0x83, 0x84, 0x31, 0x24, 0xc6, 0xfd, 0xe5, 0xb9, 0x11, 0xd5, 0x68, + 0x9e, 0xea, 0xc2, 0x5d, 0x86, 0xb8, 0x39, 0x1e, 0xf7, 0xb8, 0x2a, 0x85, 0xd1, 0x4a, 0xe3, 0x71, + 0x0f, 0xd3, 0x6c, 0x74, 0x1d, 0x92, 0x7d, 0xa7, 0xf7, 0xd4, 0x9a, 0x0e, 0x3b, 0xc5, 0x10, 0x2b, + 0x34, 0x0b, 0x73, 0x14, 0x74, 0x01, 0x92, 0xf4, 0xd2, 0x1b, 0xdb, 0x80, 0x13, 0xa1, 0x8e, 0x39, + 0xac, 0xd0, 0x85, 0x38, 0x61, 0xbc, 0x40, 0xb5, 0xd6, 0xf8, 0x7d, 0xe6, 0xe9, 0x38, 0x2e, 0x81, + 0xe5, 0x1d, 0x5b, 0x60, 0x79, 0x17, 0xbe, 0x1d, 0x81, 0x24, 0xab, 0xd1, 0x82, 0x32, 0xee, 0x01, + 0x04, 0xe3, 0x71, 0xaa, 0xf5, 0xca, 0xd0, 0x8d, 0xae, 0x47, 0xb0, 0x82, 0x48, 0xaa, 0xd0, 0x73, + 0x46, 0x7b, 0xf6, 0xfe, 0x54, 0x15, 0xc4, 0x4c, 0xc9, 0x32, 0x8b, 0x45, 0xae, 0xed, 0x69, 0x88, + 0x97, 0x9a, 0xcd, 0x32, 0x9b, 0x1b, 0x2b, 0x8d, 0xf2, 0x43, 0x1d, 0x4b, 0xe5, 0xfe, 0x89, 0x08, + 0x68, 0x34, 0x6a, 0x4c, 0xd3, 0x75, 0xc6, 0xe6, 0x3e, 0xdb, 0x0a, 0xba, 0xcd, 0xdf, 0x1c, 0x61, + 0x93, 0x81, 0x8c, 0x7f, 0x3a, 0x85, 0xa6, 0x3c, 0x3c, 0x52, 0x2c, 0xf3, 0x97, 0x43, 0x42, 0x03, + 0xeb, 0x2c, 0x9c, 0xd9, 0x6d, 0xb4, 0xda, 0xdd, 0x76, 0x23, 0x30, 0x2f, 0xb5, 0x08, 0x31, 0xc8, + 0xb7, 0x8c, 0x8a, 0x81, 0xf5, 0x32, 0x31, 0x6b, 0x4a, 0x55, 0x59, 0x97, 0xdf, 0x4b, 0x41, 0x92, + 0x9f, 0x0e, 0x5e, 0x87, 0xa5, 0xc0, 0x6f, 0xa1, 0x51, 0x7c, 0x54, 0xe1, 0xe5, 0x65, 0x1e, 0x0d, + 0x86, 0x73, 0x1e, 0x32, 0x07, 0x8e, 0xe7, 0x77, 0x95, 0x98, 0xeb, 0xf4, 0x9a, 0x0c, 0xcd, 0xbc, + 0xc2, 0xdb, 0x12, 0xa3, 0x1a, 0x88, 0x42, 0x71, 0x8f, 0xd4, 0xa7, 0x53, 0x8a, 0x90, 0xb0, 0x87, + 0xc2, 0x3d, 0xcd, 0xde, 0xcd, 0xa9, 0xaa, 0x85, 0x59, 0x16, 0xba, 0x21, 0xdd, 0xbe, 0x44, 0x68, + 0x8b, 0x8f, 0x73, 0x9b, 0x8a, 0x89, 0xf4, 0x93, 0x49, 0xe9, 0x83, 0xbc, 0x17, 0x9a, 0x5d, 0xcf, + 0xcd, 0x23, 0x9b, 0x9d, 0x64, 0xb7, 0x21, 0xcf, 0x54, 0xb9, 0x1b, 0x0a, 0xdd, 0xf4, 0xc6, 0x5c, + 0x6a, 0xa6, 0x6a, 0xe2, 0xba, 0x40, 0x5f, 0x49, 0xa1, 0x32, 0xe4, 0x3c, 0x73, 0xd4, 0x7f, 0xe2, + 0x3c, 0xef, 0xca, 0x67, 0x79, 0x82, 0x3b, 0x1e, 0x61, 0x36, 0x2d, 0x86, 0x48, 0x63, 0x21, 0x65, + 0xbd, 0x20, 0x71, 0xca, 0xc5, 0x19, 0x3d, 0x50, 0xbb, 0x22, 0x7c, 0x1f, 0x24, 0x5c, 0xd0, 0x2e, + 0xef, 0x9f, 0xa0, 0xa7, 0x0a, 0xdf, 0x82, 0x9c, 0xda, 0x0a, 0xb2, 0xfe, 0xf5, 0x5d, 0xfb, 0x90, + 0x2e, 0xb2, 0x74, 0xfd, 0x63, 0xa9, 0x05, 0xe1, 0x39, 0x3f, 0x84, 0x25, 0x86, 0xd3, 0x75, 0xc6, + 0xec, 0x3e, 0x75, 0x2c, 0x34, 0xa4, 0x82, 0x45, 0x1c, 0xe7, 0x19, 0x62, 0x83, 0xe1, 0x15, 0x7e, + 0x18, 0xd2, 0xa2, 0x46, 0x34, 0x00, 0xed, 0xb4, 0xc6, 0xb1, 0xb8, 0x50, 0x15, 0x38, 0x43, 0x63, + 0x3c, 0x75, 0xc7, 0xc1, 0x28, 0x98, 0x5a, 0xfe, 0xa6, 0x07, 0x09, 0xd6, 0x86, 0x53, 0x90, 0xc2, + 0x4f, 0x47, 0x20, 0xab, 0xc8, 0x19, 0x7d, 0x1a, 0x52, 0x8e, 0xcb, 0x27, 0xf5, 0xcb, 0xac, 0xa2, + 0xac, 0xcb, 0x40, 0x57, 0x53, 0x15, 0x2e, 0xde, 0x3a, 0x26, 0xea, 0x53, 0x4b, 0xaf, 0x6e, 0xb3, + 0xe9, 0xa0, 0x59, 0xc2, 0xc4, 0x03, 0x16, 0x43, 0xf0, 0xf3, 0x79, 0x04, 0x67, 0x20, 0xcf, 0x66, + 0x0d, 0x71, 0x02, 0x1c, 0x21, 0x6b, 0x26, 0x1d, 0xda, 0x34, 0x7c, 0x54, 0x9c, 0x3a, 0xd4, 0xa5, + 0x7a, 0x65, 0xab, 0xf1, 0x19, 0x83, 0x44, 0x15, 0x2b, 0x4c, 0x44, 0xfa, 0x5f, 0x0b, 0x1e, 0x17, + 0xc2, 0x8f, 0xb5, 0x08, 0xfd, 0x6d, 0x68, 0xd1, 0xe2, 0x5f, 0x8d, 0x43, 0x56, 0x79, 0x65, 0x80, + 0x74, 0x3b, 0xbd, 0xc7, 0xc1, 0xbe, 0x0c, 0xc9, 0x60, 0x9e, 0x3a, 0xe5, 0xf7, 0x1f, 0xa8, 0x0d, + 0x39, 0x7b, 0xdc, 0xe5, 0xc1, 0x9f, 0xe5, 0xae, 0xee, 0x85, 0x39, 0xcf, 0x19, 0x18, 0x4d, 0xf1, + 0x7e, 0x95, 0x3c, 0xd2, 0x91, 0x20, 0xcb, 0xc3, 0x59, 0x7b, 0x2c, 0x13, 0x32, 0x92, 0x7b, 0x52, + 0x89, 0xe4, 0x6e, 0x40, 0x7e, 0xec, 0xb8, 0x3e, 0xfd, 0x44, 0xd8, 0x1e, 0xed, 0x8b, 0x23, 0x94, + 0x8d, 0x79, 0x2f, 0x27, 0x38, 0xae, 0x5f, 0x63, 0x68, 0x62, 0x1b, 0x7a, 0x1c, 0x80, 0xbc, 0xc2, + 0x73, 0xc8, 0xc8, 0xa2, 0x43, 0x8f, 0x31, 0x44, 0x5e, 0xf9, 0x31, 0x06, 0x7a, 0x3b, 0x56, 0x0a, + 0x80, 0xaf, 0x5f, 0xec, 0x76, 0xac, 0x28, 0x01, 0x67, 0x64, 0xd3, 0x0a, 0x2f, 0x20, 0xab, 0x54, + 0x0e, 0xbd, 0x21, 0xc6, 0xef, 0xf4, 0x3b, 0x11, 0x6c, 0x98, 0x3a, 0xae, 0x3f, 0x35, 0x35, 0x13, + 0xbc, 0xa8, 0x82, 0xa7, 0x4c, 0xcd, 0x04, 0xb9, 0xa0, 0xb4, 0x85, 0x6d, 0x34, 0x07, 0xaf, 0x46, + 0x6c, 0x40, 0x5a, 0x34, 0x82, 0xe8, 0x24, 0x69, 0x06, 0x7b, 0x29, 0xc2, 0x68, 0x1e, 0x7e, 0xa0, + 0x45, 0x8b, 0x47, 0x09, 0x58, 0x0a, 0x02, 0x33, 0x53, 0xdd, 0xa8, 0x4c, 0x05, 0xe8, 0x66, 0xb1, + 0x8e, 0xc5, 0x54, 0x16, 0x46, 0x56, 0x92, 0xe1, 0xf0, 0xdc, 0xc5, 0x9f, 0x48, 0x84, 0x82, 0x43, + 0x4f, 0xdd, 0xa8, 0x48, 0x94, 0x77, 0xc9, 0xdf, 0xdf, 0x4c, 0xa1, 0x33, 0x90, 0xab, 0x94, 0xca, + 0xdd, 0xc6, 0x23, 0x1d, 0x63, 0xa3, 0xa2, 0x6b, 0xbf, 0x95, 0x42, 0xab, 0xb0, 0x4c, 0x40, 0x58, + 0x2f, 0x55, 0xba, 0x2d, 0xbd, 0x84, 0xcb, 0xbb, 0xda, 0x7f, 0x4c, 0xa1, 0x2c, 0x24, 0xb7, 0x1b, + 0x8f, 0xc9, 0xea, 0xf6, 0x9f, 0x58, 0xa2, 0xa5, 0xb7, 0x8d, 0x8a, 0xf6, 0xdb, 0x29, 0x94, 0x81, + 0x38, 0xf1, 0x69, 0xb5, 0xff, 0x4c, 0xe1, 0x2d, 0xbd, 0xbd, 0x63, 0x54, 0xb4, 0xff, 0x22, 0x12, + 0x1d, 0xa3, 0xa2, 0xfd, 0x4e, 0x0a, 0xe5, 0x20, 0xd5, 0xd2, 0xdb, 0xcd, 0x72, 0xa9, 0xa9, 0x7d, + 0x9f, 0x16, 0x51, 0x35, 0xea, 0x9d, 0xcf, 0xba, 0x46, 0xad, 0xd6, 0x69, 0x97, 0xb6, 0xaa, 0xba, + 0xf6, 0x5f, 0x53, 0xe8, 0x2c, 0x68, 0x75, 0xbd, 0xdd, 0xdd, 0x32, 0xea, 0x15, 0x19, 0xdb, 0xf8, + 0x77, 0x53, 0x08, 0x41, 0x9e, 0x82, 0x71, 0xa3, 0x54, 0x29, 0x97, 0x5a, 0x6d, 0xed, 0xf7, 0x52, + 0x68, 0x09, 0x32, 0x04, 0x56, 0xaa, 0xd4, 0x8c, 0xba, 0xf6, 0xfb, 0x94, 0x3d, 0x49, 0xe3, 0xd2, + 0x63, 0xed, 0xbf, 0xa5, 0x50, 0x1e, 0xd2, 0x46, 0xb3, 0xdc, 0xa5, 0x11, 0xde, 0xfe, 0x3b, 0x45, + 0x26, 0x49, 0x56, 0xfb, 0x3f, 0x48, 0xa1, 0x65, 0x80, 0xd6, 0xe7, 0xad, 0x6e, 0xad, 0x51, 0xe9, + 0x54, 0x75, 0xed, 0x0f, 0x29, 0x02, 0x01, 0xe0, 0xd2, 0x63, 0xa3, 0xa1, 0xfd, 0x0f, 0x89, 0x50, + 0xde, 0xc5, 0x8d, 0x46, 0x5b, 0xfb, 0x9f, 0x12, 0xd0, 0x6c, 0xe3, 0x52, 0x59, 0xd7, 0xfe, 0x97, + 0xa4, 0x68, 0x96, 0xca, 0xe5, 0xb6, 0xf6, 0x47, 0x32, 0xcd, 0xea, 0xf3, 0xbf, 0x69, 0x0d, 0x48, + 0x7a, 0x8b, 0xd0, 0xff, 0xb1, 0x4c, 0xd6, 0x49, 0x8b, 0xfe, 0x0f, 0x15, 0x3a, 0x2d, 0x8f, 0x6f, + 0x70, 0x68, 0xdf, 0x4e, 0x0b, 0x8c, 0xb6, 0x51, 0xd3, 0xb5, 0x1f, 0x49, 0xa3, 0x15, 0x58, 0xa2, + 0xc9, 0xf6, 0xe7, 0xc4, 0xac, 0xd8, 0x36, 0x76, 0xb4, 0xff, 0x3f, 0x4d, 0xfa, 0xad, 0xf6, 0xb0, + 0xde, 0xa8, 0x68, 0x7f, 0x86, 0xfe, 0xaf, 0xea, 0xa5, 0x96, 0xae, 0xfd, 0x68, 0x1a, 0x69, 0x90, + 0x2d, 0x75, 0x2a, 0x46, 0xbb, 0xfb, 0x18, 0x1b, 0x6d, 0x5d, 0xfb, 0xb1, 0x34, 0x11, 0x19, 0x83, + 0xf0, 0xf8, 0xd1, 0xda, 0x8f, 0xa7, 0x79, 0x0f, 0x6c, 0x93, 0x1e, 0xf8, 0xb3, 0x69, 0x52, 0x85, + 0x9a, 0xda, 0xef, 0xdf, 0x49, 0x93, 0x36, 0x10, 0x10, 0x6b, 0xc3, 0x4f, 0xa4, 0x69, 0xff, 0x7d, + 0xde, 0xaa, 0x36, 0x76, 0xb4, 0x3f, 0x97, 0x26, 0x12, 0x78, 0x5c, 0x7a, 0xa8, 0x77, 0x4b, 0xd5, + 0x12, 0xae, 0x69, 0x7f, 0x9e, 0x16, 0x41, 0x43, 0xe8, 0x75, 0x5b, 0x9d, 0x56, 0x53, 0xaf, 0x57, + 0xb4, 0x9f, 0xa4, 0x48, 0xac, 0x58, 0xa2, 0x3b, 0xda, 0x4f, 0x89, 0x37, 0xa6, 0x7e, 0x21, 0x0a, + 0x99, 0xaa, 0x3d, 0x9a, 0x3c, 0xa7, 0xfa, 0xbd, 0x05, 0xcb, 0x52, 0x53, 0x5f, 0x88, 0x8f, 0x14, + 0x43, 0x2f, 0x41, 0x85, 0x54, 0x9c, 0x1a, 0x86, 0x4b, 0xbd, 0xf0, 0x18, 0xf9, 0x3a, 0x9c, 0x7d, + 0xe2, 0x4c, 0x46, 0x7d, 0x7b, 0xb4, 0xdf, 0x0d, 0x0d, 0x96, 0xe8, 0x02, 0x4e, 0x78, 0x55, 0xd0, + 0x94, 0xd5, 0x67, 0xc5, 0xaa, 0xb0, 0x66, 0xed, 0xed, 0x59, 0xfc, 0xbb, 0x6e, 0x95, 0x59, 0x6c, + 0x11, 0xb3, 0xb3, 0x92, 0x28, 0xc4, 0x4d, 0x87, 0x15, 0x1a, 0xc4, 0xb4, 0x3b, 0xb6, 0xfb, 0x5d, + 0x32, 0x85, 0x7a, 0x63, 0xb3, 0xc7, 0xdf, 0x1a, 0x61, 0xdf, 0x58, 0xd0, 0x68, 0x82, 0x4d, 0xa3, + 0x52, 0x17, 0x99, 0xf8, 0x0c, 0xa5, 0x68, 0xda, 0x7d, 0x09, 0x2a, 0x7e, 0x37, 0x06, 0x80, 0xa9, + 0x07, 0xc4, 0xdf, 0x7a, 0x49, 0xb9, 0x21, 0x47, 0x49, 0x46, 0x7d, 0x95, 0x38, 0xfc, 0xaf, 0xb8, + 0x02, 0xc7, 0xd1, 0x0b, 0xdf, 0x89, 0x41, 0x92, 0xe5, 0xa0, 0xaf, 0x84, 0xd6, 0xe0, 0x8b, 0xc7, + 0x71, 0x98, 0x5d, 0x7b, 0x11, 0xc4, 0x0f, 0x4c, 0xb7, 0xcf, 0x03, 0x17, 0xd2, 0xff, 0x04, 0xe6, + 0x39, 0x7b, 0x3e, 0x77, 0x93, 0xe8, 0xff, 0xe2, 0xdf, 0x8a, 0x1e, 0xf3, 0x9e, 0x05, 0xae, 0xd6, + 0xda, 0xdd, 0x52, 0x8b, 0xad, 0xa9, 0x34, 0x51, 0x6e, 0x60, 0x5d, 0x8b, 0xa2, 0x1c, 0xa4, 0x59, + 0xb2, 0xd9, 0xd1, 0x62, 0x32, 0xb3, 0x52, 0x6a, 0x97, 0xb4, 0x38, 0x5a, 0x22, 0x22, 0xa8, 0xb5, + 0xbb, 0xdb, 0x2d, 0xe3, 0x9b, 0xfc, 0xb9, 0x33, 0x9a, 0x26, 0x5a, 0xd7, 0xd2, 0x92, 0xf4, 0x49, + 0x33, 0x92, 0xae, 0xe9, 0x35, 0x3a, 0xd2, 0x53, 0x34, 0xac, 0x3c, 0x85, 0xb4, 0x76, 0xbe, 0xd1, + 0xd1, 0x3b, 0xba, 0x96, 0x96, 0x3c, 0xe9, 0xd0, 0xcb, 0xa0, 0x65, 0xc8, 0xb2, 0x64, 0x63, 0xdb, + 0xa8, 0xea, 0x1a, 0x48, 0xa6, 0xf5, 0x26, 0x6e, 0x94, 0xb5, 0xac, 0xac, 0x11, 0x6e, 0xb5, 0xd8, + 0x25, 0x30, 0x96, 0x6a, 0x37, 0xb1, 0xd1, 0xd0, 0xf2, 0x0a, 0x80, 0x8e, 0xd4, 0x25, 0xba, 0xb7, + 0x4a, 0x00, 0x2d, 0x63, 0x87, 0x8c, 0x02, 0xa3, 0xbe, 0xa3, 0x2d, 0x4b, 0xa6, 0xad, 0x76, 0xa9, + 0xfc, 0x50, 0xd3, 0xf8, 0x30, 0xf8, 0xa9, 0x08, 0xa4, 0xda, 0xed, 0xcf, 0x69, 0x87, 0x3e, 0x80, + 0xec, 0x33, 0x7b, 0xd4, 0x77, 0x9e, 0x75, 0x3d, 0xfb, 0x5b, 0xd6, 0x54, 0x3c, 0x74, 0x8e, 0x74, + 0xf3, 0x31, 0xc5, 0x68, 0xd9, 0xdf, 0xb2, 0x30, 0x3c, 0x93, 0xff, 0x0b, 0xdb, 0x00, 0x41, 0x0e, + 0x31, 0x8c, 0x5c, 0xe7, 0x99, 0x17, 0x7e, 0xf0, 0x88, 0x40, 0xd0, 0x06, 0xa4, 0x7a, 0xc4, 0xc0, + 0x1a, 0x79, 0xa1, 0xd5, 0x4b, 0x00, 0x8b, 0x2f, 0xd3, 0x90, 0x0f, 0x87, 0xd8, 0x7f, 0x37, 0xe4, + 0xc9, 0x9e, 0x9b, 0x77, 0xb8, 0xaf, 0x7a, 0xb4, 0xef, 0x06, 0xf7, 0x31, 0xd9, 0x07, 0x0b, 0xe1, + 0x88, 0xab, 0x53, 0xb7, 0x31, 0xd1, 0x57, 0xa6, 0x3c, 0xdb, 0xcd, 0xb9, 0xfc, 0x99, 0x79, 0x2c, + 0xee, 0x9c, 0x53, 0xdf, 0xb2, 0x10, 0xfa, 0x4e, 0x20, 0xfc, 0x7a, 0xc6, 0xfb, 0xc0, 0xde, 0x95, + 0xe5, 0x86, 0xf8, 0xc6, 0x5c, 0x9e, 0x35, 0x02, 0x63, 0xf7, 0x7c, 0x68, 0x36, 0xfa, 0x98, 0x06, + 0xf0, 0x60, 0xb7, 0x00, 0xe8, 0x5d, 0xde, 0x54, 0x28, 0x9a, 0xb7, 0x62, 0x83, 0x08, 0x53, 0x66, + 0x14, 0x80, 0x3c, 0x74, 0x0b, 0x60, 0x40, 0xe6, 0x33, 0x36, 0x7b, 0xa5, 0x43, 0x77, 0x8a, 0xe4, + 0x44, 0x87, 0x33, 0x03, 0x39, 0xe7, 0xdd, 0x85, 0x2c, 0x1b, 0x90, 0x8c, 0x22, 0x13, 0xb2, 0xd8, + 0x83, 0x11, 0x88, 0x81, 0x61, 0x51, 0x9a, 0x0f, 0x20, 0xed, 0x8b, 0x09, 0x12, 0x42, 0x67, 0x86, + 0x5c, 0x3f, 0xd8, 0x99, 0x21, 0x4f, 0xe0, 0x94, 0xcf, 0x26, 0xa6, 0xc2, 0x2f, 0xc6, 0x01, 0x02, + 0x21, 0xa2, 0x82, 0xf0, 0xf9, 0x42, 0xd1, 0xc5, 0x99, 0xaf, 0xb7, 0x03, 0x29, 0xde, 0x2e, 0xfe, + 0x22, 0xd6, 0xdb, 0x27, 0x74, 0x89, 0x90, 0xcc, 0x83, 0x38, 0xb1, 0x8c, 0xb1, 0xa0, 0x46, 0x8f, + 0xa6, 0xcd, 0x44, 0xf6, 0xc1, 0xf3, 0xf5, 0x93, 0xd8, 0x9d, 0x60, 0x33, 0xa2, 0xcb, 0x00, 0x63, + 0xd7, 0x3e, 0xb4, 0x07, 0xd6, 0xbe, 0xdc, 0xe3, 0x10, 0x8f, 0x5c, 0x06, 0x19, 0xe8, 0x03, 0x00, + 0xb9, 0x09, 0x39, 0xfd, 0x5c, 0xc7, 0xf4, 0x76, 0xa5, 0x82, 0x89, 0xae, 0x82, 0xb6, 0xe7, 0xb8, + 0x3d, 0xab, 0x3b, 0x9e, 0x0c, 0x06, 0x5d, 0x26, 0x26, 0xfa, 0x66, 0x15, 0x5e, 0xa2, 0xf0, 0xe6, + 0x64, 0x30, 0x60, 0x7b, 0x3c, 0x6f, 0x43, 0x9e, 0xa9, 0x71, 0x97, 0xbb, 0x6b, 0x29, 0xf9, 0xb0, + 0x51, 0x8e, 0x65, 0x54, 0x28, 0xfc, 0xff, 0xa5, 0xad, 0x79, 0x1f, 0x52, 0xbc, 0x7b, 0xe8, 0x53, + 0x64, 0x8d, 0x16, 0x7f, 0x40, 0x68, 0x0b, 0x1b, 0x95, 0x1d, 0x9d, 0xc5, 0x88, 0xaf, 0x37, 0xea, + 0xba, 0x16, 0x23, 0xff, 0x3a, 0x2d, 0x1d, 0xcb, 0xa8, 0xb7, 0xb7, 0x20, 0x23, 0xc7, 0x48, 0xb0, + 0x4b, 0x10, 0x39, 0x76, 0x97, 0xa0, 0xf8, 0x66, 0x10, 0x97, 0x9e, 0x6f, 0xb6, 0xb0, 0xf8, 0xba, + 0x7a, 0xab, 0xd1, 0x92, 0x8e, 0xd6, 0xb7, 0xa3, 0xb0, 0x3c, 0x75, 0xf4, 0x3a, 0x3b, 0xf2, 0x22, + 0xaf, 0x34, 0xf2, 0xee, 0x42, 0xb6, 0x47, 0x7d, 0x25, 0x36, 0x2e, 0xa6, 0x76, 0x93, 0x64, 0xe0, + 0x06, 0x0c, 0x3d, 0xf9, 0x1f, 0xdd, 0x55, 0xbe, 0x07, 0x1a, 0xf3, 0xd7, 0x58, 0xf3, 0xec, 0xba, + 0x89, 0x38, 0x14, 0x6f, 0x1a, 0x95, 0xe0, 0xc3, 0x9f, 0xa6, 0x4d, 0x5f, 0xc7, 0x9a, 0x8a, 0x4b, + 0x70, 0xcc, 0x43, 0xcc, 0x8c, 0xcf, 0x71, 0x31, 0x09, 0x8a, 0x3f, 0x9f, 0x05, 0x08, 0xaa, 0x85, + 0x3e, 0xa6, 0x03, 0xae, 0xdb, 0x1b, 0x88, 0xc8, 0x6d, 0xeb, 0xb3, 0x31, 0x27, 0xea, 0x96, 0x5f, + 0x1e, 0x78, 0x5b, 0x70, 0xf4, 0x72, 0x33, 0x49, 0xfe, 0x57, 0x5b, 0x38, 0x39, 0xa2, 0xb0, 0xc2, + 0xdf, 0x03, 0x48, 0xd0, 0x90, 0x14, 0x85, 0xa6, 0xd8, 0x01, 0xbe, 0x03, 0x51, 0x67, 0x3c, 0xf5, + 0xec, 0xce, 0x4c, 0x00, 0x0b, 0x79, 0x4b, 0x06, 0x47, 0x9d, 0x71, 0xf8, 0x58, 0x23, 0x2e, 0x36, + 0xa3, 0x7f, 0x3f, 0x0e, 0xb1, 0xf2, 0xf6, 0x37, 0x0a, 0xbf, 0x1d, 0x07, 0x50, 0xe2, 0x0a, 0xdc, + 0x80, 0x64, 0xdf, 0x3a, 0xb4, 0x65, 0x54, 0x35, 0x79, 0x4b, 0x8c, 0x02, 0x6f, 0xd6, 0x27, 0xc3, + 0x27, 0x74, 0x3f, 0x92, 0x26, 0xd1, 0x3a, 0xa4, 0x3c, 0xab, 0xe7, 0x8b, 0xa0, 0xa9, 0x71, 0x2c, + 0x92, 0xc4, 0x5e, 0xa0, 0xa7, 0xea, 0xdc, 0x5e, 0x20, 0xff, 0x11, 0x86, 0xac, 0xed, 0x74, 0xf9, + 0xeb, 0x2c, 0x7d, 0x7e, 0xfd, 0xe6, 0xe2, 0x71, 0x8d, 0xa0, 0xed, 0x0d, 0x5e, 0x53, 0x33, 0x1a, + 0xfc, 0xcd, 0x94, 0x3e, 0x06, 0xdb, 0x11, 0xff, 0x51, 0x17, 0xb4, 0x80, 0xa7, 0x0c, 0x27, 0x76, + 0x0a, 0xc6, 0x6b, 0x9c, 0xf1, 0x92, 0x64, 0xcc, 0x82, 0x8e, 0x2d, 0x49, 0xe6, 0x22, 0xc6, 0xc9, + 0xb2, 0x52, 0x00, 0x6d, 0x53, 0xf2, 0x34, 0xfc, 0xcf, 0x72, 0xfe, 0x79, 0xc9, 0xbf, 0x6d, 0x0f, + 0x2d, 0x9c, 0x97, 0xec, 0xe9, 0x65, 0x82, 0x16, 0xe4, 0x6c, 0x87, 0x45, 0x01, 0xa2, 0xac, 0x53, + 0xaf, 0x28, 0x93, 0xc7, 0xa6, 0x4d, 0x03, 0x70, 0x12, 0x99, 0x88, 0xff, 0xa8, 0x0a, 0x19, 0xdb, + 0xe9, 0x0e, 0x2d, 0x77, 0x9f, 0xc6, 0x2f, 0x3b, 0x05, 0x47, 0x8d, 0x73, 0x4c, 0x1b, 0x8d, 0x1a, + 0x25, 0xc3, 0x69, 0xdb, 0x61, 0xff, 0x38, 0x37, 0x1a, 0xd8, 0xb9, 0xcf, 0x5f, 0x8f, 0x3a, 0x3d, + 0xb7, 0x6f, 0x50, 0x32, 0xc2, 0x8d, 0xfd, 0x2b, 0xfc, 0x71, 0x04, 0x80, 0x07, 0x39, 0xb3, 0x47, + 0xfb, 0x85, 0xdf, 0x89, 0xfc, 0x00, 0xda, 0x37, 0xa5, 0x4f, 0xd1, 0x3f, 0x2d, 0x7d, 0x8a, 0xfd, + 0x09, 0xea, 0x53, 0xe1, 0xc7, 0xa2, 0xa1, 0x16, 0xeb, 0x10, 0xeb, 0xed, 0x7d, 0xc1, 0x67, 0xc5, + 0x2b, 0xc7, 0x15, 0x51, 0xde, 0xfe, 0xc6, 0x4d, 0x35, 0xd4, 0x23, 0x2f, 0x8b, 0x0c, 0x60, 0x4c, + 0xe8, 0x91, 0x09, 0xf9, 0xde, 0xde, 0x17, 0x5d, 0xd7, 0xea, 0x4d, 0x5c, 0xcf, 0x3e, 0xb4, 0xb8, + 0x30, 0x4e, 0xcb, 0x70, 0x95, 0x33, 0xcc, 0x11, 0x86, 0x82, 0x07, 0xce, 0xf5, 0xf6, 0xbe, 0x90, + 0x29, 0x54, 0x03, 0xf0, 0x65, 0xc7, 0x71, 0x99, 0xbc, 0x7b, 0x1c, 0xff, 0xa0, 0x8b, 0xd5, 0x68, + 0x3a, 0x0a, 0x83, 0x62, 0x4b, 0xbd, 0xa7, 0x39, 0x7d, 0xee, 0xd9, 0x6e, 0xb4, 0x4b, 0x55, 0xb6, + 0x71, 0x42, 0x5d, 0x4b, 0x1a, 0xc1, 0x9d, 0x79, 0xbb, 0x74, 0x31, 0x6b, 0x7d, 0x5e, 0x2f, 0x6b, + 0x71, 0x02, 0x2c, 0xd1, 0xbf, 0x09, 0xb9, 0xae, 0x25, 0xd9, 0x74, 0x8a, 0x2e, 0x43, 0xaa, 0x37, + 0x30, 0x3d, 0x8f, 0x5f, 0x41, 0xcc, 0x33, 0xe3, 0xa9, 0x4c, 0x40, 0x46, 0x05, 0x8b, 0xbc, 0xe2, + 0xfb, 0x90, 0x64, 0x7b, 0x6d, 0xe8, 0x1d, 0xb9, 0x15, 0xc7, 0xfa, 0x22, 0xa7, 0x6e, 0xc5, 0xc9, + 0x63, 0x29, 0x16, 0x8f, 0xe5, 0x1e, 0x24, 0x28, 0xf8, 0xd8, 0x83, 0xd7, 0xb9, 0x27, 0xc9, 0xc5, + 0x7f, 0x12, 0x81, 0x38, 0x5d, 0xd5, 0x2f, 0x40, 0x72, 0x44, 0x55, 0x39, 0x64, 0x22, 0x70, 0x98, + 0xdc, 0x97, 0x8b, 0x86, 0x5e, 0x58, 0x3c, 0xd6, 0x0e, 0x40, 0x9f, 0x02, 0x1c, 0xda, 0x9e, 0xcd, + 0xbf, 0xcf, 0x60, 0x0f, 0x3a, 0x6c, 0xce, 0xbb, 0xdc, 0x7b, 0xf3, 0x91, 0x44, 0xc3, 0x0a, 0x89, + 0xb2, 0x0b, 0x99, 0x58, 0x14, 0x85, 0xe6, 0x36, 0x24, 0x58, 0xcc, 0xd5, 0xb7, 0x21, 0x31, 0xa6, + 0xb1, 0x58, 0x99, 0xa4, 0xc4, 0x3d, 0x48, 0x92, 0x29, 0xec, 0x4d, 0x9a, 0x5f, 0xfc, 0x97, 0x51, + 0xc8, 0x87, 0x6a, 0x80, 0xf4, 0x50, 0x5d, 0x99, 0xdf, 0x71, 0x52, 0x5d, 0x85, 0x21, 0xa7, 0xd4, + 0x78, 0x9e, 0x88, 0x2e, 0x85, 0x5f, 0x39, 0x65, 0x52, 0x0a, 0xbd, 0x68, 0x5a, 0x80, 0xb4, 0xf8, + 0x0c, 0x56, 0xf8, 0x15, 0x22, 0xad, 0xbe, 0xca, 0x97, 0x08, 0xbf, 0xca, 0x57, 0x14, 0xad, 0x4d, + 0x86, 0xcc, 0x23, 0x2a, 0x0a, 0xde, 0x50, 0x45, 0x82, 0xa9, 0x45, 0x12, 0xfc, 0x00, 0x20, 0x68, + 0x16, 0x71, 0x55, 0xe5, 0x15, 0x1c, 0xfe, 0xb6, 0x6c, 0xb5, 0x43, 0x6f, 0x73, 0xd1, 0x57, 0xea, + 0xf5, 0xcf, 0xda, 0x3a, 0xa6, 0x47, 0x49, 0xc5, 0x4f, 0x00, 0x1e, 0x5b, 0xf6, 0xfe, 0x81, 0xcf, + 0xdf, 0x04, 0x49, 0x3e, 0xa3, 0xa9, 0x50, 0xdc, 0x1f, 0x0e, 0x93, 0x8f, 0x7d, 0x44, 0x83, 0xc7, + 0x3e, 0x8a, 0xff, 0x21, 0x02, 0xd9, 0x47, 0xac, 0x39, 0x94, 0xc3, 0x46, 0xd0, 0x58, 0x55, 0x75, + 0x65, 0x93, 0x69, 0x74, 0x1b, 0x7b, 0xd0, 0xef, 0xf6, 0xd9, 0xcd, 0x48, 0xfa, 0x9e, 0x05, 0x85, + 0x54, 0x4c, 0xdf, 0x0a, 0xb2, 0xe5, 0x0a, 0x1f, 0xe1, 0xd9, 0x74, 0xf9, 0x91, 0xd9, 0xf4, 0x26, + 0x78, 0x5c, 0xa1, 0xee, 0x78, 0x96, 0x8b, 0xde, 0x84, 0xd4, 0xbe, 0xed, 0x77, 0xbd, 0x03, 0xf6, + 0x64, 0x44, 0x86, 0x59, 0x3e, 0x3b, 0xb6, 0xdf, 0xda, 0x2d, 0xe1, 0xe4, 0xbe, 0xed, 0xb7, 0x0e, + 0x4c, 0xc2, 0x83, 0x20, 0xb1, 0x48, 0x03, 0x7c, 0x87, 0x3a, 0xb3, 0x6f, 0xfb, 0x5b, 0x14, 0x80, + 0x5e, 0x67, 0x3c, 0x7c, 0x73, 0x9f, 0xbf, 0x64, 0x4f, 0xe8, 0xda, 0xe6, 0x7e, 0xf1, 0x03, 0x88, + 0x6f, 0x0f, 0xcc, 0xfd, 0x57, 0xbd, 0xe4, 0x51, 0xfc, 0xf9, 0x08, 0xc4, 0xb1, 0xb3, 0xf0, 0x76, + 0x48, 0x20, 0xf6, 0xe8, 0x1c, 0xb1, 0x7f, 0x08, 0x20, 0x2f, 0x8c, 0x8b, 0x15, 0x63, 0xde, 0x3d, + 0x73, 0xae, 0xcb, 0x01, 0xee, 0x97, 0xfa, 0x9a, 0xa8, 0xf8, 0x21, 0x24, 0x6b, 0x96, 0xef, 0xda, + 0xbd, 0xd3, 0xb6, 0x34, 0x22, 0x5a, 0xfa, 0xcf, 0x22, 0x90, 0xde, 0xb6, 0x07, 0xf2, 0xf5, 0xcc, + 0x63, 0x8e, 0x85, 0x56, 0x21, 0x31, 0x1a, 0xd8, 0x23, 0xe6, 0x28, 0x26, 0x30, 0x4b, 0xd0, 0x5d, + 0x20, 0xfb, 0x5b, 0xd2, 0xaa, 0x23, 0xff, 0xd1, 0x65, 0x48, 0x0c, 0xa9, 0x22, 0xc4, 0xe7, 0x5f, + 0xa0, 0x64, 0xb9, 0x84, 0x94, 0x9e, 0x59, 0xd2, 0x47, 0xb6, 0xf9, 0xf9, 0xe4, 0x39, 0x88, 0x4d, + 0xf8, 0xfb, 0x89, 0xfc, 0x05, 0xcd, 0x8e, 0x51, 0xc1, 0x04, 0x46, 0xb2, 0xf6, 0xf9, 0x1d, 0x57, + 0x9e, 0xb5, 0x43, 0xb2, 0xf6, 0xed, 0x7e, 0xf1, 0x6f, 0x44, 0x20, 0xc9, 0x0c, 0x02, 0xf9, 0x28, + 0x75, 0x44, 0x79, 0x94, 0xfa, 0x86, 0x9c, 0x5c, 0xa3, 0x8b, 0x6c, 0x08, 0x86, 0x53, 0xa8, 0x43, + 0x92, 0x41, 0x82, 0x30, 0x48, 0xca, 0xd4, 0x2c, 0xc2, 0x20, 0x29, 0x28, 0x34, 0x98, 0x92, 0x2c, + 0x20, 0x2a, 0x83, 0x29, 0x31, 0x14, 0x22, 0xde, 0x1c, 0x2b, 0xa9, 0xd4, 0xeb, 0x59, 0x9e, 0x47, + 0xcf, 0xf7, 0x85, 0x49, 0xa3, 0xde, 0x4b, 0x66, 0x48, 0x42, 0x8b, 0xb8, 0x45, 0xf3, 0x21, 0x24, + 0x4d, 0x4a, 0xc6, 0x3f, 0xf4, 0x29, 0x84, 0x90, 0x19, 0xc7, 0x9b, 0xec, 0x47, 0x50, 0x32, 0xfc, + 0xc2, 0x2e, 0x24, 0x79, 0x81, 0x64, 0x02, 0xb0, 0x4c, 0x71, 0x63, 0x9a, 0xfe, 0x27, 0xbd, 0xf9, + 0xcc, 0xb5, 0x7d, 0xf1, 0x7c, 0x32, 0x4b, 0x10, 0xe8, 0xf0, 0xe9, 0xc8, 0x61, 0x1e, 0x52, 0x1a, + 0xb3, 0x44, 0xb1, 0x03, 0xcb, 0xac, 0xb8, 0xc7, 0x07, 0xb6, 0x6f, 0x0d, 0x6c, 0xcf, 0x47, 0x5b, + 0x2c, 0xf0, 0xc0, 0x33, 0xab, 0xdf, 0x65, 0x15, 0x15, 0x53, 0xff, 0xca, 0x9c, 0xfa, 0x89, 0x8f, + 0x00, 0x39, 0x05, 0xcb, 0xf2, 0xde, 0xf9, 0x21, 0x48, 0x72, 0x97, 0x70, 0x0d, 0x50, 0x05, 0x1b, + 0x8f, 0x74, 0xdc, 0xad, 0x37, 0xe8, 0x9e, 0x19, 0x66, 0xd7, 0x1e, 0x11, 0x2c, 0x71, 0x38, 0xee, + 0xd4, 0xeb, 0x46, 0x7d, 0x47, 0x8b, 0x2a, 0xb0, 0xd2, 0x56, 0x83, 0xe2, 0xc5, 0x14, 0x58, 0xab, + 0xdd, 0x68, 0x36, 0xf5, 0x8a, 0x16, 0x7f, 0xe7, 0x27, 0xa3, 0x90, 0x91, 0x77, 0xb6, 0x91, 0x06, + 0x39, 0x7a, 0x0f, 0xad, 0xd5, 0x2e, 0xed, 0x10, 0x3e, 0x49, 0x74, 0x06, 0xf2, 0x02, 0x82, 0xdb, + 0x04, 0xf4, 0x9a, 0x44, 0x12, 0x85, 0x45, 0x24, 0xe4, 0xa1, 0x51, 0xad, 0x12, 0x48, 0x5a, 0x92, + 0x6d, 0x1b, 0x75, 0xa3, 0xb5, 0x4b, 0xaf, 0x5e, 0x2e, 0x43, 0x96, 0x81, 0xd8, 0x5d, 0xd2, 0x98, + 0x04, 0xb0, 0x7b, 0x7e, 0x6c, 0x1f, 0x93, 0x02, 0xd8, 0xcd, 0xcb, 0x14, 0x99, 0xe7, 0x69, 0xba, + 0x4a, 0x3c, 0xf4, 0x84, 0x2c, 0xa5, 0x82, 0x59, 0xe5, 0x33, 0x68, 0x15, 0x34, 0x7e, 0x6d, 0x8e, + 0xde, 0x3c, 0xa5, 0xc7, 0x23, 0x20, 0xc9, 0x76, 0x88, 0x0b, 0x9f, 0x45, 0xe7, 0xe0, 0xac, 0x4c, + 0x86, 0x6e, 0x31, 0xe6, 0x24, 0x47, 0x79, 0x05, 0xf1, 0x9d, 0xef, 0x44, 0x61, 0x29, 0xfc, 0xa9, + 0x04, 0xa1, 0x67, 0x24, 0x46, 0xa3, 0xde, 0xed, 0xd4, 0x5b, 0x9d, 0x66, 0x93, 0x09, 0x94, 0xde, + 0x69, 0x08, 0xb2, 0xc4, 0xae, 0x66, 0x84, 0xf4, 0x53, 0x00, 0x56, 0x24, 0xb0, 0x0a, 0x9a, 0x02, + 0x17, 0x62, 0x58, 0x81, 0xe5, 0x00, 0x2a, 0x2e, 0x9d, 0x86, 0x38, 0x8b, 0x06, 0x27, 0xa6, 0xeb, + 0x12, 0xb4, 0x3a, 0x89, 0x36, 0xa0, 0x10, 0x64, 0xcd, 0xb4, 0x35, 0x85, 0xd6, 0x61, 0x35, 0xc8, + 0xc7, 0x7a, 0xb9, 0xf1, 0x48, 0xc7, 0xac, 0xaf, 0x42, 0x65, 0x09, 0x51, 0x64, 0xb6, 0xca, 0xbf, + 0xf2, 0xbd, 0x8d, 0xd7, 0x7e, 0xf5, 0x7b, 0x1b, 0xaf, 0xfd, 0xda, 0xf7, 0x36, 0x22, 0xdf, 0xff, + 0xde, 0x46, 0xe4, 0x0f, 0xbf, 0xb7, 0x11, 0xf9, 0xf6, 0xd1, 0x46, 0xe4, 0xe7, 0x8e, 0x36, 0x22, + 0xff, 0xe8, 0x68, 0x23, 0xf2, 0xcf, 0x8f, 0x36, 0x22, 0xbf, 0x7c, 0xb4, 0x11, 0xf9, 0x95, 0xa3, + 0x8d, 0xc8, 0x6f, 0x1e, 0x6d, 0xbc, 0xf6, 0xfd, 0xa3, 0x8d, 0xc8, 0x5f, 0xfa, 0xf5, 0x8d, 0xd7, + 0xfe, 0xf6, 0xaf, 0x6f, 0x44, 0xbe, 0xc9, 0xf6, 0x0f, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x8b, 0xed, 0x3e, 0xc5, 0xd9, 0x8a, 0x00, 0x00, +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb_ffjson.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb_ffjson.go new file mode 100644 index 00000000..c274c45d --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.pb_ffjson.go @@ -0,0 +1,63680 @@ +// DO NOT EDIT! +// Code generated by ffjson +// source: mesos.pb.go +// DO NOT EDIT! + +package mesos + +import ( + "bytes" + "encoding/base64" + "errors" + "fmt" + fflib "github.com/pquerna/ffjson/fflib/v1" + "reflect" +) + +func (mj *Address) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Address) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteByte('{') + if mj.Hostname != nil { + if true { + buf.WriteString(`"hostname":`) + fflib.WriteJsonString(buf, string(*mj.Hostname)) + buf.WriteByte(',') + } + } + if mj.IP != nil { + if true { + buf.WriteString(`"ip":`) + fflib.WriteJsonString(buf, string(*mj.IP)) + buf.WriteByte(',') + } + } + buf.WriteString(`"port":`) + fflib.FormatBits2(buf, uint64(mj.Port), 10, mj.Port < 0) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Addressbase = iota + ffj_t_Addressno_such_key + + ffj_t_Address_Hostname + + ffj_t_Address_IP + + ffj_t_Address_Port +) + +var ffj_key_Address_Hostname = []byte("hostname") + +var ffj_key_Address_IP = []byte("ip") + +var ffj_key_Address_Port = []byte("port") + +func (uj *Address) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Address) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Addressbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Addressno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffj_key_Address_Hostname, kn) { + currentKey = ffj_t_Address_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_Address_IP, kn) { + currentKey = ffj_t_Address_IP + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Address_Port, kn) { + currentKey = ffj_t_Address_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Address_Port, kn) { + currentKey = ffj_t_Address_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Address_IP, kn) { + currentKey = ffj_t_Address_IP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Address_Hostname, kn) { + currentKey = ffj_t_Address_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Addressno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Address_Hostname: + goto handle_Hostname + + case ffj_t_Address_IP: + goto handle_IP + + case ffj_t_Address_Port: + goto handle_Port + + case ffj_t_Addressno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Hostname: + + /* handler: uj.Hostname type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Hostname = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Hostname = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IP: + + /* handler: uj.IP type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.IP = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.IP = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Port: + + /* handler: uj.Port type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Port = int32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *AgentID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *AgentID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_AgentIDbase = iota + ffj_t_AgentIDno_such_key + + ffj_t_AgentID_Value +) + +var ffj_key_AgentID_Value = []byte("value") + +func (uj *AgentID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *AgentID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_AgentIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_AgentIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_AgentID_Value, kn) { + currentKey = ffj_t_AgentID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_AgentID_Value, kn) { + currentKey = ffj_t_AgentID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_AgentIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_AgentID_Value: + goto handle_Value + + case ffj_t_AgentIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *AgentInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *AgentInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "hostname":`) + fflib.WriteJsonString(buf, string(mj.Hostname)) + buf.WriteByte(',') + if mj.Port != nil { + if true { + buf.WriteString(`"port":`) + fflib.FormatBits2(buf, uint64(*mj.Port), 10, *mj.Port < 0) + buf.WriteByte(',') + } + } + buf.WriteString(`"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"attributes":`) + if mj.Attributes != nil { + buf.WriteString(`[`) + for i, v := range mj.Attributes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.ID != nil { + if true { + buf.WriteString(`"id":`) + + { + + err = mj.ID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Domain != nil { + if true { + buf.WriteString(`"domain":`) + + { + + err = mj.Domain.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_AgentInfobase = iota + ffj_t_AgentInfono_such_key + + ffj_t_AgentInfo_Hostname + + ffj_t_AgentInfo_Port + + ffj_t_AgentInfo_Resources + + ffj_t_AgentInfo_Attributes + + ffj_t_AgentInfo_ID + + ffj_t_AgentInfo_Domain +) + +var ffj_key_AgentInfo_Hostname = []byte("hostname") + +var ffj_key_AgentInfo_Port = []byte("port") + +var ffj_key_AgentInfo_Resources = []byte("resources") + +var ffj_key_AgentInfo_Attributes = []byte("attributes") + +var ffj_key_AgentInfo_ID = []byte("id") + +var ffj_key_AgentInfo_Domain = []byte("domain") + +func (uj *AgentInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *AgentInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_AgentInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_AgentInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_AgentInfo_Attributes, kn) { + currentKey = ffj_t_AgentInfo_Attributes + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_AgentInfo_Domain, kn) { + currentKey = ffj_t_AgentInfo_Domain + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_AgentInfo_Hostname, kn) { + currentKey = ffj_t_AgentInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_AgentInfo_ID, kn) { + currentKey = ffj_t_AgentInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_AgentInfo_Port, kn) { + currentKey = ffj_t_AgentInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_AgentInfo_Resources, kn) { + currentKey = ffj_t_AgentInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_AgentInfo_Domain, kn) { + currentKey = ffj_t_AgentInfo_Domain + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_AgentInfo_ID, kn) { + currentKey = ffj_t_AgentInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_AgentInfo_Attributes, kn) { + currentKey = ffj_t_AgentInfo_Attributes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_AgentInfo_Resources, kn) { + currentKey = ffj_t_AgentInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_AgentInfo_Port, kn) { + currentKey = ffj_t_AgentInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_AgentInfo_Hostname, kn) { + currentKey = ffj_t_AgentInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_AgentInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_AgentInfo_Hostname: + goto handle_Hostname + + case ffj_t_AgentInfo_Port: + goto handle_Port + + case ffj_t_AgentInfo_Resources: + goto handle_Resources + + case ffj_t_AgentInfo_Attributes: + goto handle_Attributes + + case ffj_t_AgentInfo_ID: + goto handle_ID + + case ffj_t_AgentInfo_Domain: + goto handle_Domain + + case ffj_t_AgentInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Hostname: + + /* handler: uj.Hostname type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Hostname = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Port: + + /* handler: uj.Port type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Port = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int32(tval) + uj.Port = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Attributes: + + /* handler: uj.Attributes type=[]mesos.Attribute kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Attributes = nil + } else { + + uj.Attributes = []Attribute{} + + wantVal := true + + for { + + var tmp_uj__Attributes Attribute + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Attributes type=mesos.Attribute kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Attributes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Attributes = append(uj.Attributes, tmp_uj__Attributes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ID == nil { + uj.ID = new(AgentID) + } + + err = uj.ID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Domain: + + /* handler: uj.Domain type=mesos.DomainInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Domain = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Domain == nil { + uj.Domain = new(DomainInfo) + } + + err = uj.Domain.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *AgentInfo_Capability) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *AgentInfo_Capability) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_AgentInfo_Capabilitybase = iota + ffj_t_AgentInfo_Capabilityno_such_key + + ffj_t_AgentInfo_Capability_Type +) + +var ffj_key_AgentInfo_Capability_Type = []byte("type") + +func (uj *AgentInfo_Capability) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *AgentInfo_Capability) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_AgentInfo_Capabilitybase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_AgentInfo_Capabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 't': + + if bytes.Equal(ffj_key_AgentInfo_Capability_Type, kn) { + currentKey = ffj_t_AgentInfo_Capability_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_AgentInfo_Capability_Type, kn) { + currentKey = ffj_t_AgentInfo_Capability_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_AgentInfo_Capabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_AgentInfo_Capability_Type: + goto handle_Type + + case ffj_t_AgentInfo_Capabilityno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.AgentInfo_Capability_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Attribute) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Attribute) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteString(`,"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Scalar != nil { + if true { + buf.WriteString(`"scalar":`) + + { + + err = mj.Scalar.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Ranges != nil { + if true { + buf.WriteString(`"ranges":`) + + { + + err = mj.Ranges.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Set != nil { + if true { + buf.WriteString(`"set":`) + + { + + err = mj.Set.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Text != nil { + if true { + buf.WriteString(`"text":`) + + { + + err = mj.Text.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Attributebase = iota + ffj_t_Attributeno_such_key + + ffj_t_Attribute_Name + + ffj_t_Attribute_Type + + ffj_t_Attribute_Scalar + + ffj_t_Attribute_Ranges + + ffj_t_Attribute_Set + + ffj_t_Attribute_Text +) + +var ffj_key_Attribute_Name = []byte("name") + +var ffj_key_Attribute_Type = []byte("type") + +var ffj_key_Attribute_Scalar = []byte("scalar") + +var ffj_key_Attribute_Ranges = []byte("ranges") + +var ffj_key_Attribute_Set = []byte("set") + +var ffj_key_Attribute_Text = []byte("text") + +func (uj *Attribute) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Attribute) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Attributebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Attributeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_Attribute_Name, kn) { + currentKey = ffj_t_Attribute_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Attribute_Ranges, kn) { + currentKey = ffj_t_Attribute_Ranges + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Attribute_Scalar, kn) { + currentKey = ffj_t_Attribute_Scalar + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Attribute_Set, kn) { + currentKey = ffj_t_Attribute_Set + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Attribute_Type, kn) { + currentKey = ffj_t_Attribute_Type + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Attribute_Text, kn) { + currentKey = ffj_t_Attribute_Text + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Attribute_Text, kn) { + currentKey = ffj_t_Attribute_Text + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Attribute_Set, kn) { + currentKey = ffj_t_Attribute_Set + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Attribute_Ranges, kn) { + currentKey = ffj_t_Attribute_Ranges + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Attribute_Scalar, kn) { + currentKey = ffj_t_Attribute_Scalar + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Attribute_Type, kn) { + currentKey = ffj_t_Attribute_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Attribute_Name, kn) { + currentKey = ffj_t_Attribute_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Attributeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Attribute_Name: + goto handle_Name + + case ffj_t_Attribute_Type: + goto handle_Type + + case ffj_t_Attribute_Scalar: + goto handle_Scalar + + case ffj_t_Attribute_Ranges: + goto handle_Ranges + + case ffj_t_Attribute_Set: + goto handle_Set + + case ffj_t_Attribute_Text: + goto handle_Text + + case ffj_t_Attributeno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Type: + + /* handler: uj.Type type=mesos.Value_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Scalar: + + /* handler: uj.Scalar type=mesos.Value_Scalar kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Scalar = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Scalar == nil { + uj.Scalar = new(Value_Scalar) + } + + err = uj.Scalar.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Ranges: + + /* handler: uj.Ranges type=mesos.Value_Ranges kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Ranges = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Ranges == nil { + uj.Ranges = new(Value_Ranges) + } + + err = uj.Ranges.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Set: + + /* handler: uj.Set type=mesos.Value_Set kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Set = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Set == nil { + uj.Set = new(Value_Set) + } + + err = uj.Set.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Text: + + /* handler: uj.Text type=mesos.Value_Text kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Text = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Text == nil { + uj.Text = new(Value_Text) + } + + err = uj.Text.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CSIPluginContainerInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CSIPluginContainerInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if len(mj.Services) != 0 { + buf.WriteString(`"services":`) + if mj.Services != nil { + buf.WriteString(`[`) + for i, v := range mj.Services { + if i != 0 { + buf.WriteString(`,`) + } + + { + + obj, err = v.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Container != nil { + if true { + buf.WriteString(`"container":`) + + { + + err = mj.Container.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CSIPluginContainerInfobase = iota + ffj_t_CSIPluginContainerInfono_such_key + + ffj_t_CSIPluginContainerInfo_Services + + ffj_t_CSIPluginContainerInfo_Command + + ffj_t_CSIPluginContainerInfo_Resources + + ffj_t_CSIPluginContainerInfo_Container +) + +var ffj_key_CSIPluginContainerInfo_Services = []byte("services") + +var ffj_key_CSIPluginContainerInfo_Command = []byte("command") + +var ffj_key_CSIPluginContainerInfo_Resources = []byte("resources") + +var ffj_key_CSIPluginContainerInfo_Container = []byte("container") + +func (uj *CSIPluginContainerInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CSIPluginContainerInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CSIPluginContainerInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CSIPluginContainerInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CSIPluginContainerInfo_Command, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CSIPluginContainerInfo_Container, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_CSIPluginContainerInfo_Resources, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_CSIPluginContainerInfo_Services, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Services + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_CSIPluginContainerInfo_Container, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CSIPluginContainerInfo_Resources, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CSIPluginContainerInfo_Command, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CSIPluginContainerInfo_Services, kn) { + currentKey = ffj_t_CSIPluginContainerInfo_Services + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CSIPluginContainerInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CSIPluginContainerInfo_Services: + goto handle_Services + + case ffj_t_CSIPluginContainerInfo_Command: + goto handle_Command + + case ffj_t_CSIPluginContainerInfo_Resources: + goto handle_Resources + + case ffj_t_CSIPluginContainerInfo_Container: + goto handle_Container + + case ffj_t_CSIPluginContainerInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Services: + + /* handler: uj.Services type=[]mesos.CSIPluginContainerInfo_Service kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Services = nil + } else { + + uj.Services = []CSIPluginContainerInfo_Service{} + + wantVal := true + + for { + + var tmp_uj__Services CSIPluginContainerInfo_Service + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Services type=mesos.CSIPluginContainerInfo_Service kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = tmp_uj__Services.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + uj.Services = append(uj.Services, tmp_uj__Services) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(CommandInfo) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Container: + + /* handler: uj.Container type=mesos.ContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Container = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Container == nil { + uj.Container = new(ContainerInfo) + } + + err = uj.Container.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CSIPluginInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CSIPluginInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"type":`) + fflib.WriteJsonString(buf, string(mj.Type)) + buf.WriteString(`,"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteString(`,"containers":`) + if mj.Containers != nil { + buf.WriteString(`[`) + for i, v := range mj.Containers { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CSIPluginInfobase = iota + ffj_t_CSIPluginInfono_such_key + + ffj_t_CSIPluginInfo_Type + + ffj_t_CSIPluginInfo_Name + + ffj_t_CSIPluginInfo_Containers +) + +var ffj_key_CSIPluginInfo_Type = []byte("type") + +var ffj_key_CSIPluginInfo_Name = []byte("name") + +var ffj_key_CSIPluginInfo_Containers = []byte("containers") + +func (uj *CSIPluginInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CSIPluginInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CSIPluginInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CSIPluginInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CSIPluginInfo_Containers, kn) { + currentKey = ffj_t_CSIPluginInfo_Containers + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_CSIPluginInfo_Name, kn) { + currentKey = ffj_t_CSIPluginInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_CSIPluginInfo_Type, kn) { + currentKey = ffj_t_CSIPluginInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CSIPluginInfo_Containers, kn) { + currentKey = ffj_t_CSIPluginInfo_Containers + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CSIPluginInfo_Name, kn) { + currentKey = ffj_t_CSIPluginInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CSIPluginInfo_Type, kn) { + currentKey = ffj_t_CSIPluginInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CSIPluginInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CSIPluginInfo_Type: + goto handle_Type + + case ffj_t_CSIPluginInfo_Name: + goto handle_Name + + case ffj_t_CSIPluginInfo_Containers: + goto handle_Containers + + case ffj_t_CSIPluginInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Type = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Containers: + + /* handler: uj.Containers type=[]mesos.CSIPluginContainerInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Containers = nil + } else { + + uj.Containers = []CSIPluginContainerInfo{} + + wantVal := true + + for { + + var tmp_uj__Containers CSIPluginContainerInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Containers type=mesos.CSIPluginContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Containers.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Containers = append(uj.Containers, tmp_uj__Containers) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CapabilityInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CapabilityInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if len(mj.Capabilities) != 0 { + buf.WriteString(`"capabilities":`) + if mj.Capabilities != nil { + buf.WriteString(`[`) + for i, v := range mj.Capabilities { + if i != 0 { + buf.WriteString(`,`) + } + + { + + obj, err = v.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CapabilityInfobase = iota + ffj_t_CapabilityInfono_such_key + + ffj_t_CapabilityInfo_Capabilities +) + +var ffj_key_CapabilityInfo_Capabilities = []byte("capabilities") + +func (uj *CapabilityInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CapabilityInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CapabilityInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CapabilityInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CapabilityInfo_Capabilities, kn) { + currentKey = ffj_t_CapabilityInfo_Capabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CapabilityInfo_Capabilities, kn) { + currentKey = ffj_t_CapabilityInfo_Capabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CapabilityInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CapabilityInfo_Capabilities: + goto handle_Capabilities + + case ffj_t_CapabilityInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Capabilities: + + /* handler: uj.Capabilities type=[]mesos.CapabilityInfo_Capability kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Capabilities = nil + } else { + + uj.Capabilities = []CapabilityInfo_Capability{} + + wantVal := true + + for { + + var tmp_uj__Capabilities CapabilityInfo_Capability + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Capabilities type=mesos.CapabilityInfo_Capability kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = tmp_uj__Capabilities.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + uj.Capabilities = append(uj.Capabilities, tmp_uj__Capabilities) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.NetCLS != nil { + if true { + buf.WriteString(`"net_cls":`) + + { + + err = mj.NetCLS.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CgroupInfobase = iota + ffj_t_CgroupInfono_such_key + + ffj_t_CgroupInfo_NetCLS +) + +var ffj_key_CgroupInfo_NetCLS = []byte("net_cls") + +func (uj *CgroupInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_CgroupInfo_NetCLS, kn) { + currentKey = ffj_t_CgroupInfo_NetCLS + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_NetCLS, kn) { + currentKey = ffj_t_CgroupInfo_NetCLS + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CgroupInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_NetCLS: + goto handle_NetCLS + + case ffj_t_CgroupInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_NetCLS: + + /* handler: uj.NetCLS type=mesos.CgroupInfo_NetCls kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.NetCLS = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.NetCLS == nil { + uj.NetCLS = new(CgroupInfo_NetCls) + } + + err = uj.NetCLS.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_Blkio) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_Blkio) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{}`) + return nil +} + +const ( + ffj_t_CgroupInfo_Blkiobase = iota + ffj_t_CgroupInfo_Blkiono_such_key +) + +func (uj *CgroupInfo_Blkio) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_Blkio) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_Blkiobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_Blkiono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + } + + currentKey = ffj_t_CgroupInfo_Blkiono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_Blkiono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_Blkio_CFQ) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_Blkio_CFQ) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{}`) + return nil +} + +const ( + ffj_t_CgroupInfo_Blkio_CFQbase = iota + ffj_t_CgroupInfo_Blkio_CFQno_such_key +) + +func (uj *CgroupInfo_Blkio_CFQ) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_Blkio_CFQ) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_Blkio_CFQbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_Blkio_CFQno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + } + + currentKey = ffj_t_CgroupInfo_Blkio_CFQno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_Blkio_CFQno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_Blkio_CFQ_Statistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_Blkio_CFQ_Statistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteByte('{') + if mj.Device != nil { + if true { + buf.WriteString(`"device":`) + + { + + err = mj.Device.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Sectors != nil { + if true { + buf.WriteString(`"sectors":`) + fflib.FormatBits2(buf, uint64(*mj.Sectors), 10, false) + buf.WriteByte(',') + } + } + if mj.Time != nil { + if true { + buf.WriteString(`"time":`) + fflib.FormatBits2(buf, uint64(*mj.Time), 10, false) + buf.WriteByte(',') + } + } + buf.WriteString(`"io_serviced":`) + if mj.IOServiced != nil { + buf.WriteString(`[`) + for i, v := range mj.IOServiced { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"io_service_bytes":`) + if mj.IOServiceBytes != nil { + buf.WriteString(`[`) + for i, v := range mj.IOServiceBytes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"io_service_time":`) + if mj.IOServiceTime != nil { + buf.WriteString(`[`) + for i, v := range mj.IOServiceTime { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"io_wait_time":`) + if mj.IOWaitTime != nil { + buf.WriteString(`[`) + for i, v := range mj.IOWaitTime { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"io_merged":`) + if mj.IOMerged != nil { + buf.WriteString(`[`) + for i, v := range mj.IOMerged { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"io_queued":`) + if mj.IOQueued != nil { + buf.WriteString(`[`) + for i, v := range mj.IOQueued { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CgroupInfo_Blkio_CFQ_Statisticsbase = iota + ffj_t_CgroupInfo_Blkio_CFQ_Statisticsno_such_key + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Device + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Sectors + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Time + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiced + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceBytes + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceTime + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOWaitTime + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOMerged + + ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOQueued +) + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Device = []byte("device") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Sectors = []byte("sectors") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Time = []byte("time") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiced = []byte("io_serviced") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiceBytes = []byte("io_service_bytes") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiceTime = []byte("io_service_time") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOWaitTime = []byte("io_wait_time") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOMerged = []byte("io_merged") + +var ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOQueued = []byte("io_queued") + +func (uj *CgroupInfo_Blkio_CFQ_Statistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_Blkio_CFQ_Statistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_Blkio_CFQ_Statisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Device, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Device + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiced, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiced + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiceBytes, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiceTime, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceTime + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOWaitTime, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOWaitTime + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOMerged, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOMerged + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOQueued, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOQueued + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Sectors, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Sectors + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Time, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Time + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOQueued, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOQueued + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOMerged, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOMerged + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOWaitTime, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOWaitTime + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiceTime, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceTime + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiceBytes, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_IOServiced, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiced + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Time, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Time + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Sectors, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Sectors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CgroupInfo_Blkio_CFQ_Statistics_Device, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Device + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CgroupInfo_Blkio_CFQ_Statisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Device: + goto handle_Device + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Sectors: + goto handle_Sectors + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_Time: + goto handle_Time + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiced: + goto handle_IOServiced + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceBytes: + goto handle_IOServiceBytes + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOServiceTime: + goto handle_IOServiceTime + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOWaitTime: + goto handle_IOWaitTime + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOMerged: + goto handle_IOMerged + + case ffj_t_CgroupInfo_Blkio_CFQ_Statistics_IOQueued: + goto handle_IOQueued + + case ffj_t_CgroupInfo_Blkio_CFQ_Statisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Device: + + /* handler: uj.Device type=mesos.Device_Number kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Device = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Device == nil { + uj.Device = new(Device_Number) + } + + err = uj.Device.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Sectors: + + /* handler: uj.Sectors type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Sectors = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Sectors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Time: + + /* handler: uj.Time type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Time = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Time = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOServiced: + + /* handler: uj.IOServiced type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOServiced = nil + } else { + + uj.IOServiced = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOServiced CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOServiced type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOServiced.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOServiced = append(uj.IOServiced, tmp_uj__IOServiced) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOServiceBytes: + + /* handler: uj.IOServiceBytes type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOServiceBytes = nil + } else { + + uj.IOServiceBytes = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOServiceBytes CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOServiceBytes type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOServiceBytes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOServiceBytes = append(uj.IOServiceBytes, tmp_uj__IOServiceBytes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOServiceTime: + + /* handler: uj.IOServiceTime type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOServiceTime = nil + } else { + + uj.IOServiceTime = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOServiceTime CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOServiceTime type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOServiceTime.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOServiceTime = append(uj.IOServiceTime, tmp_uj__IOServiceTime) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOWaitTime: + + /* handler: uj.IOWaitTime type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOWaitTime = nil + } else { + + uj.IOWaitTime = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOWaitTime CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOWaitTime type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOWaitTime.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOWaitTime = append(uj.IOWaitTime, tmp_uj__IOWaitTime) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOMerged: + + /* handler: uj.IOMerged type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOMerged = nil + } else { + + uj.IOMerged = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOMerged CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOMerged type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOMerged.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOMerged = append(uj.IOMerged, tmp_uj__IOMerged) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOQueued: + + /* handler: uj.IOQueued type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOQueued = nil + } else { + + uj.IOQueued = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOQueued CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOQueued type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOQueued.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOQueued = append(uj.IOQueued, tmp_uj__IOQueued) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_Blkio_Statistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_Blkio_Statistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "cfq":`) + if mj.CFQ != nil { + buf.WriteString(`[`) + for i, v := range mj.CFQ { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"cfq_recursive":`) + if mj.CFQRecursive != nil { + buf.WriteString(`[`) + for i, v := range mj.CFQRecursive { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if len(mj.Throttling) != 0 { + buf.WriteString(`"throttling":`) + if mj.Throttling != nil { + buf.WriteString(`[`) + for i, v := range mj.Throttling { + if i != 0 { + buf.WriteString(`,`) + } + + { + + if v == nil { + buf.WriteString("null") + return nil + } + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CgroupInfo_Blkio_Statisticsbase = iota + ffj_t_CgroupInfo_Blkio_Statisticsno_such_key + + ffj_t_CgroupInfo_Blkio_Statistics_CFQ + + ffj_t_CgroupInfo_Blkio_Statistics_CFQRecursive + + ffj_t_CgroupInfo_Blkio_Statistics_Throttling +) + +var ffj_key_CgroupInfo_Blkio_Statistics_CFQ = []byte("cfq") + +var ffj_key_CgroupInfo_Blkio_Statistics_CFQRecursive = []byte("cfq_recursive") + +var ffj_key_CgroupInfo_Blkio_Statistics_Throttling = []byte("throttling") + +func (uj *CgroupInfo_Blkio_Statistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_Blkio_Statistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_Blkio_Statisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_Blkio_Statisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_Statistics_CFQ, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Statistics_CFQ + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CgroupInfo_Blkio_Statistics_CFQRecursive, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Statistics_CFQRecursive + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_Statistics_Throttling, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Statistics_Throttling + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_CgroupInfo_Blkio_Statistics_Throttling, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Statistics_Throttling + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_Blkio_Statistics_CFQRecursive, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Statistics_CFQRecursive + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CgroupInfo_Blkio_Statistics_CFQ, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Statistics_CFQ + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CgroupInfo_Blkio_Statisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_Blkio_Statistics_CFQ: + goto handle_CFQ + + case ffj_t_CgroupInfo_Blkio_Statistics_CFQRecursive: + goto handle_CFQRecursive + + case ffj_t_CgroupInfo_Blkio_Statistics_Throttling: + goto handle_Throttling + + case ffj_t_CgroupInfo_Blkio_Statisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_CFQ: + + /* handler: uj.CFQ type=[]mesos.CgroupInfo_Blkio_CFQ_Statistics kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.CFQ = nil + } else { + + uj.CFQ = []CgroupInfo_Blkio_CFQ_Statistics{} + + wantVal := true + + for { + + var tmp_uj__CFQ CgroupInfo_Blkio_CFQ_Statistics + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__CFQ type=mesos.CgroupInfo_Blkio_CFQ_Statistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__CFQ.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.CFQ = append(uj.CFQ, tmp_uj__CFQ) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CFQRecursive: + + /* handler: uj.CFQRecursive type=[]mesos.CgroupInfo_Blkio_CFQ_Statistics kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.CFQRecursive = nil + } else { + + uj.CFQRecursive = []CgroupInfo_Blkio_CFQ_Statistics{} + + wantVal := true + + for { + + var tmp_uj__CFQRecursive CgroupInfo_Blkio_CFQ_Statistics + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__CFQRecursive type=mesos.CgroupInfo_Blkio_CFQ_Statistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__CFQRecursive.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.CFQRecursive = append(uj.CFQRecursive, tmp_uj__CFQRecursive) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Throttling: + + /* handler: uj.Throttling type=[]*mesos.CgroupInfo_Blkio_Throttling_Statistics kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Throttling = nil + } else { + + uj.Throttling = []*CgroupInfo_Blkio_Throttling_Statistics{} + + wantVal := true + + for { + + var tmp_uj__Throttling *CgroupInfo_Blkio_Throttling_Statistics + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Throttling type=*mesos.CgroupInfo_Blkio_Throttling_Statistics kind=ptr quoted=false*/ + + { + if tok == fflib.FFTok_null { + + tmp_uj__Throttling = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if tmp_uj__Throttling == nil { + tmp_uj__Throttling = new(CgroupInfo_Blkio_Throttling_Statistics) + } + + err = tmp_uj__Throttling.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Throttling = append(uj.Throttling, tmp_uj__Throttling) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_Blkio_Throttling) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_Blkio_Throttling) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{}`) + return nil +} + +const ( + ffj_t_CgroupInfo_Blkio_Throttlingbase = iota + ffj_t_CgroupInfo_Blkio_Throttlingno_such_key +) + +func (uj *CgroupInfo_Blkio_Throttling) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_Blkio_Throttling) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_Blkio_Throttlingbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_Blkio_Throttlingno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + } + + currentKey = ffj_t_CgroupInfo_Blkio_Throttlingno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_Blkio_Throttlingno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_Blkio_Throttling_Statistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_Blkio_Throttling_Statistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteByte('{') + if mj.Device != nil { + if true { + buf.WriteString(`"device":`) + + { + + err = mj.Device.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"io_serviced":`) + if mj.IOServiced != nil { + buf.WriteString(`[`) + for i, v := range mj.IOServiced { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"io_service_bytes":`) + if mj.IOServiceBytes != nil { + buf.WriteString(`[`) + for i, v := range mj.IOServiceBytes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CgroupInfo_Blkio_Throttling_Statisticsbase = iota + ffj_t_CgroupInfo_Blkio_Throttling_Statisticsno_such_key + + ffj_t_CgroupInfo_Blkio_Throttling_Statistics_Device + + ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiced + + ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiceBytes +) + +var ffj_key_CgroupInfo_Blkio_Throttling_Statistics_Device = []byte("device") + +var ffj_key_CgroupInfo_Blkio_Throttling_Statistics_IOServiced = []byte("io_serviced") + +var ffj_key_CgroupInfo_Blkio_Throttling_Statistics_IOServiceBytes = []byte("io_service_bytes") + +func (uj *CgroupInfo_Blkio_Throttling_Statistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_Blkio_Throttling_Statistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_Blkio_Throttling_Statisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_Throttling_Statistics_Device, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statistics_Device + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_Throttling_Statistics_IOServiced, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiced + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CgroupInfo_Blkio_Throttling_Statistics_IOServiceBytes, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiceBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_Blkio_Throttling_Statistics_IOServiceBytes, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiceBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_Blkio_Throttling_Statistics_IOServiced, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiced + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CgroupInfo_Blkio_Throttling_Statistics_Device, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statistics_Device + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CgroupInfo_Blkio_Throttling_Statisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_Blkio_Throttling_Statistics_Device: + goto handle_Device + + case ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiced: + goto handle_IOServiced + + case ffj_t_CgroupInfo_Blkio_Throttling_Statistics_IOServiceBytes: + goto handle_IOServiceBytes + + case ffj_t_CgroupInfo_Blkio_Throttling_Statisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Device: + + /* handler: uj.Device type=mesos.Device_Number kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Device = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Device == nil { + uj.Device = new(Device_Number) + } + + err = uj.Device.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOServiced: + + /* handler: uj.IOServiced type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOServiced = nil + } else { + + uj.IOServiced = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOServiced CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOServiced type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOServiced.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOServiced = append(uj.IOServiced, tmp_uj__IOServiced) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IOServiceBytes: + + /* handler: uj.IOServiceBytes type=[]mesos.CgroupInfo_Blkio_Value kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IOServiceBytes = nil + } else { + + uj.IOServiceBytes = []CgroupInfo_Blkio_Value{} + + wantVal := true + + for { + + var tmp_uj__IOServiceBytes CgroupInfo_Blkio_Value + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IOServiceBytes type=mesos.CgroupInfo_Blkio_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IOServiceBytes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IOServiceBytes = append(uj.IOServiceBytes, tmp_uj__IOServiceBytes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_Blkio_Value) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_Blkio_Value) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Op != nil { + if true { + buf.WriteString(`"op":`) + + { + + obj, err = mj.Op.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Value != nil { + if true { + buf.WriteString(`"value":`) + fflib.FormatBits2(buf, uint64(*mj.Value), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CgroupInfo_Blkio_Valuebase = iota + ffj_t_CgroupInfo_Blkio_Valueno_such_key + + ffj_t_CgroupInfo_Blkio_Value_Op + + ffj_t_CgroupInfo_Blkio_Value_Value +) + +var ffj_key_CgroupInfo_Blkio_Value_Op = []byte("op") + +var ffj_key_CgroupInfo_Blkio_Value_Value = []byte("value") + +func (uj *CgroupInfo_Blkio_Value) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_Blkio_Value) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_Blkio_Valuebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_Blkio_Valueno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'o': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_Value_Op, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Value_Op + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_CgroupInfo_Blkio_Value_Value, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Value_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_CgroupInfo_Blkio_Value_Value, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Value_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CgroupInfo_Blkio_Value_Op, kn) { + currentKey = ffj_t_CgroupInfo_Blkio_Value_Op + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CgroupInfo_Blkio_Valueno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_Blkio_Value_Op: + goto handle_Op + + case ffj_t_CgroupInfo_Blkio_Value_Value: + goto handle_Value + + case ffj_t_CgroupInfo_Blkio_Valueno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Op: + + /* handler: uj.Op type=mesos.CgroupInfo_Blkio_Operation kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Op = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Op == nil { + uj.Op = new(CgroupInfo_Blkio_Operation) + } + + err = uj.Op.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Value = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Value = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CgroupInfo_NetCls) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CgroupInfo_NetCls) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ClassID != nil { + if true { + buf.WriteString(`"classid":`) + fflib.FormatBits2(buf, uint64(*mj.ClassID), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CgroupInfo_NetClsbase = iota + ffj_t_CgroupInfo_NetClsno_such_key + + ffj_t_CgroupInfo_NetCls_ClassID +) + +var ffj_key_CgroupInfo_NetCls_ClassID = []byte("classid") + +func (uj *CgroupInfo_NetCls) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CgroupInfo_NetCls) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CgroupInfo_NetClsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CgroupInfo_NetClsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CgroupInfo_NetCls_ClassID, kn) { + currentKey = ffj_t_CgroupInfo_NetCls_ClassID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CgroupInfo_NetCls_ClassID, kn) { + currentKey = ffj_t_CgroupInfo_NetCls_ClassID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CgroupInfo_NetClsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CgroupInfo_NetCls_ClassID: + goto handle_ClassID + + case ffj_t_CgroupInfo_NetClsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ClassID: + + /* handler: uj.ClassID type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ClassID = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.ClassID = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.HTTP != nil { + if true { + buf.WriteString(`"http":`) + + { + + err = mj.HTTP.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.TCP != nil { + if true { + buf.WriteString(`"tcp":`) + + { + + err = mj.TCP.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.DelaySeconds != nil { + if true { + buf.WriteString(`"delay_seconds":`) + fflib.AppendFloat(buf, float64(*mj.DelaySeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.IntervalSeconds != nil { + if true { + buf.WriteString(`"interval_seconds":`) + fflib.AppendFloat(buf, float64(*mj.IntervalSeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.TimeoutSeconds != nil { + if true { + buf.WriteString(`"timeout_seconds":`) + fflib.AppendFloat(buf, float64(*mj.TimeoutSeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckInfobase = iota + ffj_t_CheckInfono_such_key + + ffj_t_CheckInfo_Type + + ffj_t_CheckInfo_Command + + ffj_t_CheckInfo_HTTP + + ffj_t_CheckInfo_TCP + + ffj_t_CheckInfo_DelaySeconds + + ffj_t_CheckInfo_IntervalSeconds + + ffj_t_CheckInfo_TimeoutSeconds +) + +var ffj_key_CheckInfo_Type = []byte("type") + +var ffj_key_CheckInfo_Command = []byte("command") + +var ffj_key_CheckInfo_HTTP = []byte("http") + +var ffj_key_CheckInfo_TCP = []byte("tcp") + +var ffj_key_CheckInfo_DelaySeconds = []byte("delay_seconds") + +var ffj_key_CheckInfo_IntervalSeconds = []byte("interval_seconds") + +var ffj_key_CheckInfo_TimeoutSeconds = []byte("timeout_seconds") + +func (uj *CheckInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CheckInfo_Command, kn) { + currentKey = ffj_t_CheckInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_CheckInfo_DelaySeconds, kn) { + currentKey = ffj_t_CheckInfo_DelaySeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_CheckInfo_HTTP, kn) { + currentKey = ffj_t_CheckInfo_HTTP + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_CheckInfo_IntervalSeconds, kn) { + currentKey = ffj_t_CheckInfo_IntervalSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_CheckInfo_Type, kn) { + currentKey = ffj_t_CheckInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CheckInfo_TCP, kn) { + currentKey = ffj_t_CheckInfo_TCP + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CheckInfo_TimeoutSeconds, kn) { + currentKey = ffj_t_CheckInfo_TimeoutSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CheckInfo_TimeoutSeconds, kn) { + currentKey = ffj_t_CheckInfo_TimeoutSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CheckInfo_IntervalSeconds, kn) { + currentKey = ffj_t_CheckInfo_IntervalSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CheckInfo_DelaySeconds, kn) { + currentKey = ffj_t_CheckInfo_DelaySeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_TCP, kn) { + currentKey = ffj_t_CheckInfo_TCP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_HTTP, kn) { + currentKey = ffj_t_CheckInfo_HTTP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_Command, kn) { + currentKey = ffj_t_CheckInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_Type, kn) { + currentKey = ffj_t_CheckInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckInfo_Type: + goto handle_Type + + case ffj_t_CheckInfo_Command: + goto handle_Command + + case ffj_t_CheckInfo_HTTP: + goto handle_HTTP + + case ffj_t_CheckInfo_TCP: + goto handle_TCP + + case ffj_t_CheckInfo_DelaySeconds: + goto handle_DelaySeconds + + case ffj_t_CheckInfo_IntervalSeconds: + goto handle_IntervalSeconds + + case ffj_t_CheckInfo_TimeoutSeconds: + goto handle_TimeoutSeconds + + case ffj_t_CheckInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.CheckInfo_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CheckInfo_Command kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(CheckInfo_Command) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_HTTP: + + /* handler: uj.HTTP type=mesos.CheckInfo_Http kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.HTTP = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.HTTP == nil { + uj.HTTP = new(CheckInfo_Http) + } + + err = uj.HTTP.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TCP: + + /* handler: uj.TCP type=mesos.CheckInfo_Tcp kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.TCP = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.TCP == nil { + uj.TCP = new(CheckInfo_Tcp) + } + + err = uj.TCP.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DelaySeconds: + + /* handler: uj.DelaySeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DelaySeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.DelaySeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IntervalSeconds: + + /* handler: uj.IntervalSeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.IntervalSeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.IntervalSeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TimeoutSeconds: + + /* handler: uj.TimeoutSeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.TimeoutSeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.TimeoutSeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckInfo_Command) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckInfo_Command) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckInfo_Commandbase = iota + ffj_t_CheckInfo_Commandno_such_key + + ffj_t_CheckInfo_Command_Command +) + +var ffj_key_CheckInfo_Command_Command = []byte("command") + +func (uj *CheckInfo_Command) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckInfo_Command) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckInfo_Commandbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckInfo_Commandno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CheckInfo_Command_Command, kn) { + currentKey = ffj_t_CheckInfo_Command_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_Command_Command, kn) { + currentKey = ffj_t_CheckInfo_Command_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckInfo_Commandno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckInfo_Command_Command: + goto handle_Command + + case ffj_t_CheckInfo_Commandno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckInfo_Http) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckInfo_Http) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "port":`) + fflib.FormatBits2(buf, uint64(mj.Port), 10, false) + buf.WriteByte(',') + if mj.Path != nil { + if true { + buf.WriteString(`"path":`) + fflib.WriteJsonString(buf, string(*mj.Path)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckInfo_Httpbase = iota + ffj_t_CheckInfo_Httpno_such_key + + ffj_t_CheckInfo_Http_Port + + ffj_t_CheckInfo_Http_Path +) + +var ffj_key_CheckInfo_Http_Port = []byte("port") + +var ffj_key_CheckInfo_Http_Path = []byte("path") + +func (uj *CheckInfo_Http) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckInfo_Http) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckInfo_Httpbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckInfo_Httpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_CheckInfo_Http_Port, kn) { + currentKey = ffj_t_CheckInfo_Http_Port + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CheckInfo_Http_Path, kn) { + currentKey = ffj_t_CheckInfo_Http_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_Http_Path, kn) { + currentKey = ffj_t_CheckInfo_Http_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_Http_Port, kn) { + currentKey = ffj_t_CheckInfo_Http_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckInfo_Httpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckInfo_Http_Port: + goto handle_Port + + case ffj_t_CheckInfo_Http_Path: + goto handle_Path + + case ffj_t_CheckInfo_Httpno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Port: + + /* handler: uj.Port type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Port = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Path = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Path = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckInfo_Tcp) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckInfo_Tcp) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"port":`) + fflib.FormatBits2(buf, uint64(mj.Port), 10, false) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckInfo_Tcpbase = iota + ffj_t_CheckInfo_Tcpno_such_key + + ffj_t_CheckInfo_Tcp_Port +) + +var ffj_key_CheckInfo_Tcp_Port = []byte("port") + +func (uj *CheckInfo_Tcp) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckInfo_Tcp) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckInfo_Tcpbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckInfo_Tcpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_CheckInfo_Tcp_Port, kn) { + currentKey = ffj_t_CheckInfo_Tcp_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckInfo_Tcp_Port, kn) { + currentKey = ffj_t_CheckInfo_Tcp_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckInfo_Tcpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckInfo_Tcp_Port: + goto handle_Port + + case ffj_t_CheckInfo_Tcpno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Port: + + /* handler: uj.Port type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Port = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckStatusInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckStatusInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Type != nil { + if true { + buf.WriteString(`"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.HTTP != nil { + if true { + buf.WriteString(`"http":`) + + { + + err = mj.HTTP.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.TCP != nil { + if true { + buf.WriteString(`"tcp":`) + + { + + err = mj.TCP.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckStatusInfobase = iota + ffj_t_CheckStatusInfono_such_key + + ffj_t_CheckStatusInfo_Type + + ffj_t_CheckStatusInfo_Command + + ffj_t_CheckStatusInfo_HTTP + + ffj_t_CheckStatusInfo_TCP +) + +var ffj_key_CheckStatusInfo_Type = []byte("type") + +var ffj_key_CheckStatusInfo_Command = []byte("command") + +var ffj_key_CheckStatusInfo_HTTP = []byte("http") + +var ffj_key_CheckStatusInfo_TCP = []byte("tcp") + +func (uj *CheckStatusInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckStatusInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckStatusInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckStatusInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CheckStatusInfo_Command, kn) { + currentKey = ffj_t_CheckStatusInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_CheckStatusInfo_HTTP, kn) { + currentKey = ffj_t_CheckStatusInfo_HTTP + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_CheckStatusInfo_Type, kn) { + currentKey = ffj_t_CheckStatusInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CheckStatusInfo_TCP, kn) { + currentKey = ffj_t_CheckStatusInfo_TCP + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckStatusInfo_TCP, kn) { + currentKey = ffj_t_CheckStatusInfo_TCP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckStatusInfo_HTTP, kn) { + currentKey = ffj_t_CheckStatusInfo_HTTP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckStatusInfo_Command, kn) { + currentKey = ffj_t_CheckStatusInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CheckStatusInfo_Type, kn) { + currentKey = ffj_t_CheckStatusInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckStatusInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckStatusInfo_Type: + goto handle_Type + + case ffj_t_CheckStatusInfo_Command: + goto handle_Command + + case ffj_t_CheckStatusInfo_HTTP: + goto handle_HTTP + + case ffj_t_CheckStatusInfo_TCP: + goto handle_TCP + + case ffj_t_CheckStatusInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.CheckInfo_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Type = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Type == nil { + uj.Type = new(CheckInfo_Type) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CheckStatusInfo_Command kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(CheckStatusInfo_Command) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_HTTP: + + /* handler: uj.HTTP type=mesos.CheckStatusInfo_Http kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.HTTP = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.HTTP == nil { + uj.HTTP = new(CheckStatusInfo_Http) + } + + err = uj.HTTP.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TCP: + + /* handler: uj.TCP type=mesos.CheckStatusInfo_Tcp kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.TCP = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.TCP == nil { + uj.TCP = new(CheckStatusInfo_Tcp) + } + + err = uj.TCP.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckStatusInfo_Command) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckStatusInfo_Command) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ExitCode != nil { + if true { + buf.WriteString(`"exit_code":`) + fflib.FormatBits2(buf, uint64(*mj.ExitCode), 10, *mj.ExitCode < 0) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckStatusInfo_Commandbase = iota + ffj_t_CheckStatusInfo_Commandno_such_key + + ffj_t_CheckStatusInfo_Command_ExitCode +) + +var ffj_key_CheckStatusInfo_Command_ExitCode = []byte("exit_code") + +func (uj *CheckStatusInfo_Command) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckStatusInfo_Command) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckStatusInfo_Commandbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckStatusInfo_Commandno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_CheckStatusInfo_Command_ExitCode, kn) { + currentKey = ffj_t_CheckStatusInfo_Command_ExitCode + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_CheckStatusInfo_Command_ExitCode, kn) { + currentKey = ffj_t_CheckStatusInfo_Command_ExitCode + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckStatusInfo_Commandno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckStatusInfo_Command_ExitCode: + goto handle_ExitCode + + case ffj_t_CheckStatusInfo_Commandno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ExitCode: + + /* handler: uj.ExitCode type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ExitCode = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int32(tval) + uj.ExitCode = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckStatusInfo_Http) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckStatusInfo_Http) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.StatusCode != nil { + if true { + buf.WriteString(`"status_code":`) + fflib.FormatBits2(buf, uint64(*mj.StatusCode), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckStatusInfo_Httpbase = iota + ffj_t_CheckStatusInfo_Httpno_such_key + + ffj_t_CheckStatusInfo_Http_StatusCode +) + +var ffj_key_CheckStatusInfo_Http_StatusCode = []byte("status_code") + +func (uj *CheckStatusInfo_Http) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckStatusInfo_Http) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckStatusInfo_Httpbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckStatusInfo_Httpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 's': + + if bytes.Equal(ffj_key_CheckStatusInfo_Http_StatusCode, kn) { + currentKey = ffj_t_CheckStatusInfo_Http_StatusCode + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CheckStatusInfo_Http_StatusCode, kn) { + currentKey = ffj_t_CheckStatusInfo_Http_StatusCode + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckStatusInfo_Httpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckStatusInfo_Http_StatusCode: + goto handle_StatusCode + + case ffj_t_CheckStatusInfo_Httpno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_StatusCode: + + /* handler: uj.StatusCode type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.StatusCode = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.StatusCode = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CheckStatusInfo_Tcp) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CheckStatusInfo_Tcp) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Succeeded != nil { + if true { + if *mj.Succeeded { + buf.WriteString(`"succeeded":true`) + } else { + buf.WriteString(`"succeeded":false`) + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CheckStatusInfo_Tcpbase = iota + ffj_t_CheckStatusInfo_Tcpno_such_key + + ffj_t_CheckStatusInfo_Tcp_Succeeded +) + +var ffj_key_CheckStatusInfo_Tcp_Succeeded = []byte("succeeded") + +func (uj *CheckStatusInfo_Tcp) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CheckStatusInfo_Tcp) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CheckStatusInfo_Tcpbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CheckStatusInfo_Tcpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 's': + + if bytes.Equal(ffj_key_CheckStatusInfo_Tcp_Succeeded, kn) { + currentKey = ffj_t_CheckStatusInfo_Tcp_Succeeded + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CheckStatusInfo_Tcp_Succeeded, kn) { + currentKey = ffj_t_CheckStatusInfo_Tcp_Succeeded + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CheckStatusInfo_Tcpno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CheckStatusInfo_Tcp_Succeeded: + goto handle_Succeeded + + case ffj_t_CheckStatusInfo_Tcpno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Succeeded: + + /* handler: uj.Succeeded type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Succeeded = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Succeeded = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CommandInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CommandInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "uris":`) + if mj.URIs != nil { + buf.WriteString(`[`) + for i, v := range mj.URIs { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Environment != nil { + if true { + buf.WriteString(`"environment":`) + + { + + err = mj.Environment.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Shell != nil { + if true { + if *mj.Shell { + buf.WriteString(`"shell":true`) + } else { + buf.WriteString(`"shell":false`) + } + buf.WriteByte(',') + } + } + if mj.Value != nil { + if true { + buf.WriteString(`"value":`) + fflib.WriteJsonString(buf, string(*mj.Value)) + buf.WriteByte(',') + } + } + if len(mj.Arguments) != 0 { + buf.WriteString(`"arguments":`) + if mj.Arguments != nil { + buf.WriteString(`[`) + for i, v := range mj.Arguments { + if i != 0 { + buf.WriteString(`,`) + } + fflib.WriteJsonString(buf, string(v)) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.User != nil { + if true { + buf.WriteString(`"user":`) + fflib.WriteJsonString(buf, string(*mj.User)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CommandInfobase = iota + ffj_t_CommandInfono_such_key + + ffj_t_CommandInfo_URIs + + ffj_t_CommandInfo_Environment + + ffj_t_CommandInfo_Shell + + ffj_t_CommandInfo_Value + + ffj_t_CommandInfo_Arguments + + ffj_t_CommandInfo_User +) + +var ffj_key_CommandInfo_URIs = []byte("uris") + +var ffj_key_CommandInfo_Environment = []byte("environment") + +var ffj_key_CommandInfo_Shell = []byte("shell") + +var ffj_key_CommandInfo_Value = []byte("value") + +var ffj_key_CommandInfo_Arguments = []byte("arguments") + +var ffj_key_CommandInfo_User = []byte("user") + +func (uj *CommandInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CommandInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CommandInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CommandInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_CommandInfo_Arguments, kn) { + currentKey = ffj_t_CommandInfo_Arguments + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_CommandInfo_Environment, kn) { + currentKey = ffj_t_CommandInfo_Environment + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_CommandInfo_Shell, kn) { + currentKey = ffj_t_CommandInfo_Shell + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_CommandInfo_URIs, kn) { + currentKey = ffj_t_CommandInfo_URIs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CommandInfo_User, kn) { + currentKey = ffj_t_CommandInfo_User + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_CommandInfo_Value, kn) { + currentKey = ffj_t_CommandInfo_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_CommandInfo_User, kn) { + currentKey = ffj_t_CommandInfo_User + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CommandInfo_Arguments, kn) { + currentKey = ffj_t_CommandInfo_Arguments + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CommandInfo_Value, kn) { + currentKey = ffj_t_CommandInfo_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CommandInfo_Shell, kn) { + currentKey = ffj_t_CommandInfo_Shell + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CommandInfo_Environment, kn) { + currentKey = ffj_t_CommandInfo_Environment + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_CommandInfo_URIs, kn) { + currentKey = ffj_t_CommandInfo_URIs + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CommandInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CommandInfo_URIs: + goto handle_URIs + + case ffj_t_CommandInfo_Environment: + goto handle_Environment + + case ffj_t_CommandInfo_Shell: + goto handle_Shell + + case ffj_t_CommandInfo_Value: + goto handle_Value + + case ffj_t_CommandInfo_Arguments: + goto handle_Arguments + + case ffj_t_CommandInfo_User: + goto handle_User + + case ffj_t_CommandInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_URIs: + + /* handler: uj.URIs type=[]mesos.CommandInfo_URI kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.URIs = nil + } else { + + uj.URIs = []CommandInfo_URI{} + + wantVal := true + + for { + + var tmp_uj__URIs CommandInfo_URI + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__URIs type=mesos.CommandInfo_URI kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__URIs.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.URIs = append(uj.URIs, tmp_uj__URIs) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Environment: + + /* handler: uj.Environment type=mesos.Environment kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Environment = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Environment == nil { + uj.Environment = new(Environment) + } + + err = uj.Environment.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Shell: + + /* handler: uj.Shell type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Shell = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Shell = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Value = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Value = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Arguments: + + /* handler: uj.Arguments type=[]string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Arguments = nil + } else { + + uj.Arguments = []string{} + + wantVal := true + + for { + + var tmp_uj__Arguments string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Arguments type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + tmp_uj__Arguments = string(string(outBuf)) + + } + } + + uj.Arguments = append(uj.Arguments, tmp_uj__Arguments) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_User: + + /* handler: uj.User type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.User = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.User = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *CommandInfo_URI) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *CommandInfo_URI) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte(',') + if mj.Executable != nil { + if true { + if *mj.Executable { + buf.WriteString(`"executable":true`) + } else { + buf.WriteString(`"executable":false`) + } + buf.WriteByte(',') + } + } + if mj.Extract != nil { + if true { + if *mj.Extract { + buf.WriteString(`"extract":true`) + } else { + buf.WriteString(`"extract":false`) + } + buf.WriteByte(',') + } + } + if mj.Cache != nil { + if true { + if *mj.Cache { + buf.WriteString(`"cache":true`) + } else { + buf.WriteString(`"cache":false`) + } + buf.WriteByte(',') + } + } + if mj.OutputFile != nil { + if true { + buf.WriteString(`"output_file":`) + fflib.WriteJsonString(buf, string(*mj.OutputFile)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_CommandInfo_URIbase = iota + ffj_t_CommandInfo_URIno_such_key + + ffj_t_CommandInfo_URI_Value + + ffj_t_CommandInfo_URI_Executable + + ffj_t_CommandInfo_URI_Extract + + ffj_t_CommandInfo_URI_Cache + + ffj_t_CommandInfo_URI_OutputFile +) + +var ffj_key_CommandInfo_URI_Value = []byte("value") + +var ffj_key_CommandInfo_URI_Executable = []byte("executable") + +var ffj_key_CommandInfo_URI_Extract = []byte("extract") + +var ffj_key_CommandInfo_URI_Cache = []byte("cache") + +var ffj_key_CommandInfo_URI_OutputFile = []byte("output_file") + +func (uj *CommandInfo_URI) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *CommandInfo_URI) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_CommandInfo_URIbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_CommandInfo_URIno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_CommandInfo_URI_Cache, kn) { + currentKey = ffj_t_CommandInfo_URI_Cache + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_CommandInfo_URI_Executable, kn) { + currentKey = ffj_t_CommandInfo_URI_Executable + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_CommandInfo_URI_Extract, kn) { + currentKey = ffj_t_CommandInfo_URI_Extract + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'o': + + if bytes.Equal(ffj_key_CommandInfo_URI_OutputFile, kn) { + currentKey = ffj_t_CommandInfo_URI_OutputFile + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_CommandInfo_URI_Value, kn) { + currentKey = ffj_t_CommandInfo_URI_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_CommandInfo_URI_OutputFile, kn) { + currentKey = ffj_t_CommandInfo_URI_OutputFile + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CommandInfo_URI_Cache, kn) { + currentKey = ffj_t_CommandInfo_URI_Cache + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CommandInfo_URI_Extract, kn) { + currentKey = ffj_t_CommandInfo_URI_Extract + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CommandInfo_URI_Executable, kn) { + currentKey = ffj_t_CommandInfo_URI_Executable + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_CommandInfo_URI_Value, kn) { + currentKey = ffj_t_CommandInfo_URI_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_CommandInfo_URIno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_CommandInfo_URI_Value: + goto handle_Value + + case ffj_t_CommandInfo_URI_Executable: + goto handle_Executable + + case ffj_t_CommandInfo_URI_Extract: + goto handle_Extract + + case ffj_t_CommandInfo_URI_Cache: + goto handle_Cache + + case ffj_t_CommandInfo_URI_OutputFile: + goto handle_OutputFile + + case ffj_t_CommandInfo_URIno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Executable: + + /* handler: uj.Executable type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Executable = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Executable = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Extract: + + /* handler: uj.Extract type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Extract = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Extract = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Cache: + + /* handler: uj.Cache type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Cache = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Cache = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutputFile: + + /* handler: uj.OutputFile type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.OutputFile = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.OutputFile = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ContainerID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ContainerID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte(',') + if mj.Parent != nil { + if true { + buf.WriteString(`"parent":`) + + { + + err = mj.Parent.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ContainerIDbase = iota + ffj_t_ContainerIDno_such_key + + ffj_t_ContainerID_Value + + ffj_t_ContainerID_Parent +) + +var ffj_key_ContainerID_Value = []byte("value") + +var ffj_key_ContainerID_Parent = []byte("parent") + +func (uj *ContainerID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ContainerID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ContainerIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ContainerIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_ContainerID_Parent, kn) { + currentKey = ffj_t_ContainerID_Parent + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_ContainerID_Value, kn) { + currentKey = ffj_t_ContainerID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ContainerID_Parent, kn) { + currentKey = ffj_t_ContainerID_Parent + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ContainerID_Value, kn) { + currentKey = ffj_t_ContainerID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ContainerIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ContainerID_Value: + goto handle_Value + + case ffj_t_ContainerID_Parent: + goto handle_Parent + + case ffj_t_ContainerIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Parent: + + /* handler: uj.Parent type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Parent = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Parent == nil { + uj.Parent = new(ContainerID) + } + + err = uj.Parent.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ContainerInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ContainerInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Type != nil { + if true { + buf.WriteString(`"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"volumes":`) + if mj.Volumes != nil { + buf.WriteString(`[`) + for i, v := range mj.Volumes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Hostname != nil { + if true { + buf.WriteString(`"hostname":`) + fflib.WriteJsonString(buf, string(*mj.Hostname)) + buf.WriteByte(',') + } + } + if mj.Docker != nil { + if true { + buf.WriteString(`"docker":`) + + { + + err = mj.Docker.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Mesos != nil { + if true { + buf.WriteString(`"mesos":`) + + { + + err = mj.Mesos.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"network_infos":`) + if mj.NetworkInfos != nil { + buf.WriteString(`[`) + for i, v := range mj.NetworkInfos { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.LinuxInfo != nil { + if true { + buf.WriteString(`"linux_info":`) + + { + + err = mj.LinuxInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.RlimitInfo != nil { + if true { + buf.WriteString(`"rlimit_info":`) + + { + + err = mj.RlimitInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.TTYInfo != nil { + if true { + buf.WriteString(`"tty_info":`) + + { + + err = mj.TTYInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ContainerInfobase = iota + ffj_t_ContainerInfono_such_key + + ffj_t_ContainerInfo_Type + + ffj_t_ContainerInfo_Volumes + + ffj_t_ContainerInfo_Hostname + + ffj_t_ContainerInfo_Docker + + ffj_t_ContainerInfo_Mesos + + ffj_t_ContainerInfo_NetworkInfos + + ffj_t_ContainerInfo_LinuxInfo + + ffj_t_ContainerInfo_RlimitInfo + + ffj_t_ContainerInfo_TTYInfo +) + +var ffj_key_ContainerInfo_Type = []byte("type") + +var ffj_key_ContainerInfo_Volumes = []byte("volumes") + +var ffj_key_ContainerInfo_Hostname = []byte("hostname") + +var ffj_key_ContainerInfo_Docker = []byte("docker") + +var ffj_key_ContainerInfo_Mesos = []byte("mesos") + +var ffj_key_ContainerInfo_NetworkInfos = []byte("network_infos") + +var ffj_key_ContainerInfo_LinuxInfo = []byte("linux_info") + +var ffj_key_ContainerInfo_RlimitInfo = []byte("rlimit_info") + +var ffj_key_ContainerInfo_TTYInfo = []byte("tty_info") + +func (uj *ContainerInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ContainerInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ContainerInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ContainerInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_ContainerInfo_Docker, kn) { + currentKey = ffj_t_ContainerInfo_Docker + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_ContainerInfo_Hostname, kn) { + currentKey = ffj_t_ContainerInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_ContainerInfo_LinuxInfo, kn) { + currentKey = ffj_t_ContainerInfo_LinuxInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_ContainerInfo_Mesos, kn) { + currentKey = ffj_t_ContainerInfo_Mesos + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_ContainerInfo_NetworkInfos, kn) { + currentKey = ffj_t_ContainerInfo_NetworkInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_ContainerInfo_RlimitInfo, kn) { + currentKey = ffj_t_ContainerInfo_RlimitInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ContainerInfo_Type, kn) { + currentKey = ffj_t_ContainerInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ContainerInfo_TTYInfo, kn) { + currentKey = ffj_t_ContainerInfo_TTYInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_ContainerInfo_Volumes, kn) { + currentKey = ffj_t_ContainerInfo_Volumes + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_ContainerInfo_TTYInfo, kn) { + currentKey = ffj_t_ContainerInfo_TTYInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ContainerInfo_RlimitInfo, kn) { + currentKey = ffj_t_ContainerInfo_RlimitInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ContainerInfo_LinuxInfo, kn) { + currentKey = ffj_t_ContainerInfo_LinuxInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_NetworkInfos, kn) { + currentKey = ffj_t_ContainerInfo_NetworkInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_Mesos, kn) { + currentKey = ffj_t_ContainerInfo_Mesos + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_Docker, kn) { + currentKey = ffj_t_ContainerInfo_Docker + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_Hostname, kn) { + currentKey = ffj_t_ContainerInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_Volumes, kn) { + currentKey = ffj_t_ContainerInfo_Volumes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ContainerInfo_Type, kn) { + currentKey = ffj_t_ContainerInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ContainerInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ContainerInfo_Type: + goto handle_Type + + case ffj_t_ContainerInfo_Volumes: + goto handle_Volumes + + case ffj_t_ContainerInfo_Hostname: + goto handle_Hostname + + case ffj_t_ContainerInfo_Docker: + goto handle_Docker + + case ffj_t_ContainerInfo_Mesos: + goto handle_Mesos + + case ffj_t_ContainerInfo_NetworkInfos: + goto handle_NetworkInfos + + case ffj_t_ContainerInfo_LinuxInfo: + goto handle_LinuxInfo + + case ffj_t_ContainerInfo_RlimitInfo: + goto handle_RlimitInfo + + case ffj_t_ContainerInfo_TTYInfo: + goto handle_TTYInfo + + case ffj_t_ContainerInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.ContainerInfo_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Type = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Type == nil { + uj.Type = new(ContainerInfo_Type) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Volumes: + + /* handler: uj.Volumes type=[]mesos.Volume kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Volumes = nil + } else { + + uj.Volumes = []Volume{} + + wantVal := true + + for { + + var tmp_uj__Volumes Volume + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Volumes type=mesos.Volume kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Volumes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Volumes = append(uj.Volumes, tmp_uj__Volumes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Hostname: + + /* handler: uj.Hostname type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Hostname = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Hostname = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Docker: + + /* handler: uj.Docker type=mesos.ContainerInfo_DockerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Docker = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Docker == nil { + uj.Docker = new(ContainerInfo_DockerInfo) + } + + err = uj.Docker.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Mesos: + + /* handler: uj.Mesos type=mesos.ContainerInfo_MesosInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Mesos = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Mesos == nil { + uj.Mesos = new(ContainerInfo_MesosInfo) + } + + err = uj.Mesos.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetworkInfos: + + /* handler: uj.NetworkInfos type=[]mesos.NetworkInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.NetworkInfos = nil + } else { + + uj.NetworkInfos = []NetworkInfo{} + + wantVal := true + + for { + + var tmp_uj__NetworkInfos NetworkInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__NetworkInfos type=mesos.NetworkInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__NetworkInfos.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.NetworkInfos = append(uj.NetworkInfos, tmp_uj__NetworkInfos) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LinuxInfo: + + /* handler: uj.LinuxInfo type=mesos.LinuxInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.LinuxInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.LinuxInfo == nil { + uj.LinuxInfo = new(LinuxInfo) + } + + err = uj.LinuxInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RlimitInfo: + + /* handler: uj.RlimitInfo type=mesos.RLimitInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.RlimitInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.RlimitInfo == nil { + uj.RlimitInfo = new(RLimitInfo) + } + + err = uj.RlimitInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TTYInfo: + + /* handler: uj.TTYInfo type=mesos.TTYInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.TTYInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.TTYInfo == nil { + uj.TTYInfo = new(TTYInfo) + } + + err = uj.TTYInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ContainerInfo_DockerInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ContainerInfo_DockerInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "image":`) + fflib.WriteJsonString(buf, string(mj.Image)) + buf.WriteByte(',') + if mj.Network != nil { + if true { + buf.WriteString(`"network":`) + + { + + obj, err = mj.Network.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"port_mappings":`) + if mj.PortMappings != nil { + buf.WriteString(`[`) + for i, v := range mj.PortMappings { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Privileged != nil { + if true { + if *mj.Privileged { + buf.WriteString(`"privileged":true`) + } else { + buf.WriteString(`"privileged":false`) + } + buf.WriteByte(',') + } + } + buf.WriteString(`"parameters":`) + if mj.Parameters != nil { + buf.WriteString(`[`) + for i, v := range mj.Parameters { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.ForcePullImage != nil { + if true { + if *mj.ForcePullImage { + buf.WriteString(`"force_pull_image":true`) + } else { + buf.WriteString(`"force_pull_image":false`) + } + buf.WriteByte(',') + } + } + if mj.VolumeDriver != nil { + if true { + buf.WriteString(`"volume_driver":`) + fflib.WriteJsonString(buf, string(*mj.VolumeDriver)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ContainerInfo_DockerInfobase = iota + ffj_t_ContainerInfo_DockerInfono_such_key + + ffj_t_ContainerInfo_DockerInfo_Image + + ffj_t_ContainerInfo_DockerInfo_Network + + ffj_t_ContainerInfo_DockerInfo_PortMappings + + ffj_t_ContainerInfo_DockerInfo_Privileged + + ffj_t_ContainerInfo_DockerInfo_Parameters + + ffj_t_ContainerInfo_DockerInfo_ForcePullImage + + ffj_t_ContainerInfo_DockerInfo_VolumeDriver +) + +var ffj_key_ContainerInfo_DockerInfo_Image = []byte("image") + +var ffj_key_ContainerInfo_DockerInfo_Network = []byte("network") + +var ffj_key_ContainerInfo_DockerInfo_PortMappings = []byte("port_mappings") + +var ffj_key_ContainerInfo_DockerInfo_Privileged = []byte("privileged") + +var ffj_key_ContainerInfo_DockerInfo_Parameters = []byte("parameters") + +var ffj_key_ContainerInfo_DockerInfo_ForcePullImage = []byte("force_pull_image") + +var ffj_key_ContainerInfo_DockerInfo_VolumeDriver = []byte("volume_driver") + +func (uj *ContainerInfo_DockerInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ContainerInfo_DockerInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ContainerInfo_DockerInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ContainerInfo_DockerInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'f': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_ForcePullImage, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_ForcePullImage + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_Image, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Image + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_Network, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Network + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_PortMappings, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMappings + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_Privileged, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Privileged + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_Parameters, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Parameters + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_VolumeDriver, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_VolumeDriver + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_ContainerInfo_DockerInfo_VolumeDriver, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_VolumeDriver + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ContainerInfo_DockerInfo_ForcePullImage, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_ForcePullImage + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_DockerInfo_Parameters, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Parameters + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ContainerInfo_DockerInfo_Privileged, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Privileged + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_DockerInfo_PortMappings, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMappings + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_DockerInfo_Network, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Network + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ContainerInfo_DockerInfo_Image, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_Image + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ContainerInfo_DockerInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ContainerInfo_DockerInfo_Image: + goto handle_Image + + case ffj_t_ContainerInfo_DockerInfo_Network: + goto handle_Network + + case ffj_t_ContainerInfo_DockerInfo_PortMappings: + goto handle_PortMappings + + case ffj_t_ContainerInfo_DockerInfo_Privileged: + goto handle_Privileged + + case ffj_t_ContainerInfo_DockerInfo_Parameters: + goto handle_Parameters + + case ffj_t_ContainerInfo_DockerInfo_ForcePullImage: + goto handle_ForcePullImage + + case ffj_t_ContainerInfo_DockerInfo_VolumeDriver: + goto handle_VolumeDriver + + case ffj_t_ContainerInfo_DockerInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Image: + + /* handler: uj.Image type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Image = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Network: + + /* handler: uj.Network type=mesos.ContainerInfo_DockerInfo_Network kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Network = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Network == nil { + uj.Network = new(ContainerInfo_DockerInfo_Network) + } + + err = uj.Network.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_PortMappings: + + /* handler: uj.PortMappings type=[]mesos.ContainerInfo_DockerInfo_PortMapping kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.PortMappings = nil + } else { + + uj.PortMappings = []ContainerInfo_DockerInfo_PortMapping{} + + wantVal := true + + for { + + var tmp_uj__PortMappings ContainerInfo_DockerInfo_PortMapping + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__PortMappings type=mesos.ContainerInfo_DockerInfo_PortMapping kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__PortMappings.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.PortMappings = append(uj.PortMappings, tmp_uj__PortMappings) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Privileged: + + /* handler: uj.Privileged type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Privileged = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Privileged = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Parameters: + + /* handler: uj.Parameters type=[]mesos.Parameter kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Parameters = nil + } else { + + uj.Parameters = []Parameter{} + + wantVal := true + + for { + + var tmp_uj__Parameters Parameter + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Parameters type=mesos.Parameter kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Parameters.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Parameters = append(uj.Parameters, tmp_uj__Parameters) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ForcePullImage: + + /* handler: uj.ForcePullImage type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.ForcePullImage = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.ForcePullImage = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_VolumeDriver: + + /* handler: uj.VolumeDriver type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.VolumeDriver = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.VolumeDriver = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ContainerInfo_DockerInfo_PortMapping) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ContainerInfo_DockerInfo_PortMapping) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "host_port":`) + fflib.FormatBits2(buf, uint64(mj.HostPort), 10, false) + buf.WriteString(`,"container_port":`) + fflib.FormatBits2(buf, uint64(mj.ContainerPort), 10, false) + buf.WriteByte(',') + if mj.Protocol != nil { + if true { + buf.WriteString(`"protocol":`) + fflib.WriteJsonString(buf, string(*mj.Protocol)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ContainerInfo_DockerInfo_PortMappingbase = iota + ffj_t_ContainerInfo_DockerInfo_PortMappingno_such_key + + ffj_t_ContainerInfo_DockerInfo_PortMapping_HostPort + + ffj_t_ContainerInfo_DockerInfo_PortMapping_ContainerPort + + ffj_t_ContainerInfo_DockerInfo_PortMapping_Protocol +) + +var ffj_key_ContainerInfo_DockerInfo_PortMapping_HostPort = []byte("host_port") + +var ffj_key_ContainerInfo_DockerInfo_PortMapping_ContainerPort = []byte("container_port") + +var ffj_key_ContainerInfo_DockerInfo_PortMapping_Protocol = []byte("protocol") + +func (uj *ContainerInfo_DockerInfo_PortMapping) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ContainerInfo_DockerInfo_PortMapping) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ContainerInfo_DockerInfo_PortMappingbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMappingno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_PortMapping_ContainerPort, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMapping_ContainerPort + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_PortMapping_HostPort, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMapping_HostPort + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_ContainerInfo_DockerInfo_PortMapping_Protocol, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMapping_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ContainerInfo_DockerInfo_PortMapping_Protocol, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMapping_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ContainerInfo_DockerInfo_PortMapping_ContainerPort, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMapping_ContainerPort + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerInfo_DockerInfo_PortMapping_HostPort, kn) { + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMapping_HostPort + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ContainerInfo_DockerInfo_PortMappingno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ContainerInfo_DockerInfo_PortMapping_HostPort: + goto handle_HostPort + + case ffj_t_ContainerInfo_DockerInfo_PortMapping_ContainerPort: + goto handle_ContainerPort + + case ffj_t_ContainerInfo_DockerInfo_PortMapping_Protocol: + goto handle_Protocol + + case ffj_t_ContainerInfo_DockerInfo_PortMappingno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_HostPort: + + /* handler: uj.HostPort type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.HostPort = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerPort: + + /* handler: uj.ContainerPort type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.ContainerPort = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Protocol: + + /* handler: uj.Protocol type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Protocol = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Protocol = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ContainerInfo_MesosInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ContainerInfo_MesosInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Image != nil { + if true { + buf.WriteString(`"image":`) + + { + + err = mj.Image.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ContainerInfo_MesosInfobase = iota + ffj_t_ContainerInfo_MesosInfono_such_key + + ffj_t_ContainerInfo_MesosInfo_Image +) + +var ffj_key_ContainerInfo_MesosInfo_Image = []byte("image") + +func (uj *ContainerInfo_MesosInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ContainerInfo_MesosInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ContainerInfo_MesosInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ContainerInfo_MesosInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_ContainerInfo_MesosInfo_Image, kn) { + currentKey = ffj_t_ContainerInfo_MesosInfo_Image + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ContainerInfo_MesosInfo_Image, kn) { + currentKey = ffj_t_ContainerInfo_MesosInfo_Image + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ContainerInfo_MesosInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ContainerInfo_MesosInfo_Image: + goto handle_Image + + case ffj_t_ContainerInfo_MesosInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Image: + + /* handler: uj.Image type=mesos.Image kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Image = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Image == nil { + uj.Image = new(Image) + } + + err = uj.Image.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ContainerStatus) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ContainerStatus) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ContainerID != nil { + if true { + buf.WriteString(`"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"network_infos":`) + if mj.NetworkInfos != nil { + buf.WriteString(`[`) + for i, v := range mj.NetworkInfos { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.CgroupInfo != nil { + if true { + buf.WriteString(`"cgroup_info":`) + + { + + err = mj.CgroupInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ExecutorPID != nil { + if true { + buf.WriteString(`"executor_pid":`) + fflib.FormatBits2(buf, uint64(*mj.ExecutorPID), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ContainerStatusbase = iota + ffj_t_ContainerStatusno_such_key + + ffj_t_ContainerStatus_ContainerID + + ffj_t_ContainerStatus_NetworkInfos + + ffj_t_ContainerStatus_CgroupInfo + + ffj_t_ContainerStatus_ExecutorPID +) + +var ffj_key_ContainerStatus_ContainerID = []byte("container_id") + +var ffj_key_ContainerStatus_NetworkInfos = []byte("network_infos") + +var ffj_key_ContainerStatus_CgroupInfo = []byte("cgroup_info") + +var ffj_key_ContainerStatus_ExecutorPID = []byte("executor_pid") + +func (uj *ContainerStatus) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ContainerStatus) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ContainerStatusbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ContainerStatusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_ContainerStatus_ContainerID, kn) { + currentKey = ffj_t_ContainerStatus_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ContainerStatus_CgroupInfo, kn) { + currentKey = ffj_t_ContainerStatus_CgroupInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_ContainerStatus_ExecutorPID, kn) { + currentKey = ffj_t_ContainerStatus_ExecutorPID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_ContainerStatus_NetworkInfos, kn) { + currentKey = ffj_t_ContainerStatus_NetworkInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_ContainerStatus_ExecutorPID, kn) { + currentKey = ffj_t_ContainerStatus_ExecutorPID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ContainerStatus_CgroupInfo, kn) { + currentKey = ffj_t_ContainerStatus_CgroupInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ContainerStatus_NetworkInfos, kn) { + currentKey = ffj_t_ContainerStatus_NetworkInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ContainerStatus_ContainerID, kn) { + currentKey = ffj_t_ContainerStatus_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ContainerStatusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ContainerStatus_ContainerID: + goto handle_ContainerID + + case ffj_t_ContainerStatus_NetworkInfos: + goto handle_NetworkInfos + + case ffj_t_ContainerStatus_CgroupInfo: + goto handle_CgroupInfo + + case ffj_t_ContainerStatus_ExecutorPID: + goto handle_ExecutorPID + + case ffj_t_ContainerStatusno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ContainerID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ContainerID == nil { + uj.ContainerID = new(ContainerID) + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetworkInfos: + + /* handler: uj.NetworkInfos type=[]mesos.NetworkInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.NetworkInfos = nil + } else { + + uj.NetworkInfos = []NetworkInfo{} + + wantVal := true + + for { + + var tmp_uj__NetworkInfos NetworkInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__NetworkInfos type=mesos.NetworkInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__NetworkInfos.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.NetworkInfos = append(uj.NetworkInfos, tmp_uj__NetworkInfos) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CgroupInfo: + + /* handler: uj.CgroupInfo type=mesos.CgroupInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.CgroupInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.CgroupInfo == nil { + uj.CgroupInfo = new(CgroupInfo) + } + + err = uj.CgroupInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ExecutorPID: + + /* handler: uj.ExecutorPID type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ExecutorPID = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.ExecutorPID = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Credential) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Credential) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "principal":`) + fflib.WriteJsonString(buf, string(mj.Principal)) + buf.WriteByte(',') + if mj.Secret != nil { + if true { + buf.WriteString(`"secret":`) + fflib.WriteJsonString(buf, string(*mj.Secret)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Credentialbase = iota + ffj_t_Credentialno_such_key + + ffj_t_Credential_Principal + + ffj_t_Credential_Secret +) + +var ffj_key_Credential_Principal = []byte("principal") + +var ffj_key_Credential_Secret = []byte("secret") + +func (uj *Credential) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Credential) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Credentialbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Credentialno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_Credential_Principal, kn) { + currentKey = ffj_t_Credential_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Credential_Secret, kn) { + currentKey = ffj_t_Credential_Secret + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Credential_Secret, kn) { + currentKey = ffj_t_Credential_Secret + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Credential_Principal, kn) { + currentKey = ffj_t_Credential_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Credentialno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Credential_Principal: + goto handle_Principal + + case ffj_t_Credential_Secret: + goto handle_Secret + + case ffj_t_Credentialno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Principal: + + /* handler: uj.Principal type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Principal = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Secret: + + /* handler: uj.Secret type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Secret = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Secret = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Credentials) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Credentials) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"credentials":`) + if mj.Credentials != nil { + buf.WriteString(`[`) + for i, v := range mj.Credentials { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Credentialsbase = iota + ffj_t_Credentialsno_such_key + + ffj_t_Credentials_Credentials +) + +var ffj_key_Credentials_Credentials = []byte("credentials") + +func (uj *Credentials) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Credentials) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Credentialsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Credentialsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Credentials_Credentials, kn) { + currentKey = ffj_t_Credentials_Credentials + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Credentials_Credentials, kn) { + currentKey = ffj_t_Credentials_Credentials + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Credentialsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Credentials_Credentials: + goto handle_Credentials + + case ffj_t_Credentialsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Credentials: + + /* handler: uj.Credentials type=[]mesos.Credential kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Credentials = nil + } else { + + uj.Credentials = []Credential{} + + wantVal := true + + for { + + var tmp_uj__Credentials Credential + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Credentials type=mesos.Credential kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Credentials.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Credentials = append(uj.Credentials, tmp_uj__Credentials) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Device) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Device) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Path != nil { + if true { + buf.WriteString(`"path":`) + fflib.WriteJsonString(buf, string(*mj.Path)) + buf.WriteByte(',') + } + } + if mj.Number != nil { + if true { + buf.WriteString(`"number":`) + + { + + err = mj.Number.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Devicebase = iota + ffj_t_Deviceno_such_key + + ffj_t_Device_Path + + ffj_t_Device_Number +) + +var ffj_key_Device_Path = []byte("path") + +var ffj_key_Device_Number = []byte("number") + +func (uj *Device) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Device) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Devicebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Deviceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_Device_Number, kn) { + currentKey = ffj_t_Device_Number + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Device_Path, kn) { + currentKey = ffj_t_Device_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Device_Number, kn) { + currentKey = ffj_t_Device_Number + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Device_Path, kn) { + currentKey = ffj_t_Device_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Deviceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Device_Path: + goto handle_Path + + case ffj_t_Device_Number: + goto handle_Number + + case ffj_t_Deviceno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Path = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Path = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Number: + + /* handler: uj.Number type=mesos.Device_Number kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Number = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Number == nil { + uj.Number = new(Device_Number) + } + + err = uj.Number.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DeviceAccess) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DeviceAccess) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"device":`) + + { + + err = mj.Device.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"access":`) + + { + + err = mj.Access.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DeviceAccessbase = iota + ffj_t_DeviceAccessno_such_key + + ffj_t_DeviceAccess_Device + + ffj_t_DeviceAccess_Access +) + +var ffj_key_DeviceAccess_Device = []byte("device") + +var ffj_key_DeviceAccess_Access = []byte("access") + +func (uj *DeviceAccess) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DeviceAccess) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DeviceAccessbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DeviceAccessno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_DeviceAccess_Access, kn) { + currentKey = ffj_t_DeviceAccess_Access + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_DeviceAccess_Device, kn) { + currentKey = ffj_t_DeviceAccess_Device + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_DeviceAccess_Access, kn) { + currentKey = ffj_t_DeviceAccess_Access + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_DeviceAccess_Device, kn) { + currentKey = ffj_t_DeviceAccess_Device + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DeviceAccessno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DeviceAccess_Device: + goto handle_Device + + case ffj_t_DeviceAccess_Access: + goto handle_Access + + case ffj_t_DeviceAccessno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Device: + + /* handler: uj.Device type=mesos.Device kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Device.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Access: + + /* handler: uj.Access type=mesos.DeviceAccess_Access kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Access.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DeviceAccess_Access) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DeviceAccess_Access) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Read != nil { + if true { + if *mj.Read { + buf.WriteString(`"read":true`) + } else { + buf.WriteString(`"read":false`) + } + buf.WriteByte(',') + } + } + if mj.Write != nil { + if true { + if *mj.Write { + buf.WriteString(`"write":true`) + } else { + buf.WriteString(`"write":false`) + } + buf.WriteByte(',') + } + } + if mj.Mknod != nil { + if true { + if *mj.Mknod { + buf.WriteString(`"mknod":true`) + } else { + buf.WriteString(`"mknod":false`) + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DeviceAccess_Accessbase = iota + ffj_t_DeviceAccess_Accessno_such_key + + ffj_t_DeviceAccess_Access_Read + + ffj_t_DeviceAccess_Access_Write + + ffj_t_DeviceAccess_Access_Mknod +) + +var ffj_key_DeviceAccess_Access_Read = []byte("read") + +var ffj_key_DeviceAccess_Access_Write = []byte("write") + +var ffj_key_DeviceAccess_Access_Mknod = []byte("mknod") + +func (uj *DeviceAccess_Access) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DeviceAccess_Access) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DeviceAccess_Accessbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DeviceAccess_Accessno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'm': + + if bytes.Equal(ffj_key_DeviceAccess_Access_Mknod, kn) { + currentKey = ffj_t_DeviceAccess_Access_Mknod + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_DeviceAccess_Access_Read, kn) { + currentKey = ffj_t_DeviceAccess_Access_Read + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffj_key_DeviceAccess_Access_Write, kn) { + currentKey = ffj_t_DeviceAccess_Access_Write + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_DeviceAccess_Access_Mknod, kn) { + currentKey = ffj_t_DeviceAccess_Access_Mknod + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_DeviceAccess_Access_Write, kn) { + currentKey = ffj_t_DeviceAccess_Access_Write + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_DeviceAccess_Access_Read, kn) { + currentKey = ffj_t_DeviceAccess_Access_Read + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DeviceAccess_Accessno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DeviceAccess_Access_Read: + goto handle_Read + + case ffj_t_DeviceAccess_Access_Write: + goto handle_Write + + case ffj_t_DeviceAccess_Access_Mknod: + goto handle_Mknod + + case ffj_t_DeviceAccess_Accessno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Read: + + /* handler: uj.Read type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Read = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Read = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Write: + + /* handler: uj.Write type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Write = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Write = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Mknod: + + /* handler: uj.Mknod type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Mknod = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Mknod = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DeviceWhitelist) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DeviceWhitelist) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"allowed_devices":`) + if mj.AllowedDevices != nil { + buf.WriteString(`[`) + for i, v := range mj.AllowedDevices { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DeviceWhitelistbase = iota + ffj_t_DeviceWhitelistno_such_key + + ffj_t_DeviceWhitelist_AllowedDevices +) + +var ffj_key_DeviceWhitelist_AllowedDevices = []byte("allowed_devices") + +func (uj *DeviceWhitelist) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DeviceWhitelist) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DeviceWhitelistbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DeviceWhitelistno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_DeviceWhitelist_AllowedDevices, kn) { + currentKey = ffj_t_DeviceWhitelist_AllowedDevices + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_DeviceWhitelist_AllowedDevices, kn) { + currentKey = ffj_t_DeviceWhitelist_AllowedDevices + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DeviceWhitelistno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DeviceWhitelist_AllowedDevices: + goto handle_AllowedDevices + + case ffj_t_DeviceWhitelistno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_AllowedDevices: + + /* handler: uj.AllowedDevices type=[]mesos.DeviceAccess kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.AllowedDevices = nil + } else { + + uj.AllowedDevices = []DeviceAccess{} + + wantVal := true + + for { + + var tmp_uj__AllowedDevices DeviceAccess + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__AllowedDevices type=mesos.DeviceAccess kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__AllowedDevices.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.AllowedDevices = append(uj.AllowedDevices, tmp_uj__AllowedDevices) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Device_Number) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Device_Number) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.MajorNumber != nil { + if true { + buf.WriteString(`"major_number":`) + fflib.FormatBits2(buf, uint64(*mj.MajorNumber), 10, false) + buf.WriteByte(',') + } + } + if mj.MinorNumber != nil { + if true { + buf.WriteString(`"minor_number":`) + fflib.FormatBits2(buf, uint64(*mj.MinorNumber), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Device_Numberbase = iota + ffj_t_Device_Numberno_such_key + + ffj_t_Device_Number_MajorNumber + + ffj_t_Device_Number_MinorNumber +) + +var ffj_key_Device_Number_MajorNumber = []byte("major_number") + +var ffj_key_Device_Number_MinorNumber = []byte("minor_number") + +func (uj *Device_Number) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Device_Number) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Device_Numberbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Device_Numberno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'm': + + if bytes.Equal(ffj_key_Device_Number_MajorNumber, kn) { + currentKey = ffj_t_Device_Number_MajorNumber + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Device_Number_MinorNumber, kn) { + currentKey = ffj_t_Device_Number_MinorNumber + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Device_Number_MinorNumber, kn) { + currentKey = ffj_t_Device_Number_MinorNumber + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Device_Number_MajorNumber, kn) { + currentKey = ffj_t_Device_Number_MajorNumber + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Device_Numberno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Device_Number_MajorNumber: + goto handle_MajorNumber + + case ffj_t_Device_Number_MinorNumber: + goto handle_MinorNumber + + case ffj_t_Device_Numberno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_MajorNumber: + + /* handler: uj.MajorNumber type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MajorNumber = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MajorNumber = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MinorNumber: + + /* handler: uj.MinorNumber type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MinorNumber = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MinorNumber = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DiscoveryInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DiscoveryInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "visibility":`) + + { + + obj, err = mj.Visibility.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Name != nil { + if true { + buf.WriteString(`"name":`) + fflib.WriteJsonString(buf, string(*mj.Name)) + buf.WriteByte(',') + } + } + if mj.Environment != nil { + if true { + buf.WriteString(`"environment":`) + fflib.WriteJsonString(buf, string(*mj.Environment)) + buf.WriteByte(',') + } + } + if mj.Location != nil { + if true { + buf.WriteString(`"location":`) + fflib.WriteJsonString(buf, string(*mj.Location)) + buf.WriteByte(',') + } + } + if mj.Version != nil { + if true { + buf.WriteString(`"version":`) + fflib.WriteJsonString(buf, string(*mj.Version)) + buf.WriteByte(',') + } + } + if mj.Ports != nil { + if true { + buf.WriteString(`"ports":`) + + { + + err = mj.Ports.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DiscoveryInfobase = iota + ffj_t_DiscoveryInfono_such_key + + ffj_t_DiscoveryInfo_Visibility + + ffj_t_DiscoveryInfo_Name + + ffj_t_DiscoveryInfo_Environment + + ffj_t_DiscoveryInfo_Location + + ffj_t_DiscoveryInfo_Version + + ffj_t_DiscoveryInfo_Ports + + ffj_t_DiscoveryInfo_Labels +) + +var ffj_key_DiscoveryInfo_Visibility = []byte("visibility") + +var ffj_key_DiscoveryInfo_Name = []byte("name") + +var ffj_key_DiscoveryInfo_Environment = []byte("environment") + +var ffj_key_DiscoveryInfo_Location = []byte("location") + +var ffj_key_DiscoveryInfo_Version = []byte("version") + +var ffj_key_DiscoveryInfo_Ports = []byte("ports") + +var ffj_key_DiscoveryInfo_Labels = []byte("labels") + +func (uj *DiscoveryInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DiscoveryInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DiscoveryInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DiscoveryInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_DiscoveryInfo_Environment, kn) { + currentKey = ffj_t_DiscoveryInfo_Environment + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_DiscoveryInfo_Location, kn) { + currentKey = ffj_t_DiscoveryInfo_Location + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_DiscoveryInfo_Labels, kn) { + currentKey = ffj_t_DiscoveryInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_DiscoveryInfo_Name, kn) { + currentKey = ffj_t_DiscoveryInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_DiscoveryInfo_Ports, kn) { + currentKey = ffj_t_DiscoveryInfo_Ports + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_DiscoveryInfo_Visibility, kn) { + currentKey = ffj_t_DiscoveryInfo_Visibility + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_DiscoveryInfo_Version, kn) { + currentKey = ffj_t_DiscoveryInfo_Version + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_DiscoveryInfo_Labels, kn) { + currentKey = ffj_t_DiscoveryInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_DiscoveryInfo_Ports, kn) { + currentKey = ffj_t_DiscoveryInfo_Ports + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_DiscoveryInfo_Version, kn) { + currentKey = ffj_t_DiscoveryInfo_Version + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_DiscoveryInfo_Location, kn) { + currentKey = ffj_t_DiscoveryInfo_Location + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_DiscoveryInfo_Environment, kn) { + currentKey = ffj_t_DiscoveryInfo_Environment + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_DiscoveryInfo_Name, kn) { + currentKey = ffj_t_DiscoveryInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_DiscoveryInfo_Visibility, kn) { + currentKey = ffj_t_DiscoveryInfo_Visibility + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DiscoveryInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DiscoveryInfo_Visibility: + goto handle_Visibility + + case ffj_t_DiscoveryInfo_Name: + goto handle_Name + + case ffj_t_DiscoveryInfo_Environment: + goto handle_Environment + + case ffj_t_DiscoveryInfo_Location: + goto handle_Location + + case ffj_t_DiscoveryInfo_Version: + goto handle_Version + + case ffj_t_DiscoveryInfo_Ports: + goto handle_Ports + + case ffj_t_DiscoveryInfo_Labels: + goto handle_Labels + + case ffj_t_DiscoveryInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Visibility: + + /* handler: uj.Visibility type=mesos.DiscoveryInfo_Visibility kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Visibility.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Name = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Name = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Environment: + + /* handler: uj.Environment type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Environment = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Environment = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Location: + + /* handler: uj.Location type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Location = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Location = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Version: + + /* handler: uj.Version type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Version = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Version = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Ports: + + /* handler: uj.Ports type=mesos.Ports kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Ports = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Ports == nil { + uj.Ports = new(Ports) + } + + err = uj.Ports.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DiskStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DiskStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Source != nil { + if true { + buf.WriteString(`"source":`) + + { + + err = mj.Source.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Persistence != nil { + if true { + buf.WriteString(`"persistence":`) + + { + + err = mj.Persistence.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.LimitBytes != nil { + if true { + buf.WriteString(`"limit_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.LimitBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.UsedBytes != nil { + if true { + buf.WriteString(`"used_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.UsedBytes), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DiskStatisticsbase = iota + ffj_t_DiskStatisticsno_such_key + + ffj_t_DiskStatistics_Source + + ffj_t_DiskStatistics_Persistence + + ffj_t_DiskStatistics_LimitBytes + + ffj_t_DiskStatistics_UsedBytes +) + +var ffj_key_DiskStatistics_Source = []byte("source") + +var ffj_key_DiskStatistics_Persistence = []byte("persistence") + +var ffj_key_DiskStatistics_LimitBytes = []byte("limit_bytes") + +var ffj_key_DiskStatistics_UsedBytes = []byte("used_bytes") + +func (uj *DiskStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DiskStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DiskStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DiskStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'l': + + if bytes.Equal(ffj_key_DiskStatistics_LimitBytes, kn) { + currentKey = ffj_t_DiskStatistics_LimitBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_DiskStatistics_Persistence, kn) { + currentKey = ffj_t_DiskStatistics_Persistence + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_DiskStatistics_Source, kn) { + currentKey = ffj_t_DiskStatistics_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_DiskStatistics_UsedBytes, kn) { + currentKey = ffj_t_DiskStatistics_UsedBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_DiskStatistics_UsedBytes, kn) { + currentKey = ffj_t_DiskStatistics_UsedBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_DiskStatistics_LimitBytes, kn) { + currentKey = ffj_t_DiskStatistics_LimitBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_DiskStatistics_Persistence, kn) { + currentKey = ffj_t_DiskStatistics_Persistence + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_DiskStatistics_Source, kn) { + currentKey = ffj_t_DiskStatistics_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DiskStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DiskStatistics_Source: + goto handle_Source + + case ffj_t_DiskStatistics_Persistence: + goto handle_Persistence + + case ffj_t_DiskStatistics_LimitBytes: + goto handle_LimitBytes + + case ffj_t_DiskStatistics_UsedBytes: + goto handle_UsedBytes + + case ffj_t_DiskStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Source: + + /* handler: uj.Source type=mesos.Resource_DiskInfo_Source kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Source = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Source == nil { + uj.Source = new(Resource_DiskInfo_Source) + } + + err = uj.Source.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Persistence: + + /* handler: uj.Persistence type=mesos.Resource_DiskInfo_Persistence kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Persistence = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Persistence == nil { + uj.Persistence = new(Resource_DiskInfo_Persistence) + } + + err = uj.Persistence.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LimitBytes: + + /* handler: uj.LimitBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.LimitBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.LimitBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UsedBytes: + + /* handler: uj.UsedBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.UsedBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.UsedBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DomainInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DomainInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.FaultDomain != nil { + if true { + buf.WriteString(`"fault_domain":`) + + { + + err = mj.FaultDomain.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DomainInfobase = iota + ffj_t_DomainInfono_such_key + + ffj_t_DomainInfo_FaultDomain +) + +var ffj_key_DomainInfo_FaultDomain = []byte("fault_domain") + +func (uj *DomainInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DomainInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DomainInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DomainInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'f': + + if bytes.Equal(ffj_key_DomainInfo_FaultDomain, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_DomainInfo_FaultDomain, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DomainInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DomainInfo_FaultDomain: + goto handle_FaultDomain + + case ffj_t_DomainInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_FaultDomain: + + /* handler: uj.FaultDomain type=mesos.DomainInfo_FaultDomain kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.FaultDomain = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.FaultDomain == nil { + uj.FaultDomain = new(DomainInfo_FaultDomain) + } + + err = uj.FaultDomain.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DomainInfo_FaultDomain) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DomainInfo_FaultDomain) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"region":`) + + { + + err = mj.Region.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"zone":`) + + { + + err = mj.Zone.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DomainInfo_FaultDomainbase = iota + ffj_t_DomainInfo_FaultDomainno_such_key + + ffj_t_DomainInfo_FaultDomain_Region + + ffj_t_DomainInfo_FaultDomain_Zone +) + +var ffj_key_DomainInfo_FaultDomain_Region = []byte("region") + +var ffj_key_DomainInfo_FaultDomain_Zone = []byte("zone") + +func (uj *DomainInfo_FaultDomain) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DomainInfo_FaultDomain) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DomainInfo_FaultDomainbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DomainInfo_FaultDomainno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_DomainInfo_FaultDomain_Region, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_Region + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'z': + + if bytes.Equal(ffj_key_DomainInfo_FaultDomain_Zone, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_Zone + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_DomainInfo_FaultDomain_Zone, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_Zone + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_DomainInfo_FaultDomain_Region, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_Region + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DomainInfo_FaultDomainno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DomainInfo_FaultDomain_Region: + goto handle_Region + + case ffj_t_DomainInfo_FaultDomain_Zone: + goto handle_Zone + + case ffj_t_DomainInfo_FaultDomainno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Region: + + /* handler: uj.Region type=mesos.DomainInfo_FaultDomain_RegionInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Region.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Zone: + + /* handler: uj.Zone type=mesos.DomainInfo_FaultDomain_ZoneInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Zone.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DomainInfo_FaultDomain_RegionInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DomainInfo_FaultDomain_RegionInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DomainInfo_FaultDomain_RegionInfobase = iota + ffj_t_DomainInfo_FaultDomain_RegionInfono_such_key + + ffj_t_DomainInfo_FaultDomain_RegionInfo_Name +) + +var ffj_key_DomainInfo_FaultDomain_RegionInfo_Name = []byte("name") + +func (uj *DomainInfo_FaultDomain_RegionInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DomainInfo_FaultDomain_RegionInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DomainInfo_FaultDomain_RegionInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DomainInfo_FaultDomain_RegionInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_DomainInfo_FaultDomain_RegionInfo_Name, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_RegionInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_DomainInfo_FaultDomain_RegionInfo_Name, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_RegionInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DomainInfo_FaultDomain_RegionInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DomainInfo_FaultDomain_RegionInfo_Name: + goto handle_Name + + case ffj_t_DomainInfo_FaultDomain_RegionInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DomainInfo_FaultDomain_ZoneInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DomainInfo_FaultDomain_ZoneInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DomainInfo_FaultDomain_ZoneInfobase = iota + ffj_t_DomainInfo_FaultDomain_ZoneInfono_such_key + + ffj_t_DomainInfo_FaultDomain_ZoneInfo_Name +) + +var ffj_key_DomainInfo_FaultDomain_ZoneInfo_Name = []byte("name") + +func (uj *DomainInfo_FaultDomain_ZoneInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DomainInfo_FaultDomain_ZoneInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DomainInfo_FaultDomain_ZoneInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DomainInfo_FaultDomain_ZoneInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_DomainInfo_FaultDomain_ZoneInfo_Name, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_ZoneInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_DomainInfo_FaultDomain_ZoneInfo_Name, kn) { + currentKey = ffj_t_DomainInfo_FaultDomain_ZoneInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DomainInfo_FaultDomain_ZoneInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DomainInfo_FaultDomain_ZoneInfo_Name: + goto handle_Name + + case ffj_t_DomainInfo_FaultDomain_ZoneInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *DurationInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *DurationInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"nanoseconds":`) + fflib.FormatBits2(buf, uint64(mj.Nanoseconds), 10, mj.Nanoseconds < 0) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_DurationInfobase = iota + ffj_t_DurationInfono_such_key + + ffj_t_DurationInfo_Nanoseconds +) + +var ffj_key_DurationInfo_Nanoseconds = []byte("nanoseconds") + +func (uj *DurationInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *DurationInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_DurationInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_DurationInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_DurationInfo_Nanoseconds, kn) { + currentKey = ffj_t_DurationInfo_Nanoseconds + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_DurationInfo_Nanoseconds, kn) { + currentKey = ffj_t_DurationInfo_Nanoseconds + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_DurationInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_DurationInfo_Nanoseconds: + goto handle_Nanoseconds + + case ffj_t_DurationInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Nanoseconds: + + /* handler: uj.Nanoseconds type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Nanoseconds = int64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Environment) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Environment) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"variables":`) + if mj.Variables != nil { + buf.WriteString(`[`) + for i, v := range mj.Variables { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Environmentbase = iota + ffj_t_Environmentno_such_key + + ffj_t_Environment_Variables +) + +var ffj_key_Environment_Variables = []byte("variables") + +func (uj *Environment) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Environment) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Environmentbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Environmentno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_Environment_Variables, kn) { + currentKey = ffj_t_Environment_Variables + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Environment_Variables, kn) { + currentKey = ffj_t_Environment_Variables + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Environmentno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Environment_Variables: + goto handle_Variables + + case ffj_t_Environmentno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Variables: + + /* handler: uj.Variables type=[]mesos.Environment_Variable kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Variables = nil + } else { + + uj.Variables = []Environment_Variable{} + + wantVal := true + + for { + + var tmp_uj__Variables Environment_Variable + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Variables type=mesos.Environment_Variable kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Variables.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Variables = append(uj.Variables, tmp_uj__Variables) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Environment_Variable) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Environment_Variable) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.Type != nil { + if true { + buf.WriteString(`"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Value != nil { + if true { + buf.WriteString(`"value":`) + fflib.WriteJsonString(buf, string(*mj.Value)) + buf.WriteByte(',') + } + } + if mj.Secret != nil { + if true { + buf.WriteString(`"secret":`) + + { + + err = mj.Secret.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Environment_Variablebase = iota + ffj_t_Environment_Variableno_such_key + + ffj_t_Environment_Variable_Name + + ffj_t_Environment_Variable_Type + + ffj_t_Environment_Variable_Value + + ffj_t_Environment_Variable_Secret +) + +var ffj_key_Environment_Variable_Name = []byte("name") + +var ffj_key_Environment_Variable_Type = []byte("type") + +var ffj_key_Environment_Variable_Value = []byte("value") + +var ffj_key_Environment_Variable_Secret = []byte("secret") + +func (uj *Environment_Variable) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Environment_Variable) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Environment_Variablebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Environment_Variableno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_Environment_Variable_Name, kn) { + currentKey = ffj_t_Environment_Variable_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Environment_Variable_Secret, kn) { + currentKey = ffj_t_Environment_Variable_Secret + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Environment_Variable_Type, kn) { + currentKey = ffj_t_Environment_Variable_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Environment_Variable_Value, kn) { + currentKey = ffj_t_Environment_Variable_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Environment_Variable_Secret, kn) { + currentKey = ffj_t_Environment_Variable_Secret + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Environment_Variable_Value, kn) { + currentKey = ffj_t_Environment_Variable_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Environment_Variable_Type, kn) { + currentKey = ffj_t_Environment_Variable_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Environment_Variable_Name, kn) { + currentKey = ffj_t_Environment_Variable_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Environment_Variableno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Environment_Variable_Name: + goto handle_Name + + case ffj_t_Environment_Variable_Type: + goto handle_Type + + case ffj_t_Environment_Variable_Value: + goto handle_Value + + case ffj_t_Environment_Variable_Secret: + goto handle_Secret + + case ffj_t_Environment_Variableno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Type: + + /* handler: uj.Type type=mesos.Environment_Variable_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Type = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Type == nil { + uj.Type = new(Environment_Variable_Type) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Value = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Value = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Secret: + + /* handler: uj.Secret type=mesos.Secret kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Secret = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Secret == nil { + uj.Secret = new(Secret) + } + + err = uj.Secret.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ExecutorID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ExecutorID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ExecutorIDbase = iota + ffj_t_ExecutorIDno_such_key + + ffj_t_ExecutorID_Value +) + +var ffj_key_ExecutorID_Value = []byte("value") + +func (uj *ExecutorID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ExecutorID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ExecutorIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ExecutorIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_ExecutorID_Value, kn) { + currentKey = ffj_t_ExecutorID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ExecutorID_Value, kn) { + currentKey = ffj_t_ExecutorID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ExecutorIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ExecutorID_Value: + goto handle_Value + + case ffj_t_ExecutorIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ExecutorInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ExecutorInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteString(`,"executor_id":`) + + { + + err = mj.ExecutorID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.FrameworkID != nil { + if true { + buf.WriteString(`"framework_id":`) + + { + + err = mj.FrameworkID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Container != nil { + if true { + buf.WriteString(`"container":`) + + { + + err = mj.Container.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Name != nil { + if true { + buf.WriteString(`"name":`) + fflib.WriteJsonString(buf, string(*mj.Name)) + buf.WriteByte(',') + } + } + if mj.Source != nil { + if true { + buf.WriteString(`"source":`) + fflib.WriteJsonString(buf, string(*mj.Source)) + buf.WriteByte(',') + } + } + if len(mj.Data) != 0 { + buf.WriteString(`"data":`) + if mj.Data != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.Data)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.Discovery != nil { + if true { + buf.WriteString(`"discovery":`) + + { + + err = mj.Discovery.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ShutdownGracePeriod != nil { + if true { + buf.WriteString(`"shutdown_grace_period":`) + + { + + err = mj.ShutdownGracePeriod.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ExecutorInfobase = iota + ffj_t_ExecutorInfono_such_key + + ffj_t_ExecutorInfo_Type + + ffj_t_ExecutorInfo_ExecutorID + + ffj_t_ExecutorInfo_FrameworkID + + ffj_t_ExecutorInfo_Command + + ffj_t_ExecutorInfo_Container + + ffj_t_ExecutorInfo_Resources + + ffj_t_ExecutorInfo_Name + + ffj_t_ExecutorInfo_Source + + ffj_t_ExecutorInfo_Data + + ffj_t_ExecutorInfo_Discovery + + ffj_t_ExecutorInfo_ShutdownGracePeriod + + ffj_t_ExecutorInfo_Labels +) + +var ffj_key_ExecutorInfo_Type = []byte("type") + +var ffj_key_ExecutorInfo_ExecutorID = []byte("executor_id") + +var ffj_key_ExecutorInfo_FrameworkID = []byte("framework_id") + +var ffj_key_ExecutorInfo_Command = []byte("command") + +var ffj_key_ExecutorInfo_Container = []byte("container") + +var ffj_key_ExecutorInfo_Resources = []byte("resources") + +var ffj_key_ExecutorInfo_Name = []byte("name") + +var ffj_key_ExecutorInfo_Source = []byte("source") + +var ffj_key_ExecutorInfo_Data = []byte("data") + +var ffj_key_ExecutorInfo_Discovery = []byte("discovery") + +var ffj_key_ExecutorInfo_ShutdownGracePeriod = []byte("shutdown_grace_period") + +var ffj_key_ExecutorInfo_Labels = []byte("labels") + +func (uj *ExecutorInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ExecutorInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ExecutorInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ExecutorInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_ExecutorInfo_Command, kn) { + currentKey = ffj_t_ExecutorInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ExecutorInfo_Container, kn) { + currentKey = ffj_t_ExecutorInfo_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_ExecutorInfo_Data, kn) { + currentKey = ffj_t_ExecutorInfo_Data + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ExecutorInfo_Discovery, kn) { + currentKey = ffj_t_ExecutorInfo_Discovery + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_ExecutorInfo_ExecutorID, kn) { + currentKey = ffj_t_ExecutorInfo_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_ExecutorInfo_FrameworkID, kn) { + currentKey = ffj_t_ExecutorInfo_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_ExecutorInfo_Labels, kn) { + currentKey = ffj_t_ExecutorInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_ExecutorInfo_Name, kn) { + currentKey = ffj_t_ExecutorInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_ExecutorInfo_Resources, kn) { + currentKey = ffj_t_ExecutorInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_ExecutorInfo_Source, kn) { + currentKey = ffj_t_ExecutorInfo_Source + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ExecutorInfo_ShutdownGracePeriod, kn) { + currentKey = ffj_t_ExecutorInfo_ShutdownGracePeriod + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ExecutorInfo_Type, kn) { + currentKey = ffj_t_ExecutorInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_ExecutorInfo_Labels, kn) { + currentKey = ffj_t_ExecutorInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ExecutorInfo_ShutdownGracePeriod, kn) { + currentKey = ffj_t_ExecutorInfo_ShutdownGracePeriod + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ExecutorInfo_Discovery, kn) { + currentKey = ffj_t_ExecutorInfo_Discovery + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ExecutorInfo_Data, kn) { + currentKey = ffj_t_ExecutorInfo_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ExecutorInfo_Source, kn) { + currentKey = ffj_t_ExecutorInfo_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ExecutorInfo_Name, kn) { + currentKey = ffj_t_ExecutorInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ExecutorInfo_Resources, kn) { + currentKey = ffj_t_ExecutorInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ExecutorInfo_Container, kn) { + currentKey = ffj_t_ExecutorInfo_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ExecutorInfo_Command, kn) { + currentKey = ffj_t_ExecutorInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ExecutorInfo_FrameworkID, kn) { + currentKey = ffj_t_ExecutorInfo_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ExecutorInfo_ExecutorID, kn) { + currentKey = ffj_t_ExecutorInfo_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ExecutorInfo_Type, kn) { + currentKey = ffj_t_ExecutorInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ExecutorInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ExecutorInfo_Type: + goto handle_Type + + case ffj_t_ExecutorInfo_ExecutorID: + goto handle_ExecutorID + + case ffj_t_ExecutorInfo_FrameworkID: + goto handle_FrameworkID + + case ffj_t_ExecutorInfo_Command: + goto handle_Command + + case ffj_t_ExecutorInfo_Container: + goto handle_Container + + case ffj_t_ExecutorInfo_Resources: + goto handle_Resources + + case ffj_t_ExecutorInfo_Name: + goto handle_Name + + case ffj_t_ExecutorInfo_Source: + goto handle_Source + + case ffj_t_ExecutorInfo_Data: + goto handle_Data + + case ffj_t_ExecutorInfo_Discovery: + goto handle_Discovery + + case ffj_t_ExecutorInfo_ShutdownGracePeriod: + goto handle_ShutdownGracePeriod + + case ffj_t_ExecutorInfo_Labels: + goto handle_Labels + + case ffj_t_ExecutorInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.ExecutorInfo_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ExecutorID: + + /* handler: uj.ExecutorID type=mesos.ExecutorID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ExecutorID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FrameworkID: + + /* handler: uj.FrameworkID type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.FrameworkID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.FrameworkID == nil { + uj.FrameworkID = new(FrameworkID) + } + + err = uj.FrameworkID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(CommandInfo) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Container: + + /* handler: uj.Container type=mesos.ContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Container = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Container == nil { + uj.Container = new(ContainerInfo) + } + + err = uj.Container.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Name = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Name = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Source: + + /* handler: uj.Source type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Source = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Source = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Data: + + /* handler: uj.Data type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Data = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.Data).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Discovery: + + /* handler: uj.Discovery type=mesos.DiscoveryInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Discovery = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Discovery == nil { + uj.Discovery = new(DiscoveryInfo) + } + + err = uj.Discovery.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ShutdownGracePeriod: + + /* handler: uj.ShutdownGracePeriod type=mesos.DurationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ShutdownGracePeriod = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ShutdownGracePeriod == nil { + uj.ShutdownGracePeriod = new(DurationInfo) + } + + err = uj.ShutdownGracePeriod.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *FileInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *FileInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "path":`) + fflib.WriteJsonString(buf, string(mj.Path)) + buf.WriteByte(',') + if mj.Nlink != nil { + if true { + buf.WriteString(`"nlink":`) + fflib.FormatBits2(buf, uint64(*mj.Nlink), 10, *mj.Nlink < 0) + buf.WriteByte(',') + } + } + if mj.Size != nil { + if true { + buf.WriteString(`"size":`) + fflib.FormatBits2(buf, uint64(*mj.Size), 10, false) + buf.WriteByte(',') + } + } + if mj.Mtime != nil { + if true { + buf.WriteString(`"mtime":`) + + { + + err = mj.Mtime.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Mode != nil { + if true { + buf.WriteString(`"mode":`) + fflib.FormatBits2(buf, uint64(*mj.Mode), 10, false) + buf.WriteByte(',') + } + } + if mj.UID != nil { + if true { + buf.WriteString(`"uid":`) + fflib.WriteJsonString(buf, string(*mj.UID)) + buf.WriteByte(',') + } + } + if mj.GID != nil { + if true { + buf.WriteString(`"gid":`) + fflib.WriteJsonString(buf, string(*mj.GID)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_FileInfobase = iota + ffj_t_FileInfono_such_key + + ffj_t_FileInfo_Path + + ffj_t_FileInfo_Nlink + + ffj_t_FileInfo_Size + + ffj_t_FileInfo_Mtime + + ffj_t_FileInfo_Mode + + ffj_t_FileInfo_UID + + ffj_t_FileInfo_GID +) + +var ffj_key_FileInfo_Path = []byte("path") + +var ffj_key_FileInfo_Nlink = []byte("nlink") + +var ffj_key_FileInfo_Size = []byte("size") + +var ffj_key_FileInfo_Mtime = []byte("mtime") + +var ffj_key_FileInfo_Mode = []byte("mode") + +var ffj_key_FileInfo_UID = []byte("uid") + +var ffj_key_FileInfo_GID = []byte("gid") + +func (uj *FileInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *FileInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_FileInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_FileInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'g': + + if bytes.Equal(ffj_key_FileInfo_GID, kn) { + currentKey = ffj_t_FileInfo_GID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_FileInfo_Mtime, kn) { + currentKey = ffj_t_FileInfo_Mtime + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_FileInfo_Mode, kn) { + currentKey = ffj_t_FileInfo_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_FileInfo_Nlink, kn) { + currentKey = ffj_t_FileInfo_Nlink + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_FileInfo_Path, kn) { + currentKey = ffj_t_FileInfo_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_FileInfo_Size, kn) { + currentKey = ffj_t_FileInfo_Size + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_FileInfo_UID, kn) { + currentKey = ffj_t_FileInfo_UID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_FileInfo_GID, kn) { + currentKey = ffj_t_FileInfo_GID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FileInfo_UID, kn) { + currentKey = ffj_t_FileInfo_UID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FileInfo_Mode, kn) { + currentKey = ffj_t_FileInfo_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FileInfo_Mtime, kn) { + currentKey = ffj_t_FileInfo_Mtime + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_FileInfo_Size, kn) { + currentKey = ffj_t_FileInfo_Size + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_FileInfo_Nlink, kn) { + currentKey = ffj_t_FileInfo_Nlink + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FileInfo_Path, kn) { + currentKey = ffj_t_FileInfo_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_FileInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_FileInfo_Path: + goto handle_Path + + case ffj_t_FileInfo_Nlink: + goto handle_Nlink + + case ffj_t_FileInfo_Size: + goto handle_Size + + case ffj_t_FileInfo_Mtime: + goto handle_Mtime + + case ffj_t_FileInfo_Mode: + goto handle_Mode + + case ffj_t_FileInfo_UID: + goto handle_UID + + case ffj_t_FileInfo_GID: + goto handle_GID + + case ffj_t_FileInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Path = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Nlink: + + /* handler: uj.Nlink type=int32 kind=int32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Nlink = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int32(tval) + uj.Nlink = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Size: + + /* handler: uj.Size type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Size = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Size = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Mtime: + + /* handler: uj.Mtime type=mesos.TimeInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Mtime = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Mtime == nil { + uj.Mtime = new(TimeInfo) + } + + err = uj.Mtime.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Mode: + + /* handler: uj.Mode type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Mode = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.Mode = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UID: + + /* handler: uj.UID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.UID = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.UID = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GID: + + /* handler: uj.GID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.GID = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.GID = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Filters) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Filters) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.RefuseSeconds != nil { + if true { + buf.WriteString(`"refuse_seconds":`) + fflib.AppendFloat(buf, float64(*mj.RefuseSeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Filtersbase = iota + ffj_t_Filtersno_such_key + + ffj_t_Filters_RefuseSeconds +) + +var ffj_key_Filters_RefuseSeconds = []byte("refuse_seconds") + +func (uj *Filters) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Filters) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Filtersbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Filtersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Filters_RefuseSeconds, kn) { + currentKey = ffj_t_Filters_RefuseSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Filters_RefuseSeconds, kn) { + currentKey = ffj_t_Filters_RefuseSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Filtersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Filters_RefuseSeconds: + goto handle_RefuseSeconds + + case ffj_t_Filtersno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_RefuseSeconds: + + /* handler: uj.RefuseSeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RefuseSeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.RefuseSeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Flag) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Flag) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.Value != nil { + if true { + buf.WriteString(`"value":`) + fflib.WriteJsonString(buf, string(*mj.Value)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Flagbase = iota + ffj_t_Flagno_such_key + + ffj_t_Flag_Name + + ffj_t_Flag_Value +) + +var ffj_key_Flag_Name = []byte("name") + +var ffj_key_Flag_Value = []byte("value") + +func (uj *Flag) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Flag) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Flagbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Flagno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_Flag_Name, kn) { + currentKey = ffj_t_Flag_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Flag_Value, kn) { + currentKey = ffj_t_Flag_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Flag_Value, kn) { + currentKey = ffj_t_Flag_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Flag_Name, kn) { + currentKey = ffj_t_Flag_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Flagno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Flag_Name: + goto handle_Name + + case ffj_t_Flag_Value: + goto handle_Value + + case ffj_t_Flagno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Value = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Value = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *FrameworkID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *FrameworkID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_FrameworkIDbase = iota + ffj_t_FrameworkIDno_such_key + + ffj_t_FrameworkID_Value +) + +var ffj_key_FrameworkID_Value = []byte("value") + +func (uj *FrameworkID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *FrameworkID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_FrameworkIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_FrameworkIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_FrameworkID_Value, kn) { + currentKey = ffj_t_FrameworkID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_FrameworkID_Value, kn) { + currentKey = ffj_t_FrameworkID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_FrameworkIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_FrameworkID_Value: + goto handle_Value + + case ffj_t_FrameworkIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *FrameworkInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *FrameworkInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "user":`) + fflib.WriteJsonString(buf, string(mj.User)) + buf.WriteString(`,"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.ID != nil { + if true { + buf.WriteString(`"id":`) + + { + + err = mj.ID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.FailoverTimeout != nil { + if true { + buf.WriteString(`"failover_timeout":`) + fflib.AppendFloat(buf, float64(*mj.FailoverTimeout), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.Checkpoint != nil { + if true { + if *mj.Checkpoint { + buf.WriteString(`"checkpoint":true`) + } else { + buf.WriteString(`"checkpoint":false`) + } + buf.WriteByte(',') + } + } + if mj.Role != nil { + if true { + buf.WriteString(`"role":`) + fflib.WriteJsonString(buf, string(*mj.Role)) + buf.WriteByte(',') + } + } + if len(mj.Roles) != 0 { + buf.WriteString(`"roles":`) + if mj.Roles != nil { + buf.WriteString(`[`) + for i, v := range mj.Roles { + if i != 0 { + buf.WriteString(`,`) + } + fflib.WriteJsonString(buf, string(v)) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.Hostname != nil { + if true { + buf.WriteString(`"hostname":`) + fflib.WriteJsonString(buf, string(*mj.Hostname)) + buf.WriteByte(',') + } + } + if mj.Principal != nil { + if true { + buf.WriteString(`"principal":`) + fflib.WriteJsonString(buf, string(*mj.Principal)) + buf.WriteByte(',') + } + } + if mj.WebUiURL != nil { + if true { + buf.WriteString(`"webui_url":`) + fflib.WriteJsonString(buf, string(*mj.WebUiURL)) + buf.WriteByte(',') + } + } + buf.WriteString(`"capabilities":`) + if mj.Capabilities != nil { + buf.WriteString(`[`) + for i, v := range mj.Capabilities { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_FrameworkInfobase = iota + ffj_t_FrameworkInfono_such_key + + ffj_t_FrameworkInfo_User + + ffj_t_FrameworkInfo_Name + + ffj_t_FrameworkInfo_ID + + ffj_t_FrameworkInfo_FailoverTimeout + + ffj_t_FrameworkInfo_Checkpoint + + ffj_t_FrameworkInfo_Role + + ffj_t_FrameworkInfo_Roles + + ffj_t_FrameworkInfo_Hostname + + ffj_t_FrameworkInfo_Principal + + ffj_t_FrameworkInfo_WebUiURL + + ffj_t_FrameworkInfo_Capabilities + + ffj_t_FrameworkInfo_Labels +) + +var ffj_key_FrameworkInfo_User = []byte("user") + +var ffj_key_FrameworkInfo_Name = []byte("name") + +var ffj_key_FrameworkInfo_ID = []byte("id") + +var ffj_key_FrameworkInfo_FailoverTimeout = []byte("failover_timeout") + +var ffj_key_FrameworkInfo_Checkpoint = []byte("checkpoint") + +var ffj_key_FrameworkInfo_Role = []byte("role") + +var ffj_key_FrameworkInfo_Roles = []byte("roles") + +var ffj_key_FrameworkInfo_Hostname = []byte("hostname") + +var ffj_key_FrameworkInfo_Principal = []byte("principal") + +var ffj_key_FrameworkInfo_WebUiURL = []byte("webui_url") + +var ffj_key_FrameworkInfo_Capabilities = []byte("capabilities") + +var ffj_key_FrameworkInfo_Labels = []byte("labels") + +func (uj *FrameworkInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *FrameworkInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_FrameworkInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_FrameworkInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_FrameworkInfo_Checkpoint, kn) { + currentKey = ffj_t_FrameworkInfo_Checkpoint + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_FrameworkInfo_Capabilities, kn) { + currentKey = ffj_t_FrameworkInfo_Capabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_FrameworkInfo_FailoverTimeout, kn) { + currentKey = ffj_t_FrameworkInfo_FailoverTimeout + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_FrameworkInfo_Hostname, kn) { + currentKey = ffj_t_FrameworkInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_FrameworkInfo_ID, kn) { + currentKey = ffj_t_FrameworkInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_FrameworkInfo_Labels, kn) { + currentKey = ffj_t_FrameworkInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_FrameworkInfo_Name, kn) { + currentKey = ffj_t_FrameworkInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_FrameworkInfo_Principal, kn) { + currentKey = ffj_t_FrameworkInfo_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_FrameworkInfo_Role, kn) { + currentKey = ffj_t_FrameworkInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_FrameworkInfo_Roles, kn) { + currentKey = ffj_t_FrameworkInfo_Roles + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_FrameworkInfo_User, kn) { + currentKey = ffj_t_FrameworkInfo_User + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffj_key_FrameworkInfo_WebUiURL, kn) { + currentKey = ffj_t_FrameworkInfo_WebUiURL + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_FrameworkInfo_Labels, kn) { + currentKey = ffj_t_FrameworkInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_FrameworkInfo_Capabilities, kn) { + currentKey = ffj_t_FrameworkInfo_Capabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_FrameworkInfo_WebUiURL, kn) { + currentKey = ffj_t_FrameworkInfo_WebUiURL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FrameworkInfo_Principal, kn) { + currentKey = ffj_t_FrameworkInfo_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_FrameworkInfo_Hostname, kn) { + currentKey = ffj_t_FrameworkInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_FrameworkInfo_Roles, kn) { + currentKey = ffj_t_FrameworkInfo_Roles + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FrameworkInfo_Role, kn) { + currentKey = ffj_t_FrameworkInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_FrameworkInfo_Checkpoint, kn) { + currentKey = ffj_t_FrameworkInfo_Checkpoint + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_FrameworkInfo_FailoverTimeout, kn) { + currentKey = ffj_t_FrameworkInfo_FailoverTimeout + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FrameworkInfo_ID, kn) { + currentKey = ffj_t_FrameworkInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_FrameworkInfo_Name, kn) { + currentKey = ffj_t_FrameworkInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_FrameworkInfo_User, kn) { + currentKey = ffj_t_FrameworkInfo_User + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_FrameworkInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_FrameworkInfo_User: + goto handle_User + + case ffj_t_FrameworkInfo_Name: + goto handle_Name + + case ffj_t_FrameworkInfo_ID: + goto handle_ID + + case ffj_t_FrameworkInfo_FailoverTimeout: + goto handle_FailoverTimeout + + case ffj_t_FrameworkInfo_Checkpoint: + goto handle_Checkpoint + + case ffj_t_FrameworkInfo_Role: + goto handle_Role + + case ffj_t_FrameworkInfo_Roles: + goto handle_Roles + + case ffj_t_FrameworkInfo_Hostname: + goto handle_Hostname + + case ffj_t_FrameworkInfo_Principal: + goto handle_Principal + + case ffj_t_FrameworkInfo_WebUiURL: + goto handle_WebUiURL + + case ffj_t_FrameworkInfo_Capabilities: + goto handle_Capabilities + + case ffj_t_FrameworkInfo_Labels: + goto handle_Labels + + case ffj_t_FrameworkInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_User: + + /* handler: uj.User type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.User = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ID == nil { + uj.ID = new(FrameworkID) + } + + err = uj.ID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FailoverTimeout: + + /* handler: uj.FailoverTimeout type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.FailoverTimeout = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.FailoverTimeout = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Checkpoint: + + /* handler: uj.Checkpoint type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Checkpoint = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Checkpoint = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Role: + + /* handler: uj.Role type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Role = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Role = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Roles: + + /* handler: uj.Roles type=[]string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Roles = nil + } else { + + uj.Roles = []string{} + + wantVal := true + + for { + + var tmp_uj__Roles string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Roles type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + tmp_uj__Roles = string(string(outBuf)) + + } + } + + uj.Roles = append(uj.Roles, tmp_uj__Roles) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Hostname: + + /* handler: uj.Hostname type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Hostname = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Hostname = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Principal: + + /* handler: uj.Principal type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Principal = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Principal = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_WebUiURL: + + /* handler: uj.WebUiURL type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.WebUiURL = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.WebUiURL = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Capabilities: + + /* handler: uj.Capabilities type=[]mesos.FrameworkInfo_Capability kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Capabilities = nil + } else { + + uj.Capabilities = []FrameworkInfo_Capability{} + + wantVal := true + + for { + + var tmp_uj__Capabilities FrameworkInfo_Capability + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Capabilities type=mesos.FrameworkInfo_Capability kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Capabilities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Capabilities = append(uj.Capabilities, tmp_uj__Capabilities) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *FrameworkInfo_Capability) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *FrameworkInfo_Capability) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_FrameworkInfo_Capabilitybase = iota + ffj_t_FrameworkInfo_Capabilityno_such_key + + ffj_t_FrameworkInfo_Capability_Type +) + +var ffj_key_FrameworkInfo_Capability_Type = []byte("type") + +func (uj *FrameworkInfo_Capability) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *FrameworkInfo_Capability) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_FrameworkInfo_Capabilitybase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_FrameworkInfo_Capabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 't': + + if bytes.Equal(ffj_key_FrameworkInfo_Capability_Type, kn) { + currentKey = ffj_t_FrameworkInfo_Capability_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_FrameworkInfo_Capability_Type, kn) { + currentKey = ffj_t_FrameworkInfo_Capability_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_FrameworkInfo_Capabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_FrameworkInfo_Capability_Type: + goto handle_Type + + case ffj_t_FrameworkInfo_Capabilityno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.FrameworkInfo_Capability_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *HealthCheck) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *HealthCheck) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.DelaySeconds != nil { + if true { + buf.WriteString(`"delay_seconds":`) + fflib.AppendFloat(buf, float64(*mj.DelaySeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.IntervalSeconds != nil { + if true { + buf.WriteString(`"interval_seconds":`) + fflib.AppendFloat(buf, float64(*mj.IntervalSeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.TimeoutSeconds != nil { + if true { + buf.WriteString(`"timeout_seconds":`) + fflib.AppendFloat(buf, float64(*mj.TimeoutSeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.ConsecutiveFailures != nil { + if true { + buf.WriteString(`"consecutive_failures":`) + fflib.FormatBits2(buf, uint64(*mj.ConsecutiveFailures), 10, false) + buf.WriteByte(',') + } + } + if mj.GracePeriodSeconds != nil { + if true { + buf.WriteString(`"grace_period_seconds":`) + fflib.AppendFloat(buf, float64(*mj.GracePeriodSeconds), 'g', -1, 64) + buf.WriteByte(',') + } + } + buf.WriteString(`"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.HTTP != nil { + if true { + buf.WriteString(`"http":`) + + { + + err = mj.HTTP.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.TCP != nil { + if true { + buf.WriteString(`"tcp":`) + + { + + err = mj.TCP.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_HealthCheckbase = iota + ffj_t_HealthCheckno_such_key + + ffj_t_HealthCheck_DelaySeconds + + ffj_t_HealthCheck_IntervalSeconds + + ffj_t_HealthCheck_TimeoutSeconds + + ffj_t_HealthCheck_ConsecutiveFailures + + ffj_t_HealthCheck_GracePeriodSeconds + + ffj_t_HealthCheck_Type + + ffj_t_HealthCheck_Command + + ffj_t_HealthCheck_HTTP + + ffj_t_HealthCheck_TCP +) + +var ffj_key_HealthCheck_DelaySeconds = []byte("delay_seconds") + +var ffj_key_HealthCheck_IntervalSeconds = []byte("interval_seconds") + +var ffj_key_HealthCheck_TimeoutSeconds = []byte("timeout_seconds") + +var ffj_key_HealthCheck_ConsecutiveFailures = []byte("consecutive_failures") + +var ffj_key_HealthCheck_GracePeriodSeconds = []byte("grace_period_seconds") + +var ffj_key_HealthCheck_Type = []byte("type") + +var ffj_key_HealthCheck_Command = []byte("command") + +var ffj_key_HealthCheck_HTTP = []byte("http") + +var ffj_key_HealthCheck_TCP = []byte("tcp") + +func (uj *HealthCheck) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *HealthCheck) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_HealthCheckbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_HealthCheckno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_HealthCheck_ConsecutiveFailures, kn) { + currentKey = ffj_t_HealthCheck_ConsecutiveFailures + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_HealthCheck_Command, kn) { + currentKey = ffj_t_HealthCheck_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_HealthCheck_DelaySeconds, kn) { + currentKey = ffj_t_HealthCheck_DelaySeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'g': + + if bytes.Equal(ffj_key_HealthCheck_GracePeriodSeconds, kn) { + currentKey = ffj_t_HealthCheck_GracePeriodSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_HealthCheck_HTTP, kn) { + currentKey = ffj_t_HealthCheck_HTTP + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_HealthCheck_IntervalSeconds, kn) { + currentKey = ffj_t_HealthCheck_IntervalSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_HealthCheck_TimeoutSeconds, kn) { + currentKey = ffj_t_HealthCheck_TimeoutSeconds + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_HealthCheck_Type, kn) { + currentKey = ffj_t_HealthCheck_Type + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_HealthCheck_TCP, kn) { + currentKey = ffj_t_HealthCheck_TCP + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_TCP, kn) { + currentKey = ffj_t_HealthCheck_TCP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_HTTP, kn) { + currentKey = ffj_t_HealthCheck_HTTP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_Command, kn) { + currentKey = ffj_t_HealthCheck_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_Type, kn) { + currentKey = ffj_t_HealthCheck_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_HealthCheck_GracePeriodSeconds, kn) { + currentKey = ffj_t_HealthCheck_GracePeriodSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_HealthCheck_ConsecutiveFailures, kn) { + currentKey = ffj_t_HealthCheck_ConsecutiveFailures + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_HealthCheck_TimeoutSeconds, kn) { + currentKey = ffj_t_HealthCheck_TimeoutSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_HealthCheck_IntervalSeconds, kn) { + currentKey = ffj_t_HealthCheck_IntervalSeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_HealthCheck_DelaySeconds, kn) { + currentKey = ffj_t_HealthCheck_DelaySeconds + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_HealthCheckno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_HealthCheck_DelaySeconds: + goto handle_DelaySeconds + + case ffj_t_HealthCheck_IntervalSeconds: + goto handle_IntervalSeconds + + case ffj_t_HealthCheck_TimeoutSeconds: + goto handle_TimeoutSeconds + + case ffj_t_HealthCheck_ConsecutiveFailures: + goto handle_ConsecutiveFailures + + case ffj_t_HealthCheck_GracePeriodSeconds: + goto handle_GracePeriodSeconds + + case ffj_t_HealthCheck_Type: + goto handle_Type + + case ffj_t_HealthCheck_Command: + goto handle_Command + + case ffj_t_HealthCheck_HTTP: + goto handle_HTTP + + case ffj_t_HealthCheck_TCP: + goto handle_TCP + + case ffj_t_HealthCheckno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_DelaySeconds: + + /* handler: uj.DelaySeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DelaySeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.DelaySeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IntervalSeconds: + + /* handler: uj.IntervalSeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.IntervalSeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.IntervalSeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TimeoutSeconds: + + /* handler: uj.TimeoutSeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.TimeoutSeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.TimeoutSeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ConsecutiveFailures: + + /* handler: uj.ConsecutiveFailures type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ConsecutiveFailures = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.ConsecutiveFailures = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GracePeriodSeconds: + + /* handler: uj.GracePeriodSeconds type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.GracePeriodSeconds = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.GracePeriodSeconds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Type: + + /* handler: uj.Type type=mesos.HealthCheck_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(CommandInfo) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_HTTP: + + /* handler: uj.HTTP type=mesos.HealthCheck_HTTPCheckInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.HTTP = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.HTTP == nil { + uj.HTTP = new(HealthCheck_HTTPCheckInfo) + } + + err = uj.HTTP.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TCP: + + /* handler: uj.TCP type=mesos.HealthCheck_TCPCheckInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.TCP = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.TCP == nil { + uj.TCP = new(HealthCheck_TCPCheckInfo) + } + + err = uj.TCP.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *HealthCheck_HTTPCheckInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *HealthCheck_HTTPCheckInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Protocol != nil { + if true { + buf.WriteString(`"protocol":`) + + { + + obj, err = mj.Protocol.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Scheme != nil { + if true { + buf.WriteString(`"scheme":`) + fflib.WriteJsonString(buf, string(*mj.Scheme)) + buf.WriteByte(',') + } + } + buf.WriteString(`"port":`) + fflib.FormatBits2(buf, uint64(mj.Port), 10, false) + buf.WriteByte(',') + if mj.Path != nil { + if true { + buf.WriteString(`"path":`) + fflib.WriteJsonString(buf, string(*mj.Path)) + buf.WriteByte(',') + } + } + if len(mj.Statuses) != 0 { + buf.WriteString(`"statuses":`) + if mj.Statuses != nil { + buf.WriteString(`[`) + for i, v := range mj.Statuses { + if i != 0 { + buf.WriteString(`,`) + } + fflib.FormatBits2(buf, uint64(v), 10, false) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_HealthCheck_HTTPCheckInfobase = iota + ffj_t_HealthCheck_HTTPCheckInfono_such_key + + ffj_t_HealthCheck_HTTPCheckInfo_Protocol + + ffj_t_HealthCheck_HTTPCheckInfo_Scheme + + ffj_t_HealthCheck_HTTPCheckInfo_Port + + ffj_t_HealthCheck_HTTPCheckInfo_Path + + ffj_t_HealthCheck_HTTPCheckInfo_Statuses +) + +var ffj_key_HealthCheck_HTTPCheckInfo_Protocol = []byte("protocol") + +var ffj_key_HealthCheck_HTTPCheckInfo_Scheme = []byte("scheme") + +var ffj_key_HealthCheck_HTTPCheckInfo_Port = []byte("port") + +var ffj_key_HealthCheck_HTTPCheckInfo_Path = []byte("path") + +var ffj_key_HealthCheck_HTTPCheckInfo_Statuses = []byte("statuses") + +func (uj *HealthCheck_HTTPCheckInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *HealthCheck_HTTPCheckInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_HealthCheck_HTTPCheckInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_HealthCheck_HTTPCheckInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_HealthCheck_HTTPCheckInfo_Protocol, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Protocol + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_HealthCheck_HTTPCheckInfo_Port, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_HealthCheck_HTTPCheckInfo_Path, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_HealthCheck_HTTPCheckInfo_Scheme, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Scheme + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_HealthCheck_HTTPCheckInfo_Statuses, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Statuses + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_HealthCheck_HTTPCheckInfo_Statuses, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Statuses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_HTTPCheckInfo_Path, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_HTTPCheckInfo_Port, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_HealthCheck_HTTPCheckInfo_Scheme, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Scheme + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_HTTPCheckInfo_Protocol, kn) { + currentKey = ffj_t_HealthCheck_HTTPCheckInfo_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_HealthCheck_HTTPCheckInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_HealthCheck_HTTPCheckInfo_Protocol: + goto handle_Protocol + + case ffj_t_HealthCheck_HTTPCheckInfo_Scheme: + goto handle_Scheme + + case ffj_t_HealthCheck_HTTPCheckInfo_Port: + goto handle_Port + + case ffj_t_HealthCheck_HTTPCheckInfo_Path: + goto handle_Path + + case ffj_t_HealthCheck_HTTPCheckInfo_Statuses: + goto handle_Statuses + + case ffj_t_HealthCheck_HTTPCheckInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Protocol: + + /* handler: uj.Protocol type=mesos.NetworkInfo_Protocol kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Protocol = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Protocol == nil { + uj.Protocol = new(NetworkInfo_Protocol) + } + + err = uj.Protocol.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Scheme: + + /* handler: uj.Scheme type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Scheme = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Scheme = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Port: + + /* handler: uj.Port type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Port = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Path = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Path = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Statuses: + + /* handler: uj.Statuses type=[]uint32 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Statuses = nil + } else { + + uj.Statuses = []uint32{} + + wantVal := true + + for { + + var tmp_uj__Statuses uint32 + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Statuses type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + tmp_uj__Statuses = uint32(tval) + + } + } + + uj.Statuses = append(uj.Statuses, tmp_uj__Statuses) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *HealthCheck_TCPCheckInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *HealthCheck_TCPCheckInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteByte('{') + if mj.Protocol != nil { + if true { + buf.WriteString(`"protocol":`) + + { + + obj, err = mj.Protocol.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"port":`) + fflib.FormatBits2(buf, uint64(mj.Port), 10, false) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_HealthCheck_TCPCheckInfobase = iota + ffj_t_HealthCheck_TCPCheckInfono_such_key + + ffj_t_HealthCheck_TCPCheckInfo_Protocol + + ffj_t_HealthCheck_TCPCheckInfo_Port +) + +var ffj_key_HealthCheck_TCPCheckInfo_Protocol = []byte("protocol") + +var ffj_key_HealthCheck_TCPCheckInfo_Port = []byte("port") + +func (uj *HealthCheck_TCPCheckInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *HealthCheck_TCPCheckInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_HealthCheck_TCPCheckInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_HealthCheck_TCPCheckInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_HealthCheck_TCPCheckInfo_Protocol, kn) { + currentKey = ffj_t_HealthCheck_TCPCheckInfo_Protocol + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_HealthCheck_TCPCheckInfo_Port, kn) { + currentKey = ffj_t_HealthCheck_TCPCheckInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_TCPCheckInfo_Port, kn) { + currentKey = ffj_t_HealthCheck_TCPCheckInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_HealthCheck_TCPCheckInfo_Protocol, kn) { + currentKey = ffj_t_HealthCheck_TCPCheckInfo_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_HealthCheck_TCPCheckInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_HealthCheck_TCPCheckInfo_Protocol: + goto handle_Protocol + + case ffj_t_HealthCheck_TCPCheckInfo_Port: + goto handle_Port + + case ffj_t_HealthCheck_TCPCheckInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Protocol: + + /* handler: uj.Protocol type=mesos.NetworkInfo_Protocol kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Protocol = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Protocol == nil { + uj.Protocol = new(NetworkInfo_Protocol) + } + + err = uj.Protocol.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Port: + + /* handler: uj.Port type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Port = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *IcmpStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *IcmpStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.InMsgs != nil { + if true { + buf.WriteString(`"InMsgs":`) + fflib.FormatBits2(buf, uint64(*mj.InMsgs), 10, *mj.InMsgs < 0) + buf.WriteByte(',') + } + } + if mj.InErrors != nil { + if true { + buf.WriteString(`"InErrors":`) + fflib.FormatBits2(buf, uint64(*mj.InErrors), 10, *mj.InErrors < 0) + buf.WriteByte(',') + } + } + if mj.InCsumErrors != nil { + if true { + buf.WriteString(`"InCsumErrors":`) + fflib.FormatBits2(buf, uint64(*mj.InCsumErrors), 10, *mj.InCsumErrors < 0) + buf.WriteByte(',') + } + } + if mj.InDestUnreachs != nil { + if true { + buf.WriteString(`"InDestUnreachs":`) + fflib.FormatBits2(buf, uint64(*mj.InDestUnreachs), 10, *mj.InDestUnreachs < 0) + buf.WriteByte(',') + } + } + if mj.InTimeExcds != nil { + if true { + buf.WriteString(`"InTimeExcds":`) + fflib.FormatBits2(buf, uint64(*mj.InTimeExcds), 10, *mj.InTimeExcds < 0) + buf.WriteByte(',') + } + } + if mj.InParmProbs != nil { + if true { + buf.WriteString(`"InParmProbs":`) + fflib.FormatBits2(buf, uint64(*mj.InParmProbs), 10, *mj.InParmProbs < 0) + buf.WriteByte(',') + } + } + if mj.InSrcQuenchs != nil { + if true { + buf.WriteString(`"InSrcQuenchs":`) + fflib.FormatBits2(buf, uint64(*mj.InSrcQuenchs), 10, *mj.InSrcQuenchs < 0) + buf.WriteByte(',') + } + } + if mj.InRedirects != nil { + if true { + buf.WriteString(`"InRedirects":`) + fflib.FormatBits2(buf, uint64(*mj.InRedirects), 10, *mj.InRedirects < 0) + buf.WriteByte(',') + } + } + if mj.InEchos != nil { + if true { + buf.WriteString(`"InEchos":`) + fflib.FormatBits2(buf, uint64(*mj.InEchos), 10, *mj.InEchos < 0) + buf.WriteByte(',') + } + } + if mj.InEchoReps != nil { + if true { + buf.WriteString(`"InEchoReps":`) + fflib.FormatBits2(buf, uint64(*mj.InEchoReps), 10, *mj.InEchoReps < 0) + buf.WriteByte(',') + } + } + if mj.InTimestamps != nil { + if true { + buf.WriteString(`"InTimestamps":`) + fflib.FormatBits2(buf, uint64(*mj.InTimestamps), 10, *mj.InTimestamps < 0) + buf.WriteByte(',') + } + } + if mj.InTimestampReps != nil { + if true { + buf.WriteString(`"InTimestampReps":`) + fflib.FormatBits2(buf, uint64(*mj.InTimestampReps), 10, *mj.InTimestampReps < 0) + buf.WriteByte(',') + } + } + if mj.InAddrMasks != nil { + if true { + buf.WriteString(`"InAddrMasks":`) + fflib.FormatBits2(buf, uint64(*mj.InAddrMasks), 10, *mj.InAddrMasks < 0) + buf.WriteByte(',') + } + } + if mj.InAddrMaskReps != nil { + if true { + buf.WriteString(`"InAddrMaskReps":`) + fflib.FormatBits2(buf, uint64(*mj.InAddrMaskReps), 10, *mj.InAddrMaskReps < 0) + buf.WriteByte(',') + } + } + if mj.OutMsgs != nil { + if true { + buf.WriteString(`"OutMsgs":`) + fflib.FormatBits2(buf, uint64(*mj.OutMsgs), 10, *mj.OutMsgs < 0) + buf.WriteByte(',') + } + } + if mj.OutErrors != nil { + if true { + buf.WriteString(`"OutErrors":`) + fflib.FormatBits2(buf, uint64(*mj.OutErrors), 10, *mj.OutErrors < 0) + buf.WriteByte(',') + } + } + if mj.OutDestUnreachs != nil { + if true { + buf.WriteString(`"OutDestUnreachs":`) + fflib.FormatBits2(buf, uint64(*mj.OutDestUnreachs), 10, *mj.OutDestUnreachs < 0) + buf.WriteByte(',') + } + } + if mj.OutTimeExcds != nil { + if true { + buf.WriteString(`"OutTimeExcds":`) + fflib.FormatBits2(buf, uint64(*mj.OutTimeExcds), 10, *mj.OutTimeExcds < 0) + buf.WriteByte(',') + } + } + if mj.OutParmProbs != nil { + if true { + buf.WriteString(`"OutParmProbs":`) + fflib.FormatBits2(buf, uint64(*mj.OutParmProbs), 10, *mj.OutParmProbs < 0) + buf.WriteByte(',') + } + } + if mj.OutSrcQuenchs != nil { + if true { + buf.WriteString(`"OutSrcQuenchs":`) + fflib.FormatBits2(buf, uint64(*mj.OutSrcQuenchs), 10, *mj.OutSrcQuenchs < 0) + buf.WriteByte(',') + } + } + if mj.OutRedirects != nil { + if true { + buf.WriteString(`"OutRedirects":`) + fflib.FormatBits2(buf, uint64(*mj.OutRedirects), 10, *mj.OutRedirects < 0) + buf.WriteByte(',') + } + } + if mj.OutEchos != nil { + if true { + buf.WriteString(`"OutEchos":`) + fflib.FormatBits2(buf, uint64(*mj.OutEchos), 10, *mj.OutEchos < 0) + buf.WriteByte(',') + } + } + if mj.OutEchoReps != nil { + if true { + buf.WriteString(`"OutEchoReps":`) + fflib.FormatBits2(buf, uint64(*mj.OutEchoReps), 10, *mj.OutEchoReps < 0) + buf.WriteByte(',') + } + } + if mj.OutTimestamps != nil { + if true { + buf.WriteString(`"OutTimestamps":`) + fflib.FormatBits2(buf, uint64(*mj.OutTimestamps), 10, *mj.OutTimestamps < 0) + buf.WriteByte(',') + } + } + if mj.OutTimestampReps != nil { + if true { + buf.WriteString(`"OutTimestampReps":`) + fflib.FormatBits2(buf, uint64(*mj.OutTimestampReps), 10, *mj.OutTimestampReps < 0) + buf.WriteByte(',') + } + } + if mj.OutAddrMasks != nil { + if true { + buf.WriteString(`"OutAddrMasks":`) + fflib.FormatBits2(buf, uint64(*mj.OutAddrMasks), 10, *mj.OutAddrMasks < 0) + buf.WriteByte(',') + } + } + if mj.OutAddrMaskReps != nil { + if true { + buf.WriteString(`"OutAddrMaskReps":`) + fflib.FormatBits2(buf, uint64(*mj.OutAddrMaskReps), 10, *mj.OutAddrMaskReps < 0) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_IcmpStatisticsbase = iota + ffj_t_IcmpStatisticsno_such_key + + ffj_t_IcmpStatistics_InMsgs + + ffj_t_IcmpStatistics_InErrors + + ffj_t_IcmpStatistics_InCsumErrors + + ffj_t_IcmpStatistics_InDestUnreachs + + ffj_t_IcmpStatistics_InTimeExcds + + ffj_t_IcmpStatistics_InParmProbs + + ffj_t_IcmpStatistics_InSrcQuenchs + + ffj_t_IcmpStatistics_InRedirects + + ffj_t_IcmpStatistics_InEchos + + ffj_t_IcmpStatistics_InEchoReps + + ffj_t_IcmpStatistics_InTimestamps + + ffj_t_IcmpStatistics_InTimestampReps + + ffj_t_IcmpStatistics_InAddrMasks + + ffj_t_IcmpStatistics_InAddrMaskReps + + ffj_t_IcmpStatistics_OutMsgs + + ffj_t_IcmpStatistics_OutErrors + + ffj_t_IcmpStatistics_OutDestUnreachs + + ffj_t_IcmpStatistics_OutTimeExcds + + ffj_t_IcmpStatistics_OutParmProbs + + ffj_t_IcmpStatistics_OutSrcQuenchs + + ffj_t_IcmpStatistics_OutRedirects + + ffj_t_IcmpStatistics_OutEchos + + ffj_t_IcmpStatistics_OutEchoReps + + ffj_t_IcmpStatistics_OutTimestamps + + ffj_t_IcmpStatistics_OutTimestampReps + + ffj_t_IcmpStatistics_OutAddrMasks + + ffj_t_IcmpStatistics_OutAddrMaskReps +) + +var ffj_key_IcmpStatistics_InMsgs = []byte("InMsgs") + +var ffj_key_IcmpStatistics_InErrors = []byte("InErrors") + +var ffj_key_IcmpStatistics_InCsumErrors = []byte("InCsumErrors") + +var ffj_key_IcmpStatistics_InDestUnreachs = []byte("InDestUnreachs") + +var ffj_key_IcmpStatistics_InTimeExcds = []byte("InTimeExcds") + +var ffj_key_IcmpStatistics_InParmProbs = []byte("InParmProbs") + +var ffj_key_IcmpStatistics_InSrcQuenchs = []byte("InSrcQuenchs") + +var ffj_key_IcmpStatistics_InRedirects = []byte("InRedirects") + +var ffj_key_IcmpStatistics_InEchos = []byte("InEchos") + +var ffj_key_IcmpStatistics_InEchoReps = []byte("InEchoReps") + +var ffj_key_IcmpStatistics_InTimestamps = []byte("InTimestamps") + +var ffj_key_IcmpStatistics_InTimestampReps = []byte("InTimestampReps") + +var ffj_key_IcmpStatistics_InAddrMasks = []byte("InAddrMasks") + +var ffj_key_IcmpStatistics_InAddrMaskReps = []byte("InAddrMaskReps") + +var ffj_key_IcmpStatistics_OutMsgs = []byte("OutMsgs") + +var ffj_key_IcmpStatistics_OutErrors = []byte("OutErrors") + +var ffj_key_IcmpStatistics_OutDestUnreachs = []byte("OutDestUnreachs") + +var ffj_key_IcmpStatistics_OutTimeExcds = []byte("OutTimeExcds") + +var ffj_key_IcmpStatistics_OutParmProbs = []byte("OutParmProbs") + +var ffj_key_IcmpStatistics_OutSrcQuenchs = []byte("OutSrcQuenchs") + +var ffj_key_IcmpStatistics_OutRedirects = []byte("OutRedirects") + +var ffj_key_IcmpStatistics_OutEchos = []byte("OutEchos") + +var ffj_key_IcmpStatistics_OutEchoReps = []byte("OutEchoReps") + +var ffj_key_IcmpStatistics_OutTimestamps = []byte("OutTimestamps") + +var ffj_key_IcmpStatistics_OutTimestampReps = []byte("OutTimestampReps") + +var ffj_key_IcmpStatistics_OutAddrMasks = []byte("OutAddrMasks") + +var ffj_key_IcmpStatistics_OutAddrMaskReps = []byte("OutAddrMaskReps") + +func (uj *IcmpStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *IcmpStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_IcmpStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_IcmpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'I': + + if bytes.Equal(ffj_key_IcmpStatistics_InMsgs, kn) { + currentKey = ffj_t_IcmpStatistics_InMsgs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InErrors, kn) { + currentKey = ffj_t_IcmpStatistics_InErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InCsumErrors, kn) { + currentKey = ffj_t_IcmpStatistics_InCsumErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InDestUnreachs, kn) { + currentKey = ffj_t_IcmpStatistics_InDestUnreachs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InTimeExcds, kn) { + currentKey = ffj_t_IcmpStatistics_InTimeExcds + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InParmProbs, kn) { + currentKey = ffj_t_IcmpStatistics_InParmProbs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InSrcQuenchs, kn) { + currentKey = ffj_t_IcmpStatistics_InSrcQuenchs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InRedirects, kn) { + currentKey = ffj_t_IcmpStatistics_InRedirects + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InEchos, kn) { + currentKey = ffj_t_IcmpStatistics_InEchos + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InEchoReps, kn) { + currentKey = ffj_t_IcmpStatistics_InEchoReps + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InTimestamps, kn) { + currentKey = ffj_t_IcmpStatistics_InTimestamps + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InTimestampReps, kn) { + currentKey = ffj_t_IcmpStatistics_InTimestampReps + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InAddrMasks, kn) { + currentKey = ffj_t_IcmpStatistics_InAddrMasks + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_InAddrMaskReps, kn) { + currentKey = ffj_t_IcmpStatistics_InAddrMaskReps + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'O': + + if bytes.Equal(ffj_key_IcmpStatistics_OutMsgs, kn) { + currentKey = ffj_t_IcmpStatistics_OutMsgs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutErrors, kn) { + currentKey = ffj_t_IcmpStatistics_OutErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutDestUnreachs, kn) { + currentKey = ffj_t_IcmpStatistics_OutDestUnreachs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutTimeExcds, kn) { + currentKey = ffj_t_IcmpStatistics_OutTimeExcds + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutParmProbs, kn) { + currentKey = ffj_t_IcmpStatistics_OutParmProbs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutSrcQuenchs, kn) { + currentKey = ffj_t_IcmpStatistics_OutSrcQuenchs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutRedirects, kn) { + currentKey = ffj_t_IcmpStatistics_OutRedirects + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutEchos, kn) { + currentKey = ffj_t_IcmpStatistics_OutEchos + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutEchoReps, kn) { + currentKey = ffj_t_IcmpStatistics_OutEchoReps + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutTimestamps, kn) { + currentKey = ffj_t_IcmpStatistics_OutTimestamps + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutTimestampReps, kn) { + currentKey = ffj_t_IcmpStatistics_OutTimestampReps + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutAddrMasks, kn) { + currentKey = ffj_t_IcmpStatistics_OutAddrMasks + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IcmpStatistics_OutAddrMaskReps, kn) { + currentKey = ffj_t_IcmpStatistics_OutAddrMaskReps + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutAddrMaskReps, kn) { + currentKey = ffj_t_IcmpStatistics_OutAddrMaskReps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutAddrMasks, kn) { + currentKey = ffj_t_IcmpStatistics_OutAddrMasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutTimestampReps, kn) { + currentKey = ffj_t_IcmpStatistics_OutTimestampReps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutTimestamps, kn) { + currentKey = ffj_t_IcmpStatistics_OutTimestamps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutEchoReps, kn) { + currentKey = ffj_t_IcmpStatistics_OutEchoReps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutEchos, kn) { + currentKey = ffj_t_IcmpStatistics_OutEchos + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutRedirects, kn) { + currentKey = ffj_t_IcmpStatistics_OutRedirects + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutSrcQuenchs, kn) { + currentKey = ffj_t_IcmpStatistics_OutSrcQuenchs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutParmProbs, kn) { + currentKey = ffj_t_IcmpStatistics_OutParmProbs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutTimeExcds, kn) { + currentKey = ffj_t_IcmpStatistics_OutTimeExcds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutDestUnreachs, kn) { + currentKey = ffj_t_IcmpStatistics_OutDestUnreachs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutErrors, kn) { + currentKey = ffj_t_IcmpStatistics_OutErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_OutMsgs, kn) { + currentKey = ffj_t_IcmpStatistics_OutMsgs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InAddrMaskReps, kn) { + currentKey = ffj_t_IcmpStatistics_InAddrMaskReps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InAddrMasks, kn) { + currentKey = ffj_t_IcmpStatistics_InAddrMasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InTimestampReps, kn) { + currentKey = ffj_t_IcmpStatistics_InTimestampReps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InTimestamps, kn) { + currentKey = ffj_t_IcmpStatistics_InTimestamps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InEchoReps, kn) { + currentKey = ffj_t_IcmpStatistics_InEchoReps + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InEchos, kn) { + currentKey = ffj_t_IcmpStatistics_InEchos + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InRedirects, kn) { + currentKey = ffj_t_IcmpStatistics_InRedirects + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InSrcQuenchs, kn) { + currentKey = ffj_t_IcmpStatistics_InSrcQuenchs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InParmProbs, kn) { + currentKey = ffj_t_IcmpStatistics_InParmProbs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InTimeExcds, kn) { + currentKey = ffj_t_IcmpStatistics_InTimeExcds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InDestUnreachs, kn) { + currentKey = ffj_t_IcmpStatistics_InDestUnreachs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InCsumErrors, kn) { + currentKey = ffj_t_IcmpStatistics_InCsumErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InErrors, kn) { + currentKey = ffj_t_IcmpStatistics_InErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IcmpStatistics_InMsgs, kn) { + currentKey = ffj_t_IcmpStatistics_InMsgs + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_IcmpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_IcmpStatistics_InMsgs: + goto handle_InMsgs + + case ffj_t_IcmpStatistics_InErrors: + goto handle_InErrors + + case ffj_t_IcmpStatistics_InCsumErrors: + goto handle_InCsumErrors + + case ffj_t_IcmpStatistics_InDestUnreachs: + goto handle_InDestUnreachs + + case ffj_t_IcmpStatistics_InTimeExcds: + goto handle_InTimeExcds + + case ffj_t_IcmpStatistics_InParmProbs: + goto handle_InParmProbs + + case ffj_t_IcmpStatistics_InSrcQuenchs: + goto handle_InSrcQuenchs + + case ffj_t_IcmpStatistics_InRedirects: + goto handle_InRedirects + + case ffj_t_IcmpStatistics_InEchos: + goto handle_InEchos + + case ffj_t_IcmpStatistics_InEchoReps: + goto handle_InEchoReps + + case ffj_t_IcmpStatistics_InTimestamps: + goto handle_InTimestamps + + case ffj_t_IcmpStatistics_InTimestampReps: + goto handle_InTimestampReps + + case ffj_t_IcmpStatistics_InAddrMasks: + goto handle_InAddrMasks + + case ffj_t_IcmpStatistics_InAddrMaskReps: + goto handle_InAddrMaskReps + + case ffj_t_IcmpStatistics_OutMsgs: + goto handle_OutMsgs + + case ffj_t_IcmpStatistics_OutErrors: + goto handle_OutErrors + + case ffj_t_IcmpStatistics_OutDestUnreachs: + goto handle_OutDestUnreachs + + case ffj_t_IcmpStatistics_OutTimeExcds: + goto handle_OutTimeExcds + + case ffj_t_IcmpStatistics_OutParmProbs: + goto handle_OutParmProbs + + case ffj_t_IcmpStatistics_OutSrcQuenchs: + goto handle_OutSrcQuenchs + + case ffj_t_IcmpStatistics_OutRedirects: + goto handle_OutRedirects + + case ffj_t_IcmpStatistics_OutEchos: + goto handle_OutEchos + + case ffj_t_IcmpStatistics_OutEchoReps: + goto handle_OutEchoReps + + case ffj_t_IcmpStatistics_OutTimestamps: + goto handle_OutTimestamps + + case ffj_t_IcmpStatistics_OutTimestampReps: + goto handle_OutTimestampReps + + case ffj_t_IcmpStatistics_OutAddrMasks: + goto handle_OutAddrMasks + + case ffj_t_IcmpStatistics_OutAddrMaskReps: + goto handle_OutAddrMaskReps + + case ffj_t_IcmpStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_InMsgs: + + /* handler: uj.InMsgs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InMsgs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InMsgs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InErrors: + + /* handler: uj.InErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InCsumErrors: + + /* handler: uj.InCsumErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InCsumErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InCsumErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InDestUnreachs: + + /* handler: uj.InDestUnreachs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InDestUnreachs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InDestUnreachs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InTimeExcds: + + /* handler: uj.InTimeExcds type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InTimeExcds = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InTimeExcds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InParmProbs: + + /* handler: uj.InParmProbs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InParmProbs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InParmProbs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InSrcQuenchs: + + /* handler: uj.InSrcQuenchs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InSrcQuenchs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InSrcQuenchs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InRedirects: + + /* handler: uj.InRedirects type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InRedirects = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InRedirects = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InEchos: + + /* handler: uj.InEchos type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InEchos = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InEchos = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InEchoReps: + + /* handler: uj.InEchoReps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InEchoReps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InEchoReps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InTimestamps: + + /* handler: uj.InTimestamps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InTimestamps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InTimestamps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InTimestampReps: + + /* handler: uj.InTimestampReps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InTimestampReps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InTimestampReps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InAddrMasks: + + /* handler: uj.InAddrMasks type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InAddrMasks = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InAddrMasks = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InAddrMaskReps: + + /* handler: uj.InAddrMaskReps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InAddrMaskReps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InAddrMaskReps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutMsgs: + + /* handler: uj.OutMsgs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutMsgs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutMsgs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutErrors: + + /* handler: uj.OutErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutDestUnreachs: + + /* handler: uj.OutDestUnreachs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutDestUnreachs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutDestUnreachs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutTimeExcds: + + /* handler: uj.OutTimeExcds type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutTimeExcds = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutTimeExcds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutParmProbs: + + /* handler: uj.OutParmProbs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutParmProbs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutParmProbs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutSrcQuenchs: + + /* handler: uj.OutSrcQuenchs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutSrcQuenchs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutSrcQuenchs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutRedirects: + + /* handler: uj.OutRedirects type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutRedirects = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutRedirects = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutEchos: + + /* handler: uj.OutEchos type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutEchos = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutEchos = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutEchoReps: + + /* handler: uj.OutEchoReps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutEchoReps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutEchoReps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutTimestamps: + + /* handler: uj.OutTimestamps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutTimestamps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutTimestamps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutTimestampReps: + + /* handler: uj.OutTimestampReps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutTimestampReps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutTimestampReps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutAddrMasks: + + /* handler: uj.OutAddrMasks type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutAddrMasks = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutAddrMasks = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutAddrMaskReps: + + /* handler: uj.OutAddrMaskReps type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutAddrMaskReps = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutAddrMaskReps = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Image) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Image) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Type != nil { + if true { + buf.WriteString(`"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Appc != nil { + if true { + buf.WriteString(`"appc":`) + + { + + err = mj.Appc.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Docker != nil { + if true { + buf.WriteString(`"docker":`) + + { + + err = mj.Docker.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Cached != nil { + if true { + if *mj.Cached { + buf.WriteString(`"cached":true`) + } else { + buf.WriteString(`"cached":false`) + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Imagebase = iota + ffj_t_Imageno_such_key + + ffj_t_Image_Type + + ffj_t_Image_Appc + + ffj_t_Image_Docker + + ffj_t_Image_Cached +) + +var ffj_key_Image_Type = []byte("type") + +var ffj_key_Image_Appc = []byte("appc") + +var ffj_key_Image_Docker = []byte("docker") + +var ffj_key_Image_Cached = []byte("cached") + +func (uj *Image) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Image) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Imagebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Imageno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Image_Appc, kn) { + currentKey = ffj_t_Image_Appc + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_Image_Cached, kn) { + currentKey = ffj_t_Image_Cached + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_Image_Docker, kn) { + currentKey = ffj_t_Image_Docker + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Image_Type, kn) { + currentKey = ffj_t_Image_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Cached, kn) { + currentKey = ffj_t_Image_Cached + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Image_Docker, kn) { + currentKey = ffj_t_Image_Docker + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Appc, kn) { + currentKey = ffj_t_Image_Appc + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Type, kn) { + currentKey = ffj_t_Image_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Imageno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Image_Type: + goto handle_Type + + case ffj_t_Image_Appc: + goto handle_Appc + + case ffj_t_Image_Docker: + goto handle_Docker + + case ffj_t_Image_Cached: + goto handle_Cached + + case ffj_t_Imageno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Image_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Type = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Type == nil { + uj.Type = new(Image_Type) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Appc: + + /* handler: uj.Appc type=mesos.Image_Appc kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Appc = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Appc == nil { + uj.Appc = new(Image_Appc) + } + + err = uj.Appc.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Docker: + + /* handler: uj.Docker type=mesos.Image_Docker kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Docker = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Docker == nil { + uj.Docker = new(Image_Docker) + } + + err = uj.Docker.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Cached: + + /* handler: uj.Cached type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Cached = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Cached = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Image_Appc) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Image_Appc) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.ID != nil { + if true { + buf.WriteString(`"id":`) + fflib.WriteJsonString(buf, string(*mj.ID)) + buf.WriteByte(',') + } + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Image_Appcbase = iota + ffj_t_Image_Appcno_such_key + + ffj_t_Image_Appc_Name + + ffj_t_Image_Appc_ID + + ffj_t_Image_Appc_Labels +) + +var ffj_key_Image_Appc_Name = []byte("name") + +var ffj_key_Image_Appc_ID = []byte("id") + +var ffj_key_Image_Appc_Labels = []byte("labels") + +func (uj *Image_Appc) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Image_Appc) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Image_Appcbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Image_Appcno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_Image_Appc_ID, kn) { + currentKey = ffj_t_Image_Appc_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Image_Appc_Labels, kn) { + currentKey = ffj_t_Image_Appc_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Image_Appc_Name, kn) { + currentKey = ffj_t_Image_Appc_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Image_Appc_Labels, kn) { + currentKey = ffj_t_Image_Appc_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Appc_ID, kn) { + currentKey = ffj_t_Image_Appc_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Appc_Name, kn) { + currentKey = ffj_t_Image_Appc_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Image_Appcno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Image_Appc_Name: + goto handle_Name + + case ffj_t_Image_Appc_ID: + goto handle_ID + + case ffj_t_Image_Appc_Labels: + goto handle_Labels + + case ffj_t_Image_Appcno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.ID = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.ID = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Image_Docker) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Image_Docker) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.Credential != nil { + if true { + buf.WriteString(`"credential":`) + + { + + err = mj.Credential.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Config != nil { + if true { + buf.WriteString(`"config":`) + + { + + err = mj.Config.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Image_Dockerbase = iota + ffj_t_Image_Dockerno_such_key + + ffj_t_Image_Docker_Name + + ffj_t_Image_Docker_Credential + + ffj_t_Image_Docker_Config +) + +var ffj_key_Image_Docker_Name = []byte("name") + +var ffj_key_Image_Docker_Credential = []byte("credential") + +var ffj_key_Image_Docker_Config = []byte("config") + +func (uj *Image_Docker) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Image_Docker) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Image_Dockerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Image_Dockerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Image_Docker_Credential, kn) { + currentKey = ffj_t_Image_Docker_Credential + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Image_Docker_Config, kn) { + currentKey = ffj_t_Image_Docker_Config + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Image_Docker_Name, kn) { + currentKey = ffj_t_Image_Docker_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Docker_Config, kn) { + currentKey = ffj_t_Image_Docker_Config + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Docker_Credential, kn) { + currentKey = ffj_t_Image_Docker_Credential + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Image_Docker_Name, kn) { + currentKey = ffj_t_Image_Docker_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Image_Dockerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Image_Docker_Name: + goto handle_Name + + case ffj_t_Image_Docker_Credential: + goto handle_Credential + + case ffj_t_Image_Docker_Config: + goto handle_Config + + case ffj_t_Image_Dockerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Credential: + + /* handler: uj.Credential type=mesos.Credential kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Credential = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Credential == nil { + uj.Credential = new(Credential) + } + + err = uj.Credential.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Config: + + /* handler: uj.Config type=mesos.Secret kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Config = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Config == nil { + uj.Config = new(Secret) + } + + err = uj.Config.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *InverseOffer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *InverseOffer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"id":`) + + { + + err = mj.OfferID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.URL != nil { + if true { + buf.WriteString(`"url":`) + + { + + err = mj.URL.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"framework_id":`) + + { + + err = mj.FrameworkID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.AgentID != nil { + if true { + buf.WriteString(`"agent_id":`) + + { + + err = mj.AgentID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"unavailability":`) + + { + + err = mj.Unavailability.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_InverseOfferbase = iota + ffj_t_InverseOfferno_such_key + + ffj_t_InverseOffer_OfferID + + ffj_t_InverseOffer_URL + + ffj_t_InverseOffer_FrameworkID + + ffj_t_InverseOffer_AgentID + + ffj_t_InverseOffer_Unavailability + + ffj_t_InverseOffer_Resources +) + +var ffj_key_InverseOffer_OfferID = []byte("id") + +var ffj_key_InverseOffer_URL = []byte("url") + +var ffj_key_InverseOffer_FrameworkID = []byte("framework_id") + +var ffj_key_InverseOffer_AgentID = []byte("agent_id") + +var ffj_key_InverseOffer_Unavailability = []byte("unavailability") + +var ffj_key_InverseOffer_Resources = []byte("resources") + +func (uj *InverseOffer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *InverseOffer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_InverseOfferbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_InverseOfferno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_InverseOffer_AgentID, kn) { + currentKey = ffj_t_InverseOffer_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_InverseOffer_FrameworkID, kn) { + currentKey = ffj_t_InverseOffer_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_InverseOffer_OfferID, kn) { + currentKey = ffj_t_InverseOffer_OfferID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_InverseOffer_Resources, kn) { + currentKey = ffj_t_InverseOffer_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_InverseOffer_URL, kn) { + currentKey = ffj_t_InverseOffer_URL + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_InverseOffer_Unavailability, kn) { + currentKey = ffj_t_InverseOffer_Unavailability + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_InverseOffer_Resources, kn) { + currentKey = ffj_t_InverseOffer_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_InverseOffer_Unavailability, kn) { + currentKey = ffj_t_InverseOffer_Unavailability + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_InverseOffer_AgentID, kn) { + currentKey = ffj_t_InverseOffer_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_InverseOffer_FrameworkID, kn) { + currentKey = ffj_t_InverseOffer_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_InverseOffer_URL, kn) { + currentKey = ffj_t_InverseOffer_URL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_InverseOffer_OfferID, kn) { + currentKey = ffj_t_InverseOffer_OfferID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_InverseOfferno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_InverseOffer_OfferID: + goto handle_OfferID + + case ffj_t_InverseOffer_URL: + goto handle_URL + + case ffj_t_InverseOffer_FrameworkID: + goto handle_FrameworkID + + case ffj_t_InverseOffer_AgentID: + goto handle_AgentID + + case ffj_t_InverseOffer_Unavailability: + goto handle_Unavailability + + case ffj_t_InverseOffer_Resources: + goto handle_Resources + + case ffj_t_InverseOfferno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_OfferID: + + /* handler: uj.OfferID type=mesos.OfferID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.OfferID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: uj.URL type=mesos.URL kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.URL = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.URL == nil { + uj.URL = new(URL) + } + + err = uj.URL.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FrameworkID: + + /* handler: uj.FrameworkID type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.FrameworkID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AgentID: + + /* handler: uj.AgentID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AgentID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AgentID == nil { + uj.AgentID = new(AgentID) + } + + err = uj.AgentID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Unavailability: + + /* handler: uj.Unavailability type=mesos.Unavailability kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Unavailability.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *IpStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *IpStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Forwarding != nil { + if true { + buf.WriteString(`"Forwarding":`) + fflib.FormatBits2(buf, uint64(*mj.Forwarding), 10, *mj.Forwarding < 0) + buf.WriteByte(',') + } + } + if mj.DefaultTTL != nil { + if true { + buf.WriteString(`"DefaultTTL":`) + fflib.FormatBits2(buf, uint64(*mj.DefaultTTL), 10, *mj.DefaultTTL < 0) + buf.WriteByte(',') + } + } + if mj.InReceives != nil { + if true { + buf.WriteString(`"InReceives":`) + fflib.FormatBits2(buf, uint64(*mj.InReceives), 10, *mj.InReceives < 0) + buf.WriteByte(',') + } + } + if mj.InHdrErrors != nil { + if true { + buf.WriteString(`"InHdrErrors":`) + fflib.FormatBits2(buf, uint64(*mj.InHdrErrors), 10, *mj.InHdrErrors < 0) + buf.WriteByte(',') + } + } + if mj.InAddrErrors != nil { + if true { + buf.WriteString(`"InAddrErrors":`) + fflib.FormatBits2(buf, uint64(*mj.InAddrErrors), 10, *mj.InAddrErrors < 0) + buf.WriteByte(',') + } + } + if mj.ForwDatagrams != nil { + if true { + buf.WriteString(`"ForwDatagrams":`) + fflib.FormatBits2(buf, uint64(*mj.ForwDatagrams), 10, *mj.ForwDatagrams < 0) + buf.WriteByte(',') + } + } + if mj.InUnknownProtos != nil { + if true { + buf.WriteString(`"InUnknownProtos":`) + fflib.FormatBits2(buf, uint64(*mj.InUnknownProtos), 10, *mj.InUnknownProtos < 0) + buf.WriteByte(',') + } + } + if mj.InDiscards != nil { + if true { + buf.WriteString(`"InDiscards":`) + fflib.FormatBits2(buf, uint64(*mj.InDiscards), 10, *mj.InDiscards < 0) + buf.WriteByte(',') + } + } + if mj.InDelivers != nil { + if true { + buf.WriteString(`"InDelivers":`) + fflib.FormatBits2(buf, uint64(*mj.InDelivers), 10, *mj.InDelivers < 0) + buf.WriteByte(',') + } + } + if mj.OutRequests != nil { + if true { + buf.WriteString(`"OutRequests":`) + fflib.FormatBits2(buf, uint64(*mj.OutRequests), 10, *mj.OutRequests < 0) + buf.WriteByte(',') + } + } + if mj.OutDiscards != nil { + if true { + buf.WriteString(`"OutDiscards":`) + fflib.FormatBits2(buf, uint64(*mj.OutDiscards), 10, *mj.OutDiscards < 0) + buf.WriteByte(',') + } + } + if mj.OutNoRoutes != nil { + if true { + buf.WriteString(`"OutNoRoutes":`) + fflib.FormatBits2(buf, uint64(*mj.OutNoRoutes), 10, *mj.OutNoRoutes < 0) + buf.WriteByte(',') + } + } + if mj.ReasmTimeout != nil { + if true { + buf.WriteString(`"ReasmTimeout":`) + fflib.FormatBits2(buf, uint64(*mj.ReasmTimeout), 10, *mj.ReasmTimeout < 0) + buf.WriteByte(',') + } + } + if mj.ReasmReqds != nil { + if true { + buf.WriteString(`"ReasmReqds":`) + fflib.FormatBits2(buf, uint64(*mj.ReasmReqds), 10, *mj.ReasmReqds < 0) + buf.WriteByte(',') + } + } + if mj.ReasmOKs != nil { + if true { + buf.WriteString(`"ReasmOKs":`) + fflib.FormatBits2(buf, uint64(*mj.ReasmOKs), 10, *mj.ReasmOKs < 0) + buf.WriteByte(',') + } + } + if mj.ReasmFails != nil { + if true { + buf.WriteString(`"ReasmFails":`) + fflib.FormatBits2(buf, uint64(*mj.ReasmFails), 10, *mj.ReasmFails < 0) + buf.WriteByte(',') + } + } + if mj.FragOKs != nil { + if true { + buf.WriteString(`"FragOKs":`) + fflib.FormatBits2(buf, uint64(*mj.FragOKs), 10, *mj.FragOKs < 0) + buf.WriteByte(',') + } + } + if mj.FragFails != nil { + if true { + buf.WriteString(`"FragFails":`) + fflib.FormatBits2(buf, uint64(*mj.FragFails), 10, *mj.FragFails < 0) + buf.WriteByte(',') + } + } + if mj.FragCreates != nil { + if true { + buf.WriteString(`"FragCreates":`) + fflib.FormatBits2(buf, uint64(*mj.FragCreates), 10, *mj.FragCreates < 0) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_IpStatisticsbase = iota + ffj_t_IpStatisticsno_such_key + + ffj_t_IpStatistics_Forwarding + + ffj_t_IpStatistics_DefaultTTL + + ffj_t_IpStatistics_InReceives + + ffj_t_IpStatistics_InHdrErrors + + ffj_t_IpStatistics_InAddrErrors + + ffj_t_IpStatistics_ForwDatagrams + + ffj_t_IpStatistics_InUnknownProtos + + ffj_t_IpStatistics_InDiscards + + ffj_t_IpStatistics_InDelivers + + ffj_t_IpStatistics_OutRequests + + ffj_t_IpStatistics_OutDiscards + + ffj_t_IpStatistics_OutNoRoutes + + ffj_t_IpStatistics_ReasmTimeout + + ffj_t_IpStatistics_ReasmReqds + + ffj_t_IpStatistics_ReasmOKs + + ffj_t_IpStatistics_ReasmFails + + ffj_t_IpStatistics_FragOKs + + ffj_t_IpStatistics_FragFails + + ffj_t_IpStatistics_FragCreates +) + +var ffj_key_IpStatistics_Forwarding = []byte("Forwarding") + +var ffj_key_IpStatistics_DefaultTTL = []byte("DefaultTTL") + +var ffj_key_IpStatistics_InReceives = []byte("InReceives") + +var ffj_key_IpStatistics_InHdrErrors = []byte("InHdrErrors") + +var ffj_key_IpStatistics_InAddrErrors = []byte("InAddrErrors") + +var ffj_key_IpStatistics_ForwDatagrams = []byte("ForwDatagrams") + +var ffj_key_IpStatistics_InUnknownProtos = []byte("InUnknownProtos") + +var ffj_key_IpStatistics_InDiscards = []byte("InDiscards") + +var ffj_key_IpStatistics_InDelivers = []byte("InDelivers") + +var ffj_key_IpStatistics_OutRequests = []byte("OutRequests") + +var ffj_key_IpStatistics_OutDiscards = []byte("OutDiscards") + +var ffj_key_IpStatistics_OutNoRoutes = []byte("OutNoRoutes") + +var ffj_key_IpStatistics_ReasmTimeout = []byte("ReasmTimeout") + +var ffj_key_IpStatistics_ReasmReqds = []byte("ReasmReqds") + +var ffj_key_IpStatistics_ReasmOKs = []byte("ReasmOKs") + +var ffj_key_IpStatistics_ReasmFails = []byte("ReasmFails") + +var ffj_key_IpStatistics_FragOKs = []byte("FragOKs") + +var ffj_key_IpStatistics_FragFails = []byte("FragFails") + +var ffj_key_IpStatistics_FragCreates = []byte("FragCreates") + +func (uj *IpStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *IpStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_IpStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_IpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'D': + + if bytes.Equal(ffj_key_IpStatistics_DefaultTTL, kn) { + currentKey = ffj_t_IpStatistics_DefaultTTL + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'F': + + if bytes.Equal(ffj_key_IpStatistics_Forwarding, kn) { + currentKey = ffj_t_IpStatistics_Forwarding + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_ForwDatagrams, kn) { + currentKey = ffj_t_IpStatistics_ForwDatagrams + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_FragOKs, kn) { + currentKey = ffj_t_IpStatistics_FragOKs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_FragFails, kn) { + currentKey = ffj_t_IpStatistics_FragFails + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_FragCreates, kn) { + currentKey = ffj_t_IpStatistics_FragCreates + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'I': + + if bytes.Equal(ffj_key_IpStatistics_InReceives, kn) { + currentKey = ffj_t_IpStatistics_InReceives + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_InHdrErrors, kn) { + currentKey = ffj_t_IpStatistics_InHdrErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_InAddrErrors, kn) { + currentKey = ffj_t_IpStatistics_InAddrErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_InUnknownProtos, kn) { + currentKey = ffj_t_IpStatistics_InUnknownProtos + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_InDiscards, kn) { + currentKey = ffj_t_IpStatistics_InDiscards + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_InDelivers, kn) { + currentKey = ffj_t_IpStatistics_InDelivers + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'O': + + if bytes.Equal(ffj_key_IpStatistics_OutRequests, kn) { + currentKey = ffj_t_IpStatistics_OutRequests + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_OutDiscards, kn) { + currentKey = ffj_t_IpStatistics_OutDiscards + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_OutNoRoutes, kn) { + currentKey = ffj_t_IpStatistics_OutNoRoutes + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'R': + + if bytes.Equal(ffj_key_IpStatistics_ReasmTimeout, kn) { + currentKey = ffj_t_IpStatistics_ReasmTimeout + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_ReasmReqds, kn) { + currentKey = ffj_t_IpStatistics_ReasmReqds + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_ReasmOKs, kn) { + currentKey = ffj_t_IpStatistics_ReasmOKs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_IpStatistics_ReasmFails, kn) { + currentKey = ffj_t_IpStatistics_ReasmFails + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_FragCreates, kn) { + currentKey = ffj_t_IpStatistics_FragCreates + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_FragFails, kn) { + currentKey = ffj_t_IpStatistics_FragFails + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_FragOKs, kn) { + currentKey = ffj_t_IpStatistics_FragOKs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_ReasmFails, kn) { + currentKey = ffj_t_IpStatistics_ReasmFails + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_ReasmOKs, kn) { + currentKey = ffj_t_IpStatistics_ReasmOKs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_ReasmReqds, kn) { + currentKey = ffj_t_IpStatistics_ReasmReqds + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_ReasmTimeout, kn) { + currentKey = ffj_t_IpStatistics_ReasmTimeout + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_OutNoRoutes, kn) { + currentKey = ffj_t_IpStatistics_OutNoRoutes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_OutDiscards, kn) { + currentKey = ffj_t_IpStatistics_OutDiscards + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_OutRequests, kn) { + currentKey = ffj_t_IpStatistics_OutRequests + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_InDelivers, kn) { + currentKey = ffj_t_IpStatistics_InDelivers + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_InDiscards, kn) { + currentKey = ffj_t_IpStatistics_InDiscards + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_InUnknownProtos, kn) { + currentKey = ffj_t_IpStatistics_InUnknownProtos + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_ForwDatagrams, kn) { + currentKey = ffj_t_IpStatistics_ForwDatagrams + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_InAddrErrors, kn) { + currentKey = ffj_t_IpStatistics_InAddrErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_InHdrErrors, kn) { + currentKey = ffj_t_IpStatistics_InHdrErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_IpStatistics_InReceives, kn) { + currentKey = ffj_t_IpStatistics_InReceives + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_IpStatistics_DefaultTTL, kn) { + currentKey = ffj_t_IpStatistics_DefaultTTL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_IpStatistics_Forwarding, kn) { + currentKey = ffj_t_IpStatistics_Forwarding + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_IpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_IpStatistics_Forwarding: + goto handle_Forwarding + + case ffj_t_IpStatistics_DefaultTTL: + goto handle_DefaultTTL + + case ffj_t_IpStatistics_InReceives: + goto handle_InReceives + + case ffj_t_IpStatistics_InHdrErrors: + goto handle_InHdrErrors + + case ffj_t_IpStatistics_InAddrErrors: + goto handle_InAddrErrors + + case ffj_t_IpStatistics_ForwDatagrams: + goto handle_ForwDatagrams + + case ffj_t_IpStatistics_InUnknownProtos: + goto handle_InUnknownProtos + + case ffj_t_IpStatistics_InDiscards: + goto handle_InDiscards + + case ffj_t_IpStatistics_InDelivers: + goto handle_InDelivers + + case ffj_t_IpStatistics_OutRequests: + goto handle_OutRequests + + case ffj_t_IpStatistics_OutDiscards: + goto handle_OutDiscards + + case ffj_t_IpStatistics_OutNoRoutes: + goto handle_OutNoRoutes + + case ffj_t_IpStatistics_ReasmTimeout: + goto handle_ReasmTimeout + + case ffj_t_IpStatistics_ReasmReqds: + goto handle_ReasmReqds + + case ffj_t_IpStatistics_ReasmOKs: + goto handle_ReasmOKs + + case ffj_t_IpStatistics_ReasmFails: + goto handle_ReasmFails + + case ffj_t_IpStatistics_FragOKs: + goto handle_FragOKs + + case ffj_t_IpStatistics_FragFails: + goto handle_FragFails + + case ffj_t_IpStatistics_FragCreates: + goto handle_FragCreates + + case ffj_t_IpStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Forwarding: + + /* handler: uj.Forwarding type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Forwarding = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.Forwarding = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DefaultTTL: + + /* handler: uj.DefaultTTL type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DefaultTTL = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.DefaultTTL = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InReceives: + + /* handler: uj.InReceives type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InReceives = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InReceives = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InHdrErrors: + + /* handler: uj.InHdrErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InHdrErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InHdrErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InAddrErrors: + + /* handler: uj.InAddrErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InAddrErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InAddrErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ForwDatagrams: + + /* handler: uj.ForwDatagrams type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ForwDatagrams = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.ForwDatagrams = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InUnknownProtos: + + /* handler: uj.InUnknownProtos type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InUnknownProtos = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InUnknownProtos = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InDiscards: + + /* handler: uj.InDiscards type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InDiscards = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InDiscards = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InDelivers: + + /* handler: uj.InDelivers type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InDelivers = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InDelivers = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutRequests: + + /* handler: uj.OutRequests type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutRequests = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutRequests = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutDiscards: + + /* handler: uj.OutDiscards type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutDiscards = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutDiscards = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutNoRoutes: + + /* handler: uj.OutNoRoutes type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutNoRoutes = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutNoRoutes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ReasmTimeout: + + /* handler: uj.ReasmTimeout type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ReasmTimeout = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.ReasmTimeout = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ReasmReqds: + + /* handler: uj.ReasmReqds type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ReasmReqds = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.ReasmReqds = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ReasmOKs: + + /* handler: uj.ReasmOKs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ReasmOKs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.ReasmOKs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ReasmFails: + + /* handler: uj.ReasmFails type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ReasmFails = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.ReasmFails = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FragOKs: + + /* handler: uj.FragOKs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.FragOKs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.FragOKs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FragFails: + + /* handler: uj.FragFails type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.FragFails = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.FragFails = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FragCreates: + + /* handler: uj.FragCreates type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.FragCreates = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.FragCreates = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *KillPolicy) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *KillPolicy) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.GracePeriod != nil { + if true { + buf.WriteString(`"grace_period":`) + + { + + err = mj.GracePeriod.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_KillPolicybase = iota + ffj_t_KillPolicyno_such_key + + ffj_t_KillPolicy_GracePeriod +) + +var ffj_key_KillPolicy_GracePeriod = []byte("grace_period") + +func (uj *KillPolicy) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *KillPolicy) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_KillPolicybase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_KillPolicyno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'g': + + if bytes.Equal(ffj_key_KillPolicy_GracePeriod, kn) { + currentKey = ffj_t_KillPolicy_GracePeriod + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_KillPolicy_GracePeriod, kn) { + currentKey = ffj_t_KillPolicy_GracePeriod + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_KillPolicyno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_KillPolicy_GracePeriod: + goto handle_GracePeriod + + case ffj_t_KillPolicyno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_GracePeriod: + + /* handler: uj.GracePeriod type=mesos.DurationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GracePeriod = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GracePeriod == nil { + uj.GracePeriod = new(DurationInfo) + } + + err = uj.GracePeriod.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Label) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Label) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "key":`) + fflib.WriteJsonString(buf, string(mj.Key)) + buf.WriteByte(',') + if mj.Value != nil { + if true { + buf.WriteString(`"value":`) + fflib.WriteJsonString(buf, string(*mj.Value)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Labelbase = iota + ffj_t_Labelno_such_key + + ffj_t_Label_Key + + ffj_t_Label_Value +) + +var ffj_key_Label_Key = []byte("key") + +var ffj_key_Label_Value = []byte("value") + +func (uj *Label) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Label) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Labelbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Labelno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'k': + + if bytes.Equal(ffj_key_Label_Key, kn) { + currentKey = ffj_t_Label_Key + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Label_Value, kn) { + currentKey = ffj_t_Label_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Label_Value, kn) { + currentKey = ffj_t_Label_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Label_Key, kn) { + currentKey = ffj_t_Label_Key + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Labelno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Label_Key: + goto handle_Key + + case ffj_t_Label_Value: + goto handle_Value + + case ffj_t_Labelno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Key: + + /* handler: uj.Key type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Key = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Value = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Value = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Labels) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Labels) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"labels":`) + if mj.Labels != nil { + buf.WriteString(`[`) + for i, v := range mj.Labels { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Labelsbase = iota + ffj_t_Labelsno_such_key + + ffj_t_Labels_Labels +) + +var ffj_key_Labels_Labels = []byte("labels") + +func (uj *Labels) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Labels) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Labelsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Labelsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'l': + + if bytes.Equal(ffj_key_Labels_Labels, kn) { + currentKey = ffj_t_Labels_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Labels_Labels, kn) { + currentKey = ffj_t_Labels_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Labelsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Labels_Labels: + goto handle_Labels + + case ffj_t_Labelsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Labels: + + /* handler: uj.Labels type=[]mesos.Label kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Labels = nil + } else { + + uj.Labels = []Label{} + + wantVal := true + + for { + + var tmp_uj__Labels Label + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Labels type=mesos.Label kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Labels = append(uj.Labels, tmp_uj__Labels) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *LinuxInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *LinuxInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.CapabilityInfo != nil { + if true { + buf.WriteString(`"capability_info":`) + + { + + err = mj.CapabilityInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.BoundingCapabilities != nil { + if true { + buf.WriteString(`"bounding_capabilities":`) + + { + + err = mj.BoundingCapabilities.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.EffectiveCapabilities != nil { + if true { + buf.WriteString(`"effective_capabilities":`) + + { + + err = mj.EffectiveCapabilities.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.SharePIDNamespace != nil { + if true { + if *mj.SharePIDNamespace { + buf.WriteString(`"share_pid_namespace":true`) + } else { + buf.WriteString(`"share_pid_namespace":false`) + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_LinuxInfobase = iota + ffj_t_LinuxInfono_such_key + + ffj_t_LinuxInfo_CapabilityInfo + + ffj_t_LinuxInfo_BoundingCapabilities + + ffj_t_LinuxInfo_EffectiveCapabilities + + ffj_t_LinuxInfo_SharePIDNamespace +) + +var ffj_key_LinuxInfo_CapabilityInfo = []byte("capability_info") + +var ffj_key_LinuxInfo_BoundingCapabilities = []byte("bounding_capabilities") + +var ffj_key_LinuxInfo_EffectiveCapabilities = []byte("effective_capabilities") + +var ffj_key_LinuxInfo_SharePIDNamespace = []byte("share_pid_namespace") + +func (uj *LinuxInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *LinuxInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_LinuxInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_LinuxInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'b': + + if bytes.Equal(ffj_key_LinuxInfo_BoundingCapabilities, kn) { + currentKey = ffj_t_LinuxInfo_BoundingCapabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_LinuxInfo_CapabilityInfo, kn) { + currentKey = ffj_t_LinuxInfo_CapabilityInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_LinuxInfo_EffectiveCapabilities, kn) { + currentKey = ffj_t_LinuxInfo_EffectiveCapabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_LinuxInfo_SharePIDNamespace, kn) { + currentKey = ffj_t_LinuxInfo_SharePIDNamespace + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_LinuxInfo_SharePIDNamespace, kn) { + currentKey = ffj_t_LinuxInfo_SharePIDNamespace + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_LinuxInfo_EffectiveCapabilities, kn) { + currentKey = ffj_t_LinuxInfo_EffectiveCapabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_LinuxInfo_BoundingCapabilities, kn) { + currentKey = ffj_t_LinuxInfo_BoundingCapabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_LinuxInfo_CapabilityInfo, kn) { + currentKey = ffj_t_LinuxInfo_CapabilityInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_LinuxInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_LinuxInfo_CapabilityInfo: + goto handle_CapabilityInfo + + case ffj_t_LinuxInfo_BoundingCapabilities: + goto handle_BoundingCapabilities + + case ffj_t_LinuxInfo_EffectiveCapabilities: + goto handle_EffectiveCapabilities + + case ffj_t_LinuxInfo_SharePIDNamespace: + goto handle_SharePIDNamespace + + case ffj_t_LinuxInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_CapabilityInfo: + + /* handler: uj.CapabilityInfo type=mesos.CapabilityInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.CapabilityInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.CapabilityInfo == nil { + uj.CapabilityInfo = new(CapabilityInfo) + } + + err = uj.CapabilityInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BoundingCapabilities: + + /* handler: uj.BoundingCapabilities type=mesos.CapabilityInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.BoundingCapabilities = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.BoundingCapabilities == nil { + uj.BoundingCapabilities = new(CapabilityInfo) + } + + err = uj.BoundingCapabilities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_EffectiveCapabilities: + + /* handler: uj.EffectiveCapabilities type=mesos.CapabilityInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.EffectiveCapabilities = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.EffectiveCapabilities == nil { + uj.EffectiveCapabilities = new(CapabilityInfo) + } + + err = uj.EffectiveCapabilities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_SharePIDNamespace: + + /* handler: uj.SharePIDNamespace type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.SharePIDNamespace = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.SharePIDNamespace = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *MachineID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *MachineID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Hostname != nil { + if true { + buf.WriteString(`"hostname":`) + fflib.WriteJsonString(buf, string(*mj.Hostname)) + buf.WriteByte(',') + } + } + if mj.IP != nil { + if true { + buf.WriteString(`"ip":`) + fflib.WriteJsonString(buf, string(*mj.IP)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_MachineIDbase = iota + ffj_t_MachineIDno_such_key + + ffj_t_MachineID_Hostname + + ffj_t_MachineID_IP +) + +var ffj_key_MachineID_Hostname = []byte("hostname") + +var ffj_key_MachineID_IP = []byte("ip") + +func (uj *MachineID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *MachineID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_MachineIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_MachineIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffj_key_MachineID_Hostname, kn) { + currentKey = ffj_t_MachineID_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_MachineID_IP, kn) { + currentKey = ffj_t_MachineID_IP + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_MachineID_IP, kn) { + currentKey = ffj_t_MachineID_IP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_MachineID_Hostname, kn) { + currentKey = ffj_t_MachineID_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_MachineIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_MachineID_Hostname: + goto handle_Hostname + + case ffj_t_MachineID_IP: + goto handle_IP + + case ffj_t_MachineIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Hostname: + + /* handler: uj.Hostname type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Hostname = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Hostname = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IP: + + /* handler: uj.IP type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.IP = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.IP = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *MachineInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *MachineInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "id":`) + + { + + err = mj.ID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Mode != nil { + if true { + buf.WriteString(`"mode":`) + + { + + obj, err = mj.Mode.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Unavailability != nil { + if true { + buf.WriteString(`"unavailability":`) + + { + + err = mj.Unavailability.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_MachineInfobase = iota + ffj_t_MachineInfono_such_key + + ffj_t_MachineInfo_ID + + ffj_t_MachineInfo_Mode + + ffj_t_MachineInfo_Unavailability +) + +var ffj_key_MachineInfo_ID = []byte("id") + +var ffj_key_MachineInfo_Mode = []byte("mode") + +var ffj_key_MachineInfo_Unavailability = []byte("unavailability") + +func (uj *MachineInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *MachineInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_MachineInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_MachineInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_MachineInfo_ID, kn) { + currentKey = ffj_t_MachineInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_MachineInfo_Mode, kn) { + currentKey = ffj_t_MachineInfo_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_MachineInfo_Unavailability, kn) { + currentKey = ffj_t_MachineInfo_Unavailability + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_MachineInfo_Unavailability, kn) { + currentKey = ffj_t_MachineInfo_Unavailability + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_MachineInfo_Mode, kn) { + currentKey = ffj_t_MachineInfo_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_MachineInfo_ID, kn) { + currentKey = ffj_t_MachineInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_MachineInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_MachineInfo_ID: + goto handle_ID + + case ffj_t_MachineInfo_Mode: + goto handle_Mode + + case ffj_t_MachineInfo_Unavailability: + goto handle_Unavailability + + case ffj_t_MachineInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ID: + + /* handler: uj.ID type=mesos.MachineID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Mode: + + /* handler: uj.Mode type=mesos.MachineInfo_Mode kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Mode = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Mode == nil { + uj.Mode = new(MachineInfo_Mode) + } + + err = uj.Mode.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Unavailability: + + /* handler: uj.Unavailability type=mesos.Unavailability kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Unavailability = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Unavailability == nil { + uj.Unavailability = new(Unavailability) + } + + err = uj.Unavailability.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *MasterInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *MasterInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"id":`) + fflib.WriteJsonString(buf, string(mj.ID)) + buf.WriteString(`,"ip":`) + fflib.FormatBits2(buf, uint64(mj.IP), 10, false) + buf.WriteByte(',') + if mj.Port != nil { + if true { + buf.WriteString(`"port":`) + fflib.FormatBits2(buf, uint64(*mj.Port), 10, false) + buf.WriteByte(',') + } + } + if mj.PID != nil { + if true { + buf.WriteString(`"pid":`) + fflib.WriteJsonString(buf, string(*mj.PID)) + buf.WriteByte(',') + } + } + if mj.Hostname != nil { + if true { + buf.WriteString(`"hostname":`) + fflib.WriteJsonString(buf, string(*mj.Hostname)) + buf.WriteByte(',') + } + } + if mj.Version != nil { + if true { + buf.WriteString(`"version":`) + fflib.WriteJsonString(buf, string(*mj.Version)) + buf.WriteByte(',') + } + } + if mj.Address != nil { + if true { + buf.WriteString(`"address":`) + + { + + err = mj.Address.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Domain != nil { + if true { + buf.WriteString(`"domain":`) + + { + + err = mj.Domain.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"capabilities":`) + if mj.Capabilities != nil { + buf.WriteString(`[`) + for i, v := range mj.Capabilities { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_MasterInfobase = iota + ffj_t_MasterInfono_such_key + + ffj_t_MasterInfo_ID + + ffj_t_MasterInfo_IP + + ffj_t_MasterInfo_Port + + ffj_t_MasterInfo_PID + + ffj_t_MasterInfo_Hostname + + ffj_t_MasterInfo_Version + + ffj_t_MasterInfo_Address + + ffj_t_MasterInfo_Domain + + ffj_t_MasterInfo_Capabilities +) + +var ffj_key_MasterInfo_ID = []byte("id") + +var ffj_key_MasterInfo_IP = []byte("ip") + +var ffj_key_MasterInfo_Port = []byte("port") + +var ffj_key_MasterInfo_PID = []byte("pid") + +var ffj_key_MasterInfo_Hostname = []byte("hostname") + +var ffj_key_MasterInfo_Version = []byte("version") + +var ffj_key_MasterInfo_Address = []byte("address") + +var ffj_key_MasterInfo_Domain = []byte("domain") + +var ffj_key_MasterInfo_Capabilities = []byte("capabilities") + +func (uj *MasterInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *MasterInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_MasterInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_MasterInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_MasterInfo_Address, kn) { + currentKey = ffj_t_MasterInfo_Address + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_MasterInfo_Capabilities, kn) { + currentKey = ffj_t_MasterInfo_Capabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_MasterInfo_Domain, kn) { + currentKey = ffj_t_MasterInfo_Domain + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_MasterInfo_Hostname, kn) { + currentKey = ffj_t_MasterInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_MasterInfo_ID, kn) { + currentKey = ffj_t_MasterInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_MasterInfo_IP, kn) { + currentKey = ffj_t_MasterInfo_IP + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_MasterInfo_Port, kn) { + currentKey = ffj_t_MasterInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_MasterInfo_PID, kn) { + currentKey = ffj_t_MasterInfo_PID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_MasterInfo_Version, kn) { + currentKey = ffj_t_MasterInfo_Version + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_MasterInfo_Capabilities, kn) { + currentKey = ffj_t_MasterInfo_Capabilities + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_MasterInfo_Domain, kn) { + currentKey = ffj_t_MasterInfo_Domain + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_MasterInfo_Address, kn) { + currentKey = ffj_t_MasterInfo_Address + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_MasterInfo_Version, kn) { + currentKey = ffj_t_MasterInfo_Version + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_MasterInfo_Hostname, kn) { + currentKey = ffj_t_MasterInfo_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_MasterInfo_PID, kn) { + currentKey = ffj_t_MasterInfo_PID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_MasterInfo_Port, kn) { + currentKey = ffj_t_MasterInfo_Port + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_MasterInfo_IP, kn) { + currentKey = ffj_t_MasterInfo_IP + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_MasterInfo_ID, kn) { + currentKey = ffj_t_MasterInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_MasterInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_MasterInfo_ID: + goto handle_ID + + case ffj_t_MasterInfo_IP: + goto handle_IP + + case ffj_t_MasterInfo_Port: + goto handle_Port + + case ffj_t_MasterInfo_PID: + goto handle_PID + + case ffj_t_MasterInfo_Hostname: + goto handle_Hostname + + case ffj_t_MasterInfo_Version: + goto handle_Version + + case ffj_t_MasterInfo_Address: + goto handle_Address + + case ffj_t_MasterInfo_Domain: + goto handle_Domain + + case ffj_t_MasterInfo_Capabilities: + goto handle_Capabilities + + case ffj_t_MasterInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ID: + + /* handler: uj.ID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ID = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IP: + + /* handler: uj.IP type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.IP = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Port: + + /* handler: uj.Port type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Port = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.Port = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_PID: + + /* handler: uj.PID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.PID = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.PID = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Hostname: + + /* handler: uj.Hostname type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Hostname = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Hostname = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Version: + + /* handler: uj.Version type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Version = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Version = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Address: + + /* handler: uj.Address type=mesos.Address kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Address = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Address == nil { + uj.Address = new(Address) + } + + err = uj.Address.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Domain: + + /* handler: uj.Domain type=mesos.DomainInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Domain = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Domain == nil { + uj.Domain = new(DomainInfo) + } + + err = uj.Domain.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Capabilities: + + /* handler: uj.Capabilities type=[]mesos.MasterInfo_Capability kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Capabilities = nil + } else { + + uj.Capabilities = []MasterInfo_Capability{} + + wantVal := true + + for { + + var tmp_uj__Capabilities MasterInfo_Capability + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Capabilities type=mesos.MasterInfo_Capability kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Capabilities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Capabilities = append(uj.Capabilities, tmp_uj__Capabilities) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *MasterInfo_Capability) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *MasterInfo_Capability) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_MasterInfo_Capabilitybase = iota + ffj_t_MasterInfo_Capabilityno_such_key + + ffj_t_MasterInfo_Capability_Type +) + +var ffj_key_MasterInfo_Capability_Type = []byte("type") + +func (uj *MasterInfo_Capability) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *MasterInfo_Capability) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_MasterInfo_Capabilitybase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_MasterInfo_Capabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 't': + + if bytes.Equal(ffj_key_MasterInfo_Capability_Type, kn) { + currentKey = ffj_t_MasterInfo_Capability_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_MasterInfo_Capability_Type, kn) { + currentKey = ffj_t_MasterInfo_Capability_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_MasterInfo_Capabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_MasterInfo_Capability_Type: + goto handle_Type + + case ffj_t_MasterInfo_Capabilityno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.MasterInfo_Capability_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Metric) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Metric) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.Value != nil { + if true { + buf.WriteString(`"value":`) + fflib.AppendFloat(buf, float64(*mj.Value), 'g', -1, 64) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Metricbase = iota + ffj_t_Metricno_such_key + + ffj_t_Metric_Name + + ffj_t_Metric_Value +) + +var ffj_key_Metric_Name = []byte("name") + +var ffj_key_Metric_Value = []byte("value") + +func (uj *Metric) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Metric) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Metricbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Metricno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_Metric_Name, kn) { + currentKey = ffj_t_Metric_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Metric_Value, kn) { + currentKey = ffj_t_Metric_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Metric_Value, kn) { + currentKey = ffj_t_Metric_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Metric_Name, kn) { + currentKey = ffj_t_Metric_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Metricno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Metric_Name: + goto handle_Name + + case ffj_t_Metric_Value: + goto handle_Value + + case ffj_t_Metricno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Value = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.Value = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *MountPropagation) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *MountPropagation) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Mode != nil { + if true { + buf.WriteString(`"mode":`) + + { + + obj, err = mj.Mode.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_MountPropagationbase = iota + ffj_t_MountPropagationno_such_key + + ffj_t_MountPropagation_Mode +) + +var ffj_key_MountPropagation_Mode = []byte("mode") + +func (uj *MountPropagation) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *MountPropagation) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_MountPropagationbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_MountPropagationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'm': + + if bytes.Equal(ffj_key_MountPropagation_Mode, kn) { + currentKey = ffj_t_MountPropagation_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_MountPropagation_Mode, kn) { + currentKey = ffj_t_MountPropagation_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_MountPropagationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_MountPropagation_Mode: + goto handle_Mode + + case ffj_t_MountPropagationno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Mode: + + /* handler: uj.Mode type=mesos.MountPropagation_Mode kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Mode = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Mode == nil { + uj.Mode = new(MountPropagation_Mode) + } + + err = uj.Mode.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *NetworkInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *NetworkInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"ip_addresses":`) + if mj.IPAddresses != nil { + buf.WriteString(`[`) + for i, v := range mj.IPAddresses { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Name != nil { + if true { + buf.WriteString(`"name":`) + fflib.WriteJsonString(buf, string(*mj.Name)) + buf.WriteByte(',') + } + } + if len(mj.Groups) != 0 { + buf.WriteString(`"groups":`) + if mj.Groups != nil { + buf.WriteString(`[`) + for i, v := range mj.Groups { + if i != 0 { + buf.WriteString(`,`) + } + fflib.WriteJsonString(buf, string(v)) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"port_mappings":`) + if mj.PortMappings != nil { + buf.WriteString(`[`) + for i, v := range mj.PortMappings { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_NetworkInfobase = iota + ffj_t_NetworkInfono_such_key + + ffj_t_NetworkInfo_IPAddresses + + ffj_t_NetworkInfo_Name + + ffj_t_NetworkInfo_Groups + + ffj_t_NetworkInfo_Labels + + ffj_t_NetworkInfo_PortMappings +) + +var ffj_key_NetworkInfo_IPAddresses = []byte("ip_addresses") + +var ffj_key_NetworkInfo_Name = []byte("name") + +var ffj_key_NetworkInfo_Groups = []byte("groups") + +var ffj_key_NetworkInfo_Labels = []byte("labels") + +var ffj_key_NetworkInfo_PortMappings = []byte("port_mappings") + +func (uj *NetworkInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *NetworkInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_NetworkInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_NetworkInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'g': + + if bytes.Equal(ffj_key_NetworkInfo_Groups, kn) { + currentKey = ffj_t_NetworkInfo_Groups + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_NetworkInfo_IPAddresses, kn) { + currentKey = ffj_t_NetworkInfo_IPAddresses + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_NetworkInfo_Labels, kn) { + currentKey = ffj_t_NetworkInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_NetworkInfo_Name, kn) { + currentKey = ffj_t_NetworkInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_NetworkInfo_PortMappings, kn) { + currentKey = ffj_t_NetworkInfo_PortMappings + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_NetworkInfo_PortMappings, kn) { + currentKey = ffj_t_NetworkInfo_PortMappings + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_NetworkInfo_Labels, kn) { + currentKey = ffj_t_NetworkInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_NetworkInfo_Groups, kn) { + currentKey = ffj_t_NetworkInfo_Groups + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_NetworkInfo_Name, kn) { + currentKey = ffj_t_NetworkInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_NetworkInfo_IPAddresses, kn) { + currentKey = ffj_t_NetworkInfo_IPAddresses + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_NetworkInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_NetworkInfo_IPAddresses: + goto handle_IPAddresses + + case ffj_t_NetworkInfo_Name: + goto handle_Name + + case ffj_t_NetworkInfo_Groups: + goto handle_Groups + + case ffj_t_NetworkInfo_Labels: + goto handle_Labels + + case ffj_t_NetworkInfo_PortMappings: + goto handle_PortMappings + + case ffj_t_NetworkInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_IPAddresses: + + /* handler: uj.IPAddresses type=[]mesos.NetworkInfo_IPAddress kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.IPAddresses = nil + } else { + + uj.IPAddresses = []NetworkInfo_IPAddress{} + + wantVal := true + + for { + + var tmp_uj__IPAddresses NetworkInfo_IPAddress + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__IPAddresses type=mesos.NetworkInfo_IPAddress kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__IPAddresses.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.IPAddresses = append(uj.IPAddresses, tmp_uj__IPAddresses) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Name = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Name = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Groups: + + /* handler: uj.Groups type=[]string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Groups = nil + } else { + + uj.Groups = []string{} + + wantVal := true + + for { + + var tmp_uj__Groups string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Groups type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + tmp_uj__Groups = string(string(outBuf)) + + } + } + + uj.Groups = append(uj.Groups, tmp_uj__Groups) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_PortMappings: + + /* handler: uj.PortMappings type=[]mesos.NetworkInfo_PortMapping kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.PortMappings = nil + } else { + + uj.PortMappings = []NetworkInfo_PortMapping{} + + wantVal := true + + for { + + var tmp_uj__PortMappings NetworkInfo_PortMapping + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__PortMappings type=mesos.NetworkInfo_PortMapping kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__PortMappings.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.PortMappings = append(uj.PortMappings, tmp_uj__PortMappings) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *NetworkInfo_IPAddress) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *NetworkInfo_IPAddress) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Protocol != nil { + if true { + buf.WriteString(`"protocol":`) + + { + + obj, err = mj.Protocol.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.IPAddress != nil { + if true { + buf.WriteString(`"ip_address":`) + fflib.WriteJsonString(buf, string(*mj.IPAddress)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_NetworkInfo_IPAddressbase = iota + ffj_t_NetworkInfo_IPAddressno_such_key + + ffj_t_NetworkInfo_IPAddress_Protocol + + ffj_t_NetworkInfo_IPAddress_IPAddress +) + +var ffj_key_NetworkInfo_IPAddress_Protocol = []byte("protocol") + +var ffj_key_NetworkInfo_IPAddress_IPAddress = []byte("ip_address") + +func (uj *NetworkInfo_IPAddress) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *NetworkInfo_IPAddress) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_NetworkInfo_IPAddressbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_NetworkInfo_IPAddressno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_NetworkInfo_IPAddress_IPAddress, kn) { + currentKey = ffj_t_NetworkInfo_IPAddress_IPAddress + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_NetworkInfo_IPAddress_Protocol, kn) { + currentKey = ffj_t_NetworkInfo_IPAddress_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_NetworkInfo_IPAddress_IPAddress, kn) { + currentKey = ffj_t_NetworkInfo_IPAddress_IPAddress + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_NetworkInfo_IPAddress_Protocol, kn) { + currentKey = ffj_t_NetworkInfo_IPAddress_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_NetworkInfo_IPAddressno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_NetworkInfo_IPAddress_Protocol: + goto handle_Protocol + + case ffj_t_NetworkInfo_IPAddress_IPAddress: + goto handle_IPAddress + + case ffj_t_NetworkInfo_IPAddressno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Protocol: + + /* handler: uj.Protocol type=mesos.NetworkInfo_Protocol kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Protocol = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Protocol == nil { + uj.Protocol = new(NetworkInfo_Protocol) + } + + err = uj.Protocol.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IPAddress: + + /* handler: uj.IPAddress type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.IPAddress = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.IPAddress = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *NetworkInfo_PortMapping) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *NetworkInfo_PortMapping) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "host_port":`) + fflib.FormatBits2(buf, uint64(mj.HostPort), 10, false) + buf.WriteString(`,"container_port":`) + fflib.FormatBits2(buf, uint64(mj.ContainerPort), 10, false) + buf.WriteByte(',') + if mj.Protocol != nil { + if true { + buf.WriteString(`"protocol":`) + fflib.WriteJsonString(buf, string(*mj.Protocol)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_NetworkInfo_PortMappingbase = iota + ffj_t_NetworkInfo_PortMappingno_such_key + + ffj_t_NetworkInfo_PortMapping_HostPort + + ffj_t_NetworkInfo_PortMapping_ContainerPort + + ffj_t_NetworkInfo_PortMapping_Protocol +) + +var ffj_key_NetworkInfo_PortMapping_HostPort = []byte("host_port") + +var ffj_key_NetworkInfo_PortMapping_ContainerPort = []byte("container_port") + +var ffj_key_NetworkInfo_PortMapping_Protocol = []byte("protocol") + +func (uj *NetworkInfo_PortMapping) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *NetworkInfo_PortMapping) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_NetworkInfo_PortMappingbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_NetworkInfo_PortMappingno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_NetworkInfo_PortMapping_ContainerPort, kn) { + currentKey = ffj_t_NetworkInfo_PortMapping_ContainerPort + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_NetworkInfo_PortMapping_HostPort, kn) { + currentKey = ffj_t_NetworkInfo_PortMapping_HostPort + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_NetworkInfo_PortMapping_Protocol, kn) { + currentKey = ffj_t_NetworkInfo_PortMapping_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_NetworkInfo_PortMapping_Protocol, kn) { + currentKey = ffj_t_NetworkInfo_PortMapping_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_NetworkInfo_PortMapping_ContainerPort, kn) { + currentKey = ffj_t_NetworkInfo_PortMapping_ContainerPort + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_NetworkInfo_PortMapping_HostPort, kn) { + currentKey = ffj_t_NetworkInfo_PortMapping_HostPort + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_NetworkInfo_PortMappingno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_NetworkInfo_PortMapping_HostPort: + goto handle_HostPort + + case ffj_t_NetworkInfo_PortMapping_ContainerPort: + goto handle_ContainerPort + + case ffj_t_NetworkInfo_PortMapping_Protocol: + goto handle_Protocol + + case ffj_t_NetworkInfo_PortMappingno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_HostPort: + + /* handler: uj.HostPort type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.HostPort = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerPort: + + /* handler: uj.ContainerPort type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.ContainerPort = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Protocol: + + /* handler: uj.Protocol type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Protocol = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Protocol = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "id":`) + + { + + err = mj.ID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"framework_id":`) + + { + + err = mj.FrameworkID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"agent_id":`) + + { + + err = mj.AgentID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"hostname":`) + fflib.WriteJsonString(buf, string(mj.Hostname)) + buf.WriteByte(',') + if mj.URL != nil { + if true { + buf.WriteString(`"url":`) + + { + + err = mj.URL.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Domain != nil { + if true { + buf.WriteString(`"domain":`) + + { + + err = mj.Domain.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"attributes":`) + if mj.Attributes != nil { + buf.WriteString(`[`) + for i, v := range mj.Attributes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"executor_ids":`) + if mj.ExecutorIDs != nil { + buf.WriteString(`[`) + for i, v := range mj.ExecutorIDs { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Unavailability != nil { + if true { + buf.WriteString(`"unavailability":`) + + { + + err = mj.Unavailability.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.AllocationInfo != nil { + if true { + buf.WriteString(`"allocation_info":`) + + { + + err = mj.AllocationInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offerbase = iota + ffj_t_Offerno_such_key + + ffj_t_Offer_ID + + ffj_t_Offer_FrameworkID + + ffj_t_Offer_AgentID + + ffj_t_Offer_Hostname + + ffj_t_Offer_URL + + ffj_t_Offer_Domain + + ffj_t_Offer_Resources + + ffj_t_Offer_Attributes + + ffj_t_Offer_ExecutorIDs + + ffj_t_Offer_Unavailability + + ffj_t_Offer_AllocationInfo +) + +var ffj_key_Offer_ID = []byte("id") + +var ffj_key_Offer_FrameworkID = []byte("framework_id") + +var ffj_key_Offer_AgentID = []byte("agent_id") + +var ffj_key_Offer_Hostname = []byte("hostname") + +var ffj_key_Offer_URL = []byte("url") + +var ffj_key_Offer_Domain = []byte("domain") + +var ffj_key_Offer_Resources = []byte("resources") + +var ffj_key_Offer_Attributes = []byte("attributes") + +var ffj_key_Offer_ExecutorIDs = []byte("executor_ids") + +var ffj_key_Offer_Unavailability = []byte("unavailability") + +var ffj_key_Offer_AllocationInfo = []byte("allocation_info") + +func (uj *Offer) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offerbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Offer_AgentID, kn) { + currentKey = ffj_t_Offer_AgentID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Offer_Attributes, kn) { + currentKey = ffj_t_Offer_Attributes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Offer_AllocationInfo, kn) { + currentKey = ffj_t_Offer_AllocationInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_Offer_Domain, kn) { + currentKey = ffj_t_Offer_Domain + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_Offer_ExecutorIDs, kn) { + currentKey = ffj_t_Offer_ExecutorIDs + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_Offer_FrameworkID, kn) { + currentKey = ffj_t_Offer_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_Offer_Hostname, kn) { + currentKey = ffj_t_Offer_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_Offer_ID, kn) { + currentKey = ffj_t_Offer_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Offer_Resources, kn) { + currentKey = ffj_t_Offer_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_Offer_URL, kn) { + currentKey = ffj_t_Offer_URL + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Offer_Unavailability, kn) { + currentKey = ffj_t_Offer_Unavailability + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Offer_AllocationInfo, kn) { + currentKey = ffj_t_Offer_AllocationInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Unavailability, kn) { + currentKey = ffj_t_Offer_Unavailability + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_ExecutorIDs, kn) { + currentKey = ffj_t_Offer_ExecutorIDs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Attributes, kn) { + currentKey = ffj_t_Offer_Attributes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Resources, kn) { + currentKey = ffj_t_Offer_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Domain, kn) { + currentKey = ffj_t_Offer_Domain + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_URL, kn) { + currentKey = ffj_t_Offer_URL + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Hostname, kn) { + currentKey = ffj_t_Offer_Hostname + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Offer_AgentID, kn) { + currentKey = ffj_t_Offer_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_FrameworkID, kn) { + currentKey = ffj_t_Offer_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_ID, kn) { + currentKey = ffj_t_Offer_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offerno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_ID: + goto handle_ID + + case ffj_t_Offer_FrameworkID: + goto handle_FrameworkID + + case ffj_t_Offer_AgentID: + goto handle_AgentID + + case ffj_t_Offer_Hostname: + goto handle_Hostname + + case ffj_t_Offer_URL: + goto handle_URL + + case ffj_t_Offer_Domain: + goto handle_Domain + + case ffj_t_Offer_Resources: + goto handle_Resources + + case ffj_t_Offer_Attributes: + goto handle_Attributes + + case ffj_t_Offer_ExecutorIDs: + goto handle_ExecutorIDs + + case ffj_t_Offer_Unavailability: + goto handle_Unavailability + + case ffj_t_Offer_AllocationInfo: + goto handle_AllocationInfo + + case ffj_t_Offerno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ID: + + /* handler: uj.ID type=mesos.OfferID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FrameworkID: + + /* handler: uj.FrameworkID type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.FrameworkID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AgentID: + + /* handler: uj.AgentID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.AgentID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Hostname: + + /* handler: uj.Hostname type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Hostname = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_URL: + + /* handler: uj.URL type=mesos.URL kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.URL = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.URL == nil { + uj.URL = new(URL) + } + + err = uj.URL.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Domain: + + /* handler: uj.Domain type=mesos.DomainInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Domain = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Domain == nil { + uj.Domain = new(DomainInfo) + } + + err = uj.Domain.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Attributes: + + /* handler: uj.Attributes type=[]mesos.Attribute kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Attributes = nil + } else { + + uj.Attributes = []Attribute{} + + wantVal := true + + for { + + var tmp_uj__Attributes Attribute + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Attributes type=mesos.Attribute kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Attributes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Attributes = append(uj.Attributes, tmp_uj__Attributes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ExecutorIDs: + + /* handler: uj.ExecutorIDs type=[]mesos.ExecutorID kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.ExecutorIDs = nil + } else { + + uj.ExecutorIDs = []ExecutorID{} + + wantVal := true + + for { + + var tmp_uj__ExecutorIDs ExecutorID + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__ExecutorIDs type=mesos.ExecutorID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__ExecutorIDs.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.ExecutorIDs = append(uj.ExecutorIDs, tmp_uj__ExecutorIDs) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Unavailability: + + /* handler: uj.Unavailability type=mesos.Unavailability kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Unavailability = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Unavailability == nil { + uj.Unavailability = new(Unavailability) + } + + err = uj.Unavailability.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AllocationInfo: + + /* handler: uj.AllocationInfo type=mesos.Resource_AllocationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AllocationInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AllocationInfo == nil { + uj.AllocationInfo = new(Resource_AllocationInfo) + } + + err = uj.AllocationInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *OfferID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *OfferID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_OfferIDbase = iota + ffj_t_OfferIDno_such_key + + ffj_t_OfferID_Value +) + +var ffj_key_OfferID_Value = []byte("value") + +func (uj *OfferID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *OfferID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_OfferIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_OfferIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_OfferID_Value, kn) { + currentKey = ffj_t_OfferID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_OfferID_Value, kn) { + currentKey = ffj_t_OfferID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_OfferIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_OfferID_Value: + goto handle_Value + + case ffj_t_OfferIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.ID != nil { + if true { + buf.WriteString(`"id":`) + + { + + err = mj.ID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Launch != nil { + if true { + buf.WriteString(`"launch":`) + + { + + err = mj.Launch.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.LaunchGroup != nil { + if true { + buf.WriteString(`"launch_group":`) + + { + + err = mj.LaunchGroup.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Reserve != nil { + if true { + buf.WriteString(`"reserve":`) + + { + + err = mj.Reserve.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Unreserve != nil { + if true { + buf.WriteString(`"unreserve":`) + + { + + err = mj.Unreserve.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Create != nil { + if true { + buf.WriteString(`"create":`) + + { + + err = mj.Create.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Destroy != nil { + if true { + buf.WriteString(`"destroy":`) + + { + + err = mj.Destroy.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.GrowVolume != nil { + if true { + buf.WriteString(`"grow_volume":`) + + { + + err = mj.GrowVolume.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ShrinkVolume != nil { + if true { + buf.WriteString(`"shrink_volume":`) + + { + + err = mj.ShrinkVolume.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.CreateDisk != nil { + if true { + buf.WriteString(`"create_disk":`) + + { + + err = mj.CreateDisk.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.DestroyDisk != nil { + if true { + buf.WriteString(`"destroy_disk":`) + + { + + err = mj.DestroyDisk.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operationbase = iota + ffj_t_Offer_Operationno_such_key + + ffj_t_Offer_Operation_Type + + ffj_t_Offer_Operation_ID + + ffj_t_Offer_Operation_Launch + + ffj_t_Offer_Operation_LaunchGroup + + ffj_t_Offer_Operation_Reserve + + ffj_t_Offer_Operation_Unreserve + + ffj_t_Offer_Operation_Create + + ffj_t_Offer_Operation_Destroy + + ffj_t_Offer_Operation_GrowVolume + + ffj_t_Offer_Operation_ShrinkVolume + + ffj_t_Offer_Operation_CreateDisk + + ffj_t_Offer_Operation_DestroyDisk +) + +var ffj_key_Offer_Operation_Type = []byte("type") + +var ffj_key_Offer_Operation_ID = []byte("id") + +var ffj_key_Offer_Operation_Launch = []byte("launch") + +var ffj_key_Offer_Operation_LaunchGroup = []byte("launch_group") + +var ffj_key_Offer_Operation_Reserve = []byte("reserve") + +var ffj_key_Offer_Operation_Unreserve = []byte("unreserve") + +var ffj_key_Offer_Operation_Create = []byte("create") + +var ffj_key_Offer_Operation_Destroy = []byte("destroy") + +var ffj_key_Offer_Operation_GrowVolume = []byte("grow_volume") + +var ffj_key_Offer_Operation_ShrinkVolume = []byte("shrink_volume") + +var ffj_key_Offer_Operation_CreateDisk = []byte("create_disk") + +var ffj_key_Offer_Operation_DestroyDisk = []byte("destroy_disk") + +func (uj *Offer_Operation) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operationbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Offer_Operation_Create, kn) { + currentKey = ffj_t_Offer_Operation_Create + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Offer_Operation_CreateDisk, kn) { + currentKey = ffj_t_Offer_Operation_CreateDisk + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_Offer_Operation_Destroy, kn) { + currentKey = ffj_t_Offer_Operation_Destroy + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Offer_Operation_DestroyDisk, kn) { + currentKey = ffj_t_Offer_Operation_DestroyDisk + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'g': + + if bytes.Equal(ffj_key_Offer_Operation_GrowVolume, kn) { + currentKey = ffj_t_Offer_Operation_GrowVolume + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_Offer_Operation_ID, kn) { + currentKey = ffj_t_Offer_Operation_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Offer_Operation_Launch, kn) { + currentKey = ffj_t_Offer_Operation_Launch + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Offer_Operation_LaunchGroup, kn) { + currentKey = ffj_t_Offer_Operation_LaunchGroup + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Offer_Operation_Reserve, kn) { + currentKey = ffj_t_Offer_Operation_Reserve + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Offer_Operation_ShrinkVolume, kn) { + currentKey = ffj_t_Offer_Operation_ShrinkVolume + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Offer_Operation_Type, kn) { + currentKey = ffj_t_Offer_Operation_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_Offer_Operation_Unreserve, kn) { + currentKey = ffj_t_Offer_Operation_Unreserve + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_DestroyDisk, kn) { + currentKey = ffj_t_Offer_Operation_DestroyDisk + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_CreateDisk, kn) { + currentKey = ffj_t_Offer_Operation_CreateDisk + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_ShrinkVolume, kn) { + currentKey = ffj_t_Offer_Operation_ShrinkVolume + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Offer_Operation_GrowVolume, kn) { + currentKey = ffj_t_Offer_Operation_GrowVolume + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Destroy, kn) { + currentKey = ffj_t_Offer_Operation_Destroy + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_Create, kn) { + currentKey = ffj_t_Offer_Operation_Create + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Unreserve, kn) { + currentKey = ffj_t_Offer_Operation_Unreserve + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Reserve, kn) { + currentKey = ffj_t_Offer_Operation_Reserve + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Offer_Operation_LaunchGroup, kn) { + currentKey = ffj_t_Offer_Operation_LaunchGroup + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_Launch, kn) { + currentKey = ffj_t_Offer_Operation_Launch + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_ID, kn) { + currentKey = ffj_t_Offer_Operation_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_Type, kn) { + currentKey = ffj_t_Offer_Operation_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_Type: + goto handle_Type + + case ffj_t_Offer_Operation_ID: + goto handle_ID + + case ffj_t_Offer_Operation_Launch: + goto handle_Launch + + case ffj_t_Offer_Operation_LaunchGroup: + goto handle_LaunchGroup + + case ffj_t_Offer_Operation_Reserve: + goto handle_Reserve + + case ffj_t_Offer_Operation_Unreserve: + goto handle_Unreserve + + case ffj_t_Offer_Operation_Create: + goto handle_Create + + case ffj_t_Offer_Operation_Destroy: + goto handle_Destroy + + case ffj_t_Offer_Operation_GrowVolume: + goto handle_GrowVolume + + case ffj_t_Offer_Operation_ShrinkVolume: + goto handle_ShrinkVolume + + case ffj_t_Offer_Operation_CreateDisk: + goto handle_CreateDisk + + case ffj_t_Offer_Operation_DestroyDisk: + goto handle_DestroyDisk + + case ffj_t_Offer_Operationno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Offer_Operation_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=mesos.OperationID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ID == nil { + uj.ID = new(OperationID) + } + + err = uj.ID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Launch: + + /* handler: uj.Launch type=mesos.Offer_Operation_Launch kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Launch = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Launch == nil { + uj.Launch = new(Offer_Operation_Launch) + } + + err = uj.Launch.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LaunchGroup: + + /* handler: uj.LaunchGroup type=mesos.Offer_Operation_LaunchGroup kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.LaunchGroup = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.LaunchGroup == nil { + uj.LaunchGroup = new(Offer_Operation_LaunchGroup) + } + + err = uj.LaunchGroup.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Reserve: + + /* handler: uj.Reserve type=mesos.Offer_Operation_Reserve kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Reserve = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Reserve == nil { + uj.Reserve = new(Offer_Operation_Reserve) + } + + err = uj.Reserve.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Unreserve: + + /* handler: uj.Unreserve type=mesos.Offer_Operation_Unreserve kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Unreserve = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Unreserve == nil { + uj.Unreserve = new(Offer_Operation_Unreserve) + } + + err = uj.Unreserve.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Create: + + /* handler: uj.Create type=mesos.Offer_Operation_Create kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Create = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Create == nil { + uj.Create = new(Offer_Operation_Create) + } + + err = uj.Create.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Destroy: + + /* handler: uj.Destroy type=mesos.Offer_Operation_Destroy kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Destroy = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Destroy == nil { + uj.Destroy = new(Offer_Operation_Destroy) + } + + err = uj.Destroy.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GrowVolume: + + /* handler: uj.GrowVolume type=mesos.Offer_Operation_GrowVolume kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.GrowVolume = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.GrowVolume == nil { + uj.GrowVolume = new(Offer_Operation_GrowVolume) + } + + err = uj.GrowVolume.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ShrinkVolume: + + /* handler: uj.ShrinkVolume type=mesos.Offer_Operation_ShrinkVolume kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ShrinkVolume = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ShrinkVolume == nil { + uj.ShrinkVolume = new(Offer_Operation_ShrinkVolume) + } + + err = uj.ShrinkVolume.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CreateDisk: + + /* handler: uj.CreateDisk type=mesos.Offer_Operation_CreateDisk kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.CreateDisk = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.CreateDisk == nil { + uj.CreateDisk = new(Offer_Operation_CreateDisk) + } + + err = uj.CreateDisk.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DestroyDisk: + + /* handler: uj.DestroyDisk type=mesos.Offer_Operation_DestroyDisk kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.DestroyDisk = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.DestroyDisk == nil { + uj.DestroyDisk = new(Offer_Operation_DestroyDisk) + } + + err = uj.DestroyDisk.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_Create) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_Create) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"volumes":`) + if mj.Volumes != nil { + buf.WriteString(`[`) + for i, v := range mj.Volumes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_Createbase = iota + ffj_t_Offer_Operation_Createno_such_key + + ffj_t_Offer_Operation_Create_Volumes +) + +var ffj_key_Offer_Operation_Create_Volumes = []byte("volumes") + +func (uj *Offer_Operation_Create) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_Create) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_Createbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_Createno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_Offer_Operation_Create_Volumes, kn) { + currentKey = ffj_t_Offer_Operation_Create_Volumes + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Create_Volumes, kn) { + currentKey = ffj_t_Offer_Operation_Create_Volumes + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_Createno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_Create_Volumes: + goto handle_Volumes + + case ffj_t_Offer_Operation_Createno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Volumes: + + /* handler: uj.Volumes type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Volumes = nil + } else { + + uj.Volumes = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Volumes Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Volumes type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Volumes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Volumes = append(uj.Volumes, tmp_uj__Volumes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_CreateDisk) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_CreateDisk) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"source":`) + + { + + err = mj.Source.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"target_type":`) + + { + + obj, err = mj.TargetType.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_CreateDiskbase = iota + ffj_t_Offer_Operation_CreateDiskno_such_key + + ffj_t_Offer_Operation_CreateDisk_Source + + ffj_t_Offer_Operation_CreateDisk_TargetType +) + +var ffj_key_Offer_Operation_CreateDisk_Source = []byte("source") + +var ffj_key_Offer_Operation_CreateDisk_TargetType = []byte("target_type") + +func (uj *Offer_Operation_CreateDisk) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_CreateDisk) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_CreateDiskbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_CreateDiskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 's': + + if bytes.Equal(ffj_key_Offer_Operation_CreateDisk_Source, kn) { + currentKey = ffj_t_Offer_Operation_CreateDisk_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Offer_Operation_CreateDisk_TargetType, kn) { + currentKey = ffj_t_Offer_Operation_CreateDisk_TargetType + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Offer_Operation_CreateDisk_TargetType, kn) { + currentKey = ffj_t_Offer_Operation_CreateDisk_TargetType + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_CreateDisk_Source, kn) { + currentKey = ffj_t_Offer_Operation_CreateDisk_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_CreateDiskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_CreateDisk_Source: + goto handle_Source + + case ffj_t_Offer_Operation_CreateDisk_TargetType: + goto handle_TargetType + + case ffj_t_Offer_Operation_CreateDiskno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Source: + + /* handler: uj.Source type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Source.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TargetType: + + /* handler: uj.TargetType type=mesos.Resource_DiskInfo_Source_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.TargetType.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_Destroy) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_Destroy) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"volumes":`) + if mj.Volumes != nil { + buf.WriteString(`[`) + for i, v := range mj.Volumes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_Destroybase = iota + ffj_t_Offer_Operation_Destroyno_such_key + + ffj_t_Offer_Operation_Destroy_Volumes +) + +var ffj_key_Offer_Operation_Destroy_Volumes = []byte("volumes") + +func (uj *Offer_Operation_Destroy) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_Destroy) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_Destroybase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_Destroyno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_Offer_Operation_Destroy_Volumes, kn) { + currentKey = ffj_t_Offer_Operation_Destroy_Volumes + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Destroy_Volumes, kn) { + currentKey = ffj_t_Offer_Operation_Destroy_Volumes + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_Destroyno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_Destroy_Volumes: + goto handle_Volumes + + case ffj_t_Offer_Operation_Destroyno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Volumes: + + /* handler: uj.Volumes type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Volumes = nil + } else { + + uj.Volumes = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Volumes Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Volumes type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Volumes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Volumes = append(uj.Volumes, tmp_uj__Volumes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_DestroyDisk) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_DestroyDisk) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"source":`) + + { + + err = mj.Source.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_DestroyDiskbase = iota + ffj_t_Offer_Operation_DestroyDiskno_such_key + + ffj_t_Offer_Operation_DestroyDisk_Source +) + +var ffj_key_Offer_Operation_DestroyDisk_Source = []byte("source") + +func (uj *Offer_Operation_DestroyDisk) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_DestroyDisk) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_DestroyDiskbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_DestroyDiskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 's': + + if bytes.Equal(ffj_key_Offer_Operation_DestroyDisk_Source, kn) { + currentKey = ffj_t_Offer_Operation_DestroyDisk_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_DestroyDisk_Source, kn) { + currentKey = ffj_t_Offer_Operation_DestroyDisk_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_DestroyDiskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_DestroyDisk_Source: + goto handle_Source + + case ffj_t_Offer_Operation_DestroyDiskno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Source: + + /* handler: uj.Source type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Source.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_GrowVolume) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_GrowVolume) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"volume":`) + + { + + err = mj.Volume.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"addition":`) + + { + + err = mj.Addition.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_GrowVolumebase = iota + ffj_t_Offer_Operation_GrowVolumeno_such_key + + ffj_t_Offer_Operation_GrowVolume_Volume + + ffj_t_Offer_Operation_GrowVolume_Addition +) + +var ffj_key_Offer_Operation_GrowVolume_Volume = []byte("volume") + +var ffj_key_Offer_Operation_GrowVolume_Addition = []byte("addition") + +func (uj *Offer_Operation_GrowVolume) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_GrowVolume) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_GrowVolumebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_GrowVolumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Offer_Operation_GrowVolume_Addition, kn) { + currentKey = ffj_t_Offer_Operation_GrowVolume_Addition + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Offer_Operation_GrowVolume_Volume, kn) { + currentKey = ffj_t_Offer_Operation_GrowVolume_Volume + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_GrowVolume_Addition, kn) { + currentKey = ffj_t_Offer_Operation_GrowVolume_Addition + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_GrowVolume_Volume, kn) { + currentKey = ffj_t_Offer_Operation_GrowVolume_Volume + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_GrowVolumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_GrowVolume_Volume: + goto handle_Volume + + case ffj_t_Offer_Operation_GrowVolume_Addition: + goto handle_Addition + + case ffj_t_Offer_Operation_GrowVolumeno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Volume: + + /* handler: uj.Volume type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Volume.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Addition: + + /* handler: uj.Addition type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Addition.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_Launch) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_Launch) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"task_infos":`) + if mj.TaskInfos != nil { + buf.WriteString(`[`) + for i, v := range mj.TaskInfos { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_Launchbase = iota + ffj_t_Offer_Operation_Launchno_such_key + + ffj_t_Offer_Operation_Launch_TaskInfos +) + +var ffj_key_Offer_Operation_Launch_TaskInfos = []byte("task_infos") + +func (uj *Offer_Operation_Launch) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_Launch) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_Launchbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_Launchno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 't': + + if bytes.Equal(ffj_key_Offer_Operation_Launch_TaskInfos, kn) { + currentKey = ffj_t_Offer_Operation_Launch_TaskInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Launch_TaskInfos, kn) { + currentKey = ffj_t_Offer_Operation_Launch_TaskInfos + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_Launchno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_Launch_TaskInfos: + goto handle_TaskInfos + + case ffj_t_Offer_Operation_Launchno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_TaskInfos: + + /* handler: uj.TaskInfos type=[]mesos.TaskInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.TaskInfos = nil + } else { + + uj.TaskInfos = []TaskInfo{} + + wantVal := true + + for { + + var tmp_uj__TaskInfos TaskInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__TaskInfos type=mesos.TaskInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__TaskInfos.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.TaskInfos = append(uj.TaskInfos, tmp_uj__TaskInfos) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_LaunchGroup) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_LaunchGroup) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"executor":`) + + { + + err = mj.Executor.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"task_group":`) + + { + + err = mj.TaskGroup.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_LaunchGroupbase = iota + ffj_t_Offer_Operation_LaunchGroupno_such_key + + ffj_t_Offer_Operation_LaunchGroup_Executor + + ffj_t_Offer_Operation_LaunchGroup_TaskGroup +) + +var ffj_key_Offer_Operation_LaunchGroup_Executor = []byte("executor") + +var ffj_key_Offer_Operation_LaunchGroup_TaskGroup = []byte("task_group") + +func (uj *Offer_Operation_LaunchGroup) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_LaunchGroup) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_LaunchGroupbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_LaunchGroupno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_Offer_Operation_LaunchGroup_Executor, kn) { + currentKey = ffj_t_Offer_Operation_LaunchGroup_Executor + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Offer_Operation_LaunchGroup_TaskGroup, kn) { + currentKey = ffj_t_Offer_Operation_LaunchGroup_TaskGroup + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_LaunchGroup_TaskGroup, kn) { + currentKey = ffj_t_Offer_Operation_LaunchGroup_TaskGroup + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_LaunchGroup_Executor, kn) { + currentKey = ffj_t_Offer_Operation_LaunchGroup_Executor + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_LaunchGroupno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_LaunchGroup_Executor: + goto handle_Executor + + case ffj_t_Offer_Operation_LaunchGroup_TaskGroup: + goto handle_TaskGroup + + case ffj_t_Offer_Operation_LaunchGroupno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Executor: + + /* handler: uj.Executor type=mesos.ExecutorInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Executor.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TaskGroup: + + /* handler: uj.TaskGroup type=mesos.TaskGroupInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.TaskGroup.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_Reserve) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_Reserve) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_Reservebase = iota + ffj_t_Offer_Operation_Reserveno_such_key + + ffj_t_Offer_Operation_Reserve_Resources +) + +var ffj_key_Offer_Operation_Reserve_Resources = []byte("resources") + +func (uj *Offer_Operation_Reserve) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_Reserve) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_Reservebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_Reserveno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Offer_Operation_Reserve_Resources, kn) { + currentKey = ffj_t_Offer_Operation_Reserve_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Reserve_Resources, kn) { + currentKey = ffj_t_Offer_Operation_Reserve_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_Reserveno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_Reserve_Resources: + goto handle_Resources + + case ffj_t_Offer_Operation_Reserveno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_ShrinkVolume) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_ShrinkVolume) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"volume":`) + + { + + err = mj.Volume.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"subtract":`) + + { + + err = mj.Subtract.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_ShrinkVolumebase = iota + ffj_t_Offer_Operation_ShrinkVolumeno_such_key + + ffj_t_Offer_Operation_ShrinkVolume_Volume + + ffj_t_Offer_Operation_ShrinkVolume_Subtract +) + +var ffj_key_Offer_Operation_ShrinkVolume_Volume = []byte("volume") + +var ffj_key_Offer_Operation_ShrinkVolume_Subtract = []byte("subtract") + +func (uj *Offer_Operation_ShrinkVolume) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_ShrinkVolume) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_ShrinkVolumebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_ShrinkVolumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 's': + + if bytes.Equal(ffj_key_Offer_Operation_ShrinkVolume_Subtract, kn) { + currentKey = ffj_t_Offer_Operation_ShrinkVolume_Subtract + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Offer_Operation_ShrinkVolume_Volume, kn) { + currentKey = ffj_t_Offer_Operation_ShrinkVolume_Volume + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_ShrinkVolume_Subtract, kn) { + currentKey = ffj_t_Offer_Operation_ShrinkVolume_Subtract + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Offer_Operation_ShrinkVolume_Volume, kn) { + currentKey = ffj_t_Offer_Operation_ShrinkVolume_Volume + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_ShrinkVolumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_ShrinkVolume_Volume: + goto handle_Volume + + case ffj_t_Offer_Operation_ShrinkVolume_Subtract: + goto handle_Subtract + + case ffj_t_Offer_Operation_ShrinkVolumeno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Volume: + + /* handler: uj.Volume type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Volume.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Subtract: + + /* handler: uj.Subtract type=mesos.Value_Scalar kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Subtract.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Offer_Operation_Unreserve) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Offer_Operation_Unreserve) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Offer_Operation_Unreservebase = iota + ffj_t_Offer_Operation_Unreserveno_such_key + + ffj_t_Offer_Operation_Unreserve_Resources +) + +var ffj_key_Offer_Operation_Unreserve_Resources = []byte("resources") + +func (uj *Offer_Operation_Unreserve) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Offer_Operation_Unreserve) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Offer_Operation_Unreservebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Offer_Operation_Unreserveno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Offer_Operation_Unreserve_Resources, kn) { + currentKey = ffj_t_Offer_Operation_Unreserve_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Offer_Operation_Unreserve_Resources, kn) { + currentKey = ffj_t_Offer_Operation_Unreserve_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Offer_Operation_Unreserveno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Offer_Operation_Unreserve_Resources: + goto handle_Resources + + case ffj_t_Offer_Operation_Unreserveno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Operation) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Operation) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteByte('{') + if mj.FrameworkID != nil { + if true { + buf.WriteString(`"framework_id":`) + + { + + err = mj.FrameworkID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.AgentID != nil { + if true { + buf.WriteString(`"agent_id":`) + + { + + err = mj.AgentID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"info":`) + + { + + err = mj.Info.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"latest_status":`) + + { + + err = mj.LatestStatus.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"statuses":`) + if mj.Statuses != nil { + buf.WriteString(`[`) + for i, v := range mj.Statuses { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"uuid":`) + + { + + err = mj.UUID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Operationbase = iota + ffj_t_Operationno_such_key + + ffj_t_Operation_FrameworkID + + ffj_t_Operation_AgentID + + ffj_t_Operation_Info + + ffj_t_Operation_LatestStatus + + ffj_t_Operation_Statuses + + ffj_t_Operation_UUID +) + +var ffj_key_Operation_FrameworkID = []byte("framework_id") + +var ffj_key_Operation_AgentID = []byte("agent_id") + +var ffj_key_Operation_Info = []byte("info") + +var ffj_key_Operation_LatestStatus = []byte("latest_status") + +var ffj_key_Operation_Statuses = []byte("statuses") + +var ffj_key_Operation_UUID = []byte("uuid") + +func (uj *Operation) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Operation) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Operationbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Operationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Operation_AgentID, kn) { + currentKey = ffj_t_Operation_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_Operation_FrameworkID, kn) { + currentKey = ffj_t_Operation_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_Operation_Info, kn) { + currentKey = ffj_t_Operation_Info + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Operation_LatestStatus, kn) { + currentKey = ffj_t_Operation_LatestStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Operation_Statuses, kn) { + currentKey = ffj_t_Operation_Statuses + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_Operation_UUID, kn) { + currentKey = ffj_t_Operation_UUID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Operation_UUID, kn) { + currentKey = ffj_t_Operation_UUID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Operation_Statuses, kn) { + currentKey = ffj_t_Operation_Statuses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Operation_LatestStatus, kn) { + currentKey = ffj_t_Operation_LatestStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Operation_Info, kn) { + currentKey = ffj_t_Operation_Info + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Operation_AgentID, kn) { + currentKey = ffj_t_Operation_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Operation_FrameworkID, kn) { + currentKey = ffj_t_Operation_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Operationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Operation_FrameworkID: + goto handle_FrameworkID + + case ffj_t_Operation_AgentID: + goto handle_AgentID + + case ffj_t_Operation_Info: + goto handle_Info + + case ffj_t_Operation_LatestStatus: + goto handle_LatestStatus + + case ffj_t_Operation_Statuses: + goto handle_Statuses + + case ffj_t_Operation_UUID: + goto handle_UUID + + case ffj_t_Operationno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_FrameworkID: + + /* handler: uj.FrameworkID type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.FrameworkID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.FrameworkID == nil { + uj.FrameworkID = new(FrameworkID) + } + + err = uj.FrameworkID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AgentID: + + /* handler: uj.AgentID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AgentID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AgentID == nil { + uj.AgentID = new(AgentID) + } + + err = uj.AgentID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Info: + + /* handler: uj.Info type=mesos.Offer_Operation kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Info.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LatestStatus: + + /* handler: uj.LatestStatus type=mesos.OperationStatus kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.LatestStatus.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Statuses: + + /* handler: uj.Statuses type=[]mesos.OperationStatus kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Statuses = nil + } else { + + uj.Statuses = []OperationStatus{} + + wantVal := true + + for { + + var tmp_uj__Statuses OperationStatus + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Statuses type=mesos.OperationStatus kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Statuses.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Statuses = append(uj.Statuses, tmp_uj__Statuses) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UUID: + + /* handler: uj.UUID type=mesos.UUID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.UUID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *OperationID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *OperationID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_OperationIDbase = iota + ffj_t_OperationIDno_such_key + + ffj_t_OperationID_Value +) + +var ffj_key_OperationID_Value = []byte("value") + +func (uj *OperationID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *OperationID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_OperationIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_OperationIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_OperationID_Value, kn) { + currentKey = ffj_t_OperationID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_OperationID_Value, kn) { + currentKey = ffj_t_OperationID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_OperationIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_OperationID_Value: + goto handle_Value + + case ffj_t_OperationIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *OperationStatus) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *OperationStatus) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.OperationID != nil { + if true { + buf.WriteString(`"operation_id":`) + + { + + err = mj.OperationID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"state":`) + + { + + obj, err = mj.State.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Message != nil { + if true { + buf.WriteString(`"message":`) + fflib.WriteJsonString(buf, string(*mj.Message)) + buf.WriteByte(',') + } + } + buf.WriteString(`"converted_resources":`) + if mj.ConvertedResources != nil { + buf.WriteString(`[`) + for i, v := range mj.ConvertedResources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.UUID != nil { + if true { + buf.WriteString(`"uuid":`) + + { + + err = mj.UUID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_OperationStatusbase = iota + ffj_t_OperationStatusno_such_key + + ffj_t_OperationStatus_OperationID + + ffj_t_OperationStatus_State + + ffj_t_OperationStatus_Message + + ffj_t_OperationStatus_ConvertedResources + + ffj_t_OperationStatus_UUID +) + +var ffj_key_OperationStatus_OperationID = []byte("operation_id") + +var ffj_key_OperationStatus_State = []byte("state") + +var ffj_key_OperationStatus_Message = []byte("message") + +var ffj_key_OperationStatus_ConvertedResources = []byte("converted_resources") + +var ffj_key_OperationStatus_UUID = []byte("uuid") + +func (uj *OperationStatus) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *OperationStatus) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_OperationStatusbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_OperationStatusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_OperationStatus_ConvertedResources, kn) { + currentKey = ffj_t_OperationStatus_ConvertedResources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_OperationStatus_Message, kn) { + currentKey = ffj_t_OperationStatus_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'o': + + if bytes.Equal(ffj_key_OperationStatus_OperationID, kn) { + currentKey = ffj_t_OperationStatus_OperationID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_OperationStatus_State, kn) { + currentKey = ffj_t_OperationStatus_State + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_OperationStatus_UUID, kn) { + currentKey = ffj_t_OperationStatus_UUID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_OperationStatus_UUID, kn) { + currentKey = ffj_t_OperationStatus_UUID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_OperationStatus_ConvertedResources, kn) { + currentKey = ffj_t_OperationStatus_ConvertedResources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_OperationStatus_Message, kn) { + currentKey = ffj_t_OperationStatus_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_OperationStatus_State, kn) { + currentKey = ffj_t_OperationStatus_State + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_OperationStatus_OperationID, kn) { + currentKey = ffj_t_OperationStatus_OperationID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_OperationStatusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_OperationStatus_OperationID: + goto handle_OperationID + + case ffj_t_OperationStatus_State: + goto handle_State + + case ffj_t_OperationStatus_Message: + goto handle_Message + + case ffj_t_OperationStatus_ConvertedResources: + goto handle_ConvertedResources + + case ffj_t_OperationStatus_UUID: + goto handle_UUID + + case ffj_t_OperationStatusno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_OperationID: + + /* handler: uj.OperationID type=mesos.OperationID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.OperationID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.OperationID == nil { + uj.OperationID = new(OperationID) + } + + err = uj.OperationID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_State: + + /* handler: uj.State type=mesos.OperationState kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.State.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Message: + + /* handler: uj.Message type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Message = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Message = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ConvertedResources: + + /* handler: uj.ConvertedResources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.ConvertedResources = nil + } else { + + uj.ConvertedResources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__ConvertedResources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__ConvertedResources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__ConvertedResources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.ConvertedResources = append(uj.ConvertedResources, tmp_uj__ConvertedResources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UUID: + + /* handler: uj.UUID type=mesos.UUID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.UUID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.UUID == nil { + uj.UUID = new(UUID) + } + + err = uj.UUID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Parameter) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Parameter) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"key":`) + fflib.WriteJsonString(buf, string(mj.Key)) + buf.WriteString(`,"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Parameterbase = iota + ffj_t_Parameterno_such_key + + ffj_t_Parameter_Key + + ffj_t_Parameter_Value +) + +var ffj_key_Parameter_Key = []byte("key") + +var ffj_key_Parameter_Value = []byte("value") + +func (uj *Parameter) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Parameter) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Parameterbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Parameterno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'k': + + if bytes.Equal(ffj_key_Parameter_Key, kn) { + currentKey = ffj_t_Parameter_Key + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Parameter_Value, kn) { + currentKey = ffj_t_Parameter_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Parameter_Value, kn) { + currentKey = ffj_t_Parameter_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Parameter_Key, kn) { + currentKey = ffj_t_Parameter_Key + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Parameterno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Parameter_Key: + goto handle_Key + + case ffj_t_Parameter_Value: + goto handle_Value + + case ffj_t_Parameterno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Key: + + /* handler: uj.Key type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Key = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Parameters) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Parameters) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"parameter":`) + if mj.Parameter != nil { + buf.WriteString(`[`) + for i, v := range mj.Parameter { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Parametersbase = iota + ffj_t_Parametersno_such_key + + ffj_t_Parameters_Parameter +) + +var ffj_key_Parameters_Parameter = []byte("parameter") + +func (uj *Parameters) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Parameters) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Parametersbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Parametersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_Parameters_Parameter, kn) { + currentKey = ffj_t_Parameters_Parameter + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Parameters_Parameter, kn) { + currentKey = ffj_t_Parameters_Parameter + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Parametersno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Parameters_Parameter: + goto handle_Parameter + + case ffj_t_Parametersno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Parameter: + + /* handler: uj.Parameter type=[]mesos.Parameter kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Parameter = nil + } else { + + uj.Parameter = []Parameter{} + + wantVal := true + + for { + + var tmp_uj__Parameter Parameter + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Parameter type=mesos.Parameter kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Parameter.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Parameter = append(uj.Parameter, tmp_uj__Parameter) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *PerfStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *PerfStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "timestamp":`) + fflib.AppendFloat(buf, float64(mj.Timestamp), 'g', -1, 64) + buf.WriteString(`,"duration":`) + fflib.AppendFloat(buf, float64(mj.Duration), 'g', -1, 64) + buf.WriteByte(',') + if mj.Cycles != nil { + if true { + buf.WriteString(`"cycles":`) + fflib.FormatBits2(buf, uint64(*mj.Cycles), 10, false) + buf.WriteByte(',') + } + } + if mj.StalledCyclesFrontend != nil { + if true { + buf.WriteString(`"stalled_cycles_frontend":`) + fflib.FormatBits2(buf, uint64(*mj.StalledCyclesFrontend), 10, false) + buf.WriteByte(',') + } + } + if mj.StalledCyclesBackend != nil { + if true { + buf.WriteString(`"stalled_cycles_backend":`) + fflib.FormatBits2(buf, uint64(*mj.StalledCyclesBackend), 10, false) + buf.WriteByte(',') + } + } + if mj.Instructions != nil { + if true { + buf.WriteString(`"instructions":`) + fflib.FormatBits2(buf, uint64(*mj.Instructions), 10, false) + buf.WriteByte(',') + } + } + if mj.CacheReferences != nil { + if true { + buf.WriteString(`"cache_references":`) + fflib.FormatBits2(buf, uint64(*mj.CacheReferences), 10, false) + buf.WriteByte(',') + } + } + if mj.CacheMisses != nil { + if true { + buf.WriteString(`"cache_misses":`) + fflib.FormatBits2(buf, uint64(*mj.CacheMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.Branches != nil { + if true { + buf.WriteString(`"branches":`) + fflib.FormatBits2(buf, uint64(*mj.Branches), 10, false) + buf.WriteByte(',') + } + } + if mj.BranchMisses != nil { + if true { + buf.WriteString(`"branch_misses":`) + fflib.FormatBits2(buf, uint64(*mj.BranchMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.BusCycles != nil { + if true { + buf.WriteString(`"bus_cycles":`) + fflib.FormatBits2(buf, uint64(*mj.BusCycles), 10, false) + buf.WriteByte(',') + } + } + if mj.RefCycles != nil { + if true { + buf.WriteString(`"ref_cycles":`) + fflib.FormatBits2(buf, uint64(*mj.RefCycles), 10, false) + buf.WriteByte(',') + } + } + if mj.CPUClock != nil { + if true { + buf.WriteString(`"cpu_clock":`) + fflib.AppendFloat(buf, float64(*mj.CPUClock), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.TaskClock != nil { + if true { + buf.WriteString(`"task_clock":`) + fflib.AppendFloat(buf, float64(*mj.TaskClock), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.PageFaults != nil { + if true { + buf.WriteString(`"page_faults":`) + fflib.FormatBits2(buf, uint64(*mj.PageFaults), 10, false) + buf.WriteByte(',') + } + } + if mj.MinorFaults != nil { + if true { + buf.WriteString(`"minor_faults":`) + fflib.FormatBits2(buf, uint64(*mj.MinorFaults), 10, false) + buf.WriteByte(',') + } + } + if mj.MajorFaults != nil { + if true { + buf.WriteString(`"major_faults":`) + fflib.FormatBits2(buf, uint64(*mj.MajorFaults), 10, false) + buf.WriteByte(',') + } + } + if mj.ContextSwitches != nil { + if true { + buf.WriteString(`"context_switches":`) + fflib.FormatBits2(buf, uint64(*mj.ContextSwitches), 10, false) + buf.WriteByte(',') + } + } + if mj.CPUMigrations != nil { + if true { + buf.WriteString(`"cpu_migrations":`) + fflib.FormatBits2(buf, uint64(*mj.CPUMigrations), 10, false) + buf.WriteByte(',') + } + } + if mj.AlignmentFaults != nil { + if true { + buf.WriteString(`"alignment_faults":`) + fflib.FormatBits2(buf, uint64(*mj.AlignmentFaults), 10, false) + buf.WriteByte(',') + } + } + if mj.EmulationFaults != nil { + if true { + buf.WriteString(`"emulation_faults":`) + fflib.FormatBits2(buf, uint64(*mj.EmulationFaults), 10, false) + buf.WriteByte(',') + } + } + if mj.L1DcacheLoads != nil { + if true { + buf.WriteString(`"l1_dcache_loads":`) + fflib.FormatBits2(buf, uint64(*mj.L1DcacheLoads), 10, false) + buf.WriteByte(',') + } + } + if mj.L1DcacheLoadMisses != nil { + if true { + buf.WriteString(`"l1_dcache_load_misses":`) + fflib.FormatBits2(buf, uint64(*mj.L1DcacheLoadMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.L1DcacheStores != nil { + if true { + buf.WriteString(`"l1_dcache_stores":`) + fflib.FormatBits2(buf, uint64(*mj.L1DcacheStores), 10, false) + buf.WriteByte(',') + } + } + if mj.L1DcacheStoreMisses != nil { + if true { + buf.WriteString(`"l1_dcache_store_misses":`) + fflib.FormatBits2(buf, uint64(*mj.L1DcacheStoreMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.L1DcachePrefetches != nil { + if true { + buf.WriteString(`"l1_dcache_prefetches":`) + fflib.FormatBits2(buf, uint64(*mj.L1DcachePrefetches), 10, false) + buf.WriteByte(',') + } + } + if mj.L1DcachePrefetchMisses != nil { + if true { + buf.WriteString(`"l1_dcache_prefetch_misses":`) + fflib.FormatBits2(buf, uint64(*mj.L1DcachePrefetchMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.L1IcacheLoads != nil { + if true { + buf.WriteString(`"l1_icache_loads":`) + fflib.FormatBits2(buf, uint64(*mj.L1IcacheLoads), 10, false) + buf.WriteByte(',') + } + } + if mj.L1IcacheLoadMisses != nil { + if true { + buf.WriteString(`"l1_icache_load_misses":`) + fflib.FormatBits2(buf, uint64(*mj.L1IcacheLoadMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.L1IcachePrefetches != nil { + if true { + buf.WriteString(`"l1_icache_prefetches":`) + fflib.FormatBits2(buf, uint64(*mj.L1IcachePrefetches), 10, false) + buf.WriteByte(',') + } + } + if mj.L1IcachePrefetchMisses != nil { + if true { + buf.WriteString(`"l1_icache_prefetch_misses":`) + fflib.FormatBits2(buf, uint64(*mj.L1IcachePrefetchMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.LLCLoads != nil { + if true { + buf.WriteString(`"llc_loads":`) + fflib.FormatBits2(buf, uint64(*mj.LLCLoads), 10, false) + buf.WriteByte(',') + } + } + if mj.LLCLoadMisses != nil { + if true { + buf.WriteString(`"llc_load_misses":`) + fflib.FormatBits2(buf, uint64(*mj.LLCLoadMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.LLCStores != nil { + if true { + buf.WriteString(`"llc_stores":`) + fflib.FormatBits2(buf, uint64(*mj.LLCStores), 10, false) + buf.WriteByte(',') + } + } + if mj.LLCStoreMisses != nil { + if true { + buf.WriteString(`"llc_store_misses":`) + fflib.FormatBits2(buf, uint64(*mj.LLCStoreMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.LLCPrefetches != nil { + if true { + buf.WriteString(`"llc_prefetches":`) + fflib.FormatBits2(buf, uint64(*mj.LLCPrefetches), 10, false) + buf.WriteByte(',') + } + } + if mj.LLCPrefetchMisses != nil { + if true { + buf.WriteString(`"llc_prefetch_misses":`) + fflib.FormatBits2(buf, uint64(*mj.LLCPrefetchMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.DTLBLoads != nil { + if true { + buf.WriteString(`"dtlb_loads":`) + fflib.FormatBits2(buf, uint64(*mj.DTLBLoads), 10, false) + buf.WriteByte(',') + } + } + if mj.DTLBLoadMisses != nil { + if true { + buf.WriteString(`"dtlb_load_misses":`) + fflib.FormatBits2(buf, uint64(*mj.DTLBLoadMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.DTLBStores != nil { + if true { + buf.WriteString(`"dtlb_stores":`) + fflib.FormatBits2(buf, uint64(*mj.DTLBStores), 10, false) + buf.WriteByte(',') + } + } + if mj.DTLBStoreMisses != nil { + if true { + buf.WriteString(`"dtlb_store_misses":`) + fflib.FormatBits2(buf, uint64(*mj.DTLBStoreMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.DTLBPrefetches != nil { + if true { + buf.WriteString(`"dtlb_prefetches":`) + fflib.FormatBits2(buf, uint64(*mj.DTLBPrefetches), 10, false) + buf.WriteByte(',') + } + } + if mj.DTLBPrefetchMisses != nil { + if true { + buf.WriteString(`"dtlb_prefetch_misses":`) + fflib.FormatBits2(buf, uint64(*mj.DTLBPrefetchMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.ITLBLoads != nil { + if true { + buf.WriteString(`"itlb_loads":`) + fflib.FormatBits2(buf, uint64(*mj.ITLBLoads), 10, false) + buf.WriteByte(',') + } + } + if mj.ITLBLoadMisses != nil { + if true { + buf.WriteString(`"itlb_load_misses":`) + fflib.FormatBits2(buf, uint64(*mj.ITLBLoadMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.BranchLoads != nil { + if true { + buf.WriteString(`"branch_loads":`) + fflib.FormatBits2(buf, uint64(*mj.BranchLoads), 10, false) + buf.WriteByte(',') + } + } + if mj.BranchLoadMisses != nil { + if true { + buf.WriteString(`"branch_load_misses":`) + fflib.FormatBits2(buf, uint64(*mj.BranchLoadMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.NodeLoads != nil { + if true { + buf.WriteString(`"node_loads":`) + fflib.FormatBits2(buf, uint64(*mj.NodeLoads), 10, false) + buf.WriteByte(',') + } + } + if mj.NodeLoadMisses != nil { + if true { + buf.WriteString(`"node_load_misses":`) + fflib.FormatBits2(buf, uint64(*mj.NodeLoadMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.NodeStores != nil { + if true { + buf.WriteString(`"node_stores":`) + fflib.FormatBits2(buf, uint64(*mj.NodeStores), 10, false) + buf.WriteByte(',') + } + } + if mj.NodeStoreMisses != nil { + if true { + buf.WriteString(`"node_store_misses":`) + fflib.FormatBits2(buf, uint64(*mj.NodeStoreMisses), 10, false) + buf.WriteByte(',') + } + } + if mj.NodePrefetches != nil { + if true { + buf.WriteString(`"node_prefetches":`) + fflib.FormatBits2(buf, uint64(*mj.NodePrefetches), 10, false) + buf.WriteByte(',') + } + } + if mj.NodePrefetchMisses != nil { + if true { + buf.WriteString(`"node_prefetch_misses":`) + fflib.FormatBits2(buf, uint64(*mj.NodePrefetchMisses), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_PerfStatisticsbase = iota + ffj_t_PerfStatisticsno_such_key + + ffj_t_PerfStatistics_Timestamp + + ffj_t_PerfStatistics_Duration + + ffj_t_PerfStatistics_Cycles + + ffj_t_PerfStatistics_StalledCyclesFrontend + + ffj_t_PerfStatistics_StalledCyclesBackend + + ffj_t_PerfStatistics_Instructions + + ffj_t_PerfStatistics_CacheReferences + + ffj_t_PerfStatistics_CacheMisses + + ffj_t_PerfStatistics_Branches + + ffj_t_PerfStatistics_BranchMisses + + ffj_t_PerfStatistics_BusCycles + + ffj_t_PerfStatistics_RefCycles + + ffj_t_PerfStatistics_CPUClock + + ffj_t_PerfStatistics_TaskClock + + ffj_t_PerfStatistics_PageFaults + + ffj_t_PerfStatistics_MinorFaults + + ffj_t_PerfStatistics_MajorFaults + + ffj_t_PerfStatistics_ContextSwitches + + ffj_t_PerfStatistics_CPUMigrations + + ffj_t_PerfStatistics_AlignmentFaults + + ffj_t_PerfStatistics_EmulationFaults + + ffj_t_PerfStatistics_L1DcacheLoads + + ffj_t_PerfStatistics_L1DcacheLoadMisses + + ffj_t_PerfStatistics_L1DcacheStores + + ffj_t_PerfStatistics_L1DcacheStoreMisses + + ffj_t_PerfStatistics_L1DcachePrefetches + + ffj_t_PerfStatistics_L1DcachePrefetchMisses + + ffj_t_PerfStatistics_L1IcacheLoads + + ffj_t_PerfStatistics_L1IcacheLoadMisses + + ffj_t_PerfStatistics_L1IcachePrefetches + + ffj_t_PerfStatistics_L1IcachePrefetchMisses + + ffj_t_PerfStatistics_LLCLoads + + ffj_t_PerfStatistics_LLCLoadMisses + + ffj_t_PerfStatistics_LLCStores + + ffj_t_PerfStatistics_LLCStoreMisses + + ffj_t_PerfStatistics_LLCPrefetches + + ffj_t_PerfStatistics_LLCPrefetchMisses + + ffj_t_PerfStatistics_DTLBLoads + + ffj_t_PerfStatistics_DTLBLoadMisses + + ffj_t_PerfStatistics_DTLBStores + + ffj_t_PerfStatistics_DTLBStoreMisses + + ffj_t_PerfStatistics_DTLBPrefetches + + ffj_t_PerfStatistics_DTLBPrefetchMisses + + ffj_t_PerfStatistics_ITLBLoads + + ffj_t_PerfStatistics_ITLBLoadMisses + + ffj_t_PerfStatistics_BranchLoads + + ffj_t_PerfStatistics_BranchLoadMisses + + ffj_t_PerfStatistics_NodeLoads + + ffj_t_PerfStatistics_NodeLoadMisses + + ffj_t_PerfStatistics_NodeStores + + ffj_t_PerfStatistics_NodeStoreMisses + + ffj_t_PerfStatistics_NodePrefetches + + ffj_t_PerfStatistics_NodePrefetchMisses +) + +var ffj_key_PerfStatistics_Timestamp = []byte("timestamp") + +var ffj_key_PerfStatistics_Duration = []byte("duration") + +var ffj_key_PerfStatistics_Cycles = []byte("cycles") + +var ffj_key_PerfStatistics_StalledCyclesFrontend = []byte("stalled_cycles_frontend") + +var ffj_key_PerfStatistics_StalledCyclesBackend = []byte("stalled_cycles_backend") + +var ffj_key_PerfStatistics_Instructions = []byte("instructions") + +var ffj_key_PerfStatistics_CacheReferences = []byte("cache_references") + +var ffj_key_PerfStatistics_CacheMisses = []byte("cache_misses") + +var ffj_key_PerfStatistics_Branches = []byte("branches") + +var ffj_key_PerfStatistics_BranchMisses = []byte("branch_misses") + +var ffj_key_PerfStatistics_BusCycles = []byte("bus_cycles") + +var ffj_key_PerfStatistics_RefCycles = []byte("ref_cycles") + +var ffj_key_PerfStatistics_CPUClock = []byte("cpu_clock") + +var ffj_key_PerfStatistics_TaskClock = []byte("task_clock") + +var ffj_key_PerfStatistics_PageFaults = []byte("page_faults") + +var ffj_key_PerfStatistics_MinorFaults = []byte("minor_faults") + +var ffj_key_PerfStatistics_MajorFaults = []byte("major_faults") + +var ffj_key_PerfStatistics_ContextSwitches = []byte("context_switches") + +var ffj_key_PerfStatistics_CPUMigrations = []byte("cpu_migrations") + +var ffj_key_PerfStatistics_AlignmentFaults = []byte("alignment_faults") + +var ffj_key_PerfStatistics_EmulationFaults = []byte("emulation_faults") + +var ffj_key_PerfStatistics_L1DcacheLoads = []byte("l1_dcache_loads") + +var ffj_key_PerfStatistics_L1DcacheLoadMisses = []byte("l1_dcache_load_misses") + +var ffj_key_PerfStatistics_L1DcacheStores = []byte("l1_dcache_stores") + +var ffj_key_PerfStatistics_L1DcacheStoreMisses = []byte("l1_dcache_store_misses") + +var ffj_key_PerfStatistics_L1DcachePrefetches = []byte("l1_dcache_prefetches") + +var ffj_key_PerfStatistics_L1DcachePrefetchMisses = []byte("l1_dcache_prefetch_misses") + +var ffj_key_PerfStatistics_L1IcacheLoads = []byte("l1_icache_loads") + +var ffj_key_PerfStatistics_L1IcacheLoadMisses = []byte("l1_icache_load_misses") + +var ffj_key_PerfStatistics_L1IcachePrefetches = []byte("l1_icache_prefetches") + +var ffj_key_PerfStatistics_L1IcachePrefetchMisses = []byte("l1_icache_prefetch_misses") + +var ffj_key_PerfStatistics_LLCLoads = []byte("llc_loads") + +var ffj_key_PerfStatistics_LLCLoadMisses = []byte("llc_load_misses") + +var ffj_key_PerfStatistics_LLCStores = []byte("llc_stores") + +var ffj_key_PerfStatistics_LLCStoreMisses = []byte("llc_store_misses") + +var ffj_key_PerfStatistics_LLCPrefetches = []byte("llc_prefetches") + +var ffj_key_PerfStatistics_LLCPrefetchMisses = []byte("llc_prefetch_misses") + +var ffj_key_PerfStatistics_DTLBLoads = []byte("dtlb_loads") + +var ffj_key_PerfStatistics_DTLBLoadMisses = []byte("dtlb_load_misses") + +var ffj_key_PerfStatistics_DTLBStores = []byte("dtlb_stores") + +var ffj_key_PerfStatistics_DTLBStoreMisses = []byte("dtlb_store_misses") + +var ffj_key_PerfStatistics_DTLBPrefetches = []byte("dtlb_prefetches") + +var ffj_key_PerfStatistics_DTLBPrefetchMisses = []byte("dtlb_prefetch_misses") + +var ffj_key_PerfStatistics_ITLBLoads = []byte("itlb_loads") + +var ffj_key_PerfStatistics_ITLBLoadMisses = []byte("itlb_load_misses") + +var ffj_key_PerfStatistics_BranchLoads = []byte("branch_loads") + +var ffj_key_PerfStatistics_BranchLoadMisses = []byte("branch_load_misses") + +var ffj_key_PerfStatistics_NodeLoads = []byte("node_loads") + +var ffj_key_PerfStatistics_NodeLoadMisses = []byte("node_load_misses") + +var ffj_key_PerfStatistics_NodeStores = []byte("node_stores") + +var ffj_key_PerfStatistics_NodeStoreMisses = []byte("node_store_misses") + +var ffj_key_PerfStatistics_NodePrefetches = []byte("node_prefetches") + +var ffj_key_PerfStatistics_NodePrefetchMisses = []byte("node_prefetch_misses") + +func (uj *PerfStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *PerfStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_PerfStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_PerfStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_PerfStatistics_AlignmentFaults, kn) { + currentKey = ffj_t_PerfStatistics_AlignmentFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'b': + + if bytes.Equal(ffj_key_PerfStatistics_Branches, kn) { + currentKey = ffj_t_PerfStatistics_Branches + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_BranchMisses, kn) { + currentKey = ffj_t_PerfStatistics_BranchMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_BusCycles, kn) { + currentKey = ffj_t_PerfStatistics_BusCycles + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_BranchLoads, kn) { + currentKey = ffj_t_PerfStatistics_BranchLoads + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_BranchLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_BranchLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_PerfStatistics_Cycles, kn) { + currentKey = ffj_t_PerfStatistics_Cycles + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_CacheReferences, kn) { + currentKey = ffj_t_PerfStatistics_CacheReferences + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_CacheMisses, kn) { + currentKey = ffj_t_PerfStatistics_CacheMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_CPUClock, kn) { + currentKey = ffj_t_PerfStatistics_CPUClock + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_ContextSwitches, kn) { + currentKey = ffj_t_PerfStatistics_ContextSwitches + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_CPUMigrations, kn) { + currentKey = ffj_t_PerfStatistics_CPUMigrations + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_PerfStatistics_Duration, kn) { + currentKey = ffj_t_PerfStatistics_Duration + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_DTLBLoads, kn) { + currentKey = ffj_t_PerfStatistics_DTLBLoads + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_DTLBLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_DTLBLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_DTLBStores, kn) { + currentKey = ffj_t_PerfStatistics_DTLBStores + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_DTLBStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_DTLBStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_DTLBPrefetches, kn) { + currentKey = ffj_t_PerfStatistics_DTLBPrefetches + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_DTLBPrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_DTLBPrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_PerfStatistics_EmulationFaults, kn) { + currentKey = ffj_t_PerfStatistics_EmulationFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_PerfStatistics_Instructions, kn) { + currentKey = ffj_t_PerfStatistics_Instructions + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_ITLBLoads, kn) { + currentKey = ffj_t_PerfStatistics_ITLBLoads + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_ITLBLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_ITLBLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_PerfStatistics_L1DcacheLoads, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheLoads + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1DcacheLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1DcacheStores, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheStores + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1DcacheStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1DcachePrefetches, kn) { + currentKey = ffj_t_PerfStatistics_L1DcachePrefetches + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1DcachePrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1DcachePrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1IcacheLoads, kn) { + currentKey = ffj_t_PerfStatistics_L1IcacheLoads + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1IcacheLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1IcacheLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1IcachePrefetches, kn) { + currentKey = ffj_t_PerfStatistics_L1IcachePrefetches + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_L1IcachePrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1IcachePrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_LLCLoads, kn) { + currentKey = ffj_t_PerfStatistics_LLCLoads + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_LLCLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_LLCLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_LLCStores, kn) { + currentKey = ffj_t_PerfStatistics_LLCStores + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_LLCStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_LLCStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_LLCPrefetches, kn) { + currentKey = ffj_t_PerfStatistics_LLCPrefetches + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_LLCPrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_LLCPrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_PerfStatistics_MinorFaults, kn) { + currentKey = ffj_t_PerfStatistics_MinorFaults + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_MajorFaults, kn) { + currentKey = ffj_t_PerfStatistics_MajorFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_PerfStatistics_NodeLoads, kn) { + currentKey = ffj_t_PerfStatistics_NodeLoads + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_NodeLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_NodeLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_NodeStores, kn) { + currentKey = ffj_t_PerfStatistics_NodeStores + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_NodeStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_NodeStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_NodePrefetches, kn) { + currentKey = ffj_t_PerfStatistics_NodePrefetches + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_NodePrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_NodePrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_PerfStatistics_PageFaults, kn) { + currentKey = ffj_t_PerfStatistics_PageFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_PerfStatistics_RefCycles, kn) { + currentKey = ffj_t_PerfStatistics_RefCycles + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_PerfStatistics_StalledCyclesFrontend, kn) { + currentKey = ffj_t_PerfStatistics_StalledCyclesFrontend + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_StalledCyclesBackend, kn) { + currentKey = ffj_t_PerfStatistics_StalledCyclesBackend + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_PerfStatistics_Timestamp, kn) { + currentKey = ffj_t_PerfStatistics_Timestamp + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_PerfStatistics_TaskClock, kn) { + currentKey = ffj_t_PerfStatistics_TaskClock + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_NodePrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_NodePrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_NodePrefetches, kn) { + currentKey = ffj_t_PerfStatistics_NodePrefetches + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_NodeStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_NodeStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_NodeStores, kn) { + currentKey = ffj_t_PerfStatistics_NodeStores + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_NodeLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_NodeLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_NodeLoads, kn) { + currentKey = ffj_t_PerfStatistics_NodeLoads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_BranchLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_BranchLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_BranchLoads, kn) { + currentKey = ffj_t_PerfStatistics_BranchLoads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_ITLBLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_ITLBLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_ITLBLoads, kn) { + currentKey = ffj_t_PerfStatistics_ITLBLoads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_DTLBPrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_DTLBPrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_DTLBPrefetches, kn) { + currentKey = ffj_t_PerfStatistics_DTLBPrefetches + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_DTLBStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_DTLBStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_DTLBStores, kn) { + currentKey = ffj_t_PerfStatistics_DTLBStores + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_DTLBLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_DTLBLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_DTLBLoads, kn) { + currentKey = ffj_t_PerfStatistics_DTLBLoads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_LLCPrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_LLCPrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_LLCPrefetches, kn) { + currentKey = ffj_t_PerfStatistics_LLCPrefetches + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_LLCStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_LLCStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_LLCStores, kn) { + currentKey = ffj_t_PerfStatistics_LLCStores + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_LLCLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_LLCLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_LLCLoads, kn) { + currentKey = ffj_t_PerfStatistics_LLCLoads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1IcachePrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1IcachePrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1IcachePrefetches, kn) { + currentKey = ffj_t_PerfStatistics_L1IcachePrefetches + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1IcacheLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1IcacheLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1IcacheLoads, kn) { + currentKey = ffj_t_PerfStatistics_L1IcacheLoads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1DcachePrefetchMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1DcachePrefetchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1DcachePrefetches, kn) { + currentKey = ffj_t_PerfStatistics_L1DcachePrefetches + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1DcacheStoreMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheStoreMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1DcacheStores, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheStores + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1DcacheLoadMisses, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheLoadMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_L1DcacheLoads, kn) { + currentKey = ffj_t_PerfStatistics_L1DcacheLoads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_EmulationFaults, kn) { + currentKey = ffj_t_PerfStatistics_EmulationFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_AlignmentFaults, kn) { + currentKey = ffj_t_PerfStatistics_AlignmentFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_CPUMigrations, kn) { + currentKey = ffj_t_PerfStatistics_CPUMigrations + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_ContextSwitches, kn) { + currentKey = ffj_t_PerfStatistics_ContextSwitches + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_MajorFaults, kn) { + currentKey = ffj_t_PerfStatistics_MajorFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_MinorFaults, kn) { + currentKey = ffj_t_PerfStatistics_MinorFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_PageFaults, kn) { + currentKey = ffj_t_PerfStatistics_PageFaults + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_TaskClock, kn) { + currentKey = ffj_t_PerfStatistics_TaskClock + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_CPUClock, kn) { + currentKey = ffj_t_PerfStatistics_CPUClock + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_RefCycles, kn) { + currentKey = ffj_t_PerfStatistics_RefCycles + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_BusCycles, kn) { + currentKey = ffj_t_PerfStatistics_BusCycles + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_BranchMisses, kn) { + currentKey = ffj_t_PerfStatistics_BranchMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_Branches, kn) { + currentKey = ffj_t_PerfStatistics_Branches + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_CacheMisses, kn) { + currentKey = ffj_t_PerfStatistics_CacheMisses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_CacheReferences, kn) { + currentKey = ffj_t_PerfStatistics_CacheReferences + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_Instructions, kn) { + currentKey = ffj_t_PerfStatistics_Instructions + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_StalledCyclesBackend, kn) { + currentKey = ffj_t_PerfStatistics_StalledCyclesBackend + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_StalledCyclesFrontend, kn) { + currentKey = ffj_t_PerfStatistics_StalledCyclesFrontend + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_Cycles, kn) { + currentKey = ffj_t_PerfStatistics_Cycles + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_PerfStatistics_Duration, kn) { + currentKey = ffj_t_PerfStatistics_Duration + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_PerfStatistics_Timestamp, kn) { + currentKey = ffj_t_PerfStatistics_Timestamp + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_PerfStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_PerfStatistics_Timestamp: + goto handle_Timestamp + + case ffj_t_PerfStatistics_Duration: + goto handle_Duration + + case ffj_t_PerfStatistics_Cycles: + goto handle_Cycles + + case ffj_t_PerfStatistics_StalledCyclesFrontend: + goto handle_StalledCyclesFrontend + + case ffj_t_PerfStatistics_StalledCyclesBackend: + goto handle_StalledCyclesBackend + + case ffj_t_PerfStatistics_Instructions: + goto handle_Instructions + + case ffj_t_PerfStatistics_CacheReferences: + goto handle_CacheReferences + + case ffj_t_PerfStatistics_CacheMisses: + goto handle_CacheMisses + + case ffj_t_PerfStatistics_Branches: + goto handle_Branches + + case ffj_t_PerfStatistics_BranchMisses: + goto handle_BranchMisses + + case ffj_t_PerfStatistics_BusCycles: + goto handle_BusCycles + + case ffj_t_PerfStatistics_RefCycles: + goto handle_RefCycles + + case ffj_t_PerfStatistics_CPUClock: + goto handle_CPUClock + + case ffj_t_PerfStatistics_TaskClock: + goto handle_TaskClock + + case ffj_t_PerfStatistics_PageFaults: + goto handle_PageFaults + + case ffj_t_PerfStatistics_MinorFaults: + goto handle_MinorFaults + + case ffj_t_PerfStatistics_MajorFaults: + goto handle_MajorFaults + + case ffj_t_PerfStatistics_ContextSwitches: + goto handle_ContextSwitches + + case ffj_t_PerfStatistics_CPUMigrations: + goto handle_CPUMigrations + + case ffj_t_PerfStatistics_AlignmentFaults: + goto handle_AlignmentFaults + + case ffj_t_PerfStatistics_EmulationFaults: + goto handle_EmulationFaults + + case ffj_t_PerfStatistics_L1DcacheLoads: + goto handle_L1DcacheLoads + + case ffj_t_PerfStatistics_L1DcacheLoadMisses: + goto handle_L1DcacheLoadMisses + + case ffj_t_PerfStatistics_L1DcacheStores: + goto handle_L1DcacheStores + + case ffj_t_PerfStatistics_L1DcacheStoreMisses: + goto handle_L1DcacheStoreMisses + + case ffj_t_PerfStatistics_L1DcachePrefetches: + goto handle_L1DcachePrefetches + + case ffj_t_PerfStatistics_L1DcachePrefetchMisses: + goto handle_L1DcachePrefetchMisses + + case ffj_t_PerfStatistics_L1IcacheLoads: + goto handle_L1IcacheLoads + + case ffj_t_PerfStatistics_L1IcacheLoadMisses: + goto handle_L1IcacheLoadMisses + + case ffj_t_PerfStatistics_L1IcachePrefetches: + goto handle_L1IcachePrefetches + + case ffj_t_PerfStatistics_L1IcachePrefetchMisses: + goto handle_L1IcachePrefetchMisses + + case ffj_t_PerfStatistics_LLCLoads: + goto handle_LLCLoads + + case ffj_t_PerfStatistics_LLCLoadMisses: + goto handle_LLCLoadMisses + + case ffj_t_PerfStatistics_LLCStores: + goto handle_LLCStores + + case ffj_t_PerfStatistics_LLCStoreMisses: + goto handle_LLCStoreMisses + + case ffj_t_PerfStatistics_LLCPrefetches: + goto handle_LLCPrefetches + + case ffj_t_PerfStatistics_LLCPrefetchMisses: + goto handle_LLCPrefetchMisses + + case ffj_t_PerfStatistics_DTLBLoads: + goto handle_DTLBLoads + + case ffj_t_PerfStatistics_DTLBLoadMisses: + goto handle_DTLBLoadMisses + + case ffj_t_PerfStatistics_DTLBStores: + goto handle_DTLBStores + + case ffj_t_PerfStatistics_DTLBStoreMisses: + goto handle_DTLBStoreMisses + + case ffj_t_PerfStatistics_DTLBPrefetches: + goto handle_DTLBPrefetches + + case ffj_t_PerfStatistics_DTLBPrefetchMisses: + goto handle_DTLBPrefetchMisses + + case ffj_t_PerfStatistics_ITLBLoads: + goto handle_ITLBLoads + + case ffj_t_PerfStatistics_ITLBLoadMisses: + goto handle_ITLBLoadMisses + + case ffj_t_PerfStatistics_BranchLoads: + goto handle_BranchLoads + + case ffj_t_PerfStatistics_BranchLoadMisses: + goto handle_BranchLoadMisses + + case ffj_t_PerfStatistics_NodeLoads: + goto handle_NodeLoads + + case ffj_t_PerfStatistics_NodeLoadMisses: + goto handle_NodeLoadMisses + + case ffj_t_PerfStatistics_NodeStores: + goto handle_NodeStores + + case ffj_t_PerfStatistics_NodeStoreMisses: + goto handle_NodeStoreMisses + + case ffj_t_PerfStatistics_NodePrefetches: + goto handle_NodePrefetches + + case ffj_t_PerfStatistics_NodePrefetchMisses: + goto handle_NodePrefetchMisses + + case ffj_t_PerfStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Timestamp: + + /* handler: uj.Timestamp type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Timestamp = float64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Duration: + + /* handler: uj.Duration type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Duration = float64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Cycles: + + /* handler: uj.Cycles type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Cycles = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Cycles = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_StalledCyclesFrontend: + + /* handler: uj.StalledCyclesFrontend type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.StalledCyclesFrontend = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.StalledCyclesFrontend = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_StalledCyclesBackend: + + /* handler: uj.StalledCyclesBackend type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.StalledCyclesBackend = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.StalledCyclesBackend = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Instructions: + + /* handler: uj.Instructions type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Instructions = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Instructions = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CacheReferences: + + /* handler: uj.CacheReferences type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CacheReferences = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.CacheReferences = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CacheMisses: + + /* handler: uj.CacheMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CacheMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.CacheMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Branches: + + /* handler: uj.Branches type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Branches = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Branches = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BranchMisses: + + /* handler: uj.BranchMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.BranchMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.BranchMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BusCycles: + + /* handler: uj.BusCycles type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.BusCycles = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.BusCycles = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RefCycles: + + /* handler: uj.RefCycles type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RefCycles = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.RefCycles = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUClock: + + /* handler: uj.CPUClock type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUClock = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.CPUClock = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TaskClock: + + /* handler: uj.TaskClock type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.TaskClock = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.TaskClock = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_PageFaults: + + /* handler: uj.PageFaults type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.PageFaults = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.PageFaults = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MinorFaults: + + /* handler: uj.MinorFaults type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MinorFaults = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MinorFaults = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MajorFaults: + + /* handler: uj.MajorFaults type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MajorFaults = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MajorFaults = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContextSwitches: + + /* handler: uj.ContextSwitches type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ContextSwitches = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.ContextSwitches = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUMigrations: + + /* handler: uj.CPUMigrations type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUMigrations = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.CPUMigrations = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AlignmentFaults: + + /* handler: uj.AlignmentFaults type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.AlignmentFaults = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.AlignmentFaults = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_EmulationFaults: + + /* handler: uj.EmulationFaults type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.EmulationFaults = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.EmulationFaults = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1DcacheLoads: + + /* handler: uj.L1DcacheLoads type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1DcacheLoads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1DcacheLoads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1DcacheLoadMisses: + + /* handler: uj.L1DcacheLoadMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1DcacheLoadMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1DcacheLoadMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1DcacheStores: + + /* handler: uj.L1DcacheStores type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1DcacheStores = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1DcacheStores = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1DcacheStoreMisses: + + /* handler: uj.L1DcacheStoreMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1DcacheStoreMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1DcacheStoreMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1DcachePrefetches: + + /* handler: uj.L1DcachePrefetches type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1DcachePrefetches = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1DcachePrefetches = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1DcachePrefetchMisses: + + /* handler: uj.L1DcachePrefetchMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1DcachePrefetchMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1DcachePrefetchMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1IcacheLoads: + + /* handler: uj.L1IcacheLoads type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1IcacheLoads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1IcacheLoads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1IcacheLoadMisses: + + /* handler: uj.L1IcacheLoadMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1IcacheLoadMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1IcacheLoadMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1IcachePrefetches: + + /* handler: uj.L1IcachePrefetches type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1IcachePrefetches = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1IcachePrefetches = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_L1IcachePrefetchMisses: + + /* handler: uj.L1IcachePrefetchMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.L1IcachePrefetchMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.L1IcachePrefetchMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LLCLoads: + + /* handler: uj.LLCLoads type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.LLCLoads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.LLCLoads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LLCLoadMisses: + + /* handler: uj.LLCLoadMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.LLCLoadMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.LLCLoadMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LLCStores: + + /* handler: uj.LLCStores type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.LLCStores = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.LLCStores = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LLCStoreMisses: + + /* handler: uj.LLCStoreMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.LLCStoreMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.LLCStoreMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LLCPrefetches: + + /* handler: uj.LLCPrefetches type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.LLCPrefetches = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.LLCPrefetches = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_LLCPrefetchMisses: + + /* handler: uj.LLCPrefetchMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.LLCPrefetchMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.LLCPrefetchMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DTLBLoads: + + /* handler: uj.DTLBLoads type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DTLBLoads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DTLBLoads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DTLBLoadMisses: + + /* handler: uj.DTLBLoadMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DTLBLoadMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DTLBLoadMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DTLBStores: + + /* handler: uj.DTLBStores type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DTLBStores = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DTLBStores = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DTLBStoreMisses: + + /* handler: uj.DTLBStoreMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DTLBStoreMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DTLBStoreMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DTLBPrefetches: + + /* handler: uj.DTLBPrefetches type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DTLBPrefetches = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DTLBPrefetches = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DTLBPrefetchMisses: + + /* handler: uj.DTLBPrefetchMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DTLBPrefetchMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DTLBPrefetchMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ITLBLoads: + + /* handler: uj.ITLBLoads type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ITLBLoads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.ITLBLoads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ITLBLoadMisses: + + /* handler: uj.ITLBLoadMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ITLBLoadMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.ITLBLoadMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BranchLoads: + + /* handler: uj.BranchLoads type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.BranchLoads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.BranchLoads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BranchLoadMisses: + + /* handler: uj.BranchLoadMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.BranchLoadMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.BranchLoadMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NodeLoads: + + /* handler: uj.NodeLoads type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NodeLoads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NodeLoads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NodeLoadMisses: + + /* handler: uj.NodeLoadMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NodeLoadMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NodeLoadMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NodeStores: + + /* handler: uj.NodeStores type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NodeStores = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NodeStores = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NodeStoreMisses: + + /* handler: uj.NodeStoreMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NodeStoreMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NodeStoreMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NodePrefetches: + + /* handler: uj.NodePrefetches type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NodePrefetches = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NodePrefetches = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NodePrefetchMisses: + + /* handler: uj.NodePrefetchMisses type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NodePrefetchMisses = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NodePrefetchMisses = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Port) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Port) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "number":`) + fflib.FormatBits2(buf, uint64(mj.Number), 10, false) + buf.WriteByte(',') + if mj.Name != nil { + if true { + buf.WriteString(`"name":`) + fflib.WriteJsonString(buf, string(*mj.Name)) + buf.WriteByte(',') + } + } + if mj.Protocol != nil { + if true { + buf.WriteString(`"protocol":`) + fflib.WriteJsonString(buf, string(*mj.Protocol)) + buf.WriteByte(',') + } + } + if mj.Visibility != nil { + if true { + buf.WriteString(`"visibility":`) + + { + + obj, err = mj.Visibility.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Portbase = iota + ffj_t_Portno_such_key + + ffj_t_Port_Number + + ffj_t_Port_Name + + ffj_t_Port_Protocol + + ffj_t_Port_Visibility + + ffj_t_Port_Labels +) + +var ffj_key_Port_Number = []byte("number") + +var ffj_key_Port_Name = []byte("name") + +var ffj_key_Port_Protocol = []byte("protocol") + +var ffj_key_Port_Visibility = []byte("visibility") + +var ffj_key_Port_Labels = []byte("labels") + +func (uj *Port) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Port) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Portbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Portno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'l': + + if bytes.Equal(ffj_key_Port_Labels, kn) { + currentKey = ffj_t_Port_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Port_Number, kn) { + currentKey = ffj_t_Port_Number + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Port_Name, kn) { + currentKey = ffj_t_Port_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Port_Protocol, kn) { + currentKey = ffj_t_Port_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Port_Visibility, kn) { + currentKey = ffj_t_Port_Visibility + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Port_Labels, kn) { + currentKey = ffj_t_Port_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Port_Visibility, kn) { + currentKey = ffj_t_Port_Visibility + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Port_Protocol, kn) { + currentKey = ffj_t_Port_Protocol + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Port_Name, kn) { + currentKey = ffj_t_Port_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Port_Number, kn) { + currentKey = ffj_t_Port_Number + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Portno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Port_Number: + goto handle_Number + + case ffj_t_Port_Name: + goto handle_Name + + case ffj_t_Port_Protocol: + goto handle_Protocol + + case ffj_t_Port_Visibility: + goto handle_Visibility + + case ffj_t_Port_Labels: + goto handle_Labels + + case ffj_t_Portno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Number: + + /* handler: uj.Number type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Number = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Name = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Name = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Protocol: + + /* handler: uj.Protocol type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Protocol = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Protocol = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Visibility: + + /* handler: uj.Visibility type=mesos.DiscoveryInfo_Visibility kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Visibility = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Visibility == nil { + uj.Visibility = new(DiscoveryInfo_Visibility) + } + + err = uj.Visibility.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Ports) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Ports) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"ports":`) + if mj.Ports != nil { + buf.WriteString(`[`) + for i, v := range mj.Ports { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Portsbase = iota + ffj_t_Portsno_such_key + + ffj_t_Ports_Ports +) + +var ffj_key_Ports_Ports = []byte("ports") + +func (uj *Ports) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Ports) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Portsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Portsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_Ports_Ports, kn) { + currentKey = ffj_t_Ports_Ports + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Ports_Ports, kn) { + currentKey = ffj_t_Ports_Ports + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Portsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Ports_Ports: + goto handle_Ports + + case ffj_t_Portsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Ports: + + /* handler: uj.Ports type=[]mesos.Port kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Ports = nil + } else { + + uj.Ports = []Port{} + + wantVal := true + + for { + + var tmp_uj__Ports Port + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Ports type=mesos.Port kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Ports.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Ports = append(uj.Ports, tmp_uj__Ports) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *RLimitInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *RLimitInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"rlimits":`) + if mj.Rlimits != nil { + buf.WriteString(`[`) + for i, v := range mj.Rlimits { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_RLimitInfobase = iota + ffj_t_RLimitInfono_such_key + + ffj_t_RLimitInfo_Rlimits +) + +var ffj_key_RLimitInfo_Rlimits = []byte("rlimits") + +func (uj *RLimitInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *RLimitInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_RLimitInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_RLimitInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_RLimitInfo_Rlimits, kn) { + currentKey = ffj_t_RLimitInfo_Rlimits + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_RLimitInfo_Rlimits, kn) { + currentKey = ffj_t_RLimitInfo_Rlimits + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_RLimitInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_RLimitInfo_Rlimits: + goto handle_Rlimits + + case ffj_t_RLimitInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Rlimits: + + /* handler: uj.Rlimits type=[]mesos.RLimitInfo_RLimit kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Rlimits = nil + } else { + + uj.Rlimits = []RLimitInfo_RLimit{} + + wantVal := true + + for { + + var tmp_uj__Rlimits RLimitInfo_RLimit + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Rlimits type=mesos.RLimitInfo_RLimit kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Rlimits.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Rlimits = append(uj.Rlimits, tmp_uj__Rlimits) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *RLimitInfo_RLimit) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *RLimitInfo_RLimit) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Hard != nil { + if true { + buf.WriteString(`"hard":`) + fflib.FormatBits2(buf, uint64(*mj.Hard), 10, false) + buf.WriteByte(',') + } + } + if mj.Soft != nil { + if true { + buf.WriteString(`"soft":`) + fflib.FormatBits2(buf, uint64(*mj.Soft), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_RLimitInfo_RLimitbase = iota + ffj_t_RLimitInfo_RLimitno_such_key + + ffj_t_RLimitInfo_RLimit_Type + + ffj_t_RLimitInfo_RLimit_Hard + + ffj_t_RLimitInfo_RLimit_Soft +) + +var ffj_key_RLimitInfo_RLimit_Type = []byte("type") + +var ffj_key_RLimitInfo_RLimit_Hard = []byte("hard") + +var ffj_key_RLimitInfo_RLimit_Soft = []byte("soft") + +func (uj *RLimitInfo_RLimit) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *RLimitInfo_RLimit) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_RLimitInfo_RLimitbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_RLimitInfo_RLimitno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'h': + + if bytes.Equal(ffj_key_RLimitInfo_RLimit_Hard, kn) { + currentKey = ffj_t_RLimitInfo_RLimit_Hard + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_RLimitInfo_RLimit_Soft, kn) { + currentKey = ffj_t_RLimitInfo_RLimit_Soft + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_RLimitInfo_RLimit_Type, kn) { + currentKey = ffj_t_RLimitInfo_RLimit_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_RLimitInfo_RLimit_Soft, kn) { + currentKey = ffj_t_RLimitInfo_RLimit_Soft + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_RLimitInfo_RLimit_Hard, kn) { + currentKey = ffj_t_RLimitInfo_RLimit_Hard + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_RLimitInfo_RLimit_Type, kn) { + currentKey = ffj_t_RLimitInfo_RLimit_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_RLimitInfo_RLimitno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_RLimitInfo_RLimit_Type: + goto handle_Type + + case ffj_t_RLimitInfo_RLimit_Hard: + goto handle_Hard + + case ffj_t_RLimitInfo_RLimit_Soft: + goto handle_Soft + + case ffj_t_RLimitInfo_RLimitno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.RLimitInfo_RLimit_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Hard: + + /* handler: uj.Hard type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Hard = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Hard = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Soft: + + /* handler: uj.Soft type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Soft = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Soft = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *RateLimit) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *RateLimit) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.QPS != nil { + if true { + buf.WriteString(`"qps":`) + fflib.AppendFloat(buf, float64(*mj.QPS), 'g', -1, 64) + buf.WriteByte(',') + } + } + buf.WriteString(`"principal":`) + fflib.WriteJsonString(buf, string(mj.Principal)) + buf.WriteByte(',') + if mj.Capacity != nil { + if true { + buf.WriteString(`"capacity":`) + fflib.FormatBits2(buf, uint64(*mj.Capacity), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_RateLimitbase = iota + ffj_t_RateLimitno_such_key + + ffj_t_RateLimit_QPS + + ffj_t_RateLimit_Principal + + ffj_t_RateLimit_Capacity +) + +var ffj_key_RateLimit_QPS = []byte("qps") + +var ffj_key_RateLimit_Principal = []byte("principal") + +var ffj_key_RateLimit_Capacity = []byte("capacity") + +func (uj *RateLimit) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *RateLimit) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_RateLimitbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_RateLimitno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_RateLimit_Capacity, kn) { + currentKey = ffj_t_RateLimit_Capacity + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_RateLimit_Principal, kn) { + currentKey = ffj_t_RateLimit_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'q': + + if bytes.Equal(ffj_key_RateLimit_QPS, kn) { + currentKey = ffj_t_RateLimit_QPS + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_RateLimit_Capacity, kn) { + currentKey = ffj_t_RateLimit_Capacity + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_RateLimit_Principal, kn) { + currentKey = ffj_t_RateLimit_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_RateLimit_QPS, kn) { + currentKey = ffj_t_RateLimit_QPS + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_RateLimitno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_RateLimit_QPS: + goto handle_QPS + + case ffj_t_RateLimit_Principal: + goto handle_Principal + + case ffj_t_RateLimit_Capacity: + goto handle_Capacity + + case ffj_t_RateLimitno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_QPS: + + /* handler: uj.QPS type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.QPS = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.QPS = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Principal: + + /* handler: uj.Principal type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Principal = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Capacity: + + /* handler: uj.Capacity type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Capacity = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Capacity = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *RateLimits) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *RateLimits) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "limits":`) + if mj.Limits != nil { + buf.WriteString(`[`) + for i, v := range mj.Limits { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.AggregateDefaultQPS != nil { + if true { + buf.WriteString(`"aggregate_default_qps":`) + fflib.AppendFloat(buf, float64(*mj.AggregateDefaultQPS), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.AggregateDefaultCapacity != nil { + if true { + buf.WriteString(`"aggregate_default_capacity":`) + fflib.FormatBits2(buf, uint64(*mj.AggregateDefaultCapacity), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_RateLimitsbase = iota + ffj_t_RateLimitsno_such_key + + ffj_t_RateLimits_Limits + + ffj_t_RateLimits_AggregateDefaultQPS + + ffj_t_RateLimits_AggregateDefaultCapacity +) + +var ffj_key_RateLimits_Limits = []byte("limits") + +var ffj_key_RateLimits_AggregateDefaultQPS = []byte("aggregate_default_qps") + +var ffj_key_RateLimits_AggregateDefaultCapacity = []byte("aggregate_default_capacity") + +func (uj *RateLimits) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *RateLimits) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_RateLimitsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_RateLimitsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_RateLimits_AggregateDefaultQPS, kn) { + currentKey = ffj_t_RateLimits_AggregateDefaultQPS + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_RateLimits_AggregateDefaultCapacity, kn) { + currentKey = ffj_t_RateLimits_AggregateDefaultCapacity + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_RateLimits_Limits, kn) { + currentKey = ffj_t_RateLimits_Limits + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_RateLimits_AggregateDefaultCapacity, kn) { + currentKey = ffj_t_RateLimits_AggregateDefaultCapacity + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_RateLimits_AggregateDefaultQPS, kn) { + currentKey = ffj_t_RateLimits_AggregateDefaultQPS + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_RateLimits_Limits, kn) { + currentKey = ffj_t_RateLimits_Limits + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_RateLimitsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_RateLimits_Limits: + goto handle_Limits + + case ffj_t_RateLimits_AggregateDefaultQPS: + goto handle_AggregateDefaultQPS + + case ffj_t_RateLimits_AggregateDefaultCapacity: + goto handle_AggregateDefaultCapacity + + case ffj_t_RateLimitsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Limits: + + /* handler: uj.Limits type=[]mesos.RateLimit kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Limits = nil + } else { + + uj.Limits = []RateLimit{} + + wantVal := true + + for { + + var tmp_uj__Limits RateLimit + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Limits type=mesos.RateLimit kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Limits.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Limits = append(uj.Limits, tmp_uj__Limits) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AggregateDefaultQPS: + + /* handler: uj.AggregateDefaultQPS type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.AggregateDefaultQPS = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.AggregateDefaultQPS = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AggregateDefaultCapacity: + + /* handler: uj.AggregateDefaultCapacity type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.AggregateDefaultCapacity = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.AggregateDefaultCapacity = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Request) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Request) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteByte('{') + if mj.AgentID != nil { + if true { + buf.WriteString(`"agent_id":`) + + { + + err = mj.AgentID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Requestbase = iota + ffj_t_Requestno_such_key + + ffj_t_Request_AgentID + + ffj_t_Request_Resources +) + +var ffj_key_Request_AgentID = []byte("agent_id") + +var ffj_key_Request_Resources = []byte("resources") + +func (uj *Request) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Request) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Requestbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Requestno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Request_AgentID, kn) { + currentKey = ffj_t_Request_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Request_Resources, kn) { + currentKey = ffj_t_Request_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Request_Resources, kn) { + currentKey = ffj_t_Request_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Request_AgentID, kn) { + currentKey = ffj_t_Request_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Requestno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Request_AgentID: + goto handle_AgentID + + case ffj_t_Request_Resources: + goto handle_Resources + + case ffj_t_Requestno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_AgentID: + + /* handler: uj.AgentID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AgentID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AgentID == nil { + uj.AgentID = new(AgentID) + } + + err = uj.AgentID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ProviderID != nil { + if true { + buf.WriteString(`"provider_id":`) + + { + + err = mj.ProviderID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.Type != nil { + if true { + buf.WriteString(`"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Scalar != nil { + if true { + buf.WriteString(`"scalar":`) + + { + + err = mj.Scalar.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Ranges != nil { + if true { + buf.WriteString(`"ranges":`) + + { + + err = mj.Ranges.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Set != nil { + if true { + buf.WriteString(`"set":`) + + { + + err = mj.Set.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Role != nil { + if true { + buf.WriteString(`"role":`) + fflib.WriteJsonString(buf, string(*mj.Role)) + buf.WriteByte(',') + } + } + if mj.AllocationInfo != nil { + if true { + buf.WriteString(`"allocation_info":`) + + { + + err = mj.AllocationInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Reservation != nil { + if true { + buf.WriteString(`"reservation":`) + + { + + err = mj.Reservation.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"reservations":`) + if mj.Reservations != nil { + buf.WriteString(`[`) + for i, v := range mj.Reservations { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Disk != nil { + if true { + buf.WriteString(`"disk":`) + + { + + err = mj.Disk.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Revocable != nil { + if true { + buf.WriteString(`"revocable":`) + + { + + err = mj.Revocable.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Shared != nil { + if true { + buf.WriteString(`"shared":`) + + { + + err = mj.Shared.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resourcebase = iota + ffj_t_Resourceno_such_key + + ffj_t_Resource_ProviderID + + ffj_t_Resource_Name + + ffj_t_Resource_Type + + ffj_t_Resource_Scalar + + ffj_t_Resource_Ranges + + ffj_t_Resource_Set + + ffj_t_Resource_Role + + ffj_t_Resource_AllocationInfo + + ffj_t_Resource_Reservation + + ffj_t_Resource_Reservations + + ffj_t_Resource_Disk + + ffj_t_Resource_Revocable + + ffj_t_Resource_Shared +) + +var ffj_key_Resource_ProviderID = []byte("provider_id") + +var ffj_key_Resource_Name = []byte("name") + +var ffj_key_Resource_Type = []byte("type") + +var ffj_key_Resource_Scalar = []byte("scalar") + +var ffj_key_Resource_Ranges = []byte("ranges") + +var ffj_key_Resource_Set = []byte("set") + +var ffj_key_Resource_Role = []byte("role") + +var ffj_key_Resource_AllocationInfo = []byte("allocation_info") + +var ffj_key_Resource_Reservation = []byte("reservation") + +var ffj_key_Resource_Reservations = []byte("reservations") + +var ffj_key_Resource_Disk = []byte("disk") + +var ffj_key_Resource_Revocable = []byte("revocable") + +var ffj_key_Resource_Shared = []byte("shared") + +func (uj *Resource) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resourcebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resourceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Resource_AllocationInfo, kn) { + currentKey = ffj_t_Resource_AllocationInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_Resource_Disk, kn) { + currentKey = ffj_t_Resource_Disk + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Resource_Name, kn) { + currentKey = ffj_t_Resource_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Resource_ProviderID, kn) { + currentKey = ffj_t_Resource_ProviderID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Resource_Ranges, kn) { + currentKey = ffj_t_Resource_Ranges + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_Role, kn) { + currentKey = ffj_t_Resource_Role + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_Reservation, kn) { + currentKey = ffj_t_Resource_Reservation + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_Reservations, kn) { + currentKey = ffj_t_Resource_Reservations + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_Revocable, kn) { + currentKey = ffj_t_Resource_Revocable + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Resource_Scalar, kn) { + currentKey = ffj_t_Resource_Scalar + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_Set, kn) { + currentKey = ffj_t_Resource_Set + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_Shared, kn) { + currentKey = ffj_t_Resource_Shared + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Resource_Type, kn) { + currentKey = ffj_t_Resource_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Resource_Shared, kn) { + currentKey = ffj_t_Resource_Shared + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_Revocable, kn) { + currentKey = ffj_t_Resource_Revocable + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Resource_Disk, kn) { + currentKey = ffj_t_Resource_Disk + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Resource_Reservations, kn) { + currentKey = ffj_t_Resource_Reservations + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Resource_Reservation, kn) { + currentKey = ffj_t_Resource_Reservation + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Resource_AllocationInfo, kn) { + currentKey = ffj_t_Resource_AllocationInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_Role, kn) { + currentKey = ffj_t_Resource_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Resource_Set, kn) { + currentKey = ffj_t_Resource_Set + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Resource_Ranges, kn) { + currentKey = ffj_t_Resource_Ranges + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Resource_Scalar, kn) { + currentKey = ffj_t_Resource_Scalar + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_Type, kn) { + currentKey = ffj_t_Resource_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_Name, kn) { + currentKey = ffj_t_Resource_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Resource_ProviderID, kn) { + currentKey = ffj_t_Resource_ProviderID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resourceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_ProviderID: + goto handle_ProviderID + + case ffj_t_Resource_Name: + goto handle_Name + + case ffj_t_Resource_Type: + goto handle_Type + + case ffj_t_Resource_Scalar: + goto handle_Scalar + + case ffj_t_Resource_Ranges: + goto handle_Ranges + + case ffj_t_Resource_Set: + goto handle_Set + + case ffj_t_Resource_Role: + goto handle_Role + + case ffj_t_Resource_AllocationInfo: + goto handle_AllocationInfo + + case ffj_t_Resource_Reservation: + goto handle_Reservation + + case ffj_t_Resource_Reservations: + goto handle_Reservations + + case ffj_t_Resource_Disk: + goto handle_Disk + + case ffj_t_Resource_Revocable: + goto handle_Revocable + + case ffj_t_Resource_Shared: + goto handle_Shared + + case ffj_t_Resourceno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ProviderID: + + /* handler: uj.ProviderID type=mesos.ResourceProviderID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ProviderID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ProviderID == nil { + uj.ProviderID = new(ResourceProviderID) + } + + err = uj.ProviderID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Type: + + /* handler: uj.Type type=mesos.Value_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Type = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Type == nil { + uj.Type = new(Value_Type) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Scalar: + + /* handler: uj.Scalar type=mesos.Value_Scalar kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Scalar = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Scalar == nil { + uj.Scalar = new(Value_Scalar) + } + + err = uj.Scalar.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Ranges: + + /* handler: uj.Ranges type=mesos.Value_Ranges kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Ranges = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Ranges == nil { + uj.Ranges = new(Value_Ranges) + } + + err = uj.Ranges.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Set: + + /* handler: uj.Set type=mesos.Value_Set kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Set = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Set == nil { + uj.Set = new(Value_Set) + } + + err = uj.Set.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Role: + + /* handler: uj.Role type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Role = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Role = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AllocationInfo: + + /* handler: uj.AllocationInfo type=mesos.Resource_AllocationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AllocationInfo = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AllocationInfo == nil { + uj.AllocationInfo = new(Resource_AllocationInfo) + } + + err = uj.AllocationInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Reservation: + + /* handler: uj.Reservation type=mesos.Resource_ReservationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Reservation = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Reservation == nil { + uj.Reservation = new(Resource_ReservationInfo) + } + + err = uj.Reservation.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Reservations: + + /* handler: uj.Reservations type=[]mesos.Resource_ReservationInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Reservations = nil + } else { + + uj.Reservations = []Resource_ReservationInfo{} + + wantVal := true + + for { + + var tmp_uj__Reservations Resource_ReservationInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Reservations type=mesos.Resource_ReservationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Reservations.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Reservations = append(uj.Reservations, tmp_uj__Reservations) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Disk: + + /* handler: uj.Disk type=mesos.Resource_DiskInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Disk = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Disk == nil { + uj.Disk = new(Resource_DiskInfo) + } + + err = uj.Disk.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Revocable: + + /* handler: uj.Revocable type=mesos.Resource_RevocableInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Revocable = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Revocable == nil { + uj.Revocable = new(Resource_RevocableInfo) + } + + err = uj.Revocable.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Shared: + + /* handler: uj.Shared type=mesos.Resource_SharedInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Shared = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Shared == nil { + uj.Shared = new(Resource_SharedInfo) + } + + err = uj.Shared.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ResourceProviderID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ResourceProviderID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ResourceProviderIDbase = iota + ffj_t_ResourceProviderIDno_such_key + + ffj_t_ResourceProviderID_Value +) + +var ffj_key_ResourceProviderID_Value = []byte("value") + +func (uj *ResourceProviderID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ResourceProviderID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ResourceProviderIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ResourceProviderIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_ResourceProviderID_Value, kn) { + currentKey = ffj_t_ResourceProviderID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceProviderID_Value, kn) { + currentKey = ffj_t_ResourceProviderID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ResourceProviderIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ResourceProviderID_Value: + goto handle_Value + + case ffj_t_ResourceProviderIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ResourceProviderInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ResourceProviderInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.ID != nil { + if true { + buf.WriteString(`"id":`) + + { + + err = mj.ID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"attributes":`) + if mj.Attributes != nil { + buf.WriteString(`[`) + for i, v := range mj.Attributes { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"type":`) + fflib.WriteJsonString(buf, string(mj.Type)) + buf.WriteString(`,"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteString(`,"default_reservations":`) + if mj.DefaultReservations != nil { + buf.WriteString(`[`) + for i, v := range mj.DefaultReservations { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Storage != nil { + if true { + buf.WriteString(`"storage":`) + + { + + err = mj.Storage.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ResourceProviderInfobase = iota + ffj_t_ResourceProviderInfono_such_key + + ffj_t_ResourceProviderInfo_ID + + ffj_t_ResourceProviderInfo_Attributes + + ffj_t_ResourceProviderInfo_Type + + ffj_t_ResourceProviderInfo_Name + + ffj_t_ResourceProviderInfo_DefaultReservations + + ffj_t_ResourceProviderInfo_Storage +) + +var ffj_key_ResourceProviderInfo_ID = []byte("id") + +var ffj_key_ResourceProviderInfo_Attributes = []byte("attributes") + +var ffj_key_ResourceProviderInfo_Type = []byte("type") + +var ffj_key_ResourceProviderInfo_Name = []byte("name") + +var ffj_key_ResourceProviderInfo_DefaultReservations = []byte("default_reservations") + +var ffj_key_ResourceProviderInfo_Storage = []byte("storage") + +func (uj *ResourceProviderInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ResourceProviderInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ResourceProviderInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ResourceProviderInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_ResourceProviderInfo_Attributes, kn) { + currentKey = ffj_t_ResourceProviderInfo_Attributes + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_ResourceProviderInfo_DefaultReservations, kn) { + currentKey = ffj_t_ResourceProviderInfo_DefaultReservations + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_ResourceProviderInfo_ID, kn) { + currentKey = ffj_t_ResourceProviderInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_ResourceProviderInfo_Name, kn) { + currentKey = ffj_t_ResourceProviderInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_ResourceProviderInfo_Storage, kn) { + currentKey = ffj_t_ResourceProviderInfo_Storage + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ResourceProviderInfo_Type, kn) { + currentKey = ffj_t_ResourceProviderInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_ResourceProviderInfo_Storage, kn) { + currentKey = ffj_t_ResourceProviderInfo_Storage + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceProviderInfo_DefaultReservations, kn) { + currentKey = ffj_t_ResourceProviderInfo_DefaultReservations + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceProviderInfo_Name, kn) { + currentKey = ffj_t_ResourceProviderInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceProviderInfo_Type, kn) { + currentKey = ffj_t_ResourceProviderInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceProviderInfo_Attributes, kn) { + currentKey = ffj_t_ResourceProviderInfo_Attributes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceProviderInfo_ID, kn) { + currentKey = ffj_t_ResourceProviderInfo_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ResourceProviderInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ResourceProviderInfo_ID: + goto handle_ID + + case ffj_t_ResourceProviderInfo_Attributes: + goto handle_Attributes + + case ffj_t_ResourceProviderInfo_Type: + goto handle_Type + + case ffj_t_ResourceProviderInfo_Name: + goto handle_Name + + case ffj_t_ResourceProviderInfo_DefaultReservations: + goto handle_DefaultReservations + + case ffj_t_ResourceProviderInfo_Storage: + goto handle_Storage + + case ffj_t_ResourceProviderInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ID: + + /* handler: uj.ID type=mesos.ResourceProviderID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ID == nil { + uj.ID = new(ResourceProviderID) + } + + err = uj.ID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Attributes: + + /* handler: uj.Attributes type=[]mesos.Attribute kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Attributes = nil + } else { + + uj.Attributes = []Attribute{} + + wantVal := true + + for { + + var tmp_uj__Attributes Attribute + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Attributes type=mesos.Attribute kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Attributes.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Attributes = append(uj.Attributes, tmp_uj__Attributes) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Type: + + /* handler: uj.Type type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Type = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DefaultReservations: + + /* handler: uj.DefaultReservations type=[]mesos.Resource_ReservationInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.DefaultReservations = nil + } else { + + uj.DefaultReservations = []Resource_ReservationInfo{} + + wantVal := true + + for { + + var tmp_uj__DefaultReservations Resource_ReservationInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__DefaultReservations type=mesos.Resource_ReservationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__DefaultReservations.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.DefaultReservations = append(uj.DefaultReservations, tmp_uj__DefaultReservations) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Storage: + + /* handler: uj.Storage type=mesos.ResourceProviderInfo_Storage kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Storage = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Storage == nil { + uj.Storage = new(ResourceProviderInfo_Storage) + } + + err = uj.Storage.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ResourceProviderInfo_Storage) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ResourceProviderInfo_Storage) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"plugin":`) + + { + + err = mj.Plugin.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ResourceProviderInfo_Storagebase = iota + ffj_t_ResourceProviderInfo_Storageno_such_key + + ffj_t_ResourceProviderInfo_Storage_Plugin +) + +var ffj_key_ResourceProviderInfo_Storage_Plugin = []byte("plugin") + +func (uj *ResourceProviderInfo_Storage) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ResourceProviderInfo_Storage) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ResourceProviderInfo_Storagebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ResourceProviderInfo_Storageno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_ResourceProviderInfo_Storage_Plugin, kn) { + currentKey = ffj_t_ResourceProviderInfo_Storage_Plugin + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceProviderInfo_Storage_Plugin, kn) { + currentKey = ffj_t_ResourceProviderInfo_Storage_Plugin + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ResourceProviderInfo_Storageno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ResourceProviderInfo_Storage_Plugin: + goto handle_Plugin + + case ffj_t_ResourceProviderInfo_Storageno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Plugin: + + /* handler: uj.Plugin type=mesos.CSIPluginInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Plugin.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ResourceStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ResourceStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "timestamp":`) + fflib.AppendFloat(buf, float64(mj.Timestamp), 'g', -1, 64) + buf.WriteByte(',') + if mj.Processes != nil { + if true { + buf.WriteString(`"processes":`) + fflib.FormatBits2(buf, uint64(*mj.Processes), 10, false) + buf.WriteByte(',') + } + } + if mj.Threads != nil { + if true { + buf.WriteString(`"threads":`) + fflib.FormatBits2(buf, uint64(*mj.Threads), 10, false) + buf.WriteByte(',') + } + } + if mj.CPUsUserTimeSecs != nil { + if true { + buf.WriteString(`"cpus_user_time_secs":`) + fflib.AppendFloat(buf, float64(*mj.CPUsUserTimeSecs), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.CPUsSystemTimeSecs != nil { + if true { + buf.WriteString(`"cpus_system_time_secs":`) + fflib.AppendFloat(buf, float64(*mj.CPUsSystemTimeSecs), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.CPUsLimit != nil { + if true { + buf.WriteString(`"cpus_limit":`) + fflib.AppendFloat(buf, float64(*mj.CPUsLimit), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.CPUsNrPeriods != nil { + if true { + buf.WriteString(`"cpus_nr_periods":`) + fflib.FormatBits2(buf, uint64(*mj.CPUsNrPeriods), 10, false) + buf.WriteByte(',') + } + } + if mj.CPUsNrThrottled != nil { + if true { + buf.WriteString(`"cpus_nr_throttled":`) + fflib.FormatBits2(buf, uint64(*mj.CPUsNrThrottled), 10, false) + buf.WriteByte(',') + } + } + if mj.CPUsThrottledTimeSecs != nil { + if true { + buf.WriteString(`"cpus_throttled_time_secs":`) + fflib.AppendFloat(buf, float64(*mj.CPUsThrottledTimeSecs), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.MemTotalBytes != nil { + if true { + buf.WriteString(`"mem_total_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemTotalBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemTotalMemswBytes != nil { + if true { + buf.WriteString(`"mem_total_memsw_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemTotalMemswBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemLimitBytes != nil { + if true { + buf.WriteString(`"mem_limit_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemLimitBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemSoftLimitBytes != nil { + if true { + buf.WriteString(`"mem_soft_limit_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemSoftLimitBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemFileBytes != nil { + if true { + buf.WriteString(`"mem_file_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemFileBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemAnonBytes != nil { + if true { + buf.WriteString(`"mem_anon_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemAnonBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemCacheBytes != nil { + if true { + buf.WriteString(`"mem_cache_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemCacheBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemRSSBytes != nil { + if true { + buf.WriteString(`"mem_rss_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemRSSBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemMappedFileBytes != nil { + if true { + buf.WriteString(`"mem_mapped_file_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemMappedFileBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemSwapBytes != nil { + if true { + buf.WriteString(`"mem_swap_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemSwapBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemUnevictableBytes != nil { + if true { + buf.WriteString(`"mem_unevictable_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.MemUnevictableBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.MemLowPressureCounter != nil { + if true { + buf.WriteString(`"mem_low_pressure_counter":`) + fflib.FormatBits2(buf, uint64(*mj.MemLowPressureCounter), 10, false) + buf.WriteByte(',') + } + } + if mj.MemMediumPressureCounter != nil { + if true { + buf.WriteString(`"mem_medium_pressure_counter":`) + fflib.FormatBits2(buf, uint64(*mj.MemMediumPressureCounter), 10, false) + buf.WriteByte(',') + } + } + if mj.MemCriticalPressureCounter != nil { + if true { + buf.WriteString(`"mem_critical_pressure_counter":`) + fflib.FormatBits2(buf, uint64(*mj.MemCriticalPressureCounter), 10, false) + buf.WriteByte(',') + } + } + if mj.DiskLimitBytes != nil { + if true { + buf.WriteString(`"disk_limit_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.DiskLimitBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.DiskUsedBytes != nil { + if true { + buf.WriteString(`"disk_used_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.DiskUsedBytes), 10, false) + buf.WriteByte(',') + } + } + buf.WriteString(`"disk_statistics":`) + if mj.DiskStatistics != nil { + buf.WriteString(`[`) + for i, v := range mj.DiskStatistics { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.BlkioStatistics != nil { + if true { + buf.WriteString(`"blkio_statistics":`) + + { + + err = mj.BlkioStatistics.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Perf != nil { + if true { + buf.WriteString(`"perf":`) + + { + + err = mj.Perf.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.NetRxPackets != nil { + if true { + buf.WriteString(`"net_rx_packets":`) + fflib.FormatBits2(buf, uint64(*mj.NetRxPackets), 10, false) + buf.WriteByte(',') + } + } + if mj.NetRxBytes != nil { + if true { + buf.WriteString(`"net_rx_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.NetRxBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.NetRxErrors != nil { + if true { + buf.WriteString(`"net_rx_errors":`) + fflib.FormatBits2(buf, uint64(*mj.NetRxErrors), 10, false) + buf.WriteByte(',') + } + } + if mj.NetRxDropped != nil { + if true { + buf.WriteString(`"net_rx_dropped":`) + fflib.FormatBits2(buf, uint64(*mj.NetRxDropped), 10, false) + buf.WriteByte(',') + } + } + if mj.NetTxPackets != nil { + if true { + buf.WriteString(`"net_tx_packets":`) + fflib.FormatBits2(buf, uint64(*mj.NetTxPackets), 10, false) + buf.WriteByte(',') + } + } + if mj.NetTxBytes != nil { + if true { + buf.WriteString(`"net_tx_bytes":`) + fflib.FormatBits2(buf, uint64(*mj.NetTxBytes), 10, false) + buf.WriteByte(',') + } + } + if mj.NetTxErrors != nil { + if true { + buf.WriteString(`"net_tx_errors":`) + fflib.FormatBits2(buf, uint64(*mj.NetTxErrors), 10, false) + buf.WriteByte(',') + } + } + if mj.NetTxDropped != nil { + if true { + buf.WriteString(`"net_tx_dropped":`) + fflib.FormatBits2(buf, uint64(*mj.NetTxDropped), 10, false) + buf.WriteByte(',') + } + } + if mj.NetTCPRttMicrosecsP50 != nil { + if true { + buf.WriteString(`"net_tcp_rtt_microsecs_p50":`) + fflib.AppendFloat(buf, float64(*mj.NetTCPRttMicrosecsP50), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.NetTCPRttMicrosecsP90 != nil { + if true { + buf.WriteString(`"net_tcp_rtt_microsecs_p90":`) + fflib.AppendFloat(buf, float64(*mj.NetTCPRttMicrosecsP90), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.NetTCPRttMicrosecsP95 != nil { + if true { + buf.WriteString(`"net_tcp_rtt_microsecs_p95":`) + fflib.AppendFloat(buf, float64(*mj.NetTCPRttMicrosecsP95), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.NetTCPRttMicrosecsP99 != nil { + if true { + buf.WriteString(`"net_tcp_rtt_microsecs_p99":`) + fflib.AppendFloat(buf, float64(*mj.NetTCPRttMicrosecsP99), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.NetTCPActiveConnections != nil { + if true { + buf.WriteString(`"net_tcp_active_connections":`) + fflib.AppendFloat(buf, float64(*mj.NetTCPActiveConnections), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.NetTCPTimeWaitConnections != nil { + if true { + buf.WriteString(`"net_tcp_time_wait_connections":`) + fflib.AppendFloat(buf, float64(*mj.NetTCPTimeWaitConnections), 'g', -1, 64) + buf.WriteByte(',') + } + } + buf.WriteString(`"net_traffic_control_statistics":`) + if mj.NetTrafficControlStatistics != nil { + buf.WriteString(`[`) + for i, v := range mj.NetTrafficControlStatistics { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.NetSNMPStatistics != nil { + if true { + buf.WriteString(`"net_snmp_statistics":`) + + { + + err = mj.NetSNMPStatistics.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ResourceStatisticsbase = iota + ffj_t_ResourceStatisticsno_such_key + + ffj_t_ResourceStatistics_Timestamp + + ffj_t_ResourceStatistics_Processes + + ffj_t_ResourceStatistics_Threads + + ffj_t_ResourceStatistics_CPUsUserTimeSecs + + ffj_t_ResourceStatistics_CPUsSystemTimeSecs + + ffj_t_ResourceStatistics_CPUsLimit + + ffj_t_ResourceStatistics_CPUsNrPeriods + + ffj_t_ResourceStatistics_CPUsNrThrottled + + ffj_t_ResourceStatistics_CPUsThrottledTimeSecs + + ffj_t_ResourceStatistics_MemTotalBytes + + ffj_t_ResourceStatistics_MemTotalMemswBytes + + ffj_t_ResourceStatistics_MemLimitBytes + + ffj_t_ResourceStatistics_MemSoftLimitBytes + + ffj_t_ResourceStatistics_MemFileBytes + + ffj_t_ResourceStatistics_MemAnonBytes + + ffj_t_ResourceStatistics_MemCacheBytes + + ffj_t_ResourceStatistics_MemRSSBytes + + ffj_t_ResourceStatistics_MemMappedFileBytes + + ffj_t_ResourceStatistics_MemSwapBytes + + ffj_t_ResourceStatistics_MemUnevictableBytes + + ffj_t_ResourceStatistics_MemLowPressureCounter + + ffj_t_ResourceStatistics_MemMediumPressureCounter + + ffj_t_ResourceStatistics_MemCriticalPressureCounter + + ffj_t_ResourceStatistics_DiskLimitBytes + + ffj_t_ResourceStatistics_DiskUsedBytes + + ffj_t_ResourceStatistics_DiskStatistics + + ffj_t_ResourceStatistics_BlkioStatistics + + ffj_t_ResourceStatistics_Perf + + ffj_t_ResourceStatistics_NetRxPackets + + ffj_t_ResourceStatistics_NetRxBytes + + ffj_t_ResourceStatistics_NetRxErrors + + ffj_t_ResourceStatistics_NetRxDropped + + ffj_t_ResourceStatistics_NetTxPackets + + ffj_t_ResourceStatistics_NetTxBytes + + ffj_t_ResourceStatistics_NetTxErrors + + ffj_t_ResourceStatistics_NetTxDropped + + ffj_t_ResourceStatistics_NetTCPRttMicrosecsP50 + + ffj_t_ResourceStatistics_NetTCPRttMicrosecsP90 + + ffj_t_ResourceStatistics_NetTCPRttMicrosecsP95 + + ffj_t_ResourceStatistics_NetTCPRttMicrosecsP99 + + ffj_t_ResourceStatistics_NetTCPActiveConnections + + ffj_t_ResourceStatistics_NetTCPTimeWaitConnections + + ffj_t_ResourceStatistics_NetTrafficControlStatistics + + ffj_t_ResourceStatistics_NetSNMPStatistics +) + +var ffj_key_ResourceStatistics_Timestamp = []byte("timestamp") + +var ffj_key_ResourceStatistics_Processes = []byte("processes") + +var ffj_key_ResourceStatistics_Threads = []byte("threads") + +var ffj_key_ResourceStatistics_CPUsUserTimeSecs = []byte("cpus_user_time_secs") + +var ffj_key_ResourceStatistics_CPUsSystemTimeSecs = []byte("cpus_system_time_secs") + +var ffj_key_ResourceStatistics_CPUsLimit = []byte("cpus_limit") + +var ffj_key_ResourceStatistics_CPUsNrPeriods = []byte("cpus_nr_periods") + +var ffj_key_ResourceStatistics_CPUsNrThrottled = []byte("cpus_nr_throttled") + +var ffj_key_ResourceStatistics_CPUsThrottledTimeSecs = []byte("cpus_throttled_time_secs") + +var ffj_key_ResourceStatistics_MemTotalBytes = []byte("mem_total_bytes") + +var ffj_key_ResourceStatistics_MemTotalMemswBytes = []byte("mem_total_memsw_bytes") + +var ffj_key_ResourceStatistics_MemLimitBytes = []byte("mem_limit_bytes") + +var ffj_key_ResourceStatistics_MemSoftLimitBytes = []byte("mem_soft_limit_bytes") + +var ffj_key_ResourceStatistics_MemFileBytes = []byte("mem_file_bytes") + +var ffj_key_ResourceStatistics_MemAnonBytes = []byte("mem_anon_bytes") + +var ffj_key_ResourceStatistics_MemCacheBytes = []byte("mem_cache_bytes") + +var ffj_key_ResourceStatistics_MemRSSBytes = []byte("mem_rss_bytes") + +var ffj_key_ResourceStatistics_MemMappedFileBytes = []byte("mem_mapped_file_bytes") + +var ffj_key_ResourceStatistics_MemSwapBytes = []byte("mem_swap_bytes") + +var ffj_key_ResourceStatistics_MemUnevictableBytes = []byte("mem_unevictable_bytes") + +var ffj_key_ResourceStatistics_MemLowPressureCounter = []byte("mem_low_pressure_counter") + +var ffj_key_ResourceStatistics_MemMediumPressureCounter = []byte("mem_medium_pressure_counter") + +var ffj_key_ResourceStatistics_MemCriticalPressureCounter = []byte("mem_critical_pressure_counter") + +var ffj_key_ResourceStatistics_DiskLimitBytes = []byte("disk_limit_bytes") + +var ffj_key_ResourceStatistics_DiskUsedBytes = []byte("disk_used_bytes") + +var ffj_key_ResourceStatistics_DiskStatistics = []byte("disk_statistics") + +var ffj_key_ResourceStatistics_BlkioStatistics = []byte("blkio_statistics") + +var ffj_key_ResourceStatistics_Perf = []byte("perf") + +var ffj_key_ResourceStatistics_NetRxPackets = []byte("net_rx_packets") + +var ffj_key_ResourceStatistics_NetRxBytes = []byte("net_rx_bytes") + +var ffj_key_ResourceStatistics_NetRxErrors = []byte("net_rx_errors") + +var ffj_key_ResourceStatistics_NetRxDropped = []byte("net_rx_dropped") + +var ffj_key_ResourceStatistics_NetTxPackets = []byte("net_tx_packets") + +var ffj_key_ResourceStatistics_NetTxBytes = []byte("net_tx_bytes") + +var ffj_key_ResourceStatistics_NetTxErrors = []byte("net_tx_errors") + +var ffj_key_ResourceStatistics_NetTxDropped = []byte("net_tx_dropped") + +var ffj_key_ResourceStatistics_NetTCPRttMicrosecsP50 = []byte("net_tcp_rtt_microsecs_p50") + +var ffj_key_ResourceStatistics_NetTCPRttMicrosecsP90 = []byte("net_tcp_rtt_microsecs_p90") + +var ffj_key_ResourceStatistics_NetTCPRttMicrosecsP95 = []byte("net_tcp_rtt_microsecs_p95") + +var ffj_key_ResourceStatistics_NetTCPRttMicrosecsP99 = []byte("net_tcp_rtt_microsecs_p99") + +var ffj_key_ResourceStatistics_NetTCPActiveConnections = []byte("net_tcp_active_connections") + +var ffj_key_ResourceStatistics_NetTCPTimeWaitConnections = []byte("net_tcp_time_wait_connections") + +var ffj_key_ResourceStatistics_NetTrafficControlStatistics = []byte("net_traffic_control_statistics") + +var ffj_key_ResourceStatistics_NetSNMPStatistics = []byte("net_snmp_statistics") + +func (uj *ResourceStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ResourceStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ResourceStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ResourceStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'b': + + if bytes.Equal(ffj_key_ResourceStatistics_BlkioStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_BlkioStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_ResourceStatistics_CPUsUserTimeSecs, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsUserTimeSecs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_CPUsSystemTimeSecs, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsSystemTimeSecs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_CPUsLimit, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsLimit + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_CPUsNrPeriods, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsNrPeriods + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_CPUsNrThrottled, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsNrThrottled + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_CPUsThrottledTimeSecs, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsThrottledTimeSecs + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_ResourceStatistics_DiskLimitBytes, kn) { + currentKey = ffj_t_ResourceStatistics_DiskLimitBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_DiskUsedBytes, kn) { + currentKey = ffj_t_ResourceStatistics_DiskUsedBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_DiskStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_DiskStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_ResourceStatistics_MemTotalBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemTotalBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemTotalMemswBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemTotalMemswBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemLimitBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemLimitBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemSoftLimitBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemSoftLimitBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemFileBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemFileBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemAnonBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemAnonBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemCacheBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemCacheBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemRSSBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemRSSBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemMappedFileBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemMappedFileBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemSwapBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemSwapBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemUnevictableBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemUnevictableBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemLowPressureCounter, kn) { + currentKey = ffj_t_ResourceStatistics_MemLowPressureCounter + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemMediumPressureCounter, kn) { + currentKey = ffj_t_ResourceStatistics_MemMediumPressureCounter + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_MemCriticalPressureCounter, kn) { + currentKey = ffj_t_ResourceStatistics_MemCriticalPressureCounter + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_ResourceStatistics_NetRxPackets, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxPackets + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetRxBytes, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetRxErrors, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetRxDropped, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxDropped + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTxPackets, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxPackets + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTxBytes, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxBytes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTxErrors, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTxDropped, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxDropped + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP50, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP50 + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP90, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP90 + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP95, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP95 + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP99, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP99 + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTCPActiveConnections, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPActiveConnections + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTCPTimeWaitConnections, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPTimeWaitConnections + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetTrafficControlStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_NetTrafficControlStatistics + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_NetSNMPStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_NetSNMPStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_ResourceStatistics_Processes, kn) { + currentKey = ffj_t_ResourceStatistics_Processes + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_Perf, kn) { + currentKey = ffj_t_ResourceStatistics_Perf + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ResourceStatistics_Timestamp, kn) { + currentKey = ffj_t_ResourceStatistics_Timestamp + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_ResourceStatistics_Threads, kn) { + currentKey = ffj_t_ResourceStatistics_Threads + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetSNMPStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_NetSNMPStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTrafficControlStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_NetTrafficControlStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTCPTimeWaitConnections, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPTimeWaitConnections + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTCPActiveConnections, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPActiveConnections + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP99, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP99 + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP95, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP95 + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP90, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP90 + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTCPRttMicrosecsP50, kn) { + currentKey = ffj_t_ResourceStatistics_NetTCPRttMicrosecsP50 + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ResourceStatistics_NetTxDropped, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxDropped + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTxErrors, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTxBytes, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetTxPackets, kn) { + currentKey = ffj_t_ResourceStatistics_NetTxPackets + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ResourceStatistics_NetRxDropped, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxDropped + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetRxErrors, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetRxBytes, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_NetRxPackets, kn) { + currentKey = ffj_t_ResourceStatistics_NetRxPackets + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceStatistics_Perf, kn) { + currentKey = ffj_t_ResourceStatistics_Perf + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_BlkioStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_BlkioStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_DiskStatistics, kn) { + currentKey = ffj_t_ResourceStatistics_DiskStatistics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_DiskUsedBytes, kn) { + currentKey = ffj_t_ResourceStatistics_DiskUsedBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_DiskLimitBytes, kn) { + currentKey = ffj_t_ResourceStatistics_DiskLimitBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemCriticalPressureCounter, kn) { + currentKey = ffj_t_ResourceStatistics_MemCriticalPressureCounter + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemMediumPressureCounter, kn) { + currentKey = ffj_t_ResourceStatistics_MemMediumPressureCounter + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemLowPressureCounter, kn) { + currentKey = ffj_t_ResourceStatistics_MemLowPressureCounter + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemUnevictableBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemUnevictableBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemSwapBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemSwapBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemMappedFileBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemMappedFileBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemRSSBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemRSSBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemCacheBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemCacheBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemAnonBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemAnonBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemFileBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemFileBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemSoftLimitBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemSoftLimitBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemLimitBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemLimitBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemTotalMemswBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemTotalMemswBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_MemTotalBytes, kn) { + currentKey = ffj_t_ResourceStatistics_MemTotalBytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_CPUsThrottledTimeSecs, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsThrottledTimeSecs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_CPUsNrThrottled, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsNrThrottled + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_CPUsNrPeriods, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsNrPeriods + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_CPUsLimit, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsLimit + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_CPUsSystemTimeSecs, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsSystemTimeSecs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_CPUsUserTimeSecs, kn) { + currentKey = ffj_t_ResourceStatistics_CPUsUserTimeSecs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_Threads, kn) { + currentKey = ffj_t_ResourceStatistics_Threads + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_Processes, kn) { + currentKey = ffj_t_ResourceStatistics_Processes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceStatistics_Timestamp, kn) { + currentKey = ffj_t_ResourceStatistics_Timestamp + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ResourceStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ResourceStatistics_Timestamp: + goto handle_Timestamp + + case ffj_t_ResourceStatistics_Processes: + goto handle_Processes + + case ffj_t_ResourceStatistics_Threads: + goto handle_Threads + + case ffj_t_ResourceStatistics_CPUsUserTimeSecs: + goto handle_CPUsUserTimeSecs + + case ffj_t_ResourceStatistics_CPUsSystemTimeSecs: + goto handle_CPUsSystemTimeSecs + + case ffj_t_ResourceStatistics_CPUsLimit: + goto handle_CPUsLimit + + case ffj_t_ResourceStatistics_CPUsNrPeriods: + goto handle_CPUsNrPeriods + + case ffj_t_ResourceStatistics_CPUsNrThrottled: + goto handle_CPUsNrThrottled + + case ffj_t_ResourceStatistics_CPUsThrottledTimeSecs: + goto handle_CPUsThrottledTimeSecs + + case ffj_t_ResourceStatistics_MemTotalBytes: + goto handle_MemTotalBytes + + case ffj_t_ResourceStatistics_MemTotalMemswBytes: + goto handle_MemTotalMemswBytes + + case ffj_t_ResourceStatistics_MemLimitBytes: + goto handle_MemLimitBytes + + case ffj_t_ResourceStatistics_MemSoftLimitBytes: + goto handle_MemSoftLimitBytes + + case ffj_t_ResourceStatistics_MemFileBytes: + goto handle_MemFileBytes + + case ffj_t_ResourceStatistics_MemAnonBytes: + goto handle_MemAnonBytes + + case ffj_t_ResourceStatistics_MemCacheBytes: + goto handle_MemCacheBytes + + case ffj_t_ResourceStatistics_MemRSSBytes: + goto handle_MemRSSBytes + + case ffj_t_ResourceStatistics_MemMappedFileBytes: + goto handle_MemMappedFileBytes + + case ffj_t_ResourceStatistics_MemSwapBytes: + goto handle_MemSwapBytes + + case ffj_t_ResourceStatistics_MemUnevictableBytes: + goto handle_MemUnevictableBytes + + case ffj_t_ResourceStatistics_MemLowPressureCounter: + goto handle_MemLowPressureCounter + + case ffj_t_ResourceStatistics_MemMediumPressureCounter: + goto handle_MemMediumPressureCounter + + case ffj_t_ResourceStatistics_MemCriticalPressureCounter: + goto handle_MemCriticalPressureCounter + + case ffj_t_ResourceStatistics_DiskLimitBytes: + goto handle_DiskLimitBytes + + case ffj_t_ResourceStatistics_DiskUsedBytes: + goto handle_DiskUsedBytes + + case ffj_t_ResourceStatistics_DiskStatistics: + goto handle_DiskStatistics + + case ffj_t_ResourceStatistics_BlkioStatistics: + goto handle_BlkioStatistics + + case ffj_t_ResourceStatistics_Perf: + goto handle_Perf + + case ffj_t_ResourceStatistics_NetRxPackets: + goto handle_NetRxPackets + + case ffj_t_ResourceStatistics_NetRxBytes: + goto handle_NetRxBytes + + case ffj_t_ResourceStatistics_NetRxErrors: + goto handle_NetRxErrors + + case ffj_t_ResourceStatistics_NetRxDropped: + goto handle_NetRxDropped + + case ffj_t_ResourceStatistics_NetTxPackets: + goto handle_NetTxPackets + + case ffj_t_ResourceStatistics_NetTxBytes: + goto handle_NetTxBytes + + case ffj_t_ResourceStatistics_NetTxErrors: + goto handle_NetTxErrors + + case ffj_t_ResourceStatistics_NetTxDropped: + goto handle_NetTxDropped + + case ffj_t_ResourceStatistics_NetTCPRttMicrosecsP50: + goto handle_NetTCPRttMicrosecsP50 + + case ffj_t_ResourceStatistics_NetTCPRttMicrosecsP90: + goto handle_NetTCPRttMicrosecsP90 + + case ffj_t_ResourceStatistics_NetTCPRttMicrosecsP95: + goto handle_NetTCPRttMicrosecsP95 + + case ffj_t_ResourceStatistics_NetTCPRttMicrosecsP99: + goto handle_NetTCPRttMicrosecsP99 + + case ffj_t_ResourceStatistics_NetTCPActiveConnections: + goto handle_NetTCPActiveConnections + + case ffj_t_ResourceStatistics_NetTCPTimeWaitConnections: + goto handle_NetTCPTimeWaitConnections + + case ffj_t_ResourceStatistics_NetTrafficControlStatistics: + goto handle_NetTrafficControlStatistics + + case ffj_t_ResourceStatistics_NetSNMPStatistics: + goto handle_NetSNMPStatistics + + case ffj_t_ResourceStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Timestamp: + + /* handler: uj.Timestamp type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Timestamp = float64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Processes: + + /* handler: uj.Processes type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Processes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.Processes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Threads: + + /* handler: uj.Threads type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Threads = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.Threads = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUsUserTimeSecs: + + /* handler: uj.CPUsUserTimeSecs type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUsUserTimeSecs = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.CPUsUserTimeSecs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUsSystemTimeSecs: + + /* handler: uj.CPUsSystemTimeSecs type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUsSystemTimeSecs = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.CPUsSystemTimeSecs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUsLimit: + + /* handler: uj.CPUsLimit type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUsLimit = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.CPUsLimit = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUsNrPeriods: + + /* handler: uj.CPUsNrPeriods type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUsNrPeriods = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.CPUsNrPeriods = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUsNrThrottled: + + /* handler: uj.CPUsNrThrottled type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUsNrThrottled = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint32(tval) + uj.CPUsNrThrottled = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CPUsThrottledTimeSecs: + + /* handler: uj.CPUsThrottledTimeSecs type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CPUsThrottledTimeSecs = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.CPUsThrottledTimeSecs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemTotalBytes: + + /* handler: uj.MemTotalBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemTotalBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemTotalBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemTotalMemswBytes: + + /* handler: uj.MemTotalMemswBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemTotalMemswBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemTotalMemswBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemLimitBytes: + + /* handler: uj.MemLimitBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemLimitBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemLimitBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemSoftLimitBytes: + + /* handler: uj.MemSoftLimitBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemSoftLimitBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemSoftLimitBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemFileBytes: + + /* handler: uj.MemFileBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemFileBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemFileBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemAnonBytes: + + /* handler: uj.MemAnonBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemAnonBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemAnonBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemCacheBytes: + + /* handler: uj.MemCacheBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemCacheBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemCacheBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemRSSBytes: + + /* handler: uj.MemRSSBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemRSSBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemRSSBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemMappedFileBytes: + + /* handler: uj.MemMappedFileBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemMappedFileBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemMappedFileBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemSwapBytes: + + /* handler: uj.MemSwapBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemSwapBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemSwapBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemUnevictableBytes: + + /* handler: uj.MemUnevictableBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemUnevictableBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemUnevictableBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemLowPressureCounter: + + /* handler: uj.MemLowPressureCounter type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemLowPressureCounter = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemLowPressureCounter = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemMediumPressureCounter: + + /* handler: uj.MemMediumPressureCounter type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemMediumPressureCounter = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemMediumPressureCounter = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MemCriticalPressureCounter: + + /* handler: uj.MemCriticalPressureCounter type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MemCriticalPressureCounter = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.MemCriticalPressureCounter = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DiskLimitBytes: + + /* handler: uj.DiskLimitBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DiskLimitBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DiskLimitBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DiskUsedBytes: + + /* handler: uj.DiskUsedBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.DiskUsedBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.DiskUsedBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DiskStatistics: + + /* handler: uj.DiskStatistics type=[]mesos.DiskStatistics kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.DiskStatistics = nil + } else { + + uj.DiskStatistics = []DiskStatistics{} + + wantVal := true + + for { + + var tmp_uj__DiskStatistics DiskStatistics + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__DiskStatistics type=mesos.DiskStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__DiskStatistics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.DiskStatistics = append(uj.DiskStatistics, tmp_uj__DiskStatistics) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BlkioStatistics: + + /* handler: uj.BlkioStatistics type=mesos.CgroupInfo_Blkio_Statistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.BlkioStatistics = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.BlkioStatistics == nil { + uj.BlkioStatistics = new(CgroupInfo_Blkio_Statistics) + } + + err = uj.BlkioStatistics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Perf: + + /* handler: uj.Perf type=mesos.PerfStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Perf = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Perf == nil { + uj.Perf = new(PerfStatistics) + } + + err = uj.Perf.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetRxPackets: + + /* handler: uj.NetRxPackets type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetRxPackets = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetRxPackets = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetRxBytes: + + /* handler: uj.NetRxBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetRxBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetRxBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetRxErrors: + + /* handler: uj.NetRxErrors type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetRxErrors = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetRxErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetRxDropped: + + /* handler: uj.NetRxDropped type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetRxDropped = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetRxDropped = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTxPackets: + + /* handler: uj.NetTxPackets type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTxPackets = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetTxPackets = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTxBytes: + + /* handler: uj.NetTxBytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTxBytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetTxBytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTxErrors: + + /* handler: uj.NetTxErrors type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTxErrors = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetTxErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTxDropped: + + /* handler: uj.NetTxDropped type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTxDropped = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.NetTxDropped = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTCPRttMicrosecsP50: + + /* handler: uj.NetTCPRttMicrosecsP50 type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTCPRttMicrosecsP50 = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.NetTCPRttMicrosecsP50 = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTCPRttMicrosecsP90: + + /* handler: uj.NetTCPRttMicrosecsP90 type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTCPRttMicrosecsP90 = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.NetTCPRttMicrosecsP90 = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTCPRttMicrosecsP95: + + /* handler: uj.NetTCPRttMicrosecsP95 type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTCPRttMicrosecsP95 = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.NetTCPRttMicrosecsP95 = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTCPRttMicrosecsP99: + + /* handler: uj.NetTCPRttMicrosecsP99 type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTCPRttMicrosecsP99 = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.NetTCPRttMicrosecsP99 = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTCPActiveConnections: + + /* handler: uj.NetTCPActiveConnections type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTCPActiveConnections = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.NetTCPActiveConnections = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTCPTimeWaitConnections: + + /* handler: uj.NetTCPTimeWaitConnections type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NetTCPTimeWaitConnections = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.NetTCPTimeWaitConnections = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetTrafficControlStatistics: + + /* handler: uj.NetTrafficControlStatistics type=[]mesos.TrafficControlStatistics kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.NetTrafficControlStatistics = nil + } else { + + uj.NetTrafficControlStatistics = []TrafficControlStatistics{} + + wantVal := true + + for { + + var tmp_uj__NetTrafficControlStatistics TrafficControlStatistics + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__NetTrafficControlStatistics type=mesos.TrafficControlStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__NetTrafficControlStatistics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.NetTrafficControlStatistics = append(uj.NetTrafficControlStatistics, tmp_uj__NetTrafficControlStatistics) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NetSNMPStatistics: + + /* handler: uj.NetSNMPStatistics type=mesos.SNMPStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.NetSNMPStatistics = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.NetSNMPStatistics == nil { + uj.NetSNMPStatistics = new(SNMPStatistics) + } + + err = uj.NetSNMPStatistics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ResourceUsage) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ResourceUsage) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"executors":`) + if mj.Executors != nil { + buf.WriteString(`[`) + for i, v := range mj.Executors { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"total":`) + if mj.Total != nil { + buf.WriteString(`[`) + for i, v := range mj.Total { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ResourceUsagebase = iota + ffj_t_ResourceUsageno_such_key + + ffj_t_ResourceUsage_Executors + + ffj_t_ResourceUsage_Total +) + +var ffj_key_ResourceUsage_Executors = []byte("executors") + +var ffj_key_ResourceUsage_Total = []byte("total") + +func (uj *ResourceUsage) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ResourceUsage) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ResourceUsagebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ResourceUsageno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'e': + + if bytes.Equal(ffj_key_ResourceUsage_Executors, kn) { + currentKey = ffj_t_ResourceUsage_Executors + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ResourceUsage_Total, kn) { + currentKey = ffj_t_ResourceUsage_Total + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceUsage_Total, kn) { + currentKey = ffj_t_ResourceUsage_Total + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceUsage_Executors, kn) { + currentKey = ffj_t_ResourceUsage_Executors + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ResourceUsageno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ResourceUsage_Executors: + goto handle_Executors + + case ffj_t_ResourceUsage_Total: + goto handle_Total + + case ffj_t_ResourceUsageno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Executors: + + /* handler: uj.Executors type=[]mesos.ResourceUsage_Executor kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Executors = nil + } else { + + uj.Executors = []ResourceUsage_Executor{} + + wantVal := true + + for { + + var tmp_uj__Executors ResourceUsage_Executor + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Executors type=mesos.ResourceUsage_Executor kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Executors.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Executors = append(uj.Executors, tmp_uj__Executors) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Total: + + /* handler: uj.Total type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Total = nil + } else { + + uj.Total = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Total Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Total type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Total.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Total = append(uj.Total, tmp_uj__Total) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ResourceUsage_Executor) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ResourceUsage_Executor) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"executor_info":`) + + { + + err = mj.ExecutorInfo.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"allocated":`) + if mj.Allocated != nil { + buf.WriteString(`[`) + for i, v := range mj.Allocated { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Statistics != nil { + if true { + buf.WriteString(`"statistics":`) + + { + + err = mj.Statistics.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"container_id":`) + + { + + err = mj.ContainerID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"tasks":`) + if mj.Tasks != nil { + buf.WriteString(`[`) + for i, v := range mj.Tasks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ResourceUsage_Executorbase = iota + ffj_t_ResourceUsage_Executorno_such_key + + ffj_t_ResourceUsage_Executor_ExecutorInfo + + ffj_t_ResourceUsage_Executor_Allocated + + ffj_t_ResourceUsage_Executor_Statistics + + ffj_t_ResourceUsage_Executor_ContainerID + + ffj_t_ResourceUsage_Executor_Tasks +) + +var ffj_key_ResourceUsage_Executor_ExecutorInfo = []byte("executor_info") + +var ffj_key_ResourceUsage_Executor_Allocated = []byte("allocated") + +var ffj_key_ResourceUsage_Executor_Statistics = []byte("statistics") + +var ffj_key_ResourceUsage_Executor_ContainerID = []byte("container_id") + +var ffj_key_ResourceUsage_Executor_Tasks = []byte("tasks") + +func (uj *ResourceUsage_Executor) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ResourceUsage_Executor) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ResourceUsage_Executorbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ResourceUsage_Executorno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_Allocated, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Allocated + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_ContainerID, kn) { + currentKey = ffj_t_ResourceUsage_Executor_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_ExecutorInfo, kn) { + currentKey = ffj_t_ResourceUsage_Executor_ExecutorInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_Statistics, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Statistics + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_Tasks, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Tasks + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_ResourceUsage_Executor_Tasks, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Tasks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ResourceUsage_Executor_ContainerID, kn) { + currentKey = ffj_t_ResourceUsage_Executor_ContainerID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceUsage_Executor_Statistics, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Statistics + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceUsage_Executor_Allocated, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Allocated + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_ResourceUsage_Executor_ExecutorInfo, kn) { + currentKey = ffj_t_ResourceUsage_Executor_ExecutorInfo + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ResourceUsage_Executorno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ResourceUsage_Executor_ExecutorInfo: + goto handle_ExecutorInfo + + case ffj_t_ResourceUsage_Executor_Allocated: + goto handle_Allocated + + case ffj_t_ResourceUsage_Executor_Statistics: + goto handle_Statistics + + case ffj_t_ResourceUsage_Executor_ContainerID: + goto handle_ContainerID + + case ffj_t_ResourceUsage_Executor_Tasks: + goto handle_Tasks + + case ffj_t_ResourceUsage_Executorno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ExecutorInfo: + + /* handler: uj.ExecutorInfo type=mesos.ExecutorInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ExecutorInfo.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Allocated: + + /* handler: uj.Allocated type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Allocated = nil + } else { + + uj.Allocated = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Allocated Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Allocated type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Allocated.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Allocated = append(uj.Allocated, tmp_uj__Allocated) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Statistics: + + /* handler: uj.Statistics type=mesos.ResourceStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Statistics = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Statistics == nil { + uj.Statistics = new(ResourceStatistics) + } + + err = uj.Statistics.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerID: + + /* handler: uj.ContainerID type=mesos.ContainerID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ContainerID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Tasks: + + /* handler: uj.Tasks type=[]mesos.ResourceUsage_Executor_Task kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Tasks = nil + } else { + + uj.Tasks = []ResourceUsage_Executor_Task{} + + wantVal := true + + for { + + var tmp_uj__Tasks ResourceUsage_Executor_Task + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Tasks type=mesos.ResourceUsage_Executor_Task kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Tasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Tasks = append(uj.Tasks, tmp_uj__Tasks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *ResourceUsage_Executor_Task) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *ResourceUsage_Executor_Task) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteString(`,"id":`) + + { + + err = mj.ID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_ResourceUsage_Executor_Taskbase = iota + ffj_t_ResourceUsage_Executor_Taskno_such_key + + ffj_t_ResourceUsage_Executor_Task_Name + + ffj_t_ResourceUsage_Executor_Task_ID + + ffj_t_ResourceUsage_Executor_Task_Resources + + ffj_t_ResourceUsage_Executor_Task_Labels +) + +var ffj_key_ResourceUsage_Executor_Task_Name = []byte("name") + +var ffj_key_ResourceUsage_Executor_Task_ID = []byte("id") + +var ffj_key_ResourceUsage_Executor_Task_Resources = []byte("resources") + +var ffj_key_ResourceUsage_Executor_Task_Labels = []byte("labels") + +func (uj *ResourceUsage_Executor_Task) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *ResourceUsage_Executor_Task) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_ResourceUsage_Executor_Taskbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_ResourceUsage_Executor_Taskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_Task_ID, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_Task_Labels, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_Task_Name, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_ResourceUsage_Executor_Task_Resources, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_ResourceUsage_Executor_Task_Labels, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_ResourceUsage_Executor_Task_Resources, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceUsage_Executor_Task_ID, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_ResourceUsage_Executor_Task_Name, kn) { + currentKey = ffj_t_ResourceUsage_Executor_Task_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_ResourceUsage_Executor_Taskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_ResourceUsage_Executor_Task_Name: + goto handle_Name + + case ffj_t_ResourceUsage_Executor_Task_ID: + goto handle_ID + + case ffj_t_ResourceUsage_Executor_Task_Resources: + goto handle_Resources + + case ffj_t_ResourceUsage_Executor_Task_Labels: + goto handle_Labels + + case ffj_t_ResourceUsage_Executor_Taskno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=mesos.TaskID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.ID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_AllocationInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_AllocationInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Role != nil { + if true { + buf.WriteString(`"role":`) + fflib.WriteJsonString(buf, string(*mj.Role)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resource_AllocationInfobase = iota + ffj_t_Resource_AllocationInfono_such_key + + ffj_t_Resource_AllocationInfo_Role +) + +var ffj_key_Resource_AllocationInfo_Role = []byte("role") + +func (uj *Resource_AllocationInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_AllocationInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_AllocationInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_AllocationInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Resource_AllocationInfo_Role, kn) { + currentKey = ffj_t_Resource_AllocationInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_AllocationInfo_Role, kn) { + currentKey = ffj_t_Resource_AllocationInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resource_AllocationInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_AllocationInfo_Role: + goto handle_Role + + case ffj_t_Resource_AllocationInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Role: + + /* handler: uj.Role type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Role = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Role = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_DiskInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_DiskInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Persistence != nil { + if true { + buf.WriteString(`"persistence":`) + + { + + err = mj.Persistence.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Volume != nil { + if true { + buf.WriteString(`"volume":`) + + { + + err = mj.Volume.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Source != nil { + if true { + buf.WriteString(`"source":`) + + { + + err = mj.Source.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resource_DiskInfobase = iota + ffj_t_Resource_DiskInfono_such_key + + ffj_t_Resource_DiskInfo_Persistence + + ffj_t_Resource_DiskInfo_Volume + + ffj_t_Resource_DiskInfo_Source +) + +var ffj_key_Resource_DiskInfo_Persistence = []byte("persistence") + +var ffj_key_Resource_DiskInfo_Volume = []byte("volume") + +var ffj_key_Resource_DiskInfo_Source = []byte("source") + +func (uj *Resource_DiskInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_DiskInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_DiskInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_DiskInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Persistence, kn) { + currentKey = ffj_t_Resource_DiskInfo_Persistence + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Source, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Volume, kn) { + currentKey = ffj_t_Resource_DiskInfo_Volume + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Resource_DiskInfo_Source, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Volume, kn) { + currentKey = ffj_t_Resource_DiskInfo_Volume + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Resource_DiskInfo_Persistence, kn) { + currentKey = ffj_t_Resource_DiskInfo_Persistence + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resource_DiskInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_DiskInfo_Persistence: + goto handle_Persistence + + case ffj_t_Resource_DiskInfo_Volume: + goto handle_Volume + + case ffj_t_Resource_DiskInfo_Source: + goto handle_Source + + case ffj_t_Resource_DiskInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Persistence: + + /* handler: uj.Persistence type=mesos.Resource_DiskInfo_Persistence kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Persistence = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Persistence == nil { + uj.Persistence = new(Resource_DiskInfo_Persistence) + } + + err = uj.Persistence.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Volume: + + /* handler: uj.Volume type=mesos.Volume kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Volume = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Volume == nil { + uj.Volume = new(Volume) + } + + err = uj.Volume.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Source: + + /* handler: uj.Source type=mesos.Resource_DiskInfo_Source kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Source = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Source == nil { + uj.Source = new(Resource_DiskInfo_Source) + } + + err = uj.Source.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_DiskInfo_Persistence) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_DiskInfo_Persistence) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "id":`) + fflib.WriteJsonString(buf, string(mj.ID)) + buf.WriteByte(',') + if mj.Principal != nil { + if true { + buf.WriteString(`"principal":`) + fflib.WriteJsonString(buf, string(*mj.Principal)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resource_DiskInfo_Persistencebase = iota + ffj_t_Resource_DiskInfo_Persistenceno_such_key + + ffj_t_Resource_DiskInfo_Persistence_ID + + ffj_t_Resource_DiskInfo_Persistence_Principal +) + +var ffj_key_Resource_DiskInfo_Persistence_ID = []byte("id") + +var ffj_key_Resource_DiskInfo_Persistence_Principal = []byte("principal") + +func (uj *Resource_DiskInfo_Persistence) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_DiskInfo_Persistence) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_DiskInfo_Persistencebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_DiskInfo_Persistenceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Persistence_ID, kn) { + currentKey = ffj_t_Resource_DiskInfo_Persistence_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Persistence_Principal, kn) { + currentKey = ffj_t_Resource_DiskInfo_Persistence_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Persistence_Principal, kn) { + currentKey = ffj_t_Resource_DiskInfo_Persistence_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Persistence_ID, kn) { + currentKey = ffj_t_Resource_DiskInfo_Persistence_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resource_DiskInfo_Persistenceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_DiskInfo_Persistence_ID: + goto handle_ID + + case ffj_t_Resource_DiskInfo_Persistence_Principal: + goto handle_Principal + + case ffj_t_Resource_DiskInfo_Persistenceno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ID: + + /* handler: uj.ID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ID = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Principal: + + /* handler: uj.Principal type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Principal = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Principal = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_DiskInfo_Source) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_DiskInfo_Source) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Path != nil { + if true { + buf.WriteString(`"path":`) + + { + + err = mj.Path.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Mount != nil { + if true { + buf.WriteString(`"mount":`) + + { + + err = mj.Mount.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ID != nil { + if true { + buf.WriteString(`"id":`) + fflib.WriteJsonString(buf, string(*mj.ID)) + buf.WriteByte(',') + } + } + if mj.Metadata != nil { + if true { + buf.WriteString(`"metadata":`) + + { + + err = mj.Metadata.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Profile != nil { + if true { + buf.WriteString(`"profile":`) + fflib.WriteJsonString(buf, string(*mj.Profile)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resource_DiskInfo_Sourcebase = iota + ffj_t_Resource_DiskInfo_Sourceno_such_key + + ffj_t_Resource_DiskInfo_Source_Type + + ffj_t_Resource_DiskInfo_Source_Path + + ffj_t_Resource_DiskInfo_Source_Mount + + ffj_t_Resource_DiskInfo_Source_ID + + ffj_t_Resource_DiskInfo_Source_Metadata + + ffj_t_Resource_DiskInfo_Source_Profile +) + +var ffj_key_Resource_DiskInfo_Source_Type = []byte("type") + +var ffj_key_Resource_DiskInfo_Source_Path = []byte("path") + +var ffj_key_Resource_DiskInfo_Source_Mount = []byte("mount") + +var ffj_key_Resource_DiskInfo_Source_ID = []byte("id") + +var ffj_key_Resource_DiskInfo_Source_Metadata = []byte("metadata") + +var ffj_key_Resource_DiskInfo_Source_Profile = []byte("profile") + +func (uj *Resource_DiskInfo_Source) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_DiskInfo_Source) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_DiskInfo_Sourcebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_DiskInfo_Sourceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Source_ID, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Source_Mount, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Mount + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_DiskInfo_Source_Metadata, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Metadata + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Source_Path, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Path + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Resource_DiskInfo_Source_Profile, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Profile + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Source_Type, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_Profile, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Profile + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_Metadata, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Metadata + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_ID, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_Mount, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Mount + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_Path, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_Type, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resource_DiskInfo_Sourceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_DiskInfo_Source_Type: + goto handle_Type + + case ffj_t_Resource_DiskInfo_Source_Path: + goto handle_Path + + case ffj_t_Resource_DiskInfo_Source_Mount: + goto handle_Mount + + case ffj_t_Resource_DiskInfo_Source_ID: + goto handle_ID + + case ffj_t_Resource_DiskInfo_Source_Metadata: + goto handle_Metadata + + case ffj_t_Resource_DiskInfo_Source_Profile: + goto handle_Profile + + case ffj_t_Resource_DiskInfo_Sourceno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Resource_DiskInfo_Source_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Path: + + /* handler: uj.Path type=mesos.Resource_DiskInfo_Source_Path kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Path = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Path == nil { + uj.Path = new(Resource_DiskInfo_Source_Path) + } + + err = uj.Path.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Mount: + + /* handler: uj.Mount type=mesos.Resource_DiskInfo_Source_Mount kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Mount = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Mount == nil { + uj.Mount = new(Resource_DiskInfo_Source_Mount) + } + + err = uj.Mount.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ID: + + /* handler: uj.ID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.ID = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.ID = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Metadata: + + /* handler: uj.Metadata type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Metadata = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Metadata == nil { + uj.Metadata = new(Labels) + } + + err = uj.Metadata.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Profile: + + /* handler: uj.Profile type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Profile = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Profile = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_DiskInfo_Source_Mount) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_DiskInfo_Source_Mount) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Root != nil { + if true { + buf.WriteString(`"root":`) + fflib.WriteJsonString(buf, string(*mj.Root)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resource_DiskInfo_Source_Mountbase = iota + ffj_t_Resource_DiskInfo_Source_Mountno_such_key + + ffj_t_Resource_DiskInfo_Source_Mount_Root +) + +var ffj_key_Resource_DiskInfo_Source_Mount_Root = []byte("root") + +func (uj *Resource_DiskInfo_Source_Mount) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_DiskInfo_Source_Mount) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_DiskInfo_Source_Mountbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_DiskInfo_Source_Mountno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Source_Mount_Root, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Mount_Root + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_Mount_Root, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Mount_Root + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resource_DiskInfo_Source_Mountno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_DiskInfo_Source_Mount_Root: + goto handle_Root + + case ffj_t_Resource_DiskInfo_Source_Mountno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Root: + + /* handler: uj.Root type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Root = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Root = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_DiskInfo_Source_Path) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_DiskInfo_Source_Path) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Root != nil { + if true { + buf.WriteString(`"root":`) + fflib.WriteJsonString(buf, string(*mj.Root)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resource_DiskInfo_Source_Pathbase = iota + ffj_t_Resource_DiskInfo_Source_Pathno_such_key + + ffj_t_Resource_DiskInfo_Source_Path_Root +) + +var ffj_key_Resource_DiskInfo_Source_Path_Root = []byte("root") + +func (uj *Resource_DiskInfo_Source_Path) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_DiskInfo_Source_Path) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_DiskInfo_Source_Pathbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_DiskInfo_Source_Pathno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Resource_DiskInfo_Source_Path_Root, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Path_Root + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_DiskInfo_Source_Path_Root, kn) { + currentKey = ffj_t_Resource_DiskInfo_Source_Path_Root + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resource_DiskInfo_Source_Pathno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_DiskInfo_Source_Path_Root: + goto handle_Root + + case ffj_t_Resource_DiskInfo_Source_Pathno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Root: + + /* handler: uj.Root type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Root = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Root = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_ReservationInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_ReservationInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Type != nil { + if true { + buf.WriteString(`"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Role != nil { + if true { + buf.WriteString(`"role":`) + fflib.WriteJsonString(buf, string(*mj.Role)) + buf.WriteByte(',') + } + } + if mj.Principal != nil { + if true { + buf.WriteString(`"principal":`) + fflib.WriteJsonString(buf, string(*mj.Principal)) + buf.WriteByte(',') + } + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Resource_ReservationInfobase = iota + ffj_t_Resource_ReservationInfono_such_key + + ffj_t_Resource_ReservationInfo_Type + + ffj_t_Resource_ReservationInfo_Role + + ffj_t_Resource_ReservationInfo_Principal + + ffj_t_Resource_ReservationInfo_Labels +) + +var ffj_key_Resource_ReservationInfo_Type = []byte("type") + +var ffj_key_Resource_ReservationInfo_Role = []byte("role") + +var ffj_key_Resource_ReservationInfo_Principal = []byte("principal") + +var ffj_key_Resource_ReservationInfo_Labels = []byte("labels") + +func (uj *Resource_ReservationInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_ReservationInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_ReservationInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_ReservationInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'l': + + if bytes.Equal(ffj_key_Resource_ReservationInfo_Labels, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Resource_ReservationInfo_Principal, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Resource_ReservationInfo_Role, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Resource_ReservationInfo_Type, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Resource_ReservationInfo_Labels, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_ReservationInfo_Principal, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Principal + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_ReservationInfo_Role, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Resource_ReservationInfo_Type, kn) { + currentKey = ffj_t_Resource_ReservationInfo_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Resource_ReservationInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_ReservationInfo_Type: + goto handle_Type + + case ffj_t_Resource_ReservationInfo_Role: + goto handle_Role + + case ffj_t_Resource_ReservationInfo_Principal: + goto handle_Principal + + case ffj_t_Resource_ReservationInfo_Labels: + goto handle_Labels + + case ffj_t_Resource_ReservationInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Resource_ReservationInfo_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Type = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Type == nil { + uj.Type = new(Resource_ReservationInfo_Type) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Role: + + /* handler: uj.Role type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Role = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Role = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Principal: + + /* handler: uj.Principal type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Principal = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Principal = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_RevocableInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_RevocableInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{}`) + return nil +} + +const ( + ffj_t_Resource_RevocableInfobase = iota + ffj_t_Resource_RevocableInfono_such_key +) + +func (uj *Resource_RevocableInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_RevocableInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_RevocableInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_RevocableInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + } + + currentKey = ffj_t_Resource_RevocableInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_RevocableInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Resource_SharedInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Resource_SharedInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{}`) + return nil +} + +const ( + ffj_t_Resource_SharedInfobase = iota + ffj_t_Resource_SharedInfono_such_key +) + +func (uj *Resource_SharedInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Resource_SharedInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Resource_SharedInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Resource_SharedInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + } + + currentKey = ffj_t_Resource_SharedInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Resource_SharedInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Role) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Role) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteString(`,"weight":`) + fflib.AppendFloat(buf, float64(mj.Weight), 'g', -1, 64) + buf.WriteString(`,"frameworks":`) + if mj.Frameworks != nil { + buf.WriteString(`[`) + for i, v := range mj.Frameworks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Rolebase = iota + ffj_t_Roleno_such_key + + ffj_t_Role_Name + + ffj_t_Role_Weight + + ffj_t_Role_Frameworks + + ffj_t_Role_Resources +) + +var ffj_key_Role_Name = []byte("name") + +var ffj_key_Role_Weight = []byte("weight") + +var ffj_key_Role_Frameworks = []byte("frameworks") + +var ffj_key_Role_Resources = []byte("resources") + +func (uj *Role) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Role) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Rolebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Roleno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'f': + + if bytes.Equal(ffj_key_Role_Frameworks, kn) { + currentKey = ffj_t_Role_Frameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Role_Name, kn) { + currentKey = ffj_t_Role_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Role_Resources, kn) { + currentKey = ffj_t_Role_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffj_key_Role_Weight, kn) { + currentKey = ffj_t_Role_Weight + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Role_Resources, kn) { + currentKey = ffj_t_Role_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Role_Frameworks, kn) { + currentKey = ffj_t_Role_Frameworks + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Role_Weight, kn) { + currentKey = ffj_t_Role_Weight + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Role_Name, kn) { + currentKey = ffj_t_Role_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Roleno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Role_Name: + goto handle_Name + + case ffj_t_Role_Weight: + goto handle_Weight + + case ffj_t_Role_Frameworks: + goto handle_Frameworks + + case ffj_t_Role_Resources: + goto handle_Resources + + case ffj_t_Roleno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Weight: + + /* handler: uj.Weight type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Weight = float64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Frameworks: + + /* handler: uj.Frameworks type=[]mesos.FrameworkID kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Frameworks = nil + } else { + + uj.Frameworks = []FrameworkID{} + + wantVal := true + + for { + + var tmp_uj__Frameworks FrameworkID + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Frameworks type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Frameworks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Frameworks = append(uj.Frameworks, tmp_uj__Frameworks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *SNMPStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *SNMPStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.IPStats != nil { + if true { + buf.WriteString(`"ip_stats":`) + + { + + err = mj.IPStats.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ICMPStats != nil { + if true { + buf.WriteString(`"icmp_stats":`) + + { + + err = mj.ICMPStats.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.TCPStats != nil { + if true { + buf.WriteString(`"tcp_stats":`) + + { + + err = mj.TCPStats.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.UDPStats != nil { + if true { + buf.WriteString(`"udp_stats":`) + + { + + err = mj.UDPStats.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_SNMPStatisticsbase = iota + ffj_t_SNMPStatisticsno_such_key + + ffj_t_SNMPStatistics_IPStats + + ffj_t_SNMPStatistics_ICMPStats + + ffj_t_SNMPStatistics_TCPStats + + ffj_t_SNMPStatistics_UDPStats +) + +var ffj_key_SNMPStatistics_IPStats = []byte("ip_stats") + +var ffj_key_SNMPStatistics_ICMPStats = []byte("icmp_stats") + +var ffj_key_SNMPStatistics_TCPStats = []byte("tcp_stats") + +var ffj_key_SNMPStatistics_UDPStats = []byte("udp_stats") + +func (uj *SNMPStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *SNMPStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_SNMPStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_SNMPStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_SNMPStatistics_IPStats, kn) { + currentKey = ffj_t_SNMPStatistics_IPStats + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_SNMPStatistics_ICMPStats, kn) { + currentKey = ffj_t_SNMPStatistics_ICMPStats + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_SNMPStatistics_TCPStats, kn) { + currentKey = ffj_t_SNMPStatistics_TCPStats + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_SNMPStatistics_UDPStats, kn) { + currentKey = ffj_t_SNMPStatistics_UDPStats + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_SNMPStatistics_UDPStats, kn) { + currentKey = ffj_t_SNMPStatistics_UDPStats + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_SNMPStatistics_TCPStats, kn) { + currentKey = ffj_t_SNMPStatistics_TCPStats + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_SNMPStatistics_ICMPStats, kn) { + currentKey = ffj_t_SNMPStatistics_ICMPStats + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_SNMPStatistics_IPStats, kn) { + currentKey = ffj_t_SNMPStatistics_IPStats + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_SNMPStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_SNMPStatistics_IPStats: + goto handle_IPStats + + case ffj_t_SNMPStatistics_ICMPStats: + goto handle_ICMPStats + + case ffj_t_SNMPStatistics_TCPStats: + goto handle_TCPStats + + case ffj_t_SNMPStatistics_UDPStats: + goto handle_UDPStats + + case ffj_t_SNMPStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_IPStats: + + /* handler: uj.IPStats type=mesos.IpStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.IPStats = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.IPStats == nil { + uj.IPStats = new(IpStatistics) + } + + err = uj.IPStats.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ICMPStats: + + /* handler: uj.ICMPStats type=mesos.IcmpStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ICMPStats = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ICMPStats == nil { + uj.ICMPStats = new(IcmpStatistics) + } + + err = uj.ICMPStats.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TCPStats: + + /* handler: uj.TCPStats type=mesos.TcpStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.TCPStats = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.TCPStats == nil { + uj.TCPStats = new(TcpStatistics) + } + + err = uj.TCPStats.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UDPStats: + + /* handler: uj.UDPStats type=mesos.UdpStatistics kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.UDPStats = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.UDPStats == nil { + uj.UDPStats = new(UdpStatistics) + } + + err = uj.UDPStats.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Secret) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Secret) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Reference != nil { + if true { + buf.WriteString(`"reference":`) + + { + + err = mj.Reference.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Value != nil { + if true { + buf.WriteString(`"value":`) + + { + + err = mj.Value.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Secretbase = iota + ffj_t_Secretno_such_key + + ffj_t_Secret_Type + + ffj_t_Secret_Reference + + ffj_t_Secret_Value +) + +var ffj_key_Secret_Type = []byte("type") + +var ffj_key_Secret_Reference = []byte("reference") + +var ffj_key_Secret_Value = []byte("value") + +func (uj *Secret) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Secret) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Secretbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Secretno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Secret_Reference, kn) { + currentKey = ffj_t_Secret_Reference + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Secret_Type, kn) { + currentKey = ffj_t_Secret_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_Secret_Value, kn) { + currentKey = ffj_t_Secret_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Secret_Value, kn) { + currentKey = ffj_t_Secret_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Secret_Reference, kn) { + currentKey = ffj_t_Secret_Reference + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Secret_Type, kn) { + currentKey = ffj_t_Secret_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Secretno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Secret_Type: + goto handle_Type + + case ffj_t_Secret_Reference: + goto handle_Reference + + case ffj_t_Secret_Value: + goto handle_Value + + case ffj_t_Secretno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Secret_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Reference: + + /* handler: uj.Reference type=mesos.Secret_Reference kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Reference = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Reference == nil { + uj.Reference = new(Secret_Reference) + } + + err = uj.Reference.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Value: + + /* handler: uj.Value type=mesos.Secret_Value kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Value = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Value == nil { + uj.Value = new(Secret_Value) + } + + err = uj.Value.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Secret_Reference) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Secret_Reference) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.Key != nil { + if true { + buf.WriteString(`"key":`) + fflib.WriteJsonString(buf, string(*mj.Key)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Secret_Referencebase = iota + ffj_t_Secret_Referenceno_such_key + + ffj_t_Secret_Reference_Name + + ffj_t_Secret_Reference_Key +) + +var ffj_key_Secret_Reference_Name = []byte("name") + +var ffj_key_Secret_Reference_Key = []byte("key") + +func (uj *Secret_Reference) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Secret_Reference) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Secret_Referencebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Secret_Referenceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'k': + + if bytes.Equal(ffj_key_Secret_Reference_Key, kn) { + currentKey = ffj_t_Secret_Reference_Key + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Secret_Reference_Name, kn) { + currentKey = ffj_t_Secret_Reference_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Secret_Reference_Key, kn) { + currentKey = ffj_t_Secret_Reference_Key + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Secret_Reference_Name, kn) { + currentKey = ffj_t_Secret_Reference_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Secret_Referenceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Secret_Reference_Name: + goto handle_Name + + case ffj_t_Secret_Reference_Key: + goto handle_Key + + case ffj_t_Secret_Referenceno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Key: + + /* handler: uj.Key type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Key = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Key = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Secret_Value) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Secret_Value) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if len(mj.Data) != 0 { + buf.WriteString(`"data":`) + if mj.Data != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.Data)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Secret_Valuebase = iota + ffj_t_Secret_Valueno_such_key + + ffj_t_Secret_Value_Data +) + +var ffj_key_Secret_Value_Data = []byte("data") + +func (uj *Secret_Value) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Secret_Value) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Secret_Valuebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Secret_Valueno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_Secret_Value_Data, kn) { + currentKey = ffj_t_Secret_Value_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Secret_Value_Data, kn) { + currentKey = ffj_t_Secret_Value_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Secret_Valueno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Secret_Value_Data: + goto handle_Data + + case ffj_t_Secret_Valueno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Data: + + /* handler: uj.Data type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Data = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.Data).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TTYInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TTYInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.WindowSize != nil { + if true { + buf.WriteString(`"window_size":`) + + { + + err = mj.WindowSize.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TTYInfobase = iota + ffj_t_TTYInfono_such_key + + ffj_t_TTYInfo_WindowSize +) + +var ffj_key_TTYInfo_WindowSize = []byte("window_size") + +func (uj *TTYInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TTYInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TTYInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TTYInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'w': + + if bytes.Equal(ffj_key_TTYInfo_WindowSize, kn) { + currentKey = ffj_t_TTYInfo_WindowSize + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_TTYInfo_WindowSize, kn) { + currentKey = ffj_t_TTYInfo_WindowSize + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TTYInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TTYInfo_WindowSize: + goto handle_WindowSize + + case ffj_t_TTYInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_WindowSize: + + /* handler: uj.WindowSize type=mesos.TTYInfo_WindowSize kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.WindowSize = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.WindowSize == nil { + uj.WindowSize = new(TTYInfo_WindowSize) + } + + err = uj.WindowSize.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TTYInfo_WindowSize) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TTYInfo_WindowSize) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"rows":`) + fflib.FormatBits2(buf, uint64(mj.Rows), 10, false) + buf.WriteString(`,"columns":`) + fflib.FormatBits2(buf, uint64(mj.Columns), 10, false) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TTYInfo_WindowSizebase = iota + ffj_t_TTYInfo_WindowSizeno_such_key + + ffj_t_TTYInfo_WindowSize_Rows + + ffj_t_TTYInfo_WindowSize_Columns +) + +var ffj_key_TTYInfo_WindowSize_Rows = []byte("rows") + +var ffj_key_TTYInfo_WindowSize_Columns = []byte("columns") + +func (uj *TTYInfo_WindowSize) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TTYInfo_WindowSize) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TTYInfo_WindowSizebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TTYInfo_WindowSizeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_TTYInfo_WindowSize_Columns, kn) { + currentKey = ffj_t_TTYInfo_WindowSize_Columns + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_TTYInfo_WindowSize_Rows, kn) { + currentKey = ffj_t_TTYInfo_WindowSize_Rows + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_TTYInfo_WindowSize_Columns, kn) { + currentKey = ffj_t_TTYInfo_WindowSize_Columns + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TTYInfo_WindowSize_Rows, kn) { + currentKey = ffj_t_TTYInfo_WindowSize_Rows + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TTYInfo_WindowSizeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TTYInfo_WindowSize_Rows: + goto handle_Rows + + case ffj_t_TTYInfo_WindowSize_Columns: + goto handle_Columns + + case ffj_t_TTYInfo_WindowSizeno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Rows: + + /* handler: uj.Rows type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Rows = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Columns: + + /* handler: uj.Columns type=uint32 kind=uint32 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint32", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 32) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Columns = uint32(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Task) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Task) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteString(`,"task_id":`) + + { + + err = mj.TaskID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"framework_id":`) + + { + + err = mj.FrameworkID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.ExecutorID != nil { + if true { + buf.WriteString(`"executor_id":`) + + { + + err = mj.ExecutorID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"agent_id":`) + + { + + err = mj.AgentID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.State != nil { + if true { + buf.WriteString(`"state":`) + + { + + obj, err = mj.State.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteString(`,"statuses":`) + if mj.Statuses != nil { + buf.WriteString(`[`) + for i, v := range mj.Statuses { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.StatusUpdateState != nil { + if true { + buf.WriteString(`"status_update_state":`) + + { + + obj, err = mj.StatusUpdateState.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if len(mj.StatusUpdateUUID) != 0 { + buf.WriteString(`"status_update_uuid":`) + if mj.StatusUpdateUUID != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.StatusUpdateUUID)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Discovery != nil { + if true { + buf.WriteString(`"discovery":`) + + { + + err = mj.Discovery.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Container != nil { + if true { + buf.WriteString(`"container":`) + + { + + err = mj.Container.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.User != nil { + if true { + buf.WriteString(`"user":`) + fflib.WriteJsonString(buf, string(*mj.User)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Taskbase = iota + ffj_t_Taskno_such_key + + ffj_t_Task_Name + + ffj_t_Task_TaskID + + ffj_t_Task_FrameworkID + + ffj_t_Task_ExecutorID + + ffj_t_Task_AgentID + + ffj_t_Task_State + + ffj_t_Task_Resources + + ffj_t_Task_Statuses + + ffj_t_Task_StatusUpdateState + + ffj_t_Task_StatusUpdateUUID + + ffj_t_Task_Labels + + ffj_t_Task_Discovery + + ffj_t_Task_Container + + ffj_t_Task_User +) + +var ffj_key_Task_Name = []byte("name") + +var ffj_key_Task_TaskID = []byte("task_id") + +var ffj_key_Task_FrameworkID = []byte("framework_id") + +var ffj_key_Task_ExecutorID = []byte("executor_id") + +var ffj_key_Task_AgentID = []byte("agent_id") + +var ffj_key_Task_State = []byte("state") + +var ffj_key_Task_Resources = []byte("resources") + +var ffj_key_Task_Statuses = []byte("statuses") + +var ffj_key_Task_StatusUpdateState = []byte("status_update_state") + +var ffj_key_Task_StatusUpdateUUID = []byte("status_update_uuid") + +var ffj_key_Task_Labels = []byte("labels") + +var ffj_key_Task_Discovery = []byte("discovery") + +var ffj_key_Task_Container = []byte("container") + +var ffj_key_Task_User = []byte("user") + +func (uj *Task) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Task) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Taskbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Taskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_Task_AgentID, kn) { + currentKey = ffj_t_Task_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_Task_Container, kn) { + currentKey = ffj_t_Task_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_Task_Discovery, kn) { + currentKey = ffj_t_Task_Discovery + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_Task_ExecutorID, kn) { + currentKey = ffj_t_Task_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_Task_FrameworkID, kn) { + currentKey = ffj_t_Task_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_Task_Labels, kn) { + currentKey = ffj_t_Task_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Task_Name, kn) { + currentKey = ffj_t_Task_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_Task_Resources, kn) { + currentKey = ffj_t_Task_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Task_State, kn) { + currentKey = ffj_t_Task_State + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Task_Statuses, kn) { + currentKey = ffj_t_Task_Statuses + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Task_StatusUpdateState, kn) { + currentKey = ffj_t_Task_StatusUpdateState + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Task_StatusUpdateUUID, kn) { + currentKey = ffj_t_Task_StatusUpdateUUID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Task_TaskID, kn) { + currentKey = ffj_t_Task_TaskID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_Task_User, kn) { + currentKey = ffj_t_Task_User + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Task_User, kn) { + currentKey = ffj_t_Task_User + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Task_Container, kn) { + currentKey = ffj_t_Task_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_Discovery, kn) { + currentKey = ffj_t_Task_Discovery + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_Labels, kn) { + currentKey = ffj_t_Task_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_StatusUpdateUUID, kn) { + currentKey = ffj_t_Task_StatusUpdateUUID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_StatusUpdateState, kn) { + currentKey = ffj_t_Task_StatusUpdateState + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_Statuses, kn) { + currentKey = ffj_t_Task_Statuses + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_Resources, kn) { + currentKey = ffj_t_Task_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_State, kn) { + currentKey = ffj_t_Task_State + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Task_AgentID, kn) { + currentKey = ffj_t_Task_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Task_ExecutorID, kn) { + currentKey = ffj_t_Task_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_FrameworkID, kn) { + currentKey = ffj_t_Task_FrameworkID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Task_TaskID, kn) { + currentKey = ffj_t_Task_TaskID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Task_Name, kn) { + currentKey = ffj_t_Task_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Taskno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Task_Name: + goto handle_Name + + case ffj_t_Task_TaskID: + goto handle_TaskID + + case ffj_t_Task_FrameworkID: + goto handle_FrameworkID + + case ffj_t_Task_ExecutorID: + goto handle_ExecutorID + + case ffj_t_Task_AgentID: + goto handle_AgentID + + case ffj_t_Task_State: + goto handle_State + + case ffj_t_Task_Resources: + goto handle_Resources + + case ffj_t_Task_Statuses: + goto handle_Statuses + + case ffj_t_Task_StatusUpdateState: + goto handle_StatusUpdateState + + case ffj_t_Task_StatusUpdateUUID: + goto handle_StatusUpdateUUID + + case ffj_t_Task_Labels: + goto handle_Labels + + case ffj_t_Task_Discovery: + goto handle_Discovery + + case ffj_t_Task_Container: + goto handle_Container + + case ffj_t_Task_User: + goto handle_User + + case ffj_t_Taskno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TaskID: + + /* handler: uj.TaskID type=mesos.TaskID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.TaskID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_FrameworkID: + + /* handler: uj.FrameworkID type=mesos.FrameworkID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.FrameworkID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ExecutorID: + + /* handler: uj.ExecutorID type=mesos.ExecutorID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ExecutorID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ExecutorID == nil { + uj.ExecutorID = new(ExecutorID) + } + + err = uj.ExecutorID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AgentID: + + /* handler: uj.AgentID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.AgentID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_State: + + /* handler: uj.State type=mesos.TaskState kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.State = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.State == nil { + uj.State = new(TaskState) + } + + err = uj.State.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Statuses: + + /* handler: uj.Statuses type=[]mesos.TaskStatus kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Statuses = nil + } else { + + uj.Statuses = []TaskStatus{} + + wantVal := true + + for { + + var tmp_uj__Statuses TaskStatus + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Statuses type=mesos.TaskStatus kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Statuses.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Statuses = append(uj.Statuses, tmp_uj__Statuses) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_StatusUpdateState: + + /* handler: uj.StatusUpdateState type=mesos.TaskState kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.StatusUpdateState = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.StatusUpdateState == nil { + uj.StatusUpdateState = new(TaskState) + } + + err = uj.StatusUpdateState.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_StatusUpdateUUID: + + /* handler: uj.StatusUpdateUUID type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.StatusUpdateUUID = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.StatusUpdateUUID).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Discovery: + + /* handler: uj.Discovery type=mesos.DiscoveryInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Discovery = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Discovery == nil { + uj.Discovery = new(DiscoveryInfo) + } + + err = uj.Discovery.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Container: + + /* handler: uj.Container type=mesos.ContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Container = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Container == nil { + uj.Container = new(ContainerInfo) + } + + err = uj.Container.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_User: + + /* handler: uj.User type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.User = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.User = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TaskGroupInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TaskGroupInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"tasks":`) + if mj.Tasks != nil { + buf.WriteString(`[`) + for i, v := range mj.Tasks { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TaskGroupInfobase = iota + ffj_t_TaskGroupInfono_such_key + + ffj_t_TaskGroupInfo_Tasks +) + +var ffj_key_TaskGroupInfo_Tasks = []byte("tasks") + +func (uj *TaskGroupInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TaskGroupInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TaskGroupInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TaskGroupInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 't': + + if bytes.Equal(ffj_key_TaskGroupInfo_Tasks, kn) { + currentKey = ffj_t_TaskGroupInfo_Tasks + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_TaskGroupInfo_Tasks, kn) { + currentKey = ffj_t_TaskGroupInfo_Tasks + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TaskGroupInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TaskGroupInfo_Tasks: + goto handle_Tasks + + case ffj_t_TaskGroupInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Tasks: + + /* handler: uj.Tasks type=[]mesos.TaskInfo kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Tasks = nil + } else { + + uj.Tasks = []TaskInfo{} + + wantVal := true + + for { + + var tmp_uj__Tasks TaskInfo + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Tasks type=mesos.TaskInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Tasks.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Tasks = append(uj.Tasks, tmp_uj__Tasks) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TaskID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TaskID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TaskIDbase = iota + ffj_t_TaskIDno_such_key + + ffj_t_TaskID_Value +) + +var ffj_key_TaskID_Value = []byte("value") + +func (uj *TaskID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TaskID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TaskIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TaskIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_TaskID_Value, kn) { + currentKey = ffj_t_TaskID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskID_Value, kn) { + currentKey = ffj_t_TaskID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TaskIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TaskID_Value: + goto handle_Value + + case ffj_t_TaskIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TaskInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TaskInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteString(`,"task_id":`) + + { + + err = mj.TaskID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"agent_id":`) + + { + + err = mj.AgentID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteString(`,"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Executor != nil { + if true { + buf.WriteString(`"executor":`) + + { + + err = mj.Executor.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Command != nil { + if true { + buf.WriteString(`"command":`) + + { + + err = mj.Command.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Container != nil { + if true { + buf.WriteString(`"container":`) + + { + + err = mj.Container.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.HealthCheck != nil { + if true { + buf.WriteString(`"health_check":`) + + { + + err = mj.HealthCheck.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Check != nil { + if true { + buf.WriteString(`"check":`) + + { + + err = mj.Check.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.KillPolicy != nil { + if true { + buf.WriteString(`"kill_policy":`) + + { + + err = mj.KillPolicy.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if len(mj.Data) != 0 { + buf.WriteString(`"data":`) + if mj.Data != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.Data)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Discovery != nil { + if true { + buf.WriteString(`"discovery":`) + + { + + err = mj.Discovery.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.MaxCompletionTime != nil { + if true { + buf.WriteString(`"max_completion_time":`) + + { + + err = mj.MaxCompletionTime.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TaskInfobase = iota + ffj_t_TaskInfono_such_key + + ffj_t_TaskInfo_Name + + ffj_t_TaskInfo_TaskID + + ffj_t_TaskInfo_AgentID + + ffj_t_TaskInfo_Resources + + ffj_t_TaskInfo_Executor + + ffj_t_TaskInfo_Command + + ffj_t_TaskInfo_Container + + ffj_t_TaskInfo_HealthCheck + + ffj_t_TaskInfo_Check + + ffj_t_TaskInfo_KillPolicy + + ffj_t_TaskInfo_Data + + ffj_t_TaskInfo_Labels + + ffj_t_TaskInfo_Discovery + + ffj_t_TaskInfo_MaxCompletionTime +) + +var ffj_key_TaskInfo_Name = []byte("name") + +var ffj_key_TaskInfo_TaskID = []byte("task_id") + +var ffj_key_TaskInfo_AgentID = []byte("agent_id") + +var ffj_key_TaskInfo_Resources = []byte("resources") + +var ffj_key_TaskInfo_Executor = []byte("executor") + +var ffj_key_TaskInfo_Command = []byte("command") + +var ffj_key_TaskInfo_Container = []byte("container") + +var ffj_key_TaskInfo_HealthCheck = []byte("health_check") + +var ffj_key_TaskInfo_Check = []byte("check") + +var ffj_key_TaskInfo_KillPolicy = []byte("kill_policy") + +var ffj_key_TaskInfo_Data = []byte("data") + +var ffj_key_TaskInfo_Labels = []byte("labels") + +var ffj_key_TaskInfo_Discovery = []byte("discovery") + +var ffj_key_TaskInfo_MaxCompletionTime = []byte("max_completion_time") + +func (uj *TaskInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TaskInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TaskInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TaskInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_TaskInfo_AgentID, kn) { + currentKey = ffj_t_TaskInfo_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_TaskInfo_Command, kn) { + currentKey = ffj_t_TaskInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskInfo_Container, kn) { + currentKey = ffj_t_TaskInfo_Container + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskInfo_Check, kn) { + currentKey = ffj_t_TaskInfo_Check + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_TaskInfo_Data, kn) { + currentKey = ffj_t_TaskInfo_Data + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskInfo_Discovery, kn) { + currentKey = ffj_t_TaskInfo_Discovery + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_TaskInfo_Executor, kn) { + currentKey = ffj_t_TaskInfo_Executor + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_TaskInfo_HealthCheck, kn) { + currentKey = ffj_t_TaskInfo_HealthCheck + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'k': + + if bytes.Equal(ffj_key_TaskInfo_KillPolicy, kn) { + currentKey = ffj_t_TaskInfo_KillPolicy + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_TaskInfo_Labels, kn) { + currentKey = ffj_t_TaskInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_TaskInfo_MaxCompletionTime, kn) { + currentKey = ffj_t_TaskInfo_MaxCompletionTime + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_TaskInfo_Name, kn) { + currentKey = ffj_t_TaskInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_TaskInfo_Resources, kn) { + currentKey = ffj_t_TaskInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_TaskInfo_TaskID, kn) { + currentKey = ffj_t_TaskInfo_TaskID + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_TaskInfo_MaxCompletionTime, kn) { + currentKey = ffj_t_TaskInfo_MaxCompletionTime + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskInfo_Discovery, kn) { + currentKey = ffj_t_TaskInfo_Discovery + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskInfo_Labels, kn) { + currentKey = ffj_t_TaskInfo_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskInfo_Data, kn) { + currentKey = ffj_t_TaskInfo_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskInfo_KillPolicy, kn) { + currentKey = ffj_t_TaskInfo_KillPolicy + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskInfo_Check, kn) { + currentKey = ffj_t_TaskInfo_Check + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskInfo_HealthCheck, kn) { + currentKey = ffj_t_TaskInfo_HealthCheck + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskInfo_Container, kn) { + currentKey = ffj_t_TaskInfo_Container + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskInfo_Command, kn) { + currentKey = ffj_t_TaskInfo_Command + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskInfo_Executor, kn) { + currentKey = ffj_t_TaskInfo_Executor + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskInfo_Resources, kn) { + currentKey = ffj_t_TaskInfo_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_TaskInfo_AgentID, kn) { + currentKey = ffj_t_TaskInfo_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskInfo_TaskID, kn) { + currentKey = ffj_t_TaskInfo_TaskID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskInfo_Name, kn) { + currentKey = ffj_t_TaskInfo_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TaskInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TaskInfo_Name: + goto handle_Name + + case ffj_t_TaskInfo_TaskID: + goto handle_TaskID + + case ffj_t_TaskInfo_AgentID: + goto handle_AgentID + + case ffj_t_TaskInfo_Resources: + goto handle_Resources + + case ffj_t_TaskInfo_Executor: + goto handle_Executor + + case ffj_t_TaskInfo_Command: + goto handle_Command + + case ffj_t_TaskInfo_Container: + goto handle_Container + + case ffj_t_TaskInfo_HealthCheck: + goto handle_HealthCheck + + case ffj_t_TaskInfo_Check: + goto handle_Check + + case ffj_t_TaskInfo_KillPolicy: + goto handle_KillPolicy + + case ffj_t_TaskInfo_Data: + goto handle_Data + + case ffj_t_TaskInfo_Labels: + goto handle_Labels + + case ffj_t_TaskInfo_Discovery: + goto handle_Discovery + + case ffj_t_TaskInfo_MaxCompletionTime: + goto handle_MaxCompletionTime + + case ffj_t_TaskInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_TaskID: + + /* handler: uj.TaskID type=mesos.TaskID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.TaskID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AgentID: + + /* handler: uj.AgentID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.AgentID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Executor: + + /* handler: uj.Executor type=mesos.ExecutorInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Executor = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Executor == nil { + uj.Executor = new(ExecutorInfo) + } + + err = uj.Executor.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Command: + + /* handler: uj.Command type=mesos.CommandInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Command = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Command == nil { + uj.Command = new(CommandInfo) + } + + err = uj.Command.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Container: + + /* handler: uj.Container type=mesos.ContainerInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Container = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Container == nil { + uj.Container = new(ContainerInfo) + } + + err = uj.Container.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_HealthCheck: + + /* handler: uj.HealthCheck type=mesos.HealthCheck kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.HealthCheck = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.HealthCheck == nil { + uj.HealthCheck = new(HealthCheck) + } + + err = uj.HealthCheck.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Check: + + /* handler: uj.Check type=mesos.CheckInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Check = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Check == nil { + uj.Check = new(CheckInfo) + } + + err = uj.Check.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_KillPolicy: + + /* handler: uj.KillPolicy type=mesos.KillPolicy kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.KillPolicy = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.KillPolicy == nil { + uj.KillPolicy = new(KillPolicy) + } + + err = uj.KillPolicy.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Data: + + /* handler: uj.Data type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Data = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.Data).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Discovery: + + /* handler: uj.Discovery type=mesos.DiscoveryInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Discovery = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Discovery == nil { + uj.Discovery = new(DiscoveryInfo) + } + + err = uj.Discovery.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MaxCompletionTime: + + /* handler: uj.MaxCompletionTime type=mesos.DurationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.MaxCompletionTime = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.MaxCompletionTime == nil { + uj.MaxCompletionTime = new(DurationInfo) + } + + err = uj.MaxCompletionTime.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TaskResourceLimitation) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TaskResourceLimitation) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"resources":`) + if mj.Resources != nil { + buf.WriteString(`[`) + for i, v := range mj.Resources { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TaskResourceLimitationbase = iota + ffj_t_TaskResourceLimitationno_such_key + + ffj_t_TaskResourceLimitation_Resources +) + +var ffj_key_TaskResourceLimitation_Resources = []byte("resources") + +func (uj *TaskResourceLimitation) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TaskResourceLimitation) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TaskResourceLimitationbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TaskResourceLimitationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_TaskResourceLimitation_Resources, kn) { + currentKey = ffj_t_TaskResourceLimitation_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_TaskResourceLimitation_Resources, kn) { + currentKey = ffj_t_TaskResourceLimitation_Resources + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TaskResourceLimitationno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TaskResourceLimitation_Resources: + goto handle_Resources + + case ffj_t_TaskResourceLimitationno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Resources: + + /* handler: uj.Resources type=[]mesos.Resource kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Resources = nil + } else { + + uj.Resources = []Resource{} + + wantVal := true + + for { + + var tmp_uj__Resources Resource + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Resources type=mesos.Resource kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Resources.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Resources = append(uj.Resources, tmp_uj__Resources) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TaskStatus) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TaskStatus) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "task_id":`) + + { + + err = mj.TaskID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.State != nil { + if true { + buf.WriteString(`"state":`) + + { + + obj, err = mj.State.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Message != nil { + if true { + buf.WriteString(`"message":`) + fflib.WriteJsonString(buf, string(*mj.Message)) + buf.WriteByte(',') + } + } + if mj.Source != nil { + if true { + buf.WriteString(`"source":`) + + { + + obj, err = mj.Source.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if mj.Reason != nil { + if true { + buf.WriteString(`"reason":`) + + { + + obj, err = mj.Reason.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + if len(mj.Data) != 0 { + buf.WriteString(`"data":`) + if mj.Data != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.Data)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.AgentID != nil { + if true { + buf.WriteString(`"agent_id":`) + + { + + err = mj.AgentID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ExecutorID != nil { + if true { + buf.WriteString(`"executor_id":`) + + { + + err = mj.ExecutorID.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Timestamp != nil { + if true { + buf.WriteString(`"timestamp":`) + fflib.AppendFloat(buf, float64(*mj.Timestamp), 'g', -1, 64) + buf.WriteByte(',') + } + } + if len(mj.UUID) != 0 { + buf.WriteString(`"uuid":`) + if mj.UUID != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.UUID)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + if mj.Healthy != nil { + if true { + if *mj.Healthy { + buf.WriteString(`"healthy":true`) + } else { + buf.WriteString(`"healthy":false`) + } + buf.WriteByte(',') + } + } + if mj.CheckStatus != nil { + if true { + buf.WriteString(`"check_status":`) + + { + + err = mj.CheckStatus.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Labels != nil { + if true { + buf.WriteString(`"labels":`) + + { + + err = mj.Labels.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.ContainerStatus != nil { + if true { + buf.WriteString(`"container_status":`) + + { + + err = mj.ContainerStatus.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.UnreachableTime != nil { + if true { + buf.WriteString(`"unreachable_time":`) + + { + + err = mj.UnreachableTime.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Limitation != nil { + if true { + buf.WriteString(`"limitation":`) + + { + + err = mj.Limitation.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TaskStatusbase = iota + ffj_t_TaskStatusno_such_key + + ffj_t_TaskStatus_TaskID + + ffj_t_TaskStatus_State + + ffj_t_TaskStatus_Message + + ffj_t_TaskStatus_Source + + ffj_t_TaskStatus_Reason + + ffj_t_TaskStatus_Data + + ffj_t_TaskStatus_AgentID + + ffj_t_TaskStatus_ExecutorID + + ffj_t_TaskStatus_Timestamp + + ffj_t_TaskStatus_UUID + + ffj_t_TaskStatus_Healthy + + ffj_t_TaskStatus_CheckStatus + + ffj_t_TaskStatus_Labels + + ffj_t_TaskStatus_ContainerStatus + + ffj_t_TaskStatus_UnreachableTime + + ffj_t_TaskStatus_Limitation +) + +var ffj_key_TaskStatus_TaskID = []byte("task_id") + +var ffj_key_TaskStatus_State = []byte("state") + +var ffj_key_TaskStatus_Message = []byte("message") + +var ffj_key_TaskStatus_Source = []byte("source") + +var ffj_key_TaskStatus_Reason = []byte("reason") + +var ffj_key_TaskStatus_Data = []byte("data") + +var ffj_key_TaskStatus_AgentID = []byte("agent_id") + +var ffj_key_TaskStatus_ExecutorID = []byte("executor_id") + +var ffj_key_TaskStatus_Timestamp = []byte("timestamp") + +var ffj_key_TaskStatus_UUID = []byte("uuid") + +var ffj_key_TaskStatus_Healthy = []byte("healthy") + +var ffj_key_TaskStatus_CheckStatus = []byte("check_status") + +var ffj_key_TaskStatus_Labels = []byte("labels") + +var ffj_key_TaskStatus_ContainerStatus = []byte("container_status") + +var ffj_key_TaskStatus_UnreachableTime = []byte("unreachable_time") + +var ffj_key_TaskStatus_Limitation = []byte("limitation") + +func (uj *TaskStatus) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TaskStatus) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TaskStatusbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TaskStatusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_TaskStatus_AgentID, kn) { + currentKey = ffj_t_TaskStatus_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'c': + + if bytes.Equal(ffj_key_TaskStatus_CheckStatus, kn) { + currentKey = ffj_t_TaskStatus_CheckStatus + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskStatus_ContainerStatus, kn) { + currentKey = ffj_t_TaskStatus_ContainerStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_TaskStatus_Data, kn) { + currentKey = ffj_t_TaskStatus_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_TaskStatus_ExecutorID, kn) { + currentKey = ffj_t_TaskStatus_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_TaskStatus_Healthy, kn) { + currentKey = ffj_t_TaskStatus_Healthy + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'l': + + if bytes.Equal(ffj_key_TaskStatus_Labels, kn) { + currentKey = ffj_t_TaskStatus_Labels + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskStatus_Limitation, kn) { + currentKey = ffj_t_TaskStatus_Limitation + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_TaskStatus_Message, kn) { + currentKey = ffj_t_TaskStatus_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_TaskStatus_Reason, kn) { + currentKey = ffj_t_TaskStatus_Reason + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_TaskStatus_State, kn) { + currentKey = ffj_t_TaskStatus_State + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskStatus_Source, kn) { + currentKey = ffj_t_TaskStatus_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_TaskStatus_TaskID, kn) { + currentKey = ffj_t_TaskStatus_TaskID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskStatus_Timestamp, kn) { + currentKey = ffj_t_TaskStatus_Timestamp + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'u': + + if bytes.Equal(ffj_key_TaskStatus_UUID, kn) { + currentKey = ffj_t_TaskStatus_UUID + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TaskStatus_UnreachableTime, kn) { + currentKey = ffj_t_TaskStatus_UnreachableTime + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskStatus_Limitation, kn) { + currentKey = ffj_t_TaskStatus_Limitation + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_TaskStatus_UnreachableTime, kn) { + currentKey = ffj_t_TaskStatus_UnreachableTime + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_ContainerStatus, kn) { + currentKey = ffj_t_TaskStatus_ContainerStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_Labels, kn) { + currentKey = ffj_t_TaskStatus_Labels + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_CheckStatus, kn) { + currentKey = ffj_t_TaskStatus_CheckStatus + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskStatus_Healthy, kn) { + currentKey = ffj_t_TaskStatus_Healthy + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskStatus_UUID, kn) { + currentKey = ffj_t_TaskStatus_UUID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_Timestamp, kn) { + currentKey = ffj_t_TaskStatus_Timestamp + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_TaskStatus_ExecutorID, kn) { + currentKey = ffj_t_TaskStatus_ExecutorID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_TaskStatus_AgentID, kn) { + currentKey = ffj_t_TaskStatus_AgentID + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TaskStatus_Data, kn) { + currentKey = ffj_t_TaskStatus_Data + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_Reason, kn) { + currentKey = ffj_t_TaskStatus_Reason + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_Source, kn) { + currentKey = ffj_t_TaskStatus_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_Message, kn) { + currentKey = ffj_t_TaskStatus_Message + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_State, kn) { + currentKey = ffj_t_TaskStatus_State + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TaskStatus_TaskID, kn) { + currentKey = ffj_t_TaskStatus_TaskID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TaskStatusno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TaskStatus_TaskID: + goto handle_TaskID + + case ffj_t_TaskStatus_State: + goto handle_State + + case ffj_t_TaskStatus_Message: + goto handle_Message + + case ffj_t_TaskStatus_Source: + goto handle_Source + + case ffj_t_TaskStatus_Reason: + goto handle_Reason + + case ffj_t_TaskStatus_Data: + goto handle_Data + + case ffj_t_TaskStatus_AgentID: + goto handle_AgentID + + case ffj_t_TaskStatus_ExecutorID: + goto handle_ExecutorID + + case ffj_t_TaskStatus_Timestamp: + goto handle_Timestamp + + case ffj_t_TaskStatus_UUID: + goto handle_UUID + + case ffj_t_TaskStatus_Healthy: + goto handle_Healthy + + case ffj_t_TaskStatus_CheckStatus: + goto handle_CheckStatus + + case ffj_t_TaskStatus_Labels: + goto handle_Labels + + case ffj_t_TaskStatus_ContainerStatus: + goto handle_ContainerStatus + + case ffj_t_TaskStatus_UnreachableTime: + goto handle_UnreachableTime + + case ffj_t_TaskStatus_Limitation: + goto handle_Limitation + + case ffj_t_TaskStatusno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_TaskID: + + /* handler: uj.TaskID type=mesos.TaskID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.TaskID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_State: + + /* handler: uj.State type=mesos.TaskState kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.State = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.State == nil { + uj.State = new(TaskState) + } + + err = uj.State.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Message: + + /* handler: uj.Message type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Message = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Message = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Source: + + /* handler: uj.Source type=mesos.TaskStatus_Source kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Source = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Source == nil { + uj.Source = new(TaskStatus_Source) + } + + err = uj.Source.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Reason: + + /* handler: uj.Reason type=mesos.TaskStatus_Reason kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Reason = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Reason == nil { + uj.Reason = new(TaskStatus_Reason) + } + + err = uj.Reason.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Data: + + /* handler: uj.Data type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Data = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.Data).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AgentID: + + /* handler: uj.AgentID type=mesos.AgentID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.AgentID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.AgentID == nil { + uj.AgentID = new(AgentID) + } + + err = uj.AgentID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ExecutorID: + + /* handler: uj.ExecutorID type=mesos.ExecutorID kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ExecutorID = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ExecutorID == nil { + uj.ExecutorID = new(ExecutorID) + } + + err = uj.ExecutorID.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Timestamp: + + /* handler: uj.Timestamp type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Timestamp = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.Timestamp = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UUID: + + /* handler: uj.UUID type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.UUID = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.UUID).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Healthy: + + /* handler: uj.Healthy type=bool kind=bool quoted=false*/ + + { + if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) + } + } + + { + if tok == fflib.FFTok_null { + + uj.Healthy = nil + + } else { + tmpb := fs.Output.Bytes() + + var tval bool + + if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { + + tval = true + + } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { + + tval = false + + } else { + err = errors.New("unexpected bytes for true/false value") + return fs.WrapErr(err) + } + + uj.Healthy = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CheckStatus: + + /* handler: uj.CheckStatus type=mesos.CheckStatusInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.CheckStatus = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.CheckStatus == nil { + uj.CheckStatus = new(CheckStatusInfo) + } + + err = uj.CheckStatus.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Labels: + + /* handler: uj.Labels type=mesos.Labels kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Labels = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Labels == nil { + uj.Labels = new(Labels) + } + + err = uj.Labels.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerStatus: + + /* handler: uj.ContainerStatus type=mesos.ContainerStatus kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.ContainerStatus = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.ContainerStatus == nil { + uj.ContainerStatus = new(ContainerStatus) + } + + err = uj.ContainerStatus.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_UnreachableTime: + + /* handler: uj.UnreachableTime type=mesos.TimeInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.UnreachableTime = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.UnreachableTime == nil { + uj.UnreachableTime = new(TimeInfo) + } + + err = uj.UnreachableTime.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Limitation: + + /* handler: uj.Limitation type=mesos.TaskResourceLimitation kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Limitation = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Limitation == nil { + uj.Limitation = new(TaskResourceLimitation) + } + + err = uj.Limitation.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TcpStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TcpStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.RtoAlgorithm != nil { + if true { + buf.WriteString(`"RtoAlgorithm":`) + fflib.FormatBits2(buf, uint64(*mj.RtoAlgorithm), 10, *mj.RtoAlgorithm < 0) + buf.WriteByte(',') + } + } + if mj.RtoMin != nil { + if true { + buf.WriteString(`"RtoMin":`) + fflib.FormatBits2(buf, uint64(*mj.RtoMin), 10, *mj.RtoMin < 0) + buf.WriteByte(',') + } + } + if mj.RtoMax != nil { + if true { + buf.WriteString(`"RtoMax":`) + fflib.FormatBits2(buf, uint64(*mj.RtoMax), 10, *mj.RtoMax < 0) + buf.WriteByte(',') + } + } + if mj.MaxConn != nil { + if true { + buf.WriteString(`"MaxConn":`) + fflib.FormatBits2(buf, uint64(*mj.MaxConn), 10, *mj.MaxConn < 0) + buf.WriteByte(',') + } + } + if mj.ActiveOpens != nil { + if true { + buf.WriteString(`"ActiveOpens":`) + fflib.FormatBits2(buf, uint64(*mj.ActiveOpens), 10, *mj.ActiveOpens < 0) + buf.WriteByte(',') + } + } + if mj.PassiveOpens != nil { + if true { + buf.WriteString(`"PassiveOpens":`) + fflib.FormatBits2(buf, uint64(*mj.PassiveOpens), 10, *mj.PassiveOpens < 0) + buf.WriteByte(',') + } + } + if mj.AttemptFails != nil { + if true { + buf.WriteString(`"AttemptFails":`) + fflib.FormatBits2(buf, uint64(*mj.AttemptFails), 10, *mj.AttemptFails < 0) + buf.WriteByte(',') + } + } + if mj.EstabResets != nil { + if true { + buf.WriteString(`"EstabResets":`) + fflib.FormatBits2(buf, uint64(*mj.EstabResets), 10, *mj.EstabResets < 0) + buf.WriteByte(',') + } + } + if mj.CurrEstab != nil { + if true { + buf.WriteString(`"CurrEstab":`) + fflib.FormatBits2(buf, uint64(*mj.CurrEstab), 10, *mj.CurrEstab < 0) + buf.WriteByte(',') + } + } + if mj.InSegs != nil { + if true { + buf.WriteString(`"InSegs":`) + fflib.FormatBits2(buf, uint64(*mj.InSegs), 10, *mj.InSegs < 0) + buf.WriteByte(',') + } + } + if mj.OutSegs != nil { + if true { + buf.WriteString(`"OutSegs":`) + fflib.FormatBits2(buf, uint64(*mj.OutSegs), 10, *mj.OutSegs < 0) + buf.WriteByte(',') + } + } + if mj.RetransSegs != nil { + if true { + buf.WriteString(`"RetransSegs":`) + fflib.FormatBits2(buf, uint64(*mj.RetransSegs), 10, *mj.RetransSegs < 0) + buf.WriteByte(',') + } + } + if mj.InErrs != nil { + if true { + buf.WriteString(`"InErrs":`) + fflib.FormatBits2(buf, uint64(*mj.InErrs), 10, *mj.InErrs < 0) + buf.WriteByte(',') + } + } + if mj.OutRsts != nil { + if true { + buf.WriteString(`"OutRsts":`) + fflib.FormatBits2(buf, uint64(*mj.OutRsts), 10, *mj.OutRsts < 0) + buf.WriteByte(',') + } + } + if mj.InCsumErrors != nil { + if true { + buf.WriteString(`"InCsumErrors":`) + fflib.FormatBits2(buf, uint64(*mj.InCsumErrors), 10, *mj.InCsumErrors < 0) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TcpStatisticsbase = iota + ffj_t_TcpStatisticsno_such_key + + ffj_t_TcpStatistics_RtoAlgorithm + + ffj_t_TcpStatistics_RtoMin + + ffj_t_TcpStatistics_RtoMax + + ffj_t_TcpStatistics_MaxConn + + ffj_t_TcpStatistics_ActiveOpens + + ffj_t_TcpStatistics_PassiveOpens + + ffj_t_TcpStatistics_AttemptFails + + ffj_t_TcpStatistics_EstabResets + + ffj_t_TcpStatistics_CurrEstab + + ffj_t_TcpStatistics_InSegs + + ffj_t_TcpStatistics_OutSegs + + ffj_t_TcpStatistics_RetransSegs + + ffj_t_TcpStatistics_InErrs + + ffj_t_TcpStatistics_OutRsts + + ffj_t_TcpStatistics_InCsumErrors +) + +var ffj_key_TcpStatistics_RtoAlgorithm = []byte("RtoAlgorithm") + +var ffj_key_TcpStatistics_RtoMin = []byte("RtoMin") + +var ffj_key_TcpStatistics_RtoMax = []byte("RtoMax") + +var ffj_key_TcpStatistics_MaxConn = []byte("MaxConn") + +var ffj_key_TcpStatistics_ActiveOpens = []byte("ActiveOpens") + +var ffj_key_TcpStatistics_PassiveOpens = []byte("PassiveOpens") + +var ffj_key_TcpStatistics_AttemptFails = []byte("AttemptFails") + +var ffj_key_TcpStatistics_EstabResets = []byte("EstabResets") + +var ffj_key_TcpStatistics_CurrEstab = []byte("CurrEstab") + +var ffj_key_TcpStatistics_InSegs = []byte("InSegs") + +var ffj_key_TcpStatistics_OutSegs = []byte("OutSegs") + +var ffj_key_TcpStatistics_RetransSegs = []byte("RetransSegs") + +var ffj_key_TcpStatistics_InErrs = []byte("InErrs") + +var ffj_key_TcpStatistics_OutRsts = []byte("OutRsts") + +var ffj_key_TcpStatistics_InCsumErrors = []byte("InCsumErrors") + +func (uj *TcpStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TcpStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TcpStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TcpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'A': + + if bytes.Equal(ffj_key_TcpStatistics_ActiveOpens, kn) { + currentKey = ffj_t_TcpStatistics_ActiveOpens + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TcpStatistics_AttemptFails, kn) { + currentKey = ffj_t_TcpStatistics_AttemptFails + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'C': + + if bytes.Equal(ffj_key_TcpStatistics_CurrEstab, kn) { + currentKey = ffj_t_TcpStatistics_CurrEstab + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'E': + + if bytes.Equal(ffj_key_TcpStatistics_EstabResets, kn) { + currentKey = ffj_t_TcpStatistics_EstabResets + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'I': + + if bytes.Equal(ffj_key_TcpStatistics_InSegs, kn) { + currentKey = ffj_t_TcpStatistics_InSegs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TcpStatistics_InErrs, kn) { + currentKey = ffj_t_TcpStatistics_InErrs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TcpStatistics_InCsumErrors, kn) { + currentKey = ffj_t_TcpStatistics_InCsumErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'M': + + if bytes.Equal(ffj_key_TcpStatistics_MaxConn, kn) { + currentKey = ffj_t_TcpStatistics_MaxConn + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'O': + + if bytes.Equal(ffj_key_TcpStatistics_OutSegs, kn) { + currentKey = ffj_t_TcpStatistics_OutSegs + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TcpStatistics_OutRsts, kn) { + currentKey = ffj_t_TcpStatistics_OutRsts + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'P': + + if bytes.Equal(ffj_key_TcpStatistics_PassiveOpens, kn) { + currentKey = ffj_t_TcpStatistics_PassiveOpens + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'R': + + if bytes.Equal(ffj_key_TcpStatistics_RtoAlgorithm, kn) { + currentKey = ffj_t_TcpStatistics_RtoAlgorithm + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TcpStatistics_RtoMin, kn) { + currentKey = ffj_t_TcpStatistics_RtoMin + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TcpStatistics_RtoMax, kn) { + currentKey = ffj_t_TcpStatistics_RtoMax + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TcpStatistics_RetransSegs, kn) { + currentKey = ffj_t_TcpStatistics_RetransSegs + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_InCsumErrors, kn) { + currentKey = ffj_t_TcpStatistics_InCsumErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_OutRsts, kn) { + currentKey = ffj_t_TcpStatistics_OutRsts + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_InErrs, kn) { + currentKey = ffj_t_TcpStatistics_InErrs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_RetransSegs, kn) { + currentKey = ffj_t_TcpStatistics_RetransSegs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_OutSegs, kn) { + currentKey = ffj_t_TcpStatistics_OutSegs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_InSegs, kn) { + currentKey = ffj_t_TcpStatistics_InSegs + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_CurrEstab, kn) { + currentKey = ffj_t_TcpStatistics_CurrEstab + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_EstabResets, kn) { + currentKey = ffj_t_TcpStatistics_EstabResets + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_AttemptFails, kn) { + currentKey = ffj_t_TcpStatistics_AttemptFails + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_PassiveOpens, kn) { + currentKey = ffj_t_TcpStatistics_PassiveOpens + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TcpStatistics_ActiveOpens, kn) { + currentKey = ffj_t_TcpStatistics_ActiveOpens + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TcpStatistics_MaxConn, kn) { + currentKey = ffj_t_TcpStatistics_MaxConn + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TcpStatistics_RtoMax, kn) { + currentKey = ffj_t_TcpStatistics_RtoMax + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TcpStatistics_RtoMin, kn) { + currentKey = ffj_t_TcpStatistics_RtoMin + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TcpStatistics_RtoAlgorithm, kn) { + currentKey = ffj_t_TcpStatistics_RtoAlgorithm + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TcpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TcpStatistics_RtoAlgorithm: + goto handle_RtoAlgorithm + + case ffj_t_TcpStatistics_RtoMin: + goto handle_RtoMin + + case ffj_t_TcpStatistics_RtoMax: + goto handle_RtoMax + + case ffj_t_TcpStatistics_MaxConn: + goto handle_MaxConn + + case ffj_t_TcpStatistics_ActiveOpens: + goto handle_ActiveOpens + + case ffj_t_TcpStatistics_PassiveOpens: + goto handle_PassiveOpens + + case ffj_t_TcpStatistics_AttemptFails: + goto handle_AttemptFails + + case ffj_t_TcpStatistics_EstabResets: + goto handle_EstabResets + + case ffj_t_TcpStatistics_CurrEstab: + goto handle_CurrEstab + + case ffj_t_TcpStatistics_InSegs: + goto handle_InSegs + + case ffj_t_TcpStatistics_OutSegs: + goto handle_OutSegs + + case ffj_t_TcpStatistics_RetransSegs: + goto handle_RetransSegs + + case ffj_t_TcpStatistics_InErrs: + goto handle_InErrs + + case ffj_t_TcpStatistics_OutRsts: + goto handle_OutRsts + + case ffj_t_TcpStatistics_InCsumErrors: + goto handle_InCsumErrors + + case ffj_t_TcpStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_RtoAlgorithm: + + /* handler: uj.RtoAlgorithm type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RtoAlgorithm = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.RtoAlgorithm = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RtoMin: + + /* handler: uj.RtoMin type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RtoMin = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.RtoMin = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RtoMax: + + /* handler: uj.RtoMax type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RtoMax = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.RtoMax = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MaxConn: + + /* handler: uj.MaxConn type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.MaxConn = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.MaxConn = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ActiveOpens: + + /* handler: uj.ActiveOpens type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.ActiveOpens = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.ActiveOpens = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_PassiveOpens: + + /* handler: uj.PassiveOpens type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.PassiveOpens = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.PassiveOpens = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_AttemptFails: + + /* handler: uj.AttemptFails type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.AttemptFails = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.AttemptFails = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_EstabResets: + + /* handler: uj.EstabResets type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.EstabResets = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.EstabResets = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_CurrEstab: + + /* handler: uj.CurrEstab type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.CurrEstab = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.CurrEstab = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InSegs: + + /* handler: uj.InSegs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InSegs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InSegs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutSegs: + + /* handler: uj.OutSegs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutSegs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutSegs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RetransSegs: + + /* handler: uj.RetransSegs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RetransSegs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.RetransSegs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InErrs: + + /* handler: uj.InErrs type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InErrs = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InErrs = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutRsts: + + /* handler: uj.OutRsts type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutRsts = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutRsts = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InCsumErrors: + + /* handler: uj.InCsumErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InCsumErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InCsumErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TimeInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TimeInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"nanoseconds":`) + fflib.FormatBits2(buf, uint64(mj.Nanoseconds), 10, mj.Nanoseconds < 0) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TimeInfobase = iota + ffj_t_TimeInfono_such_key + + ffj_t_TimeInfo_Nanoseconds +) + +var ffj_key_TimeInfo_Nanoseconds = []byte("nanoseconds") + +func (uj *TimeInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TimeInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TimeInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TimeInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'n': + + if bytes.Equal(ffj_key_TimeInfo_Nanoseconds, kn) { + currentKey = ffj_t_TimeInfo_Nanoseconds + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_TimeInfo_Nanoseconds, kn) { + currentKey = ffj_t_TimeInfo_Nanoseconds + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TimeInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TimeInfo_Nanoseconds: + goto handle_Nanoseconds + + case ffj_t_TimeInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Nanoseconds: + + /* handler: uj.Nanoseconds type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Nanoseconds = int64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *TrafficControlStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *TrafficControlStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "id":`) + fflib.WriteJsonString(buf, string(mj.ID)) + buf.WriteByte(',') + if mj.Backlog != nil { + if true { + buf.WriteString(`"backlog":`) + fflib.FormatBits2(buf, uint64(*mj.Backlog), 10, false) + buf.WriteByte(',') + } + } + if mj.Bytes != nil { + if true { + buf.WriteString(`"bytes":`) + fflib.FormatBits2(buf, uint64(*mj.Bytes), 10, false) + buf.WriteByte(',') + } + } + if mj.Drops != nil { + if true { + buf.WriteString(`"drops":`) + fflib.FormatBits2(buf, uint64(*mj.Drops), 10, false) + buf.WriteByte(',') + } + } + if mj.Overlimits != nil { + if true { + buf.WriteString(`"overlimits":`) + fflib.FormatBits2(buf, uint64(*mj.Overlimits), 10, false) + buf.WriteByte(',') + } + } + if mj.Packets != nil { + if true { + buf.WriteString(`"packets":`) + fflib.FormatBits2(buf, uint64(*mj.Packets), 10, false) + buf.WriteByte(',') + } + } + if mj.Qlen != nil { + if true { + buf.WriteString(`"qlen":`) + fflib.FormatBits2(buf, uint64(*mj.Qlen), 10, false) + buf.WriteByte(',') + } + } + if mj.RateBPS != nil { + if true { + buf.WriteString(`"ratebps":`) + fflib.FormatBits2(buf, uint64(*mj.RateBPS), 10, false) + buf.WriteByte(',') + } + } + if mj.RatePPS != nil { + if true { + buf.WriteString(`"ratepps":`) + fflib.FormatBits2(buf, uint64(*mj.RatePPS), 10, false) + buf.WriteByte(',') + } + } + if mj.Requeues != nil { + if true { + buf.WriteString(`"requeues":`) + fflib.FormatBits2(buf, uint64(*mj.Requeues), 10, false) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_TrafficControlStatisticsbase = iota + ffj_t_TrafficControlStatisticsno_such_key + + ffj_t_TrafficControlStatistics_ID + + ffj_t_TrafficControlStatistics_Backlog + + ffj_t_TrafficControlStatistics_Bytes + + ffj_t_TrafficControlStatistics_Drops + + ffj_t_TrafficControlStatistics_Overlimits + + ffj_t_TrafficControlStatistics_Packets + + ffj_t_TrafficControlStatistics_Qlen + + ffj_t_TrafficControlStatistics_RateBPS + + ffj_t_TrafficControlStatistics_RatePPS + + ffj_t_TrafficControlStatistics_Requeues +) + +var ffj_key_TrafficControlStatistics_ID = []byte("id") + +var ffj_key_TrafficControlStatistics_Backlog = []byte("backlog") + +var ffj_key_TrafficControlStatistics_Bytes = []byte("bytes") + +var ffj_key_TrafficControlStatistics_Drops = []byte("drops") + +var ffj_key_TrafficControlStatistics_Overlimits = []byte("overlimits") + +var ffj_key_TrafficControlStatistics_Packets = []byte("packets") + +var ffj_key_TrafficControlStatistics_Qlen = []byte("qlen") + +var ffj_key_TrafficControlStatistics_RateBPS = []byte("ratebps") + +var ffj_key_TrafficControlStatistics_RatePPS = []byte("ratepps") + +var ffj_key_TrafficControlStatistics_Requeues = []byte("requeues") + +func (uj *TrafficControlStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *TrafficControlStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_TrafficControlStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_TrafficControlStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'b': + + if bytes.Equal(ffj_key_TrafficControlStatistics_Backlog, kn) { + currentKey = ffj_t_TrafficControlStatistics_Backlog + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TrafficControlStatistics_Bytes, kn) { + currentKey = ffj_t_TrafficControlStatistics_Bytes + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'd': + + if bytes.Equal(ffj_key_TrafficControlStatistics_Drops, kn) { + currentKey = ffj_t_TrafficControlStatistics_Drops + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_TrafficControlStatistics_ID, kn) { + currentKey = ffj_t_TrafficControlStatistics_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'o': + + if bytes.Equal(ffj_key_TrafficControlStatistics_Overlimits, kn) { + currentKey = ffj_t_TrafficControlStatistics_Overlimits + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_TrafficControlStatistics_Packets, kn) { + currentKey = ffj_t_TrafficControlStatistics_Packets + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'q': + + if bytes.Equal(ffj_key_TrafficControlStatistics_Qlen, kn) { + currentKey = ffj_t_TrafficControlStatistics_Qlen + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'r': + + if bytes.Equal(ffj_key_TrafficControlStatistics_RateBPS, kn) { + currentKey = ffj_t_TrafficControlStatistics_RateBPS + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TrafficControlStatistics_RatePPS, kn) { + currentKey = ffj_t_TrafficControlStatistics_RatePPS + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_TrafficControlStatistics_Requeues, kn) { + currentKey = ffj_t_TrafficControlStatistics_Requeues + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_Requeues, kn) { + currentKey = ffj_t_TrafficControlStatistics_Requeues + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_RatePPS, kn) { + currentKey = ffj_t_TrafficControlStatistics_RatePPS + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_RateBPS, kn) { + currentKey = ffj_t_TrafficControlStatistics_RateBPS + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TrafficControlStatistics_Qlen, kn) { + currentKey = ffj_t_TrafficControlStatistics_Qlen + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_Packets, kn) { + currentKey = ffj_t_TrafficControlStatistics_Packets + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_Overlimits, kn) { + currentKey = ffj_t_TrafficControlStatistics_Overlimits + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_Drops, kn) { + currentKey = ffj_t_TrafficControlStatistics_Drops + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_Bytes, kn) { + currentKey = ffj_t_TrafficControlStatistics_Bytes + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_TrafficControlStatistics_Backlog, kn) { + currentKey = ffj_t_TrafficControlStatistics_Backlog + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_TrafficControlStatistics_ID, kn) { + currentKey = ffj_t_TrafficControlStatistics_ID + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_TrafficControlStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_TrafficControlStatistics_ID: + goto handle_ID + + case ffj_t_TrafficControlStatistics_Backlog: + goto handle_Backlog + + case ffj_t_TrafficControlStatistics_Bytes: + goto handle_Bytes + + case ffj_t_TrafficControlStatistics_Drops: + goto handle_Drops + + case ffj_t_TrafficControlStatistics_Overlimits: + goto handle_Overlimits + + case ffj_t_TrafficControlStatistics_Packets: + goto handle_Packets + + case ffj_t_TrafficControlStatistics_Qlen: + goto handle_Qlen + + case ffj_t_TrafficControlStatistics_RateBPS: + goto handle_RateBPS + + case ffj_t_TrafficControlStatistics_RatePPS: + goto handle_RatePPS + + case ffj_t_TrafficControlStatistics_Requeues: + goto handle_Requeues + + case ffj_t_TrafficControlStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_ID: + + /* handler: uj.ID type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ID = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Backlog: + + /* handler: uj.Backlog type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Backlog = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Backlog = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Bytes: + + /* handler: uj.Bytes type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Bytes = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Bytes = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Drops: + + /* handler: uj.Drops type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Drops = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Drops = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Overlimits: + + /* handler: uj.Overlimits type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Overlimits = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Overlimits = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Packets: + + /* handler: uj.Packets type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Packets = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Packets = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Qlen: + + /* handler: uj.Qlen type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Qlen = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Qlen = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RateBPS: + + /* handler: uj.RateBPS type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RateBPS = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.RateBPS = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RatePPS: + + /* handler: uj.RatePPS type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RatePPS = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.RatePPS = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Requeues: + + /* handler: uj.Requeues type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.Requeues = nil + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := uint64(tval) + uj.Requeues = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *URL) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *URL) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "scheme":`) + fflib.WriteJsonString(buf, string(mj.Scheme)) + buf.WriteString(`,"address":`) + + { + + err = mj.Address.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Path != nil { + if true { + buf.WriteString(`"path":`) + fflib.WriteJsonString(buf, string(*mj.Path)) + buf.WriteByte(',') + } + } + buf.WriteString(`"query":`) + if mj.Query != nil { + buf.WriteString(`[`) + for i, v := range mj.Query { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + if mj.Fragment != nil { + if true { + buf.WriteString(`"fragment":`) + fflib.WriteJsonString(buf, string(*mj.Fragment)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_URLbase = iota + ffj_t_URLno_such_key + + ffj_t_URL_Scheme + + ffj_t_URL_Address + + ffj_t_URL_Path + + ffj_t_URL_Query + + ffj_t_URL_Fragment +) + +var ffj_key_URL_Scheme = []byte("scheme") + +var ffj_key_URL_Address = []byte("address") + +var ffj_key_URL_Path = []byte("path") + +var ffj_key_URL_Query = []byte("query") + +var ffj_key_URL_Fragment = []byte("fragment") + +func (uj *URL) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *URL) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_URLbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_URLno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'a': + + if bytes.Equal(ffj_key_URL_Address, kn) { + currentKey = ffj_t_URL_Address + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'f': + + if bytes.Equal(ffj_key_URL_Fragment, kn) { + currentKey = ffj_t_URL_Fragment + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_URL_Path, kn) { + currentKey = ffj_t_URL_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'q': + + if bytes.Equal(ffj_key_URL_Query, kn) { + currentKey = ffj_t_URL_Query + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_URL_Scheme, kn) { + currentKey = ffj_t_URL_Scheme + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_URL_Fragment, kn) { + currentKey = ffj_t_URL_Fragment + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_URL_Query, kn) { + currentKey = ffj_t_URL_Query + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_URL_Path, kn) { + currentKey = ffj_t_URL_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_URL_Address, kn) { + currentKey = ffj_t_URL_Address + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_URL_Scheme, kn) { + currentKey = ffj_t_URL_Scheme + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_URLno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_URL_Scheme: + goto handle_Scheme + + case ffj_t_URL_Address: + goto handle_Address + + case ffj_t_URL_Path: + goto handle_Path + + case ffj_t_URL_Query: + goto handle_Query + + case ffj_t_URL_Fragment: + goto handle_Fragment + + case ffj_t_URLno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Scheme: + + /* handler: uj.Scheme type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Scheme = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Address: + + /* handler: uj.Address type=mesos.Address kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Address.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Path = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Path = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Query: + + /* handler: uj.Query type=[]mesos.Parameter kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Query = nil + } else { + + uj.Query = []Parameter{} + + wantVal := true + + for { + + var tmp_uj__Query Parameter + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Query type=mesos.Parameter kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Query.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Query = append(uj.Query, tmp_uj__Query) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Fragment: + + /* handler: uj.Fragment type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Fragment = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Fragment = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *UUID) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *UUID) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if len(mj.Value) != 0 { + buf.WriteString(`"value":`) + if mj.Value != nil { + buf.WriteString(`"`) + { + enc := base64.NewEncoder(base64.StdEncoding, buf) + enc.Write(reflect.Indirect(reflect.ValueOf(mj.Value)).Bytes()) + enc.Close() + } + buf.WriteString(`"`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_UUIDbase = iota + ffj_t_UUIDno_such_key + + ffj_t_UUID_Value +) + +var ffj_key_UUID_Value = []byte("value") + +func (uj *UUID) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *UUID) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_UUIDbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_UUIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_UUID_Value, kn) { + currentKey = ffj_t_UUID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_UUID_Value, kn) { + currentKey = ffj_t_UUID_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_UUIDno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_UUID_Value: + goto handle_Value + + case ffj_t_UUIDno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=[]uint8 kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Value = nil + } else { + b := make([]byte, base64.StdEncoding.DecodedLen(fs.Output.Len())) + n, err := base64.StdEncoding.Decode(b, fs.Output.Bytes()) + if err != nil { + return fs.WrapErr(err) + } + + v := reflect.ValueOf(&uj.Value).Elem() + v.SetBytes(b[0:n]) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *UdpStatistics) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *UdpStatistics) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.InDatagrams != nil { + if true { + buf.WriteString(`"InDatagrams":`) + fflib.FormatBits2(buf, uint64(*mj.InDatagrams), 10, *mj.InDatagrams < 0) + buf.WriteByte(',') + } + } + if mj.NoPorts != nil { + if true { + buf.WriteString(`"NoPorts":`) + fflib.FormatBits2(buf, uint64(*mj.NoPorts), 10, *mj.NoPorts < 0) + buf.WriteByte(',') + } + } + if mj.InErrors != nil { + if true { + buf.WriteString(`"InErrors":`) + fflib.FormatBits2(buf, uint64(*mj.InErrors), 10, *mj.InErrors < 0) + buf.WriteByte(',') + } + } + if mj.OutDatagrams != nil { + if true { + buf.WriteString(`"OutDatagrams":`) + fflib.FormatBits2(buf, uint64(*mj.OutDatagrams), 10, *mj.OutDatagrams < 0) + buf.WriteByte(',') + } + } + if mj.RcvbufErrors != nil { + if true { + buf.WriteString(`"RcvbufErrors":`) + fflib.FormatBits2(buf, uint64(*mj.RcvbufErrors), 10, *mj.RcvbufErrors < 0) + buf.WriteByte(',') + } + } + if mj.SndbufErrors != nil { + if true { + buf.WriteString(`"SndbufErrors":`) + fflib.FormatBits2(buf, uint64(*mj.SndbufErrors), 10, *mj.SndbufErrors < 0) + buf.WriteByte(',') + } + } + if mj.InCsumErrors != nil { + if true { + buf.WriteString(`"InCsumErrors":`) + fflib.FormatBits2(buf, uint64(*mj.InCsumErrors), 10, *mj.InCsumErrors < 0) + buf.WriteByte(',') + } + } + if mj.IgnoredMulti != nil { + if true { + buf.WriteString(`"IgnoredMulti":`) + fflib.FormatBits2(buf, uint64(*mj.IgnoredMulti), 10, *mj.IgnoredMulti < 0) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_UdpStatisticsbase = iota + ffj_t_UdpStatisticsno_such_key + + ffj_t_UdpStatistics_InDatagrams + + ffj_t_UdpStatistics_NoPorts + + ffj_t_UdpStatistics_InErrors + + ffj_t_UdpStatistics_OutDatagrams + + ffj_t_UdpStatistics_RcvbufErrors + + ffj_t_UdpStatistics_SndbufErrors + + ffj_t_UdpStatistics_InCsumErrors + + ffj_t_UdpStatistics_IgnoredMulti +) + +var ffj_key_UdpStatistics_InDatagrams = []byte("InDatagrams") + +var ffj_key_UdpStatistics_NoPorts = []byte("NoPorts") + +var ffj_key_UdpStatistics_InErrors = []byte("InErrors") + +var ffj_key_UdpStatistics_OutDatagrams = []byte("OutDatagrams") + +var ffj_key_UdpStatistics_RcvbufErrors = []byte("RcvbufErrors") + +var ffj_key_UdpStatistics_SndbufErrors = []byte("SndbufErrors") + +var ffj_key_UdpStatistics_InCsumErrors = []byte("InCsumErrors") + +var ffj_key_UdpStatistics_IgnoredMulti = []byte("IgnoredMulti") + +func (uj *UdpStatistics) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *UdpStatistics) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_UdpStatisticsbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_UdpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'I': + + if bytes.Equal(ffj_key_UdpStatistics_InDatagrams, kn) { + currentKey = ffj_t_UdpStatistics_InDatagrams + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_UdpStatistics_InErrors, kn) { + currentKey = ffj_t_UdpStatistics_InErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_UdpStatistics_InCsumErrors, kn) { + currentKey = ffj_t_UdpStatistics_InCsumErrors + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_UdpStatistics_IgnoredMulti, kn) { + currentKey = ffj_t_UdpStatistics_IgnoredMulti + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'N': + + if bytes.Equal(ffj_key_UdpStatistics_NoPorts, kn) { + currentKey = ffj_t_UdpStatistics_NoPorts + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'O': + + if bytes.Equal(ffj_key_UdpStatistics_OutDatagrams, kn) { + currentKey = ffj_t_UdpStatistics_OutDatagrams + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'R': + + if bytes.Equal(ffj_key_UdpStatistics_RcvbufErrors, kn) { + currentKey = ffj_t_UdpStatistics_RcvbufErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'S': + + if bytes.Equal(ffj_key_UdpStatistics_SndbufErrors, kn) { + currentKey = ffj_t_UdpStatistics_SndbufErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_UdpStatistics_IgnoredMulti, kn) { + currentKey = ffj_t_UdpStatistics_IgnoredMulti + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UdpStatistics_InCsumErrors, kn) { + currentKey = ffj_t_UdpStatistics_InCsumErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UdpStatistics_SndbufErrors, kn) { + currentKey = ffj_t_UdpStatistics_SndbufErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UdpStatistics_RcvbufErrors, kn) { + currentKey = ffj_t_UdpStatistics_RcvbufErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UdpStatistics_OutDatagrams, kn) { + currentKey = ffj_t_UdpStatistics_OutDatagrams + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UdpStatistics_InErrors, kn) { + currentKey = ffj_t_UdpStatistics_InErrors + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UdpStatistics_NoPorts, kn) { + currentKey = ffj_t_UdpStatistics_NoPorts + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_UdpStatistics_InDatagrams, kn) { + currentKey = ffj_t_UdpStatistics_InDatagrams + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_UdpStatisticsno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_UdpStatistics_InDatagrams: + goto handle_InDatagrams + + case ffj_t_UdpStatistics_NoPorts: + goto handle_NoPorts + + case ffj_t_UdpStatistics_InErrors: + goto handle_InErrors + + case ffj_t_UdpStatistics_OutDatagrams: + goto handle_OutDatagrams + + case ffj_t_UdpStatistics_RcvbufErrors: + goto handle_RcvbufErrors + + case ffj_t_UdpStatistics_SndbufErrors: + goto handle_SndbufErrors + + case ffj_t_UdpStatistics_InCsumErrors: + goto handle_InCsumErrors + + case ffj_t_UdpStatistics_IgnoredMulti: + goto handle_IgnoredMulti + + case ffj_t_UdpStatisticsno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_InDatagrams: + + /* handler: uj.InDatagrams type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InDatagrams = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InDatagrams = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_NoPorts: + + /* handler: uj.NoPorts type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.NoPorts = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.NoPorts = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InErrors: + + /* handler: uj.InErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_OutDatagrams: + + /* handler: uj.OutDatagrams type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.OutDatagrams = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.OutDatagrams = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_RcvbufErrors: + + /* handler: uj.RcvbufErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.RcvbufErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.RcvbufErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_SndbufErrors: + + /* handler: uj.SndbufErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.SndbufErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.SndbufErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_InCsumErrors: + + /* handler: uj.InCsumErrors type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.InCsumErrors = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.InCsumErrors = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_IgnoredMulti: + + /* handler: uj.IgnoredMulti type=int64 kind=int64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.IgnoredMulti = nil + + } else { + + tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := int64(tval) + uj.IgnoredMulti = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Unavailability) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Unavailability) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "start":`) + + { + + err = mj.Start.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + if mj.Duration != nil { + if true { + buf.WriteString(`"duration":`) + + { + + err = mj.Duration.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Unavailabilitybase = iota + ffj_t_Unavailabilityno_such_key + + ffj_t_Unavailability_Start + + ffj_t_Unavailability_Duration +) + +var ffj_key_Unavailability_Start = []byte("start") + +var ffj_key_Unavailability_Duration = []byte("duration") + +func (uj *Unavailability) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Unavailability) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Unavailabilitybase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Unavailabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_Unavailability_Duration, kn) { + currentKey = ffj_t_Unavailability_Duration + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Unavailability_Start, kn) { + currentKey = ffj_t_Unavailability_Start + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Unavailability_Duration, kn) { + currentKey = ffj_t_Unavailability_Duration + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Unavailability_Start, kn) { + currentKey = ffj_t_Unavailability_Start + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Unavailabilityno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Unavailability_Start: + goto handle_Start + + case ffj_t_Unavailability_Duration: + goto handle_Duration + + case ffj_t_Unavailabilityno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Start: + + /* handler: uj.Start type=mesos.TimeInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = uj.Start.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Duration: + + /* handler: uj.Duration type=mesos.DurationInfo kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Duration = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Duration == nil { + uj.Duration = new(DurationInfo) + } + + err = uj.Duration.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Value) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Value) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.Scalar != nil { + if true { + buf.WriteString(`"scalar":`) + + { + + err = mj.Scalar.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Ranges != nil { + if true { + buf.WriteString(`"ranges":`) + + { + + err = mj.Ranges.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Set != nil { + if true { + buf.WriteString(`"set":`) + + { + + err = mj.Set.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Text != nil { + if true { + buf.WriteString(`"text":`) + + { + + err = mj.Text.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Valuebase = iota + ffj_t_Valueno_such_key + + ffj_t_Value_Type + + ffj_t_Value_Scalar + + ffj_t_Value_Ranges + + ffj_t_Value_Set + + ffj_t_Value_Text +) + +var ffj_key_Value_Type = []byte("type") + +var ffj_key_Value_Scalar = []byte("scalar") + +var ffj_key_Value_Ranges = []byte("ranges") + +var ffj_key_Value_Set = []byte("set") + +var ffj_key_Value_Text = []byte("text") + +func (uj *Value) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Value) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Valuebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Valueno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Value_Ranges, kn) { + currentKey = ffj_t_Value_Ranges + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Value_Scalar, kn) { + currentKey = ffj_t_Value_Scalar + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Value_Set, kn) { + currentKey = ffj_t_Value_Set + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Value_Type, kn) { + currentKey = ffj_t_Value_Type + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Value_Text, kn) { + currentKey = ffj_t_Value_Text + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Text, kn) { + currentKey = ffj_t_Value_Text + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Value_Set, kn) { + currentKey = ffj_t_Value_Set + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Value_Ranges, kn) { + currentKey = ffj_t_Value_Ranges + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Value_Scalar, kn) { + currentKey = ffj_t_Value_Scalar + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Type, kn) { + currentKey = ffj_t_Value_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Valueno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Value_Type: + goto handle_Type + + case ffj_t_Value_Scalar: + goto handle_Scalar + + case ffj_t_Value_Ranges: + goto handle_Ranges + + case ffj_t_Value_Set: + goto handle_Set + + case ffj_t_Value_Text: + goto handle_Text + + case ffj_t_Valueno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Value_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Scalar: + + /* handler: uj.Scalar type=mesos.Value_Scalar kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Scalar = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Scalar == nil { + uj.Scalar = new(Value_Scalar) + } + + err = uj.Scalar.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Ranges: + + /* handler: uj.Ranges type=mesos.Value_Ranges kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Ranges = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Ranges == nil { + uj.Ranges = new(Value_Ranges) + } + + err = uj.Ranges.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Set: + + /* handler: uj.Set type=mesos.Value_Set kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Set = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Set == nil { + uj.Set = new(Value_Set) + } + + err = uj.Set.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Text: + + /* handler: uj.Text type=mesos.Value_Text kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Text = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Text == nil { + uj.Text = new(Value_Text) + } + + err = uj.Text.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Value_Range) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Value_Range) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"begin":`) + fflib.FormatBits2(buf, uint64(mj.Begin), 10, false) + buf.WriteString(`,"end":`) + fflib.FormatBits2(buf, uint64(mj.End), 10, false) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Value_Rangebase = iota + ffj_t_Value_Rangeno_such_key + + ffj_t_Value_Range_Begin + + ffj_t_Value_Range_End +) + +var ffj_key_Value_Range_Begin = []byte("begin") + +var ffj_key_Value_Range_End = []byte("end") + +func (uj *Value_Range) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Value_Range) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Value_Rangebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Value_Rangeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'b': + + if bytes.Equal(ffj_key_Value_Range_Begin, kn) { + currentKey = ffj_t_Value_Range_Begin + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'e': + + if bytes.Equal(ffj_key_Value_Range_End, kn) { + currentKey = ffj_t_Value_Range_End + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Range_End, kn) { + currentKey = ffj_t_Value_Range_End + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Range_Begin, kn) { + currentKey = ffj_t_Value_Range_Begin + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Value_Rangeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Value_Range_Begin: + goto handle_Begin + + case ffj_t_Value_Range_End: + goto handle_End + + case ffj_t_Value_Rangeno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Begin: + + /* handler: uj.Begin type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Begin = uint64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_End: + + /* handler: uj.End type=uint64 kind=uint64 quoted=false*/ + + { + if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for uint64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseUint(fs.Output.Bytes(), 10, 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.End = uint64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Value_Ranges) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Value_Ranges) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"range":`) + if mj.Range != nil { + buf.WriteString(`[`) + for i, v := range mj.Range { + if i != 0 { + buf.WriteString(`,`) + } + + { + + err = v.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Value_Rangesbase = iota + ffj_t_Value_Rangesno_such_key + + ffj_t_Value_Ranges_Range +) + +var ffj_key_Value_Ranges_Range = []byte("range") + +func (uj *Value_Ranges) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Value_Ranges) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Value_Rangesbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Value_Rangesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_Value_Ranges_Range, kn) { + currentKey = ffj_t_Value_Ranges_Range + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Ranges_Range, kn) { + currentKey = ffj_t_Value_Ranges_Range + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Value_Rangesno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Value_Ranges_Range: + goto handle_Range + + case ffj_t_Value_Rangesno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Range: + + /* handler: uj.Range type=[]mesos.Value_Range kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Range = nil + } else { + + uj.Range = []Value_Range{} + + wantVal := true + + for { + + var tmp_uj__Range Value_Range + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Range type=mesos.Value_Range kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + err = tmp_uj__Range.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + uj.Range = append(uj.Range, tmp_uj__Range) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Value_Scalar) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Value_Scalar) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.AppendFloat(buf, float64(mj.Value), 'g', -1, 64) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Value_Scalarbase = iota + ffj_t_Value_Scalarno_such_key + + ffj_t_Value_Scalar_Value +) + +var ffj_key_Value_Scalar_Value = []byte("value") + +func (uj *Value_Scalar) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Value_Scalar) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Value_Scalarbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Value_Scalarno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_Value_Scalar_Value, kn) { + currentKey = ffj_t_Value_Scalar_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Scalar_Value, kn) { + currentKey = ffj_t_Value_Scalar_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Value_Scalarno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Value_Scalar_Value: + goto handle_Value + + case ffj_t_Value_Scalarno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Value = float64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Value_Set) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Value_Set) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if len(mj.Item) != 0 { + buf.WriteString(`"item":`) + if mj.Item != nil { + buf.WriteString(`[`) + for i, v := range mj.Item { + if i != 0 { + buf.WriteString(`,`) + } + fflib.WriteJsonString(buf, string(v)) + } + buf.WriteString(`]`) + } else { + buf.WriteString(`null`) + } + buf.WriteByte(',') + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Value_Setbase = iota + ffj_t_Value_Setno_such_key + + ffj_t_Value_Set_Item +) + +var ffj_key_Value_Set_Item = []byte("item") + +func (uj *Value_Set) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Value_Set) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Value_Setbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Value_Setno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'i': + + if bytes.Equal(ffj_key_Value_Set_Item, kn) { + currentKey = ffj_t_Value_Set_Item + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Set_Item, kn) { + currentKey = ffj_t_Value_Set_Item + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Value_Setno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Value_Set_Item: + goto handle_Item + + case ffj_t_Value_Setno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Item: + + /* handler: uj.Item type=[]string kind=slice quoted=false*/ + + { + + { + if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) + } + } + + if tok == fflib.FFTok_null { + uj.Item = nil + } else { + + uj.Item = []string{} + + wantVal := true + + for { + + var tmp_uj__Item string + + tok = fs.Scan() + if tok == fflib.FFTok_error { + goto tokerror + } + if tok == fflib.FFTok_right_brace { + break + } + + if tok == fflib.FFTok_comma { + if wantVal == true { + // TODO(pquerna): this isn't an ideal error message, this handles + // things like [,,,] as an array value. + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) + } + continue + } else { + wantVal = true + } + + /* handler: tmp_uj__Item type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + tmp_uj__Item = string(string(outBuf)) + + } + } + + uj.Item = append(uj.Item, tmp_uj__Item) + + wantVal = false + } + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Value_Text) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Value_Text) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"value":`) + fflib.WriteJsonString(buf, string(mj.Value)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Value_Textbase = iota + ffj_t_Value_Textno_such_key + + ffj_t_Value_Text_Value +) + +var ffj_key_Value_Text_Value = []byte("value") + +func (uj *Value_Text) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Value_Text) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Value_Textbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Value_Textno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'v': + + if bytes.Equal(ffj_key_Value_Text_Value, kn) { + currentKey = ffj_t_Value_Text_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Value_Text_Value, kn) { + currentKey = ffj_t_Value_Text_Value + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Value_Textno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Value_Text_Value: + goto handle_Value + + case ffj_t_Value_Textno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Value: + + /* handler: uj.Value type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Value = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *VersionInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *VersionInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "version":`) + fflib.WriteJsonString(buf, string(mj.Version)) + buf.WriteByte(',') + if mj.BuildDate != nil { + if true { + buf.WriteString(`"build_date":`) + fflib.WriteJsonString(buf, string(*mj.BuildDate)) + buf.WriteByte(',') + } + } + if mj.BuildTime != nil { + if true { + buf.WriteString(`"build_time":`) + fflib.AppendFloat(buf, float64(*mj.BuildTime), 'g', -1, 64) + buf.WriteByte(',') + } + } + if mj.BuildUser != nil { + if true { + buf.WriteString(`"build_user":`) + fflib.WriteJsonString(buf, string(*mj.BuildUser)) + buf.WriteByte(',') + } + } + if mj.GitSHA != nil { + if true { + buf.WriteString(`"git_sha":`) + fflib.WriteJsonString(buf, string(*mj.GitSHA)) + buf.WriteByte(',') + } + } + if mj.GitBranch != nil { + if true { + buf.WriteString(`"git_branch":`) + fflib.WriteJsonString(buf, string(*mj.GitBranch)) + buf.WriteByte(',') + } + } + if mj.GitTag != nil { + if true { + buf.WriteString(`"git_tag":`) + fflib.WriteJsonString(buf, string(*mj.GitTag)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_VersionInfobase = iota + ffj_t_VersionInfono_such_key + + ffj_t_VersionInfo_Version + + ffj_t_VersionInfo_BuildDate + + ffj_t_VersionInfo_BuildTime + + ffj_t_VersionInfo_BuildUser + + ffj_t_VersionInfo_GitSHA + + ffj_t_VersionInfo_GitBranch + + ffj_t_VersionInfo_GitTag +) + +var ffj_key_VersionInfo_Version = []byte("version") + +var ffj_key_VersionInfo_BuildDate = []byte("build_date") + +var ffj_key_VersionInfo_BuildTime = []byte("build_time") + +var ffj_key_VersionInfo_BuildUser = []byte("build_user") + +var ffj_key_VersionInfo_GitSHA = []byte("git_sha") + +var ffj_key_VersionInfo_GitBranch = []byte("git_branch") + +var ffj_key_VersionInfo_GitTag = []byte("git_tag") + +func (uj *VersionInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *VersionInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_VersionInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_VersionInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'b': + + if bytes.Equal(ffj_key_VersionInfo_BuildDate, kn) { + currentKey = ffj_t_VersionInfo_BuildDate + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_VersionInfo_BuildTime, kn) { + currentKey = ffj_t_VersionInfo_BuildTime + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_VersionInfo_BuildUser, kn) { + currentKey = ffj_t_VersionInfo_BuildUser + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'g': + + if bytes.Equal(ffj_key_VersionInfo_GitSHA, kn) { + currentKey = ffj_t_VersionInfo_GitSHA + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_VersionInfo_GitBranch, kn) { + currentKey = ffj_t_VersionInfo_GitBranch + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_VersionInfo_GitTag, kn) { + currentKey = ffj_t_VersionInfo_GitTag + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'v': + + if bytes.Equal(ffj_key_VersionInfo_Version, kn) { + currentKey = ffj_t_VersionInfo_Version + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_VersionInfo_GitTag, kn) { + currentKey = ffj_t_VersionInfo_GitTag + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_VersionInfo_GitBranch, kn) { + currentKey = ffj_t_VersionInfo_GitBranch + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_VersionInfo_GitSHA, kn) { + currentKey = ffj_t_VersionInfo_GitSHA + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_VersionInfo_BuildUser, kn) { + currentKey = ffj_t_VersionInfo_BuildUser + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_VersionInfo_BuildTime, kn) { + currentKey = ffj_t_VersionInfo_BuildTime + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_VersionInfo_BuildDate, kn) { + currentKey = ffj_t_VersionInfo_BuildDate + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_VersionInfo_Version, kn) { + currentKey = ffj_t_VersionInfo_Version + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_VersionInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_VersionInfo_Version: + goto handle_Version + + case ffj_t_VersionInfo_BuildDate: + goto handle_BuildDate + + case ffj_t_VersionInfo_BuildTime: + goto handle_BuildTime + + case ffj_t_VersionInfo_BuildUser: + goto handle_BuildUser + + case ffj_t_VersionInfo_GitSHA: + goto handle_GitSHA + + case ffj_t_VersionInfo_GitBranch: + goto handle_GitBranch + + case ffj_t_VersionInfo_GitTag: + goto handle_GitTag + + case ffj_t_VersionInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Version: + + /* handler: uj.Version type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Version = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BuildDate: + + /* handler: uj.BuildDate type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.BuildDate = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.BuildDate = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BuildTime: + + /* handler: uj.BuildTime type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + uj.BuildTime = nil + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + ttypval := float64(tval) + uj.BuildTime = &ttypval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_BuildUser: + + /* handler: uj.BuildUser type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.BuildUser = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.BuildUser = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GitSHA: + + /* handler: uj.GitSHA type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.GitSHA = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.GitSHA = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GitBranch: + + /* handler: uj.GitBranch type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.GitBranch = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.GitBranch = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_GitTag: + + /* handler: uj.GitTag type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.GitTag = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.GitTag = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Volume) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Volume) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Mode != nil { + if true { + buf.WriteString(`"mode":`) + + { + + obj, err = mj.Mode.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + } + } + buf.WriteString(`"container_path":`) + fflib.WriteJsonString(buf, string(mj.ContainerPath)) + buf.WriteByte(',') + if mj.HostPath != nil { + if true { + buf.WriteString(`"host_path":`) + fflib.WriteJsonString(buf, string(*mj.HostPath)) + buf.WriteByte(',') + } + } + if mj.Image != nil { + if true { + buf.WriteString(`"image":`) + + { + + err = mj.Image.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Source != nil { + if true { + buf.WriteString(`"source":`) + + { + + err = mj.Source.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Volumebase = iota + ffj_t_Volumeno_such_key + + ffj_t_Volume_Mode + + ffj_t_Volume_ContainerPath + + ffj_t_Volume_HostPath + + ffj_t_Volume_Image + + ffj_t_Volume_Source +) + +var ffj_key_Volume_Mode = []byte("mode") + +var ffj_key_Volume_ContainerPath = []byte("container_path") + +var ffj_key_Volume_HostPath = []byte("host_path") + +var ffj_key_Volume_Image = []byte("image") + +var ffj_key_Volume_Source = []byte("source") + +func (uj *Volume) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Volume) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Volumebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Volumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'c': + + if bytes.Equal(ffj_key_Volume_ContainerPath, kn) { + currentKey = ffj_t_Volume_ContainerPath + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_Volume_HostPath, kn) { + currentKey = ffj_t_Volume_HostPath + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'i': + + if bytes.Equal(ffj_key_Volume_Image, kn) { + currentKey = ffj_t_Volume_Image + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'm': + + if bytes.Equal(ffj_key_Volume_Mode, kn) { + currentKey = ffj_t_Volume_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Volume_Source, kn) { + currentKey = ffj_t_Volume_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Volume_Source, kn) { + currentKey = ffj_t_Volume_Source + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Image, kn) { + currentKey = ffj_t_Volume_Image + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Volume_HostPath, kn) { + currentKey = ffj_t_Volume_HostPath + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.AsciiEqualFold(ffj_key_Volume_ContainerPath, kn) { + currentKey = ffj_t_Volume_ContainerPath + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Mode, kn) { + currentKey = ffj_t_Volume_Mode + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Volumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Volume_Mode: + goto handle_Mode + + case ffj_t_Volume_ContainerPath: + goto handle_ContainerPath + + case ffj_t_Volume_HostPath: + goto handle_HostPath + + case ffj_t_Volume_Image: + goto handle_Image + + case ffj_t_Volume_Source: + goto handle_Source + + case ffj_t_Volumeno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Mode: + + /* handler: uj.Mode type=mesos.Volume_Mode kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Mode = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + if uj.Mode == nil { + uj.Mode = new(Volume_Mode) + } + + err = uj.Mode.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_ContainerPath: + + /* handler: uj.ContainerPath type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.ContainerPath = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_HostPath: + + /* handler: uj.HostPath type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.HostPath = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.HostPath = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Image: + + /* handler: uj.Image type=mesos.Image kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Image = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Image == nil { + uj.Image = new(Image) + } + + err = uj.Image.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Source: + + /* handler: uj.Source type=mesos.Volume_Source kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Source = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Source == nil { + uj.Source = new(Volume_Source) + } + + err = uj.Source.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Volume_Source) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Volume_Source) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteByte(',') + if mj.DockerVolume != nil { + if true { + buf.WriteString(`"docker_volume":`) + + { + + err = mj.DockerVolume.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.HostPath != nil { + if true { + buf.WriteString(`"host_path":`) + + { + + err = mj.HostPath.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.SandboxPath != nil { + if true { + buf.WriteString(`"sandbox_path":`) + + { + + err = mj.SandboxPath.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + if mj.Secret != nil { + if true { + buf.WriteString(`"secret":`) + + { + + err = mj.Secret.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Volume_Sourcebase = iota + ffj_t_Volume_Sourceno_such_key + + ffj_t_Volume_Source_Type + + ffj_t_Volume_Source_DockerVolume + + ffj_t_Volume_Source_HostPath + + ffj_t_Volume_Source_SandboxPath + + ffj_t_Volume_Source_Secret +) + +var ffj_key_Volume_Source_Type = []byte("type") + +var ffj_key_Volume_Source_DockerVolume = []byte("docker_volume") + +var ffj_key_Volume_Source_HostPath = []byte("host_path") + +var ffj_key_Volume_Source_SandboxPath = []byte("sandbox_path") + +var ffj_key_Volume_Source_Secret = []byte("secret") + +func (uj *Volume_Source) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Volume_Source) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Volume_Sourcebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Volume_Sourceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_Volume_Source_DockerVolume, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'h': + + if bytes.Equal(ffj_key_Volume_Source_HostPath, kn) { + currentKey = ffj_t_Volume_Source_HostPath + state = fflib.FFParse_want_colon + goto mainparse + } + + case 's': + + if bytes.Equal(ffj_key_Volume_Source_SandboxPath, kn) { + currentKey = ffj_t_Volume_Source_SandboxPath + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Volume_Source_Secret, kn) { + currentKey = ffj_t_Volume_Source_Secret + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Volume_Source_Type, kn) { + currentKey = ffj_t_Volume_Source_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Volume_Source_Secret, kn) { + currentKey = ffj_t_Volume_Source_Secret + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Volume_Source_SandboxPath, kn) { + currentKey = ffj_t_Volume_Source_SandboxPath + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Volume_Source_HostPath, kn) { + currentKey = ffj_t_Volume_Source_HostPath + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.EqualFoldRight(ffj_key_Volume_Source_DockerVolume, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Source_Type, kn) { + currentKey = ffj_t_Volume_Source_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Volume_Sourceno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Volume_Source_Type: + goto handle_Type + + case ffj_t_Volume_Source_DockerVolume: + goto handle_DockerVolume + + case ffj_t_Volume_Source_HostPath: + goto handle_HostPath + + case ffj_t_Volume_Source_SandboxPath: + goto handle_SandboxPath + + case ffj_t_Volume_Source_Secret: + goto handle_Secret + + case ffj_t_Volume_Sourceno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Volume_Source_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DockerVolume: + + /* handler: uj.DockerVolume type=mesos.Volume_Source_DockerVolume kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.DockerVolume = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.DockerVolume == nil { + uj.DockerVolume = new(Volume_Source_DockerVolume) + } + + err = uj.DockerVolume.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_HostPath: + + /* handler: uj.HostPath type=mesos.Volume_Source_HostPath kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.HostPath = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.HostPath == nil { + uj.HostPath = new(Volume_Source_HostPath) + } + + err = uj.HostPath.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_SandboxPath: + + /* handler: uj.SandboxPath type=mesos.Volume_Source_SandboxPath kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.SandboxPath = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.SandboxPath == nil { + uj.SandboxPath = new(Volume_Source_SandboxPath) + } + + err = uj.SandboxPath.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Secret: + + /* handler: uj.Secret type=mesos.Secret kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.Secret = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.Secret == nil { + uj.Secret = new(Secret) + } + + err = uj.Secret.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Volume_Source_DockerVolume) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Volume_Source_DockerVolume) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ `) + if mj.Driver != nil { + if true { + buf.WriteString(`"driver":`) + fflib.WriteJsonString(buf, string(*mj.Driver)) + buf.WriteByte(',') + } + } + buf.WriteString(`"name":`) + fflib.WriteJsonString(buf, string(mj.Name)) + buf.WriteByte(',') + if mj.DriverOptions != nil { + if true { + buf.WriteString(`"driver_options":`) + + { + + err = mj.DriverOptions.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Volume_Source_DockerVolumebase = iota + ffj_t_Volume_Source_DockerVolumeno_such_key + + ffj_t_Volume_Source_DockerVolume_Driver + + ffj_t_Volume_Source_DockerVolume_Name + + ffj_t_Volume_Source_DockerVolume_DriverOptions +) + +var ffj_key_Volume_Source_DockerVolume_Driver = []byte("driver") + +var ffj_key_Volume_Source_DockerVolume_Name = []byte("name") + +var ffj_key_Volume_Source_DockerVolume_DriverOptions = []byte("driver_options") + +func (uj *Volume_Source_DockerVolume) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Volume_Source_DockerVolume) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Volume_Source_DockerVolumebase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Volume_Source_DockerVolumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'd': + + if bytes.Equal(ffj_key_Volume_Source_DockerVolume_Driver, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume_Driver + state = fflib.FFParse_want_colon + goto mainparse + + } else if bytes.Equal(ffj_key_Volume_Source_DockerVolume_DriverOptions, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume_DriverOptions + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'n': + + if bytes.Equal(ffj_key_Volume_Source_DockerVolume_Name, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.EqualFoldRight(ffj_key_Volume_Source_DockerVolume_DriverOptions, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume_DriverOptions + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Source_DockerVolume_Name, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume_Name + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Source_DockerVolume_Driver, kn) { + currentKey = ffj_t_Volume_Source_DockerVolume_Driver + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Volume_Source_DockerVolumeno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Volume_Source_DockerVolume_Driver: + goto handle_Driver + + case ffj_t_Volume_Source_DockerVolume_Name: + goto handle_Name + + case ffj_t_Volume_Source_DockerVolume_DriverOptions: + goto handle_DriverOptions + + case ffj_t_Volume_Source_DockerVolumeno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Driver: + + /* handler: uj.Driver type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Driver = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Driver = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Name: + + /* handler: uj.Name type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Name = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_DriverOptions: + + /* handler: uj.DriverOptions type=mesos.Parameters kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.DriverOptions = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.DriverOptions == nil { + uj.DriverOptions = new(Parameters) + } + + err = uj.DriverOptions.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Volume_Source_HostPath) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Volume_Source_HostPath) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "path":`) + fflib.WriteJsonString(buf, string(mj.Path)) + buf.WriteByte(',') + if mj.MountPropagation != nil { + if true { + buf.WriteString(`"mount_propagation":`) + + { + + err = mj.MountPropagation.MarshalJSONBuf(buf) + if err != nil { + return err + } + + } + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Volume_Source_HostPathbase = iota + ffj_t_Volume_Source_HostPathno_such_key + + ffj_t_Volume_Source_HostPath_Path + + ffj_t_Volume_Source_HostPath_MountPropagation +) + +var ffj_key_Volume_Source_HostPath_Path = []byte("path") + +var ffj_key_Volume_Source_HostPath_MountPropagation = []byte("mount_propagation") + +func (uj *Volume_Source_HostPath) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Volume_Source_HostPath) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Volume_Source_HostPathbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Volume_Source_HostPathno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'm': + + if bytes.Equal(ffj_key_Volume_Source_HostPath_MountPropagation, kn) { + currentKey = ffj_t_Volume_Source_HostPath_MountPropagation + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'p': + + if bytes.Equal(ffj_key_Volume_Source_HostPath_Path, kn) { + currentKey = ffj_t_Volume_Source_HostPath_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.AsciiEqualFold(ffj_key_Volume_Source_HostPath_MountPropagation, kn) { + currentKey = ffj_t_Volume_Source_HostPath_MountPropagation + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Source_HostPath_Path, kn) { + currentKey = ffj_t_Volume_Source_HostPath_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Volume_Source_HostPathno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Volume_Source_HostPath_Path: + goto handle_Path + + case ffj_t_Volume_Source_HostPath_MountPropagation: + goto handle_MountPropagation + + case ffj_t_Volume_Source_HostPathno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Path = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_MountPropagation: + + /* handler: uj.MountPropagation type=mesos.MountPropagation kind=struct quoted=false*/ + + { + if tok == fflib.FFTok_null { + + uj.MountPropagation = nil + + state = fflib.FFParse_after_value + goto mainparse + } + + if uj.MountPropagation == nil { + uj.MountPropagation = new(MountPropagation) + } + + err = uj.MountPropagation.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) + if err != nil { + return err + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *Volume_Source_SandboxPath) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *Volume_Source_SandboxPath) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{"type":`) + + { + + obj, err = mj.Type.MarshalJSON() + if err != nil { + return err + } + buf.Write(obj) + + } + buf.WriteString(`,"path":`) + fflib.WriteJsonString(buf, string(mj.Path)) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_Volume_Source_SandboxPathbase = iota + ffj_t_Volume_Source_SandboxPathno_such_key + + ffj_t_Volume_Source_SandboxPath_Type + + ffj_t_Volume_Source_SandboxPath_Path +) + +var ffj_key_Volume_Source_SandboxPath_Type = []byte("type") + +var ffj_key_Volume_Source_SandboxPath_Path = []byte("path") + +func (uj *Volume_Source_SandboxPath) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *Volume_Source_SandboxPath) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_Volume_Source_SandboxPathbase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_Volume_Source_SandboxPathno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'p': + + if bytes.Equal(ffj_key_Volume_Source_SandboxPath_Path, kn) { + currentKey = ffj_t_Volume_Source_SandboxPath_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + case 't': + + if bytes.Equal(ffj_key_Volume_Source_SandboxPath_Type, kn) { + currentKey = ffj_t_Volume_Source_SandboxPath_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Source_SandboxPath_Path, kn) { + currentKey = ffj_t_Volume_Source_SandboxPath_Path + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_Volume_Source_SandboxPath_Type, kn) { + currentKey = ffj_t_Volume_Source_SandboxPath_Type + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_Volume_Source_SandboxPathno_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_Volume_Source_SandboxPath_Type: + goto handle_Type + + case ffj_t_Volume_Source_SandboxPath_Path: + goto handle_Path + + case ffj_t_Volume_Source_SandboxPathno_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Type: + + /* handler: uj.Type type=mesos.Volume_Source_SandboxPath_Type kind=int32 quoted=false*/ + + { + if tok == fflib.FFTok_null { + + state = fflib.FFParse_after_value + goto mainparse + } + + tbuf, err := fs.CaptureField(tok) + if err != nil { + return fs.WrapErr(err) + } + + err = uj.Type.UnmarshalJSON(tbuf) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Path: + + /* handler: uj.Path type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + } else { + + outBuf := fs.Output.Bytes() + + uj.Path = string(string(outBuf)) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} + +func (mj *WeightInfo) MarshalJSON() ([]byte, error) { + var buf fflib.Buffer + if mj == nil { + buf.WriteString("null") + return buf.Bytes(), nil + } + err := mj.MarshalJSONBuf(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} +func (mj *WeightInfo) MarshalJSONBuf(buf fflib.EncodingBuffer) error { + if mj == nil { + buf.WriteString("null") + return nil + } + var err error + var obj []byte + _ = obj + _ = err + buf.WriteString(`{ "weight":`) + fflib.AppendFloat(buf, float64(mj.Weight), 'g', -1, 64) + buf.WriteByte(',') + if mj.Role != nil { + if true { + buf.WriteString(`"role":`) + fflib.WriteJsonString(buf, string(*mj.Role)) + buf.WriteByte(',') + } + } + buf.Rewind(1) + buf.WriteByte('}') + return nil +} + +const ( + ffj_t_WeightInfobase = iota + ffj_t_WeightInfono_such_key + + ffj_t_WeightInfo_Weight + + ffj_t_WeightInfo_Role +) + +var ffj_key_WeightInfo_Weight = []byte("weight") + +var ffj_key_WeightInfo_Role = []byte("role") + +func (uj *WeightInfo) UnmarshalJSON(input []byte) error { + fs := fflib.NewFFLexer(input) + return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) +} + +func (uj *WeightInfo) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { + var err error = nil + currentKey := ffj_t_WeightInfobase + _ = currentKey + tok := fflib.FFTok_init + wantedTok := fflib.FFTok_init + +mainparse: + for { + tok = fs.Scan() + // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) + if tok == fflib.FFTok_error { + goto tokerror + } + + switch state { + + case fflib.FFParse_map_start: + if tok != fflib.FFTok_left_bracket { + wantedTok = fflib.FFTok_left_bracket + goto wrongtokenerror + } + state = fflib.FFParse_want_key + continue + + case fflib.FFParse_after_value: + if tok == fflib.FFTok_comma { + state = fflib.FFParse_want_key + } else if tok == fflib.FFTok_right_bracket { + goto done + } else { + wantedTok = fflib.FFTok_comma + goto wrongtokenerror + } + + case fflib.FFParse_want_key: + // json {} ended. goto exit. woo. + if tok == fflib.FFTok_right_bracket { + goto done + } + if tok != fflib.FFTok_string { + wantedTok = fflib.FFTok_string + goto wrongtokenerror + } + + kn := fs.Output.Bytes() + if len(kn) <= 0 { + // "" case. hrm. + currentKey = ffj_t_WeightInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } else { + switch kn[0] { + + case 'r': + + if bytes.Equal(ffj_key_WeightInfo_Role, kn) { + currentKey = ffj_t_WeightInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + case 'w': + + if bytes.Equal(ffj_key_WeightInfo_Weight, kn) { + currentKey = ffj_t_WeightInfo_Weight + state = fflib.FFParse_want_colon + goto mainparse + } + + } + + if fflib.SimpleLetterEqualFold(ffj_key_WeightInfo_Role, kn) { + currentKey = ffj_t_WeightInfo_Role + state = fflib.FFParse_want_colon + goto mainparse + } + + if fflib.SimpleLetterEqualFold(ffj_key_WeightInfo_Weight, kn) { + currentKey = ffj_t_WeightInfo_Weight + state = fflib.FFParse_want_colon + goto mainparse + } + + currentKey = ffj_t_WeightInfono_such_key + state = fflib.FFParse_want_colon + goto mainparse + } + + case fflib.FFParse_want_colon: + if tok != fflib.FFTok_colon { + wantedTok = fflib.FFTok_colon + goto wrongtokenerror + } + state = fflib.FFParse_want_value + continue + case fflib.FFParse_want_value: + + if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { + switch currentKey { + + case ffj_t_WeightInfo_Weight: + goto handle_Weight + + case ffj_t_WeightInfo_Role: + goto handle_Role + + case ffj_t_WeightInfono_such_key: + err = fs.SkipField(tok) + if err != nil { + return fs.WrapErr(err) + } + state = fflib.FFParse_after_value + goto mainparse + } + } else { + goto wantedvalue + } + } + } + +handle_Weight: + + /* handler: uj.Weight type=float64 kind=float64 quoted=false*/ + + { + if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) + } + } + + { + + if tok == fflib.FFTok_null { + + } else { + + tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) + + if err != nil { + return fs.WrapErr(err) + } + + uj.Weight = float64(tval) + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +handle_Role: + + /* handler: uj.Role type=string kind=string quoted=false*/ + + { + + { + if tok != fflib.FFTok_string && tok != fflib.FFTok_null { + return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) + } + } + + if tok == fflib.FFTok_null { + + uj.Role = nil + + } else { + + var tval string + outBuf := fs.Output.Bytes() + + tval = string(string(outBuf)) + uj.Role = &tval + + } + } + + state = fflib.FFParse_after_value + goto mainparse + +wantedvalue: + return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) +wrongtokenerror: + return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) +tokerror: + if fs.BigError != nil { + return fs.WrapErr(fs.BigError) + } + err = fs.Error.ToError() + if err != nil { + return fs.WrapErr(err) + } + panic("ffjson-generated: unreachable, please report bug.") +done: + + return nil +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.proto b/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.proto new file mode 100644 index 00000000..7bb7f397 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/mesos.proto @@ -0,0 +1,3600 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. + +syntax = "proto2"; + +package mesos; + +import "github.com/gogo/protobuf/gogoproto/gogo.proto"; + +option go_package = "mesos"; +option (gogoproto.benchgen_all) = true; +option (gogoproto.enum_stringer_all) = true; +option (gogoproto.equal_all) = true; +option (gogoproto.goproto_enum_prefix_all) = false; +option (gogoproto.goproto_enum_stringer_all) = false; +option (gogoproto.goproto_stringer_all) = false; +option (gogoproto.goproto_unrecognized_all) = false; +option (gogoproto.gostring_all) = true; +option (gogoproto.marshaler_all) = true; +option (gogoproto.populate_all) = true; +option (gogoproto.protosizer_all) = true; +option (gogoproto.stringer_all) = true; +option (gogoproto.testgen_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.verbose_equal_all) = true; + +// NOTES: (gogogo protobuf for idiomatic Golang) +// - enum fields may be nullable if the default enum value is 0, otherwise the Golang zero-value of the enum isn't valid. +// - enums that declare UNKNOWN or other commonly used tokens should specify the goproto_enum_prefix option. +// - required fields are generally marked nullable +// - arrays of non-native types are generally marked nullable +// - fields w/ acronyms are generally renamed (via customname) to be idiomatic w/ respect to Golang +// - fields w/ glued acronyms are also renamed at the author's discretion w/ respect to legibility + +/** + * Status is used to indicate the state of the scheduler and executor + * driver after function calls. + */ +enum Status { + DRIVER_NOT_STARTED = 1; + DRIVER_RUNNING = 2; + DRIVER_ABORTED = 3; + DRIVER_STOPPED = 4; +} + + +/** + * A unique ID assigned to a framework. A framework can reuse this ID + * in order to do failover (see MesosSchedulerDriver). + */ +message FrameworkID { + required string value = 1 [(gogoproto.nullable) = false]; +} + + +/** + * A unique ID assigned to an offer. + */ +message OfferID { + required string value = 1 [(gogoproto.nullable) = false]; +} + + +/** + * A unique ID assigned to an agent. Currently, an agent gets a new ID + * whenever it (re)registers with Mesos. Framework writers shouldn't + * assume any binding between an agent ID and and a hostname. + */ +message AgentID { + required string value = 1 [(gogoproto.nullable) = false]; +} + + +/** + * A framework-generated ID to distinguish a task. The ID must remain + * unique while the task is active. A framework can reuse an ID _only_ + * if the previous task with the same ID has reached a terminal state + * (e.g., TASK_FINISHED, TASK_KILLED, etc.). However, reusing task IDs + * is strongly discouraged (MESOS-2198). + */ +message TaskID { + required string value = 1 [(gogoproto.nullable) = false]; +} + + +/** + * A framework-generated ID to distinguish an executor. Only one + * executor with the same ID can be active on the same agent at a + * time. However, reusing executor IDs is discouraged. + */ +message ExecutorID { + required string value = 1 [(gogoproto.nullable) = false]; +} + + +/** + * ID used to uniquely identify a container. If the `parent` is not + * specified, the ID is a UUID generated by the agent to uniquely + * identify the container of an executor run. If the `parent` field is + * specified, it represents a nested container. + */ +message ContainerID { + required string value = 1 [(gogoproto.nullable) = false]; + optional ContainerID parent = 2; +} + + +/** + * A unique ID assigned to a resource provider. Currently, a resource + * provider gets a new ID whenever it (re)registers with Mesos. + */ +message ResourceProviderID { + required string value = 1 [(gogoproto.nullable) = false]; +} + + +/** + * A framework-generated ID to distinguish an operation. The ID + * must be unique within the framework. + */ +message OperationID { + required string value = 1 [(gogoproto.nullable) = false]; +} + + +/** + * Represents time since the epoch, in nanoseconds. + */ +message TimeInfo { + required int64 nanoseconds = 1 [(gogoproto.nullable) = false]; +} + + +/** + * Represents duration in nanoseconds. + */ +message DurationInfo { + required int64 nanoseconds = 1 [(gogoproto.nullable) = false]; +} + + +/** + * A network address. + * + * TODO(bmahler): Use this more widely. + */ +message Address { + // May contain a hostname, IP address, or both. + optional string hostname = 1; + optional string ip = 2 [(gogoproto.customname) = "IP"]; + + required int32 port = 3 [(gogoproto.nullable) = false]; +} + + +/** + * Represents a URL. + */ +message URL { + required string scheme = 1 [(gogoproto.nullable) = false]; + required Address address = 2 [(gogoproto.nullable) = false]; + optional string path = 3; + repeated Parameter query = 4 [(gogoproto.nullable) = false]; + optional string fragment = 5; +} + + +/** + * Represents an interval, from a given start time over a given duration. + * This interval pertains to an unavailability event, such as maintenance, + * and is not a generic interval. + */ +message Unavailability { + required TimeInfo start = 1 [(gogoproto.nullable) = false]; + + // When added to `start`, this represents the end of the interval. + // If unspecified, the duration is assumed to be infinite. + optional DurationInfo duration = 2; + + // TODO(josephw): Add additional fields for expressing the purpose and + // urgency of the unavailability event. +} + + +/** + * Represents a single machine, which may hold one or more agents. + * + * NOTE: In order to match an agent to a machine, both the `hostname` and + * `ip` must match the values advertised by the agent to the master. + * Hostname is not case-sensitive. + */ +message MachineID { + optional string hostname = 1; + optional string ip = 2 [(gogoproto.customname) = "IP"]; +} + + +/** + * Holds information about a single machine, its `mode`, and any other + * relevant information which may affect the behavior of the machine. + */ +message MachineInfo { + // Describes the several states that a machine can be in. A `Mode` + // applies to a machine and to all associated agents on the machine. + enum Mode { + // In this mode, a machine is behaving normally; + // offering resources, executing tasks, etc. + UP = 1; + + // In this mode, all agents on the machine are expected to cooperate with + // frameworks to drain resources. In general, draining is done ahead of + // a pending `unavailability`. The resources should be drained so as to + // maximize utilization prior to the maintenance but without knowingly + // violating the frameworks' requirements. + DRAINING = 2; + + // In this mode, a machine is not running any tasks and will not offer + // any of its resources. Agents on the machine will not be allowed to + // register with the master. + DOWN = 3; + } + + required MachineID id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"]; + optional Mode mode = 2; + + // Signifies that the machine may be unavailable during the given interval. + // See comments in `Unavailability` and for the `unavailability` fields + // in `Offer` and `InverseOffer` for more information. + optional Unavailability unavailability = 3; +} + + +/** + * Describes a framework. + */ +message FrameworkInfo { + // Used to determine the Unix user that an executor or task should be + // launched as. + // + // When using the MesosSchedulerDriver, if the field is set to an + // empty string, it will automagically set it to the current user. + // + // When using the HTTP Scheduler API, the user has to be set + // explicitly. + required string user = 1 [(gogoproto.nullable) = false]; + + // Name of the framework that shows up in the Mesos Web UI. + required string name = 2 [(gogoproto.nullable) = false]; + + // Note that 'id' is only available after a framework has + // registered, however, it is included here in order to facilitate + // scheduler failover (i.e., if it is set then the + // MesosSchedulerDriver expects the scheduler is performing + // failover). + optional FrameworkID id = 3 [(gogoproto.customname) = "ID"]; + + // The amount of time (in seconds) that the master will wait for the + // scheduler to failover before it tears down the framework by + // killing all its tasks/executors. This should be non-zero if a + // framework expects to reconnect after a failure and not lose its + // tasks/executors. + // + // NOTE: To avoid accidental destruction of tasks, production + // frameworks typically set this to a large value (e.g., 1 week). + optional double failover_timeout = 4 [default = 0.0]; + + // If set, agents running tasks started by this framework will write + // the framework pid, executor pids and status updates to disk. If + // the agent exits (e.g., due to a crash or as part of upgrading + // Mesos), this checkpointed data allows the restarted agent to + // reconnect to executors that were started by the old instance of + // the agent. Enabling checkpointing improves fault tolerance, at + // the cost of a (usually small) increase in disk I/O. + optional bool checkpoint = 5 [default = false]; + + // Roles are the entities to which allocations are made. + // The framework must have at least one role in order to + // be offered resources. Note that `role` is deprecated + // in favor of `roles` and only one of these fields must + // be used. Since we cannot distinguish between empty + // `roles` and the default unset `role`, we require that + // frameworks set the `MULTI_ROLE` capability if + // setting the `roles` field. + optional string role = 6 [default = "*", deprecated=true]; + repeated string roles = 12; + + // Used to indicate the current host from which the scheduler is + // registered in the Mesos Web UI. If set to an empty string Mesos + // will automagically set it to the current hostname if one is + // available. + optional string hostname = 7; + + // This field should match the credential's principal the framework + // uses for authentication. This field is used for framework API + // rate limiting and dynamic reservations. It should be set even + // if authentication is not enabled if these features are desired. + optional string principal = 8; + + // This field allows a framework to advertise its web UI, so that + // the Mesos web UI can link to it. It is expected to be a full URL, + // for example http://my-scheduler.example.com:8080/. + optional string webui_url = 9 [(gogoproto.customname) = "WebUiURL"]; + + message Capability { + enum Type { + // This must be the first enum value in this list, to + // ensure that if 'type' is not set, the default value + // is UNKNOWN. This enables enum values to be added + // in a backwards-compatible way. See: MESOS-4997. + UNKNOWN = 0; + + // Receive offers with revocable resources. See 'Resource' + // message for details. + REVOCABLE_RESOURCES = 1; + + // Receive the TASK_KILLING TaskState when a task is being + // killed by an executor. The executor will examine this + // capability to determine whether it can send TASK_KILLING. + TASK_KILLING_STATE = 2; + + // Indicates whether the framework is aware of GPU resources. + // Frameworks that are aware of GPU resources are expected to + // avoid placing non-GPU workloads on GPU agents, in order + // to avoid occupying a GPU agent and preventing GPU workloads + // from running! Currently, if a framework is unaware of GPU + // resources, it will not be offered *any* of the resources on + // an agent with GPUs. This restriction is in place because we + // do not have a revocation mechanism that ensures GPU workloads + // can evict GPU agent occupants if necessary. + // + // TODO(bmahler): As we add revocation we can relax the + // restriction here. See MESOS-5634 for more information. + GPU_RESOURCES = 3; + + // Receive offers with resources that are shared. + SHARED_RESOURCES = 4; + + // Indicates that (1) the framework is prepared to handle the + // following TaskStates: TASK_UNREACHABLE, TASK_DROPPED, + // TASK_GONE, TASK_GONE_BY_OPERATOR, and TASK_UNKNOWN, and (2) + // the framework will assume responsibility for managing + // partitioned tasks that reregister with the master. + // + // Frameworks that enable this capability can define how they + // would like to handle partitioned tasks. Frameworks will + // receive TASK_UNREACHABLE for tasks on agents that are + // partitioned from the master. + // + // Without this capability, frameworks will receive TASK_LOST + // for tasks on partitioned agents. + // NOTE: Prior to Mesos 1.5, such tasks will be killed by Mesos + // when the agent reregisters (unless the master has failed over). + // However due to the lack of benefit in maintaining different + // behaviors depending on whether the master has failed over + // (see MESOS-7215), as of 1.5, Mesos will not kill these + // tasks in either case. + PARTITION_AWARE = 5; + + // This expresses the ability for the framework to be + // "multi-tenant" via using the newly introduced `roles` + // field, and examining `Offer.allocation_info` to determine + // which role the offers are being made to. We also + // expect that "single-tenant" schedulers eventually + // provide this and move away from the deprecated + // `role` field. + MULTI_ROLE = 6; + + // This capability has two effects for a framework. + // + // (1) The framework is offered resources in a new format. + // + // The offered resources have the `Resource.reservations` field set + // rather than `Resource.role` and `Resource.reservation`. In short, + // an empty `reservations` field denotes unreserved resources, and + // each `ReservationInfo` in the `reservations` field denotes a + // reservation that refines the previous one. + // + // See the 'Resource Format' section for more details. + // + // (2) The framework can create refined reservations. + // + // A framework can refine an existing reservation via the + // `Resource.reservations` field. For example, a reservation for role + // `eng` can be refined to `eng/front_end`. + // + // See `ReservationInfo.reservations` for more details. + // + // NOTE: Without this capability, a framework is not offered resources + // that have refined reservations. A resource is said to have refined + // reservations if it uses the `Resource.reservations` field, and + // `Resource.reservations_size() > 1`. + RESERVATION_REFINEMENT = 7; // EXPERIMENTAL. + + // Indicates that the framework is prepared to receive offers + // for agents whose region is different from the master's + // region. Network links between hosts in different regions + // typically have higher latency and lower bandwidth than + // network links within a region, so frameworks should be + // careful to only place suitable workloads in remote regions. + // Frameworks that are not region-aware will never receive + // offers for remote agents; region-aware frameworks are assumed + // to implement their own logic to decide which workloads (if + // any) are suitable for placement on remote agents. + REGION_AWARE = 8; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Enum fields should be optional, see: MESOS-4997. + optional Type type = 1 [(gogoproto.nullable) = false]; + } + + // This field allows a framework to advertise its set of + // capabilities (e.g., ability to receive offers for revocable + // resources). + repeated Capability capabilities = 10 [(gogoproto.nullable) = false]; + + // Labels are free-form key value pairs supplied by the framework + // scheduler (e.g., to describe additional functionality offered by + // the framework). These labels are not interpreted by Mesos itself. + // Labels should not contain duplicate key-value pairs. + optional Labels labels = 11; +} + + +/** + * Describes a general non-interpreting non-killing check for a task or + * executor (or any arbitrary process/command). A type is picked by + * specifying one of the optional fields. Specifying more than one type + * is an error. + * + * NOTE: This API is subject to change and the related feature is experimental. + */ +message CheckInfo { + enum Type { + UNKNOWN = 0; + COMMAND = 1; + HTTP = 2; + TCP = 3; + + // TODO(alexr): Consider supporting custom user checks. They should + // probably be paired with a `data` field and complemented by a + // `data` response in `CheckStatusInfo`. + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Describes a command check. If applicable, enters mount and/or network + // namespaces of the task. + message Command { + required CommandInfo command = 1 [(gogoproto.nullable) = false]; + } + + // Describes an HTTP check. Sends a GET request to + // http://:port/path. Note that is not configurable and is + // resolved automatically to 127.0.0.1. + message Http { + // Port to send the HTTP request. + required uint32 port = 1 [(gogoproto.nullable) = false]; + + // HTTP request path. + optional string path = 2; + + // TODO(alexr): Add support for HTTP method. While adding POST + // and PUT is simple, supporting payload is more involved. + + // TODO(alexr): Add support for custom HTTP headers. + + // TODO(alexr): Consider adding an optional message to describe TLS + // options and thus enabling https. Such message might contain certificate + // validation, TLS version. + } + + // Describes a TCP check, i.e. based on establishing a TCP connection to + // the specified port. Note that is not configurable and is resolved + // automatically to 127.0.0.1. + message Tcp { + required uint32 port = 1 [(gogoproto.nullable) = false]; + } + + // The type of the check. + optional Type type = 1 [(gogoproto.nullable) = false]; + + // Command check. + optional Command command = 2; + + // HTTP check. + optional Http http = 3 [(gogoproto.customname) = "HTTP"]; + + // TCP check. + optional Tcp tcp = 7 [(gogoproto.customname) = "TCP"]; + + // Amount of time to wait to start checking the task after it + // transitions to `TASK_RUNNING` or `TASK_STARTING` if the latter + // is used by the executor. + optional double delay_seconds = 4 [default = 15.0]; + + // Interval between check attempts, i.e., amount of time to wait after + // the previous check finished or timed out to start the next check. + optional double interval_seconds = 5 [default = 10.0]; + + // Amount of time to wait for the check to complete. Zero means infinite + // timeout. + // + // After this timeout, the check attempt is aborted and no result is + // reported. Note that this may be considered a state change and hence + // may trigger a check status change delivery to the corresponding + // scheduler. See `CheckStatusInfo` for more details. + optional double timeout_seconds = 6 [default = 20.0]; +} + + +/** + * Describes a health check for a task or executor (or any arbitrary + * process/command). A type is picked by specifying one of the + * optional fields. Specifying more than one type is an error. + */ +message HealthCheck { + enum Type { + UNKNOWN = 0; + COMMAND = 1; + HTTP = 2; + TCP = 3; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Describes an HTTP health check. Sends a GET request to + // scheme://:port/path. Note that is not configurable and is + // resolved automatically, in most cases to 127.0.0.1. Default executors + // treat return codes between 200 and 399 as success; custom executors + // may employ a different strategy, e.g. leveraging the `statuses` field. + message HTTPCheckInfo { + optional NetworkInfo.Protocol protocol = 5 [default = IPv4]; + + // Currently "http" and "https" are supported. + optional string scheme = 3; + + // Port to send the HTTP request. + required uint32 port = 1 [(gogoproto.nullable) = false]; + + // HTTP request path. + optional string path = 2; + + // TODO(alexr): Add support for HTTP method. While adding POST + // and PUT is simple, supporting payload is more involved. + + // TODO(alexr): Add support for custom HTTP headers. + + // TODO(alexr): Add support for success and possibly failure + // statuses. + + // NOTE: It is up to the custom executor to interpret and act on this + // field. Setting this field has no effect on the default executors. + // + // TODO(haosdent): Deprecate this field when we add better support for + // success and possibly failure statuses, e.g. ranges of success and + // failure statuses. + repeated uint32 statuses = 4; + + // TODO(haosdent): Consider adding a flag to enable task's certificate + // validation for HTTPS health checks, see MESOS-5997. + + // TODO(benh): Include an 'optional bytes data' field for checking + // for specific data in the response. + } + + // Describes a TCP health check, i.e. based on establishing + // a TCP connection to the specified port. + message TCPCheckInfo { + optional NetworkInfo.Protocol protocol = 2 [default = IPv4]; + + // Port expected to be open. + required uint32 port = 1 [(gogoproto.nullable) = false]; + } + + // TODO(benh): Consider adding a URL health check strategy which + // allows doing something similar to the HTTP strategy but + // encapsulates all the details in a single string field. + + // Amount of time to wait to start health checking the task after it + // transitions to `TASK_RUNNING` or `TASK_STATING` if the latter is + // used by the executor. + optional double delay_seconds = 2 [default = 15.0]; + + // Interval between health checks, i.e., amount of time to wait after + // the previous health check finished or timed out to start the next + // health check. + optional double interval_seconds = 3 [default = 10.0]; + + // Amount of time to wait for the health check to complete. After this + // timeout, the health check is aborted and treated as a failure. Zero + // means infinite timeout. + optional double timeout_seconds = 4 [default = 20.0]; + + // Number of consecutive failures until the task is killed by the executor. + optional uint32 consecutive_failures = 5 [default = 3]; + + // Amount of time after the task is launched during which health check + // failures are ignored. Once a check succeeds for the first time, + // the grace period does not apply anymore. Note that it includes + // `delay_seconds`, i.e., setting `grace_period_seconds` < `delay_seconds` + // has no effect. + optional double grace_period_seconds = 6 [default = 10.0]; + + // TODO(alexr): Add an optional `KillPolicy` that should be used + // if the task is killed because of a health check failure. + + // The type of health check. + optional Type type = 8 [(gogoproto.nullable) = false]; + + // Command health check. + optional CommandInfo command = 7; + + // HTTP health check. + optional HTTPCheckInfo http = 1 [(gogoproto.customname) = "HTTP"]; + + // TCP health check. + optional TCPCheckInfo tcp = 9 [(gogoproto.customname) = "TCP"]; +} + + +/** + * Describes a kill policy for a task. Currently does not express + * different policies (e.g. hitting HTTP endpoints), only controls + * how long to wait between graceful and forcible task kill: + * + * graceful kill --------------> forcible kill + * grace_period + * + * Kill policies are best-effort, because machine failures / forcible + * terminations may occur. + * + * NOTE: For executor-less command-based tasks, the kill is performed + * via sending a signal to the task process: SIGTERM for the graceful + * kill and SIGKILL for the forcible kill. For the docker executor-less + * tasks the grace period is passed to 'docker stop --time'. + */ +message KillPolicy { + // The grace period specifies how long to wait before forcibly + // killing the task. It is recommended to attempt to gracefully + // kill the task (and send TASK_KILLING) to indicate that the + // graceful kill is in progress. Once the grace period elapses, + // if the task has not terminated, a forcible kill should occur. + // The task should not assume that it will always be allotted + // the full grace period. For example, the executor may be + // shutdown more quickly by the agent, or failures / forcible + // terminations may occur. + optional DurationInfo grace_period = 1; +} + + +/** + * Describes a command, executed via: '/bin/sh -c value'. Any URIs specified + * are fetched before executing the command. If the executable field for an + * uri is set, executable file permission is set on the downloaded file. + * Otherwise, if the downloaded file has a recognized archive extension + * (currently [compressed] tar and zip) it is extracted into the executor's + * working directory. This extraction can be disabled by setting `extract` to + * false. In addition, any environment variables are set before executing + * the command (so they can be used to "parameterize" your command). + */ +message CommandInfo { + message URI { + required string value = 1 [(gogoproto.nullable) = false]; + optional bool executable = 2; + + // In case the fetched file is recognized as an archive, extract + // its contents into the sandbox. Note that a cached archive is + // not copied from the cache to the sandbox in case extraction + // originates from an archive in the cache. + optional bool extract = 3 [default = true]; + + // If this field is "true", the fetcher cache will be used. If not, + // fetching bypasses the cache and downloads directly into the + // sandbox directory, no matter whether a suitable cache file is + // available or not. The former directs the fetcher to download to + // the file cache, then copy from there to the sandbox. Subsequent + // fetch attempts with the same URI will omit downloading and copy + // from the cache as long as the file is resident there. Cache files + // may get evicted at any time, which then leads to renewed + // downloading. See also "docs/fetcher.md" and + // "docs/fetcher-cache-internals.md". + optional bool cache = 4; + + // The fetcher's default behavior is to use the URI string's basename to + // name the local copy. If this field is provided, the local copy will be + // named with its value instead. If there is a directory component (which + // must be a relative path), the local copy will be stored in that + // subdirectory inside the sandbox. + optional string output_file = 5; + } + + repeated URI uris = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "URIs"]; + + optional Environment environment = 2; + + // There are two ways to specify the command: + // 1) If 'shell == true', the command will be launched via shell + // (i.e., /bin/sh -c 'value'). The 'value' specified will be + // treated as the shell command. The 'arguments' will be ignored. + // 2) If 'shell == false', the command will be launched by passing + // arguments to an executable. The 'value' specified will be + // treated as the filename of the executable. The 'arguments' + // will be treated as the arguments to the executable. This is + // similar to how POSIX exec families launch processes (i.e., + // execlp(value, arguments(0), arguments(1), ...)). + // NOTE: The field 'value' is changed from 'required' to 'optional' + // in 0.20.0. It will only cause issues if a new framework is + // connecting to an old master. + optional bool shell = 6 [default = true]; + optional string value = 3; + repeated string arguments = 7; + + // Enables executor and tasks to run as a specific user. If the user + // field is present both in FrameworkInfo and here, the CommandInfo + // user value takes precedence. + optional string user = 5; +} + + +/** + * Describes information about an executor. + */ +message ExecutorInfo { + enum Type { + UNKNOWN = 0; + + // Mesos provides a simple built-in default executor that frameworks can + // leverage to run shell commands and containers. + // + // NOTES: + // + // 1) `command` must not be set when using a default executor. + // + // 2) Default executor only accepts a *single* `LAUNCH` or `LAUNCH_GROUP` + // operation. + // + // 3) If `container` is set, `container.type` must be `MESOS` + // and `container.mesos.image` must not be set. + DEFAULT = 1; + + // For frameworks that need custom functionality to run tasks, a `CUSTOM` + // executor can be used. Note that `command` must be set when using a + // `CUSTOM` executor. + CUSTOM = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // For backwards compatibility, if this field is not set when using `LAUNCH` + // operation, Mesos will infer the type by checking if `command` is set + // (`CUSTOM`) or unset (`DEFAULT`). `type` must be set when using + // `LAUNCH_GROUP` operation. + // + // TODO(vinod): Add support for explicitly setting `type` to `DEFAULT` in + // `LAUNCH` operation. + optional Type type = 15 [(gogoproto.nullable) = false]; + + required ExecutorID executor_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ExecutorID"]; + optional FrameworkID framework_id = 8 [(gogoproto.customname) = "FrameworkID"]; // TODO(benh): Make this required. + optional CommandInfo command = 7; + + // Executor provided with a container will launch the container + // with the executor's CommandInfo and we expect the container to + // act as a Mesos executor. + optional ContainerInfo container = 11; + + repeated Resource resources = 5 [(gogoproto.nullable) = false]; + optional string name = 9; + + // 'source' is an identifier style string used by frameworks to + // track the source of an executor. This is useful when it's + // possible for different executor ids to be related semantically. + // + // NOTE: 'source' is exposed alongside the resource usage of the + // executor via JSON on the agent. This allows users to import usage + // information into a time series database for monitoring. + // + // This field is deprecated since 1.0. Please use labels for + // free-form metadata instead. + optional string source = 10 [deprecated = true]; // Since 1.0. + + // This field can be used to pass arbitrary bytes to an executor. + optional bytes data = 4; + + // Service discovery information for the executor. It is not + // interpreted or acted upon by Mesos. It is up to a service + // discovery system to use this information as needed and to handle + // executors without service discovery information. + optional DiscoveryInfo discovery = 12; + + // When shutting down an executor the agent will wait in a + // best-effort manner for the grace period specified here + // before forcibly destroying the container. The executor + // must not assume that it will always be allotted the full + // grace period, as the agent may decide to allot a shorter + // period and failures / forcible terminations may occur. + optional DurationInfo shutdown_grace_period = 13; + + // Labels are free-form key value pairs which are exposed through + // master and agent endpoints. Labels will not be interpreted or + // acted upon by Mesos itself. As opposed to the data field, labels + // will be kept in memory on master and agent processes. Therefore, + // labels should be used to tag executors with lightweight metadata. + // Labels should not contain duplicate key-value pairs. + optional Labels labels = 14; +} + + +/** + * Describes a domain. A domain is a collection of hosts that have + * similar characteristics. Mesos currently only supports "fault + * domains", which identify groups of hosts with similar failure + * characteristics. + * + * Frameworks can generally assume that network links between hosts in + * the same fault domain have lower latency, higher bandwidth, and better + * availability than network links between hosts in different domains. + * Schedulers may prefer to place network-intensive workloads in the + * same domain, as this may improve performance. Conversely, a single + * failure that affects a host in a domain may be more likely to + * affect other hosts in the same domain; hence, schedulers may prefer + * to place workloads that require high availability in multiple + * domains. (For example, all the hosts in a single rack might lose + * power or network connectivity simultaneously.) + * + * There are two kinds of fault domains: regions and zones. Regions + * offer the highest degree of fault isolation, but network latency + * between regions is typically high (typically >50 ms). Zones offer a + * modest degree of fault isolation along with reasonably low network + * latency (typically <10 ms). + * + * The mapping from fault domains to physical infrastructure is up to + * the operator to configure. In cloud environments, regions and zones + * can be mapped to the "region" and "availability zone" concepts + * exposed by most cloud providers, respectively. In on-premise + * deployments, regions and zones can be mapped to data centers and + * racks, respectively. + * + * Both masters and agents can be configured with domains. Frameworks + * can compare the domains of two hosts to determine if the hosts are + * in the same zone, in different zones in the same region, or in + * different regions. Note that all masters in a given Mesos cluster + * must be in the same region. + */ +message DomainInfo { + message FaultDomain { + message RegionInfo { + required string name = 1 [(gogoproto.nullable) = false]; + } + + message ZoneInfo { + required string name = 1 [(gogoproto.nullable) = false]; + } + + required RegionInfo region = 1 [(gogoproto.nullable) = false]; + required ZoneInfo zone = 2 [(gogoproto.nullable) = false]; + } + + optional FaultDomain fault_domain = 1; +} + + +/** + * Describes a master. This will probably have more fields in the + * future which might be used, for example, to link a framework webui + * to a master webui. + */ +message MasterInfo { + required string id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"]; + + // The IP address (only IPv4) as a packed 4-bytes integer, + // stored in network order. Deprecated, use `address.ip` instead. + required uint32 ip = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "IP"]; + + // The TCP port the Master is listening on for incoming + // HTTP requests; deprecated, use `address.port` instead. + required uint32 port = 3 [default = 5050]; + + // In the default implementation, this will contain information + // about both the IP address, port and Master name; it should really + // not be relied upon by external tooling/frameworks and be + // considered an "internal" implementation field. + optional string pid = 4 [(gogoproto.customname) = "PID"]; + + // The server's hostname, if available; it may be unreliable + // in environments where the DNS configuration does not resolve + // internal hostnames (eg, some public cloud providers). + // Deprecated, use `address.hostname` instead. + optional string hostname = 5; + + // The running Master version, as a string; taken from the + // generated "master/version.hpp". + optional string version = 6; + + // The full IP address (supports both IPv4 and IPv6 formats) + // and supersedes the use of `ip`, `port` and `hostname`. + // Since Mesos 0.24. + optional Address address = 7; + + // The domain that this master belongs to. All masters in a Mesos + // cluster should belong to the same region. + optional DomainInfo domain = 8; + + message Capability { + enum Type { + UNKNOWN = 0; + + // The master can handle slaves whose state + // changes after reregistering. + AGENT_UPDATE = 1; + + option (gogoproto.goproto_enum_prefix) = true; + } + optional Type type = 1 [(gogoproto.nullable) = false]; + } + + repeated Capability capabilities = 9 [(gogoproto.nullable) = false]; +} + + +/** + * Describes an agent. Note that the 'id' field is only available + * after an agent is registered with the master, and is made available + * here to facilitate re-registration. + */ +message AgentInfo { + required string hostname = 1 [(gogoproto.nullable) = false]; + optional int32 port = 8 [default = 5051]; + + // The configured resources at the agent. This does not include any + // dynamic reservations or persistent volumes that may currently + // exist at the agent. + repeated Resource resources = 3 [(gogoproto.nullable) = false]; + + repeated Attribute attributes = 5 [(gogoproto.nullable) = false]; + optional AgentID id = 6 [(gogoproto.customname) = "ID"]; + + // The domain that this agent belongs to. If the agent's region + // differs from the master's region, it will not appear in resource + // offers to frameworks that have not enabled the REGION_AWARE + // capability. + optional DomainInfo domain = 10; + + message Capability { + enum Type { + // This must be the first enum value in this list, to + // ensure that if 'type' is not set, the default value + // is UNKNOWN. This enables enum values to be added + // in a backwards-compatible way. See: MESOS-4997. + UNKNOWN = 0; + + // This expresses the ability for the agent to be able + // to launch tasks of a 'multi-role' framework. + MULTI_ROLE = 1; + + // This expresses the ability for the agent to be able to launch + // tasks, reserve resources, and create volumes using resources + // allocated to a 'hierarchical-role'. + // NOTE: This capability is required specifically for creating + // volumes because a hierchical role includes '/' (slashes) in them. + // Agents with this capability know to transform the '/' (slashes) + // into ' ' (spaces). + HIERARCHICAL_ROLE = 2; + + // This capability has three effects for an agent. + // + // (1) The format of the checkpointed resources, and + // the resources reported to master. + // + // These resources are reported in the "pre-reservation-refinement" + // format if none of the resources have refined reservations. If any + // of the resources have refined reservations, they are reported in + // the "post-reservation-refinement" format. The purpose is to allow + // downgrading of an agent as well as communication with a pre-1.4.0 + // master until the reservation refinement feature is actually used. + // + // See the 'Resource Format' section for more details. + // + // (2) The format of the resources reported by the HTTP endpoints. + // + // For resources reported by agent endpoints, the + // "pre-reservation-refinement" format is "injected" if possible. + // That is, resources without refined reservations will have the + // `Resource.role` and `Resource.reservation` set, whereas + // resources with refined reservations will not. + // + // See the 'Resource Format' section for more details. + // + // (3) The ability for the agent to launch tasks, reserve resources, and + // create volumes using resources that have refined reservations. + // + // See `ReservationInfo.reservations` section for more details. + // + // NOTE: Resources are said to have refined reservations if it uses the + // `Resource.reservations` field, and `Resource.reservations_size() > 1`. + RESERVATION_REFINEMENT = 3; + + // This expresses the ability for the agent to handle resource + // provider related operations. This includes the following: + // + // (1) The ability to report resources that are provided by some + // local resource providers through the resource provider API. + // + // (2) The ability to provide operation feedback. + RESOURCE_PROVIDER = 4; + + // This expresses the capability for the agent to handle persistent volume + // resize operations safely. This capability is turned on by default. + RESIZE_VOLUME = 5; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Enum fields should be optional, see: MESOS-4997. + optional Type type = 1 [(gogoproto.nullable) = false]; + } +} + + +/** + * Describes the container configuration to run a CSI plugin component. + */ +message CSIPluginContainerInfo { + enum Service { + UNKNOWN = 0; + CONTROLLER_SERVICE = 1; + NODE_SERVICE = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + repeated Service services = 1; + optional CommandInfo command = 2; + repeated Resource resources = 3 [(gogoproto.nullable) = false]; + optional ContainerInfo container = 4; +} + + +/** + * Describes a CSI plugin. + */ +message CSIPluginInfo { + // The type of the CSI service. This uniquely identifies a CSI + // implementation. For instance: + // org.apache.mesos.csi.test + // + // Please follow to Java package naming convention + // (https://en.wikipedia.org/wiki/Java_package#Package_naming_conventions) + // to avoid conflicts on type names. + required string type = 1 [(gogoproto.nullable) = false]; + + // The name of the CSI service. There could be mutliple instances of a + // type of CSI service. The name field is used to distinguish these + // instances. It should be a legal Java identifier + // (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) + // to avoid conflicts on concatenation of type and name. + required string name = 2 [(gogoproto.nullable) = false]; + + // A list of container configurations to run CSI plugin components. + // The controller service will be served by the first configuration + // that contains `CONTROLLER_SERVICE`, and the node service will be + // served by the first configuration that contains `NODE_SERVICE`. + repeated CSIPluginContainerInfo containers = 3 [(gogoproto.nullable) = false]; +} + + +/** + * Describes a resource provider. Note that the 'id' field is only available + * after a resource provider is registered with the master, and is made + * available here to facilitate re-registration. + */ +message ResourceProviderInfo { + optional ResourceProviderID id = 1 [(gogoproto.customname) = "ID"]; + repeated Attribute attributes = 2 [(gogoproto.nullable) = false]; + + // The type of the resource provider. This uniquely identifies a + // resource provider implementation. For instance: + // org.apache.mesos.rp.local.storage + // + // Please follow to Java package naming convention + // (https://en.wikipedia.org/wiki/Java_package#Package_naming_conventions) + // to avoid conflicts on type names. + required string type = 3 [(gogoproto.nullable) = false]; + + // The name of the resource provider. There could be multiple + // instances of a type of resource provider. The name field is used + // to distinguish these instances. It should be a legal Java identifier + // (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) + // to avoid conflicts on concatenation of type and name. + required string name = 4 [(gogoproto.nullable) = false]; + + // The stack of default reservations. If this field is not empty, it + // indicates that resources from this resource provider are reserved + // by default, except for the resources that have been reserved or + // unreserved through operations. The first `ReservationInfo` + // may have type `STATIC` or `DYNAMIC`, but the rest must have + // `DYNAMIC`. One can create a new reservation on top of an existing + // one by pushing a new `ReservationInfo` to the back. The last + // `ReservationInfo` in this stack is the "current" reservation. The + // new reservation's role must be a child of the current one. + repeated Resource.ReservationInfo default_reservations = 5 [(gogoproto.nullable) = false]; // EXPERIMENTAL. + + // Storage resource provider related information. + message Storage { + required CSIPluginInfo plugin = 1 [(gogoproto.nullable) = false]; + } + + optional Storage storage = 6; // EXPERIMENTAL. +} + + +/** + * Describes an Attribute or Resource "value". A value is described + * using the standard protocol buffer "union" trick. + */ +message Value { + enum Type { + SCALAR = 0; + RANGES = 1; + SET = 2; + TEXT = 3; + } + + message Scalar { + // Scalar values are represented using floating point. To reduce + // the chance of unpredictable floating point behavior due to + // roundoff error, Mesos only supports three decimal digits of + // precision for scalar resource values. That is, floating point + // values are converted to a fixed point format that supports + // three decimal digits of precision, and then converted back to + // floating point on output. Any additional precision in scalar + // resource values is discarded (via rounding). + required double value = 1 [(gogoproto.nullable) = false]; + } + + message Range { + required uint64 begin = 1 [(gogoproto.nullable) = false]; + required uint64 end = 2 [(gogoproto.nullable) = false]; + } + + message Ranges { + repeated Range range = 1 [(gogoproto.nullable) = false]; + } + + message Set { + repeated string item = 1; + } + + message Text { + required string value = 1 [(gogoproto.nullable) = false]; + } + + required Type type = 1 [(gogoproto.nullable) = false]; + optional Scalar scalar = 2; + optional Ranges ranges = 3; + optional Set set = 4; + optional Text text = 5; +} + + +/** + * Describes an attribute that can be set on a machine. For now, + * attributes and resources share the same "value" type, but this may + * change in the future and attributes may only be string based. + */ +message Attribute { + required string name = 1 [(gogoproto.nullable) = false]; + required Value.Type type = 2 [(gogoproto.nullable) = false]; + optional Value.Scalar scalar = 3; + optional Value.Ranges ranges = 4; + optional Value.Set set = 6; + optional Value.Text text = 5; +} + + +/** + * Describes a resource from a resource provider. The `name` field is + * a string like "cpus" or "mem" that indicates which kind of resource + * this is; the rest of the fields describe the properties of the + * resource. A resource can take on one of three types: scalar + * (double), a list of finite and discrete ranges (e.g., [1-10, + * 20-30]), or a set of items. A resource is described using the + * standard protocol buffer "union" trick. + * + * Note that "disk" and "mem" resources are scalar values expressed in + * megabytes. Fractional "cpus" values are allowed (e.g., "0.5"), + * which correspond to partial shares of a CPU. + */ +message Resource { + optional ResourceProviderID provider_id = 12 [(gogoproto.customname) = "ProviderID"]; + + required string name = 1 [(gogoproto.nullable) = false]; + required Value.Type type = 2; + optional Value.Scalar scalar = 3; + optional Value.Ranges ranges = 4; + optional Value.Set set = 5; + + // The role that this resource is reserved for. If "*", this indicates + // that the resource is unreserved. Otherwise, the resource will only + // be offered to frameworks that belong to this role. + // + // NOTE: Frameworks must not set this field if `reservations` is set. + // See the 'Resource Format' section for more details. + // + // TODO(mpark): Deprecate once `reservations` is no longer experimental. + optional string role = 6 [default = "*", deprecated=true]; + + // This was initially introduced to support MULTI_ROLE capable + // frameworks. Frameworks that are not MULTI_ROLE capable can + // continue to assume that the offered resources are allocated + // to their role. + message AllocationInfo { + // If set, this resource is allocated to a role. Note that in the + // future, this may be unset and the scheduler may be responsible + // for allocating to one of its roles. + optional string role = 1; + + // In the future, we may add additional fields here, e.g. priority + // tier, type of allocation (quota / fair share). + } + + optional AllocationInfo allocation_info = 11; + + // Resource Format: + // + // Frameworks receive resource offers in one of two formats, depending on + // whether the RESERVATION_REFINEMENT capability is enabled. + // + // __WITHOUT__ the RESERVATION_REFINEMENT capability, the framework is offered + // resources in the "pre-reservation-refinement" format. In this format, the + // `Resource.role` and `Resource.reservation` fields are used in conjunction + // to describe the reservation state of a `Resource` message. + // + // The following is an overview of the possible reservation states: + // + // +------------+------------------------------------------------------------+ + // | unreserved | { | + // | | role: "*", | + // | | reservation: , | + // | | reservations: | + // | | } | + // +------------+------------------------------------------------------------+ + // | static | { | + // | | role: "eng", | + // | | reservation: , | + // | | reservations: | + // | | } | + // +------------+------------------------------------------------------------+ + // | dynamic | { | + // | | role: "eng", | + // | | reservation: { | + // | | type: , | + // | | role: , | + // | | principal: , | + // | | labels: | + // | | }, | + // | | reservations: | + // | | } | + // +------------+------------------------------------------------------------+ + // + // __WITH__ the RESERVATION_REFINEMENT capability, the framework is offered + // resources in the "post-reservation-refinement" format. In this format, the + // reservation state of a `Resource` message is expressed solely in + // `Resource.reservations` field. + // + // The following is an overview of the possible reservation states: + // + // +------------+------------------------------------------------------------+ + // | unreserved | { | + // | | role: , | + // | | reservation: , | + // | | reservations: [] | + // | | } | + // +------------+------------------------------------------------------------+ + // | static | { | + // | | role: , | + // | | reservation: , | + // | | reservations: [ | + // | | { | + // | | type: STATIC, | + // | | role: "eng", | + // | | principal: , | + // | | labels: | + // | | } | + // | | ] | + // | | } | + // +------------+------------------------------------------------------------+ + // | dynamic | { | + // | | role: , | + // | | reservation: , | + // | | reservations: [ | + // | | { | + // | | type: DYNAMIC, | + // | | role: "eng", | + // | | principal: , | + // | | labels: | + // | | } | + // | | ] | + // | | } | + // +------------+------------------------------------------------------------+ + // + // We can also __refine__ reservations with this capability like so: + // + // +------------+------------------------------------------------------------+ + // | refined | { | + // | | role: , | + // | | reservation: , | + // | | reservations: [ | + // | | { | + // | | type: STATIC or DYNAMIC, | + // | | role: "eng", | + // | | principal: , | + // | | labels: | + // | | }, | + // | | { | + // | | type: DYNAMIC, | + // | | role: "eng/front_end", | + // | | principal: , | + // | | labels: | + // | | } | + // | | ] | + // | | } | + // +------------+------------------------------------------------------------+ + // + // NOTE: Each `ReservationInfo` in the `reservations` field denotes + // a reservation that refines the previous `ReservationInfo`. + + message ReservationInfo { + // Describes a reservation. A static reservation is set by the operator on + // the command-line and they are immutable without agent restart. A dynamic + // reservation is made by an operator via the '/reserve' HTTP endpoint + // or by a framework via the offer cycle by sending back an + // 'Offer::Operation::Reserve' message. + // + // NOTE: We currently do not allow frameworks with role "*" to make dynamic + // reservations. + + enum Type { + UNKNOWN = 0; + STATIC = 1; + DYNAMIC = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // The type of this reservation. + // + // NOTE: This field must not be set for `Resource.reservation`. + // See the 'Resource Format' section for more details. + optional Type type = 4; + + // The role to which this reservation is made for. + // + // NOTE: This field must not be set for `Resource.reservation`. + // See the 'Resource Format' section for more details. + optional string role = 3; + + // Indicates the principal, if any, of the framework or operator + // that reserved this resource. If reserved by a framework, the + // field should match the `FrameworkInfo.principal`. It is used in + // conjunction with the `UnreserveResources` ACL to determine + // whether the entity attempting to unreserve this resource is + // permitted to do so. + optional string principal = 1; + + // Labels are free-form key value pairs that can be used to + // associate arbitrary metadata with a reserved resource. For + // example, frameworks can use labels to identify the intended + // purpose for a portion of the resources the framework has + // reserved at a given agent. Labels should not contain duplicate + // key-value pairs. + optional Labels labels = 2; + } + + // If this is set, this resource was dynamically reserved by an + // operator or a framework. Otherwise, this resource is either unreserved + // or statically reserved by an operator via the --resources flag. + // + // NOTE: Frameworks must not set this field if `reservations` is set. + // See the 'Resource Format' section for more details. + // + // TODO(mpark): Deprecate once `reservations` is no longer experimental. + optional ReservationInfo reservation = 8; + + // The stack of reservations. If this field is empty, it indicates that this + // resource is unreserved. Otherwise, the resource is reserved. The first + // `ReservationInfo` may have type `STATIC` or `DYNAMIC`, but the rest must + // have `DYNAMIC`. One can create a new reservation on top of an existing + // one by pushing a new `ReservationInfo` to the back. The last + // `ReservationInfo` in this stack is the "current" reservation. The new + // reservation's role must be a child of the current reservation's role. + // + // NOTE: Frameworks must not set this field if `reservation` is set. + // See the 'Resource Format' section for more details. + // + // TODO(mpark): Deprecate `role` and `reservation` once this is stable. + repeated ReservationInfo reservations = 13 [(gogoproto.nullable) = false]; // EXPERIMENTAL. + + message DiskInfo { + // Describes a persistent disk volume. + // + // A persistent disk volume will not be automatically garbage + // collected if the task/executor/agent terminates, but will be + // re-offered to the framework(s) belonging to the 'role'. + // + // NOTE: Currently, we do not allow persistent disk volumes + // without a reservation (i.e., 'role' cannot be '*'). + message Persistence { + // A unique ID for the persistent disk volume. This ID must be + // unique per role on each agent. Although it is possible to use + // the same ID on different agents in the cluster and to reuse + // IDs after a volume with that ID has been destroyed, both + // practices are discouraged. + required string id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"]; + + // This field indicates the principal of the operator or + // framework that created this volume. It is used in conjunction + // with the "destroy" ACL to determine whether an entity + // attempting to destroy the volume is permitted to do so. + // + // NOTE: This field should match the FrameworkInfo.principal of + // the framework that created the volume. + optional string principal = 2; + } + + optional Persistence persistence = 1; + + // Describes how this disk resource will be mounted in the + // container. If not set, the disk resource will be used as the + // sandbox. Otherwise, it will be mounted according to the + // 'container_path' inside 'volume'. The 'host_path' inside + // 'volume' is ignored. + // NOTE: If 'volume' is set but 'persistence' is not set, the + // volume will be automatically garbage collected after + // task/executor terminates. Currently, if 'persistence' is set, + // 'volume' must be set. + optional Volume volume = 2; + + // Describes where a disk originates from. + message Source { + enum Type { + UNKNOWN = 0; + PATH = 1; + MOUNT = 2; + BLOCK = 3; + RAW = 4; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // A folder that can be located on a separate disk device. This + // can be shared and carved up as necessary between frameworks. + message Path { + // Path to the folder (e.g., /mnt/raid/disk0). If the path is a + // relative path, it is relative to the agent work directory. + optional string root = 1; + } + + // A mounted file-system set up by the Agent administrator. This + // can only be used exclusively: a framework cannot accept a + // partial amount of this disk. + message Mount { + // Path to mount point (e.g., /mnt/raid/disk0). If the path is a + // relative path, it is relative to the agent work directory. + optional string root = 1; + } + + required Type type = 1 [(gogoproto.nullable) = false]; + optional Path path = 2; + optional Mount mount = 3; + + // An identifier for this source. This field maps onto CSI + // volume IDs and is not expected to be set by frameworks. + optional string id = 4 [(gogoproto.customname) = "ID"]; // EXPERIMENTAL. + + // Additional metadata for this source. This field maps onto CSI + // volume metadata and is not expected to be set by frameworks. + optional Labels metadata = 5; // EXPERIMENTAL. + + // This field serves as an indirection to a set of storage + // vendor specific disk parameters which describe the properties + // of the disk. The operator will setup mappings between a + // profile name to a set of vendor specific disk parameters. And + // the framework will do disk selection based on profile names, + // instead of vendor specific disk parameters. + // + // Also see the DiskProfileAdaptor module. + optional string profile = 6; // EXPERIMENTAL. + } + + optional Source source = 3; + } + + optional DiskInfo disk = 7; + + message RevocableInfo {} + + // If this is set, the resources are revocable, i.e., any tasks or + // executors launched using these resources could get preempted or + // throttled at any time. This could be used by frameworks to run + // best effort tasks that do not need strict uptime or performance + // guarantees. Note that if this is set, 'disk' or 'reservation' + // cannot be set. + optional RevocableInfo revocable = 9; + + // Allow the resource to be shared across tasks. + message SharedInfo {} + + // If this is set, the resources are shared, i.e. multiple tasks + // can be launched using this resource and all of them shall refer + // to the same physical resource on the cluster. Note that only + // persistent volumes can be shared currently. + optional SharedInfo shared = 10; +} + + +/** + * When the network bandwidth caps are enabled and the container + * is over its limit, outbound packets may be either delayed or + * dropped completely either because it exceeds the maximum bandwidth + * allocation for a single container (the cap) or because the combined + * network traffic of multiple containers on the host exceeds the + * transmit capacity of the host (the share). We can report the + * following statistics for each of these conditions exported directly + * from the Linux Traffic Control Queueing Discipline. + * + * id : name of the limiter, e.g. 'tx_bw_cap' + * backlog : number of packets currently delayed + * bytes : total bytes seen + * drops : number of packets dropped in total + * overlimits : number of packets which exceeded allocation + * packets : total packets seen + * qlen : number of packets currently queued + * rate_bps : throughput in bytes/sec + * rate_pps : throughput in packets/sec + * requeues : number of times a packet has been delayed due to + * locking or device contention issues + * + * More information on the operation of Linux Traffic Control can be + * found at http://www.lartc.org/lartc.html. + */ +message TrafficControlStatistics { + required string id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"]; + optional uint64 backlog = 2; + optional uint64 bytes = 3; + optional uint64 drops = 4; + optional uint64 overlimits = 5; + optional uint64 packets = 6; + optional uint64 qlen = 7; + optional uint64 ratebps = 8 [(gogoproto.customname) = "RateBPS"]; + optional uint64 ratepps = 9 [(gogoproto.customname) = "RatePPS"]; + optional uint64 requeues = 10; +} + + +message IpStatistics { + optional int64 Forwarding = 1; + optional int64 DefaultTTL = 2; + optional int64 InReceives = 3; + optional int64 InHdrErrors = 4; + optional int64 InAddrErrors = 5; + optional int64 ForwDatagrams = 6; + optional int64 InUnknownProtos = 7; + optional int64 InDiscards = 8; + optional int64 InDelivers = 9; + optional int64 OutRequests = 10; + optional int64 OutDiscards = 11; + optional int64 OutNoRoutes = 12; + optional int64 ReasmTimeout = 13; + optional int64 ReasmReqds = 14; + optional int64 ReasmOKs = 15; + optional int64 ReasmFails = 16; + optional int64 FragOKs = 17; + optional int64 FragFails = 18; + optional int64 FragCreates = 19; +} + + +message IcmpStatistics { + optional int64 InMsgs = 1; + optional int64 InErrors = 2; + optional int64 InCsumErrors = 3; + optional int64 InDestUnreachs = 4; + optional int64 InTimeExcds = 5; + optional int64 InParmProbs = 6; + optional int64 InSrcQuenchs = 7; + optional int64 InRedirects = 8; + optional int64 InEchos = 9; + optional int64 InEchoReps = 10; + optional int64 InTimestamps = 11; + optional int64 InTimestampReps = 12; + optional int64 InAddrMasks = 13; + optional int64 InAddrMaskReps = 14; + optional int64 OutMsgs = 15; + optional int64 OutErrors = 16; + optional int64 OutDestUnreachs = 17; + optional int64 OutTimeExcds = 18; + optional int64 OutParmProbs = 19; + optional int64 OutSrcQuenchs = 20; + optional int64 OutRedirects = 21; + optional int64 OutEchos = 22; + optional int64 OutEchoReps = 23; + optional int64 OutTimestamps = 24; + optional int64 OutTimestampReps = 25; + optional int64 OutAddrMasks = 26; + optional int64 OutAddrMaskReps = 27; +} + + +message TcpStatistics { + optional int64 RtoAlgorithm = 1; + optional int64 RtoMin = 2; + optional int64 RtoMax = 3; + optional int64 MaxConn = 4; + optional int64 ActiveOpens = 5; + optional int64 PassiveOpens = 6; + optional int64 AttemptFails = 7; + optional int64 EstabResets = 8; + optional int64 CurrEstab = 9; + optional int64 InSegs = 10; + optional int64 OutSegs = 11; + optional int64 RetransSegs = 12; + optional int64 InErrs = 13; + optional int64 OutRsts = 14; + optional int64 InCsumErrors = 15; +} + + +message UdpStatistics { + optional int64 InDatagrams = 1; + optional int64 NoPorts = 2; + optional int64 InErrors = 3; + optional int64 OutDatagrams = 4; + optional int64 RcvbufErrors = 5; + optional int64 SndbufErrors = 6; + optional int64 InCsumErrors = 7; + optional int64 IgnoredMulti = 8; +} + + +message SNMPStatistics { + optional IpStatistics ip_stats = 1 [(gogoproto.customname) = "IPStats"]; + optional IcmpStatistics icmp_stats = 2 [(gogoproto.customname) = "ICMPStats"]; + optional TcpStatistics tcp_stats = 3 [(gogoproto.customname) = "TCPStats"]; + optional UdpStatistics udp_stats = 4 [(gogoproto.customname) = "UDPStats"]; +} + + +message DiskStatistics { + optional Resource.DiskInfo.Source source = 1; + optional Resource.DiskInfo.Persistence persistence = 2; + optional uint64 limit_bytes = 3; + optional uint64 used_bytes = 4; +} + + +/** + * A snapshot of resource usage statistics. + */ +message ResourceStatistics { + required double timestamp = 1 [(gogoproto.nullable) = false]; // Snapshot time, in seconds since the Epoch. + + optional uint32 processes = 30; + optional uint32 threads = 31; + + // CPU Usage Information: + // Total CPU time spent in user mode, and kernel mode. + optional double cpus_user_time_secs = 2 [(gogoproto.customname) = "CPUsUserTimeSecs"]; + optional double cpus_system_time_secs = 3 [(gogoproto.customname) = "CPUsSystemTimeSecs"]; + + // Number of CPUs allocated. + optional double cpus_limit = 4 [(gogoproto.customname) = "CPUsLimit"]; + + // cpu.stat on process throttling (for contention issues). + optional uint32 cpus_nr_periods = 7 [(gogoproto.customname) = "CPUsNrPeriods"]; + optional uint32 cpus_nr_throttled = 8 [(gogoproto.customname) = "CPUsNrThrottled"]; + optional double cpus_throttled_time_secs = 9 [(gogoproto.customname) = "CPUsThrottledTimeSecs"]; + + // Memory Usage Information: + + // mem_total_bytes was added in 0.23.0 to represent the total memory + // of a process in RAM (as opposed to in Swap). This was previously + // reported as mem_rss_bytes, which was also changed in 0.23.0 to + // represent only the anonymous memory usage, to keep in sync with + // Linux kernel's (arguably erroneous) use of terminology. + optional uint64 mem_total_bytes = 36; + + // Total memory + swap usage. This is set if swap is enabled. + optional uint64 mem_total_memsw_bytes = 37; + + // Hard memory limit for a container. + optional uint64 mem_limit_bytes = 6; + + // Soft memory limit for a container. + optional uint64 mem_soft_limit_bytes = 38; + + // Broken out memory usage information: pagecache, rss (anonymous), + // mmaped files and swap. + + // TODO(chzhcn) mem_file_bytes and mem_anon_bytes are deprecated in + // 0.23.0 and will be removed in 0.24.0. + optional uint64 mem_file_bytes = 10; + optional uint64 mem_anon_bytes = 11; + + // mem_cache_bytes is added in 0.23.0 to represent page cache usage. + optional uint64 mem_cache_bytes = 39; + + // Since 0.23.0, mem_rss_bytes is changed to represent only + // anonymous memory usage. Note that neither its requiredness, type, + // name nor numeric tag has been changed. + optional uint64 mem_rss_bytes = 5 [(gogoproto.customname) = "MemRSSBytes"]; + + optional uint64 mem_mapped_file_bytes = 12; + // This is only set if swap is enabled. + optional uint64 mem_swap_bytes = 40; + optional uint64 mem_unevictable_bytes = 41; + + // Number of occurrences of different levels of memory pressure + // events reported by memory cgroup. Pressure listening (re)starts + // with these values set to 0 when agent (re)starts. See + // https://www.kernel.org/doc/Documentation/cgroups/memory.txt for + // more details. + optional uint64 mem_low_pressure_counter = 32; + optional uint64 mem_medium_pressure_counter = 33; + optional uint64 mem_critical_pressure_counter = 34; + + // Disk Usage Information for executor working directory. + optional uint64 disk_limit_bytes = 26; + optional uint64 disk_used_bytes = 27; + + // Per disk (resource) statistics. + repeated DiskStatistics disk_statistics = 43 [(gogoproto.nullable) = false]; + + // Cgroups blkio statistics. + optional CgroupInfo.Blkio.Statistics blkio_statistics = 44; + + // Perf statistics. + optional PerfStatistics perf = 13; + + // Network Usage Information: + optional uint64 net_rx_packets = 14; + optional uint64 net_rx_bytes = 15; + optional uint64 net_rx_errors = 16; + optional uint64 net_rx_dropped = 17; + optional uint64 net_tx_packets = 18; + optional uint64 net_tx_bytes = 19; + optional uint64 net_tx_errors = 20; + optional uint64 net_tx_dropped = 21; + + // The kernel keeps track of RTT (round-trip time) for its TCP + // sockets. RTT is a way to tell the latency of a container. + optional double net_tcp_rtt_microsecs_p50 = 22 [(gogoproto.customname) = "NetTCPRttMicrosecsP50"]; + optional double net_tcp_rtt_microsecs_p90 = 23 [(gogoproto.customname) = "NetTCPRttMicrosecsP90"]; + optional double net_tcp_rtt_microsecs_p95 = 24 [(gogoproto.customname) = "NetTCPRttMicrosecsP95"]; + optional double net_tcp_rtt_microsecs_p99 = 25 [(gogoproto.customname) = "NetTCPRttMicrosecsP99"]; + + optional double net_tcp_active_connections = 28 [(gogoproto.customname) = "NetTCPActiveConnections"]; + optional double net_tcp_time_wait_connections = 29 [(gogoproto.customname) = "NetTCPTimeWaitConnections"]; + + // Network traffic flowing into or out of a container can be delayed + // or dropped due to congestion or policy inside and outside the + // container. + repeated TrafficControlStatistics net_traffic_control_statistics = 35 [(gogoproto.nullable) = false]; + + // Network SNMP statistics for each container. + optional SNMPStatistics net_snmp_statistics = 42 [(gogoproto.customname) = "NetSNMPStatistics"]; +} + + +/** + * Describes a snapshot of the resource usage for executors. + */ +message ResourceUsage { + message Executor { + required ExecutorInfo executor_info = 1 [(gogoproto.nullable) = false]; + + // This includes resources used by the executor itself + // as well as its active tasks. + repeated Resource allocated = 2 [(gogoproto.nullable) = false]; + + // Current resource usage. If absent, the containerizer + // cannot provide resource usage. + optional ResourceStatistics statistics = 3; + + // The container id for the executor specified in the executor_info field. + required ContainerID container_id = 4 [(gogoproto.nullable) = false, (gogoproto.customname) = "ContainerID"]; + + message Task { + required string name = 1 [(gogoproto.nullable) = false]; + required TaskID id = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"]; + repeated Resource resources = 3 [(gogoproto.nullable) = false]; + optional Labels labels = 4; + } + + // Non-terminal tasks. + repeated Task tasks = 5 [(gogoproto.nullable) = false]; + } + + repeated Executor executors = 1 [(gogoproto.nullable) = false]; + + // Agent's total resources including checkpointed dynamic + // reservations and persistent volumes. + repeated Resource total = 2 [(gogoproto.nullable) = false]; +} + + +/** + * Describes a sample of events from "perf stat". Only available on + * Linux. + * + * NOTE: Each optional field matches the name of a perf event (see + * "perf list") with the following changes: + * 1. Names are downcased. + * 2. Hyphens ('-') are replaced with underscores ('_'). + * 3. Events with alternate names use the name "perf stat" returns, + * e.g., for the event "cycles OR cpu-cycles" perf always returns + * cycles. + */ +message PerfStatistics { + required double timestamp = 1 [(gogoproto.nullable) = false]; // Start of sample interval, in seconds since the Epoch. + required double duration = 2 [(gogoproto.nullable) = false]; // Duration of sample interval, in seconds. + + // Hardware event. + optional uint64 cycles = 3; + optional uint64 stalled_cycles_frontend = 4; + optional uint64 stalled_cycles_backend = 5; + optional uint64 instructions = 6; + optional uint64 cache_references = 7; + optional uint64 cache_misses = 8; + optional uint64 branches = 9; + optional uint64 branch_misses = 10; + optional uint64 bus_cycles = 11; + optional uint64 ref_cycles = 12; + + // Software event. + optional double cpu_clock = 13 [(gogoproto.customname) = "CPUClock"]; + optional double task_clock = 14; + optional uint64 page_faults = 15; + optional uint64 minor_faults = 16; + optional uint64 major_faults = 17; + optional uint64 context_switches = 18; + optional uint64 cpu_migrations = 19 [(gogoproto.customname) = "CPUMigrations"]; + optional uint64 alignment_faults = 20; + optional uint64 emulation_faults = 21; + + // Hardware cache event. + optional uint64 l1_dcache_loads = 22; + optional uint64 l1_dcache_load_misses = 23; + optional uint64 l1_dcache_stores = 24; + optional uint64 l1_dcache_store_misses = 25; + optional uint64 l1_dcache_prefetches = 26; + optional uint64 l1_dcache_prefetch_misses = 27; + optional uint64 l1_icache_loads = 28; + optional uint64 l1_icache_load_misses = 29; + optional uint64 l1_icache_prefetches = 30; + optional uint64 l1_icache_prefetch_misses = 31; + optional uint64 llc_loads = 32 [(gogoproto.customname) = "LLCLoads"]; + optional uint64 llc_load_misses = 33 [(gogoproto.customname) = "LLCLoadMisses"]; + optional uint64 llc_stores = 34 [(gogoproto.customname) = "LLCStores"]; + optional uint64 llc_store_misses = 35 [(gogoproto.customname) = "LLCStoreMisses"]; + optional uint64 llc_prefetches = 36 [(gogoproto.customname) = "LLCPrefetches"]; + optional uint64 llc_prefetch_misses = 37 [(gogoproto.customname) = "LLCPrefetchMisses"]; + optional uint64 dtlb_loads = 38 [(gogoproto.customname) = "DTLBLoads"]; + optional uint64 dtlb_load_misses = 39 [(gogoproto.customname) = "DTLBLoadMisses"]; + optional uint64 dtlb_stores = 40 [(gogoproto.customname) = "DTLBStores"]; + optional uint64 dtlb_store_misses = 41 [(gogoproto.customname) = "DTLBStoreMisses"]; + optional uint64 dtlb_prefetches = 42 [(gogoproto.customname) = "DTLBPrefetches"]; + optional uint64 dtlb_prefetch_misses = 43 [(gogoproto.customname) = "DTLBPrefetchMisses"]; + optional uint64 itlb_loads = 44 [(gogoproto.customname) = "ITLBLoads"]; + optional uint64 itlb_load_misses = 45 [(gogoproto.customname) = "ITLBLoadMisses"]; + optional uint64 branch_loads = 46; + optional uint64 branch_load_misses = 47; + optional uint64 node_loads = 48; + optional uint64 node_load_misses = 49; + optional uint64 node_stores = 50; + optional uint64 node_store_misses = 51; + optional uint64 node_prefetches = 52; + optional uint64 node_prefetch_misses = 53; +} + + +/** + * Describes a request for resources that can be used by a framework + * to proactively influence the allocator. If 'agent_id' is provided + * then this request is assumed to only apply to resources on that + * agent. + */ +message Request { + optional AgentID agent_id = 1 [(gogoproto.customname) = "AgentID"]; + repeated Resource resources = 2 [(gogoproto.nullable) = false]; +} + + +/** + * Describes some resources available on an agent. An offer only + * contains resources from a single agent. + */ +message Offer { + required OfferID id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"]; + required FrameworkID framework_id = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "FrameworkID"]; + required AgentID agent_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "AgentID"]; + required string hostname = 4 [(gogoproto.nullable) = false]; + + // URL for reaching the agent running on the host. + optional URL url = 8 [(gogoproto.customname) = "URL"]; + + // The domain of the agent. + optional DomainInfo domain = 11; + + repeated Resource resources = 5 [(gogoproto.nullable) = false]; + repeated Attribute attributes = 7 [(gogoproto.nullable) = false]; + + // Executors of the same framework running on this agent. + repeated ExecutorID executor_ids = 6 [(gogoproto.nullable) = false, (gogoproto.customname) = "ExecutorIDs"]; + + // Signifies that the resources in this Offer may be unavailable during + // the given interval. Any tasks launched using these resources may be + // killed when the interval arrives. For example, these resources may be + // part of a planned maintenance schedule. + // + // This field only provides information about a planned unavailability. + // The unavailability interval may not necessarily start at exactly this + // interval, nor last for exactly the duration of this interval. + // The unavailability may also be forever! See comments in + // `Unavailability` for more details. + optional Unavailability unavailability = 9; + + // An offer represents resources allocated to *one* of the + // roles managed by the scheduler. (Therefore, each + // `Offer.resources[i].allocation_info` will match the + // top level `Offer.allocation_info`). + optional Resource.AllocationInfo allocation_info = 10; + + // Defines an operation that can be performed against offers. + message Operation { + enum Type { + UNKNOWN = 0; + LAUNCH = 1; + LAUNCH_GROUP = 6; + RESERVE = 2; + UNRESERVE = 3; + CREATE = 4; + DESTROY = 5; + GROW_VOLUME = 11; // EXPERIMENTAL. + SHRINK_VOLUME = 12; // EXPERIMENTAL. + CREATE_DISK = 13; // EXPERIMENTAL. + DESTROY_DISK = 14; // EXPERIMENTAL. + + option (gogoproto.goproto_enum_prefix) = true; + } + + // TODO(vinod): Deprecate this in favor of `LaunchGroup` below. + message Launch { + repeated TaskInfo task_infos = 1 [(gogoproto.nullable) = false]; + } + + // Unlike `Launch` above, all the tasks in a `task_group` are + // atomically delivered to an executor. + // + // `NetworkInfo` set on executor will be shared by all tasks in + // the task group. + // + // TODO(vinod): Any volumes set on executor could be used by a + // task by explicitly setting `Volume.source` in its resources. + message LaunchGroup { + required ExecutorInfo executor = 1 [(gogoproto.nullable) = false]; + required TaskGroupInfo task_group = 2 [(gogoproto.nullable) = false]; + } + + message Reserve { + repeated Resource resources = 1 [(gogoproto.nullable) = false]; + } + + message Unreserve { + repeated Resource resources = 1 [(gogoproto.nullable) = false]; + } + + message Create { + repeated Resource volumes = 1 [(gogoproto.nullable) = false]; + } + + message Destroy { + repeated Resource volumes = 1 [(gogoproto.nullable) = false]; + } + + // Grow a volume by an additional disk resource. + // NOTE: This is currently experimental and only for persistent volumes + // created on ROOT/PATH disk. + message GrowVolume { + required Resource volume = 1 [(gogoproto.nullable) = false]; + required Resource addition = 2 [(gogoproto.nullable) = false]; + } + + // Shrink a volume by the size specified in the `subtract` field. + // NOTE: This is currently experimental and only for persistent volumes + // created on ROOT/PATH disk. + message ShrinkVolume { + required Resource volume = 1 [(gogoproto.nullable) = false]; + + // See comments in `Value.Scalar` for maximum precision supported. + required Value.Scalar subtract = 2 [(gogoproto.nullable) = false]; + } + + // Create a `MOUNT` or `BLOCK` disk resource from a `RAW` disk resource. + // NOTE: For the time being, this API is subject to change and the related + // feature is experimental. + message CreateDisk { + required Resource source = 1 [(gogoproto.nullable) = false]; + + // NOTE: Only `MOUNT` or `BLOCK` is allowed in the `target_type` field. + required Resource.DiskInfo.Source.Type target_type = 2 [(gogoproto.nullable) = false]; + } + + // Destroy a `MOUNT` or `BLOCK` disk resource. This will result in a `RAW` + // disk resource. + // NOTE: For the time being, this API is subject to change and the related + // feature is experimental. + message DestroyDisk { + // NOTE: Only a `MOUNT` or `BLOCK` disk is allowed in the `source` field. + required Resource source = 1 [(gogoproto.nullable) = false]; + } + + + optional Type type = 1 [(gogoproto.nullable) = false]; + + // NOTE: The `id` field will allow frameworks to indicate that they wish to + // receive feedback about an operation. Since this feature is not yet + // implemented, the `id` field should NOT be set at present. See MESOS-8054. + optional OperationID id = 12 [(gogoproto.customname) = "ID"]; // EXPERIMENTAL. + + optional Launch launch = 2; + optional LaunchGroup launch_group = 7; + optional Reserve reserve = 3; + optional Unreserve unreserve = 4; + optional Create create = 5; + optional Destroy destroy = 6; + optional GrowVolume grow_volume = 13; // EXPERIMENTAL. + optional ShrinkVolume shrink_volume = 14; // EXPERIMENTAL. + optional CreateDisk create_disk = 15; // EXPERIMENTAL. + optional DestroyDisk destroy_disk = 16; // EXPERIMENTAL. + } +} + + +/** + * A request to return some resources occupied by a framework. + */ +message InverseOffer { + // This is the same OfferID as found in normal offers, which allows + // re-use of some of the OfferID-only messages. + required OfferID id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "OfferID"]; + + // URL for reaching the agent running on the host. This enables some + // optimizations as described in MESOS-3012, such as allowing the + // scheduler driver to bypass the master and talk directly with an agent. + optional URL url = 2 [(gogoproto.customname) = "URL"]; + + // The framework that should release its resources. + // If no specifics are provided (i.e. which agent), all the framework's + // resources are requested back. + required FrameworkID framework_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "FrameworkID"]; + + // Specified if the resources need to be released from a particular agent. + // All the framework's resources on this agent are requested back, + // unless further qualified by the `resources` field. + optional AgentID agent_id = 4 [(gogoproto.customname) = "AgentID"]; + + // This InverseOffer represents a planned unavailability event in the + // specified interval. Any tasks running on the given framework or agent + // may be killed when the interval arrives. Therefore, frameworks should + // aim to gracefully terminate tasks prior to the arrival of the interval. + // + // For reserved resources, the resources are expected to be returned to the + // framework after the unavailability interval. This is an expectation, + // not a guarantee. For example, if the unavailability duration is not set, + // the resources may be removed permanently. + // + // For other resources, there is no guarantee that requested resources will + // be returned after the unavailability interval. The allocator has no + // obligation to re-offer these resources to the prior framework after + // the unavailability. + required Unavailability unavailability = 5 [(gogoproto.nullable) = false]; + + // A list of resources being requested back from the framework, + // on the agent identified by `agent_id`. If no resources are specified + // then all resources are being requested back. For the purpose of + // maintenance, this field is always empty (maintenance always requests + // all resources back). + repeated Resource resources = 6 [(gogoproto.nullable) = false]; + + // TODO(josephw): Add additional options for narrowing down the resources + // being requested back. Such as specific executors, tasks, etc. +} + + +/** + * Describes a task. Passed from the scheduler all the way to an + * executor (see SchedulerDriver::launchTasks and + * Executor::launchTask). Either ExecutorInfo or CommandInfo should be set. + * A different executor can be used to launch this task, and subsequent tasks + * meant for the same executor can reuse the same ExecutorInfo struct. + */ +message TaskInfo { + required string name = 1 [(gogoproto.nullable) = false]; + required TaskID task_id = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "TaskID"]; + required AgentID agent_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "AgentID"]; + repeated Resource resources = 4 [(gogoproto.nullable) = false]; + optional ExecutorInfo executor = 5; + optional CommandInfo command = 7; + + // Task provided with a container will launch the container as part + // of this task paired with the task's CommandInfo. + optional ContainerInfo container = 9; + + // A health check for the task. Implemented for executor-less + // command-based tasks. For tasks that specify an executor, it is + // the executor's responsibility to implement the health checking. + optional HealthCheck health_check = 8; + + // A general check for the task. Implemented for all built-in executors. + // For tasks that specify an executor, it is the executor's responsibility + // to implement checking support. Executors should (all built-in executors + // will) neither interpret nor act on the check's result. + // + // NOTE: Check support in built-in executors is experimental. + // + // TODO(alexr): Consider supporting multiple checks per task. + optional CheckInfo check = 13; + + // A kill policy for the task. Implemented for executor-less + // command-based and docker tasks. For tasks that specify an + // executor, it is the executor's responsibility to implement + // the kill policy. + optional KillPolicy kill_policy = 12; + + optional bytes data = 6; + + // Labels are free-form key value pairs which are exposed through + // master and agent endpoints. Labels will not be interpreted or + // acted upon by Mesos itself. As opposed to the data field, labels + // will be kept in memory on master and agent processes. Therefore, + // labels should be used to tag tasks with light-weight meta-data. + // Labels should not contain duplicate key-value pairs. + optional Labels labels = 10; + + // Service discovery information for the task. It is not interpreted + // or acted upon by Mesos. It is up to a service discovery system + // to use this information as needed and to handle tasks without + // service discovery information. + optional DiscoveryInfo discovery = 11; + + // Maximum duration for task completion. If the task is non-terminal at the + // end of this duration, it will fail with the reason + // `REASON_MAX_COMPLETION_TIME_REACHED`. Mesos supports this field for + // executor-less tasks, and tasks that use Docker or default executors. + // It is the executor's responsibility to implement this, so it might not be + // supported by all custom executors. + optional DurationInfo max_completion_time = 14; +} + + +/** + * Describes a group of tasks that belong to an executor. The + * executor will receive the task group in a single message to + * allow the group to be launched "atomically". + * + * NOTES: + * 1) `NetworkInfo` must not be set inside task's `ContainerInfo`. + * 2) `TaskInfo.executor` doesn't need to set. If set, it should match + * `LaunchGroup.executor`. + */ +message TaskGroupInfo { + repeated TaskInfo tasks = 1 [(gogoproto.nullable) = false]; +} + + +// TODO(bmahler): Add executor_uuid here, and send it to the master. This will +// allow us to expose executor work directories for tasks in the webui when +// looking from the master level. Currently only the agent knows which run the +// task belongs to. +/** + * Describes a task, similar to `TaskInfo`. + * + * `Task` is used in some of the Mesos messages found below. + * `Task` is used instead of `TaskInfo` if: + * 1) we need additional IDs, such as a specific + * framework, executor, or agent; or + * 2) we do not need the additional data, such as the command run by the + * task or the health checks. These additional fields may be large and + * unnecessary for some Mesos messages. + * + * `Task` is generally constructed from a `TaskInfo`. See protobuf::createTask. + */ +message Task { + required string name = 1 [(gogoproto.nullable) = false]; + required TaskID task_id = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "TaskID"]; + required FrameworkID framework_id = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "FrameworkID"]; + optional ExecutorID executor_id = 4 [(gogoproto.customname) = "ExecutorID"]; + required AgentID agent_id = 5 [(gogoproto.nullable) = false, (gogoproto.customname) = "AgentID"]; + required TaskState state = 6; // Latest state of the task. + repeated Resource resources = 7 [(gogoproto.nullable) = false]; + repeated TaskStatus statuses = 8 [(gogoproto.nullable) = false]; + + // These fields correspond to the state and uuid of the latest + // status update forwarded to the master. + // NOTE: Either both the fields must be set or both must be unset. + optional TaskState status_update_state = 9; + optional bytes status_update_uuid = 10 [(gogoproto.customname) = "StatusUpdateUUID"]; + + optional Labels labels = 11; + + // Service discovery information for the task. It is not interpreted + // or acted upon by Mesos. It is up to a service discovery system + // to use this information as needed and to handle tasks without + // service discovery information. + optional DiscoveryInfo discovery = 12; + + // Container information for the task. + optional ContainerInfo container = 13; + + // Specific user under which task is running. + optional string user = 14; +} + + +/** + * Describes possible task states. IMPORTANT: Mesos assumes tasks that + * enter terminal states (see below) imply the task is no longer + * running and thus clean up any thing associated with the task + * (ultimately offering any resources being consumed by that task to + * another task). + */ +enum TaskState { + TASK_STAGING = 6; // Initial state. Framework status updates should not use. + TASK_STARTING = 0; // The task is being launched by the executor. + TASK_RUNNING = 1; + + // NOTE: This should only be sent when the framework has + // the TASK_KILLING_STATE capability. + TASK_KILLING = 8; // The task is being killed by the executor. + + // The task finished successfully on its own without external interference. + TASK_FINISHED = 2; // TERMINAL. + + TASK_FAILED = 3; // TERMINAL: The task failed to finish successfully. + TASK_KILLED = 4; // TERMINAL: The task was killed by the executor. + TASK_ERROR = 7; // TERMINAL: The task description contains an error. + + // In Mesos 1.3, this will only be sent when the framework does NOT + // opt-in to the PARTITION_AWARE capability. + // + // NOTE: This state is not always terminal. For example, tasks might + // transition from TASK_LOST to TASK_RUNNING or other states when a + // partitioned agent reregisters. + TASK_LOST = 5; // The task failed but can be rescheduled. + + // The following task states are only sent when the framework + // opts-in to the PARTITION_AWARE capability. + + // The task failed to launch because of a transient error. The + // task's executor never started running. Unlike TASK_ERROR, the + // task description is valid -- attempting to launch the task again + // may be successful. + TASK_DROPPED = 9; // TERMINAL. + + // The task was running on an agent that has lost contact with the + // master, typically due to a network failure or partition. The task + // may or may not still be running. + TASK_UNREACHABLE = 10; + + // The task is no longer running. This can occur if the agent has + // been terminated along with all of its tasks (e.g., the host that + // was running the agent was rebooted). It might also occur if the + // task was terminated due to an agent or containerizer error, or if + // the task was preempted by the QoS controller in an + // oversubscription scenario. + TASK_GONE = 11; // TERMINAL. + + // The task was running on an agent that the master cannot contact; + // the operator has asserted that the agent has been shutdown, but + // this has not been directly confirmed by the master. If the + // operator is correct, the task is not running and this is a + // terminal state; if the operator is mistaken, the task may still + // be running and might return to RUNNING in the future. + TASK_GONE_BY_OPERATOR = 12; + + // The master has no knowledge of the task. This is typically + // because either (a) the master never had knowledge of the task, or + // (b) the master forgot about the task because it garbage collected + // its metadata about the task. The task may or may not still be + // running. + TASK_UNKNOWN = 13; +} + + +/** + * Describes a resource limitation that caused a task failure. + */ +message TaskResourceLimitation { + // This field contains the resource whose limits were violated. + // + // NOTE: 'Resources' is used here because the resource may span + // multiple roles (e.g. `"mem(*):1;mem(role):2"`). + repeated Resource resources = 1 [(gogoproto.nullable) = false]; +} + + +/** + * Describes a UUID. + */ +message UUID { + required bytes value = 1; +} + + +/** + * Describes an operation, similar to `Offer.Operation`, with + * some additional information. + */ +message Operation { + optional FrameworkID framework_id = 1 [(gogoproto.customname) = "FrameworkID"]; + optional AgentID agent_id = 2 [(gogoproto.customname) = "AgentID"]; + required Offer.Operation info = 3 [(gogoproto.nullable) = false]; + required OperationStatus latest_status = 4 [(gogoproto.nullable) = false]; + + // All the statuses known to this operation. Some of the statuses in this + // list might not have been acknowledged yet. The statuses are ordered. + repeated OperationStatus statuses = 5 [(gogoproto.nullable) = false]; + + // This is the internal UUID for the operation, which is kept independently + // from the framework-specified operation ID, which is optional. + required UUID uuid = 6 [(gogoproto.nullable) = false, (gogoproto.customname) = "UUID"]; +} + + +/** + * Describes possible operation states. + */ +enum OperationState { + // Default value if the enum is not set. See MESOS-4997. + OPERATION_UNSUPPORTED = 0; + + // Initial state. + OPERATION_PENDING = 1; + + // TERMINAL: The operation was successfully applied. + OPERATION_FINISHED = 2; + + // TERMINAL: The operation failed to apply. + OPERATION_FAILED = 3; + + // TERMINAL: The operation description contains an error. + OPERATION_ERROR = 4; + + // TERMINAL: The operation was dropped due to a transient error. + OPERATION_DROPPED = 5; + + // The operation affects an agent that has lost contact with the master, + // typically due to a network failure or partition. The operation may or may + // not still be pending. + OPERATION_UNREACHABLE = 6; + + // The operation affected an agent that the master cannot contact; + // the operator has asserted that the agent has been shutdown, but this has + // not been directly confirmed by the master. + // + // If the operator is correct, the operation is not pending and this is a + // terminal state; if the operator is mistaken, the operation may still be + // pending and might return to a different state in the future. + OPERATION_GONE_BY_OPERATOR = 7; + + // The operation affects an agent that the master recovered from its + // state, but that agent has not yet re-registered. + // + // The operation can transition to `OPERATION_UNREACHABLE` if the + // corresponding agent is marked as unreachable, and will transition to + // another status if the agent re-registers. + OPERATION_RECOVERING = 8; + + // The master has no knowledge of the operation. This is typically + // because either (a) the master never had knowledge of the operation, or + // (b) the master forgot about the operation because it garbage collected + // its metadata about the operation. The operation may or may not still be + // pending. + OPERATION_UNKNOWN = 9; +} + + +/** + * Describes the current status of an operation. + */ +message OperationStatus { + // While frameworks will only receive status updates for operations on which + // they have set an ID, this field is optional because this message is also + // used internally by Mesos components when the operation's ID has not been + // set. + optional OperationID operation_id = 1 [(gogoproto.customname) = "OperationID"]; + + required OperationState state = 2 [(gogoproto.nullable) = false]; + optional string message = 3; + + // Converted resources after applying the operation. This only + // applies if the `state` is `OPERATION_FINISHED`. + repeated Resource converted_resources = 4 [(gogoproto.nullable) = false]; + + // Statuses that are delivered reliably to the scheduler will + // include a `uuid`. The status is considered delivered once + // it is acknowledged by the scheduler. + optional UUID uuid = 5 [(gogoproto.customname) = "UUID"]; +} + + +/** +* Describes the status of a check. Type and the corresponding field, i.e., +* `command` or `http` must be set. If the result of the check is not available +* (e.g., the check timed out), these fields must contain empty messages, i.e., +* `exit_code` or `status_code` will be unset. +* +* NOTE: This API is subject to change and the related feature is experimental. +*/ +message CheckStatusInfo { + message Command { + // Exit code of a command check. It is the result of calling + // `WEXITSTATUS()` on `waitpid()` termination information on + // Posix and calling `GetExitCodeProcess()` on Windows. + optional int32 exit_code = 1; + } + + message Http { + // HTTP status code of an HTTP check. + optional uint32 status_code = 1; + } + + message Tcp { + // Whether a TCP connection succeeded. + optional bool succeeded = 1; + } + + // TODO(alexr): Consider adding a `data` field, which can contain, e.g., + // truncated stdout/stderr output for command checks or HTTP response body + // for HTTP checks. Alternatively, it can be an even shorter `message` field + // containing the last line of stdout or Reason-Phrase of the status line of + // the HTTP response. + + // The type of the check this status corresponds to. + optional CheckInfo.Type type = 1; + + // Status of a command check. + optional Command command = 2; + + // Status of an HTTP check. + optional Http http = 3 [(gogoproto.customname) = "HTTP"]; + + // Status of a TCP check. + optional Tcp tcp = 4 [(gogoproto.customname) = "TCP"]; + + // TODO(alexr): Consider introducing a "last changed at" timestamp, since + // task status update's timestamp may not correspond to the last check's + // state, e.g., for reconciliation. + + // TODO(alexr): Consider introducing a `reason` enum here to explicitly + // distinguish between completed, delayed, and timed out checks. +} + + +/** + * Describes the current status of a task. + */ +message TaskStatus { + // Describes the source of the task status update. + enum Source { + SOURCE_MASTER = 0; + SOURCE_AGENT = 1; + SOURCE_EXECUTOR = 2; + } + + // Detailed reason for the task status update. + // Refer to docs/task-state-reasons.md for additional explanation. + enum Reason { + // TODO(jieyu): The default value when a caller doesn't check for + // presence is 0 and so ideally the 0 reason is not a valid one. + // Since this is not used anywhere, consider removing this reason. + REASON_COMMAND_EXECUTOR_FAILED = 0; + + REASON_CONTAINER_LAUNCH_FAILED = 21; + REASON_CONTAINER_LIMITATION = 19; + REASON_CONTAINER_LIMITATION_DISK = 20; + REASON_CONTAINER_LIMITATION_MEMORY = 8; + REASON_CONTAINER_PREEMPTED = 17; + REASON_CONTAINER_UPDATE_FAILED = 22; + REASON_MAX_COMPLETION_TIME_REACHED = 33; + REASON_EXECUTOR_REGISTRATION_TIMEOUT = 23; + REASON_EXECUTOR_REREGISTRATION_TIMEOUT = 24; + REASON_EXECUTOR_TERMINATED = 1; + REASON_EXECUTOR_UNREGISTERED = 2; // No longer used. + REASON_FRAMEWORK_REMOVED = 3; + REASON_GC_ERROR = 4; + REASON_INVALID_FRAMEWORKID = 5; + REASON_INVALID_OFFERS = 6; + REASON_IO_SWITCHBOARD_EXITED = 27; + REASON_MASTER_DISCONNECTED = 7; + REASON_RECONCILIATION = 9; + REASON_RESOURCES_UNKNOWN = 18; + REASON_AGENT_DISCONNECTED = 10; + REASON_AGENT_REMOVED = 11; + REASON_AGENT_REMOVED_BY_OPERATOR = 31; + REASON_AGENT_REREGISTERED = 32; + REASON_AGENT_RESTARTED = 12; + REASON_AGENT_UNKNOWN = 13; + REASON_TASK_KILLED_DURING_LAUNCH = 30; + REASON_TASK_CHECK_STATUS_UPDATED = 28; + REASON_TASK_HEALTH_CHECK_STATUS_UPDATED = 29; + REASON_TASK_GROUP_INVALID = 25; + REASON_TASK_GROUP_UNAUTHORIZED = 26; + REASON_TASK_INVALID = 14; + REASON_TASK_UNAUTHORIZED = 15; + REASON_TASK_UNKNOWN = 16; + } + + required TaskID task_id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "TaskID"]; + required TaskState state = 2; + optional string message = 4; // Possible message explaining state. + optional Source source = 9; + optional Reason reason = 10; + optional bytes data = 3; + optional AgentID agent_id = 5 [(gogoproto.customname) = "AgentID"]; + optional ExecutorID executor_id = 7 [(gogoproto.customname) = "ExecutorID"]; // TODO(benh): Use in master/agent. + optional double timestamp = 6; + + // Statuses that are delivered reliably to the scheduler will + // include a 'uuid'. The status is considered delivered once + // it is acknowledged by the scheduler. Schedulers can choose + // to either explicitly acknowledge statuses or let the scheduler + // driver implicitly acknowledge (default). + // + // TODO(bmahler): This is currently overwritten in the scheduler + // driver and executor driver, but executors will need to set this + // to a valid RFC-4122 UUID if using the HTTP API. + optional bytes uuid = 11 [(gogoproto.customname) = "UUID"]; + + // Describes whether the task has been determined to be healthy (true) or + // unhealthy (false) according to the `health_check` field in `TaskInfo`. + optional bool healthy = 8; + + // Contains check status for the check specified in the corresponding + // `TaskInfo`. If no check has been specified, this field must be + // absent, otherwise it must be present even if the check status is + // not available yet. If the status update is triggered for a different + // reason than `REASON_TASK_CHECK_STATUS_UPDATED`, this field will contain + // the last known value. + // + // NOTE: A check-related task status update is triggered if and only if + // the value or presence of any field in `CheckStatusInfo` changes. + // + // NOTE: Check support in built-in executors is experimental. + optional CheckStatusInfo check_status = 15; + + // Labels are free-form key value pairs which are exposed through + // master and agent endpoints. Labels will not be interpreted or + // acted upon by Mesos itself. As opposed to the data field, labels + // will be kept in memory on master and agent processes. Therefore, + // labels should be used to tag TaskStatus message with light-weight + // meta-data. Labels should not contain duplicate key-value pairs. + optional Labels labels = 12; + + // Container related information that is resolved dynamically such as + // network address. + optional ContainerStatus container_status = 13; + + // The time (according to the master's clock) when the agent where + // this task was running became unreachable. This is only set on + // status updates for tasks running on agents that are unreachable + // (e.g., partitioned away from the master). + optional TimeInfo unreachable_time = 14; + + // If the reason field indicates a container resource limitation, + // this field optionally contains additional information. + optional TaskResourceLimitation limitation = 16; +} + + +/** + * Describes possible filters that can be applied to unused resources + * (see SchedulerDriver::launchTasks) to influence the allocator. + */ +message Filters { + // Time to consider unused resources refused. Note that all unused + // resources will be considered refused and use the default value + // (below) regardless of whether Filters was passed to + // SchedulerDriver::launchTasks. You MUST pass Filters with this + // field set to change this behavior (i.e., get another offer which + // includes unused resources sooner or later than the default). + // + // If this field is set to a number of seconds greater than 31536000 + // (365 days), then the resources will be considered refused for 365 + // days. If it is set to a negative number, then the default value + // will be used. + optional double refuse_seconds = 1 [default = 5.0]; +} + + +/** +* Describes a collection of environment variables. This is used with +* CommandInfo in order to set environment variables before running a +* command. The contents of each variable may be specified as a string +* or a Secret; only one of `value` and `secret` must be set. +*/ +message Environment { + message Variable { + required string name = 1 [(gogoproto.nullable) = false]; + + enum Type { + UNKNOWN = 0; + VALUE = 1; + SECRET = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // In Mesos 1.2, the `Environment.variables.value` message was made + // optional. The default type for `Environment.variables.type` is now VALUE, + // which requires `value` to be set, maintaining backward compatibility. + // + // TODO(greggomann): The default can be removed in Mesos 2.1 (MESOS-7134). + optional Type type = 3 [default = VALUE]; + + // Only one of `value` and `secret` must be set. + optional string value = 2; + optional Secret secret = 4; + } + + repeated Variable variables = 1 [(gogoproto.nullable) = false]; +} + + +/** + * A generic (key, value) pair used in various places for parameters. + */ +message Parameter { + required string key = 1 [(gogoproto.nullable) = false]; + required string value = 2 [(gogoproto.nullable) = false]; +} + + +/** + * Collection of Parameter. + */ +message Parameters { + repeated Parameter parameter = 1 [(gogoproto.nullable) = false]; +} + + +/** + * Credential used in various places for authentication and + * authorization. + * + * NOTE: A 'principal' is different from 'FrameworkInfo.user'. The + * former is used for authentication and authorization while the + * latter is used to determine the default user under which the + * framework's executors/tasks are run. + */ +message Credential { + required string principal = 1 [(gogoproto.nullable) = false]; + optional string secret = 2; +} + + +/** + * Credentials used for framework authentication, HTTP authentication + * (where the common 'username' and 'password' are captured as + * 'principal' and 'secret' respectively), etc. + */ +message Credentials { + repeated Credential credentials = 1 [(gogoproto.nullable) = false]; +} + + +/** + * Secret used to pass privileged information. It is designed to provide + * pass-by-value or pass-by-reference semantics, where the REFERENCE type can be + * used by custom modules which interact with a secure back-end. + */ +message Secret +{ + enum Type { + UNKNOWN = 0; + REFERENCE = 1; + VALUE = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Can be used by modules to refer to a secret stored in a secure back-end. + // The `key` field is provided to permit reference to a single value within a + // secret containing arbitrary key-value pairs. + // + // For example, given a back-end secret store with a secret named + // "my-secret" containing the following key-value pairs: + // + // { + // "username": "my-user", + // "password": "my-password + // } + // + // the username could be referred to in a `Secret` by specifying + // "my-secret" for the `name` and "username" for the `key`. + message Reference + { + required string name = 1 [(gogoproto.nullable) = false]; + optional string key = 2; + } + + // Used to pass the value of a secret. + message Value + { + required bytes data = 1; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + + // Only one of `reference` and `value` must be set. + optional Reference reference = 2; + optional Value value = 3; +} + + +/** + * Rate (queries per second, QPS) limit for messages from a framework to master. + * Strictly speaking they are the combined rate from all frameworks of the same + * principal. + */ +message RateLimit { + // Leaving QPS unset gives it unlimited rate (i.e., not throttled), + // which also implies unlimited capacity. + optional double qps = 1 [(gogoproto.customname) = "QPS"]; + + // Principal of framework(s) to be throttled. Should match + // FrameworkInfo.principal and Credential.principal (if using authentication). + required string principal = 2 [(gogoproto.nullable) = false]; + + // Max number of outstanding messages from frameworks of this principal + // allowed by master before the next message is dropped and an error is sent + // back to the sender. Messages received before the capacity is reached are + // still going to be processed after the error is sent. + // If unspecified, this principal is assigned unlimited capacity. + // NOTE: This value is ignored if 'qps' is not set. + optional uint64 capacity = 3; +} + + +/** + * Collection of RateLimit. + * Frameworks without rate limits defined here are not throttled unless + * 'aggregate_default_qps' is specified. + */ +message RateLimits { + // Items should have unique principals. + repeated RateLimit limits = 1 [(gogoproto.nullable) = false]; + + // All the frameworks not specified in 'limits' get this default rate. + // This rate is an aggregate rate for all of them, i.e., their combined + // traffic is throttled together at this rate. + optional double aggregate_default_qps = 2 [(gogoproto.customname) = "AggregateDefaultQPS"]; + + // All the frameworks not specified in 'limits' get this default capacity. + // This is an aggregate value similar to 'aggregate_default_qps'. + optional uint64 aggregate_default_capacity = 3; +} + + +/** + * Describe an image used by tasks or executors. Note that it's only + * for tasks or executors launched by MesosContainerizer currently. + */ +message Image { + enum Type { + APPC = 1; + DOCKER = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Protobuf for specifying an Appc container image. See: + // https://github.com/appc/spec/blob/master/spec/aci.md + message Appc { + // The name of the image. + required string name = 1 [(gogoproto.nullable) = false]; + + // An image ID is a string of the format "hash-value", where + // "hash" is the hash algorithm used and "value" is the hex + // encoded string of the digest. Currently the only permitted + // hash algorithm is sha512. + optional string id = 2 [(gogoproto.customname) = "ID"]; + + // Optional labels. Suggested labels: "version", "os", and "arch". + optional Labels labels = 3; + } + + message Docker { + // The name of the image. Expected format: + // [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG|@TYPE:DIGEST] + // + // See: https://docs.docker.com/reference/commandline/pull/ + required string name = 1 [(gogoproto.nullable) = false]; + + // Credential to authenticate with docker registry. + // NOTE: This is not encrypted, therefore framework and operators + // should enable SSL when passing this information. + // + // This field has never been used in Mesos before and is + // deprecated since Mesos 1.3. Please use `config` below + // (see MESOS-7088 for details). + optional Credential credential = 2 [deprecated = true]; // Since 1.3. + + // Docker config containing credentials to authenticate with + // docker registry. The secret is expected to be a docker + // config file in JSON format with UTF-8 character encoding. + optional Secret config = 3; + } + + required Type type = 1; + + // Only one of the following image messages should be set to match + // the type. + optional Appc appc = 2; + optional Docker docker = 3; + + // With this flag set to false, the mesos containerizer will pull + // the docker/appc image from the registry even if the image is + // already downloaded on the agent. + optional bool cached = 4 [default = true]; +} + + +/** + * Describes how the mount will be propagated for a volume. See the + * following doc for more details about mount propagation: + * https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt + */ +message MountPropagation { + enum Mode { + UNKNOWN = 0; + + // The volume in a container will receive new mounts from the host + // or other containers, but filesystems mounted inside the + // container won't be propagated to the host or other containers. + // This is currently the default behavior for all volumes. + HOST_TO_CONTAINER = 1; + + // The volume in a container will receive new mounts from the host + // or other containers, and its own mounts will be propagated from + // the container to the host or other containers. + BIDIRECTIONAL = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + optional Mode mode = 1; +} + + +/** + * Describes a volume mapping either from host to container or vice + * versa. Both paths can either refer to a directory or a file. + */ +message Volume { + enum Mode { + RW = 1; // read-write. + RO = 2; // read-only. + } + + // TODO(gyliu513): Make this as `optional` after deprecation cycle of 1.0. + required Mode mode = 3; + + // Path pointing to a directory or file in the container. If the + // path is a relative path, it is relative to the container work + // directory. If the path is an absolute path, that path must + // already exist. + required string container_path = 1 [(gogoproto.nullable) = false]; + + // The following specifies the source of this volume. At most one of + // the following should be set. + + // Absolute path pointing to a directory or file on the host or a + // path relative to the container work directory. + optional string host_path = 2; + + // The source of the volume is an Image which describes a root + // filesystem which will be provisioned by Mesos. + optional Image image = 4; + + // Describes where a volume originates from. + message Source { + enum Type { + // This must be the first enum value in this list, to + // ensure that if 'type' is not set, the default value + // is UNKNOWN. This enables enum values to be added + // in a backwards-compatible way. See: MESOS-4997. + UNKNOWN = 0; + + // TODO(gyliu513): Add IMAGE as volume source type. + DOCKER_VOLUME = 1; + HOST_PATH = 4; + SANDBOX_PATH = 2; + SECRET = 3; + + option (gogoproto.goproto_enum_prefix) = true; + } + + message DockerVolume { + // Driver of the volume, it can be flocker, convoy, raxrey etc. + optional string driver = 1; + + // Name of the volume. + required string name = 2 [(gogoproto.nullable) = false]; + + // Volume driver specific options. + optional Parameters driver_options = 3; + } + + // Absolute path pointing to a directory or file on the host. + message HostPath { + required string path = 1 [(gogoproto.nullable) = false]; + optional MountPropagation mount_propagation = 2; + } + + // Describe a path from a container's sandbox. The container can + // be the current container (SELF), or its parent container + // (PARENT). PARENT allows all child containers to share a volume + // from their parent container's sandbox. It'll be an error if + // the current container is a top level container. + message SandboxPath { + enum Type { + UNKNOWN = 0; + SELF = 1; + PARENT = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + optional Type type = 1 [(gogoproto.nullable) = false]; + + // A path relative to the corresponding container's sandbox. + // Note that upwards traversal (i.e. ../../abc) is not allowed. + required string path = 2 [(gogoproto.nullable) = false]; + } + + // Enum fields should be optional, see: MESOS-4997. + optional Type type = 1 [(gogoproto.nullable) = false]; + + // The following specifies the source of this volume. At most one of + // the following should be set. + + // The source of the volume created by docker volume driver. + optional DockerVolume docker_volume = 2; + + optional HostPath host_path = 5; + optional SandboxPath sandbox_path = 3; + + // The volume/secret isolator uses the secret-fetcher module (third-party or + // internal) downloads the secret and makes it available at container_path. + optional Secret secret = 4; + } + + optional Source source = 5; +} + + +/** + * Describes a network request from a framework as well as network resolution + * provided by Mesos. + * + * A framework may request the network isolator on the Agent to isolate the + * container in a network namespace and create a virtual network interface. + * The `NetworkInfo` message describes the properties of that virtual + * interface, including the IP addresses and network isolation policy + * (network group membership). + * + * The NetworkInfo message is not interpreted by the Master or Agent and is + * intended to be used by Agent and Master modules implementing network + * isolation. If the modules are missing, the message is simply ignored. In + * future, the task launch will fail if there is no module providing the + * network isolation capabilities (MESOS-3390). + * + * An executor, Agent, or an Agent module may append NetworkInfos inside + * TaskStatus::container_status to provide information such as the container IP + * address and isolation groups. + */ +message NetworkInfo { + enum Protocol { + IPv4 = 1; + IPv6 = 2; + } + + // Specifies a request for an IP address, or reports the assigned container + // IP address. + // + // Users can request an automatically assigned IP (for example, via an + // IPAM service) or a specific IP by adding a NetworkInfo to the + // ContainerInfo for a task. On a request, specifying neither `protocol` + // nor `ip_address` means that any available address may be assigned. + message IPAddress { + // Specify IP address requirement. Set protocol to the desired value to + // request the network isolator on the Agent to assign an IP address to the + // container being launched. If a specific IP address is specified in + // ip_address, this field should not be set. + optional Protocol protocol = 1 [default = IPv4]; + + // Statically assigned IP provided by the Framework. This IP will be + // assigned to the container by the network isolator module on the Agent. + // This field should not be used with the protocol field above. + // + // If an explicit address is requested but is unavailable, the network + // isolator should fail the task. + optional string ip_address = 2 [(gogoproto.customname) = "IPAddress"]; + } + + // When included in a ContainerInfo, each of these represent a + // request for an IP address. Each request can specify an explicit address + // or the IP protocol to use. + // + // When included in a TaskStatus message, these inform the framework + // scheduler about the IP addresses that are bound to the container + // interface. When there are no custom network isolator modules installed, + // this field is filled in automatically with the Agent IP address. + repeated IPAddress ip_addresses = 5 [(gogoproto.nullable) = false, (gogoproto.customname) = "IPAddresses"]; + + // Name of the network which will be used by network isolator to determine + // the network that the container joins. It's up to the network isolator + // to decide how to interpret this field. + optional string name = 6; + + // A group is the name given to a set of logically-related interfaces that + // are allowed to communicate among themselves. Network traffic is allowed + // between two container interfaces that share at least one network group. + // For example, one might want to create separate groups for isolating dev, + // testing, qa and prod deployment environments. + repeated string groups = 3; + + // To tag certain metadata to be used by Isolator/IPAM, e.g., rack, etc. + optional Labels labels = 4; + + // Specifies a port mapping request for the task on this network. + message PortMapping { + required uint32 host_port = 1 [(gogoproto.nullable) = false]; + required uint32 container_port = 2 [(gogoproto.nullable) = false]; + // Protocol to expose as (ie: tcp, udp). + optional string protocol = 3; + } + + repeated PortMapping port_mappings = 7 [(gogoproto.nullable) = false]; +}; + + +/** + * Encapsulation of `Capabilities` supported by Linux. + * Reference: http://linux.die.net/man/7/capabilities. + */ +message CapabilityInfo { + // We start the actual values at an offset(1000) because Protobuf 2 + // uses the first value as the default one. Separating the default + // value from the real first value helps to disambiguate them. This + // is especially valuable for backward compatibility. + // See: MESOS-4997. + enum Capability { + UNKNOWN = 0; + CHOWN = 1000; + DAC_OVERRIDE = 1001; + DAC_READ_SEARCH = 1002; + FOWNER = 1003; + FSETID = 1004; + KILL = 1005; + SETGID = 1006; + SETUID = 1007; + SETPCAP = 1008; + LINUX_IMMUTABLE = 1009; + NET_BIND_SERVICE = 1010; + NET_BROADCAST = 1011; + NET_ADMIN = 1012; + NET_RAW = 1013; + IPC_LOCK = 1014; + IPC_OWNER = 1015; + SYS_MODULE = 1016; + SYS_RAWIO = 1017; + SYS_CHROOT = 1018; + SYS_PTRACE = 1019; + SYS_PACCT = 1020; + SYS_ADMIN = 1021; + SYS_BOOT = 1022; + SYS_NICE = 1023; + SYS_RESOURCE = 1024; + SYS_TIME = 1025; + SYS_TTY_CONFIG = 1026; + MKNOD = 1027; + LEASE = 1028; + AUDIT_WRITE = 1029; + AUDIT_CONTROL = 1030; + SETFCAP = 1031; + MAC_OVERRIDE = 1032; + MAC_ADMIN = 1033; + SYSLOG = 1034; + WAKE_ALARM = 1035; + BLOCK_SUSPEND = 1036; + AUDIT_READ = 1037; + + option (gogoproto.goproto_enum_prefix) = true; + } + + repeated Capability capabilities = 1; +} + + +/** + * Encapsulation for Linux specific configuration. + * E.g, capabilities, limits etc. + */ +message LinuxInfo { + // Since 1.4.0, deprecated in favor of `effective_capabilities`. + optional CapabilityInfo capability_info = 1 [deprecated = true]; + + // The set of capabilities that are allowed but not initially + // granted to tasks. + optional CapabilityInfo bounding_capabilities = 2; + + // Represents the set of capabilities that the task will + // be executed with. + optional CapabilityInfo effective_capabilities = 3; + + // If set as 'true', the container shares the pid namespace with + // its parent. If the container is a top level container, it will + // share the pid namespace with the agent. If the container is a + // nested container, it will share the pid namespace with its + // parent container. This field will be ignored if 'namespaces/pid' + // isolator is not enabled. + optional bool share_pid_namespace = 4 [(gogoproto.customname) = "SharePIDNamespace"]; +} + + +/** +* Encapsulation for POSIX rlimits, see +* http://pubs.opengroup.org/onlinepubs/009695399/functions/getrlimit.html. +* Note that some types might only be defined for Linux. +* We use a custom prefix to avoid conflict with existing system macros +* (e.g., `RLIMIT_CPU` or `NOFILE`). +*/ +message RLimitInfo { + message RLimit { + enum Type { + UNKNOWN = 0; + RLMT_AS = 1; + RLMT_CORE = 2; + RLMT_CPU = 3; + RLMT_DATA = 4; + RLMT_FSIZE = 5; + RLMT_LOCKS = 6; + RLMT_MEMLOCK = 7; + RLMT_MSGQUEUE = 8; + RLMT_NICE = 9; + RLMT_NOFILE = 10; + RLMT_NPROC = 11; + RLMT_RSS = 12; + RLMT_RTPRIO = 13; + RLMT_RTTIME = 14; + RLMT_SIGPENDING = 15; + RLMT_STACK = 16; + + option (gogoproto.goproto_enum_prefix) = true; + } + optional Type type = 1 [(gogoproto.nullable) = false]; + + // Either both are set or both are not set. + // If both are not set, it represents unlimited. + // If both are set, we require `soft` <= `hard`. + optional uint64 hard = 2; + optional uint64 soft = 3; + } + + repeated RLimit rlimits = 1 [(gogoproto.nullable) = false]; +} + + +/** + * Describes the information about (pseudo) TTY that can + * be attached to a process running in a container. + */ +message TTYInfo { + message WindowSize { + required uint32 rows = 1 [(gogoproto.nullable) = false]; + required uint32 columns = 2 [(gogoproto.nullable) = false]; + } + + optional WindowSize window_size = 1; +} + + +/** + * Describes a container configuration and allows extensible + * configurations for different container implementations. + * + * NOTE: `ContainerInfo` may be specified, e.g., by a task, even if no + * container image is provided. In this case neither `MesosInfo` nor + * `DockerInfo` is set, the required `type` must be `MESOS`. This is to + * address a case when a task without an image, e.g., a shell script + * with URIs, wants to use features originally designed for containers, + * for example custom network isolation via `NetworkInfo`. + */ +message ContainerInfo { + // All container implementation types. + enum Type { + DOCKER = 1; + MESOS = 2; + + option (gogoproto.goproto_enum_prefix) = true; + } + + message DockerInfo { + // The docker image that is going to be passed to the registry. + required string image = 1 [(gogoproto.nullable) = false]; + + // Network options. + enum Network { + HOST = 1; + BRIDGE = 2; + NONE = 3; + USER = 4; + + option (gogoproto.goproto_enum_prefix) = true; + } + + optional Network network = 2 [default = HOST]; + + message PortMapping { + required uint32 host_port = 1 [(gogoproto.nullable) = false]; + required uint32 container_port = 2 [(gogoproto.nullable) = false]; + // Protocol to expose as (ie: tcp, udp). + optional string protocol = 3; + } + + repeated PortMapping port_mappings = 3 [(gogoproto.nullable) = false]; + + optional bool privileged = 4 [default = false]; + + // Allowing arbitrary parameters to be passed to docker CLI. + // Note that anything passed to this field is not guaranteed + // to be supported moving forward, as we might move away from + // the docker CLI. + repeated Parameter parameters = 5 [(gogoproto.nullable) = false]; + + // With this flag set to true, the docker containerizer will + // pull the docker image from the registry even if the image + // is already downloaded on the agent. + optional bool force_pull_image = 6; + + // The name of volume driver plugin. + optional string volume_driver = 7 [deprecated = true]; // Since 1.0 + } + + message MesosInfo { + optional Image image = 1; + } + + required Type type = 1; + repeated Volume volumes = 2 [(gogoproto.nullable) = false]; + optional string hostname = 4; + + // Only one of the following *Info messages should be set to match + // the type. + optional DockerInfo docker = 3; + optional MesosInfo mesos = 5; + + // A list of network requests. A framework can request multiple IP addresses + // for the container. + repeated NetworkInfo network_infos = 7 [(gogoproto.nullable) = false]; + + // Linux specific information for the container. + optional LinuxInfo linux_info = 8; + + // (POSIX only) rlimits of the container. + optional RLimitInfo rlimit_info = 9; + + // If specified a tty will be attached to the container entrypoint. + optional TTYInfo tty_info = 10 [(gogoproto.customname) = "TTYInfo"]; +} + + +/** + * Container related information that is resolved during container + * setup. The information is sent back to the framework as part of the + * TaskStatus message. + */ +message ContainerStatus { + optional ContainerID container_id = 4 [(gogoproto.customname) = "ContainerID"]; + + // This field can be reliably used to identify the container IP address. + repeated NetworkInfo network_infos = 1 [(gogoproto.nullable) = false]; + + // Information about Linux control group (cgroup). + optional CgroupInfo cgroup_info = 2; + + // Information about Executor PID. + optional uint32 executor_pid = 3 [(gogoproto.customname) = "ExecutorPID"]; +} + + +/** + * Linux control group (cgroup) information. + */ +message CgroupInfo { + // Configuration of a blkio cgroup subsystem. + message Blkio { + enum Operation { + UNKNOWN = 0; + TOTAL = 1; + READ = 2; + WRITE = 3; + SYNC = 4; + ASYNC = 5; + + option (gogoproto.goproto_enum_prefix) = true; + } + + // Describes a stat value without the device descriptor part. + message Value { + optional Operation op = 1; // Required. + optional uint64 value = 2; // Required. + } + + message CFQ { + message Statistics { + // Stats are grouped by block devices. If `device` is not + // set, it represents `Total`. + optional Device.Number device = 1; + // blkio.sectors + optional uint64 sectors = 2; + // blkio.time + optional uint64 time = 3; + // blkio.io_serviced + repeated Value io_serviced = 4 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOServiced"]; + // blkio.io_service_bytes + repeated Value io_service_bytes = 5 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOServiceBytes"]; + // blkio.io_service_time + repeated Value io_service_time = 6 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOServiceTime"]; + // blkio.io_wait_time + repeated Value io_wait_time = 7 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOWaitTime"]; + // blkio.io_merged + repeated Value io_merged = 8 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOMerged"]; + // blkio.io_queued + repeated Value io_queued = 9 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOQueued"]; + } + + // TODO(jasonlai): Add fields for blkio weight and weight + // device. + } + + message Throttling { + message Statistics { + // Stats are grouped by block devices. If `device` is not + // set, it represents `Total`. + optional Device.Number device = 1; + // blkio.throttle.io_serviced + repeated Value io_serviced = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOServiced"]; + // blkio.throttle.io_service_bytes + repeated Value io_service_bytes = 3 [(gogoproto.nullable) = false, (gogoproto.customname) = "IOServiceBytes"]; + } + + // TODO(jasonlai): Add fields for blkio.throttle.*_device. + } + + message Statistics { + repeated CFQ.Statistics cfq = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "CFQ"]; + repeated CFQ.Statistics cfq_recursive = 2 [(gogoproto.nullable) = false, (gogoproto.customname) = "CFQRecursive"]; + repeated Throttling.Statistics throttling = 3; + } + } + + // Configuration of a net_cls cgroup subsystem. + message NetCls { + // The 32-bit classid consists of two parts, a 16 bit major handle + // and a 16-bit minor handle. The major and minor handle are + // represented using the format 0xAAAABBBB, where 0xAAAA is the + // 16-bit major handle and 0xBBBB is the 16-bit minor handle. + optional uint32 classid = 1 [(gogoproto.customname) = "ClassID"]; + } + + optional NetCls net_cls = 1 [(gogoproto.customname) = "NetCLS"]; +} + + +/** + * Collection of labels. Labels should not contain duplicate key-value + * pairs. + */ +message Labels { + repeated Label labels = 1 [(gogoproto.nullable) = false]; +} + + +/** + * Key, value pair used to store free form user-data. + */ +message Label { + required string key = 1 [(gogoproto.nullable) = false]; + optional string value = 2; +} + + +/** + * Named port used for service discovery. + */ +message Port { + // Port number on which the framework exposes a service. + required uint32 number = 1 [(gogoproto.nullable) = false]; + + // Name of the service hosted on this port. + optional string name = 2; + + // Layer 4-7 protocol on which the framework exposes its services. + optional string protocol = 3; + + // This field restricts discovery within a framework (FRAMEWORK), + // within a Mesos cluster (CLUSTER), or places no restrictions (EXTERNAL). + // The visibility setting for a Port overrides the general visibility setting + // in the DiscoveryInfo. + optional DiscoveryInfo.Visibility visibility = 4; + + // This can be used to decorate the message with metadata to be + // interpreted by external applications such as firewalls. + optional Labels labels = 5; +} + + +/** + * Collection of ports. + */ +message Ports { + repeated Port ports = 1 [(gogoproto.nullable) = false]; +} + + +/** +* Service discovery information. +* The visibility field restricts discovery within a framework (FRAMEWORK), +* within a Mesos cluster (CLUSTER), or places no restrictions (EXTERNAL). +* Each port in the ports field also has an optional visibility field. +* If visibility is specified for a port, it overrides the default service-wide +* DiscoveryInfo.visibility for that port. +* The environment, location, and version fields provide first class support for +* common attributes used to differentiate between similar services. The +* environment may receive values such as PROD/QA/DEV, the location field may +* receive values like EAST-US/WEST-US/EUROPE/AMEA, and the version field may +* receive values like v2.0/v0.9. The exact use of these fields is up to each +* service discovery system. +*/ +message DiscoveryInfo { + enum Visibility { + FRAMEWORK = 0; + CLUSTER = 1; + EXTERNAL = 2; + } + + required Visibility visibility = 1 [(gogoproto.nullable) = false]; + optional string name = 2; + optional string environment = 3; + optional string location = 4; + optional string version = 5; + optional Ports ports = 6; + optional Labels labels = 7; +} + + +/** + * Named WeightInfo to indicate resource allocation + * priority between the different roles. + */ +message WeightInfo { + required double weight = 1 [(gogoproto.nullable) = false]; + + // Related role name. + optional string role = 2; +} + + +/** + * Version information of a component. + */ +message VersionInfo { + required string version = 1 [(gogoproto.nullable) = false]; + optional string build_date = 2; + optional double build_time = 3; + optional string build_user = 4; + optional string git_sha = 5 [(gogoproto.customname) = "GitSHA"]; + optional string git_branch = 6; + optional string git_tag = 7; +} + + +/** + * Flag consists of a name and optionally its value. + */ +message Flag { + required string name = 1 [(gogoproto.nullable) = false]; + optional string value = 2; +} + + +/** + * Describes a Role. Roles can be used to specify that certain resources are + * reserved for the use of one or more frameworks. + */ +message Role { + required string name = 1 [(gogoproto.nullable) = false]; + required double weight = 2 [(gogoproto.nullable) = false]; + repeated FrameworkID frameworks = 3 [(gogoproto.nullable) = false]; + repeated Resource resources = 4 [(gogoproto.nullable) = false]; +} + + +/** + * Metric consists of a name and optionally its value. + */ +message Metric { + required string name = 1 [(gogoproto.nullable) = false]; + optional double value = 2; +} + + +/** + * Describes a File. + */ +message FileInfo { + // Absolute path to the file. + required string path = 1 [(gogoproto.nullable) = false]; + + // Number of hard links. + optional int32 nlink = 2; + + // Total size in bytes. + optional uint64 size = 3; + + // Last modification time. + optional TimeInfo mtime = 4; + + // Represents a file's mode and permission bits. The bits have the same + // definition on all systems and is portable. + optional uint32 mode = 5; + + // User ID of owner. + optional string uid = 6 [(gogoproto.customname) = "UID"]; + + // Group ID of owner. + optional string gid = 7 [(gogoproto.customname) = "GID"]; +} + + +/** + * Describes information abount a device. + */ +message Device { + message Number { + required uint64 major_number = 1; + required uint64 minor_number = 2; + } + + optional string path = 1; + optional Number number = 2; +} + + +/** + * Describes a device whitelist entry that expose from host to container. + */ +message DeviceAccess { + message Access { + optional bool read = 1; + optional bool write = 2; + optional bool mknod = 3; + } + required Device device = 1 [(gogoproto.nullable) = false]; + required Access access = 2 [(gogoproto.nullable) = false]; +} + + +message DeviceWhitelist { + repeated DeviceAccess allowed_devices = 1 [(gogoproto.nullable) = false]; +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/ranges.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/ranges.go new file mode 100644 index 00000000..d391e157 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/ranges.go @@ -0,0 +1,253 @@ +package mesos + +import ( + "sort" +) + +// Ranges represents a list of Ranges. +type Ranges []Value_Range + +// NewRanges returns squashed Ranges from the given numbers. +func NewRanges(ns ...uint64) Ranges { + xs := append(uint64s{}, ns...) + sort.Sort(xs) + rs := make(Ranges, len(xs)) + for i := range xs { + rs[i].Begin, rs[i].End = xs[i], xs[i] + } + return rs.Squash() +} + +// NewPortRanges returns Ranges from the "ports" resource in the +// given *Offer. If that resource isn't provided, nil will be returned. +// +// The returned Ranges are sorted and have all overlapping ranges merged from +// left to right. e.g. [[0, 5], [4, 3], [10, 7]] -> [[0, 5], [7, 10]] +func NewPortRanges(o *Offer) Ranges { + if o == nil { + return Ranges{} + } + + var ( + r Resource + found bool + ) + for i := range o.Resources { + if o.Resources[i].GetName() == "ports" { + r = o.Resources[i] + found = true + break + } + } + + if !found { + return Ranges{} + } + + offered := r.GetRanges().GetRange() + rs := make(Ranges, len(offered)) + for i, r := range offered { + if lo, hi := r.GetBegin(), r.GetEnd(); lo <= hi { + rs[i].Begin, rs[i].End = lo, hi + } else { + rs[i].Begin, rs[i].End = hi, lo + } + } + return rs.Sort().Squash() +} + +// These three methods implement sort.Interface +func (rs Ranges) Len() int { return len(rs) } +func (rs Ranges) Swap(i, j int) { rs[i], rs[j] = rs[j], rs[i] } +func (rs Ranges) Less(i, j int) bool { + return rs[i].Begin < rs[j].Begin || (rs[i].Begin == rs[j].Begin && rs[i].End < rs[j].End) +} + +// Size returns the sum of the Size of all Ranges. +func (rs Ranges) Size() uint64 { + var sz uint64 + for i := range rs { + sz += 1 + (rs[i].End - rs[i].Begin) + } + return sz +} + +// Sort sorts the receiving Ranges and returns the result; convenience +func (rs Ranges) Sort() Ranges { + sort.Sort(rs) + return rs +} + +// Squash merges overlapping and continuous Ranges. It assumes they're pre-sorted. +func (rs Ranges) Squash() Ranges { + if len(rs) < 2 { + return rs + } + squashed := Ranges{rs[0]} + for i := 1; i < len(rs); i++ { + switch max := squashed[len(squashed)-1].End; { + case 1+max < rs[i].Begin: // no overlap nor continuity: push + squashed = append(squashed, rs[i]) + case max <= rs[i].End: // overlap or continuity: squash + squashed[len(squashed)-1].End = rs[i].End + } + } + return squashed +} + +// Search performs a binary search for n returning the index of the Range it was +// found at or -1 if not found. +func (rs Ranges) Search(n uint64) int { + for lo, hi := 0, len(rs)-1; lo <= hi; { + switch m := lo + (hi-lo)/2; { + case n < rs[m].Begin: + hi = m - 1 + case n > rs[m].End: + lo = m + 1 + default: + return m + } + } + return -1 +} + +// Partition partitions Ranges around n. It returns the partitioned Ranges +// and a boolean indicating if n was found. +func (rs Ranges) Partition(n uint64) (Ranges, bool) { + i := rs.Search(n) + if i < 0 { + return rs, false + } + + pn := make(Ranges, 0, len(rs)+1) + switch pn = append(pn, rs[:i]...); { + case rs[i].Begin == rs[i].End: // delete + case rs[i].Begin == n: // increment lower bound + pn = append(pn, Value_Range{rs[i].Begin + 1, rs[i].End}) + case rs[i].End == n: // decrement upper bound + pn = append(pn, Value_Range{rs[i].Begin, rs[i].End - 1}) + default: // split + pn = append(pn, Value_Range{rs[i].Begin, n - 1}, Value_Range{n + 1, rs[i].End}) + } + return append(pn, rs[i+1:]...), true +} + +// Remove removes a range from already coalesced ranges. +// The algorithms constructs a new vector of ranges which is then +// Squash'ed into a Ranges instance. +func (rs Ranges) Remove(removal Value_Range) Ranges { + ranges := make([]Value_Range, 0, len(rs)) + for _, r := range rs { + // skip if the entire range is subsumed by removal + if r.Begin >= removal.Begin && r.End <= removal.End { + continue + } + // divide if the range subsumes the removal + if r.Begin < removal.Begin && r.End > removal.End { + ranges = append(ranges, + Value_Range{r.Begin, removal.Begin - 1}, + Value_Range{removal.End + 1, r.End}, + ) + continue + } + // add the full range if there's no intersection + if r.End < removal.Begin || r.Begin > removal.End { + ranges = append(ranges, r) + continue + } + // trim if the range does intersect + if r.End > removal.End { + ranges = append(ranges, Value_Range{removal.End + 1, r.End}) + } else { + if r.Begin >= removal.Begin { + // should never happen + panic("r.Begin >= removal.Begin") + } + ranges = append(ranges, Value_Range{r.Begin, removal.Begin - 1}) + } + } + return Ranges(ranges).Squash() +} + +// Compare assumes that both Ranges are already in sort-order. +// Returns 0 if rs and right are equivalent, -1 if rs is a subset of right, or else 1 +func (rs Ranges) Compare(right Ranges) int { + x, y, result := rs.equiv(right) + if result { + return 0 + } + for _, a := range x { + // make sure that this range is a subset of a range in y + matched := false + for _, b := range y { + if a.Begin >= b.Begin && a.End <= b.End { + matched = true + break + } + } + if !matched { + return 1 + } + } + return -1 +} + +// Equivalent assumes that both Ranges are already in sort-order. +func (rs Ranges) Equivalent(right Ranges) (result bool) { + _, _, result = rs.equiv(right) + return +} + +// Equivalent assumes that both Ranges are already in sort-order. +func (rs Ranges) equiv(right Ranges) (_, _ Ranges, _ bool) { + // we need to squash rs and right but don't want to change the originals + switch len(rs) { + case 0: + case 1: + rs = Ranges{rs[0]} + default: + rs = Ranges(append([]Value_Range{rs[0], rs[1]}, rs[2:]...)).Sort().Squash() + } + switch len(right) { + case 0: + case 1: + right = Ranges{right[0]} + default: + right = Ranges(append([]Value_Range{right[0], right[1]}, right[2:]...)).Sort().Squash() + } + return rs, right, (&Value_Ranges{Range: rs}).Equal(&Value_Ranges{Range: right}) +} + +func (rs Ranges) Clone() Ranges { + if len(rs) == 0 { + return nil + } + x := make(Ranges, len(rs)) + copy(x, rs) + return x +} + +// Min returns the minimum number in Ranges. It will panic on empty Ranges. +func (rs Ranges) Min() uint64 { return rs[0].Begin } + +// Max returns the maximum number in Ranges. It will panic on empty Ranges. +func (rs Ranges) Max() uint64 { return rs[len(rs)-1].End } + +// resource returns a *Resource with the given name and Ranges. +func (rs Ranges) resource(name string) Resource { + vr := make([]Value_Range, len(rs)) + copy(vr, rs) + return Resource{ + Name: name, + Type: RANGES.Enum(), + Ranges: &Value_Ranges{Range: vr}, + } +} + +// uint64s is an utility used to sort a slice of uint64s +type uint64s []uint64 + +// These three methods implement sort.Interface +func (ns uint64s) Len() int { return len(ns) } +func (ns uint64s) Less(i, j int) bool { return ns[i] < ns[j] } +func (ns uint64s) Swap(i, j int) { ns[i], ns[j] = ns[j], ns[i] } diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/BUILD new file mode 100644 index 00000000..468b7680 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "reader.go", + "strconv.go", + "writer.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio", + importpath = "github.com/mesos/mesos-go/api/v1/lib/recordio", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/mesos/mesos-go/api/v1/lib/debug:go_default_library", + "//vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/doc.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/doc.go new file mode 100644 index 00000000..bc5b095c --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/doc.go @@ -0,0 +1,5 @@ +// Package recordio implements the Mesos variant of RecordIO framing, whereby +// each record is prefixed by a line that indicates the length of the record in +// decimal ASCII. The bytes of the record immediately follow the length-line. +// Zero-length records are allowed. +package recordio diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/reader.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/reader.go new file mode 100644 index 00000000..b8d034e8 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/reader.go @@ -0,0 +1,145 @@ +package recordio + +import ( + "bufio" + "bytes" + "io" + + logger "github.com/mesos/mesos-go/api/v1/lib/debug" + "github.com/mesos/mesos-go/api/v1/lib/encoding/framing" +) + +const debug = logger.Logger(false) + +type ( + Opt func(*reader) + + reader struct { + *bufio.Scanner + pend int + splitf func(data []byte, atEOF bool) (int, []byte, error) + maxf int // max frame size + } +) + +// NewReader returns a reader that parses frames from a recordio stream. +func NewReader(read io.Reader, opt ...Opt) framing.Reader { + debug.Log("new frame reader") + r := &reader{Scanner: bufio.NewScanner(read)} + r.Split(func(data []byte, atEOF bool) (int, []byte, error) { + // Scanner panics if we invoke Split after scanning has started, + // use this proxy func as a work-around. + return r.splitf(data, atEOF) + }) + buf := make([]byte, 16*1024) + r.Buffer(buf, 1<<22) // 1<<22 == max protobuf size + r.splitf = r.splitSize + // apply options + for _, f := range opt { + if f != nil { + f(r) + } + } + return r +} + +// MaxMessageSize returns a functional option that configures the internal Scanner's buffer and max token (message) +// length, in bytes. +func MaxMessageSize(max int) Opt { + return func(r *reader) { + buf := make([]byte, max>>1) + r.Buffer(buf, max) + r.maxf = max + } +} + +func (r *reader) splitSize(data []byte, atEOF bool) (int, []byte, error) { + const maxTokenLength = 20 // textual length of largest uint64 number + if atEOF { + x := len(data) + switch { + case x == 0: + debug.Log("EOF and empty frame, returning io.EOF") + return 0, nil, io.EOF + case x < 2: // min frame size + debug.Log("remaining data less than min total frame length") + return 0, nil, framing.ErrorUnderrun + } + // otherwise, we may have a valid frame... + } + debug.Log("len(data)=", len(data)) + adv := 0 + for { + i := 0 + for ; i < maxTokenLength && i < len(data) && data[i] != '\n'; i++ { + } + debug.Log("i=", i) + if i == len(data) { + debug.Log("need more input") + return 0, nil, nil // need more input + } + if i == maxTokenLength && data[i] != '\n' { + debug.Log("frame size: max token length exceeded") + return 0, nil, framing.ErrorBadSize + } + n, err := ParseUintBytes(bytes.TrimSpace(data[:i]), 10, 64) + if err != nil { + debug.Log("failed to parse frame size field:", err) + return 0, nil, framing.ErrorBadSize + } + if r.maxf != 0 && int(n) > r.maxf { + debug.Log("frame size max length exceeded:", n) + return 0, nil, framing.ErrorOversizedFrame + } + if n == 0 { + // special case... don't invoke splitData, just parse the next size header + adv += i + 1 + data = data[i+1:] + continue + } + r.pend = int(n) + r.splitf = r.splitFrame + debug.Logf("split next frame: %d, %d", n, adv+i+1) + return adv + i + 1, data[:0], nil // returning a nil token screws up the Scanner, so return empty + } +} + +func (r *reader) splitFrame(data []byte, atEOF bool) (advance int, token []byte, err error) { + x := len(data) + debug.Log("splitFrame:x=", x, ",eof=", atEOF) + if atEOF { + if x < r.pend { + return 0, nil, framing.ErrorUnderrun + } + } + if r.pend == 0 { + panic("asked to read frame data, but no data left in frame") + } + if x < int(r.pend) { + // need more data + return 0, nil, nil + } + r.splitf = r.splitSize + adv := int(r.pend) + r.pend = 0 + return adv, data[:adv], nil +} + +// ReadFrame implements framing.Reader +func (r *reader) ReadFrame() (tok []byte, err error) { + for r.Scan() { + b := r.Bytes() + if len(b) == 0 { + continue + } + tok = b + debug.Log("len(tok)", len(tok)) + break + } + // either scan failed, or it succeeded and we have a token... + err = r.Err() + if err == nil && len(tok) == 0 { + err = io.EOF + } + return +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/strconv.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/strconv.go new file mode 100644 index 00000000..6e2b2681 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/strconv.go @@ -0,0 +1,117 @@ +/* +Copyright 2013 The Camlistore Authors + +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 recordio + +import ( + "errors" + "strconv" +) + +// ParseUintBytes is like strconv.ParseUint, but using a []byte. +func ParseUintBytes(s []byte, base int, bitSize int) (n uint64, err error) { + var cutoff, maxVal uint64 + + if bitSize == 0 { + bitSize = int(strconv.IntSize) + } + + s0 := s + switch { + case len(s) < 1: + err = strconv.ErrSyntax + goto Error + + case 2 <= base && base <= 36: + // valid base; nothing to do + + case base == 0: + // Look for octal, hex prefix. + switch { + case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'): + base = 16 + s = s[2:] + if len(s) < 1 { + err = strconv.ErrSyntax + goto Error + } + case s[0] == '0': + base = 8 + default: + base = 10 + } + + default: + err = errors.New("invalid base " + strconv.Itoa(base)) + goto Error + } + + n = 0 + cutoff = cutoff64(base) + maxVal = 1<= base { + n = 0 + err = strconv.ErrSyntax + goto Error + } + + if n >= cutoff { + // n*base overflows + n = 1<<64 - 1 + err = strconv.ErrRange + goto Error + } + n *= uint64(base) + + n1 := n + uint64(v) + if n1 < n || n1 > maxVal { + // n+v overflows + n = 1<<64 - 1 + err = strconv.ErrRange + goto Error + } + n = n1 + } + + return n, nil + +Error: + return n, &strconv.NumError{Func: "ParseUint", Num: string(s0), Err: err} +} + +// Return the first number n such that n*base >= 1<<64. +func cutoff64(base int) uint64 { + if base < 2 { + return 0 + } + return (1<<64-1)/uint64(base) + 1 +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/writer.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/writer.go new file mode 100644 index 00000000..085f967d --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio/writer.go @@ -0,0 +1,34 @@ +package recordio + +import ( + "io" + "strconv" +) + +var lf = []byte{'\n'} + +type Writer struct { + out io.Writer +} + +func NewWriter(out io.Writer) *Writer { + return &Writer{out} +} + +func (w *Writer) writeBuffer(b []byte, err error) error { + if err != nil { + return err + } + n, err := w.out.Write(b) + if err == nil && n != len(b) { + return io.ErrShortWrite + } + return err +} + +func (w *Writer) WriteFrame(b []byte) (err error) { + err = w.writeBuffer(([]byte)(strconv.Itoa(len(b))), err) + err = w.writeBuffer(lf, err) + err = w.writeBuffer(b, err) + return +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/resources.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/resources.go new file mode 100644 index 00000000..2c348030 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/resources.go @@ -0,0 +1,1145 @@ +package mesos + +import ( + "bytes" + "fmt" + "strconv" + + "github.com/gogo/protobuf/proto" + "github.com/mesos/mesos-go/api/v1/lib/roles" +) + +const DefaultRole = "*" + +type ( + Resources []Resource + resourceErrorType int + + resourceError struct { + errorType resourceErrorType + reason string + spec Resource + } +) + +const ( + resourceErrorTypeIllegalName resourceErrorType = iota + resourceErrorTypeIllegalType + resourceErrorTypeUnsupportedType + resourceErrorTypeIllegalScalar + resourceErrorTypeIllegalRanges + resourceErrorTypeIllegalSet + resourceErrorTypeIllegalDisk + resourceErrorTypeIllegalReservation + resourceErrorTypeIllegalShare + + noReason = "" // make error generation code more readable +) + +var ( + resourceErrorMessages = map[resourceErrorType]string{ + resourceErrorTypeIllegalName: "missing or illegal resource name", + resourceErrorTypeIllegalType: "missing or illegal resource type", + resourceErrorTypeUnsupportedType: "unsupported resource type", + resourceErrorTypeIllegalScalar: "illegal scalar resource", + resourceErrorTypeIllegalRanges: "illegal ranges resource", + resourceErrorTypeIllegalSet: "illegal set resource", + resourceErrorTypeIllegalDisk: "illegal disk resource", + resourceErrorTypeIllegalReservation: "illegal resource reservation", + resourceErrorTypeIllegalShare: "illegal shared resource", + } +) + +func (t resourceErrorType) Generate(reason string) error { + msg := resourceErrorMessages[t] + if reason != noReason { + if msg != "" { + msg += ": " + reason + } else { + msg = reason + } + } + return &resourceError{errorType: t, reason: msg} +} + +func (err *resourceError) Reason() string { return err.reason } +func (err *resourceError) Resource() Resource { return err.spec } +func (err *resourceError) WithResource(r Resource) { err.spec = r } + +func (err *resourceError) Error() string { + // TODO(jdef) include additional context here? (type, resource) + if err.reason != "" { + return "resource error: " + err.reason + } + return "resource error" +} + +func IsResourceError(err error) (ok bool) { + _, ok = err.(*resourceError) + return +} + +func (r *Resource_ReservationInfo) Assign() func(interface{}) { + return func(v interface{}) { + type reserver interface { + WithReservation(*Resource_ReservationInfo) + } + if ri, ok := v.(reserver); ok { + ri.WithReservation(r) + } + } +} + +func (resources Resources) Clone() Resources { + if resources == nil { + return nil + } + clone := make(Resources, 0, len(resources)) + for i := range resources { + rr := proto.Clone(&resources[i]).(*Resource) + clone = append(clone, *rr) + } + return clone +} + +// Minus calculates and returns the result of `resources - that` without modifying either +// the receiving `resources` or `that`. +func (resources Resources) Minus(that ...Resource) Resources { + x := resources.Clone() + return x.Subtract(that...) +} + +// Subtract subtracts `that` from the receiving `resources` and returns the result (the modified +// `resources` receiver). +func (resources *Resources) Subtract(that ...Resource) (rs Resources) { + if resources != nil { + if len(that) > 0 { + x := make(Resources, len(that)) + copy(x, that) + that = x + + for i := range that { + resources.Subtract1(that[i]) + } + } + rs = *resources + } + return +} + +// Plus calculates and returns the result of `resources + that` without modifying either +// the receiving `resources` or `that`. +func (resources Resources) Plus(that ...Resource) Resources { + x := resources.Clone() + return x.Add(that...) +} + +// Add adds `that` to the receiving `resources` and returns the result (the modified +// `resources` receiver). +func (resources *Resources) Add(that ...Resource) (rs Resources) { + if resources != nil { + rs = *resources + } + for i := range that { + rs = rs._add(that[i]) + } + if resources != nil { + *resources = rs + } + return +} + +// Add1 adds `that` to the receiving `resources` and returns the result (the modified +// `resources` receiver). +func (resources *Resources) Add1(that Resource) (rs Resources) { + if resources != nil { + rs = *resources + } + rs = rs._add(that) + if resources != nil { + *resources = rs + } + return +} + +func (resources Resources) _add(that Resource) Resources { + if that.Validate() != nil || that.IsEmpty() { + return resources + } + for i := range resources { + r := &resources[i] + if r.Addable(that) { + r.Add(that) + return resources + } + } + // cannot be combined with an existing resource + r := proto.Clone(&that).(*Resource) + return append(resources, *r) +} + +// Minus1 calculates and returns the result of `resources - that` without modifying either +// the receiving `resources` or `that`. +func (resources *Resources) Minus1(that Resource) Resources { + x := resources.Clone() + return x.Subtract1(that) +} + +// Subtract1 subtracts `that` from the receiving `resources` and returns the result (the modified +// `resources` receiver). +func (resources *Resources) Subtract1(that Resource) Resources { + if resources == nil { + return nil + } + if that.Validate() == nil && !that.IsEmpty() { + for i := range *resources { + r := &(*resources)[i] + if r.Subtractable(that) { + r.Subtract(that) + // remove the resource if it becomes invalid or zero. + // need to do validation in order to strip negative scalar + // resource objects. + if r.Validate() != nil || r.IsEmpty() { + // delete resource at i, without leaking an uncollectable Resource + // a, a[len(a)-1] = append(a[:i], a[i+1:]...), nil + (*resources), (*resources)[len((*resources))-1] = append((*resources)[:i], (*resources)[i+1:]...), Resource{} + } + break + } + } + } + return *resources +} + +// String returns a human-friendly representation of the resource collection using default formatting +// options (e.g. allocation-info is not rendered). For additional control over resource formatting see +// the Format func. +func (resources Resources) String() string { + return resources.Format() +} + +type ResourcesFormatOptions struct { + ShowAllocated bool // ShowAllocated when true will not display resource allocation info +} + +func (resources Resources) Format(options ...func(*ResourcesFormatOptions)) string { + if len(resources) == 0 { + return "" + } + var f ResourcesFormatOptions + for _, o := range options { + if o != nil { + o(&f) + } + } + // TODO(jdef) use a string.Builder once we can rely on a more modern golang version + buf := bytes.Buffer{} + for i := range resources { + if i > 0 { + buf.WriteString(";") + } + r := &resources[i] + buf.WriteString(r.Name) + if r.AllocationInfo != nil && f.ShowAllocated { + buf.WriteString("(allocated: ") + buf.WriteString(r.AllocationInfo.GetRole()) + buf.WriteString(")") + } + if res := r.Reservations; len(res) > 0 || (r.Role != nil && *r.Role != "*") { + if len(res) == 0 { + res = make([]Resource_ReservationInfo, 0, 1) + if r.Reservation == nil { + res = append(res, Resource_ReservationInfo{ + Type: Resource_ReservationInfo_STATIC.Enum(), + Role: r.Role, + }) + } else { + res = append(res, *r.Reservation) // copy! + res[0].Type = Resource_ReservationInfo_DYNAMIC.Enum() + res[0].Role = r.Role + } + } + buf.WriteString("(reservations: [") + for j := range res { + if j > 0 { + buf.WriteString(",") + } + rr := &res[j] + buf.WriteString("(") + buf.WriteString(rr.GetType().String()) + buf.WriteString(",") + buf.WriteString(rr.GetRole()) + if rr.Principal != nil { + buf.WriteString(",") + buf.WriteString(*rr.Principal) + } + if rr.Labels != nil { + buf.WriteString(",{") + rr.GetLabels().writeTo(&buf) + buf.WriteString("}") + } + buf.WriteString(")") + } + buf.WriteString("])") + } + if d := r.GetDisk(); d != nil { + buf.WriteString("[") + if s := d.GetSource(); s != nil { + switch s.GetType() { + case Resource_DiskInfo_Source_BLOCK: + buf.WriteString("BLOCK") + if id, profile := s.GetID(), s.GetProfile(); id != "" || profile != "" { + buf.WriteByte('(') + buf.WriteString(id) + buf.WriteByte(',') + buf.WriteString(profile) + buf.WriteByte(')') + } + case Resource_DiskInfo_Source_RAW: + buf.WriteString("RAW") + if id, profile := s.GetID(), s.GetProfile(); id != "" || profile != "" { + buf.WriteByte('(') + buf.WriteString(id) + buf.WriteByte(',') + buf.WriteString(profile) + buf.WriteByte(')') + } + case Resource_DiskInfo_Source_PATH: + buf.WriteString("PATH") + if id, profile := s.GetID(), s.GetProfile(); id != "" || profile != "" { + buf.WriteByte('(') + buf.WriteString(id) + buf.WriteByte(',') + buf.WriteString(profile) + buf.WriteByte(')') + } else if root := s.GetPath().GetRoot(); root != "" { + buf.WriteByte(':') + buf.WriteString(root) + } + case Resource_DiskInfo_Source_MOUNT: + buf.WriteString("MOUNT") + if id, profile := s.GetID(), s.GetProfile(); id != "" || profile != "" { + buf.WriteByte('(') + buf.WriteString(id) + buf.WriteByte(',') + buf.WriteString(profile) + buf.WriteByte(')') + } else if root := s.GetMount().GetRoot(); root != "" { + buf.WriteByte(':') + buf.WriteString(root) + } + } + } + if p := d.GetPersistence(); p != nil { + if d.GetSource() != nil { + buf.WriteString(",") + } + buf.WriteString(p.GetID()) + } + if v := d.GetVolume(); v != nil { + buf.WriteString(":") + vconfig := v.GetContainerPath() + if h := v.GetHostPath(); h != "" { + vconfig = h + ":" + vconfig + } + if m := v.Mode; m != nil { + switch *m { + case RO: + vconfig += ":ro" + case RW: + vconfig += ":rw" + default: + panic("unrecognized volume mode: " + m.String()) + } + } + buf.WriteString(vconfig) + } + buf.WriteString("]") + } + if r.Revocable != nil { + buf.WriteString("{REV}") + } + if r.Shared != nil { + buf.WriteString("") + } + buf.WriteString(":") + switch r.GetType() { + case SCALAR: + buf.WriteString(strconv.FormatFloat(r.GetScalar().GetValue(), 'f', -1, 64)) + case RANGES: + buf.WriteString("[") + ranges := Ranges(r.GetRanges().GetRange()) + for j := range ranges { + if j > 0 { + buf.WriteString(",") + } + if b, e := ranges[j].Begin, ranges[j].End; b == e { + buf.WriteString(strconv.FormatUint(b, 10)) + } else { + buf.WriteString(strconv.FormatUint(b, 10)) + buf.WriteString("-") + buf.WriteString(strconv.FormatUint(e, 10)) + } + } + buf.WriteString("]") + case SET: + buf.WriteString("{") + items := r.GetSet().GetItem() + for j := range items { + if j > 0 { + buf.WriteString(",") + } + buf.WriteString(items[j]) + } + buf.WriteString("}") + } + } + return buf.String() +} + +func (left *Resource) Validate() error { + if left.GetName() == "" { + return resourceErrorTypeIllegalName.Generate(noReason) + } + if _, ok := Value_Type_name[int32(left.GetType())]; !ok { + return resourceErrorTypeIllegalType.Generate(noReason) + } + switch left.GetType() { + case SCALAR: + if s := left.GetScalar(); s == nil || left.GetRanges() != nil || left.GetSet() != nil { + return resourceErrorTypeIllegalScalar.Generate(noReason) + } else if s.GetValue() < 0 { + return resourceErrorTypeIllegalScalar.Generate("value < 0") + } + case RANGES: + r := left.GetRanges() + if left.GetScalar() != nil || r == nil || left.GetSet() != nil { + return resourceErrorTypeIllegalRanges.Generate(noReason) + } + for i, rr := range r.GetRange() { + // ensure that ranges are not inverted + if rr.Begin > rr.End { + return resourceErrorTypeIllegalRanges.Generate("begin > end") + } + // ensure that ranges don't overlap (but not necessarily squashed) + for j := i + 1; j < len(r.GetRange()); j++ { + r2 := r.GetRange()[j] + if rr.Begin <= r2.Begin && r2.Begin <= rr.End { + return resourceErrorTypeIllegalRanges.Generate("overlapping ranges") + } + } + } + case SET: + s := left.GetSet() + if left.GetScalar() != nil || left.GetRanges() != nil || s == nil { + return resourceErrorTypeIllegalSet.Generate(noReason) + } + unique := make(map[string]struct{}, len(s.GetItem())) + for _, x := range s.GetItem() { + if _, found := unique[x]; found { + return resourceErrorTypeIllegalSet.Generate("duplicated elements") + } + unique[x] = struct{}{} + } + default: + return resourceErrorTypeUnsupportedType.Generate(noReason) + } + + // check for disk resource + if disk := left.GetDisk(); disk != nil { + if left.GetName() != "disk" { + return resourceErrorTypeIllegalDisk.Generate("DiskInfo should not be set for \"" + left.GetName() + "\" resource") + } + if s := disk.GetSource(); s != nil { + switch s.GetType() { + case Resource_DiskInfo_Source_PATH, + Resource_DiskInfo_Source_MOUNT: + // these only contain optional members + case Resource_DiskInfo_Source_BLOCK, + Resource_DiskInfo_Source_RAW: + // TODO(jdef): update w/ validation once the format of BLOCK and RAW + // disks is known. + case Resource_DiskInfo_Source_UNKNOWN: + return resourceErrorTypeIllegalDisk.Generate(fmt.Sprintf("unsupported DiskInfo.Source.Type in %q", s)) + } + } + } + + if rs := left.GetReservations(); len(rs) == 0 { + // check for "pre-reservation-refinement" format + if _, err := roles.Parse(left.GetRole()); err != nil { + return resourceErrorTypeIllegalReservation.Generate(err.Error()) + } + + if r := left.GetReservation(); r != nil { + if r.Type != nil { + return resourceErrorTypeIllegalReservation.Generate( + "Resource.ReservationInfo.type must not be set for the Resource.reservation field") + } + if r.Role != nil { + return resourceErrorTypeIllegalReservation.Generate( + "Resource.ReservationInfo.role must not be set for the Resource.reservation field") + } + // check for invalid state of (role,reservation) pair + if left.GetRole() == "*" { + return resourceErrorTypeIllegalReservation.Generate("default role cannot be dynamically reserved") + } + } + } else { + // check for "post-reservation-refinement" format + for i := range rs { + r := &rs[i] + if r.Type == nil { + return resourceErrorTypeIllegalReservation.Generate( + "Resource.ReservationInfo.type must be set") + } + if r.Role == nil { + return resourceErrorTypeIllegalReservation.Generate( + "Resource.ReservationInfo.role must be set") + } + if _, err := roles.Parse(r.GetRole()); err != nil { + return resourceErrorTypeIllegalReservation.Generate(err.Error()) + } + if r.GetRole() == "*" { + return resourceErrorTypeIllegalReservation.Generate( + "role '*' cannot be reserved") + } + } + // check that reservations are correctly refined + ancestor := rs[0].GetRole() + for i := 1; i < len(rs); i++ { + r := &rs[i] + if r.GetType() == Resource_ReservationInfo_STATIC { + return resourceErrorTypeIllegalReservation.Generate( + "a refined reservation cannot be STATIC") + } + child := r.GetRole() + if !roles.IsStrictSubroleOf(child, ancestor) { + return resourceErrorTypeIllegalReservation.Generate(fmt.Sprintf( + "role %q is not a refinement of %q", child, ancestor)) + } + } + + // Additionally, we allow the "pre-reservation-refinement" format to be set + // as long as there is only one reservation, and the `Resource.role` and + // `Resource.reservation` fields are consistent with the reservation. + if len(rs) == 1 { + if r := left.Role; r != nil && *r != rs[0].GetRole() { + return resourceErrorTypeIllegalReservation.Generate(fmt.Sprintf( + "'Resource.role' field with %q does not match the role %q in 'Resource.reservations'", + *r, rs[0].GetRole())) + } + + switch rs[0].GetType() { + case Resource_ReservationInfo_STATIC: + if left.Reservation != nil { + return resourceErrorTypeIllegalReservation.Generate( + "'Resource.reservation' must not be set if the single reservation in 'Resource.reservations' is STATIC") + } + case Resource_ReservationInfo_DYNAMIC: + if (left.Role == nil) != (left.GetReservation() == nil) { + return resourceErrorTypeIllegalReservation.Generate( + "'Resource.role' and 'Resource.reservation' must both be set or both not be set if the single reservation in 'Resource.reservations' is DYNAMIC") + } + if r := left.GetReservation(); r != nil && r.GetPrincipal() != rs[0].GetPrincipal() { + return resourceErrorTypeIllegalReservation.Generate(fmt.Sprintf( + "'Resource.reservation.principal' with %q does not match the principal %q in 'Resource.reservations'", + r.GetPrincipal(), rs[0].GetPrincipal())) + } + if r := left.GetReservation(); r != nil && !r.GetLabels().Equivalent(rs[0].GetLabels()) { + return resourceErrorTypeIllegalReservation.Generate(fmt.Sprintf( + "'Resource.reservation.labels' with %q does not match the labels %q in 'Resource.reservations'", + r.GetLabels(), rs[0].GetLabels())) + } + case Resource_ReservationInfo_UNKNOWN: + return resourceErrorTypeIllegalReservation.Generate("Unsupported 'Resource.ReservationInfo.type'") + } + } else { + if r := left.Role; r != nil { + return resourceErrorTypeIllegalReservation.Generate( + "'Resource.role' must not be set if there is more than one reservation in 'Resource.reservations'") + } + if r := left.GetReservation(); r != nil { + return resourceErrorTypeIllegalReservation.Generate( + "'Resource.reservation' must not be set if there is more than one reservation in 'Resource.reservations'") + } + } + } + + // Check that shareability is enabled for supported resource types. + // For now, it is for persistent volumes only. + // NOTE: We need to modify this once we extend shareability to other + // resource types. + if s := left.GetShared(); s != nil { + if left.GetName() != "disk" { + return resourceErrorTypeIllegalShare.Generate(fmt.Sprintf( + "Resource %q cannot be shared", left.GetName())) + } + if p := left.GetDisk().GetPersistence(); p == nil { + return resourceErrorTypeIllegalShare.Generate("only persistent volumes can be shared") + } + } + + return nil +} + +func (left *Resource_AllocationInfo) Equivalent(right *Resource_AllocationInfo) bool { + if (left == nil) != (right == nil) { + return false + } else if left == nil { + return true + } + if (left.Role == nil) != (right.Role == nil) { + return false + } + if left.Role != nil && *left.Role != *right.Role { + return false + } + return true +} + +func (r *Resource_ReservationInfo) Equivalent(right *Resource_ReservationInfo) bool { + // TODO(jdef) should we consider equivalency of both pre- and post-refinement formats, + // such that a pre-refinement format could be the equivalent of a post-refinement format + // if defined just the right way? + if (r == nil) != (right == nil) { + return false + } else if r == nil { + return true + } + if (r.Type == nil) != (right.Type == nil) { + return false + } + if r.Type != nil && *r.Type != *right.Type { + return false + } + if (r.Role == nil) != (right.Role == nil) { + return false + } + if r.Role != nil && *r.Role != *right.Role { + return false + } + if (r.Principal == nil) != (right.Principal == nil) { + return false + } + if r.Principal != nil && *r.Principal != *right.Principal { + return false + } + return r.Labels.Equivalent(right.Labels) +} + +func (left *Resource_DiskInfo) Equivalent(right *Resource_DiskInfo) bool { + // NOTE: We ignore 'volume' inside DiskInfo when doing comparison + // because it describes how this resource will be used which has + // nothing to do with the Resource object itself. A framework can + // use this resource and specify different 'volume' every time it + // uses it. + // see https://github.com/apache/mesos/blob/0.25.0/src/common/resources.cpp#L67 + if (left == nil) != (right == nil) { + return false + } + + if a, b := left.GetSource(), right.GetSource(); (a == nil) != (b == nil) { + return false + } else if a != nil { + if a.GetType() != b.GetType() { + return false + } + if aa, bb := a.GetMount(), b.GetMount(); (aa == nil) != (bb == nil) { + return false + } else if aa.GetRoot() != bb.GetRoot() { + return false + } + if aa, bb := a.GetPath(), b.GetPath(); (aa == nil) != (bb == nil) { + return false + } else if aa.GetRoot() != bb.GetRoot() { + return false + } + if aa, bb := a.GetID(), b.GetID(); aa != bb { + return false + } + if aa, bb := a.GetProfile(), b.GetProfile(); aa != bb { + return false + } + if aa, bb := a.GetMetadata(), b.GetMetadata(); (aa == nil) != (bb == nil) { + return false + } else if !labelList(aa.GetLabels()).Equivalent(labelList(bb.GetLabels())) { + return false + } + } + + if a, b := left.GetPersistence(), right.GetPersistence(); (a == nil) != (b == nil) { + return false + } else if a != nil { + return a.GetID() == b.GetID() + } + + return true +} + +// Equivalent returns true if right is equivalent to left (differs from Equal in that +// deeply nested values are test for equivalence, not equality). +func (left *Resource) Equivalent(right Resource) bool { + if left == nil { + return right.IsEmpty() + } + if left.GetName() != right.GetName() || + left.GetType() != right.GetType() || + left.GetRole() != right.GetRole() { + return false + } + if a, b := left.GetAllocationInfo(), right.GetAllocationInfo(); !a.Equivalent(b) { + return false + } + if a, b := left.GetReservations(), right.GetReservations(); len(a) != len(b) { + return false + } else { + for i := range a { + ri := &a[i] + if !ri.Equivalent(&b[i]) { + return false + } + } + } + if !left.GetReservation().Equivalent(right.GetReservation()) { + return false + } + if !left.GetDisk().Equivalent(right.GetDisk()) { + return false + } + if (left.Revocable == nil) != (right.Revocable == nil) { + return false + } + if a, b := left.ProviderID, right.ProviderID; (a == nil) != (b == nil) { + return false + } else if a != nil && a.Value != b.Value { + return false + } + if a, b := left.Shared, right.Shared; (a == nil) != (b == nil) { + return false + } + + switch left.GetType() { + case SCALAR: + return left.GetScalar().Compare(right.GetScalar()) == 0 + case RANGES: + return Ranges(left.GetRanges().GetRange()).Equivalent(right.GetRanges().GetRange()) + case SET: + return left.GetSet().Compare(right.GetSet()) == 0 + default: + return false + } +} + +// Addable tests if we can add two Resource objects together resulting in one +// valid Resource object. For example, two Resource objects with +// different name, type or role are not addable. +func (left *Resource) Addable(right Resource) bool { + if left == nil { + return true + } + if left.GetName() != right.GetName() || + left.GetType() != right.GetType() || + left.GetRole() != right.GetRole() { + return false + } + + if a, b := left.GetShared(), right.GetShared(); (a == nil) != (b == nil) { + // shared has no fields + return false + } + + if a, b := left.GetAllocationInfo(), right.GetAllocationInfo(); !a.Equivalent(b) { + return false + } + + if !left.GetReservation().Equivalent(right.GetReservation()) { + return false + } + + if a, b := left.Reservations, right.Reservations; len(a) != len(b) { + return false + } else { + for i := range a { + aa := &a[i] + if !aa.Equivalent(&b[i]) { + return false + } + } + } + + if !left.GetDisk().Equivalent(right.GetDisk()) { + return false + } + + if ls := left.GetDisk().GetSource(); ls != nil { + switch ls.GetType() { + case Resource_DiskInfo_Source_PATH: + // Two PATH resources can be added if their disks are identical + case Resource_DiskInfo_Source_BLOCK, + Resource_DiskInfo_Source_MOUNT: + // Two resources that represent exclusive 'MOUNT' or 'RAW' disks + // cannot be added together; this would defeat the exclusivity. + return false + case Resource_DiskInfo_Source_RAW: + // We can only add resources representing 'RAW' disks if + // they have no identity or are identical. + if ls.GetID() != "" { + return false + } + case Resource_DiskInfo_Source_UNKNOWN: + panic("unreachable") + } + } + + // from apache/mesos: src/common/resources.cpp + // TODO(jieyu): Even if two Resource objects with DiskInfo have the + // same persistence ID, they cannot be added together. In fact, this + // shouldn't happen if we do not add resources from different + // namespaces (e.g., across slave). Consider adding a warning. + if left.GetDisk().GetPersistence() != nil { + return false + } + if (left.GetRevocable() == nil) != (right.GetRevocable() == nil) { + return false + } + if a, b := left.GetProviderID(), right.GetProviderID(); (a == nil) != (b == nil) { + return false + } else if a != nil && a.Value != b.Value { + return false + } + return true +} + +// Subtractable tests if we can subtract "right" from "left" resulting in one +// valid Resource object. For example, two Resource objects with different +// name, type or role are not subtractable. +// NOTE: Set subtraction is always well defined, it does not require +// 'right' to be contained within 'left'. For example, assuming that +// "left = {1, 2}" and "right = {2, 3}", "left" and "right" are +// subtractable because "left - right = {1}". However, "left" does not +// contain "right". +func (left *Resource) Subtractable(right Resource) bool { + if left.GetName() != right.GetName() || + left.GetType() != right.GetType() || + left.GetRole() != right.GetRole() { + return false + } + if a, b := left.GetShared(), right.GetShared(); (a == nil) != (b == nil) { + // shared has no fields + return false + } + + if a, b := left.GetAllocationInfo(), right.GetAllocationInfo(); !a.Equivalent(b) { + return false + } + + if !left.GetReservation().Equivalent(right.GetReservation()) { + return false + } + if a, b := left.Reservations, right.Reservations; len(a) != len(b) { + return false + } else { + for i := range a { + aa := &a[i] + if !aa.Equivalent(&b[i]) { + return false + } + } + } + + if !left.GetDisk().Equivalent(right.GetDisk()) { + return false + } + + if ls := left.GetDisk().GetSource(); ls != nil { + switch ls.GetType() { + case Resource_DiskInfo_Source_PATH: + // Two PATH resources can be subtracted if their disks are identical + case Resource_DiskInfo_Source_BLOCK, + Resource_DiskInfo_Source_MOUNT: + // Two resources that represent exclusive 'MOUNT' or 'RAW' disks + // cannot be substracted from each other if they are not the same; + // this would defeat the exclusivity. + if !left.Equivalent(right) { + return false + } + case Resource_DiskInfo_Source_RAW: + // We can only add resources representing 'RAW' disks if + // they have no identity or refer to the same disk. + if ls.GetID() != "" && !left.Equivalent(right) { + return false + } + case Resource_DiskInfo_Source_UNKNOWN: + panic("unreachable") + } + } + + // NOTE: For Resource objects that have DiskInfo, we can only do + // subtraction if they are **equal**. + if left.GetDisk().GetPersistence() != nil && !left.Equivalent(right) { + return false + } + if (left.GetRevocable() == nil) != (right.GetRevocable() == nil) { + return false + } + if a, b := left.GetProviderID(), right.GetProviderID(); (a == nil) != (b == nil) { + return false + } else if a != nil && a.Value != b.Value { + return false + } + return true +} + +// Contains tests if "right" is contained in "left". +func (left Resource) Contains(right Resource) bool { + if !left.Subtractable(right) { + return false + } + switch left.GetType() { + case SCALAR: + return right.GetScalar().Compare(left.GetScalar()) <= 0 + case RANGES: + return right.GetRanges().Compare(left.GetRanges()) <= 0 + case SET: + return right.GetSet().Compare(left.GetSet()) <= 0 + default: + return false + } +} + +// Subtract removes right from left. +// This func panics if the resource types don't match. +func (left *Resource) Subtract(right Resource) { + switch right.checkType(left.GetType()) { + case SCALAR: + left.Scalar = left.GetScalar().Subtract(right.GetScalar()) + case RANGES: + left.Ranges = left.GetRanges().Subtract(right.GetRanges()) + case SET: + left.Set = left.GetSet().Subtract(right.GetSet()) + } +} + +// Add adds right to left. +// This func panics if the resource types don't match. +func (left *Resource) Add(right Resource) { + switch right.checkType(left.GetType()) { + case SCALAR: + left.Scalar = left.GetScalar().Add(right.GetScalar()) + case RANGES: + left.Ranges = left.GetRanges().Add(right.GetRanges()) + case SET: + left.Set = left.GetSet().Add(right.GetSet()) + } +} + +// checkType panics if the type of this resources != t +func (left *Resource) checkType(t Value_Type) Value_Type { + if left != nil && left.GetType() != t { + panic(fmt.Sprintf("expected type %v instead of %v", t, left.GetType())) + } + return t +} + +// IsEmpty returns true if the value of this resource is equivalent to the zero-value, +// where a zero-length slice or map is equivalent to a nil reference to such. +func (left *Resource) IsEmpty() bool { + if left == nil { + return true + } + switch left.GetType() { + case SCALAR: + return left.GetScalar().GetValue() == 0 + case RANGES: + return len(left.GetRanges().GetRange()) == 0 + case SET: + return len(left.GetSet().GetItem()) == 0 + } + return false +} + +// IsUnreserved returns true if this resource neither statically or dynamically reserved. +// A resource is considered statically reserved if it has a non-default role. +func (left *Resource) IsUnreserved() bool { + // role != RoleDefault -> static reservation + // GetReservation() != nil -> dynamic reservation + // return {no-static-reservation} && {no-dynamic-reservation} + return (left.Role == nil || left.GetRole() == "*") && left.GetReservation() == nil && len(left.GetReservations()) == 0 +} + +// IsReserved returns true if this resource has been reserved for the given role. +// If role=="" then return true if there are no static or dynamic reservations for this resource. +// It's expected that this Resource has already been validated (see Validate). +func (left *Resource) IsReserved(role string) bool { + return !left.IsUnreserved() && (role == "" || role == left.ReservationRole()) +} + +// ReservationRole returns the role for which the resource is reserved. Callers should check the +// reservation status of the resource via IsReserved prior to invoking this func. +func (r *Resource) ReservationRole() string { + // if using reservation refinement, return the role of the last refinement + rs := r.GetReservations() + if x := len(rs); x > 0 { + return rs[x-1].GetRole() + } + // if using the old reservation API, role is a first class field of Resource + // (and it's never stored in Resource.Reservation). + return r.GetRole() +} + +// IsAllocatableTo returns true if the resource may be allocated to the given role. +func (left *Resource) IsAllocatableTo(role string) bool { + if left.IsUnreserved() { + return true + } + r := left.ReservationRole() + return role == r || roles.IsStrictSubroleOf(role, r) +} + +// IsDynamicallyReserved returns true if this resource has a non-nil reservation descriptor +func (left *Resource) IsDynamicallyReserved() bool { + if left.IsReserved("") { + if left.GetReservation() != nil { + return true + } + rs := left.GetReservations() + return rs[len(rs)-1].GetType() == Resource_ReservationInfo_DYNAMIC + } + return false +} + +// IsRevocable returns true if this resource has a non-nil revocable descriptor +func (left *Resource) IsRevocable() bool { + return left.GetRevocable() != nil +} + +// IsPersistentVolume returns true if this is a disk resource with a non-nil Persistence descriptor +func (left *Resource) IsPersistentVolume() bool { + return left.GetDisk().GetPersistence() != nil +} + +// IsDisk returns true if this is a disk resource of the specified type. +func (left *Resource) IsDisk(t Resource_DiskInfo_Source_Type) bool { + if s := left.GetDisk().GetSource(); s != nil { + return s.GetType() == t + } + return false +} + +// HasResourceProvider returns true if the given Resource object is provided by a resource provider. +func (left *Resource) HasResourceProvider() bool { + return left.GetProviderID() != nil +} + +// ToUnreserved returns a (cloned) view of the Resources w/o any reservation data. It does not modify +// the receiver. +func (rs Resources) ToUnreserved() (result Resources) { + if rs == nil { + return nil + } + for i := range rs { + r := rs[i] // intentionally shallow-copy + r.Reservations = nil + r.Reservation = nil + r.Role = nil + result.Add1(r) + } + return +} + +// PushReservation returns a cloned set of Resources w/ the given resource refinement. +// Panics if resources become invalid as a result of pushing the reservation (e.g. pre- and post- +// refinement modes are mixed). +func (rs Resources) PushReservation(ri Resource_ReservationInfo) (result Resources) { +push_next: + for i := range rs { + if rs[i].IsEmpty() { + continue + } + r := proto.Clone(&rs[i]).(*Resource) // we don't want to impact rs + r.Reservations = append(r.Reservations, *(proto.Clone(&ri).(*Resource_ReservationInfo))) + + if err := r.Validate(); err != nil { + panic(err) + } + + // unroll Add1 to avoid additional calls to Clone + rr := *r + for j := range result { + r2 := &result[j] + if r2.Addable(rr) { + r2.Add(rr) + continue push_next + } + } + // cannot be combined with an existing resource + result = append(result, rr) + } + return +} + +// PopReservation returns a cloned set of Resources wherein the most recent reservation refeinement has been +// removed. Panics if for any resource in the collection there is no "last refinement" to remove. +func (rs Resources) PopReservation() (result Resources) { +pop_next: + for i := range rs { + r := &rs[i] + ls := len(r.Reservations) + if ls == 0 { + panic(fmt.Sprintf("no reservations exist for resource %q", r)) + } + + r = proto.Clone(r).(*Resource) // avoid modifying rs + r.Reservations[ls-1] = Resource_ReservationInfo{} // don't leak nested pointers + r.Reservations = r.Reservations[:ls-1] // shrink the slice + + // unroll Add1 to avoid additional calls to Clone + rr := *r + for j := range result { + r2 := &result[j] + if r2.Addable(rr) { + r2.Add(rr) + continue pop_next + } + } + + // cannot be combined with an existing resource + result = append(result, rr) + } + return +} + +// Allocate sets the AllocationInfo for the resource, panics if role is "". +func (r *Resource) Allocate(role string) { + if role == "" { + panic(fmt.Sprintf("cannot allocate resource to an empty-string role: %q", r)) + } + r.AllocationInfo = &Resource_AllocationInfo{Role: &role} +} + +// Unallocate clears the AllocationInfo for the resource. +func (r *Resource) Unallocate() { + r.AllocationInfo = nil +} + +// Allocate sets the AllocationInfo for all the resources. +// Returns a reference to the receiver to allow for chaining. +func (rs Resources) Allocate(role string) Resources { + if role == "" { + panic(fmt.Sprintf("cannot allocate resources to an empty-string role: %q", rs)) + } + for i := range rs { + rs[i].AllocationInfo = &Resource_AllocationInfo{Role: &role} + } + return rs +} + +// Unallocate clears the AllocationInfo for all the resources. +// Returns a reference to the receiver to allow for chaining. +func (rs Resources) Unallocate() Resources { + for i := range rs { + rs[i].AllocationInfo = nil + } + return rs +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/roles/BUILD b/vendor/github.com/mesos/mesos-go/api/v1/lib/roles/BUILD new file mode 100644 index 00000000..6272de06 --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/roles/BUILD @@ -0,0 +1,23 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["role.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/roles", + importpath = "github.com/mesos/mesos-go/api/v1/lib/roles", + visibility = ["//visibility:public"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/roles/role.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/roles/role.go new file mode 100644 index 00000000..b6075f8d --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/roles/role.go @@ -0,0 +1,82 @@ +package roles + +import ( + "fmt" + "strings" + "unicode" +) + +// Role is a deprecated type. +type Role string + +const defaultRole = Role("*") + +func (r Role) IsDefault() bool { + return r == defaultRole +} + +func (r Role) Assign() func(interface{}) { + return func(v interface{}) { + type roler interface { + WithRole(string) + } + if ri, ok := v.(roler); ok { + ri.WithRole(string(r)) + } + } +} + +func (r Role) Proto() *string { + s := string(r) + return &s +} + +// IsStrictSubroleOf returns true if left is a strict subrole of right. +func IsStrictSubroleOf(left, right string) bool { + return len(left) > len(right) && left[len(right)] == '/' && strings.HasPrefix(left, right) +} + +var illegalComponents = map[string]struct{}{ + ".": struct{}{}, + "..": struct{}{}, + "*": struct{}{}, +} + +func Parse(s string) (string, error) { + if s == string(defaultRole) { + return s, nil + } + if strings.HasPrefix(s, "/") { + return "", fmt.Errorf("role %q cannot start with a slash", s) + } + if strings.HasSuffix(s, "/") { + return "", fmt.Errorf("role %q cannot end with a slash", s) + } + + // validate each component in the role path + for _, part := range strings.Split(s, "/") { + if part == "" { + return "", fmt.Errorf("role %q cannot contain two adjacent slashes", s) + } + if bad, found := illegalComponents[part]; found { + return "", fmt.Errorf("role %q cannot contain %q as a component", s, bad) + } + if strings.HasPrefix(part, "-") { + return "", fmt.Errorf("role component %q is invalid because it begins with a dash", part) + } + if strings.IndexFunc(part, func(r rune) bool { return unicode.IsSpace(r) || unicode.IsControl(r) }) > -1 { + return "", fmt.Errorf("role component %q is invalid because it contains backspace or whitespace", part) + } + } + return s, nil +} + +func Validate(roles ...string) error { + for i := range roles { + _, err := Parse(roles[i]) + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/mesos/mesos-go/api/v1/lib/values.go b/vendor/github.com/mesos/mesos-go/api/v1/lib/values.go new file mode 100644 index 00000000..ae46905e --- /dev/null +++ b/vendor/github.com/mesos/mesos-go/api/v1/lib/values.go @@ -0,0 +1,142 @@ +package mesos + +func (left *Value_Scalar) Compare(right *Value_Scalar) int { + var ( + a = convertToFixed64(left.GetValue()) + b = convertToFixed64(right.GetValue()) + ) + if a < b { + return -1 + } + if a > b { + return 1 + } + return 0 +} + +func (left *Value_Ranges) Compare(right *Value_Ranges) int { + return Ranges(left.GetRange()).Compare(right.GetRange()) +} + +func (left *Value_Set) Compare(right *Value_Set) int { + i, j := left.GetItem(), right.GetItem() + if len(i) <= len(j) { + b := make(map[string]struct{}, len(j)) + for _, x := range j { + b[x] = struct{}{} + } + // make sure that each item on the left exists on the right, + // otherwise left is not a subset of right. + a := make(map[string]struct{}, len(i)) + for _, x := range i { + if _, ok := b[x]; !ok { + return 1 + } + a[x] = struct{}{} + } + // if every item on the right also exists on the left, then + // the sets are equal, otherwise left < right + for x := range b { + if _, ok := a[x]; !ok { + return -1 + } + } + return 0 + } + return 1 +} + +func (left *Value_Set) Add(right *Value_Set) *Value_Set { + lefty := left.GetItem() + righty := right.GetItem() + c := len(lefty) + len(righty) + if c == 0 { + return nil + } + m := make(map[string]struct{}, c) + for _, v := range lefty { + m[v] = struct{}{} + } + for _, v := range righty { + m[v] = struct{}{} + } + x := make([]string, 0, len(m)) + for v := range m { + x = append(x, v) + } + return &Value_Set{Item: x} +} + +func (left *Value_Set) Subtract(right *Value_Set) *Value_Set { + // for each item in right, remove it from left + lefty := left.GetItem() + righty := right.GetItem() + if c := len(lefty); c == 0 { + return nil + } else if len(righty) == 0 { + x := make([]string, c) + copy(x, lefty) + return &Value_Set{Item: x} + } + + a := make(map[string]struct{}, len(lefty)) + for _, x := range lefty { + a[x] = struct{}{} + } + for _, x := range righty { + delete(a, x) + } + if len(a) == 0 { + return nil + } + i := 0 + for k := range a { + lefty[i] = k + i++ + } + return &Value_Set{Item: lefty[:len(a)]} +} + +func (left *Value_Ranges) Add(right *Value_Ranges) *Value_Ranges { + a, b := Ranges(left.GetRange()), Ranges(right.GetRange()) + c := len(a) + len(b) + if c == 0 { + return nil + } + x := make(Ranges, c) + if len(a) > 0 { + copy(x, a) + } + if len(b) > 0 { + copy(x[len(a):], b) + } + return &Value_Ranges{ + Range: x.Sort().Squash(), + } +} + +func (left *Value_Ranges) Subtract(right *Value_Ranges) *Value_Ranges { + a, b := Ranges(left.GetRange()), Ranges(right.GetRange()) + if len(a) > 1 { + x := make(Ranges, len(a)) + copy(x, a) + a = x.Sort().Squash() + } + for _, r := range b { + a = a.Remove(r) + } + if len(a) == 0 { + return nil + } + return &Value_Ranges{Range: a} +} + +func (left *Value_Scalar) Add(right *Value_Scalar) *Value_Scalar { + sum := convertToFixed64(left.GetValue()) + convertToFixed64(right.GetValue()) + return &Value_Scalar{Value: convertToFloat64(sum)} +} + +func (left *Value_Scalar) Subtract(right *Value_Scalar) *Value_Scalar { + diff := convertToFixed64(left.GetValue()) - convertToFixed64(right.GetValue()) + return &Value_Scalar{Value: convertToFloat64(diff)} +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/BUILD index b9370c1e..32e0b736 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/BUILD @@ -3,43 +3,31 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ - "console.go", + "capabilities_linux.go", + "console_linux.go", "container.go", + "container_linux.go", + "criu_opts_linux.go", "error.go", "factory.go", + "factory_linux.go", "generic_error.go", + "init_linux.go", + "message_linux.go", + "network_linux.go", + "notify_linux.go", "process.go", + "process_linux.go", + "restored_process.go", + "rootfs_linux.go", + "setns_init_linux.go", + "standard_init_linux.go", + "state_linux.go", "stats.go", + "stats_linux.go", "sync.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux_amd64": [ - "capabilities_linux.go", - "compat_1.5_linux.go", - "console_linux.go", - "container_linux.go", - "criu_opts_linux.go", - "factory_linux.go", - "init_linux.go", - "message_linux.go", - "network_linux.go", - "notify_linux.go", - "process_linux.go", - "restored_process.go", - "rootfs_linux.go", - "setgroups_linux.go", - "setns_init_linux.go", - "standard_init_linux.go", - "state_linux.go", - "stats_linux.go", - ], - "@io_bazel_rules_go//go/platform:windows_amd64": [ - "console_windows.go", - "container_windows.go", - "criu_opts_windows.go", - "stats_windows.go", - ], - "//conditions:default": [], - }), + ], + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer", importpath = "github.com/opencontainers/runc/libcontainer", visibility = ["//visibility:public"], deps = [ @@ -47,19 +35,20 @@ go_library( "//vendor/github.com/opencontainers/runc/libcontainer/stacktrace:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/utils:go_default_library", ] + select({ - "@io_bazel_rules_go//go/platform:linux_amd64": [ - "//vendor/github.com/docker/docker/pkg/mount:go_default_library", - "//vendor/github.com/docker/docker/pkg/symlink:go_default_library", + "@io_bazel_rules_go//go/platform:linux": [ + "//vendor/github.com/containerd/console:go_default_library", + "//vendor/github.com/cyphar/filepath-securejoin:go_default_library", "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/mrunalp/fileutils:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/apparmor:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/rootless:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs/validate:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/criurpc:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/intelrdt:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/keys:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/mount:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/seccomp:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/system:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/user:go_default_library", @@ -89,7 +78,9 @@ filegroup( "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:all-srcs", "//vendor/github.com/opencontainers/runc/libcontainer/configs:all-srcs", "//vendor/github.com/opencontainers/runc/libcontainer/criurpc:all-srcs", + "//vendor/github.com/opencontainers/runc/libcontainer/intelrdt:all-srcs", "//vendor/github.com/opencontainers/runc/libcontainer/keys:all-srcs", + "//vendor/github.com/opencontainers/runc/libcontainer/mount:all-srcs", "//vendor/github.com/opencontainers/runc/libcontainer/seccomp:all-srcs", "//vendor/github.com/opencontainers/runc/libcontainer/stacktrace:all-srcs", "//vendor/github.com/opencontainers/runc/libcontainer/system:all-srcs", diff --git a/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md b/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md index e5894c64..4363b6f9 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md +++ b/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md @@ -154,6 +154,90 @@ that no processes or threads escape the cgroups. This sync is done via a pipe ( specified in the runtime section below ) that the container's init process will block waiting for the parent to finish setup. +### IntelRdt + +Intel platforms with new Xeon CPU support Intel Resource Director Technology +(RDT). Cache Allocation Technology (CAT) is a sub-feature of RDT, which +currently supports L3 cache resource allocation. + +This feature provides a way for the software to restrict cache allocation to a +defined 'subset' of L3 cache which may be overlapping with other 'subsets'. +The different subsets are identified by class of service (CLOS) and each CLOS +has a capacity bitmask (CBM). + +It can be used to handle L3 cache resource allocation for containers if +hardware and kernel support Intel RDT/CAT. + +In Linux 4.10 kernel or newer, the interface is defined and exposed via +"resource control" filesystem, which is a "cgroup-like" interface. + +Comparing with cgroups, it has similar process management lifecycle and +interfaces in a container. But unlike cgroups' hierarchy, it has single level +filesystem layout. + +Intel RDT "resource control" filesystem hierarchy: +``` +mount -t resctrl resctrl /sys/fs/resctrl +tree /sys/fs/resctrl +/sys/fs/resctrl/ +|-- info +| |-- L3 +| |-- cbm_mask +| |-- min_cbm_bits +| |-- num_closids +|-- cpus +|-- schemata +|-- tasks +|-- + |-- cpus + |-- schemata + |-- tasks + +``` + +For runc, we can make use of `tasks` and `schemata` configuration for L3 cache +resource constraints. + +The file `tasks` has a list of tasks that belongs to this group (e.g., +" group). Tasks can be added to a group by writing the task ID +to the "tasks" file (which will automatically remove them from the previous +group to which they belonged). New tasks created by fork(2) and clone(2) are +added to the same group as their parent. If a pid is not in any sub group, it +is in root group. + +The file `schemata` has allocation masks/values for L3 cache on each socket, +which contains L3 cache id and capacity bitmask (CBM). +``` + Format: "L3:=;=;..." +``` +For example, on a two-socket machine, L3's schema line could be `L3:0=ff;1=c0` +Which means L3 cache id 0's CBM is 0xff, and L3 cache id 1's CBM is 0xc0. + +The valid L3 cache CBM is a *contiguous bits set* and number of bits that can +be set is less than the max bit. The max bits in the CBM is varied among +supported Intel Xeon platforms. In Intel RDT "resource control" filesystem +layout, the CBM in a group should be a subset of the CBM in root. Kernel will +check if it is valid when writing. e.g., 0xfffff in root indicates the max bits +of CBM is 20 bits, which mapping to entire L3 cache capacity. Some valid CBM +values to set in a group: 0xf, 0xf0, 0x3ff, 0x1f00 and etc. + +For more information about Intel RDT/CAT kernel interface: +https://www.kernel.org/doc/Documentation/x86/intel_rdt_ui.txt + +An example for runc: +``` +Consider a two-socket machine with two L3 caches where the default CBM is +0xfffff and the max CBM length is 20 bits. With this configuration, tasks +inside the container only have access to the "upper" 80% of L3 cache id 0 and +the "lower" 50% L3 cache id 1: + +"linux": { + "intelRdt": { + "l3CacheSchema": "L3:0=ffff0;1=3ff" + } +} +``` + ### Security The standard set of Linux capabilities that are set in a container @@ -306,7 +390,7 @@ a container. | Exec | Execute a new process inside of the container ( requires setns ) | | Set | Setup configs of the container after it's created | -### Execute a new process inside of a running container. +### Execute a new process inside of a running container User can execute a new process inside of a running container. Any binaries to be executed must be accessible within the container's rootfs. diff --git a/vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go index 8981b2a2..7c66f572 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/capabilities_linux.go @@ -4,7 +4,6 @@ package libcontainer import ( "fmt" - "os" "strings" "github.com/opencontainers/runc/libcontainer/configs" @@ -72,7 +71,7 @@ func newContainerCapList(capConfig *configs.Capabilities) (*containerCapabilitie } ambient = append(ambient, v) } - pid, err := capability.NewPid(os.Getpid()) + pid, err := capability.NewPid(0) if err != nil { return nil, err } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/compat_1.5_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/compat_1.5_linux.go deleted file mode 100644 index c7bdf1f6..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/compat_1.5_linux.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build linux,!go1.5 - -package libcontainer - -import "syscall" - -// GidMappingsEnableSetgroups was added in Go 1.5, so do nothing when building -// with earlier versions -func enableSetgroups(sys *syscall.SysProcAttr) { -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD new file mode 100644 index 00000000..82b8b3cb --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/BUILD @@ -0,0 +1,53 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "blkio_device.go", + "cgroup_linux.go", + "cgroup_windows.go", + "config.go", + "config_linux.go", + "device.go", + "device_defaults.go", + "hugepage_limit.go", + "intelrdt.go", + "interface_priority_map.go", + "mount.go", + "namespaces.go", + "namespaces_linux.go", + "namespaces_syscall.go", + "namespaces_syscall_unsupported.go", + "namespaces_unsupported.go", + "network.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/configs", + importpath = "github.com/opencontainers/runc/libcontainer/configs", + visibility = ["//visibility:public"], + deps = [ + "//vendor/github.com/opencontainers/runtime-spec/specs-go:go_default_library", + "//vendor/github.com/sirupsen/logrus:go_default_library", + ] + select({ + "@io_bazel_rules_go//go/platform:linux": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/opencontainers/runc/libcontainer/configs/validate:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unsupported.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unsupported.go deleted file mode 100644 index 95e2830a..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unsupported.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build !windows,!linux,!freebsd - -package configs - -type Cgroup struct { -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go index 269fffff..3cae4fd8 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go @@ -187,6 +187,10 @@ type Config struct { // Rootless specifies whether the container is a rootless container. Rootless bool `json:"rootless"` + + // IntelRdt specifies settings for Intel RDT/CAT group that the container is placed into + // to limit the resources (e.g., L3 cache) the container has available + IntelRdt *IntelRdt `json:"intel_rdt,omitempty"` } type Hooks struct { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/device_defaults.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/device_defaults.go index 4d348d21..e4f423c5 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/device_defaults.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/device_defaults.go @@ -1,4 +1,4 @@ -// +build linux freebsd +// +build linux package configs diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/intelrdt.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/intelrdt.go new file mode 100644 index 00000000..36bd5f96 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/intelrdt.go @@ -0,0 +1,7 @@ +package configs + +type IntelRdt struct { + // The schema for L3 cache id and capacity bitmask (CBM) + // Format: "L3:=;=;..." + L3CacheSchema string `json:"l3_cache_schema,omitempty"` +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD index 282deb77..50c2a1cf 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/BUILD @@ -6,10 +6,12 @@ go_library( "rootless.go", "validator.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/configs/validate", importpath = "github.com/opencontainers/runc/libcontainer/configs/validate", visibility = ["//visibility:public"], deps = [ "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + "//vendor/github.com/opencontainers/runc/libcontainer/intelrdt:go_default_library", "//vendor/github.com/opencontainers/selinux/go-selinux:go_default_library", ], ) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/rootless.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/rootless.go index 0cebfaf8..e532ac8f 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/rootless.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/rootless.go @@ -21,13 +21,6 @@ func (v *ConfigValidator) rootless(config *configs.Config) error { if err := rootlessMount(config); err != nil { return err } - // Currently, cgroups cannot effectively be used in rootless containers. - // The new cgroup namespace doesn't really help us either because it doesn't - // have nice interactions with the user namespace (we're working with upstream - // to fix this). - if err := rootlessCgroup(config); err != nil { - return err - } // XXX: We currently can't verify the user config at all, because // configs.Config doesn't store the user-related configs. So this @@ -36,37 +29,27 @@ func (v *ConfigValidator) rootless(config *configs.Config) error { return nil } -func rootlessMappings(config *configs.Config) error { - rootuid, err := config.HostRootUID() - if err != nil { - return fmt.Errorf("failed to get root uid from uidMappings: %v", err) +func hasIDMapping(id int, mappings []configs.IDMap) bool { + for _, m := range mappings { + if id >= m.ContainerID && id < m.ContainerID+m.Size { + return true + } } + return false +} + +func rootlessMappings(config *configs.Config) error { if euid := geteuid(); euid != 0 { if !config.Namespaces.Contains(configs.NEWUSER) { return fmt.Errorf("rootless containers require user namespaces") } - if rootuid != euid { - return fmt.Errorf("rootless containers cannot map container root to a different host user") - } - } - - rootgid, err := config.HostRootGID() - if err != nil { - return fmt.Errorf("failed to get root gid from gidMappings: %v", err) } - // Similar to the above test, we need to make sure that we aren't trying to - // map to a group ID that we don't have the right to be. - if rootgid != getegid() { - return fmt.Errorf("rootless containers cannot map container root to a different host group") + if len(config.UidMappings) == 0 { + return fmt.Errorf("rootless containers requires at least one UID mapping") } - - // We can only map one user and group inside a container (our own). - if len(config.UidMappings) != 1 || config.UidMappings[0].Size != 1 { - return fmt.Errorf("rootless containers cannot map more than one user") - } - if len(config.GidMappings) != 1 || config.GidMappings[0].Size != 1 { - return fmt.Errorf("rootless containers cannot map more than one group") + if len(config.GidMappings) == 0 { + return fmt.Errorf("rootless containers requires at least one GID mapping") } return nil @@ -104,11 +87,28 @@ func rootlessMount(config *configs.Config) error { // Check that the options list doesn't contain any uid= or gid= entries // that don't resolve to root. for _, opt := range strings.Split(mount.Data, ",") { - if strings.HasPrefix(opt, "uid=") && opt != "uid=0" { - return fmt.Errorf("cannot specify uid= mount options in rootless containers where argument isn't 0") + if strings.HasPrefix(opt, "uid=") { + var uid int + n, err := fmt.Sscanf(opt, "uid=%d", &uid) + if n != 1 || err != nil { + // Ignore unknown mount options. + continue + } + if !hasIDMapping(uid, config.UidMappings) { + return fmt.Errorf("cannot specify uid= mount options for unmapped uid in rootless containers") + } } - if strings.HasPrefix(opt, "gid=") && opt != "gid=0" { - return fmt.Errorf("cannot specify gid= mount options in rootless containers where argument isn't 0") + + if strings.HasPrefix(opt, "gid=") { + var gid int + n, err := fmt.Sscanf(opt, "gid=%d", &gid) + if n != 1 || err != nil { + // Ignore unknown mount options. + continue + } + if !hasIDMapping(gid, config.GidMappings) { + return fmt.Errorf("cannot specify gid= mount options for unmapped gid in rootless containers") + } } } } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go index 82843454..cbbba9a0 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/validate/validator.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/intelrdt" selinux "github.com/opencontainers/selinux/go-selinux" ) @@ -40,6 +41,9 @@ func (v *ConfigValidator) Validate(config *configs.Config) error { if err := v.sysctl(config); err != nil { return err } + if err := v.intelrdt(config); err != nil { + return err + } if config.Rootless { if err := v.rootless(config); err != nil { return err @@ -153,6 +157,19 @@ func (v *ConfigValidator) sysctl(config *configs.Config) error { return nil } +func (v *ConfigValidator) intelrdt(config *configs.Config) error { + if config.IntelRdt != nil { + if !intelrdt.IsEnabled() { + return fmt.Errorf("intelRdt is specified in config, but Intel RDT feature is not supported or enabled") + } + if config.IntelRdt.L3CacheSchema == "" { + return fmt.Errorf("intelRdt is specified in config, but intelRdt.l3CacheSchema is empty") + } + } + + return nil +} + func isSymbolicLink(path string) (bool, error) { fi, err := os.Lstat(path) if err != nil { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/console.go b/vendor/github.com/opencontainers/runc/libcontainer/console.go deleted file mode 100644 index 917acc70..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/console.go +++ /dev/null @@ -1,17 +0,0 @@ -package libcontainer - -import ( - "io" - "os" -) - -// Console represents a pseudo TTY. -type Console interface { - io.ReadWriteCloser - - // Path returns the filesystem path to the slave side of the pty. - Path() string - - // Fd returns the fd for the master of the pty. - File() *os.File -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/console_freebsd.go b/vendor/github.com/opencontainers/runc/libcontainer/console_freebsd.go deleted file mode 100644 index b7166a31..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/console_freebsd.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build freebsd - -package libcontainer - -import ( - "errors" -) - -// newConsole returns an initialized console that can be used within a container by copying bytes -// from the master side to the slave that is attached as the tty for the container's init process. -func newConsole() (Console, error) { - return nil, errors.New("libcontainer console is not supported on FreeBSD") -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/console_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/console_linux.go index f70de384..9997e93e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/console_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/console_linux.go @@ -1,71 +1,14 @@ package libcontainer import ( - "fmt" "os" - "unsafe" "golang.org/x/sys/unix" ) -func ConsoleFromFile(f *os.File) Console { - return &linuxConsole{ - master: f, - } -} - -// newConsole returns an initialized console that can be used within a container by copying bytes -// from the master side to the slave that is attached as the tty for the container's init process. -func newConsole() (Console, error) { - master, err := os.OpenFile("/dev/ptmx", unix.O_RDWR|unix.O_NOCTTY|unix.O_CLOEXEC, 0) - if err != nil { - return nil, err - } - console, err := ptsname(master) - if err != nil { - return nil, err - } - if err := unlockpt(master); err != nil { - return nil, err - } - return &linuxConsole{ - slavePath: console, - master: master, - }, nil -} - -// linuxConsole is a linux pseudo TTY for use within a container. -type linuxConsole struct { - master *os.File - slavePath string -} - -func (c *linuxConsole) File() *os.File { - return c.master -} - -func (c *linuxConsole) Path() string { - return c.slavePath -} - -func (c *linuxConsole) Read(b []byte) (int, error) { - return c.master.Read(b) -} - -func (c *linuxConsole) Write(b []byte) (int, error) { - return c.master.Write(b) -} - -func (c *linuxConsole) Close() error { - if m := c.master; m != nil { - return m.Close() - } - return nil -} - // mount initializes the console inside the rootfs mounting with the specified mount label // and applying the correct ownership of the console. -func (c *linuxConsole) mount() error { +func mountConsole(slavePath string) error { oldMask := unix.Umask(0000) defer unix.Umask(oldMask) f, err := os.Create("/dev/console") @@ -75,17 +18,20 @@ func (c *linuxConsole) mount() error { if f != nil { f.Close() } - return unix.Mount(c.slavePath, "/dev/console", "bind", unix.MS_BIND, "") + return unix.Mount(slavePath, "/dev/console", "bind", unix.MS_BIND, "") } // dupStdio opens the slavePath for the console and dups the fds to the current // processes stdio, fd 0,1,2. -func (c *linuxConsole) dupStdio() error { - slave, err := c.open(unix.O_RDWR) +func dupStdio(slavePath string) error { + fd, err := unix.Open(slavePath, unix.O_RDWR, 0) if err != nil { - return err + return &os.PathError{ + Op: "open", + Path: slavePath, + Err: err, + } } - fd := int(slave.Fd()) for _, i := range []int{0, 1, 2} { if err := unix.Dup3(fd, i, 0); err != nil { return err @@ -93,60 +39,3 @@ func (c *linuxConsole) dupStdio() error { } return nil } - -// open is a clone of os.OpenFile without the O_CLOEXEC used to open the pty slave. -func (c *linuxConsole) open(flag int) (*os.File, error) { - r, e := unix.Open(c.slavePath, flag, 0) - if e != nil { - return nil, &os.PathError{ - Op: "open", - Path: c.slavePath, - Err: e, - } - } - return os.NewFile(uintptr(r), c.slavePath), nil -} - -func ioctl(fd uintptr, flag, data uintptr) error { - if _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, flag, data); err != 0 { - return err - } - return nil -} - -// unlockpt unlocks the slave pseudoterminal device corresponding to the master pseudoterminal referred to by f. -// unlockpt should be called before opening the slave side of a pty. -func unlockpt(f *os.File) error { - var u int32 - return ioctl(f.Fd(), unix.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) -} - -// ptsname retrieves the name of the first available pts for the given master. -func ptsname(f *os.File) (string, error) { - n, err := unix.IoctlGetInt(int(f.Fd()), unix.TIOCGPTN) - if err != nil { - return "", err - } - return fmt.Sprintf("/dev/pts/%d", n), nil -} - -// SaneTerminal sets the necessary tty_ioctl(4)s to ensure that a pty pair -// created by us acts normally. In particular, a not-very-well-known default of -// Linux unix98 ptys is that they have +onlcr by default. While this isn't a -// problem for terminal emulators, because we relay data from the terminal we -// also relay that funky line discipline. -func SaneTerminal(terminal *os.File) error { - termios, err := unix.IoctlGetTermios(int(terminal.Fd()), unix.TCGETS) - if err != nil { - return fmt.Errorf("ioctl(tty, tcgets): %s", err.Error()) - } - - // Set -onlcr so we don't have to deal with \r. - termios.Oflag &^= unix.ONLCR - - if err := unix.IoctlSetTermios(int(terminal.Fd()), unix.TCSETS, termios); err != nil { - return fmt.Errorf("ioctl(tty, tcsets): %s", err.Error()) - } - - return nil -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/console_solaris.go b/vendor/github.com/opencontainers/runc/libcontainer/console_solaris.go deleted file mode 100644 index e5ca5459..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/console_solaris.go +++ /dev/null @@ -1,11 +0,0 @@ -package libcontainer - -import ( - "errors" -) - -// newConsole returns an initialized console that can be used within a container by copying bytes -// from the master side to the slave that is attached as the tty for the container's init process. -func newConsole() (Console, error) { - return nil, errors.New("libcontainer console is not supported on Solaris") -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/console_windows.go b/vendor/github.com/opencontainers/runc/libcontainer/console_windows.go deleted file mode 100644 index c61e866a..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/console_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -package libcontainer - -// newConsole returns an initialized console that can be used within a container -func newConsole() (Console, error) { - return &windowsConsole{}, nil -} - -// windowsConsole is a Windows pseudo TTY for use within a container. -type windowsConsole struct { -} - -func (c *windowsConsole) Fd() uintptr { - return 0 -} - -func (c *windowsConsole) Path() string { - return "" -} - -func (c *windowsConsole) Read(b []byte) (int, error) { - return 0, nil -} - -func (c *windowsConsole) Write(b []byte) (int, error) { - return 0, nil -} - -func (c *windowsConsole) Close() error { - return nil -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go index 9e1b74d7..246ec95f 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go @@ -5,6 +5,7 @@ package libcontainer import ( "bytes" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -21,6 +22,7 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/criurpc" + "github.com/opencontainers/runc/libcontainer/intelrdt" "github.com/opencontainers/runc/libcontainer/system" "github.com/opencontainers/runc/libcontainer/utils" @@ -38,10 +40,14 @@ type linuxContainer struct { root string config *configs.Config cgroupManager cgroups.Manager + intelRdtManager intelrdt.Manager + initPath string initArgs []string initProcess parentProcess initProcessStartTime uint64 criuPath string + newuidmapPath string + newgidmapPath string m sync.Mutex criuVersion int state containerState @@ -67,6 +73,9 @@ type State struct { // Container's standard descriptors (std{in,out,err}), needed for checkpoint and restore ExternalDescriptors []string `json:"external_descriptors,omitempty"` + + // Intel RDT "resource control" filesystem path + IntelRdtPath string `json:"intel_rdt_path"` } // Container is a libcontainer container object. @@ -163,6 +172,11 @@ func (c *linuxContainer) Stats() (*Stats, error) { if stats.CgroupStats, err = c.cgroupManager.GetStats(); err != nil { return stats, newSystemErrorWithCause(err, "getting container stats from cgroups") } + if c.intelRdtManager != nil { + if stats.IntelRdtStats, err = c.intelRdtManager.GetStats(); err != nil { + return stats, newSystemErrorWithCause(err, "getting container's Intel RDT stats") + } + } for _, iface := range c.config.Networks { switch iface.Type { case "veth": @@ -193,6 +207,15 @@ func (c *linuxContainer) Set(config configs.Config) error { } return err } + if c.intelRdtManager != nil { + if err := c.intelRdtManager.Set(&config); err != nil { + // Set configs back + if err2 := c.intelRdtManager.Set(c.config); err2 != nil { + logrus.Warnf("Setting back intelrdt configs failed due to error: %v, your state.json and actual configs might be inconsistent.", err2) + } + return err + } + } // After config setting succeed, update config and states c.config = &config _, err = c.updateState(nil) @@ -245,20 +268,71 @@ func (c *linuxContainer) Exec() error { func (c *linuxContainer) exec() error { path := filepath.Join(c.root, execFifoFilename) - f, err := os.OpenFile(path, os.O_RDONLY, 0) - if err != nil { - return newSystemErrorWithCause(err, "open exec fifo for reading") + + fifoOpen := make(chan struct{}) + select { + case <-awaitProcessExit(c.initProcess.pid(), fifoOpen): + return errors.New("container process is already dead") + case result := <-awaitFifoOpen(path): + close(fifoOpen) + if result.err != nil { + return result.err + } + f := result.file + defer f.Close() + if err := readFromExecFifo(f); err != nil { + return err + } + return os.Remove(path) } - defer f.Close() - data, err := ioutil.ReadAll(f) +} + +func readFromExecFifo(execFifo io.Reader) error { + data, err := ioutil.ReadAll(execFifo) if err != nil { return err } - if len(data) > 0 { - os.Remove(path) - return nil + if len(data) <= 0 { + return fmt.Errorf("cannot start an already running container") } - return fmt.Errorf("cannot start an already running container") + return nil +} + +func awaitProcessExit(pid int, exit <-chan struct{}) <-chan struct{} { + isDead := make(chan struct{}) + go func() { + for { + select { + case <-exit: + return + case <-time.After(time.Millisecond * 100): + stat, err := system.Stat(pid) + if err != nil || stat.State == system.Zombie { + close(isDead) + return + } + } + } + }() + return isDead +} + +func awaitFifoOpen(path string) <-chan openResult { + fifoOpened := make(chan openResult) + go func() { + f, err := os.OpenFile(path, os.O_RDONLY, 0) + if err != nil { + fifoOpened <- openResult{err: newSystemErrorWithCause(err, "open exec fifo for reading")} + return + } + fifoOpened <- openResult{file: f} + }() + return fifoOpened +} + +type openResult struct { + file *os.File + err error } func (c *linuxContainer) start(process *Process, isInit bool) error { @@ -268,7 +342,7 @@ func (c *linuxContainer) start(process *Process, isInit bool) error { } if err := parent.start(); err != nil { // terminate the process to ensure that it properly is reaped. - if err := parent.terminate(); err != nil { + if err := ignoreTerminateErrors(parent.terminate()); err != nil { logrus.Warn(err) } return newSystemErrorWithCause(err, "starting container process") @@ -286,25 +360,23 @@ func (c *linuxContainer) start(process *Process, isInit bool) error { c.initProcessStartTime = state.InitProcessStartTime if c.config.Hooks != nil { + bundle, annotations := utils.Annotations(c.config.Labels) s := configs.HookState{ - Version: c.config.Version, - ID: c.id, - Pid: parent.pid(), - Bundle: utils.SearchLabels(c.config.Labels, "bundle"), + Version: c.config.Version, + ID: c.id, + Pid: parent.pid(), + Bundle: bundle, + Annotations: annotations, } for i, hook := range c.config.Hooks.Poststart { if err := hook.Run(s); err != nil { - if err := parent.terminate(); err != nil { + if err := ignoreTerminateErrors(parent.terminate()); err != nil { logrus.Warn(err) } return newSystemErrorWithCausef(err, "running poststart hook %d", i) } } } - } else { - c.state = &runningState{ - c: c, - } } return nil } @@ -392,7 +464,8 @@ func (c *linuxContainer) newParentProcess(p *Process, doInit bool) (parentProces } func (c *linuxContainer) commandTemplate(p *Process, childPipe *os.File) (*exec.Cmd, error) { - cmd := exec.Command(c.initArgs[0], c.initArgs[1:]...) + cmd := exec.Command(c.initPath, c.initArgs[1:]...) + cmd.Args[0] = c.initArgs[0] cmd.Stdin = p.Stdin cmd.Stdout = p.Stdout cmd.Stderr = p.Stderr @@ -434,15 +507,16 @@ func (c *linuxContainer) newInitProcess(p *Process, cmd *exec.Cmd, parentPipe, c return nil, err } return &initProcess{ - cmd: cmd, - childPipe: childPipe, - parentPipe: parentPipe, - manager: c.cgroupManager, - config: c.newInitConfig(p), - container: c, - process: p, - bootstrapData: data, - sharePidns: sharePidns, + cmd: cmd, + childPipe: childPipe, + parentPipe: parentPipe, + manager: c.cgroupManager, + intelRdtManager: c.intelRdtManager, + config: c.newInitConfig(p), + container: c, + process: p, + bootstrapData: data, + sharePidns: sharePidns, }, nil } @@ -461,6 +535,7 @@ func (c *linuxContainer) newSetnsProcess(p *Process, cmd *exec.Cmd, parentPipe, return &setnsProcess{ cmd: cmd, cgroupPaths: c.cgroupManager.GetPaths(), + intelRdtPath: state.IntelRdtPath, childPipe: childPipe, parentPipe: parentPipe, config: c.newInitConfig(p), @@ -499,6 +574,8 @@ func (c *linuxContainer) newInitConfig(process *Process) *initConfig { cfg.Rlimits = process.Rlimits } cfg.CreateConsole = process.ConsoleSocket != nil + cfg.ConsoleWidth = process.ConsoleWidth + cfg.ConsoleHeight = process.ConsoleHeight return cfg } @@ -600,9 +677,24 @@ func (c *linuxContainer) checkCriuFeatures(criuOpts *CriuOpts, rpcOpts *criurpc. logrus.Debugf("Feature check says: %s", criuFeatures) missingFeatures := false - if *criuFeat.MemTrack && !*criuFeatures.MemTrack { - missingFeatures = true - logrus.Debugf("CRIU does not support MemTrack") + // The outer if checks if the fields actually exist + if (criuFeat.MemTrack != nil) && + (criuFeatures.MemTrack != nil) { + // The inner if checks if they are set to true + if *criuFeat.MemTrack && !*criuFeatures.MemTrack { + missingFeatures = true + logrus.Debugf("CRIU does not support MemTrack") + } + } + + // This needs to be repeated for every new feature check. + // Is there a way to put this in a function. Reflection? + if (criuFeat.LazyPages != nil) && + (criuFeatures.LazyPages != nil) { + if *criuFeat.LazyPages && !*criuFeatures.LazyPages { + missingFeatures = true + logrus.Debugf("CRIU does not support LazyPages") + } } if missingFeatures { @@ -632,9 +724,9 @@ func parseCriuVersion(path string) (int, error) { return 0, fmt.Errorf("Unable to parse the CRIU version: %s", path) } - n, err := fmt.Sscanf(string(version), "GitID: v%d.%d.%d", &x, &y, &z) // 1.5.2 + n, err := fmt.Sscanf(version, "GitID: v%d.%d.%d", &x, &y, &z) // 1.5.2 if err != nil { - n, err = fmt.Sscanf(string(version), "GitID: v%d.%d", &x, &y) // 1.6 + n, err = fmt.Sscanf(version, "GitID: v%d.%d", &x, &y) // 1.6 y++ } else { z++ @@ -758,6 +850,25 @@ func (c *linuxContainer) addMaskPaths(req *criurpc.CriuReq) error { } req.Opts.ExtMnt = append(req.Opts.ExtMnt, extMnt) } + return nil +} + +func waitForCriuLazyServer(r *os.File, status string) error { + + data := make([]byte, 1) + _, err := r.Read(data) + if err != nil { + return err + } + fd, err := os.OpenFile(status, os.O_TRUNC|os.O_WRONLY, os.ModeAppend) + if err != nil { + return err + } + _, err = fd.Write(data) + if err != nil { + return err + } + fd.Close() return nil } @@ -825,6 +936,7 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error { EmptyNs: proto.Uint32(criuOpts.EmptyNs), OrphanPtsMaster: proto.Bool(true), AutoDedup: proto.Bool(criuOpts.AutoDedup), + LazyPages: proto.Bool(criuOpts.LazyPages), } fcg := c.cgroupManager.GetPaths()["freezer"] @@ -875,6 +987,24 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error { Opts: &rpcOpts, } + if criuOpts.LazyPages { + // lazy migration requested; check if criu supports it + feat := criurpc.CriuFeatures{ + LazyPages: proto.Bool(true), + } + + if err := c.checkCriuFeatures(criuOpts, &rpcOpts, &feat); err != nil { + return err + } + + statusRead, statusWrite, err := os.Pipe() + if err != nil { + return err + } + rpcOpts.StatusFd = proto.Int32(int32(statusWrite.Fd())) + go waitForCriuLazyServer(statusRead, criuOpts.StatusFd) + } + //no need to dump these information in pre-dump if !criuOpts.PreDump { for _, m := range c.config.Mounts { @@ -1027,6 +1157,7 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error { EmptyNs: proto.Uint32(criuOpts.EmptyNs), OrphanPtsMaster: proto.Bool(true), AutoDedup: proto.Bool(criuOpts.AutoDedup), + LazyPages: proto.Bool(criuOpts.LazyPages), }, } @@ -1355,11 +1486,13 @@ func (c *linuxContainer) criuNotifications(resp *criurpc.CriuResp, process *Proc } case notify.GetScript() == "setup-namespaces": if c.config.Hooks != nil { + bundle, annotations := utils.Annotations(c.config.Labels) s := configs.HookState{ - Version: c.config.Version, - ID: c.id, - Pid: int(notify.GetPid()), - Bundle: utils.SearchLabels(c.config.Labels, "bundle"), + Version: c.config.Version, + ID: c.id, + Pid: int(notify.GetPid()), + Bundle: bundle, + Annotations: annotations, } for i, hook := range c.config.Hooks.Prestart { if err := hook.Run(s); err != nil { @@ -1404,7 +1537,7 @@ func (c *linuxContainer) criuNotifications(resp *criurpc.CriuResp, process *Proc defer master.Close() // While we can access console.master, using the API is a good idea. - if err := utils.SendFd(process.ConsoleSocket, master); err != nil { + if err := utils.SendFd(process.ConsoleSocket, master.Name(), master.Fd()); err != nil { return err } } @@ -1519,6 +1652,10 @@ func (c *linuxContainer) currentState() (*State, error) { startTime, _ = c.initProcess.startTime() externalDescriptors = c.initProcess.externalDescriptors() } + intelRdtPath, err := intelrdt.GetIntelRdtPath(c.ID()) + if err != nil { + intelRdtPath = "" + } state := &State{ BaseState: BaseState{ ID: c.ID(), @@ -1529,6 +1666,7 @@ func (c *linuxContainer) currentState() (*State, error) { }, Rootless: c.config.Rootless, CgroupPaths: c.cgroupManager.GetPaths(), + IntelRdtPath: intelRdtPath, NamespacePaths: make(map[configs.NamespaceType]string), ExternalDescriptors: externalDescriptors, } @@ -1627,6 +1765,12 @@ func (c *linuxContainer) bootstrapData(cloneFlags uintptr, nsMaps map[configs.Na if !joinExistingUser { // write uid mappings if len(c.config.UidMappings) > 0 { + if c.config.Rootless && c.newuidmapPath != "" { + r.AddData(&Bytemsg{ + Type: UidmapPathAttr, + Value: []byte(c.newuidmapPath), + }) + } b, err := encodeIDMapping(c.config.UidMappings) if err != nil { return nil, err @@ -1647,10 +1791,15 @@ func (c *linuxContainer) bootstrapData(cloneFlags uintptr, nsMaps map[configs.Na Type: GidmapAttr, Value: b, }) - // The following only applies if we are root. - if !c.config.Rootless { + if c.config.Rootless && c.newgidmapPath != "" { + r.AddData(&Bytemsg{ + Type: GidmapPathAttr, + Value: []byte(c.newgidmapPath), + }) + } + if requiresRootOrMappingTool(c.config) { // check if we have CAP_SETGID to setgroup properly - pid, err := capability.NewPid(os.Getpid()) + pid, err := capability.NewPid(0) if err != nil { return nil, err } @@ -1678,3 +1827,25 @@ func (c *linuxContainer) bootstrapData(cloneFlags uintptr, nsMaps map[configs.Na return bytes.NewReader(r.Serialize()), nil } + +// ignoreTerminateErrors returns nil if the given err matches an error known +// to indicate that the terminate occurred successfully or err was nil, otherwise +// err is returned unaltered. +func ignoreTerminateErrors(err error) error { + if err == nil { + return nil + } + s := err.Error() + switch { + case strings.Contains(s, "process already finished"), strings.Contains(s, "Wait was already called"): + return nil + } + return err +} + +func requiresRootOrMappingTool(c *configs.Config) bool { + gidMap := []configs.IDMap{ + {ContainerID: 0, HostID: os.Getegid(), Size: 1}, + } + return !reflect.DeepEqual(c.GidMappings, gidMap) +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/container_solaris.go b/vendor/github.com/opencontainers/runc/libcontainer/container_solaris.go deleted file mode 100644 index bb84ff74..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/container_solaris.go +++ /dev/null @@ -1,20 +0,0 @@ -package libcontainer - -// State represents a running container's state -type State struct { - BaseState - - // Platform specific fields below here -} - -// A libcontainer container object. -// -// Each container is thread-safe within the same process. Since a container can -// be destroyed by a separate process, any function may return that the container -// was not found. -type Container interface { - BaseContainer - - // Methods below here are platform specific - -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/container_windows.go b/vendor/github.com/opencontainers/runc/libcontainer/container_windows.go deleted file mode 100644 index bb84ff74..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/container_windows.go +++ /dev/null @@ -1,20 +0,0 @@ -package libcontainer - -// State represents a running container's state -type State struct { - BaseState - - // Platform specific fields below here -} - -// A libcontainer container object. -// -// Each container is thread-safe within the same process. Since a container can -// be destroyed by a separate process, any function may return that the container -// was not found. -type Container interface { - BaseContainer - - // Methods below here are platform specific - -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go index 8f142c9f..a2e344fc 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_linux.go @@ -23,7 +23,7 @@ type VethPairName struct { type CriuOpts struct { ImagesDirectory string // directory for storing image files WorkDirectory string // directory to cd and write logs/pidfiles/stats to - ParentImage string // direcotry for storing parent image files in pre-dump and dump + ParentImage string // directory for storing parent image files in pre-dump and dump LeaveRunning bool // leave container in running state after checkpoint TcpEstablished bool // checkpoint/restore established TCP connections ExternalUnixConnections bool // allow external unix connections @@ -35,4 +35,6 @@ type CriuOpts struct { ManageCgroupsMode cgMode // dump or restore cgroup mode EmptyNs uint32 // don't c/r properties for namespace from this mask AutoDedup bool // auto deduplication for incremental dumps + LazyPages bool // restore memory pages lazily using userfaultfd + StatusFd string // fd for feedback when lazy server is ready } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_windows.go b/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_windows.go deleted file mode 100644 index bc920770..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/criu_opts_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package libcontainer - -// TODO Windows: This can ultimately be entirely factored out as criu is -// a Unix concept not relevant on Windows. -type CriuOpts struct { -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD index c59f5776..13f1b26c 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/BUILD @@ -1,14 +1,9 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") -filegroup( - name = "go_default_library_protos", - srcs = ["criurpc.proto"], - visibility = ["//visibility:public"], -) - go_library( name = "go_default_library", srcs = ["criurpc.pb.go"], + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/criurpc", importpath = "github.com/opencontainers/runc/libcontainer/criurpc", visibility = ["//visibility:public"], deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], diff --git a/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go index 947bdea1..7d53d5e0 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go @@ -11,13 +11,13 @@ import ( "runtime/debug" "strconv" - "github.com/docker/docker/pkg/mount" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/cgroups/fs" - "github.com/opencontainers/runc/libcontainer/cgroups/rootless" "github.com/opencontainers/runc/libcontainer/cgroups/systemd" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/configs/validate" + "github.com/opencontainers/runc/libcontainer/intelrdt" + "github.com/opencontainers/runc/libcontainer/mount" "github.com/opencontainers/runc/libcontainer/utils" "golang.org/x/sys/unix" @@ -72,15 +72,15 @@ func Cgroupfs(l *LinuxFactory) error { return nil } -// RootlessCgroups is an options func to configure a LinuxFactory to -// return containers that use the "rootless" cgroup manager, which will -// fail to do any operations not possible to do with an unprivileged user. -// It should only be used in conjunction with rootless containers. -func RootlessCgroups(l *LinuxFactory) error { - l.NewCgroupsManager = func(config *configs.Cgroup, paths map[string]string) cgroups.Manager { - return &rootless.Manager{ - Cgroups: config, - Paths: paths, +// IntelRdtfs is an options func to configure a LinuxFactory to return +// containers that use the Intel RDT "resource control" filesystem to +// create and manage Intel Xeon platform shared resources (e.g., L3 cache). +func IntelRdtFs(l *LinuxFactory) error { + l.NewIntelRdtManager = func(config *configs.Config, id string, path string) intelrdt.Manager { + return &intelrdt.IntelRdtManager{ + Config: config, + Id: id, + Path: path, } } return nil @@ -119,12 +119,16 @@ func New(root string, options ...func(*LinuxFactory) error) (Factory, error) { } l := &LinuxFactory{ Root: root, - InitArgs: []string{"/proc/self/exe", "init"}, + InitPath: "/proc/self/exe", + InitArgs: []string{os.Args[0], "init"}, Validator: validate.New(), CriuPath: "criu", } Cgroupfs(l) for _, opt := range options { + if opt == nil { + continue + } if err := opt(l); err != nil { return nil, err } @@ -137,6 +141,10 @@ type LinuxFactory struct { // Root directory for the factory to store state. Root string + // InitPath is the path for calling the init responsibilities for spawning + // a container. + InitPath string + // InitArgs are arguments for calling the init responsibilities for spawning // a container. InitArgs []string @@ -145,11 +153,19 @@ type LinuxFactory struct { // containers. CriuPath string + // New{u,g}uidmapPath is the path to the binaries used for mapping with + // rootless containers. + NewuidmapPath string + NewgidmapPath string + // Validator provides validation to container configurations. Validator validate.Validator // NewCgroupsManager returns an initialized cgroups manager for a single container. NewCgroupsManager func(config *configs.Cgroup, paths map[string]string) cgroups.Manager + + // NewIntelRdtManager returns an initialized Intel RDT manager for a single container. + NewIntelRdtManager func(config *configs.Config, id string, path string) intelrdt.Manager } func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, error) { @@ -174,17 +190,20 @@ func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, err if err := os.Chown(containerRoot, unix.Geteuid(), unix.Getegid()); err != nil { return nil, newGenericError(err, SystemError) } - if config.Rootless { - RootlessCgroups(l) - } c := &linuxContainer{ id: id, root: containerRoot, config: config, + initPath: l.InitPath, initArgs: l.InitArgs, criuPath: l.CriuPath, + newuidmapPath: l.NewuidmapPath, + newgidmapPath: l.NewgidmapPath, cgroupManager: l.NewCgroupsManager(config.Cgroups, nil), } + if intelrdt.IsEnabled() { + c.intelRdtManager = l.NewIntelRdtManager(config, id, "") + } c.state = &stoppedState{c: c} return c, nil } @@ -203,17 +222,16 @@ func (l *LinuxFactory) Load(id string) (Container, error) { processStartTime: state.InitProcessStartTime, fds: state.ExternalDescriptors, } - // We have to use the RootlessManager. - if state.Rootless { - RootlessCgroups(l) - } c := &linuxContainer{ initProcess: r, initProcessStartTime: state.InitProcessStartTime, id: id, config: &state.Config, + initPath: l.InitPath, initArgs: l.InitArgs, criuPath: l.CriuPath, + newuidmapPath: l.NewuidmapPath, + newgidmapPath: l.NewgidmapPath, cgroupManager: l.NewCgroupsManager(state.Config.Cgroups, state.CgroupPaths), root: containerRoot, created: state.Created, @@ -222,6 +240,9 @@ func (l *LinuxFactory) Load(id string) (Container, error) { if err := c.refreshState(); err != nil { return nil, err } + if intelrdt.IsEnabled() { + c.intelRdtManager = l.NewIntelRdtManager(&state.Config, id, state.IntelRdtPath) + } return c, nil } @@ -323,3 +344,21 @@ func (l *LinuxFactory) validateID(id string) error { return nil } + +// NewuidmapPath returns an option func to configure a LinuxFactory with the +// provided .. +func NewuidmapPath(newuidmapPath string) func(*LinuxFactory) error { + return func(l *LinuxFactory) error { + l.NewuidmapPath = newuidmapPath + return nil + } +} + +// NewgidmapPath returns an option func to configure a LinuxFactory with the +// provided .. +func NewgidmapPath(newgidmapPath string) func(*LinuxFactory) error { + return func(l *LinuxFactory) error { + l.NewgidmapPath = newgidmapPath + return nil + } +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go index 2020bb7a..2770be30 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go @@ -12,15 +12,16 @@ import ( "syscall" // only for Errno "unsafe" + "golang.org/x/sys/unix" + + "github.com/containerd/console" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/system" "github.com/opencontainers/runc/libcontainer/user" "github.com/opencontainers/runc/libcontainer/utils" - "github.com/sirupsen/logrus" "github.com/vishvananda/netlink" - "golang.org/x/sys/unix" ) type initType string @@ -61,6 +62,8 @@ type initConfig struct { ContainerId string `json:"containerid"` Rlimits []configs.Rlimit `json:"rlimits"` CreateConsole bool `json:"create_console"` + ConsoleWidth uint16 `json:"console_width"` + ConsoleHeight uint16 `json:"console_height"` Rootless bool `json:"rootless"` } @@ -170,29 +173,38 @@ func setupConsole(socket *os.File, config *initConfig, mount bool) error { // however, that setupUser (specifically fixStdioPermissions) *will* change // the UID owner of the console to be the user the process will run as (so // they can actually control their console). - console, err := newConsole() + + pty, slavePath, err := console.NewPty() if err != nil { return err } - // After we return from here, we don't need the console anymore. - defer console.Close() - linuxConsole, ok := console.(*linuxConsole) - if !ok { - return fmt.Errorf("failed to cast console to *linuxConsole") + if config.ConsoleHeight != 0 && config.ConsoleWidth != 0 { + err = pty.Resize(console.WinSize{ + Height: config.ConsoleHeight, + Width: config.ConsoleWidth, + }) + + if err != nil { + return err + } } + + // After we return from here, we don't need the console anymore. + defer pty.Close() + // Mount the console inside our rootfs. if mount { - if err := linuxConsole.mount(); err != nil { + if err := mountConsole(slavePath); err != nil { return err } } // While we can access console.master, using the API is a good idea. - if err := utils.SendFd(socket, linuxConsole.File()); err != nil { + if err := utils.SendFd(socket, pty.Name(), pty.Fd()); err != nil { return err } // Now, dup over all the things. - return linuxConsole.dupStdio() + return dupStdio(slavePath) } // syncParentReady sends to the given pipe a JSON payload which indicates that @@ -261,25 +273,27 @@ func setupUser(config *initConfig) error { } } - if config.Rootless { - if execUser.Uid != 0 { - return fmt.Errorf("cannot run as a non-root user in a rootless container") - } - - if execUser.Gid != 0 { - return fmt.Errorf("cannot run as a non-root group in a rootless container") - } + // Rather than just erroring out later in setuid(2) and setgid(2), check + // that the user is mapped here. + if _, err := config.Config.HostUID(execUser.Uid); err != nil { + return fmt.Errorf("cannot set uid to unmapped user in user namespace") + } + if _, err := config.Config.HostGID(execUser.Gid); err != nil { + return fmt.Errorf("cannot set gid to unmapped user in user namespace") + } - // We cannot set any additional groups in a rootless container and thus we - // bail if the user asked us to do so. TODO: We currently can't do this - // earlier, but if libcontainer.Process.User was typesafe this might work. + if config.Rootless { + // We cannot set any additional groups in a rootless container and thus + // we bail if the user asked us to do so. TODO: We currently can't do + // this check earlier, but if libcontainer.Process.User was typesafe + // this might work. if len(addGroups) > 0 { return fmt.Errorf("cannot set any additional groups in a rootless container") } } - // before we change to the container's user make sure that the processes STDIO - // is correctly owned by the user that we are switching to. + // Before we change to the container's user make sure that the processes + // STDIO is correctly owned by the user that we are switching to. if err := fixStdioPermissions(config, execUser); err != nil { return err } @@ -298,7 +312,6 @@ func setupUser(config *initConfig) error { if err := system.Setgid(execUser.Gid); err != nil { return err } - if err := system.Setuid(execUser.Uid); err != nil { return err } @@ -335,14 +348,6 @@ func fixStdioPermissions(config *initConfig, u *user.ExecUser) error { continue } - // Skip chown if s.Gid is actually an unmapped gid in the host. While - // this is a bit dodgy if it just so happens that the console _is_ - // owned by overflow_gid, there's no way for us to disambiguate this as - // a userspace program. - if _, err := config.Config.HostGID(int(s.Gid)); err != nil { - continue - } - // We only change the uid owner (as it is possible for the mount to // prefer a different gid, and there's no reason for us to change it). // The reason why we don't just leave the default uid=X mount setup is @@ -350,6 +355,15 @@ func fixStdioPermissions(config *initConfig, u *user.ExecUser) error { // this code, you couldn't effectively run as a non-root user inside a // container and also have a console set up. if err := unix.Fchown(int(fd), u.Uid, int(s.Gid)); err != nil { + // If we've hit an EINVAL then s.Gid isn't mapped in the user + // namespace. If we've hit an EPERM then the inode's current owner + // is not mapped in our user namespace (in particular, + // privileged_wrt_inode_uidgid() has failed). In either case, we + // are in a configuration where it's better for us to just not + // touch the stdio rather than bail at this point. + if err == unix.EINVAL || err == unix.EPERM { + continue + } return err } } @@ -480,6 +494,16 @@ func signalAllProcesses(m cgroups.Manager, s os.Signal) error { logrus.Warn(err) } + subreaper, err := system.GetSubreaper() + if err != nil { + // The error here means that PR_GET_CHILD_SUBREAPER is not + // supported because this code might run on a kernel older + // than 3.4. We don't want to throw an error in that case, + // and we simplify things, considering there is no subreaper + // set. + subreaper = 0 + } + for _, p := range procs { if s != unix.SIGKILL { if ok, err := isWaitable(p.Pid); err != nil { @@ -493,9 +517,16 @@ func signalAllProcesses(m cgroups.Manager, s os.Signal) error { } } - if _, err := p.Wait(); err != nil { - if !isNoChildren(err) { - logrus.Warn("wait: ", err) + // In case a subreaper has been setup, this code must not + // wait for the process. Otherwise, we cannot be sure the + // current process will be reaped by the subreaper, while + // the subreaper might be waiting for this process in order + // to retrieve its exit code. + if subreaper == 0 { + if _, err := p.Wait(); err != nil { + if !isNoChildren(err) { + logrus.Warn("wait: ", err) + } } } } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/BUILD new file mode 100644 index 00000000..7bdc5dad --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "intelrdt.go", + "stats.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/intelrdt", + importpath = "github.com/opencontainers/runc/libcontainer/intelrdt", + visibility = ["//visibility:public"], + deps = select({ + "@io_bazel_rules_go//go/platform:linux": [ + "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go new file mode 100644 index 00000000..487c630a --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/intelrdt.go @@ -0,0 +1,553 @@ +// +build linux + +package intelrdt + +import ( + "bufio" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + "sync" + + "github.com/opencontainers/runc/libcontainer/configs" +) + +/* + * About Intel RDT/CAT feature: + * Intel platforms with new Xeon CPU support Resource Director Technology (RDT). + * Intel Cache Allocation Technology (CAT) is a sub-feature of RDT. Currently L3 + * Cache is the only resource that is supported in RDT. + * + * This feature provides a way for the software to restrict cache allocation to a + * defined 'subset' of L3 cache which may be overlapping with other 'subsets'. + * The different subsets are identified by class of service (CLOS) and each CLOS + * has a capacity bitmask (CBM). + * + * For more information about Intel RDT/CAT can be found in the section 17.17 + * of Intel Software Developer Manual. + * + * About Intel RDT/CAT kernel interface: + * In Linux 4.10 kernel or newer, the interface is defined and exposed via + * "resource control" filesystem, which is a "cgroup-like" interface. + * + * Comparing with cgroups, it has similar process management lifecycle and + * interfaces in a container. But unlike cgroups' hierarchy, it has single level + * filesystem layout. + * + * Intel RDT "resource control" filesystem hierarchy: + * mount -t resctrl resctrl /sys/fs/resctrl + * tree /sys/fs/resctrl + * /sys/fs/resctrl/ + * |-- info + * | |-- L3 + * | |-- cbm_mask + * | |-- min_cbm_bits + * | |-- num_closids + * |-- cpus + * |-- schemata + * |-- tasks + * |-- + * |-- cpus + * |-- schemata + * |-- tasks + * + * For runc, we can make use of `tasks` and `schemata` configuration for L3 cache + * resource constraints. + * + * The file `tasks` has a list of tasks that belongs to this group (e.g., + * " group). Tasks can be added to a group by writing the task ID + * to the "tasks" file (which will automatically remove them from the previous + * group to which they belonged). New tasks created by fork(2) and clone(2) are + * added to the same group as their parent. If a pid is not in any sub group, it is + * in root group. + * + * The file `schemata` has allocation bitmasks/values for L3 cache on each socket, + * which contains L3 cache id and capacity bitmask (CBM). + * Format: "L3:=;=;..." + * For example, on a two-socket machine, L3's schema line could be `L3:0=ff;1=c0` + * which means L3 cache id 0's CBM is 0xff, and L3 cache id 1's CBM is 0xc0. + * + * The valid L3 cache CBM is a *contiguous bits set* and number of bits that can + * be set is less than the max bit. The max bits in the CBM is varied among + * supported Intel Xeon platforms. In Intel RDT "resource control" filesystem + * layout, the CBM in a group should be a subset of the CBM in root. Kernel will + * check if it is valid when writing. e.g., 0xfffff in root indicates the max bits + * of CBM is 20 bits, which mapping to entire L3 cache capacity. Some valid CBM + * values to set in a group: 0xf, 0xf0, 0x3ff, 0x1f00 and etc. + * + * For more information about Intel RDT/CAT kernel interface: + * https://www.kernel.org/doc/Documentation/x86/intel_rdt_ui.txt + * + * An example for runc: + * Consider a two-socket machine with two L3 caches where the default CBM is + * 0xfffff and the max CBM length is 20 bits. With this configuration, tasks + * inside the container only have access to the "upper" 80% of L3 cache id 0 and + * the "lower" 50% L3 cache id 1: + * + * "linux": { + * "intelRdt": { + * "l3CacheSchema": "L3:0=ffff0;1=3ff" + * } + * } + */ + +type Manager interface { + // Applies Intel RDT configuration to the process with the specified pid + Apply(pid int) error + + // Returns statistics for Intel RDT + GetStats() (*Stats, error) + + // Destroys the Intel RDT 'container_id' group + Destroy() error + + // Returns Intel RDT path to save in a state file and to be able to + // restore the object later + GetPath() string + + // Set Intel RDT "resource control" filesystem as configured. + Set(container *configs.Config) error +} + +// This implements interface Manager +type IntelRdtManager struct { + mu sync.Mutex + Config *configs.Config + Id string + Path string +} + +const ( + IntelRdtTasks = "tasks" +) + +var ( + // The absolute root path of the Intel RDT "resource control" filesystem + intelRdtRoot string + intelRdtRootLock sync.Mutex + + // The flag to indicate if Intel RDT is supported + isEnabled bool +) + +type intelRdtData struct { + root string + config *configs.Config + pid int +} + +// Check if Intel RDT is enabled in init() +func init() { + // 1. Check if hardware and kernel support Intel RDT/CAT feature + // "cat_l3" flag is set if supported + isFlagSet, err := parseCpuInfoFile("/proc/cpuinfo") + if !isFlagSet || err != nil { + isEnabled = false + return + } + + // 2. Check if Intel RDT "resource control" filesystem is mounted + // The user guarantees to mount the filesystem + isEnabled = isIntelRdtMounted() +} + +// Return the mount point path of Intel RDT "resource control" filesysem +func findIntelRdtMountpointDir() (string, error) { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return "", err + } + defer f.Close() + + s := bufio.NewScanner(f) + for s.Scan() { + text := s.Text() + fields := strings.Split(text, " ") + // Safe as mountinfo encodes mountpoints with spaces as \040. + index := strings.Index(text, " - ") + postSeparatorFields := strings.Fields(text[index+3:]) + numPostFields := len(postSeparatorFields) + + // This is an error as we can't detect if the mount is for "Intel RDT" + if numPostFields == 0 { + return "", fmt.Errorf("Found no fields post '-' in %q", text) + } + + if postSeparatorFields[0] == "resctrl" { + // Check that the mount is properly formated. + if numPostFields < 3 { + return "", fmt.Errorf("Error found less than 3 fields post '-' in %q", text) + } + + return fields[4], nil + } + } + if err := s.Err(); err != nil { + return "", err + } + + return "", NewNotFoundError("Intel RDT") +} + +// Gets the root path of Intel RDT "resource control" filesystem +func getIntelRdtRoot() (string, error) { + intelRdtRootLock.Lock() + defer intelRdtRootLock.Unlock() + + if intelRdtRoot != "" { + return intelRdtRoot, nil + } + + root, err := findIntelRdtMountpointDir() + if err != nil { + return "", err + } + + if _, err := os.Stat(root); err != nil { + return "", err + } + + intelRdtRoot = root + return intelRdtRoot, nil +} + +func isIntelRdtMounted() bool { + _, err := getIntelRdtRoot() + if err != nil { + return false + } + + return true +} + +func parseCpuInfoFile(path string) (bool, error) { + f, err := os.Open(path) + if err != nil { + return false, err + } + defer f.Close() + + s := bufio.NewScanner(f) + for s.Scan() { + if err := s.Err(); err != nil { + return false, err + } + + text := s.Text() + flags := strings.Split(text, " ") + + // "cat_l3" flag is set if Intel RDT/CAT is supported + for _, flag := range flags { + if flag == "cat_l3" { + return true, nil + } + } + } + return false, nil +} + +func parseUint(s string, base, bitSize int) (uint64, error) { + value, err := strconv.ParseUint(s, base, bitSize) + if err != nil { + intValue, intErr := strconv.ParseInt(s, base, bitSize) + // 1. Handle negative values greater than MinInt64 (and) + // 2. Handle negative values lesser than MinInt64 + if intErr == nil && intValue < 0 { + return 0, nil + } else if intErr != nil && intErr.(*strconv.NumError).Err == strconv.ErrRange && intValue < 0 { + return 0, nil + } + + return value, err + } + + return value, nil +} + +// Gets a single uint64 value from the specified file. +func getIntelRdtParamUint(path, file string) (uint64, error) { + fileName := filepath.Join(path, file) + contents, err := ioutil.ReadFile(fileName) + if err != nil { + return 0, err + } + + res, err := parseUint(strings.TrimSpace(string(contents)), 10, 64) + if err != nil { + return res, fmt.Errorf("unable to parse %q as a uint from file %q", string(contents), fileName) + } + return res, nil +} + +// Gets a string value from the specified file +func getIntelRdtParamString(path, file string) (string, error) { + contents, err := ioutil.ReadFile(filepath.Join(path, file)) + if err != nil { + return "", err + } + + return strings.TrimSpace(string(contents)), nil +} + +func readTasksFile(dir string) ([]int, error) { + f, err := os.Open(filepath.Join(dir, IntelRdtTasks)) + if err != nil { + return nil, err + } + defer f.Close() + + var ( + s = bufio.NewScanner(f) + out = []int{} + ) + + for s.Scan() { + if t := s.Text(); t != "" { + pid, err := strconv.Atoi(t) + if err != nil { + return nil, err + } + out = append(out, pid) + } + } + return out, nil +} + +func writeFile(dir, file, data string) error { + if dir == "" { + return fmt.Errorf("no such directory for %s", file) + } + if err := ioutil.WriteFile(filepath.Join(dir, file), []byte(data+"\n"), 0700); err != nil { + return fmt.Errorf("failed to write %v to %v: %v", data, file, err) + } + return nil +} + +func getIntelRdtData(c *configs.Config, pid int) (*intelRdtData, error) { + rootPath, err := getIntelRdtRoot() + if err != nil { + return nil, err + } + return &intelRdtData{ + root: rootPath, + config: c, + pid: pid, + }, nil +} + +// Get the read-only L3 cache information +func getL3CacheInfo() (*L3CacheInfo, error) { + l3CacheInfo := &L3CacheInfo{} + + rootPath, err := getIntelRdtRoot() + if err != nil { + return l3CacheInfo, err + } + + path := filepath.Join(rootPath, "info", "L3") + cbmMask, err := getIntelRdtParamString(path, "cbm_mask") + if err != nil { + return l3CacheInfo, err + } + minCbmBits, err := getIntelRdtParamUint(path, "min_cbm_bits") + if err != nil { + return l3CacheInfo, err + } + numClosids, err := getIntelRdtParamUint(path, "num_closids") + if err != nil { + return l3CacheInfo, err + } + + l3CacheInfo.CbmMask = cbmMask + l3CacheInfo.MinCbmBits = minCbmBits + l3CacheInfo.NumClosids = numClosids + + return l3CacheInfo, nil +} + +// WriteIntelRdtTasks writes the specified pid into the "tasks" file +func WriteIntelRdtTasks(dir string, pid int) error { + if dir == "" { + return fmt.Errorf("no such directory for %s", IntelRdtTasks) + } + + // Dont attach any pid if -1 is specified as a pid + if pid != -1 { + if err := ioutil.WriteFile(filepath.Join(dir, IntelRdtTasks), []byte(strconv.Itoa(pid)), 0700); err != nil { + return fmt.Errorf("failed to write %v to %v: %v", pid, IntelRdtTasks, err) + } + } + return nil +} + +// Check if Intel RDT is enabled +func IsEnabled() bool { + return isEnabled +} + +// Get the 'container_id' path in Intel RDT "resource control" filesystem +func GetIntelRdtPath(id string) (string, error) { + rootPath, err := getIntelRdtRoot() + if err != nil { + return "", err + } + + path := filepath.Join(rootPath, id) + return path, nil +} + +// Applies Intel RDT configuration to the process with the specified pid +func (m *IntelRdtManager) Apply(pid int) (err error) { + // If intelRdt is not specified in config, we do nothing + if m.Config.IntelRdt == nil { + return nil + } + d, err := getIntelRdtData(m.Config, pid) + if err != nil && !IsNotFound(err) { + return err + } + + m.mu.Lock() + defer m.mu.Unlock() + path, err := d.join(m.Id) + if err != nil { + return err + } + + m.Path = path + return nil +} + +// Destroys the Intel RDT 'container_id' group +func (m *IntelRdtManager) Destroy() error { + m.mu.Lock() + defer m.mu.Unlock() + if err := os.RemoveAll(m.Path); err != nil { + return err + } + m.Path = "" + return nil +} + +// Returns Intel RDT path to save in a state file and to be able to +// restore the object later +func (m *IntelRdtManager) GetPath() string { + if m.Path == "" { + m.Path, _ = GetIntelRdtPath(m.Id) + } + return m.Path +} + +// Returns statistics for Intel RDT +func (m *IntelRdtManager) GetStats() (*Stats, error) { + // If intelRdt is not specified in config + if m.Config.IntelRdt == nil { + return nil, nil + } + + m.mu.Lock() + defer m.mu.Unlock() + stats := NewStats() + + // The read-only L3 cache information + l3CacheInfo, err := getL3CacheInfo() + if err != nil { + return nil, err + } + stats.L3CacheInfo = l3CacheInfo + + // The read-only L3 cache schema in root + rootPath, err := getIntelRdtRoot() + if err != nil { + return nil, err + } + tmpRootStrings, err := getIntelRdtParamString(rootPath, "schemata") + if err != nil { + return nil, err + } + // L3 cache schema is in the first line + schemaRootStrings := strings.Split(tmpRootStrings, "\n") + stats.L3CacheSchemaRoot = schemaRootStrings[0] + + // The L3 cache schema in 'container_id' group + tmpStrings, err := getIntelRdtParamString(m.GetPath(), "schemata") + if err != nil { + return nil, err + } + // L3 cache schema is in the first line + schemaStrings := strings.Split(tmpStrings, "\n") + stats.L3CacheSchema = schemaStrings[0] + + return stats, nil +} + +// Set Intel RDT "resource control" filesystem as configured. +func (m *IntelRdtManager) Set(container *configs.Config) error { + path := m.GetPath() + + // About L3 cache schema file: + // The schema has allocation masks/values for L3 cache on each socket, + // which contains L3 cache id and capacity bitmask (CBM). + // Format: "L3:=;=;..." + // For example, on a two-socket machine, L3's schema line could be: + // L3:0=ff;1=c0 + // Which means L3 cache id 0's CBM is 0xff, and L3 cache id 1's CBM is 0xc0. + // + // About L3 cache CBM validity: + // The valid L3 cache CBM is a *contiguous bits set* and number of + // bits that can be set is less than the max bit. The max bits in the + // CBM is varied among supported Intel Xeon platforms. In Intel RDT + // "resource control" filesystem layout, the CBM in a group should + // be a subset of the CBM in root. Kernel will check if it is valid + // when writing. + // e.g., 0xfffff in root indicates the max bits of CBM is 20 bits, + // which mapping to entire L3 cache capacity. Some valid CBM values + // to set in a group: 0xf, 0xf0, 0x3ff, 0x1f00 and etc. + if container.IntelRdt != nil { + l3CacheSchema := container.IntelRdt.L3CacheSchema + if l3CacheSchema != "" { + if err := writeFile(path, "schemata", l3CacheSchema); err != nil { + return err + } + } + } + + return nil +} + +func (raw *intelRdtData) join(id string) (string, error) { + path := filepath.Join(raw.root, id) + if err := os.MkdirAll(path, 0755); err != nil { + return "", err + } + + if err := WriteIntelRdtTasks(path, raw.pid); err != nil { + return "", err + } + return path, nil +} + +type NotFoundError struct { + ResourceControl string +} + +func (e *NotFoundError) Error() string { + return fmt.Sprintf("mountpoint for %s not found", e.ResourceControl) +} + +func NewNotFoundError(res string) error { + return &NotFoundError{ + ResourceControl: res, + } +} + +func IsNotFound(err error) bool { + if err == nil { + return false + } + _, ok := err.(*NotFoundError) + return ok +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go new file mode 100644 index 00000000..095c0a38 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/intelrdt/stats.go @@ -0,0 +1,24 @@ +// +build linux + +package intelrdt + +type L3CacheInfo struct { + CbmMask string `json:"cbm_mask,omitempty"` + MinCbmBits uint64 `json:"min_cbm_bits,omitempty"` + NumClosids uint64 `json:"num_closids,omitempty"` +} + +type Stats struct { + // The read-only L3 cache information + L3CacheInfo *L3CacheInfo `json:"l3_cache_info,omitempty"` + + // The read-only L3 cache schema in root + L3CacheSchemaRoot string `json:"l3_cache_schema_root,omitempty"` + + // The L3 cache schema in 'container_id' group + L3CacheSchema string `json:"l3_cache_schema,omitempty"` +} + +func NewStats() *Stats { + return &Stats{} +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/message_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/message_linux.go index 8829b71a..ed7f986d 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/message_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/message_linux.go @@ -18,6 +18,8 @@ const ( SetgroupAttr uint16 = 27285 OomScoreAdjAttr uint16 = 27286 RootlessAttr uint16 = 27287 + UidmapPathAttr uint16 = 27288 + GidmapPathAttr uint16 = 27289 ) type Int32msg struct { @@ -75,13 +77,13 @@ func (msg *Boolmsg) Serialize() []byte { native.PutUint16(buf[0:2], uint16(msg.Len())) native.PutUint16(buf[2:4], msg.Type) if msg.Value { - buf[4] = 1 + native.PutUint32(buf[4:8], uint32(1)) } else { - buf[4] = 0 + native.PutUint32(buf[4:8], uint32(0)) } return buf } func (msg *Boolmsg) Len() int { - return unix.NLA_HDRLEN + 1 + return unix.NLA_HDRLEN + 4 // alignment } diff --git a/vendor/github.com/google/cadvisor/validate/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/mount/BUILD similarity index 53% rename from vendor/github.com/google/cadvisor/validate/BUILD rename to vendor/github.com/opencontainers/runc/libcontainer/mount/BUILD index ebf038e6..c6dad242 100644 --- a/vendor/github.com/google/cadvisor/validate/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/mount/BUILD @@ -2,15 +2,14 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["validate.go"], - importpath = "github.com/google/cadvisor/validate", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/google/cadvisor/container/docker:go_default_library", - "//vendor/github.com/google/cadvisor/manager:go_default_library", - "//vendor/github.com/google/cadvisor/utils:go_default_library", - "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", + srcs = [ + "mount.go", + "mount_linux.go", + "mountinfo.go", ], + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/mount", + importpath = "github.com/opencontainers/runc/libcontainer/mount", + visibility = ["//visibility:public"], ) filegroup( diff --git a/vendor/github.com/opencontainers/runc/libcontainer/mount/mount.go b/vendor/github.com/opencontainers/runc/libcontainer/mount/mount.go new file mode 100644 index 00000000..e8965e08 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/mount/mount.go @@ -0,0 +1,23 @@ +package mount + +// GetMounts retrieves a list of mounts for the current running process. +func GetMounts() ([]*Info, error) { + return parseMountTable() +} + +// Mounted looks at /proc/self/mountinfo to determine of the specified +// mountpoint has been mounted +func Mounted(mountpoint string) (bool, error) { + entries, err := parseMountTable() + if err != nil { + return false, err + } + + // Search the table for the mountpoint + for _, e := range entries { + if e.Mountpoint == mountpoint { + return true, nil + } + } + return false, nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/mount/mount_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/mount/mount_linux.go new file mode 100644 index 00000000..1e519192 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/mount/mount_linux.go @@ -0,0 +1,82 @@ +// +build linux + +package mount + +import ( + "bufio" + "fmt" + "io" + "os" + "strings" +) + +const ( + /* 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) + + (1) mount ID: unique identifier of the mount (may be reused after umount) + (2) parent ID: ID of parent (or of self for the top of the mount tree) + (3) major:minor: value of st_dev for files on filesystem + (4) root: root of the mount within the filesystem + (5) mount point: mount point relative to the process's root + (6) mount options: per mount options + (7) optional fields: zero or more fields of the form "tag[:value]" + (8) separator: marks the end of the optional fields + (9) filesystem type: name of filesystem of the form "type[.subtype]" + (10) mount source: filesystem specific information or "none" + (11) super options: per super block options*/ + mountinfoFormat = "%d %d %d:%d %s %s %s %s" +) + +// Parse /proc/self/mountinfo because comparing Dev and ino does not work from +// bind mounts +func parseMountTable() ([]*Info, error) { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return nil, err + } + defer f.Close() + + return parseInfoFile(f) +} + +func parseInfoFile(r io.Reader) ([]*Info, error) { + var ( + s = bufio.NewScanner(r) + out = []*Info{} + ) + + for s.Scan() { + if err := s.Err(); err != nil { + return nil, err + } + + var ( + p = &Info{} + text = s.Text() + optionalFields string + ) + + if _, err := fmt.Sscanf(text, mountinfoFormat, + &p.ID, &p.Parent, &p.Major, &p.Minor, + &p.Root, &p.Mountpoint, &p.Opts, &optionalFields); err != nil { + return nil, fmt.Errorf("Scanning '%s' failed: %s", text, err) + } + // Safe as mountinfo encodes mountpoints with spaces as \040. + index := strings.Index(text, " - ") + postSeparatorFields := strings.Fields(text[index+3:]) + if len(postSeparatorFields) < 3 { + return nil, fmt.Errorf("Error found less than 3 fields post '-' in %q", text) + } + + if optionalFields != "-" { + p.Optional = optionalFields + } + + p.Fstype = postSeparatorFields[0] + p.Source = postSeparatorFields[1] + p.VfsOpts = strings.Join(postSeparatorFields[2:], " ") + out = append(out, p) + } + return out, nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/mount/mountinfo.go b/vendor/github.com/opencontainers/runc/libcontainer/mount/mountinfo.go new file mode 100644 index 00000000..e3fc3535 --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/mount/mountinfo.go @@ -0,0 +1,40 @@ +package mount + +// Info reveals information about a particular mounted filesystem. This +// struct is populated from the content in the /proc//mountinfo file. +type Info struct { + // ID is a unique identifier of the mount (may be reused after umount). + ID int + + // Parent indicates the ID of the mount parent (or of self for the top of the + // mount tree). + Parent int + + // Major indicates one half of the device ID which identifies the device class. + Major int + + // Minor indicates one half of the device ID which identifies a specific + // instance of device. + Minor int + + // Root of the mount within the filesystem. + Root string + + // Mountpoint indicates the mount point relative to the process's root. + Mountpoint string + + // Opts represents mount-specific options. + Opts string + + // Optional represents optional fields. + Optional string + + // Fstype indicates the type of filesystem, such as EXT3. + Fstype string + + // Source indicates filesystem specific information or "none". + Source string + + // VfsOpts represents per super block options. + VfsOpts string +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/process.go b/vendor/github.com/opencontainers/runc/libcontainer/process.go index f1ad0814..86bf7387 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/process.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/process.go @@ -47,6 +47,10 @@ type Process struct { // ExtraFiles specifies additional open files to be inherited by the container ExtraFiles []*os.File + // Initial sizings for the console + ConsoleWidth uint16 + ConsoleHeight uint16 + // Capabilities specify the capabilities to keep when executing the process inside the container // All capabilities not specified will be dropped from the processes capability mask Capabilities *configs.Capabilities diff --git a/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go index 50f9af57..58980b05 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go @@ -15,6 +15,7 @@ import ( "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/intelrdt" "github.com/opencontainers/runc/libcontainer/system" "github.com/opencontainers/runc/libcontainer/utils" @@ -49,6 +50,7 @@ type setnsProcess struct { parentPipe *os.File childPipe *os.File cgroupPaths map[string]string + intelRdtPath string config *initConfig fds []string process *Process @@ -83,12 +85,20 @@ func (p *setnsProcess) start() (err error) { if err = p.execSetns(); err != nil { return newSystemErrorWithCause(err, "executing setns process") } - // We can't join cgroups if we're in a rootless container. - if !p.config.Rootless && len(p.cgroupPaths) > 0 { + if len(p.cgroupPaths) > 0 { if err := cgroups.EnterPid(p.cgroupPaths, p.pid()); err != nil { return newSystemErrorWithCausef(err, "adding pid %d to cgroups", p.pid()) } } + if p.intelRdtPath != "" { + // if Intel RDT "resource control" filesystem path exists + _, err := os.Stat(p.intelRdtPath) + if err == nil { + if err := intelrdt.WriteIntelRdtTasks(p.intelRdtPath, p.pid()); err != nil { + return newSystemErrorWithCausef(err, "adding pid %d to Intel RDT resource control filesystem", p.pid()) + } + } + } // set rlimits, this has to be done here because we lose permissions // to raise the limits once we enter a user-namespace if err := setupRlimits(p.config.Rlimits, p.pid()); err != nil { @@ -193,16 +203,17 @@ func (p *setnsProcess) setExternalDescriptors(newFds []string) { } type initProcess struct { - cmd *exec.Cmd - parentPipe *os.File - childPipe *os.File - config *initConfig - manager cgroups.Manager - container *linuxContainer - fds []string - process *Process - bootstrapData io.Reader - sharePidns bool + cmd *exec.Cmd + parentPipe *os.File + childPipe *os.File + config *initConfig + manager cgroups.Manager + intelRdtManager intelrdt.Manager + container *linuxContainer + fds []string + process *Process + bootstrapData io.Reader + sharePidns bool } func (p *initProcess) pid() int { @@ -261,12 +272,35 @@ func (p *initProcess) start() error { p.process.ops = nil return newSystemErrorWithCause(err, "starting init process command") } + // Do this before syncing with child so that no children can escape the + // cgroup. We don't need to worry about not doing this and not being root + // because we'd be using the rootless cgroup manager in that case. + if err := p.manager.Apply(p.pid()); err != nil { + return newSystemErrorWithCause(err, "applying cgroup configuration for process") + } + if p.intelRdtManager != nil { + if err := p.intelRdtManager.Apply(p.pid()); err != nil { + return newSystemErrorWithCause(err, "applying Intel RDT configuration for process") + } + } + defer func() { + if err != nil { + // TODO: should not be the responsibility to call here + p.manager.Destroy() + if p.intelRdtManager != nil { + p.intelRdtManager.Destroy() + } + } + }() + if _, err := io.Copy(p.parentPipe, p.bootstrapData); err != nil { return newSystemErrorWithCause(err, "copying bootstrap data to pipe") } + if err := p.execSetns(); err != nil { return newSystemErrorWithCause(err, "running exec setns process for init") } + // Save the standard descriptor names before the container process // can potentially move them (e.g., via dup2()). If we don't do this now, // we won't know at checkpoint time which file descriptor to look up. @@ -275,18 +309,6 @@ func (p *initProcess) start() error { return newSystemErrorWithCausef(err, "getting pipe fds for pid %d", p.pid()) } p.setExternalDescriptors(fds) - // Do this before syncing with child so that no children can escape the - // cgroup. We don't need to worry about not doing this and not being root - // because we'd be using the rootless cgroup manager in that case. - if err := p.manager.Apply(p.pid()); err != nil { - return newSystemErrorWithCause(err, "applying cgroup configuration for process") - } - defer func() { - if err != nil { - // TODO: should not be the responsibility to call here - p.manager.Destroy() - } - }() if err := p.createNetworkInterfaces(); err != nil { return newSystemErrorWithCause(err, "creating network interfaces") } @@ -312,13 +334,20 @@ func (p *initProcess) start() error { if err := p.manager.Set(p.config.Config); err != nil { return newSystemErrorWithCause(err, "setting cgroup config for ready process") } + if p.intelRdtManager != nil { + if err := p.intelRdtManager.Set(p.config.Config); err != nil { + return newSystemErrorWithCause(err, "setting Intel RDT config for ready process") + } + } if p.config.Config.Hooks != nil { + bundle, annotations := utils.Annotations(p.container.config.Labels) s := configs.HookState{ - Version: p.container.config.Version, - ID: p.container.id, - Pid: p.pid(), - Bundle: utils.SearchLabels(p.config.Config.Labels, "bundle"), + Version: p.container.config.Version, + ID: p.container.id, + Pid: p.pid(), + Bundle: bundle, + Annotations: annotations, } for i, hook := range p.config.Config.Hooks.Prestart { if err := hook.Run(s); err != nil { @@ -337,12 +366,19 @@ func (p *initProcess) start() error { if err := p.manager.Set(p.config.Config); err != nil { return newSystemErrorWithCause(err, "setting cgroup config for procHooks process") } + if p.intelRdtManager != nil { + if err := p.intelRdtManager.Set(p.config.Config); err != nil { + return newSystemErrorWithCause(err, "setting Intel RDT config for procHooks process") + } + } if p.config.Config.Hooks != nil { + bundle, annotations := utils.Annotations(p.container.config.Labels) s := configs.HookState{ - Version: p.container.config.Version, - ID: p.container.id, - Pid: p.pid(), - Bundle: utils.SearchLabels(p.config.Config.Labels, "bundle"), + Version: p.container.config.Version, + ID: p.container.id, + Pid: p.pid(), + Bundle: bundle, + Annotations: annotations, } for i, hook := range p.config.Config.Hooks.Prestart { if err := hook.Run(s); err != nil { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go index e2e734a8..7f852efc 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go @@ -13,11 +13,11 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/mount" - "github.com/docker/docker/pkg/symlink" + "github.com/cyphar/filepath-securejoin" "github.com/mrunalp/fileutils" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" + "github.com/opencontainers/runc/libcontainer/mount" "github.com/opencontainers/runc/libcontainer/system" libcontainerUtils "github.com/opencontainers/runc/libcontainer/utils" "github.com/opencontainers/selinux/go-selinux/label" @@ -40,12 +40,12 @@ func needsSetupDev(config *configs.Config) bool { // prepareRootfs sets up the devices, mount points, and filesystems for use // inside a new mount namespace. It doesn't set anything as ro. You must call // finalizeRootfs after this function to finish setting up the rootfs. -func prepareRootfs(pipe io.ReadWriter, config *configs.Config) (err error) { +func prepareRootfs(pipe io.ReadWriter, iConfig *initConfig) (err error) { + config := iConfig.Config if err := prepareRoot(config); err != nil { return newSystemErrorWithCause(err, "preparing rootfs") } - setupDev := needsSetupDev(config) for _, m := range config.Mounts { for _, precmd := range m.PremountCmds { if err := mountCmd(precmd); err != nil { @@ -64,6 +64,8 @@ func prepareRootfs(pipe io.ReadWriter, config *configs.Config) (err error) { } } + setupDev := needsSetupDev(config) + if setupDev { if err := createDevices(config); err != nil { return newSystemErrorWithCause(err, "creating device nodes") @@ -80,6 +82,7 @@ func prepareRootfs(pipe io.ReadWriter, config *configs.Config) (err error) { // The hooks are run after the mounts are setup, but before we switch to the new // root, so that the old root is still available in the hooks for any mount // manipulations. + // Note that iConfig.Cwd is not guaranteed to exist here. if err := syncParentHooks(pipe); err != nil { return err } @@ -98,8 +101,10 @@ func prepareRootfs(pipe io.ReadWriter, config *configs.Config) (err error) { if config.NoPivotRoot { err = msMoveRoot(config.Rootfs) - } else { + } else if config.Namespaces.Contains(configs.NEWNS) { err = pivotRoot(config.Rootfs) + } else { + err = chroot(config.Rootfs) } if err != nil { return newSystemErrorWithCause(err, "jailing process inside rootfs") @@ -111,6 +116,14 @@ func prepareRootfs(pipe io.ReadWriter, config *configs.Config) (err error) { } } + if cwd := iConfig.Cwd; cwd != "" { + // Note that spec.Process.Cwd can contain unclean value like "../../../../foo/bar...". + // However, we are safe to call MkDirAll directly because we are in the jail here. + if err := os.MkdirAll(cwd, 0755); err != nil { + return err + } + } + return nil } @@ -230,7 +243,7 @@ func mountToRootfs(m *configs.Mount, rootfs, mountLabel string) error { // any previous mounts can invalidate the next mount's destination. // this can happen when a user specifies mounts within other mounts to cause breakouts or other // evil stuff to try to escape the container's rootfs. - if dest, err = symlink.FollowSymlinkInScope(dest, rootfs); err != nil { + if dest, err = securejoin.SecureJoin(rootfs, m.Destination); err != nil { return err } if err := checkMountDestination(rootfs, dest); err != nil { @@ -318,7 +331,7 @@ func mountToRootfs(m *configs.Mount, rootfs, mountLabel string) error { // this can happen when a user specifies mounts within other mounts to cause breakouts or other // evil stuff to try to escape the container's rootfs. var err error - if dest, err = symlink.FollowSymlinkInScope(dest, rootfs); err != nil { + if dest, err = securejoin.SecureJoin(rootfs, m.Destination); err != nil { return err } if err := checkMountDestination(rootfs, dest); err != nil { @@ -668,9 +681,12 @@ func pivotRoot(rootfs string) error { return err } - // Make oldroot rprivate to make sure our unmounts don't propagate to the - // host (and thus bork the machine). - if err := unix.Mount("", ".", "", unix.MS_PRIVATE|unix.MS_REC, ""); err != nil { + // Make oldroot rslave to make sure our unmounts don't propagate to the + // host (and thus bork the machine). We don't use rprivate because this is + // known to cause issues due to races where we still have a reference to a + // mount while a process in the host namespace are trying to operate on + // something they think has no mounts (devicemapper in particular). + if err := unix.Mount("", ".", "", unix.MS_SLAVE|unix.MS_REC, ""); err != nil { return err } // Preform the unmount. MNT_DETACH allows us to unmount /proc/self/cwd. @@ -689,6 +705,10 @@ func msMoveRoot(rootfs string) error { if err := unix.Mount(rootfs, "/", "", unix.MS_MOVE, ""); err != nil { return err } + return chroot(rootfs) +} + +func chroot(rootfs string) error { if err := unix.Chroot("."); err != nil { return err } @@ -733,7 +753,14 @@ func remountReadonly(m *configs.Mount) error { flags = m.Flags ) for i := 0; i < 5; i++ { - if err := unix.Mount("", dest, "", uintptr(flags|unix.MS_REMOUNT|unix.MS_RDONLY), ""); err != nil { + // There is a special case in the kernel for + // MS_REMOUNT | MS_BIND, which allows us to change only the + // flags even as an unprivileged user (i.e. user namespace) + // assuming we don't drop any security related flags (nodev, + // nosuid, etc.). So, let's use that case so that we can do + // this re-mount without failing in a userns. + flags |= unix.MS_REMOUNT | unix.MS_BIND | unix.MS_RDONLY + if err := unix.Mount("", dest, "", uintptr(flags), ""); err != nil { switch err { case unix.EBUSY: time.Sleep(100 * time.Millisecond) @@ -752,10 +779,10 @@ func remountReadonly(m *configs.Mount) error { // mounts ( proc/kcore ). // For files, maskPath bind mounts /dev/null over the top of the specified path. // For directories, maskPath mounts read-only tmpfs over the top of the specified path. -func maskPath(path string) error { +func maskPath(path string, mountLabel string) error { if err := unix.Mount("/dev/null", path, "", unix.MS_BIND, ""); err != nil && !os.IsNotExist(err) { if err == unix.ENOTDIR { - return unix.Mount("tmpfs", path, "tmpfs", unix.MS_RDONLY, "") + return unix.Mount("tmpfs", path, "tmpfs", unix.MS_RDONLY, label.FormatMountLabel("", mountLabel)) } return err } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/setgroups_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/setgroups_linux.go deleted file mode 100644 index c7bdb605..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/setgroups_linux.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build linux,go1.5 - -package libcontainer - -import "syscall" - -// Set the GidMappingsEnableSetgroups member to true, so the process's -// setgroups proc entry wont be set to 'deny' if GidMappings are set -func enableSetgroups(sys *syscall.SysProcAttr) { - sys.GidMappingsEnableSetgroups = true -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go index 35b84219..096c601e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/setns_init_linux.go @@ -47,7 +47,10 @@ func (l *linuxSetnsInit) Init() error { return err } } - if l.config.Config.Seccomp != nil { + // Without NoNewPrivileges seccomp is a privileged operation, so we need to + // do this before dropping capabilities; otherwise do it as late as possible + // just before execve so as few syscalls take place after it as possible. + if l.config.Config.Seccomp != nil && !l.config.NoNewPrivileges { if err := seccomp.InitSeccomp(l.config.Config.Seccomp); err != nil { return err } @@ -61,5 +64,13 @@ func (l *linuxSetnsInit) Init() error { if err := label.SetProcessLabel(l.config.ProcessLabel); err != nil { return err } + // Set seccomp as close to execve as possible, so as few syscalls take + // place afterward (reducing the amount of syscalls that users need to + // enable in their seccomp profiles). + if l.config.Config.Seccomp != nil && l.config.NoNewPrivileges { + if err := seccomp.InitSeccomp(l.config.Config.Seccomp); err != nil { + return newSystemErrorWithCause(err, "init seccomp") + } + } return system.Execv(l.config.Args[0], l.config.Args[0:], os.Environ()) } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go index fbcf3a6a..e74d8002 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/standard_init_linux.go @@ -30,15 +30,15 @@ func (l *linuxStandardInit) getSessionRingParams() (string, uint32, uint32) { var newperms uint32 if l.config.Config.Namespaces.Contains(configs.NEWUSER) { - // with user ns we need 'other' search permissions + // With user ns we need 'other' search permissions. newperms = 0x8 } else { - // without user ns we need 'UID' search permissions + // Without user ns we need 'UID' search permissions. newperms = 0x80000 } - // create a unique per session container name that we can - // join in setns; however, other containers can also join it + // Create a unique per session container name that we can join in setns; + // However, other containers can also join it. return fmt.Sprintf("_ses.%s", l.config.ContainerId), 0xffffffff, newperms } @@ -46,12 +46,12 @@ func (l *linuxStandardInit) Init() error { if !l.config.Config.NoNewKeyring { ringname, keepperms, newperms := l.getSessionRingParams() - // do not inherit the parent's session keyring + // Do not inherit the parent's session keyring. sessKeyId, err := keys.JoinSessionKeyring(ringname) if err != nil { return err } - // make session keyring searcheable + // Make session keyring searcheable. if err := keys.ModKeyringPerm(sessKeyId, keepperms, newperms); err != nil { return err } @@ -65,14 +65,9 @@ func (l *linuxStandardInit) Init() error { } label.Init() - - // prepareRootfs() can be executed only for a new mount namespace. - if l.config.Config.Namespaces.Contains(configs.NEWNS) { - if err := prepareRootfs(l.pipe, l.config.Config); err != nil { - return err - } + if err := prepareRootfs(l.pipe, l.config); err != nil { + return err } - // Set up the console. This has to be done *before* we finalize the rootfs, // but *after* we've given the user the chance to set up all of the mounts // they wanted. @@ -115,7 +110,7 @@ func (l *linuxStandardInit) Init() error { } } for _, path := range l.config.Config.MaskPaths { - if err := maskPath(path); err != nil { + if err := maskPath(path, l.config.Config.MountLabel); err != nil { return err } } @@ -150,19 +145,20 @@ func (l *linuxStandardInit) Init() error { if err := pdeath.Restore(); err != nil { return err } - // compare the parent from the initial start of the init process and make sure that it did not change. - // if the parent changes that means it died and we were reparented to something else so we should - // just kill ourself and not cause problems for someone else. + // Compare the parent from the initial start of the init process and make + // sure that it did not change. if the parent changes that means it died + // and we were reparented to something else so we should just kill ourself + // and not cause problems for someone else. if unix.Getppid() != l.parentPid { return unix.Kill(unix.Getpid(), unix.SIGKILL) } - // check for the arg before waiting to make sure it exists and it is returned - // as a create time error. + // Check for the arg before waiting to make sure it exists and it is + // returned as a create time error. name, err := exec.LookPath(l.config.Args[0]) if err != nil { return err } - // close the pipe to signal that we have completed our init. + // Close the pipe to signal that we have completed our init. l.pipe.Close() // Wait for the FIFO to be opened on the other side before exec-ing the // user process. We open it through /proc/self/fd/$fd, because the fd that @@ -170,19 +166,26 @@ func (l *linuxStandardInit) Init() error { // re-open an O_PATH fd through /proc. fd, err := unix.Open(fmt.Sprintf("/proc/self/fd/%d", l.fifoFd), unix.O_WRONLY|unix.O_CLOEXEC, 0) if err != nil { - return newSystemErrorWithCause(err, "openat exec fifo") + return newSystemErrorWithCause(err, "open exec fifo") } if _, err := unix.Write(fd, []byte("0")); err != nil { return newSystemErrorWithCause(err, "write 0 exec fifo") } + // Close the O_PATH fifofd fd before exec because the kernel resets + // dumpable in the wrong order. This has been fixed in newer kernels, but + // we keep this to ensure CVE-2016-9962 doesn't re-emerge on older kernels. + // N.B. the core issue itself (passing dirfds to the host filesystem) has + // since been resolved. + // https://github.com/torvalds/linux/blob/v4.9/fs/exec.c#L1290-L1318 + unix.Close(l.fifoFd) + // Set seccomp as close to execve as possible, so as few syscalls take + // place afterward (reducing the amount of syscalls that users need to + // enable in their seccomp profiles). if l.config.Config.Seccomp != nil && l.config.NoNewPrivileges { if err := seccomp.InitSeccomp(l.config.Config.Seccomp); err != nil { return newSystemErrorWithCause(err, "init seccomp") } } - // close the statedir fd before exec because the kernel resets dumpable in the wrong order - // https://github.com/torvalds/linux/blob/v4.9/fs/exec.c#L1290-L1318 - unix.Close(l.fifoFd) if err := syscall.Exec(name, l.config.Args[0:], os.Environ()); err != nil { return newSystemErrorWithCause(err, "exec user process") } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go index 44fa6b43..b45ce23e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go @@ -45,6 +45,11 @@ func destroy(c *linuxContainer) error { } } err := c.cgroupManager.Destroy() + if c.intelRdtManager != nil { + if ierr := c.intelRdtManager.Destroy(); err == nil { + err = ierr + } + } if rerr := os.RemoveAll(c.root); err == nil { err = rerr } @@ -58,10 +63,12 @@ func destroy(c *linuxContainer) error { func runPoststopHooks(c *linuxContainer) error { if c.config.Hooks != nil { + bundle, annotations := utils.Annotations(c.config.Labels) s := configs.HookState{ - Version: c.config.Version, - ID: c.id, - Bundle: utils.SearchLabels(c.config.Labels, "bundle"), + Version: c.config.Version, + ID: c.id, + Bundle: bundle, + Annotations: annotations, } for _, hook := range c.config.Hooks.Poststop { if err := hook.Run(s); err != nil { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/stats_freebsd.go b/vendor/github.com/opencontainers/runc/libcontainer/stats_freebsd.go deleted file mode 100644 index f8d1d689..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/stats_freebsd.go +++ /dev/null @@ -1,5 +0,0 @@ -package libcontainer - -type Stats struct { - Interfaces []*NetworkInterface -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/stats_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/stats_linux.go index c629dc67..29fd641e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/stats_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/stats_linux.go @@ -1,8 +1,10 @@ package libcontainer import "github.com/opencontainers/runc/libcontainer/cgroups" +import "github.com/opencontainers/runc/libcontainer/intelrdt" type Stats struct { - Interfaces []*NetworkInterface - CgroupStats *cgroups.Stats + Interfaces []*NetworkInterface + CgroupStats *cgroups.Stats + IntelRdtStats *intelrdt.Stats } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/stats_solaris.go b/vendor/github.com/opencontainers/runc/libcontainer/stats_solaris.go deleted file mode 100644 index da78c1c2..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/stats_solaris.go +++ /dev/null @@ -1,7 +0,0 @@ -package libcontainer - -// Solaris - TODO - -type Stats struct { - Interfaces []*NetworkInterface -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/stats_windows.go b/vendor/github.com/opencontainers/runc/libcontainer/stats_windows.go deleted file mode 100644 index f8d1d689..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/stats_windows.go +++ /dev/null @@ -1,5 +0,0 @@ -package libcontainer - -type Stats struct { - Interfaces []*NetworkInterface -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/system/BUILD new file mode 100644 index 00000000..ad5438de --- /dev/null +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/BUILD @@ -0,0 +1,69 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "linux.go", + "proc.go", + "syscall_linux_32.go", + "syscall_linux_64.go", + "sysconfig.go", + "sysconfig_notcgo.go", + "unsupported.go", + "xattrs_linux.go", + ], + cgo = True, + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/system", + importpath = "github.com/opencontainers/runc/libcontainer/system", + visibility = ["//visibility:public"], + deps = select({ + "@io_bazel_rules_go//go/platform:linux_386": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_amd64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_arm": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_arm64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_mips": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_mips64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_mips64le": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_mipsle": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_ppc64": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_ppc64le": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "@io_bazel_rules_go//go/platform:linux_s390x": [ + "//vendor/golang.org/x/sys/unix:go_default_library", + ], + "//conditions:default": [], + }), +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/linux.go b/vendor/github.com/opencontainers/runc/libcontainer/system/linux.go index 4837085a..5f124cd8 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/linux.go @@ -134,3 +134,14 @@ func RunningInUserNS() bool { func SetSubreaper(i int) error { return unix.Prctl(PR_SET_CHILD_SUBREAPER, uintptr(i), 0, 0, 0) } + +// GetSubreaper returns the subreaper setting for the calling process +func GetSubreaper() (int, error) { + var i uintptr + + if err := unix.Prctl(unix.PR_GET_CHILD_SUBREAPER, uintptr(unsafe.Pointer(&i)), 0, 0, 0); err != nil { + return -1, err + } + + return int(i), nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go b/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_32.go similarity index 93% rename from vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go rename to vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_32.go index 3f7235ed..c5ca5d86 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_32.go @@ -1,4 +1,5 @@ -// +build linux,386 +// +build linux +// +build 386 arm package system diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_64.go b/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_64.go index d7891a2f..11c3faaf 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_64.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_64.go @@ -1,4 +1,5 @@ -// +build linux,arm64 linux,amd64 linux,ppc linux,ppc64 linux,ppc64le linux,s390x +// +build linux +// +build arm64 amd64 mips mipsle mips64 mips64le ppc ppc64 ppc64le s390x package system diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_arm.go b/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_arm.go deleted file mode 100644 index 31ff3deb..00000000 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_arm.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build linux,arm - -package system - -import ( - "golang.org/x/sys/unix" -) - -// Setuid sets the uid of the calling thread to the specified uid. -func Setuid(uid int) (err error) { - _, _, e1 := unix.RawSyscall(unix.SYS_SETUID32, uintptr(uid), 0, 0) - if e1 != 0 { - err = e1 - } - return -} - -// Setgid sets the gid of the calling thread to the specified gid. -func Setgid(gid int) (err error) { - _, _, e1 := unix.RawSyscall(unix.SYS_SETGID32, uintptr(gid), 0, 0) - if e1 != 0 { - err = e1 - } - return -} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/sysconfig.go b/vendor/github.com/opencontainers/runc/libcontainer/system/sysconfig.go index b3a07cba..b8434f10 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/sysconfig.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/sysconfig.go @@ -1,4 +1,4 @@ -// +build cgo,linux cgo,freebsd +// +build cgo,linux package system diff --git a/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD b/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD index 5837fc68..855129ee 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD +++ b/vendor/github.com/opencontainers/runc/libcontainer/utils/BUILD @@ -3,14 +3,11 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ + "cmsg.go", "utils.go", "utils_unix.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux_amd64": [ - "cmsg.go", - ], - "//conditions:default": [], - }), + ], + importmap = "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/utils", importpath = "github.com/opencontainers/runc/libcontainer/utils", visibility = ["//visibility:public"], deps = ["//vendor/golang.org/x/sys/unix:go_default_library"], diff --git a/vendor/github.com/opencontainers/runc/libcontainer/utils/cmsg.go b/vendor/github.com/opencontainers/runc/libcontainer/utils/cmsg.go index 2cbb6491..c8a9364d 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/utils/cmsg.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/utils/cmsg.go @@ -84,12 +84,10 @@ func RecvFd(socket *os.File) (*os.File, error) { // addition, the file.Name() of the given file will also be sent as // non-auxiliary data in the same payload (allowing to send contextual // information for a file descriptor). -func SendFd(socket, file *os.File) error { - name := []byte(file.Name()) +func SendFd(socket *os.File, name string, fd uintptr) error { if len(name) >= MaxNameLen { - return fmt.Errorf("sendfd: filename too long: %s", file.Name()) + return fmt.Errorf("sendfd: filename too long: %s", name) } - oob := unix.UnixRights(int(file.Fd())) - - return unix.Sendmsg(int(socket.Fd()), name, oob, nil, 0) + oob := unix.UnixRights(int(fd)) + return unix.Sendmsg(int(socket.Fd()), []byte(name), oob, nil, 0) } diff --git a/vendor/github.com/pquerna/ffjson/LICENSE b/vendor/github.com/pquerna/ffjson/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/pquerna/ffjson/NOTICE b/vendor/github.com/pquerna/ffjson/NOTICE new file mode 100644 index 00000000..405a4961 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/NOTICE @@ -0,0 +1,8 @@ +ffjson +Copyright (c) 2014, Paul Querna + +This product includes software developed by +Paul Querna (http://paul.querna.org/). + +Portions of this software were developed as +part of Go, Copyright (c) 2012 The Go Authors. \ No newline at end of file diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/BUILD b/vendor/github.com/pquerna/ffjson/fflib/v1/BUILD new file mode 100644 index 00000000..446f8268 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/BUILD @@ -0,0 +1,41 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "buffer.go", + "buffer_nopool.go", + "buffer_pool.go", + "bytenum.go", + "decimal.go", + "extfloat.go", + "fold.go", + "ftoa.go", + "iota.go", + "jsonstring.go", + "lexer.go", + "reader.go", + "reader_scan_generic.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/pquerna/ffjson/fflib/v1", + importpath = "github.com/pquerna/ffjson/fflib/v1", + visibility = ["//visibility:public"], + deps = ["//vendor/github.com/pquerna/ffjson/fflib/v1/internal:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//vendor/github.com/pquerna/ffjson/fflib/v1/internal:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/buffer.go b/vendor/github.com/pquerna/ffjson/fflib/v1/buffer.go new file mode 100644 index 00000000..7f63a858 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/buffer.go @@ -0,0 +1,421 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package v1 + +// Simple byte buffer for marshaling data. + +import ( + "bytes" + "encoding/json" + "errors" + "io" + "unicode/utf8" +) + +type grower interface { + Grow(n int) +} + +type truncater interface { + Truncate(n int) + Reset() +} + +type bytesReader interface { + Bytes() []byte + String() string +} + +type runeWriter interface { + WriteRune(r rune) (n int, err error) +} + +type stringWriter interface { + WriteString(s string) (n int, err error) +} + +type lener interface { + Len() int +} + +type rewinder interface { + Rewind(n int) (err error) +} + +type encoder interface { + Encode(interface{}) error +} + +// TODO(pquerna): continue to reduce these interfaces + +type EncodingBuffer interface { + io.Writer + io.WriterTo + io.ByteWriter + stringWriter + truncater + grower + rewinder + encoder +} + +type DecodingBuffer interface { + io.ReadWriter + io.ByteWriter + stringWriter + runeWriter + truncater + grower + bytesReader + lener +} + +// A Buffer is a variable-sized buffer of bytes with Read and Write methods. +// The zero value for Buffer is an empty buffer ready to use. +type Buffer struct { + buf []byte // contents are the bytes buf[off : len(buf)] + off int // read at &buf[off], write at &buf[len(buf)] + runeBytes [utf8.UTFMax]byte // avoid allocation of slice on each WriteByte or Rune + encoder *json.Encoder + skipTrailingByte bool +} + +// ErrTooLarge is passed to panic if memory cannot be allocated to store data in a buffer. +var ErrTooLarge = errors.New("fflib.v1.Buffer: too large") + +// Bytes returns a slice of the contents of the unread portion of the buffer; +// len(b.Bytes()) == b.Len(). If the caller changes the contents of the +// returned slice, the contents of the buffer will change provided there +// are no intervening method calls on the Buffer. +func (b *Buffer) Bytes() []byte { return b.buf[b.off:] } + +// String returns the contents of the unread portion of the buffer +// as a string. If the Buffer is a nil pointer, it returns "". +func (b *Buffer) String() string { + if b == nil { + // Special case, useful in debugging. + return "" + } + return string(b.buf[b.off:]) +} + +// Len returns the number of bytes of the unread portion of the buffer; +// b.Len() == len(b.Bytes()). +func (b *Buffer) Len() int { return len(b.buf) - b.off } + +// Truncate discards all but the first n unread bytes from the buffer. +// It panics if n is negative or greater than the length of the buffer. +func (b *Buffer) Truncate(n int) { + if n == 0 { + b.off = 0 + b.buf = b.buf[0:0] + } else { + b.buf = b.buf[0 : b.off+n] + } +} + +// Reset resets the buffer so it has no content. +// b.Reset() is the same as b.Truncate(0). +func (b *Buffer) Reset() { b.Truncate(0) } + +// grow grows the buffer to guarantee space for n more bytes. +// It returns the index where bytes should be written. +// If the buffer can't grow it will panic with ErrTooLarge. +func (b *Buffer) grow(n int) int { + // If we have no buffer, get one from the pool + m := b.Len() + if m == 0 { + if b.buf == nil { + b.buf = makeSlice(2 * n) + b.off = 0 + } else if b.off != 0 { + // If buffer is empty, reset to recover space. + b.Truncate(0) + } + } + if len(b.buf)+n > cap(b.buf) { + var buf []byte + if m+n <= cap(b.buf)/2 { + // We can slide things down instead of allocating a new + // slice. We only need m+n <= cap(b.buf) to slide, but + // we instead let capacity get twice as large so we + // don't spend all our time copying. + copy(b.buf[:], b.buf[b.off:]) + buf = b.buf[:m] + } else { + // not enough space anywhere + buf = makeSlice(2*cap(b.buf) + n) + copy(buf, b.buf[b.off:]) + Pool(b.buf) + b.buf = buf + } + b.off = 0 + } + b.buf = b.buf[0 : b.off+m+n] + return b.off + m +} + +// Grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After Grow(n), at least n bytes can be written to the +// buffer without another allocation. +// If n is negative, Grow will panic. +// If the buffer can't grow it will panic with ErrTooLarge. +func (b *Buffer) Grow(n int) { + if n < 0 { + panic("bytes.Buffer.Grow: negative count") + } + m := b.grow(n) + b.buf = b.buf[0:m] +} + +// Write appends the contents of p to the buffer, growing the buffer as +// needed. The return value n is the length of p; err is always nil. If the +// buffer becomes too large, Write will panic with ErrTooLarge. +func (b *Buffer) Write(p []byte) (n int, err error) { + if b.skipTrailingByte { + p = p[:len(p)-1] + } + m := b.grow(len(p)) + return copy(b.buf[m:], p), nil +} + +// WriteString appends the contents of s to the buffer, growing the buffer as +// needed. The return value n is the length of s; err is always nil. If the +// buffer becomes too large, WriteString will panic with ErrTooLarge. +func (b *Buffer) WriteString(s string) (n int, err error) { + m := b.grow(len(s)) + return copy(b.buf[m:], s), nil +} + +// MinRead is the minimum slice size passed to a Read call by +// Buffer.ReadFrom. As long as the Buffer has at least MinRead bytes beyond +// what is required to hold the contents of r, ReadFrom will not grow the +// underlying buffer. +const minRead = 512 + +// ReadFrom reads data from r until EOF and appends it to the buffer, growing +// the buffer as needed. The return value n is the number of bytes read. Any +// error except io.EOF encountered during the read is also returned. If the +// buffer becomes too large, ReadFrom will panic with ErrTooLarge. +func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) { + // If buffer is empty, reset to recover space. + if b.off >= len(b.buf) { + b.Truncate(0) + } + for { + if free := cap(b.buf) - len(b.buf); free < minRead { + // not enough space at end + newBuf := b.buf + if b.off+free < minRead { + // not enough space using beginning of buffer; + // double buffer capacity + newBuf = makeSlice(2*cap(b.buf) + minRead) + } + copy(newBuf, b.buf[b.off:]) + Pool(b.buf) + b.buf = newBuf[:len(b.buf)-b.off] + b.off = 0 + } + m, e := r.Read(b.buf[len(b.buf):cap(b.buf)]) + b.buf = b.buf[0 : len(b.buf)+m] + n += int64(m) + if e == io.EOF { + break + } + if e != nil { + return n, e + } + } + return n, nil // err is EOF, so return nil explicitly +} + +// WriteTo writes data to w until the buffer is drained or an error occurs. +// The return value n is the number of bytes written; it always fits into an +// int, but it is int64 to match the io.WriterTo interface. Any error +// encountered during the write is also returned. +func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) { + if b.off < len(b.buf) { + nBytes := b.Len() + m, e := w.Write(b.buf[b.off:]) + if m > nBytes { + panic("bytes.Buffer.WriteTo: invalid Write count") + } + b.off += m + n = int64(m) + if e != nil { + return n, e + } + // all bytes should have been written, by definition of + // Write method in io.Writer + if m != nBytes { + return n, io.ErrShortWrite + } + } + // Buffer is now empty; reset. + b.Truncate(0) + return +} + +// WriteByte appends the byte c to the buffer, growing the buffer as needed. +// The returned error is always nil, but is included to match bufio.Writer's +// WriteByte. If the buffer becomes too large, WriteByte will panic with +// ErrTooLarge. +func (b *Buffer) WriteByte(c byte) error { + m := b.grow(1) + b.buf[m] = c + return nil +} + +func (b *Buffer) Rewind(n int) error { + b.buf = b.buf[:len(b.buf)-n] + return nil +} + +func (b *Buffer) Encode(v interface{}) error { + if b.encoder == nil { + b.encoder = json.NewEncoder(b) + } + b.skipTrailingByte = true + err := b.encoder.Encode(v) + b.skipTrailingByte = false + return err +} + +// WriteRune appends the UTF-8 encoding of Unicode code point r to the +// buffer, returning its length and an error, which is always nil but is +// included to match bufio.Writer's WriteRune. The buffer is grown as needed; +// if it becomes too large, WriteRune will panic with ErrTooLarge. +func (b *Buffer) WriteRune(r rune) (n int, err error) { + if r < utf8.RuneSelf { + b.WriteByte(byte(r)) + return 1, nil + } + n = utf8.EncodeRune(b.runeBytes[0:], r) + b.Write(b.runeBytes[0:n]) + return n, nil +} + +// Read reads the next len(p) bytes from the buffer or until the buffer +// is drained. The return value n is the number of bytes read. If the +// buffer has no data to return, err is io.EOF (unless len(p) is zero); +// otherwise it is nil. +func (b *Buffer) Read(p []byte) (n int, err error) { + if b.off >= len(b.buf) { + // Buffer is empty, reset to recover space. + b.Truncate(0) + if len(p) == 0 { + return + } + return 0, io.EOF + } + n = copy(p, b.buf[b.off:]) + b.off += n + return +} + +// Next returns a slice containing the next n bytes from the buffer, +// advancing the buffer as if the bytes had been returned by Read. +// If there are fewer than n bytes in the buffer, Next returns the entire buffer. +// The slice is only valid until the next call to a read or write method. +func (b *Buffer) Next(n int) []byte { + m := b.Len() + if n > m { + n = m + } + data := b.buf[b.off : b.off+n] + b.off += n + return data +} + +// ReadByte reads and returns the next byte from the buffer. +// If no byte is available, it returns error io.EOF. +func (b *Buffer) ReadByte() (c byte, err error) { + if b.off >= len(b.buf) { + // Buffer is empty, reset to recover space. + b.Truncate(0) + return 0, io.EOF + } + c = b.buf[b.off] + b.off++ + return c, nil +} + +// ReadRune reads and returns the next UTF-8-encoded +// Unicode code point from the buffer. +// If no bytes are available, the error returned is io.EOF. +// If the bytes are an erroneous UTF-8 encoding, it +// consumes one byte and returns U+FFFD, 1. +func (b *Buffer) ReadRune() (r rune, size int, err error) { + if b.off >= len(b.buf) { + // Buffer is empty, reset to recover space. + b.Truncate(0) + return 0, 0, io.EOF + } + c := b.buf[b.off] + if c < utf8.RuneSelf { + b.off++ + return rune(c), 1, nil + } + r, n := utf8.DecodeRune(b.buf[b.off:]) + b.off += n + return r, n, nil +} + +// ReadBytes reads until the first occurrence of delim in the input, +// returning a slice containing the data up to and including the delimiter. +// If ReadBytes encounters an error before finding a delimiter, +// it returns the data read before the error and the error itself (often io.EOF). +// ReadBytes returns err != nil if and only if the returned data does not end in +// delim. +func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) { + slice, err := b.readSlice(delim) + // return a copy of slice. The buffer's backing array may + // be overwritten by later calls. + line = append(line, slice...) + return +} + +// readSlice is like ReadBytes but returns a reference to internal buffer data. +func (b *Buffer) readSlice(delim byte) (line []byte, err error) { + i := bytes.IndexByte(b.buf[b.off:], delim) + end := b.off + i + 1 + if i < 0 { + end = len(b.buf) + err = io.EOF + } + line = b.buf[b.off:end] + b.off = end + return line, err +} + +// ReadString reads until the first occurrence of delim in the input, +// returning a string containing the data up to and including the delimiter. +// If ReadString encounters an error before finding a delimiter, +// it returns the data read before the error and the error itself (often io.EOF). +// ReadString returns err != nil if and only if the returned data does not end +// in delim. +func (b *Buffer) ReadString(delim byte) (line string, err error) { + slice, err := b.readSlice(delim) + return string(slice), err +} + +// NewBuffer creates and initializes a new Buffer using buf as its initial +// contents. It is intended to prepare a Buffer to read existing data. It +// can also be used to size the internal buffer for writing. To do that, +// buf should have the desired capacity but a length of zero. +// +// In most cases, new(Buffer) (or just declaring a Buffer variable) is +// sufficient to initialize a Buffer. +func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} } + +// NewBufferString creates and initializes a new Buffer using string s as its +// initial contents. It is intended to prepare a buffer to read an existing +// string. +// +// In most cases, new(Buffer) (or just declaring a Buffer variable) is +// sufficient to initialize a Buffer. +func NewBufferString(s string) *Buffer { + return &Buffer{buf: []byte(s)} +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/buffer_nopool.go b/vendor/github.com/pquerna/ffjson/fflib/v1/buffer_nopool.go new file mode 100644 index 00000000..b84af6ff --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/buffer_nopool.go @@ -0,0 +1,11 @@ +// +build !go1.3 + +package v1 + +// Stub version of buffer_pool.go for Go 1.2, which doesn't have sync.Pool. + +func Pool(b []byte) {} + +func makeSlice(n int) []byte { + return make([]byte, n) +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/buffer_pool.go b/vendor/github.com/pquerna/ffjson/fflib/v1/buffer_pool.go new file mode 100644 index 00000000..a021c57c --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/buffer_pool.go @@ -0,0 +1,105 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.3 + +package v1 + +// Allocation pools for Buffers. + +import "sync" + +var pools [14]sync.Pool +var pool64 *sync.Pool + +func init() { + var i uint + // TODO(pquerna): add science here around actual pool sizes. + for i = 6; i < 20; i++ { + n := 1 << i + pools[poolNum(n)].New = func() interface{} { return make([]byte, 0, n) } + } + pool64 = &pools[0] +} + +// This returns the pool number that will give a buffer of +// at least 'i' bytes. +func poolNum(i int) int { + // TODO(pquerna): convert to log2 w/ bsr asm instruction: + // + if i <= 64 { + return 0 + } else if i <= 128 { + return 1 + } else if i <= 256 { + return 2 + } else if i <= 512 { + return 3 + } else if i <= 1024 { + return 4 + } else if i <= 2048 { + return 5 + } else if i <= 4096 { + return 6 + } else if i <= 8192 { + return 7 + } else if i <= 16384 { + return 8 + } else if i <= 32768 { + return 9 + } else if i <= 65536 { + return 10 + } else if i <= 131072 { + return 11 + } else if i <= 262144 { + return 12 + } else if i <= 524288 { + return 13 + } else { + return -1 + } +} + +// Send a buffer to the Pool to reuse for other instances. +// You may no longer utilize the content of the buffer, since it may be used +// by other goroutines. +func Pool(b []byte) { + if b == nil { + return + } + c := cap(b) + + // Our smallest buffer is 64 bytes, so we discard smaller buffers. + if c < 64 { + return + } + + // We need to put the incoming buffer into the NEXT buffer, + // since a buffer guarantees AT LEAST the number of bytes available + // that is the top of this buffer. + // That is the reason for dividing the cap by 2, so it gets into the NEXT bucket. + // We add 2 to avoid rounding down if size is exactly power of 2. + pn := poolNum((c + 2) >> 1) + if pn != -1 { + pools[pn].Put(b[0:0]) + } + // if we didn't have a slot for this []byte, we just drop it and let the GC + // take care of it. +} + +// makeSlice allocates a slice of size n -- it will attempt to use a pool'ed +// instance whenever possible. +func makeSlice(n int) []byte { + if n <= 64 { + return pool64.Get().([]byte)[0:n] + } + + pn := poolNum(n) + + if pn != -1 { + return pools[pn].Get().([]byte)[0:n] + } else { + return make([]byte, n) + } +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/bytenum.go b/vendor/github.com/pquerna/ffjson/fflib/v1/bytenum.go new file mode 100644 index 00000000..08477409 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/bytenum.go @@ -0,0 +1,88 @@ +/** + * Copyright 2014 Paul Querna + * + * 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. + * + */ + +/* Portions of this file are on Go stdlib's strconv/iota.go */ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package v1 + +import ( + "github.com/pquerna/ffjson/fflib/v1/internal" +) + +func ParseFloat(s []byte, bitSize int) (f float64, err error) { + return internal.ParseFloat(s, bitSize) +} + +// ParseUint is like ParseInt but for unsigned numbers, and oeprating on []byte +func ParseUint(s []byte, base int, bitSize int) (n uint64, err error) { + if len(s) == 1 { + switch s[0] { + case '0': + return 0, nil + case '1': + return 1, nil + case '2': + return 2, nil + case '3': + return 3, nil + case '4': + return 4, nil + case '5': + return 5, nil + case '6': + return 6, nil + case '7': + return 7, nil + case '8': + return 8, nil + case '9': + return 9, nil + } + } + return internal.ParseUint(s, base, bitSize) +} + +func ParseInt(s []byte, base int, bitSize int) (i int64, err error) { + if len(s) == 1 { + switch s[0] { + case '0': + return 0, nil + case '1': + return 1, nil + case '2': + return 2, nil + case '3': + return 3, nil + case '4': + return 4, nil + case '5': + return 5, nil + case '6': + return 6, nil + case '7': + return 7, nil + case '8': + return 8, nil + case '9': + return 9, nil + } + } + return internal.ParseInt(s, base, bitSize) +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/decimal.go b/vendor/github.com/pquerna/ffjson/fflib/v1/decimal.go new file mode 100644 index 00000000..069df7a0 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/decimal.go @@ -0,0 +1,378 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. + +package v1 + +type decimal struct { + d [800]byte // digits + nd int // number of digits used + dp int // decimal point + neg bool + trunc bool // discarded nonzero digits beyond d[:nd] +} + +func (a *decimal) String() string { + n := 10 + a.nd + if a.dp > 0 { + n += a.dp + } + if a.dp < 0 { + n += -a.dp + } + + buf := make([]byte, n) + w := 0 + switch { + case a.nd == 0: + return "0" + + case a.dp <= 0: + // zeros fill space between decimal point and digits + buf[w] = '0' + w++ + buf[w] = '.' + w++ + w += digitZero(buf[w : w+-a.dp]) + w += copy(buf[w:], a.d[0:a.nd]) + + case a.dp < a.nd: + // decimal point in middle of digits + w += copy(buf[w:], a.d[0:a.dp]) + buf[w] = '.' + w++ + w += copy(buf[w:], a.d[a.dp:a.nd]) + + default: + // zeros fill space between digits and decimal point + w += copy(buf[w:], a.d[0:a.nd]) + w += digitZero(buf[w : w+a.dp-a.nd]) + } + return string(buf[0:w]) +} + +func digitZero(dst []byte) int { + for i := range dst { + dst[i] = '0' + } + return len(dst) +} + +// trim trailing zeros from number. +// (They are meaningless; the decimal point is tracked +// independent of the number of digits.) +func trim(a *decimal) { + for a.nd > 0 && a.d[a.nd-1] == '0' { + a.nd-- + } + if a.nd == 0 { + a.dp = 0 + } +} + +// Assign v to a. +func (a *decimal) Assign(v uint64) { + var buf [24]byte + + // Write reversed decimal in buf. + n := 0 + for v > 0 { + v1 := v / 10 + v -= 10 * v1 + buf[n] = byte(v + '0') + n++ + v = v1 + } + + // Reverse again to produce forward decimal in a.d. + a.nd = 0 + for n--; n >= 0; n-- { + a.d[a.nd] = buf[n] + a.nd++ + } + a.dp = a.nd + trim(a) +} + +// Maximum shift that we can do in one pass without overflow. +// Signed int has 31 bits, and we have to be able to accommodate 9<>k == 0; r++ { + if r >= a.nd { + if n == 0 { + // a == 0; shouldn't get here, but handle anyway. + a.nd = 0 + return + } + for n>>k == 0 { + n = n * 10 + r++ + } + break + } + c := int(a.d[r]) + n = n*10 + c - '0' + } + a.dp -= r - 1 + + // Pick up a digit, put down a digit. + for ; r < a.nd; r++ { + c := int(a.d[r]) + dig := n >> k + n -= dig << k + a.d[w] = byte(dig + '0') + w++ + n = n*10 + c - '0' + } + + // Put down extra digits. + for n > 0 { + dig := n >> k + n -= dig << k + if w < len(a.d) { + a.d[w] = byte(dig + '0') + w++ + } else if dig > 0 { + a.trunc = true + } + n = n * 10 + } + + a.nd = w + trim(a) +} + +// Cheat sheet for left shift: table indexed by shift count giving +// number of new digits that will be introduced by that shift. +// +// For example, leftcheats[4] = {2, "625"}. That means that +// if we are shifting by 4 (multiplying by 16), it will add 2 digits +// when the string prefix is "625" through "999", and one fewer digit +// if the string prefix is "000" through "624". +// +// Credit for this trick goes to Ken. + +type leftCheat struct { + delta int // number of new digits + cutoff string // minus one digit if original < a. +} + +var leftcheats = []leftCheat{ + // Leading digits of 1/2^i = 5^i. + // 5^23 is not an exact 64-bit floating point number, + // so have to use bc for the math. + /* + seq 27 | sed 's/^/5^/' | bc | + awk 'BEGIN{ print "\tleftCheat{ 0, \"\" }," } + { + log2 = log(2)/log(10) + printf("\tleftCheat{ %d, \"%s\" },\t// * %d\n", + int(log2*NR+1), $0, 2**NR) + }' + */ + {0, ""}, + {1, "5"}, // * 2 + {1, "25"}, // * 4 + {1, "125"}, // * 8 + {2, "625"}, // * 16 + {2, "3125"}, // * 32 + {2, "15625"}, // * 64 + {3, "78125"}, // * 128 + {3, "390625"}, // * 256 + {3, "1953125"}, // * 512 + {4, "9765625"}, // * 1024 + {4, "48828125"}, // * 2048 + {4, "244140625"}, // * 4096 + {4, "1220703125"}, // * 8192 + {5, "6103515625"}, // * 16384 + {5, "30517578125"}, // * 32768 + {5, "152587890625"}, // * 65536 + {6, "762939453125"}, // * 131072 + {6, "3814697265625"}, // * 262144 + {6, "19073486328125"}, // * 524288 + {7, "95367431640625"}, // * 1048576 + {7, "476837158203125"}, // * 2097152 + {7, "2384185791015625"}, // * 4194304 + {7, "11920928955078125"}, // * 8388608 + {8, "59604644775390625"}, // * 16777216 + {8, "298023223876953125"}, // * 33554432 + {8, "1490116119384765625"}, // * 67108864 + {9, "7450580596923828125"}, // * 134217728 +} + +// Is the leading prefix of b lexicographically less than s? +func prefixIsLessThan(b []byte, s string) bool { + for i := 0; i < len(s); i++ { + if i >= len(b) { + return true + } + if b[i] != s[i] { + return b[i] < s[i] + } + } + return false +} + +// Binary shift left (/ 2) by k bits. k <= maxShift to avoid overflow. +func leftShift(a *decimal, k uint) { + delta := leftcheats[k].delta + if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) { + delta-- + } + + r := a.nd // read index + w := a.nd + delta // write index + n := 0 + + // Pick up a digit, put down a digit. + for r--; r >= 0; r-- { + n += (int(a.d[r]) - '0') << k + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + // Put down extra digits. + for n > 0 { + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + a.nd += delta + if a.nd >= len(a.d) { + a.nd = len(a.d) + } + a.dp += delta + trim(a) +} + +// Binary shift left (k > 0) or right (k < 0). +func (a *decimal) Shift(k int) { + switch { + case a.nd == 0: + // nothing to do: a == 0 + case k > 0: + for k > maxShift { + leftShift(a, maxShift) + k -= maxShift + } + leftShift(a, uint(k)) + case k < 0: + for k < -maxShift { + rightShift(a, maxShift) + k += maxShift + } + rightShift(a, uint(-k)) + } +} + +// If we chop a at nd digits, should we round up? +func shouldRoundUp(a *decimal, nd int) bool { + if nd < 0 || nd >= a.nd { + return false + } + if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even + // if we truncated, a little higher than what's recorded - always round up + if a.trunc { + return true + } + return nd > 0 && (a.d[nd-1]-'0')%2 != 0 + } + // not halfway - digit tells all + return a.d[nd] >= '5' +} + +// Round a to nd digits (or fewer). +// If nd is zero, it means we're rounding +// just to the left of the digits, as in +// 0.09 -> 0.1. +func (a *decimal) Round(nd int) { + if nd < 0 || nd >= a.nd { + return + } + if shouldRoundUp(a, nd) { + a.RoundUp(nd) + } else { + a.RoundDown(nd) + } +} + +// Round a down to nd digits (or fewer). +func (a *decimal) RoundDown(nd int) { + if nd < 0 || nd >= a.nd { + return + } + a.nd = nd + trim(a) +} + +// Round a up to nd digits (or fewer). +func (a *decimal) RoundUp(nd int) { + if nd < 0 || nd >= a.nd { + return + } + + // round up + for i := nd - 1; i >= 0; i-- { + c := a.d[i] + if c < '9' { // can stop after this digit + a.d[i]++ + a.nd = i + 1 + return + } + } + + // Number is all 9s. + // Change to single 1 with adjusted decimal point. + a.d[0] = '1' + a.nd = 1 + a.dp++ +} + +// Extract integer part, rounded appropriately. +// No guarantees about overflow. +func (a *decimal) RoundedInteger() uint64 { + if a.dp > 20 { + return 0xFFFFFFFFFFFFFFFF + } + var i int + n := uint64(0) + for i = 0; i < a.dp && i < a.nd; i++ { + n = n*10 + uint64(a.d[i]-'0') + } + for ; i < a.dp; i++ { + n *= 10 + } + if shouldRoundUp(a, a.dp) { + n++ + } + return n +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/extfloat.go b/vendor/github.com/pquerna/ffjson/fflib/v1/extfloat.go new file mode 100644 index 00000000..508ddc6b --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/extfloat.go @@ -0,0 +1,668 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package v1 + +// An extFloat represents an extended floating-point number, with more +// precision than a float64. It does not try to save bits: the +// number represented by the structure is mant*(2^exp), with a negative +// sign if neg is true. +type extFloat struct { + mant uint64 + exp int + neg bool +} + +// Powers of ten taken from double-conversion library. +// http://code.google.com/p/double-conversion/ +const ( + firstPowerOfTen = -348 + stepPowerOfTen = 8 +) + +var smallPowersOfTen = [...]extFloat{ + {1 << 63, -63, false}, // 1 + {0xa << 60, -60, false}, // 1e1 + {0x64 << 57, -57, false}, // 1e2 + {0x3e8 << 54, -54, false}, // 1e3 + {0x2710 << 50, -50, false}, // 1e4 + {0x186a0 << 47, -47, false}, // 1e5 + {0xf4240 << 44, -44, false}, // 1e6 + {0x989680 << 40, -40, false}, // 1e7 +} + +var powersOfTen = [...]extFloat{ + {0xfa8fd5a0081c0288, -1220, false}, // 10^-348 + {0xbaaee17fa23ebf76, -1193, false}, // 10^-340 + {0x8b16fb203055ac76, -1166, false}, // 10^-332 + {0xcf42894a5dce35ea, -1140, false}, // 10^-324 + {0x9a6bb0aa55653b2d, -1113, false}, // 10^-316 + {0xe61acf033d1a45df, -1087, false}, // 10^-308 + {0xab70fe17c79ac6ca, -1060, false}, // 10^-300 + {0xff77b1fcbebcdc4f, -1034, false}, // 10^-292 + {0xbe5691ef416bd60c, -1007, false}, // 10^-284 + {0x8dd01fad907ffc3c, -980, false}, // 10^-276 + {0xd3515c2831559a83, -954, false}, // 10^-268 + {0x9d71ac8fada6c9b5, -927, false}, // 10^-260 + {0xea9c227723ee8bcb, -901, false}, // 10^-252 + {0xaecc49914078536d, -874, false}, // 10^-244 + {0x823c12795db6ce57, -847, false}, // 10^-236 + {0xc21094364dfb5637, -821, false}, // 10^-228 + {0x9096ea6f3848984f, -794, false}, // 10^-220 + {0xd77485cb25823ac7, -768, false}, // 10^-212 + {0xa086cfcd97bf97f4, -741, false}, // 10^-204 + {0xef340a98172aace5, -715, false}, // 10^-196 + {0xb23867fb2a35b28e, -688, false}, // 10^-188 + {0x84c8d4dfd2c63f3b, -661, false}, // 10^-180 + {0xc5dd44271ad3cdba, -635, false}, // 10^-172 + {0x936b9fcebb25c996, -608, false}, // 10^-164 + {0xdbac6c247d62a584, -582, false}, // 10^-156 + {0xa3ab66580d5fdaf6, -555, false}, // 10^-148 + {0xf3e2f893dec3f126, -529, false}, // 10^-140 + {0xb5b5ada8aaff80b8, -502, false}, // 10^-132 + {0x87625f056c7c4a8b, -475, false}, // 10^-124 + {0xc9bcff6034c13053, -449, false}, // 10^-116 + {0x964e858c91ba2655, -422, false}, // 10^-108 + {0xdff9772470297ebd, -396, false}, // 10^-100 + {0xa6dfbd9fb8e5b88f, -369, false}, // 10^-92 + {0xf8a95fcf88747d94, -343, false}, // 10^-84 + {0xb94470938fa89bcf, -316, false}, // 10^-76 + {0x8a08f0f8bf0f156b, -289, false}, // 10^-68 + {0xcdb02555653131b6, -263, false}, // 10^-60 + {0x993fe2c6d07b7fac, -236, false}, // 10^-52 + {0xe45c10c42a2b3b06, -210, false}, // 10^-44 + {0xaa242499697392d3, -183, false}, // 10^-36 + {0xfd87b5f28300ca0e, -157, false}, // 10^-28 + {0xbce5086492111aeb, -130, false}, // 10^-20 + {0x8cbccc096f5088cc, -103, false}, // 10^-12 + {0xd1b71758e219652c, -77, false}, // 10^-4 + {0x9c40000000000000, -50, false}, // 10^4 + {0xe8d4a51000000000, -24, false}, // 10^12 + {0xad78ebc5ac620000, 3, false}, // 10^20 + {0x813f3978f8940984, 30, false}, // 10^28 + {0xc097ce7bc90715b3, 56, false}, // 10^36 + {0x8f7e32ce7bea5c70, 83, false}, // 10^44 + {0xd5d238a4abe98068, 109, false}, // 10^52 + {0x9f4f2726179a2245, 136, false}, // 10^60 + {0xed63a231d4c4fb27, 162, false}, // 10^68 + {0xb0de65388cc8ada8, 189, false}, // 10^76 + {0x83c7088e1aab65db, 216, false}, // 10^84 + {0xc45d1df942711d9a, 242, false}, // 10^92 + {0x924d692ca61be758, 269, false}, // 10^100 + {0xda01ee641a708dea, 295, false}, // 10^108 + {0xa26da3999aef774a, 322, false}, // 10^116 + {0xf209787bb47d6b85, 348, false}, // 10^124 + {0xb454e4a179dd1877, 375, false}, // 10^132 + {0x865b86925b9bc5c2, 402, false}, // 10^140 + {0xc83553c5c8965d3d, 428, false}, // 10^148 + {0x952ab45cfa97a0b3, 455, false}, // 10^156 + {0xde469fbd99a05fe3, 481, false}, // 10^164 + {0xa59bc234db398c25, 508, false}, // 10^172 + {0xf6c69a72a3989f5c, 534, false}, // 10^180 + {0xb7dcbf5354e9bece, 561, false}, // 10^188 + {0x88fcf317f22241e2, 588, false}, // 10^196 + {0xcc20ce9bd35c78a5, 614, false}, // 10^204 + {0x98165af37b2153df, 641, false}, // 10^212 + {0xe2a0b5dc971f303a, 667, false}, // 10^220 + {0xa8d9d1535ce3b396, 694, false}, // 10^228 + {0xfb9b7cd9a4a7443c, 720, false}, // 10^236 + {0xbb764c4ca7a44410, 747, false}, // 10^244 + {0x8bab8eefb6409c1a, 774, false}, // 10^252 + {0xd01fef10a657842c, 800, false}, // 10^260 + {0x9b10a4e5e9913129, 827, false}, // 10^268 + {0xe7109bfba19c0c9d, 853, false}, // 10^276 + {0xac2820d9623bf429, 880, false}, // 10^284 + {0x80444b5e7aa7cf85, 907, false}, // 10^292 + {0xbf21e44003acdd2d, 933, false}, // 10^300 + {0x8e679c2f5e44ff8f, 960, false}, // 10^308 + {0xd433179d9c8cb841, 986, false}, // 10^316 + {0x9e19db92b4e31ba9, 1013, false}, // 10^324 + {0xeb96bf6ebadf77d9, 1039, false}, // 10^332 + {0xaf87023b9bf0ee6b, 1066, false}, // 10^340 +} + +// floatBits returns the bits of the float64 that best approximates +// the extFloat passed as receiver. Overflow is set to true if +// the resulting float64 is ±Inf. +func (f *extFloat) floatBits(flt *floatInfo) (bits uint64, overflow bool) { + f.Normalize() + + exp := f.exp + 63 + + // Exponent too small. + if exp < flt.bias+1 { + n := flt.bias + 1 - exp + f.mant >>= uint(n) + exp += n + } + + // Extract 1+flt.mantbits bits from the 64-bit mantissa. + mant := f.mant >> (63 - flt.mantbits) + if f.mant&(1<<(62-flt.mantbits)) != 0 { + // Round up. + mant += 1 + } + + // Rounding might have added a bit; shift down. + if mant == 2<>= 1 + exp++ + } + + // Infinities. + if exp-flt.bias >= 1<>uint(-f.exp))<>= uint(-f.exp) + f.exp = 0 + return *f, *f + } + expBiased := exp - flt.bias + + upper = extFloat{mant: 2*f.mant + 1, exp: f.exp - 1, neg: f.neg} + if mant != 1<>(64-32) == 0 { + mant <<= 32 + exp -= 32 + } + if mant>>(64-16) == 0 { + mant <<= 16 + exp -= 16 + } + if mant>>(64-8) == 0 { + mant <<= 8 + exp -= 8 + } + if mant>>(64-4) == 0 { + mant <<= 4 + exp -= 4 + } + if mant>>(64-2) == 0 { + mant <<= 2 + exp -= 2 + } + if mant>>(64-1) == 0 { + mant <<= 1 + exp -= 1 + } + shift = uint(f.exp - exp) + f.mant, f.exp = mant, exp + return +} + +// Multiply sets f to the product f*g: the result is correctly rounded, +// but not normalized. +func (f *extFloat) Multiply(g extFloat) { + fhi, flo := f.mant>>32, uint64(uint32(f.mant)) + ghi, glo := g.mant>>32, uint64(uint32(g.mant)) + + // Cross products. + cross1 := fhi * glo + cross2 := flo * ghi + + // f.mant*g.mant is fhi*ghi << 64 + (cross1+cross2) << 32 + flo*glo + f.mant = fhi*ghi + (cross1 >> 32) + (cross2 >> 32) + rem := uint64(uint32(cross1)) + uint64(uint32(cross2)) + ((flo * glo) >> 32) + // Round up. + rem += (1 << 31) + + f.mant += (rem >> 32) + f.exp = f.exp + g.exp + 64 +} + +var uint64pow10 = [...]uint64{ + 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, +} + +// AssignDecimal sets f to an approximate value mantissa*10^exp. It +// returns true if the value represented by f is guaranteed to be the +// best approximation of d after being rounded to a float64 or +// float32 depending on flt. +func (f *extFloat) AssignDecimal(mantissa uint64, exp10 int, neg bool, trunc bool, flt *floatInfo) (ok bool) { + const uint64digits = 19 + const errorscale = 8 + errors := 0 // An upper bound for error, computed in errorscale*ulp. + if trunc { + // the decimal number was truncated. + errors += errorscale / 2 + } + + f.mant = mantissa + f.exp = 0 + f.neg = neg + + // Multiply by powers of ten. + i := (exp10 - firstPowerOfTen) / stepPowerOfTen + if exp10 < firstPowerOfTen || i >= len(powersOfTen) { + return false + } + adjExp := (exp10 - firstPowerOfTen) % stepPowerOfTen + + // We multiply by exp%step + if adjExp < uint64digits && mantissa < uint64pow10[uint64digits-adjExp] { + // We can multiply the mantissa exactly. + f.mant *= uint64pow10[adjExp] + f.Normalize() + } else { + f.Normalize() + f.Multiply(smallPowersOfTen[adjExp]) + errors += errorscale / 2 + } + + // We multiply by 10 to the exp - exp%step. + f.Multiply(powersOfTen[i]) + if errors > 0 { + errors += 1 + } + errors += errorscale / 2 + + // Normalize + shift := f.Normalize() + errors <<= shift + + // Now f is a good approximation of the decimal. + // Check whether the error is too large: that is, if the mantissa + // is perturbated by the error, the resulting float64 will change. + // The 64 bits mantissa is 1 + 52 bits for float64 + 11 extra bits. + // + // In many cases the approximation will be good enough. + denormalExp := flt.bias - 63 + var extrabits uint + if f.exp <= denormalExp { + // f.mant * 2^f.exp is smaller than 2^(flt.bias+1). + extrabits = uint(63 - flt.mantbits + 1 + uint(denormalExp-f.exp)) + } else { + extrabits = uint(63 - flt.mantbits) + } + + halfway := uint64(1) << (extrabits - 1) + mant_extra := f.mant & (1< expMax: + i-- + default: + break Loop + } + } + // Apply the desired decimal shift on f. It will have exponent + // in the desired range. This is multiplication by 10^-exp10. + f.Multiply(powersOfTen[i]) + + return -(firstPowerOfTen + i*stepPowerOfTen), i +} + +// frexp10Many applies a common shift by a power of ten to a, b, c. +func frexp10Many(a, b, c *extFloat) (exp10 int) { + exp10, i := c.frexp10() + a.Multiply(powersOfTen[i]) + b.Multiply(powersOfTen[i]) + return +} + +// FixedDecimal stores in d the first n significant digits +// of the decimal representation of f. It returns false +// if it cannot be sure of the answer. +func (f *extFloat) FixedDecimal(d *decimalSlice, n int) bool { + if f.mant == 0 { + d.nd = 0 + d.dp = 0 + d.neg = f.neg + return true + } + if n == 0 { + panic("strconv: internal error: extFloat.FixedDecimal called with n == 0") + } + // Multiply by an appropriate power of ten to have a reasonable + // number to process. + f.Normalize() + exp10, _ := f.frexp10() + + shift := uint(-f.exp) + integer := uint32(f.mant >> shift) + fraction := f.mant - (uint64(integer) << shift) + ε := uint64(1) // ε is the uncertainty we have on the mantissa of f. + + // Write exactly n digits to d. + needed := n // how many digits are left to write. + integerDigits := 0 // the number of decimal digits of integer. + pow10 := uint64(1) // the power of ten by which f was scaled. + for i, pow := 0, uint64(1); i < 20; i++ { + if pow > uint64(integer) { + integerDigits = i + break + } + pow *= 10 + } + rest := integer + if integerDigits > needed { + // the integral part is already large, trim the last digits. + pow10 = uint64pow10[integerDigits-needed] + integer /= uint32(pow10) + rest -= integer * uint32(pow10) + } else { + rest = 0 + } + + // Write the digits of integer: the digits of rest are omitted. + var buf [32]byte + pos := len(buf) + for v := integer; v > 0; { + v1 := v / 10 + v -= 10 * v1 + pos-- + buf[pos] = byte(v + '0') + v = v1 + } + for i := pos; i < len(buf); i++ { + d.d[i-pos] = buf[i] + } + nd := len(buf) - pos + d.nd = nd + d.dp = integerDigits + exp10 + needed -= nd + + if needed > 0 { + if rest != 0 || pow10 != 1 { + panic("strconv: internal error, rest != 0 but needed > 0") + } + // Emit digits for the fractional part. Each time, 10*fraction + // fits in a uint64 without overflow. + for needed > 0 { + fraction *= 10 + ε *= 10 // the uncertainty scales as we multiply by ten. + if 2*ε > 1<> shift + d.d[nd] = byte(digit + '0') + fraction -= digit << shift + nd++ + needed-- + } + d.nd = nd + } + + // We have written a truncation of f (a numerator / 10^d.dp). The remaining part + // can be interpreted as a small number (< 1) to be added to the last digit of the + // numerator. + // + // If rest > 0, the amount is: + // (rest< 0 guarantees that pow10 << shift does not overflow a uint64. + // + // If rest = 0, pow10 == 1 and the amount is + // fraction / (1 << shift) + // fraction being known with a ±ε uncertainty. + // + // We pass this information to the rounding routine for adjustment. + + ok := adjustLastDigitFixed(d, uint64(rest)<= 0; i-- { + if d.d[i] != '0' { + d.nd = i + 1 + break + } + } + return true +} + +// adjustLastDigitFixed assumes d contains the representation of the integral part +// of some number, whose fractional part is num / (den << shift). The numerator +// num is only known up to an uncertainty of size ε, assumed to be less than +// (den << shift)/2. +// +// It will increase the last digit by one to account for correct rounding, typically +// when the fractional part is greater than 1/2, and will return false if ε is such +// that no correct answer can be given. +func adjustLastDigitFixed(d *decimalSlice, num, den uint64, shift uint, ε uint64) bool { + if num > den< den< den< (den< den<= 0; i-- { + if d.d[i] == '9' { + d.nd-- + } else { + break + } + } + if i < 0 { + d.d[0] = '1' + d.nd = 1 + d.dp++ + } else { + d.d[i]++ + } + return true + } + return false +} + +// ShortestDecimal stores in d the shortest decimal representation of f +// which belongs to the open interval (lower, upper), where f is supposed +// to lie. It returns false whenever the result is unsure. The implementation +// uses the Grisu3 algorithm. +func (f *extFloat) ShortestDecimal(d *decimalSlice, lower, upper *extFloat) bool { + if f.mant == 0 { + d.nd = 0 + d.dp = 0 + d.neg = f.neg + return true + } + if f.exp == 0 && *lower == *f && *lower == *upper { + // an exact integer. + var buf [24]byte + n := len(buf) - 1 + for v := f.mant; v > 0; { + v1 := v / 10 + v -= 10 * v1 + buf[n] = byte(v + '0') + n-- + v = v1 + } + nd := len(buf) - n - 1 + for i := 0; i < nd; i++ { + d.d[i] = buf[n+1+i] + } + d.nd, d.dp = nd, nd + for d.nd > 0 && d.d[d.nd-1] == '0' { + d.nd-- + } + if d.nd == 0 { + d.dp = 0 + } + d.neg = f.neg + return true + } + upper.Normalize() + // Uniformize exponents. + if f.exp > upper.exp { + f.mant <<= uint(f.exp - upper.exp) + f.exp = upper.exp + } + if lower.exp > upper.exp { + lower.mant <<= uint(lower.exp - upper.exp) + lower.exp = upper.exp + } + + exp10 := frexp10Many(lower, f, upper) + // Take a safety margin due to rounding in frexp10Many, but we lose precision. + upper.mant++ + lower.mant-- + + // The shortest representation of f is either rounded up or down, but + // in any case, it is a truncation of upper. + shift := uint(-upper.exp) + integer := uint32(upper.mant >> shift) + fraction := upper.mant - (uint64(integer) << shift) + + // How far we can go down from upper until the result is wrong. + allowance := upper.mant - lower.mant + // How far we should go to get a very precise result. + targetDiff := upper.mant - f.mant + + // Count integral digits: there are at most 10. + var integerDigits int + for i, pow := 0, uint64(1); i < 20; i++ { + if pow > uint64(integer) { + integerDigits = i + break + } + pow *= 10 + } + for i := 0; i < integerDigits; i++ { + pow := uint64pow10[integerDigits-i-1] + digit := integer / uint32(pow) + d.d[i] = byte(digit + '0') + integer -= digit * uint32(pow) + // evaluate whether we should stop. + if currentDiff := uint64(integer)<> shift) + d.d[d.nd] = byte(digit + '0') + d.nd++ + fraction -= uint64(digit) << shift + if fraction < allowance*multiplier { + // We are in the admissible range. Note that if allowance is about to + // overflow, that is, allowance > 2^64/10, the condition is automatically + // true due to the limited range of fraction. + return adjustLastDigit(d, + fraction, targetDiff*multiplier, allowance*multiplier, + 1< maxDiff-ulpBinary { + // we went too far + return false + } + if d.nd == 1 && d.d[0] == '0' { + // the number has actually reached zero. + d.nd = 0 + d.dp = 0 + } + return true +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/fold.go b/vendor/github.com/pquerna/ffjson/fflib/v1/fold.go new file mode 100644 index 00000000..4d33e6f7 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/fold.go @@ -0,0 +1,121 @@ +/** + * Copyright 2014 Paul Querna + * + * 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. + * + */ + +/* Portions of this file are on Go stdlib's encoding/json/fold.go */ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package v1 + +import ( + "unicode/utf8" +) + +const ( + caseMask = ^byte(0x20) // Mask to ignore case in ASCII. + kelvin = '\u212a' + smallLongEss = '\u017f' +) + +// equalFoldRight is a specialization of bytes.EqualFold when s is +// known to be all ASCII (including punctuation), but contains an 's', +// 'S', 'k', or 'K', requiring a Unicode fold on the bytes in t. +// See comments on foldFunc. +func EqualFoldRight(s, t []byte) bool { + for _, sb := range s { + if len(t) == 0 { + return false + } + tb := t[0] + if tb < utf8.RuneSelf { + if sb != tb { + sbUpper := sb & caseMask + if 'A' <= sbUpper && sbUpper <= 'Z' { + if sbUpper != tb&caseMask { + return false + } + } else { + return false + } + } + t = t[1:] + continue + } + // sb is ASCII and t is not. t must be either kelvin + // sign or long s; sb must be s, S, k, or K. + tr, size := utf8.DecodeRune(t) + switch sb { + case 's', 'S': + if tr != smallLongEss { + return false + } + case 'k', 'K': + if tr != kelvin { + return false + } + default: + return false + } + t = t[size:] + + } + if len(t) > 0 { + return false + } + return true +} + +// asciiEqualFold is a specialization of bytes.EqualFold for use when +// s is all ASCII (but may contain non-letters) and contains no +// special-folding letters. +// See comments on foldFunc. +func AsciiEqualFold(s, t []byte) bool { + if len(s) != len(t) { + return false + } + for i, sb := range s { + tb := t[i] + if sb == tb { + continue + } + if ('a' <= sb && sb <= 'z') || ('A' <= sb && sb <= 'Z') { + if sb&caseMask != tb&caseMask { + return false + } + } else { + return false + } + } + return true +} + +// simpleLetterEqualFold is a specialization of bytes.EqualFold for +// use when s is all ASCII letters (no underscores, etc) and also +// doesn't contain 'k', 'K', 's', or 'S'. +// See comments on foldFunc. +func SimpleLetterEqualFold(s, t []byte) bool { + if len(s) != len(t) { + return false + } + for i, b := range s { + if b&caseMask != t[i]&caseMask { + return false + } + } + return true +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/ftoa.go b/vendor/github.com/pquerna/ffjson/fflib/v1/ftoa.go new file mode 100644 index 00000000..360d6dbc --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/ftoa.go @@ -0,0 +1,542 @@ +package v1 + +/** + * Copyright 2015 Paul Querna, Klaus Post + * + * 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. + * + */ + +/* Most of this file are on Go stdlib's strconv/ftoa.go */ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +import "math" + +// TODO: move elsewhere? +type floatInfo struct { + mantbits uint + expbits uint + bias int +} + +var optimize = true // can change for testing + +var float32info = floatInfo{23, 8, -127} +var float64info = floatInfo{52, 11, -1023} + +// AppendFloat appends the string form of the floating-point number f, +// as generated by FormatFloat +func AppendFloat(dst EncodingBuffer, val float64, fmt byte, prec, bitSize int) { + var bits uint64 + var flt *floatInfo + switch bitSize { + case 32: + bits = uint64(math.Float32bits(float32(val))) + flt = &float32info + case 64: + bits = math.Float64bits(val) + flt = &float64info + default: + panic("strconv: illegal AppendFloat/FormatFloat bitSize") + } + + neg := bits>>(flt.expbits+flt.mantbits) != 0 + exp := int(bits>>flt.mantbits) & (1< digs.nd && digs.nd >= digs.dp { + eprec = digs.nd + } + // %e is used if the exponent from the conversion + // is less than -4 or greater than or equal to the precision. + // if precision was the shortest possible, use precision 6 for this decision. + if shortest { + eprec = 6 + } + exp := digs.dp - 1 + if exp < -4 || exp >= eprec { + if prec > digs.nd { + prec = digs.nd + } + fmtE(dst, neg, digs, prec-1, fmt+'e'-'g') + return + } + if prec > digs.dp { + prec = digs.nd + } + fmtF(dst, neg, digs, max(prec-digs.dp, 0)) + return + } + + // unknown format + dst.Write([]byte{'%', fmt}) + return +} + +// Round d (= mant * 2^exp) to the shortest number of digits +// that will let the original floating point value be precisely +// reconstructed. Size is original floating point size (64 or 32). +func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) { + // If mantissa is zero, the number is zero; stop now. + if mant == 0 { + d.nd = 0 + return + } + + // Compute upper and lower such that any decimal number + // between upper and lower (possibly inclusive) + // will round to the original floating point number. + + // We may see at once that the number is already shortest. + // + // Suppose d is not denormal, so that 2^exp <= d < 10^dp. + // The closest shorter number is at least 10^(dp-nd) away. + // The lower/upper bounds computed below are at distance + // at most 2^(exp-mantbits). + // + // So the number is already shortest if 10^(dp-nd) > 2^(exp-mantbits), + // or equivalently log2(10)*(dp-nd) > exp-mantbits. + // It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32). + minexp := flt.bias + 1 // minimum possible exponent + if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) { + // The number is already shortest. + return + } + + // d = mant << (exp - mantbits) + // Next highest floating point number is mant+1 << exp-mantbits. + // Our upper bound is halfway between, mant*2+1 << exp-mantbits-1. + upper := new(decimal) + upper.Assign(mant*2 + 1) + upper.Shift(exp - int(flt.mantbits) - 1) + + // d = mant << (exp - mantbits) + // Next lowest floating point number is mant-1 << exp-mantbits, + // unless mant-1 drops the significant bit and exp is not the minimum exp, + // in which case the next lowest is mant*2-1 << exp-mantbits-1. + // Either way, call it mantlo << explo-mantbits. + // Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1. + var mantlo uint64 + var explo int + if mant > 1< 0 { + dst.WriteByte('.') + i := 1 + m := min(d.nd, prec+1) + if i < m { + dst.Write(d.d[i:m]) + i = m + } + for i <= prec { + dst.WriteByte('0') + i++ + } + } + + // e± + dst.WriteByte(fmt) + exp := d.dp - 1 + if d.nd == 0 { // special case: 0 has exponent 0 + exp = 0 + } + if exp < 0 { + ch = '-' + exp = -exp + } else { + ch = '+' + } + dst.WriteByte(ch) + + // dd or ddd + switch { + case exp < 10: + dst.WriteByte('0') + dst.WriteByte(byte(exp) + '0') + case exp < 100: + dst.WriteByte(byte(exp/10) + '0') + dst.WriteByte(byte(exp%10) + '0') + default: + dst.WriteByte(byte(exp/100) + '0') + dst.WriteByte(byte(exp/10)%10 + '0') + dst.WriteByte(byte(exp%10) + '0') + } + + return +} + +// %f: -ddddddd.ddddd +func fmtF(dst EncodingBuffer, neg bool, d decimalSlice, prec int) { + // sign + if neg { + dst.WriteByte('-') + } + + // integer, padded with zeros as needed. + if d.dp > 0 { + m := min(d.nd, d.dp) + dst.Write(d.d[:m]) + for ; m < d.dp; m++ { + dst.WriteByte('0') + } + } else { + dst.WriteByte('0') + } + + // fraction + if prec > 0 { + dst.WriteByte('.') + for i := 0; i < prec; i++ { + ch := byte('0') + if j := d.dp + i; 0 <= j && j < d.nd { + ch = d.d[j] + } + dst.WriteByte(ch) + } + } + + return +} + +// %b: -ddddddddp±ddd +func fmtB(dst EncodingBuffer, neg bool, mant uint64, exp int, flt *floatInfo) { + // sign + if neg { + dst.WriteByte('-') + } + + // mantissa + formatBits(dst, mant, 10, false) + + // p + dst.WriteByte('p') + + // ±exponent + exp -= int(flt.mantbits) + if exp >= 0 { + dst.WriteByte('+') + } + formatBits(dst, uint64(exp), 10, exp < 0) + + return +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +// formatBits computes the string representation of u in the given base. +// If neg is set, u is treated as negative int64 value. +func formatBits(dst EncodingBuffer, u uint64, base int, neg bool) { + if base < 2 || base > len(digits) { + panic("strconv: illegal AppendInt/FormatInt base") + } + // 2 <= base && base <= len(digits) + + var a [64 + 1]byte // +1 for sign of 64bit value in base 2 + i := len(a) + + if neg { + u = -u + } + + // convert bits + if base == 10 { + // common case: use constants for / because + // the compiler can optimize it into a multiply+shift + + if ^uintptr(0)>>32 == 0 { + for u > uint64(^uintptr(0)) { + q := u / 1e9 + us := uintptr(u - q*1e9) // us % 1e9 fits into a uintptr + for j := 9; j > 0; j-- { + i-- + qs := us / 10 + a[i] = byte(us - qs*10 + '0') + us = qs + } + u = q + } + } + + // u guaranteed to fit into a uintptr + us := uintptr(u) + for us >= 10 { + i-- + q := us / 10 + a[i] = byte(us - q*10 + '0') + us = q + } + // u < 10 + i-- + a[i] = byte(us + '0') + + } else if s := shifts[base]; s > 0 { + // base is power of 2: use shifts and masks instead of / and % + b := uint64(base) + m := uintptr(b) - 1 // == 1<= b { + i-- + a[i] = digits[uintptr(u)&m] + u >>= s + } + // u < base + i-- + a[i] = digits[uintptr(u)] + + } else { + // general case + b := uint64(base) + for u >= b { + i-- + q := u / b + a[i] = digits[uintptr(u-q*b)] + u = q + } + // u < base + i-- + a[i] = digits[uintptr(u)] + } + + // add sign, if any + if neg { + i-- + a[i] = '-' + } + + dst.Write(a[i:]) +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/internal/BUILD b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/BUILD new file mode 100644 index 00000000..c30f6f07 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/BUILD @@ -0,0 +1,28 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "atof.go", + "atoi.go", + "extfloat.go", + "ftoa.go", + ], + importmap = "k8s.io/kubernetes/vendor/github.com/pquerna/ffjson/fflib/v1/internal", + importpath = "github.com/pquerna/ffjson/fflib/v1/internal", + visibility = ["//visibility:public"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/internal/atof.go b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/atof.go new file mode 100644 index 00000000..46c1289e --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/atof.go @@ -0,0 +1,936 @@ +/** + * Copyright 2014 Paul Querna + * + * 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. + * + */ + +/* Portions of this file are on Go stdlib's strconv/atof.go */ + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +// decimal to binary floating point conversion. +// Algorithm: +// 1) Store input in multiprecision decimal. +// 2) Multiply/divide decimal by powers of two until in range [0.5, 1) +// 3) Multiply by 2^precision and round to get mantissa. + +import "math" + +var optimize = true // can change for testing + +func equalIgnoreCase(s1 []byte, s2 []byte) bool { + if len(s1) != len(s2) { + return false + } + for i := 0; i < len(s1); i++ { + c1 := s1[i] + if 'A' <= c1 && c1 <= 'Z' { + c1 += 'a' - 'A' + } + c2 := s2[i] + if 'A' <= c2 && c2 <= 'Z' { + c2 += 'a' - 'A' + } + if c1 != c2 { + return false + } + } + return true +} + +func special(s []byte) (f float64, ok bool) { + if len(s) == 0 { + return + } + switch s[0] { + default: + return + case '+': + if equalIgnoreCase(s, []byte("+inf")) || equalIgnoreCase(s, []byte("+infinity")) { + return math.Inf(1), true + } + case '-': + if equalIgnoreCase(s, []byte("-inf")) || equalIgnoreCase(s, []byte("-infinity")) { + return math.Inf(-1), true + } + case 'n', 'N': + if equalIgnoreCase(s, []byte("nan")) { + return math.NaN(), true + } + case 'i', 'I': + if equalIgnoreCase(s, []byte("inf")) || equalIgnoreCase(s, []byte("infinity")) { + return math.Inf(1), true + } + } + return +} + +func (b *decimal) set(s []byte) (ok bool) { + i := 0 + b.neg = false + b.trunc = false + + // optional sign + if i >= len(s) { + return + } + switch { + case s[i] == '+': + i++ + case s[i] == '-': + b.neg = true + i++ + } + + // digits + sawdot := false + sawdigits := false + for ; i < len(s); i++ { + switch { + case s[i] == '.': + if sawdot { + return + } + sawdot = true + b.dp = b.nd + continue + + case '0' <= s[i] && s[i] <= '9': + sawdigits = true + if s[i] == '0' && b.nd == 0 { // ignore leading zeros + b.dp-- + continue + } + if b.nd < len(b.d) { + b.d[b.nd] = s[i] + b.nd++ + } else if s[i] != '0' { + b.trunc = true + } + continue + } + break + } + if !sawdigits { + return + } + if !sawdot { + b.dp = b.nd + } + + // optional exponent moves decimal point. + // if we read a very large, very long number, + // just be sure to move the decimal point by + // a lot (say, 100000). it doesn't matter if it's + // not the exact number. + if i < len(s) && (s[i] == 'e' || s[i] == 'E') { + i++ + if i >= len(s) { + return + } + esign := 1 + if s[i] == '+' { + i++ + } else if s[i] == '-' { + i++ + esign = -1 + } + if i >= len(s) || s[i] < '0' || s[i] > '9' { + return + } + e := 0 + for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ { + if e < 10000 { + e = e*10 + int(s[i]) - '0' + } + } + b.dp += e * esign + } + + if i != len(s) { + return + } + + ok = true + return +} + +// readFloat reads a decimal mantissa and exponent from a float +// string representation. It sets ok to false if the number could +// not fit return types or is invalid. +func readFloat(s []byte) (mantissa uint64, exp int, neg, trunc, ok bool) { + const uint64digits = 19 + i := 0 + + // optional sign + if i >= len(s) { + return + } + switch { + case s[i] == '+': + i++ + case s[i] == '-': + neg = true + i++ + } + + // digits + sawdot := false + sawdigits := false + nd := 0 + ndMant := 0 + dp := 0 + for ; i < len(s); i++ { + switch c := s[i]; true { + case c == '.': + if sawdot { + return + } + sawdot = true + dp = nd + continue + + case '0' <= c && c <= '9': + sawdigits = true + if c == '0' && nd == 0 { // ignore leading zeros + dp-- + continue + } + nd++ + if ndMant < uint64digits { + mantissa *= 10 + mantissa += uint64(c - '0') + ndMant++ + } else if s[i] != '0' { + trunc = true + } + continue + } + break + } + if !sawdigits { + return + } + if !sawdot { + dp = nd + } + + // optional exponent moves decimal point. + // if we read a very large, very long number, + // just be sure to move the decimal point by + // a lot (say, 100000). it doesn't matter if it's + // not the exact number. + if i < len(s) && (s[i] == 'e' || s[i] == 'E') { + i++ + if i >= len(s) { + return + } + esign := 1 + if s[i] == '+' { + i++ + } else if s[i] == '-' { + i++ + esign = -1 + } + if i >= len(s) || s[i] < '0' || s[i] > '9' { + return + } + e := 0 + for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ { + if e < 10000 { + e = e*10 + int(s[i]) - '0' + } + } + dp += e * esign + } + + if i != len(s) { + return + } + + exp = dp - ndMant + ok = true + return + +} + +// decimal power of ten to binary power of two. +var powtab = []int{1, 3, 6, 9, 13, 16, 19, 23, 26} + +func (d *decimal) floatBits(flt *floatInfo) (b uint64, overflow bool) { + var exp int + var mant uint64 + + // Zero is always a special case. + if d.nd == 0 { + mant = 0 + exp = flt.bias + goto out + } + + // Obvious overflow/underflow. + // These bounds are for 64-bit floats. + // Will have to change if we want to support 80-bit floats in the future. + if d.dp > 310 { + goto overflow + } + if d.dp < -330 { + // zero + mant = 0 + exp = flt.bias + goto out + } + + // Scale by powers of two until in range [0.5, 1.0) + exp = 0 + for d.dp > 0 { + var n int + if d.dp >= len(powtab) { + n = 27 + } else { + n = powtab[d.dp] + } + d.Shift(-n) + exp += n + } + for d.dp < 0 || d.dp == 0 && d.d[0] < '5' { + var n int + if -d.dp >= len(powtab) { + n = 27 + } else { + n = powtab[-d.dp] + } + d.Shift(n) + exp -= n + } + + // Our range is [0.5,1) but floating point range is [1,2). + exp-- + + // Minimum representable exponent is flt.bias+1. + // If the exponent is smaller, move it up and + // adjust d accordingly. + if exp < flt.bias+1 { + n := flt.bias + 1 - exp + d.Shift(-n) + exp += n + } + + if exp-flt.bias >= 1<>= 1 + exp++ + if exp-flt.bias >= 1<>float64info.mantbits != 0 { + return + } + f = float64(mantissa) + if neg { + f = -f + } + switch { + case exp == 0: + // an integer. + return f, true + // Exact integers are <= 10^15. + // Exact powers of ten are <= 10^22. + case exp > 0 && exp <= 15+22: // int * 10^k + // If exponent is big but number of digits is not, + // can move a few zeros into the integer part. + if exp > 22 { + f *= float64pow10[exp-22] + exp = 22 + } + if f > 1e15 || f < -1e15 { + // the exponent was really too large. + return + } + return f * float64pow10[exp], true + case exp < 0 && exp >= -22: // int / 10^k + return f / float64pow10[-exp], true + } + return +} + +// If possible to compute mantissa*10^exp to 32-bit float f exactly, +// entirely in floating-point math, do so, avoiding the machinery above. +func atof32exact(mantissa uint64, exp int, neg bool) (f float32, ok bool) { + if mantissa>>float32info.mantbits != 0 { + return + } + f = float32(mantissa) + if neg { + f = -f + } + switch { + case exp == 0: + return f, true + // Exact integers are <= 10^7. + // Exact powers of ten are <= 10^10. + case exp > 0 && exp <= 7+10: // int * 10^k + // If exponent is big but number of digits is not, + // can move a few zeros into the integer part. + if exp > 10 { + f *= float32pow10[exp-10] + exp = 10 + } + if f > 1e7 || f < -1e7 { + // the exponent was really too large. + return + } + return f * float32pow10[exp], true + case exp < 0 && exp >= -10: // int / 10^k + return f / float32pow10[-exp], true + } + return +} + +const fnParseFloat = "ParseFloat" + +func atof32(s []byte) (f float32, err error) { + if val, ok := special(s); ok { + return float32(val), nil + } + + if optimize { + // Parse mantissa and exponent. + mantissa, exp, neg, trunc, ok := readFloat(s) + if ok { + // Try pure floating-point arithmetic conversion. + if !trunc { + if f, ok := atof32exact(mantissa, exp, neg); ok { + return f, nil + } + } + // Try another fast path. + ext := new(extFloat) + if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float32info); ok { + b, ovf := ext.floatBits(&float32info) + f = math.Float32frombits(uint32(b)) + if ovf { + err = rangeError(fnParseFloat, string(s)) + } + return f, err + } + } + } + var d decimal + if !d.set(s) { + return 0, syntaxError(fnParseFloat, string(s)) + } + b, ovf := d.floatBits(&float32info) + f = math.Float32frombits(uint32(b)) + if ovf { + err = rangeError(fnParseFloat, string(s)) + } + return f, err +} + +func atof64(s []byte) (f float64, err error) { + if val, ok := special(s); ok { + return val, nil + } + + if optimize { + // Parse mantissa and exponent. + mantissa, exp, neg, trunc, ok := readFloat(s) + if ok { + // Try pure floating-point arithmetic conversion. + if !trunc { + if f, ok := atof64exact(mantissa, exp, neg); ok { + return f, nil + } + } + // Try another fast path. + ext := new(extFloat) + if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float64info); ok { + b, ovf := ext.floatBits(&float64info) + f = math.Float64frombits(b) + if ovf { + err = rangeError(fnParseFloat, string(s)) + } + return f, err + } + } + } + var d decimal + if !d.set(s) { + return 0, syntaxError(fnParseFloat, string(s)) + } + b, ovf := d.floatBits(&float64info) + f = math.Float64frombits(b) + if ovf { + err = rangeError(fnParseFloat, string(s)) + } + return f, err +} + +// ParseFloat converts the string s to a floating-point number +// with the precision specified by bitSize: 32 for float32, or 64 for float64. +// When bitSize=32, the result still has type float64, but it will be +// convertible to float32 without changing its value. +// +// If s is well-formed and near a valid floating point number, +// ParseFloat returns the nearest floating point number rounded +// using IEEE754 unbiased rounding. +// +// The errors that ParseFloat returns have concrete type *NumError +// and include err.Num = s. +// +// If s is not syntactically well-formed, ParseFloat returns err.Err = ErrSyntax. +// +// If s is syntactically well-formed but is more than 1/2 ULP +// away from the largest floating point number of the given size, +// ParseFloat returns f = ±Inf, err.Err = ErrRange. +func ParseFloat(s []byte, bitSize int) (f float64, err error) { + if bitSize == 32 { + f1, err1 := atof32(s) + return float64(f1), err1 + } + f1, err1 := atof64(s) + return f1, err1 +} + +// oroginal: strconv/decimal.go, but not exported, and needed for PareFloat. + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Multiprecision decimal numbers. +// For floating-point formatting only; not general purpose. +// Only operations are assign and (binary) left/right shift. +// Can do binary floating point in multiprecision decimal precisely +// because 2 divides 10; cannot do decimal floating point +// in multiprecision binary precisely. + +type decimal struct { + d [800]byte // digits + nd int // number of digits used + dp int // decimal point + neg bool + trunc bool // discarded nonzero digits beyond d[:nd] +} + +func (a *decimal) String() string { + n := 10 + a.nd + if a.dp > 0 { + n += a.dp + } + if a.dp < 0 { + n += -a.dp + } + + buf := make([]byte, n) + w := 0 + switch { + case a.nd == 0: + return "0" + + case a.dp <= 0: + // zeros fill space between decimal point and digits + buf[w] = '0' + w++ + buf[w] = '.' + w++ + w += digitZero(buf[w : w+-a.dp]) + w += copy(buf[w:], a.d[0:a.nd]) + + case a.dp < a.nd: + // decimal point in middle of digits + w += copy(buf[w:], a.d[0:a.dp]) + buf[w] = '.' + w++ + w += copy(buf[w:], a.d[a.dp:a.nd]) + + default: + // zeros fill space between digits and decimal point + w += copy(buf[w:], a.d[0:a.nd]) + w += digitZero(buf[w : w+a.dp-a.nd]) + } + return string(buf[0:w]) +} + +func digitZero(dst []byte) int { + for i := range dst { + dst[i] = '0' + } + return len(dst) +} + +// trim trailing zeros from number. +// (They are meaningless; the decimal point is tracked +// independent of the number of digits.) +func trim(a *decimal) { + for a.nd > 0 && a.d[a.nd-1] == '0' { + a.nd-- + } + if a.nd == 0 { + a.dp = 0 + } +} + +// Assign v to a. +func (a *decimal) Assign(v uint64) { + var buf [24]byte + + // Write reversed decimal in buf. + n := 0 + for v > 0 { + v1 := v / 10 + v -= 10 * v1 + buf[n] = byte(v + '0') + n++ + v = v1 + } + + // Reverse again to produce forward decimal in a.d. + a.nd = 0 + for n--; n >= 0; n-- { + a.d[a.nd] = buf[n] + a.nd++ + } + a.dp = a.nd + trim(a) +} + +// Maximum shift that we can do in one pass without overflow. +// Signed int has 31 bits, and we have to be able to accommodate 9<>k == 0; r++ { + if r >= a.nd { + if n == 0 { + // a == 0; shouldn't get here, but handle anyway. + a.nd = 0 + return + } + for n>>k == 0 { + n = n * 10 + r++ + } + break + } + c := int(a.d[r]) + n = n*10 + c - '0' + } + a.dp -= r - 1 + + // Pick up a digit, put down a digit. + for ; r < a.nd; r++ { + c := int(a.d[r]) + dig := n >> k + n -= dig << k + a.d[w] = byte(dig + '0') + w++ + n = n*10 + c - '0' + } + + // Put down extra digits. + for n > 0 { + dig := n >> k + n -= dig << k + if w < len(a.d) { + a.d[w] = byte(dig + '0') + w++ + } else if dig > 0 { + a.trunc = true + } + n = n * 10 + } + + a.nd = w + trim(a) +} + +// Cheat sheet for left shift: table indexed by shift count giving +// number of new digits that will be introduced by that shift. +// +// For example, leftcheats[4] = {2, "625"}. That means that +// if we are shifting by 4 (multiplying by 16), it will add 2 digits +// when the string prefix is "625" through "999", and one fewer digit +// if the string prefix is "000" through "624". +// +// Credit for this trick goes to Ken. + +type leftCheat struct { + delta int // number of new digits + cutoff string // minus one digit if original < a. +} + +var leftcheats = []leftCheat{ + // Leading digits of 1/2^i = 5^i. + // 5^23 is not an exact 64-bit floating point number, + // so have to use bc for the math. + /* + seq 27 | sed 's/^/5^/' | bc | + awk 'BEGIN{ print "\tleftCheat{ 0, \"\" }," } + { + log2 = log(2)/log(10) + printf("\tleftCheat{ %d, \"%s\" },\t// * %d\n", + int(log2*NR+1), $0, 2**NR) + }' + */ + {0, ""}, + {1, "5"}, // * 2 + {1, "25"}, // * 4 + {1, "125"}, // * 8 + {2, "625"}, // * 16 + {2, "3125"}, // * 32 + {2, "15625"}, // * 64 + {3, "78125"}, // * 128 + {3, "390625"}, // * 256 + {3, "1953125"}, // * 512 + {4, "9765625"}, // * 1024 + {4, "48828125"}, // * 2048 + {4, "244140625"}, // * 4096 + {4, "1220703125"}, // * 8192 + {5, "6103515625"}, // * 16384 + {5, "30517578125"}, // * 32768 + {5, "152587890625"}, // * 65536 + {6, "762939453125"}, // * 131072 + {6, "3814697265625"}, // * 262144 + {6, "19073486328125"}, // * 524288 + {7, "95367431640625"}, // * 1048576 + {7, "476837158203125"}, // * 2097152 + {7, "2384185791015625"}, // * 4194304 + {7, "11920928955078125"}, // * 8388608 + {8, "59604644775390625"}, // * 16777216 + {8, "298023223876953125"}, // * 33554432 + {8, "1490116119384765625"}, // * 67108864 + {9, "7450580596923828125"}, // * 134217728 +} + +// Is the leading prefix of b lexicographically less than s? +func prefixIsLessThan(b []byte, s string) bool { + for i := 0; i < len(s); i++ { + if i >= len(b) { + return true + } + if b[i] != s[i] { + return b[i] < s[i] + } + } + return false +} + +// Binary shift left (/ 2) by k bits. k <= maxShift to avoid overflow. +func leftShift(a *decimal, k uint) { + delta := leftcheats[k].delta + if prefixIsLessThan(a.d[0:a.nd], leftcheats[k].cutoff) { + delta-- + } + + r := a.nd // read index + w := a.nd + delta // write index + n := 0 + + // Pick up a digit, put down a digit. + for r--; r >= 0; r-- { + n += (int(a.d[r]) - '0') << k + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + // Put down extra digits. + for n > 0 { + quo := n / 10 + rem := n - 10*quo + w-- + if w < len(a.d) { + a.d[w] = byte(rem + '0') + } else if rem != 0 { + a.trunc = true + } + n = quo + } + + a.nd += delta + if a.nd >= len(a.d) { + a.nd = len(a.d) + } + a.dp += delta + trim(a) +} + +// Binary shift left (k > 0) or right (k < 0). +func (a *decimal) Shift(k int) { + switch { + case a.nd == 0: + // nothing to do: a == 0 + case k > 0: + for k > maxShift { + leftShift(a, maxShift) + k -= maxShift + } + leftShift(a, uint(k)) + case k < 0: + for k < -maxShift { + rightShift(a, maxShift) + k += maxShift + } + rightShift(a, uint(-k)) + } +} + +// If we chop a at nd digits, should we round up? +func shouldRoundUp(a *decimal, nd int) bool { + if nd < 0 || nd >= a.nd { + return false + } + if a.d[nd] == '5' && nd+1 == a.nd { // exactly halfway - round to even + // if we truncated, a little higher than what's recorded - always round up + if a.trunc { + return true + } + return nd > 0 && (a.d[nd-1]-'0')%2 != 0 + } + // not halfway - digit tells all + return a.d[nd] >= '5' +} + +// Round a to nd digits (or fewer). +// If nd is zero, it means we're rounding +// just to the left of the digits, as in +// 0.09 -> 0.1. +func (a *decimal) Round(nd int) { + if nd < 0 || nd >= a.nd { + return + } + if shouldRoundUp(a, nd) { + a.RoundUp(nd) + } else { + a.RoundDown(nd) + } +} + +// Round a down to nd digits (or fewer). +func (a *decimal) RoundDown(nd int) { + if nd < 0 || nd >= a.nd { + return + } + a.nd = nd + trim(a) +} + +// Round a up to nd digits (or fewer). +func (a *decimal) RoundUp(nd int) { + if nd < 0 || nd >= a.nd { + return + } + + // round up + for i := nd - 1; i >= 0; i-- { + c := a.d[i] + if c < '9' { // can stop after this digit + a.d[i]++ + a.nd = i + 1 + return + } + } + + // Number is all 9s. + // Change to single 1 with adjusted decimal point. + a.d[0] = '1' + a.nd = 1 + a.dp++ +} + +// Extract integer part, rounded appropriately. +// No guarantees about overflow. +func (a *decimal) RoundedInteger() uint64 { + if a.dp > 20 { + return 0xFFFFFFFFFFFFFFFF + } + var i int + n := uint64(0) + for i = 0; i < a.dp && i < a.nd; i++ { + n = n*10 + uint64(a.d[i]-'0') + } + for ; i < a.dp; i++ { + n *= 10 + } + if shouldRoundUp(a, a.dp) { + n++ + } + return n +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/internal/atoi.go b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/atoi.go new file mode 100644 index 00000000..06eb2ec2 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/atoi.go @@ -0,0 +1,213 @@ +/** + * Copyright 2014 Paul Querna + * + * 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. + * + */ + +/* Portions of this file are on Go stdlib's strconv/atoi.go */ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +import ( + "errors" + "strconv" +) + +// ErrRange indicates that a value is out of range for the target type. +var ErrRange = errors.New("value out of range") + +// ErrSyntax indicates that a value does not have the right syntax for the target type. +var ErrSyntax = errors.New("invalid syntax") + +// A NumError records a failed conversion. +type NumError struct { + Func string // the failing function (ParseBool, ParseInt, ParseUint, ParseFloat) + Num string // the input + Err error // the reason the conversion failed (ErrRange, ErrSyntax) +} + +func (e *NumError) Error() string { + return "strconv." + e.Func + ": " + "parsing " + strconv.Quote(e.Num) + ": " + e.Err.Error() +} + +func syntaxError(fn, str string) *NumError { + return &NumError{fn, str, ErrSyntax} +} + +func rangeError(fn, str string) *NumError { + return &NumError{fn, str, ErrRange} +} + +const intSize = 32 << uint(^uint(0)>>63) + +// IntSize is the size in bits of an int or uint value. +const IntSize = intSize + +// Return the first number n such that n*base >= 1<<64. +func cutoff64(base int) uint64 { + if base < 2 { + return 0 + } + return (1<<64-1)/uint64(base) + 1 +} + +// ParseUint is like ParseInt but for unsigned numbers, and oeprating on []byte +func ParseUint(s []byte, base int, bitSize int) (n uint64, err error) { + var cutoff, maxVal uint64 + + if bitSize == 0 { + bitSize = int(IntSize) + } + + s0 := s + switch { + case len(s) < 1: + err = ErrSyntax + goto Error + + case 2 <= base && base <= 36: + // valid base; nothing to do + + case base == 0: + // Look for octal, hex prefix. + switch { + case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'): + base = 16 + s = s[2:] + if len(s) < 1 { + err = ErrSyntax + goto Error + } + case s[0] == '0': + base = 8 + default: + base = 10 + } + + default: + err = errors.New("invalid base " + strconv.Itoa(base)) + goto Error + } + + n = 0 + cutoff = cutoff64(base) + maxVal = 1<= base { + n = 0 + err = ErrSyntax + goto Error + } + + if n >= cutoff { + // n*base overflows + n = 1<<64 - 1 + err = ErrRange + goto Error + } + n *= uint64(base) + + n1 := n + uint64(v) + if n1 < n || n1 > maxVal { + // n+v overflows + n = 1<<64 - 1 + err = ErrRange + goto Error + } + n = n1 + } + + return n, nil + +Error: + return n, &NumError{"ParseUint", string(s0), err} +} + +// ParseInt interprets a string s in the given base (2 to 36) and +// returns the corresponding value i. If base == 0, the base is +// implied by the string's prefix: base 16 for "0x", base 8 for +// "0", and base 10 otherwise. +// +// The bitSize argument specifies the integer type +// that the result must fit into. Bit sizes 0, 8, 16, 32, and 64 +// correspond to int, int8, int16, int32, and int64. +// +// The errors that ParseInt returns have concrete type *NumError +// and include err.Num = s. If s is empty or contains invalid +// digits, err.Err = ErrSyntax and the returned value is 0; +// if the value corresponding to s cannot be represented by a +// signed integer of the given size, err.Err = ErrRange and the +// returned value is the maximum magnitude integer of the +// appropriate bitSize and sign. +func ParseInt(s []byte, base int, bitSize int) (i int64, err error) { + const fnParseInt = "ParseInt" + + if bitSize == 0 { + bitSize = int(IntSize) + } + + // Empty string bad. + if len(s) == 0 { + return 0, syntaxError(fnParseInt, string(s)) + } + + // Pick off leading sign. + s0 := s + neg := false + if s[0] == '+' { + s = s[1:] + } else if s[0] == '-' { + neg = true + s = s[1:] + } + + // Convert unsigned and check range. + var un uint64 + un, err = ParseUint(s, base, bitSize) + if err != nil && err.(*NumError).Err != ErrRange { + err.(*NumError).Func = fnParseInt + err.(*NumError).Num = string(s0) + return 0, err + } + cutoff := uint64(1 << uint(bitSize-1)) + if !neg && un >= cutoff { + return int64(cutoff - 1), rangeError(fnParseInt, string(s0)) + } + if neg && un > cutoff { + return -int64(cutoff), rangeError(fnParseInt, string(s0)) + } + n := int64(un) + if neg { + n = -n + } + return n, nil +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/internal/extfloat.go b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/extfloat.go new file mode 100644 index 00000000..ab791085 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/extfloat.go @@ -0,0 +1,668 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package internal + +// An extFloat represents an extended floating-point number, with more +// precision than a float64. It does not try to save bits: the +// number represented by the structure is mant*(2^exp), with a negative +// sign if neg is true. +type extFloat struct { + mant uint64 + exp int + neg bool +} + +// Powers of ten taken from double-conversion library. +// http://code.google.com/p/double-conversion/ +const ( + firstPowerOfTen = -348 + stepPowerOfTen = 8 +) + +var smallPowersOfTen = [...]extFloat{ + {1 << 63, -63, false}, // 1 + {0xa << 60, -60, false}, // 1e1 + {0x64 << 57, -57, false}, // 1e2 + {0x3e8 << 54, -54, false}, // 1e3 + {0x2710 << 50, -50, false}, // 1e4 + {0x186a0 << 47, -47, false}, // 1e5 + {0xf4240 << 44, -44, false}, // 1e6 + {0x989680 << 40, -40, false}, // 1e7 +} + +var powersOfTen = [...]extFloat{ + {0xfa8fd5a0081c0288, -1220, false}, // 10^-348 + {0xbaaee17fa23ebf76, -1193, false}, // 10^-340 + {0x8b16fb203055ac76, -1166, false}, // 10^-332 + {0xcf42894a5dce35ea, -1140, false}, // 10^-324 + {0x9a6bb0aa55653b2d, -1113, false}, // 10^-316 + {0xe61acf033d1a45df, -1087, false}, // 10^-308 + {0xab70fe17c79ac6ca, -1060, false}, // 10^-300 + {0xff77b1fcbebcdc4f, -1034, false}, // 10^-292 + {0xbe5691ef416bd60c, -1007, false}, // 10^-284 + {0x8dd01fad907ffc3c, -980, false}, // 10^-276 + {0xd3515c2831559a83, -954, false}, // 10^-268 + {0x9d71ac8fada6c9b5, -927, false}, // 10^-260 + {0xea9c227723ee8bcb, -901, false}, // 10^-252 + {0xaecc49914078536d, -874, false}, // 10^-244 + {0x823c12795db6ce57, -847, false}, // 10^-236 + {0xc21094364dfb5637, -821, false}, // 10^-228 + {0x9096ea6f3848984f, -794, false}, // 10^-220 + {0xd77485cb25823ac7, -768, false}, // 10^-212 + {0xa086cfcd97bf97f4, -741, false}, // 10^-204 + {0xef340a98172aace5, -715, false}, // 10^-196 + {0xb23867fb2a35b28e, -688, false}, // 10^-188 + {0x84c8d4dfd2c63f3b, -661, false}, // 10^-180 + {0xc5dd44271ad3cdba, -635, false}, // 10^-172 + {0x936b9fcebb25c996, -608, false}, // 10^-164 + {0xdbac6c247d62a584, -582, false}, // 10^-156 + {0xa3ab66580d5fdaf6, -555, false}, // 10^-148 + {0xf3e2f893dec3f126, -529, false}, // 10^-140 + {0xb5b5ada8aaff80b8, -502, false}, // 10^-132 + {0x87625f056c7c4a8b, -475, false}, // 10^-124 + {0xc9bcff6034c13053, -449, false}, // 10^-116 + {0x964e858c91ba2655, -422, false}, // 10^-108 + {0xdff9772470297ebd, -396, false}, // 10^-100 + {0xa6dfbd9fb8e5b88f, -369, false}, // 10^-92 + {0xf8a95fcf88747d94, -343, false}, // 10^-84 + {0xb94470938fa89bcf, -316, false}, // 10^-76 + {0x8a08f0f8bf0f156b, -289, false}, // 10^-68 + {0xcdb02555653131b6, -263, false}, // 10^-60 + {0x993fe2c6d07b7fac, -236, false}, // 10^-52 + {0xe45c10c42a2b3b06, -210, false}, // 10^-44 + {0xaa242499697392d3, -183, false}, // 10^-36 + {0xfd87b5f28300ca0e, -157, false}, // 10^-28 + {0xbce5086492111aeb, -130, false}, // 10^-20 + {0x8cbccc096f5088cc, -103, false}, // 10^-12 + {0xd1b71758e219652c, -77, false}, // 10^-4 + {0x9c40000000000000, -50, false}, // 10^4 + {0xe8d4a51000000000, -24, false}, // 10^12 + {0xad78ebc5ac620000, 3, false}, // 10^20 + {0x813f3978f8940984, 30, false}, // 10^28 + {0xc097ce7bc90715b3, 56, false}, // 10^36 + {0x8f7e32ce7bea5c70, 83, false}, // 10^44 + {0xd5d238a4abe98068, 109, false}, // 10^52 + {0x9f4f2726179a2245, 136, false}, // 10^60 + {0xed63a231d4c4fb27, 162, false}, // 10^68 + {0xb0de65388cc8ada8, 189, false}, // 10^76 + {0x83c7088e1aab65db, 216, false}, // 10^84 + {0xc45d1df942711d9a, 242, false}, // 10^92 + {0x924d692ca61be758, 269, false}, // 10^100 + {0xda01ee641a708dea, 295, false}, // 10^108 + {0xa26da3999aef774a, 322, false}, // 10^116 + {0xf209787bb47d6b85, 348, false}, // 10^124 + {0xb454e4a179dd1877, 375, false}, // 10^132 + {0x865b86925b9bc5c2, 402, false}, // 10^140 + {0xc83553c5c8965d3d, 428, false}, // 10^148 + {0x952ab45cfa97a0b3, 455, false}, // 10^156 + {0xde469fbd99a05fe3, 481, false}, // 10^164 + {0xa59bc234db398c25, 508, false}, // 10^172 + {0xf6c69a72a3989f5c, 534, false}, // 10^180 + {0xb7dcbf5354e9bece, 561, false}, // 10^188 + {0x88fcf317f22241e2, 588, false}, // 10^196 + {0xcc20ce9bd35c78a5, 614, false}, // 10^204 + {0x98165af37b2153df, 641, false}, // 10^212 + {0xe2a0b5dc971f303a, 667, false}, // 10^220 + {0xa8d9d1535ce3b396, 694, false}, // 10^228 + {0xfb9b7cd9a4a7443c, 720, false}, // 10^236 + {0xbb764c4ca7a44410, 747, false}, // 10^244 + {0x8bab8eefb6409c1a, 774, false}, // 10^252 + {0xd01fef10a657842c, 800, false}, // 10^260 + {0x9b10a4e5e9913129, 827, false}, // 10^268 + {0xe7109bfba19c0c9d, 853, false}, // 10^276 + {0xac2820d9623bf429, 880, false}, // 10^284 + {0x80444b5e7aa7cf85, 907, false}, // 10^292 + {0xbf21e44003acdd2d, 933, false}, // 10^300 + {0x8e679c2f5e44ff8f, 960, false}, // 10^308 + {0xd433179d9c8cb841, 986, false}, // 10^316 + {0x9e19db92b4e31ba9, 1013, false}, // 10^324 + {0xeb96bf6ebadf77d9, 1039, false}, // 10^332 + {0xaf87023b9bf0ee6b, 1066, false}, // 10^340 +} + +// floatBits returns the bits of the float64 that best approximates +// the extFloat passed as receiver. Overflow is set to true if +// the resulting float64 is ±Inf. +func (f *extFloat) floatBits(flt *floatInfo) (bits uint64, overflow bool) { + f.Normalize() + + exp := f.exp + 63 + + // Exponent too small. + if exp < flt.bias+1 { + n := flt.bias + 1 - exp + f.mant >>= uint(n) + exp += n + } + + // Extract 1+flt.mantbits bits from the 64-bit mantissa. + mant := f.mant >> (63 - flt.mantbits) + if f.mant&(1<<(62-flt.mantbits)) != 0 { + // Round up. + mant += 1 + } + + // Rounding might have added a bit; shift down. + if mant == 2<>= 1 + exp++ + } + + // Infinities. + if exp-flt.bias >= 1<>uint(-f.exp))<>= uint(-f.exp) + f.exp = 0 + return *f, *f + } + expBiased := exp - flt.bias + + upper = extFloat{mant: 2*f.mant + 1, exp: f.exp - 1, neg: f.neg} + if mant != 1<>(64-32) == 0 { + mant <<= 32 + exp -= 32 + } + if mant>>(64-16) == 0 { + mant <<= 16 + exp -= 16 + } + if mant>>(64-8) == 0 { + mant <<= 8 + exp -= 8 + } + if mant>>(64-4) == 0 { + mant <<= 4 + exp -= 4 + } + if mant>>(64-2) == 0 { + mant <<= 2 + exp -= 2 + } + if mant>>(64-1) == 0 { + mant <<= 1 + exp -= 1 + } + shift = uint(f.exp - exp) + f.mant, f.exp = mant, exp + return +} + +// Multiply sets f to the product f*g: the result is correctly rounded, +// but not normalized. +func (f *extFloat) Multiply(g extFloat) { + fhi, flo := f.mant>>32, uint64(uint32(f.mant)) + ghi, glo := g.mant>>32, uint64(uint32(g.mant)) + + // Cross products. + cross1 := fhi * glo + cross2 := flo * ghi + + // f.mant*g.mant is fhi*ghi << 64 + (cross1+cross2) << 32 + flo*glo + f.mant = fhi*ghi + (cross1 >> 32) + (cross2 >> 32) + rem := uint64(uint32(cross1)) + uint64(uint32(cross2)) + ((flo * glo) >> 32) + // Round up. + rem += (1 << 31) + + f.mant += (rem >> 32) + f.exp = f.exp + g.exp + 64 +} + +var uint64pow10 = [...]uint64{ + 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, +} + +// AssignDecimal sets f to an approximate value mantissa*10^exp. It +// returns true if the value represented by f is guaranteed to be the +// best approximation of d after being rounded to a float64 or +// float32 depending on flt. +func (f *extFloat) AssignDecimal(mantissa uint64, exp10 int, neg bool, trunc bool, flt *floatInfo) (ok bool) { + const uint64digits = 19 + const errorscale = 8 + errors := 0 // An upper bound for error, computed in errorscale*ulp. + if trunc { + // the decimal number was truncated. + errors += errorscale / 2 + } + + f.mant = mantissa + f.exp = 0 + f.neg = neg + + // Multiply by powers of ten. + i := (exp10 - firstPowerOfTen) / stepPowerOfTen + if exp10 < firstPowerOfTen || i >= len(powersOfTen) { + return false + } + adjExp := (exp10 - firstPowerOfTen) % stepPowerOfTen + + // We multiply by exp%step + if adjExp < uint64digits && mantissa < uint64pow10[uint64digits-adjExp] { + // We can multiply the mantissa exactly. + f.mant *= uint64pow10[adjExp] + f.Normalize() + } else { + f.Normalize() + f.Multiply(smallPowersOfTen[adjExp]) + errors += errorscale / 2 + } + + // We multiply by 10 to the exp - exp%step. + f.Multiply(powersOfTen[i]) + if errors > 0 { + errors += 1 + } + errors += errorscale / 2 + + // Normalize + shift := f.Normalize() + errors <<= shift + + // Now f is a good approximation of the decimal. + // Check whether the error is too large: that is, if the mantissa + // is perturbated by the error, the resulting float64 will change. + // The 64 bits mantissa is 1 + 52 bits for float64 + 11 extra bits. + // + // In many cases the approximation will be good enough. + denormalExp := flt.bias - 63 + var extrabits uint + if f.exp <= denormalExp { + // f.mant * 2^f.exp is smaller than 2^(flt.bias+1). + extrabits = uint(63 - flt.mantbits + 1 + uint(denormalExp-f.exp)) + } else { + extrabits = uint(63 - flt.mantbits) + } + + halfway := uint64(1) << (extrabits - 1) + mant_extra := f.mant & (1< expMax: + i-- + default: + break Loop + } + } + // Apply the desired decimal shift on f. It will have exponent + // in the desired range. This is multiplication by 10^-exp10. + f.Multiply(powersOfTen[i]) + + return -(firstPowerOfTen + i*stepPowerOfTen), i +} + +// frexp10Many applies a common shift by a power of ten to a, b, c. +func frexp10Many(a, b, c *extFloat) (exp10 int) { + exp10, i := c.frexp10() + a.Multiply(powersOfTen[i]) + b.Multiply(powersOfTen[i]) + return +} + +// FixedDecimal stores in d the first n significant digits +// of the decimal representation of f. It returns false +// if it cannot be sure of the answer. +func (f *extFloat) FixedDecimal(d *decimalSlice, n int) bool { + if f.mant == 0 { + d.nd = 0 + d.dp = 0 + d.neg = f.neg + return true + } + if n == 0 { + panic("strconv: internal error: extFloat.FixedDecimal called with n == 0") + } + // Multiply by an appropriate power of ten to have a reasonable + // number to process. + f.Normalize() + exp10, _ := f.frexp10() + + shift := uint(-f.exp) + integer := uint32(f.mant >> shift) + fraction := f.mant - (uint64(integer) << shift) + ε := uint64(1) // ε is the uncertainty we have on the mantissa of f. + + // Write exactly n digits to d. + needed := n // how many digits are left to write. + integerDigits := 0 // the number of decimal digits of integer. + pow10 := uint64(1) // the power of ten by which f was scaled. + for i, pow := 0, uint64(1); i < 20; i++ { + if pow > uint64(integer) { + integerDigits = i + break + } + pow *= 10 + } + rest := integer + if integerDigits > needed { + // the integral part is already large, trim the last digits. + pow10 = uint64pow10[integerDigits-needed] + integer /= uint32(pow10) + rest -= integer * uint32(pow10) + } else { + rest = 0 + } + + // Write the digits of integer: the digits of rest are omitted. + var buf [32]byte + pos := len(buf) + for v := integer; v > 0; { + v1 := v / 10 + v -= 10 * v1 + pos-- + buf[pos] = byte(v + '0') + v = v1 + } + for i := pos; i < len(buf); i++ { + d.d[i-pos] = buf[i] + } + nd := len(buf) - pos + d.nd = nd + d.dp = integerDigits + exp10 + needed -= nd + + if needed > 0 { + if rest != 0 || pow10 != 1 { + panic("strconv: internal error, rest != 0 but needed > 0") + } + // Emit digits for the fractional part. Each time, 10*fraction + // fits in a uint64 without overflow. + for needed > 0 { + fraction *= 10 + ε *= 10 // the uncertainty scales as we multiply by ten. + if 2*ε > 1<> shift + d.d[nd] = byte(digit + '0') + fraction -= digit << shift + nd++ + needed-- + } + d.nd = nd + } + + // We have written a truncation of f (a numerator / 10^d.dp). The remaining part + // can be interpreted as a small number (< 1) to be added to the last digit of the + // numerator. + // + // If rest > 0, the amount is: + // (rest< 0 guarantees that pow10 << shift does not overflow a uint64. + // + // If rest = 0, pow10 == 1 and the amount is + // fraction / (1 << shift) + // fraction being known with a ±ε uncertainty. + // + // We pass this information to the rounding routine for adjustment. + + ok := adjustLastDigitFixed(d, uint64(rest)<= 0; i-- { + if d.d[i] != '0' { + d.nd = i + 1 + break + } + } + return true +} + +// adjustLastDigitFixed assumes d contains the representation of the integral part +// of some number, whose fractional part is num / (den << shift). The numerator +// num is only known up to an uncertainty of size ε, assumed to be less than +// (den << shift)/2. +// +// It will increase the last digit by one to account for correct rounding, typically +// when the fractional part is greater than 1/2, and will return false if ε is such +// that no correct answer can be given. +func adjustLastDigitFixed(d *decimalSlice, num, den uint64, shift uint, ε uint64) bool { + if num > den< den< den< (den< den<= 0; i-- { + if d.d[i] == '9' { + d.nd-- + } else { + break + } + } + if i < 0 { + d.d[0] = '1' + d.nd = 1 + d.dp++ + } else { + d.d[i]++ + } + return true + } + return false +} + +// ShortestDecimal stores in d the shortest decimal representation of f +// which belongs to the open interval (lower, upper), where f is supposed +// to lie. It returns false whenever the result is unsure. The implementation +// uses the Grisu3 algorithm. +func (f *extFloat) ShortestDecimal(d *decimalSlice, lower, upper *extFloat) bool { + if f.mant == 0 { + d.nd = 0 + d.dp = 0 + d.neg = f.neg + return true + } + if f.exp == 0 && *lower == *f && *lower == *upper { + // an exact integer. + var buf [24]byte + n := len(buf) - 1 + for v := f.mant; v > 0; { + v1 := v / 10 + v -= 10 * v1 + buf[n] = byte(v + '0') + n-- + v = v1 + } + nd := len(buf) - n - 1 + for i := 0; i < nd; i++ { + d.d[i] = buf[n+1+i] + } + d.nd, d.dp = nd, nd + for d.nd > 0 && d.d[d.nd-1] == '0' { + d.nd-- + } + if d.nd == 0 { + d.dp = 0 + } + d.neg = f.neg + return true + } + upper.Normalize() + // Uniformize exponents. + if f.exp > upper.exp { + f.mant <<= uint(f.exp - upper.exp) + f.exp = upper.exp + } + if lower.exp > upper.exp { + lower.mant <<= uint(lower.exp - upper.exp) + lower.exp = upper.exp + } + + exp10 := frexp10Many(lower, f, upper) + // Take a safety margin due to rounding in frexp10Many, but we lose precision. + upper.mant++ + lower.mant-- + + // The shortest representation of f is either rounded up or down, but + // in any case, it is a truncation of upper. + shift := uint(-upper.exp) + integer := uint32(upper.mant >> shift) + fraction := upper.mant - (uint64(integer) << shift) + + // How far we can go down from upper until the result is wrong. + allowance := upper.mant - lower.mant + // How far we should go to get a very precise result. + targetDiff := upper.mant - f.mant + + // Count integral digits: there are at most 10. + var integerDigits int + for i, pow := 0, uint64(1); i < 20; i++ { + if pow > uint64(integer) { + integerDigits = i + break + } + pow *= 10 + } + for i := 0; i < integerDigits; i++ { + pow := uint64pow10[integerDigits-i-1] + digit := integer / uint32(pow) + d.d[i] = byte(digit + '0') + integer -= digit * uint32(pow) + // evaluate whether we should stop. + if currentDiff := uint64(integer)<> shift) + d.d[d.nd] = byte(digit + '0') + d.nd++ + fraction -= uint64(digit) << shift + if fraction < allowance*multiplier { + // We are in the admissible range. Note that if allowance is about to + // overflow, that is, allowance > 2^64/10, the condition is automatically + // true due to the limited range of fraction. + return adjustLastDigit(d, + fraction, targetDiff*multiplier, allowance*multiplier, + 1< maxDiff-ulpBinary { + // we went too far + return false + } + if d.nd == 1 && d.d[0] == '0' { + // the number has actually reached zero. + d.nd = 0 + d.dp = 0 + } + return true +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/internal/ftoa.go b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/ftoa.go new file mode 100644 index 00000000..253f83b4 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/internal/ftoa.go @@ -0,0 +1,475 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Binary to decimal floating point conversion. +// Algorithm: +// 1) store mantissa in multiprecision decimal +// 2) shift decimal by exponent +// 3) read digits out & format + +package internal + +import "math" + +// TODO: move elsewhere? +type floatInfo struct { + mantbits uint + expbits uint + bias int +} + +var float32info = floatInfo{23, 8, -127} +var float64info = floatInfo{52, 11, -1023} + +// FormatFloat converts the floating-point number f to a string, +// according to the format fmt and precision prec. It rounds the +// result assuming that the original was obtained from a floating-point +// value of bitSize bits (32 for float32, 64 for float64). +// +// The format fmt is one of +// 'b' (-ddddp±ddd, a binary exponent), +// 'e' (-d.dddde±dd, a decimal exponent), +// 'E' (-d.ddddE±dd, a decimal exponent), +// 'f' (-ddd.dddd, no exponent), +// 'g' ('e' for large exponents, 'f' otherwise), or +// 'G' ('E' for large exponents, 'f' otherwise). +// +// The precision prec controls the number of digits +// (excluding the exponent) printed by the 'e', 'E', 'f', 'g', and 'G' formats. +// For 'e', 'E', and 'f' it is the number of digits after the decimal point. +// For 'g' and 'G' it is the total number of digits. +// The special precision -1 uses the smallest number of digits +// necessary such that ParseFloat will return f exactly. +func formatFloat(f float64, fmt byte, prec, bitSize int) string { + return string(genericFtoa(make([]byte, 0, max(prec+4, 24)), f, fmt, prec, bitSize)) +} + +// AppendFloat appends the string form of the floating-point number f, +// as generated by FormatFloat, to dst and returns the extended buffer. +func appendFloat(dst []byte, f float64, fmt byte, prec int, bitSize int) []byte { + return genericFtoa(dst, f, fmt, prec, bitSize) +} + +func genericFtoa(dst []byte, val float64, fmt byte, prec, bitSize int) []byte { + var bits uint64 + var flt *floatInfo + switch bitSize { + case 32: + bits = uint64(math.Float32bits(float32(val))) + flt = &float32info + case 64: + bits = math.Float64bits(val) + flt = &float64info + default: + panic("strconv: illegal AppendFloat/FormatFloat bitSize") + } + + neg := bits>>(flt.expbits+flt.mantbits) != 0 + exp := int(bits>>flt.mantbits) & (1< digs.nd && digs.nd >= digs.dp { + eprec = digs.nd + } + // %e is used if the exponent from the conversion + // is less than -4 or greater than or equal to the precision. + // if precision was the shortest possible, use precision 6 for this decision. + if shortest { + eprec = 6 + } + exp := digs.dp - 1 + if exp < -4 || exp >= eprec { + if prec > digs.nd { + prec = digs.nd + } + return fmtE(dst, neg, digs, prec-1, fmt+'e'-'g') + } + if prec > digs.dp { + prec = digs.nd + } + return fmtF(dst, neg, digs, max(prec-digs.dp, 0)) + } + + // unknown format + return append(dst, '%', fmt) +} + +// Round d (= mant * 2^exp) to the shortest number of digits +// that will let the original floating point value be precisely +// reconstructed. Size is original floating point size (64 or 32). +func roundShortest(d *decimal, mant uint64, exp int, flt *floatInfo) { + // If mantissa is zero, the number is zero; stop now. + if mant == 0 { + d.nd = 0 + return + } + + // Compute upper and lower such that any decimal number + // between upper and lower (possibly inclusive) + // will round to the original floating point number. + + // We may see at once that the number is already shortest. + // + // Suppose d is not denormal, so that 2^exp <= d < 10^dp. + // The closest shorter number is at least 10^(dp-nd) away. + // The lower/upper bounds computed below are at distance + // at most 2^(exp-mantbits). + // + // So the number is already shortest if 10^(dp-nd) > 2^(exp-mantbits), + // or equivalently log2(10)*(dp-nd) > exp-mantbits. + // It is true if 332/100*(dp-nd) >= exp-mantbits (log2(10) > 3.32). + minexp := flt.bias + 1 // minimum possible exponent + if exp > minexp && 332*(d.dp-d.nd) >= 100*(exp-int(flt.mantbits)) { + // The number is already shortest. + return + } + + // d = mant << (exp - mantbits) + // Next highest floating point number is mant+1 << exp-mantbits. + // Our upper bound is halfway between, mant*2+1 << exp-mantbits-1. + upper := new(decimal) + upper.Assign(mant*2 + 1) + upper.Shift(exp - int(flt.mantbits) - 1) + + // d = mant << (exp - mantbits) + // Next lowest floating point number is mant-1 << exp-mantbits, + // unless mant-1 drops the significant bit and exp is not the minimum exp, + // in which case the next lowest is mant*2-1 << exp-mantbits-1. + // Either way, call it mantlo << explo-mantbits. + // Our lower bound is halfway between, mantlo*2+1 << explo-mantbits-1. + var mantlo uint64 + var explo int + if mant > 1< 0 { + dst = append(dst, '.') + i := 1 + m := d.nd + prec + 1 - max(d.nd, prec+1) + for i < m { + dst = append(dst, d.d[i]) + i++ + } + for i <= prec { + dst = append(dst, '0') + i++ + } + } + + // e± + dst = append(dst, fmt) + exp := d.dp - 1 + if d.nd == 0 { // special case: 0 has exponent 0 + exp = 0 + } + if exp < 0 { + ch = '-' + exp = -exp + } else { + ch = '+' + } + dst = append(dst, ch) + + // dddd + var buf [3]byte + i := len(buf) + for exp >= 10 { + i-- + buf[i] = byte(exp%10 + '0') + exp /= 10 + } + // exp < 10 + i-- + buf[i] = byte(exp + '0') + + switch i { + case 0: + dst = append(dst, buf[0], buf[1], buf[2]) + case 1: + dst = append(dst, buf[1], buf[2]) + case 2: + // leading zeroes + dst = append(dst, '0', buf[2]) + } + return dst +} + +// %f: -ddddddd.ddddd +func fmtF(dst []byte, neg bool, d decimalSlice, prec int) []byte { + // sign + if neg { + dst = append(dst, '-') + } + + // integer, padded with zeros as needed. + if d.dp > 0 { + var i int + for i = 0; i < d.dp && i < d.nd; i++ { + dst = append(dst, d.d[i]) + } + for ; i < d.dp; i++ { + dst = append(dst, '0') + } + } else { + dst = append(dst, '0') + } + + // fraction + if prec > 0 { + dst = append(dst, '.') + for i := 0; i < prec; i++ { + ch := byte('0') + if j := d.dp + i; 0 <= j && j < d.nd { + ch = d.d[j] + } + dst = append(dst, ch) + } + } + + return dst +} + +// %b: -ddddddddp+ddd +func fmtB(dst []byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte { + var buf [50]byte + w := len(buf) + exp -= int(flt.mantbits) + esign := byte('+') + if exp < 0 { + esign = '-' + exp = -exp + } + n := 0 + for exp > 0 || n < 1 { + n++ + w-- + buf[w] = byte(exp%10 + '0') + exp /= 10 + } + w-- + buf[w] = esign + w-- + buf[w] = 'p' + n = 0 + for mant > 0 || n < 1 { + n++ + w-- + buf[w] = byte(mant%10 + '0') + mant /= 10 + } + if neg { + w-- + buf[w] = '-' + } + return append(dst, buf[w:]...) +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/iota.go b/vendor/github.com/pquerna/ffjson/fflib/v1/iota.go new file mode 100644 index 00000000..3e50f0c4 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/iota.go @@ -0,0 +1,161 @@ +/** + * Copyright 2014 Paul Querna + * + * 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. + * + */ + +/* Portions of this file are on Go stdlib's strconv/iota.go */ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package v1 + +import ( + "io" +) + +const ( + digits = "0123456789abcdefghijklmnopqrstuvwxyz" + digits01 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" + digits10 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" +) + +var shifts = [len(digits) + 1]uint{ + 1 << 1: 1, + 1 << 2: 2, + 1 << 3: 3, + 1 << 4: 4, + 1 << 5: 5, +} + +var smallNumbers = [][]byte{ + []byte("0"), + []byte("1"), + []byte("2"), + []byte("3"), + []byte("4"), + []byte("5"), + []byte("6"), + []byte("7"), + []byte("8"), + []byte("9"), + []byte("10"), +} + +type FormatBitsWriter interface { + io.Writer + io.ByteWriter +} + +type FormatBitsScratch struct{} + +// +// DEPRECIATED: `scratch` is no longer used, FormatBits2 is available. +// +// FormatBits computes the string representation of u in the given base. +// If neg is set, u is treated as negative int64 value. If append_ is +// set, the string is appended to dst and the resulting byte slice is +// returned as the first result value; otherwise the string is returned +// as the second result value. +// +func FormatBits(scratch *FormatBitsScratch, dst FormatBitsWriter, u uint64, base int, neg bool) { + FormatBits2(dst, u, base, neg) +} + +// FormatBits2 computes the string representation of u in the given base. +// If neg is set, u is treated as negative int64 value. If append_ is +// set, the string is appended to dst and the resulting byte slice is +// returned as the first result value; otherwise the string is returned +// as the second result value. +// +func FormatBits2(dst FormatBitsWriter, u uint64, base int, neg bool) { + if base < 2 || base > len(digits) { + panic("strconv: illegal AppendInt/FormatInt base") + } + // fast path for small common numbers + if u <= 10 { + if neg { + dst.WriteByte('-') + } + dst.Write(smallNumbers[u]) + return + } + + // 2 <= base && base <= len(digits) + + var a = makeSlice(65) + // var a [64 + 1]byte // +1 for sign of 64bit value in base 2 + i := len(a) + + if neg { + u = -u + } + + // convert bits + if base == 10 { + // common case: use constants for / and % because + // the compiler can optimize it into a multiply+shift, + // and unroll loop + for u >= 100 { + i -= 2 + q := u / 100 + j := uintptr(u - q*100) + a[i+1] = digits01[j] + a[i+0] = digits10[j] + u = q + } + if u >= 10 { + i-- + q := u / 10 + a[i] = digits[uintptr(u-q*10)] + u = q + } + + } else if s := shifts[base]; s > 0 { + // base is power of 2: use shifts and masks instead of / and % + b := uint64(base) + m := uintptr(b) - 1 // == 1<= b { + i-- + a[i] = digits[uintptr(u)&m] + u >>= s + } + + } else { + // general case + b := uint64(base) + for u >= b { + i-- + a[i] = digits[uintptr(u%b)] + u /= b + } + } + + // u < base + i-- + a[i] = digits[uintptr(u)] + + // add sign, if any + if neg { + i-- + a[i] = '-' + } + + dst.Write(a[i:]) + + Pool(a) + + return +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/jsonstring.go b/vendor/github.com/pquerna/ffjson/fflib/v1/jsonstring.go new file mode 100644 index 00000000..513b45d5 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/jsonstring.go @@ -0,0 +1,512 @@ +/** + * Copyright 2014 Paul Querna + * + * 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. + * + */ + +/* Portions of this file are on Go stdlib's encoding/json/encode.go */ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package v1 + +import ( + "io" + "unicode/utf8" + "strconv" + "unicode/utf16" + "unicode" +) + +const hex = "0123456789abcdef" + +type JsonStringWriter interface { + io.Writer + io.ByteWriter + stringWriter +} + +func WriteJsonString(buf JsonStringWriter, s string) { + WriteJson(buf, []byte(s)) +} + +/** + * Function ported from encoding/json: func (e *encodeState) string(s string) (int, error) + */ +func WriteJson(buf JsonStringWriter, s []byte) { + buf.WriteByte('"') + start := 0 + for i := 0; i < len(s); { + if b := s[i]; b < utf8.RuneSelf { + /* + if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { + i++ + continue + } + */ + if lt[b] == true { + i++ + continue + } + + if start < i { + buf.Write(s[start:i]) + } + switch b { + case '\\', '"': + buf.WriteByte('\\') + buf.WriteByte(b) + case '\n': + buf.WriteByte('\\') + buf.WriteByte('n') + case '\r': + buf.WriteByte('\\') + buf.WriteByte('r') + default: + // This encodes bytes < 0x20 except for \n and \r, + // as well as < and >. The latter are escaped because they + // can lead to security holes when user-controlled strings + // are rendered into JSON and served to some browsers. + buf.WriteString(`\u00`) + buf.WriteByte(hex[b>>4]) + buf.WriteByte(hex[b&0xF]) + } + i++ + start = i + continue + } + c, size := utf8.DecodeRune(s[i:]) + if c == utf8.RuneError && size == 1 { + if start < i { + buf.Write(s[start:i]) + } + buf.WriteString(`\ufffd`) + i += size + start = i + continue + } + // U+2028 is LINE SEPARATOR. + // U+2029 is PARAGRAPH SEPARATOR. + // They are both technically valid characters in JSON strings, + // but don't work in JSONP, which has to be evaluated as JavaScript, + // and can lead to security holes there. It is valid JSON to + // escape them, so we do so unconditionally. + // See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion. + if c == '\u2028' || c == '\u2029' { + if start < i { + buf.Write(s[start:i]) + } + buf.WriteString(`\u202`) + buf.WriteByte(hex[c&0xF]) + i += size + start = i + continue + } + i += size + } + if start < len(s) { + buf.Write(s[start:]) + } + buf.WriteByte('"') +} + +// UnquoteBytes will decode []byte containing json string to go string +// ported from encoding/json/decode.go +func UnquoteBytes(s []byte) (t []byte, ok bool) { + if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' { + return + } + s = s[1 : len(s)-1] + + // Check for unusual characters. If there are none, + // then no unquoting is needed, so return a slice of the + // original bytes. + r := 0 + for r < len(s) { + c := s[r] + if c == '\\' || c == '"' || c < ' ' { + break + } + if c < utf8.RuneSelf { + r++ + continue + } + rr, size := utf8.DecodeRune(s[r:]) + if rr == utf8.RuneError && size == 1 { + break + } + r += size + } + if r == len(s) { + return s, true + } + + b := make([]byte, len(s)+2*utf8.UTFMax) + w := copy(b, s[0:r]) + for r < len(s) { + // Out of room? Can only happen if s is full of + // malformed UTF-8 and we're replacing each + // byte with RuneError. + if w >= len(b)-2*utf8.UTFMax { + nb := make([]byte, (len(b)+utf8.UTFMax)*2) + copy(nb, b[0:w]) + b = nb + } + switch c := s[r]; { + case c == '\\': + r++ + if r >= len(s) { + return + } + switch s[r] { + default: + return + case '"', '\\', '/', '\'': + b[w] = s[r] + r++ + w++ + case 'b': + b[w] = '\b' + r++ + w++ + case 'f': + b[w] = '\f' + r++ + w++ + case 'n': + b[w] = '\n' + r++ + w++ + case 'r': + b[w] = '\r' + r++ + w++ + case 't': + b[w] = '\t' + r++ + w++ + case 'u': + r-- + rr := getu4(s[r:]) + if rr < 0 { + return + } + r += 6 + if utf16.IsSurrogate(rr) { + rr1 := getu4(s[r:]) + if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar { + // A valid pair; consume. + r += 6 + w += utf8.EncodeRune(b[w:], dec) + break + } + // Invalid surrogate; fall back to replacement rune. + rr = unicode.ReplacementChar + } + w += utf8.EncodeRune(b[w:], rr) + } + + // Quote, control characters are invalid. + case c == '"', c < ' ': + return + + // ASCII + case c < utf8.RuneSelf: + b[w] = c + r++ + w++ + + // Coerce to well-formed UTF-8. + default: + rr, size := utf8.DecodeRune(s[r:]) + r += size + w += utf8.EncodeRune(b[w:], rr) + } + } + return b[0:w], true +} + +// getu4 decodes \uXXXX from the beginning of s, returning the hex value, +// or it returns -1. +func getu4(s []byte) rune { + if len(s) < 6 || s[0] != '\\' || s[1] != 'u' { + return -1 + } + r, err := strconv.ParseUint(string(s[2:6]), 16, 64) + if err != nil { + return -1 + } + return rune(r) +} + +// TODO(pquerna): consider combining wibth the normal byte mask. +var lt [256]bool = [256]bool{ + false, /* 0 */ + false, /* 1 */ + false, /* 2 */ + false, /* 3 */ + false, /* 4 */ + false, /* 5 */ + false, /* 6 */ + false, /* 7 */ + false, /* 8 */ + false, /* 9 */ + false, /* 10 */ + false, /* 11 */ + false, /* 12 */ + false, /* 13 */ + false, /* 14 */ + false, /* 15 */ + false, /* 16 */ + false, /* 17 */ + false, /* 18 */ + false, /* 19 */ + false, /* 20 */ + false, /* 21 */ + false, /* 22 */ + false, /* 23 */ + false, /* 24 */ + false, /* 25 */ + false, /* 26 */ + false, /* 27 */ + false, /* 28 */ + false, /* 29 */ + false, /* 30 */ + false, /* 31 */ + true, /* 32 */ + true, /* 33 */ + false, /* 34 */ + true, /* 35 */ + true, /* 36 */ + true, /* 37 */ + false, /* 38 */ + true, /* 39 */ + true, /* 40 */ + true, /* 41 */ + true, /* 42 */ + true, /* 43 */ + true, /* 44 */ + true, /* 45 */ + true, /* 46 */ + true, /* 47 */ + true, /* 48 */ + true, /* 49 */ + true, /* 50 */ + true, /* 51 */ + true, /* 52 */ + true, /* 53 */ + true, /* 54 */ + true, /* 55 */ + true, /* 56 */ + true, /* 57 */ + true, /* 58 */ + true, /* 59 */ + false, /* 60 */ + true, /* 61 */ + false, /* 62 */ + true, /* 63 */ + true, /* 64 */ + true, /* 65 */ + true, /* 66 */ + true, /* 67 */ + true, /* 68 */ + true, /* 69 */ + true, /* 70 */ + true, /* 71 */ + true, /* 72 */ + true, /* 73 */ + true, /* 74 */ + true, /* 75 */ + true, /* 76 */ + true, /* 77 */ + true, /* 78 */ + true, /* 79 */ + true, /* 80 */ + true, /* 81 */ + true, /* 82 */ + true, /* 83 */ + true, /* 84 */ + true, /* 85 */ + true, /* 86 */ + true, /* 87 */ + true, /* 88 */ + true, /* 89 */ + true, /* 90 */ + true, /* 91 */ + false, /* 92 */ + true, /* 93 */ + true, /* 94 */ + true, /* 95 */ + true, /* 96 */ + true, /* 97 */ + true, /* 98 */ + true, /* 99 */ + true, /* 100 */ + true, /* 101 */ + true, /* 102 */ + true, /* 103 */ + true, /* 104 */ + true, /* 105 */ + true, /* 106 */ + true, /* 107 */ + true, /* 108 */ + true, /* 109 */ + true, /* 110 */ + true, /* 111 */ + true, /* 112 */ + true, /* 113 */ + true, /* 114 */ + true, /* 115 */ + true, /* 116 */ + true, /* 117 */ + true, /* 118 */ + true, /* 119 */ + true, /* 120 */ + true, /* 121 */ + true, /* 122 */ + true, /* 123 */ + true, /* 124 */ + true, /* 125 */ + true, /* 126 */ + true, /* 127 */ + true, /* 128 */ + true, /* 129 */ + true, /* 130 */ + true, /* 131 */ + true, /* 132 */ + true, /* 133 */ + true, /* 134 */ + true, /* 135 */ + true, /* 136 */ + true, /* 137 */ + true, /* 138 */ + true, /* 139 */ + true, /* 140 */ + true, /* 141 */ + true, /* 142 */ + true, /* 143 */ + true, /* 144 */ + true, /* 145 */ + true, /* 146 */ + true, /* 147 */ + true, /* 148 */ + true, /* 149 */ + true, /* 150 */ + true, /* 151 */ + true, /* 152 */ + true, /* 153 */ + true, /* 154 */ + true, /* 155 */ + true, /* 156 */ + true, /* 157 */ + true, /* 158 */ + true, /* 159 */ + true, /* 160 */ + true, /* 161 */ + true, /* 162 */ + true, /* 163 */ + true, /* 164 */ + true, /* 165 */ + true, /* 166 */ + true, /* 167 */ + true, /* 168 */ + true, /* 169 */ + true, /* 170 */ + true, /* 171 */ + true, /* 172 */ + true, /* 173 */ + true, /* 174 */ + true, /* 175 */ + true, /* 176 */ + true, /* 177 */ + true, /* 178 */ + true, /* 179 */ + true, /* 180 */ + true, /* 181 */ + true, /* 182 */ + true, /* 183 */ + true, /* 184 */ + true, /* 185 */ + true, /* 186 */ + true, /* 187 */ + true, /* 188 */ + true, /* 189 */ + true, /* 190 */ + true, /* 191 */ + true, /* 192 */ + true, /* 193 */ + true, /* 194 */ + true, /* 195 */ + true, /* 196 */ + true, /* 197 */ + true, /* 198 */ + true, /* 199 */ + true, /* 200 */ + true, /* 201 */ + true, /* 202 */ + true, /* 203 */ + true, /* 204 */ + true, /* 205 */ + true, /* 206 */ + true, /* 207 */ + true, /* 208 */ + true, /* 209 */ + true, /* 210 */ + true, /* 211 */ + true, /* 212 */ + true, /* 213 */ + true, /* 214 */ + true, /* 215 */ + true, /* 216 */ + true, /* 217 */ + true, /* 218 */ + true, /* 219 */ + true, /* 220 */ + true, /* 221 */ + true, /* 222 */ + true, /* 223 */ + true, /* 224 */ + true, /* 225 */ + true, /* 226 */ + true, /* 227 */ + true, /* 228 */ + true, /* 229 */ + true, /* 230 */ + true, /* 231 */ + true, /* 232 */ + true, /* 233 */ + true, /* 234 */ + true, /* 235 */ + true, /* 236 */ + true, /* 237 */ + true, /* 238 */ + true, /* 239 */ + true, /* 240 */ + true, /* 241 */ + true, /* 242 */ + true, /* 243 */ + true, /* 244 */ + true, /* 245 */ + true, /* 246 */ + true, /* 247 */ + true, /* 248 */ + true, /* 249 */ + true, /* 250 */ + true, /* 251 */ + true, /* 252 */ + true, /* 253 */ + true, /* 254 */ + true, /* 255 */ +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/lexer.go b/vendor/github.com/pquerna/ffjson/fflib/v1/lexer.go new file mode 100644 index 00000000..5589292f --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/lexer.go @@ -0,0 +1,937 @@ +/** + * Copyright 2014 Paul Querna + * + * 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. + * + */ + +/* Portions of this file are on derived from yajl: */ +/* + * Copyright (c) 2007-2014, Lloyd Hilaiel + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package v1 + +import ( + "errors" + "fmt" + "io" +) + +type FFParseState int + +const ( + FFParse_map_start FFParseState = iota + FFParse_want_key + FFParse_want_colon + FFParse_want_value + FFParse_after_value +) + +type FFTok int + +const ( + FFTok_init FFTok = iota + FFTok_bool FFTok = iota + FFTok_colon FFTok = iota + FFTok_comma FFTok = iota + FFTok_eof FFTok = iota + FFTok_error FFTok = iota + FFTok_left_brace FFTok = iota + FFTok_left_bracket FFTok = iota + FFTok_null FFTok = iota + FFTok_right_brace FFTok = iota + FFTok_right_bracket FFTok = iota + + /* we differentiate between integers and doubles to allow the + * parser to interpret the number without re-scanning */ + FFTok_integer FFTok = iota + FFTok_double FFTok = iota + + FFTok_string FFTok = iota + + /* comment tokens are not currently returned to the parser, ever */ + FFTok_comment FFTok = iota +) + +type FFErr int + +const ( + FFErr_e_ok FFErr = iota + FFErr_io FFErr = iota + FFErr_string_invalid_utf8 FFErr = iota + FFErr_string_invalid_escaped_char FFErr = iota + FFErr_string_invalid_json_char FFErr = iota + FFErr_string_invalid_hex_char FFErr = iota + FFErr_invalid_char FFErr = iota + FFErr_invalid_string FFErr = iota + FFErr_missing_integer_after_decimal FFErr = iota + FFErr_missing_integer_after_exponent FFErr = iota + FFErr_missing_integer_after_minus FFErr = iota + FFErr_unallowed_comment FFErr = iota + FFErr_incomplete_comment FFErr = iota + FFErr_unexpected_token_type FFErr = iota // TODO: improve this error +) + +type FFLexer struct { + reader *ffReader + Output DecodingBuffer + Token FFTok + Error FFErr + BigError error + // TODO: convert all of this to an interface + lastCurrentChar int + captureAll bool + buf Buffer +} + +func NewFFLexer(input []byte) *FFLexer { + fl := &FFLexer{ + Token: FFTok_init, + Error: FFErr_e_ok, + reader: newffReader(input), + Output: &Buffer{}, + } + // TODO: guess size? + //fl.Output.Grow(64) + return fl +} + +type LexerError struct { + offset int + line int + char int + err error +} + +// Reset the Lexer and add new input. +func (ffl *FFLexer) Reset(input []byte) { + ffl.Token = FFTok_init + ffl.Error = FFErr_e_ok + ffl.BigError = nil + ffl.reader.Reset(input) + ffl.lastCurrentChar = 0 + ffl.Output.Reset() +} + +func (le *LexerError) Error() string { + return fmt.Sprintf(`ffjson error: (%T)%s offset=%d line=%d char=%d`, + le.err, le.err.Error(), + le.offset, le.line, le.char) +} + +func (ffl *FFLexer) WrapErr(err error) error { + line, char := ffl.reader.PosWithLine() + // TOOD: calcualte lines/characters based on offset + return &LexerError{ + offset: ffl.reader.Pos(), + line: line, + char: char, + err: err, + } +} + +func (ffl *FFLexer) scanReadByte() (byte, error) { + var c byte + var err error + if ffl.captureAll { + c, err = ffl.reader.ReadByte() + } else { + c, err = ffl.reader.ReadByteNoWS() + } + + if err != nil { + ffl.Error = FFErr_io + ffl.BigError = err + return 0, err + } + + return c, nil +} + +func (ffl *FFLexer) readByte() (byte, error) { + + c, err := ffl.reader.ReadByte() + if err != nil { + ffl.Error = FFErr_io + ffl.BigError = err + return 0, err + } + + return c, nil +} + +func (ffl *FFLexer) unreadByte() { + ffl.reader.UnreadByte() +} + +func (ffl *FFLexer) wantBytes(want []byte, iftrue FFTok) FFTok { + startPos := ffl.reader.Pos() + for _, b := range want { + c, err := ffl.readByte() + + if err != nil { + return FFTok_error + } + + if c != b { + ffl.unreadByte() + // fmt.Printf("wanted bytes: %s\n", string(want)) + // TODO(pquerna): thsi is a bad error message + ffl.Error = FFErr_invalid_string + return FFTok_error + } + } + + endPos := ffl.reader.Pos() + ffl.Output.Write(ffl.reader.Slice(startPos, endPos)) + return iftrue +} + +func (ffl *FFLexer) lexComment() FFTok { + c, err := ffl.readByte() + if err != nil { + return FFTok_error + } + + if c == '/' { + // a // comment, scan until line ends. + for { + c, err := ffl.readByte() + if err != nil { + return FFTok_error + } + + if c == '\n' { + return FFTok_comment + } + } + } else if c == '*' { + // a /* */ comment, scan */ + for { + c, err := ffl.readByte() + if err != nil { + return FFTok_error + } + + if c == '*' { + c, err := ffl.readByte() + + if err != nil { + return FFTok_error + } + + if c == '/' { + return FFTok_comment + } + + ffl.Error = FFErr_incomplete_comment + return FFTok_error + } + } + } else { + ffl.Error = FFErr_incomplete_comment + return FFTok_error + } +} + +func (ffl *FFLexer) lexString() FFTok { + if ffl.captureAll { + ffl.buf.Reset() + err := ffl.reader.SliceString(&ffl.buf) + + if err != nil { + ffl.BigError = err + return FFTok_error + } + + WriteJson(ffl.Output, ffl.buf.Bytes()) + + return FFTok_string + } else { + err := ffl.reader.SliceString(ffl.Output) + + if err != nil { + ffl.BigError = err + return FFTok_error + } + + return FFTok_string + } +} + +func (ffl *FFLexer) lexNumber() FFTok { + var numRead int = 0 + tok := FFTok_integer + startPos := ffl.reader.Pos() + + c, err := ffl.readByte() + if err != nil { + return FFTok_error + } + + /* optional leading minus */ + if c == '-' { + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + } + + /* a single zero, or a series of integers */ + if c == '0' { + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + } else if c >= '1' && c <= '9' { + for c >= '0' && c <= '9' { + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + } + } else { + ffl.unreadByte() + ffl.Error = FFErr_missing_integer_after_minus + return FFTok_error + } + + if c == '.' { + numRead = 0 + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + + for c >= '0' && c <= '9' { + numRead++ + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + } + + if numRead == 0 { + ffl.unreadByte() + + ffl.Error = FFErr_missing_integer_after_decimal + return FFTok_error + } + + tok = FFTok_double + } + + /* optional exponent (indicates this is floating point) */ + if c == 'e' || c == 'E' { + numRead = 0 + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + + /* optional sign */ + if c == '+' || c == '-' { + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + } + + for c >= '0' && c <= '9' { + numRead++ + c, err = ffl.readByte() + if err != nil { + return FFTok_error + } + } + + if numRead == 0 { + ffl.Error = FFErr_missing_integer_after_exponent + return FFTok_error + } + + tok = FFTok_double + } + + ffl.unreadByte() + + endPos := ffl.reader.Pos() + ffl.Output.Write(ffl.reader.Slice(startPos, endPos)) + return tok +} + +var true_bytes = []byte{'r', 'u', 'e'} +var false_bytes = []byte{'a', 'l', 's', 'e'} +var null_bytes = []byte{'u', 'l', 'l'} + +func (ffl *FFLexer) Scan() FFTok { + tok := FFTok_error + if ffl.captureAll == false { + ffl.Output.Reset() + } + ffl.Token = FFTok_init + + for { + c, err := ffl.scanReadByte() + if err != nil { + if err == io.EOF { + return FFTok_eof + } else { + return FFTok_error + } + } + + switch c { + case '{': + tok = FFTok_left_bracket + if ffl.captureAll { + ffl.Output.WriteByte('{') + } + goto lexed + case '}': + tok = FFTok_right_bracket + if ffl.captureAll { + ffl.Output.WriteByte('}') + } + goto lexed + case '[': + tok = FFTok_left_brace + if ffl.captureAll { + ffl.Output.WriteByte('[') + } + goto lexed + case ']': + tok = FFTok_right_brace + if ffl.captureAll { + ffl.Output.WriteByte(']') + } + goto lexed + case ',': + tok = FFTok_comma + if ffl.captureAll { + ffl.Output.WriteByte(',') + } + goto lexed + case ':': + tok = FFTok_colon + if ffl.captureAll { + ffl.Output.WriteByte(':') + } + goto lexed + case '\t', '\n', '\v', '\f', '\r', ' ': + if ffl.captureAll { + ffl.Output.WriteByte(c) + } + case 't': + ffl.Output.WriteByte('t') + tok = ffl.wantBytes(true_bytes, FFTok_bool) + goto lexed + case 'f': + ffl.Output.WriteByte('f') + tok = ffl.wantBytes(false_bytes, FFTok_bool) + goto lexed + case 'n': + ffl.Output.WriteByte('n') + tok = ffl.wantBytes(null_bytes, FFTok_null) + goto lexed + case '"': + tok = ffl.lexString() + goto lexed + case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + ffl.unreadByte() + tok = ffl.lexNumber() + goto lexed + case '/': + tok = ffl.lexComment() + goto lexed + default: + tok = FFTok_error + ffl.Error = FFErr_invalid_char + goto lexed + } + } + +lexed: + ffl.Token = tok + return tok +} + +func (ffl *FFLexer) scanField(start FFTok, capture bool) ([]byte, error) { + switch start { + case FFTok_left_brace, + FFTok_left_bracket: + { + end := FFTok_right_brace + if start == FFTok_left_bracket { + end = FFTok_right_bracket + if capture { + ffl.Output.WriteByte('{') + } + } else { + if capture { + ffl.Output.WriteByte('[') + } + } + + depth := 1 + if capture { + ffl.captureAll = true + } + // TODO: work. + scanloop: + for { + tok := ffl.Scan() + //fmt.Printf("capture-token: %v end: %v depth: %v\n", tok, end, depth) + switch tok { + case FFTok_eof: + return nil, errors.New("ffjson: unexpected EOF") + case FFTok_error: + if ffl.BigError != nil { + return nil, ffl.BigError + } + return nil, ffl.Error.ToError() + case end: + depth-- + if depth == 0 { + break scanloop + } + case start: + depth++ + } + } + + if capture { + ffl.captureAll = false + } + + if capture { + return ffl.Output.Bytes(), nil + } else { + return nil, nil + } + } + case FFTok_bool, + FFTok_integer, + FFTok_null, + FFTok_double: + // simple value, return it. + if capture { + return ffl.Output.Bytes(), nil + } else { + return nil, nil + } + + case FFTok_string: + //TODO(pquerna): so, other users expect this to be a quoted string :( + if capture { + ffl.buf.Reset() + WriteJson(&ffl.buf, ffl.Output.Bytes()) + return ffl.buf.Bytes(), nil + } else { + return nil, nil + } + } + + return nil, fmt.Errorf("ffjson: invalid capture type: %v", start) +} + +// Captures an entire field value, including recursive objects, +// and converts them to a []byte suitable to pass to a sub-object's +// UnmarshalJSON +func (ffl *FFLexer) CaptureField(start FFTok) ([]byte, error) { + return ffl.scanField(start, true) +} + +func (ffl *FFLexer) SkipField(start FFTok) error { + _, err := ffl.scanField(start, false) + return err +} + +// TODO(pquerna): return line number and offset. +func (err FFErr) ToError() error { + switch err { + case FFErr_e_ok: + return nil + case FFErr_io: + return errors.New("ffjson: IO error") + case FFErr_string_invalid_utf8: + return errors.New("ffjson: string with invalid UTF-8 sequence") + case FFErr_string_invalid_escaped_char: + return errors.New("ffjson: string with invalid escaped character") + case FFErr_string_invalid_json_char: + return errors.New("ffjson: string with invalid JSON character") + case FFErr_string_invalid_hex_char: + return errors.New("ffjson: string with invalid hex character") + case FFErr_invalid_char: + return errors.New("ffjson: invalid character") + case FFErr_invalid_string: + return errors.New("ffjson: invalid string") + case FFErr_missing_integer_after_decimal: + return errors.New("ffjson: missing integer after decimal") + case FFErr_missing_integer_after_exponent: + return errors.New("ffjson: missing integer after exponent") + case FFErr_missing_integer_after_minus: + return errors.New("ffjson: missing integer after minus") + case FFErr_unallowed_comment: + return errors.New("ffjson: unallowed comment") + case FFErr_incomplete_comment: + return errors.New("ffjson: incomplete comment") + case FFErr_unexpected_token_type: + return errors.New("ffjson: unexpected token sequence") + } + + panic(fmt.Sprintf("unknown error type: %v ", err)) +} + +func (state FFParseState) String() string { + switch state { + case FFParse_map_start: + return "map:start" + case FFParse_want_key: + return "want_key" + case FFParse_want_colon: + return "want_colon" + case FFParse_want_value: + return "want_value" + case FFParse_after_value: + return "after_value" + } + + panic(fmt.Sprintf("unknown parse state: %d", int(state))) +} + +func (tok FFTok) String() string { + switch tok { + case FFTok_init: + return "tok:init" + case FFTok_bool: + return "tok:bool" + case FFTok_colon: + return "tok:colon" + case FFTok_comma: + return "tok:comma" + case FFTok_eof: + return "tok:eof" + case FFTok_error: + return "tok:error" + case FFTok_left_brace: + return "tok:left_brace" + case FFTok_left_bracket: + return "tok:left_bracket" + case FFTok_null: + return "tok:null" + case FFTok_right_brace: + return "tok:right_brace" + case FFTok_right_bracket: + return "tok:right_bracket" + case FFTok_integer: + return "tok:integer" + case FFTok_double: + return "tok:double" + case FFTok_string: + return "tok:string" + case FFTok_comment: + return "comment" + } + + panic(fmt.Sprintf("unknown token: %d", int(tok))) +} + +/* a lookup table which lets us quickly determine three things: + * cVEC - valid escaped control char + * note. the solidus '/' may be escaped or not. + * cIJC - invalid json char + * cVHC - valid hex char + * cNFP - needs further processing (from a string scanning perspective) + * cNUC - needs utf8 checking when enabled (from a string scanning perspective) + */ + +const ( + cVEC int8 = 0x01 + cIJC int8 = 0x02 + cVHC int8 = 0x04 + cNFP int8 = 0x08 + cNUC int8 = 0x10 +) + +var byteLookupTable [256]int8 = [256]int8{ + cIJC, /* 0 */ + cIJC, /* 1 */ + cIJC, /* 2 */ + cIJC, /* 3 */ + cIJC, /* 4 */ + cIJC, /* 5 */ + cIJC, /* 6 */ + cIJC, /* 7 */ + cIJC, /* 8 */ + cIJC, /* 9 */ + cIJC, /* 10 */ + cIJC, /* 11 */ + cIJC, /* 12 */ + cIJC, /* 13 */ + cIJC, /* 14 */ + cIJC, /* 15 */ + cIJC, /* 16 */ + cIJC, /* 17 */ + cIJC, /* 18 */ + cIJC, /* 19 */ + cIJC, /* 20 */ + cIJC, /* 21 */ + cIJC, /* 22 */ + cIJC, /* 23 */ + cIJC, /* 24 */ + cIJC, /* 25 */ + cIJC, /* 26 */ + cIJC, /* 27 */ + cIJC, /* 28 */ + cIJC, /* 29 */ + cIJC, /* 30 */ + cIJC, /* 31 */ + 0, /* 32 */ + 0, /* 33 */ + cVEC | cIJC | cNFP, /* 34 */ + 0, /* 35 */ + 0, /* 36 */ + 0, /* 37 */ + 0, /* 38 */ + 0, /* 39 */ + 0, /* 40 */ + 0, /* 41 */ + 0, /* 42 */ + 0, /* 43 */ + 0, /* 44 */ + 0, /* 45 */ + 0, /* 46 */ + cVEC, /* 47 */ + cVHC, /* 48 */ + cVHC, /* 49 */ + cVHC, /* 50 */ + cVHC, /* 51 */ + cVHC, /* 52 */ + cVHC, /* 53 */ + cVHC, /* 54 */ + cVHC, /* 55 */ + cVHC, /* 56 */ + cVHC, /* 57 */ + 0, /* 58 */ + 0, /* 59 */ + 0, /* 60 */ + 0, /* 61 */ + 0, /* 62 */ + 0, /* 63 */ + 0, /* 64 */ + cVHC, /* 65 */ + cVHC, /* 66 */ + cVHC, /* 67 */ + cVHC, /* 68 */ + cVHC, /* 69 */ + cVHC, /* 70 */ + 0, /* 71 */ + 0, /* 72 */ + 0, /* 73 */ + 0, /* 74 */ + 0, /* 75 */ + 0, /* 76 */ + 0, /* 77 */ + 0, /* 78 */ + 0, /* 79 */ + 0, /* 80 */ + 0, /* 81 */ + 0, /* 82 */ + 0, /* 83 */ + 0, /* 84 */ + 0, /* 85 */ + 0, /* 86 */ + 0, /* 87 */ + 0, /* 88 */ + 0, /* 89 */ + 0, /* 90 */ + 0, /* 91 */ + cVEC | cIJC | cNFP, /* 92 */ + 0, /* 93 */ + 0, /* 94 */ + 0, /* 95 */ + 0, /* 96 */ + cVHC, /* 97 */ + cVEC | cVHC, /* 98 */ + cVHC, /* 99 */ + cVHC, /* 100 */ + cVHC, /* 101 */ + cVEC | cVHC, /* 102 */ + 0, /* 103 */ + 0, /* 104 */ + 0, /* 105 */ + 0, /* 106 */ + 0, /* 107 */ + 0, /* 108 */ + 0, /* 109 */ + cVEC, /* 110 */ + 0, /* 111 */ + 0, /* 112 */ + 0, /* 113 */ + cVEC, /* 114 */ + 0, /* 115 */ + cVEC, /* 116 */ + 0, /* 117 */ + 0, /* 118 */ + 0, /* 119 */ + 0, /* 120 */ + 0, /* 121 */ + 0, /* 122 */ + 0, /* 123 */ + 0, /* 124 */ + 0, /* 125 */ + 0, /* 126 */ + 0, /* 127 */ + cNUC, /* 128 */ + cNUC, /* 129 */ + cNUC, /* 130 */ + cNUC, /* 131 */ + cNUC, /* 132 */ + cNUC, /* 133 */ + cNUC, /* 134 */ + cNUC, /* 135 */ + cNUC, /* 136 */ + cNUC, /* 137 */ + cNUC, /* 138 */ + cNUC, /* 139 */ + cNUC, /* 140 */ + cNUC, /* 141 */ + cNUC, /* 142 */ + cNUC, /* 143 */ + cNUC, /* 144 */ + cNUC, /* 145 */ + cNUC, /* 146 */ + cNUC, /* 147 */ + cNUC, /* 148 */ + cNUC, /* 149 */ + cNUC, /* 150 */ + cNUC, /* 151 */ + cNUC, /* 152 */ + cNUC, /* 153 */ + cNUC, /* 154 */ + cNUC, /* 155 */ + cNUC, /* 156 */ + cNUC, /* 157 */ + cNUC, /* 158 */ + cNUC, /* 159 */ + cNUC, /* 160 */ + cNUC, /* 161 */ + cNUC, /* 162 */ + cNUC, /* 163 */ + cNUC, /* 164 */ + cNUC, /* 165 */ + cNUC, /* 166 */ + cNUC, /* 167 */ + cNUC, /* 168 */ + cNUC, /* 169 */ + cNUC, /* 170 */ + cNUC, /* 171 */ + cNUC, /* 172 */ + cNUC, /* 173 */ + cNUC, /* 174 */ + cNUC, /* 175 */ + cNUC, /* 176 */ + cNUC, /* 177 */ + cNUC, /* 178 */ + cNUC, /* 179 */ + cNUC, /* 180 */ + cNUC, /* 181 */ + cNUC, /* 182 */ + cNUC, /* 183 */ + cNUC, /* 184 */ + cNUC, /* 185 */ + cNUC, /* 186 */ + cNUC, /* 187 */ + cNUC, /* 188 */ + cNUC, /* 189 */ + cNUC, /* 190 */ + cNUC, /* 191 */ + cNUC, /* 192 */ + cNUC, /* 193 */ + cNUC, /* 194 */ + cNUC, /* 195 */ + cNUC, /* 196 */ + cNUC, /* 197 */ + cNUC, /* 198 */ + cNUC, /* 199 */ + cNUC, /* 200 */ + cNUC, /* 201 */ + cNUC, /* 202 */ + cNUC, /* 203 */ + cNUC, /* 204 */ + cNUC, /* 205 */ + cNUC, /* 206 */ + cNUC, /* 207 */ + cNUC, /* 208 */ + cNUC, /* 209 */ + cNUC, /* 210 */ + cNUC, /* 211 */ + cNUC, /* 212 */ + cNUC, /* 213 */ + cNUC, /* 214 */ + cNUC, /* 215 */ + cNUC, /* 216 */ + cNUC, /* 217 */ + cNUC, /* 218 */ + cNUC, /* 219 */ + cNUC, /* 220 */ + cNUC, /* 221 */ + cNUC, /* 222 */ + cNUC, /* 223 */ + cNUC, /* 224 */ + cNUC, /* 225 */ + cNUC, /* 226 */ + cNUC, /* 227 */ + cNUC, /* 228 */ + cNUC, /* 229 */ + cNUC, /* 230 */ + cNUC, /* 231 */ + cNUC, /* 232 */ + cNUC, /* 233 */ + cNUC, /* 234 */ + cNUC, /* 235 */ + cNUC, /* 236 */ + cNUC, /* 237 */ + cNUC, /* 238 */ + cNUC, /* 239 */ + cNUC, /* 240 */ + cNUC, /* 241 */ + cNUC, /* 242 */ + cNUC, /* 243 */ + cNUC, /* 244 */ + cNUC, /* 245 */ + cNUC, /* 246 */ + cNUC, /* 247 */ + cNUC, /* 248 */ + cNUC, /* 249 */ + cNUC, /* 250 */ + cNUC, /* 251 */ + cNUC, /* 252 */ + cNUC, /* 253 */ + cNUC, /* 254 */ + cNUC, /* 255 */ +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/reader.go b/vendor/github.com/pquerna/ffjson/fflib/v1/reader.go new file mode 100644 index 00000000..0f22c469 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/reader.go @@ -0,0 +1,512 @@ +/** + * Copyright 2014 Paul Querna + * + * 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 v1 + +import ( + "fmt" + "io" + "unicode" + "unicode/utf16" +) + +const sliceStringMask = cIJC | cNFP + +type ffReader struct { + s []byte + i int + l int +} + +func newffReader(d []byte) *ffReader { + return &ffReader{ + s: d, + i: 0, + l: len(d), + } +} + +func (r *ffReader) Slice(start, stop int) []byte { + return r.s[start:stop] +} + +func (r *ffReader) Pos() int { + return r.i +} + +// Reset the reader, and add new input. +func (r *ffReader) Reset(d []byte) { + r.s = d + r.i = 0 + r.l = len(d) +} + +// Calcuates the Position with line and line offset, +// because this isn't counted for performance reasons, +// it will iterate the buffer from the beginning, and should +// only be used in error-paths. +func (r *ffReader) PosWithLine() (int, int) { + currentLine := 1 + currentChar := 0 + + for i := 0; i < r.i; i++ { + c := r.s[i] + currentChar++ + if c == '\n' { + currentLine++ + currentChar = 0 + } + } + + return currentLine, currentChar +} + +func (r *ffReader) ReadByteNoWS() (byte, error) { + if r.i >= r.l { + return 0, io.EOF + } + + j := r.i + + for { + c := r.s[j] + j++ + + // inline whitespace parsing gives another ~8% performance boost + // for many kinds of nicely indented JSON. + // ... and using a [255]bool instead of multiple ifs, gives another 2% + /* + if c != '\t' && + c != '\n' && + c != '\v' && + c != '\f' && + c != '\r' && + c != ' ' { + r.i = j + return c, nil + } + */ + if whitespaceLookupTable[c] == false { + r.i = j + return c, nil + } + + if j >= r.l { + return 0, io.EOF + } + } +} + +func (r *ffReader) ReadByte() (byte, error) { + if r.i >= r.l { + return 0, io.EOF + } + + r.i++ + + return r.s[r.i-1], nil +} + +func (r *ffReader) UnreadByte() error { + if r.i <= 0 { + panic("ffReader.UnreadByte: at beginning of slice") + } + r.i-- + return nil +} + +func (r *ffReader) readU4(j int) (rune, error) { + + var u4 [4]byte + for i := 0; i < 4; i++ { + if j >= r.l { + return -1, io.EOF + } + c := r.s[j] + if byteLookupTable[c]&cVHC != 0 { + u4[i] = c + j++ + continue + } else { + // TODO(pquerna): handle errors better. layering violation. + return -1, fmt.Errorf("lex_string_invalid_hex_char: %v %v", c, string(u4[:])) + } + } + + // TODO(pquerna): utf16.IsSurrogate + rr, err := ParseUint(u4[:], 16, 64) + if err != nil { + return -1, err + } + return rune(rr), nil +} + +func (r *ffReader) handleEscaped(c byte, j int, out DecodingBuffer) (int, error) { + if j >= r.l { + return 0, io.EOF + } + + c = r.s[j] + j++ + + if c == 'u' { + ru, err := r.readU4(j) + if err != nil { + return 0, err + } + + if utf16.IsSurrogate(ru) { + ru2, err := r.readU4(j + 6) + if err != nil { + return 0, err + } + out.Write(r.s[r.i : j-2]) + r.i = j + 10 + j = r.i + rval := utf16.DecodeRune(ru, ru2) + if rval != unicode.ReplacementChar { + out.WriteRune(rval) + } else { + return 0, fmt.Errorf("lex_string_invalid_unicode_surrogate: %v %v", ru, ru2) + } + } else { + out.Write(r.s[r.i : j-2]) + r.i = j + 4 + j = r.i + out.WriteRune(ru) + } + return j, nil + } else if byteLookupTable[c]&cVEC == 0 { + return 0, fmt.Errorf("lex_string_invalid_escaped_char: %v", c) + } else { + out.Write(r.s[r.i : j-2]) + r.i = j + j = r.i + + switch c { + case '"': + out.WriteByte('"') + case '\\': + out.WriteByte('\\') + case '/': + out.WriteByte('/') + case 'b': + out.WriteByte('\b') + case 'f': + out.WriteByte('\f') + case 'n': + out.WriteByte('\n') + case 'r': + out.WriteByte('\r') + case 't': + out.WriteByte('\t') + } + } + + return j, nil +} + +func (r *ffReader) SliceString(out DecodingBuffer) error { + var c byte + // TODO(pquerna): string_with_escapes? de-escape here? + j := r.i + + for { + if j >= r.l { + return io.EOF + } + + j, c = scanString(r.s, j) + + if c == '"' { + if j != r.i { + out.Write(r.s[r.i : j-1]) + r.i = j + } + return nil + } else if c == '\\' { + var err error + j, err = r.handleEscaped(c, j, out) + if err != nil { + return err + } + } else if byteLookupTable[c]&cIJC != 0 { + return fmt.Errorf("lex_string_invalid_json_char: %v", c) + } + continue + } +} + +// TODO(pquerna): consider combining wibth the normal byte mask. +var whitespaceLookupTable [256]bool = [256]bool{ + false, /* 0 */ + false, /* 1 */ + false, /* 2 */ + false, /* 3 */ + false, /* 4 */ + false, /* 5 */ + false, /* 6 */ + false, /* 7 */ + false, /* 8 */ + true, /* 9 */ + true, /* 10 */ + true, /* 11 */ + true, /* 12 */ + true, /* 13 */ + false, /* 14 */ + false, /* 15 */ + false, /* 16 */ + false, /* 17 */ + false, /* 18 */ + false, /* 19 */ + false, /* 20 */ + false, /* 21 */ + false, /* 22 */ + false, /* 23 */ + false, /* 24 */ + false, /* 25 */ + false, /* 26 */ + false, /* 27 */ + false, /* 28 */ + false, /* 29 */ + false, /* 30 */ + false, /* 31 */ + true, /* 32 */ + false, /* 33 */ + false, /* 34 */ + false, /* 35 */ + false, /* 36 */ + false, /* 37 */ + false, /* 38 */ + false, /* 39 */ + false, /* 40 */ + false, /* 41 */ + false, /* 42 */ + false, /* 43 */ + false, /* 44 */ + false, /* 45 */ + false, /* 46 */ + false, /* 47 */ + false, /* 48 */ + false, /* 49 */ + false, /* 50 */ + false, /* 51 */ + false, /* 52 */ + false, /* 53 */ + false, /* 54 */ + false, /* 55 */ + false, /* 56 */ + false, /* 57 */ + false, /* 58 */ + false, /* 59 */ + false, /* 60 */ + false, /* 61 */ + false, /* 62 */ + false, /* 63 */ + false, /* 64 */ + false, /* 65 */ + false, /* 66 */ + false, /* 67 */ + false, /* 68 */ + false, /* 69 */ + false, /* 70 */ + false, /* 71 */ + false, /* 72 */ + false, /* 73 */ + false, /* 74 */ + false, /* 75 */ + false, /* 76 */ + false, /* 77 */ + false, /* 78 */ + false, /* 79 */ + false, /* 80 */ + false, /* 81 */ + false, /* 82 */ + false, /* 83 */ + false, /* 84 */ + false, /* 85 */ + false, /* 86 */ + false, /* 87 */ + false, /* 88 */ + false, /* 89 */ + false, /* 90 */ + false, /* 91 */ + false, /* 92 */ + false, /* 93 */ + false, /* 94 */ + false, /* 95 */ + false, /* 96 */ + false, /* 97 */ + false, /* 98 */ + false, /* 99 */ + false, /* 100 */ + false, /* 101 */ + false, /* 102 */ + false, /* 103 */ + false, /* 104 */ + false, /* 105 */ + false, /* 106 */ + false, /* 107 */ + false, /* 108 */ + false, /* 109 */ + false, /* 110 */ + false, /* 111 */ + false, /* 112 */ + false, /* 113 */ + false, /* 114 */ + false, /* 115 */ + false, /* 116 */ + false, /* 117 */ + false, /* 118 */ + false, /* 119 */ + false, /* 120 */ + false, /* 121 */ + false, /* 122 */ + false, /* 123 */ + false, /* 124 */ + false, /* 125 */ + false, /* 126 */ + false, /* 127 */ + false, /* 128 */ + false, /* 129 */ + false, /* 130 */ + false, /* 131 */ + false, /* 132 */ + false, /* 133 */ + false, /* 134 */ + false, /* 135 */ + false, /* 136 */ + false, /* 137 */ + false, /* 138 */ + false, /* 139 */ + false, /* 140 */ + false, /* 141 */ + false, /* 142 */ + false, /* 143 */ + false, /* 144 */ + false, /* 145 */ + false, /* 146 */ + false, /* 147 */ + false, /* 148 */ + false, /* 149 */ + false, /* 150 */ + false, /* 151 */ + false, /* 152 */ + false, /* 153 */ + false, /* 154 */ + false, /* 155 */ + false, /* 156 */ + false, /* 157 */ + false, /* 158 */ + false, /* 159 */ + false, /* 160 */ + false, /* 161 */ + false, /* 162 */ + false, /* 163 */ + false, /* 164 */ + false, /* 165 */ + false, /* 166 */ + false, /* 167 */ + false, /* 168 */ + false, /* 169 */ + false, /* 170 */ + false, /* 171 */ + false, /* 172 */ + false, /* 173 */ + false, /* 174 */ + false, /* 175 */ + false, /* 176 */ + false, /* 177 */ + false, /* 178 */ + false, /* 179 */ + false, /* 180 */ + false, /* 181 */ + false, /* 182 */ + false, /* 183 */ + false, /* 184 */ + false, /* 185 */ + false, /* 186 */ + false, /* 187 */ + false, /* 188 */ + false, /* 189 */ + false, /* 190 */ + false, /* 191 */ + false, /* 192 */ + false, /* 193 */ + false, /* 194 */ + false, /* 195 */ + false, /* 196 */ + false, /* 197 */ + false, /* 198 */ + false, /* 199 */ + false, /* 200 */ + false, /* 201 */ + false, /* 202 */ + false, /* 203 */ + false, /* 204 */ + false, /* 205 */ + false, /* 206 */ + false, /* 207 */ + false, /* 208 */ + false, /* 209 */ + false, /* 210 */ + false, /* 211 */ + false, /* 212 */ + false, /* 213 */ + false, /* 214 */ + false, /* 215 */ + false, /* 216 */ + false, /* 217 */ + false, /* 218 */ + false, /* 219 */ + false, /* 220 */ + false, /* 221 */ + false, /* 222 */ + false, /* 223 */ + false, /* 224 */ + false, /* 225 */ + false, /* 226 */ + false, /* 227 */ + false, /* 228 */ + false, /* 229 */ + false, /* 230 */ + false, /* 231 */ + false, /* 232 */ + false, /* 233 */ + false, /* 234 */ + false, /* 235 */ + false, /* 236 */ + false, /* 237 */ + false, /* 238 */ + false, /* 239 */ + false, /* 240 */ + false, /* 241 */ + false, /* 242 */ + false, /* 243 */ + false, /* 244 */ + false, /* 245 */ + false, /* 246 */ + false, /* 247 */ + false, /* 248 */ + false, /* 249 */ + false, /* 250 */ + false, /* 251 */ + false, /* 252 */ + false, /* 253 */ + false, /* 254 */ + false, /* 255 */ +} diff --git a/vendor/github.com/pquerna/ffjson/fflib/v1/reader_scan_generic.go b/vendor/github.com/pquerna/ffjson/fflib/v1/reader_scan_generic.go new file mode 100644 index 00000000..47c26077 --- /dev/null +++ b/vendor/github.com/pquerna/ffjson/fflib/v1/reader_scan_generic.go @@ -0,0 +1,34 @@ +/** + * Copyright 2014 Paul Querna + * + * 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 v1 + +func scanString(s []byte, j int) (int, byte) { + for { + if j >= len(s) { + return j, 0 + } + + c := s[j] + j++ + if byteLookupTable[c]&sliceStringMask == 0 { + continue + } + + return j, c + } +} diff --git a/vendor/gopkg.in/square/go-jose.v2/BUILD b/vendor/gopkg.in/square/go-jose.v2/BUILD index 1afbd827..24459ee8 100644 --- a/vendor/gopkg.in/square/go-jose.v2/BUILD +++ b/vendor/gopkg.in/square/go-jose.v2/BUILD @@ -10,10 +10,12 @@ go_library( "jwe.go", "jwk.go", "jws.go", + "opaque.go", "shared.go", "signing.go", "symmetric.go", ], + importmap = "k8s.io/kubernetes/vendor/gopkg.in/square/go-jose.v2", importpath = "gopkg.in/square/go-jose.v2", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/gopkg.in/square/go-jose.v2/README.md b/vendor/gopkg.in/square/go-jose.v2/README.md index 43bf1fbe..d2e989e1 100644 --- a/vendor/gopkg.in/square/go-jose.v2/README.md +++ b/vendor/gopkg.in/square/go-jose.v2/README.md @@ -84,6 +84,7 @@ standard where possible. The Godoc reference has a list of constants. RSASSA-PSS | PS256, PS384, PS512 HMAC | HS256, HS384, HS512 ECDSA | ES256, ES384, ES512 + Ed25519 | EdDSA Content encryption | Algorithm identifier(s) :------------------------- | :------------------------------ diff --git a/vendor/gopkg.in/square/go-jose.v2/asymmetric.go b/vendor/gopkg.in/square/go-jose.v2/asymmetric.go index 15e9d11a..5272648f 100644 --- a/vendor/gopkg.in/square/go-jose.v2/asymmetric.go +++ b/vendor/gopkg.in/square/go-jose.v2/asymmetric.go @@ -104,9 +104,9 @@ func newRSASigner(sigAlg SignatureAlgorithm, privateKey *rsa.PrivateKey) (recipi return recipientSigInfo{ sigAlg: sigAlg, - publicKey: &JSONWebKey{ - Key: &privateKey.PublicKey, - }, + publicKey: staticPublicKey(&JSONWebKey{ + Key: privateKey.Public(), + }), signer: &rsaDecrypterSigner{ privateKey: privateKey, }, @@ -123,9 +123,9 @@ func newEd25519Signer(sigAlg SignatureAlgorithm, privateKey ed25519.PrivateKey) } return recipientSigInfo{ sigAlg: sigAlg, - publicKey: &JSONWebKey{ + publicKey: staticPublicKey(&JSONWebKey{ Key: privateKey.Public(), - }, + }), signer: &edDecrypterSigner{ privateKey: privateKey, }, @@ -168,9 +168,9 @@ func newECDSASigner(sigAlg SignatureAlgorithm, privateKey *ecdsa.PrivateKey) (re return recipientSigInfo{ sigAlg: sigAlg, - publicKey: &JSONWebKey{ - Key: &privateKey.PublicKey, - }, + publicKey: staticPublicKey(&JSONWebKey{ + Key: privateKey.Public(), + }), signer: &ecDecrypterSigner{ privateKey: privateKey, }, @@ -466,6 +466,7 @@ func (ctx ecDecrypterSigner) decryptKey(headers rawHeader, recipient *recipientI return josecipher.KeyUnwrap(block, recipient.encryptedKey) } + func (ctx edDecrypterSigner) signPayload(payload []byte, alg SignatureAlgorithm) (Signature, error) { if alg != EdDSA { return Signature{}, ErrUnsupportedAlgorithm @@ -531,7 +532,7 @@ func (ctx ecDecrypterSigner) signPayload(payload []byte, alg SignatureAlgorithm) keyBytes++ } - // We serialize the outpus (r and s) into big-endian byte arrays and pad + // We serialize the outputs (r and s) into big-endian byte arrays and pad // them with zeros on the left to make sure the sizes work out. Both arrays // must be keyBytes long, and the output must be 2*keyBytes long. rBytes := r.Bytes() diff --git a/vendor/gopkg.in/square/go-jose.v2/jwk.go b/vendor/gopkg.in/square/go-jose.v2/jwk.go index 8e8f9e7f..d89046a0 100644 --- a/vendor/gopkg.in/square/go-jose.v2/jwk.go +++ b/vendor/gopkg.in/square/go-jose.v2/jwk.go @@ -148,17 +148,10 @@ func (k *JSONWebKey) UnmarshalJSON(data []byte) (err error) { if err == nil { *k = JSONWebKey{Key: key, KeyID: raw.Kid, Algorithm: raw.Alg, Use: raw.Use} - } - k.Certificates = make([]*x509.Certificate, len(raw.X5c)) - for i, cert := range raw.X5c { - raw, err := base64.StdEncoding.DecodeString(cert) - if err != nil { - return err - } - k.Certificates[i], err = x509.ParseCertificate(raw) + k.Certificates, err = parseCertificateChain(raw.X5c) if err != nil { - return err + return fmt.Errorf("failed to unmarshal x5c field: %s", err) } } @@ -247,13 +240,32 @@ func (k *JSONWebKey) Thumbprint(hash crypto.Hash) ([]byte, error) { // IsPublic returns true if the JWK represents a public key (not symmetric, not private). func (k *JSONWebKey) IsPublic() bool { switch k.Key.(type) { - case *ecdsa.PublicKey, *rsa.PublicKey, *ed25519.PublicKey: + case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey: return true default: return false } } +// Public creates JSONWebKey with corresponding publik key if JWK represents asymmetric private key. +func (k *JSONWebKey) Public() JSONWebKey { + if k.IsPublic() { + return *k + } + ret := *k + switch key := k.Key.(type) { + case *ecdsa.PrivateKey: + ret.Key = key.Public() + case *rsa.PrivateKey: + ret.Key = key.Public() + case ed25519.PrivateKey: + ret.Key = key.Public() + default: + return JSONWebKey{} // returning invalid key + } + return ret +} + // Valid checks that the key contains the expected parameters. func (k *JSONWebKey) Valid() bool { if k.Key == nil { @@ -276,12 +288,12 @@ func (k *JSONWebKey) Valid() bool { if key.N == nil || key.E == 0 || key.D == nil || len(key.Primes) < 2 { return false } - case *ed25519.PublicKey: - if len(*key) != 32 { + case ed25519.PublicKey: + if len(key) != 32 { return false } - case *ed25519.PrivateKey: - if len(*key) != 64 { + case ed25519.PrivateKey: + if len(key) != 64 { return false } default: diff --git a/vendor/gopkg.in/square/go-jose.v2/jws.go b/vendor/gopkg.in/square/go-jose.v2/jws.go index 5e23a91b..8b59b6ab 100644 --- a/vendor/gopkg.in/square/go-jose.v2/jws.go +++ b/vendor/gopkg.in/square/go-jose.v2/jws.go @@ -52,9 +52,20 @@ type JSONWebSignature struct { // Signature represents a single signature over the JWS payload and protected header. type Signature struct { - // Header fields, such as the signature algorithm + // Merged header fields. Contains both protected and unprotected header + // values. Prefer using Protected and Unprotected fields instead of this. + // Values in this header may or may not have been signed and in general + // should not be trusted. Header Header + // Protected header. Values in this header were signed and + // will be verified as part of the signature verification process. + Protected Header + + // Unprotected header. Values in this header were not signed + // and in general should not be trusted. + Unprotected Header + // The actual signature value Signature []byte @@ -82,7 +93,7 @@ func (sig Signature) mergedHeaders() rawHeader { } // Compute data to be signed -func (obj JSONWebSignature) computeAuthData(signature *Signature) []byte { +func (obj JSONWebSignature) computeAuthData(payload []byte, signature *Signature) []byte { var serializedProtected string if signature.original != nil && signature.original.Protected != nil { @@ -95,7 +106,7 @@ func (obj JSONWebSignature) computeAuthData(signature *Signature) []byte { return []byte(fmt.Sprintf("%s.%s", serializedProtected, - base64.RawURLEncoding.EncodeToString(obj.payload))) + base64.RawURLEncoding.EncodeToString(payload))) } // parseSignedFull parses a message in full format. @@ -159,6 +170,20 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) { return nil, err } + if signature.header != nil { + signature.Unprotected, err = signature.header.sanitized() + if err != nil { + return nil, err + } + } + + if signature.protected != nil { + signature.Protected, err = signature.protected.sanitized() + if err != nil { + return nil, err + } + } + // As per RFC 7515 Section 4.1.3, only public keys are allowed to be embedded. jwk := signature.Header.JSONWebKey if jwk != nil && (!jwk.Valid() || !jwk.IsPublic()) { @@ -188,6 +213,20 @@ func (parsed *rawJSONWebSignature) sanitized() (*JSONWebSignature, error) { return nil, err } + if obj.Signatures[i].header != nil { + obj.Signatures[i].Unprotected, err = obj.Signatures[i].header.sanitized() + if err != nil { + return nil, err + } + } + + if obj.Signatures[i].protected != nil { + obj.Signatures[i].Protected, err = obj.Signatures[i].protected.sanitized() + if err != nil { + return nil, err + } + } + obj.Signatures[i].Signature = sig.Signature.bytes() // As per RFC 7515 Section 4.1.3, only public keys are allowed to be embedded. diff --git a/vendor/gopkg.in/square/go-jose.v2/opaque.go b/vendor/gopkg.in/square/go-jose.v2/opaque.go new file mode 100644 index 00000000..4a8bd8f3 --- /dev/null +++ b/vendor/gopkg.in/square/go-jose.v2/opaque.go @@ -0,0 +1,83 @@ +/*- + * Copyright 2018 Square Inc. + * + * 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 jose + +// OpaqueSigner is an interface that supports signing payloads with opaque +// private key(s). Private key operations preformed by implementors may, for +// example, occur in a hardware module. An OpaqueSigner may rotate signing keys +// transparently to the user of this interface. +type OpaqueSigner interface { + // Public returns the public key of the current signing key. + Public() *JSONWebKey + // Algs returns a list of supported signing algorithms. + Algs() []SignatureAlgorithm + // SignPayload signs a payload with the current signing key using the given + // algorithm. + SignPayload(payload []byte, alg SignatureAlgorithm) ([]byte, error) +} + +type opaqueSigner struct { + signer OpaqueSigner +} + +func newOpaqueSigner(alg SignatureAlgorithm, signer OpaqueSigner) (recipientSigInfo, error) { + var algSupported bool + for _, salg := range signer.Algs() { + if alg == salg { + algSupported = true + break + } + } + if !algSupported { + return recipientSigInfo{}, ErrUnsupportedAlgorithm + } + + return recipientSigInfo{ + sigAlg: alg, + publicKey: signer.Public, + signer: &opaqueSigner{ + signer: signer, + }, + }, nil +} + +func (o *opaqueSigner) signPayload(payload []byte, alg SignatureAlgorithm) (Signature, error) { + out, err := o.signer.SignPayload(payload, alg) + if err != nil { + return Signature{}, err + } + + return Signature{ + Signature: out, + protected: &rawHeader{}, + }, nil +} + +// OpaqueVerifier is an interface that supports verifying payloads with opaque +// public key(s). An OpaqueSigner may rotate signing keys transparently to the +// user of this interface. +type OpaqueVerifier interface { + VerifyPayload(payload []byte, signature []byte, alg SignatureAlgorithm) error +} + +type opaqueVerifier struct { + verifier OpaqueVerifier +} + +func (o *opaqueVerifier) verifyPayload(payload []byte, signature []byte, alg SignatureAlgorithm) error { + return o.verifier.VerifyPayload(payload, signature, alg) +} diff --git a/vendor/gopkg.in/square/go-jose.v2/shared.go b/vendor/gopkg.in/square/go-jose.v2/shared.go index 4c19dc38..e6ab91da 100644 --- a/vendor/gopkg.in/square/go-jose.v2/shared.go +++ b/vendor/gopkg.in/square/go-jose.v2/shared.go @@ -18,6 +18,8 @@ package jose import ( "crypto/elliptic" + "crypto/x509" + "encoding/base64" "errors" "fmt" @@ -141,6 +143,7 @@ const ( headerEPK = "epk" // *JSONWebKey headerIV = "iv" // *byteBuffer headerTag = "tag" // *byteBuffer + headerX5c = "x5c" // []*x509.Certificate headerJWK = "jwk" // *JSONWebKey headerKeyID = "kid" // string @@ -162,11 +165,34 @@ type Header struct { Algorithm string Nonce string - // Any headers not recognised above get unmarshaled from JSON in a generic - // manner and placed in this map. + // Unverified certificate chain parsed from x5c header. + certificates []*x509.Certificate + + // Any headers not recognised above get unmarshaled + // from JSON in a generic manner and placed in this map. ExtraHeaders map[HeaderKey]interface{} } +// Certificates verifies & returns the certificate chain present +// in the x5c header field of a message, if one was present. Returns +// an error if there was no x5c header present or the chain could +// not be validated with the given verify options. +func (h Header) Certificates(opts x509.VerifyOptions) ([][]*x509.Certificate, error) { + if len(h.certificates) == 0 { + return nil, errors.New("square/go-jose: no x5c header present in message") + } + + leaf := h.certificates[0] + if opts.Intermediates == nil { + opts.Intermediates = x509.NewCertPool() + for _, intermediate := range h.certificates[1:] { + opts.Intermediates.AddCert(intermediate) + } + } + + return leaf.Verify(opts) +} + func (parsed rawHeader) set(k HeaderKey, v interface{}) error { b, err := json.Marshal(v) if err != nil { @@ -333,6 +359,18 @@ func (parsed rawHeader) sanitized() (h Header, err error) { return } h.Nonce = s + case headerX5c: + c := []string{} + err = json.Unmarshal(*v, &c) + if err != nil { + err = fmt.Errorf("failed to unmarshal x5c header: %v: %#v", err, string(*v)) + return + } + h.certificates, err = parseCertificateChain(c) + if err != nil { + err = fmt.Errorf("failed to unmarshal x5c header: %v: %#v", err, string(*v)) + return + } default: if h.ExtraHeaders == nil { h.ExtraHeaders = map[HeaderKey]interface{}{} @@ -349,6 +387,21 @@ func (parsed rawHeader) sanitized() (h Header, err error) { return } +func parseCertificateChain(chain []string) ([]*x509.Certificate, error) { + out := make([]*x509.Certificate, len(chain)) + for i, cert := range chain { + raw, err := base64.StdEncoding.DecodeString(cert) + if err != nil { + return nil, err + } + out[i], err = x509.ParseCertificate(raw) + if err != nil { + return nil, err + } + } + return out, nil +} + func (dst rawHeader) isSet(k HeaderKey) bool { dvr := dst[k] if dvr == nil { diff --git a/vendor/gopkg.in/square/go-jose.v2/signing.go b/vendor/gopkg.in/square/go-jose.v2/signing.go index 13e956d6..1acc6356 100644 --- a/vendor/gopkg.in/square/go-jose.v2/signing.go +++ b/vendor/gopkg.in/square/go-jose.v2/signing.go @@ -94,10 +94,16 @@ type genericSigner struct { type recipientSigInfo struct { sigAlg SignatureAlgorithm - publicKey *JSONWebKey + publicKey func() *JSONWebKey signer payloadSigner } +func staticPublicKey(jwk *JSONWebKey) func() *JSONWebKey { + return func() *JSONWebKey { + return jwk + } +} + // NewSigner creates an appropriate signer based on the key type func NewSigner(sig SigningKey, opts *SignerOptions) (Signer, error) { return NewMultiSigner([]SigningKey{sig}, opts) @@ -146,9 +152,11 @@ func newVerifier(verificationKey interface{}) (payloadVerifier, error) { return newVerifier(verificationKey.Key) case *JSONWebKey: return newVerifier(verificationKey.Key) - default: - return nil, ErrUnsupportedKeyType } + if ov, ok := verificationKey.(OpaqueVerifier); ok { + return &opaqueVerifier{verifier: ov}, nil + } + return nil, ErrUnsupportedKeyType } func (ctx *genericSigner) addRecipient(alg SignatureAlgorithm, signingKey interface{}) error { @@ -175,9 +183,11 @@ func makeJWSRecipient(alg SignatureAlgorithm, signingKey interface{}) (recipient return newJWKSigner(alg, signingKey) case *JSONWebKey: return newJWKSigner(alg, *signingKey) - default: - return recipientSigInfo{}, ErrUnsupportedKeyType } + if signer, ok := signingKey.(OpaqueSigner); ok { + return newOpaqueSigner(alg, signer) + } + return recipientSigInfo{}, ErrUnsupportedKeyType } func newJWKSigner(alg SignatureAlgorithm, signingKey JSONWebKey) (recipientSigInfo, error) { @@ -185,16 +195,16 @@ func newJWKSigner(alg SignatureAlgorithm, signingKey JSONWebKey) (recipientSigIn if err != nil { return recipientSigInfo{}, err } - if recipient.publicKey != nil { + if recipient.publicKey != nil && recipient.publicKey() != nil { // recipient.publicKey is a JWK synthesized for embedding when recipientSigInfo // was created for the inner key (such as a RSA or ECDSA public key). It contains // the pub key for embedding, but doesn't have extra params like key id. publicKey := signingKey - publicKey.Key = recipient.publicKey.Key - recipient.publicKey = &publicKey + publicKey.Key = recipient.publicKey().Key + recipient.publicKey = staticPublicKey(&publicKey) // This should be impossible, but let's check anyway. - if !recipient.publicKey.IsPublic() { + if !recipient.publicKey().IsPublic() { return recipientSigInfo{}, errors.New("square/go-jose: public key was unexpectedly not public") } } @@ -211,7 +221,7 @@ func (ctx *genericSigner) Sign(payload []byte) (*JSONWebSignature, error) { headerAlgorithm: string(recipient.sigAlg), } - if recipient.publicKey != nil { + if recipient.publicKey != nil && recipient.publicKey() != nil { // We want to embed the JWK or set the kid header, but not both. Having a protected // header that contains an embedded JWK while also simultaneously containing the kid // header is confusing, and at least in ACME the two are considered to be mutually @@ -221,9 +231,9 @@ func (ctx *genericSigner) Sign(payload []byte) (*JSONWebSignature, error) { // // See https://github.com/square/go-jose/issues/157 for more context. if ctx.embedJWK { - protected[headerJWK] = recipient.publicKey + protected[headerJWK] = recipient.publicKey() } else { - protected[headerKeyID] = recipient.publicKey.KeyID + protected[headerKeyID] = recipient.publicKey().KeyID } } @@ -280,34 +290,46 @@ func (ctx *genericSigner) Options() SignerOptions { // payload header. You cannot assume that the key received in a payload is // trusted. func (obj JSONWebSignature) Verify(verificationKey interface{}) ([]byte, error) { - verifier, err := newVerifier(verificationKey) + err := obj.DetachedVerify(obj.payload, verificationKey) if err != nil { return nil, err } + return obj.payload, nil +} + +// DetachedVerify validates a detached signature on the given payload. In +// most cases, you will probably want to use Verify instead. DetachedVerify +// is only useful if you have a payload and signature that are separated from +// each other. +func (obj JSONWebSignature) DetachedVerify(payload []byte, verificationKey interface{}) error { + verifier, err := newVerifier(verificationKey) + if err != nil { + return err + } if len(obj.Signatures) > 1 { - return nil, errors.New("square/go-jose: too many signatures in payload; expecting only one") + return errors.New("square/go-jose: too many signatures in payload; expecting only one") } signature := obj.Signatures[0] headers := signature.mergedHeaders() critical, err := headers.getCritical() if err != nil { - return nil, err + return err } if len(critical) > 0 { // Unsupported crit header - return nil, ErrCryptoFailure + return ErrCryptoFailure } - input := obj.computeAuthData(&signature) + input := obj.computeAuthData(payload, &signature) alg := headers.getSignatureAlgorithm() err = verifier.verifyPayload(input, signature.Signature, alg) if err == nil { - return obj.payload, nil + return nil } - return nil, ErrCryptoFailure + return ErrCryptoFailure } // VerifyMulti validates (one of the multiple) signatures on the object and @@ -315,10 +337,27 @@ func (obj JSONWebSignature) Verify(verificationKey interface{}) ([]byte, error) // object and the payload. We return the signature and index to guarantee that // callers are getting the verified value. func (obj JSONWebSignature) VerifyMulti(verificationKey interface{}) (int, Signature, []byte, error) { - verifier, err := newVerifier(verificationKey) + idx, sig, err := obj.DetachedVerifyMulti(obj.payload, verificationKey) if err != nil { return -1, Signature{}, nil, err } + return idx, sig, obj.payload, nil +} + +// DetachedVerifyMulti validates a detached signature on the given payload with +// a signature/object that has potentially multiple signers. This returns the index +// of the signature that was verified, along with the signature object. We return +// the signature and index to guarantee that callers are getting the verified value. +// +// In most cases, you will probably want to use Verify or VerifyMulti instead. +// DetachedVerifyMulti is only useful if you have a payload and signature that are +// separated from each other, and the signature can have multiple signers at the +// same time. +func (obj JSONWebSignature) DetachedVerifyMulti(payload []byte, verificationKey interface{}) (int, Signature, error) { + verifier, err := newVerifier(verificationKey) + if err != nil { + return -1, Signature{}, err + } for i, signature := range obj.Signatures { headers := signature.mergedHeaders() @@ -331,13 +370,13 @@ func (obj JSONWebSignature) VerifyMulti(verificationKey interface{}) (int, Signa continue } - input := obj.computeAuthData(&signature) + input := obj.computeAuthData(payload, &signature) alg := headers.getSignatureAlgorithm() err = verifier.verifyPayload(input, signature.Signature, alg) if err == nil { - return i, signature, obj.payload, nil + return i, signature, nil } } - return -1, Signature{}, nil, ErrCryptoFailure + return -1, Signature{}, ErrCryptoFailure } diff --git a/vendor/k8s.io/api/BUILD b/vendor/k8s.io/api/BUILD new file mode 100644 index 00000000..482955e4 --- /dev/null +++ b/vendor/k8s.io/api/BUILD @@ -0,0 +1,96 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "go_default_test", + srcs = ["roundtrip_test.go"], + deps = [ + "//staging/src/k8s.io/api/admission/v1beta1:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/api/authentication/v1:go_default_library", + "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", + "//staging/src/k8s.io/api/authorization/v1:go_default_library", + "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/api/imagepolicy/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/networking/v1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/api/admission/v1beta1:all-srcs", + "//staging/src/k8s.io/api/admissionregistration/v1alpha1:all-srcs", + "//staging/src/k8s.io/api/admissionregistration/v1beta1:all-srcs", + "//staging/src/k8s.io/api/apps/v1:all-srcs", + "//staging/src/k8s.io/api/apps/v1beta1:all-srcs", + "//staging/src/k8s.io/api/apps/v1beta2:all-srcs", + "//staging/src/k8s.io/api/authentication/v1:all-srcs", + "//staging/src/k8s.io/api/authentication/v1beta1:all-srcs", + "//staging/src/k8s.io/api/authorization/v1:all-srcs", + "//staging/src/k8s.io/api/authorization/v1beta1:all-srcs", + "//staging/src/k8s.io/api/autoscaling/v1:all-srcs", + "//staging/src/k8s.io/api/autoscaling/v2beta1:all-srcs", + "//staging/src/k8s.io/api/autoscaling/v2beta2:all-srcs", + "//staging/src/k8s.io/api/batch/v1:all-srcs", + "//staging/src/k8s.io/api/batch/v1beta1:all-srcs", + "//staging/src/k8s.io/api/batch/v2alpha1:all-srcs", + "//staging/src/k8s.io/api/certificates/v1beta1:all-srcs", + "//staging/src/k8s.io/api/coordination/v1beta1:all-srcs", + "//staging/src/k8s.io/api/core/v1:all-srcs", + "//staging/src/k8s.io/api/events/v1beta1:all-srcs", + "//staging/src/k8s.io/api/extensions/v1beta1:all-srcs", + "//staging/src/k8s.io/api/imagepolicy/v1alpha1:all-srcs", + "//staging/src/k8s.io/api/networking/v1:all-srcs", + "//staging/src/k8s.io/api/policy/v1beta1:all-srcs", + "//staging/src/k8s.io/api/rbac/v1:all-srcs", + "//staging/src/k8s.io/api/rbac/v1alpha1:all-srcs", + "//staging/src/k8s.io/api/rbac/v1beta1:all-srcs", + "//staging/src/k8s.io/api/scheduling/v1alpha1:all-srcs", + "//staging/src/k8s.io/api/scheduling/v1beta1:all-srcs", + "//staging/src/k8s.io/api/settings/v1alpha1:all-srcs", + "//staging/src/k8s.io/api/storage/v1:all-srcs", + "//staging/src/k8s.io/api/storage/v1alpha1:all-srcs", + "//staging/src/k8s.io/api/storage/v1beta1:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/api/CONTRIBUTING.md b/vendor/k8s.io/api/CONTRIBUTING.md new file mode 100644 index 00000000..094efca3 --- /dev/null +++ b/vendor/k8s.io/api/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing guidelines + +Do not open pull requests directly against this repository, they will be ignored. Instead, please open pull requests against [kubernetes/kubernetes](https://git.k8s.io/kubernetes/). Please follow the same [contributing guide](https://git.k8s.io/kubernetes/CONTRIBUTING.md) you would follow for any other pull request made to kubernetes/kubernetes. + +This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/api](https://git.k8s.io/kubernetes/staging/src/k8s.io/api) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot). + +Please see [Staging Directory and Publishing](https://git.k8s.io/community/contributors/devel/staging.md) for more information diff --git a/vendor/k8s.io/api/OWNERS b/vendor/k8s.io/api/OWNERS new file mode 100644 index 00000000..e79d5f1d --- /dev/null +++ b/vendor/k8s.io/api/OWNERS @@ -0,0 +1,52 @@ +approvers: +- erictune +- lavalamp +- smarterclayton +- thockin +- liggitt +# - bgrant0607 # manual escalations only +reviewers: +- brendandburns +- caesarxuchao +- davidopp +- dchen1107 +- deads2k +- derekwaynecarr +- dims +- eparis +- erictune +- errordeveloper +- feiskyer +- gmarek +- janetkuo +- jbeda +- jsafrane +- jszczepkowski +- justinsb +- krousey +- lavalamp +- liggitt +- luxas +- madhusudancs +- mikedanese +- mwielgus +- ncdc +- nikhiljindal +- piosz +- pmorie +- pwittrock +- roberthbailey +- rootfs +- saad-ali +- smarterclayton +- soltysh +- sttts +- tallclair +- thockin +- vishh +- wojtek-t +- yifan-gu +- yujuhong +- zmerlynn +labels: +- sig/architecture diff --git a/vendor/k8s.io/api/README.md b/vendor/k8s.io/api/README.md new file mode 100644 index 00000000..967543a4 --- /dev/null +++ b/vendor/k8s.io/api/README.md @@ -0,0 +1 @@ +This repo is still in the experimental stage. Shortly it will contain the schema of the API that are served by the Kubernetes apiserver. diff --git a/vendor/k8s.io/api/SECURITY_CONTACTS b/vendor/k8s.io/api/SECURITY_CONTACTS new file mode 100644 index 00000000..0648a8eb --- /dev/null +++ b/vendor/k8s.io/api/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD index 417eab39..a16633e1 100644 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD +++ b/vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD @@ -15,12 +15,13 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/admissionregistration/v1alpha1", importpath = "k8s.io/api/admissionregistration/v1alpha1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -36,9 +37,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go index 542d8268..b87f74e5 100644 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go @@ -989,40 +989,39 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 545 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x51, 0x4d, 0x8b, 0x13, 0x3f, - 0x18, 0x6f, 0xfe, 0xdb, 0x42, 0x9b, 0x76, 0xf9, 0xcb, 0xe0, 0xa1, 0x14, 0x99, 0x96, 0x9e, 0x2a, - 0x62, 0x62, 0x57, 0x59, 0xbc, 0xee, 0xec, 0x41, 0x0a, 0xbe, 0x2c, 0x41, 0x3c, 0x88, 0x07, 0xd3, - 0xf6, 0xd9, 0x69, 0x6c, 0x27, 0x19, 0x92, 0x4c, 0x41, 0x4f, 0x5e, 0xbc, 0x0b, 0x7e, 0xa9, 0x1e, - 0xf7, 0xb8, 0xa7, 0x62, 0x47, 0xf0, 0xe8, 0x67, 0x90, 0x99, 0xe9, 0xec, 0xcc, 0x5a, 0x8b, 0xab, - 0xb7, 0x3c, 0xbf, 0x27, 0xbf, 0xb7, 0x04, 0xb3, 0xf9, 0x63, 0x43, 0x84, 0xa2, 0xf3, 0x68, 0x0c, - 0x5a, 0x82, 0x05, 0x43, 0x97, 0x20, 0xa7, 0x4a, 0xd3, 0xed, 0x82, 0x87, 0x82, 0xf2, 0x69, 0x20, - 0x8c, 0x11, 0x4a, 0x6a, 0xf0, 0x85, 0xb1, 0x9a, 0x5b, 0xa1, 0x24, 0x5d, 0x0e, 0xf9, 0x22, 0x9c, - 0xf1, 0x21, 0xf5, 0x41, 0x82, 0xe6, 0x16, 0xa6, 0x24, 0xd4, 0xca, 0x2a, 0xe7, 0x6e, 0x46, 0x25, - 0x3c, 0x14, 0xe4, 0xb7, 0x54, 0x92, 0x53, 0x3b, 0xf7, 0x7d, 0x61, 0x67, 0xd1, 0x98, 0x4c, 0x54, - 0x40, 0x7d, 0xe5, 0x2b, 0x9a, 0x2a, 0x8c, 0xa3, 0xf3, 0x74, 0x4a, 0x87, 0xf4, 0x94, 0x29, 0x77, - 0x1e, 0x15, 0xa1, 0x02, 0x3e, 0x99, 0x09, 0x09, 0xfa, 0x3d, 0x0d, 0xe7, 0x7e, 0x02, 0x18, 0x1a, - 0x80, 0xe5, 0x74, 0xb9, 0x93, 0xa7, 0x43, 0xf7, 0xb1, 0x74, 0x24, 0xad, 0x08, 0x60, 0x87, 0x70, - 0xfc, 0x27, 0x82, 0x99, 0xcc, 0x20, 0xe0, 0x3b, 0xbc, 0x87, 0xfb, 0x78, 0x91, 0x15, 0x0b, 0x2a, - 0xa4, 0x35, 0x56, 0xff, 0x4a, 0xea, 0x7f, 0x42, 0xb8, 0x39, 0x92, 0xc2, 0x0a, 0xbe, 0x10, 0x1f, - 0x40, 0x3b, 0x3d, 0x5c, 0x95, 0x3c, 0x80, 0x36, 0xea, 0xa1, 0x41, 0xc3, 0x6b, 0xad, 0xd6, 0xdd, - 0x4a, 0xbc, 0xee, 0x56, 0x9f, 0xf3, 0x00, 0x58, 0xba, 0x71, 0x5e, 0xe2, 0x9a, 0x8e, 0x16, 0x60, - 0xda, 0xff, 0xf5, 0x0e, 0x06, 0xcd, 0x23, 0x4a, 0x6e, 0xfc, 0xde, 0x84, 0x45, 0x0b, 0xf0, 0x0e, - 0xb7, 0x9a, 0xb5, 0x64, 0x32, 0x2c, 0x13, 0xeb, 0xff, 0x40, 0xb8, 0x5d, 0xca, 0x71, 0xaa, 0xe4, - 0xb9, 0xf0, 0xa3, 0x4c, 0xc0, 0x79, 0x8b, 0xeb, 0xc9, 0xeb, 0x4e, 0xb9, 0xe5, 0x69, 0xb0, 0xe6, - 0xd1, 0x83, 0x92, 0xeb, 0x55, 0x59, 0x12, 0xce, 0xfd, 0x04, 0x30, 0x24, 0xb9, 0x4d, 0x96, 0x43, - 0xf2, 0x62, 0xfc, 0x0e, 0x26, 0xf6, 0x19, 0x58, 0xee, 0x39, 0x5b, 0x5b, 0x5c, 0x60, 0xec, 0x4a, - 0xd5, 0x09, 0x71, 0x4b, 0x14, 0xee, 0x79, 0xb7, 0xe3, 0xbf, 0xe8, 0x56, 0x0a, 0xef, 0xdd, 0xde, - 0x7a, 0xb5, 0x4a, 0xa0, 0x61, 0xd7, 0x1c, 0xfa, 0xdf, 0x11, 0xbe, 0xb3, 0xaf, 0xf0, 0x53, 0x61, - 0xac, 0xf3, 0x66, 0xa7, 0x34, 0xb9, 0x59, 0xe9, 0x84, 0x9d, 0x56, 0xbe, 0xb5, 0x8d, 0x51, 0xcf, - 0x91, 0x52, 0xe1, 0x19, 0xae, 0x09, 0x0b, 0x41, 0xde, 0xf4, 0xf4, 0xdf, 0x9a, 0x5e, 0x4b, 0x5d, - 0xfc, 0xec, 0x28, 0x51, 0x66, 0x99, 0x41, 0xff, 0x0b, 0xc2, 0xd5, 0xe4, 0xab, 0x9d, 0x7b, 0xb8, - 0xc1, 0x43, 0xf1, 0x44, 0xab, 0x28, 0x34, 0x6d, 0xd4, 0x3b, 0x18, 0x34, 0xbc, 0xc3, 0x78, 0xdd, - 0x6d, 0x9c, 0x9c, 0x8d, 0x32, 0x90, 0x15, 0x7b, 0x67, 0x88, 0x9b, 0x3c, 0x14, 0xaf, 0x40, 0x27, - 0x39, 0xb2, 0x94, 0x0d, 0xef, 0xff, 0x78, 0xdd, 0x6d, 0x9e, 0x9c, 0x8d, 0x72, 0x98, 0x95, 0xef, - 0x24, 0xfa, 0x1a, 0x8c, 0x8a, 0xf4, 0x04, 0x4c, 0xfb, 0xa0, 0xd0, 0x67, 0x39, 0xc8, 0x8a, 0xbd, - 0x47, 0x56, 0x1b, 0xb7, 0x72, 0xb1, 0x71, 0x2b, 0x97, 0x1b, 0xb7, 0xf2, 0x31, 0x76, 0xd1, 0x2a, - 0x76, 0xd1, 0x45, 0xec, 0xa2, 0xcb, 0xd8, 0x45, 0x5f, 0x63, 0x17, 0x7d, 0xfe, 0xe6, 0x56, 0x5e, - 0xd7, 0xf3, 0xd2, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x1d, 0xfb, 0x23, 0x89, 0xaa, 0x04, 0x00, - 0x00, + // 531 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x51, 0x4d, 0x8b, 0x13, 0x31, + 0x18, 0x6e, 0x6c, 0x0b, 0x6d, 0xda, 0x45, 0x19, 0x3c, 0x94, 0x22, 0xd3, 0xd2, 0x53, 0x45, 0x4c, + 0xec, 0x22, 0x8b, 0xd7, 0x9d, 0x3d, 0x48, 0xc1, 0x8f, 0x25, 0x88, 0x07, 0xf1, 0x60, 0xda, 0xbe, + 0x3b, 0x8d, 0xed, 0x4c, 0x86, 0x24, 0x53, 0xd0, 0x93, 0x17, 0xef, 0x82, 0x7f, 0xaa, 0xc7, 0x3d, + 0xee, 0xa9, 0xd8, 0x11, 0x3c, 0xfa, 0x1b, 0x24, 0x33, 0x9d, 0x9d, 0x59, 0xeb, 0xe2, 0xea, 0x2d, + 0xef, 0xf3, 0xe6, 0xf9, 0x4a, 0x30, 0x5b, 0x3c, 0xd1, 0x44, 0x48, 0xba, 0x88, 0x27, 0xa0, 0x42, + 0x30, 0xa0, 0xe9, 0x0a, 0xc2, 0x99, 0x54, 0x74, 0xb7, 0xe0, 0x91, 0xa0, 0x7c, 0x16, 0x08, 0xad, + 0x85, 0x0c, 0x15, 0xf8, 0x42, 0x1b, 0xc5, 0x8d, 0x90, 0x21, 0x5d, 0x8d, 0xf8, 0x32, 0x9a, 0xf3, + 0x11, 0xf5, 0x21, 0x04, 0xc5, 0x0d, 0xcc, 0x48, 0xa4, 0xa4, 0x91, 0xce, 0xfd, 0x8c, 0x4a, 0x78, + 0x24, 0xc8, 0x1f, 0xa9, 0x24, 0xa7, 0x76, 0x1f, 0xfa, 0xc2, 0xcc, 0xe3, 0x09, 0x99, 0xca, 0x80, + 0xfa, 0xd2, 0x97, 0x34, 0x55, 0x98, 0xc4, 0x67, 0xe9, 0x94, 0x0e, 0xe9, 0x29, 0x53, 0xee, 0x3e, + 0x2e, 0x42, 0x05, 0x7c, 0x3a, 0x17, 0x21, 0xa8, 0x0f, 0x34, 0x5a, 0xf8, 0x16, 0xd0, 0x34, 0x00, + 0xc3, 0xe9, 0x6a, 0x2f, 0x4f, 0x97, 0x5e, 0xc7, 0x52, 0x71, 0x68, 0x44, 0x00, 0x7b, 0x84, 0xa3, + 0xbf, 0x11, 0xf4, 0x74, 0x0e, 0x01, 0xff, 0x9d, 0x37, 0xf8, 0x8c, 0x70, 0x6b, 0x1c, 0x0a, 0x23, + 0xf8, 0x52, 0x7c, 0x04, 0xe5, 0xf4, 0x71, 0x2d, 0xe4, 0x01, 0x74, 0x50, 0x1f, 0x0d, 0x9b, 0x5e, + 0x7b, 0xbd, 0xe9, 0x55, 0x92, 0x4d, 0xaf, 0xf6, 0x82, 0x07, 0xc0, 0xd2, 0x8d, 0xf3, 0x0a, 0xd7, + 0x55, 0xbc, 0x04, 0xdd, 0xb9, 0xd5, 0xaf, 0x0e, 0x5b, 0x87, 0x94, 0xdc, 0xf8, 0xe9, 0x08, 0x8b, + 0x97, 0xe0, 0x1d, 0xec, 0x34, 0xeb, 0x76, 0xd2, 0x2c, 0x13, 0x1b, 0xfc, 0x44, 0xb8, 0x53, 0xca, + 0x71, 0x22, 0xc3, 0x33, 0xe1, 0xc7, 0x99, 0x80, 0xf3, 0x0e, 0x37, 0xec, 0x43, 0xcd, 0xb8, 0xe1, + 0x69, 0xb0, 0xd6, 0xe1, 0xa3, 0x92, 0xeb, 0x65, 0x5f, 0x12, 0x2d, 0x7c, 0x0b, 0x68, 0x62, 0x6f, + 0x93, 0xd5, 0x88, 0xbc, 0x9c, 0xbc, 0x87, 0xa9, 0x79, 0x0e, 0x86, 0x7b, 0xce, 0xce, 0x16, 0x17, + 0x18, 0xbb, 0x54, 0x75, 0x22, 0xdc, 0x16, 0x85, 0x7b, 0xde, 0xed, 0xe8, 0x1f, 0xba, 0x95, 0xc2, + 0x7b, 0x77, 0x77, 0x5e, 0xed, 0x12, 0xa8, 0xd9, 0x15, 0x87, 0xc1, 0x0f, 0x84, 0xef, 0x5d, 0x57, + 0xf8, 0x99, 0xd0, 0xc6, 0x79, 0xbb, 0x57, 0x9a, 0xdc, 0xac, 0xb4, 0x65, 0xa7, 0x95, 0xef, 0xec, + 0x62, 0x34, 0x72, 0xa4, 0x54, 0x78, 0x8e, 0xeb, 0xc2, 0x40, 0x90, 0x37, 0x3d, 0xf9, 0xbf, 0xa6, + 0x57, 0x52, 0x17, 0x3f, 0x3b, 0xb6, 0xca, 0x2c, 0x33, 0x18, 0x7c, 0x45, 0xb8, 0x66, 0xbf, 0xda, + 0x79, 0x80, 0x9b, 0x3c, 0x12, 0x4f, 0x95, 0x8c, 0x23, 0xdd, 0x41, 0xfd, 0xea, 0xb0, 0xe9, 0x1d, + 0x24, 0x9b, 0x5e, 0xf3, 0xf8, 0x74, 0x9c, 0x81, 0xac, 0xd8, 0x3b, 0x23, 0xdc, 0xe2, 0x91, 0x78, + 0x0d, 0xca, 0xe6, 0xc8, 0x52, 0x36, 0xbd, 0xdb, 0xc9, 0xa6, 0xd7, 0x3a, 0x3e, 0x1d, 0xe7, 0x30, + 0x2b, 0xdf, 0xb1, 0xfa, 0x0a, 0xb4, 0x8c, 0xd5, 0x14, 0x74, 0xa7, 0x5a, 0xe8, 0xb3, 0x1c, 0x64, + 0xc5, 0xde, 0x23, 0xeb, 0xad, 0x5b, 0x39, 0xdf, 0xba, 0x95, 0x8b, 0xad, 0x5b, 0xf9, 0x94, 0xb8, + 0x68, 0x9d, 0xb8, 0xe8, 0x3c, 0x71, 0xd1, 0x45, 0xe2, 0xa2, 0x6f, 0x89, 0x8b, 0xbe, 0x7c, 0x77, + 0x2b, 0x6f, 0x1a, 0x79, 0xe9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa2, 0x06, 0xa3, 0xcb, 0x75, + 0x04, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto index 4f0e400e..e17b5596 100644 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.admissionregistration.v1alpha1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD index dbcfadd2..862c814f 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD @@ -15,12 +15,13 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/admissionregistration/v1beta1", importpath = "k8s.io/api/admissionregistration/v1beta1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -36,9 +37,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go index af35e1e2..d6c9d958 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go @@ -457,6 +457,12 @@ func (m *Webhook) MarshalTo(dAtA []byte) (int, error) { } i += n7 } + if m.SideEffects != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.SideEffects))) + i += copy(dAtA[i:], *m.SideEffects) + } return i, nil } @@ -656,6 +662,10 @@ func (m *Webhook) Size() (n int) { l = m.NamespaceSelector.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.SideEffects != nil { + l = len(*m.SideEffects) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -779,6 +789,7 @@ func (this *Webhook) String() string { `Rules:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Rules), "RuleWithOperations", "RuleWithOperations", 1), `&`, ``, 1) + `,`, `FailurePolicy:` + valueToStringGenerated(this.FailurePolicy) + `,`, `NamespaceSelector:` + strings.Replace(fmt.Sprintf("%v", this.NamespaceSelector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `SideEffects:` + valueToStringGenerated(this.SideEffects) + `,`, `}`, }, "") return s @@ -1813,6 +1824,36 @@ func (m *Webhook) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SideEffects", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := SideEffectClass(dAtA[iNdEx:postIndex]) + m.SideEffects = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -2088,63 +2129,62 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 916 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x54, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xf6, 0xd6, 0x8e, 0x6c, 0x8f, 0x6d, 0xd1, 0x0c, 0x20, 0x99, 0xa8, 0xda, 0xb5, 0x7c, 0x40, - 0x96, 0x50, 0x76, 0x71, 0x8a, 0x10, 0x42, 0x20, 0x94, 0x8d, 0x54, 0x88, 0x94, 0xb4, 0x66, 0x02, - 0xad, 0x84, 0x38, 0x30, 0x5e, 0xbf, 0xd8, 0x83, 0xf7, 0x97, 0x66, 0x66, 0xdd, 0xe6, 0x86, 0xc4, - 0x3f, 0x80, 0xc4, 0x1f, 0xc1, 0x5f, 0xc1, 0x3d, 0x37, 0x7a, 0x41, 0xf4, 0xb4, 0x22, 0xcb, 0x99, - 0x03, 0xd7, 0x9e, 0xd0, 0xce, 0xae, 0xbd, 0x76, 0x1c, 0xa7, 0xee, 0x85, 0x03, 0x37, 0xcf, 0xf7, - 0xde, 0xf7, 0xbd, 0xf7, 0x3d, 0xbf, 0xb7, 0xe8, 0xcb, 0xe9, 0x47, 0xc2, 0x64, 0x81, 0x35, 0x8d, - 0x86, 0xc0, 0x7d, 0x90, 0x20, 0xac, 0x19, 0xf8, 0xa3, 0x80, 0x5b, 0x79, 0x80, 0x86, 0xcc, 0xa2, - 0x23, 0x8f, 0x09, 0xc1, 0x02, 0x9f, 0xc3, 0x98, 0x09, 0xc9, 0xa9, 0x64, 0x81, 0x6f, 0xcd, 0xfa, - 0x43, 0x90, 0xb4, 0x6f, 0x8d, 0xc1, 0x07, 0x4e, 0x25, 0x8c, 0xcc, 0x90, 0x07, 0x32, 0xc0, 0xbd, - 0x8c, 0x69, 0xd2, 0x90, 0x99, 0x37, 0x32, 0xcd, 0x9c, 0xb9, 0xb7, 0x3f, 0x66, 0x72, 0x12, 0x0d, - 0x4d, 0x27, 0xf0, 0xac, 0x71, 0x30, 0x0e, 0x2c, 0x25, 0x30, 0x8c, 0xce, 0xd5, 0x4b, 0x3d, 0xd4, - 0xaf, 0x4c, 0x78, 0xaf, 0xbb, 0xd4, 0x92, 0x13, 0x70, 0xb0, 0x66, 0x6b, 0xc5, 0xf7, 0x4e, 0x8b, - 0x1c, 0x78, 0x26, 0xc1, 0x4f, 0x6b, 0x8b, 0x7d, 0x1a, 0x32, 0x01, 0x7c, 0x06, 0xdc, 0x0a, 0xa7, - 0xe3, 0x34, 0x26, 0x56, 0x13, 0x36, 0x79, 0xd9, 0xfb, 0xa0, 0x90, 0xf3, 0xa8, 0x33, 0x61, 0x3e, - 0xf0, 0x8b, 0x42, 0xc3, 0x03, 0x49, 0x6f, 0x6a, 0xc2, 0xda, 0xc4, 0xe2, 0x91, 0x2f, 0x99, 0x07, - 0x6b, 0x84, 0x0f, 0x5f, 0x45, 0x10, 0xce, 0x04, 0x3c, 0xba, 0xc6, 0xbb, 0xbf, 0x89, 0x17, 0x49, - 0xe6, 0x5a, 0xcc, 0x97, 0x42, 0xf2, 0xeb, 0xa4, 0xee, 0xef, 0x1a, 0xba, 0x77, 0x1a, 0x49, 0x2a, - 0x99, 0x3f, 0x7e, 0x02, 0xc3, 0x49, 0x10, 0x4c, 0x8f, 0x02, 0xff, 0x9c, 0x8d, 0xa3, 0xec, 0xef, - 0xc1, 0xdf, 0xa1, 0x5a, 0xea, 0x6c, 0x44, 0x25, 0x6d, 0x6b, 0x1d, 0xad, 0xd7, 0x38, 0x78, 0xdf, - 0x2c, 0xfe, 0xd3, 0x45, 0x21, 0x33, 0x9c, 0x8e, 0x53, 0x40, 0x98, 0x69, 0xb6, 0x39, 0xeb, 0x9b, - 0x8f, 0x86, 0xdf, 0x83, 0x23, 0x4f, 0x41, 0x52, 0x1b, 0x5f, 0xc6, 0x46, 0x29, 0x89, 0x0d, 0x54, - 0x60, 0x64, 0xa1, 0x8a, 0xcf, 0x50, 0x2d, 0xaf, 0x2c, 0xda, 0x77, 0x3a, 0xe5, 0x5e, 0xe3, 0xa0, - 0x6f, 0x6e, 0xbb, 0x35, 0x66, 0xce, 0xb4, 0x2b, 0x69, 0x09, 0x52, 0x7b, 0x9a, 0x0b, 0x75, 0xff, - 0xd6, 0x50, 0xe7, 0x36, 0x5f, 0x27, 0x4c, 0x48, 0xfc, 0xed, 0x9a, 0x37, 0x73, 0x3b, 0x6f, 0x29, - 0x5b, 0x39, 0xbb, 0x9b, 0x3b, 0xab, 0xcd, 0x91, 0x25, 0x5f, 0x53, 0xb4, 0xc3, 0x24, 0x78, 0x73, - 0x53, 0x0f, 0xb6, 0x37, 0x75, 0x5b, 0xe3, 0x76, 0x2b, 0x2f, 0xb9, 0x73, 0x9c, 0x8a, 0x93, 0xac, - 0x46, 0xf7, 0x67, 0x0d, 0x55, 0x48, 0xe4, 0x02, 0x7e, 0x0f, 0xd5, 0x69, 0xc8, 0x3e, 0xe7, 0x41, - 0x14, 0x8a, 0xb6, 0xd6, 0x29, 0xf7, 0xea, 0x76, 0x2b, 0x89, 0x8d, 0xfa, 0xe1, 0xe0, 0x38, 0x03, - 0x49, 0x11, 0xc7, 0x7d, 0xd4, 0xa0, 0x21, 0x7b, 0x0c, 0x5c, 0x2d, 0xbe, 0x6a, 0xb4, 0x6e, 0xbf, - 0x91, 0xc4, 0x46, 0xe3, 0x70, 0x70, 0x3c, 0x87, 0xc9, 0x72, 0x4e, 0xaa, 0xcf, 0x41, 0x04, 0x11, - 0x77, 0x40, 0xb4, 0xcb, 0x85, 0x3e, 0x99, 0x83, 0xa4, 0x88, 0x77, 0x7f, 0xd1, 0x10, 0x4e, 0xbb, - 0x7a, 0xc2, 0xe4, 0xe4, 0x51, 0x08, 0x99, 0x03, 0x81, 0x3f, 0x43, 0x28, 0x58, 0xbc, 0xf2, 0x26, - 0x0d, 0xb5, 0x1f, 0x0b, 0xf4, 0x65, 0x6c, 0xb4, 0x16, 0xaf, 0xaf, 0x2e, 0x42, 0x20, 0x4b, 0x14, - 0x3c, 0x40, 0x15, 0x1e, 0xb9, 0xd0, 0xbe, 0xb3, 0xf6, 0xa7, 0xbd, 0x62, 0xb2, 0x69, 0x33, 0x76, - 0x33, 0x9f, 0xa0, 0x1a, 0x18, 0x51, 0x4a, 0xdd, 0x1f, 0x35, 0x74, 0xf7, 0x0c, 0xf8, 0x8c, 0x39, - 0x40, 0xe0, 0x1c, 0x38, 0xf8, 0x0e, 0x60, 0x0b, 0xd5, 0x7d, 0xea, 0x81, 0x08, 0xa9, 0x03, 0x6a, - 0x41, 0xea, 0xf6, 0x6e, 0xce, 0xad, 0x3f, 0x9c, 0x07, 0x48, 0x91, 0x83, 0x3b, 0xa8, 0x92, 0x3e, - 0x54, 0x5f, 0xf5, 0xa2, 0x4e, 0x9a, 0x4b, 0x54, 0x04, 0xdf, 0x43, 0x95, 0x90, 0xca, 0x49, 0xbb, - 0xac, 0x32, 0x6a, 0x69, 0x74, 0x40, 0xe5, 0x84, 0x28, 0xb4, 0xfb, 0x87, 0x86, 0xf4, 0xc7, 0xd4, - 0x65, 0xa3, 0xff, 0xdd, 0x3d, 0xfe, 0xa3, 0xa1, 0xee, 0xed, 0xce, 0xfe, 0x83, 0x8b, 0xf4, 0x56, - 0x2f, 0xf2, 0x8b, 0xed, 0x6d, 0xdd, 0xde, 0xfa, 0x86, 0x9b, 0xfc, 0xad, 0x8c, 0xaa, 0x79, 0xfa, - 0x62, 0x33, 0xb4, 0x8d, 0x9b, 0xf1, 0x14, 0x35, 0x1d, 0x97, 0x81, 0x2f, 0x33, 0xe9, 0x7c, 0xb7, - 0x3f, 0x7d, 0xed, 0xd1, 0x1f, 0x2d, 0x89, 0xd8, 0x6f, 0xe5, 0x85, 0x9a, 0xcb, 0x28, 0x59, 0x29, - 0x84, 0x29, 0xda, 0x49, 0x4f, 0x20, 0xbb, 0xe6, 0xc6, 0xc1, 0x27, 0xaf, 0x77, 0x4d, 0xab, 0xa7, - 0x5d, 0x4c, 0x22, 0x8d, 0x09, 0x92, 0x29, 0xe3, 0x13, 0xd4, 0x3a, 0xa7, 0xcc, 0x8d, 0x38, 0x0c, - 0x02, 0x97, 0x39, 0x17, 0xed, 0x8a, 0x1a, 0xc3, 0xbb, 0x49, 0x6c, 0xb4, 0x1e, 0x2c, 0x07, 0x5e, - 0xc6, 0xc6, 0xee, 0x0a, 0xa0, 0x4e, 0x7f, 0x95, 0x8c, 0x9f, 0xa1, 0xdd, 0xc5, 0xc9, 0x9d, 0x81, - 0x0b, 0x8e, 0x0c, 0x78, 0x7b, 0x47, 0x8d, 0xeb, 0xfe, 0x96, 0xdb, 0x42, 0x87, 0xe0, 0xce, 0xa9, - 0xf6, 0xdb, 0x49, 0x6c, 0xec, 0x3e, 0xbc, 0xae, 0x48, 0xd6, 0x8b, 0x74, 0x7f, 0xd5, 0xd0, 0x9b, - 0x37, 0x8c, 0x19, 0x53, 0x54, 0x15, 0xd9, 0xc7, 0x23, 0xdf, 0xda, 0x8f, 0xb7, 0x1f, 0xe2, 0xf5, - 0xaf, 0x8e, 0xdd, 0x48, 0x62, 0xa3, 0x3a, 0x47, 0xe7, 0xba, 0xb8, 0x87, 0x6a, 0x0e, 0xb5, 0x23, - 0x7f, 0x94, 0x7f, 0xf6, 0x9a, 0x76, 0x33, 0xdd, 0xf2, 0xa3, 0xc3, 0x0c, 0x23, 0x8b, 0x28, 0x7e, - 0x07, 0x95, 0x23, 0xee, 0xe6, 0x5f, 0x98, 0x6a, 0x12, 0x1b, 0xe5, 0xaf, 0xc9, 0x09, 0x49, 0x31, - 0x7b, 0xff, 0xf2, 0x4a, 0x2f, 0x3d, 0xbf, 0xd2, 0x4b, 0x2f, 0xae, 0xf4, 0xd2, 0x0f, 0x89, 0xae, - 0x5d, 0x26, 0xba, 0xf6, 0x3c, 0xd1, 0xb5, 0x17, 0x89, 0xae, 0xfd, 0x99, 0xe8, 0xda, 0x4f, 0x7f, - 0xe9, 0xa5, 0x6f, 0xaa, 0x79, 0x6b, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x78, 0x57, 0x76, 0x28, - 0x10, 0x0a, 0x00, 0x00, + // 906 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x54, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0x8e, 0x37, 0x29, 0x49, 0x26, 0x89, 0x76, 0x3b, 0x80, 0x14, 0xaa, 0x95, 0x1d, 0xe5, 0x80, + 0x22, 0xa1, 0xb5, 0x49, 0x41, 0x08, 0x21, 0x10, 0xaa, 0x0b, 0x0b, 0x95, 0xba, 0xbb, 0x61, 0x0a, + 0xbb, 0x12, 0xe2, 0xc0, 0xc4, 0x79, 0x49, 0x86, 0xf8, 0x97, 0x66, 0xc6, 0x59, 0x7a, 0x43, 0xe2, + 0x1f, 0x40, 0x42, 0xfc, 0x0d, 0xfc, 0x15, 0xdc, 0x7b, 0xdc, 0x0b, 0x62, 0x4f, 0x16, 0x35, 0x67, + 0x0e, 0x5c, 0x7b, 0x42, 0x63, 0x3b, 0x71, 0xd2, 0x6c, 0xbb, 0xe9, 0x85, 0x03, 0x37, 0xcf, 0xf7, + 0xe6, 0xfb, 0xde, 0xfb, 0x9e, 0xdf, 0x1b, 0xf4, 0xc5, 0xec, 0x7d, 0x61, 0xb2, 0xc0, 0x9a, 0x45, + 0x43, 0xe0, 0x3e, 0x48, 0x10, 0xd6, 0x1c, 0xfc, 0x51, 0xc0, 0xad, 0x3c, 0x40, 0x43, 0x66, 0xd1, + 0x91, 0xc7, 0x84, 0x60, 0x81, 0xcf, 0x61, 0xc2, 0x84, 0xe4, 0x54, 0xb2, 0xc0, 0xb7, 0xe6, 0xfd, + 0x21, 0x48, 0xda, 0xb7, 0x26, 0xe0, 0x03, 0xa7, 0x12, 0x46, 0x66, 0xc8, 0x03, 0x19, 0xe0, 0x5e, + 0xc6, 0x34, 0x69, 0xc8, 0xcc, 0x17, 0x32, 0xcd, 0x9c, 0xb9, 0x77, 0x6f, 0xc2, 0xe4, 0x34, 0x1a, + 0x9a, 0x4e, 0xe0, 0x59, 0x93, 0x60, 0x12, 0x58, 0xa9, 0xc0, 0x30, 0x1a, 0xa7, 0xa7, 0xf4, 0x90, + 0x7e, 0x65, 0xc2, 0x7b, 0xef, 0x16, 0x25, 0x79, 0xd4, 0x99, 0x32, 0x1f, 0xf8, 0xa9, 0x15, 0xce, + 0x26, 0x0a, 0x10, 0x96, 0x07, 0x92, 0x5a, 0xf3, 0x8d, 0x72, 0xf6, 0xac, 0xab, 0x58, 0x3c, 0xf2, + 0x25, 0xf3, 0x60, 0x83, 0xf0, 0xde, 0xcb, 0x08, 0xc2, 0x99, 0x82, 0x47, 0x2f, 0xf3, 0xba, 0xbf, + 0x6b, 0xe8, 0xee, 0x83, 0x48, 0x52, 0xc9, 0xfc, 0xc9, 0x13, 0x18, 0x4e, 0x83, 0x60, 0x76, 0x18, + 0xf8, 0x63, 0x36, 0x89, 0x32, 0xdb, 0xf8, 0x5b, 0x54, 0x53, 0x45, 0x8e, 0xa8, 0xa4, 0x6d, 0xad, + 0xa3, 0xf5, 0x1a, 0xfb, 0x6f, 0x9b, 0x45, 0xaf, 0x96, 0xb9, 0xcc, 0x70, 0x36, 0x51, 0x80, 0x30, + 0xd5, 0x6d, 0x73, 0xde, 0x37, 0x1f, 0x0d, 0xbf, 0x03, 0x47, 0x3e, 0x00, 0x49, 0x6d, 0x7c, 0x16, + 0x1b, 0xa5, 0x24, 0x36, 0x50, 0x81, 0x91, 0xa5, 0x2a, 0x3e, 0x41, 0xb5, 0x3c, 0xb3, 0x68, 0xdf, + 0xea, 0x94, 0x7b, 0x8d, 0xfd, 0xbe, 0xb9, 0xed, 0xdf, 0x30, 0x73, 0xa6, 0x5d, 0x51, 0x29, 0x48, + 0xed, 0x69, 0x2e, 0xd4, 0xfd, 0x5b, 0x43, 0x9d, 0xeb, 0x7c, 0x1d, 0x33, 0x21, 0xf1, 0x37, 0x1b, + 0xde, 0xcc, 0xed, 0xbc, 0x29, 0x76, 0xea, 0xec, 0x4e, 0xee, 0xac, 0xb6, 0x40, 0x56, 0x7c, 0xcd, + 0xd0, 0x0e, 0x93, 0xe0, 0x2d, 0x4c, 0xdd, 0xdf, 0xde, 0xd4, 0x75, 0x85, 0xdb, 0xad, 0x3c, 0xe5, + 0xce, 0x91, 0x12, 0x27, 0x59, 0x8e, 0xee, 0xcf, 0x1a, 0xaa, 0x90, 0xc8, 0x05, 0xfc, 0x16, 0xaa, + 0xd3, 0x90, 0x7d, 0xc6, 0x83, 0x28, 0x14, 0x6d, 0xad, 0x53, 0xee, 0xd5, 0xed, 0x56, 0x12, 0x1b, + 0xf5, 0x83, 0xc1, 0x51, 0x06, 0x92, 0x22, 0x8e, 0xfb, 0xa8, 0x41, 0x43, 0xf6, 0x18, 0xb8, 0x2a, + 0x25, 0x2b, 0xb4, 0x6e, 0xdf, 0x4e, 0x62, 0xa3, 0x71, 0x30, 0x38, 0x5a, 0xc0, 0x64, 0xf5, 0x8e, + 0xd2, 0xe7, 0x20, 0x82, 0x88, 0x3b, 0x20, 0xda, 0xe5, 0x42, 0x9f, 0x2c, 0x40, 0x52, 0xc4, 0xbb, + 0xbf, 0x6a, 0x08, 0xab, 0xaa, 0x9e, 0x30, 0x39, 0x7d, 0x14, 0x42, 0xe6, 0x40, 0xe0, 0x8f, 0x11, + 0x0a, 0x96, 0xa7, 0xbc, 0x48, 0x23, 0x9d, 0x8f, 0x25, 0x7a, 0x11, 0x1b, 0xad, 0xe5, 0xe9, 0xcb, + 0xd3, 0x10, 0xc8, 0x0a, 0x05, 0x0f, 0x50, 0x85, 0x47, 0x2e, 0xb4, 0x6f, 0x6d, 0xfc, 0xb4, 0x97, + 0x74, 0x56, 0x15, 0x63, 0x37, 0xf3, 0x0e, 0xa6, 0x0d, 0x23, 0xa9, 0x52, 0xf7, 0x47, 0x0d, 0xdd, + 0x39, 0x01, 0x3e, 0x67, 0x0e, 0x10, 0x18, 0x03, 0x07, 0xdf, 0x01, 0x6c, 0xa1, 0xba, 0x4f, 0x3d, + 0x10, 0x21, 0x75, 0x20, 0x1d, 0x90, 0xba, 0xbd, 0x9b, 0x73, 0xeb, 0x0f, 0x17, 0x01, 0x52, 0xdc, + 0xc1, 0x1d, 0x54, 0x51, 0x87, 0xb4, 0xae, 0x7a, 0x91, 0x47, 0xdd, 0x25, 0x69, 0x04, 0xdf, 0x45, + 0x95, 0x90, 0xca, 0x69, 0xbb, 0x9c, 0xde, 0xa8, 0xa9, 0xe8, 0x80, 0xca, 0x29, 0x49, 0xd1, 0xee, + 0x1f, 0x1a, 0xd2, 0x1f, 0x53, 0x97, 0x8d, 0xfe, 0x77, 0xfb, 0xf8, 0x8f, 0x86, 0xba, 0xd7, 0x3b, + 0xfb, 0x0f, 0x36, 0xd2, 0x5b, 0xdf, 0xc8, 0xcf, 0xb7, 0xb7, 0x75, 0x7d, 0xe9, 0x57, 0xec, 0xe4, + 0x2f, 0x15, 0x54, 0xcd, 0xaf, 0x2f, 0x27, 0x43, 0xbb, 0x72, 0x32, 0x9e, 0xa2, 0xa6, 0xe3, 0x32, + 0xf0, 0x65, 0x26, 0x9d, 0xcf, 0xf6, 0x47, 0x37, 0x6e, 0xfd, 0xe1, 0x8a, 0x88, 0xfd, 0x5a, 0x9e, + 0xa8, 0xb9, 0x8a, 0x92, 0xb5, 0x44, 0x98, 0xa2, 0x1d, 0xb5, 0x02, 0xd9, 0x36, 0x37, 0xf6, 0x3f, + 0xbc, 0xd9, 0x36, 0xad, 0xaf, 0x76, 0xd1, 0x09, 0x15, 0x13, 0x24, 0x53, 0xc6, 0xc7, 0xa8, 0x35, + 0xa6, 0xcc, 0x8d, 0x38, 0x0c, 0x02, 0x97, 0x39, 0xa7, 0xed, 0x4a, 0xda, 0x86, 0x37, 0x93, 0xd8, + 0x68, 0xdd, 0x5f, 0x0d, 0x5c, 0xc4, 0xc6, 0xee, 0x1a, 0x90, 0xae, 0xfe, 0x3a, 0x19, 0x7f, 0x8f, + 0x76, 0x97, 0x2b, 0x77, 0x02, 0x2e, 0x38, 0x32, 0xe0, 0xed, 0x9d, 0xb4, 0x5d, 0xef, 0x6c, 0x39, + 0x2d, 0x74, 0x08, 0xee, 0x82, 0x6a, 0xbf, 0x9e, 0xc4, 0xc6, 0xee, 0xc3, 0xcb, 0x8a, 0x64, 0x33, + 0x09, 0xfe, 0x04, 0x35, 0x04, 0x1b, 0xc1, 0xa7, 0xe3, 0x31, 0x38, 0x52, 0xb4, 0x5f, 0x49, 0x5d, + 0x74, 0xd5, 0x7b, 0x79, 0x52, 0xc0, 0x17, 0xb1, 0x71, 0xbb, 0x38, 0x1e, 0xba, 0x54, 0x08, 0xb2, + 0x4a, 0xeb, 0xfe, 0xa6, 0xa1, 0x57, 0x5f, 0xf0, 0xb3, 0x30, 0x45, 0x55, 0x91, 0x3d, 0x41, 0xf9, + 0xec, 0x7f, 0xb0, 0xfd, 0xaf, 0xb8, 0xfc, 0x76, 0xd9, 0x8d, 0x24, 0x36, 0xaa, 0x0b, 0x74, 0xa1, + 0x8b, 0x7b, 0xa8, 0xe6, 0x50, 0x3b, 0xf2, 0x47, 0xf9, 0xe3, 0xd9, 0xb4, 0x9b, 0x6a, 0x57, 0x0e, + 0x0f, 0x32, 0x8c, 0x2c, 0xa3, 0xf8, 0x0d, 0x54, 0x8e, 0xb8, 0x9b, 0xbf, 0x53, 0xd5, 0x24, 0x36, + 0xca, 0x5f, 0x91, 0x63, 0xa2, 0x30, 0xfb, 0xde, 0xd9, 0xb9, 0x5e, 0x7a, 0x76, 0xae, 0x97, 0x9e, + 0x9f, 0xeb, 0xa5, 0x1f, 0x12, 0x5d, 0x3b, 0x4b, 0x74, 0xed, 0x59, 0xa2, 0x6b, 0xcf, 0x13, 0x5d, + 0xfb, 0x33, 0xd1, 0xb5, 0x9f, 0xfe, 0xd2, 0x4b, 0x5f, 0x57, 0xf3, 0xd2, 0xfe, 0x0d, 0x00, 0x00, + 0xff, 0xff, 0x85, 0x06, 0x8c, 0x7f, 0xae, 0x09, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto index 118be06f..4d55ca87 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto @@ -21,12 +21,9 @@ syntax = 'proto2'; package k8s.io.api.admissionregistration.v1beta1; -import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; @@ -211,6 +208,15 @@ message Webhook { // Default to the empty LabelSelector, which matches everything. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector namespaceSelector = 5; + + // SideEffects states whether this webhookk has side effects. + // Acceptable values are: Unknown, None, Some, NoneOnDryRun + // Webhooks with side effects MUST implement a reconciliation system, since a request may be + // rejected by a future step in the admission change and the side effects therefore need to be undone. + // Requests with the dryRun attribute will be auto-rejected if they match a webhook with + // sideEffects == Unknown or Some. Defaults to Unknown. + // +optional + optional string sideEffects = 6; } // WebhookClientConfig contains the information to make a TLS diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go index f209e7ac..0b948ba1 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go @@ -60,6 +60,22 @@ const ( Fail FailurePolicyType = "Fail" ) +type SideEffectClass string + +const ( + // SideEffectClassUnknown means that no information is known about the side effects of calling the webhook. + // If a request with the dry-run attribute would trigger a call to this webhook, the request will instead fail. + SideEffectClassUnknown SideEffectClass = "Unknown" + // SideEffectClassNone means that calling the webhook will have no side effects. + SideEffectClassNone SideEffectClass = "None" + // SideEffectClassSome means that calling the webhook will possibly have side effects. + // If a request with the dry-run attribute would trigger a call to this webhook, the request will instead fail. + SideEffectClassSome SideEffectClass = "Some" + // SideEffectClassNoneOnDryRun means that calling the webhook will possibly have side effects, but if the + // request being reviewed has the dry-run attribute, the side effects will be suppressed. + SideEffectClassNoneOnDryRun SideEffectClass = "NoneOnDryRun" +) + // +genclient // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -191,6 +207,15 @@ type Webhook struct { // Default to the empty LabelSelector, which matches everything. // +optional NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,5,opt,name=namespaceSelector"` + + // SideEffects states whether this webhookk has side effects. + // Acceptable values are: Unknown, None, Some, NoneOnDryRun + // Webhooks with side effects MUST implement a reconciliation system, since a request may be + // rejected by a future step in the admission change and the side effects therefore need to be undone. + // Requests with the dryRun attribute will be auto-rejected if they match a webhook with + // sideEffects == Unknown or Some. Defaults to Unknown. + // +optional + SideEffects *SideEffectClass `json:"sideEffects,omitempty" protobuf:"bytes,6,opt,name=sideEffects,casttype=SideEffectClass"` } // RuleWithOperations is a tuple of Operations and Resources. It is recommended to make diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go index e90bdc91..aab917a4 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go @@ -105,6 +105,7 @@ var map_Webhook = map[string]string{ "rules": "Rules describes what operations on what resources/subresources the webhook cares about. The webhook cares about an operation if it matches _any_ Rule. However, in order to prevent ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks from putting the cluster in a state which cannot be recovered from without completely disabling the plugin, ValidatingAdmissionWebhooks and MutatingAdmissionWebhooks are never called on admission requests for ValidatingWebhookConfiguration and MutatingWebhookConfiguration objects.", "failurePolicy": "FailurePolicy defines how unrecognized errors from the admission endpoint are handled - allowed values are Ignore or Fail. Defaults to Ignore.", "namespaceSelector": "NamespaceSelector decides whether to run the webhook on an object based on whether the namespace for that object matches the selector. If the object itself is a namespace, the matching is performed on object.metadata.labels. If the object is another cluster scoped resource, it never skips the webhook.\n\nFor example, to run the webhook on any objects whose namespace is not associated with \"runlevel\" of \"0\" or \"1\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"runlevel\",\n \"operator\": \"NotIn\",\n \"values\": [\n \"0\",\n \"1\"\n ]\n }\n ]\n}\n\nIf instead you want to only run the webhook on any objects whose namespace is associated with the \"environment\" of \"prod\" or \"staging\"; you will set the selector as follows: \"namespaceSelector\": {\n \"matchExpressions\": [\n {\n \"key\": \"environment\",\n \"operator\": \"In\",\n \"values\": [\n \"prod\",\n \"staging\"\n ]\n }\n ]\n}\n\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for more examples of label selectors.\n\nDefault to the empty LabelSelector, which matches everything.", + "sideEffects": "SideEffects states whether this webhookk has side effects. Acceptable values are: Unknown, None, Some, NoneOnDryRun Webhooks with side effects MUST implement a reconciliation system, since a request may be rejected by a future step in the admission change and the side effects therefore need to be undone. Requests with the dryRun attribute will be auto-rejected if they match a webhook with sideEffects == Unknown or Some. Defaults to Unknown.", } func (Webhook) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go index d8c1e4f6..c6867be1 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go @@ -149,12 +149,8 @@ func (in *ServiceReference) DeepCopyInto(out *ServiceReference) { *out = *in if in.Path != nil { in, out := &in.Path, &out.Path - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -248,21 +244,18 @@ func (in *Webhook) DeepCopyInto(out *Webhook) { } if in.FailurePolicy != nil { in, out := &in.FailurePolicy, &out.FailurePolicy - if *in == nil { - *out = nil - } else { - *out = new(FailurePolicyType) - **out = **in - } + *out = new(FailurePolicyType) + **out = **in } if in.NamespaceSelector != nil { in, out := &in.NamespaceSelector, &out.NamespaceSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.SideEffects != nil { + in, out := &in.SideEffects, &out.SideEffects + *out = new(SideEffectClass) + **out = **in } return } @@ -282,21 +275,13 @@ func (in *WebhookClientConfig) DeepCopyInto(out *WebhookClientConfig) { *out = *in if in.URL != nil { in, out := &in.URL, &out.URL - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } if in.Service != nil { in, out := &in.Service, &out.Service - if *in == nil { - *out = nil - } else { - *out = new(ServiceReference) - (*in).DeepCopyInto(*out) - } + *out = new(ServiceReference) + (*in).DeepCopyInto(*out) } if in.CABundle != nil { in, out := &in.CABundle, &out.CABundle diff --git a/vendor/k8s.io/api/apps/v1beta1/BUILD b/vendor/k8s.io/api/apps/v1beta1/BUILD index f40a41e3..edde9701 100644 --- a/vendor/k8s.io/api/apps/v1beta1/BUILD +++ b/vendor/k8s.io/api/apps/v1beta1/BUILD @@ -15,15 +15,16 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/apps/v1beta1", importpath = "k8s.io/api/apps/v1beta1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -39,9 +40,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.pb.go b/vendor/k8s.io/api/apps/v1beta1/generated.pb.go index 60830825..ef9aa8e0 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1beta1/generated.pb.go @@ -54,7 +54,6 @@ import fmt "fmt" import math "math" import k8s_io_api_core_v1 "k8s.io/api/core/v1" - import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" import k8s_io_apimachinery_pkg_util_intstr "k8s.io/apimachinery/pkg/util/intstr" @@ -5170,122 +5169,122 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1871 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0x4f, 0x6f, 0x1b, 0xc7, - 0x15, 0xd7, 0x52, 0xa4, 0x44, 0x3d, 0x45, 0x94, 0x3d, 0x52, 0x2d, 0x46, 0x69, 0x29, 0x61, 0x1b, - 0x24, 0x72, 0x12, 0x2d, 0x63, 0x25, 0x0d, 0x12, 0xbb, 0x08, 0x2a, 0xca, 0x6e, 0xe2, 0x40, 0xaa, - 0x94, 0xa1, 0x94, 0xa2, 0x69, 0x0b, 0x64, 0xb8, 0x1c, 0xd3, 0x1b, 0xed, 0x3f, 0xec, 0x0e, 0x59, - 0x13, 0xbd, 0xf4, 0x03, 0x14, 0x48, 0xcf, 0xfd, 0x14, 0x3d, 0x16, 0xed, 0xad, 0x27, 0x5f, 0x0a, - 0x04, 0xbd, 0x34, 0x27, 0xa1, 0xa6, 0xaf, 0x6d, 0x6f, 0xbd, 0x18, 0x28, 0x50, 0xcc, 0xec, 0xec, - 0xff, 0x5d, 0x89, 0x2a, 0x20, 0x1d, 0x72, 0xe3, 0xce, 0x7b, 0xef, 0xf7, 0xde, 0xcc, 0xbc, 0xf7, - 0xe6, 0xfd, 0x08, 0x3f, 0x3a, 0x7d, 0xdf, 0xd7, 0x0c, 0xa7, 0x7d, 0x3a, 0xec, 0x51, 0xcf, 0xa6, - 0x8c, 0xfa, 0xed, 0x11, 0xb5, 0xfb, 0x8e, 0xd7, 0x96, 0x02, 0xe2, 0x1a, 0x6d, 0xe2, 0xba, 0x7e, - 0x7b, 0x74, 0xa7, 0x47, 0x19, 0xb9, 0xd3, 0x1e, 0x50, 0x9b, 0x7a, 0x84, 0xd1, 0xbe, 0xe6, 0x7a, - 0x0e, 0x73, 0xd0, 0x5a, 0xa0, 0xa8, 0x11, 0xd7, 0xd0, 0xb8, 0xa2, 0x26, 0x15, 0xd7, 0xb7, 0x07, - 0x06, 0x7b, 0x3c, 0xec, 0x69, 0xba, 0x63, 0xb5, 0x07, 0xce, 0xc0, 0x69, 0x0b, 0xfd, 0xde, 0xf0, - 0x91, 0xf8, 0x12, 0x1f, 0xe2, 0x57, 0x80, 0xb3, 0xae, 0x26, 0x1c, 0xea, 0x8e, 0x47, 0xdb, 0xa3, - 0x9c, 0xaf, 0xf5, 0xdb, 0x09, 0x1d, 0xd7, 0x31, 0x0d, 0x7d, 0x5c, 0x16, 0xd6, 0xfa, 0xbb, 0xb1, - 0xaa, 0x45, 0xf4, 0xc7, 0x86, 0x4d, 0xbd, 0x71, 0xdb, 0x3d, 0x1d, 0xf0, 0x05, 0xbf, 0x6d, 0x51, - 0x46, 0x8a, 0x1c, 0xb4, 0xcb, 0xac, 0xbc, 0xa1, 0xcd, 0x0c, 0x8b, 0xe6, 0x0c, 0xde, 0xbb, 0xc8, - 0xc0, 0xd7, 0x1f, 0x53, 0x8b, 0xe4, 0xec, 0xde, 0x29, 0xb3, 0x1b, 0x32, 0xc3, 0x6c, 0x1b, 0x36, - 0xf3, 0x99, 0x97, 0x35, 0x52, 0xff, 0xa3, 0x00, 0xda, 0x73, 0x6c, 0xe6, 0x39, 0xa6, 0x49, 0x3d, - 0x4c, 0x47, 0x86, 0x6f, 0x38, 0x36, 0xfa, 0x02, 0xea, 0x7c, 0x3f, 0x7d, 0xc2, 0x48, 0x53, 0xd9, - 0x54, 0xb6, 0x16, 0x77, 0xde, 0xd6, 0xe2, 0x4b, 0x89, 0xe0, 0x35, 0xf7, 0x74, 0xc0, 0x17, 0x7c, - 0x8d, 0x6b, 0x6b, 0xa3, 0x3b, 0xda, 0x61, 0xef, 0x4b, 0xaa, 0xb3, 0x03, 0xca, 0x48, 0x07, 0x3d, - 0x3d, 0xdb, 0x98, 0x99, 0x9c, 0x6d, 0x40, 0xbc, 0x86, 0x23, 0x54, 0x74, 0x08, 0x55, 0x81, 0x5e, - 0x11, 0xe8, 0xdb, 0xa5, 0xe8, 0x72, 0xd3, 0x1a, 0x26, 0xbf, 0x7a, 0xf0, 0x84, 0x51, 0x9b, 0x87, - 0xd7, 0x79, 0x49, 0x42, 0x57, 0xef, 0x13, 0x46, 0xb0, 0x00, 0x42, 0x6f, 0x41, 0xdd, 0x93, 0xe1, - 0x37, 0x67, 0x37, 0x95, 0xad, 0xd9, 0xce, 0x0d, 0xa9, 0x55, 0x0f, 0xb7, 0x85, 0x23, 0x0d, 0xf5, - 0xa9, 0x02, 0xb7, 0xf2, 0xfb, 0xde, 0x37, 0x7c, 0x86, 0x7e, 0x91, 0xdb, 0xbb, 0x36, 0xdd, 0xde, - 0xb9, 0xb5, 0xd8, 0x79, 0xe4, 0x38, 0x5c, 0x49, 0xec, 0xfb, 0x08, 0x6a, 0x06, 0xa3, 0x96, 0xdf, - 0xac, 0x6c, 0xce, 0x6e, 0x2d, 0xee, 0xbc, 0xa9, 0x95, 0xe4, 0xba, 0x96, 0x8f, 0xae, 0xb3, 0x24, - 0x71, 0x6b, 0x0f, 0x39, 0x02, 0x0e, 0x80, 0xd4, 0xdf, 0x56, 0x00, 0xee, 0x53, 0xd7, 0x74, 0xc6, - 0x16, 0xb5, 0xd9, 0x35, 0x5c, 0xdd, 0x43, 0xa8, 0xfa, 0x2e, 0xd5, 0xe5, 0xd5, 0xbd, 0x5e, 0xba, - 0x83, 0x38, 0xa8, 0xae, 0x4b, 0xf5, 0xf8, 0xd2, 0xf8, 0x17, 0x16, 0x10, 0xe8, 0x53, 0x98, 0xf3, - 0x19, 0x61, 0x43, 0x5f, 0x5c, 0xd9, 0xe2, 0xce, 0xed, 0x69, 0xc0, 0x84, 0x41, 0xa7, 0x21, 0xe1, - 0xe6, 0x82, 0x6f, 0x2c, 0x81, 0xd4, 0xbf, 0xcf, 0xc2, 0x4a, 0xac, 0xbc, 0xe7, 0xd8, 0x7d, 0x83, - 0xf1, 0x94, 0xbe, 0x07, 0x55, 0x36, 0x76, 0xa9, 0x38, 0x93, 0x85, 0xce, 0xeb, 0x61, 0x30, 0xc7, - 0x63, 0x97, 0xbe, 0x38, 0xdb, 0x58, 0x2b, 0x30, 0xe1, 0x22, 0x2c, 0x8c, 0xd0, 0x7e, 0x14, 0x67, - 0x45, 0x98, 0xbf, 0x9b, 0x76, 0xfe, 0xe2, 0x6c, 0xa3, 0xa0, 0xd7, 0x68, 0x11, 0x52, 0x3a, 0x44, - 0xf4, 0x1a, 0xcc, 0x79, 0x94, 0xf8, 0x8e, 0xdd, 0xac, 0x0a, 0xb4, 0x68, 0x2b, 0x58, 0xac, 0x62, - 0x29, 0x45, 0xb7, 0x61, 0xde, 0xa2, 0xbe, 0x4f, 0x06, 0xb4, 0x59, 0x13, 0x8a, 0xcb, 0x52, 0x71, - 0xfe, 0x20, 0x58, 0xc6, 0xa1, 0x1c, 0x7d, 0x09, 0x0d, 0x93, 0xf8, 0xec, 0xc4, 0xed, 0x13, 0x46, - 0x8f, 0x0d, 0x8b, 0x36, 0xe7, 0xc4, 0x81, 0xbe, 0x31, 0xdd, 0xdd, 0x73, 0x8b, 0xce, 0x2d, 0x89, - 0xde, 0xd8, 0x4f, 0x21, 0xe1, 0x0c, 0x32, 0x1a, 0x01, 0xe2, 0x2b, 0xc7, 0x1e, 0xb1, 0xfd, 0xe0, - 0xa0, 0xb8, 0xbf, 0xf9, 0x4b, 0xfb, 0x5b, 0x97, 0xfe, 0xd0, 0x7e, 0x0e, 0x0d, 0x17, 0x78, 0x50, - 0xff, 0xa8, 0x40, 0x23, 0xbe, 0xa6, 0x6b, 0xa8, 0xd5, 0x8f, 0xd3, 0xb5, 0xfa, 0xfd, 0x29, 0x92, - 0xb3, 0xa4, 0x46, 0xff, 0x59, 0x01, 0x14, 0x2b, 0x61, 0xc7, 0x34, 0x7b, 0x44, 0x3f, 0x45, 0x9b, - 0x50, 0xb5, 0x89, 0x15, 0xe6, 0x64, 0x54, 0x20, 0x3f, 0x21, 0x16, 0xc5, 0x42, 0x82, 0xbe, 0x52, - 0x00, 0x0d, 0xc5, 0xd1, 0xf7, 0x77, 0x6d, 0xdb, 0x61, 0x84, 0x9f, 0x46, 0x18, 0xd0, 0xde, 0x14, - 0x01, 0x85, 0xbe, 0xb4, 0x93, 0x1c, 0xca, 0x03, 0x9b, 0x79, 0xe3, 0xf8, 0x16, 0xf2, 0x0a, 0xb8, - 0xc0, 0x35, 0xfa, 0x39, 0x80, 0x27, 0x31, 0x8f, 0x1d, 0x59, 0xb6, 0xe5, 0x3d, 0x20, 0x74, 0xbf, - 0xe7, 0xd8, 0x8f, 0x8c, 0x41, 0xdc, 0x58, 0x70, 0x04, 0x81, 0x13, 0x70, 0xeb, 0x0f, 0x60, 0xad, - 0x24, 0x4e, 0x74, 0x03, 0x66, 0x4f, 0xe9, 0x38, 0x38, 0x2a, 0xcc, 0x7f, 0xa2, 0x55, 0xa8, 0x8d, - 0x88, 0x39, 0xa4, 0x41, 0x4d, 0xe2, 0xe0, 0xe3, 0x6e, 0xe5, 0x7d, 0x45, 0xfd, 0x43, 0x2d, 0x99, - 0x29, 0xbc, 0xdf, 0xa0, 0x2d, 0xfe, 0x3c, 0xb8, 0xa6, 0xa1, 0x13, 0x5f, 0x60, 0xd4, 0x3a, 0x2f, - 0x05, 0x4f, 0x43, 0xb0, 0x86, 0x23, 0x29, 0xfa, 0x25, 0xd4, 0x7d, 0x6a, 0x52, 0x9d, 0x39, 0x9e, - 0x6c, 0x71, 0xef, 0x4c, 0x99, 0x53, 0xa4, 0x47, 0xcd, 0xae, 0x34, 0x0d, 0xe0, 0xc3, 0x2f, 0x1c, - 0x41, 0xa2, 0x4f, 0xa1, 0xce, 0xa8, 0xe5, 0x9a, 0x84, 0x51, 0x79, 0x7a, 0xa9, 0xbc, 0xe2, 0xbd, - 0x83, 0x83, 0x1d, 0x39, 0xfd, 0x63, 0xa9, 0x26, 0xba, 0x67, 0x94, 0xa7, 0xe1, 0x2a, 0x8e, 0x60, - 0xd0, 0xcf, 0xa0, 0xee, 0x33, 0xfe, 0xaa, 0x0f, 0xc6, 0xa2, 0xa3, 0x9c, 0xf7, 0xac, 0x24, 0xfb, - 0x68, 0x60, 0x12, 0x43, 0x87, 0x2b, 0x38, 0x82, 0x43, 0xbb, 0xb0, 0x6c, 0x19, 0x36, 0xa6, 0xa4, - 0x3f, 0xee, 0x52, 0xdd, 0xb1, 0xfb, 0xbe, 0x68, 0x45, 0xb5, 0xce, 0x9a, 0x34, 0x5a, 0x3e, 0x48, - 0x8b, 0x71, 0x56, 0x1f, 0xed, 0xc3, 0x6a, 0xf8, 0xec, 0x7e, 0x6c, 0xf8, 0xcc, 0xf1, 0xc6, 0xfb, - 0x86, 0x65, 0x30, 0xd1, 0xa0, 0x6a, 0x9d, 0xe6, 0xe4, 0x6c, 0x63, 0x15, 0x17, 0xc8, 0x71, 0xa1, - 0x15, 0xef, 0x9d, 0x2e, 0x19, 0xfa, 0xb4, 0x2f, 0x1a, 0x4e, 0x3d, 0xee, 0x9d, 0x47, 0x62, 0x15, - 0x4b, 0x29, 0xfa, 0x69, 0x2a, 0x4d, 0xeb, 0x97, 0x4b, 0xd3, 0x46, 0x79, 0x8a, 0xa2, 0x13, 0x58, - 0x73, 0x3d, 0x67, 0xe0, 0x51, 0xdf, 0xbf, 0x4f, 0x49, 0xdf, 0x34, 0x6c, 0x1a, 0x9e, 0xcc, 0x82, - 0xd8, 0xd1, 0x2b, 0x93, 0xb3, 0x8d, 0xb5, 0xa3, 0x62, 0x15, 0x5c, 0x66, 0xab, 0xfe, 0xa5, 0x0a, - 0x37, 0xb2, 0x6f, 0x1c, 0xfa, 0x04, 0x90, 0xd3, 0xf3, 0xa9, 0x37, 0xa2, 0xfd, 0x8f, 0x82, 0xc1, - 0x8d, 0x4f, 0x37, 0x8a, 0x98, 0x6e, 0xa2, 0xba, 0x3d, 0xcc, 0x69, 0xe0, 0x02, 0xab, 0x60, 0x3e, - 0x92, 0x05, 0x50, 0x11, 0x81, 0x26, 0xe6, 0xa3, 0x5c, 0x11, 0xec, 0xc2, 0xb2, 0xac, 0xfd, 0x50, - 0x28, 0x92, 0x35, 0x71, 0xef, 0x27, 0x69, 0x31, 0xce, 0xea, 0xa3, 0x8f, 0xe0, 0x26, 0x19, 0x11, - 0xc3, 0x24, 0x3d, 0x93, 0x46, 0x20, 0x55, 0x01, 0xf2, 0xb2, 0x04, 0xb9, 0xb9, 0x9b, 0x55, 0xc0, - 0x79, 0x1b, 0x74, 0x00, 0x2b, 0x43, 0x3b, 0x0f, 0x15, 0xe4, 0xe1, 0x2b, 0x12, 0x6a, 0xe5, 0x24, - 0xaf, 0x82, 0x8b, 0xec, 0xd0, 0x17, 0x00, 0x7a, 0xf8, 0x30, 0xfb, 0xcd, 0x39, 0xd1, 0x49, 0xdf, - 0x9a, 0xa2, 0x5e, 0xa2, 0xd7, 0x3c, 0xee, 0x62, 0xd1, 0x92, 0x8f, 0x13, 0x98, 0xe8, 0x1e, 0x2c, - 0x79, 0xbc, 0x02, 0xa2, 0x50, 0xe7, 0x45, 0xa8, 0xdf, 0x91, 0x66, 0x4b, 0x38, 0x29, 0xc4, 0x69, - 0x5d, 0x74, 0x17, 0x1a, 0xba, 0x63, 0x9a, 0x22, 0xf3, 0xf7, 0x9c, 0xa1, 0xcd, 0x44, 0xf2, 0xd6, - 0x3a, 0x88, 0xbf, 0xcc, 0x7b, 0x29, 0x09, 0xce, 0x68, 0xaa, 0x7f, 0x56, 0x92, 0xcf, 0x4c, 0x58, - 0xce, 0xe8, 0x6e, 0x6a, 0xf4, 0x79, 0x2d, 0x33, 0xfa, 0xdc, 0xca, 0x5b, 0x24, 0x26, 0x1f, 0x03, - 0x96, 0x78, 0xf2, 0x1b, 0xf6, 0x20, 0xb8, 0x70, 0xd9, 0x12, 0xdf, 0x3e, 0xb7, 0x94, 0x22, 0xed, - 0xc4, 0xc3, 0x78, 0x53, 0xec, 0x3c, 0x29, 0xc4, 0x69, 0x64, 0xf5, 0x43, 0x68, 0xa4, 0xeb, 0x30, - 0x35, 0xd3, 0x2b, 0x17, 0xce, 0xf4, 0xcf, 0x15, 0x58, 0x2b, 0xf1, 0x8e, 0x4c, 0x68, 0x58, 0xe4, - 0x49, 0x22, 0x47, 0x2e, 0x9c, 0x8d, 0x39, 0x6b, 0xd2, 0x02, 0xd6, 0xa4, 0x3d, 0xb4, 0xd9, 0xa1, - 0xd7, 0x65, 0x9e, 0x61, 0x0f, 0x82, 0x7b, 0x38, 0x48, 0x61, 0xe1, 0x0c, 0x36, 0xfa, 0x1c, 0xea, - 0x16, 0x79, 0xd2, 0x1d, 0x7a, 0x83, 0xa2, 0xf3, 0x9a, 0xce, 0x8f, 0x78, 0x3f, 0x0e, 0x24, 0x0a, - 0x8e, 0xf0, 0xd4, 0x43, 0xd8, 0x4c, 0x6d, 0x92, 0xb7, 0x0a, 0xfa, 0x68, 0x68, 0x76, 0x69, 0x7c, - 0xe1, 0x6f, 0xc2, 0x82, 0x4b, 0x3c, 0x66, 0x44, 0xed, 0xa2, 0xd6, 0x59, 0x9a, 0x9c, 0x6d, 0x2c, - 0x1c, 0x85, 0x8b, 0x38, 0x96, 0xab, 0xff, 0x55, 0xa0, 0xd6, 0xd5, 0x89, 0x49, 0xaf, 0x81, 0x3a, - 0xdc, 0x4f, 0x51, 0x07, 0xb5, 0x34, 0x89, 0x44, 0x3c, 0xa5, 0xac, 0x61, 0x3f, 0xc3, 0x1a, 0x5e, - 0xbd, 0x00, 0xe7, 0x7c, 0xc2, 0xf0, 0x01, 0x2c, 0x44, 0xee, 0x52, 0x5d, 0x52, 0xb9, 0xa8, 0x4b, - 0xaa, 0xbf, 0xaf, 0xc0, 0x62, 0xc2, 0xc5, 0xe5, 0xac, 0xf9, 0x71, 0x27, 0x06, 0x0d, 0xde, 0x86, - 0x76, 0xa6, 0xd9, 0x88, 0x16, 0x0e, 0x15, 0xc1, 0xfc, 0x16, 0xbf, 0xde, 0xf9, 0x59, 0xe3, 0x43, - 0x68, 0x30, 0xe2, 0x0d, 0x28, 0x0b, 0x65, 0xe2, 0xc0, 0x16, 0xe2, 0x49, 0xff, 0x38, 0x25, 0xc5, - 0x19, 0xed, 0xf5, 0x7b, 0xb0, 0x94, 0x72, 0x76, 0xa9, 0x21, 0xec, 0x2b, 0x7e, 0x38, 0x71, 0x72, - 0x5e, 0x43, 0x76, 0x7d, 0x92, 0xca, 0xae, 0xad, 0xf2, 0xc3, 0x4c, 0x94, 0x4c, 0x59, 0x8e, 0xe1, - 0x4c, 0x8e, 0xbd, 0x31, 0x15, 0xda, 0xf9, 0x99, 0xf6, 0xaf, 0x0a, 0xac, 0x26, 0xb4, 0x63, 0x6e, - 0xfa, 0xc3, 0x54, 0x83, 0xde, 0xca, 0x34, 0xe8, 0x66, 0x91, 0xcd, 0x95, 0x91, 0xd3, 0x62, 0x76, - 0x37, 0x7b, 0xd5, 0xec, 0xee, 0x0a, 0x48, 0xb1, 0xfa, 0x27, 0x05, 0x96, 0x13, 0x67, 0x77, 0x0d, - 0x8c, 0xf1, 0x61, 0x9a, 0x31, 0xbe, 0x3a, 0x4d, 0xd2, 0x94, 0x50, 0xc6, 0xbf, 0xd6, 0x52, 0xc1, - 0x7f, 0xeb, 0x49, 0xcc, 0xaf, 0x61, 0x75, 0xe4, 0x98, 0x43, 0x8b, 0xee, 0x99, 0xc4, 0xb0, 0x42, - 0x05, 0x3e, 0x31, 0xce, 0x66, 0xff, 0x18, 0x8a, 0xe0, 0xa9, 0xe7, 0x1b, 0x3e, 0xa3, 0x36, 0xfb, - 0x2c, 0xb6, 0xec, 0x7c, 0x57, 0x3a, 0x59, 0xfd, 0xac, 0x00, 0x0e, 0x17, 0x3a, 0x41, 0x3f, 0x80, - 0x45, 0x3e, 0x30, 0x1b, 0x3a, 0xe5, 0xdc, 0x5b, 0x26, 0xd6, 0x8a, 0x04, 0x5a, 0xec, 0xc6, 0x22, - 0x9c, 0xd4, 0x43, 0x8f, 0x61, 0xc5, 0x75, 0xfa, 0x07, 0xc4, 0x26, 0x03, 0xca, 0xc7, 0x8c, 0x23, - 0xf1, 0x07, 0xb2, 0x60, 0x36, 0x0b, 0x9d, 0xf7, 0xc2, 0xc9, 0xf4, 0x28, 0xaf, 0xf2, 0x82, 0x53, - 0x84, 0xfc, 0xb2, 0x28, 0xea, 0x22, 0x48, 0xe4, 0x41, 0x63, 0x28, 0x9f, 0x7b, 0x49, 0xf4, 0x82, - 0xff, 0x5b, 0x76, 0xa6, 0xc9, 0xb0, 0x93, 0x94, 0x65, 0xdc, 0xfd, 0xd3, 0xeb, 0x38, 0xe3, 0xa1, - 0x94, 0xb8, 0xd5, 0xff, 0x1f, 0xe2, 0xa6, 0xfe, 0xbb, 0x0a, 0x37, 0x73, 0xad, 0x12, 0xfd, 0xf8, - 0x1c, 0x86, 0x73, 0xeb, 0xca, 0xd8, 0x4d, 0x6e, 0x40, 0x9f, 0xbd, 0xc4, 0x80, 0xbe, 0x0b, 0xcb, - 0xfa, 0xd0, 0xf3, 0xa8, 0xcd, 0x32, 0xac, 0x26, 0xa2, 0x46, 0x7b, 0x69, 0x31, 0xce, 0xea, 0x17, - 0xb1, 0xab, 0xda, 0x25, 0xd9, 0x55, 0x32, 0x0a, 0x39, 0x21, 0x07, 0x69, 0x97, 0x8f, 0x42, 0x0e, - 0xca, 0x59, 0x7d, 0x3e, 0x1d, 0x04, 0xa8, 0x11, 0xc2, 0x7c, 0x7a, 0x3a, 0x38, 0x49, 0x49, 0x71, - 0x46, 0xbb, 0x80, 0xa9, 0x2c, 0x4c, 0xcb, 0x54, 0x10, 0x49, 0x91, 0x30, 0x10, 0x35, 0xbe, 0x3d, - 0x4d, 0x2e, 0x4f, 0xcd, 0xc2, 0xd4, 0xbf, 0x29, 0xf0, 0x72, 0x69, 0x11, 0xa0, 0xdd, 0xd4, 0x93, - 0xbb, 0x9d, 0x79, 0x72, 0xbf, 0x57, 0x6a, 0x98, 0x78, 0x77, 0xbd, 0x62, 0x6a, 0xf4, 0xc1, 0x74, - 0xd4, 0xa8, 0x60, 0x6e, 0xbf, 0x98, 0x23, 0x75, 0xb6, 0x9f, 0x3e, 0x6b, 0xcd, 0x7c, 0xfd, 0xac, - 0x35, 0xf3, 0xcd, 0xb3, 0xd6, 0xcc, 0x6f, 0x26, 0x2d, 0xe5, 0xe9, 0xa4, 0xa5, 0x7c, 0x3d, 0x69, - 0x29, 0xdf, 0x4c, 0x5a, 0xca, 0x3f, 0x26, 0x2d, 0xe5, 0x77, 0xcf, 0x5b, 0x33, 0x9f, 0xcf, 0x4b, - 0x8f, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x9d, 0x5d, 0x9e, 0x04, 0x8c, 0x1b, 0x00, 0x00, + // 1859 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x6f, 0x24, 0x47, + 0x15, 0x77, 0x8f, 0x67, 0xec, 0xf1, 0x73, 0x3c, 0xde, 0x2d, 0x9b, 0xf5, 0xc4, 0x81, 0xb1, 0xd5, + 0x44, 0x89, 0xf3, 0xe1, 0x9e, 0xac, 0x13, 0xa2, 0x64, 0x17, 0x45, 0x78, 0xbc, 0x4b, 0xb2, 0x91, + 0x8d, 0x9d, 0xb2, 0x1d, 0x44, 0x00, 0x29, 0x35, 0x3d, 0xb5, 0xb3, 0x1d, 0xf7, 0x97, 0xba, 0x6b, + 0x86, 0x1d, 0x71, 0xe1, 0x0f, 0x40, 0x0a, 0x67, 0xfe, 0x0a, 0x8e, 0x08, 0x6e, 0x9c, 0xf6, 0x82, + 0x14, 0x71, 0x21, 0x27, 0x8b, 0x9d, 0x5c, 0x81, 0x1b, 0x97, 0x95, 0x90, 0x50, 0x55, 0x57, 0x7f, + 0x77, 0xdb, 0x6d, 0xa4, 0xf5, 0x21, 0xb7, 0xe9, 0x7a, 0xef, 0xfd, 0x5e, 0x7d, 0xbc, 0xaf, 0xdf, + 0xc0, 0x8f, 0xce, 0xde, 0xf3, 0x35, 0xc3, 0xe9, 0x9e, 0x8d, 0xfa, 0xd4, 0xb3, 0x29, 0xa3, 0x7e, + 0x77, 0x4c, 0xed, 0x81, 0xe3, 0x75, 0xa5, 0x80, 0xb8, 0x46, 0x97, 0xb8, 0xae, 0xdf, 0x1d, 0xdf, + 0xee, 0x53, 0x46, 0x6e, 0x77, 0x87, 0xd4, 0xa6, 0x1e, 0x61, 0x74, 0xa0, 0xb9, 0x9e, 0xc3, 0x1c, + 0xb4, 0x16, 0x28, 0x6a, 0xc4, 0x35, 0x34, 0xae, 0xa8, 0x49, 0xc5, 0xf5, 0xed, 0xa1, 0xc1, 0x1e, + 0x8d, 0xfa, 0x9a, 0xee, 0x58, 0xdd, 0xa1, 0x33, 0x74, 0xba, 0x42, 0xbf, 0x3f, 0x7a, 0x28, 0xbe, + 0xc4, 0x87, 0xf8, 0x15, 0xe0, 0xac, 0xab, 0x09, 0x87, 0xba, 0xe3, 0xd1, 0xee, 0x38, 0xe7, 0x6b, + 0xfd, 0x9d, 0x58, 0xc7, 0x22, 0xfa, 0x23, 0xc3, 0xa6, 0xde, 0xa4, 0xeb, 0x9e, 0x0d, 0xf9, 0x82, + 0xdf, 0xb5, 0x28, 0x23, 0x45, 0x56, 0xdd, 0x32, 0x2b, 0x6f, 0x64, 0x33, 0xc3, 0xa2, 0x39, 0x83, + 0x77, 0x2f, 0x33, 0xf0, 0xf5, 0x47, 0xd4, 0x22, 0x39, 0xbb, 0xb7, 0xcb, 0xec, 0x46, 0xcc, 0x30, + 0xbb, 0x86, 0xcd, 0x7c, 0xe6, 0x65, 0x8d, 0xd4, 0xff, 0x28, 0x80, 0xf6, 0x1c, 0x9b, 0x79, 0x8e, + 0x69, 0x52, 0x0f, 0xd3, 0xb1, 0xe1, 0x1b, 0x8e, 0x8d, 0x3e, 0x87, 0x26, 0x3f, 0xcf, 0x80, 0x30, + 0xd2, 0x56, 0x36, 0x95, 0xad, 0xc5, 0x9d, 0xb7, 0xb4, 0xf8, 0xa6, 0x23, 0x78, 0xcd, 0x3d, 0x1b, + 0xf2, 0x05, 0x5f, 0xe3, 0xda, 0xda, 0xf8, 0xb6, 0x76, 0xd8, 0xff, 0x82, 0xea, 0xec, 0x80, 0x32, + 0xd2, 0x43, 0x4f, 0xce, 0x37, 0x66, 0xa6, 0xe7, 0x1b, 0x10, 0xaf, 0xe1, 0x08, 0x15, 0x1d, 0x42, + 0x5d, 0xa0, 0xd7, 0x04, 0xfa, 0x76, 0x29, 0xba, 0x3c, 0xb4, 0x86, 0xc9, 0xaf, 0xee, 0x3f, 0x66, + 0xd4, 0xe6, 0xdb, 0xeb, 0xbd, 0x20, 0xa1, 0xeb, 0xf7, 0x08, 0x23, 0x58, 0x00, 0xa1, 0x37, 0xa1, + 0xe9, 0xc9, 0xed, 0xb7, 0x67, 0x37, 0x95, 0xad, 0xd9, 0xde, 0x0d, 0xa9, 0xd5, 0x0c, 0x8f, 0x85, + 0x23, 0x0d, 0xf5, 0x89, 0x02, 0xb7, 0xf2, 0xe7, 0xde, 0x37, 0x7c, 0x86, 0x7e, 0x91, 0x3b, 0xbb, + 0x56, 0xed, 0xec, 0xdc, 0x5a, 0x9c, 0x3c, 0x72, 0x1c, 0xae, 0x24, 0xce, 0x7d, 0x04, 0x0d, 0x83, + 0x51, 0xcb, 0x6f, 0xd7, 0x36, 0x67, 0xb7, 0x16, 0x77, 0xde, 0xd0, 0x4a, 0x02, 0x58, 0xcb, 0xef, + 0xae, 0xb7, 0x24, 0x71, 0x1b, 0x0f, 0x38, 0x02, 0x0e, 0x80, 0xd4, 0xdf, 0xd6, 0x00, 0xee, 0x51, + 0xd7, 0x74, 0x26, 0x16, 0xb5, 0xd9, 0x35, 0x3c, 0xdd, 0x03, 0xa8, 0xfb, 0x2e, 0xd5, 0xe5, 0xd3, + 0xbd, 0x5a, 0x7a, 0x82, 0x78, 0x53, 0xc7, 0x2e, 0xd5, 0xe3, 0x47, 0xe3, 0x5f, 0x58, 0x40, 0xa0, + 0x4f, 0x60, 0xce, 0x67, 0x84, 0x8d, 0x7c, 0xf1, 0x64, 0x8b, 0x3b, 0xaf, 0x55, 0x01, 0x13, 0x06, + 0xbd, 0x96, 0x84, 0x9b, 0x0b, 0xbe, 0xb1, 0x04, 0x52, 0xff, 0x3e, 0x0b, 0x2b, 0xb1, 0xf2, 0x9e, + 0x63, 0x0f, 0x0c, 0xc6, 0x43, 0xfa, 0x2e, 0xd4, 0xd9, 0xc4, 0xa5, 0xe2, 0x4e, 0x16, 0x7a, 0xaf, + 0x86, 0x9b, 0x39, 0x99, 0xb8, 0xf4, 0xd9, 0xf9, 0xc6, 0x5a, 0x81, 0x09, 0x17, 0x61, 0x61, 0x84, + 0xf6, 0xa3, 0x7d, 0xd6, 0x84, 0xf9, 0x3b, 0x69, 0xe7, 0xcf, 0xce, 0x37, 0x0a, 0x0a, 0x88, 0x16, + 0x21, 0xa5, 0xb7, 0x88, 0x5e, 0x81, 0x39, 0x8f, 0x12, 0xdf, 0xb1, 0xdb, 0x75, 0x81, 0x16, 0x1d, + 0x05, 0x8b, 0x55, 0x2c, 0xa5, 0xe8, 0x35, 0x98, 0xb7, 0xa8, 0xef, 0x93, 0x21, 0x6d, 0x37, 0x84, + 0xe2, 0xb2, 0x54, 0x9c, 0x3f, 0x08, 0x96, 0x71, 0x28, 0x47, 0x5f, 0x40, 0xcb, 0x24, 0x3e, 0x3b, + 0x75, 0x07, 0x84, 0xd1, 0x13, 0xc3, 0xa2, 0xed, 0x39, 0x71, 0xa1, 0xaf, 0x57, 0x7b, 0x7b, 0x6e, + 0xd1, 0xbb, 0x25, 0xd1, 0x5b, 0xfb, 0x29, 0x24, 0x9c, 0x41, 0x46, 0x63, 0x40, 0x7c, 0xe5, 0xc4, + 0x23, 0xb6, 0x1f, 0x5c, 0x14, 0xf7, 0x37, 0x7f, 0x65, 0x7f, 0xeb, 0xd2, 0x1f, 0xda, 0xcf, 0xa1, + 0xe1, 0x02, 0x0f, 0xea, 0x1f, 0x15, 0x68, 0xc5, 0xcf, 0x74, 0x0d, 0xb9, 0xfa, 0x51, 0x3a, 0x57, + 0xbf, 0x5f, 0x21, 0x38, 0x4b, 0x72, 0xf4, 0x9f, 0x35, 0x40, 0xb1, 0x12, 0x76, 0x4c, 0xb3, 0x4f, + 0xf4, 0x33, 0xb4, 0x09, 0x75, 0x9b, 0x58, 0x61, 0x4c, 0x46, 0x09, 0xf2, 0x13, 0x62, 0x51, 0x2c, + 0x24, 0xe8, 0x4b, 0x05, 0xd0, 0x48, 0x5c, 0xfd, 0x60, 0xd7, 0xb6, 0x1d, 0x46, 0xf8, 0x6d, 0x84, + 0x1b, 0xda, 0xab, 0xb0, 0xa1, 0xd0, 0x97, 0x76, 0x9a, 0x43, 0xb9, 0x6f, 0x33, 0x6f, 0x12, 0xbf, + 0x42, 0x5e, 0x01, 0x17, 0xb8, 0x46, 0x3f, 0x07, 0xf0, 0x24, 0xe6, 0x89, 0x23, 0xd3, 0xb6, 0xbc, + 0x06, 0x84, 0xee, 0xf7, 0x1c, 0xfb, 0xa1, 0x31, 0x8c, 0x0b, 0x0b, 0x8e, 0x20, 0x70, 0x02, 0x6e, + 0xfd, 0x3e, 0xac, 0x95, 0xec, 0x13, 0xdd, 0x80, 0xd9, 0x33, 0x3a, 0x09, 0xae, 0x0a, 0xf3, 0x9f, + 0x68, 0x15, 0x1a, 0x63, 0x62, 0x8e, 0x68, 0x90, 0x93, 0x38, 0xf8, 0xb8, 0x53, 0x7b, 0x4f, 0x51, + 0xff, 0xd0, 0x48, 0x46, 0x0a, 0xaf, 0x37, 0x68, 0x8b, 0xb7, 0x07, 0xd7, 0x34, 0x74, 0xe2, 0x0b, + 0x8c, 0x46, 0xef, 0x85, 0xa0, 0x35, 0x04, 0x6b, 0x38, 0x92, 0xa2, 0x5f, 0x42, 0xd3, 0xa7, 0x26, + 0xd5, 0x99, 0xe3, 0xc9, 0x12, 0xf7, 0x76, 0xc5, 0x98, 0x22, 0x7d, 0x6a, 0x1e, 0x4b, 0xd3, 0x00, + 0x3e, 0xfc, 0xc2, 0x11, 0x24, 0xfa, 0x04, 0x9a, 0x8c, 0x5a, 0xae, 0x49, 0x18, 0x95, 0xb7, 0x97, + 0x8a, 0x2b, 0x5e, 0x3b, 0x38, 0xd8, 0x91, 0x33, 0x38, 0x91, 0x6a, 0xa2, 0x7a, 0x46, 0x71, 0x1a, + 0xae, 0xe2, 0x08, 0x06, 0xfd, 0x0c, 0x9a, 0x3e, 0xe3, 0x5d, 0x7d, 0x38, 0x11, 0x15, 0xe5, 0xa2, + 0xb6, 0x92, 0xac, 0xa3, 0x81, 0x49, 0x0c, 0x1d, 0xae, 0xe0, 0x08, 0x0e, 0xed, 0xc2, 0xb2, 0x65, + 0xd8, 0x98, 0x92, 0xc1, 0xe4, 0x98, 0xea, 0x8e, 0x3d, 0xf0, 0x45, 0x29, 0x6a, 0xf4, 0xd6, 0xa4, + 0xd1, 0xf2, 0x41, 0x5a, 0x8c, 0xb3, 0xfa, 0x68, 0x1f, 0x56, 0xc3, 0xb6, 0xfb, 0x91, 0xe1, 0x33, + 0xc7, 0x9b, 0xec, 0x1b, 0x96, 0xc1, 0x44, 0x81, 0x6a, 0xf4, 0xda, 0xd3, 0xf3, 0x8d, 0x55, 0x5c, + 0x20, 0xc7, 0x85, 0x56, 0xbc, 0x76, 0xba, 0x64, 0xe4, 0xd3, 0x81, 0x28, 0x38, 0xcd, 0xb8, 0x76, + 0x1e, 0x89, 0x55, 0x2c, 0xa5, 0xe8, 0xa7, 0xa9, 0x30, 0x6d, 0x5e, 0x2d, 0x4c, 0x5b, 0xe5, 0x21, + 0x8a, 0x4e, 0x61, 0xcd, 0xf5, 0x9c, 0xa1, 0x47, 0x7d, 0xff, 0x1e, 0x25, 0x03, 0xd3, 0xb0, 0x69, + 0x78, 0x33, 0x0b, 0xe2, 0x44, 0x2f, 0x4d, 0xcf, 0x37, 0xd6, 0x8e, 0x8a, 0x55, 0x70, 0x99, 0xad, + 0xfa, 0x97, 0x3a, 0xdc, 0xc8, 0xf6, 0x38, 0xf4, 0x31, 0x20, 0xa7, 0xef, 0x53, 0x6f, 0x4c, 0x07, + 0x1f, 0x06, 0x83, 0x1b, 0x9f, 0x6e, 0x14, 0x31, 0xdd, 0x44, 0x79, 0x7b, 0x98, 0xd3, 0xc0, 0x05, + 0x56, 0xc1, 0x7c, 0x24, 0x13, 0xa0, 0x26, 0x36, 0x9a, 0x98, 0x8f, 0x72, 0x49, 0xb0, 0x0b, 0xcb, + 0x32, 0xf7, 0x43, 0xa1, 0x08, 0xd6, 0xc4, 0xbb, 0x9f, 0xa6, 0xc5, 0x38, 0xab, 0x8f, 0x3e, 0x84, + 0x9b, 0x64, 0x4c, 0x0c, 0x93, 0xf4, 0x4d, 0x1a, 0x81, 0xd4, 0x05, 0xc8, 0x8b, 0x12, 0xe4, 0xe6, + 0x6e, 0x56, 0x01, 0xe7, 0x6d, 0xd0, 0x01, 0xac, 0x8c, 0xec, 0x3c, 0x54, 0x10, 0x87, 0x2f, 0x49, + 0xa8, 0x95, 0xd3, 0xbc, 0x0a, 0x2e, 0xb2, 0x43, 0x9f, 0x03, 0xe8, 0x61, 0x63, 0xf6, 0xdb, 0x73, + 0xa2, 0x92, 0xbe, 0x59, 0x21, 0x5f, 0xa2, 0x6e, 0x1e, 0x57, 0xb1, 0x68, 0xc9, 0xc7, 0x09, 0x4c, + 0x74, 0x17, 0x96, 0x3c, 0x9e, 0x01, 0xd1, 0x56, 0xe7, 0xc5, 0x56, 0xbf, 0x23, 0xcd, 0x96, 0x70, + 0x52, 0x88, 0xd3, 0xba, 0xe8, 0x0e, 0xb4, 0x74, 0xc7, 0x34, 0x45, 0xe4, 0xef, 0x39, 0x23, 0x9b, + 0x89, 0xe0, 0x6d, 0xf4, 0x10, 0xef, 0xcc, 0x7b, 0x29, 0x09, 0xce, 0x68, 0xaa, 0x7f, 0x56, 0x92, + 0x6d, 0x26, 0x4c, 0x67, 0x74, 0x27, 0x35, 0xfa, 0xbc, 0x92, 0x19, 0x7d, 0x6e, 0xe5, 0x2d, 0x12, + 0x93, 0x8f, 0x01, 0x4b, 0x3c, 0xf8, 0x0d, 0x7b, 0x18, 0x3c, 0xb8, 0x2c, 0x89, 0x6f, 0x5d, 0x98, + 0x4a, 0x91, 0x76, 0xa2, 0x31, 0xde, 0x14, 0x27, 0x4f, 0x0a, 0x71, 0x1a, 0x59, 0xfd, 0x00, 0x5a, + 0xe9, 0x3c, 0x4c, 0xcd, 0xf4, 0xca, 0xa5, 0x33, 0xfd, 0x37, 0x0a, 0xac, 0x95, 0x78, 0x47, 0x26, + 0xb4, 0x2c, 0xf2, 0x38, 0x11, 0x23, 0x97, 0xce, 0xc6, 0x9c, 0x35, 0x69, 0x01, 0x6b, 0xd2, 0x1e, + 0xd8, 0xec, 0xd0, 0x3b, 0x66, 0x9e, 0x61, 0x0f, 0x83, 0x77, 0x38, 0x48, 0x61, 0xe1, 0x0c, 0x36, + 0xfa, 0x0c, 0x9a, 0x16, 0x79, 0x7c, 0x3c, 0xf2, 0x86, 0x45, 0xf7, 0x55, 0xcd, 0x8f, 0xe8, 0x1f, + 0x07, 0x12, 0x05, 0x47, 0x78, 0xea, 0x21, 0x6c, 0xa6, 0x0e, 0xc9, 0x4b, 0x05, 0x7d, 0x38, 0x32, + 0x8f, 0x69, 0xfc, 0xe0, 0x6f, 0xc0, 0x82, 0x4b, 0x3c, 0x66, 0x44, 0xe5, 0xa2, 0xd1, 0x5b, 0x9a, + 0x9e, 0x6f, 0x2c, 0x1c, 0x85, 0x8b, 0x38, 0x96, 0xab, 0xff, 0x55, 0xa0, 0x71, 0xac, 0x13, 0x93, + 0x5e, 0x03, 0x75, 0xb8, 0x97, 0xa2, 0x0e, 0x6a, 0x69, 0x10, 0x89, 0xfd, 0x94, 0xb2, 0x86, 0xfd, + 0x0c, 0x6b, 0x78, 0xf9, 0x12, 0x9c, 0x8b, 0x09, 0xc3, 0xfb, 0xb0, 0x10, 0xb9, 0x4b, 0x55, 0x49, + 0xe5, 0xb2, 0x2a, 0xa9, 0xfe, 0xbe, 0x06, 0x8b, 0x09, 0x17, 0x57, 0xb3, 0xe6, 0xd7, 0x9d, 0x18, + 0x34, 0x78, 0x19, 0xda, 0xa9, 0x72, 0x10, 0x2d, 0x1c, 0x2a, 0x82, 0xf9, 0x2d, 0xee, 0xde, 0xf9, + 0x59, 0xe3, 0x03, 0x68, 0x31, 0xe2, 0x0d, 0x29, 0x0b, 0x65, 0xe2, 0xc2, 0x16, 0xe2, 0x49, 0xff, + 0x24, 0x25, 0xc5, 0x19, 0xed, 0xf5, 0xbb, 0xb0, 0x94, 0x72, 0x76, 0xa5, 0x21, 0xec, 0x4b, 0x7e, + 0x39, 0x71, 0x70, 0x5e, 0x43, 0x74, 0x7d, 0x9c, 0x8a, 0xae, 0xad, 0xf2, 0xcb, 0x4c, 0xa4, 0x4c, + 0x59, 0x8c, 0xe1, 0x4c, 0x8c, 0xbd, 0x5e, 0x09, 0xed, 0xe2, 0x48, 0xfb, 0x57, 0x0d, 0x56, 0x13, + 0xda, 0x31, 0x37, 0xfd, 0x61, 0xaa, 0x40, 0x6f, 0x65, 0x0a, 0x74, 0xbb, 0xc8, 0xe6, 0xb9, 0x91, + 0xd3, 0x62, 0x76, 0x37, 0xfb, 0xbc, 0xd9, 0xdd, 0x73, 0x20, 0xc5, 0xea, 0x9f, 0x14, 0x58, 0x4e, + 0xdc, 0xdd, 0x35, 0x30, 0xc6, 0x07, 0x69, 0xc6, 0xf8, 0x72, 0x95, 0xa0, 0x29, 0xa1, 0x8c, 0x7f, + 0x6d, 0xa4, 0x36, 0xff, 0xad, 0x27, 0x31, 0xbf, 0x86, 0xd5, 0xb1, 0x63, 0x8e, 0x2c, 0xba, 0x67, + 0x12, 0xc3, 0x0a, 0x15, 0xf8, 0xc4, 0x38, 0x9b, 0xfd, 0x63, 0x28, 0x82, 0xa7, 0x9e, 0x6f, 0xf8, + 0x8c, 0xda, 0xec, 0xd3, 0xd8, 0xb2, 0xf7, 0x5d, 0xe9, 0x64, 0xf5, 0xd3, 0x02, 0x38, 0x5c, 0xe8, + 0x04, 0xfd, 0x00, 0x16, 0xf9, 0xc0, 0x6c, 0xe8, 0x94, 0x73, 0x6f, 0x19, 0x58, 0x2b, 0x12, 0x68, + 0xf1, 0x38, 0x16, 0xe1, 0xa4, 0x1e, 0x7a, 0x04, 0x2b, 0xae, 0x33, 0x38, 0x20, 0x36, 0x19, 0x52, + 0x3e, 0x66, 0x1c, 0x39, 0xa6, 0xa1, 0x4f, 0x04, 0xb3, 0x59, 0xe8, 0xbd, 0x1b, 0x4e, 0xa6, 0x47, + 0x79, 0x95, 0x67, 0x9c, 0x22, 0xe4, 0x97, 0x45, 0x52, 0x17, 0x41, 0x22, 0x0f, 0x5a, 0x23, 0xd9, + 0xee, 0x25, 0xd1, 0x0b, 0xfe, 0x6f, 0xd9, 0xa9, 0x12, 0x61, 0xa7, 0x29, 0xcb, 0xb8, 0xfa, 0xa7, + 0xd7, 0x71, 0xc6, 0x43, 0x29, 0x71, 0x6b, 0xfe, 0x3f, 0xc4, 0x4d, 0xfd, 0x77, 0x1d, 0x6e, 0xe6, + 0x4a, 0x25, 0xfa, 0xf1, 0x05, 0x0c, 0xe7, 0xd6, 0x73, 0x63, 0x37, 0xb9, 0x01, 0x7d, 0xf6, 0x0a, + 0x03, 0xfa, 0x2e, 0x2c, 0xeb, 0x23, 0xcf, 0xa3, 0x36, 0xcb, 0xb0, 0x9a, 0x88, 0x1a, 0xed, 0xa5, + 0xc5, 0x38, 0xab, 0x5f, 0xc4, 0xae, 0x1a, 0x57, 0x64, 0x57, 0xc9, 0x5d, 0xc8, 0x09, 0x39, 0x08, + 0xbb, 0xfc, 0x2e, 0xe4, 0xa0, 0x9c, 0xd5, 0xe7, 0xd3, 0x41, 0x80, 0x1a, 0x21, 0xcc, 0xa7, 0xa7, + 0x83, 0xd3, 0x94, 0x14, 0x67, 0xb4, 0x0b, 0x98, 0xca, 0x42, 0x55, 0xa6, 0x82, 0x48, 0x8a, 0x84, + 0x81, 0xc8, 0xf1, 0xed, 0x2a, 0xb1, 0x5c, 0x99, 0x85, 0xa9, 0x7f, 0x53, 0xe0, 0xc5, 0xd2, 0x24, + 0x40, 0xbb, 0xa9, 0x96, 0xbb, 0x9d, 0x69, 0xb9, 0xdf, 0x2b, 0x35, 0x4c, 0xf4, 0x5d, 0xaf, 0x98, + 0x1a, 0xbd, 0x5f, 0x8d, 0x1a, 0x15, 0xcc, 0xed, 0x97, 0x73, 0xa4, 0xde, 0xf6, 0x93, 0xa7, 0x9d, + 0x99, 0xaf, 0x9e, 0x76, 0x66, 0xbe, 0x7e, 0xda, 0x99, 0xf9, 0xcd, 0xb4, 0xa3, 0x3c, 0x99, 0x76, + 0x94, 0xaf, 0xa6, 0x1d, 0xe5, 0xeb, 0x69, 0x47, 0xf9, 0xc7, 0xb4, 0xa3, 0xfc, 0xee, 0x9b, 0xce, + 0xcc, 0x67, 0xf3, 0xd2, 0xe3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x89, 0x29, 0x5c, 0x61, + 0x1b, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.proto b/vendor/k8s.io/api/apps/v1beta1/generated.proto index ba6134d5..6f41f06b 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta1/generated.proto @@ -22,7 +22,6 @@ syntax = 'proto2'; package k8s.io.api.apps.v1beta1; import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/api/policy/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; diff --git a/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go index dd37f8dd..93892bfd 100644 --- a/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1beta1 import ( - core_v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" intstr "k8s.io/apimachinery/pkg/util/intstr" @@ -204,50 +204,30 @@ func (in *DeploymentSpec) DeepCopyInto(out *DeploymentSpec) { *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) in.Strategy.DeepCopyInto(&out.Strategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.RollbackTo != nil { in, out := &in.RollbackTo, &out.RollbackTo - if *in == nil { - *out = nil - } else { - *out = new(RollbackConfig) - **out = **in - } + *out = new(RollbackConfig) + **out = **in } if in.ProgressDeadlineSeconds != nil { in, out := &in.ProgressDeadlineSeconds, &out.ProgressDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -274,12 +254,8 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { } if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -299,12 +275,8 @@ func (in *DeploymentStrategy) DeepCopyInto(out *DeploymentStrategy) { *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateDeployment) - (*in).DeepCopyInto(*out) - } + *out = new(RollingUpdateDeployment) + (*in).DeepCopyInto(*out) } return } @@ -340,21 +312,13 @@ func (in *RollingUpdateDeployment) DeepCopyInto(out *RollingUpdateDeployment) { *out = *in if in.MaxUnavailable != nil { in, out := &in.MaxUnavailable, &out.MaxUnavailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } if in.MaxSurge != nil { in, out := &in.MaxSurge, &out.MaxSurge - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -374,12 +338,8 @@ func (in *RollingUpdateStatefulSetStrategy) DeepCopyInto(out *RollingUpdateState *out = *in if in.Partition != nil { in, out := &in.Partition, &out.Partition - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -544,26 +504,18 @@ func (in *StatefulSetSpec) DeepCopyInto(out *StatefulSetSpec) { *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) if in.VolumeClaimTemplates != nil { in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates - *out = make([]core_v1.PersistentVolumeClaim, len(*in)) + *out = make([]corev1.PersistentVolumeClaim, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -571,12 +523,8 @@ func (in *StatefulSetSpec) DeepCopyInto(out *StatefulSetSpec) { in.UpdateStrategy.DeepCopyInto(&out.UpdateStrategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -596,21 +544,13 @@ func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { *out = *in if in.ObservedGeneration != nil { in, out := &in.ObservedGeneration, &out.ObservedGeneration - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -637,12 +577,8 @@ func (in *StatefulSetUpdateStrategy) DeepCopyInto(out *StatefulSetUpdateStrategy *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateStatefulSetStrategy) - (*in).DeepCopyInto(*out) - } + *out = new(RollingUpdateStatefulSetStrategy) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/api/apps/v1beta2/BUILD b/vendor/k8s.io/api/apps/v1beta2/BUILD index c13a6ff5..39f66bfd 100644 --- a/vendor/k8s.io/api/apps/v1beta2/BUILD +++ b/vendor/k8s.io/api/apps/v1beta2/BUILD @@ -15,15 +15,16 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/apps/v1beta2", importpath = "k8s.io/api/apps/v1beta2", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -39,9 +40,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.pb.go b/vendor/k8s.io/api/apps/v1beta2/generated.pb.go index 49f9f877..72d832c3 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1beta2/generated.pb.go @@ -64,7 +64,6 @@ import fmt "fmt" import math "math" import k8s_io_api_core_v1 "k8s.io/api/core/v1" - import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" import k8s_io_apimachinery_pkg_util_intstr "k8s.io/apimachinery/pkg/util/intstr" @@ -7445,142 +7444,141 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 2186 bytes of a gzipped FileDescriptorProto + // 2176 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x6f, 0x1c, 0xb7, - 0x19, 0xf7, 0xec, 0x43, 0x5a, 0x51, 0x96, 0x64, 0x53, 0xaa, 0xb4, 0x91, 0xdb, 0x95, 0xb1, 0x09, - 0x1c, 0x39, 0xb6, 0x66, 0x6d, 0xe5, 0x81, 0xc4, 0x2e, 0xda, 0x6a, 0xa5, 0xd4, 0x76, 0xa0, 0x57, + 0x19, 0xd7, 0xec, 0x43, 0x5a, 0x51, 0x91, 0x64, 0x53, 0xaa, 0xb4, 0x91, 0xdb, 0x95, 0xb1, 0x09, + 0x1c, 0x25, 0xb6, 0x66, 0x6d, 0xe5, 0x81, 0xc4, 0x2e, 0xda, 0x6a, 0xa5, 0xd4, 0x76, 0xa0, 0x57, 0x28, 0xcb, 0x40, 0x83, 0x16, 0x35, 0xb5, 0x4b, 0xaf, 0x26, 0x9a, 0x17, 0x66, 0x38, 0x5b, 0x2f, 0x7a, 0xe9, 0xa9, 0x40, 0x81, 0x02, 0x6d, 0xaf, 0xfd, 0x27, 0x7a, 0x2b, 0x8a, 0xf6, 0x56, 0x04, 0x85, 0x2f, 0x05, 0x82, 0x5e, 0x92, 0x93, 0x50, 0x6f, 0x4e, 0x45, 0xd1, 0x4b, 0x81, 0x5e, 0x02, 0x14, 0x28, 0xc8, 0xe1, 0x3c, 0x38, 0x0f, 0xef, 0x48, 0xb1, 0x95, 0x22, 0xc8, 0x6d, 0x87, 0xfc, - 0x7d, 0x3f, 0x7e, 0x24, 0xbf, 0x8f, 0xdf, 0x6f, 0x38, 0x0b, 0xbe, 0x77, 0xf4, 0xb6, 0xab, 0x6a, - 0x56, 0xeb, 0xc8, 0x3b, 0x20, 0x8e, 0x49, 0x28, 0x71, 0x5b, 0x7d, 0x62, 0x76, 0x2d, 0xa7, 0x25, - 0x3a, 0xb0, 0xad, 0xb5, 0xb0, 0x6d, 0xbb, 0xad, 0xfe, 0xcd, 0x03, 0x42, 0xf1, 0x6a, 0xab, 0x47, - 0x4c, 0xe2, 0x60, 0x4a, 0xba, 0xaa, 0xed, 0x58, 0xd4, 0x82, 0x0b, 0x3e, 0x50, 0xc5, 0xb6, 0xa6, - 0x32, 0xa0, 0x2a, 0x80, 0x8b, 0x2b, 0x3d, 0x8d, 0x1e, 0x7a, 0x07, 0x6a, 0xc7, 0x32, 0x5a, 0x3d, - 0xab, 0x67, 0xb5, 0x38, 0xfe, 0xc0, 0x7b, 0xc4, 0x9f, 0xf8, 0x03, 0xff, 0xe5, 0xf3, 0x2c, 0x36, - 0x63, 0x03, 0x76, 0x2c, 0x87, 0xb4, 0xfa, 0x37, 0x93, 0x63, 0x2d, 0x5e, 0x8d, 0x61, 0x6c, 0x4b, - 0xd7, 0x3a, 0x03, 0xe1, 0x56, 0x1a, 0xfa, 0x46, 0x04, 0x35, 0x70, 0xe7, 0x50, 0x33, 0x89, 0x33, - 0x68, 0xd9, 0x47, 0x3d, 0xd6, 0xe0, 0xb6, 0x0c, 0x42, 0x71, 0xd6, 0x00, 0xad, 0x3c, 0x2b, 0xc7, - 0x33, 0xa9, 0x66, 0x90, 0x94, 0xc1, 0x5b, 0xa3, 0x0c, 0xdc, 0xce, 0x21, 0x31, 0x70, 0xca, 0xee, - 0xf5, 0x3c, 0x3b, 0x8f, 0x6a, 0x7a, 0x4b, 0x33, 0xa9, 0x4b, 0x9d, 0xa4, 0x51, 0xf3, 0x3f, 0x0a, - 0x80, 0xeb, 0x96, 0x49, 0x1d, 0x4b, 0xd7, 0x89, 0x83, 0x48, 0x5f, 0x73, 0x35, 0xcb, 0x84, 0x0f, - 0x41, 0x8d, 0xcd, 0xa7, 0x8b, 0x29, 0xae, 0x2b, 0x97, 0x95, 0xe5, 0xc9, 0xd5, 0x1b, 0x6a, 0xb4, - 0x29, 0x21, 0xbd, 0x6a, 0x1f, 0xf5, 0x58, 0x83, 0xab, 0x32, 0xb4, 0xda, 0xbf, 0xa9, 0xee, 0x1c, - 0x7c, 0x48, 0x3a, 0x74, 0x8b, 0x50, 0xdc, 0x86, 0x4f, 0x8e, 0x97, 0xce, 0x0d, 0x8f, 0x97, 0x40, - 0xd4, 0x86, 0x42, 0x56, 0xb8, 0x03, 0x2a, 0x9c, 0xbd, 0xc4, 0xd9, 0x57, 0x72, 0xd9, 0xc5, 0xa4, - 0x55, 0x84, 0x7f, 0xf2, 0xee, 0x63, 0x4a, 0x4c, 0xe6, 0x5e, 0xfb, 0xbc, 0xa0, 0xae, 0x6c, 0x60, - 0x8a, 0x11, 0x27, 0x82, 0xd7, 0x41, 0xcd, 0x11, 0xee, 0xd7, 0xcb, 0x97, 0x95, 0xe5, 0x72, 0xfb, - 0x82, 0x40, 0xd5, 0x82, 0x69, 0xa1, 0x10, 0xd1, 0x7c, 0xa2, 0x80, 0xf9, 0xf4, 0xbc, 0x37, 0x35, - 0x97, 0xc2, 0x1f, 0xa6, 0xe6, 0xae, 0x16, 0x9b, 0x3b, 0xb3, 0xe6, 0x33, 0x0f, 0x07, 0x0e, 0x5a, - 0x62, 0xf3, 0xde, 0x05, 0x55, 0x8d, 0x12, 0xc3, 0xad, 0x97, 0x2e, 0x97, 0x97, 0x27, 0x57, 0xaf, - 0xa9, 0x39, 0xb1, 0xae, 0xa6, 0xbd, 0x6b, 0x4f, 0x09, 0xde, 0xea, 0x3d, 0xc6, 0x80, 0x7c, 0xa2, - 0xe6, 0x2f, 0x4a, 0x60, 0x62, 0x03, 0x13, 0xc3, 0x32, 0xf7, 0x08, 0x3d, 0x83, 0x9d, 0xbb, 0x0b, - 0x2a, 0xae, 0x4d, 0x3a, 0x62, 0xe7, 0xae, 0xe4, 0x4e, 0x20, 0xf4, 0x69, 0xcf, 0x26, 0x9d, 0x68, - 0xcb, 0xd8, 0x13, 0xe2, 0x0c, 0x70, 0x17, 0x8c, 0xb9, 0x14, 0x53, 0xcf, 0xe5, 0x1b, 0x36, 0xb9, - 0xba, 0x5c, 0x80, 0x8b, 0xe3, 0xdb, 0xd3, 0x82, 0x6d, 0xcc, 0x7f, 0x46, 0x82, 0xa7, 0xf9, 0x8f, - 0x12, 0x80, 0x21, 0x76, 0xdd, 0x32, 0xbb, 0x1a, 0x65, 0xe1, 0x7c, 0x0b, 0x54, 0xe8, 0xc0, 0x26, - 0x7c, 0x41, 0x26, 0xda, 0x57, 0x02, 0x57, 0xee, 0x0f, 0x6c, 0xf2, 0xf9, 0xf1, 0xd2, 0x7c, 0xda, - 0x82, 0xf5, 0x20, 0x6e, 0x03, 0x37, 0x43, 0x27, 0x4b, 0xdc, 0xfa, 0x0d, 0x79, 0xe8, 0xcf, 0x8f, - 0x97, 0x32, 0x8e, 0x19, 0x35, 0x64, 0x92, 0x1d, 0x84, 0x7d, 0x00, 0x75, 0xec, 0xd2, 0xfb, 0x0e, - 0x36, 0x5d, 0x7f, 0x24, 0xcd, 0x20, 0x62, 0xfa, 0xaf, 0x15, 0xdb, 0x28, 0x66, 0xd1, 0x5e, 0x14, - 0x5e, 0xc0, 0xcd, 0x14, 0x1b, 0xca, 0x18, 0x01, 0x5e, 0x01, 0x63, 0x0e, 0xc1, 0xae, 0x65, 0xd6, - 0x2b, 0x7c, 0x16, 0xe1, 0x02, 0x22, 0xde, 0x8a, 0x44, 0x2f, 0xbc, 0x0a, 0xc6, 0x0d, 0xe2, 0xba, - 0xb8, 0x47, 0xea, 0x55, 0x0e, 0x9c, 0x11, 0xc0, 0xf1, 0x2d, 0xbf, 0x19, 0x05, 0xfd, 0xcd, 0xdf, - 0x2b, 0x60, 0x2a, 0x5c, 0xb9, 0x33, 0xc8, 0x9c, 0x3b, 0x72, 0xe6, 0x34, 0x47, 0x07, 0x4b, 0x4e, - 0xc2, 0x7c, 0x54, 0x8e, 0x39, 0xce, 0xc2, 0x11, 0xfe, 0x08, 0xd4, 0x5c, 0xa2, 0x93, 0x0e, 0xb5, - 0x1c, 0xe1, 0xf8, 0xeb, 0x05, 0x1d, 0xc7, 0x07, 0x44, 0xdf, 0x13, 0xa6, 0xed, 0xf3, 0xcc, 0xf3, - 0xe0, 0x09, 0x85, 0x94, 0xf0, 0x7d, 0x50, 0xa3, 0xc4, 0xb0, 0x75, 0x4c, 0x89, 0xc8, 0x9a, 0x97, - 0xe3, 0xce, 0xb3, 0x98, 0x61, 0x64, 0xbb, 0x56, 0xf7, 0xbe, 0x80, 0xf1, 0x94, 0x09, 0x17, 0x23, - 0x68, 0x45, 0x21, 0x0d, 0xb4, 0xc1, 0xb4, 0x67, 0x77, 0x19, 0x92, 0xb2, 0xe3, 0xbc, 0x37, 0x10, - 0x31, 0x74, 0x63, 0xf4, 0xaa, 0xec, 0x4b, 0x76, 0xed, 0x79, 0x31, 0xca, 0xb4, 0xdc, 0x8e, 0x12, - 0xfc, 0x70, 0x0d, 0xcc, 0x18, 0x9a, 0x89, 0x08, 0xee, 0x0e, 0xf6, 0x48, 0xc7, 0x32, 0xbb, 0x2e, - 0x0f, 0xa5, 0x6a, 0x7b, 0x41, 0x10, 0xcc, 0x6c, 0xc9, 0xdd, 0x28, 0x89, 0x87, 0x9b, 0x60, 0x2e, - 0x38, 0x80, 0xef, 0x6a, 0x2e, 0xb5, 0x9c, 0xc1, 0xa6, 0x66, 0x68, 0xb4, 0x3e, 0xc6, 0x79, 0xea, - 0xc3, 0xe3, 0xa5, 0x39, 0x94, 0xd1, 0x8f, 0x32, 0xad, 0x9a, 0xbf, 0x19, 0x03, 0x33, 0x89, 0x73, - 0x01, 0x3e, 0x00, 0xf3, 0x1d, 0xcf, 0x71, 0x88, 0x49, 0xb7, 0x3d, 0xe3, 0x80, 0x38, 0x7b, 0x9d, - 0x43, 0xd2, 0xf5, 0x74, 0xd2, 0xe5, 0xdb, 0x5a, 0x6d, 0x37, 0x84, 0xaf, 0xf3, 0xeb, 0x99, 0x28, - 0x94, 0x63, 0x0d, 0xdf, 0x03, 0xd0, 0xe4, 0x4d, 0x5b, 0x9a, 0xeb, 0x86, 0x9c, 0x25, 0xce, 0x19, - 0xa6, 0xe2, 0x76, 0x0a, 0x81, 0x32, 0xac, 0x98, 0x8f, 0x5d, 0xe2, 0x6a, 0x0e, 0xe9, 0x26, 0x7d, - 0x2c, 0xcb, 0x3e, 0x6e, 0x64, 0xa2, 0x50, 0x8e, 0x35, 0x7c, 0x13, 0x4c, 0xfa, 0xa3, 0xf1, 0x35, - 0x17, 0x9b, 0x33, 0x2b, 0xc8, 0x26, 0xb7, 0xa3, 0x2e, 0x14, 0xc7, 0xb1, 0xa9, 0x59, 0x07, 0x2e, - 0x71, 0xfa, 0xa4, 0x7b, 0xc7, 0x17, 0x07, 0xac, 0x82, 0x56, 0x79, 0x05, 0x0d, 0xa7, 0xb6, 0x93, - 0x42, 0xa0, 0x0c, 0x2b, 0x36, 0x35, 0x3f, 0x6a, 0x52, 0x53, 0x1b, 0x93, 0xa7, 0xb6, 0x9f, 0x89, - 0x42, 0x39, 0xd6, 0x2c, 0xf6, 0x7c, 0x97, 0xd7, 0xfa, 0x58, 0xd3, 0xf1, 0x81, 0x4e, 0xea, 0xe3, - 0x72, 0xec, 0x6d, 0xcb, 0xdd, 0x28, 0x89, 0x87, 0x77, 0xc0, 0x45, 0xbf, 0x69, 0xdf, 0xc4, 0x21, - 0x49, 0x8d, 0x93, 0xbc, 0x24, 0x48, 0x2e, 0x6e, 0x27, 0x01, 0x28, 0x6d, 0x03, 0x6f, 0x81, 0xe9, - 0x8e, 0xa5, 0xeb, 0x3c, 0x1e, 0xd7, 0x2d, 0xcf, 0xa4, 0xf5, 0x09, 0xce, 0x02, 0x59, 0x0e, 0xad, - 0x4b, 0x3d, 0x28, 0x81, 0x84, 0x3f, 0x06, 0xa0, 0x13, 0x14, 0x06, 0xb7, 0x0e, 0x46, 0x28, 0x80, - 0x74, 0x59, 0x8a, 0x2a, 0x73, 0xd8, 0xe4, 0xa2, 0x18, 0x65, 0xf3, 0x23, 0x05, 0x2c, 0xe4, 0x24, - 0x3a, 0xfc, 0xae, 0x54, 0x04, 0xaf, 0x25, 0x8a, 0xe0, 0xa5, 0x1c, 0xb3, 0x58, 0x25, 0x3c, 0x04, - 0x53, 0x4c, 0x90, 0x68, 0x66, 0xcf, 0x87, 0x88, 0xb3, 0xac, 0x95, 0x3b, 0x01, 0x14, 0x47, 0x47, - 0xa7, 0xf2, 0xc5, 0xe1, 0xf1, 0xd2, 0x94, 0xd4, 0x87, 0x64, 0xe2, 0xe6, 0x2f, 0x4b, 0x00, 0x6c, - 0x10, 0x5b, 0xb7, 0x06, 0x06, 0x31, 0xcf, 0x42, 0xd3, 0xdc, 0x93, 0x34, 0xcd, 0xab, 0xf9, 0x5b, - 0x12, 0x3a, 0x95, 0x2b, 0x6a, 0xde, 0x4f, 0x88, 0x9a, 0xab, 0x45, 0xc8, 0x9e, 0xad, 0x6a, 0x3e, - 0x29, 0x83, 0xd9, 0x08, 0x1c, 0xc9, 0x9a, 0xdb, 0xd2, 0x8e, 0xbe, 0x9a, 0xd8, 0xd1, 0x85, 0x0c, - 0x93, 0x17, 0xa6, 0x6b, 0x9e, 0xbf, 0xbe, 0x80, 0x1f, 0x82, 0x69, 0x26, 0x64, 0xfc, 0x90, 0xe0, - 0x32, 0x69, 0xec, 0xc4, 0x32, 0x29, 0x2c, 0x6e, 0x9b, 0x12, 0x13, 0x4a, 0x30, 0xe7, 0xc8, 0xb2, - 0xf1, 0x17, 0x2d, 0xcb, 0x9a, 0x7f, 0x50, 0xc0, 0x74, 0xb4, 0x4d, 0x67, 0x20, 0xa2, 0xee, 0xca, - 0x22, 0xea, 0xe5, 0x02, 0xc1, 0x99, 0xa3, 0xa2, 0x3e, 0xa9, 0xc4, 0x5d, 0xe7, 0x32, 0x6a, 0x99, - 0xbd, 0x82, 0xd9, 0xba, 0xd6, 0xc1, 0xae, 0xa8, 0xb7, 0xe7, 0xfd, 0xd7, 0x2f, 0xbf, 0x0d, 0x85, - 0xbd, 0x92, 0xe0, 0x2a, 0xbd, 0x58, 0xc1, 0x55, 0x7e, 0x3e, 0x82, 0xeb, 0x07, 0xa0, 0xe6, 0x06, - 0x52, 0xab, 0xc2, 0x29, 0xaf, 0x15, 0x4a, 0x6c, 0xa1, 0xb2, 0x42, 0xea, 0x50, 0x5f, 0x85, 0x74, - 0x59, 0xca, 0xaa, 0xfa, 0x65, 0x2a, 0x2b, 0x96, 0xcc, 0x36, 0xf6, 0x5c, 0xd2, 0xe5, 0x19, 0x50, - 0x8b, 0x92, 0x79, 0x97, 0xb7, 0x22, 0xd1, 0x0b, 0xf7, 0xc1, 0x82, 0xed, 0x58, 0x3d, 0x87, 0xb8, - 0xee, 0x06, 0xc1, 0x5d, 0x5d, 0x33, 0x49, 0x30, 0x01, 0xbf, 0x26, 0x5e, 0x1a, 0x1e, 0x2f, 0x2d, - 0xec, 0x66, 0x43, 0x50, 0x9e, 0x6d, 0xf3, 0xcf, 0x15, 0x70, 0x21, 0x79, 0x36, 0xe6, 0xc8, 0x14, - 0xe5, 0x54, 0x32, 0xe5, 0x7a, 0x2c, 0x4e, 0x7d, 0x0d, 0x17, 0xbb, 0x2a, 0x48, 0xc5, 0xea, 0x1a, - 0x98, 0x11, 0xb2, 0x24, 0xe8, 0x14, 0x42, 0x2d, 0xdc, 0x9e, 0x7d, 0xb9, 0x1b, 0x25, 0xf1, 0x4c, - 0x7c, 0x44, 0x9a, 0x22, 0x20, 0xa9, 0xc8, 0xe2, 0x63, 0x2d, 0x09, 0x40, 0x69, 0x1b, 0xb8, 0x05, - 0x66, 0x3d, 0x33, 0x4d, 0xe5, 0x87, 0xcb, 0x25, 0x41, 0x35, 0xbb, 0x9f, 0x86, 0xa0, 0x2c, 0x3b, - 0xf8, 0x50, 0xd2, 0x23, 0x63, 0xfc, 0x48, 0xb8, 0x5e, 0x20, 0xac, 0x0b, 0x0b, 0x12, 0x78, 0x1b, - 0x4c, 0x39, 0x5c, 0x73, 0x06, 0xae, 0xfa, 0xba, 0xed, 0x1b, 0xc2, 0x6c, 0x0a, 0xc5, 0x3b, 0x91, - 0x8c, 0xcd, 0x90, 0x5a, 0xb5, 0xa2, 0x52, 0xab, 0xf9, 0x27, 0x05, 0xc0, 0x74, 0x1e, 0x8e, 0xbc, - 0x09, 0x48, 0x59, 0xc4, 0x2a, 0xa6, 0x96, 0xad, 0x7f, 0x6e, 0x14, 0xd4, 0x3f, 0xd1, 0x81, 0x5a, - 0x4c, 0x00, 0x89, 0x65, 0x38, 0x9b, 0x4b, 0x9d, 0xa2, 0x02, 0x28, 0x72, 0xea, 0x39, 0x08, 0xa0, - 0x18, 0xd9, 0xb3, 0x05, 0xd0, 0x3f, 0x4b, 0x60, 0x36, 0x02, 0x17, 0x16, 0x40, 0x19, 0x26, 0x5f, - 0x5f, 0xec, 0x8c, 0xbe, 0xd8, 0x61, 0xa2, 0x24, 0x5a, 0xba, 0xff, 0x27, 0x51, 0x12, 0x79, 0x95, - 0x23, 0x4a, 0x7e, 0x57, 0x8a, 0xbb, 0xfe, 0x95, 0x17, 0x25, 0x5f, 0xfc, 0x4e, 0xa6, 0xf9, 0x97, - 0x32, 0xb8, 0x90, 0xcc, 0x43, 0xa9, 0x40, 0x2a, 0x23, 0x0b, 0xe4, 0x2e, 0x98, 0x7b, 0xe4, 0xe9, - 0xfa, 0x80, 0x2f, 0x43, 0xac, 0x4a, 0xfa, 0xa5, 0xf5, 0x9b, 0xc2, 0x72, 0xee, 0xfb, 0x19, 0x18, - 0x94, 0x69, 0x99, 0x53, 0xec, 0xcb, 0xa7, 0x2a, 0xf6, 0xa9, 0x0a, 0x54, 0x39, 0x41, 0x05, 0xca, - 0x2c, 0xdc, 0xd5, 0x53, 0x14, 0xee, 0x93, 0x55, 0xda, 0x8c, 0x83, 0x6b, 0xe4, 0xab, 0xff, 0xcf, - 0x15, 0x30, 0x9f, 0xfd, 0xc2, 0x0d, 0x75, 0x30, 0x6d, 0xe0, 0xc7, 0xf1, 0x8b, 0x8f, 0x51, 0x45, - 0xc4, 0xa3, 0x9a, 0xae, 0xfa, 0x9f, 0x8c, 0xd4, 0x7b, 0x26, 0xdd, 0x71, 0xf6, 0xa8, 0xa3, 0x99, - 0x3d, 0xbf, 0xf2, 0x6e, 0x49, 0x5c, 0x28, 0xc1, 0xdd, 0xfc, 0x4c, 0x01, 0x0b, 0x39, 0x95, 0xef, - 0x6c, 0x3d, 0x81, 0x1f, 0x80, 0x9a, 0x81, 0x1f, 0xef, 0x79, 0x4e, 0x2f, 0xab, 0x56, 0x17, 0x1b, - 0x87, 0x67, 0xf3, 0x96, 0x60, 0x41, 0x21, 0x5f, 0x73, 0x07, 0x5c, 0x96, 0x26, 0xc9, 0x32, 0x87, - 0x3c, 0xf2, 0x74, 0x9e, 0x44, 0x42, 0x6c, 0x5c, 0x03, 0x13, 0x36, 0x76, 0xa8, 0x16, 0x4a, 0xd5, - 0x6a, 0x7b, 0x6a, 0x78, 0xbc, 0x34, 0xb1, 0x1b, 0x34, 0xa2, 0xa8, 0xbf, 0xf9, 0x5f, 0x05, 0x54, - 0xf7, 0x3a, 0x58, 0x27, 0x67, 0x50, 0xed, 0x37, 0xa4, 0x6a, 0x9f, 0x7f, 0x93, 0xce, 0xfd, 0xc9, - 0x2d, 0xf4, 0x9b, 0x89, 0x42, 0xff, 0xca, 0x08, 0x9e, 0x67, 0xd7, 0xf8, 0x77, 0xc0, 0x44, 0x38, - 0xdc, 0xc9, 0x0e, 0xa0, 0xe6, 0x6f, 0x4b, 0x60, 0x32, 0x36, 0xc4, 0x09, 0x8f, 0xaf, 0x87, 0xd2, - 0xb1, 0xcf, 0x12, 0x73, 0xb5, 0xc8, 0x44, 0xd4, 0xe0, 0x88, 0x7f, 0xd7, 0xa4, 0x4e, 0xfc, 0x05, - 0x2f, 0x7d, 0xf2, 0x7f, 0x07, 0x4c, 0x53, 0xec, 0xf4, 0x08, 0x0d, 0xfa, 0xf8, 0x82, 0x4d, 0x44, - 0xb7, 0x13, 0xf7, 0xa5, 0x5e, 0x94, 0x40, 0x2f, 0xde, 0x06, 0x53, 0xd2, 0x60, 0xf0, 0x02, 0x28, - 0x1f, 0x91, 0x81, 0x2f, 0x7b, 0x10, 0xfb, 0x09, 0xe7, 0x40, 0xb5, 0x8f, 0x75, 0xcf, 0x8f, 0xf3, - 0x09, 0xe4, 0x3f, 0xdc, 0x2a, 0xbd, 0xad, 0x34, 0x7f, 0xc5, 0x16, 0x27, 0x0a, 0xce, 0x33, 0x88, - 0xae, 0xf7, 0xa4, 0xe8, 0xca, 0xff, 0xa8, 0x17, 0x4f, 0x99, 0xbc, 0x18, 0x43, 0x89, 0x18, 0x7b, - 0xad, 0x10, 0xdb, 0xb3, 0x23, 0xed, 0x5f, 0x25, 0x30, 0x17, 0x43, 0x47, 0x72, 0xf2, 0xdb, 0x92, - 0x9c, 0x5c, 0x4e, 0xc8, 0xc9, 0x7a, 0x96, 0xcd, 0xd7, 0x7a, 0x72, 0xb4, 0x9e, 0xfc, 0xa3, 0x02, - 0x66, 0x62, 0x6b, 0x77, 0x06, 0x82, 0xf2, 0x9e, 0x2c, 0x28, 0x5f, 0x29, 0x12, 0x34, 0x39, 0x8a, - 0xf2, 0xaf, 0x55, 0xc9, 0xf9, 0xaf, 0xbc, 0xa4, 0xfc, 0x29, 0x98, 0xeb, 0x5b, 0xba, 0x67, 0x90, - 0x75, 0x1d, 0x6b, 0x46, 0x00, 0x60, 0xaa, 0xa9, 0x9c, 0x7c, 0x97, 0x0b, 0xe9, 0x89, 0xe3, 0x6a, - 0x2e, 0x25, 0x26, 0x7d, 0x10, 0x59, 0x46, 0xba, 0xef, 0x41, 0x06, 0x1d, 0xca, 0x1c, 0x04, 0xbe, - 0x09, 0x26, 0x99, 0x7e, 0xd3, 0x3a, 0x64, 0x1b, 0x1b, 0x41, 0x60, 0x85, 0x9f, 0xb0, 0xf6, 0xa2, - 0x2e, 0x14, 0xc7, 0xc1, 0x43, 0x30, 0x6b, 0x5b, 0xdd, 0x2d, 0x6c, 0xe2, 0x1e, 0x61, 0x32, 0x63, - 0x97, 0xff, 0x8f, 0x87, 0x5f, 0x7e, 0x4d, 0xb4, 0xdf, 0x0a, 0x6e, 0x45, 0x76, 0xd3, 0x10, 0xf6, - 0x92, 0x98, 0xd1, 0xcc, 0x93, 0x3a, 0x8b, 0x12, 0x3a, 0xa9, 0xcf, 0xae, 0xfe, 0x1d, 0xf1, 0x6a, - 0x91, 0x08, 0x3b, 0xe5, 0x87, 0xd7, 0xbc, 0xbb, 0xbd, 0xda, 0xa9, 0xbe, 0x9a, 0xfe, 0xbb, 0x02, - 0x2e, 0xa6, 0x8e, 0xca, 0x2f, 0xf1, 0x76, 0x2d, 0x25, 0xcf, 0xcb, 0x27, 0x90, 0xe7, 0x6b, 0x60, - 0x46, 0x7c, 0xb0, 0x4d, 0xa8, 0xfb, 0xf0, 0xfd, 0x67, 0x5d, 0xee, 0x46, 0x49, 0x7c, 0xd6, 0xed, - 0x5e, 0xf5, 0x84, 0xb7, 0x7b, 0x71, 0x2f, 0xc4, 0x1f, 0x90, 0xfc, 0xd0, 0x4b, 0x7b, 0x21, 0xfe, - 0x87, 0x94, 0xc4, 0x33, 0x85, 0xe0, 0xb3, 0x86, 0x0c, 0xe3, 0xb2, 0x42, 0xd8, 0x97, 0x7a, 0x51, - 0x02, 0xfd, 0x85, 0x3e, 0x4a, 0xe2, 0x8c, 0x8f, 0x92, 0x2b, 0x45, 0xe2, 0xb9, 0xf8, 0xbb, 0xc9, - 0xdf, 0x14, 0xf0, 0x52, 0x6e, 0x22, 0xc0, 0x35, 0xa9, 0xec, 0xae, 0x24, 0xca, 0xee, 0xb7, 0x72, - 0x0d, 0x63, 0xb5, 0xd7, 0xc9, 0xbe, 0x9a, 0x7b, 0xa7, 0xd8, 0xd5, 0x5c, 0x86, 0x76, 0x1f, 0x7d, - 0x47, 0xd7, 0x5e, 0x79, 0xf2, 0xb4, 0x71, 0xee, 0xe3, 0xa7, 0x8d, 0x73, 0x9f, 0x3e, 0x6d, 0x9c, - 0xfb, 0xd9, 0xb0, 0xa1, 0x3c, 0x19, 0x36, 0x94, 0x8f, 0x87, 0x0d, 0xe5, 0xd3, 0x61, 0x43, 0xf9, - 0xfb, 0xb0, 0xa1, 0xfc, 0xfa, 0xb3, 0xc6, 0xb9, 0x0f, 0xc6, 0xc5, 0x88, 0xff, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0xe4, 0x8f, 0x6a, 0x57, 0x17, 0x29, 0x00, 0x00, + 0x7d, 0x3f, 0x7e, 0x24, 0xbf, 0x8f, 0xdf, 0x6f, 0x38, 0x0b, 0xbe, 0x77, 0xfc, 0xb6, 0xab, 0x6a, + 0x56, 0xeb, 0xd8, 0x3b, 0x24, 0x8e, 0x49, 0x28, 0x71, 0x5b, 0x7d, 0x62, 0x76, 0x2d, 0xa7, 0x25, + 0x3a, 0xb0, 0xad, 0xb5, 0xb0, 0x6d, 0xbb, 0xad, 0xfe, 0x8d, 0x43, 0x42, 0xf1, 0x5a, 0xab, 0x47, + 0x4c, 0xe2, 0x60, 0x4a, 0xba, 0xaa, 0xed, 0x58, 0xd4, 0x82, 0x8b, 0x3e, 0x50, 0xc5, 0xb6, 0xa6, + 0x32, 0xa0, 0x2a, 0x80, 0x4b, 0xab, 0x3d, 0x8d, 0x1e, 0x79, 0x87, 0x6a, 0xc7, 0x32, 0x5a, 0x3d, + 0xab, 0x67, 0xb5, 0x38, 0xfe, 0xd0, 0x7b, 0xc8, 0x9f, 0xf8, 0x03, 0xff, 0xe5, 0xf3, 0x2c, 0x35, + 0x63, 0x03, 0x76, 0x2c, 0x87, 0xb4, 0xfa, 0x37, 0x92, 0x63, 0x2d, 0xbd, 0x11, 0x61, 0x0c, 0xdc, + 0x39, 0xd2, 0x4c, 0xe2, 0x0c, 0x5a, 0xf6, 0x71, 0x8f, 0x35, 0xb8, 0x2d, 0x83, 0x50, 0x9c, 0x65, + 0xd5, 0xca, 0xb3, 0x72, 0x3c, 0x93, 0x6a, 0x06, 0x49, 0x19, 0xbc, 0x35, 0xca, 0xc0, 0xed, 0x1c, + 0x11, 0x03, 0xa7, 0xec, 0x5e, 0xcf, 0xb3, 0xf3, 0xa8, 0xa6, 0xb7, 0x34, 0x93, 0xba, 0xd4, 0x49, + 0x1a, 0x35, 0xff, 0xa3, 0x00, 0xb8, 0x61, 0x99, 0xd4, 0xb1, 0x74, 0x9d, 0x38, 0x88, 0xf4, 0x35, + 0x57, 0xb3, 0x4c, 0xf8, 0x00, 0xd4, 0xd8, 0x7c, 0xba, 0x98, 0xe2, 0xba, 0x72, 0x59, 0x59, 0x99, + 0x5a, 0xbb, 0xae, 0x46, 0x2b, 0x1d, 0xd2, 0xab, 0xf6, 0x71, 0x8f, 0x35, 0xb8, 0x2a, 0x43, 0xab, + 0xfd, 0x1b, 0xea, 0xee, 0xe1, 0x87, 0xa4, 0x43, 0xb7, 0x09, 0xc5, 0x6d, 0xf8, 0xf8, 0x64, 0x79, + 0x6c, 0x78, 0xb2, 0x0c, 0xa2, 0x36, 0x14, 0xb2, 0xc2, 0x5d, 0x50, 0xe1, 0xec, 0x25, 0xce, 0xbe, + 0x9a, 0xcb, 0x2e, 0x26, 0xad, 0x22, 0xfc, 0x93, 0x77, 0x1f, 0x51, 0x62, 0x32, 0xf7, 0xda, 0x2f, + 0x08, 0xea, 0xca, 0x26, 0xa6, 0x18, 0x71, 0x22, 0x78, 0x0d, 0xd4, 0x1c, 0xe1, 0x7e, 0xbd, 0x7c, + 0x59, 0x59, 0x29, 0xb7, 0x2f, 0x08, 0x54, 0x2d, 0x98, 0x16, 0x0a, 0x11, 0xcd, 0xc7, 0x0a, 0x58, + 0x48, 0xcf, 0x7b, 0x4b, 0x73, 0x29, 0xfc, 0x61, 0x6a, 0xee, 0x6a, 0xb1, 0xb9, 0x33, 0x6b, 0x3e, + 0xf3, 0x70, 0xe0, 0xa0, 0x25, 0x36, 0xef, 0x3d, 0x50, 0xd5, 0x28, 0x31, 0xdc, 0x7a, 0xe9, 0x72, + 0x79, 0x65, 0x6a, 0xed, 0xaa, 0x9a, 0x13, 0xc0, 0x6a, 0xda, 0xbb, 0xf6, 0xb4, 0xe0, 0xad, 0xde, + 0x65, 0x0c, 0xc8, 0x27, 0x6a, 0xfe, 0xa2, 0x04, 0x26, 0x37, 0x31, 0x31, 0x2c, 0x73, 0x9f, 0xd0, + 0x73, 0xd8, 0xb9, 0x3b, 0xa0, 0xe2, 0xda, 0xa4, 0x23, 0x76, 0xee, 0x4a, 0xee, 0x04, 0x42, 0x9f, + 0xf6, 0x6d, 0xd2, 0x89, 0xb6, 0x8c, 0x3d, 0x21, 0xce, 0x00, 0xf7, 0xc0, 0xb8, 0x4b, 0x31, 0xf5, + 0x5c, 0xbe, 0x61, 0x53, 0x6b, 0x2b, 0x05, 0xb8, 0x38, 0xbe, 0x3d, 0x23, 0xd8, 0xc6, 0xfd, 0x67, + 0x24, 0x78, 0x9a, 0xff, 0x28, 0x01, 0x18, 0x62, 0x37, 0x2c, 0xb3, 0xab, 0x51, 0x16, 0xce, 0x37, + 0x41, 0x85, 0x0e, 0x6c, 0xc2, 0x17, 0x64, 0xb2, 0x7d, 0x25, 0x70, 0xe5, 0xde, 0xc0, 0x26, 0x9f, + 0x9f, 0x2c, 0x2f, 0xa4, 0x2d, 0x58, 0x0f, 0xe2, 0x36, 0x70, 0x2b, 0x74, 0xb2, 0xc4, 0xad, 0xdf, + 0x90, 0x87, 0xfe, 0xfc, 0x64, 0x39, 0xe3, 0xec, 0x50, 0x43, 0x26, 0xd9, 0x41, 0xd8, 0x07, 0x50, + 0xc7, 0x2e, 0xbd, 0xe7, 0x60, 0xd3, 0xf5, 0x47, 0xd2, 0x0c, 0x22, 0xa6, 0xff, 0x5a, 0xb1, 0x8d, + 0x62, 0x16, 0xed, 0x25, 0xe1, 0x05, 0xdc, 0x4a, 0xb1, 0xa1, 0x8c, 0x11, 0xe0, 0x15, 0x30, 0xee, + 0x10, 0xec, 0x5a, 0x66, 0xbd, 0xc2, 0x67, 0x11, 0x2e, 0x20, 0xe2, 0xad, 0x48, 0xf4, 0xc2, 0x57, + 0xc1, 0x84, 0x41, 0x5c, 0x17, 0xf7, 0x48, 0xbd, 0xca, 0x81, 0xb3, 0x02, 0x38, 0xb1, 0xed, 0x37, + 0xa3, 0xa0, 0xbf, 0xf9, 0x7b, 0x05, 0x4c, 0x87, 0x2b, 0x77, 0x0e, 0x99, 0x73, 0x5b, 0xce, 0x9c, + 0xe6, 0xe8, 0x60, 0xc9, 0x49, 0x98, 0x8f, 0xca, 0x31, 0xc7, 0x59, 0x38, 0xc2, 0x1f, 0x81, 0x9a, + 0x4b, 0x74, 0xd2, 0xa1, 0x96, 0x23, 0x1c, 0x7f, 0xbd, 0xa0, 0xe3, 0xf8, 0x90, 0xe8, 0xfb, 0xc2, + 0xb4, 0xfd, 0x02, 0xf3, 0x3c, 0x78, 0x42, 0x21, 0x25, 0x7c, 0x1f, 0xd4, 0x28, 0x31, 0x6c, 0x1d, + 0x53, 0x22, 0xb2, 0xe6, 0xa5, 0xb8, 0xf3, 0x2c, 0x66, 0x18, 0xd9, 0x9e, 0xd5, 0xbd, 0x27, 0x60, + 0x3c, 0x65, 0xc2, 0xc5, 0x08, 0x5a, 0x51, 0x48, 0x03, 0x6d, 0x30, 0xe3, 0xd9, 0x5d, 0x86, 0xa4, + 0xec, 0x38, 0xef, 0x0d, 0x44, 0x0c, 0x5d, 0x1f, 0xbd, 0x2a, 0x07, 0x92, 0x5d, 0x7b, 0x41, 0x8c, + 0x32, 0x23, 0xb7, 0xa3, 0x04, 0x3f, 0x5c, 0x07, 0xb3, 0x86, 0x66, 0x22, 0x82, 0xbb, 0x83, 0x7d, + 0xd2, 0xb1, 0xcc, 0xae, 0xcb, 0x43, 0xa9, 0xda, 0x5e, 0x14, 0x04, 0xb3, 0xdb, 0x72, 0x37, 0x4a, + 0xe2, 0xe1, 0x16, 0x98, 0x0f, 0x0e, 0xe0, 0x3b, 0x9a, 0x4b, 0x2d, 0x67, 0xb0, 0xa5, 0x19, 0x1a, + 0xad, 0x8f, 0x73, 0x9e, 0xfa, 0xf0, 0x64, 0x79, 0x1e, 0x65, 0xf4, 0xa3, 0x4c, 0xab, 0xe6, 0x6f, + 0xc6, 0xc1, 0x6c, 0xe2, 0x5c, 0x80, 0xf7, 0xc1, 0x42, 0xc7, 0x73, 0x1c, 0x62, 0xd2, 0x1d, 0xcf, + 0x38, 0x24, 0xce, 0x7e, 0xe7, 0x88, 0x74, 0x3d, 0x9d, 0x74, 0xf9, 0xb6, 0x56, 0xdb, 0x0d, 0xe1, + 0xeb, 0xc2, 0x46, 0x26, 0x0a, 0xe5, 0x58, 0xc3, 0xf7, 0x00, 0x34, 0x79, 0xd3, 0xb6, 0xe6, 0xba, + 0x21, 0x67, 0x89, 0x73, 0x86, 0xa9, 0xb8, 0x93, 0x42, 0xa0, 0x0c, 0x2b, 0xe6, 0x63, 0x97, 0xb8, + 0x9a, 0x43, 0xba, 0x49, 0x1f, 0xcb, 0xb2, 0x8f, 0x9b, 0x99, 0x28, 0x94, 0x63, 0x0d, 0xdf, 0x04, + 0x53, 0xfe, 0x68, 0x7c, 0xcd, 0xc5, 0xe6, 0xcc, 0x09, 0xb2, 0xa9, 0x9d, 0xa8, 0x0b, 0xc5, 0x71, + 0x6c, 0x6a, 0xd6, 0xa1, 0x4b, 0x9c, 0x3e, 0xe9, 0xde, 0xf6, 0xc5, 0x01, 0xab, 0xa0, 0x55, 0x5e, + 0x41, 0xc3, 0xa9, 0xed, 0xa6, 0x10, 0x28, 0xc3, 0x8a, 0x4d, 0xcd, 0x8f, 0x9a, 0xd4, 0xd4, 0xc6, + 0xe5, 0xa9, 0x1d, 0x64, 0xa2, 0x50, 0x8e, 0x35, 0x8b, 0x3d, 0xdf, 0xe5, 0xf5, 0x3e, 0xd6, 0x74, + 0x7c, 0xa8, 0x93, 0xfa, 0x84, 0x1c, 0x7b, 0x3b, 0x72, 0x37, 0x4a, 0xe2, 0xe1, 0x6d, 0x70, 0xd1, + 0x6f, 0x3a, 0x30, 0x71, 0x48, 0x52, 0xe3, 0x24, 0x2f, 0x0a, 0x92, 0x8b, 0x3b, 0x49, 0x00, 0x4a, + 0xdb, 0xc0, 0x9b, 0x60, 0xa6, 0x63, 0xe9, 0x3a, 0x8f, 0xc7, 0x0d, 0xcb, 0x33, 0x69, 0x7d, 0x92, + 0xb3, 0x40, 0x96, 0x43, 0x1b, 0x52, 0x0f, 0x4a, 0x20, 0xe1, 0x8f, 0x01, 0xe8, 0x04, 0x85, 0xc1, + 0xad, 0x83, 0x11, 0x0a, 0x20, 0x5d, 0x96, 0xa2, 0xca, 0x1c, 0x36, 0xb9, 0x28, 0x46, 0xd9, 0xfc, + 0x48, 0x01, 0x8b, 0x39, 0x89, 0x0e, 0xbf, 0x2b, 0x15, 0xc1, 0xab, 0x89, 0x22, 0x78, 0x29, 0xc7, + 0x2c, 0x56, 0x09, 0x8f, 0xc0, 0x34, 0x13, 0x24, 0x9a, 0xd9, 0xf3, 0x21, 0xe2, 0x2c, 0x6b, 0xe5, + 0x4e, 0x00, 0xc5, 0xd1, 0xd1, 0xa9, 0x7c, 0x71, 0x78, 0xb2, 0x3c, 0x2d, 0xf5, 0x21, 0x99, 0xb8, + 0xf9, 0xcb, 0x12, 0x00, 0x9b, 0xc4, 0xd6, 0xad, 0x81, 0x41, 0xcc, 0xf3, 0xd0, 0x34, 0x77, 0x25, + 0x4d, 0xf3, 0x4a, 0xfe, 0x96, 0x84, 0x4e, 0xe5, 0x8a, 0x9a, 0xf7, 0x13, 0xa2, 0xe6, 0xd5, 0x22, + 0x64, 0x4f, 0x57, 0x35, 0x9f, 0x94, 0xc1, 0x5c, 0x04, 0x8e, 0x64, 0xcd, 0x2d, 0x69, 0x47, 0x5f, + 0x49, 0xec, 0xe8, 0x62, 0x86, 0xc9, 0x73, 0xd3, 0x35, 0xcf, 0x5e, 0x5f, 0xc0, 0x0f, 0xc1, 0x0c, + 0x13, 0x32, 0x7e, 0x48, 0x70, 0x99, 0x34, 0x7e, 0x6a, 0x99, 0x14, 0x16, 0xb7, 0x2d, 0x89, 0x09, + 0x25, 0x98, 0x73, 0x64, 0xd9, 0xc4, 0xf3, 0x96, 0x65, 0xcd, 0x3f, 0x28, 0x60, 0x26, 0xda, 0xa6, + 0x73, 0x10, 0x51, 0x77, 0x64, 0x11, 0xf5, 0x52, 0x81, 0xe0, 0xcc, 0x51, 0x51, 0x9f, 0x54, 0xe2, + 0xae, 0x73, 0x19, 0xb5, 0xc2, 0x5e, 0xc1, 0x6c, 0x5d, 0xeb, 0x60, 0x57, 0xd4, 0xdb, 0x17, 0xfc, + 0xd7, 0x2f, 0xbf, 0x0d, 0x85, 0xbd, 0x92, 0xe0, 0x2a, 0x3d, 0x5f, 0xc1, 0x55, 0x7e, 0x36, 0x82, + 0xeb, 0x07, 0xa0, 0xe6, 0x06, 0x52, 0xab, 0xc2, 0x29, 0xaf, 0x16, 0x4a, 0x6c, 0xa1, 0xb2, 0x42, + 0xea, 0x50, 0x5f, 0x85, 0x74, 0x59, 0xca, 0xaa, 0xfa, 0x65, 0x2a, 0x2b, 0x96, 0xcc, 0x36, 0xf6, + 0x5c, 0xd2, 0xe5, 0x19, 0x50, 0x8b, 0x92, 0x79, 0x8f, 0xb7, 0x22, 0xd1, 0x0b, 0x0f, 0xc0, 0xa2, + 0xed, 0x58, 0x3d, 0x87, 0xb8, 0xee, 0x26, 0xc1, 0x5d, 0x5d, 0x33, 0x49, 0x30, 0x01, 0xbf, 0x26, + 0x5e, 0x1a, 0x9e, 0x2c, 0x2f, 0xee, 0x65, 0x43, 0x50, 0x9e, 0x6d, 0xf3, 0xcf, 0x15, 0x70, 0x21, + 0x79, 0x36, 0xe6, 0xc8, 0x14, 0xe5, 0x4c, 0x32, 0xe5, 0x5a, 0x2c, 0x4e, 0x7d, 0x0d, 0x17, 0xbb, + 0x2a, 0x48, 0xc5, 0xea, 0x3a, 0x98, 0x15, 0xb2, 0x24, 0xe8, 0x14, 0x42, 0x2d, 0xdc, 0x9e, 0x03, + 0xb9, 0x1b, 0x25, 0xf1, 0x4c, 0x7c, 0x44, 0x9a, 0x22, 0x20, 0xa9, 0xc8, 0xe2, 0x63, 0x3d, 0x09, + 0x40, 0x69, 0x1b, 0xb8, 0x0d, 0xe6, 0x3c, 0x33, 0x4d, 0xe5, 0x87, 0xcb, 0x25, 0x41, 0x35, 0x77, + 0x90, 0x86, 0xa0, 0x2c, 0x3b, 0xf8, 0x40, 0xd2, 0x23, 0xe3, 0xfc, 0x48, 0xb8, 0x56, 0x20, 0xac, + 0x0b, 0x0b, 0x12, 0x78, 0x0b, 0x4c, 0x3b, 0x5c, 0x73, 0x06, 0xae, 0xfa, 0xba, 0xed, 0x1b, 0xc2, + 0x6c, 0x1a, 0xc5, 0x3b, 0x91, 0x8c, 0xcd, 0x90, 0x5a, 0xb5, 0xa2, 0x52, 0xab, 0xf9, 0x27, 0x05, + 0xc0, 0x74, 0x1e, 0x8e, 0xbc, 0x09, 0x48, 0x59, 0xc4, 0x2a, 0xa6, 0x96, 0xad, 0x7f, 0xae, 0x17, + 0xd4, 0x3f, 0xd1, 0x81, 0x5a, 0x4c, 0x00, 0x89, 0x65, 0x38, 0x9f, 0x4b, 0x9d, 0xa2, 0x02, 0x28, + 0x72, 0xea, 0x19, 0x08, 0xa0, 0x18, 0xd9, 0xd3, 0x05, 0xd0, 0x3f, 0x4b, 0x60, 0x2e, 0x02, 0x17, + 0x16, 0x40, 0x19, 0x26, 0x5f, 0x5f, 0xec, 0x8c, 0xbe, 0xd8, 0x61, 0xa2, 0x24, 0x5a, 0xba, 0xff, + 0x27, 0x51, 0x12, 0x79, 0x95, 0x23, 0x4a, 0x7e, 0x57, 0x8a, 0xbb, 0xfe, 0x95, 0x17, 0x25, 0x5f, + 0xfc, 0x4e, 0xa6, 0xf9, 0x97, 0x32, 0xb8, 0x90, 0xcc, 0x43, 0xa9, 0x40, 0x2a, 0x23, 0x0b, 0xe4, + 0x1e, 0x98, 0x7f, 0xe8, 0xe9, 0xfa, 0x80, 0x2f, 0x43, 0xac, 0x4a, 0xfa, 0xa5, 0xf5, 0x9b, 0xc2, + 0x72, 0xfe, 0xfb, 0x19, 0x18, 0x94, 0x69, 0x99, 0x53, 0xec, 0xcb, 0x67, 0x2a, 0xf6, 0xa9, 0x0a, + 0x54, 0x39, 0x45, 0x05, 0xca, 0x2c, 0xdc, 0xd5, 0x33, 0x14, 0xee, 0xd3, 0x55, 0xda, 0x8c, 0x83, + 0x6b, 0xe4, 0xab, 0xff, 0xcf, 0x15, 0xb0, 0x90, 0xfd, 0xc2, 0x0d, 0x75, 0x30, 0x63, 0xe0, 0x47, + 0xf1, 0x8b, 0x8f, 0x51, 0x45, 0xc4, 0xa3, 0x9a, 0xae, 0xfa, 0x9f, 0x8c, 0xd4, 0xbb, 0x26, 0xdd, + 0x75, 0xf6, 0xa9, 0xa3, 0x99, 0x3d, 0xbf, 0xf2, 0x6e, 0x4b, 0x5c, 0x28, 0xc1, 0xdd, 0xfc, 0x4c, + 0x01, 0x8b, 0x39, 0x95, 0xef, 0x7c, 0x3d, 0x81, 0x1f, 0x80, 0x9a, 0x81, 0x1f, 0xed, 0x7b, 0x4e, + 0x2f, 0xab, 0x56, 0x17, 0x1b, 0x87, 0x67, 0xf3, 0xb6, 0x60, 0x41, 0x21, 0x5f, 0x73, 0x17, 0x5c, + 0x96, 0x26, 0xc9, 0x32, 0x87, 0x3c, 0xf4, 0x74, 0x9e, 0x44, 0x42, 0x6c, 0x5c, 0x05, 0x93, 0x36, + 0x76, 0xa8, 0x16, 0x4a, 0xd5, 0x6a, 0x7b, 0x7a, 0x78, 0xb2, 0x3c, 0xb9, 0x17, 0x34, 0xa2, 0xa8, + 0xbf, 0xf9, 0x5f, 0x05, 0x54, 0xf7, 0x3b, 0x58, 0x27, 0xe7, 0x50, 0xed, 0x37, 0xa5, 0x6a, 0x9f, + 0x7f, 0x93, 0xce, 0xfd, 0xc9, 0x2d, 0xf4, 0x5b, 0x89, 0x42, 0xff, 0xf2, 0x08, 0x9e, 0xa7, 0xd7, + 0xf8, 0x77, 0xc0, 0x64, 0x38, 0xdc, 0xe9, 0x0e, 0xa0, 0xe6, 0x6f, 0x4b, 0x60, 0x2a, 0x36, 0xc4, + 0x29, 0x8f, 0xaf, 0x07, 0xd2, 0xb1, 0xcf, 0x12, 0x73, 0xad, 0xc8, 0x44, 0xd4, 0xe0, 0x88, 0x7f, + 0xd7, 0xa4, 0x4e, 0xfc, 0x05, 0x2f, 0x7d, 0xf2, 0x7f, 0x07, 0xcc, 0x50, 0xec, 0xf4, 0x08, 0x0d, + 0xfa, 0xf8, 0x82, 0x4d, 0x46, 0xb7, 0x13, 0xf7, 0xa4, 0x5e, 0x94, 0x40, 0x2f, 0xdd, 0x02, 0xd3, + 0xd2, 0x60, 0xf0, 0x02, 0x28, 0x1f, 0x93, 0x81, 0x2f, 0x7b, 0x10, 0xfb, 0x09, 0xe7, 0x41, 0xb5, + 0x8f, 0x75, 0xcf, 0x8f, 0xf3, 0x49, 0xe4, 0x3f, 0xdc, 0x2c, 0xbd, 0xad, 0x34, 0x7f, 0xc5, 0x16, + 0x27, 0x0a, 0xce, 0x73, 0x88, 0xae, 0xf7, 0xa4, 0xe8, 0xca, 0xff, 0xa8, 0x17, 0x4f, 0x99, 0xbc, + 0x18, 0x43, 0x89, 0x18, 0x7b, 0xad, 0x10, 0xdb, 0xd3, 0x23, 0xed, 0x5f, 0x25, 0x30, 0x1f, 0x43, + 0x47, 0x72, 0xf2, 0xdb, 0x92, 0x9c, 0x5c, 0x49, 0xc8, 0xc9, 0x7a, 0x96, 0xcd, 0xd7, 0x7a, 0x72, + 0xb4, 0x9e, 0xfc, 0xa3, 0x02, 0x66, 0x63, 0x6b, 0x77, 0x0e, 0x82, 0xf2, 0xae, 0x2c, 0x28, 0x5f, + 0x2e, 0x12, 0x34, 0x39, 0x8a, 0xf2, 0xaf, 0x55, 0xc9, 0xf9, 0xaf, 0xbc, 0xa4, 0xfc, 0x29, 0x98, + 0xef, 0x5b, 0xba, 0x67, 0x90, 0x0d, 0x1d, 0x6b, 0x46, 0x00, 0x60, 0xaa, 0xa9, 0x9c, 0x7c, 0x97, + 0x0b, 0xe9, 0x89, 0xe3, 0x6a, 0x2e, 0x25, 0x26, 0xbd, 0x1f, 0x59, 0x46, 0xba, 0xef, 0x7e, 0x06, + 0x1d, 0xca, 0x1c, 0x04, 0xbe, 0x09, 0xa6, 0x98, 0x7e, 0xd3, 0x3a, 0x64, 0x07, 0x1b, 0x41, 0x60, + 0x85, 0x9f, 0xb0, 0xf6, 0xa3, 0x2e, 0x14, 0xc7, 0xc1, 0x23, 0x30, 0x67, 0x5b, 0xdd, 0x6d, 0x6c, + 0xe2, 0x1e, 0x61, 0x32, 0x63, 0xcf, 0xd2, 0xb5, 0xce, 0x80, 0x5f, 0x7e, 0x4d, 0xb6, 0xdf, 0x0a, + 0x6e, 0x45, 0xf6, 0xd2, 0x10, 0xf6, 0x92, 0x98, 0xd1, 0xcc, 0x93, 0x3a, 0x8b, 0x12, 0x3a, 0xa9, + 0xcf, 0xae, 0xfe, 0x1d, 0xf1, 0x5a, 0x91, 0x08, 0x3b, 0xe3, 0x87, 0xd7, 0xbc, 0xbb, 0xbd, 0xda, + 0x99, 0xbe, 0x9a, 0xfe, 0xbb, 0x02, 0x2e, 0xa6, 0x8e, 0xca, 0x2f, 0xf1, 0x76, 0x2d, 0x25, 0xcf, + 0xcb, 0xa7, 0x90, 0xe7, 0xeb, 0x60, 0x56, 0x7c, 0xb0, 0x4d, 0xa8, 0xfb, 0xf0, 0xfd, 0x67, 0x43, + 0xee, 0x46, 0x49, 0x7c, 0xd6, 0xed, 0x5e, 0xf5, 0x94, 0xb7, 0x7b, 0x71, 0x2f, 0xc4, 0x1f, 0x90, + 0xfc, 0xd0, 0x4b, 0x7b, 0x21, 0xfe, 0x87, 0x94, 0xc4, 0x33, 0x85, 0xe0, 0xb3, 0x86, 0x0c, 0x13, + 0xb2, 0x42, 0x38, 0x90, 0x7a, 0x51, 0x02, 0xfd, 0x85, 0x3e, 0x4a, 0xe2, 0x8c, 0x8f, 0x92, 0xab, + 0x45, 0xe2, 0xb9, 0xf8, 0xbb, 0xc9, 0xdf, 0x14, 0xf0, 0x62, 0x6e, 0x22, 0xc0, 0x75, 0xa9, 0xec, + 0xae, 0x26, 0xca, 0xee, 0xb7, 0x72, 0x0d, 0x63, 0xb5, 0xd7, 0xc9, 0xbe, 0x9a, 0x7b, 0xa7, 0xd8, + 0xd5, 0x5c, 0x86, 0x76, 0x1f, 0x7d, 0x47, 0xd7, 0x5e, 0x7d, 0xfc, 0xa4, 0x31, 0xf6, 0xf1, 0x93, + 0xc6, 0xd8, 0xa7, 0x4f, 0x1a, 0x63, 0x3f, 0x1b, 0x36, 0x94, 0xc7, 0xc3, 0x86, 0xf2, 0xf1, 0xb0, + 0xa1, 0x7c, 0x3a, 0x6c, 0x28, 0x7f, 0x1f, 0x36, 0x94, 0x5f, 0x7f, 0xd6, 0x18, 0xfb, 0x60, 0x42, + 0x8c, 0xf8, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x85, 0x43, 0x0a, 0xec, 0x28, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.proto b/vendor/k8s.io/api/apps/v1beta2/generated.proto index 7327c336..cc3656d2 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta2/generated.proto @@ -22,7 +22,6 @@ syntax = 'proto2'; package k8s.io.api.apps.v1beta2; import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/api/policy/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; diff --git a/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go b/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go index a3bd8afd..8a0bad22 100644 --- a/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1beta2 import ( - core_v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" intstr "k8s.io/apimachinery/pkg/util/intstr" @@ -170,23 +170,15 @@ func (in *DaemonSetSpec) DeepCopyInto(out *DaemonSetSpec) { *out = *in if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) in.UpdateStrategy.DeepCopyInto(&out.UpdateStrategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -206,12 +198,8 @@ func (in *DaemonSetStatus) DeepCopyInto(out *DaemonSetStatus) { *out = *in if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -238,12 +226,8 @@ func (in *DaemonSetUpdateStrategy) DeepCopyInto(out *DaemonSetUpdateStrategy) { *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateDaemonSet) - (*in).DeepCopyInto(*out) - } + *out = new(RollingUpdateDaemonSet) + (*in).DeepCopyInto(*out) } return } @@ -342,41 +326,25 @@ func (in *DeploymentSpec) DeepCopyInto(out *DeploymentSpec) { *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) in.Strategy.DeepCopyInto(&out.Strategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.ProgressDeadlineSeconds != nil { in, out := &in.ProgressDeadlineSeconds, &out.ProgressDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -403,12 +371,8 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { } if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -428,12 +392,8 @@ func (in *DeploymentStrategy) DeepCopyInto(out *DeploymentStrategy) { *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateDeployment) - (*in).DeepCopyInto(*out) - } + *out = new(RollingUpdateDeployment) + (*in).DeepCopyInto(*out) } return } @@ -531,21 +491,13 @@ func (in *ReplicaSetSpec) DeepCopyInto(out *ReplicaSetSpec) { *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) return @@ -589,12 +541,8 @@ func (in *RollingUpdateDaemonSet) DeepCopyInto(out *RollingUpdateDaemonSet) { *out = *in if in.MaxUnavailable != nil { in, out := &in.MaxUnavailable, &out.MaxUnavailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -614,21 +562,13 @@ func (in *RollingUpdateDeployment) DeepCopyInto(out *RollingUpdateDeployment) { *out = *in if in.MaxUnavailable != nil { in, out := &in.MaxUnavailable, &out.MaxUnavailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } if in.MaxSurge != nil { in, out := &in.MaxSurge, &out.MaxSurge - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -648,12 +588,8 @@ func (in *RollingUpdateStatefulSetStrategy) DeepCopyInto(out *RollingUpdateState *out = *in if in.Partition != nil { in, out := &in.Partition, &out.Partition - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -818,26 +754,18 @@ func (in *StatefulSetSpec) DeepCopyInto(out *StatefulSetSpec) { *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) if in.VolumeClaimTemplates != nil { in, out := &in.VolumeClaimTemplates, &out.VolumeClaimTemplates - *out = make([]core_v1.PersistentVolumeClaim, len(*in)) + *out = make([]corev1.PersistentVolumeClaim, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -845,12 +773,8 @@ func (in *StatefulSetSpec) DeepCopyInto(out *StatefulSetSpec) { in.UpdateStrategy.DeepCopyInto(&out.UpdateStrategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -870,12 +794,8 @@ func (in *StatefulSetStatus) DeepCopyInto(out *StatefulSetStatus) { *out = *in if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -902,12 +822,8 @@ func (in *StatefulSetUpdateStrategy) DeepCopyInto(out *StatefulSetUpdateStrategy *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateStatefulSetStrategy) - (*in).DeepCopyInto(*out) - } + *out = new(RollingUpdateStatefulSetStrategy) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/api/authentication/v1/BUILD b/vendor/k8s.io/api/authentication/v1/BUILD index 26e557e4..de7f9440 100644 --- a/vendor/k8s.io/api/authentication/v1/BUILD +++ b/vendor/k8s.io/api/authentication/v1/BUILD @@ -15,14 +15,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authentication/v1", importpath = "k8s.io/api/authentication/v1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], ) @@ -38,9 +39,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authentication/v1/generated.pb.go b/vendor/k8s.io/api/authentication/v1/generated.pb.go index 29697280..2ce2e2d7 100644 --- a/vendor/k8s.io/api/authentication/v1/generated.pb.go +++ b/vendor/k8s.io/api/authentication/v1/generated.pb.go @@ -2087,62 +2087,61 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 905 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xf6, 0xfa, 0x47, 0x64, 0x8f, 0x9b, 0x90, 0x4c, 0xa9, 0x64, 0x05, 0xb0, 0x8d, 0x91, 0x90, - 0x05, 0x74, 0xb7, 0x36, 0xa8, 0x54, 0x45, 0x42, 0xca, 0x12, 0x0b, 0x2c, 0x04, 0xad, 0xa6, 0x4d, - 0x40, 0x9c, 0x18, 0xdb, 0x2f, 0xce, 0xe0, 0xee, 0xec, 0x32, 0x3b, 0x6b, 0xea, 0x5b, 0xff, 0x04, - 0x8e, 0x20, 0x71, 0xe0, 0x8f, 0x40, 0xe2, 0xc8, 0x35, 0xc7, 0x8a, 0x53, 0x0f, 0xc8, 0x22, 0xcb, - 0xbf, 0xc0, 0x89, 0x13, 0x9a, 0xd9, 0x89, 0xd7, 0x3f, 0x12, 0xc7, 0xa7, 0xde, 0x3c, 0xef, 0x7d, - 0xef, 0x9b, 0xf7, 0xbe, 0xf9, 0xfc, 0x16, 0x75, 0x46, 0xf7, 0x42, 0x9b, 0xf9, 0xce, 0x28, 0xea, - 0x81, 0xe0, 0x20, 0x21, 0x74, 0xc6, 0xc0, 0x07, 0xbe, 0x70, 0x4c, 0x82, 0x06, 0xcc, 0xa1, 0x91, - 0x3c, 0x05, 0x2e, 0x59, 0x9f, 0x4a, 0xe6, 0x73, 0x67, 0xdc, 0x72, 0x86, 0xc0, 0x41, 0x50, 0x09, - 0x03, 0x3b, 0x10, 0xbe, 0xf4, 0xf1, 0xeb, 0x09, 0xda, 0xa6, 0x01, 0xb3, 0x17, 0xd1, 0xf6, 0xb8, - 0xb5, 0x7f, 0x7b, 0xc8, 0xe4, 0x69, 0xd4, 0xb3, 0xfb, 0xbe, 0xe7, 0x0c, 0xfd, 0xa1, 0xef, 0xe8, - 0xa2, 0x5e, 0x74, 0xa2, 0x4f, 0xfa, 0xa0, 0x7f, 0x25, 0x64, 0xfb, 0x1f, 0xa4, 0x57, 0x7b, 0xb4, - 0x7f, 0xca, 0x38, 0x88, 0x89, 0x13, 0x8c, 0x86, 0x2a, 0x10, 0x3a, 0x1e, 0x48, 0x7a, 0x49, 0x0b, - 0xfb, 0xce, 0x55, 0x55, 0x22, 0xe2, 0x92, 0x79, 0xb0, 0x52, 0x70, 0xf7, 0xba, 0x82, 0xb0, 0x7f, - 0x0a, 0x1e, 0x5d, 0xa9, 0x7b, 0xff, 0xaa, 0xba, 0x48, 0xb2, 0x27, 0x0e, 0xe3, 0x32, 0x94, 0x62, - 0xb9, 0xa8, 0xf1, 0xa7, 0x85, 0x5e, 0x75, 0xfd, 0x88, 0x0f, 0x1e, 0xf4, 0xbe, 0x83, 0xbe, 0x24, - 0x70, 0x02, 0x02, 0x78, 0x1f, 0x70, 0x1d, 0xe5, 0x47, 0x8c, 0x0f, 0x2a, 0x56, 0xdd, 0x6a, 0x96, - 0xdc, 0x1b, 0x67, 0xd3, 0x5a, 0x26, 0x9e, 0xd6, 0xf2, 0x9f, 0x33, 0x3e, 0x20, 0x3a, 0x83, 0xdb, - 0x08, 0xd1, 0x87, 0xdd, 0x63, 0x10, 0x21, 0xf3, 0x79, 0x25, 0xab, 0x71, 0xd8, 0xe0, 0xd0, 0xc1, - 0x2c, 0x43, 0xe6, 0x50, 0x8a, 0x95, 0x53, 0x0f, 0x2a, 0xb9, 0x45, 0xd6, 0x2f, 0xa9, 0x07, 0x44, - 0x67, 0xb0, 0x8b, 0x72, 0x51, 0xf7, 0xb0, 0x92, 0xd7, 0x80, 0x3b, 0x06, 0x90, 0x3b, 0xea, 0x1e, - 0xfe, 0x37, 0xad, 0xbd, 0x79, 0xd5, 0x84, 0x72, 0x12, 0x40, 0x68, 0x1f, 0x75, 0x0f, 0x89, 0x2a, - 0x6e, 0x7c, 0x88, 0x50, 0xe7, 0xa9, 0x14, 0xf4, 0x98, 0x3e, 0x89, 0x00, 0xd7, 0x50, 0x81, 0x49, - 0xf0, 0xc2, 0x8a, 0x55, 0xcf, 0x35, 0x4b, 0x6e, 0x29, 0x9e, 0xd6, 0x0a, 0x5d, 0x15, 0x20, 0x49, - 0xfc, 0x7e, 0xf1, 0xa7, 0x5f, 0x6b, 0x99, 0x67, 0x7f, 0xd5, 0x33, 0x8d, 0x5f, 0xb2, 0xe8, 0xc6, - 0x63, 0x7f, 0x04, 0x9c, 0xc0, 0xf7, 0x11, 0x84, 0x12, 0x7f, 0x8b, 0x8a, 0xea, 0x5d, 0x07, 0x54, - 0x52, 0xad, 0x44, 0xb9, 0x7d, 0xc7, 0x4e, 0x2d, 0x35, 0x6b, 0xc2, 0x0e, 0x46, 0x43, 0x15, 0x08, - 0x6d, 0x85, 0xb6, 0xc7, 0x2d, 0x3b, 0x91, 0xf3, 0x0b, 0x90, 0x34, 0xd5, 0x24, 0x8d, 0x91, 0x19, - 0x2b, 0x7e, 0x88, 0xf2, 0x61, 0x00, 0x7d, 0xad, 0x5f, 0xb9, 0x6d, 0xdb, 0xeb, 0x0c, 0x6b, 0xcf, - 0xf7, 0xf6, 0x28, 0x80, 0x7e, 0xaa, 0xa0, 0x3a, 0x11, 0xcd, 0x84, 0xbf, 0x46, 0x5b, 0xa1, 0xa4, - 0x32, 0x0a, 0xb5, 0xca, 0x8b, 0x1d, 0x5f, 0xc7, 0xa9, 0xeb, 0xdc, 0x1d, 0xc3, 0xba, 0x95, 0x9c, - 0x89, 0xe1, 0x6b, 0xfc, 0x6b, 0xa1, 0xdd, 0xe5, 0x16, 0xf0, 0xbb, 0xa8, 0x44, 0xa3, 0x01, 0x53, - 0xa6, 0xb9, 0x90, 0x78, 0x3b, 0x9e, 0xd6, 0x4a, 0x07, 0x17, 0x41, 0x92, 0xe6, 0x31, 0x47, 0x3b, - 0xbd, 0x05, 0xb7, 0x99, 0x1e, 0xdb, 0xeb, 0x7b, 0xbc, 0xcc, 0xa1, 0x2e, 0x8e, 0xa7, 0xb5, 0x9d, - 0xc5, 0x0c, 0x59, 0x62, 0xc7, 0x9f, 0xa0, 0x3d, 0x78, 0x1a, 0x30, 0xa1, 0x99, 0x1e, 0x41, 0xdf, - 0xe7, 0x83, 0x50, 0x7b, 0x2b, 0xe7, 0xde, 0x8a, 0xa7, 0xb5, 0xbd, 0xce, 0x72, 0x92, 0xac, 0xe2, - 0x1b, 0xbf, 0x59, 0x08, 0xaf, 0xaa, 0x84, 0xdf, 0x42, 0x05, 0xa9, 0xa2, 0xe6, 0x2f, 0xb2, 0x6d, - 0x44, 0x2b, 0x24, 0xd0, 0x24, 0x87, 0x27, 0xe8, 0x66, 0x4a, 0xf8, 0x98, 0x79, 0x10, 0x4a, 0xea, - 0x05, 0xe6, 0xb5, 0xdf, 0xd9, 0xcc, 0x4b, 0xaa, 0xcc, 0x7d, 0xcd, 0xd0, 0xdf, 0xec, 0xac, 0xd2, - 0x91, 0xcb, 0xee, 0x68, 0xfc, 0x9c, 0x45, 0x65, 0xd3, 0xf6, 0x98, 0xc1, 0x0f, 0x2f, 0xc1, 0xcb, - 0x0f, 0x16, 0xbc, 0x7c, 0x7b, 0x23, 0xdf, 0xa9, 0xd6, 0xae, 0xb4, 0xf2, 0x57, 0x4b, 0x56, 0x76, - 0x36, 0xa7, 0x5c, 0xef, 0xe4, 0xbb, 0xe8, 0x95, 0xa5, 0xfb, 0x37, 0x7a, 0xce, 0xc6, 0x1f, 0x16, - 0xda, 0x5b, 0xb9, 0x05, 0x7f, 0x84, 0xb6, 0xe7, 0x9a, 0x81, 0x64, 0x69, 0x16, 0xdd, 0x5b, 0x86, - 0x62, 0xfb, 0x60, 0x3e, 0x49, 0x16, 0xb1, 0xf8, 0x33, 0x94, 0x8f, 0x42, 0x10, 0x46, 0xb4, 0xb7, - 0xd7, 0x4f, 0x78, 0x14, 0x82, 0xe8, 0xf2, 0x13, 0x3f, 0x55, 0x4b, 0x45, 0x88, 0x66, 0x50, 0x13, - 0x80, 0x10, 0xbe, 0x30, 0xdb, 0x75, 0x36, 0x41, 0x47, 0x05, 0x49, 0x92, 0x6b, 0xfc, 0x9e, 0x45, - 0xc5, 0x0b, 0x16, 0xfc, 0x1e, 0x2a, 0xaa, 0x4a, 0xbd, 0x92, 0x93, 0xb1, 0x77, 0x4d, 0x91, 0xc6, - 0xa8, 0x38, 0x99, 0x21, 0xf0, 0x1b, 0x28, 0x17, 0xb1, 0x81, 0xd9, 0xf4, 0xe5, 0xb9, 0xd5, 0x4c, - 0x54, 0x1c, 0x37, 0xd0, 0xd6, 0x50, 0xf8, 0x51, 0xa0, 0x1e, 0x4b, 0x6d, 0x01, 0xa4, 0x74, 0xff, - 0x54, 0x47, 0x88, 0xc9, 0xe0, 0x63, 0x54, 0x00, 0xb5, 0x99, 0x2b, 0xf9, 0x7a, 0xae, 0x59, 0x6e, - 0xb7, 0x36, 0x9b, 0xd6, 0xd6, 0xdb, 0xbc, 0xc3, 0xa5, 0x98, 0xcc, 0x4d, 0xa5, 0x62, 0x24, 0xa1, - 0xdb, 0xef, 0x99, 0x8d, 0xaf, 0x31, 0x78, 0x17, 0xe5, 0x46, 0x30, 0x49, 0x26, 0x22, 0xea, 0x27, - 0xfe, 0x18, 0x15, 0xc6, 0xea, 0x63, 0x60, 0x54, 0x6e, 0xae, 0xbf, 0x37, 0xfd, 0x78, 0x90, 0xa4, - 0xec, 0x7e, 0xf6, 0x9e, 0xe5, 0x36, 0xcf, 0xce, 0xab, 0x99, 0xe7, 0xe7, 0xd5, 0xcc, 0x8b, 0xf3, - 0x6a, 0xe6, 0x59, 0x5c, 0xb5, 0xce, 0xe2, 0xaa, 0xf5, 0x3c, 0xae, 0x5a, 0x2f, 0xe2, 0xaa, 0xf5, - 0x77, 0x5c, 0xb5, 0x7e, 0xfc, 0xa7, 0x9a, 0xf9, 0x26, 0x3b, 0x6e, 0xfd, 0x1f, 0x00, 0x00, 0xff, - 0xff, 0x5f, 0x39, 0x60, 0xb1, 0xbd, 0x08, 0x00, 0x00, + // 892 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xcf, 0x8f, 0xdb, 0x44, + 0x14, 0x8e, 0xf3, 0x63, 0xb5, 0x99, 0x74, 0x97, 0xdd, 0x29, 0x95, 0xa2, 0x05, 0xec, 0x60, 0x24, + 0x14, 0x01, 0xb5, 0x9b, 0x08, 0x95, 0xaa, 0x48, 0x48, 0x6b, 0x36, 0x82, 0x08, 0x41, 0xab, 0x69, + 0x77, 0x41, 0x9c, 0x98, 0xd8, 0x6f, 0xb3, 0x26, 0x78, 0x6c, 0xec, 0x71, 0x68, 0x6e, 0xfd, 0x13, + 0x38, 0x82, 0xc4, 0x81, 0x3f, 0x02, 0x89, 0x23, 0xd7, 0x3d, 0x56, 0x9c, 0x7a, 0x40, 0x11, 0x6b, + 0xfe, 0x05, 0x4e, 0x9c, 0xd0, 0x8c, 0x67, 0xe3, 0xfc, 0xd8, 0x4d, 0x73, 0xea, 0x2d, 0xf3, 0xde, + 0xf7, 0xbe, 0x79, 0xef, 0x9b, 0x2f, 0xcf, 0xa8, 0x37, 0xba, 0x97, 0x58, 0x7e, 0x68, 0x8f, 0xd2, + 0x01, 0xc4, 0x0c, 0x38, 0x24, 0xf6, 0x18, 0x98, 0x17, 0xc6, 0xb6, 0x4a, 0xd0, 0xc8, 0xb7, 0x69, + 0xca, 0xcf, 0x80, 0x71, 0xdf, 0xa5, 0xdc, 0x0f, 0x99, 0x3d, 0xee, 0xd8, 0x43, 0x60, 0x10, 0x53, + 0x0e, 0x9e, 0x15, 0xc5, 0x21, 0x0f, 0xf1, 0xeb, 0x39, 0xda, 0xa2, 0x91, 0x6f, 0x2d, 0xa2, 0xad, + 0x71, 0xe7, 0xe0, 0xf6, 0xd0, 0xe7, 0x67, 0xe9, 0xc0, 0x72, 0xc3, 0xc0, 0x1e, 0x86, 0xc3, 0xd0, + 0x96, 0x45, 0x83, 0xf4, 0x54, 0x9e, 0xe4, 0x41, 0xfe, 0xca, 0xc9, 0x0e, 0xde, 0x2f, 0xae, 0x0e, + 0xa8, 0x7b, 0xe6, 0x33, 0x88, 0x27, 0x76, 0x34, 0x1a, 0x8a, 0x40, 0x62, 0x07, 0xc0, 0xe9, 0x15, + 0x2d, 0x1c, 0xd8, 0xd7, 0x55, 0xc5, 0x29, 0xe3, 0x7e, 0x00, 0x2b, 0x05, 0x77, 0x5f, 0x54, 0x90, + 0xb8, 0x67, 0x10, 0xd0, 0xe5, 0x3a, 0xf3, 0x4f, 0x0d, 0xbd, 0xea, 0x84, 0x29, 0xf3, 0x1e, 0x0c, + 0xbe, 0x05, 0x97, 0x13, 0x38, 0x85, 0x18, 0x98, 0x0b, 0xb8, 0x85, 0xaa, 0x23, 0x9f, 0x79, 0x4d, + 0xad, 0xa5, 0xb5, 0xeb, 0xce, 0x8d, 0xf3, 0xa9, 0x51, 0xca, 0xa6, 0x46, 0xf5, 0x33, 0x9f, 0x79, + 0x44, 0x66, 0x70, 0x17, 0x21, 0xfa, 0xb0, 0x7f, 0x02, 0x71, 0xe2, 0x87, 0xac, 0x59, 0x96, 0x38, + 0xac, 0x70, 0xe8, 0x70, 0x96, 0x21, 0x73, 0x28, 0xc1, 0xca, 0x68, 0x00, 0xcd, 0xca, 0x22, 0xeb, + 0x17, 0x34, 0x00, 0x22, 0x33, 0xd8, 0x41, 0x95, 0xb4, 0x7f, 0xd4, 0xac, 0x4a, 0xc0, 0x1d, 0x05, + 0xa8, 0x1c, 0xf7, 0x8f, 0xfe, 0x9b, 0x1a, 0x6f, 0x5e, 0x37, 0x24, 0x9f, 0x44, 0x90, 0x58, 0xc7, + 0xfd, 0x23, 0x22, 0x8a, 0xcd, 0x0f, 0x10, 0xea, 0x3d, 0xe1, 0x31, 0x3d, 0xa1, 0xdf, 0xa5, 0x80, + 0x0d, 0x54, 0xf3, 0x39, 0x04, 0x49, 0x53, 0x6b, 0x55, 0xda, 0x75, 0xa7, 0x9e, 0x4d, 0x8d, 0x5a, + 0x5f, 0x04, 0x48, 0x1e, 0xbf, 0xbf, 0xfd, 0xd3, 0xaf, 0x46, 0xe9, 0xe9, 0x5f, 0xad, 0x92, 0xf9, + 0x4b, 0x19, 0xdd, 0x78, 0x1c, 0x8e, 0x80, 0x11, 0xf8, 0x3e, 0x85, 0x84, 0xe3, 0x6f, 0xd0, 0xb6, + 0x78, 0x22, 0x8f, 0x72, 0x2a, 0x95, 0x68, 0x74, 0xef, 0x58, 0x85, 0x3b, 0x66, 0x4d, 0x58, 0xd1, + 0x68, 0x28, 0x02, 0x89, 0x25, 0xd0, 0xd6, 0xb8, 0x63, 0xe5, 0x72, 0x7e, 0x0e, 0x9c, 0x16, 0x9a, + 0x14, 0x31, 0x32, 0x63, 0xc5, 0x0f, 0x51, 0x35, 0x89, 0xc0, 0x95, 0xfa, 0x35, 0xba, 0x96, 0xb5, + 0xce, 0x7b, 0xd6, 0x7c, 0x6f, 0x8f, 0x22, 0x70, 0x0b, 0x05, 0xc5, 0x89, 0x48, 0x26, 0xfc, 0x15, + 0xda, 0x4a, 0x38, 0xe5, 0x69, 0x22, 0x55, 0x5e, 0xec, 0xf8, 0x45, 0x9c, 0xb2, 0xce, 0xd9, 0x55, + 0xac, 0x5b, 0xf9, 0x99, 0x28, 0x3e, 0xf3, 0x5f, 0x0d, 0xed, 0x2d, 0xb7, 0x80, 0xdf, 0x45, 0x75, + 0x9a, 0x7a, 0xbe, 0x30, 0xcd, 0xa5, 0xc4, 0x3b, 0xd9, 0xd4, 0xa8, 0x1f, 0x5e, 0x06, 0x49, 0x91, + 0xc7, 0x0c, 0xed, 0x0e, 0x16, 0xdc, 0xa6, 0x7a, 0xec, 0xae, 0xef, 0xf1, 0x2a, 0x87, 0x3a, 0x38, + 0x9b, 0x1a, 0xbb, 0x8b, 0x19, 0xb2, 0xc4, 0x8e, 0x3f, 0x46, 0xfb, 0xf0, 0x24, 0xf2, 0x63, 0xc9, + 0xf4, 0x08, 0xdc, 0x90, 0x79, 0x89, 0xf4, 0x56, 0xc5, 0xb9, 0x95, 0x4d, 0x8d, 0xfd, 0xde, 0x72, + 0x92, 0xac, 0xe2, 0xcd, 0xdf, 0x34, 0x84, 0x57, 0x55, 0xc2, 0x6f, 0xa1, 0x1a, 0x17, 0x51, 0xf5, + 0x17, 0xd9, 0x51, 0xa2, 0xd5, 0x72, 0x68, 0x9e, 0xc3, 0x13, 0x74, 0xb3, 0x20, 0x7c, 0xec, 0x07, + 0x90, 0x70, 0x1a, 0x44, 0xea, 0xb5, 0xdf, 0xd9, 0xcc, 0x4b, 0xa2, 0xcc, 0x79, 0x4d, 0xd1, 0xdf, + 0xec, 0xad, 0xd2, 0x91, 0xab, 0xee, 0x30, 0x7f, 0x2e, 0xa3, 0x86, 0x6a, 0x7b, 0xec, 0xc3, 0x0f, + 0x2f, 0xc1, 0xcb, 0x0f, 0x16, 0xbc, 0x7c, 0x7b, 0x23, 0xdf, 0x89, 0xd6, 0xae, 0xb5, 0xf2, 0x97, + 0x4b, 0x56, 0xb6, 0x37, 0xa7, 0x5c, 0xef, 0xe4, 0xbb, 0xe8, 0x95, 0xa5, 0xfb, 0x37, 0x7a, 0x4e, + 0xf3, 0x0f, 0x0d, 0xed, 0xaf, 0xdc, 0x82, 0x3f, 0x44, 0x3b, 0x73, 0xcd, 0x40, 0xbe, 0x34, 0xb7, + 0x9d, 0x5b, 0x8a, 0x62, 0xe7, 0x70, 0x3e, 0x49, 0x16, 0xb1, 0xf8, 0x53, 0x54, 0x4d, 0x13, 0x88, + 0x95, 0x68, 0x6f, 0xaf, 0x9f, 0xf0, 0x38, 0x81, 0xb8, 0xcf, 0x4e, 0xc3, 0x42, 0x2d, 0x11, 0x21, + 0x92, 0x41, 0x4c, 0x00, 0x71, 0x1c, 0xc6, 0x6a, 0xbb, 0xce, 0x26, 0xe8, 0x89, 0x20, 0xc9, 0x73, + 0xe6, 0xef, 0x65, 0xb4, 0x7d, 0xc9, 0x82, 0xdf, 0x43, 0xdb, 0xa2, 0x52, 0xae, 0xe4, 0x7c, 0xec, + 0x3d, 0x55, 0x24, 0x31, 0x22, 0x4e, 0x66, 0x08, 0xfc, 0x06, 0xaa, 0xa4, 0xbe, 0xa7, 0x36, 0x7d, + 0x63, 0x6e, 0x35, 0x13, 0x11, 0xc7, 0x26, 0xda, 0x1a, 0xc6, 0x61, 0x1a, 0x89, 0xc7, 0x12, 0x5b, + 0x00, 0x09, 0xdd, 0x3f, 0x91, 0x11, 0xa2, 0x32, 0xf8, 0x04, 0xd5, 0x40, 0x6c, 0xe6, 0x66, 0xb5, + 0x55, 0x69, 0x37, 0xba, 0x9d, 0xcd, 0xa6, 0xb5, 0xe4, 0x36, 0xef, 0x31, 0x1e, 0x4f, 0xe6, 0xa6, + 0x12, 0x31, 0x92, 0xd3, 0x1d, 0x0c, 0xd4, 0xc6, 0x97, 0x18, 0xbc, 0x87, 0x2a, 0x23, 0x98, 0xe4, + 0x13, 0x11, 0xf1, 0x13, 0x7f, 0x84, 0x6a, 0x63, 0xf1, 0x31, 0x50, 0x2a, 0xb7, 0xd7, 0xdf, 0x5b, + 0x7c, 0x3c, 0x48, 0x5e, 0x76, 0xbf, 0x7c, 0x4f, 0x73, 0xda, 0xe7, 0x17, 0x7a, 0xe9, 0xd9, 0x85, + 0x5e, 0x7a, 0x7e, 0xa1, 0x97, 0x9e, 0x66, 0xba, 0x76, 0x9e, 0xe9, 0xda, 0xb3, 0x4c, 0xd7, 0x9e, + 0x67, 0xba, 0xf6, 0x77, 0xa6, 0x6b, 0x3f, 0xfe, 0xa3, 0x97, 0xbe, 0x2e, 0x8f, 0x3b, 0xff, 0x07, + 0x00, 0x00, 0xff, 0xff, 0x5e, 0x8d, 0x94, 0x78, 0x88, 0x08, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/authentication/v1/generated.proto b/vendor/k8s.io/api/authentication/v1/generated.proto index d20887f8..10c79217 100644 --- a/vendor/k8s.io/api/authentication/v1/generated.proto +++ b/vendor/k8s.io/api/authentication/v1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.authentication.v1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; diff --git a/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go index 4b9b9410..f36c253b 100644 --- a/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go @@ -98,21 +98,13 @@ func (in *TokenRequestSpec) DeepCopyInto(out *TokenRequestSpec) { } if in.ExpirationSeconds != nil { in, out := &in.ExpirationSeconds, &out.ExpirationSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.BoundObjectRef != nil { in, out := &in.BoundObjectRef, &out.BoundObjectRef - if *in == nil { - *out = nil - } else { - *out = new(BoundObjectReference) - **out = **in - } + *out = new(BoundObjectReference) + **out = **in } return } @@ -217,12 +209,15 @@ func (in *UserInfo) DeepCopyInto(out *UserInfo) { in, out := &in.Extra, &out.Extra *out = make(map[string]ExtraValue, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make(ExtraValue, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return diff --git a/vendor/k8s.io/api/authentication/v1beta1/BUILD b/vendor/k8s.io/api/authentication/v1beta1/BUILD index 998d793f..2cd552a6 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/BUILD +++ b/vendor/k8s.io/api/authentication/v1beta1/BUILD @@ -15,13 +15,14 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authentication/v1beta1", importpath = "k8s.io/api/authentication/v1beta1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -37,9 +38,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go b/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go index 0efd6bf5..8503d212 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go @@ -1257,46 +1257,45 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 650 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x93, 0x4d, 0x4f, 0x14, 0x4d, - 0x10, 0xc7, 0x67, 0xf6, 0x85, 0x67, 0xb7, 0xf7, 0x41, 0xb1, 0x13, 0x93, 0xcd, 0x26, 0xce, 0xae, - 0xeb, 0x85, 0x44, 0xe9, 0x11, 0x24, 0x48, 0xf0, 0xe4, 0x28, 0x31, 0x98, 0x10, 0x93, 0x16, 0x3c, - 0xa8, 0x07, 0x7b, 0x67, 0x8b, 0xd9, 0x76, 0x99, 0x97, 0xf4, 0xf4, 0xac, 0x72, 0xe3, 0x23, 0x78, - 0xf4, 0x68, 0xe2, 0x27, 0x31, 0xf1, 0xc0, 0x91, 0x23, 0x07, 0x43, 0x64, 0xfc, 0x22, 0xa6, 0x7b, - 0x5a, 0x76, 0x61, 0x43, 0x80, 0xdb, 0xf4, 0xbf, 0xea, 0xff, 0x9b, 0xaa, 0xea, 0x2e, 0xf4, 0x72, - 0xb8, 0x9a, 0x12, 0x1e, 0xbb, 0xc3, 0xac, 0x07, 0x22, 0x02, 0x09, 0xa9, 0x3b, 0x82, 0xa8, 0x1f, - 0x0b, 0xd7, 0x04, 0x58, 0xc2, 0x5d, 0x96, 0xc9, 0x01, 0x44, 0x92, 0xfb, 0x4c, 0xf2, 0x38, 0x72, - 0x47, 0x8b, 0x3d, 0x90, 0x6c, 0xd1, 0x0d, 0x20, 0x02, 0xc1, 0x24, 0xf4, 0x49, 0x22, 0x62, 0x19, - 0xe3, 0xbb, 0x85, 0x85, 0xb0, 0x84, 0x93, 0xb3, 0x16, 0x62, 0x2c, 0xad, 0x85, 0x80, 0xcb, 0x41, - 0xd6, 0x23, 0x7e, 0x1c, 0xba, 0x41, 0x1c, 0xc4, 0xae, 0x76, 0xf6, 0xb2, 0x1d, 0x7d, 0xd2, 0x07, - 0xfd, 0x55, 0x10, 0x5b, 0xcb, 0xe3, 0x22, 0x42, 0xe6, 0x0f, 0x78, 0x04, 0x62, 0xcf, 0x4d, 0x86, - 0x81, 0x12, 0x52, 0x37, 0x04, 0xc9, 0xdc, 0xd1, 0x54, 0x1d, 0x2d, 0xf7, 0x22, 0x97, 0xc8, 0x22, - 0xc9, 0x43, 0x98, 0x32, 0xac, 0x5c, 0x66, 0x48, 0xfd, 0x01, 0x84, 0x6c, 0xca, 0xf7, 0xe8, 0x22, - 0x5f, 0x26, 0xf9, 0xae, 0xcb, 0x23, 0x99, 0x4a, 0x71, 0xde, 0xd4, 0x7d, 0x8c, 0xd0, 0xfa, 0x67, - 0x29, 0xd8, 0x1b, 0xb6, 0x9b, 0x01, 0x6e, 0xa3, 0x2a, 0x97, 0x10, 0xa6, 0x4d, 0xbb, 0x53, 0x9e, - 0xaf, 0x7b, 0xf5, 0xfc, 0xb8, 0x5d, 0xdd, 0x50, 0x02, 0x2d, 0xf4, 0xb5, 0xda, 0xd7, 0x6f, 0x6d, - 0x6b, 0xff, 0x57, 0xc7, 0xea, 0x7e, 0x2f, 0xa1, 0xc6, 0x56, 0x3c, 0x84, 0x88, 0xc2, 0x88, 0xc3, - 0x27, 0xfc, 0x01, 0xd5, 0xd4, 0x04, 0xfa, 0x4c, 0xb2, 0xa6, 0xdd, 0xb1, 0xe7, 0x1b, 0x4b, 0x0f, - 0xc9, 0xf8, 0x06, 0x4e, 0x0b, 0x22, 0xc9, 0x30, 0x50, 0x42, 0x4a, 0x54, 0x36, 0x19, 0x2d, 0x92, - 0x57, 0xbd, 0x8f, 0xe0, 0xcb, 0x4d, 0x90, 0xcc, 0xc3, 0x07, 0xc7, 0x6d, 0x2b, 0x3f, 0x6e, 0xa3, - 0xb1, 0x46, 0x4f, 0xa9, 0x78, 0x0b, 0x55, 0xd2, 0x04, 0xfc, 0x66, 0x49, 0xd3, 0x97, 0xc8, 0xa5, - 0xf7, 0x4b, 0x26, 0xea, 0x7b, 0x9d, 0x80, 0xef, 0xfd, 0x6f, 0xf8, 0x15, 0x75, 0xa2, 0x9a, 0x86, - 0xdf, 0xa3, 0x99, 0x54, 0x32, 0x99, 0xa5, 0xcd, 0xb2, 0xe6, 0x2e, 0x5f, 0x93, 0xab, 0xbd, 0xde, - 0x0d, 0x43, 0x9e, 0x29, 0xce, 0xd4, 0x30, 0xbb, 0x2b, 0xe8, 0xe6, 0xb9, 0x22, 0xf0, 0x3d, 0x54, - 0x95, 0x4a, 0xd2, 0x53, 0xaa, 0x7b, 0xb3, 0xc6, 0x59, 0x2d, 0xf2, 0x8a, 0x58, 0xf7, 0xa7, 0x8d, - 0x6e, 0x4d, 0xfd, 0x05, 0x3f, 0x41, 0xb3, 0x13, 0x15, 0x41, 0x5f, 0x23, 0x6a, 0xde, 0x6d, 0x83, - 0x98, 0x7d, 0x3a, 0x19, 0xa4, 0x67, 0x73, 0xf1, 0x26, 0xaa, 0x64, 0x29, 0x08, 0x33, 0xbe, 0xfb, - 0x57, 0x68, 0x73, 0x3b, 0x05, 0xb1, 0x11, 0xed, 0xc4, 0xe3, 0xb9, 0x29, 0x85, 0x6a, 0x8c, 0x6a, - 0x03, 0x84, 0x88, 0x85, 0x1e, 0xdb, 0x44, 0x1b, 0xeb, 0x4a, 0xa4, 0x45, 0xac, 0xfb, 0xa3, 0x84, - 0x6a, 0xff, 0x28, 0xf8, 0x01, 0xaa, 0x29, 0x67, 0xc4, 0x42, 0x30, 0xbd, 0xcf, 0x19, 0x93, 0xce, - 0x51, 0x3a, 0x3d, 0xcd, 0xc0, 0x77, 0x50, 0x39, 0xe3, 0x7d, 0x5d, 0x6d, 0xdd, 0x6b, 0x98, 0xc4, - 0xf2, 0xf6, 0xc6, 0x73, 0xaa, 0x74, 0xdc, 0x45, 0x33, 0x81, 0x88, 0xb3, 0x44, 0x5d, 0x9b, 0x7a, - 0xaa, 0x48, 0x0d, 0xff, 0x85, 0x56, 0xa8, 0x89, 0xe0, 0x77, 0xa8, 0x0a, 0xea, 0x6d, 0x37, 0x2b, - 0x9d, 0xf2, 0x7c, 0x63, 0x69, 0xe5, 0x1a, 0x2d, 0x13, 0xbd, 0x14, 0xeb, 0x91, 0x14, 0x7b, 0x13, - 0xad, 0x29, 0x8d, 0x16, 0xcc, 0x56, 0x60, 0x16, 0x47, 0xe7, 0xe0, 0x39, 0x54, 0x1e, 0xc2, 0x5e, - 0xd1, 0x16, 0x55, 0x9f, 0xf8, 0x19, 0xaa, 0x8e, 0xd4, 0x4e, 0x99, 0x79, 0x2f, 0x5c, 0xe1, 0xe7, - 0xe3, 0x45, 0xa4, 0x85, 0x77, 0xad, 0xb4, 0x6a, 0x7b, 0x0b, 0x07, 0x27, 0x8e, 0x75, 0x78, 0xe2, - 0x58, 0x47, 0x27, 0x8e, 0xb5, 0x9f, 0x3b, 0xf6, 0x41, 0xee, 0xd8, 0x87, 0xb9, 0x63, 0x1f, 0xe5, - 0x8e, 0xfd, 0x3b, 0x77, 0xec, 0x2f, 0x7f, 0x1c, 0xeb, 0xed, 0x7f, 0x06, 0xf2, 0x37, 0x00, 0x00, - 0xff, 0xff, 0x36, 0x0e, 0x35, 0x2a, 0x43, 0x05, 0x00, 0x00, + // 635 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcf, 0x4f, 0xd4, 0x40, + 0x14, 0x6e, 0xf7, 0x07, 0xee, 0xce, 0x8a, 0xe2, 0x24, 0x26, 0x9b, 0x4d, 0xec, 0xae, 0xeb, 0x85, + 0x44, 0x99, 0x0a, 0x21, 0x48, 0xf0, 0x64, 0x95, 0x18, 0x4c, 0x88, 0xc9, 0x08, 0x1e, 0xd4, 0x83, + 0xb3, 0xdd, 0x47, 0xb7, 0xae, 0xed, 0x34, 0xd3, 0x69, 0x95, 0x1b, 0x7f, 0x82, 0x47, 0x8f, 0x26, + 0xfe, 0x25, 0x26, 0x1e, 0x38, 0x72, 0xe4, 0x60, 0x88, 0xd4, 0x7f, 0xc4, 0xcc, 0x74, 0x64, 0x17, + 0x88, 0x01, 0x6e, 0xf3, 0xbe, 0xf7, 0xbe, 0x6f, 0xde, 0xf7, 0x66, 0x1e, 0x7a, 0x31, 0x5e, 0x4d, + 0x49, 0xc8, 0xdd, 0x71, 0x36, 0x00, 0x11, 0x83, 0x84, 0xd4, 0xcd, 0x21, 0x1e, 0x72, 0xe1, 0x9a, + 0x04, 0x4b, 0x42, 0x97, 0x65, 0x72, 0x04, 0xb1, 0x0c, 0x7d, 0x26, 0x43, 0x1e, 0xbb, 0xf9, 0xe2, + 0x00, 0x24, 0x5b, 0x74, 0x03, 0x88, 0x41, 0x30, 0x09, 0x43, 0x92, 0x08, 0x2e, 0x39, 0xbe, 0x5b, + 0x52, 0x08, 0x4b, 0x42, 0x72, 0x9a, 0x42, 0x0c, 0xa5, 0xb3, 0x10, 0x84, 0x72, 0x94, 0x0d, 0x88, + 0xcf, 0x23, 0x37, 0xe0, 0x01, 0x77, 0x35, 0x73, 0x90, 0xed, 0xe8, 0x48, 0x07, 0xfa, 0x54, 0x2a, + 0x76, 0x96, 0x27, 0x4d, 0x44, 0xcc, 0x1f, 0x85, 0x31, 0x88, 0x5d, 0x37, 0x19, 0x07, 0x0a, 0x48, + 0xdd, 0x08, 0x24, 0x73, 0xf3, 0x73, 0x7d, 0x74, 0xdc, 0xff, 0xb1, 0x44, 0x16, 0xcb, 0x30, 0x82, + 0x73, 0x84, 0x95, 0x8b, 0x08, 0xa9, 0x3f, 0x82, 0x88, 0x9d, 0xe5, 0xf5, 0x1f, 0x21, 0xb4, 0xfe, + 0x59, 0x0a, 0xf6, 0x9a, 0x7d, 0xcc, 0x00, 0x77, 0x51, 0x3d, 0x94, 0x10, 0xa5, 0x6d, 0xbb, 0x57, + 0x9d, 0x6f, 0x7a, 0xcd, 0xe2, 0xa8, 0x5b, 0xdf, 0x50, 0x00, 0x2d, 0xf1, 0xb5, 0xc6, 0xd7, 0x6f, + 0x5d, 0x6b, 0xef, 0x57, 0xcf, 0xea, 0x7f, 0xaf, 0xa0, 0xd6, 0x16, 0x1f, 0x43, 0x4c, 0x21, 0x0f, + 0xe1, 0x13, 0x7e, 0x8f, 0x1a, 0xca, 0xcc, 0x90, 0x49, 0xd6, 0xb6, 0x7b, 0xf6, 0x7c, 0x6b, 0xe9, + 0x21, 0x99, 0x0c, 0xf3, 0xa4, 0x27, 0x92, 0x8c, 0x03, 0x05, 0xa4, 0x44, 0x55, 0x93, 0x7c, 0x91, + 0xbc, 0x1c, 0x7c, 0x00, 0x5f, 0x6e, 0x82, 0x64, 0x1e, 0xde, 0x3f, 0xea, 0x5a, 0xc5, 0x51, 0x17, + 0x4d, 0x30, 0x7a, 0xa2, 0x8a, 0xb7, 0x50, 0x2d, 0x4d, 0xc0, 0x6f, 0x57, 0xb4, 0xfa, 0x12, 0xb9, + 0xf0, 0xa9, 0xc8, 0x54, 0x7f, 0xaf, 0x12, 0xf0, 0xbd, 0xeb, 0x46, 0xbf, 0xa6, 0x22, 0xaa, 0xd5, + 0xf0, 0x3b, 0x34, 0x93, 0x4a, 0x26, 0xb3, 0xb4, 0x5d, 0xd5, 0xba, 0xcb, 0x57, 0xd4, 0xd5, 0x5c, + 0xef, 0x86, 0x51, 0x9e, 0x29, 0x63, 0x6a, 0x34, 0xfb, 0x2b, 0xe8, 0xe6, 0x99, 0x26, 0xf0, 0x3d, + 0x54, 0x97, 0x0a, 0xd2, 0x53, 0x6a, 0x7a, 0xb3, 0x86, 0x59, 0x2f, 0xeb, 0xca, 0x5c, 0xff, 0xa7, + 0x8d, 0x6e, 0x9d, 0xbb, 0x05, 0x3f, 0x46, 0xb3, 0x53, 0x1d, 0xc1, 0x50, 0x4b, 0x34, 0xbc, 0xdb, + 0x46, 0x62, 0xf6, 0xc9, 0x74, 0x92, 0x9e, 0xae, 0xc5, 0x9b, 0xa8, 0x96, 0xa5, 0x20, 0xcc, 0xf8, + 0xee, 0x5f, 0xc2, 0xe6, 0x76, 0x0a, 0x62, 0x23, 0xde, 0xe1, 0x93, 0xb9, 0x29, 0x84, 0x6a, 0x19, + 0x65, 0x03, 0x84, 0xe0, 0x42, 0x8f, 0x6d, 0xca, 0xc6, 0xba, 0x02, 0x69, 0x99, 0xeb, 0xff, 0xa8, + 0xa0, 0xc6, 0x3f, 0x15, 0xfc, 0x00, 0x35, 0x14, 0x33, 0x66, 0x11, 0x18, 0xef, 0x73, 0x86, 0xa4, + 0x6b, 0x14, 0x4e, 0x4f, 0x2a, 0xf0, 0x1d, 0x54, 0xcd, 0xc2, 0xa1, 0xee, 0xb6, 0xe9, 0xb5, 0x4c, + 0x61, 0x75, 0x7b, 0xe3, 0x19, 0x55, 0x38, 0xee, 0xa3, 0x99, 0x40, 0xf0, 0x2c, 0x51, 0xcf, 0xa6, + 0xbe, 0x2a, 0x52, 0xc3, 0x7f, 0xae, 0x11, 0x6a, 0x32, 0xf8, 0x2d, 0xaa, 0x83, 0xfa, 0xdb, 0xed, + 0x5a, 0xaf, 0x3a, 0xdf, 0x5a, 0x5a, 0xb9, 0x82, 0x65, 0xa2, 0x97, 0x62, 0x3d, 0x96, 0x62, 0x77, + 0xca, 0x9a, 0xc2, 0x68, 0xa9, 0xd9, 0x09, 0xcc, 0xe2, 0xe8, 0x1a, 0x3c, 0x87, 0xaa, 0x63, 0xd8, + 0x2d, 0x6d, 0x51, 0x75, 0xc4, 0x4f, 0x51, 0x3d, 0x57, 0x3b, 0x65, 0xe6, 0xbd, 0x70, 0x89, 0xcb, + 0x27, 0x8b, 0x48, 0x4b, 0xee, 0x5a, 0x65, 0xd5, 0xf6, 0x16, 0xf6, 0x8f, 0x1d, 0xeb, 0xe0, 0xd8, + 0xb1, 0x0e, 0x8f, 0x1d, 0x6b, 0xaf, 0x70, 0xec, 0xfd, 0xc2, 0xb1, 0x0f, 0x0a, 0xc7, 0x3e, 0x2c, + 0x1c, 0xfb, 0x77, 0xe1, 0xd8, 0x5f, 0xfe, 0x38, 0xd6, 0x9b, 0x6b, 0x46, 0xe4, 0x6f, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x39, 0x00, 0xe7, 0xfa, 0x0e, 0x05, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/authentication/v1beta1/generated.proto b/vendor/k8s.io/api/authentication/v1beta1/generated.proto index 4fb6448f..a057bc59 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/generated.proto +++ b/vendor/k8s.io/api/authentication/v1beta1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.authentication.v1beta1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; diff --git a/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go index bb552ff6..3a5f6d5a 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go @@ -117,12 +117,15 @@ func (in *UserInfo) DeepCopyInto(out *UserInfo) { in, out := &in.Extra, &out.Extra *out = make(map[string]ExtraValue, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make(ExtraValue, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return diff --git a/vendor/k8s.io/api/authorization/v1/BUILD b/vendor/k8s.io/api/authorization/v1/BUILD index af9e74a6..f4b46b08 100644 --- a/vendor/k8s.io/api/authorization/v1/BUILD +++ b/vendor/k8s.io/api/authorization/v1/BUILD @@ -15,13 +15,14 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authorization/v1", importpath = "k8s.io/api/authorization/v1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -37,9 +38,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authorization/v1/generated.pb.go b/vendor/k8s.io/api/authorization/v1/generated.pb.go index 508c58f1..e9145af0 100644 --- a/vendor/k8s.io/api/authorization/v1/generated.pb.go +++ b/vendor/k8s.io/api/authorization/v1/generated.pb.go @@ -3452,77 +3452,77 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1152 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0xae, 0xed, 0xd4, 0x1e, 0x37, 0x24, 0x9d, 0x28, 0xcd, 0x36, 0x15, 0x76, 0xb4, 0x48, - 0x90, 0x8a, 0xb2, 0x4b, 0x4c, 0xdb, 0x44, 0x95, 0x2a, 0x14, 0x2b, 0x11, 0x8a, 0xd4, 0x96, 0x6a, - 0xa2, 0x44, 0xa2, 0x08, 0xc4, 0x78, 0x3d, 0xb1, 0x97, 0xd8, 0xbb, 0xcb, 0xcc, 0xac, 0x43, 0x38, - 0x55, 0xe2, 0x0b, 0x70, 0xe4, 0xc0, 0x81, 0x6f, 0xc0, 0x05, 0x89, 0x1b, 0x07, 0x0e, 0x28, 0xc7, - 0x1e, 0x8b, 0x84, 0x2c, 0xb2, 0x9c, 0xf9, 0x0e, 0x68, 0x66, 0xc7, 0xde, 0x75, 0xb2, 0x76, 0x13, - 0x0e, 0xf4, 0xd2, 0xdb, 0xee, 0xfb, 0xfd, 0xde, 0x9f, 0x79, 0x7f, 0x66, 0x1e, 0xd8, 0x3a, 0xdc, - 0x60, 0x96, 0xeb, 0xdb, 0x87, 0x61, 0x93, 0x50, 0x8f, 0x70, 0xc2, 0xec, 0x3e, 0xf1, 0x5a, 0x3e, - 0xb5, 0x15, 0x80, 0x03, 0xd7, 0xc6, 0x21, 0xef, 0xf8, 0xd4, 0xfd, 0x06, 0x73, 0xd7, 0xf7, 0xec, - 0xfe, 0x9a, 0xdd, 0x26, 0x1e, 0xa1, 0x98, 0x93, 0x96, 0x15, 0x50, 0x9f, 0xfb, 0xf0, 0x66, 0x4c, - 0xb6, 0x70, 0xe0, 0x5a, 0x63, 0x64, 0xab, 0xbf, 0xb6, 0xfc, 0x5e, 0xdb, 0xe5, 0x9d, 0xb0, 0x69, - 0x39, 0x7e, 0xcf, 0x6e, 0xfb, 0x6d, 0xdf, 0x96, 0x3a, 0xcd, 0xf0, 0x40, 0xfe, 0xc9, 0x1f, 0xf9, - 0x15, 0xdb, 0x5a, 0xbe, 0x93, 0x38, 0xee, 0x61, 0xa7, 0xe3, 0x7a, 0x84, 0x1e, 0xdb, 0xc1, 0x61, - 0x5b, 0x08, 0x98, 0xdd, 0x23, 0x1c, 0x67, 0x44, 0xb0, 0x6c, 0x4f, 0xd2, 0xa2, 0xa1, 0xc7, 0xdd, - 0x1e, 0x39, 0xa7, 0x70, 0xef, 0x65, 0x0a, 0xcc, 0xe9, 0x90, 0x1e, 0x3e, 0xa7, 0xf7, 0xc1, 0x24, - 0xbd, 0x90, 0xbb, 0x5d, 0xdb, 0xf5, 0x38, 0xe3, 0xf4, 0xac, 0x92, 0xb9, 0x0e, 0xc0, 0xf6, 0xd7, - 0x9c, 0xe2, 0x7d, 0xdc, 0x0d, 0x09, 0xac, 0x81, 0xa2, 0xcb, 0x49, 0x8f, 0x19, 0xda, 0x4a, 0x7e, - 0xb5, 0xdc, 0x28, 0x47, 0x83, 0x5a, 0x71, 0x47, 0x08, 0x50, 0x2c, 0xbf, 0x5f, 0xfa, 0xfe, 0xc7, - 0x5a, 0xee, 0xd9, 0x9f, 0x2b, 0x39, 0xf3, 0x67, 0x1d, 0x18, 0x0f, 0x7d, 0x07, 0x77, 0x77, 0xc3, - 0xe6, 0x97, 0xc4, 0xe1, 0x9b, 0x8e, 0x43, 0x18, 0x43, 0xa4, 0xef, 0x92, 0x23, 0xf8, 0x05, 0x28, - 0x89, 0x74, 0xb4, 0x30, 0xc7, 0x86, 0xb6, 0xa2, 0xad, 0x56, 0xea, 0xef, 0x5b, 0x49, 0x21, 0x46, - 0xd1, 0x59, 0xc1, 0x61, 0x5b, 0x08, 0x98, 0x25, 0xd8, 0x56, 0x7f, 0xcd, 0xfa, 0x58, 0xda, 0x7a, - 0x44, 0x38, 0x6e, 0xc0, 0x93, 0x41, 0x2d, 0x17, 0x0d, 0x6a, 0x20, 0x91, 0xa1, 0x91, 0x55, 0xb8, - 0x0f, 0x0a, 0x2c, 0x20, 0x8e, 0xa1, 0x4b, 0xeb, 0x77, 0xac, 0x29, 0x65, 0xb6, 0x32, 0x22, 0xdc, - 0x0d, 0x88, 0xd3, 0xb8, 0xaa, 0x3c, 0x14, 0xc4, 0x1f, 0x92, 0xf6, 0xe0, 0xe7, 0x60, 0x86, 0x71, - 0xcc, 0x43, 0x66, 0xe4, 0xa5, 0xe5, 0x7b, 0x97, 0xb6, 0x2c, 0xb5, 0x1b, 0x6f, 0x28, 0xdb, 0x33, - 0xf1, 0x3f, 0x52, 0x56, 0xcd, 0x4f, 0xc1, 0xe2, 0x63, 0xdf, 0x43, 0x84, 0xf9, 0x21, 0x75, 0xc8, - 0x26, 0xe7, 0xd4, 0x6d, 0x86, 0x9c, 0x30, 0xb8, 0x02, 0x0a, 0x01, 0xe6, 0x1d, 0x99, 0xae, 0x72, - 0x12, 0xda, 0x13, 0xcc, 0x3b, 0x48, 0x22, 0x82, 0xd1, 0x27, 0xb4, 0x29, 0x8f, 0x9c, 0x62, 0xec, - 0x13, 0xda, 0x44, 0x12, 0x31, 0xbf, 0x02, 0x73, 0x29, 0xe3, 0x28, 0xec, 0xca, 0x8a, 0x0a, 0x68, - 0xac, 0xa2, 0x42, 0x83, 0xa1, 0x58, 0x0e, 0x1f, 0x80, 0x39, 0x2f, 0xd1, 0xd9, 0x43, 0x0f, 0x99, - 0xa1, 0x4b, 0xea, 0x42, 0x34, 0xa8, 0xa5, 0xcd, 0x09, 0x08, 0x9d, 0xe5, 0x9a, 0xbf, 0xea, 0x00, - 0x66, 0x9c, 0xc6, 0x06, 0x65, 0x0f, 0xf7, 0x08, 0x0b, 0xb0, 0x43, 0xd4, 0x91, 0xae, 0xa9, 0x80, - 0xcb, 0x8f, 0x87, 0x00, 0x4a, 0x38, 0x2f, 0x3f, 0x1c, 0x7c, 0x0b, 0x14, 0xdb, 0xd4, 0x0f, 0x03, - 0x59, 0x98, 0x72, 0x63, 0x56, 0x51, 0x8a, 0x1f, 0x09, 0x21, 0x8a, 0x31, 0x78, 0x0b, 0x5c, 0xe9, - 0x13, 0xca, 0x5c, 0xdf, 0x33, 0x0a, 0x92, 0x36, 0xa7, 0x68, 0x57, 0xf6, 0x63, 0x31, 0x1a, 0xe2, - 0xf0, 0x36, 0x28, 0x51, 0x15, 0xb8, 0x51, 0x94, 0xdc, 0x79, 0xc5, 0x2d, 0x8d, 0x32, 0x38, 0x62, - 0xc0, 0xbb, 0xa0, 0xc2, 0xc2, 0xe6, 0x48, 0x61, 0x46, 0x2a, 0x2c, 0x28, 0x85, 0xca, 0x6e, 0x02, - 0xa1, 0x34, 0x4f, 0x1c, 0x4b, 0x9c, 0xd1, 0xb8, 0x32, 0x7e, 0x2c, 0x91, 0x02, 0x24, 0x11, 0xf3, - 0x37, 0x0d, 0x5c, 0xbd, 0x5c, 0xc5, 0xde, 0x05, 0x65, 0x1c, 0xb8, 0xf2, 0xd8, 0xc3, 0x5a, 0xcd, - 0x8a, 0xbc, 0x6e, 0x3e, 0xd9, 0x89, 0x85, 0x28, 0xc1, 0x05, 0x79, 0x18, 0x8c, 0x68, 0xe9, 0x11, - 0x79, 0xe8, 0x92, 0xa1, 0x04, 0x87, 0xeb, 0x60, 0x76, 0xf8, 0x23, 0x8b, 0x64, 0x14, 0xa4, 0xc2, - 0xb5, 0x68, 0x50, 0x9b, 0x45, 0x69, 0x00, 0x8d, 0xf3, 0xcc, 0x5f, 0x74, 0xb0, 0xb4, 0x4b, 0xba, - 0x07, 0xaf, 0xe6, 0x2e, 0x78, 0x3a, 0x76, 0x17, 0x6c, 0x4c, 0x9f, 0xd8, 0xec, 0x28, 0x5f, 0xd9, - 0x7d, 0xf0, 0x83, 0x0e, 0x6e, 0x4e, 0x89, 0x09, 0x1e, 0x01, 0x48, 0xcf, 0x8d, 0x97, 0xca, 0xa3, - 0x3d, 0x35, 0x96, 0xf3, 0x53, 0xd9, 0xb8, 0x1e, 0x0d, 0x6a, 0x19, 0xd3, 0x8a, 0x32, 0x5c, 0xc0, - 0x6f, 0x35, 0xb0, 0xe8, 0x65, 0xdd, 0x54, 0x2a, 0xcd, 0xf5, 0xa9, 0xce, 0x33, 0xef, 0xb8, 0xc6, - 0x8d, 0x68, 0x50, 0xcb, 0xbe, 0xfe, 0x50, 0xb6, 0x2f, 0xf1, 0xca, 0x5c, 0x4f, 0xa5, 0x47, 0x0c, - 0xc8, 0xff, 0xd7, 0x57, 0x9f, 0x8c, 0xf5, 0xd5, 0xfa, 0x45, 0xfb, 0x2a, 0x15, 0xe4, 0xc4, 0xb6, - 0xfa, 0xec, 0x4c, 0x5b, 0xdd, 0xbd, 0x48, 0x5b, 0xa5, 0x0d, 0x4f, 0xef, 0xaa, 0x47, 0x60, 0x79, - 0x72, 0x40, 0x97, 0xbe, 0x9c, 0xcd, 0x9f, 0x74, 0xb0, 0xf0, 0xfa, 0x99, 0xbf, 0xcc, 0x58, 0xff, - 0x5e, 0x00, 0x4b, 0xaf, 0x47, 0x7a, 0xd2, 0xa2, 0x13, 0x32, 0x42, 0xd5, 0x33, 0x3e, 0x2a, 0xce, - 0x1e, 0x23, 0x14, 0x49, 0x04, 0x9a, 0x60, 0xa6, 0x1d, 0xbf, 0x6e, 0xf1, 0xfb, 0x03, 0x44, 0x82, - 0xd5, 0xd3, 0xa6, 0x10, 0xd8, 0x02, 0x45, 0x22, 0xf6, 0x56, 0xa3, 0xb8, 0x92, 0x5f, 0xad, 0xd4, - 0x3f, 0xfc, 0x2f, 0x9d, 0x61, 0xc9, 0xcd, 0x77, 0xdb, 0xe3, 0xf4, 0x38, 0x59, 0x27, 0xa4, 0x0c, - 0xc5, 0xc6, 0xe1, 0x9b, 0x20, 0x1f, 0xba, 0x2d, 0xf5, 0xda, 0x57, 0x14, 0x25, 0xbf, 0xb7, 0xb3, - 0x85, 0x84, 0x7c, 0x19, 0xab, 0xe5, 0x59, 0x9a, 0x80, 0xf3, 0x20, 0x7f, 0x48, 0x8e, 0xe3, 0x81, - 0x42, 0xe2, 0x13, 0x3e, 0x00, 0xc5, 0xbe, 0xd8, 0xab, 0x55, 0x7e, 0xdf, 0x99, 0x1a, 0x64, 0xb2, - 0x86, 0xa3, 0x58, 0xeb, 0xbe, 0xbe, 0xa1, 0x99, 0x7f, 0x68, 0xe0, 0xc6, 0xc4, 0xf6, 0x13, 0xeb, - 0x0e, 0xee, 0x76, 0xfd, 0x23, 0xd2, 0x92, 0x6e, 0x4b, 0xc9, 0xba, 0xb3, 0x19, 0x8b, 0xd1, 0x10, - 0x87, 0x6f, 0x83, 0x19, 0x4a, 0x30, 0xf3, 0x3d, 0xb5, 0x62, 0x8d, 0x3a, 0x17, 0x49, 0x29, 0x52, - 0x28, 0xdc, 0x04, 0x73, 0x44, 0xb8, 0x97, 0x71, 0x6d, 0x53, 0xea, 0x0f, 0x2b, 0xb5, 0xa4, 0x14, - 0xe6, 0xb6, 0xc7, 0x61, 0x74, 0x96, 0x2f, 0x5c, 0xb5, 0x88, 0xe7, 0x92, 0x96, 0xdc, 0xc1, 0x4a, - 0x89, 0xab, 0x2d, 0x29, 0x45, 0x0a, 0x35, 0xff, 0xd1, 0x81, 0x31, 0xe9, 0x6a, 0x83, 0x07, 0xc9, - 0x2e, 0x22, 0x41, 0xb9, 0x0e, 0x55, 0xea, 0xb7, 0x2e, 0x34, 0x20, 0x42, 0xa3, 0xb1, 0xa8, 0xdc, - 0xce, 0xa6, 0xa5, 0xa9, 0xd5, 0x45, 0xfe, 0x42, 0x0a, 0xe6, 0xbd, 0xf1, 0x9d, 0x39, 0x5e, 0xaa, - 0x2a, 0xf5, 0xdb, 0x17, 0x1d, 0x07, 0xe9, 0xcd, 0x50, 0xde, 0xe6, 0xcf, 0x00, 0x0c, 0x9d, 0xb3, - 0x0f, 0xeb, 0x00, 0xb8, 0x9e, 0xe3, 0xf7, 0x82, 0x2e, 0xe1, 0x44, 0xa6, 0xb7, 0x94, 0xdc, 0x83, - 0x3b, 0x23, 0x04, 0xa5, 0x58, 0x59, 0x75, 0x29, 0x5c, 0xae, 0x2e, 0x8d, 0xd5, 0x93, 0xd3, 0x6a, - 0xee, 0xf9, 0x69, 0x35, 0xf7, 0xe2, 0xb4, 0x9a, 0x7b, 0x16, 0x55, 0xb5, 0x93, 0xa8, 0xaa, 0x3d, - 0x8f, 0xaa, 0xda, 0x8b, 0xa8, 0xaa, 0xfd, 0x15, 0x55, 0xb5, 0xef, 0xfe, 0xae, 0xe6, 0x9e, 0xea, - 0xfd, 0xb5, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x0e, 0xab, 0x82, 0x7c, 0x0f, 0x00, 0x00, + // 1140 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0x4d, 0x6f, 0x1b, 0xc5, + 0x1b, 0xf7, 0xae, 0xed, 0xc4, 0x1e, 0x37, 0xff, 0xa4, 0x13, 0xa5, 0xd9, 0xa6, 0xfa, 0xdb, 0xd1, + 0x22, 0x41, 0x2a, 0xca, 0x2e, 0xb1, 0xda, 0x26, 0xaa, 0x54, 0xa1, 0x58, 0x89, 0x50, 0xa4, 0xb6, + 0x54, 0x13, 0x25, 0x12, 0x45, 0x20, 0xc6, 0xeb, 0x89, 0xbd, 0xc4, 0xde, 0x5d, 0x66, 0x66, 0x1d, + 0xc2, 0xa9, 0x12, 0x5f, 0x80, 0x23, 0x07, 0x0e, 0x7c, 0x03, 0x2e, 0x48, 0xdc, 0x38, 0x70, 0x40, + 0x39, 0xf6, 0x58, 0x24, 0x64, 0x91, 0xe5, 0xcc, 0x77, 0x40, 0x33, 0x3b, 0xf6, 0xae, 0x93, 0xb5, + 0x9b, 0x70, 0xa0, 0x97, 0xde, 0x76, 0x9f, 0xdf, 0xef, 0x79, 0x99, 0xe7, 0x65, 0xe6, 0x01, 0xdb, + 0x47, 0x9b, 0xcc, 0x72, 0x7d, 0xfb, 0x28, 0x6c, 0x12, 0xea, 0x11, 0x4e, 0x98, 0xdd, 0x27, 0x5e, + 0xcb, 0xa7, 0xb6, 0x02, 0x70, 0xe0, 0xda, 0x38, 0xe4, 0x1d, 0x9f, 0xba, 0x5f, 0x63, 0xee, 0xfa, + 0x9e, 0xdd, 0x5f, 0xb7, 0xdb, 0xc4, 0x23, 0x14, 0x73, 0xd2, 0xb2, 0x02, 0xea, 0x73, 0x1f, 0xde, + 0x8a, 0xc9, 0x16, 0x0e, 0x5c, 0x6b, 0x8c, 0x6c, 0xf5, 0xd7, 0x57, 0xde, 0x6b, 0xbb, 0xbc, 0x13, + 0x36, 0x2d, 0xc7, 0xef, 0xd9, 0x6d, 0xbf, 0xed, 0xdb, 0x52, 0xa7, 0x19, 0x1e, 0xca, 0x3f, 0xf9, + 0x23, 0xbf, 0x62, 0x5b, 0x2b, 0x77, 0x13, 0xc7, 0x3d, 0xec, 0x74, 0x5c, 0x8f, 0xd0, 0x13, 0x3b, + 0x38, 0x6a, 0x0b, 0x01, 0xb3, 0x7b, 0x84, 0xe3, 0x8c, 0x08, 0x56, 0xec, 0x49, 0x5a, 0x34, 0xf4, + 0xb8, 0xdb, 0x23, 0x17, 0x14, 0xee, 0xbf, 0x4a, 0x81, 0x39, 0x1d, 0xd2, 0xc3, 0xe7, 0xf5, 0xcc, + 0x0d, 0x00, 0x76, 0xbe, 0xe2, 0x14, 0x1f, 0xe0, 0x6e, 0x48, 0x60, 0x0d, 0x14, 0x5d, 0x4e, 0x7a, + 0xcc, 0xd0, 0x56, 0xf3, 0x6b, 0xe5, 0x46, 0x39, 0x1a, 0xd4, 0x8a, 0xbb, 0x42, 0x80, 0x62, 0xf9, + 0x83, 0xd2, 0x77, 0x3f, 0xd4, 0x72, 0xcf, 0xff, 0x58, 0xcd, 0x99, 0x3f, 0xe9, 0xc0, 0x78, 0xe4, + 0x3b, 0xb8, 0xbb, 0x17, 0x36, 0xbf, 0x20, 0x0e, 0xdf, 0x72, 0x1c, 0xc2, 0x18, 0x22, 0x7d, 0x97, + 0x1c, 0xc3, 0xcf, 0x41, 0x49, 0x9c, 0xac, 0x85, 0x39, 0x36, 0xb4, 0x55, 0x6d, 0xad, 0x52, 0x7f, + 0xdf, 0x4a, 0x72, 0x3a, 0x0a, 0xd0, 0x0a, 0x8e, 0xda, 0x42, 0xc0, 0x2c, 0xc1, 0xb6, 0xfa, 0xeb, + 0xd6, 0x47, 0xd2, 0xd6, 0x63, 0xc2, 0x71, 0x03, 0x9e, 0x0e, 0x6a, 0xb9, 0x68, 0x50, 0x03, 0x89, + 0x0c, 0x8d, 0xac, 0xc2, 0x03, 0x50, 0x60, 0x01, 0x71, 0x0c, 0x5d, 0x5a, 0xbf, 0x6b, 0x4d, 0xa9, + 0x98, 0x95, 0x11, 0xe1, 0x5e, 0x40, 0x9c, 0xc6, 0x35, 0xe5, 0xa1, 0x20, 0xfe, 0x90, 0xb4, 0x07, + 0x3f, 0x03, 0x33, 0x8c, 0x63, 0x1e, 0x32, 0x23, 0x2f, 0x2d, 0xdf, 0xbf, 0xb2, 0x65, 0xa9, 0xdd, + 0xf8, 0x9f, 0xb2, 0x3d, 0x13, 0xff, 0x23, 0x65, 0xd5, 0xfc, 0x04, 0x2c, 0x3d, 0xf1, 0x3d, 0x44, + 0x98, 0x1f, 0x52, 0x87, 0x6c, 0x71, 0x4e, 0xdd, 0x66, 0xc8, 0x09, 0x83, 0xab, 0xa0, 0x10, 0x60, + 0xde, 0x91, 0xe9, 0x2a, 0x27, 0xa1, 0x3d, 0xc5, 0xbc, 0x83, 0x24, 0x22, 0x18, 0x7d, 0x42, 0x9b, + 0xf2, 0xc8, 0x29, 0xc6, 0x01, 0xa1, 0x4d, 0x24, 0x11, 0xf3, 0x4b, 0x30, 0x9f, 0x32, 0x8e, 0xc2, + 0xae, 0xac, 0xa8, 0x80, 0xc6, 0x2a, 0x2a, 0x34, 0x18, 0x8a, 0xe5, 0xf0, 0x21, 0x98, 0xf7, 0x12, + 0x9d, 0x7d, 0xf4, 0x88, 0x19, 0xba, 0xa4, 0x2e, 0x46, 0x83, 0x5a, 0xda, 0x9c, 0x80, 0xd0, 0x79, + 0xae, 0xf9, 0x8b, 0x0e, 0x60, 0xc6, 0x69, 0x6c, 0x50, 0xf6, 0x70, 0x8f, 0xb0, 0x00, 0x3b, 0x44, + 0x1d, 0xe9, 0xba, 0x0a, 0xb8, 0xfc, 0x64, 0x08, 0xa0, 0x84, 0xf3, 0xea, 0xc3, 0xc1, 0xb7, 0x40, + 0xb1, 0x4d, 0xfd, 0x30, 0x90, 0x85, 0x29, 0x37, 0xe6, 0x14, 0xa5, 0xf8, 0xa1, 0x10, 0xa2, 0x18, + 0x83, 0xb7, 0xc1, 0x6c, 0x9f, 0x50, 0xe6, 0xfa, 0x9e, 0x51, 0x90, 0xb4, 0x79, 0x45, 0x9b, 0x3d, + 0x88, 0xc5, 0x68, 0x88, 0xc3, 0x3b, 0xa0, 0x44, 0x55, 0xe0, 0x46, 0x51, 0x72, 0x17, 0x14, 0xb7, + 0x34, 0xca, 0xe0, 0x88, 0x01, 0xef, 0x81, 0x0a, 0x0b, 0x9b, 0x23, 0x85, 0x19, 0xa9, 0xb0, 0xa8, + 0x14, 0x2a, 0x7b, 0x09, 0x84, 0xd2, 0x3c, 0x71, 0x2c, 0x71, 0x46, 0x63, 0x76, 0xfc, 0x58, 0x22, + 0x05, 0x48, 0x22, 0xe6, 0xaf, 0x1a, 0xb8, 0x76, 0xb5, 0x8a, 0xbd, 0x0b, 0xca, 0x38, 0x70, 0xe5, + 0xb1, 0x87, 0xb5, 0x9a, 0x13, 0x79, 0xdd, 0x7a, 0xba, 0x1b, 0x0b, 0x51, 0x82, 0x0b, 0xf2, 0x30, + 0x18, 0xd1, 0xd2, 0x23, 0xf2, 0xd0, 0x25, 0x43, 0x09, 0x0e, 0x37, 0xc0, 0xdc, 0xf0, 0x47, 0x16, + 0xc9, 0x28, 0x48, 0x85, 0xeb, 0xd1, 0xa0, 0x36, 0x87, 0xd2, 0x00, 0x1a, 0xe7, 0x99, 0x3f, 0xeb, + 0x60, 0x79, 0x8f, 0x74, 0x0f, 0x5f, 0xcf, 0x5d, 0xf0, 0x6c, 0xec, 0x2e, 0xd8, 0x9c, 0x3e, 0xb1, + 0xd9, 0x51, 0xbe, 0xb6, 0xfb, 0xe0, 0x7b, 0x1d, 0xdc, 0x9a, 0x12, 0x13, 0x3c, 0x06, 0x90, 0x5e, + 0x18, 0x2f, 0x95, 0x47, 0x7b, 0x6a, 0x2c, 0x17, 0xa7, 0xb2, 0x71, 0x23, 0x1a, 0xd4, 0x32, 0xa6, + 0x15, 0x65, 0xb8, 0x80, 0xdf, 0x68, 0x60, 0xc9, 0xcb, 0xba, 0xa9, 0x54, 0x9a, 0xeb, 0x53, 0x9d, + 0x67, 0xde, 0x71, 0x8d, 0x9b, 0xd1, 0xa0, 0x96, 0x7d, 0xfd, 0xa1, 0x6c, 0x5f, 0xe2, 0x95, 0xb9, + 0x91, 0x4a, 0x8f, 0x18, 0x90, 0xff, 0xae, 0xaf, 0x3e, 0x1e, 0xeb, 0xab, 0x8d, 0xcb, 0xf6, 0x55, + 0x2a, 0xc8, 0x89, 0x6d, 0xf5, 0xe9, 0xb9, 0xb6, 0xba, 0x77, 0x99, 0xb6, 0x4a, 0x1b, 0x9e, 0xde, + 0x55, 0x8f, 0xc1, 0xca, 0xe4, 0x80, 0xae, 0x7c, 0x39, 0x9b, 0x3f, 0xea, 0x60, 0xf1, 0xcd, 0x33, + 0x7f, 0x95, 0xb1, 0xfe, 0xad, 0x00, 0x96, 0xdf, 0x8c, 0xf4, 0xa4, 0x45, 0x27, 0x64, 0x84, 0xaa, + 0x67, 0x7c, 0x54, 0x9c, 0x7d, 0x46, 0x28, 0x92, 0x08, 0x34, 0xc1, 0x4c, 0x3b, 0x7e, 0xdd, 0xe2, + 0xf7, 0x07, 0x88, 0x04, 0xab, 0xa7, 0x4d, 0x21, 0xb0, 0x05, 0x8a, 0x44, 0xec, 0xad, 0x46, 0x71, + 0x35, 0xbf, 0x56, 0xa9, 0x7f, 0xf0, 0x6f, 0x3a, 0xc3, 0x92, 0x9b, 0xef, 0x8e, 0xc7, 0xe9, 0x49, + 0xb2, 0x4e, 0x48, 0x19, 0x8a, 0x8d, 0xc3, 0xff, 0x83, 0x7c, 0xe8, 0xb6, 0xd4, 0x6b, 0x5f, 0x51, + 0x94, 0xfc, 0xfe, 0xee, 0x36, 0x12, 0xf2, 0x15, 0xac, 0x96, 0x67, 0x69, 0x02, 0x2e, 0x80, 0xfc, + 0x11, 0x39, 0x89, 0x07, 0x0a, 0x89, 0x4f, 0xf8, 0x10, 0x14, 0xfb, 0x62, 0xaf, 0x56, 0xf9, 0x7d, + 0x67, 0x6a, 0x90, 0xc9, 0x1a, 0x8e, 0x62, 0xad, 0x07, 0xfa, 0xa6, 0x66, 0xfe, 0xae, 0x81, 0x9b, + 0x13, 0xdb, 0x4f, 0xac, 0x3b, 0xb8, 0xdb, 0xf5, 0x8f, 0x49, 0x4b, 0xba, 0x2d, 0x25, 0xeb, 0xce, + 0x56, 0x2c, 0x46, 0x43, 0x1c, 0xbe, 0x0d, 0x66, 0x28, 0xc1, 0xcc, 0xf7, 0xd4, 0x8a, 0x35, 0xea, + 0x5c, 0x24, 0xa5, 0x48, 0xa1, 0x70, 0x0b, 0xcc, 0x13, 0xe1, 0x5e, 0xc6, 0xb5, 0x43, 0xa9, 0x3f, + 0xac, 0xd4, 0xb2, 0x52, 0x98, 0xdf, 0x19, 0x87, 0xd1, 0x79, 0xbe, 0x70, 0xd5, 0x22, 0x9e, 0x4b, + 0x5a, 0x72, 0x07, 0x2b, 0x25, 0xae, 0xb6, 0xa5, 0x14, 0x29, 0xd4, 0xfc, 0x5b, 0x07, 0xc6, 0xa4, + 0xab, 0x0d, 0x1e, 0x26, 0xbb, 0x88, 0x04, 0xe5, 0x3a, 0x54, 0xa9, 0xdf, 0xbe, 0xd4, 0x80, 0x08, + 0x8d, 0xc6, 0x92, 0x72, 0x3b, 0x97, 0x96, 0xa6, 0x56, 0x17, 0xf9, 0x0b, 0x29, 0x58, 0xf0, 0xc6, + 0x77, 0xe6, 0x78, 0xa9, 0xaa, 0xd4, 0xef, 0x5c, 0x76, 0x1c, 0xa4, 0x37, 0x43, 0x79, 0x5b, 0x38, + 0x07, 0x30, 0x74, 0xc1, 0x3e, 0xac, 0x03, 0xe0, 0x7a, 0x8e, 0xdf, 0x0b, 0xba, 0x84, 0x13, 0x99, + 0xde, 0x52, 0x72, 0x0f, 0xee, 0x8e, 0x10, 0x94, 0x62, 0x65, 0xd5, 0xa5, 0x70, 0xb5, 0xba, 0x34, + 0xd6, 0x4e, 0xcf, 0xaa, 0xb9, 0x17, 0x67, 0xd5, 0xdc, 0xcb, 0xb3, 0x6a, 0xee, 0x79, 0x54, 0xd5, + 0x4e, 0xa3, 0xaa, 0xf6, 0x22, 0xaa, 0x6a, 0x2f, 0xa3, 0xaa, 0xf6, 0x67, 0x54, 0xd5, 0xbe, 0xfd, + 0xab, 0x9a, 0x7b, 0xa6, 0xf7, 0xd7, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x9f, 0x85, 0x45, 0x74, + 0x47, 0x0f, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/authorization/v1/generated.proto b/vendor/k8s.io/api/authorization/v1/generated.proto index d87b03db..f68a04e4 100644 --- a/vendor/k8s.io/api/authorization/v1/generated.proto +++ b/vendor/k8s.io/api/authorization/v1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.authorization.v1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; diff --git a/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go index 999933d7..1d11b38b 100644 --- a/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go @@ -199,21 +199,13 @@ func (in *SelfSubjectAccessReviewSpec) DeepCopyInto(out *SelfSubjectAccessReview *out = *in if in.ResourceAttributes != nil { in, out := &in.ResourceAttributes, &out.ResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(ResourceAttributes) - **out = **in - } + *out = new(ResourceAttributes) + **out = **in } if in.NonResourceAttributes != nil { in, out := &in.NonResourceAttributes, &out.NonResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(NonResourceAttributes) - **out = **in - } + *out = new(NonResourceAttributes) + **out = **in } return } @@ -305,21 +297,13 @@ func (in *SubjectAccessReviewSpec) DeepCopyInto(out *SubjectAccessReviewSpec) { *out = *in if in.ResourceAttributes != nil { in, out := &in.ResourceAttributes, &out.ResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(ResourceAttributes) - **out = **in - } + *out = new(ResourceAttributes) + **out = **in } if in.NonResourceAttributes != nil { in, out := &in.NonResourceAttributes, &out.NonResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(NonResourceAttributes) - **out = **in - } + *out = new(NonResourceAttributes) + **out = **in } if in.Groups != nil { in, out := &in.Groups, &out.Groups @@ -330,12 +314,15 @@ func (in *SubjectAccessReviewSpec) DeepCopyInto(out *SubjectAccessReviewSpec) { in, out := &in.Extra, &out.Extra *out = make(map[string]ExtraValue, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make(ExtraValue, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return diff --git a/vendor/k8s.io/api/authorization/v1beta1/BUILD b/vendor/k8s.io/api/authorization/v1beta1/BUILD index 06c953f2..15cba0e5 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/BUILD +++ b/vendor/k8s.io/api/authorization/v1beta1/BUILD @@ -15,13 +15,14 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/authorization/v1beta1", importpath = "k8s.io/api/authorization/v1beta1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -37,9 +38,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go b/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go index 1f8abde4..75ee6cf9 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go @@ -3452,78 +3452,77 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1154 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0x4d, 0x6f, 0x1b, 0xc5, - 0x1b, 0xf7, 0xfa, 0x25, 0xb1, 0xc7, 0xcd, 0x3f, 0xe9, 0x44, 0x69, 0xb6, 0xf9, 0x0b, 0xdb, 0x32, - 0x12, 0x0a, 0xa2, 0xdd, 0x25, 0xa1, 0x90, 0x12, 0xe8, 0x21, 0x56, 0x22, 0x14, 0xa9, 0x2d, 0xd5, - 0x44, 0xc9, 0x81, 0x4a, 0xc0, 0x78, 0x3d, 0xb1, 0x17, 0xdb, 0xbb, 0xcb, 0xcc, 0xac, 0x43, 0x10, - 0x87, 0x1e, 0x39, 0x72, 0xe4, 0xc8, 0x89, 0xef, 0xc0, 0x05, 0x09, 0x4e, 0x39, 0xf6, 0x18, 0x24, - 0x64, 0x91, 0xe5, 0x43, 0x70, 0x45, 0x33, 0x3b, 0xf6, 0xae, 0xe3, 0x75, 0x1c, 0xe7, 0x40, 0x2f, - 0xbd, 0xed, 0x3c, 0xbf, 0xe7, 0x6d, 0x9e, 0x97, 0xd9, 0x1f, 0xd8, 0x6f, 0x3f, 0x64, 0x86, 0xed, - 0x9a, 0x6d, 0xbf, 0x4e, 0xa8, 0x43, 0x38, 0x61, 0x66, 0x8f, 0x38, 0x0d, 0x97, 0x9a, 0x0a, 0xc0, - 0x9e, 0x6d, 0x62, 0x9f, 0xb7, 0x5c, 0x6a, 0x7f, 0x8b, 0xb9, 0xed, 0x3a, 0x66, 0x6f, 0xa3, 0x4e, - 0x38, 0xde, 0x30, 0x9b, 0xc4, 0x21, 0x14, 0x73, 0xd2, 0x30, 0x3c, 0xea, 0x72, 0x17, 0x56, 0x42, - 0x0b, 0x03, 0x7b, 0xb6, 0x31, 0x62, 0x61, 0x28, 0x8b, 0xb5, 0xfb, 0x4d, 0x9b, 0xb7, 0xfc, 0xba, - 0x61, 0xb9, 0x5d, 0xb3, 0xe9, 0x36, 0x5d, 0x53, 0x1a, 0xd6, 0xfd, 0x63, 0x79, 0x92, 0x07, 0xf9, - 0x15, 0x3a, 0x5c, 0x7b, 0x10, 0xa5, 0xd0, 0xc5, 0x56, 0xcb, 0x76, 0x08, 0x3d, 0x35, 0xbd, 0x76, - 0x53, 0x08, 0x98, 0xd9, 0x25, 0x1c, 0x9b, 0xbd, 0xb1, 0x34, 0xd6, 0xcc, 0x49, 0x56, 0xd4, 0x77, - 0xb8, 0xdd, 0x25, 0x63, 0x06, 0x1f, 0x4c, 0x33, 0x60, 0x56, 0x8b, 0x74, 0xf1, 0x98, 0xdd, 0x7b, - 0x93, 0xec, 0x7c, 0x6e, 0x77, 0x4c, 0xdb, 0xe1, 0x8c, 0xd3, 0xcb, 0x46, 0xd5, 0x2d, 0x00, 0xf6, - 0xbe, 0xe1, 0x14, 0x1f, 0xe1, 0x8e, 0x4f, 0x60, 0x19, 0xe4, 0x6c, 0x4e, 0xba, 0x4c, 0xd7, 0x2a, - 0x99, 0xf5, 0x42, 0xad, 0x10, 0xf4, 0xcb, 0xb9, 0x7d, 0x21, 0x40, 0xa1, 0x7c, 0x3b, 0xff, 0xe3, - 0x4f, 0xe5, 0xd4, 0x8b, 0x3f, 0x2b, 0xa9, 0xea, 0xaf, 0x69, 0xa0, 0x3f, 0x76, 0x2d, 0xdc, 0x39, - 0xf0, 0xeb, 0x5f, 0x11, 0x8b, 0xef, 0x58, 0x16, 0x61, 0x0c, 0x91, 0x9e, 0x4d, 0x4e, 0xe0, 0x97, - 0x20, 0x2f, 0xca, 0xd1, 0xc0, 0x1c, 0xeb, 0x5a, 0x45, 0x5b, 0x2f, 0x6e, 0xbe, 0x6b, 0x44, 0xdd, - 0x18, 0x66, 0x67, 0x78, 0xed, 0xa6, 0x10, 0x30, 0x43, 0x68, 0x1b, 0xbd, 0x0d, 0xe3, 0x53, 0xe9, - 0xeb, 0x09, 0xe1, 0xb8, 0x06, 0xcf, 0xfa, 0xe5, 0x54, 0xd0, 0x2f, 0x83, 0x48, 0x86, 0x86, 0x5e, - 0xe1, 0x73, 0x90, 0x65, 0x1e, 0xb1, 0xf4, 0xb4, 0xf4, 0xfe, 0xa1, 0x31, 0xad, 0xd7, 0x46, 0x42, - 0x9a, 0x07, 0x1e, 0xb1, 0x6a, 0xb7, 0x54, 0x98, 0xac, 0x38, 0x21, 0xe9, 0x14, 0x5a, 0x60, 0x8e, - 0x71, 0xcc, 0x7d, 0xa6, 0x67, 0xa4, 0xfb, 0x8f, 0x6e, 0xe6, 0x5e, 0xba, 0xa8, 0xfd, 0x4f, 0x05, - 0x98, 0x0b, 0xcf, 0x48, 0xb9, 0xae, 0x3e, 0x07, 0x2b, 0x4f, 0x5d, 0x07, 0x11, 0xe6, 0xfa, 0xd4, - 0x22, 0x3b, 0x9c, 0x53, 0xbb, 0xee, 0x73, 0xc2, 0x60, 0x05, 0x64, 0x3d, 0xcc, 0x5b, 0xb2, 0x70, - 0x85, 0x28, 0xbf, 0x67, 0x98, 0xb7, 0x90, 0x44, 0x84, 0x46, 0x8f, 0xd0, 0xba, 0xbc, 0x7c, 0x4c, - 0xe3, 0x88, 0xd0, 0x3a, 0x92, 0x48, 0xf5, 0x6b, 0xb0, 0x18, 0x73, 0x8e, 0xfc, 0x8e, 0xec, 0xad, - 0x80, 0x46, 0x7a, 0x2b, 0x2c, 0x18, 0x0a, 0xe5, 0xf0, 0x11, 0x58, 0x74, 0x22, 0x9b, 0x43, 0xf4, - 0x98, 0xe9, 0x69, 0xa9, 0xba, 0x1c, 0xf4, 0xcb, 0x71, 0x77, 0x02, 0x42, 0x97, 0x75, 0xc5, 0x40, - 0xc0, 0x84, 0xdb, 0x98, 0xa0, 0xe0, 0xe0, 0x2e, 0x61, 0x1e, 0xb6, 0x88, 0xba, 0xd2, 0x6d, 0x95, - 0x70, 0xe1, 0xe9, 0x00, 0x40, 0x91, 0xce, 0xf4, 0xcb, 0xc1, 0x37, 0x41, 0xae, 0x49, 0x5d, 0xdf, - 0x93, 0xdd, 0x29, 0xd4, 0x16, 0x94, 0x4a, 0xee, 0x13, 0x21, 0x44, 0x21, 0x06, 0xdf, 0x06, 0xf3, - 0x3d, 0x42, 0x99, 0xed, 0x3a, 0x7a, 0x56, 0xaa, 0x2d, 0x2a, 0xb5, 0xf9, 0xa3, 0x50, 0x8c, 0x06, - 0x38, 0xbc, 0x07, 0xf2, 0x54, 0x25, 0xae, 0xe7, 0xa4, 0xee, 0x92, 0xd2, 0xcd, 0x0f, 0x2b, 0x38, - 0xd4, 0x80, 0xef, 0x83, 0x22, 0xf3, 0xeb, 0x43, 0x83, 0x39, 0x69, 0xb0, 0xac, 0x0c, 0x8a, 0x07, - 0x11, 0x84, 0xe2, 0x7a, 0xe2, 0x5a, 0xe2, 0x8e, 0xfa, 0xfc, 0xe8, 0xb5, 0x44, 0x09, 0x90, 0x44, - 0xaa, 0xbf, 0x6b, 0xe0, 0xd6, 0x6c, 0x1d, 0x7b, 0x07, 0x14, 0xb0, 0x67, 0xcb, 0x6b, 0x0f, 0x7a, - 0xb5, 0x20, 0xea, 0xba, 0xf3, 0x6c, 0x3f, 0x14, 0xa2, 0x08, 0x17, 0xca, 0x83, 0x64, 0xc4, 0x5c, - 0x0f, 0x95, 0x07, 0x21, 0x19, 0x8a, 0x70, 0xb8, 0x05, 0x16, 0x06, 0x07, 0xd9, 0x24, 0x3d, 0x2b, - 0x0d, 0x6e, 0x07, 0xfd, 0xf2, 0x02, 0x8a, 0x03, 0x68, 0x54, 0xaf, 0xfa, 0x5b, 0x1a, 0xac, 0x1e, - 0x90, 0xce, 0xf1, 0xab, 0x79, 0x15, 0xbe, 0x18, 0x79, 0x15, 0x1e, 0x5d, 0x63, 0x6d, 0x93, 0x53, - 0x7d, 0xb5, 0x2f, 0xc3, 0xcf, 0x69, 0xf0, 0xff, 0x2b, 0x12, 0x83, 0xdf, 0x01, 0x48, 0xc7, 0x16, - 0x4d, 0x55, 0xf4, 0xc1, 0xf4, 0x84, 0xc6, 0x97, 0xb4, 0x76, 0x27, 0xe8, 0x97, 0x13, 0x96, 0x17, - 0x25, 0xc4, 0x81, 0xdf, 0x6b, 0x60, 0xc5, 0x49, 0x7a, 0xb8, 0x54, 0xd5, 0xb7, 0xa6, 0x67, 0x90, - 0xf8, 0xee, 0xd5, 0xee, 0x06, 0xfd, 0x72, 0xf2, 0x93, 0x88, 0x92, 0x03, 0x8a, 0x27, 0xe7, 0x4e, - 0xac, 0x50, 0x62, 0x69, 0xfe, 0xbb, 0x59, 0xfb, 0x7c, 0x64, 0xd6, 0x3e, 0x9e, 0x69, 0xd6, 0x62, - 0x99, 0x4e, 0x1c, 0xb5, 0xfa, 0xa5, 0x51, 0xdb, 0xbe, 0xf6, 0xa8, 0xc5, 0xbd, 0x5f, 0x3d, 0x69, - 0x4f, 0xc0, 0xda, 0xe4, 0xac, 0x66, 0x7e, 0xba, 0xab, 0xbf, 0xa4, 0xc1, 0xf2, 0x6b, 0x3a, 0x70, - 0xb3, 0xa5, 0x3f, 0xcf, 0x82, 0xd5, 0xd7, 0x0b, 0x7f, 0xf5, 0xc2, 0x8b, 0x9f, 0xa8, 0xcf, 0x08, - 0x55, 0x3f, 0xfe, 0x61, 0xaf, 0x0e, 0x19, 0xa1, 0x48, 0x22, 0xb0, 0x32, 0xe0, 0x06, 0xe1, 0x0f, - 0x0b, 0x88, 0x4a, 0xab, 0x7f, 0xa1, 0x22, 0x06, 0x36, 0xc8, 0x11, 0xc1, 0x78, 0xf5, 0x5c, 0x25, - 0xb3, 0x5e, 0xdc, 0xdc, 0xbd, 0xf1, 0xac, 0x18, 0x92, 0x38, 0xef, 0x39, 0x9c, 0x9e, 0x46, 0x1c, - 0x44, 0xca, 0x50, 0x18, 0x01, 0xbe, 0x01, 0x32, 0xbe, 0xdd, 0x50, 0x14, 0xa1, 0xa8, 0x54, 0x32, - 0x87, 0xfb, 0xbb, 0x48, 0xc8, 0xd7, 0x8e, 0x15, 0xf7, 0x96, 0x2e, 0xe0, 0x12, 0xc8, 0xb4, 0xc9, - 0x69, 0xb8, 0x67, 0x48, 0x7c, 0xc2, 0x1a, 0xc8, 0xf5, 0x04, 0x2d, 0x57, 0x75, 0xbe, 0x37, 0x3d, - 0xd3, 0x88, 0xca, 0xa3, 0xd0, 0x74, 0x3b, 0xfd, 0x50, 0xab, 0xfe, 0xa1, 0x81, 0xbb, 0x13, 0x07, - 0x52, 0x10, 0x25, 0xdc, 0xe9, 0xb8, 0x27, 0xa4, 0x21, 0x63, 0xe7, 0x23, 0xa2, 0xb4, 0x13, 0x8a, - 0xd1, 0x00, 0x87, 0x6f, 0x81, 0x39, 0x4a, 0x30, 0x73, 0x1d, 0x45, 0xce, 0x86, 0xb3, 0x8c, 0xa4, - 0x14, 0x29, 0x14, 0xee, 0x80, 0x45, 0x22, 0xc2, 0xcb, 0xe4, 0xf6, 0x28, 0x75, 0x07, 0x1d, 0x5b, - 0x55, 0x06, 0x8b, 0x7b, 0xa3, 0x30, 0xba, 0xac, 0x2f, 0x42, 0x35, 0x88, 0x63, 0x93, 0x86, 0x64, - 0x6f, 0xf9, 0x28, 0xd4, 0xae, 0x94, 0x22, 0x85, 0x56, 0xff, 0x49, 0x03, 0x7d, 0xd2, 0xb3, 0x07, - 0xdb, 0x11, 0x8b, 0x91, 0xa0, 0x24, 0x52, 0xc5, 0x4d, 0xe3, 0xfa, 0x2b, 0x23, 0xcc, 0x6a, 0x2b, - 0x2a, 0xf6, 0x42, 0x5c, 0x1a, 0x63, 0x3e, 0xf2, 0x08, 0x4f, 0xc0, 0x92, 0x33, 0x4a, 0xb9, 0x43, - 0x4e, 0x56, 0xdc, 0xdc, 0x98, 0x69, 0x41, 0x64, 0x48, 0x5d, 0x85, 0x5c, 0xba, 0x04, 0x30, 0x34, - 0x16, 0x04, 0x6e, 0x02, 0x60, 0x3b, 0x96, 0xdb, 0xf5, 0x3a, 0x84, 0x13, 0x59, 0xe8, 0x7c, 0xf4, - 0x5a, 0xee, 0x0f, 0x11, 0x14, 0xd3, 0x4a, 0xea, 0x50, 0x76, 0xb6, 0x0e, 0xd5, 0xee, 0x9f, 0x5d, - 0x94, 0x52, 0x2f, 0x2f, 0x4a, 0xa9, 0xf3, 0x8b, 0x52, 0xea, 0x45, 0x50, 0xd2, 0xce, 0x82, 0x92, - 0xf6, 0x32, 0x28, 0x69, 0xe7, 0x41, 0x49, 0xfb, 0x2b, 0x28, 0x69, 0x3f, 0xfc, 0x5d, 0x4a, 0x7d, - 0x36, 0xaf, 0x6e, 0xf8, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xb3, 0x5e, 0x05, 0xd9, 0x0f, - 0x00, 0x00, + // 1137 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x56, 0xcb, 0x6f, 0x1b, 0x45, + 0x18, 0xf7, 0xfa, 0x91, 0xd8, 0xe3, 0x86, 0xa4, 0x13, 0xa5, 0xd9, 0x06, 0x61, 0x5b, 0x46, 0x42, + 0x41, 0xb4, 0xbb, 0x24, 0x2a, 0xa4, 0x04, 0x7a, 0x88, 0x95, 0x08, 0x45, 0x6a, 0x4b, 0x35, 0x51, + 0x72, 0xa0, 0x12, 0x30, 0xbb, 0x9e, 0xd8, 0x8b, 0xed, 0xdd, 0x65, 0x66, 0xd6, 0x21, 0x88, 0x43, + 0x8f, 0x1c, 0x39, 0x72, 0xe4, 0xc4, 0xff, 0xc0, 0x05, 0x09, 0x4e, 0x39, 0xf6, 0x18, 0x24, 0x64, + 0x91, 0xe5, 0x8f, 0xe0, 0x8a, 0x66, 0x76, 0xec, 0x5d, 0x27, 0x9b, 0x38, 0xce, 0x81, 0x5e, 0x7a, + 0xdb, 0xf9, 0x7e, 0xdf, 0xfb, 0xb5, 0x1f, 0xd8, 0xed, 0x3c, 0x64, 0x86, 0xe3, 0x99, 0x9d, 0xc0, + 0x22, 0xd4, 0x25, 0x9c, 0x30, 0xb3, 0x4f, 0xdc, 0xa6, 0x47, 0x4d, 0x05, 0x60, 0xdf, 0x31, 0x71, + 0xc0, 0xdb, 0x1e, 0x75, 0xbe, 0xc3, 0xdc, 0xf1, 0x5c, 0xb3, 0xbf, 0x66, 0x11, 0x8e, 0xd7, 0xcc, + 0x16, 0x71, 0x09, 0xc5, 0x9c, 0x34, 0x0d, 0x9f, 0x7a, 0xdc, 0x83, 0xb5, 0x48, 0xc2, 0xc0, 0xbe, + 0x63, 0x8c, 0x49, 0x18, 0x4a, 0x62, 0xe5, 0x7e, 0xcb, 0xe1, 0xed, 0xc0, 0x32, 0x6c, 0xaf, 0x67, + 0xb6, 0xbc, 0x96, 0x67, 0x4a, 0x41, 0x2b, 0x38, 0x94, 0x2f, 0xf9, 0x90, 0x5f, 0x91, 0xc2, 0x95, + 0x07, 0xb1, 0x0b, 0x3d, 0x6c, 0xb7, 0x1d, 0x97, 0xd0, 0x63, 0xd3, 0xef, 0xb4, 0x04, 0x81, 0x99, + 0x3d, 0xc2, 0xb1, 0xd9, 0xbf, 0xe0, 0xc6, 0x8a, 0x79, 0x99, 0x14, 0x0d, 0x5c, 0xee, 0xf4, 0xc8, + 0x05, 0x81, 0x0f, 0x27, 0x09, 0x30, 0xbb, 0x4d, 0x7a, 0xf8, 0xbc, 0x5c, 0x7d, 0x03, 0x80, 0x9d, + 0x6f, 0x39, 0xc5, 0x07, 0xb8, 0x1b, 0x10, 0x58, 0x05, 0x05, 0x87, 0x93, 0x1e, 0xd3, 0xb5, 0x5a, + 0x6e, 0xb5, 0xd4, 0x28, 0x85, 0x83, 0x6a, 0x61, 0x57, 0x10, 0x50, 0x44, 0xdf, 0x2c, 0xfe, 0xf4, + 0x73, 0x35, 0xf3, 0xe2, 0xaf, 0x5a, 0xa6, 0xfe, 0x5b, 0x16, 0xe8, 0x8f, 0x3d, 0x1b, 0x77, 0xf7, + 0x02, 0xeb, 0x6b, 0x62, 0xf3, 0x2d, 0xdb, 0x26, 0x8c, 0x21, 0xd2, 0x77, 0xc8, 0x11, 0xfc, 0x0a, + 0x14, 0x45, 0x64, 0x4d, 0xcc, 0xb1, 0xae, 0xd5, 0xb4, 0xd5, 0xf2, 0xfa, 0xfb, 0x46, 0x9c, 0xd8, + 0x91, 0x83, 0x86, 0xdf, 0x69, 0x09, 0x02, 0x33, 0x04, 0xb7, 0xd1, 0x5f, 0x33, 0x3e, 0x93, 0xba, + 0x9e, 0x10, 0x8e, 0x1b, 0xf0, 0x64, 0x50, 0xcd, 0x84, 0x83, 0x2a, 0x88, 0x69, 0x68, 0xa4, 0x15, + 0x3e, 0x07, 0x79, 0xe6, 0x13, 0x5b, 0xcf, 0x4a, 0xed, 0x1f, 0x19, 0x93, 0xca, 0x66, 0xa4, 0xb8, + 0xb9, 0xe7, 0x13, 0xbb, 0x71, 0x4b, 0x99, 0xc9, 0x8b, 0x17, 0x92, 0x4a, 0xa1, 0x0d, 0x66, 0x18, + 0xc7, 0x3c, 0x60, 0x7a, 0x4e, 0xaa, 0xff, 0xf8, 0x66, 0xea, 0xa5, 0x8a, 0xc6, 0x1b, 0xca, 0xc0, + 0x4c, 0xf4, 0x46, 0x4a, 0x75, 0xfd, 0x39, 0x58, 0x7a, 0xea, 0xb9, 0x88, 0x30, 0x2f, 0xa0, 0x36, + 0xd9, 0xe2, 0x9c, 0x3a, 0x56, 0xc0, 0x09, 0x83, 0x35, 0x90, 0xf7, 0x31, 0x6f, 0xcb, 0xc4, 0x95, + 0x62, 0xff, 0x9e, 0x61, 0xde, 0x46, 0x12, 0x11, 0x1c, 0x7d, 0x42, 0x2d, 0x19, 0x7c, 0x82, 0xe3, + 0x80, 0x50, 0x0b, 0x49, 0xa4, 0xfe, 0x0d, 0x98, 0x4f, 0x28, 0x47, 0x41, 0x57, 0xd6, 0x56, 0x40, + 0x63, 0xb5, 0x15, 0x12, 0x0c, 0x45, 0x74, 0xf8, 0x08, 0xcc, 0xbb, 0xb1, 0xcc, 0x3e, 0x7a, 0xcc, + 0xf4, 0xac, 0x64, 0x5d, 0x0c, 0x07, 0xd5, 0xa4, 0x3a, 0x01, 0xa1, 0xf3, 0xbc, 0xa2, 0x21, 0x60, + 0x4a, 0x34, 0x26, 0x28, 0xb9, 0xb8, 0x47, 0x98, 0x8f, 0x6d, 0xa2, 0x42, 0xba, 0xad, 0x1c, 0x2e, + 0x3d, 0x1d, 0x02, 0x28, 0xe6, 0x99, 0x1c, 0x1c, 0x7c, 0x1b, 0x14, 0x5a, 0xd4, 0x0b, 0x7c, 0x59, + 0x9d, 0x52, 0x63, 0x4e, 0xb1, 0x14, 0x3e, 0x15, 0x44, 0x14, 0x61, 0xf0, 0x5d, 0x30, 0xdb, 0x27, + 0x94, 0x39, 0x9e, 0xab, 0xe7, 0x25, 0xdb, 0xbc, 0x62, 0x9b, 0x3d, 0x88, 0xc8, 0x68, 0x88, 0xc3, + 0x7b, 0xa0, 0x48, 0x95, 0xe3, 0x7a, 0x41, 0xf2, 0x2e, 0x28, 0xde, 0xe2, 0x28, 0x83, 0x23, 0x0e, + 0xf8, 0x01, 0x28, 0xb3, 0xc0, 0x1a, 0x09, 0xcc, 0x48, 0x81, 0x45, 0x25, 0x50, 0xde, 0x8b, 0x21, + 0x94, 0xe4, 0x13, 0x61, 0x89, 0x18, 0xf5, 0xd9, 0xf1, 0xb0, 0x44, 0x0a, 0x90, 0x44, 0xea, 0x7f, + 0x68, 0xe0, 0xd6, 0x74, 0x15, 0x7b, 0x0f, 0x94, 0xb0, 0xef, 0xc8, 0xb0, 0x87, 0xb5, 0x9a, 0x13, + 0x79, 0xdd, 0x7a, 0xb6, 0x1b, 0x11, 0x51, 0x8c, 0x0b, 0xe6, 0xa1, 0x33, 0xa2, 0xaf, 0x47, 0xcc, + 0x43, 0x93, 0x0c, 0xc5, 0x38, 0xdc, 0x00, 0x73, 0xc3, 0x87, 0x2c, 0x92, 0x9e, 0x97, 0x02, 0xb7, + 0xc3, 0x41, 0x75, 0x0e, 0x25, 0x01, 0x34, 0xce, 0x57, 0xff, 0x3d, 0x0b, 0x96, 0xf7, 0x48, 0xf7, + 0xf0, 0xd5, 0x6c, 0x85, 0x2f, 0xc7, 0xb6, 0xc2, 0xa3, 0x6b, 0x8c, 0x6d, 0xba, 0xab, 0xaf, 0x76, + 0x33, 0xfc, 0x92, 0x05, 0x6f, 0x5e, 0xe1, 0x18, 0xfc, 0x1e, 0x40, 0x7a, 0x61, 0xd0, 0x54, 0x46, + 0x1f, 0x4c, 0x76, 0xe8, 0xe2, 0x90, 0x36, 0xee, 0x84, 0x83, 0x6a, 0xca, 0xf0, 0xa2, 0x14, 0x3b, + 0xf0, 0x07, 0x0d, 0x2c, 0xb9, 0x69, 0x8b, 0x4b, 0x65, 0x7d, 0x63, 0xb2, 0x07, 0xa9, 0x7b, 0xaf, + 0x71, 0x37, 0x1c, 0x54, 0xd3, 0x57, 0x22, 0x4a, 0x37, 0x28, 0x56, 0xce, 0x9d, 0x44, 0xa2, 0xc4, + 0xd0, 0xfc, 0x7f, 0xbd, 0xf6, 0xc5, 0x58, 0xaf, 0x7d, 0x32, 0x55, 0xaf, 0x25, 0x3c, 0xbd, 0xb4, + 0xd5, 0xac, 0x73, 0xad, 0xb6, 0x79, 0xed, 0x56, 0x4b, 0x6a, 0xbf, 0xba, 0xd3, 0x9e, 0x80, 0x95, + 0xcb, 0xbd, 0x9a, 0x7a, 0x75, 0xd7, 0x7f, 0xcd, 0x82, 0xc5, 0xd7, 0xe7, 0xc0, 0xcd, 0x86, 0xfe, + 0x34, 0x0f, 0x96, 0x5f, 0x0f, 0xfc, 0xd5, 0x03, 0x2f, 0x7e, 0xa2, 0x01, 0x23, 0x54, 0xfd, 0xf8, + 0x47, 0xb5, 0xda, 0x67, 0x84, 0x22, 0x89, 0xc0, 0xda, 0xf0, 0x36, 0x88, 0x7e, 0x58, 0x40, 0x64, + 0x5a, 0xfd, 0x0b, 0xd5, 0x61, 0xe0, 0x80, 0x02, 0x11, 0x17, 0xaf, 0x5e, 0xa8, 0xe5, 0x56, 0xcb, + 0xeb, 0xdb, 0x37, 0xee, 0x15, 0x43, 0x1e, 0xce, 0x3b, 0x2e, 0xa7, 0xc7, 0xf1, 0x0d, 0x22, 0x69, + 0x28, 0xb2, 0x00, 0xdf, 0x02, 0xb9, 0xc0, 0x69, 0xaa, 0x13, 0xa1, 0xac, 0x58, 0x72, 0xfb, 0xbb, + 0xdb, 0x48, 0xd0, 0x57, 0x0e, 0xd5, 0xed, 0x2d, 0x55, 0xc0, 0x05, 0x90, 0xeb, 0x90, 0xe3, 0x68, + 0xce, 0x90, 0xf8, 0x84, 0x0d, 0x50, 0xe8, 0x8b, 0xb3, 0x5c, 0xe5, 0xf9, 0xde, 0x64, 0x4f, 0xe3, + 0x53, 0x1e, 0x45, 0xa2, 0x9b, 0xd9, 0x87, 0x5a, 0xfd, 0x4f, 0x0d, 0xdc, 0xbd, 0xb4, 0x21, 0xc5, + 0xa1, 0x84, 0xbb, 0x5d, 0xef, 0x88, 0x34, 0xa5, 0xed, 0x62, 0x7c, 0x28, 0x6d, 0x45, 0x64, 0x34, + 0xc4, 0xe1, 0x3b, 0x60, 0x86, 0x12, 0xcc, 0x3c, 0x57, 0x1d, 0x67, 0xa3, 0x5e, 0x46, 0x92, 0x8a, + 0x14, 0x0a, 0xb7, 0xc0, 0x3c, 0x11, 0xe6, 0xa5, 0x73, 0x3b, 0x94, 0x7a, 0xc3, 0x8a, 0x2d, 0x2b, + 0x81, 0xf9, 0x9d, 0x71, 0x18, 0x9d, 0xe7, 0x17, 0xa6, 0x9a, 0xc4, 0x75, 0x48, 0x53, 0x5e, 0x6f, + 0xc5, 0xd8, 0xd4, 0xb6, 0xa4, 0x22, 0x85, 0xd6, 0xff, 0xcd, 0x02, 0xfd, 0xb2, 0xb5, 0x07, 0x3b, + 0xf1, 0x15, 0x23, 0x41, 0x79, 0x48, 0x95, 0xd7, 0x8d, 0xeb, 0x8f, 0x8c, 0x10, 0x6b, 0x2c, 0x29, + 0xdb, 0x73, 0x49, 0x6a, 0xe2, 0xf2, 0x91, 0x4f, 0x78, 0x04, 0x16, 0xdc, 0xf1, 0x93, 0x3b, 0xba, + 0xc9, 0xca, 0xeb, 0x6b, 0x53, 0x0d, 0x88, 0x34, 0xa9, 0x2b, 0x93, 0x0b, 0xe7, 0x00, 0x86, 0x2e, + 0x18, 0x81, 0xeb, 0x00, 0x38, 0xae, 0xed, 0xf5, 0xfc, 0x2e, 0xe1, 0x44, 0x26, 0xba, 0x18, 0x6f, + 0xcb, 0xdd, 0x11, 0x82, 0x12, 0x5c, 0x69, 0x15, 0xca, 0x4f, 0x57, 0xa1, 0xc6, 0xfd, 0x93, 0xb3, + 0x4a, 0xe6, 0xe5, 0x59, 0x25, 0x73, 0x7a, 0x56, 0xc9, 0xbc, 0x08, 0x2b, 0xda, 0x49, 0x58, 0xd1, + 0x5e, 0x86, 0x15, 0xed, 0x34, 0xac, 0x68, 0x7f, 0x87, 0x15, 0xed, 0xc7, 0x7f, 0x2a, 0x99, 0xcf, + 0x67, 0x55, 0x84, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xc5, 0xba, 0xf8, 0x96, 0xa4, 0x0f, 0x00, + 0x00, } diff --git a/vendor/k8s.io/api/authorization/v1beta1/generated.proto b/vendor/k8s.io/api/authorization/v1beta1/generated.proto index 98656fba..3876a3ee 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/generated.proto +++ b/vendor/k8s.io/api/authorization/v1beta1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.authorization.v1beta1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; diff --git a/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go index eb14973c..58b2dfe7 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go @@ -199,21 +199,13 @@ func (in *SelfSubjectAccessReviewSpec) DeepCopyInto(out *SelfSubjectAccessReview *out = *in if in.ResourceAttributes != nil { in, out := &in.ResourceAttributes, &out.ResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(ResourceAttributes) - **out = **in - } + *out = new(ResourceAttributes) + **out = **in } if in.NonResourceAttributes != nil { in, out := &in.NonResourceAttributes, &out.NonResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(NonResourceAttributes) - **out = **in - } + *out = new(NonResourceAttributes) + **out = **in } return } @@ -305,21 +297,13 @@ func (in *SubjectAccessReviewSpec) DeepCopyInto(out *SubjectAccessReviewSpec) { *out = *in if in.ResourceAttributes != nil { in, out := &in.ResourceAttributes, &out.ResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(ResourceAttributes) - **out = **in - } + *out = new(ResourceAttributes) + **out = **in } if in.NonResourceAttributes != nil { in, out := &in.NonResourceAttributes, &out.NonResourceAttributes - if *in == nil { - *out = nil - } else { - *out = new(NonResourceAttributes) - **out = **in - } + *out = new(NonResourceAttributes) + **out = **in } if in.Groups != nil { in, out := &in.Groups, &out.Groups @@ -330,12 +314,15 @@ func (in *SubjectAccessReviewSpec) DeepCopyInto(out *SubjectAccessReviewSpec) { in, out := &in.Extra, &out.Extra *out = make(map[string]ExtraValue, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make(ExtraValue, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return diff --git a/vendor/k8s.io/api/autoscaling/v1/BUILD b/vendor/k8s.io/api/autoscaling/v1/BUILD index ccf587be..e0a645e1 100644 --- a/vendor/k8s.io/api/autoscaling/v1/BUILD +++ b/vendor/k8s.io/api/autoscaling/v1/BUILD @@ -15,14 +15,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v1", importpath = "k8s.io/api/autoscaling/v1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -38,9 +39,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/autoscaling/v1/generated.pb.go b/vendor/k8s.io/api/autoscaling/v1/generated.pb.go index 84c40a9f..47a46a55 100644 --- a/vendor/k8s.io/api/autoscaling/v1/generated.pb.go +++ b/vendor/k8s.io/api/autoscaling/v1/generated.pb.go @@ -675,6 +675,26 @@ func (m *ObjectMetricSource) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n23 + if m.Selector != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n24, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n24 + } + if m.AverageValue != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AverageValue.Size())) + n25, err := m.AverageValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n25 + } return i, nil } @@ -696,11 +716,11 @@ func (m *ObjectMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) - n24, err := m.Target.MarshalTo(dAtA[i:]) + n26, err := m.Target.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n26 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.MetricName))) @@ -708,11 +728,31 @@ func (m *ObjectMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentValue.Size())) - n25, err := m.CurrentValue.MarshalTo(dAtA[i:]) + n27, err := m.CurrentValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n27 + if m.Selector != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n28, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n28 + } + if m.AverageValue != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AverageValue.Size())) + n29, err := m.AverageValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n29 + } return i, nil } @@ -738,11 +778,21 @@ func (m *PodsMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetAverageValue.Size())) - n26, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) + n30, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n30 + if m.Selector != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n31, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + } return i, nil } @@ -768,11 +818,21 @@ func (m *PodsMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) - n27, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + n32, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n32 + if m.Selector != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n33, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n33 + } return i, nil } @@ -804,11 +864,11 @@ func (m *ResourceMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetAverageValue.Size())) - n28, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) + n34, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n34 } return i, nil } @@ -840,11 +900,11 @@ func (m *ResourceMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) - n29, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + n35, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n35 return i, nil } @@ -866,27 +926,27 @@ func (m *Scale) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n30, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n36, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n36 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n31, err := m.Spec.MarshalTo(dAtA[i:]) + n37, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n37 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n32, err := m.Status.MarshalTo(dAtA[i:]) + n38, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n38 return i, nil } @@ -1145,6 +1205,14 @@ func (m *ObjectMetricSource) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.TargetValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageValue != nil { + l = m.AverageValue.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1157,6 +1225,14 @@ func (m *ObjectMetricStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.CurrentValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageValue != nil { + l = m.AverageValue.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1167,6 +1243,10 @@ func (m *PodsMetricSource) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.TargetAverageValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1177,6 +1257,10 @@ func (m *PodsMetricStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.CurrentAverageValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1387,6 +1471,8 @@ func (this *ObjectMetricSource) String() string { `Target:` + strings.Replace(strings.Replace(this.Target.String(), "CrossVersionObjectReference", "CrossVersionObjectReference", 1), `&`, ``, 1) + `,`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `TargetValue:` + strings.Replace(strings.Replace(this.TargetValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `AverageValue:` + strings.Replace(fmt.Sprintf("%v", this.AverageValue), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, `}`, }, "") return s @@ -1399,6 +1485,8 @@ func (this *ObjectMetricStatus) String() string { `Target:` + strings.Replace(strings.Replace(this.Target.String(), "CrossVersionObjectReference", "CrossVersionObjectReference", 1), `&`, ``, 1) + `,`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `CurrentValue:` + strings.Replace(strings.Replace(this.CurrentValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `AverageValue:` + strings.Replace(fmt.Sprintf("%v", this.AverageValue), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, `}`, }, "") return s @@ -1410,6 +1498,7 @@ func (this *PodsMetricSource) String() string { s := strings.Join([]string{`&PodsMetricSource{`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `TargetAverageValue:` + strings.Replace(strings.Replace(this.TargetAverageValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `}`, }, "") return s @@ -1421,6 +1510,7 @@ func (this *PodsMetricStatus) String() string { s := strings.Join([]string{`&PodsMetricStatus{`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `CurrentAverageValue:` + strings.Replace(strings.Replace(this.CurrentAverageValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `}`, }, "") return s @@ -3267,6 +3357,72 @@ func (m *ObjectMetricSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AverageValue == nil { + m.AverageValue = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.AverageValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3406,6 +3562,72 @@ func (m *ObjectMetricStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AverageValue == nil { + m.AverageValue = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.AverageValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3515,6 +3737,39 @@ func (m *PodsMetricSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3624,6 +3879,39 @@ func (m *PodsMetricStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4323,98 +4611,100 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1485 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcb, 0x6f, 0x14, 0x47, - 0x13, 0xf7, 0x3e, 0x6c, 0xec, 0x5e, 0x63, 0xf3, 0x35, 0x08, 0x8c, 0xf9, 0xd8, 0xb1, 0xe6, 0x43, - 0x88, 0x2f, 0x09, 0x33, 0xb1, 0x21, 0x88, 0x1c, 0xbd, 0x9b, 0x10, 0x50, 0xbc, 0x60, 0xda, 0x86, - 0x90, 0x87, 0x22, 0xda, 0xb3, 0xcd, 0xba, 0xf1, 0xce, 0xcc, 0xaa, 0xa7, 0x77, 0x85, 0x91, 0x22, - 0x25, 0x87, 0x9c, 0x13, 0x45, 0x4a, 0x94, 0x63, 0xfe, 0x81, 0x9c, 0x39, 0x27, 0x52, 0x24, 0x8e, - 0x1c, 0x72, 0xe0, 0x34, 0x0a, 0x93, 0x63, 0xfe, 0x03, 0x4e, 0x51, 0x3f, 0x76, 0x76, 0x66, 0x77, - 0x67, 0xfd, 0xc0, 0x58, 0xc9, 0x6d, 0x7a, 0xaa, 0xea, 0x57, 0xdd, 0x55, 0xd5, 0xf5, 0x68, 0x50, - 0xd9, 0xba, 0x1a, 0x58, 0xd4, 0xb7, 0xb7, 0xda, 0x1b, 0x84, 0x79, 0x84, 0x93, 0xc0, 0xee, 0x10, - 0xaf, 0xee, 0x33, 0x5b, 0x13, 0x70, 0x8b, 0xda, 0xb8, 0xcd, 0xfd, 0xc0, 0xc1, 0x4d, 0xea, 0x35, - 0xec, 0xce, 0xa2, 0xdd, 0x20, 0x1e, 0x61, 0x98, 0x93, 0xba, 0xd5, 0x62, 0x3e, 0xf7, 0xe1, 0x69, - 0xc5, 0x6a, 0xe1, 0x16, 0xb5, 0x12, 0xac, 0x56, 0x67, 0x71, 0xfe, 0x62, 0x83, 0xf2, 0xcd, 0xf6, - 0x86, 0xe5, 0xf8, 0xae, 0xdd, 0xf0, 0x1b, 0xbe, 0x2d, 0x25, 0x36, 0xda, 0x0f, 0xe4, 0x4a, 0x2e, - 0xe4, 0x97, 0x42, 0x9a, 0x37, 0x13, 0x4a, 0x1d, 0x9f, 0x91, 0x21, 0xda, 0xe6, 0x2f, 0xf7, 0x78, - 0x5c, 0xec, 0x6c, 0x52, 0x8f, 0xb0, 0x6d, 0xbb, 0xb5, 0xd5, 0x90, 0x42, 0x8c, 0x04, 0x7e, 0x9b, - 0x39, 0x64, 0x4f, 0x52, 0x81, 0xed, 0x12, 0x8e, 0x87, 0xe9, 0xb2, 0xb3, 0xa4, 0x58, 0xdb, 0xe3, - 0xd4, 0x1d, 0x54, 0x73, 0x65, 0x27, 0x81, 0xc0, 0xd9, 0x24, 0x2e, 0x1e, 0x90, 0xbb, 0x94, 0x25, - 0xd7, 0xe6, 0xb4, 0x69, 0x53, 0x8f, 0x07, 0x9c, 0xf5, 0x0b, 0x99, 0xdf, 0xe7, 0xc0, 0x99, 0x2a, - 0xf3, 0x83, 0xe0, 0x2e, 0x61, 0x01, 0xf5, 0xbd, 0x5b, 0x1b, 0x0f, 0x89, 0xc3, 0x11, 0x79, 0x40, - 0x18, 0xf1, 0x1c, 0x02, 0x17, 0x40, 0x71, 0x8b, 0x7a, 0xf5, 0xb9, 0xdc, 0x42, 0xee, 0xc2, 0x54, - 0x65, 0xfa, 0x69, 0x68, 0x8c, 0x45, 0xa1, 0x51, 0xfc, 0x90, 0x7a, 0x75, 0x24, 0x29, 0x82, 0xc3, - 0xc3, 0x2e, 0x99, 0xcb, 0xa7, 0x39, 0x6e, 0x62, 0x97, 0x20, 0x49, 0x81, 0x4b, 0x00, 0xe0, 0x16, - 0xd5, 0x0a, 0xe6, 0x0a, 0x92, 0x0f, 0x6a, 0x3e, 0xb0, 0xbc, 0x7a, 0x43, 0x53, 0x50, 0x82, 0xcb, - 0xfc, 0xa1, 0x00, 0x4e, 0xbc, 0xff, 0x88, 0x13, 0xe6, 0xe1, 0x66, 0x8d, 0x70, 0x46, 0x9d, 0x35, - 0xe9, 0x14, 0x01, 0xe6, 0xca, 0xb5, 0x50, 0xa0, 0xb7, 0x15, 0x83, 0xd5, 0x62, 0x0a, 0x4a, 0x70, - 0x41, 0x1f, 0xcc, 0xa8, 0xd5, 0x1a, 0x69, 0x12, 0x87, 0xfb, 0x4c, 0x6e, 0xb6, 0xb4, 0x74, 0xc9, - 0xea, 0x45, 0x5d, 0x6c, 0x32, 0xab, 0xb5, 0xd5, 0x10, 0x3f, 0x02, 0x4b, 0x78, 0xd4, 0xea, 0x2c, - 0x5a, 0x2b, 0x78, 0x83, 0x34, 0xbb, 0xa2, 0x15, 0x18, 0x85, 0xc6, 0x4c, 0x2d, 0x05, 0x87, 0xfa, - 0xe0, 0x21, 0x06, 0x25, 0x8e, 0x59, 0x83, 0xf0, 0xbb, 0xb8, 0xd9, 0x26, 0xf2, 0xc8, 0xa5, 0x25, - 0x6b, 0x94, 0x36, 0xab, 0x1b, 0x75, 0xd6, 0xed, 0x36, 0xf6, 0x38, 0xe5, 0xdb, 0x95, 0xd9, 0x28, - 0x34, 0x4a, 0xeb, 0x3d, 0x18, 0x94, 0xc4, 0x84, 0x1d, 0x00, 0xd5, 0x72, 0xb9, 0x43, 0x18, 0x6e, - 0x10, 0xa5, 0xa9, 0xb8, 0x2f, 0x4d, 0x27, 0xa3, 0xd0, 0x80, 0xeb, 0x03, 0x68, 0x68, 0x88, 0x06, - 0xf3, 0xa7, 0x41, 0xc7, 0x70, 0xcc, 0xdb, 0xc1, 0xbf, 0xc3, 0x31, 0x9b, 0x60, 0xda, 0x69, 0x33, - 0x46, 0xbc, 0x57, 0xf2, 0xcc, 0x09, 0x7d, 0xac, 0xe9, 0x6a, 0x02, 0x0b, 0xa5, 0x90, 0xe1, 0x36, - 0x38, 0xae, 0xd7, 0x07, 0xe0, 0xa0, 0x53, 0x51, 0x68, 0x1c, 0xaf, 0x0e, 0xc2, 0xa1, 0x61, 0x3a, - 0xcc, 0x27, 0x79, 0x70, 0xea, 0xba, 0xcf, 0xe8, 0x63, 0xdf, 0xe3, 0xb8, 0xb9, 0xea, 0xd7, 0x97, - 0x75, 0x42, 0x25, 0x0c, 0xde, 0x07, 0x93, 0xc2, 0x7a, 0x75, 0xcc, 0xb1, 0xf4, 0x51, 0x69, 0xe9, - 0xed, 0xdd, 0xd9, 0x5a, 0x25, 0x86, 0x1a, 0xe1, 0xb8, 0xe7, 0xd5, 0xde, 0x3f, 0x14, 0xa3, 0xc2, - 0x7b, 0xa0, 0x18, 0xb4, 0x88, 0xa3, 0x3d, 0x79, 0xc5, 0xca, 0x4c, 0xec, 0x56, 0xc6, 0x1e, 0xd7, - 0x5a, 0xc4, 0xe9, 0xe5, 0x11, 0xb1, 0x42, 0x12, 0x11, 0xde, 0x07, 0x13, 0x81, 0x8c, 0x35, 0xed, - 0xb6, 0xab, 0xfb, 0xc0, 0x96, 0xf2, 0x95, 0x19, 0x8d, 0x3e, 0xa1, 0xd6, 0x48, 0xe3, 0x9a, 0x5f, - 0x17, 0xc0, 0x42, 0x86, 0x64, 0xd5, 0xf7, 0xea, 0x94, 0x53, 0xdf, 0x83, 0xd7, 0x41, 0x91, 0x6f, - 0xb7, 0xba, 0x21, 0x7e, 0xb9, 0xbb, 0xd1, 0xf5, 0xed, 0x16, 0x79, 0x19, 0x1a, 0xe7, 0x76, 0x92, - 0x17, 0x7c, 0x48, 0x22, 0xc0, 0x95, 0xf8, 0x40, 0xf9, 0x14, 0x96, 0xde, 0xd6, 0xcb, 0xd0, 0x18, - 0x52, 0xcc, 0xac, 0x18, 0x29, 0xbd, 0x79, 0x91, 0x11, 0x9a, 0x38, 0xe0, 0xeb, 0x0c, 0x7b, 0x81, - 0xd2, 0x44, 0xdd, 0x6e, 0x84, 0xbf, 0xb1, 0x3b, 0x27, 0x0b, 0x89, 0xca, 0xbc, 0xde, 0x05, 0x5c, - 0x19, 0x40, 0x43, 0x43, 0x34, 0xc0, 0xf3, 0x60, 0x82, 0x11, 0x1c, 0xf8, 0x9e, 0x0c, 0xee, 0xa9, - 0x9e, 0x71, 0x91, 0xfc, 0x8b, 0x34, 0x15, 0xfe, 0x1f, 0x1c, 0x71, 0x49, 0x10, 0xe0, 0x06, 0x99, - 0x1b, 0x97, 0x8c, 0xb3, 0x9a, 0xf1, 0x48, 0x4d, 0xfd, 0x46, 0x5d, 0xba, 0xf9, 0x7b, 0x0e, 0x9c, - 0xc9, 0xb0, 0xe3, 0x0a, 0x0d, 0x38, 0xfc, 0x6c, 0x20, 0x8a, 0xad, 0x5d, 0x66, 0x0c, 0x1a, 0xa8, - 0x18, 0x3e, 0xa6, 0x75, 0x4f, 0x76, 0xff, 0x24, 0x22, 0xf8, 0x23, 0x30, 0x4e, 0x39, 0x71, 0x85, - 0x57, 0x0a, 0x17, 0x4a, 0x4b, 0x4b, 0x7b, 0x0f, 0xb3, 0xca, 0x51, 0x0d, 0x3f, 0x7e, 0x43, 0x00, - 0x21, 0x85, 0x67, 0xfe, 0x95, 0xcf, 0x3c, 0x96, 0x08, 0x73, 0xd8, 0x01, 0x33, 0x72, 0xa5, 0x52, - 0x31, 0x22, 0x0f, 0xf4, 0xe1, 0x46, 0x5d, 0xa2, 0x11, 0xc5, 0xbb, 0x72, 0x52, 0xef, 0x62, 0x66, - 0x2d, 0x85, 0x8a, 0xfa, 0xb4, 0xc0, 0x45, 0x50, 0x72, 0xa9, 0x87, 0x48, 0xab, 0x49, 0x1d, 0xac, - 0x82, 0x71, 0x5c, 0x95, 0x9f, 0x5a, 0xef, 0x37, 0x4a, 0xf2, 0xc0, 0x77, 0x40, 0xc9, 0xc5, 0x8f, - 0x62, 0x91, 0x82, 0x14, 0x39, 0xae, 0xf5, 0x95, 0x6a, 0x3d, 0x12, 0x4a, 0xf2, 0xc1, 0x87, 0xa0, - 0xac, 0x6a, 0x4a, 0x75, 0xf5, 0xce, 0x1d, 0x4e, 0x9b, 0xf4, 0x31, 0x16, 0x71, 0xb4, 0x4a, 0x98, - 0x43, 0x3c, 0x2e, 0x42, 0xa3, 0x28, 0x91, 0xcc, 0x28, 0x34, 0xca, 0xeb, 0x23, 0x39, 0xd1, 0x0e, - 0x48, 0xe6, 0x2f, 0x05, 0x70, 0x76, 0x64, 0x1a, 0x80, 0xd7, 0x00, 0xf4, 0x37, 0x02, 0xc2, 0x3a, - 0xa4, 0xfe, 0x81, 0xea, 0x8b, 0x44, 0x83, 0x22, 0x6c, 0x5e, 0x50, 0x35, 0xf1, 0xd6, 0x00, 0x15, - 0x0d, 0x91, 0x80, 0x0e, 0x38, 0x2a, 0xee, 0x85, 0xb2, 0x32, 0xd5, 0xbd, 0xd0, 0xde, 0x2e, 0xdd, - 0x7f, 0xa2, 0xd0, 0x38, 0xba, 0x92, 0x04, 0x41, 0x69, 0x4c, 0xb8, 0x0c, 0x66, 0x75, 0xb2, 0xef, - 0xb3, 0xfa, 0x29, 0x6d, 0xf5, 0xd9, 0x6a, 0x9a, 0x8c, 0xfa, 0xf9, 0x05, 0x44, 0x9d, 0x04, 0x94, - 0x91, 0x7a, 0x0c, 0x51, 0x4c, 0x43, 0xbc, 0x97, 0x26, 0xa3, 0x7e, 0x7e, 0xe8, 0x02, 0x43, 0xa3, - 0x66, 0x7a, 0x70, 0x5c, 0x42, 0xfe, 0x2f, 0x0a, 0x0d, 0xa3, 0x3a, 0x9a, 0x15, 0xed, 0x84, 0x25, - 0xda, 0x40, 0xdd, 0x3b, 0xc8, 0x0b, 0x72, 0x39, 0x95, 0x7a, 0x17, 0xfa, 0x52, 0xef, 0xb1, 0x64, - 0xa3, 0x98, 0x48, 0xb3, 0xb7, 0xc1, 0x84, 0x2f, 0x6f, 0x86, 0xf6, 0xcb, 0xc5, 0x11, 0xd7, 0x29, - 0x2e, 0x69, 0x31, 0x50, 0x05, 0x88, 0x5c, 0xa6, 0xaf, 0x96, 0x06, 0x82, 0x37, 0x40, 0xb1, 0xe5, - 0xd7, 0xbb, 0x85, 0xe8, 0xcd, 0x11, 0x80, 0xab, 0x7e, 0x3d, 0x48, 0xc1, 0x4d, 0x8a, 0x1d, 0x8b, - 0xbf, 0x48, 0x42, 0xc0, 0x8f, 0xc1, 0x64, 0xb7, 0xe0, 0xeb, 0xee, 0xc0, 0x1e, 0x01, 0x87, 0x34, - 0x6b, 0x0a, 0x72, 0x5a, 0x24, 0xb2, 0x2e, 0x05, 0xc5, 0x70, 0x02, 0x9a, 0xe8, 0x56, 0x4d, 0x7a, - 0x65, 0x34, 0xf4, 0xb0, 0x76, 0x5b, 0x41, 0x77, 0x29, 0x28, 0x86, 0x33, 0x7f, 0x2c, 0x80, 0xe9, - 0x54, 0xfb, 0x77, 0xc8, 0xae, 0x51, 0x75, 0xfc, 0xc0, 0x5c, 0xa3, 0xe0, 0x0e, 0xd4, 0x35, 0x0a, - 0xf2, 0xb5, 0xb8, 0x26, 0x01, 0x3d, 0xc4, 0x35, 0xdf, 0xe4, 0x01, 0x1c, 0x0c, 0x63, 0xf8, 0x39, - 0x98, 0x50, 0x09, 0xf3, 0x15, 0x8b, 0x4a, 0x5c, 0xde, 0x75, 0xfd, 0xd0, 0xa8, 0x7d, 0xfd, 0x7f, - 0x7e, 0x57, 0xfd, 0x3f, 0x39, 0x88, 0x39, 0x29, 0xae, 0x3a, 0x59, 0xb3, 0x92, 0xf9, 0x5d, 0xbf, - 0x45, 0x54, 0xc8, 0xfe, 0x13, 0x2d, 0x72, 0x68, 0x03, 0x8a, 0xf9, 0x6b, 0x0e, 0x1c, 0xeb, 0x4f, - 0x4e, 0xfb, 0x1a, 0xe2, 0x1e, 0x0f, 0x9d, 0x44, 0xf3, 0xfb, 0xda, 0x78, 0xdc, 0x7b, 0xee, 0x72, - 0x1a, 0xfd, 0x2d, 0x7d, 0x88, 0xfd, 0x4f, 0xa2, 0x5f, 0x0c, 0x1f, 0xd7, 0xf6, 0x77, 0x8a, 0x33, - 0x5a, 0xd9, 0xee, 0x47, 0xb6, 0x9f, 0xf3, 0xe0, 0xc4, 0xb0, 0xd4, 0x0e, 0xab, 0xfa, 0x75, 0x45, - 0x9d, 0xc2, 0x4e, 0xbe, 0xae, 0xbc, 0x0c, 0x0d, 0x63, 0xc8, 0x78, 0xd0, 0x85, 0x49, 0x3c, 0xc0, - 0xdc, 0x03, 0x73, 0x29, 0xdb, 0x25, 0x6a, 0xad, 0x6e, 0xf6, 0xfe, 0x1b, 0x85, 0xc6, 0xdc, 0x7a, - 0x06, 0x0f, 0xca, 0x94, 0xce, 0x78, 0x85, 0x28, 0xbc, 0xf6, 0x57, 0x88, 0x27, 0x83, 0xf6, 0x52, - 0xbe, 0x3f, 0x10, 0x7b, 0x7d, 0x0a, 0x4e, 0xa7, 0x9d, 0x34, 0x68, 0xb0, 0xb3, 0x51, 0x68, 0x9c, - 0xae, 0x66, 0x31, 0xa1, 0x6c, 0xf9, 0xac, 0x48, 0x2b, 0x1c, 0x52, 0xa4, 0x7d, 0x95, 0x07, 0xe3, - 0xb2, 0xa9, 0x3c, 0x84, 0xa7, 0x80, 0x6b, 0xa9, 0xa7, 0x80, 0x73, 0x23, 0xd2, 0xab, 0xdc, 0x51, - 0xe6, 0xe0, 0x7f, 0xb3, 0x6f, 0xf0, 0x3f, 0xbf, 0x23, 0xd2, 0xe8, 0x31, 0xff, 0x5d, 0x30, 0x15, - 0x2b, 0x84, 0x6f, 0x89, 0x22, 0xaf, 0xbb, 0xe1, 0x9c, 0xf4, 0x6d, 0x3c, 0x1b, 0xc6, 0x6d, 0x70, - 0xcc, 0x61, 0x52, 0x50, 0x4a, 0x68, 0xd8, 0x9b, 0xb0, 0xe0, 0x0e, 0x92, 0x0f, 0x5d, 0x53, 0x3d, - 0xee, 0xf8, 0xc5, 0x2a, 0xe6, 0xa8, 0x5c, 0x78, 0xfa, 0xa2, 0x3c, 0xf6, 0xec, 0x45, 0x79, 0xec, - 0xf9, 0x8b, 0xf2, 0xd8, 0x97, 0x51, 0x39, 0xf7, 0x34, 0x2a, 0xe7, 0x9e, 0x45, 0xe5, 0xdc, 0xf3, - 0xa8, 0x9c, 0xfb, 0x23, 0x2a, 0xe7, 0xbe, 0xfd, 0xb3, 0x3c, 0xf6, 0x49, 0xbe, 0xb3, 0xf8, 0x77, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x61, 0x55, 0xfd, 0xeb, 0x81, 0x17, 0x00, 0x00, + // 1516 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcf, 0x6f, 0x13, 0xc7, + 0x17, 0x8f, 0x7f, 0x24, 0x24, 0xe3, 0x90, 0xe4, 0x3b, 0x20, 0x08, 0xe1, 0x8b, 0x37, 0xda, 0x22, + 0x44, 0x7f, 0xb0, 0x6e, 0x52, 0x8a, 0xe8, 0x31, 0x76, 0x4b, 0x41, 0x8d, 0x21, 0x4c, 0x02, 0xa5, + 0x3f, 0xc5, 0x64, 0x3d, 0x38, 0x43, 0xbc, 0xbb, 0xd6, 0xec, 0xd8, 0x22, 0x48, 0x95, 0xda, 0x43, + 0xef, 0xbd, 0xb4, 0xea, 0xb1, 0x95, 0x7a, 0xed, 0x99, 0x73, 0x6f, 0x1c, 0x39, 0x20, 0x95, 0xd3, + 0xaa, 0x6c, 0x8f, 0xfd, 0x0f, 0x38, 0x55, 0xf3, 0xc3, 0xeb, 0x5d, 0xdb, 0xeb, 0x24, 0x26, 0x44, + 0x6d, 0x6f, 0x3b, 0x33, 0xef, 0x7d, 0xde, 0xec, 0x7b, 0x6f, 0xde, 0x2f, 0x50, 0xde, 0xbe, 0xec, + 0x5b, 0xd4, 0x2b, 0x6d, 0xb7, 0x36, 0x09, 0x73, 0x09, 0x27, 0x7e, 0xa9, 0x4d, 0xdc, 0x9a, 0xc7, + 0x4a, 0xfa, 0x00, 0x37, 0x69, 0x09, 0xb7, 0xb8, 0xe7, 0xdb, 0xb8, 0x41, 0xdd, 0x7a, 0xa9, 0xbd, + 0x54, 0xaa, 0x13, 0x97, 0x30, 0xcc, 0x49, 0xcd, 0x6a, 0x32, 0x8f, 0x7b, 0xf0, 0x94, 0x22, 0xb5, + 0x70, 0x93, 0x5a, 0x31, 0x52, 0xab, 0xbd, 0xb4, 0x70, 0xa1, 0x4e, 0xf9, 0x56, 0x6b, 0xd3, 0xb2, + 0x3d, 0xa7, 0x54, 0xf7, 0xea, 0x5e, 0x49, 0x72, 0x6c, 0xb6, 0xee, 0xc9, 0x95, 0x5c, 0xc8, 0x2f, + 0x85, 0xb4, 0x60, 0xc6, 0x84, 0xda, 0x1e, 0x23, 0x03, 0xa4, 0x2d, 0x5c, 0xec, 0xd2, 0x38, 0xd8, + 0xde, 0xa2, 0x2e, 0x61, 0x3b, 0xa5, 0xe6, 0x76, 0x5d, 0x32, 0x31, 0xe2, 0x7b, 0x2d, 0x66, 0x93, + 0x7d, 0x71, 0xf9, 0x25, 0x87, 0x70, 0x3c, 0x48, 0x56, 0x29, 0x8d, 0x8b, 0xb5, 0x5c, 0x4e, 0x9d, + 0x7e, 0x31, 0x97, 0x76, 0x63, 0xf0, 0xed, 0x2d, 0xe2, 0xe0, 0x5e, 0x3e, 0xf3, 0xfb, 0x0c, 0x38, + 0x5d, 0x61, 0x9e, 0xef, 0xdf, 0x26, 0xcc, 0xa7, 0x9e, 0x7b, 0x63, 0xf3, 0x3e, 0xb1, 0x39, 0x22, + 0xf7, 0x08, 0x23, 0xae, 0x4d, 0xe0, 0x22, 0xc8, 0x6f, 0x53, 0xb7, 0x36, 0x9f, 0x59, 0xcc, 0x9c, + 0x9f, 0x2a, 0x4f, 0x3f, 0x0e, 0x8c, 0xb1, 0x30, 0x30, 0xf2, 0x1f, 0x51, 0xb7, 0x86, 0xe4, 0x89, + 0xa0, 0x70, 0xb1, 0x43, 0xe6, 0xb3, 0x49, 0x8a, 0xeb, 0xd8, 0x21, 0x48, 0x9e, 0xc0, 0x65, 0x00, + 0x70, 0x93, 0x6a, 0x01, 0xf3, 0x39, 0x49, 0x07, 0x35, 0x1d, 0x58, 0x59, 0xbb, 0xa6, 0x4f, 0x50, + 0x8c, 0xca, 0xfc, 0x21, 0x07, 0x8e, 0x7f, 0xf0, 0x80, 0x13, 0xe6, 0xe2, 0x46, 0x95, 0x70, 0x46, + 0xed, 0x75, 0xa9, 0x5f, 0x01, 0xe6, 0xc8, 0xb5, 0x10, 0xa0, 0xaf, 0x15, 0x81, 0x55, 0xa3, 0x13, + 0x14, 0xa3, 0x82, 0x1e, 0x98, 0x51, 0xab, 0x75, 0xd2, 0x20, 0x36, 0xf7, 0x98, 0xbc, 0x6c, 0x61, + 0xf9, 0x1d, 0xab, 0xeb, 0x40, 0x91, 0xd6, 0xac, 0xe6, 0x76, 0x5d, 0x6c, 0xf8, 0x96, 0x30, 0x8e, + 0xd5, 0x5e, 0xb2, 0x56, 0xf1, 0x26, 0x69, 0x74, 0x58, 0xcb, 0x30, 0x0c, 0x8c, 0x99, 0x6a, 0x02, + 0x0e, 0xf5, 0xc0, 0x43, 0x0c, 0x0a, 0x1c, 0xb3, 0x3a, 0xe1, 0xb7, 0x71, 0xa3, 0x45, 0xe4, 0x2f, + 0x17, 0x96, 0xad, 0x61, 0xd2, 0xac, 0x8e, 0x03, 0x59, 0x37, 0x5b, 0xd8, 0xe5, 0x94, 0xef, 0x94, + 0x67, 0xc3, 0xc0, 0x28, 0x6c, 0x74, 0x61, 0x50, 0x1c, 0x13, 0xb6, 0x01, 0x54, 0xcb, 0x95, 0x36, + 0x61, 0xb8, 0x4e, 0x94, 0xa4, 0xfc, 0x48, 0x92, 0x4e, 0x84, 0x81, 0x01, 0x37, 0xfa, 0xd0, 0xd0, + 0x00, 0x09, 0xe6, 0x4f, 0xfd, 0x86, 0xe1, 0x98, 0xb7, 0xfc, 0x7f, 0x87, 0x61, 0xb6, 0xc0, 0xb4, + 0xdd, 0x62, 0x8c, 0xb8, 0x2f, 0x65, 0x99, 0xe3, 0xfa, 0xb7, 0xa6, 0x2b, 0x31, 0x2c, 0x94, 0x40, + 0x86, 0x3b, 0xe0, 0x98, 0x5e, 0x1f, 0x80, 0x81, 0x4e, 0x86, 0x81, 0x71, 0xac, 0xd2, 0x0f, 0x87, + 0x06, 0xc9, 0x30, 0x1f, 0x65, 0xc1, 0xc9, 0xab, 0x1e, 0xa3, 0x0f, 0x3d, 0x97, 0xe3, 0xc6, 0x9a, + 0x57, 0x5b, 0xd1, 0xb1, 0x91, 0x30, 0x78, 0x17, 0x4c, 0x0a, 0xed, 0xd5, 0x30, 0xc7, 0xd2, 0x46, + 0x85, 0xe5, 0xb7, 0xf7, 0xa6, 0x6b, 0x15, 0x18, 0xaa, 0x84, 0xe3, 0xae, 0x55, 0xbb, 0x7b, 0x28, + 0x42, 0x85, 0x77, 0x40, 0xde, 0x6f, 0x12, 0x5b, 0x5b, 0xf2, 0x92, 0x95, 0x1a, 0xa3, 0xad, 0x94, + 0x3b, 0xae, 0x37, 0x89, 0xdd, 0x8d, 0x23, 0x62, 0x85, 0x24, 0x22, 0xbc, 0x0b, 0x26, 0x7c, 0xe9, + 0x6b, 0xda, 0x6c, 0x97, 0x47, 0xc0, 0x96, 0xfc, 0xe5, 0x19, 0x8d, 0x3e, 0xa1, 0xd6, 0x48, 0xe3, + 0x9a, 0xdf, 0xe6, 0xc0, 0x62, 0x0a, 0x67, 0xc5, 0x73, 0x6b, 0x94, 0x53, 0xcf, 0x85, 0x57, 0x41, + 0x9e, 0xef, 0x34, 0x3b, 0x2e, 0x7e, 0xb1, 0x73, 0xd1, 0x8d, 0x9d, 0x26, 0x79, 0x11, 0x18, 0x67, + 0x77, 0xe3, 0x17, 0x74, 0x48, 0x22, 0xc0, 0xd5, 0xe8, 0x87, 0xb2, 0x09, 0x2c, 0x7d, 0xad, 0x17, + 0x81, 0x31, 0x20, 0x2f, 0x59, 0x11, 0x52, 0xf2, 0xf2, 0x22, 0x22, 0x34, 0xb0, 0xcf, 0x37, 0x18, + 0x76, 0x7d, 0x25, 0x89, 0x3a, 0x1d, 0x0f, 0x7f, 0x63, 0x6f, 0x46, 0x16, 0x1c, 0xe5, 0x05, 0x7d, + 0x0b, 0xb8, 0xda, 0x87, 0x86, 0x06, 0x48, 0x80, 0xe7, 0xc0, 0x04, 0x23, 0xd8, 0xf7, 0x5c, 0xe9, + 0xdc, 0x53, 0x5d, 0xe5, 0x22, 0xb9, 0x8b, 0xf4, 0x29, 0x7c, 0x1d, 0x1c, 0x71, 0x88, 0xef, 0xe3, + 0x3a, 0x99, 0x1f, 0x97, 0x84, 0xb3, 0x9a, 0xf0, 0x48, 0x55, 0x6d, 0xa3, 0xce, 0xb9, 0xf9, 0x34, + 0x03, 0x4e, 0xa7, 0xe8, 0x71, 0x95, 0xfa, 0x1c, 0x7e, 0xde, 0xe7, 0xc5, 0xd6, 0x1e, 0x23, 0x06, + 0xf5, 0x95, 0x0f, 0xcf, 0x69, 0xd9, 0x93, 0x9d, 0x9d, 0x98, 0x07, 0x7f, 0x0c, 0xc6, 0x29, 0x27, + 0x8e, 0xb0, 0x4a, 0xee, 0x7c, 0x61, 0x79, 0x79, 0xff, 0x6e, 0x56, 0x3e, 0xaa, 0xe1, 0xc7, 0xaf, + 0x09, 0x20, 0xa4, 0xf0, 0xcc, 0xbf, 0xb2, 0xa9, 0xbf, 0x25, 0xdc, 0x1c, 0xb6, 0xc1, 0x8c, 0x5c, + 0xa9, 0x50, 0x8c, 0xc8, 0x3d, 0xfd, 0x73, 0xc3, 0x1e, 0xd1, 0x90, 0xe4, 0x5d, 0x3e, 0xa1, 0x6f, + 0x31, 0xb3, 0x9e, 0x40, 0x45, 0x3d, 0x52, 0xe0, 0x12, 0x28, 0x38, 0xd4, 0x45, 0xa4, 0xd9, 0xa0, + 0x36, 0x56, 0xce, 0x38, 0xae, 0xd2, 0x4f, 0xb5, 0xbb, 0x8d, 0xe2, 0x34, 0xf0, 0x5d, 0x50, 0x70, + 0xf0, 0x83, 0x88, 0x25, 0x27, 0x59, 0x8e, 0x69, 0x79, 0x85, 0x6a, 0xf7, 0x08, 0xc5, 0xe9, 0xe0, + 0x7d, 0x50, 0x54, 0x39, 0xa5, 0xb2, 0x76, 0xeb, 0x16, 0xa7, 0x0d, 0xfa, 0x10, 0x0b, 0x3f, 0x5a, + 0x23, 0xcc, 0x26, 0x2e, 0x17, 0xae, 0x91, 0x97, 0x48, 0x66, 0x18, 0x18, 0xc5, 0x8d, 0xa1, 0x94, + 0x68, 0x17, 0x24, 0xf3, 0xb7, 0x1c, 0x38, 0x33, 0x34, 0x0c, 0xc0, 0x2b, 0x00, 0x7a, 0x9b, 0x3e, + 0x61, 0x6d, 0x52, 0xfb, 0x50, 0xd5, 0x45, 0xa2, 0x40, 0x11, 0x3a, 0xcf, 0xa9, 0x9c, 0x78, 0xa3, + 0xef, 0x14, 0x0d, 0xe0, 0x80, 0x36, 0x38, 0x2a, 0xde, 0x85, 0xd2, 0x32, 0xd5, 0xb5, 0xd0, 0xfe, + 0x1e, 0xdd, 0xff, 0xc2, 0xc0, 0x38, 0xba, 0x1a, 0x07, 0x41, 0x49, 0x4c, 0xb8, 0x02, 0x66, 0x75, + 0xb0, 0xef, 0xd1, 0xfa, 0x49, 0xad, 0xf5, 0xd9, 0x4a, 0xf2, 0x18, 0xf5, 0xd2, 0x0b, 0x88, 0x1a, + 0xf1, 0x29, 0x23, 0xb5, 0x08, 0x22, 0x9f, 0x84, 0x78, 0x3f, 0x79, 0x8c, 0x7a, 0xe9, 0xa1, 0x03, + 0x0c, 0x8d, 0x9a, 0x6a, 0xc1, 0x71, 0x09, 0xf9, 0x5a, 0x18, 0x18, 0x46, 0x65, 0x38, 0x29, 0xda, + 0x0d, 0x4b, 0x94, 0x81, 0xba, 0x76, 0x90, 0x0f, 0xe4, 0x62, 0x22, 0xf4, 0x2e, 0xf6, 0x84, 0xde, + 0xb9, 0x78, 0xa1, 0x18, 0x0b, 0xb3, 0x37, 0xc1, 0x84, 0x27, 0x5f, 0x86, 0xb6, 0xcb, 0x85, 0x21, + 0xcf, 0x29, 0x4a, 0x69, 0x11, 0x50, 0x19, 0x88, 0x58, 0xa6, 0x9f, 0x96, 0x06, 0x82, 0xd7, 0x40, + 0xbe, 0xe9, 0xd5, 0x3a, 0x89, 0xe8, 0xcd, 0x21, 0x80, 0x6b, 0x5e, 0xcd, 0x4f, 0xc0, 0x4d, 0x8a, + 0x1b, 0x8b, 0x5d, 0x24, 0x21, 0xe0, 0x27, 0x60, 0xb2, 0x93, 0xf0, 0x75, 0x75, 0x50, 0x1a, 0x02, + 0x87, 0x34, 0x69, 0x02, 0x72, 0x5a, 0x04, 0xb2, 0xce, 0x09, 0x8a, 0xe0, 0x04, 0x34, 0xd1, 0xa5, + 0x9a, 0xb4, 0xca, 0x70, 0xe8, 0x41, 0xe5, 0xb6, 0x82, 0xee, 0x9c, 0xa0, 0x08, 0xce, 0xfc, 0x31, + 0x07, 0xa6, 0x13, 0xe5, 0xdf, 0x21, 0x9b, 0x46, 0xe5, 0xf1, 0x03, 0x33, 0x8d, 0x82, 0x3b, 0x50, + 0xd3, 0x28, 0xc8, 0x57, 0x62, 0x9a, 0x18, 0xf4, 0x00, 0xd3, 0x3c, 0xcd, 0x01, 0xd8, 0xef, 0xc6, + 0xf0, 0x4b, 0x30, 0xa1, 0x02, 0xe6, 0x4b, 0x26, 0x95, 0x28, 0xbd, 0xeb, 0xfc, 0xa1, 0x51, 0x7b, + 0xea, 0xff, 0xec, 0x9e, 0xea, 0x7f, 0x72, 0x10, 0x7d, 0x52, 0x94, 0x75, 0x52, 0x7b, 0xa5, 0x2f, + 0xc0, 0xa4, 0xdf, 0x69, 0x30, 0xf2, 0xa3, 0x37, 0x18, 0x52, 0xe1, 0x51, 0x6b, 0x11, 0x41, 0xc2, + 0x1a, 0x98, 0xc6, 0xf1, 0x1a, 0x7f, 0x7c, 0xa4, 0xdf, 0x98, 0x13, 0x0d, 0x45, 0xa2, 0xb8, 0x4f, + 0xa0, 0x9a, 0xbf, 0xf7, 0x9a, 0x55, 0xbd, 0xbb, 0x7f, 0xa2, 0x59, 0x0f, 0xaf, 0xcb, 0xfa, 0x4f, + 0x58, 0xf6, 0xe7, 0x2c, 0x98, 0xeb, 0x4d, 0x13, 0x23, 0xb5, 0xd3, 0x0f, 0x07, 0xce, 0x04, 0xb2, + 0x23, 0x5d, 0x3a, 0xea, 0x02, 0xf6, 0x36, 0x17, 0x48, 0x58, 0x22, 0x77, 0xe0, 0x96, 0x30, 0x7f, + 0x49, 0xea, 0x68, 0xf4, 0x91, 0xc3, 0x57, 0x83, 0xfb, 0xf2, 0xd1, 0x94, 0x74, 0x5a, 0x0b, 0xdb, + 0x73, 0x6f, 0xfe, 0xaa, 0xd5, 0xf4, 0x6b, 0x16, 0x1c, 0x1f, 0x54, 0x22, 0xc0, 0x8a, 0x9e, 0xd2, + 0x29, 0x25, 0x95, 0xe2, 0x53, 0xba, 0x17, 0x81, 0x61, 0x0c, 0x68, 0x33, 0x3b, 0x30, 0xb1, 0x41, + 0xde, 0x1d, 0x30, 0x9f, 0xb0, 0x7c, 0xac, 0x66, 0xd3, 0x4d, 0xc3, 0xff, 0xc3, 0xc0, 0x98, 0xdf, + 0x48, 0xa1, 0x41, 0xa9, 0xdc, 0x29, 0xd3, 0xac, 0xdc, 0x2b, 0x9f, 0x66, 0x3d, 0xea, 0xd7, 0x97, + 0x72, 0xad, 0x03, 0xd1, 0xd7, 0x67, 0xe0, 0x54, 0xd2, 0x07, 0xfa, 0x15, 0x76, 0x26, 0x0c, 0x8c, + 0x53, 0x95, 0x34, 0x22, 0x94, 0xce, 0x9f, 0xe6, 0xc8, 0xb9, 0xc3, 0x71, 0x64, 0xf3, 0x9b, 0x2c, + 0x18, 0x97, 0xcd, 0xc9, 0x21, 0x8c, 0x94, 0xae, 0x24, 0x46, 0x4a, 0x67, 0x87, 0x64, 0x38, 0x79, + 0xa3, 0xd4, 0x01, 0xd2, 0xf5, 0x9e, 0x01, 0xd2, 0xb9, 0x5d, 0x91, 0x86, 0x8f, 0x8b, 0xde, 0x03, + 0x53, 0x91, 0x40, 0xf8, 0x96, 0x28, 0x16, 0x75, 0x57, 0x95, 0x91, 0xb6, 0x8d, 0x66, 0x0c, 0x51, + 0x3b, 0x15, 0x51, 0x98, 0x14, 0x14, 0x62, 0x12, 0xf6, 0xc7, 0x2c, 0xa8, 0xfd, 0xf8, 0xc0, 0x74, + 0xaa, 0x4b, 0xdd, 0x1f, 0x13, 0xca, 0xe7, 0x1f, 0x3f, 0x2f, 0x8e, 0x3d, 0x79, 0x5e, 0x1c, 0x7b, + 0xf6, 0xbc, 0x38, 0xf6, 0x75, 0x58, 0xcc, 0x3c, 0x0e, 0x8b, 0x99, 0x27, 0x61, 0x31, 0xf3, 0x2c, + 0x2c, 0x66, 0xfe, 0x08, 0x8b, 0x99, 0xef, 0xfe, 0x2c, 0x8e, 0x7d, 0x9a, 0x6d, 0x2f, 0xfd, 0x1d, + 0x00, 0x00, 0xff, 0xff, 0x3c, 0x26, 0x41, 0xcb, 0x94, 0x19, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/autoscaling/v1/generated.proto b/vendor/k8s.io/api/autoscaling/v1/generated.proto index 2ff7f9e2..5b56b2ac 100644 --- a/vendor/k8s.io/api/autoscaling/v1/generated.proto +++ b/vendor/k8s.io/api/autoscaling/v1/generated.proto @@ -26,7 +26,6 @@ import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; @@ -258,6 +257,17 @@ message ObjectMetricSource { // targetValue is the target value of the metric (as a quantity). optional k8s.io.apimachinery.pkg.api.resource.Quantity targetValue = 3; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric. + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 4; + + // averageValue is the target value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity averageValue = 5; } // ObjectMetricStatus indicates the current value of a metric describing a @@ -271,6 +281,17 @@ message ObjectMetricStatus { // currentValue is the current value of the metric (as a quantity). optional k8s.io.apimachinery.pkg.api.resource.Quantity currentValue = 3; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 4; + + // averageValue is the current value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity averageValue = 5; } // PodsMetricSource indicates how to scale on a metric describing each pod in @@ -284,6 +305,12 @@ message PodsMetricSource { // targetAverageValue is the target value of the average of the // metric across all relevant pods (as a quantity) optional k8s.io.apimachinery.pkg.api.resource.Quantity targetAverageValue = 2; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 3; } // PodsMetricStatus indicates the current value of a metric describing each pod in @@ -295,6 +322,12 @@ message PodsMetricStatus { // currentAverageValue is the current value of the average of the // metric across all relevant pods (as a quantity) optional k8s.io.apimachinery.pkg.api.resource.Quantity currentAverageValue = 2; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 3; } // ResourceMetricSource indicates how to scale on a resource metric known to diff --git a/vendor/k8s.io/api/autoscaling/v1/types.go b/vendor/k8s.io/api/autoscaling/v1/types.go index 344af774..c03af13a 100644 --- a/vendor/k8s.io/api/autoscaling/v1/types.go +++ b/vendor/k8s.io/api/autoscaling/v1/types.go @@ -211,6 +211,16 @@ type ObjectMetricSource struct { MetricName string `json:"metricName" protobuf:"bytes,2,name=metricName"` // targetValue is the target value of the metric (as a quantity). TargetValue resource.Quantity `json:"targetValue" protobuf:"bytes,3,name=targetValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric. + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,4,name=selector"` + // averageValue is the target value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + AverageValue *resource.Quantity `json:"averageValue,omitempty" protobuf:"bytes,5,name=averageValue"` } // PodsMetricSource indicates how to scale on a metric describing each pod in @@ -223,6 +233,12 @@ type PodsMetricSource struct { // targetAverageValue is the target value of the average of the // metric across all relevant pods (as a quantity) TargetAverageValue resource.Quantity `json:"targetAverageValue" protobuf:"bytes,2,name=targetAverageValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,3,name=selector"` } // ResourceMetricSource indicates how to scale on a resource metric known to @@ -344,6 +360,16 @@ type ObjectMetricStatus struct { MetricName string `json:"metricName" protobuf:"bytes,2,name=metricName"` // currentValue is the current value of the metric (as a quantity). CurrentValue resource.Quantity `json:"currentValue" protobuf:"bytes,3,name=currentValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,4,name=selector"` + // averageValue is the current value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + AverageValue *resource.Quantity `json:"averageValue,omitempty" protobuf:"bytes,5,name=averageValue"` } // PodsMetricStatus indicates the current value of a metric describing each pod in @@ -354,6 +380,12 @@ type PodsMetricStatus struct { // currentAverageValue is the current value of the average of the // metric across all relevant pods (as a quantity) CurrentAverageValue resource.Quantity `json:"currentAverageValue" protobuf:"bytes,2,name=currentAverageValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,3,name=selector"` } // ResourceMetricStatus indicates the current value of a resource metric known to diff --git a/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go index e8490926..a6e874f3 100644 --- a/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go @@ -148,10 +148,12 @@ func (MetricStatus) SwaggerDoc() map[string]string { } var map_ObjectMetricSource = map[string]string{ - "": "ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", - "target": "target is the described Kubernetes object.", - "metricName": "metricName is the name of the metric in question.", - "targetValue": "targetValue is the target value of the metric (as a quantity).", + "": "ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "target": "target is the described Kubernetes object.", + "metricName": "metricName is the name of the metric in question.", + "targetValue": "targetValue is the target value of the metric (as a quantity).", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric. When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics.", + "averageValue": "averageValue is the target value of the average of the metric across all relevant pods (as a quantity)", } func (ObjectMetricSource) SwaggerDoc() map[string]string { @@ -163,6 +165,8 @@ var map_ObjectMetricStatus = map[string]string{ "target": "target is the described Kubernetes object.", "metricName": "metricName is the name of the metric in question.", "currentValue": "currentValue is the current value of the metric (as a quantity).", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics.", + "averageValue": "averageValue is the current value of the average of the metric across all relevant pods (as a quantity)", } func (ObjectMetricStatus) SwaggerDoc() map[string]string { @@ -173,6 +177,7 @@ var map_PodsMetricSource = map[string]string{ "": "PodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", "metricName": "metricName is the name of the metric in question", "targetAverageValue": "targetAverageValue is the target value of the average of the metric across all relevant pods (as a quantity)", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics.", } func (PodsMetricSource) SwaggerDoc() map[string]string { @@ -183,6 +188,7 @@ var map_PodsMetricStatus = map[string]string{ "": "PodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).", "metricName": "metricName is the name of the metric in question", "currentAverageValue": "currentAverageValue is the current value of the average of the metric across all relevant pods (as a quantity)", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics.", } func (PodsMetricStatus) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go index ee9ac01d..3fda47d5 100644 --- a/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1 import ( - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -46,30 +46,18 @@ func (in *ExternalMetricSource) DeepCopyInto(out *ExternalMetricSource) { *out = *in if in.MetricSelector != nil { in, out := &in.MetricSelector, &out.MetricSelector - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.TargetValue != nil { in, out := &in.TargetValue, &out.TargetValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } if in.TargetAverageValue != nil { in, out := &in.TargetAverageValue, &out.TargetAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -89,22 +77,14 @@ func (in *ExternalMetricStatus) DeepCopyInto(out *ExternalMetricStatus) { *out = *in if in.MetricSelector != nil { in, out := &in.MetricSelector, &out.MetricSelector - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) } out.CurrentValue = in.CurrentValue.DeepCopy() if in.CurrentAverageValue != nil { in, out := &in.CurrentAverageValue, &out.CurrentAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -203,21 +183,13 @@ func (in *HorizontalPodAutoscalerSpec) DeepCopyInto(out *HorizontalPodAutoscaler out.ScaleTargetRef = in.ScaleTargetRef if in.MinReplicas != nil { in, out := &in.MinReplicas, &out.MinReplicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.TargetCPUUtilizationPercentage != nil { in, out := &in.TargetCPUUtilizationPercentage, &out.TargetCPUUtilizationPercentage - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -237,29 +209,17 @@ func (in *HorizontalPodAutoscalerStatus) DeepCopyInto(out *HorizontalPodAutoscal *out = *in if in.ObservedGeneration != nil { in, out := &in.ObservedGeneration, &out.ObservedGeneration - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.LastScaleTime != nil { in, out := &in.LastScaleTime, &out.LastScaleTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.CurrentCPUUtilizationPercentage != nil { in, out := &in.CurrentCPUUtilizationPercentage, &out.CurrentCPUUtilizationPercentage - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -279,39 +239,23 @@ func (in *MetricSpec) DeepCopyInto(out *MetricSpec) { *out = *in if in.Object != nil { in, out := &in.Object, &out.Object - if *in == nil { - *out = nil - } else { - *out = new(ObjectMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ObjectMetricSource) + (*in).DeepCopyInto(*out) } if in.Pods != nil { in, out := &in.Pods, &out.Pods - if *in == nil { - *out = nil - } else { - *out = new(PodsMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(PodsMetricSource) + (*in).DeepCopyInto(*out) } if in.Resource != nil { in, out := &in.Resource, &out.Resource - if *in == nil { - *out = nil - } else { - *out = new(ResourceMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceMetricSource) + (*in).DeepCopyInto(*out) } if in.External != nil { in, out := &in.External, &out.External - if *in == nil { - *out = nil - } else { - *out = new(ExternalMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ExternalMetricSource) + (*in).DeepCopyInto(*out) } return } @@ -331,39 +275,23 @@ func (in *MetricStatus) DeepCopyInto(out *MetricStatus) { *out = *in if in.Object != nil { in, out := &in.Object, &out.Object - if *in == nil { - *out = nil - } else { - *out = new(ObjectMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ObjectMetricStatus) + (*in).DeepCopyInto(*out) } if in.Pods != nil { in, out := &in.Pods, &out.Pods - if *in == nil { - *out = nil - } else { - *out = new(PodsMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(PodsMetricStatus) + (*in).DeepCopyInto(*out) } if in.Resource != nil { in, out := &in.Resource, &out.Resource - if *in == nil { - *out = nil - } else { - *out = new(ResourceMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceMetricStatus) + (*in).DeepCopyInto(*out) } if in.External != nil { in, out := &in.External, &out.External - if *in == nil { - *out = nil - } else { - *out = new(ExternalMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ExternalMetricStatus) + (*in).DeepCopyInto(*out) } return } @@ -383,6 +311,16 @@ func (in *ObjectMetricSource) DeepCopyInto(out *ObjectMetricSource) { *out = *in out.Target = in.Target out.TargetValue = in.TargetValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } return } @@ -401,6 +339,16 @@ func (in *ObjectMetricStatus) DeepCopyInto(out *ObjectMetricStatus) { *out = *in out.Target = in.Target out.CurrentValue = in.CurrentValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } return } @@ -418,6 +366,11 @@ func (in *ObjectMetricStatus) DeepCopy() *ObjectMetricStatus { func (in *PodsMetricSource) DeepCopyInto(out *PodsMetricSource) { *out = *in out.TargetAverageValue = in.TargetAverageValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } return } @@ -435,6 +388,11 @@ func (in *PodsMetricSource) DeepCopy() *PodsMetricSource { func (in *PodsMetricStatus) DeepCopyInto(out *PodsMetricStatus) { *out = *in out.CurrentAverageValue = in.CurrentAverageValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) + } return } @@ -453,21 +411,13 @@ func (in *ResourceMetricSource) DeepCopyInto(out *ResourceMetricSource) { *out = *in if in.TargetAverageUtilization != nil { in, out := &in.TargetAverageUtilization, &out.TargetAverageUtilization - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.TargetAverageValue != nil { in, out := &in.TargetAverageValue, &out.TargetAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -487,12 +437,8 @@ func (in *ResourceMetricStatus) DeepCopyInto(out *ResourceMetricStatus) { *out = *in if in.CurrentAverageUtilization != nil { in, out := &in.CurrentAverageUtilization, &out.CurrentAverageUtilization - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } out.CurrentAverageValue = in.CurrentAverageValue.DeepCopy() return diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/BUILD b/vendor/k8s.io/api/autoscaling/v2beta1/BUILD index 32fc333e..25fa9703 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/BUILD +++ b/vendor/k8s.io/api/autoscaling/v2beta1/BUILD @@ -15,14 +15,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta1", importpath = "k8s.io/api/autoscaling/v2beta1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -38,9 +39,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go b/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go index e92b9a3e..bee94129 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go @@ -683,6 +683,26 @@ func (m *ObjectMetricSource) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n23 + if m.Selector != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n24, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n24 + } + if m.AverageValue != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AverageValue.Size())) + n25, err := m.AverageValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n25 + } return i, nil } @@ -704,11 +724,11 @@ func (m *ObjectMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) - n24, err := m.Target.MarshalTo(dAtA[i:]) + n26, err := m.Target.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n26 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.MetricName))) @@ -716,11 +736,31 @@ func (m *ObjectMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentValue.Size())) - n25, err := m.CurrentValue.MarshalTo(dAtA[i:]) + n27, err := m.CurrentValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n27 + if m.Selector != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n28, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n28 + } + if m.AverageValue != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AverageValue.Size())) + n29, err := m.AverageValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n29 + } return i, nil } @@ -746,11 +786,21 @@ func (m *PodsMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetAverageValue.Size())) - n26, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) + n30, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n30 + if m.Selector != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n31, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + } return i, nil } @@ -776,11 +826,21 @@ func (m *PodsMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) - n27, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + n32, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n32 + if m.Selector != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n33, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n33 + } return i, nil } @@ -812,11 +872,11 @@ func (m *ResourceMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetAverageValue.Size())) - n28, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) + n34, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n34 } return i, nil } @@ -848,11 +908,11 @@ func (m *ResourceMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) - n29, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + n35, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n35 return i, nil } @@ -1077,6 +1137,14 @@ func (m *ObjectMetricSource) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.TargetValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageValue != nil { + l = m.AverageValue.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1089,6 +1157,14 @@ func (m *ObjectMetricStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.CurrentValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageValue != nil { + l = m.AverageValue.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1099,6 +1175,10 @@ func (m *PodsMetricSource) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.TargetAverageValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1109,6 +1189,10 @@ func (m *PodsMetricStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = m.CurrentAverageValue.Size() n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1292,6 +1376,8 @@ func (this *ObjectMetricSource) String() string { `Target:` + strings.Replace(strings.Replace(this.Target.String(), "CrossVersionObjectReference", "CrossVersionObjectReference", 1), `&`, ``, 1) + `,`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `TargetValue:` + strings.Replace(strings.Replace(this.TargetValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `AverageValue:` + strings.Replace(fmt.Sprintf("%v", this.AverageValue), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, `}`, }, "") return s @@ -1304,6 +1390,8 @@ func (this *ObjectMetricStatus) String() string { `Target:` + strings.Replace(strings.Replace(this.Target.String(), "CrossVersionObjectReference", "CrossVersionObjectReference", 1), `&`, ``, 1) + `,`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `CurrentValue:` + strings.Replace(strings.Replace(this.CurrentValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `AverageValue:` + strings.Replace(fmt.Sprintf("%v", this.AverageValue), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, `}`, }, "") return s @@ -1315,6 +1403,7 @@ func (this *PodsMetricSource) String() string { s := strings.Join([]string{`&PodsMetricSource{`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `TargetAverageValue:` + strings.Replace(strings.Replace(this.TargetAverageValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `}`, }, "") return s @@ -1326,6 +1415,7 @@ func (this *PodsMetricStatus) String() string { s := strings.Join([]string{`&PodsMetricStatus{`, `MetricName:` + fmt.Sprintf("%v", this.MetricName) + `,`, `CurrentAverageValue:` + strings.Replace(strings.Replace(this.CurrentAverageValue.String(), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1), `&`, ``, 1) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `}`, }, "") return s @@ -3192,6 +3282,72 @@ func (m *ObjectMetricSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AverageValue == nil { + m.AverageValue = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.AverageValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3331,6 +3487,72 @@ func (m *ObjectMetricStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AverageValue == nil { + m.AverageValue = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.AverageValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3440,6 +3662,39 @@ func (m *PodsMetricSource) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3549,6 +3804,39 @@ func (m *PodsMetricStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3941,96 +4229,98 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1441 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcd, 0x8f, 0x1b, 0xc5, - 0x12, 0x5f, 0x7f, 0xec, 0x66, 0xd3, 0xde, 0xec, 0xe6, 0x75, 0xa2, 0xc4, 0xd9, 0xbc, 0xd8, 0xab, - 0xd1, 0xd3, 0x53, 0x88, 0xc8, 0x4c, 0xe2, 0x2c, 0x1f, 0x12, 0x42, 0x62, 0x6d, 0x20, 0x89, 0x58, - 0x27, 0xa1, 0x77, 0x13, 0x21, 0x08, 0x88, 0xf6, 0xb8, 0xe3, 0x6d, 0xd6, 0x33, 0x63, 0x75, 0xb7, - 0xad, 0x6c, 0x10, 0x12, 0x17, 0xee, 0x1c, 0xf8, 0xb8, 0x72, 0x46, 0x70, 0x85, 0x33, 0x48, 0x48, - 0x39, 0xe6, 0x18, 0x84, 0x64, 0x91, 0xe1, 0xbf, 0xc8, 0x09, 0x4d, 0x77, 0xcf, 0x78, 0xc6, 0xf6, - 0xac, 0x1d, 0xb3, 0x09, 0x70, 0x9b, 0xee, 0xaa, 0xfa, 0x55, 0x75, 0x55, 0x75, 0x75, 0xd5, 0x80, - 0xcb, 0xbb, 0x2f, 0x73, 0x93, 0x7a, 0xd6, 0x6e, 0xb7, 0x41, 0x98, 0x4b, 0x04, 0xe1, 0x56, 0x8f, - 0xb8, 0x4d, 0x8f, 0x59, 0x9a, 0x80, 0x3b, 0xd4, 0xc2, 0x5d, 0xe1, 0x71, 0x1b, 0xb7, 0xa9, 0xdb, - 0xb2, 0x7a, 0x95, 0x06, 0x11, 0xf8, 0xa2, 0xd5, 0x22, 0x2e, 0x61, 0x58, 0x90, 0xa6, 0xd9, 0x61, - 0x9e, 0xf0, 0x60, 0x49, 0xf1, 0x9b, 0xb8, 0x43, 0xcd, 0x18, 0xbf, 0xa9, 0xf9, 0x57, 0xcf, 0xb7, - 0xa8, 0xd8, 0xe9, 0x36, 0x4c, 0xdb, 0x73, 0xac, 0x96, 0xd7, 0xf2, 0x2c, 0x29, 0xd6, 0xe8, 0xde, - 0x91, 0x2b, 0xb9, 0x90, 0x5f, 0x0a, 0x6e, 0xd5, 0x88, 0xa9, 0xb7, 0x3d, 0x46, 0xac, 0xde, 0x88, - 0xca, 0xd5, 0xf5, 0x01, 0x8f, 0x83, 0xed, 0x1d, 0xea, 0x12, 0xb6, 0x67, 0x75, 0x76, 0x5b, 0x52, - 0x88, 0x11, 0xee, 0x75, 0x99, 0x4d, 0x9e, 0x48, 0x8a, 0x5b, 0x0e, 0x11, 0x78, 0x9c, 0x2e, 0x2b, - 0x4d, 0x8a, 0x75, 0x5d, 0x41, 0x9d, 0x51, 0x35, 0x2f, 0x4e, 0x12, 0xe0, 0xf6, 0x0e, 0x71, 0xf0, - 0x88, 0xdc, 0xa5, 0x34, 0xb9, 0xae, 0xa0, 0x6d, 0x8b, 0xba, 0x82, 0x0b, 0x36, 0x2c, 0x64, 0x7c, - 0x99, 0x01, 0xa7, 0x6b, 0xcc, 0xe3, 0xfc, 0x16, 0x61, 0x9c, 0x7a, 0xee, 0xf5, 0xc6, 0x47, 0xc4, - 0x16, 0x88, 0xdc, 0x21, 0x8c, 0xb8, 0x36, 0x81, 0x6b, 0x20, 0xbf, 0x4b, 0xdd, 0x66, 0x31, 0xb3, - 0x96, 0x39, 0x7b, 0xb8, 0xba, 0x74, 0xbf, 0x5f, 0x9e, 0xf3, 0xfb, 0xe5, 0xfc, 0x5b, 0xd4, 0x6d, - 0x22, 0x49, 0x09, 0x38, 0x5c, 0xec, 0x90, 0x62, 0x36, 0xc9, 0x71, 0x0d, 0x3b, 0x04, 0x49, 0x0a, - 0xac, 0x00, 0x80, 0x3b, 0x54, 0x2b, 0x28, 0xe6, 0x24, 0x1f, 0xd4, 0x7c, 0x60, 0xe3, 0xc6, 0x55, - 0x4d, 0x41, 0x31, 0x2e, 0xe3, 0xab, 0x1c, 0x38, 0xfe, 0xc6, 0x5d, 0x41, 0x98, 0x8b, 0xdb, 0x75, - 0x22, 0x18, 0xb5, 0xb7, 0x64, 0x50, 0x02, 0x30, 0x47, 0xae, 0x03, 0x05, 0xda, 0xac, 0x08, 0xac, - 0x1e, 0x51, 0x50, 0x8c, 0x0b, 0x7a, 0x60, 0x59, 0xad, 0xb6, 0x48, 0x9b, 0xd8, 0xc2, 0x63, 0xd2, - 0xd8, 0x42, 0xe5, 0x92, 0x39, 0x48, 0xbd, 0xc8, 0x65, 0x66, 0x67, 0xb7, 0x15, 0x6c, 0x70, 0x33, - 0x88, 0xa8, 0xd9, 0xbb, 0x68, 0x6e, 0xe2, 0x06, 0x69, 0x87, 0xa2, 0x55, 0xe8, 0xf7, 0xcb, 0xcb, - 0xf5, 0x04, 0x1c, 0x1a, 0x82, 0x87, 0x18, 0x14, 0x04, 0x66, 0x2d, 0x22, 0x6e, 0xe1, 0x76, 0x97, - 0xc8, 0x23, 0x17, 0x2a, 0xe6, 0x7e, 0xda, 0xcc, 0x30, 0xeb, 0xcc, 0xb7, 0xbb, 0xd8, 0x15, 0x54, - 0xec, 0x55, 0x57, 0xfc, 0x7e, 0xb9, 0xb0, 0x3d, 0x80, 0x41, 0x71, 0x4c, 0xd8, 0x03, 0x50, 0x2d, - 0x37, 0x7a, 0x84, 0xe1, 0x16, 0x51, 0x9a, 0xf2, 0x33, 0x69, 0x3a, 0xe1, 0xf7, 0xcb, 0x70, 0x7b, - 0x04, 0x0d, 0x8d, 0xd1, 0x60, 0x7c, 0x33, 0x1a, 0x18, 0x81, 0x45, 0x97, 0xff, 0x3b, 0x02, 0xb3, - 0x03, 0x96, 0xec, 0x2e, 0x63, 0xc4, 0xfd, 0x4b, 0x91, 0x39, 0xae, 0x8f, 0xb5, 0x54, 0x8b, 0x61, - 0xa1, 0x04, 0x32, 0xdc, 0x03, 0xc7, 0xf4, 0xfa, 0x00, 0x02, 0x74, 0xd2, 0xef, 0x97, 0x8f, 0xd5, - 0x46, 0xe1, 0xd0, 0x38, 0x1d, 0xc6, 0x4f, 0x59, 0x70, 0xf2, 0x8a, 0xc7, 0xe8, 0x3d, 0xcf, 0x15, - 0xb8, 0x7d, 0xc3, 0x6b, 0x6e, 0xe8, 0xaa, 0x4a, 0x18, 0xfc, 0x10, 0x2c, 0x06, 0xde, 0x6b, 0x62, - 0x81, 0x65, 0x8c, 0x0a, 0x95, 0x0b, 0xd3, 0xf9, 0x5a, 0x15, 0x86, 0x3a, 0x11, 0x78, 0x10, 0xd5, - 0xc1, 0x1e, 0x8a, 0x50, 0xe1, 0xfb, 0x20, 0xcf, 0x3b, 0xc4, 0xd6, 0x91, 0x7c, 0xc5, 0xdc, 0xbf, - 0xba, 0x9b, 0x29, 0x86, 0x6e, 0x75, 0x88, 0x3d, 0x28, 0x26, 0xc1, 0x0a, 0x49, 0x58, 0x48, 0xc0, - 0x02, 0x97, 0x09, 0xa7, 0x63, 0xf7, 0xea, 0xac, 0x0a, 0x24, 0x48, 0x75, 0x59, 0xab, 0x58, 0x50, - 0x6b, 0xa4, 0xc1, 0x8d, 0xcf, 0x72, 0x60, 0x2d, 0x45, 0xb2, 0xe6, 0xb9, 0x4d, 0x2a, 0xa8, 0xe7, - 0xc2, 0x2b, 0x20, 0x2f, 0xf6, 0x3a, 0x61, 0xb2, 0xaf, 0x87, 0xd6, 0x6e, 0xef, 0x75, 0xc8, 0xe3, - 0x7e, 0xf9, 0x7f, 0x93, 0xe4, 0x03, 0x3e, 0x24, 0x11, 0xe0, 0x66, 0x74, 0xaa, 0x6c, 0x02, 0x4b, - 0x9b, 0xf5, 0xb8, 0x5f, 0x1e, 0xf3, 0xac, 0x99, 0x11, 0x52, 0xd2, 0xf8, 0xa0, 0x36, 0xb4, 0x31, - 0x17, 0xdb, 0x0c, 0xbb, 0x5c, 0x69, 0xa2, 0x4e, 0x98, 0xeb, 0xe7, 0xa6, 0x0b, 0x77, 0x20, 0x51, - 0x5d, 0xd5, 0x56, 0xc0, 0xcd, 0x11, 0x34, 0x34, 0x46, 0x03, 0xfc, 0x3f, 0x58, 0x60, 0x04, 0x73, - 0xcf, 0x95, 0x69, 0x7e, 0x78, 0xe0, 0x5c, 0x24, 0x77, 0x91, 0xa6, 0xc2, 0xe7, 0xc0, 0x21, 0x87, - 0x70, 0x8e, 0x5b, 0xa4, 0x38, 0x2f, 0x19, 0x57, 0x34, 0xe3, 0xa1, 0xba, 0xda, 0x46, 0x21, 0xdd, - 0xf8, 0x35, 0x03, 0x4e, 0xa7, 0xf8, 0x71, 0x93, 0x72, 0x01, 0x6f, 0x8f, 0xe4, 0xb3, 0x39, 0x65, - 0xed, 0xa0, 0x5c, 0x65, 0xf3, 0x51, 0xad, 0x7b, 0x31, 0xdc, 0x89, 0xe5, 0xf2, 0x6d, 0x30, 0x4f, - 0x05, 0x71, 0x82, 0xa8, 0xe4, 0xce, 0x16, 0x2a, 0x2f, 0xcd, 0x98, 0x6b, 0xd5, 0x23, 0x5a, 0xc7, - 0xfc, 0xd5, 0x00, 0x0d, 0x29, 0x50, 0xe3, 0xb7, 0x6c, 0xea, 0xd9, 0x82, 0x84, 0x87, 0x1f, 0x83, - 0x65, 0xb9, 0x52, 0x95, 0x19, 0x91, 0x3b, 0xfa, 0x84, 0x13, 0xef, 0xd4, 0x3e, 0x0f, 0x7a, 0xf5, - 0x84, 0x36, 0x65, 0x79, 0x2b, 0x01, 0x8d, 0x86, 0x54, 0xc1, 0x8b, 0xa0, 0xe0, 0x50, 0x17, 0x91, - 0x4e, 0x9b, 0xda, 0x58, 0xa5, 0xe5, 0xbc, 0x7a, 0x92, 0xea, 0x83, 0x6d, 0x14, 0xe7, 0x81, 0x2f, - 0x80, 0x82, 0x83, 0xef, 0x46, 0x22, 0x39, 0x29, 0x72, 0x4c, 0xeb, 0x2b, 0xd4, 0x07, 0x24, 0x14, - 0xe7, 0x83, 0x37, 0x83, 0x6c, 0x08, 0xaa, 0x34, 0x2f, 0xe6, 0xa5, 0x9b, 0xcf, 0x4d, 0x3a, 0x9f, - 0x2e, 0xf2, 0x41, 0x89, 0x88, 0x65, 0x8e, 0x84, 0x40, 0x21, 0x96, 0xf1, 0x43, 0x1e, 0x9c, 0xd9, - 0xf7, 0xee, 0xc3, 0x37, 0x01, 0xf4, 0x1a, 0x9c, 0xb0, 0x1e, 0x69, 0x5e, 0x56, 0x6d, 0x51, 0xd0, - 0x9f, 0x04, 0x3e, 0xce, 0xa9, 0x27, 0xf1, 0xfa, 0x08, 0x15, 0x8d, 0x91, 0x80, 0x36, 0x38, 0x12, - 0x5c, 0x06, 0xe5, 0x50, 0xaa, 0x5b, 0xa1, 0x27, 0xbb, 0x69, 0xff, 0xf1, 0xfb, 0xe5, 0x23, 0x9b, - 0x71, 0x10, 0x94, 0xc4, 0x84, 0x1b, 0x60, 0x45, 0xd7, 0xfa, 0x21, 0x07, 0x9f, 0xd4, 0x1e, 0x58, - 0xa9, 0x25, 0xc9, 0x68, 0x98, 0x3f, 0x80, 0x68, 0x12, 0x4e, 0x19, 0x69, 0x46, 0x10, 0xf9, 0x24, - 0xc4, 0xeb, 0x49, 0x32, 0x1a, 0xe6, 0x87, 0x6d, 0xb0, 0xac, 0x51, 0xb5, 0xbf, 0x8b, 0xf3, 0x32, - 0x64, 0xcf, 0x4f, 0x19, 0x32, 0x55, 0x74, 0xa3, 0x1c, 0xac, 0x25, 0xb0, 0xd0, 0x10, 0x36, 0x14, - 0x00, 0xd8, 0x61, 0x89, 0xe3, 0xc5, 0x05, 0xa9, 0xe9, 0xb5, 0x19, 0xef, 0x60, 0x54, 0x2b, 0x07, - 0xcf, 0x57, 0xb4, 0xc5, 0x51, 0x4c, 0x8f, 0xf1, 0x6d, 0x0e, 0x80, 0x41, 0x86, 0xc1, 0xf5, 0x44, - 0x91, 0x5f, 0x1b, 0x2a, 0xf2, 0x47, 0xe3, 0xcd, 0x69, 0xac, 0xa0, 0xdf, 0x02, 0x0b, 0x9e, 0xbc, - 0x79, 0x3a, 0x19, 0x2a, 0x93, 0xcc, 0x8e, 0xde, 0xd2, 0x08, 0xad, 0x0a, 0x82, 0xd2, 0xa9, 0xef, - 0xaf, 0x46, 0x83, 0xd7, 0x40, 0xbe, 0xe3, 0x35, 0xc3, 0xc7, 0xef, 0xc2, 0x24, 0xd4, 0x1b, 0x5e, - 0x93, 0x27, 0x30, 0x17, 0x03, 0xdb, 0x83, 0x5d, 0x24, 0x71, 0xe0, 0x07, 0x60, 0x31, 0x6c, 0x37, - 0x74, 0x6f, 0xb2, 0x3e, 0x09, 0x13, 0x69, 0xfe, 0x04, 0xee, 0x52, 0x50, 0x41, 0x43, 0x0a, 0x8a, - 0x30, 0x03, 0x7c, 0xa2, 0xbb, 0x45, 0x59, 0xeb, 0xa7, 0xc0, 0x1f, 0xd7, 0xf6, 0x2b, 0xfc, 0x90, - 0x82, 0x22, 0x4c, 0xe3, 0xbb, 0x1c, 0x58, 0x4a, 0xb4, 0xa1, 0x7f, 0x47, 0xb8, 0x54, 0x56, 0x1f, - 0x6c, 0xb8, 0x14, 0xe6, 0xc1, 0x87, 0x4b, 0xe1, 0x3e, 0xbd, 0x70, 0xc5, 0xf0, 0xc7, 0x84, 0xeb, - 0x8b, 0x2c, 0x80, 0xa3, 0x99, 0x0e, 0x6d, 0xb0, 0xa0, 0x46, 0x8d, 0x83, 0x78, 0xe1, 0xa2, 0xae, - 0x43, 0x3f, 0x66, 0x1a, 0x7a, 0x68, 0x40, 0xc9, 0x4e, 0x35, 0xa0, 0x90, 0x83, 0x18, 0xe4, 0xa2, - 0x27, 0x30, 0x6d, 0x98, 0x33, 0xbe, 0x1e, 0x76, 0x8b, 0xca, 0xe5, 0x7f, 0xac, 0x5b, 0x9e, 0xd9, - 0x18, 0x65, 0xfc, 0x9c, 0x01, 0x47, 0x87, 0x8b, 0xd8, 0x4c, 0xa3, 0xe6, 0xbd, 0xb1, 0xf3, 0x72, - 0x76, 0x26, 0xc3, 0xa3, 0xbe, 0x78, 0xca, 0x99, 0xf9, 0x97, 0xe4, 0x21, 0x66, 0x9f, 0x97, 0x3f, - 0x19, 0x3f, 0x54, 0xce, 0x76, 0x8a, 0xd3, 0x5a, 0xd9, 0xf4, 0x83, 0xe5, 0xf7, 0x59, 0x70, 0x7c, - 0x5c, 0xf5, 0x87, 0x35, 0xfd, 0x0f, 0x48, 0x9d, 0xc2, 0x8a, 0xff, 0x03, 0x7a, 0xdc, 0x2f, 0x97, - 0xc7, 0x8c, 0x2e, 0x21, 0x4c, 0xec, 0x37, 0xd1, 0x3b, 0xa0, 0x98, 0xf0, 0xdd, 0x4d, 0x41, 0xdb, - 0xf4, 0x9e, 0x6a, 0xca, 0x54, 0xfb, 0xf9, 0x5f, 0xbf, 0x5f, 0x2e, 0x6e, 0xa7, 0xf0, 0xa0, 0x54, - 0xe9, 0x94, 0x7f, 0x25, 0xb9, 0xa7, 0xfe, 0xaf, 0xe4, 0xc7, 0x51, 0x7f, 0xa9, 0xd8, 0x1f, 0x88, - 0xbf, 0xde, 0x03, 0xa7, 0x92, 0x41, 0x1a, 0x75, 0xd8, 0x19, 0xbf, 0x5f, 0x3e, 0x55, 0x4b, 0x63, - 0x42, 0xe9, 0xf2, 0x69, 0x99, 0x96, 0x7b, 0x36, 0x99, 0x56, 0x3d, 0x7f, 0xff, 0x51, 0x69, 0xee, - 0xc1, 0xa3, 0xd2, 0xdc, 0xc3, 0x47, 0xa5, 0xb9, 0x4f, 0xfd, 0x52, 0xe6, 0xbe, 0x5f, 0xca, 0x3c, - 0xf0, 0x4b, 0x99, 0x87, 0x7e, 0x29, 0xf3, 0xbb, 0x5f, 0xca, 0x7c, 0xfe, 0x47, 0x69, 0xee, 0xdd, - 0x43, 0xba, 0xee, 0xfd, 0x19, 0x00, 0x00, 0xff, 0xff, 0x91, 0x09, 0xa9, 0x38, 0x8c, 0x16, 0x00, - 0x00, + // 1475 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcb, 0x8f, 0x1b, 0x45, + 0x13, 0x5f, 0x3f, 0x76, 0xb3, 0x69, 0x6f, 0x76, 0xf7, 0xeb, 0x44, 0x89, 0xb3, 0xf9, 0x62, 0xaf, + 0x2c, 0x84, 0x42, 0x44, 0x66, 0x12, 0xb3, 0x3c, 0x24, 0x84, 0xc4, 0xda, 0x40, 0x12, 0xb1, 0x4e, + 0x42, 0xef, 0x26, 0x42, 0x90, 0x20, 0xda, 0x33, 0x1d, 0x6f, 0xb3, 0x9e, 0x19, 0x6b, 0xba, 0x6d, + 0x65, 0x83, 0x90, 0xb8, 0x70, 0xe7, 0x02, 0x67, 0x90, 0x38, 0x21, 0xb8, 0xc2, 0x99, 0x5b, 0x8e, + 0x39, 0x26, 0x02, 0x59, 0x64, 0xf8, 0x2f, 0x72, 0x42, 0xfd, 0x98, 0xf1, 0x8c, 0x1f, 0x6b, 0xc7, + 0x38, 0xe1, 0x71, 0x9b, 0xee, 0xaa, 0xfa, 0x55, 0x4f, 0xfd, 0xaa, 0xab, 0xbb, 0x1a, 0x5c, 0xdc, + 0x7b, 0x8d, 0x19, 0xd4, 0x33, 0xf7, 0xda, 0x75, 0xe2, 0xbb, 0x84, 0x13, 0x66, 0x76, 0x88, 0x6b, + 0x7b, 0xbe, 0xa9, 0x05, 0xb8, 0x45, 0x4d, 0xdc, 0xe6, 0x1e, 0xb3, 0x70, 0x93, 0xba, 0x0d, 0xb3, + 0x53, 0xae, 0x13, 0x8e, 0x2f, 0x98, 0x0d, 0xe2, 0x12, 0x1f, 0x73, 0x62, 0x1b, 0x2d, 0xdf, 0xe3, + 0x1e, 0x2c, 0x28, 0x7d, 0x03, 0xb7, 0xa8, 0x11, 0xd3, 0x37, 0xb4, 0xfe, 0xda, 0xb9, 0x06, 0xe5, + 0xbb, 0xed, 0xba, 0x61, 0x79, 0x8e, 0xd9, 0xf0, 0x1a, 0x9e, 0x29, 0xcd, 0xea, 0xed, 0xdb, 0x72, + 0x24, 0x07, 0xf2, 0x4b, 0xc1, 0xad, 0x95, 0x62, 0xee, 0x2d, 0xcf, 0x27, 0x66, 0x67, 0xc0, 0xe5, + 0xda, 0x46, 0x4f, 0xc7, 0xc1, 0xd6, 0x2e, 0x75, 0x89, 0xbf, 0x6f, 0xb6, 0xf6, 0x1a, 0xd2, 0xc8, + 0x27, 0xcc, 0x6b, 0xfb, 0x16, 0x79, 0x22, 0x2b, 0x66, 0x3a, 0x84, 0xe3, 0x61, 0xbe, 0xcc, 0x51, + 0x56, 0x7e, 0xdb, 0xe5, 0xd4, 0x19, 0x74, 0xf3, 0xca, 0x38, 0x03, 0x66, 0xed, 0x12, 0x07, 0xf7, + 0xdb, 0x95, 0xbe, 0x4a, 0x81, 0x53, 0x55, 0xdf, 0x63, 0xec, 0x06, 0xf1, 0x19, 0xf5, 0xdc, 0xab, + 0xf5, 0x4f, 0x88, 0xc5, 0x11, 0xb9, 0x4d, 0x7c, 0xe2, 0x5a, 0x04, 0xae, 0x83, 0xec, 0x1e, 0x75, + 0xed, 0x7c, 0x6a, 0x3d, 0x75, 0xe6, 0x70, 0x65, 0xe9, 0x5e, 0xb7, 0x38, 0x17, 0x74, 0x8b, 0xd9, + 0x77, 0xa9, 0x6b, 0x23, 0x29, 0x11, 0x1a, 0x2e, 0x76, 0x48, 0x3e, 0x9d, 0xd4, 0xb8, 0x82, 0x1d, + 0x82, 0xa4, 0x04, 0x96, 0x01, 0xc0, 0x2d, 0xaa, 0x1d, 0xe4, 0x33, 0x52, 0x0f, 0x6a, 0x3d, 0xb0, + 0x79, 0xed, 0xb2, 0x96, 0xa0, 0x98, 0x56, 0xe9, 0xeb, 0x0c, 0x38, 0xf6, 0xf6, 0x1d, 0x4e, 0x7c, + 0x17, 0x37, 0x6b, 0x84, 0xfb, 0xd4, 0xda, 0x96, 0xf1, 0x15, 0x60, 0x8e, 0x1c, 0x0b, 0x07, 0x7a, + 0x59, 0x11, 0x58, 0x2d, 0x92, 0xa0, 0x98, 0x16, 0xf4, 0xc0, 0xb2, 0x1a, 0x6d, 0x93, 0x26, 0xb1, + 0xb8, 0xe7, 0xcb, 0xc5, 0xe6, 0xca, 0x2f, 0x19, 0xbd, 0x2c, 0x8a, 0xa2, 0x66, 0xb4, 0xf6, 0x1a, + 0x62, 0x82, 0x19, 0x82, 0x1c, 0xa3, 0x73, 0xc1, 0xd8, 0xc2, 0x75, 0xd2, 0x0c, 0x4d, 0x2b, 0x30, + 0xe8, 0x16, 0x97, 0x6b, 0x09, 0x38, 0xd4, 0x07, 0x0f, 0x31, 0xc8, 0x71, 0xec, 0x37, 0x08, 0xbf, + 0x81, 0x9b, 0x6d, 0x22, 0x7f, 0x39, 0x57, 0x36, 0x0e, 0xf2, 0x66, 0x84, 0x09, 0x64, 0xbc, 0xd7, + 0xc6, 0x2e, 0xa7, 0x7c, 0xbf, 0xb2, 0x12, 0x74, 0x8b, 0xb9, 0x9d, 0x1e, 0x0c, 0x8a, 0x63, 0xc2, + 0x0e, 0x80, 0x6a, 0xb8, 0xd9, 0x21, 0x3e, 0x6e, 0x10, 0xe5, 0x29, 0x3b, 0x95, 0xa7, 0xe3, 0x41, + 0xb7, 0x08, 0x77, 0x06, 0xd0, 0xd0, 0x10, 0x0f, 0xa5, 0x6f, 0x06, 0x89, 0xe1, 0x98, 0xb7, 0xd9, + 0xbf, 0x83, 0x98, 0x5d, 0xb0, 0x64, 0xb5, 0x7d, 0x9f, 0xb8, 0x7f, 0x89, 0x99, 0x63, 0xfa, 0xb7, + 0x96, 0xaa, 0x31, 0x2c, 0x94, 0x40, 0x86, 0xfb, 0xe0, 0xa8, 0x1e, 0xcf, 0x80, 0xa0, 0x13, 0x41, + 0xb7, 0x78, 0xb4, 0x3a, 0x08, 0x87, 0x86, 0xf9, 0x28, 0xfd, 0x92, 0x06, 0x27, 0x2e, 0x79, 0x3e, + 0xbd, 0xeb, 0xb9, 0x1c, 0x37, 0xaf, 0x79, 0xf6, 0xa6, 0x2e, 0x90, 0xc4, 0x87, 0x1f, 0x83, 0x45, + 0x11, 0x3d, 0x1b, 0x73, 0x2c, 0x39, 0xca, 0x95, 0xcf, 0x4f, 0x16, 0x6b, 0x55, 0x18, 0x6a, 0x84, + 0xe3, 0x1e, 0xab, 0xbd, 0x39, 0x14, 0xa1, 0xc2, 0x5b, 0x20, 0xcb, 0x5a, 0xc4, 0xd2, 0x4c, 0xbe, + 0x6e, 0x1c, 0x5c, 0xa8, 0x8d, 0x11, 0x0b, 0xdd, 0x6e, 0x11, 0xab, 0x57, 0x4c, 0xc4, 0x08, 0x49, + 0x58, 0x48, 0xc0, 0x02, 0x93, 0x09, 0xa7, 0xb9, 0x7b, 0x63, 0x5a, 0x07, 0x12, 0xa4, 0xb2, 0xac, + 0x5d, 0x2c, 0xa8, 0x31, 0xd2, 0xe0, 0xa5, 0x2f, 0x32, 0x60, 0x7d, 0x84, 0x65, 0xd5, 0x73, 0x6d, + 0xca, 0xa9, 0xe7, 0xc2, 0x4b, 0x20, 0xcb, 0xf7, 0x5b, 0x61, 0xb2, 0x6f, 0x84, 0xab, 0xdd, 0xd9, + 0x6f, 0x91, 0xc7, 0xdd, 0xe2, 0x73, 0xe3, 0xec, 0x85, 0x1e, 0x92, 0x08, 0x70, 0x2b, 0xfa, 0xab, + 0x74, 0x02, 0x4b, 0x2f, 0xeb, 0x71, 0xb7, 0x38, 0xe4, 0x84, 0x32, 0x22, 0xa4, 0xe4, 0xe2, 0x45, + 0x6d, 0x68, 0x62, 0xc6, 0x77, 0x7c, 0xec, 0x32, 0xe5, 0x89, 0x3a, 0x61, 0xae, 0x9f, 0x9d, 0x8c, + 0x6e, 0x61, 0x51, 0x59, 0xd3, 0xab, 0x80, 0x5b, 0x03, 0x68, 0x68, 0x88, 0x07, 0xf8, 0x3c, 0x58, + 0xf0, 0x09, 0x66, 0x9e, 0x2b, 0xd3, 0xfc, 0x70, 0x2f, 0xb8, 0x48, 0xce, 0x22, 0x2d, 0x85, 0x2f, + 0x80, 0x43, 0x0e, 0x61, 0x0c, 0x37, 0x48, 0x7e, 0x5e, 0x2a, 0xae, 0x68, 0xc5, 0x43, 0x35, 0x35, + 0x8d, 0x42, 0x79, 0xe9, 0x61, 0x0a, 0x9c, 0x1a, 0x11, 0xc7, 0x2d, 0xca, 0x38, 0xbc, 0x39, 0x90, + 0xcf, 0xc6, 0x84, 0xb5, 0x83, 0x32, 0x95, 0xcd, 0xab, 0xda, 0xf7, 0x62, 0x38, 0x13, 0xcb, 0xe5, + 0x9b, 0x60, 0x9e, 0x72, 0xe2, 0x08, 0x56, 0x32, 0x67, 0x72, 0xe5, 0x57, 0xa7, 0xcc, 0xb5, 0xca, + 0x11, 0xed, 0x63, 0xfe, 0xb2, 0x40, 0x43, 0x0a, 0xb4, 0xf4, 0x6b, 0x7a, 0xe4, 0xbf, 0x89, 0x84, + 0x87, 0x9f, 0x82, 0x65, 0x39, 0x52, 0x95, 0x19, 0x91, 0xdb, 0xfa, 0x0f, 0xc7, 0xee, 0xa9, 0x03, + 0x0e, 0xf4, 0xca, 0x71, 0xbd, 0x94, 0xe5, 0xed, 0x04, 0x34, 0xea, 0x73, 0x05, 0x2f, 0x80, 0x9c, + 0x43, 0x5d, 0x44, 0x5a, 0x4d, 0x6a, 0x61, 0x95, 0x96, 0xf3, 0xea, 0x48, 0xaa, 0xf5, 0xa6, 0x51, + 0x5c, 0x07, 0xbe, 0x0c, 0x72, 0x0e, 0xbe, 0x13, 0x99, 0x64, 0xa4, 0xc9, 0x51, 0xed, 0x2f, 0x57, + 0xeb, 0x89, 0x50, 0x5c, 0x0f, 0x5e, 0x17, 0xd9, 0x20, 0xaa, 0x34, 0xcb, 0x67, 0x65, 0x98, 0xcf, + 0x8e, 0xfb, 0x3f, 0x5d, 0xe4, 0x45, 0x89, 0x88, 0x65, 0x8e, 0x84, 0x40, 0x21, 0x56, 0xe9, 0xa7, + 0x2c, 0x38, 0x7d, 0xe0, 0xde, 0x87, 0xef, 0x00, 0xe8, 0xd5, 0x19, 0xf1, 0x3b, 0xc4, 0xbe, 0xa8, + 0xae, 0x45, 0xe2, 0x7e, 0x22, 0x62, 0x9c, 0x51, 0x47, 0xe2, 0xd5, 0x01, 0x29, 0x1a, 0x62, 0x01, + 0x2d, 0x70, 0x44, 0x6c, 0x06, 0x15, 0x50, 0xaa, 0xaf, 0x42, 0x4f, 0xb6, 0xd3, 0xfe, 0x17, 0x74, + 0x8b, 0x47, 0xb6, 0xe2, 0x20, 0x28, 0x89, 0x09, 0x37, 0xc1, 0x8a, 0xae, 0xf5, 0x7d, 0x01, 0x3e, + 0xa1, 0x23, 0xb0, 0x52, 0x4d, 0x8a, 0x51, 0xbf, 0xbe, 0x80, 0xb0, 0x09, 0xa3, 0x3e, 0xb1, 0x23, + 0x88, 0x6c, 0x12, 0xe2, 0xad, 0xa4, 0x18, 0xf5, 0xeb, 0xc3, 0x26, 0x58, 0xd6, 0xa8, 0x3a, 0xde, + 0xf9, 0x79, 0x49, 0xd9, 0x8b, 0x13, 0x52, 0xa6, 0x8a, 0x6e, 0x94, 0x83, 0xd5, 0x04, 0x16, 0xea, + 0xc3, 0x86, 0x1c, 0x00, 0x2b, 0x2c, 0x71, 0x2c, 0xbf, 0x20, 0x3d, 0xbd, 0x39, 0xe5, 0x1e, 0x8c, + 0x6a, 0x65, 0xef, 0xf8, 0x8a, 0xa6, 0x18, 0x8a, 0xf9, 0x29, 0x7d, 0x9f, 0x01, 0xa0, 0x97, 0x61, + 0x70, 0x23, 0x51, 0xe4, 0xd7, 0xfb, 0x8a, 0xfc, 0x6a, 0xfc, 0x72, 0x1a, 0x2b, 0xe8, 0x37, 0xc0, + 0x82, 0x27, 0x77, 0x9e, 0x4e, 0x86, 0xf2, 0xb8, 0x65, 0x47, 0x67, 0x69, 0x84, 0x56, 0x01, 0xa2, + 0x74, 0xea, 0xfd, 0xab, 0xd1, 0xe0, 0x15, 0x90, 0x6d, 0x79, 0x76, 0x78, 0xf8, 0x9d, 0x1f, 0x87, + 0x7a, 0xcd, 0xb3, 0x59, 0x02, 0x73, 0x51, 0xac, 0x5d, 0xcc, 0x22, 0x89, 0x03, 0x3f, 0x02, 0x8b, + 0xe1, 0x75, 0x43, 0xdf, 0x4d, 0x36, 0xc6, 0x61, 0x22, 0xad, 0x9f, 0xc0, 0x5d, 0x12, 0x15, 0x34, + 0x94, 0xa0, 0x08, 0x53, 0xe0, 0x13, 0x7d, 0x5b, 0x94, 0xb5, 0x7e, 0x02, 0xfc, 0x61, 0xd7, 0x7e, + 0x85, 0x1f, 0x4a, 0x50, 0x84, 0x59, 0xfa, 0x21, 0x03, 0x96, 0x12, 0xd7, 0xd0, 0xbf, 0x83, 0x2e, + 0x95, 0xd5, 0xb3, 0xa5, 0x4b, 0x61, 0xce, 0x9e, 0x2e, 0x85, 0xfb, 0xf4, 0xe8, 0x8a, 0xe1, 0x0f, + 0xa1, 0xeb, 0x61, 0x06, 0xc0, 0xc1, 0x4c, 0x87, 0x16, 0x58, 0x50, 0xad, 0xc6, 0x2c, 0x4e, 0xb8, + 0xe8, 0xd6, 0xa1, 0x0f, 0x33, 0x0d, 0xdd, 0xd7, 0xa0, 0xa4, 0x27, 0x6a, 0x50, 0xc8, 0x2c, 0x1a, + 0xb9, 0xe8, 0x08, 0x1c, 0xd9, 0xcc, 0xdd, 0x02, 0x8b, 0x2c, 0xec, 0x80, 0xb2, 0xd3, 0x77, 0x40, + 0x32, 0xea, 0x51, 0xef, 0x13, 0x41, 0x42, 0x1b, 0x2c, 0xe1, 0x78, 0x13, 0x32, 0x3f, 0xd5, 0x6f, + 0xac, 0x8a, 0x8e, 0x27, 0xd1, 0x7d, 0x24, 0x50, 0x4b, 0xbf, 0xf5, 0x73, 0xab, 0x36, 0xe4, 0x3f, + 0x96, 0xdb, 0x67, 0xd7, 0x0b, 0xfe, 0x27, 0xe8, 0xfd, 0x36, 0x0d, 0x56, 0xfb, 0x8f, 0x93, 0xa9, + 0x9a, 0xfe, 0xbb, 0x43, 0x5f, 0x2e, 0xd2, 0x53, 0x2d, 0x3a, 0xea, 0x50, 0x26, 0x7b, 0xbd, 0x48, + 0x30, 0x91, 0x99, 0x39, 0x13, 0xa5, 0xef, 0x92, 0x31, 0x9a, 0xfe, 0x61, 0xe4, 0xb3, 0xe1, 0xaf, + 0x07, 0xd3, 0x05, 0xe9, 0x94, 0x76, 0x36, 0xf1, 0x0b, 0xc2, 0xd3, 0x0e, 0xd3, 0x8f, 0x69, 0x70, + 0x6c, 0xd8, 0x2d, 0x02, 0x56, 0xf5, 0x5b, 0xa2, 0x0a, 0x92, 0x19, 0x7f, 0x4b, 0x7c, 0xdc, 0x2d, + 0x16, 0x87, 0xb4, 0xc0, 0x21, 0x4c, 0xec, 0xb9, 0xf1, 0x7d, 0x90, 0x4f, 0x30, 0x7f, 0x9d, 0xd3, + 0x26, 0xbd, 0xab, 0x2e, 0xf7, 0xaa, 0x8d, 0xf9, 0x7f, 0xd0, 0x2d, 0xe6, 0x77, 0x46, 0xe8, 0xa0, + 0x91, 0xd6, 0x23, 0xde, 0xdc, 0x32, 0x4f, 0xfd, 0xcd, 0xed, 0xe7, 0xc1, 0x78, 0xa9, 0xd4, 0x9a, + 0x49, 0xbc, 0x3e, 0x04, 0x27, 0x93, 0x39, 0x30, 0x18, 0xb0, 0xd3, 0x41, 0xb7, 0x78, 0xb2, 0x3a, + 0x4a, 0x09, 0x8d, 0xb6, 0x1f, 0x95, 0xc8, 0x99, 0x67, 0x93, 0xc8, 0x95, 0x73, 0xf7, 0x1e, 0x15, + 0xe6, 0xee, 0x3f, 0x2a, 0xcc, 0x3d, 0x78, 0x54, 0x98, 0xfb, 0x3c, 0x28, 0xa4, 0xee, 0x05, 0x85, + 0xd4, 0xfd, 0xa0, 0x90, 0x7a, 0x10, 0x14, 0x52, 0xbf, 0x07, 0x85, 0xd4, 0x97, 0x7f, 0x14, 0xe6, + 0x3e, 0x38, 0xa4, 0x8f, 0x9e, 0x3f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x05, 0x26, 0x31, 0x5d, 0x9f, + 0x18, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto b/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto index 0cd10143..04bc0ed6 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto +++ b/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto @@ -26,7 +26,6 @@ import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v2beta1"; @@ -187,6 +186,7 @@ message HorizontalPodAutoscalerStatus { optional int32 desiredReplicas = 4; // currentMetrics is the last read state of the metrics used by this autoscaler. + // +optional repeated MetricStatus currentMetrics = 5; // conditions is the set of conditions required for this autoscaler to scale its target, @@ -274,6 +274,17 @@ message ObjectMetricSource { // targetValue is the target value of the metric (as a quantity). optional k8s.io.apimachinery.pkg.api.resource.Quantity targetValue = 3; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 4; + + // averageValue is the target value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity averageValue = 5; } // ObjectMetricStatus indicates the current value of a metric describing a @@ -287,6 +298,17 @@ message ObjectMetricStatus { // currentValue is the current value of the metric (as a quantity). optional k8s.io.apimachinery.pkg.api.resource.Quantity currentValue = 3; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 4; + + // averageValue is the current value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity averageValue = 5; } // PodsMetricSource indicates how to scale on a metric describing each pod in @@ -300,6 +322,12 @@ message PodsMetricSource { // targetAverageValue is the target value of the average of the // metric across all relevant pods (as a quantity) optional k8s.io.apimachinery.pkg.api.resource.Quantity targetAverageValue = 2; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 3; } // PodsMetricStatus indicates the current value of a metric describing each pod in @@ -311,6 +339,12 @@ message PodsMetricStatus { // currentAverageValue is the current value of the average of the // metric across all relevant pods (as a quantity) optional k8s.io.apimachinery.pkg.api.resource.Quantity currentAverageValue = 2; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 3; } // ResourceMetricSource indicates how to scale on a resource metric known to diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/types.go b/vendor/k8s.io/api/autoscaling/v2beta1/types.go index f842cc34..6a30e677 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/types.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/types.go @@ -123,6 +123,16 @@ type ObjectMetricSource struct { MetricName string `json:"metricName" protobuf:"bytes,2,name=metricName"` // targetValue is the target value of the metric (as a quantity). TargetValue resource.Quantity `json:"targetValue" protobuf:"bytes,3,name=targetValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,4,name=selector"` + // averageValue is the target value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + AverageValue *resource.Quantity `json:"averageValue,omitempty" protobuf:"bytes,5,name=averageValue"` } // PodsMetricSource indicates how to scale on a metric describing each pod in @@ -135,6 +145,12 @@ type PodsMetricSource struct { // targetAverageValue is the target value of the average of the // metric across all relevant pods (as a quantity) TargetAverageValue resource.Quantity `json:"targetAverageValue" protobuf:"bytes,2,name=targetAverageValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,3,name=selector"` } // ResourceMetricSource indicates how to scale on a resource metric known to @@ -200,6 +216,7 @@ type HorizontalPodAutoscalerStatus struct { DesiredReplicas int32 `json:"desiredReplicas" protobuf:"varint,4,opt,name=desiredReplicas"` // currentMetrics is the last read state of the metrics used by this autoscaler. + // +optional CurrentMetrics []MetricStatus `json:"currentMetrics" protobuf:"bytes,5,rep,name=currentMetrics"` // conditions is the set of conditions required for this autoscaler to scale its target, @@ -284,6 +301,16 @@ type ObjectMetricStatus struct { MetricName string `json:"metricName" protobuf:"bytes,2,name=metricName"` // currentValue is the current value of the metric (as a quantity). CurrentValue resource.Quantity `json:"currentValue" protobuf:"bytes,3,name=currentValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,4,name=selector"` + // averageValue is the current value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + AverageValue *resource.Quantity `json:"averageValue,omitempty" protobuf:"bytes,5,name=averageValue"` } // PodsMetricStatus indicates the current value of a metric describing each pod in @@ -294,6 +321,12 @@ type PodsMetricStatus struct { // currentAverageValue is the current value of the average of the // metric across all relevant pods (as a quantity) CurrentAverageValue resource.Quantity `json:"currentAverageValue" protobuf:"bytes,2,name=currentAverageValue"` + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,3,name=selector"` } // ResourceMetricStatus indicates the current value of a resource metric known to diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go index 6fa9385c..411b817d 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go @@ -149,10 +149,12 @@ func (MetricStatus) SwaggerDoc() map[string]string { } var map_ObjectMetricSource = map[string]string{ - "": "ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", - "target": "target is the described Kubernetes object.", - "metricName": "metricName is the name of the metric in question.", - "targetValue": "targetValue is the target value of the metric (as a quantity).", + "": "ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "target": "target is the described Kubernetes object.", + "metricName": "metricName is the name of the metric in question.", + "targetValue": "targetValue is the target value of the metric (as a quantity).", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics.", + "averageValue": "averageValue is the target value of the average of the metric across all relevant pods (as a quantity)", } func (ObjectMetricSource) SwaggerDoc() map[string]string { @@ -164,6 +166,8 @@ var map_ObjectMetricStatus = map[string]string{ "target": "target is the described Kubernetes object.", "metricName": "metricName is the name of the metric in question.", "currentValue": "currentValue is the current value of the metric (as a quantity).", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the ObjectMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics.", + "averageValue": "averageValue is the current value of the average of the metric across all relevant pods (as a quantity)", } func (ObjectMetricStatus) SwaggerDoc() map[string]string { @@ -174,6 +178,7 @@ var map_PodsMetricSource = map[string]string{ "": "PodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", "metricName": "metricName is the name of the metric in question", "targetAverageValue": "targetAverageValue is the target value of the average of the metric across all relevant pods (as a quantity)", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping When unset, just the metricName will be used to gather metrics.", } func (PodsMetricSource) SwaggerDoc() map[string]string { @@ -184,6 +189,7 @@ var map_PodsMetricStatus = map[string]string{ "": "PodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).", "metricName": "metricName is the name of the metric in question", "currentAverageValue": "currentAverageValue is the current value of the average of the metric across all relevant pods (as a quantity)", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set in the PodsMetricSource, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics.", } func (PodsMetricStatus) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go index fd46bd89..2ec7e615 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go @@ -46,30 +46,18 @@ func (in *ExternalMetricSource) DeepCopyInto(out *ExternalMetricSource) { *out = *in if in.MetricSelector != nil { in, out := &in.MetricSelector, &out.MetricSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.TargetValue != nil { in, out := &in.TargetValue, &out.TargetValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } if in.TargetAverageValue != nil { in, out := &in.TargetAverageValue, &out.TargetAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -89,22 +77,14 @@ func (in *ExternalMetricStatus) DeepCopyInto(out *ExternalMetricStatus) { *out = *in if in.MetricSelector != nil { in, out := &in.MetricSelector, &out.MetricSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } out.CurrentValue = in.CurrentValue.DeepCopy() if in.CurrentAverageValue != nil { in, out := &in.CurrentAverageValue, &out.CurrentAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -203,12 +183,8 @@ func (in *HorizontalPodAutoscalerSpec) DeepCopyInto(out *HorizontalPodAutoscaler out.ScaleTargetRef = in.ScaleTargetRef if in.MinReplicas != nil { in, out := &in.MinReplicas, &out.MinReplicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Metrics != nil { in, out := &in.Metrics, &out.Metrics @@ -235,20 +211,12 @@ func (in *HorizontalPodAutoscalerStatus) DeepCopyInto(out *HorizontalPodAutoscal *out = *in if in.ObservedGeneration != nil { in, out := &in.ObservedGeneration, &out.ObservedGeneration - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.LastScaleTime != nil { in, out := &in.LastScaleTime, &out.LastScaleTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.CurrentMetrics != nil { in, out := &in.CurrentMetrics, &out.CurrentMetrics @@ -282,39 +250,23 @@ func (in *MetricSpec) DeepCopyInto(out *MetricSpec) { *out = *in if in.Object != nil { in, out := &in.Object, &out.Object - if *in == nil { - *out = nil - } else { - *out = new(ObjectMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ObjectMetricSource) + (*in).DeepCopyInto(*out) } if in.Pods != nil { in, out := &in.Pods, &out.Pods - if *in == nil { - *out = nil - } else { - *out = new(PodsMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(PodsMetricSource) + (*in).DeepCopyInto(*out) } if in.Resource != nil { in, out := &in.Resource, &out.Resource - if *in == nil { - *out = nil - } else { - *out = new(ResourceMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceMetricSource) + (*in).DeepCopyInto(*out) } if in.External != nil { in, out := &in.External, &out.External - if *in == nil { - *out = nil - } else { - *out = new(ExternalMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ExternalMetricSource) + (*in).DeepCopyInto(*out) } return } @@ -334,39 +286,23 @@ func (in *MetricStatus) DeepCopyInto(out *MetricStatus) { *out = *in if in.Object != nil { in, out := &in.Object, &out.Object - if *in == nil { - *out = nil - } else { - *out = new(ObjectMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ObjectMetricStatus) + (*in).DeepCopyInto(*out) } if in.Pods != nil { in, out := &in.Pods, &out.Pods - if *in == nil { - *out = nil - } else { - *out = new(PodsMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(PodsMetricStatus) + (*in).DeepCopyInto(*out) } if in.Resource != nil { in, out := &in.Resource, &out.Resource - if *in == nil { - *out = nil - } else { - *out = new(ResourceMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceMetricStatus) + (*in).DeepCopyInto(*out) } if in.External != nil { in, out := &in.External, &out.External - if *in == nil { - *out = nil - } else { - *out = new(ExternalMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ExternalMetricStatus) + (*in).DeepCopyInto(*out) } return } @@ -386,6 +322,16 @@ func (in *ObjectMetricSource) DeepCopyInto(out *ObjectMetricSource) { *out = *in out.Target = in.Target out.TargetValue = in.TargetValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } return } @@ -404,6 +350,16 @@ func (in *ObjectMetricStatus) DeepCopyInto(out *ObjectMetricStatus) { *out = *in out.Target = in.Target out.CurrentValue = in.CurrentValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } return } @@ -421,6 +377,11 @@ func (in *ObjectMetricStatus) DeepCopy() *ObjectMetricStatus { func (in *PodsMetricSource) DeepCopyInto(out *PodsMetricSource) { *out = *in out.TargetAverageValue = in.TargetAverageValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } return } @@ -438,6 +399,11 @@ func (in *PodsMetricSource) DeepCopy() *PodsMetricSource { func (in *PodsMetricStatus) DeepCopyInto(out *PodsMetricStatus) { *out = *in out.CurrentAverageValue = in.CurrentAverageValue.DeepCopy() + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } return } @@ -456,21 +422,13 @@ func (in *ResourceMetricSource) DeepCopyInto(out *ResourceMetricSource) { *out = *in if in.TargetAverageUtilization != nil { in, out := &in.TargetAverageUtilization, &out.TargetAverageUtilization - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.TargetAverageValue != nil { in, out := &in.TargetAverageValue, &out.TargetAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -490,12 +448,8 @@ func (in *ResourceMetricStatus) DeepCopyInto(out *ResourceMetricStatus) { *out = *in if in.CurrentAverageUtilization != nil { in, out := &in.CurrentAverageUtilization, &out.CurrentAverageUtilization - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } out.CurrentAverageValue = in.CurrentAverageValue.DeepCopy() return diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/BUILD b/vendor/k8s.io/api/autoscaling/v2beta2/BUILD new file mode 100644 index 00000000..bb211b26 --- /dev/null +++ b/vendor/k8s.io/api/autoscaling/v2beta2/BUILD @@ -0,0 +1,44 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "generated.pb.go", + "register.go", + "types.go", + "types_swagger_doc_generated.go", + "zz_generated.deepcopy.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta2", + importpath = "k8s.io/api/autoscaling/v2beta2", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/doc.go b/vendor/k8s.io/api/autoscaling/v2beta2/doc.go similarity index 84% rename from vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/doc.go rename to vendor/k8s.io/api/autoscaling/v2beta2/doc.go index 2f93e6aa..7c7d2b6f 100644 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/doc.go +++ b/vendor/k8s.io/api/autoscaling/v2beta2/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ limitations under the License. */ // +k8s:deepcopy-gen=package -// +k8s:conversion-gen=k8s.io/metrics/pkg/apis/metrics // +k8s:openapi-gen=true -package v1beta1 +package v2beta2 // import "k8s.io/api/autoscaling/v2beta2" diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go b/vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go new file mode 100644 index 00000000..be752a14 --- /dev/null +++ b/vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go @@ -0,0 +1,4438 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by protoc-gen-gogo. +// source: k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta2/generated.proto +// DO NOT EDIT! + +/* + Package v2beta2 is a generated protocol buffer package. + + It is generated from these files: + k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta2/generated.proto + + It has these top-level messages: + CrossVersionObjectReference + ExternalMetricSource + ExternalMetricStatus + HorizontalPodAutoscaler + HorizontalPodAutoscalerCondition + HorizontalPodAutoscalerList + HorizontalPodAutoscalerSpec + HorizontalPodAutoscalerStatus + MetricIdentifier + MetricSpec + MetricStatus + MetricTarget + MetricValueStatus + ObjectMetricSource + ObjectMetricStatus + PodsMetricSource + PodsMetricStatus + ResourceMetricSource + ResourceMetricStatus +*/ +package v2beta2 + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import k8s_io_apimachinery_pkg_api_resource "k8s.io/apimachinery/pkg/api/resource" +import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +import k8s_io_api_core_v1 "k8s.io/api/core/v1" + +import strings "strings" +import reflect "reflect" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +func (m *CrossVersionObjectReference) Reset() { *m = CrossVersionObjectReference{} } +func (*CrossVersionObjectReference) ProtoMessage() {} +func (*CrossVersionObjectReference) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{0} +} + +func (m *ExternalMetricSource) Reset() { *m = ExternalMetricSource{} } +func (*ExternalMetricSource) ProtoMessage() {} +func (*ExternalMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } + +func (m *ExternalMetricStatus) Reset() { *m = ExternalMetricStatus{} } +func (*ExternalMetricStatus) ProtoMessage() {} +func (*ExternalMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } + +func (m *HorizontalPodAutoscaler) Reset() { *m = HorizontalPodAutoscaler{} } +func (*HorizontalPodAutoscaler) ProtoMessage() {} +func (*HorizontalPodAutoscaler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } + +func (m *HorizontalPodAutoscalerCondition) Reset() { *m = HorizontalPodAutoscalerCondition{} } +func (*HorizontalPodAutoscalerCondition) ProtoMessage() {} +func (*HorizontalPodAutoscalerCondition) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{4} +} + +func (m *HorizontalPodAutoscalerList) Reset() { *m = HorizontalPodAutoscalerList{} } +func (*HorizontalPodAutoscalerList) ProtoMessage() {} +func (*HorizontalPodAutoscalerList) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{5} +} + +func (m *HorizontalPodAutoscalerSpec) Reset() { *m = HorizontalPodAutoscalerSpec{} } +func (*HorizontalPodAutoscalerSpec) ProtoMessage() {} +func (*HorizontalPodAutoscalerSpec) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{6} +} + +func (m *HorizontalPodAutoscalerStatus) Reset() { *m = HorizontalPodAutoscalerStatus{} } +func (*HorizontalPodAutoscalerStatus) ProtoMessage() {} +func (*HorizontalPodAutoscalerStatus) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{7} +} + +func (m *MetricIdentifier) Reset() { *m = MetricIdentifier{} } +func (*MetricIdentifier) ProtoMessage() {} +func (*MetricIdentifier) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } + +func (m *MetricSpec) Reset() { *m = MetricSpec{} } +func (*MetricSpec) ProtoMessage() {} +func (*MetricSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } + +func (m *MetricStatus) Reset() { *m = MetricStatus{} } +func (*MetricStatus) ProtoMessage() {} +func (*MetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } + +func (m *MetricTarget) Reset() { *m = MetricTarget{} } +func (*MetricTarget) ProtoMessage() {} +func (*MetricTarget) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } + +func (m *MetricValueStatus) Reset() { *m = MetricValueStatus{} } +func (*MetricValueStatus) ProtoMessage() {} +func (*MetricValueStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } + +func (m *ObjectMetricSource) Reset() { *m = ObjectMetricSource{} } +func (*ObjectMetricSource) ProtoMessage() {} +func (*ObjectMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } + +func (m *ObjectMetricStatus) Reset() { *m = ObjectMetricStatus{} } +func (*ObjectMetricStatus) ProtoMessage() {} +func (*ObjectMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } + +func (m *PodsMetricSource) Reset() { *m = PodsMetricSource{} } +func (*PodsMetricSource) ProtoMessage() {} +func (*PodsMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } + +func (m *PodsMetricStatus) Reset() { *m = PodsMetricStatus{} } +func (*PodsMetricStatus) ProtoMessage() {} +func (*PodsMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } + +func (m *ResourceMetricSource) Reset() { *m = ResourceMetricSource{} } +func (*ResourceMetricSource) ProtoMessage() {} +func (*ResourceMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } + +func (m *ResourceMetricStatus) Reset() { *m = ResourceMetricStatus{} } +func (*ResourceMetricStatus) ProtoMessage() {} +func (*ResourceMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } + +func init() { + proto.RegisterType((*CrossVersionObjectReference)(nil), "k8s.io.api.autoscaling.v2beta2.CrossVersionObjectReference") + proto.RegisterType((*ExternalMetricSource)(nil), "k8s.io.api.autoscaling.v2beta2.ExternalMetricSource") + proto.RegisterType((*ExternalMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta2.ExternalMetricStatus") + proto.RegisterType((*HorizontalPodAutoscaler)(nil), "k8s.io.api.autoscaling.v2beta2.HorizontalPodAutoscaler") + proto.RegisterType((*HorizontalPodAutoscalerCondition)(nil), "k8s.io.api.autoscaling.v2beta2.HorizontalPodAutoscalerCondition") + proto.RegisterType((*HorizontalPodAutoscalerList)(nil), "k8s.io.api.autoscaling.v2beta2.HorizontalPodAutoscalerList") + proto.RegisterType((*HorizontalPodAutoscalerSpec)(nil), "k8s.io.api.autoscaling.v2beta2.HorizontalPodAutoscalerSpec") + proto.RegisterType((*HorizontalPodAutoscalerStatus)(nil), "k8s.io.api.autoscaling.v2beta2.HorizontalPodAutoscalerStatus") + proto.RegisterType((*MetricIdentifier)(nil), "k8s.io.api.autoscaling.v2beta2.MetricIdentifier") + proto.RegisterType((*MetricSpec)(nil), "k8s.io.api.autoscaling.v2beta2.MetricSpec") + proto.RegisterType((*MetricStatus)(nil), "k8s.io.api.autoscaling.v2beta2.MetricStatus") + proto.RegisterType((*MetricTarget)(nil), "k8s.io.api.autoscaling.v2beta2.MetricTarget") + proto.RegisterType((*MetricValueStatus)(nil), "k8s.io.api.autoscaling.v2beta2.MetricValueStatus") + proto.RegisterType((*ObjectMetricSource)(nil), "k8s.io.api.autoscaling.v2beta2.ObjectMetricSource") + proto.RegisterType((*ObjectMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta2.ObjectMetricStatus") + proto.RegisterType((*PodsMetricSource)(nil), "k8s.io.api.autoscaling.v2beta2.PodsMetricSource") + proto.RegisterType((*PodsMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta2.PodsMetricStatus") + proto.RegisterType((*ResourceMetricSource)(nil), "k8s.io.api.autoscaling.v2beta2.ResourceMetricSource") + proto.RegisterType((*ResourceMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta2.ResourceMetricStatus") +} +func (m *CrossVersionObjectReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CrossVersionObjectReference) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i += copy(dAtA[i:], m.Kind) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion))) + i += copy(dAtA[i:], m.APIVersion) + return i, nil +} + +func (m *ExternalMetricSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExternalMetricSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Metric.Size())) + n1, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) + n2, err := m.Target.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + return i, nil +} + +func (m *ExternalMetricStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExternalMetricStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Metric.Size())) + n3, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Current.Size())) + n4, err := m.Current.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + return i, nil +} + +func (m *HorizontalPodAutoscaler) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HorizontalPodAutoscaler) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n5, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n6, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n7, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + return i, nil +} + +func (m *HorizontalPodAutoscalerCondition) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HorizontalPodAutoscalerCondition) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) + n8, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i += copy(dAtA[i:], m.Message) + return i, nil +} + +func (m *HorizontalPodAutoscalerList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HorizontalPodAutoscalerList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n9, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *HorizontalPodAutoscalerSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HorizontalPodAutoscalerSpec) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleTargetRef.Size())) + n10, err := m.ScaleTargetRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + if m.MinReplicas != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.MinReplicas)) + } + dAtA[i] = 0x18 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.MaxReplicas)) + if len(m.Metrics) > 0 { + for _, msg := range m.Metrics { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *HorizontalPodAutoscalerStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *HorizontalPodAutoscalerStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ObservedGeneration != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.ObservedGeneration)) + } + if m.LastScaleTime != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastScaleTime.Size())) + n11, err := m.LastScaleTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + dAtA[i] = 0x18 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentReplicas)) + dAtA[i] = 0x20 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.DesiredReplicas)) + if len(m.CurrentMetrics) > 0 { + for _, msg := range m.CurrentMetrics { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.Conditions) > 0 { + for _, msg := range m.Conditions { + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *MetricIdentifier) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MetricIdentifier) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + if m.Selector != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n12, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + return i, nil +} + +func (m *MetricSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MetricSpec) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + if m.Object != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Object.Size())) + n13, err := m.Object.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n13 + } + if m.Pods != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Pods.Size())) + n14, err := m.Pods.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n14 + } + if m.Resource != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) + n15, err := m.Resource.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n15 + } + if m.External != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.External.Size())) + n16, err := m.External.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + } + return i, nil +} + +func (m *MetricStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MetricStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + if m.Object != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Object.Size())) + n17, err := m.Object.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 + } + if m.Pods != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Pods.Size())) + n18, err := m.Pods.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n18 + } + if m.Resource != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) + n19, err := m.Resource.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + } + if m.External != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.External.Size())) + n20, err := m.External.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n20 + } + return i, nil +} + +func (m *MetricTarget) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MetricTarget) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + if m.Value != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Value.Size())) + n21, err := m.Value.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n21 + } + if m.AverageValue != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AverageValue.Size())) + n22, err := m.AverageValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n22 + } + if m.AverageUtilization != nil { + dAtA[i] = 0x20 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.AverageUtilization)) + } + return i, nil +} + +func (m *MetricValueStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MetricValueStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Value != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Value.Size())) + n23, err := m.Value.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n23 + } + if m.AverageValue != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AverageValue.Size())) + n24, err := m.AverageValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n24 + } + if m.AverageUtilization != nil { + dAtA[i] = 0x18 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.AverageUtilization)) + } + return i, nil +} + +func (m *ObjectMetricSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ObjectMetricSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.DescribedObject.Size())) + n25, err := m.DescribedObject.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n25 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) + n26, err := m.Target.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n26 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Metric.Size())) + n27, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n27 + return i, nil +} + +func (m *ObjectMetricStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ObjectMetricStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Metric.Size())) + n28, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n28 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Current.Size())) + n29, err := m.Current.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n29 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.DescribedObject.Size())) + n30, err := m.DescribedObject.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n30 + return i, nil +} + +func (m *PodsMetricSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodsMetricSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Metric.Size())) + n31, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) + n32, err := m.Target.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n32 + return i, nil +} + +func (m *PodsMetricStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodsMetricStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Metric.Size())) + n33, err := m.Metric.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n33 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Current.Size())) + n34, err := m.Current.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n34 + return i, nil +} + +func (m *ResourceMetricSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceMetricSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) + n35, err := m.Target.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n35 + return i, nil +} + +func (m *ResourceMetricStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResourceMetricStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Current.Size())) + n36, err := m.Current.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n36 + return i, nil +} + +func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + dAtA[offset+4] = uint8(v >> 32) + dAtA[offset+5] = uint8(v >> 40) + dAtA[offset+6] = uint8(v >> 48) + dAtA[offset+7] = uint8(v >> 56) + return offset + 8 +} +func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + return offset + 4 +} +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *CrossVersionObjectReference) Size() (n int) { + var l int + _ = l + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.APIVersion) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ExternalMetricSource) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Target.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ExternalMetricStatus) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Current.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *HorizontalPodAutoscaler) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *HorizontalPodAutoscalerCondition) Size() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Status) + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastTransitionTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *HorizontalPodAutoscalerList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *HorizontalPodAutoscalerSpec) Size() (n int) { + var l int + _ = l + l = m.ScaleTargetRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.MinReplicas != nil { + n += 1 + sovGenerated(uint64(*m.MinReplicas)) + } + n += 1 + sovGenerated(uint64(m.MaxReplicas)) + if len(m.Metrics) > 0 { + for _, e := range m.Metrics { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *HorizontalPodAutoscalerStatus) Size() (n int) { + var l int + _ = l + if m.ObservedGeneration != nil { + n += 1 + sovGenerated(uint64(*m.ObservedGeneration)) + } + if m.LastScaleTime != nil { + l = m.LastScaleTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 1 + sovGenerated(uint64(m.CurrentReplicas)) + n += 1 + sovGenerated(uint64(m.DesiredReplicas)) + if len(m.CurrentMetrics) > 0 { + for _, e := range m.CurrentMetrics { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *MetricIdentifier) Size() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *MetricSpec) Size() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + if m.Object != nil { + l = m.Object.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Pods != nil { + l = m.Pods.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Resource != nil { + l = m.Resource.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.External != nil { + l = m.External.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *MetricStatus) Size() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + if m.Object != nil { + l = m.Object.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Pods != nil { + l = m.Pods.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Resource != nil { + l = m.Resource.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.External != nil { + l = m.External.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *MetricTarget) Size() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + if m.Value != nil { + l = m.Value.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageValue != nil { + l = m.AverageValue.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageUtilization != nil { + n += 1 + sovGenerated(uint64(*m.AverageUtilization)) + } + return n +} + +func (m *MetricValueStatus) Size() (n int) { + var l int + _ = l + if m.Value != nil { + l = m.Value.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageValue != nil { + l = m.AverageValue.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.AverageUtilization != nil { + n += 1 + sovGenerated(uint64(*m.AverageUtilization)) + } + return n +} + +func (m *ObjectMetricSource) Size() (n int) { + var l int + _ = l + l = m.DescribedObject.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Target.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Metric.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ObjectMetricStatus) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Current.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.DescribedObject.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PodsMetricSource) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Target.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PodsMetricStatus) Size() (n int) { + var l int + _ = l + l = m.Metric.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Current.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceMetricSource) Size() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Target.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *ResourceMetricStatus) Size() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Current.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func sovGenerated(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *CrossVersionObjectReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CrossVersionObjectReference{`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, + `}`, + }, "") + return s +} +func (this *ExternalMetricSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExternalMetricSource{`, + `Metric:` + strings.Replace(strings.Replace(this.Metric.String(), "MetricIdentifier", "MetricIdentifier", 1), `&`, ``, 1) + `,`, + `Target:` + strings.Replace(strings.Replace(this.Target.String(), "MetricTarget", "MetricTarget", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ExternalMetricStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ExternalMetricStatus{`, + `Metric:` + strings.Replace(strings.Replace(this.Metric.String(), "MetricIdentifier", "MetricIdentifier", 1), `&`, ``, 1) + `,`, + `Current:` + strings.Replace(strings.Replace(this.Current.String(), "MetricValueStatus", "MetricValueStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *HorizontalPodAutoscaler) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HorizontalPodAutoscaler{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "HorizontalPodAutoscalerSpec", "HorizontalPodAutoscalerSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "HorizontalPodAutoscalerStatus", "HorizontalPodAutoscalerStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *HorizontalPodAutoscalerCondition) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HorizontalPodAutoscalerCondition{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Status:` + fmt.Sprintf("%v", this.Status) + `,`, + `LastTransitionTime:` + strings.Replace(strings.Replace(this.LastTransitionTime.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, + `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `}`, + }, "") + return s +} +func (this *HorizontalPodAutoscalerList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HorizontalPodAutoscalerList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "HorizontalPodAutoscaler", "HorizontalPodAutoscaler", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *HorizontalPodAutoscalerSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HorizontalPodAutoscalerSpec{`, + `ScaleTargetRef:` + strings.Replace(strings.Replace(this.ScaleTargetRef.String(), "CrossVersionObjectReference", "CrossVersionObjectReference", 1), `&`, ``, 1) + `,`, + `MinReplicas:` + valueToStringGenerated(this.MinReplicas) + `,`, + `MaxReplicas:` + fmt.Sprintf("%v", this.MaxReplicas) + `,`, + `Metrics:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Metrics), "MetricSpec", "MetricSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *HorizontalPodAutoscalerStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HorizontalPodAutoscalerStatus{`, + `ObservedGeneration:` + valueToStringGenerated(this.ObservedGeneration) + `,`, + `LastScaleTime:` + strings.Replace(fmt.Sprintf("%v", this.LastScaleTime), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1) + `,`, + `CurrentReplicas:` + fmt.Sprintf("%v", this.CurrentReplicas) + `,`, + `DesiredReplicas:` + fmt.Sprintf("%v", this.DesiredReplicas) + `,`, + `CurrentMetrics:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.CurrentMetrics), "MetricStatus", "MetricStatus", 1), `&`, ``, 1) + `,`, + `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "HorizontalPodAutoscalerCondition", "HorizontalPodAutoscalerCondition", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *MetricIdentifier) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MetricIdentifier{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `}`, + }, "") + return s +} +func (this *MetricSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MetricSpec{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Object:` + strings.Replace(fmt.Sprintf("%v", this.Object), "ObjectMetricSource", "ObjectMetricSource", 1) + `,`, + `Pods:` + strings.Replace(fmt.Sprintf("%v", this.Pods), "PodsMetricSource", "PodsMetricSource", 1) + `,`, + `Resource:` + strings.Replace(fmt.Sprintf("%v", this.Resource), "ResourceMetricSource", "ResourceMetricSource", 1) + `,`, + `External:` + strings.Replace(fmt.Sprintf("%v", this.External), "ExternalMetricSource", "ExternalMetricSource", 1) + `,`, + `}`, + }, "") + return s +} +func (this *MetricStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MetricStatus{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Object:` + strings.Replace(fmt.Sprintf("%v", this.Object), "ObjectMetricStatus", "ObjectMetricStatus", 1) + `,`, + `Pods:` + strings.Replace(fmt.Sprintf("%v", this.Pods), "PodsMetricStatus", "PodsMetricStatus", 1) + `,`, + `Resource:` + strings.Replace(fmt.Sprintf("%v", this.Resource), "ResourceMetricStatus", "ResourceMetricStatus", 1) + `,`, + `External:` + strings.Replace(fmt.Sprintf("%v", this.External), "ExternalMetricStatus", "ExternalMetricStatus", 1) + `,`, + `}`, + }, "") + return s +} +func (this *MetricTarget) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MetricTarget{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Value:` + strings.Replace(fmt.Sprintf("%v", this.Value), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, + `AverageValue:` + strings.Replace(fmt.Sprintf("%v", this.AverageValue), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, + `AverageUtilization:` + valueToStringGenerated(this.AverageUtilization) + `,`, + `}`, + }, "") + return s +} +func (this *MetricValueStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&MetricValueStatus{`, + `Value:` + strings.Replace(fmt.Sprintf("%v", this.Value), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, + `AverageValue:` + strings.Replace(fmt.Sprintf("%v", this.AverageValue), "Quantity", "k8s_io_apimachinery_pkg_api_resource.Quantity", 1) + `,`, + `AverageUtilization:` + valueToStringGenerated(this.AverageUtilization) + `,`, + `}`, + }, "") + return s +} +func (this *ObjectMetricSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ObjectMetricSource{`, + `DescribedObject:` + strings.Replace(strings.Replace(this.DescribedObject.String(), "CrossVersionObjectReference", "CrossVersionObjectReference", 1), `&`, ``, 1) + `,`, + `Target:` + strings.Replace(strings.Replace(this.Target.String(), "MetricTarget", "MetricTarget", 1), `&`, ``, 1) + `,`, + `Metric:` + strings.Replace(strings.Replace(this.Metric.String(), "MetricIdentifier", "MetricIdentifier", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ObjectMetricStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ObjectMetricStatus{`, + `Metric:` + strings.Replace(strings.Replace(this.Metric.String(), "MetricIdentifier", "MetricIdentifier", 1), `&`, ``, 1) + `,`, + `Current:` + strings.Replace(strings.Replace(this.Current.String(), "MetricValueStatus", "MetricValueStatus", 1), `&`, ``, 1) + `,`, + `DescribedObject:` + strings.Replace(strings.Replace(this.DescribedObject.String(), "CrossVersionObjectReference", "CrossVersionObjectReference", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PodsMetricSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodsMetricSource{`, + `Metric:` + strings.Replace(strings.Replace(this.Metric.String(), "MetricIdentifier", "MetricIdentifier", 1), `&`, ``, 1) + `,`, + `Target:` + strings.Replace(strings.Replace(this.Target.String(), "MetricTarget", "MetricTarget", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PodsMetricStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodsMetricStatus{`, + `Metric:` + strings.Replace(strings.Replace(this.Metric.String(), "MetricIdentifier", "MetricIdentifier", 1), `&`, ``, 1) + `,`, + `Current:` + strings.Replace(strings.Replace(this.Current.String(), "MetricValueStatus", "MetricValueStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceMetricSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceMetricSource{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Target:` + strings.Replace(strings.Replace(this.Target.String(), "MetricTarget", "MetricTarget", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ResourceMetricStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ResourceMetricStatus{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Current:` + strings.Replace(strings.Replace(this.Current.String(), "MetricValueStatus", "MetricValueStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *CrossVersionObjectReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CrossVersionObjectReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CrossVersionObjectReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.APIVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExternalMetricSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExternalMetricSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExternalMetricSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Target.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ExternalMetricStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExternalMetricStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExternalMetricStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Current", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Current.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HorizontalPodAutoscaler) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HorizontalPodAutoscaler: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HorizontalPodAutoscaler: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HorizontalPodAutoscalerCondition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HorizontalPodAutoscalerCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HorizontalPodAutoscalerCondition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = HorizontalPodAutoscalerConditionType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = k8s_io_api_core_v1.ConditionStatus(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastTransitionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HorizontalPodAutoscalerList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HorizontalPodAutoscalerList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HorizontalPodAutoscalerList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, HorizontalPodAutoscaler{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HorizontalPodAutoscalerSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HorizontalPodAutoscalerSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HorizontalPodAutoscalerSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScaleTargetRef", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ScaleTargetRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinReplicas", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.MinReplicas = &v + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxReplicas", wireType) + } + m.MaxReplicas = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxReplicas |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Metrics = append(m.Metrics, MetricSpec{}) + if err := m.Metrics[len(m.Metrics)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HorizontalPodAutoscalerStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HorizontalPodAutoscalerStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HorizontalPodAutoscalerStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ObservedGeneration", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ObservedGeneration = &v + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastScaleTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LastScaleTime == nil { + m.LastScaleTime = &k8s_io_apimachinery_pkg_apis_meta_v1.Time{} + } + if err := m.LastScaleTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentReplicas", wireType) + } + m.CurrentReplicas = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentReplicas |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DesiredReplicas", wireType) + } + m.DesiredReplicas = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DesiredReplicas |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentMetrics", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentMetrics = append(m.CurrentMetrics, MetricStatus{}) + if err := m.CurrentMetrics[len(m.CurrentMetrics)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, HorizontalPodAutoscalerCondition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MetricIdentifier) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MetricIdentifier: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MetricIdentifier: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MetricSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MetricSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MetricSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = MetricSourceType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Object", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Object == nil { + m.Object = &ObjectMetricSource{} + } + if err := m.Object.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pods == nil { + m.Pods = &PodsMetricSource{} + } + if err := m.Pods.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Resource == nil { + m.Resource = &ResourceMetricSource{} + } + if err := m.Resource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field External", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.External == nil { + m.External = &ExternalMetricSource{} + } + if err := m.External.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MetricStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MetricStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MetricStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = MetricSourceType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Object", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Object == nil { + m.Object = &ObjectMetricStatus{} + } + if err := m.Object.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pods", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pods == nil { + m.Pods = &PodsMetricStatus{} + } + if err := m.Pods.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Resource == nil { + m.Resource = &ResourceMetricStatus{} + } + if err := m.Resource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field External", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.External == nil { + m.External = &ExternalMetricStatus{} + } + if err := m.External.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MetricTarget) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MetricTarget: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MetricTarget: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = MetricTargetType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Value == nil { + m.Value = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AverageValue == nil { + m.AverageValue = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.AverageValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageUtilization", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AverageUtilization = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MetricValueStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MetricValueStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MetricValueStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Value == nil { + m.Value = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageValue", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AverageValue == nil { + m.AverageValue = &k8s_io_apimachinery_pkg_api_resource.Quantity{} + } + if err := m.AverageValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AverageUtilization", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.AverageUtilization = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ObjectMetricSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ObjectMetricSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectMetricSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DescribedObject", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DescribedObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Target.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ObjectMetricStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ObjectMetricStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ObjectMetricStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Current", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Current.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DescribedObject", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DescribedObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodsMetricSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodsMetricSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodsMetricSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Target.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodsMetricStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodsMetricStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodsMetricStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metric", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metric.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Current", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Current.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceMetricSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceMetricSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceMetricSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Target.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceMetricStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceMetricStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceMetricStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Current", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Current.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipGenerated(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta2/generated.proto", fileDescriptorGenerated) +} + +var fileDescriptorGenerated = []byte{ + // 1425 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xdd, 0x6f, 0x1b, 0xc5, + 0x16, 0xcf, 0xda, 0x8e, 0x93, 0x8e, 0xd3, 0x24, 0x9d, 0x5b, 0xb5, 0x56, 0xaa, 0x6b, 0x47, 0xab, + 0xab, 0xab, 0x52, 0xd1, 0x35, 0x31, 0xe1, 0x43, 0x42, 0x48, 0xc4, 0x01, 0xda, 0x8a, 0xa4, 0x2d, + 0x93, 0xb4, 0x42, 0xa8, 0x45, 0x8c, 0x77, 0x4f, 0xdc, 0x21, 0xde, 0x5d, 0x6b, 0x76, 0x6c, 0x35, + 0x45, 0x42, 0xbc, 0xf0, 0x8e, 0x40, 0xfc, 0x13, 0x88, 0x17, 0x5e, 0x90, 0x78, 0xe4, 0x43, 0xa8, + 0x42, 0x08, 0xf5, 0xb1, 0x08, 0xc9, 0xa2, 0xe6, 0xbf, 0xe8, 0x13, 0xda, 0x99, 0xd9, 0xf5, 0xae, + 0xed, 0xc4, 0x4e, 0x95, 0x14, 0xf5, 0xcd, 0x33, 0xe7, 0x9c, 0xdf, 0xf9, 0x9c, 0x73, 0xce, 0x1a, + 0x5d, 0xda, 0x7d, 0x35, 0xb0, 0x98, 0x5f, 0xd9, 0x6d, 0xd7, 0x81, 0x7b, 0x20, 0x20, 0xa8, 0x74, + 0xc0, 0x73, 0x7c, 0x5e, 0xd1, 0x04, 0xda, 0x62, 0x15, 0xda, 0x16, 0x7e, 0x60, 0xd3, 0x26, 0xf3, + 0x1a, 0x95, 0x4e, 0xb5, 0x0e, 0x82, 0x56, 0x2b, 0x0d, 0xf0, 0x80, 0x53, 0x01, 0x8e, 0xd5, 0xe2, + 0xbe, 0xf0, 0x71, 0x49, 0xf1, 0x5b, 0xb4, 0xc5, 0xac, 0x04, 0xbf, 0xa5, 0xf9, 0x97, 0x2e, 0x36, + 0x98, 0xb8, 0xd3, 0xae, 0x5b, 0xb6, 0xef, 0x56, 0x1a, 0x7e, 0xc3, 0xaf, 0x48, 0xb1, 0x7a, 0x7b, + 0x47, 0x9e, 0xe4, 0x41, 0xfe, 0x52, 0x70, 0x4b, 0x66, 0x42, 0xbd, 0xed, 0x73, 0xa8, 0x74, 0x56, + 0x06, 0x55, 0x2e, 0xad, 0xf6, 0x79, 0x5c, 0x6a, 0xdf, 0x61, 0x1e, 0xf0, 0xbd, 0x4a, 0x6b, 0xb7, + 0x21, 0x85, 0x38, 0x04, 0x7e, 0x9b, 0xdb, 0x70, 0x28, 0xa9, 0xa0, 0xe2, 0x82, 0xa0, 0xa3, 0x74, + 0x55, 0xf6, 0x93, 0xe2, 0x6d, 0x4f, 0x30, 0x77, 0x58, 0xcd, 0xcb, 0xe3, 0x04, 0x02, 0xfb, 0x0e, + 0xb8, 0x74, 0x50, 0xce, 0xfc, 0xca, 0x40, 0xe7, 0xd6, 0xb9, 0x1f, 0x04, 0x37, 0x81, 0x07, 0xcc, + 0xf7, 0xae, 0xd5, 0x3f, 0x02, 0x5b, 0x10, 0xd8, 0x01, 0x0e, 0x9e, 0x0d, 0x78, 0x19, 0xe5, 0x76, + 0x99, 0xe7, 0x14, 0x8d, 0x65, 0xe3, 0xfc, 0x89, 0xda, 0xdc, 0xfd, 0x6e, 0x79, 0xaa, 0xd7, 0x2d, + 0xe7, 0xde, 0x61, 0x9e, 0x43, 0x24, 0x25, 0xe4, 0xf0, 0xa8, 0x0b, 0xc5, 0x4c, 0x9a, 0xe3, 0x2a, + 0x75, 0x81, 0x48, 0x0a, 0xae, 0x22, 0x44, 0x5b, 0x4c, 0x2b, 0x28, 0x66, 0x25, 0x1f, 0xd6, 0x7c, + 0x68, 0xed, 0xfa, 0x15, 0x4d, 0x21, 0x09, 0x2e, 0xf3, 0x17, 0x03, 0x9d, 0x7e, 0xeb, 0xae, 0x00, + 0xee, 0xd1, 0xe6, 0x26, 0x08, 0xce, 0xec, 0x2d, 0x19, 0x5f, 0xfc, 0x1e, 0xca, 0xbb, 0xf2, 0x2c, + 0x4d, 0x2a, 0x54, 0x5f, 0xb0, 0x0e, 0xae, 0x04, 0x4b, 0x49, 0x5f, 0x71, 0xc0, 0x13, 0x6c, 0x87, + 0x01, 0xaf, 0xcd, 0x6b, 0xd5, 0x79, 0x45, 0x21, 0x1a, 0x0f, 0x6f, 0xa3, 0xbc, 0xa0, 0xbc, 0x01, + 0x42, 0xba, 0x52, 0xa8, 0x3e, 0x3f, 0x19, 0xf2, 0xb6, 0x94, 0xe9, 0xa3, 0xaa, 0x33, 0xd1, 0x58, + 0xe6, 0xef, 0xc3, 0x8e, 0x08, 0x2a, 0xda, 0xc1, 0x31, 0x3a, 0x72, 0x0b, 0xcd, 0xd8, 0x6d, 0xce, + 0xc1, 0x8b, 0x3c, 0x59, 0x99, 0x0c, 0xfa, 0x26, 0x6d, 0xb6, 0x41, 0x59, 0x57, 0x5b, 0xd0, 0xd8, + 0x33, 0xeb, 0x0a, 0x89, 0x44, 0x90, 0xe6, 0x0f, 0x19, 0x74, 0xf6, 0xb2, 0xcf, 0xd9, 0x3d, 0xdf, + 0x13, 0xb4, 0x79, 0xdd, 0x77, 0xd6, 0x34, 0x20, 0x70, 0xfc, 0x21, 0x9a, 0x0d, 0x2b, 0xda, 0xa1, + 0x82, 0x8e, 0xf0, 0x2a, 0x2e, 0x4c, 0xab, 0xb5, 0xdb, 0x08, 0x2f, 0x02, 0x2b, 0xe4, 0xb6, 0x3a, + 0x2b, 0x96, 0x2a, 0xbb, 0x4d, 0x10, 0xb4, 0x5f, 0x19, 0xfd, 0x3b, 0x12, 0xa3, 0xe2, 0xdb, 0x28, + 0x17, 0xb4, 0xc0, 0xd6, 0x8e, 0xbd, 0x36, 0xce, 0xb1, 0x7d, 0x0c, 0xdd, 0x6a, 0x81, 0xdd, 0x2f, + 0xd5, 0xf0, 0x44, 0x24, 0x2c, 0x06, 0x94, 0x0f, 0x64, 0x00, 0x64, 0x99, 0x16, 0xaa, 0xaf, 0x3f, + 0xa9, 0x02, 0x15, 0xc5, 0x38, 0x43, 0xea, 0x4c, 0x34, 0xb8, 0xf9, 0x59, 0x16, 0x2d, 0xef, 0x23, + 0xb9, 0xee, 0x7b, 0x0e, 0x13, 0xcc, 0xf7, 0xf0, 0x65, 0x94, 0x13, 0x7b, 0x2d, 0xd0, 0x4f, 0x6f, + 0x35, 0xb2, 0x76, 0x7b, 0xaf, 0x05, 0x8f, 0xbb, 0xe5, 0xff, 0x8d, 0x93, 0x0f, 0xf9, 0x88, 0x44, + 0xc0, 0x1b, 0xb1, 0x57, 0x99, 0x14, 0x96, 0x36, 0xeb, 0x71, 0xb7, 0x3c, 0xa2, 0xff, 0x59, 0x31, + 0x52, 0xda, 0x78, 0xdc, 0x41, 0xb8, 0x49, 0x03, 0xb1, 0xcd, 0xa9, 0x17, 0x28, 0x4d, 0xcc, 0x05, + 0x1d, 0xaf, 0x0b, 0x93, 0xa5, 0x3b, 0x94, 0xa8, 0x2d, 0x69, 0x2b, 0xf0, 0xc6, 0x10, 0x1a, 0x19, + 0xa1, 0x01, 0xff, 0x1f, 0xe5, 0x39, 0xd0, 0xc0, 0xf7, 0x8a, 0x39, 0xe9, 0x45, 0x1c, 0x5c, 0x22, + 0x6f, 0x89, 0xa6, 0xe2, 0xe7, 0xd0, 0x8c, 0x0b, 0x41, 0x40, 0x1b, 0x50, 0x9c, 0x96, 0x8c, 0x71, + 0x2d, 0x6f, 0xaa, 0x6b, 0x12, 0xd1, 0xcd, 0x3f, 0x0c, 0x74, 0x6e, 0x9f, 0x38, 0x6e, 0xb0, 0x40, + 0xe0, 0x5b, 0x43, 0xf5, 0x6c, 0x4d, 0xe6, 0x60, 0x28, 0x2d, 0xab, 0x79, 0x51, 0xeb, 0x9e, 0x8d, + 0x6e, 0x12, 0xb5, 0x7c, 0x0b, 0x4d, 0x33, 0x01, 0x6e, 0x98, 0x95, 0xec, 0xf9, 0x42, 0xf5, 0x95, + 0x27, 0xac, 0xb5, 0xda, 0x49, 0xad, 0x63, 0xfa, 0x4a, 0x88, 0x46, 0x14, 0xa8, 0xf9, 0x67, 0x66, + 0x5f, 0xdf, 0xc2, 0x82, 0xc7, 0x1f, 0xa3, 0x79, 0x79, 0xd2, 0xfd, 0x0a, 0x76, 0xb4, 0x87, 0x63, + 0xdf, 0xd4, 0x01, 0xe3, 0xa2, 0x76, 0x46, 0x9b, 0x32, 0xbf, 0x95, 0x82, 0x26, 0x03, 0xaa, 0xf0, + 0x0a, 0x2a, 0xb8, 0xcc, 0x23, 0xd0, 0x6a, 0x32, 0x9b, 0xaa, 0xb2, 0x9c, 0xae, 0x2d, 0xf4, 0xba, + 0xe5, 0xc2, 0x66, 0xff, 0x9a, 0x24, 0x79, 0xf0, 0x4b, 0xa8, 0xe0, 0xd2, 0xbb, 0xb1, 0x48, 0x56, + 0x8a, 0xfc, 0x47, 0xeb, 0x2b, 0x6c, 0xf6, 0x49, 0x24, 0xc9, 0x87, 0x6f, 0x84, 0xd5, 0x10, 0x76, + 0xb7, 0xa0, 0x98, 0x93, 0x61, 0xbe, 0x30, 0x59, 0x33, 0x94, 0x2d, 0x22, 0x51, 0x39, 0x12, 0x82, + 0x44, 0x58, 0xe6, 0x77, 0x39, 0xf4, 0xdf, 0x03, 0xdf, 0x3e, 0x7e, 0x1b, 0x61, 0xbf, 0x1e, 0x00, + 0xef, 0x80, 0x73, 0x49, 0x0d, 0xdd, 0x70, 0xfa, 0x85, 0x31, 0xce, 0xd6, 0xce, 0x84, 0x65, 0x7f, + 0x6d, 0x88, 0x4a, 0x46, 0x48, 0x60, 0x1b, 0x9d, 0x0c, 0x1f, 0x83, 0x0a, 0x28, 0xd3, 0x83, 0xf6, + 0x70, 0x2f, 0xed, 0x54, 0xaf, 0x5b, 0x3e, 0xb9, 0x91, 0x04, 0x21, 0x69, 0x4c, 0xbc, 0x86, 0x16, + 0x74, 0x7f, 0x1f, 0x08, 0xf0, 0x59, 0x1d, 0x81, 0x85, 0xf5, 0x34, 0x99, 0x0c, 0xf2, 0x87, 0x10, + 0x0e, 0x04, 0x8c, 0x83, 0x13, 0x43, 0xe4, 0xd2, 0x10, 0x6f, 0xa6, 0xc9, 0x64, 0x90, 0x1f, 0x37, + 0xd1, 0xbc, 0x46, 0xd5, 0xf1, 0x2e, 0x4e, 0xcb, 0x94, 0x4d, 0x38, 0x89, 0x75, 0xd3, 0x8d, 0x6b, + 0x70, 0x3d, 0x85, 0x45, 0x06, 0xb0, 0xb1, 0x40, 0xc8, 0x8e, 0x5a, 0x5c, 0x50, 0xcc, 0x4b, 0x4d, + 0x6f, 0x3c, 0xe1, 0x1b, 0x8c, 0x7b, 0x65, 0x7f, 0x7c, 0xc5, 0x57, 0x01, 0x49, 0xe8, 0x31, 0xbf, + 0x34, 0xd0, 0xe2, 0xe0, 0x24, 0x8f, 0x77, 0x28, 0x63, 0xdf, 0x1d, 0xea, 0x36, 0x9a, 0x0d, 0xa0, + 0x09, 0xb6, 0xf0, 0xb9, 0x2e, 0x80, 0x17, 0x27, 0xec, 0x44, 0xb4, 0x0e, 0xcd, 0x2d, 0x2d, 0x5a, + 0x9b, 0x0b, 0x5b, 0x51, 0x74, 0x22, 0x31, 0xa4, 0xf9, 0x75, 0x16, 0xa1, 0x7e, 0xdd, 0xe3, 0xd5, + 0xd4, 0xe8, 0x59, 0x1e, 0x18, 0x3d, 0x8b, 0xc9, 0x85, 0x2c, 0x31, 0x66, 0x6e, 0xa2, 0xbc, 0x2f, + 0xfb, 0x81, 0xb6, 0xb0, 0x3a, 0x2e, 0x98, 0xf1, 0x84, 0x8f, 0xd1, 0x6a, 0x28, 0x6c, 0xe8, 0xba, + 0xab, 0x68, 0x34, 0x7c, 0x15, 0xe5, 0x5a, 0xbe, 0x13, 0x8d, 0xe4, 0xb1, 0x7b, 0xd2, 0x75, 0xdf, + 0x09, 0x52, 0x98, 0xb3, 0xa1, 0xed, 0xe1, 0x2d, 0x91, 0x38, 0xf8, 0x03, 0x34, 0x1b, 0xad, 0xeb, + 0xb2, 0x44, 0x0b, 0xd5, 0xd5, 0x71, 0x98, 0x44, 0xf3, 0xa7, 0x70, 0x65, 0x30, 0x23, 0x0a, 0x89, + 0x31, 0x43, 0x7c, 0xd0, 0x1b, 0x9f, 0x9c, 0x40, 0x13, 0xe0, 0x8f, 0x5a, 0x75, 0x15, 0x7e, 0x44, + 0x21, 0x31, 0xa6, 0xf9, 0x4d, 0x16, 0xcd, 0xa5, 0x56, 0xc9, 0x7f, 0x23, 0x5d, 0xea, 0xad, 0x1d, + 0x6d, 0xba, 0x14, 0xe6, 0xd1, 0xa7, 0x4b, 0xe1, 0x1e, 0x5f, 0xba, 0x12, 0xf8, 0x23, 0xd2, 0xf5, + 0x53, 0x26, 0x4a, 0x97, 0x9a, 0x7f, 0x93, 0xa5, 0x4b, 0xf1, 0x26, 0xd2, 0x75, 0x0d, 0x4d, 0x77, + 0xc2, 0x05, 0x5d, 0x67, 0xeb, 0xc0, 0x45, 0xc4, 0x8a, 0x9c, 0xb3, 0xde, 0x6d, 0x53, 0x4f, 0x30, + 0xb1, 0x57, 0x3b, 0x11, 0x2e, 0x08, 0x72, 0xc3, 0x27, 0x0a, 0x07, 0x3b, 0x68, 0x8e, 0x76, 0x80, + 0xd3, 0x06, 0xc8, 0x6b, 0x9d, 0xaf, 0xc3, 0xe2, 0x2e, 0xf6, 0xba, 0xe5, 0xb9, 0xb5, 0x04, 0x0e, + 0x49, 0xa1, 0x86, 0x63, 0x50, 0x9f, 0x6f, 0x08, 0xd6, 0x64, 0xf7, 0xd4, 0x18, 0x54, 0x93, 0x41, + 0x8e, 0xc1, 0xb5, 0x21, 0x2a, 0x19, 0x21, 0x61, 0x7e, 0x91, 0x41, 0xa7, 0x86, 0x3e, 0x53, 0xfa, + 0x41, 0x31, 0x8e, 0x29, 0x28, 0x99, 0xa7, 0x18, 0x94, 0xec, 0xa1, 0x83, 0xf2, 0x73, 0x06, 0xe1, + 0xe1, 0x26, 0x8a, 0x3f, 0x91, 0xa3, 0xd8, 0xe6, 0xac, 0x0e, 0x8e, 0x22, 0x1f, 0xc5, 0x6e, 0x97, + 0x9c, 0xe3, 0x49, 0x6c, 0x32, 0xa8, 0xec, 0x78, 0xbe, 0xa4, 0x13, 0x1f, 0xcc, 0xd9, 0xa3, 0xfd, + 0x60, 0x36, 0x7f, 0x1b, 0x0c, 0xe3, 0x33, 0xfd, 0x85, 0x3e, 0x2a, 0xfd, 0xd9, 0xa7, 0x98, 0x7e, + 0xf3, 0x47, 0x03, 0x2d, 0x0e, 0x0e, 0xe1, 0x67, 0xee, 0x7f, 0x9b, 0x5f, 0xd3, 0x4e, 0x3c, 0xdb, + 0xff, 0xd9, 0x7c, 0x6b, 0xa0, 0xd3, 0xa3, 0x56, 0x18, 0xbc, 0x9e, 0x5a, 0x3c, 0x2b, 0xc9, 0xc5, + 0xf3, 0x71, 0xb7, 0x5c, 0x1e, 0xf1, 0xaf, 0x40, 0x04, 0x93, 0xd8, 0x4d, 0x8f, 0x27, 0x01, 0xdf, + 0x0f, 0xdb, 0xac, 0x92, 0x70, 0x24, 0x36, 0x1f, 0x6b, 0xbc, 0x6b, 0x17, 0xef, 0x3f, 0x2a, 0x4d, + 0x3d, 0x78, 0x54, 0x9a, 0x7a, 0xf8, 0xa8, 0x34, 0xf5, 0x69, 0xaf, 0x64, 0xdc, 0xef, 0x95, 0x8c, + 0x07, 0xbd, 0x92, 0xf1, 0xb0, 0x57, 0x32, 0xfe, 0xea, 0x95, 0x8c, 0xcf, 0xff, 0x2e, 0x4d, 0xbd, + 0x3f, 0xa3, 0xa1, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xa0, 0xce, 0xf5, 0x16, 0x17, 0x00, + 0x00, +} diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/generated.proto b/vendor/k8s.io/api/autoscaling/v2beta2/generated.proto new file mode 100644 index 00000000..b4e4c95a --- /dev/null +++ b/vendor/k8s.io/api/autoscaling/v2beta2/generated.proto @@ -0,0 +1,369 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = 'proto2'; + +package k8s.io.api.autoscaling.v2beta2; + +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "v2beta2"; + +// CrossVersionObjectReference contains enough information to let you identify the referred resource. +message CrossVersionObjectReference { + // Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + optional string kind = 1; + + // Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names + optional string name = 2; + + // API version of the referent + // +optional + optional string apiVersion = 3; +} + +// ExternalMetricSource indicates how to scale on a metric not associated with +// any Kubernetes object (for example length of queue in cloud +// messaging service, or QPS from loadbalancer running outside of cluster). +message ExternalMetricSource { + // metric identifies the target metric by name and selector + optional MetricIdentifier metric = 1; + + // target specifies the target value for the given metric + optional MetricTarget target = 2; +} + +// ExternalMetricStatus indicates the current value of a global metric +// not associated with any Kubernetes object. +message ExternalMetricStatus { + // metric identifies the target metric by name and selector + optional MetricIdentifier metric = 1; + + // current contains the current value for the given metric + optional MetricValueStatus current = 2; +} + +// HorizontalPodAutoscaler is the configuration for a horizontal pod +// autoscaler, which automatically manages the replica count of any resource +// implementing the scale subresource based on the metrics specified. +message HorizontalPodAutoscaler { + // metadata is the standard object metadata. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // spec is the specification for the behaviour of the autoscaler. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status. + // +optional + optional HorizontalPodAutoscalerSpec spec = 2; + + // status is the current information about the autoscaler. + // +optional + optional HorizontalPodAutoscalerStatus status = 3; +} + +// HorizontalPodAutoscalerCondition describes the state of +// a HorizontalPodAutoscaler at a certain point. +message HorizontalPodAutoscalerCondition { + // type describes the current condition + optional string type = 1; + + // status is the status of the condition (True, False, Unknown) + optional string status = 2; + + // lastTransitionTime is the last time the condition transitioned from + // one status to another + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastTransitionTime = 3; + + // reason is the reason for the condition's last transition. + // +optional + optional string reason = 4; + + // message is a human-readable explanation containing details about + // the transition + // +optional + optional string message = 5; +} + +// HorizontalPodAutoscalerList is a list of horizontal pod autoscaler objects. +message HorizontalPodAutoscalerList { + // metadata is the standard list metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is the list of horizontal pod autoscaler objects. + repeated HorizontalPodAutoscaler items = 2; +} + +// HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler. +message HorizontalPodAutoscalerSpec { + // scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics + // should be collected, as well as to actually change the replica count. + optional CrossVersionObjectReference scaleTargetRef = 1; + + // minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. + // It defaults to 1 pod. + // +optional + optional int32 minReplicas = 2; + + // maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. + // It cannot be less that minReplicas. + optional int32 maxReplicas = 3; + + // metrics contains the specifications for which to use to calculate the + // desired replica count (the maximum replica count across all metrics will + // be used). The desired replica count is calculated multiplying the + // ratio between the target value and the current value by the current + // number of pods. Ergo, metrics used must decrease as the pod count is + // increased, and vice-versa. See the individual metric source types for + // more information about how each type of metric must respond. + // If not set, the default metric will be set to 80% average CPU utilization. + // +optional + repeated MetricSpec metrics = 4; +} + +// HorizontalPodAutoscalerStatus describes the current status of a horizontal pod autoscaler. +message HorizontalPodAutoscalerStatus { + // observedGeneration is the most recent generation observed by this autoscaler. + // +optional + optional int64 observedGeneration = 1; + + // lastScaleTime is the last time the HorizontalPodAutoscaler scaled the number of pods, + // used by the autoscaler to control how often the number of pods is changed. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastScaleTime = 2; + + // currentReplicas is current number of replicas of pods managed by this autoscaler, + // as last seen by the autoscaler. + optional int32 currentReplicas = 3; + + // desiredReplicas is the desired number of replicas of pods managed by this autoscaler, + // as last calculated by the autoscaler. + optional int32 desiredReplicas = 4; + + // currentMetrics is the last read state of the metrics used by this autoscaler. + // +optional + repeated MetricStatus currentMetrics = 5; + + // conditions is the set of conditions required for this autoscaler to scale its target, + // and indicates whether or not those conditions are met. + repeated HorizontalPodAutoscalerCondition conditions = 6; +} + +// MetricIdentifier defines the name and optionally selector for a metric +message MetricIdentifier { + // name is the name of the given metric + optional string name = 1; + + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 2; +} + +// MetricSpec specifies how to scale based on a single metric +// (only `type` and one other matching field should be set at once). +message MetricSpec { + // type is the type of metric source. It should be one of "Object", + // "Pods" or "Resource", each mapping to a matching field in the object. + optional string type = 1; + + // object refers to a metric describing a single kubernetes object + // (for example, hits-per-second on an Ingress object). + // +optional + optional ObjectMetricSource object = 2; + + // pods refers to a metric describing each pod in the current scale target + // (for example, transactions-processed-per-second). The values will be + // averaged together before being compared to the target value. + // +optional + optional PodsMetricSource pods = 3; + + // resource refers to a resource metric (such as those specified in + // requests and limits) known to Kubernetes describing each pod in the + // current scale target (e.g. CPU or memory). Such metrics are built in to + // Kubernetes, and have special scaling options on top of those available + // to normal per-pod metrics using the "pods" source. + // +optional + optional ResourceMetricSource resource = 4; + + // external refers to a global metric that is not associated + // with any Kubernetes object. It allows autoscaling based on information + // coming from components running outside of cluster + // (for example length of queue in cloud messaging service, or + // QPS from loadbalancer running outside of cluster). + // +optional + optional ExternalMetricSource external = 5; +} + +// MetricStatus describes the last-read state of a single metric. +message MetricStatus { + // type is the type of metric source. It will be one of "Object", + // "Pods" or "Resource", each corresponds to a matching field in the object. + optional string type = 1; + + // object refers to a metric describing a single kubernetes object + // (for example, hits-per-second on an Ingress object). + // +optional + optional ObjectMetricStatus object = 2; + + // pods refers to a metric describing each pod in the current scale target + // (for example, transactions-processed-per-second). The values will be + // averaged together before being compared to the target value. + // +optional + optional PodsMetricStatus pods = 3; + + // resource refers to a resource metric (such as those specified in + // requests and limits) known to Kubernetes describing each pod in the + // current scale target (e.g. CPU or memory). Such metrics are built in to + // Kubernetes, and have special scaling options on top of those available + // to normal per-pod metrics using the "pods" source. + // +optional + optional ResourceMetricStatus resource = 4; + + // external refers to a global metric that is not associated + // with any Kubernetes object. It allows autoscaling based on information + // coming from components running outside of cluster + // (for example length of queue in cloud messaging service, or + // QPS from loadbalancer running outside of cluster). + // +optional + optional ExternalMetricStatus external = 5; +} + +// MetricTarget defines the target value, average value, or average utilization of a specific metric +message MetricTarget { + // type represents whether the metric type is Utilization, Value, or AverageValue + optional string type = 1; + + // value is the target value of the metric (as a quantity). + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity value = 2; + + // averageValue is the target value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity averageValue = 3; + + // averageUtilization is the target value of the average of the + // resource metric across all relevant pods, represented as a percentage of + // the requested value of the resource for the pods. + // Currently only valid for Resource metric source type + // +optional + optional int32 averageUtilization = 4; +} + +// MetricValueStatus holds the current value for a metric +message MetricValueStatus { + // value is the current value of the metric (as a quantity). + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity value = 1; + + // averageValue is the current value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + optional k8s.io.apimachinery.pkg.api.resource.Quantity averageValue = 2; + + // currentAverageUtilization is the current value of the average of the + // resource metric across all relevant pods, represented as a percentage of + // the requested value of the resource for the pods. + // +optional + optional int32 averageUtilization = 3; +} + +// ObjectMetricSource indicates how to scale on a metric describing a +// kubernetes object (for example, hits-per-second on an Ingress object). +message ObjectMetricSource { + optional CrossVersionObjectReference describedObject = 1; + + // target specifies the target value for the given metric + optional MetricTarget target = 2; + + // metric identifies the target metric by name and selector + optional MetricIdentifier metric = 3; +} + +// ObjectMetricStatus indicates the current value of a metric describing a +// kubernetes object (for example, hits-per-second on an Ingress object). +message ObjectMetricStatus { + // metric identifies the target metric by name and selector + optional MetricIdentifier metric = 1; + + // current contains the current value for the given metric + optional MetricValueStatus current = 2; + + optional CrossVersionObjectReference describedObject = 3; +} + +// PodsMetricSource indicates how to scale on a metric describing each pod in +// the current scale target (for example, transactions-processed-per-second). +// The values will be averaged together before being compared to the target +// value. +message PodsMetricSource { + // metric identifies the target metric by name and selector + optional MetricIdentifier metric = 1; + + // target specifies the target value for the given metric + optional MetricTarget target = 2; +} + +// PodsMetricStatus indicates the current value of a metric describing each pod in +// the current scale target (for example, transactions-processed-per-second). +message PodsMetricStatus { + // metric identifies the target metric by name and selector + optional MetricIdentifier metric = 1; + + // current contains the current value for the given metric + optional MetricValueStatus current = 2; +} + +// ResourceMetricSource indicates how to scale on a resource metric known to +// Kubernetes, as specified in requests and limits, describing each pod in the +// current scale target (e.g. CPU or memory). The values will be averaged +// together before being compared to the target. Such metrics are built in to +// Kubernetes, and have special scaling options on top of those available to +// normal per-pod metrics using the "pods" source. Only one "target" type +// should be set. +message ResourceMetricSource { + // name is the name of the resource in question. + optional string name = 1; + + // target specifies the target value for the given metric + optional MetricTarget target = 2; +} + +// ResourceMetricStatus indicates the current value of a resource metric known to +// Kubernetes, as specified in requests and limits, describing each pod in the +// current scale target (e.g. CPU or memory). Such metrics are built in to +// Kubernetes, and have special scaling options on top of those available to +// normal per-pod metrics using the "pods" source. +message ResourceMetricStatus { + // Name is the name of the resource in question. + optional string name = 1; + + // current contains the current value for the given metric + optional MetricValueStatus current = 2; +} + diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/register.go b/vendor/k8s.io/api/autoscaling/v2beta2/register.go similarity index 82% rename from vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/register.go rename to vendor/k8s.io/api/autoscaling/v2beta2/register.go index 0db1e78b..eb1265c1 100644 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/register.go +++ b/vendor/k8s.io/api/autoscaling/v2beta2/register.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1beta1 +package v2beta2 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -23,10 +23,10 @@ import ( ) // GroupName is the group name use in this package -const GroupName = "metrics.k8s.io" +const GroupName = "autoscaling" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v2beta2"} // Resource takes an unqualified resource and returns a Group qualified GroupResource func Resource(resource string) schema.GroupResource { @@ -36,15 +36,14 @@ func Resource(resource string) schema.GroupResource { var ( SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) localSchemeBuilder = &SchemeBuilder - AddToScheme = SchemeBuilder.AddToScheme + AddToScheme = localSchemeBuilder.AddToScheme ) +// Adds the list of known types to the given scheme. func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, - &NodeMetrics{}, - &NodeMetricsList{}, - &PodMetrics{}, - &PodMetricsList{}, + &HorizontalPodAutoscaler{}, + &HorizontalPodAutoscalerList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/types.go b/vendor/k8s.io/api/autoscaling/v2beta2/types.go new file mode 100644 index 00000000..2d337953 --- /dev/null +++ b/vendor/k8s.io/api/autoscaling/v2beta2/types.go @@ -0,0 +1,393 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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. +*/ + +// +k8s:openapi-gen=true + +package v2beta2 + +import ( + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// HorizontalPodAutoscaler is the configuration for a horizontal pod +// autoscaler, which automatically manages the replica count of any resource +// implementing the scale subresource based on the metrics specified. +type HorizontalPodAutoscaler struct { + metav1.TypeMeta `json:",inline"` + // metadata is the standard object metadata. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // spec is the specification for the behaviour of the autoscaler. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status. + // +optional + Spec HorizontalPodAutoscalerSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` + + // status is the current information about the autoscaler. + // +optional + Status HorizontalPodAutoscalerStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler. +type HorizontalPodAutoscalerSpec struct { + // scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics + // should be collected, as well as to actually change the replica count. + ScaleTargetRef CrossVersionObjectReference `json:"scaleTargetRef" protobuf:"bytes,1,opt,name=scaleTargetRef"` + // minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. + // It defaults to 1 pod. + // +optional + MinReplicas *int32 `json:"minReplicas,omitempty" protobuf:"varint,2,opt,name=minReplicas"` + // maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. + // It cannot be less that minReplicas. + MaxReplicas int32 `json:"maxReplicas" protobuf:"varint,3,opt,name=maxReplicas"` + // metrics contains the specifications for which to use to calculate the + // desired replica count (the maximum replica count across all metrics will + // be used). The desired replica count is calculated multiplying the + // ratio between the target value and the current value by the current + // number of pods. Ergo, metrics used must decrease as the pod count is + // increased, and vice-versa. See the individual metric source types for + // more information about how each type of metric must respond. + // If not set, the default metric will be set to 80% average CPU utilization. + // +optional + Metrics []MetricSpec `json:"metrics,omitempty" protobuf:"bytes,4,rep,name=metrics"` +} + +// CrossVersionObjectReference contains enough information to let you identify the referred resource. +type CrossVersionObjectReference struct { + // Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" + Kind string `json:"kind" protobuf:"bytes,1,opt,name=kind"` + // Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names + Name string `json:"name" protobuf:"bytes,2,opt,name=name"` + // API version of the referent + // +optional + APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,3,opt,name=apiVersion"` +} + +// MetricSpec specifies how to scale based on a single metric +// (only `type` and one other matching field should be set at once). +type MetricSpec struct { + // type is the type of metric source. It should be one of "Object", + // "Pods" or "Resource", each mapping to a matching field in the object. + Type MetricSourceType `json:"type" protobuf:"bytes,1,name=type"` + + // object refers to a metric describing a single kubernetes object + // (for example, hits-per-second on an Ingress object). + // +optional + Object *ObjectMetricSource `json:"object,omitempty" protobuf:"bytes,2,opt,name=object"` + // pods refers to a metric describing each pod in the current scale target + // (for example, transactions-processed-per-second). The values will be + // averaged together before being compared to the target value. + // +optional + Pods *PodsMetricSource `json:"pods,omitempty" protobuf:"bytes,3,opt,name=pods"` + // resource refers to a resource metric (such as those specified in + // requests and limits) known to Kubernetes describing each pod in the + // current scale target (e.g. CPU or memory). Such metrics are built in to + // Kubernetes, and have special scaling options on top of those available + // to normal per-pod metrics using the "pods" source. + // +optional + Resource *ResourceMetricSource `json:"resource,omitempty" protobuf:"bytes,4,opt,name=resource"` + // external refers to a global metric that is not associated + // with any Kubernetes object. It allows autoscaling based on information + // coming from components running outside of cluster + // (for example length of queue in cloud messaging service, or + // QPS from loadbalancer running outside of cluster). + // +optional + External *ExternalMetricSource `json:"external,omitempty" protobuf:"bytes,5,opt,name=external"` +} + +// MetricSourceType indicates the type of metric. +type MetricSourceType string + +var ( + // ObjectMetricSourceType is a metric describing a kubernetes object + // (for example, hits-per-second on an Ingress object). + ObjectMetricSourceType MetricSourceType = "Object" + // PodsMetricSourceType is a metric describing each pod in the current scale + // target (for example, transactions-processed-per-second). The values + // will be averaged together before being compared to the target value. + PodsMetricSourceType MetricSourceType = "Pods" + // ResourceMetricSourceType is a resource metric known to Kubernetes, as + // specified in requests and limits, describing each pod in the current + // scale target (e.g. CPU or memory). Such metrics are built in to + // Kubernetes, and have special scaling options on top of those available + // to normal per-pod metrics (the "pods" source). + ResourceMetricSourceType MetricSourceType = "Resource" + // ExternalMetricSourceType is a global metric that is not associated + // with any Kubernetes object. It allows autoscaling based on information + // coming from components running outside of cluster + // (for example length of queue in cloud messaging service, or + // QPS from loadbalancer running outside of cluster). + ExternalMetricSourceType MetricSourceType = "External" +) + +// ObjectMetricSource indicates how to scale on a metric describing a +// kubernetes object (for example, hits-per-second on an Ingress object). +type ObjectMetricSource struct { + DescribedObject CrossVersionObjectReference `json:"describedObject" protobuf:"bytes,1,name=describedObject"` + // target specifies the target value for the given metric + Target MetricTarget `json:"target" protobuf:"bytes,2,name=target"` + // metric identifies the target metric by name and selector + Metric MetricIdentifier `json:"metric" protobuf:"bytes,3,name=metric"` +} + +// PodsMetricSource indicates how to scale on a metric describing each pod in +// the current scale target (for example, transactions-processed-per-second). +// The values will be averaged together before being compared to the target +// value. +type PodsMetricSource struct { + // metric identifies the target metric by name and selector + Metric MetricIdentifier `json:"metric" protobuf:"bytes,1,name=metric"` + // target specifies the target value for the given metric + Target MetricTarget `json:"target" protobuf:"bytes,2,name=target"` +} + +// ResourceMetricSource indicates how to scale on a resource metric known to +// Kubernetes, as specified in requests and limits, describing each pod in the +// current scale target (e.g. CPU or memory). The values will be averaged +// together before being compared to the target. Such metrics are built in to +// Kubernetes, and have special scaling options on top of those available to +// normal per-pod metrics using the "pods" source. Only one "target" type +// should be set. +type ResourceMetricSource struct { + // name is the name of the resource in question. + Name v1.ResourceName `json:"name" protobuf:"bytes,1,name=name"` + // target specifies the target value for the given metric + Target MetricTarget `json:"target" protobuf:"bytes,2,name=target"` +} + +// ExternalMetricSource indicates how to scale on a metric not associated with +// any Kubernetes object (for example length of queue in cloud +// messaging service, or QPS from loadbalancer running outside of cluster). +type ExternalMetricSource struct { + // metric identifies the target metric by name and selector + Metric MetricIdentifier `json:"metric" protobuf:"bytes,1,name=metric"` + // target specifies the target value for the given metric + Target MetricTarget `json:"target" protobuf:"bytes,2,name=target"` +} + +// MetricIdentifier defines the name and optionally selector for a metric +type MetricIdentifier struct { + // name is the name of the given metric + Name string `json:"name" protobuf:"bytes,1,name=name"` + // selector is the string-encoded form of a standard kubernetes label selector for the given metric + // When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping. + // When unset, just the metricName will be used to gather metrics. + // +optional + Selector *metav1.LabelSelector `json:"selector,omitempty" protobuf:"bytes,2,name=selector"` +} + +// MetricTarget defines the target value, average value, or average utilization of a specific metric +type MetricTarget struct { + // type represents whether the metric type is Utilization, Value, or AverageValue + Type MetricTargetType `json:"type" protobuf:"bytes,1,name=type"` + // value is the target value of the metric (as a quantity). + // +optional + Value *resource.Quantity `json:"value,omitempty" protobuf:"bytes,2,opt,name=value"` + // averageValue is the target value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + AverageValue *resource.Quantity `json:"averageValue,omitempty" protobuf:"bytes,3,opt,name=averageValue"` + // averageUtilization is the target value of the average of the + // resource metric across all relevant pods, represented as a percentage of + // the requested value of the resource for the pods. + // Currently only valid for Resource metric source type + // +optional + AverageUtilization *int32 `json:"averageUtilization,omitempty" protobuf:"bytes,4,opt,name=averageUtilization"` +} + +// MetricTargetType specifies the type of metric being targeted, and should be either +// "Value", "AverageValue", or "Utilization" +type MetricTargetType string + +var ( + // UtilizationMetricType declares a MetricTarget is an AverageUtilization value + UtilizationMetricType MetricTargetType = "Utilization" + // ValueMetricType declares a MetricTarget is a raw value + ValueMetricType MetricTargetType = "Value" + // AverageValueMetricType declares a MetricTarget is an + AverageValueMetricType MetricTargetType = "AverageValue" +) + +// HorizontalPodAutoscalerStatus describes the current status of a horizontal pod autoscaler. +type HorizontalPodAutoscalerStatus struct { + // observedGeneration is the most recent generation observed by this autoscaler. + // +optional + ObservedGeneration *int64 `json:"observedGeneration,omitempty" protobuf:"varint,1,opt,name=observedGeneration"` + + // lastScaleTime is the last time the HorizontalPodAutoscaler scaled the number of pods, + // used by the autoscaler to control how often the number of pods is changed. + // +optional + LastScaleTime *metav1.Time `json:"lastScaleTime,omitempty" protobuf:"bytes,2,opt,name=lastScaleTime"` + + // currentReplicas is current number of replicas of pods managed by this autoscaler, + // as last seen by the autoscaler. + CurrentReplicas int32 `json:"currentReplicas" protobuf:"varint,3,opt,name=currentReplicas"` + + // desiredReplicas is the desired number of replicas of pods managed by this autoscaler, + // as last calculated by the autoscaler. + DesiredReplicas int32 `json:"desiredReplicas" protobuf:"varint,4,opt,name=desiredReplicas"` + + // currentMetrics is the last read state of the metrics used by this autoscaler. + // +optional + CurrentMetrics []MetricStatus `json:"currentMetrics" protobuf:"bytes,5,rep,name=currentMetrics"` + + // conditions is the set of conditions required for this autoscaler to scale its target, + // and indicates whether or not those conditions are met. + Conditions []HorizontalPodAutoscalerCondition `json:"conditions" protobuf:"bytes,6,rep,name=conditions"` +} + +// HorizontalPodAutoscalerConditionType are the valid conditions of +// a HorizontalPodAutoscaler. +type HorizontalPodAutoscalerConditionType string + +var ( + // ScalingActive indicates that the HPA controller is able to scale if necessary: + // it's correctly configured, can fetch the desired metrics, and isn't disabled. + ScalingActive HorizontalPodAutoscalerConditionType = "ScalingActive" + // AbleToScale indicates a lack of transient issues which prevent scaling from occurring, + // such as being in a backoff window, or being unable to access/update the target scale. + AbleToScale HorizontalPodAutoscalerConditionType = "AbleToScale" + // ScalingLimited indicates that the calculated scale based on metrics would be above or + // below the range for the HPA, and has thus been capped. + ScalingLimited HorizontalPodAutoscalerConditionType = "ScalingLimited" +) + +// HorizontalPodAutoscalerCondition describes the state of +// a HorizontalPodAutoscaler at a certain point. +type HorizontalPodAutoscalerCondition struct { + // type describes the current condition + Type HorizontalPodAutoscalerConditionType `json:"type" protobuf:"bytes,1,name=type"` + // status is the status of the condition (True, False, Unknown) + Status v1.ConditionStatus `json:"status" protobuf:"bytes,2,name=status"` + // lastTransitionTime is the last time the condition transitioned from + // one status to another + // +optional + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,3,opt,name=lastTransitionTime"` + // reason is the reason for the condition's last transition. + // +optional + Reason string `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"` + // message is a human-readable explanation containing details about + // the transition + // +optional + Message string `json:"message,omitempty" protobuf:"bytes,5,opt,name=message"` +} + +// MetricStatus describes the last-read state of a single metric. +type MetricStatus struct { + // type is the type of metric source. It will be one of "Object", + // "Pods" or "Resource", each corresponds to a matching field in the object. + Type MetricSourceType `json:"type" protobuf:"bytes,1,name=type"` + + // object refers to a metric describing a single kubernetes object + // (for example, hits-per-second on an Ingress object). + // +optional + Object *ObjectMetricStatus `json:"object,omitempty" protobuf:"bytes,2,opt,name=object"` + // pods refers to a metric describing each pod in the current scale target + // (for example, transactions-processed-per-second). The values will be + // averaged together before being compared to the target value. + // +optional + Pods *PodsMetricStatus `json:"pods,omitempty" protobuf:"bytes,3,opt,name=pods"` + // resource refers to a resource metric (such as those specified in + // requests and limits) known to Kubernetes describing each pod in the + // current scale target (e.g. CPU or memory). Such metrics are built in to + // Kubernetes, and have special scaling options on top of those available + // to normal per-pod metrics using the "pods" source. + // +optional + Resource *ResourceMetricStatus `json:"resource,omitempty" protobuf:"bytes,4,opt,name=resource"` + // external refers to a global metric that is not associated + // with any Kubernetes object. It allows autoscaling based on information + // coming from components running outside of cluster + // (for example length of queue in cloud messaging service, or + // QPS from loadbalancer running outside of cluster). + // +optional + External *ExternalMetricStatus `json:"external,omitempty" protobuf:"bytes,5,opt,name=external"` +} + +// ObjectMetricStatus indicates the current value of a metric describing a +// kubernetes object (for example, hits-per-second on an Ingress object). +type ObjectMetricStatus struct { + // metric identifies the target metric by name and selector + Metric MetricIdentifier `json:"metric" protobuf:"bytes,1,name=metric"` + // current contains the current value for the given metric + Current MetricValueStatus `json:"current" protobuf:"bytes,2,name=current"` + + DescribedObject CrossVersionObjectReference `json:"describedObject" protobuf:"bytes,3,name=describedObject"` +} + +// PodsMetricStatus indicates the current value of a metric describing each pod in +// the current scale target (for example, transactions-processed-per-second). +type PodsMetricStatus struct { + // metric identifies the target metric by name and selector + Metric MetricIdentifier `json:"metric" protobuf:"bytes,1,name=metric"` + // current contains the current value for the given metric + Current MetricValueStatus `json:"current" protobuf:"bytes,2,name=current"` +} + +// ResourceMetricStatus indicates the current value of a resource metric known to +// Kubernetes, as specified in requests and limits, describing each pod in the +// current scale target (e.g. CPU or memory). Such metrics are built in to +// Kubernetes, and have special scaling options on top of those available to +// normal per-pod metrics using the "pods" source. +type ResourceMetricStatus struct { + // Name is the name of the resource in question. + Name v1.ResourceName `json:"name" protobuf:"bytes,1,name=name"` + // current contains the current value for the given metric + Current MetricValueStatus `json:"current" protobuf:"bytes,2,name=current"` +} + +// ExternalMetricStatus indicates the current value of a global metric +// not associated with any Kubernetes object. +type ExternalMetricStatus struct { + // metric identifies the target metric by name and selector + Metric MetricIdentifier `json:"metric" protobuf:"bytes,1,name=metric"` + // current contains the current value for the given metric + Current MetricValueStatus `json:"current" protobuf:"bytes,2,name=current"` +} + +// MetricValueStatus holds the current value for a metric +type MetricValueStatus struct { + // value is the current value of the metric (as a quantity). + // +optional + Value *resource.Quantity `json:"value,omitempty" protobuf:"bytes,1,opt,name=value"` + // averageValue is the current value of the average of the + // metric across all relevant pods (as a quantity) + // +optional + AverageValue *resource.Quantity `json:"averageValue,omitempty" protobuf:"bytes,2,opt,name=averageValue"` + // currentAverageUtilization is the current value of the average of the + // resource metric across all relevant pods, represented as a percentage of + // the requested value of the resource for the pods. + // +optional + AverageUtilization *int32 `json:"averageUtilization,omitempty" protobuf:"bytes,3,opt,name=averageUtilization"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// HorizontalPodAutoscalerList is a list of horizontal pod autoscaler objects. +type HorizontalPodAutoscalerList struct { + metav1.TypeMeta `json:",inline"` + // metadata is the standard list metadata. + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // items is the list of horizontal pod autoscaler objects. + Items []HorizontalPodAutoscaler `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go b/vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go new file mode 100644 index 00000000..996dc184 --- /dev/null +++ b/vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go @@ -0,0 +1,240 @@ +/* +Copyright The Kubernetes Authors. + +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 v2beta2 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_CrossVersionObjectReference = map[string]string{ + "": "CrossVersionObjectReference contains enough information to let you identify the referred resource.", + "kind": "Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds\"", + "name": "Name of the referent; More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "apiVersion": "API version of the referent", +} + +func (CrossVersionObjectReference) SwaggerDoc() map[string]string { + return map_CrossVersionObjectReference +} + +var map_ExternalMetricSource = map[string]string{ + "": "ExternalMetricSource indicates how to scale on a metric not associated with any Kubernetes object (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster).", + "metric": "metric identifies the target metric by name and selector", + "target": "target specifies the target value for the given metric", +} + +func (ExternalMetricSource) SwaggerDoc() map[string]string { + return map_ExternalMetricSource +} + +var map_ExternalMetricStatus = map[string]string{ + "": "ExternalMetricStatus indicates the current value of a global metric not associated with any Kubernetes object.", + "metric": "metric identifies the target metric by name and selector", + "current": "current contains the current value for the given metric", +} + +func (ExternalMetricStatus) SwaggerDoc() map[string]string { + return map_ExternalMetricStatus +} + +var map_HorizontalPodAutoscaler = map[string]string{ + "": "HorizontalPodAutoscaler is the configuration for a horizontal pod autoscaler, which automatically manages the replica count of any resource implementing the scale subresource based on the metrics specified.", + "metadata": "metadata is the standard object metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "spec": "spec is the specification for the behaviour of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status.", + "status": "status is the current information about the autoscaler.", +} + +func (HorizontalPodAutoscaler) SwaggerDoc() map[string]string { + return map_HorizontalPodAutoscaler +} + +var map_HorizontalPodAutoscalerCondition = map[string]string{ + "": "HorizontalPodAutoscalerCondition describes the state of a HorizontalPodAutoscaler at a certain point.", + "type": "type describes the current condition", + "status": "status is the status of the condition (True, False, Unknown)", + "lastTransitionTime": "lastTransitionTime is the last time the condition transitioned from one status to another", + "reason": "reason is the reason for the condition's last transition.", + "message": "message is a human-readable explanation containing details about the transition", +} + +func (HorizontalPodAutoscalerCondition) SwaggerDoc() map[string]string { + return map_HorizontalPodAutoscalerCondition +} + +var map_HorizontalPodAutoscalerList = map[string]string{ + "": "HorizontalPodAutoscalerList is a list of horizontal pod autoscaler objects.", + "metadata": "metadata is the standard list metadata.", + "items": "items is the list of horizontal pod autoscaler objects.", +} + +func (HorizontalPodAutoscalerList) SwaggerDoc() map[string]string { + return map_HorizontalPodAutoscalerList +} + +var map_HorizontalPodAutoscalerSpec = map[string]string{ + "": "HorizontalPodAutoscalerSpec describes the desired functionality of the HorizontalPodAutoscaler.", + "scaleTargetRef": "scaleTargetRef points to the target resource to scale, and is used to the pods for which metrics should be collected, as well as to actually change the replica count.", + "minReplicas": "minReplicas is the lower limit for the number of replicas to which the autoscaler can scale down. It defaults to 1 pod.", + "maxReplicas": "maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up. It cannot be less that minReplicas.", + "metrics": "metrics contains the specifications for which to use to calculate the desired replica count (the maximum replica count across all metrics will be used). The desired replica count is calculated multiplying the ratio between the target value and the current value by the current number of pods. Ergo, metrics used must decrease as the pod count is increased, and vice-versa. See the individual metric source types for more information about how each type of metric must respond. If not set, the default metric will be set to 80% average CPU utilization.", +} + +func (HorizontalPodAutoscalerSpec) SwaggerDoc() map[string]string { + return map_HorizontalPodAutoscalerSpec +} + +var map_HorizontalPodAutoscalerStatus = map[string]string{ + "": "HorizontalPodAutoscalerStatus describes the current status of a horizontal pod autoscaler.", + "observedGeneration": "observedGeneration is the most recent generation observed by this autoscaler.", + "lastScaleTime": "lastScaleTime is the last time the HorizontalPodAutoscaler scaled the number of pods, used by the autoscaler to control how often the number of pods is changed.", + "currentReplicas": "currentReplicas is current number of replicas of pods managed by this autoscaler, as last seen by the autoscaler.", + "desiredReplicas": "desiredReplicas is the desired number of replicas of pods managed by this autoscaler, as last calculated by the autoscaler.", + "currentMetrics": "currentMetrics is the last read state of the metrics used by this autoscaler.", + "conditions": "conditions is the set of conditions required for this autoscaler to scale its target, and indicates whether or not those conditions are met.", +} + +func (HorizontalPodAutoscalerStatus) SwaggerDoc() map[string]string { + return map_HorizontalPodAutoscalerStatus +} + +var map_MetricIdentifier = map[string]string{ + "": "MetricIdentifier defines the name and optionally selector for a metric", + "name": "name is the name of the given metric", + "selector": "selector is the string-encoded form of a standard kubernetes label selector for the given metric When set, it is passed as an additional parameter to the metrics server for more specific metrics scoping. When unset, just the metricName will be used to gather metrics.", +} + +func (MetricIdentifier) SwaggerDoc() map[string]string { + return map_MetricIdentifier +} + +var map_MetricSpec = map[string]string{ + "": "MetricSpec specifies how to scale based on a single metric (only `type` and one other matching field should be set at once).", + "type": "type is the type of metric source. It should be one of \"Object\", \"Pods\" or \"Resource\", each mapping to a matching field in the object.", + "object": "object refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object).", + "pods": "pods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", + "resource": "resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source.", + "external": "external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster).", +} + +func (MetricSpec) SwaggerDoc() map[string]string { + return map_MetricSpec +} + +var map_MetricStatus = map[string]string{ + "": "MetricStatus describes the last-read state of a single metric.", + "type": "type is the type of metric source. It will be one of \"Object\", \"Pods\" or \"Resource\", each corresponds to a matching field in the object.", + "object": "object refers to a metric describing a single kubernetes object (for example, hits-per-second on an Ingress object).", + "pods": "pods refers to a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", + "resource": "resource refers to a resource metric (such as those specified in requests and limits) known to Kubernetes describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source.", + "external": "external refers to a global metric that is not associated with any Kubernetes object. It allows autoscaling based on information coming from components running outside of cluster (for example length of queue in cloud messaging service, or QPS from loadbalancer running outside of cluster).", +} + +func (MetricStatus) SwaggerDoc() map[string]string { + return map_MetricStatus +} + +var map_MetricTarget = map[string]string{ + "": "MetricTarget defines the target value, average value, or average utilization of a specific metric", + "type": "type represents whether the metric type is Utilization, Value, or AverageValue", + "value": "value is the target value of the metric (as a quantity).", + "averageValue": "averageValue is the target value of the average of the metric across all relevant pods (as a quantity)", + "averageUtilization": "averageUtilization is the target value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods. Currently only valid for Resource metric source type", +} + +func (MetricTarget) SwaggerDoc() map[string]string { + return map_MetricTarget +} + +var map_MetricValueStatus = map[string]string{ + "": "MetricValueStatus holds the current value for a metric", + "value": "value is the current value of the metric (as a quantity).", + "averageValue": "averageValue is the current value of the average of the metric across all relevant pods (as a quantity)", + "averageUtilization": "currentAverageUtilization is the current value of the average of the resource metric across all relevant pods, represented as a percentage of the requested value of the resource for the pods.", +} + +func (MetricValueStatus) SwaggerDoc() map[string]string { + return map_MetricValueStatus +} + +var map_ObjectMetricSource = map[string]string{ + "": "ObjectMetricSource indicates how to scale on a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "target": "target specifies the target value for the given metric", + "metric": "metric identifies the target metric by name and selector", +} + +func (ObjectMetricSource) SwaggerDoc() map[string]string { + return map_ObjectMetricSource +} + +var map_ObjectMetricStatus = map[string]string{ + "": "ObjectMetricStatus indicates the current value of a metric describing a kubernetes object (for example, hits-per-second on an Ingress object).", + "metric": "metric identifies the target metric by name and selector", + "current": "current contains the current value for the given metric", +} + +func (ObjectMetricStatus) SwaggerDoc() map[string]string { + return map_ObjectMetricStatus +} + +var map_PodsMetricSource = map[string]string{ + "": "PodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", + "metric": "metric identifies the target metric by name and selector", + "target": "target specifies the target value for the given metric", +} + +func (PodsMetricSource) SwaggerDoc() map[string]string { + return map_PodsMetricSource +} + +var map_PodsMetricStatus = map[string]string{ + "": "PodsMetricStatus indicates the current value of a metric describing each pod in the current scale target (for example, transactions-processed-per-second).", + "metric": "metric identifies the target metric by name and selector", + "current": "current contains the current value for the given metric", +} + +func (PodsMetricStatus) SwaggerDoc() map[string]string { + return map_PodsMetricStatus +} + +var map_ResourceMetricSource = map[string]string{ + "": "ResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. Only one \"target\" type should be set.", + "name": "name is the name of the resource in question.", + "target": "target specifies the target value for the given metric", +} + +func (ResourceMetricSource) SwaggerDoc() map[string]string { + return map_ResourceMetricSource +} + +var map_ResourceMetricStatus = map[string]string{ + "": "ResourceMetricStatus indicates the current value of a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source.", + "name": "Name is the name of the resource in question.", + "current": "current contains the current value for the given metric", +} + +func (ResourceMetricStatus) SwaggerDoc() map[string]string { + return map_ResourceMetricStatus +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go b/vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go new file mode 100644 index 00000000..a6a95653 --- /dev/null +++ b/vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go @@ -0,0 +1,487 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CrossVersionObjectReference) DeepCopyInto(out *CrossVersionObjectReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CrossVersionObjectReference. +func (in *CrossVersionObjectReference) DeepCopy() *CrossVersionObjectReference { + if in == nil { + return nil + } + out := new(CrossVersionObjectReference) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalMetricSource) DeepCopyInto(out *ExternalMetricSource) { + *out = *in + in.Metric.DeepCopyInto(&out.Metric) + in.Target.DeepCopyInto(&out.Target) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalMetricSource. +func (in *ExternalMetricSource) DeepCopy() *ExternalMetricSource { + if in == nil { + return nil + } + out := new(ExternalMetricSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalMetricStatus) DeepCopyInto(out *ExternalMetricStatus) { + *out = *in + in.Metric.DeepCopyInto(&out.Metric) + in.Current.DeepCopyInto(&out.Current) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalMetricStatus. +func (in *ExternalMetricStatus) DeepCopy() *ExternalMetricStatus { + if in == nil { + return nil + } + out := new(ExternalMetricStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HorizontalPodAutoscaler) DeepCopyInto(out *HorizontalPodAutoscaler) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HorizontalPodAutoscaler. +func (in *HorizontalPodAutoscaler) DeepCopy() *HorizontalPodAutoscaler { + if in == nil { + return nil + } + out := new(HorizontalPodAutoscaler) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *HorizontalPodAutoscaler) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HorizontalPodAutoscalerCondition) DeepCopyInto(out *HorizontalPodAutoscalerCondition) { + *out = *in + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HorizontalPodAutoscalerCondition. +func (in *HorizontalPodAutoscalerCondition) DeepCopy() *HorizontalPodAutoscalerCondition { + if in == nil { + return nil + } + out := new(HorizontalPodAutoscalerCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HorizontalPodAutoscalerList) DeepCopyInto(out *HorizontalPodAutoscalerList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]HorizontalPodAutoscaler, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HorizontalPodAutoscalerList. +func (in *HorizontalPodAutoscalerList) DeepCopy() *HorizontalPodAutoscalerList { + if in == nil { + return nil + } + out := new(HorizontalPodAutoscalerList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *HorizontalPodAutoscalerList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HorizontalPodAutoscalerSpec) DeepCopyInto(out *HorizontalPodAutoscalerSpec) { + *out = *in + out.ScaleTargetRef = in.ScaleTargetRef + if in.MinReplicas != nil { + in, out := &in.MinReplicas, &out.MinReplicas + *out = new(int32) + **out = **in + } + if in.Metrics != nil { + in, out := &in.Metrics, &out.Metrics + *out = make([]MetricSpec, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HorizontalPodAutoscalerSpec. +func (in *HorizontalPodAutoscalerSpec) DeepCopy() *HorizontalPodAutoscalerSpec { + if in == nil { + return nil + } + out := new(HorizontalPodAutoscalerSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HorizontalPodAutoscalerStatus) DeepCopyInto(out *HorizontalPodAutoscalerStatus) { + *out = *in + if in.ObservedGeneration != nil { + in, out := &in.ObservedGeneration, &out.ObservedGeneration + *out = new(int64) + **out = **in + } + if in.LastScaleTime != nil { + in, out := &in.LastScaleTime, &out.LastScaleTime + *out = (*in).DeepCopy() + } + if in.CurrentMetrics != nil { + in, out := &in.CurrentMetrics, &out.CurrentMetrics + *out = make([]MetricStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]HorizontalPodAutoscalerCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HorizontalPodAutoscalerStatus. +func (in *HorizontalPodAutoscalerStatus) DeepCopy() *HorizontalPodAutoscalerStatus { + if in == nil { + return nil + } + out := new(HorizontalPodAutoscalerStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricIdentifier) DeepCopyInto(out *MetricIdentifier) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricIdentifier. +func (in *MetricIdentifier) DeepCopy() *MetricIdentifier { + if in == nil { + return nil + } + out := new(MetricIdentifier) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricSpec) DeepCopyInto(out *MetricSpec) { + *out = *in + if in.Object != nil { + in, out := &in.Object, &out.Object + *out = new(ObjectMetricSource) + (*in).DeepCopyInto(*out) + } + if in.Pods != nil { + in, out := &in.Pods, &out.Pods + *out = new(PodsMetricSource) + (*in).DeepCopyInto(*out) + } + if in.Resource != nil { + in, out := &in.Resource, &out.Resource + *out = new(ResourceMetricSource) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalMetricSource) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricSpec. +func (in *MetricSpec) DeepCopy() *MetricSpec { + if in == nil { + return nil + } + out := new(MetricSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricStatus) DeepCopyInto(out *MetricStatus) { + *out = *in + if in.Object != nil { + in, out := &in.Object, &out.Object + *out = new(ObjectMetricStatus) + (*in).DeepCopyInto(*out) + } + if in.Pods != nil { + in, out := &in.Pods, &out.Pods + *out = new(PodsMetricStatus) + (*in).DeepCopyInto(*out) + } + if in.Resource != nil { + in, out := &in.Resource, &out.Resource + *out = new(ResourceMetricStatus) + (*in).DeepCopyInto(*out) + } + if in.External != nil { + in, out := &in.External, &out.External + *out = new(ExternalMetricStatus) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricStatus. +func (in *MetricStatus) DeepCopy() *MetricStatus { + if in == nil { + return nil + } + out := new(MetricStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricTarget) DeepCopyInto(out *MetricTarget) { + *out = *in + if in.Value != nil { + in, out := &in.Value, &out.Value + x := (*in).DeepCopy() + *out = &x + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } + if in.AverageUtilization != nil { + in, out := &in.AverageUtilization, &out.AverageUtilization + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricTarget. +func (in *MetricTarget) DeepCopy() *MetricTarget { + if in == nil { + return nil + } + out := new(MetricTarget) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricValueStatus) DeepCopyInto(out *MetricValueStatus) { + *out = *in + if in.Value != nil { + in, out := &in.Value, &out.Value + x := (*in).DeepCopy() + *out = &x + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } + if in.AverageUtilization != nil { + in, out := &in.AverageUtilization, &out.AverageUtilization + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricValueStatus. +func (in *MetricValueStatus) DeepCopy() *MetricValueStatus { + if in == nil { + return nil + } + out := new(MetricValueStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ObjectMetricSource) DeepCopyInto(out *ObjectMetricSource) { + *out = *in + out.DescribedObject = in.DescribedObject + in.Target.DeepCopyInto(&out.Target) + in.Metric.DeepCopyInto(&out.Metric) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectMetricSource. +func (in *ObjectMetricSource) DeepCopy() *ObjectMetricSource { + if in == nil { + return nil + } + out := new(ObjectMetricSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ObjectMetricStatus) DeepCopyInto(out *ObjectMetricStatus) { + *out = *in + in.Metric.DeepCopyInto(&out.Metric) + in.Current.DeepCopyInto(&out.Current) + out.DescribedObject = in.DescribedObject + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectMetricStatus. +func (in *ObjectMetricStatus) DeepCopy() *ObjectMetricStatus { + if in == nil { + return nil + } + out := new(ObjectMetricStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodsMetricSource) DeepCopyInto(out *PodsMetricSource) { + *out = *in + in.Metric.DeepCopyInto(&out.Metric) + in.Target.DeepCopyInto(&out.Target) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodsMetricSource. +func (in *PodsMetricSource) DeepCopy() *PodsMetricSource { + if in == nil { + return nil + } + out := new(PodsMetricSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodsMetricStatus) DeepCopyInto(out *PodsMetricStatus) { + *out = *in + in.Metric.DeepCopyInto(&out.Metric) + in.Current.DeepCopyInto(&out.Current) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodsMetricStatus. +func (in *PodsMetricStatus) DeepCopy() *PodsMetricStatus { + if in == nil { + return nil + } + out := new(PodsMetricStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ResourceMetricSource) DeepCopyInto(out *ResourceMetricSource) { + *out = *in + in.Target.DeepCopyInto(&out.Target) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceMetricSource. +func (in *ResourceMetricSource) DeepCopy() *ResourceMetricSource { + if in == nil { + return nil + } + out := new(ResourceMetricSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ResourceMetricStatus) DeepCopyInto(out *ResourceMetricStatus) { + *out = *in + in.Current.DeepCopyInto(&out.Current) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceMetricStatus. +func (in *ResourceMetricStatus) DeepCopy() *ResourceMetricStatus { + if in == nil { + return nil + } + out := new(ResourceMetricStatus) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/batch/v1/BUILD b/vendor/k8s.io/api/batch/v1/BUILD index a7ca7a23..29e2d2a2 100644 --- a/vendor/k8s.io/api/batch/v1/BUILD +++ b/vendor/k8s.io/api/batch/v1/BUILD @@ -15,13 +15,14 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/batch/v1", importpath = "k8s.io/api/batch/v1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -37,9 +38,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/batch/v1/generated.pb.go b/vendor/k8s.io/api/batch/v1/generated.pb.go index 176567ac..097a6ff2 100644 --- a/vendor/k8s.io/api/batch/v1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v1/generated.pb.go @@ -276,6 +276,11 @@ func (m *JobSpec) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(*m.BackoffLimit)) } + if m.TTLSecondsAfterFinished != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.TTLSecondsAfterFinished)) + } return i, nil } @@ -433,6 +438,9 @@ func (m *JobSpec) Size() (n int) { if m.BackoffLimit != nil { n += 1 + sovGenerated(uint64(*m.BackoffLimit)) } + if m.TTLSecondsAfterFinished != nil { + n += 1 + sovGenerated(uint64(*m.TTLSecondsAfterFinished)) + } return n } @@ -522,6 +530,7 @@ func (this *JobSpec) String() string { `ManualSelector:` + valueToStringGenerated(this.ManualSelector) + `,`, `Template:` + strings.Replace(strings.Replace(this.Template.String(), "PodTemplateSpec", "k8s_io_api_core_v1.PodTemplateSpec", 1), `&`, ``, 1) + `,`, `BackoffLimit:` + valueToStringGenerated(this.BackoffLimit) + `,`, + `TTLSecondsAfterFinished:` + valueToStringGenerated(this.TTLSecondsAfterFinished) + `,`, `}`, }, "") return s @@ -1219,6 +1228,26 @@ func (m *JobSpec) Unmarshal(dAtA []byte) error { } } m.BackoffLimit = &v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TTLSecondsAfterFinished", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.TTLSecondsAfterFinished = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -1554,62 +1583,64 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 907 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x41, 0x6f, 0xe3, 0x44, - 0x18, 0x8d, 0x9b, 0xa6, 0x4d, 0x26, 0x69, 0x77, 0x19, 0x54, 0x29, 0x54, 0xc8, 0x59, 0x82, 0x84, - 0x0a, 0x12, 0x36, 0xe9, 0x56, 0x08, 0x21, 0x40, 0xc2, 0x45, 0x2b, 0x51, 0xa5, 0xda, 0x32, 0x29, - 0x42, 0x42, 0x20, 0x31, 0xb6, 0xbf, 0xa4, 0x43, 0x6c, 0x8f, 0xe5, 0x99, 0x44, 0xea, 0x8d, 0x9f, - 0xc0, 0x8f, 0x40, 0xfc, 0x14, 0xd4, 0xe3, 0x1e, 0xf7, 0x14, 0x51, 0xc3, 0x9d, 0xfb, 0x9e, 0xd0, - 0x8c, 0x1d, 0xdb, 0x69, 0x13, 0xd1, 0xe5, 0x66, 0xbf, 0x79, 0xef, 0x7d, 0x33, 0xf3, 0xbd, 0xf9, - 0xd0, 0x67, 0xd3, 0x4f, 0x84, 0xc5, 0xb8, 0x3d, 0x9d, 0xb9, 0x90, 0x44, 0x20, 0x41, 0xd8, 0x73, - 0x88, 0x7c, 0x9e, 0xd8, 0xf9, 0x02, 0x8d, 0x99, 0xed, 0x52, 0xe9, 0x5d, 0xd9, 0xf3, 0x81, 0x3d, - 0x81, 0x08, 0x12, 0x2a, 0xc1, 0xb7, 0xe2, 0x84, 0x4b, 0x8e, 0xdf, 0xcc, 0x48, 0x16, 0x8d, 0x99, - 0xa5, 0x49, 0xd6, 0x7c, 0x70, 0xf8, 0xe1, 0x84, 0xc9, 0xab, 0x99, 0x6b, 0x79, 0x3c, 0xb4, 0x27, - 0x7c, 0xc2, 0x6d, 0xcd, 0x75, 0x67, 0x63, 0xfd, 0xa7, 0x7f, 0xf4, 0x57, 0xe6, 0x71, 0xd8, 0xaf, - 0x14, 0xf2, 0x78, 0x02, 0x6b, 0xea, 0x1c, 0x9e, 0x94, 0x9c, 0x90, 0x7a, 0x57, 0x2c, 0x82, 0xe4, - 0xda, 0x8e, 0xa7, 0x13, 0x05, 0x08, 0x3b, 0x04, 0x49, 0xd7, 0xa9, 0xec, 0x4d, 0xaa, 0x64, 0x16, - 0x49, 0x16, 0xc2, 0x3d, 0xc1, 0xc7, 0xff, 0x25, 0x10, 0xde, 0x15, 0x84, 0xf4, 0x9e, 0xee, 0xe9, - 0x26, 0xdd, 0x4c, 0xb2, 0xc0, 0x66, 0x91, 0x14, 0x32, 0xb9, 0x2b, 0xea, 0xff, 0x63, 0xa0, 0xfa, - 0x19, 0x77, 0xf1, 0x4f, 0xa8, 0xa9, 0x0e, 0xe0, 0x53, 0x49, 0xbb, 0xc6, 0x13, 0xe3, 0xa8, 0x7d, - 0xfc, 0x91, 0x55, 0x5e, 0x6b, 0xe1, 0x67, 0xc5, 0xd3, 0x89, 0x02, 0x84, 0xa5, 0xd8, 0xd6, 0x7c, - 0x60, 0x3d, 0x77, 0x7f, 0x06, 0x4f, 0x9e, 0x83, 0xa4, 0x0e, 0xbe, 0x59, 0xf4, 0x6a, 0xe9, 0xa2, - 0x87, 0x4a, 0x8c, 0x14, 0xae, 0xf8, 0x0b, 0xb4, 0x2d, 0x62, 0xf0, 0xba, 0x5b, 0xda, 0xfd, 0x6d, - 0x6b, 0x4d, 0xd3, 0xac, 0x33, 0xee, 0x8e, 0x62, 0xf0, 0x9c, 0x4e, 0xee, 0xb4, 0xad, 0xfe, 0x88, - 0xd6, 0xe1, 0x67, 0x68, 0x47, 0x48, 0x2a, 0x67, 0xa2, 0x5b, 0xd7, 0x0e, 0xe6, 0x46, 0x07, 0xcd, - 0x72, 0xf6, 0x73, 0x8f, 0x9d, 0xec, 0x9f, 0xe4, 0xea, 0xfe, 0x1f, 0x75, 0xd4, 0x39, 0xe3, 0xee, - 0x29, 0x8f, 0x7c, 0x26, 0x19, 0x8f, 0xf0, 0x09, 0xda, 0x96, 0xd7, 0x31, 0xe8, 0x63, 0xb7, 0x9c, - 0x27, 0xcb, 0xd2, 0x97, 0xd7, 0x31, 0xbc, 0x5a, 0xf4, 0x1e, 0x57, 0xb9, 0x0a, 0x23, 0x9a, 0x8d, - 0x87, 0xc5, 0x76, 0xb6, 0xb4, 0xee, 0x64, 0xb5, 0xdc, 0xab, 0x45, 0x6f, 0x4d, 0xa4, 0xac, 0xc2, - 0x69, 0x75, 0x53, 0x78, 0x82, 0xf6, 0x02, 0x2a, 0xe4, 0x45, 0xc2, 0x5d, 0xb8, 0x64, 0x21, 0xe4, - 0x67, 0xfc, 0xe0, 0x61, 0x3d, 0x50, 0x0a, 0xe7, 0x20, 0xdf, 0xc0, 0xde, 0xb0, 0x6a, 0x44, 0x56, - 0x7d, 0xf1, 0x1c, 0x61, 0x05, 0x5c, 0x26, 0x34, 0x12, 0xd9, 0x91, 0x54, 0xb5, 0xed, 0xd7, 0xae, - 0x76, 0x98, 0x57, 0xc3, 0xc3, 0x7b, 0x6e, 0x64, 0x4d, 0x05, 0xfc, 0x1e, 0xda, 0x49, 0x80, 0x0a, - 0x1e, 0x75, 0x1b, 0xfa, 0xba, 0x8a, 0xee, 0x10, 0x8d, 0x92, 0x7c, 0x15, 0xbf, 0x8f, 0x76, 0x43, - 0x10, 0x82, 0x4e, 0xa0, 0xbb, 0xa3, 0x89, 0x8f, 0x72, 0xe2, 0xee, 0x79, 0x06, 0x93, 0xe5, 0x7a, - 0xff, 0x77, 0x03, 0xed, 0x9e, 0x71, 0x77, 0xc8, 0x84, 0xc4, 0x3f, 0xdc, 0x8b, 0xaf, 0xf5, 0xb0, - 0xc3, 0x28, 0xb5, 0x0e, 0xef, 0xe3, 0xbc, 0x4e, 0x73, 0x89, 0x54, 0xa2, 0xfb, 0x39, 0x6a, 0x30, - 0x09, 0xa1, 0x6a, 0x75, 0xfd, 0xa8, 0x7d, 0xdc, 0xdd, 0x94, 0x3c, 0x67, 0x2f, 0x37, 0x69, 0x7c, - 0xad, 0xe8, 0x24, 0x53, 0xf5, 0xff, 0xae, 0xeb, 0x8d, 0xaa, 0x2c, 0xe3, 0x01, 0x6a, 0xc7, 0x34, - 0xa1, 0x41, 0x00, 0x01, 0x13, 0xa1, 0xde, 0x6b, 0xc3, 0x79, 0x94, 0x2e, 0x7a, 0xed, 0x8b, 0x12, - 0x26, 0x55, 0x8e, 0x92, 0x78, 0x3c, 0x8c, 0x03, 0x50, 0x97, 0x99, 0xc5, 0x2d, 0x97, 0x9c, 0x96, - 0x30, 0xa9, 0x72, 0xf0, 0x73, 0x74, 0x40, 0x3d, 0xc9, 0xe6, 0xf0, 0x15, 0x50, 0x3f, 0x60, 0x11, - 0x8c, 0xc0, 0xe3, 0x91, 0x9f, 0x3d, 0x9d, 0xba, 0xf3, 0x56, 0xba, 0xe8, 0x1d, 0x7c, 0xb9, 0x8e, - 0x40, 0xd6, 0xeb, 0xf0, 0x8f, 0xa8, 0x29, 0x20, 0x00, 0x4f, 0xf2, 0x24, 0x0f, 0xcb, 0xd3, 0x07, - 0xde, 0x2f, 0x75, 0x21, 0x18, 0xe5, 0x52, 0xa7, 0xa3, 0x2e, 0x78, 0xf9, 0x47, 0x0a, 0x4b, 0xfc, - 0x29, 0xda, 0x0f, 0x69, 0x34, 0xa3, 0x05, 0x53, 0xa7, 0xa4, 0xe9, 0xe0, 0x74, 0xd1, 0xdb, 0x3f, - 0x5f, 0x59, 0x21, 0x77, 0x98, 0xf8, 0x1b, 0xd4, 0x94, 0x10, 0xc6, 0x01, 0x95, 0x59, 0x64, 0xda, - 0xc7, 0xef, 0x56, 0xfb, 0xa3, 0x5e, 0x9e, 0xda, 0xc8, 0x05, 0xf7, 0x2f, 0x73, 0x9a, 0x1e, 0x31, - 0x45, 0xbf, 0x97, 0x28, 0x29, 0x6c, 0xf0, 0x09, 0xea, 0xb8, 0xd4, 0x9b, 0xf2, 0xf1, 0x78, 0xc8, - 0x42, 0x26, 0xbb, 0xbb, 0xfa, 0xca, 0x1f, 0xa7, 0x8b, 0x5e, 0xc7, 0xa9, 0xe0, 0x64, 0x85, 0xd5, - 0xff, 0xad, 0x8e, 0x5a, 0xc5, 0xf8, 0xc1, 0xdf, 0x22, 0xe4, 0x2d, 0x1f, 0xbb, 0xe8, 0x1a, 0x3a, - 0x38, 0xef, 0x6c, 0x0a, 0x4e, 0x31, 0x16, 0xca, 0x19, 0x5a, 0x40, 0x82, 0x54, 0x8c, 0xf0, 0x77, - 0xa8, 0x25, 0x24, 0x4d, 0xa4, 0x7e, 0xb6, 0x5b, 0xaf, 0xfd, 0x6c, 0xf7, 0xd2, 0x45, 0xaf, 0x35, - 0x5a, 0x1a, 0x90, 0xd2, 0x0b, 0x8f, 0xd1, 0x7e, 0x99, 0xa0, 0xff, 0x39, 0x82, 0x74, 0xbb, 0x4e, - 0x57, 0x5c, 0xc8, 0x1d, 0x57, 0x35, 0x08, 0xb2, 0x88, 0xe9, 0x1c, 0x35, 0xca, 0x41, 0x90, 0xe5, - 0x91, 0xe4, 0xab, 0xd8, 0x46, 0x2d, 0x31, 0xf3, 0x3c, 0x00, 0x1f, 0x7c, 0x9d, 0x86, 0x86, 0xf3, - 0x46, 0x4e, 0x6d, 0x8d, 0x96, 0x0b, 0xa4, 0xe4, 0x28, 0xe3, 0x31, 0x65, 0x01, 0xf8, 0x3a, 0x05, - 0x15, 0xe3, 0x67, 0x1a, 0x25, 0xf9, 0xaa, 0x73, 0x74, 0x73, 0x6b, 0xd6, 0x5e, 0xdc, 0x9a, 0xb5, - 0x97, 0xb7, 0x66, 0xed, 0x97, 0xd4, 0x34, 0x6e, 0x52, 0xd3, 0x78, 0x91, 0x9a, 0xc6, 0xcb, 0xd4, - 0x34, 0xfe, 0x4c, 0x4d, 0xe3, 0xd7, 0xbf, 0xcc, 0xda, 0xf7, 0x5b, 0xf3, 0xc1, 0xbf, 0x01, 0x00, - 0x00, 0xff, 0xff, 0xce, 0x80, 0xf2, 0xbe, 0x96, 0x08, 0x00, 0x00, + // 929 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x5d, 0x6f, 0xe3, 0x44, + 0x14, 0xad, 0x9b, 0xa6, 0x4d, 0xa6, 0x1f, 0x5b, 0x06, 0x55, 0x1b, 0x0a, 0xb2, 0x97, 0x20, 0xa1, + 0x82, 0x84, 0x4d, 0x4b, 0x85, 0x10, 0x02, 0xa4, 0x75, 0x51, 0x25, 0xaa, 0x54, 0x5b, 0x26, 0x59, + 0x21, 0x21, 0x90, 0x18, 0xdb, 0x37, 0x89, 0x89, 0xed, 0xb1, 0x3c, 0x93, 0x48, 0x7d, 0xe3, 0x27, + 0xf0, 0x23, 0x10, 0x7f, 0x82, 0x77, 0xd4, 0xc7, 0x7d, 0xdc, 0x27, 0x8b, 0x9a, 0x1f, 0xc0, 0xfb, + 0x3e, 0xa1, 0x19, 0x3b, 0xb6, 0xd3, 0x26, 0xa2, 0xcb, 0x5b, 0xe6, 0xcc, 0x39, 0xe7, 0x5e, 0xdf, + 0x39, 0xb9, 0xe8, 0x8b, 0xc9, 0x67, 0xdc, 0xf4, 0x99, 0x35, 0x99, 0x3a, 0x90, 0x44, 0x20, 0x80, + 0x5b, 0x33, 0x88, 0x3c, 0x96, 0x58, 0xc5, 0x05, 0x8d, 0x7d, 0xcb, 0xa1, 0xc2, 0x1d, 0x5b, 0xb3, + 0x63, 0x6b, 0x04, 0x11, 0x24, 0x54, 0x80, 0x67, 0xc6, 0x09, 0x13, 0x0c, 0xbf, 0x99, 0x93, 0x4c, + 0x1a, 0xfb, 0xa6, 0x22, 0x99, 0xb3, 0xe3, 0xc3, 0x8f, 0x46, 0xbe, 0x18, 0x4f, 0x1d, 0xd3, 0x65, + 0xa1, 0x35, 0x62, 0x23, 0x66, 0x29, 0xae, 0x33, 0x1d, 0xaa, 0x93, 0x3a, 0xa8, 0x5f, 0xb9, 0xc7, + 0x61, 0xb7, 0x56, 0xc8, 0x65, 0x09, 0x2c, 0xa9, 0x73, 0x78, 0x5a, 0x71, 0x42, 0xea, 0x8e, 0xfd, + 0x08, 0x92, 0x6b, 0x2b, 0x9e, 0x8c, 0x24, 0xc0, 0xad, 0x10, 0x04, 0x5d, 0xa6, 0xb2, 0x56, 0xa9, + 0x92, 0x69, 0x24, 0xfc, 0x10, 0xee, 0x09, 0x3e, 0xfd, 0x2f, 0x01, 0x77, 0xc7, 0x10, 0xd2, 0xbb, + 0xba, 0xee, 0x3f, 0x1a, 0x6a, 0x5c, 0x30, 0x07, 0xff, 0x84, 0x5a, 0xb2, 0x17, 0x8f, 0x0a, 0xda, + 0xd1, 0x9e, 0x68, 0x47, 0xdb, 0x27, 0x1f, 0x9b, 0xd5, 0x84, 0x4a, 0x4b, 0x33, 0x9e, 0x8c, 0x24, + 0xc0, 0x4d, 0xc9, 0x36, 0x67, 0xc7, 0xe6, 0x33, 0xe7, 0x67, 0x70, 0xc5, 0x25, 0x08, 0x6a, 0xe3, + 0x9b, 0xd4, 0x58, 0xcb, 0x52, 0x03, 0x55, 0x18, 0x29, 0x5d, 0xf1, 0x57, 0x68, 0x83, 0xc7, 0xe0, + 0x76, 0xd6, 0x95, 0xfb, 0x3b, 0xe6, 0x92, 0xf9, 0x9b, 0x17, 0xcc, 0xe9, 0xc7, 0xe0, 0xda, 0x3b, + 0x85, 0xd3, 0x86, 0x3c, 0x11, 0xa5, 0xc3, 0xe7, 0x68, 0x93, 0x0b, 0x2a, 0xa6, 0xbc, 0xd3, 0x50, + 0x0e, 0xfa, 0x4a, 0x07, 0xc5, 0xb2, 0xf7, 0x0a, 0x8f, 0xcd, 0xfc, 0x4c, 0x0a, 0x75, 0xf7, 0xcf, + 0x06, 0xda, 0xb9, 0x60, 0xce, 0x19, 0x8b, 0x3c, 0x5f, 0xf8, 0x2c, 0xc2, 0xa7, 0x68, 0x43, 0x5c, + 0xc7, 0xa0, 0x3e, 0xbb, 0x6d, 0x3f, 0x99, 0x97, 0x1e, 0x5c, 0xc7, 0xf0, 0x2a, 0x35, 0xf6, 0xeb, + 0x5c, 0x89, 0x11, 0xc5, 0xc6, 0xbd, 0xb2, 0x9d, 0x75, 0xa5, 0x3b, 0x5d, 0x2c, 0xf7, 0x2a, 0x35, + 0x96, 0xa4, 0xc3, 0x2c, 0x9d, 0x16, 0x9b, 0xc2, 0x23, 0xb4, 0x1b, 0x50, 0x2e, 0xae, 0x12, 0xe6, + 0xc0, 0xc0, 0x0f, 0xa1, 0xf8, 0xc6, 0x0f, 0x1f, 0xf6, 0x06, 0x52, 0x61, 0x1f, 0x14, 0x0d, 0xec, + 0xf6, 0xea, 0x46, 0x64, 0xd1, 0x17, 0xcf, 0x10, 0x96, 0xc0, 0x20, 0xa1, 0x11, 0xcf, 0x3f, 0x49, + 0x56, 0xdb, 0x78, 0xed, 0x6a, 0x87, 0x45, 0x35, 0xdc, 0xbb, 0xe7, 0x46, 0x96, 0x54, 0xc0, 0xef, + 0xa3, 0xcd, 0x04, 0x28, 0x67, 0x51, 0xa7, 0xa9, 0xc6, 0x55, 0xbe, 0x0e, 0x51, 0x28, 0x29, 0x6e, + 0xf1, 0x07, 0x68, 0x2b, 0x04, 0xce, 0xe9, 0x08, 0x3a, 0x9b, 0x8a, 0xf8, 0xa8, 0x20, 0x6e, 0x5d, + 0xe6, 0x30, 0x99, 0xdf, 0x77, 0x7f, 0xd7, 0xd0, 0xd6, 0x05, 0x73, 0x7a, 0x3e, 0x17, 0xf8, 0x87, + 0x7b, 0xf1, 0x35, 0x1f, 0xf6, 0x31, 0x52, 0xad, 0xc2, 0xbb, 0x5f, 0xd4, 0x69, 0xcd, 0x91, 0x5a, + 0x74, 0xbf, 0x44, 0x4d, 0x5f, 0x40, 0x28, 0x9f, 0xba, 0x71, 0xb4, 0x7d, 0xd2, 0x59, 0x95, 0x3c, + 0x7b, 0xb7, 0x30, 0x69, 0x7e, 0x23, 0xe9, 0x24, 0x57, 0x75, 0xff, 0xd8, 0x50, 0x8d, 0xca, 0x2c, + 0xe3, 0x63, 0xb4, 0x1d, 0xd3, 0x84, 0x06, 0x01, 0x04, 0x3e, 0x0f, 0x55, 0xaf, 0x4d, 0xfb, 0x51, + 0x96, 0x1a, 0xdb, 0x57, 0x15, 0x4c, 0xea, 0x1c, 0x29, 0x71, 0x59, 0x18, 0x07, 0x20, 0x87, 0x99, + 0xc7, 0xad, 0x90, 0x9c, 0x55, 0x30, 0xa9, 0x73, 0xf0, 0x33, 0x74, 0x40, 0x5d, 0xe1, 0xcf, 0xe0, + 0x6b, 0xa0, 0x5e, 0xe0, 0x47, 0xd0, 0x07, 0x97, 0x45, 0x5e, 0xfe, 0xd7, 0x69, 0xd8, 0x6f, 0x65, + 0xa9, 0x71, 0xf0, 0x74, 0x19, 0x81, 0x2c, 0xd7, 0xe1, 0x1f, 0x51, 0x8b, 0x43, 0x00, 0xae, 0x60, + 0x49, 0x11, 0x96, 0x4f, 0x1e, 0x38, 0x5f, 0xea, 0x40, 0xd0, 0x2f, 0xa4, 0xf6, 0x8e, 0x1c, 0xf0, + 0xfc, 0x44, 0x4a, 0x4b, 0xfc, 0x39, 0xda, 0x0b, 0x69, 0x34, 0xa5, 0x25, 0x53, 0xa5, 0xa4, 0x65, + 0xe3, 0x2c, 0x35, 0xf6, 0x2e, 0x17, 0x6e, 0xc8, 0x1d, 0x26, 0xfe, 0x16, 0xb5, 0x04, 0x84, 0x71, + 0x40, 0x45, 0x1e, 0x99, 0xed, 0x93, 0xf7, 0xea, 0xef, 0x23, 0xff, 0x79, 0xb2, 0x91, 0x2b, 0xe6, + 0x0d, 0x0a, 0x9a, 0x5a, 0x31, 0xe5, 0x7b, 0xcf, 0x51, 0x52, 0xda, 0xe0, 0x53, 0xb4, 0xe3, 0x50, + 0x77, 0xc2, 0x86, 0xc3, 0x9e, 0x1f, 0xfa, 0xa2, 0xb3, 0xa5, 0x46, 0xbe, 0x9f, 0xa5, 0xc6, 0x8e, + 0x5d, 0xc3, 0xc9, 0x02, 0x0b, 0x3f, 0x47, 0x8f, 0x85, 0x08, 0x8a, 0x89, 0x3d, 0x1d, 0x0a, 0x48, + 0xce, 0xfd, 0xc8, 0xe7, 0x63, 0xf0, 0x3a, 0x2d, 0x65, 0xf0, 0x76, 0x96, 0x1a, 0x8f, 0x07, 0x83, + 0xde, 0x32, 0x0a, 0x59, 0xa5, 0xed, 0xfe, 0xd6, 0x40, 0xed, 0x72, 0xab, 0xe1, 0xe7, 0x08, 0xb9, + 0xf3, 0x1d, 0xc2, 0x3b, 0x9a, 0xca, 0xe3, 0xbb, 0xab, 0xf2, 0x58, 0x6e, 0x9b, 0x6a, 0x35, 0x97, + 0x10, 0x27, 0x35, 0x23, 0xfc, 0x1d, 0x6a, 0x73, 0x41, 0x13, 0xa1, 0xb6, 0xc1, 0xfa, 0x6b, 0x6f, + 0x83, 0xdd, 0x2c, 0x35, 0xda, 0xfd, 0xb9, 0x01, 0xa9, 0xbc, 0xf0, 0x10, 0xed, 0x55, 0xc1, 0xfc, + 0x9f, 0x9b, 0x4d, 0xa5, 0xe0, 0x6c, 0xc1, 0x85, 0xdc, 0x71, 0x95, 0xfb, 0x25, 0x4f, 0xae, 0x8a, + 0x67, 0xb3, 0xda, 0x2f, 0x79, 0xcc, 0x49, 0x71, 0x8b, 0x2d, 0xd4, 0xe6, 0x53, 0xd7, 0x05, 0xf0, + 0xc0, 0x53, 0x21, 0x6b, 0xda, 0x6f, 0x14, 0xd4, 0x76, 0x7f, 0x7e, 0x41, 0x2a, 0x8e, 0x34, 0x1e, + 0x52, 0x3f, 0x00, 0x4f, 0x85, 0xab, 0x66, 0x7c, 0xae, 0x50, 0x52, 0xdc, 0xda, 0x47, 0x37, 0xb7, + 0xfa, 0xda, 0x8b, 0x5b, 0x7d, 0xed, 0xe5, 0xad, 0xbe, 0xf6, 0x4b, 0xa6, 0x6b, 0x37, 0x99, 0xae, + 0xbd, 0xc8, 0x74, 0xed, 0x65, 0xa6, 0x6b, 0x7f, 0x65, 0xba, 0xf6, 0xeb, 0xdf, 0xfa, 0xda, 0xf7, + 0xeb, 0xb3, 0xe3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x13, 0xdb, 0x98, 0xf9, 0xb8, 0x08, 0x00, + 0x00, } diff --git a/vendor/k8s.io/api/batch/v1/generated.proto b/vendor/k8s.io/api/batch/v1/generated.proto index c4797a16..039149da 100644 --- a/vendor/k8s.io/api/batch/v1/generated.proto +++ b/vendor/k8s.io/api/batch/v1/generated.proto @@ -25,7 +25,6 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; @@ -135,6 +134,18 @@ message JobSpec { // Describes the pod that will be created when executing a job. // More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/ optional k8s.io.api.core.v1.PodTemplateSpec template = 6; + + // ttlSecondsAfterFinished limits the lifetime of a Job that has finished + // execution (either Complete or Failed). If this field is set, + // ttlSecondsAfterFinished after the Job finishes, it is eligible to be + // automatically deleted. When the Job is being deleted, its lifecycle + // guarantees (e.g. finalizers) will be honored. If this field is unset, + // the Job won't be automatically deleted. If this field is set to zero, + // the Job becomes eligible to be deleted immediately after it finishes. + // This field is alpha-level and is only honored by servers that enable the + // TTLAfterFinished feature. + // +optional + optional int32 ttlSecondsAfterFinished = 8; } // JobStatus represents the current state of a Job. diff --git a/vendor/k8s.io/api/batch/v1/types.go b/vendor/k8s.io/api/batch/v1/types.go index 84abb1a9..8dad9043 100644 --- a/vendor/k8s.io/api/batch/v1/types.go +++ b/vendor/k8s.io/api/batch/v1/types.go @@ -114,6 +114,18 @@ type JobSpec struct { // Describes the pod that will be created when executing a job. // More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/ Template v1.PodTemplateSpec `json:"template" protobuf:"bytes,6,opt,name=template"` + + // ttlSecondsAfterFinished limits the lifetime of a Job that has finished + // execution (either Complete or Failed). If this field is set, + // ttlSecondsAfterFinished after the Job finishes, it is eligible to be + // automatically deleted. When the Job is being deleted, its lifecycle + // guarantees (e.g. finalizers) will be honored. If this field is unset, + // the Job won't be automatically deleted. If this field is set to zero, + // the Job becomes eligible to be deleted immediately after it finishes. + // This field is alpha-level and is only honored by servers that enable the + // TTLAfterFinished feature. + // +optional + TTLSecondsAfterFinished *int32 `json:"ttlSecondsAfterFinished,omitempty" protobuf:"varint,8,opt,name=ttlSecondsAfterFinished"` } // JobStatus represents the current state of a Job. diff --git a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go index 2bb794a5..d8e2bdd7 100644 --- a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -63,14 +63,15 @@ func (JobList) SwaggerDoc() map[string]string { } var map_JobSpec = map[string]string{ - "": "JobSpec describes how the job execution will look like.", - "parallelism": "Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", - "completions": "Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", - "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", - "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", - "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", - "manualSelector": "manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector", - "template": "Describes the pod that will be created when executing a job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "": "JobSpec describes how the job execution will look like.", + "parallelism": "Specifies the maximum desired number of pods the job should run at any given time. The actual number of pods running in steady state will be less than this number when ((.spec.completions - .status.successful) < .spec.parallelism), i.e. when the work left to do is less than max parallelism. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "completions": "Specifies the desired number of successfully finished pods the job should be run with. Setting to nil means that the success of any pod signals the success of all pods, and allows parallelism to have any positive value. Setting to 1 means that parallelism is limited to 1 and the success of that pod signals the success of the job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "activeDeadlineSeconds": "Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer", + "backoffLimit": "Specifies the number of retries before marking this job failed. Defaults to 6", + "selector": "A label query over pods that should match the pod count. Normally, the system sets this field for you. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", + "manualSelector": "manualSelector controls generation of pod labels and pod selectors. Leave `manualSelector` unset unless you are certain what you are doing. When false or unset, the system pick labels unique to this job and appends those labels to the pod template. When true, the user is responsible for picking unique labels and specifying the selector. Failure to pick a unique label may cause this and other jobs to not function correctly. However, You may see `manualSelector=true` in jobs that were created with the old `extensions/v1beta1` API. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#specifying-your-own-pod-selector", + "template": "Describes the pod that will be created when executing a job. More info: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/", + "ttlSecondsAfterFinished": "ttlSecondsAfterFinished limits the lifetime of a Job that has finished execution (either Complete or Failed). If this field is set, ttlSecondsAfterFinished after the Job finishes, it is eligible to be automatically deleted. When the Job is being deleted, its lifecycle guarantees (e.g. finalizers) will be honored. If this field is unset, the Job won't be automatically deleted. If this field is set to zero, the Job becomes eligible to be deleted immediately after it finishes. This field is alpha-level and is only honored by servers that enable the TTLAfterFinished feature.", } func (JobSpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go index 3e5250f3..88cb0167 100644 --- a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1 import ( - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -109,59 +109,40 @@ func (in *JobSpec) DeepCopyInto(out *JobSpec) { *out = *in if in.Parallelism != nil { in, out := &in.Parallelism, &out.Parallelism - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Completions != nil { in, out := &in.Completions, &out.Completions - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.ActiveDeadlineSeconds != nil { in, out := &in.ActiveDeadlineSeconds, &out.ActiveDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.BackoffLimit != nil { in, out := &in.BackoffLimit, &out.BackoffLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.ManualSelector != nil { in, out := &in.ManualSelector, &out.ManualSelector - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } in.Template.DeepCopyInto(&out.Template) + if in.TTLSecondsAfterFinished != nil { + in, out := &in.TTLSecondsAfterFinished, &out.TTLSecondsAfterFinished + *out = new(int32) + **out = **in + } return } @@ -187,19 +168,11 @@ func (in *JobStatus) DeepCopyInto(out *JobStatus) { } if in.StartTime != nil { in, out := &in.StartTime, &out.StartTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.CompletionTime != nil { in, out := &in.CompletionTime, &out.CompletionTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } diff --git a/vendor/k8s.io/api/batch/v1beta1/BUILD b/vendor/k8s.io/api/batch/v1beta1/BUILD index 3f0197b9..be576c20 100644 --- a/vendor/k8s.io/api/batch/v1beta1/BUILD +++ b/vendor/k8s.io/api/batch/v1beta1/BUILD @@ -15,14 +15,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/batch/v1beta1", importpath = "k8s.io/api/batch/v1beta1", deps = [ + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -38,9 +39,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/batch/v1beta1/generated.pb.go b/vendor/k8s.io/api/batch/v1beta1/generated.pb.go index 4edf1186..ece2204f 100644 --- a/vendor/k8s.io/api/batch/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v1beta1/generated.pb.go @@ -1456,54 +1456,54 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 784 bytes of a gzipped FileDescriptorProto + // 771 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0xcf, 0x6f, 0xe3, 0x44, 0x14, 0xc7, 0xe3, 0x34, 0xbf, 0x76, 0xc2, 0x42, 0xd7, 0xa0, 0x5d, 0x2b, 0x20, 0x27, 0x64, 0xb5, - 0x22, 0x20, 0x76, 0x4c, 0x0b, 0x42, 0x9c, 0x90, 0xd6, 0x8b, 0x16, 0x28, 0x45, 0x8b, 0x9c, 0x22, - 0x24, 0x54, 0xa1, 0x8e, 0xc7, 0x2f, 0xc9, 0x34, 0xb6, 0xc7, 0xf2, 0x8c, 0x23, 0xe5, 0xc6, 0x85, - 0x3b, 0xff, 0x08, 0x27, 0xfe, 0x89, 0x88, 0x53, 0x8f, 0x3d, 0x45, 0xd4, 0xfc, 0x17, 0x9c, 0x90, - 0x27, 0xce, 0x8f, 0xe6, 0x47, 0x5b, 0x2e, 0xbd, 0x79, 0x9e, 0xbf, 0xdf, 0xcf, 0xbc, 0x79, 0xef, - 0xcd, 0xa0, 0x17, 0xc3, 0x2f, 0x04, 0x66, 0xdc, 0x1a, 0x26, 0x2e, 0xc4, 0x21, 0x48, 0x10, 0xd6, - 0x08, 0x42, 0x8f, 0xc7, 0x56, 0xfe, 0x83, 0x44, 0xcc, 0x72, 0x89, 0xa4, 0x03, 0x6b, 0x74, 0xe0, - 0x82, 0x24, 0x07, 0x56, 0x1f, 0x42, 0x88, 0x89, 0x04, 0x0f, 0x47, 0x31, 0x97, 0x5c, 0x37, 0x66, - 0x4a, 0x4c, 0x22, 0x86, 0x95, 0x12, 0xe7, 0xca, 0xc6, 0xf3, 0x3e, 0x93, 0x83, 0xc4, 0xc5, 0x94, - 0x07, 0x56, 0x9f, 0xf7, 0xb9, 0xa5, 0x0c, 0x6e, 0xd2, 0x53, 0x2b, 0xb5, 0x50, 0x5f, 0x33, 0x50, - 0xe3, 0xe9, 0x96, 0x2d, 0xd7, 0x77, 0x6b, 0xb4, 0x57, 0x44, 0x94, 0xc7, 0xb0, 0x4d, 0xf3, 0xd9, - 0x52, 0x13, 0x10, 0x3a, 0x60, 0x21, 0xc4, 0x63, 0x2b, 0x1a, 0xf6, 0xb3, 0x80, 0xb0, 0x02, 0x90, - 0x64, 0x9b, 0xcb, 0xda, 0xe5, 0x8a, 0x93, 0x50, 0xb2, 0x00, 0x36, 0x0c, 0x9f, 0xdf, 0x66, 0x10, - 0x74, 0x00, 0x01, 0xd9, 0xf0, 0x7d, 0xba, 0xcb, 0x97, 0x48, 0xe6, 0x5b, 0x2c, 0x94, 0x42, 0xc6, - 0xeb, 0xa6, 0xf6, 0x6f, 0x45, 0x54, 0x7d, 0x19, 0xf3, 0xf0, 0x88, 0xbb, 0xfa, 0x19, 0xaa, 0x65, - 0x87, 0xf0, 0x88, 0x24, 0x86, 0xd6, 0xd2, 0x3a, 0xf5, 0xc3, 0x4f, 0xf0, 0xb2, 0x09, 0x0b, 0x26, - 0x8e, 0x86, 0xfd, 0x2c, 0x20, 0x70, 0xa6, 0xc6, 0xa3, 0x03, 0xfc, 0xda, 0x3d, 0x07, 0x2a, 0xbf, - 0x07, 0x49, 0x6c, 0x7d, 0x32, 0x6d, 0x16, 0xd2, 0x69, 0x13, 0x2d, 0x63, 0xce, 0x82, 0xaa, 0x7f, - 0x8d, 0x4a, 0x22, 0x02, 0x6a, 0x14, 0x15, 0xfd, 0x19, 0xde, 0xd5, 0x62, 0x9c, 0xa7, 0xd4, 0x8d, - 0x80, 0xda, 0x6f, 0xe4, 0xc8, 0x52, 0xb6, 0x72, 0x14, 0x40, 0x7f, 0x8d, 0x2a, 0x42, 0x12, 0x99, - 0x08, 0x63, 0x4f, 0xa1, 0x3e, 0xb8, 0x1d, 0xa5, 0xe4, 0xf6, 0x9b, 0x39, 0xac, 0x32, 0x5b, 0x3b, - 0x39, 0xa6, 0xfd, 0xa7, 0x86, 0xea, 0xb9, 0xf2, 0x98, 0x09, 0xa9, 0x9f, 0x6e, 0xd4, 0x02, 0xdf, - 0xad, 0x16, 0x99, 0x5b, 0x55, 0x62, 0x3f, 0xdf, 0xa9, 0x36, 0x8f, 0xac, 0xd4, 0xe1, 0x15, 0x2a, - 0x33, 0x09, 0x81, 0x30, 0x8a, 0xad, 0xbd, 0x4e, 0xfd, 0xf0, 0xfd, 0x5b, 0xb3, 0xb7, 0x1f, 0xe6, - 0xb4, 0xf2, 0xb7, 0x99, 0xcf, 0x99, 0xd9, 0xdb, 0x7f, 0x94, 0x16, 0x59, 0x67, 0xc5, 0xd1, 0x3f, - 0x46, 0xb5, 0x6c, 0x38, 0xbc, 0xc4, 0x07, 0x95, 0xf5, 0x83, 0x65, 0x16, 0xdd, 0x3c, 0xee, 0x2c, - 0x14, 0xfa, 0x8f, 0xe8, 0x89, 0x90, 0x24, 0x96, 0x2c, 0xec, 0x7f, 0x05, 0xc4, 0xf3, 0x59, 0x08, - 0x5d, 0xa0, 0x3c, 0xf4, 0x84, 0x6a, 0xd0, 0x9e, 0xfd, 0x6e, 0x3a, 0x6d, 0x3e, 0xe9, 0x6e, 0x97, - 0x38, 0xbb, 0xbc, 0xfa, 0x29, 0x7a, 0x44, 0x79, 0x48, 0x93, 0x38, 0x86, 0x90, 0x8e, 0x7f, 0xe0, - 0x3e, 0xa3, 0x63, 0xd5, 0xa6, 0x07, 0x36, 0xce, 0xb3, 0x79, 0xf4, 0x72, 0x5d, 0xf0, 0xef, 0xb6, - 0xa0, 0xb3, 0x09, 0xd2, 0x9f, 0xa1, 0xaa, 0x48, 0x44, 0x04, 0xa1, 0x67, 0x94, 0x5a, 0x5a, 0xa7, - 0x66, 0xd7, 0xd3, 0x69, 0xb3, 0xda, 0x9d, 0x85, 0x9c, 0xf9, 0x3f, 0xfd, 0x0c, 0xd5, 0xcf, 0xb9, - 0x7b, 0x02, 0x41, 0xe4, 0x13, 0x09, 0x46, 0x59, 0xb5, 0xf0, 0xc3, 0xdd, 0x75, 0x3e, 0x5a, 0x8a, - 0xd5, 0xd0, 0xbd, 0x9d, 0x67, 0x5a, 0x5f, 0xf9, 0xe1, 0xac, 0x22, 0xf5, 0x5f, 0x50, 0x43, 0x24, - 0x94, 0x82, 0x10, 0xbd, 0xc4, 0x3f, 0xe2, 0xae, 0xf8, 0x86, 0x09, 0xc9, 0xe3, 0xf1, 0x31, 0x0b, - 0x98, 0x34, 0x2a, 0x2d, 0xad, 0x53, 0xb6, 0xcd, 0x74, 0xda, 0x6c, 0x74, 0x77, 0xaa, 0x9c, 0x1b, - 0x08, 0xba, 0x83, 0x1e, 0xf7, 0x08, 0xf3, 0xc1, 0xdb, 0x60, 0x57, 0x15, 0xbb, 0x91, 0x4e, 0x9b, - 0x8f, 0x5f, 0x6d, 0x55, 0x38, 0x3b, 0x9c, 0xed, 0xbf, 0x34, 0xf4, 0xf0, 0xda, 0x7d, 0xd0, 0xbf, - 0x43, 0x15, 0x42, 0x25, 0x1b, 0x65, 0xf3, 0x92, 0x8d, 0xe2, 0xd3, 0xd5, 0x12, 0x65, 0x0f, 0xe1, - 0xf2, 0x7e, 0x3b, 0xd0, 0x83, 0xac, 0x13, 0xb0, 0xbc, 0x44, 0x2f, 0x94, 0xd5, 0xc9, 0x11, 0xba, - 0x8f, 0xf6, 0x7d, 0x22, 0xe4, 0x7c, 0xd4, 0x4e, 0x58, 0x00, 0xaa, 0x49, 0xf5, 0xc3, 0x8f, 0xee, - 0x76, 0x79, 0x32, 0x87, 0xfd, 0x4e, 0x3a, 0x6d, 0xee, 0x1f, 0xaf, 0x71, 0x9c, 0x0d, 0x72, 0x7b, - 0xa2, 0xa1, 0xd5, 0xee, 0xdc, 0xc3, 0xf3, 0xf5, 0x13, 0xaa, 0xc9, 0xf9, 0x44, 0x15, 0xff, 0xef, - 0x44, 0x2d, 0x6e, 0xe2, 0x62, 0x9c, 0x16, 0xb0, 0xec, 0xf5, 0x79, 0x6b, 0x4d, 0x7f, 0x0f, 0xc7, - 0xf9, 0xf2, 0xda, 0x6b, 0xfc, 0xde, 0xb6, 0xa3, 0xe0, 0x1b, 0x1e, 0x61, 0xfb, 0xf9, 0xe4, 0xca, - 0x2c, 0x5c, 0x5c, 0x99, 0x85, 0xcb, 0x2b, 0xb3, 0xf0, 0x6b, 0x6a, 0x6a, 0x93, 0xd4, 0xd4, 0x2e, - 0x52, 0x53, 0xbb, 0x4c, 0x4d, 0xed, 0xef, 0xd4, 0xd4, 0x7e, 0xff, 0xc7, 0x2c, 0xfc, 0x5c, 0xcd, - 0x0b, 0xf2, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x78, 0xe4, 0x62, 0x14, 0x08, 0x00, 0x00, + 0x22, 0x20, 0x76, 0x4c, 0x2b, 0x84, 0x38, 0x21, 0xad, 0x17, 0x2d, 0x50, 0x8a, 0x16, 0x39, 0x45, + 0x48, 0xa8, 0x42, 0x1d, 0x8f, 0x5f, 0x92, 0x69, 0x6c, 0x8f, 0xe5, 0x19, 0x47, 0xca, 0x8d, 0x0b, + 0x77, 0xfe, 0x11, 0x4e, 0xfc, 0x13, 0x11, 0xa7, 0x1e, 0x7b, 0x8a, 0xa8, 0xf9, 0x2f, 0x38, 0x21, + 0x4f, 0x9c, 0x1f, 0xcd, 0x8f, 0xb6, 0x7b, 0xe9, 0xcd, 0xf3, 0xe6, 0xfb, 0xfd, 0xcc, 0xf3, 0x7b, + 0x6f, 0x06, 0xbd, 0x18, 0x7e, 0x29, 0x30, 0xe3, 0xd6, 0x30, 0x71, 0x21, 0x0e, 0x41, 0x82, 0xb0, + 0x46, 0x10, 0x7a, 0x3c, 0xb6, 0xf2, 0x0d, 0x12, 0x31, 0xcb, 0x25, 0x92, 0x0e, 0xac, 0xd1, 0x81, + 0x0b, 0x92, 0x1c, 0x58, 0x7d, 0x08, 0x21, 0x26, 0x12, 0x3c, 0x1c, 0xc5, 0x5c, 0x72, 0xdd, 0x98, + 0x29, 0x31, 0x89, 0x18, 0x56, 0x4a, 0x9c, 0x2b, 0x1b, 0xcf, 0xfb, 0x4c, 0x0e, 0x12, 0x17, 0x53, + 0x1e, 0x58, 0x7d, 0xde, 0xe7, 0x96, 0x32, 0xb8, 0x49, 0x4f, 0xad, 0xd4, 0x42, 0x7d, 0xcd, 0x40, + 0x8d, 0xa7, 0x5b, 0x8e, 0x5c, 0x3f, 0xad, 0xd1, 0x5e, 0x11, 0x51, 0x1e, 0xc3, 0x36, 0xcd, 0xe7, + 0x4b, 0x4d, 0x40, 0xe8, 0x80, 0x85, 0x10, 0x8f, 0xad, 0x68, 0xd8, 0xcf, 0x02, 0xc2, 0x0a, 0x40, + 0x92, 0x6d, 0x2e, 0x6b, 0x97, 0x2b, 0x4e, 0x42, 0xc9, 0x02, 0xd8, 0x30, 0x7c, 0x71, 0x9b, 0x41, + 0xd0, 0x01, 0x04, 0x64, 0xdd, 0xd7, 0xfe, 0xbd, 0x88, 0xaa, 0x2f, 0x63, 0x1e, 0x1e, 0x71, 0x57, + 0x3f, 0x43, 0xb5, 0x2c, 0x1f, 0x8f, 0x48, 0x62, 0x68, 0x2d, 0xad, 0x53, 0x3f, 0xfc, 0x0c, 0x2f, + 0xeb, 0xb9, 0xc0, 0xe2, 0x68, 0xd8, 0xcf, 0x02, 0x02, 0x67, 0x6a, 0x3c, 0x3a, 0xc0, 0xaf, 0xdd, + 0x73, 0xa0, 0xf2, 0x07, 0x90, 0xc4, 0xd6, 0x27, 0xd3, 0x66, 0x21, 0x9d, 0x36, 0xd1, 0x32, 0xe6, + 0x2c, 0xa8, 0xfa, 0x37, 0xa8, 0x24, 0x22, 0xa0, 0x46, 0x51, 0xd1, 0x9f, 0xe1, 0x5d, 0xdd, 0xc2, + 0x79, 0x4a, 0xdd, 0x08, 0xa8, 0xfd, 0x56, 0x8e, 0x2c, 0x65, 0x2b, 0x47, 0x01, 0xf4, 0xd7, 0xa8, + 0x22, 0x24, 0x91, 0x89, 0x30, 0xf6, 0x14, 0xea, 0xa3, 0xdb, 0x51, 0x4a, 0x6e, 0xbf, 0x9d, 0xc3, + 0x2a, 0xb3, 0xb5, 0x93, 0x63, 0xda, 0x7f, 0x69, 0xa8, 0x9e, 0x2b, 0x8f, 0x99, 0x90, 0xfa, 0xe9, + 0x46, 0x2d, 0xf0, 0xdd, 0x6a, 0x91, 0xb9, 0x55, 0x25, 0xf6, 0xf3, 0x93, 0x6a, 0xf3, 0xc8, 0x4a, + 0x1d, 0x5e, 0xa1, 0x32, 0x93, 0x10, 0x08, 0xa3, 0xd8, 0xda, 0xeb, 0xd4, 0x0f, 0x3f, 0xbc, 0x35, + 0x7b, 0xfb, 0x61, 0x4e, 0x2b, 0x7f, 0x97, 0xf9, 0x9c, 0x99, 0xbd, 0xfd, 0x67, 0x69, 0x91, 0x75, + 0x56, 0x1c, 0xfd, 0x53, 0x54, 0xcb, 0xfa, 0xec, 0x25, 0x3e, 0xa8, 0xac, 0x1f, 0x2c, 0xb3, 0xe8, + 0xe6, 0x71, 0x67, 0xa1, 0xd0, 0x7f, 0x42, 0x4f, 0x84, 0x24, 0xb1, 0x64, 0x61, 0xff, 0x6b, 0x20, + 0x9e, 0xcf, 0x42, 0xe8, 0x02, 0xe5, 0xa1, 0x27, 0x54, 0x83, 0xf6, 0xec, 0xf7, 0xd3, 0x69, 0xf3, + 0x49, 0x77, 0xbb, 0xc4, 0xd9, 0xe5, 0xd5, 0x4f, 0xd1, 0x23, 0xca, 0x43, 0x9a, 0xc4, 0x31, 0x84, + 0x74, 0xfc, 0x23, 0xf7, 0x19, 0x1d, 0xab, 0x36, 0x3d, 0xb0, 0x71, 0x9e, 0xcd, 0xa3, 0x97, 0xeb, + 0x82, 0xff, 0xb6, 0x05, 0x9d, 0x4d, 0x90, 0xfe, 0x0c, 0x55, 0x45, 0x22, 0x22, 0x08, 0x3d, 0xa3, + 0xd4, 0xd2, 0x3a, 0x35, 0xbb, 0x9e, 0x4e, 0x9b, 0xd5, 0xee, 0x2c, 0xe4, 0xcc, 0xf7, 0xf4, 0x33, + 0x54, 0x3f, 0xe7, 0xee, 0x09, 0x04, 0x91, 0x4f, 0x24, 0x18, 0x65, 0xd5, 0xc2, 0x8f, 0x77, 0xd7, + 0xf9, 0x68, 0x29, 0x56, 0x43, 0xf7, 0x6e, 0x9e, 0x69, 0x7d, 0x65, 0xc3, 0x59, 0x45, 0xea, 0xbf, + 0xa2, 0x86, 0x48, 0x28, 0x05, 0x21, 0x7a, 0x89, 0x7f, 0xc4, 0x5d, 0xf1, 0x2d, 0x13, 0x92, 0xc7, + 0xe3, 0x63, 0x16, 0x30, 0x69, 0x54, 0x5a, 0x5a, 0xa7, 0x6c, 0x9b, 0xe9, 0xb4, 0xd9, 0xe8, 0xee, + 0x54, 0x39, 0x37, 0x10, 0x74, 0x07, 0x3d, 0xee, 0x11, 0xe6, 0x83, 0xb7, 0xc1, 0xae, 0x2a, 0x76, + 0x23, 0x9d, 0x36, 0x1f, 0xbf, 0xda, 0xaa, 0x70, 0x76, 0x38, 0xdb, 0x7f, 0x6b, 0xe8, 0xe1, 0xb5, + 0xfb, 0xa0, 0x7f, 0x8f, 0x2a, 0x84, 0x4a, 0x36, 0xca, 0xe6, 0x25, 0x1b, 0xc5, 0xa7, 0xab, 0x25, + 0xca, 0xde, 0xb4, 0xe5, 0xfd, 0x76, 0xa0, 0x07, 0x59, 0x27, 0x60, 0x79, 0x89, 0x5e, 0x28, 0xab, + 0x93, 0x23, 0x74, 0x1f, 0xed, 0xfb, 0x44, 0xc8, 0xf9, 0xa8, 0x9d, 0xb0, 0x00, 0x54, 0x93, 0xea, + 0x87, 0x9f, 0xdc, 0xed, 0xf2, 0x64, 0x0e, 0xfb, 0xbd, 0x74, 0xda, 0xdc, 0x3f, 0x5e, 0xe3, 0x38, + 0x1b, 0xe4, 0xf6, 0x44, 0x43, 0xab, 0xdd, 0xb9, 0x87, 0xe7, 0xeb, 0x67, 0x54, 0x93, 0xf3, 0x89, + 0x2a, 0xbe, 0xe9, 0x44, 0x2d, 0x6e, 0xe2, 0x62, 0x9c, 0x16, 0xb0, 0xec, 0xf5, 0x79, 0x67, 0x4d, + 0x7f, 0x0f, 0xbf, 0xf3, 0xd5, 0xb5, 0xd7, 0xf8, 0x83, 0x6d, 0xbf, 0x82, 0x6f, 0x78, 0x84, 0xed, + 0xe7, 0x93, 0x2b, 0xb3, 0x70, 0x71, 0x65, 0x16, 0x2e, 0xaf, 0xcc, 0xc2, 0x6f, 0xa9, 0xa9, 0x4d, + 0x52, 0x53, 0xbb, 0x48, 0x4d, 0xed, 0x32, 0x35, 0xb5, 0x7f, 0x52, 0x53, 0xfb, 0xe3, 0x5f, 0xb3, + 0xf0, 0x4b, 0x35, 0x2f, 0xc8, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x9f, 0xb3, 0xdd, 0xdf, + 0x07, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/batch/v1beta1/generated.proto b/vendor/k8s.io/api/batch/v1beta1/generated.proto index f19af65e..043b3551 100644 --- a/vendor/k8s.io/api/batch/v1beta1/generated.proto +++ b/vendor/k8s.io/api/batch/v1beta1/generated.proto @@ -26,7 +26,6 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; diff --git a/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go index a33f4ffc..1c8bc447 100644 --- a/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go @@ -91,40 +91,24 @@ func (in *CronJobSpec) DeepCopyInto(out *CronJobSpec) { *out = *in if in.StartingDeadlineSeconds != nil { in, out := &in.StartingDeadlineSeconds, &out.StartingDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.Suspend != nil { in, out := &in.Suspend, &out.Suspend - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } in.JobTemplate.DeepCopyInto(&out.JobTemplate) if in.SuccessfulJobsHistoryLimit != nil { in, out := &in.SuccessfulJobsHistoryLimit, &out.SuccessfulJobsHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.FailedJobsHistoryLimit != nil { in, out := &in.FailedJobsHistoryLimit, &out.FailedJobsHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -149,11 +133,7 @@ func (in *CronJobStatus) DeepCopyInto(out *CronJobStatus) { } if in.LastScheduleTime != nil { in, out := &in.LastScheduleTime, &out.LastScheduleTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } diff --git a/vendor/k8s.io/api/batch/v2alpha1/BUILD b/vendor/k8s.io/api/batch/v2alpha1/BUILD index 0fc0ab57..6c70e67d 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/BUILD +++ b/vendor/k8s.io/api/batch/v2alpha1/BUILD @@ -15,14 +15,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/batch/v2alpha1", importpath = "k8s.io/api/batch/v2alpha1", deps = [ + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -38,9 +39,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go b/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go index 3fcbf342..6ab41ebb 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go @@ -1456,55 +1456,54 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 787 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0xcf, 0x6f, 0xe3, 0x44, - 0x14, 0xc7, 0xe3, 0x34, 0xbf, 0x3a, 0xa1, 0xd0, 0x1a, 0xd4, 0x86, 0x80, 0x9c, 0xc8, 0x15, 0x28, - 0x42, 0x30, 0xa6, 0x05, 0x21, 0x4e, 0x48, 0xb8, 0x08, 0x4a, 0x29, 0xa2, 0x72, 0x8a, 0x84, 0x50, - 0xb5, 0xda, 0xf1, 0x78, 0x92, 0x4c, 0x63, 0x7b, 0x2c, 0xcf, 0x38, 0x52, 0x6e, 0x7b, 0xdb, 0xeb, - 0xfe, 0x25, 0x7b, 0xd9, 0xfd, 0x23, 0xba, 0x7b, 0xea, 0xb1, 0xa7, 0x68, 0xeb, 0xfd, 0x2f, 0xf6, - 0xb4, 0xf2, 0xc4, 0xf9, 0xd1, 0x38, 0x69, 0xbb, 0x97, 0xde, 0x3c, 0xcf, 0xdf, 0xef, 0x67, 0xde, - 0xbc, 0xf7, 0x66, 0x80, 0xd9, 0xff, 0x99, 0x43, 0xca, 0x8c, 0x7e, 0x64, 0x93, 0xd0, 0x27, 0x82, - 0x70, 0x63, 0x40, 0x7c, 0x87, 0x85, 0x46, 0xfa, 0x03, 0x05, 0xd4, 0xb0, 0x91, 0xc0, 0x3d, 0x63, - 0xb0, 0x8f, 0xdc, 0xa0, 0x87, 0xf6, 0x8c, 0x2e, 0xf1, 0x49, 0x88, 0x04, 0x71, 0x60, 0x10, 0x32, - 0xc1, 0xd4, 0xcf, 0xc7, 0x52, 0x88, 0x02, 0x0a, 0xa5, 0x14, 0x4e, 0xa4, 0xf5, 0xef, 0xba, 0x54, - 0xf4, 0x22, 0x1b, 0x62, 0xe6, 0x19, 0x5d, 0xd6, 0x65, 0x86, 0x74, 0xd8, 0x51, 0x47, 0xae, 0xe4, - 0x42, 0x7e, 0x8d, 0x49, 0xf5, 0xdd, 0xec, 0xa6, 0x99, 0xed, 0xea, 0xfa, 0x9c, 0x08, 0xb3, 0x90, - 0x2c, 0xd3, 0xfc, 0x38, 0xd3, 0x78, 0x08, 0xf7, 0xa8, 0x4f, 0xc2, 0xa1, 0x11, 0xf4, 0xbb, 0x49, - 0x80, 0x1b, 0x1e, 0x11, 0x68, 0x99, 0xcb, 0x58, 0xe5, 0x0a, 0x23, 0x5f, 0x50, 0x8f, 0x64, 0x0c, - 0x3f, 0xdd, 0x65, 0xe0, 0xb8, 0x47, 0x3c, 0x94, 0xf1, 0xfd, 0xb0, 0xca, 0x17, 0x09, 0xea, 0x1a, - 0xd4, 0x17, 0x5c, 0x84, 0x8b, 0x26, 0xfd, 0x69, 0x1e, 0x94, 0x0f, 0x42, 0xe6, 0x1f, 0x31, 0x5b, - 0x7d, 0x0c, 0x2a, 0xc9, 0x21, 0x1c, 0x24, 0x50, 0x4d, 0x69, 0x2a, 0xad, 0xea, 0xfe, 0xf7, 0x70, - 0xd6, 0x85, 0x29, 0x13, 0x06, 0xfd, 0x6e, 0x12, 0xe0, 0x30, 0x51, 0xc3, 0xc1, 0x1e, 0xfc, 0xc7, - 0x3e, 0x27, 0x58, 0xfc, 0x4d, 0x04, 0x32, 0xd5, 0x8b, 0x51, 0x23, 0x17, 0x8f, 0x1a, 0x60, 0x16, - 0xb3, 0xa6, 0x54, 0xf5, 0x10, 0x14, 0x78, 0x40, 0x70, 0x2d, 0x2f, 0xe9, 0x5f, 0xc3, 0x95, 0x3d, - 0x86, 0x69, 0x4e, 0xed, 0x80, 0x60, 0xf3, 0xa3, 0x94, 0x59, 0x48, 0x56, 0x96, 0x24, 0xa8, 0x27, - 0xa0, 0xc4, 0x05, 0x12, 0x11, 0xaf, 0xad, 0x49, 0x56, 0xeb, 0x1e, 0x2c, 0xa9, 0x37, 0x3f, 0x4e, - 0x69, 0xa5, 0xf1, 0xda, 0x4a, 0x39, 0xfa, 0x4b, 0x05, 0x54, 0x53, 0xe5, 0x31, 0xe5, 0x42, 0x3d, - 0xcb, 0x54, 0x03, 0xde, 0xaf, 0x1a, 0x89, 0x5b, 0xd6, 0x62, 0x33, 0xdd, 0xa9, 0x32, 0x89, 0xcc, - 0x55, 0xe2, 0x0f, 0x50, 0xa4, 0x82, 0x78, 0xbc, 0x96, 0x6f, 0xae, 0xb5, 0xaa, 0xfb, 0xfa, 0xdd, - 0xe9, 0x9b, 0x1b, 0x29, 0xae, 0xf8, 0x67, 0x62, 0xb4, 0xc6, 0x7e, 0xfd, 0x79, 0x61, 0x9a, 0x76, - 0x52, 0x1e, 0xf5, 0x5b, 0x50, 0x49, 0xe6, 0xc3, 0x89, 0x5c, 0x22, 0xd3, 0x5e, 0x9f, 0xa5, 0xd1, - 0x4e, 0xe3, 0xd6, 0x54, 0xa1, 0xfe, 0x0b, 0x76, 0xb8, 0x40, 0xa1, 0xa0, 0x7e, 0xf7, 0x37, 0x82, - 0x1c, 0x97, 0xfa, 0xa4, 0x4d, 0x30, 0xf3, 0x1d, 0x2e, 0x7b, 0xb4, 0x66, 0x7e, 0x11, 0x8f, 0x1a, - 0x3b, 0xed, 0xe5, 0x12, 0x6b, 0x95, 0x57, 0x3d, 0x03, 0x5b, 0x98, 0xf9, 0x38, 0x0a, 0x43, 0xe2, - 0xe3, 0xe1, 0x09, 0x73, 0x29, 0x1e, 0xca, 0x46, 0xad, 0x9b, 0x30, 0xcd, 0x66, 0xeb, 0x60, 0x51, - 0xf0, 0x6e, 0x59, 0xd0, 0xca, 0x82, 0xd4, 0xaf, 0x40, 0x99, 0x47, 0x3c, 0x20, 0xbe, 0x53, 0x2b, - 0x34, 0x95, 0x56, 0xc5, 0xac, 0xc6, 0xa3, 0x46, 0xb9, 0x3d, 0x0e, 0x59, 0x93, 0x7f, 0x2a, 0x02, - 0xd5, 0x73, 0x66, 0x9f, 0x12, 0x2f, 0x70, 0x91, 0x20, 0xb5, 0xa2, 0xec, 0xe1, 0x37, 0xb7, 0x14, - 0xfa, 0x68, 0xa6, 0x96, 0x73, 0xf7, 0x69, 0x9a, 0x6a, 0x75, 0xee, 0x87, 0x35, 0xcf, 0x54, 0x1f, - 0x81, 0x3a, 0x8f, 0x30, 0x26, 0x9c, 0x77, 0x22, 0xf7, 0x88, 0xd9, 0xfc, 0x90, 0x72, 0xc1, 0xc2, - 0xe1, 0x31, 0xf5, 0xa8, 0xa8, 0x95, 0x9a, 0x4a, 0xab, 0x68, 0x6a, 0xf1, 0xa8, 0x51, 0x6f, 0xaf, - 0x54, 0x59, 0xb7, 0x10, 0x54, 0x0b, 0x6c, 0x77, 0x10, 0x75, 0x89, 0x93, 0x61, 0x97, 0x25, 0xbb, - 0x1e, 0x8f, 0x1a, 0xdb, 0xbf, 0x2f, 0x55, 0x58, 0x2b, 0x9c, 0xfa, 0x6b, 0x05, 0x6c, 0xdc, 0xb8, - 0x11, 0xea, 0x5f, 0xa0, 0x84, 0xb0, 0xa0, 0x83, 0x64, 0x60, 0x92, 0x61, 0xdc, 0x9d, 0xaf, 0x51, - 0xf2, 0x18, 0xce, 0xee, 0xb8, 0x45, 0x3a, 0x24, 0x69, 0x05, 0x99, 0x5d, 0xa3, 0x5f, 0xa5, 0xd5, - 0x4a, 0x11, 0xaa, 0x0b, 0x36, 0x5d, 0xc4, 0xc5, 0x64, 0xd6, 0x4e, 0xa9, 0x47, 0x64, 0x97, 0x6e, - 0x96, 0xfe, 0x96, 0xeb, 0x93, 0x38, 0xcc, 0xcf, 0xe2, 0x51, 0x63, 0xf3, 0x78, 0x81, 0x63, 0x65, - 0xc8, 0xfa, 0x2b, 0x05, 0xcc, 0x77, 0xe7, 0x01, 0x9e, 0xb0, 0xff, 0x40, 0x45, 0x4c, 0x46, 0x2a, - 0xff, 0xc1, 0x23, 0x35, 0xbd, 0x8b, 0xd3, 0x79, 0x9a, 0xd2, 0xf4, 0x17, 0x0a, 0xf8, 0x64, 0x41, - 0xff, 0x00, 0xe7, 0xf9, 0xe5, 0xc6, 0x93, 0xfc, 0xe5, 0x92, 0xb3, 0xc8, 0x53, 0xac, 0x7a, 0x88, - 0x4d, 0x78, 0x71, 0xad, 0xe5, 0x2e, 0xaf, 0xb5, 0xdc, 0xd5, 0xb5, 0x96, 0x7b, 0x12, 0x6b, 0xca, - 0x45, 0xac, 0x29, 0x97, 0xb1, 0xa6, 0x5c, 0xc5, 0x9a, 0xf2, 0x26, 0xd6, 0x94, 0x67, 0x6f, 0xb5, - 0xdc, 0xff, 0x95, 0x49, 0x45, 0xde, 0x07, 0x00, 0x00, 0xff, 0xff, 0x02, 0x60, 0xaa, 0x00, 0x1c, - 0x08, 0x00, 0x00, + // 774 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x94, 0x4d, 0x6f, 0xdb, 0x36, + 0x18, 0xc7, 0x2d, 0xc7, 0x6f, 0xa1, 0x97, 0x2d, 0xd1, 0x86, 0xc4, 0xf3, 0x06, 0xd9, 0x50, 0xb0, + 0xc1, 0x18, 0x36, 0x6a, 0x09, 0x86, 0x61, 0xa7, 0x01, 0x53, 0x86, 0x36, 0x4d, 0x53, 0x34, 0x90, + 0x53, 0xa0, 0x28, 0x82, 0xa2, 0x14, 0x45, 0xdb, 0x8c, 0x25, 0x51, 0x10, 0x29, 0x03, 0xbe, 0xf5, + 0xd6, 0x6b, 0x3f, 0x49, 0x2f, 0xed, 0x87, 0x48, 0x7b, 0xca, 0x31, 0x27, 0xa3, 0x51, 0xbf, 0x45, + 0x4f, 0x85, 0x68, 0xf9, 0x25, 0x7e, 0x49, 0xd2, 0x4b, 0x6e, 0xe2, 0xa3, 0xff, 0xff, 0xc7, 0x87, + 0xcf, 0xf3, 0x90, 0xc0, 0xec, 0xfe, 0xc3, 0x21, 0x65, 0x46, 0x37, 0xb2, 0x49, 0xe8, 0x13, 0x41, + 0xb8, 0xd1, 0x23, 0xbe, 0xc3, 0x42, 0x23, 0xfd, 0x81, 0x02, 0x6a, 0xd8, 0x48, 0xe0, 0x8e, 0xd1, + 0xdb, 0x45, 0x6e, 0xd0, 0x41, 0x3b, 0x46, 0x9b, 0xf8, 0x24, 0x44, 0x82, 0x38, 0x30, 0x08, 0x99, + 0x60, 0xea, 0x8f, 0x43, 0x29, 0x44, 0x01, 0x85, 0x52, 0x0a, 0x47, 0xd2, 0xea, 0x1f, 0x6d, 0x2a, + 0x3a, 0x91, 0x0d, 0x31, 0xf3, 0x8c, 0x36, 0x6b, 0x33, 0x43, 0x3a, 0xec, 0xa8, 0x25, 0x57, 0x72, + 0x21, 0xbf, 0x86, 0xa4, 0xea, 0xf6, 0xfc, 0xa6, 0x73, 0xdb, 0x55, 0xf5, 0x29, 0x11, 0x66, 0x21, + 0x59, 0xa4, 0xf9, 0x6b, 0xa2, 0xf1, 0x10, 0xee, 0x50, 0x9f, 0x84, 0x7d, 0x23, 0xe8, 0xb6, 0x93, + 0x00, 0x37, 0x3c, 0x22, 0xd0, 0x22, 0x97, 0xb1, 0xcc, 0x15, 0x46, 0xbe, 0xa0, 0x1e, 0x99, 0x33, + 0xfc, 0x7d, 0x93, 0x81, 0xe3, 0x0e, 0xf1, 0xd0, 0xac, 0x4f, 0x7f, 0x95, 0x05, 0xc5, 0xbd, 0x90, + 0xf9, 0x07, 0xcc, 0x56, 0x5f, 0x80, 0x52, 0x92, 0x8f, 0x83, 0x04, 0xaa, 0x28, 0x75, 0xa5, 0x51, + 0xde, 0xfd, 0x13, 0x4e, 0x0a, 0x3a, 0xc6, 0xc2, 0xa0, 0xdb, 0x4e, 0x02, 0x1c, 0x26, 0x6a, 0xd8, + 0xdb, 0x81, 0x8f, 0xed, 0x53, 0x82, 0xc5, 0x23, 0x22, 0x90, 0xa9, 0x9e, 0x0d, 0x6a, 0x99, 0x78, + 0x50, 0x03, 0x93, 0x98, 0x35, 0xa6, 0xaa, 0xfb, 0x20, 0xc7, 0x03, 0x82, 0x2b, 0x59, 0x49, 0xff, + 0x15, 0x2e, 0x6d, 0x17, 0x4c, 0x73, 0x6a, 0x06, 0x04, 0x9b, 0xdf, 0xa4, 0xcc, 0x5c, 0xb2, 0xb2, + 0x24, 0x41, 0x3d, 0x02, 0x05, 0x2e, 0x90, 0x88, 0x78, 0x65, 0x45, 0xb2, 0x1a, 0xb7, 0x60, 0x49, + 0xbd, 0xf9, 0x6d, 0x4a, 0x2b, 0x0c, 0xd7, 0x56, 0xca, 0xd1, 0xdf, 0x29, 0xa0, 0x9c, 0x2a, 0x0f, + 0x29, 0x17, 0xea, 0xc9, 0x5c, 0x35, 0xe0, 0xed, 0xaa, 0x91, 0xb8, 0x65, 0x2d, 0xd6, 0xd3, 0x9d, + 0x4a, 0xa3, 0xc8, 0x54, 0x25, 0xee, 0x83, 0x3c, 0x15, 0xc4, 0xe3, 0x95, 0x6c, 0x7d, 0xa5, 0x51, + 0xde, 0xd5, 0x6f, 0x4e, 0xdf, 0x5c, 0x4b, 0x71, 0xf9, 0x07, 0x89, 0xd1, 0x1a, 0xfa, 0xf5, 0x37, + 0xb9, 0x71, 0xda, 0x49, 0x79, 0xd4, 0xdf, 0x41, 0x29, 0x69, 0xb5, 0x13, 0xb9, 0x44, 0xa6, 0xbd, + 0x3a, 0x49, 0xa3, 0x99, 0xc6, 0xad, 0xb1, 0x42, 0x7d, 0x02, 0xb6, 0xb8, 0x40, 0xa1, 0xa0, 0x7e, + 0xfb, 0x7f, 0x82, 0x1c, 0x97, 0xfa, 0xa4, 0x49, 0x30, 0xf3, 0x1d, 0x2e, 0x7b, 0xb4, 0x62, 0xfe, + 0x14, 0x0f, 0x6a, 0x5b, 0xcd, 0xc5, 0x12, 0x6b, 0x99, 0x57, 0x3d, 0x01, 0x1b, 0x98, 0xf9, 0x38, + 0x0a, 0x43, 0xe2, 0xe3, 0xfe, 0x11, 0x73, 0x29, 0xee, 0xcb, 0x46, 0xad, 0x9a, 0x30, 0xcd, 0x66, + 0x63, 0x6f, 0x56, 0xf0, 0x79, 0x51, 0xd0, 0x9a, 0x07, 0xa9, 0xbf, 0x80, 0x22, 0x8f, 0x78, 0x40, + 0x7c, 0xa7, 0x92, 0xab, 0x2b, 0x8d, 0x92, 0x59, 0x8e, 0x07, 0xb5, 0x62, 0x73, 0x18, 0xb2, 0x46, + 0xff, 0x54, 0x04, 0xca, 0xa7, 0xcc, 0x3e, 0x26, 0x5e, 0xe0, 0x22, 0x41, 0x2a, 0x79, 0xd9, 0xc3, + 0xdf, 0xae, 0x29, 0xf4, 0xc1, 0x44, 0x2d, 0xe7, 0xee, 0xfb, 0x34, 0xd5, 0xf2, 0xd4, 0x0f, 0x6b, + 0x9a, 0xa9, 0x3e, 0x07, 0x55, 0x1e, 0x61, 0x4c, 0x38, 0x6f, 0x45, 0xee, 0x01, 0xb3, 0xf9, 0x3e, + 0xe5, 0x82, 0x85, 0xfd, 0x43, 0xea, 0x51, 0x51, 0x29, 0xd4, 0x95, 0x46, 0xde, 0xd4, 0xe2, 0x41, + 0xad, 0xda, 0x5c, 0xaa, 0xb2, 0xae, 0x21, 0xa8, 0x16, 0xd8, 0x6c, 0x21, 0xea, 0x12, 0x67, 0x8e, + 0x5d, 0x94, 0xec, 0x6a, 0x3c, 0xa8, 0x6d, 0xde, 0x5b, 0xa8, 0xb0, 0x96, 0x38, 0xf5, 0x0f, 0x0a, + 0x58, 0xbb, 0x72, 0x23, 0xd4, 0x87, 0xa0, 0x80, 0xb0, 0xa0, 0xbd, 0x64, 0x60, 0x92, 0x61, 0xdc, + 0x9e, 0xae, 0x51, 0xf2, 0xae, 0x4d, 0xee, 0xb8, 0x45, 0x5a, 0x24, 0x69, 0x05, 0x99, 0x5c, 0xa3, + 0xff, 0xa4, 0xd5, 0x4a, 0x11, 0xaa, 0x0b, 0xd6, 0x5d, 0xc4, 0xc5, 0x68, 0xd6, 0x8e, 0xa9, 0x47, + 0x64, 0x97, 0xae, 0x96, 0xfe, 0x9a, 0xeb, 0x93, 0x38, 0xcc, 0x1f, 0xe2, 0x41, 0x6d, 0xfd, 0x70, + 0x86, 0x63, 0xcd, 0x91, 0xf5, 0xf7, 0x0a, 0x98, 0xee, 0xce, 0x1d, 0x3c, 0x61, 0x4f, 0x41, 0x49, + 0x8c, 0x46, 0x2a, 0xfb, 0xd5, 0x23, 0x35, 0xbe, 0x8b, 0xe3, 0x79, 0x1a, 0xd3, 0xf4, 0xb7, 0x0a, + 0xf8, 0x6e, 0x46, 0x7f, 0x07, 0xe7, 0xf9, 0xf7, 0xca, 0x93, 0xfc, 0xf3, 0x82, 0xb3, 0xc8, 0x53, + 0x2c, 0x7b, 0x88, 0x4d, 0x78, 0x76, 0xa9, 0x65, 0xce, 0x2f, 0xb5, 0xcc, 0xc5, 0xa5, 0x96, 0x79, + 0x19, 0x6b, 0xca, 0x59, 0xac, 0x29, 0xe7, 0xb1, 0xa6, 0x5c, 0xc4, 0x9a, 0xf2, 0x31, 0xd6, 0x94, + 0xd7, 0x9f, 0xb4, 0xcc, 0xb3, 0xd2, 0xa8, 0x22, 0x5f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x20, 0x1c, + 0xcf, 0x94, 0xe7, 0x07, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/batch/v2alpha1/generated.proto b/vendor/k8s.io/api/batch/v2alpha1/generated.proto index 1fe17ff2..4321c336 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/generated.proto +++ b/vendor/k8s.io/api/batch/v2alpha1/generated.proto @@ -26,7 +26,6 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v2alpha1"; diff --git a/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go index bf0da8bf..20d87e7e 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go @@ -91,40 +91,24 @@ func (in *CronJobSpec) DeepCopyInto(out *CronJobSpec) { *out = *in if in.StartingDeadlineSeconds != nil { in, out := &in.StartingDeadlineSeconds, &out.StartingDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.Suspend != nil { in, out := &in.Suspend, &out.Suspend - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } in.JobTemplate.DeepCopyInto(&out.JobTemplate) if in.SuccessfulJobsHistoryLimit != nil { in, out := &in.SuccessfulJobsHistoryLimit, &out.SuccessfulJobsHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.FailedJobsHistoryLimit != nil { in, out := &in.FailedJobsHistoryLimit, &out.FailedJobsHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -149,11 +133,7 @@ func (in *CronJobStatus) DeepCopyInto(out *CronJobStatus) { } if in.LastScheduleTime != nil { in, out := &in.LastScheduleTime, &out.LastScheduleTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } diff --git a/vendor/k8s.io/api/certificates/v1beta1/BUILD b/vendor/k8s.io/api/certificates/v1beta1/BUILD index 4c94dd06..2d4532cf 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/BUILD +++ b/vendor/k8s.io/api/certificates/v1beta1/BUILD @@ -15,13 +15,14 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/certificates/v1beta1", importpath = "k8s.io/api/certificates/v1beta1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -37,9 +38,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go b/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go index 5de4ade7..eda15990 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go @@ -1638,56 +1638,56 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 816 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x4d, 0x6f, 0x1b, 0x45, - 0x18, 0xf6, 0xfa, 0x2b, 0xf6, 0x38, 0xa4, 0xd5, 0x08, 0x55, 0x4b, 0xa4, 0xee, 0x46, 0x2b, 0x40, - 0xe1, 0xa3, 0xb3, 0xa4, 0x20, 0x88, 0x72, 0x40, 0xb0, 0xa1, 0x82, 0x88, 0x56, 0x48, 0xd3, 0x86, - 0x03, 0x42, 0xa2, 0xe3, 0xf5, 0xdb, 0xcd, 0xd4, 0xd9, 0x0f, 0x76, 0x66, 0x0d, 0xbe, 0xf5, 0x27, - 0x70, 0xe4, 0x82, 0xc4, 0x2f, 0xe1, 0x1c, 0x0e, 0x48, 0x3d, 0xf6, 0x80, 0x2c, 0x62, 0xfe, 0x45, - 0x4f, 0x68, 0x66, 0xc7, 0x5e, 0x63, 0xcb, 0x75, 0xd5, 0xdc, 0xf6, 0x7d, 0xde, 0xf7, 0x79, 0xde, - 0xcf, 0x59, 0xf4, 0xd5, 0xf0, 0x50, 0x10, 0x9e, 0xfa, 0xc3, 0xa2, 0x0f, 0x79, 0x02, 0x12, 0x84, - 0x3f, 0x82, 0x64, 0x90, 0xe6, 0xbe, 0x71, 0xb0, 0x8c, 0xfb, 0x21, 0xe4, 0x92, 0x3f, 0xe2, 0x21, - 0xd3, 0xee, 0x83, 0x3e, 0x48, 0x76, 0xe0, 0x47, 0x90, 0x40, 0xce, 0x24, 0x0c, 0x48, 0x96, 0xa7, - 0x32, 0xc5, 0x6e, 0x49, 0x20, 0x2c, 0xe3, 0x64, 0x91, 0x40, 0x0c, 0x61, 0xf7, 0x56, 0xc4, 0xe5, - 0x59, 0xd1, 0x27, 0x61, 0x1a, 0xfb, 0x51, 0x1a, 0xa5, 0xbe, 0xe6, 0xf5, 0x8b, 0x47, 0xda, 0xd2, - 0x86, 0xfe, 0x2a, 0xf5, 0x76, 0x3f, 0xaa, 0x0a, 0x88, 0x59, 0x78, 0xc6, 0x13, 0xc8, 0xc7, 0x7e, - 0x36, 0x8c, 0x14, 0x20, 0xfc, 0x18, 0x24, 0xf3, 0x47, 0x2b, 0x55, 0xec, 0xfa, 0xeb, 0x58, 0x79, - 0x91, 0x48, 0x1e, 0xc3, 0x0a, 0xe1, 0xe3, 0x4d, 0x04, 0x11, 0x9e, 0x41, 0xcc, 0x56, 0x78, 0x1f, - 0xae, 0xe3, 0x15, 0x92, 0x9f, 0xfb, 0x3c, 0x91, 0x42, 0xe6, 0xcb, 0x24, 0xef, 0xcf, 0x3a, 0x7a, - 0xe3, 0xb8, 0x9a, 0xcd, 0x7d, 0x1e, 0x25, 0x3c, 0x89, 0x28, 0xfc, 0x58, 0x80, 0x90, 0xf8, 0x21, - 0xea, 0xa8, 0xb6, 0x06, 0x4c, 0x32, 0xdb, 0xda, 0xb3, 0xf6, 0x7b, 0xb7, 0x3f, 0x20, 0xd5, 0x50, - 0xe7, 0x59, 0x48, 0x36, 0x8c, 0x14, 0x20, 0x88, 0x8a, 0x26, 0xa3, 0x03, 0xf2, 0x4d, 0xff, 0x31, - 0x84, 0xf2, 0x1e, 0x48, 0x16, 0xe0, 0x8b, 0x89, 0x5b, 0x9b, 0x4e, 0x5c, 0x54, 0x61, 0x74, 0xae, - 0x8a, 0x1f, 0xa2, 0xa6, 0xc8, 0x20, 0xb4, 0xeb, 0x5a, 0xfd, 0x53, 0xb2, 0x61, 0x65, 0x64, 0x6d, - 0xad, 0xf7, 0x33, 0x08, 0x83, 0x6d, 0x93, 0xab, 0xa9, 0x2c, 0xaa, 0x95, 0xf1, 0x19, 0x6a, 0x0b, - 0xc9, 0x64, 0x21, 0xec, 0x86, 0xce, 0xf1, 0xd9, 0x15, 0x72, 0x68, 0x9d, 0x60, 0xc7, 0x64, 0x69, - 0x97, 0x36, 0x35, 0xfa, 0xde, 0x6f, 0x75, 0xe4, 0xad, 0xe5, 0x1e, 0xa7, 0xc9, 0x80, 0x4b, 0x9e, - 0x26, 0xf8, 0x10, 0x35, 0xe5, 0x38, 0x03, 0x3d, 0xd0, 0x6e, 0xf0, 0xe6, 0xac, 0xe4, 0x07, 0xe3, - 0x0c, 0x9e, 0x4f, 0xdc, 0xd7, 0x97, 0xe3, 0x15, 0x4e, 0x35, 0x03, 0xbf, 0x8d, 0xda, 0x39, 0x30, - 0x91, 0x26, 0x7a, 0x5c, 0xdd, 0xaa, 0x10, 0xaa, 0x51, 0x6a, 0xbc, 0xf8, 0x1d, 0xb4, 0x15, 0x83, - 0x10, 0x2c, 0x02, 0xdd, 0x73, 0x37, 0xb8, 0x66, 0x02, 0xb7, 0xee, 0x95, 0x30, 0x9d, 0xf9, 0xf1, - 0x63, 0xb4, 0x73, 0xce, 0x84, 0x3c, 0xcd, 0x06, 0x4c, 0xc2, 0x03, 0x1e, 0x83, 0xdd, 0xd4, 0x53, - 0x7a, 0xf7, 0xe5, 0xf6, 0xac, 0x18, 0xc1, 0x0d, 0xa3, 0xbe, 0x73, 0xf7, 0x7f, 0x4a, 0x74, 0x49, - 0xd9, 0x9b, 0x58, 0xe8, 0xe6, 0xda, 0xf9, 0xdc, 0xe5, 0x42, 0xe2, 0xef, 0x57, 0xee, 0x8d, 0xbc, - 0x5c, 0x1d, 0x8a, 0xad, 0xaf, 0xed, 0xba, 0xa9, 0xa5, 0x33, 0x43, 0x16, 0x6e, 0xed, 0x07, 0xd4, - 0xe2, 0x12, 0x62, 0x61, 0xd7, 0xf7, 0x1a, 0xfb, 0xbd, 0xdb, 0x47, 0xaf, 0x7e, 0x08, 0xc1, 0x6b, - 0x26, 0x4d, 0xeb, 0x44, 0x09, 0xd2, 0x52, 0xd7, 0xfb, 0xa3, 0xf1, 0x82, 0x06, 0xd5, 0x49, 0xe2, - 0xb7, 0xd0, 0x56, 0x5e, 0x9a, 0xba, 0xbf, 0xed, 0xa0, 0xa7, 0xb6, 0x62, 0x22, 0xe8, 0xcc, 0x87, - 0xdf, 0x47, 0x9d, 0x42, 0x40, 0x9e, 0xb0, 0x18, 0xcc, 0xaa, 0xe7, 0x7d, 0x9d, 0x1a, 0x9c, 0xce, - 0x23, 0xf0, 0x4d, 0xd4, 0x28, 0xf8, 0xc0, 0xac, 0xba, 0x67, 0x02, 0x1b, 0xa7, 0x27, 0x5f, 0x50, - 0x85, 0x63, 0x0f, 0xb5, 0xa3, 0x3c, 0x2d, 0x32, 0x61, 0x37, 0xf7, 0x1a, 0xfb, 0xdd, 0x00, 0xa9, - 0x8b, 0xf9, 0x52, 0x23, 0xd4, 0x78, 0x30, 0x41, 0xed, 0x42, 0xdd, 0x83, 0xb0, 0x5b, 0x3a, 0xe6, - 0x86, 0x8a, 0x39, 0xd5, 0xc8, 0xf3, 0x89, 0xdb, 0xf9, 0x1a, 0xc6, 0xda, 0xa0, 0x26, 0x0a, 0x27, - 0xa8, 0x05, 0x3f, 0xcb, 0x9c, 0xd9, 0x6d, 0x3d, 0xca, 0x93, 0xab, 0xbd, 0x5b, 0x72, 0x47, 0x69, - 0xdd, 0x49, 0x64, 0x3e, 0xae, 0x26, 0xab, 0x31, 0x5a, 0xa6, 0xd9, 0x05, 0x84, 0xaa, 0x18, 0x7c, - 0x1d, 0x35, 0x86, 0x30, 0x2e, 0x1f, 0x10, 0x55, 0x9f, 0xf8, 0x73, 0xd4, 0x1a, 0xb1, 0xf3, 0x02, - 0xcc, 0x7f, 0xe4, 0xbd, 0x8d, 0xf5, 0x68, 0xb5, 0x6f, 0x15, 0x85, 0x96, 0xcc, 0xa3, 0xfa, 0xa1, - 0xe5, 0xfd, 0x65, 0x21, 0x77, 0xc3, 0xeb, 0xc7, 0x3f, 0x21, 0x14, 0xce, 0xde, 0xa6, 0xb0, 0x2d, - 0xdd, 0xff, 0xf1, 0xab, 0xf7, 0x3f, 0x7f, 0xe7, 0xd5, 0x8f, 0x72, 0x0e, 0x09, 0xba, 0x90, 0x0a, - 0x1f, 0xa0, 0xde, 0x82, 0xb4, 0xee, 0x74, 0x3b, 0xb8, 0x36, 0x9d, 0xb8, 0xbd, 0x05, 0x71, 0xba, - 0x18, 0xe3, 0x7d, 0x62, 0xc6, 0xa6, 0x1b, 0xc5, 0xee, 0xec, 0xfe, 0x2d, 0xbd, 0xe3, 0xee, 0xf2, - 0xfd, 0x1e, 0x75, 0x7e, 0xfd, 0xdd, 0xad, 0x3d, 0xf9, 0x7b, 0xaf, 0x16, 0xdc, 0xba, 0xb8, 0x74, - 0x6a, 0x4f, 0x2f, 0x9d, 0xda, 0xb3, 0x4b, 0xa7, 0xf6, 0x64, 0xea, 0x58, 0x17, 0x53, 0xc7, 0x7a, - 0x3a, 0x75, 0xac, 0x67, 0x53, 0xc7, 0xfa, 0x67, 0xea, 0x58, 0xbf, 0xfc, 0xeb, 0xd4, 0xbe, 0xdb, - 0x32, 0xdd, 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0x73, 0x7d, 0xca, 0x2a, 0xb4, 0x07, 0x00, 0x00, + // 804 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x4d, 0x8f, 0xdb, 0x44, + 0x18, 0x8e, 0xf3, 0xb5, 0xc9, 0x64, 0xd9, 0x56, 0x23, 0x54, 0x99, 0x95, 0x6a, 0xaf, 0x2c, 0x40, + 0xcb, 0x47, 0xc7, 0x6c, 0x85, 0x60, 0xb5, 0x07, 0x04, 0x5e, 0x2a, 0x58, 0xd1, 0x0a, 0x69, 0xda, + 0x70, 0x40, 0x48, 0x74, 0xe2, 0xbc, 0x75, 0xa6, 0xa9, 0x3f, 0xf0, 0x8c, 0x03, 0xb9, 0xf5, 0x27, + 0x70, 0xe4, 0x82, 0xc4, 0x2f, 0xe1, 0xbc, 0x1c, 0x90, 0x7a, 0xec, 0x01, 0x45, 0x6c, 0xf8, 0x17, + 0x3d, 0xa1, 0x19, 0x4f, 0xe2, 0x90, 0x55, 0x48, 0xd5, 0xbd, 0x79, 0x9e, 0xf7, 0x79, 0x9e, 0xf7, + 0x63, 0xde, 0x31, 0xfa, 0x72, 0x7c, 0x2c, 0x08, 0x4f, 0xfd, 0x71, 0x31, 0x80, 0x3c, 0x01, 0x09, + 0xc2, 0x9f, 0x40, 0x32, 0x4c, 0x73, 0xdf, 0x04, 0x58, 0xc6, 0xfd, 0x10, 0x72, 0xc9, 0x1f, 0xf1, + 0x90, 0xe9, 0xf0, 0xd1, 0x00, 0x24, 0x3b, 0xf2, 0x23, 0x48, 0x20, 0x67, 0x12, 0x86, 0x24, 0xcb, + 0x53, 0x99, 0x62, 0xb7, 0x14, 0x10, 0x96, 0x71, 0xb2, 0x2a, 0x20, 0x46, 0xb0, 0x7f, 0x2b, 0xe2, + 0x72, 0x54, 0x0c, 0x48, 0x98, 0xc6, 0x7e, 0x94, 0x46, 0xa9, 0xaf, 0x75, 0x83, 0xe2, 0x91, 0x3e, + 0xe9, 0x83, 0xfe, 0x2a, 0xfd, 0xf6, 0x3f, 0xac, 0x0a, 0x88, 0x59, 0x38, 0xe2, 0x09, 0xe4, 0x53, + 0x3f, 0x1b, 0x47, 0x0a, 0x10, 0x7e, 0x0c, 0x92, 0xf9, 0x93, 0x4b, 0x55, 0xec, 0xfb, 0x9b, 0x54, + 0x79, 0x91, 0x48, 0x1e, 0xc3, 0x25, 0xc1, 0x47, 0xdb, 0x04, 0x22, 0x1c, 0x41, 0xcc, 0xd6, 0x75, + 0xde, 0x1f, 0x75, 0xf4, 0xc6, 0x69, 0xd5, 0xe6, 0x7d, 0x1e, 0x25, 0x3c, 0x89, 0x28, 0xfc, 0x50, + 0x80, 0x90, 0xf8, 0x21, 0xea, 0xa8, 0x0a, 0x87, 0x4c, 0x32, 0xdb, 0x3a, 0xb0, 0x0e, 0x7b, 0xb7, + 0x3f, 0x20, 0xd5, 0x7c, 0x96, 0x89, 0x48, 0x36, 0x8e, 0x14, 0x20, 0x88, 0x62, 0x93, 0xc9, 0x11, + 0xf9, 0x7a, 0xf0, 0x18, 0x42, 0x79, 0x0f, 0x24, 0x0b, 0xf0, 0xf9, 0xcc, 0xad, 0xcd, 0x67, 0x2e, + 0xaa, 0x30, 0xba, 0x74, 0xc5, 0x0f, 0x51, 0x53, 0x64, 0x10, 0xda, 0x75, 0xed, 0xfe, 0x09, 0xd9, + 0x32, 0x7d, 0xb2, 0xb1, 0xd6, 0xfb, 0x19, 0x84, 0xc1, 0xae, 0xc9, 0xd5, 0x54, 0x27, 0xaa, 0x9d, + 0xf1, 0x08, 0xb5, 0x85, 0x64, 0xb2, 0x10, 0x76, 0x43, 0xe7, 0xf8, 0xf4, 0x0a, 0x39, 0xb4, 0x4f, + 0xb0, 0x67, 0xb2, 0xb4, 0xcb, 0x33, 0x35, 0xfe, 0xde, 0xaf, 0x75, 0xe4, 0x6d, 0xd4, 0x9e, 0xa6, + 0xc9, 0x90, 0x4b, 0x9e, 0x26, 0xf8, 0x18, 0x35, 0xe5, 0x34, 0x03, 0x3d, 0xd0, 0x6e, 0xf0, 0xe6, + 0xa2, 0xe4, 0x07, 0xd3, 0x0c, 0x5e, 0xcc, 0xdc, 0xd7, 0xd7, 0xf9, 0x0a, 0xa7, 0x5a, 0x81, 0xdf, + 0x46, 0xed, 0x1c, 0x98, 0x48, 0x13, 0x3d, 0xae, 0x6e, 0x55, 0x08, 0xd5, 0x28, 0x35, 0x51, 0xfc, + 0x0e, 0xda, 0x89, 0x41, 0x08, 0x16, 0x81, 0xee, 0xb9, 0x1b, 0x5c, 0x33, 0xc4, 0x9d, 0x7b, 0x25, + 0x4c, 0x17, 0x71, 0xfc, 0x18, 0xed, 0x3d, 0x61, 0x42, 0xf6, 0xb3, 0x21, 0x93, 0xf0, 0x80, 0xc7, + 0x60, 0x37, 0xf5, 0x94, 0xde, 0x7d, 0xb9, 0x7b, 0x56, 0x8a, 0xe0, 0x86, 0x71, 0xdf, 0xbb, 0xfb, + 0x1f, 0x27, 0xba, 0xe6, 0xec, 0xcd, 0x2c, 0x74, 0x73, 0xe3, 0x7c, 0xee, 0x72, 0x21, 0xf1, 0x77, + 0x97, 0xf6, 0x8d, 0xbc, 0x5c, 0x1d, 0x4a, 0xad, 0xb7, 0xed, 0xba, 0xa9, 0xa5, 0xb3, 0x40, 0x56, + 0x76, 0xed, 0x7b, 0xd4, 0xe2, 0x12, 0x62, 0x61, 0xd7, 0x0f, 0x1a, 0x87, 0xbd, 0xdb, 0x27, 0xaf, + 0xbe, 0x08, 0xc1, 0x6b, 0x26, 0x4d, 0xeb, 0x4c, 0x19, 0xd2, 0xd2, 0xd7, 0xfb, 0xbd, 0xf1, 0x3f, + 0x0d, 0xaa, 0x95, 0xc4, 0x6f, 0xa1, 0x9d, 0xbc, 0x3c, 0xea, 0xfe, 0x76, 0x83, 0x9e, 0xba, 0x15, + 0xc3, 0xa0, 0x8b, 0x18, 0x7e, 0x1f, 0x75, 0x0a, 0x01, 0x79, 0xc2, 0x62, 0x30, 0x57, 0xbd, 0xec, + 0xab, 0x6f, 0x70, 0xba, 0x64, 0xe0, 0x9b, 0xa8, 0x51, 0xf0, 0xa1, 0xb9, 0xea, 0x9e, 0x21, 0x36, + 0xfa, 0x67, 0x9f, 0x53, 0x85, 0x63, 0x0f, 0xb5, 0xa3, 0x3c, 0x2d, 0x32, 0x61, 0x37, 0x0f, 0x1a, + 0x87, 0xdd, 0x00, 0xa9, 0x8d, 0xf9, 0x42, 0x23, 0xd4, 0x44, 0x30, 0x41, 0xed, 0x42, 0xed, 0x83, + 0xb0, 0x5b, 0x9a, 0x73, 0x43, 0x71, 0xfa, 0x1a, 0x79, 0x31, 0x73, 0x3b, 0x5f, 0xc1, 0x54, 0x1f, + 0xa8, 0x61, 0xe1, 0x04, 0xb5, 0xe0, 0x27, 0x99, 0x33, 0xbb, 0xad, 0x47, 0x79, 0x76, 0xb5, 0x77, + 0x4b, 0xee, 0x28, 0xaf, 0x3b, 0x89, 0xcc, 0xa7, 0xd5, 0x64, 0x35, 0x46, 0xcb, 0x34, 0xfb, 0x80, + 0x50, 0xc5, 0xc1, 0xd7, 0x51, 0x63, 0x0c, 0xd3, 0xf2, 0x01, 0x51, 0xf5, 0x89, 0x3f, 0x43, 0xad, + 0x09, 0x7b, 0x52, 0x80, 0xf9, 0x8f, 0xbc, 0xb7, 0xb5, 0x1e, 0xed, 0xf6, 0x8d, 0x92, 0xd0, 0x52, + 0x79, 0x52, 0x3f, 0xb6, 0xbc, 0x3f, 0x2d, 0xe4, 0x6e, 0x79, 0xfd, 0xf8, 0x47, 0x84, 0xc2, 0xc5, + 0xdb, 0x14, 0xb6, 0xa5, 0xfb, 0x3f, 0x7d, 0xf5, 0xfe, 0x97, 0xef, 0xbc, 0xfa, 0x51, 0x2e, 0x21, + 0x41, 0x57, 0x52, 0xe1, 0x23, 0xd4, 0x5b, 0xb1, 0xd6, 0x9d, 0xee, 0x06, 0xd7, 0xe6, 0x33, 0xb7, + 0xb7, 0x62, 0x4e, 0x57, 0x39, 0xde, 0xc7, 0x66, 0x6c, 0xba, 0x51, 0xec, 0x2e, 0xf6, 0xdf, 0xd2, + 0x77, 0xdc, 0x5d, 0xdf, 0xdf, 0x93, 0xce, 0x2f, 0xbf, 0xb9, 0xb5, 0xa7, 0x7f, 0x1d, 0xd4, 0x82, + 0x5b, 0xe7, 0x17, 0x4e, 0xed, 0xd9, 0x85, 0x53, 0x7b, 0x7e, 0xe1, 0xd4, 0x9e, 0xce, 0x1d, 0xeb, + 0x7c, 0xee, 0x58, 0xcf, 0xe6, 0x8e, 0xf5, 0x7c, 0xee, 0x58, 0x7f, 0xcf, 0x1d, 0xeb, 0xe7, 0x7f, + 0x9c, 0xda, 0xb7, 0x3b, 0xa6, 0xbb, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xb7, 0x6b, 0x5b, 0xf9, + 0x7f, 0x07, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/certificates/v1beta1/generated.proto b/vendor/k8s.io/api/certificates/v1beta1/generated.proto index 1d79767e..5200224a 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1beta1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.certificates.v1beta1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; diff --git a/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go index ffd24c30..1b103f15 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go @@ -124,12 +124,15 @@ func (in *CertificateSigningRequestSpec) DeepCopyInto(out *CertificateSigningReq in, out := &in.Extra, &out.Extra *out = make(map[string]ExtraValue, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make(ExtraValue, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return diff --git a/vendor/k8s.io/api/code-of-conduct.md b/vendor/k8s.io/api/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/vendor/k8s.io/api/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) diff --git a/vendor/k8s.io/api/coordination/v1beta1/BUILD b/vendor/k8s.io/api/coordination/v1beta1/BUILD new file mode 100644 index 00000000..94ea9ca4 --- /dev/null +++ b/vendor/k8s.io/api/coordination/v1beta1/BUILD @@ -0,0 +1,42 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +filegroup( + name = "go_default_library_protos", + srcs = ["generated.proto"], + visibility = ["//visibility:public"], +) + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "generated.pb.go", + "register.go", + "types.go", + "types_swagger_doc_generated.go", + "zz_generated.deepcopy.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/coordination/v1beta1", + importpath = "k8s.io/api/coordination/v1beta1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/api/coordination/v1beta1/doc.go b/vendor/k8s.io/api/coordination/v1beta1/doc.go new file mode 100644 index 00000000..fecb513f --- /dev/null +++ b/vendor/k8s.io/api/coordination/v1beta1/doc.go @@ -0,0 +1,21 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:openapi-gen=true + +// +groupName=coordination.k8s.io +package v1beta1 // import "k8s.io/api/coordination/v1beta1" diff --git a/vendor/k8s.io/api/coordination/v1beta1/generated.pb.go b/vendor/k8s.io/api/coordination/v1beta1/generated.pb.go new file mode 100644 index 00000000..6c2dbd91 --- /dev/null +++ b/vendor/k8s.io/api/coordination/v1beta1/generated.pb.go @@ -0,0 +1,883 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by protoc-gen-gogo. +// source: k8s.io/kubernetes/vendor/k8s.io/api/coordination/v1beta1/generated.proto +// DO NOT EDIT! + +/* + Package v1beta1 is a generated protocol buffer package. + + It is generated from these files: + k8s.io/kubernetes/vendor/k8s.io/api/coordination/v1beta1/generated.proto + + It has these top-level messages: + Lease + LeaseList + LeaseSpec +*/ +package v1beta1 + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +import strings "strings" +import reflect "reflect" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +func (m *Lease) Reset() { *m = Lease{} } +func (*Lease) ProtoMessage() {} +func (*Lease) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } + +func (m *LeaseList) Reset() { *m = LeaseList{} } +func (*LeaseList) ProtoMessage() {} +func (*LeaseList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } + +func (m *LeaseSpec) Reset() { *m = LeaseSpec{} } +func (*LeaseSpec) ProtoMessage() {} +func (*LeaseSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } + +func init() { + proto.RegisterType((*Lease)(nil), "k8s.io.api.coordination.v1beta1.Lease") + proto.RegisterType((*LeaseList)(nil), "k8s.io.api.coordination.v1beta1.LeaseList") + proto.RegisterType((*LeaseSpec)(nil), "k8s.io.api.coordination.v1beta1.LeaseSpec") +} +func (m *Lease) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Lease) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n1, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n2, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + return i, nil +} + +func (m *LeaseList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n3, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *LeaseSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseSpec) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.HolderIdentity != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.HolderIdentity))) + i += copy(dAtA[i:], *m.HolderIdentity) + } + if m.LeaseDurationSeconds != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.LeaseDurationSeconds)) + } + if m.AcquireTime != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AcquireTime.Size())) + n4, err := m.AcquireTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.RenewTime != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.RenewTime.Size())) + n5, err := m.RenewTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.LeaseTransitions != nil { + dAtA[i] = 0x28 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.LeaseTransitions)) + } + return i, nil +} + +func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + dAtA[offset+4] = uint8(v >> 32) + dAtA[offset+5] = uint8(v >> 40) + dAtA[offset+6] = uint8(v >> 48) + dAtA[offset+7] = uint8(v >> 56) + return offset + 8 +} +func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + return offset + 4 +} +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Lease) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *LeaseList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *LeaseSpec) Size() (n int) { + var l int + _ = l + if m.HolderIdentity != nil { + l = len(*m.HolderIdentity) + n += 1 + l + sovGenerated(uint64(l)) + } + if m.LeaseDurationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.LeaseDurationSeconds)) + } + if m.AcquireTime != nil { + l = m.AcquireTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.RenewTime != nil { + l = m.RenewTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.LeaseTransitions != nil { + n += 1 + sovGenerated(uint64(*m.LeaseTransitions)) + } + return n +} + +func sovGenerated(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Lease) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Lease{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "LeaseSpec", "LeaseSpec", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *LeaseList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&LeaseList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Lease", "Lease", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *LeaseSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&LeaseSpec{`, + `HolderIdentity:` + valueToStringGenerated(this.HolderIdentity) + `,`, + `LeaseDurationSeconds:` + valueToStringGenerated(this.LeaseDurationSeconds) + `,`, + `AcquireTime:` + strings.Replace(fmt.Sprintf("%v", this.AcquireTime), "MicroTime", "k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime", 1) + `,`, + `RenewTime:` + strings.Replace(fmt.Sprintf("%v", this.RenewTime), "MicroTime", "k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime", 1) + `,`, + `LeaseTransitions:` + valueToStringGenerated(this.LeaseTransitions) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Lease) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Lease: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Lease: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, Lease{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HolderIdentity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.HolderIdentity = &s + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LeaseDurationSeconds", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LeaseDurationSeconds = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AcquireTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AcquireTime == nil { + m.AcquireTime = &k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime{} + } + if err := m.AcquireTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RenewTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.RenewTime == nil { + m.RenewTime = &k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime{} + } + if err := m.RenewTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LeaseTransitions", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.LeaseTransitions = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipGenerated(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/coordination/v1beta1/generated.proto", fileDescriptorGenerated) +} + +var fileDescriptorGenerated = []byte{ + // 540 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x91, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0x86, 0xe3, 0xb6, 0x11, 0xcd, 0x86, 0x96, 0xc8, 0xca, 0xc1, 0xca, 0xc1, 0xae, 0x72, 0x40, + 0x15, 0x52, 0x77, 0x49, 0x85, 0x10, 0xe2, 0x04, 0x16, 0x87, 0x56, 0xb8, 0x42, 0x72, 0x7b, 0x42, + 0x3d, 0xb0, 0xb6, 0x07, 0x67, 0x49, 0xed, 0x35, 0xbb, 0xeb, 0xa0, 0xde, 0x78, 0x04, 0xae, 0xbc, + 0x08, 0xbc, 0x42, 0x8e, 0x3d, 0xf6, 0x64, 0x11, 0xf3, 0x22, 0xc8, 0x1b, 0xb7, 0x09, 0x49, 0x51, + 0x23, 0x6e, 0xde, 0x99, 0xf9, 0xbf, 0xf9, 0xe7, 0x37, 0x3a, 0x1a, 0xbd, 0x90, 0x98, 0x71, 0x32, + 0xca, 0x03, 0x10, 0x29, 0x28, 0x90, 0x64, 0x0c, 0x69, 0xc4, 0x05, 0xa9, 0x1b, 0x34, 0x63, 0x24, + 0xe4, 0x5c, 0x44, 0x2c, 0xa5, 0x8a, 0xf1, 0x94, 0x8c, 0x07, 0x01, 0x28, 0x3a, 0x20, 0x31, 0xa4, + 0x20, 0xa8, 0x82, 0x08, 0x67, 0x82, 0x2b, 0x6e, 0x3a, 0x33, 0x01, 0xa6, 0x19, 0xc3, 0x8b, 0x02, + 0x5c, 0x0b, 0x7a, 0x07, 0x31, 0x53, 0xc3, 0x3c, 0xc0, 0x21, 0x4f, 0x48, 0xcc, 0x63, 0x4e, 0xb4, + 0x2e, 0xc8, 0x3f, 0xea, 0x97, 0x7e, 0xe8, 0xaf, 0x19, 0xaf, 0xf7, 0x6c, 0x6e, 0x20, 0xa1, 0xe1, + 0x90, 0xa5, 0x20, 0x2e, 0x49, 0x36, 0x8a, 0xab, 0x82, 0x24, 0x09, 0x28, 0x4a, 0xc6, 0x2b, 0x2e, + 0x7a, 0xe4, 0x5f, 0x2a, 0x91, 0xa7, 0x8a, 0x25, 0xb0, 0x22, 0x78, 0x7e, 0x9f, 0x40, 0x86, 0x43, + 0x48, 0xe8, 0xb2, 0xae, 0xff, 0xd3, 0x40, 0x4d, 0x0f, 0xa8, 0x04, 0xf3, 0x03, 0xda, 0xae, 0xdc, + 0x44, 0x54, 0x51, 0xcb, 0xd8, 0x33, 0xf6, 0xdb, 0x87, 0x4f, 0xf1, 0x3c, 0x8b, 0x5b, 0x28, 0xce, + 0x46, 0x71, 0x55, 0x90, 0xb8, 0x9a, 0xc6, 0xe3, 0x01, 0x7e, 0x17, 0x7c, 0x82, 0x50, 0x9d, 0x80, + 0xa2, 0xae, 0x39, 0x29, 0x9c, 0x46, 0x59, 0x38, 0x68, 0x5e, 0xf3, 0x6f, 0xa9, 0xa6, 0x87, 0xb6, + 0x64, 0x06, 0xa1, 0xb5, 0xa1, 0xe9, 0x4f, 0xf0, 0x3d, 0x49, 0x63, 0xed, 0xeb, 0x34, 0x83, 0xd0, + 0x7d, 0x58, 0x73, 0xb7, 0xaa, 0x97, 0xaf, 0x29, 0xfd, 0x1f, 0x06, 0x6a, 0xe9, 0x09, 0x8f, 0x49, + 0x65, 0x9e, 0xaf, 0xb8, 0xc7, 0xeb, 0xb9, 0xaf, 0xd4, 0xda, 0x7b, 0xa7, 0xde, 0xb1, 0x7d, 0x53, + 0x59, 0x70, 0xfe, 0x16, 0x35, 0x99, 0x82, 0x44, 0x5a, 0x1b, 0x7b, 0x9b, 0xfb, 0xed, 0xc3, 0xc7, + 0xeb, 0x59, 0x77, 0x77, 0x6a, 0x64, 0xf3, 0xb8, 0x12, 0xfb, 0x33, 0x46, 0xff, 0xfb, 0x66, 0x6d, + 0xbc, 0x3a, 0xc6, 0x7c, 0x89, 0x76, 0x87, 0xfc, 0x22, 0x02, 0x71, 0x1c, 0x41, 0xaa, 0x98, 0xba, + 0xd4, 0xf6, 0x5b, 0xae, 0x59, 0x16, 0xce, 0xee, 0xd1, 0x5f, 0x1d, 0x7f, 0x69, 0xd2, 0xf4, 0x50, + 0xf7, 0xa2, 0x02, 0xbd, 0xc9, 0x85, 0x5e, 0x7f, 0x0a, 0x21, 0x4f, 0x23, 0xa9, 0x03, 0x6e, 0xba, + 0x56, 0x59, 0x38, 0x5d, 0xef, 0x8e, 0xbe, 0x7f, 0xa7, 0xca, 0x0c, 0x50, 0x9b, 0x86, 0x9f, 0x73, + 0x26, 0xe0, 0x8c, 0x25, 0x60, 0x6d, 0xea, 0x14, 0xc9, 0x7a, 0x29, 0x9e, 0xb0, 0x50, 0xf0, 0x4a, + 0xe6, 0x3e, 0x2a, 0x0b, 0xa7, 0xfd, 0x7a, 0xce, 0xf1, 0x17, 0xa1, 0xe6, 0x39, 0x6a, 0x09, 0x48, + 0xe1, 0x8b, 0xde, 0xb0, 0xf5, 0x7f, 0x1b, 0x76, 0xca, 0xc2, 0x69, 0xf9, 0x37, 0x14, 0x7f, 0x0e, + 0x34, 0x5f, 0xa1, 0x8e, 0xbe, 0xec, 0x4c, 0xd0, 0x54, 0xb2, 0xea, 0x36, 0x69, 0x35, 0x75, 0x16, + 0xdd, 0xb2, 0x70, 0x3a, 0xde, 0x52, 0xcf, 0x5f, 0x99, 0x76, 0x0f, 0x26, 0x53, 0xbb, 0x71, 0x35, + 0xb5, 0x1b, 0xd7, 0x53, 0xbb, 0xf1, 0xb5, 0xb4, 0x8d, 0x49, 0x69, 0x1b, 0x57, 0xa5, 0x6d, 0x5c, + 0x97, 0xb6, 0xf1, 0xab, 0xb4, 0x8d, 0x6f, 0xbf, 0xed, 0xc6, 0xfb, 0x07, 0xf5, 0x6f, 0xfe, 0x13, + 0x00, 0x00, 0xff, 0xff, 0x51, 0x34, 0x6a, 0x0f, 0x77, 0x04, 0x00, 0x00, +} diff --git a/vendor/k8s.io/api/coordination/v1beta1/generated.proto b/vendor/k8s.io/api/coordination/v1beta1/generated.proto new file mode 100644 index 00000000..918e0de1 --- /dev/null +++ b/vendor/k8s.io/api/coordination/v1beta1/generated.proto @@ -0,0 +1,80 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = 'proto2'; + +package k8s.io.api.coordination.v1beta1; + +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "v1beta1"; + +// Lease defines a lease concept. +message Lease { + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the Lease. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status + // +optional + optional LeaseSpec spec = 2; +} + +// LeaseList is a list of Lease objects. +message LeaseList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is a list of schema objects. + repeated Lease items = 2; +} + +// LeaseSpec is a specification of a Lease. +message LeaseSpec { + // holderIdentity contains the identity of the holder of a current lease. + // +optional + optional string holderIdentity = 1; + + // leaseDurationSeconds is a duration that candidates for a lease need + // to wait to force acquire it. This is measure against time of last + // observed RenewTime. + // +optional + optional int32 leaseDurationSeconds = 2; + + // acquireTime is a time when the current lease was acquired. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime acquireTime = 3; + + // renewTime is a time when the current holder of a lease has last + // updated the lease. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime renewTime = 4; + + // leaseTransitions is the number of transitions of a lease between + // holders. + // +optional + optional int32 leaseTransitions = 5; +} + diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/register.go b/vendor/k8s.io/api/coordination/v1beta1/register.go similarity index 77% rename from vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/register.go rename to vendor/k8s.io/api/coordination/v1beta1/register.go index 306ed8c3..85efaa64 100644 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/register.go +++ b/vendor/k8s.io/api/coordination/v1beta1/register.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1alpha1 +package v1beta1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -23,10 +23,10 @@ import ( ) // GroupName is the group name use in this package -const GroupName = "metrics.k8s.io" +const GroupName = "coordination.k8s.io" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} // Resource takes an unqualified resource and returns a Group qualified GroupResource func Resource(resource string) schema.GroupResource { @@ -34,18 +34,20 @@ func Resource(resource string) schema.GroupResource { } var ( + // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. + // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) localSchemeBuilder = &SchemeBuilder - AddToScheme = SchemeBuilder.AddToScheme + AddToScheme = localSchemeBuilder.AddToScheme ) +// Adds the list of known types to api.Scheme. func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, - &NodeMetrics{}, - &NodeMetricsList{}, - &PodMetrics{}, - &PodMetricsList{}, + &Lease{}, + &LeaseList{}, ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil } diff --git a/vendor/k8s.io/api/coordination/v1beta1/types.go b/vendor/k8s.io/api/coordination/v1beta1/types.go new file mode 100644 index 00000000..846f7280 --- /dev/null +++ b/vendor/k8s.io/api/coordination/v1beta1/types.go @@ -0,0 +1,74 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Lease defines a lease concept. +type Lease struct { + metav1.TypeMeta `json:",inline"` + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Specification of the Lease. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status + // +optional + Spec LeaseSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` +} + +// LeaseSpec is a specification of a Lease. +type LeaseSpec struct { + // holderIdentity contains the identity of the holder of a current lease. + // +optional + HolderIdentity *string `json:"holderIdentity,omitempty" protobuf:"bytes,1,opt,name=holderIdentity"` + // leaseDurationSeconds is a duration that candidates for a lease need + // to wait to force acquire it. This is measure against time of last + // observed RenewTime. + // +optional + LeaseDurationSeconds *int32 `json:"leaseDurationSeconds,omitempty" protobuf:"varint,2,opt,name=leaseDurationSeconds"` + // acquireTime is a time when the current lease was acquired. + // +optional + AcquireTime *metav1.MicroTime `json:"acquireTime,omitempty" protobuf:"bytes,3,opt,name=acquireTime"` + // renewTime is a time when the current holder of a lease has last + // updated the lease. + // +optional + RenewTime *metav1.MicroTime `json:"renewTime,omitempty" protobuf:"bytes,4,opt,name=renewTime"` + // leaseTransitions is the number of transitions of a lease between + // holders. + // +optional + LeaseTransitions *int32 `json:"leaseTransitions,omitempty" protobuf:"varint,5,opt,name=leaseTransitions"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// LeaseList is a list of Lease objects. +type LeaseList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is a list of schema objects. + Items []Lease `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/coordination/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/coordination/v1beta1/types_swagger_doc_generated.go new file mode 100644 index 00000000..4532d322 --- /dev/null +++ b/vendor/k8s.io/api/coordination/v1beta1/types_swagger_doc_generated.go @@ -0,0 +1,63 @@ +/* +Copyright The Kubernetes Authors. + +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 v1beta1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_Lease = map[string]string{ + "": "Lease defines a lease concept.", + "metadata": "More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "spec": "Specification of the Lease. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status", +} + +func (Lease) SwaggerDoc() map[string]string { + return map_Lease +} + +var map_LeaseList = map[string]string{ + "": "LeaseList is a list of Lease objects.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "items": "Items is a list of schema objects.", +} + +func (LeaseList) SwaggerDoc() map[string]string { + return map_LeaseList +} + +var map_LeaseSpec = map[string]string{ + "": "LeaseSpec is a specification of a Lease.", + "holderIdentity": "holderIdentity contains the identity of the holder of a current lease.", + "leaseDurationSeconds": "leaseDurationSeconds is a duration that candidates for a lease need to wait to force acquire it. This is measure against time of last observed RenewTime.", + "acquireTime": "acquireTime is a time when the current lease was acquired.", + "renewTime": "renewTime is a time when the current holder of a lease has last updated the lease.", + "leaseTransitions": "leaseTransitions is the number of transitions of a lease between holders.", +} + +func (LeaseSpec) SwaggerDoc() map[string]string { + return map_LeaseSpec +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/coordination/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/coordination/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 00000000..a628ac19 --- /dev/null +++ b/vendor/k8s.io/api/coordination/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,124 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1beta1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Lease) DeepCopyInto(out *Lease) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Lease. +func (in *Lease) DeepCopy() *Lease { + if in == nil { + return nil + } + out := new(Lease) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Lease) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LeaseList) DeepCopyInto(out *LeaseList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Lease, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaseList. +func (in *LeaseList) DeepCopy() *LeaseList { + if in == nil { + return nil + } + out := new(LeaseList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *LeaseList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LeaseSpec) DeepCopyInto(out *LeaseSpec) { + *out = *in + if in.HolderIdentity != nil { + in, out := &in.HolderIdentity, &out.HolderIdentity + *out = new(string) + **out = **in + } + if in.LeaseDurationSeconds != nil { + in, out := &in.LeaseDurationSeconds, &out.LeaseDurationSeconds + *out = new(int32) + **out = **in + } + if in.AcquireTime != nil { + in, out := &in.AcquireTime, &out.AcquireTime + *out = (*in).DeepCopy() + } + if in.RenewTime != nil { + in, out := &in.RenewTime, &out.RenewTime + *out = (*in).DeepCopy() + } + if in.LeaseTransitions != nil { + in, out := &in.LeaseTransitions, &out.LeaseTransitions + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaseSpec. +func (in *LeaseSpec) DeepCopy() *LeaseSpec { + if in == nil { + return nil + } + out := new(LeaseSpec) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/core/v1/BUILD b/vendor/k8s.io/api/core/v1/BUILD index 369c7e42..b4b965ad 100644 --- a/vendor/k8s.io/api/core/v1/BUILD +++ b/vendor/k8s.io/api/core/v1/BUILD @@ -30,16 +30,17 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/core/v1", importpath = "k8s.io/api/core/v1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -55,9 +56,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/core/v1/generated.pb.go b/vendor/k8s.io/api/core/v1/generated.pb.go index 48b5a3c5..b569ea84 100644 --- a/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/vendor/k8s.io/api/core/v1/generated.pb.go @@ -211,6 +211,7 @@ limitations under the License. Toleration TopologySelectorLabelRequirement TopologySelectorTerm + TypedLocalObjectReference Volume VolumeDevice VolumeMount @@ -1056,40 +1057,46 @@ func (m *TopologySelectorTerm) Reset() { *m = TopologySelecto func (*TopologySelectorTerm) ProtoMessage() {} func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{185} } +func (m *TypedLocalObjectReference) Reset() { *m = TypedLocalObjectReference{} } +func (*TypedLocalObjectReference) ProtoMessage() {} +func (*TypedLocalObjectReference) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{186} +} + func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{186} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} } func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} -func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} } +func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{188} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{188} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{189} } func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} -func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{189} } +func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{190} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{190} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{191} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{191} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{192} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{192} + return fileDescriptorGenerated, []int{193} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{193} + return fileDescriptorGenerated, []int{194} } func init() { @@ -1279,6 +1286,7 @@ func init() { proto.RegisterType((*Toleration)(nil), "k8s.io.api.core.v1.Toleration") proto.RegisterType((*TopologySelectorLabelRequirement)(nil), "k8s.io.api.core.v1.TopologySelectorLabelRequirement") proto.RegisterType((*TopologySelectorTerm)(nil), "k8s.io.api.core.v1.TopologySelectorTerm") + proto.RegisterType((*TypedLocalObjectReference)(nil), "k8s.io.api.core.v1.TypedLocalObjectReference") proto.RegisterType((*Volume)(nil), "k8s.io.api.core.v1.Volume") proto.RegisterType((*VolumeDevice)(nil), "k8s.io.api.core.v1.VolumeDevice") proto.RegisterType((*VolumeMount)(nil), "k8s.io.api.core.v1.VolumeMount") @@ -4831,6 +4839,12 @@ func (m *LocalVolumeSource) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) i += copy(dAtA[i:], m.Path) + if m.FSType != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.FSType))) + i += copy(dAtA[i:], *m.FSType) + } return i, nil } @@ -6088,6 +6102,16 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VolumeMode))) i += copy(dAtA[i:], *m.VolumeMode) } + if m.DataSource != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.DataSource.Size())) + n110, err := m.DataSource.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n110 + } return i, nil } @@ -6149,11 +6173,11 @@ func (m *PersistentVolumeClaimStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n110, err := (&v).MarshalTo(dAtA[i:]) + n111, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n110 + i += n111 } } if len(m.Conditions) > 0 { @@ -6219,11 +6243,11 @@ func (m *PersistentVolumeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n111, err := m.ListMeta.MarshalTo(dAtA[i:]) + n112, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n111 + i += n112 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6258,151 +6282,151 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n112, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n113, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n112 + i += n113 } if m.AWSElasticBlockStore != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n113, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + n114, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n113 + i += n114 } if m.HostPath != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n114, err := m.HostPath.MarshalTo(dAtA[i:]) + n115, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n114 + i += n115 } if m.Glusterfs != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n115, err := m.Glusterfs.MarshalTo(dAtA[i:]) + n116, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n115 + i += n116 } if m.NFS != nil { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n116, err := m.NFS.MarshalTo(dAtA[i:]) + n117, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n116 + i += n117 } if m.RBD != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n117, err := m.RBD.MarshalTo(dAtA[i:]) + n118, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n117 + i += n118 } if m.ISCSI != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n118, err := m.ISCSI.MarshalTo(dAtA[i:]) + n119, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n118 + i += n119 } if m.Cinder != nil { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n119, err := m.Cinder.MarshalTo(dAtA[i:]) + n120, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n119 + i += n120 } if m.CephFS != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n120, err := m.CephFS.MarshalTo(dAtA[i:]) + n121, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n120 + i += n121 } if m.FC != nil { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n121, err := m.FC.MarshalTo(dAtA[i:]) + n122, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n121 + i += n122 } if m.Flocker != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n122, err := m.Flocker.MarshalTo(dAtA[i:]) + n123, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n122 + i += n123 } if m.FlexVolume != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n123, err := m.FlexVolume.MarshalTo(dAtA[i:]) + n124, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n123 + i += n124 } if m.AzureFile != nil { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n124, err := m.AzureFile.MarshalTo(dAtA[i:]) + n125, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n124 + i += n125 } if m.VsphereVolume != nil { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n125, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n126, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n125 + i += n126 } if m.Quobyte != nil { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n126, err := m.Quobyte.MarshalTo(dAtA[i:]) + n127, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n126 + i += n127 } if m.AzureDisk != nil { dAtA[i] = 0x82 @@ -6410,11 +6434,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n127, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n128, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n127 + i += n128 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0x8a @@ -6422,11 +6446,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n128, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n129, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n128 + i += n129 } if m.PortworxVolume != nil { dAtA[i] = 0x92 @@ -6434,11 +6458,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n129, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n130, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n129 + i += n130 } if m.ScaleIO != nil { dAtA[i] = 0x9a @@ -6446,11 +6470,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n130, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n131, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n130 + i += n131 } if m.Local != nil { dAtA[i] = 0xa2 @@ -6458,11 +6482,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Local.Size())) - n131, err := m.Local.MarshalTo(dAtA[i:]) + n132, err := m.Local.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n131 + i += n132 } if m.StorageOS != nil { dAtA[i] = 0xaa @@ -6470,11 +6494,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n132, err := m.StorageOS.MarshalTo(dAtA[i:]) + n133, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n132 + i += n133 } if m.CSI != nil { dAtA[i] = 0xb2 @@ -6482,11 +6506,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CSI.Size())) - n133, err := m.CSI.MarshalTo(dAtA[i:]) + n134, err := m.CSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n133 + i += n134 } return i, nil } @@ -6530,21 +6554,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n134, err := (&v).MarshalTo(dAtA[i:]) + n135, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n134 + i += n135 } } dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size())) - n135, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) + n136, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n135 + i += n136 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { dAtA[i] = 0x1a @@ -6564,11 +6588,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size())) - n136, err := m.ClaimRef.MarshalTo(dAtA[i:]) + n137, err := m.ClaimRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n136 + i += n137 } dAtA[i] = 0x2a i++ @@ -6603,11 +6627,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodeAffinity.Size())) - n137, err := m.NodeAffinity.MarshalTo(dAtA[i:]) + n138, err := m.NodeAffinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n137 + i += n138 } return i, nil } @@ -6686,27 +6710,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n138, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n139, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n138 + i += n139 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n139, err := m.Spec.MarshalTo(dAtA[i:]) + n140, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n139 + i += n140 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n140, err := m.Status.MarshalTo(dAtA[i:]) + n141, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n140 + i += n141 return i, nil } @@ -6771,11 +6795,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size())) - n141, err := m.LabelSelector.MarshalTo(dAtA[i:]) + n142, err := m.LabelSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n141 + i += n142 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -6921,19 +6945,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) - n142, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + n143, err := m.LastProbeTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n142 + i += n143 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n143, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n144, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n143 + i += n144 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7120,11 +7144,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n144, err := m.ListMeta.MarshalTo(dAtA[i:]) + n145, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n144 + i += n145 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7184,11 +7208,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size())) - n145, err := m.SinceTime.MarshalTo(dAtA[i:]) + n146, err := m.SinceTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n145 + i += n146 } dAtA[i] = 0x30 i++ @@ -7299,11 +7323,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n146, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n147, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n146 + i += n147 } if m.RunAsUser != nil { dAtA[i] = 0x10 @@ -7371,11 +7395,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size())) - n147, err := m.PodController.MarshalTo(dAtA[i:]) + n148, err := m.PodController.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n147 + i += n148 } return i, nil } @@ -7499,11 +7523,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n148, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n149, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n148 + i += n149 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -7535,11 +7559,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size())) - n149, err := m.Affinity.MarshalTo(dAtA[i:]) + n150, err := m.Affinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n149 + i += n150 } dAtA[i] = 0x9a i++ @@ -7620,11 +7644,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DNSConfig.Size())) - n150, err := m.DNSConfig.MarshalTo(dAtA[i:]) + n151, err := m.DNSConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n150 + i += n151 } if m.ShareProcessNamespace != nil { dAtA[i] = 0xd8 @@ -7652,6 +7676,14 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { i += n } } + if m.RuntimeClassName != nil { + dAtA[i] = 0xea + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.RuntimeClassName))) + i += copy(dAtA[i:], *m.RuntimeClassName) + } return i, nil } @@ -7706,11 +7738,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n151, err := m.StartTime.MarshalTo(dAtA[i:]) + n152, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n151 + i += n152 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -7765,19 +7797,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n152, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n153, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n152 + i += n153 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n153, err := m.Status.MarshalTo(dAtA[i:]) + n154, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n153 + i += n154 return i, nil } @@ -7799,19 +7831,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n154, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n155, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n154 + i += n155 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n155, err := m.Template.MarshalTo(dAtA[i:]) + n156, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n155 + i += n156 return i, nil } @@ -7833,11 +7865,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n156, err := m.ListMeta.MarshalTo(dAtA[i:]) + n157, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n156 + i += n157 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7871,19 +7903,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n157, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n158, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n157 + i += n158 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n158, err := m.Spec.MarshalTo(dAtA[i:]) + n159, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n158 + i += n159 return i, nil } @@ -7963,19 +7995,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size())) - n159, err := m.PodSignature.MarshalTo(dAtA[i:]) + n160, err := m.PodSignature.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n159 + i += n160 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size())) - n160, err := m.EvictionTime.MarshalTo(dAtA[i:]) + n161, err := m.EvictionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n160 + i += n161 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -8008,11 +8040,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size())) - n161, err := m.Preference.MarshalTo(dAtA[i:]) + n162, err := m.Preference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n161 + i += n162 return i, nil } @@ -8034,11 +8066,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size())) - n162, err := m.Handler.MarshalTo(dAtA[i:]) + n163, err := m.Handler.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n162 + i += n163 dAtA[i] = 0x10 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds)) @@ -8188,11 +8220,11 @@ func (m *RBDPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n163, err := m.SecretRef.MarshalTo(dAtA[i:]) + n164, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n163 + i += n164 } dAtA[i] = 0x40 i++ @@ -8259,11 +8291,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n164, err := m.SecretRef.MarshalTo(dAtA[i:]) + n165, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n164 + i += n165 } dAtA[i] = 0x40 i++ @@ -8294,11 +8326,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n165, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n166, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n165 + i += n166 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range))) @@ -8330,27 +8362,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n166, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n167, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n166 + i += n167 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n167, err := m.Spec.MarshalTo(dAtA[i:]) + n168, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n167 + i += n168 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n168, err := m.Status.MarshalTo(dAtA[i:]) + n169, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n168 + i += n169 return i, nil } @@ -8380,11 +8412,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n169, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n170, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n169 + i += n170 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -8414,11 +8446,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n170, err := m.ListMeta.MarshalTo(dAtA[i:]) + n171, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n170 + i += n171 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8480,11 +8512,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n171, err := m.Template.MarshalTo(dAtA[i:]) + n172, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n171 + i += n172 } dAtA[i] = 0x20 i++ @@ -8563,11 +8595,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size())) - n172, err := m.Divisor.MarshalTo(dAtA[i:]) + n173, err := m.Divisor.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n172 + i += n173 return i, nil } @@ -8589,27 +8621,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n173, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n174, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n173 + i += n174 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n174, err := m.Spec.MarshalTo(dAtA[i:]) + n175, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n174 + i += n175 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n175, err := m.Status.MarshalTo(dAtA[i:]) + n176, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n175 + i += n176 return i, nil } @@ -8631,11 +8663,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n176, err := m.ListMeta.MarshalTo(dAtA[i:]) + n177, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n176 + i += n177 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8690,11 +8722,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n177, err := (&v).MarshalTo(dAtA[i:]) + n178, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n177 + i += n178 } } if len(m.Scopes) > 0 { @@ -8716,11 +8748,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScopeSelector.Size())) - n178, err := m.ScopeSelector.MarshalTo(dAtA[i:]) + n179, err := m.ScopeSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n179 } return i, nil } @@ -8764,11 +8796,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n179, err := (&v).MarshalTo(dAtA[i:]) + n180, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n180 } } if len(m.Used) > 0 { @@ -8795,11 +8827,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n180, err := (&v).MarshalTo(dAtA[i:]) + n181, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n181 } } return i, nil @@ -8844,11 +8876,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n181, err := (&v).MarshalTo(dAtA[i:]) + n182, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n182 } } if len(m.Requests) > 0 { @@ -8875,11 +8907,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n182, err := (&v).MarshalTo(dAtA[i:]) + n183, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n183 } } return i, nil @@ -8946,11 +8978,11 @@ func (m *ScaleIOPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n183, err := m.SecretRef.MarshalTo(dAtA[i:]) + n184, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n184 } dAtA[i] = 0x20 i++ @@ -9018,11 +9050,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n184, err := m.SecretRef.MarshalTo(dAtA[i:]) + n185, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n185 } dAtA[i] = 0x20 i++ @@ -9152,11 +9184,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n185, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n186, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n186 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -9232,11 +9264,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n186, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n187, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n187 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -9268,11 +9300,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n187, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n188, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n188 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -9308,11 +9340,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n188, err := m.ListMeta.MarshalTo(dAtA[i:]) + n189, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n189 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9346,11 +9378,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n189, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n190, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n190 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9470,11 +9502,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n190, err := m.Capabilities.MarshalTo(dAtA[i:]) + n191, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n191 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -9490,11 +9522,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n191, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n192, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n192 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -9536,6 +9568,12 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(*m.RunAsGroup)) } + if m.ProcMount != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ProcMount))) + i += copy(dAtA[i:], *m.ProcMount) + } return i, nil } @@ -9557,11 +9595,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n192, err := m.Reference.MarshalTo(dAtA[i:]) + n193, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n192 + i += n193 return i, nil } @@ -9583,27 +9621,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n193, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n194, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n193 + i += n194 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n194, err := m.Spec.MarshalTo(dAtA[i:]) + n195, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n194 + i += n195 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n195, err := m.Status.MarshalTo(dAtA[i:]) + n196, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n195 + i += n196 return i, nil } @@ -9625,11 +9663,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n196, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n197, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n196 + i += n197 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -9685,11 +9723,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n197, err := m.ListMeta.MarshalTo(dAtA[i:]) + n198, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n197 + i += n198 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9754,11 +9792,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n198, err := m.ListMeta.MarshalTo(dAtA[i:]) + n199, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n198 + i += n199 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9803,11 +9841,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n199, err := m.TargetPort.MarshalTo(dAtA[i:]) + n200, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n199 + i += n200 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -9954,11 +9992,11 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size())) - n200, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) + n201, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n200 + i += n201 } return i, nil } @@ -9981,11 +10019,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n201, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n202, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n201 + i += n202 return i, nil } @@ -10008,11 +10046,11 @@ func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size())) - n202, err := m.ClientIP.MarshalTo(dAtA[i:]) + n203, err := m.ClientIP.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n203 } return i, nil } @@ -10056,11 +10094,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n203, err := m.SecretRef.MarshalTo(dAtA[i:]) + n204, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n204 } return i, nil } @@ -10104,11 +10142,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n204, err := m.SecretRef.MarshalTo(dAtA[i:]) + n205, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n205 } return i, nil } @@ -10157,11 +10195,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n205, err := m.Port.MarshalTo(dAtA[i:]) + n206, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n206 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -10200,11 +10238,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n206, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n207, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n207 } return i, nil } @@ -10315,6 +10353,38 @@ func (m *TopologySelectorTerm) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *TypedLocalObjectReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TypedLocalObjectReference) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.APIGroup != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.APIGroup))) + i += copy(dAtA[i:], *m.APIGroup) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Kind))) + i += copy(dAtA[i:], m.Kind) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + return i, nil +} + func (m *Volume) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10337,11 +10407,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n207, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n208, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n208 return i, nil } @@ -10434,11 +10504,11 @@ func (m *VolumeNodeAffinity) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Required.Size())) - n208, err := m.Required.MarshalTo(dAtA[i:]) + n209, err := m.Required.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n209 } return i, nil } @@ -10462,41 +10532,41 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n209, err := m.Secret.MarshalTo(dAtA[i:]) + n210, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n209 + i += n210 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n210, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n211, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n210 + i += n211 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n211, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n212, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n211 + i += n212 } if m.ServiceAccountToken != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ServiceAccountToken.Size())) - n212, err := m.ServiceAccountToken.MarshalTo(dAtA[i:]) + n213, err := m.ServiceAccountToken.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n212 + i += n213 } return i, nil } @@ -10520,151 +10590,151 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n213, err := m.HostPath.MarshalTo(dAtA[i:]) + n214, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n213 + i += n214 } if m.EmptyDir != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n214, err := m.EmptyDir.MarshalTo(dAtA[i:]) + n215, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n214 + i += n215 } if m.GCEPersistentDisk != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n215, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n216, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n215 + i += n216 } if m.AWSElasticBlockStore != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n216, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + n217, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n216 + i += n217 } if m.GitRepo != nil { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n217, err := m.GitRepo.MarshalTo(dAtA[i:]) + n218, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n217 + i += n218 } if m.Secret != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n218, err := m.Secret.MarshalTo(dAtA[i:]) + n219, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n218 + i += n219 } if m.NFS != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n219, err := m.NFS.MarshalTo(dAtA[i:]) + n220, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n219 + i += n220 } if m.ISCSI != nil { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n220, err := m.ISCSI.MarshalTo(dAtA[i:]) + n221, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n220 + i += n221 } if m.Glusterfs != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n221, err := m.Glusterfs.MarshalTo(dAtA[i:]) + n222, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n221 + i += n222 } if m.PersistentVolumeClaim != nil { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n222, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + n223, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n222 + i += n223 } if m.RBD != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n223, err := m.RBD.MarshalTo(dAtA[i:]) + n224, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n223 + i += n224 } if m.FlexVolume != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n224, err := m.FlexVolume.MarshalTo(dAtA[i:]) + n225, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n224 + i += n225 } if m.Cinder != nil { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n225, err := m.Cinder.MarshalTo(dAtA[i:]) + n226, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n225 + i += n226 } if m.CephFS != nil { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n226, err := m.CephFS.MarshalTo(dAtA[i:]) + n227, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n226 + i += n227 } if m.Flocker != nil { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n227, err := m.Flocker.MarshalTo(dAtA[i:]) + n228, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n227 + i += n228 } if m.DownwardAPI != nil { dAtA[i] = 0x82 @@ -10672,11 +10742,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n228, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n229, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n228 + i += n229 } if m.FC != nil { dAtA[i] = 0x8a @@ -10684,11 +10754,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n229, err := m.FC.MarshalTo(dAtA[i:]) + n230, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n229 + i += n230 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -10696,11 +10766,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n230, err := m.AzureFile.MarshalTo(dAtA[i:]) + n231, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n230 + i += n231 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -10708,11 +10778,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n231, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n232, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n231 + i += n232 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -10720,11 +10790,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n232, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n233, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n232 + i += n233 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -10732,11 +10802,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n233, err := m.Quobyte.MarshalTo(dAtA[i:]) + n234, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n233 + i += n234 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -10744,11 +10814,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n234, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n235, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n234 + i += n235 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -10756,11 +10826,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n235, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n236, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n235 + i += n236 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -10768,11 +10838,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n236, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n237, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n236 + i += n237 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -10780,11 +10850,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n237, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n238, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n237 + i += n238 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -10792,11 +10862,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n238, err := m.Projected.MarshalTo(dAtA[i:]) + n239, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n238 + i += n239 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -10804,11 +10874,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n239, err := m.StorageOS.MarshalTo(dAtA[i:]) + n240, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n239 + i += n240 } return i, nil } @@ -10868,11 +10938,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n240, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n241, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n240 + i += n241 return i, nil } @@ -12197,6 +12267,10 @@ func (m *LocalVolumeSource) Size() (n int) { _ = l l = len(m.Path) n += 1 + l + sovGenerated(uint64(l)) + if m.FSType != nil { + l = len(*m.FSType) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12658,6 +12732,10 @@ func (m *PersistentVolumeClaimSpec) Size() (n int) { l = len(*m.VolumeMode) n += 1 + l + sovGenerated(uint64(l)) } + if m.DataSource != nil { + l = m.DataSource.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -13233,6 +13311,10 @@ func (m *PodSpec) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if m.RuntimeClassName != nil { + l = len(*m.RuntimeClassName) + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -13907,6 +13989,10 @@ func (m *SecurityContext) Size() (n int) { if m.RunAsGroup != nil { n += 1 + sovGenerated(uint64(*m.RunAsGroup)) } + if m.ProcMount != nil { + l = len(*m.ProcMount) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -14197,6 +14283,20 @@ func (m *TopologySelectorTerm) Size() (n int) { return n } +func (m *TypedLocalObjectReference) Size() (n int) { + var l int + _ = l + if m.APIGroup != nil { + l = len(*m.APIGroup) + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Kind) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *Volume) Size() (n int) { var l int _ = l @@ -15474,6 +15574,7 @@ func (this *LocalVolumeSource) String() string { } s := strings.Join([]string{`&LocalVolumeSource{`, `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `FSType:` + valueToStringGenerated(this.FSType) + `,`, `}`, }, "") return s @@ -15851,6 +15952,7 @@ func (this *PersistentVolumeClaimSpec) String() string { `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, `StorageClassName:` + valueToStringGenerated(this.StorageClassName) + `,`, `VolumeMode:` + valueToStringGenerated(this.VolumeMode) + `,`, + `DataSource:` + strings.Replace(fmt.Sprintf("%v", this.DataSource), "TypedLocalObjectReference", "TypedLocalObjectReference", 1) + `,`, `}`, }, "") return s @@ -16222,6 +16324,7 @@ func (this *PodSpec) String() string { `DNSConfig:` + strings.Replace(fmt.Sprintf("%v", this.DNSConfig), "PodDNSConfig", "PodDNSConfig", 1) + `,`, `ShareProcessNamespace:` + valueToStringGenerated(this.ShareProcessNamespace) + `,`, `ReadinessGates:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ReadinessGates), "PodReadinessGate", "PodReadinessGate", 1), `&`, ``, 1) + `,`, + `RuntimeClassName:` + valueToStringGenerated(this.RuntimeClassName) + `,`, `}`, }, "") return s @@ -16805,6 +16908,7 @@ func (this *SecurityContext) String() string { `ReadOnlyRootFilesystem:` + valueToStringGenerated(this.ReadOnlyRootFilesystem) + `,`, `AllowPrivilegeEscalation:` + valueToStringGenerated(this.AllowPrivilegeEscalation) + `,`, `RunAsGroup:` + valueToStringGenerated(this.RunAsGroup) + `,`, + `ProcMount:` + valueToStringGenerated(this.ProcMount) + `,`, `}`, }, "") return s @@ -17052,6 +17156,18 @@ func (this *TopologySelectorTerm) String() string { }, "") return s } +func (this *TypedLocalObjectReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TypedLocalObjectReference{`, + `APIGroup:` + valueToStringGenerated(this.APIGroup) + `,`, + `Kind:` + fmt.Sprintf("%v", this.Kind) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} func (this *Volume) String() string { if this == nil { return "nil" @@ -29718,6 +29834,36 @@ func (m *LocalVolumeSource) Unmarshal(dAtA []byte) error { } m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FSType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.FSType = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -34086,13 +34232,75 @@ func (m *PersistentVolumeClaimSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Resources.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Resources.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VolumeName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StorageClassName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -34117,44 +34325,12 @@ func (m *PersistentVolumeClaimSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.VolumeName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Selector", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Selector == nil { - m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} - } - if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := string(dAtA[iNdEx:postIndex]) + m.StorageClassName = &s iNdEx = postIndex - case 5: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StorageClassName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field VolumeMode", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -34179,14 +34355,14 @@ func (m *PersistentVolumeClaimSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - s := string(dAtA[iNdEx:postIndex]) - m.StorageClassName = &s + s := PersistentVolumeMode(dAtA[iNdEx:postIndex]) + m.VolumeMode = &s iNdEx = postIndex - case 6: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VolumeMode", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DataSource", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -34196,21 +34372,24 @@ func (m *PersistentVolumeClaimSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - s := PersistentVolumeMode(dAtA[iNdEx:postIndex]) - m.VolumeMode = &s + if m.DataSource == nil { + m.DataSource = &TypedLocalObjectReference{} + } + if err := m.DataSource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -39300,6 +39479,36 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 29: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuntimeClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.RuntimeClassName = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -46169,6 +46378,36 @@ func (m *SecurityContext) Unmarshal(dAtA []byte) error { } } m.RunAsGroup = &v + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProcMount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ProcMountType(dAtA[iNdEx:postIndex]) + m.ProcMount = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -48984,6 +49223,144 @@ func (m *TopologySelectorTerm) Unmarshal(dAtA []byte) error { } return nil } +func (m *TypedLocalObjectReference) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TypedLocalObjectReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TypedLocalObjectReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.APIGroup = &s + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Volume) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -50969,799 +51346,804 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 12696 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x6c, 0x24, 0x57, - 0x76, 0x18, 0xbc, 0xd5, 0xdd, 0x7c, 0xf4, 0xe1, 0xfb, 0xce, 0x70, 0xc4, 0xa1, 0x34, 0xd3, 0xa3, - 0xd2, 0xee, 0x68, 0xb4, 0x92, 0xc8, 0xd5, 0x48, 0x5a, 0xc9, 0xab, 0x5d, 0xd9, 0x24, 0x9b, 0x9c, - 0xa1, 0x66, 0xc8, 0x69, 0xdd, 0xe6, 0x8c, 0x76, 0x65, 0xed, 0x7a, 0x8b, 0xdd, 0x97, 0x64, 0x89, - 0xc5, 0xaa, 0x56, 0x55, 0x35, 0x67, 0xa8, 0xcf, 0x06, 0xbe, 0xac, 0x63, 0x27, 0x7e, 0x20, 0x58, - 0xc4, 0x46, 0x1e, 0xb6, 0xe1, 0x00, 0x8e, 0x03, 0xdb, 0x71, 0x12, 0xc4, 0xb1, 0x63, 0x3b, 0xbb, - 0x76, 0xe2, 0x38, 0xf9, 0xe1, 0xfc, 0xd9, 0x38, 0x01, 0x82, 0x35, 0x60, 0x84, 0xb1, 0x69, 0x27, - 0x81, 0x7f, 0xe4, 0x81, 0x38, 0x7f, 0xcc, 0x18, 0x71, 0x70, 0x9f, 0x75, 0x6f, 0x75, 0x55, 0x77, - 0x73, 0xc4, 0xa1, 0x64, 0x63, 0xff, 0x75, 0xdf, 0x73, 0xee, 0xb9, 0xb7, 0xee, 0xf3, 0x9c, 0x73, - 0xcf, 0x03, 0x5e, 0xdb, 0x7d, 0x35, 0x9a, 0x73, 0x83, 0xf9, 0xdd, 0xf6, 0x26, 0x09, 0x7d, 0x12, - 0x93, 0x68, 0x7e, 0x9f, 0xf8, 0xcd, 0x20, 0x9c, 0x17, 0x00, 0xa7, 0xe5, 0xce, 0x37, 0x82, 0x90, - 0xcc, 0xef, 0xbf, 0x30, 0xbf, 0x4d, 0x7c, 0x12, 0x3a, 0x31, 0x69, 0xce, 0xb5, 0xc2, 0x20, 0x0e, - 0x10, 0xe2, 0x38, 0x73, 0x4e, 0xcb, 0x9d, 0xa3, 0x38, 0x73, 0xfb, 0x2f, 0xcc, 0x3e, 0xbf, 0xed, - 0xc6, 0x3b, 0xed, 0xcd, 0xb9, 0x46, 0xb0, 0x37, 0xbf, 0x1d, 0x6c, 0x07, 0xf3, 0x0c, 0x75, 0xb3, - 0xbd, 0xc5, 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x27, 0x31, 0xbb, 0x96, 0x34, 0x43, 0x1e, 0xc4, 0xc4, - 0x8f, 0xdc, 0xc0, 0x8f, 0x9e, 0x77, 0x5a, 0x6e, 0x44, 0xc2, 0x7d, 0x12, 0xce, 0xb7, 0x76, 0xb7, - 0x29, 0x2c, 0x32, 0x11, 0xe6, 0xf7, 0x5f, 0xd8, 0x24, 0xb1, 0xd3, 0xd1, 0xa3, 0xd9, 0x97, 0x12, - 0x72, 0x7b, 0x4e, 0x63, 0xc7, 0xf5, 0x49, 0x78, 0x20, 0x69, 0xcc, 0x87, 0x24, 0x0a, 0xda, 0x61, - 0x83, 0x9c, 0xa8, 0x56, 0x34, 0xbf, 0x47, 0x62, 0x27, 0xe3, 0xeb, 0x67, 0xe7, 0xf3, 0x6a, 0x85, - 0x6d, 0x3f, 0x76, 0xf7, 0x3a, 0x9b, 0xf9, 0x74, 0xaf, 0x0a, 0x51, 0x63, 0x87, 0xec, 0x39, 0x1d, - 0xf5, 0x5e, 0xcc, 0xab, 0xd7, 0x8e, 0x5d, 0x6f, 0xde, 0xf5, 0xe3, 0x28, 0x0e, 0xd3, 0x95, 0xec, - 0x6f, 0x5a, 0x70, 0x65, 0xe1, 0xad, 0xfa, 0xb2, 0xe7, 0x44, 0xb1, 0xdb, 0x58, 0xf4, 0x82, 0xc6, - 0x6e, 0x3d, 0x0e, 0x42, 0x72, 0x2f, 0xf0, 0xda, 0x7b, 0xa4, 0xce, 0x06, 0x02, 0x3d, 0x07, 0xc3, - 0xfb, 0xec, 0xff, 0x6a, 0x75, 0xc6, 0xba, 0x62, 0x5d, 0x2b, 0x2f, 0x4e, 0xfe, 0xd6, 0x61, 0xe5, - 0x63, 0x47, 0x87, 0x95, 0xe1, 0x7b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x15, 0x06, 0xb7, 0xa2, 0x8d, - 0x83, 0x16, 0x99, 0x29, 0x30, 0xdc, 0x71, 0x81, 0x3b, 0xb8, 0x52, 0xa7, 0xa5, 0x58, 0x40, 0xd1, - 0x3c, 0x94, 0x5b, 0x4e, 0x18, 0xbb, 0xb1, 0x1b, 0xf8, 0x33, 0xc5, 0x2b, 0xd6, 0xb5, 0x81, 0xc5, - 0x29, 0x81, 0x5a, 0xae, 0x49, 0x00, 0x4e, 0x70, 0x68, 0x37, 0x42, 0xe2, 0x34, 0xef, 0xf8, 0xde, - 0xc1, 0x4c, 0xe9, 0x8a, 0x75, 0x6d, 0x38, 0xe9, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0x3f, 0x56, - 0x80, 0xe1, 0x85, 0xad, 0x2d, 0xd7, 0x77, 0xe3, 0x03, 0x74, 0x0f, 0x46, 0xfd, 0xa0, 0x49, 0xe4, - 0x7f, 0xf6, 0x15, 0x23, 0xd7, 0xaf, 0xcc, 0x75, 0xae, 0xcc, 0xb9, 0x75, 0x0d, 0x6f, 0x71, 0xf2, - 0xe8, 0xb0, 0x32, 0xaa, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xd2, 0x0a, 0x9a, 0x8a, 0x6c, 0x81, - 0x91, 0xad, 0x64, 0x91, 0xad, 0x25, 0x68, 0x8b, 0x13, 0x47, 0x87, 0x95, 0x11, 0xad, 0x00, 0xeb, - 0x44, 0xd0, 0x26, 0x4c, 0xd0, 0xbf, 0x7e, 0xec, 0x2a, 0xba, 0x45, 0x46, 0xf7, 0xa9, 0x3c, 0xba, - 0x1a, 0xea, 0xe2, 0xb9, 0xa3, 0xc3, 0xca, 0x44, 0xaa, 0x10, 0xa7, 0x09, 0xda, 0xef, 0xc3, 0xf8, - 0x42, 0x1c, 0x3b, 0x8d, 0x1d, 0xd2, 0xe4, 0x33, 0x88, 0x5e, 0x82, 0x92, 0xef, 0xec, 0x11, 0x31, - 0xbf, 0x57, 0xc4, 0xc0, 0x96, 0xd6, 0x9d, 0x3d, 0x72, 0x7c, 0x58, 0x99, 0xbc, 0xeb, 0xbb, 0xef, - 0xb5, 0xc5, 0xaa, 0xa0, 0x65, 0x98, 0x61, 0xa3, 0xeb, 0x00, 0x4d, 0xb2, 0xef, 0x36, 0x48, 0xcd, - 0x89, 0x77, 0xc4, 0x7c, 0x23, 0x51, 0x17, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x01, 0x94, 0x17, - 0xf6, 0x03, 0xb7, 0x59, 0x0b, 0x9a, 0x11, 0xda, 0x85, 0x89, 0x56, 0x48, 0xb6, 0x48, 0xa8, 0x8a, - 0x66, 0xac, 0x2b, 0xc5, 0x6b, 0x23, 0xd7, 0xaf, 0x65, 0x7e, 0xac, 0x89, 0xba, 0xec, 0xc7, 0xe1, - 0xc1, 0xe2, 0x63, 0xa2, 0xbd, 0x89, 0x14, 0x14, 0xa7, 0x29, 0xdb, 0xff, 0xba, 0x00, 0xd3, 0x0b, - 0xef, 0xb7, 0x43, 0x52, 0x75, 0xa3, 0xdd, 0xf4, 0x0a, 0x6f, 0xba, 0xd1, 0xee, 0x7a, 0x32, 0x02, - 0x6a, 0x69, 0x55, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x79, 0x18, 0xa2, 0xbf, 0xef, 0xe2, 0x55, 0xf1, - 0xc9, 0xe7, 0x04, 0xf2, 0x48, 0xd5, 0x89, 0x9d, 0x2a, 0x07, 0x61, 0x89, 0x83, 0xd6, 0x60, 0xa4, - 0xc1, 0x36, 0xe4, 0xf6, 0x5a, 0xd0, 0x24, 0x6c, 0x32, 0xcb, 0x8b, 0xcf, 0x52, 0xf4, 0xa5, 0xa4, - 0xf8, 0xf8, 0xb0, 0x32, 0xc3, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, 0xb6, 0xda, 0x5f, - 0x25, 0x46, 0x09, 0x32, 0xf6, 0xd6, 0x35, 0x6d, 0xab, 0x0c, 0xb0, 0xad, 0x32, 0x9a, 0xbd, 0x4d, - 0xd0, 0x0b, 0x50, 0xda, 0x75, 0xfd, 0xe6, 0xcc, 0x20, 0xa3, 0x75, 0x89, 0xce, 0xf9, 0x2d, 0xd7, - 0x6f, 0x1e, 0x1f, 0x56, 0xa6, 0x8c, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0x3f, 0xb6, 0xa0, 0xc2, - 0x60, 0x2b, 0xae, 0x47, 0x6a, 0x24, 0x8c, 0xdc, 0x28, 0x26, 0x7e, 0x6c, 0x0c, 0xe8, 0x75, 0x80, - 0x88, 0x34, 0x42, 0x12, 0x6b, 0x43, 0xaa, 0x16, 0x46, 0x5d, 0x41, 0xb0, 0x86, 0x45, 0x0f, 0x84, - 0x68, 0xc7, 0x09, 0xd9, 0xfa, 0x12, 0x03, 0xab, 0x0e, 0x84, 0xba, 0x04, 0xe0, 0x04, 0xc7, 0x38, - 0x10, 0x8a, 0xbd, 0x0e, 0x04, 0xf4, 0x39, 0x98, 0x48, 0x1a, 0x8b, 0x5a, 0x4e, 0x43, 0x0e, 0x20, - 0xdb, 0x32, 0x75, 0x13, 0x84, 0xd3, 0xb8, 0xf6, 0xdf, 0xb7, 0xc4, 0xe2, 0xa1, 0x5f, 0xfd, 0x11, - 0xff, 0x56, 0xfb, 0x57, 0x2d, 0x18, 0x5a, 0x74, 0xfd, 0xa6, 0xeb, 0x6f, 0xa3, 0x2f, 0xc3, 0x30, - 0xbd, 0x9b, 0x9a, 0x4e, 0xec, 0x88, 0x73, 0xef, 0x53, 0xda, 0xde, 0x52, 0x57, 0xc5, 0x5c, 0x6b, - 0x77, 0x9b, 0x16, 0x44, 0x73, 0x14, 0x9b, 0xee, 0xb6, 0x3b, 0x9b, 0xef, 0x92, 0x46, 0xbc, 0x46, - 0x62, 0x27, 0xf9, 0x9c, 0xa4, 0x0c, 0x2b, 0xaa, 0xe8, 0x16, 0x0c, 0xc6, 0x4e, 0xb8, 0x4d, 0x62, - 0x71, 0x00, 0x66, 0x1e, 0x54, 0xbc, 0x26, 0xa6, 0x3b, 0x92, 0xf8, 0x0d, 0x92, 0x5c, 0x0b, 0x1b, - 0xac, 0x2a, 0x16, 0x24, 0xec, 0x1f, 0x1c, 0x84, 0x8b, 0x4b, 0xf5, 0xd5, 0x9c, 0x75, 0x75, 0x15, - 0x06, 0x9b, 0xa1, 0xbb, 0x4f, 0x42, 0x31, 0xce, 0x8a, 0x4a, 0x95, 0x95, 0x62, 0x01, 0x45, 0xaf, - 0xc2, 0x28, 0xbf, 0x90, 0x6e, 0x3a, 0x7e, 0xd3, 0x93, 0x43, 0x7c, 0x5e, 0x60, 0x8f, 0xde, 0xd3, - 0x60, 0xd8, 0xc0, 0x3c, 0xe1, 0xa2, 0xba, 0x9a, 0xda, 0x8c, 0x79, 0x97, 0xdd, 0x0f, 0x58, 0x30, - 0xc9, 0x9b, 0x59, 0x88, 0xe3, 0xd0, 0xdd, 0x6c, 0xc7, 0x24, 0x9a, 0x19, 0x60, 0x27, 0xdd, 0x52, - 0xd6, 0x68, 0xe5, 0x8e, 0xc0, 0xdc, 0xbd, 0x14, 0x15, 0x7e, 0x08, 0xce, 0x88, 0x76, 0x27, 0xd3, - 0x60, 0xdc, 0xd1, 0x2c, 0xfa, 0x5e, 0x0b, 0x66, 0x1b, 0x81, 0x1f, 0x87, 0x81, 0xe7, 0x91, 0xb0, - 0xd6, 0xde, 0xf4, 0xdc, 0x68, 0x87, 0xaf, 0x53, 0x4c, 0xb6, 0xd8, 0x49, 0x90, 0x33, 0x87, 0x0a, - 0x49, 0xcc, 0xe1, 0xe5, 0xa3, 0xc3, 0xca, 0xec, 0x52, 0x2e, 0x29, 0xdc, 0xa5, 0x19, 0xb4, 0x0b, - 0x88, 0x5e, 0xa5, 0xf5, 0xd8, 0xd9, 0x26, 0x49, 0xe3, 0x43, 0xfd, 0x37, 0x7e, 0xe1, 0xe8, 0xb0, - 0x82, 0xd6, 0x3b, 0x48, 0xe0, 0x0c, 0xb2, 0xe8, 0x3d, 0x38, 0x4f, 0x4b, 0x3b, 0xbe, 0x75, 0xb8, - 0xff, 0xe6, 0x66, 0x8e, 0x0e, 0x2b, 0xe7, 0xd7, 0x33, 0x88, 0xe0, 0x4c, 0xd2, 0xb3, 0x4b, 0x30, - 0x9d, 0x39, 0x55, 0x68, 0x12, 0x8a, 0xbb, 0x84, 0xb3, 0x20, 0x65, 0x4c, 0x7f, 0xa2, 0xf3, 0x30, - 0xb0, 0xef, 0x78, 0x6d, 0xb1, 0x4a, 0x31, 0xff, 0xf3, 0x99, 0xc2, 0xab, 0x96, 0xdd, 0x80, 0xd1, - 0x25, 0xa7, 0xe5, 0x6c, 0xba, 0x9e, 0x1b, 0xbb, 0x24, 0x42, 0x4f, 0x43, 0xd1, 0x69, 0x36, 0xd9, - 0x15, 0x59, 0x5e, 0x9c, 0x3e, 0x3a, 0xac, 0x14, 0x17, 0x9a, 0xf4, 0xac, 0x06, 0x85, 0x75, 0x80, - 0x29, 0x06, 0xfa, 0x24, 0x94, 0x9a, 0x61, 0xd0, 0x9a, 0x29, 0x30, 0x4c, 0x3a, 0x54, 0xa5, 0x6a, - 0x18, 0xb4, 0x52, 0xa8, 0x0c, 0xc7, 0xfe, 0x8d, 0x02, 0x3c, 0xb1, 0x44, 0x5a, 0x3b, 0x2b, 0xf5, - 0x9c, 0x4d, 0x77, 0x0d, 0x86, 0xf7, 0x02, 0xdf, 0x8d, 0x83, 0x30, 0x12, 0x4d, 0xb3, 0xdb, 0x64, - 0x4d, 0x94, 0x61, 0x05, 0x45, 0x57, 0xa0, 0xd4, 0x4a, 0x38, 0x81, 0x51, 0xc9, 0x45, 0x30, 0x1e, - 0x80, 0x41, 0x28, 0x46, 0x3b, 0x22, 0xa1, 0xb8, 0x05, 0x15, 0xc6, 0xdd, 0x88, 0x84, 0x98, 0x41, - 0x92, 0xe3, 0x94, 0x1e, 0xb4, 0x62, 0x5b, 0xa5, 0x8e, 0x53, 0x0a, 0xc1, 0x1a, 0x16, 0xaa, 0x41, - 0x39, 0x52, 0x93, 0x3a, 0xd0, 0xff, 0xa4, 0x8e, 0xb1, 0xf3, 0x56, 0xcd, 0x64, 0x42, 0xc4, 0x38, - 0x06, 0x06, 0x7b, 0x9e, 0xb7, 0x5f, 0x2f, 0x00, 0xe2, 0x43, 0xf8, 0xe7, 0x6c, 0xe0, 0xee, 0x76, - 0x0e, 0x5c, 0x26, 0xe7, 0x75, 0x3b, 0x68, 0x38, 0x5e, 0xfa, 0x08, 0x3f, 0xad, 0xd1, 0xfb, 0xdf, - 0x16, 0x3c, 0xb1, 0xe4, 0xfa, 0x4d, 0x12, 0xe6, 0x2c, 0xc0, 0x47, 0x23, 0x80, 0x9c, 0xec, 0xa4, - 0x37, 0x96, 0x58, 0xe9, 0x14, 0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72, 0x1f, - 0x7b, 0xb7, 0xf3, 0x63, 0x4f, 0x61, 0x59, 0xd8, 0xb7, 0x61, 0x7c, 0xc9, 0x73, 0x89, 0x1f, 0xaf, - 0xd6, 0x96, 0x02, 0x7f, 0xcb, 0xdd, 0x46, 0x9f, 0x81, 0x71, 0x2a, 0xd3, 0x06, 0xed, 0xb8, 0x4e, - 0x1a, 0x81, 0xcf, 0xd8, 0x7f, 0x2a, 0x09, 0xa2, 0xa3, 0xc3, 0xca, 0xf8, 0x86, 0x01, 0xc1, 0x29, - 0x4c, 0xfb, 0x77, 0xe9, 0xf8, 0x05, 0x7b, 0xad, 0xc0, 0x27, 0x7e, 0xbc, 0x14, 0xf8, 0x4d, 0x2e, - 0x26, 0x7e, 0x06, 0x4a, 0x31, 0x1d, 0x0f, 0x3e, 0x76, 0x57, 0xe5, 0x46, 0xa1, 0xa3, 0x70, 0x7c, - 0x58, 0xb9, 0xd0, 0x59, 0x83, 0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x06, 0xa3, 0xd8, 0x89, 0xdb, - 0x91, 0x18, 0xcd, 0x27, 0xe5, 0x68, 0xd6, 0x59, 0xe9, 0xf1, 0x61, 0x65, 0x42, 0x55, 0xe3, 0x45, - 0x58, 0x54, 0x40, 0xcf, 0xc0, 0xd0, 0x1e, 0x89, 0x22, 0x67, 0x5b, 0x72, 0xf8, 0x13, 0xa2, 0xee, - 0xd0, 0x1a, 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x82, 0x01, 0x12, 0x86, 0x41, 0x28, 0xf6, 0xe8, 0x98, - 0x40, 0x1c, 0x58, 0xa6, 0x85, 0x98, 0xc3, 0xec, 0x7f, 0x6b, 0xc1, 0x84, 0xea, 0x2b, 0x6f, 0xeb, - 0x0c, 0x58, 0xb9, 0xb7, 0x01, 0x1a, 0xf2, 0x03, 0x23, 0x76, 0x7b, 0x8c, 0x5c, 0xbf, 0x9a, 0xc9, - 0xa0, 0x74, 0x0c, 0x63, 0x42, 0x59, 0x15, 0x45, 0x58, 0xa3, 0x66, 0xff, 0xba, 0x05, 0xe7, 0x52, - 0x5f, 0x74, 0xdb, 0x8d, 0x62, 0xf4, 0x4e, 0xc7, 0x57, 0xcd, 0xf5, 0xf7, 0x55, 0xb4, 0x36, 0xfb, - 0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, 0x37, 0x61, 0xc0, 0x8d, 0xc9, 0x9e, 0xfc, 0x98, 0xa7, - 0xba, 0x7e, 0x0c, 0xef, 0x55, 0x32, 0x23, 0xab, 0xb4, 0x26, 0xe6, 0x04, 0xec, 0x1f, 0x29, 0x42, - 0x99, 0x2f, 0xdb, 0x35, 0xa7, 0x75, 0x06, 0x73, 0xb1, 0x0a, 0x25, 0x46, 0x9d, 0x77, 0xfc, 0xe9, - 0xec, 0x8e, 0x8b, 0xee, 0xcc, 0x51, 0x39, 0x8d, 0xb3, 0x82, 0xea, 0x6a, 0xa0, 0x45, 0x98, 0x91, - 0x40, 0x0e, 0xc0, 0xa6, 0xeb, 0x3b, 0xe1, 0x01, 0x2d, 0x9b, 0x29, 0x32, 0x82, 0xcf, 0x77, 0x27, - 0xb8, 0xa8, 0xf0, 0x39, 0x59, 0xd5, 0xd7, 0x04, 0x80, 0x35, 0xa2, 0xb3, 0xaf, 0x40, 0x59, 0x21, - 0x9f, 0x84, 0xc7, 0x99, 0xfd, 0x1c, 0x4c, 0xa4, 0xda, 0xea, 0x55, 0x7d, 0x54, 0x67, 0x91, 0xbe, - 0xc6, 0x4e, 0x01, 0xd1, 0xeb, 0x65, 0x7f, 0x5f, 0x9c, 0xa2, 0xef, 0xc3, 0x79, 0x2f, 0xe3, 0x70, - 0x12, 0x53, 0xd5, 0xff, 0x61, 0xf6, 0x84, 0xf8, 0xec, 0xf3, 0x59, 0x50, 0x9c, 0xd9, 0x06, 0xbd, - 0xf6, 0x83, 0x16, 0x5d, 0xf3, 0x8e, 0xc7, 0xfa, 0x2b, 0xa4, 0xef, 0x3b, 0xa2, 0x0c, 0x2b, 0x28, - 0x3d, 0xc2, 0xce, 0xab, 0xce, 0xdf, 0x22, 0x07, 0x75, 0xe2, 0x91, 0x46, 0x1c, 0x84, 0x1f, 0x6a, - 0xf7, 0x2f, 0xf1, 0xd1, 0xe7, 0x27, 0xe0, 0x88, 0x20, 0x50, 0xbc, 0x45, 0x0e, 0xf8, 0x54, 0xe8, - 0x5f, 0x57, 0xec, 0xfa, 0x75, 0xbf, 0x60, 0xc1, 0x98, 0xfa, 0xba, 0x33, 0xd8, 0xea, 0x8b, 0xe6, - 0x56, 0xbf, 0xd4, 0x75, 0x81, 0xe7, 0x6c, 0xf2, 0xaf, 0x17, 0xe0, 0xa2, 0xc2, 0xa1, 0xec, 0x3e, - 0xff, 0x23, 0x56, 0xd5, 0x3c, 0x94, 0x7d, 0xa5, 0x3d, 0xb0, 0x4c, 0xb1, 0x3d, 0xd1, 0x1d, 0x24, - 0x38, 0x94, 0x6b, 0xf3, 0x13, 0x11, 0x7f, 0x54, 0x57, 0xab, 0x09, 0x15, 0xda, 0x22, 0x14, 0xdb, - 0x6e, 0x53, 0xdc, 0x19, 0x9f, 0x92, 0xa3, 0x7d, 0x77, 0xb5, 0x7a, 0x7c, 0x58, 0x79, 0x32, 0x4f, - 0xa5, 0x4b, 0x2f, 0xab, 0x68, 0xee, 0xee, 0x6a, 0x15, 0xd3, 0xca, 0x68, 0x01, 0x26, 0xa4, 0xd6, - 0xfa, 0x1e, 0xe5, 0xa0, 0x02, 0x5f, 0x5c, 0x2d, 0x4a, 0x37, 0x86, 0x4d, 0x30, 0x4e, 0xe3, 0xa3, - 0x2a, 0x4c, 0xee, 0xb6, 0x37, 0x89, 0x47, 0x62, 0xfe, 0xc1, 0xb7, 0x08, 0xd7, 0x1c, 0x95, 0x13, - 0xd1, 0xf2, 0x56, 0x0a, 0x8e, 0x3b, 0x6a, 0xd8, 0x7f, 0xc6, 0x8e, 0x78, 0x31, 0x7a, 0xb5, 0x30, - 0xa0, 0x0b, 0x8b, 0x52, 0xff, 0x30, 0x97, 0x73, 0x3f, 0xab, 0xe2, 0x16, 0x39, 0xd8, 0x08, 0x28, - 0xb3, 0x9d, 0xbd, 0x2a, 0x8c, 0x35, 0x5f, 0xea, 0xba, 0xe6, 0x7f, 0xa9, 0x00, 0xd3, 0x6a, 0x04, - 0x0c, 0xbe, 0xee, 0xcf, 0xfb, 0x18, 0xbc, 0x00, 0x23, 0x4d, 0xb2, 0xe5, 0xb4, 0xbd, 0x58, 0xa9, - 0x31, 0x07, 0xb8, 0x2a, 0xbb, 0x9a, 0x14, 0x63, 0x1d, 0xe7, 0x04, 0xc3, 0xf6, 0xd3, 0x23, 0xec, - 0x6e, 0x8d, 0x1d, 0xba, 0xc6, 0xd5, 0xae, 0xb1, 0x72, 0x77, 0xcd, 0x53, 0x30, 0xe0, 0xee, 0x51, - 0x5e, 0xab, 0x60, 0xb2, 0x50, 0xab, 0xb4, 0x10, 0x73, 0x18, 0xfa, 0x04, 0x0c, 0x35, 0x82, 0xbd, - 0x3d, 0xc7, 0x6f, 0xb2, 0x2b, 0xaf, 0xbc, 0x38, 0x42, 0xd9, 0xb1, 0x25, 0x5e, 0x84, 0x25, 0x0c, - 0x3d, 0x01, 0x25, 0x27, 0xdc, 0x8e, 0x66, 0x4a, 0x0c, 0x67, 0x98, 0xb6, 0xb4, 0x10, 0x6e, 0x47, - 0x98, 0x95, 0x52, 0xa9, 0xea, 0x7e, 0x10, 0xee, 0xba, 0xfe, 0x76, 0xd5, 0x0d, 0xc5, 0x96, 0x50, - 0x77, 0xe1, 0x5b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x02, 0x03, 0xad, 0x20, 0x8c, 0xa3, 0x99, 0x41, - 0x36, 0xdc, 0x4f, 0xe6, 0x1c, 0x44, 0xfc, 0x6b, 0x6b, 0x41, 0x18, 0x27, 0x1f, 0x40, 0xff, 0x45, - 0x98, 0x57, 0x47, 0xdf, 0x06, 0x45, 0xe2, 0xef, 0xcf, 0x0c, 0x31, 0x2a, 0xb3, 0x59, 0x54, 0x96, - 0xfd, 0xfd, 0x7b, 0x4e, 0x98, 0x9c, 0xd2, 0xcb, 0xfe, 0x3e, 0xa6, 0x75, 0xd0, 0x17, 0xa0, 0x2c, - 0xb7, 0x78, 0x24, 0xd4, 0x1c, 0x99, 0x4b, 0x4c, 0x1e, 0x0c, 0x98, 0xbc, 0xd7, 0x76, 0x43, 0xb2, - 0x47, 0xfc, 0x38, 0x4a, 0xce, 0x34, 0x09, 0x8d, 0x70, 0x42, 0x0d, 0x7d, 0x41, 0xea, 0xd6, 0xd6, - 0x82, 0xb6, 0x1f, 0x47, 0x33, 0x65, 0xd6, 0xbd, 0xcc, 0x57, 0x8f, 0x7b, 0x09, 0x5e, 0x5a, 0xf9, - 0xc6, 0x2b, 0x63, 0x83, 0x14, 0xc2, 0x30, 0xe6, 0xb9, 0xfb, 0xc4, 0x27, 0x51, 0x54, 0x0b, 0x83, - 0x4d, 0x32, 0x03, 0xac, 0xe7, 0x17, 0xb3, 0x1f, 0x03, 0x82, 0x4d, 0xb2, 0x38, 0x75, 0x74, 0x58, - 0x19, 0xbb, 0xad, 0xd7, 0xc1, 0x26, 0x09, 0x74, 0x17, 0xc6, 0xa9, 0x5c, 0xe3, 0x26, 0x44, 0x47, - 0x7a, 0x11, 0x65, 0xd2, 0x07, 0x36, 0x2a, 0xe1, 0x14, 0x11, 0xf4, 0x06, 0x94, 0x3d, 0x77, 0x8b, - 0x34, 0x0e, 0x1a, 0x1e, 0x99, 0x19, 0x65, 0x14, 0x33, 0xb7, 0xd5, 0x6d, 0x89, 0xc4, 0xe5, 0x22, - 0xf5, 0x17, 0x27, 0xd5, 0xd1, 0x3d, 0xb8, 0x10, 0x93, 0x70, 0xcf, 0xf5, 0x1d, 0xba, 0x1d, 0x84, - 0xbc, 0xc0, 0x9e, 0x54, 0xc6, 0xd8, 0x7a, 0xbb, 0x2c, 0x86, 0xee, 0xc2, 0x46, 0x26, 0x16, 0xce, - 0xa9, 0x8d, 0xee, 0xc0, 0x04, 0xdb, 0x09, 0xb5, 0xb6, 0xe7, 0xd5, 0x02, 0xcf, 0x6d, 0x1c, 0xcc, - 0x8c, 0x33, 0x82, 0x9f, 0x90, 0xf7, 0xc2, 0xaa, 0x09, 0x3e, 0x3e, 0xac, 0x40, 0xf2, 0x0f, 0xa7, - 0x6b, 0xa3, 0x4d, 0xa6, 0x43, 0x6f, 0x87, 0x6e, 0x7c, 0x40, 0xd7, 0x2f, 0x79, 0x10, 0xcf, 0x4c, - 0x74, 0x15, 0x85, 0x75, 0x54, 0xa5, 0x68, 0xd7, 0x0b, 0x71, 0x9a, 0x20, 0xdd, 0xda, 0x51, 0xdc, - 0x74, 0xfd, 0x99, 0x49, 0x76, 0x62, 0xa8, 0x9d, 0x51, 0xa7, 0x85, 0x98, 0xc3, 0x98, 0xfe, 0x9c, - 0xfe, 0xb8, 0x43, 0x4f, 0xd0, 0x29, 0x86, 0x98, 0xe8, 0xcf, 0x25, 0x00, 0x27, 0x38, 0x94, 0xa9, - 0x89, 0xe3, 0x83, 0x19, 0xc4, 0x50, 0xd5, 0x76, 0xd9, 0xd8, 0xf8, 0x02, 0xa6, 0xe5, 0xe8, 0x36, - 0x0c, 0x11, 0x7f, 0x7f, 0x25, 0x0c, 0xf6, 0x66, 0xce, 0xe5, 0xef, 0xd9, 0x65, 0x8e, 0xc2, 0x0f, - 0xf4, 0x44, 0xc0, 0x13, 0xc5, 0x58, 0x92, 0x40, 0x0f, 0x60, 0x26, 0x63, 0x46, 0xf8, 0x04, 0x9c, - 0x67, 0x13, 0xf0, 0x59, 0x51, 0x77, 0x66, 0x23, 0x07, 0xef, 0xb8, 0x0b, 0x0c, 0xe7, 0x52, 0x47, - 0x5f, 0x84, 0x31, 0xbe, 0xa1, 0xf8, 0xe3, 0x5b, 0x34, 0x33, 0xcd, 0xbe, 0xe6, 0x4a, 0xfe, 0xe6, - 0xe4, 0x88, 0x8b, 0xd3, 0xa2, 0x43, 0x63, 0x7a, 0x69, 0x84, 0x4d, 0x6a, 0xf6, 0x26, 0x8c, 0xab, - 0x73, 0x8b, 0x2d, 0x1d, 0x54, 0x81, 0x01, 0xc6, 0xed, 0x08, 0xfd, 0x56, 0x99, 0xce, 0x14, 0xe3, - 0x84, 0x30, 0x2f, 0x67, 0x33, 0xe5, 0xbe, 0x4f, 0x16, 0x0f, 0x62, 0xc2, 0xa5, 0xea, 0xa2, 0x36, - 0x53, 0x12, 0x80, 0x13, 0x1c, 0xfb, 0xff, 0x72, 0xae, 0x31, 0x39, 0x1c, 0xfb, 0xb8, 0x0e, 0x9e, - 0x83, 0xe1, 0x9d, 0x20, 0x8a, 0x29, 0x36, 0x6b, 0x63, 0x20, 0xe1, 0x13, 0x6f, 0x8a, 0x72, 0xac, - 0x30, 0xd0, 0x6b, 0x30, 0xd6, 0xd0, 0x1b, 0x10, 0x77, 0x99, 0x1a, 0x02, 0xa3, 0x75, 0x6c, 0xe2, - 0xa2, 0x57, 0x61, 0x98, 0x3d, 0x9d, 0x37, 0x02, 0x4f, 0x30, 0x59, 0xf2, 0x42, 0x1e, 0xae, 0x89, - 0xf2, 0x63, 0xed, 0x37, 0x56, 0xd8, 0xe8, 0x2a, 0x0c, 0xd2, 0x2e, 0xac, 0xd6, 0xc4, 0x2d, 0xa2, - 0x54, 0x35, 0x37, 0x59, 0x29, 0x16, 0x50, 0xfb, 0xaf, 0x17, 0xb4, 0x51, 0xa6, 0x12, 0x29, 0x41, - 0x35, 0x18, 0xba, 0xef, 0xb8, 0xb1, 0xeb, 0x6f, 0x0b, 0x76, 0xe1, 0x99, 0xae, 0x57, 0x0a, 0xab, - 0xf4, 0x16, 0xaf, 0xc0, 0x2f, 0x3d, 0xf1, 0x07, 0x4b, 0x32, 0x94, 0x62, 0xd8, 0xf6, 0x7d, 0x4a, - 0xb1, 0xd0, 0x2f, 0x45, 0xcc, 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, 0x64, 0xd0, 0x3b, 0x00, 0x72, - 0x59, 0x92, 0xa6, 0x78, 0xb2, 0x7e, 0xae, 0x37, 0xd1, 0x0d, 0x55, 0x67, 0x71, 0x9c, 0x5e, 0xa9, - 0xc9, 0x7f, 0xac, 0xd1, 0xb3, 0x63, 0xc6, 0x56, 0x75, 0x76, 0x06, 0x7d, 0x27, 0x3d, 0x09, 0x9c, - 0x30, 0x26, 0xcd, 0x85, 0x58, 0x0c, 0xce, 0x27, 0xfb, 0x93, 0x29, 0x36, 0xdc, 0x3d, 0xa2, 0x9f, - 0x1a, 0x82, 0x08, 0x4e, 0xe8, 0xd9, 0xbf, 0x52, 0x84, 0x99, 0xbc, 0xee, 0xd2, 0x45, 0x47, 0x1e, - 0xb8, 0xf1, 0x12, 0xe5, 0x86, 0x2c, 0x73, 0xd1, 0x2d, 0x8b, 0x72, 0xac, 0x30, 0xe8, 0xec, 0x47, - 0xee, 0xb6, 0x14, 0x09, 0x07, 0x92, 0xd9, 0xaf, 0xb3, 0x52, 0x2c, 0xa0, 0x14, 0x2f, 0x24, 0x4e, - 0x24, 0x6c, 0x22, 0xb4, 0x55, 0x82, 0x59, 0x29, 0x16, 0x50, 0x5d, 0xdf, 0x54, 0xea, 0xa1, 0x6f, - 0x32, 0x86, 0x68, 0xe0, 0x74, 0x87, 0x08, 0x7d, 0x09, 0x60, 0xcb, 0xf5, 0xdd, 0x68, 0x87, 0x51, - 0x1f, 0x3c, 0x31, 0x75, 0xc5, 0x4b, 0xad, 0x28, 0x2a, 0x58, 0xa3, 0x88, 0x5e, 0x86, 0x11, 0xb5, - 0x01, 0x57, 0xab, 0xec, 0x81, 0x48, 0x7b, 0x70, 0x4f, 0x4e, 0xa3, 0x2a, 0xd6, 0xf1, 0xec, 0x77, - 0xd3, 0xeb, 0x45, 0xec, 0x00, 0x6d, 0x7c, 0xad, 0x7e, 0xc7, 0xb7, 0xd0, 0x7d, 0x7c, 0xed, 0xdf, - 0x2c, 0xc2, 0x84, 0xd1, 0x58, 0x3b, 0xea, 0xe3, 0xcc, 0xba, 0x41, 0xef, 0x39, 0x27, 0x26, 0x62, - 0xff, 0xd9, 0xbd, 0xb7, 0x8a, 0x7e, 0x17, 0xd2, 0x1d, 0xc0, 0xeb, 0xa3, 0x2f, 0x41, 0xd9, 0x73, - 0x22, 0xa6, 0xbb, 0x22, 0x62, 0xdf, 0xf5, 0x43, 0x2c, 0x91, 0x23, 0x9c, 0x28, 0xd6, 0xae, 0x1a, - 0x4e, 0x3b, 0x21, 0x49, 0x2f, 0x64, 0xca, 0xfb, 0x48, 0xa3, 0x1b, 0xd5, 0x09, 0xca, 0x20, 0x1d, - 0x60, 0x0e, 0x43, 0xaf, 0xc2, 0x68, 0x48, 0xd8, 0xaa, 0x58, 0xa2, 0xac, 0x1c, 0x5b, 0x66, 0x03, - 0x09, 0xcf, 0x87, 0x35, 0x18, 0x36, 0x30, 0x13, 0x56, 0x7e, 0xb0, 0x0b, 0x2b, 0xff, 0x0c, 0x0c, - 0xb1, 0x1f, 0x6a, 0x05, 0xa8, 0xd9, 0x58, 0xe5, 0xc5, 0x58, 0xc2, 0xd3, 0x0b, 0x66, 0xb8, 0xcf, - 0x05, 0xf3, 0x49, 0x18, 0xaf, 0x3a, 0x64, 0x2f, 0xf0, 0x97, 0xfd, 0x66, 0x2b, 0x70, 0xfd, 0x18, - 0xcd, 0x40, 0x89, 0xdd, 0x0e, 0x7c, 0x6f, 0x97, 0x28, 0x05, 0x5c, 0xa2, 0x8c, 0xb9, 0xbd, 0x0d, - 0xd3, 0xd5, 0xe0, 0xbe, 0x7f, 0xdf, 0x09, 0x9b, 0x0b, 0xb5, 0x55, 0x4d, 0xce, 0x5d, 0x97, 0x72, - 0x16, 0x37, 0x62, 0xc9, 0x3c, 0x53, 0xb5, 0x9a, 0xfc, 0xae, 0x5d, 0x71, 0x3d, 0x92, 0xa3, 0x8d, - 0xf8, 0x9b, 0x05, 0xa3, 0xa5, 0x04, 0x5f, 0x3d, 0x18, 0x59, 0xb9, 0x0f, 0x46, 0x6f, 0xc2, 0xf0, - 0x96, 0x4b, 0xbc, 0x26, 0x26, 0x5b, 0x62, 0x89, 0x3d, 0x9d, 0xff, 0x2e, 0xbf, 0x42, 0x31, 0xa5, - 0xf6, 0x89, 0x4b, 0x69, 0x2b, 0xa2, 0x32, 0x56, 0x64, 0xd0, 0x2e, 0x4c, 0x4a, 0x31, 0x40, 0x42, - 0xc5, 0x82, 0x7b, 0xa6, 0x9b, 0x6c, 0x61, 0x12, 0x3f, 0x7f, 0x74, 0x58, 0x99, 0xc4, 0x29, 0x32, - 0xb8, 0x83, 0x30, 0x15, 0xcb, 0xf6, 0xe8, 0xd1, 0x5a, 0x62, 0xc3, 0xcf, 0xc4, 0x32, 0x26, 0x61, - 0xb2, 0x52, 0xfb, 0x27, 0x2c, 0x78, 0xac, 0x63, 0x64, 0x84, 0xa4, 0x7d, 0xca, 0xb3, 0x90, 0x96, - 0x7c, 0x0b, 0xbd, 0x25, 0x5f, 0xfb, 0x1f, 0x58, 0x70, 0x7e, 0x79, 0xaf, 0x15, 0x1f, 0x54, 0x5d, - 0xf3, 0x75, 0xe7, 0x15, 0x18, 0xdc, 0x23, 0x4d, 0xb7, 0xbd, 0x27, 0x66, 0xae, 0x22, 0x8f, 0x9f, - 0x35, 0x56, 0x7a, 0x7c, 0x58, 0x19, 0xab, 0xc7, 0x41, 0xe8, 0x6c, 0x13, 0x5e, 0x80, 0x05, 0x3a, - 0x3b, 0xc4, 0xdd, 0xf7, 0xc9, 0x6d, 0x77, 0xcf, 0x95, 0x76, 0x16, 0x5d, 0x75, 0x67, 0x73, 0x72, - 0x40, 0xe7, 0xde, 0x6c, 0x3b, 0x7e, 0xec, 0xc6, 0x07, 0xe2, 0x61, 0x46, 0x12, 0xc1, 0x09, 0x3d, - 0xfb, 0x9b, 0x16, 0x4c, 0xc8, 0x75, 0xbf, 0xd0, 0x6c, 0x86, 0x24, 0x8a, 0xd0, 0x2c, 0x14, 0xdc, - 0x96, 0xe8, 0x25, 0x88, 0x5e, 0x16, 0x56, 0x6b, 0xb8, 0xe0, 0xb6, 0x50, 0x0d, 0xca, 0xdc, 0x5c, - 0x23, 0x59, 0x5c, 0x7d, 0x19, 0x7d, 0xb0, 0x1e, 0x6c, 0xc8, 0x9a, 0x38, 0x21, 0x22, 0x39, 0x38, - 0x76, 0x66, 0x16, 0xcd, 0x57, 0xaf, 0x9b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x0d, 0x86, 0xfd, 0xa0, - 0xc9, 0xad, 0x67, 0xf8, 0xed, 0xc7, 0x96, 0xec, 0xba, 0x28, 0xc3, 0x0a, 0x6a, 0xff, 0xb0, 0x05, - 0xa3, 0xf2, 0xcb, 0xfa, 0x64, 0x26, 0xe9, 0xd6, 0x4a, 0x18, 0xc9, 0x64, 0x6b, 0x51, 0x66, 0x90, - 0x41, 0x0c, 0x1e, 0xb0, 0x78, 0x12, 0x1e, 0xd0, 0xfe, 0xf1, 0x02, 0x8c, 0xcb, 0xee, 0xd4, 0xdb, - 0x9b, 0x11, 0x89, 0xd1, 0x06, 0x94, 0x1d, 0x3e, 0xe4, 0x44, 0xae, 0xd8, 0xa7, 0xb2, 0x85, 0x0f, - 0x63, 0x7e, 0x92, 0x6b, 0x79, 0x41, 0xd6, 0xc6, 0x09, 0x21, 0xe4, 0xc1, 0x94, 0x1f, 0xc4, 0xec, - 0x88, 0x56, 0xf0, 0x6e, 0x4f, 0x20, 0x69, 0xea, 0x17, 0x05, 0xf5, 0xa9, 0xf5, 0x34, 0x15, 0xdc, - 0x49, 0x18, 0x2d, 0x4b, 0x85, 0x47, 0x31, 0x5f, 0xdc, 0xd0, 0x67, 0x21, 0x5b, 0xdf, 0x61, 0xff, - 0x9a, 0x05, 0x65, 0x89, 0x76, 0x16, 0xaf, 0x5d, 0x6b, 0x30, 0x14, 0xb1, 0x49, 0x90, 0x43, 0x63, - 0x77, 0xeb, 0x38, 0x9f, 0xaf, 0xe4, 0xe6, 0xe1, 0xff, 0x23, 0x2c, 0x69, 0x30, 0x7d, 0xb7, 0xea, - 0xfe, 0x47, 0x44, 0xdf, 0xad, 0xfa, 0x93, 0x73, 0xc3, 0xfc, 0x57, 0xd6, 0x67, 0x4d, 0xac, 0xa5, - 0x0c, 0x52, 0x2b, 0x24, 0x5b, 0xee, 0x83, 0x34, 0x83, 0x54, 0x63, 0xa5, 0x58, 0x40, 0xd1, 0x3b, - 0x30, 0xda, 0x90, 0x8a, 0xce, 0xe4, 0x18, 0xb8, 0xda, 0x55, 0xe9, 0xae, 0xde, 0x67, 0xb8, 0x65, - 0xed, 0x92, 0x56, 0x1f, 0x1b, 0xd4, 0xcc, 0xe7, 0xf6, 0x62, 0xaf, 0xe7, 0xf6, 0x84, 0x6e, 0xfe, - 0xe3, 0xf3, 0x4f, 0x5a, 0x30, 0xc8, 0xd5, 0x65, 0xfd, 0xe9, 0x17, 0xb5, 0xe7, 0xaa, 0x64, 0xec, - 0xee, 0xd1, 0x42, 0xf1, 0xfc, 0x84, 0xd6, 0xa0, 0xcc, 0x7e, 0x30, 0xb5, 0x41, 0x31, 0xdf, 0xa4, - 0x98, 0xb7, 0xaa, 0x77, 0xf0, 0x9e, 0xac, 0x86, 0x13, 0x0a, 0xf6, 0x8f, 0x16, 0xe9, 0x51, 0x95, - 0xa0, 0x1a, 0x37, 0xb8, 0xf5, 0xe8, 0x6e, 0xf0, 0xc2, 0xa3, 0xba, 0xc1, 0xb7, 0x61, 0xa2, 0xa1, - 0x3d, 0x6e, 0x25, 0x33, 0x79, 0xad, 0xeb, 0x22, 0xd1, 0xde, 0xc1, 0xb8, 0xca, 0x68, 0xc9, 0x24, - 0x82, 0xd3, 0x54, 0xd1, 0x77, 0xc2, 0x28, 0x9f, 0x67, 0xd1, 0x0a, 0xb7, 0x58, 0xf8, 0x44, 0xfe, - 0x7a, 0xd1, 0x9b, 0x60, 0x2b, 0xb1, 0xae, 0x55, 0xc7, 0x06, 0x31, 0xfb, 0x57, 0x86, 0x61, 0x60, - 0x79, 0x9f, 0xf8, 0xf1, 0x19, 0x1c, 0x48, 0x0d, 0x18, 0x77, 0xfd, 0xfd, 0xc0, 0xdb, 0x27, 0x4d, - 0x0e, 0x3f, 0xc9, 0xe5, 0x7a, 0x41, 0x90, 0x1e, 0x5f, 0x35, 0x48, 0xe0, 0x14, 0xc9, 0x47, 0x21, - 0x61, 0xde, 0x80, 0x41, 0x3e, 0xf7, 0x42, 0xbc, 0xcc, 0x54, 0x06, 0xb3, 0x41, 0x14, 0xbb, 0x20, - 0x91, 0x7e, 0xb9, 0xf6, 0x59, 0x54, 0x47, 0xef, 0xc2, 0xf8, 0x96, 0x1b, 0x46, 0x31, 0x15, 0x0d, - 0xa3, 0xd8, 0xd9, 0x6b, 0x3d, 0x84, 0x44, 0xa9, 0xc6, 0x61, 0xc5, 0xa0, 0x84, 0x53, 0x94, 0xd1, - 0x36, 0x8c, 0x51, 0x21, 0x27, 0x69, 0x6a, 0xe8, 0xc4, 0x4d, 0x29, 0x95, 0xd1, 0x6d, 0x9d, 0x10, - 0x36, 0xe9, 0xd2, 0xc3, 0xa4, 0xc1, 0x84, 0xa2, 0x61, 0xc6, 0x51, 0xa8, 0xc3, 0x84, 0x4b, 0x43, - 0x1c, 0x46, 0xcf, 0x24, 0x66, 0xb6, 0x52, 0x36, 0xcf, 0x24, 0xcd, 0x38, 0xe5, 0xcb, 0x50, 0x26, - 0x74, 0x08, 0x29, 0x61, 0xa1, 0x18, 0x9f, 0xef, 0xaf, 0xaf, 0x6b, 0x6e, 0x23, 0x0c, 0x4c, 0x59, - 0x7e, 0x59, 0x52, 0xc2, 0x09, 0x51, 0xb4, 0x04, 0x83, 0x11, 0x09, 0x5d, 0x12, 0x09, 0x15, 0x79, - 0x97, 0x69, 0x64, 0x68, 0xdc, 0xf6, 0x9c, 0xff, 0xc6, 0xa2, 0x2a, 0x5d, 0x5e, 0x0e, 0x93, 0x86, - 0x98, 0x56, 0x5c, 0x5b, 0x5e, 0x0b, 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x03, 0x86, 0x42, 0xe2, 0x31, - 0x65, 0xd1, 0x58, 0xff, 0x8b, 0x9c, 0xeb, 0x9e, 0x78, 0x3d, 0x2c, 0x09, 0xa0, 0x5b, 0x80, 0x42, - 0x42, 0x79, 0x08, 0xd7, 0xdf, 0x56, 0xc6, 0x1c, 0x42, 0xd7, 0xfd, 0xb8, 0x68, 0xff, 0x1c, 0x4e, - 0x30, 0xa4, 0x55, 0x2a, 0xce, 0xa8, 0x86, 0x6e, 0xc0, 0x94, 0x2a, 0x5d, 0xf5, 0xa3, 0xd8, 0xf1, - 0x1b, 0x84, 0xa9, 0xb9, 0xcb, 0x09, 0x57, 0x84, 0xd3, 0x08, 0xb8, 0xb3, 0x8e, 0xfd, 0x73, 0x94, - 0x9d, 0xa1, 0xa3, 0x75, 0x06, 0xbc, 0xc0, 0xeb, 0x26, 0x2f, 0x70, 0x31, 0x77, 0xe6, 0x72, 0xf8, - 0x80, 0x23, 0x0b, 0x46, 0xb4, 0x99, 0x4d, 0xd6, 0xac, 0xd5, 0x65, 0xcd, 0xb6, 0x61, 0x92, 0xae, - 0xf4, 0x3b, 0x9b, 0xcc, 0x0d, 0xab, 0xc9, 0x16, 0x66, 0xe1, 0xe1, 0x16, 0xa6, 0x7a, 0x65, 0xbe, - 0x9d, 0x22, 0x88, 0x3b, 0x9a, 0x40, 0xaf, 0x48, 0xcd, 0x49, 0xd1, 0x30, 0xd2, 0xe2, 0x5a, 0x91, - 0xe3, 0xc3, 0xca, 0xa4, 0xf6, 0x21, 0xba, 0xa6, 0xc4, 0xfe, 0xb2, 0xfc, 0x46, 0xf5, 0x9a, 0xdf, - 0x50, 0x8b, 0x25, 0xf5, 0x9a, 0xaf, 0x96, 0x03, 0x4e, 0x70, 0xe8, 0x1e, 0xa5, 0x22, 0x48, 0xfa, - 0x35, 0x9f, 0x0a, 0x28, 0x98, 0x41, 0xec, 0x17, 0x01, 0x96, 0x1f, 0x90, 0x06, 0x5f, 0xea, 0xfa, - 0x03, 0xa4, 0x95, 0xff, 0x00, 0x69, 0xff, 0x7b, 0x0b, 0xc6, 0x57, 0x96, 0x0c, 0x31, 0x71, 0x0e, - 0x80, 0xcb, 0x46, 0x6f, 0xbd, 0xb5, 0x2e, 0x75, 0xeb, 0x5c, 0x3d, 0xaa, 0x4a, 0xb1, 0x86, 0x81, - 0x2e, 0x42, 0xd1, 0x6b, 0xfb, 0x42, 0x64, 0x19, 0x3a, 0x3a, 0xac, 0x14, 0x6f, 0xb7, 0x7d, 0x4c, - 0xcb, 0x34, 0x0b, 0xc1, 0x62, 0xdf, 0x16, 0x82, 0x3d, 0xdd, 0xab, 0x50, 0x05, 0x06, 0xee, 0xdf, - 0x77, 0x9b, 0xdc, 0x88, 0x5d, 0xe8, 0xfd, 0xdf, 0x7a, 0x6b, 0xb5, 0x1a, 0x61, 0x5e, 0x6e, 0x7f, - 0xb5, 0x08, 0xb3, 0x2b, 0x1e, 0x79, 0xf0, 0x01, 0x0d, 0xf9, 0xfb, 0xb5, 0x6f, 0x3c, 0x19, 0xbf, - 0x78, 0x52, 0x1b, 0xd6, 0xde, 0xe3, 0xb1, 0x05, 0x43, 0xfc, 0x31, 0x5b, 0x9a, 0xf5, 0xbf, 0x96, - 0xd5, 0x7a, 0xfe, 0x80, 0xcc, 0xf1, 0x47, 0x71, 0x61, 0xce, 0xaf, 0x6e, 0x5a, 0x51, 0x8a, 0x25, - 0xf1, 0xd9, 0xcf, 0xc0, 0xa8, 0x8e, 0x79, 0x22, 0x6b, 0xf2, 0xbf, 0x54, 0x84, 0x49, 0xda, 0x83, - 0x47, 0x3a, 0x11, 0x77, 0x3b, 0x27, 0xe2, 0xb4, 0x2d, 0x8a, 0x7b, 0xcf, 0xc6, 0x3b, 0xe9, 0xd9, - 0x78, 0x21, 0x6f, 0x36, 0xce, 0x7a, 0x0e, 0xbe, 0xd7, 0x82, 0x73, 0x2b, 0x5e, 0xd0, 0xd8, 0x4d, - 0x59, 0xfd, 0xbe, 0x0c, 0x23, 0xf4, 0x1c, 0x8f, 0x0c, 0x2f, 0x22, 0xc3, 0xaf, 0x4c, 0x80, 0xb0, - 0x8e, 0xa7, 0x55, 0xbb, 0x7b, 0x77, 0xb5, 0x9a, 0xe5, 0x8e, 0x26, 0x40, 0x58, 0xc7, 0xb3, 0xbf, - 0x61, 0xc1, 0xa5, 0x1b, 0x4b, 0xcb, 0xc9, 0x52, 0xec, 0xf0, 0x88, 0xa3, 0x52, 0x60, 0x53, 0xeb, - 0x4a, 0x22, 0x05, 0x56, 0x59, 0x2f, 0x04, 0xf4, 0xa3, 0xe2, 0xed, 0xf9, 0xb3, 0x16, 0x9c, 0xbb, - 0xe1, 0xc6, 0xf4, 0x5a, 0x4e, 0xfb, 0x66, 0xd1, 0x7b, 0x39, 0x72, 0xe3, 0x20, 0x3c, 0x48, 0xfb, - 0x66, 0x61, 0x05, 0xc1, 0x1a, 0x16, 0x6f, 0x79, 0xdf, 0x65, 0x66, 0x54, 0x05, 0x53, 0x15, 0x85, - 0x45, 0x39, 0x56, 0x18, 0xf4, 0xc3, 0x9a, 0x6e, 0xc8, 0x44, 0x89, 0x03, 0x71, 0xc2, 0xaa, 0x0f, - 0xab, 0x4a, 0x00, 0x4e, 0x70, 0xec, 0x9f, 0xb0, 0x60, 0xfa, 0x86, 0xd7, 0x8e, 0x62, 0x12, 0x6e, - 0x45, 0x46, 0x67, 0x5f, 0x84, 0x32, 0x91, 0xe2, 0xba, 0xe8, 0xab, 0x62, 0x30, 0x95, 0x1c, 0xcf, - 0x1d, 0xc3, 0x14, 0x5e, 0x1f, 0x9e, 0x03, 0x27, 0x73, 0x1d, 0xfb, 0xc5, 0x02, 0x8c, 0xdd, 0xdc, - 0xd8, 0xa8, 0xdd, 0x20, 0xb1, 0xb8, 0xc5, 0x7a, 0xab, 0x9a, 0xb1, 0xa6, 0x31, 0xeb, 0x26, 0x14, - 0xb5, 0x63, 0xd7, 0x9b, 0xe3, 0x9e, 0xc8, 0x73, 0xab, 0x7e, 0x7c, 0x27, 0xac, 0xc7, 0xa1, 0xeb, - 0x6f, 0x67, 0xea, 0xd8, 0xe4, 0x5d, 0x5b, 0xcc, 0xbb, 0x6b, 0xd1, 0x8b, 0x30, 0xc8, 0x5c, 0xa1, - 0xa5, 0x78, 0xf2, 0xb8, 0x92, 0x29, 0x58, 0xe9, 0xf1, 0x61, 0xa5, 0x7c, 0x17, 0xaf, 0xf2, 0x3f, - 0x58, 0xa0, 0xa2, 0xbb, 0x30, 0xb2, 0x13, 0xc7, 0xad, 0x9b, 0xc4, 0x69, 0x92, 0x50, 0x9e, 0x0e, - 0x97, 0xb3, 0x4e, 0x07, 0x3a, 0x08, 0x1c, 0x2d, 0xd9, 0x50, 0x49, 0x59, 0x84, 0x75, 0x3a, 0x76, - 0x1d, 0x20, 0x81, 0x9d, 0x92, 0x7e, 0xc1, 0xfe, 0x03, 0x0b, 0x86, 0xb8, 0x57, 0x5a, 0x88, 0x3e, - 0x0b, 0x25, 0xf2, 0x80, 0x34, 0x04, 0xe7, 0x98, 0xd9, 0xe1, 0x84, 0xf1, 0xe0, 0xda, 0x72, 0xfa, - 0x1f, 0xb3, 0x5a, 0xe8, 0x26, 0x0c, 0xd1, 0xde, 0xde, 0x50, 0x2e, 0x7a, 0x4f, 0xe6, 0x7d, 0xb1, - 0x9a, 0x76, 0xce, 0xab, 0x88, 0x22, 0x2c, 0xab, 0x33, 0xcd, 0x6f, 0xa3, 0x55, 0xa7, 0x07, 0x58, - 0xdc, 0xed, 0x9e, 0xdd, 0x58, 0xaa, 0x71, 0x24, 0x41, 0x8d, 0x6b, 0x7e, 0x65, 0x21, 0x4e, 0x88, - 0xd8, 0x1b, 0x50, 0xa6, 0x93, 0xba, 0xe0, 0xb9, 0x4e, 0x77, 0xa5, 0xf3, 0xb3, 0x50, 0x96, 0x0a, - 0xe0, 0x48, 0x38, 0x36, 0x31, 0xaa, 0x52, 0x3f, 0x1c, 0xe1, 0x04, 0x6e, 0x6f, 0xc1, 0x79, 0xf6, - 0xf2, 0xef, 0xc4, 0x3b, 0xc6, 0x1e, 0xeb, 0xbd, 0x98, 0x9f, 0x13, 0x82, 0x18, 0x9f, 0x99, 0x19, - 0xcd, 0x77, 0x60, 0x54, 0x52, 0x4c, 0x84, 0x32, 0xfb, 0x8f, 0x4a, 0xf0, 0xf8, 0x6a, 0x3d, 0xdf, - 0x61, 0xf1, 0x55, 0x18, 0xe5, 0x6c, 0x1a, 0x5d, 0xda, 0x8e, 0x27, 0xda, 0x55, 0xef, 0x62, 0x1b, - 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x12, 0x14, 0xdd, 0xf7, 0xfc, 0xb4, 0x19, 0xee, 0xea, 0x9b, 0xeb, - 0x98, 0x96, 0x53, 0x30, 0xe5, 0xf8, 0xf8, 0x51, 0xaa, 0xc0, 0x8a, 0xeb, 0x7b, 0x1d, 0xc6, 0xdd, - 0xa8, 0x11, 0xb9, 0xab, 0x3e, 0x3d, 0x67, 0x12, 0x67, 0xd7, 0x44, 0x49, 0x40, 0x3b, 0xad, 0xa0, - 0x38, 0x85, 0xad, 0x9d, 0xeb, 0x03, 0x7d, 0x73, 0x8d, 0x3d, 0x3d, 0x7d, 0x28, 0x43, 0xdc, 0x62, - 0x5f, 0x17, 0x31, 0xa3, 0x36, 0xc1, 0x10, 0xf3, 0x0f, 0x8e, 0xb0, 0x84, 0x51, 0x09, 0xac, 0xb1, - 0xe3, 0xb4, 0x16, 0xda, 0xf1, 0x4e, 0xd5, 0x8d, 0x1a, 0xc1, 0x3e, 0x09, 0x0f, 0x98, 0xf0, 0x3c, - 0x9c, 0x48, 0x60, 0x0a, 0xb0, 0x74, 0x73, 0xa1, 0x46, 0x31, 0x71, 0x67, 0x1d, 0x93, 0x2b, 0x84, - 0xd3, 0xe0, 0x0a, 0x17, 0x60, 0x42, 0x36, 0x53, 0x27, 0x11, 0xbb, 0x23, 0x46, 0x58, 0xc7, 0x94, - 0xa9, 0xad, 0x28, 0x56, 0xdd, 0x4a, 0xe3, 0xa3, 0x57, 0x60, 0xcc, 0xf5, 0xdd, 0xd8, 0x75, 0xe2, - 0x20, 0x64, 0x37, 0x2c, 0x97, 0x93, 0x99, 0x25, 0xdb, 0xaa, 0x0e, 0xc0, 0x26, 0x9e, 0xfd, 0x87, - 0x25, 0x98, 0x62, 0xd3, 0xf6, 0xad, 0x15, 0xf6, 0x91, 0x59, 0x61, 0x77, 0x3b, 0x57, 0xd8, 0x69, - 0xb0, 0xbb, 0x1f, 0xe6, 0x32, 0x7b, 0x17, 0xca, 0xca, 0x16, 0x58, 0x3a, 0x03, 0x58, 0x39, 0xce, - 0x00, 0xbd, 0xb9, 0x0f, 0xf9, 0x8c, 0x5b, 0xcc, 0x7c, 0xc6, 0xfd, 0xdb, 0x16, 0x24, 0x26, 0x91, - 0xe8, 0x26, 0x94, 0x5b, 0x01, 0x33, 0x3b, 0x08, 0xa5, 0x2d, 0xcf, 0xe3, 0x99, 0x17, 0x15, 0xbf, - 0x14, 0xf9, 0xf8, 0xd5, 0x64, 0x0d, 0x9c, 0x54, 0x46, 0x8b, 0x30, 0xd4, 0x0a, 0x49, 0x3d, 0x66, - 0x2e, 0xb0, 0x3d, 0xe9, 0xf0, 0x35, 0xc2, 0xf1, 0xb1, 0xac, 0x68, 0xff, 0x92, 0x05, 0xc0, 0x5f, - 0x4a, 0x1d, 0x7f, 0x9b, 0x9c, 0x81, 0xf6, 0xb7, 0x0a, 0xa5, 0xa8, 0x45, 0x1a, 0xdd, 0x0c, 0x42, - 0x92, 0xfe, 0xd4, 0x5b, 0xa4, 0x91, 0x0c, 0x38, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xfb, 0x00, 0xc6, - 0x13, 0xb4, 0xd5, 0x98, 0xec, 0xa1, 0xe7, 0x0d, 0x97, 0xb8, 0x8b, 0x29, 0x97, 0xb8, 0x32, 0xc3, - 0xd6, 0x14, 0x8d, 0xef, 0x42, 0x71, 0xcf, 0x79, 0x20, 0x34, 0x49, 0xcf, 0x76, 0xef, 0x06, 0xa5, - 0x3f, 0xb7, 0xe6, 0x3c, 0xe0, 0x32, 0xd3, 0xb3, 0x72, 0x81, 0xac, 0x39, 0x0f, 0x8e, 0xb9, 0xd9, - 0x07, 0x3b, 0xa4, 0x6e, 0xbb, 0x51, 0xfc, 0x95, 0xff, 0x94, 0xfc, 0x67, 0xcb, 0x8e, 0x36, 0xc2, - 0xda, 0x72, 0x7d, 0xf1, 0x6e, 0xd8, 0x57, 0x5b, 0xae, 0x9f, 0x6e, 0xcb, 0xf5, 0xfb, 0x68, 0xcb, - 0xf5, 0xd1, 0xfb, 0x30, 0x24, 0xde, 0xe8, 0x99, 0xad, 0xb7, 0xa9, 0xa5, 0xca, 0x6b, 0x4f, 0x3c, - 0xf1, 0xf3, 0x36, 0xe7, 0xa5, 0x4c, 0x28, 0x4a, 0x7b, 0xb6, 0x2b, 0x1b, 0x44, 0x7f, 0xc3, 0x82, - 0x71, 0xf1, 0x1b, 0x93, 0xf7, 0xda, 0x24, 0x8a, 0x05, 0xef, 0xf9, 0xe9, 0xfe, 0xfb, 0x20, 0x2a, - 0xf2, 0xae, 0x7c, 0x5a, 0x1e, 0xb3, 0x26, 0xb0, 0x67, 0x8f, 0x52, 0xbd, 0x40, 0xff, 0xc8, 0x82, - 0xf3, 0x7b, 0xce, 0x03, 0xde, 0x22, 0x2f, 0xc3, 0x4e, 0xec, 0x06, 0xc2, 0x76, 0xfd, 0xb3, 0xfd, - 0x4d, 0x7f, 0x47, 0x75, 0xde, 0x49, 0x69, 0xe6, 0x7a, 0x3e, 0x0b, 0xa5, 0x67, 0x57, 0x33, 0xfb, - 0x35, 0xbb, 0x05, 0xc3, 0x72, 0xbd, 0x65, 0x48, 0xde, 0x55, 0x9d, 0xb1, 0x3e, 0xb1, 0x89, 0x84, - 0xee, 0x97, 0x46, 0xdb, 0x11, 0x6b, 0xed, 0x91, 0xb6, 0xf3, 0x2e, 0x8c, 0xea, 0x6b, 0xec, 0x91, - 0xb6, 0xf5, 0x1e, 0x9c, 0xcb, 0x58, 0x4b, 0x8f, 0xb4, 0xc9, 0xfb, 0x70, 0x31, 0x77, 0x7d, 0x3c, - 0xca, 0x86, 0xed, 0x5f, 0xb4, 0xf4, 0x73, 0xf0, 0x0c, 0x54, 0xf0, 0x4b, 0xa6, 0x0a, 0xfe, 0x72, - 0xf7, 0x9d, 0x93, 0xa3, 0x87, 0x7f, 0x47, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0x1b, 0x30, 0xe8, 0xd1, - 0x12, 0x69, 0x1c, 0x62, 0xf7, 0xde, 0x91, 0x09, 0x2f, 0xc5, 0xca, 0x23, 0x2c, 0x28, 0xd8, 0xbf, - 0x6a, 0x41, 0xe9, 0x0c, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x7c, 0x2e, 0x69, 0x11, 0xd2, 0x6c, 0x0e, - 0x3b, 0xf7, 0x97, 0x65, 0xd8, 0xb6, 0x9c, 0x81, 0xf9, 0x2e, 0x38, 0x77, 0x3b, 0x70, 0x9a, 0x8b, - 0x8e, 0xe7, 0xf8, 0x0d, 0x12, 0xae, 0xfa, 0xdb, 0x3d, 0xad, 0x94, 0x74, 0x9b, 0xa2, 0x42, 0x2f, - 0x9b, 0x22, 0x7b, 0x07, 0x90, 0xde, 0x80, 0xb0, 0xe3, 0xc4, 0x30, 0xe4, 0xf2, 0xa6, 0xc4, 0xf0, - 0x3f, 0x9d, 0xcd, 0xdd, 0x75, 0xf4, 0x4c, 0xb3, 0x50, 0xe4, 0x05, 0x58, 0x12, 0xb2, 0x5f, 0x85, - 0x4c, 0xdf, 0xad, 0xde, 0x6a, 0x03, 0xfb, 0x65, 0x98, 0x62, 0x35, 0x4f, 0x26, 0xd2, 0xda, 0x3f, - 0x60, 0xc1, 0xc4, 0x7a, 0x2a, 0x36, 0xc5, 0x55, 0xf6, 0xd6, 0x97, 0xa1, 0xf7, 0xad, 0xb3, 0x52, - 0x2c, 0xa0, 0xa7, 0xae, 0x5f, 0xfa, 0x33, 0x0b, 0x12, 0x57, 0xc9, 0x33, 0x60, 0xaa, 0x96, 0x0c, - 0xa6, 0x2a, 0x53, 0xef, 0xa1, 0xba, 0x93, 0xc7, 0x53, 0xa1, 0x5b, 0x2a, 0x2e, 0x40, 0x17, 0x95, - 0x47, 0x42, 0x86, 0x7b, 0x91, 0x8f, 0x9b, 0xc1, 0x03, 0x64, 0xa4, 0x00, 0x66, 0x26, 0xa4, 0x70, - 0x3f, 0x22, 0x66, 0x42, 0xaa, 0x3f, 0x39, 0xbb, 0xaf, 0xa6, 0x75, 0x99, 0x9d, 0x4a, 0xdf, 0xce, - 0xcc, 0xbe, 0x1d, 0xcf, 0x7d, 0x9f, 0xa8, 0xe0, 0x26, 0x15, 0x61, 0xc6, 0x2d, 0x4a, 0x8f, 0x0f, - 0x2b, 0x63, 0xea, 0x1f, 0x8f, 0x80, 0x95, 0x54, 0xb1, 0x6f, 0xc2, 0x44, 0x6a, 0xc0, 0xd0, 0xcb, - 0x30, 0xd0, 0xda, 0x71, 0x22, 0x92, 0x32, 0x8d, 0x1c, 0xa8, 0xd1, 0xc2, 0xe3, 0xc3, 0xca, 0xb8, - 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6, 0xff, 0xa7, 0x05, 0xa5, 0xf5, 0xa0, 0x79, 0x16, 0x8b, 0xe9, - 0x75, 0x63, 0x31, 0x3d, 0x91, 0x17, 0x3f, 0x30, 0x77, 0x1d, 0xad, 0xa4, 0xd6, 0xd1, 0xe5, 0x5c, - 0x0a, 0xdd, 0x97, 0xd0, 0x1e, 0x8c, 0xb0, 0xa8, 0x84, 0xc2, 0x54, 0xf3, 0x45, 0x83, 0xbf, 0xaf, - 0xa4, 0xf8, 0xfb, 0x09, 0x0d, 0x55, 0xe3, 0xf2, 0x9f, 0x81, 0x21, 0x61, 0x2e, 0x98, 0x36, 0x70, - 0x17, 0xb8, 0x58, 0xc2, 0xed, 0x9f, 0x2c, 0x82, 0x11, 0x05, 0x11, 0xfd, 0x9a, 0x05, 0x73, 0x21, - 0xf7, 0x18, 0x6c, 0x56, 0xdb, 0xa1, 0xeb, 0x6f, 0xd7, 0x1b, 0x3b, 0xa4, 0xd9, 0xf6, 0x5c, 0x7f, - 0x7b, 0x75, 0xdb, 0x0f, 0x54, 0xf1, 0xf2, 0x03, 0xd2, 0x68, 0x33, 0x9d, 0x7f, 0x8f, 0x90, 0x8b, - 0xca, 0x1c, 0xe7, 0xfa, 0xd1, 0x61, 0x65, 0x0e, 0x9f, 0x88, 0x36, 0x3e, 0x61, 0x5f, 0xd0, 0x37, - 0x2c, 0x98, 0xe7, 0xc1, 0x01, 0xfb, 0xef, 0x7f, 0x17, 0x69, 0xa8, 0x26, 0x49, 0x25, 0x44, 0x36, - 0x48, 0xb8, 0xb7, 0xf8, 0x8a, 0x18, 0xd0, 0xf9, 0xda, 0xc9, 0xda, 0xc2, 0x27, 0xed, 0x9c, 0xfd, - 0x2f, 0x8b, 0x30, 0x26, 0x9c, 0xd5, 0x45, 0x14, 0x94, 0x97, 0x8d, 0x25, 0xf1, 0x64, 0x6a, 0x49, - 0x4c, 0x19, 0xc8, 0xa7, 0x13, 0x00, 0x25, 0x82, 0x29, 0xcf, 0x89, 0xe2, 0x9b, 0xc4, 0x09, 0xe3, - 0x4d, 0xe2, 0x70, 0x33, 0x95, 0xe2, 0x89, 0x4d, 0x6a, 0x94, 0xfa, 0xe5, 0x76, 0x9a, 0x18, 0xee, - 0xa4, 0x8f, 0xf6, 0x01, 0x31, 0x5b, 0x9b, 0xd0, 0xf1, 0x23, 0xfe, 0x2d, 0xae, 0x78, 0x0f, 0x38, - 0x59, 0xab, 0xb3, 0xa2, 0x55, 0x74, 0xbb, 0x83, 0x1a, 0xce, 0x68, 0x41, 0xb3, 0xa1, 0x1a, 0xe8, - 0xd7, 0x86, 0x6a, 0xb0, 0x87, 0x17, 0x89, 0x0f, 0x93, 0x1d, 0xf1, 0x06, 0xde, 0x86, 0xb2, 0xb2, - 0x75, 0x13, 0x87, 0x4e, 0xf7, 0xb0, 0x1d, 0x69, 0x0a, 0x5c, 0x45, 0x92, 0xd8, 0x59, 0x26, 0xe4, - 0xec, 0x7f, 0x5c, 0x30, 0x1a, 0xe4, 0x93, 0xb8, 0x0e, 0xc3, 0x4e, 0x14, 0xb9, 0xdb, 0x3e, 0x69, - 0x8a, 0x1d, 0xfb, 0xf1, 0xbc, 0x1d, 0x6b, 0x34, 0xc3, 0xec, 0x0d, 0x17, 0x44, 0x4d, 0xac, 0x68, - 0xa0, 0x9b, 0xdc, 0x18, 0x68, 0x5f, 0xf2, 0xf3, 0xfd, 0x51, 0x03, 0x69, 0x2e, 0xb4, 0x4f, 0xb0, - 0xa8, 0x8f, 0xbe, 0xc8, 0xad, 0xb5, 0x6e, 0xf9, 0xc1, 0x7d, 0xff, 0x46, 0x10, 0x48, 0x0f, 0xb3, - 0xfe, 0x08, 0x4e, 0x49, 0x1b, 0x2d, 0x55, 0x1d, 0x9b, 0xd4, 0xfa, 0x8b, 0xc9, 0xf3, 0xdd, 0x70, - 0x8e, 0x92, 0x36, 0xfd, 0x44, 0x22, 0x44, 0x60, 0x42, 0x44, 0x42, 0x90, 0x65, 0x62, 0xec, 0x32, - 0x59, 0x75, 0xb3, 0x76, 0xa2, 0xd0, 0xbb, 0x65, 0x92, 0xc0, 0x69, 0x9a, 0xf6, 0xcf, 0x58, 0xc0, - 0x2c, 0xdc, 0xcf, 0x80, 0x65, 0xf8, 0x9c, 0xc9, 0x32, 0xcc, 0xe4, 0x0d, 0x72, 0x0e, 0xb7, 0xf0, - 0x12, 0x5f, 0x59, 0xb5, 0x30, 0x78, 0x70, 0x20, 0x5e, 0xca, 0xfb, 0xe0, 0x52, 0xff, 0x8f, 0xc5, - 0x0f, 0x31, 0xe5, 0x74, 0x8e, 0xbe, 0x07, 0x86, 0x1b, 0x4e, 0xcb, 0x69, 0xf0, 0x90, 0xbd, 0xb9, - 0x1a, 0x1b, 0xa3, 0xd2, 0xdc, 0x92, 0xa8, 0xc1, 0x35, 0x10, 0x32, 0xa2, 0xc6, 0xb0, 0x2c, 0xee, - 0xa9, 0x75, 0x50, 0x4d, 0xce, 0xee, 0xc2, 0x98, 0x41, 0xec, 0x91, 0x8a, 0xab, 0xdf, 0xc3, 0xaf, - 0x58, 0x15, 0x01, 0x66, 0x0f, 0xa6, 0x7c, 0xed, 0x3f, 0xbd, 0x50, 0xa4, 0x08, 0xf2, 0xf1, 0x5e, - 0x97, 0x28, 0xbb, 0x7d, 0x34, 0x0b, 0xfe, 0x14, 0x19, 0xdc, 0x49, 0xd9, 0xfe, 0x29, 0x0b, 0x1e, - 0xd3, 0x11, 0xb5, 0x78, 0x00, 0xbd, 0x74, 0xc0, 0x55, 0x18, 0x0e, 0x5a, 0x24, 0x74, 0xe2, 0x20, - 0x14, 0xb7, 0xc6, 0x35, 0x39, 0xe8, 0x77, 0x44, 0xf9, 0xb1, 0x88, 0x9d, 0x28, 0xa9, 0xcb, 0x72, - 0xac, 0x6a, 0x22, 0x1b, 0x06, 0xd9, 0x60, 0x44, 0x22, 0x56, 0x03, 0x3b, 0x03, 0xd8, 0x73, 0x68, - 0x84, 0x05, 0xc4, 0xfe, 0x23, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, 0xe8, 0x3d, 0x98, 0xdc, 0x73, 0xe2, - 0xc6, 0xce, 0xf2, 0x83, 0x56, 0xc8, 0x55, 0xdf, 0x72, 0x9c, 0x9e, 0xed, 0x35, 0x4e, 0xda, 0x47, - 0x26, 0x06, 0x68, 0x6b, 0x29, 0x62, 0xb8, 0x83, 0x3c, 0xda, 0x84, 0x11, 0x56, 0xc6, 0x2c, 0x9d, - 0xa3, 0x6e, 0xac, 0x41, 0x5e, 0x6b, 0xea, 0x45, 0x79, 0x2d, 0xa1, 0x83, 0x75, 0xa2, 0xf6, 0x57, - 0x8a, 0x7c, 0xb7, 0x33, 0x6e, 0xfb, 0x19, 0x18, 0x6a, 0x05, 0xcd, 0xa5, 0xd5, 0x2a, 0x16, 0xb3, - 0xa0, 0xae, 0x91, 0x1a, 0x2f, 0xc6, 0x12, 0x8e, 0x5e, 0x03, 0x20, 0x0f, 0x62, 0x12, 0xfa, 0x8e, - 0xa7, 0x0c, 0x42, 0x94, 0x09, 0x64, 0x35, 0x58, 0x0f, 0xe2, 0xbb, 0x11, 0xf9, 0xae, 0x65, 0x85, - 0x82, 0x35, 0x74, 0x74, 0x1d, 0xa0, 0x15, 0x06, 0xfb, 0x6e, 0x93, 0xb9, 0xce, 0x15, 0x4d, 0x73, - 0x89, 0x9a, 0x82, 0x60, 0x0d, 0x0b, 0xbd, 0x06, 0x63, 0x6d, 0x3f, 0xe2, 0x1c, 0x8a, 0xb3, 0x29, - 0x22, 0x0f, 0x0e, 0x27, 0x96, 0x0b, 0x77, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x02, 0x0c, 0xc6, 0x0e, - 0xb3, 0x77, 0x18, 0xc8, 0xb7, 0x5b, 0xdc, 0xa0, 0x18, 0x7a, 0xc0, 0x58, 0x5a, 0x01, 0x8b, 0x8a, - 0xe8, 0x6d, 0xe9, 0x87, 0xc0, 0xcf, 0x7a, 0x61, 0x30, 0xdc, 0xdf, 0xbd, 0xa0, 0x79, 0x21, 0x08, - 0x43, 0x64, 0x83, 0x96, 0xfd, 0x8d, 0x32, 0x40, 0xc2, 0x8e, 0xa3, 0xf7, 0x3b, 0xce, 0xa3, 0xe7, - 0xba, 0x33, 0xf0, 0xa7, 0x77, 0x18, 0xa1, 0xef, 0xb7, 0x60, 0xc4, 0xf1, 0xbc, 0xa0, 0xe1, 0xc4, - 0x6c, 0x94, 0x0b, 0xdd, 0xcf, 0x43, 0xd1, 0xfe, 0x42, 0x52, 0x83, 0x77, 0xe1, 0x45, 0xb9, 0xf0, - 0x34, 0x48, 0xcf, 0x5e, 0xe8, 0x0d, 0xa3, 0x4f, 0x49, 0x29, 0x8d, 0x2f, 0x8f, 0xd9, 0xb4, 0x94, - 0x56, 0x66, 0x47, 0xbf, 0x26, 0xa0, 0xa1, 0xbb, 0x46, 0x50, 0xb9, 0x52, 0x7e, 0x7c, 0x05, 0x83, - 0x2b, 0xed, 0x15, 0x4f, 0x0e, 0xd5, 0x74, 0xc7, 0xa9, 0x81, 0xfc, 0x20, 0x24, 0x9a, 0xf8, 0xd3, - 0xc3, 0x69, 0xea, 0x5d, 0x98, 0x68, 0x9a, 0x77, 0xbb, 0x58, 0x4d, 0x4f, 0xe7, 0xd1, 0x4d, 0xb1, - 0x02, 0xc9, 0x6d, 0x9e, 0x02, 0xe0, 0x34, 0x61, 0x54, 0xe3, 0x2e, 0x6c, 0xab, 0xfe, 0x56, 0x20, - 0x0c, 0xcf, 0xed, 0xdc, 0xb9, 0x3c, 0x88, 0x62, 0xb2, 0x47, 0x31, 0x93, 0x4b, 0x7b, 0x5d, 0xd4, - 0xc5, 0x8a, 0x0a, 0x7a, 0x03, 0x06, 0x99, 0x0f, 0x6c, 0x34, 0x33, 0x9c, 0xaf, 0x28, 0x34, 0xc3, - 0x37, 0x24, 0x9b, 0x8a, 0xfd, 0x8d, 0xb0, 0xa0, 0x80, 0x6e, 0xca, 0x18, 0x2f, 0xd1, 0xaa, 0x7f, - 0x37, 0x22, 0x2c, 0xc6, 0x4b, 0x79, 0xf1, 0xe3, 0x49, 0xf8, 0x16, 0x5e, 0x9e, 0x19, 0x1a, 0xde, - 0xa8, 0x49, 0x99, 0x23, 0xf1, 0x5f, 0x46, 0x9c, 0x9f, 0x81, 0xfc, 0xee, 0x99, 0x51, 0xe9, 0x93, - 0xe1, 0xbc, 0x67, 0x92, 0xc0, 0x69, 0x9a, 0x94, 0xd1, 0xe4, 0x3b, 0x57, 0x98, 0xae, 0xf7, 0xda, - 0xff, 0x5c, 0xbe, 0x66, 0x97, 0x0c, 0x2f, 0xc1, 0xa2, 0xfe, 0x99, 0xde, 0xfa, 0xb3, 0x3e, 0x4c, - 0xa6, 0xb7, 0xe8, 0x23, 0xe5, 0x32, 0xfe, 0xa0, 0x04, 0xe3, 0xe6, 0x92, 0x42, 0xf3, 0x50, 0x16, - 0x44, 0x54, 0xc0, 0x51, 0xb5, 0x4b, 0xd6, 0x24, 0x00, 0x27, 0x38, 0x2c, 0xce, 0x2c, 0xab, 0xae, - 0x99, 0x1c, 0x26, 0x71, 0x66, 0x15, 0x04, 0x6b, 0x58, 0x54, 0x5e, 0xda, 0x0c, 0x82, 0x58, 0x5d, - 0x2a, 0x6a, 0xdd, 0x2d, 0xb2, 0x52, 0x2c, 0xa0, 0xf4, 0x32, 0xd9, 0x25, 0xa1, 0x4f, 0x3c, 0x33, - 0x8e, 0x99, 0xba, 0x4c, 0x6e, 0xe9, 0x40, 0x6c, 0xe2, 0xd2, 0x5b, 0x32, 0x88, 0xd8, 0x42, 0x16, - 0x52, 0x59, 0x62, 0xc2, 0x59, 0xe7, 0xde, 0xe4, 0x12, 0x8e, 0xbe, 0x00, 0x8f, 0x29, 0xe7, 0x6f, - 0xcc, 0x95, 0xd0, 0xb2, 0xc5, 0x41, 0x43, 0x89, 0xf2, 0xd8, 0x52, 0x36, 0x1a, 0xce, 0xab, 0x8f, - 0x5e, 0x87, 0x71, 0xc1, 0xb9, 0x4b, 0x8a, 0x43, 0xa6, 0x5d, 0xc4, 0x2d, 0x03, 0x8a, 0x53, 0xd8, - 0x32, 0x12, 0x1b, 0x63, 0x9e, 0x25, 0x85, 0xe1, 0xce, 0x48, 0x6c, 0x3a, 0x1c, 0x77, 0xd4, 0x40, - 0x0b, 0x30, 0xc1, 0x59, 0x2b, 0xd7, 0xdf, 0xe6, 0x73, 0x22, 0x3c, 0x4b, 0xd4, 0x96, 0xba, 0x63, - 0x82, 0x71, 0x1a, 0x1f, 0xbd, 0x0a, 0xa3, 0x4e, 0xd8, 0xd8, 0x71, 0x63, 0xd2, 0x88, 0xdb, 0x21, - 0x77, 0x39, 0xd1, 0x0c, 0x4b, 0x16, 0x34, 0x18, 0x36, 0x30, 0xed, 0xf7, 0xe1, 0x5c, 0x86, 0x53, - 0x1a, 0x5d, 0x38, 0x4e, 0xcb, 0x95, 0xdf, 0x94, 0x32, 0xc6, 0x5c, 0xa8, 0xad, 0xca, 0xaf, 0xd1, - 0xb0, 0xe8, 0xea, 0x64, 0xce, 0x6b, 0x5a, 0x82, 0x09, 0xb5, 0x3a, 0x57, 0x24, 0x00, 0x27, 0x38, - 0xf6, 0xff, 0x2a, 0xc0, 0x44, 0x86, 0x62, 0x9d, 0x25, 0x39, 0x48, 0xc9, 0x1e, 0x49, 0x4e, 0x03, - 0x33, 0xb0, 0x5f, 0xe1, 0x04, 0x81, 0xfd, 0x8a, 0xbd, 0x02, 0xfb, 0x95, 0x3e, 0x48, 0x60, 0x3f, - 0x73, 0xc4, 0x06, 0xfa, 0x1a, 0xb1, 0x8c, 0x60, 0x80, 0x83, 0x27, 0x0c, 0x06, 0x68, 0x0c, 0xfa, - 0x50, 0x1f, 0x83, 0xfe, 0xa3, 0x05, 0x98, 0x4c, 0x1b, 0xc0, 0x9d, 0x81, 0x3a, 0xf6, 0x0d, 0x43, - 0x1d, 0x9b, 0x9d, 0x32, 0x24, 0x6d, 0x96, 0x97, 0xa7, 0x9a, 0xc5, 0x29, 0xd5, 0xec, 0x27, 0xfb, - 0xa2, 0xd6, 0x5d, 0x4d, 0xfb, 0x77, 0x0b, 0x30, 0x9d, 0xae, 0xb2, 0xe4, 0x39, 0xee, 0xde, 0x19, - 0x8c, 0xcd, 0x1d, 0x63, 0x6c, 0x9e, 0xef, 0xe7, 0x6b, 0x58, 0xd7, 0x72, 0x07, 0xe8, 0xad, 0xd4, - 0x00, 0xcd, 0xf7, 0x4f, 0xb2, 0xfb, 0x28, 0x7d, 0xb3, 0x08, 0x97, 0x33, 0xeb, 0x25, 0xda, 0xcc, - 0x15, 0x43, 0x9b, 0x79, 0x3d, 0xa5, 0xcd, 0xb4, 0xbb, 0xd7, 0x3e, 0x1d, 0xf5, 0xa6, 0xf0, 0x16, - 0x64, 0xc1, 0xdf, 0x1e, 0x52, 0xb5, 0x69, 0x78, 0x0b, 0x2a, 0x42, 0xd8, 0xa4, 0xfb, 0x17, 0x49, - 0xa5, 0xf9, 0x6f, 0x2c, 0xb8, 0x98, 0x39, 0x37, 0x67, 0xa0, 0xc2, 0x5a, 0x37, 0x55, 0x58, 0xcf, - 0xf4, 0xbd, 0x5a, 0x73, 0x74, 0x5a, 0x7f, 0x58, 0xcc, 0xf9, 0x16, 0x26, 0xa0, 0xdf, 0x81, 0x11, - 0xa7, 0xd1, 0x20, 0x51, 0xb4, 0x16, 0x34, 0x55, 0x30, 0xb4, 0xe7, 0x99, 0x9c, 0x95, 0x14, 0x1f, - 0x1f, 0x56, 0x66, 0xd3, 0x24, 0x12, 0x30, 0xd6, 0x29, 0x98, 0xf1, 0x1b, 0x0b, 0xa7, 0x1a, 0xbf, - 0xf1, 0x3a, 0xc0, 0xbe, 0xe2, 0xd6, 0xd3, 0x42, 0xbe, 0xc6, 0xc7, 0x6b, 0x58, 0xe8, 0x8b, 0x30, - 0x1c, 0x89, 0x6b, 0x5c, 0x2c, 0xc5, 0x17, 0xfb, 0x9c, 0x2b, 0x67, 0x93, 0x78, 0xa6, 0x5b, 0xba, - 0xd2, 0x87, 0x28, 0x92, 0xe8, 0x3b, 0x60, 0x32, 0xe2, 0x51, 0x4f, 0x96, 0x3c, 0x27, 0x62, 0x3e, - 0x0e, 0x62, 0x15, 0x32, 0x5f, 0xf3, 0x7a, 0x0a, 0x86, 0x3b, 0xb0, 0xd1, 0x8a, 0xfc, 0x28, 0x16, - 0xa2, 0x85, 0x2f, 0xcc, 0xab, 0xc9, 0x07, 0x89, 0x14, 0x4b, 0xe7, 0xd3, 0xc3, 0xcf, 0x06, 0x5e, - 0xab, 0x69, 0xff, 0x68, 0x09, 0x1e, 0xef, 0x72, 0x88, 0xa1, 0x05, 0xf3, 0x8d, 0xf2, 0xd9, 0xb4, - 0xf4, 0x3b, 0x9b, 0x59, 0xd9, 0x10, 0x87, 0x53, 0x6b, 0xa5, 0xf0, 0x81, 0xd7, 0xca, 0x0f, 0x59, - 0x9a, 0x5e, 0x82, 0x5b, 0xd2, 0x7d, 0xee, 0x84, 0x87, 0xf3, 0x29, 0x2a, 0x2a, 0xb6, 0x32, 0xa4, - 0xfd, 0xeb, 0x7d, 0x77, 0xa7, 0x6f, 0xf1, 0xff, 0x6c, 0xb5, 0xb3, 0x5f, 0xb1, 0xe0, 0xc9, 0xcc, - 0xfe, 0x1a, 0x36, 0x15, 0xf3, 0x50, 0x6e, 0xd0, 0x42, 0xcd, 0x6f, 0x2a, 0x71, 0x28, 0x95, 0x00, - 0x9c, 0xe0, 0x18, 0xa6, 0x13, 0x85, 0x9e, 0xa6, 0x13, 0xff, 0xc2, 0x82, 0x8e, 0x05, 0x7c, 0x06, - 0x27, 0xe9, 0xaa, 0x79, 0x92, 0x7e, 0xbc, 0x9f, 0xb9, 0xcc, 0x39, 0x44, 0xff, 0xf3, 0x04, 0x5c, - 0xc8, 0x71, 0x94, 0xd8, 0x87, 0xa9, 0xed, 0x06, 0x31, 0x3d, 0xd2, 0xc4, 0xc7, 0x64, 0x3a, 0xef, - 0x75, 0x75, 0x5f, 0x63, 0xb9, 0x71, 0xa6, 0x3a, 0x50, 0x70, 0x67, 0x13, 0xe8, 0x2b, 0x16, 0x9c, - 0x77, 0xee, 0x47, 0x1d, 0x19, 0x10, 0xc5, 0x9a, 0x79, 0x29, 0x53, 0x4b, 0xd1, 0x23, 0x63, 0x22, - 0x4f, 0x16, 0x94, 0x85, 0x85, 0x33, 0xdb, 0x42, 0x58, 0xc4, 0xaf, 0xa4, 0xfc, 0x76, 0x17, 0x9f, - 0xc9, 0x2c, 0x8f, 0x16, 0x7e, 0xa6, 0x4a, 0x08, 0x56, 0x74, 0xd0, 0x3d, 0x28, 0x6f, 0x4b, 0x37, - 0x33, 0x71, 0x66, 0x67, 0x5e, 0x82, 0x99, 0xbe, 0x68, 0xfc, 0xdd, 0x50, 0x81, 0x70, 0x42, 0x0a, - 0xbd, 0x0e, 0x45, 0x7f, 0x2b, 0xea, 0x96, 0x65, 0x27, 0x65, 0x6a, 0xc4, 0xfd, 0x91, 0xd7, 0x57, - 0xea, 0x98, 0x56, 0x44, 0x37, 0xa1, 0x18, 0x6e, 0x36, 0x85, 0x62, 0x2d, 0x93, 0x2f, 0xc5, 0x8b, - 0xd5, 0xec, 0x45, 0xc2, 0x29, 0xe1, 0xc5, 0x2a, 0xa6, 0x24, 0x50, 0x0d, 0x06, 0x98, 0x4f, 0x81, - 0xd0, 0x9f, 0x65, 0x32, 0xa4, 0x5d, 0x7c, 0x73, 0xb8, 0xd3, 0x32, 0x43, 0xc0, 0x9c, 0x10, 0xda, - 0x80, 0xc1, 0x06, 0xcb, 0xc8, 0x22, 0x42, 0x26, 0x7f, 0x2a, 0x53, 0x85, 0xd6, 0x25, 0x55, 0x8d, - 0xd0, 0x28, 0x31, 0x0c, 0x2c, 0x68, 0x31, 0xaa, 0xa4, 0xb5, 0xb3, 0x15, 0x31, 0x11, 0x3c, 0x8f, - 0x6a, 0x97, 0x0c, 0x4c, 0x82, 0x2a, 0xc3, 0xc0, 0x82, 0x16, 0xfa, 0x0c, 0x14, 0xb6, 0x1a, 0xc2, - 0xe5, 0x20, 0x53, 0x97, 0x66, 0xba, 0x94, 0x2f, 0x0e, 0x1e, 0x1d, 0x56, 0x0a, 0x2b, 0x4b, 0xb8, - 0xb0, 0xd5, 0x40, 0xeb, 0x30, 0xb4, 0xc5, 0x9d, 0x50, 0x85, 0xba, 0xec, 0xe9, 0x6c, 0xff, 0xd8, - 0x0e, 0x3f, 0x55, 0x6e, 0x2a, 0x2f, 0x00, 0x58, 0x12, 0x61, 0x41, 0x20, 0x95, 0x33, 0xad, 0x88, - 0x86, 0x3c, 0x77, 0x32, 0x07, 0x68, 0xee, 0xde, 0x9e, 0xb8, 0xe4, 0x62, 0x8d, 0x22, 0xfa, 0x32, - 0x94, 0x1d, 0x99, 0x7b, 0x4f, 0x44, 0x8b, 0x78, 0x31, 0x73, 0x63, 0x76, 0x4f, 0x4b, 0xc8, 0x57, - 0xb5, 0x42, 0xc2, 0x09, 0x51, 0xb4, 0x0b, 0x63, 0xfb, 0x51, 0x6b, 0x87, 0xc8, 0x8d, 0xcc, 0x82, - 0x47, 0xe4, 0x5c, 0x5c, 0xf7, 0x04, 0xa2, 0x1b, 0xc6, 0x6d, 0xc7, 0xeb, 0x38, 0x7b, 0xd8, 0x63, - 0xf3, 0x3d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0xe1, 0x7f, 0xaf, 0x1d, 0x6c, 0x1e, 0xc4, 0x44, 0x84, - 0x4f, 0xce, 0x1c, 0xfe, 0x37, 0x39, 0x4a, 0xe7, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xe8, 0x56, 0x77, - 0x64, 0x5e, 0x4b, 0x16, 0x36, 0x39, 0x67, 0xab, 0x67, 0x26, 0xbf, 0xd4, 0x06, 0x85, 0x9d, 0x91, - 0x09, 0x29, 0x76, 0x36, 0xb6, 0x76, 0x82, 0x38, 0xf0, 0x53, 0xe7, 0xf2, 0x54, 0xfe, 0xd9, 0x58, - 0xcb, 0xc0, 0xef, 0x3c, 0x1b, 0xb3, 0xb0, 0x70, 0x66, 0x5b, 0xa8, 0x09, 0xe3, 0xad, 0x20, 0x8c, - 0xef, 0x07, 0xa1, 0x5c, 0x5f, 0xa8, 0x8b, 0xb8, 0x6f, 0x60, 0x8a, 0x16, 0x59, 0x38, 0x6f, 0x13, - 0x82, 0x53, 0x34, 0xd1, 0xe7, 0x61, 0x28, 0x6a, 0x38, 0x1e, 0x59, 0xbd, 0x33, 0x73, 0x2e, 0xff, - 0xd2, 0xa9, 0x73, 0x94, 0x9c, 0xd5, 0xc5, 0x26, 0x47, 0xa0, 0x60, 0x49, 0x0e, 0xad, 0xc0, 0x00, - 0x8b, 0xc9, 0xcf, 0x22, 0x3f, 0xe7, 0x44, 0x25, 0xea, 0x30, 0xea, 0xe4, 0x67, 0x13, 0x2b, 0xc6, - 0xbc, 0x3a, 0xdd, 0x03, 0x82, 0xeb, 0x0d, 0xa2, 0x99, 0xe9, 0xfc, 0x3d, 0x20, 0x98, 0xe5, 0x3b, - 0xf5, 0x6e, 0x7b, 0x40, 0x21, 0xe1, 0x84, 0x28, 0x3d, 0x99, 0xe9, 0x69, 0x7a, 0xa1, 0x8b, 0x9d, - 0x49, 0xee, 0x59, 0xca, 0x4e, 0x66, 0x7a, 0x92, 0x52, 0x12, 0xf6, 0xef, 0x0d, 0x75, 0x72, 0x2a, - 0x4c, 0x4e, 0xfa, 0xcb, 0x56, 0xc7, 0x13, 0xda, 0xa7, 0xfb, 0x55, 0xdb, 0x9c, 0x22, 0x8f, 0xfa, - 0x15, 0x0b, 0x2e, 0xb4, 0x32, 0x3f, 0x44, 0x5c, 0xfb, 0xfd, 0x69, 0x7f, 0xf8, 0xa7, 0xab, 0xe8, - 0xec, 0xd9, 0x70, 0x9c, 0xd3, 0x52, 0x5a, 0x0e, 0x28, 0x7e, 0x60, 0x39, 0x60, 0x0d, 0x86, 0x19, - 0x6b, 0xd9, 0x23, 0x43, 0x59, 0xda, 0x0b, 0x8d, 0x31, 0x10, 0x4b, 0xa2, 0x22, 0x56, 0x24, 0xd0, - 0x0f, 0x5b, 0x70, 0x29, 0xdd, 0x75, 0x4c, 0x18, 0x58, 0xc4, 0x32, 0xe7, 0x22, 0xda, 0x8a, 0xf8, - 0xfe, 0x4b, 0xb5, 0x6e, 0xc8, 0xc7, 0xbd, 0x10, 0x70, 0xf7, 0xc6, 0x50, 0x35, 0x43, 0x46, 0x1c, - 0x34, 0xf5, 0xe2, 0x7d, 0xc8, 0x89, 0x2f, 0xc1, 0xe8, 0x5e, 0xd0, 0xf6, 0x63, 0x61, 0x96, 0x22, - 0x9c, 0x04, 0xd9, 0x3b, 0xf0, 0x9a, 0x56, 0x8e, 0x0d, 0xac, 0x94, 0x74, 0x39, 0xfc, 0xb0, 0xd2, - 0x25, 0x7a, 0x27, 0x95, 0x87, 0xba, 0x9c, 0x1f, 0x33, 0x4f, 0x08, 0xe2, 0x27, 0xc8, 0x46, 0x7d, - 0xb6, 0x12, 0xd1, 0xcf, 0x59, 0x19, 0xac, 0x3c, 0x97, 0x91, 0x3f, 0x6b, 0xca, 0xc8, 0x57, 0xd3, - 0x32, 0x72, 0x87, 0x4e, 0xd4, 0x10, 0x8f, 0xfb, 0x0f, 0xbc, 0xdc, 0x6f, 0x24, 0x33, 0xdb, 0x83, - 0x2b, 0xbd, 0xae, 0x25, 0x66, 0x9f, 0xd4, 0x54, 0x2f, 0x60, 0x89, 0x7d, 0x52, 0x73, 0xb5, 0x8a, - 0x19, 0xa4, 0xdf, 0x50, 0x17, 0xf6, 0x7f, 0xb3, 0xa0, 0x58, 0x0b, 0x9a, 0x67, 0xa0, 0xe3, 0xfd, - 0x9c, 0xa1, 0xe3, 0x7d, 0x3c, 0x27, 0x3f, 0x78, 0xae, 0x46, 0x77, 0x39, 0xa5, 0xd1, 0xbd, 0x94, - 0x47, 0xa0, 0xbb, 0xfe, 0xf6, 0xa7, 0x8b, 0xa0, 0x67, 0x33, 0x47, 0xff, 0xea, 0x61, 0x8c, 0x83, - 0x8b, 0xdd, 0x12, 0x9c, 0x0b, 0xca, 0xcc, 0xac, 0x49, 0xfa, 0xbd, 0xfd, 0x39, 0xb3, 0x11, 0x7e, - 0x8b, 0xb8, 0xdb, 0x3b, 0x31, 0x69, 0xa6, 0x3f, 0xe7, 0xec, 0x6c, 0x84, 0xff, 0x8b, 0x05, 0x13, - 0xa9, 0xd6, 0x91, 0x07, 0x63, 0x9e, 0xae, 0xa0, 0x13, 0xeb, 0xf4, 0xa1, 0x74, 0x7b, 0xc2, 0xc6, - 0x52, 0x2b, 0xc2, 0x26, 0x71, 0x34, 0x07, 0xa0, 0x1e, 0xd0, 0xa4, 0xde, 0x8b, 0x71, 0xfd, 0xea, - 0x85, 0x2d, 0xc2, 0x1a, 0x06, 0x7a, 0x19, 0x46, 0xe2, 0xa0, 0x15, 0x78, 0xc1, 0xf6, 0xc1, 0x2d, - 0x22, 0x83, 0xab, 0x28, 0xcb, 0xa9, 0x8d, 0x04, 0x84, 0x75, 0x3c, 0xfb, 0x67, 0x8b, 0x90, 0xce, - 0x80, 0xff, 0xad, 0x35, 0xf9, 0xd1, 0x5c, 0x93, 0xdf, 0xb4, 0x60, 0x92, 0xb6, 0xce, 0xac, 0x38, - 0xe4, 0x65, 0xab, 0x12, 0xc0, 0x58, 0x5d, 0x12, 0xc0, 0x5c, 0xa5, 0x67, 0x57, 0x33, 0x68, 0xc7, - 0x42, 0x6f, 0xa6, 0x1d, 0x4e, 0xb4, 0x14, 0x0b, 0xa8, 0xc0, 0x23, 0x61, 0x28, 0x5c, 0x93, 0x74, - 0x3c, 0x12, 0x86, 0x58, 0x40, 0x65, 0x7e, 0x98, 0x52, 0x4e, 0x7e, 0x18, 0x16, 0x2a, 0x4e, 0xbc, - 0xf7, 0x0b, 0xb6, 0x47, 0x0b, 0x15, 0x27, 0x0d, 0x01, 0x12, 0x1c, 0xfb, 0x17, 0x8b, 0x30, 0x5a, - 0x0b, 0x9a, 0xc9, 0x13, 0xd6, 0x4b, 0xc6, 0x13, 0xd6, 0x95, 0xd4, 0x13, 0xd6, 0xa4, 0x8e, 0xfb, - 0xad, 0x07, 0xab, 0x0f, 0xeb, 0xc1, 0xea, 0x9f, 0x5b, 0x6c, 0xd6, 0xaa, 0xeb, 0x75, 0x91, 0x9f, - 0xf6, 0x05, 0x18, 0x61, 0x07, 0x12, 0xf3, 0x85, 0x93, 0xef, 0x3a, 0x2c, 0xf4, 0xfb, 0x7a, 0x52, - 0x8c, 0x75, 0x1c, 0x74, 0x0d, 0x86, 0x23, 0xe2, 0x84, 0x8d, 0x1d, 0x75, 0xc6, 0x89, 0x57, 0x0f, - 0x5e, 0x86, 0x15, 0x14, 0xbd, 0x99, 0x44, 0x29, 0x2b, 0xe6, 0x67, 0x5a, 0xd5, 0xfb, 0xc3, 0xb7, - 0x48, 0x7e, 0x68, 0x32, 0xfb, 0x2d, 0x40, 0x9d, 0xf8, 0x7d, 0xc4, 0x23, 0xaa, 0x98, 0xf1, 0x88, - 0xca, 0x1d, 0xb1, 0x88, 0xfe, 0xd4, 0x82, 0xf1, 0x5a, 0xd0, 0xa4, 0x5b, 0xf7, 0x2f, 0xd2, 0x3e, - 0xd5, 0x43, 0x34, 0x0e, 0x76, 0x09, 0xd1, 0xf8, 0xf7, 0x2c, 0x18, 0xaa, 0x05, 0xcd, 0x33, 0xd0, - 0xb6, 0x7f, 0xd6, 0xd4, 0xb6, 0x3f, 0x96, 0xb3, 0x24, 0x72, 0x14, 0xec, 0xbf, 0x5c, 0x84, 0x31, - 0xda, 0xcf, 0x60, 0x5b, 0xce, 0x92, 0x31, 0x22, 0x56, 0x1f, 0x23, 0x42, 0xd9, 0xdc, 0xc0, 0xf3, - 0x82, 0xfb, 0xe9, 0x19, 0x5b, 0x61, 0xa5, 0x58, 0x40, 0xd1, 0x73, 0x30, 0xdc, 0x0a, 0xc9, 0xbe, - 0x1b, 0x08, 0xfe, 0x51, 0x7b, 0xbb, 0xa8, 0x89, 0x72, 0xac, 0x30, 0xa8, 0xdc, 0x15, 0xb9, 0x7e, - 0x83, 0xc8, 0x34, 0xcf, 0x25, 0x96, 0x09, 0x8a, 0xc7, 0x5e, 0xd6, 0xca, 0xb1, 0x81, 0x85, 0xde, - 0x82, 0x32, 0xfb, 0xcf, 0x4e, 0x94, 0x93, 0x67, 0xae, 0x11, 0x09, 0x0f, 0x04, 0x01, 0x9c, 0xd0, - 0x42, 0xd7, 0x01, 0x62, 0x19, 0x9f, 0x37, 0x12, 0x61, 0x65, 0x14, 0xaf, 0xad, 0x22, 0xf7, 0x46, - 0x58, 0xc3, 0x42, 0xcf, 0x42, 0x39, 0x76, 0x5c, 0xef, 0xb6, 0xeb, 0x93, 0x88, 0xa9, 0x9c, 0x8b, - 0x32, 0x9f, 0x81, 0x28, 0xc4, 0x09, 0x9c, 0xf2, 0x3a, 0xcc, 0xe7, 0x9a, 0xe7, 0xbd, 0x1a, 0x66, - 0xd8, 0x8c, 0xd7, 0xb9, 0xad, 0x4a, 0xb1, 0x86, 0x61, 0xbf, 0x0a, 0xd3, 0xb5, 0xa0, 0x59, 0x0b, - 0xc2, 0x78, 0x25, 0x08, 0xef, 0x3b, 0x61, 0x53, 0xce, 0x5f, 0x45, 0x86, 0xd6, 0xa7, 0x67, 0xcf, - 0x00, 0xdf, 0x99, 0x46, 0xd0, 0xfc, 0x17, 0x19, 0xb7, 0x73, 0x42, 0x5f, 0x8b, 0x06, 0xbb, 0x77, - 0x55, 0x8a, 0xbb, 0x1b, 0x4e, 0x4c, 0xd0, 0x1d, 0x96, 0x16, 0x2b, 0xb9, 0x82, 0x44, 0xf5, 0x67, - 0xb4, 0xb4, 0x58, 0x09, 0x30, 0xf3, 0xce, 0x32, 0xeb, 0xdb, 0xbf, 0x5e, 0x64, 0xa7, 0x51, 0x2a, - 0xe3, 0x1b, 0xfa, 0x12, 0x8c, 0x47, 0xe4, 0xb6, 0xeb, 0xb7, 0x1f, 0x48, 0x21, 0xbc, 0x8b, 0xb7, - 0x4c, 0x7d, 0x59, 0xc7, 0xe4, 0xaa, 0x3c, 0xb3, 0x0c, 0xa7, 0xa8, 0xd1, 0x79, 0x0a, 0xdb, 0xfe, - 0x42, 0x74, 0x37, 0x22, 0xa1, 0xc8, 0x38, 0xc6, 0xe6, 0x09, 0xcb, 0x42, 0x9c, 0xc0, 0xe9, 0xba, - 0x64, 0x7f, 0xd6, 0x03, 0x1f, 0x07, 0x41, 0x2c, 0x57, 0x32, 0xcb, 0x59, 0xa3, 0x95, 0x63, 0x03, - 0x0b, 0xad, 0x00, 0x8a, 0xda, 0xad, 0x96, 0xc7, 0xde, 0xdb, 0x1d, 0xef, 0x46, 0x18, 0xb4, 0x5b, - 0xfc, 0xad, 0xb3, 0xb8, 0x78, 0x81, 0x5e, 0x61, 0xf5, 0x0e, 0x28, 0xce, 0xa8, 0x41, 0x4f, 0x9f, - 0xad, 0x88, 0xfd, 0x66, 0xab, 0xbb, 0x28, 0xd4, 0xeb, 0x75, 0x56, 0x84, 0x25, 0x8c, 0x2e, 0x26, - 0xd6, 0x3c, 0xc7, 0x1c, 0x4c, 0x16, 0x13, 0x56, 0xa5, 0x58, 0xc3, 0x40, 0xcb, 0x30, 0x14, 0x1d, - 0x44, 0x8d, 0x58, 0x04, 0x41, 0xca, 0xc9, 0x1d, 0x59, 0x67, 0x28, 0x5a, 0x3e, 0x03, 0x5e, 0x05, - 0xcb, 0xba, 0xf6, 0xf7, 0xb0, 0xcb, 0x90, 0xe5, 0xa7, 0x8a, 0xdb, 0x21, 0x41, 0x7b, 0x30, 0xd6, - 0x62, 0x53, 0x2e, 0xa2, 0x27, 0x8b, 0x79, 0x7b, 0xa9, 0x4f, 0xa9, 0xf6, 0x3e, 0x3d, 0x68, 0x94, - 0xd6, 0x89, 0x89, 0x0b, 0x35, 0x9d, 0x1c, 0x36, 0xa9, 0xdb, 0x3f, 0x38, 0xc5, 0xce, 0xdc, 0x3a, - 0x17, 0x55, 0x87, 0x84, 0xc5, 0xaf, 0xe0, 0xcb, 0x67, 0xf3, 0x75, 0x26, 0xc9, 0x17, 0x09, 0xab, - 0x61, 0x2c, 0xeb, 0xa2, 0x37, 0xd9, 0xdb, 0x34, 0x3f, 0xe8, 0x7a, 0xa5, 0x09, 0xe6, 0x58, 0xc6, - 0x33, 0xb4, 0xa8, 0x88, 0x35, 0x22, 0xe8, 0x36, 0x8c, 0x89, 0x74, 0x46, 0x42, 0x29, 0x56, 0x34, - 0x94, 0x1e, 0x63, 0x58, 0x07, 0x1e, 0xa7, 0x0b, 0xb0, 0x59, 0x19, 0x6d, 0xc3, 0x25, 0x2d, 0xb7, - 0xdf, 0x8d, 0xd0, 0x61, 0xef, 0x95, 0x2e, 0xdb, 0x44, 0xda, 0xb9, 0xf9, 0xe4, 0xd1, 0x61, 0xe5, - 0xd2, 0x46, 0x37, 0x44, 0xdc, 0x9d, 0x0e, 0xba, 0x03, 0xd3, 0xdc, 0xb1, 0xae, 0x4a, 0x9c, 0xa6, - 0xe7, 0xfa, 0xea, 0x60, 0xe6, 0xeb, 0xf0, 0xe2, 0xd1, 0x61, 0x65, 0x7a, 0x21, 0x0b, 0x01, 0x67, - 0xd7, 0x43, 0x9f, 0x85, 0x72, 0xd3, 0x8f, 0xc4, 0x18, 0x0c, 0x1a, 0x69, 0x2b, 0xcb, 0xd5, 0xf5, - 0xba, 0xfa, 0xfe, 0xe4, 0x0f, 0x4e, 0x2a, 0xa0, 0x6d, 0xae, 0x18, 0x53, 0x72, 0xe8, 0x50, 0x7e, - 0x8a, 0x72, 0xb1, 0x24, 0x0c, 0xd7, 0x1a, 0xae, 0x11, 0x56, 0xa6, 0xa9, 0x86, 0xd7, 0x8d, 0x41, - 0x18, 0xbd, 0x01, 0x88, 0x32, 0x6a, 0x6e, 0x83, 0x2c, 0x34, 0x58, 0x10, 0x6b, 0xa6, 0x47, 0x1c, - 0x36, 0x5c, 0x19, 0x50, 0xbd, 0x03, 0x03, 0x67, 0xd4, 0x42, 0x37, 0xe9, 0x41, 0xa6, 0x97, 0x0a, - 0x13, 0x5b, 0xc9, 0xdc, 0xcf, 0x54, 0x49, 0x2b, 0x24, 0x0d, 0x27, 0x26, 0x4d, 0x93, 0x22, 0x4e, - 0xd5, 0xa3, 0x77, 0xa9, 0xca, 0x67, 0x03, 0x66, 0xa4, 0x8a, 0xce, 0x9c, 0x36, 0x54, 0x2e, 0xde, - 0x09, 0xa2, 0x78, 0x9d, 0xc4, 0xf7, 0x83, 0x70, 0x57, 0x04, 0x06, 0x4b, 0x62, 0x54, 0x26, 0x20, - 0xac, 0xe3, 0x51, 0x3e, 0x98, 0x3d, 0x0e, 0xaf, 0x56, 0xd9, 0x0b, 0xdd, 0x70, 0xb2, 0x4f, 0x6e, - 0xf2, 0x62, 0x2c, 0xe1, 0x12, 0x75, 0xb5, 0xb6, 0xc4, 0x5e, 0xdb, 0x52, 0xa8, 0xab, 0xb5, 0x25, - 0x2c, 0xe1, 0x88, 0x74, 0xa6, 0x04, 0x1d, 0xcf, 0xd7, 0x6a, 0x76, 0x5e, 0x07, 0x7d, 0x66, 0x05, - 0xf5, 0x61, 0x52, 0x25, 0x23, 0xe5, 0x11, 0xd3, 0xa2, 0x99, 0x09, 0xb6, 0x48, 0xfa, 0x0f, 0xb7, - 0xa6, 0xf4, 0xc4, 0xab, 0x29, 0x4a, 0xb8, 0x83, 0xb6, 0x11, 0x3b, 0x64, 0xb2, 0x67, 0x3e, 0xa2, - 0x79, 0x28, 0x47, 0xed, 0xcd, 0x66, 0xb0, 0xe7, 0xb8, 0x3e, 0x7b, 0x1c, 0xd3, 0x98, 0xac, 0xba, - 0x04, 0xe0, 0x04, 0x07, 0xad, 0xc0, 0xb0, 0x23, 0x95, 0xc0, 0x28, 0x3f, 0x98, 0x80, 0x52, 0xfd, - 0x72, 0xff, 0x5a, 0xa9, 0xf6, 0x55, 0x75, 0xd1, 0x6b, 0x30, 0x26, 0xdc, 0xa9, 0x78, 0x88, 0x05, - 0xf6, 0x78, 0xa5, 0xd9, 0xcb, 0xd7, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x17, 0x61, 0x9c, 0x52, 0x49, - 0x0e, 0xb6, 0x99, 0xf3, 0xfd, 0x9c, 0x88, 0x5a, 0x9e, 0x09, 0xbd, 0x32, 0x4e, 0x11, 0x43, 0x4d, - 0x78, 0xc2, 0x69, 0xc7, 0x01, 0x53, 0xa4, 0x9b, 0xeb, 0x7f, 0x23, 0xd8, 0x25, 0x3e, 0x7b, 0xc3, - 0x1a, 0x5e, 0xbc, 0x72, 0x74, 0x58, 0x79, 0x62, 0xa1, 0x0b, 0x1e, 0xee, 0x4a, 0x05, 0xdd, 0x85, - 0x91, 0x38, 0xf0, 0x98, 0xe5, 0x3a, 0x65, 0x25, 0x2e, 0xe4, 0xc7, 0xde, 0xd9, 0x50, 0x68, 0xba, - 0x12, 0x49, 0x55, 0xc5, 0x3a, 0x1d, 0xb4, 0xc1, 0xf7, 0x18, 0x8b, 0x4a, 0x4a, 0xa2, 0x99, 0xc7, - 0xf2, 0x07, 0x46, 0x05, 0x2f, 0x35, 0xb7, 0xa0, 0xa8, 0x89, 0x75, 0x32, 0xe8, 0x06, 0x4c, 0xb5, - 0x42, 0x37, 0x60, 0x0b, 0x5b, 0x3d, 0x62, 0xcc, 0x98, 0xa9, 0x05, 0x6a, 0x69, 0x04, 0xdc, 0x59, - 0x87, 0x0a, 0x99, 0xb2, 0x70, 0xe6, 0x22, 0xcf, 0x53, 0xc5, 0x19, 0x6f, 0x5e, 0x86, 0x15, 0x14, - 0xad, 0xb1, 0x73, 0x99, 0x8b, 0x83, 0x33, 0xb3, 0xf9, 0x41, 0x18, 0x74, 0xb1, 0x91, 0xf3, 0x4b, - 0xea, 0x2f, 0x4e, 0x28, 0xd0, 0x7b, 0x23, 0xda, 0x71, 0x42, 0x52, 0x0b, 0x83, 0x06, 0xe1, 0x9d, - 0xe1, 0x46, 0xf3, 0x8f, 0xf3, 0xe0, 0x89, 0xf4, 0xde, 0xa8, 0x67, 0x21, 0xe0, 0xec, 0x7a, 0xa8, - 0xa9, 0xa5, 0x67, 0xa6, 0x6c, 0x68, 0x34, 0xf3, 0x44, 0x17, 0x33, 0xa3, 0x14, 0xcf, 0x9a, 0xac, - 0x45, 0xa3, 0x38, 0xc2, 0x29, 0x9a, 0xb3, 0xdf, 0x0e, 0x53, 0x1d, 0xf7, 0xc5, 0x89, 0xe2, 0x76, - 0xff, 0xc9, 0x00, 0x94, 0x95, 0x2a, 0x1c, 0xcd, 0x9b, 0x2f, 0x1c, 0x17, 0xd3, 0x2f, 0x1c, 0xc3, - 0x94, 0x23, 0xd7, 0x1f, 0x35, 0x36, 0x0c, 0xa3, 0xb8, 0x42, 0x7e, 0x96, 0x2c, 0x9d, 0xa7, 0xee, - 0xe9, 0x01, 0xa7, 0x69, 0x36, 0x8a, 0x7d, 0x3f, 0x95, 0x94, 0xba, 0x2a, 0x4b, 0xfa, 0x4c, 0x52, - 0x4b, 0x85, 0xff, 0x56, 0xd0, 0x5c, 0xad, 0xa5, 0xb3, 0x36, 0xd6, 0x68, 0x21, 0xe6, 0x30, 0x26, - 0xbe, 0x51, 0xe6, 0x86, 0x89, 0x6f, 0x43, 0x0f, 0x29, 0xbe, 0x49, 0x02, 0x38, 0xa1, 0x85, 0x3c, - 0x98, 0x6a, 0x98, 0x09, 0x37, 0x95, 0xd7, 0xdb, 0x53, 0x3d, 0x53, 0x5f, 0xb6, 0xb5, 0xec, 0x66, - 0x4b, 0x69, 0x2a, 0xb8, 0x93, 0x30, 0x7a, 0x0d, 0x86, 0xdf, 0x0b, 0x22, 0xb6, 0xf9, 0xc4, 0x0d, - 0x2f, 0xbd, 0x83, 0x86, 0xdf, 0xbc, 0x53, 0x67, 0xe5, 0xc7, 0x87, 0x95, 0x91, 0x5a, 0xd0, 0x94, - 0x7f, 0xb1, 0xaa, 0x80, 0x1e, 0xc0, 0xb4, 0x71, 0x2e, 0xaa, 0xee, 0x42, 0xff, 0xdd, 0xbd, 0x24, - 0x9a, 0x9b, 0x5e, 0xcd, 0xa2, 0x84, 0xb3, 0x1b, 0xa0, 0x87, 0x8d, 0x1f, 0x88, 0x64, 0xb5, 0x92, - 0x8b, 0x60, 0xcc, 0x42, 0x59, 0xf7, 0x0d, 0x4f, 0x21, 0xe0, 0xce, 0x3a, 0xf6, 0xd7, 0xf8, 0xcb, - 0x81, 0xd0, 0x2f, 0x92, 0xa8, 0xed, 0x9d, 0x45, 0x2e, 0xa4, 0x65, 0x43, 0xf5, 0xf9, 0xd0, 0xaf, - 0x53, 0xbf, 0x69, 0xb1, 0xd7, 0xa9, 0x0d, 0xb2, 0xd7, 0xf2, 0xa8, 0x94, 0xfb, 0xe8, 0x3b, 0xfe, - 0x26, 0x0c, 0xc7, 0xa2, 0xb5, 0x6e, 0xe9, 0x9b, 0xb4, 0x4e, 0xb1, 0x17, 0x3a, 0xc5, 0x5f, 0xc8, - 0x52, 0xac, 0xc8, 0xd8, 0xff, 0x94, 0xcf, 0x80, 0x84, 0x9c, 0x81, 0x1a, 0xaa, 0x6a, 0xaa, 0xa1, - 0x2a, 0x3d, 0xbe, 0x20, 0x47, 0x1d, 0xf5, 0x4f, 0xcc, 0x7e, 0x33, 0x51, 0xee, 0xa3, 0xfe, 0x2c, - 0x6a, 0xff, 0x98, 0x05, 0xe7, 0xb3, 0xec, 0x88, 0x28, 0x4f, 0xc8, 0x05, 0x49, 0xf5, 0x4c, 0xac, - 0x46, 0xf0, 0x9e, 0x28, 0xc7, 0x0a, 0xa3, 0xef, 0xcc, 0x08, 0x27, 0x0b, 0x9f, 0x76, 0x07, 0xc6, - 0x6a, 0x21, 0xd1, 0xee, 0x80, 0xd7, 0xb9, 0x9b, 0x19, 0xef, 0xcf, 0x73, 0x27, 0x76, 0x31, 0xb3, - 0x7f, 0xbe, 0x00, 0xe7, 0xf9, 0x3b, 0xcf, 0xc2, 0x7e, 0xe0, 0x36, 0x6b, 0x41, 0x53, 0x64, 0xb5, - 0x78, 0x1b, 0x46, 0x5b, 0x9a, 0xf4, 0xdf, 0x2d, 0x80, 0x93, 0xae, 0x25, 0x48, 0xa4, 0x30, 0xbd, - 0x14, 0x1b, 0xb4, 0x50, 0x13, 0x46, 0xc9, 0xbe, 0xdb, 0x50, 0x8f, 0x05, 0x85, 0x13, 0xdf, 0x0d, - 0xaa, 0x95, 0x65, 0x8d, 0x0e, 0x36, 0xa8, 0x3e, 0x82, 0x44, 0x67, 0xf6, 0x8f, 0x5b, 0xf0, 0x58, - 0x4e, 0xb8, 0x27, 0xda, 0xdc, 0x7d, 0xf6, 0xa2, 0x26, 0x72, 0x26, 0xa9, 0xe6, 0xf8, 0x3b, 0x1b, - 0x16, 0x50, 0xf4, 0x79, 0x00, 0xfe, 0x4e, 0x46, 0x85, 0x92, 0x5e, 0x71, 0x71, 0x8c, 0x90, 0x1e, - 0x5a, 0x28, 0x06, 0x59, 0x1f, 0x6b, 0xb4, 0xec, 0x9f, 0x29, 0xc2, 0x00, 0x7b, 0x97, 0x41, 0x2b, - 0x30, 0xb4, 0xc3, 0x83, 0x1b, 0xf7, 0x13, 0x47, 0x39, 0x91, 0xee, 0x78, 0x01, 0x96, 0x95, 0xd1, - 0x1a, 0x9c, 0xe3, 0xc1, 0xa1, 0xbd, 0x2a, 0xf1, 0x9c, 0x03, 0xa9, 0x24, 0xe0, 0x79, 0x86, 0x54, - 0x58, 0x89, 0xd5, 0x4e, 0x14, 0x9c, 0x55, 0x0f, 0xbd, 0x0e, 0xe3, 0xb1, 0xbb, 0x47, 0x82, 0x76, - 0x2c, 0x29, 0xf1, 0xb0, 0xd0, 0x8a, 0x8d, 0xdb, 0x30, 0xa0, 0x38, 0x85, 0x4d, 0xc5, 0x9d, 0x56, - 0x87, 0x3a, 0x44, 0xcb, 0xdc, 0x6f, 0xaa, 0x40, 0x4c, 0x5c, 0x66, 0x40, 0xd4, 0x66, 0xe6, 0x52, - 0x1b, 0x3b, 0x21, 0x89, 0x76, 0x02, 0xaf, 0x29, 0xd2, 0x54, 0x27, 0x06, 0x44, 0x29, 0x38, 0xee, - 0xa8, 0x41, 0xa9, 0x6c, 0x39, 0xae, 0xd7, 0x0e, 0x49, 0x42, 0x65, 0xd0, 0xa4, 0xb2, 0x92, 0x82, - 0xe3, 0x8e, 0x1a, 0x74, 0x1d, 0x4d, 0x8b, 0xbc, 0xd1, 0xd2, 0xd9, 0x5d, 0x59, 0x85, 0x0d, 0x49, - 0xb7, 0x9f, 0x2e, 0xd1, 0x5e, 0x84, 0xdd, 0x8c, 0xca, 0x3c, 0xad, 0x69, 0xf1, 0x84, 0xc3, 0x8f, - 0xa4, 0xf2, 0x30, 0xd9, 0x8b, 0x7f, 0xcf, 0x82, 0x73, 0x19, 0xd6, 0xa7, 0xfc, 0xa8, 0xda, 0x76, - 0xa3, 0x58, 0xe5, 0x52, 0xd1, 0x8e, 0x2a, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x0f, 0xfc, 0x30, 0x4c, - 0x1f, 0x80, 0xc2, 0xba, 0x4b, 0x40, 0x4f, 0x76, 0x00, 0xa2, 0x2b, 0x50, 0x6a, 0x47, 0x44, 0xc6, - 0x69, 0x52, 0xe7, 0x37, 0xd3, 0xeb, 0x32, 0x08, 0x65, 0x4d, 0xb7, 0x95, 0x4a, 0x55, 0x63, 0x4d, - 0xb9, 0x9e, 0x94, 0xc3, 0xec, 0xaf, 0x16, 0xe1, 0x62, 0xae, 0x9d, 0x39, 0xed, 0xd2, 0x5e, 0xe0, - 0xbb, 0x71, 0xa0, 0xde, 0xfc, 0x78, 0xa4, 0x10, 0xd2, 0xda, 0x59, 0x13, 0xe5, 0x58, 0x61, 0xa0, - 0xab, 0x32, 0x83, 0x79, 0x3a, 0x5b, 0xcc, 0x62, 0xd5, 0x48, 0x62, 0xde, 0x6f, 0x26, 0xae, 0xa7, - 0xa0, 0xd4, 0x0a, 0x02, 0x2f, 0x7d, 0x18, 0xd1, 0xee, 0x06, 0x81, 0x87, 0x19, 0x10, 0x7d, 0x42, - 0x8c, 0x43, 0xea, 0x91, 0x0b, 0x3b, 0xcd, 0x20, 0xd2, 0x06, 0xe3, 0x19, 0x18, 0xda, 0x25, 0x07, - 0xa1, 0xeb, 0x6f, 0xa7, 0x1f, 0x3f, 0x6f, 0xf1, 0x62, 0x2c, 0xe1, 0x66, 0xb2, 0x84, 0xa1, 0xd3, - 0x4e, 0xa1, 0x35, 0xdc, 0xf3, 0x6a, 0xfb, 0xa1, 0x22, 0x4c, 0xe0, 0xc5, 0xea, 0xb7, 0x26, 0xe2, - 0x6e, 0xe7, 0x44, 0x9c, 0x76, 0x0a, 0xad, 0xde, 0xb3, 0xf1, 0xcb, 0x16, 0x4c, 0xb0, 0x80, 0xc2, - 0x22, 0x3e, 0x85, 0x1b, 0xf8, 0x67, 0xc0, 0xba, 0x3d, 0x05, 0x03, 0x21, 0x6d, 0x34, 0x9d, 0x17, - 0x87, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x02, 0x4a, 0xac, 0x0b, 0x74, 0xf2, 0x46, 0x79, 0x4a, 0x81, - 0xaa, 0x13, 0x3b, 0x98, 0x95, 0x32, 0xa7, 0x6b, 0x4c, 0x5a, 0x9e, 0xcb, 0x3b, 0x9d, 0x3c, 0x28, - 0x7c, 0x34, 0x9c, 0xae, 0x33, 0xbb, 0xf6, 0xc1, 0x9c, 0xae, 0xb3, 0x49, 0x76, 0x17, 0x8b, 0xfe, - 0x7b, 0x01, 0x2e, 0x67, 0xd6, 0xeb, 0xdb, 0xe9, 0xba, 0x7b, 0xed, 0xd3, 0xb1, 0x61, 0xc9, 0x36, - 0x2d, 0x29, 0x9e, 0xa1, 0x69, 0x49, 0xa9, 0x5f, 0xce, 0x71, 0xa0, 0x0f, 0x5f, 0xe8, 0xcc, 0x21, - 0xfb, 0x88, 0xf8, 0x42, 0x67, 0xf6, 0x2d, 0x47, 0xac, 0xfb, 0xb3, 0x42, 0xce, 0xb7, 0x30, 0x01, - 0xef, 0x1a, 0x3d, 0x67, 0x18, 0x30, 0x12, 0x9c, 0xf0, 0x28, 0x3f, 0x63, 0x78, 0x19, 0x56, 0x50, - 0xe4, 0x6a, 0x5e, 0xc5, 0x85, 0xfc, 0xac, 0x89, 0xb9, 0x4d, 0xcd, 0x99, 0xef, 0x3f, 0x6a, 0x08, - 0x32, 0x3c, 0x8c, 0xd7, 0x34, 0xa1, 0xbc, 0xd8, 0xbf, 0x50, 0x3e, 0x9a, 0x2d, 0x90, 0xa3, 0x05, - 0x98, 0xd8, 0x73, 0x7d, 0x96, 0x05, 0xdf, 0x64, 0x45, 0x55, 0x90, 0x8d, 0x35, 0x13, 0x8c, 0xd3, - 0xf8, 0xb3, 0xaf, 0xc1, 0xd8, 0xc3, 0xab, 0x23, 0xbf, 0x59, 0x84, 0xc7, 0xbb, 0x6c, 0x7b, 0x7e, - 0xd6, 0x1b, 0x73, 0xa0, 0x9d, 0xf5, 0x1d, 0xf3, 0x50, 0x83, 0xf3, 0x5b, 0x6d, 0xcf, 0x3b, 0x60, - 0xd6, 0x9b, 0xa4, 0x29, 0x31, 0x04, 0xaf, 0xf8, 0x84, 0x4c, 0xe2, 0xb0, 0x92, 0x81, 0x83, 0x33, - 0x6b, 0xa2, 0x37, 0x00, 0x05, 0x22, 0x65, 0xeb, 0x0d, 0xe2, 0x0b, 0xad, 0x3a, 0x1b, 0xf8, 0x62, - 0xb2, 0x19, 0xef, 0x74, 0x60, 0xe0, 0x8c, 0x5a, 0x94, 0xe9, 0xa7, 0xb7, 0xd2, 0x81, 0xea, 0x56, - 0x8a, 0xe9, 0xc7, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x06, 0x4c, 0x39, 0xfb, 0x8e, 0xcb, 0x83, 0xcf, - 0x49, 0x02, 0x9c, 0xeb, 0x57, 0x4a, 0xb0, 0x85, 0x34, 0x02, 0xee, 0xac, 0x93, 0x72, 0x6b, 0x1e, - 0xcc, 0x77, 0x6b, 0xee, 0x7e, 0x2e, 0xf6, 0xd2, 0xe9, 0xda, 0xff, 0xd1, 0xa2, 0xd7, 0x57, 0x46, - 0xda, 0x75, 0x3a, 0x0e, 0x4a, 0x37, 0xa9, 0x79, 0x18, 0x4f, 0x6b, 0xf6, 0x19, 0x09, 0x10, 0x9b, - 0xb8, 0x7c, 0x41, 0x44, 0x89, 0x8b, 0x8b, 0xc1, 0xba, 0x8b, 0x10, 0x02, 0x0a, 0x03, 0x7d, 0x01, - 0x86, 0x9a, 0xee, 0xbe, 0x1b, 0x05, 0xa1, 0xd8, 0x2c, 0x27, 0x74, 0x14, 0x48, 0xce, 0xc1, 0x2a, - 0x27, 0x83, 0x25, 0x3d, 0xfb, 0x87, 0x0a, 0x30, 0x26, 0x5b, 0x7c, 0xb3, 0x1d, 0xc4, 0xce, 0x19, - 0x5c, 0xcb, 0x37, 0x8c, 0x6b, 0xf9, 0x13, 0xdd, 0xe2, 0x28, 0xb0, 0x2e, 0xe5, 0x5e, 0xc7, 0x77, - 0x52, 0xd7, 0xf1, 0xd3, 0xbd, 0x49, 0x75, 0xbf, 0x86, 0xff, 0x99, 0x05, 0x53, 0x06, 0xfe, 0x19, - 0xdc, 0x06, 0x2b, 0xe6, 0x6d, 0xf0, 0x64, 0xcf, 0x6f, 0xc8, 0xb9, 0x05, 0xbe, 0xaf, 0x98, 0xea, - 0x3b, 0x3b, 0xfd, 0xdf, 0x83, 0xd2, 0x8e, 0x13, 0x36, 0xbb, 0xc5, 0x6b, 0xed, 0xa8, 0x34, 0x77, - 0xd3, 0x09, 0x9b, 0xfc, 0x0c, 0x7f, 0x4e, 0x25, 0x7a, 0x74, 0xc2, 0x66, 0x4f, 0x8f, 0x2e, 0xd6, - 0x14, 0x7a, 0x15, 0x06, 0xa3, 0x46, 0xd0, 0x52, 0xf6, 0x96, 0x57, 0x78, 0x12, 0x48, 0x5a, 0x72, - 0x7c, 0x58, 0x41, 0x66, 0x73, 0xb4, 0x18, 0x0b, 0x7c, 0xf4, 0x36, 0x8c, 0xb1, 0x5f, 0xca, 0xee, - 0xa0, 0x98, 0x9f, 0x25, 0xa0, 0xae, 0x23, 0x72, 0xf3, 0x15, 0xa3, 0x08, 0x9b, 0xa4, 0x66, 0xb7, - 0xa1, 0xac, 0x3e, 0xeb, 0x91, 0x7a, 0xe2, 0xfc, 0xbb, 0x22, 0x9c, 0xcb, 0x58, 0x73, 0x28, 0x32, - 0x66, 0xe2, 0x85, 0x3e, 0x97, 0xea, 0x07, 0x9c, 0x8b, 0x88, 0x49, 0x43, 0x4d, 0xb1, 0xb6, 0xfa, - 0x6e, 0xf4, 0x6e, 0x44, 0xd2, 0x8d, 0xd2, 0xa2, 0xde, 0x8d, 0xd2, 0xc6, 0xce, 0x6c, 0xa8, 0x69, - 0x43, 0xaa, 0xa7, 0x8f, 0x74, 0x4e, 0xff, 0xb8, 0x08, 0xe7, 0xb3, 0x42, 0xbb, 0xa0, 0xef, 0x4e, - 0x65, 0x83, 0x79, 0xa9, 0xdf, 0xa0, 0x30, 0x3c, 0x45, 0x8c, 0xc8, 0x6d, 0x3c, 0x67, 0xe6, 0x87, - 0xe9, 0x39, 0xcc, 0xa2, 0x4d, 0xe6, 0xbe, 0x19, 0xf2, 0x2c, 0x3e, 0xf2, 0xf8, 0xf8, 0x74, 0xdf, - 0x1d, 0x10, 0xe9, 0x7f, 0xa2, 0x94, 0xfb, 0xa6, 0x2c, 0xee, 0xed, 0xbe, 0x29, 0x5b, 0x9e, 0x75, - 0x61, 0x44, 0xfb, 0x9a, 0x47, 0x3a, 0xe3, 0xbb, 0xf4, 0xb6, 0xd2, 0xfa, 0xfd, 0x48, 0x67, 0xfd, - 0xc7, 0x2d, 0x48, 0x19, 0x37, 0x2a, 0x75, 0x97, 0x95, 0xab, 0xee, 0xba, 0x02, 0xa5, 0x30, 0xf0, - 0x48, 0x3a, 0x41, 0x0b, 0x0e, 0x3c, 0x82, 0x19, 0x84, 0x62, 0xc4, 0x89, 0xb2, 0x63, 0x54, 0x17, - 0xe4, 0x84, 0x88, 0xf6, 0x14, 0x0c, 0x78, 0x64, 0x9f, 0x78, 0xe9, 0xe8, 0xe7, 0xb7, 0x69, 0x21, - 0xe6, 0x30, 0xfb, 0x97, 0x4b, 0x70, 0xa9, 0xab, 0x03, 0x34, 0x15, 0x87, 0xb6, 0x9d, 0x98, 0xdc, - 0x77, 0x0e, 0xd2, 0x61, 0x8a, 0x6f, 0xf0, 0x62, 0x2c, 0xe1, 0xcc, 0xde, 0x9b, 0x87, 0x25, 0x4c, - 0x29, 0x07, 0x45, 0x34, 0x42, 0x01, 0x7d, 0x04, 0x79, 0xdd, 0xaf, 0x03, 0x44, 0x91, 0xb7, 0xec, - 0x53, 0xee, 0xae, 0x29, 0x0c, 0xc9, 0x93, 0xf0, 0x95, 0xf5, 0xdb, 0x02, 0x82, 0x35, 0x2c, 0x54, - 0x85, 0xc9, 0x56, 0x18, 0xc4, 0x5c, 0xd7, 0x5a, 0xe5, 0x66, 0x3e, 0x03, 0xa6, 0xef, 0x69, 0x2d, - 0x05, 0xc7, 0x1d, 0x35, 0xd0, 0xcb, 0x30, 0x22, 0xfc, 0x51, 0x6b, 0x41, 0xe0, 0x09, 0x35, 0x90, - 0x32, 0x1a, 0xa9, 0x27, 0x20, 0xac, 0xe3, 0x69, 0xd5, 0x98, 0x02, 0x77, 0x28, 0xb3, 0x1a, 0x57, - 0xe2, 0x6a, 0x78, 0xa9, 0x30, 0x4f, 0xc3, 0x7d, 0x85, 0x79, 0x4a, 0x14, 0x63, 0xe5, 0xbe, 0xdf, - 0xac, 0xa0, 0xa7, 0x2a, 0xe9, 0x17, 0x4a, 0x70, 0x4e, 0x2c, 0x9c, 0x47, 0xbd, 0x5c, 0x1e, 0x51, - 0xf6, 0xf9, 0x6f, 0xad, 0x99, 0xb3, 0x5e, 0x33, 0x3f, 0x6c, 0x81, 0xc9, 0x5e, 0xa1, 0xff, 0x2f, - 0x37, 0xce, 0xfb, 0xcb, 0xb9, 0xec, 0x5a, 0x53, 0x5e, 0x20, 0x1f, 0x30, 0xe2, 0xbb, 0xfd, 0x1f, - 0x2c, 0x78, 0xb2, 0x27, 0x45, 0xb4, 0x0c, 0x65, 0xc6, 0x03, 0x6a, 0xd2, 0xd9, 0xd3, 0xca, 0x0c, - 0x50, 0x02, 0x72, 0x58, 0xd2, 0xa4, 0x26, 0x5a, 0xee, 0x08, 0xa8, 0xff, 0x4c, 0x46, 0x40, 0xfd, - 0x69, 0x63, 0x78, 0x1e, 0x32, 0xa2, 0xfe, 0xd7, 0x8a, 0x30, 0xc8, 0x57, 0xfc, 0x19, 0x88, 0x61, - 0x2b, 0x42, 0x6f, 0xdb, 0x25, 0x8e, 0x14, 0xef, 0xcb, 0x5c, 0xd5, 0x89, 0x1d, 0xce, 0x26, 0xa8, - 0xdb, 0x2a, 0xd1, 0xf0, 0xa2, 0x39, 0xe3, 0x3e, 0x9b, 0x4d, 0x29, 0x26, 0x81, 0xd3, 0xd0, 0x6e, - 0xb7, 0x2f, 0x01, 0x44, 0x2c, 0xd1, 0x3c, 0xa5, 0x21, 0x22, 0x92, 0x7d, 0xb2, 0x4b, 0xeb, 0x75, - 0x85, 0xcc, 0xfb, 0x90, 0xec, 0x74, 0x05, 0xc0, 0x1a, 0xc5, 0xd9, 0x57, 0xa0, 0xac, 0x90, 0x7b, - 0x69, 0x71, 0x46, 0x75, 0xe6, 0xe2, 0x73, 0x30, 0x91, 0x6a, 0xeb, 0x44, 0x4a, 0xa0, 0x5f, 0xb1, - 0x60, 0x82, 0x77, 0x79, 0xd9, 0xdf, 0x17, 0x67, 0xea, 0xfb, 0x70, 0xde, 0xcb, 0x38, 0xdb, 0xc4, - 0x8c, 0xf6, 0x7f, 0x16, 0x2a, 0xa5, 0x4f, 0x16, 0x14, 0x67, 0xb6, 0x81, 0xae, 0xd1, 0x75, 0x4b, - 0xcf, 0x2e, 0xc7, 0x13, 0xbe, 0x43, 0xa3, 0x7c, 0xcd, 0xf2, 0x32, 0xac, 0xa0, 0xf6, 0xef, 0x58, - 0x30, 0xc5, 0x7b, 0x7e, 0x8b, 0x1c, 0xa8, 0x1d, 0xfe, 0x61, 0xf6, 0x5d, 0xe4, 0xb8, 0x28, 0xe4, - 0xe4, 0xb8, 0xd0, 0x3f, 0xad, 0xd8, 0xf5, 0xd3, 0x7e, 0xde, 0x02, 0xb1, 0x02, 0xcf, 0x40, 0x94, - 0xff, 0x76, 0x53, 0x94, 0x9f, 0xcd, 0x5f, 0xd4, 0x39, 0x32, 0xfc, 0x9f, 0x5a, 0x30, 0xc9, 0x11, - 0x92, 0xb7, 0xe4, 0x0f, 0x75, 0x1e, 0xfa, 0x49, 0x56, 0xa7, 0xb2, 0x53, 0x67, 0x7f, 0x94, 0x31, - 0x59, 0xa5, 0xae, 0x93, 0xd5, 0x94, 0x1b, 0xe8, 0x04, 0x49, 0x18, 0x4f, 0x1c, 0x2b, 0xda, 0xfe, - 0x23, 0x0b, 0x10, 0x6f, 0xc6, 0x60, 0x7f, 0x28, 0x53, 0xc1, 0x4a, 0xb5, 0xeb, 0x22, 0x39, 0x6a, - 0x14, 0x04, 0x6b, 0x58, 0xa7, 0x32, 0x3c, 0x29, 0x83, 0x80, 0x62, 0x6f, 0x83, 0x80, 0x13, 0x8c, - 0xe8, 0xd7, 0x4a, 0x90, 0x36, 0xe6, 0x47, 0xf7, 0x60, 0xb4, 0xe1, 0xb4, 0x9c, 0x4d, 0xd7, 0x73, - 0x63, 0x97, 0x44, 0xdd, 0x2c, 0x89, 0x96, 0x34, 0x3c, 0xf1, 0xd4, 0xab, 0x95, 0x60, 0x83, 0x0e, - 0x9a, 0x03, 0x68, 0x85, 0xee, 0xbe, 0xeb, 0x91, 0x6d, 0xa6, 0x71, 0x60, 0xde, 0x8a, 0xdc, 0x3c, - 0x46, 0x96, 0x62, 0x0d, 0x23, 0xc3, 0xf1, 0xac, 0xf8, 0xe8, 0x1c, 0xcf, 0x4a, 0x27, 0x74, 0x3c, - 0x1b, 0xe8, 0xcb, 0xf1, 0x0c, 0xc3, 0x05, 0xc9, 0x22, 0xd1, 0xff, 0x2b, 0xae, 0x47, 0x04, 0x5f, - 0xcc, 0x7d, 0x18, 0x67, 0x8f, 0x0e, 0x2b, 0x17, 0x70, 0x26, 0x06, 0xce, 0xa9, 0x89, 0x3e, 0x0f, - 0x33, 0x8e, 0xe7, 0x05, 0xf7, 0xd5, 0xa8, 0x2d, 0x47, 0x0d, 0xc7, 0xe3, 0x1a, 0xfb, 0x21, 0x46, - 0xf5, 0x89, 0xa3, 0xc3, 0xca, 0xcc, 0x42, 0x0e, 0x0e, 0xce, 0xad, 0x9d, 0xf2, 0x5b, 0x1b, 0xee, - 0xe5, 0xb7, 0x66, 0xef, 0xc2, 0xb9, 0x3a, 0x09, 0x5d, 0x96, 0x22, 0xb2, 0x99, 0x6c, 0xc9, 0x0d, - 0x28, 0x87, 0xa9, 0x43, 0xa8, 0xaf, 0xc0, 0x46, 0x5a, 0x18, 0x5c, 0x79, 0xe8, 0x24, 0x84, 0xec, - 0x3f, 0xb1, 0x60, 0x48, 0x38, 0x14, 0x9c, 0x01, 0xef, 0xb3, 0x60, 0xa8, 0xa0, 0x2b, 0xd9, 0x07, - 0x35, 0xeb, 0x4c, 0xae, 0xf2, 0x79, 0x35, 0xa5, 0x7c, 0x7e, 0xb2, 0x1b, 0x91, 0xee, 0x6a, 0xe7, - 0xbf, 0x55, 0x84, 0x71, 0xd3, 0x99, 0xe2, 0x0c, 0x86, 0x60, 0x1d, 0x86, 0x22, 0xe1, 0xb9, 0x53, - 0xc8, 0xb7, 0x7d, 0x4e, 0x4f, 0x62, 0x62, 0xd8, 0x24, 0x7c, 0x75, 0x24, 0x91, 0x4c, 0x97, 0xa0, - 0xe2, 0x23, 0x74, 0x09, 0xea, 0xe5, 0xcf, 0x52, 0x3a, 0x0d, 0x7f, 0x16, 0xfb, 0xeb, 0xec, 0xb2, - 0xd0, 0xcb, 0xcf, 0x80, 0x8f, 0xb8, 0x61, 0x5e, 0x2b, 0x76, 0x97, 0x95, 0x25, 0x3a, 0x95, 0xc3, - 0x4f, 0xfc, 0x92, 0x05, 0x97, 0x32, 0xbe, 0x4a, 0x63, 0x2e, 0x9e, 0x83, 0x61, 0xa7, 0xdd, 0x74, - 0xd5, 0x5e, 0xd6, 0x1e, 0xa2, 0x16, 0x44, 0x39, 0x56, 0x18, 0x68, 0x09, 0xa6, 0xc8, 0x83, 0x96, - 0xcb, 0x5f, 0x02, 0x75, 0xeb, 0xc3, 0x22, 0x0f, 0xf1, 0xba, 0x9c, 0x06, 0xe2, 0x4e, 0x7c, 0xe5, - 0x0e, 0x5d, 0xcc, 0x75, 0x87, 0xfe, 0x87, 0x16, 0x8c, 0x88, 0x6e, 0x9f, 0xc1, 0x68, 0x7f, 0x87, - 0x39, 0xda, 0x8f, 0x77, 0x19, 0xed, 0x9c, 0x61, 0xfe, 0x3b, 0x05, 0xd5, 0xdf, 0x5a, 0x10, 0xc6, - 0x7d, 0x30, 0x2d, 0xaf, 0xc2, 0x70, 0x2b, 0x0c, 0xe2, 0xa0, 0x11, 0x78, 0x82, 0x67, 0x79, 0x22, - 0xf1, 0xd6, 0xe7, 0xe5, 0xc7, 0xda, 0x6f, 0xac, 0xb0, 0xd9, 0xe8, 0x05, 0x61, 0x2c, 0xf8, 0x84, - 0x64, 0xf4, 0x82, 0x30, 0xc6, 0x0c, 0x82, 0x9a, 0x00, 0xb1, 0x13, 0x6e, 0x93, 0x98, 0x96, 0x89, - 0xc0, 0x1f, 0xf9, 0x87, 0x47, 0x3b, 0x76, 0xbd, 0x39, 0xd7, 0x8f, 0xa3, 0x38, 0x9c, 0x5b, 0xf5, - 0xe3, 0x3b, 0x21, 0x17, 0x81, 0x34, 0xf7, 0x7b, 0x45, 0x0b, 0x6b, 0x74, 0xa5, 0x8f, 0x24, 0x6b, - 0x63, 0xc0, 0x7c, 0xd2, 0x5e, 0x17, 0xe5, 0x58, 0x61, 0xd8, 0xaf, 0xb0, 0xab, 0x84, 0x0d, 0xd0, - 0xc9, 0x3c, 0xe3, 0xbf, 0x31, 0xac, 0x86, 0x96, 0xbd, 0x67, 0x55, 0x75, 0xff, 0xfb, 0xee, 0x27, - 0x37, 0x6d, 0x58, 0xf7, 0x84, 0x49, 0x9c, 0xf4, 0xd1, 0x77, 0x76, 0x58, 0x3a, 0x3c, 0xdf, 0xe3, - 0x0a, 0x38, 0x81, 0x6d, 0x03, 0x0b, 0x3b, 0xcd, 0xc2, 0xf3, 0xae, 0xd6, 0xc4, 0x22, 0xd7, 0xc2, - 0x4e, 0x0b, 0x00, 0x4e, 0x70, 0xd0, 0xbc, 0x10, 0xa0, 0x4b, 0x46, 0x76, 0x38, 0x29, 0x40, 0xcb, - 0xcf, 0xd7, 0x24, 0xe8, 0x17, 0x60, 0x44, 0x65, 0x89, 0xab, 0xf1, 0x64, 0x5b, 0x22, 0x0c, 0xca, - 0x72, 0x52, 0x8c, 0x75, 0x1c, 0xb4, 0x01, 0x13, 0x11, 0xd7, 0x9e, 0xa8, 0x68, 0x77, 0x5c, 0x0b, - 0xf5, 0x49, 0x69, 0x21, 0x51, 0x37, 0xc1, 0xc7, 0xac, 0x88, 0x1f, 0x1d, 0xd2, 0xd1, 0x31, 0x4d, - 0x02, 0xbd, 0x0e, 0xe3, 0x9e, 0x9e, 0x6b, 0xbd, 0x26, 0x94, 0x54, 0xca, 0x80, 0xd8, 0xc8, 0xc4, - 0x5e, 0xc3, 0x29, 0x6c, 0xca, 0xeb, 0xe8, 0x25, 0x22, 0x42, 0xa3, 0xe3, 0x6f, 0x93, 0x48, 0xe4, - 0xb8, 0x62, 0xbc, 0xce, 0xed, 0x1c, 0x1c, 0x9c, 0x5b, 0x1b, 0xbd, 0x0a, 0xa3, 0xf2, 0xf3, 0x35, - 0x37, 0xde, 0xc4, 0x4c, 0x5d, 0x83, 0x61, 0x03, 0x13, 0xdd, 0x87, 0x69, 0xf9, 0x7f, 0x23, 0x74, - 0xb6, 0xb6, 0xdc, 0x86, 0xf0, 0xa2, 0xe6, 0xbe, 0x3a, 0x0b, 0xd2, 0xf9, 0x67, 0x39, 0x0b, 0xe9, - 0xf8, 0xb0, 0x72, 0x45, 0x8c, 0x5a, 0x26, 0x9c, 0x4d, 0x62, 0x36, 0x7d, 0xb4, 0x06, 0xe7, 0x76, - 0x88, 0xe3, 0xc5, 0x3b, 0x4b, 0x3b, 0xa4, 0xb1, 0x2b, 0x37, 0x11, 0x73, 0x0e, 0xd6, 0x8c, 0xbb, - 0x6f, 0x76, 0xa2, 0xe0, 0xac, 0x7a, 0xe8, 0x1d, 0x98, 0x69, 0xb5, 0x37, 0x3d, 0x37, 0xda, 0x59, - 0x0f, 0x62, 0x66, 0x94, 0xa1, 0x92, 0xac, 0x09, 0x2f, 0x62, 0xe5, 0x18, 0x5d, 0xcb, 0xc1, 0xc3, - 0xb9, 0x14, 0xd0, 0xfb, 0x30, 0x9d, 0x5a, 0x0c, 0xc2, 0xa7, 0x71, 0x3c, 0x3f, 0xde, 0x6d, 0x3d, - 0xab, 0x82, 0xf0, 0x51, 0xcc, 0x02, 0xe1, 0xec, 0x26, 0x3e, 0x98, 0xa9, 0xce, 0x7b, 0xb4, 0xb2, - 0xc6, 0x94, 0xa1, 0x2f, 0xc3, 0xa8, 0xbe, 0x8a, 0xc4, 0x05, 0x73, 0x35, 0x9b, 0x67, 0xd1, 0x56, - 0x1b, 0x67, 0xe9, 0xd4, 0x8a, 0xd2, 0x61, 0xd8, 0xa0, 0x68, 0x13, 0xc8, 0xfe, 0x3e, 0x74, 0x1b, - 0x86, 0x1b, 0x9e, 0x4b, 0xfc, 0x78, 0xb5, 0xd6, 0x2d, 0xe8, 0xc6, 0x92, 0xc0, 0x11, 0x03, 0x26, - 0x02, 0x84, 0xf2, 0x32, 0xac, 0x28, 0xd8, 0xbf, 0x51, 0x80, 0x4a, 0x8f, 0x68, 0xb3, 0x29, 0x8d, - 0xb2, 0xd5, 0x97, 0x46, 0x79, 0x41, 0xa6, 0x8c, 0x5b, 0x4f, 0x89, 0xd9, 0xa9, 0x74, 0x70, 0x89, - 0xb0, 0x9d, 0xc6, 0xef, 0xdb, 0xc2, 0x57, 0x57, 0x4a, 0x97, 0x7a, 0xda, 0x9e, 0x1b, 0x8f, 0x51, - 0x03, 0xfd, 0x0b, 0x22, 0xb9, 0x0f, 0x0b, 0xf6, 0xd7, 0x0b, 0x30, 0xad, 0x86, 0xf0, 0x2f, 0xee, - 0xc0, 0xdd, 0xed, 0x1c, 0xb8, 0x53, 0x78, 0x96, 0xb1, 0xef, 0xc0, 0x20, 0x0f, 0x5a, 0xd2, 0x07, - 0x03, 0xf4, 0x94, 0x19, 0xe1, 0x4a, 0x5d, 0xd3, 0x46, 0x94, 0xab, 0xbf, 0x62, 0xc1, 0xc4, 0xc6, - 0x52, 0xad, 0x1e, 0x34, 0x76, 0x49, 0xbc, 0xc0, 0x19, 0x56, 0x2c, 0xf8, 0x1f, 0xeb, 0x21, 0xf9, - 0x9a, 0x2c, 0x8e, 0xe9, 0x0a, 0x94, 0x76, 0x82, 0x28, 0x4e, 0xbf, 0xd9, 0xde, 0x0c, 0xa2, 0x18, - 0x33, 0x88, 0xfd, 0xbb, 0x16, 0x0c, 0xb0, 0x44, 0xa7, 0xbd, 0xb2, 0xef, 0xf6, 0xf3, 0x5d, 0xe8, - 0x65, 0x18, 0x24, 0x5b, 0x5b, 0xa4, 0x11, 0x8b, 0x59, 0x95, 0x0e, 0xa5, 0x83, 0xcb, 0xac, 0x94, - 0x5e, 0xfa, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0xf4, 0x16, 0x94, 0x63, 0x77, 0x8f, 0x2c, 0x34, - 0x9b, 0xe2, 0xd5, 0xeb, 0x21, 0xfc, 0x77, 0x37, 0x24, 0x01, 0x9c, 0xd0, 0xb2, 0xbf, 0x5a, 0x00, - 0x48, 0x5c, 0xef, 0x7b, 0x7d, 0xe2, 0x62, 0xc7, 0x7b, 0xc8, 0xd5, 0x8c, 0xf7, 0x10, 0x94, 0x10, - 0xcc, 0x78, 0x0c, 0x51, 0xc3, 0x54, 0xec, 0x6b, 0x98, 0x4a, 0x27, 0x19, 0xa6, 0x25, 0x98, 0x4a, - 0x42, 0x07, 0x98, 0x71, 0x54, 0x98, 0x90, 0xb2, 0x91, 0x06, 0xe2, 0x4e, 0x7c, 0x9b, 0xc0, 0x15, - 0x19, 0xd1, 0x52, 0xde, 0x35, 0xcc, 0xa8, 0xf2, 0x04, 0x89, 0x98, 0x93, 0x07, 0x9f, 0x42, 0xee, - 0x83, 0xcf, 0x4f, 0x59, 0x70, 0x3e, 0xdd, 0x0e, 0xf3, 0x5e, 0xfb, 0x01, 0x0b, 0xa6, 0xd9, 0xb3, - 0x17, 0x6b, 0xb5, 0xf3, 0x91, 0xed, 0xa5, 0xec, 0x90, 0x0a, 0xdd, 0x7b, 0x9c, 0x78, 0x2e, 0xaf, - 0x65, 0x91, 0xc6, 0xd9, 0x2d, 0xda, 0xdf, 0x6f, 0x81, 0x70, 0x12, 0xea, 0x63, 0x63, 0xbf, 0x2d, - 0x53, 0x95, 0x1a, 0x01, 0xbc, 0xaf, 0xe4, 0x7b, 0x4d, 0x89, 0xb0, 0xdd, 0xea, 0x22, 0x35, 0x82, - 0x75, 0x1b, 0xb4, 0xec, 0x26, 0x08, 0x68, 0x95, 0x30, 0x3d, 0x51, 0xef, 0xde, 0x5c, 0x07, 0x68, - 0x32, 0x5c, 0x2d, 0x61, 0xa1, 0x3a, 0xb6, 0xab, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x47, 0x0a, 0x30, - 0x22, 0x03, 0x46, 0xb7, 0xfd, 0x7e, 0xa4, 0xb9, 0x13, 0xe5, 0x8d, 0x61, 0x19, 0x3e, 0x29, 0xe1, - 0x5a, 0x22, 0x04, 0x27, 0x19, 0x3e, 0x25, 0x00, 0x27, 0x38, 0xe8, 0x19, 0x18, 0x8a, 0xda, 0x9b, - 0x0c, 0x3d, 0xe5, 0xfa, 0x52, 0xe7, 0xc5, 0x58, 0xc2, 0xd1, 0xe7, 0x61, 0x92, 0xd7, 0x0b, 0x83, - 0x96, 0xb3, 0xcd, 0x95, 0x86, 0x03, 0xca, 0x17, 0x75, 0x72, 0x2d, 0x05, 0x3b, 0x3e, 0xac, 0x9c, - 0x4f, 0x97, 0x31, 0x75, 0x73, 0x07, 0x15, 0xfb, 0xcb, 0x80, 0x3a, 0x63, 0x60, 0xa3, 0x37, 0xb8, - 0x01, 0x92, 0x1b, 0x92, 0x66, 0x37, 0x3d, 0xb2, 0xee, 0x3a, 0x29, 0xcd, 0xcf, 0x79, 0x2d, 0xac, - 0xea, 0xdb, 0x7f, 0xad, 0x08, 0x93, 0x69, 0x47, 0x3a, 0x74, 0x13, 0x06, 0xf9, 0x05, 0x23, 0xc8, - 0x77, 0x79, 0xa6, 0xd4, 0xdc, 0xef, 0xd8, 0x56, 0x13, 0x77, 0x94, 0xa8, 0x8f, 0xde, 0x81, 0x91, - 0x66, 0x70, 0xdf, 0xbf, 0xef, 0x84, 0xcd, 0x85, 0xda, 0xaa, 0x58, 0x97, 0x99, 0x7c, 0x6a, 0x35, - 0x41, 0xd3, 0x5d, 0xfa, 0x98, 0x4a, 0x3e, 0x01, 0x61, 0x9d, 0x1c, 0xda, 0x60, 0x71, 0xfd, 0xb6, - 0xdc, 0xed, 0x35, 0xa7, 0xd5, 0xcd, 0x1a, 0x75, 0x49, 0x22, 0x69, 0x94, 0xc7, 0x44, 0xf0, 0x3f, - 0x0e, 0xc0, 0x09, 0x21, 0xf4, 0xdd, 0x70, 0x2e, 0xca, 0x51, 0x6d, 0xe5, 0xa5, 0x44, 0xe8, 0xa6, - 0xed, 0x59, 0x7c, 0x8c, 0x4a, 0x10, 0x59, 0x4a, 0xb0, 0xac, 0x66, 0xec, 0xaf, 0x9c, 0x03, 0x63, - 0x37, 0x1a, 0x79, 0x71, 0xac, 0x53, 0xca, 0x8b, 0x83, 0x61, 0x98, 0xec, 0xb5, 0xe2, 0x83, 0xaa, - 0x1b, 0x76, 0x4b, 0xac, 0xb6, 0x2c, 0x70, 0x3a, 0x69, 0x4a, 0x08, 0x56, 0x74, 0xb2, 0x93, 0x17, - 0x15, 0x3f, 0xc4, 0xe4, 0x45, 0xa5, 0x33, 0x4c, 0x5e, 0xb4, 0x0e, 0x43, 0xdb, 0x6e, 0x8c, 0x49, - 0x2b, 0x10, 0xac, 0x5d, 0xe6, 0x3a, 0xbc, 0xc1, 0x51, 0x3a, 0x13, 0x66, 0x08, 0x00, 0x96, 0x44, - 0xd0, 0x1b, 0x6a, 0x07, 0x0e, 0xe6, 0x4b, 0x46, 0x9d, 0xef, 0x69, 0x99, 0x7b, 0x50, 0x24, 0x2b, - 0x1a, 0x7a, 0xd8, 0x64, 0x45, 0x2b, 0x32, 0xc5, 0xd0, 0x70, 0xbe, 0xe9, 0x38, 0xcb, 0x20, 0xd4, - 0x23, 0xb1, 0x90, 0x91, 0x8c, 0xa9, 0x7c, 0x7a, 0xc9, 0x98, 0xbe, 0xdf, 0x82, 0xe9, 0x56, 0x56, - 0x5e, 0x32, 0x91, 0x18, 0xe8, 0xe5, 0xbe, 0x13, 0xaf, 0x19, 0x0d, 0x32, 0x11, 0x39, 0x13, 0x0d, - 0x67, 0x37, 0x47, 0x07, 0x3a, 0xdc, 0x6c, 0x8a, 0x6c, 0x42, 0x4f, 0xe5, 0x64, 0x75, 0xea, 0x92, - 0xcb, 0x69, 0x23, 0x23, 0x83, 0xd0, 0xc7, 0xf3, 0x32, 0x08, 0xf5, 0x9d, 0x37, 0xe8, 0x0d, 0x95, - 0xcf, 0x69, 0x2c, 0x7f, 0x29, 0xf1, 0x6c, 0x4d, 0x3d, 0xb3, 0x38, 0xbd, 0xa1, 0xb2, 0x38, 0x75, - 0x89, 0x6f, 0xc6, 0x73, 0x34, 0xf5, 0xcc, 0xdd, 0xa4, 0xe5, 0x5f, 0x9a, 0x38, 0x9d, 0xfc, 0x4b, - 0xc6, 0x55, 0xc3, 0x53, 0x00, 0x3d, 0xdb, 0xe3, 0xaa, 0x31, 0xe8, 0x76, 0xbf, 0x6c, 0x78, 0xae, - 0xa9, 0xa9, 0x87, 0xca, 0x35, 0x75, 0x4f, 0xcf, 0xdd, 0x84, 0x7a, 0x24, 0x27, 0xa2, 0x48, 0x7d, - 0x66, 0x6c, 0xba, 0xa7, 0x5f, 0x80, 0xe7, 0xf2, 0xe9, 0xaa, 0x7b, 0xae, 0x93, 0x6e, 0xe6, 0x15, - 0xd8, 0x91, 0x09, 0xea, 0xfc, 0xd9, 0x64, 0x82, 0x9a, 0x3e, 0xf5, 0x4c, 0x50, 0x17, 0xce, 0x20, - 0x13, 0xd4, 0x63, 0x1f, 0x6a, 0x26, 0xa8, 0x99, 0x47, 0x90, 0x09, 0x6a, 0x3d, 0xc9, 0x04, 0x75, - 0x31, 0x7f, 0x4a, 0x32, 0xec, 0x59, 0x73, 0xf2, 0x3f, 0xdd, 0x83, 0x72, 0x4b, 0x46, 0x7a, 0x10, - 0x01, 0xd8, 0xb2, 0x93, 0xd1, 0x66, 0x85, 0x83, 0xe0, 0x53, 0xa2, 0x40, 0x38, 0x21, 0x45, 0xe9, - 0x26, 0xf9, 0xa0, 0x1e, 0xef, 0xa2, 0x04, 0xcd, 0x52, 0x2f, 0xe5, 0x67, 0x81, 0xb2, 0xff, 0x6a, - 0x01, 0x2e, 0x77, 0x5f, 0xd7, 0x89, 0x6e, 0xaa, 0x96, 0xbc, 0xa5, 0xa4, 0x74, 0x53, 0x5c, 0xc8, - 0x49, 0xb0, 0xfa, 0x0e, 0x87, 0x73, 0x03, 0xa6, 0x94, 0x21, 0xab, 0xe7, 0x36, 0x0e, 0xb4, 0x24, - 0xb5, 0xca, 0x61, 0xaf, 0x9e, 0x46, 0xc0, 0x9d, 0x75, 0xd0, 0x02, 0x4c, 0x18, 0x85, 0xab, 0x55, - 0x21, 0xcc, 0x28, 0x65, 0x58, 0xdd, 0x04, 0xe3, 0x34, 0xbe, 0xfd, 0x73, 0x16, 0x3c, 0x96, 0x93, - 0x24, 0xa1, 0xef, 0x68, 0x2f, 0x5b, 0x30, 0xd1, 0x32, 0xab, 0xf6, 0x08, 0x0a, 0x65, 0xa4, 0x62, - 0x50, 0x7d, 0x4d, 0x01, 0x70, 0x9a, 0xe8, 0xe2, 0xb5, 0xdf, 0xfa, 0xfd, 0xcb, 0x1f, 0xfb, 0xed, - 0xdf, 0xbf, 0xfc, 0xb1, 0xdf, 0xf9, 0xfd, 0xcb, 0x1f, 0xfb, 0xff, 0x8f, 0x2e, 0x5b, 0xbf, 0x75, - 0x74, 0xd9, 0xfa, 0xed, 0xa3, 0xcb, 0xd6, 0xef, 0x1c, 0x5d, 0xb6, 0x7e, 0xef, 0xe8, 0xb2, 0xf5, - 0xd5, 0x3f, 0xb8, 0xfc, 0xb1, 0xb7, 0x0b, 0xfb, 0x2f, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x67, 0xe8, 0x47, 0xf4, 0xcd, 0xe5, 0x00, 0x00, + // 12780 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x6c, 0x24, 0x47, + 0x7a, 0xd8, 0xf5, 0xcc, 0x90, 0x9c, 0xf9, 0xf8, 0xae, 0x7d, 0x88, 0x4b, 0x69, 0x77, 0x56, 0xad, + 0xbb, 0xd5, 0xea, 0x24, 0x91, 0xa7, 0x95, 0x74, 0x92, 0x4f, 0x3a, 0xd9, 0x24, 0x87, 0xdc, 0x1d, + 0xed, 0x92, 0x3b, 0xaa, 0xe1, 0xee, 0xde, 0xc9, 0xba, 0xf3, 0x35, 0x67, 0x8a, 0x64, 0x8b, 0xc3, + 0xee, 0x51, 0x77, 0x0f, 0x77, 0xa9, 0xd8, 0x40, 0x72, 0x8e, 0x9d, 0x5c, 0x6c, 0x04, 0x87, 0xd8, + 0xc8, 0xc3, 0x36, 0x1c, 0xc0, 0x71, 0x60, 0x3b, 0x4e, 0x82, 0x38, 0x76, 0x6c, 0xc7, 0x67, 0x27, + 0x8e, 0x9d, 0x1f, 0x0e, 0x10, 0x5c, 0x9c, 0x00, 0xc1, 0x19, 0x30, 0xc2, 0xd8, 0x74, 0x1e, 0xf0, + 0x8f, 0x3c, 0x10, 0xe7, 0x47, 0xcc, 0x18, 0x71, 0x50, 0xcf, 0xae, 0xea, 0xe9, 0x9e, 0x19, 0xae, + 0xb8, 0x94, 0x7c, 0xb8, 0x7f, 0x33, 0xf5, 0x7d, 0xf5, 0x55, 0x75, 0x3d, 0xbf, 0xef, 0xab, 0xef, + 0x01, 0xaf, 0xed, 0xbc, 0x1a, 0xce, 0xb9, 0xfe, 0xfc, 0x4e, 0x67, 0x83, 0x04, 0x1e, 0x89, 0x48, + 0x38, 0xbf, 0x47, 0xbc, 0xa6, 0x1f, 0xcc, 0x0b, 0x80, 0xd3, 0x76, 0xe7, 0x1b, 0x7e, 0x40, 0xe6, + 0xf7, 0x5e, 0x98, 0xdf, 0x22, 0x1e, 0x09, 0x9c, 0x88, 0x34, 0xe7, 0xda, 0x81, 0x1f, 0xf9, 0x08, + 0x71, 0x9c, 0x39, 0xa7, 0xed, 0xce, 0x51, 0x9c, 0xb9, 0xbd, 0x17, 0x66, 0x9f, 0xdf, 0x72, 0xa3, + 0xed, 0xce, 0xc6, 0x5c, 0xc3, 0xdf, 0x9d, 0xdf, 0xf2, 0xb7, 0xfc, 0x79, 0x86, 0xba, 0xd1, 0xd9, + 0x64, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x93, 0x98, 0x7d, 0x29, 0x6e, 0x66, 0xd7, 0x69, 0x6c, 0xbb, + 0x1e, 0x09, 0xf6, 0xe7, 0xdb, 0x3b, 0x5b, 0xac, 0xdd, 0x80, 0x84, 0x7e, 0x27, 0x68, 0x90, 0x64, + 0xc3, 0x3d, 0x6b, 0x85, 0xf3, 0xbb, 0x24, 0x72, 0x52, 0xba, 0x3b, 0x3b, 0x9f, 0x55, 0x2b, 0xe8, + 0x78, 0x91, 0xbb, 0xdb, 0xdd, 0xcc, 0xa7, 0xfb, 0x55, 0x08, 0x1b, 0xdb, 0x64, 0xd7, 0xe9, 0xaa, + 0xf7, 0x62, 0x56, 0xbd, 0x4e, 0xe4, 0xb6, 0xe6, 0x5d, 0x2f, 0x0a, 0xa3, 0x20, 0x59, 0xc9, 0xfe, + 0x86, 0x05, 0x97, 0x17, 0xee, 0xd5, 0x97, 0x5b, 0x4e, 0x18, 0xb9, 0x8d, 0xc5, 0x96, 0xdf, 0xd8, + 0xa9, 0x47, 0x7e, 0x40, 0xee, 0xfa, 0xad, 0xce, 0x2e, 0xa9, 0xb3, 0x81, 0x40, 0xcf, 0x41, 0x71, + 0x8f, 0xfd, 0xaf, 0x56, 0x66, 0xac, 0xcb, 0xd6, 0xd5, 0xd2, 0xe2, 0xd4, 0x6f, 0x1d, 0x94, 0x3f, + 0x76, 0x78, 0x50, 0x2e, 0xde, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0x2b, 0x30, 0xbc, 0x19, 0xae, 0xef, + 0xb7, 0xc9, 0x4c, 0x8e, 0xe1, 0x4e, 0x08, 0xdc, 0xe1, 0x95, 0x3a, 0x2d, 0xc5, 0x02, 0x8a, 0xe6, + 0xa1, 0xd4, 0x76, 0x82, 0xc8, 0x8d, 0x5c, 0xdf, 0x9b, 0xc9, 0x5f, 0xb6, 0xae, 0x0e, 0x2d, 0x4e, + 0x0b, 0xd4, 0x52, 0x4d, 0x02, 0x70, 0x8c, 0x43, 0xbb, 0x11, 0x10, 0xa7, 0x79, 0xdb, 0x6b, 0xed, + 0xcf, 0x14, 0x2e, 0x5b, 0x57, 0x8b, 0x71, 0x37, 0xb0, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0x91, 0x1c, + 0x14, 0x17, 0x36, 0x37, 0x5d, 0xcf, 0x8d, 0xf6, 0xd1, 0x5d, 0x18, 0xf3, 0xfc, 0x26, 0x91, 0xff, + 0xd9, 0x57, 0x8c, 0x5e, 0xbb, 0x3c, 0xd7, 0xbd, 0x94, 0xe6, 0xd6, 0x34, 0xbc, 0xc5, 0xa9, 0xc3, + 0x83, 0xf2, 0x98, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x68, 0xdb, 0x6f, 0x2a, 0xb2, 0x39, 0x46, + 0xb6, 0x9c, 0x46, 0xb6, 0x16, 0xa3, 0x2d, 0x4e, 0x1e, 0x1e, 0x94, 0x47, 0xb5, 0x02, 0xac, 0x13, + 0x41, 0x1b, 0x30, 0x49, 0xff, 0x7a, 0x91, 0xab, 0xe8, 0xe6, 0x19, 0xdd, 0xa7, 0xb2, 0xe8, 0x6a, + 0xa8, 0x8b, 0x67, 0x0e, 0x0f, 0xca, 0x93, 0x89, 0x42, 0x9c, 0x24, 0x68, 0xbf, 0x0f, 0x13, 0x0b, + 0x51, 0xe4, 0x34, 0xb6, 0x49, 0x93, 0xcf, 0x20, 0x7a, 0x09, 0x0a, 0x9e, 0xb3, 0x4b, 0xc4, 0xfc, + 0x5e, 0x16, 0x03, 0x5b, 0x58, 0x73, 0x76, 0xc9, 0xd1, 0x41, 0x79, 0xea, 0x8e, 0xe7, 0xbe, 0xd7, + 0x11, 0xab, 0x82, 0x96, 0x61, 0x86, 0x8d, 0xae, 0x01, 0x34, 0xc9, 0x9e, 0xdb, 0x20, 0x35, 0x27, + 0xda, 0x16, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x28, 0x08, 0xd6, 0xb0, 0xec, 0x07, 0x50, 0x5a, 0xd8, + 0xf3, 0xdd, 0x66, 0xcd, 0x6f, 0x86, 0x68, 0x07, 0x26, 0xdb, 0x01, 0xd9, 0x24, 0x81, 0x2a, 0x9a, + 0xb1, 0x2e, 0xe7, 0xaf, 0x8e, 0x5e, 0xbb, 0x9a, 0xfa, 0xb1, 0x26, 0xea, 0xb2, 0x17, 0x05, 0xfb, + 0x8b, 0x8f, 0x89, 0xf6, 0x26, 0x13, 0x50, 0x9c, 0xa4, 0x6c, 0xff, 0xcb, 0x1c, 0x9c, 0x5b, 0x78, + 0xbf, 0x13, 0x90, 0x8a, 0x1b, 0xee, 0x24, 0x57, 0x78, 0xd3, 0x0d, 0x77, 0xd6, 0xe2, 0x11, 0x50, + 0x4b, 0xab, 0x22, 0xca, 0xb1, 0xc2, 0x40, 0xcf, 0xc3, 0x08, 0xfd, 0x7d, 0x07, 0x57, 0xc5, 0x27, + 0x9f, 0x11, 0xc8, 0xa3, 0x15, 0x27, 0x72, 0x2a, 0x1c, 0x84, 0x25, 0x0e, 0x5a, 0x85, 0xd1, 0x06, + 0xdb, 0x90, 0x5b, 0xab, 0x7e, 0x93, 0xb0, 0xc9, 0x2c, 0x2d, 0x3e, 0x4b, 0xd1, 0x97, 0xe2, 0xe2, + 0xa3, 0x83, 0xf2, 0x0c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, 0x7f, 0x15, + 0x18, 0x25, 0x48, 0xd9, 0x5b, 0x57, 0xb5, 0xad, 0x32, 0xc4, 0xb6, 0xca, 0x58, 0xfa, 0x36, 0x41, + 0x2f, 0x40, 0x61, 0xc7, 0xf5, 0x9a, 0x33, 0xc3, 0x8c, 0xd6, 0x45, 0x3a, 0xe7, 0x37, 0x5d, 0xaf, + 0x79, 0x74, 0x50, 0x9e, 0x36, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xc8, 0x82, 0x32, 0x83, + 0xad, 0xb8, 0x2d, 0x52, 0x23, 0x41, 0xe8, 0x86, 0x11, 0xf1, 0x22, 0x63, 0x40, 0xaf, 0x01, 0x84, + 0xa4, 0x11, 0x90, 0x48, 0x1b, 0x52, 0xb5, 0x30, 0xea, 0x0a, 0x82, 0x35, 0x2c, 0x7a, 0x20, 0x84, + 0xdb, 0x4e, 0xc0, 0xd6, 0x97, 0x18, 0x58, 0x75, 0x20, 0xd4, 0x25, 0x00, 0xc7, 0x38, 0xc6, 0x81, + 0x90, 0xef, 0x77, 0x20, 0xa0, 0xcf, 0xc2, 0x64, 0xdc, 0x58, 0xd8, 0x76, 0x1a, 0x72, 0x00, 0xd9, + 0x96, 0xa9, 0x9b, 0x20, 0x9c, 0xc4, 0xb5, 0xff, 0x9e, 0x25, 0x16, 0x0f, 0xfd, 0xea, 0x8f, 0xf8, + 0xb7, 0xda, 0xbf, 0x6c, 0xc1, 0xc8, 0xa2, 0xeb, 0x35, 0x5d, 0x6f, 0x0b, 0x7d, 0x09, 0x8a, 0xf4, + 0x6e, 0x6a, 0x3a, 0x91, 0x23, 0xce, 0xbd, 0x4f, 0x69, 0x7b, 0x4b, 0x5d, 0x15, 0x73, 0xed, 0x9d, + 0x2d, 0x5a, 0x10, 0xce, 0x51, 0x6c, 0xba, 0xdb, 0x6e, 0x6f, 0xbc, 0x4b, 0x1a, 0xd1, 0x2a, 0x89, + 0x9c, 0xf8, 0x73, 0xe2, 0x32, 0xac, 0xa8, 0xa2, 0x9b, 0x30, 0x1c, 0x39, 0xc1, 0x16, 0x89, 0xc4, + 0x01, 0x98, 0x7a, 0x50, 0xf1, 0x9a, 0x98, 0xee, 0x48, 0xe2, 0x35, 0x48, 0x7c, 0x2d, 0xac, 0xb3, + 0xaa, 0x58, 0x90, 0xb0, 0xff, 0xca, 0x30, 0x5c, 0x58, 0xaa, 0x57, 0x33, 0xd6, 0xd5, 0x15, 0x18, + 0x6e, 0x06, 0xee, 0x1e, 0x09, 0xc4, 0x38, 0x2b, 0x2a, 0x15, 0x56, 0x8a, 0x05, 0x14, 0xbd, 0x0a, + 0x63, 0xfc, 0x42, 0xba, 0xe1, 0x78, 0xcd, 0x96, 0x1c, 0xe2, 0xb3, 0x02, 0x7b, 0xec, 0xae, 0x06, + 0xc3, 0x06, 0xe6, 0x31, 0x17, 0xd5, 0x95, 0xc4, 0x66, 0xcc, 0xba, 0xec, 0xbe, 0x62, 0xc1, 0x14, + 0x6f, 0x66, 0x21, 0x8a, 0x02, 0x77, 0xa3, 0x13, 0x91, 0x70, 0x66, 0x88, 0x9d, 0x74, 0x4b, 0x69, + 0xa3, 0x95, 0x39, 0x02, 0x73, 0x77, 0x13, 0x54, 0xf8, 0x21, 0x38, 0x23, 0xda, 0x9d, 0x4a, 0x82, + 0x71, 0x57, 0xb3, 0xe8, 0x7b, 0x2d, 0x98, 0x6d, 0xf8, 0x5e, 0x14, 0xf8, 0xad, 0x16, 0x09, 0x6a, + 0x9d, 0x8d, 0x96, 0x1b, 0x6e, 0xf3, 0x75, 0x8a, 0xc9, 0x26, 0x3b, 0x09, 0x32, 0xe6, 0x50, 0x21, + 0x89, 0x39, 0xbc, 0x74, 0x78, 0x50, 0x9e, 0x5d, 0xca, 0x24, 0x85, 0x7b, 0x34, 0x83, 0x76, 0x00, + 0xd1, 0xab, 0xb4, 0x1e, 0x39, 0x5b, 0x24, 0x6e, 0x7c, 0x64, 0xf0, 0xc6, 0xcf, 0x1f, 0x1e, 0x94, + 0xd1, 0x5a, 0x17, 0x09, 0x9c, 0x42, 0x16, 0xbd, 0x07, 0x67, 0x69, 0x69, 0xd7, 0xb7, 0x16, 0x07, + 0x6f, 0x6e, 0xe6, 0xf0, 0xa0, 0x7c, 0x76, 0x2d, 0x85, 0x08, 0x4e, 0x25, 0x3d, 0xbb, 0x04, 0xe7, + 0x52, 0xa7, 0x0a, 0x4d, 0x41, 0x7e, 0x87, 0x70, 0x16, 0xa4, 0x84, 0xe9, 0x4f, 0x74, 0x16, 0x86, + 0xf6, 0x9c, 0x56, 0x47, 0xac, 0x52, 0xcc, 0xff, 0x7c, 0x26, 0xf7, 0xaa, 0x65, 0x37, 0x60, 0x6c, + 0xc9, 0x69, 0x3b, 0x1b, 0x6e, 0xcb, 0x8d, 0x5c, 0x12, 0xa2, 0xa7, 0x21, 0xef, 0x34, 0x9b, 0xec, + 0x8a, 0x2c, 0x2d, 0x9e, 0x3b, 0x3c, 0x28, 0xe7, 0x17, 0x9a, 0xf4, 0xac, 0x06, 0x85, 0xb5, 0x8f, + 0x29, 0x06, 0xfa, 0x24, 0x14, 0x9a, 0x81, 0xdf, 0x9e, 0xc9, 0x31, 0x4c, 0x3a, 0x54, 0x85, 0x4a, + 0xe0, 0xb7, 0x13, 0xa8, 0x0c, 0xc7, 0xfe, 0xf5, 0x1c, 0x3c, 0xb1, 0x44, 0xda, 0xdb, 0x2b, 0xf5, + 0x8c, 0x4d, 0x77, 0x15, 0x8a, 0xbb, 0xbe, 0xe7, 0x46, 0x7e, 0x10, 0x8a, 0xa6, 0xd9, 0x6d, 0xb2, + 0x2a, 0xca, 0xb0, 0x82, 0xa2, 0xcb, 0x50, 0x68, 0xc7, 0x9c, 0xc0, 0x98, 0xe4, 0x22, 0x18, 0x0f, + 0xc0, 0x20, 0x14, 0xa3, 0x13, 0x92, 0x40, 0xdc, 0x82, 0x0a, 0xe3, 0x4e, 0x48, 0x02, 0xcc, 0x20, + 0xf1, 0x71, 0x4a, 0x0f, 0x5a, 0xb1, 0xad, 0x12, 0xc7, 0x29, 0x85, 0x60, 0x0d, 0x0b, 0xd5, 0xa0, + 0x14, 0xaa, 0x49, 0x1d, 0x1a, 0x7c, 0x52, 0xc7, 0xd9, 0x79, 0xab, 0x66, 0x32, 0x26, 0x62, 0x1c, + 0x03, 0xc3, 0x7d, 0xcf, 0xdb, 0xaf, 0xe5, 0x00, 0xf1, 0x21, 0xfc, 0x33, 0x36, 0x70, 0x77, 0xba, + 0x07, 0x2e, 0x95, 0xf3, 0xba, 0xe5, 0x37, 0x9c, 0x56, 0xf2, 0x08, 0x3f, 0xa9, 0xd1, 0xfb, 0xdf, + 0x16, 0x3c, 0xb1, 0xe4, 0x7a, 0x4d, 0x12, 0x64, 0x2c, 0xc0, 0x47, 0x23, 0x80, 0x1c, 0xef, 0xa4, + 0x37, 0x96, 0x58, 0xe1, 0x04, 0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72, 0x1f, + 0x7b, 0xa7, 0xfb, 0x63, 0x4f, 0x60, 0x59, 0xd8, 0xb7, 0x60, 0x62, 0xa9, 0xe5, 0x12, 0x2f, 0xaa, + 0xd6, 0x96, 0x7c, 0x6f, 0xd3, 0xdd, 0x42, 0x9f, 0x81, 0x09, 0x2a, 0xd3, 0xfa, 0x9d, 0xa8, 0x4e, + 0x1a, 0xbe, 0xc7, 0xd8, 0x7f, 0x2a, 0x09, 0xa2, 0xc3, 0x83, 0xf2, 0xc4, 0xba, 0x01, 0xc1, 0x09, + 0x4c, 0xfb, 0x77, 0xe9, 0xf8, 0xf9, 0xbb, 0x6d, 0xdf, 0x23, 0x5e, 0xb4, 0xe4, 0x7b, 0x4d, 0x2e, + 0x26, 0x7e, 0x06, 0x0a, 0x11, 0x1d, 0x0f, 0x3e, 0x76, 0x57, 0xe4, 0x46, 0xa1, 0xa3, 0x70, 0x74, + 0x50, 0x3e, 0xdf, 0x5d, 0x83, 0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x86, 0xc3, 0xc8, 0x89, 0x3a, + 0xa1, 0x18, 0xcd, 0x27, 0xe5, 0x68, 0xd6, 0x59, 0xe9, 0xd1, 0x41, 0x79, 0x52, 0x55, 0xe3, 0x45, + 0x58, 0x54, 0x40, 0xcf, 0xc0, 0xc8, 0x2e, 0x09, 0x43, 0x67, 0x4b, 0x72, 0xf8, 0x93, 0xa2, 0xee, + 0xc8, 0x2a, 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x82, 0x21, 0x12, 0x04, 0x7e, 0x20, 0xf6, 0xe8, 0xb8, + 0x40, 0x1c, 0x5a, 0xa6, 0x85, 0x98, 0xc3, 0xec, 0x7f, 0x63, 0xc1, 0xa4, 0xea, 0x2b, 0x6f, 0xeb, + 0x14, 0x58, 0xb9, 0xb7, 0x01, 0x1a, 0xf2, 0x03, 0x43, 0x76, 0x7b, 0x8c, 0x5e, 0xbb, 0x92, 0xca, + 0xa0, 0x74, 0x0d, 0x63, 0x4c, 0x59, 0x15, 0x85, 0x58, 0xa3, 0x66, 0xff, 0x9a, 0x05, 0x67, 0x12, + 0x5f, 0x74, 0xcb, 0x0d, 0x23, 0xf4, 0x4e, 0xd7, 0x57, 0xcd, 0x0d, 0xf6, 0x55, 0xb4, 0x36, 0xfb, + 0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, 0x37, 0x60, 0xc8, 0x8d, 0xc8, 0xae, 0xfc, 0x98, 0xa7, + 0x7a, 0x7e, 0x0c, 0xef, 0x55, 0x3c, 0x23, 0x55, 0x5a, 0x13, 0x73, 0x02, 0xf6, 0x0f, 0xe5, 0xa1, + 0xc4, 0x97, 0xed, 0xaa, 0xd3, 0x3e, 0x85, 0xb9, 0xa8, 0x42, 0x81, 0x51, 0xe7, 0x1d, 0x7f, 0x3a, + 0xbd, 0xe3, 0xa2, 0x3b, 0x73, 0x54, 0x4e, 0xe3, 0xac, 0xa0, 0xba, 0x1a, 0x68, 0x11, 0x66, 0x24, + 0x90, 0x03, 0xb0, 0xe1, 0x7a, 0x4e, 0xb0, 0x4f, 0xcb, 0x66, 0xf2, 0x8c, 0xe0, 0xf3, 0xbd, 0x09, + 0x2e, 0x2a, 0x7c, 0x4e, 0x56, 0xf5, 0x35, 0x06, 0x60, 0x8d, 0xe8, 0xec, 0x2b, 0x50, 0x52, 0xc8, + 0xc7, 0xe1, 0x71, 0x66, 0x3f, 0x0b, 0x93, 0x89, 0xb6, 0xfa, 0x55, 0x1f, 0xd3, 0x59, 0xa4, 0x5f, + 0x61, 0xa7, 0x80, 0xe8, 0xf5, 0xb2, 0xb7, 0x27, 0x4e, 0xd1, 0xf7, 0xe1, 0x6c, 0x2b, 0xe5, 0x70, + 0x12, 0x53, 0x35, 0xf8, 0x61, 0xf6, 0x84, 0xf8, 0xec, 0xb3, 0x69, 0x50, 0x9c, 0xda, 0x06, 0xbd, + 0xf6, 0xfd, 0x36, 0x5d, 0xf3, 0x4e, 0x8b, 0xf5, 0x57, 0x48, 0xdf, 0xb7, 0x45, 0x19, 0x56, 0x50, + 0x7a, 0x84, 0x9d, 0x55, 0x9d, 0xbf, 0x49, 0xf6, 0xeb, 0xa4, 0x45, 0x1a, 0x91, 0x1f, 0x7c, 0xa8, + 0xdd, 0xbf, 0xc8, 0x47, 0x9f, 0x9f, 0x80, 0xa3, 0x82, 0x40, 0xfe, 0x26, 0xd9, 0xe7, 0x53, 0xa1, + 0x7f, 0x5d, 0xbe, 0xe7, 0xd7, 0xfd, 0x9c, 0x05, 0xe3, 0xea, 0xeb, 0x4e, 0x61, 0xab, 0x2f, 0x9a, + 0x5b, 0xfd, 0x62, 0xcf, 0x05, 0x9e, 0xb1, 0xc9, 0xbf, 0x96, 0x83, 0x0b, 0x0a, 0x87, 0xb2, 0xfb, + 0xfc, 0x8f, 0x58, 0x55, 0xf3, 0x50, 0xf2, 0x94, 0xf6, 0xc0, 0x32, 0xc5, 0xf6, 0x58, 0x77, 0x10, + 0xe3, 0x50, 0xae, 0xcd, 0x8b, 0x45, 0xfc, 0x31, 0x5d, 0xad, 0x26, 0x54, 0x68, 0x8b, 0x90, 0xef, + 0xb8, 0x4d, 0x71, 0x67, 0x7c, 0x4a, 0x8e, 0xf6, 0x9d, 0x6a, 0xe5, 0xe8, 0xa0, 0xfc, 0x64, 0x96, + 0x4a, 0x97, 0x5e, 0x56, 0xe1, 0xdc, 0x9d, 0x6a, 0x05, 0xd3, 0xca, 0x68, 0x01, 0x26, 0xa5, 0xd6, + 0xfa, 0x2e, 0xe5, 0xa0, 0x7c, 0x4f, 0x5c, 0x2d, 0x4a, 0x37, 0x86, 0x4d, 0x30, 0x4e, 0xe2, 0xa3, + 0x0a, 0x4c, 0xed, 0x74, 0x36, 0x48, 0x8b, 0x44, 0xfc, 0x83, 0x6f, 0x12, 0xae, 0x39, 0x2a, 0xc5, + 0xa2, 0xe5, 0xcd, 0x04, 0x1c, 0x77, 0xd5, 0xb0, 0xff, 0x94, 0x1d, 0xf1, 0x62, 0xf4, 0x6a, 0x81, + 0x4f, 0x17, 0x16, 0xa5, 0xfe, 0x61, 0x2e, 0xe7, 0x41, 0x56, 0xc5, 0x4d, 0xb2, 0xbf, 0xee, 0x53, + 0x66, 0x3b, 0x7d, 0x55, 0x18, 0x6b, 0xbe, 0xd0, 0x73, 0xcd, 0xff, 0x42, 0x0e, 0xce, 0xa9, 0x11, + 0x30, 0xf8, 0xba, 0x3f, 0xeb, 0x63, 0xf0, 0x02, 0x8c, 0x36, 0xc9, 0xa6, 0xd3, 0x69, 0x45, 0x4a, + 0x8d, 0x39, 0xc4, 0x55, 0xd9, 0x95, 0xb8, 0x18, 0xeb, 0x38, 0xc7, 0x18, 0xb6, 0x9f, 0x1c, 0x65, + 0x77, 0x6b, 0xe4, 0xd0, 0x35, 0xae, 0x76, 0x8d, 0x95, 0xb9, 0x6b, 0x9e, 0x82, 0x21, 0x77, 0x97, + 0xf2, 0x5a, 0x39, 0x93, 0x85, 0xaa, 0xd2, 0x42, 0xcc, 0x61, 0xe8, 0x13, 0x30, 0xd2, 0xf0, 0x77, + 0x77, 0x1d, 0xaf, 0xc9, 0xae, 0xbc, 0xd2, 0xe2, 0x28, 0x65, 0xc7, 0x96, 0x78, 0x11, 0x96, 0x30, + 0xf4, 0x04, 0x14, 0x9c, 0x60, 0x2b, 0x9c, 0x29, 0x30, 0x9c, 0x22, 0x6d, 0x69, 0x21, 0xd8, 0x0a, + 0x31, 0x2b, 0xa5, 0x52, 0xd5, 0x7d, 0x3f, 0xd8, 0x71, 0xbd, 0xad, 0x8a, 0x1b, 0x88, 0x2d, 0xa1, + 0xee, 0xc2, 0x7b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x02, 0x43, 0x6d, 0x3f, 0x88, 0xc2, 0x99, 0x61, + 0x36, 0xdc, 0x4f, 0x66, 0x1c, 0x44, 0xfc, 0x6b, 0x6b, 0x7e, 0x10, 0xc5, 0x1f, 0x40, 0xff, 0x85, + 0x98, 0x57, 0x47, 0xdf, 0x06, 0x79, 0xe2, 0xed, 0xcd, 0x8c, 0x30, 0x2a, 0xb3, 0x69, 0x54, 0x96, + 0xbd, 0xbd, 0xbb, 0x4e, 0x10, 0x9f, 0xd2, 0xcb, 0xde, 0x1e, 0xa6, 0x75, 0xd0, 0xe7, 0xa1, 0x24, + 0xb7, 0x78, 0x28, 0xd4, 0x1c, 0xa9, 0x4b, 0x4c, 0x1e, 0x0c, 0x98, 0xbc, 0xd7, 0x71, 0x03, 0xb2, + 0x4b, 0xbc, 0x28, 0x8c, 0xcf, 0x34, 0x09, 0x0d, 0x71, 0x4c, 0x0d, 0x7d, 0x5e, 0xea, 0xd6, 0x56, + 0xfd, 0x8e, 0x17, 0x85, 0x33, 0x25, 0xd6, 0xbd, 0xd4, 0x57, 0x8f, 0xbb, 0x31, 0x5e, 0x52, 0xf9, + 0xc6, 0x2b, 0x63, 0x83, 0x14, 0xc2, 0x30, 0xde, 0x72, 0xf7, 0x88, 0x47, 0xc2, 0xb0, 0x16, 0xf8, + 0x1b, 0x64, 0x06, 0x58, 0xcf, 0x2f, 0xa4, 0x3f, 0x06, 0xf8, 0x1b, 0x64, 0x71, 0xfa, 0xf0, 0xa0, + 0x3c, 0x7e, 0x4b, 0xaf, 0x83, 0x4d, 0x12, 0xe8, 0x0e, 0x4c, 0x50, 0xb9, 0xc6, 0x8d, 0x89, 0x8e, + 0xf6, 0x23, 0xca, 0xa4, 0x0f, 0x6c, 0x54, 0xc2, 0x09, 0x22, 0xe8, 0x4d, 0x28, 0xb5, 0xdc, 0x4d, + 0xd2, 0xd8, 0x6f, 0xb4, 0xc8, 0xcc, 0x18, 0xa3, 0x98, 0xba, 0xad, 0x6e, 0x49, 0x24, 0x2e, 0x17, + 0xa9, 0xbf, 0x38, 0xae, 0x8e, 0xee, 0xc2, 0xf9, 0x88, 0x04, 0xbb, 0xae, 0xe7, 0xd0, 0xed, 0x20, + 0xe4, 0x05, 0xf6, 0xa4, 0x32, 0xce, 0xd6, 0xdb, 0x25, 0x31, 0x74, 0xe7, 0xd7, 0x53, 0xb1, 0x70, + 0x46, 0x6d, 0x74, 0x1b, 0x26, 0xd9, 0x4e, 0xa8, 0x75, 0x5a, 0xad, 0x9a, 0xdf, 0x72, 0x1b, 0xfb, + 0x33, 0x13, 0x8c, 0xe0, 0x27, 0xe4, 0xbd, 0x50, 0x35, 0xc1, 0x47, 0x07, 0x65, 0x88, 0xff, 0xe1, + 0x64, 0x6d, 0xb4, 0xc1, 0x74, 0xe8, 0x9d, 0xc0, 0x8d, 0xf6, 0xe9, 0xfa, 0x25, 0x0f, 0xa2, 0x99, + 0xc9, 0x9e, 0xa2, 0xb0, 0x8e, 0xaa, 0x14, 0xed, 0x7a, 0x21, 0x4e, 0x12, 0xa4, 0x5b, 0x3b, 0x8c, + 0x9a, 0xae, 0x37, 0x33, 0xc5, 0x4e, 0x0c, 0xb5, 0x33, 0xea, 0xb4, 0x10, 0x73, 0x18, 0xd3, 0x9f, + 0xd3, 0x1f, 0xb7, 0xe9, 0x09, 0x3a, 0xcd, 0x10, 0x63, 0xfd, 0xb9, 0x04, 0xe0, 0x18, 0x87, 0x32, + 0x35, 0x51, 0xb4, 0x3f, 0x83, 0x18, 0xaa, 0xda, 0x2e, 0xeb, 0xeb, 0x9f, 0xc7, 0xb4, 0x1c, 0xdd, + 0x82, 0x11, 0xe2, 0xed, 0xad, 0x04, 0xfe, 0xee, 0xcc, 0x99, 0xec, 0x3d, 0xbb, 0xcc, 0x51, 0xf8, + 0x81, 0x1e, 0x0b, 0x78, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0x01, 0xcc, 0xa4, 0xcc, 0x08, 0x9f, 0x80, + 0xb3, 0x6c, 0x02, 0x5e, 0x17, 0x75, 0x67, 0xd6, 0x33, 0xf0, 0x8e, 0x7a, 0xc0, 0x70, 0x26, 0x75, + 0xf4, 0x05, 0x18, 0xe7, 0x1b, 0x8a, 0x3f, 0xbe, 0x85, 0x33, 0xe7, 0xd8, 0xd7, 0x5c, 0xce, 0xde, + 0x9c, 0x1c, 0x71, 0xf1, 0x9c, 0xe8, 0xd0, 0xb8, 0x5e, 0x1a, 0x62, 0x93, 0x9a, 0xbd, 0x01, 0x13, + 0xea, 0xdc, 0x62, 0x4b, 0x07, 0x95, 0x61, 0x88, 0x71, 0x3b, 0x42, 0xbf, 0x55, 0xa2, 0x33, 0xc5, + 0x38, 0x21, 0xcc, 0xcb, 0xd9, 0x4c, 0xb9, 0xef, 0x93, 0xc5, 0xfd, 0x88, 0x70, 0xa9, 0x3a, 0xaf, + 0xcd, 0x94, 0x04, 0xe0, 0x18, 0xc7, 0xfe, 0x7f, 0x9c, 0x6b, 0x8c, 0x0f, 0xc7, 0x01, 0xae, 0x83, + 0xe7, 0xa0, 0xb8, 0xed, 0x87, 0x11, 0xc5, 0x66, 0x6d, 0x0c, 0xc5, 0x7c, 0xe2, 0x0d, 0x51, 0x8e, + 0x15, 0x06, 0x7a, 0x0d, 0xc6, 0x1b, 0x7a, 0x03, 0xe2, 0x2e, 0x53, 0x43, 0x60, 0xb4, 0x8e, 0x4d, + 0x5c, 0xf4, 0x2a, 0x14, 0xd9, 0xd3, 0x79, 0xc3, 0x6f, 0x09, 0x26, 0x4b, 0x5e, 0xc8, 0xc5, 0x9a, + 0x28, 0x3f, 0xd2, 0x7e, 0x63, 0x85, 0x8d, 0xae, 0xc0, 0x30, 0xed, 0x42, 0xb5, 0x26, 0x6e, 0x11, + 0xa5, 0xaa, 0xb9, 0xc1, 0x4a, 0xb1, 0x80, 0xda, 0x7f, 0x2d, 0xa7, 0x8d, 0x32, 0x95, 0x48, 0x09, + 0xaa, 0xc1, 0xc8, 0x7d, 0xc7, 0x8d, 0x5c, 0x6f, 0x4b, 0xb0, 0x0b, 0xcf, 0xf4, 0xbc, 0x52, 0x58, + 0xa5, 0x7b, 0xbc, 0x02, 0xbf, 0xf4, 0xc4, 0x1f, 0x2c, 0xc9, 0x50, 0x8a, 0x41, 0xc7, 0xf3, 0x28, + 0xc5, 0xdc, 0xa0, 0x14, 0x31, 0xaf, 0xc0, 0x29, 0x8a, 0x3f, 0x58, 0x92, 0x41, 0xef, 0x00, 0xc8, + 0x65, 0x49, 0x9a, 0xe2, 0xc9, 0xfa, 0xb9, 0xfe, 0x44, 0xd7, 0x55, 0x9d, 0xc5, 0x09, 0x7a, 0xa5, + 0xc6, 0xff, 0xb1, 0x46, 0xcf, 0x8e, 0x18, 0x5b, 0xd5, 0xdd, 0x19, 0xf4, 0x9d, 0xf4, 0x24, 0x70, + 0x82, 0x88, 0x34, 0x17, 0x22, 0x31, 0x38, 0x9f, 0x1c, 0x4c, 0xa6, 0x58, 0x77, 0x77, 0x89, 0x7e, + 0x6a, 0x08, 0x22, 0x38, 0xa6, 0x67, 0xff, 0x52, 0x1e, 0x66, 0xb2, 0xba, 0x4b, 0x17, 0x1d, 0x79, + 0xe0, 0x46, 0x4b, 0x94, 0x1b, 0xb2, 0xcc, 0x45, 0xb7, 0x2c, 0xca, 0xb1, 0xc2, 0xa0, 0xb3, 0x1f, + 0xba, 0x5b, 0x52, 0x24, 0x1c, 0x8a, 0x67, 0xbf, 0xce, 0x4a, 0xb1, 0x80, 0x52, 0xbc, 0x80, 0x38, + 0xa1, 0xb0, 0x89, 0xd0, 0x56, 0x09, 0x66, 0xa5, 0x58, 0x40, 0x75, 0x7d, 0x53, 0xa1, 0x8f, 0xbe, + 0xc9, 0x18, 0xa2, 0xa1, 0x93, 0x1d, 0x22, 0xf4, 0x45, 0x80, 0x4d, 0xd7, 0x73, 0xc3, 0x6d, 0x46, + 0x7d, 0xf8, 0xd8, 0xd4, 0x15, 0x2f, 0xb5, 0xa2, 0xa8, 0x60, 0x8d, 0x22, 0x7a, 0x19, 0x46, 0xd5, + 0x06, 0xac, 0x56, 0xd8, 0x03, 0x91, 0xf6, 0xe0, 0x1e, 0x9f, 0x46, 0x15, 0xac, 0xe3, 0xd9, 0xef, + 0x26, 0xd7, 0x8b, 0xd8, 0x01, 0xda, 0xf8, 0x5a, 0x83, 0x8e, 0x6f, 0xae, 0xf7, 0xf8, 0xda, 0xbf, + 0x91, 0x87, 0x49, 0xa3, 0xb1, 0x4e, 0x38, 0xc0, 0x99, 0x75, 0x9d, 0xde, 0x73, 0x4e, 0x44, 0xc4, + 0xfe, 0xb3, 0xfb, 0x6f, 0x15, 0xfd, 0x2e, 0xa4, 0x3b, 0x80, 0xd7, 0x47, 0x5f, 0x84, 0x52, 0xcb, + 0x09, 0x99, 0xee, 0x8a, 0x88, 0x7d, 0x37, 0x08, 0xb1, 0x58, 0x8e, 0x70, 0xc2, 0x48, 0xbb, 0x6a, + 0x38, 0xed, 0x98, 0x24, 0xbd, 0x90, 0x29, 0xef, 0x23, 0x8d, 0x6e, 0x54, 0x27, 0x28, 0x83, 0xb4, + 0x8f, 0x39, 0x0c, 0xbd, 0x0a, 0x63, 0x01, 0x61, 0xab, 0x62, 0x89, 0xb2, 0x72, 0x6c, 0x99, 0x0d, + 0xc5, 0x3c, 0x1f, 0xd6, 0x60, 0xd8, 0xc0, 0x8c, 0x59, 0xf9, 0xe1, 0x1e, 0xac, 0xfc, 0x33, 0x30, + 0xc2, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0xa3, 0xca, 0x8b, 0xb1, 0x84, 0x27, 0x17, 0x4c, 0x71, 0xc0, + 0x05, 0xf3, 0x49, 0x98, 0xa8, 0x38, 0x64, 0xd7, 0xf7, 0x96, 0xbd, 0x66, 0xdb, 0x77, 0xbd, 0x08, + 0xcd, 0x40, 0x81, 0xdd, 0x0e, 0x7c, 0x6f, 0x17, 0x28, 0x05, 0x5c, 0xa0, 0x8c, 0xb9, 0xbd, 0x05, + 0xe7, 0x2a, 0xfe, 0x7d, 0xef, 0xbe, 0x13, 0x34, 0x17, 0x6a, 0x55, 0x4d, 0xce, 0x5d, 0x93, 0x72, + 0x16, 0x37, 0x62, 0x49, 0x3d, 0x53, 0xb5, 0x9a, 0xfc, 0xae, 0x5d, 0x71, 0x5b, 0x24, 0x43, 0x1b, + 0xf1, 0x37, 0x72, 0x46, 0x4b, 0x31, 0xbe, 0x7a, 0x30, 0xb2, 0x32, 0x1f, 0x8c, 0xde, 0x82, 0xe2, + 0xa6, 0x4b, 0x5a, 0x4d, 0x4c, 0x36, 0xc5, 0x12, 0x7b, 0x3a, 0xfb, 0x5d, 0x7e, 0x85, 0x62, 0x4a, + 0xed, 0x13, 0x97, 0xd2, 0x56, 0x44, 0x65, 0xac, 0xc8, 0xa0, 0x1d, 0x98, 0x92, 0x62, 0x80, 0x84, + 0x8a, 0x05, 0xf7, 0x4c, 0x2f, 0xd9, 0xc2, 0x24, 0x7e, 0xf6, 0xf0, 0xa0, 0x3c, 0x85, 0x13, 0x64, + 0x70, 0x17, 0x61, 0x2a, 0x96, 0xed, 0xd2, 0xa3, 0xb5, 0xc0, 0x86, 0x9f, 0x89, 0x65, 0x4c, 0xc2, + 0x64, 0xa5, 0xf6, 0x8f, 0x59, 0xf0, 0x58, 0xd7, 0xc8, 0x08, 0x49, 0xfb, 0x84, 0x67, 0x21, 0x29, + 0xf9, 0xe6, 0xfa, 0x4b, 0xbe, 0xf6, 0xdf, 0xb7, 0xe0, 0xec, 0xf2, 0x6e, 0x3b, 0xda, 0xaf, 0xb8, + 0xe6, 0xeb, 0xce, 0x2b, 0x30, 0xbc, 0x4b, 0x9a, 0x6e, 0x67, 0x57, 0xcc, 0x5c, 0x59, 0x1e, 0x3f, + 0xab, 0xac, 0xf4, 0xe8, 0xa0, 0x3c, 0x5e, 0x8f, 0xfc, 0xc0, 0xd9, 0x22, 0xbc, 0x00, 0x0b, 0x74, + 0x76, 0x88, 0xbb, 0xef, 0x93, 0x5b, 0xee, 0xae, 0x2b, 0xed, 0x2c, 0x7a, 0xea, 0xce, 0xe6, 0xe4, + 0x80, 0xce, 0xbd, 0xd5, 0x71, 0xbc, 0xc8, 0x8d, 0xf6, 0xc5, 0xc3, 0x8c, 0x24, 0x82, 0x63, 0x7a, + 0xf6, 0x37, 0x2c, 0x98, 0x94, 0xeb, 0x7e, 0xa1, 0xd9, 0x0c, 0x48, 0x18, 0xa2, 0x59, 0xc8, 0xb9, + 0x6d, 0xd1, 0x4b, 0x10, 0xbd, 0xcc, 0x55, 0x6b, 0x38, 0xe7, 0xb6, 0x51, 0x0d, 0x4a, 0xdc, 0x5c, + 0x23, 0x5e, 0x5c, 0x03, 0x19, 0x7d, 0xb0, 0x1e, 0xac, 0xcb, 0x9a, 0x38, 0x26, 0x22, 0x39, 0x38, + 0x76, 0x66, 0xe6, 0xcd, 0x57, 0xaf, 0x1b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x15, 0x8a, 0x9e, 0xdf, + 0xe4, 0xd6, 0x33, 0xfc, 0xf6, 0x63, 0x4b, 0x76, 0x4d, 0x94, 0x61, 0x05, 0xb5, 0x7f, 0xd0, 0x82, + 0x31, 0xf9, 0x65, 0x03, 0x32, 0x93, 0x74, 0x6b, 0xc5, 0x8c, 0x64, 0xbc, 0xb5, 0x28, 0x33, 0xc8, + 0x20, 0x06, 0x0f, 0x98, 0x3f, 0x0e, 0x0f, 0x68, 0xff, 0x68, 0x0e, 0x26, 0x64, 0x77, 0xea, 0x9d, + 0x8d, 0x90, 0x44, 0x68, 0x1d, 0x4a, 0x0e, 0x1f, 0x72, 0x22, 0x57, 0xec, 0x53, 0xe9, 0xc2, 0x87, + 0x31, 0x3f, 0xf1, 0xb5, 0xbc, 0x20, 0x6b, 0xe3, 0x98, 0x10, 0x6a, 0xc1, 0xb4, 0xe7, 0x47, 0xec, + 0x88, 0x56, 0xf0, 0x5e, 0x4f, 0x20, 0x49, 0xea, 0x17, 0x04, 0xf5, 0xe9, 0xb5, 0x24, 0x15, 0xdc, + 0x4d, 0x18, 0x2d, 0x4b, 0x85, 0x47, 0x3e, 0x5b, 0xdc, 0xd0, 0x67, 0x21, 0x5d, 0xdf, 0x61, 0xff, + 0xaa, 0x05, 0x25, 0x89, 0x76, 0x1a, 0xaf, 0x5d, 0xab, 0x30, 0x12, 0xb2, 0x49, 0x90, 0x43, 0x63, + 0xf7, 0xea, 0x38, 0x9f, 0xaf, 0xf8, 0xe6, 0xe1, 0xff, 0x43, 0x2c, 0x69, 0x30, 0x7d, 0xb7, 0xea, + 0xfe, 0x47, 0x44, 0xdf, 0xad, 0xfa, 0x93, 0x71, 0xc3, 0xfc, 0x57, 0xd6, 0x67, 0x4d, 0xac, 0xa5, + 0x0c, 0x52, 0x3b, 0x20, 0x9b, 0xee, 0x83, 0x24, 0x83, 0x54, 0x63, 0xa5, 0x58, 0x40, 0xd1, 0x3b, + 0x30, 0xd6, 0x90, 0x8a, 0xce, 0xf8, 0x18, 0xb8, 0xd2, 0x53, 0xe9, 0xae, 0xde, 0x67, 0xb8, 0x65, + 0xed, 0x92, 0x56, 0x1f, 0x1b, 0xd4, 0xcc, 0xe7, 0xf6, 0x7c, 0xbf, 0xe7, 0xf6, 0x98, 0x6e, 0xf6, + 0xe3, 0xf3, 0x8f, 0x5b, 0x30, 0xcc, 0xd5, 0x65, 0x83, 0xe9, 0x17, 0xb5, 0xe7, 0xaa, 0x78, 0xec, + 0xee, 0xd2, 0x42, 0xf1, 0xfc, 0x84, 0x56, 0xa1, 0xc4, 0x7e, 0x30, 0xb5, 0x41, 0x3e, 0xdb, 0xa4, + 0x98, 0xb7, 0xaa, 0x77, 0xf0, 0xae, 0xac, 0x86, 0x63, 0x0a, 0xf6, 0x0f, 0xe7, 0xe9, 0x51, 0x15, + 0xa3, 0x1a, 0x37, 0xb8, 0xf5, 0xe8, 0x6e, 0xf0, 0xdc, 0xa3, 0xba, 0xc1, 0xb7, 0x60, 0xb2, 0xa1, + 0x3d, 0x6e, 0xc5, 0x33, 0x79, 0xb5, 0xe7, 0x22, 0xd1, 0xde, 0xc1, 0xb8, 0xca, 0x68, 0xc9, 0x24, + 0x82, 0x93, 0x54, 0xd1, 0x77, 0xc2, 0x18, 0x9f, 0x67, 0xd1, 0x0a, 0xb7, 0x58, 0xf8, 0x44, 0xf6, + 0x7a, 0xd1, 0x9b, 0x60, 0x2b, 0xb1, 0xae, 0x55, 0xc7, 0x06, 0x31, 0xfb, 0x97, 0x8a, 0x30, 0xb4, + 0xbc, 0x47, 0xbc, 0xe8, 0x14, 0x0e, 0xa4, 0x06, 0x4c, 0xb8, 0xde, 0x9e, 0xdf, 0xda, 0x23, 0x4d, + 0x0e, 0x3f, 0xce, 0xe5, 0x7a, 0x5e, 0x90, 0x9e, 0xa8, 0x1a, 0x24, 0x70, 0x82, 0xe4, 0xa3, 0x90, + 0x30, 0xaf, 0xc3, 0x30, 0x9f, 0x7b, 0x21, 0x5e, 0xa6, 0x2a, 0x83, 0xd9, 0x20, 0x8a, 0x5d, 0x10, + 0x4b, 0xbf, 0x5c, 0xfb, 0x2c, 0xaa, 0xa3, 0x77, 0x61, 0x62, 0xd3, 0x0d, 0xc2, 0x88, 0x8a, 0x86, + 0x61, 0xe4, 0xec, 0xb6, 0x1f, 0x42, 0xa2, 0x54, 0xe3, 0xb0, 0x62, 0x50, 0xc2, 0x09, 0xca, 0x68, + 0x0b, 0xc6, 0xa9, 0x90, 0x13, 0x37, 0x35, 0x72, 0xec, 0xa6, 0x94, 0xca, 0xe8, 0x96, 0x4e, 0x08, + 0x9b, 0x74, 0xe9, 0x61, 0xd2, 0x60, 0x42, 0x51, 0x91, 0x71, 0x14, 0xea, 0x30, 0xe1, 0xd2, 0x10, + 0x87, 0xd1, 0x33, 0x89, 0x99, 0xad, 0x94, 0xcc, 0x33, 0x49, 0x33, 0x4e, 0xf9, 0x12, 0x94, 0x08, + 0x1d, 0x42, 0x4a, 0x58, 0x28, 0xc6, 0xe7, 0x07, 0xeb, 0xeb, 0xaa, 0xdb, 0x08, 0x7c, 0x53, 0x96, + 0x5f, 0x96, 0x94, 0x70, 0x4c, 0x14, 0x2d, 0xc1, 0x70, 0x48, 0x02, 0x97, 0x84, 0x42, 0x45, 0xde, + 0x63, 0x1a, 0x19, 0x1a, 0xb7, 0x3d, 0xe7, 0xbf, 0xb1, 0xa8, 0x4a, 0x97, 0x97, 0xc3, 0xa4, 0x21, + 0xa6, 0x15, 0xd7, 0x96, 0xd7, 0x02, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x84, 0x91, 0x80, 0xb4, 0x98, + 0xb2, 0x68, 0x7c, 0xf0, 0x45, 0xce, 0x75, 0x4f, 0xbc, 0x1e, 0x96, 0x04, 0xd0, 0x4d, 0x40, 0x01, + 0xa1, 0x3c, 0x84, 0xeb, 0x6d, 0x29, 0x63, 0x0e, 0xa1, 0xeb, 0x7e, 0x5c, 0xb4, 0x7f, 0x06, 0xc7, + 0x18, 0xd2, 0x2a, 0x15, 0xa7, 0x54, 0x43, 0xd7, 0x61, 0x5a, 0x95, 0x56, 0xbd, 0x30, 0x72, 0xbc, + 0x06, 0x61, 0x6a, 0xee, 0x52, 0xcc, 0x15, 0xe1, 0x24, 0x02, 0xee, 0xae, 0x63, 0xff, 0x0c, 0x65, + 0x67, 0xe8, 0x68, 0x9d, 0x02, 0x2f, 0xf0, 0x86, 0xc9, 0x0b, 0x5c, 0xc8, 0x9c, 0xb9, 0x0c, 0x3e, + 0xe0, 0xd0, 0x82, 0x51, 0x6d, 0x66, 0xe3, 0x35, 0x6b, 0xf5, 0x58, 0xb3, 0x1d, 0x98, 0xa2, 0x2b, + 0xfd, 0xf6, 0x46, 0x48, 0x82, 0x3d, 0xd2, 0x64, 0x0b, 0x33, 0xf7, 0x70, 0x0b, 0x53, 0xbd, 0x32, + 0xdf, 0x4a, 0x10, 0xc4, 0x5d, 0x4d, 0xa0, 0x57, 0xa4, 0xe6, 0x24, 0x6f, 0x18, 0x69, 0x71, 0xad, + 0xc8, 0xd1, 0x41, 0x79, 0x4a, 0xfb, 0x10, 0x5d, 0x53, 0x62, 0x7f, 0x49, 0x7e, 0xa3, 0x7a, 0xcd, + 0x6f, 0xa8, 0xc5, 0x92, 0x78, 0xcd, 0x57, 0xcb, 0x01, 0xc7, 0x38, 0x74, 0x8f, 0x52, 0x11, 0x24, + 0xf9, 0x9a, 0x4f, 0x05, 0x14, 0xcc, 0x20, 0xf6, 0x8b, 0x00, 0xcb, 0x0f, 0x48, 0x83, 0x2f, 0x75, + 0xfd, 0x01, 0xd2, 0xca, 0x7e, 0x80, 0xb4, 0xff, 0x9d, 0x05, 0x13, 0x2b, 0x4b, 0x86, 0x98, 0x38, + 0x07, 0xc0, 0x65, 0xa3, 0x7b, 0xf7, 0xd6, 0xa4, 0x6e, 0x9d, 0xab, 0x47, 0x55, 0x29, 0xd6, 0x30, + 0xd0, 0x05, 0xc8, 0xb7, 0x3a, 0x9e, 0x10, 0x59, 0x46, 0x0e, 0x0f, 0xca, 0xf9, 0x5b, 0x1d, 0x0f, + 0xd3, 0x32, 0xcd, 0x42, 0x30, 0x3f, 0xb0, 0x85, 0x60, 0x5f, 0xf7, 0x2a, 0x54, 0x86, 0xa1, 0xfb, + 0xf7, 0xdd, 0x26, 0x37, 0x62, 0x17, 0x7a, 0xff, 0x7b, 0xf7, 0xaa, 0x95, 0x10, 0xf3, 0x72, 0xfb, + 0xab, 0x79, 0x98, 0x5d, 0x69, 0x91, 0x07, 0x1f, 0xd0, 0x90, 0x7f, 0x50, 0xfb, 0xc6, 0xe3, 0xf1, + 0x8b, 0xc7, 0xb5, 0x61, 0xed, 0x3f, 0x1e, 0x9b, 0x30, 0xc2, 0x1f, 0xb3, 0xa5, 0x59, 0xff, 0x6b, + 0x69, 0xad, 0x67, 0x0f, 0xc8, 0x1c, 0x7f, 0x14, 0x17, 0xe6, 0xfc, 0xea, 0xa6, 0x15, 0xa5, 0x58, + 0x12, 0x9f, 0xfd, 0x0c, 0x8c, 0xe9, 0x98, 0xc7, 0xb2, 0x26, 0xff, 0x0b, 0x79, 0x98, 0xa2, 0x3d, + 0x78, 0xa4, 0x13, 0x71, 0xa7, 0x7b, 0x22, 0x4e, 0xda, 0xa2, 0xb8, 0xff, 0x6c, 0xbc, 0x93, 0x9c, + 0x8d, 0x17, 0xb2, 0x66, 0xe3, 0xb4, 0xe7, 0xe0, 0x7b, 0x2d, 0x38, 0xb3, 0xd2, 0xf2, 0x1b, 0x3b, + 0x09, 0xab, 0xdf, 0x97, 0x61, 0x94, 0x9e, 0xe3, 0xa1, 0xe1, 0x45, 0x64, 0xf8, 0x95, 0x09, 0x10, + 0xd6, 0xf1, 0xb4, 0x6a, 0x77, 0xee, 0x54, 0x2b, 0x69, 0xee, 0x68, 0x02, 0x84, 0x75, 0x3c, 0xfb, + 0xeb, 0x16, 0x5c, 0xbc, 0xbe, 0xb4, 0x1c, 0x2f, 0xc5, 0x2e, 0x8f, 0x38, 0x2a, 0x05, 0x36, 0xb5, + 0xae, 0xc4, 0x52, 0x60, 0x85, 0xf5, 0x42, 0x40, 0x3f, 0x2a, 0xde, 0x9e, 0x3f, 0x6d, 0xc1, 0x99, + 0xeb, 0x6e, 0x44, 0xaf, 0xe5, 0xa4, 0x6f, 0x16, 0xbd, 0x97, 0x43, 0x37, 0xf2, 0x83, 0xfd, 0xa4, + 0x6f, 0x16, 0x56, 0x10, 0xac, 0x61, 0xf1, 0x96, 0xf7, 0x5c, 0x66, 0x46, 0x95, 0x33, 0x55, 0x51, + 0x58, 0x94, 0x63, 0x85, 0x41, 0x3f, 0xac, 0xe9, 0x06, 0x4c, 0x94, 0xd8, 0x17, 0x27, 0xac, 0xfa, + 0xb0, 0x8a, 0x04, 0xe0, 0x18, 0xc7, 0xfe, 0x31, 0x0b, 0xce, 0x5d, 0x6f, 0x75, 0xc2, 0x88, 0x04, + 0x9b, 0xa1, 0xd1, 0xd9, 0x17, 0xa1, 0x44, 0xa4, 0xb8, 0x2e, 0xfa, 0xaa, 0x18, 0x4c, 0x25, 0xc7, + 0x73, 0xc7, 0x30, 0x85, 0x37, 0x80, 0xe7, 0xc0, 0xf1, 0x5c, 0xc7, 0x7e, 0x3e, 0x07, 0xe3, 0x37, + 0xd6, 0xd7, 0x6b, 0xd7, 0x49, 0x24, 0x6e, 0xb1, 0xfe, 0xaa, 0x66, 0xac, 0x69, 0xcc, 0x7a, 0x09, + 0x45, 0x9d, 0xc8, 0x6d, 0xcd, 0x71, 0x4f, 0xe4, 0xb9, 0xaa, 0x17, 0xdd, 0x0e, 0xea, 0x51, 0xe0, + 0x7a, 0x5b, 0xa9, 0x3a, 0x36, 0x79, 0xd7, 0xe6, 0xb3, 0xee, 0x5a, 0xf4, 0x22, 0x0c, 0x33, 0x57, + 0x68, 0x29, 0x9e, 0x3c, 0xae, 0x64, 0x0a, 0x56, 0x7a, 0x74, 0x50, 0x2e, 0xdd, 0xc1, 0x55, 0xfe, + 0x07, 0x0b, 0x54, 0x74, 0x07, 0x46, 0xb7, 0xa3, 0xa8, 0x7d, 0x83, 0x38, 0x4d, 0x12, 0xc8, 0xd3, + 0xe1, 0x52, 0xda, 0xe9, 0x40, 0x07, 0x81, 0xa3, 0xc5, 0x1b, 0x2a, 0x2e, 0x0b, 0xb1, 0x4e, 0xc7, + 0xae, 0x03, 0xc4, 0xb0, 0x13, 0xd2, 0x2f, 0xd8, 0x7f, 0x60, 0xc1, 0x08, 0xf7, 0x4a, 0x0b, 0xd0, + 0xeb, 0x50, 0x20, 0x0f, 0x48, 0x43, 0x70, 0x8e, 0xa9, 0x1d, 0x8e, 0x19, 0x0f, 0xae, 0x2d, 0xa7, + 0xff, 0x31, 0xab, 0x85, 0x6e, 0xc0, 0x08, 0xed, 0xed, 0x75, 0xe5, 0xa2, 0xf7, 0x64, 0xd6, 0x17, + 0xab, 0x69, 0xe7, 0xbc, 0x8a, 0x28, 0xc2, 0xb2, 0x3a, 0xd3, 0xfc, 0x36, 0xda, 0x75, 0x7a, 0x80, + 0x45, 0xbd, 0xee, 0xd9, 0xf5, 0xa5, 0x1a, 0x47, 0x12, 0xd4, 0xb8, 0xe6, 0x57, 0x16, 0xe2, 0x98, + 0x88, 0xbd, 0x0e, 0x25, 0x3a, 0xa9, 0x0b, 0x2d, 0xd7, 0xe9, 0xad, 0x74, 0x7e, 0x16, 0x4a, 0x52, + 0x01, 0x1c, 0x0a, 0xc7, 0x26, 0x46, 0x55, 0xea, 0x87, 0x43, 0x1c, 0xc3, 0xed, 0x4d, 0x38, 0xcb, + 0x5e, 0xfe, 0x9d, 0x68, 0xdb, 0xd8, 0x63, 0xfd, 0x17, 0xf3, 0x73, 0x42, 0x10, 0xe3, 0x33, 0x33, + 0xa3, 0xf9, 0x0e, 0x8c, 0x49, 0x8a, 0xb1, 0x50, 0x66, 0xff, 0x61, 0x01, 0x1e, 0xaf, 0xd6, 0xb3, + 0x1d, 0x16, 0x5f, 0x85, 0x31, 0xce, 0xa6, 0xd1, 0xa5, 0xed, 0xb4, 0x44, 0xbb, 0xea, 0x5d, 0x6c, + 0x5d, 0x83, 0x61, 0x03, 0x13, 0x5d, 0x84, 0xbc, 0xfb, 0x9e, 0x97, 0x34, 0xc3, 0xad, 0xbe, 0xb5, + 0x86, 0x69, 0x39, 0x05, 0x53, 0x8e, 0x8f, 0x1f, 0xa5, 0x0a, 0xac, 0xb8, 0xbe, 0x37, 0x60, 0xc2, + 0x0d, 0x1b, 0xa1, 0x5b, 0xf5, 0xe8, 0x39, 0x13, 0x3b, 0xbb, 0xc6, 0x4a, 0x02, 0xda, 0x69, 0x05, + 0xc5, 0x09, 0x6c, 0xed, 0x5c, 0x1f, 0x1a, 0x98, 0x6b, 0xec, 0xeb, 0xe9, 0x43, 0x19, 0xe2, 0x36, + 0xfb, 0xba, 0x90, 0x19, 0xb5, 0x09, 0x86, 0x98, 0x7f, 0x70, 0x88, 0x25, 0x8c, 0x4a, 0x60, 0x8d, + 0x6d, 0xa7, 0xbd, 0xd0, 0x89, 0xb6, 0x2b, 0x6e, 0xd8, 0xf0, 0xf7, 0x48, 0xb0, 0xcf, 0x84, 0xe7, + 0x62, 0x2c, 0x81, 0x29, 0xc0, 0xd2, 0x8d, 0x85, 0x1a, 0xc5, 0xc4, 0xdd, 0x75, 0x4c, 0xae, 0x10, + 0x4e, 0x82, 0x2b, 0x5c, 0x80, 0x49, 0xd9, 0x4c, 0x9d, 0x84, 0xec, 0x8e, 0x18, 0x65, 0x1d, 0x53, + 0xa6, 0xb6, 0xa2, 0x58, 0x75, 0x2b, 0x89, 0x8f, 0x5e, 0x81, 0x71, 0xd7, 0x73, 0x23, 0xd7, 0x89, + 0xfc, 0x80, 0xdd, 0xb0, 0x5c, 0x4e, 0x66, 0x96, 0x6c, 0x55, 0x1d, 0x80, 0x4d, 0x3c, 0xfb, 0x3f, + 0x15, 0x60, 0x9a, 0x4d, 0xdb, 0xb7, 0x56, 0xd8, 0x47, 0x66, 0x85, 0xdd, 0xe9, 0x5e, 0x61, 0x27, + 0xc1, 0xee, 0x7e, 0x98, 0xcb, 0xec, 0x5d, 0x28, 0x29, 0x5b, 0x60, 0xe9, 0x0c, 0x60, 0x65, 0x38, + 0x03, 0xf4, 0xe7, 0x3e, 0xe4, 0x33, 0x6e, 0x3e, 0xf5, 0x19, 0xf7, 0x6f, 0x59, 0x10, 0x9b, 0x44, + 0xa2, 0x1b, 0x50, 0x6a, 0xfb, 0xcc, 0xec, 0x20, 0x90, 0xb6, 0x3c, 0x8f, 0xa7, 0x5e, 0x54, 0xfc, + 0x52, 0xe4, 0xe3, 0x57, 0x93, 0x35, 0x70, 0x5c, 0x19, 0x2d, 0xc2, 0x48, 0x3b, 0x20, 0xf5, 0x88, + 0xb9, 0xc0, 0xf6, 0xa5, 0xc3, 0xd7, 0x08, 0xc7, 0xc7, 0xb2, 0xa2, 0xfd, 0x0b, 0x16, 0x00, 0x7f, + 0x29, 0x75, 0xbc, 0x2d, 0x72, 0x0a, 0xda, 0xdf, 0x0a, 0x14, 0xc2, 0x36, 0x69, 0xf4, 0x32, 0x08, + 0x89, 0xfb, 0x53, 0x6f, 0x93, 0x46, 0x3c, 0xe0, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0xef, 0x03, 0x98, + 0x88, 0xd1, 0xaa, 0x11, 0xd9, 0x45, 0xcf, 0x1b, 0x2e, 0x71, 0x17, 0x12, 0x2e, 0x71, 0x25, 0x86, + 0xad, 0x29, 0x1a, 0xdf, 0x85, 0xfc, 0xae, 0xf3, 0x40, 0x68, 0x92, 0x9e, 0xed, 0xdd, 0x0d, 0x4a, + 0x7f, 0x6e, 0xd5, 0x79, 0xc0, 0x65, 0xa6, 0x67, 0xe5, 0x02, 0x59, 0x75, 0x1e, 0x1c, 0x71, 0xb3, + 0x0f, 0x76, 0x48, 0xdd, 0x72, 0xc3, 0xe8, 0xcb, 0xff, 0x31, 0xfe, 0xcf, 0x96, 0x1d, 0x6d, 0x84, + 0xb5, 0xe5, 0x7a, 0xe2, 0xdd, 0x70, 0xa0, 0xb6, 0x5c, 0x2f, 0xd9, 0x96, 0xeb, 0x0d, 0xd0, 0x96, + 0xeb, 0xa1, 0xf7, 0x61, 0x44, 0xbc, 0xd1, 0x33, 0x5b, 0x6f, 0x53, 0x4b, 0x95, 0xd5, 0x9e, 0x78, + 0xe2, 0xe7, 0x6d, 0xce, 0x4b, 0x99, 0x50, 0x94, 0xf6, 0x6d, 0x57, 0x36, 0x88, 0xfe, 0xba, 0x05, + 0x13, 0xe2, 0x37, 0x26, 0xef, 0x75, 0x48, 0x18, 0x09, 0xde, 0xf3, 0xd3, 0x83, 0xf7, 0x41, 0x54, + 0xe4, 0x5d, 0xf9, 0xb4, 0x3c, 0x66, 0x4d, 0x60, 0xdf, 0x1e, 0x25, 0x7a, 0x81, 0xfe, 0xa1, 0x05, + 0x67, 0x77, 0x9d, 0x07, 0xbc, 0x45, 0x5e, 0x86, 0x9d, 0xc8, 0xf5, 0x85, 0xed, 0xfa, 0xeb, 0x83, + 0x4d, 0x7f, 0x57, 0x75, 0xde, 0x49, 0x69, 0xe6, 0x7a, 0x36, 0x0d, 0xa5, 0x6f, 0x57, 0x53, 0xfb, + 0x35, 0xbb, 0x09, 0x45, 0xb9, 0xde, 0x52, 0x24, 0xef, 0x8a, 0xce, 0x58, 0x1f, 0xdb, 0x44, 0x42, + 0xf7, 0x4b, 0xa3, 0xed, 0x88, 0xb5, 0xf6, 0x48, 0xdb, 0x79, 0x17, 0xc6, 0xf4, 0x35, 0xf6, 0x48, + 0xdb, 0x7a, 0x0f, 0xce, 0xa4, 0xac, 0xa5, 0x47, 0xda, 0xe4, 0x7d, 0xb8, 0x90, 0xb9, 0x3e, 0x1e, + 0x65, 0xc3, 0xf6, 0xcf, 0x5b, 0xfa, 0x39, 0x78, 0x0a, 0x2a, 0xf8, 0x25, 0x53, 0x05, 0x7f, 0xa9, + 0xf7, 0xce, 0xc9, 0xd0, 0xc3, 0xbf, 0xa3, 0x77, 0x9a, 0x9e, 0xea, 0xe8, 0x4d, 0x18, 0x6e, 0xd1, + 0x12, 0x69, 0x1c, 0x62, 0xf7, 0xdf, 0x91, 0x31, 0x2f, 0xc5, 0xca, 0x43, 0x2c, 0x28, 0xd8, 0xbf, + 0x6c, 0x41, 0xe1, 0x14, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x7c, 0x26, 0x69, 0x11, 0xd2, 0x6c, 0x0e, + 0x3b, 0xf7, 0x97, 0x1f, 0x44, 0xc4, 0x0b, 0x99, 0xa8, 0x98, 0x3a, 0x30, 0xdf, 0x05, 0x67, 0x6e, + 0xf9, 0x4e, 0x73, 0xd1, 0x69, 0x39, 0x5e, 0x83, 0x04, 0x55, 0x6f, 0xab, 0xaf, 0x95, 0x92, 0x6e, + 0x53, 0x94, 0xeb, 0x67, 0x53, 0x64, 0x6f, 0x03, 0xd2, 0x1b, 0x10, 0x76, 0x9c, 0x18, 0x46, 0x5c, + 0xde, 0x94, 0x18, 0xfe, 0xa7, 0xd3, 0xb9, 0xbb, 0xae, 0x9e, 0x69, 0x16, 0x8a, 0xbc, 0x00, 0x4b, + 0x42, 0xf6, 0xab, 0x90, 0xea, 0xbb, 0xd5, 0x5f, 0x6d, 0x60, 0x7f, 0x1e, 0xa6, 0x59, 0xcd, 0x63, + 0x8a, 0xb4, 0x76, 0x42, 0x49, 0x97, 0x12, 0x32, 0xca, 0xfe, 0x8a, 0x05, 0x93, 0x6b, 0x89, 0xf8, + 0x15, 0x57, 0xd8, 0x7b, 0x60, 0x8a, 0x6e, 0xb8, 0xce, 0x4a, 0xb1, 0x80, 0x9e, 0xb8, 0x0e, 0xea, + 0x4f, 0x2d, 0x88, 0xdd, 0x29, 0x4f, 0x81, 0xf1, 0x5a, 0x32, 0x18, 0xaf, 0x54, 0xdd, 0x88, 0xea, + 0x4e, 0x16, 0xdf, 0x85, 0x6e, 0xaa, 0xd8, 0x01, 0x3d, 0xd4, 0x22, 0x31, 0x19, 0xee, 0x69, 0x3e, + 0x61, 0x06, 0x18, 0x90, 0xd1, 0x04, 0x98, 0x29, 0x91, 0xc2, 0xfd, 0x88, 0x98, 0x12, 0xa9, 0xfe, + 0x64, 0xec, 0xd0, 0x9a, 0xd6, 0x65, 0x76, 0x72, 0x7d, 0x3b, 0x33, 0x0d, 0x77, 0x5a, 0xee, 0xfb, + 0x44, 0x05, 0x40, 0x29, 0x0b, 0x53, 0x6f, 0x51, 0x7a, 0x74, 0x50, 0x1e, 0x57, 0xff, 0x78, 0x94, + 0xac, 0xb8, 0x8a, 0x7d, 0x03, 0x26, 0x13, 0x03, 0x86, 0x5e, 0x86, 0xa1, 0xf6, 0xb6, 0x13, 0x92, + 0x84, 0xf9, 0xe4, 0x50, 0x8d, 0x16, 0x1e, 0x1d, 0x94, 0x27, 0x54, 0x05, 0x56, 0x82, 0x39, 0xb6, + 0xfd, 0x3f, 0x2d, 0x28, 0xac, 0xf9, 0xcd, 0xd3, 0x58, 0x4c, 0x6f, 0x18, 0x8b, 0xe9, 0x89, 0xac, + 0x18, 0x83, 0x99, 0xeb, 0x68, 0x25, 0xb1, 0x8e, 0x2e, 0x65, 0x52, 0xe8, 0xbd, 0x84, 0x76, 0x61, + 0x94, 0x45, 0x2e, 0x14, 0xe6, 0x9c, 0x2f, 0x1a, 0x32, 0x40, 0x39, 0x21, 0x03, 0x4c, 0x6a, 0xa8, + 0x9a, 0x24, 0xf0, 0x0c, 0x8c, 0x08, 0x93, 0xc2, 0xa4, 0x11, 0xbc, 0xc0, 0xc5, 0x12, 0x6e, 0xff, + 0x78, 0x1e, 0x8c, 0x48, 0x89, 0xe8, 0x57, 0x2d, 0x98, 0x0b, 0xb8, 0x57, 0x61, 0xb3, 0xd2, 0x09, + 0x5c, 0x6f, 0xab, 0xde, 0xd8, 0x26, 0xcd, 0x4e, 0xcb, 0xf5, 0xb6, 0xaa, 0x5b, 0x9e, 0xaf, 0x8a, + 0x97, 0x1f, 0x90, 0x46, 0x87, 0xbd, 0x0b, 0xf4, 0x09, 0xcb, 0xa8, 0x4c, 0x76, 0xae, 0x1d, 0x1e, + 0x94, 0xe7, 0xf0, 0xb1, 0x68, 0xe3, 0x63, 0xf6, 0x05, 0x7d, 0xdd, 0x82, 0x79, 0x1e, 0x40, 0x70, + 0xf0, 0xfe, 0xf7, 0x90, 0x98, 0x6a, 0x92, 0x54, 0x4c, 0x64, 0x9d, 0x04, 0xbb, 0x8b, 0xaf, 0x88, + 0x01, 0x9d, 0xaf, 0x1d, 0xaf, 0x2d, 0x7c, 0xdc, 0xce, 0xd9, 0xff, 0x22, 0x0f, 0xe3, 0xc2, 0xa1, + 0x5d, 0x44, 0x4a, 0x79, 0xd9, 0x58, 0x12, 0x4f, 0x26, 0x96, 0xc4, 0xb4, 0x81, 0x7c, 0x32, 0x41, + 0x52, 0x42, 0x98, 0x6e, 0x39, 0x61, 0x74, 0x83, 0x38, 0x41, 0xb4, 0x41, 0x1c, 0x6e, 0xca, 0x92, + 0x3f, 0xb6, 0xd9, 0x8d, 0x52, 0xd1, 0xdc, 0x4a, 0x12, 0xc3, 0xdd, 0xf4, 0xd1, 0x1e, 0x20, 0x66, + 0x8f, 0x13, 0x38, 0x5e, 0xc8, 0xbf, 0xc5, 0x15, 0x6f, 0x06, 0xc7, 0x6b, 0x75, 0x56, 0xb4, 0x8a, + 0x6e, 0x75, 0x51, 0xc3, 0x29, 0x2d, 0x68, 0x76, 0x56, 0x43, 0x83, 0xda, 0x59, 0x0d, 0xf7, 0xf1, + 0x34, 0xf1, 0x60, 0xaa, 0x2b, 0x26, 0xc1, 0xdb, 0x50, 0x52, 0xf6, 0x70, 0xe2, 0xd0, 0xe9, 0x1d, + 0xda, 0x23, 0x49, 0x81, 0xab, 0x51, 0x62, 0x5b, 0xcc, 0x98, 0x9c, 0xfd, 0x8f, 0x72, 0x46, 0x83, + 0x7c, 0x12, 0xd7, 0xa0, 0xe8, 0x84, 0xa1, 0xbb, 0xe5, 0x91, 0xa6, 0xd8, 0xb1, 0x1f, 0xcf, 0xda, + 0xb1, 0x46, 0x33, 0xcc, 0x26, 0x71, 0x41, 0xd4, 0xc4, 0x8a, 0x06, 0xba, 0xc1, 0x0d, 0x86, 0xf6, + 0x24, 0xcf, 0x3f, 0x18, 0x35, 0x90, 0x26, 0x45, 0x7b, 0x04, 0x8b, 0xfa, 0xe8, 0x0b, 0xdc, 0xa2, + 0xeb, 0xa6, 0xe7, 0xdf, 0xf7, 0xae, 0xfb, 0xbe, 0xf4, 0x42, 0x1b, 0x8c, 0xe0, 0xb4, 0xb4, 0xe3, + 0x52, 0xd5, 0xb1, 0x49, 0x6d, 0xb0, 0xb8, 0x3d, 0xdf, 0x0d, 0x67, 0x28, 0x69, 0xd3, 0x97, 0x24, + 0x44, 0x04, 0x26, 0x45, 0xb4, 0x04, 0x59, 0x26, 0xc6, 0x2e, 0x95, 0x9d, 0x37, 0x6b, 0xc7, 0x4a, + 0xbf, 0x9b, 0x26, 0x09, 0x9c, 0xa4, 0x69, 0xff, 0x94, 0x05, 0xcc, 0x0a, 0xfe, 0x14, 0x58, 0x86, + 0xcf, 0x9a, 0x2c, 0xc3, 0x4c, 0xd6, 0x20, 0x67, 0x70, 0x0b, 0x2f, 0xf1, 0x95, 0x55, 0x0b, 0xfc, + 0x07, 0xfb, 0xe2, 0x35, 0xbd, 0x3f, 0x27, 0x6b, 0xff, 0x5f, 0x8b, 0x1f, 0x62, 0xca, 0x31, 0x1d, + 0x7d, 0x0f, 0x14, 0x1b, 0x4e, 0xdb, 0x69, 0xf0, 0xb0, 0xbe, 0x99, 0x5a, 0x1d, 0xa3, 0xd2, 0xdc, + 0x92, 0xa8, 0xc1, 0xb5, 0x14, 0x32, 0xea, 0x46, 0x51, 0x16, 0xf7, 0xd5, 0x4c, 0xa8, 0x26, 0x67, + 0x77, 0x60, 0xdc, 0x20, 0xf6, 0x48, 0x45, 0xda, 0xef, 0xe1, 0x57, 0xac, 0x8a, 0x12, 0xb3, 0x0b, + 0xd3, 0x9e, 0xf6, 0x9f, 0x5e, 0x28, 0x52, 0x4c, 0xf9, 0x78, 0xbf, 0x4b, 0x94, 0xdd, 0x3e, 0x9a, + 0x95, 0x7f, 0x82, 0x0c, 0xee, 0xa6, 0x6c, 0xff, 0x84, 0x05, 0x8f, 0xe9, 0x88, 0x5a, 0xcc, 0x80, + 0x7e, 0x7a, 0xe2, 0x0a, 0x14, 0xfd, 0x36, 0x09, 0x9c, 0xc8, 0x0f, 0xc4, 0xad, 0x71, 0x55, 0x0e, + 0xfa, 0x6d, 0x51, 0x7e, 0x24, 0xe2, 0x2b, 0x4a, 0xea, 0xb2, 0x1c, 0xab, 0x9a, 0x54, 0x8e, 0x61, + 0x83, 0x11, 0x8a, 0x78, 0x0e, 0xec, 0x0c, 0x60, 0x4f, 0xa6, 0x21, 0x16, 0x10, 0xfb, 0x0f, 0x2d, + 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0xf7, 0x60, 0x6a, 0xd7, 0x89, 0x1a, 0xdb, 0xcb, 0x0f, 0xda, 0x01, + 0x57, 0x8f, 0xcb, 0x71, 0x7a, 0xb6, 0xdf, 0x38, 0x69, 0x1f, 0x19, 0x1b, 0xa9, 0xad, 0x26, 0x88, + 0xe1, 0x2e, 0xf2, 0x68, 0x03, 0x46, 0x59, 0x19, 0xb3, 0x86, 0x0e, 0x7b, 0xb1, 0x06, 0x59, 0xad, + 0xa9, 0x57, 0xe7, 0xd5, 0x98, 0x0e, 0xd6, 0x89, 0xda, 0x5f, 0xce, 0xf3, 0xdd, 0xce, 0xb8, 0xed, + 0x67, 0x60, 0xa4, 0xed, 0x37, 0x97, 0xaa, 0x15, 0x2c, 0x66, 0x41, 0x5d, 0x23, 0x35, 0x5e, 0x8c, + 0x25, 0x1c, 0xbd, 0x06, 0x40, 0x1e, 0x44, 0x24, 0xf0, 0x9c, 0x96, 0x32, 0x1a, 0x51, 0x66, 0x92, + 0x15, 0x7f, 0xcd, 0x8f, 0xee, 0x84, 0xe4, 0xbb, 0x96, 0x15, 0x0a, 0xd6, 0xd0, 0xd1, 0x35, 0x80, + 0x76, 0xe0, 0xef, 0xb9, 0x4d, 0xe6, 0x5e, 0x97, 0x37, 0x4d, 0x2a, 0x6a, 0x0a, 0x82, 0x35, 0x2c, + 0xf4, 0x1a, 0x8c, 0x77, 0xbc, 0x90, 0x73, 0x28, 0xce, 0x86, 0x88, 0x4e, 0x58, 0x8c, 0xad, 0x1b, + 0xee, 0xe8, 0x40, 0x6c, 0xe2, 0xa2, 0x05, 0x18, 0x8e, 0x1c, 0x66, 0x13, 0x31, 0x94, 0x6d, 0xdb, + 0xb8, 0x4e, 0x31, 0xf4, 0xa0, 0xb2, 0xb4, 0x02, 0x16, 0x15, 0xd1, 0xdb, 0xd2, 0x57, 0x81, 0x9f, + 0xf5, 0xc2, 0xa8, 0x78, 0xb0, 0x7b, 0x41, 0xf3, 0x54, 0x10, 0xc6, 0xca, 0x06, 0x2d, 0xfb, 0xeb, + 0x25, 0x80, 0x98, 0x1d, 0x47, 0xef, 0x77, 0x9d, 0x47, 0xcf, 0xf5, 0x66, 0xe0, 0x4f, 0xee, 0x30, + 0x42, 0xdf, 0x6f, 0xc1, 0xa8, 0xd3, 0x6a, 0xf9, 0x0d, 0x27, 0x62, 0xa3, 0x9c, 0xeb, 0x7d, 0x1e, + 0x8a, 0xf6, 0x17, 0xe2, 0x1a, 0xbc, 0x0b, 0x2f, 0xca, 0x85, 0xa7, 0x41, 0xfa, 0xf6, 0x42, 0x6f, + 0x18, 0x7d, 0x4a, 0x4a, 0x69, 0x7c, 0x79, 0xcc, 0x26, 0xa5, 0xb4, 0x12, 0x3b, 0xfa, 0x35, 0x01, + 0x0d, 0xdd, 0x31, 0x02, 0xcf, 0x15, 0xb2, 0x63, 0x30, 0x18, 0x5c, 0x69, 0xbf, 0x98, 0x73, 0xa8, + 0xa6, 0x3b, 0x57, 0x0d, 0x65, 0x07, 0x2a, 0xd1, 0xc4, 0x9f, 0x3e, 0x8e, 0x55, 0xef, 0xc2, 0x64, + 0xd3, 0xbc, 0xdb, 0xc5, 0x6a, 0x7a, 0x3a, 0x8b, 0x6e, 0x82, 0x15, 0x88, 0x6f, 0xf3, 0x04, 0x00, + 0x27, 0x09, 0xa3, 0x1a, 0x77, 0x73, 0xab, 0x7a, 0x9b, 0xbe, 0x30, 0x4e, 0xb7, 0x33, 0xe7, 0x72, + 0x3f, 0x8c, 0xc8, 0x2e, 0xc5, 0x8c, 0x2f, 0xed, 0x35, 0x51, 0x17, 0x2b, 0x2a, 0xe8, 0x4d, 0x18, + 0x66, 0x7e, 0xb2, 0xe1, 0x4c, 0x31, 0x5b, 0x99, 0x68, 0x86, 0x78, 0x88, 0x37, 0x15, 0xfb, 0x1b, + 0x62, 0x41, 0x01, 0xdd, 0x90, 0x71, 0x60, 0xc2, 0xaa, 0x77, 0x27, 0x24, 0x2c, 0x0e, 0x4c, 0x69, + 0xf1, 0xe3, 0x71, 0x88, 0x17, 0x5e, 0x9e, 0x1a, 0x3e, 0xde, 0xa8, 0x49, 0x99, 0x23, 0xf1, 0x5f, + 0x46, 0xa5, 0x9f, 0x81, 0xec, 0xee, 0x99, 0x91, 0xeb, 0xe3, 0xe1, 0xbc, 0x6b, 0x92, 0xc0, 0x49, + 0x9a, 0x94, 0xd1, 0xe4, 0x3b, 0x57, 0x98, 0xb7, 0xf7, 0xdb, 0xff, 0x5c, 0xbe, 0x66, 0x97, 0x0c, + 0x2f, 0xc1, 0xa2, 0xfe, 0xa9, 0xde, 0xfa, 0xb3, 0x1e, 0x4c, 0x25, 0xb7, 0xe8, 0x23, 0xe5, 0x32, + 0xfe, 0xa0, 0x00, 0x13, 0xe6, 0x92, 0x42, 0xf3, 0x50, 0x12, 0x44, 0x54, 0x50, 0x52, 0xb5, 0x4b, + 0x56, 0x25, 0x00, 0xc7, 0x38, 0x2c, 0x16, 0x2d, 0xab, 0xae, 0x99, 0x25, 0xc6, 0xb1, 0x68, 0x15, + 0x04, 0x6b, 0x58, 0x54, 0x5e, 0xda, 0xf0, 0xfd, 0x48, 0x5d, 0x2a, 0x6a, 0xdd, 0x2d, 0xb2, 0x52, + 0x2c, 0xa0, 0xf4, 0x32, 0xd9, 0x21, 0x81, 0x47, 0x5a, 0x66, 0xac, 0x33, 0x75, 0x99, 0xdc, 0xd4, + 0x81, 0xd8, 0xc4, 0xa5, 0xb7, 0xa4, 0x1f, 0xb2, 0x85, 0x2c, 0xa4, 0xb2, 0xd8, 0xcc, 0xb3, 0xce, + 0x3d, 0xce, 0x25, 0x1c, 0x7d, 0x1e, 0x1e, 0x53, 0x0e, 0xe2, 0x98, 0x2b, 0xaa, 0x65, 0x8b, 0xc3, + 0x86, 0x12, 0xe5, 0xb1, 0xa5, 0x74, 0x34, 0x9c, 0x55, 0x1f, 0xbd, 0x01, 0x13, 0x82, 0x73, 0x97, + 0x14, 0x47, 0x4c, 0xdb, 0x89, 0x9b, 0x06, 0x14, 0x27, 0xb0, 0x65, 0xb4, 0x36, 0xc6, 0x3c, 0x4b, + 0x0a, 0xc5, 0xee, 0x68, 0x6d, 0x3a, 0x1c, 0x77, 0xd5, 0x40, 0x0b, 0x30, 0xc9, 0x59, 0x2b, 0xd7, + 0xdb, 0xe2, 0x73, 0x22, 0xbc, 0x4f, 0xd4, 0x96, 0xba, 0x6d, 0x82, 0x71, 0x12, 0x1f, 0xbd, 0x0a, + 0x63, 0x4e, 0xd0, 0xd8, 0x76, 0x23, 0xd2, 0x88, 0x3a, 0x01, 0x77, 0x4b, 0xd1, 0x8c, 0x4f, 0x16, + 0x34, 0x18, 0x36, 0x30, 0xed, 0xf7, 0xe1, 0x4c, 0x8a, 0xe3, 0x1a, 0x5d, 0x38, 0x4e, 0xdb, 0x95, + 0xdf, 0x94, 0x30, 0xd8, 0x5c, 0xa8, 0x55, 0xe5, 0xd7, 0x68, 0x58, 0x74, 0x75, 0x32, 0x07, 0x37, + 0x2d, 0x09, 0x85, 0x5a, 0x9d, 0x2b, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x7f, 0xe5, 0x60, 0x32, 0x45, + 0xf9, 0xce, 0x12, 0x21, 0x24, 0x64, 0x8f, 0x38, 0xef, 0x81, 0x19, 0xfc, 0x2f, 0x77, 0x8c, 0xe0, + 0x7f, 0xf9, 0x7e, 0xc1, 0xff, 0x0a, 0x1f, 0x24, 0xf8, 0x9f, 0x39, 0x62, 0x43, 0x03, 0x8d, 0x58, + 0x4a, 0xc0, 0xc0, 0xe1, 0x63, 0x06, 0x0c, 0x34, 0x06, 0x7d, 0x64, 0x80, 0x41, 0xff, 0xe1, 0x1c, + 0x4c, 0x25, 0x8d, 0xe4, 0x4e, 0x41, 0x1d, 0xfb, 0xa6, 0xa1, 0x8e, 0x4d, 0x4f, 0x2b, 0x92, 0x34, + 0xdd, 0xcb, 0x52, 0xcd, 0xe2, 0x84, 0x6a, 0xf6, 0x93, 0x03, 0x51, 0xeb, 0xad, 0xa6, 0xfd, 0x3b, + 0x39, 0x38, 0x97, 0xac, 0xb2, 0xd4, 0x72, 0xdc, 0xdd, 0x53, 0x18, 0x9b, 0xdb, 0xc6, 0xd8, 0x3c, + 0x3f, 0xc8, 0xd7, 0xb0, 0xae, 0x65, 0x0e, 0xd0, 0xbd, 0xc4, 0x00, 0xcd, 0x0f, 0x4e, 0xb2, 0xf7, + 0x28, 0x7d, 0x23, 0x0f, 0x97, 0x52, 0xeb, 0xc5, 0xda, 0xcc, 0x15, 0x43, 0x9b, 0x79, 0x2d, 0xa1, + 0xcd, 0xb4, 0x7b, 0xd7, 0x3e, 0x19, 0xf5, 0xa6, 0xf0, 0x28, 0x64, 0x01, 0xe2, 0x1e, 0x52, 0xb5, + 0x69, 0x78, 0x14, 0x2a, 0x42, 0xd8, 0xa4, 0xfb, 0xcd, 0xa4, 0xd2, 0xfc, 0x57, 0x16, 0x5c, 0x48, + 0x9d, 0x9b, 0x53, 0x50, 0x61, 0xad, 0x99, 0x2a, 0xac, 0x67, 0x06, 0x5e, 0xad, 0x19, 0x3a, 0xad, + 0xdf, 0x2c, 0x64, 0x7c, 0x0b, 0x13, 0xd0, 0x6f, 0xc3, 0xa8, 0xd3, 0x68, 0x90, 0x30, 0x5c, 0xf5, + 0x9b, 0x2a, 0x60, 0xda, 0xf3, 0x4c, 0xce, 0x8a, 0x8b, 0x8f, 0x0e, 0xca, 0xb3, 0x49, 0x12, 0x31, + 0x18, 0xeb, 0x14, 0xcc, 0x18, 0x8f, 0xb9, 0x13, 0x8d, 0xf1, 0x78, 0x0d, 0x60, 0x4f, 0x71, 0xeb, + 0x49, 0x21, 0x5f, 0xe3, 0xe3, 0x35, 0x2c, 0xf4, 0x05, 0x28, 0x86, 0xe2, 0x1a, 0x17, 0x4b, 0xf1, + 0xc5, 0x01, 0xe7, 0xca, 0xd9, 0x20, 0x2d, 0xd3, 0x75, 0x5d, 0xe9, 0x43, 0x14, 0x49, 0xf4, 0x1d, + 0x30, 0x15, 0xf2, 0xc8, 0x28, 0x4b, 0x2d, 0x27, 0x64, 0x7e, 0x10, 0x62, 0x15, 0x32, 0x7f, 0xf4, + 0x7a, 0x02, 0x86, 0xbb, 0xb0, 0xd1, 0x8a, 0xfc, 0x28, 0x16, 0xc6, 0x85, 0x2f, 0xcc, 0x2b, 0xf1, + 0x07, 0x89, 0x34, 0x4c, 0x67, 0x93, 0xc3, 0xcf, 0x06, 0x5e, 0xab, 0x89, 0xbe, 0x00, 0x40, 0x97, + 0x8f, 0xd0, 0x25, 0x8c, 0x64, 0x1f, 0x9e, 0xf4, 0x54, 0x69, 0xa6, 0x5a, 0x7e, 0x32, 0x5f, 0xbe, + 0x8a, 0x22, 0x82, 0x35, 0x82, 0xf6, 0x0f, 0x17, 0xe0, 0xf1, 0x1e, 0x67, 0x24, 0x5a, 0x30, 0x9f, + 0x40, 0x9f, 0x4d, 0x0a, 0xd7, 0xb3, 0xa9, 0x95, 0x0d, 0x69, 0x3b, 0xb1, 0x14, 0x73, 0x1f, 0x78, + 0x29, 0xfe, 0x80, 0xa5, 0xa9, 0x3d, 0xb8, 0x31, 0xdf, 0x67, 0x8f, 0x79, 0xf6, 0x9f, 0xa0, 0x1e, + 0x64, 0x33, 0x45, 0x99, 0x70, 0x6d, 0xe0, 0xee, 0x0c, 0xac, 0x5d, 0x38, 0x5d, 0xe5, 0xef, 0x97, + 0x2d, 0x78, 0x32, 0xb5, 0xbf, 0x86, 0xc9, 0xc6, 0x3c, 0x94, 0x1a, 0xb4, 0x50, 0x73, 0xdd, 0x8a, + 0x7d, 0x5a, 0x25, 0x00, 0xc7, 0x38, 0x86, 0x65, 0x46, 0xae, 0xaf, 0x65, 0xc6, 0x3f, 0xb7, 0xa0, + 0x6b, 0x7f, 0x9c, 0xc2, 0x41, 0x5d, 0x35, 0x0f, 0xea, 0x8f, 0x0f, 0x32, 0x97, 0x19, 0x67, 0xf4, + 0x7f, 0x9e, 0x84, 0xf3, 0x19, 0xbe, 0x1a, 0x7b, 0x30, 0xbd, 0xd5, 0x20, 0xa6, 0x53, 0x9c, 0xf8, + 0x98, 0x54, 0xff, 0xc1, 0x9e, 0x1e, 0x74, 0x2c, 0x3d, 0xcf, 0x74, 0x17, 0x0a, 0xee, 0x6e, 0x02, + 0x7d, 0xd9, 0x82, 0xb3, 0xce, 0xfd, 0xb0, 0x2b, 0x09, 0xa3, 0x58, 0x33, 0x2f, 0xa5, 0x2a, 0x41, + 0xfa, 0x24, 0x6d, 0xe4, 0xf9, 0x8a, 0xd2, 0xb0, 0x70, 0x6a, 0x5b, 0x08, 0x8b, 0x10, 0x9a, 0x94, + 0x9d, 0xef, 0xe1, 0xb6, 0x99, 0xe6, 0x54, 0xc3, 0x8f, 0x6c, 0x09, 0xc1, 0x8a, 0x0e, 0xba, 0x0b, + 0xa5, 0x2d, 0xe9, 0xe9, 0x26, 0xae, 0x84, 0xd4, 0x3b, 0x36, 0xd5, 0x1d, 0x8e, 0x3f, 0x4b, 0x2a, + 0x10, 0x8e, 0x49, 0xa1, 0x37, 0x20, 0xef, 0x6d, 0x86, 0xbd, 0x12, 0xfd, 0x24, 0x2c, 0x99, 0xb8, + 0x4b, 0xf4, 0xda, 0x4a, 0x1d, 0xd3, 0x8a, 0xe8, 0x06, 0xe4, 0x83, 0x8d, 0xa6, 0xd0, 0xdb, 0xa5, + 0x9e, 0xdc, 0x78, 0xb1, 0x92, 0xbe, 0x48, 0x38, 0x25, 0xbc, 0x58, 0xc1, 0x94, 0x04, 0xaa, 0xc1, + 0x10, 0x73, 0x6b, 0x10, 0xb7, 0x40, 0x2a, 0xbf, 0xdb, 0xc3, 0x3d, 0x88, 0xfb, 0x4d, 0x33, 0x04, + 0xcc, 0x09, 0xa1, 0x75, 0x18, 0x6e, 0xb0, 0xa4, 0x30, 0x22, 0x6a, 0xf3, 0xa7, 0x52, 0x35, 0x74, + 0x3d, 0xb2, 0xe5, 0x08, 0x85, 0x15, 0xc3, 0xc0, 0x82, 0x16, 0xa3, 0x4a, 0xda, 0xdb, 0x9b, 0x21, + 0x93, 0xf0, 0xb3, 0xa8, 0xf6, 0x48, 0x02, 0x25, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x40, + 0x6e, 0xb3, 0x21, 0xbc, 0x1e, 0x52, 0x55, 0x75, 0xa6, 0x57, 0xfb, 0xe2, 0xf0, 0xe1, 0x41, 0x39, + 0xb7, 0xb2, 0x84, 0x73, 0x9b, 0x0d, 0xb4, 0x06, 0x23, 0x9b, 0xdc, 0x0f, 0x56, 0x68, 0xe3, 0x9e, + 0x4e, 0x77, 0xd1, 0xed, 0x72, 0x95, 0xe5, 0xd6, 0xfa, 0x02, 0x80, 0x25, 0x11, 0x16, 0x87, 0x52, + 0xf9, 0xf3, 0x8a, 0x80, 0xcc, 0x73, 0xc7, 0xf3, 0xc1, 0xe6, 0xb7, 0x72, 0xec, 0x15, 0x8c, 0x35, + 0x8a, 0xe8, 0x4b, 0x50, 0x72, 0x64, 0xfa, 0x3f, 0x11, 0xb0, 0xe2, 0xc5, 0xd4, 0x8d, 0xd9, 0x3b, + 0x33, 0x22, 0x5f, 0xd5, 0x0a, 0x09, 0xc7, 0x44, 0xd1, 0x0e, 0x8c, 0xef, 0x85, 0xed, 0x6d, 0x22, + 0x37, 0x32, 0x8b, 0x5f, 0x91, 0x71, 0x71, 0xdd, 0x15, 0x88, 0x6e, 0x10, 0x75, 0x9c, 0x56, 0xd7, + 0xd9, 0xc3, 0xde, 0xb2, 0xef, 0xea, 0xc4, 0xb0, 0x49, 0x9b, 0x0e, 0xff, 0x7b, 0x1d, 0x7f, 0x63, + 0x3f, 0x22, 0x22, 0x82, 0x73, 0xea, 0xf0, 0xbf, 0xc5, 0x51, 0xba, 0x87, 0x5f, 0x00, 0xb0, 0x24, + 0x42, 0xb7, 0xba, 0x23, 0x53, 0x6b, 0xb2, 0xc8, 0xcd, 0x19, 0x5b, 0x3d, 0x35, 0xff, 0xa6, 0x36, + 0x28, 0xec, 0x8c, 0x8c, 0x49, 0xb1, 0xb3, 0xb1, 0xbd, 0xed, 0x47, 0xbe, 0x97, 0x38, 0x97, 0xa7, + 0xb3, 0xcf, 0xc6, 0x5a, 0x0a, 0x7e, 0xf7, 0xd9, 0x98, 0x86, 0x85, 0x53, 0xdb, 0x42, 0x4d, 0x98, + 0x68, 0xfb, 0x41, 0x74, 0xdf, 0x0f, 0xe4, 0xfa, 0x42, 0x3d, 0xb4, 0x09, 0x06, 0xa6, 0x68, 0x91, + 0x45, 0x14, 0x37, 0x21, 0x38, 0x41, 0x13, 0x7d, 0x0e, 0x46, 0xc2, 0x86, 0xd3, 0x22, 0xd5, 0xdb, + 0x33, 0x67, 0xb2, 0x2f, 0x9d, 0x3a, 0x47, 0xc9, 0x58, 0x5d, 0x6c, 0x72, 0x04, 0x0a, 0x96, 0xe4, + 0xd0, 0x0a, 0x0c, 0xb1, 0xb4, 0x00, 0x2c, 0xf8, 0x74, 0x46, 0x60, 0xa4, 0x2e, 0xbb, 0x52, 0x7e, + 0x36, 0xb1, 0x62, 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0x98, 0x6a, 0x3f, 0x9c, 0x39, 0x97, 0xbd, 0x07, + 0x04, 0x2f, 0x7e, 0xbb, 0xde, 0x6b, 0x0f, 0x28, 0x24, 0x1c, 0x13, 0xa5, 0x27, 0x33, 0x3d, 0x4d, + 0xcf, 0xf7, 0x30, 0x63, 0xc9, 0x3c, 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, 0x4a, 0xc2, 0xfe, 0xbd, + 0x91, 0x6e, 0x4e, 0x85, 0x89, 0x61, 0x7f, 0xd1, 0xea, 0x7a, 0xa1, 0xfb, 0xf4, 0xa0, 0x5a, 0xa1, + 0x13, 0xe4, 0x51, 0xbf, 0x6c, 0xc1, 0xf9, 0x76, 0xea, 0x87, 0x88, 0x6b, 0x7f, 0x30, 0xe5, 0x12, + 0xff, 0x74, 0x15, 0x20, 0x3e, 0x1d, 0x8e, 0x33, 0x5a, 0x4a, 0xca, 0x01, 0xf9, 0x0f, 0x2c, 0x07, + 0xac, 0x42, 0x91, 0xb1, 0x96, 0x7d, 0x92, 0xa4, 0x25, 0xc5, 0x21, 0xc6, 0x40, 0x2c, 0x89, 0x8a, + 0x58, 0x91, 0x40, 0x3f, 0x68, 0xc1, 0xc5, 0x64, 0xd7, 0x31, 0x61, 0x60, 0x11, 0x4e, 0x9d, 0x4b, + 0x80, 0x2b, 0xe2, 0xfb, 0x2f, 0xd6, 0x7a, 0x21, 0x1f, 0xf5, 0x43, 0xc0, 0xbd, 0x1b, 0x43, 0x95, + 0x14, 0x11, 0x74, 0xd8, 0x54, 0xbb, 0x0f, 0x20, 0x86, 0xbe, 0x04, 0x63, 0xbb, 0x7e, 0xc7, 0x8b, + 0x84, 0xd5, 0x8b, 0xf0, 0x53, 0x64, 0xcf, 0xcc, 0xab, 0x5a, 0x39, 0x36, 0xb0, 0x12, 0xc2, 0x6b, + 0xf1, 0xa1, 0x85, 0xd7, 0x77, 0x12, 0xa9, 0xb0, 0x4b, 0xd9, 0x61, 0xfb, 0x84, 0x9c, 0x7f, 0x8c, + 0x84, 0xd8, 0xa7, 0x2b, 0x11, 0xfd, 0x8c, 0x95, 0xc2, 0xca, 0x73, 0x19, 0xf9, 0x75, 0x53, 0x46, + 0xbe, 0x92, 0x94, 0x91, 0xbb, 0x54, 0xae, 0x86, 0x78, 0x3c, 0x78, 0xec, 0xe7, 0x41, 0x83, 0xa9, + 0xd9, 0x2d, 0xb8, 0xdc, 0xef, 0x5a, 0x62, 0xe6, 0x4f, 0x4d, 0xf5, 0xc0, 0x16, 0x9b, 0x3f, 0x35, + 0xab, 0x15, 0xcc, 0x20, 0x83, 0x46, 0xdb, 0xb0, 0xff, 0x9b, 0x05, 0xf9, 0x9a, 0xdf, 0x3c, 0x05, + 0x15, 0xf2, 0x67, 0x0d, 0x15, 0xf2, 0xe3, 0x19, 0x29, 0xca, 0x33, 0x15, 0xc6, 0xcb, 0x09, 0x85, + 0xf1, 0xc5, 0x2c, 0x02, 0xbd, 0xd5, 0xc3, 0x3f, 0x99, 0x07, 0x3d, 0xa1, 0x3a, 0xfa, 0xcd, 0x87, + 0xb1, 0x3d, 0xce, 0xf7, 0xca, 0xb1, 0x2e, 0x28, 0x33, 0xab, 0x29, 0xe9, 0x7a, 0xf7, 0x67, 0xcc, + 0x04, 0xf9, 0x1e, 0x71, 0xb7, 0xb6, 0x23, 0xd2, 0x4c, 0x7e, 0xce, 0xe9, 0x99, 0x20, 0xff, 0x17, + 0x0b, 0x26, 0x13, 0xad, 0xa3, 0x16, 0x8c, 0xb7, 0x74, 0xfd, 0x9f, 0x58, 0xa7, 0x0f, 0xa5, 0x3a, + 0x14, 0x26, 0x9c, 0x5a, 0x11, 0x36, 0x89, 0xa3, 0x39, 0x00, 0xf5, 0x3e, 0x27, 0xf5, 0x5e, 0x8c, + 0xeb, 0x57, 0x0f, 0x78, 0x21, 0xd6, 0x30, 0xd0, 0xcb, 0x30, 0x1a, 0xf9, 0x6d, 0xbf, 0xe5, 0x6f, + 0xed, 0xdf, 0x24, 0x32, 0xbe, 0x8b, 0x32, 0xcc, 0x5a, 0x8f, 0x41, 0x58, 0xc7, 0xb3, 0x7f, 0x3a, + 0x0f, 0xc9, 0x24, 0xfc, 0xdf, 0x5a, 0x93, 0x1f, 0xcd, 0x35, 0xf9, 0x0d, 0x0b, 0xa6, 0x68, 0xeb, + 0xcc, 0x48, 0x44, 0x5e, 0xb6, 0x2a, 0x07, 0x8d, 0xd5, 0x23, 0x07, 0xcd, 0x15, 0x7a, 0x76, 0x35, + 0xfd, 0x4e, 0x24, 0xf4, 0x66, 0xda, 0xe1, 0x44, 0x4b, 0xb1, 0x80, 0x0a, 0x3c, 0x12, 0x04, 0xc2, + 0xf3, 0x49, 0xc7, 0x23, 0x41, 0x80, 0x05, 0x54, 0xa6, 0xa8, 0x29, 0x64, 0xa4, 0xa8, 0x61, 0xd1, + 0xea, 0x84, 0x39, 0x81, 0x60, 0x7b, 0xb4, 0x68, 0x75, 0xd2, 0xce, 0x20, 0xc6, 0xb1, 0x7f, 0x3e, + 0x0f, 0x63, 0x35, 0xbf, 0x19, 0xbf, 0x90, 0xbd, 0x64, 0xbc, 0x90, 0x5d, 0x4e, 0xbc, 0x90, 0x4d, + 0xe9, 0xb8, 0xdf, 0x7a, 0x0f, 0xfb, 0xb0, 0xde, 0xc3, 0xfe, 0x99, 0xc5, 0x66, 0xad, 0xb2, 0x56, + 0x17, 0x29, 0x72, 0x5f, 0x80, 0x51, 0x76, 0x20, 0x31, 0x57, 0x3b, 0xf9, 0x6c, 0xc4, 0xa2, 0xcf, + 0xaf, 0xc5, 0xc5, 0x58, 0xc7, 0x41, 0x57, 0xa1, 0x18, 0x12, 0x27, 0x68, 0x6c, 0xab, 0x33, 0x4e, + 0x3c, 0xaa, 0xf0, 0x32, 0xac, 0xa0, 0xe8, 0xad, 0x38, 0x50, 0x5a, 0x3e, 0x3b, 0xd9, 0xab, 0xde, + 0x1f, 0xbe, 0x45, 0xb2, 0xa3, 0xa3, 0xd9, 0xf7, 0x00, 0x75, 0xe3, 0x0f, 0x10, 0x12, 0xa9, 0x6c, + 0x86, 0x44, 0x2a, 0x75, 0x85, 0x43, 0xfa, 0x13, 0x0b, 0x26, 0x6a, 0x7e, 0x93, 0x6e, 0xdd, 0x6f, + 0xa6, 0x7d, 0xaa, 0x47, 0x89, 0x1c, 0xee, 0x11, 0x25, 0xf2, 0xef, 0x5a, 0x30, 0x52, 0xf3, 0x9b, + 0xa7, 0xa0, 0x6d, 0x7f, 0xdd, 0xd4, 0xb6, 0x3f, 0x96, 0xb1, 0x24, 0x32, 0x14, 0xec, 0xbf, 0x98, + 0x87, 0x71, 0xda, 0x4f, 0x7f, 0x4b, 0xce, 0x92, 0x31, 0x22, 0xd6, 0x00, 0x23, 0x42, 0xd9, 0x5c, + 0xbf, 0xd5, 0xf2, 0xef, 0x27, 0x67, 0x6c, 0x85, 0x95, 0x62, 0x01, 0x45, 0xcf, 0x41, 0xb1, 0x1d, + 0x90, 0x3d, 0xd7, 0x17, 0xfc, 0xa3, 0xf6, 0x76, 0x51, 0x13, 0xe5, 0x58, 0x61, 0x50, 0xb9, 0x2b, + 0x74, 0xbd, 0x06, 0x91, 0x99, 0xa6, 0x0b, 0x2c, 0x19, 0x15, 0x0f, 0xff, 0xac, 0x95, 0x63, 0x03, + 0x0b, 0xdd, 0x83, 0x12, 0xfb, 0xcf, 0x4e, 0x94, 0xe3, 0x27, 0xcf, 0x11, 0x39, 0x17, 0x04, 0x01, + 0x1c, 0xd3, 0x42, 0xd7, 0x00, 0x22, 0x19, 0x22, 0x38, 0x14, 0x91, 0x6d, 0x14, 0xaf, 0xad, 0x82, + 0x07, 0x87, 0x58, 0xc3, 0x42, 0xcf, 0x42, 0x29, 0x72, 0xdc, 0xd6, 0x2d, 0xd7, 0x23, 0x21, 0x53, + 0x39, 0xe7, 0x65, 0x4a, 0x05, 0x51, 0x88, 0x63, 0x38, 0xe5, 0x75, 0x98, 0xdb, 0x37, 0x4f, 0xbd, + 0x55, 0x64, 0xd8, 0x8c, 0xd7, 0xb9, 0xa5, 0x4a, 0xb1, 0x86, 0x61, 0xbf, 0x0a, 0xe7, 0x6a, 0x7e, + 0xb3, 0xe6, 0x07, 0xd1, 0x8a, 0x1f, 0xdc, 0x77, 0x82, 0xa6, 0x9c, 0xbf, 0xb2, 0x8c, 0xee, 0x4f, + 0xcf, 0x9e, 0x21, 0xbe, 0x33, 0x8d, 0xb8, 0xfd, 0x2f, 0x32, 0x6e, 0xe7, 0x98, 0xae, 0x1c, 0x0d, + 0x76, 0xef, 0xaa, 0x2c, 0x7b, 0xd7, 0x9d, 0x88, 0xa0, 0xdb, 0x2c, 0x33, 0x57, 0x7c, 0x05, 0x89, + 0xea, 0xcf, 0x68, 0x99, 0xb9, 0x62, 0x60, 0xea, 0x9d, 0x65, 0xd6, 0xb7, 0x7f, 0x2d, 0xcf, 0x4e, + 0xa3, 0x44, 0xd2, 0x39, 0xf4, 0x45, 0x98, 0x08, 0xc9, 0x2d, 0xd7, 0xeb, 0x3c, 0x90, 0x42, 0x78, + 0x0f, 0x67, 0x9c, 0xfa, 0xb2, 0x8e, 0xc9, 0x55, 0x79, 0x66, 0x19, 0x4e, 0x50, 0xa3, 0xf3, 0x14, + 0x74, 0xbc, 0x85, 0xf0, 0x4e, 0x48, 0x02, 0x91, 0xf4, 0x8c, 0xcd, 0x13, 0x96, 0x85, 0x38, 0x86, + 0xd3, 0x75, 0xc9, 0xfe, 0xac, 0xf9, 0x1e, 0xf6, 0xfd, 0x48, 0xae, 0x64, 0x96, 0x36, 0x47, 0x2b, + 0xc7, 0x06, 0x16, 0x5a, 0x01, 0x14, 0x76, 0xda, 0xed, 0x16, 0x7b, 0xce, 0x77, 0x5a, 0xd7, 0x03, + 0xbf, 0xd3, 0xe6, 0x6f, 0x9d, 0xf9, 0xc5, 0xf3, 0xf4, 0x0a, 0xab, 0x77, 0x41, 0x71, 0x4a, 0x0d, + 0x7a, 0xfa, 0x6c, 0x86, 0xec, 0x37, 0x5b, 0xdd, 0x79, 0xa1, 0x5e, 0xaf, 0xb3, 0x22, 0x2c, 0x61, + 0x74, 0x31, 0xb1, 0xe6, 0x39, 0xe6, 0x70, 0xbc, 0x98, 0xb0, 0x2a, 0xc5, 0x1a, 0x06, 0x5a, 0x86, + 0x91, 0x70, 0x3f, 0x6c, 0x44, 0x22, 0x0e, 0x53, 0x46, 0xfa, 0xca, 0x3a, 0x43, 0xd1, 0x52, 0x2a, + 0xf0, 0x2a, 0x58, 0xd6, 0xb5, 0xbf, 0x87, 0x5d, 0x86, 0x2c, 0x45, 0x56, 0xd4, 0x09, 0x08, 0xda, + 0x85, 0xf1, 0x36, 0x9b, 0x72, 0x11, 0xc0, 0x59, 0xcc, 0xdb, 0x4b, 0x03, 0x4a, 0xb5, 0xf7, 0xe9, + 0x41, 0xa3, 0xb4, 0x4e, 0x4c, 0x5c, 0xa8, 0xe9, 0xe4, 0xb0, 0x49, 0xdd, 0xfe, 0xd7, 0xd3, 0xec, + 0xcc, 0xad, 0x73, 0x51, 0x75, 0x44, 0x18, 0x14, 0x0b, 0xbe, 0x7c, 0x36, 0x5b, 0x67, 0x12, 0x7f, + 0x91, 0x30, 0x4a, 0xc6, 0xb2, 0x2e, 0x7a, 0x8b, 0xbd, 0x4d, 0xf3, 0x83, 0xae, 0x5f, 0xa6, 0x62, + 0x8e, 0x65, 0x3c, 0x43, 0x8b, 0x8a, 0x58, 0x23, 0x82, 0x6e, 0xc1, 0xb8, 0xc8, 0xa8, 0x24, 0x94, + 0x62, 0x79, 0x43, 0xe9, 0x31, 0x8e, 0x75, 0xe0, 0x51, 0xb2, 0x00, 0x9b, 0x95, 0xd1, 0x16, 0x5c, + 0xd4, 0xd2, 0x0b, 0x5e, 0x0f, 0x1c, 0xf6, 0x5e, 0xe9, 0xb2, 0x4d, 0xa4, 0x9d, 0x9b, 0x4f, 0x1e, + 0x1e, 0x94, 0x2f, 0xae, 0xf7, 0x42, 0xc4, 0xbd, 0xe9, 0xa0, 0xdb, 0x70, 0x8e, 0xfb, 0xed, 0x55, + 0x88, 0xd3, 0x6c, 0xb9, 0x9e, 0x3a, 0x98, 0xf9, 0x3a, 0xbc, 0x70, 0x78, 0x50, 0x3e, 0xb7, 0x90, + 0x86, 0x80, 0xd3, 0xeb, 0xa1, 0xd7, 0xa1, 0xd4, 0xf4, 0x42, 0x31, 0x06, 0xc3, 0x46, 0xe6, 0xcc, + 0x52, 0x65, 0xad, 0xae, 0xbe, 0x3f, 0xfe, 0x83, 0xe3, 0x0a, 0x68, 0x8b, 0x2b, 0xc6, 0x94, 0x1c, + 0x3a, 0x92, 0x9d, 0x25, 0x5d, 0x2c, 0x09, 0xc3, 0x73, 0x87, 0x6b, 0x84, 0x95, 0xe5, 0xab, 0xe1, + 0xd4, 0x63, 0x10, 0x46, 0x6f, 0x02, 0xa2, 0x8c, 0x9a, 0xdb, 0x20, 0x0b, 0x0d, 0x16, 0x47, 0x9b, + 0xe9, 0x11, 0x8b, 0x86, 0xa7, 0x04, 0xaa, 0x77, 0x61, 0xe0, 0x94, 0x5a, 0xe8, 0x06, 0x3d, 0xc8, + 0xf4, 0x52, 0x61, 0xc1, 0x2b, 0x99, 0xfb, 0x99, 0x0a, 0x69, 0x07, 0xa4, 0xe1, 0x44, 0xa4, 0x69, + 0x52, 0xc4, 0x89, 0x7a, 0xf4, 0x2e, 0x55, 0x29, 0x75, 0xc0, 0x0c, 0x96, 0xd1, 0x9d, 0x56, 0x87, + 0xca, 0xc5, 0xdb, 0x7e, 0x18, 0xad, 0x91, 0xe8, 0xbe, 0x1f, 0xec, 0x88, 0xd8, 0x64, 0x71, 0x98, + 0xcc, 0x18, 0x84, 0x75, 0x3c, 0xca, 0x07, 0xb3, 0xc7, 0xe1, 0x6a, 0x85, 0xbd, 0xd0, 0x15, 0xe3, + 0x7d, 0x72, 0x83, 0x17, 0x63, 0x09, 0x97, 0xa8, 0xd5, 0xda, 0x12, 0x7b, 0x6d, 0x4b, 0xa0, 0x56, + 0x6b, 0x4b, 0x58, 0xc2, 0x11, 0xe9, 0xce, 0x4a, 0x3a, 0x91, 0xad, 0xd5, 0xec, 0xbe, 0x0e, 0x06, + 0x4c, 0x4c, 0xea, 0xc1, 0x94, 0xca, 0x87, 0xca, 0x83, 0xb6, 0x85, 0x33, 0x93, 0x6c, 0x91, 0x0c, + 0x1e, 0xf1, 0x4d, 0xe9, 0x89, 0xab, 0x09, 0x4a, 0xb8, 0x8b, 0xb6, 0x11, 0xbe, 0x64, 0xaa, 0x6f, + 0x4a, 0xa4, 0x79, 0x28, 0x85, 0x9d, 0x8d, 0xa6, 0xbf, 0xeb, 0xb8, 0x1e, 0x7b, 0x1c, 0xd3, 0x98, + 0xac, 0xba, 0x04, 0xe0, 0x18, 0x07, 0xad, 0x40, 0xd1, 0x91, 0x4a, 0x60, 0x94, 0x1d, 0xab, 0x40, + 0xa9, 0x7e, 0xb9, 0xfb, 0xae, 0x54, 0xfb, 0xaa, 0xba, 0xe8, 0x35, 0x18, 0x17, 0xde, 0x5a, 0x3c, + 0x82, 0x03, 0x7b, 0xbc, 0xd2, 0xcc, 0xf1, 0xeb, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x0b, 0x30, 0x41, + 0xa9, 0xc4, 0x07, 0xdb, 0xcc, 0xd9, 0x41, 0x4e, 0x44, 0x2d, 0xd5, 0x85, 0x5e, 0x19, 0x27, 0x88, + 0xa1, 0x26, 0x3c, 0xe1, 0x74, 0x22, 0x9f, 0x29, 0xd2, 0xcd, 0xf5, 0xbf, 0xee, 0xef, 0x10, 0x8f, + 0xbd, 0x61, 0x15, 0x17, 0x2f, 0x1f, 0x1e, 0x94, 0x9f, 0x58, 0xe8, 0x81, 0x87, 0x7b, 0x52, 0x41, + 0x77, 0x60, 0x34, 0xf2, 0x5b, 0xcc, 0x30, 0x9e, 0xb2, 0x12, 0xe7, 0xb3, 0xc3, 0xff, 0xac, 0x2b, + 0x34, 0x5d, 0x89, 0xa4, 0xaa, 0x62, 0x9d, 0x0e, 0x5a, 0xe7, 0x7b, 0x8c, 0x05, 0x46, 0x25, 0xe1, + 0xcc, 0x63, 0xd9, 0x03, 0xa3, 0xe2, 0xa7, 0x9a, 0x5b, 0x50, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x1d, + 0xa6, 0xdb, 0x81, 0xeb, 0xb3, 0x85, 0xad, 0x1e, 0x31, 0x66, 0xcc, 0xec, 0x06, 0xb5, 0x24, 0x02, + 0xee, 0xae, 0x43, 0x85, 0x4c, 0x59, 0x38, 0x73, 0x81, 0xa7, 0xca, 0xe2, 0x8c, 0x37, 0x2f, 0xc3, + 0x0a, 0x8a, 0x56, 0xd9, 0xb9, 0xcc, 0xc5, 0xc1, 0x99, 0xd9, 0xec, 0x18, 0x0f, 0xba, 0xd8, 0xc8, + 0xf9, 0x25, 0xf5, 0x17, 0xc7, 0x14, 0xe8, 0xbd, 0x11, 0x6e, 0x3b, 0x01, 0xa9, 0x05, 0x7e, 0x83, + 0xf0, 0xce, 0x70, 0x9b, 0xfc, 0xc7, 0x79, 0xfc, 0x46, 0x7a, 0x6f, 0xd4, 0xd3, 0x10, 0x70, 0x7a, + 0x3d, 0xd4, 0xd4, 0x32, 0x44, 0x53, 0x36, 0x34, 0x9c, 0x79, 0xa2, 0x87, 0x99, 0x51, 0x82, 0x67, + 0x8d, 0xd7, 0xa2, 0x51, 0x1c, 0xe2, 0x04, 0x4d, 0xf4, 0x1d, 0x30, 0x25, 0xc2, 0x1d, 0xc5, 0xe3, + 0x7e, 0x31, 0xb6, 0x5f, 0xc4, 0x09, 0x18, 0xee, 0xc2, 0x9e, 0xfd, 0x76, 0x98, 0xee, 0xba, 0x71, + 0x8e, 0x15, 0x7c, 0xfc, 0x8f, 0x87, 0xa0, 0xa4, 0x94, 0xe9, 0x68, 0xde, 0x7c, 0x23, 0xb9, 0x90, + 0x7c, 0x23, 0x29, 0x52, 0x9e, 0x5e, 0x7f, 0x16, 0x59, 0x37, 0xcc, 0xea, 0x72, 0xd9, 0xa9, 0xbe, + 0x74, 0xae, 0xbc, 0xaf, 0x8b, 0x9e, 0xa6, 0x1b, 0xc9, 0x0f, 0xfc, 0xd8, 0x52, 0xe8, 0xa9, 0x6e, + 0x19, 0x30, 0xd3, 0x2e, 0x7a, 0x8a, 0x0a, 0x36, 0xcd, 0x6a, 0x2d, 0x99, 0x7a, 0xb2, 0x46, 0x0b, + 0x31, 0x87, 0x31, 0x01, 0x90, 0xb2, 0x47, 0x4c, 0x00, 0x1c, 0x79, 0x48, 0x01, 0x50, 0x12, 0xc0, + 0x31, 0x2d, 0xd4, 0x82, 0xe9, 0x86, 0x99, 0x35, 0x54, 0xb9, 0xe5, 0x3d, 0xd5, 0x37, 0x7f, 0x67, + 0x47, 0x4b, 0xd1, 0xb6, 0x94, 0xa4, 0x82, 0xbb, 0x09, 0xa3, 0xd7, 0xa0, 0xf8, 0x9e, 0x1f, 0xb2, + 0xc5, 0x24, 0x78, 0x04, 0xe9, 0xbe, 0x54, 0x7c, 0xeb, 0x76, 0x9d, 0x95, 0x1f, 0x1d, 0x94, 0x47, + 0x6b, 0x7e, 0x53, 0xfe, 0xc5, 0xaa, 0x02, 0x7a, 0x00, 0xe7, 0x8c, 0x93, 0x55, 0x75, 0x17, 0x06, + 0xef, 0xee, 0x45, 0xd1, 0xdc, 0xb9, 0x6a, 0x1a, 0x25, 0x9c, 0xde, 0x00, 0x3d, 0xae, 0x3c, 0x5f, + 0x64, 0xdc, 0x95, 0x7c, 0x08, 0x63, 0x37, 0x4a, 0xba, 0xf3, 0x7a, 0x02, 0x01, 0x77, 0xd7, 0xb1, + 0x7f, 0x85, 0xbf, 0x3d, 0x08, 0x0d, 0x25, 0x09, 0x3b, 0xad, 0xd3, 0x48, 0xe8, 0xb4, 0x6c, 0x28, + 0x4f, 0x1f, 0xfa, 0x7d, 0xeb, 0x37, 0x2c, 0xf6, 0xbe, 0xb5, 0x4e, 0x76, 0xdb, 0x2d, 0x2a, 0x27, + 0x3f, 0xfa, 0x8e, 0xbf, 0x05, 0xc5, 0x48, 0xb4, 0xd6, 0x2b, 0x07, 0x95, 0xd6, 0x29, 0xf6, 0xc6, + 0xa7, 0x38, 0x14, 0x59, 0x8a, 0x15, 0x19, 0xfb, 0x9f, 0xf0, 0x19, 0x90, 0x90, 0x53, 0x50, 0x64, + 0x55, 0x4c, 0x45, 0x56, 0xb9, 0xcf, 0x17, 0x64, 0x28, 0xb4, 0xfe, 0xb1, 0xd9, 0x6f, 0x26, 0x0c, + 0x7e, 0xd4, 0x1f, 0x56, 0xed, 0x1f, 0xb1, 0xe0, 0x6c, 0x9a, 0x25, 0x12, 0xe5, 0x2a, 0xb9, 0x28, + 0xaa, 0x1e, 0x9a, 0xd5, 0x08, 0xde, 0x15, 0xe5, 0x58, 0x61, 0x0c, 0x9c, 0xde, 0xe1, 0x78, 0xf1, + 0xdd, 0x6e, 0xc3, 0x78, 0x2d, 0x20, 0xda, 0x1d, 0xf0, 0x06, 0xf7, 0x83, 0xe3, 0xfd, 0x79, 0xee, + 0xd8, 0x3e, 0x70, 0xf6, 0xcf, 0xe6, 0xe0, 0x2c, 0x7f, 0x29, 0x5a, 0xd8, 0xf3, 0xdd, 0x66, 0xcd, + 0x6f, 0x8a, 0xd4, 0x1c, 0x6f, 0xc3, 0x58, 0x5b, 0xd3, 0x1f, 0xf4, 0x8a, 0x30, 0xa5, 0xeb, 0x19, + 0x62, 0x39, 0x4e, 0x2f, 0xc5, 0x06, 0x2d, 0xd4, 0x84, 0x31, 0xb2, 0xe7, 0x36, 0xd4, 0x73, 0x43, + 0xee, 0xd8, 0x77, 0x83, 0x6a, 0x65, 0x59, 0xa3, 0x83, 0x0d, 0xaa, 0x8f, 0x20, 0x5b, 0x9b, 0xfd, + 0xa3, 0x16, 0x3c, 0x96, 0x11, 0x8f, 0x8a, 0x36, 0x77, 0x9f, 0xbd, 0xc9, 0x89, 0xc4, 0x4f, 0xaa, + 0x39, 0xfe, 0x52, 0x87, 0x05, 0x14, 0x7d, 0x0e, 0x80, 0xbf, 0xb4, 0x51, 0xb1, 0xa6, 0x5f, 0xe0, + 0x1e, 0x23, 0xe6, 0x88, 0x16, 0x2b, 0x42, 0xd6, 0xc7, 0x1a, 0x2d, 0xfb, 0xa7, 0xf2, 0x30, 0xc4, + 0x5e, 0x76, 0xd0, 0x0a, 0x8c, 0x6c, 0xf3, 0x08, 0xcd, 0x83, 0x04, 0x83, 0x8e, 0xe5, 0x43, 0x5e, + 0x80, 0x65, 0x65, 0xb4, 0x0a, 0x67, 0x78, 0x84, 0xeb, 0x56, 0x85, 0xb4, 0x9c, 0x7d, 0xa9, 0x66, + 0xe0, 0xc9, 0x92, 0x54, 0xdc, 0x8b, 0x6a, 0x37, 0x0a, 0x4e, 0xab, 0x87, 0xde, 0x80, 0x09, 0xca, + 0x97, 0xf9, 0x9d, 0x48, 0x52, 0xe2, 0xb1, 0xad, 0x15, 0x23, 0xb8, 0x6e, 0x40, 0x71, 0x02, 0x9b, + 0x0a, 0x4c, 0xed, 0x2e, 0x85, 0xca, 0x50, 0x2c, 0x30, 0x99, 0x4a, 0x14, 0x13, 0x97, 0x99, 0x20, + 0x75, 0x98, 0xc1, 0xd5, 0xfa, 0x76, 0x40, 0xc2, 0x6d, 0xbf, 0xd5, 0x14, 0xb9, 0xb6, 0x63, 0x13, + 0xa4, 0x04, 0x1c, 0x77, 0xd5, 0xa0, 0x54, 0x36, 0x1d, 0xb7, 0xd5, 0x09, 0x48, 0x4c, 0x65, 0xd8, + 0xa4, 0xb2, 0x92, 0x80, 0xe3, 0xae, 0x1a, 0x74, 0x1d, 0x9d, 0x13, 0xc9, 0xaf, 0xa5, 0x37, 0xbe, + 0xb2, 0x2b, 0x1b, 0x91, 0x7e, 0x49, 0x3d, 0xc2, 0xd1, 0x08, 0xcb, 0x1b, 0x95, 0x3e, 0x5b, 0xd3, + 0x03, 0x0a, 0x8f, 0x24, 0x49, 0xe5, 0x61, 0x52, 0x30, 0xff, 0x9e, 0x05, 0x67, 0x52, 0xec, 0x57, + 0xf9, 0x51, 0xb5, 0xe5, 0x86, 0x91, 0x4a, 0x08, 0xa3, 0x1d, 0x55, 0xbc, 0x1c, 0x2b, 0x0c, 0xba, + 0x1f, 0xf8, 0x61, 0x98, 0x3c, 0x00, 0x85, 0x7d, 0x98, 0x80, 0x1e, 0xef, 0x00, 0x44, 0x97, 0xa1, + 0xd0, 0x09, 0x89, 0x0c, 0x24, 0xa5, 0xce, 0x6f, 0xa6, 0x19, 0x66, 0x10, 0xca, 0x9a, 0x6e, 0x29, + 0xa5, 0xac, 0xc6, 0x9a, 0x72, 0x4d, 0x2b, 0x87, 0xd9, 0x5f, 0xcd, 0xc3, 0x85, 0x4c, 0x4b, 0x75, + 0xda, 0xa5, 0x5d, 0xdf, 0x73, 0x23, 0x5f, 0xbd, 0x1a, 0xf2, 0x50, 0x26, 0xa4, 0xbd, 0xbd, 0x2a, + 0xca, 0xb1, 0xc2, 0x40, 0x57, 0x64, 0x1a, 0xf6, 0x64, 0xca, 0x9b, 0xc5, 0x8a, 0x91, 0x89, 0x7d, + 0xd0, 0x74, 0x62, 0x4f, 0x41, 0xa1, 0xed, 0xfb, 0xad, 0xe4, 0x61, 0x44, 0xbb, 0xeb, 0xfb, 0x2d, + 0xcc, 0x80, 0xe8, 0x13, 0x62, 0x1c, 0x12, 0xcf, 0x64, 0xd8, 0x69, 0xfa, 0xa1, 0x36, 0x18, 0xcf, + 0xc0, 0xc8, 0x0e, 0xd9, 0x0f, 0x5c, 0x6f, 0x2b, 0xf9, 0x7c, 0x7a, 0x93, 0x17, 0x63, 0x09, 0x37, + 0x33, 0x3e, 0x8c, 0x9c, 0x74, 0x1e, 0xb0, 0x62, 0xdf, 0xab, 0xed, 0x07, 0xf2, 0x30, 0x89, 0x17, + 0x2b, 0xdf, 0x9a, 0x88, 0x3b, 0xdd, 0x13, 0x71, 0xd2, 0x79, 0xc0, 0xfa, 0xcf, 0xc6, 0x2f, 0x5a, + 0x30, 0xc9, 0xa2, 0x22, 0x8b, 0x00, 0x1a, 0xae, 0xef, 0x9d, 0x02, 0xeb, 0xf6, 0x14, 0x0c, 0x05, + 0xb4, 0xd1, 0x64, 0x72, 0x1f, 0xd6, 0x13, 0xcc, 0x61, 0xe8, 0x09, 0x28, 0xb0, 0x2e, 0xd0, 0xc9, + 0x1b, 0xe3, 0x79, 0x11, 0x2a, 0x4e, 0xe4, 0x60, 0x56, 0xca, 0xbc, 0xc2, 0x31, 0x69, 0xb7, 0x5c, + 0xde, 0xe9, 0xf8, 0x49, 0xe2, 0xa3, 0xe1, 0x15, 0x9e, 0xda, 0xb5, 0x0f, 0xe6, 0x15, 0x9e, 0x4e, + 0xb2, 0xb7, 0x58, 0xf4, 0xdf, 0x73, 0x70, 0x29, 0xb5, 0xde, 0xc0, 0x5e, 0xe1, 0xbd, 0x6b, 0x9f, + 0x8c, 0x15, 0x4c, 0xba, 0x71, 0x4a, 0xfe, 0x14, 0x8d, 0x53, 0x0a, 0x83, 0x72, 0x8e, 0x43, 0x03, + 0x38, 0x6b, 0xa7, 0x0e, 0xd9, 0x47, 0xc4, 0x59, 0x3b, 0xb5, 0x6f, 0x19, 0x62, 0xdd, 0x9f, 0xe6, + 0x32, 0xbe, 0x85, 0x09, 0x78, 0x57, 0xe9, 0x39, 0xc3, 0x80, 0xa1, 0xe0, 0x84, 0xc7, 0xf8, 0x19, + 0xc3, 0xcb, 0xb0, 0x82, 0x22, 0x57, 0x73, 0x7b, 0xce, 0x65, 0xa7, 0x7e, 0xcc, 0x6c, 0x6a, 0xce, + 0x7c, 0x41, 0x52, 0x43, 0x90, 0xe2, 0x02, 0xbd, 0xaa, 0x09, 0xe5, 0xf9, 0xc1, 0x85, 0xf2, 0xb1, + 0x74, 0x81, 0x1c, 0x2d, 0xc0, 0xe4, 0xae, 0xeb, 0xb1, 0x54, 0xfe, 0x26, 0x2b, 0xaa, 0xa2, 0x80, + 0xac, 0x9a, 0x60, 0x9c, 0xc4, 0x9f, 0x7d, 0x0d, 0xc6, 0x1f, 0x5e, 0x1d, 0xf9, 0x8d, 0x3c, 0x3c, + 0xde, 0x63, 0xdb, 0xf3, 0xb3, 0xde, 0x98, 0x03, 0xed, 0xac, 0xef, 0x9a, 0x87, 0x1a, 0x9c, 0xdd, + 0xec, 0xb4, 0x5a, 0xfb, 0xcc, 0xfe, 0x93, 0x34, 0x25, 0x86, 0xe0, 0x15, 0x9f, 0x90, 0x99, 0x28, + 0x56, 0x52, 0x70, 0x70, 0x6a, 0x4d, 0xf4, 0x26, 0x20, 0x5f, 0xe4, 0x9d, 0xbd, 0x4e, 0x3c, 0xa1, + 0x97, 0x67, 0x03, 0x9f, 0x8f, 0x37, 0xe3, 0xed, 0x2e, 0x0c, 0x9c, 0x52, 0x8b, 0x32, 0xfd, 0xf4, + 0x56, 0xda, 0x57, 0xdd, 0x4a, 0x30, 0xfd, 0x58, 0x07, 0x62, 0x13, 0x17, 0x5d, 0x87, 0x69, 0x67, + 0xcf, 0x71, 0x79, 0x74, 0x3c, 0x49, 0x80, 0x73, 0xfd, 0x4a, 0x09, 0xb6, 0x90, 0x44, 0xc0, 0xdd, + 0x75, 0x12, 0x8e, 0xd1, 0xc3, 0xd9, 0x8e, 0xd1, 0xbd, 0xcf, 0xc5, 0x7e, 0x3a, 0x5d, 0xfb, 0x3f, + 0x58, 0xf4, 0xfa, 0x4a, 0xc9, 0x1d, 0x4f, 0xc7, 0x41, 0xe9, 0x26, 0x35, 0x1f, 0xe5, 0x73, 0x9a, + 0x85, 0x47, 0x0c, 0xc4, 0x26, 0x2e, 0x5f, 0x10, 0x61, 0xec, 0x24, 0x63, 0xb0, 0xee, 0x22, 0xc6, + 0x81, 0xc2, 0x40, 0x9f, 0x87, 0x91, 0xa6, 0xbb, 0xe7, 0x86, 0x7e, 0x20, 0x36, 0xcb, 0x31, 0x5d, + 0x0d, 0xe2, 0x73, 0xb0, 0xc2, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0x81, 0x1c, 0x8c, 0xcb, 0x16, 0xdf, + 0xea, 0xf8, 0x91, 0x73, 0x0a, 0xd7, 0xf2, 0x75, 0xe3, 0x5a, 0xfe, 0x44, 0xaf, 0x40, 0x0f, 0xac, + 0x4b, 0x99, 0xd7, 0xf1, 0xed, 0xc4, 0x75, 0xfc, 0x74, 0x7f, 0x52, 0xbd, 0xaf, 0xe1, 0x7f, 0x6a, + 0xc1, 0xb4, 0x81, 0x7f, 0x0a, 0xb7, 0xc1, 0x8a, 0x79, 0x1b, 0x3c, 0xd9, 0xf7, 0x1b, 0x32, 0x6e, + 0x81, 0xef, 0xcb, 0x27, 0xfa, 0xce, 0x4e, 0xff, 0xf7, 0xa0, 0xb0, 0xed, 0x04, 0xcd, 0x5e, 0x01, + 0x65, 0xbb, 0x2a, 0xcd, 0xdd, 0x70, 0x82, 0x26, 0x3f, 0xc3, 0x9f, 0x53, 0xd9, 0x2a, 0x9d, 0xa0, + 0xd9, 0xd7, 0x27, 0x8c, 0x35, 0x85, 0x5e, 0x85, 0xe1, 0xb0, 0xe1, 0xb7, 0x95, 0xc5, 0xe6, 0x65, + 0x9e, 0xc9, 0x92, 0x96, 0x1c, 0x1d, 0x94, 0x91, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x1f, 0xbd, 0x0d, + 0xe3, 0xec, 0x97, 0xb2, 0x5c, 0xc8, 0x67, 0xa7, 0x31, 0xa8, 0xeb, 0x88, 0xdc, 0x00, 0xc6, 0x28, + 0xc2, 0x26, 0xa9, 0xd9, 0x2d, 0x28, 0xa9, 0xcf, 0x7a, 0xa4, 0xbe, 0x3c, 0xff, 0x36, 0x0f, 0x67, + 0x52, 0xd6, 0x1c, 0x0a, 0x8d, 0x99, 0x78, 0x61, 0xc0, 0xa5, 0xfa, 0x01, 0xe7, 0x22, 0x64, 0xd2, + 0x50, 0x53, 0xac, 0xad, 0x81, 0x1b, 0xbd, 0x13, 0x92, 0x64, 0xa3, 0xb4, 0xa8, 0x7f, 0xa3, 0xb4, + 0xb1, 0x53, 0x1b, 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x23, 0x9d, 0xd3, 0x3f, 0xca, 0xc3, 0xd9, 0xb4, + 0xd8, 0x33, 0xe8, 0xbb, 0x13, 0x29, 0x6d, 0x5e, 0x1a, 0x34, 0x6a, 0x0d, 0xcf, 0x73, 0x23, 0x12, + 0x34, 0xcf, 0x99, 0x49, 0x6e, 0xfa, 0x0e, 0xb3, 0x68, 0x93, 0x39, 0x80, 0x06, 0x3c, 0x15, 0x91, + 0x3c, 0x3e, 0x3e, 0x3d, 0x70, 0x07, 0x44, 0x0e, 0xa3, 0x30, 0xe1, 0x00, 0x2a, 0x8b, 0xfb, 0x3b, + 0x80, 0xca, 0x96, 0x67, 0x5d, 0x18, 0xd5, 0xbe, 0xe6, 0x91, 0xce, 0xf8, 0x0e, 0xbd, 0xad, 0xb4, + 0x7e, 0x3f, 0xd2, 0x59, 0xff, 0x51, 0x0b, 0x12, 0xe6, 0x91, 0x4a, 0xdd, 0x65, 0x65, 0xaa, 0xbb, + 0x2e, 0x43, 0x21, 0xf0, 0x5b, 0x24, 0x99, 0x41, 0x06, 0xfb, 0x2d, 0x82, 0x19, 0x84, 0x62, 0x44, + 0xb1, 0xb2, 0x63, 0x4c, 0x17, 0xe4, 0x84, 0x88, 0xf6, 0x14, 0x0c, 0xb5, 0xc8, 0x1e, 0x69, 0x25, + 0xc3, 0xb3, 0xdf, 0xa2, 0x85, 0x98, 0xc3, 0xec, 0x5f, 0x2c, 0xc0, 0xc5, 0x9e, 0x2e, 0xd4, 0x54, + 0x1c, 0xda, 0x72, 0x22, 0x72, 0xdf, 0xd9, 0x4f, 0xc6, 0x51, 0xbe, 0xce, 0x8b, 0xb1, 0x84, 0x33, + 0x8b, 0x71, 0x1e, 0x37, 0x31, 0xa1, 0x1c, 0x14, 0xe1, 0x12, 0x05, 0xf4, 0x11, 0x24, 0xa7, 0xbf, + 0x06, 0x10, 0x86, 0xad, 0x65, 0x8f, 0x72, 0x77, 0x4d, 0x61, 0x8a, 0x1e, 0xc7, 0xd7, 0xac, 0xdf, + 0x12, 0x10, 0xac, 0x61, 0xa1, 0x0a, 0x4c, 0xb5, 0x03, 0x3f, 0xe2, 0xba, 0xd6, 0x0a, 0x37, 0x14, + 0x1a, 0x32, 0xbd, 0x57, 0x6b, 0x09, 0x38, 0xee, 0xaa, 0x81, 0x5e, 0x86, 0x51, 0xe1, 0xd1, 0x5a, + 0xf3, 0xfd, 0x96, 0x50, 0x03, 0x29, 0xb3, 0x93, 0x7a, 0x0c, 0xc2, 0x3a, 0x9e, 0x56, 0x8d, 0x29, + 0x70, 0x47, 0x52, 0xab, 0x71, 0x25, 0xae, 0x86, 0x97, 0x88, 0x43, 0x55, 0x1c, 0x28, 0x0e, 0x55, + 0xac, 0x18, 0x2b, 0x0d, 0xfc, 0x66, 0x05, 0x7d, 0x55, 0x49, 0x3f, 0x57, 0x80, 0x33, 0x62, 0xe1, + 0x3c, 0xea, 0xe5, 0xf2, 0x88, 0x52, 0xe8, 0x7f, 0x6b, 0xcd, 0x9c, 0xf6, 0x9a, 0xf9, 0x41, 0x0b, + 0x4c, 0xf6, 0x0a, 0xfd, 0xb9, 0xcc, 0x40, 0xf4, 0x2f, 0x67, 0xb2, 0x6b, 0x4d, 0x79, 0x81, 0x7c, + 0xc0, 0x90, 0xf4, 0xf6, 0xbf, 0xb7, 0xe0, 0xc9, 0xbe, 0x14, 0xd1, 0x32, 0x94, 0x18, 0x0f, 0xa8, + 0x49, 0x67, 0x4f, 0x2b, 0x43, 0x42, 0x09, 0xc8, 0x60, 0x49, 0xe3, 0x9a, 0x68, 0xb9, 0x2b, 0xe2, + 0xff, 0x33, 0x29, 0x11, 0xff, 0xcf, 0x19, 0xc3, 0xf3, 0x90, 0x21, 0xff, 0x7f, 0x25, 0x0f, 0xc3, + 0x7c, 0xc5, 0x9f, 0x82, 0x18, 0xb6, 0x22, 0xf4, 0xb6, 0x3d, 0x22, 0x51, 0xf1, 0xbe, 0xcc, 0x55, + 0x9c, 0xc8, 0xe1, 0x6c, 0x82, 0xba, 0xad, 0x62, 0x0d, 0x2f, 0x9a, 0x33, 0xee, 0xb3, 0xd9, 0x84, + 0x62, 0x12, 0x38, 0x0d, 0xed, 0x76, 0xfb, 0x22, 0x40, 0xc8, 0xb2, 0xe5, 0x53, 0x1a, 0x22, 0xa6, + 0xd9, 0x27, 0x7b, 0xb4, 0x5e, 0x57, 0xc8, 0xbc, 0x0f, 0xf1, 0x4e, 0x57, 0x00, 0xac, 0x51, 0x9c, + 0x7d, 0x05, 0x4a, 0x0a, 0xb9, 0x9f, 0x16, 0x67, 0x4c, 0x67, 0x2e, 0x3e, 0x0b, 0x93, 0x89, 0xb6, + 0x8e, 0xa5, 0x04, 0xfa, 0x25, 0x0b, 0x26, 0x79, 0x97, 0x97, 0xbd, 0x3d, 0x71, 0xa6, 0xbe, 0x0f, + 0x67, 0x5b, 0x29, 0x67, 0x9b, 0x98, 0xd1, 0xc1, 0xcf, 0x42, 0xa5, 0xf4, 0x49, 0x83, 0xe2, 0xd4, + 0x36, 0xd0, 0x55, 0xba, 0x6e, 0xe9, 0xd9, 0xe5, 0xb4, 0x84, 0xf7, 0xd1, 0x18, 0x5f, 0xb3, 0xbc, + 0x0c, 0x2b, 0xa8, 0xfd, 0x3b, 0x16, 0x4c, 0xf3, 0x9e, 0xdf, 0x24, 0xfb, 0x6a, 0x87, 0x7f, 0x98, + 0x7d, 0x17, 0x49, 0x38, 0x72, 0x19, 0x49, 0x38, 0xf4, 0x4f, 0xcb, 0xf7, 0xfc, 0xb4, 0x9f, 0xb5, + 0x40, 0xac, 0xc0, 0x53, 0x10, 0xe5, 0xbf, 0xdd, 0x14, 0xe5, 0x67, 0xb3, 0x17, 0x75, 0x86, 0x0c, + 0xff, 0x27, 0x16, 0x4c, 0x71, 0x84, 0xf8, 0x2d, 0xf9, 0x43, 0x9d, 0x87, 0x41, 0xb2, 0xe9, 0xa9, + 0x14, 0xdb, 0xe9, 0x1f, 0x65, 0x4c, 0x56, 0xa1, 0xe7, 0x64, 0x35, 0xe5, 0x06, 0x3a, 0x46, 0x26, + 0xc9, 0x63, 0x07, 0xb3, 0xb6, 0xff, 0xd0, 0x02, 0xc4, 0x9b, 0x31, 0xd8, 0x1f, 0xca, 0x54, 0xb0, + 0x52, 0xed, 0xba, 0x88, 0x8f, 0x1a, 0x05, 0xc1, 0x1a, 0xd6, 0x89, 0x0c, 0x4f, 0xc2, 0x20, 0x20, + 0xdf, 0xdf, 0x20, 0xe0, 0x18, 0x23, 0xfa, 0x7f, 0x0a, 0x90, 0x74, 0x07, 0x40, 0x77, 0x61, 0xac, + 0xe1, 0xb4, 0x9d, 0x0d, 0xb7, 0xe5, 0x46, 0x2e, 0x09, 0x7b, 0x59, 0x12, 0x2d, 0x69, 0x78, 0xe2, + 0xa9, 0x57, 0x2b, 0xc1, 0x06, 0x1d, 0x34, 0x07, 0xd0, 0x0e, 0xdc, 0x3d, 0xb7, 0x45, 0xb6, 0x98, + 0xc6, 0x81, 0xf9, 0x3b, 0x72, 0xf3, 0x18, 0x59, 0x8a, 0x35, 0x8c, 0x14, 0xd7, 0xb5, 0xfc, 0xa3, + 0x73, 0x5d, 0x2b, 0x1c, 0xd3, 0x75, 0x6d, 0x68, 0x20, 0xd7, 0x35, 0x0c, 0xe7, 0x25, 0x8b, 0x44, + 0xff, 0xaf, 0xb8, 0x2d, 0x22, 0xf8, 0x62, 0xee, 0x05, 0x39, 0x7b, 0x78, 0x50, 0x3e, 0x8f, 0x53, + 0x31, 0x70, 0x46, 0x4d, 0xf4, 0x39, 0x98, 0x71, 0x5a, 0x2d, 0xff, 0xbe, 0x1a, 0xb5, 0xe5, 0xb0, + 0xe1, 0xb4, 0xb8, 0xc6, 0x7e, 0x84, 0x51, 0x7d, 0xe2, 0xf0, 0xa0, 0x3c, 0xb3, 0x90, 0x81, 0x83, + 0x33, 0x6b, 0x27, 0x3c, 0xdf, 0x8a, 0x7d, 0x3d, 0xdf, 0x5e, 0x87, 0x52, 0x3b, 0xf0, 0x1b, 0xab, + 0x9a, 0x37, 0xce, 0x25, 0x96, 0xa7, 0x5e, 0x16, 0x1e, 0x1d, 0x94, 0xc7, 0xd5, 0x1f, 0x76, 0xc3, + 0xc7, 0x15, 0xec, 0x1d, 0x38, 0x53, 0x27, 0x81, 0xcb, 0x32, 0x60, 0x36, 0xe3, 0x0d, 0xbd, 0x0e, + 0xa5, 0x20, 0x71, 0x84, 0x0d, 0x14, 0x58, 0x49, 0x8b, 0xf2, 0x2b, 0x8f, 0xac, 0x98, 0x90, 0xfd, + 0xc7, 0x16, 0x8c, 0x08, 0x87, 0x86, 0x53, 0xe0, 0x9c, 0x16, 0x0c, 0x05, 0x76, 0x39, 0xfd, 0x98, + 0x67, 0x9d, 0xc9, 0x54, 0x5d, 0x57, 0x13, 0xaa, 0xeb, 0x27, 0x7b, 0x11, 0xe9, 0xad, 0xb4, 0xfe, + 0x9b, 0x79, 0x98, 0x30, 0x9d, 0x39, 0x4e, 0x61, 0x08, 0xd6, 0x60, 0x24, 0x14, 0x9e, 0x43, 0xb9, + 0x6c, 0xcb, 0xe9, 0xe4, 0x24, 0xc6, 0x66, 0x51, 0xc2, 0x57, 0x48, 0x12, 0x49, 0x75, 0x49, 0xca, + 0x3f, 0x42, 0x97, 0xa4, 0x7e, 0xfe, 0x34, 0x85, 0x93, 0xf0, 0xa7, 0xb1, 0xbf, 0xc6, 0xae, 0x1a, + 0xbd, 0xfc, 0x14, 0xb8, 0x90, 0xeb, 0xe6, 0xa5, 0x64, 0xf7, 0x58, 0x59, 0xa2, 0x53, 0x19, 0xdc, + 0xc8, 0x2f, 0x58, 0x70, 0x31, 0xe5, 0xab, 0x34, 0xd6, 0xe4, 0x39, 0x28, 0x3a, 0x9d, 0xa6, 0xab, + 0xf6, 0xb2, 0xf6, 0x8c, 0xb5, 0x20, 0xca, 0xb1, 0xc2, 0x40, 0x4b, 0x30, 0x4d, 0x1e, 0xb4, 0x5d, + 0xfe, 0x8e, 0xa8, 0xdb, 0x2e, 0xe6, 0x79, 0x88, 0xd9, 0xe5, 0x24, 0x10, 0x77, 0xe3, 0x2b, 0x77, + 0xec, 0x7c, 0xa6, 0x3b, 0xf6, 0x3f, 0xb0, 0x60, 0x54, 0x74, 0xfb, 0x14, 0x46, 0xfb, 0x3b, 0xcc, + 0xd1, 0x7e, 0xbc, 0xc7, 0x68, 0x67, 0x0c, 0xf3, 0xdf, 0xce, 0xa9, 0xfe, 0xd6, 0xfc, 0x20, 0x1a, + 0x80, 0xe5, 0x79, 0x15, 0x8a, 0xed, 0xc0, 0x8f, 0xfc, 0x86, 0xdf, 0x12, 0x1c, 0xcf, 0x13, 0x71, + 0xb4, 0x00, 0x5e, 0x7e, 0xa4, 0xfd, 0xc6, 0x0a, 0x9b, 0x8d, 0x9e, 0x1f, 0x44, 0x82, 0xcb, 0x88, + 0x47, 0xcf, 0x0f, 0x22, 0xcc, 0x20, 0xa8, 0x09, 0x10, 0x39, 0xc1, 0x16, 0x89, 0x68, 0x99, 0x08, + 0x3c, 0x92, 0x7d, 0x78, 0x74, 0x22, 0xb7, 0x35, 0xe7, 0x7a, 0x51, 0x18, 0x05, 0x73, 0x55, 0x2f, + 0xba, 0x1d, 0x70, 0x01, 0x4a, 0x73, 0xff, 0x57, 0xb4, 0xb0, 0x46, 0x57, 0xfa, 0x68, 0xb2, 0x36, + 0x86, 0xcc, 0x07, 0xf1, 0x35, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x0a, 0xbb, 0x4a, 0xd8, 0x00, 0x1d, + 0xcf, 0x33, 0xff, 0xeb, 0x45, 0x35, 0xb4, 0xec, 0x35, 0xac, 0xa2, 0xfb, 0xff, 0xf7, 0x3e, 0xb9, + 0x69, 0xc3, 0xba, 0x1f, 0x4d, 0x1c, 0x24, 0x00, 0x7d, 0x67, 0x97, 0x9d, 0xc4, 0xf3, 0x7d, 0xae, + 0x80, 0x63, 0x58, 0x46, 0xb0, 0xb0, 0xd7, 0x2c, 0x3c, 0x70, 0xb5, 0x26, 0x16, 0xb9, 0x16, 0xf6, + 0x5a, 0x00, 0x70, 0x8c, 0x83, 0xe6, 0x85, 0xf8, 0x5d, 0x30, 0x92, 0xdf, 0x49, 0xf1, 0x5b, 0x7e, + 0xbe, 0x26, 0x7f, 0xbf, 0x00, 0xa3, 0x2a, 0x09, 0x5e, 0x8d, 0xe7, 0x12, 0x13, 0x61, 0x58, 0x96, + 0xe3, 0x62, 0xac, 0xe3, 0xa0, 0x75, 0x98, 0x0c, 0xb9, 0xee, 0x45, 0x45, 0xdb, 0xe3, 0x3a, 0xac, + 0x4f, 0x4a, 0xfb, 0x8a, 0xba, 0x09, 0x3e, 0x62, 0x45, 0xfc, 0xe8, 0x90, 0x8e, 0x96, 0x49, 0x12, + 0xe8, 0x0d, 0x98, 0x68, 0xe9, 0xe9, 0xe6, 0x6b, 0x42, 0xc5, 0xa5, 0xcc, 0x8f, 0x8d, 0x64, 0xf4, + 0x35, 0x9c, 0xc0, 0xa6, 0x9c, 0x92, 0x5e, 0x22, 0x22, 0x44, 0x3a, 0xde, 0x16, 0x09, 0x45, 0x0a, + 0x2f, 0xc6, 0x29, 0xdd, 0xca, 0xc0, 0xc1, 0x99, 0xb5, 0xd1, 0xab, 0x30, 0x26, 0x3f, 0x5f, 0x73, + 0x23, 0x8e, 0x8d, 0xdc, 0x35, 0x18, 0x36, 0x30, 0xd1, 0x7d, 0x38, 0x27, 0xff, 0xaf, 0x07, 0xce, + 0xe6, 0xa6, 0xdb, 0x10, 0x5e, 0xdc, 0xdc, 0xd3, 0x67, 0x41, 0xba, 0x0e, 0x2d, 0xa7, 0x21, 0x1d, + 0x1d, 0x94, 0x2f, 0x8b, 0x51, 0x4b, 0x85, 0xb3, 0x49, 0x4c, 0xa7, 0x8f, 0x56, 0xe1, 0xcc, 0x36, + 0x71, 0x5a, 0xd1, 0xf6, 0xd2, 0x36, 0x69, 0xec, 0xc8, 0x4d, 0xc4, 0x9c, 0x93, 0x35, 0xd3, 0xf0, + 0x1b, 0xdd, 0x28, 0x38, 0xad, 0x1e, 0x7a, 0x07, 0x66, 0xda, 0x9d, 0x8d, 0x96, 0x1b, 0x6e, 0xaf, + 0xf9, 0x11, 0x33, 0xe9, 0x50, 0x39, 0xe4, 0x84, 0x17, 0xb3, 0x72, 0xcc, 0xae, 0x65, 0xe0, 0xe1, + 0x4c, 0x0a, 0xe8, 0x7d, 0x38, 0x97, 0x58, 0x0c, 0xc2, 0xa7, 0x72, 0x22, 0x3b, 0xde, 0x6e, 0x3d, + 0xad, 0x82, 0xf0, 0x91, 0x4c, 0x03, 0xe1, 0xf4, 0x26, 0x3e, 0x98, 0xa1, 0xcf, 0x7b, 0xb4, 0xb2, + 0xc6, 0x94, 0xa1, 0x2f, 0xc1, 0x98, 0xbe, 0x8a, 0xc4, 0x05, 0x73, 0x25, 0x9d, 0x67, 0xd1, 0x56, + 0x1b, 0x67, 0xe9, 0xd4, 0x8a, 0xd2, 0x61, 0xd8, 0xa0, 0x68, 0x13, 0x48, 0xff, 0x3e, 0x74, 0x0b, + 0x8a, 0x8d, 0x96, 0x4b, 0xbc, 0xa8, 0x5a, 0xeb, 0x15, 0xf4, 0x63, 0x49, 0xe0, 0x88, 0x01, 0x13, + 0x01, 0x4a, 0x79, 0x19, 0x56, 0x14, 0xec, 0x5f, 0xcf, 0x41, 0xb9, 0x4f, 0xb4, 0xdb, 0x84, 0x3e, + 0xda, 0x1a, 0x48, 0x1f, 0xbd, 0x20, 0x33, 0xe2, 0xad, 0x25, 0x84, 0xf4, 0x44, 0xb6, 0xbb, 0x58, + 0x54, 0x4f, 0xe2, 0x0f, 0x6c, 0x1f, 0xac, 0xab, 0xb4, 0x0b, 0x7d, 0x2d, 0xd7, 0x8d, 0xa7, 0xac, + 0xa1, 0xc1, 0x05, 0x91, 0xcc, 0x67, 0x09, 0xfb, 0x6b, 0x39, 0x38, 0xa7, 0x86, 0xf0, 0x9b, 0x77, + 0xe0, 0xee, 0x74, 0x0f, 0xdc, 0x09, 0x3c, 0xea, 0xd8, 0xb7, 0x61, 0x98, 0x07, 0x4d, 0x19, 0x80, + 0x01, 0x7a, 0xca, 0x8c, 0xb0, 0xa5, 0xae, 0x69, 0x23, 0xca, 0xd6, 0x5f, 0xb2, 0x60, 0x72, 0x7d, + 0xa9, 0x56, 0xf7, 0x1b, 0x3b, 0x24, 0x5a, 0xe0, 0x0c, 0x2b, 0x16, 0xfc, 0x8f, 0xf5, 0x90, 0x7c, + 0x4d, 0x1a, 0xc7, 0x74, 0x19, 0x0a, 0xdb, 0x7e, 0x18, 0x25, 0x5f, 0x7c, 0x6f, 0xf8, 0x61, 0x84, + 0x19, 0xc4, 0xfe, 0x5d, 0x0b, 0x86, 0x58, 0x1e, 0xd7, 0x7e, 0xc9, 0x85, 0x07, 0xf9, 0x2e, 0xf4, + 0x32, 0x0c, 0x93, 0xcd, 0x4d, 0xd2, 0x88, 0xc4, 0xac, 0x4a, 0x77, 0xd4, 0xe1, 0x65, 0x56, 0x4a, + 0x2f, 0x7d, 0xd6, 0x18, 0xff, 0x8b, 0x05, 0x32, 0xba, 0x07, 0xa5, 0xc8, 0xdd, 0x25, 0x0b, 0xcd, + 0xa6, 0x78, 0x33, 0x7b, 0x08, 0xef, 0xdf, 0x75, 0x49, 0x00, 0xc7, 0xb4, 0xec, 0xaf, 0xe6, 0x00, + 0x62, 0xd7, 0xff, 0x7e, 0x9f, 0xb8, 0xd8, 0xf5, 0x9a, 0x72, 0x25, 0xe5, 0x35, 0x05, 0xc5, 0x04, + 0x53, 0x9e, 0x52, 0xd4, 0x30, 0xe5, 0x07, 0x1a, 0xa6, 0xc2, 0x71, 0x86, 0x69, 0x09, 0xa6, 0xe3, + 0xd0, 0x05, 0x66, 0x1c, 0x17, 0x26, 0xa4, 0xac, 0x27, 0x81, 0xb8, 0x1b, 0xdf, 0x26, 0x70, 0x59, + 0x46, 0xd4, 0x94, 0x77, 0x0d, 0x33, 0xc9, 0x3c, 0x46, 0x9e, 0xe9, 0xf8, 0xb9, 0x28, 0x97, 0xf9, + 0x5c, 0xf4, 0x13, 0x16, 0x9c, 0x4d, 0xb6, 0xc3, 0x7c, 0xdf, 0xbe, 0x62, 0xc1, 0x39, 0xf6, 0x68, + 0xc6, 0x5a, 0xed, 0x7e, 0xa2, 0x7b, 0x29, 0x3d, 0xa4, 0x43, 0xef, 0x1e, 0xc7, 0x7e, 0xcf, 0xab, + 0x69, 0xa4, 0x71, 0x7a, 0x8b, 0xf6, 0x57, 0x2c, 0xb8, 0x90, 0x99, 0x3e, 0x08, 0x5d, 0x85, 0xa2, + 0xd3, 0x76, 0xb9, 0x46, 0x4a, 0xec, 0x77, 0x26, 0x3d, 0xd6, 0xaa, 0x5c, 0x1f, 0xa5, 0xa0, 0x2a, + 0xad, 0x61, 0x2e, 0x33, 0xad, 0x61, 0xdf, 0x2c, 0x85, 0xf6, 0xf7, 0x5b, 0x20, 0xdc, 0x9d, 0x06, + 0x38, 0x64, 0xde, 0x96, 0x59, 0x61, 0x8d, 0x60, 0xe6, 0x97, 0xb3, 0xfd, 0xbf, 0x44, 0x08, 0x73, + 0x75, 0xa9, 0x1b, 0x81, 0xcb, 0x0d, 0x5a, 0x76, 0x13, 0x04, 0xb4, 0x42, 0x98, 0xce, 0xaa, 0x7f, + 0x6f, 0xae, 0x01, 0x34, 0x19, 0xae, 0x96, 0x1b, 0x52, 0x5d, 0x21, 0x15, 0x05, 0xc1, 0x1a, 0x96, + 0xfd, 0x43, 0x39, 0x18, 0x95, 0xc1, 0xb3, 0x3b, 0xde, 0x20, 0x92, 0xe5, 0xb1, 0x72, 0xe8, 0xb0, + 0x64, 0xaa, 0x94, 0x70, 0x2d, 0x16, 0xc8, 0xe3, 0x64, 0xaa, 0x12, 0x80, 0x63, 0x1c, 0xf4, 0x0c, + 0x8c, 0x84, 0x9d, 0x0d, 0x86, 0x9e, 0x70, 0xe2, 0xa9, 0xf3, 0x62, 0x2c, 0xe1, 0xe8, 0x73, 0x30, + 0xc5, 0xeb, 0x05, 0x7e, 0xdb, 0xd9, 0xe2, 0xea, 0xcf, 0x21, 0xe5, 0x55, 0x3b, 0xb5, 0x9a, 0x80, + 0x1d, 0x1d, 0x94, 0xcf, 0x26, 0xcb, 0x98, 0xe2, 0xbc, 0x8b, 0x8a, 0xfd, 0x25, 0x40, 0xdd, 0xf1, + 0xc0, 0xd1, 0x9b, 0xdc, 0x94, 0xca, 0x0d, 0x48, 0xb3, 0x97, 0x46, 0x5c, 0x77, 0x02, 0x95, 0x86, + 0xf4, 0xbc, 0x16, 0x56, 0xf5, 0xed, 0xbf, 0x9a, 0x87, 0xa9, 0xa4, 0x4b, 0x20, 0xba, 0x01, 0xc3, + 0xfc, 0xb2, 0x13, 0xe4, 0x7b, 0x3c, 0xb8, 0x6a, 0x8e, 0x84, 0x6c, 0xdb, 0x8b, 0xfb, 0x52, 0xd4, + 0x47, 0xef, 0xc0, 0x68, 0xd3, 0xbf, 0xef, 0xdd, 0x77, 0x82, 0xe6, 0x42, 0xad, 0x2a, 0xd6, 0x65, + 0x2a, 0xcf, 0x5c, 0x89, 0xd1, 0x74, 0xe7, 0x44, 0xf6, 0xb8, 0x10, 0x83, 0xb0, 0x4e, 0x0e, 0xad, + 0xb3, 0x18, 0x87, 0x9b, 0xee, 0xd6, 0xaa, 0xd3, 0xee, 0x65, 0x57, 0xbb, 0x24, 0x91, 0x34, 0xca, + 0xe3, 0x22, 0x10, 0x22, 0x07, 0xe0, 0x98, 0x10, 0xfa, 0x6e, 0x38, 0x13, 0x66, 0xa8, 0xd9, 0xb2, + 0xd2, 0x43, 0xf4, 0xd2, 0x3c, 0x2d, 0x3e, 0x46, 0xa5, 0x99, 0x34, 0x85, 0x5c, 0x5a, 0x33, 0xf6, + 0x97, 0xcf, 0x80, 0xb1, 0x1b, 0x8d, 0x1c, 0x41, 0xd6, 0x09, 0xe5, 0x08, 0xc2, 0x50, 0x24, 0xbb, + 0xed, 0x68, 0xbf, 0xe2, 0x06, 0xbd, 0x72, 0xd8, 0x2d, 0x0b, 0x9c, 0x6e, 0x9a, 0x12, 0x82, 0x15, + 0x9d, 0xf4, 0x44, 0x4e, 0xf9, 0x0f, 0x31, 0x91, 0x53, 0xe1, 0x14, 0x13, 0x39, 0xad, 0xc1, 0xc8, + 0x96, 0x1b, 0x61, 0xd2, 0xf6, 0x05, 0x9b, 0x99, 0xba, 0x0e, 0xaf, 0x73, 0x94, 0xee, 0xe4, 0x21, + 0x02, 0x80, 0x25, 0x11, 0xf4, 0xa6, 0xda, 0x81, 0xc3, 0xd9, 0x52, 0x5a, 0xf7, 0xcb, 0x60, 0xea, + 0x1e, 0x14, 0x89, 0x9b, 0x46, 0x1e, 0x36, 0x71, 0xd3, 0x8a, 0x4c, 0xb7, 0x54, 0xcc, 0x36, 0x82, + 0x67, 0xd9, 0x94, 0xfa, 0x24, 0x59, 0x32, 0x12, 0x53, 0x95, 0x4e, 0x2e, 0x31, 0xd5, 0xf7, 0x5b, + 0x70, 0xae, 0x9d, 0x96, 0xa3, 0x4d, 0x24, 0x49, 0x7a, 0x79, 0xe0, 0x24, 0x74, 0x46, 0x83, 0x4c, + 0x5c, 0x4f, 0x45, 0xc3, 0xe9, 0xcd, 0xd1, 0x81, 0x0e, 0x36, 0x9a, 0x22, 0xb3, 0xd2, 0x53, 0x19, + 0x19, 0xae, 0x7a, 0xe4, 0xb5, 0x5a, 0x4f, 0xc9, 0xa6, 0xf4, 0xf1, 0xac, 0x6c, 0x4a, 0x03, 0xe7, + 0x50, 0x7a, 0x53, 0xe5, 0xb6, 0x1a, 0xcf, 0x5e, 0x4a, 0x3c, 0x73, 0x55, 0xdf, 0x8c, 0x56, 0x6f, + 0xaa, 0x8c, 0x56, 0x3d, 0x62, 0xbd, 0xf1, 0x7c, 0x55, 0x7d, 0xf3, 0x58, 0x69, 0xb9, 0xa8, 0x26, + 0x4f, 0x26, 0x17, 0x95, 0x71, 0xd5, 0xf0, 0x74, 0x48, 0xcf, 0xf6, 0xb9, 0x6a, 0x0c, 0xba, 0xbd, + 0x2f, 0x1b, 0x9e, 0x77, 0x6b, 0xfa, 0xa1, 0xf2, 0x6e, 0xdd, 0xd5, 0xf3, 0x58, 0xa1, 0x3e, 0x89, + 0x9a, 0x28, 0xd2, 0x80, 0xd9, 0xab, 0xee, 0xea, 0x17, 0xe0, 0x99, 0x6c, 0xba, 0xea, 0x9e, 0xeb, + 0xa6, 0x9b, 0x7a, 0x05, 0x76, 0x65, 0xc5, 0x3a, 0x7b, 0x3a, 0x59, 0xb1, 0xce, 0x9d, 0x78, 0x56, + 0xac, 0xf3, 0xa7, 0x90, 0x15, 0xeb, 0xb1, 0x0f, 0x35, 0x2b, 0xd6, 0xcc, 0x23, 0xc8, 0x8a, 0xb5, + 0x16, 0x67, 0xc5, 0xba, 0x90, 0x3d, 0x25, 0x29, 0x96, 0xb9, 0x19, 0xb9, 0xb0, 0xee, 0xb2, 0xe7, + 0x79, 0x1e, 0xb3, 0x42, 0x04, 0xa3, 0x4b, 0xcf, 0xfb, 0x9b, 0x16, 0xd8, 0x82, 0x4f, 0x89, 0x02, + 0xe1, 0x98, 0x14, 0xa5, 0x1b, 0xe7, 0xc6, 0x7a, 0xbc, 0x87, 0x42, 0x36, 0x4d, 0xd5, 0x95, 0x9d, + 0x11, 0xcb, 0xfe, 0xcb, 0x39, 0xb8, 0xd4, 0x7b, 0x5d, 0xc7, 0x7a, 0xb2, 0x5a, 0xfc, 0xae, 0x93, + 0xd0, 0x93, 0x71, 0x21, 0x27, 0xc6, 0x1a, 0x38, 0xb0, 0xcf, 0x75, 0x98, 0x56, 0x26, 0xb9, 0x2d, + 0xb7, 0xb1, 0xaf, 0xe5, 0x03, 0x56, 0xae, 0x87, 0xf5, 0x24, 0x02, 0xee, 0xae, 0x83, 0x16, 0x60, + 0xd2, 0x28, 0xac, 0x56, 0x84, 0x30, 0xa3, 0x14, 0x73, 0x75, 0x13, 0x8c, 0x93, 0xf8, 0xf6, 0xcf, + 0x58, 0xf0, 0x58, 0x46, 0xc2, 0x88, 0x81, 0xe3, 0xd6, 0x6c, 0xc2, 0x64, 0xdb, 0xac, 0xda, 0x27, + 0xbc, 0x95, 0x91, 0x96, 0x42, 0xf5, 0x35, 0x01, 0xc0, 0x49, 0xa2, 0x8b, 0x57, 0x7f, 0xeb, 0xf7, + 0x2f, 0x7d, 0xec, 0xb7, 0x7f, 0xff, 0xd2, 0xc7, 0x7e, 0xe7, 0xf7, 0x2f, 0x7d, 0xec, 0xcf, 0x1f, + 0x5e, 0xb2, 0x7e, 0xeb, 0xf0, 0x92, 0xf5, 0xdb, 0x87, 0x97, 0xac, 0xdf, 0x39, 0xbc, 0x64, 0xfd, + 0xde, 0xe1, 0x25, 0xeb, 0xab, 0x7f, 0x70, 0xe9, 0x63, 0x6f, 0xe7, 0xf6, 0x5e, 0xf8, 0xff, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x20, 0x56, 0xf9, 0x8e, 0x0d, 0xe7, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index b4d75069..f76251d5 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -21,7 +21,6 @@ syntax = 'proto2'; package k8s.io.api.core.v1; -import "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; @@ -188,7 +187,7 @@ message CSIPersistentVolumeSource { // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". // +optional optional string fsType = 4; @@ -627,7 +626,7 @@ message Container { // Compute Resources required by this container. // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources + // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ // +optional optional ResourceRequirements resources = 8; @@ -750,7 +749,7 @@ message ContainerPort { // This must be a valid port number, 0 < x < 65536. optional int32 containerPort = 3; - // Protocol for port. Must be UDP or TCP. + // Protocol for port. Must be UDP, TCP, or SCTP. // Defaults to "TCP". // +optional optional string protocol = 4; @@ -969,7 +968,7 @@ message EndpointPort { optional int32 port = 2; // The IP protocol for this port. - // Must be UDP or TCP. + // Must be UDP, TCP, or SCTP. // Default is TCP. // +optional optional string protocol = 3; @@ -1725,10 +1724,14 @@ message LocalObjectReference { message LocalVolumeSource { // The full path to the volume on the node. // It can be either a directory or block device (disk, partition, ...). - // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. - // Block devices can be represented only by VolumeMode=Block, which also requires the - // BlockVolume alpha feature gate to be enabled. optional string path = 1; + + // Filesystem type to mount. + // It applies only when the Path is a block device. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified. + // +optional + optional string fsType = 2; } // Represents an NFS mount that lasts the lifetime of a pod. @@ -2293,6 +2296,17 @@ message PersistentVolumeClaimSpec { // This is an alpha feature and may change in the future. // +optional optional string volumeMode = 6; + + // This field requires the VolumeSnapshotDataSource alpha feature gate to be + // enabled and currently VolumeSnapshot is the only supported data source. + // If the provisioner can support VolumeSnapshot data source, it will create + // a new volume and data will be restored to the volume at the same time. + // If the provisioner does not support VolumeSnapshot data source, volume will + // not be created and the failure will be reported as an event. + // In the future, we plan to support more data source types and the behavior + // of the provisioner may change. + // +optional + optional TypedLocalObjectReference dataSource = 7; } // PersistentVolumeClaimStatus is the current status of a persistent volume claim. @@ -3025,7 +3039,7 @@ message PodSpec { // in the same pod, and the first process in each container will not be assigned PID 1. // HostPID and ShareProcessNamespace cannot both be set. // Optional: Default to false. - // This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature. + // This field is beta-level and may be disabled with the PodShareProcessNamespace feature. // +k8s:conversion-gen=false // +optional optional bool shareProcessNamespace = 27; @@ -3103,6 +3117,15 @@ message PodSpec { // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md // +optional repeated PodReadinessGate readinessGates = 28; + + // RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used + // to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. + // If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an + // empty definition that uses the default runtime handler. + // More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + // This is an alpha feature and may change in the future. + // +optional + optional string runtimeClassName = 29; } // PodStatus represents information about the status of a pod. Status may trail the actual @@ -3733,6 +3756,7 @@ message ScaleIOPersistentVolumeSource { optional string storagePool = 6; // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + // Default is ThinProvisioned. // +optional optional string storageMode = 7; @@ -3742,7 +3766,8 @@ message ScaleIOPersistentVolumeSource { // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". + // Default is "xfs" // +optional optional string fsType = 9; @@ -3777,6 +3802,7 @@ message ScaleIOVolumeSource { optional string storagePool = 6; // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + // Default is ThinProvisioned. // +optional optional string storageMode = 7; @@ -3786,7 +3812,8 @@ message ScaleIOVolumeSource { // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". + // Default is "xfs". // +optional optional string fsType = 9; @@ -4017,6 +4044,13 @@ message SecurityContext { // 2) has CAP_SYS_ADMIN // +optional optional bool allowPrivilegeEscalation = 7; + + // procMount denotes the type of proc mount to use for the containers. + // The default is DefaultProcMount which uses the container runtime defaults for + // readonly paths and masked paths. + // This requires the ProcMountType feature flag to be enabled. + // +optional + optional string procMount = 9; } // SerializedReference is a reference to serialized object. @@ -4136,7 +4170,7 @@ message ServicePort { // +optional optional string name = 1; - // The IP protocol for this port. Supports "TCP" and "UDP". + // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP". // Default is TCP. // +optional optional string protocol = 2; @@ -4466,6 +4500,22 @@ message TopologySelectorTerm { repeated TopologySelectorLabelRequirement matchLabelExpressions = 1; } +// TypedLocalObjectReference contains enough information to let you locate the +// typed referenced object inside the same namespace. +message TypedLocalObjectReference { + // APIGroup is the group for the resource being referenced. + // If APIGroup is not specified, the specified Kind must be in the core API group. + // For any other third-party types, APIGroup is required. + // +optional + optional string apiGroup = 1; + + // Kind is the type of resource being referenced + optional string kind = 2; + + // Name is the name of resource being referenced + optional string name = 3; +} + // Volume represents a named volume in a pod that may be accessed by any container in the pod. message Volume { // Volume's name. @@ -4509,7 +4559,7 @@ message VolumeMount { // mountPropagation determines how mounts are propagated from the host // to container and the other way around. - // When not set, MountPropagationHostToContainer is used. + // When not set, MountPropagationNone is used. // This field is beta in 1.10. // +optional optional string mountPropagation = 5; diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index b941e0ac..1ed93772 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -28,6 +28,8 @@ const ( NamespaceDefault string = "default" // NamespaceAll is the default argument to specify on a context when you want to list or filter resources across all namespaces NamespaceAll string = "" + // NamespaceNodeLease is the namespace where we place node lease objects (used for node heartbeats) + NamespaceNodeLease string = "kube-node-lease" ) // Volume represents a named volume in a pod that may be accessed by any container in the pod. @@ -456,6 +458,16 @@ type PersistentVolumeClaimSpec struct { // This is an alpha feature and may change in the future. // +optional VolumeMode *PersistentVolumeMode `json:"volumeMode,omitempty" protobuf:"bytes,6,opt,name=volumeMode,casttype=PersistentVolumeMode"` + // This field requires the VolumeSnapshotDataSource alpha feature gate to be + // enabled and currently VolumeSnapshot is the only supported data source. + // If the provisioner can support VolumeSnapshot data source, it will create + // a new volume and data will be restored to the volume at the same time. + // If the provisioner does not support VolumeSnapshot data source, volume will + // not be created and the failure will be reported as an event. + // In the future, we plan to support more data source types and the behavior + // of the provisioner may change. + // +optional + DataSource *TypedLocalObjectReference `json:"dataSource" protobuf:"bytes,7,opt,name=dataSource"` } // PersistentVolumeClaimConditionType is a valid value of PersistentVolumeClaimCondition.Type @@ -859,6 +871,8 @@ const ( ProtocolTCP Protocol = "TCP" // ProtocolUDP is the UDP protocol. ProtocolUDP Protocol = "UDP" + // ProtocolSCTP is the SCTP protocol. + ProtocolSCTP Protocol = "SCTP" ) // Represents a Persistent Disk resource in Google Compute Engine. @@ -1339,6 +1353,7 @@ type ScaleIOVolumeSource struct { // +optional StoragePool string `json:"storagePool,omitempty" protobuf:"bytes,6,opt,name=storagePool"` // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + // Default is ThinProvisioned. // +optional StorageMode string `json:"storageMode,omitempty" protobuf:"bytes,7,opt,name=storageMode"` // The name of a volume already created in the ScaleIO system @@ -1346,7 +1361,8 @@ type ScaleIOVolumeSource struct { VolumeName string `json:"volumeName,omitempty" protobuf:"bytes,8,opt,name=volumeName"` // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". + // Default is "xfs". // +optional FSType string `json:"fsType,omitempty" protobuf:"bytes,9,opt,name=fsType"` // Defaults to false (read/write). ReadOnly here will force @@ -1374,6 +1390,7 @@ type ScaleIOPersistentVolumeSource struct { // +optional StoragePool string `json:"storagePool,omitempty" protobuf:"bytes,6,opt,name=storagePool"` // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + // Default is ThinProvisioned. // +optional StorageMode string `json:"storageMode,omitempty" protobuf:"bytes,7,opt,name=storageMode"` // The name of a volume already created in the ScaleIO system @@ -1381,7 +1398,8 @@ type ScaleIOPersistentVolumeSource struct { VolumeName string `json:"volumeName,omitempty" protobuf:"bytes,8,opt,name=volumeName"` // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". + // Default is "xfs" // +optional FSType string `json:"fsType,omitempty" protobuf:"bytes,9,opt,name=fsType"` // Defaults to false (read/write). ReadOnly here will force @@ -1583,10 +1601,14 @@ type KeyToPath struct { type LocalVolumeSource struct { // The full path to the volume on the node. // It can be either a directory or block device (disk, partition, ...). - // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. - // Block devices can be represented only by VolumeMode=Block, which also requires the - // BlockVolume alpha feature gate to be enabled. Path string `json:"path" protobuf:"bytes,1,opt,name=path"` + + // Filesystem type to mount. + // It applies only when the Path is a block device. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified. + // +optional + FSType *string `json:"fsType,omitempty" protobuf:"bytes,2,opt,name=fsType"` } // Represents storage that is managed by an external CSI volume driver (Beta feature) @@ -1607,7 +1629,7 @@ type CSIPersistentVolumeSource struct { // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". // +optional FSType string `json:"fsType,omitempty" protobuf:"bytes,4,opt,name=fsType"` @@ -1656,7 +1678,7 @@ type ContainerPort struct { // Number of port to expose on the pod's IP address. // This must be a valid port number, 0 < x < 65536. ContainerPort int32 `json:"containerPort" protobuf:"varint,3,opt,name=containerPort"` - // Protocol for port. Must be UDP or TCP. + // Protocol for port. Must be UDP, TCP, or SCTP. // Defaults to "TCP". // +optional Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,4,opt,name=protocol,casttype=Protocol"` @@ -1682,7 +1704,7 @@ type VolumeMount struct { SubPath string `json:"subPath,omitempty" protobuf:"bytes,4,opt,name=subPath"` // mountPropagation determines how mounts are propagated from the host // to container and the other way around. - // When not set, MountPropagationHostToContainer is used. + // When not set, MountPropagationNone is used. // This field is beta in 1.10. // +optional MountPropagation *MountPropagationMode `json:"mountPropagation,omitempty" protobuf:"bytes,5,opt,name=mountPropagation,casttype=MountPropagationMode"` @@ -2055,7 +2077,7 @@ type Container struct { Env []EnvVar `json:"env,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,7,rep,name=env"` // Compute Resources required by this container. // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources + // More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ // +optional Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,8,opt,name=resources"` // Pod volumes to mount into the container's filesystem. @@ -2794,7 +2816,7 @@ type PodSpec struct { // in the same pod, and the first process in each container will not be assigned PID 1. // HostPID and ShareProcessNamespace cannot both be set. // Optional: Default to false. - // This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature. + // This field is beta-level and may be disabled with the PodShareProcessNamespace feature. // +k8s:conversion-gen=false // +optional ShareProcessNamespace *bool `json:"shareProcessNamespace,omitempty" protobuf:"varint,27,opt,name=shareProcessNamespace"` @@ -2861,6 +2883,14 @@ type PodSpec struct { // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md // +optional ReadinessGates []PodReadinessGate `json:"readinessGates,omitempty" protobuf:"bytes,28,opt,name=readinessGates"` + // RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used + // to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. + // If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an + // empty definition that uses the default runtime handler. + // More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + // This is an alpha feature and may change in the future. + // +optional + RuntimeClassName *string `json:"runtimeClassName,omitempty" protobuf:"bytes,29,opt,name=runtimeClassName"` } // HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the @@ -3501,7 +3531,7 @@ type ServicePort struct { // +optional Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` - // The IP protocol for this port. Supports "TCP" and "UDP". + // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP". // Default is TCP. // +optional Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,2,opt,name=protocol,casttype=Protocol"` @@ -3715,7 +3745,7 @@ type EndpointPort struct { Port int32 `json:"port" protobuf:"varint,2,opt,name=port"` // The IP protocol for this port. - // Must be UDP or TCP. + // Must be UDP, TCP, or SCTP. // Default is TCP. // +optional Protocol Protocol `json:"protocol,omitempty" protobuf:"bytes,3,opt,name=protocol,casttype=Protocol"` @@ -4462,6 +4492,20 @@ type LocalObjectReference struct { Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` } +// TypedLocalObjectReference contains enough information to let you locate the +// typed referenced object inside the same namespace. +type TypedLocalObjectReference struct { + // APIGroup is the group for the resource being referenced. + // If APIGroup is not specified, the specified Kind must be in the core API group. + // For any other third-party types, APIGroup is required. + // +optional + APIGroup *string `json:"apiGroup" protobuf:"bytes,1,opt,name=apiGroup"` + // Kind is the type of resource being referenced + Kind string `json:"kind" protobuf:"bytes,2,opt,name=kind"` + // Name is the name of resource being referenced + Name string `json:"name" protobuf:"bytes,3,opt,name=name"` +} + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // SerializedReference is a reference to serialized object. @@ -5161,8 +5205,28 @@ type SecurityContext struct { // 2) has CAP_SYS_ADMIN // +optional AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,7,opt,name=allowPrivilegeEscalation"` + // procMount denotes the type of proc mount to use for the containers. + // The default is DefaultProcMount which uses the container runtime defaults for + // readonly paths and masked paths. + // This requires the ProcMountType feature flag to be enabled. + // +optional + ProcMount *ProcMountType `json:"procMount,omitEmpty" protobuf:"bytes,9,opt,name=procMount"` } +type ProcMountType string + +const ( + // DefaultProcMount uses the container runtime defaults for readonly and masked + // paths for /proc. Most container runtimes mask certain paths in /proc to avoid + // accidental security exposure of special devices or information. + DefaultProcMount ProcMountType = "Default" + + // UnmaskedProcMount bypasses the default masking behavior of the container + // runtime and ensures the newly created /proc the container stays in tact with + // no modifications. + UnmaskedProcMount ProcMountType = "Unmasked" +) + // SELinuxOptions are the labels to be applied to the container type SELinuxOptions struct { // User is a SELinux user label that applies to the container. diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 5b4e173d..c781e545 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -121,7 +121,7 @@ var map_CSIPersistentVolumeSource = map[string]string{ "driver": "Driver is the name of the driver to use for this volume. Required.", "volumeHandle": "VolumeHandle is the unique volume name returned by the CSI volume plugin’s CreateVolume to refer to the volume on all subsequent calls. Required.", "readOnly": "Optional: The value to pass to ControllerPublishVolumeRequest. Defaults to false (read/write).", - "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\".", "volumeAttributes": "Attributes of the volume to publish.", "controllerPublishSecretRef": "ControllerPublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI ControllerPublishVolume and ControllerUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", "nodeStageSecretRef": "NodeStageSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodeStageVolume and NodeStageVolume and NodeUnstageVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secrets are passed.", @@ -319,7 +319,7 @@ var map_Container = map[string]string{ "ports": "List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.", "envFrom": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.", "env": "List of environment variables to set in the container. Cannot be updated.", - "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources", + "resources": "Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/", "volumeMounts": "Pod volumes to mount into the container's filesystem. Cannot be updated.", "volumeDevices": "volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.", "livenessProbe": "Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes", @@ -353,7 +353,7 @@ var map_ContainerPort = map[string]string{ "name": "If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.", "hostPort": "Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.", "containerPort": "Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536.", - "protocol": "Protocol for port. Must be UDP or TCP. Defaults to \"TCP\".", + "protocol": "Protocol for port. Must be UDP, TCP, or SCTP. Defaults to \"TCP\".", "hostIP": "What host IP to bind the external port to.", } @@ -488,7 +488,7 @@ var map_EndpointPort = map[string]string{ "": "EndpointPort is a tuple that describes a single port.", "name": "The name of this port (corresponds to ServicePort.Name). Must be a DNS_LABEL. Optional only if one port is defined.", "port": "The port number of the endpoint.", - "protocol": "The IP protocol for this port. Must be UDP or TCP. Default is TCP.", + "protocol": "The IP protocol for this port. Must be UDP, TCP, or SCTP. Default is TCP.", } func (EndpointPort) SwaggerDoc() map[string]string { @@ -891,8 +891,9 @@ func (LocalObjectReference) SwaggerDoc() map[string]string { } var map_LocalVolumeSource = map[string]string{ - "": "Local represents directly-attached storage with node affinity (Beta feature)", - "path": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...). Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. Block devices can be represented only by VolumeMode=Block, which also requires the BlockVolume alpha feature gate to be enabled.", + "": "Local represents directly-attached storage with node affinity (Beta feature)", + "path": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...).", + "fsType": "Filesystem type to mount. It applies only when the Path is a block device. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". The default value is to auto-select a fileystem if unspecified.", } func (LocalVolumeSource) SwaggerDoc() map[string]string { @@ -1210,6 +1211,7 @@ var map_PersistentVolumeClaimSpec = map[string]string{ "volumeName": "VolumeName is the binding reference to the PersistentVolume backing this claim.", "storageClassName": "Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1", "volumeMode": "volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.", + "dataSource": "This field requires the VolumeSnapshotDataSource alpha feature gate to be enabled and currently VolumeSnapshot is the only supported data source. If the provisioner can support VolumeSnapshot data source, it will create a new volume and data will be restored to the volume at the same time. If the provisioner does not support VolumeSnapshot data source, volume will not be created and the failure will be reported as an event. In the future, we plan to support more data source types and the behavior of the provisioner may change.", } func (PersistentVolumeClaimSpec) SwaggerDoc() map[string]string { @@ -1512,7 +1514,7 @@ var map_PodSpec = map[string]string{ "hostNetwork": "Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false.", "hostPID": "Use the host's pid namespace. Optional: Default to false.", "hostIPC": "Use the host's ipc namespace. Optional: Default to false.", - "shareProcessNamespace": "Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false. This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature.", + "shareProcessNamespace": "Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false. This field is beta-level and may be disabled with the PodShareProcessNamespace feature.", "securityContext": "SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.", "imagePullSecrets": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod", "hostname": "Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.", @@ -1525,6 +1527,7 @@ var map_PodSpec = map[string]string{ "priority": "The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.", "dnsConfig": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy.", "readinessGates": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", + "runtimeClassName": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future.", } func (PodSpec) SwaggerDoc() map[string]string { @@ -1854,9 +1857,9 @@ var map_ScaleIOPersistentVolumeSource = map[string]string{ "sslEnabled": "Flag to enable/disable SSL communication with Gateway, default false", "protectionDomain": "The name of the ScaleIO Protection Domain for the configured storage.", "storagePool": "The ScaleIO Storage Pool associated with the protection domain.", - "storageMode": "Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.", + "storageMode": "Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned.", "volumeName": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", - "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Default is \"xfs\"", "readOnly": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", } @@ -1872,9 +1875,9 @@ var map_ScaleIOVolumeSource = map[string]string{ "sslEnabled": "Flag to enable/disable SSL communication with Gateway, default false", "protectionDomain": "The name of the ScaleIO Protection Domain for the configured storage.", "storagePool": "The ScaleIO Storage Pool associated with the protection domain.", - "storageMode": "Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned.", + "storageMode": "Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned.", "volumeName": "The name of a volume already created in the ScaleIO system that is associated with this volume source.", - "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Default is \"xfs\".", "readOnly": "Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.", } @@ -1985,6 +1988,7 @@ var map_SecurityContext = map[string]string{ "runAsNonRoot": "Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", "readOnlyRootFilesystem": "Whether this container has a read-only root filesystem. Default is false.", "allowPrivilegeEscalation": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN", + "procMount": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.", } func (SecurityContext) SwaggerDoc() map[string]string { @@ -2057,7 +2061,7 @@ func (ServiceList) SwaggerDoc() map[string]string { var map_ServicePort = map[string]string{ "": "ServicePort contains information on service's port.", "name": "The name of this port within the service. This must be a DNS_LABEL. All ports within a ServiceSpec must have unique names. This maps to the 'Name' field in EndpointPort objects. Optional if only one ServicePort is defined on this service.", - "protocol": "The IP protocol for this port. Supports \"TCP\" and \"UDP\". Default is TCP.", + "protocol": "The IP protocol for this port. Supports \"TCP\", \"UDP\", and \"SCTP\". Default is TCP.", "port": "The port that will be exposed by this service.", "targetPort": "Number or name of the port to access on the pods targeted by the service. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map). This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field. More info: https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service", "nodePort": "The port on each node on which this service is exposed when type=NodePort or LoadBalancer. Usually assigned by the system. If specified, it will be allocated to the service if unused or else creation of the service will fail. Default is to auto-allocate a port if the ServiceType of this Service requires one. More info: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport", @@ -2205,6 +2209,17 @@ func (TopologySelectorTerm) SwaggerDoc() map[string]string { return map_TopologySelectorTerm } +var map_TypedLocalObjectReference = map[string]string{ + "": "TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace.", + "apiGroup": "APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required.", + "kind": "Kind is the type of resource being referenced", + "name": "Name is the name of resource being referenced", +} + +func (TypedLocalObjectReference) SwaggerDoc() map[string]string { + return map_TypedLocalObjectReference +} + var map_Volume = map[string]string{ "": "Volume represents a named volume in a pod that may be accessed by any container in the pod.", "name": "Volume's name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", @@ -2230,7 +2245,7 @@ var map_VolumeMount = map[string]string{ "readOnly": "Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.", "mountPath": "Path within the container at which the volume should be mounted. Must not contain ':'.", "subPath": "Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).", - "mountPropagation": "mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationHostToContainer is used. This field is beta in 1.10.", + "mountPropagation": "mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10.", } func (VolumeMount) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index 0501bbcb..f8f3471a 100644 --- a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1 import ( - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" types "k8s.io/apimachinery/pkg/types" ) @@ -47,30 +47,18 @@ func (in *Affinity) DeepCopyInto(out *Affinity) { *out = *in if in.NodeAffinity != nil { in, out := &in.NodeAffinity, &out.NodeAffinity - if *in == nil { - *out = nil - } else { - *out = new(NodeAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(NodeAffinity) + (*in).DeepCopyInto(*out) } if in.PodAffinity != nil { in, out := &in.PodAffinity, &out.PodAffinity - if *in == nil { - *out = nil - } else { - *out = new(PodAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(PodAffinity) + (*in).DeepCopyInto(*out) } if in.PodAntiAffinity != nil { in, out := &in.PodAntiAffinity, &out.PodAntiAffinity - if *in == nil { - *out = nil - } else { - *out = new(PodAntiAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(PodAntiAffinity) + (*in).DeepCopyInto(*out) } return } @@ -129,39 +117,23 @@ func (in *AzureDiskVolumeSource) DeepCopyInto(out *AzureDiskVolumeSource) { *out = *in if in.CachingMode != nil { in, out := &in.CachingMode, &out.CachingMode - if *in == nil { - *out = nil - } else { - *out = new(AzureDataDiskCachingMode) - **out = **in - } + *out = new(AzureDataDiskCachingMode) + **out = **in } if in.FSType != nil { in, out := &in.FSType, &out.FSType - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } if in.ReadOnly != nil { in, out := &in.ReadOnly, &out.ReadOnly - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.Kind != nil { in, out := &in.Kind, &out.Kind - if *in == nil { - *out = nil - } else { - *out = new(AzureDataDiskKind) - **out = **in - } + *out = new(AzureDataDiskKind) + **out = **in } return } @@ -181,12 +153,8 @@ func (in *AzureFilePersistentVolumeSource) DeepCopyInto(out *AzureFilePersistent *out = *in if in.SecretNamespace != nil { in, out := &in.SecretNamespace, &out.SecretNamespace - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -256,30 +224,18 @@ func (in *CSIPersistentVolumeSource) DeepCopyInto(out *CSIPersistentVolumeSource } if in.ControllerPublishSecretRef != nil { in, out := &in.ControllerPublishSecretRef, &out.ControllerPublishSecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.NodeStageSecretRef != nil { in, out := &in.NodeStageSecretRef, &out.NodeStageSecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.NodePublishSecretRef != nil { in, out := &in.NodePublishSecretRef, &out.NodePublishSecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -330,12 +286,8 @@ func (in *CephFSPersistentVolumeSource) DeepCopyInto(out *CephFSPersistentVolume } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -360,12 +312,8 @@ func (in *CephFSVolumeSource) DeepCopyInto(out *CephFSVolumeSource) { } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -385,12 +333,8 @@ func (in *CinderPersistentVolumeSource) DeepCopyInto(out *CinderPersistentVolume *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -410,12 +354,8 @@ func (in *CinderVolumeSource) DeepCopyInto(out *CinderVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -435,12 +375,8 @@ func (in *ClientIPConfig) DeepCopyInto(out *ClientIPConfig) { *out = *in if in.TimeoutSeconds != nil { in, out := &in.TimeoutSeconds, &out.TimeoutSeconds - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -551,12 +487,15 @@ func (in *ConfigMap) DeepCopyInto(out *ConfigMap) { in, out := &in.BinaryData, &out.BinaryData *out = make(map[string][]byte, len(*in)) for key, val := range *in { + var outVal []byte if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]byte, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]byte, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return @@ -586,12 +525,8 @@ func (in *ConfigMapEnvSource) DeepCopyInto(out *ConfigMapEnvSource) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -612,12 +547,8 @@ func (in *ConfigMapKeySelector) DeepCopyInto(out *ConfigMapKeySelector) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -694,12 +625,8 @@ func (in *ConfigMapProjection) DeepCopyInto(out *ConfigMapProjection) { } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -727,21 +654,13 @@ func (in *ConfigMapVolumeSource) DeepCopyInto(out *ConfigMapVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -803,39 +722,23 @@ func (in *Container) DeepCopyInto(out *Container) { } if in.LivenessProbe != nil { in, out := &in.LivenessProbe, &out.LivenessProbe - if *in == nil { - *out = nil - } else { - *out = new(Probe) - (*in).DeepCopyInto(*out) - } + *out = new(Probe) + (*in).DeepCopyInto(*out) } if in.ReadinessProbe != nil { in, out := &in.ReadinessProbe, &out.ReadinessProbe - if *in == nil { - *out = nil - } else { - *out = new(Probe) - (*in).DeepCopyInto(*out) - } + *out = new(Probe) + (*in).DeepCopyInto(*out) } if in.Lifecycle != nil { in, out := &in.Lifecycle, &out.Lifecycle - if *in == nil { - *out = nil - } else { - *out = new(Lifecycle) - (*in).DeepCopyInto(*out) - } + *out = new(Lifecycle) + (*in).DeepCopyInto(*out) } if in.SecurityContext != nil { in, out := &in.SecurityContext, &out.SecurityContext - if *in == nil { - *out = nil - } else { - *out = new(SecurityContext) - (*in).DeepCopyInto(*out) - } + *out = new(SecurityContext) + (*in).DeepCopyInto(*out) } return } @@ -892,30 +795,18 @@ func (in *ContainerState) DeepCopyInto(out *ContainerState) { *out = *in if in.Waiting != nil { in, out := &in.Waiting, &out.Waiting - if *in == nil { - *out = nil - } else { - *out = new(ContainerStateWaiting) - **out = **in - } + *out = new(ContainerStateWaiting) + **out = **in } if in.Running != nil { in, out := &in.Running, &out.Running - if *in == nil { - *out = nil - } else { - *out = new(ContainerStateRunning) - (*in).DeepCopyInto(*out) - } + *out = new(ContainerStateRunning) + (*in).DeepCopyInto(*out) } if in.Terminated != nil { in, out := &in.Terminated, &out.Terminated - if *in == nil { - *out = nil - } else { - *out = new(ContainerStateTerminated) - (*in).DeepCopyInto(*out) - } + *out = new(ContainerStateTerminated) + (*in).DeepCopyInto(*out) } return } @@ -1043,30 +934,18 @@ func (in *DownwardAPIVolumeFile) DeepCopyInto(out *DownwardAPIVolumeFile) { *out = *in if in.FieldRef != nil { in, out := &in.FieldRef, &out.FieldRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectFieldSelector) - **out = **in - } + *out = new(ObjectFieldSelector) + **out = **in } if in.ResourceFieldRef != nil { in, out := &in.ResourceFieldRef, &out.ResourceFieldRef - if *in == nil { - *out = nil - } else { - *out = new(ResourceFieldSelector) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceFieldSelector) + (*in).DeepCopyInto(*out) } if in.Mode != nil { in, out := &in.Mode, &out.Mode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -1093,12 +972,8 @@ func (in *DownwardAPIVolumeSource) DeepCopyInto(out *DownwardAPIVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -1118,12 +993,8 @@ func (in *EmptyDirVolumeSource) DeepCopyInto(out *EmptyDirVolumeSource) { *out = *in if in.SizeLimit != nil { in, out := &in.SizeLimit, &out.SizeLimit - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -1143,21 +1014,13 @@ func (in *EndpointAddress) DeepCopyInto(out *EndpointAddress) { *out = *in if in.NodeName != nil { in, out := &in.NodeName, &out.NodeName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } if in.TargetRef != nil { in, out := &in.TargetRef, &out.TargetRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } return } @@ -1294,21 +1157,13 @@ func (in *EnvFromSource) DeepCopyInto(out *EnvFromSource) { *out = *in if in.ConfigMapRef != nil { in, out := &in.ConfigMapRef, &out.ConfigMapRef - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapEnvSource) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapEnvSource) + (*in).DeepCopyInto(*out) } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretEnvSource) - (*in).DeepCopyInto(*out) - } + *out = new(SecretEnvSource) + (*in).DeepCopyInto(*out) } return } @@ -1328,12 +1183,8 @@ func (in *EnvVar) DeepCopyInto(out *EnvVar) { *out = *in if in.ValueFrom != nil { in, out := &in.ValueFrom, &out.ValueFrom - if *in == nil { - *out = nil - } else { - *out = new(EnvVarSource) - (*in).DeepCopyInto(*out) - } + *out = new(EnvVarSource) + (*in).DeepCopyInto(*out) } return } @@ -1353,39 +1204,23 @@ func (in *EnvVarSource) DeepCopyInto(out *EnvVarSource) { *out = *in if in.FieldRef != nil { in, out := &in.FieldRef, &out.FieldRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectFieldSelector) - **out = **in - } + *out = new(ObjectFieldSelector) + **out = **in } if in.ResourceFieldRef != nil { in, out := &in.ResourceFieldRef, &out.ResourceFieldRef - if *in == nil { - *out = nil - } else { - *out = new(ResourceFieldSelector) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceFieldSelector) + (*in).DeepCopyInto(*out) } if in.ConfigMapKeyRef != nil { in, out := &in.ConfigMapKeyRef, &out.ConfigMapKeyRef - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapKeySelector) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapKeySelector) + (*in).DeepCopyInto(*out) } if in.SecretKeyRef != nil { in, out := &in.SecretKeyRef, &out.SecretKeyRef - if *in == nil { - *out = nil - } else { - *out = new(SecretKeySelector) - (*in).DeepCopyInto(*out) - } + *out = new(SecretKeySelector) + (*in).DeepCopyInto(*out) } return } @@ -1412,21 +1247,13 @@ func (in *Event) DeepCopyInto(out *Event) { in.EventTime.DeepCopyInto(&out.EventTime) if in.Series != nil { in, out := &in.Series, &out.Series - if *in == nil { - *out = nil - } else { - *out = new(EventSeries) - (*in).DeepCopyInto(*out) - } + *out = new(EventSeries) + (*in).DeepCopyInto(*out) } if in.Related != nil { in, out := &in.Related, &out.Related - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } return } @@ -1546,12 +1373,8 @@ func (in *FCVolumeSource) DeepCopyInto(out *FCVolumeSource) { } if in.Lun != nil { in, out := &in.Lun, &out.Lun - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.WWIDs != nil { in, out := &in.WWIDs, &out.WWIDs @@ -1576,12 +1399,8 @@ func (in *FlexPersistentVolumeSource) DeepCopyInto(out *FlexPersistentVolumeSour *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.Options != nil { in, out := &in.Options, &out.Options @@ -1608,12 +1427,8 @@ func (in *FlexVolumeSource) DeepCopyInto(out *FlexVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } if in.Options != nil { in, out := &in.Options, &out.Options @@ -1742,30 +1557,18 @@ func (in *Handler) DeepCopyInto(out *Handler) { *out = *in if in.Exec != nil { in, out := &in.Exec, &out.Exec - if *in == nil { - *out = nil - } else { - *out = new(ExecAction) - (*in).DeepCopyInto(*out) - } + *out = new(ExecAction) + (*in).DeepCopyInto(*out) } if in.HTTPGet != nil { in, out := &in.HTTPGet, &out.HTTPGet - if *in == nil { - *out = nil - } else { - *out = new(HTTPGetAction) - (*in).DeepCopyInto(*out) - } + *out = new(HTTPGetAction) + (*in).DeepCopyInto(*out) } if in.TCPSocket != nil { in, out := &in.TCPSocket, &out.TCPSocket - if *in == nil { - *out = nil - } else { - *out = new(TCPSocketAction) - **out = **in - } + *out = new(TCPSocketAction) + **out = **in } return } @@ -1806,12 +1609,8 @@ func (in *HostPathVolumeSource) DeepCopyInto(out *HostPathVolumeSource) { *out = *in if in.Type != nil { in, out := &in.Type, &out.Type - if *in == nil { - *out = nil - } else { - *out = new(HostPathType) - **out = **in - } + *out = new(HostPathType) + **out = **in } return } @@ -1836,21 +1635,13 @@ func (in *ISCSIPersistentVolumeSource) DeepCopyInto(out *ISCSIPersistentVolumeSo } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.InitiatorName != nil { in, out := &in.InitiatorName, &out.InitiatorName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -1875,21 +1666,13 @@ func (in *ISCSIVolumeSource) DeepCopyInto(out *ISCSIVolumeSource) { } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } if in.InitiatorName != nil { in, out := &in.InitiatorName, &out.InitiatorName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -1909,12 +1692,8 @@ func (in *KeyToPath) DeepCopyInto(out *KeyToPath) { *out = *in if in.Mode != nil { in, out := &in.Mode, &out.Mode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -1934,21 +1713,13 @@ func (in *Lifecycle) DeepCopyInto(out *Lifecycle) { *out = *in if in.PostStart != nil { in, out := &in.PostStart, &out.PostStart - if *in == nil { - *out = nil - } else { - *out = new(Handler) - (*in).DeepCopyInto(*out) - } + *out = new(Handler) + (*in).DeepCopyInto(*out) } if in.PreStop != nil { in, out := &in.PreStop, &out.PreStop - if *in == nil { - *out = nil - } else { - *out = new(Handler) - (*in).DeepCopyInto(*out) - } + *out = new(Handler) + (*in).DeepCopyInto(*out) } return } @@ -2186,6 +1957,11 @@ func (in *LocalObjectReference) DeepCopy() *LocalObjectReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LocalVolumeSource) DeepCopyInto(out *LocalVolumeSource) { *out = *in + if in.FSType != nil { + in, out := &in.FSType, &out.FSType + *out = new(string) + **out = **in + } return } @@ -2362,12 +2138,8 @@ func (in *NodeAffinity) DeepCopyInto(out *NodeAffinity) { *out = *in if in.RequiredDuringSchedulingIgnoredDuringExecution != nil { in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution - if *in == nil { - *out = nil - } else { - *out = new(NodeSelector) - (*in).DeepCopyInto(*out) - } + *out = new(NodeSelector) + (*in).DeepCopyInto(*out) } if in.PreferredDuringSchedulingIgnoredDuringExecution != nil { in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution @@ -2412,12 +2184,8 @@ func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) { *out = *in if in.ConfigMap != nil { in, out := &in.ConfigMap, &out.ConfigMap - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapNodeConfigSource) - **out = **in - } + *out = new(ConfigMapNodeConfigSource) + **out = **in } return } @@ -2437,30 +2205,18 @@ func (in *NodeConfigStatus) DeepCopyInto(out *NodeConfigStatus) { *out = *in if in.Assigned != nil { in, out := &in.Assigned, &out.Assigned - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } if in.Active != nil { in, out := &in.Active, &out.Active - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } if in.LastKnownGood != nil { in, out := &in.LastKnownGood, &out.LastKnownGood - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } return } @@ -2659,12 +2415,8 @@ func (in *NodeSpec) DeepCopyInto(out *NodeSpec) { } if in.ConfigSource != nil { in, out := &in.ConfigSource, &out.ConfigSource - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } return } @@ -2729,12 +2481,8 @@ func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { } if in.Config != nil { in, out := &in.Config, &out.Config - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigStatus) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigStatus) + (*in).DeepCopyInto(*out) } return } @@ -2922,31 +2670,24 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Resources.DeepCopyInto(&out.Resources) if in.StorageClassName != nil { in, out := &in.StorageClassName, &out.StorageClassName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } if in.VolumeMode != nil { in, out := &in.VolumeMode, &out.VolumeMode - if *in == nil { - *out = nil - } else { - *out = new(PersistentVolumeMode) - **out = **in - } + *out = new(PersistentVolumeMode) + **out = **in + } + if in.DataSource != nil { + in, out := &in.DataSource, &out.DataSource + *out = new(TypedLocalObjectReference) + (*in).DeepCopyInto(*out) } return } @@ -3050,201 +2791,113 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { *out = *in if in.GCEPersistentDisk != nil { in, out := &in.GCEPersistentDisk, &out.GCEPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(GCEPersistentDiskVolumeSource) - **out = **in - } + *out = new(GCEPersistentDiskVolumeSource) + **out = **in } if in.AWSElasticBlockStore != nil { in, out := &in.AWSElasticBlockStore, &out.AWSElasticBlockStore - if *in == nil { - *out = nil - } else { - *out = new(AWSElasticBlockStoreVolumeSource) - **out = **in - } + *out = new(AWSElasticBlockStoreVolumeSource) + **out = **in } if in.HostPath != nil { in, out := &in.HostPath, &out.HostPath - if *in == nil { - *out = nil - } else { - *out = new(HostPathVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(HostPathVolumeSource) + (*in).DeepCopyInto(*out) } if in.Glusterfs != nil { in, out := &in.Glusterfs, &out.Glusterfs - if *in == nil { - *out = nil - } else { - *out = new(GlusterfsVolumeSource) - **out = **in - } + *out = new(GlusterfsVolumeSource) + **out = **in } if in.NFS != nil { in, out := &in.NFS, &out.NFS - if *in == nil { - *out = nil - } else { - *out = new(NFSVolumeSource) - **out = **in - } + *out = new(NFSVolumeSource) + **out = **in } if in.RBD != nil { in, out := &in.RBD, &out.RBD - if *in == nil { - *out = nil - } else { - *out = new(RBDPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(RBDPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.ISCSI != nil { in, out := &in.ISCSI, &out.ISCSI - if *in == nil { - *out = nil - } else { - *out = new(ISCSIPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ISCSIPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.Cinder != nil { in, out := &in.Cinder, &out.Cinder - if *in == nil { - *out = nil - } else { - *out = new(CinderPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CinderPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.CephFS != nil { in, out := &in.CephFS, &out.CephFS - if *in == nil { - *out = nil - } else { - *out = new(CephFSPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CephFSPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.FC != nil { in, out := &in.FC, &out.FC - if *in == nil { - *out = nil - } else { - *out = new(FCVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FCVolumeSource) + (*in).DeepCopyInto(*out) } if in.Flocker != nil { in, out := &in.Flocker, &out.Flocker - if *in == nil { - *out = nil - } else { - *out = new(FlockerVolumeSource) - **out = **in - } + *out = new(FlockerVolumeSource) + **out = **in } if in.FlexVolume != nil { in, out := &in.FlexVolume, &out.FlexVolume - if *in == nil { - *out = nil - } else { - *out = new(FlexPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FlexPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.AzureFile != nil { in, out := &in.AzureFile, &out.AzureFile - if *in == nil { - *out = nil - } else { - *out = new(AzureFilePersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(AzureFilePersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.VsphereVolume != nil { in, out := &in.VsphereVolume, &out.VsphereVolume - if *in == nil { - *out = nil - } else { - *out = new(VsphereVirtualDiskVolumeSource) - **out = **in - } + *out = new(VsphereVirtualDiskVolumeSource) + **out = **in } if in.Quobyte != nil { in, out := &in.Quobyte, &out.Quobyte - if *in == nil { - *out = nil - } else { - *out = new(QuobyteVolumeSource) - **out = **in - } + *out = new(QuobyteVolumeSource) + **out = **in } if in.AzureDisk != nil { in, out := &in.AzureDisk, &out.AzureDisk - if *in == nil { - *out = nil - } else { - *out = new(AzureDiskVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(AzureDiskVolumeSource) + (*in).DeepCopyInto(*out) } if in.PhotonPersistentDisk != nil { in, out := &in.PhotonPersistentDisk, &out.PhotonPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(PhotonPersistentDiskVolumeSource) - **out = **in - } + *out = new(PhotonPersistentDiskVolumeSource) + **out = **in } if in.PortworxVolume != nil { in, out := &in.PortworxVolume, &out.PortworxVolume - if *in == nil { - *out = nil - } else { - *out = new(PortworxVolumeSource) - **out = **in - } + *out = new(PortworxVolumeSource) + **out = **in } if in.ScaleIO != nil { in, out := &in.ScaleIO, &out.ScaleIO - if *in == nil { - *out = nil - } else { - *out = new(ScaleIOPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ScaleIOPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.Local != nil { in, out := &in.Local, &out.Local - if *in == nil { - *out = nil - } else { - *out = new(LocalVolumeSource) - **out = **in - } + *out = new(LocalVolumeSource) + (*in).DeepCopyInto(*out) } if in.StorageOS != nil { in, out := &in.StorageOS, &out.StorageOS - if *in == nil { - *out = nil - } else { - *out = new(StorageOSPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(StorageOSPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.CSI != nil { in, out := &in.CSI, &out.CSI - if *in == nil { - *out = nil - } else { - *out = new(CSIPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CSIPersistentVolumeSource) + (*in).DeepCopyInto(*out) } return } @@ -3277,12 +2930,8 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { } if in.ClaimRef != nil { in, out := &in.ClaimRef, &out.ClaimRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } if in.MountOptions != nil { in, out := &in.MountOptions, &out.MountOptions @@ -3291,21 +2940,13 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { } if in.VolumeMode != nil { in, out := &in.VolumeMode, &out.VolumeMode - if *in == nil { - *out = nil - } else { - *out = new(PersistentVolumeMode) - **out = **in - } + *out = new(PersistentVolumeMode) + **out = **in } if in.NodeAffinity != nil { in, out := &in.NodeAffinity, &out.NodeAffinity - if *in == nil { - *out = nil - } else { - *out = new(VolumeNodeAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(VolumeNodeAffinity) + (*in).DeepCopyInto(*out) } return } @@ -3415,12 +3056,8 @@ func (in *PodAffinityTerm) DeepCopyInto(out *PodAffinityTerm) { *out = *in if in.LabelSelector != nil { in, out := &in.LabelSelector, &out.LabelSelector - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.Namespaces != nil { in, out := &in.Namespaces, &out.Namespaces @@ -3551,12 +3188,8 @@ func (in *PodDNSConfigOption) DeepCopyInto(out *PodDNSConfigOption) { *out = *in if in.Value != nil { in, out := &in.Value, &out.Value - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -3640,38 +3273,22 @@ func (in *PodLogOptions) DeepCopyInto(out *PodLogOptions) { out.TypeMeta = in.TypeMeta if in.SinceSeconds != nil { in, out := &in.SinceSeconds, &out.SinceSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.SinceTime != nil { in, out := &in.SinceTime, &out.SinceTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.TailLines != nil { in, out := &in.TailLines, &out.TailLines - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.LimitBytes != nil { in, out := &in.LimitBytes, &out.LimitBytes - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } return } @@ -3770,39 +3387,23 @@ func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { *out = *in if in.SELinuxOptions != nil { in, out := &in.SELinuxOptions, &out.SELinuxOptions - if *in == nil { - *out = nil - } else { - *out = new(SELinuxOptions) - **out = **in - } + *out = new(SELinuxOptions) + **out = **in } if in.RunAsUser != nil { in, out := &in.RunAsUser, &out.RunAsUser - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsGroup != nil { in, out := &in.RunAsGroup, &out.RunAsGroup - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsNonRoot != nil { in, out := &in.RunAsNonRoot, &out.RunAsNonRoot - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.SupplementalGroups != nil { in, out := &in.SupplementalGroups, &out.SupplementalGroups @@ -3811,12 +3412,8 @@ func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { } if in.FSGroup != nil { in, out := &in.FSGroup, &out.FSGroup - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.Sysctls != nil { in, out := &in.Sysctls, &out.Sysctls @@ -3841,12 +3438,8 @@ func (in *PodSignature) DeepCopyInto(out *PodSignature) { *out = *in if in.PodController != nil { in, out := &in.PodController, &out.PodController - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.OwnerReference) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.OwnerReference) + (*in).DeepCopyInto(*out) } return } @@ -3887,21 +3480,13 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.TerminationGracePeriodSeconds != nil { in, out := &in.TerminationGracePeriodSeconds, &out.TerminationGracePeriodSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.ActiveDeadlineSeconds != nil { in, out := &in.ActiveDeadlineSeconds, &out.ActiveDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector @@ -3912,30 +3497,18 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.AutomountServiceAccountToken != nil { in, out := &in.AutomountServiceAccountToken, &out.AutomountServiceAccountToken - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.ShareProcessNamespace != nil { in, out := &in.ShareProcessNamespace, &out.ShareProcessNamespace - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.SecurityContext != nil { in, out := &in.SecurityContext, &out.SecurityContext - if *in == nil { - *out = nil - } else { - *out = new(PodSecurityContext) - (*in).DeepCopyInto(*out) - } + *out = new(PodSecurityContext) + (*in).DeepCopyInto(*out) } if in.ImagePullSecrets != nil { in, out := &in.ImagePullSecrets, &out.ImagePullSecrets @@ -3944,12 +3517,8 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.Affinity != nil { in, out := &in.Affinity, &out.Affinity - if *in == nil { - *out = nil - } else { - *out = new(Affinity) - (*in).DeepCopyInto(*out) - } + *out = new(Affinity) + (*in).DeepCopyInto(*out) } if in.Tolerations != nil { in, out := &in.Tolerations, &out.Tolerations @@ -3967,27 +3536,24 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.Priority != nil { in, out := &in.Priority, &out.Priority - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.DNSConfig != nil { in, out := &in.DNSConfig, &out.DNSConfig - if *in == nil { - *out = nil - } else { - *out = new(PodDNSConfig) - (*in).DeepCopyInto(*out) - } + *out = new(PodDNSConfig) + (*in).DeepCopyInto(*out) } if in.ReadinessGates != nil { in, out := &in.ReadinessGates, &out.ReadinessGates *out = make([]PodReadinessGate, len(*in)) copy(*out, *in) } + if in.RuntimeClassName != nil { + in, out := &in.RuntimeClassName, &out.RuntimeClassName + *out = new(string) + **out = **in + } return } @@ -4013,11 +3579,7 @@ func (in *PodStatus) DeepCopyInto(out *PodStatus) { } if in.StartTime != nil { in, out := &in.StartTime, &out.StartTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.InitContainerStatuses != nil { in, out := &in.InitContainerStatuses, &out.InitContainerStatuses @@ -4172,12 +3734,8 @@ func (in *Preconditions) DeepCopyInto(out *Preconditions) { *out = *in if in.UID != nil { in, out := &in.UID, &out.UID - if *in == nil { - *out = nil - } else { - *out = new(types.UID) - **out = **in - } + *out = new(types.UID) + **out = **in } return } @@ -4256,12 +3814,8 @@ func (in *ProjectedVolumeSource) DeepCopyInto(out *ProjectedVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -4302,12 +3856,8 @@ func (in *RBDPersistentVolumeSource) DeepCopyInto(out *RBDPersistentVolumeSource } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -4332,12 +3882,8 @@ func (in *RBDVolumeSource) DeepCopyInto(out *RBDVolumeSource) { } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -4466,12 +4012,8 @@ func (in *ReplicationControllerSpec) DeepCopyInto(out *ReplicationControllerSpec *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector @@ -4482,12 +4024,8 @@ func (in *ReplicationControllerSpec) DeepCopyInto(out *ReplicationControllerSpec } if in.Template != nil { in, out := &in.Template, &out.Template - if *in == nil { - *out = nil - } else { - *out = new(PodTemplateSpec) - (*in).DeepCopyInto(*out) - } + *out = new(PodTemplateSpec) + (*in).DeepCopyInto(*out) } return } @@ -4642,12 +4180,8 @@ func (in *ResourceQuotaSpec) DeepCopyInto(out *ResourceQuotaSpec) { } if in.ScopeSelector != nil { in, out := &in.ScopeSelector, &out.ScopeSelector - if *in == nil { - *out = nil - } else { - *out = new(ScopeSelector) - (*in).DeepCopyInto(*out) - } + *out = new(ScopeSelector) + (*in).DeepCopyInto(*out) } return } @@ -4743,12 +4277,8 @@ func (in *ScaleIOPersistentVolumeSource) DeepCopyInto(out *ScaleIOPersistentVolu *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -4768,12 +4298,8 @@ func (in *ScaleIOVolumeSource) DeepCopyInto(out *ScaleIOVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -4841,12 +4367,15 @@ func (in *Secret) DeepCopyInto(out *Secret) { in, out := &in.Data, &out.Data *out = make(map[string][]byte, len(*in)) for key, val := range *in { + var outVal []byte if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]byte, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]byte, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } if in.StringData != nil { @@ -4883,12 +4412,8 @@ func (in *SecretEnvSource) DeepCopyInto(out *SecretEnvSource) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -4909,12 +4434,8 @@ func (in *SecretKeySelector) DeepCopyInto(out *SecretKeySelector) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -4975,12 +4496,8 @@ func (in *SecretProjection) DeepCopyInto(out *SecretProjection) { } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -5023,21 +4540,13 @@ func (in *SecretVolumeSource) DeepCopyInto(out *SecretVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -5057,75 +4566,48 @@ func (in *SecurityContext) DeepCopyInto(out *SecurityContext) { *out = *in if in.Capabilities != nil { in, out := &in.Capabilities, &out.Capabilities - if *in == nil { - *out = nil - } else { - *out = new(Capabilities) - (*in).DeepCopyInto(*out) - } + *out = new(Capabilities) + (*in).DeepCopyInto(*out) } if in.Privileged != nil { in, out := &in.Privileged, &out.Privileged - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.SELinuxOptions != nil { in, out := &in.SELinuxOptions, &out.SELinuxOptions - if *in == nil { - *out = nil - } else { - *out = new(SELinuxOptions) - **out = **in - } + *out = new(SELinuxOptions) + **out = **in } if in.RunAsUser != nil { in, out := &in.RunAsUser, &out.RunAsUser - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsGroup != nil { in, out := &in.RunAsGroup, &out.RunAsGroup - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsNonRoot != nil { in, out := &in.RunAsNonRoot, &out.RunAsNonRoot - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.ReadOnlyRootFilesystem != nil { in, out := &in.ReadOnlyRootFilesystem, &out.ReadOnlyRootFilesystem - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.AllowPrivilegeEscalation != nil { in, out := &in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in + } + if in.ProcMount != nil { + in, out := &in.ProcMount, &out.ProcMount + *out = new(ProcMountType) + **out = **in } return } @@ -5211,12 +4693,8 @@ func (in *ServiceAccount) DeepCopyInto(out *ServiceAccount) { } if in.AutomountServiceAccountToken != nil { in, out := &in.AutomountServiceAccountToken, &out.AutomountServiceAccountToken - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -5277,12 +4755,8 @@ func (in *ServiceAccountTokenProjection) DeepCopyInto(out *ServiceAccountTokenPr *out = *in if in.ExpirationSeconds != nil { in, out := &in.ExpirationSeconds, &out.ExpirationSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } return } @@ -5399,12 +4873,8 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { } if in.SessionAffinityConfig != nil { in, out := &in.SessionAffinityConfig, &out.SessionAffinityConfig - if *in == nil { - *out = nil - } else { - *out = new(SessionAffinityConfig) - (*in).DeepCopyInto(*out) - } + *out = new(SessionAffinityConfig) + (*in).DeepCopyInto(*out) } return } @@ -5441,12 +4911,8 @@ func (in *SessionAffinityConfig) DeepCopyInto(out *SessionAffinityConfig) { *out = *in if in.ClientIP != nil { in, out := &in.ClientIP, &out.ClientIP - if *in == nil { - *out = nil - } else { - *out = new(ClientIPConfig) - (*in).DeepCopyInto(*out) - } + *out = new(ClientIPConfig) + (*in).DeepCopyInto(*out) } return } @@ -5466,12 +4932,8 @@ func (in *StorageOSPersistentVolumeSource) DeepCopyInto(out *StorageOSPersistent *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } return } @@ -5491,12 +4953,8 @@ func (in *StorageOSVolumeSource) DeepCopyInto(out *StorageOSVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -5549,11 +5007,7 @@ func (in *Taint) DeepCopyInto(out *Taint) { *out = *in if in.TimeAdded != nil { in, out := &in.TimeAdded, &out.TimeAdded - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } @@ -5573,12 +5027,8 @@ func (in *Toleration) DeepCopyInto(out *Toleration) { *out = *in if in.TolerationSeconds != nil { in, out := &in.TolerationSeconds, &out.TolerationSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } return } @@ -5637,6 +5087,27 @@ func (in *TopologySelectorTerm) DeepCopy() *TopologySelectorTerm { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TypedLocalObjectReference) DeepCopyInto(out *TypedLocalObjectReference) { + *out = *in + if in.APIGroup != nil { + in, out := &in.APIGroup, &out.APIGroup + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TypedLocalObjectReference. +func (in *TypedLocalObjectReference) DeepCopy() *TypedLocalObjectReference { + if in == nil { + return nil + } + out := new(TypedLocalObjectReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Volume) DeepCopyInto(out *Volume) { *out = *in @@ -5675,12 +5146,8 @@ func (in *VolumeMount) DeepCopyInto(out *VolumeMount) { *out = *in if in.MountPropagation != nil { in, out := &in.MountPropagation, &out.MountPropagation - if *in == nil { - *out = nil - } else { - *out = new(MountPropagationMode) - **out = **in - } + *out = new(MountPropagationMode) + **out = **in } return } @@ -5700,12 +5167,8 @@ func (in *VolumeNodeAffinity) DeepCopyInto(out *VolumeNodeAffinity) { *out = *in if in.Required != nil { in, out := &in.Required, &out.Required - if *in == nil { - *out = nil - } else { - *out = new(NodeSelector) - (*in).DeepCopyInto(*out) - } + *out = new(NodeSelector) + (*in).DeepCopyInto(*out) } return } @@ -5725,39 +5188,23 @@ func (in *VolumeProjection) DeepCopyInto(out *VolumeProjection) { *out = *in if in.Secret != nil { in, out := &in.Secret, &out.Secret - if *in == nil { - *out = nil - } else { - *out = new(SecretProjection) - (*in).DeepCopyInto(*out) - } + *out = new(SecretProjection) + (*in).DeepCopyInto(*out) } if in.DownwardAPI != nil { in, out := &in.DownwardAPI, &out.DownwardAPI - if *in == nil { - *out = nil - } else { - *out = new(DownwardAPIProjection) - (*in).DeepCopyInto(*out) - } + *out = new(DownwardAPIProjection) + (*in).DeepCopyInto(*out) } if in.ConfigMap != nil { in, out := &in.ConfigMap, &out.ConfigMap - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapProjection) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapProjection) + (*in).DeepCopyInto(*out) } if in.ServiceAccountToken != nil { in, out := &in.ServiceAccountToken, &out.ServiceAccountToken - if *in == nil { - *out = nil - } else { - *out = new(ServiceAccountTokenProjection) - (*in).DeepCopyInto(*out) - } + *out = new(ServiceAccountTokenProjection) + (*in).DeepCopyInto(*out) } return } @@ -5777,246 +5224,138 @@ func (in *VolumeSource) DeepCopyInto(out *VolumeSource) { *out = *in if in.HostPath != nil { in, out := &in.HostPath, &out.HostPath - if *in == nil { - *out = nil - } else { - *out = new(HostPathVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(HostPathVolumeSource) + (*in).DeepCopyInto(*out) } if in.EmptyDir != nil { in, out := &in.EmptyDir, &out.EmptyDir - if *in == nil { - *out = nil - } else { - *out = new(EmptyDirVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(EmptyDirVolumeSource) + (*in).DeepCopyInto(*out) } if in.GCEPersistentDisk != nil { in, out := &in.GCEPersistentDisk, &out.GCEPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(GCEPersistentDiskVolumeSource) - **out = **in - } + *out = new(GCEPersistentDiskVolumeSource) + **out = **in } if in.AWSElasticBlockStore != nil { in, out := &in.AWSElasticBlockStore, &out.AWSElasticBlockStore - if *in == nil { - *out = nil - } else { - *out = new(AWSElasticBlockStoreVolumeSource) - **out = **in - } + *out = new(AWSElasticBlockStoreVolumeSource) + **out = **in } if in.GitRepo != nil { in, out := &in.GitRepo, &out.GitRepo - if *in == nil { - *out = nil - } else { - *out = new(GitRepoVolumeSource) - **out = **in - } + *out = new(GitRepoVolumeSource) + **out = **in } if in.Secret != nil { in, out := &in.Secret, &out.Secret - if *in == nil { - *out = nil - } else { - *out = new(SecretVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(SecretVolumeSource) + (*in).DeepCopyInto(*out) } if in.NFS != nil { in, out := &in.NFS, &out.NFS - if *in == nil { - *out = nil - } else { - *out = new(NFSVolumeSource) - **out = **in - } + *out = new(NFSVolumeSource) + **out = **in } if in.ISCSI != nil { in, out := &in.ISCSI, &out.ISCSI - if *in == nil { - *out = nil - } else { - *out = new(ISCSIVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ISCSIVolumeSource) + (*in).DeepCopyInto(*out) } if in.Glusterfs != nil { in, out := &in.Glusterfs, &out.Glusterfs - if *in == nil { - *out = nil - } else { - *out = new(GlusterfsVolumeSource) - **out = **in - } + *out = new(GlusterfsVolumeSource) + **out = **in } if in.PersistentVolumeClaim != nil { in, out := &in.PersistentVolumeClaim, &out.PersistentVolumeClaim - if *in == nil { - *out = nil - } else { - *out = new(PersistentVolumeClaimVolumeSource) - **out = **in - } + *out = new(PersistentVolumeClaimVolumeSource) + **out = **in } if in.RBD != nil { in, out := &in.RBD, &out.RBD - if *in == nil { - *out = nil - } else { - *out = new(RBDVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(RBDVolumeSource) + (*in).DeepCopyInto(*out) } if in.FlexVolume != nil { in, out := &in.FlexVolume, &out.FlexVolume - if *in == nil { - *out = nil - } else { - *out = new(FlexVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FlexVolumeSource) + (*in).DeepCopyInto(*out) } if in.Cinder != nil { in, out := &in.Cinder, &out.Cinder - if *in == nil { - *out = nil - } else { - *out = new(CinderVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CinderVolumeSource) + (*in).DeepCopyInto(*out) } if in.CephFS != nil { in, out := &in.CephFS, &out.CephFS - if *in == nil { - *out = nil - } else { - *out = new(CephFSVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CephFSVolumeSource) + (*in).DeepCopyInto(*out) } if in.Flocker != nil { in, out := &in.Flocker, &out.Flocker - if *in == nil { - *out = nil - } else { - *out = new(FlockerVolumeSource) - **out = **in - } + *out = new(FlockerVolumeSource) + **out = **in } if in.DownwardAPI != nil { in, out := &in.DownwardAPI, &out.DownwardAPI - if *in == nil { - *out = nil - } else { - *out = new(DownwardAPIVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(DownwardAPIVolumeSource) + (*in).DeepCopyInto(*out) } if in.FC != nil { in, out := &in.FC, &out.FC - if *in == nil { - *out = nil - } else { - *out = new(FCVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FCVolumeSource) + (*in).DeepCopyInto(*out) } if in.AzureFile != nil { in, out := &in.AzureFile, &out.AzureFile - if *in == nil { - *out = nil - } else { - *out = new(AzureFileVolumeSource) - **out = **in - } + *out = new(AzureFileVolumeSource) + **out = **in } if in.ConfigMap != nil { in, out := &in.ConfigMap, &out.ConfigMap - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapVolumeSource) + (*in).DeepCopyInto(*out) } if in.VsphereVolume != nil { in, out := &in.VsphereVolume, &out.VsphereVolume - if *in == nil { - *out = nil - } else { - *out = new(VsphereVirtualDiskVolumeSource) - **out = **in - } + *out = new(VsphereVirtualDiskVolumeSource) + **out = **in } if in.Quobyte != nil { in, out := &in.Quobyte, &out.Quobyte - if *in == nil { - *out = nil - } else { - *out = new(QuobyteVolumeSource) - **out = **in - } + *out = new(QuobyteVolumeSource) + **out = **in } if in.AzureDisk != nil { in, out := &in.AzureDisk, &out.AzureDisk - if *in == nil { - *out = nil - } else { - *out = new(AzureDiskVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(AzureDiskVolumeSource) + (*in).DeepCopyInto(*out) } if in.PhotonPersistentDisk != nil { in, out := &in.PhotonPersistentDisk, &out.PhotonPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(PhotonPersistentDiskVolumeSource) - **out = **in - } + *out = new(PhotonPersistentDiskVolumeSource) + **out = **in } if in.Projected != nil { in, out := &in.Projected, &out.Projected - if *in == nil { - *out = nil - } else { - *out = new(ProjectedVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ProjectedVolumeSource) + (*in).DeepCopyInto(*out) } if in.PortworxVolume != nil { in, out := &in.PortworxVolume, &out.PortworxVolume - if *in == nil { - *out = nil - } else { - *out = new(PortworxVolumeSource) - **out = **in - } + *out = new(PortworxVolumeSource) + **out = **in } if in.ScaleIO != nil { in, out := &in.ScaleIO, &out.ScaleIO - if *in == nil { - *out = nil - } else { - *out = new(ScaleIOVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ScaleIOVolumeSource) + (*in).DeepCopyInto(*out) } if in.StorageOS != nil { in, out := &in.StorageOS, &out.StorageOS - if *in == nil { - *out = nil - } else { - *out = new(StorageOSVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(StorageOSVolumeSource) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/api/events/v1beta1/BUILD b/vendor/k8s.io/api/events/v1beta1/BUILD index 851874e7..dd6e9170 100644 --- a/vendor/k8s.io/api/events/v1beta1/BUILD +++ b/vendor/k8s.io/api/events/v1beta1/BUILD @@ -1,11 +1,5 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - go_library( name = "go_default_library", srcs = [ @@ -16,14 +10,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/events/v1beta1", importpath = "k8s.io/api/events/v1beta1", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/api/events/v1beta1/generated.pb.go b/vendor/k8s.io/api/events/v1beta1/generated.pb.go index b0e313c4..e24a82ab 100644 --- a/vendor/k8s.io/api/events/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/events/v1beta1/generated.pb.go @@ -1251,56 +1251,56 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 814 bytes of a gzipped FileDescriptorProto + // 801 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0xcd, 0x6e, 0xdb, 0x46, - 0x10, 0x16, 0x13, 0x4b, 0xb6, 0x56, 0x49, 0x2c, 0x6f, 0x0e, 0xde, 0xb8, 0x00, 0xa5, 0x3a, 0x40, - 0x60, 0x14, 0x08, 0x59, 0xa7, 0x45, 0xdb, 0x6b, 0x18, 0xbb, 0x45, 0x02, 0xbb, 0x01, 0xd6, 0x3e, - 0x15, 0x3d, 0x64, 0x45, 0x4d, 0xe8, 0xad, 0xa5, 0x5d, 0x62, 0x77, 0x29, 0xc0, 0xb7, 0x5e, 0x0a, - 0xf4, 0xd8, 0x67, 0xe8, 0x13, 0xf4, 0x31, 0x7c, 0xcc, 0x31, 0x27, 0xa1, 0x66, 0xdf, 0xa2, 0xa7, - 0x82, 0xcb, 0x95, 0x28, 0x8b, 0x16, 0xec, 0x22, 0x37, 0x72, 0xe6, 0xfb, 0x99, 0x19, 0x0e, 0x07, - 0x45, 0xe7, 0xdf, 0xe9, 0x80, 0xcb, 0xf0, 0x3c, 0x1b, 0x80, 0x12, 0x60, 0x40, 0x87, 0x13, 0x10, - 0x43, 0xa9, 0x42, 0x97, 0x60, 0x29, 0x0f, 0x61, 0x02, 0xc2, 0xe8, 0x70, 0xb2, 0x3f, 0x00, 0xc3, - 0xf6, 0xc3, 0x04, 0x04, 0x28, 0x66, 0x60, 0x18, 0xa4, 0x4a, 0x1a, 0x89, 0x9f, 0x94, 0xd0, 0x80, - 0xa5, 0x3c, 0x28, 0xa1, 0x81, 0x83, 0xee, 0x3c, 0x4f, 0xb8, 0x39, 0xcb, 0x06, 0x41, 0x2c, 0xc7, - 0x61, 0x22, 0x13, 0x19, 0x5a, 0xc6, 0x20, 0x7b, 0x6f, 0xdf, 0xec, 0x8b, 0x7d, 0x2a, 0x95, 0x76, - 0x76, 0x17, 0x4c, 0x63, 0xa9, 0x20, 0x9c, 0xd4, 0xdc, 0x76, 0xbe, 0xae, 0x30, 0x63, 0x16, 0x9f, - 0x71, 0x01, 0xea, 0x22, 0x4c, 0xcf, 0x93, 0x22, 0xa0, 0xc3, 0x31, 0x18, 0x76, 0x13, 0x2b, 0x5c, - 0xc5, 0x52, 0x99, 0x30, 0x7c, 0x0c, 0x35, 0xc2, 0x37, 0xb7, 0x11, 0x74, 0x7c, 0x06, 0x63, 0x56, - 0xe3, 0x7d, 0xb5, 0x8a, 0x97, 0x19, 0x3e, 0x0a, 0xb9, 0x30, 0xda, 0xa8, 0x65, 0xd2, 0xee, 0x9f, - 0x6d, 0xd4, 0x3c, 0x2c, 0x26, 0x87, 0xdf, 0xa1, 0x8d, 0xa2, 0x85, 0x21, 0x33, 0x8c, 0x78, 0x7d, - 0x6f, 0xaf, 0xf3, 0xe2, 0xcb, 0xa0, 0x1a, 0xef, 0x5c, 0x31, 0x48, 0xcf, 0x93, 0x22, 0xa0, 0x83, - 0x02, 0x1d, 0x4c, 0xf6, 0x83, 0xb7, 0x83, 0x5f, 0x20, 0x36, 0xc7, 0x60, 0x58, 0x84, 0x2f, 0xa7, - 0xbd, 0x46, 0x3e, 0xed, 0xa1, 0x2a, 0x46, 0xe7, 0xaa, 0xf8, 0x1d, 0x6a, 0xdb, 0x8f, 0x74, 0xca, - 0xc7, 0x40, 0xee, 0x59, 0x8b, 0xf0, 0x6e, 0x16, 0xc7, 0x3c, 0x56, 0xb2, 0xa0, 0x45, 0x5b, 0xce, - 0xa1, 0x7d, 0x38, 0x53, 0xa2, 0x95, 0x28, 0x7e, 0x83, 0x5a, 0x1a, 0x14, 0x07, 0x4d, 0xee, 0x5b, - 0xf9, 0x67, 0xc1, 0xca, 0x05, 0x09, 0xac, 0xc0, 0x89, 0x45, 0x47, 0x28, 0x9f, 0xf6, 0x5a, 0xe5, - 0x33, 0x75, 0x0a, 0xf8, 0x18, 0x3d, 0x56, 0x90, 0x4a, 0x65, 0xb8, 0x48, 0x5e, 0x49, 0x61, 0x94, - 0x1c, 0x8d, 0x40, 0x91, 0xb5, 0xbe, 0xb7, 0xd7, 0x8e, 0x3e, 0x73, 0x65, 0x3c, 0xa6, 0x75, 0x08, - 0xbd, 0x89, 0x87, 0x7f, 0x40, 0x5b, 0xf3, 0xf0, 0x6b, 0xa1, 0x0d, 0x13, 0x31, 0x90, 0xa6, 0x15, - 0x7b, 0xe2, 0xc4, 0xb6, 0xe8, 0x32, 0x80, 0xd6, 0x39, 0xf8, 0x19, 0x6a, 0xb1, 0xd8, 0x70, 0x29, - 0x48, 0xcb, 0xb2, 0x1f, 0x39, 0x76, 0xeb, 0xa5, 0x8d, 0x52, 0x97, 0x2d, 0x70, 0x0a, 0x98, 0x96, - 0x82, 0xac, 0x5f, 0xc7, 0x51, 0x1b, 0xa5, 0x2e, 0x8b, 0x4f, 0x51, 0x5b, 0x41, 0xc2, 0xd4, 0x90, - 0x8b, 0x84, 0x6c, 0xd8, 0xb1, 0x3d, 0x5d, 0x1c, 0x5b, 0xf1, 0x37, 0x54, 0x9f, 0x99, 0xc2, 0x7b, - 0x50, 0x20, 0xe2, 0x85, 0x2f, 0x41, 0x67, 0x6c, 0x5a, 0x09, 0xe1, 0x37, 0x68, 0x5d, 0xc1, 0xa8, - 0x58, 0x34, 0xd2, 0xbe, 0xbb, 0x66, 0x27, 0x9f, 0xf6, 0xd6, 0x69, 0xc9, 0xa3, 0x33, 0x01, 0xdc, - 0x47, 0x6b, 0x42, 0x1a, 0x20, 0xc8, 0xf6, 0xf1, 0xc0, 0xf9, 0xae, 0xfd, 0x28, 0x0d, 0x50, 0x9b, - 0x29, 0x10, 0xe6, 0x22, 0x05, 0xd2, 0xb9, 0x8e, 0x38, 0xbd, 0x48, 0x81, 0xda, 0x0c, 0x06, 0xd4, - 0x1d, 0x42, 0xaa, 0x20, 0x2e, 0x14, 0x4f, 0x64, 0xa6, 0x62, 0x20, 0x0f, 0x6c, 0x61, 0xbd, 0x9b, - 0x0a, 0x2b, 0x97, 0xc3, 0xc2, 0x22, 0xe2, 0xe4, 0xba, 0x07, 0x4b, 0x02, 0xb4, 0x26, 0x89, 0x7f, - 0xf7, 0x10, 0xa9, 0x82, 0xdf, 0x73, 0xa5, 0xed, 0x62, 0x6a, 0xc3, 0xc6, 0x29, 0x79, 0x68, 0xfd, - 0xbe, 0xb8, 0xdb, 0xca, 0xdb, 0x6d, 0xef, 0x3b, 0x6b, 0x72, 0xb0, 0x42, 0x93, 0xae, 0x74, 0xc3, - 0xbf, 0x79, 0x68, 0xbb, 0x4a, 0x1e, 0xb1, 0xc5, 0x4a, 0x1e, 0xfd, 0xef, 0x4a, 0x7a, 0xae, 0x92, - 0xed, 0x83, 0x9b, 0x25, 0xe9, 0x2a, 0x2f, 0xfc, 0x12, 0x6d, 0x56, 0xa9, 0x57, 0x32, 0x13, 0x86, - 0x6c, 0xf6, 0xbd, 0xbd, 0x66, 0xb4, 0xed, 0x24, 0x37, 0x0f, 0xae, 0xa7, 0xe9, 0x32, 0x7e, 0xf7, - 0x2f, 0x0f, 0x95, 0xff, 0xfb, 0x11, 0xd7, 0x06, 0xff, 0x5c, 0x3b, 0x54, 0xc1, 0xdd, 0x1a, 0x29, - 0xd8, 0xf6, 0x4c, 0x75, 0x9d, 0xf3, 0xc6, 0x2c, 0xb2, 0x70, 0xa4, 0x0e, 0x51, 0x93, 0x1b, 0x18, - 0x6b, 0x72, 0xaf, 0x7f, 0x7f, 0xaf, 0xf3, 0xa2, 0x7f, 0xdb, 0x05, 0x89, 0x1e, 0x3a, 0xb1, 0xe6, - 0xeb, 0x82, 0x46, 0x4b, 0xf6, 0x6e, 0xee, 0xa1, 0xce, 0xc2, 0x85, 0xc1, 0x4f, 0x51, 0x33, 0xb6, - 0xbd, 0x7b, 0xb6, 0xf7, 0x39, 0xa9, 0xec, 0xb8, 0xcc, 0xe1, 0x0c, 0x75, 0x47, 0x4c, 0x9b, 0xb7, - 0x03, 0x0d, 0x6a, 0x02, 0xc3, 0x4f, 0xb9, 0x93, 0xf3, 0xa5, 0x3d, 0x5a, 0x12, 0xa4, 0x35, 0x0b, - 0xfc, 0x2d, 0x6a, 0x6a, 0xc3, 0x0c, 0xd8, 0xa3, 0xd9, 0x8e, 0x3e, 0x9f, 0xd5, 0x76, 0x52, 0x04, - 0xff, 0x9d, 0xf6, 0xba, 0x0b, 0x8d, 0xd8, 0x18, 0x2d, 0xf1, 0xd1, 0xf3, 0xcb, 0x2b, 0xbf, 0xf1, - 0xe1, 0xca, 0x6f, 0x7c, 0xbc, 0xf2, 0x1b, 0xbf, 0xe6, 0xbe, 0x77, 0x99, 0xfb, 0xde, 0x87, 0xdc, - 0xf7, 0x3e, 0xe6, 0xbe, 0xf7, 0x77, 0xee, 0x7b, 0x7f, 0xfc, 0xe3, 0x37, 0x7e, 0x5a, 0x77, 0xf3, - 0xfa, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x69, 0xa9, 0x7b, 0x6e, 0xf2, 0x07, 0x00, 0x00, + 0x10, 0x16, 0x13, 0x4b, 0xb2, 0x56, 0x49, 0x2c, 0x6f, 0x0e, 0xde, 0xb8, 0x00, 0xa5, 0x2a, 0x40, + 0x20, 0x14, 0x08, 0x59, 0x07, 0x45, 0xdb, 0x6b, 0x18, 0xb9, 0x45, 0x02, 0xbb, 0x01, 0xd6, 0x3e, + 0x15, 0x3d, 0x64, 0x45, 0x4d, 0x68, 0x56, 0xe2, 0x2e, 0xb1, 0xbb, 0x12, 0xe0, 0x5b, 0x2f, 0x05, + 0x7a, 0xec, 0x33, 0xf4, 0x09, 0xfa, 0x18, 0x3e, 0xe6, 0x98, 0x93, 0x50, 0xb3, 0x6f, 0xd1, 0x53, + 0xc1, 0xe5, 0x4a, 0x94, 0xf5, 0x83, 0xa8, 0xe8, 0x4d, 0x9c, 0xf9, 0x7e, 0x66, 0x66, 0x47, 0x83, + 0x82, 0xd1, 0xb7, 0xca, 0x8b, 0x85, 0x3f, 0x9a, 0x0c, 0x40, 0x72, 0xd0, 0xa0, 0xfc, 0x29, 0xf0, + 0xa1, 0x90, 0xbe, 0x4d, 0xb0, 0x34, 0xf6, 0x61, 0x0a, 0x5c, 0x2b, 0x7f, 0x7a, 0x32, 0x00, 0xcd, + 0x4e, 0xfc, 0x08, 0x38, 0x48, 0xa6, 0x61, 0xe8, 0xa5, 0x52, 0x68, 0x81, 0x9f, 0x14, 0x50, 0x8f, + 0xa5, 0xb1, 0x57, 0x40, 0x3d, 0x0b, 0x3d, 0x7e, 0x1e, 0xc5, 0xfa, 0x6a, 0x32, 0xf0, 0x42, 0x91, + 0xf8, 0x91, 0x88, 0x84, 0x6f, 0x18, 0x83, 0xc9, 0x7b, 0xf3, 0x65, 0x3e, 0xcc, 0xaf, 0x42, 0xe9, + 0xb8, 0xbb, 0x64, 0x1a, 0x0a, 0x09, 0xfe, 0x74, 0xcd, 0xed, 0xf8, 0xab, 0x12, 0x93, 0xb0, 0xf0, + 0x2a, 0xe6, 0x20, 0xaf, 0xfd, 0x74, 0x14, 0xe5, 0x01, 0xe5, 0x27, 0xa0, 0xd9, 0x26, 0x96, 0xbf, + 0x8d, 0x25, 0x27, 0x5c, 0xc7, 0x09, 0xac, 0x11, 0xbe, 0xfe, 0x14, 0x41, 0x85, 0x57, 0x90, 0xb0, + 0x55, 0x5e, 0xf7, 0x8f, 0x06, 0xaa, 0x9e, 0xe6, 0x43, 0xc0, 0xef, 0xd0, 0x7e, 0x5e, 0xcd, 0x90, + 0x69, 0x46, 0x9c, 0x8e, 0xd3, 0x6b, 0xbe, 0xf8, 0xd2, 0x2b, 0x27, 0xb5, 0x10, 0xf5, 0xd2, 0x51, + 0x94, 0x07, 0x94, 0x97, 0xa3, 0xbd, 0xe9, 0x89, 0xf7, 0x76, 0xf0, 0x33, 0x84, 0xfa, 0x1c, 0x34, + 0x0b, 0xf0, 0xcd, 0xac, 0x5d, 0xc9, 0x66, 0x6d, 0x54, 0xc6, 0xe8, 0x42, 0x15, 0xbf, 0x43, 0x0d, + 0x33, 0xef, 0xcb, 0x38, 0x01, 0x72, 0xcf, 0x58, 0xf8, 0xbb, 0x59, 0x9c, 0xc7, 0xa1, 0x14, 0x39, + 0x2d, 0x38, 0xb4, 0x0e, 0x8d, 0xd3, 0xb9, 0x12, 0x2d, 0x45, 0xf1, 0x1b, 0x54, 0x53, 0x20, 0x63, + 0x50, 0xe4, 0xbe, 0x91, 0x7f, 0xe6, 0x6d, 0x7d, 0x6b, 0xcf, 0x08, 0x5c, 0x18, 0x74, 0x80, 0xb2, + 0x59, 0xbb, 0x56, 0xfc, 0xa6, 0x56, 0x01, 0x9f, 0xa3, 0xc7, 0x12, 0x52, 0x21, 0x75, 0xcc, 0xa3, + 0x57, 0x82, 0x6b, 0x29, 0xc6, 0x63, 0x90, 0x64, 0xaf, 0xe3, 0xf4, 0x1a, 0xc1, 0x67, 0xb6, 0x8c, + 0xc7, 0x74, 0x1d, 0x42, 0x37, 0xf1, 0xf0, 0xf7, 0xe8, 0x70, 0x11, 0x7e, 0xcd, 0x95, 0x66, 0x3c, + 0x04, 0x52, 0x35, 0x62, 0x4f, 0xac, 0xd8, 0x21, 0x5d, 0x05, 0xd0, 0x75, 0x0e, 0x7e, 0x86, 0x6a, + 0x2c, 0xd4, 0xb1, 0xe0, 0xa4, 0x66, 0xd8, 0x8f, 0x2c, 0xbb, 0xf6, 0xd2, 0x44, 0xa9, 0xcd, 0xe6, + 0x38, 0x09, 0x4c, 0x09, 0x4e, 0xea, 0x77, 0x71, 0xd4, 0x44, 0xa9, 0xcd, 0xe2, 0x4b, 0xd4, 0x90, + 0x10, 0x31, 0x39, 0x8c, 0x79, 0x44, 0xf6, 0xcd, 0xd8, 0x9e, 0x2e, 0x8f, 0x2d, 0x5f, 0xec, 0xf2, + 0x99, 0x29, 0xbc, 0x07, 0x09, 0x3c, 0x5c, 0x7a, 0x09, 0x3a, 0x67, 0xd3, 0x52, 0x08, 0xbf, 0x41, + 0x75, 0x09, 0xe3, 0x7c, 0xd1, 0x48, 0x63, 0x77, 0xcd, 0x66, 0x36, 0x6b, 0xd7, 0x69, 0xc1, 0xa3, + 0x73, 0x01, 0xdc, 0x41, 0x7b, 0x5c, 0x68, 0x20, 0xc8, 0xf4, 0xf1, 0xc0, 0xfa, 0xee, 0xfd, 0x20, + 0x34, 0x50, 0x93, 0xc9, 0x11, 0xfa, 0x3a, 0x05, 0xd2, 0xbc, 0x8b, 0xb8, 0xbc, 0x4e, 0x81, 0x9a, + 0x0c, 0x06, 0xd4, 0x1a, 0x42, 0x2a, 0x21, 0xcc, 0x15, 0x2f, 0xc4, 0x44, 0x86, 0x40, 0x1e, 0x98, + 0xc2, 0xda, 0x9b, 0x0a, 0x2b, 0x96, 0xc3, 0xc0, 0x02, 0x62, 0xe5, 0x5a, 0xfd, 0x15, 0x01, 0xba, + 0x26, 0x89, 0x7f, 0x73, 0x10, 0x29, 0x83, 0xdf, 0xc5, 0x52, 0x99, 0xc5, 0x54, 0x9a, 0x25, 0x29, + 0x79, 0x68, 0xfc, 0xbe, 0xd8, 0x6d, 0xe5, 0xcd, 0xb6, 0x77, 0xac, 0x35, 0xe9, 0x6f, 0xd1, 0xa4, + 0x5b, 0xdd, 0xf0, 0xaf, 0x0e, 0x3a, 0x2a, 0x93, 0x67, 0x6c, 0xb9, 0x92, 0x47, 0xff, 0xb9, 0x92, + 0xb6, 0xad, 0xe4, 0xa8, 0xbf, 0x59, 0x92, 0x6e, 0xf3, 0xc2, 0x2f, 0xd1, 0x41, 0x99, 0x7a, 0x25, + 0x26, 0x5c, 0x93, 0x83, 0x8e, 0xd3, 0xab, 0x06, 0x47, 0x56, 0xf2, 0xa0, 0x7f, 0x37, 0x4d, 0x57, + 0xf1, 0xdd, 0x3f, 0x1d, 0x54, 0xfc, 0xdf, 0xcf, 0x62, 0xa5, 0xf1, 0x4f, 0x6b, 0x87, 0xca, 0xdb, + 0xad, 0x91, 0x9c, 0x6d, 0xce, 0x54, 0xcb, 0x3a, 0xef, 0xcf, 0x23, 0x4b, 0x47, 0xea, 0x14, 0x55, + 0x63, 0x0d, 0x89, 0x22, 0xf7, 0x3a, 0xf7, 0x7b, 0xcd, 0x17, 0x9d, 0x4f, 0x5d, 0x90, 0xe0, 0xa1, + 0x15, 0xab, 0xbe, 0xce, 0x69, 0xb4, 0x60, 0x77, 0x33, 0x07, 0x35, 0x97, 0x2e, 0x0c, 0x7e, 0x8a, + 0xaa, 0xa1, 0xe9, 0xdd, 0x31, 0xbd, 0x2f, 0x48, 0x45, 0xc7, 0x45, 0x0e, 0x4f, 0x50, 0x6b, 0xcc, + 0x94, 0x7e, 0x3b, 0x50, 0x20, 0xa7, 0x30, 0xfc, 0x3f, 0x77, 0x72, 0xb1, 0xb4, 0x67, 0x2b, 0x82, + 0x74, 0xcd, 0x02, 0x7f, 0x83, 0xaa, 0x4a, 0x33, 0x0d, 0xe6, 0x68, 0x36, 0x82, 0xcf, 0xe7, 0xb5, + 0x5d, 0xe4, 0xc1, 0x7f, 0x66, 0xed, 0xd6, 0x52, 0x23, 0x26, 0x46, 0x0b, 0x7c, 0xf0, 0xfc, 0xe6, + 0xd6, 0xad, 0x7c, 0xb8, 0x75, 0x2b, 0x1f, 0x6f, 0xdd, 0xca, 0x2f, 0x99, 0xeb, 0xdc, 0x64, 0xae, + 0xf3, 0x21, 0x73, 0x9d, 0x8f, 0x99, 0xeb, 0xfc, 0x95, 0xb9, 0xce, 0xef, 0x7f, 0xbb, 0x95, 0x1f, + 0xeb, 0x76, 0x5e, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x25, 0x9b, 0x14, 0x4d, 0xbd, 0x07, 0x00, + 0x00, } diff --git a/vendor/k8s.io/api/events/v1beta1/generated.proto b/vendor/k8s.io/api/events/v1beta1/generated.proto index 60ee899b..b3e565e6 100644 --- a/vendor/k8s.io/api/events/v1beta1/generated.proto +++ b/vendor/k8s.io/api/events/v1beta1/generated.proto @@ -25,7 +25,6 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; diff --git a/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go index 9652044b..e52e142c 100644 --- a/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go @@ -33,22 +33,14 @@ func (in *Event) DeepCopyInto(out *Event) { in.EventTime.DeepCopyInto(&out.EventTime) if in.Series != nil { in, out := &in.Series, &out.Series - if *in == nil { - *out = nil - } else { - *out = new(EventSeries) - (*in).DeepCopyInto(*out) - } + *out = new(EventSeries) + (*in).DeepCopyInto(*out) } out.Regarding = in.Regarding if in.Related != nil { in, out := &in.Related, &out.Related - if *in == nil { - *out = nil - } else { - *out = new(v1.ObjectReference) - **out = **in - } + *out = new(v1.ObjectReference) + **out = **in } out.DeprecatedSource = in.DeprecatedSource in.DeprecatedFirstTimestamp.DeepCopyInto(&out.DeprecatedFirstTimestamp) diff --git a/vendor/k8s.io/api/extensions/v1beta1/BUILD b/vendor/k8s.io/api/extensions/v1beta1/BUILD index 360ad999..57da4b77 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/BUILD +++ b/vendor/k8s.io/api/extensions/v1beta1/BUILD @@ -15,17 +15,18 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/extensions/v1beta1", importpath = "k8s.io/api/extensions/v1beta1", deps = [ + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -41,9 +42,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go b/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go index 0604fb95..72d64db3 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -2291,6 +2291,23 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + dAtA[i] = 0xaa + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -3512,6 +3529,12 @@ func (m *PodSecurityPolicySpec) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -4247,6 +4270,7 @@ func (this *PodSecurityPolicySpec) String() string { `AllowedFlexVolumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedFlexVolumes), "AllowedFlexVolume", "AllowedFlexVolume", 1), `&`, ``, 1) + `,`, `AllowedUnsafeSysctls:` + fmt.Sprintf("%v", this.AllowedUnsafeSysctls) + `,`, `ForbiddenSysctls:` + fmt.Sprintf("%v", this.ForbiddenSysctls) + `,`, + `AllowedProcMountTypes:` + fmt.Sprintf("%v", this.AllowedProcMountTypes) + `,`, `}`, }, "") return s @@ -10442,6 +10466,35 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { } m.ForbiddenSysctls = append(m.ForbiddenSysctls, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedProcMountTypes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedProcMountTypes = append(m.AllowedProcMountTypes, k8s_io_api_core_v1.ProcMountType(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -12421,233 +12474,235 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3637 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x6f, 0x1c, 0x47, - 0x73, 0xd7, 0xec, 0x2e, 0xb9, 0xcb, 0xa2, 0xf8, 0x6a, 0xd2, 0xe4, 0x7e, 0x94, 0xc5, 0xd5, 0x37, - 0x06, 0x14, 0xc9, 0x91, 0x76, 0x2d, 0xd9, 0xd2, 0xa7, 0x58, 0x88, 0x6d, 0x2e, 0x29, 0x4a, 0x74, - 0xf8, 0x52, 0x2f, 0xa9, 0x38, 0x46, 0xe4, 0x78, 0xb8, 0xdb, 0x5c, 0x8e, 0x38, 0x3b, 0x33, 0x9e, - 0xe9, 0xa1, 0xb9, 0x40, 0x10, 0xe4, 0x10, 0x04, 0x08, 0x90, 0x20, 0xc9, 0xc1, 0x79, 0xdc, 0xe2, - 0x4b, 0x4e, 0x09, 0x92, 0x5b, 0x72, 0x30, 0x0c, 0x04, 0x70, 0x00, 0x21, 0x70, 0x00, 0xdf, 0xe2, - 0x13, 0x11, 0xd3, 0xa7, 0x20, 0xff, 0x40, 0xa0, 0x43, 0x10, 0x74, 0x4f, 0xcf, 0x7b, 0x86, 0xbb, - 0x4b, 0x4b, 0x44, 0x10, 0xe4, 0xc6, 0xed, 0xaa, 0xfa, 0x55, 0x75, 0x75, 0x75, 0x55, 0x4d, 0x77, - 0x13, 0x56, 0x0e, 0xee, 0xd9, 0x55, 0xd5, 0xa8, 0x1d, 0x38, 0xbb, 0xc4, 0xd2, 0x09, 0x25, 0x76, - 0xed, 0x90, 0xe8, 0x2d, 0xc3, 0xaa, 0x09, 0x82, 0x62, 0xaa, 0x35, 0x72, 0x44, 0x89, 0x6e, 0xab, - 0x86, 0x6e, 0xd7, 0x0e, 0x6f, 0xed, 0x12, 0xaa, 0xdc, 0xaa, 0xb5, 0x89, 0x4e, 0x2c, 0x85, 0x92, - 0x56, 0xd5, 0xb4, 0x0c, 0x6a, 0xa0, 0xcb, 0x2e, 0x7b, 0x55, 0x31, 0xd5, 0x6a, 0xc0, 0x5e, 0x15, - 0xec, 0xf3, 0x37, 0xdb, 0x2a, 0xdd, 0x77, 0x76, 0xab, 0x4d, 0xa3, 0x53, 0x6b, 0x1b, 0x6d, 0xa3, - 0xc6, 0xa5, 0x76, 0x9d, 0x3d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0xb9, 0x68, 0xf3, 0x72, 0x48, 0x79, - 0xd3, 0xb0, 0x48, 0xed, 0x30, 0xa1, 0x71, 0xfe, 0x7a, 0x88, 0xc7, 0x34, 0x34, 0xb5, 0xd9, 0xcd, - 0x32, 0x6e, 0xfe, 0x9d, 0x80, 0xb5, 0xa3, 0x34, 0xf7, 0x55, 0x9d, 0x58, 0xdd, 0x9a, 0x79, 0xd0, - 0xe6, 0xb2, 0x16, 0xb1, 0x0d, 0xc7, 0x6a, 0x92, 0x81, 0xa4, 0xec, 0x5a, 0x87, 0x50, 0x25, 0xcd, - 0xac, 0x5a, 0x96, 0x94, 0xe5, 0xe8, 0x54, 0xed, 0x24, 0xd5, 0xdc, 0xed, 0x25, 0x60, 0x37, 0xf7, - 0x49, 0x47, 0x49, 0xc8, 0xbd, 0x9d, 0x25, 0xe7, 0x50, 0x55, 0xab, 0xa9, 0x3a, 0xb5, 0xa9, 0x15, - 0x17, 0x92, 0xef, 0xc3, 0xd4, 0xa2, 0xa6, 0x19, 0x9f, 0x93, 0xd6, 0x8a, 0x46, 0x8e, 0x9e, 0x18, - 0x9a, 0xd3, 0x21, 0xe8, 0x2a, 0x0c, 0xb7, 0x2c, 0xf5, 0x90, 0x58, 0x65, 0xe9, 0x8a, 0x74, 0x6d, - 0xa4, 0x3e, 0xfe, 0xfc, 0xb8, 0x72, 0xe1, 0xe4, 0xb8, 0x32, 0xbc, 0xcc, 0x47, 0xb1, 0xa0, 0xca, - 0x36, 0x4c, 0x08, 0xe1, 0x47, 0x86, 0x4d, 0xb7, 0x14, 0xba, 0x8f, 0x6e, 0x03, 0x98, 0x0a, 0xdd, - 0xdf, 0xb2, 0xc8, 0x9e, 0x7a, 0x24, 0xc4, 0x91, 0x10, 0x87, 0x2d, 0x9f, 0x82, 0x43, 0x5c, 0xe8, - 0x06, 0x94, 0x2c, 0xa2, 0xb4, 0x36, 0x75, 0xad, 0x5b, 0xce, 0x5d, 0x91, 0xae, 0x95, 0xea, 0x93, - 0x42, 0xa2, 0x84, 0xc5, 0x38, 0xf6, 0x39, 0xe4, 0xbf, 0x94, 0xe0, 0x67, 0x4b, 0x8e, 0x4d, 0x8d, - 0xce, 0x3a, 0xa1, 0x96, 0xda, 0x5c, 0x72, 0x2c, 0x8b, 0xe8, 0xb4, 0x41, 0x15, 0xea, 0xd8, 0xe8, - 0x0a, 0x14, 0x74, 0xa5, 0x43, 0x84, 0xe6, 0x8b, 0x02, 0xa7, 0xb0, 0xa1, 0x74, 0x08, 0xe6, 0x14, - 0xf4, 0x31, 0x0c, 0x1d, 0x2a, 0x9a, 0x43, 0xb8, 0xaa, 0xd1, 0xdb, 0xd5, 0x6a, 0x10, 0xa8, 0xbe, - 0xdb, 0xaa, 0xe6, 0x41, 0x9b, 0x47, 0xae, 0x17, 0x0b, 0xd5, 0xc7, 0x8e, 0xa2, 0x53, 0x95, 0x76, - 0xeb, 0x33, 0x02, 0xf2, 0xa2, 0xd0, 0xfb, 0x84, 0x61, 0x61, 0x17, 0x52, 0xfe, 0x1d, 0xb8, 0x9c, - 0x69, 0xda, 0x9a, 0x6a, 0x53, 0xf4, 0x14, 0x86, 0x54, 0x4a, 0x3a, 0x76, 0x59, 0xba, 0x92, 0xbf, - 0x36, 0x7a, 0xfb, 0x5e, 0xf5, 0xd4, 0x5d, 0x52, 0xcd, 0x04, 0xab, 0x8f, 0x09, 0x33, 0x86, 0x56, - 0x19, 0x1c, 0x76, 0x51, 0xe5, 0x3f, 0x95, 0x00, 0x85, 0x65, 0xb6, 0x15, 0xab, 0x4d, 0x68, 0x1f, - 0x4e, 0xf9, 0x8d, 0x9f, 0xe6, 0x94, 0x69, 0x01, 0x39, 0xea, 0x2a, 0x8c, 0xf8, 0xc4, 0x84, 0xd9, - 0xa4, 0x49, 0xdc, 0x19, 0x4f, 0xa2, 0xce, 0xb8, 0x35, 0x80, 0x33, 0x5c, 0x94, 0x0c, 0x2f, 0x7c, - 0x91, 0x83, 0x91, 0x65, 0x85, 0x74, 0x0c, 0xbd, 0x41, 0x28, 0xfa, 0x14, 0x4a, 0x6c, 0x6b, 0xb6, - 0x14, 0xaa, 0x70, 0x07, 0x8c, 0xde, 0x7e, 0xeb, 0xb4, 0xd9, 0xd9, 0x55, 0xc6, 0x5d, 0x3d, 0xbc, - 0x55, 0xdd, 0xdc, 0x7d, 0x46, 0x9a, 0x74, 0x9d, 0x50, 0x25, 0x88, 0xe0, 0x60, 0x0c, 0xfb, 0xa8, - 0x68, 0x03, 0x0a, 0xb6, 0x49, 0x9a, 0xc2, 0x77, 0x37, 0x7a, 0x4c, 0xc3, 0xb7, 0xac, 0x61, 0x92, - 0x66, 0xb0, 0x18, 0xec, 0x17, 0xe6, 0x38, 0xe8, 0x09, 0x0c, 0xdb, 0x7c, 0x95, 0xcb, 0xf9, 0xc4, - 0x6a, 0x9c, 0x8e, 0xe8, 0xc6, 0x86, 0xbf, 0x5d, 0xdd, 0xdf, 0x58, 0xa0, 0xc9, 0xff, 0x91, 0x03, - 0xe4, 0xf3, 0x2e, 0x19, 0x7a, 0x4b, 0xa5, 0xaa, 0xa1, 0xa3, 0x77, 0xa1, 0x40, 0xbb, 0xa6, 0x17, - 0x1d, 0x57, 0x3d, 0x83, 0xb6, 0xbb, 0x26, 0x79, 0x71, 0x5c, 0x99, 0x4d, 0x4a, 0x30, 0x0a, 0xe6, - 0x32, 0x68, 0xcd, 0x37, 0x35, 0xc7, 0xa5, 0xdf, 0x89, 0xaa, 0x7e, 0x71, 0x5c, 0x49, 0xc9, 0xdc, - 0x55, 0x1f, 0x29, 0x6a, 0x20, 0x3a, 0x04, 0xa4, 0x29, 0x36, 0xdd, 0xb6, 0x14, 0xdd, 0x76, 0x35, - 0xa9, 0x1d, 0x22, 0x9c, 0xf0, 0x66, 0x7f, 0x8b, 0xc6, 0x24, 0xea, 0xf3, 0xc2, 0x0a, 0xb4, 0x96, - 0x40, 0xc3, 0x29, 0x1a, 0x58, 0xbe, 0xb3, 0x88, 0x62, 0x1b, 0x7a, 0xb9, 0x10, 0xcd, 0x77, 0x98, - 0x8f, 0x62, 0x41, 0x45, 0xd7, 0xa1, 0xd8, 0x21, 0xb6, 0xad, 0xb4, 0x49, 0x79, 0x88, 0x33, 0x4e, - 0x08, 0xc6, 0xe2, 0xba, 0x3b, 0x8c, 0x3d, 0xba, 0xfc, 0x95, 0x04, 0x63, 0xbe, 0xe7, 0x78, 0xb4, - 0xff, 0x66, 0x22, 0x0e, 0xab, 0xfd, 0x4d, 0x89, 0x49, 0xf3, 0x28, 0xf4, 0xb3, 0xa2, 0x37, 0x12, - 0x8a, 0xc1, 0x75, 0x6f, 0x2f, 0xe5, 0xf8, 0x5e, 0xba, 0xd6, 0x6f, 0xc8, 0x64, 0x6c, 0xa1, 0x3f, - 0x2b, 0x84, 0xcc, 0x67, 0xa1, 0x89, 0x9e, 0x42, 0xc9, 0x26, 0x1a, 0x69, 0x52, 0xc3, 0x12, 0xe6, - 0xbf, 0xdd, 0xa7, 0xf9, 0xca, 0x2e, 0xd1, 0x1a, 0x42, 0xb4, 0x7e, 0x91, 0xd9, 0xef, 0xfd, 0xc2, - 0x3e, 0x24, 0x7a, 0x0c, 0x25, 0x4a, 0x3a, 0xa6, 0xa6, 0x50, 0x2f, 0x07, 0xbd, 0x11, 0x9e, 0x02, - 0x8b, 0x1c, 0x06, 0xb6, 0x65, 0xb4, 0xb6, 0x05, 0x1b, 0xdf, 0x3e, 0xbe, 0x4b, 0xbc, 0x51, 0xec, - 0xc3, 0xa0, 0x43, 0x18, 0x77, 0xcc, 0x16, 0xe3, 0xa4, 0xac, 0xe2, 0xb5, 0xbb, 0x22, 0x92, 0xee, - 0xf6, 0xeb, 0x9b, 0x9d, 0x88, 0x74, 0x7d, 0x56, 0xe8, 0x1a, 0x8f, 0x8e, 0xe3, 0x98, 0x16, 0xb4, - 0x08, 0x13, 0x1d, 0x55, 0x67, 0x95, 0xab, 0xdb, 0x20, 0x4d, 0x43, 0x6f, 0xd9, 0x3c, 0xac, 0x86, - 0xea, 0x73, 0x02, 0x60, 0x62, 0x3d, 0x4a, 0xc6, 0x71, 0x7e, 0xf4, 0x21, 0x20, 0x6f, 0x1a, 0x0f, - 0xdd, 0x82, 0xad, 0x1a, 0x3a, 0x8f, 0xb9, 0x7c, 0x10, 0xdc, 0xdb, 0x09, 0x0e, 0x9c, 0x22, 0x85, - 0xd6, 0x60, 0xc6, 0x22, 0x87, 0x2a, 0x9b, 0xe3, 0x23, 0xd5, 0xa6, 0x86, 0xd5, 0x5d, 0x53, 0x3b, - 0x2a, 0x2d, 0x0f, 0x73, 0x9b, 0xca, 0x27, 0xc7, 0x95, 0x19, 0x9c, 0x42, 0xc7, 0xa9, 0x52, 0xf2, - 0x9f, 0x0f, 0xc3, 0x44, 0x2c, 0xdf, 0xa0, 0x27, 0x30, 0xdb, 0x74, 0x8b, 0xd3, 0x86, 0xd3, 0xd9, - 0x25, 0x56, 0xa3, 0xb9, 0x4f, 0x5a, 0x8e, 0x46, 0x5a, 0x3c, 0x50, 0x86, 0xea, 0x0b, 0xc2, 0xe2, - 0xd9, 0xa5, 0x54, 0x2e, 0x9c, 0x21, 0xcd, 0xbc, 0xa0, 0xf3, 0xa1, 0x75, 0xd5, 0xb6, 0x7d, 0xcc, - 0x1c, 0xc7, 0xf4, 0xbd, 0xb0, 0x91, 0xe0, 0xc0, 0x29, 0x52, 0xcc, 0xc6, 0x16, 0xb1, 0x55, 0x8b, - 0xb4, 0xe2, 0x36, 0xe6, 0xa3, 0x36, 0x2e, 0xa7, 0x72, 0xe1, 0x0c, 0x69, 0x74, 0x07, 0x46, 0x5d, - 0x6d, 0x7c, 0xfd, 0xc4, 0x42, 0xfb, 0xe5, 0x70, 0x23, 0x20, 0xe1, 0x30, 0x1f, 0x9b, 0x9a, 0xb1, - 0x6b, 0x13, 0xeb, 0x90, 0xb4, 0xb2, 0x17, 0x78, 0x33, 0xc1, 0x81, 0x53, 0xa4, 0xd8, 0xd4, 0xdc, - 0x08, 0x4c, 0x4c, 0x6d, 0x38, 0x3a, 0xb5, 0x9d, 0x54, 0x2e, 0x9c, 0x21, 0xcd, 0xe2, 0xd8, 0x35, - 0x79, 0xf1, 0x50, 0x51, 0x35, 0x65, 0x57, 0x23, 0xe5, 0x62, 0x34, 0x8e, 0x37, 0xa2, 0x64, 0x1c, - 0xe7, 0x47, 0x0f, 0x61, 0xca, 0x1d, 0xda, 0xd1, 0x15, 0x1f, 0xa4, 0xc4, 0x41, 0x7e, 0x26, 0x40, - 0xa6, 0x36, 0xe2, 0x0c, 0x38, 0x29, 0x83, 0xde, 0x85, 0xf1, 0xa6, 0xa1, 0x69, 0x3c, 0x1e, 0x97, - 0x0c, 0x47, 0xa7, 0xe5, 0x11, 0x8e, 0x82, 0xd8, 0x7e, 0x5c, 0x8a, 0x50, 0x70, 0x8c, 0x13, 0x11, - 0x80, 0xa6, 0x57, 0x70, 0xec, 0x32, 0xf4, 0xd5, 0x6b, 0x24, 0x8b, 0x5e, 0xd0, 0x03, 0xf8, 0x43, - 0x36, 0x0e, 0x01, 0xcb, 0xff, 0x22, 0xc1, 0x5c, 0x46, 0xea, 0x40, 0xef, 0x47, 0x4a, 0xec, 0x2f, - 0xc7, 0x4a, 0xec, 0xa5, 0x0c, 0xb1, 0x50, 0x9d, 0xd5, 0x61, 0xcc, 0x62, 0xb3, 0xd2, 0xdb, 0x2e, - 0x8b, 0xc8, 0x91, 0x77, 0x7a, 0x4c, 0x03, 0x87, 0x65, 0x82, 0x9c, 0x3f, 0x75, 0x72, 0x5c, 0x19, - 0x8b, 0xd0, 0x70, 0x14, 0x5e, 0xfe, 0x8b, 0x1c, 0xc0, 0x32, 0x31, 0x35, 0xa3, 0xdb, 0x21, 0xfa, - 0x79, 0xf4, 0x50, 0x9b, 0x91, 0x1e, 0xea, 0x66, 0xaf, 0xe5, 0xf1, 0x4d, 0xcb, 0x6c, 0xa2, 0x7e, - 0x3d, 0xd6, 0x44, 0xd5, 0xfa, 0x87, 0x3c, 0xbd, 0x8b, 0xfa, 0xb7, 0x3c, 0x4c, 0x07, 0xcc, 0x41, - 0x1b, 0x75, 0x3f, 0xb2, 0xc6, 0xbf, 0x14, 0x5b, 0xe3, 0xb9, 0x14, 0x91, 0x57, 0xd6, 0x47, 0xbd, - 0xfc, 0x7e, 0x06, 0x3d, 0x83, 0x71, 0xd6, 0x38, 0xb9, 0xe1, 0xc1, 0xdb, 0xb2, 0xe1, 0x81, 0xdb, - 0x32, 0xbf, 0x80, 0xae, 0x45, 0x90, 0x70, 0x0c, 0x39, 0xa3, 0x0d, 0x2c, 0xbe, 0xea, 0x36, 0x50, - 0xfe, 0x5a, 0x82, 0xf1, 0x60, 0x99, 0xce, 0xa1, 0x69, 0xdb, 0x88, 0x36, 0x6d, 0xd7, 0xfb, 0x0e, - 0xd1, 0x8c, 0xae, 0xed, 0xbf, 0x58, 0x83, 0xef, 0x33, 0xb1, 0x0d, 0xbe, 0xab, 0x34, 0x0f, 0xfa, - 0xf8, 0xfc, 0xfb, 0x42, 0x02, 0x24, 0xaa, 0xc0, 0xa2, 0xae, 0x1b, 0x54, 0x71, 0x73, 0xa5, 0x6b, - 0xd6, 0x6a, 0xdf, 0x66, 0x79, 0x1a, 0xab, 0x3b, 0x09, 0xac, 0x07, 0x3a, 0xb5, 0xba, 0xc1, 0x8a, - 0x24, 0x19, 0x70, 0x8a, 0x01, 0x48, 0x01, 0xb0, 0x04, 0xe6, 0xb6, 0x21, 0x36, 0xf2, 0xcd, 0x3e, - 0x72, 0x1e, 0x13, 0x58, 0x32, 0xf4, 0x3d, 0xb5, 0x1d, 0xa4, 0x1d, 0xec, 0x03, 0xe1, 0x10, 0xe8, - 0xfc, 0x03, 0x98, 0xcb, 0xb0, 0x16, 0x4d, 0x42, 0xfe, 0x80, 0x74, 0x5d, 0xb7, 0x61, 0xf6, 0x27, - 0x9a, 0x09, 0x7f, 0x26, 0x8f, 0x88, 0x2f, 0xdc, 0x77, 0x73, 0xf7, 0x24, 0xf9, 0xab, 0xa1, 0x70, - 0xec, 0xf0, 0x8e, 0xf9, 0x1a, 0x94, 0x2c, 0x62, 0x6a, 0x6a, 0x53, 0xb1, 0x45, 0x23, 0x74, 0xd1, - 0x3d, 0xd2, 0x70, 0xc7, 0xb0, 0x4f, 0x8d, 0xf4, 0xd6, 0xb9, 0x57, 0xdb, 0x5b, 0xe7, 0x5f, 0x4e, - 0x6f, 0xfd, 0x5b, 0x50, 0xb2, 0xbd, 0xae, 0xba, 0xc0, 0x21, 0x6f, 0x0d, 0x90, 0x5f, 0x45, 0x43, - 0xed, 0x2b, 0xf0, 0x5b, 0x69, 0x1f, 0x34, 0xad, 0x89, 0x1e, 0x1a, 0xb0, 0x89, 0x7e, 0xa9, 0x8d, - 0x2f, 0xcb, 0xa9, 0xa6, 0xe2, 0xd8, 0xa4, 0xc5, 0x13, 0x51, 0x29, 0xc8, 0xa9, 0x5b, 0x7c, 0x14, - 0x0b, 0x2a, 0x7a, 0x1a, 0x09, 0xd9, 0xd2, 0x59, 0x42, 0x76, 0x3c, 0x3b, 0x5c, 0xd1, 0x0e, 0xcc, - 0x99, 0x96, 0xd1, 0xb6, 0x88, 0x6d, 0x2f, 0x13, 0xa5, 0xa5, 0xa9, 0x3a, 0xf1, 0xfc, 0xe3, 0x76, - 0x44, 0x97, 0x4e, 0x8e, 0x2b, 0x73, 0x5b, 0xe9, 0x2c, 0x38, 0x4b, 0x56, 0x7e, 0x5e, 0x80, 0xc9, - 0x78, 0x05, 0xcc, 0x68, 0x52, 0xa5, 0x33, 0x35, 0xa9, 0x37, 0x42, 0x9b, 0xc1, 0xed, 0xe0, 0x43, - 0x67, 0x7c, 0x89, 0x0d, 0xb1, 0x08, 0x13, 0x22, 0x1b, 0x78, 0x44, 0xd1, 0xa6, 0xfb, 0xab, 0xbf, - 0x13, 0x25, 0xe3, 0x38, 0x3f, 0x6b, 0x3d, 0x83, 0x8e, 0xd2, 0x03, 0x29, 0x44, 0x5b, 0xcf, 0xc5, - 0x38, 0x03, 0x4e, 0xca, 0xa0, 0x75, 0x98, 0x76, 0xf4, 0x24, 0x94, 0x1b, 0x8d, 0x97, 0x04, 0xd4, - 0xf4, 0x4e, 0x92, 0x05, 0xa7, 0xc9, 0xa1, 0xbd, 0x48, 0x37, 0x3a, 0xcc, 0x33, 0xec, 0xed, 0xbe, - 0xf7, 0x4e, 0xdf, 0xed, 0x28, 0xba, 0x0f, 0x63, 0x16, 0xff, 0xee, 0xf0, 0x0c, 0x76, 0x7b, 0xf7, - 0xd7, 0x84, 0xd8, 0x18, 0x0e, 0x13, 0x71, 0x94, 0x37, 0xa5, 0xdd, 0x2e, 0xf5, 0xdb, 0x6e, 0xcb, - 0xff, 0x24, 0x85, 0x8b, 0x90, 0xdf, 0x02, 0xf7, 0x3a, 0x65, 0x4a, 0x48, 0x84, 0xba, 0x23, 0x23, - 0xbd, 0xfb, 0xbd, 0x3b, 0x50, 0xf7, 0x1b, 0x14, 0xcf, 0xde, 0xed, 0xef, 0x97, 0x12, 0xcc, 0xae, - 0x34, 0x1e, 0x5a, 0x86, 0x63, 0x7a, 0xe6, 0x6c, 0x9a, 0xae, 0x5f, 0x7f, 0x01, 0x05, 0xcb, 0xd1, - 0xbc, 0x79, 0xbc, 0xe1, 0xcd, 0x03, 0x3b, 0x1a, 0x9b, 0xc7, 0x74, 0x4c, 0xca, 0x9d, 0x04, 0x13, - 0x40, 0x1b, 0x30, 0x6c, 0x29, 0x7a, 0x9b, 0x78, 0x65, 0xf5, 0x6a, 0x0f, 0xeb, 0x57, 0x97, 0x31, - 0x63, 0x0f, 0x35, 0x6f, 0x5c, 0x1a, 0x0b, 0x14, 0xf9, 0x8f, 0x24, 0x98, 0x78, 0xb4, 0xbd, 0xbd, - 0xb5, 0xaa, 0xf3, 0x1d, 0xcd, 0x4f, 0xdf, 0xaf, 0x40, 0xc1, 0x54, 0xe8, 0x7e, 0xbc, 0xd2, 0x33, - 0x1a, 0xe6, 0x14, 0xf4, 0x11, 0x14, 0x59, 0x26, 0x21, 0x7a, 0xab, 0xcf, 0x56, 0x5b, 0xc0, 0xd7, - 0x5d, 0xa1, 0xa0, 0x43, 0x14, 0x03, 0xd8, 0x83, 0x93, 0x0f, 0x60, 0x26, 0x64, 0x0e, 0xf3, 0x07, - 0x3f, 0x06, 0x46, 0x0d, 0x18, 0x62, 0x9a, 0xbd, 0x53, 0xde, 0x5e, 0x87, 0x99, 0xb1, 0x29, 0x05, - 0x9d, 0x0e, 0xfb, 0x65, 0x63, 0x17, 0x4b, 0x5e, 0x87, 0x31, 0x7e, 0xe5, 0x60, 0x58, 0x94, 0xbb, - 0x05, 0x5d, 0x86, 0x7c, 0x47, 0xd5, 0x45, 0x9d, 0x1d, 0x15, 0x32, 0x79, 0x56, 0x23, 0xd8, 0x38, - 0x27, 0x2b, 0x47, 0x22, 0xf3, 0x04, 0x64, 0xe5, 0x08, 0xb3, 0x71, 0xf9, 0x21, 0x14, 0x85, 0xbb, - 0xc3, 0x40, 0xf9, 0xd3, 0x81, 0xf2, 0x29, 0x40, 0x9b, 0x50, 0x5c, 0xdd, 0xaa, 0x6b, 0x86, 0xdb, - 0x75, 0x35, 0xd5, 0x96, 0x15, 0x5f, 0x8b, 0xa5, 0xd5, 0x65, 0x8c, 0x39, 0x05, 0xc9, 0x30, 0x4c, - 0x8e, 0x9a, 0xc4, 0xa4, 0x3c, 0x22, 0x46, 0xea, 0xc0, 0x56, 0xf9, 0x01, 0x1f, 0xc1, 0x82, 0x22, - 0xff, 0x71, 0x0e, 0x8a, 0xc2, 0x1d, 0xe7, 0xf0, 0x15, 0xb6, 0x16, 0xf9, 0x0a, 0x7b, 0xb3, 0xbf, - 0xd0, 0xc8, 0xfc, 0x04, 0xdb, 0x8e, 0x7d, 0x82, 0xdd, 0xe8, 0x13, 0xef, 0xf4, 0xef, 0xaf, 0xbf, - 0x97, 0x60, 0x3c, 0x1a, 0x94, 0xe8, 0x0e, 0x8c, 0xb2, 0x82, 0xa3, 0x36, 0xc9, 0x46, 0xd0, 0xe7, - 0xfa, 0x87, 0x30, 0x8d, 0x80, 0x84, 0xc3, 0x7c, 0xa8, 0xed, 0x8b, 0xb1, 0x38, 0x12, 0x93, 0xce, - 0x76, 0xa9, 0x43, 0x55, 0xad, 0xea, 0x5e, 0xa3, 0x55, 0x57, 0x75, 0xba, 0x69, 0x35, 0xa8, 0xa5, - 0xea, 0xed, 0x84, 0x22, 0x1e, 0x94, 0x61, 0x64, 0xf9, 0x1f, 0x25, 0x18, 0x15, 0x26, 0x9f, 0xc3, - 0x57, 0xc5, 0xaf, 0x45, 0xbf, 0x2a, 0xae, 0xf6, 0xb9, 0xc1, 0xd3, 0x3f, 0x29, 0xfe, 0x3a, 0x30, - 0x9d, 0x6d, 0x69, 0x16, 0xd5, 0xfb, 0x86, 0x4d, 0xe3, 0x51, 0xcd, 0x36, 0x23, 0xe6, 0x14, 0xe4, - 0xc0, 0xa4, 0x1a, 0xcb, 0x01, 0xc2, 0xb5, 0xb5, 0xfe, 0x2c, 0xf1, 0xc5, 0xea, 0x65, 0x01, 0x3f, - 0x19, 0xa7, 0xe0, 0x84, 0x0a, 0x99, 0x40, 0x82, 0x0b, 0x3d, 0x86, 0xc2, 0x3e, 0xa5, 0x66, 0xca, - 0x79, 0x75, 0x8f, 0xcc, 0x13, 0x98, 0x50, 0xe2, 0xb3, 0xdb, 0xde, 0xde, 0xc2, 0x1c, 0x4a, 0xfe, - 0xef, 0xc0, 0x1f, 0x0d, 0x37, 0xc6, 0xfd, 0x7c, 0x2a, 0x9d, 0x25, 0x9f, 0x8e, 0xa6, 0xe5, 0x52, - 0xf4, 0x08, 0xf2, 0x54, 0xeb, 0xf7, 0xb3, 0x50, 0x20, 0x6e, 0xaf, 0x35, 0x82, 0x84, 0xb4, 0xbd, - 0xd6, 0xc0, 0x0c, 0x02, 0x6d, 0xc2, 0x10, 0xab, 0x3e, 0x6c, 0x0b, 0xe6, 0xfb, 0xdf, 0xd2, 0x6c, - 0xfe, 0x41, 0x40, 0xb0, 0x5f, 0x36, 0x76, 0x71, 0xe4, 0xcf, 0x60, 0x2c, 0xb2, 0x4f, 0xd1, 0xa7, - 0x70, 0x51, 0x33, 0x94, 0x56, 0x5d, 0xd1, 0x14, 0xbd, 0x49, 0xbc, 0xcb, 0x81, 0xab, 0x69, 0x5f, - 0x18, 0x6b, 0x21, 0x3e, 0xb1, 0xcb, 0xfd, 0xeb, 0xd4, 0x30, 0x0d, 0x47, 0x10, 0x65, 0x05, 0x20, - 0x98, 0x23, 0xaa, 0xc0, 0x10, 0x8b, 0x33, 0xb7, 0x9e, 0x8c, 0xd4, 0x47, 0x98, 0x85, 0x2c, 0xfc, - 0x6c, 0xec, 0x8e, 0xa3, 0xdb, 0x00, 0x36, 0x69, 0x5a, 0x84, 0xf2, 0x64, 0x90, 0x8b, 0x5e, 0x41, - 0x37, 0x7c, 0x0a, 0x0e, 0x71, 0xc9, 0xff, 0x2c, 0xc1, 0xd8, 0x06, 0xa1, 0x9f, 0x1b, 0xd6, 0xc1, - 0x16, 0x7f, 0x3a, 0x70, 0x0e, 0xc9, 0x16, 0x47, 0x92, 0xed, 0x5b, 0x3d, 0x56, 0x26, 0x62, 0x5d, - 0x56, 0xca, 0x95, 0xbf, 0x96, 0x60, 0x2e, 0xc2, 0xf9, 0x20, 0xd8, 0xba, 0x3b, 0x30, 0x64, 0x1a, - 0x16, 0xf5, 0x0a, 0xf1, 0x40, 0x0a, 0x59, 0x1a, 0x0b, 0x95, 0x62, 0x06, 0x83, 0x5d, 0x34, 0xb4, - 0x06, 0x39, 0x6a, 0x88, 0x50, 0x1d, 0x0c, 0x93, 0x10, 0xab, 0x0e, 0x02, 0x33, 0xb7, 0x6d, 0xe0, - 0x1c, 0x35, 0xd8, 0x42, 0x94, 0x23, 0x5c, 0xe1, 0xe4, 0xf3, 0x8a, 0x66, 0x80, 0xa1, 0xb0, 0x67, - 0x19, 0x9d, 0x33, 0xcf, 0xc1, 0x5f, 0x88, 0x15, 0xcb, 0xe8, 0x60, 0x8e, 0x25, 0x7f, 0x23, 0xc1, - 0x54, 0x84, 0xf3, 0x1c, 0x12, 0xff, 0xe3, 0x68, 0xe2, 0xbf, 0x31, 0xc8, 0x44, 0x32, 0xd2, 0xff, - 0x37, 0xb9, 0xd8, 0x34, 0xd8, 0x84, 0xd1, 0x1e, 0x8c, 0x9a, 0x46, 0xab, 0xf1, 0x12, 0xae, 0x03, - 0x27, 0x58, 0xdd, 0xdc, 0x0a, 0xb0, 0x70, 0x18, 0x18, 0x1d, 0xc1, 0x94, 0xae, 0x74, 0x88, 0x6d, - 0x2a, 0x4d, 0xd2, 0x78, 0x09, 0x07, 0x24, 0xaf, 0xf1, 0xfb, 0x86, 0x38, 0x22, 0x4e, 0x2a, 0x41, - 0xeb, 0x50, 0x54, 0x4d, 0xde, 0xc7, 0x89, 0xde, 0xa5, 0x67, 0x15, 0x75, 0xbb, 0x3e, 0x37, 0x9f, - 0x8b, 0x1f, 0xd8, 0xc3, 0x90, 0xff, 0x26, 0x1e, 0x0d, 0x2c, 0xfe, 0xd0, 0x43, 0x28, 0xf1, 0x47, - 0x38, 0x4d, 0x43, 0xf3, 0x6e, 0x06, 0xd8, 0xca, 0x6e, 0x89, 0xb1, 0x17, 0xc7, 0x95, 0x4b, 0x29, - 0x87, 0xbe, 0x1e, 0x19, 0xfb, 0xc2, 0x68, 0x03, 0x0a, 0xe6, 0x4f, 0xe9, 0x60, 0x78, 0x91, 0xe3, - 0x6d, 0x0b, 0xc7, 0x91, 0x7f, 0x2f, 0x1f, 0x33, 0x97, 0x97, 0xba, 0x67, 0x2f, 0x6d, 0xd5, 0xfd, - 0x8e, 0x29, 0x73, 0xe5, 0x77, 0xa1, 0x28, 0x2a, 0xbc, 0x08, 0xe6, 0x5f, 0x0c, 0x12, 0xcc, 0xe1, - 0x2a, 0xe6, 0x7f, 0xb0, 0x78, 0x83, 0x1e, 0x30, 0xfa, 0x04, 0x86, 0x89, 0xab, 0xc2, 0xad, 0x8d, - 0x77, 0x07, 0x51, 0x11, 0xe4, 0xd5, 0xa0, 0x51, 0x15, 0x63, 0x02, 0x15, 0xbd, 0xcf, 0xfc, 0xc5, - 0x78, 0xd9, 0x47, 0xa0, 0x5d, 0x2e, 0xf0, 0x72, 0x75, 0xd9, 0x9d, 0xb6, 0x3f, 0xfc, 0xe2, 0xb8, - 0x02, 0xc1, 0x4f, 0x1c, 0x96, 0x90, 0xff, 0x55, 0x82, 0x29, 0xee, 0xa1, 0xa6, 0x63, 0xa9, 0xb4, - 0x7b, 0x6e, 0x85, 0xe9, 0x49, 0xa4, 0x30, 0xbd, 0xd3, 0xc3, 0x2d, 0x09, 0x0b, 0x33, 0x8b, 0xd3, - 0xb7, 0x12, 0xbc, 0x96, 0xe0, 0x3e, 0x87, 0xbc, 0xb8, 0x13, 0xcd, 0x8b, 0x6f, 0x0d, 0x3a, 0xa1, - 0xac, 0xd6, 0x78, 0x3c, 0x65, 0x3a, 0x7c, 0xa7, 0xdc, 0x06, 0x30, 0x2d, 0xf5, 0x50, 0xd5, 0x48, - 0x5b, 0x5c, 0x82, 0x97, 0x42, 0x8f, 0xe0, 0x7c, 0x0a, 0x0e, 0x71, 0x21, 0x1b, 0x66, 0x5b, 0x64, - 0x4f, 0x71, 0x34, 0xba, 0xd8, 0x6a, 0x2d, 0x29, 0xa6, 0xb2, 0xab, 0x6a, 0x2a, 0x55, 0xc5, 0x71, - 0xc1, 0x48, 0xfd, 0xbe, 0x7b, 0x39, 0x9d, 0xc6, 0xf1, 0xe2, 0xb8, 0x72, 0x39, 0xed, 0x76, 0xc8, - 0x63, 0xe9, 0xe2, 0x0c, 0x68, 0xd4, 0x85, 0xb2, 0x45, 0x3e, 0x73, 0x54, 0x8b, 0xb4, 0x96, 0x2d, - 0xc3, 0x8c, 0xa8, 0xcd, 0x73, 0xb5, 0xbf, 0x7a, 0x72, 0x5c, 0x29, 0xe3, 0x0c, 0x9e, 0xde, 0x8a, - 0x33, 0xe1, 0xd1, 0x33, 0x98, 0x56, 0xdc, 0xb7, 0x83, 0x11, 0xad, 0xee, 0x2e, 0xb9, 0x77, 0x72, - 0x5c, 0x99, 0x5e, 0x4c, 0x92, 0x7b, 0x2b, 0x4c, 0x03, 0x45, 0x35, 0x28, 0x1e, 0xf2, 0x97, 0x8d, - 0x76, 0x79, 0x88, 0xe3, 0xb3, 0x42, 0x50, 0x74, 0x1f, 0x3b, 0x32, 0xcc, 0xe1, 0x95, 0x06, 0xdf, - 0x7d, 0x1e, 0x17, 0xfb, 0xa0, 0x64, 0xbd, 0xa4, 0xd8, 0xf1, 0xfc, 0xc4, 0xb8, 0x14, 0x64, 0xad, - 0x47, 0x01, 0x09, 0x87, 0xf9, 0xd0, 0x53, 0x18, 0xd9, 0x17, 0xa7, 0x12, 0x76, 0xb9, 0xd8, 0x57, - 0x11, 0x8e, 0x9c, 0x62, 0xd4, 0xa7, 0x84, 0x8a, 0x11, 0x6f, 0xd8, 0xc6, 0x01, 0x22, 0xba, 0x0e, - 0x45, 0xfe, 0x63, 0x75, 0x99, 0x1f, 0xc7, 0x95, 0x82, 0xdc, 0xf6, 0xc8, 0x1d, 0xc6, 0x1e, 0xdd, - 0x63, 0x5d, 0xdd, 0x5a, 0xe2, 0xc7, 0xc2, 0x31, 0xd6, 0xd5, 0xad, 0x25, 0xec, 0xd1, 0xd1, 0xa7, - 0x50, 0xb4, 0xc9, 0x9a, 0xaa, 0x3b, 0x47, 0x65, 0xe8, 0xeb, 0x52, 0xb9, 0xf1, 0x80, 0x73, 0xc7, - 0x0e, 0xc6, 0x02, 0x0d, 0x82, 0x8e, 0x3d, 0x58, 0xb4, 0x0f, 0x23, 0x96, 0xa3, 0x2f, 0xda, 0x3b, - 0x36, 0xb1, 0xca, 0xa3, 0x5c, 0x47, 0xaf, 0x74, 0x8e, 0x3d, 0xfe, 0xb8, 0x16, 0xdf, 0x43, 0x3e, - 0x07, 0x0e, 0xc0, 0xd1, 0x1f, 0x4a, 0x80, 0x6c, 0xc7, 0x34, 0x35, 0xd2, 0x21, 0x3a, 0x55, 0x34, - 0x7e, 0x16, 0x67, 0x97, 0x2f, 0x72, 0x9d, 0x1f, 0xf4, 0x9a, 0x57, 0x42, 0x30, 0xae, 0xdc, 0x3f, - 0xf4, 0x4e, 0xb2, 0xe2, 0x14, 0xbd, 0xcc, 0xb5, 0x7b, 0x36, 0xff, 0xbb, 0x3c, 0xd6, 0x97, 0x6b, - 0xd3, 0xcf, 0x1c, 0x03, 0xd7, 0x0a, 0x3a, 0xf6, 0x60, 0xd1, 0x13, 0x98, 0xf5, 0x1e, 0xc6, 0x62, - 0xc3, 0xa0, 0x2b, 0xaa, 0x46, 0xec, 0xae, 0x4d, 0x49, 0xa7, 0x3c, 0xce, 0x97, 0xdd, 0x7f, 0xfb, - 0x81, 0x53, 0xb9, 0x70, 0x86, 0x34, 0xea, 0x40, 0xc5, 0x4b, 0x19, 0x6c, 0x3f, 0xf9, 0x39, 0xeb, - 0x81, 0xdd, 0x54, 0x34, 0xf7, 0x1e, 0x60, 0x82, 0x2b, 0x78, 0xe3, 0xe4, 0xb8, 0x52, 0x59, 0x3e, - 0x9d, 0x15, 0xf7, 0xc2, 0x42, 0x1f, 0x41, 0x59, 0xc9, 0xd2, 0x33, 0xc9, 0xf5, 0xbc, 0xce, 0xf2, - 0x50, 0xa6, 0x82, 0x4c, 0x69, 0x44, 0x61, 0x52, 0x89, 0x3e, 0x51, 0xb6, 0xcb, 0x53, 0x7d, 0x1d, - 0x44, 0xc6, 0x5e, 0x36, 0x07, 0x87, 0x11, 0x31, 0x82, 0x8d, 0x13, 0x1a, 0xd0, 0x6f, 0x03, 0x52, - 0xe2, 0xaf, 0xaa, 0xed, 0x32, 0xea, 0xab, 0xfc, 0x24, 0x9e, 0x63, 0x07, 0x61, 0x97, 0x20, 0xd9, - 0x38, 0x45, 0x0f, 0x5a, 0x83, 0x19, 0x31, 0xba, 0xa3, 0xdb, 0xca, 0x1e, 0x69, 0x74, 0xed, 0x26, - 0xd5, 0xec, 0xf2, 0x34, 0xcf, 0x7d, 0xfc, 0xe2, 0x6b, 0x31, 0x85, 0x8e, 0x53, 0xa5, 0xd0, 0x07, - 0x30, 0xb9, 0x67, 0x58, 0xbb, 0x6a, 0xab, 0x45, 0x74, 0x0f, 0x69, 0x86, 0x23, 0xcd, 0x30, 0x6f, - 0xac, 0xc4, 0x68, 0x38, 0xc1, 0xcd, 0x1f, 0x93, 0x88, 0xab, 0x85, 0xf3, 0x79, 0x90, 0x3b, 0xd8, - 0x63, 0x92, 0xc0, 0xb4, 0x97, 0xf6, 0x98, 0x24, 0x04, 0x79, 0xfa, 0x61, 0xe6, 0x7f, 0xe6, 0x60, - 0x3a, 0x60, 0xee, 0xfb, 0x31, 0x49, 0x8a, 0xc8, 0xff, 0x3f, 0xca, 0xed, 0xfd, 0x28, 0xf7, 0x6b, - 0x09, 0xc6, 0x03, 0xd7, 0xfd, 0xef, 0x7b, 0xe0, 0x11, 0xd8, 0x96, 0xd1, 0x72, 0xfe, 0x5d, 0x2e, - 0x3c, 0x81, 0xff, 0xf3, 0xaf, 0x0c, 0x7e, 0xfa, 0x4b, 0x5a, 0xf9, 0xdb, 0x3c, 0x4c, 0xc6, 0x77, - 0x63, 0xe4, 0x32, 0x5a, 0xea, 0x79, 0x19, 0xbd, 0x05, 0x33, 0x7b, 0x8e, 0xa6, 0x75, 0xb9, 0x1b, - 0x42, 0x37, 0xd2, 0xee, 0x65, 0xd2, 0xeb, 0x42, 0x72, 0x66, 0x25, 0x85, 0x07, 0xa7, 0x4a, 0x66, - 0x5c, 0xac, 0xe7, 0xcf, 0x74, 0xb1, 0x9e, 0xb8, 0xe7, 0x2d, 0x0c, 0x70, 0xcf, 0x9b, 0x7a, 0x49, - 0x3e, 0x74, 0x86, 0x4b, 0xf2, 0xb3, 0xdc, 0x6a, 0xa7, 0x24, 0xb1, 0x9e, 0x8f, 0x2c, 0x5f, 0x87, - 0x79, 0x21, 0x46, 0xf9, 0x85, 0xb3, 0x4e, 0x2d, 0x43, 0xd3, 0x88, 0xb5, 0xec, 0x74, 0x3a, 0x5d, - 0xf9, 0x3d, 0x18, 0x8f, 0x3e, 0xa5, 0x70, 0x57, 0xda, 0x7d, 0xcd, 0x21, 0xae, 0xf4, 0x42, 0x2b, - 0xed, 0x8e, 0x63, 0x9f, 0x43, 0xfe, 0x7d, 0x09, 0x66, 0xd3, 0x9f, 0x4c, 0x22, 0x0d, 0xc6, 0x3b, - 0xca, 0x51, 0xf8, 0x19, 0xab, 0x74, 0xc6, 0xc3, 0x16, 0x7e, 0x87, 0xbe, 0x1e, 0xc1, 0xc2, 0x31, - 0x6c, 0xf9, 0x47, 0x09, 0xe6, 0x32, 0x6e, 0xaf, 0xcf, 0xd7, 0x12, 0xf4, 0x31, 0x94, 0x3a, 0xca, - 0x51, 0xc3, 0xb1, 0xda, 0xe4, 0xcc, 0xc7, 0x4b, 0x3c, 0x63, 0xac, 0x0b, 0x14, 0xec, 0xe3, 0xc9, - 0x5f, 0x4a, 0x50, 0xce, 0x6a, 0xf4, 0xd1, 0x9d, 0xc8, 0x3d, 0xfb, 0xcf, 0x63, 0xf7, 0xec, 0x53, - 0x09, 0xb9, 0x57, 0x74, 0xcb, 0xfe, 0xb7, 0x12, 0xcc, 0xa6, 0x7f, 0xf0, 0xa0, 0xb7, 0x23, 0x16, - 0x56, 0x62, 0x16, 0x4e, 0xc4, 0xa4, 0x84, 0x7d, 0x9f, 0xc0, 0xb8, 0xf8, 0x2c, 0x12, 0x30, 0xc2, - 0xab, 0x72, 0x5a, 0xae, 0x14, 0x10, 0xde, 0x67, 0x00, 0x5f, 0xaf, 0xe8, 0x18, 0x8e, 0xa1, 0xc9, - 0x7f, 0x90, 0x83, 0xa1, 0x46, 0x53, 0xd1, 0xc8, 0x39, 0xb4, 0x59, 0x1f, 0x46, 0xda, 0xac, 0x5e, - 0xff, 0x72, 0xc2, 0xad, 0xca, 0xec, 0xb0, 0x70, 0xac, 0xc3, 0x7a, 0xb3, 0x2f, 0xb4, 0xd3, 0x9b, - 0xab, 0x5f, 0x81, 0x11, 0x5f, 0xe9, 0x60, 0x39, 0x5f, 0xfe, 0xab, 0x1c, 0x8c, 0x86, 0x54, 0x0c, - 0x58, 0x31, 0xf6, 0x22, 0x95, 0xb6, 0x9f, 0x7f, 0xf4, 0x0b, 0xe9, 0xaa, 0x7a, 0xb5, 0xd5, 0x7d, - 0x32, 0x19, 0x3c, 0x92, 0x4b, 0x96, 0xdc, 0xf7, 0x60, 0x9c, 0xf2, 0x7f, 0x84, 0xf3, 0x0f, 0x65, - 0xf3, 0x3c, 0x16, 0xfd, 0x87, 0xb6, 0xdb, 0x11, 0x2a, 0x8e, 0x71, 0xcf, 0xdf, 0x87, 0xb1, 0x88, - 0xb2, 0x81, 0x5e, 0x3c, 0xfe, 0x83, 0x04, 0x3f, 0xef, 0xf9, 0xc9, 0x8c, 0xea, 0x91, 0x4d, 0x52, - 0x8d, 0x6d, 0x92, 0x85, 0x6c, 0x80, 0x57, 0xf7, 0x72, 0xa6, 0x7e, 0xf3, 0xf9, 0x0f, 0x0b, 0x17, - 0xbe, 0xfb, 0x61, 0xe1, 0xc2, 0xf7, 0x3f, 0x2c, 0x5c, 0xf8, 0xdd, 0x93, 0x05, 0xe9, 0xf9, 0xc9, - 0x82, 0xf4, 0xdd, 0xc9, 0x82, 0xf4, 0xfd, 0xc9, 0x82, 0xf4, 0xef, 0x27, 0x0b, 0xd2, 0x9f, 0xfc, - 0xb8, 0x70, 0xe1, 0xe3, 0xa2, 0x80, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xc2, 0x4a, - 0x40, 0x12, 0x3d, 0x00, 0x00, + // 3665 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x24, 0x49, + 0x56, 0xef, 0xac, 0x2a, 0xbb, 0xca, 0xcf, 0xed, 0xaf, 0xb0, 0xdb, 0x5d, 0xdb, 0x33, 0xed, 0xea, + 0xcd, 0x91, 0x9a, 0x9e, 0xa1, 0xa7, 0x6a, 0xba, 0xe7, 0x63, 0x87, 0x69, 0xb1, 0xbb, 0x2e, 0xbb, + 0xdd, 0xed, 0xc5, 0x1f, 0x35, 0x51, 0x76, 0xb3, 0x8c, 0x98, 0x65, 0xd2, 0x55, 0xe1, 0x72, 0x8e, + 0xb3, 0x32, 0x73, 0x33, 0x22, 0xbd, 0x2e, 0x09, 0x21, 0x0e, 0x08, 0x09, 0x09, 0x04, 0x1c, 0x96, + 0x0f, 0x71, 0x61, 0x2f, 0x9c, 0x40, 0x70, 0x83, 0xc3, 0x6a, 0x24, 0xa4, 0x45, 0x1a, 0xa1, 0x45, + 0xda, 0x1b, 0x7b, 0xb2, 0x18, 0xcf, 0x09, 0xf1, 0x0f, 0xa0, 0x3e, 0x20, 0x14, 0x91, 0x91, 0xdf, + 0x99, 0xae, 0x2a, 0x4f, 0xb7, 0x85, 0xd0, 0xde, 0x2a, 0xe3, 0xbd, 0xf7, 0x7b, 0x2f, 0x22, 0x5e, + 0xbc, 0xf7, 0xe2, 0xa3, 0x60, 0xe3, 0xf8, 0x7d, 0x5a, 0xd7, 0xad, 0xc6, 0xb1, 0x7b, 0x40, 0x1c, + 0x93, 0x30, 0x42, 0x1b, 0x27, 0xc4, 0xec, 0x5a, 0x4e, 0x43, 0x12, 0x34, 0x5b, 0x6f, 0x90, 0x53, + 0x46, 0x4c, 0xaa, 0x5b, 0x26, 0x6d, 0x9c, 0x3c, 0x38, 0x20, 0x4c, 0x7b, 0xd0, 0xe8, 0x11, 0x93, + 0x38, 0x1a, 0x23, 0xdd, 0xba, 0xed, 0x58, 0xcc, 0x42, 0xb7, 0x3d, 0xf6, 0xba, 0x66, 0xeb, 0xf5, + 0x90, 0xbd, 0x2e, 0xd9, 0x6f, 0xbd, 0xd9, 0xd3, 0xd9, 0x91, 0x7b, 0x50, 0xef, 0x58, 0xfd, 0x46, + 0xcf, 0xea, 0x59, 0x0d, 0x21, 0x75, 0xe0, 0x1e, 0x8a, 0x2f, 0xf1, 0x21, 0x7e, 0x79, 0x68, 0xb7, + 0xd4, 0x88, 0xf2, 0x8e, 0xe5, 0x90, 0xc6, 0x49, 0x4a, 0xe3, 0xad, 0x77, 0x42, 0x9e, 0xbe, 0xd6, + 0x39, 0xd2, 0x4d, 0xe2, 0x0c, 0x1a, 0xf6, 0x71, 0x4f, 0x08, 0x39, 0x84, 0x5a, 0xae, 0xd3, 0x21, + 0x63, 0x49, 0xd1, 0x46, 0x9f, 0x30, 0x2d, 0x4b, 0x57, 0x23, 0x4f, 0xca, 0x71, 0x4d, 0xa6, 0xf7, + 0xd3, 0x6a, 0xde, 0x1b, 0x26, 0x40, 0x3b, 0x47, 0xa4, 0xaf, 0xa5, 0xe4, 0xde, 0xce, 0x93, 0x73, + 0x99, 0x6e, 0x34, 0x74, 0x93, 0x51, 0xe6, 0x24, 0x85, 0xd4, 0x47, 0xb0, 0xb0, 0x6a, 0x18, 0xd6, + 0x0f, 0x48, 0x77, 0xc3, 0x20, 0xa7, 0xcf, 0x2c, 0xc3, 0xed, 0x13, 0x74, 0x17, 0x26, 0xbb, 0x8e, + 0x7e, 0x42, 0x9c, 0xaa, 0x72, 0x47, 0xb9, 0x37, 0xd5, 0x9c, 0xfd, 0xfc, 0xac, 0x76, 0xed, 0xfc, + 0xac, 0x36, 0xb9, 0x2e, 0x5a, 0xb1, 0xa4, 0xaa, 0x14, 0xe6, 0xa4, 0xf0, 0x53, 0x8b, 0xb2, 0x96, + 0xc6, 0x8e, 0xd0, 0x43, 0x00, 0x5b, 0x63, 0x47, 0x2d, 0x87, 0x1c, 0xea, 0xa7, 0x52, 0x1c, 0x49, + 0x71, 0x68, 0x05, 0x14, 0x1c, 0xe1, 0x42, 0xf7, 0xa1, 0xe2, 0x10, 0xad, 0xbb, 0x6b, 0x1a, 0x83, + 0x6a, 0xe1, 0x8e, 0x72, 0xaf, 0xd2, 0x9c, 0x97, 0x12, 0x15, 0x2c, 0xdb, 0x71, 0xc0, 0xa1, 0xfe, + 0xa5, 0x02, 0x5f, 0x5b, 0x73, 0x29, 0xb3, 0xfa, 0xdb, 0x84, 0x39, 0x7a, 0x67, 0xcd, 0x75, 0x1c, + 0x62, 0xb2, 0x36, 0xd3, 0x98, 0x4b, 0xd1, 0x1d, 0x28, 0x99, 0x5a, 0x9f, 0x48, 0xcd, 0xd7, 0x25, + 0x4e, 0x69, 0x47, 0xeb, 0x13, 0x2c, 0x28, 0xe8, 0x23, 0x98, 0x38, 0xd1, 0x0c, 0x97, 0x08, 0x55, + 0xd3, 0x0f, 0xeb, 0xf5, 0xd0, 0xfb, 0x82, 0x61, 0xab, 0xdb, 0xc7, 0x3d, 0xe1, 0x8e, 0xbe, 0x2f, + 0xd4, 0x3f, 0x74, 0x35, 0x93, 0xe9, 0x6c, 0xd0, 0x5c, 0x92, 0x90, 0xd7, 0xa5, 0xde, 0x67, 0x1c, + 0x0b, 0x7b, 0x90, 0xea, 0xef, 0xc0, 0xed, 0x5c, 0xd3, 0xb6, 0x74, 0xca, 0xd0, 0xc7, 0x30, 0xa1, + 0x33, 0xd2, 0xa7, 0x55, 0xe5, 0x4e, 0xf1, 0xde, 0xf4, 0xc3, 0xf7, 0xeb, 0x17, 0xba, 0x7e, 0x3d, + 0x17, 0xac, 0x39, 0x23, 0xcd, 0x98, 0xd8, 0xe4, 0x70, 0xd8, 0x43, 0x55, 0xff, 0x54, 0x01, 0x14, + 0x95, 0xd9, 0xd3, 0x9c, 0x1e, 0x61, 0x23, 0x0c, 0xca, 0x6f, 0x7c, 0xb5, 0x41, 0x59, 0x94, 0x90, + 0xd3, 0x9e, 0xc2, 0xd8, 0x98, 0xd8, 0xb0, 0x9c, 0x36, 0x49, 0x0c, 0xc6, 0xb3, 0xf8, 0x60, 0x3c, + 0x18, 0x63, 0x30, 0x3c, 0x94, 0x9c, 0x51, 0xf8, 0x61, 0x01, 0xa6, 0xd6, 0x35, 0xd2, 0xb7, 0xcc, + 0x36, 0x61, 0xe8, 0x13, 0xa8, 0xf0, 0xa5, 0xd9, 0xd5, 0x98, 0x26, 0x06, 0x60, 0xfa, 0xe1, 0x5b, + 0x17, 0xf5, 0x8e, 0xd6, 0x39, 0x77, 0xfd, 0xe4, 0x41, 0x7d, 0xf7, 0xe0, 0x53, 0xd2, 0x61, 0xdb, + 0x84, 0x69, 0xa1, 0x07, 0x87, 0x6d, 0x38, 0x40, 0x45, 0x3b, 0x50, 0xa2, 0x36, 0xe9, 0xc8, 0xb1, + 0xbb, 0x3f, 0xa4, 0x1b, 0x81, 0x65, 0x6d, 0x9b, 0x74, 0xc2, 0xc9, 0xe0, 0x5f, 0x58, 0xe0, 0xa0, + 0x67, 0x30, 0x49, 0xc5, 0x2c, 0x57, 0x8b, 0xa9, 0xd9, 0xb8, 0x18, 0xd1, 0xf3, 0x8d, 0x60, 0xb9, + 0x7a, 0xdf, 0x58, 0xa2, 0xa9, 0xff, 0x59, 0x00, 0x14, 0xf0, 0xae, 0x59, 0x66, 0x57, 0x67, 0xba, + 0x65, 0xa2, 0x0f, 0xa0, 0xc4, 0x06, 0xb6, 0xef, 0x1d, 0x77, 0x7d, 0x83, 0xf6, 0x06, 0x36, 0x79, + 0x7e, 0x56, 0x5b, 0x4e, 0x4b, 0x70, 0x0a, 0x16, 0x32, 0x68, 0x2b, 0x30, 0xb5, 0x20, 0xa4, 0xdf, + 0x89, 0xab, 0x7e, 0x7e, 0x56, 0xcb, 0x08, 0xc7, 0xf5, 0x00, 0x29, 0x6e, 0x20, 0x3a, 0x01, 0x64, + 0x68, 0x94, 0xed, 0x39, 0x9a, 0x49, 0x3d, 0x4d, 0x7a, 0x9f, 0xc8, 0x41, 0x78, 0x63, 0xb4, 0x49, + 0xe3, 0x12, 0xcd, 0x5b, 0xd2, 0x0a, 0xb4, 0x95, 0x42, 0xc3, 0x19, 0x1a, 0x78, 0xbc, 0x73, 0x88, + 0x46, 0x2d, 0xb3, 0x5a, 0x8a, 0xc7, 0x3b, 0x2c, 0x5a, 0xb1, 0xa4, 0xa2, 0xd7, 0xa1, 0xdc, 0x27, + 0x94, 0x6a, 0x3d, 0x52, 0x9d, 0x10, 0x8c, 0x73, 0x92, 0xb1, 0xbc, 0xed, 0x35, 0x63, 0x9f, 0xae, + 0xfe, 0x58, 0x81, 0x99, 0x60, 0xe4, 0x84, 0xb7, 0xff, 0x66, 0xca, 0x0f, 0xeb, 0xa3, 0x75, 0x89, + 0x4b, 0x0b, 0x2f, 0x0c, 0xa2, 0xa2, 0xdf, 0x12, 0xf1, 0xc1, 0x6d, 0x7f, 0x2d, 0x15, 0xc4, 0x5a, + 0xba, 0x37, 0xaa, 0xcb, 0xe4, 0x2c, 0xa1, 0x3f, 0x2b, 0x45, 0xcc, 0xe7, 0xae, 0x89, 0x3e, 0x86, + 0x0a, 0x25, 0x06, 0xe9, 0x30, 0xcb, 0x91, 0xe6, 0xbf, 0x3d, 0xa2, 0xf9, 0xda, 0x01, 0x31, 0xda, + 0x52, 0xb4, 0x79, 0x9d, 0xdb, 0xef, 0x7f, 0xe1, 0x00, 0x12, 0x7d, 0x08, 0x15, 0x46, 0xfa, 0xb6, + 0xa1, 0x31, 0x3f, 0x06, 0xbd, 0x16, 0xed, 0x02, 0xf7, 0x1c, 0x0e, 0xd6, 0xb2, 0xba, 0x7b, 0x92, + 0x4d, 0x2c, 0x9f, 0x60, 0x48, 0xfc, 0x56, 0x1c, 0xc0, 0xa0, 0x13, 0x98, 0x75, 0xed, 0x2e, 0xe7, + 0x64, 0x3c, 0xe3, 0xf5, 0x06, 0xd2, 0x93, 0xde, 0x1b, 0x75, 0x6c, 0xf6, 0x63, 0xd2, 0xcd, 0x65, + 0xa9, 0x6b, 0x36, 0xde, 0x8e, 0x13, 0x5a, 0xd0, 0x2a, 0xcc, 0xf5, 0x75, 0x93, 0x67, 0xae, 0x41, + 0x9b, 0x74, 0x2c, 0xb3, 0x4b, 0x85, 0x5b, 0x4d, 0x34, 0x6f, 0x4a, 0x80, 0xb9, 0xed, 0x38, 0x19, + 0x27, 0xf9, 0xd1, 0x77, 0x00, 0xf9, 0xdd, 0x78, 0xe2, 0x25, 0x6c, 0xdd, 0x32, 0x85, 0xcf, 0x15, + 0x43, 0xe7, 0xde, 0x4b, 0x71, 0xe0, 0x0c, 0x29, 0xb4, 0x05, 0x4b, 0x0e, 0x39, 0xd1, 0x79, 0x1f, + 0x9f, 0xea, 0x94, 0x59, 0xce, 0x60, 0x4b, 0xef, 0xeb, 0xac, 0x3a, 0x29, 0x6c, 0xaa, 0x9e, 0x9f, + 0xd5, 0x96, 0x70, 0x06, 0x1d, 0x67, 0x4a, 0xa9, 0x7f, 0x3e, 0x09, 0x73, 0x89, 0x78, 0x83, 0x9e, + 0xc1, 0x72, 0xc7, 0x4b, 0x4e, 0x3b, 0x6e, 0xff, 0x80, 0x38, 0xed, 0xce, 0x11, 0xe9, 0xba, 0x06, + 0xe9, 0x0a, 0x47, 0x99, 0x68, 0xae, 0x48, 0x8b, 0x97, 0xd7, 0x32, 0xb9, 0x70, 0x8e, 0x34, 0x1f, + 0x05, 0x53, 0x34, 0x6d, 0xeb, 0x94, 0x06, 0x98, 0x05, 0x81, 0x19, 0x8c, 0xc2, 0x4e, 0x8a, 0x03, + 0x67, 0x48, 0x71, 0x1b, 0xbb, 0x84, 0xea, 0x0e, 0xe9, 0x26, 0x6d, 0x2c, 0xc6, 0x6d, 0x5c, 0xcf, + 0xe4, 0xc2, 0x39, 0xd2, 0xe8, 0x5d, 0x98, 0xf6, 0xb4, 0x89, 0xf9, 0x93, 0x13, 0x1d, 0xa4, 0xc3, + 0x9d, 0x90, 0x84, 0xa3, 0x7c, 0xbc, 0x6b, 0xd6, 0x01, 0x25, 0xce, 0x09, 0xe9, 0xe6, 0x4f, 0xf0, + 0x6e, 0x8a, 0x03, 0x67, 0x48, 0xf1, 0xae, 0x79, 0x1e, 0x98, 0xea, 0xda, 0x64, 0xbc, 0x6b, 0xfb, + 0x99, 0x5c, 0x38, 0x47, 0x9a, 0xfb, 0xb1, 0x67, 0xf2, 0xea, 0x89, 0xa6, 0x1b, 0xda, 0x81, 0x41, + 0xaa, 0xe5, 0xb8, 0x1f, 0xef, 0xc4, 0xc9, 0x38, 0xc9, 0x8f, 0x9e, 0xc0, 0x82, 0xd7, 0xb4, 0x6f, + 0x6a, 0x01, 0x48, 0x45, 0x80, 0x7c, 0x4d, 0x82, 0x2c, 0xec, 0x24, 0x19, 0x70, 0x5a, 0x06, 0x7d, + 0x00, 0xb3, 0x1d, 0xcb, 0x30, 0x84, 0x3f, 0xae, 0x59, 0xae, 0xc9, 0xaa, 0x53, 0x02, 0x05, 0xf1, + 0xf5, 0xb8, 0x16, 0xa3, 0xe0, 0x04, 0x27, 0x22, 0x00, 0x1d, 0x3f, 0xe1, 0xd0, 0x2a, 0x8c, 0x54, + 0x6b, 0xa4, 0x93, 0x5e, 0x58, 0x03, 0x04, 0x4d, 0x14, 0x47, 0x80, 0xd5, 0x7f, 0x55, 0xe0, 0x66, + 0x4e, 0xe8, 0x40, 0xdf, 0x8a, 0xa5, 0xd8, 0x5f, 0x4e, 0xa4, 0xd8, 0x57, 0x72, 0xc4, 0x22, 0x79, + 0xd6, 0x84, 0x19, 0x87, 0xf7, 0xca, 0xec, 0x79, 0x2c, 0x32, 0x46, 0xbe, 0x3b, 0xa4, 0x1b, 0x38, + 0x2a, 0x13, 0xc6, 0xfc, 0x85, 0xf3, 0xb3, 0xda, 0x4c, 0x8c, 0x86, 0xe3, 0xf0, 0xea, 0x5f, 0x14, + 0x00, 0xd6, 0x89, 0x6d, 0x58, 0x83, 0x3e, 0x31, 0xaf, 0xa2, 0x86, 0xda, 0x8d, 0xd5, 0x50, 0x6f, + 0x0e, 0x9b, 0x9e, 0xc0, 0xb4, 0xdc, 0x22, 0xea, 0xd7, 0x13, 0x45, 0x54, 0x63, 0x74, 0xc8, 0x8b, + 0xab, 0xa8, 0x7f, 0x2f, 0xc2, 0x62, 0xc8, 0x1c, 0x96, 0x51, 0x8f, 0x62, 0x73, 0xfc, 0x4b, 0x89, + 0x39, 0xbe, 0x99, 0x21, 0xf2, 0xd2, 0xea, 0xa8, 0x17, 0x5f, 0xcf, 0xa0, 0x4f, 0x61, 0x96, 0x17, + 0x4e, 0x9e, 0x7b, 0x88, 0xb2, 0x6c, 0x72, 0xec, 0xb2, 0x2c, 0x48, 0xa0, 0x5b, 0x31, 0x24, 0x9c, + 0x40, 0xce, 0x29, 0x03, 0xcb, 0x2f, 0xbb, 0x0c, 0x54, 0x3f, 0x53, 0x60, 0x36, 0x9c, 0xa6, 0x2b, + 0x28, 0xda, 0x76, 0xe2, 0x45, 0xdb, 0xeb, 0x23, 0xbb, 0x68, 0x4e, 0xd5, 0xf6, 0xdf, 0xbc, 0xc0, + 0x0f, 0x98, 0xf8, 0x02, 0x3f, 0xd0, 0x3a, 0xc7, 0x23, 0x6c, 0xff, 0x7e, 0xa8, 0x00, 0x92, 0x59, + 0x60, 0xd5, 0x34, 0x2d, 0xa6, 0x79, 0xb1, 0xd2, 0x33, 0x6b, 0x73, 0x64, 0xb3, 0x7c, 0x8d, 0xf5, + 0xfd, 0x14, 0xd6, 0x63, 0x93, 0x39, 0x83, 0x70, 0x46, 0xd2, 0x0c, 0x38, 0xc3, 0x00, 0xa4, 0x01, + 0x38, 0x12, 0x73, 0xcf, 0x92, 0x0b, 0xf9, 0xcd, 0x11, 0x62, 0x1e, 0x17, 0x58, 0xb3, 0xcc, 0x43, + 0xbd, 0x17, 0x86, 0x1d, 0x1c, 0x00, 0xe1, 0x08, 0xe8, 0xad, 0xc7, 0x70, 0x33, 0xc7, 0x5a, 0x34, + 0x0f, 0xc5, 0x63, 0x32, 0xf0, 0x86, 0x0d, 0xf3, 0x9f, 0x68, 0x29, 0xba, 0x4d, 0x9e, 0x92, 0x3b, + 0xdc, 0x0f, 0x0a, 0xef, 0x2b, 0xea, 0x8f, 0x27, 0xa2, 0xbe, 0x23, 0x2a, 0xe6, 0x7b, 0x50, 0x71, + 0x88, 0x6d, 0xe8, 0x1d, 0x8d, 0xca, 0x42, 0xe8, 0xba, 0x77, 0xa4, 0xe1, 0xb5, 0xe1, 0x80, 0x1a, + 0xab, 0xad, 0x0b, 0x2f, 0xb7, 0xb6, 0x2e, 0xbe, 0x98, 0xda, 0xfa, 0xb7, 0xa0, 0x42, 0xfd, 0xaa, + 0xba, 0x24, 0x20, 0x1f, 0x8c, 0x11, 0x5f, 0x65, 0x41, 0x1d, 0x28, 0x08, 0x4a, 0xe9, 0x00, 0x34, + 0xab, 0x88, 0x9e, 0x18, 0xb3, 0x88, 0x7e, 0xa1, 0x85, 0x2f, 0x8f, 0xa9, 0xb6, 0xe6, 0x52, 0xd2, + 0x15, 0x81, 0xa8, 0x12, 0xc6, 0xd4, 0x96, 0x68, 0xc5, 0x92, 0x8a, 0x3e, 0x8e, 0xb9, 0x6c, 0xe5, + 0x32, 0x2e, 0x3b, 0x9b, 0xef, 0xae, 0x68, 0x1f, 0x6e, 0xda, 0x8e, 0xd5, 0x73, 0x08, 0xa5, 0xeb, + 0x44, 0xeb, 0x1a, 0xba, 0x49, 0xfc, 0xf1, 0xf1, 0x2a, 0xa2, 0x57, 0xce, 0xcf, 0x6a, 0x37, 0x5b, + 0xd9, 0x2c, 0x38, 0x4f, 0x56, 0xfd, 0xbc, 0x04, 0xf3, 0xc9, 0x0c, 0x98, 0x53, 0xa4, 0x2a, 0x97, + 0x2a, 0x52, 0xef, 0x47, 0x16, 0x83, 0x57, 0xc1, 0x47, 0xce, 0xf8, 0x52, 0x0b, 0x62, 0x15, 0xe6, + 0x64, 0x34, 0xf0, 0x89, 0xb2, 0x4c, 0x0f, 0x66, 0x7f, 0x3f, 0x4e, 0xc6, 0x49, 0x7e, 0x5e, 0x7a, + 0x86, 0x15, 0xa5, 0x0f, 0x52, 0x8a, 0x97, 0x9e, 0xab, 0x49, 0x06, 0x9c, 0x96, 0x41, 0xdb, 0xb0, + 0xe8, 0x9a, 0x69, 0x28, 0xcf, 0x1b, 0x5f, 0x91, 0x50, 0x8b, 0xfb, 0x69, 0x16, 0x9c, 0x25, 0x87, + 0x0e, 0x63, 0xd5, 0xe8, 0xa4, 0x88, 0xb0, 0x0f, 0x47, 0x5e, 0x3b, 0x23, 0x97, 0xa3, 0xe8, 0x11, + 0xcc, 0x38, 0x62, 0xdf, 0xe1, 0x1b, 0xec, 0xd5, 0xee, 0x37, 0xa4, 0xd8, 0x0c, 0x8e, 0x12, 0x71, + 0x9c, 0x37, 0xa3, 0xdc, 0xae, 0x8c, 0x5a, 0x6e, 0xab, 0xff, 0xac, 0x44, 0x93, 0x50, 0x50, 0x02, + 0x0f, 0x3b, 0x65, 0x4a, 0x49, 0x44, 0xaa, 0x23, 0x2b, 0xbb, 0xfa, 0x7d, 0x6f, 0xac, 0xea, 0x37, + 0x4c, 0x9e, 0xc3, 0xcb, 0xdf, 0x1f, 0x29, 0xb0, 0xbc, 0xd1, 0x7e, 0xe2, 0x58, 0xae, 0xed, 0x9b, + 0xb3, 0x6b, 0x7b, 0xe3, 0xfa, 0x0d, 0x28, 0x39, 0xae, 0xe1, 0xf7, 0xe3, 0x35, 0xbf, 0x1f, 0xd8, + 0x35, 0x78, 0x3f, 0x16, 0x13, 0x52, 0x5e, 0x27, 0xb8, 0x00, 0xda, 0x81, 0x49, 0x47, 0x33, 0x7b, + 0xc4, 0x4f, 0xab, 0x77, 0x87, 0x58, 0xbf, 0xb9, 0x8e, 0x39, 0x7b, 0xa4, 0x78, 0x13, 0xd2, 0x58, + 0xa2, 0xa8, 0x7f, 0xa4, 0xc0, 0xdc, 0xd3, 0xbd, 0xbd, 0xd6, 0xa6, 0x29, 0x56, 0xb4, 0x38, 0x7d, + 0xbf, 0x03, 0x25, 0x5b, 0x63, 0x47, 0xc9, 0x4c, 0xcf, 0x69, 0x58, 0x50, 0xd0, 0x77, 0xa1, 0xcc, + 0x23, 0x09, 0x31, 0xbb, 0x23, 0x96, 0xda, 0x12, 0xbe, 0xe9, 0x09, 0x85, 0x15, 0xa2, 0x6c, 0xc0, + 0x3e, 0x9c, 0x7a, 0x0c, 0x4b, 0x11, 0x73, 0xf8, 0x78, 0x88, 0x63, 0x60, 0xd4, 0x86, 0x09, 0xae, + 0xd9, 0x3f, 0xe5, 0x1d, 0x76, 0x98, 0x99, 0xe8, 0x52, 0x58, 0xe9, 0xf0, 0x2f, 0x8a, 0x3d, 0x2c, + 0x75, 0x1b, 0x66, 0xc4, 0x95, 0x83, 0xe5, 0x30, 0x31, 0x2c, 0xe8, 0x36, 0x14, 0xfb, 0xba, 0x29, + 0xf3, 0xec, 0xb4, 0x94, 0x29, 0xf2, 0x1c, 0xc1, 0xdb, 0x05, 0x59, 0x3b, 0x95, 0x91, 0x27, 0x24, + 0x6b, 0xa7, 0x98, 0xb7, 0xab, 0x4f, 0xa0, 0x2c, 0x87, 0x3b, 0x0a, 0x54, 0xbc, 0x18, 0xa8, 0x98, + 0x01, 0xb4, 0x0b, 0xe5, 0xcd, 0x56, 0xd3, 0xb0, 0xbc, 0xaa, 0xab, 0xa3, 0x77, 0x9d, 0xe4, 0x5c, + 0xac, 0x6d, 0xae, 0x63, 0x2c, 0x28, 0x48, 0x85, 0x49, 0x72, 0xda, 0x21, 0x36, 0x13, 0x1e, 0x31, + 0xd5, 0x04, 0x3e, 0xcb, 0x8f, 0x45, 0x0b, 0x96, 0x14, 0xf5, 0x8f, 0x0b, 0x50, 0x96, 0xc3, 0x71, + 0x05, 0xbb, 0xb0, 0xad, 0xd8, 0x2e, 0xec, 0x8d, 0xd1, 0x5c, 0x23, 0x77, 0x0b, 0xb6, 0x97, 0xd8, + 0x82, 0xdd, 0x1f, 0x11, 0xef, 0xe2, 0xfd, 0xd7, 0x3f, 0x28, 0x30, 0x1b, 0x77, 0x4a, 0xf4, 0x2e, + 0x4c, 0xf3, 0x84, 0xa3, 0x77, 0xc8, 0x4e, 0x58, 0xe7, 0x06, 0x87, 0x30, 0xed, 0x90, 0x84, 0xa3, + 0x7c, 0xa8, 0x17, 0x88, 0x71, 0x3f, 0x92, 0x9d, 0xce, 0x1f, 0x52, 0x97, 0xe9, 0x46, 0xdd, 0xbb, + 0x46, 0xab, 0x6f, 0x9a, 0x6c, 0xd7, 0x69, 0x33, 0x47, 0x37, 0x7b, 0x29, 0x45, 0xc2, 0x29, 0xa3, + 0xc8, 0xea, 0x3f, 0x29, 0x30, 0x2d, 0x4d, 0xbe, 0x82, 0x5d, 0xc5, 0xaf, 0xc5, 0x77, 0x15, 0x77, + 0x47, 0x5c, 0xe0, 0xd9, 0x5b, 0x8a, 0xbf, 0x09, 0x4d, 0xe7, 0x4b, 0x9a, 0x7b, 0xf5, 0x91, 0x45, + 0x59, 0xd2, 0xab, 0xf9, 0x62, 0xc4, 0x82, 0x82, 0x5c, 0x98, 0xd7, 0x13, 0x31, 0x40, 0x0e, 0x6d, + 0x63, 0x34, 0x4b, 0x02, 0xb1, 0x66, 0x55, 0xc2, 0xcf, 0x27, 0x29, 0x38, 0xa5, 0x42, 0x25, 0x90, + 0xe2, 0x42, 0x1f, 0x42, 0xe9, 0x88, 0x31, 0x3b, 0xe3, 0xbc, 0x7a, 0x48, 0xe4, 0x09, 0x4d, 0xa8, + 0x88, 0xde, 0xed, 0xed, 0xb5, 0xb0, 0x80, 0x52, 0xff, 0x27, 0x1c, 0x8f, 0xb6, 0xe7, 0xe3, 0x41, + 0x3c, 0x55, 0x2e, 0x13, 0x4f, 0xa7, 0xb3, 0x62, 0x29, 0x7a, 0x0a, 0x45, 0x66, 0x8c, 0xba, 0x2d, + 0x94, 0x88, 0x7b, 0x5b, 0xed, 0x30, 0x20, 0xed, 0x6d, 0xb5, 0x31, 0x87, 0x40, 0xbb, 0x30, 0xc1, + 0xb3, 0x0f, 0x5f, 0x82, 0xc5, 0xd1, 0x97, 0x34, 0xef, 0x7f, 0xe8, 0x10, 0xfc, 0x8b, 0x62, 0x0f, + 0x47, 0xfd, 0x3e, 0xcc, 0xc4, 0xd6, 0x29, 0xfa, 0x04, 0xae, 0x1b, 0x96, 0xd6, 0x6d, 0x6a, 0x86, + 0x66, 0x76, 0x88, 0x7f, 0x39, 0x70, 0x37, 0x6b, 0x87, 0xb1, 0x15, 0xe1, 0x93, 0xab, 0x3c, 0xb8, + 0x4e, 0x8d, 0xd2, 0x70, 0x0c, 0x51, 0xd5, 0x00, 0xc2, 0x3e, 0xa2, 0x1a, 0x4c, 0x70, 0x3f, 0xf3, + 0xf2, 0xc9, 0x54, 0x73, 0x8a, 0x5b, 0xc8, 0xdd, 0x8f, 0x62, 0xaf, 0x1d, 0x3d, 0x04, 0xa0, 0xa4, + 0xe3, 0x10, 0x26, 0x82, 0x41, 0x21, 0x7e, 0x05, 0xdd, 0x0e, 0x28, 0x38, 0xc2, 0xa5, 0xfe, 0x8b, + 0x02, 0x33, 0x3b, 0x84, 0xfd, 0xc0, 0x72, 0x8e, 0x5b, 0x96, 0xa1, 0x77, 0x06, 0x57, 0x10, 0x6c, + 0x71, 0x2c, 0xd8, 0xbe, 0x35, 0x64, 0x66, 0x62, 0xd6, 0xe5, 0x85, 0x5c, 0xf5, 0x33, 0x05, 0x6e, + 0xc6, 0x38, 0x1f, 0x87, 0x4b, 0x77, 0x1f, 0x26, 0x6c, 0xcb, 0x61, 0x7e, 0x22, 0x1e, 0x4b, 0x21, + 0x0f, 0x63, 0x91, 0x54, 0xcc, 0x61, 0xb0, 0x87, 0x86, 0xb6, 0xa0, 0xc0, 0x2c, 0xe9, 0xaa, 0xe3, + 0x61, 0x12, 0xe2, 0x34, 0x41, 0x62, 0x16, 0xf6, 0x2c, 0x5c, 0x60, 0x16, 0x9f, 0x88, 0x6a, 0x8c, + 0x2b, 0x1a, 0x7c, 0x5e, 0x52, 0x0f, 0x30, 0x94, 0x0e, 0x1d, 0xab, 0x7f, 0xe9, 0x3e, 0x04, 0x13, + 0xb1, 0xe1, 0x58, 0x7d, 0x2c, 0xb0, 0xd4, 0x9f, 0x28, 0xb0, 0x10, 0xe3, 0xbc, 0x82, 0xc0, 0xff, + 0x61, 0x3c, 0xf0, 0xdf, 0x1f, 0xa7, 0x23, 0x39, 0xe1, 0xff, 0x27, 0x85, 0x44, 0x37, 0x78, 0x87, + 0xd1, 0x21, 0x4c, 0xdb, 0x56, 0xb7, 0xfd, 0x02, 0xae, 0x03, 0xe7, 0x78, 0xde, 0x6c, 0x85, 0x58, + 0x38, 0x0a, 0x8c, 0x4e, 0x61, 0xc1, 0xd4, 0xfa, 0x84, 0xda, 0x5a, 0x87, 0xb4, 0x5f, 0xc0, 0x01, + 0xc9, 0x0d, 0x71, 0xdf, 0x90, 0x44, 0xc4, 0x69, 0x25, 0x68, 0x1b, 0xca, 0xba, 0x2d, 0xea, 0x38, + 0x59, 0xbb, 0x0c, 0xcd, 0xa2, 0x5e, 0xd5, 0xe7, 0xc5, 0x73, 0xf9, 0x81, 0x7d, 0x0c, 0xf5, 0x6f, + 0x93, 0xde, 0xc0, 0xfd, 0x0f, 0x3d, 0x81, 0x8a, 0x78, 0x84, 0xd3, 0xb1, 0x0c, 0xff, 0x66, 0x80, + 0xcf, 0x6c, 0x4b, 0xb6, 0x3d, 0x3f, 0xab, 0xbd, 0x92, 0x71, 0xe8, 0xeb, 0x93, 0x71, 0x20, 0x8c, + 0x76, 0xa0, 0x64, 0x7f, 0x95, 0x0a, 0x46, 0x24, 0x39, 0x51, 0xb6, 0x08, 0x1c, 0xf5, 0xf7, 0x8a, + 0x09, 0x73, 0x45, 0xaa, 0xfb, 0xf4, 0x85, 0xcd, 0x7a, 0x50, 0x31, 0xe5, 0xce, 0xfc, 0x01, 0x94, + 0x65, 0x86, 0x97, 0xce, 0xfc, 0x8d, 0x71, 0x9c, 0x39, 0x9a, 0xc5, 0x82, 0x0d, 0x8b, 0xdf, 0xe8, + 0x03, 0xa3, 0xef, 0xc1, 0x24, 0xf1, 0x54, 0x78, 0xb9, 0xf1, 0xbd, 0x71, 0x54, 0x84, 0x71, 0x35, + 0x2c, 0x54, 0x65, 0x9b, 0x44, 0x45, 0xdf, 0xe2, 0xe3, 0xc5, 0x79, 0xf9, 0x26, 0x90, 0x56, 0x4b, + 0x22, 0x5d, 0xdd, 0xf6, 0xba, 0x1d, 0x34, 0x3f, 0x3f, 0xab, 0x41, 0xf8, 0x89, 0xa3, 0x12, 0xea, + 0xbf, 0x29, 0xb0, 0x20, 0x46, 0xa8, 0xe3, 0x3a, 0x3a, 0x1b, 0x5c, 0x59, 0x62, 0x7a, 0x16, 0x4b, + 0x4c, 0xef, 0x0c, 0x19, 0x96, 0x94, 0x85, 0xb9, 0xc9, 0xe9, 0xa7, 0x0a, 0xdc, 0x48, 0x71, 0x5f, + 0x41, 0x5c, 0xdc, 0x8f, 0xc7, 0xc5, 0xb7, 0xc6, 0xed, 0x50, 0x4e, 0x6c, 0xfc, 0xab, 0xb9, 0x8c, + 0xee, 0x88, 0x95, 0xf2, 0x10, 0xc0, 0x76, 0xf4, 0x13, 0xdd, 0x20, 0x3d, 0x79, 0x09, 0x5e, 0x89, + 0x3c, 0x82, 0x0b, 0x28, 0x38, 0xc2, 0x85, 0x28, 0x2c, 0x77, 0xc9, 0xa1, 0xe6, 0x1a, 0x6c, 0xb5, + 0xdb, 0x5d, 0xd3, 0x6c, 0xed, 0x40, 0x37, 0x74, 0xa6, 0xcb, 0xe3, 0x82, 0xa9, 0xe6, 0x23, 0xef, + 0x72, 0x3a, 0x8b, 0xe3, 0xf9, 0x59, 0xed, 0x76, 0xd6, 0xed, 0x90, 0xcf, 0x32, 0xc0, 0x39, 0xd0, + 0x68, 0x00, 0x55, 0x87, 0x7c, 0xdf, 0xd5, 0x1d, 0xd2, 0x5d, 0x77, 0x2c, 0x3b, 0xa6, 0xb6, 0x28, + 0xd4, 0xfe, 0xea, 0xf9, 0x59, 0xad, 0x8a, 0x73, 0x78, 0x86, 0x2b, 0xce, 0x85, 0x47, 0x9f, 0xc2, + 0xa2, 0xe6, 0xbd, 0x1d, 0x8c, 0x69, 0xf5, 0x56, 0xc9, 0xfb, 0xe7, 0x67, 0xb5, 0xc5, 0xd5, 0x34, + 0x79, 0xb8, 0xc2, 0x2c, 0x50, 0xd4, 0x80, 0xf2, 0x89, 0x78, 0xd9, 0x48, 0xab, 0x13, 0x02, 0x9f, + 0x27, 0x82, 0xb2, 0xf7, 0xd8, 0x91, 0x63, 0x4e, 0x6e, 0xb4, 0xc5, 0xea, 0xf3, 0xb9, 0xf8, 0x86, + 0x92, 0xd7, 0x92, 0x72, 0xc5, 0x8b, 0x13, 0xe3, 0x4a, 0x18, 0xb5, 0x9e, 0x86, 0x24, 0x1c, 0xe5, + 0x43, 0x1f, 0xc3, 0xd4, 0x91, 0x3c, 0x95, 0xa0, 0xd5, 0xf2, 0x48, 0x49, 0x38, 0x76, 0x8a, 0xd1, + 0x5c, 0x90, 0x2a, 0xa6, 0xfc, 0x66, 0x8a, 0x43, 0x44, 0xf4, 0x3a, 0x94, 0xc5, 0xc7, 0xe6, 0xba, + 0x38, 0x8e, 0xab, 0x84, 0xb1, 0xed, 0xa9, 0xd7, 0x8c, 0x7d, 0xba, 0xcf, 0xba, 0xd9, 0x5a, 0x13, + 0xc7, 0xc2, 0x09, 0xd6, 0xcd, 0xd6, 0x1a, 0xf6, 0xe9, 0xe8, 0x13, 0x28, 0x53, 0xb2, 0xa5, 0x9b, + 0xee, 0x69, 0x15, 0x46, 0xba, 0x54, 0x6e, 0x3f, 0x16, 0xdc, 0x89, 0x83, 0xb1, 0x50, 0x83, 0xa4, + 0x63, 0x1f, 0x16, 0x1d, 0xc1, 0x94, 0xe3, 0x9a, 0xab, 0x74, 0x9f, 0x12, 0xa7, 0x3a, 0x2d, 0x74, + 0x0c, 0x0b, 0xe7, 0xd8, 0xe7, 0x4f, 0x6a, 0x09, 0x46, 0x28, 0xe0, 0xc0, 0x21, 0x38, 0xfa, 0x43, + 0x05, 0x10, 0x75, 0x6d, 0xdb, 0x20, 0x7d, 0x62, 0x32, 0xcd, 0x10, 0x67, 0x71, 0xb4, 0x7a, 0x5d, + 0xe8, 0xfc, 0xf6, 0xb0, 0x7e, 0xa5, 0x04, 0x93, 0xca, 0x83, 0x43, 0xef, 0x34, 0x2b, 0xce, 0xd0, + 0xcb, 0x87, 0xf6, 0x90, 0x8a, 0xdf, 0xd5, 0x99, 0x91, 0x86, 0x36, 0xfb, 0xcc, 0x31, 0x1c, 0x5a, + 0x49, 0xc7, 0x3e, 0x2c, 0x7a, 0x06, 0xcb, 0xfe, 0xc3, 0x58, 0x6c, 0x59, 0x6c, 0x43, 0x37, 0x08, + 0x1d, 0x50, 0x46, 0xfa, 0xd5, 0x59, 0x31, 0xed, 0xc1, 0xdb, 0x0f, 0x9c, 0xc9, 0x85, 0x73, 0xa4, + 0x51, 0x1f, 0x6a, 0x7e, 0xc8, 0xe0, 0xeb, 0x29, 0x88, 0x59, 0x8f, 0x69, 0x47, 0x33, 0xbc, 0x7b, + 0x80, 0x39, 0xa1, 0xe0, 0xb5, 0xf3, 0xb3, 0x5a, 0x6d, 0xfd, 0x62, 0x56, 0x3c, 0x0c, 0x0b, 0x7d, + 0x17, 0xaa, 0x5a, 0x9e, 0x9e, 0x79, 0xa1, 0xe7, 0x55, 0x1e, 0x87, 0x72, 0x15, 0xe4, 0x4a, 0x23, + 0x06, 0xf3, 0x5a, 0xfc, 0x89, 0x32, 0xad, 0x2e, 0x8c, 0x74, 0x10, 0x99, 0x78, 0xd9, 0x1c, 0x1e, + 0x46, 0x24, 0x08, 0x14, 0xa7, 0x34, 0xa0, 0xdf, 0x06, 0xa4, 0x25, 0x5f, 0x55, 0xd3, 0x2a, 0x1a, + 0x29, 0xfd, 0xa4, 0x9e, 0x63, 0x87, 0x6e, 0x97, 0x22, 0x51, 0x9c, 0xa1, 0x07, 0x6d, 0xc1, 0x92, + 0x6c, 0xdd, 0x37, 0xa9, 0x76, 0x48, 0xda, 0x03, 0xda, 0x61, 0x06, 0xad, 0x2e, 0x8a, 0xd8, 0x27, + 0x2e, 0xbe, 0x56, 0x33, 0xe8, 0x38, 0x53, 0x0a, 0x7d, 0x1b, 0xe6, 0x0f, 0x2d, 0xe7, 0x40, 0xef, + 0x76, 0x89, 0xe9, 0x23, 0x2d, 0x09, 0xa4, 0x25, 0x3e, 0x1a, 0x1b, 0x09, 0x1a, 0x4e, 0x71, 0x23, + 0x0a, 0x37, 0x24, 0x72, 0xcb, 0xb1, 0x3a, 0xdb, 0x96, 0x6b, 0x32, 0xaf, 0x24, 0xba, 0x11, 0xa4, + 0x98, 0x1b, 0xab, 0x59, 0x0c, 0xcf, 0xcf, 0x6a, 0x77, 0xb2, 0x2b, 0xe0, 0x90, 0x09, 0x67, 0x63, + 0x8b, 0x17, 0x2c, 0xf2, 0x3e, 0xe3, 0x6a, 0x5e, 0x01, 0x8f, 0xf7, 0x82, 0x25, 0x34, 0xed, 0x85, + 0xbd, 0x60, 0x89, 0x40, 0x5e, 0x7c, 0x82, 0xfa, 0x5f, 0x05, 0x58, 0x0c, 0x99, 0x47, 0x7e, 0xc1, + 0x92, 0x21, 0xf2, 0x8b, 0x97, 0xc0, 0xc3, 0x5f, 0x02, 0x7f, 0xa6, 0xc0, 0x6c, 0x38, 0x74, 0xff, + 0xf7, 0x5e, 0x95, 0x84, 0xb6, 0xe5, 0xd4, 0xb9, 0x7f, 0x5f, 0x88, 0x76, 0xe0, 0xff, 0xfd, 0xd3, + 0x86, 0xaf, 0xfe, 0x7c, 0x57, 0xfd, 0x69, 0x11, 0xe6, 0x93, 0xab, 0x31, 0x76, 0x03, 0xae, 0x0c, + 0xbd, 0x01, 0x6f, 0xc1, 0xd2, 0xa1, 0x6b, 0x18, 0x03, 0x31, 0x0c, 0x91, 0x6b, 0x70, 0xef, 0x06, + 0xeb, 0x55, 0x29, 0xb9, 0xb4, 0x91, 0xc1, 0x83, 0x33, 0x25, 0x73, 0x6e, 0xf3, 0x8b, 0x97, 0xba, + 0xcd, 0x4f, 0x5d, 0x2e, 0x97, 0xc6, 0xb8, 0x5c, 0xce, 0xbc, 0x99, 0x9f, 0xb8, 0xc4, 0xcd, 0xfc, + 0x65, 0xae, 0xd2, 0x33, 0x82, 0xd8, 0xd0, 0x97, 0x9d, 0xaf, 0xc2, 0x2d, 0x29, 0xc6, 0xc4, 0x2d, + 0xb7, 0xc9, 0x1c, 0xcb, 0x30, 0x88, 0xb3, 0xee, 0xf6, 0xfb, 0x03, 0xf5, 0x9b, 0x30, 0x1b, 0x7f, + 0xbf, 0xe1, 0xcd, 0xb4, 0xf7, 0x84, 0x44, 0xde, 0x23, 0x46, 0x66, 0xda, 0x6b, 0xc7, 0x01, 0x87, + 0xfa, 0xfb, 0x0a, 0x2c, 0x67, 0xbf, 0xd3, 0x44, 0x06, 0xcc, 0xf6, 0xb5, 0xd3, 0xe8, 0xdb, 0x59, + 0xe5, 0x92, 0x27, 0x3c, 0xe2, 0xe2, 0x7e, 0x3b, 0x86, 0x85, 0x13, 0xd8, 0xea, 0x97, 0x0a, 0xdc, + 0xcc, 0xb9, 0x32, 0xbf, 0x5a, 0x4b, 0xd0, 0x47, 0x50, 0xe9, 0x6b, 0xa7, 0x6d, 0xd7, 0xe9, 0x91, + 0x4b, 0x9f, 0x69, 0x89, 0x88, 0xb1, 0x2d, 0x51, 0x70, 0x80, 0xa7, 0xfe, 0x48, 0x81, 0x6a, 0xde, + 0xee, 0x02, 0xbd, 0x1b, 0xbb, 0xdc, 0xff, 0x7a, 0xe2, 0x72, 0x7f, 0x21, 0x25, 0xf7, 0x92, 0xae, + 0xf6, 0xff, 0x4e, 0x81, 0xe5, 0xec, 0x5d, 0x16, 0x7a, 0x3b, 0x66, 0x61, 0x2d, 0x61, 0xe1, 0x5c, + 0x42, 0x4a, 0xda, 0xf7, 0x3d, 0x98, 0x95, 0x7b, 0x31, 0x09, 0x23, 0x47, 0x55, 0xcd, 0x8a, 0x95, + 0x12, 0xc2, 0xdf, 0x7b, 0x88, 0xf9, 0x8a, 0xb7, 0xe1, 0x04, 0x9a, 0xfa, 0x07, 0x05, 0x98, 0x68, + 0x77, 0x34, 0x83, 0x5c, 0x41, 0x99, 0xf5, 0x9d, 0x58, 0x99, 0x35, 0xec, 0x7f, 0x2e, 0xc2, 0xaa, + 0xdc, 0x0a, 0x0b, 0x27, 0x2a, 0xac, 0x37, 0x46, 0x42, 0xbb, 0xb8, 0xb8, 0xfa, 0x15, 0x98, 0x0a, + 0x94, 0x8e, 0x17, 0xf3, 0xd5, 0xbf, 0x2e, 0xc0, 0x74, 0x44, 0xc5, 0x98, 0x19, 0xe3, 0x30, 0x96, + 0x69, 0x47, 0xf9, 0x77, 0x61, 0x44, 0x57, 0xdd, 0xcf, 0xad, 0xde, 0x3b, 0xcd, 0xf0, 0x65, 0x5e, + 0x3a, 0xe5, 0x7e, 0x13, 0x66, 0x99, 0xf8, 0xf7, 0x5d, 0x70, 0x12, 0x5c, 0x14, 0xbe, 0x18, 0xbc, + 0xee, 0xdd, 0x8b, 0x51, 0x71, 0x82, 0xfb, 0xd6, 0x23, 0x98, 0x89, 0x29, 0x1b, 0xeb, 0x99, 0xe5, + 0x3f, 0x2a, 0xf0, 0xf5, 0xa1, 0xfb, 0x74, 0xd4, 0x8c, 0x2d, 0x92, 0x7a, 0x62, 0x91, 0xac, 0xe4, + 0x03, 0xbc, 0xbc, 0xe7, 0x3a, 0xcd, 0x37, 0x3f, 0xff, 0x62, 0xe5, 0xda, 0xcf, 0xbe, 0x58, 0xb9, + 0xf6, 0xf3, 0x2f, 0x56, 0xae, 0xfd, 0xee, 0xf9, 0x8a, 0xf2, 0xf9, 0xf9, 0x8a, 0xf2, 0xb3, 0xf3, + 0x15, 0xe5, 0xe7, 0xe7, 0x2b, 0xca, 0x7f, 0x9c, 0xaf, 0x28, 0x7f, 0xf2, 0xe5, 0xca, 0xb5, 0x8f, + 0xca, 0x12, 0xee, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xa7, 0xd7, 0xb5, 0x56, 0x5c, 0x3d, 0x00, + 0x00, } diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.proto b/vendor/k8s.io/api/extensions/v1beta1/generated.proto index 3a87fbe5..1a9b7ebb 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.proto +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.proto @@ -22,7 +22,6 @@ syntax = 'proto2'; package k8s.io.api.extensions.v1beta1; import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/api/policy/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; @@ -353,8 +352,8 @@ message DeploymentSpec { // is considered to be failed. The deployment controller will continue to // process failed deployments and a condition with a ProgressDeadlineExceeded // reason will be surfaced in the deployment status. Note that progress will - // not be estimated during the time a deployment is paused. This is not set - // by default. + // not be estimated during the time a deployment is paused. This is set to + // the max value of int32 (i.e. 2147483647) by default, which means "no deadline". // +optional optional int32 progressDeadlineSeconds = 9; } @@ -713,7 +712,7 @@ message NetworkPolicyPeer { // DEPRECATED 1.9 - This group version of NetworkPolicyPort is deprecated by networking/v1/NetworkPolicyPort. message NetworkPolicyPort { - // Optional. The protocol (TCP or UDP) which traffic must match. + // Optional. The protocol (TCP, UDP, or SCTP) which traffic must match. // If not specified, this field defaults to TCP. // +optional optional string protocol = 1; @@ -903,6 +902,12 @@ message PodSecurityPolicySpec { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional repeated string forbiddenSysctls = 20; + + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. + // +optional + repeated string allowedProcMountTypes = 21; } // DEPRECATED - This group version of ReplicaSet is deprecated by apps/v1beta2/ReplicaSet. See the release notes for diff --git a/vendor/k8s.io/api/extensions/v1beta1/types.go b/vendor/k8s.io/api/extensions/v1beta1/types.go index 3a86ef43..38e112d1 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types.go @@ -168,8 +168,8 @@ type DeploymentSpec struct { // is considered to be failed. The deployment controller will continue to // process failed deployments and a condition with a ProgressDeadlineExceeded // reason will be surfaced in the deployment status. Note that progress will - // not be estimated during the time a deployment is paused. This is not set - // by default. + // not be estimated during the time a deployment is paused. This is set to + // the max value of int32 (i.e. 2147483647) by default, which means "no deadline". // +optional ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty" protobuf:"varint,9,opt,name=progressDeadlineSeconds"` } @@ -965,6 +965,11 @@ type PodSecurityPolicySpec struct { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. + // +optional + AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty" protobuf:"bytes,21,opt,name=allowedProcMountTypes"` } // AllowedHostPath defines the host volume conditions that will be enabled by a policy @@ -1275,7 +1280,7 @@ type NetworkPolicyEgressRule struct { // DEPRECATED 1.9 - This group version of NetworkPolicyPort is deprecated by networking/v1/NetworkPolicyPort. type NetworkPolicyPort struct { - // Optional. The protocol (TCP or UDP) which traffic must match. + // Optional. The protocol (TCP, UDP, or SCTP) which traffic must match. // If not specified, this field defaults to TCP. // +optional Protocol *v1.Protocol `json:"protocol,omitempty" protobuf:"bytes,1,opt,name=protocol,casttype=k8s.io/api/core/v1.Protocol"` diff --git a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index d261b424..cdbc490a 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -196,7 +196,7 @@ var map_DeploymentSpec = map[string]string{ "revisionHistoryLimit": "The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified.", "paused": "Indicates that the deployment is paused and will not be processed by the deployment controller.", "rollbackTo": "DEPRECATED. The config this deployment is rolling back to. Will be cleared after rollback is done.", - "progressDeadlineSeconds": "The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. This is not set by default.", + "progressDeadlineSeconds": "The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. This is set to the max value of int32 (i.e. 2147483647) by default, which means \"no deadline\".", } func (DeploymentSpec) SwaggerDoc() map[string]string { @@ -419,7 +419,7 @@ func (NetworkPolicyPeer) SwaggerDoc() map[string]string { var map_NetworkPolicyPort = map[string]string{ "": "DEPRECATED 1.9 - This group version of NetworkPolicyPort is deprecated by networking/v1/NetworkPolicyPort.", - "protocol": "Optional. The protocol (TCP or UDP) which traffic must match. If not specified, this field defaults to TCP.", + "protocol": "Optional. The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.", "port": "If specified, the port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers. If present, only traffic on the specified protocol AND port will be matched.", } @@ -481,6 +481,7 @@ var map_PodSecurityPolicySpec = map[string]string{ "allowedFlexVolumes": "allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", + "allowedProcMountTypes": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", } func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index 8ec2b1ff..65801c23 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1beta1 import ( - core_v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" intstr "k8s.io/apimachinery/pkg/util/intstr" @@ -222,23 +222,15 @@ func (in *DaemonSetSpec) DeepCopyInto(out *DaemonSetSpec) { *out = *in if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) in.UpdateStrategy.DeepCopyInto(&out.UpdateStrategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -258,12 +250,8 @@ func (in *DaemonSetStatus) DeepCopyInto(out *DaemonSetStatus) { *out = *in if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -290,12 +278,8 @@ func (in *DaemonSetUpdateStrategy) DeepCopyInto(out *DaemonSetUpdateStrategy) { *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateDaemonSet) - (*in).DeepCopyInto(*out) - } + *out = new(RollingUpdateDaemonSet) + (*in).DeepCopyInto(*out) } return } @@ -427,50 +411,30 @@ func (in *DeploymentSpec) DeepCopyInto(out *DeploymentSpec) { *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) in.Strategy.DeepCopyInto(&out.Strategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.RollbackTo != nil { in, out := &in.RollbackTo, &out.RollbackTo - if *in == nil { - *out = nil - } else { - *out = new(RollbackConfig) - **out = **in - } + *out = new(RollbackConfig) + **out = **in } if in.ProgressDeadlineSeconds != nil { in, out := &in.ProgressDeadlineSeconds, &out.ProgressDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -497,12 +461,8 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { } if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -522,12 +482,8 @@ func (in *DeploymentStrategy) DeepCopyInto(out *DeploymentStrategy) { *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateDeployment) - (*in).DeepCopyInto(*out) - } + *out = new(RollingUpdateDeployment) + (*in).DeepCopyInto(*out) } return } @@ -754,12 +710,8 @@ func (in *IngressRuleValue) DeepCopyInto(out *IngressRuleValue) { *out = *in if in.HTTP != nil { in, out := &in.HTTP, &out.HTTP - if *in == nil { - *out = nil - } else { - *out = new(HTTPIngressRuleValue) - (*in).DeepCopyInto(*out) - } + *out = new(HTTPIngressRuleValue) + (*in).DeepCopyInto(*out) } return } @@ -779,12 +731,8 @@ func (in *IngressSpec) DeepCopyInto(out *IngressSpec) { *out = *in if in.Backend != nil { in, out := &in.Backend, &out.Backend - if *in == nil { - *out = nil - } else { - *out = new(IngressBackend) - **out = **in - } + *out = new(IngressBackend) + **out = **in } if in.TLS != nil { in, out := &in.TLS, &out.TLS @@ -976,30 +924,18 @@ func (in *NetworkPolicyPeer) DeepCopyInto(out *NetworkPolicyPeer) { *out = *in if in.PodSelector != nil { in, out := &in.PodSelector, &out.PodSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.NamespaceSelector != nil { in, out := &in.NamespaceSelector, &out.NamespaceSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.IPBlock != nil { in, out := &in.IPBlock, &out.IPBlock - if *in == nil { - *out = nil - } else { - *out = new(IPBlock) - (*in).DeepCopyInto(*out) - } + *out = new(IPBlock) + (*in).DeepCopyInto(*out) } return } @@ -1019,21 +955,13 @@ func (in *NetworkPolicyPort) DeepCopyInto(out *NetworkPolicyPort) { *out = *in if in.Protocol != nil { in, out := &in.Protocol, &out.Protocol - if *in == nil { - *out = nil - } else { - *out = new(core_v1.Protocol) - **out = **in - } + *out = new(corev1.Protocol) + **out = **in } if in.Port != nil { in, out := &in.Port, &out.Port - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -1149,17 +1077,17 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = *in if in.DefaultAddCapabilities != nil { in, out := &in.DefaultAddCapabilities, &out.DefaultAddCapabilities - *out = make([]core_v1.Capability, len(*in)) + *out = make([]corev1.Capability, len(*in)) copy(*out, *in) } if in.RequiredDropCapabilities != nil { in, out := &in.RequiredDropCapabilities, &out.RequiredDropCapabilities - *out = make([]core_v1.Capability, len(*in)) + *out = make([]corev1.Capability, len(*in)) copy(*out, *in) } if in.AllowedCapabilities != nil { in, out := &in.AllowedCapabilities, &out.AllowedCapabilities - *out = make([]core_v1.Capability, len(*in)) + *out = make([]corev1.Capability, len(*in)) copy(*out, *in) } if in.Volumes != nil { @@ -1178,21 +1106,13 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { in.FSGroup.DeepCopyInto(&out.FSGroup) if in.DefaultAllowPrivilegeEscalation != nil { in, out := &in.DefaultAllowPrivilegeEscalation, &out.DefaultAllowPrivilegeEscalation - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.AllowPrivilegeEscalation != nil { in, out := &in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.AllowedHostPaths != nil { in, out := &in.AllowedHostPaths, &out.AllowedHostPaths @@ -1214,6 +1134,11 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowedProcMountTypes != nil { + in, out := &in.AllowedProcMountTypes, &out.AllowedProcMountTypes + *out = make([]corev1.ProcMountType, len(*in)) + copy(*out, *in) + } return } @@ -1310,21 +1235,13 @@ func (in *ReplicaSetSpec) DeepCopyInto(out *ReplicaSetSpec) { *out = *in if in.Replicas != nil { in, out := &in.Replicas, &out.Replicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) return @@ -1409,12 +1326,8 @@ func (in *RollingUpdateDaemonSet) DeepCopyInto(out *RollingUpdateDaemonSet) { *out = *in if in.MaxUnavailable != nil { in, out := &in.MaxUnavailable, &out.MaxUnavailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -1434,21 +1347,13 @@ func (in *RollingUpdateDeployment) DeepCopyInto(out *RollingUpdateDeployment) { *out = *in if in.MaxUnavailable != nil { in, out := &in.MaxUnavailable, &out.MaxUnavailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } if in.MaxSurge != nil { in, out := &in.MaxSurge, &out.MaxSurge - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -1489,12 +1394,8 @@ func (in *SELinuxStrategyOptions) DeepCopyInto(out *SELinuxStrategyOptions) { *out = *in if in.SELinuxOptions != nil { in, out := &in.SELinuxOptions, &out.SELinuxOptions - if *in == nil { - *out = nil - } else { - *out = new(core_v1.SELinuxOptions) - **out = **in - } + *out = new(corev1.SELinuxOptions) + **out = **in } return } diff --git a/vendor/k8s.io/api/networking/v1/BUILD b/vendor/k8s.io/api/networking/v1/BUILD index beb3afca..4064c41e 100644 --- a/vendor/k8s.io/api/networking/v1/BUILD +++ b/vendor/k8s.io/api/networking/v1/BUILD @@ -15,14 +15,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/networking/v1", importpath = "k8s.io/api/networking/v1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -38,9 +39,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/networking/v1/generated.pb.go b/vendor/k8s.io/api/networking/v1/generated.pb.go index 089d3196..7b1c04b2 100644 --- a/vendor/k8s.io/api/networking/v1/generated.pb.go +++ b/vendor/k8s.io/api/networking/v1/generated.pb.go @@ -1813,57 +1813,56 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 829 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0x4d, 0x6f, 0x1b, 0x45, - 0x18, 0xf6, 0x3a, 0xce, 0x47, 0x27, 0x94, 0x92, 0x41, 0x08, 0x2b, 0x88, 0x75, 0xd8, 0x0b, 0x41, - 0x55, 0x67, 0x71, 0x8b, 0x10, 0x37, 0xc4, 0x42, 0x29, 0x96, 0x9a, 0xc4, 0x9a, 0xf4, 0x02, 0x02, - 0x89, 0xf5, 0xfa, 0xcd, 0x66, 0x6a, 0xef, 0xce, 0x6a, 0x66, 0x6c, 0x92, 0x1b, 0x3f, 0x81, 0x1f, - 0xc2, 0x91, 0x1b, 0x87, 0x72, 0xcc, 0xb1, 0xc7, 0x9e, 0x56, 0x64, 0xf9, 0x17, 0x39, 0xa1, 0x99, - 0x1d, 0x7b, 0xfd, 0x51, 0x0b, 0xb7, 0xa2, 0x37, 0xcf, 0x3b, 0xcf, 0xf3, 0xbc, 0x1f, 0xf3, 0xf8, - 0x5d, 0xf4, 0xd5, 0xe0, 0x0b, 0x49, 0x18, 0xf7, 0x07, 0xa3, 0x1e, 0x88, 0x14, 0x14, 0x48, 0x7f, - 0x0c, 0x69, 0x9f, 0x0b, 0xdf, 0x5e, 0x84, 0x19, 0xf3, 0x53, 0x50, 0xbf, 0x70, 0x31, 0x60, 0x69, - 0xec, 0x8f, 0xdb, 0x7e, 0x0c, 0x29, 0x88, 0x50, 0x41, 0x9f, 0x64, 0x82, 0x2b, 0x8e, 0x9b, 0x25, - 0x92, 0x84, 0x19, 0x23, 0x15, 0x92, 0x8c, 0xdb, 0xfb, 0xf7, 0x62, 0xa6, 0xce, 0x47, 0x3d, 0x12, - 0xf1, 0xc4, 0x8f, 0x79, 0xcc, 0x7d, 0x43, 0xe8, 0x8d, 0xce, 0xcc, 0xc9, 0x1c, 0xcc, 0xaf, 0x52, - 0x68, 0xdf, 0x9b, 0x49, 0x19, 0x71, 0x01, 0x2f, 0x49, 0xb6, 0x7f, 0x6f, 0x06, 0x03, 0x17, 0x0a, - 0x52, 0xc9, 0x78, 0x2a, 0xfd, 0x71, 0xbb, 0x07, 0x2a, 0x5c, 0x86, 0x7f, 0x32, 0x03, 0xcf, 0xf8, - 0x90, 0x45, 0x97, 0x2b, 0xa1, 0x9f, 0x55, 0xd0, 0x24, 0x8c, 0xce, 0x59, 0x0a, 0xe2, 0xd2, 0xcf, - 0x06, 0xb1, 0x0e, 0x48, 0x3f, 0x01, 0x15, 0xbe, 0xac, 0x1e, 0x7f, 0x15, 0x4b, 0x8c, 0x52, 0xc5, - 0x12, 0x58, 0x22, 0x7c, 0xfe, 0x5f, 0x04, 0x19, 0x9d, 0x43, 0x12, 0x2e, 0xf1, 0x1e, 0xac, 0xe2, - 0x8d, 0x14, 0x1b, 0xfa, 0x2c, 0x55, 0x52, 0x89, 0x45, 0x92, 0x77, 0x82, 0xb6, 0x3b, 0xdd, 0x60, - 0xc8, 0xa3, 0x01, 0x3e, 0x40, 0x8d, 0x88, 0xf5, 0x45, 0xd3, 0x39, 0x70, 0x0e, 0x6f, 0x05, 0x6f, - 0x5d, 0xe5, 0xad, 0x5a, 0x91, 0xb7, 0x1a, 0x5f, 0x77, 0xbe, 0xa1, 0xd4, 0xdc, 0x60, 0x0f, 0x6d, - 0xc1, 0x45, 0x04, 0x99, 0x6a, 0xd6, 0x0f, 0x36, 0x0e, 0x6f, 0x05, 0xa8, 0xc8, 0x5b, 0x5b, 0x0f, - 0x4d, 0x84, 0xda, 0x1b, 0xef, 0x2f, 0x07, 0xdd, 0x3e, 0x2e, 0xdf, 0xb8, 0x6b, 0xc6, 0x89, 0x7f, - 0x46, 0x3b, 0x7a, 0x36, 0xfd, 0x50, 0x85, 0x46, 0x7b, 0xf7, 0xfe, 0xa7, 0xa4, 0x32, 0xc4, 0xb4, - 0x54, 0x92, 0x0d, 0x62, 0x1d, 0x90, 0x44, 0xa3, 0xc9, 0xb8, 0x4d, 0x4e, 0x7a, 0x4f, 0x21, 0x52, - 0x47, 0xa0, 0xc2, 0x00, 0xdb, 0x6a, 0x50, 0x15, 0xa3, 0x53, 0x55, 0x7c, 0x84, 0x1a, 0x32, 0x83, - 0xa8, 0x59, 0x37, 0xea, 0x77, 0xc9, 0x2a, 0xbb, 0x91, 0xb9, 0xc2, 0x4e, 0x33, 0x88, 0xaa, 0x36, - 0xf5, 0x89, 0x1a, 0x19, 0xef, 0x0f, 0x07, 0xbd, 0x3f, 0x87, 0x7c, 0x18, 0x0b, 0x90, 0x92, 0x8e, - 0x86, 0x80, 0xbb, 0x68, 0x33, 0xe3, 0x42, 0xc9, 0xa6, 0x73, 0xb0, 0xf1, 0x0a, 0xb9, 0xba, 0x5c, - 0xa8, 0xe0, 0xb6, 0xcd, 0xb5, 0xa9, 0x4f, 0x92, 0x96, 0x42, 0xf8, 0x11, 0xaa, 0x2b, 0x6e, 0x06, - 0xfa, 0x0a, 0x72, 0x00, 0x22, 0x40, 0x56, 0xae, 0xfe, 0x84, 0xd3, 0xba, 0xe2, 0xde, 0x9f, 0x0e, - 0x6a, 0xce, 0xa1, 0x3a, 0xe9, 0x9b, 0xac, 0xfb, 0x08, 0x35, 0xce, 0x04, 0x4f, 0x5e, 0xa7, 0xf2, - 0xe9, 0xd0, 0xbf, 0x15, 0x3c, 0xa1, 0x46, 0xc6, 0x7b, 0xe6, 0xa0, 0xbd, 0x39, 0xe4, 0x63, 0x26, - 0x15, 0xfe, 0x71, 0xc9, 0x3b, 0x64, 0x3d, 0xef, 0x68, 0xb6, 0x71, 0xce, 0x3b, 0x36, 0xd7, 0xce, - 0x24, 0x32, 0xe3, 0x9b, 0xc7, 0x68, 0x93, 0x29, 0x48, 0xa4, 0xed, 0xe1, 0xe3, 0x35, 0x7b, 0xa8, - 0x06, 0xd2, 0xd1, 0x6c, 0x5a, 0x8a, 0x78, 0xcf, 0xea, 0x0b, 0x1d, 0xe8, 0x5e, 0xf1, 0x19, 0xda, - 0xcd, 0x78, 0xff, 0x14, 0x86, 0x10, 0x29, 0x2e, 0x6c, 0x13, 0x0f, 0xd6, 0x6c, 0x22, 0xec, 0xc1, - 0x70, 0x42, 0x0d, 0xee, 0x14, 0x79, 0x6b, 0xb7, 0x5b, 0x69, 0xd1, 0x59, 0x61, 0x7c, 0x81, 0xf6, - 0xd2, 0x30, 0x01, 0x99, 0x85, 0x11, 0x4c, 0xb3, 0xd5, 0x5f, 0x3f, 0xdb, 0x7b, 0x45, 0xde, 0xda, - 0x3b, 0x5e, 0x54, 0xa4, 0xcb, 0x49, 0xf0, 0x77, 0x68, 0x9b, 0x65, 0x66, 0x85, 0x34, 0x37, 0x4c, - 0xbe, 0x8f, 0x56, 0xcf, 0xd1, 0xee, 0x9a, 0x60, 0xb7, 0xc8, 0x5b, 0x93, 0xc5, 0x43, 0x27, 0x74, - 0xef, 0xf7, 0x45, 0x0f, 0x68, 0xc3, 0xe1, 0x47, 0x68, 0xc7, 0xec, 0xaa, 0x88, 0x0f, 0xed, 0x6e, - 0xba, 0xab, 0xdf, 0xb3, 0x6b, 0x63, 0x37, 0x79, 0xeb, 0x83, 0xe5, 0xcf, 0x02, 0x99, 0x5c, 0xd3, - 0x29, 0x19, 0x1f, 0xa3, 0x86, 0xb6, 0xae, 0x9d, 0xca, 0xea, 0x25, 0xa4, 0xf7, 0x25, 0x29, 0xf7, - 0x25, 0xe9, 0xa4, 0xea, 0x44, 0x9c, 0x2a, 0xc1, 0xd2, 0x38, 0xd8, 0xd1, 0x96, 0xd5, 0x25, 0x51, - 0xa3, 0xe3, 0xdd, 0x2c, 0x3e, 0xb8, 0xde, 0x21, 0xf8, 0xe9, 0xff, 0xf6, 0xe0, 0xef, 0x5a, 0x9b, - 0xad, 0x7e, 0xf4, 0x9f, 0xd0, 0x36, 0x2b, 0xff, 0xe4, 0xd6, 0xc2, 0xf7, 0xd7, 0xb4, 0xf0, 0xcc, - 0x6a, 0x08, 0xee, 0xd8, 0x34, 0xdb, 0x93, 0xe0, 0x44, 0x13, 0x7f, 0x8f, 0xb6, 0xa0, 0x54, 0xdf, - 0x30, 0xea, 0xed, 0x35, 0xd5, 0xab, 0x7d, 0x19, 0xbc, 0x6d, 0xc5, 0xb7, 0x6c, 0xcc, 0x0a, 0xe2, - 0x2f, 0xf5, 0x94, 0x34, 0xf6, 0xc9, 0x65, 0x06, 0xb2, 0xd9, 0x30, 0xdf, 0x93, 0x0f, 0xcb, 0x66, - 0xa7, 0xe1, 0x9b, 0xbc, 0x85, 0xaa, 0x23, 0x9d, 0x65, 0x04, 0x87, 0x57, 0xd7, 0x6e, 0xed, 0xf9, - 0xb5, 0x5b, 0x7b, 0x71, 0xed, 0xd6, 0x7e, 0x2d, 0x5c, 0xe7, 0xaa, 0x70, 0x9d, 0xe7, 0x85, 0xeb, - 0xbc, 0x28, 0x5c, 0xe7, 0xef, 0xc2, 0x75, 0x7e, 0xfb, 0xc7, 0xad, 0xfd, 0x50, 0x1f, 0xb7, 0xff, - 0x0d, 0x00, 0x00, 0xff, 0xff, 0x48, 0x47, 0x24, 0xc9, 0xc1, 0x08, 0x00, 0x00, + // 804 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0xcf, 0x8f, 0xdb, 0x44, + 0x14, 0x8e, 0x9d, 0x6c, 0x92, 0x4e, 0x28, 0x65, 0x07, 0x21, 0xac, 0x45, 0xd8, 0xc1, 0x17, 0x56, + 0xaa, 0x18, 0x93, 0x16, 0x21, 0x6e, 0x08, 0x43, 0x29, 0x91, 0xba, 0xbb, 0xd1, 0x6c, 0x2f, 0x20, + 0x90, 0x70, 0x9c, 0x59, 0xef, 0x34, 0xb1, 0xc7, 0x1a, 0x4f, 0x42, 0xf7, 0xc6, 0x9f, 0xc0, 0x1f, + 0xc2, 0x91, 0x1b, 0x87, 0x72, 0xdc, 0x63, 0x8f, 0x3d, 0x59, 0xac, 0xf9, 0x2f, 0xf6, 0x84, 0x66, + 0x3c, 0x89, 0xf3, 0xa3, 0x11, 0xd9, 0x15, 0xbd, 0x65, 0xde, 0xbc, 0xef, 0x7b, 0xf3, 0xde, 0xfb, + 0xf2, 0x19, 0x7c, 0x35, 0xfe, 0x22, 0x43, 0x94, 0x79, 0xe3, 0xe9, 0x90, 0xf0, 0x84, 0x08, 0x92, + 0x79, 0x33, 0x92, 0x8c, 0x18, 0xf7, 0xf4, 0x45, 0x90, 0x52, 0x2f, 0x21, 0xe2, 0x17, 0xc6, 0xc7, + 0x34, 0x89, 0xbc, 0x59, 0xcf, 0x8b, 0x48, 0x42, 0x78, 0x20, 0xc8, 0x08, 0xa5, 0x9c, 0x09, 0x06, + 0xad, 0x32, 0x13, 0x05, 0x29, 0x45, 0x55, 0x26, 0x9a, 0xf5, 0x0e, 0x3e, 0x89, 0xa8, 0x38, 0x9f, + 0x0e, 0x51, 0xc8, 0x62, 0x2f, 0x62, 0x11, 0xf3, 0x14, 0x60, 0x38, 0x3d, 0x53, 0x27, 0x75, 0x50, + 0xbf, 0x4a, 0xa2, 0x03, 0x77, 0xa9, 0x64, 0xc8, 0x38, 0x79, 0x4d, 0xb1, 0x83, 0xcf, 0xaa, 0x9c, + 0x38, 0x08, 0xcf, 0x69, 0x42, 0xf8, 0x85, 0x97, 0x8e, 0x23, 0x19, 0xc8, 0xbc, 0x98, 0x88, 0xe0, + 0x75, 0x28, 0x6f, 0x1b, 0x8a, 0x4f, 0x13, 0x41, 0x63, 0xb2, 0x01, 0xf8, 0xfc, 0xbf, 0x00, 0x59, + 0x78, 0x4e, 0xe2, 0x60, 0x03, 0xf7, 0x70, 0x1b, 0x6e, 0x2a, 0xe8, 0xc4, 0xa3, 0x89, 0xc8, 0x04, + 0x5f, 0x07, 0xb9, 0x27, 0xa0, 0xd5, 0x1f, 0xf8, 0x13, 0x16, 0x8e, 0x61, 0x17, 0x34, 0x42, 0x3a, + 0xe2, 0x96, 0xd1, 0x35, 0x0e, 0xef, 0xf8, 0x6f, 0x5d, 0xe6, 0x4e, 0xad, 0xc8, 0x9d, 0xc6, 0xd7, + 0xfd, 0x6f, 0x30, 0x56, 0x37, 0xd0, 0x05, 0x4d, 0xf2, 0x3c, 0x24, 0xa9, 0xb0, 0xcc, 0x6e, 0xfd, + 0xf0, 0x8e, 0x0f, 0x8a, 0xdc, 0x69, 0x3e, 0x52, 0x11, 0xac, 0x6f, 0xdc, 0xbf, 0x0c, 0x70, 0xf7, + 0xb8, 0xdc, 0xc4, 0x80, 0x4d, 0x68, 0x78, 0x01, 0x7f, 0x06, 0x6d, 0x39, 0x9b, 0x51, 0x20, 0x02, + 0xc5, 0xdd, 0x79, 0xf0, 0x29, 0xaa, 0xd6, 0xb6, 0x78, 0x2a, 0x4a, 0xc7, 0x91, 0x0c, 0x64, 0x48, + 0x66, 0xa3, 0x59, 0x0f, 0x9d, 0x0c, 0x9f, 0x91, 0x50, 0x1c, 0x11, 0x11, 0xf8, 0x50, 0xbf, 0x06, + 0x54, 0x31, 0xbc, 0x60, 0x85, 0x47, 0xa0, 0x91, 0xa5, 0x24, 0xb4, 0x4c, 0xc5, 0x7e, 0x1f, 0x6d, + 0x13, 0x05, 0x5a, 0x79, 0xd8, 0x69, 0x4a, 0xc2, 0xaa, 0x4d, 0x79, 0xc2, 0x8a, 0xc6, 0xfd, 0xc3, + 0x00, 0xef, 0xaf, 0x64, 0x3e, 0x8a, 0x38, 0xc9, 0x32, 0x3c, 0x9d, 0x10, 0x38, 0x00, 0x7b, 0x29, + 0xe3, 0x22, 0xb3, 0x8c, 0x6e, 0xfd, 0x06, 0xb5, 0x06, 0x8c, 0x0b, 0xff, 0xae, 0xae, 0xb5, 0x27, + 0x4f, 0x19, 0x2e, 0x89, 0xe0, 0x63, 0x60, 0x0a, 0xa6, 0x06, 0x7a, 0x03, 0x3a, 0x42, 0xb8, 0x0f, + 0x34, 0x9d, 0xf9, 0x94, 0x61, 0x53, 0x30, 0xf7, 0x4f, 0x03, 0x58, 0x2b, 0x59, 0xfd, 0xe4, 0x4d, + 0xbe, 0xfb, 0x08, 0x34, 0xce, 0x38, 0x8b, 0x6f, 0xf3, 0xf2, 0xc5, 0xd0, 0xbf, 0xe5, 0x2c, 0xc6, + 0x8a, 0xc6, 0x7d, 0x61, 0x80, 0xfd, 0x95, 0xcc, 0x27, 0x34, 0x13, 0xf0, 0xc7, 0x0d, 0xed, 0xa0, + 0xdd, 0xb4, 0x23, 0xd1, 0x4a, 0x39, 0xef, 0xe8, 0x5a, 0xed, 0x79, 0x64, 0x49, 0x37, 0x4f, 0xc0, + 0x1e, 0x15, 0x24, 0xce, 0x74, 0x0f, 0x1f, 0xef, 0xd8, 0x43, 0x35, 0x90, 0xbe, 0x44, 0xe3, 0x92, + 0xc4, 0x7d, 0x61, 0xae, 0x75, 0x20, 0x7b, 0x85, 0x67, 0xa0, 0x93, 0xb2, 0xd1, 0x29, 0x99, 0x90, + 0x50, 0x30, 0xae, 0x9b, 0x78, 0xb8, 0x63, 0x13, 0xc1, 0x90, 0x4c, 0xe6, 0x50, 0xff, 0x5e, 0x91, + 0x3b, 0x9d, 0x41, 0xc5, 0x85, 0x97, 0x89, 0xe1, 0x73, 0xb0, 0x9f, 0x04, 0x31, 0xc9, 0xd2, 0x20, + 0x24, 0x8b, 0x6a, 0xe6, 0xed, 0xab, 0xbd, 0x57, 0xe4, 0xce, 0xfe, 0xf1, 0x3a, 0x23, 0xde, 0x2c, + 0x02, 0xbf, 0x03, 0x2d, 0x9a, 0x2a, 0x0b, 0xb1, 0xea, 0xaa, 0xde, 0x47, 0xdb, 0xe7, 0xa8, 0xbd, + 0xc6, 0xef, 0x14, 0xb9, 0x33, 0x37, 0x1e, 0x3c, 0x87, 0xbb, 0xbf, 0xaf, 0x6b, 0x40, 0x0a, 0x0e, + 0x3e, 0x06, 0x6d, 0xe5, 0x55, 0x21, 0x9b, 0x68, 0x6f, 0xba, 0x2f, 0xf7, 0x39, 0xd0, 0xb1, 0xeb, + 0xdc, 0xf9, 0x60, 0xd3, 0xbc, 0xd1, 0xfc, 0x1a, 0x2f, 0xc0, 0xf0, 0x18, 0x34, 0xa4, 0x74, 0xf5, + 0x54, 0xb6, 0x9b, 0x90, 0xf4, 0x4b, 0x54, 0xfa, 0x25, 0xea, 0x27, 0xe2, 0x84, 0x9f, 0x0a, 0x4e, + 0x93, 0xc8, 0x6f, 0x4b, 0xc9, 0xca, 0x27, 0x61, 0xc5, 0xe3, 0x5e, 0xaf, 0x2f, 0x5c, 0x7a, 0x08, + 0x7c, 0xf6, 0xbf, 0x2d, 0xfc, 0x5d, 0x2d, 0xb3, 0xed, 0x4b, 0xff, 0x09, 0xb4, 0x68, 0xf9, 0x27, + 0xd7, 0x12, 0x7e, 0xb0, 0xa3, 0x84, 0x97, 0xac, 0xc1, 0xbf, 0xa7, 0xcb, 0xb4, 0xe6, 0xc1, 0x39, + 0x27, 0xfc, 0x1e, 0x34, 0x49, 0xc9, 0x5e, 0x57, 0xec, 0xbd, 0x1d, 0xd9, 0x2b, 0xbf, 0xf4, 0xdf, + 0xd6, 0xe4, 0x4d, 0x1d, 0xd3, 0x84, 0xf0, 0x4b, 0x39, 0x25, 0x99, 0xfb, 0xf4, 0x22, 0x25, 0x99, + 0xd5, 0x50, 0xdf, 0x93, 0x0f, 0xcb, 0x66, 0x17, 0xe1, 0xeb, 0xdc, 0x01, 0xd5, 0x11, 0x2f, 0x23, + 0xfc, 0xc3, 0xcb, 0x2b, 0xbb, 0xf6, 0xf2, 0xca, 0xae, 0xbd, 0xba, 0xb2, 0x6b, 0xbf, 0x16, 0xb6, + 0x71, 0x59, 0xd8, 0xc6, 0xcb, 0xc2, 0x36, 0x5e, 0x15, 0xb6, 0xf1, 0x77, 0x61, 0x1b, 0xbf, 0xfd, + 0x63, 0xd7, 0x7e, 0x30, 0x67, 0xbd, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x7b, 0xc9, 0x59, + 0x67, 0x08, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/networking/v1/generated.proto b/vendor/k8s.io/api/networking/v1/generated.proto index f52343cf..4e068d08 100644 --- a/vendor/k8s.io/api/networking/v1/generated.proto +++ b/vendor/k8s.io/api/networking/v1/generated.proto @@ -22,8 +22,6 @@ syntax = 'proto2'; package k8s.io.api.networking.v1; import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/api/extensions/v1beta1/generated.proto"; -import "k8s.io/api/policy/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; @@ -140,7 +138,7 @@ message NetworkPolicyPeer { // NetworkPolicyPort describes a port to allow traffic on message NetworkPolicyPort { - // The protocol (TCP or UDP) which traffic must match. If not specified, this + // The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this // field defaults to TCP. // +optional optional string protocol = 1; diff --git a/vendor/k8s.io/api/networking/v1/types.go b/vendor/k8s.io/api/networking/v1/types.go index e1b81fdc..ce70448d 100644 --- a/vendor/k8s.io/api/networking/v1/types.go +++ b/vendor/k8s.io/api/networking/v1/types.go @@ -136,7 +136,7 @@ type NetworkPolicyEgressRule struct { // NetworkPolicyPort describes a port to allow traffic on type NetworkPolicyPort struct { - // The protocol (TCP or UDP) which traffic must match. If not specified, this + // The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this // field defaults to TCP. // +optional Protocol *v1.Protocol `json:"protocol,omitempty" protobuf:"bytes,1,opt,name=protocol,casttype=k8s.io/api/core/v1.Protocol"` diff --git a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go index af2553a9..f4363bc0 100644 --- a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -90,7 +90,7 @@ func (NetworkPolicyPeer) SwaggerDoc() map[string]string { var map_NetworkPolicyPort = map[string]string{ "": "NetworkPolicyPort describes a port to allow traffic on", - "protocol": "The protocol (TCP or UDP) which traffic must match. If not specified, this field defaults to TCP.", + "protocol": "The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this field defaults to TCP.", "port": "The port on the given protocol. This can either be a numerical or named port on a pod. If this field is not provided, this matches all port names and numbers.", } diff --git a/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go index 0037638a..d1e4e884 100644 --- a/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go @@ -21,8 +21,8 @@ limitations under the License. package v1 import ( - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" intstr "k8s.io/apimachinery/pkg/util/intstr" ) @@ -173,30 +173,18 @@ func (in *NetworkPolicyPeer) DeepCopyInto(out *NetworkPolicyPeer) { *out = *in if in.PodSelector != nil { in, out := &in.PodSelector, &out.PodSelector - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.NamespaceSelector != nil { in, out := &in.NamespaceSelector, &out.NamespaceSelector - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(metav1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.IPBlock != nil { in, out := &in.IPBlock, &out.IPBlock - if *in == nil { - *out = nil - } else { - *out = new(IPBlock) - (*in).DeepCopyInto(*out) - } + *out = new(IPBlock) + (*in).DeepCopyInto(*out) } return } @@ -216,21 +204,13 @@ func (in *NetworkPolicyPort) DeepCopyInto(out *NetworkPolicyPort) { *out = *in if in.Protocol != nil { in, out := &in.Protocol, &out.Protocol - if *in == nil { - *out = nil - } else { - *out = new(core_v1.Protocol) - **out = **in - } + *out = new(corev1.Protocol) + **out = **in } if in.Port != nil { in, out := &in.Port, &out.Port - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } diff --git a/vendor/k8s.io/api/policy/v1beta1/BUILD b/vendor/k8s.io/api/policy/v1beta1/BUILD index d55d68e5..15947b15 100644 --- a/vendor/k8s.io/api/policy/v1beta1/BUILD +++ b/vendor/k8s.io/api/policy/v1beta1/BUILD @@ -15,15 +15,16 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/policy/v1beta1", importpath = "k8s.io/api/policy/v1beta1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -39,9 +40,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/policy/v1beta1/generated.pb.go b/vendor/k8s.io/api/policy/v1beta1/generated.pb.go index 505fb0e0..d7d62dd3 100644 --- a/vendor/k8s.io/api/policy/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/policy/v1beta1/generated.pb.go @@ -836,6 +836,23 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + dAtA[i] = 0xaa + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -1189,6 +1206,12 @@ func (m *PodSecurityPolicySpec) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -1417,6 +1440,7 @@ func (this *PodSecurityPolicySpec) String() string { `AllowedFlexVolumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedFlexVolumes), "AllowedFlexVolume", "AllowedFlexVolume", 1), `&`, ``, 1) + `,`, `AllowedUnsafeSysctls:` + fmt.Sprintf("%v", this.AllowedUnsafeSysctls) + `,`, `ForbiddenSysctls:` + fmt.Sprintf("%v", this.ForbiddenSysctls) + `,`, + `AllowedProcMountTypes:` + fmt.Sprintf("%v", this.AllowedProcMountTypes) + `,`, `}`, }, "") return s @@ -3484,6 +3508,35 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { } m.ForbiddenSysctls = append(m.ForbiddenSysctls, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedProcMountTypes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedProcMountTypes = append(m.AllowedProcMountTypes, k8s_io_api_core_v1.ProcMountType(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3947,110 +4000,113 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1679 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4f, 0x6f, 0x23, 0xb7, - 0x15, 0xf7, 0xac, 0x6c, 0x4b, 0xa6, 0x6d, 0xad, 0x4d, 0x7b, 0xdd, 0x89, 0xd1, 0xd5, 0x24, 0x0a, - 0x50, 0x6c, 0x83, 0x64, 0x14, 0x7b, 0x93, 0xd6, 0x68, 0xda, 0x22, 0x1e, 0xcb, 0xff, 0x02, 0xbb, - 0x56, 0xa9, 0xdd, 0xa0, 0x2d, 0xb6, 0x45, 0x29, 0x0d, 0x2d, 0x31, 0x1e, 0xcd, 0x4c, 0x49, 0x8e, - 0x22, 0xdd, 0x7a, 0xe8, 0xa1, 0xe8, 0xa9, 0x5f, 0xa0, 0x9f, 0xa0, 0xe8, 0xa9, 0x5f, 0xc2, 0x05, - 0x8a, 0x22, 0xc7, 0xa0, 0x07, 0xa1, 0xab, 0xa2, 0x5f, 0x22, 0xa7, 0x62, 0x28, 0x8e, 0xa4, 0xf9, - 0x23, 0x79, 0x1d, 0x60, 0xf7, 0xa6, 0xe1, 0xfb, 0xfd, 0x7e, 0xef, 0xf1, 0xf1, 0xf1, 0x91, 0x14, - 0xb0, 0x6e, 0x0e, 0xb8, 0x49, 0xbd, 0xca, 0x4d, 0xd0, 0x20, 0xcc, 0x25, 0x82, 0xf0, 0x4a, 0x97, - 0xb8, 0xb6, 0xc7, 0x2a, 0xca, 0x80, 0x7d, 0x5a, 0xf1, 0x3d, 0x87, 0x36, 0xfb, 0x95, 0xee, 0x5e, - 0x83, 0x08, 0xbc, 0x57, 0x69, 0x11, 0x97, 0x30, 0x2c, 0x88, 0x6d, 0xfa, 0xcc, 0x13, 0x1e, 0x7c, - 0x6b, 0x04, 0x35, 0xb1, 0x4f, 0xcd, 0x11, 0xd4, 0x54, 0xd0, 0xdd, 0x0f, 0x5a, 0x54, 0xb4, 0x83, - 0x86, 0xd9, 0xf4, 0x3a, 0x95, 0x96, 0xd7, 0xf2, 0x2a, 0x92, 0xd1, 0x08, 0xae, 0xe5, 0x97, 0xfc, - 0x90, 0xbf, 0x46, 0x4a, 0xbb, 0xe5, 0x29, 0xa7, 0x4d, 0x8f, 0x91, 0x4a, 0x37, 0xe5, 0x6d, 0xf7, - 0xa3, 0x09, 0xa6, 0x83, 0x9b, 0x6d, 0xea, 0x12, 0xd6, 0xaf, 0xf8, 0x37, 0xad, 0x70, 0x80, 0x57, - 0x3a, 0x44, 0xe0, 0x2c, 0x56, 0x65, 0x16, 0x8b, 0x05, 0xae, 0xa0, 0x1d, 0x92, 0x22, 0xfc, 0xe0, - 0x2e, 0x02, 0x6f, 0xb6, 0x49, 0x07, 0xa7, 0x78, 0x4f, 0x67, 0xf1, 0x02, 0x41, 0x9d, 0x0a, 0x75, - 0x05, 0x17, 0x2c, 0x49, 0x2a, 0x7f, 0x02, 0x36, 0x0f, 0x1d, 0xc7, 0xfb, 0x92, 0xd8, 0x27, 0x0e, - 0xe9, 0x7d, 0xee, 0x39, 0x41, 0x87, 0xc0, 0xef, 0x81, 0x65, 0x9b, 0xd1, 0x2e, 0x61, 0xba, 0xf6, - 0xb6, 0xf6, 0x64, 0xc5, 0x2a, 0xde, 0x0e, 0x8c, 0x85, 0xe1, 0xc0, 0x58, 0xae, 0xca, 0x51, 0xa4, - 0xac, 0x65, 0x0e, 0x1e, 0x2a, 0xf2, 0x99, 0xc7, 0x45, 0x0d, 0x8b, 0x36, 0xdc, 0x07, 0xc0, 0xc7, - 0xa2, 0x5d, 0x63, 0xe4, 0x9a, 0xf6, 0x14, 0x1d, 0x2a, 0x3a, 0xa8, 0x8d, 0x2d, 0x68, 0x0a, 0x05, - 0xdf, 0x07, 0x05, 0x46, 0xb0, 0x7d, 0xe5, 0x3a, 0x7d, 0xfd, 0xc1, 0xdb, 0xda, 0x93, 0x82, 0xb5, - 0xa1, 0x18, 0x05, 0xa4, 0xc6, 0xd1, 0x18, 0x51, 0xfe, 0xb7, 0x06, 0x0a, 0xc7, 0x5d, 0xda, 0x14, - 0xd4, 0x73, 0xe1, 0x6f, 0x41, 0x21, 0xcc, 0xbb, 0x8d, 0x05, 0x96, 0xce, 0x56, 0xf7, 0x3f, 0x34, - 0x27, 0x35, 0x31, 0x4e, 0x83, 0xe9, 0xdf, 0xb4, 0xc2, 0x01, 0x6e, 0x86, 0x68, 0xb3, 0xbb, 0x67, - 0x5e, 0x35, 0xbe, 0x20, 0x4d, 0x71, 0x49, 0x04, 0x9e, 0x84, 0x37, 0x19, 0x43, 0x63, 0x55, 0xe8, - 0x80, 0x75, 0x9b, 0x38, 0x44, 0x90, 0x2b, 0x3f, 0xf4, 0xc8, 0x65, 0x84, 0xab, 0xfb, 0x4f, 0x5f, - 0xcd, 0x4d, 0x75, 0x9a, 0x6a, 0x6d, 0x0e, 0x07, 0xc6, 0x7a, 0x6c, 0x08, 0xc5, 0xc5, 0xcb, 0x7f, - 0xd1, 0xc0, 0xce, 0x49, 0xfd, 0x94, 0x79, 0x81, 0x5f, 0x17, 0xe1, 0x3a, 0xb5, 0xfa, 0xca, 0x04, - 0x7f, 0x08, 0x16, 0x59, 0xe0, 0x10, 0x95, 0xd3, 0x77, 0x55, 0xd0, 0x8b, 0x28, 0x70, 0xc8, 0x37, - 0x03, 0x63, 0x2b, 0xc1, 0x7a, 0xd6, 0xf7, 0x09, 0x92, 0x04, 0xf8, 0x19, 0x58, 0x66, 0xd8, 0x6d, - 0x91, 0x30, 0xf4, 0xdc, 0x93, 0xd5, 0xfd, 0xb2, 0x39, 0x73, 0xd7, 0x98, 0xe7, 0x55, 0x14, 0x42, - 0x27, 0x2b, 0x2e, 0x3f, 0x39, 0x52, 0x0a, 0xe5, 0x4b, 0xb0, 0x2e, 0x97, 0xda, 0x63, 0x42, 0x5a, - 0xe0, 0x63, 0x90, 0xeb, 0x50, 0x57, 0x06, 0xb5, 0x64, 0xad, 0x2a, 0x56, 0xee, 0x92, 0xba, 0x28, - 0x1c, 0x97, 0x66, 0xdc, 0x93, 0x39, 0x9b, 0x36, 0xe3, 0x1e, 0x0a, 0xc7, 0xcb, 0xa7, 0x20, 0xaf, - 0x3c, 0x4e, 0x0b, 0xe5, 0xe6, 0x0b, 0xe5, 0x32, 0x84, 0xfe, 0xfa, 0x00, 0x6c, 0xd5, 0x3c, 0xbb, - 0x4a, 0x39, 0x0b, 0x64, 0xbe, 0xac, 0xc0, 0x6e, 0x11, 0xf1, 0x06, 0xea, 0xe3, 0x19, 0x58, 0xe4, - 0x3e, 0x69, 0xaa, 0xb2, 0xd8, 0x9f, 0x93, 0xdb, 0x8c, 0xf8, 0xea, 0x3e, 0x69, 0x5a, 0x6b, 0xd1, - 0x52, 0x86, 0x5f, 0x48, 0xaa, 0xc1, 0x17, 0x60, 0x99, 0x0b, 0x2c, 0x02, 0xae, 0xe7, 0xa4, 0xee, - 0x47, 0xf7, 0xd4, 0x95, 0xdc, 0xc9, 0x2a, 0x8e, 0xbe, 0x91, 0xd2, 0x2c, 0xff, 0x53, 0x03, 0xdf, - 0xc9, 0x60, 0x5d, 0x50, 0x2e, 0xe0, 0x8b, 0x54, 0xc6, 0xcc, 0x57, 0xcb, 0x58, 0xc8, 0x96, 0xf9, - 0x1a, 0x6f, 0xde, 0x68, 0x64, 0x2a, 0x5b, 0x75, 0xb0, 0x44, 0x05, 0xe9, 0x44, 0xa5, 0x68, 0xde, - 0x6f, 0x5a, 0xd6, 0xba, 0x92, 0x5e, 0x3a, 0x0f, 0x45, 0xd0, 0x48, 0xab, 0xfc, 0xaf, 0x07, 0x99, - 0xd3, 0x09, 0xd3, 0x09, 0xaf, 0xc1, 0x5a, 0x87, 0xba, 0x87, 0x5d, 0x4c, 0x1d, 0xdc, 0x50, 0xbb, - 0x67, 0x5e, 0x11, 0x84, 0xbd, 0xd2, 0x1c, 0xf5, 0x4a, 0xf3, 0xdc, 0x15, 0x57, 0xac, 0x2e, 0x18, - 0x75, 0x5b, 0xd6, 0xc6, 0x70, 0x60, 0xac, 0x5d, 0x4e, 0x29, 0xa1, 0x98, 0x2e, 0xfc, 0x35, 0x28, - 0x70, 0xe2, 0x90, 0xa6, 0xf0, 0xd8, 0xfd, 0x3a, 0xc4, 0x05, 0x6e, 0x10, 0xa7, 0xae, 0xa8, 0xd6, - 0x5a, 0x98, 0xb7, 0xe8, 0x0b, 0x8d, 0x25, 0xa1, 0x03, 0x8a, 0x1d, 0xdc, 0x7b, 0xee, 0xe2, 0xf1, - 0x44, 0x72, 0xdf, 0x72, 0x22, 0x70, 0x38, 0x30, 0x8a, 0x97, 0x31, 0x2d, 0x94, 0xd0, 0x2e, 0xff, - 0x6f, 0x11, 0xbc, 0x35, 0xb3, 0xaa, 0xe0, 0x67, 0x00, 0x7a, 0x0d, 0x4e, 0x58, 0x97, 0xd8, 0xa7, - 0xa3, 0xd3, 0x84, 0x7a, 0xd1, 0xc6, 0xdd, 0x55, 0x0b, 0x04, 0xaf, 0x52, 0x08, 0x94, 0xc1, 0x82, - 0x7f, 0xd0, 0xc0, 0xba, 0x3d, 0x72, 0x43, 0xec, 0x9a, 0x67, 0x47, 0x85, 0x71, 0xfa, 0x6d, 0xea, - 0xdd, 0xac, 0x4e, 0x2b, 0x1d, 0xbb, 0x82, 0xf5, 0xad, 0x47, 0x2a, 0xa0, 0xf5, 0x98, 0x0d, 0xc5, - 0x9d, 0xc2, 0x4b, 0x00, 0xed, 0xb1, 0x24, 0x57, 0x67, 0x9a, 0x4c, 0xf1, 0x92, 0xf5, 0x58, 0x29, - 0x3c, 0x8a, 0xf9, 0x8d, 0x40, 0x28, 0x83, 0x08, 0x7f, 0x0a, 0x8a, 0xcd, 0x80, 0x31, 0xe2, 0x8a, - 0x33, 0x82, 0x1d, 0xd1, 0xee, 0xeb, 0x8b, 0x52, 0x6a, 0x47, 0x49, 0x15, 0x8f, 0x62, 0x56, 0x94, - 0x40, 0x87, 0x7c, 0x9b, 0x70, 0xca, 0x88, 0x1d, 0xf1, 0x97, 0xe2, 0xfc, 0x6a, 0xcc, 0x8a, 0x12, - 0x68, 0x78, 0x00, 0xd6, 0x48, 0xcf, 0x27, 0xcd, 0x28, 0xa7, 0xcb, 0x92, 0xbd, 0xad, 0xd8, 0x6b, - 0xc7, 0x53, 0x36, 0x14, 0x43, 0xee, 0x3a, 0x00, 0xa6, 0x93, 0x08, 0x37, 0x40, 0xee, 0x86, 0xf4, - 0x47, 0x27, 0x0f, 0x0a, 0x7f, 0xc2, 0x4f, 0xc1, 0x52, 0x17, 0x3b, 0x01, 0x51, 0xb5, 0xfe, 0xde, - 0xab, 0xd5, 0xfa, 0x33, 0xda, 0x21, 0x68, 0x44, 0xfc, 0xd1, 0x83, 0x03, 0xad, 0xfc, 0x0f, 0x0d, - 0x6c, 0xd6, 0x3c, 0xbb, 0x4e, 0x9a, 0x01, 0xa3, 0xa2, 0x5f, 0x93, 0xeb, 0xfc, 0x06, 0x7a, 0x36, - 0x8a, 0xf5, 0xec, 0x0f, 0xe7, 0xd7, 0x5a, 0x3c, 0xba, 0x59, 0x1d, 0xbb, 0x7c, 0xab, 0x81, 0x47, - 0x29, 0xf4, 0x1b, 0xe8, 0xa8, 0x3f, 0x8f, 0x77, 0xd4, 0xf7, 0xef, 0x33, 0x99, 0x19, 0xfd, 0xf4, - 0x4f, 0xc5, 0x8c, 0xa9, 0xc8, 0x6e, 0x1a, 0xde, 0xee, 0x18, 0xed, 0x52, 0x87, 0xb4, 0x88, 0x2d, - 0x27, 0x53, 0x98, 0xba, 0xdd, 0x8d, 0x2d, 0x68, 0x0a, 0x05, 0x39, 0xd8, 0xb1, 0xc9, 0x35, 0x0e, - 0x1c, 0x71, 0x68, 0xdb, 0x47, 0xd8, 0xc7, 0x0d, 0xea, 0x50, 0x41, 0xd5, 0x75, 0x64, 0xc5, 0xfa, - 0x64, 0x38, 0x30, 0x76, 0xaa, 0x99, 0x88, 0x6f, 0x06, 0xc6, 0xe3, 0xf4, 0xbd, 0xdc, 0x1c, 0x43, - 0xfa, 0x68, 0x86, 0x34, 0xec, 0x03, 0x9d, 0x91, 0xdf, 0x05, 0xe1, 0xa6, 0xa8, 0x32, 0xcf, 0x8f, - 0xb9, 0xcd, 0x49, 0xb7, 0x3f, 0x19, 0x0e, 0x0c, 0x1d, 0xcd, 0xc0, 0xdc, 0xed, 0x78, 0xa6, 0x3c, - 0xfc, 0x02, 0x6c, 0xe1, 0x51, 0x1f, 0x88, 0x79, 0x5d, 0x94, 0x5e, 0x0f, 0x86, 0x03, 0x63, 0xeb, - 0x30, 0x6d, 0xbe, 0xdb, 0x61, 0x96, 0x28, 0xac, 0x80, 0x7c, 0x57, 0x5e, 0xd9, 0xb9, 0xbe, 0x24, - 0xf5, 0x1f, 0x0d, 0x07, 0x46, 0x7e, 0x74, 0x8b, 0x0f, 0x35, 0x97, 0x4f, 0xea, 0xf2, 0x22, 0x18, - 0xa1, 0xe0, 0xc7, 0x60, 0xb5, 0xed, 0x71, 0xf1, 0x33, 0x22, 0xbe, 0xf4, 0xd8, 0x8d, 0x6c, 0x0c, - 0x05, 0x6b, 0x4b, 0xad, 0xe0, 0xea, 0xd9, 0xc4, 0x84, 0xa6, 0x71, 0xf0, 0x97, 0x60, 0xa5, 0xad, - 0xae, 0x7d, 0x5c, 0xcf, 0xcb, 0x42, 0x7b, 0x32, 0xa7, 0xd0, 0x62, 0x57, 0x44, 0x6b, 0x53, 0xc9, - 0xaf, 0x44, 0xc3, 0x1c, 0x4d, 0xd4, 0xe0, 0xf7, 0x41, 0x5e, 0x7e, 0x9c, 0x57, 0xf5, 0x82, 0x8c, - 0xe6, 0xa1, 0x82, 0xe7, 0xcf, 0x46, 0xc3, 0x28, 0xb2, 0x47, 0xd0, 0xf3, 0xda, 0x91, 0xbe, 0x92, - 0x86, 0x9e, 0xd7, 0x8e, 0x50, 0x64, 0x87, 0x2f, 0x40, 0x9e, 0x93, 0x0b, 0xea, 0x06, 0x3d, 0x1d, - 0xc8, 0x2d, 0xb7, 0x37, 0x27, 0xdc, 0xfa, 0xb1, 0x44, 0x26, 0x2e, 0xdc, 0x13, 0x75, 0x65, 0x47, - 0x91, 0x24, 0xb4, 0xc1, 0x0a, 0x0b, 0xdc, 0x43, 0xfe, 0x9c, 0x13, 0xa6, 0xaf, 0xa6, 0x4e, 0xfb, - 0xa4, 0x3e, 0x8a, 0xb0, 0x49, 0x0f, 0xe3, 0xcc, 0x8c, 0x11, 0x68, 0x22, 0x0c, 0xff, 0xa8, 0x01, - 0xc8, 0x03, 0xdf, 0x77, 0x48, 0x87, 0xb8, 0x02, 0x3b, 0xf2, 0x7e, 0xcf, 0xf5, 0x35, 0xe9, 0xef, - 0xc7, 0xf3, 0xe6, 0x93, 0x22, 0x25, 0x1d, 0x8f, 0x8f, 0xe9, 0x34, 0x14, 0x65, 0xf8, 0x0c, 0xd3, - 0x79, 0xcd, 0xe5, 0x6f, 0x7d, 0xfd, 0xce, 0x74, 0x66, 0xbf, 0x5f, 0x26, 0xe9, 0x54, 0x76, 0x14, - 0x49, 0xc2, 0xcf, 0xc1, 0x4e, 0xf4, 0xba, 0x43, 0x9e, 0x27, 0x4e, 0xa8, 0x43, 0x78, 0x9f, 0x0b, - 0xd2, 0xd1, 0x8b, 0x72, 0x99, 0x4b, 0x8a, 0xb9, 0x83, 0x32, 0x51, 0x68, 0x06, 0x1b, 0x76, 0x80, - 0x11, 0xb5, 0x87, 0x70, 0xef, 0x8c, 0xfb, 0xd3, 0x31, 0x6f, 0x62, 0x67, 0x74, 0x6b, 0x79, 0x28, - 0x1d, 0xbc, 0x3b, 0x1c, 0x18, 0x46, 0x75, 0x3e, 0x14, 0xdd, 0xa5, 0x05, 0x7f, 0x01, 0x74, 0x3c, - 0xcb, 0xcf, 0x86, 0xf4, 0xf3, 0xdd, 0xb0, 0xe7, 0xcc, 0x74, 0x30, 0x93, 0x0d, 0x7d, 0xb0, 0x81, - 0xe3, 0xef, 0x6c, 0xae, 0x6f, 0xca, 0x5d, 0xf8, 0xde, 0x9c, 0x75, 0x48, 0x3c, 0xcd, 0x2d, 0x5d, - 0xa5, 0x71, 0x23, 0x61, 0xe0, 0x28, 0xa5, 0x0e, 0x7b, 0x00, 0xe2, 0xe4, 0xdf, 0x02, 0x5c, 0x87, - 0x77, 0x1e, 0x31, 0xa9, 0xff, 0x12, 0x26, 0xa5, 0x96, 0x32, 0x71, 0x94, 0xe1, 0x03, 0x5e, 0x80, - 0x6d, 0x35, 0xfa, 0xdc, 0xe5, 0xf8, 0x9a, 0xd4, 0xfb, 0xbc, 0x29, 0x1c, 0xae, 0x6f, 0xc9, 0xfe, - 0xa6, 0x0f, 0x07, 0xc6, 0xf6, 0x61, 0x86, 0x1d, 0x65, 0xb2, 0xe0, 0xa7, 0x60, 0xe3, 0xda, 0x63, - 0x0d, 0x6a, 0xdb, 0xc4, 0x8d, 0x94, 0xb6, 0xa5, 0xd2, 0x76, 0x98, 0x89, 0x93, 0x84, 0x0d, 0xa5, - 0xd0, 0xe1, 0x8b, 0x5c, 0x9f, 0xb5, 0x81, 0xe1, 0xc7, 0xb1, 0x37, 0xf9, 0x3b, 0x89, 0x37, 0xf9, - 0x66, 0x8a, 0xf7, 0x1a, 0x5e, 0xe4, 0x7f, 0xd3, 0xc0, 0x4e, 0x76, 0x03, 0x83, 0x4f, 0x63, 0xd1, - 0x19, 0x89, 0xe8, 0x1e, 0x26, 0x58, 0x2a, 0xb6, 0xdf, 0x80, 0xa2, 0x6a, 0x73, 0xf1, 0x3f, 0x3c, - 0x62, 0x31, 0x86, 0xe7, 0x53, 0x78, 0x43, 0x51, 0x12, 0xd1, 0x16, 0x97, 0x6f, 0x8b, 0xf8, 0x18, - 0x4a, 0xa8, 0x95, 0xff, 0xae, 0x81, 0x77, 0xee, 0x6c, 0x50, 0xd0, 0x8a, 0x85, 0x6e, 0x26, 0x42, - 0x2f, 0xcd, 0x16, 0x78, 0x3d, 0xff, 0x7b, 0x58, 0x1f, 0xdc, 0xbe, 0x2c, 0x2d, 0x7c, 0xf5, 0xb2, - 0xb4, 0xf0, 0xf5, 0xcb, 0xd2, 0xc2, 0xef, 0x87, 0x25, 0xed, 0x76, 0x58, 0xd2, 0xbe, 0x1a, 0x96, - 0xb4, 0xaf, 0x87, 0x25, 0xed, 0x3f, 0xc3, 0x92, 0xf6, 0xe7, 0xff, 0x96, 0x16, 0x7e, 0x95, 0x57, - 0x72, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x91, 0xe5, 0x7f, 0xdc, 0x14, 0x00, 0x00, + // 1715 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4f, 0x6f, 0x1b, 0xc7, + 0x15, 0xd7, 0x9a, 0x92, 0x48, 0x8d, 0x24, 0x5a, 0x1a, 0xfd, 0xe9, 0x46, 0xa8, 0xb9, 0x0e, 0x03, + 0x14, 0x6e, 0x90, 0x2c, 0x63, 0x39, 0x69, 0x8d, 0xa6, 0x2d, 0xa2, 0x35, 0x25, 0x5b, 0x81, 0x55, + 0xb1, 0x43, 0x3b, 0x68, 0x0b, 0xb7, 0xe8, 0x70, 0x77, 0x44, 0x4e, 0xb4, 0xdc, 0xdd, 0xce, 0xcc, + 0x32, 0xe4, 0xad, 0x87, 0x1e, 0x7a, 0xec, 0x17, 0xc8, 0x27, 0x28, 0x7a, 0xea, 0x97, 0x50, 0x81, + 0xa2, 0xc8, 0x31, 0xe8, 0x81, 0xa8, 0x59, 0xf4, 0x4b, 0xf8, 0xd2, 0x60, 0x87, 0xb3, 0x24, 0xf7, + 0x0f, 0x29, 0x2b, 0x40, 0x7c, 0xdb, 0x9d, 0xf7, 0xfb, 0xfd, 0xde, 0x9b, 0x37, 0x6f, 0xde, 0xce, + 0x0e, 0xb0, 0x2e, 0x1f, 0x72, 0x93, 0xfa, 0xb5, 0xcb, 0xb0, 0x45, 0x98, 0x47, 0x04, 0xe1, 0xb5, + 0x1e, 0xf1, 0x1c, 0x9f, 0xd5, 0x94, 0x01, 0x07, 0xb4, 0x16, 0xf8, 0x2e, 0xb5, 0x07, 0xb5, 0xde, + 0xfd, 0x16, 0x11, 0xf8, 0x7e, 0xad, 0x4d, 0x3c, 0xc2, 0xb0, 0x20, 0x8e, 0x19, 0x30, 0x5f, 0xf8, + 0xf0, 0xad, 0x31, 0xd4, 0xc4, 0x01, 0x35, 0xc7, 0x50, 0x53, 0x41, 0x0f, 0xde, 0x6f, 0x53, 0xd1, + 0x09, 0x5b, 0xa6, 0xed, 0x77, 0x6b, 0x6d, 0xbf, 0xed, 0xd7, 0x24, 0xa3, 0x15, 0x5e, 0xc8, 0x37, + 0xf9, 0x22, 0x9f, 0xc6, 0x4a, 0x07, 0xd5, 0x19, 0xa7, 0xb6, 0xcf, 0x48, 0xad, 0x97, 0xf1, 0x76, + 0xf0, 0xe1, 0x14, 0xd3, 0xc5, 0x76, 0x87, 0x7a, 0x84, 0x0d, 0x6a, 0xc1, 0x65, 0x3b, 0x1a, 0xe0, + 0xb5, 0x2e, 0x11, 0x38, 0x8f, 0x55, 0x9b, 0xc7, 0x62, 0xa1, 0x27, 0x68, 0x97, 0x64, 0x08, 0x3f, + 0xba, 0x8e, 0xc0, 0xed, 0x0e, 0xe9, 0xe2, 0x0c, 0xef, 0xc1, 0x3c, 0x5e, 0x28, 0xa8, 0x5b, 0xa3, + 0x9e, 0xe0, 0x82, 0xa5, 0x49, 0xd5, 0x8f, 0xc1, 0xf6, 0x91, 0xeb, 0xfa, 0x5f, 0x10, 0xe7, 0xc4, + 0x25, 0xfd, 0xcf, 0x7c, 0x37, 0xec, 0x12, 0xf8, 0x03, 0xb0, 0xea, 0x30, 0xda, 0x23, 0x4c, 0xd7, + 0xee, 0x6a, 0xf7, 0xd6, 0xac, 0xf2, 0xd5, 0xd0, 0x58, 0x1a, 0x0d, 0x8d, 0xd5, 0xba, 0x1c, 0x45, + 0xca, 0x5a, 0xe5, 0xe0, 0xb6, 0x22, 0x3f, 0xf1, 0xb9, 0x68, 0x60, 0xd1, 0x81, 0x87, 0x00, 0x04, + 0x58, 0x74, 0x1a, 0x8c, 0x5c, 0xd0, 0xbe, 0xa2, 0x43, 0x45, 0x07, 0x8d, 0x89, 0x05, 0xcd, 0xa0, + 0xe0, 0x7b, 0xa0, 0xc4, 0x08, 0x76, 0xce, 0x3d, 0x77, 0xa0, 0xdf, 0xba, 0xab, 0xdd, 0x2b, 0x59, + 0x5b, 0x8a, 0x51, 0x42, 0x6a, 0x1c, 0x4d, 0x10, 0xd5, 0x7f, 0x6b, 0xa0, 0x74, 0xdc, 0xa3, 0xb6, + 0xa0, 0xbe, 0x07, 0x7f, 0x0f, 0x4a, 0x51, 0xde, 0x1d, 0x2c, 0xb0, 0x74, 0xb6, 0x7e, 0xf8, 0x81, + 0x39, 0xad, 0x89, 0x49, 0x1a, 0xcc, 0xe0, 0xb2, 0x1d, 0x0d, 0x70, 0x33, 0x42, 0x9b, 0xbd, 0xfb, + 0xe6, 0x79, 0xeb, 0x73, 0x62, 0x8b, 0x33, 0x22, 0xf0, 0x34, 0xbc, 0xe9, 0x18, 0x9a, 0xa8, 0x42, + 0x17, 0x6c, 0x3a, 0xc4, 0x25, 0x82, 0x9c, 0x07, 0x91, 0x47, 0x2e, 0x23, 0x5c, 0x3f, 0x7c, 0xf0, + 0x7a, 0x6e, 0xea, 0xb3, 0x54, 0x6b, 0x7b, 0x34, 0x34, 0x36, 0x13, 0x43, 0x28, 0x29, 0x5e, 0xfd, + 0x52, 0x03, 0xfb, 0x27, 0xcd, 0xc7, 0xcc, 0x0f, 0x83, 0xa6, 0x88, 0xd6, 0xa9, 0x3d, 0x50, 0x26, + 0xf8, 0x63, 0xb0, 0xcc, 0x42, 0x97, 0xa8, 0x9c, 0xbe, 0xa3, 0x82, 0x5e, 0x46, 0xa1, 0x4b, 0x5e, + 0x0d, 0x8d, 0x9d, 0x14, 0xeb, 0xd9, 0x20, 0x20, 0x48, 0x12, 0xe0, 0xa7, 0x60, 0x95, 0x61, 0xaf, + 0x4d, 0xa2, 0xd0, 0x0b, 0xf7, 0xd6, 0x0f, 0xab, 0xe6, 0xdc, 0x5d, 0x63, 0x9e, 0xd6, 0x51, 0x04, + 0x9d, 0xae, 0xb8, 0x7c, 0xe5, 0x48, 0x29, 0x54, 0xcf, 0xc0, 0xa6, 0x5c, 0x6a, 0x9f, 0x09, 0x69, + 0x81, 0x77, 0x40, 0xa1, 0x4b, 0x3d, 0x19, 0xd4, 0x8a, 0xb5, 0xae, 0x58, 0x85, 0x33, 0xea, 0xa1, + 0x68, 0x5c, 0x9a, 0x71, 0x5f, 0xe6, 0x6c, 0xd6, 0x8c, 0xfb, 0x28, 0x1a, 0xaf, 0x3e, 0x06, 0x45, + 0xe5, 0x71, 0x56, 0xa8, 0xb0, 0x58, 0xa8, 0x90, 0x23, 0xf4, 0xd7, 0x5b, 0x60, 0xa7, 0xe1, 0x3b, + 0x75, 0xca, 0x59, 0x28, 0xf3, 0x65, 0x85, 0x4e, 0x9b, 0x88, 0x37, 0x50, 0x1f, 0xcf, 0xc0, 0x32, + 0x0f, 0x88, 0xad, 0xca, 0xe2, 0x70, 0x41, 0x6e, 0x73, 0xe2, 0x6b, 0x06, 0xc4, 0xb6, 0x36, 0xe2, + 0xa5, 0x8c, 0xde, 0x90, 0x54, 0x83, 0x2f, 0xc0, 0x2a, 0x17, 0x58, 0x84, 0x5c, 0x2f, 0x48, 0xdd, + 0x0f, 0x6f, 0xa8, 0x2b, 0xb9, 0xd3, 0x55, 0x1c, 0xbf, 0x23, 0xa5, 0x59, 0xfd, 0xa7, 0x06, 0xbe, + 0x97, 0xc3, 0x7a, 0x4a, 0xb9, 0x80, 0x2f, 0x32, 0x19, 0x33, 0x5f, 0x2f, 0x63, 0x11, 0x5b, 0xe6, + 0x6b, 0xb2, 0x79, 0xe3, 0x91, 0x99, 0x6c, 0x35, 0xc1, 0x0a, 0x15, 0xa4, 0x1b, 0x97, 0xa2, 0x79, + 0xb3, 0x69, 0x59, 0x9b, 0x4a, 0x7a, 0xe5, 0x34, 0x12, 0x41, 0x63, 0xad, 0xea, 0xbf, 0x6e, 0xe5, + 0x4e, 0x27, 0x4a, 0x27, 0xbc, 0x00, 0x1b, 0x5d, 0xea, 0x1d, 0xf5, 0x30, 0x75, 0x71, 0x4b, 0xed, + 0x9e, 0x45, 0x45, 0x10, 0xf5, 0x4a, 0x73, 0xdc, 0x2b, 0xcd, 0x53, 0x4f, 0x9c, 0xb3, 0xa6, 0x60, + 0xd4, 0x6b, 0x5b, 0x5b, 0xa3, 0xa1, 0xb1, 0x71, 0x36, 0xa3, 0x84, 0x12, 0xba, 0xf0, 0xb7, 0xa0, + 0xc4, 0x89, 0x4b, 0x6c, 0xe1, 0xb3, 0x9b, 0x75, 0x88, 0xa7, 0xb8, 0x45, 0xdc, 0xa6, 0xa2, 0x5a, + 0x1b, 0x51, 0xde, 0xe2, 0x37, 0x34, 0x91, 0x84, 0x2e, 0x28, 0x77, 0x71, 0xff, 0xb9, 0x87, 0x27, + 0x13, 0x29, 0x7c, 0xcb, 0x89, 0xc0, 0xd1, 0xd0, 0x28, 0x9f, 0x25, 0xb4, 0x50, 0x4a, 0xbb, 0xfa, + 0xbf, 0x65, 0xf0, 0xd6, 0xdc, 0xaa, 0x82, 0x9f, 0x02, 0xe8, 0xb7, 0x38, 0x61, 0x3d, 0xe2, 0x3c, + 0x1e, 0x7f, 0x4d, 0xa8, 0x1f, 0x6f, 0xdc, 0x03, 0xb5, 0x40, 0xf0, 0x3c, 0x83, 0x40, 0x39, 0x2c, + 0xf8, 0x27, 0x0d, 0x6c, 0x3a, 0x63, 0x37, 0xc4, 0x69, 0xf8, 0x4e, 0x5c, 0x18, 0x8f, 0xbf, 0x4d, + 0xbd, 0x9b, 0xf5, 0x59, 0xa5, 0x63, 0x4f, 0xb0, 0x81, 0xb5, 0xa7, 0x02, 0xda, 0x4c, 0xd8, 0x50, + 0xd2, 0x29, 0x3c, 0x03, 0xd0, 0x99, 0x48, 0x72, 0xf5, 0x4d, 0x93, 0x29, 0x5e, 0xb1, 0xee, 0x28, + 0x85, 0xbd, 0x84, 0xdf, 0x18, 0x84, 0x72, 0x88, 0xf0, 0xe7, 0xa0, 0x6c, 0x87, 0x8c, 0x11, 0x4f, + 0x3c, 0x21, 0xd8, 0x15, 0x9d, 0x81, 0xbe, 0x2c, 0xa5, 0xf6, 0x95, 0x54, 0xf9, 0x51, 0xc2, 0x8a, + 0x52, 0xe8, 0x88, 0xef, 0x10, 0x4e, 0x19, 0x71, 0x62, 0xfe, 0x4a, 0x92, 0x5f, 0x4f, 0x58, 0x51, + 0x0a, 0x0d, 0x1f, 0x82, 0x0d, 0xd2, 0x0f, 0x88, 0x1d, 0xe7, 0x74, 0x55, 0xb2, 0x77, 0x15, 0x7b, + 0xe3, 0x78, 0xc6, 0x86, 0x12, 0xc8, 0x03, 0x17, 0xc0, 0x6c, 0x12, 0xe1, 0x16, 0x28, 0x5c, 0x92, + 0xc1, 0xf8, 0xcb, 0x83, 0xa2, 0x47, 0xf8, 0x09, 0x58, 0xe9, 0x61, 0x37, 0x24, 0xaa, 0xd6, 0xdf, + 0x7d, 0xbd, 0x5a, 0x7f, 0x46, 0xbb, 0x04, 0x8d, 0x89, 0x3f, 0xb9, 0xf5, 0x50, 0xab, 0xfe, 0x43, + 0x03, 0xdb, 0x0d, 0xdf, 0x69, 0x12, 0x3b, 0x64, 0x54, 0x0c, 0x1a, 0x72, 0x9d, 0xdf, 0x40, 0xcf, + 0x46, 0x89, 0x9e, 0xfd, 0xc1, 0xe2, 0x5a, 0x4b, 0x46, 0x37, 0xaf, 0x63, 0x57, 0xaf, 0x34, 0xb0, + 0x97, 0x41, 0xbf, 0x81, 0x8e, 0xfa, 0xcb, 0x64, 0x47, 0x7d, 0xef, 0x26, 0x93, 0x99, 0xd3, 0x4f, + 0xff, 0x5f, 0xce, 0x99, 0x8a, 0xec, 0xa6, 0xd1, 0xe9, 0x8e, 0xd1, 0x1e, 0x75, 0x49, 0x9b, 0x38, + 0x72, 0x32, 0xa5, 0x99, 0xd3, 0xdd, 0xc4, 0x82, 0x66, 0x50, 0x90, 0x83, 0x7d, 0x87, 0x5c, 0xe0, + 0xd0, 0x15, 0x47, 0x8e, 0xf3, 0x08, 0x07, 0xb8, 0x45, 0x5d, 0x2a, 0xa8, 0x3a, 0x8e, 0xac, 0x59, + 0x1f, 0x8f, 0x86, 0xc6, 0x7e, 0x3d, 0x17, 0xf1, 0x6a, 0x68, 0xdc, 0xc9, 0x9e, 0xcb, 0xcd, 0x09, + 0x64, 0x80, 0xe6, 0x48, 0xc3, 0x01, 0xd0, 0x19, 0xf9, 0x43, 0x18, 0x6d, 0x8a, 0x3a, 0xf3, 0x83, + 0x84, 0xdb, 0x82, 0x74, 0xfb, 0xb3, 0xd1, 0xd0, 0xd0, 0xd1, 0x1c, 0xcc, 0xf5, 0x8e, 0xe7, 0xca, + 0xc3, 0xcf, 0xc1, 0x0e, 0x1e, 0xf7, 0x81, 0x84, 0xd7, 0x65, 0xe9, 0xf5, 0xe1, 0x68, 0x68, 0xec, + 0x1c, 0x65, 0xcd, 0xd7, 0x3b, 0xcc, 0x13, 0x85, 0x35, 0x50, 0xec, 0xc9, 0x23, 0x3b, 0xd7, 0x57, + 0xa4, 0xfe, 0xde, 0x68, 0x68, 0x14, 0xc7, 0xa7, 0xf8, 0x48, 0x73, 0xf5, 0xa4, 0x29, 0x0f, 0x82, + 0x31, 0x0a, 0x7e, 0x04, 0xd6, 0x3b, 0x3e, 0x17, 0xbf, 0x20, 0xe2, 0x0b, 0x9f, 0x5d, 0xca, 0xc6, + 0x50, 0xb2, 0x76, 0xd4, 0x0a, 0xae, 0x3f, 0x99, 0x9a, 0xd0, 0x2c, 0x0e, 0xfe, 0x1a, 0xac, 0x75, + 0xd4, 0xb1, 0x8f, 0xeb, 0x45, 0x59, 0x68, 0xf7, 0x16, 0x14, 0x5a, 0xe2, 0x88, 0x68, 0x6d, 0x2b, + 0xf9, 0xb5, 0x78, 0x98, 0xa3, 0xa9, 0x1a, 0xfc, 0x21, 0x28, 0xca, 0x97, 0xd3, 0xba, 0x5e, 0x92, + 0xd1, 0xdc, 0x56, 0xf0, 0xe2, 0x93, 0xf1, 0x30, 0x8a, 0xed, 0x31, 0xf4, 0xb4, 0xf1, 0x48, 0x5f, + 0xcb, 0x42, 0x4f, 0x1b, 0x8f, 0x50, 0x6c, 0x87, 0x2f, 0x40, 0x91, 0x93, 0xa7, 0xd4, 0x0b, 0xfb, + 0x3a, 0x90, 0x5b, 0xee, 0xfe, 0x82, 0x70, 0x9b, 0xc7, 0x12, 0x99, 0x3a, 0x70, 0x4f, 0xd5, 0x95, + 0x1d, 0xc5, 0x92, 0xd0, 0x01, 0x6b, 0x2c, 0xf4, 0x8e, 0xf8, 0x73, 0x4e, 0x98, 0xbe, 0x9e, 0xf9, + 0xda, 0xa7, 0xf5, 0x51, 0x8c, 0x4d, 0x7b, 0x98, 0x64, 0x66, 0x82, 0x40, 0x53, 0x61, 0xf8, 0x67, + 0x0d, 0x40, 0x1e, 0x06, 0x81, 0x4b, 0xba, 0xc4, 0x13, 0xd8, 0x95, 0xe7, 0x7b, 0xae, 0x6f, 0x48, + 0x7f, 0x3f, 0x5d, 0x34, 0x9f, 0x0c, 0x29, 0xed, 0x78, 0xf2, 0x99, 0xce, 0x42, 0x51, 0x8e, 0xcf, + 0x28, 0x9d, 0x17, 0x5c, 0x3e, 0xeb, 0x9b, 0xd7, 0xa6, 0x33, 0xff, 0xff, 0x65, 0x9a, 0x4e, 0x65, + 0x47, 0xb1, 0x24, 0xfc, 0x0c, 0xec, 0xc7, 0x7f, 0x77, 0xc8, 0xf7, 0xc5, 0x09, 0x75, 0x09, 0x1f, + 0x70, 0x41, 0xba, 0x7a, 0x59, 0x2e, 0x73, 0x45, 0x31, 0xf7, 0x51, 0x2e, 0x0a, 0xcd, 0x61, 0xc3, + 0x2e, 0x30, 0xe2, 0xf6, 0x10, 0xed, 0x9d, 0x49, 0x7f, 0x3a, 0xe6, 0x36, 0x76, 0xc7, 0xa7, 0x96, + 0xdb, 0xd2, 0xc1, 0x3b, 0xa3, 0xa1, 0x61, 0xd4, 0x17, 0x43, 0xd1, 0x75, 0x5a, 0xf0, 0x57, 0x40, + 0xc7, 0xf3, 0xfc, 0x6c, 0x49, 0x3f, 0xdf, 0x8f, 0x7a, 0xce, 0x5c, 0x07, 0x73, 0xd9, 0x30, 0x00, + 0x5b, 0x38, 0xf9, 0x9f, 0xcd, 0xf5, 0x6d, 0xb9, 0x0b, 0xdf, 0x5d, 0xb0, 0x0e, 0xa9, 0x5f, 0x73, + 0x4b, 0x57, 0x69, 0xdc, 0x4a, 0x19, 0x38, 0xca, 0xa8, 0xc3, 0x3e, 0x80, 0x38, 0x7d, 0x2d, 0xc0, + 0x75, 0x78, 0xed, 0x27, 0x26, 0x73, 0x97, 0x30, 0x2d, 0xb5, 0x8c, 0x89, 0xa3, 0x1c, 0x1f, 0xf0, + 0x29, 0xd8, 0x55, 0xa3, 0xcf, 0x3d, 0x8e, 0x2f, 0x48, 0x73, 0xc0, 0x6d, 0xe1, 0x72, 0x7d, 0x47, + 0xf6, 0x37, 0x7d, 0x34, 0x34, 0x76, 0x8f, 0x72, 0xec, 0x28, 0x97, 0x05, 0x3f, 0x01, 0x5b, 0x17, + 0x3e, 0x6b, 0x51, 0xc7, 0x21, 0x5e, 0xac, 0xb4, 0x2b, 0x95, 0x76, 0xa3, 0x4c, 0x9c, 0xa4, 0x6c, + 0x28, 0x83, 0x86, 0x1c, 0xec, 0x29, 0xe5, 0x06, 0xf3, 0xed, 0x33, 0x3f, 0xf4, 0x44, 0xd4, 0x52, + 0xb9, 0xbe, 0x37, 0xf9, 0x8c, 0xec, 0x1d, 0xe5, 0x01, 0x5e, 0x0d, 0x8d, 0xbb, 0x39, 0x2d, 0x3d, + 0x01, 0x42, 0xf9, 0xda, 0xd5, 0x2f, 0x35, 0xa0, 0xcf, 0xeb, 0x1a, 0xf0, 0xa3, 0xc4, 0x45, 0xc0, + 0xdb, 0xa9, 0x8b, 0x80, 0xed, 0x0c, 0xef, 0x3b, 0xb8, 0x06, 0xf8, 0x9b, 0x06, 0xf6, 0xf3, 0xbb, + 0x26, 0x7c, 0x90, 0x88, 0xce, 0x48, 0x45, 0x77, 0x3b, 0xc5, 0x52, 0xb1, 0xfd, 0x0e, 0x94, 0x55, + 0x6f, 0x4d, 0xde, 0xb2, 0x24, 0x62, 0x8c, 0x32, 0x18, 0x1d, 0x8b, 0x94, 0x44, 0xdc, 0x57, 0xe4, + 0x0f, 0x4d, 0x72, 0x0c, 0xa5, 0xd4, 0xaa, 0x7f, 0xd7, 0xc0, 0xdb, 0xd7, 0x76, 0x45, 0x68, 0x25, + 0x42, 0x37, 0x53, 0xa1, 0x57, 0xe6, 0x0b, 0x7c, 0x37, 0x97, 0x2d, 0xd6, 0xfb, 0x57, 0x2f, 0x2b, + 0x4b, 0x5f, 0xbd, 0xac, 0x2c, 0x7d, 0xfd, 0xb2, 0xb2, 0xf4, 0xc7, 0x51, 0x45, 0xbb, 0x1a, 0x55, + 0xb4, 0xaf, 0x46, 0x15, 0xed, 0xeb, 0x51, 0x45, 0xfb, 0xcf, 0xa8, 0xa2, 0xfd, 0xe5, 0xbf, 0x95, + 0xa5, 0xdf, 0x14, 0x95, 0xdc, 0x37, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xba, 0x23, 0xa4, 0x51, + 0x15, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/policy/v1beta1/generated.proto b/vendor/k8s.io/api/policy/v1beta1/generated.proto index 1a14d946..aa37d948 100644 --- a/vendor/k8s.io/api/policy/v1beta1/generated.proto +++ b/vendor/k8s.io/api/policy/v1beta1/generated.proto @@ -151,6 +151,7 @@ message PodDisruptionBudgetStatus { // the list automatically by PodDisruptionBudget controller after some time. // If everything goes smooth this map should be empty for the most of the time. // Large number of entries in the map may indicate problems with pod deletions. + // +optional map disruptedPods = 2; // Number of pod disruptions that are currently allowed. @@ -296,6 +297,12 @@ message PodSecurityPolicySpec { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional repeated string forbiddenSysctls = 20; + + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. + // +optional + repeated string allowedProcMountTypes = 21; } // RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy. diff --git a/vendor/k8s.io/api/policy/v1beta1/types.go b/vendor/k8s.io/api/policy/v1beta1/types.go index ba1e4ff3..c1a27275 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types.go +++ b/vendor/k8s.io/api/policy/v1beta1/types.go @@ -60,7 +60,8 @@ type PodDisruptionBudgetStatus struct { // the list automatically by PodDisruptionBudget controller after some time. // If everything goes smooth this map should be empty for the most of the time. // Large number of entries in the map may indicate problems with pod deletions. - DisruptedPods map[string]metav1.Time `json:"disruptedPods" protobuf:"bytes,2,rep,name=disruptedPods"` + // +optional + DisruptedPods map[string]metav1.Time `json:"disruptedPods,omitempty" protobuf:"bytes,2,rep,name=disruptedPods"` // Number of pod disruptions that are currently allowed. PodDisruptionsAllowed int32 `json:"disruptionsAllowed" protobuf:"varint,3,opt,name=disruptionsAllowed"` @@ -220,6 +221,11 @@ type PodSecurityPolicySpec struct { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. + // +optional + AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty" protobuf:"bytes,21,opt,name=allowedProcMountTypes"` } // AllowedHostPath defines the host volume conditions that will be enabled by a policy diff --git a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go index 12228764..df10b2a2 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go @@ -171,6 +171,7 @@ var map_PodSecurityPolicySpec = map[string]string{ "allowedFlexVolumes": "allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", + "allowedProcMountTypes": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", } func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go index 1980bd16..9af268a4 100644 --- a/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1beta1 import ( - core_v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" intstr "k8s.io/apimachinery/pkg/util/intstr" @@ -66,12 +66,8 @@ func (in *Eviction) DeepCopyInto(out *Eviction) { in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) if in.DeleteOptions != nil { in, out := &in.DeleteOptions, &out.DeleteOptions - if *in == nil { - *out = nil - } else { - *out = new(v1.DeleteOptions) - (*in).DeepCopyInto(*out) - } + *out = new(v1.DeleteOptions) + (*in).DeepCopyInto(*out) } return } @@ -213,30 +209,18 @@ func (in *PodDisruptionBudgetSpec) DeepCopyInto(out *PodDisruptionBudgetSpec) { *out = *in if in.MinAvailable != nil { in, out := &in.MinAvailable, &out.MinAvailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.MaxUnavailable != nil { in, out := &in.MaxUnavailable, &out.MaxUnavailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -339,17 +323,17 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = *in if in.DefaultAddCapabilities != nil { in, out := &in.DefaultAddCapabilities, &out.DefaultAddCapabilities - *out = make([]core_v1.Capability, len(*in)) + *out = make([]corev1.Capability, len(*in)) copy(*out, *in) } if in.RequiredDropCapabilities != nil { in, out := &in.RequiredDropCapabilities, &out.RequiredDropCapabilities - *out = make([]core_v1.Capability, len(*in)) + *out = make([]corev1.Capability, len(*in)) copy(*out, *in) } if in.AllowedCapabilities != nil { in, out := &in.AllowedCapabilities, &out.AllowedCapabilities - *out = make([]core_v1.Capability, len(*in)) + *out = make([]corev1.Capability, len(*in)) copy(*out, *in) } if in.Volumes != nil { @@ -368,21 +352,13 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { in.FSGroup.DeepCopyInto(&out.FSGroup) if in.DefaultAllowPrivilegeEscalation != nil { in, out := &in.DefaultAllowPrivilegeEscalation, &out.DefaultAllowPrivilegeEscalation - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.AllowPrivilegeEscalation != nil { in, out := &in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.AllowedHostPaths != nil { in, out := &in.AllowedHostPaths, &out.AllowedHostPaths @@ -404,6 +380,11 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowedProcMountTypes != nil { + in, out := &in.AllowedProcMountTypes, &out.AllowedProcMountTypes + *out = make([]corev1.ProcMountType, len(*in)) + copy(*out, *in) + } return } @@ -443,12 +424,8 @@ func (in *SELinuxStrategyOptions) DeepCopyInto(out *SELinuxStrategyOptions) { *out = *in if in.SELinuxOptions != nil { in, out := &in.SELinuxOptions, &out.SELinuxOptions - if *in == nil { - *out = nil - } else { - *out = new(core_v1.SELinuxOptions) - **out = **in - } + *out = new(corev1.SELinuxOptions) + **out = **in } return } diff --git a/vendor/k8s.io/api/rbac/v1/BUILD b/vendor/k8s.io/api/rbac/v1/BUILD index 539afb7a..8b8094de 100644 --- a/vendor/k8s.io/api/rbac/v1/BUILD +++ b/vendor/k8s.io/api/rbac/v1/BUILD @@ -15,12 +15,13 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1", importpath = "k8s.io/api/rbac/v1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -36,9 +37,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/rbac/v1/generated.pb.go b/vendor/k8s.io/api/rbac/v1/generated.pb.go index 6dd7d727..21010fbe 100644 --- a/vendor/k8s.io/api/rbac/v1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1/generated.pb.go @@ -2693,57 +2693,56 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 827 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x55, 0xcf, 0x8b, 0x23, 0x45, - 0x18, 0x4d, 0x65, 0x12, 0x26, 0x5d, 0x31, 0xc4, 0x2d, 0x17, 0x69, 0xa2, 0x74, 0x86, 0x16, 0x24, - 0xa0, 0x76, 0x9b, 0x5d, 0x51, 0x41, 0xf6, 0xb0, 0xbd, 0xa2, 0x0c, 0x3b, 0x8e, 0x4b, 0x2d, 0x7a, - 0x10, 0x0f, 0x56, 0x77, 0x6a, 0x3b, 0x65, 0xfa, 0x17, 0x55, 0xd5, 0x81, 0xc5, 0x8b, 0x08, 0x1e, - 0xbc, 0x79, 0xd4, 0xbf, 0xc0, 0x8b, 0x1e, 0xfd, 0x0b, 0xbc, 0xcc, 0x71, 0x8f, 0x7b, 0x0a, 0x4e, - 0xfb, 0x87, 0x28, 0xfd, 0x2b, 0x9d, 0xa4, 0x3b, 0x4e, 0x4e, 0x01, 0xf1, 0x34, 0x53, 0xdf, 0xf7, - 0xde, 0xfb, 0x5e, 0xbf, 0xa9, 0xaf, 0x06, 0x7e, 0xb0, 0x78, 0x5f, 0x18, 0x2c, 0x34, 0x17, 0xb1, - 0x4d, 0x79, 0x40, 0x25, 0x15, 0xe6, 0x92, 0x06, 0xb3, 0x90, 0x9b, 0x45, 0x83, 0x44, 0xcc, 0xe4, - 0x36, 0x71, 0xcc, 0xe5, 0xd4, 0x74, 0x69, 0x40, 0x39, 0x91, 0x74, 0x66, 0x44, 0x3c, 0x94, 0x21, - 0x42, 0x39, 0xc6, 0x20, 0x11, 0x33, 0x52, 0x8c, 0xb1, 0x9c, 0x8e, 0xde, 0x72, 0x99, 0x9c, 0xc7, - 0xb6, 0xe1, 0x84, 0xbe, 0xe9, 0x86, 0x6e, 0x68, 0x66, 0x50, 0x3b, 0x7e, 0x92, 0x9d, 0xb2, 0x43, - 0xf6, 0x5b, 0x2e, 0x31, 0x9a, 0xd4, 0xc7, 0x10, 0x2f, 0x9a, 0x93, 0xda, 0xb0, 0xd1, 0x3b, 0x15, - 0xd2, 0x27, 0xce, 0x9c, 0x05, 0x94, 0x3f, 0x35, 0xa3, 0x85, 0x9b, 0x16, 0x84, 0xe9, 0x53, 0x49, - 0x1a, 0x2c, 0x8e, 0xcc, 0x7d, 0x2c, 0x1e, 0x07, 0x92, 0xf9, 0xb4, 0x46, 0x78, 0xf7, 0x26, 0x82, - 0x70, 0xe6, 0xd4, 0x27, 0x35, 0xde, 0xdd, 0x7d, 0xbc, 0x58, 0x32, 0xcf, 0x64, 0x81, 0x14, 0x92, - 0xef, 0x92, 0xf4, 0x9f, 0x01, 0x1c, 0xde, 0x77, 0x5d, 0x4e, 0x5d, 0x22, 0x59, 0x18, 0xe0, 0xd8, - 0xa3, 0xe8, 0x7b, 0x00, 0x6f, 0x3b, 0x5e, 0x2c, 0x24, 0xe5, 0x38, 0xf4, 0xe8, 0x63, 0xea, 0x51, - 0x47, 0x86, 0x5c, 0xa8, 0xe0, 0xec, 0x64, 0xd2, 0xbf, 0x73, 0xd7, 0xa8, 0x42, 0x5f, 0x0f, 0x32, - 0xa2, 0x85, 0x9b, 0x16, 0x84, 0x91, 0xe6, 0x60, 0x2c, 0xa7, 0xc6, 0x05, 0xb1, 0xa9, 0x57, 0x72, - 0xad, 0x57, 0xaf, 0x56, 0xe3, 0x56, 0xb2, 0x1a, 0xdf, 0x7e, 0xd0, 0x20, 0x8c, 0x1b, 0xc7, 0xe9, - 0x3f, 0xb5, 0x61, 0x7f, 0x03, 0x8e, 0xbe, 0x82, 0xbd, 0x54, 0x7c, 0x46, 0x24, 0x51, 0xc1, 0x19, - 0x98, 0xf4, 0xef, 0xbc, 0x7d, 0x98, 0x95, 0x4f, 0xed, 0xaf, 0xa9, 0x23, 0x3f, 0xa1, 0x92, 0x58, - 0xa8, 0xf0, 0x01, 0xab, 0x1a, 0x5e, 0xab, 0xa2, 0x07, 0xb0, 0xcb, 0x63, 0x8f, 0x0a, 0xb5, 0x9d, - 0x7d, 0xa9, 0x66, 0xd4, 0xaf, 0x97, 0xf1, 0x28, 0xf4, 0x98, 0xf3, 0x34, 0x0d, 0xca, 0x1a, 0x14, - 0x62, 0xdd, 0xf4, 0x24, 0x70, 0xce, 0x45, 0x36, 0x1c, 0x92, 0xed, 0x44, 0xd5, 0x93, 0xcc, 0xed, - 0x6b, 0x4d, 0x72, 0x3b, 0xe1, 0x5b, 0x2f, 0x25, 0xab, 0xf1, 0xee, 0x5f, 0x04, 0xef, 0x0a, 0xea, - 0x3f, 0xb4, 0x21, 0xda, 0x88, 0xc6, 0x62, 0xc1, 0x8c, 0x05, 0xee, 0x11, 0x12, 0x3a, 0x87, 0x3d, - 0x11, 0x67, 0x8d, 0x32, 0xa4, 0x57, 0x9a, 0xbe, 0xea, 0x71, 0x8e, 0xb1, 0x5e, 0x2c, 0xc4, 0x7a, - 0x45, 0x41, 0xe0, 0x35, 0x1d, 0x7d, 0x04, 0x4f, 0x79, 0xe8, 0x51, 0x4c, 0x9f, 0x14, 0xf9, 0x34, - 0x2a, 0xe1, 0x1c, 0x62, 0x0d, 0x0b, 0xa5, 0xd3, 0xa2, 0x80, 0x4b, 0xb2, 0xfe, 0x07, 0x80, 0x2f, - 0xd7, 0xb3, 0xb8, 0x60, 0x42, 0xa2, 0x2f, 0x6b, 0x79, 0x18, 0x07, 0x5e, 0x5e, 0x26, 0xf2, 0x34, - 0xd6, 0x1f, 0x50, 0x56, 0x36, 0xb2, 0x78, 0x08, 0xbb, 0x4c, 0x52, 0xbf, 0x0c, 0xe2, 0xf5, 0x26, - 0xfb, 0x75, 0x63, 0xd5, 0xad, 0x39, 0x4f, 0xc9, 0x38, 0xd7, 0xd0, 0x7f, 0x07, 0x70, 0xb8, 0x01, - 0x3e, 0x82, 0xfd, 0x0f, 0xb7, 0xed, 0x8f, 0x6f, 0xb2, 0xdf, 0xec, 0xfb, 0x6f, 0x00, 0x61, 0xb5, - 0x12, 0x68, 0x0c, 0xbb, 0x4b, 0xca, 0xed, 0xfc, 0xad, 0x50, 0x2c, 0x25, 0xc5, 0x7f, 0x9e, 0x16, - 0x70, 0x5e, 0x47, 0x6f, 0x40, 0x85, 0x44, 0xec, 0x63, 0x1e, 0xc6, 0x51, 0x3e, 0x59, 0xb1, 0x06, - 0xc9, 0x6a, 0xac, 0xdc, 0x7f, 0x74, 0x9e, 0x17, 0x71, 0xd5, 0x4f, 0xc1, 0x9c, 0x8a, 0x30, 0xe6, - 0x0e, 0x15, 0xea, 0x49, 0x05, 0xc6, 0x65, 0x11, 0x57, 0x7d, 0xf4, 0x1e, 0x1c, 0x94, 0x87, 0x4b, - 0xe2, 0x53, 0xa1, 0x76, 0x32, 0xc2, 0xad, 0x64, 0x35, 0x1e, 0xe0, 0xcd, 0x06, 0xde, 0xc6, 0xa1, - 0x7b, 0x70, 0x18, 0x84, 0x41, 0x09, 0xf9, 0x0c, 0x5f, 0x08, 0xb5, 0x9b, 0x51, 0xb3, 0x5d, 0xbc, - 0xdc, 0x6e, 0xe1, 0x5d, 0xac, 0xfe, 0x1b, 0x80, 0x9d, 0xff, 0xd0, 0xfb, 0xa4, 0x7f, 0xd7, 0x86, - 0xfd, 0xff, 0xfd, 0xa3, 0x91, 0xae, 0xdb, 0x71, 0x5f, 0x8b, 0x43, 0xd6, 0xed, 0xe6, 0x67, 0xe2, - 0x17, 0x00, 0x7b, 0x47, 0x7a, 0x1f, 0xee, 0x6d, 0x1b, 0x56, 0xf7, 0x1a, 0x6e, 0x76, 0xfa, 0x0d, - 0x2c, 0x53, 0x47, 0x6f, 0xc2, 0x5e, 0xb9, 0xd3, 0x99, 0x4f, 0xa5, 0x9a, 0x5b, 0xae, 0x3d, 0x5e, - 0x23, 0xd0, 0x19, 0xec, 0x2c, 0x58, 0x30, 0x53, 0xdb, 0x19, 0xf2, 0x85, 0x02, 0xd9, 0x79, 0xc8, - 0x82, 0x19, 0xce, 0x3a, 0x29, 0x22, 0x20, 0x7e, 0xfe, 0x6f, 0x75, 0x03, 0x91, 0x6e, 0x33, 0xce, - 0x3a, 0xfa, 0xaf, 0x00, 0x9e, 0x16, 0xb7, 0x67, 0xad, 0x07, 0xf6, 0xea, 0x6d, 0xfa, 0x6b, 0x1f, - 0xe2, 0xef, 0xdf, 0xa7, 0x23, 0x13, 0x2a, 0xe9, 0x4f, 0x11, 0x11, 0x87, 0xaa, 0x9d, 0x0c, 0x76, - 0xab, 0x80, 0x29, 0x97, 0x65, 0x03, 0x57, 0x18, 0x6b, 0x72, 0x75, 0xad, 0xb5, 0x9e, 0x5d, 0x6b, - 0xad, 0xe7, 0xd7, 0x5a, 0xeb, 0xdb, 0x44, 0x03, 0x57, 0x89, 0x06, 0x9e, 0x25, 0x1a, 0x78, 0x9e, - 0x68, 0xe0, 0xcf, 0x44, 0x03, 0x3f, 0xfe, 0xa5, 0xb5, 0xbe, 0x68, 0x2f, 0xa7, 0xff, 0x04, 0x00, - 0x00, 0xff, 0xff, 0x32, 0xe3, 0x23, 0xf8, 0x2e, 0x0b, 0x00, 0x00, + // 807 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x55, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0xce, 0xa4, 0x89, 0x1a, 0x4f, 0x88, 0x42, 0x87, 0x0a, 0x59, 0x05, 0x39, 0x95, 0x91, 0x50, + 0x25, 0xc0, 0x26, 0x05, 0x01, 0x12, 0xea, 0xa1, 0x2e, 0x02, 0x55, 0x2d, 0xa5, 0x9a, 0x0a, 0x0e, + 0x88, 0x03, 0x63, 0x67, 0xea, 0x0e, 0xf1, 0x2f, 0xcd, 0xd8, 0x91, 0x2a, 0x2e, 0x08, 0x89, 0x03, + 0xb7, 0x3d, 0xee, 0xfe, 0x05, 0x7b, 0xd9, 0x3d, 0xee, 0x5f, 0xb0, 0x97, 0x1e, 0x7b, 0xec, 0x29, + 0xda, 0x7a, 0xff, 0x90, 0x5d, 0xf9, 0x57, 0x9c, 0x1f, 0xee, 0x36, 0xa7, 0x48, 0xab, 0x3d, 0xb5, + 0xf3, 0xde, 0xf7, 0xbe, 0xf7, 0xcd, 0xe7, 0x79, 0x2f, 0xf0, 0xfb, 0xe1, 0x77, 0x42, 0x63, 0xbe, + 0x3e, 0x8c, 0x4c, 0xca, 0x3d, 0x1a, 0x52, 0xa1, 0x8f, 0xa8, 0x37, 0xf0, 0xb9, 0x9e, 0x27, 0x48, + 0xc0, 0x74, 0x6e, 0x12, 0x4b, 0x1f, 0xf5, 0x75, 0x9b, 0x7a, 0x94, 0x93, 0x90, 0x0e, 0xb4, 0x80, + 0xfb, 0xa1, 0x8f, 0x50, 0x86, 0xd1, 0x48, 0xc0, 0xb4, 0x04, 0xa3, 0x8d, 0xfa, 0x5b, 0x5f, 0xd8, + 0x2c, 0xbc, 0x88, 0x4c, 0xcd, 0xf2, 0x5d, 0xdd, 0xf6, 0x6d, 0x5f, 0x4f, 0xa1, 0x66, 0x74, 0x9e, + 0x9e, 0xd2, 0x43, 0xfa, 0x5f, 0x46, 0xb1, 0xf5, 0x75, 0xd9, 0xc6, 0x25, 0xd6, 0x05, 0xf3, 0x28, + 0xbf, 0xd4, 0x83, 0xa1, 0x9d, 0x04, 0x84, 0xee, 0xd2, 0x90, 0x54, 0x34, 0xde, 0xd2, 0xef, 0xaa, + 0xe2, 0x91, 0x17, 0x32, 0x97, 0x2e, 0x14, 0x7c, 0x73, 0x5f, 0x81, 0xb0, 0x2e, 0xa8, 0x4b, 0xe6, + 0xeb, 0xd4, 0x47, 0x00, 0x76, 0xf7, 0x6d, 0x9b, 0x53, 0x9b, 0x84, 0xcc, 0xf7, 0x70, 0xe4, 0x50, + 0xf4, 0x1f, 0x80, 0x9b, 0x96, 0x13, 0x89, 0x90, 0x72, 0xec, 0x3b, 0xf4, 0x8c, 0x3a, 0xd4, 0x0a, + 0x7d, 0x2e, 0x64, 0xb0, 0xbd, 0xb6, 0xd3, 0xde, 0xfd, 0x4a, 0x2b, 0x5d, 0x99, 0xf4, 0xd2, 0x82, + 0xa1, 0x9d, 0x04, 0x84, 0x96, 0x5c, 0x49, 0x1b, 0xf5, 0xb5, 0x63, 0x62, 0x52, 0xa7, 0xa8, 0x35, + 0x3e, 0xbe, 0x1a, 0xf7, 0x6a, 0xf1, 0xb8, 0xb7, 0x79, 0x50, 0x41, 0x8c, 0x2b, 0xdb, 0xa9, 0x0f, + 0xeb, 0xb0, 0x3d, 0x05, 0x47, 0x7f, 0xc2, 0x56, 0x42, 0x3e, 0x20, 0x21, 0x91, 0xc1, 0x36, 0xd8, + 0x69, 0xef, 0x7e, 0xb9, 0x9c, 0x94, 0x5f, 0xcc, 0xbf, 0xa8, 0x15, 0xfe, 0x4c, 0x43, 0x62, 0xa0, + 0x5c, 0x07, 0x2c, 0x63, 0x78, 0xc2, 0x8a, 0x0e, 0x60, 0x93, 0x47, 0x0e, 0x15, 0x72, 0x3d, 0xbd, + 0xa9, 0xa2, 0x2d, 0x7e, 0x7f, 0xed, 0xd4, 0x77, 0x98, 0x75, 0x99, 0x18, 0x65, 0x74, 0x72, 0xb2, + 0x66, 0x72, 0x12, 0x38, 0xab, 0x45, 0x26, 0xec, 0x92, 0x59, 0x47, 0xe5, 0xb5, 0x54, 0xed, 0x27, + 0x55, 0x74, 0x73, 0xe6, 0x1b, 0x1f, 0xc4, 0xe3, 0xde, 0xfc, 0x17, 0xc1, 0xf3, 0x84, 0xea, 0xff, + 0x75, 0x88, 0xa6, 0xac, 0x31, 0x98, 0x37, 0x60, 0x9e, 0xbd, 0x02, 0x87, 0x0e, 0x61, 0x4b, 0x44, + 0x69, 0xa2, 0x30, 0xe9, 0xa3, 0xaa, 0x5b, 0x9d, 0x65, 0x18, 0xe3, 0xfd, 0x9c, 0xac, 0x95, 0x07, + 0x04, 0x9e, 0x94, 0xa3, 0x1f, 0xe1, 0x3a, 0xf7, 0x1d, 0x8a, 0xe9, 0x79, 0xee, 0x4f, 0x25, 0x13, + 0xce, 0x20, 0x46, 0x37, 0x67, 0x5a, 0xcf, 0x03, 0xb8, 0x28, 0x56, 0x9f, 0x03, 0xf8, 0xe1, 0xa2, + 0x17, 0xc7, 0x4c, 0x84, 0xe8, 0x8f, 0x05, 0x3f, 0xb4, 0x25, 0x1f, 0x2f, 0x13, 0x99, 0x1b, 0x93, + 0x0b, 0x14, 0x91, 0x29, 0x2f, 0x8e, 0x60, 0x93, 0x85, 0xd4, 0x2d, 0x8c, 0xf8, 0xb4, 0x4a, 0xfe, + 0xa2, 0xb0, 0xf2, 0xd5, 0x1c, 0x26, 0xc5, 0x38, 0xe3, 0x50, 0x9f, 0x01, 0xd8, 0x9d, 0x02, 0xaf, + 0x40, 0xfe, 0x0f, 0xb3, 0xf2, 0x7b, 0xf7, 0xc9, 0xaf, 0xd6, 0xfd, 0x0a, 0x40, 0x58, 0x8e, 0x04, + 0xea, 0xc1, 0xe6, 0x88, 0x72, 0x33, 0xdb, 0x15, 0x92, 0x21, 0x25, 0xf8, 0xdf, 0x92, 0x00, 0xce, + 0xe2, 0xe8, 0x33, 0x28, 0x91, 0x80, 0xfd, 0xc4, 0xfd, 0x28, 0xc8, 0x3a, 0x4b, 0x46, 0x27, 0x1e, + 0xf7, 0xa4, 0xfd, 0xd3, 0xc3, 0x2c, 0x88, 0xcb, 0x7c, 0x02, 0xe6, 0x54, 0xf8, 0x11, 0xb7, 0xa8, + 0x90, 0xd7, 0x4a, 0x30, 0x2e, 0x82, 0xb8, 0xcc, 0xa3, 0x6f, 0x61, 0xa7, 0x38, 0x9c, 0x10, 0x97, + 0x0a, 0xb9, 0x91, 0x16, 0x6c, 0xc4, 0xe3, 0x5e, 0x07, 0x4f, 0x27, 0xf0, 0x2c, 0x0e, 0xed, 0xc1, + 0xae, 0xe7, 0x7b, 0x05, 0xe4, 0x57, 0x7c, 0x2c, 0xe4, 0x66, 0x5a, 0x9a, 0xce, 0xe2, 0xc9, 0x6c, + 0x0a, 0xcf, 0x63, 0xd5, 0xa7, 0x00, 0x36, 0xde, 0xa2, 0xfd, 0xa4, 0xfe, 0x5b, 0x87, 0xed, 0x77, + 0x7e, 0x69, 0x24, 0xe3, 0xb6, 0xda, 0x6d, 0xb1, 0xcc, 0xb8, 0xdd, 0xbf, 0x26, 0x1e, 0x03, 0xd8, + 0x5a, 0xd1, 0x7e, 0xd8, 0x9b, 0x15, 0x2c, 0xdf, 0x29, 0xb8, 0x5a, 0xe9, 0xdf, 0xb0, 0x70, 0x1d, + 0x7d, 0x0e, 0x5b, 0xc5, 0x4c, 0xa7, 0x3a, 0xa5, 0xb2, 0x6f, 0x31, 0xf6, 0x78, 0x82, 0x40, 0xdb, + 0xb0, 0x31, 0x64, 0xde, 0x40, 0xae, 0xa7, 0xc8, 0xf7, 0x72, 0x64, 0xe3, 0x88, 0x79, 0x03, 0x9c, + 0x66, 0x12, 0x84, 0x47, 0xdc, 0xec, 0x67, 0x75, 0x0a, 0x91, 0x4c, 0x33, 0x4e, 0x33, 0xea, 0x13, + 0x00, 0xd7, 0xf3, 0xd7, 0x33, 0xe1, 0x03, 0x77, 0xf2, 0x4d, 0xeb, 0xab, 0x2f, 0xa3, 0xef, 0xcd, + 0xdd, 0x91, 0x0e, 0xa5, 0xe4, 0xaf, 0x08, 0x88, 0x45, 0xe5, 0x46, 0x0a, 0xdb, 0xc8, 0x61, 0xd2, + 0x49, 0x91, 0xc0, 0x25, 0xc6, 0xd8, 0xb9, 0xba, 0x55, 0x6a, 0xd7, 0xb7, 0x4a, 0xed, 0xe6, 0x56, + 0xa9, 0xfd, 0x13, 0x2b, 0xe0, 0x2a, 0x56, 0xc0, 0x75, 0xac, 0x80, 0x9b, 0x58, 0x01, 0x2f, 0x62, + 0x05, 0x3c, 0x78, 0xa9, 0xd4, 0x7e, 0xaf, 0x8f, 0xfa, 0xaf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x24, + 0xa1, 0x47, 0x98, 0xcf, 0x0a, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/rbac/v1/generated.proto b/vendor/k8s.io/api/rbac/v1/generated.proto index 78aca15b..4b321a7c 100644 --- a/vendor/k8s.io/api/rbac/v1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1/generated.proto @@ -21,11 +21,9 @@ syntax = 'proto2'; package k8s.io.api.rbac.v1; -import "k8s.io/api/rbac/v1alpha1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; diff --git a/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go index be1592f7..07eb321e 100644 --- a/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1 import ( - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -30,7 +30,7 @@ func (in *AggregationRule) DeepCopyInto(out *AggregationRule) { *out = *in if in.ClusterRoleSelectors != nil { in, out := &in.ClusterRoleSelectors, &out.ClusterRoleSelectors - *out = make([]meta_v1.LabelSelector, len(*in)) + *out = make([]metav1.LabelSelector, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -62,12 +62,8 @@ func (in *ClusterRole) DeepCopyInto(out *ClusterRole) { } if in.AggregationRule != nil { in, out := &in.AggregationRule, &out.AggregationRule - if *in == nil { - *out = nil - } else { - *out = new(AggregationRule) - (*in).DeepCopyInto(*out) - } + *out = new(AggregationRule) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/api/rbac/v1alpha1/BUILD b/vendor/k8s.io/api/rbac/v1alpha1/BUILD index 68d7cdfb..6c36134c 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/BUILD +++ b/vendor/k8s.io/api/rbac/v1alpha1/BUILD @@ -15,12 +15,13 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1alpha1", importpath = "k8s.io/api/rbac/v1alpha1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -36,9 +37,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go b/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go index b8cf5431..71eced8d 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go @@ -2693,58 +2693,57 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 844 bytes of a gzipped FileDescriptorProto + // 830 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x55, 0xbf, 0x8f, 0xe3, 0x44, - 0x14, 0xce, 0x64, 0x13, 0x36, 0x99, 0x65, 0x15, 0x6e, 0x38, 0x21, 0x6b, 0x85, 0x9c, 0xc5, 0x02, - 0xe9, 0x10, 0x87, 0xcd, 0xee, 0x21, 0xa0, 0xa1, 0x58, 0x5f, 0x81, 0x16, 0x96, 0xbd, 0x65, 0x4e, - 0x5c, 0x81, 0x28, 0x98, 0x38, 0x73, 0xce, 0x10, 0xdb, 0x63, 0xcd, 0x8c, 0x23, 0x9d, 0x68, 0x68, - 0x68, 0x11, 0x0d, 0x05, 0x3d, 0x2d, 0x0d, 0x94, 0xfc, 0x03, 0x4b, 0x77, 0xe5, 0x56, 0x11, 0x6b, - 0xfe, 0x10, 0x90, 0xc7, 0x76, 0xec, 0xfc, 0x22, 0xa9, 0x22, 0x21, 0x51, 0x25, 0xf3, 0xde, 0xf7, - 0xbe, 0xf7, 0xde, 0x37, 0xf3, 0x9e, 0xe1, 0xd9, 0xf8, 0x03, 0x69, 0x33, 0xee, 0x8c, 0x93, 0x01, - 0x15, 0x11, 0x55, 0x54, 0x3a, 0x13, 0x1a, 0x0d, 0xb9, 0x70, 0x0a, 0x07, 0x89, 0x99, 0x23, 0x06, - 0xc4, 0x73, 0x26, 0x27, 0x24, 0x88, 0x47, 0xe4, 0xc4, 0xf1, 0x69, 0x44, 0x05, 0x51, 0x74, 0x68, - 0xc7, 0x82, 0x2b, 0x8e, 0x8c, 0x1c, 0x69, 0x93, 0x98, 0xd9, 0x19, 0xd2, 0x2e, 0x91, 0x47, 0x6f, - 0xfb, 0x4c, 0x8d, 0x92, 0x81, 0xed, 0xf1, 0xd0, 0xf1, 0xb9, 0xcf, 0x1d, 0x1d, 0x30, 0x48, 0x9e, - 0xea, 0x93, 0x3e, 0xe8, 0x7f, 0x39, 0xd1, 0xd1, 0xbb, 0x55, 0xca, 0x90, 0x78, 0x23, 0x16, 0x51, - 0xf1, 0xcc, 0x89, 0xc7, 0x7e, 0x66, 0x90, 0x4e, 0x48, 0x15, 0x71, 0x26, 0x4b, 0xe9, 0x8f, 0x9c, - 0x75, 0x51, 0x22, 0x89, 0x14, 0x0b, 0xe9, 0x52, 0xc0, 0x7b, 0x9b, 0x02, 0xa4, 0x37, 0xa2, 0x21, - 0x59, 0x8a, 0x7b, 0xb0, 0x2e, 0x2e, 0x51, 0x2c, 0x70, 0x58, 0xa4, 0xa4, 0x12, 0x8b, 0x41, 0xd6, - 0x4f, 0x00, 0xf6, 0xce, 0x7c, 0x5f, 0x50, 0x9f, 0x28, 0xc6, 0x23, 0x9c, 0x04, 0x14, 0x7d, 0x07, - 0xe0, 0x5d, 0x2f, 0x48, 0xa4, 0xa2, 0x02, 0xf3, 0x80, 0x3e, 0xa6, 0x01, 0xf5, 0x14, 0x17, 0xd2, - 0x00, 0xc7, 0x7b, 0xf7, 0x0e, 0x4e, 0x1f, 0xd8, 0x95, 0xa0, 0xb3, 0x44, 0x76, 0x3c, 0xf6, 0x33, - 0x83, 0xb4, 0x33, 0x1d, 0xec, 0xc9, 0x89, 0x7d, 0x41, 0x06, 0x34, 0x28, 0x63, 0xdd, 0x57, 0xaf, - 0xa7, 0xfd, 0x46, 0x3a, 0xed, 0xdf, 0x7d, 0xb8, 0x82, 0x18, 0xaf, 0x4c, 0x67, 0xfd, 0xdc, 0x84, - 0x07, 0x35, 0x38, 0xfa, 0x0a, 0x76, 0x32, 0xf2, 0x21, 0x51, 0xc4, 0x00, 0xc7, 0xe0, 0xde, 0xc1, - 0xe9, 0x3b, 0xdb, 0x95, 0xf2, 0x68, 0xf0, 0x35, 0xf5, 0xd4, 0xa7, 0x54, 0x11, 0x17, 0x15, 0x75, - 0xc0, 0xca, 0x86, 0x67, 0xac, 0xe8, 0x1c, 0xb6, 0x45, 0x12, 0x50, 0x69, 0x34, 0x75, 0xa7, 0xaf, - 0xdb, 0xeb, 0x9e, 0x8e, 0x7d, 0xc5, 0x03, 0xe6, 0x3d, 0xcb, 0xe4, 0x72, 0x0f, 0x0b, 0xca, 0x76, - 0x76, 0x92, 0x38, 0x67, 0x40, 0x23, 0xd8, 0x23, 0xf3, 0xba, 0x1a, 0x7b, 0xba, 0xe6, 0x37, 0xd7, - 0x93, 0x2e, 0x5c, 0x84, 0xfb, 0x72, 0x3a, 0xed, 0x2f, 0xde, 0x0e, 0x5e, 0xa4, 0xb5, 0x7e, 0x6c, - 0x42, 0x54, 0x93, 0xc9, 0x65, 0xd1, 0x90, 0x45, 0xfe, 0x0e, 0xd4, 0x7a, 0x04, 0x3b, 0x32, 0xd1, - 0x8e, 0x52, 0xb0, 0xd7, 0xd6, 0xf7, 0xf6, 0x38, 0x47, 0xba, 0x2f, 0x15, 0x94, 0x9d, 0xc2, 0x20, - 0xf1, 0x8c, 0x04, 0x5d, 0xc0, 0x7d, 0xc1, 0x03, 0x8a, 0xe9, 0xd3, 0x42, 0xab, 0x7f, 0xe1, 0xc3, - 0x39, 0xd0, 0xed, 0x15, 0x7c, 0xfb, 0x85, 0x01, 0x97, 0x14, 0xd6, 0x1f, 0x00, 0xbe, 0xb2, 0xac, - 0xcb, 0x05, 0x93, 0x0a, 0x7d, 0xb9, 0xa4, 0x8d, 0xbd, 0xe5, 0xa3, 0x66, 0x32, 0x57, 0x66, 0xd6, - 0x46, 0x69, 0xa9, 0xe9, 0xf2, 0x19, 0x6c, 0x33, 0x45, 0xc3, 0x52, 0x94, 0xfb, 0xeb, 0x9b, 0x58, - 0x2e, 0xaf, 0x7a, 0x4d, 0xe7, 0x19, 0x05, 0xce, 0x99, 0xac, 0xdf, 0x01, 0xec, 0xd5, 0xc0, 0x3b, - 0x68, 0xe2, 0xe3, 0xf9, 0x26, 0xde, 0xd8, 0xae, 0x89, 0xd5, 0xd5, 0xff, 0x0d, 0x20, 0xac, 0x06, - 0x06, 0xf5, 0x61, 0x7b, 0x42, 0xc5, 0x20, 0xdf, 0x27, 0x5d, 0xb7, 0x9b, 0xe1, 0x9f, 0x64, 0x06, - 0x9c, 0xdb, 0xd1, 0x5b, 0xb0, 0x4b, 0x62, 0xf6, 0x91, 0xe0, 0x49, 0x2c, 0x8d, 0x3d, 0x0d, 0x3a, - 0x4c, 0xa7, 0xfd, 0xee, 0xd9, 0xd5, 0x79, 0x6e, 0xc4, 0x95, 0x3f, 0x03, 0x0b, 0x2a, 0x79, 0x22, - 0x3c, 0x2a, 0x8d, 0x56, 0x05, 0xc6, 0xa5, 0x11, 0x57, 0x7e, 0xf4, 0x3e, 0x3c, 0x2c, 0x0f, 0x97, - 0x24, 0xa4, 0xd2, 0x68, 0xeb, 0x80, 0x3b, 0xe9, 0xb4, 0x7f, 0x88, 0xeb, 0x0e, 0x3c, 0x8f, 0x43, - 0x1f, 0xc2, 0x5e, 0xc4, 0xa3, 0x12, 0xf2, 0x39, 0xbe, 0x90, 0xc6, 0x0b, 0x3a, 0x54, 0xcf, 0xe8, - 0xe5, 0xbc, 0x0b, 0x2f, 0x62, 0xad, 0xdf, 0x00, 0x6c, 0xfd, 0xe7, 0x76, 0x98, 0xf5, 0x7d, 0x13, - 0x1e, 0xfc, 0xbf, 0x52, 0x6a, 0x2b, 0x25, 0x1b, 0xc3, 0xdd, 0xee, 0x92, 0xed, 0xc7, 0x70, 0xf3, - 0x12, 0xf9, 0x05, 0xc0, 0xce, 0x8e, 0xb6, 0xc7, 0xc3, 0xf9, 0xb2, 0xcd, 0x0d, 0x65, 0xaf, 0xae, - 0xf7, 0x1b, 0x58, 0xde, 0x00, 0xba, 0x0f, 0x3b, 0xe5, 0xc4, 0xeb, 0x6a, 0xbb, 0x55, 0xf6, 0x72, - 0x29, 0xe0, 0x19, 0x02, 0x1d, 0xc3, 0xd6, 0x98, 0x45, 0x43, 0xa3, 0xa9, 0x91, 0x2f, 0x16, 0xc8, - 0xd6, 0x27, 0x2c, 0x1a, 0x62, 0xed, 0xc9, 0x10, 0x11, 0x09, 0xf3, 0x4f, 0x72, 0x0d, 0x91, 0xcd, - 0x3a, 0xd6, 0x1e, 0xeb, 0x57, 0x00, 0xf7, 0x8b, 0xf7, 0x34, 0xe3, 0x03, 0x6b, 0xf9, 0x4e, 0x21, - 0x24, 0x31, 0x7b, 0x42, 0x85, 0x64, 0x3c, 0x2a, 0xf2, 0xce, 0x5e, 0xfa, 0xd9, 0xd5, 0x79, 0xe1, - 0xc1, 0x35, 0xd4, 0xe6, 0x1a, 0x90, 0x03, 0xbb, 0xd9, 0xaf, 0x8c, 0x89, 0x47, 0x8d, 0x96, 0x86, - 0xdd, 0x29, 0x60, 0xdd, 0xcb, 0xd2, 0x81, 0x2b, 0x8c, 0x6b, 0x5f, 0xdf, 0x9a, 0x8d, 0xe7, 0xb7, - 0x66, 0xe3, 0xe6, 0xd6, 0x6c, 0x7c, 0x9b, 0x9a, 0xe0, 0x3a, 0x35, 0xc1, 0xf3, 0xd4, 0x04, 0x37, - 0xa9, 0x09, 0xfe, 0x4c, 0x4d, 0xf0, 0xc3, 0x5f, 0x66, 0xe3, 0x8b, 0x4e, 0x29, 0xfe, 0x3f, 0x01, - 0x00, 0x00, 0xff, 0xff, 0xeb, 0xcc, 0xe2, 0x61, 0x5e, 0x0b, 0x00, 0x00, + 0x14, 0xce, 0x64, 0x13, 0x36, 0x99, 0x25, 0x0a, 0x37, 0x9c, 0x90, 0xb5, 0x42, 0xce, 0x62, 0x81, + 0x74, 0x88, 0xc3, 0x66, 0x17, 0x04, 0x34, 0x14, 0xf1, 0x15, 0x28, 0x10, 0xf6, 0x96, 0x39, 0x71, + 0x05, 0xa2, 0x60, 0xe2, 0xcc, 0x39, 0x43, 0x6c, 0x8f, 0x35, 0x63, 0x47, 0x3a, 0xd1, 0xd0, 0xd0, + 0x22, 0x1a, 0x0a, 0x7a, 0x5a, 0x1a, 0x28, 0xf9, 0x07, 0x96, 0xee, 0xca, 0xad, 0x22, 0xd6, 0xfc, + 0x21, 0x20, 0x8f, 0xed, 0xd8, 0xf9, 0x45, 0x52, 0x45, 0x42, 0xba, 0x2a, 0x99, 0xf7, 0xbe, 0xf7, + 0xbd, 0xf7, 0xbe, 0x99, 0xf7, 0x0c, 0xfb, 0xd3, 0x0f, 0xa5, 0xc9, 0xb8, 0x35, 0x8d, 0x47, 0x54, + 0x04, 0x34, 0xa2, 0xd2, 0x9a, 0xd1, 0x60, 0xcc, 0x85, 0x95, 0x3b, 0x48, 0xc8, 0x2c, 0x31, 0x22, + 0x8e, 0x35, 0x3b, 0x27, 0x5e, 0x38, 0x21, 0xe7, 0x96, 0x4b, 0x03, 0x2a, 0x48, 0x44, 0xc7, 0x66, + 0x28, 0x78, 0xc4, 0x91, 0x96, 0x21, 0x4d, 0x12, 0x32, 0x33, 0x45, 0x9a, 0x05, 0xf2, 0xf4, 0x6d, + 0x97, 0x45, 0x93, 0x78, 0x64, 0x3a, 0xdc, 0xb7, 0x5c, 0xee, 0x72, 0x4b, 0x05, 0x8c, 0xe2, 0x27, + 0xea, 0xa4, 0x0e, 0xea, 0x5f, 0x46, 0x74, 0xfa, 0x5e, 0x99, 0xd2, 0x27, 0xce, 0x84, 0x05, 0x54, + 0x3c, 0xb5, 0xc2, 0xa9, 0x9b, 0x1a, 0xa4, 0xe5, 0xd3, 0x88, 0x58, 0xb3, 0xb5, 0xf4, 0xa7, 0xd6, + 0xb6, 0x28, 0x11, 0x07, 0x11, 0xf3, 0xe9, 0x5a, 0xc0, 0xfb, 0xbb, 0x02, 0xa4, 0x33, 0xa1, 0x3e, + 0x59, 0x8d, 0x33, 0x7e, 0x06, 0xb0, 0xdb, 0x77, 0x5d, 0x41, 0x5d, 0x12, 0x31, 0x1e, 0xe0, 0xd8, + 0xa3, 0xe8, 0x7b, 0x00, 0xef, 0x3a, 0x5e, 0x2c, 0x23, 0x2a, 0x30, 0xf7, 0xe8, 0x23, 0xea, 0x51, + 0x27, 0xe2, 0x42, 0x6a, 0xe0, 0xec, 0xe8, 0xde, 0xc9, 0xc5, 0xbb, 0x66, 0xa9, 0xcd, 0x22, 0x97, + 0x19, 0x4e, 0xdd, 0xd4, 0x20, 0xcd, 0xb4, 0x25, 0x73, 0x76, 0x6e, 0x0e, 0xc9, 0x88, 0x7a, 0x45, + 0xac, 0xfd, 0xea, 0xf5, 0xbc, 0x57, 0x4b, 0xe6, 0xbd, 0xbb, 0x0f, 0x36, 0x10, 0xe3, 0x8d, 0xe9, + 0x8c, 0x5f, 0xea, 0xf0, 0xa4, 0x02, 0x47, 0x5f, 0xc3, 0x56, 0x4a, 0x3e, 0x26, 0x11, 0xd1, 0xc0, + 0x19, 0xb8, 0x77, 0x72, 0xf1, 0xce, 0x7e, 0xa5, 0x3c, 0x1c, 0x7d, 0x43, 0x9d, 0xe8, 0x33, 0x1a, + 0x11, 0x1b, 0xe5, 0x75, 0xc0, 0xd2, 0x86, 0x17, 0xac, 0x68, 0x00, 0x9b, 0x22, 0xf6, 0xa8, 0xd4, + 0xea, 0xaa, 0xd3, 0xd7, 0xcd, 0x6d, 0xaf, 0xc0, 0xbc, 0xe2, 0x1e, 0x73, 0x9e, 0xa6, 0x72, 0xd9, + 0x9d, 0x9c, 0xb2, 0x99, 0x9e, 0x24, 0xce, 0x18, 0xd0, 0x04, 0x76, 0xc9, 0xb2, 0xae, 0xda, 0x91, + 0xaa, 0xf9, 0xcd, 0xed, 0xa4, 0x2b, 0x17, 0x61, 0xbf, 0x9c, 0xcc, 0x7b, 0xab, 0xb7, 0x83, 0x57, + 0x69, 0x8d, 0x9f, 0xea, 0x10, 0x55, 0x64, 0xb2, 0x59, 0x30, 0x66, 0x81, 0x7b, 0x00, 0xb5, 0x1e, + 0xc2, 0x96, 0x8c, 0x95, 0xa3, 0x10, 0xec, 0xb5, 0xed, 0xbd, 0x3d, 0xca, 0x90, 0xf6, 0x4b, 0x39, + 0x65, 0x2b, 0x37, 0x48, 0xbc, 0x20, 0x41, 0x43, 0x78, 0x2c, 0xb8, 0x47, 0x31, 0x7d, 0x92, 0x6b, + 0xf5, 0x1f, 0x7c, 0x38, 0x03, 0xda, 0xdd, 0x9c, 0xef, 0x38, 0x37, 0xe0, 0x82, 0xc2, 0xf8, 0x13, + 0xc0, 0x57, 0xd6, 0x75, 0x19, 0x32, 0x19, 0xa1, 0xaf, 0xd6, 0xb4, 0x31, 0xf7, 0x7c, 0xd4, 0x4c, + 0x66, 0xca, 0x2c, 0xda, 0x28, 0x2c, 0x15, 0x5d, 0x3e, 0x87, 0x4d, 0x16, 0x51, 0xbf, 0x10, 0xe5, + 0xfe, 0xf6, 0x26, 0xd6, 0xcb, 0x2b, 0x5f, 0xd3, 0x20, 0xa5, 0xc0, 0x19, 0x93, 0xf1, 0x07, 0x80, + 0xdd, 0x0a, 0xf8, 0x00, 0x4d, 0x7c, 0xb2, 0xdc, 0xc4, 0x1b, 0xfb, 0x35, 0xb1, 0xb9, 0xfa, 0x7f, + 0x00, 0x84, 0xe5, 0xc0, 0xa0, 0x1e, 0x6c, 0xce, 0xa8, 0x18, 0x65, 0xfb, 0xa4, 0x6d, 0xb7, 0x53, + 0xfc, 0xe3, 0xd4, 0x80, 0x33, 0x3b, 0x7a, 0x0b, 0xb6, 0x49, 0xc8, 0x3e, 0x16, 0x3c, 0x0e, 0xa5, + 0x76, 0xa4, 0x40, 0x9d, 0x64, 0xde, 0x6b, 0xf7, 0xaf, 0x06, 0x99, 0x11, 0x97, 0xfe, 0x14, 0x2c, + 0xa8, 0xe4, 0xb1, 0x70, 0xa8, 0xd4, 0x1a, 0x25, 0x18, 0x17, 0x46, 0x5c, 0xfa, 0xd1, 0x07, 0xb0, + 0x53, 0x1c, 0x2e, 0x89, 0x4f, 0xa5, 0xd6, 0x54, 0x01, 0x77, 0x92, 0x79, 0xaf, 0x83, 0xab, 0x0e, + 0xbc, 0x8c, 0x43, 0x1f, 0xc1, 0x6e, 0xc0, 0x83, 0x02, 0xf2, 0x05, 0x1e, 0x4a, 0xed, 0x05, 0x15, + 0xaa, 0x66, 0xf4, 0x72, 0xd9, 0x85, 0x57, 0xb1, 0xc6, 0xef, 0x00, 0x36, 0xfe, 0x77, 0x3b, 0xcc, + 0xf8, 0xa1, 0x0e, 0x4f, 0x9e, 0xaf, 0x94, 0xca, 0x4a, 0x49, 0xc7, 0xf0, 0xb0, 0xbb, 0x64, 0xff, + 0x31, 0xdc, 0xbd, 0x44, 0x7e, 0x05, 0xb0, 0x75, 0xa0, 0xed, 0xf1, 0x60, 0xb9, 0x6c, 0x7d, 0x47, + 0xd9, 0x9b, 0xeb, 0xfd, 0x16, 0x16, 0x37, 0x80, 0xee, 0xc3, 0x56, 0x31, 0xf1, 0xaa, 0xda, 0x76, + 0x99, 0xbd, 0x58, 0x0a, 0x78, 0x81, 0x40, 0x67, 0xb0, 0x31, 0x65, 0xc1, 0x58, 0xab, 0x2b, 0xe4, + 0x8b, 0x39, 0xb2, 0xf1, 0x29, 0x0b, 0xc6, 0x58, 0x79, 0x52, 0x44, 0x40, 0xfc, 0xec, 0x93, 0x5c, + 0x41, 0xa4, 0xb3, 0x8e, 0x95, 0xc7, 0xf8, 0x0d, 0xc0, 0xe3, 0xfc, 0x3d, 0x2d, 0xf8, 0xc0, 0x56, + 0xbe, 0x0b, 0x08, 0x49, 0xc8, 0x1e, 0x53, 0x21, 0x19, 0x0f, 0xf2, 0xbc, 0x8b, 0x97, 0xde, 0xbf, + 0x1a, 0xe4, 0x1e, 0x5c, 0x41, 0xed, 0xae, 0x01, 0x59, 0xb0, 0x9d, 0xfe, 0xca, 0x90, 0x38, 0x54, + 0x6b, 0x28, 0xd8, 0x9d, 0x1c, 0xd6, 0xbe, 0x2c, 0x1c, 0xb8, 0xc4, 0xd8, 0xe6, 0xf5, 0xad, 0x5e, + 0x7b, 0x76, 0xab, 0xd7, 0x6e, 0x6e, 0xf5, 0xda, 0x77, 0x89, 0x0e, 0xae, 0x13, 0x1d, 0x3c, 0x4b, + 0x74, 0x70, 0x93, 0xe8, 0xe0, 0xaf, 0x44, 0x07, 0x3f, 0xfe, 0xad, 0xd7, 0xbe, 0x6c, 0x15, 0xe2, + 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x73, 0x15, 0x10, 0x29, 0x0b, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/rbac/v1alpha1/generated.proto b/vendor/k8s.io/api/rbac/v1alpha1/generated.proto index d7b29486..cde3aaac 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1alpha1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.rbac.v1alpha1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; diff --git a/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go index 1d29acff..97f63331 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go @@ -62,12 +62,8 @@ func (in *ClusterRole) DeepCopyInto(out *ClusterRole) { } if in.AggregationRule != nil { in, out := &in.AggregationRule, &out.AggregationRule - if *in == nil { - *out = nil - } else { - *out = new(AggregationRule) - (*in).DeepCopyInto(*out) - } + *out = new(AggregationRule) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/api/rbac/v1beta1/BUILD b/vendor/k8s.io/api/rbac/v1beta1/BUILD index c9aa763f..48e27564 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/BUILD +++ b/vendor/k8s.io/api/rbac/v1beta1/BUILD @@ -15,12 +15,13 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1beta1", importpath = "k8s.io/api/rbac/v1beta1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -36,9 +37,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go b/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go index e4ddbcde..71e5799e 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go @@ -2693,58 +2693,56 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 833 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x55, 0xbf, 0x8f, 0xe3, 0x44, - 0x14, 0xce, 0x64, 0x13, 0x6d, 0x3c, 0xcb, 0x2a, 0xdc, 0x70, 0x02, 0x6b, 0x05, 0xce, 0x2a, 0x50, - 0x44, 0x3a, 0xce, 0x66, 0xef, 0x10, 0xd0, 0x20, 0x71, 0xa6, 0x80, 0xd5, 0x2d, 0x61, 0x35, 0x27, - 0x28, 0x10, 0x05, 0x63, 0x67, 0xce, 0x19, 0xe2, 0x5f, 0x9a, 0x19, 0x47, 0x3a, 0xd1, 0xd0, 0xd0, - 0x51, 0x20, 0x51, 0xd1, 0x52, 0x53, 0x51, 0xf2, 0x17, 0xa4, 0xbc, 0xf2, 0xaa, 0x88, 0x35, 0x7f, - 0x08, 0x68, 0xfc, 0x23, 0x4e, 0xe2, 0xf8, 0x2e, 0x55, 0x24, 0xa4, 0xab, 0x76, 0xe7, 0xbd, 0xef, - 0x7d, 0xef, 0x7b, 0x9f, 0x67, 0x5e, 0xe0, 0x27, 0xb3, 0x8f, 0x84, 0xc9, 0x22, 0x6b, 0x96, 0x38, - 0x94, 0x87, 0x54, 0x52, 0x61, 0xcd, 0x69, 0x38, 0x89, 0xb8, 0x55, 0x24, 0x48, 0xcc, 0x2c, 0xee, - 0x10, 0xd7, 0x9a, 0x5f, 0x38, 0x54, 0x92, 0x0b, 0xcb, 0xa3, 0x21, 0xe5, 0x44, 0xd2, 0x89, 0x19, - 0xf3, 0x48, 0x46, 0xe8, 0x8d, 0x1c, 0x68, 0x92, 0x98, 0x99, 0x0a, 0x68, 0x16, 0xc0, 0xb3, 0xbb, - 0x1e, 0x93, 0xd3, 0xc4, 0x31, 0xdd, 0x28, 0xb0, 0xbc, 0xc8, 0x8b, 0xac, 0x0c, 0xef, 0x24, 0x8f, - 0xb3, 0x53, 0x76, 0xc8, 0xfe, 0xcb, 0x79, 0xce, 0x46, 0xf5, 0x86, 0xc4, 0x8f, 0xa7, 0xf5, 0x8e, - 0x67, 0xef, 0x57, 0xc8, 0x80, 0xb8, 0x53, 0x16, 0x52, 0xfe, 0xc4, 0x8a, 0x67, 0x9e, 0x0a, 0x08, - 0x2b, 0xa0, 0x92, 0x58, 0xf3, 0x7a, 0x95, 0xd5, 0x54, 0xc5, 0x93, 0x50, 0xb2, 0x80, 0xd6, 0x0a, - 0x3e, 0x78, 0x51, 0x81, 0x70, 0xa7, 0x34, 0x20, 0xb5, 0xba, 0xfb, 0x4d, 0x75, 0x89, 0x64, 0xbe, - 0xc5, 0x42, 0x29, 0x24, 0xdf, 0x2e, 0x1a, 0xfe, 0x06, 0x60, 0xff, 0x81, 0xe7, 0x71, 0xea, 0x11, - 0xc9, 0xa2, 0x10, 0x27, 0x3e, 0x45, 0x3f, 0x01, 0x78, 0xdb, 0xf5, 0x13, 0x21, 0x29, 0xc7, 0x91, - 0x4f, 0x1f, 0x51, 0x9f, 0xba, 0x32, 0xe2, 0x42, 0x07, 0xe7, 0x47, 0xa3, 0x93, 0x7b, 0xf7, 0xcd, - 0xca, 0xf9, 0x55, 0x23, 0x33, 0x9e, 0x79, 0x2a, 0x20, 0x4c, 0xe5, 0x83, 0x39, 0xbf, 0x30, 0xaf, - 0x88, 0x43, 0xfd, 0xb2, 0xd6, 0x7e, 0x73, 0xb1, 0x1c, 0xb4, 0xd2, 0xe5, 0xe0, 0xf6, 0xa7, 0x3b, - 0x88, 0xf1, 0xce, 0x76, 0xc3, 0xdf, 0xdb, 0xf0, 0x64, 0x0d, 0x8e, 0xbe, 0x83, 0x3d, 0x45, 0x3e, - 0x21, 0x92, 0xe8, 0xe0, 0x1c, 0x8c, 0x4e, 0xee, 0xbd, 0xb7, 0x9f, 0x94, 0x2f, 0x9d, 0xef, 0xa9, - 0x2b, 0xbf, 0xa0, 0x92, 0xd8, 0xa8, 0xd0, 0x01, 0xab, 0x18, 0x5e, 0xb1, 0xa2, 0xcf, 0x61, 0x97, - 0x27, 0x3e, 0x15, 0x7a, 0x3b, 0x9b, 0xf4, 0x6d, 0xb3, 0xe1, 0x8e, 0x99, 0xd7, 0x91, 0xcf, 0xdc, - 0x27, 0xca, 0x2d, 0xfb, 0xb4, 0x60, 0xec, 0xaa, 0x93, 0xc0, 0x39, 0x01, 0xf2, 0x60, 0x9f, 0x6c, - 0xda, 0xaa, 0x1f, 0x65, 0x92, 0x47, 0x8d, 0x9c, 0x5b, 0x9f, 0xc1, 0x7e, 0x2d, 0x5d, 0x0e, 0xb6, - 0xbf, 0x0d, 0xde, 0x66, 0x1d, 0xfe, 0xda, 0x86, 0x68, 0xcd, 0x24, 0x9b, 0x85, 0x13, 0x16, 0x7a, - 0x07, 0xf0, 0x6a, 0x0c, 0x7b, 0x22, 0xc9, 0x12, 0xa5, 0x5d, 0xe7, 0x8d, 0xa3, 0x3d, 0xca, 0x81, - 0xf6, 0xab, 0x05, 0x63, 0xaf, 0x08, 0x08, 0xbc, 0xe2, 0x40, 0x0f, 0xe1, 0x31, 0x8f, 0x7c, 0x8a, - 0xe9, 0xe3, 0xc2, 0xa9, 0x66, 0x3a, 0x9c, 0xe3, 0xec, 0x7e, 0x41, 0x77, 0x5c, 0x04, 0x70, 0xc9, - 0x30, 0x5c, 0x00, 0xf8, 0x7a, 0xdd, 0x95, 0x2b, 0x26, 0x24, 0xfa, 0xb6, 0xe6, 0x8c, 0xb9, 0xe7, - 0x85, 0x66, 0x22, 0xf7, 0x65, 0x35, 0x45, 0x19, 0x59, 0x73, 0xe5, 0x1a, 0x76, 0x99, 0xa4, 0x41, - 0x69, 0xc9, 0x9d, 0xc6, 0x19, 0xea, 0xea, 0xaa, 0x9b, 0x74, 0xa9, 0x18, 0x70, 0x4e, 0x34, 0xfc, - 0x0b, 0xc0, 0xfe, 0x1a, 0xf8, 0x00, 0x33, 0x5c, 0x6e, 0xce, 0xf0, 0xce, 0x5e, 0x33, 0xec, 0x16, - 0xff, 0x2f, 0x80, 0xb0, 0x7a, 0x2b, 0x68, 0x00, 0xbb, 0x73, 0xca, 0x9d, 0x7c, 0x93, 0x68, 0xb6, - 0xa6, 0xf0, 0x5f, 0xab, 0x00, 0xce, 0xe3, 0xe8, 0x0e, 0xd4, 0x48, 0xcc, 0x3e, 0xe3, 0x51, 0x12, - 0xe7, 0xed, 0x35, 0xfb, 0x34, 0x5d, 0x0e, 0xb4, 0x07, 0xd7, 0x97, 0x79, 0x10, 0x57, 0x79, 0x05, - 0xe6, 0x54, 0x44, 0x09, 0x77, 0xa9, 0xd0, 0x8f, 0x2a, 0x30, 0x2e, 0x83, 0xb8, 0xca, 0xa3, 0x0f, - 0xe1, 0x69, 0x79, 0x18, 0x93, 0x80, 0x0a, 0xbd, 0x93, 0x15, 0xdc, 0x4a, 0x97, 0x83, 0x53, 0xbc, - 0x9e, 0xc0, 0x9b, 0x38, 0xf4, 0x31, 0xec, 0x87, 0x51, 0x58, 0x42, 0xbe, 0xc2, 0x57, 0x42, 0xef, - 0x66, 0xa5, 0xd9, 0xfb, 0x1c, 0x6f, 0xa6, 0xf0, 0x36, 0x76, 0xf8, 0x27, 0x80, 0x9d, 0xff, 0xdb, - 0xf6, 0x1a, 0xfe, 0xdc, 0x86, 0x27, 0x2f, 0xb7, 0xc9, 0x6a, 0x9b, 0xa8, 0x27, 0x78, 0xd8, 0x35, - 0xb2, 0xf7, 0x13, 0x7c, 0xf1, 0xfe, 0xf8, 0x03, 0xc0, 0xde, 0x81, 0x16, 0x87, 0xbd, 0xa9, 0xfa, - 0xad, 0xe7, 0xab, 0xde, 0x2d, 0xf7, 0x07, 0x58, 0xfa, 0x8f, 0xde, 0x85, 0xbd, 0xf2, 0xb1, 0x67, - 0x62, 0xb5, 0xaa, 0x79, 0xb9, 0x0f, 0xf0, 0x0a, 0x81, 0xce, 0x61, 0x67, 0xc6, 0xc2, 0x89, 0xde, - 0xce, 0x90, 0xaf, 0x14, 0xc8, 0xce, 0x43, 0x16, 0x4e, 0x70, 0x96, 0x51, 0x88, 0x90, 0x04, 0xf9, - 0x0f, 0xf1, 0x1a, 0x42, 0x3d, 0x73, 0x9c, 0x65, 0x94, 0x57, 0xc7, 0xc5, 0x65, 0x5a, 0xf1, 0x81, - 0x46, 0xbe, 0x75, 0x7d, 0xed, 0x7d, 0xf4, 0x3d, 0xbf, 0x3b, 0xb2, 0xa0, 0xa6, 0xfe, 0x8a, 0x98, - 0xb8, 0x54, 0xef, 0x64, 0xb0, 0x5b, 0x05, 0x4c, 0x1b, 0x97, 0x09, 0x5c, 0x61, 0xec, 0xbb, 0x8b, - 0x1b, 0xa3, 0xf5, 0xf4, 0xc6, 0x68, 0x3d, 0xbb, 0x31, 0x5a, 0x3f, 0xa6, 0x06, 0x58, 0xa4, 0x06, - 0x78, 0x9a, 0x1a, 0xe0, 0x59, 0x6a, 0x80, 0xbf, 0x53, 0x03, 0xfc, 0xf2, 0x8f, 0xd1, 0xfa, 0xe6, - 0xb8, 0x70, 0xfd, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x99, 0xaf, 0xff, 0x74, 0x0b, 0x00, - 0x00, + // 808 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x55, 0xbd, 0x6f, 0xfb, 0x44, + 0x18, 0xce, 0xa5, 0x89, 0x12, 0x5f, 0x88, 0xc2, 0xef, 0xa8, 0xc0, 0xaa, 0xc0, 0x89, 0x02, 0x43, + 0xa5, 0x52, 0x9b, 0x16, 0x04, 0x2c, 0x48, 0xd4, 0x0c, 0x50, 0xb5, 0x84, 0xea, 0x2a, 0x18, 0x10, + 0x03, 0x67, 0xe7, 0xea, 0x1e, 0xf1, 0x97, 0xee, 0xec, 0x48, 0x15, 0x0b, 0x0b, 0x1b, 0x03, 0x12, + 0x13, 0x2b, 0x33, 0x13, 0x23, 0x7f, 0x41, 0xc6, 0x8e, 0x9d, 0x22, 0x6a, 0xfe, 0x10, 0xd0, 0xf9, + 0x23, 0xce, 0x67, 0x9b, 0x29, 0x12, 0x12, 0x53, 0x7b, 0xef, 0xfb, 0xbc, 0xcf, 0xfb, 0xbc, 0x8f, + 0xef, 0xde, 0xc0, 0x8f, 0x47, 0x1f, 0x0a, 0x9d, 0x05, 0xc6, 0x28, 0xb6, 0x28, 0xf7, 0x69, 0x44, + 0x85, 0x31, 0xa6, 0xfe, 0x30, 0xe0, 0x46, 0x9e, 0x20, 0x21, 0x33, 0xb8, 0x45, 0x6c, 0x63, 0x7c, + 0x62, 0xd1, 0x88, 0x9c, 0x18, 0x0e, 0xf5, 0x29, 0x27, 0x11, 0x1d, 0xea, 0x21, 0x0f, 0xa2, 0x00, + 0xbd, 0x96, 0x01, 0x75, 0x12, 0x32, 0x5d, 0x02, 0xf5, 0x1c, 0x78, 0x70, 0xec, 0xb0, 0xe8, 0x36, + 0xb6, 0x74, 0x3b, 0xf0, 0x0c, 0x27, 0x70, 0x02, 0x23, 0xc5, 0x5b, 0xf1, 0x4d, 0x7a, 0x4a, 0x0f, + 0xe9, 0x7f, 0x19, 0xcf, 0xc1, 0x7b, 0x65, 0x43, 0x8f, 0xd8, 0xb7, 0xcc, 0xa7, 0xfc, 0xce, 0x08, + 0x47, 0x8e, 0x0c, 0x08, 0xc3, 0xa3, 0x11, 0x31, 0xc6, 0x2b, 0xdd, 0x0f, 0x8c, 0x4d, 0x55, 0x3c, + 0xf6, 0x23, 0xe6, 0xd1, 0x95, 0x82, 0xf7, 0x9f, 0x2b, 0x10, 0xf6, 0x2d, 0xf5, 0xc8, 0x72, 0x5d, + 0xff, 0x57, 0x00, 0x3b, 0x67, 0x8e, 0xc3, 0xa9, 0x43, 0x22, 0x16, 0xf8, 0x38, 0x76, 0x29, 0xfa, + 0x11, 0xc0, 0x7d, 0xdb, 0x8d, 0x45, 0x44, 0x39, 0x0e, 0x5c, 0x7a, 0x4d, 0x5d, 0x6a, 0x47, 0x01, + 0x17, 0x2a, 0xe8, 0xed, 0x1d, 0xb6, 0x4e, 0xdf, 0xd5, 0x4b, 0x6b, 0x66, 0xbd, 0xf4, 0x70, 0xe4, + 0xc8, 0x80, 0xd0, 0xe5, 0x48, 0xfa, 0xf8, 0x44, 0xbf, 0x24, 0x16, 0x75, 0x8b, 0x5a, 0xf3, 0xf5, + 0xc9, 0xb4, 0x5b, 0x49, 0xa6, 0xdd, 0xfd, 0x4f, 0xd6, 0x10, 0xe3, 0xb5, 0xed, 0xfa, 0xbf, 0x55, + 0x61, 0x6b, 0x0e, 0x8e, 0xbe, 0x85, 0x4d, 0x49, 0x3e, 0x24, 0x11, 0x51, 0x41, 0x0f, 0x1c, 0xb6, + 0x4e, 0xdf, 0xd9, 0x4e, 0xca, 0x17, 0xd6, 0x77, 0xd4, 0x8e, 0x3e, 0xa7, 0x11, 0x31, 0x51, 0xae, + 0x03, 0x96, 0x31, 0x3c, 0x63, 0x45, 0x9f, 0xc1, 0x3a, 0x8f, 0x5d, 0x2a, 0xd4, 0x6a, 0x3a, 0xe9, + 0x9b, 0xfa, 0x86, 0x4b, 0xa0, 0x5f, 0x05, 0x2e, 0xb3, 0xef, 0xa4, 0x5b, 0x66, 0x3b, 0x67, 0xac, + 0xcb, 0x93, 0xc0, 0x19, 0x01, 0x72, 0x60, 0x87, 0x2c, 0xda, 0xaa, 0xee, 0xa5, 0x92, 0x0f, 0x37, + 0x72, 0x2e, 0x7d, 0x06, 0xf3, 0x95, 0x64, 0xda, 0x5d, 0xfe, 0x36, 0x78, 0x99, 0xb5, 0xff, 0x4b, + 0x15, 0xa2, 0x39, 0x93, 0x4c, 0xe6, 0x0f, 0x99, 0xef, 0xec, 0xc0, 0xab, 0x01, 0x6c, 0x8a, 0x38, + 0x4d, 0x14, 0x76, 0xf5, 0x36, 0x8e, 0x76, 0x9d, 0x01, 0xcd, 0x97, 0x73, 0xc6, 0x66, 0x1e, 0x10, + 0x78, 0xc6, 0x81, 0x2e, 0x60, 0x83, 0x07, 0x2e, 0xc5, 0xf4, 0x26, 0x77, 0x6a, 0x33, 0x1d, 0xce, + 0x70, 0x66, 0x27, 0xa7, 0x6b, 0xe4, 0x01, 0x5c, 0x30, 0xf4, 0x27, 0x00, 0xbe, 0xba, 0xea, 0xca, + 0x25, 0x13, 0x11, 0xfa, 0x66, 0xc5, 0x19, 0x7d, 0xcb, 0x0b, 0xcd, 0x44, 0xe6, 0xcb, 0x6c, 0x8a, + 0x22, 0x32, 0xe7, 0xca, 0x15, 0xac, 0xb3, 0x88, 0x7a, 0x85, 0x25, 0x47, 0x1b, 0x67, 0x58, 0x55, + 0x57, 0xde, 0xa4, 0x73, 0xc9, 0x80, 0x33, 0xa2, 0xfe, 0x9f, 0x00, 0x76, 0xe6, 0xc0, 0x3b, 0x98, + 0xe1, 0x7c, 0x71, 0x86, 0xb7, 0xb6, 0x9a, 0x61, 0xbd, 0xf8, 0x7f, 0x00, 0x84, 0xe5, 0x5b, 0x41, + 0x5d, 0x58, 0x1f, 0x53, 0x6e, 0x65, 0x9b, 0x44, 0x31, 0x15, 0x89, 0xff, 0x4a, 0x06, 0x70, 0x16, + 0x47, 0x47, 0x50, 0x21, 0x21, 0xfb, 0x94, 0x07, 0x71, 0x98, 0xb5, 0x57, 0xcc, 0x76, 0x32, 0xed, + 0x2a, 0x67, 0x57, 0xe7, 0x59, 0x10, 0x97, 0x79, 0x09, 0xe6, 0x54, 0x04, 0x31, 0xb7, 0xa9, 0x50, + 0xf7, 0x4a, 0x30, 0x2e, 0x82, 0xb8, 0xcc, 0xa3, 0x0f, 0x60, 0xbb, 0x38, 0x0c, 0x88, 0x47, 0x85, + 0x5a, 0x4b, 0x0b, 0x5e, 0x24, 0xd3, 0x6e, 0x1b, 0xcf, 0x27, 0xf0, 0x22, 0x0e, 0x7d, 0x04, 0x3b, + 0x7e, 0xe0, 0x17, 0x90, 0x2f, 0xf1, 0xa5, 0x50, 0xeb, 0x69, 0x69, 0xfa, 0x3e, 0x07, 0x8b, 0x29, + 0xbc, 0x8c, 0xed, 0xff, 0x01, 0x60, 0xed, 0xbf, 0xb6, 0xbd, 0xfa, 0x3f, 0x55, 0x61, 0xeb, 0xff, + 0x6d, 0x32, 0xdb, 0x26, 0xf2, 0x09, 0xee, 0x76, 0x8d, 0x6c, 0xfd, 0x04, 0x9f, 0xdf, 0x1f, 0xbf, + 0x03, 0xd8, 0xdc, 0xd1, 0xe2, 0x30, 0x17, 0x55, 0xbf, 0xf1, 0xb4, 0xea, 0xf5, 0x72, 0xbf, 0x87, + 0x85, 0xff, 0xe8, 0x6d, 0xd8, 0x2c, 0x1e, 0x7b, 0x2a, 0x56, 0x29, 0x9b, 0x17, 0xfb, 0x00, 0xcf, + 0x10, 0xa8, 0x07, 0x6b, 0x23, 0xe6, 0x0f, 0xd5, 0x6a, 0x8a, 0x7c, 0x29, 0x47, 0xd6, 0x2e, 0x98, + 0x3f, 0xc4, 0x69, 0x46, 0x22, 0x7c, 0xe2, 0x65, 0x3f, 0xc4, 0x73, 0x08, 0xf9, 0xcc, 0x71, 0x9a, + 0x91, 0x5e, 0x35, 0xf2, 0xcb, 0x34, 0xe3, 0x03, 0x1b, 0xf9, 0xe6, 0xf5, 0x55, 0xb7, 0xd1, 0xf7, + 0x74, 0x77, 0x64, 0x40, 0x45, 0xfe, 0x15, 0x21, 0xb1, 0xa9, 0x5a, 0x4b, 0x61, 0x2f, 0x72, 0x98, + 0x32, 0x28, 0x12, 0xb8, 0xc4, 0x98, 0xc7, 0x93, 0x47, 0xad, 0x72, 0xff, 0xa8, 0x55, 0x1e, 0x1e, + 0xb5, 0xca, 0x0f, 0x89, 0x06, 0x26, 0x89, 0x06, 0xee, 0x13, 0x0d, 0x3c, 0x24, 0x1a, 0xf8, 0x2b, + 0xd1, 0xc0, 0xcf, 0x7f, 0x6b, 0x95, 0xaf, 0x1b, 0xb9, 0xeb, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, + 0x37, 0x8f, 0x77, 0xcd, 0x15, 0x0b, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/rbac/v1beta1/generated.proto b/vendor/k8s.io/api/rbac/v1beta1/generated.proto index 494aff8b..27bd30ce 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1beta1/generated.proto @@ -21,11 +21,9 @@ syntax = 'proto2'; package k8s.io.api.rbac.v1beta1; -import "k8s.io/api/rbac/v1alpha1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; diff --git a/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go index 86fadd17..c085c90b 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go @@ -62,12 +62,8 @@ func (in *ClusterRole) DeepCopyInto(out *ClusterRole) { } if in.AggregationRule != nil { in, out := &in.AggregationRule, &out.AggregationRule - if *in == nil { - *out = nil - } else { - *out = new(AggregationRule) - (*in).DeepCopyInto(*out) - } + *out = new(AggregationRule) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/api/roundtrip_test.go b/vendor/k8s.io/api/roundtrip_test.go new file mode 100644 index 00000000..0c79c3eb --- /dev/null +++ b/vendor/k8s.io/api/roundtrip_test.go @@ -0,0 +1,151 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 testing + +import ( + "math/rand" + "testing" + + admissionv1beta1 "k8s.io/api/admission/v1beta1" + admissionregv1alpha1 "k8s.io/api/admissionregistration/v1alpha1" + admissionregv1beta1 "k8s.io/api/admissionregistration/v1beta1" + appsv1 "k8s.io/api/apps/v1" + appsv1beta1 "k8s.io/api/apps/v1beta1" + appsv1beta2 "k8s.io/api/apps/v1beta2" + authenticationv1 "k8s.io/api/authentication/v1" + authenticationv1beta1 "k8s.io/api/authentication/v1beta1" + authorizationv1 "k8s.io/api/authorization/v1" + authorizationv1beta1 "k8s.io/api/authorization/v1beta1" + autoscalingv1 "k8s.io/api/autoscaling/v1" + autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" + batchv1 "k8s.io/api/batch/v1" + batchv1beta1 "k8s.io/api/batch/v1beta1" + batchv2alpha1 "k8s.io/api/batch/v2alpha1" + certificatesv1beta1 "k8s.io/api/certificates/v1beta1" + corev1 "k8s.io/api/core/v1" + eventsv1beta1 "k8s.io/api/events/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + imagepolicyv1alpha1 "k8s.io/api/imagepolicy/v1alpha1" + networkingv1 "k8s.io/api/networking/v1" + policyv1beta1 "k8s.io/api/policy/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" + settingsv1alpha1 "k8s.io/api/settings/v1alpha1" + storagev1 "k8s.io/api/storage/v1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" + storagev1beta1 "k8s.io/api/storage/v1beta1" + + "github.com/stretchr/testify/require" + "k8s.io/apimachinery/pkg/api/apitesting/fuzzer" + "k8s.io/apimachinery/pkg/api/apitesting/roundtrip" + genericfuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" +) + +var groups = []runtime.SchemeBuilder{ + admissionv1beta1.SchemeBuilder, + admissionregv1alpha1.SchemeBuilder, + admissionregv1beta1.SchemeBuilder, + appsv1beta1.SchemeBuilder, + appsv1beta2.SchemeBuilder, + appsv1.SchemeBuilder, + authenticationv1beta1.SchemeBuilder, + authenticationv1.SchemeBuilder, + authorizationv1beta1.SchemeBuilder, + authorizationv1.SchemeBuilder, + autoscalingv1.SchemeBuilder, + autoscalingv2beta1.SchemeBuilder, + batchv2alpha1.SchemeBuilder, + batchv1beta1.SchemeBuilder, + batchv1.SchemeBuilder, + certificatesv1beta1.SchemeBuilder, + corev1.SchemeBuilder, + eventsv1beta1.SchemeBuilder, + extensionsv1beta1.SchemeBuilder, + imagepolicyv1alpha1.SchemeBuilder, + networkingv1.SchemeBuilder, + policyv1beta1.SchemeBuilder, + rbacv1alpha1.SchemeBuilder, + rbacv1beta1.SchemeBuilder, + rbacv1.SchemeBuilder, + schedulingv1alpha1.SchemeBuilder, + schedulingv1beta1.SchemeBuilder, + settingsv1alpha1.SchemeBuilder, + storagev1alpha1.SchemeBuilder, + storagev1beta1.SchemeBuilder, + storagev1.SchemeBuilder, +} + +func TestRoundTripExternalTypes(t *testing.T) { + for _, builder := range groups { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + + require.NoError(t, builder.AddToScheme(scheme)) + seed := rand.Int63() + // I'm only using the generic fuzzer funcs, but at some point in time we might need to + // switch to specialized. For now we're happy with the current serialization test. + fuzzer := fuzzer.FuzzerFor(genericfuzzer.Funcs, rand.NewSource(seed), codecs) + + roundtrip.RoundTripExternalTypes(t, scheme, codecs, fuzzer, nil) + } +} + +func TestFailRoundTrip(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + groupVersion := schema.GroupVersion{Group: "broken", Version: "v1"} + builder := runtime.NewSchemeBuilder(func(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(groupVersion, &BrokenType{}) + metav1.AddToGroupVersion(scheme, groupVersion) + return nil + }) + require.NoError(t, builder.AddToScheme(scheme)) + seed := rand.Int63() + fuzzer := fuzzer.FuzzerFor(genericfuzzer.Funcs, rand.NewSource(seed), codecs) + tmpT := new(testing.T) + roundtrip.RoundTripExternalTypes(tmpT, scheme, codecs, fuzzer, nil) + // It's very hacky way of making sure the DeepCopy is actually invoked inside RoundTripExternalTypes + // used in the other test. If for some reason this tests starts passing we need to fail b/c we're not testing + // the DeepCopy in the other method which we care so much about. + if !tmpT.Failed() { + t.Log("RoundTrip should've failed on DeepCopy but it did not!") + t.FailNow() + } +} + +type BrokenType struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Field1 string `json:"field1,omitempty"` + Field2 string `json:"field2,omitempty"` +} + +func (in *BrokenType) DeepCopy() *BrokenType { + return new(BrokenType) +} + +func (in *BrokenType) DeepCopyObject() runtime.Object { + return in.DeepCopy() +} diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/BUILD b/vendor/k8s.io/api/scheduling/v1alpha1/BUILD index c8c19766..bcea964b 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/BUILD +++ b/vendor/k8s.io/api/scheduling/v1alpha1/BUILD @@ -15,12 +15,13 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1alpha1", importpath = "k8s.io/api/scheduling/v1alpha1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -36,9 +37,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go b/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go index 1f79d7f8..97c07c98 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go @@ -608,34 +608,33 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 460 bytes of a gzipped FileDescriptorProto + // 447 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x4f, 0x8b, 0xd3, 0x40, 0x18, 0xc6, 0x33, 0x5d, 0x0b, 0x75, 0x4a, 0x41, 0x23, 0x42, 0xe8, 0x61, 0x36, 0xac, 0x97, 0x5c, - 0x76, 0xc6, 0xae, 0x7f, 0x10, 0xbc, 0xc5, 0x85, 0x45, 0x50, 0x94, 0x1c, 0x3c, 0x88, 0x07, 0x27, - 0xc9, 0x6c, 0x3a, 0x36, 0xc9, 0x84, 0x99, 0x37, 0x81, 0xbd, 0x79, 0xf6, 0xe4, 0x97, 0x12, 0x7a, - 0xdc, 0xe3, 0x9e, 0x16, 0x1b, 0xbf, 0x88, 0x24, 0x4d, 0x37, 0xad, 0x65, 0xd5, 0x5b, 0xe6, 0x79, - 0x9f, 0xdf, 0x33, 0xf3, 0x3e, 0x04, 0x9f, 0x2d, 0x5e, 0x18, 0x2a, 0x15, 0x5b, 0x94, 0xa1, 0xd0, - 0xb9, 0x00, 0x61, 0x58, 0x25, 0xf2, 0x58, 0x69, 0xd6, 0x0d, 0x78, 0x21, 0x99, 0x89, 0xe6, 0x22, - 0x2e, 0x53, 0x99, 0x27, 0xac, 0x9a, 0xf1, 0xb4, 0x98, 0xf3, 0x19, 0x4b, 0x44, 0x2e, 0x34, 0x07, - 0x11, 0xd3, 0x42, 0x2b, 0x50, 0x36, 0x59, 0xfb, 0x29, 0x2f, 0x24, 0xed, 0xfd, 0x74, 0xe3, 0x9f, - 0x1e, 0x27, 0x12, 0xe6, 0x65, 0x48, 0x23, 0x95, 0xb1, 0x44, 0x25, 0x8a, 0xb5, 0x58, 0x58, 0x9e, - 0xb7, 0xa7, 0xf6, 0xd0, 0x7e, 0xad, 0xe3, 0xa6, 0x4f, 0xfb, 0xeb, 0x33, 0x1e, 0xcd, 0x65, 0x2e, - 0xf4, 0x05, 0x2b, 0x16, 0x49, 0x23, 0x18, 0x96, 0x09, 0xe0, 0xac, 0xda, 0x7b, 0xc4, 0x94, 0xdd, - 0x46, 0xe9, 0x32, 0x07, 0x99, 0x89, 0x3d, 0xe0, 0xf9, 0xbf, 0x80, 0x66, 0x95, 0x8c, 0xef, 0x71, - 0x4f, 0x6e, 0xe3, 0x4a, 0x90, 0x29, 0x93, 0x39, 0x18, 0xd0, 0x7f, 0x42, 0x47, 0xdf, 0x06, 0x78, - 0xf2, 0x5e, 0x4b, 0xa5, 0x25, 0x5c, 0xbc, 0x4a, 0xb9, 0x31, 0xf6, 0x67, 0x3c, 0x6a, 0x56, 0x89, - 0x39, 0x70, 0x07, 0xb9, 0xc8, 0x1b, 0x9f, 0x3c, 0xa6, 0x7d, 0x8f, 0x37, 0xc9, 0xb4, 0x58, 0x24, - 0x8d, 0x60, 0x68, 0xe3, 0xa6, 0xd5, 0x8c, 0xbe, 0x0b, 0xbf, 0x88, 0x08, 0xde, 0x0a, 0xe0, 0xbe, - 0xbd, 0xbc, 0x3e, 0xb4, 0xea, 0xeb, 0x43, 0xdc, 0x6b, 0xc1, 0x4d, 0xaa, 0xfd, 0x08, 0x0f, 0x2b, - 0x9e, 0x96, 0xc2, 0x19, 0xb8, 0xc8, 0x1b, 0xfa, 0x93, 0xce, 0x3c, 0xfc, 0xd0, 0x88, 0xc1, 0x7a, - 0x66, 0xbf, 0xc4, 0x93, 0x24, 0x55, 0x21, 0x4f, 0x4f, 0xc5, 0x39, 0x2f, 0x53, 0x70, 0x0e, 0x5c, - 0xe4, 0x8d, 0xfc, 0x87, 0x9d, 0x79, 0x72, 0xb6, 0x3d, 0x0c, 0x76, 0xbd, 0xf6, 0x33, 0x3c, 0x8e, - 0x85, 0x89, 0xb4, 0x2c, 0x40, 0xaa, 0xdc, 0xb9, 0xe3, 0x22, 0xef, 0xae, 0xff, 0xa0, 0x43, 0xc7, - 0xa7, 0xfd, 0x28, 0xd8, 0xf6, 0x1d, 0xfd, 0x40, 0xf8, 0xfe, 0x4e, 0x19, 0x6f, 0xa4, 0x01, 0xfb, - 0xd3, 0x5e, 0x21, 0xf4, 0xff, 0x0a, 0x69, 0xe8, 0xb6, 0x8e, 0x7b, 0xdd, 0xcd, 0xa3, 0x8d, 0xb2, - 0x55, 0x46, 0x80, 0x87, 0x12, 0x44, 0x66, 0x9c, 0x81, 0x7b, 0xe0, 0x8d, 0x4f, 0x8e, 0xe9, 0xdf, - 0xff, 0x59, 0xba, 0xf3, 0xbe, 0xbe, 0xbb, 0xd7, 0x4d, 0x46, 0xb0, 0x8e, 0xf2, 0xe9, 0x72, 0x45, - 0xac, 0xcb, 0x15, 0xb1, 0xae, 0x56, 0xc4, 0xfa, 0x5a, 0x13, 0xb4, 0xac, 0x09, 0xba, 0xac, 0x09, - 0xba, 0xaa, 0x09, 0xfa, 0x59, 0x13, 0xf4, 0xfd, 0x17, 0xb1, 0x3e, 0x8e, 0x36, 0x99, 0xbf, 0x03, - 0x00, 0x00, 0xff, 0xff, 0x44, 0x05, 0xba, 0x7b, 0x71, 0x03, 0x00, 0x00, + 0x76, 0xc6, 0x2e, 0x2a, 0x82, 0xb7, 0xb8, 0xb0, 0x08, 0x8a, 0x92, 0x83, 0x07, 0xf1, 0xe0, 0x24, + 0x79, 0x37, 0x1d, 0x9b, 0x64, 0xc2, 0xcc, 0x24, 0xb0, 0x37, 0xcf, 0x9e, 0xfc, 0x52, 0x42, 0x8f, + 0x7b, 0xdc, 0xd3, 0x62, 0xe3, 0x17, 0x91, 0xa4, 0x69, 0xd3, 0x5a, 0xfc, 0x73, 0xcb, 0x3c, 0xef, + 0xef, 0x79, 0xe6, 0xcd, 0xc3, 0xe0, 0x8b, 0xc5, 0x73, 0x4d, 0x85, 0x64, 0x8b, 0x32, 0x04, 0x95, + 0x83, 0x01, 0xcd, 0x2a, 0xc8, 0x63, 0xa9, 0x58, 0x37, 0xe0, 0x85, 0x60, 0x3a, 0x9a, 0x43, 0x5c, + 0xa6, 0x22, 0x4f, 0x58, 0x35, 0xe3, 0x69, 0x31, 0xe7, 0x33, 0x96, 0x40, 0x0e, 0x8a, 0x1b, 0x88, + 0x69, 0xa1, 0xa4, 0x91, 0x36, 0x59, 0xf3, 0x94, 0x17, 0x82, 0xf6, 0x3c, 0xdd, 0xf0, 0xd3, 0xd3, + 0x44, 0x98, 0x79, 0x19, 0xd2, 0x48, 0x66, 0x2c, 0x91, 0x89, 0x64, 0xad, 0x2d, 0x2c, 0x2f, 0xdb, + 0x53, 0x7b, 0x68, 0xbf, 0xd6, 0x71, 0xd3, 0x27, 0xfd, 0xf5, 0x19, 0x8f, 0xe6, 0x22, 0x07, 0x75, + 0xc5, 0x8a, 0x45, 0xd2, 0x08, 0x9a, 0x65, 0x60, 0x38, 0xab, 0x0e, 0x96, 0x98, 0xb2, 0x3f, 0xb9, + 0x54, 0x99, 0x1b, 0x91, 0xc1, 0x81, 0xe1, 0xd9, 0xbf, 0x0c, 0xcd, 0xaf, 0x64, 0xfc, 0x77, 0xdf, + 0xc9, 0xd7, 0x01, 0x9e, 0xbc, 0x53, 0x42, 0x2a, 0x61, 0xae, 0x5e, 0xa6, 0x5c, 0x6b, 0xfb, 0x13, + 0x1e, 0x35, 0x5b, 0xc5, 0xdc, 0x70, 0x07, 0xb9, 0xc8, 0x1b, 0x9f, 0x3d, 0xa6, 0x7d, 0x25, 0xdb, + 0x70, 0x5a, 0x2c, 0x92, 0x46, 0xd0, 0xb4, 0xa1, 0x69, 0x35, 0xa3, 0x6f, 0xc3, 0xcf, 0x10, 0x99, + 0x37, 0x60, 0xb8, 0x6f, 0x2f, 0x6f, 0x8f, 0xad, 0xfa, 0xf6, 0x18, 0xf7, 0x5a, 0xb0, 0x4d, 0xb5, + 0x1f, 0xe1, 0x61, 0xc5, 0xd3, 0x12, 0x9c, 0x81, 0x8b, 0xbc, 0xa1, 0x3f, 0xe9, 0xe0, 0xe1, 0xfb, + 0x46, 0x0c, 0xd6, 0x33, 0xfb, 0x05, 0x9e, 0x24, 0xa9, 0x0c, 0x79, 0x7a, 0x0e, 0x97, 0xbc, 0x4c, + 0x8d, 0x73, 0xe4, 0x22, 0x6f, 0xe4, 0x3f, 0xec, 0xe0, 0xc9, 0xc5, 0xee, 0x30, 0xd8, 0x67, 0xed, + 0xa7, 0x78, 0x1c, 0x83, 0x8e, 0x94, 0x28, 0x8c, 0x90, 0xb9, 0x73, 0xc7, 0x45, 0xde, 0x5d, 0xff, + 0x41, 0x67, 0x1d, 0x9f, 0xf7, 0xa3, 0x60, 0x97, 0x3b, 0xf9, 0x8e, 0xf0, 0xfd, 0xbd, 0x32, 0x5e, + 0x0b, 0x6d, 0xec, 0x8f, 0x07, 0x85, 0xd0, 0xff, 0x2b, 0xa4, 0x71, 0xb7, 0x75, 0xdc, 0xeb, 0x6e, + 0x1e, 0x6d, 0x94, 0x9d, 0x32, 0x02, 0x3c, 0x14, 0x06, 0x32, 0xed, 0x0c, 0xdc, 0x23, 0x6f, 0x7c, + 0x76, 0x4a, 0xff, 0xfe, 0xfc, 0xe8, 0xde, 0x7e, 0x7d, 0x77, 0xaf, 0x9a, 0x8c, 0x60, 0x1d, 0xe5, + 0xd3, 0xe5, 0x8a, 0x58, 0xd7, 0x2b, 0x62, 0xdd, 0xac, 0x88, 0xf5, 0xa5, 0x26, 0x68, 0x59, 0x13, + 0x74, 0x5d, 0x13, 0x74, 0x53, 0x13, 0xf4, 0xa3, 0x26, 0xe8, 0xdb, 0x4f, 0x62, 0x7d, 0x18, 0x6d, + 0x32, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xab, 0x20, 0x12, 0x63, 0x3c, 0x03, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto b/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto index 7dc5cc84..5fb54721 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.api.scheduling.v1alpha1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; diff --git a/vendor/k8s.io/api/settings/v1alpha1/BUILD b/vendor/k8s.io/api/settings/v1alpha1/BUILD index d7457427..16e48959 100644 --- a/vendor/k8s.io/api/settings/v1alpha1/BUILD +++ b/vendor/k8s.io/api/settings/v1alpha1/BUILD @@ -15,13 +15,14 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/settings/v1alpha1", importpath = "k8s.io/api/settings/v1alpha1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -37,9 +38,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go b/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go index 86a7f89a..15285bae 100644 --- a/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go @@ -891,40 +891,39 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 556 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x8e, 0xd2, 0x4e, - 0x1c, 0xc7, 0xe9, 0xb2, 0x04, 0xfe, 0x03, 0x9b, 0xbf, 0x69, 0x3c, 0x34, 0xc4, 0x94, 0x95, 0x8b, - 0x9b, 0x18, 0x67, 0x64, 0xd7, 0x18, 0xbd, 0x36, 0xc1, 0xc4, 0x04, 0xe2, 0xa6, 0x24, 0x9b, 0x68, - 0x3c, 0x38, 0x94, 0x9f, 0xa5, 0x42, 0x67, 0x9a, 0x99, 0x69, 0x13, 0x6f, 0x3e, 0x82, 0x2f, 0xe0, - 0x93, 0xe8, 0x03, 0x70, 0xdc, 0xe3, 0x9e, 0x36, 0x52, 0x5f, 0xc4, 0x4c, 0x99, 0x02, 0x8a, 0x28, - 0xb7, 0xce, 0x8f, 0xef, 0xe7, 0x33, 0xbf, 0x2f, 0x2d, 0xea, 0xcf, 0x9e, 0x49, 0x1c, 0x71, 0x32, - 0x4b, 0xc7, 0x20, 0x18, 0x28, 0x90, 0x24, 0x03, 0x36, 0xe1, 0x82, 0x98, 0x1f, 0x68, 0x12, 0x11, - 0x09, 0x4a, 0x45, 0x2c, 0x94, 0x24, 0xeb, 0xd1, 0x79, 0x32, 0xa5, 0x3d, 0x12, 0x02, 0x03, 0x41, - 0x15, 0x4c, 0x70, 0x22, 0xb8, 0xe2, 0xf6, 0xbd, 0x55, 0x1a, 0xd3, 0x24, 0xc2, 0x65, 0x1a, 0x97, - 0xe9, 0xf6, 0xa3, 0x30, 0x52, 0xd3, 0x74, 0x8c, 0x03, 0x1e, 0x93, 0x90, 0x87, 0x9c, 0x14, 0xd0, - 0x38, 0x7d, 0x5f, 0x9c, 0x8a, 0x43, 0xf1, 0xb4, 0x92, 0xb5, 0xbb, 0x5b, 0x57, 0x07, 0x5c, 0x00, - 0xc9, 0x76, 0x2e, 0x6c, 0x3f, 0xd9, 0x64, 0x62, 0x1a, 0x4c, 0x23, 0x06, 0xe2, 0x23, 0x49, 0x66, - 0xa1, 0x1e, 0x48, 0x12, 0x83, 0xa2, 0x7f, 0xa2, 0xc8, 0x3e, 0x4a, 0xa4, 0x4c, 0x45, 0x31, 0xec, - 0x00, 0x4f, 0xff, 0x05, 0xc8, 0x60, 0x0a, 0x31, 0xdd, 0xe1, 0x2e, 0xf6, 0x71, 0xa9, 0x8a, 0xe6, - 0x24, 0x62, 0x4a, 0x2a, 0xf1, 0x3b, 0xd4, 0xfd, 0x66, 0xa1, 0xff, 0x2e, 0xf9, 0xe4, 0x52, 0x80, - 0x04, 0x65, 0xbf, 0x43, 0x0d, 0x5d, 0x63, 0x42, 0x15, 0x75, 0xac, 0x53, 0xeb, 0xac, 0x79, 0xfe, - 0x18, 0x6f, 0xfe, 0xe5, 0xb5, 0x15, 0x27, 0xb3, 0x50, 0x0f, 0x24, 0xd6, 0x69, 0x9c, 0xf5, 0xf0, - 0xab, 0xf1, 0x07, 0x08, 0xd4, 0x10, 0x14, 0xf5, 0xec, 0xc5, 0x6d, 0xa7, 0x92, 0xdf, 0x76, 0xd0, - 0x66, 0xe6, 0xaf, 0xad, 0xf6, 0x10, 0x1d, 0xcb, 0x04, 0x02, 0xe7, 0xa8, 0xb0, 0x3f, 0xc4, 0x7f, - 0x7b, 0x87, 0x78, 0xbd, 0xd8, 0x28, 0x81, 0xc0, 0x6b, 0x19, 0xf1, 0xb1, 0x3e, 0xf9, 0x85, 0xa6, - 0xfb, 0xd5, 0x42, 0x27, 0xeb, 0xd4, 0x20, 0x92, 0xca, 0x7e, 0xbb, 0x53, 0x01, 0x1f, 0x56, 0x41, - 0xd3, 0x45, 0x81, 0x3b, 0xe6, 0x9e, 0x46, 0x39, 0xd9, 0x5a, 0x7f, 0x80, 0x6a, 0x91, 0x82, 0x58, - 0x3a, 0x47, 0xa7, 0xd5, 0xb3, 0xe6, 0xf9, 0x83, 0x03, 0xf7, 0xf7, 0x4e, 0x8c, 0xb3, 0xf6, 0x52, - 0xd3, 0xfe, 0x4a, 0xd2, 0xfd, 0x52, 0xdd, 0xda, 0x5e, 0xb7, 0xb2, 0x29, 0x6a, 0x48, 0x98, 0x43, - 0xa0, 0xb8, 0x30, 0xdb, 0x5f, 0x1c, 0xb8, 0x3d, 0x1d, 0xc3, 0x7c, 0x64, 0xd0, 0x4d, 0x85, 0x72, - 0xe2, 0xaf, 0xb5, 0xf6, 0x73, 0x54, 0x05, 0x96, 0x99, 0x02, 0xed, 0xed, 0x02, 0xfa, 0xbb, 0xd7, - 0xae, 0x3e, 0xcb, 0xae, 0xa8, 0xf0, 0x9a, 0x46, 0x52, 0xed, 0xb3, 0xcc, 0xd7, 0x8c, 0x3d, 0x40, - 0x75, 0x60, 0xd9, 0x0b, 0xc1, 0x63, 0xa7, 0x5a, 0xe0, 0xf7, 0xf7, 0xe0, 0x3a, 0x32, 0xe2, 0xa9, - 0x08, 0xc0, 0xfb, 0xdf, 0x58, 0xea, 0x66, 0xec, 0x97, 0x0a, 0xbb, 0x8f, 0xea, 0x19, 0x9f, 0xa7, - 0x31, 0x48, 0xe7, 0x78, 0xff, 0x32, 0x57, 0x45, 0x64, 0xa3, 0x59, 0x9d, 0xa5, 0x5f, 0xb2, 0xf6, - 0x6b, 0xd4, 0x5a, 0x3d, 0x0e, 0x79, 0xca, 0x94, 0x74, 0x6a, 0x85, 0xab, 0xb3, 0xdf, 0x55, 0xe4, - 0xbc, 0xbb, 0x46, 0xd8, 0xda, 0x1a, 0x4a, 0xff, 0x17, 0x95, 0x87, 0x17, 0x4b, 0xb7, 0x72, 0xbd, - 0x74, 0x2b, 0x37, 0x4b, 0xb7, 0xf2, 0x29, 0x77, 0xad, 0x45, 0xee, 0x5a, 0xd7, 0xb9, 0x6b, 0xdd, - 0xe4, 0xae, 0xf5, 0x3d, 0x77, 0xad, 0xcf, 0x3f, 0xdc, 0xca, 0x9b, 0x46, 0xf9, 0xbe, 0x7f, 0x06, - 0x00, 0x00, 0xff, 0xff, 0x0e, 0x35, 0x98, 0xb5, 0xd9, 0x04, 0x00, 0x00, + // 542 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x8e, 0xd2, 0x40, + 0x1c, 0xc6, 0xe9, 0xb2, 0x04, 0x1c, 0xd8, 0x68, 0x1a, 0x0f, 0x0d, 0x31, 0x65, 0xe5, 0xe2, 0x26, + 0xc6, 0x19, 0x59, 0x8d, 0xd1, 0x6b, 0x13, 0x4c, 0x4c, 0x20, 0x6e, 0x4a, 0xb2, 0x89, 0xc6, 0x83, + 0x43, 0xf9, 0x5b, 0x2a, 0xb4, 0xd3, 0xcc, 0x4c, 0x9b, 0x78, 0xf3, 0x11, 0x7c, 0x01, 0x9f, 0x44, + 0x1f, 0x80, 0xe3, 0x1e, 0xf7, 0xb4, 0x91, 0xfa, 0x22, 0x66, 0x86, 0x29, 0xa0, 0x88, 0x72, 0x9b, + 0xff, 0x9f, 0xef, 0xfb, 0xcd, 0xf7, 0x31, 0x45, 0xfd, 0xd9, 0x73, 0x81, 0x23, 0x46, 0x66, 0xd9, + 0x18, 0x78, 0x02, 0x12, 0x04, 0xc9, 0x21, 0x99, 0x30, 0x4e, 0xcc, 0x0f, 0x34, 0x8d, 0x88, 0x00, + 0x29, 0xa3, 0x24, 0x14, 0x24, 0xef, 0xd1, 0x79, 0x3a, 0xa5, 0x3d, 0x12, 0x42, 0x02, 0x9c, 0x4a, + 0x98, 0xe0, 0x94, 0x33, 0xc9, 0xec, 0x7b, 0x2b, 0x35, 0xa6, 0x69, 0x84, 0x4b, 0x35, 0x2e, 0xd5, + 0xed, 0x47, 0x61, 0x24, 0xa7, 0xd9, 0x18, 0x07, 0x2c, 0x26, 0x21, 0x0b, 0x19, 0xd1, 0xa6, 0x71, + 0xf6, 0x41, 0x4f, 0x7a, 0xd0, 0xa7, 0x15, 0xac, 0xdd, 0xdd, 0xba, 0x3a, 0x60, 0x1c, 0x48, 0xbe, + 0x73, 0x61, 0xfb, 0xe9, 0x46, 0x13, 0xd3, 0x60, 0x1a, 0x25, 0xc0, 0x3f, 0x91, 0x74, 0x16, 0xaa, + 0x85, 0x20, 0x31, 0x48, 0xfa, 0x37, 0x17, 0xd9, 0xe7, 0xe2, 0x59, 0x22, 0xa3, 0x18, 0x76, 0x0c, + 0xcf, 0xfe, 0x67, 0x10, 0xc1, 0x14, 0x62, 0xfa, 0xa7, 0xaf, 0xfb, 0xdd, 0x42, 0xb7, 0x2e, 0xd8, + 0xe4, 0x82, 0x83, 0x00, 0x69, 0xbf, 0x47, 0x0d, 0x95, 0x68, 0x42, 0x25, 0x75, 0xac, 0x53, 0xeb, + 0xac, 0x79, 0xfe, 0x18, 0x6f, 0xfe, 0xb0, 0x35, 0x18, 0xa7, 0xb3, 0x50, 0x2d, 0x04, 0x56, 0x6a, + 0x9c, 0xf7, 0xf0, 0xeb, 0xf1, 0x47, 0x08, 0xe4, 0x10, 0x24, 0xf5, 0xec, 0xc5, 0x4d, 0xa7, 0x52, + 0xdc, 0x74, 0xd0, 0x66, 0xe7, 0xaf, 0xa9, 0xf6, 0x10, 0x1d, 0x8b, 0x14, 0x02, 0xe7, 0x48, 0xd3, + 0x1f, 0xe2, 0x7f, 0x3d, 0x07, 0x5e, 0x07, 0x1b, 0xa5, 0x10, 0x78, 0x2d, 0x03, 0x3e, 0x56, 0x93, + 0xaf, 0x31, 0xdd, 0x6f, 0x16, 0x3a, 0x59, 0xab, 0x06, 0x91, 0x90, 0xf6, 0xbb, 0x9d, 0x0a, 0xf8, + 0xb0, 0x0a, 0xca, 0xad, 0x0b, 0xdc, 0x31, 0xf7, 0x34, 0xca, 0xcd, 0x56, 0xfc, 0x01, 0xaa, 0x45, + 0x12, 0x62, 0xe1, 0x1c, 0x9d, 0x56, 0xcf, 0x9a, 0xe7, 0x0f, 0x0e, 0xcc, 0xef, 0x9d, 0x18, 0x66, + 0xed, 0x95, 0x72, 0xfb, 0x2b, 0x48, 0xf7, 0x6b, 0x75, 0x2b, 0xbd, 0x6a, 0x65, 0x53, 0xd4, 0x10, + 0x30, 0x87, 0x40, 0x32, 0x6e, 0xd2, 0x3f, 0x39, 0x30, 0x3d, 0x1d, 0xc3, 0x7c, 0x64, 0xac, 0x9b, + 0x0a, 0xe5, 0xc6, 0x5f, 0x63, 0xed, 0x17, 0xa8, 0x0a, 0x49, 0x6e, 0x0a, 0xb4, 0xb7, 0x0b, 0xa8, + 0x4f, 0x58, 0xb1, 0xfa, 0x49, 0x7e, 0x49, 0xb9, 0xd7, 0x34, 0x90, 0x6a, 0x3f, 0xc9, 0x7d, 0xe5, + 0xb1, 0x07, 0xa8, 0x0e, 0x49, 0xfe, 0x92, 0xb3, 0xd8, 0xa9, 0x6a, 0xfb, 0xfd, 0x3d, 0x76, 0x25, + 0x19, 0xb1, 0x8c, 0x07, 0xe0, 0xdd, 0x36, 0x94, 0xba, 0x59, 0xfb, 0x25, 0xc2, 0xee, 0xa3, 0x7a, + 0xce, 0xe6, 0x59, 0x0c, 0xc2, 0x39, 0xde, 0x1f, 0xe6, 0x52, 0x4b, 0x36, 0x98, 0xd5, 0x2c, 0xfc, + 0xd2, 0x6b, 0xbf, 0x41, 0xad, 0xd5, 0x71, 0xc8, 0xb2, 0x44, 0x0a, 0xa7, 0xa6, 0x59, 0x9d, 0xfd, + 0x2c, 0xad, 0xf3, 0xee, 0x1a, 0x60, 0x6b, 0x6b, 0x29, 0xfc, 0xdf, 0x50, 0x1e, 0x5e, 0x2c, 0xdd, + 0xca, 0xd5, 0xd2, 0xad, 0x5c, 0x2f, 0xdd, 0xca, 0xe7, 0xc2, 0xb5, 0x16, 0x85, 0x6b, 0x5d, 0x15, + 0xae, 0x75, 0x5d, 0xb8, 0xd6, 0x8f, 0xc2, 0xb5, 0xbe, 0xfc, 0x74, 0x2b, 0x6f, 0x1b, 0xe5, 0x7b, + 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x46, 0x15, 0xf2, 0x97, 0xa4, 0x04, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/settings/v1alpha1/generated.proto b/vendor/k8s.io/api/settings/v1alpha1/generated.proto index 887d2fa1..d5534c4d 100644 --- a/vendor/k8s.io/api/settings/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/settings/v1alpha1/generated.proto @@ -25,7 +25,6 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; diff --git a/vendor/k8s.io/api/storage/v1/BUILD b/vendor/k8s.io/api/storage/v1/BUILD index 50a09f0e..918cbfa6 100644 --- a/vendor/k8s.io/api/storage/v1/BUILD +++ b/vendor/k8s.io/api/storage/v1/BUILD @@ -10,24 +10,19 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1", importpath = "k8s.io/api/storage/v1", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/vendor/k8s.io/api/storage/v1/generated.pb.go b/vendor/k8s.io/api/storage/v1/generated.pb.go index b13b03fc..d43a9829 100644 --- a/vendor/k8s.io/api/storage/v1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1/generated.pb.go @@ -933,48 +933,46 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 677 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xc1, 0x6e, 0xd3, 0x4a, - 0x14, 0x8d, 0x93, 0x97, 0xbe, 0x74, 0xd2, 0xea, 0x25, 0x7e, 0x45, 0x32, 0x59, 0x38, 0x51, 0xd9, - 0x44, 0x95, 0x18, 0x37, 0x6d, 0x41, 0x15, 0x12, 0x48, 0x35, 0xaa, 0x04, 0x52, 0xab, 0x46, 0x6e, - 0x55, 0x21, 0xc4, 0x82, 0x89, 0x73, 0x71, 0x87, 0xd8, 0x33, 0x66, 0x66, 0x6c, 0xc8, 0x8e, 0x1f, - 0x40, 0xe2, 0x7b, 0xf8, 0x82, 0x2e, 0xbb, 0xec, 0x2a, 0xa2, 0xe6, 0x2f, 0xba, 0x42, 0x76, 0x42, - 0xe3, 0x26, 0xa9, 0xe8, 0x6e, 0xe6, 0xdc, 0x73, 0xce, 0x9d, 0x3b, 0xf7, 0x5e, 0xf4, 0x62, 0xb0, - 0x2b, 0x31, 0xe5, 0xd6, 0x20, 0xea, 0x81, 0x60, 0xa0, 0x40, 0x5a, 0x31, 0xb0, 0x3e, 0x17, 0xd6, - 0x24, 0x40, 0x42, 0x6a, 0x49, 0xc5, 0x05, 0xf1, 0xc0, 0x8a, 0x3b, 0x96, 0x07, 0x0c, 0x04, 0x51, - 0xd0, 0xc7, 0xa1, 0xe0, 0x8a, 0xeb, 0x0f, 0xc6, 0x34, 0x4c, 0x42, 0x8a, 0x27, 0x34, 0x1c, 0x77, - 0x1a, 0x8f, 0x3d, 0xaa, 0xce, 0xa2, 0x1e, 0x76, 0x79, 0x60, 0x79, 0xdc, 0xe3, 0x56, 0xc6, 0xee, - 0x45, 0x1f, 0xb2, 0x5b, 0x76, 0xc9, 0x4e, 0x63, 0x97, 0xc6, 0x7a, 0x2e, 0x99, 0xcb, 0xc5, 0xa2, - 0x4c, 0x8d, 0x8d, 0x85, 0x0f, 0xea, 0x81, 0x22, 0xf3, 0xdc, 0x9d, 0x29, 0x37, 0x20, 0xee, 0x19, - 0x65, 0x20, 0x86, 0x56, 0x38, 0xf0, 0x52, 0x40, 0x5a, 0x01, 0x28, 0xb2, 0x28, 0x83, 0x75, 0x97, - 0x4a, 0x44, 0x4c, 0xd1, 0x00, 0xe6, 0x04, 0x4f, 0xff, 0x26, 0x90, 0xee, 0x19, 0x04, 0x64, 0x4e, - 0xb7, 0x7d, 0x97, 0x2e, 0x52, 0xd4, 0xb7, 0x28, 0x53, 0x52, 0x89, 0x59, 0xd1, 0xfa, 0xb7, 0x25, - 0xb4, 0x72, 0x3c, 0xae, 0xfb, 0xa5, 0x4f, 0xa4, 0xd4, 0xdf, 0xa3, 0x4a, 0x5a, 0x49, 0x9f, 0x28, - 0x62, 0x68, 0x2d, 0xad, 0x5d, 0xdd, 0xda, 0xc4, 0xd3, 0x6e, 0xdc, 0x18, 0xe3, 0x70, 0xe0, 0xa5, - 0x80, 0xc4, 0x29, 0x1b, 0xc7, 0x1d, 0x7c, 0xd4, 0xfb, 0x08, 0xae, 0x3a, 0x04, 0x45, 0x6c, 0xfd, - 0x7c, 0xd4, 0x2c, 0x24, 0xa3, 0x26, 0x9a, 0x62, 0xce, 0x8d, 0xab, 0xfe, 0x04, 0x55, 0x43, 0xc1, - 0x63, 0x2a, 0x29, 0x67, 0x20, 0x8c, 0x62, 0x4b, 0x6b, 0x2f, 0xdb, 0xff, 0x4f, 0x24, 0xd5, 0xee, - 0x34, 0xe4, 0xe4, 0x79, 0xba, 0x87, 0x50, 0x48, 0x04, 0x09, 0x40, 0x81, 0x90, 0x46, 0xa9, 0x55, - 0x6a, 0x57, 0xb7, 0xb6, 0xf1, 0xc2, 0x41, 0xc1, 0xf9, 0x8a, 0x70, 0xf7, 0x46, 0xb5, 0xcf, 0x94, - 0x18, 0x4e, 0x5f, 0x37, 0x0d, 0x38, 0x39, 0x6b, 0x7d, 0x80, 0x56, 0x05, 0xb8, 0x3e, 0xa1, 0x41, - 0x97, 0xfb, 0xd4, 0x1d, 0x1a, 0xff, 0x64, 0x2f, 0xdc, 0x4f, 0x46, 0xcd, 0x55, 0x27, 0x1f, 0xb8, - 0x1e, 0x35, 0x37, 0xe7, 0x47, 0x0c, 0x77, 0x41, 0x48, 0x2a, 0x15, 0x30, 0x75, 0xca, 0xfd, 0x28, - 0x80, 0x5b, 0x1a, 0xe7, 0xb6, 0xb7, 0xbe, 0x83, 0x56, 0x02, 0x1e, 0x31, 0x75, 0x14, 0x2a, 0xca, - 0x99, 0x34, 0xca, 0xad, 0x52, 0x7b, 0xd9, 0xae, 0x25, 0xa3, 0xe6, 0xca, 0x61, 0x0e, 0x77, 0x6e, - 0xb1, 0xf4, 0x03, 0xb4, 0x46, 0x7c, 0x9f, 0x7f, 0x1e, 0x27, 0xd8, 0xff, 0x12, 0x12, 0x96, 0xfe, - 0x92, 0xb1, 0xd4, 0xd2, 0xda, 0x15, 0xdb, 0x48, 0x46, 0xcd, 0xb5, 0xbd, 0x05, 0x71, 0x67, 0xa1, - 0x4a, 0x7f, 0x83, 0xea, 0x71, 0x06, 0xd9, 0x94, 0xf5, 0x29, 0xf3, 0x0e, 0x79, 0x1f, 0x8c, 0x7f, - 0xb3, 0xa2, 0x37, 0x92, 0x51, 0xb3, 0x7e, 0x3a, 0x1b, 0xbc, 0x5e, 0x04, 0x3a, 0xf3, 0x26, 0xfa, - 0x27, 0x54, 0xcf, 0x32, 0x42, 0xff, 0x84, 0x87, 0xdc, 0xe7, 0x1e, 0x05, 0x69, 0x54, 0xb2, 0xd6, - 0xb5, 0xf3, 0xad, 0x4b, 0xbf, 0x2e, 0xed, 0xdb, 0x84, 0x35, 0x3c, 0x06, 0x1f, 0x5c, 0xc5, 0xc5, - 0x09, 0x88, 0xc0, 0x7e, 0x38, 0xe9, 0x57, 0x7d, 0x6f, 0xd6, 0xca, 0x99, 0x77, 0x6f, 0x3c, 0x47, - 0xff, 0xcd, 0x34, 0x5c, 0xaf, 0xa1, 0xd2, 0x00, 0x86, 0xd9, 0x34, 0x2f, 0x3b, 0xe9, 0x51, 0x5f, - 0x43, 0xe5, 0x98, 0xf8, 0x11, 0x8c, 0x87, 0xcf, 0x19, 0x5f, 0x9e, 0x15, 0x77, 0xb5, 0xf5, 0x1f, - 0x1a, 0xaa, 0xe5, 0xa7, 0xe7, 0x80, 0x4a, 0xa5, 0xbf, 0x9b, 0xdb, 0x09, 0x7c, 0xbf, 0x9d, 0x48, - 0xd5, 0xd9, 0x46, 0xd4, 0x26, 0x35, 0x54, 0xfe, 0x20, 0xb9, 0x7d, 0x78, 0x85, 0xca, 0x54, 0x41, - 0x20, 0x8d, 0x62, 0xf6, 0x31, 0x8f, 0xee, 0x31, 0xd3, 0xf6, 0xea, 0xc4, 0xaf, 0xfc, 0x3a, 0x55, - 0x3a, 0x63, 0x03, 0xbb, 0x7d, 0x7e, 0x65, 0x16, 0x2e, 0xae, 0xcc, 0xc2, 0xe5, 0x95, 0x59, 0xf8, - 0x9a, 0x98, 0xda, 0x79, 0x62, 0x6a, 0x17, 0x89, 0xa9, 0x5d, 0x26, 0xa6, 0xf6, 0x33, 0x31, 0xb5, - 0xef, 0xbf, 0xcc, 0xc2, 0xdb, 0x62, 0xdc, 0xf9, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x0e, 0x67, 0x74, - 0x30, 0xa1, 0x05, 0x00, 0x00, + // 656 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xcd, 0x6e, 0xd3, 0x4a, + 0x14, 0x8e, 0x93, 0x9b, 0xde, 0x74, 0xd2, 0xea, 0x26, 0xbe, 0xbd, 0x92, 0x6f, 0x16, 0x4e, 0x54, + 0x36, 0x11, 0x12, 0xe3, 0xa6, 0x14, 0x54, 0x21, 0x81, 0x54, 0xa3, 0x4a, 0x20, 0xb5, 0x6a, 0xe4, + 0x56, 0x15, 0x42, 0x2c, 0x98, 0x38, 0x07, 0x77, 0x88, 0xed, 0x31, 0x33, 0x63, 0x43, 0x76, 0xbc, + 0x00, 0x12, 0xcf, 0xc3, 0x13, 0x74, 0xd9, 0x65, 0x57, 0x16, 0x35, 0x6f, 0xd1, 0x15, 0xf2, 0x0f, + 0x8d, 0x9b, 0x04, 0xd1, 0xdd, 0xcc, 0x77, 0xbe, 0xef, 0x3b, 0x33, 0xe7, 0x07, 0x3d, 0x9b, 0xec, + 0x0a, 0x4c, 0x99, 0x31, 0x09, 0x47, 0xc0, 0x7d, 0x90, 0x20, 0x8c, 0x08, 0xfc, 0x31, 0xe3, 0x46, + 0x11, 0x20, 0x01, 0x35, 0x84, 0x64, 0x9c, 0x38, 0x60, 0x44, 0x03, 0xc3, 0x01, 0x1f, 0x38, 0x91, + 0x30, 0xc6, 0x01, 0x67, 0x92, 0xa9, 0xff, 0xe5, 0x34, 0x4c, 0x02, 0x8a, 0x0b, 0x1a, 0x8e, 0x06, + 0x9d, 0x07, 0x0e, 0x95, 0x67, 0xe1, 0x08, 0xdb, 0xcc, 0x33, 0x1c, 0xe6, 0x30, 0x23, 0x63, 0x8f, + 0xc2, 0x77, 0xd9, 0x2d, 0xbb, 0x64, 0xa7, 0xdc, 0xa5, 0xb3, 0x59, 0x4a, 0x66, 0x33, 0xbe, 0x2c, + 0x53, 0x67, 0x67, 0xc6, 0xf1, 0x88, 0x7d, 0x46, 0x7d, 0xe0, 0x53, 0x23, 0x98, 0x38, 0x29, 0x20, + 0x0c, 0x0f, 0x24, 0x59, 0xa6, 0x32, 0x7e, 0xa7, 0xe2, 0xa1, 0x2f, 0xa9, 0x07, 0x0b, 0x82, 0xc7, + 0x7f, 0x12, 0x08, 0xfb, 0x0c, 0x3c, 0x32, 0xaf, 0xdb, 0xfc, 0xb2, 0x82, 0xd6, 0x8e, 0xf3, 0x02, + 0x3c, 0x77, 0x89, 0x10, 0xea, 0x5b, 0xd4, 0x48, 0x1f, 0x35, 0x26, 0x92, 0x68, 0x4a, 0x4f, 0xe9, + 0x37, 0xb7, 0xb7, 0xf0, 0xac, 0x58, 0x37, 0xde, 0x38, 0x98, 0x38, 0x29, 0x20, 0x70, 0xca, 0xc6, + 0xd1, 0x00, 0x1f, 0x8d, 0xde, 0x83, 0x2d, 0x0f, 0x41, 0x12, 0x53, 0x3d, 0x8f, 0xbb, 0x95, 0x24, + 0xee, 0xa2, 0x19, 0x66, 0xdd, 0xb8, 0xaa, 0x8f, 0x50, 0x33, 0xe0, 0x2c, 0xa2, 0x82, 0x32, 0x1f, + 0xb8, 0x56, 0xed, 0x29, 0xfd, 0x55, 0xf3, 0xdf, 0x42, 0xd2, 0x1c, 0xce, 0x42, 0x56, 0x99, 0xa7, + 0x3a, 0x08, 0x05, 0x84, 0x13, 0x0f, 0x24, 0x70, 0xa1, 0xd5, 0x7a, 0xb5, 0x7e, 0x73, 0xfb, 0x21, + 0x5e, 0xda, 0x47, 0x5c, 0xfe, 0x11, 0x1e, 0xde, 0xa8, 0xf6, 0x7d, 0xc9, 0xa7, 0xb3, 0xd7, 0xcd, + 0x02, 0x56, 0xc9, 0x5a, 0x9d, 0xa0, 0x75, 0x0e, 0xb6, 0x4b, 0xa8, 0x37, 0x64, 0x2e, 0xb5, 0xa7, + 0xda, 0x5f, 0xd9, 0x0b, 0xf7, 0x93, 0xb8, 0xbb, 0x6e, 0x95, 0x03, 0xd7, 0x71, 0x77, 0x6b, 0x71, + 0x02, 0xf0, 0x10, 0xb8, 0xa0, 0x42, 0x82, 0x2f, 0x4f, 0x99, 0x1b, 0x7a, 0x70, 0x4b, 0x63, 0xdd, + 0xf6, 0x56, 0x77, 0xd0, 0x9a, 0xc7, 0x42, 0x5f, 0x1e, 0x05, 0x92, 0x32, 0x5f, 0x68, 0xf5, 0x5e, + 0xad, 0xbf, 0x6a, 0xb6, 0x92, 0xb8, 0xbb, 0x76, 0x58, 0xc2, 0xad, 0x5b, 0x2c, 0xf5, 0x00, 0x6d, + 0x10, 0xd7, 0x65, 0x1f, 0xf3, 0x04, 0xfb, 0x9f, 0x02, 0xe2, 0xa7, 0x55, 0xd2, 0x56, 0x7a, 0x4a, + 0xbf, 0x61, 0x6a, 0x49, 0xdc, 0xdd, 0xd8, 0x5b, 0x12, 0xb7, 0x96, 0xaa, 0xd4, 0x57, 0xa8, 0x1d, + 0x65, 0x90, 0x49, 0xfd, 0x31, 0xf5, 0x9d, 0x43, 0x36, 0x06, 0xed, 0xef, 0xec, 0xd3, 0xf7, 0x93, + 0xb8, 0xdb, 0x3e, 0x9d, 0x0f, 0x5e, 0x2f, 0x03, 0xad, 0x45, 0x13, 0xf5, 0x03, 0x6a, 0x67, 0x19, + 0x61, 0x7c, 0xc2, 0x02, 0xe6, 0x32, 0x87, 0x82, 0xd0, 0x1a, 0x59, 0xeb, 0xfa, 0xe5, 0xd6, 0xa5, + 0xa5, 0x4b, 0xfb, 0x56, 0xb0, 0xa6, 0xc7, 0xe0, 0x82, 0x2d, 0x19, 0x3f, 0x01, 0xee, 0x99, 0xff, + 0x17, 0xfd, 0x6a, 0xef, 0xcd, 0x5b, 0x59, 0x8b, 0xee, 0x9d, 0xa7, 0xe8, 0x9f, 0xb9, 0x86, 0xab, + 0x2d, 0x54, 0x9b, 0xc0, 0x34, 0x9b, 0xe6, 0x55, 0x2b, 0x3d, 0xaa, 0x1b, 0xa8, 0x1e, 0x11, 0x37, + 0x84, 0x7c, 0xf8, 0xac, 0xfc, 0xf2, 0xa4, 0xba, 0xab, 0x6c, 0x7e, 0x53, 0x50, 0xab, 0x3c, 0x3d, + 0x07, 0x54, 0x48, 0xf5, 0xcd, 0xc2, 0x4e, 0xe0, 0xbb, 0xed, 0x44, 0xaa, 0xce, 0x36, 0xa2, 0x55, + 0xfc, 0xa1, 0xf1, 0x0b, 0x29, 0xed, 0xc3, 0x0b, 0x54, 0xa7, 0x12, 0x3c, 0xa1, 0x55, 0xb3, 0xc2, + 0xdc, 0xbb, 0xc3, 0x4c, 0x9b, 0xeb, 0x85, 0x5f, 0xfd, 0x65, 0xaa, 0xb4, 0x72, 0x03, 0xb3, 0x7f, + 0x7e, 0xa5, 0x57, 0x2e, 0xae, 0xf4, 0xca, 0xe5, 0x95, 0x5e, 0xf9, 0x9c, 0xe8, 0xca, 0x79, 0xa2, + 0x2b, 0x17, 0x89, 0xae, 0x5c, 0x26, 0xba, 0xf2, 0x3d, 0xd1, 0x95, 0xaf, 0x3f, 0xf4, 0xca, 0xeb, + 0x6a, 0x34, 0xf8, 0x19, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x64, 0x41, 0x83, 0x40, 0x05, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/storage/v1/generated.proto b/vendor/k8s.io/api/storage/v1/generated.proto index cff64221..d1785659 100644 --- a/vendor/k8s.io/api/storage/v1/generated.proto +++ b/vendor/k8s.io/api/storage/v1/generated.proto @@ -22,11 +22,9 @@ syntax = 'proto2'; package k8s.io.api.storage.v1; import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/api/storage/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; @@ -67,16 +65,14 @@ message StorageClass { // VolumeBindingMode indicates how PersistentVolumeClaims should be // provisioned and bound. When unset, VolumeBindingImmediate is used. - // This field is alpha-level and is only honored by servers that enable - // the VolumeScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional optional string volumeBindingMode = 7; // Restrict the node topologies where volumes can be dynamically provisioned. // Each volume plugin defines its own supported topology specifications. // An empty TopologySelectorTerm list means there is no topology restriction. - // This field is alpha-level and is only honored by servers that enable - // the DynamicProvisioningScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional repeated k8s.io.api.core.v1.TopologySelectorTerm allowedTopologies = 8; } diff --git a/vendor/k8s.io/api/storage/v1/types.go b/vendor/k8s.io/api/storage/v1/types.go index 45bfa768..30e6d6d2 100644 --- a/vendor/k8s.io/api/storage/v1/types.go +++ b/vendor/k8s.io/api/storage/v1/types.go @@ -62,16 +62,14 @@ type StorageClass struct { // VolumeBindingMode indicates how PersistentVolumeClaims should be // provisioned and bound. When unset, VolumeBindingImmediate is used. - // This field is alpha-level and is only honored by servers that enable - // the VolumeScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional VolumeBindingMode *VolumeBindingMode `json:"volumeBindingMode,omitempty" protobuf:"bytes,7,opt,name=volumeBindingMode"` // Restrict the node topologies where volumes can be dynamically provisioned. // Each volume plugin defines its own supported topology specifications. // An empty TopologySelectorTerm list means there is no topology restriction. - // This field is alpha-level and is only honored by servers that enable - // the DynamicProvisioningScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional AllowedTopologies []v1.TopologySelectorTerm `json:"allowedTopologies,omitempty" protobuf:"bytes,8,rep,name=allowedTopologies"` } diff --git a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go index 1d658704..23b76e28 100644 --- a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go @@ -35,8 +35,8 @@ var map_StorageClass = map[string]string{ "reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", "allowVolumeExpansion": "AllowVolumeExpansion shows whether the storage class allow volume expand", - "volumeBindingMode": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is alpha-level and is only honored by servers that enable the VolumeScheduling feature.", - "allowedTopologies": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is alpha-level and is only honored by servers that enable the DynamicProvisioningScheduling feature.", + "volumeBindingMode": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.", + "allowedTopologies": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.", } func (StorageClass) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go index a1050134..0e850dc3 100644 --- a/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go @@ -21,7 +21,7 @@ limitations under the License. package v1 import ( - core_v1 "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -39,12 +39,8 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { } if in.ReclaimPolicy != nil { in, out := &in.ReclaimPolicy, &out.ReclaimPolicy - if *in == nil { - *out = nil - } else { - *out = new(core_v1.PersistentVolumeReclaimPolicy) - **out = **in - } + *out = new(corev1.PersistentVolumeReclaimPolicy) + **out = **in } if in.MountOptions != nil { in, out := &in.MountOptions, &out.MountOptions @@ -53,25 +49,17 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { } if in.AllowVolumeExpansion != nil { in, out := &in.AllowVolumeExpansion, &out.AllowVolumeExpansion - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.VolumeBindingMode != nil { in, out := &in.VolumeBindingMode, &out.VolumeBindingMode - if *in == nil { - *out = nil - } else { - *out = new(VolumeBindingMode) - **out = **in - } + *out = new(VolumeBindingMode) + **out = **in } if in.AllowedTopologies != nil { in, out := &in.AllowedTopologies, &out.AllowedTopologies - *out = make([]core_v1.TopologySelectorTerm, len(*in)) + *out = make([]corev1.TopologySelectorTerm, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/vendor/k8s.io/api/storage/v1alpha1/BUILD b/vendor/k8s.io/api/storage/v1alpha1/BUILD index 98342a42..612e08b5 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/BUILD +++ b/vendor/k8s.io/api/storage/v1alpha1/BUILD @@ -1,11 +1,5 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - go_library( name = "go_default_library", srcs = [ @@ -16,14 +10,15 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1alpha1", importpath = "k8s.io/api/storage/v1alpha1", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go b/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go index e1d5a3aa..507b5c1d 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go @@ -1472,52 +1472,49 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 745 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x3d, 0x6f, 0xdb, 0x46, - 0x18, 0xc7, 0x45, 0x49, 0xb6, 0xe5, 0x53, 0x5f, 0x8c, 0x83, 0xd0, 0x0a, 0x2a, 0x40, 0x19, 0x9a, - 0xdc, 0xa2, 0x3e, 0x56, 0x76, 0x51, 0x18, 0xdd, 0x44, 0xd8, 0x43, 0x51, 0xcb, 0x2d, 0xe8, 0xa2, - 0x43, 0xdb, 0xa1, 0x27, 0xf2, 0x31, 0x45, 0x4b, 0x7c, 0xc1, 0xdd, 0x51, 0x88, 0xb7, 0x4c, 0x99, - 0xb3, 0xe5, 0x1b, 0xe4, 0xb3, 0x68, 0x8b, 0x47, 0x4f, 0x42, 0xcc, 0x7c, 0x8b, 0x2c, 0x09, 0x78, - 0x3c, 0x89, 0xb2, 0x29, 0x25, 0xb6, 0x37, 0x3e, 0xcf, 0x3d, 0xff, 0xdf, 0xf3, 0x76, 0x47, 0x74, - 0x3c, 0x3a, 0xe2, 0xc4, 0x0b, 0x8d, 0x51, 0x3c, 0x00, 0x16, 0x80, 0x00, 0x6e, 0x4c, 0x20, 0x70, - 0x42, 0x66, 0xa8, 0x03, 0x1a, 0x79, 0x06, 0x17, 0x21, 0xa3, 0x2e, 0x18, 0x93, 0x2e, 0x1d, 0x47, - 0x43, 0xda, 0x35, 0x5c, 0x08, 0x80, 0x51, 0x01, 0x0e, 0x89, 0x58, 0x28, 0x42, 0xfc, 0x5d, 0x16, - 0x4c, 0x68, 0xe4, 0x11, 0x15, 0x4c, 0xe6, 0xc1, 0xad, 0x7d, 0xd7, 0x13, 0xc3, 0x78, 0x40, 0xec, - 0xd0, 0x37, 0xdc, 0xd0, 0x0d, 0x0d, 0xa9, 0x19, 0xc4, 0x17, 0xd2, 0x92, 0x86, 0xfc, 0xca, 0x58, - 0xad, 0x7e, 0x9e, 0x18, 0x9e, 0x09, 0x08, 0xb8, 0x17, 0x06, 0x7c, 0x9f, 0x46, 0x1e, 0x07, 0x36, - 0x01, 0x66, 0x44, 0x23, 0x37, 0x3d, 0xe3, 0x77, 0x03, 0x8c, 0x49, 0x77, 0x00, 0xa2, 0x58, 0x5a, - 0xeb, 0xe7, 0x1c, 0xe7, 0x53, 0x7b, 0xe8, 0x05, 0xc0, 0xae, 0x72, 0x86, 0x0f, 0x82, 0x1a, 0x93, - 0xa2, 0xca, 0x58, 0xa7, 0x62, 0x71, 0x20, 0x3c, 0x1f, 0x0a, 0x82, 0x5f, 0x3e, 0x27, 0xe0, 0xf6, - 0x10, 0x7c, 0x5a, 0xd0, 0x1d, 0xae, 0xd3, 0xc5, 0xc2, 0x1b, 0x1b, 0x5e, 0x20, 0xb8, 0x60, 0xf7, - 0x45, 0x9d, 0xd7, 0x65, 0xb4, 0xf3, 0x77, 0x38, 0x8e, 0x7d, 0xe8, 0x09, 0x41, 0xed, 0xa1, 0x0f, - 0x81, 0xc0, 0xff, 0xa3, 0x5a, 0xda, 0x8d, 0x43, 0x05, 0x6d, 0x6a, 0xbb, 0xda, 0x5e, 0xfd, 0xe0, - 0x27, 0x92, 0xaf, 0x65, 0x01, 0x27, 0xd1, 0xc8, 0x4d, 0x1d, 0x9c, 0xa4, 0xd1, 0x64, 0xd2, 0x25, - 0x7f, 0x0c, 0x2e, 0xc1, 0x16, 0x7d, 0x10, 0xd4, 0xc4, 0xd3, 0x59, 0xbb, 0x94, 0xcc, 0xda, 0x28, - 0xf7, 0x59, 0x0b, 0x2a, 0x3e, 0x47, 0x55, 0x1e, 0x81, 0xdd, 0x2c, 0x4b, 0x7a, 0x97, 0x7c, 0x62, - 0xe9, 0xe4, 0x7e, 0x79, 0xe7, 0x11, 0xd8, 0xe6, 0x17, 0x0a, 0x5f, 0x4d, 0x2d, 0x4b, 0xc2, 0xf0, - 0xbf, 0x68, 0x93, 0x0b, 0x2a, 0x62, 0xde, 0xac, 0x48, 0xec, 0xe1, 0xe3, 0xb0, 0x52, 0x6a, 0x7e, - 0xa5, 0xc0, 0x9b, 0x99, 0x6d, 0x29, 0x64, 0x67, 0xaa, 0xa1, 0xc6, 0x7d, 0xc9, 0xa9, 0xc7, 0x05, - 0xfe, 0xaf, 0x30, 0x2c, 0xf2, 0xb0, 0x61, 0xa5, 0x6a, 0x39, 0xaa, 0x1d, 0x95, 0xb2, 0x36, 0xf7, - 0x2c, 0x0d, 0xca, 0x42, 0x1b, 0x9e, 0x00, 0x9f, 0x37, 0xcb, 0xbb, 0x95, 0xbd, 0xfa, 0xc1, 0xfe, - 0xa3, 0x5a, 0x32, 0xbf, 0x54, 0xe4, 0x8d, 0xdf, 0x52, 0x86, 0x95, 0xa1, 0x3a, 0x17, 0xe8, 0x9b, - 0x42, 0xf3, 0x61, 0xcc, 0x6c, 0xc0, 0xa7, 0xa8, 0x11, 0x01, 0xe3, 0x1e, 0x17, 0x10, 0x88, 0x2c, - 0xe6, 0x8c, 0xfa, 0x20, 0xfb, 0xda, 0x36, 0x9b, 0xc9, 0xac, 0xdd, 0xf8, 0x73, 0xc5, 0xb9, 0xb5, - 0x52, 0xd5, 0x79, 0xb3, 0x62, 0x64, 0xe9, 0xba, 0xf0, 0x8f, 0xa8, 0x46, 0xa5, 0x07, 0x98, 0x42, - 0x2f, 0x46, 0xd0, 0x53, 0x7e, 0x6b, 0x11, 0x21, 0xd7, 0x2a, 0xcb, 0x53, 0xb7, 0xe5, 0x91, 0x6b, - 0x95, 0xd2, 0xa5, 0xb5, 0x4a, 0xdb, 0x52, 0xc8, 0xb4, 0x94, 0x20, 0x74, 0xb2, 0x2e, 0x2b, 0x77, - 0x4b, 0x39, 0x53, 0x7e, 0x6b, 0x11, 0xd1, 0xf9, 0x50, 0x59, 0x31, 0x3a, 0x79, 0x3f, 0x96, 0x7a, - 0x72, 0x64, 0x4f, 0xb5, 0x42, 0x4f, 0xce, 0xa2, 0x27, 0x07, 0xbf, 0xd2, 0x10, 0xa6, 0x0b, 0x44, - 0x7f, 0x7e, 0x7f, 0xb2, 0x25, 0xff, 0xfe, 0x84, 0x7b, 0x4b, 0x7a, 0x05, 0xda, 0x49, 0x20, 0xd8, - 0x95, 0xd9, 0x52, 0x55, 0xe0, 0x62, 0x80, 0xb5, 0xa2, 0x04, 0x7c, 0x89, 0xea, 0x99, 0xf7, 0x84, - 0xb1, 0x90, 0xa9, 0x97, 0xb4, 0xf7, 0x80, 0x8a, 0x64, 0xbc, 0xa9, 0x27, 0xb3, 0x76, 0xbd, 0x97, - 0x03, 0xde, 0xcf, 0xda, 0xf5, 0xa5, 0x73, 0x6b, 0x19, 0x9e, 0xe6, 0x72, 0x20, 0xcf, 0x55, 0x7d, - 0x4a, 0xae, 0x63, 0x58, 0x9f, 0x6b, 0x09, 0xde, 0x3a, 0x41, 0xdf, 0xae, 0x19, 0x11, 0xde, 0x41, - 0x95, 0x11, 0x5c, 0x65, 0x37, 0xd1, 0x4a, 0x3f, 0x71, 0x03, 0x6d, 0x4c, 0xe8, 0x38, 0xce, 0x6e, - 0xdc, 0xb6, 0x95, 0x19, 0xbf, 0x96, 0x8f, 0xb4, 0xce, 0x0b, 0x0d, 0x2d, 0xe7, 0xc0, 0xa7, 0xa8, - 0x9a, 0xfe, 0x93, 0xd5, 0xcb, 0xff, 0xe1, 0x61, 0x2f, 0xff, 0x2f, 0xcf, 0x87, 0xfc, 0x0f, 0x96, - 0x5a, 0x96, 0xa4, 0xe0, 0xef, 0xd1, 0x96, 0x0f, 0x9c, 0x53, 0x57, 0x65, 0x36, 0xbf, 0x56, 0x41, - 0x5b, 0xfd, 0xcc, 0x6d, 0xcd, 0xcf, 0x4d, 0x32, 0xbd, 0xd5, 0x4b, 0xd7, 0xb7, 0x7a, 0xe9, 0xe6, - 0x56, 0x2f, 0x3d, 0x4f, 0x74, 0x6d, 0x9a, 0xe8, 0xda, 0x75, 0xa2, 0x6b, 0x37, 0x89, 0xae, 0xbd, - 0x4d, 0x74, 0xed, 0xe5, 0x3b, 0xbd, 0xf4, 0x4f, 0x6d, 0x3e, 0xb8, 0x8f, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x68, 0x82, 0x7b, 0x73, 0x9e, 0x07, 0x00, 0x00, + // 704 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4d, 0x6f, 0xd3, 0x4c, + 0x10, 0xc7, 0xe3, 0x24, 0x6d, 0xd3, 0xcd, 0xf3, 0x52, 0xad, 0xa2, 0xe7, 0x89, 0x82, 0xe4, 0x54, + 0x39, 0x15, 0x44, 0xd7, 0xa4, 0x20, 0x54, 0x71, 0x8b, 0xd5, 0x1e, 0x10, 0x6d, 0x41, 0x5b, 0xc4, + 0x01, 0x38, 0xb0, 0xb1, 0xa7, 0x8e, 0x9b, 0xfa, 0x45, 0xbb, 0xeb, 0x48, 0xbd, 0x71, 0xe2, 0xcc, + 0x8d, 0x6f, 0xc0, 0x67, 0xc9, 0x8d, 0x1e, 0x7b, 0x8a, 0xa8, 0xf9, 0x16, 0x5c, 0x40, 0x5e, 0x6f, + 0x5e, 0x68, 0x52, 0x68, 0x7b, 0xf3, 0xcc, 0xce, 0xfc, 0x66, 0xe6, 0xbf, 0xb3, 0x46, 0x3b, 0xfd, + 0x6d, 0x41, 0xfc, 0xc8, 0xea, 0x27, 0x5d, 0xe0, 0x21, 0x48, 0x10, 0xd6, 0x00, 0x42, 0x37, 0xe2, + 0x96, 0x3e, 0x60, 0xb1, 0x6f, 0x09, 0x19, 0x71, 0xe6, 0x81, 0x35, 0x68, 0xb3, 0x93, 0xb8, 0xc7, + 0xda, 0x96, 0x07, 0x21, 0x70, 0x26, 0xc1, 0x25, 0x31, 0x8f, 0x64, 0x84, 0xef, 0xe4, 0xc1, 0x84, + 0xc5, 0x3e, 0xd1, 0xc1, 0x64, 0x1c, 0xdc, 0xd8, 0xf4, 0x7c, 0xd9, 0x4b, 0xba, 0xc4, 0x89, 0x02, + 0xcb, 0x8b, 0xbc, 0xc8, 0x52, 0x39, 0xdd, 0xe4, 0x48, 0x59, 0xca, 0x50, 0x5f, 0x39, 0xab, 0xf1, + 0x68, 0x5a, 0x38, 0x60, 0x4e, 0xcf, 0x0f, 0x81, 0x9f, 0x5a, 0x71, 0xdf, 0xcb, 0x1c, 0xc2, 0x0a, + 0x40, 0x32, 0x6b, 0x30, 0xd7, 0x41, 0xc3, 0xba, 0x2a, 0x8b, 0x27, 0xa1, 0xf4, 0x03, 0x98, 0x4b, + 0x78, 0xfc, 0xa7, 0x04, 0xe1, 0xf4, 0x20, 0x60, 0x97, 0xf3, 0x5a, 0x9f, 0x8b, 0x68, 0xed, 0x55, + 0x74, 0x92, 0x04, 0xd0, 0x91, 0x92, 0x39, 0xbd, 0x00, 0x42, 0x89, 0xdf, 0xa1, 0x4a, 0xd6, 0x98, + 0xcb, 0x24, 0xab, 0x1b, 0xeb, 0xc6, 0x46, 0x75, 0xeb, 0x01, 0x99, 0x4a, 0x32, 0xe1, 0x93, 0xb8, + 0xef, 0x65, 0x0e, 0x41, 0xb2, 0x68, 0x32, 0x68, 0x93, 0xe7, 0xdd, 0x63, 0x70, 0xe4, 0x3e, 0x48, + 0x66, 0xe3, 0xe1, 0xa8, 0x59, 0x48, 0x47, 0x4d, 0x34, 0xf5, 0xd1, 0x09, 0x15, 0x1f, 0xa2, 0xb2, + 0x88, 0xc1, 0xa9, 0x17, 0x15, 0xbd, 0x4d, 0x7e, 0x23, 0x38, 0xb9, 0xdc, 0xde, 0x61, 0x0c, 0x8e, + 0xfd, 0x97, 0xc6, 0x97, 0x33, 0x8b, 0x2a, 0x18, 0x7e, 0x83, 0x96, 0x85, 0x64, 0x32, 0x11, 0xf5, + 0x92, 0xc2, 0x3e, 0xbc, 0x19, 0x56, 0xa5, 0xda, 0xff, 0x68, 0xf0, 0x72, 0x6e, 0x53, 0x8d, 0x6c, + 0x0d, 0x0d, 0x54, 0xbb, 0x9c, 0xb2, 0xe7, 0x0b, 0x89, 0xdf, 0xce, 0x89, 0x45, 0xae, 0x27, 0x56, + 0x96, 0xad, 0xa4, 0x5a, 0xd3, 0x25, 0x2b, 0x63, 0xcf, 0x8c, 0x50, 0x14, 0x2d, 0xf9, 0x12, 0x02, + 0x51, 0x2f, 0xae, 0x97, 0x36, 0xaa, 0x5b, 0x9b, 0x37, 0x1a, 0xc9, 0xfe, 0x5b, 0x93, 0x97, 0x9e, + 0x66, 0x0c, 0x9a, 0xa3, 0x5a, 0x47, 0xe8, 0xbf, 0xb9, 0xe1, 0xa3, 0x84, 0x3b, 0x80, 0xf7, 0x50, + 0x2d, 0x06, 0x2e, 0x7c, 0x21, 0x21, 0x94, 0x79, 0xcc, 0x01, 0x0b, 0x40, 0xcd, 0xb5, 0x6a, 0xd7, + 0xd3, 0x51, 0xb3, 0xf6, 0x62, 0xc1, 0x39, 0x5d, 0x98, 0xd5, 0xfa, 0xb2, 0x40, 0xb2, 0xec, 0xba, + 0xf0, 0x7d, 0x54, 0x61, 0xca, 0x03, 0x5c, 0xa3, 0x27, 0x12, 0x74, 0xb4, 0x9f, 0x4e, 0x22, 0xd4, + 0xb5, 0xaa, 0xf6, 0xf4, 0xb6, 0xdc, 0xf0, 0x5a, 0x55, 0xea, 0xcc, 0xb5, 0x2a, 0x9b, 0x6a, 0x64, + 0xd6, 0x4a, 0x18, 0xb9, 0xf9, 0x94, 0xa5, 0x5f, 0x5b, 0x39, 0xd0, 0x7e, 0x3a, 0x89, 0x68, 0xfd, + 0x28, 0x2d, 0x90, 0x4e, 0xed, 0xc7, 0xcc, 0x4c, 0xae, 0x9a, 0xa9, 0x32, 0x37, 0x93, 0x3b, 0x99, + 0xc9, 0xc5, 0x9f, 0x0c, 0x84, 0xd9, 0x04, 0xb1, 0x3f, 0xde, 0x9f, 0xfc, 0x92, 0x9f, 0xdd, 0x62, + 0x6f, 0x49, 0x67, 0x8e, 0xb6, 0x1b, 0x4a, 0x7e, 0x6a, 0x37, 0x74, 0x17, 0x78, 0x3e, 0x80, 0x2e, + 0x68, 0x01, 0x1f, 0xa3, 0x6a, 0xee, 0xdd, 0xe5, 0x3c, 0xe2, 0xfa, 0x25, 0x6d, 0x5c, 0xa3, 0x23, + 0x15, 0x6f, 0x9b, 0xe9, 0xa8, 0x59, 0xed, 0x4c, 0x01, 0xdf, 0x47, 0xcd, 0xea, 0xcc, 0x39, 0x9d, + 0x85, 0x67, 0xb5, 0x5c, 0x98, 0xd6, 0x2a, 0xdf, 0xa6, 0xd6, 0x0e, 0x5c, 0x5d, 0x6b, 0x06, 0xde, + 0xd8, 0x45, 0xff, 0x5f, 0x21, 0x11, 0x5e, 0x43, 0xa5, 0x3e, 0x9c, 0xe6, 0x9b, 0x48, 0xb3, 0x4f, + 0x5c, 0x43, 0x4b, 0x03, 0x76, 0x92, 0xe4, 0x1b, 0xb7, 0x4a, 0x73, 0xe3, 0x49, 0x71, 0xdb, 0x68, + 0x7d, 0x30, 0xd0, 0x6c, 0x0d, 0xbc, 0x87, 0xca, 0xd9, 0xef, 0x55, 0xbf, 0xfc, 0x7b, 0xd7, 0x7b, + 0xf9, 0x2f, 0xfd, 0x00, 0xa6, 0x7f, 0xb0, 0xcc, 0xa2, 0x8a, 0x82, 0xef, 0xa2, 0x95, 0x00, 0x84, + 0x60, 0x9e, 0xae, 0x6c, 0xff, 0xab, 0x83, 0x56, 0xf6, 0x73, 0x37, 0x1d, 0x9f, 0xdb, 0x64, 0x78, + 0x61, 0x16, 0xce, 0x2e, 0xcc, 0xc2, 0xf9, 0x85, 0x59, 0x78, 0x9f, 0x9a, 0xc6, 0x30, 0x35, 0x8d, + 0xb3, 0xd4, 0x34, 0xce, 0x53, 0xd3, 0xf8, 0x9a, 0x9a, 0xc6, 0xc7, 0x6f, 0x66, 0xe1, 0x75, 0x65, + 0x2c, 0xdc, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x42, 0xba, 0xdb, 0x12, 0x1a, 0x07, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/storage/v1alpha1/generated.proto b/vendor/k8s.io/api/storage/v1alpha1/generated.proto index 2f792a06..ccb94754 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/storage/v1alpha1/generated.proto @@ -21,11 +21,9 @@ syntax = 'proto2'; package k8s.io.api.storage.v1alpha1; -import "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; diff --git a/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go index d1a53755..e27c6ff3 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go @@ -90,12 +90,8 @@ func (in *VolumeAttachmentSource) DeepCopyInto(out *VolumeAttachmentSource) { *out = *in if in.PersistentVolumeName != nil { in, out := &in.PersistentVolumeName, &out.PersistentVolumeName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -139,21 +135,13 @@ func (in *VolumeAttachmentStatus) DeepCopyInto(out *VolumeAttachmentStatus) { } if in.AttachError != nil { in, out := &in.AttachError, &out.AttachError - if *in == nil { - *out = nil - } else { - *out = new(VolumeError) - (*in).DeepCopyInto(*out) - } + *out = new(VolumeError) + (*in).DeepCopyInto(*out) } if in.DetachError != nil { in, out := &in.DetachError, &out.DetachError - if *in == nil { - *out = nil - } else { - *out = new(VolumeError) - (*in).DeepCopyInto(*out) - } + *out = new(VolumeError) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/api/storage/v1beta1/BUILD b/vendor/k8s.io/api/storage/v1beta1/BUILD index e659e9de..f0669b64 100644 --- a/vendor/k8s.io/api/storage/v1beta1/BUILD +++ b/vendor/k8s.io/api/storage/v1beta1/BUILD @@ -10,24 +10,19 @@ go_library( "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1beta1", importpath = "k8s.io/api/storage/v1beta1", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go index 05870259..fed8c7a6 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go @@ -2195,69 +2195,67 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1022 bytes of a gzipped FileDescriptorProto + // 988 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4d, 0x6f, 0x1b, 0x45, - 0x18, 0xce, 0xc6, 0xf9, 0x70, 0xc6, 0x09, 0x4d, 0x96, 0x08, 0x8c, 0x0f, 0x76, 0xe4, 0x0b, 0xa6, - 0x6a, 0x76, 0x9b, 0x50, 0x50, 0x84, 0xc4, 0xc1, 0x5b, 0x72, 0x00, 0xc5, 0x6d, 0x98, 0x44, 0x15, - 0xaa, 0x38, 0x30, 0xd9, 0x7d, 0xeb, 0x0c, 0xde, 0xdd, 0x59, 0x66, 0xc6, 0xa6, 0xb9, 0x71, 0xe2, - 0x8c, 0x38, 0xf0, 0x0b, 0xf8, 0x1f, 0x1c, 0xc9, 0x09, 0xf5, 0xd8, 0x93, 0x45, 0xcc, 0xbf, 0x88, - 0x38, 0xa0, 0x99, 0x9d, 0x78, 0xd7, 0x5e, 0x9b, 0x36, 0x3d, 0xf4, 0xe6, 0xf7, 0xe3, 0x79, 0xde, - 0xef, 0x59, 0xa3, 0x87, 0xbd, 0x03, 0xe1, 0x50, 0xe6, 0xf6, 0xfa, 0x67, 0xc0, 0x63, 0x90, 0x20, - 0xdc, 0x01, 0xc4, 0x01, 0xe3, 0xae, 0x31, 0x90, 0x84, 0xba, 0x42, 0x32, 0x4e, 0xba, 0xe0, 0x0e, - 0xf6, 0xce, 0x40, 0x92, 0x3d, 0xb7, 0x0b, 0x31, 0x70, 0x22, 0x21, 0x70, 0x12, 0xce, 0x24, 0xb3, - 0x6b, 0xa9, 0xaf, 0x43, 0x12, 0xea, 0x18, 0x5f, 0xc7, 0xf8, 0xd6, 0x76, 0xbb, 0x54, 0x9e, 0xf7, - 0xcf, 0x1c, 0x9f, 0x45, 0x6e, 0x97, 0x75, 0x99, 0xab, 0x21, 0x67, 0xfd, 0x67, 0x5a, 0xd2, 0x82, - 0xfe, 0x95, 0x52, 0xd5, 0x9a, 0xb9, 0xb0, 0x3e, 0xe3, 0x2a, 0xe6, 0x74, 0xb8, 0x5a, 0x27, 0xf3, - 0x81, 0xe7, 0x12, 0x62, 0x41, 0x59, 0x2c, 0x76, 0x49, 0x42, 0x05, 0xf0, 0x01, 0x70, 0x37, 0xe9, - 0x75, 0x95, 0x4d, 0x4c, 0x3a, 0xcc, 0xcb, 0xbe, 0xf6, 0x20, 0xa3, 0x8b, 0x88, 0x7f, 0x4e, 0x63, - 0xe0, 0x17, 0x19, 0x47, 0x04, 0x92, 0xcc, 0x4a, 0xc2, 0x9d, 0x87, 0xe2, 0xfd, 0x58, 0xd2, 0x08, - 0x0a, 0x80, 0x4f, 0x5f, 0x05, 0x10, 0xfe, 0x39, 0x44, 0xa4, 0x80, 0xfb, 0x78, 0x1e, 0xae, 0x2f, - 0x69, 0xe8, 0xd2, 0x58, 0x0a, 0xc9, 0xa7, 0x41, 0xcd, 0x5f, 0x57, 0xd0, 0xfa, 0x49, 0x3a, 0x89, - 0x87, 0x21, 0x11, 0xc2, 0xfe, 0x0e, 0x95, 0x55, 0x25, 0x01, 0x91, 0xa4, 0x6a, 0xed, 0x58, 0xad, - 0xca, 0xfe, 0x7d, 0x27, 0x9b, 0xda, 0x98, 0xd8, 0x49, 0x7a, 0x5d, 0xa5, 0x10, 0x8e, 0xf2, 0x76, - 0x06, 0x7b, 0xce, 0xe3, 0xb3, 0xef, 0xc1, 0x97, 0x1d, 0x90, 0xc4, 0xb3, 0x2f, 0x87, 0x8d, 0x85, - 0xd1, 0xb0, 0x81, 0x32, 0x1d, 0x1e, 0xb3, 0xda, 0x9f, 0xa0, 0x4a, 0xc2, 0xd9, 0x80, 0xaa, 0x66, - 0x03, 0xaf, 0x2e, 0xee, 0x58, 0xad, 0x35, 0xef, 0x5d, 0x03, 0xa9, 0x1c, 0x67, 0x26, 0x9c, 0xf7, - 0xb3, 0x43, 0x84, 0x12, 0xc2, 0x49, 0x04, 0x12, 0xb8, 0xa8, 0x96, 0x76, 0x4a, 0xad, 0xca, 0xfe, - 0x81, 0x33, 0x7f, 0xa1, 0x9c, 0x7c, 0x59, 0xce, 0xf1, 0x18, 0x7a, 0x18, 0x4b, 0x7e, 0x91, 0xa5, - 0x98, 0x19, 0x70, 0x8e, 0xdf, 0xee, 0xa1, 0x0d, 0x0e, 0x7e, 0x48, 0x68, 0x74, 0xcc, 0x42, 0xea, - 0x5f, 0x54, 0x97, 0x74, 0x9a, 0x87, 0xa3, 0x61, 0x63, 0x03, 0xe7, 0x0d, 0xd7, 0xc3, 0xc6, 0xfd, - 0xe2, 0x2a, 0x3a, 0xc7, 0xc0, 0x05, 0x15, 0x12, 0x62, 0xf9, 0x84, 0x85, 0xfd, 0x08, 0x26, 0x30, - 0x78, 0x92, 0xdb, 0x7e, 0x80, 0xd6, 0x23, 0xd6, 0x8f, 0xe5, 0xe3, 0x44, 0xaa, 0x05, 0xac, 0x2e, - 0xef, 0x94, 0x5a, 0x6b, 0xde, 0xe6, 0x68, 0xd8, 0x58, 0xef, 0xe4, 0xf4, 0x78, 0xc2, 0xcb, 0x3e, - 0x42, 0xdb, 0x24, 0x0c, 0xd9, 0x8f, 0x69, 0x80, 0xc3, 0xe7, 0x09, 0xd1, 0xfb, 0x5b, 0x5d, 0xd9, - 0xb1, 0x5a, 0x65, 0xaf, 0x3a, 0x1a, 0x36, 0xb6, 0xdb, 0x33, 0xec, 0x78, 0x26, 0xca, 0xfe, 0x06, - 0x6d, 0x0d, 0xb4, 0xca, 0xa3, 0x71, 0x40, 0xe3, 0x6e, 0x87, 0x05, 0x50, 0x5d, 0xd5, 0x45, 0xdf, - 0x1d, 0x0d, 0x1b, 0x5b, 0x4f, 0xa6, 0x8d, 0xd7, 0xb3, 0x94, 0xb8, 0x48, 0x62, 0xff, 0x80, 0xb6, - 0x74, 0x44, 0x08, 0x4e, 0x59, 0xc2, 0x42, 0xd6, 0xa5, 0x20, 0xaa, 0x65, 0x3d, 0xbf, 0x56, 0x7e, - 0x7e, 0xaa, 0x75, 0x6a, 0x91, 0x8c, 0xd7, 0xc5, 0x09, 0x84, 0xe0, 0x4b, 0xc6, 0x4f, 0x81, 0x47, - 0xde, 0x07, 0x66, 0x5e, 0x5b, 0xed, 0x69, 0x2a, 0x5c, 0x64, 0xaf, 0x7d, 0x8e, 0xee, 0x4c, 0x0d, - 0xdc, 0xde, 0x44, 0xa5, 0x1e, 0x5c, 0xe8, 0x95, 0x5e, 0xc3, 0xea, 0xa7, 0xbd, 0x8d, 0x96, 0x07, - 0x24, 0xec, 0x43, 0xba, 0x81, 0x38, 0x15, 0x3e, 0x5b, 0x3c, 0xb0, 0x9a, 0x7f, 0x58, 0x68, 0x33, - 0xbf, 0x3d, 0x47, 0x54, 0x48, 0xfb, 0xdb, 0xc2, 0x61, 0x38, 0xaf, 0x77, 0x18, 0x0a, 0xad, 0xcf, - 0x62, 0xd3, 0xd4, 0x50, 0xbe, 0xd1, 0xe4, 0x8e, 0xa2, 0x83, 0x96, 0xa9, 0x84, 0x48, 0x54, 0x17, - 0x8b, 0x8d, 0xf9, 0xbf, 0xc5, 0xf6, 0x36, 0x0c, 0xe9, 0xf2, 0x97, 0x0a, 0x8e, 0x53, 0x96, 0xe6, - 0xef, 0x8b, 0x68, 0x33, 0x1d, 0x4e, 0x5b, 0x4a, 0xe2, 0x9f, 0x47, 0x10, 0xcb, 0xb7, 0x70, 0xda, - 0x18, 0x2d, 0x89, 0x04, 0x7c, 0xdd, 0xd1, 0x49, 0xf6, 0x42, 0x11, 0xd3, 0xd9, 0x9d, 0x24, 0xe0, - 0x7b, 0xeb, 0x86, 0x7d, 0x49, 0x49, 0x58, 0x73, 0xd9, 0x4f, 0xd1, 0x8a, 0x90, 0x44, 0xf6, 0xd5, - 0xcd, 0x2b, 0xd6, 0xfd, 0x5b, 0xb1, 0x6a, 0xa4, 0xf7, 0x8e, 0xe1, 0x5d, 0x49, 0x65, 0x6c, 0x18, - 0x9b, 0x7f, 0x5a, 0x68, 0x7b, 0x1a, 0xf2, 0x16, 0x86, 0xfd, 0xf5, 0xe4, 0xb0, 0xef, 0xdd, 0xa6, - 0xa2, 0x39, 0x03, 0x7f, 0x86, 0xde, 0x2b, 0xd4, 0xce, 0xfa, 0xdc, 0x07, 0xf5, 0x4c, 0x24, 0x53, - 0x8f, 0xd1, 0x23, 0x12, 0x41, 0x7a, 0x09, 0xe9, 0x33, 0x71, 0x3c, 0xc3, 0x8e, 0x67, 0xa2, 0x9a, - 0x7f, 0xcd, 0xe8, 0x98, 0x1a, 0x96, 0x7d, 0x0f, 0x95, 0x89, 0xd6, 0x00, 0x37, 0xd4, 0xe3, 0x0e, - 0xb4, 0x8d, 0x1e, 0x8f, 0x3d, 0xf4, 0x50, 0x75, 0x7a, 0x66, 0x55, 0x6e, 0x37, 0x54, 0x8d, 0xcc, - 0x0d, 0x55, 0xcb, 0xd8, 0x30, 0xaa, 0x4c, 0x62, 0x16, 0xa4, 0x45, 0x96, 0x26, 0x33, 0x79, 0x64, - 0xf4, 0x78, 0xec, 0xd1, 0xfc, 0xb7, 0x34, 0xa3, 0x73, 0x7a, 0x3b, 0x72, 0x25, 0x05, 0xba, 0xa4, - 0x72, 0xa1, 0xa4, 0x60, 0x5c, 0x52, 0x60, 0xff, 0x66, 0x21, 0x9b, 0x8c, 0x29, 0x3a, 0x37, 0xdb, - 0x93, 0x8e, 0xf8, 0xab, 0xdb, 0x2f, 0xad, 0xd3, 0x2e, 0x90, 0xa5, 0x9f, 0xae, 0x9a, 0x49, 0xc2, - 0x2e, 0x3a, 0xe0, 0x19, 0x19, 0xd8, 0x14, 0x55, 0x52, 0xed, 0x21, 0xe7, 0x8c, 0x9b, 0x2b, 0xfa, - 0xf0, 0xd5, 0x09, 0x69, 0x77, 0xaf, 0xae, 0x3e, 0xca, 0xed, 0x0c, 0x7f, 0x3d, 0x6c, 0x54, 0x72, - 0x76, 0x9c, 0xe7, 0x56, 0xa1, 0x02, 0xc8, 0x42, 0x2d, 0xbd, 0x41, 0xa8, 0x2f, 0x60, 0x7e, 0xa8, - 0x1c, 0x77, 0xed, 0x10, 0xbd, 0x3f, 0xa7, 0x41, 0xb7, 0x7a, 0xea, 0x7f, 0xb6, 0x50, 0x3e, 0x86, - 0x7d, 0x84, 0x96, 0xd4, 0x7f, 0x2c, 0x73, 0xf4, 0x77, 0x5f, 0xef, 0xe8, 0x4f, 0x69, 0x04, 0xd9, - 0xdb, 0xa5, 0x24, 0xac, 0x59, 0xec, 0x8f, 0xd0, 0x6a, 0x04, 0x42, 0x90, 0xae, 0x89, 0xec, 0xdd, - 0x31, 0x4e, 0xab, 0x9d, 0x54, 0x8d, 0x6f, 0xec, 0xde, 0xee, 0xe5, 0x55, 0x7d, 0xe1, 0xc5, 0x55, - 0x7d, 0xe1, 0xe5, 0x55, 0x7d, 0xe1, 0xa7, 0x51, 0xdd, 0xba, 0x1c, 0xd5, 0xad, 0x17, 0xa3, 0xba, - 0xf5, 0x72, 0x54, 0xb7, 0xfe, 0x1e, 0xd5, 0xad, 0x5f, 0xfe, 0xa9, 0x2f, 0x3c, 0x5d, 0x35, 0x7d, - 0xfb, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd8, 0xa9, 0x81, 0xd5, 0x8f, 0x0b, 0x00, 0x00, + 0x18, 0xce, 0xc6, 0xf9, 0x70, 0xc6, 0x09, 0x4d, 0x86, 0x08, 0x8c, 0x0f, 0x76, 0xe4, 0x0b, 0xa6, + 0x6a, 0x77, 0x9b, 0xa8, 0xa0, 0x08, 0x89, 0x83, 0xb7, 0xe4, 0x00, 0x8a, 0xdb, 0x30, 0x89, 0x2a, + 0x54, 0x71, 0x60, 0xb2, 0xfb, 0x76, 0xb3, 0x78, 0x77, 0x67, 0x99, 0x19, 0x1b, 0x72, 0xe3, 0xc4, + 0x19, 0x71, 0xe0, 0x17, 0xf0, 0x3f, 0x38, 0x92, 0x13, 0xea, 0xb1, 0x27, 0x8b, 0x2c, 0xff, 0x22, + 0xe2, 0x80, 0x66, 0x76, 0x62, 0xaf, 0xbd, 0x0e, 0x6d, 0x7a, 0xe8, 0xcd, 0xef, 0xc7, 0xf3, 0xbc, + 0xdf, 0xb3, 0x46, 0x8f, 0xfa, 0xfb, 0xc2, 0x0e, 0x99, 0xd3, 0x1f, 0x9c, 0x02, 0x4f, 0x40, 0x82, + 0x70, 0x86, 0x90, 0xf8, 0x8c, 0x3b, 0xc6, 0x40, 0xd3, 0xd0, 0x11, 0x92, 0x71, 0x1a, 0x80, 0x33, + 0xdc, 0x3d, 0x05, 0x49, 0x77, 0x9d, 0x00, 0x12, 0xe0, 0x54, 0x82, 0x6f, 0xa7, 0x9c, 0x49, 0x86, + 0x1b, 0xb9, 0xaf, 0x4d, 0xd3, 0xd0, 0x36, 0xbe, 0xb6, 0xf1, 0x6d, 0xdc, 0x0f, 0x42, 0x79, 0x36, + 0x38, 0xb5, 0x3d, 0x16, 0x3b, 0x01, 0x0b, 0x98, 0xa3, 0x21, 0xa7, 0x83, 0xe7, 0x5a, 0xd2, 0x82, + 0xfe, 0x95, 0x53, 0x35, 0xda, 0x85, 0xb0, 0x1e, 0xe3, 0x2a, 0xe6, 0x6c, 0xb8, 0xc6, 0xc3, 0x89, + 0x4f, 0x4c, 0xbd, 0xb3, 0x30, 0x01, 0x7e, 0xee, 0xa4, 0xfd, 0x40, 0x29, 0x84, 0x13, 0x83, 0xa4, + 0xf3, 0x50, 0xce, 0x4d, 0x28, 0x3e, 0x48, 0x64, 0x18, 0x43, 0x09, 0xf0, 0xc9, 0xab, 0x00, 0xc2, + 0x3b, 0x83, 0x98, 0xce, 0xe2, 0xda, 0xbf, 0xae, 0xa0, 0xf5, 0xe3, 0xbc, 0x0b, 0x8f, 0x22, 0x2a, + 0x04, 0xfe, 0x16, 0x55, 0x55, 0x52, 0x3e, 0x95, 0xb4, 0x6e, 0xed, 0x58, 0x9d, 0xda, 0xde, 0x03, + 0x7b, 0xd2, 0xb1, 0x31, 0xb7, 0x9d, 0xf6, 0x03, 0xa5, 0x10, 0xb6, 0xf2, 0xb6, 0x87, 0xbb, 0xf6, + 0x93, 0xd3, 0xef, 0xc0, 0x93, 0x3d, 0x90, 0xd4, 0xc5, 0x17, 0xa3, 0xd6, 0x42, 0x36, 0x6a, 0xa1, + 0x89, 0x8e, 0x8c, 0x59, 0xf1, 0xc7, 0xa8, 0x96, 0x72, 0x36, 0x0c, 0x45, 0xc8, 0x12, 0xe0, 0xf5, + 0xc5, 0x1d, 0xab, 0xb3, 0xe6, 0xbe, 0x6b, 0x20, 0xb5, 0xa3, 0x89, 0x89, 0x14, 0xfd, 0x70, 0x84, + 0x50, 0x4a, 0x39, 0x8d, 0x41, 0x02, 0x17, 0xf5, 0xca, 0x4e, 0xa5, 0x53, 0xdb, 0xdb, 0xb7, 0x6f, + 0x1e, 0xa6, 0x5d, 0x2c, 0xcb, 0x3e, 0x1a, 0x43, 0x0f, 0x12, 0xc9, 0xcf, 0x27, 0x29, 0x4e, 0x0c, + 0xa4, 0xc0, 0x8f, 0xfb, 0x68, 0x83, 0x83, 0x17, 0xd1, 0x30, 0x3e, 0x62, 0x51, 0xe8, 0x9d, 0xd7, + 0x97, 0x74, 0x9a, 0x07, 0xd9, 0xa8, 0xb5, 0x41, 0x8a, 0x86, 0xab, 0x51, 0xeb, 0x41, 0x79, 0x0d, + 0xec, 0x23, 0xe0, 0x22, 0x14, 0x12, 0x12, 0xf9, 0x94, 0x45, 0x83, 0x18, 0xa6, 0x30, 0x64, 0x9a, + 0x1b, 0x3f, 0x44, 0xeb, 0x31, 0x1b, 0x24, 0xf2, 0x49, 0x2a, 0x43, 0x96, 0x88, 0xfa, 0xf2, 0x4e, + 0xa5, 0xb3, 0xe6, 0x6e, 0x66, 0xa3, 0xd6, 0x7a, 0xaf, 0xa0, 0x27, 0x53, 0x5e, 0xf8, 0x10, 0x6d, + 0xd3, 0x28, 0x62, 0x3f, 0xe4, 0x01, 0x0e, 0x7e, 0x4c, 0x69, 0xa2, 0x5a, 0x55, 0x5f, 0xd9, 0xb1, + 0x3a, 0x55, 0xb7, 0x9e, 0x8d, 0x5a, 0xdb, 0xdd, 0x39, 0x76, 0x32, 0x17, 0x85, 0xbf, 0x46, 0x5b, + 0x43, 0xad, 0x72, 0xc3, 0xc4, 0x0f, 0x93, 0xa0, 0xc7, 0x7c, 0xa8, 0xaf, 0xea, 0xa2, 0xef, 0x66, + 0xa3, 0xd6, 0xd6, 0xd3, 0x59, 0xe3, 0xd5, 0x3c, 0x25, 0x29, 0x93, 0xe0, 0xef, 0xd1, 0x96, 0x8e, + 0x08, 0xfe, 0x09, 0x4b, 0x59, 0xc4, 0x82, 0x10, 0x44, 0xbd, 0xaa, 0xe7, 0xd7, 0x29, 0xce, 0x4f, + 0xb5, 0x4e, 0x2d, 0x92, 0xf1, 0x3a, 0x3f, 0x86, 0x08, 0x3c, 0xc9, 0xf8, 0x09, 0xf0, 0xd8, 0xfd, + 0xc0, 0xcc, 0x6b, 0xab, 0x3b, 0x4b, 0x45, 0xca, 0xec, 0x8d, 0xcf, 0xd0, 0x9d, 0x99, 0x81, 0xe3, + 0x4d, 0x54, 0xe9, 0xc3, 0xb9, 0x5e, 0xe9, 0x35, 0xa2, 0x7e, 0xe2, 0x6d, 0xb4, 0x3c, 0xa4, 0xd1, + 0x00, 0xf2, 0x0d, 0x24, 0xb9, 0xf0, 0xe9, 0xe2, 0xbe, 0xd5, 0xfe, 0xc3, 0x42, 0x9b, 0xc5, 0xed, + 0x39, 0x0c, 0x85, 0xc4, 0xdf, 0x94, 0x0e, 0xc3, 0x7e, 0xbd, 0xc3, 0x50, 0x68, 0x7d, 0x16, 0x9b, + 0xa6, 0x86, 0xea, 0xb5, 0xa6, 0x70, 0x14, 0x3d, 0xb4, 0x1c, 0x4a, 0x88, 0x45, 0x7d, 0xb1, 0xdc, + 0x98, 0xff, 0x5b, 0x6c, 0x77, 0xc3, 0x90, 0x2e, 0x7f, 0xa1, 0xe0, 0x24, 0x67, 0x69, 0xff, 0xbe, + 0x88, 0x36, 0xf3, 0xe1, 0x74, 0xa5, 0xa4, 0xde, 0x59, 0x0c, 0x89, 0x7c, 0x0b, 0xa7, 0x4d, 0xd0, + 0x92, 0x48, 0xc1, 0xd3, 0x1d, 0x9d, 0x66, 0x2f, 0x15, 0x31, 0x9b, 0xdd, 0x71, 0x0a, 0x9e, 0xbb, + 0x6e, 0xd8, 0x97, 0x94, 0x44, 0x34, 0x17, 0x7e, 0x86, 0x56, 0x84, 0xa4, 0x72, 0xa0, 0x6e, 0x5e, + 0xb1, 0xee, 0xdd, 0x8a, 0x55, 0x23, 0xdd, 0x77, 0x0c, 0xef, 0x4a, 0x2e, 0x13, 0xc3, 0xd8, 0xfe, + 0xd3, 0x42, 0xdb, 0xb3, 0x90, 0xb7, 0x30, 0xec, 0xaf, 0xa6, 0x87, 0x7d, 0xef, 0x36, 0x15, 0xdd, + 0x30, 0xf0, 0xe7, 0xe8, 0xbd, 0x52, 0xed, 0x6c, 0xc0, 0x3d, 0x50, 0xcf, 0x44, 0x3a, 0xf3, 0x18, + 0x3d, 0xa6, 0x31, 0xe4, 0x97, 0x90, 0x3f, 0x13, 0x47, 0x73, 0xec, 0x64, 0x2e, 0xaa, 0xfd, 0xd7, + 0x9c, 0x8e, 0xa9, 0x61, 0xe1, 0x7b, 0xa8, 0x4a, 0xb5, 0x06, 0xb8, 0xa1, 0x1e, 0x77, 0xa0, 0x6b, + 0xf4, 0x64, 0xec, 0xa1, 0x87, 0xaa, 0xd3, 0x33, 0xab, 0x72, 0xbb, 0xa1, 0x6a, 0x64, 0x61, 0xa8, + 0x5a, 0x26, 0x86, 0x51, 0x65, 0x92, 0x30, 0x3f, 0x2f, 0xb2, 0x32, 0x9d, 0xc9, 0x63, 0xa3, 0x27, + 0x63, 0x8f, 0xf6, 0xbf, 0x95, 0x39, 0x9d, 0xd3, 0xdb, 0x51, 0x28, 0xc9, 0xd7, 0x25, 0x55, 0x4b, + 0x25, 0xf9, 0xe3, 0x92, 0x7c, 0xfc, 0x9b, 0x85, 0x30, 0x1d, 0x53, 0xf4, 0xae, 0xb7, 0x27, 0x1f, + 0xf1, 0x97, 0xb7, 0x5f, 0x5a, 0xbb, 0x5b, 0x22, 0xcb, 0x3f, 0x5d, 0x0d, 0x93, 0x04, 0x2e, 0x3b, + 0x90, 0x39, 0x19, 0xe0, 0x10, 0xd5, 0x72, 0xed, 0x01, 0xe7, 0x8c, 0x9b, 0x2b, 0xfa, 0xf0, 0xd5, + 0x09, 0x69, 0x77, 0xb7, 0xa9, 0x3e, 0xca, 0xdd, 0x09, 0xfe, 0x6a, 0xd4, 0xaa, 0x15, 0xec, 0xa4, + 0xc8, 0xad, 0x42, 0xf9, 0x30, 0x09, 0xb5, 0xf4, 0x06, 0xa1, 0x3e, 0x87, 0x9b, 0x43, 0x15, 0xb8, + 0x1b, 0x07, 0xe8, 0xfd, 0x1b, 0x1a, 0x74, 0xab, 0xa7, 0xfe, 0x67, 0x0b, 0x15, 0x63, 0xe0, 0x43, + 0xb4, 0xa4, 0xfe, 0x2e, 0x99, 0xa3, 0xbf, 0xfb, 0x7a, 0x47, 0x7f, 0x12, 0xc6, 0x30, 0x79, 0xbb, + 0x94, 0x44, 0x34, 0x0b, 0xfe, 0x08, 0xad, 0xc6, 0x20, 0x04, 0x0d, 0x4c, 0x64, 0xf7, 0x8e, 0x71, + 0x5a, 0xed, 0xe5, 0x6a, 0x72, 0x6d, 0x77, 0xef, 0x5f, 0x5c, 0x36, 0x17, 0x5e, 0x5c, 0x36, 0x17, + 0x5e, 0x5e, 0x36, 0x17, 0x7e, 0xca, 0x9a, 0xd6, 0x45, 0xd6, 0xb4, 0x5e, 0x64, 0x4d, 0xeb, 0x65, + 0xd6, 0xb4, 0xfe, 0xce, 0x9a, 0xd6, 0x2f, 0xff, 0x34, 0x17, 0x9e, 0xad, 0x9a, 0xbe, 0xfd, 0x17, + 0x00, 0x00, 0xff, 0xff, 0xb4, 0x63, 0x7e, 0xa7, 0x0b, 0x0b, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.proto b/vendor/k8s.io/api/storage/v1beta1/generated.proto index 32032b1a..ecf53bef 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.proto +++ b/vendor/k8s.io/api/storage/v1beta1/generated.proto @@ -22,11 +22,9 @@ syntax = 'proto2'; package k8s.io.api.storage.v1beta1; import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; @@ -67,16 +65,14 @@ message StorageClass { // VolumeBindingMode indicates how PersistentVolumeClaims should be // provisioned and bound. When unset, VolumeBindingImmediate is used. - // This field is alpha-level and is only honored by servers that enable - // the VolumeScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional optional string volumeBindingMode = 7; // Restrict the node topologies where volumes can be dynamically provisioned. // Each volume plugin defines its own supported topology specifications. // An empty TopologySelectorTerm list means there is no topology restriction. - // This field is alpha-level and is only honored by servers that enable - // the DynamicProvisioningScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional repeated k8s.io.api.core.v1.TopologySelectorTerm allowedTopologies = 8; } diff --git a/vendor/k8s.io/api/storage/v1beta1/types.go b/vendor/k8s.io/api/storage/v1beta1/types.go index 7ec1e908..5702c21b 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types.go +++ b/vendor/k8s.io/api/storage/v1beta1/types.go @@ -62,16 +62,14 @@ type StorageClass struct { // VolumeBindingMode indicates how PersistentVolumeClaims should be // provisioned and bound. When unset, VolumeBindingImmediate is used. - // This field is alpha-level and is only honored by servers that enable - // the VolumeScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional VolumeBindingMode *VolumeBindingMode `json:"volumeBindingMode,omitempty" protobuf:"bytes,7,opt,name=volumeBindingMode"` // Restrict the node topologies where volumes can be dynamically provisioned. // Each volume plugin defines its own supported topology specifications. // An empty TopologySelectorTerm list means there is no topology restriction. - // This field is alpha-level and is only honored by servers that enable - // the DynamicProvisioningScheduling feature. + // This field is only honored by servers that enable the VolumeScheduling feature. // +optional AllowedTopologies []v1.TopologySelectorTerm `json:"allowedTopologies,omitempty" protobuf:"bytes,8,rep,name=allowedTopologies"` } diff --git a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go index 423e7f27..044d69f5 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go @@ -35,8 +35,8 @@ var map_StorageClass = map[string]string{ "reclaimPolicy": "Dynamically provisioned PersistentVolumes of this storage class are created with this reclaimPolicy. Defaults to Delete.", "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", "allowVolumeExpansion": "AllowVolumeExpansion shows whether the storage class allow volume expand", - "volumeBindingMode": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is alpha-level and is only honored by servers that enable the VolumeScheduling feature.", - "allowedTopologies": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is alpha-level and is only honored by servers that enable the DynamicProvisioningScheduling feature.", + "volumeBindingMode": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is only honored by servers that enable the VolumeScheduling feature.", + "allowedTopologies": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is only honored by servers that enable the VolumeScheduling feature.", } func (StorageClass) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go index 7c7c8fde..8096dba9 100644 --- a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go @@ -39,12 +39,8 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { } if in.ReclaimPolicy != nil { in, out := &in.ReclaimPolicy, &out.ReclaimPolicy - if *in == nil { - *out = nil - } else { - *out = new(v1.PersistentVolumeReclaimPolicy) - **out = **in - } + *out = new(v1.PersistentVolumeReclaimPolicy) + **out = **in } if in.MountOptions != nil { in, out := &in.MountOptions, &out.MountOptions @@ -53,21 +49,13 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { } if in.AllowVolumeExpansion != nil { in, out := &in.AllowVolumeExpansion, &out.AllowVolumeExpansion - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.VolumeBindingMode != nil { in, out := &in.VolumeBindingMode, &out.VolumeBindingMode - if *in == nil { - *out = nil - } else { - *out = new(VolumeBindingMode) - **out = **in - } + *out = new(VolumeBindingMode) + **out = **in } if in.AllowedTopologies != nil { in, out := &in.AllowedTopologies, &out.AllowedTopologies @@ -196,12 +184,8 @@ func (in *VolumeAttachmentSource) DeepCopyInto(out *VolumeAttachmentSource) { *out = *in if in.PersistentVolumeName != nil { in, out := &in.PersistentVolumeName, &out.PersistentVolumeName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -245,21 +229,13 @@ func (in *VolumeAttachmentStatus) DeepCopyInto(out *VolumeAttachmentStatus) { } if in.AttachError != nil { in, out := &in.AttachError, &out.AttachError - if *in == nil { - *out = nil - } else { - *out = new(VolumeError) - (*in).DeepCopyInto(*out) - } + *out = new(VolumeError) + (*in).DeepCopyInto(*out) } if in.DetachError != nil { in, out := &in.DetachError, &out.DetachError - if *in == nil { - *out = nil - } else { - *out = new(VolumeError) - (*in).DeepCopyInto(*out) - } + *out = new(VolumeError) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/apiextensions-apiserver/BUILD b/vendor/k8s.io/apiextensions-apiserver/BUILD new file mode 100644 index 00000000..dee7cb34 --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/BUILD @@ -0,0 +1,58 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_binary", + "go_library", +) + +go_binary( + name = "apiextensions-apiserver", + embed = [":go_default_library"], +) + +go_library( + name = "go_default_library", + srcs = ["main.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver", + importpath = "k8s.io/apiextensions-apiserver", + deps = [ + "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/logs:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/establish:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/crdserverscheme:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/test/integration:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/vendor/k8s.io/apiextensions-apiserver/CONTRIBUTING.md b/vendor/k8s.io/apiextensions-apiserver/CONTRIBUTING.md new file mode 100644 index 00000000..d8ad4d2d --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing guidelines + +Do not open pull requests directly against this repository, they will be ignored. Instead, please open pull requests against [kubernetes/kubernetes](https://git.k8s.io/kubernetes/). Please follow the same [contributing guide](https://git.k8s.io/kubernetes/CONTRIBUTING.md) you would follow for any other pull request made to kubernetes/kubernetes. + +This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/apiextensions-apiserver](https://git.k8s.io/kubernetes/staging/src/k8s.io/apiextensions-apiserver) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot). + +Please see [Staging Directory and Publishing](https://git.k8s.io/community/contributors/devel/staging.md) for more information diff --git a/vendor/k8s.io/apiextensions-apiserver/OWNERS b/vendor/k8s.io/apiextensions-apiserver/OWNERS new file mode 100644 index 00000000..f76281ad --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/OWNERS @@ -0,0 +1,11 @@ +reviewers: +- deads2k +- sttts +- enisoc +- mbohlool +approvers: +- deads2k +- lavalamp +- sttts +labels: +- sig/api-machinery diff --git a/vendor/k8s.io/apiextensions-apiserver/README.md b/vendor/k8s.io/apiextensions-apiserver/README.md new file mode 100644 index 00000000..be75b9ba --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/README.md @@ -0,0 +1,20 @@ +# apiextensions-apiserver + +Implements: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/thirdpartyresources.md + +It provides an API for registering `CustomResourceDefinitions`. + +## Purpose + +This API server provides the implementation for `CustomResourceDefinitions` which is included as +delegate server inside of `kube-apiserver`. + + +## Compatibility + +HEAD of this repo will match HEAD of k8s.io/apiserver, k8s.io/apimachinery, and k8s.io/client-go. + +## Where does it come from? + +`apiextensions-apiserver` is synced from https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apiextensions-apiserver. +Code changes are made in that location, merged into `k8s.io/kubernetes` and later synced here. diff --git a/vendor/k8s.io/apiextensions-apiserver/SECURITY_CONTACTS b/vendor/k8s.io/apiextensions-apiserver/SECURITY_CONTACTS new file mode 100644 index 00000000..0648a8eb --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/apiextensions-apiserver/code-of-conduct.md b/vendor/k8s.io/apiextensions-apiserver/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/panic.go b/vendor/k8s.io/apiextensions-apiserver/main.go similarity index 55% rename from vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/panic.go rename to vendor/k8s.io/apiextensions-apiserver/main.go index f1916ebf..888a04b1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/panic.go +++ b/vendor/k8s.io/apiextensions-apiserver/main.go @@ -14,23 +14,27 @@ See the License for the specific language governing permissions and limitations under the License. */ -package panic - -import utilruntime "k8s.io/apimachinery/pkg/util/runtime" - -// HandlePanic returns a function that wraps `fn` with the utilruntime.PanicHandlers, and continues -// to bubble the panic after the PanicHandlers are called -func HandlePanic(fn func()) func() { - return func() { - defer func() { - if r := recover(); r != nil { - for _, fn := range utilruntime.PanicHandlers { - fn(r) - } - panic(r) - } - }() - // call the function - fn() +package main + +import ( + "flag" + "os" + + "github.com/golang/glog" + + "k8s.io/apiextensions-apiserver/pkg/cmd/server" + genericapiserver "k8s.io/apiserver/pkg/server" + "k8s.io/apiserver/pkg/util/logs" +) + +func main() { + logs.InitLogs() + defer logs.FlushLogs() + + stopCh := genericapiserver.SetupSignalHandler() + cmd := server.NewServerCommand(os.Stdout, os.Stderr, stopCh) + cmd.Flags().AddGoFlagSet(flag.CommandLine) + if err := cmd.Execute(); err != nil { + glog.Fatal(err) } } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD new file mode 100644 index 00000000..58016b7c --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD @@ -0,0 +1,36 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["server.go"], + data = glob(["testdata/**"]), + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server", + importpath = "k8s.io/apiextensions-apiserver/pkg/cmd/server", + deps = [ + "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server:go_default_library", + "//vendor/github.com/spf13/cobra:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options:all-srcs", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/testing:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/server.go b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/server.go new file mode 100644 index 00000000..b30b9cb6 --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/server.go @@ -0,0 +1,64 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 server + +import ( + "io" + + "github.com/spf13/cobra" + + "k8s.io/apiextensions-apiserver/pkg/cmd/server/options" + genericapiserver "k8s.io/apiserver/pkg/server" +) + +func NewServerCommand(out, errOut io.Writer, stopCh <-chan struct{}) *cobra.Command { + o := options.NewCustomResourceDefinitionsServerOptions(out, errOut) + + cmd := &cobra.Command{ + Short: "Launch an API extensions API server", + Long: "Launch an API extensions API server", + RunE: func(c *cobra.Command, args []string) error { + if err := o.Complete(); err != nil { + return err + } + if err := o.Validate(); err != nil { + return err + } + if err := Run(o, stopCh); err != nil { + return err + } + return nil + }, + } + + fs := cmd.Flags() + o.AddFlags(fs) + return cmd +} + +func Run(o *options.CustomResourceDefinitionsServerOptions, stopCh <-chan struct{}) error { + config, err := o.Config() + if err != nil { + return err + } + + server, err := config.Complete().New(genericapiserver.NewEmptyDelegate()) + if err != nil { + return err + } + return server.GenericAPIServer.PrepareRun().Run(stopCh) +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD index c6438cb4..b2df8744 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD @@ -8,8 +8,9 @@ load( go_library( name = "go_default_library", srcs = ["kube_features.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/features", importpath = "k8s.io/apiextensions-apiserver/pkg/features", - deps = ["//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library"], + deps = ["//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apimachinery/CONTRIBUTING.md b/vendor/k8s.io/apimachinery/CONTRIBUTING.md new file mode 100644 index 00000000..6a50b562 --- /dev/null +++ b/vendor/k8s.io/apimachinery/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing guidelines + +Do not open pull requests directly against this repository, they will be ignored. Instead, please open pull requests against [kubernetes/kubernetes](https://git.k8s.io/kubernetes/). Please follow the same [contributing guide](https://git.k8s.io/kubernetes/CONTRIBUTING.md) you would follow for any other pull request made to kubernetes/kubernetes. + +This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/apimachinery](https://git.k8s.io/kubernetes/staging/src/k8s.io/apimachinery) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot). + +Please see [Staging Directory and Publishing](https://git.k8s.io/community/contributors/devel/staging.md) for more information diff --git a/vendor/k8s.io/apimachinery/OWNERS b/vendor/k8s.io/apimachinery/OWNERS new file mode 100644 index 00000000..3449af97 --- /dev/null +++ b/vendor/k8s.io/apimachinery/OWNERS @@ -0,0 +1,23 @@ +approvers: +- lavalamp +- smarterclayton +- deads2k +- sttts +- liggitt +- caesarxuchao +reviewers: +- thockin +- lavalamp +- smarterclayton +- wojtek-t +- deads2k +- derekwaynecarr +- caesarxuchao +- mikedanese +- liggitt +- gmarek +- sttts +- ncdc +- tallclair +labels: +- sig/api-machinery diff --git a/vendor/k8s.io/apimachinery/README.md b/vendor/k8s.io/apimachinery/README.md new file mode 100644 index 00000000..258250ce --- /dev/null +++ b/vendor/k8s.io/apimachinery/README.md @@ -0,0 +1,29 @@ +# apimachinery + +Scheme, typing, encoding, decoding, and conversion packages for Kubernetes and Kubernetes-like API objects. + + +## Purpose + +This library is a shared dependency for servers and clients to work with Kubernetes API infrastructure without direct +type dependencies. Its first consumers are `k8s.io/kubernetes`, `k8s.io/client-go`, and `k8s.io/apiserver`. + + +## Compatibility + +There are *NO compatibility guarantees* for this repository. It is in direct support of Kubernetes, so branches +will track Kubernetes and be compatible with that repo. As we more cleanly separate the layers, we will review the +compatibility guarantee. + + +## Where does it come from? + +`apimachinery` is synced from https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apimachinery. +Code changes are made in that location, merged into `k8s.io/kubernetes` and later synced here. + + +## Things you should *NOT* do + + 1. Add API types to this repo. This is for the machinery, not for the types. + 2. Directly modify any files under `pkg` in this repo. Those are driven from `k8s.io/kubernetes/staging/src/k8s.io/apimachinery`. + 3. Expect compatibility. This repo is direct support of Kubernetes and the API isn't yet stable enough for API guarantees. diff --git a/vendor/k8s.io/apimachinery/SECURITY_CONTACTS b/vendor/k8s.io/apimachinery/SECURITY_CONTACTS new file mode 100644 index 00000000..0648a8eb --- /dev/null +++ b/vendor/k8s.io/apimachinery/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/apimachinery/code-of-conduct.md b/vendor/k8s.io/apimachinery/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/vendor/k8s.io/apimachinery/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) diff --git a/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD b/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD index 75051f35..d526b508 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD @@ -8,13 +8,14 @@ load( go_library( name = "go_default_library", srcs = ["semantic.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/equality", importpath = "k8s.io/apimachinery/pkg/api/equality", deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD b/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD index 785e9d8a..865a64fc 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD @@ -11,10 +11,10 @@ go_test( srcs = ["errors_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) @@ -24,12 +24,13 @@ go_library( "doc.go", "errors.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/errors", importpath = "k8s.io/apimachinery/pkg/api/errors", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/errors_test.go b/vendor/k8s.io/apimachinery/pkg/api/errors/errors_test.go new file mode 100644 index 00000000..303a9d3f --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/errors/errors_test.go @@ -0,0 +1,222 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 errors + +import ( + "errors" + "fmt" + "reflect" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/validation/field" +) + +func resource(resource string) schema.GroupResource { + return schema.GroupResource{Group: "", Resource: resource} +} +func kind(kind string) schema.GroupKind { + return schema.GroupKind{Group: "", Kind: kind} +} + +func TestErrorNew(t *testing.T) { + err := NewAlreadyExists(resource("tests"), "1") + if !IsAlreadyExists(err) { + t.Errorf("expected to be %s", metav1.StatusReasonAlreadyExists) + } + if IsConflict(err) { + t.Errorf("expected to not be %s", metav1.StatusReasonConflict) + } + if IsNotFound(err) { + t.Errorf(fmt.Sprintf("expected to not be %s", metav1.StatusReasonNotFound)) + } + if IsInvalid(err) { + t.Errorf("expected to not be %s", metav1.StatusReasonInvalid) + } + if IsBadRequest(err) { + t.Errorf("expected to not be %s", metav1.StatusReasonBadRequest) + } + if IsForbidden(err) { + t.Errorf("expected to not be %s", metav1.StatusReasonForbidden) + } + if IsServerTimeout(err) { + t.Errorf("expected to not be %s", metav1.StatusReasonServerTimeout) + } + if IsMethodNotSupported(err) { + t.Errorf("expected to not be %s", metav1.StatusReasonMethodNotAllowed) + } + + if !IsConflict(NewConflict(resource("tests"), "2", errors.New("message"))) { + t.Errorf("expected to be conflict") + } + if !IsNotFound(NewNotFound(resource("tests"), "3")) { + t.Errorf("expected to be %s", metav1.StatusReasonNotFound) + } + if !IsInvalid(NewInvalid(kind("Test"), "2", nil)) { + t.Errorf("expected to be %s", metav1.StatusReasonInvalid) + } + if !IsBadRequest(NewBadRequest("reason")) { + t.Errorf("expected to be %s", metav1.StatusReasonBadRequest) + } + if !IsForbidden(NewForbidden(resource("tests"), "2", errors.New("reason"))) { + t.Errorf("expected to be %s", metav1.StatusReasonForbidden) + } + if !IsUnauthorized(NewUnauthorized("reason")) { + t.Errorf("expected to be %s", metav1.StatusReasonUnauthorized) + } + if !IsServerTimeout(NewServerTimeout(resource("tests"), "reason", 0)) { + t.Errorf("expected to be %s", metav1.StatusReasonServerTimeout) + } + if !IsMethodNotSupported(NewMethodNotSupported(resource("foos"), "delete")) { + t.Errorf("expected to be %s", metav1.StatusReasonMethodNotAllowed) + } + + if time, ok := SuggestsClientDelay(NewServerTimeout(resource("tests"), "doing something", 10)); time != 10 || !ok { + t.Errorf("unexpected %d", time) + } + if time, ok := SuggestsClientDelay(NewServerTimeout(resource("tests"), "doing something", 0)); time != 0 || !ok { + t.Errorf("unexpected %d", time) + } + if time, ok := SuggestsClientDelay(NewTimeoutError("test reason", 10)); time != 10 || !ok { + t.Errorf("unexpected %d", time) + } + if time, ok := SuggestsClientDelay(NewTooManyRequests("doing something", 10)); time != 10 || !ok { + t.Errorf("unexpected %d", time) + } + if time, ok := SuggestsClientDelay(NewTooManyRequests("doing something", 1)); time != 1 || !ok { + t.Errorf("unexpected %d", time) + } + if time, ok := SuggestsClientDelay(NewGenericServerResponse(429, "get", resource("tests"), "test", "doing something", 10, true)); time != 10 || !ok { + t.Errorf("unexpected %d", time) + } + if time, ok := SuggestsClientDelay(NewGenericServerResponse(500, "get", resource("tests"), "test", "doing something", 10, true)); time != 10 || !ok { + t.Errorf("unexpected %d", time) + } + if time, ok := SuggestsClientDelay(NewGenericServerResponse(429, "get", resource("tests"), "test", "doing something", 0, true)); time != 0 || ok { + t.Errorf("unexpected %d", time) + } +} + +func TestNewInvalid(t *testing.T) { + testCases := []struct { + Err *field.Error + Details *metav1.StatusDetails + }{ + { + field.Duplicate(field.NewPath("field[0].name"), "bar"), + &metav1.StatusDetails{ + Kind: "Kind", + Name: "name", + Causes: []metav1.StatusCause{{ + Type: metav1.CauseTypeFieldValueDuplicate, + Field: "field[0].name", + }}, + }, + }, + { + field.Invalid(field.NewPath("field[0].name"), "bar", "detail"), + &metav1.StatusDetails{ + Kind: "Kind", + Name: "name", + Causes: []metav1.StatusCause{{ + Type: metav1.CauseTypeFieldValueInvalid, + Field: "field[0].name", + }}, + }, + }, + { + field.NotFound(field.NewPath("field[0].name"), "bar"), + &metav1.StatusDetails{ + Kind: "Kind", + Name: "name", + Causes: []metav1.StatusCause{{ + Type: metav1.CauseTypeFieldValueNotFound, + Field: "field[0].name", + }}, + }, + }, + { + field.NotSupported(field.NewPath("field[0].name"), "bar", nil), + &metav1.StatusDetails{ + Kind: "Kind", + Name: "name", + Causes: []metav1.StatusCause{{ + Type: metav1.CauseTypeFieldValueNotSupported, + Field: "field[0].name", + }}, + }, + }, + { + field.Required(field.NewPath("field[0].name"), ""), + &metav1.StatusDetails{ + Kind: "Kind", + Name: "name", + Causes: []metav1.StatusCause{{ + Type: metav1.CauseTypeFieldValueRequired, + Field: "field[0].name", + }}, + }, + }, + } + for i, testCase := range testCases { + vErr, expected := testCase.Err, testCase.Details + expected.Causes[0].Message = vErr.ErrorBody() + err := NewInvalid(kind("Kind"), "name", field.ErrorList{vErr}) + status := err.ErrStatus + if status.Code != 422 || status.Reason != metav1.StatusReasonInvalid { + t.Errorf("%d: unexpected status: %#v", i, status) + } + if !reflect.DeepEqual(expected, status.Details) { + t.Errorf("%d: expected %#v, got %#v", i, expected, status.Details) + } + } +} + +func TestReasonForError(t *testing.T) { + if e, a := metav1.StatusReasonUnknown, ReasonForError(nil); e != a { + t.Errorf("unexpected reason type: %#v", a) + } +} + +type TestType struct{} + +func (obj *TestType) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } +func (obj *TestType) DeepCopyObject() runtime.Object { + if obj == nil { + return nil + } + clone := *obj + return &clone +} + +func TestFromObject(t *testing.T) { + table := []struct { + obj runtime.Object + message string + }{ + {&metav1.Status{Message: "foobar"}, "foobar"}, + {&TestType{}, "unexpected object: &{}"}, + } + + for _, item := range table { + if e, a := item.message, FromObject(item.obj).Error(); e != a { + t.Errorf("Expected %v, got %v", e, a) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD b/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD index 987eb1c0..938ba9b5 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD @@ -16,11 +16,11 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) @@ -38,17 +38,18 @@ go_library( "priority.go", "restmapper.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/meta", importpath = "k8s.io/apimachinery/pkg/api/meta", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/meta_test.go b/vendor/k8s.io/apimachinery/pkg/api/meta/meta_test.go new file mode 100644 index 00000000..4680bae9 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/meta_test.go @@ -0,0 +1,51 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 meta + +import ( + "math/rand" + "reflect" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" + "k8s.io/apimachinery/pkg/util/diff" + + fuzz "github.com/google/gofuzz" +) + +func TestAsPartialObjectMetadata(t *testing.T) { + f := fuzz.New().NilChance(.5).NumElements(0, 1).RandSource(rand.NewSource(1)) + + for i := 0; i < 100; i++ { + m := &metav1.ObjectMeta{} + f.Fuzz(m) + partial := AsPartialObjectMetadata(m) + if !reflect.DeepEqual(&partial.ObjectMeta, m) { + t.Fatalf("incomplete partial object metadata: %s", diff.ObjectReflectDiff(&partial.ObjectMeta, m)) + } + } + + for i := 0; i < 100; i++ { + m := &metav1beta1.PartialObjectMetadata{} + f.Fuzz(&m.ObjectMeta) + partial := AsPartialObjectMetadata(m) + if !reflect.DeepEqual(&partial.ObjectMeta, &m.ObjectMeta) { + t.Fatalf("incomplete partial object metadata: %s", diff.ObjectReflectDiff(&partial.ObjectMeta, &m.ObjectMeta)) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/multirestmapper_test.go b/vendor/k8s.io/apimachinery/pkg/api/meta/multirestmapper_test.go new file mode 100644 index 00000000..b71ca468 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/multirestmapper_test.go @@ -0,0 +1,391 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 meta + +import ( + "errors" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestMultiRESTMapperResourceFor(t *testing.T) { + tcs := []struct { + name string + + mapper MultiRESTMapper + input schema.GroupVersionResource + result schema.GroupVersionResource + err error + }{ + { + name: "empty", + mapper: MultiRESTMapper{}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: schema.GroupVersionResource{}, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "ignore not found", + mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: schema.GroupVersionResource{}, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "accept first failure", + mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "unused"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: schema.GroupVersionResource{}, + err: errors.New("fail on this"), + }, + } + + for _, tc := range tcs { + actualResult, actualErr := tc.mapper.ResourceFor(tc.input) + if e, a := tc.result, actualResult; e != a { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + switch { + case tc.err == nil && actualErr == nil: + case tc.err == nil: + t.Errorf("%s: unexpected error: %v", tc.name, actualErr) + case actualErr == nil: + t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) + case tc.err.Error() != actualErr.Error(): + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +func TestMultiRESTMapperResourcesFor(t *testing.T) { + tcs := []struct { + name string + + mapper MultiRESTMapper + input schema.GroupVersionResource + result []schema.GroupVersionResource + err error + }{ + { + name: "empty", + mapper: MultiRESTMapper{}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: nil, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "ignore not found", + mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: nil, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "accept first failure", + mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "unused"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: nil, + err: errors.New("fail on this"), + }, + { + name: "union and dedup", + mapper: MultiRESTMapper{ + fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "dupe"}, {Resource: "first"}}}, + fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "dupe"}, {Resource: "second"}}}, + }, + input: schema.GroupVersionResource{Resource: "foo"}, + result: []schema.GroupVersionResource{{Resource: "dupe"}, {Resource: "first"}, {Resource: "second"}}, + }, + { + name: "skip not and continue", + mapper: MultiRESTMapper{ + fixedRESTMapper{err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "IGNORE_THIS"}}}, + fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "first"}, {Resource: "second"}}}, + }, + input: schema.GroupVersionResource{Resource: "foo"}, + result: []schema.GroupVersionResource{{Resource: "first"}, {Resource: "second"}}, + }, + } + + for _, tc := range tcs { + actualResult, actualErr := tc.mapper.ResourcesFor(tc.input) + if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + switch { + case tc.err == nil && actualErr == nil: + case tc.err == nil: + t.Errorf("%s: unexpected error: %v", tc.name, actualErr) + case actualErr == nil: + t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) + case tc.err.Error() != actualErr.Error(): + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +func TestMultiRESTMapperKindsFor(t *testing.T) { + tcs := []struct { + name string + + mapper MultiRESTMapper + input schema.GroupVersionResource + result []schema.GroupVersionKind + err error + }{ + { + name: "empty", + mapper: MultiRESTMapper{}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: nil, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "ignore not found", + mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: nil, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "accept first failure", + mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "unused"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: nil, + err: errors.New("fail on this"), + }, + { + name: "union and dedup", + mapper: MultiRESTMapper{ + fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "dupe"}, {Kind: "first"}}}, + fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "dupe"}, {Kind: "second"}}}, + }, + input: schema.GroupVersionResource{Resource: "foo"}, + result: []schema.GroupVersionKind{{Kind: "dupe"}, {Kind: "first"}, {Kind: "second"}}, + }, + { + name: "skip not and continue", + mapper: MultiRESTMapper{ + fixedRESTMapper{err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "IGNORE_THIS"}}}, + fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "first"}, {Kind: "second"}}}, + }, + input: schema.GroupVersionResource{Resource: "foo"}, + result: []schema.GroupVersionKind{{Kind: "first"}, {Kind: "second"}}, + }, + } + + for _, tc := range tcs { + actualResult, actualErr := tc.mapper.KindsFor(tc.input) + if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + switch { + case tc.err == nil && actualErr == nil: + case tc.err == nil: + t.Errorf("%s: unexpected error: %v", tc.name, actualErr) + case actualErr == nil: + t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) + case tc.err.Error() != actualErr.Error(): + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +func TestMultiRESTMapperKindFor(t *testing.T) { + tcs := []struct { + name string + + mapper MultiRESTMapper + input schema.GroupVersionResource + result schema.GroupVersionKind + err error + }{ + { + name: "empty", + mapper: MultiRESTMapper{}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: schema.GroupVersionKind{}, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "ignore not found", + mapper: MultiRESTMapper{fixedRESTMapper{err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "IGNORE_THIS"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: schema.GroupVersionKind{}, + err: &NoResourceMatchError{PartialResource: schema.GroupVersionResource{Resource: "foo"}}, + }, + { + name: "accept first failure", + mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "unused"}}}}, + input: schema.GroupVersionResource{Resource: "foo"}, + result: schema.GroupVersionKind{}, + err: errors.New("fail on this"), + }, + } + + for _, tc := range tcs { + actualResult, actualErr := tc.mapper.KindFor(tc.input) + if e, a := tc.result, actualResult; e != a { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + switch { + case tc.err == nil && actualErr == nil: + case tc.err == nil: + t.Errorf("%s: unexpected error: %v", tc.name, actualErr) + case actualErr == nil: + t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) + case tc.err.Error() != actualErr.Error(): + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +func TestMultiRESTMapperRESTMappings(t *testing.T) { + mapping1, mapping2 := &RESTMapping{}, &RESTMapping{} + tcs := []struct { + name string + + mapper MultiRESTMapper + groupKind schema.GroupKind + versions []string + result []*RESTMapping + err error + }{ + { + name: "empty with no versions", + mapper: MultiRESTMapper{}, + groupKind: schema.GroupKind{Kind: "Foo"}, + result: nil, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}}, + }, + { + name: "empty with one version", + mapper: MultiRESTMapper{}, + groupKind: schema.GroupKind{Kind: "Foo"}, + versions: []string{"v1beta"}, + result: nil, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}, SearchedVersions: []string{"v1beta"}}, + }, + { + name: "empty with multi(two) vesions", + mapper: MultiRESTMapper{}, + groupKind: schema.GroupKind{Kind: "Foo"}, + versions: []string{"v1beta", "v2"}, + result: nil, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}, SearchedVersions: []string{"v1beta", "v2"}}, + }, + { + name: "ignore not found with kind not exist", + mapper: MultiRESTMapper{fixedRESTMapper{err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "IGNORE_THIS"}}}}, + groupKind: schema.GroupKind{Kind: "Foo"}, + versions: nil, + result: nil, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}}, + }, + { + name: "ignore not found with version not exist", + mapper: MultiRESTMapper{fixedRESTMapper{err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}, SearchedVersions: []string{"v1"}}}}, + groupKind: schema.GroupKind{Kind: "Foo"}, + versions: []string{"v1beta"}, + result: nil, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}, SearchedVersions: []string{"v1beta"}}, + }, + { + name: "ignore not found with multi versions not exist", + mapper: MultiRESTMapper{fixedRESTMapper{err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}, SearchedVersions: []string{"v1"}}}}, + groupKind: schema.GroupKind{Kind: "Foo"}, + versions: []string{"v1beta", "v2"}, + result: nil, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}, SearchedVersions: []string{"v1beta", "v2"}}, + }, + { + name: "accept first failure", + mapper: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{mappings: []*RESTMapping{mapping1}}}, + groupKind: schema.GroupKind{Kind: "Foo"}, + versions: []string{"v1beta"}, + result: nil, + err: errors.New("fail on this"), + }, + { + name: "return both", + mapper: MultiRESTMapper{fixedRESTMapper{mappings: []*RESTMapping{mapping1}}, fixedRESTMapper{mappings: []*RESTMapping{mapping2}}}, + groupKind: schema.GroupKind{Kind: "Foo"}, + versions: []string{"v1beta"}, + result: []*RESTMapping{mapping1, mapping2}, + }, + } + + for _, tc := range tcs { + actualResult, actualErr := tc.mapper.RESTMappings(tc.groupKind, tc.versions...) + if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + switch { + case tc.err == nil && actualErr == nil: + case tc.err == nil: + t.Errorf("%s: unexpected error: %v", tc.name, actualErr) + case actualErr == nil: + t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) + case tc.err.Error() != actualErr.Error(): + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +type fixedRESTMapper struct { + resourcesFor []schema.GroupVersionResource + kindsFor []schema.GroupVersionKind + resourceFor schema.GroupVersionResource + kindFor schema.GroupVersionKind + mappings []*RESTMapping + + err error +} + +func (m fixedRESTMapper) ResourceSingularizer(resource string) (singular string, err error) { + return "", m.err +} + +func (m fixedRESTMapper) ResourcesFor(resource schema.GroupVersionResource) ([]schema.GroupVersionResource, error) { + return m.resourcesFor, m.err +} + +func (m fixedRESTMapper) KindsFor(resource schema.GroupVersionResource) (gvk []schema.GroupVersionKind, err error) { + return m.kindsFor, m.err +} + +func (m fixedRESTMapper) ResourceFor(resource schema.GroupVersionResource) (schema.GroupVersionResource, error) { + return m.resourceFor, m.err +} + +func (m fixedRESTMapper) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { + return m.kindFor, m.err +} + +func (m fixedRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (mapping *RESTMapping, err error) { + return nil, m.err +} + +func (m fixedRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) (mappings []*RESTMapping, err error) { + return m.mappings, m.err +} + +func (m fixedRESTMapper) ResourceIsValid(resource schema.GroupVersionResource) bool { + return false +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go b/vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go new file mode 100644 index 00000000..fff1afd1 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go @@ -0,0 +1,409 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 meta + +import ( + "errors" + "reflect" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestPriorityRESTMapperResourceForErrorHandling(t *testing.T) { + tcs := []struct { + name string + + delegate RESTMapper + resourcePatterns []schema.GroupVersionResource + result schema.GroupVersionResource + err string + }{ + { + name: "error", + delegate: fixedRESTMapper{err: errors.New("delegateError")}, + err: "delegateError", + }, + { + name: "single hit + error", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "single-hit"}}, err: errors.New("delegateError")}, + result: schema.GroupVersionResource{Resource: "single-hit"}, + err: "delegateError", + }, + { + name: "group selection + error", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{ + {Group: "one", Version: "a", Resource: "first"}, + {Group: "two", Version: "b", Resource: "second"}, + }, err: errors.New("delegateError")}, + resourcePatterns: []schema.GroupVersionResource{ + {Group: "one", Version: AnyVersion, Resource: AnyResource}, + }, + result: schema.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, + err: "delegateError", + }, + + { + name: "single hit", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "single-hit"}}}, + result: schema.GroupVersionResource{Resource: "single-hit"}, + }, + { + name: "ambiguous match", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{ + {Group: "one", Version: "a", Resource: "first"}, + {Group: "two", Version: "b", Resource: "second"}, + }}, + err: "matches multiple resources", + }, + { + name: "group selection", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{ + {Group: "one", Version: "a", Resource: "first"}, + {Group: "two", Version: "b", Resource: "second"}, + }}, + resourcePatterns: []schema.GroupVersionResource{ + {Group: "one", Version: AnyVersion, Resource: AnyResource}, + }, + result: schema.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, + }, + { + name: "empty match continues", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{ + {Group: "one", Version: "a", Resource: "first"}, + {Group: "two", Version: "b", Resource: "second"}, + }}, + resourcePatterns: []schema.GroupVersionResource{ + {Group: "fail", Version: AnyVersion, Resource: AnyResource}, + {Group: "one", Version: AnyVersion, Resource: AnyResource}, + }, + result: schema.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, + }, + { + name: "group followed by version selection", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{ + {Group: "one", Version: "a", Resource: "first"}, + {Group: "two", Version: "b", Resource: "second"}, + {Group: "one", Version: "c", Resource: "third"}, + }}, + resourcePatterns: []schema.GroupVersionResource{ + {Group: "one", Version: AnyVersion, Resource: AnyResource}, + {Group: AnyGroup, Version: "a", Resource: AnyResource}, + }, + result: schema.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, + }, + { + name: "resource selection", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{ + {Group: "one", Version: "a", Resource: "first"}, + {Group: "one", Version: "a", Resource: "second"}, + }}, + resourcePatterns: []schema.GroupVersionResource{ + {Group: AnyGroup, Version: AnyVersion, Resource: "second"}, + }, + result: schema.GroupVersionResource{Group: "one", Version: "a", Resource: "second"}, + }, + } + + for _, tc := range tcs { + mapper := PriorityRESTMapper{Delegate: tc.delegate, ResourcePriority: tc.resourcePatterns} + + actualResult, actualErr := mapper.ResourceFor(schema.GroupVersionResource{}) + if e, a := tc.result, actualResult; e != a { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + if len(tc.err) == 0 && actualErr == nil { + continue + } + if len(tc.err) == 0 && actualErr != nil { + t.Errorf("%s: unexpected err: %v", tc.name, actualErr) + continue + } + if len(tc.err) > 0 && actualErr == nil { + t.Errorf("%s: missing expected err: %v", tc.name, tc.err) + continue + } + if !strings.Contains(actualErr.Error(), tc.err) { + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +func TestPriorityRESTMapperKindForErrorHandling(t *testing.T) { + tcs := []struct { + name string + + delegate RESTMapper + kindPatterns []schema.GroupVersionKind + result schema.GroupVersionKind + err string + }{ + { + name: "error", + delegate: fixedRESTMapper{err: errors.New("delegateErr")}, + err: "delegateErr", + }, + { + name: "single hit + error", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "single-hit"}}, err: errors.New("delegateErr")}, + result: schema.GroupVersionKind{Kind: "single-hit"}, + err: "delegateErr", + }, + { + name: "group selection + error", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{ + {Group: "one", Version: "a", Kind: "first"}, + {Group: "two", Version: "b", Kind: "second"}, + }, err: errors.New("delegateErr")}, + kindPatterns: []schema.GroupVersionKind{ + {Group: "one", Version: AnyVersion, Kind: AnyKind}, + }, + result: schema.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, + err: "delegateErr", + }, + + { + name: "single hit", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "single-hit"}}}, + result: schema.GroupVersionKind{Kind: "single-hit"}, + }, + { + name: "ambiguous match", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{ + {Group: "one", Version: "a", Kind: "first"}, + {Group: "two", Version: "b", Kind: "second"}, + }}, + err: "matches multiple kinds", + }, + { + name: "group selection", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{ + {Group: "one", Version: "a", Kind: "first"}, + {Group: "two", Version: "b", Kind: "second"}, + }}, + kindPatterns: []schema.GroupVersionKind{ + {Group: "one", Version: AnyVersion, Kind: AnyKind}, + }, + result: schema.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, + }, + { + name: "empty match continues", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{ + {Group: "one", Version: "a", Kind: "first"}, + {Group: "two", Version: "b", Kind: "second"}, + }}, + kindPatterns: []schema.GroupVersionKind{ + {Group: "fail", Version: AnyVersion, Kind: AnyKind}, + {Group: "one", Version: AnyVersion, Kind: AnyKind}, + }, + result: schema.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, + }, + { + name: "group followed by version selection", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{ + {Group: "one", Version: "a", Kind: "first"}, + {Group: "two", Version: "b", Kind: "second"}, + {Group: "one", Version: "c", Kind: "third"}, + }}, + kindPatterns: []schema.GroupVersionKind{ + {Group: "one", Version: AnyVersion, Kind: AnyKind}, + {Group: AnyGroup, Version: "a", Kind: AnyKind}, + }, + result: schema.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, + }, + { + name: "kind selection", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{ + {Group: "one", Version: "a", Kind: "first"}, + {Group: "one", Version: "a", Kind: "second"}, + }}, + kindPatterns: []schema.GroupVersionKind{ + {Group: AnyGroup, Version: AnyVersion, Kind: "second"}, + }, + result: schema.GroupVersionKind{Group: "one", Version: "a", Kind: "second"}, + }, + } + + for _, tc := range tcs { + mapper := PriorityRESTMapper{Delegate: tc.delegate, KindPriority: tc.kindPatterns} + + actualResult, actualErr := mapper.KindFor(schema.GroupVersionResource{}) + if e, a := tc.result, actualResult; e != a { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + if len(tc.err) == 0 && actualErr == nil { + continue + } + if len(tc.err) == 0 && actualErr != nil { + t.Errorf("%s: unexpected err: %v", tc.name, actualErr) + continue + } + if len(tc.err) > 0 && actualErr == nil { + t.Errorf("%s: missing expected err: %v", tc.name, tc.err) + continue + } + if !strings.Contains(actualErr.Error(), tc.err) { + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +func TestPriorityRESTMapperRESTMapping(t *testing.T) { + mapping1 := &RESTMapping{ + GroupVersionKind: schema.GroupVersionKind{Kind: "Foo", Version: "v1alpha1"}, + } + mapping2 := &RESTMapping{ + GroupVersionKind: schema.GroupVersionKind{Kind: "Foo", Version: "v1"}, + } + mapping3 := &RESTMapping{ + GroupVersionKind: schema.GroupVersionKind{Group: "other", Kind: "Foo", Version: "v1"}, + } + allMappers := MultiRESTMapper{ + fixedRESTMapper{mappings: []*RESTMapping{mapping1}}, + fixedRESTMapper{mappings: []*RESTMapping{mapping2}}, + fixedRESTMapper{mappings: []*RESTMapping{mapping3}}, + } + tcs := []struct { + name string + + mapper PriorityRESTMapper + input schema.GroupKind + result *RESTMapping + err error + }{ + { + name: "empty", + mapper: PriorityRESTMapper{Delegate: MultiRESTMapper{}}, + input: schema.GroupKind{Kind: "Foo"}, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}}, + }, + { + name: "ignore not found", + mapper: PriorityRESTMapper{Delegate: MultiRESTMapper{fixedRESTMapper{err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "IGNORE_THIS"}}}}}, + input: schema.GroupKind{Kind: "Foo"}, + err: &NoKindMatchError{GroupKind: schema.GroupKind{Kind: "Foo"}}, + }, + { + name: "accept first failure", + mapper: PriorityRESTMapper{Delegate: MultiRESTMapper{fixedRESTMapper{err: errors.New("fail on this")}, fixedRESTMapper{mappings: []*RESTMapping{mapping1}}}}, + input: schema.GroupKind{Kind: "Foo"}, + err: errors.New("fail on this"), + }, + { + name: "result + error", + mapper: PriorityRESTMapper{Delegate: fixedRESTMapper{mappings: []*RESTMapping{mapping1}, err: errors.New("fail on this")}}, + input: schema.GroupKind{Kind: "Foo"}, + result: mapping1, + err: errors.New("fail on this"), + }, + { + name: "return error for ambiguous", + mapper: PriorityRESTMapper{ + Delegate: allMappers, + }, + input: schema.GroupKind{Kind: "Foo"}, + err: &AmbiguousKindError{ + PartialKind: schema.GroupVersionKind{Kind: "Foo"}, + MatchingKinds: []schema.GroupVersionKind{ + {Kind: "Foo", Version: "v1alpha1"}, + {Kind: "Foo", Version: "v1"}, + {Group: "other", Kind: "Foo", Version: "v1"}, + }, + }, + }, + { + name: "accept only item", + mapper: PriorityRESTMapper{ + Delegate: fixedRESTMapper{mappings: []*RESTMapping{mapping1}}, + }, + input: schema.GroupKind{Kind: "Foo"}, + result: mapping1, + }, + { + name: "return single priority", + mapper: PriorityRESTMapper{ + Delegate: allMappers, + KindPriority: []schema.GroupVersionKind{{Version: "v1", Kind: AnyKind}, {Version: "v1alpha1", Kind: AnyKind}}, + }, + input: schema.GroupKind{Kind: "Foo"}, + result: mapping2, + }, + { + name: "return out of group match", + mapper: PriorityRESTMapper{ + Delegate: allMappers, + KindPriority: []schema.GroupVersionKind{{Group: AnyGroup, Version: "v1", Kind: AnyKind}, {Group: "other", Version: AnyVersion, Kind: AnyKind}}, + }, + input: schema.GroupKind{Kind: "Foo"}, + result: mapping3, + }, + } + + for _, tc := range tcs { + actualResult, actualErr := tc.mapper.RESTMapping(tc.input) + if e, a := tc.result, actualResult; !reflect.DeepEqual(e, a) { + t.Errorf("%s: expected %v, got %v", tc.name, e, a) + } + switch { + case tc.err == nil && actualErr == nil: + case tc.err == nil: + t.Errorf("%s: unexpected error: %v", tc.name, actualErr) + case actualErr == nil: + t.Errorf("%s: expected error: %v got nil", tc.name, tc.err) + case tc.err.Error() != actualErr.Error(): + t.Errorf("%s: expected %v, got %v", tc.name, tc.err, actualErr) + } + } +} + +func TestPriorityRESTMapperRESTMappingHonorsUserVersion(t *testing.T) { + mappingV2alpha1 := &RESTMapping{ + GroupVersionKind: schema.GroupVersionKind{Group: "Bar", Kind: "Foo", Version: "v2alpha1"}, + } + mappingV1 := &RESTMapping{ + GroupVersionKind: schema.GroupVersionKind{Group: "Bar", Kind: "Foo", Version: "v1"}, + } + + allMappers := MultiRESTMapper{ + fixedRESTMapper{mappings: []*RESTMapping{mappingV2alpha1}}, + fixedRESTMapper{mappings: []*RESTMapping{mappingV1}}, + } + + mapper := PriorityRESTMapper{ + Delegate: allMappers, + KindPriority: []schema.GroupVersionKind{{Group: "Bar", Version: "v2alpha1", Kind: AnyKind}, {Group: "Bar", Version: AnyVersion, Kind: AnyKind}}, + } + + outMapping1, err := mapper.RESTMapping(schema.GroupKind{Group: "Bar", Kind: "Foo"}, "v1") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if outMapping1 != mappingV1 { + t.Errorf("asked for version %v, expected mapping for %v, got mapping for %v", "v1", mappingV1.GroupVersionKind, outMapping1.GroupVersionKind) + } + + outMapping2, err := mapper.RESTMapping(schema.GroupKind{Group: "Bar", Kind: "Foo"}, "v2alpha1") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + if outMapping2 != mappingV2alpha1 { + t.Errorf("asked for version %v, expected mapping for %v, got mapping for %v", "v2alpha1", mappingV2alpha1.GroupVersionKind, outMapping2.GroupVersionKind) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go new file mode 100644 index 00000000..853404ad --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go @@ -0,0 +1,724 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 meta + +import ( + "reflect" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestRESTMapperVersionAndKindForResource(t *testing.T) { + testGroup := "test.group" + testVersion := "test" + testGroupVersion := schema.GroupVersion{Group: testGroup, Version: testVersion} + + testCases := []struct { + Resource schema.GroupVersionResource + GroupVersionToRegister schema.GroupVersion + ExpectedGVK schema.GroupVersionKind + Err bool + }{ + {Resource: schema.GroupVersionResource{Resource: "internalobjec"}, Err: true}, + {Resource: schema.GroupVersionResource{Resource: "internalObjec"}, Err: true}, + + {Resource: schema.GroupVersionResource{Resource: "internalobject"}, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, + {Resource: schema.GroupVersionResource{Resource: "internalobjects"}, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, + } + for i, testCase := range testCases { + mapper := NewDefaultRESTMapper([]schema.GroupVersion{testGroupVersion}) + if len(testCase.ExpectedGVK.Kind) != 0 { + mapper.Add(testCase.ExpectedGVK, RESTScopeNamespace) + } + actualGVK, err := mapper.KindFor(testCase.Resource) + + hasErr := err != nil + if hasErr != testCase.Err { + t.Errorf("%d: unexpected error behavior %t: %v", i, testCase.Err, err) + continue + } + if err != nil { + continue + } + + if actualGVK != testCase.ExpectedGVK { + t.Errorf("%d: unexpected version and kind: e=%s a=%s", i, testCase.ExpectedGVK, actualGVK) + } + } +} + +func TestRESTMapperGroupForResource(t *testing.T) { + testCases := []struct { + Resource schema.GroupVersionResource + GroupVersionKind schema.GroupVersionKind + Err bool + }{ + {Resource: schema.GroupVersionResource{Resource: "myObject"}, GroupVersionKind: schema.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, + {Resource: schema.GroupVersionResource{Resource: "myobject"}, GroupVersionKind: schema.GroupVersionKind{Group: "testapi2", Version: "test", Kind: "MyObject"}}, + {Resource: schema.GroupVersionResource{Resource: "myObje"}, Err: true, GroupVersionKind: schema.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, + {Resource: schema.GroupVersionResource{Resource: "myobje"}, Err: true, GroupVersionKind: schema.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, + } + for i, testCase := range testCases { + mapper := NewDefaultRESTMapper([]schema.GroupVersion{testCase.GroupVersionKind.GroupVersion()}) + mapper.Add(testCase.GroupVersionKind, RESTScopeNamespace) + + actualGVK, err := mapper.KindFor(testCase.Resource) + if testCase.Err { + if err == nil { + t.Errorf("%d: expected error", i) + } + } else if err != nil { + t.Errorf("%d: unexpected error: %v", i, err) + } else if actualGVK != testCase.GroupVersionKind { + t.Errorf("%d: expected group %q, got %q", i, testCase.GroupVersionKind, actualGVK) + } + } +} + +func TestRESTMapperKindsFor(t *testing.T) { + testCases := []struct { + Name string + PreferredOrder []schema.GroupVersion + KindsToRegister []schema.GroupVersionKind + PartialResourceToRequest schema.GroupVersionResource + + ExpectedKinds []schema.GroupVersionKind + ExpectedKindErr string + }{ + { + // exact matches are preferred + Name: "groups, with group exact", + PreferredOrder: []schema.GroupVersion{ + {Group: "first-group-1", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group-1", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + PartialResourceToRequest: schema.GroupVersionResource{Group: "first-group", Resource: "my-kind"}, + + ExpectedKinds: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + }, + + { + // group prefixes work + Name: "groups, with group prefix", + PreferredOrder: []schema.GroupVersion{ + {Group: "second-group", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + }, + PartialResourceToRequest: schema.GroupVersionResource{Group: "first", Resource: "my-kind"}, + + ExpectedKinds: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + }, + + { + // group prefixes can be ambiguous + Name: "groups, with ambiguous group prefix", + PreferredOrder: []schema.GroupVersion{ + {Group: "first-group-1", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group-1", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + PartialResourceToRequest: schema.GroupVersionResource{Group: "first", Resource: "my-kind"}, + + ExpectedKinds: []schema.GroupVersionKind{ + {Group: "first-group-1", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + ExpectedKindErr: " matches multiple kinds ", + }, + + { + Name: "ambiguous groups, with preference order", + PreferredOrder: []schema.GroupVersion{ + {Group: "second-group", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "your-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "your-kind"}, + }, + PartialResourceToRequest: schema.GroupVersionResource{Resource: "my-kinds"}, + + ExpectedKinds: []schema.GroupVersionKind{ + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + ExpectedKindErr: " matches multiple kinds ", + }, + + { + Name: "ambiguous groups, with explicit group match", + PreferredOrder: []schema.GroupVersion{ + {Group: "second-group", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "your-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "your-kind"}, + }, + PartialResourceToRequest: schema.GroupVersionResource{Group: "first-group", Resource: "my-kinds"}, + + ExpectedKinds: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + }, + + { + Name: "ambiguous groups, with ambiguous version match", + PreferredOrder: []schema.GroupVersion{ + {Group: "first-group", Version: "first-version"}, + {Group: "second-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "your-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "your-kind"}, + }, + PartialResourceToRequest: schema.GroupVersionResource{Version: "first-version", Resource: "my-kinds"}, + + ExpectedKinds: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + }, + ExpectedKindErr: " matches multiple kinds ", + }, + } + for _, testCase := range testCases { + tcName := testCase.Name + mapper := NewDefaultRESTMapper(testCase.PreferredOrder) + for _, kind := range testCase.KindsToRegister { + mapper.Add(kind, RESTScopeNamespace) + } + + actualKinds, err := mapper.KindsFor(testCase.PartialResourceToRequest) + if err != nil { + t.Errorf("%s: unexpected error: %v", tcName, err) + continue + } + if !reflect.DeepEqual(testCase.ExpectedKinds, actualKinds) { + t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedKinds, actualKinds) + } + + singleKind, err := mapper.KindFor(testCase.PartialResourceToRequest) + if err == nil && len(testCase.ExpectedKindErr) != 0 { + t.Errorf("%s: expected error: %v", tcName, testCase.ExpectedKindErr) + continue + } + if err != nil { + if len(testCase.ExpectedKindErr) == 0 { + t.Errorf("%s: unexpected error: %v", tcName, err) + continue + } else { + if !strings.Contains(err.Error(), testCase.ExpectedKindErr) { + t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedKindErr, err) + continue + } + } + + } else { + if testCase.ExpectedKinds[0] != singleKind { + t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedKinds[0], singleKind) + } + + } + } +} + +func TestRESTMapperResourcesFor(t *testing.T) { + testCases := []struct { + Name string + PreferredOrder []schema.GroupVersion + KindsToRegister []schema.GroupVersionKind + PluralPartialResourceToRequest schema.GroupVersionResource + SingularPartialResourceToRequest schema.GroupVersionResource + + ExpectedResources []schema.GroupVersionResource + ExpectedResourceErr string + }{ + { + // exact matches are preferred + Name: "groups, with group exact", + PreferredOrder: []schema.GroupVersion{ + {Group: "first-group-1", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group-1", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + PluralPartialResourceToRequest: schema.GroupVersionResource{Group: "first-group", Resource: "my-kinds"}, + SingularPartialResourceToRequest: schema.GroupVersionResource{Group: "first-group", Resource: "my-kind"}, + + ExpectedResources: []schema.GroupVersionResource{ + {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, + }, + }, + + { + // group prefixes work + Name: "groups, with group prefix", + PreferredOrder: []schema.GroupVersion{ + {Group: "second-group", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + }, + PluralPartialResourceToRequest: schema.GroupVersionResource{Group: "first", Resource: "my-kinds"}, + SingularPartialResourceToRequest: schema.GroupVersionResource{Group: "first", Resource: "my-kind"}, + + ExpectedResources: []schema.GroupVersionResource{ + {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, + }, + }, + + { + // group prefixes can be ambiguous + Name: "groups, with ambiguous group prefix", + PreferredOrder: []schema.GroupVersion{ + {Group: "first-group-1", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group-1", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + }, + PluralPartialResourceToRequest: schema.GroupVersionResource{Group: "first", Resource: "my-kinds"}, + SingularPartialResourceToRequest: schema.GroupVersionResource{Group: "first", Resource: "my-kind"}, + + ExpectedResources: []schema.GroupVersionResource{ + {Group: "first-group-1", Version: "first-version", Resource: "my-kinds"}, + {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, + }, + ExpectedResourceErr: " matches multiple resources ", + }, + + { + Name: "ambiguous groups, with preference order", + PreferredOrder: []schema.GroupVersion{ + {Group: "second-group", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "your-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "your-kind"}, + }, + PluralPartialResourceToRequest: schema.GroupVersionResource{Resource: "my-kinds"}, + SingularPartialResourceToRequest: schema.GroupVersionResource{Resource: "my-kind"}, + + ExpectedResources: []schema.GroupVersionResource{ + {Group: "second-group", Version: "first-version", Resource: "my-kinds"}, + {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, + }, + ExpectedResourceErr: " matches multiple resources ", + }, + + { + Name: "ambiguous groups, with explicit group match", + PreferredOrder: []schema.GroupVersion{ + {Group: "second-group", Version: "first-version"}, + {Group: "first-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "your-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "your-kind"}, + }, + PluralPartialResourceToRequest: schema.GroupVersionResource{Group: "first-group", Resource: "my-kinds"}, + SingularPartialResourceToRequest: schema.GroupVersionResource{Group: "first-group", Resource: "my-kind"}, + + ExpectedResources: []schema.GroupVersionResource{ + {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, + }, + }, + + { + Name: "ambiguous groups, with ambiguous version match", + PreferredOrder: []schema.GroupVersion{ + {Group: "first-group", Version: "first-version"}, + {Group: "second-group", Version: "first-version"}, + }, + KindsToRegister: []schema.GroupVersionKind{ + {Group: "first-group", Version: "first-version", Kind: "my-kind"}, + {Group: "first-group", Version: "first-version", Kind: "your-kind"}, + {Group: "second-group", Version: "first-version", Kind: "my-kind"}, + {Group: "second-group", Version: "first-version", Kind: "your-kind"}, + }, + PluralPartialResourceToRequest: schema.GroupVersionResource{Version: "first-version", Resource: "my-kinds"}, + SingularPartialResourceToRequest: schema.GroupVersionResource{Version: "first-version", Resource: "my-kind"}, + + ExpectedResources: []schema.GroupVersionResource{ + {Group: "first-group", Version: "first-version", Resource: "my-kinds"}, + {Group: "second-group", Version: "first-version", Resource: "my-kinds"}, + }, + ExpectedResourceErr: " matches multiple resources ", + }, + } + for _, testCase := range testCases { + tcName := testCase.Name + + for _, partialResource := range []schema.GroupVersionResource{testCase.PluralPartialResourceToRequest, testCase.SingularPartialResourceToRequest} { + mapper := NewDefaultRESTMapper(testCase.PreferredOrder) + for _, kind := range testCase.KindsToRegister { + mapper.Add(kind, RESTScopeNamespace) + } + + actualResources, err := mapper.ResourcesFor(partialResource) + if err != nil { + t.Errorf("%s: unexpected error: %v", tcName, err) + continue + } + if !reflect.DeepEqual(testCase.ExpectedResources, actualResources) { + t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources, actualResources) + } + + singleResource, err := mapper.ResourceFor(partialResource) + if err == nil && len(testCase.ExpectedResourceErr) != 0 { + t.Errorf("%s: expected error: %v", tcName, testCase.ExpectedResourceErr) + continue + } + if err != nil { + if len(testCase.ExpectedResourceErr) == 0 { + t.Errorf("%s: unexpected error: %v", tcName, err) + continue + } else { + if !strings.Contains(err.Error(), testCase.ExpectedResourceErr) { + t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResourceErr, err) + continue + } + } + + } else { + if testCase.ExpectedResources[0] != singleResource { + t.Errorf("%s: expected %v, got %v", tcName, testCase.ExpectedResources[0], singleResource) + } + + } + } + } +} + +func TestKindToResource(t *testing.T) { + testCases := []struct { + Kind string + Plural, Singular string + }{ + {Kind: "Pod", Plural: "pods", Singular: "pod"}, + + {Kind: "ReplicationController", Plural: "replicationcontrollers", Singular: "replicationcontroller"}, + + // Add "ies" when ending with "y" + {Kind: "ImageRepository", Plural: "imagerepositories", Singular: "imagerepository"}, + // Add "es" when ending with "s" + {Kind: "miss", Plural: "misses", Singular: "miss"}, + // Add "s" otherwise + {Kind: "lowercase", Plural: "lowercases", Singular: "lowercase"}, + } + for i, testCase := range testCases { + version := schema.GroupVersion{} + + plural, singular := UnsafeGuessKindToResource(version.WithKind(testCase.Kind)) + if singular != version.WithResource(testCase.Singular) || plural != version.WithResource(testCase.Plural) { + t.Errorf("%d: unexpected plural and singular: %v %v", i, plural, singular) + } + } +} + +func TestRESTMapperResourceSingularizer(t *testing.T) { + testGroupVersion := schema.GroupVersion{Group: "tgroup", Version: "test"} + + testCases := []struct { + Kind string + Plural string + Singular string + }{ + {Kind: "Pod", Plural: "pods", Singular: "pod"}, + {Kind: "ReplicationController", Plural: "replicationcontrollers", Singular: "replicationcontroller"}, + {Kind: "ImageRepository", Plural: "imagerepositories", Singular: "imagerepository"}, + {Kind: "Status", Plural: "statuses", Singular: "status"}, + + {Kind: "lowercase", Plural: "lowercases", Singular: "lowercase"}, + // TODO this test is broken. This updates to reflect actual behavior. Kinds are expected to be singular + // old (incorrect), comment: Don't add extra s if the original object is already plural + {Kind: "lowercases", Plural: "lowercaseses", Singular: "lowercases"}, + } + for i, testCase := range testCases { + mapper := NewDefaultRESTMapper([]schema.GroupVersion{testGroupVersion}) + // create singular/plural mapping + mapper.Add(testGroupVersion.WithKind(testCase.Kind), RESTScopeNamespace) + + singular, err := mapper.ResourceSingularizer(testCase.Plural) + if err != nil { + t.Errorf("%d: unexpected error: %v", i, err) + } + if singular != testCase.Singular { + t.Errorf("%d: mismatched singular: got %v, expected %v", i, singular, testCase.Singular) + } + } +} + +func TestRESTMapperRESTMapping(t *testing.T) { + testGroup := "tgroup" + testGroupVersion := schema.GroupVersion{Group: testGroup, Version: "test"} + internalGroupVersion := schema.GroupVersion{Group: testGroup, Version: "test"} + + testCases := []struct { + Kind string + APIGroupVersions []schema.GroupVersion + DefaultVersions []schema.GroupVersion + + Resource schema.GroupVersionResource + ExpectedGroupVersion *schema.GroupVersion + Err bool + }{ + {Kind: "Unknown", Err: true}, + {Kind: "InternalObject", Err: true}, + + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "Unknown", Err: true}, + + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, + + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, + + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{}, Resource: internalGroupVersion.WithResource("internalobjects"), ExpectedGroupVersion: &schema.GroupVersion{Group: testGroup, Version: "test"}}, + + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, + + // TODO: add test for a resource that exists in one version but not another + } + for i, testCase := range testCases { + mapper := NewDefaultRESTMapper(testCase.DefaultVersions) + mapper.Add(internalGroupVersion.WithKind("InternalObject"), RESTScopeNamespace) + + preferredVersions := []string{} + for _, gv := range testCase.APIGroupVersions { + preferredVersions = append(preferredVersions, gv.Version) + } + gk := schema.GroupKind{Group: testGroup, Kind: testCase.Kind} + + mapping, err := mapper.RESTMapping(gk, preferredVersions...) + hasErr := err != nil + if hasErr != testCase.Err { + t.Errorf("%d: unexpected error behavior %t: %v", i, testCase.Err, err) + } + if hasErr { + continue + } + if mapping.Resource != testCase.Resource { + t.Errorf("%d: unexpected resource: %#v", i, mapping) + } + + groupVersion := testCase.ExpectedGroupVersion + if groupVersion == nil { + groupVersion = &testCase.APIGroupVersions[0] + } + if mapping.GroupVersionKind.GroupVersion() != *groupVersion { + t.Errorf("%d: unexpected version: %#v", i, mapping) + } + + } +} + +func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) { + expectedGroupVersion1 := schema.GroupVersion{Group: "tgroup", Version: "test1"} + expectedGroupVersion2 := schema.GroupVersion{Group: "tgroup", Version: "test2"} + expectedGroupVersion3 := schema.GroupVersion{Group: "tgroup", Version: "test3"} + internalObjectGK := schema.GroupKind{Group: "tgroup", Kind: "InternalObject"} + otherObjectGK := schema.GroupKind{Group: "tgroup", Kind: "OtherObject"} + + mapper := NewDefaultRESTMapper([]schema.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}) + mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace) + mapper.Add(expectedGroupVersion2.WithKind("OtherObject"), RESTScopeNamespace) + + // pick default matching object kind based on search order + mapping, err := mapper.RESTMapping(otherObjectGK) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if mapping.Resource != expectedGroupVersion2.WithResource("otherobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { + t.Errorf("unexpected mapping: %#v", mapping) + } + + mapping, err = mapper.RESTMapping(internalObjectGK) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if mapping.Resource != expectedGroupVersion1.WithResource("internalobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion1 { + t.Errorf("unexpected mapping: %#v", mapping) + } + + // mismatch of version + mapping, err = mapper.RESTMapping(internalObjectGK, expectedGroupVersion2.Version) + if err == nil { + t.Errorf("unexpected non-error") + } + mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion1.Version) + if err == nil { + t.Errorf("unexpected non-error") + } + + // not in the search versions + mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion3.Version) + if err == nil { + t.Errorf("unexpected non-error") + } + + // explicit search order + mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion3.Version, expectedGroupVersion1.Version) + if err == nil { + t.Errorf("unexpected non-error") + } + + mapping, err = mapper.RESTMapping(otherObjectGK, expectedGroupVersion3.Version, expectedGroupVersion2.Version) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if mapping.Resource != expectedGroupVersion2.WithResource("otherobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { + t.Errorf("unexpected mapping: %#v", mapping) + } +} + +func TestRESTMapperRESTMappings(t *testing.T) { + testGroup := "tgroup" + testGroupVersion := schema.GroupVersion{Group: testGroup, Version: "v1"} + + testCases := []struct { + Kind string + APIGroupVersions []schema.GroupVersion + DefaultVersions []schema.GroupVersion + AddGroupVersionKind []schema.GroupVersionKind + + ExpectedRESTMappings []*RESTMapping + Err bool + }{ + {Kind: "Unknown", Err: true}, + {Kind: "InternalObject", Err: true}, + + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "Unknown", Err: true}, + + // ask for specific version - not available - thus error + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v2"}}, Err: true}, + + // ask for specific version - available - check ExpectedRESTMappings + { + DefaultVersions: []schema.GroupVersion{testGroupVersion}, + Kind: "InternalObject", + APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v2"}}, + AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, + ExpectedRESTMappings: []*RESTMapping{{Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, + }, + + // ask for specific versions - only one available - check ExpectedRESTMappings + { + DefaultVersions: []schema.GroupVersion{testGroupVersion}, + Kind: "InternalObject", + APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v3"}, {Group: testGroup, Version: "v2"}}, + AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, + ExpectedRESTMappings: []*RESTMapping{{Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, + }, + + // do not ask for specific version - search through default versions - check ExpectedRESTMappings + { + DefaultVersions: []schema.GroupVersion{testGroupVersion, {Group: testGroup, Version: "v2"}}, + Kind: "InternalObject", + AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v1"}.WithKind("InternalObject"), schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, + ExpectedRESTMappings: []*RESTMapping{ + { + Resource: schema.GroupVersionResource{Group: testGroup, Version: "v1", Resource: "internalobjects"}, + GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v1", Kind: "InternalObject"}, + }, + { + Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, + GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}, + }, + }, + }, + } + + for i, testCase := range testCases { + mapper := NewDefaultRESTMapper(testCase.DefaultVersions) + for _, gvk := range testCase.AddGroupVersionKind { + mapper.Add(gvk, RESTScopeNamespace) + } + + preferredVersions := []string{} + for _, gv := range testCase.APIGroupVersions { + preferredVersions = append(preferredVersions, gv.Version) + } + gk := schema.GroupKind{Group: testGroup, Kind: testCase.Kind} + + mappings, err := mapper.RESTMappings(gk, preferredVersions...) + hasErr := err != nil + if hasErr != testCase.Err { + t.Errorf("%d: unexpected error behavior %t: %v", i, testCase.Err, err) + } + if hasErr { + continue + } + if len(mappings) != len(testCase.ExpectedRESTMappings) { + t.Errorf("%d: unexpected number = %d of rest mappings was returned, expected = %d", i, len(mappings), len(testCase.ExpectedRESTMappings)) + } + for j, mapping := range mappings { + exp := testCase.ExpectedRESTMappings[j] + if mapping.Resource != exp.Resource { + t.Errorf("%d - %d: unexpected resource: %#v", i, j, mapping) + } + if mapping.GroupVersionKind != exp.GroupVersionKind { + t.Errorf("%d - %d: unexpected GroupVersionKind: %#v", i, j, mapping) + } + } + } +} + +func TestRESTMapperReportsErrorOnBadVersion(t *testing.T) { + expectedGroupVersion1 := schema.GroupVersion{Group: "tgroup", Version: "test1"} + expectedGroupVersion2 := schema.GroupVersion{Group: "tgroup", Version: "test2"} + internalObjectGK := schema.GroupKind{Group: "tgroup", Kind: "InternalObject"} + + mapper := NewDefaultRESTMapper([]schema.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}) + mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace) + _, err := mapper.RESTMapping(internalObjectGK, "test3") + if err == nil { + t.Errorf("unexpected non-error") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD b/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD index 7d2c84c9..eb1ba72a 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD @@ -11,6 +11,7 @@ go_test( srcs = [ "amount_test.go", "math_test.go", + "quantity_example_test.go", "quantity_proto_test.go", "quantity_test.go", "scale_int_test.go", @@ -34,6 +35,7 @@ go_library( "suffix.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource", importpath = "k8s.io/apimachinery/pkg/api/resource", deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", @@ -41,12 +43,6 @@ go_library( ], ) -go_test( - name = "go_default_xtest", - srcs = ["quantity_example_test.go"], - deps = ["//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library"], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), @@ -59,9 +55,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/amount_test.go b/vendor/k8s.io/apimachinery/pkg/api/resource/amount_test.go new file mode 100644 index 00000000..8217cb13 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/amount_test.go @@ -0,0 +1,162 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 resource + +import ( + "testing" +) + +func TestInt64AmountAsInt64(t *testing.T) { + for _, test := range []struct { + value int64 + scale Scale + result int64 + ok bool + }{ + {100, 0, 100, true}, + {100, 1, 1000, true}, + {100, -5, 0, false}, + {100, 100, 0, false}, + } { + r, ok := int64Amount{value: test.value, scale: test.scale}.AsInt64() + if r != test.result { + t.Errorf("%v: unexpected result: %d", test, r) + } + if ok != test.ok { + t.Errorf("%v: unexpected ok: %t", test, ok) + } + } +} + +func TestInt64AmountAdd(t *testing.T) { + for _, test := range []struct { + a, b, c int64Amount + ok bool + }{ + {int64Amount{value: 100, scale: 1}, int64Amount{value: 10, scale: 2}, int64Amount{value: 200, scale: 1}, true}, + {int64Amount{value: 100, scale: 1}, int64Amount{value: 1, scale: 2}, int64Amount{value: 110, scale: 1}, true}, + {int64Amount{value: 100, scale: 1}, int64Amount{value: 1, scale: 100}, int64Amount{value: 1, scale: 100}, false}, + {int64Amount{value: -5, scale: 2}, int64Amount{value: 50, scale: 1}, int64Amount{value: 0, scale: 1}, true}, + {int64Amount{value: -5, scale: 2}, int64Amount{value: 5, scale: 2}, int64Amount{value: 0, scale: 2}, true}, + + {int64Amount{value: mostPositive, scale: -1}, int64Amount{value: 1, scale: -1}, int64Amount{value: 0, scale: -1}, false}, + {int64Amount{value: mostPositive, scale: -1}, int64Amount{value: 0, scale: -1}, int64Amount{value: mostPositive, scale: -1}, true}, + {int64Amount{value: mostPositive / 10, scale: 1}, int64Amount{value: 10, scale: 0}, int64Amount{value: mostPositive, scale: -1}, false}, + } { + c := test.a + ok := c.Add(test.b) + if ok != test.ok { + t.Errorf("%v: unexpected ok: %t", test, ok) + } + if ok { + if c != test.c { + t.Errorf("%v: unexpected result: %d", test, c) + } + } else { + if c != test.a { + t.Errorf("%v: overflow addition mutated source: %d", test, c) + } + } + + // addition is commutative + c = test.b + if ok := c.Add(test.a); ok != test.ok { + t.Errorf("%v: unexpected ok: %t", test, ok) + } + if ok { + if c != test.c { + t.Errorf("%v: unexpected result: %d", test, c) + } + } else { + if c != test.b { + t.Errorf("%v: overflow addition mutated source: %d", test, c) + } + } + } +} +func TestInt64AsCanonicalString(t *testing.T) { + for _, test := range []struct { + value int64 + scale Scale + result string + exponent int32 + }{ + {100, 0, "100", 0}, + {100, 1, "1", 3}, + {100, -1, "10", 0}, + {10800, -10, "1080", -9}, + } { + r, exp := int64Amount{value: test.value, scale: test.scale}.AsCanonicalBytes(nil) + if string(r) != test.result { + t.Errorf("%v: unexpected result: %s", test, r) + } + if exp != test.exponent { + t.Errorf("%v: unexpected exponent: %d", test, exp) + } + } +} + +func TestAmountSign(t *testing.T) { + table := []struct { + i int64Amount + expect int + }{ + {int64Amount{value: -50, scale: 1}, -1}, + {int64Amount{value: 0, scale: 1}, 0}, + {int64Amount{value: 300, scale: 1}, 1}, + {int64Amount{value: -50, scale: -8}, -1}, + {int64Amount{value: 50, scale: -8}, 1}, + {int64Amount{value: 0, scale: -8}, 0}, + {int64Amount{value: -50, scale: 0}, -1}, + {int64Amount{value: 50, scale: 0}, 1}, + {int64Amount{value: 0, scale: 0}, 0}, + } + for _, testCase := range table { + if result := testCase.i.Sign(); result != testCase.expect { + t.Errorf("i: %v, Expected: %v, Actual: %v", testCase.i, testCase.expect, result) + } + } +} + +func TestInt64AmountAsScaledInt64(t *testing.T) { + for _, test := range []struct { + name string + i int64Amount + scaled Scale + result int64 + ok bool + }{ + {"test when i.scale < scaled ", int64Amount{value: 100, scale: 0}, 5, 1, true}, + {"test when i.scale = scaled", int64Amount{value: 100, scale: 1}, 1, 100, true}, + {"test when i.scale > scaled and result doesn't overflow", int64Amount{value: 100, scale: 5}, 2, 100000, true}, + {"test when i.scale > scaled and result overflows", int64Amount{value: 876, scale: 30}, 4, 0, false}, + {"test when i.scale < 0 and fraction exists", int64Amount{value: 93, scale: -1}, 0, 10, true}, + {"test when i.scale < 0 and fraction doesn't exist", int64Amount{value: 100, scale: -1}, 0, 10, true}, + {"test when i.value < 0 and fraction exists", int64Amount{value: -1932, scale: 2}, 4, -20, true}, + {"test when i.value < 0 and fraction doesn't exists", int64Amount{value: -1900, scale: 2}, 4, -19, true}, + } { + t.Run(test.name, func(t *testing.T) { + r, ok := test.i.AsScaledInt64(test.scaled) + if r != test.result { + t.Errorf("%v: expected result: %d, got result: %d", test.name, test.result, r) + } + if ok != test.ok { + t.Errorf("%v: expected ok: %t, got ok: %t", test.name, test.ok, ok) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go index 083c8225..802f22a6 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go @@ -19,13 +19,13 @@ limitations under the License. // DO NOT EDIT! /* - Package resource is a generated protocol buffer package. +Package resource is a generated protocol buffer package. - It is generated from these files: - k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto +It is generated from these files: + k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto - It has these top-level messages: - Quantity +It has these top-level messages: + Quantity */ package resource @@ -57,21 +57,20 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 255 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x8f, 0xa1, 0x4e, 0x03, 0x41, - 0x10, 0x86, 0x77, 0x0d, 0x29, 0x95, 0x0d, 0x21, 0xa4, 0x62, 0xaf, 0x21, 0x08, 0x0c, 0x3b, 0x02, - 0xd3, 0x20, 0xf1, 0x08, 0x90, 0xb8, 0xbb, 0xeb, 0xb0, 0xdd, 0x1c, 0xdd, 0xbd, 0xcc, 0xce, 0x92, - 0xd4, 0x55, 0x22, 0x2b, 0x91, 0xbd, 0xb7, 0xa9, 0xac, 0xac, 0x40, 0x70, 0xcb, 0x8b, 0x90, 0x5e, - 0xdb, 0x84, 0x90, 0xe0, 0xe6, 0xfb, 0x27, 0xdf, 0xe4, 0x9f, 0xfe, 0x43, 0x35, 0x0e, 0xda, 0x7a, - 0xa8, 0x62, 0x81, 0xe4, 0x90, 0x31, 0xc0, 0x1b, 0xba, 0x89, 0x27, 0x38, 0x2c, 0xf2, 0xda, 0xce, - 0xf2, 0x72, 0x6a, 0x1d, 0xd2, 0x1c, 0xea, 0xca, 0xec, 0x02, 0x20, 0x0c, 0x3e, 0x52, 0x89, 0x60, - 0xd0, 0x21, 0xe5, 0x8c, 0x13, 0x5d, 0x93, 0x67, 0x3f, 0xb8, 0xda, 0x5b, 0xfa, 0xb7, 0xa5, 0xeb, - 0xca, 0xec, 0x02, 0x7d, 0xb4, 0x86, 0x37, 0xc6, 0xf2, 0x34, 0x16, 0xba, 0xf4, 0x33, 0x30, 0xde, - 0x78, 0xe8, 0xe4, 0x22, 0xbe, 0x74, 0xd4, 0x41, 0x37, 0xed, 0x8f, 0x0e, 0x6f, 0xff, 0xab, 0x12, - 0xd9, 0xbe, 0x82, 0x75, 0x1c, 0x98, 0xfe, 0x36, 0xb9, 0x1c, 0xf7, 0x7b, 0x8f, 0x31, 0x77, 0x6c, - 0x79, 0x3e, 0x38, 0xef, 0x9f, 0x04, 0x26, 0xeb, 0xcc, 0x85, 0x1c, 0xc9, 0xeb, 0xd3, 0xa7, 0x03, - 0xdd, 0x9d, 0x7d, 0xac, 0x32, 0xf1, 0xde, 0x64, 0x62, 0xd9, 0x64, 0x62, 0xd5, 0x64, 0x62, 0xf1, - 0x39, 0x12, 0xf7, 0x7a, 0xdd, 0x2a, 0xb1, 0x69, 0x95, 0xd8, 0xb6, 0x4a, 0x2c, 0x92, 0x92, 0xeb, - 0xa4, 0xe4, 0x26, 0x29, 0xb9, 0x4d, 0x4a, 0x7e, 0x25, 0x25, 0x97, 0xdf, 0x4a, 0x3c, 0xf7, 0x8e, - 0xdf, 0xfc, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x5e, 0xda, 0xf9, 0x43, 0x01, 0x00, 0x00, + // 237 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x8e, 0xb1, 0x4e, 0xc3, 0x30, + 0x10, 0x40, 0xcf, 0x0b, 0x2a, 0x19, 0x2b, 0x84, 0x10, 0xc3, 0xa5, 0x42, 0x0c, 0x2c, 0xd8, 0x6b, + 0xc5, 0xc8, 0xce, 0x00, 0x23, 0x5b, 0x92, 0x1e, 0xae, 0x15, 0xd5, 0x8e, 0x2e, 0x36, 0x52, 0xb7, + 0x8e, 0x8c, 0x1d, 0x19, 0x9b, 0xbf, 0xe9, 0xd8, 0xb1, 0x03, 0x03, 0x31, 0x3f, 0x82, 0xea, 0x36, + 0x52, 0xb7, 0x7b, 0xef, 0xf4, 0x4e, 0x97, 0xbd, 0xd4, 0xd3, 0x56, 0x1a, 0xa7, 0xea, 0x50, 0x12, + 0x5b, 0xf2, 0xd4, 0xaa, 0x4f, 0xb2, 0x33, 0xc7, 0xea, 0xb4, 0x28, 0x1a, 0xb3, 0x28, 0xaa, 0xb9, + 0xb1, 0xc4, 0x4b, 0xd5, 0xd4, 0xfa, 0x20, 0x14, 0x53, 0xeb, 0x02, 0x57, 0xa4, 0x34, 0x59, 0xe2, + 0xc2, 0xd3, 0x4c, 0x36, 0xec, 0xbc, 0x1b, 0xdf, 0x1f, 0x2b, 0x79, 0x5e, 0xc9, 0xa6, 0xd6, 0x07, + 0x21, 0x87, 0xea, 0xf6, 0x51, 0x1b, 0x3f, 0x0f, 0xa5, 0xac, 0xdc, 0x42, 0x69, 0xa7, 0x9d, 0x4a, + 0x71, 0x19, 0x3e, 0x12, 0x25, 0x48, 0xd3, 0xf1, 0xe8, 0xdd, 0x34, 0x1b, 0xbd, 0x86, 0xc2, 0x7a, + 0xe3, 0x97, 0xe3, 0xeb, 0xec, 0xa2, 0xf5, 0x6c, 0xac, 0xbe, 0x11, 0x13, 0xf1, 0x70, 0xf9, 0x76, + 0xa2, 0xa7, 0xab, 0xef, 0x4d, 0x0e, 0x5f, 0x5d, 0x0e, 0xeb, 0x2e, 0x87, 0x4d, 0x97, 0xc3, 0xea, + 0x67, 0x02, 0xcf, 0x72, 0xdb, 0x23, 0xec, 0x7a, 0x84, 0x7d, 0x8f, 0xb0, 0x8a, 0x28, 0xb6, 0x11, + 0xc5, 0x2e, 0xa2, 0xd8, 0x47, 0x14, 0xbf, 0x11, 0xc5, 0xfa, 0x0f, 0xe1, 0x7d, 0x34, 0x3c, 0xf6, + 0x1f, 0x00, 0x00, 0xff, 0xff, 0x3c, 0x08, 0x88, 0x49, 0x0e, 0x01, 0x00, 0x00, } diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto index 31a46a6d..2c615d51 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto @@ -21,8 +21,6 @@ syntax = 'proto2'; package k8s.io.apimachinery.pkg.api.resource; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; - // Package-wide variables from generator "generated". option go_package = "resource"; @@ -67,11 +65,6 @@ option go_package = "resource"; // 1.5 will be serialized as "1500m" // 1.5Gi will be serialized as "1536Mi" // -// NOTE: We reserve the right to amend this canonical format, perhaps to -// allow 1.5 to be canonical. -// TODO: Remove above disclaimer after all bikeshedding about format is over, -// or after March 2015. -// // Note that the quantity will NEVER be internally represented by a // floating point number. That is the whole point of this exercise. // diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/math_test.go b/vendor/k8s.io/apimachinery/pkg/api/resource/math_test.go new file mode 100644 index 00000000..070a0c23 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/math_test.go @@ -0,0 +1,211 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 resource + +import ( + "testing" +) + +func TestDetectOverflowAdd(t *testing.T) { + for _, test := range []struct { + a, b int64 + c int64 + ok bool + }{ + {0, 0, 0, true}, + {-1, 1, 0, true}, + {0, 1, 1, true}, + {2, 2, 4, true}, + {2, -2, 0, true}, + {-2, -2, -4, true}, + + {mostNegative, -1, 0, false}, + {mostNegative, 1, mostNegative + 1, true}, + {mostPositive, -1, mostPositive - 1, true}, + {mostPositive, 1, 0, false}, + + {mostNegative, mostPositive, -1, true}, + {mostPositive, mostNegative, -1, true}, + {mostPositive, mostPositive, 0, false}, + {mostNegative, mostNegative, 0, false}, + + {-mostPositive, mostNegative, 0, false}, + {mostNegative, -mostPositive, 0, false}, + {-mostPositive, -mostPositive, 0, false}, + } { + c, ok := int64Add(test.a, test.b) + if c != test.c { + t.Errorf("%v: unexpected result: %d", test, c) + } + if ok != test.ok { + t.Errorf("%v: unexpected overflow: %t", test, ok) + } + // addition is commutative + d, ok2 := int64Add(test.b, test.a) + if c != d || ok != ok2 { + t.Errorf("%v: not commutative: %d %t", test, d, ok2) + } + } +} + +func TestDetectOverflowMultiply(t *testing.T) { + for _, test := range []struct { + a, b int64 + c int64 + ok bool + }{ + {0, 0, 0, true}, + {-1, 1, -1, true}, + {-1, -1, 1, true}, + {1, 1, 1, true}, + {0, 1, 0, true}, + {1, 0, 0, true}, + {2, 2, 4, true}, + {2, -2, -4, true}, + {-2, -2, 4, true}, + + {mostNegative, -1, 0, false}, + {mostNegative, 1, mostNegative, true}, + {mostPositive, -1, -mostPositive, true}, + {mostPositive, 1, mostPositive, true}, + + {mostNegative, mostPositive, 0, false}, + {mostPositive, mostNegative, 0, false}, + {mostPositive, mostPositive, 1, false}, + {mostNegative, mostNegative, 0, false}, + + {-mostPositive, mostNegative, 0, false}, + {mostNegative, -mostPositive, 0, false}, + {-mostPositive, -mostPositive, 1, false}, + } { + c, ok := int64Multiply(test.a, test.b) + if c != test.c { + t.Errorf("%v: unexpected result: %d", test, c) + } + if ok != test.ok { + t.Errorf("%v: unexpected overflow: %t", test, ok) + } + // multiplication is commutative + d, ok2 := int64Multiply(test.b, test.a) + if c != d || ok != ok2 { + t.Errorf("%v: not commutative: %d %t", test, d, ok2) + } + } +} + +func TestDetectOverflowScale(t *testing.T) { + for _, a := range []int64{0, -1, 1, 10, -10, mostPositive, mostNegative, -mostPositive} { + for _, b := range []int64{1, 2, 10, 100, 1000, mostPositive} { + expect, expectOk := int64Multiply(a, b) + + c, ok := int64MultiplyScale(a, b) + if c != expect { + t.Errorf("%d*%d: unexpected result: %d", a, b, c) + } + if ok != expectOk { + t.Errorf("%d*%d: unexpected overflow: %t", a, b, ok) + } + } + for _, test := range []struct { + base int64 + fn func(a int64) (int64, bool) + }{ + {10, int64MultiplyScale10}, + {100, int64MultiplyScale100}, + {1000, int64MultiplyScale1000}, + } { + expect, expectOk := int64Multiply(a, test.base) + c, ok := test.fn(a) + if c != expect { + t.Errorf("%d*%d: unexpected result: %d", a, test.base, c) + } + if ok != expectOk { + t.Errorf("%d*%d: unexpected overflow: %t", a, test.base, ok) + } + } + } +} + +func TestRemoveInt64Factors(t *testing.T) { + for _, test := range []struct { + value int64 + max int64 + result int64 + scale int32 + }{ + {100, 10, 1, 2}, + {100, 10, 1, 2}, + {100, 100, 1, 1}, + {1, 10, 1, 0}, + } { + r, s := removeInt64Factors(test.value, test.max) + if r != test.result { + t.Errorf("%v: unexpected result: %d", test, r) + } + if s != test.scale { + t.Errorf("%v: unexpected scale: %d", test, s) + } + } +} + +func TestNegativeScaleInt64(t *testing.T) { + for _, test := range []struct { + base int64 + scale Scale + result int64 + exact bool + }{ + {1234567, 0, 1234567, true}, + {1234567, 1, 123457, false}, + {1234567, 2, 12346, false}, + {1234567, 3, 1235, false}, + {1234567, 4, 124, false}, + + {-1234567, 0, -1234567, true}, + {-1234567, 1, -123457, false}, + {-1234567, 2, -12346, false}, + {-1234567, 3, -1235, false}, + {-1234567, 4, -124, false}, + + {1000, 0, 1000, true}, + {1000, 1, 100, true}, + {1000, 2, 10, true}, + {1000, 3, 1, true}, + {1000, 4, 1, false}, + + {-1000, 0, -1000, true}, + {-1000, 1, -100, true}, + {-1000, 2, -10, true}, + {-1000, 3, -1, true}, + {-1000, 4, -1, false}, + + {0, 0, 0, true}, + {0, 1, 0, true}, + {0, 2, 0, true}, + + // negative scale is undefined behavior + {1000, -1, 1000, true}, + } { + result, exact := negativeScaleInt64(test.base, test.scale) + if result != test.result { + t.Errorf("%v: unexpected result: %d", test, result) + } + if exact != test.exact { + t.Errorf("%v: unexpected exact: %t", test, exact) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go index c3cd1396..b155a62a 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go @@ -21,7 +21,6 @@ import ( "errors" "fmt" "math/big" - "regexp" "strconv" "strings" @@ -69,11 +68,6 @@ import ( // 1.5 will be serialized as "1500m" // 1.5Gi will be serialized as "1536Mi" // -// NOTE: We reserve the right to amend this canonical format, perhaps to -// allow 1.5 to be canonical. -// TODO: Remove above disclaimer after all bikeshedding about format is over, -// or after March 2015. -// // Note that the quantity will NEVER be internally represented by a // floating point number. That is the whole point of this exercise. // @@ -142,9 +136,6 @@ const ( ) var ( - // splitRE is used to get the various parts of a number. - splitRE = regexp.MustCompile(splitREString) - // Errors that could happen while parsing a string. ErrFormatWrong = errors.New("quantities must match the regular expression '" + splitREString + "'") ErrNumeric = errors.New("unable to parse numeric part of quantity") @@ -506,7 +497,7 @@ func (q *Quantity) Sign() int { return q.i.Sign() } -// AsScaled returns the current value, rounded up to the provided scale, and returns +// AsScale returns the current value, rounded up to the provided scale, and returns // false if the scale resulted in a loss of precision. func (q *Quantity) AsScale(scale Scale) (CanonicalValue, bool) { if q.d.Dec != nil { diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_example_test.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_example_test.go new file mode 100644 index 00000000..56a7dbe0 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_example_test.go @@ -0,0 +1,59 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 resource_test + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/api/resource" +) + +func ExampleFormat() { + memorySize := resource.NewQuantity(5*1024*1024*1024, resource.BinarySI) + fmt.Printf("memorySize = %v\n", memorySize) + + diskSize := resource.NewQuantity(5*1000*1000*1000, resource.DecimalSI) + fmt.Printf("diskSize = %v\n", diskSize) + + cores := resource.NewMilliQuantity(5300, resource.DecimalSI) + fmt.Printf("cores = %v\n", cores) + + // Output: + // memorySize = 5Gi + // diskSize = 5G + // cores = 5300m +} + +func ExampleMustParse() { + memorySize := resource.MustParse("5Gi") + fmt.Printf("memorySize = %v (%v)\n", memorySize.Value(), memorySize.Format) + + diskSize := resource.MustParse("5G") + fmt.Printf("diskSize = %v (%v)\n", diskSize.Value(), diskSize.Format) + + cores := resource.MustParse("5300m") + fmt.Printf("milliCores = %v (%v)\n", cores.MilliValue(), cores.Format) + + cores2 := resource.MustParse("5.4") + fmt.Printf("milliCores = %v (%v)\n", cores2.MilliValue(), cores2.Format) + + // Output: + // memorySize = 5368709120 (BinarySI) + // diskSize = 5000000000 (DecimalSI) + // milliCores = 5300 (DecimalSI) + // milliCores = 5400 (DecimalSI) +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto_test.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto_test.go new file mode 100644 index 00000000..574a3cf5 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto_test.go @@ -0,0 +1,103 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 resource + +import ( + "testing" + + inf "gopkg.in/inf.v0" +) + +func TestQuantityProtoMarshal(t *testing.T) { + // Test when d is nil + table := []struct { + quantity string + expect Quantity + }{ + {"0", Quantity{i: int64Amount{value: 0, scale: 0}, s: "0", Format: DecimalSI}}, + {"100m", Quantity{i: int64Amount{value: 100, scale: -3}, s: "100m", Format: DecimalSI}}, + {"50m", Quantity{i: int64Amount{value: 50, scale: -3}, s: "50m", Format: DecimalSI}}, + {"10000T", Quantity{i: int64Amount{value: 10000, scale: 12}, s: "10000T", Format: DecimalSI}}, + } + for _, testCase := range table { + q := MustParse(testCase.quantity) + // Won't currently get an error as MarshalTo can't return one + result, _ := q.Marshal() + q.MarshalTo(result) + if q.Cmp(testCase.expect) != 0 { + t.Errorf("Expected: %v, Actual: %v", testCase.expect, q) + } + } + // Test when i is {0,0} + table2 := []struct { + dec *inf.Dec + expect Quantity + }{ + {dec(0, 0).Dec, Quantity{i: int64Amount{value: 0, scale: 0}, d: infDecAmount{dec(0, 0).Dec}, s: "0", Format: DecimalSI}}, + {dec(10, 0).Dec, Quantity{i: int64Amount{value: 0, scale: 0}, d: infDecAmount{dec(10, 0).Dec}, s: "10", Format: DecimalSI}}, + {dec(-10, 0).Dec, Quantity{i: int64Amount{value: 0, scale: 0}, d: infDecAmount{dec(-10, 0).Dec}, s: "-10", Format: DecimalSI}}, + } + for _, testCase := range table2 { + q := Quantity{d: infDecAmount{testCase.dec}, Format: DecimalSI} + // Won't currently get an error as MarshalTo can't return one + result, _ := q.Marshal() + q.Unmarshal(result) + if q.Cmp(testCase.expect) != 0 { + t.Errorf("Expected: %v, Actual: %v", testCase.expect, q) + } + } +} + +func TestQuantityProtoUnmarshal(t *testing.T) { + // Test when d is nil + table := []struct { + input Quantity + expect string + }{ + {Quantity{i: int64Amount{value: 0, scale: 0}, s: "0", Format: DecimalSI}, "0"}, + {Quantity{i: int64Amount{value: 100, scale: -3}, s: "100m", Format: DecimalSI}, "100m"}, + {Quantity{i: int64Amount{value: 50, scale: -3}, s: "50m", Format: DecimalSI}, "50m"}, + {Quantity{i: int64Amount{value: 10000, scale: 12}, s: "10000T", Format: DecimalSI}, "10000T"}, + } + for _, testCase := range table { + var inputQ Quantity + expectQ := MustParse(testCase.expect) + inputByteArray, _ := testCase.input.Marshal() + inputQ.Unmarshal(inputByteArray) + if inputQ.Cmp(expectQ) != 0 { + t.Errorf("Expected: %v, Actual: %v", inputQ, expectQ) + } + } + // Test when i is {0,0} + table2 := []struct { + input Quantity + expect *inf.Dec + }{ + {Quantity{i: int64Amount{value: 0, scale: 0}, d: infDecAmount{dec(0, 0).Dec}, s: "0", Format: DecimalSI}, dec(0, 0).Dec}, + {Quantity{i: int64Amount{value: 0, scale: 0}, d: infDecAmount{dec(10, 0).Dec}, s: "10", Format: DecimalSI}, dec(10, 0).Dec}, + {Quantity{i: int64Amount{value: 0, scale: 0}, d: infDecAmount{dec(-10, 0).Dec}, s: "-10", Format: DecimalSI}, dec(-10, 0).Dec}, + } + for _, testCase := range table2 { + var inputQ Quantity + expectQ := Quantity{d: infDecAmount{testCase.expect}, Format: DecimalSI} + inputByteArray, _ := testCase.input.Marshal() + inputQ.Unmarshal(inputByteArray) + if inputQ.Cmp(expectQ) != 0 { + t.Errorf("Expected: %v, Actual: %v", inputQ, expectQ) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go new file mode 100644 index 00000000..915b2444 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go @@ -0,0 +1,1352 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 resource + +import ( + "encoding/json" + "math/rand" + "strings" + "testing" + "unicode" + + fuzz "github.com/google/gofuzz" + + inf "gopkg.in/inf.v0" +) + +func amount(i int64, exponent int) infDecAmount { + // See the below test-- scale is the negative of an exponent. + return infDecAmount{inf.NewDec(i, inf.Scale(-exponent))} +} + +func dec(i int64, exponent int) infDecAmount { + // See the below test-- scale is the negative of an exponent. + return infDecAmount{inf.NewDec(i, inf.Scale(-exponent))} +} + +func decQuantity(i int64, exponent int, format Format) Quantity { + return Quantity{d: dec(i, exponent), Format: format} +} + +func intQuantity(i int64, exponent Scale, format Format) Quantity { + return Quantity{i: int64Amount{value: i, scale: exponent}, Format: format} +} + +func TestDec(t *testing.T) { + table := []struct { + got infDecAmount + expect string + }{ + {dec(1, 0), "1"}, + {dec(1, 1), "10"}, + {dec(5, 2), "500"}, + {dec(8, 3), "8000"}, + {dec(2, 0), "2"}, + {dec(1, -1), "0.1"}, + {dec(3, -2), "0.03"}, + {dec(4, -3), "0.004"}, + } + + for _, item := range table { + if e, a := item.expect, item.got.Dec.String(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + } +} + +// TestQuantityParseZero ensures that when a 0 quantity is passed, its string value is 0 +func TestQuantityParseZero(t *testing.T) { + zero := MustParse("0") + if expected, actual := "0", zero.String(); expected != actual { + t.Errorf("Expected %v, actual %v", expected, actual) + } +} + +// TestQuantityParseNonNumericPanic ensures that when a non-numeric string is parsed +// it panics +func TestQuantityParseNonNumericPanic(t *testing.T) { + defer func() { + if r := recover(); r == nil { + t.Errorf("MustParse did not panic") + } + }() + _ = MustParse("Non-Numeric") +} + +// TestQuantityAddZeroPreservesSuffix verifies that a suffix is preserved +// independent of the order of operations when adding a zero and non-zero val +func TestQuantityAddZeroPreservesSuffix(t *testing.T) { + testValues := []string{"100m", "1Gi"} + zero := MustParse("0") + for _, testValue := range testValues { + value := MustParse(testValue) + v1 := *value.Copy() + // ensure non-zero + zero = non-zero (suffix preserved) + v1.Add(zero) + // ensure zero + non-zero = non-zero (suffix preserved) + v2 := *zero.Copy() + v2.Add(value) + + if v1.String() != testValue { + t.Errorf("Expected %v, actual %v", testValue, v1.String()) + continue + } + if v2.String() != testValue { + t.Errorf("Expected %v, actual %v", testValue, v2.String()) + } + } +} + +// TestQuantitySubZeroPreservesSuffix verifies that a suffix is preserved +// independent of the order of operations when subtracting a zero and non-zero val +func TestQuantitySubZeroPreservesSuffix(t *testing.T) { + testValues := []string{"100m", "1Gi"} + zero := MustParse("0") + for _, testValue := range testValues { + value := MustParse(testValue) + v1 := *value.Copy() + // ensure non-zero - zero = non-zero (suffix preserved) + v1.Sub(zero) + // ensure we preserved the input value + if v1.String() != testValue { + t.Errorf("Expected %v, actual %v", testValue, v1.String()) + } + + // ensure zero - non-zero = -non-zero (suffix preserved) + v2 := *zero.Copy() + v2.Sub(value) + negVal := *value.Copy() + negVal.Neg() + if v2.String() != negVal.String() { + t.Errorf("Expected %v, actual %v", negVal.String(), v2.String()) + } + } +} + +// TestQuantityCanocicalizeZero verifies that you get 0 as canonical value if internal value is 0, and not 0 +func TestQuantityCanocicalizeZero(t *testing.T) { + val := MustParse("1000m") + val.i.Sub(int64Amount{value: 1}) + zero := Quantity{i: val.i, Format: DecimalSI} + if expected, actual := "0", zero.String(); expected != actual { + t.Errorf("Expected %v, actual %v", expected, actual) + } +} + +func TestQuantityCmp(t *testing.T) { + // Test when d is nil + table := []struct { + x string + y string + expect int + }{ + {"0", "0", 0}, + {"100m", "50m", 1}, + {"50m", "100m", -1}, + {"10000T", "100Gi", 1}, + } + for _, testCase := range table { + q1 := MustParse(testCase.x) + q2 := MustParse(testCase.y) + if result := q1.Cmp(q2); result != testCase.expect { + t.Errorf("X: %v, Y: %v, Expected: %v, Actual: %v", testCase.x, testCase.y, testCase.expect, result) + } + } + // Test when i is {0,0} + table2 := []struct { + x *inf.Dec + y *inf.Dec + expect int + }{ + {dec(0, 0).Dec, dec(0, 0).Dec, 0}, + {nil, dec(0, 0).Dec, 0}, + {dec(0, 0).Dec, nil, 0}, + {nil, nil, 0}, + {nil, dec(10, 0).Dec, -1}, + {nil, dec(-10, 0).Dec, 1}, + {dec(10, 0).Dec, nil, 1}, + {dec(-10, 0).Dec, nil, -1}, + } + for _, testCase := range table2 { + q1 := Quantity{d: infDecAmount{testCase.x}, Format: DecimalSI} + q2 := Quantity{d: infDecAmount{testCase.y}, Format: DecimalSI} + if result := q1.Cmp(q2); result != testCase.expect { + t.Errorf("X: %v, Y: %v, Expected: %v, Actual: %v", testCase.x, testCase.y, testCase.expect, result) + } + } +} + +func TestParseQuantityString(t *testing.T) { + table := []struct { + input string + positive bool + value string + num, denom, suffix string + }{ + {"0.025Ti", true, "0.025", "0", "025", "Ti"}, + {"1.025Ti", true, "1.025", "1", "025", "Ti"}, + {"-1.025Ti", false, "-1.025", "1", "025", "Ti"}, + {".", true, ".", "0", "", ""}, + {"-.", false, "-.", "0", "", ""}, + {"1E-3", true, "1", "1", "", "E-3"}, + } + for _, test := range table { + positive, value, num, denom, suffix, err := parseQuantityString(test.input) + if err != nil { + t.Errorf("%s: error: %v", test.input, err) + continue + } + if positive != test.positive || value != test.value || num != test.num || denom != test.denom || suffix != test.suffix { + t.Errorf("%s: unmatched: %t %q %q %q %q", test.input, positive, value, num, denom, suffix) + } + } +} + +func TestQuantityParse(t *testing.T) { + if _, err := ParseQuantity(""); err == nil { + t.Errorf("expected empty string to return error") + } + + table := []struct { + input string + expect Quantity + }{ + {"0", decQuantity(0, 0, DecimalSI)}, + {"0n", decQuantity(0, 0, DecimalSI)}, + {"0u", decQuantity(0, 0, DecimalSI)}, + {"0m", decQuantity(0, 0, DecimalSI)}, + {"0Ki", decQuantity(0, 0, BinarySI)}, + {"0k", decQuantity(0, 0, DecimalSI)}, + {"0Mi", decQuantity(0, 0, BinarySI)}, + {"0M", decQuantity(0, 0, DecimalSI)}, + {"0Gi", decQuantity(0, 0, BinarySI)}, + {"0G", decQuantity(0, 0, DecimalSI)}, + {"0Ti", decQuantity(0, 0, BinarySI)}, + {"0T", decQuantity(0, 0, DecimalSI)}, + + // Quantity less numbers are allowed + {"1", decQuantity(1, 0, DecimalSI)}, + + // Binary suffixes + {"1Ki", decQuantity(1024, 0, BinarySI)}, + {"8Ki", decQuantity(8*1024, 0, BinarySI)}, + {"7Mi", decQuantity(7*1024*1024, 0, BinarySI)}, + {"6Gi", decQuantity(6*1024*1024*1024, 0, BinarySI)}, + {"5Ti", decQuantity(5*1024*1024*1024*1024, 0, BinarySI)}, + {"4Pi", decQuantity(4*1024*1024*1024*1024*1024, 0, BinarySI)}, + {"3Ei", decQuantity(3*1024*1024*1024*1024*1024*1024, 0, BinarySI)}, + + {"10Ti", decQuantity(10*1024*1024*1024*1024, 0, BinarySI)}, + {"100Ti", decQuantity(100*1024*1024*1024*1024, 0, BinarySI)}, + + // Decimal suffixes + {"5n", decQuantity(5, -9, DecimalSI)}, + {"4u", decQuantity(4, -6, DecimalSI)}, + {"3m", decQuantity(3, -3, DecimalSI)}, + {"9", decQuantity(9, 0, DecimalSI)}, + {"8k", decQuantity(8, 3, DecimalSI)}, + {"50k", decQuantity(5, 4, DecimalSI)}, + {"7M", decQuantity(7, 6, DecimalSI)}, + {"6G", decQuantity(6, 9, DecimalSI)}, + {"5T", decQuantity(5, 12, DecimalSI)}, + {"40T", decQuantity(4, 13, DecimalSI)}, + {"300T", decQuantity(3, 14, DecimalSI)}, + {"2P", decQuantity(2, 15, DecimalSI)}, + {"1E", decQuantity(1, 18, DecimalSI)}, + + // Decimal exponents + {"1E-3", decQuantity(1, -3, DecimalExponent)}, + {"1e3", decQuantity(1, 3, DecimalExponent)}, + {"1E6", decQuantity(1, 6, DecimalExponent)}, + {"1e9", decQuantity(1, 9, DecimalExponent)}, + {"1E12", decQuantity(1, 12, DecimalExponent)}, + {"1e15", decQuantity(1, 15, DecimalExponent)}, + {"1E18", decQuantity(1, 18, DecimalExponent)}, + + // Nonstandard but still parsable + {"1e14", decQuantity(1, 14, DecimalExponent)}, + {"1e13", decQuantity(1, 13, DecimalExponent)}, + {"1e3", decQuantity(1, 3, DecimalExponent)}, + {"100.035k", decQuantity(100035, 0, DecimalSI)}, + + // Things that look like floating point + {"0.001", decQuantity(1, -3, DecimalSI)}, + {"0.0005k", decQuantity(5, -1, DecimalSI)}, + {"0.005", decQuantity(5, -3, DecimalSI)}, + {"0.05", decQuantity(5, -2, DecimalSI)}, + {"0.5", decQuantity(5, -1, DecimalSI)}, + {"0.00050k", decQuantity(5, -1, DecimalSI)}, + {"0.00500", decQuantity(5, -3, DecimalSI)}, + {"0.05000", decQuantity(5, -2, DecimalSI)}, + {"0.50000", decQuantity(5, -1, DecimalSI)}, + {"0.5e0", decQuantity(5, -1, DecimalExponent)}, + {"0.5e-1", decQuantity(5, -2, DecimalExponent)}, + {"0.5e-2", decQuantity(5, -3, DecimalExponent)}, + {"0.5e0", decQuantity(5, -1, DecimalExponent)}, + {"10.035M", decQuantity(10035, 3, DecimalSI)}, + + {"1.2e3", decQuantity(12, 2, DecimalExponent)}, + {"1.3E+6", decQuantity(13, 5, DecimalExponent)}, + {"1.40e9", decQuantity(14, 8, DecimalExponent)}, + {"1.53E12", decQuantity(153, 10, DecimalExponent)}, + {"1.6e15", decQuantity(16, 14, DecimalExponent)}, + {"1.7E18", decQuantity(17, 17, DecimalExponent)}, + + {"9.01", decQuantity(901, -2, DecimalSI)}, + {"8.1k", decQuantity(81, 2, DecimalSI)}, + {"7.123456M", decQuantity(7123456, 0, DecimalSI)}, + {"6.987654321G", decQuantity(6987654321, 0, DecimalSI)}, + {"5.444T", decQuantity(5444, 9, DecimalSI)}, + {"40.1T", decQuantity(401, 11, DecimalSI)}, + {"300.2T", decQuantity(3002, 11, DecimalSI)}, + {"2.5P", decQuantity(25, 14, DecimalSI)}, + {"1.01E", decQuantity(101, 16, DecimalSI)}, + + // Things that saturate/round + {"3.001n", decQuantity(4, -9, DecimalSI)}, + {"1.1E-9", decQuantity(2, -9, DecimalExponent)}, + {"0.0000000001", decQuantity(1, -9, DecimalSI)}, + {"0.0000000005", decQuantity(1, -9, DecimalSI)}, + {"0.00000000050", decQuantity(1, -9, DecimalSI)}, + {"0.5e-9", decQuantity(1, -9, DecimalExponent)}, + {"0.9n", decQuantity(1, -9, DecimalSI)}, + {"0.00000012345", decQuantity(124, -9, DecimalSI)}, + {"0.00000012354", decQuantity(124, -9, DecimalSI)}, + {"9Ei", Quantity{d: maxAllowed, Format: BinarySI}}, + {"9223372036854775807Ki", Quantity{d: maxAllowed, Format: BinarySI}}, + {"12E", decQuantity(12, 18, DecimalSI)}, + + // We'll accept fractional binary stuff, too. + {"100.035Ki", decQuantity(10243584, -2, BinarySI)}, + {"0.5Mi", decQuantity(.5*1024*1024, 0, BinarySI)}, + {"0.05Gi", decQuantity(536870912, -1, BinarySI)}, + {"0.025Ti", decQuantity(274877906944, -1, BinarySI)}, + + // Things written by trolls + {"0.000000000001Ki", decQuantity(2, -9, DecimalSI)}, // rounds up, changes format + {".001", decQuantity(1, -3, DecimalSI)}, + {".0001k", decQuantity(100, -3, DecimalSI)}, + {"1.", decQuantity(1, 0, DecimalSI)}, + {"1.G", decQuantity(1, 9, DecimalSI)}, + } + + for _, asDec := range []bool{false, true} { + for _, item := range table { + got, err := ParseQuantity(item.input) + if err != nil { + t.Errorf("%v: unexpected error: %v", item.input, err) + continue + } + if asDec { + got.AsDec() + } + + if e, a := item.expect, got; e.Cmp(a) != 0 { + t.Errorf("%v: expected %v, got %v", item.input, e.String(), a.String()) + } + if e, a := item.expect.Format, got.Format; e != a { + t.Errorf("%v: expected %#v, got %#v", item.input, e, a) + } + + if asDec { + if i, ok := got.AsInt64(); i != 0 || ok { + t.Errorf("%v: expected inf.Dec to return false for AsInt64: %d", item.input, i) + } + continue + } + i, ok := item.expect.AsInt64() + if !ok { + continue + } + j, ok := got.AsInt64() + if !ok { + if got.d.Dec == nil && got.i.scale >= 0 { + t.Errorf("%v: is an int64Amount, but can't return AsInt64: %v", item.input, got) + } + continue + } + if i != j { + t.Errorf("%v: expected equivalent representation as int64: %d %d", item.input, i, j) + } + } + + for _, item := range table { + got, err := ParseQuantity(item.input) + if err != nil { + t.Errorf("%v: unexpected error: %v", item.input, err) + continue + } + + if asDec { + got.AsDec() + } + + // verify that we can decompose the input and get the same result by building up from the base. + positive, _, num, denom, suffix, err := parseQuantityString(item.input) + if err != nil { + t.Errorf("%v: unexpected error: %v", item.input, err) + continue + } + if got.Sign() >= 0 && !positive || got.Sign() < 0 && positive { + t.Errorf("%v: positive was incorrect: %t", item.input, positive) + continue + } + var value string + if !positive { + value = "-" + } + value += num + if len(denom) > 0 { + value += "." + denom + } + value += suffix + if len(value) == 0 { + t.Errorf("%v: did not parse correctly, %q %q %q", item.input, num, denom, suffix) + } + expected, err := ParseQuantity(value) + if err != nil { + t.Errorf("%v: unexpected error for %s: %v", item.input, value, err) + continue + } + if expected.Cmp(got) != 0 { + t.Errorf("%v: not the same as %s", item.input, value) + continue + } + } + + // Try the negative version of everything + desired := &inf.Dec{} + expect := Quantity{d: infDecAmount{Dec: desired}} + for _, item := range table { + got, err := ParseQuantity("-" + strings.TrimLeftFunc(item.input, unicode.IsSpace)) + if err != nil { + t.Errorf("-%v: unexpected error: %v", item.input, err) + continue + } + if asDec { + got.AsDec() + } + + expected := item.expect + desired.Neg(expected.AsDec()) + + if e, a := expect, got; e.Cmp(a) != 0 { + t.Errorf("%v: expected %s, got %s", item.input, e.String(), a.String()) + } + if e, a := expected.Format, got.Format; e != a { + t.Errorf("%v: expected %#v, got %#v", item.input, e, a) + } + } + + // Try everything with an explicit + + for _, item := range table { + got, err := ParseQuantity("+" + strings.TrimLeftFunc(item.input, unicode.IsSpace)) + if err != nil { + t.Errorf("-%v: unexpected error: %v", item.input, err) + continue + } + if asDec { + got.AsDec() + } + + if e, a := item.expect, got; e.Cmp(a) != 0 { + t.Errorf("%v(%t): expected %s, got %s", item.input, asDec, e.String(), a.String()) + } + if e, a := item.expect.Format, got.Format; e != a { + t.Errorf("%v: expected %#v, got %#v", item.input, e, a) + } + } + } + + invalid := []string{ + "1.1.M", + "1+1.0M", + "0.1mi", + "0.1am", + "aoeu", + ".5i", + "1i", + "-3.01i", + "-3.01e-", + + // trailing whitespace is forbidden + " 1", + "1 ", + } + for _, item := range invalid { + _, err := ParseQuantity(item) + if err == nil { + t.Errorf("%v parsed unexpectedly", item) + } + } +} + +func TestQuantityRoundUp(t *testing.T) { + table := []struct { + in string + scale Scale + expect Quantity + ok bool + }{ + {"9.01", -3, decQuantity(901, -2, DecimalSI), true}, + {"9.01", -2, decQuantity(901, -2, DecimalSI), true}, + {"9.01", -1, decQuantity(91, -1, DecimalSI), false}, + {"9.01", 0, decQuantity(10, 0, DecimalSI), false}, + {"9.01", 1, decQuantity(10, 0, DecimalSI), false}, + {"9.01", 2, decQuantity(100, 0, DecimalSI), false}, + + {"-9.01", -3, decQuantity(-901, -2, DecimalSI), true}, + {"-9.01", -2, decQuantity(-901, -2, DecimalSI), true}, + {"-9.01", -1, decQuantity(-91, -1, DecimalSI), false}, + {"-9.01", 0, decQuantity(-10, 0, DecimalSI), false}, + {"-9.01", 1, decQuantity(-10, 0, DecimalSI), false}, + {"-9.01", 2, decQuantity(-100, 0, DecimalSI), false}, + } + + for _, asDec := range []bool{false, true} { + for _, item := range table { + got, err := ParseQuantity(item.in) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + expect := *item.expect.Copy() + if asDec { + got.AsDec() + } + if ok := got.RoundUp(item.scale); ok != item.ok { + t.Errorf("%s(%d,%t): unexpected ok: %t", item.in, item.scale, asDec, ok) + } + if got.Cmp(expect) != 0 { + t.Errorf("%s(%d,%t): unexpected round: %s vs %s", item.in, item.scale, asDec, got.String(), expect.String()) + } + } + } +} + +func TestQuantityCmpInt64AndDec(t *testing.T) { + table := []struct { + a, b Quantity + cmp int + }{ + {intQuantity(901, -2, DecimalSI), intQuantity(901, -2, DecimalSI), 0}, + {intQuantity(90, -1, DecimalSI), intQuantity(901, -2, DecimalSI), -1}, + {intQuantity(901, -2, DecimalSI), intQuantity(900, -2, DecimalSI), 1}, + {intQuantity(0, 0, DecimalSI), intQuantity(0, 0, DecimalSI), 0}, + {intQuantity(0, 1, DecimalSI), intQuantity(0, -1, DecimalSI), 0}, + {intQuantity(0, -1, DecimalSI), intQuantity(0, 1, DecimalSI), 0}, + {intQuantity(800, -3, DecimalSI), intQuantity(1, 0, DecimalSI), -1}, + {intQuantity(800, -3, DecimalSI), intQuantity(79, -2, DecimalSI), 1}, + + {intQuantity(mostPositive, 0, DecimalSI), intQuantity(1, -1, DecimalSI), 1}, + {intQuantity(mostPositive, 1, DecimalSI), intQuantity(1, 0, DecimalSI), 1}, + {intQuantity(mostPositive, 1, DecimalSI), intQuantity(1, 1, DecimalSI), 1}, + {intQuantity(mostPositive, 1, DecimalSI), intQuantity(0, 1, DecimalSI), 1}, + {intQuantity(mostPositive, -16, DecimalSI), intQuantity(1, 3, DecimalSI), -1}, + + {intQuantity(mostNegative, 0, DecimalSI), intQuantity(0, 0, DecimalSI), -1}, + {intQuantity(mostNegative, -18, DecimalSI), intQuantity(-1, 0, DecimalSI), -1}, + {intQuantity(mostNegative, -19, DecimalSI), intQuantity(-1, 0, DecimalSI), 1}, + + {intQuantity(1*1000000*1000000*1000000, -17, DecimalSI), intQuantity(1, 1, DecimalSI), 0}, + {intQuantity(1*1000000*1000000*1000000, -17, DecimalSI), intQuantity(-10, 0, DecimalSI), 1}, + {intQuantity(-1*1000000*1000000*1000000, -17, DecimalSI), intQuantity(-10, 0, DecimalSI), 0}, + {intQuantity(1*1000000*1000000*1000000, -17, DecimalSI), intQuantity(1, 0, DecimalSI), 1}, + + {intQuantity(1*1000000*1000000*1000000+1, -17, DecimalSI), intQuantity(1, 1, DecimalSI), 1}, + {intQuantity(1*1000000*1000000*1000000-1, -17, DecimalSI), intQuantity(1, 1, DecimalSI), -1}, + } + + for _, item := range table { + if cmp := item.a.Cmp(item.b); cmp != item.cmp { + t.Errorf("%#v: unexpected Cmp: %d", item, cmp) + } + if cmp := item.b.Cmp(item.a); cmp != -item.cmp { + t.Errorf("%#v: unexpected inverted Cmp: %d", item, cmp) + } + } + + for _, item := range table { + a, b := *item.a.Copy(), *item.b.Copy() + a.AsDec() + if cmp := a.Cmp(b); cmp != item.cmp { + t.Errorf("%#v: unexpected Cmp: %d", item, cmp) + } + if cmp := b.Cmp(a); cmp != -item.cmp { + t.Errorf("%#v: unexpected inverted Cmp: %d", item, cmp) + } + } + + for _, item := range table { + a, b := *item.a.Copy(), *item.b.Copy() + b.AsDec() + if cmp := a.Cmp(b); cmp != item.cmp { + t.Errorf("%#v: unexpected Cmp: %d", item, cmp) + } + if cmp := b.Cmp(a); cmp != -item.cmp { + t.Errorf("%#v: unexpected inverted Cmp: %d", item, cmp) + } + } + + for _, item := range table { + a, b := *item.a.Copy(), *item.b.Copy() + a.AsDec() + b.AsDec() + if cmp := a.Cmp(b); cmp != item.cmp { + t.Errorf("%#v: unexpected Cmp: %d", item, cmp) + } + if cmp := b.Cmp(a); cmp != -item.cmp { + t.Errorf("%#v: unexpected inverted Cmp: %d", item, cmp) + } + } +} + +func TestQuantityNeg(t *testing.T) { + table := []struct { + a Quantity + out string + }{ + {intQuantity(901, -2, DecimalSI), "-9010m"}, + {decQuantity(901, -2, DecimalSI), "-9010m"}, + } + + for i, item := range table { + out := *item.a.Copy() + out.Neg() + if out.Cmp(item.a) == 0 { + t.Errorf("%d: negating an item should not mutate the source: %s", i, out.String()) + } + if out.String() != item.out { + t.Errorf("%d: negating did not equal exact value: %s", i, out.String()) + } + } +} + +func TestQuantityString(t *testing.T) { + table := []struct { + in Quantity + expect string + alternate string + }{ + {decQuantity(1024*1024*1024, 0, BinarySI), "1Gi", "1024Mi"}, + {decQuantity(300*1024*1024, 0, BinarySI), "300Mi", "307200Ki"}, + {decQuantity(6*1024, 0, BinarySI), "6Ki", ""}, + {decQuantity(1001*1024*1024*1024, 0, BinarySI), "1001Gi", "1025024Mi"}, + {decQuantity(1024*1024*1024*1024, 0, BinarySI), "1Ti", "1024Gi"}, + {decQuantity(5, 0, BinarySI), "5", "5000m"}, + {decQuantity(500, -3, BinarySI), "500m", "0.5"}, + {decQuantity(1, 9, DecimalSI), "1G", "1000M"}, + {decQuantity(1000, 6, DecimalSI), "1G", "0.001T"}, + {decQuantity(1000000, 3, DecimalSI), "1G", ""}, + {decQuantity(1000000000, 0, DecimalSI), "1G", ""}, + {decQuantity(1, -3, DecimalSI), "1m", "1000u"}, + {decQuantity(80, -3, DecimalSI), "80m", ""}, + {decQuantity(1080, -3, DecimalSI), "1080m", "1.08"}, + {decQuantity(108, -2, DecimalSI), "1080m", "1080000000n"}, + {decQuantity(10800, -4, DecimalSI), "1080m", ""}, + {decQuantity(300, 6, DecimalSI), "300M", ""}, + {decQuantity(1, 12, DecimalSI), "1T", ""}, + {decQuantity(1234567, 6, DecimalSI), "1234567M", ""}, + {decQuantity(1234567, -3, BinarySI), "1234567m", ""}, + {decQuantity(3, 3, DecimalSI), "3k", ""}, + {decQuantity(1025, 0, BinarySI), "1025", ""}, + {decQuantity(0, 0, DecimalSI), "0", ""}, + {decQuantity(0, 0, BinarySI), "0", ""}, + {decQuantity(1, 9, DecimalExponent), "1e9", ".001e12"}, + {decQuantity(1, -3, DecimalExponent), "1e-3", "0.001e0"}, + {decQuantity(1, -9, DecimalExponent), "1e-9", "1000e-12"}, + {decQuantity(80, -3, DecimalExponent), "80e-3", ""}, + {decQuantity(300, 6, DecimalExponent), "300e6", ""}, + {decQuantity(1, 12, DecimalExponent), "1e12", ""}, + {decQuantity(1, 3, DecimalExponent), "1e3", ""}, + {decQuantity(3, 3, DecimalExponent), "3e3", ""}, + {decQuantity(3, 3, DecimalSI), "3k", ""}, + {decQuantity(0, 0, DecimalExponent), "0", "00"}, + {decQuantity(1, -9, DecimalSI), "1n", ""}, + {decQuantity(80, -9, DecimalSI), "80n", ""}, + {decQuantity(1080, -9, DecimalSI), "1080n", ""}, + {decQuantity(108, -8, DecimalSI), "1080n", ""}, + {decQuantity(10800, -10, DecimalSI), "1080n", ""}, + {decQuantity(1, -6, DecimalSI), "1u", ""}, + {decQuantity(80, -6, DecimalSI), "80u", ""}, + {decQuantity(1080, -6, DecimalSI), "1080u", ""}, + } + for _, item := range table { + got := item.in.String() + if e, a := item.expect, got; e != a { + t.Errorf("%#v: expected %v, got %v", item.in, e, a) + } + q, err := ParseQuantity(item.expect) + if err != nil { + t.Errorf("%#v: unexpected error: %v", item.expect, err) + } + if len(q.s) == 0 || q.s != item.expect { + t.Errorf("%#v: did not copy canonical string on parse: %s", item.expect, q.s) + } + if len(item.alternate) == 0 { + continue + } + q, err = ParseQuantity(item.alternate) + if err != nil { + t.Errorf("%#v: unexpected error: %v", item.expect, err) + continue + } + if len(q.s) != 0 { + t.Errorf("%#v: unexpected nested string: %v", item.expect, q.s) + } + if q.String() != item.expect { + t.Errorf("%#v: unexpected alternate canonical: %v", item.expect, q.String()) + } + if len(q.s) == 0 || q.s != item.expect { + t.Errorf("%#v: did not set canonical string on ToString: %s", item.expect, q.s) + } + } + desired := &inf.Dec{} // Avoid modifying the values in the table. + for _, item := range table { + if item.in.Cmp(Quantity{}) == 0 { + // Don't expect it to print "-0" ever + continue + } + q := item.in + q.d = infDecAmount{desired.Neg(q.AsDec())} + if e, a := "-"+item.expect, q.String(); e != a { + t.Errorf("%#v: expected %v, got %v", item.in, e, a) + } + } +} + +func TestQuantityParseEmit(t *testing.T) { + table := []struct { + in string + expect string + }{ + {"1Ki", "1Ki"}, + {"1Mi", "1Mi"}, + {"1Gi", "1Gi"}, + {"1024Mi", "1Gi"}, + {"1000M", "1G"}, + {".001Ki", "1024m"}, + {".000001Ki", "1024u"}, + {".000000001Ki", "1024n"}, + {".000000000001Ki", "2n"}, + } + + for _, item := range table { + q, err := ParseQuantity(item.in) + if err != nil { + t.Errorf("Couldn't parse %v", item.in) + continue + } + if e, a := item.expect, q.String(); e != a { + t.Errorf("%#v: expected %v, got %v", item.in, e, a) + } + } + for _, item := range table { + q, err := ParseQuantity("-" + item.in) + if err != nil { + t.Errorf("Couldn't parse %v", item.in) + continue + } + if q.Cmp(Quantity{}) == 0 { + continue + } + if e, a := "-"+item.expect, q.String(); e != a { + t.Errorf("%#v: expected %v, got %v (%#v)", item.in, e, a, q.i) + } + } +} + +var fuzzer = fuzz.New().Funcs( + func(q *Quantity, c fuzz.Continue) { + q.i = Zero + if c.RandBool() { + q.Format = BinarySI + if c.RandBool() { + dec := &inf.Dec{} + q.d = infDecAmount{Dec: dec} + dec.SetScale(0) + dec.SetUnscaled(c.Int63()) + return + } + // Be sure to test cases like 1Mi + dec := &inf.Dec{} + q.d = infDecAmount{Dec: dec} + dec.SetScale(0) + dec.SetUnscaled(c.Int63n(1024) << uint(10*c.Intn(5))) + return + } + if c.RandBool() { + q.Format = DecimalSI + } else { + q.Format = DecimalExponent + } + if c.RandBool() { + dec := &inf.Dec{} + q.d = infDecAmount{Dec: dec} + dec.SetScale(inf.Scale(c.Intn(4))) + dec.SetUnscaled(c.Int63()) + return + } + // Be sure to test cases like 1M + dec := &inf.Dec{} + q.d = infDecAmount{Dec: dec} + dec.SetScale(inf.Scale(3 - c.Intn(15))) + dec.SetUnscaled(c.Int63n(1000)) + }, +) + +func TestQuantityDeepCopy(t *testing.T) { + // Test when d is nil + slice := []string{"0", "100m", "50m", "10000T"} + for _, testCase := range slice { + q := MustParse(testCase) + if result := q.DeepCopy(); result != q { + t.Errorf("Expected: %v, Actual: %v", q, result) + } + } + table := []*inf.Dec{ + dec(0, 0).Dec, + dec(10, 0).Dec, + dec(-10, 0).Dec, + } + // Test when i is {0,0} + for _, testCase := range table { + q := Quantity{d: infDecAmount{testCase}, Format: DecimalSI} + result := q.DeepCopy() + if q.d.Cmp(result.AsDec()) != 0 { + t.Errorf("Expected: %v, Actual: %v", q.String(), result.String()) + } + result = Quantity{d: infDecAmount{dec(2, 0).Dec}, Format: DecimalSI} + if q.d.Cmp(result.AsDec()) == 0 { + t.Errorf("Modifying result has affected q") + } + } +} + +func TestJSON(t *testing.T) { + for i := 0; i < 500; i++ { + q := &Quantity{} + fuzzer.Fuzz(q) + b, err := json.Marshal(q) + if err != nil { + t.Errorf("error encoding %v: %v", q, err) + continue + } + q2 := &Quantity{} + err = json.Unmarshal(b, q2) + if err != nil { + t.Logf("%d: %s", i, string(b)) + t.Errorf("%v: error decoding %v: %v", q, string(b), err) + } + if q2.Cmp(*q) != 0 { + t.Errorf("Expected equal: %v, %v (json was '%v')", q, q2, string(b)) + } + } +} + +func TestJSONWhitespace(t *testing.T) { + q := Quantity{} + testCases := []struct { + in string + expect string + }{ + {`" 1"`, "1"}, + {`"1 "`, "1"}, + {`1`, "1"}, + {` 1`, "1"}, + {`1 `, "1"}, + {`10`, "10"}, + {`-1`, "-1"}, + {` -1`, "-1"}, + } + for _, test := range testCases { + if err := json.Unmarshal([]byte(test.in), &q); err != nil { + t.Errorf("%q: %v", test.in, err) + } + if q.String() != test.expect { + t.Errorf("unexpected string: %q", q.String()) + } + } +} + +func TestMilliNewSet(t *testing.T) { + table := []struct { + value int64 + format Format + expect string + exact bool + }{ + {1, DecimalSI, "1m", true}, + {1000, DecimalSI, "1", true}, + {1234000, DecimalSI, "1234", true}, + {1024, BinarySI, "1024m", false}, // Format changes + {1000000, "invalidFormatDefaultsToExponent", "1e3", true}, + {1024 * 1024, BinarySI, "1048576m", false}, // Format changes + } + + for _, item := range table { + q := NewMilliQuantity(item.value, item.format) + if e, a := item.expect, q.String(); e != a { + t.Errorf("Expected %v, got %v; %#v", e, a, q) + } + if !item.exact { + continue + } + q2, err := ParseQuantity(q.String()) + if err != nil { + t.Errorf("Round trip failed on %v", q) + } + if e, a := item.value, q2.MilliValue(); e != a { + t.Errorf("Expected %v, got %v", e, a) + } + } + + for _, item := range table { + q := NewQuantity(0, item.format) + q.SetMilli(item.value) + if e, a := item.expect, q.String(); e != a { + t.Errorf("Set: Expected %v, got %v; %#v", e, a, q) + } + } +} + +func TestNewSet(t *testing.T) { + table := []struct { + value int64 + format Format + expect string + }{ + {1, DecimalSI, "1"}, + {1000, DecimalSI, "1k"}, + {1234000, DecimalSI, "1234k"}, + {1024, BinarySI, "1Ki"}, + {1000000, "invalidFormatDefaultsToExponent", "1e6"}, + {1024 * 1024, BinarySI, "1Mi"}, + } + + for _, asDec := range []bool{false, true} { + for _, item := range table { + q := NewQuantity(item.value, item.format) + if asDec { + q.ToDec() + } + if e, a := item.expect, q.String(); e != a { + t.Errorf("Expected %v, got %v; %#v", e, a, q) + } + q2, err := ParseQuantity(q.String()) + if err != nil { + t.Errorf("Round trip failed on %v", q) + } + if e, a := item.value, q2.Value(); e != a { + t.Errorf("Expected %v, got %v", e, a) + } + } + + for _, item := range table { + q := NewQuantity(0, item.format) + q.Set(item.value) + if asDec { + q.ToDec() + } + if e, a := item.expect, q.String(); e != a { + t.Errorf("Set: Expected %v, got %v; %#v", e, a, q) + } + } + } +} + +func TestNewScaledSet(t *testing.T) { + table := []struct { + value int64 + scale Scale + expect string + }{ + {1, Nano, "1n"}, + {1000, Nano, "1u"}, + {1, Micro, "1u"}, + {1000, Micro, "1m"}, + {1, Milli, "1m"}, + {1000, Milli, "1"}, + {1, 0, "1"}, + {0, Nano, "0"}, + {0, Micro, "0"}, + {0, Milli, "0"}, + {0, 0, "0"}, + } + + for _, item := range table { + q := NewScaledQuantity(item.value, item.scale) + if e, a := item.expect, q.String(); e != a { + t.Errorf("Expected %v, got %v; %#v", e, a, q) + } + q2, err := ParseQuantity(q.String()) + if err != nil { + t.Errorf("Round trip failed on %v", q) + } + if e, a := item.value, q2.ScaledValue(item.scale); e != a { + t.Errorf("Expected %v, got %v", e, a) + } + q3 := NewQuantity(0, DecimalSI) + q3.SetScaled(item.value, item.scale) + if q.Cmp(*q3) != 0 { + t.Errorf("Expected %v and %v to be equal", q, q3) + } + } +} + +func TestScaledValue(t *testing.T) { + table := []struct { + fromScale Scale + toScale Scale + expected int64 + }{ + {Nano, Nano, 1}, + {Nano, Micro, 1}, + {Nano, Milli, 1}, + {Nano, 0, 1}, + {Micro, Nano, 1000}, + {Micro, Micro, 1}, + {Micro, Milli, 1}, + {Micro, 0, 1}, + {Milli, Nano, 1000 * 1000}, + {Milli, Micro, 1000}, + {Milli, Milli, 1}, + {Milli, 0, 1}, + {0, Nano, 1000 * 1000 * 1000}, + {0, Micro, 1000 * 1000}, + {0, Milli, 1000}, + {0, 0, 1}, + } + + for _, item := range table { + q := NewScaledQuantity(1, item.fromScale) + if e, a := item.expected, q.ScaledValue(item.toScale); e != a { + t.Errorf("%v to %v: Expected %v, got %v", item.fromScale, item.toScale, e, a) + } + } +} + +func TestUninitializedNoCrash(t *testing.T) { + var q Quantity + + q.Value() + q.MilliValue() + q.Copy() + _ = q.String() + q.MarshalJSON() +} + +func TestCopy(t *testing.T) { + q := NewQuantity(5, DecimalSI) + c := q.Copy() + c.Set(6) + if q.Value() == 6 { + t.Errorf("Copy didn't") + } +} + +func TestSub(t *testing.T) { + tests := []struct { + a Quantity + b Quantity + expected Quantity + }{ + {decQuantity(10, 0, DecimalSI), decQuantity(1, 1, DecimalSI), decQuantity(0, 0, DecimalSI)}, + {decQuantity(10, 0, DecimalSI), decQuantity(1, 0, BinarySI), decQuantity(9, 0, DecimalSI)}, + {decQuantity(10, 0, BinarySI), decQuantity(1, 0, DecimalSI), decQuantity(9, 0, BinarySI)}, + {Quantity{Format: DecimalSI}, decQuantity(50, 0, DecimalSI), decQuantity(-50, 0, DecimalSI)}, + {decQuantity(50, 0, DecimalSI), Quantity{Format: DecimalSI}, decQuantity(50, 0, DecimalSI)}, + {Quantity{Format: DecimalSI}, Quantity{Format: DecimalSI}, decQuantity(0, 0, DecimalSI)}, + } + + for i, test := range tests { + test.a.Sub(test.b) + if test.a.Cmp(test.expected) != 0 { + t.Errorf("[%d] Expected %q, got %q", i, test.expected.String(), test.a.String()) + } + } +} + +func TestNeg(t *testing.T) { + tests := []struct { + a Quantity + b Quantity + expected Quantity + }{ + {a: intQuantity(0, 0, DecimalSI), expected: intQuantity(0, 0, DecimalSI)}, + {a: Quantity{}, expected: Quantity{}}, + {a: intQuantity(10, 0, BinarySI), expected: intQuantity(-10, 0, BinarySI)}, + {a: intQuantity(-10, 0, BinarySI), expected: intQuantity(10, 0, BinarySI)}, + {a: decQuantity(0, 0, DecimalSI), expected: intQuantity(0, 0, DecimalSI)}, + {a: decQuantity(10, 0, BinarySI), expected: intQuantity(-10, 0, BinarySI)}, + {a: decQuantity(-10, 0, BinarySI), expected: intQuantity(10, 0, BinarySI)}, + } + + for i, test := range tests { + a := test.a.Copy() + a.Neg() + // ensure value is same + if a.Cmp(test.expected) != 0 { + t.Errorf("[%d] Expected %q, got %q", i, test.expected.String(), a.String()) + } + } +} + +func TestAdd(t *testing.T) { + tests := []struct { + a Quantity + b Quantity + expected Quantity + }{ + {decQuantity(10, 0, DecimalSI), decQuantity(1, 1, DecimalSI), decQuantity(20, 0, DecimalSI)}, + {decQuantity(10, 0, DecimalSI), decQuantity(1, 0, BinarySI), decQuantity(11, 0, DecimalSI)}, + {decQuantity(10, 0, BinarySI), decQuantity(1, 0, DecimalSI), decQuantity(11, 0, BinarySI)}, + {Quantity{Format: DecimalSI}, decQuantity(50, 0, DecimalSI), decQuantity(50, 0, DecimalSI)}, + {decQuantity(50, 0, DecimalSI), Quantity{Format: DecimalSI}, decQuantity(50, 0, DecimalSI)}, + {Quantity{Format: DecimalSI}, Quantity{Format: DecimalSI}, decQuantity(0, 0, DecimalSI)}, + } + + for i, test := range tests { + test.a.Add(test.b) + if test.a.Cmp(test.expected) != 0 { + t.Errorf("[%d] Expected %q, got %q", i, test.expected.String(), test.a.String()) + } + } +} + +func TestAddSubRoundTrip(t *testing.T) { + for k := -10; k <= 10; k++ { + q := Quantity{Format: DecimalSI} + var order []int64 + for i := 0; i < 100; i++ { + j := rand.Int63() + order = append(order, j) + q.Add(*NewScaledQuantity(j, Scale(k))) + } + for _, j := range order { + q.Sub(*NewScaledQuantity(j, Scale(k))) + } + if !q.IsZero() { + t.Errorf("addition and subtraction did not cancel: %s", &q) + } + } +} + +func TestAddSubRoundTripAcrossScales(t *testing.T) { + q := Quantity{Format: DecimalSI} + var order []int64 + for i := 0; i < 100; i++ { + j := rand.Int63() + order = append(order, j) + q.Add(*NewScaledQuantity(j, Scale(j%20-10))) + } + for _, j := range order { + q.Sub(*NewScaledQuantity(j, Scale(j%20-10))) + } + if !q.IsZero() { + t.Errorf("addition and subtraction did not cancel: %s", &q) + } +} + +func TestNegateRoundTrip(t *testing.T) { + for _, asDec := range []bool{false, true} { + for k := -10; k <= 10; k++ { + for i := 0; i < 100; i++ { + j := rand.Int63() + q := *NewScaledQuantity(j, Scale(k)) + if asDec { + q.AsDec() + } + + b := q.Copy() + b.Neg() + b.Neg() + if b.Cmp(q) != 0 { + t.Errorf("double negation did not cancel: %s", &q) + } + } + } + } +} +func benchmarkQuantities() []Quantity { + return []Quantity{ + intQuantity(1024*1024*1024, 0, BinarySI), + intQuantity(1024*1024*1024*1024, 0, BinarySI), + intQuantity(1000000, 3, DecimalSI), + intQuantity(1000000000, 0, DecimalSI), + intQuantity(1, -3, DecimalSI), + intQuantity(80, -3, DecimalSI), + intQuantity(1080, -3, DecimalSI), + intQuantity(0, 0, BinarySI), + intQuantity(1, 9, DecimalExponent), + intQuantity(1, -9, DecimalSI), + intQuantity(1000000, 10, DecimalSI), + } +} + +func BenchmarkQuantityString(b *testing.B) { + values := benchmarkQuantities() + b.ResetTimer() + var s string + for i := 0; i < b.N; i++ { + q := values[i%len(values)] + q.s = "" + s = q.String() + } + b.StopTimer() + if len(s) == 0 { + b.Fatal(s) + } +} + +func BenchmarkQuantityStringPrecalc(b *testing.B) { + values := benchmarkQuantities() + for i := range values { + _ = values[i].String() + } + b.ResetTimer() + var s string + for i := 0; i < b.N; i++ { + q := values[i%len(values)] + s = q.String() + } + b.StopTimer() + if len(s) == 0 { + b.Fatal(s) + } +} + +func BenchmarkQuantityStringBinarySI(b *testing.B) { + values := benchmarkQuantities() + for i := range values { + values[i].Format = BinarySI + } + b.ResetTimer() + var s string + for i := 0; i < b.N; i++ { + q := values[i%len(values)] + q.s = "" + s = q.String() + } + b.StopTimer() + if len(s) == 0 { + b.Fatal(s) + } +} + +func BenchmarkQuantityMarshalJSON(b *testing.B) { + values := benchmarkQuantities() + b.ResetTimer() + for i := 0; i < b.N; i++ { + q := values[i%len(values)] + q.s = "" + if _, err := q.MarshalJSON(); err != nil { + b.Fatal(err) + } + } + b.StopTimer() +} + +func BenchmarkQuantityUnmarshalJSON(b *testing.B) { + values := benchmarkQuantities() + var json [][]byte + for _, v := range values { + data, _ := v.MarshalJSON() + json = append(json, data) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + var q Quantity + if err := q.UnmarshalJSON(json[i%len(values)]); err != nil { + b.Fatal(err) + } + } + b.StopTimer() +} + +func BenchmarkParseQuantity(b *testing.B) { + values := benchmarkQuantities() + var strings []string + for _, v := range values { + strings = append(strings, v.String()) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + if _, err := ParseQuantity(strings[i%len(values)]); err != nil { + b.Fatal(err) + } + } + b.StopTimer() +} + +func BenchmarkCanonicalize(b *testing.B) { + values := benchmarkQuantities() + b.ResetTimer() + buffer := make([]byte, 0, 100) + for i := 0; i < b.N; i++ { + s, _ := values[i%len(values)].CanonicalizeBytes(buffer) + if len(s) == 0 { + b.Fatal(s) + } + } + b.StopTimer() +} + +func BenchmarkQuantityRoundUp(b *testing.B) { + values := benchmarkQuantities() + b.ResetTimer() + for i := 0; i < b.N; i++ { + q := values[i%len(values)] + copied := q + copied.RoundUp(-3) + } + b.StopTimer() +} + +func BenchmarkQuantityCopy(b *testing.B) { + values := benchmarkQuantities() + b.ResetTimer() + for i := 0; i < b.N; i++ { + values[i%len(values)].Copy() + } + b.StopTimer() +} + +func BenchmarkQuantityAdd(b *testing.B) { + values := benchmarkQuantities() + base := &Quantity{} + b.ResetTimer() + for i := 0; i < b.N; i++ { + q := values[i%len(values)] + base.d.Dec = nil + base.i = int64Amount{value: 100} + base.Add(q) + } + b.StopTimer() +} + +func BenchmarkQuantityCmp(b *testing.B) { + values := benchmarkQuantities() + b.ResetTimer() + for i := 0; i < b.N; i++ { + q := values[i%len(values)] + if q.Cmp(q) != 0 { + b.Fatal(q) + } + } + b.StopTimer() +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/scale_int_test.go b/vendor/k8s.io/apimachinery/pkg/api/resource/scale_int_test.go new file mode 100644 index 00000000..b150fa51 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/scale_int_test.go @@ -0,0 +1,85 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 resource + +import ( + "math" + "math/big" + "testing" +) + +func TestScaledValueInternal(t *testing.T) { + tests := []struct { + unscaled *big.Int + scale int + newScale int + + want int64 + }{ + // remain scale + {big.NewInt(1000), 0, 0, 1000}, + + // scale down + {big.NewInt(1000), 0, -3, 1}, + {big.NewInt(1000), 3, 0, 1}, + {big.NewInt(0), 3, 0, 0}, + + // always round up + {big.NewInt(999), 3, 0, 1}, + {big.NewInt(500), 3, 0, 1}, + {big.NewInt(499), 3, 0, 1}, + {big.NewInt(1), 3, 0, 1}, + // large scaled value does not lose precision + {big.NewInt(0).Sub(maxInt64, bigOne), 1, 0, (math.MaxInt64-1)/10 + 1}, + // large intermediate result. + {big.NewInt(1).Exp(big.NewInt(10), big.NewInt(100), nil), 100, 0, 1}, + + // scale up + {big.NewInt(0), 0, 3, 0}, + {big.NewInt(1), 0, 3, 1000}, + {big.NewInt(1), -3, 0, 1000}, + {big.NewInt(1000), -3, 2, 100000000}, + {big.NewInt(0).Div(big.NewInt(math.MaxInt64), bigThousand), 0, 3, + (math.MaxInt64 / 1000) * 1000}, + } + + for i, tt := range tests { + old := (&big.Int{}).Set(tt.unscaled) + got := scaledValue(tt.unscaled, tt.scale, tt.newScale) + if got != tt.want { + t.Errorf("#%d: got = %v, want %v", i, got, tt.want) + } + if tt.unscaled.Cmp(old) != 0 { + t.Errorf("#%d: unscaled = %v, want %v", i, tt.unscaled, old) + } + } +} + +func BenchmarkScaledValueSmall(b *testing.B) { + s := big.NewInt(1000) + for i := 0; i < b.N; i++ { + scaledValue(s, 3, 0) + } +} + +func BenchmarkScaledValueLarge(b *testing.B) { + s := big.NewInt(math.MaxInt64) + s.Mul(s, big.NewInt(1000)) + for i := 0; i < b.N; i++ { + scaledValue(s, 10, 0) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD index 2c6a0aa3..a1942396 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD @@ -11,8 +11,8 @@ go_test( srcs = ["objectmeta_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) @@ -23,16 +23,17 @@ go_library( "generic.go", "objectmeta.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/validation", importpath = "k8s.io/apimachinery/pkg/api/validation", deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go new file mode 100644 index 00000000..ebd6c7e7 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go @@ -0,0 +1,500 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 validation + +import ( + "math/rand" + "reflect" + "strings" + "testing" + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/validation/field" +) + +const ( + maxLengthErrMsg = "must be no more than" + namePartErrMsg = "name part must consist of" + nameErrMsg = "a qualified name must consist of" +) + +// Ensure custom name functions are allowed +func TestValidateObjectMetaCustomName(t *testing.T) { + errs := ValidateObjectMeta( + &metav1.ObjectMeta{Name: "test", GenerateName: "foo"}, + false, + func(s string, prefix bool) []string { + if s == "test" { + return nil + } + return []string{"name-gen"} + }, + field.NewPath("field")) + if len(errs) != 1 { + t.Fatalf("unexpected errors: %v", errs) + } + if !strings.Contains(errs[0].Error(), "name-gen") { + t.Errorf("unexpected error message: %v", errs) + } +} + +// Ensure namespace names follow dns label format +func TestValidateObjectMetaNamespaces(t *testing.T) { + errs := ValidateObjectMeta( + &metav1.ObjectMeta{Name: "test", Namespace: "foo.bar"}, + true, + func(s string, prefix bool) []string { + return nil + }, + field.NewPath("field")) + if len(errs) != 1 { + t.Fatalf("unexpected errors: %v", errs) + } + if !strings.Contains(errs[0].Error(), `Invalid value: "foo.bar"`) { + t.Errorf("unexpected error message: %v", errs) + } + maxLength := 63 + letters := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + b := make([]rune, maxLength+1) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + errs = ValidateObjectMeta( + &metav1.ObjectMeta{Name: "test", Namespace: string(b)}, + true, + func(s string, prefix bool) []string { + return nil + }, + field.NewPath("field")) + if len(errs) != 2 { + t.Fatalf("unexpected errors: %v", errs) + } + if !strings.Contains(errs[0].Error(), "Invalid value") || !strings.Contains(errs[1].Error(), "Invalid value") { + t.Errorf("unexpected error message: %v", errs) + } +} + +func TestValidateObjectMetaOwnerReferences(t *testing.T) { + trueVar := true + falseVar := false + testCases := []struct { + description string + ownerReferences []metav1.OwnerReference + expectError bool + expectedErrorMessage string + }{ + { + description: "simple success - third party extension.", + ownerReferences: []metav1.OwnerReference{ + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "1", + }, + }, + expectError: false, + expectedErrorMessage: "", + }, + { + description: "simple failures - event shouldn't be set as an owner", + ownerReferences: []metav1.OwnerReference{ + { + APIVersion: "v1", + Kind: "Event", + Name: "name", + UID: "1", + }, + }, + expectError: true, + expectedErrorMessage: "is disallowed from being an owner", + }, + { + description: "simple controller ref success - one reference with Controller set", + ownerReferences: []metav1.OwnerReference{ + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "1", + Controller: &falseVar, + }, + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "2", + Controller: &trueVar, + }, + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "3", + Controller: &falseVar, + }, + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "4", + }, + }, + expectError: false, + expectedErrorMessage: "", + }, + { + description: "simple controller ref failure - two references with Controller set", + ownerReferences: []metav1.OwnerReference{ + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "1", + Controller: &falseVar, + }, + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "2", + Controller: &trueVar, + }, + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "3", + Controller: &trueVar, + }, + { + APIVersion: "customresourceVersion", + Kind: "customresourceKind", + Name: "name", + UID: "4", + }, + }, + expectError: true, + expectedErrorMessage: "Only one reference can have Controller set to true", + }, + } + + for _, tc := range testCases { + errs := ValidateObjectMeta( + &metav1.ObjectMeta{Name: "test", Namespace: "test", OwnerReferences: tc.ownerReferences}, + true, + func(s string, prefix bool) []string { + return nil + }, + field.NewPath("field")) + if len(errs) != 0 && !tc.expectError { + t.Errorf("unexpected error: %v in test case %v", errs, tc.description) + } + if len(errs) == 0 && tc.expectError { + t.Errorf("expect error in test case %v", tc.description) + } + if len(errs) != 0 && !strings.Contains(errs[0].Error(), tc.expectedErrorMessage) { + t.Errorf("unexpected error message: %v in test case %v", errs, tc.description) + } + } +} + +func TestValidateObjectMetaUpdateIgnoresCreationTimestamp(t *testing.T) { + if errs := ValidateObjectMetaUpdate( + &metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(10, 0))}, + field.NewPath("field"), + ); len(errs) != 1 { + t.Fatalf("unexpected errors: %v", errs) + } + if errs := ValidateObjectMetaUpdate( + &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(10, 0))}, + &metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + field.NewPath("field"), + ); len(errs) != 1 { + t.Fatalf("unexpected errors: %v", errs) + } + if errs := ValidateObjectMetaUpdate( + &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(10, 0))}, + &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(11, 0))}, + field.NewPath("field"), + ); len(errs) != 1 { + t.Fatalf("unexpected errors: %v", errs) + } +} + +func TestValidateFinalizersUpdate(t *testing.T) { + testcases := map[string]struct { + Old metav1.ObjectMeta + New metav1.ObjectMeta + ExpectedErr string + }{ + "invalid adding finalizers": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &metav1.Time{}, Finalizers: []string{"x/a"}}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &metav1.Time{}, Finalizers: []string{"x/a", "y/b"}}, + ExpectedErr: "y/b", + }, + "invalid changing finalizers": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &metav1.Time{}, Finalizers: []string{"x/a"}}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &metav1.Time{}, Finalizers: []string{"x/b"}}, + ExpectedErr: "x/b", + }, + "valid removing finalizers": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &metav1.Time{}, Finalizers: []string{"x/a", "y/b"}}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &metav1.Time{}, Finalizers: []string{"x/a"}}, + ExpectedErr: "", + }, + "valid adding finalizers for objects not being deleted": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Finalizers: []string{"x/a"}}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Finalizers: []string{"x/a", "y/b"}}, + ExpectedErr: "", + }, + } + for name, tc := range testcases { + errs := ValidateObjectMetaUpdate(&tc.New, &tc.Old, field.NewPath("field")) + if len(errs) == 0 { + if len(tc.ExpectedErr) != 0 { + t.Errorf("case: %q, expected error to contain %q", name, tc.ExpectedErr) + } + } else if e, a := tc.ExpectedErr, errs.ToAggregate().Error(); !strings.Contains(a, e) { + t.Errorf("case: %q, expected error to contain %q, got error %q", name, e, a) + } + } +} + +func TestValidateFinalizersPreventConflictingFinalizers(t *testing.T) { + testcases := map[string]struct { + ObjectMeta metav1.ObjectMeta + ExpectedErr string + }{ + "conflicting finalizers": { + ObjectMeta: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Finalizers: []string{metav1.FinalizerOrphanDependents, metav1.FinalizerDeleteDependents}}, + ExpectedErr: "cannot be both set", + }, + } + for name, tc := range testcases { + errs := ValidateObjectMeta(&tc.ObjectMeta, false, NameIsDNSSubdomain, field.NewPath("field")) + if len(errs) == 0 { + if len(tc.ExpectedErr) != 0 { + t.Errorf("case: %q, expected error to contain %q", name, tc.ExpectedErr) + } + } else if e, a := tc.ExpectedErr, errs.ToAggregate().Error(); !strings.Contains(a, e) { + t.Errorf("case: %q, expected error to contain %q, got error %q", name, e, a) + } + } +} + +func TestValidateObjectMetaUpdatePreventsDeletionFieldMutation(t *testing.T) { + now := metav1.NewTime(time.Unix(1000, 0).UTC()) + later := metav1.NewTime(time.Unix(2000, 0).UTC()) + gracePeriodShort := int64(30) + gracePeriodLong := int64(40) + + testcases := map[string]struct { + Old metav1.ObjectMeta + New metav1.ObjectMeta + ExpectedNew metav1.ObjectMeta + ExpectedErrs []string + }{ + "valid without deletion fields": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedErrs: []string{}, + }, + "valid with deletion fields": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &gracePeriodShort}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &gracePeriodShort}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now, DeletionGracePeriodSeconds: &gracePeriodShort}, + ExpectedErrs: []string{}, + }, + + "invalid set deletionTimestamp": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, + ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: 1970-01-01 00:16:40 +0000 UTC: field is immutable"}, + }, + "invalid clear deletionTimestamp": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: \"null\": field is immutable"}, + }, + "invalid change deletionTimestamp": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &later}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &later}, + ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: 1970-01-01 00:33:20 +0000 UTC: field is immutable"}, + }, + + "invalid set deletionGracePeriodSeconds": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, + ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 30: field is immutable"}, + }, + "invalid clear deletionGracePeriodSeconds": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: \"null\": field is immutable"}, + }, + "invalid change deletionGracePeriodSeconds": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodLong}, + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodLong}, + ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 40: field is immutable"}, + }, + } + + for k, tc := range testcases { + errs := ValidateObjectMetaUpdate(&tc.New, &tc.Old, field.NewPath("field")) + if len(errs) != len(tc.ExpectedErrs) { + t.Logf("%s: Expected: %#v", k, tc.ExpectedErrs) + t.Logf("%s: Got: %#v", k, errs) + t.Errorf("%s: expected %d errors, got %d", k, len(tc.ExpectedErrs), len(errs)) + continue + } + for i := range errs { + if errs[i].Error() != tc.ExpectedErrs[i] { + t.Errorf("%s: error #%d: expected %q, got %q", k, i, tc.ExpectedErrs[i], errs[i].Error()) + } + } + if !reflect.DeepEqual(tc.New, tc.ExpectedNew) { + t.Errorf("%s: Expected after validation:\n%#v\ngot\n%#v", k, tc.ExpectedNew, tc.New) + } + } +} + +func TestObjectMetaGenerationUpdate(t *testing.T) { + testcases := map[string]struct { + Old metav1.ObjectMeta + New metav1.ObjectMeta + ExpectedErrs []string + }{ + "invalid generation change - decremented": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Generation: 5}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Generation: 4}, + ExpectedErrs: []string{"field.generation: Invalid value: 4: must not be decremented"}, + }, + "valid generation change - incremented by one": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Generation: 1}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Generation: 2}, + ExpectedErrs: []string{}, + }, + "valid generation field - not updated": { + Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Generation: 5}, + New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Generation: 5}, + ExpectedErrs: []string{}, + }, + } + + for k, tc := range testcases { + errList := []string{} + errs := ValidateObjectMetaUpdate(&tc.New, &tc.Old, field.NewPath("field")) + if len(errs) != len(tc.ExpectedErrs) { + t.Logf("%s: Expected: %#v", k, tc.ExpectedErrs) + for _, err := range errs { + errList = append(errList, err.Error()) + } + t.Logf("%s: Got: %#v", k, errList) + t.Errorf("%s: expected %d errors, got %d", k, len(tc.ExpectedErrs), len(errs)) + continue + } + for i := range errList { + if errList[i] != tc.ExpectedErrs[i] { + t.Errorf("%s: error #%d: expected %q, got %q", k, i, tc.ExpectedErrs[i], errList[i]) + } + } + } +} + +// Ensure trailing slash is allowed in generate name +func TestValidateObjectMetaTrimsTrailingSlash(t *testing.T) { + errs := ValidateObjectMeta( + &metav1.ObjectMeta{Name: "test", GenerateName: "foo-"}, + false, + NameIsDNSSubdomain, + field.NewPath("field")) + if len(errs) != 0 { + t.Fatalf("unexpected errors: %v", errs) + } +} + +func TestValidateAnnotations(t *testing.T) { + successCases := []map[string]string{ + {"simple": "bar"}, + {"now-with-dashes": "bar"}, + {"1-starts-with-num": "bar"}, + {"1234": "bar"}, + {"simple/simple": "bar"}, + {"now-with-dashes/simple": "bar"}, + {"now-with-dashes/now-with-dashes": "bar"}, + {"now.with.dots/simple": "bar"}, + {"now-with.dashes-and.dots/simple": "bar"}, + {"1-num.2-num/3-num": "bar"}, + {"1234/5678": "bar"}, + {"1.2.3.4/5678": "bar"}, + {"UpperCase123": "bar"}, + {"a": strings.Repeat("b", totalAnnotationSizeLimitB-1)}, + { + "a": strings.Repeat("b", totalAnnotationSizeLimitB/2-1), + "c": strings.Repeat("d", totalAnnotationSizeLimitB/2-1), + }, + } + for i := range successCases { + errs := ValidateAnnotations(successCases[i], field.NewPath("field")) + if len(errs) != 0 { + t.Errorf("case[%d] expected success, got %#v", i, errs) + } + } + + nameErrorCases := []struct { + annotations map[string]string + expect string + }{ + {map[string]string{"nospecialchars^=@": "bar"}, namePartErrMsg}, + {map[string]string{"cantendwithadash-": "bar"}, namePartErrMsg}, + {map[string]string{"only/one/slash": "bar"}, nameErrMsg}, + {map[string]string{strings.Repeat("a", 254): "bar"}, maxLengthErrMsg}, + } + for i := range nameErrorCases { + errs := ValidateAnnotations(nameErrorCases[i].annotations, field.NewPath("field")) + if len(errs) != 1 { + t.Errorf("case[%d]: expected failure", i) + } else { + if !strings.Contains(errs[0].Detail, nameErrorCases[i].expect) { + t.Errorf("case[%d]: error details do not include %q: %q", i, nameErrorCases[i].expect, errs[0].Detail) + } + } + } + totalSizeErrorCases := []map[string]string{ + {"a": strings.Repeat("b", totalAnnotationSizeLimitB)}, + { + "a": strings.Repeat("b", totalAnnotationSizeLimitB/2), + "c": strings.Repeat("d", totalAnnotationSizeLimitB/2), + }, + } + for i := range totalSizeErrorCases { + errs := ValidateAnnotations(totalSizeErrorCases[i], field.NewPath("field")) + if len(errs) != 1 { + t.Errorf("case[%d] expected failure", i) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD b/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD index ddc17e79..0bd49a48 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["name.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/validation/path", importpath = "k8s.io/apimachinery/pkg/api/validation/path", ) diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/path/name_test.go b/vendor/k8s.io/apimachinery/pkg/api/validation/path/name_test.go new file mode 100644 index 00000000..42890527 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/path/name_test.go @@ -0,0 +1,168 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 path + +import ( + "strings" + "testing" +) + +func TestValidatePathSegmentName(t *testing.T) { + testcases := map[string]struct { + Name string + Prefix bool + ExpectedMsg string + }{ + "empty": { + Name: "", + Prefix: false, + ExpectedMsg: "", + }, + "empty,prefix": { + Name: "", + Prefix: true, + ExpectedMsg: "", + }, + + "valid": { + Name: "foo.bar.baz", + Prefix: false, + ExpectedMsg: "", + }, + "valid,prefix": { + Name: "foo.bar.baz", + Prefix: true, + ExpectedMsg: "", + }, + + // Make sure mixed case, non DNS subdomain characters are tolerated + "valid complex": { + Name: "sha256:ABCDEF012345@ABCDEF012345", + Prefix: false, + ExpectedMsg: "", + }, + // Make sure non-ascii characters are tolerated + "valid extended charset": { + Name: "Iñtërnâtiônàlizætiøn", + Prefix: false, + ExpectedMsg: "", + }, + + "dot": { + Name: ".", + Prefix: false, + ExpectedMsg: ".", + }, + "dot leading": { + Name: ".test", + Prefix: false, + ExpectedMsg: "", + }, + "dot,prefix": { + Name: ".", + Prefix: true, + ExpectedMsg: "", + }, + + "dot dot": { + Name: "..", + Prefix: false, + ExpectedMsg: "..", + }, + "dot dot leading": { + Name: "..test", + Prefix: false, + ExpectedMsg: "", + }, + "dot dot,prefix": { + Name: "..", + Prefix: true, + ExpectedMsg: "", + }, + + "slash": { + Name: "foo/bar", + Prefix: false, + ExpectedMsg: "/", + }, + "slash,prefix": { + Name: "foo/bar", + Prefix: true, + ExpectedMsg: "/", + }, + + "percent": { + Name: "foo%bar", + Prefix: false, + ExpectedMsg: "%", + }, + "percent,prefix": { + Name: "foo%bar", + Prefix: true, + ExpectedMsg: "%", + }, + } + + for k, tc := range testcases { + msgs := ValidatePathSegmentName(tc.Name, tc.Prefix) + if len(tc.ExpectedMsg) == 0 && len(msgs) > 0 { + t.Errorf("%s: expected no message, got %v", k, msgs) + } + if len(tc.ExpectedMsg) > 0 && len(msgs) == 0 { + t.Errorf("%s: expected error message, got none", k) + } + if len(tc.ExpectedMsg) > 0 && !strings.Contains(msgs[0], tc.ExpectedMsg) { + t.Errorf("%s: expected message containing %q, got %v", k, tc.ExpectedMsg, msgs[0]) + } + } +} + +func TestValidateWithMultiErrors(t *testing.T) { + testcases := map[string]struct { + Name string + Prefix bool + ExpectedMsg []string + }{ + "slash,percent": { + Name: "foo//bar%", + Prefix: false, + ExpectedMsg: []string{"may not contain '/'", "may not contain '%'"}, + }, + "slash,percent,prefix": { + Name: "foo//bar%", + Prefix: true, + ExpectedMsg: []string{"may not contain '/'", "may not contain '%'"}, + }, + } + + for k, tc := range testcases { + msgs := ValidatePathSegmentName(tc.Name, tc.Prefix) + if len(tc.ExpectedMsg) == 0 && len(msgs) > 0 { + t.Errorf("%s: expected no message, got %v", k, msgs) + } + if len(tc.ExpectedMsg) > 0 && len(msgs) == 0 { + t.Errorf("%s: expected error message, got none", k) + } + if len(tc.ExpectedMsg) > 0 { + for i := 0; i < len(tc.ExpectedMsg); i++ { + if msgs[i] != tc.ExpectedMsg[i] { + t.Errorf("%s: expected message containing %q, got %v", k, tc.ExpectedMsg[i], msgs[i]) + } + } + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD index edb9a6ac..603eb10c 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD @@ -14,10 +14,10 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) @@ -31,17 +31,17 @@ go_library( "zz_generated.conversion.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion", importpath = "k8s.io/apimachinery/pkg/apis/meta/internalversion", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/conversion.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/conversion.go index 1ea8c137..673e5621 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/conversion.go @@ -17,11 +17,8 @@ limitations under the License. package internalversion import ( - "fmt" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/conversion" - "k8s.io/apimachinery/pkg/util/validation/field" ) func Convert_internalversion_ListOptions_To_v1_ListOptions(in *ListOptions, out *metav1.ListOptions, s conversion.Scope) error { @@ -55,23 +52,3 @@ func Convert_v1_ListOptions_To_internalversion_ListOptions(in *metav1.ListOption out.Continue = in.Continue return nil } - -func Convert_map_to_v1_LabelSelector(in *map[string]string, out *metav1.LabelSelector, s conversion.Scope) error { - if in == nil { - return nil - } - out = new(metav1.LabelSelector) - for labelKey, labelValue := range *in { - metav1.AddLabelToSelector(out, labelKey, labelValue) - } - return nil -} - -func Convert_v1_LabelSelector_to_map(in *metav1.LabelSelector, out *map[string]string, s conversion.Scope) error { - var err error - *out, err = metav1.LabelSelectorAsMap(in) - if err != nil { - err = field.Invalid(field.NewPath("labelSelector"), *in, fmt.Sprintf("cannot convert to old selector: %v", err)) - } - return err -} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go index 4bde90b3..46b8605f 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register.go @@ -57,19 +57,22 @@ func addToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion) if err := scheme.AddIgnoredConversionType(&metav1.TypeMeta{}, &metav1.TypeMeta{}); err != nil { return err } - scheme.AddConversionFuncs( + err := scheme.AddConversionFuncs( metav1.Convert_string_To_labels_Selector, metav1.Convert_labels_Selector_To_string, metav1.Convert_string_To_fields_Selector, metav1.Convert_fields_Selector_To_string, - Convert_map_to_v1_LabelSelector, - Convert_v1_LabelSelector_to_map, + metav1.Convert_Map_string_To_string_To_v1_LabelSelector, + metav1.Convert_v1_LabelSelector_To_Map_string_To_string, Convert_internalversion_ListOptions_To_v1_ListOptions, Convert_v1_ListOptions_To_internalversion_ListOptions, ) + if err != nil { + return err + } // ListOptions is the only options struct which needs conversion (it exposes labels and fields // as selectors for convenience). The other types have only a single representation today. scheme.AddKnownTypes(SchemeGroupVersion, @@ -77,6 +80,8 @@ func addToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion) &metav1.GetOptions{}, &metav1.ExportOptions{}, &metav1.DeleteOptions{}, + &metav1.CreateOptions{}, + &metav1.UpdateOptions{}, ) scheme.AddKnownTypes(SchemeGroupVersion, &metav1beta1.Table{}, @@ -91,7 +96,10 @@ func addToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion) &metav1beta1.PartialObjectMetadataList{}, ) // Allow delete options to be decoded across all version in this scheme (we may want to be more clever than this) - scheme.AddUnversionedTypes(SchemeGroupVersion, &metav1.DeleteOptions{}) + scheme.AddUnversionedTypes(SchemeGroupVersion, + &metav1.DeleteOptions{}, + &metav1.CreateOptions{}, + &metav1.UpdateOptions{}) metav1.AddToGroupVersion(scheme, metav1.SchemeGroupVersion) return nil } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register_test.go new file mode 100644 index 00000000..8116f807 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/register_test.go @@ -0,0 +1,89 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 internalversion + +import ( + "net/url" + "reflect" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/diff" +) + +func TestListOptions(t *testing.T) { + // verify round trip conversion + ten := int64(10) + in := &metav1.ListOptions{ + LabelSelector: "a=1", + FieldSelector: "b=1", + ResourceVersion: "10", + TimeoutSeconds: &ten, + Watch: true, + } + out := &ListOptions{} + if err := scheme.Convert(in, out, nil); err != nil { + t.Fatal(err) + } + actual := &metav1.ListOptions{} + if err := scheme.Convert(out, actual, nil); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(in, actual) { + t.Errorf("unexpected: %s", diff.ObjectReflectDiff(in, actual)) + } + + // verify failing conversion + for i, failingObject := range []*metav1.ListOptions{ + {LabelSelector: "a!!!"}, + {FieldSelector: "a!!!"}, + } { + out = &ListOptions{} + if err := scheme.Convert(failingObject, out, nil); err == nil { + t.Errorf("%d: unexpected conversion: %#v", i, out) + } + } + + // verify kind registration + if gvks, unversioned, err := scheme.ObjectKinds(in); err != nil || unversioned || gvks[0] != metav1.SchemeGroupVersion.WithKind("ListOptions") { + t.Errorf("unexpected: %v %v %v", gvks[0], unversioned, err) + } + if gvks, unversioned, err := scheme.ObjectKinds(out); err != nil || unversioned || gvks[0] != SchemeGroupVersion.WithKind("ListOptions") { + t.Errorf("unexpected: %v %v %v", gvks[0], unversioned, err) + } + + actual = &metav1.ListOptions{} + if err := ParameterCodec.DecodeParameters(url.Values{"watch": []string{"1"}}, metav1.SchemeGroupVersion, actual); err != nil { + t.Fatal(err) + } + if !actual.Watch { + t.Errorf("unexpected watch decode: %#v", actual) + } + + // check ParameterCodec + query, err := ParameterCodec.EncodeParameters(in, metav1.SchemeGroupVersion) + if err != nil { + t.Fatal(err) + } + actual = &metav1.ListOptions{} + if err := ParameterCodec.DecodeParameters(query, metav1.SchemeGroupVersion, actual); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(in, actual) { + t.Errorf("unexpected: %s", diff.ObjectReflectDiff(in, actual)) + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider_unsupported.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/roundtrip_test.go similarity index 72% rename from vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider_unsupported.go rename to vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/roundtrip_test.go index a7b00d9d..cca50eb4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider_unsupported.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/roundtrip_test.go @@ -1,5 +1,3 @@ -// +build !linux - /* Copyright 2017 The Kubernetes Authors. @@ -16,12 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -package stats +package internalversion import ( - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" + "testing" + + "k8s.io/apimachinery/pkg/api/apitesting/roundtrip" + "k8s.io/apimachinery/pkg/apis/meta/fuzzer" ) -func (p *StatsProvider) RlimitStats() (*statsapi.RlimitStats, error) { - return nil, nil +func TestRoundTrip(t *testing.T) { + roundtrip.RoundTripTestForScheme(t, scheme, fuzzer.Funcs) } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go index a63b3fc2..18d190b2 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go @@ -34,13 +34,38 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. -func RegisterConversions(scheme *runtime.Scheme) error { - return scheme.AddGeneratedConversionFuncs( - Convert_internalversion_List_To_v1_List, - Convert_v1_List_To_internalversion_List, - Convert_internalversion_ListOptions_To_v1_ListOptions, - Convert_v1_ListOptions_To_internalversion_ListOptions, - ) +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*List)(nil), (*v1.List)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_internalversion_List_To_v1_List(a.(*List), b.(*v1.List), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.List)(nil), (*List)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_List_To_internalversion_List(a.(*v1.List), b.(*List), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ListOptions)(nil), (*v1.ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_internalversion_ListOptions_To_v1_ListOptions(a.(*ListOptions), b.(*v1.ListOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ListOptions)(nil), (*ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ListOptions_To_internalversion_ListOptions(a.(*v1.ListOptions), b.(*ListOptions), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*ListOptions)(nil), (*v1.ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_internalversion_ListOptions_To_v1_ListOptions(a.(*ListOptions), b.(*v1.ListOptions), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.ListOptions)(nil), (*ListOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ListOptions_To_internalversion_ListOptions(a.(*v1.ListOptions), b.(*ListOptions), scope) + }); err != nil { + return err + } + return nil } func autoConvert_internalversion_List_To_v1_List(in *List, out *v1.List, s conversion.Scope) error { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go index 77bd9a6b..81d85e96 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go @@ -33,9 +33,7 @@ func (in *List) DeepCopyInto(out *List) { in, out := &in.Items, &out.Items *out = make([]runtime.Object, len(*in)) for i := range *in { - if (*in)[i] == nil { - (*out)[i] = nil - } else { + if (*in)[i] != nil { (*out)[i] = (*in)[i].DeepCopyObject() } } @@ -65,24 +63,16 @@ func (in *List) DeepCopyObject() runtime.Object { func (in *ListOptions) DeepCopyInto(out *ListOptions) { *out = *in out.TypeMeta = in.TypeMeta - if in.LabelSelector == nil { - out.LabelSelector = nil - } else { + if in.LabelSelector != nil { out.LabelSelector = in.LabelSelector.DeepCopySelector() } - if in.FieldSelector == nil { - out.FieldSelector = nil - } else { + if in.FieldSelector != nil { out.FieldSelector = in.FieldSelector.DeepCopySelector() } if in.TimeoutSeconds != nil { in, out := &in.TimeoutSeconds, &out.TimeoutSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } return } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD index b4f04f88..8b023136 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD @@ -10,6 +10,7 @@ go_test( name = "go_default_test", srcs = [ "controller_ref_test.go", + "conversion_test.go", "duration_test.go", "group_version_test.go", "helpers_test.go", @@ -20,10 +21,11 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", ], ) @@ -50,21 +52,23 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1", importpath = "k8s.io/apimachinery/pkg/apis/meta/v1", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", ], ) @@ -84,18 +88,3 @@ filegroup( ], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_xtest", - srcs = ["conversion_test.go"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/controller_ref_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/controller_ref_test.go new file mode 100644 index 00000000..add764a3 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/controller_ref_test.go @@ -0,0 +1,133 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 v1 + +import ( + "testing" + + "k8s.io/apimachinery/pkg/runtime/schema" +) + +type metaObj struct { + ObjectMeta + TypeMeta +} + +func TestNewControllerRef(t *testing.T) { + gvk := schema.GroupVersionKind{ + Group: "group", + Version: "v1", + Kind: "Kind", + } + obj1 := &metaObj{ + ObjectMeta: ObjectMeta{ + Name: "name", + UID: "uid1", + }, + } + controllerRef := NewControllerRef(obj1, gvk) + if controllerRef.UID != obj1.UID { + t.Errorf("Incorrect UID: %s", controllerRef.UID) + } + if controllerRef.Controller == nil || *controllerRef.Controller != true { + t.Error("Controller must be set to true") + } + if controllerRef.BlockOwnerDeletion == nil || *controllerRef.BlockOwnerDeletion != true { + t.Error("BlockOwnerDeletion must be set to true") + } + if controllerRef.APIVersion == "" || + controllerRef.Kind == "" || + controllerRef.Name == "" { + t.Errorf("All controllerRef fields must be set: %v", controllerRef) + } +} + +func TestGetControllerOf(t *testing.T) { + gvk := schema.GroupVersionKind{ + Group: "group", + Version: "v1", + Kind: "Kind", + } + obj1 := &metaObj{ + ObjectMeta: ObjectMeta{ + UID: "uid1", + Name: "name1", + }, + } + controllerRef := NewControllerRef(obj1, gvk) + var falseRef = false + obj2 := &metaObj{ + ObjectMeta: ObjectMeta{ + UID: "uid2", + Name: "name1", + OwnerReferences: []OwnerReference{ + { + Name: "owner1", + Controller: &falseRef, + }, + *controllerRef, + { + Name: "owner2", + Controller: &falseRef, + }, + }, + }, + } + + if GetControllerOf(obj1) != nil { + t.Error("GetControllerOf must return null") + } + c := GetControllerOf(obj2) + if c.Name != controllerRef.Name || c.UID != controllerRef.UID { + t.Errorf("Incorrect result of GetControllerOf: %v", c) + } +} + +func TestIsControlledBy(t *testing.T) { + gvk := schema.GroupVersionKind{ + Group: "group", + Version: "v1", + Kind: "Kind", + } + obj1 := &metaObj{ + ObjectMeta: ObjectMeta{ + UID: "uid1", + }, + } + obj2 := &metaObj{ + ObjectMeta: ObjectMeta{ + UID: "uid2", + OwnerReferences: []OwnerReference{ + *NewControllerRef(obj1, gvk), + }, + }, + } + obj3 := &metaObj{ + ObjectMeta: ObjectMeta{ + UID: "uid3", + OwnerReferences: []OwnerReference{ + *NewControllerRef(obj2, gvk), + }, + }, + } + if !IsControlledBy(obj2, obj1) || !IsControlledBy(obj3, obj2) { + t.Error("Incorrect IsControlledBy result: false") + } + if IsControlledBy(obj3, obj1) { + t.Error("Incorrect IsControlledBy result: true") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go index c36fc655..5c36f82c 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go @@ -33,17 +33,17 @@ func AddConversionFuncs(scheme *runtime.Scheme) error { return scheme.AddConversionFuncs( Convert_v1_TypeMeta_To_v1_TypeMeta, - Convert_unversioned_ListMeta_To_unversioned_ListMeta, + Convert_v1_ListMeta_To_v1_ListMeta, Convert_intstr_IntOrString_To_intstr_IntOrString, - Convert_unversioned_Time_To_unversioned_Time, - Convert_unversioned_MicroTime_To_unversioned_MicroTime, - Convert_Pointer_v1_Duration_To_v1_Duration, Convert_v1_Duration_To_Pointer_v1_Duration, - Convert_Slice_string_To_unversioned_Time, + Convert_Slice_string_To_v1_Time, + + Convert_v1_Time_To_v1_Time, + Convert_v1_MicroTime_To_v1_MicroTime, Convert_resource_Quantity_To_resource_Quantity, @@ -71,8 +71,8 @@ func AddConversionFuncs(scheme *runtime.Scheme) error { Convert_Pointer_float64_To_float64, Convert_float64_To_Pointer_float64, - Convert_map_to_unversioned_LabelSelector, - Convert_unversioned_LabelSelector_to_map, + Convert_Map_string_To_string_To_v1_LabelSelector, + Convert_v1_LabelSelector_To_Map_string_To_string, Convert_Slice_string_To_Slice_int32, @@ -187,7 +187,7 @@ func Convert_v1_TypeMeta_To_v1_TypeMeta(in, out *TypeMeta, s conversion.Scope) e } // +k8s:conversion-fn=copy-only -func Convert_unversioned_ListMeta_To_unversioned_ListMeta(in, out *ListMeta, s conversion.Scope) error { +func Convert_v1_ListMeta_To_v1_ListMeta(in, out *ListMeta, s conversion.Scope) error { *out = *in return nil } @@ -199,7 +199,14 @@ func Convert_intstr_IntOrString_To_intstr_IntOrString(in, out *intstr.IntOrStrin } // +k8s:conversion-fn=copy-only -func Convert_unversioned_Time_To_unversioned_Time(in *Time, out *Time, s conversion.Scope) error { +func Convert_v1_Time_To_v1_Time(in *Time, out *Time, s conversion.Scope) error { + // Cannot deep copy these, because time.Time has unexported fields. + *out = *in + return nil +} + +// +k8s:conversion-fn=copy-only +func Convert_v1_MicroTime_To_v1_MicroTime(in *MicroTime, out *MicroTime, s conversion.Scope) error { // Cannot deep copy these, because time.Time has unexported fields. *out = *in return nil @@ -220,14 +227,8 @@ func Convert_v1_Duration_To_Pointer_v1_Duration(in *Duration, out **Duration, s return nil } -func Convert_unversioned_MicroTime_To_unversioned_MicroTime(in *MicroTime, out *MicroTime, s conversion.Scope) error { - // Cannot deep copy these, because time.Time has unexported fields. - *out = *in - return nil -} - -// Convert_Slice_string_To_unversioned_Time allows converting a URL query parameter value -func Convert_Slice_string_To_unversioned_Time(input *[]string, out *Time, s conversion.Scope) error { +// Convert_Slice_string_To_v1_Time allows converting a URL query parameter value +func Convert_Slice_string_To_v1_Time(input *[]string, out *Time, s conversion.Scope) error { str := "" if len(*input) > 0 { str = (*input)[0] @@ -275,7 +276,7 @@ func Convert_resource_Quantity_To_resource_Quantity(in *resource.Quantity, out * return nil } -func Convert_map_to_unversioned_LabelSelector(in *map[string]string, out *LabelSelector, s conversion.Scope) error { +func Convert_Map_string_To_string_To_v1_LabelSelector(in *map[string]string, out *LabelSelector, s conversion.Scope) error { if in == nil { return nil } @@ -285,7 +286,7 @@ func Convert_map_to_unversioned_LabelSelector(in *map[string]string, out *LabelS return nil } -func Convert_unversioned_LabelSelector_to_map(in *LabelSelector, out *map[string]string, s conversion.Scope) error { +func Convert_v1_LabelSelector_To_Map_string_To_string(in *LabelSelector, out *map[string]string, s conversion.Scope) error { var err error *out, err = LabelSelectorAsMap(in) return err diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go new file mode 100644 index 00000000..4c73d1d8 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 v1_test + +import ( + "testing" + + apiequality "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestMapToLabelSelectorRoundTrip(t *testing.T) { + // We should be able to round-trip a map-only selector through LabelSelector. + inputs := []map[string]string{ + nil, + {}, + {"one": "foo"}, + {"one": "foo", "two": "bar"}, + } + for _, in := range inputs { + ls := &v1.LabelSelector{} + if err := v1.Convert_Map_string_To_string_To_v1_LabelSelector(&in, ls, nil); err != nil { + t.Errorf("Convert_Map_string_To_string_To_v1_LabelSelector(%#v): %v", in, err) + continue + } + out := map[string]string{} + if err := v1.Convert_v1_LabelSelector_To_Map_string_To_string(ls, &out, nil); err != nil { + t.Errorf("Convert_v1_LabelSelector_To_Map_string_To_string(%#v): %v", ls, err) + continue + } + if !apiequality.Semantic.DeepEqual(in, out) { + t.Errorf("map-selector conversion round-trip failed: got %v; want %v", out, in) + } + } +} + +func TestConvertSliceStringToDeletionPropagation(t *testing.T) { + tcs := []struct { + Input []string + Output v1.DeletionPropagation + }{ + { + Input: nil, + Output: "", + }, + { + Input: []string{}, + Output: "", + }, + { + Input: []string{"foo"}, + Output: "foo", + }, + { + Input: []string{"bar", "foo"}, + Output: "bar", + }, + } + + for _, tc := range tcs { + var dp v1.DeletionPropagation + if err := v1.Convert_Slice_string_To_v1_DeletionPropagation(&tc.Input, &dp, nil); err != nil { + t.Errorf("Convert_Slice_string_To_v1_DeletionPropagation(%#v): %v", tc.Input, err) + continue + } + if !apiequality.Semantic.DeepEqual(dp, tc.Output) { + t.Errorf("slice string to DeletionPropagation conversion failed: got %v; want %v", dp, tc.Output) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration_test.go new file mode 100644 index 00000000..7230cb28 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration_test.go @@ -0,0 +1,153 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 v1 + +import ( + "encoding/json" + "testing" + "time" + + "github.com/ghodss/yaml" +) + +type DurationHolder struct { + D Duration `json:"d"` +} + +func TestDurationMarshalYAML(t *testing.T) { + cases := []struct { + input Duration + result string + }{ + {Duration{5 * time.Second}, "d: 5s\n"}, + {Duration{2 * time.Minute}, "d: 2m0s\n"}, + {Duration{time.Hour + 3*time.Millisecond}, "d: 1h0m0.003s\n"}, + } + + for _, c := range cases { + input := DurationHolder{c.input} + result, err := yaml.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input: %q: %v", input, err) + } + if string(result) != c.result { + t.Errorf("Failed to marshal input: %q: expected %q, got %q", input, c.result, string(result)) + } + } +} + +func TestDurationUnmarshalYAML(t *testing.T) { + cases := []struct { + input string + result Duration + }{ + {"d: 0s\n", Duration{}}, + {"d: 5s\n", Duration{5 * time.Second}}, + {"d: 2m0s\n", Duration{2 * time.Minute}}, + {"d: 1h0m0.003s\n", Duration{time.Hour + 3*time.Millisecond}}, + + // Units with zero values can optionally be dropped + {"d: 2m\n", Duration{2 * time.Minute}}, + {"d: 1h0.003s\n", Duration{time.Hour + 3*time.Millisecond}}, + } + + for _, c := range cases { + var result DurationHolder + if err := yaml.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("Failed to unmarshal input %q: %v", c.input, err) + } + if result.D != c.result { + t.Errorf("Failed to unmarshal input %q: expected %q, got %q", c.input, c.result, result) + } + } +} + +func TestDurationMarshalJSON(t *testing.T) { + cases := []struct { + input Duration + result string + }{ + {Duration{5 * time.Second}, `{"d":"5s"}`}, + {Duration{2 * time.Minute}, `{"d":"2m0s"}`}, + {Duration{time.Hour + 3*time.Millisecond}, `{"d":"1h0m0.003s"}`}, + } + + for _, c := range cases { + input := DurationHolder{c.input} + result, err := json.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input: %q: %v", input, err) + } + if string(result) != c.result { + t.Errorf("Failed to marshal input: %q: expected %q, got %q", input, c.result, string(result)) + } + } +} + +func TestDurationUnmarshalJSON(t *testing.T) { + cases := []struct { + input string + result Duration + }{ + {`{"d":"0s"}`, Duration{}}, + {`{"d":"5s"}`, Duration{5 * time.Second}}, + {`{"d":"2m0s"}`, Duration{2 * time.Minute}}, + {`{"d":"1h0m0.003s"}`, Duration{time.Hour + 3*time.Millisecond}}, + + // Units with zero values can optionally be dropped + {`{"d":"2m"}`, Duration{2 * time.Minute}}, + {`{"d":"1h0.003s"}`, Duration{time.Hour + 3*time.Millisecond}}, + } + + for _, c := range cases { + var result DurationHolder + if err := json.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("Failed to unmarshal input %q: %v", c.input, err) + } + if result.D != c.result { + t.Errorf("Failed to unmarshal input %q: expected %q, got %q", c.input, c.result, result) + } + } +} + +func TestDurationMarshalJSONUnmarshalYAML(t *testing.T) { + cases := []struct { + input Duration + }{ + {Duration{}}, + {Duration{5 * time.Second}}, + {Duration{2 * time.Minute}}, + {Duration{time.Hour + 3*time.Millisecond}}, + } + + for i, c := range cases { + input := DurationHolder{c.input} + jsonMarshalled, err := json.Marshal(&input) + if err != nil { + t.Errorf("%d-1: Failed to marshal input: '%v': %v", i, input, err) + } + + var result DurationHolder + if err := yaml.Unmarshal(jsonMarshalled, &result); err != nil { + t.Errorf("%d-2: Failed to unmarshal '%+v': %v", i, string(jsonMarshalled), err) + } + + if input.D != result.D { + t.Errorf("%d-4: Failed to marshal input '%#v': got %#v", i, input, result) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go index febace50..b7508f03 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go @@ -30,6 +30,7 @@ limitations under the License. APIResource APIResourceList APIVersions + CreateOptions DeleteOptions Duration ExportOptions @@ -60,6 +61,7 @@ limitations under the License. Time Timestamp TypeMeta + UpdateOptions Verbs WatchEvent */ @@ -113,139 +115,147 @@ func (m *APIVersions) Reset() { *m = APIVersions{} } func (*APIVersions) ProtoMessage() {} func (*APIVersions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } +func (m *CreateOptions) Reset() { *m = CreateOptions{} } +func (*CreateOptions) ProtoMessage() {} +func (*CreateOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} } + func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } func (*DeleteOptions) ProtoMessage() {} -func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} } +func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} } func (m *Duration) Reset() { *m = Duration{} } func (*Duration) ProtoMessage() {} -func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} } +func (*Duration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } func (m *ExportOptions) Reset() { *m = ExportOptions{} } func (*ExportOptions) ProtoMessage() {} -func (*ExportOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{7} } +func (*ExportOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } func (m *GetOptions) Reset() { *m = GetOptions{} } func (*GetOptions) ProtoMessage() {} -func (*GetOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } +func (*GetOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } func (m *GroupKind) Reset() { *m = GroupKind{} } func (*GroupKind) ProtoMessage() {} -func (*GroupKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } +func (*GroupKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } func (m *GroupResource) Reset() { *m = GroupResource{} } func (*GroupResource) ProtoMessage() {} -func (*GroupResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*GroupResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } func (m *GroupVersion) Reset() { *m = GroupVersion{} } func (*GroupVersion) ProtoMessage() {} -func (*GroupVersion) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (*GroupVersion) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } func (m *GroupVersionForDiscovery) Reset() { *m = GroupVersionForDiscovery{} } func (*GroupVersionForDiscovery) ProtoMessage() {} func (*GroupVersionForDiscovery) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{12} + return fileDescriptorGenerated, []int{13} } func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} } func (*GroupVersionKind) ProtoMessage() {} -func (*GroupVersionKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*GroupVersionKind) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *GroupVersionResource) Reset() { *m = GroupVersionResource{} } func (*GroupVersionResource) ProtoMessage() {} -func (*GroupVersionResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*GroupVersionResource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *Initializer) Reset() { *m = Initializer{} } func (*Initializer) ProtoMessage() {} -func (*Initializer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*Initializer) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *Initializers) Reset() { *m = Initializers{} } func (*Initializers) ProtoMessage() {} -func (*Initializers) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (*Initializers) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } func (m *LabelSelector) Reset() { *m = LabelSelector{} } func (*LabelSelector) ProtoMessage() {} -func (*LabelSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*LabelSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *LabelSelectorRequirement) Reset() { *m = LabelSelectorRequirement{} } func (*LabelSelectorRequirement) ProtoMessage() {} func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{18} + return fileDescriptorGenerated, []int{19} } func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} -func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *ListMeta) Reset() { *m = ListMeta{} } func (*ListMeta) ProtoMessage() {} -func (*ListMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*ListMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } func (m *ListOptions) Reset() { *m = ListOptions{} } func (*ListOptions) ProtoMessage() {} -func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *MicroTime) Reset() { *m = MicroTime{} } func (*MicroTime) ProtoMessage() {} -func (*MicroTime) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*MicroTime) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *OwnerReference) Reset() { *m = OwnerReference{} } func (*OwnerReference) ProtoMessage() {} -func (*OwnerReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*OwnerReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *Patch) Reset() { *m = Patch{} } func (*Patch) ProtoMessage() {} -func (*Patch) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*Patch) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *RootPaths) Reset() { *m = RootPaths{} } func (*RootPaths) ProtoMessage() {} -func (*RootPaths) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*RootPaths) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *ServerAddressByClientCIDR) Reset() { *m = ServerAddressByClientCIDR{} } func (*ServerAddressByClientCIDR) ProtoMessage() {} func (*ServerAddressByClientCIDR) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{28} + return fileDescriptorGenerated, []int{29} } func (m *Status) Reset() { *m = Status{} } func (*Status) ProtoMessage() {} -func (*Status) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*Status) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *StatusCause) Reset() { *m = StatusCause{} } func (*StatusCause) ProtoMessage() {} -func (*StatusCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*StatusCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *StatusDetails) Reset() { *m = StatusDetails{} } func (*StatusDetails) ProtoMessage() {} -func (*StatusDetails) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*StatusDetails) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *Time) Reset() { *m = Time{} } func (*Time) ProtoMessage() {} -func (*Time) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*Time) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *Timestamp) Reset() { *m = Timestamp{} } func (*Timestamp) ProtoMessage() {} -func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *TypeMeta) Reset() { *m = TypeMeta{} } func (*TypeMeta) ProtoMessage() {} -func (*TypeMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*TypeMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } + +func (m *UpdateOptions) Reset() { *m = UpdateOptions{} } +func (*UpdateOptions) ProtoMessage() {} +func (*UpdateOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } func (m *Verbs) Reset() { *m = Verbs{} } func (*Verbs) ProtoMessage() {} -func (*Verbs) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } +func (*Verbs) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *WatchEvent) Reset() { *m = WatchEvent{} } func (*WatchEvent) ProtoMessage() {} -func (*WatchEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*WatchEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func init() { proto.RegisterType((*APIGroup)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIGroup") @@ -253,6 +263,7 @@ func init() { proto.RegisterType((*APIResource)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResource") proto.RegisterType((*APIResourceList)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIResourceList") proto.RegisterType((*APIVersions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIVersions") + proto.RegisterType((*CreateOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.CreateOptions") proto.RegisterType((*DeleteOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.DeleteOptions") proto.RegisterType((*Duration)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Duration") proto.RegisterType((*ExportOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ExportOptions") @@ -283,6 +294,7 @@ func init() { proto.RegisterType((*Time)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Time") proto.RegisterType((*Timestamp)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Timestamp") proto.RegisterType((*TypeMeta)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.TypeMeta") + proto.RegisterType((*UpdateOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.UpdateOptions") proto.RegisterType((*Verbs)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Verbs") proto.RegisterType((*WatchEvent)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.WatchEvent") } @@ -535,6 +547,47 @@ func (m *APIVersions) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *CreateOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CreateOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.DryRun) > 0 { + for _, s := range m.DryRun { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + dAtA[i] = 0x10 + i++ + if m.IncludeUninitialized { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + return i, nil +} + func (m *DeleteOptions) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -581,6 +634,21 @@ func (m *DeleteOptions) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PropagationPolicy))) i += copy(dAtA[i:], *m.PropagationPolicy) } + if len(m.DryRun) > 0 { + for _, s := range m.DryRun { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -1604,6 +1672,39 @@ func (m *TypeMeta) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *UpdateOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UpdateOptions) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.DryRun) > 0 { + for _, s := range m.DryRun { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + func (m Verbs) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1793,6 +1894,19 @@ func (m *APIVersions) Size() (n int) { return n } +func (m *CreateOptions) Size() (n int) { + var l int + _ = l + if len(m.DryRun) > 0 { + for _, s := range m.DryRun { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + n += 2 + return n +} + func (m *DeleteOptions) Size() (n int) { var l int _ = l @@ -1810,6 +1924,12 @@ func (m *DeleteOptions) Size() (n int) { l = len(*m.PropagationPolicy) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.DryRun) > 0 { + for _, s := range m.DryRun { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -2197,6 +2317,18 @@ func (m *TypeMeta) Size() (n int) { return n } +func (m *UpdateOptions) Size() (n int) { + var l int + _ = l + if len(m.DryRun) > 0 { + for _, s := range m.DryRun { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m Verbs) Size() (n int) { var l int _ = l @@ -2284,6 +2416,17 @@ func (this *APIResourceList) String() string { }, "") return s } +func (this *CreateOptions) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CreateOptions{`, + `DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`, + `IncludeUninitialized:` + fmt.Sprintf("%v", this.IncludeUninitialized) + `,`, + `}`, + }, "") + return s +} func (this *DeleteOptions) String() string { if this == nil { return "nil" @@ -2293,6 +2436,7 @@ func (this *DeleteOptions) String() string { `Preconditions:` + strings.Replace(fmt.Sprintf("%v", this.Preconditions), "Preconditions", "Preconditions", 1) + `,`, `OrphanDependents:` + valueToStringGenerated(this.OrphanDependents) + `,`, `PropagationPolicy:` + valueToStringGenerated(this.PropagationPolicy) + `,`, + `DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`, `}`, }, "") return s @@ -2598,6 +2742,16 @@ func (this *TypeMeta) String() string { }, "") return s } +func (this *UpdateOptions) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&UpdateOptions{`, + `DryRun:` + fmt.Sprintf("%v", this.DryRun) + `,`, + `}`, + }, "") + return s +} func (this *WatchEvent) String() string { if this == nil { return "nil" @@ -3395,6 +3549,105 @@ func (m *APIVersions) Unmarshal(dAtA []byte) error { } return nil } +func (m *CreateOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CreateOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DryRun = append(m.DryRun, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IncludeUninitialized", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.IncludeUninitialized = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *DeleteOptions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3528,6 +3781,35 @@ func (m *DeleteOptions) Unmarshal(dAtA []byte) error { s := DeletionPropagation(dAtA[iNdEx:postIndex]) m.PropagationPolicy = &s iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DryRun = append(m.DryRun, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7506,6 +7788,85 @@ func (m *TypeMeta) Unmarshal(dAtA []byte) error { } return nil } +func (m *UpdateOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UpdateOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DryRun", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DryRun = append(m.DryRun, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Verbs) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -7804,158 +8165,160 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 2435 bytes of a gzipped FileDescriptorProto + // 2465 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x4e, 0xdb, 0xb1, 0x63, 0x3f, 0xc7, 0xf9, 0xa9, 0xcd, 0x80, 0x37, 0x02, 0x3b, 0xdb, 0x8b, - 0x56, 0x59, 0x98, 0xb5, 0x49, 0x16, 0x56, 0xc3, 0x00, 0x03, 0xe9, 0x38, 0x33, 0x8a, 0x76, 0x32, - 0x63, 0x55, 0x76, 0x06, 0x31, 0x8c, 0x10, 0x9d, 0x76, 0xc5, 0x69, 0xd2, 0xee, 0xf6, 0x56, 0x95, - 0x33, 0x09, 0x1c, 0xd8, 0x03, 0x48, 0x1c, 0x10, 0x9a, 0x23, 0x27, 0xb4, 0x23, 0xb8, 0x70, 0xe5, - 0xc4, 0x05, 0x4e, 0x48, 0xcc, 0x71, 0x24, 0x2e, 0x7b, 0x40, 0xd6, 0x8e, 0xf7, 0xc0, 0x09, 0x71, - 0xcf, 0x09, 0x55, 0x75, 0xf5, 0x9f, 0x1d, 0x4f, 0xda, 0x3b, 0x0b, 0xe2, 0x14, 0xf7, 0xfb, 0xf9, - 0xde, 0xab, 0x57, 0xaf, 0x5e, 0xbd, 0x7a, 0x81, 0xbd, 0xe3, 0x6b, 0xac, 0x6e, 0x7b, 0x8d, 0xe3, - 0xfe, 0x01, 0xa1, 0x2e, 0xe1, 0x84, 0x35, 0x4e, 0x88, 0xdb, 0xf6, 0x68, 0x43, 0x31, 0xcc, 0x9e, - 0xdd, 0x35, 0xad, 0x23, 0xdb, 0x25, 0xf4, 0xac, 0xd1, 0x3b, 0xee, 0x08, 0x02, 0x6b, 0x74, 0x09, - 0x37, 0x1b, 0x27, 0x1b, 0x8d, 0x0e, 0x71, 0x09, 0x35, 0x39, 0x69, 0xd7, 0x7b, 0xd4, 0xe3, 0x1e, - 0xfa, 0x92, 0xaf, 0x55, 0x8f, 0x6b, 0xd5, 0x7b, 0xc7, 0x1d, 0x41, 0x60, 0x75, 0xa1, 0x55, 0x3f, - 0xd9, 0x58, 0x7d, 0xab, 0x63, 0xf3, 0xa3, 0xfe, 0x41, 0xdd, 0xf2, 0xba, 0x8d, 0x8e, 0xd7, 0xf1, - 0x1a, 0x52, 0xf9, 0xa0, 0x7f, 0x28, 0xbf, 0xe4, 0x87, 0xfc, 0xe5, 0x83, 0xae, 0x4e, 0x74, 0x85, - 0xf6, 0x5d, 0x6e, 0x77, 0xc9, 0xa8, 0x17, 0xab, 0xef, 0x5c, 0xa6, 0xc0, 0xac, 0x23, 0xd2, 0x35, - 0xc7, 0xf4, 0xde, 0x9e, 0xa4, 0xd7, 0xe7, 0xb6, 0xd3, 0xb0, 0x5d, 0xce, 0x38, 0x1d, 0x55, 0xd2, - 0xff, 0x96, 0x85, 0xc2, 0x56, 0x6b, 0xf7, 0x16, 0xf5, 0xfa, 0x3d, 0xb4, 0x06, 0xb3, 0xae, 0xd9, - 0x25, 0x15, 0x6d, 0x4d, 0x5b, 0x2f, 0x1a, 0xf3, 0x4f, 0x07, 0xb5, 0x99, 0xe1, 0xa0, 0x36, 0x7b, - 0xc7, 0xec, 0x12, 0x2c, 0x39, 0xc8, 0x81, 0xc2, 0x09, 0xa1, 0xcc, 0xf6, 0x5c, 0x56, 0xc9, 0xac, - 0x65, 0xd7, 0x4b, 0x9b, 0x37, 0xea, 0x69, 0x82, 0x56, 0x97, 0x06, 0xee, 0xfb, 0xaa, 0x37, 0x3d, - 0xda, 0xb4, 0x99, 0xe5, 0x9d, 0x10, 0x7a, 0x66, 0x2c, 0x29, 0x2b, 0x05, 0xc5, 0x64, 0x38, 0xb4, - 0x80, 0x7e, 0xae, 0xc1, 0x52, 0x8f, 0x92, 0x43, 0x42, 0x29, 0x69, 0x2b, 0x7e, 0x25, 0xbb, 0xa6, - 0x7d, 0x06, 0x66, 0x2b, 0xca, 0xec, 0x52, 0x6b, 0x04, 0x1f, 0x8f, 0x59, 0x44, 0xbf, 0xd3, 0x60, - 0x95, 0x11, 0x7a, 0x42, 0xe8, 0x56, 0xbb, 0x4d, 0x09, 0x63, 0xc6, 0xd9, 0xb6, 0x63, 0x13, 0x97, - 0x6f, 0xef, 0x36, 0x31, 0xab, 0xcc, 0xca, 0x38, 0x7c, 0x27, 0x9d, 0x43, 0xfb, 0x93, 0x70, 0x0c, - 0x5d, 0x79, 0xb4, 0x3a, 0x51, 0x84, 0xe1, 0x17, 0xb8, 0xa1, 0x1f, 0xc2, 0x7c, 0xb0, 0x91, 0xb7, - 0x6d, 0xc6, 0xd1, 0x7d, 0xc8, 0x77, 0xc4, 0x07, 0xab, 0x68, 0xd2, 0xc1, 0x7a, 0x3a, 0x07, 0x03, - 0x0c, 0x63, 0x41, 0xf9, 0x93, 0x97, 0x9f, 0x0c, 0x2b, 0x34, 0xfd, 0xcf, 0x59, 0x28, 0x6d, 0xb5, - 0x76, 0x31, 0x61, 0x5e, 0x9f, 0x5a, 0x24, 0x45, 0xd2, 0x6c, 0x02, 0x88, 0xbf, 0xac, 0x67, 0x5a, - 0xa4, 0x5d, 0xc9, 0xac, 0x69, 0xeb, 0x05, 0x03, 0x29, 0x39, 0xb8, 0x13, 0x72, 0x70, 0x4c, 0x4a, - 0xa0, 0x1e, 0xdb, 0x6e, 0x5b, 0xee, 0x76, 0x0c, 0xf5, 0x5d, 0xdb, 0x6d, 0x63, 0xc9, 0x41, 0xb7, - 0x21, 0x77, 0x42, 0xe8, 0x81, 0x88, 0xbf, 0x48, 0x88, 0xaf, 0xa4, 0x5b, 0xde, 0x7d, 0xa1, 0x62, - 0x14, 0x87, 0x83, 0x5a, 0x4e, 0xfe, 0xc4, 0x3e, 0x08, 0xaa, 0x03, 0xb0, 0x23, 0x8f, 0x72, 0xe9, - 0x4e, 0x25, 0xb7, 0x96, 0x5d, 0x2f, 0x1a, 0x0b, 0xc2, 0xbf, 0xfd, 0x90, 0x8a, 0x63, 0x12, 0xe8, - 0x1a, 0xcc, 0x33, 0xdb, 0xed, 0xf4, 0x1d, 0x93, 0x0a, 0x42, 0x25, 0x2f, 0xfd, 0x5c, 0x51, 0x7e, - 0xce, 0xef, 0xc7, 0x78, 0x38, 0x21, 0x29, 0x2c, 0x59, 0x26, 0x27, 0x1d, 0x8f, 0xda, 0x84, 0x55, - 0xe6, 0x22, 0x4b, 0xdb, 0x21, 0x15, 0xc7, 0x24, 0xd0, 0xeb, 0x90, 0x93, 0x91, 0xaf, 0x14, 0xa4, - 0x89, 0xb2, 0x32, 0x91, 0x93, 0xdb, 0x82, 0x7d, 0x1e, 0x7a, 0x13, 0xe6, 0xd4, 0xa9, 0xa9, 0x14, - 0xa5, 0xd8, 0xa2, 0x12, 0x9b, 0x0b, 0xd2, 0x3a, 0xe0, 0xeb, 0x7f, 0xd4, 0x60, 0x31, 0xb6, 0x7f, - 0x32, 0x57, 0xae, 0xc1, 0x7c, 0x27, 0x76, 0x52, 0xd4, 0x5e, 0x86, 0xab, 0x89, 0x9f, 0x22, 0x9c, - 0x90, 0x44, 0x04, 0x8a, 0x54, 0x21, 0x05, 0x15, 0x61, 0x23, 0x75, 0xa2, 0x05, 0x3e, 0x44, 0x96, - 0x62, 0x44, 0x86, 0x23, 0x64, 0xfd, 0x9f, 0x9a, 0x4c, 0xba, 0xa0, 0x46, 0xa0, 0xf5, 0x58, 0x1d, - 0xd2, 0x64, 0x08, 0xe7, 0x27, 0xd4, 0x90, 0x4b, 0x0e, 0x6f, 0xe6, 0xff, 0xe2, 0xf0, 0x5e, 0x2f, - 0xfc, 0xe6, 0xc3, 0xda, 0xcc, 0x07, 0xff, 0x58, 0x9b, 0xd1, 0x3f, 0xc9, 0x40, 0xb9, 0x49, 0x1c, - 0xc2, 0xc9, 0xdd, 0x1e, 0x97, 0x2b, 0xb8, 0x09, 0xa8, 0x43, 0x4d, 0x8b, 0xb4, 0x08, 0xb5, 0xbd, - 0xf6, 0x3e, 0xb1, 0x3c, 0xb7, 0xcd, 0xe4, 0x16, 0x65, 0x8d, 0xcf, 0x0d, 0x07, 0x35, 0x74, 0x6b, - 0x8c, 0x8b, 0x2f, 0xd0, 0x40, 0x0e, 0x94, 0x7b, 0x54, 0xfe, 0xb6, 0xb9, 0x2a, 0xe0, 0xe2, 0xe0, - 0xbc, 0x9d, 0x6e, 0xed, 0xad, 0xb8, 0xaa, 0xb1, 0x3c, 0x1c, 0xd4, 0xca, 0x09, 0x12, 0x4e, 0x82, - 0xa3, 0xef, 0xc2, 0x92, 0x47, 0x7b, 0x47, 0xa6, 0xdb, 0x24, 0x3d, 0xe2, 0xb6, 0x89, 0xcb, 0x99, - 0x3c, 0xcc, 0x05, 0x63, 0x45, 0x94, 0xdd, 0xbb, 0x23, 0x3c, 0x3c, 0x26, 0x8d, 0x1e, 0xc0, 0x72, - 0x8f, 0x7a, 0x3d, 0xb3, 0x63, 0x0a, 0xc4, 0x96, 0xe7, 0xd8, 0xd6, 0x99, 0x3c, 0xec, 0x45, 0xe3, - 0xea, 0x70, 0x50, 0x5b, 0x6e, 0x8d, 0x32, 0xcf, 0x07, 0xb5, 0x57, 0x64, 0xe8, 0x04, 0x25, 0x62, - 0xe2, 0x71, 0x18, 0x7d, 0x17, 0x0a, 0xcd, 0x3e, 0x95, 0x14, 0xf4, 0x6d, 0x28, 0xb4, 0xd5, 0x6f, - 0x15, 0xd5, 0xd7, 0x82, 0x3b, 0x29, 0x90, 0x39, 0x1f, 0xd4, 0xca, 0xe2, 0xea, 0xad, 0x07, 0x04, - 0x1c, 0xaa, 0xe8, 0x0f, 0xa1, 0xbc, 0x73, 0xda, 0xf3, 0x28, 0x0f, 0xf6, 0xeb, 0x0d, 0xc8, 0x13, - 0x49, 0x90, 0x68, 0x85, 0xa8, 0x90, 0xfa, 0x62, 0x58, 0x71, 0xc5, 0xc1, 0x26, 0xa7, 0xa6, 0xc5, - 0x55, 0x45, 0x0c, 0x0f, 0xf6, 0x8e, 0x20, 0x62, 0x9f, 0xa7, 0x3f, 0xd1, 0x00, 0x6e, 0x91, 0x10, - 0x7b, 0x0b, 0x16, 0x83, 0x43, 0x91, 0x3c, 0xab, 0x9f, 0x57, 0xda, 0x8b, 0x38, 0xc9, 0xc6, 0xa3, - 0xf2, 0xa8, 0x05, 0x2b, 0xb6, 0x6b, 0x39, 0xfd, 0x36, 0xb9, 0xe7, 0xda, 0xae, 0xcd, 0x6d, 0xd3, - 0xb1, 0x7f, 0x12, 0xd6, 0xe5, 0x2f, 0x28, 0x9c, 0x95, 0xdd, 0x0b, 0x64, 0xf0, 0x85, 0x9a, 0xfa, - 0x43, 0x28, 0xca, 0x0a, 0x21, 0x8a, 0x73, 0x54, 0xae, 0xb4, 0x17, 0x94, 0xab, 0xa0, 0xba, 0x67, - 0x26, 0x55, 0xf7, 0xd8, 0x81, 0x70, 0xa0, 0xec, 0xeb, 0x06, 0x17, 0x4e, 0x2a, 0x0b, 0x57, 0xa1, - 0x10, 0x2c, 0x5c, 0x59, 0x09, 0x1b, 0x8d, 0x00, 0x08, 0x87, 0x12, 0x31, 0x6b, 0x47, 0x90, 0xa8, - 0x76, 0xe9, 0x8c, 0xc5, 0xaa, 0x6f, 0xe6, 0xc5, 0xd5, 0x37, 0x66, 0xe9, 0x67, 0x50, 0x99, 0xd4, - 0x9d, 0xbc, 0x44, 0x3d, 0x4e, 0xef, 0x8a, 0xfe, 0x6b, 0x0d, 0x96, 0xe2, 0x48, 0xe9, 0xb7, 0x2f, - 0xbd, 0x91, 0xcb, 0xef, 0xf1, 0x58, 0x44, 0x7e, 0xab, 0xc1, 0x4a, 0x62, 0x69, 0x53, 0xed, 0xf8, - 0x14, 0x4e, 0xc5, 0x93, 0x23, 0x3b, 0x45, 0x72, 0x34, 0xa0, 0xb4, 0x1b, 0xe6, 0x3d, 0xbd, 0xbc, - 0xf3, 0xd1, 0xff, 0xa2, 0xc1, 0x7c, 0x4c, 0x83, 0xa1, 0x87, 0x30, 0x27, 0xea, 0x9b, 0xed, 0x76, - 0x54, 0x57, 0x96, 0xf2, 0xb2, 0x8c, 0x81, 0x44, 0xeb, 0x6a, 0xf9, 0x48, 0x38, 0x80, 0x44, 0x2d, - 0xc8, 0x53, 0xc2, 0xfa, 0x0e, 0x57, 0xa5, 0xfd, 0x6a, 0xca, 0x6b, 0x8d, 0x9b, 0xbc, 0xcf, 0x0c, - 0x10, 0x35, 0x0a, 0x4b, 0x7d, 0xac, 0x70, 0xf4, 0xbf, 0x67, 0xa0, 0x7c, 0xdb, 0x3c, 0x20, 0xce, - 0x3e, 0x71, 0x88, 0xc5, 0x3d, 0x8a, 0x7e, 0x0a, 0xa5, 0xae, 0xc9, 0xad, 0x23, 0x49, 0x0d, 0x7a, - 0xcb, 0x66, 0x3a, 0x43, 0x09, 0xa4, 0xfa, 0x5e, 0x04, 0xb3, 0xe3, 0x72, 0x7a, 0x66, 0xbc, 0xa2, - 0x16, 0x56, 0x8a, 0x71, 0x70, 0xdc, 0x9a, 0x7c, 0x10, 0xc8, 0xef, 0x9d, 0xd3, 0x9e, 0xb8, 0x44, - 0xa7, 0x7f, 0x87, 0x24, 0x5c, 0xc0, 0xe4, 0xfd, 0xbe, 0x4d, 0x49, 0x97, 0xb8, 0x3c, 0x7a, 0x10, - 0xec, 0x8d, 0xe0, 0xe3, 0x31, 0x8b, 0xab, 0x37, 0x60, 0x69, 0xd4, 0x79, 0xb4, 0x04, 0xd9, 0x63, - 0x72, 0xe6, 0xe7, 0x02, 0x16, 0x3f, 0xd1, 0x0a, 0xe4, 0x4e, 0x4c, 0xa7, 0xaf, 0xea, 0x0f, 0xf6, - 0x3f, 0xae, 0x67, 0xae, 0x69, 0xfa, 0xef, 0x35, 0xa8, 0x4c, 0x72, 0x04, 0x7d, 0x31, 0x06, 0x64, - 0x94, 0x94, 0x57, 0xd9, 0x77, 0xc9, 0x99, 0x8f, 0xba, 0x03, 0x05, 0xaf, 0x27, 0x9e, 0x70, 0x1e, - 0x55, 0x79, 0xfe, 0x66, 0x90, 0xbb, 0x77, 0x15, 0xfd, 0x7c, 0x50, 0xbb, 0x92, 0x80, 0x0f, 0x18, - 0x38, 0x54, 0x45, 0x3a, 0xe4, 0xa5, 0x3f, 0xe2, 0x52, 0x16, 0xed, 0x93, 0xdc, 0xfc, 0xfb, 0x92, - 0x82, 0x15, 0x47, 0xff, 0x93, 0x06, 0xb3, 0xb2, 0x3d, 0x7c, 0x08, 0x05, 0x11, 0xbf, 0xb6, 0xc9, - 0x4d, 0xe9, 0x57, 0xea, 0xc7, 0x84, 0xd0, 0xde, 0x23, 0xdc, 0x8c, 0xce, 0x57, 0x40, 0xc1, 0x21, - 0x22, 0xc2, 0x90, 0xb3, 0x39, 0xe9, 0x06, 0x1b, 0xf9, 0xd6, 0x44, 0x68, 0xf5, 0xfe, 0xad, 0x63, - 0xf3, 0xd1, 0xce, 0x29, 0x27, 0xae, 0xd8, 0x8c, 0xa8, 0x18, 0xec, 0x0a, 0x0c, 0xec, 0x43, 0xe9, - 0x7f, 0xd0, 0x20, 0x34, 0x25, 0x8e, 0x3b, 0x23, 0xce, 0xe1, 0x6d, 0xdb, 0x3d, 0x56, 0x61, 0x0d, - 0xdd, 0xd9, 0x57, 0x74, 0x1c, 0x4a, 0x5c, 0x74, 0xc5, 0x66, 0xa6, 0xbc, 0x62, 0xaf, 0x42, 0xc1, - 0xf2, 0x5c, 0x6e, 0xbb, 0xfd, 0xb1, 0xfa, 0xb2, 0xad, 0xe8, 0x38, 0x94, 0xd0, 0x9f, 0x65, 0xa1, - 0x24, 0x7c, 0x0d, 0xee, 0xf8, 0x6f, 0x42, 0xd9, 0x89, 0xef, 0x9e, 0xf2, 0xf9, 0x8a, 0x82, 0x48, - 0x9e, 0x47, 0x9c, 0x94, 0x15, 0xca, 0x87, 0x36, 0x71, 0xda, 0xa1, 0x72, 0x26, 0xa9, 0x7c, 0x33, - 0xce, 0xc4, 0x49, 0x59, 0x51, 0x67, 0x1f, 0x89, 0xbc, 0x56, 0x8d, 0x5a, 0x18, 0xda, 0xef, 0x09, - 0x22, 0xf6, 0x79, 0x17, 0xc5, 0x67, 0x76, 0xca, 0xf8, 0x5c, 0x87, 0x05, 0xb1, 0x91, 0x5e, 0x9f, - 0x07, 0xdd, 0x6c, 0x4e, 0xf6, 0x5d, 0x68, 0x38, 0xa8, 0x2d, 0xbc, 0x97, 0xe0, 0xe0, 0x11, 0xc9, - 0x89, 0xed, 0x4b, 0xfe, 0xd3, 0xb6, 0x2f, 0x62, 0xd5, 0x8e, 0xdd, 0xb5, 0x79, 0x65, 0x4e, 0x3a, - 0x11, 0xae, 0xfa, 0xb6, 0x20, 0x62, 0x9f, 0x97, 0xd8, 0xd2, 0xc2, 0xa5, 0x5b, 0xfa, 0x3e, 0x14, - 0xf7, 0x6c, 0x8b, 0x7a, 0x62, 0x2d, 0xe2, 0x62, 0x62, 0x89, 0xa6, 0x3d, 0x2c, 0xe0, 0xc1, 0x1a, - 0x03, 0xbe, 0x70, 0xc5, 0x35, 0x5d, 0xcf, 0x6f, 0xcd, 0x73, 0x91, 0x2b, 0x77, 0x04, 0x11, 0xfb, - 0xbc, 0xeb, 0x2b, 0xe2, 0x3e, 0xfa, 0xe5, 0x93, 0xda, 0xcc, 0xe3, 0x27, 0xb5, 0x99, 0x0f, 0x9f, - 0xa8, 0xbb, 0xe9, 0x5f, 0x00, 0x70, 0xf7, 0xe0, 0xc7, 0xc4, 0xf2, 0x73, 0xfe, 0xf2, 0x57, 0xb9, - 0xe8, 0x31, 0xd4, 0x30, 0x48, 0xbe, 0x60, 0x33, 0x23, 0x3d, 0x46, 0x8c, 0x87, 0x13, 0x92, 0xa8, - 0x01, 0xc5, 0xf0, 0xa5, 0xae, 0xf2, 0x7b, 0x59, 0xa9, 0x15, 0xc3, 0xe7, 0x3c, 0x8e, 0x64, 0x12, - 0x07, 0x70, 0xf6, 0xd2, 0x03, 0x68, 0x40, 0xb6, 0x6f, 0xb7, 0x65, 0x4a, 0x14, 0x8d, 0xaf, 0x06, - 0x05, 0xf0, 0xde, 0x6e, 0xf3, 0x7c, 0x50, 0x7b, 0x6d, 0xd2, 0x8c, 0x8b, 0x9f, 0xf5, 0x08, 0xab, - 0xdf, 0xdb, 0x6d, 0x62, 0xa1, 0x7c, 0x51, 0x92, 0xe6, 0xa7, 0x4c, 0xd2, 0x4d, 0x00, 0xb5, 0x6a, - 0xa1, 0xed, 0xe7, 0x46, 0x38, 0xb5, 0xb8, 0x15, 0x72, 0x70, 0x4c, 0x0a, 0x31, 0x58, 0xb6, 0x28, - 0x91, 0xbf, 0xc5, 0xd6, 0x33, 0x6e, 0x76, 0xfd, 0x77, 0x7b, 0x69, 0xf3, 0xcb, 0xe9, 0x2a, 0xa6, - 0x50, 0x33, 0x5e, 0x55, 0x66, 0x96, 0xb7, 0x47, 0xc1, 0xf0, 0x38, 0x3e, 0xf2, 0x60, 0xb9, 0xad, - 0x5e, 0x3d, 0x91, 0xd1, 0xe2, 0xd4, 0x46, 0xaf, 0x08, 0x83, 0xcd, 0x51, 0x20, 0x3c, 0x8e, 0x8d, - 0x7e, 0x08, 0xab, 0x01, 0x71, 0xfc, 0xe9, 0x59, 0x01, 0x19, 0xa9, 0xaa, 0x78, 0x0c, 0x37, 0x27, - 0x4a, 0xe1, 0x17, 0x20, 0xa0, 0x36, 0xe4, 0x1d, 0xbf, 0xbb, 0x28, 0xc9, 0x1b, 0xe1, 0x5b, 0xe9, - 0x56, 0x11, 0x65, 0x7f, 0x3d, 0xde, 0x55, 0x84, 0xcf, 0x2f, 0xd5, 0x50, 0x28, 0x6c, 0x74, 0x0a, - 0x25, 0xd3, 0x75, 0x3d, 0x6e, 0xfa, 0x8f, 0xe1, 0x79, 0x69, 0x6a, 0x6b, 0x6a, 0x53, 0x5b, 0x11, - 0xc6, 0x48, 0x17, 0x13, 0xe3, 0xe0, 0xb8, 0x29, 0xf4, 0x08, 0x16, 0xbd, 0x47, 0x2e, 0xa1, 0x98, - 0x1c, 0x12, 0x4a, 0x5c, 0x8b, 0xb0, 0x4a, 0x59, 0x5a, 0xff, 0x5a, 0x4a, 0xeb, 0x09, 0xe5, 0x28, - 0xa5, 0x93, 0x74, 0x86, 0x47, 0xad, 0xa0, 0x3a, 0xc0, 0xa1, 0xed, 0xaa, 0x5e, 0xb4, 0xb2, 0x10, - 0x8d, 0x9e, 0x6e, 0x86, 0x54, 0x1c, 0x93, 0x40, 0x5f, 0x87, 0x92, 0xe5, 0xf4, 0x19, 0x27, 0xfe, - 0x8c, 0x6b, 0x51, 0x9e, 0xa0, 0x70, 0x7d, 0xdb, 0x11, 0x0b, 0xc7, 0xe5, 0xd0, 0x11, 0xcc, 0xdb, - 0xb1, 0xa6, 0xb7, 0xb2, 0x24, 0x73, 0x71, 0x73, 0xea, 0x4e, 0x97, 0x19, 0x4b, 0xa2, 0x12, 0xc5, - 0x29, 0x38, 0x81, 0xbc, 0xfa, 0x0d, 0x28, 0x7d, 0xca, 0x1e, 0x4c, 0xf4, 0x70, 0xa3, 0x5b, 0x37, - 0x55, 0x0f, 0xf7, 0xd7, 0x0c, 0x2c, 0x24, 0x03, 0x1e, 0xbe, 0x75, 0xb4, 0x89, 0x33, 0xcb, 0xa0, - 0x2a, 0x67, 0x27, 0x56, 0x65, 0x55, 0xfc, 0x66, 0x5f, 0xa6, 0xf8, 0x6d, 0x02, 0x98, 0x3d, 0x3b, - 0xa8, 0x7b, 0x7e, 0x1d, 0x0d, 0x2b, 0x57, 0x34, 0x45, 0xc3, 0x31, 0x29, 0x39, 0x95, 0xf4, 0x5c, - 0x4e, 0x3d, 0xc7, 0x21, 0x54, 0x5d, 0xa6, 0xfe, 0x54, 0x32, 0xa4, 0xe2, 0x98, 0x04, 0xba, 0x09, - 0xe8, 0xc0, 0xf1, 0xac, 0x63, 0x19, 0x82, 0xe0, 0x9c, 0xcb, 0x2a, 0x59, 0xf0, 0x87, 0x52, 0xc6, - 0x18, 0x17, 0x5f, 0xa0, 0xa1, 0xcf, 0x41, 0xae, 0x25, 0xda, 0x0a, 0xfd, 0x2e, 0x24, 0xe7, 0x49, - 0xe8, 0x86, 0x1f, 0x09, 0x2d, 0x1c, 0xf8, 0x4c, 0x17, 0x05, 0xfd, 0x2a, 0x14, 0xb1, 0xe7, 0xf1, - 0x96, 0xc9, 0x8f, 0x18, 0xaa, 0x41, 0xae, 0x27, 0x7e, 0xa8, 0x61, 0xa1, 0x9c, 0xff, 0x4a, 0x0e, - 0xf6, 0xe9, 0xfa, 0xaf, 0x34, 0x78, 0x75, 0xe2, 0xec, 0x4e, 0x44, 0xd4, 0x0a, 0xbf, 0x94, 0x4b, - 0x61, 0x44, 0x23, 0x39, 0x1c, 0x93, 0x12, 0x9d, 0x58, 0x62, 0xe0, 0x37, 0xda, 0x89, 0x25, 0xac, - 0xe1, 0xa4, 0xac, 0xfe, 0xef, 0x0c, 0xe4, 0xfd, 0x67, 0xd9, 0x7f, 0xb9, 0xf9, 0x7e, 0x03, 0xf2, - 0x4c, 0xda, 0x51, 0xee, 0x85, 0xd5, 0xd2, 0xb7, 0x8e, 0x15, 0x57, 0x34, 0x31, 0x5d, 0xc2, 0x98, - 0xd9, 0x09, 0x92, 0x37, 0x6c, 0x62, 0xf6, 0x7c, 0x32, 0x0e, 0xf8, 0xe8, 0x1d, 0xf1, 0x0a, 0x35, - 0x59, 0xd8, 0x17, 0x56, 0x03, 0x48, 0x2c, 0xa9, 0xe7, 0x83, 0xda, 0xbc, 0x02, 0x97, 0xdf, 0x58, - 0x49, 0xa3, 0x07, 0x30, 0xd7, 0x26, 0xdc, 0xb4, 0x1d, 0xbf, 0x1d, 0x4c, 0x3d, 0x99, 0xf4, 0xc1, - 0x9a, 0xbe, 0xaa, 0x51, 0x12, 0x3e, 0xa9, 0x0f, 0x1c, 0x00, 0x8a, 0x83, 0x67, 0x79, 0x6d, 0x7f, - 0x4c, 0x9f, 0x8b, 0x0e, 0xde, 0xb6, 0xd7, 0x26, 0x58, 0x72, 0xf4, 0xc7, 0x1a, 0x94, 0x7c, 0xa4, - 0x6d, 0xb3, 0xcf, 0x08, 0xda, 0x08, 0x57, 0xe1, 0x6f, 0x77, 0x70, 0x27, 0xcf, 0xbe, 0x77, 0xd6, - 0x23, 0xe7, 0x83, 0x5a, 0x51, 0x8a, 0x89, 0x8f, 0x70, 0x01, 0xb1, 0x18, 0x65, 0x2e, 0x89, 0xd1, - 0xeb, 0x90, 0x93, 0xad, 0xb7, 0x0a, 0x66, 0xd8, 0xe8, 0xc9, 0xf6, 0x1c, 0xfb, 0x3c, 0xfd, 0xe3, - 0x0c, 0x94, 0x13, 0x8b, 0x4b, 0xd1, 0xd5, 0x85, 0xa3, 0x92, 0x4c, 0x8a, 0xf1, 0xdb, 0xe4, 0x7f, - 0xae, 0x7c, 0x1f, 0xf2, 0x96, 0x58, 0x5f, 0xf0, 0xdf, 0xad, 0x8d, 0x69, 0xb6, 0x42, 0x46, 0x26, - 0xca, 0x24, 0xf9, 0xc9, 0xb0, 0x02, 0x44, 0xb7, 0x60, 0x99, 0x12, 0x4e, 0xcf, 0xb6, 0x0e, 0x39, - 0xa1, 0xf1, 0xfe, 0x3f, 0x17, 0xf5, 0x3d, 0x78, 0x54, 0x00, 0x8f, 0xeb, 0x04, 0xa5, 0x32, 0xff, - 0x12, 0xa5, 0x52, 0x77, 0x60, 0xf6, 0x7f, 0xd8, 0xa3, 0xff, 0x00, 0x8a, 0x51, 0x17, 0xf5, 0x19, - 0x9b, 0xd4, 0x7f, 0x04, 0x05, 0x91, 0x8d, 0x41, 0xf7, 0x7f, 0xc9, 0x4d, 0x94, 0xbc, 0x23, 0x32, - 0x69, 0xee, 0x08, 0x7d, 0x13, 0xfc, 0xff, 0x99, 0x89, 0x6a, 0xea, 0xbf, 0xd8, 0x63, 0xd5, 0x34, - 0xfe, 0xfc, 0x8e, 0x8d, 0xcc, 0x7e, 0xa1, 0x01, 0xc8, 0xe7, 0xe3, 0xce, 0x09, 0x71, 0xb9, 0x70, - 0x4c, 0xec, 0xc0, 0xa8, 0x63, 0xf2, 0x18, 0x49, 0x0e, 0xba, 0x07, 0x79, 0x4f, 0x76, 0x57, 0x6a, - 0x86, 0x35, 0xe5, 0x38, 0x20, 0xcc, 0x3a, 0xbf, 0x45, 0xc3, 0x0a, 0xcc, 0x58, 0x7f, 0xfa, 0xbc, - 0x3a, 0xf3, 0xec, 0x79, 0x75, 0xe6, 0xa3, 0xe7, 0xd5, 0x99, 0x0f, 0x86, 0x55, 0xed, 0xe9, 0xb0, - 0xaa, 0x3d, 0x1b, 0x56, 0xb5, 0x8f, 0x86, 0x55, 0xed, 0xe3, 0x61, 0x55, 0x7b, 0xfc, 0x49, 0x75, - 0xe6, 0x41, 0xe6, 0x64, 0xe3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6c, 0xc5, 0x28, 0xb2, 0x54, - 0x20, 0x00, 0x00, + 0xf5, 0x4f, 0xdb, 0xb1, 0x63, 0x3f, 0xc7, 0xf9, 0xa8, 0xcd, 0xfe, 0xff, 0xde, 0x08, 0xec, 0x6c, + 0x2f, 0x5a, 0x65, 0x61, 0xd6, 0x26, 0x59, 0x58, 0x0d, 0x03, 0x2c, 0xc4, 0x71, 0x66, 0x14, 0xed, + 0x64, 0xc6, 0xaa, 0xec, 0x0c, 0x62, 0x18, 0x21, 0x3a, 0xdd, 0x15, 0xa7, 0x49, 0xbb, 0xdb, 0x5b, + 0xd5, 0xce, 0x8c, 0xe1, 0xc0, 0x1e, 0x40, 0x70, 0x40, 0x68, 0x8e, 0x9c, 0xd0, 0x8e, 0xe0, 0xc2, + 0x95, 0x13, 0x17, 0x38, 0x21, 0x31, 0xc7, 0x91, 0xb8, 0xec, 0x01, 0x59, 0x3b, 0xe6, 0xc0, 0x09, + 0x71, 0xcf, 0x09, 0x55, 0x75, 0x75, 0x75, 0xb7, 0x1d, 0x4f, 0xda, 0x3b, 0xbb, 0x88, 0x53, 0xd2, + 0xef, 0xe3, 0xf7, 0x5e, 0x55, 0xbd, 0x7a, 0xef, 0xd5, 0x33, 0x1c, 0x9c, 0x5e, 0x65, 0x75, 0xdb, + 0x6b, 0x9c, 0xf6, 0x8f, 0x08, 0x75, 0x89, 0x4f, 0x58, 0xe3, 0x8c, 0xb8, 0x96, 0x47, 0x1b, 0x92, + 0x61, 0xf4, 0xec, 0xae, 0x61, 0x9e, 0xd8, 0x2e, 0xa1, 0x83, 0x46, 0xef, 0xb4, 0xc3, 0x09, 0xac, + 0xd1, 0x25, 0xbe, 0xd1, 0x38, 0xdb, 0x6a, 0x74, 0x88, 0x4b, 0xa8, 0xe1, 0x13, 0xab, 0xde, 0xa3, + 0x9e, 0xef, 0xa1, 0x2f, 0x04, 0x5a, 0xf5, 0xb8, 0x56, 0xbd, 0x77, 0xda, 0xe1, 0x04, 0x56, 0xe7, + 0x5a, 0xf5, 0xb3, 0xad, 0xf5, 0x37, 0x3b, 0xb6, 0x7f, 0xd2, 0x3f, 0xaa, 0x9b, 0x5e, 0xb7, 0xd1, + 0xf1, 0x3a, 0x5e, 0x43, 0x28, 0x1f, 0xf5, 0x8f, 0xc5, 0x97, 0xf8, 0x10, 0xff, 0x05, 0xa0, 0xeb, + 0x53, 0x5d, 0xa1, 0x7d, 0xd7, 0xb7, 0xbb, 0x64, 0xdc, 0x8b, 0xf5, 0xb7, 0x2f, 0x53, 0x60, 0xe6, + 0x09, 0xe9, 0x1a, 0xe3, 0x7a, 0xfa, 0x5f, 0xb3, 0x50, 0xd8, 0x69, 0xef, 0xdf, 0xa0, 0x5e, 0xbf, + 0x87, 0x36, 0x60, 0xde, 0x35, 0xba, 0xa4, 0xa2, 0x6d, 0x68, 0x9b, 0xc5, 0xe6, 0xe2, 0x93, 0x61, + 0x6d, 0x6e, 0x34, 0xac, 0xcd, 0xdf, 0x32, 0xba, 0x04, 0x0b, 0x0e, 0x72, 0xa0, 0x70, 0x46, 0x28, + 0xb3, 0x3d, 0x97, 0x55, 0x32, 0x1b, 0xd9, 0xcd, 0xd2, 0xf6, 0x3b, 0xf5, 0x34, 0xeb, 0xaf, 0x0b, + 0x03, 0x77, 0x03, 0xd5, 0xeb, 0x1e, 0x6d, 0xd9, 0xcc, 0xf4, 0xce, 0x08, 0x1d, 0x34, 0x57, 0xa4, + 0x95, 0x82, 0x64, 0x32, 0xac, 0x2c, 0xa0, 0x9f, 0x6a, 0xb0, 0xd2, 0xa3, 0xe4, 0x98, 0x50, 0x4a, + 0x2c, 0xc9, 0xaf, 0x64, 0x37, 0xb4, 0x4f, 0xc1, 0x6c, 0x45, 0x9a, 0x5d, 0x69, 0x8f, 0xe1, 0xe3, + 0x09, 0x8b, 0xe8, 0xb7, 0x1a, 0xac, 0x33, 0x42, 0xcf, 0x08, 0xdd, 0xb1, 0x2c, 0x4a, 0x18, 0x6b, + 0x0e, 0x76, 0x1d, 0x9b, 0xb8, 0xfe, 0xee, 0x7e, 0x0b, 0xb3, 0xca, 0xbc, 0xd8, 0x87, 0x6f, 0xa5, + 0x73, 0xe8, 0x70, 0x1a, 0x4e, 0x53, 0x97, 0x1e, 0xad, 0x4f, 0x15, 0x61, 0xf8, 0x39, 0x6e, 0xe8, + 0xc7, 0xb0, 0x18, 0x1e, 0xe4, 0x4d, 0x9b, 0xf9, 0xe8, 0x2e, 0xe4, 0x3b, 0xfc, 0x83, 0x55, 0x34, + 0xe1, 0x60, 0x3d, 0x9d, 0x83, 0x21, 0x46, 0x73, 0x49, 0xfa, 0x93, 0x17, 0x9f, 0x0c, 0x4b, 0x34, + 0xfd, 0x4f, 0x59, 0x28, 0xed, 0xb4, 0xf7, 0x31, 0x61, 0x5e, 0x9f, 0x9a, 0x24, 0x45, 0xd0, 0x6c, + 0x03, 0xf0, 0xbf, 0xac, 0x67, 0x98, 0xc4, 0xaa, 0x64, 0x36, 0xb4, 0xcd, 0x42, 0x13, 0x49, 0x39, + 0xb8, 0xa5, 0x38, 0x38, 0x26, 0xc5, 0x51, 0x4f, 0x6d, 0xd7, 0x12, 0xa7, 0x1d, 0x43, 0x7d, 0xd7, + 0x76, 0x2d, 0x2c, 0x38, 0xe8, 0x26, 0xe4, 0xce, 0x08, 0x3d, 0xe2, 0xfb, 0xcf, 0x03, 0xe2, 0x4b, + 0xe9, 0x96, 0x77, 0x97, 0xab, 0x34, 0x8b, 0xa3, 0x61, 0x2d, 0x27, 0xfe, 0xc5, 0x01, 0x08, 0xaa, + 0x03, 0xb0, 0x13, 0x8f, 0xfa, 0xc2, 0x9d, 0x4a, 0x6e, 0x23, 0xbb, 0x59, 0x6c, 0x2e, 0x71, 0xff, + 0x0e, 0x15, 0x15, 0xc7, 0x24, 0xd0, 0x55, 0x58, 0x64, 0xb6, 0xdb, 0xe9, 0x3b, 0x06, 0xe5, 0x84, + 0x4a, 0x5e, 0xf8, 0xb9, 0x26, 0xfd, 0x5c, 0x3c, 0x8c, 0xf1, 0x70, 0x42, 0x92, 0x5b, 0x32, 0x0d, + 0x9f, 0x74, 0x3c, 0x6a, 0x13, 0x56, 0x59, 0x88, 0x2c, 0xed, 0x2a, 0x2a, 0x8e, 0x49, 0xa0, 0xd7, + 0x20, 0x27, 0x76, 0xbe, 0x52, 0x10, 0x26, 0xca, 0xd2, 0x44, 0x4e, 0x1c, 0x0b, 0x0e, 0x78, 0xe8, + 0x0d, 0x58, 0x90, 0xb7, 0xa6, 0x52, 0x14, 0x62, 0xcb, 0x52, 0x6c, 0x21, 0x0c, 0xeb, 0x90, 0xaf, + 0xff, 0x41, 0x83, 0xe5, 0xd8, 0xf9, 0x89, 0x58, 0xb9, 0x0a, 0x8b, 0x9d, 0xd8, 0x4d, 0x91, 0x67, + 0xa9, 0x56, 0x13, 0xbf, 0x45, 0x38, 0x21, 0x89, 0x08, 0x14, 0xa9, 0x44, 0x0a, 0x33, 0xc2, 0x56, + 0xea, 0x40, 0x0b, 0x7d, 0x88, 0x2c, 0xc5, 0x88, 0x0c, 0x47, 0xc8, 0xfa, 0x3f, 0x35, 0x11, 0x74, + 0x61, 0x8e, 0x40, 0x9b, 0xb1, 0x3c, 0xa4, 0x89, 0x2d, 0x5c, 0x9c, 0x92, 0x43, 0x2e, 0xb9, 0xbc, + 0x99, 0xff, 0x89, 0xcb, 0x7b, 0xad, 0xf0, 0xeb, 0x0f, 0x6b, 0x73, 0x1f, 0xfc, 0x7d, 0x63, 0x4e, + 0xff, 0x99, 0x06, 0xe5, 0x5d, 0x4a, 0x0c, 0x9f, 0xdc, 0xee, 0xf9, 0x62, 0x05, 0x3a, 0xe4, 0x2d, + 0x3a, 0xc0, 0x7d, 0x57, 0xae, 0x14, 0xf8, 0xa5, 0x6c, 0x09, 0x0a, 0x96, 0x1c, 0xd4, 0x86, 0x35, + 0xdb, 0x35, 0x9d, 0xbe, 0x45, 0xee, 0xb8, 0xb6, 0x6b, 0xfb, 0xb6, 0xe1, 0xd8, 0x3f, 0x52, 0x97, + 0xed, 0x73, 0xd2, 0xbb, 0xb5, 0xfd, 0x0b, 0x64, 0xf0, 0x85, 0x9a, 0xfa, 0xcf, 0xb3, 0x50, 0x6e, + 0x11, 0x87, 0x44, 0x7e, 0x5c, 0x07, 0xd4, 0xa1, 0x86, 0x49, 0xda, 0x84, 0xda, 0x9e, 0x75, 0x48, + 0x4c, 0xcf, 0xb5, 0x98, 0x08, 0x95, 0x6c, 0xf3, 0xff, 0x46, 0xc3, 0x1a, 0xba, 0x31, 0xc1, 0xc5, + 0x17, 0x68, 0x20, 0x07, 0xca, 0x3d, 0x2a, 0xfe, 0xb7, 0x7d, 0x59, 0x48, 0xf8, 0x05, 0x7e, 0x2b, + 0xdd, 0x19, 0xb4, 0xe3, 0xaa, 0xcd, 0xd5, 0xd1, 0xb0, 0x56, 0x4e, 0x90, 0x70, 0x12, 0x1c, 0x7d, + 0x1b, 0x56, 0x3c, 0xda, 0x3b, 0x31, 0xdc, 0x16, 0xe9, 0x11, 0xd7, 0x22, 0xae, 0xcf, 0x44, 0x52, + 0x29, 0x34, 0xd7, 0x78, 0xfa, 0xbf, 0x3d, 0xc6, 0xc3, 0x13, 0xd2, 0xe8, 0x1e, 0xac, 0xf6, 0xa8, + 0xd7, 0x33, 0x3a, 0x06, 0x47, 0x6c, 0x7b, 0x8e, 0x6d, 0x0e, 0x44, 0xd2, 0x29, 0x36, 0xaf, 0x8c, + 0x86, 0xb5, 0xd5, 0xf6, 0x38, 0xf3, 0x7c, 0x58, 0x7b, 0x49, 0x6c, 0x1d, 0xa7, 0x44, 0x4c, 0x3c, + 0x09, 0x13, 0x3b, 0xdb, 0xdc, 0xb4, 0xb3, 0xd5, 0xf7, 0xa1, 0xd0, 0xea, 0x53, 0xa1, 0x85, 0xbe, + 0x09, 0x05, 0x4b, 0xfe, 0x2f, 0x77, 0xfe, 0xd5, 0xb0, 0x7e, 0x86, 0x32, 0xe7, 0xc3, 0x5a, 0x99, + 0x57, 0xfc, 0x7a, 0x48, 0xc0, 0x4a, 0x45, 0xbf, 0x0f, 0xe5, 0xbd, 0x87, 0x3d, 0x8f, 0xfa, 0xe1, + 0x99, 0xbe, 0x0e, 0x79, 0x22, 0x08, 0x02, 0xad, 0x10, 0x25, 0xfd, 0x40, 0x0c, 0x4b, 0x2e, 0x4f, + 0x42, 0xe4, 0xa1, 0x61, 0xfa, 0x32, 0xa0, 0x54, 0x12, 0xda, 0xe3, 0x44, 0x1c, 0xf0, 0xf4, 0xc7, + 0x1a, 0xc0, 0x0d, 0xa2, 0xb0, 0x77, 0x60, 0x39, 0xbc, 0xc0, 0xc9, 0xbc, 0xf2, 0xff, 0x52, 0x7b, + 0x19, 0x27, 0xd9, 0x78, 0x5c, 0xfe, 0x33, 0x08, 0xeb, 0xfb, 0x50, 0x14, 0xd9, 0x8c, 0x17, 0x92, + 0x28, 0xb5, 0x6a, 0xcf, 0x49, 0xad, 0x61, 0x25, 0xca, 0x4c, 0xab, 0x44, 0xb1, 0xcb, 0xeb, 0x40, + 0x39, 0xd0, 0x0d, 0x8b, 0x63, 0x2a, 0x0b, 0x57, 0xa0, 0x10, 0x2e, 0x5c, 0x5a, 0x51, 0x4d, 0x51, + 0x08, 0x84, 0x95, 0x44, 0xcc, 0xda, 0x09, 0x24, 0x32, 0x73, 0x3a, 0x63, 0xb1, 0x4a, 0x91, 0x79, + 0x7e, 0xa5, 0x88, 0x59, 0xfa, 0x09, 0x54, 0xa6, 0x75, 0x52, 0x2f, 0x50, 0x3b, 0xd2, 0xbb, 0xa2, + 0xff, 0x4a, 0x83, 0x95, 0x38, 0x52, 0xfa, 0xe3, 0x4b, 0x6f, 0xe4, 0xf2, 0x9e, 0x23, 0xb6, 0x23, + 0xbf, 0xd1, 0x60, 0x2d, 0xb1, 0xb4, 0x99, 0x4e, 0x7c, 0x06, 0xa7, 0xe2, 0xc1, 0x91, 0x9d, 0x21, + 0x38, 0x1a, 0x50, 0xda, 0x57, 0x71, 0x4f, 0x2f, 0xef, 0xd2, 0xf4, 0x3f, 0x6b, 0xb0, 0x18, 0xd3, + 0x60, 0xe8, 0x3e, 0x2c, 0xf0, 0x1c, 0x68, 0xbb, 0x1d, 0xd9, 0x41, 0xa6, 0x2c, 0xec, 0x31, 0x90, + 0x68, 0x5d, 0xed, 0x00, 0x09, 0x87, 0x90, 0xa8, 0x0d, 0x79, 0x4a, 0x58, 0xdf, 0xf1, 0x65, 0xfa, + 0xbf, 0x92, 0xb2, 0x04, 0xfb, 0x86, 0xdf, 0x67, 0x41, 0x9e, 0xc4, 0x42, 0x1f, 0x4b, 0x1c, 0xfd, + 0x6f, 0x19, 0x28, 0xdf, 0x34, 0x8e, 0x88, 0x73, 0x48, 0x1c, 0x62, 0xfa, 0x1e, 0x45, 0x3f, 0x86, + 0x52, 0xd7, 0xf0, 0xcd, 0x13, 0x41, 0x0d, 0xfb, 0xe0, 0x56, 0x3a, 0x43, 0x09, 0xa4, 0xfa, 0x41, + 0x04, 0xb3, 0xe7, 0xfa, 0x74, 0xd0, 0x7c, 0x49, 0x2e, 0xac, 0x14, 0xe3, 0xe0, 0xb8, 0x35, 0xf1, + 0x78, 0x11, 0xdf, 0x7b, 0x0f, 0x7b, 0xbc, 0xe0, 0xcf, 0xfe, 0x66, 0x4a, 0xb8, 0x80, 0xc9, 0xfb, + 0x7d, 0x9b, 0x92, 0x2e, 0x71, 0xfd, 0xe8, 0xf1, 0x72, 0x30, 0x86, 0x8f, 0x27, 0x2c, 0xae, 0xbf, + 0x03, 0x2b, 0xe3, 0xce, 0xa3, 0x15, 0xc8, 0x9e, 0x92, 0x41, 0x10, 0x0b, 0x98, 0xff, 0x8b, 0xd6, + 0x20, 0x77, 0x66, 0x38, 0x7d, 0x99, 0x7f, 0x70, 0xf0, 0x71, 0x2d, 0x73, 0x55, 0xd3, 0x7f, 0xa7, + 0x41, 0x65, 0x9a, 0x23, 0xe8, 0xf3, 0x31, 0xa0, 0x66, 0x49, 0x7a, 0x95, 0x7d, 0x97, 0x0c, 0x02, + 0xd4, 0x3d, 0x28, 0x78, 0x3d, 0xfe, 0xdc, 0xf4, 0xa8, 0x8c, 0xf3, 0x37, 0xc2, 0xd8, 0xbd, 0x2d, + 0xe9, 0xe7, 0xc3, 0xda, 0xcb, 0x09, 0xf8, 0x90, 0x81, 0x95, 0x2a, 0x2f, 0x92, 0xc2, 0x1f, 0x5e, + 0xb8, 0x55, 0x91, 0xbc, 0x2b, 0x28, 0x58, 0x72, 0xf4, 0x3f, 0x6a, 0x30, 0x2f, 0x5a, 0xd9, 0xfb, + 0x50, 0xe0, 0xfb, 0x67, 0x19, 0xbe, 0x21, 0xfc, 0x4a, 0xfd, 0xf0, 0xe1, 0xda, 0x07, 0xc4, 0x37, + 0xa2, 0xfb, 0x15, 0x52, 0xb0, 0x42, 0x44, 0x18, 0x72, 0xb6, 0x4f, 0xba, 0xe1, 0x41, 0xbe, 0x39, + 0x15, 0x5a, 0x3e, 0xbb, 0xeb, 0xd8, 0x78, 0xb0, 0xf7, 0xd0, 0x27, 0x2e, 0x3f, 0x8c, 0x28, 0x19, + 0xec, 0x73, 0x0c, 0x1c, 0x40, 0xe9, 0xbf, 0xd7, 0x40, 0x99, 0xe2, 0xd7, 0x9d, 0x11, 0xe7, 0xf8, + 0xa6, 0xed, 0x9e, 0xca, 0x6d, 0x55, 0xee, 0x1c, 0x4a, 0x3a, 0x56, 0x12, 0x17, 0x95, 0xd8, 0xcc, + 0x8c, 0x25, 0xf6, 0x0a, 0x14, 0x4c, 0xcf, 0xf5, 0x6d, 0xb7, 0x3f, 0x91, 0x5f, 0x76, 0x25, 0x1d, + 0x2b, 0x09, 0xfd, 0x69, 0x16, 0x4a, 0xdc, 0xd7, 0xb0, 0xc6, 0x7f, 0x1d, 0xca, 0x4e, 0xfc, 0xf4, + 0xa4, 0xcf, 0x2f, 0x4b, 0x88, 0xe4, 0x7d, 0xc4, 0x49, 0x59, 0xae, 0x7c, 0x6c, 0x13, 0xc7, 0x52, + 0xca, 0x99, 0xa4, 0xf2, 0xf5, 0x38, 0x13, 0x27, 0x65, 0x79, 0x9e, 0x7d, 0xc0, 0xe3, 0x5a, 0x36, + 0x73, 0x6a, 0x6b, 0xbf, 0xc3, 0x89, 0x38, 0xe0, 0x5d, 0xb4, 0x3f, 0xf3, 0x33, 0xee, 0xcf, 0x35, + 0x58, 0xe2, 0x07, 0xe9, 0xf5, 0xfd, 0xb0, 0xe3, 0xcd, 0x89, 0xbe, 0x0b, 0x8d, 0x86, 0xb5, 0xa5, + 0xf7, 0x12, 0x1c, 0x3c, 0x26, 0x39, 0xb5, 0x7d, 0xc9, 0x7f, 0xd2, 0xf6, 0x85, 0xaf, 0xda, 0xb1, + 0xbb, 0xb6, 0x5f, 0x59, 0x10, 0x4e, 0xa8, 0x55, 0xdf, 0xe4, 0x44, 0x1c, 0xf0, 0x12, 0x47, 0x5a, + 0xb8, 0xf4, 0x48, 0xdf, 0x87, 0xe2, 0x81, 0x6d, 0x52, 0x8f, 0xaf, 0x85, 0x17, 0x26, 0x96, 0x68, + 0xec, 0x55, 0x02, 0x0f, 0xd7, 0x18, 0xf2, 0xb9, 0x2b, 0xae, 0xe1, 0x7a, 0x41, 0xfb, 0x9e, 0x8b, + 0x5c, 0xb9, 0xc5, 0x89, 0x38, 0xe0, 0x5d, 0x5b, 0xe3, 0xf5, 0xe8, 0x17, 0x8f, 0x6b, 0x73, 0x8f, + 0x1e, 0xd7, 0xe6, 0x3e, 0x7c, 0x2c, 0x6b, 0xd3, 0xbf, 0x00, 0xe0, 0xf6, 0xd1, 0x0f, 0x89, 0x19, + 0xc4, 0xfc, 0xe5, 0x13, 0x04, 0xde, 0x63, 0xc8, 0xc1, 0x95, 0x78, 0x6d, 0x67, 0xc6, 0x7a, 0x8c, + 0x18, 0x0f, 0x27, 0x24, 0x51, 0x03, 0x8a, 0x6a, 0xaa, 0x20, 0xe3, 0x7b, 0x55, 0xaa, 0x15, 0xd5, + 0xe8, 0x01, 0x47, 0x32, 0x89, 0x0b, 0x38, 0x7f, 0xe9, 0x05, 0x6c, 0x42, 0xb6, 0x6f, 0x5b, 0x22, + 0x24, 0x8a, 0xcd, 0x2f, 0x87, 0x09, 0xf0, 0xce, 0x7e, 0xeb, 0x7c, 0x58, 0x7b, 0x75, 0xda, 0x48, + 0xce, 0x1f, 0xf4, 0x08, 0xab, 0xdf, 0xd9, 0x6f, 0x61, 0xae, 0x7c, 0x51, 0x90, 0xe6, 0x67, 0x0c, + 0xd2, 0x6d, 0x00, 0xb9, 0x6a, 0xae, 0x1d, 0xc4, 0x86, 0x9a, 0xb0, 0xdc, 0x50, 0x1c, 0x1c, 0x93, + 0x42, 0x0c, 0x56, 0x4d, 0xfe, 0xce, 0xb4, 0x3d, 0x97, 0x1f, 0x3d, 0xf3, 0x8d, 0x6e, 0x30, 0x63, + 0x28, 0x6d, 0x7f, 0x31, 0x5d, 0xc6, 0xe4, 0x6a, 0xcd, 0x57, 0xa4, 0x99, 0xd5, 0xdd, 0x71, 0x30, + 0x3c, 0x89, 0x8f, 0x3c, 0x58, 0xb5, 0xe4, 0xcb, 0x28, 0x32, 0x5a, 0x9c, 0xd9, 0xe8, 0xcb, 0xdc, + 0x60, 0x6b, 0x1c, 0x08, 0x4f, 0x62, 0xa3, 0xef, 0xc3, 0x7a, 0x48, 0x9c, 0x7c, 0x9e, 0x56, 0x40, + 0xec, 0x54, 0x95, 0x3f, 0xdc, 0x5b, 0x53, 0xa5, 0xf0, 0x73, 0x10, 0x90, 0x05, 0x79, 0x27, 0xe8, + 0x2e, 0x4a, 0xa2, 0x22, 0x7c, 0x23, 0xdd, 0x2a, 0xa2, 0xe8, 0xaf, 0xc7, 0xbb, 0x0a, 0xf5, 0xfc, + 0x92, 0x0d, 0x85, 0xc4, 0x46, 0x0f, 0xa1, 0x64, 0xb8, 0xae, 0xe7, 0x1b, 0xc1, 0x83, 0x79, 0x51, + 0x98, 0xda, 0x99, 0xd9, 0xd4, 0x4e, 0x84, 0x31, 0xd6, 0xc5, 0xc4, 0x38, 0x38, 0x6e, 0x0a, 0x3d, + 0x80, 0x65, 0xef, 0x81, 0x4b, 0x28, 0x26, 0xc7, 0x84, 0x12, 0xd7, 0x24, 0xac, 0x52, 0x16, 0xd6, + 0xbf, 0x92, 0xd2, 0x7a, 0x42, 0x39, 0x0a, 0xe9, 0x24, 0x9d, 0xe1, 0x71, 0x2b, 0xa8, 0x0e, 0x70, + 0x6c, 0xbb, 0xb2, 0x17, 0xad, 0x2c, 0x45, 0x63, 0xb2, 0xeb, 0x8a, 0x8a, 0x63, 0x12, 0xe8, 0xab, + 0x50, 0x32, 0x9d, 0x3e, 0xf3, 0x49, 0x30, 0x8f, 0x5b, 0x16, 0x37, 0x48, 0xad, 0x6f, 0x37, 0x62, + 0xe1, 0xb8, 0x1c, 0x3a, 0x81, 0x45, 0x3b, 0xd6, 0xf4, 0x56, 0x56, 0x44, 0x2c, 0x6e, 0xcf, 0xdc, + 0xe9, 0xb2, 0xe6, 0x0a, 0xcf, 0x44, 0x71, 0x0a, 0x4e, 0x20, 0xaf, 0x7f, 0x0d, 0x4a, 0x9f, 0xb0, + 0x07, 0xe3, 0x3d, 0xdc, 0xf8, 0xd1, 0xcd, 0xd4, 0xc3, 0xfd, 0x25, 0x03, 0x4b, 0xc9, 0x0d, 0x57, + 0x6f, 0x1d, 0x6d, 0xea, 0x7c, 0x35, 0xcc, 0xca, 0xd9, 0xa9, 0x59, 0x59, 0x26, 0xbf, 0xf9, 0x17, + 0x49, 0x7e, 0xdb, 0x00, 0x46, 0xcf, 0x0e, 0xf3, 0x5e, 0x90, 0x47, 0x55, 0xe6, 0x8a, 0x26, 0x7e, + 0x38, 0x26, 0x25, 0x26, 0xa8, 0x9e, 0xeb, 0x53, 0xcf, 0x71, 0x08, 0x95, 0xc5, 0x34, 0x98, 0xa0, + 0x2a, 0x2a, 0x8e, 0x49, 0xa0, 0xeb, 0x80, 0x8e, 0x1c, 0xcf, 0x3c, 0x15, 0x5b, 0x10, 0xde, 0x73, + 0x91, 0x25, 0x0b, 0xc1, 0xe0, 0xaa, 0x39, 0xc1, 0xc5, 0x17, 0x68, 0xe8, 0x0b, 0x90, 0x6b, 0xf3, + 0xb6, 0x42, 0xbf, 0x0d, 0xc9, 0x99, 0x13, 0x7a, 0x27, 0xd8, 0x09, 0x4d, 0x0d, 0x85, 0x66, 0xdb, + 0x05, 0xfd, 0x0a, 0x14, 0xb1, 0xe7, 0xf9, 0x6d, 0xc3, 0x3f, 0x61, 0xa8, 0x06, 0xb9, 0x1e, 0xff, + 0x47, 0x8e, 0xfb, 0xc4, 0xac, 0x5a, 0x70, 0x70, 0x40, 0xd7, 0x7f, 0xa9, 0xc1, 0x2b, 0x53, 0xe7, + 0x8c, 0x7c, 0x47, 0x4d, 0xf5, 0x25, 0x5d, 0x52, 0x3b, 0x1a, 0xc9, 0xe1, 0x98, 0x14, 0xef, 0xc4, + 0x12, 0xc3, 0xc9, 0xf1, 0x4e, 0x2c, 0x61, 0x0d, 0x27, 0x65, 0xf5, 0x7f, 0x67, 0x20, 0x1f, 0x3c, + 0xcb, 0x3e, 0xe3, 0xe6, 0xfb, 0x75, 0xc8, 0x33, 0x61, 0x47, 0xba, 0xa7, 0xb2, 0x65, 0x60, 0x1d, + 0x4b, 0x2e, 0x6f, 0x62, 0xba, 0x84, 0x31, 0xa3, 0x13, 0x06, 0xaf, 0x6a, 0x62, 0x0e, 0x02, 0x32, + 0x0e, 0xf9, 0xe8, 0x6d, 0xfe, 0x0a, 0x35, 0x98, 0xea, 0x0b, 0xab, 0x21, 0x24, 0x16, 0xd4, 0xf3, + 0x61, 0x6d, 0x51, 0x82, 0x8b, 0x6f, 0x2c, 0xa5, 0xd1, 0x3d, 0x58, 0xb0, 0x88, 0x6f, 0xd8, 0x4e, + 0xd0, 0x0e, 0xa6, 0x9e, 0x5e, 0x06, 0x60, 0xad, 0x40, 0xb5, 0x59, 0xe2, 0x3e, 0xc9, 0x0f, 0x1c, + 0x02, 0xf2, 0x8b, 0x67, 0x7a, 0x56, 0xf0, 0x93, 0x42, 0x2e, 0xba, 0x78, 0xbb, 0x9e, 0x45, 0xb0, + 0xe0, 0xe8, 0x8f, 0x34, 0x28, 0x05, 0x48, 0xbb, 0x46, 0x9f, 0x11, 0xb4, 0xa5, 0x56, 0x11, 0x1c, + 0x77, 0x58, 0x93, 0xe7, 0xdf, 0x1b, 0xf4, 0xc8, 0xf9, 0xb0, 0x56, 0x14, 0x62, 0xfc, 0x43, 0x2d, + 0x20, 0xb6, 0x47, 0x99, 0x4b, 0xf6, 0xe8, 0x35, 0xc8, 0x89, 0xd6, 0x5b, 0x6e, 0xa6, 0x6a, 0xf4, + 0x44, 0x7b, 0x8e, 0x03, 0x9e, 0xfe, 0x71, 0x06, 0xca, 0x89, 0xc5, 0xa5, 0xe8, 0xea, 0xd4, 0xa8, + 0x24, 0x93, 0x62, 0xfc, 0x36, 0xfd, 0x87, 0xa0, 0xef, 0x42, 0xde, 0xe4, 0xeb, 0x0b, 0x7f, 0x89, + 0xdb, 0x9a, 0xe5, 0x28, 0xc4, 0xce, 0x44, 0x91, 0x24, 0x3e, 0x19, 0x96, 0x80, 0xe8, 0x06, 0xac, + 0x52, 0xe2, 0xd3, 0xc1, 0xce, 0xb1, 0x4f, 0x68, 0xbc, 0xff, 0xcf, 0x45, 0x7d, 0x0f, 0x1e, 0x17, + 0xc0, 0x93, 0x3a, 0x61, 0xaa, 0xcc, 0xbf, 0x40, 0xaa, 0xd4, 0x1d, 0x98, 0xff, 0x2f, 0xf6, 0xe8, + 0xdf, 0x83, 0x62, 0xd4, 0x45, 0x7d, 0xca, 0x26, 0xf5, 0x1f, 0x40, 0x81, 0x47, 0x63, 0xd8, 0xfd, + 0x5f, 0x52, 0x89, 0x92, 0x35, 0x22, 0x93, 0xa6, 0x46, 0xe8, 0x6f, 0x41, 0xf9, 0x4e, 0xcf, 0x9a, + 0xed, 0x57, 0x14, 0x7d, 0x1b, 0x82, 0x1f, 0x05, 0x79, 0x0a, 0x0e, 0x9e, 0xf9, 0xb1, 0x14, 0x1c, + 0x7f, 0xb3, 0x27, 0x7f, 0xaf, 0x01, 0xf1, 0xe6, 0xdc, 0x3b, 0x23, 0xae, 0xcf, 0x57, 0xc3, 0x8f, + 0x6d, 0x7c, 0x35, 0xe2, 0xee, 0x09, 0x0e, 0xba, 0x03, 0x79, 0x4f, 0xb4, 0x64, 0x72, 0xf0, 0x35, + 0xe3, 0x0c, 0x41, 0x85, 0x6a, 0xd0, 0xd7, 0x61, 0x09, 0xd6, 0xdc, 0x7c, 0xf2, 0xac, 0x3a, 0xf7, + 0xf4, 0x59, 0x75, 0xee, 0xa3, 0x67, 0xd5, 0xb9, 0x0f, 0x46, 0x55, 0xed, 0xc9, 0xa8, 0xaa, 0x3d, + 0x1d, 0x55, 0xb5, 0x8f, 0x46, 0x55, 0xed, 0xe3, 0x51, 0x55, 0x7b, 0xf4, 0x8f, 0xea, 0xdc, 0xbd, + 0xcc, 0xd9, 0xd6, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xab, 0xec, 0x02, 0x4a, 0x00, 0x21, 0x00, + 0x00, } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index 4baf44f3..eb3237f2 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -23,7 +23,6 @@ package k8s.io.apimachinery.pkg.apis.meta.v1; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1"; @@ -125,6 +124,21 @@ message APIVersions { repeated ServerAddressByClientCIDR serverAddressByClientCIDRs = 2; } +// CreateOptions may be provided when creating an API object. +message CreateOptions { + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + repeated string dryRun = 1; + + // If IncludeUninitialized is specified, the object may be + // returned without completing initialization. + optional bool includeUninitialized = 2; +} + // DeleteOptions may be provided when deleting an API object. message DeleteOptions { // The duration in seconds before the object should be deleted. Value must be non-negative integer. @@ -156,6 +170,14 @@ message DeleteOptions { // foreground. // +optional optional string propagationPolicy = 4; + + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + repeated string dryRun = 5; } // Duration is a wrapper around time.Duration which supports correct @@ -339,9 +361,10 @@ message ListMeta { // continue may be set if the user set a limit on the number of items returned, and indicates that // the server has more data available. The value is opaque and may be used to issue another request // to the endpoint that served this list to retrieve the next set of available objects. Continuing a - // list may not be possible if the server configuration has changed or more than a few minutes have - // passed. The resourceVersion field returned when using this continue value will be identical to - // the value in the first response. + // consistent list may not be possible if the server configuration has changed or more than a few + // minutes have passed. The resourceVersion field returned when using this continue value will be + // identical to the value in the first response, unless you have received this token from an error + // message. optional string continue = 3; } @@ -398,14 +421,20 @@ message ListOptions { // result was calculated is returned. optional int64 limit = 7; - // The continue option should be set when retrieving more results from the server. Since this value - // is server defined, clients may only use the continue value from a previous query result with - // identical query parameters (except for the value of continue) and the server may reject a continue - // value it does not recognize. If the specified continue value is no longer valid whether due to - // expiration (generally five to fifteen minutes) or a configuration change on the server the server - // will respond with a 410 ResourceExpired error indicating the client must restart their list without - // the continue field. This field is not supported when watch is true. Clients may start a watch from - // the last resourceVersion value returned by the server and not miss any modifications. + // The continue option should be set when retrieving more results from the server. Since this value is + // server defined, clients may only use the continue value from a previous query result with identical + // query parameters (except for the value of continue) and the server may reject a continue value it + // does not recognize. If the specified continue value is no longer valid whether due to expiration + // (generally five to fifteen minutes) or a configuration change on the server, the server will + // respond with a 410 ResourceExpired error together with a continue token. If the client needs a + // consistent list, it must restart their list without the continue field. Otherwise, the client may + // send another list request with the token received with the 410 error, the server will respond with + // a list starting from the next key, but from the latest snapshot, which is inconsistent from the + // previous list results - objects that are created, modified, or deleted after the first list request + // will be included in the response, as long as their keys are after the "next key". + // + // This field is not supported when watch is true. Clients may start a watch from the last + // resourceVersion value returned by the server and not miss any modifications. optional string continue = 8; } @@ -811,6 +840,17 @@ message TypeMeta { optional string apiVersion = 2; } +// UpdateOptions may be provided when updating an API object. +message UpdateOptions { + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + repeated string dryRun = 1; +} + // Verbs masks the value so protobuf can generate // // +protobuf.nullable=true diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go new file mode 100644 index 00000000..5250e33c --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go @@ -0,0 +1,79 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 v1 + +import ( + gojson "encoding/json" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime/serializer/json" +) + +type GroupVersionHolder struct { + GV GroupVersion `json:"val"` +} + +func TestGroupVersionUnmarshalJSON(t *testing.T) { + cases := []struct { + input []byte + expect GroupVersion + }{ + {[]byte(`{"val": "v1"}`), GroupVersion{"", "v1"}}, + {[]byte(`{"val": "extensions/v1beta1"}`), GroupVersion{"extensions", "v1beta1"}}, + } + + for _, c := range cases { + var result GroupVersionHolder + // test golang lib's JSON codec + if err := gojson.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("JSON codec failed to unmarshal input '%v': %v", c.input, err) + } + if !reflect.DeepEqual(result.GV, c.expect) { + t.Errorf("JSON codec failed to unmarshal input '%s': expected %+v, got %+v", c.input, c.expect, result.GV) + } + // test the json-iterator codec + iter := json.CaseSensitiveJsonIterator() + if err := iter.Unmarshal(c.input, &result); err != nil { + t.Errorf("json-iterator codec failed to unmarshal input '%v': %v", c.input, err) + } + if !reflect.DeepEqual(result.GV, c.expect) { + t.Errorf("json-iterator codec failed to unmarshal input '%s': expected %+v, got %+v", c.input, c.expect, result.GV) + } + } +} + +func TestGroupVersionMarshalJSON(t *testing.T) { + cases := []struct { + input GroupVersion + expect []byte + }{ + {GroupVersion{"", "v1"}, []byte(`{"val":"v1"}`)}, + {GroupVersion{"extensions", "v1beta1"}, []byte(`{"val":"extensions/v1beta1"}`)}, + } + + for _, c := range cases { + input := GroupVersionHolder{c.input} + result, err := gojson.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input '%v': %v", input, err) + } + if !reflect.DeepEqual(result, c.expect) { + t.Errorf("Failed to marshal input '%+v': expected: %s, got: %s", input, c.expect, result) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go new file mode 100644 index 00000000..fa424930 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers_test.go @@ -0,0 +1,161 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 v1 + +import ( + "fmt" + "reflect" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/labels" +) + +func TestLabelSelectorAsSelector(t *testing.T) { + matchLabels := map[string]string{"foo": "bar"} + matchExpressions := []LabelSelectorRequirement{{ + Key: "baz", + Operator: LabelSelectorOpIn, + Values: []string{"qux", "norf"}, + }} + mustParse := func(s string) labels.Selector { + out, e := labels.Parse(s) + if e != nil { + panic(e) + } + return out + } + tc := []struct { + in *LabelSelector + out labels.Selector + expectErr bool + }{ + {in: nil, out: labels.Nothing()}, + {in: &LabelSelector{}, out: labels.Everything()}, + { + in: &LabelSelector{MatchLabels: matchLabels}, + out: mustParse("foo=bar"), + }, + { + in: &LabelSelector{MatchExpressions: matchExpressions}, + out: mustParse("baz in (norf,qux)"), + }, + { + in: &LabelSelector{MatchLabels: matchLabels, MatchExpressions: matchExpressions}, + out: mustParse("baz in (norf,qux),foo=bar"), + }, + { + in: &LabelSelector{ + MatchExpressions: []LabelSelectorRequirement{{ + Key: "baz", + Operator: LabelSelectorOpExists, + Values: []string{"qux", "norf"}, + }}, + }, + expectErr: true, + }, + } + + for i, tc := range tc { + inCopy := tc.in.DeepCopy() + out, err := LabelSelectorAsSelector(tc.in) + // after calling LabelSelectorAsSelector, tc.in shouldn't be modified + if !reflect.DeepEqual(inCopy, tc.in) { + t.Errorf("[%v]expected:\n\t%#v\nbut got:\n\t%#v", i, inCopy, tc.in) + } + if err == nil && tc.expectErr { + t.Errorf("[%v]expected error but got none.", i) + } + if err != nil && !tc.expectErr { + t.Errorf("[%v]did not expect error but got: %v", i, err) + } + // fmt.Sprint() over String() as nil.String() will panic + if fmt.Sprint(out) != fmt.Sprint(tc.out) { + t.Errorf("[%v]expected:\n\t%s\nbut got:\n\t%s", i, fmt.Sprint(tc.out), fmt.Sprint(out)) + } + } +} + +func TestLabelSelectorAsMap(t *testing.T) { + matchLabels := map[string]string{"foo": "bar"} + matchExpressions := func(operator LabelSelectorOperator, values []string) []LabelSelectorRequirement { + return []LabelSelectorRequirement{{ + Key: "baz", + Operator: operator, + Values: values, + }} + } + + tests := []struct { + in *LabelSelector + out map[string]string + errString string + }{ + {in: nil, out: nil}, + { + in: &LabelSelector{MatchLabels: matchLabels}, + out: map[string]string{"foo": "bar"}, + }, + { + in: &LabelSelector{MatchLabels: matchLabels, MatchExpressions: matchExpressions(LabelSelectorOpIn, []string{"norf"})}, + out: map[string]string{"foo": "bar", "baz": "norf"}, + }, + { + in: &LabelSelector{MatchExpressions: matchExpressions(LabelSelectorOpIn, []string{"norf"})}, + out: map[string]string{"baz": "norf"}, + }, + { + in: &LabelSelector{MatchLabels: matchLabels, MatchExpressions: matchExpressions(LabelSelectorOpIn, []string{"norf", "qux"})}, + out: map[string]string{"foo": "bar"}, + errString: "without a single value cannot be converted", + }, + { + in: &LabelSelector{MatchExpressions: matchExpressions(LabelSelectorOpNotIn, []string{"norf", "qux"})}, + out: map[string]string{}, + errString: "cannot be converted", + }, + { + in: &LabelSelector{MatchLabels: matchLabels, MatchExpressions: matchExpressions(LabelSelectorOpExists, []string{})}, + out: map[string]string{"foo": "bar"}, + errString: "cannot be converted", + }, + { + in: &LabelSelector{MatchExpressions: matchExpressions(LabelSelectorOpDoesNotExist, []string{})}, + out: map[string]string{}, + errString: "cannot be converted", + }, + } + + for i, tc := range tests { + out, err := LabelSelectorAsMap(tc.in) + if err == nil && len(tc.errString) > 0 { + t.Errorf("[%v]expected error but got none.", i) + continue + } + if err != nil && len(tc.errString) == 0 { + t.Errorf("[%v]did not expect error but got: %v", i, err) + continue + } + if err != nil && len(tc.errString) > 0 && !strings.Contains(err.Error(), tc.errString) { + t.Errorf("[%v]expected error with %q but got: %v", i, tc.errString, err) + continue + } + if !reflect.DeepEqual(out, tc.out) { + t.Errorf("[%v]expected:\n\t%+v\nbut got:\n\t%+v", i, tc.out, out) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/labels_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/labels_test.go new file mode 100644 index 00000000..918b1a29 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/labels_test.go @@ -0,0 +1,123 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 v1 + +import ( + "reflect" + "testing" +) + +func TestCloneSelectorAndAddLabel(t *testing.T) { + labels := map[string]string{ + "foo1": "bar1", + "foo2": "bar2", + "foo3": "bar3", + } + matchExpressions := []LabelSelectorRequirement{ + {Key: "foo", Operator: LabelSelectorOpIn, Values: []string{"foo"}}, + } + + cases := []struct { + labels map[string]string + labelKey string + labelValue string + want map[string]string + }{ + { + labels: labels, + want: labels, + }, + { + labels: labels, + labelKey: "foo4", + labelValue: "89", + want: map[string]string{ + "foo1": "bar1", + "foo2": "bar2", + "foo3": "bar3", + "foo4": "89", + }, + }, + { + labels: nil, + labelKey: "foo4", + labelValue: "12", + want: map[string]string{ + "foo4": "12", + }, + }, + } + + for _, tc := range cases { + ls_in := LabelSelector{MatchLabels: tc.labels, MatchExpressions: matchExpressions} + ls_out := LabelSelector{MatchLabels: tc.want, MatchExpressions: matchExpressions} + + got := CloneSelectorAndAddLabel(&ls_in, tc.labelKey, tc.labelValue) + if !reflect.DeepEqual(got, &ls_out) { + t.Errorf("got %v, want %v", got, tc.want) + } + } +} + +func TestAddLabelToSelector(t *testing.T) { + labels := map[string]string{ + "foo1": "bar1", + "foo2": "bar2", + "foo3": "bar3", + } + + cases := []struct { + labels map[string]string + labelKey string + labelValue string + want map[string]string + }{ + { + labels: labels, + want: labels, + }, + { + labels: labels, + labelKey: "foo4", + labelValue: "89", + want: map[string]string{ + "foo1": "bar1", + "foo2": "bar2", + "foo3": "bar3", + "foo4": "89", + }, + }, + { + labels: nil, + labelKey: "foo4", + labelValue: "12", + want: map[string]string{ + "foo4": "12", + }, + }, + } + + for _, tc := range cases { + ls_in := LabelSelector{MatchLabels: tc.labels} + ls_out := LabelSelector{MatchLabels: tc.want} + + got := AddLabelToSelector(&ls_in, tc.labelKey, tc.labelValue) + if !reflect.DeepEqual(got, &ls_out) { + t.Errorf("got %v, want %v", got, tc.want) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go index c13fe4af..ee144754 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go @@ -162,55 +162,9 @@ func (meta *ObjectMeta) GetInitializers() *Initializers { return m func (meta *ObjectMeta) SetInitializers(initializers *Initializers) { meta.Initializers = initializers } func (meta *ObjectMeta) GetFinalizers() []string { return meta.Finalizers } func (meta *ObjectMeta) SetFinalizers(finalizers []string) { meta.Finalizers = finalizers } - -func (meta *ObjectMeta) GetOwnerReferences() []OwnerReference { - if meta.OwnerReferences == nil { - return nil - } - ret := make([]OwnerReference, len(meta.OwnerReferences)) - for i := 0; i < len(meta.OwnerReferences); i++ { - ret[i].Kind = meta.OwnerReferences[i].Kind - ret[i].Name = meta.OwnerReferences[i].Name - ret[i].UID = meta.OwnerReferences[i].UID - ret[i].APIVersion = meta.OwnerReferences[i].APIVersion - if meta.OwnerReferences[i].Controller != nil { - value := *meta.OwnerReferences[i].Controller - ret[i].Controller = &value - } - if meta.OwnerReferences[i].BlockOwnerDeletion != nil { - value := *meta.OwnerReferences[i].BlockOwnerDeletion - ret[i].BlockOwnerDeletion = &value - } - } - return ret -} - +func (meta *ObjectMeta) GetOwnerReferences() []OwnerReference { return meta.OwnerReferences } func (meta *ObjectMeta) SetOwnerReferences(references []OwnerReference) { - if references == nil { - meta.OwnerReferences = nil - return - } - newReferences := make([]OwnerReference, len(references)) - for i := 0; i < len(references); i++ { - newReferences[i].Kind = references[i].Kind - newReferences[i].Name = references[i].Name - newReferences[i].UID = references[i].UID - newReferences[i].APIVersion = references[i].APIVersion - if references[i].Controller != nil { - value := *references[i].Controller - newReferences[i].Controller = &value - } - if references[i].BlockOwnerDeletion != nil { - value := *references[i].BlockOwnerDeletion - newReferences[i].BlockOwnerDeletion = &value - } - } - meta.OwnerReferences = newReferences -} - -func (meta *ObjectMeta) GetClusterName() string { - return meta.ClusterName -} -func (meta *ObjectMeta) SetClusterName(clusterName string) { - meta.ClusterName = clusterName + meta.OwnerReferences = references } +func (meta *ObjectMeta) GetClusterName() string { return meta.ClusterName } +func (meta *ObjectMeta) SetClusterName(clusterName string) { meta.ClusterName = clusterName } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_test.go new file mode 100644 index 00000000..339610ae --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_test.go @@ -0,0 +1,139 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 v1 + +import ( + "encoding/json" + "reflect" + "testing" + "time" + + "github.com/ghodss/yaml" +) + +type MicroTimeHolder struct { + T MicroTime `json:"t"` +} + +func TestMicroTimeMarshalYAML(t *testing.T) { + cases := []struct { + input MicroTime + result string + }{ + {MicroTime{}, "t: null\n"}, + {DateMicro(1998, time.May, 5, 1, 5, 5, 50, time.FixedZone("test", -4*60*60)), "t: 1998-05-05T05:05:05.000000Z\n"}, + {DateMicro(1998, time.May, 5, 5, 5, 5, 0, time.UTC), "t: 1998-05-05T05:05:05.000000Z\n"}, + } + + for _, c := range cases { + input := MicroTimeHolder{c.input} + result, err := yaml.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input: '%v': %v", input, err) + } + if string(result) != c.result { + t.Errorf("Failed to marshal input: '%v': expected %+v, got %q", input, c.result, string(result)) + } + } +} + +func TestMicroTimeUnmarshalYAML(t *testing.T) { + cases := []struct { + input string + result MicroTime + }{ + {"t: null\n", MicroTime{}}, + {"t: 1998-05-05T05:05:05.000000Z\n", MicroTime{Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC).Local()}}, + } + + for _, c := range cases { + var result MicroTimeHolder + if err := yaml.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) + } + if result.T != c.result { + t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) + } + } +} + +func TestMicroTimeMarshalJSON(t *testing.T) { + cases := []struct { + input MicroTime + result string + }{ + {MicroTime{}, "{\"t\":null}"}, + {DateMicro(1998, time.May, 5, 5, 5, 5, 50, time.UTC), "{\"t\":\"1998-05-05T05:05:05.000000Z\"}"}, + {DateMicro(1998, time.May, 5, 5, 5, 5, 0, time.UTC), "{\"t\":\"1998-05-05T05:05:05.000000Z\"}"}, + } + + for _, c := range cases { + input := MicroTimeHolder{c.input} + result, err := json.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input: '%v': %v", input, err) + } + if string(result) != c.result { + t.Errorf("Failed to marshal input: '%v': expected %+v, got %q", input, c.result, string(result)) + } + } +} + +func TestMicroTimeUnmarshalJSON(t *testing.T) { + cases := []struct { + input string + result MicroTime + }{ + {"{\"t\":null}", MicroTime{}}, + {"{\"t\":\"1998-05-05T05:05:05.000000Z\"}", MicroTime{Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC).Local()}}, + } + + for _, c := range cases { + var result MicroTimeHolder + if err := json.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) + } + if result.T != c.result { + t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) + } + } +} + +func TestMicroTimeProto(t *testing.T) { + cases := []struct { + input MicroTime + }{ + {MicroTime{}}, + {DateMicro(1998, time.May, 5, 1, 5, 5, 50, time.Local)}, + {DateMicro(1998, time.May, 5, 5, 5, 5, 0, time.Local)}, + } + + for _, c := range cases { + input := c.input + data, err := input.Marshal() + if err != nil { + t.Fatalf("Failed to marshal input: '%v': %v", input, err) + } + time := MicroTime{} + if err := time.Unmarshal(data); err != nil { + t.Fatalf("Failed to unmarshal output: '%v': %v", input, err) + } + if !reflect.DeepEqual(input, time) { + t.Errorf("Marshal->Unmarshal is not idempotent: '%v' vs '%v'", input, time) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go index b300d370..0827729d 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go @@ -19,6 +19,7 @@ package v1 import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) // GroupName is the group name for this API. @@ -52,14 +53,15 @@ func AddToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion) &ExportOptions{}, &GetOptions{}, &DeleteOptions{}, + &CreateOptions{}, + &UpdateOptions{}, ) - scheme.AddConversionFuncs( - Convert_versioned_Event_to_watch_Event, - Convert_versioned_InternalEvent_to_versioned_Event, - Convert_watch_Event_to_versioned_Event, - Convert_versioned_Event_to_versioned_InternalEvent, - ) - + utilruntime.Must(scheme.AddConversionFuncs( + Convert_v1_WatchEvent_To_watch_Event, + Convert_v1_InternalEvent_To_v1_WatchEvent, + Convert_watch_Event_To_v1_WatchEvent, + Convert_v1_WatchEvent_To_v1_InternalEvent, + )) // Register Unversioned types under their own special group scheme.AddUnversionedTypes(Unversioned, &Status{}, @@ -70,8 +72,8 @@ func AddToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion) ) // register manually. This usually goes through the SchemeBuilder, which we cannot use here. - AddConversionFuncs(scheme) - RegisterDefaults(scheme) + utilruntime.Must(AddConversionFuncs(scheme)) + utilruntime.Must(RegisterDefaults(scheme)) } // scheme is the registry for the common types that adhere to the meta v1 API spec. @@ -86,8 +88,10 @@ func init() { &ExportOptions{}, &GetOptions{}, &DeleteOptions{}, + &CreateOptions{}, + &UpdateOptions{}, ) // register manually. This usually goes through the SchemeBuilder, which we cannot use here. - RegisterDefaults(scheme) + utilruntime.Must(RegisterDefaults(scheme)) } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_test.go new file mode 100644 index 00000000..9923958e --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_test.go @@ -0,0 +1,197 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 v1 + +import ( + "encoding/json" + "reflect" + "testing" + "time" + + "github.com/ghodss/yaml" +) + +type TimeHolder struct { + T Time `json:"t"` +} + +func TestTimeMarshalYAML(t *testing.T) { + cases := []struct { + input Time + result string + }{ + {Time{}, "t: null\n"}, + {Date(1998, time.May, 5, 1, 5, 5, 50, time.FixedZone("test", -4*60*60)), "t: 1998-05-05T05:05:05Z\n"}, + {Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC), "t: 1998-05-05T05:05:05Z\n"}, + } + + for _, c := range cases { + input := TimeHolder{c.input} + result, err := yaml.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input: '%v': %v", input, err) + } + if string(result) != c.result { + t.Errorf("Failed to marshal input: '%v': expected %+v, got %q", input, c.result, string(result)) + } + } +} + +func TestTimeUnmarshalYAML(t *testing.T) { + cases := []struct { + input string + result Time + }{ + {"t: null\n", Time{}}, + {"t: 1998-05-05T05:05:05Z\n", Time{Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC).Local()}}, + } + + for _, c := range cases { + var result TimeHolder + if err := yaml.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) + } + if result.T != c.result { + t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) + } + } +} + +func TestTimeMarshalJSON(t *testing.T) { + cases := []struct { + input Time + result string + }{ + {Time{}, "{\"t\":null}"}, + {Date(1998, time.May, 5, 5, 5, 5, 50, time.UTC), "{\"t\":\"1998-05-05T05:05:05Z\"}"}, + {Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC), "{\"t\":\"1998-05-05T05:05:05Z\"}"}, + } + + for _, c := range cases { + input := TimeHolder{c.input} + result, err := json.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input: '%v': %v", input, err) + } + if string(result) != c.result { + t.Errorf("Failed to marshal input: '%v': expected %+v, got %q", input, c.result, string(result)) + } + } +} + +func TestTimeUnmarshalJSON(t *testing.T) { + cases := []struct { + input string + result Time + }{ + {"{\"t\":null}", Time{}}, + {"{\"t\":\"1998-05-05T05:05:05Z\"}", Time{Date(1998, time.May, 5, 5, 5, 5, 0, time.UTC).Local()}}, + } + + for _, c := range cases { + var result TimeHolder + if err := json.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) + } + if result.T != c.result { + t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) + } + } +} + +func TestTimeMarshalJSONUnmarshalYAML(t *testing.T) { + cases := []struct { + input Time + }{ + {Time{}}, + {Date(1998, time.May, 5, 5, 5, 5, 50, time.Local).Rfc3339Copy()}, + {Date(1998, time.May, 5, 5, 5, 5, 0, time.Local).Rfc3339Copy()}, + } + + for i, c := range cases { + input := TimeHolder{c.input} + jsonMarshalled, err := json.Marshal(&input) + if err != nil { + t.Errorf("%d-1: Failed to marshal input: '%v': %v", i, input, err) + } + + var result TimeHolder + err = yaml.Unmarshal(jsonMarshalled, &result) + if err != nil { + t.Errorf("%d-2: Failed to unmarshal '%+v': %v", i, string(jsonMarshalled), err) + } + + iN, iO := input.T.Zone() + oN, oO := result.T.Zone() + if iN != oN || iO != oO { + t.Errorf("%d-3: Time zones differ before and after serialization %s:%d %s:%d", i, iN, iO, oN, oO) + } + + if input.T.UnixNano() != result.T.UnixNano() { + t.Errorf("%d-4: Failed to marshal input '%#v': got %#v", i, input, result) + } + } +} + +func TestTimeProto(t *testing.T) { + cases := []struct { + input Time + }{ + {Time{}}, + {Date(1998, time.May, 5, 1, 5, 5, 0, time.Local)}, + {Date(1998, time.May, 5, 5, 5, 5, 0, time.Local)}, + } + + for _, c := range cases { + input := c.input + data, err := input.Marshal() + if err != nil { + t.Fatalf("Failed to marshal input: '%v': %v", input, err) + } + time := Time{} + if err := time.Unmarshal(data); err != nil { + t.Fatalf("Failed to unmarshal output: '%v': %v", input, err) + } + if !reflect.DeepEqual(input, time) { + t.Errorf("Marshal->Unmarshal is not idempotent: '%v' vs '%v'", input, time) + } + } +} + +func TestTimeEqual(t *testing.T) { + t1 := NewTime(time.Now()) + cases := []struct { + name string + x *Time + y *Time + result bool + }{ + {"nil =? nil", nil, nil, true}, + {"!nil =? !nil", &t1, &t1, true}, + {"nil =? !nil", nil, &t1, false}, + {"!nil =? nil", &t1, nil, false}, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + result := c.x.Equal(c.y) + if result != c.result { + t.Errorf("Failed equality test for '%v', '%v': expected %+v, got %+v", c.x, c.y, c.result, result) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index e93df184..4d3a55d7 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -76,9 +76,10 @@ type ListMeta struct { // continue may be set if the user set a limit on the number of items returned, and indicates that // the server has more data available. The value is opaque and may be used to issue another request // to the endpoint that served this list to retrieve the next set of available objects. Continuing a - // list may not be possible if the server configuration has changed or more than a few minutes have - // passed. The resourceVersion field returned when using this continue value will be identical to - // the value in the first response. + // consistent list may not be possible if the server configuration has changed or more than a few + // minutes have passed. The resourceVersion field returned when using this continue value will be + // identical to the value in the first response, unless you have received this token from an error + // message. Continue string `json:"continue,omitempty" protobuf:"bytes,3,opt,name=continue"` } @@ -363,14 +364,20 @@ type ListOptions struct { // updated during a chunked list the version of the object that was present at the time the first list // result was calculated is returned. Limit int64 `json:"limit,omitempty" protobuf:"varint,7,opt,name=limit"` - // The continue option should be set when retrieving more results from the server. Since this value - // is server defined, clients may only use the continue value from a previous query result with - // identical query parameters (except for the value of continue) and the server may reject a continue - // value it does not recognize. If the specified continue value is no longer valid whether due to - // expiration (generally five to fifteen minutes) or a configuration change on the server the server - // will respond with a 410 ResourceExpired error indicating the client must restart their list without - // the continue field. This field is not supported when watch is true. Clients may start a watch from - // the last resourceVersion value returned by the server and not miss any modifications. + // The continue option should be set when retrieving more results from the server. Since this value is + // server defined, clients may only use the continue value from a previous query result with identical + // query parameters (except for the value of continue) and the server may reject a continue value it + // does not recognize. If the specified continue value is no longer valid whether due to expiration + // (generally five to fifteen minutes) or a configuration change on the server, the server will + // respond with a 410 ResourceExpired error together with a continue token. If the client needs a + // consistent list, it must restart their list without the continue field. Otherwise, the client may + // send another list request with the token received with the 410 error, the server will respond with + // a list starting from the next key, but from the latest snapshot, which is inconsistent from the + // previous list results - objects that are created, modified, or deleted after the first list request + // will be included in the response, as long as their keys are after the "next key". + // + // This field is not supported when watch is true. Clients may start a watch from the last + // resourceVersion value returned by the server and not miss any modifications. Continue string `json:"continue,omitempty" protobuf:"bytes,8,opt,name=continue"` } @@ -418,6 +425,12 @@ const ( DeletePropagationForeground DeletionPropagation = "Foreground" ) +const ( + // DryRunAll means to complete all processing stages, but don't + // persist changes to storage. + DryRunAll = "All" +) + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // DeleteOptions may be provided when deleting an API object. @@ -453,6 +466,48 @@ type DeleteOptions struct { // foreground. // +optional PropagationPolicy *DeletionPropagation `json:"propagationPolicy,omitempty" protobuf:"varint,4,opt,name=propagationPolicy"` + + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + DryRun []string `json:"dryRun,omitempty" protobuf:"bytes,5,rep,name=dryRun"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// CreateOptions may be provided when creating an API object. +type CreateOptions struct { + TypeMeta `json:",inline"` + + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + DryRun []string `json:"dryRun,omitempty" protobuf:"bytes,1,rep,name=dryRun"` + + // If IncludeUninitialized is specified, the object may be + // returned without completing initialization. + IncludeUninitialized bool `json:"includeUninitialized,omitempty" protobuf:"varint,2,opt,name=includeUninitialized"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// UpdateOptions may be provided when updating an API object. +type UpdateOptions struct { + TypeMeta `json:",inline"` + + // When present, indicates that modifications should not be + // persisted. An invalid or unrecognized dryRun directive will + // result in an error response and no further processing of the + // request. Valid values are: + // - All: all dry run stages will be processed + // +optional + DryRun []string `json:"dryRun,omitempty" protobuf:"bytes,1,rep,name=dryRun"` } // Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go index f91d8a81..35e800f8 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go @@ -85,12 +85,23 @@ func (APIVersions) SwaggerDoc() map[string]string { return map_APIVersions } +var map_CreateOptions = map[string]string{ + "": "CreateOptions may be provided when creating an API object.", + "dryRun": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", + "includeUninitialized": "If IncludeUninitialized is specified, the object may be returned without completing initialization.", +} + +func (CreateOptions) SwaggerDoc() map[string]string { + return map_CreateOptions +} + var map_DeleteOptions = map[string]string{ "": "DeleteOptions may be provided when deleting an API object.", "gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", "preconditions": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", "orphanDependents": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "propagationPolicy": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", + "dryRun": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", } func (DeleteOptions) SwaggerDoc() map[string]string { @@ -181,7 +192,7 @@ var map_ListMeta = map[string]string{ "": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.", "selfLink": "selfLink is a URL representing this object. Populated by the system. Read-only.", "resourceVersion": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency", - "continue": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.", + "continue": "continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message.", } func (ListMeta) SwaggerDoc() map[string]string { @@ -197,7 +208,7 @@ var map_ListOptions = map[string]string{ "resourceVersion": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", "timeoutSeconds": "Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity.", "limit": "limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true.\n\nThe server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned.", - "continue": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server the server will respond with a 410 ResourceExpired error indicating the client must restart their list without the continue field. This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", + "continue": "The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the \"next key\".\n\nThis field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications.", } func (ListOptions) SwaggerDoc() map[string]string { @@ -327,4 +338,13 @@ func (TypeMeta) SwaggerDoc() map[string]string { return map_TypeMeta } +var map_UpdateOptions = map[string]string{ + "": "UpdateOptions may be provided when updating an API object.", + "dryRun": "When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed", +} + +func (UpdateOptions) SwaggerDoc() map[string]string { + return map_UpdateOptions +} + // AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go new file mode 100644 index 00000000..4c55198e --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go @@ -0,0 +1,135 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 v1 + +import ( + gojson "encoding/json" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime/serializer/json" +) + +func TestVerbsMarshalJSON(t *testing.T) { + cases := []struct { + input APIResource + result string + }{ + {APIResource{}, `{"name":"","singularName":"","namespaced":false,"kind":"","verbs":null}`}, + {APIResource{Verbs: Verbs([]string{})}, `{"name":"","singularName":"","namespaced":false,"kind":"","verbs":[]}`}, + {APIResource{Verbs: Verbs([]string{"delete"})}, `{"name":"","singularName":"","namespaced":false,"kind":"","verbs":["delete"]}`}, + } + + for i, c := range cases { + result, err := gojson.Marshal(&c.input) + if err != nil { + t.Errorf("[%d] Failed to marshal input: '%v': %v", i, c.input, err) + } + if string(result) != c.result { + t.Errorf("[%d] Failed to marshal input: '%v': expected '%v', got '%v'", i, c.input, c.result, string(result)) + } + } +} + +func TestVerbsJsonIterUnmarshalJSON(t *testing.T) { + cases := []struct { + input string + result APIResource + }{ + {`{}`, APIResource{}}, + {`{"verbs":null}`, APIResource{}}, + {`{"verbs":[]}`, APIResource{Verbs: Verbs([]string{})}}, + {`{"verbs":["delete"]}`, APIResource{Verbs: Verbs([]string{"delete"})}}, + } + + iter := json.CaseSensitiveJsonIterator() + for i, c := range cases { + var result APIResource + if err := iter.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("[%d] Failed to unmarshal input '%v': %v", i, c.input, err) + } + if !reflect.DeepEqual(result, c.result) { + t.Errorf("[%d] Failed to unmarshal input '%v': expected %+v, got %+v", i, c.input, c.result, result) + } + } +} + +// TestMarshalJSONWithOmit tests that we don't have regressions regarding nil and empty slices with "omit" +func TestMarshalJSONWithOmit(t *testing.T) { + cases := []struct { + input LabelSelector + result string + }{ + {LabelSelector{}, `{}`}, + {LabelSelector{MatchExpressions: []LabelSelectorRequirement{}}, `{}`}, + {LabelSelector{MatchExpressions: []LabelSelectorRequirement{{}}}, `{"matchExpressions":[{"key":"","operator":""}]}`}, + } + + for i, c := range cases { + result, err := gojson.Marshal(&c.input) + if err != nil { + t.Errorf("[%d] Failed to marshal input: '%v': %v", i, c.input, err) + } + if string(result) != c.result { + t.Errorf("[%d] Failed to marshal input: '%v': expected '%v', got '%v'", i, c.input, c.result, string(result)) + } + } +} + +func TestVerbsUnmarshalJSON(t *testing.T) { + cases := []struct { + input string + result APIResource + }{ + {`{}`, APIResource{}}, + {`{"verbs":null}`, APIResource{}}, + {`{"verbs":[]}`, APIResource{Verbs: Verbs([]string{})}}, + {`{"verbs":["delete"]}`, APIResource{Verbs: Verbs([]string{"delete"})}}, + } + + for i, c := range cases { + var result APIResource + if err := gojson.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("[%d] Failed to unmarshal input '%v': %v", i, c.input, err) + } + if !reflect.DeepEqual(result, c.result) { + t.Errorf("[%d] Failed to unmarshal input '%v': expected %+v, got %+v", i, c.input, c.result, result) + } + } +} + +func TestVerbsProto(t *testing.T) { + cases := []APIResource{ + {}, + {Verbs: Verbs([]string{})}, + {Verbs: Verbs([]string{"delete"})}, + } + + for _, input := range cases { + data, err := input.Marshal() + if err != nil { + t.Fatalf("Failed to marshal input: '%v': %v", input, err) + } + resource := APIResource{} + if err := resource.Unmarshal(data); err != nil { + t.Fatalf("Failed to unmarshal output: '%v': %v", input, err) + } + if !reflect.DeepEqual(input, resource) { + t.Errorf("Marshal->Unmarshal is not idempotent: '%v' vs '%v'", input, resource) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD index 2dba6fdb..3450d869 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD @@ -15,9 +15,15 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) @@ -29,14 +35,15 @@ go_library( "unstructured_list.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", importpath = "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go new file mode 100644 index 00000000..d9799621 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go @@ -0,0 +1,136 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 unstructured + +import ( + "io/ioutil" + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +// TestCodecOfUnstructuredList tests that there are no data races in Encode(). +// i.e. that it does not mutate the object being encoded. +func TestCodecOfUnstructuredList(t *testing.T) { + var wg sync.WaitGroup + concurrency := 10 + list := UnstructuredList{ + Object: map[string]interface{}{}, + } + wg.Add(concurrency) + for i := 0; i < concurrency; i++ { + go func() { + defer wg.Done() + assert.NoError(t, UnstructuredJSONScheme.Encode(&list, ioutil.Discard)) + }() + } + wg.Wait() +} + +func TestRemoveNestedField(t *testing.T) { + obj := map[string]interface{}{ + "x": map[string]interface{}{ + "y": 1, + "a": "foo", + }, + } + RemoveNestedField(obj, "x", "a") + assert.Len(t, obj["x"], 1) + RemoveNestedField(obj, "x", "y") + assert.Empty(t, obj["x"]) + RemoveNestedField(obj, "x") + assert.Empty(t, obj) + RemoveNestedField(obj, "x") // Remove of a non-existent field + assert.Empty(t, obj) +} + +func TestNestedFieldNoCopy(t *testing.T) { + target := map[string]interface{}{"foo": "bar"} + + obj := map[string]interface{}{ + "a": map[string]interface{}{ + "b": target, + "c": nil, + "d": []interface{}{"foo"}, + }, + } + + // case 1: field exists and is non-nil + res, exists, err := NestedFieldNoCopy(obj, "a", "b") + assert.True(t, exists) + assert.Nil(t, err) + assert.Equal(t, target, res) + target["foo"] = "baz" + assert.Equal(t, target["foo"], res.(map[string]interface{})["foo"], "result should be a reference to the expected item") + + // case 2: field exists and is nil + res, exists, err = NestedFieldNoCopy(obj, "a", "c") + assert.True(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) + + // case 3: error traversing obj + res, exists, err = NestedFieldNoCopy(obj, "a", "d", "foo") + assert.False(t, exists) + assert.NotNil(t, err) + assert.Nil(t, res) + + // case 4: field does not exist + res, exists, err = NestedFieldNoCopy(obj, "a", "e") + assert.False(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) +} + +func TestNestedFieldCopy(t *testing.T) { + target := map[string]interface{}{"foo": "bar"} + + obj := map[string]interface{}{ + "a": map[string]interface{}{ + "b": target, + "c": nil, + "d": []interface{}{"foo"}, + }, + } + + // case 1: field exists and is non-nil + res, exists, err := NestedFieldCopy(obj, "a", "b") + assert.True(t, exists) + assert.Nil(t, err) + assert.Equal(t, target, res) + target["foo"] = "baz" + assert.NotEqual(t, target["foo"], res.(map[string]interface{})["foo"], "result should be a copy of the expected item") + + // case 2: field exists and is nil + res, exists, err = NestedFieldCopy(obj, "a", "c") + assert.True(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) + + // case 3: error traversing obj + res, exists, err = NestedFieldCopy(obj, "a", "d", "foo") + assert.False(t, exists) + assert.NotNil(t, err) + assert.Nil(t, res) + + // case 4: field does not exist + res, exists, err = NestedFieldCopy(obj, "a", "e") + assert.False(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go index 548a01e5..781469ec 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go @@ -179,6 +179,11 @@ func (u *Unstructured) GetOwnerReferences() []metav1.OwnerReference { } func (u *Unstructured) SetOwnerReferences(references []metav1.OwnerReference) { + if references == nil { + RemoveNestedField(u.Object, "metadata", "ownerReferences") + return + } + newReferences := make([]interface{}, 0, len(references)) for _, reference := range references { out, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&reference) @@ -212,6 +217,10 @@ func (u *Unstructured) GetNamespace() string { } func (u *Unstructured) SetNamespace(namespace string) { + if len(namespace) == 0 { + RemoveNestedField(u.Object, "metadata", "namespace") + return + } u.setNestedField(namespace, "metadata", "namespace") } @@ -220,6 +229,10 @@ func (u *Unstructured) GetName() string { } func (u *Unstructured) SetName(name string) { + if len(name) == 0 { + RemoveNestedField(u.Object, "metadata", "name") + return + } u.setNestedField(name, "metadata", "name") } @@ -227,8 +240,12 @@ func (u *Unstructured) GetGenerateName() string { return getNestedString(u.Object, "metadata", "generateName") } -func (u *Unstructured) SetGenerateName(name string) { - u.setNestedField(name, "metadata", "generateName") +func (u *Unstructured) SetGenerateName(generateName string) { + if len(generateName) == 0 { + RemoveNestedField(u.Object, "metadata", "generateName") + return + } + u.setNestedField(generateName, "metadata", "generateName") } func (u *Unstructured) GetUID() types.UID { @@ -236,6 +253,10 @@ func (u *Unstructured) GetUID() types.UID { } func (u *Unstructured) SetUID(uid types.UID) { + if len(string(uid)) == 0 { + RemoveNestedField(u.Object, "metadata", "uid") + return + } u.setNestedField(string(uid), "metadata", "uid") } @@ -243,8 +264,12 @@ func (u *Unstructured) GetResourceVersion() string { return getNestedString(u.Object, "metadata", "resourceVersion") } -func (u *Unstructured) SetResourceVersion(version string) { - u.setNestedField(version, "metadata", "resourceVersion") +func (u *Unstructured) SetResourceVersion(resourceVersion string) { + if len(resourceVersion) == 0 { + RemoveNestedField(u.Object, "metadata", "resourceVersion") + return + } + u.setNestedField(resourceVersion, "metadata", "resourceVersion") } func (u *Unstructured) GetGeneration() int64 { @@ -256,6 +281,10 @@ func (u *Unstructured) GetGeneration() int64 { } func (u *Unstructured) SetGeneration(generation int64) { + if generation == 0 { + RemoveNestedField(u.Object, "metadata", "generation") + return + } u.setNestedField(generation, "metadata", "generation") } @@ -264,6 +293,10 @@ func (u *Unstructured) GetSelfLink() string { } func (u *Unstructured) SetSelfLink(selfLink string) { + if len(selfLink) == 0 { + RemoveNestedField(u.Object, "metadata", "selfLink") + return + } u.setNestedField(selfLink, "metadata", "selfLink") } @@ -272,6 +305,10 @@ func (u *Unstructured) GetContinue() string { } func (u *Unstructured) SetContinue(c string) { + if len(c) == 0 { + RemoveNestedField(u.Object, "metadata", "continue") + return + } u.setNestedField(c, "metadata", "continue") } @@ -330,6 +367,10 @@ func (u *Unstructured) GetLabels() map[string]string { } func (u *Unstructured) SetLabels(labels map[string]string) { + if labels == nil { + RemoveNestedField(u.Object, "metadata", "labels") + return + } u.setNestedMap(labels, "metadata", "labels") } @@ -339,6 +380,10 @@ func (u *Unstructured) GetAnnotations() map[string]string { } func (u *Unstructured) SetAnnotations(annotations map[string]string) { + if annotations == nil { + RemoveNestedField(u.Object, "metadata", "annotations") + return + } u.setNestedMap(annotations, "metadata", "annotations") } @@ -387,6 +432,10 @@ func (u *Unstructured) GetFinalizers() []string { } func (u *Unstructured) SetFinalizers(finalizers []string) { + if finalizers == nil { + RemoveNestedField(u.Object, "metadata", "finalizers") + return + } u.setNestedSlice(finalizers, "metadata", "finalizers") } @@ -395,5 +444,9 @@ func (u *Unstructured) GetClusterName() string { } func (u *Unstructured) SetClusterName(clusterName string) { + if len(clusterName) == 0 { + RemoveNestedField(u.Object, "metadata", "clusterName") + return + } u.setNestedField(clusterName, "metadata", "clusterName") } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list_test.go new file mode 100644 index 00000000..04ada449 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list_test.go @@ -0,0 +1,86 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 unstructured + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestUnstructuredList(t *testing.T) { + list := &UnstructuredList{ + Object: map[string]interface{}{"kind": "List", "apiVersion": "v1"}, + Items: []Unstructured{ + {Object: map[string]interface{}{"kind": "Pod", "apiVersion": "v1", "metadata": map[string]interface{}{"name": "test"}}}, + }, + } + content := list.UnstructuredContent() + items := content["items"].([]interface{}) + require.Len(t, items, 1) + val, found, err := NestedFieldCopy(items[0].(map[string]interface{}), "metadata", "name") + require.True(t, found) + require.NoError(t, err) + assert.Equal(t, "test", val) +} + +func TestNilDeletionTimestamp(t *testing.T) { + var u Unstructured + del := u.GetDeletionTimestamp() + if del != nil { + t.Errorf("unexpected non-nil deletion timestamp: %v", del) + } + u.SetDeletionTimestamp(u.GetDeletionTimestamp()) + del = u.GetDeletionTimestamp() + if del != nil { + t.Errorf("unexpected non-nil deletion timestamp: %v", del) + } + _, ok := u.Object["metadata"] + assert.False(t, ok) + + now := metav1.Now() + u.SetDeletionTimestamp(&now) + assert.Equal(t, now.Unix(), u.GetDeletionTimestamp().Unix()) + u.SetDeletionTimestamp(nil) + metadata := u.Object["metadata"].(map[string]interface{}) + _, ok = metadata["deletionTimestamp"] + assert.False(t, ok) +} + +func TestEmptyCreationTimestampIsOmitted(t *testing.T) { + var u Unstructured + now := metav1.Now() + + // set an initial creationTimestamp and ensure the field exists + u.SetCreationTimestamp(now) + metadata := u.Object["metadata"].(map[string]interface{}) + creationTimestamp, exists := metadata["creationTimestamp"] + if !exists { + t.Fatalf("unexpected missing creationTimestamp") + } + + // set an empty timestamp and ensure the field no longer exists + u.SetCreationTimestamp(metav1.Time{}) + metadata = u.Object["metadata"].(map[string]interface{}) + creationTimestamp, exists = metadata["creationTimestamp"] + if exists { + t.Errorf("unexpected creation timestamp field: %q", creationTimestamp) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go new file mode 100644 index 00000000..4a03fff6 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go @@ -0,0 +1,162 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 unstructured_test + +import ( + "math/rand" + "reflect" + "testing" + + "github.com/stretchr/testify/assert" + + "k8s.io/apimachinery/pkg/api/apitesting/fuzzer" + "k8s.io/apimachinery/pkg/api/equality" + metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/diff" +) + +func TestNilUnstructuredContent(t *testing.T) { + var u unstructured.Unstructured + uCopy := u.DeepCopy() + content := u.UnstructuredContent() + expContent := make(map[string]interface{}) + assert.EqualValues(t, expContent, content) + assert.Equal(t, uCopy, &u) +} + +// TestUnstructuredMetadataRoundTrip checks that metadata accessors +// correctly set the metadata for unstructured objects. +// First, it fuzzes an empty ObjectMeta and sets this value as the metadata for an unstructured object. +// Next, it uses metadata accessor methods to set these fuzzed values to another unstructured object. +// Finally, it checks that both the unstructured objects are equal. +func TestUnstructuredMetadataRoundTrip(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + seed := rand.Int63() + fuzzer := fuzzer.FuzzerFor(metafuzzer.Funcs, rand.NewSource(seed), codecs) + + N := 1000 + for i := 0; i < N; i++ { + u := &unstructured.Unstructured{Object: map[string]interface{}{}} + uCopy := u.DeepCopy() + metadata := &metav1.ObjectMeta{} + fuzzer.Fuzz(metadata) + + if err := setObjectMeta(u, metadata); err != nil { + t.Fatalf("unexpected error setting fuzzed ObjectMeta: %v", err) + } + setObjectMetaUsingAccessors(u, uCopy) + + // TODO: remove this special casing when creationTimestamp becomes a pointer. + // Right now, creationTimestamp is a struct (metav1.Time) so omitempty holds no meaning for it. + // However, the current behaviour is to remove the field if it holds an empty struct. + // This special casing exists here because custom marshallers for metav1.Time marshal + // an empty value to "null", which gets converted to nil when converting to an unstructured map by "ToUnstructured". + if err := unstructured.SetNestedField(uCopy.UnstructuredContent(), nil, "metadata", "creationTimestamp"); err != nil { + t.Fatalf("unexpected error setting creationTimestamp as nil: %v", err) + } + + if !equality.Semantic.DeepEqual(u, uCopy) { + t.Errorf("diff: %v", diff.ObjectReflectDiff(u, uCopy)) + } + } +} + +// TestUnstructuredMetadataOmitempty checks that ObjectMeta omitempty +// semantics are enforced for unstructured objects. +// The fuzzing test above should catch these cases but this is here just to be safe. +// Example: the metadata.clusterName field has the omitempty json tag +// so if it is set to it's zero value (""), it should be removed from the metadata map. +func TestUnstructuredMetadataOmitempty(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + seed := rand.Int63() + fuzzer := fuzzer.FuzzerFor(metafuzzer.Funcs, rand.NewSource(seed), codecs) + + // fuzz to make sure we don't miss any function calls below + u := &unstructured.Unstructured{Object: map[string]interface{}{}} + metadata := &metav1.ObjectMeta{} + fuzzer.Fuzz(metadata) + if err := setObjectMeta(u, metadata); err != nil { + t.Fatalf("unexpected error setting fuzzed ObjectMeta: %v", err) + } + + // set zero values for all fields in metadata explicitly + // to check that omitempty fields having zero values are never set + u.SetName("") + u.SetGenerateName("") + u.SetNamespace("") + u.SetSelfLink("") + u.SetUID("") + u.SetResourceVersion("") + u.SetGeneration(0) + u.SetCreationTimestamp(metav1.Time{}) + u.SetDeletionTimestamp(nil) + u.SetDeletionGracePeriodSeconds(nil) + u.SetLabels(nil) + u.SetAnnotations(nil) + u.SetOwnerReferences(nil) + u.SetInitializers(nil) + u.SetFinalizers(nil) + u.SetClusterName("") + + gotMetadata, _, err := unstructured.NestedFieldNoCopy(u.UnstructuredContent(), "metadata") + if err != nil { + t.Error(err) + } + emptyMetadata := make(map[string]interface{}) + + if !reflect.DeepEqual(gotMetadata, emptyMetadata) { + t.Errorf("expected %v, got %v", emptyMetadata, gotMetadata) + } +} + +func setObjectMeta(u *unstructured.Unstructured, objectMeta *metav1.ObjectMeta) error { + if objectMeta == nil { + unstructured.RemoveNestedField(u.UnstructuredContent(), "metadata") + return nil + } + metadata, err := runtime.DefaultUnstructuredConverter.ToUnstructured(objectMeta) + if err != nil { + return err + } + u.UnstructuredContent()["metadata"] = metadata + return nil +} + +func setObjectMetaUsingAccessors(u, uCopy *unstructured.Unstructured) { + uCopy.SetName(u.GetName()) + uCopy.SetGenerateName(u.GetGenerateName()) + uCopy.SetNamespace(u.GetNamespace()) + uCopy.SetSelfLink(u.GetSelfLink()) + uCopy.SetUID(u.GetUID()) + uCopy.SetResourceVersion(u.GetResourceVersion()) + uCopy.SetGeneration(u.GetGeneration()) + uCopy.SetCreationTimestamp(u.GetCreationTimestamp()) + uCopy.SetDeletionTimestamp(u.GetDeletionTimestamp()) + uCopy.SetDeletionGracePeriodSeconds(u.GetDeletionGracePeriodSeconds()) + uCopy.SetLabels(u.GetLabels()) + uCopy.SetAnnotations(u.GetAnnotations()) + uCopy.SetOwnerReferences(u.GetOwnerReferences()) + uCopy.SetInitializers(u.GetInitializers()) + uCopy.SetFinalizers(u.GetFinalizers()) + uCopy.SetClusterName(u.GetClusterName()) +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD index b7dbe0ad..ea9cc91b 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD @@ -10,17 +10,19 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], ) go_library( name = "go_default_library", srcs = ["validation.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation", importpath = "k8s.io/apimachinery/pkg/apis/meta/v1/validation", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go index 96e5f42b..81f86fb3 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go @@ -18,6 +18,7 @@ package validation import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" ) @@ -84,6 +85,25 @@ func ValidateDeleteOptions(options *metav1.DeleteOptions) field.ErrorList { *options.PropagationPolicy != metav1.DeletePropagationOrphan { allErrs = append(allErrs, field.NotSupported(field.NewPath("propagationPolicy"), options.PropagationPolicy, []string{string(metav1.DeletePropagationForeground), string(metav1.DeletePropagationBackground), string(metav1.DeletePropagationOrphan), "nil"})) } + allErrs = append(allErrs, validateDryRun(field.NewPath("dryRun"), options.DryRun)...) + return allErrs +} + +func ValidateCreateOptions(options *metav1.CreateOptions) field.ErrorList { + return validateDryRun(field.NewPath("dryRun"), options.DryRun) +} + +func ValidateUpdateOptions(options *metav1.UpdateOptions) field.ErrorList { + return validateDryRun(field.NewPath("dryRun"), options.DryRun) +} + +var allowedDryRunValues = sets.NewString(metav1.DryRunAll) + +func validateDryRun(fldPath *field.Path, dryRun []string) field.ErrorList { + allErrs := field.ErrorList{} + if !allowedDryRunValues.HasAll(dryRun...) { + allErrs = append(allErrs, field.NotSupported(fldPath, dryRun, allowedDryRunValues.List())) + } return allErrs } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation_test.go new file mode 100644 index 00000000..a7046a54 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation_test.go @@ -0,0 +1,127 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 validation + +import ( + "fmt" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/util/validation/field" +) + +func TestValidateLabels(t *testing.T) { + successCases := []map[string]string{ + {"simple": "bar"}, + {"now-with-dashes": "bar"}, + {"1-starts-with-num": "bar"}, + {"1234": "bar"}, + {"simple/simple": "bar"}, + {"now-with-dashes/simple": "bar"}, + {"now-with-dashes/now-with-dashes": "bar"}, + {"now.with.dots/simple": "bar"}, + {"now-with.dashes-and.dots/simple": "bar"}, + {"1-num.2-num/3-num": "bar"}, + {"1234/5678": "bar"}, + {"1.2.3.4/5678": "bar"}, + {"UpperCaseAreOK123": "bar"}, + {"goodvalue": "123_-.BaR"}, + } + for i := range successCases { + errs := ValidateLabels(successCases[i], field.NewPath("field")) + if len(errs) != 0 { + t.Errorf("case[%d] expected success, got %#v", i, errs) + } + } + + namePartErrMsg := "name part must consist of" + nameErrMsg := "a qualified name must consist of" + labelErrMsg := "a valid label must be an empty string or consist of" + maxLengthErrMsg := "must be no more than" + + labelNameErrorCases := []struct { + labels map[string]string + expect string + }{ + {map[string]string{"nospecialchars^=@": "bar"}, namePartErrMsg}, + {map[string]string{"cantendwithadash-": "bar"}, namePartErrMsg}, + {map[string]string{"only/one/slash": "bar"}, nameErrMsg}, + {map[string]string{strings.Repeat("a", 254): "bar"}, maxLengthErrMsg}, + } + for i := range labelNameErrorCases { + errs := ValidateLabels(labelNameErrorCases[i].labels, field.NewPath("field")) + if len(errs) != 1 { + t.Errorf("case[%d]: expected failure", i) + } else { + if !strings.Contains(errs[0].Detail, labelNameErrorCases[i].expect) { + t.Errorf("case[%d]: error details do not include %q: %q", i, labelNameErrorCases[i].expect, errs[0].Detail) + } + } + } + + labelValueErrorCases := []struct { + labels map[string]string + expect string + }{ + {map[string]string{"toolongvalue": strings.Repeat("a", 64)}, maxLengthErrMsg}, + {map[string]string{"backslashesinvalue": "some\\bad\\value"}, labelErrMsg}, + {map[string]string{"nocommasallowed": "bad,value"}, labelErrMsg}, + {map[string]string{"strangecharsinvalue": "?#$notsogood"}, labelErrMsg}, + } + for i := range labelValueErrorCases { + errs := ValidateLabels(labelValueErrorCases[i].labels, field.NewPath("field")) + if len(errs) != 1 { + t.Errorf("case[%d]: expected failure", i) + } else { + if !strings.Contains(errs[0].Detail, labelValueErrorCases[i].expect) { + t.Errorf("case[%d]: error details do not include %q: %q", i, labelValueErrorCases[i].expect, errs[0].Detail) + } + } + } +} + +func TestValidDryRun(t *testing.T) { + tests := [][]string{ + {}, + {"All"}, + {"All", "All"}, + } + + for _, test := range tests { + t.Run(fmt.Sprintf("%v", test), func(t *testing.T) { + if errs := validateDryRun(field.NewPath("dryRun"), test); len(errs) != 0 { + t.Errorf("%v should be a valid dry-run value: %v", test, errs) + } + }) + } +} + +func TestInvalidDryRun(t *testing.T) { + tests := [][]string{ + {"False"}, + {"All", "False"}, + } + + for _, test := range tests { + t.Run(fmt.Sprintf("%v", test), func(t *testing.T) { + if len(validateDryRun(field.NewPath("dryRun"), test)) == 0 { + t.Errorf("%v shouldn't be a valid dry-run value", test) + } + }) + } + +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/watch.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/watch.go index b7ec5031..58f07738 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/watch.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/watch.go @@ -39,7 +39,7 @@ type WatchEvent struct { Object runtime.RawExtension `json:"object" protobuf:"bytes,2,opt,name=object"` } -func Convert_watch_Event_to_versioned_Event(in *watch.Event, out *WatchEvent, s conversion.Scope) error { +func Convert_watch_Event_To_v1_WatchEvent(in *watch.Event, out *WatchEvent, s conversion.Scope) error { out.Type = string(in.Type) switch t := in.Object.(type) { case *runtime.Unknown: @@ -52,11 +52,11 @@ func Convert_watch_Event_to_versioned_Event(in *watch.Event, out *WatchEvent, s return nil } -func Convert_versioned_InternalEvent_to_versioned_Event(in *InternalEvent, out *WatchEvent, s conversion.Scope) error { - return Convert_watch_Event_to_versioned_Event((*watch.Event)(in), out, s) +func Convert_v1_InternalEvent_To_v1_WatchEvent(in *InternalEvent, out *WatchEvent, s conversion.Scope) error { + return Convert_watch_Event_To_v1_WatchEvent((*watch.Event)(in), out, s) } -func Convert_versioned_Event_to_watch_Event(in *WatchEvent, out *watch.Event, s conversion.Scope) error { +func Convert_v1_WatchEvent_To_watch_Event(in *WatchEvent, out *watch.Event, s conversion.Scope) error { out.Type = watch.EventType(in.Type) if in.Object.Object != nil { out.Object = in.Object.Object @@ -70,8 +70,8 @@ func Convert_versioned_Event_to_watch_Event(in *WatchEvent, out *watch.Event, s return nil } -func Convert_versioned_Event_to_versioned_InternalEvent(in *WatchEvent, out *InternalEvent, s conversion.Scope) error { - return Convert_versioned_Event_to_watch_Event(in, (*watch.Event)(out), s) +func Convert_v1_WatchEvent_To_v1_InternalEvent(in *WatchEvent, out *InternalEvent, s conversion.Scope) error { + return Convert_v1_WatchEvent_To_watch_Event(in, (*watch.Event)(out), s) } // InternalEvent makes watch.Event versioned diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go index 98dfea09..10845993 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go @@ -191,45 +191,64 @@ func (in *APIVersions) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CreateOptions) DeepCopyInto(out *CreateOptions) { + *out = *in + out.TypeMeta = in.TypeMeta + if in.DryRun != nil { + in, out := &in.DryRun, &out.DryRun + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CreateOptions. +func (in *CreateOptions) DeepCopy() *CreateOptions { + if in == nil { + return nil + } + out := new(CreateOptions) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CreateOptions) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DeleteOptions) DeepCopyInto(out *DeleteOptions) { *out = *in out.TypeMeta = in.TypeMeta if in.GracePeriodSeconds != nil { in, out := &in.GracePeriodSeconds, &out.GracePeriodSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.Preconditions != nil { in, out := &in.Preconditions, &out.Preconditions - if *in == nil { - *out = nil - } else { - *out = new(Preconditions) - (*in).DeepCopyInto(*out) - } + *out = new(Preconditions) + (*in).DeepCopyInto(*out) } if in.OrphanDependents != nil { in, out := &in.OrphanDependents, &out.OrphanDependents - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.PropagationPolicy != nil { in, out := &in.PropagationPolicy, &out.PropagationPolicy - if *in == nil { - *out = nil - } else { - *out = new(DeletionPropagation) - **out = **in - } + *out = new(DeletionPropagation) + **out = **in + } + if in.DryRun != nil { + in, out := &in.DryRun, &out.DryRun + *out = make([]string, len(*in)) + copy(*out, *in) } return } @@ -440,12 +459,8 @@ func (in *Initializers) DeepCopyInto(out *Initializers) { } if in.Result != nil { in, out := &in.Result, &out.Result - if *in == nil { - *out = nil - } else { - *out = new(Status) - (*in).DeepCopyInto(*out) - } + *out = new(Status) + (*in).DeepCopyInto(*out) } return } @@ -463,9 +478,7 @@ func (in *Initializers) DeepCopy() *Initializers { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *InternalEvent) DeepCopyInto(out *InternalEvent) { *out = *in - if in.Object == nil { - out.Object = nil - } else { + if in.Object != nil { out.Object = in.Object.DeepCopyObject() } return @@ -587,12 +600,8 @@ func (in *ListOptions) DeepCopyInto(out *ListOptions) { out.TypeMeta = in.TypeMeta if in.TimeoutSeconds != nil { in, out := &in.TimeoutSeconds, &out.TimeoutSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } return } @@ -631,20 +640,12 @@ func (in *ObjectMeta) DeepCopyInto(out *ObjectMeta) { in.CreationTimestamp.DeepCopyInto(&out.CreationTimestamp) if in.DeletionTimestamp != nil { in, out := &in.DeletionTimestamp, &out.DeletionTimestamp - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.DeletionGracePeriodSeconds != nil { in, out := &in.DeletionGracePeriodSeconds, &out.DeletionGracePeriodSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.Labels != nil { in, out := &in.Labels, &out.Labels @@ -669,12 +670,8 @@ func (in *ObjectMeta) DeepCopyInto(out *ObjectMeta) { } if in.Initializers != nil { in, out := &in.Initializers, &out.Initializers - if *in == nil { - *out = nil - } else { - *out = new(Initializers) - (*in).DeepCopyInto(*out) - } + *out = new(Initializers) + (*in).DeepCopyInto(*out) } if in.Finalizers != nil { in, out := &in.Finalizers, &out.Finalizers @@ -699,21 +696,13 @@ func (in *OwnerReference) DeepCopyInto(out *OwnerReference) { *out = *in if in.Controller != nil { in, out := &in.Controller, &out.Controller - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.BlockOwnerDeletion != nil { in, out := &in.BlockOwnerDeletion, &out.BlockOwnerDeletion - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -749,12 +738,8 @@ func (in *Preconditions) DeepCopyInto(out *Preconditions) { *out = *in if in.UID != nil { in, out := &in.UID, &out.UID - if *in == nil { - *out = nil - } else { - *out = new(types.UID) - **out = **in - } + *out = new(types.UID) + **out = **in } return } @@ -813,12 +798,8 @@ func (in *Status) DeepCopyInto(out *Status) { out.ListMeta = in.ListMeta if in.Details != nil { in, out := &in.Details, &out.Details - if *in == nil { - *out = nil - } else { - *out = new(StatusDetails) - (*in).DeepCopyInto(*out) - } + *out = new(StatusDetails) + (*in).DeepCopyInto(*out) } return } @@ -904,6 +885,36 @@ func (in *Timestamp) DeepCopy() *Timestamp { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *UpdateOptions) DeepCopyInto(out *UpdateOptions) { + *out = *in + out.TypeMeta = in.TypeMeta + if in.DryRun != nil { + in, out := &in.DryRun, &out.DryRun + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UpdateOptions. +func (in *UpdateOptions) DeepCopy() *UpdateOptions { + if in == nil { + return nil + } + out := new(UpdateOptions) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *UpdateOptions) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in Verbs) DeepCopyInto(out *Verbs) { { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD index 05f33c5b..9c8415ae 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD @@ -1,11 +1,5 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - go_library( name = "go_default_library", srcs = [ @@ -19,14 +13,15 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1", importpath = "k8s.io/apimachinery/pkg/apis/meta/v1beta1", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go index 4e427b3b..fe3df691 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go @@ -604,30 +604,29 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 391 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xbd, 0x6e, 0xd4, 0x40, - 0x10, 0xc7, 0xbd, 0x42, 0x11, 0x64, 0x43, 0x1a, 0x23, 0xa4, 0x70, 0xc5, 0x3a, 0xba, 0x2a, 0x48, - 0x64, 0x97, 0x04, 0x84, 0x28, 0x91, 0xbb, 0x48, 0xa0, 0x44, 0x16, 0x15, 0x15, 0x6b, 0x7b, 0xf0, - 0x2d, 0xb6, 0x77, 0xad, 0xdd, 0x71, 0xa4, 0x6b, 0x10, 0x8f, 0xc0, 0x63, 0x5d, 0x99, 0x32, 0x95, - 0xc5, 0x99, 0xb7, 0xa0, 0x42, 0xfe, 0x10, 0xf9, 0xb8, 0x3b, 0xe5, 0xba, 0x99, 0xff, 0xe8, 0xf7, - 0xf3, 0x8c, 0x97, 0x46, 0xf9, 0x7b, 0xc7, 0x95, 0x11, 0x79, 0x1d, 0x83, 0xd5, 0x80, 0xe0, 0xc4, - 0x25, 0xe8, 0xd4, 0x58, 0x31, 0x0e, 0x64, 0xa5, 0x4a, 0x99, 0xcc, 0x94, 0x06, 0x3b, 0x17, 0x55, - 0x9e, 0x75, 0x81, 0x13, 0x25, 0xa0, 0x14, 0x97, 0x27, 0x31, 0xa0, 0x3c, 0x11, 0x19, 0x68, 0xb0, - 0x12, 0x21, 0xe5, 0x95, 0x35, 0x68, 0xfc, 0x97, 0x03, 0xca, 0x6f, 0xa3, 0xbc, 0xca, 0xb3, 0x2e, - 0x70, 0xbc, 0x43, 0xf9, 0x88, 0x4e, 0x8e, 0x33, 0x85, 0xb3, 0x3a, 0xe6, 0x89, 0x29, 0x45, 0x66, - 0x32, 0x23, 0x7a, 0x43, 0x5c, 0x7f, 0xeb, 0xbb, 0xbe, 0xe9, 0xab, 0xc1, 0x3c, 0x79, 0xbb, 0xcd, - 0x52, 0xf7, 0xf7, 0x99, 0x6c, 0x3c, 0xc5, 0xd6, 0x1a, 0x55, 0x09, 0x2b, 0xc0, 0xbb, 0x87, 0x00, - 0x97, 0xcc, 0xa0, 0x94, 0x2b, 0xdc, 0x9b, 0x4d, 0x5c, 0x8d, 0xaa, 0x10, 0x4a, 0xa3, 0x43, 0x7b, - 0x1f, 0x9a, 0xce, 0xe9, 0xf3, 0x0b, 0x69, 0x51, 0xc9, 0xe2, 0x3c, 0xfe, 0x0e, 0x09, 0x7e, 0x02, - 0x94, 0xa9, 0x44, 0xe9, 0x7f, 0xa5, 0x4f, 0xca, 0xb1, 0x3e, 0x20, 0x87, 0xe4, 0x68, 0xef, 0xf4, - 0x35, 0xdf, 0xe6, 0xcf, 0xf2, 0x1b, 0x4f, 0xe8, 0x2f, 0x9a, 0xc0, 0x6b, 0x9b, 0x80, 0xde, 0x64, - 0xd1, 0x7f, 0xeb, 0xf4, 0x07, 0x7d, 0xb1, 0xf6, 0xd3, 0x1f, 0x95, 0x43, 0x5f, 0xd2, 0x1d, 0x85, - 0x50, 0xba, 0x03, 0x72, 0xf8, 0xe8, 0x68, 0xef, 0xf4, 0x03, 0xdf, 0xfa, 0x55, 0xf9, 0x5a, 0x69, - 0xb8, 0xdb, 0x36, 0xc1, 0xce, 0x59, 0xa7, 0x8c, 0x06, 0xf3, 0x34, 0xa6, 0x4f, 0x3f, 0xcb, 0xb8, - 0x80, 0xf3, 0x0a, 0x95, 0xd1, 0xce, 0x8f, 0xe8, 0xbe, 0xd2, 0x49, 0x51, 0xa7, 0x30, 0xa0, 0xfd, - 0xd9, 0xbb, 0xe1, 0xab, 0xf1, 0x88, 0xfd, 0xb3, 0xdb, 0xc3, 0xbf, 0x4d, 0xf0, 0xec, 0x4e, 0x70, - 0x61, 0x0a, 0x95, 0xcc, 0xa3, 0xbb, 0x8a, 0xf0, 0x78, 0xb1, 0x64, 0xde, 0xd5, 0x92, 0x79, 0xd7, - 0x4b, 0xe6, 0xfd, 0x6c, 0x19, 0x59, 0xb4, 0x8c, 0x5c, 0xb5, 0x8c, 0x5c, 0xb7, 0x8c, 0xfc, 0x6e, - 0x19, 0xf9, 0xf5, 0x87, 0x79, 0x5f, 0x1e, 0x8f, 0xab, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x73, - 0xdf, 0x3a, 0x0c, 0x10, 0x03, 0x00, 0x00, + // 375 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xcd, 0x0a, 0xd3, 0x40, + 0x10, 0xc7, 0xb3, 0x48, 0xd1, 0x6e, 0xed, 0x25, 0x22, 0xd4, 0x1e, 0x36, 0xa5, 0xa7, 0x0a, 0x76, + 0xd7, 0x16, 0x11, 0x8f, 0x92, 0x5b, 0x41, 0x69, 0x09, 0x9e, 0x3c, 0xb9, 0x49, 0xc6, 0x74, 0xcd, + 0xc7, 0x86, 0xec, 0xa6, 0xd0, 0x8b, 0xf8, 0x08, 0x3e, 0x56, 0x8f, 0x3d, 0xf6, 0x14, 0x6c, 0x7c, + 0x0b, 0x4f, 0x92, 0x0f, 0xec, 0x87, 0x15, 0x7b, 0x9b, 0xf9, 0x0f, 0xbf, 0x5f, 0x66, 0xb2, 0xd8, + 0x09, 0xdf, 0x28, 0x2a, 0x24, 0x0b, 0x73, 0x17, 0xb2, 0x04, 0x34, 0x28, 0xb6, 0x81, 0xc4, 0x97, + 0x19, 0x6b, 0x07, 0x3c, 0x15, 0x31, 0xf7, 0xd6, 0x22, 0x81, 0x6c, 0xcb, 0xd2, 0x30, 0xa8, 0x02, + 0xc5, 0x62, 0xd0, 0x9c, 0x6d, 0x66, 0x2e, 0x68, 0x3e, 0x63, 0x01, 0x24, 0x90, 0x71, 0x0d, 0x3e, + 0x4d, 0x33, 0xa9, 0xa5, 0xf9, 0xbc, 0x41, 0xe9, 0x39, 0x4a, 0xd3, 0x30, 0xa8, 0x02, 0x45, 0x2b, + 0x94, 0xb6, 0xe8, 0x70, 0x1a, 0x08, 0xbd, 0xce, 0x5d, 0xea, 0xc9, 0x98, 0x05, 0x32, 0x90, 0xac, + 0x36, 0xb8, 0xf9, 0xe7, 0xba, 0xab, 0x9b, 0xba, 0x6a, 0xcc, 0xc3, 0x57, 0xf7, 0x2c, 0x75, 0xbd, + 0xcf, 0xf0, 0x9f, 0xa7, 0x64, 0x79, 0xa2, 0x45, 0x0c, 0x7f, 0x01, 0xaf, 0xff, 0x07, 0x28, 0x6f, + 0x0d, 0x31, 0xbf, 0xe6, 0xc6, 0x5b, 0xfc, 0x74, 0xc5, 0x33, 0x2d, 0x78, 0xb4, 0x74, 0xbf, 0x80, + 0xa7, 0xdf, 0x83, 0xe6, 0x3e, 0xd7, 0xdc, 0xfc, 0x84, 0x1f, 0xc5, 0x6d, 0x3d, 0x40, 0x23, 0x34, + 0xe9, 0xcd, 0x5f, 0xd2, 0x7b, 0x7e, 0x12, 0x3d, 0x79, 0x6c, 0x73, 0x57, 0x58, 0x46, 0x59, 0x58, + 0xf8, 0x94, 0x39, 0x7f, 0xac, 0xe3, 0xaf, 0xf8, 0xd9, 0xcd, 0x4f, 0xbf, 0x13, 0x4a, 0x9b, 0x1c, + 0x77, 0x84, 0x86, 0x58, 0x0d, 0xd0, 0xe8, 0xc1, 0xa4, 0x37, 0x7f, 0x4b, 0xef, 0x7e, 0x20, 0x7a, + 0x53, 0x6a, 0x77, 0xcb, 0xc2, 0xea, 0x2c, 0x2a, 0xa5, 0xd3, 0x98, 0xc7, 0x2e, 0x7e, 0xfc, 0x81, + 0xbb, 0x11, 0x2c, 0x53, 0x2d, 0x64, 0xa2, 0x4c, 0x07, 0xf7, 0x45, 0xe2, 0x45, 0xb9, 0x0f, 0x0d, + 0x5a, 0x9f, 0xdd, 0xb5, 0x5f, 0xb4, 0x47, 0xf4, 0x17, 0xe7, 0xc3, 0x5f, 0x85, 0xf5, 0xe4, 0x22, + 0x58, 0xc9, 0x48, 0x78, 0x5b, 0xe7, 0x52, 0x61, 0x4f, 0x77, 0x47, 0x62, 0xec, 0x8f, 0xc4, 0x38, + 0x1c, 0x89, 0xf1, 0xad, 0x24, 0x68, 0x57, 0x12, 0xb4, 0x2f, 0x09, 0x3a, 0x94, 0x04, 0xfd, 0x28, + 0x09, 0xfa, 0xfe, 0x93, 0x18, 0x1f, 0x1f, 0xb6, 0xab, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xf3, + 0xe1, 0xde, 0x86, 0xdb, 0x02, 0x00, 0x00, } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto index 472902ad..83be9979 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto @@ -24,7 +24,6 @@ package k8s.io.apimachinery.pkg.apis.meta.v1beta1; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go index 2e79a131..b77db1b1 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go @@ -58,11 +58,10 @@ func (in *PartialObjectMetadataList) DeepCopyInto(out *PartialObjectMetadataList in, out := &in.Items, &out.Items *out = make([]*PartialObjectMetadata, len(*in)) for i := range *in { - if (*in)[i] == nil { - (*out)[i] = nil - } else { - (*out)[i] = new(PartialObjectMetadata) - (*in)[i].DeepCopyInto((*out)[i]) + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(PartialObjectMetadata) + (*in).DeepCopyInto(*out) } } } diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/BUILD b/vendor/k8s.io/apimachinery/pkg/conversion/BUILD index 0d2cee72..29a2adee 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/conversion/BUILD @@ -14,9 +14,9 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) @@ -28,8 +28,9 @@ go_library( "doc.go", "helper.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/conversion", importpath = "k8s.io/apimachinery/pkg/conversion", - deps = ["//vendor/k8s.io/apimachinery/third_party/forked/golang/reflect:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/third_party/forked/golang/reflect:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/converter.go b/vendor/k8s.io/apimachinery/pkg/conversion/converter.go index 7854c207..bc615dc3 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/converter.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/converter.go @@ -40,7 +40,11 @@ type NameFunc func(t reflect.Type) string var DefaultNameFunc = func(t reflect.Type) string { return t.Name() } -type GenericConversionFunc func(a, b interface{}, scope Scope) (bool, error) +// ConversionFunc converts the object a into the object b, reusing arrays or objects +// or pointers if necessary. It should return an error if the object cannot be converted +// or if some data is invalid. If you do not wish a and b to share fields or nested +// objects, you must copy a before calling this function. +type ConversionFunc func(a, b interface{}, scope Scope) error // Converter knows how to convert one type to another. type Converter struct { @@ -49,11 +53,6 @@ type Converter struct { conversionFuncs ConversionFuncs generatedConversionFuncs ConversionFuncs - // genericConversions are called during normal conversion to offer a "fast-path" - // that avoids all reflection. These methods are not called outside of the .Convert() - // method. - genericConversions []GenericConversionFunc - // Set of conversions that should be treated as a no-op ignoredConversions map[typePair]struct{} @@ -98,14 +97,6 @@ func NewConverter(nameFn NameFunc) *Converter { return c } -// AddGenericConversionFunc adds a function that accepts the ConversionFunc call pattern -// (for two conversion types) to the converter. These functions are checked first during -// a normal conversion, but are otherwise not called. Use AddConversionFuncs when registering -// typed conversions. -func (c *Converter) AddGenericConversionFunc(fn GenericConversionFunc) { - c.genericConversions = append(c.genericConversions, fn) -} - // WithConversions returns a Converter that is a copy of c but with the additional // fns merged on top. func (c *Converter) WithConversions(fns ConversionFuncs) *Converter { @@ -161,11 +152,15 @@ type Scope interface { type FieldMappingFunc func(key string, sourceTag, destTag reflect.StructTag) (source string, dest string) func NewConversionFuncs() ConversionFuncs { - return ConversionFuncs{fns: make(map[typePair]reflect.Value)} + return ConversionFuncs{ + fns: make(map[typePair]reflect.Value), + untyped: make(map[typePair]ConversionFunc), + } } type ConversionFuncs struct { - fns map[typePair]reflect.Value + fns map[typePair]reflect.Value + untyped map[typePair]ConversionFunc } // Add adds the provided conversion functions to the lookup table - they must have the signature @@ -183,6 +178,21 @@ func (c ConversionFuncs) Add(fns ...interface{}) error { return nil } +// AddUntyped adds the provided conversion function to the lookup table for the types that are +// supplied as a and b. a and b must be pointers or an error is returned. This method overwrites +// previously defined functions. +func (c ConversionFuncs) AddUntyped(a, b interface{}, fn ConversionFunc) error { + tA, tB := reflect.TypeOf(a), reflect.TypeOf(b) + if tA.Kind() != reflect.Ptr { + return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", a) + } + if tB.Kind() != reflect.Ptr { + return fmt.Errorf("the type %T must be a pointer to register as an untyped conversion", b) + } + c.untyped[typePair{tA, tB}] = fn + return nil +} + // Merge returns a new ConversionFuncs that contains all conversions from // both other and c, with other conversions taking precedence. func (c ConversionFuncs) Merge(other ConversionFuncs) ConversionFuncs { @@ -193,6 +203,12 @@ func (c ConversionFuncs) Merge(other ConversionFuncs) ConversionFuncs { for k, v := range other.fns { merged.fns[k] = v } + for k, v := range c.untyped { + merged.untyped[k] = v + } + for k, v := range other.untyped { + merged.untyped[k] = v + } return merged } @@ -355,16 +371,32 @@ func verifyConversionFunctionSignature(ft reflect.Type) error { // // conversion logic... // return nil // }) +// DEPRECATED: Will be removed in favor of RegisterUntypedConversionFunc func (c *Converter) RegisterConversionFunc(conversionFunc interface{}) error { return c.conversionFuncs.Add(conversionFunc) } // Similar to RegisterConversionFunc, but registers conversion function that were // automatically generated. +// DEPRECATED: Will be removed in favor of RegisterGeneratedUntypedConversionFunc func (c *Converter) RegisterGeneratedConversionFunc(conversionFunc interface{}) error { return c.generatedConversionFuncs.Add(conversionFunc) } +// RegisterUntypedConversionFunc registers a function that converts between a and b by passing objects of those +// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce +// any other guarantee. +func (c *Converter) RegisterUntypedConversionFunc(a, b interface{}, fn ConversionFunc) error { + return c.conversionFuncs.AddUntyped(a, b, fn) +} + +// RegisterGeneratedUntypedConversionFunc registers a function that converts between a and b by passing objects of those +// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce +// any other guarantee. +func (c *Converter) RegisterGeneratedUntypedConversionFunc(a, b interface{}, fn ConversionFunc) error { + return c.generatedConversionFuncs.AddUntyped(a, b, fn) +} + // RegisterIgnoredConversion registers a "no-op" for conversion, where any requested // conversion between from and to is ignored. func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error { @@ -380,39 +412,6 @@ func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error { return nil } -// IsConversionIgnored returns true if the specified objects should be dropped during -// conversion. -func (c *Converter) IsConversionIgnored(inType, outType reflect.Type) bool { - _, found := c.ignoredConversions[typePair{inType, outType}] - return found -} - -func (c *Converter) HasConversionFunc(inType, outType reflect.Type) bool { - _, found := c.conversionFuncs.fns[typePair{inType, outType}] - return found -} - -func (c *Converter) ConversionFuncValue(inType, outType reflect.Type) (reflect.Value, bool) { - value, found := c.conversionFuncs.fns[typePair{inType, outType}] - return value, found -} - -// SetStructFieldCopy registers a correspondence. Whenever a struct field is encountered -// which has a type and name matching srcFieldType and srcFieldName, it wil be copied -// into the field in the destination struct matching destFieldType & Name, if such a -// field exists. -// May be called multiple times, even for the same source field & type--all applicable -// copies will be performed. -func (c *Converter) SetStructFieldCopy(srcFieldType interface{}, srcFieldName string, destFieldType interface{}, destFieldName string) error { - st := reflect.TypeOf(srcFieldType) - dt := reflect.TypeOf(destFieldType) - srcKey := typeNamePair{st, srcFieldName} - destKey := typeNamePair{dt, destFieldName} - c.structFieldDests[srcKey] = append(c.structFieldDests[srcKey], destKey) - c.structFieldSources[destKey] = append(c.structFieldSources[destKey], srcKey) - return nil -} - // RegisterInputDefaults registers a field name mapping function, used when converting // from maps to structs. Inputs to the conversion methods are checked for this type and a mapping // applied automatically if the input matches in. A set of default flags for the input conversion @@ -468,15 +467,6 @@ func (f FieldMatchingFlags) IsSet(flag FieldMatchingFlags) bool { // it is not used by Convert() other than storing it in the scope. // Not safe for objects with cyclic references! func (c *Converter) Convert(src, dest interface{}, flags FieldMatchingFlags, meta *Meta) error { - if len(c.genericConversions) > 0 { - // TODO: avoid scope allocation - s := &scope{converter: c, flags: flags, meta: meta} - for _, fn := range c.genericConversions { - if ok, err := fn(src, dest, s); ok { - return err - } - } - } return c.doConversion(src, dest, flags, meta, c.convert) } @@ -495,6 +485,21 @@ func (c *Converter) DefaultConvert(src, dest interface{}, flags FieldMatchingFla type conversionFunc func(sv, dv reflect.Value, scope *scope) error func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags, meta *Meta, f conversionFunc) error { + pair := typePair{reflect.TypeOf(src), reflect.TypeOf(dest)} + scope := &scope{ + converter: c, + flags: flags, + meta: meta, + } + if fn, ok := c.conversionFuncs.untyped[pair]; ok { + return fn(src, dest, scope) + } + if fn, ok := c.generatedConversionFuncs.untyped[pair]; ok { + return fn(src, dest, scope) + } + // TODO: consider everything past this point deprecated - we want to support only point to point top level + // conversions + dv, err := EnforcePtr(dest) if err != nil { return err @@ -506,15 +511,10 @@ func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags if err != nil { return err } - s := &scope{ - converter: c, - flags: flags, - meta: meta, - } // Leave something on the stack, so that calls to struct tag getters never fail. - s.srcStack.push(scopeStackElem{}) - s.destStack.push(scopeStackElem{}) - return f(sv, dv, s) + scope.srcStack.push(scopeStackElem{}) + scope.destStack.push(scopeStackElem{}) + return f(sv, dv, scope) } // callCustom calls 'custom' with sv & dv. custom must be a conversion function. diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/converter_test.go b/vendor/k8s.io/apimachinery/pkg/conversion/converter_test.go new file mode 100644 index 00000000..924f6991 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/conversion/converter_test.go @@ -0,0 +1,734 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 conversion + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "testing" + + "github.com/google/gofuzz" + flag "github.com/spf13/pflag" + + "k8s.io/apimachinery/pkg/util/diff" +) + +var fuzzIters = flag.Int("fuzz-iters", 50, "How many fuzzing iterations to do.") + +// Test a weird version/kind embedding format. +type MyWeirdCustomEmbeddedVersionKindField struct { + ID string `json:"ID,omitempty"` + APIVersion string `json:"myVersionKey,omitempty"` + ObjectKind string `json:"myKindKey,omitempty"` + Z string `json:"Z,omitempty"` + Y uint64 `json:"Y,omitempty"` +} + +type TestType1 struct { + MyWeirdCustomEmbeddedVersionKindField `json:",inline"` + A string `json:"A,omitempty"` + B int `json:"B,omitempty"` + C int8 `json:"C,omitempty"` + D int16 `json:"D,omitempty"` + E int32 `json:"E,omitempty"` + F int64 `json:"F,omitempty"` + G uint `json:"G,omitempty"` + H uint8 `json:"H,omitempty"` + I uint16 `json:"I,omitempty"` + J uint32 `json:"J,omitempty"` + K uint64 `json:"K,omitempty"` + L bool `json:"L,omitempty"` + M map[string]int `json:"M,omitempty"` + N map[string]TestType2 `json:"N,omitempty"` + O *TestType2 `json:"O,omitempty"` + P []TestType2 `json:"Q,omitempty"` +} + +type TestType2 struct { + A string `json:"A,omitempty"` + B int `json:"B,omitempty"` +} + +type ExternalTestType2 struct { + A string `json:"A,omitempty"` + B int `json:"B,omitempty"` +} +type ExternalTestType1 struct { + MyWeirdCustomEmbeddedVersionKindField `json:",inline"` + A string `json:"A,omitempty"` + B int `json:"B,omitempty"` + C int8 `json:"C,omitempty"` + D int16 `json:"D,omitempty"` + E int32 `json:"E,omitempty"` + F int64 `json:"F,omitempty"` + G uint `json:"G,omitempty"` + H uint8 `json:"H,omitempty"` + I uint16 `json:"I,omitempty"` + J uint32 `json:"J,omitempty"` + K uint64 `json:"K,omitempty"` + L bool `json:"L,omitempty"` + M map[string]int `json:"M,omitempty"` + N map[string]ExternalTestType2 `json:"N,omitempty"` + O *ExternalTestType2 `json:"O,omitempty"` + P []ExternalTestType2 `json:"Q,omitempty"` +} + +func testLogger(t *testing.T) DebugLogger { + // We don't set logger to eliminate rubbish logs in tests. + // If you want to switch it, simply switch it to: "return t" + return nil +} + +func TestConverter_byteSlice(t *testing.T) { + c := NewConverter(DefaultNameFunc) + src := []byte{1, 2, 3} + dest := []byte{} + err := c.Convert(&src, &dest, 0, nil) + if err != nil { + t.Fatalf("expected no error") + } + if e, a := src, dest; !reflect.DeepEqual(e, a) { + t.Errorf("expected %#v, got %#v", e, a) + } +} + +func TestConverter_MismatchedTypes(t *testing.T) { + c := NewConverter(DefaultNameFunc) + + err := c.RegisterConversionFunc( + func(in *[]string, out *int, s Scope) error { + if str, err := strconv.Atoi((*in)[0]); err != nil { + return err + } else { + *out = str + return nil + } + }, + ) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + src := []string{"5"} + var dest *int + err = c.Convert(&src, &dest, 0, nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if e, a := 5, *dest; e != a { + t.Errorf("expected %#v, got %#v", e, a) + } +} + +func TestConverter_DefaultConvert(t *testing.T) { + type A struct { + Foo string + Baz int + } + type B struct { + Bar string + Baz int + } + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + c.nameFunc = func(t reflect.Type) string { return "MyType" } + + // Ensure conversion funcs can call DefaultConvert to get default behavior, + // then fixup remaining fields manually + err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { + if err := s.DefaultConvert(in, out, IgnoreMissingFields); err != nil { + return err + } + out.Bar = in.Foo + return nil + }) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + + x := A{"hello, intrepid test reader!", 3} + y := B{} + + err = c.Convert(&x, &y, 0, nil) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + if e, a := x.Foo, y.Bar; e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := x.Baz, y.Baz; e != a { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestConverter_DeepCopy(t *testing.T) { + type A struct { + Foo *string + Bar []string + Baz interface{} + Qux map[string]string + } + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + + foo, baz := "foo", "baz" + x := A{ + Foo: &foo, + Bar: []string{"bar"}, + Baz: &baz, + Qux: map[string]string{"qux": "qux"}, + } + y := A{} + + if err := c.Convert(&x, &y, 0, nil); err != nil { + t.Fatalf("unexpected error %v", err) + } + *x.Foo = "foo2" + x.Bar[0] = "bar2" + *x.Baz.(*string) = "baz2" + x.Qux["qux"] = "qux2" + if e, a := *x.Foo, *y.Foo; e == a { + t.Errorf("expected difference between %v and %v", e, a) + } + if e, a := x.Bar, y.Bar; reflect.DeepEqual(e, a) { + t.Errorf("expected difference between %v and %v", e, a) + } + if e, a := *x.Baz.(*string), *y.Baz.(*string); e == a { + t.Errorf("expected difference between %v and %v", e, a) + } + if e, a := x.Qux, y.Qux; reflect.DeepEqual(e, a) { + t.Errorf("expected difference between %v and %v", e, a) + } +} + +func TestConverter_CallsRegisteredFunctions(t *testing.T) { + type A struct { + Foo string + Baz int + } + type B struct { + Bar string + Baz int + } + type C struct{} + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { + out.Bar = in.Foo + return s.Convert(&in.Baz, &out.Baz, 0) + }) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + err = c.RegisterConversionFunc(func(in *B, out *A, s Scope) error { + out.Foo = in.Bar + return s.Convert(&in.Baz, &out.Baz, 0) + }) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + + x := A{"hello, intrepid test reader!", 3} + y := B{} + + err = c.Convert(&x, &y, 0, nil) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + if e, a := x.Foo, y.Bar; e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := x.Baz, y.Baz; e != a { + t.Errorf("expected %v, got %v", e, a) + } + + z := B{"all your test are belong to us", 42} + w := A{} + + err = c.Convert(&z, &w, 0, nil) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + if e, a := z.Bar, w.Foo; e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := z.Baz, w.Baz; e != a { + t.Errorf("expected %v, got %v", e, a) + } + + err = c.RegisterConversionFunc(func(in *A, out *C, s Scope) error { + return fmt.Errorf("C can't store an A, silly") + }) + if err != nil { + t.Fatalf("unexpected error %v", err) + } + err = c.Convert(&A{}, &C{}, 0, nil) + if err == nil { + t.Errorf("unexpected non-error") + } +} + +func TestConverter_IgnoredConversion(t *testing.T) { + type A struct{} + type B struct{} + + count := 0 + c := NewConverter(DefaultNameFunc) + if err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { + count++ + return nil + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + if err := c.RegisterIgnoredConversion(&A{}, &B{}); err != nil { + t.Fatal(err) + } + a := A{} + b := B{} + if err := c.Convert(&a, &b, 0, nil); err != nil { + t.Errorf("%v", err) + } + if count != 0 { + t.Errorf("unexpected number of conversion invocations") + } +} + +func TestConverter_IgnoredConversionNested(t *testing.T) { + type C string + type A struct { + C C + } + type B struct { + C C + } + + c := NewConverter(DefaultNameFunc) + typed := C("") + if err := c.RegisterIgnoredConversion(&typed, &typed); err != nil { + t.Fatal(err) + } + a := A{C: C("test")} + b := B{C: C("other")} + if err := c.Convert(&a, &b, AllowDifferentFieldTypeNames, nil); err != nil { + t.Errorf("%v", err) + } + if b.C != C("other") { + t.Errorf("expected no conversion of field C: %#v", b) + } +} + +func TestConverter_GeneratedConversionOverriden(t *testing.T) { + type A struct{} + type B struct{} + c := NewConverter(DefaultNameFunc) + if err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { + return nil + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + if err := c.RegisterGeneratedConversionFunc(func(in *A, out *B, s Scope) error { + return fmt.Errorf("generated function should be overridden") + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + + a := A{} + b := B{} + if err := c.Convert(&a, &b, 0, nil); err != nil { + t.Errorf("%v", err) + } +} + +func TestConverter_WithConversionOverriden(t *testing.T) { + type A struct{} + type B struct{} + c := NewConverter(DefaultNameFunc) + if err := c.RegisterConversionFunc(func(in *A, out *B, s Scope) error { + return fmt.Errorf("conversion function should be overridden") + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + if err := c.RegisterGeneratedConversionFunc(func(in *A, out *B, s Scope) error { + return fmt.Errorf("generated function should be overridden") + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + + ext := NewConversionFuncs() + ext.Add(func(in *A, out *B, s Scope) error { + return nil + }) + newc := c.WithConversions(ext) + + a := A{} + b := B{} + if err := c.Convert(&a, &b, 0, nil); err == nil || err.Error() != "conversion function should be overridden" { + t.Errorf("unexpected error: %v", err) + } + if err := newc.Convert(&a, &b, 0, nil); err != nil { + t.Errorf("%v", err) + } +} + +func TestConverter_MapsStringArrays(t *testing.T) { + type A struct { + Foo string + Baz int + Other string + } + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + if err := c.RegisterConversionFunc(func(input *[]string, out *string, s Scope) error { + if len(*input) == 0 { + *out = "" + } + *out = (*input)[0] + return nil + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + + x := map[string][]string{ + "Foo": {"bar"}, + "Baz": {"1"}, + "Other": {"", "test"}, + "other": {"wrong"}, + } + y := A{"test", 2, "something"} + + if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames, nil); err == nil { + t.Error("unexpected non-error") + } + + if err := c.RegisterConversionFunc(func(input *[]string, out *int, s Scope) error { + if len(*input) == 0 { + *out = 0 + } + str := (*input)[0] + i, err := strconv.Atoi(str) + if err != nil { + return err + } + *out = i + return nil + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + + if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames, nil); err != nil { + t.Fatalf("unexpected error %v", err) + } + if !reflect.DeepEqual(y, A{"bar", 1, ""}) { + t.Errorf("unexpected result: %#v", y) + } +} + +func TestConverter_MapsStringArraysWithMappingKey(t *testing.T) { + type A struct { + Foo string `json:"test"` + Baz int + Other string + } + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + if err := c.RegisterConversionFunc(func(input *[]string, out *string, s Scope) error { + if len(*input) == 0 { + *out = "" + } + *out = (*input)[0] + return nil + }); err != nil { + t.Fatalf("unexpected error %v", err) + } + + x := map[string][]string{ + "Foo": {"bar"}, + "test": {"baz"}, + } + y := A{"", 0, ""} + + if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames|IgnoreMissingFields, &Meta{}); err != nil { + t.Fatalf("unexpected error %v", err) + } + if !reflect.DeepEqual(y, A{"bar", 0, ""}) { + t.Errorf("unexpected result: %#v", y) + } + + mapping := func(key string, sourceTag, destTag reflect.StructTag) (source string, dest string) { + if s := destTag.Get("json"); len(s) > 0 { + return strings.SplitN(s, ",", 2)[0], key + } + return key, key + } + + if err := c.Convert(&x, &y, AllowDifferentFieldTypeNames|IgnoreMissingFields, &Meta{KeyNameMapping: mapping}); err != nil { + t.Fatalf("unexpected error %v", err) + } + if !reflect.DeepEqual(y, A{"baz", 0, ""}) { + t.Errorf("unexpected result: %#v", y) + } +} + +func TestConverter_fuzz(t *testing.T) { + // Use the same types from the scheme test. + table := []struct { + from, to, check interface{} + }{ + {&TestType1{}, &ExternalTestType1{}, &TestType1{}}, + {&ExternalTestType1{}, &TestType1{}, &ExternalTestType1{}}, + } + + f := fuzz.New().NilChance(.5).NumElements(0, 100) + c := NewConverter(DefaultNameFunc) + c.nameFunc = func(t reflect.Type) string { + // Hide the fact that we don't have separate packages for these things. + return map[reflect.Type]string{ + reflect.TypeOf(TestType1{}): "TestType1", + reflect.TypeOf(ExternalTestType1{}): "TestType1", + reflect.TypeOf(TestType2{}): "TestType2", + reflect.TypeOf(ExternalTestType2{}): "TestType2", + }[t] + } + c.Debug = testLogger(t) + + for i, item := range table { + for j := 0; j < *fuzzIters; j++ { + f.Fuzz(item.from) + err := c.Convert(item.from, item.to, 0, nil) + if err != nil { + t.Errorf("(%v, %v): unexpected error: %v", i, j, err) + continue + } + err = c.Convert(item.to, item.check, 0, nil) + if err != nil { + t.Errorf("(%v, %v): unexpected error: %v", i, j, err) + continue + } + if e, a := item.from, item.check; !reflect.DeepEqual(e, a) { + t.Errorf("(%v, %v): unexpected diff: %v", i, j, diff.ObjectDiff(e, a)) + } + } + } +} + +func TestConverter_MapElemAddr(t *testing.T) { + type Foo struct { + A map[int]int + } + type Bar struct { + A map[string]string + } + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + err := c.RegisterConversionFunc( + func(in *int, out *string, s Scope) error { + *out = fmt.Sprintf("%v", *in) + return nil + }, + ) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + err = c.RegisterConversionFunc( + func(in *string, out *int, s Scope) error { + if str, err := strconv.Atoi(*in); err != nil { + return err + } else { + *out = str + return nil + } + }, + ) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + f := fuzz.New().NilChance(0).NumElements(3, 3) + first := Foo{} + second := Bar{} + f.Fuzz(&first) + err = c.Convert(&first, &second, AllowDifferentFieldTypeNames, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + third := Foo{} + err = c.Convert(&second, &third, AllowDifferentFieldTypeNames, nil) + if e, a := first, third; !reflect.DeepEqual(e, a) { + t.Errorf("Unexpected diff: %v", diff.ObjectDiff(e, a)) + } +} + +func TestConverter_tags(t *testing.T) { + type Foo struct { + A string `test:"foo"` + } + type Bar struct { + A string `test:"bar"` + } + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + err := c.RegisterConversionFunc( + func(in *string, out *string, s Scope) error { + if e, a := "foo", s.SrcTag().Get("test"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := "bar", s.DestTag().Get("test"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + return nil + }, + ) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + err = c.Convert(&Foo{}, &Bar{}, AllowDifferentFieldTypeNames, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } +} + +func TestConverter_meta(t *testing.T) { + type Foo struct{ A string } + type Bar struct{ A string } + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + checks := 0 + err := c.RegisterConversionFunc( + func(in *Foo, out *Bar, s Scope) error { + if s.Meta() == nil { + t.Errorf("Meta did not get passed!") + } + checks++ + s.Convert(&in.A, &out.A, 0) + return nil + }, + ) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + err = c.RegisterConversionFunc( + func(in *string, out *string, s Scope) error { + if s.Meta() == nil { + t.Errorf("Meta did not get passed a second time!") + } + checks++ + return nil + }, + ) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + err = c.Convert(&Foo{}, &Bar{}, 0, &Meta{}) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if checks != 2 { + t.Errorf("Registered functions did not get called.") + } +} + +func TestConverter_flags(t *testing.T) { + type Foo struct{ A string } + type Bar struct{ A string } + table := []struct { + from, to interface{} + flags FieldMatchingFlags + shouldSucceed bool + }{ + // Check that DestFromSource allows extra fields only in source. + { + from: &struct{ A string }{}, + to: &struct{ A, B string }{}, + flags: DestFromSource, + shouldSucceed: false, + }, { + from: &struct{ A, B string }{}, + to: &struct{ A string }{}, + flags: DestFromSource, + shouldSucceed: true, + }, + + // Check that SourceToDest allows for extra fields only in dest. + { + from: &struct{ A string }{}, + to: &struct{ A, B string }{}, + flags: SourceToDest, + shouldSucceed: true, + }, { + from: &struct{ A, B string }{}, + to: &struct{ A string }{}, + flags: SourceToDest, + shouldSucceed: false, + }, + + // Check that IgnoreMissingFields makes the above failure cases pass. + { + from: &struct{ A string }{}, + to: &struct{ A, B string }{}, + flags: DestFromSource | IgnoreMissingFields, + shouldSucceed: true, + }, { + from: &struct{ A, B string }{}, + to: &struct{ A string }{}, + flags: SourceToDest | IgnoreMissingFields, + shouldSucceed: true, + }, + + // Check that the field type name must match unless + // AllowDifferentFieldTypeNames is specified. + { + from: &struct{ A, B Foo }{}, + to: &struct{ A Bar }{}, + flags: DestFromSource, + shouldSucceed: false, + }, { + from: &struct{ A Foo }{}, + to: &struct{ A, B Bar }{}, + flags: SourceToDest, + shouldSucceed: false, + }, { + from: &struct{ A, B Foo }{}, + to: &struct{ A Bar }{}, + flags: DestFromSource | AllowDifferentFieldTypeNames, + shouldSucceed: true, + }, { + from: &struct{ A Foo }{}, + to: &struct{ A, B Bar }{}, + flags: SourceToDest | AllowDifferentFieldTypeNames, + shouldSucceed: true, + }, + } + f := fuzz.New().NilChance(.5).NumElements(0, 100) + c := NewConverter(DefaultNameFunc) + c.Debug = testLogger(t) + + for i, item := range table { + for j := 0; j < *fuzzIters; j++ { + f.Fuzz(item.from) + err := c.Convert(item.from, item.to, item.flags, nil) + if item.shouldSucceed && err != nil { + t.Errorf("(%v, %v): unexpected error: %v", i, j, err) + continue + } + if !item.shouldSucceed && err == nil { + t.Errorf("(%v, %v): unexpected non-error", i, j) + continue + } + } + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/healthz/doc.go b/vendor/k8s.io/apimachinery/pkg/conversion/helper_test.go similarity index 58% rename from vendor/k8s.io/apiserver/pkg/server/healthz/doc.go rename to vendor/k8s.io/apimachinery/pkg/conversion/helper_test.go index 06e67f6f..8c61a30a 100644 --- a/vendor/k8s.io/apiserver/pkg/server/healthz/doc.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/helper_test.go @@ -14,8 +14,25 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package healthz implements basic http server health checking. -// Usage: -// import "k8s.io/apiserver/pkg/server/healthz" -// healthz.DefaultHealthz() -package healthz // import "k8s.io/apiserver/pkg/server/healthz" +package conversion + +import "testing" + +func TestInvalidPtrValueKind(t *testing.T) { + var simple interface{} + switch obj := simple.(type) { + default: + _, err := EnforcePtr(obj) + if err == nil { + t.Errorf("Expected error on invalid kind") + } + } +} + +func TestEnforceNilPtr(t *testing.T) { + var nilPtr *struct{} + _, err := EnforcePtr(nilPtr) + if err == nil { + t.Errorf("Expected error on nil pointer") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD index 81bacef7..e9fa8bc6 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD @@ -12,16 +12,17 @@ go_library( "convert.go", "doc.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/conversion/queryparams", importpath = "k8s.io/apimachinery/pkg/conversion/queryparams", ) go_test( - name = "go_default_xtest", + name = "go_default_test", srcs = ["convert_test.go"], + embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go new file mode 100644 index 00000000..1eed5e1f --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go @@ -0,0 +1,219 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 queryparams_test + +import ( + "net/url" + "reflect" + "testing" + "time" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/conversion/queryparams" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +type namedString string +type namedBool bool + +type bar struct { + Float1 float32 `json:"float1"` + Float2 float64 `json:"float2"` + Int1 int64 `json:"int1,omitempty"` + Int2 int32 `json:"int2,omitempty"` + Int3 int16 `json:"int3,omitempty"` + Str1 string `json:"str1,omitempty"` + Ignored int + Ignored2 string +} + +func (obj *bar) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } + +type foo struct { + Str string `json:"str"` + Integer int `json:"integer,omitempty"` + Slice []string `json:"slice,omitempty"` + Boolean bool `json:"boolean,omitempty"` + NamedStr namedString `json:"namedStr,omitempty"` + NamedBool namedBool `json:"namedBool,omitempty"` + Foobar bar `json:"foobar,omitempty"` + Testmap map[string]string `json:"testmap,omitempty"` +} + +func (obj *foo) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } + +type baz struct { + Ptr *int `json:"ptr"` + Bptr *bool `json:"bptr,omitempty"` +} + +func (obj *baz) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } + +// childStructs tests some of the types we serialize to query params for log API calls +// notably, the nested time struct +type childStructs struct { + Container string `json:"container,omitempty"` + Follow bool `json:"follow,omitempty"` + Previous bool `json:"previous,omitempty"` + SinceSeconds *int64 `json:"sinceSeconds,omitempty"` + TailLines *int64 `json:"tailLines,omitempty"` + SinceTime *metav1.Time `json:"sinceTime,omitempty"` + EmptyTime *metav1.Time `json:"emptyTime"` + NonPointerTime metav1.Time `json:"nonPointerTime"` +} + +func (obj *childStructs) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } + +func validateResult(t *testing.T, input interface{}, actual, expected url.Values) { + local := url.Values{} + for k, v := range expected { + local[k] = v + } + for k, v := range actual { + if ev, ok := local[k]; !ok || !reflect.DeepEqual(ev, v) { + if !ok { + t.Errorf("%#v: actual value key %s not found in expected map", input, k) + } else { + t.Errorf("%#v: values don't match: actual: %#v, expected: %#v", input, v, ev) + } + } + delete(local, k) + } + if len(local) > 0 { + t.Errorf("%#v: expected map has keys that were not found in actual map: %#v", input, local) + } +} + +func TestConvert(t *testing.T) { + sinceSeconds := int64(123) + tailLines := int64(0) + sinceTime := metav1.Date(2000, 1, 1, 12, 34, 56, 0, time.UTC) + + tests := []struct { + input interface{} + expected url.Values + }{ + { + input: &foo{ + Str: "hello", + }, + expected: url.Values{"str": {"hello"}}, + }, + { + input: &foo{ + Str: "test string", + Slice: []string{"one", "two", "three"}, + Integer: 234, + Boolean: true, + }, + expected: url.Values{"str": {"test string"}, "slice": {"one", "two", "three"}, "integer": {"234"}, "boolean": {"true"}}, + }, + { + input: &foo{ + Str: "named types", + NamedStr: "value1", + NamedBool: true, + }, + expected: url.Values{"str": {"named types"}, "namedStr": {"value1"}, "namedBool": {"true"}}, + }, + { + input: &foo{ + Str: "don't ignore embedded struct", + Foobar: bar{ + Float1: 5.0, + }, + }, + expected: url.Values{"str": {"don't ignore embedded struct"}, "float1": {"5"}, "float2": {"0"}}, + }, + { + // Ignore untagged fields + input: &bar{ + Float1: 23.5, + Float2: 100.7, + Int1: 1, + Int2: 2, + Int3: 3, + Ignored: 1, + Ignored2: "ignored", + }, + expected: url.Values{"float1": {"23.5"}, "float2": {"100.7"}, "int1": {"1"}, "int2": {"2"}, "int3": {"3"}}, + }, + { + // include fields that are not tagged omitempty + input: &foo{ + NamedStr: "named str", + }, + expected: url.Values{"str": {""}, "namedStr": {"named str"}}, + }, + { + input: &baz{ + Ptr: intp(5), + Bptr: boolp(true), + }, + expected: url.Values{"ptr": {"5"}, "bptr": {"true"}}, + }, + { + input: &baz{ + Bptr: boolp(true), + }, + expected: url.Values{"ptr": {""}, "bptr": {"true"}}, + }, + { + input: &baz{ + Ptr: intp(5), + }, + expected: url.Values{"ptr": {"5"}}, + }, + { + input: &childStructs{ + Container: "mycontainer", + Follow: true, + Previous: true, + SinceSeconds: &sinceSeconds, + TailLines: nil, + SinceTime: &sinceTime, // test a custom marshaller + EmptyTime: nil, // test a nil custom marshaller without omitempty + NonPointerTime: sinceTime, + }, + expected: url.Values{"container": {"mycontainer"}, "follow": {"true"}, "previous": {"true"}, "sinceSeconds": {"123"}, "sinceTime": {"2000-01-01T12:34:56Z"}, "emptyTime": {""}, "nonPointerTime": {"2000-01-01T12:34:56Z"}}, + }, + { + input: &childStructs{ + Container: "mycontainer", + Follow: true, + Previous: true, + SinceSeconds: &sinceSeconds, + TailLines: &tailLines, + SinceTime: nil, // test a nil custom marshaller with omitempty + NonPointerTime: sinceTime, + }, + expected: url.Values{"container": {"mycontainer"}, "follow": {"true"}, "previous": {"true"}, "sinceSeconds": {"123"}, "tailLines": {"0"}, "emptyTime": {""}, "nonPointerTime": {"2000-01-01T12:34:56Z"}}, + }, + } + + for _, test := range tests { + result, err := queryparams.Convert(test.input) + if err != nil { + t.Errorf("Unexpected error while converting %#v: %v", test.input, err) + } + validateResult(t, test.input, result, test.expected) + } +} + +func intp(n int) *int { return &n } + +func boolp(b bool) *bool { return &b } diff --git a/vendor/k8s.io/apimachinery/pkg/fields/BUILD b/vendor/k8s.io/apimachinery/pkg/fields/BUILD index 383448e0..19207bca 100644 --- a/vendor/k8s.io/apimachinery/pkg/fields/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/fields/BUILD @@ -23,8 +23,9 @@ go_library( "requirements.go", "selector.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/fields", importpath = "k8s.io/apimachinery/pkg/fields", - deps = ["//vendor/k8s.io/apimachinery/pkg/selection:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apimachinery/pkg/fields/fields_test.go b/vendor/k8s.io/apimachinery/pkg/fields/fields_test.go new file mode 100644 index 00000000..6965be68 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/fields/fields_test.go @@ -0,0 +1,57 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 fields + +import ( + "testing" +) + +func matches(t *testing.T, ls Set, want string) { + if ls.String() != want { + t.Errorf("Expected '%s', but got '%s'", want, ls.String()) + } +} + +func TestSetString(t *testing.T) { + matches(t, Set{"x": "y"}, "x=y") + matches(t, Set{"foo": "bar"}, "foo=bar") + matches(t, Set{"foo": "bar", "baz": "qup"}, "baz=qup,foo=bar") +} + +func TestFieldHas(t *testing.T) { + fieldHasTests := []struct { + Ls Fields + Key string + Has bool + }{ + {Set{"x": "y"}, "x", true}, + {Set{"x": ""}, "x", true}, + {Set{"x": "y"}, "foo", false}, + } + for _, lh := range fieldHasTests { + if has := lh.Ls.Has(lh.Key); has != lh.Has { + t.Errorf("%#v.Has(%#v) => %v, expected %v", lh.Ls, lh.Key, has, lh.Has) + } + } +} + +func TestFieldGet(t *testing.T) { + ls := Set{"x": "y"} + if ls.Get("x") != "y" { + t.Errorf("Set.Get is broken") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/fields/selector_test.go b/vendor/k8s.io/apimachinery/pkg/fields/selector_test.go new file mode 100644 index 00000000..0aa66935 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/fields/selector_test.go @@ -0,0 +1,397 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 fields + +import ( + "reflect" + "testing" +) + +func TestSplitTerms(t *testing.T) { + testcases := map[string][]string{ + // Simple selectors + `a`: {`a`}, + `a=avalue`: {`a=avalue`}, + `a=avalue,b=bvalue`: {`a=avalue`, `b=bvalue`}, + `a=avalue,b==bvalue,c!=cvalue`: {`a=avalue`, `b==bvalue`, `c!=cvalue`}, + + // Empty terms + ``: nil, + `a=a,`: {`a=a`, ``}, + `,a=a`: {``, `a=a`}, + + // Escaped values + `k=\,,k2=v2`: {`k=\,`, `k2=v2`}, // escaped comma in value + `k=\\,k2=v2`: {`k=\\`, `k2=v2`}, // escaped backslash, unescaped comma + `k=\\\,,k2=v2`: {`k=\\\,`, `k2=v2`}, // escaped backslash and comma + `k=\a\b\`: {`k=\a\b\`}, // non-escape sequences + `k=\`: {`k=\`}, // orphan backslash + + // Multi-byte + `함=수,목=록`: {`함=수`, `목=록`}, + } + + for selector, expectedTerms := range testcases { + if terms := splitTerms(selector); !reflect.DeepEqual(terms, expectedTerms) { + t.Errorf("splitSelectors(`%s`): Expected\n%#v\ngot\n%#v", selector, expectedTerms, terms) + } + } +} + +func TestSplitTerm(t *testing.T) { + testcases := map[string]struct { + lhs string + op string + rhs string + ok bool + }{ + // Simple terms + `a=value`: {lhs: `a`, op: `=`, rhs: `value`, ok: true}, + `b==value`: {lhs: `b`, op: `==`, rhs: `value`, ok: true}, + `c!=value`: {lhs: `c`, op: `!=`, rhs: `value`, ok: true}, + + // Empty or invalid terms + ``: {lhs: ``, op: ``, rhs: ``, ok: false}, + `a`: {lhs: ``, op: ``, rhs: ``, ok: false}, + + // Escaped values + `k=\,`: {lhs: `k`, op: `=`, rhs: `\,`, ok: true}, + `k=\=`: {lhs: `k`, op: `=`, rhs: `\=`, ok: true}, + `k=\\\a\b\=\,\`: {lhs: `k`, op: `=`, rhs: `\\\a\b\=\,\`, ok: true}, + + // Multi-byte + `함=수`: {lhs: `함`, op: `=`, rhs: `수`, ok: true}, + } + + for term, expected := range testcases { + lhs, op, rhs, ok := splitTerm(term) + if lhs != expected.lhs || op != expected.op || rhs != expected.rhs || ok != expected.ok { + t.Errorf( + "splitTerm(`%s`): Expected\n%s,%s,%s,%v\nGot\n%s,%s,%s,%v", + term, + expected.lhs, expected.op, expected.rhs, expected.ok, + lhs, op, rhs, ok, + ) + } + } +} + +func TestEscapeValue(t *testing.T) { + // map values to their normalized escaped values + testcases := map[string]string{ + ``: ``, + `a`: `a`, + `=`: `\=`, + `,`: `\,`, + `\`: `\\`, + `\=\,\`: `\\\=\\\,\\`, + } + + for unescapedValue, escapedValue := range testcases { + actualEscaped := EscapeValue(unescapedValue) + if actualEscaped != escapedValue { + t.Errorf("EscapeValue(%s): expected %s, got %s", unescapedValue, escapedValue, actualEscaped) + } + + actualUnescaped, err := UnescapeValue(escapedValue) + if err != nil { + t.Errorf("UnescapeValue(%s): unexpected error %v", escapedValue, err) + } + if actualUnescaped != unescapedValue { + t.Errorf("UnescapeValue(%s): expected %s, got %s", escapedValue, unescapedValue, actualUnescaped) + } + } + + // test invalid escape sequences + invalidTestcases := []string{ + `\`, // orphan slash is invalid + `\\\`, // orphan slash is invalid + `\a`, // unrecognized escape sequence is invalid + } + for _, invalidValue := range invalidTestcases { + _, err := UnescapeValue(invalidValue) + if _, ok := err.(InvalidEscapeSequence); !ok || err == nil { + t.Errorf("UnescapeValue(%s): expected invalid escape sequence error, got %#v", invalidValue, err) + } + } +} + +func TestSelectorParse(t *testing.T) { + testGoodStrings := []string{ + "x=a,y=b,z=c", + "", + "x!=a,y=b", + `x=a||y\=b`, + `x=a\=\=b`, + } + testBadStrings := []string{ + "x=a||y=b", + "x==a==b", + "x=a,b", + "x in (a)", + "x in (a,b,c)", + "x", + } + for _, test := range testGoodStrings { + lq, err := ParseSelector(test) + if err != nil { + t.Errorf("%v: error %v (%#v)\n", test, err, err) + } + if test != lq.String() { + t.Errorf("%v restring gave: %v\n", test, lq.String()) + } + } + for _, test := range testBadStrings { + _, err := ParseSelector(test) + if err == nil { + t.Errorf("%v: did not get expected error\n", test) + } + } +} + +func TestDeterministicParse(t *testing.T) { + s1, err := ParseSelector("x=a,a=x") + s2, err2 := ParseSelector("a=x,x=a") + if err != nil || err2 != nil { + t.Errorf("Unexpected parse error") + } + if s1.String() != s2.String() { + t.Errorf("Non-deterministic parse") + } +} + +func expectMatch(t *testing.T, selector string, ls Set) { + lq, err := ParseSelector(selector) + if err != nil { + t.Errorf("Unable to parse %v as a selector\n", selector) + return + } + if !lq.Matches(ls) { + t.Errorf("Wanted %s to match '%s', but it did not.\n", selector, ls) + } +} + +func expectNoMatch(t *testing.T, selector string, ls Set) { + lq, err := ParseSelector(selector) + if err != nil { + t.Errorf("Unable to parse %v as a selector\n", selector) + return + } + if lq.Matches(ls) { + t.Errorf("Wanted '%s' to not match '%s', but it did.", selector, ls) + } +} + +func TestEverything(t *testing.T) { + if !Everything().Matches(Set{"x": "y"}) { + t.Errorf("Nil selector didn't match") + } + if !Everything().Empty() { + t.Errorf("Everything was not empty") + } +} + +func TestSelectorMatches(t *testing.T) { + expectMatch(t, "", Set{"x": "y"}) + expectMatch(t, "x=y", Set{"x": "y"}) + expectMatch(t, "x=y,z=w", Set{"x": "y", "z": "w"}) + expectMatch(t, "x!=y,z!=w", Set{"x": "z", "z": "a"}) + expectMatch(t, "notin=in", Set{"notin": "in"}) // in and notin in exactMatch + expectNoMatch(t, "x=y", Set{"x": "z"}) + expectNoMatch(t, "x=y,z=w", Set{"x": "w", "z": "w"}) + expectNoMatch(t, "x!=y,z!=w", Set{"x": "z", "z": "w"}) + + fieldset := Set{ + "foo": "bar", + "baz": "blah", + "complex": `=value\,\`, + } + expectMatch(t, "foo=bar", fieldset) + expectMatch(t, "baz=blah", fieldset) + expectMatch(t, "foo=bar,baz=blah", fieldset) + expectMatch(t, `foo=bar,baz=blah,complex=\=value\\\,\\`, fieldset) + expectNoMatch(t, "foo=blah", fieldset) + expectNoMatch(t, "baz=bar", fieldset) + expectNoMatch(t, "foo=bar,foobar=bar,baz=blah", fieldset) +} + +func TestOneTermEqualSelector(t *testing.T) { + if !OneTermEqualSelector("x", "y").Matches(Set{"x": "y"}) { + t.Errorf("No match when match expected.") + } + if OneTermEqualSelector("x", "y").Matches(Set{"x": "z"}) { + t.Errorf("Match when none expected.") + } +} + +func expectMatchDirect(t *testing.T, selector, ls Set) { + if !SelectorFromSet(selector).Matches(ls) { + t.Errorf("Wanted %s to match '%s', but it did not.\n", selector, ls) + } +} + +func expectNoMatchDirect(t *testing.T, selector, ls Set) { + if SelectorFromSet(selector).Matches(ls) { + t.Errorf("Wanted '%s' to not match '%s', but it did.", selector, ls) + } +} + +func TestSetMatches(t *testing.T) { + labelset := Set{ + "foo": "bar", + "baz": "blah", + } + expectMatchDirect(t, Set{}, labelset) + expectMatchDirect(t, Set{"foo": "bar"}, labelset) + expectMatchDirect(t, Set{"baz": "blah"}, labelset) + expectMatchDirect(t, Set{"foo": "bar", "baz": "blah"}, labelset) + expectNoMatchDirect(t, Set{"foo": "=blah"}, labelset) + expectNoMatchDirect(t, Set{"baz": "=bar"}, labelset) + expectNoMatchDirect(t, Set{"foo": "=bar", "foobar": "bar", "baz": "blah"}, labelset) +} + +func TestNilMapIsValid(t *testing.T) { + selector := Set(nil).AsSelector() + if selector == nil { + t.Errorf("Selector for nil set should be Everything") + } + if !selector.Empty() { + t.Errorf("Selector for nil set should be Empty") + } +} + +func TestSetIsEmpty(t *testing.T) { + if !(Set{}).AsSelector().Empty() { + t.Errorf("Empty set should be empty") + } + if !(andTerm(nil)).Empty() { + t.Errorf("Nil andTerm should be empty") + } + if (&hasTerm{}).Empty() { + t.Errorf("hasTerm should not be empty") + } + if (¬HasTerm{}).Empty() { + t.Errorf("notHasTerm should not be empty") + } + if !(andTerm{andTerm{}}).Empty() { + t.Errorf("Nested andTerm should be empty") + } + if (andTerm{&hasTerm{"a", "b"}}).Empty() { + t.Errorf("Nested andTerm should not be empty") + } +} + +func TestRequiresExactMatch(t *testing.T) { + testCases := map[string]struct { + S Selector + Label string + Value string + Found bool + }{ + "empty set": {Set{}.AsSelector(), "test", "", false}, + "empty hasTerm": {&hasTerm{}, "test", "", false}, + "skipped hasTerm": {&hasTerm{"a", "b"}, "test", "", false}, + "valid hasTerm": {&hasTerm{"test", "b"}, "test", "b", true}, + "valid hasTerm no value": {&hasTerm{"test", ""}, "test", "", true}, + "valid notHasTerm": {¬HasTerm{"test", "b"}, "test", "", false}, + "valid notHasTerm no value": {¬HasTerm{"test", ""}, "test", "", false}, + "nil andTerm": {andTerm(nil), "test", "", false}, + "empty andTerm": {andTerm{}, "test", "", false}, + "nested andTerm": {andTerm{andTerm{}}, "test", "", false}, + "nested andTerm matches": {andTerm{&hasTerm{"test", "b"}}, "test", "b", true}, + "andTerm with non-match": {andTerm{&hasTerm{}, &hasTerm{"test", "b"}}, "test", "b", true}, + } + for k, v := range testCases { + value, found := v.S.RequiresExactMatch(v.Label) + if value != v.Value { + t.Errorf("%s: expected value %s, got %s", k, v.Value, value) + } + if found != v.Found { + t.Errorf("%s: expected found %t, got %t", k, v.Found, found) + } + } +} + +func TestTransform(t *testing.T) { + testCases := []struct { + name string + selector string + transform func(field, value string) (string, string, error) + result string + isEmpty bool + }{ + { + name: "empty selector", + selector: "", + transform: func(field, value string) (string, string, error) { return field, value, nil }, + result: "", + isEmpty: true, + }, + { + name: "no-op transform", + selector: "a=b,c=d", + transform: func(field, value string) (string, string, error) { return field, value, nil }, + result: "a=b,c=d", + isEmpty: false, + }, + { + name: "transform one field", + selector: "a=b,c=d", + transform: func(field, value string) (string, string, error) { + if field == "a" { + return "e", "f", nil + } + return field, value, nil + }, + result: "e=f,c=d", + isEmpty: false, + }, + { + name: "remove field to make empty", + selector: "a=b", + transform: func(field, value string) (string, string, error) { return "", "", nil }, + result: "", + isEmpty: true, + }, + { + name: "remove only one field", + selector: "a=b,c=d,e=f", + transform: func(field, value string) (string, string, error) { + if field == "c" { + return "", "", nil + } + return field, value, nil + }, + result: "a=b,e=f", + isEmpty: false, + }, + } + + for i, tc := range testCases { + result, err := ParseAndTransformSelector(tc.selector, tc.transform) + if err != nil { + t.Errorf("[%d] unexpected error during Transform: %v", i, err) + } + if result.Empty() != tc.isEmpty { + t.Errorf("[%d] expected empty: %t, got: %t", i, tc.isEmpty, result.Empty()) + } + if result.String() != tc.result { + t.Errorf("[%d] unexpected result: %s", i, result.String()) + } + } + +} diff --git a/vendor/k8s.io/apimachinery/pkg/labels/BUILD b/vendor/k8s.io/apimachinery/pkg/labels/BUILD index a78764f7..14666aec 100644 --- a/vendor/k8s.io/apimachinery/pkg/labels/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/labels/BUILD @@ -14,8 +14,8 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) @@ -27,12 +27,13 @@ go_library( "selector.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/labels", importpath = "k8s.io/apimachinery/pkg/labels", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/labels/labels_test.go b/vendor/k8s.io/apimachinery/pkg/labels/labels_test.go new file mode 100644 index 00000000..2d4d761b --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/labels/labels_test.go @@ -0,0 +1,231 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 labels + +import ( + "testing" +) + +func matches(t *testing.T, ls Set, want string) { + if ls.String() != want { + t.Errorf("Expected '%s', but got '%s'", want, ls.String()) + } +} + +func TestSetString(t *testing.T) { + matches(t, Set{"x": "y"}, "x=y") + matches(t, Set{"foo": "bar"}, "foo=bar") + matches(t, Set{"foo": "bar", "baz": "qup"}, "baz=qup,foo=bar") + + // TODO: Make our label representation robust enough to handle labels + // with ",=!" characters in their names. +} + +func TestLabelHas(t *testing.T) { + labelHasTests := []struct { + Ls Labels + Key string + Has bool + }{ + {Set{"x": "y"}, "x", true}, + {Set{"x": ""}, "x", true}, + {Set{"x": "y"}, "foo", false}, + } + for _, lh := range labelHasTests { + if has := lh.Ls.Has(lh.Key); has != lh.Has { + t.Errorf("%#v.Has(%#v) => %v, expected %v", lh.Ls, lh.Key, has, lh.Has) + } + } +} + +func TestLabelGet(t *testing.T) { + ls := Set{"x": "y"} + if ls.Get("x") != "y" { + t.Errorf("Set.Get is broken") + } +} + +func TestLabelConflict(t *testing.T) { + tests := []struct { + labels1 map[string]string + labels2 map[string]string + conflict bool + }{ + { + labels1: map[string]string{}, + labels2: map[string]string{}, + conflict: false, + }, + { + labels1: map[string]string{"env": "test"}, + labels2: map[string]string{"infra": "true"}, + conflict: false, + }, + { + labels1: map[string]string{"env": "test"}, + labels2: map[string]string{"infra": "true", "env": "test"}, + conflict: false, + }, + { + labels1: map[string]string{"env": "test"}, + labels2: map[string]string{"env": "dev"}, + conflict: true, + }, + { + labels1: map[string]string{"env": "test", "infra": "false"}, + labels2: map[string]string{"infra": "true", "color": "blue"}, + conflict: true, + }, + } + for _, test := range tests { + conflict := Conflicts(Set(test.labels1), Set(test.labels2)) + if conflict != test.conflict { + t.Errorf("expected: %v but got: %v", test.conflict, conflict) + } + } +} + +func TestLabelMerge(t *testing.T) { + tests := []struct { + labels1 map[string]string + labels2 map[string]string + mergedLabels map[string]string + }{ + { + labels1: map[string]string{}, + labels2: map[string]string{}, + mergedLabels: map[string]string{}, + }, + { + labels1: map[string]string{"infra": "true"}, + labels2: map[string]string{}, + mergedLabels: map[string]string{"infra": "true"}, + }, + { + labels1: map[string]string{"infra": "true"}, + labels2: map[string]string{"env": "test", "color": "blue"}, + mergedLabels: map[string]string{"infra": "true", "env": "test", "color": "blue"}, + }, + } + for _, test := range tests { + mergedLabels := Merge(Set(test.labels1), Set(test.labels2)) + if !Equals(mergedLabels, test.mergedLabels) { + t.Errorf("expected: %v but got: %v", test.mergedLabels, mergedLabels) + } + } +} + +func TestLabelSelectorParse(t *testing.T) { + tests := []struct { + selector string + labels map[string]string + valid bool + }{ + { + selector: "", + labels: map[string]string{}, + valid: true, + }, + { + selector: "x=a", + labels: map[string]string{"x": "a"}, + valid: true, + }, + { + selector: "x=a,y=b,z=c", + labels: map[string]string{"x": "a", "y": "b", "z": "c"}, + valid: true, + }, + { + selector: " x = a , y = b , z = c ", + labels: map[string]string{"x": "a", "y": "b", "z": "c"}, + valid: true, + }, + { + selector: "color=green,env=test,service=front", + labels: map[string]string{"color": "green", "env": "test", "service": "front"}, + valid: true, + }, + { + selector: "color=green, env=test, service=front", + labels: map[string]string{"color": "green", "env": "test", "service": "front"}, + valid: true, + }, + { + selector: ",", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x,y", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x=$y", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x!=y", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x==y", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x=a||y=b", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x in (y)", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x notin (y)", + labels: map[string]string{}, + valid: false, + }, + { + selector: "x y", + labels: map[string]string{}, + valid: false, + }, + } + for _, test := range tests { + labels, err := ConvertSelectorToLabelsMap(test.selector) + if test.valid && err != nil { + t.Errorf("selector: %s, expected no error but got: %s", test.selector, err) + } else if !test.valid && err == nil { + t.Errorf("selector: %s, expected an error", test.selector) + } + + if !Equals(Set(labels), test.labels) { + t.Errorf("expected: %s but got: %s", test.labels, labels) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/labels/selector.go b/vendor/k8s.io/apimachinery/pkg/labels/selector.go index b301b428..374d2ef1 100644 --- a/vendor/k8s.io/apimachinery/pkg/labels/selector.go +++ b/vendor/k8s.io/apimachinery/pkg/labels/selector.go @@ -166,7 +166,6 @@ func NewRequirement(key string, op selection.Operator, vals []string) (*Requirem return nil, err } } - sort.Strings(vals) return &Requirement{key: key, operator: op, strValues: vals}, nil } @@ -299,7 +298,9 @@ func (r *Requirement) String() string { if len(r.strValues) == 1 { buffer.WriteString(r.strValues[0]) } else { // only > 1 since == 0 prohibited by NewRequirement - buffer.WriteString(strings.Join(r.strValues, ",")) + // normalizes value order on output, without mutating the in-memory selector representation + // also avoids normalization when it is not required, and ensures we do not mutate shared data + buffer.WriteString(strings.Join(safeSort(r.strValues), ",")) } switch r.operator { @@ -309,6 +310,17 @@ func (r *Requirement) String() string { return buffer.String() } +// safeSort sort input strings without modification +func safeSort(in []string) []string { + if sort.StringsAreSorted(in) { + return in + } + out := make([]string, len(in)) + copy(out, in) + sort.Strings(out) + return out +} + // Add adds requirements to the selector. It copies the current selector returning a new one func (lsel internalSelector) Add(reqs ...Requirement) Selector { var sel internalSelector diff --git a/vendor/k8s.io/apimachinery/pkg/labels/selector_test.go b/vendor/k8s.io/apimachinery/pkg/labels/selector_test.go new file mode 100644 index 00000000..a2702989 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/labels/selector_test.go @@ -0,0 +1,619 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 labels + +import ( + "reflect" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/selection" + "k8s.io/apimachinery/pkg/util/sets" +) + +func TestSelectorParse(t *testing.T) { + testGoodStrings := []string{ + "x=a,y=b,z=c", + "", + "x!=a,y=b", + "x=", + "x= ", + "x=,z= ", + "x= ,z= ", + "!x", + "x>1", + "x>1,z<5", + } + testBadStrings := []string{ + "x=a||y=b", + "x==a==b", + "!x=a", + "x1", Set{"x": "2"}) + expectMatch(t, "x<1", Set{"x": "0"}) + expectNoMatch(t, "x=z", Set{}) + expectNoMatch(t, "x=y", Set{"x": "z"}) + expectNoMatch(t, "x=y,z=w", Set{"x": "w", "z": "w"}) + expectNoMatch(t, "x!=y,z!=w", Set{"x": "z", "z": "w"}) + expectNoMatch(t, "x", Set{"y": "z"}) + expectNoMatch(t, "!x", Set{"x": "z"}) + expectNoMatch(t, "x>1", Set{"x": "0"}) + expectNoMatch(t, "x<1", Set{"x": "2"}) + + labelset := Set{ + "foo": "bar", + "baz": "blah", + } + expectMatch(t, "foo=bar", labelset) + expectMatch(t, "baz=blah", labelset) + expectMatch(t, "foo=bar,baz=blah", labelset) + expectNoMatch(t, "foo=blah", labelset) + expectNoMatch(t, "baz=bar", labelset) + expectNoMatch(t, "foo=bar,foobar=bar,baz=blah", labelset) +} + +func expectMatchDirect(t *testing.T, selector, ls Set) { + if !SelectorFromSet(selector).Matches(ls) { + t.Errorf("Wanted %s to match '%s', but it did not.\n", selector, ls) + } +} + +func expectNoMatchDirect(t *testing.T, selector, ls Set) { + if SelectorFromSet(selector).Matches(ls) { + t.Errorf("Wanted '%s' to not match '%s', but it did.", selector, ls) + } +} + +func TestSetMatches(t *testing.T) { + labelset := Set{ + "foo": "bar", + "baz": "blah", + } + expectMatchDirect(t, Set{}, labelset) + expectMatchDirect(t, Set{"foo": "bar"}, labelset) + expectMatchDirect(t, Set{"baz": "blah"}, labelset) + expectMatchDirect(t, Set{"foo": "bar", "baz": "blah"}, labelset) + + //TODO: bad values not handled for the moment in SelectorFromSet + //expectNoMatchDirect(t, Set{"foo": "=blah"}, labelset) + //expectNoMatchDirect(t, Set{"baz": "=bar"}, labelset) + //expectNoMatchDirect(t, Set{"foo": "=bar", "foobar": "bar", "baz": "blah"}, labelset) +} + +func TestNilMapIsValid(t *testing.T) { + selector := Set(nil).AsSelector() + if selector == nil { + t.Errorf("Selector for nil set should be Everything") + } + if !selector.Empty() { + t.Errorf("Selector for nil set should be Empty") + } +} + +func TestSetIsEmpty(t *testing.T) { + if !(Set{}).AsSelector().Empty() { + t.Errorf("Empty set should be empty") + } + if !(NewSelector()).Empty() { + t.Errorf("Nil Selector should be empty") + } +} + +func TestLexer(t *testing.T) { + testcases := []struct { + s string + t Token + }{ + {"", EndOfStringToken}, + {",", CommaToken}, + {"notin", NotInToken}, + {"in", InToken}, + {"=", EqualsToken}, + {"==", DoubleEqualsToken}, + {">", GreaterThanToken}, + {"<", LessThanToken}, + //Note that Lex returns the longest valid token found + {"!", DoesNotExistToken}, + {"!=", NotEqualsToken}, + {"(", OpenParToken}, + {")", ClosedParToken}, + //Non-"special" characters are considered part of an identifier + {"~", IdentifierToken}, + {"||", IdentifierToken}, + } + for _, v := range testcases { + l := &Lexer{s: v.s, pos: 0} + token, lit := l.Lex() + if token != v.t { + t.Errorf("Got %d it should be %d for '%s'", token, v.t, v.s) + } + if v.t != ErrorToken && lit != v.s { + t.Errorf("Got '%s' it should be '%s'", lit, v.s) + } + } +} + +func min(l, r int) (m int) { + m = r + if l < r { + m = l + } + return m +} + +func TestLexerSequence(t *testing.T) { + testcases := []struct { + s string + t []Token + }{ + {"key in ( value )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, ClosedParToken}}, + {"key notin ( value )", []Token{IdentifierToken, NotInToken, OpenParToken, IdentifierToken, ClosedParToken}}, + {"key in ( value1, value2 )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, CommaToken, IdentifierToken, ClosedParToken}}, + {"key", []Token{IdentifierToken}}, + {"!key", []Token{DoesNotExistToken, IdentifierToken}}, + {"()", []Token{OpenParToken, ClosedParToken}}, + {"x in (),y", []Token{IdentifierToken, InToken, OpenParToken, ClosedParToken, CommaToken, IdentifierToken}}, + {"== != (), = notin", []Token{DoubleEqualsToken, NotEqualsToken, OpenParToken, ClosedParToken, CommaToken, EqualsToken, NotInToken}}, + {"key>2", []Token{IdentifierToken, GreaterThanToken, IdentifierToken}}, + {"key<1", []Token{IdentifierToken, LessThanToken, IdentifierToken}}, + } + for _, v := range testcases { + var literals []string + var tokens []Token + l := &Lexer{s: v.s, pos: 0} + for { + token, lit := l.Lex() + if token == EndOfStringToken { + break + } + tokens = append(tokens, token) + literals = append(literals, lit) + } + if len(tokens) != len(v.t) { + t.Errorf("Bad number of tokens for '%s %d, %d", v.s, len(tokens), len(v.t)) + } + for i := 0; i < min(len(tokens), len(v.t)); i++ { + if tokens[i] != v.t[i] { + t.Errorf("Test '%s': Mismatching in token type found '%v' it should be '%v'", v.s, tokens[i], v.t[i]) + } + } + } +} +func TestParserLookahead(t *testing.T) { + testcases := []struct { + s string + t []Token + }{ + {"key in ( value )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, ClosedParToken, EndOfStringToken}}, + {"key notin ( value )", []Token{IdentifierToken, NotInToken, OpenParToken, IdentifierToken, ClosedParToken, EndOfStringToken}}, + {"key in ( value1, value2 )", []Token{IdentifierToken, InToken, OpenParToken, IdentifierToken, CommaToken, IdentifierToken, ClosedParToken, EndOfStringToken}}, + {"key", []Token{IdentifierToken, EndOfStringToken}}, + {"!key", []Token{DoesNotExistToken, IdentifierToken, EndOfStringToken}}, + {"()", []Token{OpenParToken, ClosedParToken, EndOfStringToken}}, + {"", []Token{EndOfStringToken}}, + {"x in (),y", []Token{IdentifierToken, InToken, OpenParToken, ClosedParToken, CommaToken, IdentifierToken, EndOfStringToken}}, + {"== != (), = notin", []Token{DoubleEqualsToken, NotEqualsToken, OpenParToken, ClosedParToken, CommaToken, EqualsToken, NotInToken, EndOfStringToken}}, + {"key>2", []Token{IdentifierToken, GreaterThanToken, IdentifierToken, EndOfStringToken}}, + {"key<1", []Token{IdentifierToken, LessThanToken, IdentifierToken, EndOfStringToken}}, + } + for _, v := range testcases { + p := &Parser{l: &Lexer{s: v.s, pos: 0}, position: 0} + p.scan() + if len(p.scannedItems) != len(v.t) { + t.Errorf("Expected %d items found %d", len(v.t), len(p.scannedItems)) + } + for { + token, lit := p.lookahead(KeyAndOperator) + + token2, lit2 := p.consume(KeyAndOperator) + if token == EndOfStringToken { + break + } + if token != token2 || lit != lit2 { + t.Errorf("Bad values") + } + } + } +} + +func TestRequirementConstructor(t *testing.T) { + requirementConstructorTests := []struct { + Key string + Op selection.Operator + Vals sets.String + Success bool + }{ + {"x", selection.In, nil, false}, + {"x", selection.NotIn, sets.NewString(), false}, + {"x", selection.In, sets.NewString("foo"), true}, + {"x", selection.NotIn, sets.NewString("foo"), true}, + {"x", selection.Exists, nil, true}, + {"x", selection.DoesNotExist, nil, true}, + {"1foo", selection.In, sets.NewString("bar"), true}, + {"1234", selection.In, sets.NewString("bar"), true}, + {"y", selection.GreaterThan, sets.NewString("1"), true}, + {"z", selection.LessThan, sets.NewString("6"), true}, + {"foo", selection.GreaterThan, sets.NewString("bar"), false}, + {"barz", selection.LessThan, sets.NewString("blah"), false}, + {strings.Repeat("a", 254), selection.Exists, nil, false}, //breaks DNS rule that len(key) <= 253 + } + for _, rc := range requirementConstructorTests { + if _, err := NewRequirement(rc.Key, rc.Op, rc.Vals.List()); err == nil && !rc.Success { + t.Errorf("expected error with key:%#v op:%v vals:%v, got no error", rc.Key, rc.Op, rc.Vals) + } else if err != nil && rc.Success { + t.Errorf("expected no error with key:%#v op:%v vals:%v, got:%v", rc.Key, rc.Op, rc.Vals, err) + } + } +} + +func TestToString(t *testing.T) { + var req Requirement + toStringTests := []struct { + In *internalSelector + Out string + Valid bool + }{ + + {&internalSelector{ + getRequirement("x", selection.In, sets.NewString("abc", "def"), t), + getRequirement("y", selection.NotIn, sets.NewString("jkl"), t), + getRequirement("z", selection.Exists, nil, t)}, + "x in (abc,def),y notin (jkl),z", true}, + {&internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString("abc", "def"), t), + getRequirement("y", selection.NotEquals, sets.NewString("jkl"), t), + getRequirement("z", selection.DoesNotExist, nil, t)}, + "x notin (abc,def),y!=jkl,!z", true}, + {&internalSelector{ + getRequirement("x", selection.In, sets.NewString("abc", "def"), t), + req}, // adding empty req for the trailing ',' + "x in (abc,def),", false}, + {&internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString("abc"), t), + getRequirement("y", selection.In, sets.NewString("jkl", "mno"), t), + getRequirement("z", selection.NotIn, sets.NewString(""), t)}, + "x notin (abc),y in (jkl,mno),z notin ()", true}, + {&internalSelector{ + getRequirement("x", selection.Equals, sets.NewString("abc"), t), + getRequirement("y", selection.DoubleEquals, sets.NewString("jkl"), t), + getRequirement("z", selection.NotEquals, sets.NewString("a"), t), + getRequirement("z", selection.Exists, nil, t)}, + "x=abc,y==jkl,z!=a,z", true}, + {&internalSelector{ + getRequirement("x", selection.GreaterThan, sets.NewString("2"), t), + getRequirement("y", selection.LessThan, sets.NewString("8"), t), + getRequirement("z", selection.Exists, nil, t)}, + "x>2,y<8,z", true}, + } + for _, ts := range toStringTests { + if out := ts.In.String(); out == "" && ts.Valid { + t.Errorf("%#v.String() => '%v' expected no error", ts.In, out) + } else if out != ts.Out { + t.Errorf("%#v.String() => '%v' want '%v'", ts.In, out, ts.Out) + } + } +} + +func TestRequirementSelectorMatching(t *testing.T) { + var req Requirement + labelSelectorMatchingTests := []struct { + Set Set + Sel Selector + Match bool + }{ + {Set{"x": "foo", "y": "baz"}, &internalSelector{ + req, + }, false}, + {Set{"x": "foo", "y": "baz"}, &internalSelector{ + getRequirement("x", selection.In, sets.NewString("foo"), t), + getRequirement("y", selection.NotIn, sets.NewString("alpha"), t), + }, true}, + {Set{"x": "foo", "y": "baz"}, &internalSelector{ + getRequirement("x", selection.In, sets.NewString("foo"), t), + getRequirement("y", selection.In, sets.NewString("alpha"), t), + }, false}, + {Set{"y": ""}, &internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString(""), t), + getRequirement("y", selection.Exists, nil, t), + }, true}, + {Set{"y": ""}, &internalSelector{ + getRequirement("x", selection.DoesNotExist, nil, t), + getRequirement("y", selection.Exists, nil, t), + }, true}, + {Set{"y": ""}, &internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString(""), t), + getRequirement("y", selection.DoesNotExist, nil, t), + }, false}, + {Set{"y": "baz"}, &internalSelector{ + getRequirement("x", selection.In, sets.NewString(""), t), + }, false}, + {Set{"z": "2"}, &internalSelector{ + getRequirement("z", selection.GreaterThan, sets.NewString("1"), t), + }, true}, + {Set{"z": "v2"}, &internalSelector{ + getRequirement("z", selection.GreaterThan, sets.NewString("1"), t), + }, false}, + } + for _, lsm := range labelSelectorMatchingTests { + if match := lsm.Sel.Matches(lsm.Set); match != lsm.Match { + t.Errorf("%+v.Matches(%#v) => %v, want %v", lsm.Sel, lsm.Set, match, lsm.Match) + } + } +} + +func TestSetSelectorParser(t *testing.T) { + setSelectorParserTests := []struct { + In string + Out Selector + Match bool + Valid bool + }{ + {"", NewSelector(), true, true}, + {"\rx", internalSelector{ + getRequirement("x", selection.Exists, nil, t), + }, true, true}, + {"this-is-a-dns.domain.com/key-with-dash", internalSelector{ + getRequirement("this-is-a-dns.domain.com/key-with-dash", selection.Exists, nil, t), + }, true, true}, + {"this-is-another-dns.domain.com/key-with-dash in (so,what)", internalSelector{ + getRequirement("this-is-another-dns.domain.com/key-with-dash", selection.In, sets.NewString("so", "what"), t), + }, true, true}, + {"0.1.2.domain/99 notin (10.10.100.1, tick.tack.clock)", internalSelector{ + getRequirement("0.1.2.domain/99", selection.NotIn, sets.NewString("10.10.100.1", "tick.tack.clock"), t), + }, true, true}, + {"foo in (abc)", internalSelector{ + getRequirement("foo", selection.In, sets.NewString("abc"), t), + }, true, true}, + {"x notin\n (abc)", internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString("abc"), t), + }, true, true}, + {"x notin \t (abc,def)", internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString("abc", "def"), t), + }, true, true}, + {"x in (abc,def)", internalSelector{ + getRequirement("x", selection.In, sets.NewString("abc", "def"), t), + }, true, true}, + {"x in (abc,)", internalSelector{ + getRequirement("x", selection.In, sets.NewString("abc", ""), t), + }, true, true}, + {"x in ()", internalSelector{ + getRequirement("x", selection.In, sets.NewString(""), t), + }, true, true}, + {"x notin (abc,,def),bar,z in (),w", internalSelector{ + getRequirement("bar", selection.Exists, nil, t), + getRequirement("w", selection.Exists, nil, t), + getRequirement("x", selection.NotIn, sets.NewString("abc", "", "def"), t), + getRequirement("z", selection.In, sets.NewString(""), t), + }, true, true}, + {"x,y in (a)", internalSelector{ + getRequirement("y", selection.In, sets.NewString("a"), t), + getRequirement("x", selection.Exists, nil, t), + }, false, true}, + {"x=a", internalSelector{ + getRequirement("x", selection.Equals, sets.NewString("a"), t), + }, true, true}, + {"x>1", internalSelector{ + getRequirement("x", selection.GreaterThan, sets.NewString("1"), t), + }, true, true}, + {"x<7", internalSelector{ + getRequirement("x", selection.LessThan, sets.NewString("7"), t), + }, true, true}, + {"x=a,y!=b", internalSelector{ + getRequirement("x", selection.Equals, sets.NewString("a"), t), + getRequirement("y", selection.NotEquals, sets.NewString("b"), t), + }, true, true}, + {"x=a,y!=b,z in (h,i,j)", internalSelector{ + getRequirement("x", selection.Equals, sets.NewString("a"), t), + getRequirement("y", selection.NotEquals, sets.NewString("b"), t), + getRequirement("z", selection.In, sets.NewString("h", "i", "j"), t), + }, true, true}, + {"x=a||y=b", internalSelector{}, false, false}, + {"x,,y", nil, true, false}, + {",x,y", nil, true, false}, + {"x nott in (y)", nil, true, false}, + {"x notin ( )", internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString(""), t), + }, true, true}, + {"x notin (, a)", internalSelector{ + getRequirement("x", selection.NotIn, sets.NewString("", "a"), t), + }, true, true}, + {"a in (xyz),", nil, true, false}, + {"a in (xyz)b notin ()", nil, true, false}, + {"a ", internalSelector{ + getRequirement("a", selection.Exists, nil, t), + }, true, true}, + {"a in (x,y,notin, z,in)", internalSelector{ + getRequirement("a", selection.In, sets.NewString("in", "notin", "x", "y", "z"), t), + }, true, true}, // operator 'in' inside list of identifiers + {"a in (xyz abc)", nil, false, false}, // no comma + {"a notin(", nil, true, false}, // bad formed + {"a (", nil, false, false}, // cpar + {"(", nil, false, false}, // opar + } + + for _, ssp := range setSelectorParserTests { + if sel, err := Parse(ssp.In); err != nil && ssp.Valid { + t.Errorf("Parse(%s) => %v expected no error", ssp.In, err) + } else if err == nil && !ssp.Valid { + t.Errorf("Parse(%s) => %+v expected error", ssp.In, sel) + } else if ssp.Match && !reflect.DeepEqual(sel, ssp.Out) { + t.Errorf("Parse(%s) => parse output '%#v' doesn't match '%#v' expected match", ssp.In, sel, ssp.Out) + } + } +} + +func getRequirement(key string, op selection.Operator, vals sets.String, t *testing.T) Requirement { + req, err := NewRequirement(key, op, vals.List()) + if err != nil { + t.Errorf("NewRequirement(%v, %v, %v) resulted in error:%v", key, op, vals, err) + return Requirement{} + } + return *req +} + +func TestAdd(t *testing.T) { + testCases := []struct { + name string + sel Selector + key string + operator selection.Operator + values []string + refSelector Selector + }{ + { + "keyInOperator", + internalSelector{}, + "key", + selection.In, + []string{"value"}, + internalSelector{Requirement{"key", selection.In, []string{"value"}}}, + }, + { + "keyEqualsOperator", + internalSelector{Requirement{"key", selection.In, []string{"value"}}}, + "key2", + selection.Equals, + []string{"value2"}, + internalSelector{ + Requirement{"key", selection.In, []string{"value"}}, + Requirement{"key2", selection.Equals, []string{"value2"}}, + }, + }, + } + for _, ts := range testCases { + req, err := NewRequirement(ts.key, ts.operator, ts.values) + if err != nil { + t.Errorf("%s - Unable to create labels.Requirement", ts.name) + } + ts.sel = ts.sel.Add(*req) + if !reflect.DeepEqual(ts.sel, ts.refSelector) { + t.Errorf("%s - Expected %v found %v", ts.name, ts.refSelector, ts.sel) + } + } +} + +func TestSafeSort(t *testing.T) { + tests := []struct { + name string + in []string + inCopy []string + want []string + }{ + { + name: "nil strings", + in: nil, + inCopy: nil, + want: nil, + }, + { + name: "ordered strings", + in: []string{"bar", "foo"}, + inCopy: []string{"bar", "foo"}, + want: []string{"bar", "foo"}, + }, + { + name: "unordered strings", + in: []string{"foo", "bar"}, + inCopy: []string{"foo", "bar"}, + want: []string{"bar", "foo"}, + }, + { + name: "duplicated strings", + in: []string{"foo", "bar", "foo", "bar"}, + inCopy: []string{"foo", "bar", "foo", "bar"}, + want: []string{"bar", "bar", "foo", "foo"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := safeSort(tt.in); !reflect.DeepEqual(got, tt.want) { + t.Errorf("safeSort() = %v, want %v", got, tt.want) + } + if !reflect.DeepEqual(tt.in, tt.inCopy) { + t.Errorf("after safeSort(), input = %v, want %v", tt.in, tt.inCopy) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/BUILD index a2c2eb30..3c07e159 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/BUILD @@ -9,13 +9,27 @@ load( go_test( name = "go_default_test", srcs = [ + "conversion_test.go", + "converter_test.go", + "embedded_test.go", + "extension_test.go", "local_scheme_test.go", + "scheme_test.go", "swagger_doc_generator_test.go", ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", ], ) @@ -41,43 +55,19 @@ go_library( "types_proto.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime", importpath = "k8s.io/apimachinery/pkg/runtime", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/naming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = [ - "conversion_test.go", - "converter_test.go", - "embedded_test.go", - "extension_test.go", - "scheme_test.go", - ], - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", ], ) @@ -98,9 +88,3 @@ filegroup( ], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go index 10dc12cc..6b859b28 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go @@ -76,24 +76,6 @@ func EncodeOrDie(e Encoder, obj Object) string { return string(bytes) } -// DefaultingSerializer invokes defaulting after decoding. -type DefaultingSerializer struct { - Defaulter ObjectDefaulter - Decoder Decoder - // Encoder is optional to allow this type to be used as both a Decoder and an Encoder - Encoder -} - -// Decode performs a decode and then allows the defaulter to act on the provided object. -func (d DefaultingSerializer) Decode(data []byte, defaultGVK *schema.GroupVersionKind, into Object) (Object, *schema.GroupVersionKind, error) { - obj, gvk, err := d.Decoder.Decode(data, defaultGVK, into) - if err != nil { - return obj, gvk, err - } - d.Defaulter.Default(obj) - return obj, gvk, nil -} - // UseOrCreateObject returns obj if the canonical ObjectKind returned by the provided typer matches gvk, or // invokes the ObjectCreator to instantiate a new gvk. Returns an error if the typer cannot find the object. func UseOrCreateObject(t ObjectTyper, c ObjectCreater, gvk schema.GroupVersionKind, obj Object) (Object, error) { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/conversion.go b/vendor/k8s.io/apimachinery/pkg/runtime/conversion.go index afe4fab1..08d2abfe 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/conversion.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Defines conversions between generic types and structs to map query strings +// Package runtime defines conversions between generic types and structs to map query strings // to struct objects. package runtime @@ -27,7 +27,7 @@ import ( "k8s.io/apimachinery/pkg/conversion" ) -// DefaultFieldSelectorConversion auto-accepts metav1 values for name and namespace. +// DefaultMetaV1FieldSelectorConversion auto-accepts metav1 values for name and namespace. // A cluster scoped resource specifying namespace empty works fine and specifying a particular // namespace will return no results, as expected. func DefaultMetaV1FieldSelectorConversion(label, value string) (string, string, error) { @@ -82,7 +82,7 @@ func Convert_Slice_string_To_int(input *[]string, out *int, s conversion.Scope) return nil } -// Conver_Slice_string_To_bool will convert a string parameter to boolean. +// Convert_Slice_string_To_bool will convert a string parameter to boolean. // Only the absence of a value, a value of "false", or a value of "0" resolve to false. // Any other value (including empty string) resolves to true. func Convert_Slice_string_To_bool(input *[]string, out *bool, s conversion.Scope) error { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/conversion_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/conversion_test.go new file mode 100644 index 00000000..33670415 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/conversion_test.go @@ -0,0 +1,115 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 runtime_test + +import ( + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + runtimetesting "k8s.io/apimachinery/pkg/runtime/testing" +) + +func TestStringMapConversion(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "external"} + + scheme := runtime.NewScheme() + scheme.Log(t) + scheme.AddKnownTypeWithName(internalGV.WithKind("Complex"), &runtimetesting.InternalComplex{}) + scheme.AddKnownTypeWithName(externalGV.WithKind("Complex"), &runtimetesting.ExternalComplex{}) + + testCases := map[string]struct { + input map[string][]string + errFn func(error) bool + expected runtime.Object + }{ + "ignores omitempty": { + input: map[string][]string{ + "String": {"not_used"}, + "string": {"value"}, + "int": {"1"}, + "Integer64": {"2"}, + }, + expected: &runtimetesting.ExternalComplex{String: "value", Integer: 1}, + }, + "returns error on bad int": { + input: map[string][]string{ + "int": {"a"}, + }, + errFn: func(err error) bool { return err != nil }, + expected: &runtimetesting.ExternalComplex{}, + }, + "parses int64": { + input: map[string][]string{ + "Int64": {"-1"}, + }, + expected: &runtimetesting.ExternalComplex{Int64: -1}, + }, + "returns error on bad int64": { + input: map[string][]string{ + "Int64": {"a"}, + }, + errFn: func(err error) bool { return err != nil }, + expected: &runtimetesting.ExternalComplex{}, + }, + "parses boolean true": { + input: map[string][]string{ + "bool": {"true"}, + }, + expected: &runtimetesting.ExternalComplex{Bool: true}, + }, + "parses boolean any value": { + input: map[string][]string{ + "bool": {"foo"}, + }, + expected: &runtimetesting.ExternalComplex{Bool: true}, + }, + "parses boolean false": { + input: map[string][]string{ + "bool": {"false"}, + }, + expected: &runtimetesting.ExternalComplex{Bool: false}, + }, + "parses boolean empty value": { + input: map[string][]string{ + "bool": {""}, + }, + expected: &runtimetesting.ExternalComplex{Bool: true}, + }, + "parses boolean no value": { + input: map[string][]string{ + "bool": {}, + }, + expected: &runtimetesting.ExternalComplex{Bool: false}, + }, + } + + for k, tc := range testCases { + out := &runtimetesting.ExternalComplex{} + if err := scheme.Convert(&tc.input, out, nil); (tc.errFn == nil && err != nil) || (tc.errFn != nil && !tc.errFn(err)) { + t.Errorf("%s: unexpected error: %v", k, err) + continue + } else if err != nil { + continue + } + if !reflect.DeepEqual(out, tc.expected) { + t.Errorf("%s: unexpected output: %#v", k, out) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/converter_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/converter_test.go new file mode 100644 index 00000000..7820b8ce --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/converter_test.go @@ -0,0 +1,597 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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. +*/ + +// These tests are in a separate package to break cyclic dependency in tests. +// Unstructured type depends on unstructured converter package but we want to test how the converter handles +// the Unstructured type so we need to import both. + +package runtime_test + +import ( + encodingjson "encoding/json" + "fmt" + "reflect" + "strconv" + "testing" + "time" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/apimachinery/pkg/util/json" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var simpleEquality = conversion.EqualitiesOrDie( + func(a, b time.Time) bool { + return a.UTC() == b.UTC() + }, +) + +// Definte a number of test types. +type A struct { + A int `json:"aa,omitempty"` + B string `json:"ab,omitempty"` + C bool `json:"ac,omitempty"` +} + +type B struct { + A A `json:"ba"` + B string `json:"bb"` + C map[string]string `json:"bc"` + D []string `json:"bd"` +} + +type C struct { + A []A `json:"ca"` + B `json:",inline"` + C string `json:"cc"` + D *int64 `json:"cd"` + E map[string]int `json:"ce"` + F []bool `json:"cf"` + G []int `json:"cg"` + H float32 `json:"ch"` + I []interface{} `json:"ci"` +} + +type D struct { + A []interface{} `json:"da"` +} + +type E struct { + A interface{} `json:"ea"` +} + +type F struct { + A string `json:"fa"` + B map[string]string `json:"fb"` + C []A `json:"fc"` + D int `json:"fd"` + E float32 `json:"fe"` + F []string `json:"ff"` + G []int `json:"fg"` + H []bool `json:"fh"` + I []float32 `json:"fi"` +} + +type G struct { + CustomValue1 CustomValue `json:"customValue1"` + CustomValue2 *CustomValue `json:"customValue2"` + CustomPointer1 CustomPointer `json:"customPointer1"` + CustomPointer2 *CustomPointer `json:"customPointer2"` +} + +type CustomValue struct { + data []byte +} + +// MarshalJSON has a value receiver on this type. +func (c CustomValue) MarshalJSON() ([]byte, error) { + return c.data, nil +} + +type CustomPointer struct { + data []byte +} + +// MarshalJSON has a pointer receiver on this type. +func (c *CustomPointer) MarshalJSON() ([]byte, error) { + return c.data, nil +} + +func doRoundTrip(t *testing.T, item interface{}) { + data, err := json.Marshal(item) + if err != nil { + t.Errorf("Error when marshaling object: %v", err) + return + } + + unstr := make(map[string]interface{}) + err = json.Unmarshal(data, &unstr) + if err != nil { + t.Errorf("Error when unmarshaling to unstructured: %v", err) + return + } + + data, err = json.Marshal(unstr) + if err != nil { + t.Errorf("Error when marshaling unstructured: %v", err) + return + } + unmarshalledObj := reflect.New(reflect.TypeOf(item).Elem()).Interface() + err = json.Unmarshal(data, unmarshalledObj) + if err != nil { + t.Errorf("Error when unmarshaling to object: %v", err) + return + } + if !reflect.DeepEqual(item, unmarshalledObj) { + t.Errorf("Object changed during JSON operations, diff: %v", diff.ObjectReflectDiff(item, unmarshalledObj)) + return + } + + // TODO: should be using mismatch detection but fails due to another error + newUnstr, err := runtime.DefaultUnstructuredConverter.ToUnstructured(item) + if err != nil { + t.Errorf("ToUnstructured failed: %v", err) + return + } + + newObj := reflect.New(reflect.TypeOf(item).Elem()).Interface() + err = runtime.NewTestUnstructuredConverter(simpleEquality).FromUnstructured(newUnstr, newObj) + if err != nil { + t.Errorf("FromUnstructured failed: %v", err) + return + } + + if !reflect.DeepEqual(item, newObj) { + t.Errorf("Object changed, diff: %v", diff.ObjectReflectDiff(item, newObj)) + } +} + +func TestRoundTrip(t *testing.T) { + intVal := int64(42) + testCases := []struct { + obj interface{} + }{ + { + obj: &unstructured.UnstructuredList{ + Object: map[string]interface{}{ + "kind": "List", + }, + // Not testing a list with nil Items because items is a non-optional field and hence + // is always marshaled into an empty array which is not equal to nil when unmarshalled and will fail. + // That is expected. + Items: []unstructured.Unstructured{}, + }, + }, + { + obj: &unstructured.UnstructuredList{ + Object: map[string]interface{}{ + "kind": "List", + }, + Items: []unstructured.Unstructured{ + { + Object: map[string]interface{}{ + "kind": "Pod", + }, + }, + }, + }, + }, + { + obj: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "Pod", + }, + }, + }, + { + obj: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "v1", + "kind": "Foo", + "metadata": map[string]interface{}{ + "name": "foo1", + }, + }, + }, + }, + { + // This (among others) tests nil map, slice and pointer. + obj: &C{ + C: "ccc", + }, + }, + { + // This (among others) tests empty map and slice. + obj: &C{ + A: []A{}, + C: "ccc", + E: map[string]int{}, + I: []interface{}{}, + }, + }, + { + obj: &C{ + A: []A{ + { + A: 1, + B: "11", + C: true, + }, + { + A: 2, + B: "22", + C: false, + }, + }, + B: B{ + A: A{ + A: 3, + B: "33", + }, + B: "bbb", + C: map[string]string{ + "k1": "v1", + "k2": "v2", + }, + D: []string{"s1", "s2"}, + }, + C: "ccc", + D: &intVal, + E: map[string]int{ + "k1": 1, + "k2": 2, + }, + F: []bool{true, false, false}, + G: []int{1, 2, 5}, + H: 3.3, + I: []interface{}{nil, nil, nil}, + }, + }, + { + // Test slice of interface{} with empty slices. + obj: &D{ + A: []interface{}{[]interface{}{}, []interface{}{}}, + }, + }, + { + // Test slice of interface{} with different values. + obj: &D{ + A: []interface{}{3.0, "3.0", nil}, + }, + }, + } + + for i := range testCases { + t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { + doRoundTrip(t, testCases[i].obj) + }) + } +} + +// Verifies that: +// 1) serialized json -> object +// 2) serialized json -> map[string]interface{} -> object +// produces the same object. +func doUnrecognized(t *testing.T, jsonData string, item interface{}, expectedErr error) { + unmarshalledObj := reflect.New(reflect.TypeOf(item).Elem()).Interface() + err := json.Unmarshal([]byte(jsonData), unmarshalledObj) + if (err != nil) != (expectedErr != nil) { + t.Errorf("Unexpected error when unmarshaling to object: %v, expected: %v", err, expectedErr) + return + } + + unstr := make(map[string]interface{}) + err = json.Unmarshal([]byte(jsonData), &unstr) + if err != nil { + t.Errorf("Error when unmarshaling to unstructured: %v", err) + return + } + newObj := reflect.New(reflect.TypeOf(item).Elem()).Interface() + err = runtime.NewTestUnstructuredConverter(simpleEquality).FromUnstructured(unstr, newObj) + if (err != nil) != (expectedErr != nil) { + t.Errorf("Unexpected error in FromUnstructured: %v, expected: %v", err, expectedErr) + } + + if expectedErr == nil && !reflect.DeepEqual(unmarshalledObj, newObj) { + t.Errorf("Object changed, diff: %v", diff.ObjectReflectDiff(unmarshalledObj, newObj)) + } +} + +func TestUnrecognized(t *testing.T) { + testCases := []struct { + data string + obj interface{} + err error + }{ + { + data: "{\"da\":[3.0,\"3.0\",null]}", + obj: &D{}, + }, + { + data: "{\"ea\":[3.0,\"3.0\",null]}", + obj: &E{}, + }, + { + data: "{\"ea\":[null,null,null]}", + obj: &E{}, + }, + { + data: "{\"ea\":[[],[null]]}", + obj: &E{}, + }, + { + data: "{\"ea\":{\"a\":[],\"b\":null}}", + obj: &E{}, + }, + { + data: "{\"fa\":\"fa\",\"fb\":{\"a\":\"a\"}}", + obj: &F{}, + }, + { + data: "{\"fa\":\"fa\",\"fb\":{\"a\":null}}", + obj: &F{}, + }, + { + data: "{\"fc\":[null]}", + obj: &F{}, + }, + { + data: "{\"fc\":[{\"aa\":123,\"ab\":\"bbb\"}]}", + obj: &F{}, + }, + { + // Only unknown fields + data: "{\"fx\":[{\"aa\":123,\"ab\":\"bbb\"}],\"fz\":123}", + obj: &F{}, + }, + { + data: "{\"fc\":[{\"aa\":\"aaa\",\"ab\":\"bbb\"}]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal string into Go value of type int"), + }, + { + data: "{\"fd\":123,\"fe\":3.5}", + obj: &F{}, + }, + { + data: "{\"ff\":[\"abc\"],\"fg\":[123],\"fh\":[true,false]}", + obj: &F{}, + }, + { + // Invalid string data + data: "{\"fa\":123}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type string"), + }, + { + // Invalid string data + data: "{\"fa\":13.5}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type string"), + }, + { + // Invalid string data + data: "{\"fa\":true}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal bool into Go value of type string"), + }, + { + // Invalid []string data + data: "{\"ff\":123}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type []string"), + }, + { + // Invalid []string data + data: "{\"ff\":3.5}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type []string"), + }, + { + // Invalid []string data + data: "{\"ff\":[123,345]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type string"), + }, + { + // Invalid []int data + data: "{\"fg\":123}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type []int"), + }, + { + // Invalid []int data + data: "{\"fg\":\"abc\"}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal string into Go value of type []int"), + }, + { + // Invalid []int data + data: "{\"fg\":[\"abc\"]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal string into Go value of type int"), + }, + { + // Invalid []int data + data: "{\"fg\":[3.5]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number 3.5 into Go value of type int"), + }, + { + // Invalid []int data + data: "{\"fg\":[true,false]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number 3.5 into Go value of type int"), + }, + { + // Invalid []bool data + data: "{\"fh\":123}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type []bool"), + }, + { + // Invalid []bool data + data: "{\"fh\":\"abc\"}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal string into Go value of type []bool"), + }, + { + // Invalid []bool data + data: "{\"fh\":[\"abc\"]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal string into Go value of type bool"), + }, + { + // Invalid []bool data + data: "{\"fh\":[3.5]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type bool"), + }, + { + // Invalid []bool data + data: "{\"fh\":[123]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type bool"), + }, + { + // Invalid []float data + data: "{\"fi\":123}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal number into Go value of type []float32"), + }, + { + // Invalid []float data + data: "{\"fi\":\"abc\"}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal string into Go value of type []float32"), + }, + { + // Invalid []float data + data: "{\"fi\":[\"abc\"]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal string into Go value of type float32"), + }, + { + // Invalid []float data + data: "{\"fi\":[true]}", + obj: &F{}, + err: fmt.Errorf("json: cannot unmarshal bool into Go value of type float32"), + }, + } + + for _, tc := range testCases { + t.Run(tc.data, func(t *testing.T) { + doUnrecognized(t, tc.data, tc.obj, tc.err) + }) + } +} + +func TestDeepCopyJSON(t *testing.T) { + src := map[string]interface{}{ + "a": nil, + "b": int64(123), + "c": map[string]interface{}{ + "a": "b", + }, + "d": []interface{}{ + int64(1), int64(2), + }, + "e": "estr", + "f": true, + "g": encodingjson.Number("123"), + } + deepCopy := runtime.DeepCopyJSON(src) + assert.Equal(t, src, deepCopy) +} + +func TestFloatIntConversion(t *testing.T) { + unstr := map[string]interface{}{"fd": float64(3)} + + var obj F + if err := runtime.NewTestUnstructuredConverter(simpleEquality).FromUnstructured(unstr, &obj); err != nil { + t.Errorf("Unexpected error in FromUnstructured: %v", err) + } + + data, err := json.Marshal(unstr) + if err != nil { + t.Fatalf("Error when marshaling unstructured: %v", err) + } + var unmarshalled F + if err := json.Unmarshal(data, &unmarshalled); err != nil { + t.Fatalf("Error when unmarshaling to object: %v", err) + } + + if !reflect.DeepEqual(obj, unmarshalled) { + t.Errorf("Incorrect conversion, diff: %v", diff.ObjectReflectDiff(obj, unmarshalled)) + } +} + +func TestCustomToUnstructured(t *testing.T) { + testcases := []struct { + Data string + Expected interface{} + }{ + {Data: `null`, Expected: nil}, + {Data: `true`, Expected: true}, + {Data: `false`, Expected: false}, + {Data: `[]`, Expected: []interface{}{}}, + {Data: `[1]`, Expected: []interface{}{int64(1)}}, + {Data: `{}`, Expected: map[string]interface{}{}}, + {Data: `{"a":1}`, Expected: map[string]interface{}{"a": int64(1)}}, + {Data: `0`, Expected: int64(0)}, + {Data: `0.0`, Expected: float64(0)}, + } + + for _, tc := range testcases { + tc := tc + t.Run(tc.Data, func(t *testing.T) { + t.Parallel() + result, err := runtime.NewTestUnstructuredConverter(simpleEquality).ToUnstructured(&G{ + CustomValue1: CustomValue{data: []byte(tc.Data)}, + CustomValue2: &CustomValue{data: []byte(tc.Data)}, + CustomPointer1: CustomPointer{data: []byte(tc.Data)}, + CustomPointer2: &CustomPointer{data: []byte(tc.Data)}, + }) + require.NoError(t, err) + for field, fieldResult := range result { + assert.Equal(t, tc.Expected, fieldResult, field) + } + }) + } +} + +func TestCustomToUnstructuredTopLevel(t *testing.T) { + // Only objects are supported at the top level + topLevelCases := []interface{}{ + &CustomValue{data: []byte(`{"a":1}`)}, + &CustomPointer{data: []byte(`{"a":1}`)}, + } + expected := map[string]interface{}{"a": int64(1)} + for i, obj := range topLevelCases { + obj := obj + t.Run(strconv.Itoa(i), func(t *testing.T) { + t.Parallel() + result, err := runtime.NewTestUnstructuredConverter(simpleEquality).ToUnstructured(obj) + require.NoError(t, err) + assert.Equal(t, expected, result) + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/doc.go b/vendor/k8s.io/apimachinery/pkg/runtime/doc.go index 06b45df6..89feb401 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/doc.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/doc.go @@ -18,20 +18,27 @@ limitations under the License. // that follow the kubernetes API object conventions, which are: // // 0. Your API objects have a common metadata struct member, TypeMeta. +// // 1. Your code refers to an internal set of API objects. +// // 2. In a separate package, you have an external set of API objects. +// // 3. The external set is considered to be versioned, and no breaking -// changes are ever made to it (fields may be added but not changed -// or removed). +// changes are ever made to it (fields may be added but not changed +// or removed). +// // 4. As your api evolves, you'll make an additional versioned package -// with every major change. +// with every major change. +// // 5. Versioned packages have conversion functions which convert to -// and from the internal version. +// and from the internal version. +// // 6. You'll continue to support older versions according to your -// deprecation policy, and you can easily provide a program/library -// to update old versions into new versions because of 5. +// deprecation policy, and you can easily provide a program/library +// to update old versions into new versions because of 5. +// // 7. All of your serializations and deserializations are handled in a -// centralized place. +// centralized place. // // Package runtime provides a conversion helper to make 5 easy, and the // Encode/Decode/DecodeInto trio to accomplish 7. You can also register @@ -41,5 +48,4 @@ limitations under the License. // // As a bonus, a few common types useful from all api objects and versions // are provided in types.go. - package runtime // import "k8s.io/apimachinery/pkg/runtime" diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/embedded.go b/vendor/k8s.io/apimachinery/pkg/runtime/embedded.go index 2cdac9e1..db11eb8b 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/embedded.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/embedded.go @@ -31,7 +31,7 @@ type encodable struct { func (e encodable) GetObjectKind() schema.ObjectKind { return e.obj.GetObjectKind() } func (e encodable) DeepCopyObject() Object { - var out encodable = e + out := e out.obj = e.obj.DeepCopyObject() copy(out.versions, e.versions) return out @@ -46,14 +46,14 @@ func NewEncodable(e Encoder, obj Object, versions ...schema.GroupVersion) Object return encodable{e, obj, versions} } -func (re encodable) UnmarshalJSON(in []byte) error { +func (e encodable) UnmarshalJSON(in []byte) error { return errors.New("runtime.encodable cannot be unmarshalled from JSON") } // Marshal may get called on pointers or values, so implement MarshalJSON on value. // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go -func (re encodable) MarshalJSON() ([]byte, error) { - return Encode(re.E, re.obj) +func (e encodable) MarshalJSON() ([]byte, error) { + return Encode(e.E, e.obj) } // NewEncodableList creates an object that will be encoded with the provided codec on demand. @@ -70,28 +70,28 @@ func NewEncodableList(e Encoder, objects []Object, versions ...schema.GroupVersi return out } -func (re *Unknown) UnmarshalJSON(in []byte) error { - if re == nil { +func (e *Unknown) UnmarshalJSON(in []byte) error { + if e == nil { return errors.New("runtime.Unknown: UnmarshalJSON on nil pointer") } - re.TypeMeta = TypeMeta{} - re.Raw = append(re.Raw[0:0], in...) - re.ContentEncoding = "" - re.ContentType = ContentTypeJSON + e.TypeMeta = TypeMeta{} + e.Raw = append(e.Raw[0:0], in...) + e.ContentEncoding = "" + e.ContentType = ContentTypeJSON return nil } // Marshal may get called on pointers or values, so implement MarshalJSON on value. // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go -func (re Unknown) MarshalJSON() ([]byte, error) { +func (e Unknown) MarshalJSON() ([]byte, error) { // If ContentType is unset, we assume this is JSON. - if re.ContentType != "" && re.ContentType != ContentTypeJSON { + if e.ContentType != "" && e.ContentType != ContentTypeJSON { return nil, errors.New("runtime.Unknown: MarshalJSON on non-json data") } - if re.Raw == nil { + if e.Raw == nil { return []byte("null"), nil } - return re.Raw, nil + return e.Raw, nil } func Convert_runtime_Object_To_runtime_RawExtension(in *Object, out *RawExtension, s conversion.Scope) error { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/embedded_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/embedded_test.go new file mode 100644 index 00000000..606e0e96 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/embedded_test.go @@ -0,0 +1,256 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 runtime_test + +import ( + "encoding/json" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + runtimetesting "k8s.io/apimachinery/pkg/runtime/testing" + "k8s.io/apimachinery/pkg/util/diff" +) + +func TestDecodeEmptyRawExtensionAsObject(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "v1test"} + externalGVK := externalGV.WithKind("ObjectTest") + + s := runtime.NewScheme() + s.AddKnownTypes(internalGV, &runtimetesting.ObjectTest{}) + s.AddKnownTypeWithName(externalGVK, &runtimetesting.ObjectTestExternal{}) + + codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) + + obj, gvk, err := codec.Decode([]byte(`{"kind":"`+externalGVK.Kind+`","apiVersion":"`+externalGV.String()+`","items":[{}]}`), nil, nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + test := obj.(*runtimetesting.ObjectTest) + if unk, ok := test.Items[0].(*runtime.Unknown); !ok || unk.Kind != "" || unk.APIVersion != "" || string(unk.Raw) != "{}" || unk.ContentType != runtime.ContentTypeJSON { + t.Fatalf("unexpected object: %#v", test.Items[0]) + } + if *gvk != externalGVK { + t.Fatalf("unexpected kind: %#v", gvk) + } + + obj, gvk, err = codec.Decode([]byte(`{"kind":"`+externalGVK.Kind+`","apiVersion":"`+externalGV.String()+`","items":[{"kind":"Other","apiVersion":"v1"}]}`), nil, nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + test = obj.(*runtimetesting.ObjectTest) + if unk, ok := test.Items[0].(*runtime.Unknown); !ok || unk.Kind != "" || unk.APIVersion != "" || string(unk.Raw) != `{"kind":"Other","apiVersion":"v1"}` || unk.ContentType != runtime.ContentTypeJSON { + t.Fatalf("unexpected object: %#v", test.Items[0]) + } + if *gvk != externalGVK { + t.Fatalf("unexpected kind: %#v", gvk) + } +} + +func TestArrayOfRuntimeObject(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "v1test"} + + s := runtime.NewScheme() + s.AddKnownTypes(internalGV, &runtimetesting.EmbeddedTest{}) + s.AddKnownTypeWithName(externalGV.WithKind("EmbeddedTest"), &runtimetesting.EmbeddedTestExternal{}) + s.AddKnownTypes(internalGV, &runtimetesting.ObjectTest{}) + s.AddKnownTypeWithName(externalGV.WithKind("ObjectTest"), &runtimetesting.ObjectTestExternal{}) + + codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) + + innerItems := []runtime.Object{ + &runtimetesting.EmbeddedTest{ID: "baz"}, + } + items := []runtime.Object{ + &runtimetesting.EmbeddedTest{ID: "foo"}, + &runtimetesting.EmbeddedTest{ID: "bar"}, + // TODO: until YAML is removed, this JSON must be in ascending key order to ensure consistent roundtrip serialization + &runtime.Unknown{ + Raw: []byte(`{"apiVersion":"unknown.group/unknown","foo":"bar","kind":"OtherTest"}`), + ContentType: runtime.ContentTypeJSON, + }, + &runtimetesting.ObjectTest{ + Items: runtime.NewEncodableList(codec, innerItems), + }, + } + internal := &runtimetesting.ObjectTest{ + Items: runtime.NewEncodableList(codec, items), + } + wire, err := runtime.Encode(codec, internal) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + t.Logf("Wire format is:\n%s\n", string(wire)) + + obj := &runtimetesting.ObjectTestExternal{} + if err := json.Unmarshal(wire, obj); err != nil { + t.Fatalf("unexpected error: %v", err) + } + t.Logf("exact wire is: %s", string(obj.Items[0].Raw)) + + items[3] = &runtimetesting.ObjectTest{Items: innerItems} + internal.Items = items + + decoded, err := runtime.Decode(codec, wire) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + list, err := meta.ExtractList(decoded) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if errs := runtime.DecodeList(list, codec); len(errs) > 0 { + t.Fatalf("unexpected error: %v", errs) + } + + list2, err := meta.ExtractList(list[3]) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if errs := runtime.DecodeList(list2, codec); len(errs) > 0 { + t.Fatalf("unexpected error: %v", errs) + } + if err := meta.SetList(list[3], list2); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // we want DecodeList to set type meta if possible, even on runtime.Unknown objects + internal.Items[2].(*runtime.Unknown).TypeMeta = runtime.TypeMeta{Kind: "OtherTest", APIVersion: "unknown.group/unknown"} + if e, a := internal.Items, list; !reflect.DeepEqual(e, a) { + t.Errorf("mismatched decoded: %s", diff.ObjectGoPrintSideBySide(e, a)) + } +} + +func TestNestedObject(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "v1test"} + embeddedTestExternalGVK := externalGV.WithKind("EmbeddedTest") + + s := runtime.NewScheme() + s.AddKnownTypes(internalGV, &runtimetesting.EmbeddedTest{}) + s.AddKnownTypeWithName(embeddedTestExternalGVK, &runtimetesting.EmbeddedTestExternal{}) + + codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) + + inner := &runtimetesting.EmbeddedTest{ + ID: "inner", + } + outer := &runtimetesting.EmbeddedTest{ + ID: "outer", + Object: runtime.NewEncodable(codec, inner), + } + + wire, err := runtime.Encode(codec, outer) + if err != nil { + t.Fatalf("Unexpected encode error '%v'", err) + } + + t.Logf("Wire format is:\n%v\n", string(wire)) + + decoded, err := runtime.Decode(codec, wire) + if err != nil { + t.Fatalf("Unexpected decode error %v", err) + } + + // for later tests + outer.Object = inner + + if e, a := outer, decoded; reflect.DeepEqual(e, a) { + t.Errorf("Expected unequal %#v %#v", e, a) + } + + obj, err := runtime.Decode(codec, decoded.(*runtimetesting.EmbeddedTest).Object.(*runtime.Unknown).Raw) + if err != nil { + t.Fatal(err) + } + decoded.(*runtimetesting.EmbeddedTest).Object = obj + if e, a := outer, decoded; !reflect.DeepEqual(e, a) { + t.Errorf("Expected equal %#v %#v", e, a) + } + + // test JSON decoding of the external object, which should preserve + // raw bytes + var externalViaJSON runtimetesting.EmbeddedTestExternal + err = json.Unmarshal(wire, &externalViaJSON) + if err != nil { + t.Fatalf("Unexpected decode error %v", err) + } + if externalViaJSON.Kind == "" || externalViaJSON.APIVersion == "" || externalViaJSON.ID != "outer" { + t.Errorf("Expected objects to have type info set, got %#v", externalViaJSON) + } + if len(externalViaJSON.EmptyObject.Raw) > 0 { + t.Errorf("Expected deserialization of empty nested objects into empty bytes, got %#v", externalViaJSON) + } + + // test JSON decoding, too, since Decode uses yaml unmarshalling. + // Generic Unmarshalling of JSON cannot load the nested objects because there is + // no default schema set. Consumers wishing to get direct JSON decoding must use + // the external representation + var decodedViaJSON runtimetesting.EmbeddedTest + err = json.Unmarshal(wire, &decodedViaJSON) + if err == nil { + t.Fatal("Expeceted decode error") + } + if _, ok := err.(*json.UnmarshalTypeError); !ok { + t.Fatalf("Unexpected decode error: %v", err) + } + if a := decodedViaJSON; a.Object != nil || a.EmptyObject != nil { + t.Errorf("Expected embedded objects to be nil: %#v", a) + } +} + +// TestDeepCopyOfRuntimeObject checks to make sure that runtime.Objects's can be passed through DeepCopy with fidelity +func TestDeepCopyOfRuntimeObject(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "v1test"} + embeddedTestExternalGVK := externalGV.WithKind("EmbeddedTest") + + s := runtime.NewScheme() + s.AddKnownTypes(internalGV, &runtimetesting.EmbeddedTest{}) + s.AddKnownTypeWithName(embeddedTestExternalGVK, &runtimetesting.EmbeddedTestExternal{}) + + original := &runtimetesting.EmbeddedTest{ + ID: "outer", + Object: &runtimetesting.EmbeddedTest{ + ID: "inner", + }, + } + + codec := serializer.NewCodecFactory(s).LegacyCodec(externalGV) + + originalData, err := runtime.Encode(codec, original) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + t.Logf("originalRole = %v\n", string(originalData)) + + copyOfOriginal := original.DeepCopy() + copiedData, err := runtime.Encode(codec, copyOfOriginal) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + t.Logf("copyOfRole = %v\n", string(copiedData)) + + if !reflect.DeepEqual(original, copyOfOriginal) { + t.Errorf("expected \n%v\n, got \n%v", string(originalData), string(copiedData)) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/error.go b/vendor/k8s.io/apimachinery/pkg/runtime/error.go index 77879660..322b0313 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/error.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/error.go @@ -24,46 +24,47 @@ import ( ) type notRegisteredErr struct { - gvk schema.GroupVersionKind - target GroupVersioner - t reflect.Type + schemeName string + gvk schema.GroupVersionKind + target GroupVersioner + t reflect.Type } -func NewNotRegisteredErrForKind(gvk schema.GroupVersionKind) error { - return ¬RegisteredErr{gvk: gvk} +func NewNotRegisteredErrForKind(schemeName string, gvk schema.GroupVersionKind) error { + return ¬RegisteredErr{schemeName: schemeName, gvk: gvk} } -func NewNotRegisteredErrForType(t reflect.Type) error { - return ¬RegisteredErr{t: t} +func NewNotRegisteredErrForType(schemeName string, t reflect.Type) error { + return ¬RegisteredErr{schemeName: schemeName, t: t} } -func NewNotRegisteredErrForTarget(t reflect.Type, target GroupVersioner) error { - return ¬RegisteredErr{t: t, target: target} +func NewNotRegisteredErrForTarget(schemeName string, t reflect.Type, target GroupVersioner) error { + return ¬RegisteredErr{schemeName: schemeName, t: t, target: target} } -func NewNotRegisteredGVKErrForTarget(gvk schema.GroupVersionKind, target GroupVersioner) error { - return ¬RegisteredErr{gvk: gvk, target: target} +func NewNotRegisteredGVKErrForTarget(schemeName string, gvk schema.GroupVersionKind, target GroupVersioner) error { + return ¬RegisteredErr{schemeName: schemeName, gvk: gvk, target: target} } func (k *notRegisteredErr) Error() string { if k.t != nil && k.target != nil { - return fmt.Sprintf("%v is not suitable for converting to %q", k.t, k.target) + return fmt.Sprintf("%v is not suitable for converting to %q in scheme %q", k.t, k.target, k.schemeName) } nullGVK := schema.GroupVersionKind{} if k.gvk != nullGVK && k.target != nil { - return fmt.Sprintf("%q is not suitable for converting to %q", k.gvk.GroupVersion(), k.target) + return fmt.Sprintf("%q is not suitable for converting to %q in scheme %q", k.gvk.GroupVersion(), k.target, k.schemeName) } if k.t != nil { - return fmt.Sprintf("no kind is registered for the type %v", k.t) + return fmt.Sprintf("no kind is registered for the type %v in scheme %q", k.t, k.schemeName) } if len(k.gvk.Kind) == 0 { - return fmt.Sprintf("no version %q has been registered", k.gvk.GroupVersion()) + return fmt.Sprintf("no version %q has been registered in scheme %q", k.gvk.GroupVersion(), k.schemeName) } if k.gvk.Version == APIVersionInternal { - return fmt.Sprintf("no kind %q is registered for the internal version of group %q", k.gvk.Kind, k.gvk.Group) + return fmt.Sprintf("no kind %q is registered for the internal version of group %q in scheme %q", k.gvk.Kind, k.gvk.Group, k.schemeName) } - return fmt.Sprintf("no kind %q is registered for version %q", k.gvk.Kind, k.gvk.GroupVersion()) + return fmt.Sprintf("no kind %q is registered for version %q in scheme %q", k.gvk.Kind, k.gvk.GroupVersion(), k.schemeName) } // IsNotRegisteredError returns true if the error indicates the provided diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/extension.go b/vendor/k8s.io/apimachinery/pkg/runtime/extension.go index 737e2e9f..9056397f 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/extension.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/extension.go @@ -32,7 +32,7 @@ func (re *RawExtension) UnmarshalJSON(in []byte) error { return nil } -// Marshal may get called on pointers or values, so implement MarshalJSON on value. +// MarshalJSON may get called on pointers or values, so implement MarshalJSON on value. // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go func (re RawExtension) MarshalJSON() ([]byte, error) { if re.Raw == nil { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/extension_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/extension_test.go new file mode 100644 index 00000000..5f9154ea --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/extension_test.go @@ -0,0 +1,113 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 runtime_test + +import ( + "bytes" + "encoding/json" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime" +) + +func TestEmbeddedRawExtensionMarshal(t *testing.T) { + type test struct { + Ext runtime.RawExtension + } + + extension := test{Ext: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}} + data, err := json.Marshal(extension) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if string(data) != `{"Ext":{"foo":"bar"}}` { + t.Errorf("unexpected data: %s", string(data)) + } +} +func TestEmbeddedRawExtensionUnmarshal(t *testing.T) { + type test struct { + Ext runtime.RawExtension + } + + testCases := map[string]struct { + orig test + }{ + "non-empty object": { + orig: test{Ext: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}}, + }, + "empty object": { + orig: test{Ext: runtime.RawExtension{}}, + }, + } + + for k, tc := range testCases { + new := test{} + data, _ := json.Marshal(tc.orig) + if err := json.Unmarshal(data, &new); err != nil { + t.Errorf("%s: umarshal error: %v", k, err) + } + if !reflect.DeepEqual(tc.orig, new) { + t.Errorf("%s: unmarshaled struct differs from original: %v %v", k, tc.orig, new) + } + } +} + +func TestEmbeddedRawExtensionRoundTrip(t *testing.T) { + type test struct { + Ext runtime.RawExtension + } + + testCases := map[string]struct { + orig test + }{ + "non-empty object": { + orig: test{Ext: runtime.RawExtension{Raw: []byte(`{"foo":"bar"}`)}}, + }, + "empty object": { + orig: test{Ext: runtime.RawExtension{}}, + }, + } + + for k, tc := range testCases { + new1 := test{} + new2 := test{} + data, err := json.Marshal(tc.orig) + if err != nil { + t.Errorf("1st marshal error: %v", err) + } + if err = json.Unmarshal(data, &new1); err != nil { + t.Errorf("1st unmarshal error: %v", err) + } + newData, err := json.Marshal(new1) + if err != nil { + t.Errorf("2st marshal error: %v", err) + } + if err = json.Unmarshal(newData, &new2); err != nil { + t.Errorf("2nd unmarshal error: %v", err) + } + if !bytes.Equal(data, newData) { + t.Errorf("%s: re-marshaled data differs from original: %v %v", k, data, newData) + } + if !reflect.DeepEqual(tc.orig, new1) { + t.Errorf("%s: unmarshaled struct differs from original: %v %v", k, tc.orig, new1) + } + if !reflect.DeepEqual(new1, new2) { + t.Errorf("%s: re-unmarshaled struct differs from original: %v %v", k, new1, new2) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go index 9bcbd722..967e0f53 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go @@ -744,30 +744,29 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 395 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x4f, 0x6f, 0xd3, 0x30, - 0x18, 0xc6, 0xe3, 0xb5, 0x52, 0x87, 0x5b, 0x69, 0xc8, 0x1c, 0x08, 0x3b, 0x38, 0x53, 0x4f, 0xec, - 0x30, 0x5b, 0x1a, 0x42, 0xe2, 0xba, 0x4c, 0x93, 0x40, 0x08, 0x09, 0x59, 0xfc, 0x91, 0x38, 0xe1, - 0x26, 0x26, 0xb3, 0x42, 0x5f, 0x47, 0x8e, 0x43, 0xd8, 0x8d, 0x8f, 0xc0, 0xc7, 0xea, 0x71, 0xc7, - 0x9e, 0x2a, 0x1a, 0x3e, 0x04, 0x57, 0x54, 0xd7, 0x2d, 0xa5, 0x08, 0xed, 0x16, 0xbf, 0xcf, 0xf3, - 0x7b, 0xde, 0xe7, 0x0d, 0x7e, 0x5e, 0x3e, 0xab, 0x99, 0x36, 0xbc, 0x6c, 0x26, 0xca, 0x82, 0x72, - 0xaa, 0xe6, 0x5f, 0x14, 0xe4, 0xc6, 0xf2, 0x20, 0xc8, 0x4a, 0x4f, 0x65, 0x76, 0xad, 0x41, 0xd9, - 0x1b, 0x5e, 0x95, 0x05, 0xb7, 0x0d, 0x38, 0x3d, 0x55, 0xbc, 0x50, 0xa0, 0xac, 0x74, 0x2a, 0x67, - 0x95, 0x35, 0xce, 0x90, 0x64, 0x0d, 0xb0, 0x5d, 0x80, 0x55, 0x65, 0xc1, 0x02, 0x70, 0x7c, 0x56, - 0x68, 0x77, 0xdd, 0x4c, 0x58, 0x66, 0xa6, 0xbc, 0x30, 0x85, 0xe1, 0x9e, 0x9b, 0x34, 0x9f, 0xfc, - 0xcb, 0x3f, 0xfc, 0xd7, 0x3a, 0xef, 0xf8, 0xc9, 0xff, 0x0a, 0x34, 0x4e, 0x7f, 0xe6, 0x1a, 0x5c, - 0xed, 0xec, 0x7e, 0x89, 0xf1, 0x29, 0x1e, 0x09, 0xd9, 0x5e, 0x7d, 0x75, 0x0a, 0x6a, 0x6d, 0x80, - 0x3c, 0xc2, 0x3d, 0x2b, 0xdb, 0x18, 0x9d, 0xa0, 0xc7, 0xa3, 0x74, 0xd0, 0x2d, 0x92, 0x9e, 0x90, - 0xad, 0x58, 0xcd, 0xc6, 0x1f, 0xf1, 0xe1, 0x9b, 0x9b, 0x4a, 0xbd, 0x52, 0x4e, 0x92, 0x73, 0x8c, - 0x65, 0xa5, 0xdf, 0x29, 0xbb, 0x82, 0xbc, 0xfb, 0x5e, 0x4a, 0x66, 0x8b, 0x24, 0xea, 0x16, 0x09, - 0xbe, 0x78, 0xfd, 0x22, 0x28, 0x62, 0xc7, 0x45, 0x4e, 0x70, 0xbf, 0xd4, 0x90, 0xc7, 0x07, 0xde, - 0x3d, 0x0a, 0xee, 0xfe, 0x4b, 0x0d, 0xb9, 0xf0, 0xca, 0xf8, 0x17, 0xc2, 0x83, 0xb7, 0x50, 0x82, - 0x69, 0x81, 0xbc, 0xc7, 0x87, 0x2e, 0x6c, 0xf3, 0xf9, 0xc3, 0xf3, 0x53, 0x76, 0xc7, 0x0f, 0x63, - 0x9b, 0x7a, 0xe9, 0xfd, 0x10, 0xbe, 0x2d, 0x2c, 0xb6, 0x61, 0x9b, 0x0b, 0x0f, 0xfe, 0xbd, 0x90, - 0x5c, 0xe0, 0xa3, 0xcc, 0x80, 0x53, 0xe0, 0xae, 0x20, 0x33, 0xb9, 0x86, 0x22, 0xee, 0xf9, 0xb2, - 0x0f, 0x43, 0xde, 0xd1, 0xe5, 0xdf, 0xb2, 0xd8, 0xf7, 0x93, 0xa7, 0x78, 0x18, 0x46, 0xab, 0xd5, - 0x71, 0xdf, 0xe3, 0x0f, 0x02, 0x3e, 0xbc, 0xfc, 0x23, 0x89, 0x5d, 0x5f, 0x7a, 0x36, 0x5b, 0xd2, - 0xe8, 0x76, 0x49, 0xa3, 0xf9, 0x92, 0x46, 0xdf, 0x3a, 0x8a, 0x66, 0x1d, 0x45, 0xb7, 0x1d, 0x45, - 0xf3, 0x8e, 0xa2, 0x1f, 0x1d, 0x45, 0xdf, 0x7f, 0xd2, 0xe8, 0xc3, 0x20, 0x1c, 0xfa, 0x3b, 0x00, - 0x00, 0xff, 0xff, 0x3f, 0x1e, 0x24, 0x09, 0x85, 0x02, 0x00, 0x00, + // 378 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0x4f, 0xab, 0x13, 0x31, + 0x14, 0xc5, 0x27, 0xaf, 0x85, 0x3e, 0xd3, 0xc2, 0x93, 0xb8, 0x70, 0x74, 0x91, 0x79, 0x74, 0xe5, + 0x5b, 0xbc, 0x04, 0x1e, 0x08, 0x6e, 0x3b, 0xa5, 0xa0, 0x88, 0x20, 0xc1, 0x3f, 0xe0, 0xca, 0x74, + 0x26, 0x4e, 0xc3, 0xd0, 0x9b, 0x21, 0xcd, 0x38, 0x76, 0xe7, 0x47, 0xf0, 0x63, 0x75, 0xd9, 0x65, + 0x57, 0xc5, 0x8e, 0x1f, 0xc2, 0xad, 0x34, 0x4d, 0x6b, 0xd5, 0x85, 0xbb, 0xe4, 0x9e, 0xf3, 0x3b, + 0xf7, 0x1e, 0xfc, 0xbc, 0x7c, 0xb6, 0x60, 0xda, 0xf0, 0xb2, 0x9e, 0x2a, 0x0b, 0xca, 0xa9, 0x05, + 0xff, 0xac, 0x20, 0x37, 0x96, 0x07, 0x41, 0x56, 0x7a, 0x2e, 0xb3, 0x99, 0x06, 0x65, 0x97, 0xbc, + 0x2a, 0x0b, 0x6e, 0x6b, 0x70, 0x7a, 0xae, 0x78, 0xa1, 0x40, 0x59, 0xe9, 0x54, 0xce, 0x2a, 0x6b, + 0x9c, 0x21, 0xc9, 0x01, 0x60, 0xe7, 0x00, 0xab, 0xca, 0x82, 0x05, 0xe0, 0xf1, 0x6d, 0xa1, 0xdd, + 0xac, 0x9e, 0xb2, 0xcc, 0xcc, 0x79, 0x61, 0x0a, 0xc3, 0x3d, 0x37, 0xad, 0x3f, 0xf9, 0x9f, 0xff, + 0xf8, 0xd7, 0x21, 0x6f, 0x78, 0x83, 0x07, 0x42, 0x36, 0x93, 0x2f, 0x4e, 0xc1, 0x42, 0x1b, 0x20, + 0x8f, 0x70, 0xc7, 0xca, 0x26, 0x46, 0xd7, 0xe8, 0xc9, 0x20, 0xed, 0xb5, 0xdb, 0xa4, 0x23, 0x64, + 0x23, 0xf6, 0xb3, 0xe1, 0x47, 0x7c, 0xf9, 0x66, 0x59, 0xa9, 0x57, 0xca, 0x49, 0x72, 0x87, 0xb1, + 0xac, 0xf4, 0x3b, 0x65, 0xf7, 0x90, 0x77, 0xdf, 0x4b, 0xc9, 0x6a, 0x9b, 0x44, 0xed, 0x36, 0xc1, + 0xa3, 0xd7, 0x2f, 0x82, 0x22, 0xce, 0x5c, 0xe4, 0x1a, 0x77, 0x4b, 0x0d, 0x79, 0x7c, 0xe1, 0xdd, + 0x83, 0xe0, 0xee, 0xbe, 0xd4, 0x90, 0x0b, 0xaf, 0x0c, 0x7f, 0x22, 0xdc, 0x7b, 0x0b, 0x25, 0x98, + 0x06, 0xc8, 0x7b, 0x7c, 0xe9, 0xc2, 0x36, 0x9f, 0xdf, 0xbf, 0xbb, 0x61, 0xff, 0xe9, 0xce, 0x8e, + 0xe7, 0xa5, 0xf7, 0x43, 0xf8, 0xe9, 0x60, 0x71, 0x0a, 0x3b, 0x36, 0xbc, 0xf8, 0xb7, 0x21, 0x19, + 0xe1, 0xab, 0xcc, 0x80, 0x53, 0xe0, 0x26, 0x90, 0x99, 0x5c, 0x43, 0x11, 0x77, 0xfc, 0xb1, 0x0f, + 0x43, 0xde, 0xd5, 0xf8, 0x4f, 0x59, 0xfc, 0xed, 0x27, 0x4f, 0x71, 0x3f, 0x8c, 0xf6, 0xab, 0xe3, + 0xae, 0xc7, 0x1f, 0x04, 0xbc, 0x3f, 0xfe, 0x2d, 0x89, 0x73, 0x5f, 0x7a, 0xbb, 0xda, 0xd1, 0x68, + 0xbd, 0xa3, 0xd1, 0x66, 0x47, 0xa3, 0xaf, 0x2d, 0x45, 0xab, 0x96, 0xa2, 0x75, 0x4b, 0xd1, 0xa6, + 0xa5, 0xe8, 0x7b, 0x4b, 0xd1, 0xb7, 0x1f, 0x34, 0xfa, 0xd0, 0x0b, 0x45, 0x7f, 0x05, 0x00, 0x00, + 0xff, 0xff, 0xe3, 0x33, 0x18, 0x0b, 0x50, 0x02, 0x00, 0x00, } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto index 2ff38391..fb61ac96 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto @@ -21,8 +21,6 @@ syntax = 'proto2'; package k8s.io.apimachinery.pkg.runtime; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; - // Package-wide variables from generator "generated". option go_package = "runtime"; diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/helper.go b/vendor/k8s.io/apimachinery/pkg/runtime/helper.go index a6c1a8d3..33f11eb1 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/helper.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/helper.go @@ -87,7 +87,7 @@ func Field(v reflect.Value, fieldName string, dest interface{}) error { return fmt.Errorf("couldn't assign/convert %v to %v", field.Type(), destValue.Type()) } -// fieldPtr puts the address of fieldName, which must be a member of v, +// FieldPtr puts the address of fieldName, which must be a member of v, // into dest, which must be an address of a variable to which this field's // address can be assigned. func FieldPtr(v reflect.Value, fieldName string, dest interface{}) error { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go index ba48e614..699ff13e 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go @@ -39,14 +39,14 @@ type GroupVersioner interface { KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (target schema.GroupVersionKind, ok bool) } -// Encoders write objects to a serialized form +// Encoder writes objects to a serialized form type Encoder interface { // Encode writes an object to a stream. Implementations may return errors if the versions are // incompatible, or if no conversion is defined. Encode(obj Object, w io.Writer) error } -// Decoders attempt to load an object from data. +// Decoder attempts to load an object from data. type Decoder interface { // Decode attempts to deserialize the provided data using either the innate typing of the scheme or the // default kind, group, and version provided. It returns a decoded object as well as the kind, group, and @@ -185,7 +185,7 @@ type ObjectConvertor interface { // This method is similar to Convert() but handles specific details of choosing the correct // output version. ConvertToVersion(in Object, gv GroupVersioner) (out Object, err error) - ConvertFieldLabel(version, kind, label, value string) (string, string, error) + ConvertFieldLabel(gvk schema.GroupVersionKind, label, value string) (string, string, error) } // ObjectTyper contains methods for extracting the APIVersion and Kind @@ -224,7 +224,7 @@ type SelfLinker interface { Namespace(obj Object) (string, error) } -// All API types registered with Scheme must support the Object interface. Since objects in a scheme are +// Object interface must be supported by all API types registered with Scheme. Since objects in a scheme are // expected to be serialized to the wire, the interface an Object must provide to the Scheme allows // serializers to set the kind, version, and group the object is represented as. An Object may choose // to return a no-op ObjectKindAccessor in cases where it is not expected to be serialized. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go new file mode 100644 index 00000000..45a0dde5 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go @@ -0,0 +1,150 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 runtime + +import ( + "testing" + + "reflect" + + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" +) + +func TestPreferredVersionsAllGroups(t *testing.T) { + tests := []struct { + name string + versionPriority map[string][]string + observedVersions []schema.GroupVersion + expectedPrioritized map[string][]schema.GroupVersion + expectedPreferred map[schema.GroupVersion]bool + }{ + { + name: "observedOnly", + observedVersions: []schema.GroupVersion{ + {Group: "", Version: "v3"}, + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + {Group: "", Version: "v1"}, + }, + expectedPrioritized: map[string][]schema.GroupVersion{ + "": { + {Group: "", Version: "v3"}, + {Group: "", Version: "v1"}, + }, + "foo": { + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + }, + }, + expectedPreferred: map[schema.GroupVersion]bool{ + {Group: "", Version: "v3"}: true, + {Group: "foo", Version: "v1"}: true, + }, + }, + { + name: "specifiedOnly", + versionPriority: map[string][]string{ + "": {"v3", "v1"}, + "foo": {"v1", "v2"}, + }, + expectedPrioritized: map[string][]schema.GroupVersion{ + "": { + {Group: "", Version: "v3"}, + {Group: "", Version: "v1"}, + }, + "foo": { + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + }, + }, + expectedPreferred: map[schema.GroupVersion]bool{ + {Group: "", Version: "v3"}: true, + {Group: "foo", Version: "v1"}: true, + }, + }, + { + name: "both", + versionPriority: map[string][]string{ + "": {"v3", "v1"}, + "foo": {"v1", "v2"}, + }, + observedVersions: []schema.GroupVersion{ + {Group: "", Version: "v1"}, + {Group: "", Version: "v3"}, + {Group: "", Version: "v4"}, + {Group: "", Version: "v5"}, + {Group: "bar", Version: "v1"}, + {Group: "bar", Version: "v2"}, + }, + expectedPrioritized: map[string][]schema.GroupVersion{ + "": { + {Group: "", Version: "v3"}, + {Group: "", Version: "v1"}, + {Group: "", Version: "v4"}, + {Group: "", Version: "v5"}, + }, + "foo": { + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + }, + "bar": { + {Group: "bar", Version: "v1"}, + {Group: "bar", Version: "v2"}, + }, + }, + expectedPreferred: map[schema.GroupVersion]bool{ + {Group: "", Version: "v3"}: true, + {Group: "foo", Version: "v1"}: true, + {Group: "bar", Version: "v1"}: true, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + scheme := NewScheme() + scheme.versionPriority = test.versionPriority + scheme.observedVersions = test.observedVersions + + for group, expected := range test.expectedPrioritized { + actual := scheme.PrioritizedVersionsForGroup(group) + if !reflect.DeepEqual(expected, actual) { + t.Error(diff.ObjectDiff(expected, actual)) + } + } + + prioritizedAll := scheme.PrioritizedVersionsAllGroups() + actualPrioritizedAll := map[string][]schema.GroupVersion{} + for _, actual := range prioritizedAll { + actualPrioritizedAll[actual.Group] = append(actualPrioritizedAll[actual.Group], actual) + } + if !reflect.DeepEqual(test.expectedPrioritized, actualPrioritizedAll) { + t.Error(diff.ObjectDiff(test.expectedPrioritized, actualPrioritizedAll)) + } + + preferredAll := scheme.PreferredVersionAllGroups() + actualPreferredAll := map[schema.GroupVersion]bool{} + for _, actual := range preferredAll { + actualPreferredAll[actual] = true + } + if !reflect.DeepEqual(test.expectedPreferred, actualPreferredAll) { + t.Error(diff.ObjectDiff(test.expectedPreferred, actualPreferredAll)) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD index e8197721..497caf69 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD @@ -19,6 +19,7 @@ go_library( "group_version.go", "interfaces.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/schema", importpath = "k8s.io/apimachinery/pkg/runtime/schema", deps = ["//vendor/github.com/gogo/protobuf/proto:go_default_library"], ) @@ -35,9 +36,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go index 46c85366..5c9934c7 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go @@ -19,12 +19,12 @@ limitations under the License. // DO NOT EDIT! /* - Package schema is a generated protocol buffer package. +Package schema is a generated protocol buffer package. - It is generated from these files: - k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto +It is generated from these files: + k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto - It has these top-level messages: +It has these top-level messages: */ package schema @@ -48,18 +48,17 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 202 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0xce, 0xaf, 0x4e, 0x04, 0x31, - 0x10, 0xc7, 0xf1, 0xd6, 0x20, 0x90, 0xc8, 0x13, 0x23, 0x51, 0xd0, 0x11, 0x18, 0x34, 0x2f, 0x80, - 0xc7, 0x75, 0xf7, 0x86, 0x6e, 0x53, 0xfa, 0x27, 0xed, 0x94, 0x04, 0xc7, 0x23, 0xf0, 0x58, 0x27, - 0x4f, 0xae, 0x64, 0xcb, 0x8b, 0x90, 0xb4, 0x2b, 0x08, 0xc9, 0xb9, 0xfe, 0xd2, 0x7c, 0x26, 0xdf, - 0xeb, 0x67, 0xf7, 0x58, 0x94, 0x8d, 0xe8, 0xea, 0x44, 0x39, 0x10, 0x53, 0xc1, 0x77, 0x0a, 0xc7, - 0x98, 0x71, 0xff, 0xd0, 0xc9, 0x7a, 0x3d, 0x2f, 0x36, 0x50, 0xfe, 0xc0, 0xe4, 0x0c, 0xe6, 0x1a, - 0xd8, 0x7a, 0xc2, 0x32, 0x2f, 0xe4, 0x35, 0x1a, 0x0a, 0x94, 0x35, 0xd3, 0x51, 0xa5, 0x1c, 0x39, - 0xde, 0xdc, 0x0e, 0xa7, 0xfe, 0x3a, 0x95, 0x9c, 0x51, 0xbb, 0x53, 0xc3, 0x1d, 0xee, 0x8d, 0xe5, - 0xa5, 0x4e, 0x6a, 0x8e, 0x1e, 0x4d, 0x34, 0x11, 0x3b, 0x9f, 0xea, 0x6b, 0x5f, 0x7d, 0xf4, 0xd7, - 0x38, 0x7b, 0x78, 0xb8, 0x94, 0x53, 0xd9, 0xbe, 0xa1, 0x0d, 0x5c, 0x38, 0xff, 0x6f, 0x79, 0xba, - 0x3b, 0x6d, 0x20, 0xce, 0x1b, 0x88, 0x75, 0x03, 0xf1, 0xd9, 0x40, 0x9e, 0x1a, 0xc8, 0x73, 0x03, - 0xb9, 0x36, 0x90, 0xdf, 0x0d, 0xe4, 0xd7, 0x0f, 0x88, 0x97, 0xab, 0x51, 0xf4, 0x1b, 0x00, 0x00, - 0xff, 0xff, 0xfd, 0x59, 0x57, 0x93, 0x0b, 0x01, 0x00, 0x00, + // 185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0xcc, 0xaf, 0x6e, 0xc3, 0x30, + 0x10, 0xc7, 0x71, 0x9b, 0x0c, 0x0c, 0x0e, 0x0e, 0x1c, 0x1c, 0xda, 0x7c, 0x74, 0xb8, 0x2f, 0x50, + 0x5e, 0xe6, 0x24, 0x57, 0xc7, 0xb2, 0xfc, 0x47, 0x8e, 0x5d, 0xa9, 0xac, 0x8f, 0xd0, 0xc7, 0x0a, + 0x0c, 0x0c, 0x6c, 0xdc, 0x17, 0xa9, 0x64, 0x07, 0x94, 0xdd, 0x4f, 0xa7, 0xcf, 0xf7, 0xf3, 0x68, + 0xfe, 0x27, 0xa1, 0x3d, 0x9a, 0xdc, 0x51, 0x74, 0x94, 0x68, 0xc2, 0x0b, 0xb9, 0xc1, 0x47, 0xdc, + 0x1f, 0x32, 0x68, 0x2b, 0xfb, 0x51, 0x3b, 0x8a, 0x57, 0x0c, 0x46, 0x61, 0xcc, 0x2e, 0x69, 0x4b, + 0x38, 0xf5, 0x23, 0x59, 0x89, 0x8a, 0x1c, 0x45, 0x99, 0x68, 0x10, 0x21, 0xfa, 0xe4, 0xbf, 0x7e, + 0x9a, 0x13, 0xef, 0x4e, 0x04, 0xa3, 0xc4, 0xee, 0x44, 0x73, 0xdf, 0x7f, 0x4a, 0xa7, 0x31, 0x77, + 0xa2, 0xf7, 0x16, 0x95, 0x57, 0x1e, 0x2b, 0xef, 0xf2, 0xb9, 0xae, 0x3a, 0xea, 0xd5, 0xb2, 0x87, + 0xdf, 0x79, 0x03, 0xb6, 0x6c, 0xc0, 0xd6, 0x0d, 0xd8, 0xad, 0x00, 0x9f, 0x0b, 0xf0, 0xa5, 0x00, + 0x5f, 0x0b, 0xf0, 0x47, 0x01, 0x7e, 0x7f, 0x02, 0x3b, 0x7d, 0xb4, 0xf8, 0x2b, 0x00, 0x00, 0xff, + 0xff, 0xba, 0x7e, 0x65, 0xf4, 0xd6, 0x00, 0x00, 0x00, } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto index 8655f481..5aeeaa10 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto @@ -21,8 +21,6 @@ syntax = 'proto2'; package k8s.io.apimachinery.pkg.runtime.schema; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; - // Package-wide variables from generator "generated". option go_package = "schema"; diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go index da642fa7..5f02961d 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go @@ -85,11 +85,10 @@ func ParseGroupKind(gk string) GroupKind { // ParseGroupResource turns "resource.group" string into a GroupResource struct. Empty strings are allowed // for each field. func ParseGroupResource(gr string) GroupResource { - if i := strings.Index(gr, "."); i == -1 { - return GroupResource{Resource: gr} - } else { + if i := strings.Index(gr, "."); i >= 0 { return GroupResource{Group: gr[i+1:], Resource: gr[:i]} } + return GroupResource{Resource: gr} } // GroupVersionResource unambiguously identifies a resource. It doesn't anonymously include GroupVersion diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go new file mode 100644 index 00000000..3934bc45 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go @@ -0,0 +1,180 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 schema + +import ( + "testing" +) + +func TestGroupVersionParse(t *testing.T) { + tests := []struct { + input string + out GroupVersion + err func(error) bool + }{ + {input: "v1", out: GroupVersion{Version: "v1"}}, + {input: "v2", out: GroupVersion{Version: "v2"}}, + {input: "/v1", out: GroupVersion{Version: "v1"}}, + {input: "v1/", out: GroupVersion{Group: "v1"}}, + {input: "/v1/", err: func(err error) bool { return err.Error() == "unexpected GroupVersion string: /v1/" }}, + {input: "v1/a", out: GroupVersion{Group: "v1", Version: "a"}}, + } + for i, test := range tests { + out, err := ParseGroupVersion(test.input) + if test.err == nil && err != nil || err == nil && test.err != nil { + t.Errorf("%d: unexpected error: %v", i, err) + continue + } + if test.err != nil && !test.err(err) { + t.Errorf("%d: unexpected error: %v", i, err) + continue + } + if out != test.out { + t.Errorf("%d: unexpected output: %#v", i, out) + } + } +} + +func TestGroupResourceParse(t *testing.T) { + tests := []struct { + input string + out GroupResource + }{ + {input: "v1", out: GroupResource{Resource: "v1"}}, + {input: ".v1", out: GroupResource{Group: "v1"}}, + {input: "v1.", out: GroupResource{Resource: "v1"}}, + {input: "v1.a", out: GroupResource{Group: "a", Resource: "v1"}}, + {input: "b.v1.a", out: GroupResource{Group: "v1.a", Resource: "b"}}, + } + for i, test := range tests { + out := ParseGroupResource(test.input) + if out != test.out { + t.Errorf("%d: unexpected output: %#v", i, out) + } + } +} + +func TestParseResourceArg(t *testing.T) { + tests := []struct { + input string + gvr *GroupVersionResource + gr GroupResource + }{ + {input: "v1", gr: GroupResource{Resource: "v1"}}, + {input: ".v1", gr: GroupResource{Group: "v1"}}, + {input: "v1.", gr: GroupResource{Resource: "v1"}}, + {input: "v1.a", gr: GroupResource{Group: "a", Resource: "v1"}}, + {input: "b.v1.a", gvr: &GroupVersionResource{Group: "a", Version: "v1", Resource: "b"}, gr: GroupResource{Group: "v1.a", Resource: "b"}}, + } + for i, test := range tests { + gvr, gr := ParseResourceArg(test.input) + if (gvr != nil && test.gvr == nil) || (gvr == nil && test.gvr != nil) || (test.gvr != nil && *gvr != *test.gvr) { + t.Errorf("%d: unexpected output: %#v", i, gvr) + } + if gr != test.gr { + t.Errorf("%d: unexpected output: %#v", i, gr) + } + } +} + +func TestKindForGroupVersionKinds(t *testing.T) { + gvks := GroupVersions{ + GroupVersion{Group: "batch", Version: "v1"}, + GroupVersion{Group: "batch", Version: "v2alpha1"}, + GroupVersion{Group: "policy", Version: "v1beta1"}, + } + cases := []struct { + input []GroupVersionKind + target GroupVersionKind + ok bool + }{ + { + input: []GroupVersionKind{{Group: "batch", Version: "v2alpha1", Kind: "ScheduledJob"}}, + target: GroupVersionKind{Group: "batch", Version: "v2alpha1", Kind: "ScheduledJob"}, + ok: true, + }, + { + input: []GroupVersionKind{{Group: "batch", Version: "v3alpha1", Kind: "CronJob"}}, + target: GroupVersionKind{Group: "batch", Version: "v1", Kind: "CronJob"}, + ok: true, + }, + { + input: []GroupVersionKind{{Group: "policy", Version: "v1beta1", Kind: "PodDisruptionBudget"}}, + target: GroupVersionKind{Group: "policy", Version: "v1beta1", Kind: "PodDisruptionBudget"}, + ok: true, + }, + { + input: []GroupVersionKind{{Group: "apps", Version: "v1alpha1", Kind: "StatefulSet"}}, + target: GroupVersionKind{}, + ok: false, + }, + } + + for i, c := range cases { + target, ok := gvks.KindForGroupVersionKinds(c.input) + if c.target != target { + t.Errorf("%d: unexpected target: %v, expected %v", i, target, c.target) + } + if c.ok != ok { + t.Errorf("%d: unexpected ok: %v, expected %v", i, ok, c.ok) + } + } +} + +func TestParseKindArg(t *testing.T) { + tests := []struct { + input string + gvk *GroupVersionKind + gk GroupKind + }{ + {input: "Pod", gk: GroupKind{Kind: "Pod"}}, + {input: ".apps", gk: GroupKind{Group: "apps"}}, + {input: "Pod.", gk: GroupKind{Kind: "Pod"}}, + {input: "StatefulSet.apps", gk: GroupKind{Group: "apps", Kind: "StatefulSet"}}, + {input: "StatefulSet.v1.apps", gvk: &GroupVersionKind{Group: "apps", Version: "v1", Kind: "StatefulSet"}, gk: GroupKind{Group: "v1.apps", Kind: "StatefulSet"}}, + } + for i, test := range tests { + t.Run(test.input, func(t *testing.T) { + gvk, gk := ParseKindArg(test.input) + if (gvk != nil && test.gvk == nil) || (gvk == nil && test.gvk != nil) || (test.gvk != nil && *gvk != *test.gvk) { + t.Errorf("%d: expected output: %#v, got: %#v", i, test.gvk, gvk) + } + if gk != test.gk { + t.Errorf("%d: expected output: %#v, got: %#v", i, test.gk, gk) + } + }) + } +} + +func TestParseGroupKind(t *testing.T) { + tests := []struct { + input string + out GroupKind + }{ + {input: "Pod", out: GroupKind{Kind: "Pod"}}, + {input: ".StatefulSet", out: GroupKind{Group: "StatefulSet"}}, + {input: "StatefulSet.apps", out: GroupKind{Group: "apps", Kind: "StatefulSet"}}, + } + for i, test := range tests { + t.Run(test.input, func(t *testing.T) { + out := ParseGroupKind(test.input) + if out != test.out { + t.Errorf("%d: expected output: %#v, got: %#v", i, test.out, out) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go index 59163d77..fd37e293 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go @@ -20,11 +20,12 @@ import ( "fmt" "net/url" "reflect" - "strings" "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/naming" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" ) @@ -62,14 +63,14 @@ type Scheme struct { // Map from version and resource to the corresponding func to convert // resource field labels in that version to internal version. - fieldLabelConversionFuncs map[string]map[string]FieldLabelConversionFunc + fieldLabelConversionFuncs map[schema.GroupVersionKind]FieldLabelConversionFunc // defaulterFuncs is an array of interfaces to be called with an object to provide defaulting // the provided object must be a pointer. defaulterFuncs map[reflect.Type]func(interface{}) // converter stores all registered conversion functions. It also has - // default coverting behavior. + // default converting behavior. converter *conversion.Converter // versionPriority is a map of groups to ordered lists of versions for those groups indicating the @@ -78,9 +79,13 @@ type Scheme struct { // observedVersions keeps track of the order we've seen versions during type registration observedVersions []schema.GroupVersion + + // schemeName is the name of this scheme. If you don't specify a name, the stack of the NewScheme caller will be used. + // This is useful for error reporting to indicate the origin of the scheme. + schemeName string } -// Function to convert a field selector to internal representation. +// FieldLabelConversionFunc converts a field selector to internal representation. type FieldLabelConversionFunc func(label, value string) (internalLabel, internalValue string, err error) // NewScheme creates a new Scheme. This scheme is pluggable by default. @@ -90,24 +95,19 @@ func NewScheme() *Scheme { typeToGVK: map[reflect.Type][]schema.GroupVersionKind{}, unversionedTypes: map[reflect.Type]schema.GroupVersionKind{}, unversionedKinds: map[string]reflect.Type{}, - fieldLabelConversionFuncs: map[string]map[string]FieldLabelConversionFunc{}, + fieldLabelConversionFuncs: map[schema.GroupVersionKind]FieldLabelConversionFunc{}, defaulterFuncs: map[reflect.Type]func(interface{}){}, versionPriority: map[string][]string{}, + schemeName: naming.GetNameFromCallsite(internalPackages...), } s.converter = conversion.NewConverter(s.nameFunc) - s.AddConversionFuncs(DefaultEmbeddedConversions()...) + utilruntime.Must(s.AddConversionFuncs(DefaultEmbeddedConversions()...)) // Enable map[string][]string conversions by default - if err := s.AddConversionFuncs(DefaultStringConversions...); err != nil { - panic(err) - } - if err := s.RegisterInputDefaults(&map[string][]string{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields); err != nil { - panic(err) - } - if err := s.RegisterInputDefaults(&url.Values{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields); err != nil { - panic(err) - } + utilruntime.Must(s.AddConversionFuncs(DefaultStringConversions...)) + utilruntime.Must(s.RegisterInputDefaults(&map[string][]string{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields)) + utilruntime.Must(s.RegisterInputDefaults(&url.Values{}, JSONKeyMapper, conversion.AllowDifferentFieldTypeNames|conversion.IgnoreMissingFields)) return s } @@ -159,7 +159,7 @@ func (s *Scheme) AddUnversionedTypes(version schema.GroupVersion, types ...Objec gvk := version.WithKind(t.Name()) s.unversionedTypes[t] = gvk if old, ok := s.unversionedKinds[gvk.Kind]; ok && t != old { - panic(fmt.Sprintf("%v.%v has already been registered as unversioned kind %q - kind name must be unique", old.PkgPath(), old.Name(), gvk)) + panic(fmt.Sprintf("%v.%v has already been registered as unversioned kind %q - kind name must be unique in scheme %q", old.PkgPath(), old.Name(), gvk, s.schemeName)) } s.unversionedKinds[gvk.Kind] = t } @@ -200,7 +200,7 @@ func (s *Scheme) AddKnownTypeWithName(gvk schema.GroupVersionKind, obj Object) { } if oldT, found := s.gvkToType[gvk]; found && oldT != t { - panic(fmt.Sprintf("Double registration of different types for %v: old=%v.%v, new=%v.%v", gvk, oldT.PkgPath(), oldT.Name(), t.PkgPath(), t.Name())) + panic(fmt.Sprintf("Double registration of different types for %v: old=%v.%v, new=%v.%v in scheme %q", gvk, oldT.PkgPath(), oldT.Name(), t.PkgPath(), t.Name(), s.schemeName)) } s.gvkToType[gvk] = t @@ -255,7 +255,7 @@ func (s *Scheme) ObjectKinds(obj Object) ([]schema.GroupVersionKind, bool, error gvks, ok := s.typeToGVK[t] if !ok { - return nil, false, NewNotRegisteredErrForType(t) + return nil, false, NewNotRegisteredErrForType(s.schemeName, t) } _, unversionedType := s.unversionedTypes[t] @@ -293,15 +293,7 @@ func (s *Scheme) New(kind schema.GroupVersionKind) (Object, error) { if t, exists := s.unversionedKinds[kind.Kind]; exists { return reflect.New(t).Interface().(Object), nil } - return nil, NewNotRegisteredErrForKind(kind) -} - -// AddGenericConversionFunc adds a function that accepts the ConversionFunc call pattern -// (for two conversion types) to the converter. These functions are checked first during -// a normal conversion, but are otherwise not called. Use AddConversionFuncs when registering -// typed conversions. -func (s *Scheme) AddGenericConversionFunc(fn conversion.GenericConversionFunc) { - s.converter.AddGenericConversionFunc(fn) + return nil, NewNotRegisteredErrForKind(s.schemeName, kind) } // Log sets a logger on the scheme. For test purposes only @@ -355,36 +347,27 @@ func (s *Scheme) AddConversionFuncs(conversionFuncs ...interface{}) error { return nil } -// AddGeneratedConversionFuncs registers conversion functions that were -// automatically generated. -func (s *Scheme) AddGeneratedConversionFuncs(conversionFuncs ...interface{}) error { - for _, f := range conversionFuncs { - if err := s.converter.RegisterGeneratedConversionFunc(f); err != nil { - return err - } - } - return nil +// AddConversionFunc registers a function that converts between a and b by passing objects of those +// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce +// any other guarantee. +func (s *Scheme) AddConversionFunc(a, b interface{}, fn conversion.ConversionFunc) error { + return s.converter.RegisterUntypedConversionFunc(a, b, fn) +} + +// AddGeneratedConversionFunc registers a function that converts between a and b by passing objects of those +// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce +// any other guarantee. +func (s *Scheme) AddGeneratedConversionFunc(a, b interface{}, fn conversion.ConversionFunc) error { + return s.converter.RegisterGeneratedUntypedConversionFunc(a, b, fn) } // AddFieldLabelConversionFunc adds a conversion function to convert field selectors // of the given kind from the given version to internal version representation. -func (s *Scheme) AddFieldLabelConversionFunc(version, kind string, conversionFunc FieldLabelConversionFunc) error { - if s.fieldLabelConversionFuncs[version] == nil { - s.fieldLabelConversionFuncs[version] = map[string]FieldLabelConversionFunc{} - } - - s.fieldLabelConversionFuncs[version][kind] = conversionFunc +func (s *Scheme) AddFieldLabelConversionFunc(gvk schema.GroupVersionKind, conversionFunc FieldLabelConversionFunc) error { + s.fieldLabelConversionFuncs[gvk] = conversionFunc return nil } -// AddStructFieldConversion allows you to specify a mechanical copy for a moved -// or renamed struct field without writing an entire conversion function. See -// the comment in conversion.Converter.SetStructFieldCopy for parameter details. -// Call as many times as needed, even on the same fields. -func (s *Scheme) AddStructFieldConversion(srcFieldType interface{}, srcFieldName string, destFieldType interface{}, destFieldName string) error { - return s.converter.SetStructFieldCopy(srcFieldType, srcFieldName, destFieldType, destFieldName) -} - // RegisterInputDefaults sets the provided field mapping function and field matching // as the defaults for the provided input type. The fn may be nil, in which case no // mapping will happen by default. Use this method to register a mechanism for handling @@ -393,7 +376,7 @@ func (s *Scheme) RegisterInputDefaults(in interface{}, fn conversion.FieldMappin return s.converter.RegisterInputDefaults(in, fn, defaultFlags) } -// AddTypeDefaultingFuncs registers a function that is passed a pointer to an +// AddTypeDefaultingFunc registers a function that is passed a pointer to an // object and can default fields on the object. These functions will be invoked // when Default() is called. The function will never be called unless the // defaulted object matches srcType. If this function is invoked twice with the @@ -486,11 +469,8 @@ func (s *Scheme) Convert(in, out interface{}, context interface{}) error { // ConvertFieldLabel alters the given field label and value for an kind field selector from // versioned representation to an unversioned one or returns an error. -func (s *Scheme) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { - if s.fieldLabelConversionFuncs[version] == nil { - return DefaultMetaV1FieldSelectorConversion(label, value) - } - conversionFunc, ok := s.fieldLabelConversionFuncs[version][kind] +func (s *Scheme) ConvertFieldLabel(gvk schema.GroupVersionKind, label, value string) (string, string, error) { + conversionFunc, ok := s.fieldLabelConversionFuncs[gvk] if !ok { return DefaultMetaV1FieldSelectorConversion(label, value) } @@ -541,7 +521,7 @@ func (s *Scheme) convertToVersion(copy bool, in Object, target GroupVersioner) ( kinds, ok := s.typeToGVK[t] if !ok || len(kinds) == 0 { - return nil, NewNotRegisteredErrForType(t) + return nil, NewNotRegisteredErrForType(s.schemeName, t) } gvk, ok := target.KindForGroupVersionKinds(kinds) @@ -554,7 +534,7 @@ func (s *Scheme) convertToVersion(copy bool, in Object, target GroupVersioner) ( } return copyAndSetTargetKind(copy, in, unversionedKind) } - return nil, NewNotRegisteredErrForTarget(t, target) + return nil, NewNotRegisteredErrForTarget(s.schemeName, t, target) } // target wants to use the existing type, set kind and return (no conversion necessary) @@ -764,3 +744,11 @@ func (s *Scheme) addObservedVersion(version schema.GroupVersion) { s.observedVersions = append(s.observedVersions, version) } + +func (s *Scheme) Name() string { + return s.schemeName +} + +// internalPackages are packages that ignored when creating a default reflector name. These packages are in the common +// call chains to NewReflector, so they'd be low entropy names for reflectors +var internalPackages = []string{"k8s.io/apimachinery/pkg/runtime/scheme.go"} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/scheme_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/scheme_test.go new file mode 100644 index 00000000..66f652fa --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/scheme_test.go @@ -0,0 +1,1021 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 runtime_test + +import ( + "fmt" + "reflect" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + runtimetesting "k8s.io/apimachinery/pkg/runtime/testing" + "k8s.io/apimachinery/pkg/util/diff" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" +) + +func TestScheme(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + internalGVK := internalGV.WithKind("Simple") + externalGV := schema.GroupVersion{Group: "test.group", Version: "testExternal"} + externalGVK := externalGV.WithKind("Simple") + + scheme := runtime.NewScheme() + scheme.AddKnownTypeWithName(internalGVK, &runtimetesting.InternalSimple{}) + scheme.AddKnownTypeWithName(externalGVK, &runtimetesting.ExternalSimple{}) + + // If set, would clear TypeMeta during conversion. + //scheme.AddIgnoredConversionType(&TypeMeta{}, &TypeMeta{}) + + // test that scheme is an ObjectTyper + var _ runtime.ObjectTyper = scheme + + internalToExternalCalls := 0 + externalToInternalCalls := 0 + + // Register functions to verify that scope.Meta() gets set correctly. + err := scheme.AddConversionFuncs( + func(in *runtimetesting.InternalSimple, out *runtimetesting.ExternalSimple, scope conversion.Scope) error { + err := scope.Convert(&in.TypeMeta, &out.TypeMeta, 0) + if err != nil { + return err + } + err = scope.Convert(&in.TestString, &out.TestString, 0) + if err != nil { + return err + } + internalToExternalCalls++ + return nil + }, + func(in *runtimetesting.ExternalSimple, out *runtimetesting.InternalSimple, scope conversion.Scope) error { + err := scope.Convert(&in.TypeMeta, &out.TypeMeta, 0) + if err != nil { + return err + } + err = scope.Convert(&in.TestString, &out.TestString, 0) + if err != nil { + return err + } + externalToInternalCalls++ + return nil + }, + ) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + t.Run("Encode, Decode, DecodeInto, and DecodeToVersion", func(t *testing.T) { + simple := &runtimetesting.InternalSimple{ + TestString: "foo", + } + + codecs := serializer.NewCodecFactory(scheme) + codec := codecs.LegacyCodec(externalGV) + info, _ := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), runtime.ContentTypeJSON) + jsonserializer := info.Serializer + + obj := runtime.Object(simple) + data, err := runtime.Encode(codec, obj) + if err != nil { + t.Fatal(err) + } + + obj2, err := runtime.Decode(codec, data) + if err != nil { + t.Fatal(err) + } + if _, ok := obj2.(*runtimetesting.InternalSimple); !ok { + t.Fatalf("Got wrong type") + } + if e, a := simple, obj2; !reflect.DeepEqual(e, a) { + t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) + } + + obj3 := &runtimetesting.InternalSimple{} + if err := runtime.DecodeInto(codec, data, obj3); err != nil { + t.Fatal(err) + } + // clearing TypeMeta is a function of the scheme, which we do not test here (ConvertToVersion + // does not automatically clear TypeMeta anymore). + simple.TypeMeta = runtime.TypeMeta{Kind: "Simple", APIVersion: externalGV.String()} + if e, a := simple, obj3; !reflect.DeepEqual(e, a) { + t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) + } + + obj4, err := runtime.Decode(jsonserializer, data) + if err != nil { + t.Fatal(err) + } + if _, ok := obj4.(*runtimetesting.ExternalSimple); !ok { + t.Fatalf("Got wrong type") + } + }) + t.Run("Convert", func(t *testing.T) { + simple := &runtimetesting.InternalSimple{ + TestString: "foo", + } + + external := &runtimetesting.ExternalSimple{} + err = scheme.Convert(simple, external, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if e, a := simple.TestString, external.TestString; e != a { + t.Errorf("Expected %q, got %q", e, a) + } + }) + t.Run("Convert internal to unstructured", func(t *testing.T) { + simple := &runtimetesting.InternalSimple{ + TestString: "foo", + } + + unstructuredObj := &runtimetesting.Unstructured{} + err = scheme.Convert(simple, unstructuredObj, nil) + if err == nil || !strings.Contains(err.Error(), "to Unstructured without providing a preferred version to convert to") { + t.Fatalf("Unexpected non-error: %v", err) + } + err = scheme.Convert(simple, unstructuredObj, externalGV) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if e, a := simple.TestString, unstructuredObj.Object["testString"].(string); e != a { + t.Errorf("Expected %q, got %q", e, a) + } + if e := unstructuredObj.GetObjectKind().GroupVersionKind(); e != externalGVK { + t.Errorf("Unexpected object kind: %#v", e) + } + if gvks, unversioned, err := scheme.ObjectKinds(unstructuredObj); err != nil || gvks[0] != externalGVK || unversioned { + t.Errorf("Scheme did not recognize unversioned: %v, %#v %t", err, gvks, unversioned) + } + }) + t.Run("Convert external to unstructured", func(t *testing.T) { + unstructuredObj := &runtimetesting.Unstructured{} + external := &runtimetesting.ExternalSimple{ + TestString: "foo", + } + + err = scheme.Convert(external, unstructuredObj, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if e, a := external.TestString, unstructuredObj.Object["testString"].(string); e != a { + t.Errorf("Expected %q, got %q", e, a) + } + if e := unstructuredObj.GetObjectKind().GroupVersionKind(); e != externalGVK { + t.Errorf("Unexpected object kind: %#v", e) + } + }) + t.Run("Convert unstructured to unstructured", func(t *testing.T) { + uIn := &runtimetesting.Unstructured{Object: map[string]interface{}{ + "test": []interface{}{"other", "test"}, + }} + uOut := &runtimetesting.Unstructured{} + err = scheme.Convert(uIn, uOut, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if !reflect.DeepEqual(uIn.Object, uOut.Object) { + t.Errorf("Unexpected object contents: %#v", uOut.Object) + } + }) + t.Run("Convert unstructured to structured", func(t *testing.T) { + unstructuredObj := &runtimetesting.Unstructured{ + Object: map[string]interface{}{ + "testString": "bla", + }, + } + unstructuredObj.SetGroupVersionKind(externalGV.WithKind("Simple")) + externalOut := &runtimetesting.ExternalSimple{} + err = scheme.Convert(unstructuredObj, externalOut, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if externalOut.TestString != "bla" { + t.Errorf("Unexpected object contents: %#v", externalOut) + } + }) + t.Run("Encode and Convert should each have caused an increment", func(t *testing.T) { + if e, a := 3, internalToExternalCalls; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + }) + t.Run("DecodeInto and Decode should each have caused an increment because of a conversion", func(t *testing.T) { + if e, a := 2, externalToInternalCalls; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + }) + t.Run("Verify that unstructured types must have V and K set", func(t *testing.T) { + emptyObj := &runtimetesting.Unstructured{Object: make(map[string]interface{})} + if _, _, err := scheme.ObjectKinds(emptyObj); !runtime.IsMissingKind(err) { + t.Errorf("unexpected error: %v", err) + } + emptyObj.SetGroupVersionKind(schema.GroupVersionKind{Kind: "Test"}) + if _, _, err := scheme.ObjectKinds(emptyObj); !runtime.IsMissingVersion(err) { + t.Errorf("unexpected error: %v", err) + } + emptyObj.SetGroupVersionKind(schema.GroupVersionKind{Kind: "Test", Version: "v1"}) + if _, _, err := scheme.ObjectKinds(emptyObj); err != nil { + t.Errorf("unexpected error: %v", err) + } + }) +} + +func TestBadJSONRejection(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + info, _ := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), runtime.ContentTypeJSON) + jsonserializer := info.Serializer + + badJSONMissingKind := []byte(`{ }`) + if _, err := runtime.Decode(jsonserializer, badJSONMissingKind); err == nil { + t.Errorf("Did not reject despite lack of kind field: %s", badJSONMissingKind) + } + badJSONUnknownType := []byte(`{"kind": "bar"}`) + if _, err1 := runtime.Decode(jsonserializer, badJSONUnknownType); err1 == nil { + t.Errorf("Did not reject despite use of unknown type: %s", badJSONUnknownType) + } + /*badJSONKindMismatch := []byte(`{"kind": "Pod"}`) + if err2 := DecodeInto(badJSONKindMismatch, &Node{}); err2 == nil { + t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch) + }*/ +} + +func TestExternalToInternalMapping(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "testExternal"} + + scheme := runtime.NewScheme() + scheme.AddKnownTypeWithName(internalGV.WithKind("OptionalExtensionType"), &runtimetesting.InternalOptionalExtensionType{}) + scheme.AddKnownTypeWithName(externalGV.WithKind("OptionalExtensionType"), &runtimetesting.ExternalOptionalExtensionType{}) + + codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) + + table := []struct { + obj runtime.Object + encoded string + }{ + { + &runtimetesting.InternalOptionalExtensionType{Extension: nil}, + `{"kind":"OptionalExtensionType","apiVersion":"` + externalGV.String() + `"}`, + }, + } + + for i, item := range table { + gotDecoded, err := runtime.Decode(codec, []byte(item.encoded)) + if err != nil { + t.Errorf("unexpected error '%v' (%v)", err, item.encoded) + } else if e, a := item.obj, gotDecoded; !reflect.DeepEqual(e, a) { + t.Errorf("%d: unexpected objects:\n%s", i, diff.ObjectGoPrintSideBySide(e, a)) + } + } +} + +func TestExtensionMapping(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "testExternal"} + + scheme := runtime.NewScheme() + scheme.AddKnownTypeWithName(internalGV.WithKind("ExtensionType"), &runtimetesting.InternalExtensionType{}) + scheme.AddKnownTypeWithName(internalGV.WithKind("OptionalExtensionType"), &runtimetesting.InternalOptionalExtensionType{}) + scheme.AddKnownTypeWithName(externalGV.WithKind("ExtensionType"), &runtimetesting.ExternalExtensionType{}) + scheme.AddKnownTypeWithName(externalGV.WithKind("OptionalExtensionType"), &runtimetesting.ExternalOptionalExtensionType{}) + + // register external first when the object is the same in both schemes, so ObjectVersionAndKind reports the + // external version. + scheme.AddKnownTypeWithName(externalGV.WithKind("A"), &runtimetesting.ExtensionA{}) + scheme.AddKnownTypeWithName(externalGV.WithKind("B"), &runtimetesting.ExtensionB{}) + scheme.AddKnownTypeWithName(internalGV.WithKind("A"), &runtimetesting.ExtensionA{}) + scheme.AddKnownTypeWithName(internalGV.WithKind("B"), &runtimetesting.ExtensionB{}) + + codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) + + table := []struct { + obj runtime.Object + expected runtime.Object + encoded string + }{ + { + &runtimetesting.InternalExtensionType{ + Extension: runtime.NewEncodable(codec, &runtimetesting.ExtensionA{TestString: "foo"}), + }, + &runtimetesting.InternalExtensionType{ + Extension: &runtime.Unknown{ + Raw: []byte(`{"apiVersion":"test.group/testExternal","kind":"A","testString":"foo"}`), + ContentType: runtime.ContentTypeJSON, + }, + }, + // apiVersion is set in the serialized object for easier consumption by clients + `{"apiVersion":"` + externalGV.String() + `","kind":"ExtensionType","extension":{"apiVersion":"test.group/testExternal","kind":"A","testString":"foo"}} +`, + }, { + &runtimetesting.InternalExtensionType{Extension: runtime.NewEncodable(codec, &runtimetesting.ExtensionB{TestString: "bar"})}, + &runtimetesting.InternalExtensionType{ + Extension: &runtime.Unknown{ + Raw: []byte(`{"apiVersion":"test.group/testExternal","kind":"B","testString":"bar"}`), + ContentType: runtime.ContentTypeJSON, + }, + }, + // apiVersion is set in the serialized object for easier consumption by clients + `{"apiVersion":"` + externalGV.String() + `","kind":"ExtensionType","extension":{"apiVersion":"test.group/testExternal","kind":"B","testString":"bar"}} +`, + }, { + &runtimetesting.InternalExtensionType{Extension: nil}, + &runtimetesting.InternalExtensionType{ + Extension: nil, + }, + `{"apiVersion":"` + externalGV.String() + `","kind":"ExtensionType","extension":null} +`, + }, + } + + for i, item := range table { + gotEncoded, err := runtime.Encode(codec, item.obj) + if err != nil { + t.Errorf("unexpected error '%v' (%#v)", err, item.obj) + } else if e, a := item.encoded, string(gotEncoded); e != a { + t.Errorf("expected\n%#v\ngot\n%#v\n", e, a) + } + + gotDecoded, err := runtime.Decode(codec, []byte(item.encoded)) + if err != nil { + t.Errorf("unexpected error '%v' (%v)", err, item.encoded) + } else if e, a := item.expected, gotDecoded; !reflect.DeepEqual(e, a) { + t.Errorf("%d: unexpected objects:\n%s", i, diff.ObjectGoPrintSideBySide(e, a)) + } + } +} + +func TestEncode(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + internalGVK := internalGV.WithKind("Simple") + externalGV := schema.GroupVersion{Group: "test.group", Version: "testExternal"} + externalGVK := externalGV.WithKind("Simple") + + scheme := runtime.NewScheme() + scheme.AddKnownTypeWithName(internalGVK, &runtimetesting.InternalSimple{}) + scheme.AddKnownTypeWithName(externalGVK, &runtimetesting.ExternalSimple{}) + + codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) + + test := &runtimetesting.InternalSimple{ + TestString: "I'm the same", + } + obj := runtime.Object(test) + data, err := runtime.Encode(codec, obj) + obj2, gvk, err2 := codec.Decode(data, nil, nil) + if err != nil || err2 != nil { + t.Fatalf("Failure: '%v' '%v'", err, err2) + } + if _, ok := obj2.(*runtimetesting.InternalSimple); !ok { + t.Fatalf("Got wrong type") + } + if !reflect.DeepEqual(obj2, test) { + t.Errorf("Expected:\n %#v,\n Got:\n %#v", test, obj2) + } + if *gvk != externalGVK { + t.Errorf("unexpected gvk returned by decode: %#v", *gvk) + } +} + +func TestUnversionedTypes(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + internalGVK := internalGV.WithKind("Simple") + externalGV := schema.GroupVersion{Group: "test.group", Version: "testExternal"} + externalGVK := externalGV.WithKind("Simple") + otherGV := schema.GroupVersion{Group: "group", Version: "other"} + + scheme := runtime.NewScheme() + scheme.AddUnversionedTypes(externalGV, &runtimetesting.InternalSimple{}) + scheme.AddKnownTypeWithName(internalGVK, &runtimetesting.InternalSimple{}) + scheme.AddKnownTypeWithName(externalGVK, &runtimetesting.ExternalSimple{}) + scheme.AddKnownTypeWithName(otherGV.WithKind("Simple"), &runtimetesting.ExternalSimple{}) + + codec := serializer.NewCodecFactory(scheme).LegacyCodec(externalGV) + + if unv, ok := scheme.IsUnversioned(&runtimetesting.InternalSimple{}); !unv || !ok { + t.Fatalf("type not unversioned and in scheme: %t %t", unv, ok) + } + + kinds, _, err := scheme.ObjectKinds(&runtimetesting.InternalSimple{}) + if err != nil { + t.Fatal(err) + } + kind := kinds[0] + if kind != externalGV.WithKind("InternalSimple") { + t.Fatalf("unexpected: %#v", kind) + } + + test := &runtimetesting.InternalSimple{ + TestString: "I'm the same", + } + obj := runtime.Object(test) + data, err := runtime.Encode(codec, obj) + if err != nil { + t.Fatal(err) + } + obj2, gvk, err := codec.Decode(data, nil, nil) + if err != nil { + t.Fatal(err) + } + if _, ok := obj2.(*runtimetesting.InternalSimple); !ok { + t.Fatalf("Got wrong type") + } + if !reflect.DeepEqual(obj2, test) { + t.Errorf("Expected:\n %#v,\n Got:\n %#v", test, obj2) + } + // object is serialized as an unversioned object (in the group and version it was defined in) + if *gvk != externalGV.WithKind("InternalSimple") { + t.Errorf("unexpected gvk returned by decode: %#v", *gvk) + } + + // when serialized to a different group, the object is kept in its preferred name + codec = serializer.NewCodecFactory(scheme).LegacyCodec(otherGV) + data, err = runtime.Encode(codec, obj) + if err != nil { + t.Fatal(err) + } + if string(data) != `{"apiVersion":"test.group/testExternal","kind":"InternalSimple","testString":"I'm the same"}`+"\n" { + t.Errorf("unexpected data: %s", data) + } +} + +// Returns a new Scheme set up with the test objects. +func GetTestScheme() *runtime.Scheme { + internalGV := schema.GroupVersion{Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Version: "v1"} + alternateExternalGV := schema.GroupVersion{Group: "custom", Version: "v1"} + alternateInternalGV := schema.GroupVersion{Group: "custom", Version: runtime.APIVersionInternal} + differentExternalGV := schema.GroupVersion{Group: "other", Version: "v2"} + + s := runtime.NewScheme() + // Ordinarily, we wouldn't add TestType2, but because this is a test and + // both types are from the same package, we need to get it into the system + // so that converter will match it with ExternalType2. + s.AddKnownTypes(internalGV, &runtimetesting.TestType1{}, &runtimetesting.TestType2{}, &runtimetesting.ExternalInternalSame{}) + s.AddKnownTypes(externalGV, &runtimetesting.ExternalInternalSame{}) + s.AddKnownTypeWithName(externalGV.WithKind("TestType1"), &runtimetesting.ExternalTestType1{}) + s.AddKnownTypeWithName(externalGV.WithKind("TestType2"), &runtimetesting.ExternalTestType2{}) + s.AddKnownTypeWithName(internalGV.WithKind("TestType3"), &runtimetesting.TestType1{}) + s.AddKnownTypeWithName(externalGV.WithKind("TestType3"), &runtimetesting.ExternalTestType1{}) + s.AddKnownTypeWithName(externalGV.WithKind("TestType4"), &runtimetesting.ExternalTestType1{}) + s.AddKnownTypeWithName(alternateInternalGV.WithKind("TestType3"), &runtimetesting.TestType1{}) + s.AddKnownTypeWithName(alternateExternalGV.WithKind("TestType3"), &runtimetesting.ExternalTestType1{}) + s.AddKnownTypeWithName(alternateExternalGV.WithKind("TestType5"), &runtimetesting.ExternalTestType1{}) + s.AddKnownTypeWithName(differentExternalGV.WithKind("TestType1"), &runtimetesting.ExternalTestType1{}) + s.AddUnversionedTypes(externalGV, &runtimetesting.UnversionedType{}) + + utilruntime.Must(s.AddConversionFuncs(func(in *runtimetesting.TestType1, out *runtimetesting.ExternalTestType1, s conversion.Scope) error { + out.A = in.A + return nil + })) + return s +} + +func TestKnownTypes(t *testing.T) { + s := GetTestScheme() + if len(s.KnownTypes(schema.GroupVersion{Group: "group", Version: "v2"})) != 0 { + t.Errorf("should have no known types for v2") + } + + types := s.KnownTypes(schema.GroupVersion{Version: "v1"}) + for _, s := range []string{"TestType1", "TestType2", "TestType3", "ExternalInternalSame"} { + if _, ok := types[s]; !ok { + t.Errorf("missing type %q", s) + } + } +} + +func TestAddKnownTypesIdemPotent(t *testing.T) { + s := runtime.NewScheme() + + gv := schema.GroupVersion{Group: "foo", Version: "v1"} + s.AddKnownTypes(gv, &runtimetesting.InternalSimple{}) + s.AddKnownTypes(gv, &runtimetesting.InternalSimple{}) + if len(s.KnownTypes(gv)) != 1 { + t.Errorf("expected only one %v type after double registration", gv) + } + if len(s.AllKnownTypes()) != 1 { + t.Errorf("expected only one type after double registration") + } + + s.AddKnownTypeWithName(gv.WithKind("InternalSimple"), &runtimetesting.InternalSimple{}) + s.AddKnownTypeWithName(gv.WithKind("InternalSimple"), &runtimetesting.InternalSimple{}) + if len(s.KnownTypes(gv)) != 1 { + t.Errorf("expected only one %v type after double registration with custom name", gv) + } + if len(s.AllKnownTypes()) != 1 { + t.Errorf("expected only one type after double registration with custom name") + } + + s.AddUnversionedTypes(gv, &runtimetesting.InternalSimple{}) + s.AddUnversionedTypes(gv, &runtimetesting.InternalSimple{}) + if len(s.KnownTypes(gv)) != 1 { + t.Errorf("expected only one %v type after double registration with custom name", gv) + } + if len(s.AllKnownTypes()) != 1 { + t.Errorf("expected only one type after double registration with custom name") + } + + kinds, _, err := s.ObjectKinds(&runtimetesting.InternalSimple{}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if len(kinds) != 1 { + t.Errorf("expected only one kind for InternalSimple after double registration") + } +} + +// redefine InternalSimple with the same name, but obviously as a different type than in runtimetesting +type InternalSimple struct { + runtime.TypeMeta `json:",inline"` + TestString string `json:"testString"` +} + +func (s *InternalSimple) DeepCopyObject() runtime.Object { return nil } + +func TestConflictingAddKnownTypes(t *testing.T) { + s := runtime.NewScheme() + gv := schema.GroupVersion{Group: "foo", Version: "v1"} + + panicked := make(chan bool) + go func() { + defer func() { + if recover() != nil { + panicked <- true + } + }() + s.AddKnownTypeWithName(gv.WithKind("InternalSimple"), &runtimetesting.InternalSimple{}) + s.AddKnownTypeWithName(gv.WithKind("InternalSimple"), &runtimetesting.ExternalSimple{}) + panicked <- false + }() + if !<-panicked { + t.Errorf("Expected AddKnownTypesWithName to panic with conflicting type registrations") + } + + go func() { + defer func() { + if recover() != nil { + panicked <- true + } + }() + + s.AddUnversionedTypes(gv, &runtimetesting.InternalSimple{}) + s.AddUnversionedTypes(gv, &InternalSimple{}) + panicked <- false + }() + if !<-panicked { + t.Errorf("Expected AddUnversionedTypes to panic with conflicting type registrations") + } +} + +func TestConvertToVersionBasic(t *testing.T) { + s := GetTestScheme() + tt := &runtimetesting.TestType1{A: "I'm not a pointer object"} + other, err := s.ConvertToVersion(tt, schema.GroupVersion{Version: "v1"}) + if err != nil { + t.Fatalf("Failure: %v", err) + } + converted, ok := other.(*runtimetesting.ExternalTestType1) + if !ok { + t.Fatalf("Got wrong type: %T", other) + } + if tt.A != converted.A { + t.Fatalf("Failed to convert object correctly: %#v", converted) + } +} + +type testGroupVersioner struct { + target schema.GroupVersionKind + ok bool +} + +func (m testGroupVersioner) KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (schema.GroupVersionKind, bool) { + return m.target, m.ok +} + +func TestConvertToVersion(t *testing.T) { + testCases := []struct { + scheme *runtime.Scheme + in runtime.Object + gv runtime.GroupVersioner + same bool + out runtime.Object + errFn func(error) bool + }{ + // errors if the type is not registered in the scheme + { + scheme: GetTestScheme(), + in: &runtimetesting.UnknownType{}, + errFn: func(err error) bool { return err != nil && runtime.IsNotRegisteredError(err) }, + }, + // errors if the group versioner returns no target + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: testGroupVersioner{}, + errFn: func(err error) bool { + return err != nil && strings.Contains(err.Error(), "is not suitable for converting") + }, + }, + // converts to internal + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: schema.GroupVersion{Version: runtime.APIVersionInternal}, + out: &runtimetesting.TestType1{A: "test"}, + }, + // converts from unstructured to internal + { + scheme: GetTestScheme(), + in: &runtimetesting.Unstructured{Object: map[string]interface{}{ + "apiVersion": "custom/v1", + "kind": "TestType3", + "A": "test", + }}, + gv: schema.GroupVersion{Version: runtime.APIVersionInternal}, + out: &runtimetesting.TestType1{A: "test"}, + }, + // converts from unstructured to external + { + scheme: GetTestScheme(), + in: &runtimetesting.Unstructured{Object: map[string]interface{}{ + "apiVersion": "custom/v1", + "kind": "TestType3", + "A": "test", + }}, + gv: schema.GroupVersion{Group: "custom", Version: "v1"}, + out: &runtimetesting.ExternalTestType1{MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "custom/v1", ObjectKind: "TestType3"}, A: "test"}, + }, + // prefers the best match + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: schema.GroupVersions{{Version: runtime.APIVersionInternal}, {Version: "v1"}}, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // unversioned type returned as-is + { + scheme: GetTestScheme(), + in: &runtimetesting.UnversionedType{A: "test"}, + gv: schema.GroupVersions{{Version: "v1"}}, + same: true, + out: &runtimetesting.UnversionedType{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "UnversionedType"}, + A: "test", + }, + }, + // unversioned type returned when not included in the target types + { + scheme: GetTestScheme(), + in: &runtimetesting.UnversionedType{A: "test"}, + gv: schema.GroupVersions{{Group: "other", Version: "v2"}}, + same: true, + out: &runtimetesting.UnversionedType{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "UnversionedType"}, + A: "test", + }, + }, + // detected as already being in the target version + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: schema.GroupVersions{{Version: "v1"}}, + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // detected as already being in the first target version + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: schema.GroupVersions{{Version: "v1"}, {Version: runtime.APIVersionInternal}}, + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // detected as already being in the first target version + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: schema.GroupVersions{{Version: "v1"}, {Version: runtime.APIVersionInternal}}, + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // the external type is registered in multiple groups, versions, and kinds, and can be targeted to all of them (1/3): different kind + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: testGroupVersioner{ok: true, target: schema.GroupVersionKind{Kind: "TestType3", Version: "v1"}}, + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType3"}, + A: "test", + }, + }, + // the external type is registered in multiple groups, versions, and kinds, and can be targeted to all of them (2/3): different gv + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: testGroupVersioner{ok: true, target: schema.GroupVersionKind{Kind: "TestType3", Group: "custom", Version: "v1"}}, + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "custom/v1", ObjectKind: "TestType3"}, + A: "test", + }, + }, + // the external type is registered in multiple groups, versions, and kinds, and can be targeted to all of them (3/3): different gvk + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: testGroupVersioner{ok: true, target: schema.GroupVersionKind{Group: "custom", Version: "v1", Kind: "TestType5"}}, + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "custom/v1", ObjectKind: "TestType5"}, + A: "test", + }, + }, + // multi group versioner recognizes multiple groups and forces the output to a particular version, copies because version differs + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: runtime.NewMultiGroupVersioner(schema.GroupVersion{Group: "other", Version: "v2"}, schema.GroupKind{Group: "custom", Kind: "TestType3"}, schema.GroupKind{Kind: "TestType1"}), + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "other/v2", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // multi group versioner recognizes multiple groups and forces the output to a particular version, copies because version differs + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: runtime.NewMultiGroupVersioner(schema.GroupVersion{Group: "other", Version: "v2"}, schema.GroupKind{Kind: "TestType1"}, schema.GroupKind{Group: "custom", Kind: "TestType3"}), + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "other/v2", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // multi group versioner is unable to find a match when kind AND group don't match (there is no TestType1 kind in group "other", and no kind "TestType5" in the default group) + { + scheme: GetTestScheme(), + in: &runtimetesting.TestType1{A: "test"}, + gv: runtime.NewMultiGroupVersioner(schema.GroupVersion{Group: "custom", Version: "v1"}, schema.GroupKind{Group: "other"}, schema.GroupKind{Kind: "TestType5"}), + errFn: func(err error) bool { + return err != nil && strings.Contains(err.Error(), "is not suitable for converting") + }, + }, + // multi group versioner recognizes multiple groups and forces the output to a particular version, performs no copy + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: runtime.NewMultiGroupVersioner(schema.GroupVersion{Group: "", Version: "v1"}, schema.GroupKind{Group: "custom", Kind: "TestType3"}, schema.GroupKind{Kind: "TestType1"}), + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // multi group versioner recognizes multiple groups and forces the output to a particular version, performs no copy + { + scheme: GetTestScheme(), + in: &runtimetesting.ExternalTestType1{A: "test"}, + gv: runtime.NewMultiGroupVersioner(schema.GroupVersion{Group: "", Version: "v1"}, schema.GroupKind{Kind: "TestType1"}, schema.GroupKind{Group: "custom", Kind: "TestType3"}), + same: true, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType1"}, + A: "test", + }, + }, + // group versioner can choose a particular target kind for a given input when kind is the same across group versions + { + scheme: GetTestScheme(), + in: &runtimetesting.TestType1{A: "test"}, + gv: testGroupVersioner{ok: true, target: schema.GroupVersionKind{Version: "v1", Kind: "TestType3"}}, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "v1", ObjectKind: "TestType3"}, + A: "test", + }, + }, + // group versioner can choose a different kind + { + scheme: GetTestScheme(), + in: &runtimetesting.TestType1{A: "test"}, + gv: testGroupVersioner{ok: true, target: schema.GroupVersionKind{Kind: "TestType5", Group: "custom", Version: "v1"}}, + out: &runtimetesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: runtimetesting.MyWeirdCustomEmbeddedVersionKindField{APIVersion: "custom/v1", ObjectKind: "TestType5"}, + A: "test", + }, + }, + } + for i, test := range testCases { + t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { + original := test.in.DeepCopyObject() + out, err := test.scheme.ConvertToVersion(test.in, test.gv) + switch { + case test.errFn != nil: + if !test.errFn(err) { + t.Fatalf("unexpected error: %v", err) + } + return + case err != nil: + t.Fatalf("unexpected error: %v", err) + } + if out == test.in { + t.Fatalf("ConvertToVersion should always copy out: %#v", out) + } + + if test.same { + if !reflect.DeepEqual(original, test.in) { + t.Fatalf("unexpected mutation of input: %s", diff.ObjectReflectDiff(original, test.in)) + } + if !reflect.DeepEqual(out, test.out) { + t.Fatalf("unexpected out: %s", diff.ObjectReflectDiff(out, test.out)) + } + unsafe, err := test.scheme.UnsafeConvertToVersion(test.in, test.gv) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(unsafe, test.out) { + t.Fatalf("unexpected unsafe: %s", diff.ObjectReflectDiff(unsafe, test.out)) + } + if unsafe != test.in { + t.Fatalf("UnsafeConvertToVersion should return same object: %#v", unsafe) + } + return + } + if !reflect.DeepEqual(out, test.out) { + t.Fatalf("unexpected out: %s", diff.ObjectReflectDiff(out, test.out)) + } + }) + } +} + +func TestConvert(t *testing.T) { + testCases := []struct { + scheme *runtime.Scheme + in runtime.Object + into runtime.Object + gv runtime.GroupVersioner + out runtime.Object + errFn func(error) bool + }{ + // converts from internal to unstructured, given a target version + { + scheme: GetTestScheme(), + in: &runtimetesting.TestType1{A: "test"}, + into: &runtimetesting.Unstructured{}, + out: &runtimetesting.Unstructured{Object: map[string]interface{}{ + "myVersionKey": "custom/v1", + "myKindKey": "TestType3", + "A": "test", + }}, + gv: schema.GroupVersion{Group: "custom", Version: "v1"}, + }, + } + for i, test := range testCases { + t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { + err := test.scheme.Convert(test.in, test.into, test.gv) + switch { + case test.errFn != nil: + if !test.errFn(err) { + t.Fatalf("unexpected error: %v", err) + } + return + case err != nil: + t.Fatalf("unexpected error: %v", err) + return + } + + if !reflect.DeepEqual(test.into, test.out) { + t.Fatalf("unexpected out: %s", diff.ObjectReflectDiff(test.into, test.out)) + } + }) + } +} + +func TestMetaValues(t *testing.T) { + internalGV := schema.GroupVersion{Group: "test.group", Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Group: "test.group", Version: "externalVersion"} + + s := runtime.NewScheme() + s.AddKnownTypeWithName(internalGV.WithKind("Simple"), &runtimetesting.InternalSimple{}) + s.AddKnownTypeWithName(externalGV.WithKind("Simple"), &runtimetesting.ExternalSimple{}) + + internalToExternalCalls := 0 + externalToInternalCalls := 0 + + // Register functions to verify that scope.Meta() gets set correctly. + err := s.AddConversionFuncs( + func(in *runtimetesting.InternalSimple, out *runtimetesting.ExternalSimple, scope conversion.Scope) error { + t.Logf("internal -> external") + scope.Convert(&in.TestString, &out.TestString, 0) + internalToExternalCalls++ + return nil + }, + func(in *runtimetesting.ExternalSimple, out *runtimetesting.InternalSimple, scope conversion.Scope) error { + t.Logf("external -> internal") + scope.Convert(&in.TestString, &out.TestString, 0) + externalToInternalCalls++ + return nil + }, + ) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + simple := &runtimetesting.InternalSimple{ + TestString: "foo", + } + + s.Log(t) + + out, err := s.ConvertToVersion(simple, externalGV) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + internal, err := s.ConvertToVersion(out, internalGV) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if e, a := simple, internal; !reflect.DeepEqual(e, a) { + t.Errorf("Expected:\n %#v,\n Got:\n %#v", e, a) + } + + if e, a := 1, internalToExternalCalls; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + if e, a := 1, externalToInternalCalls; e != a { + t.Errorf("Expected %v, got %v", e, a) + } +} + +func TestMetaValuesUnregisteredConvert(t *testing.T) { + type InternalSimple struct { + Version string `json:"apiVersion,omitempty"` + Kind string `json:"kind,omitempty"` + TestString string `json:"testString"` + } + type ExternalSimple struct { + Version string `json:"apiVersion,omitempty"` + Kind string `json:"kind,omitempty"` + TestString string `json:"testString"` + } + s := runtime.NewScheme() + // We deliberately don't register the types. + + internalToExternalCalls := 0 + + // Register functions to verify that scope.Meta() gets set correctly. + err := s.AddConversionFuncs( + func(in *InternalSimple, out *ExternalSimple, scope conversion.Scope) error { + scope.Convert(&in.TestString, &out.TestString, 0) + internalToExternalCalls++ + return nil + }, + ) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + simple := &InternalSimple{TestString: "foo"} + external := &ExternalSimple{} + err = s.Convert(simple, external, nil) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if e, a := simple.TestString, external.TestString; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + + // Verify that our conversion handler got called. + if e, a := 1, internalToExternalCalls; e != a { + t.Errorf("Expected %v, got %v", e, a) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD index 663050b2..05764c34 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD @@ -14,16 +14,16 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/testing:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) @@ -34,14 +34,15 @@ go_library( "negotiated_codec.go", "protobuf_extension.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer", importpath = "k8s.io/apimachinery/pkg/runtime/serializer", deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_test.go new file mode 100644 index 00000000..d27da113 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_test.go @@ -0,0 +1,339 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 serializer + +import ( + "encoding/json" + "fmt" + "log" + "os" + "reflect" + "strings" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + serializertesting "k8s.io/apimachinery/pkg/runtime/serializer/testing" + "k8s.io/apimachinery/pkg/util/diff" + + "github.com/ghodss/yaml" + "github.com/google/gofuzz" + flag "github.com/spf13/pflag" +) + +var fuzzIters = flag.Int("fuzz-iters", 50, "How many fuzzing iterations to do.") + +type testMetaFactory struct{} + +func (testMetaFactory) Interpret(data []byte) (*schema.GroupVersionKind, error) { + findKind := struct { + APIVersion string `json:"myVersionKey,omitempty"` + ObjectKind string `json:"myKindKey,omitempty"` + }{} + // yaml is a superset of json, so we use it to decode here. That way, + // we understand both. + if err := yaml.Unmarshal(data, &findKind); err != nil { + return nil, fmt.Errorf("couldn't get version/kind: %v", err) + } + gv, err := schema.ParseGroupVersion(findKind.APIVersion) + if err != nil { + return nil, err + } + return &schema.GroupVersionKind{Group: gv.Group, Version: gv.Version, Kind: findKind.ObjectKind}, nil +} + +// TestObjectFuzzer can randomly populate all the above objects. +var TestObjectFuzzer = fuzz.New().NilChance(.5).NumElements(1, 100).Funcs( + func(j *serializertesting.MyWeirdCustomEmbeddedVersionKindField, c fuzz.Continue) { + c.FuzzNoCustom(j) + j.APIVersion = "" + j.ObjectKind = "" + }, +) + +// Returns a new Scheme set up with the test objects. +func GetTestScheme() (*runtime.Scheme, runtime.Codec) { + internalGV := schema.GroupVersion{Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Version: "v1"} + externalGV2 := schema.GroupVersion{Version: "v2"} + + s := runtime.NewScheme() + // Ordinarily, we wouldn't add TestType2, but because this is a test and + // both types are from the same package, we need to get it into the system + // so that converter will match it with ExternalType2. + s.AddKnownTypes(internalGV, &serializertesting.TestType1{}, &serializertesting.TestType2{}, &serializertesting.ExternalInternalSame{}) + s.AddKnownTypes(externalGV, &serializertesting.ExternalInternalSame{}) + s.AddKnownTypeWithName(externalGV.WithKind("TestType1"), &serializertesting.ExternalTestType1{}) + s.AddKnownTypeWithName(externalGV.WithKind("TestType2"), &serializertesting.ExternalTestType2{}) + s.AddKnownTypeWithName(internalGV.WithKind("TestType3"), &serializertesting.TestType1{}) + s.AddKnownTypeWithName(externalGV.WithKind("TestType3"), &serializertesting.ExternalTestType1{}) + s.AddKnownTypeWithName(externalGV2.WithKind("TestType1"), &serializertesting.ExternalTestType1{}) + + s.AddUnversionedTypes(externalGV, &metav1.Status{}) + + cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})) + codec := cf.LegacyCodec(schema.GroupVersion{Version: "v1"}) + return s, codec +} + +var semantic = conversion.EqualitiesOrDie( + func(a, b serializertesting.MyWeirdCustomEmbeddedVersionKindField) bool { + a.APIVersion, a.ObjectKind = "", "" + b.APIVersion, b.ObjectKind = "", "" + return a == b + }, +) + +func runTest(t *testing.T, source interface{}) { + name := reflect.TypeOf(source).Elem().Name() + TestObjectFuzzer.Fuzz(source) + + _, codec := GetTestScheme() + data, err := runtime.Encode(codec, source.(runtime.Object)) + if err != nil { + t.Errorf("%v: %v (%#v)", name, err, source) + return + } + obj2, err := runtime.Decode(codec, data) + if err != nil { + t.Errorf("%v: %v (%v)", name, err, string(data)) + return + } + if !semantic.DeepEqual(source, obj2) { + t.Errorf("1: %v: diff: %v", name, diff.ObjectGoPrintSideBySide(source, obj2)) + return + } + obj3 := reflect.New(reflect.TypeOf(source).Elem()).Interface() + if err := runtime.DecodeInto(codec, data, obj3.(runtime.Object)); err != nil { + t.Errorf("2: %v: %v", name, err) + return + } + if !semantic.DeepEqual(source, obj3) { + t.Errorf("3: %v: diff: %v", name, diff.ObjectDiff(source, obj3)) + return + } +} + +func TestTypes(t *testing.T) { + table := []interface{}{ + &serializertesting.TestType1{}, + &serializertesting.ExternalInternalSame{}, + } + for _, item := range table { + // Try a few times, since runTest uses random values. + for i := 0; i < *fuzzIters; i++ { + runTest(t, item) + } + } +} + +func TestVersionedEncoding(t *testing.T) { + s, _ := GetTestScheme() + cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})) + info, _ := runtime.SerializerInfoForMediaType(cf.SupportedMediaTypes(), runtime.ContentTypeJSON) + encoder := info.Serializer + + codec := cf.CodecForVersions(encoder, nil, schema.GroupVersion{Version: "v2"}, nil) + out, err := runtime.Encode(codec, &serializertesting.TestType1{}) + if err != nil { + t.Fatal(err) + } + if string(out) != `{"myVersionKey":"v2","myKindKey":"TestType1"}`+"\n" { + t.Fatal(string(out)) + } + + codec = cf.CodecForVersions(encoder, nil, schema.GroupVersion{Version: "v3"}, nil) + _, err = runtime.Encode(codec, &serializertesting.TestType1{}) + if err == nil { + t.Fatal(err) + } + + // unversioned encode with no versions is written directly to wire + codec = cf.CodecForVersions(encoder, nil, runtime.InternalGroupVersioner, nil) + out, err = runtime.Encode(codec, &serializertesting.TestType1{}) + if err != nil { + t.Fatal(err) + } + if string(out) != `{}`+"\n" { + t.Fatal(string(out)) + } +} + +func TestMultipleNames(t *testing.T) { + _, codec := GetTestScheme() + + obj, _, err := codec.Decode([]byte(`{"myKindKey":"TestType3","myVersionKey":"v1","A":"value"}`), nil, nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + internal := obj.(*serializertesting.TestType1) + if internal.A != "value" { + t.Fatalf("unexpected decoded object: %#v", internal) + } + + out, err := runtime.Encode(codec, internal) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !strings.Contains(string(out), `"myKindKey":"TestType1"`) { + t.Errorf("unexpected encoded output: %s", string(out)) + } +} + +func TestConvertTypesWhenDefaultNamesMatch(t *testing.T) { + internalGV := schema.GroupVersion{Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Version: "v1"} + + s := runtime.NewScheme() + // create two names internally, with TestType1 being preferred + s.AddKnownTypeWithName(internalGV.WithKind("TestType1"), &serializertesting.TestType1{}) + s.AddKnownTypeWithName(internalGV.WithKind("OtherType1"), &serializertesting.TestType1{}) + // create two names externally, with TestType1 being preferred + s.AddKnownTypeWithName(externalGV.WithKind("TestType1"), &serializertesting.ExternalTestType1{}) + s.AddKnownTypeWithName(externalGV.WithKind("OtherType1"), &serializertesting.ExternalTestType1{}) + + ext := &serializertesting.ExternalTestType1{} + ext.APIVersion = "v1" + ext.ObjectKind = "OtherType1" + ext.A = "test" + data, err := json.Marshal(ext) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + expect := &serializertesting.TestType1{A: "test"} + + codec := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})).LegacyCodec(schema.GroupVersion{Version: "v1"}) + + obj, err := runtime.Decode(codec, data) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !semantic.DeepEqual(expect, obj) { + t.Errorf("unexpected object: %#v", obj) + } + + into := &serializertesting.TestType1{} + if err := runtime.DecodeInto(codec, data, into); err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !semantic.DeepEqual(expect, into) { + t.Errorf("unexpected object: %#v", obj) + } +} + +func TestEncode_Ptr(t *testing.T) { + _, codec := GetTestScheme() + tt := &serializertesting.TestType1{A: "I am a pointer object"} + data, err := runtime.Encode(codec, tt) + obj2, err2 := runtime.Decode(codec, data) + if err != nil || err2 != nil { + t.Fatalf("Failure: '%v' '%v'\n%s", err, err2, data) + } + if _, ok := obj2.(*serializertesting.TestType1); !ok { + t.Fatalf("Got wrong type") + } + if !semantic.DeepEqual(obj2, tt) { + t.Errorf("Expected:\n %#v,\n Got:\n %#v", tt, obj2) + } +} + +func TestBadJSONRejection(t *testing.T) { + log.SetOutput(os.Stderr) + _, codec := GetTestScheme() + badJSONs := [][]byte{ + []byte(`{"myVersionKey":"v1"}`), // Missing kind + []byte(`{"myVersionKey":"v1","myKindKey":"bar"}`), // Unknown kind + []byte(`{"myVersionKey":"bar","myKindKey":"TestType1"}`), // Unknown version + []byte(`{"myKindKey":"TestType1"}`), // Missing version + } + for _, b := range badJSONs { + if _, err := runtime.Decode(codec, b); err == nil { + t.Errorf("Did not reject bad json: %s", string(b)) + } + } + badJSONKindMismatch := []byte(`{"myVersionKey":"v1","myKindKey":"ExternalInternalSame"}`) + if err := runtime.DecodeInto(codec, badJSONKindMismatch, &serializertesting.TestType1{}); err == nil { + t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch) + } + if err := runtime.DecodeInto(codec, []byte(``), &serializertesting.TestType1{}); err != nil { + t.Errorf("Should allow empty decode: %v", err) + } + if _, _, err := codec.Decode([]byte(``), &schema.GroupVersionKind{Kind: "ExternalInternalSame"}, nil); err == nil { + t.Errorf("Did not give error for empty data with only kind default") + } + if _, _, err := codec.Decode([]byte(`{"myVersionKey":"v1"}`), &schema.GroupVersionKind{Kind: "ExternalInternalSame"}, nil); err != nil { + t.Errorf("Gave error for version and kind default") + } + if _, _, err := codec.Decode([]byte(`{"myKindKey":"ExternalInternalSame"}`), &schema.GroupVersionKind{Version: "v1"}, nil); err != nil { + t.Errorf("Gave error for version and kind default") + } + if _, _, err := codec.Decode([]byte(``), &schema.GroupVersionKind{Kind: "ExternalInternalSame", Version: "v1"}, nil); err != nil { + t.Errorf("Gave error for version and kind defaulted: %v", err) + } + if _, err := runtime.Decode(codec, []byte(``)); err == nil { + t.Errorf("Did not give error for empty data") + } +} + +// Returns a new Scheme set up with the test objects needed by TestDirectCodec. +func GetDirectCodecTestScheme() *runtime.Scheme { + internalGV := schema.GroupVersion{Version: runtime.APIVersionInternal} + externalGV := schema.GroupVersion{Version: "v1"} + + s := runtime.NewScheme() + // Ordinarily, we wouldn't add TestType2, but because this is a test and + // both types are from the same package, we need to get it into the system + // so that converter will match it with ExternalType2. + s.AddKnownTypes(internalGV, &serializertesting.TestType1{}) + s.AddKnownTypes(externalGV, &serializertesting.ExternalTestType1{}) + + s.AddUnversionedTypes(externalGV, &metav1.Status{}) + return s +} + +func TestDirectCodec(t *testing.T) { + s := GetDirectCodecTestScheme() + cf := newCodecFactory(s, newSerializersForScheme(s, testMetaFactory{})) + info, _ := runtime.SerializerInfoForMediaType(cf.SupportedMediaTypes(), runtime.ContentTypeJSON) + serializer := info.Serializer + df := DirectCodecFactory{cf} + ignoredGV, err := schema.ParseGroupVersion("ignored group/ignored version") + if err != nil { + t.Fatal(err) + } + directEncoder := df.EncoderForVersion(serializer, ignoredGV) + directDecoder := df.DecoderToVersion(serializer, ignoredGV) + out, err := runtime.Encode(directEncoder, &serializertesting.ExternalTestType1{}) + if err != nil { + t.Fatal(err) + } + if string(out) != `{"myVersionKey":"v1","myKindKey":"ExternalTestType1"}`+"\n" { + t.Fatal(string(out)) + } + a, _, err := directDecoder.Decode(out, nil, nil) + e := &serializertesting.ExternalTestType1{ + MyWeirdCustomEmbeddedVersionKindField: serializertesting.MyWeirdCustomEmbeddedVersionKindField{ + APIVersion: "v1", + ObjectKind: "ExternalTestType1", + }, + } + if !semantic.DeepEqual(e, a) { + t.Fatalf("expect %v, got %v", e, a) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD index 7be13ed4..4857211b 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD @@ -8,8 +8,16 @@ load( go_test( name = "go_default_test", - srcs = ["meta_test.go"], + srcs = [ + "json_test.go", + "meta_test.go", + ], embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + ], ) go_library( @@ -18,26 +26,17 @@ go_library( "json.go", "meta.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json", importpath = "k8s.io/apimachinery/pkg/runtime/serializer/json", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/framer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/json-iterator/go:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/framer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["json_test.go"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//vendor/github.com/modern-go/reflect2:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go index 068d3f70..382c4858 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go @@ -24,6 +24,7 @@ import ( "github.com/ghodss/yaml" jsoniter "github.com/json-iterator/go" + "github.com/modern-go/reflect2" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -68,43 +69,60 @@ type Serializer struct { var _ runtime.Serializer = &Serializer{} var _ recognizer.RecognizingDecoder = &Serializer{} -func init() { - // Force jsoniter to decode number to interface{} via ints, if possible. - decodeNumberAsInt64IfPossible := func(ptr unsafe.Pointer, iter *jsoniter.Iterator) { - switch iter.WhatIsNext() { - case jsoniter.NumberValue: - var number json.Number - iter.ReadVal(&number) - i64, err := strconv.ParseInt(string(number), 10, 64) - if err == nil { - *(*interface{})(ptr) = i64 - return - } - f64, err := strconv.ParseFloat(string(number), 64) - if err == nil { - *(*interface{})(ptr) = f64 - return - } - // Not much we can do here. - default: - *(*interface{})(ptr) = iter.Read() +type customNumberExtension struct { + jsoniter.DummyExtension +} + +func (cne *customNumberExtension) CreateDecoder(typ reflect2.Type) jsoniter.ValDecoder { + if typ.String() == "interface {}" { + return customNumberDecoder{} + } + return nil +} + +type customNumberDecoder struct { +} + +func (customNumberDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) { + switch iter.WhatIsNext() { + case jsoniter.NumberValue: + var number jsoniter.Number + iter.ReadVal(&number) + i64, err := strconv.ParseInt(string(number), 10, 64) + if err == nil { + *(*interface{})(ptr) = i64 + return + } + f64, err := strconv.ParseFloat(string(number), 64) + if err == nil { + *(*interface{})(ptr) = f64 + return } + iter.ReportError("DecodeNumber", err.Error()) + default: + *(*interface{})(ptr) = iter.Read() } - jsoniter.RegisterTypeDecoderFunc("interface {}", decodeNumberAsInt64IfPossible) } // CaseSensitiveJsonIterator returns a jsoniterator API that's configured to be // case-sensitive when unmarshalling, and otherwise compatible with // the encoding/json standard library. func CaseSensitiveJsonIterator() jsoniter.API { - return jsoniter.Config{ + config := jsoniter.Config{ EscapeHTML: true, SortMapKeys: true, ValidateJsonRawMessage: true, CaseSensitive: true, }.Froze() + // Force jsoniter to decode number to interface{} via int64/float64, if possible. + config.RegisterExtension(&customNumberExtension{}) + return config } +// Private copy of jsoniter to try to shield against possible mutations +// from outside. Still does not protect from package level jsoniter.Register*() functions - someone calling them +// in some other library will mess with every usage of the jsoniter library in the whole program. +// See https://github.com/json-iterator/go/issues/265 var caseSensitiveJsonIterator = CaseSensitiveJsonIterator() // gvkWithDefaults returns group kind and version defaulting from provided default @@ -255,7 +273,7 @@ func (jsonFramer) NewFrameReader(r io.ReadCloser) io.ReadCloser { return framer.NewJSONFramedReader(r) } -// Framer is the default JSON framing behavior, with newlines delimiting individual objects. +// YAMLFramer is the default JSON framing behavior, with newlines delimiting individual objects. var YAMLFramer = yamlFramer{} type yamlFramer struct{} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go new file mode 100644 index 00000000..7f358da6 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go @@ -0,0 +1,346 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 json_test + +import ( + "fmt" + "reflect" + "strings" + "testing" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/apimachinery/pkg/util/diff" +) + +type testDecodable struct { + Other string + Value int `json:"value"` + Spec DecodableSpec `json:"spec"` + Interface interface{} `json:"interface"` + gvk schema.GroupVersionKind +} + +// DecodableSpec has 15 fields. json-iterator treats struct with more than 10 +// fields differently from struct that has less than 10 fields. +type DecodableSpec struct { + A int `json:"A"` + B int `json:"B"` + C int `json:"C"` + D int `json:"D"` + E int `json:"E"` + F int `json:"F"` + G int `json:"G"` + H int `json:"h"` + I int `json:"i"` + J int `json:"j"` + K int `json:"k"` + L int `json:"l"` + M int `json:"m"` + N int `json:"n"` + O int `json:"o"` +} + +func (d *testDecodable) GetObjectKind() schema.ObjectKind { return d } +func (d *testDecodable) SetGroupVersionKind(gvk schema.GroupVersionKind) { d.gvk = gvk } +func (d *testDecodable) GroupVersionKind() schema.GroupVersionKind { return d.gvk } +func (d *testDecodable) DeepCopyObject() runtime.Object { + panic("testDecodable does not support DeepCopy") +} + +func TestDecode(t *testing.T) { + testCases := []struct { + creater runtime.ObjectCreater + typer runtime.ObjectTyper + yaml bool + pretty bool + + data []byte + defaultGVK *schema.GroupVersionKind + into runtime.Object + + errFn func(error) bool + expectedObject runtime.Object + expectedGVK *schema.GroupVersionKind + }{ + { + data: []byte("{}"), + + expectedGVK: &schema.GroupVersionKind{}, + errFn: func(err error) bool { return strings.Contains(err.Error(), "Object 'Kind' is missing in") }, + }, + { + data: []byte("{}"), + defaultGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + creater: &mockCreater{err: fmt.Errorf("fake error")}, + + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + errFn: func(err error) bool { return err.Error() == "fake error" }, + }, + { + data: []byte("{}"), + defaultGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + creater: &mockCreater{obj: &testDecodable{}}, + expectedObject: &testDecodable{}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + }, + + // version without group is not defaulted + { + data: []byte(`{"apiVersion":"blah"}`), + defaultGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + creater: &mockCreater{obj: &testDecodable{}}, + expectedObject: &testDecodable{}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "", Version: "blah"}, + }, + // group without version is defaulted + { + data: []byte(`{"apiVersion":"other/"}`), + defaultGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + creater: &mockCreater{obj: &testDecodable{}}, + expectedObject: &testDecodable{}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + }, + // group version, kind is defaulted + { + data: []byte(`{"apiVersion":"other1/blah1"}`), + defaultGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + creater: &mockCreater{obj: &testDecodable{}}, + expectedObject: &testDecodable{}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other1", Version: "blah1"}, + }, + // gvk all provided then not defaulted at all + { + data: []byte(`{"kind":"Test","apiVersion":"other/blah"}`), + defaultGVK: &schema.GroupVersionKind{Kind: "Test1", Group: "other1", Version: "blah1"}, + creater: &mockCreater{obj: &testDecodable{}}, + expectedObject: &testDecodable{}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + }, + //gvk defaulting if kind not provided in data and defaultGVK use into's kind + { + data: []byte(`{"apiVersion":"b1/c1"}`), + into: &testDecodable{gvk: schema.GroupVersionKind{Kind: "a3", Group: "b1", Version: "c1"}}, + typer: &mockTyper{gvk: &schema.GroupVersionKind{Kind: "a3", Group: "b1", Version: "c1"}}, + defaultGVK: nil, + creater: &mockCreater{obj: &testDecodable{}}, + expectedObject: &testDecodable{gvk: schema.GroupVersionKind{Kind: "a3", Group: "b1", Version: "c1"}}, + expectedGVK: &schema.GroupVersionKind{Kind: "a3", Group: "b1", Version: "c1"}, + }, + + // accept runtime.Unknown as into and bypass creator + { + data: []byte(`{}`), + into: &runtime.Unknown{}, + + expectedGVK: &schema.GroupVersionKind{}, + expectedObject: &runtime.Unknown{ + Raw: []byte(`{}`), + ContentType: runtime.ContentTypeJSON, + }, + }, + { + data: []byte(`{"test":"object"}`), + into: &runtime.Unknown{}, + + expectedGVK: &schema.GroupVersionKind{}, + expectedObject: &runtime.Unknown{ + Raw: []byte(`{"test":"object"}`), + ContentType: runtime.ContentTypeJSON, + }, + }, + { + data: []byte(`{"test":"object"}`), + into: &runtime.Unknown{}, + defaultGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &runtime.Unknown{ + TypeMeta: runtime.TypeMeta{APIVersion: "other/blah", Kind: "Test"}, + Raw: []byte(`{"test":"object"}`), + ContentType: runtime.ContentTypeJSON, + }, + }, + + // unregistered objects can be decoded into directly + { + data: []byte(`{"kind":"Test","apiVersion":"other/blah","value":1,"Other":"test"}`), + into: &testDecodable{}, + typer: &mockTyper{err: runtime.NewNotRegisteredErrForKind("mock", schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"})}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &testDecodable{ + Other: "test", + Value: 1, + }, + }, + // registered types get defaulted by the into object kind + { + data: []byte(`{"value":1,"Other":"test"}`), + into: &testDecodable{}, + typer: &mockTyper{gvk: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &testDecodable{ + Other: "test", + Value: 1, + }, + }, + // registered types get defaulted by the into object kind even without version, but return an error + { + data: []byte(`{"value":1,"Other":"test"}`), + into: &testDecodable{}, + typer: &mockTyper{gvk: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: ""}}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: ""}, + errFn: func(err error) bool { return strings.Contains(err.Error(), "Object 'apiVersion' is missing in") }, + expectedObject: &testDecodable{ + Other: "test", + Value: 1, + }, + }, + + // runtime.VersionedObjects are decoded + { + data: []byte(`{"value":1,"Other":"test"}`), + into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, + creater: &mockCreater{obj: &testDecodable{}}, + typer: &mockTyper{gvk: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}}, + defaultGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &runtime.VersionedObjects{ + Objects: []runtime.Object{ + &testDecodable{ + Other: "test", + Value: 1, + }, + }, + }, + }, + // runtime.VersionedObjects with an object are decoded into + { + data: []byte(`{"Other":"test"}`), + into: &runtime.VersionedObjects{Objects: []runtime.Object{&testDecodable{Value: 2}}}, + typer: &mockTyper{gvk: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &runtime.VersionedObjects{ + Objects: []runtime.Object{ + &testDecodable{ + Other: "test", + Value: 2, + }, + }, + }, + }, + // Error on invalid number + { + data: []byte(`{"kind":"Test","apiVersion":"other/blah","interface":1e1000}`), + creater: &mockCreater{obj: &testDecodable{}}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + errFn: func(err error) bool { + return strings.Contains(err.Error(), `json_test.testDecodable.Interface: DecodeNumber: strconv.ParseFloat: parsing "1e1000": value out of range`) + }, + }, + // Unmarshalling is case-sensitive + { + // "VaLue" should have been "value" + data: []byte(`{"kind":"Test","apiVersion":"other/blah","VaLue":1,"Other":"test"}`), + into: &testDecodable{}, + typer: &mockTyper{err: runtime.NewNotRegisteredErrForKind("mock", schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"})}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &testDecodable{ + Other: "test", + }, + }, + // Unmarshalling is case-sensitive for big struct. + { + // "b" should have been "B", "I" should have been "i" + data: []byte(`{"kind":"Test","apiVersion":"other/blah","spec": {"A": 1, "b": 2, "h": 3, "I": 4}}`), + into: &testDecodable{}, + typer: &mockTyper{err: runtime.NewNotRegisteredErrForKind("mock", schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"})}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &testDecodable{ + Spec: DecodableSpec{A: 1, H: 3}, + }, + }, + } + + for i, test := range testCases { + var s runtime.Serializer + if test.yaml { + s = json.NewYAMLSerializer(json.DefaultMetaFactory, test.creater, test.typer) + } else { + s = json.NewSerializer(json.DefaultMetaFactory, test.creater, test.typer, test.pretty) + } + obj, gvk, err := s.Decode([]byte(test.data), test.defaultGVK, test.into) + + if !reflect.DeepEqual(test.expectedGVK, gvk) { + t.Errorf("%d: unexpected GVK: %v", i, gvk) + } + + switch { + case err == nil && test.errFn != nil: + t.Errorf("%d: failed: %v", i, err) + continue + case err != nil && test.errFn == nil: + t.Errorf("%d: failed: %v", i, err) + continue + case err != nil: + if !test.errFn(err) { + t.Errorf("%d: failed: %v", i, err) + } + if obj != nil { + t.Errorf("%d: should have returned nil object", i) + } + continue + } + + if test.into != nil && test.into != obj { + t.Errorf("%d: expected into to be returned: %v", i, obj) + continue + } + + if !reflect.DeepEqual(test.expectedObject, obj) { + t.Errorf("%d: unexpected object:\n%s", i, diff.ObjectGoPrintSideBySide(test.expectedObject, obj)) + } + } +} + +type mockCreater struct { + apiVersion string + kind string + err error + obj runtime.Object +} + +func (c *mockCreater) New(kind schema.GroupVersionKind) (runtime.Object, error) { + c.apiVersion, c.kind = kind.GroupVersion().String(), kind.Kind + return c.obj, c.err +} + +type mockTyper struct { + gvk *schema.GroupVersionKind + err error +} + +func (t *mockTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) { + if t.gvk == nil { + return nil, false, t.err + } + return []schema.GroupVersionKind{*t.gvk}, false, t.err +} + +func (t *mockTyper) Recognizes(_ schema.GroupVersionKind) bool { + return false +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/meta_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/meta_test.go new file mode 100644 index 00000000..f4e34a22 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/meta_test.go @@ -0,0 +1,45 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 json + +import "testing" + +func TestSimpleMetaFactoryInterpret(t *testing.T) { + factory := SimpleMetaFactory{} + gvk, err := factory.Interpret([]byte(`{"apiVersion":"1","kind":"object"}`)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if gvk.Version != "1" || gvk.Kind != "object" { + t.Errorf("unexpected interpret: %#v", gvk) + } + + // no kind or version + gvk, err = factory.Interpret([]byte(`{}`)) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if gvk.Version != "" || gvk.Kind != "" { + t.Errorf("unexpected interpret: %#v", gvk) + } + + // unparsable + gvk, err = factory.Interpret([]byte(`{`)) + if err == nil { + t.Errorf("unexpected non-error") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD index 3eb91d86..6008b387 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD @@ -11,13 +11,15 @@ go_library( "doc.go", "protobuf.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf", importpath = "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/framer:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/framer:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go index 8d4ea711..b99ba25c 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go @@ -20,10 +20,12 @@ import ( "bytes" "fmt" "io" + "net/http" "reflect" "github.com/gogo/protobuf/proto" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer/recognizer" @@ -50,6 +52,15 @@ func (e errNotMarshalable) Error() string { return fmt.Sprintf("object %v does not implement the protobuf marshalling interface and cannot be encoded to a protobuf message", e.t) } +func (e errNotMarshalable) Status() metav1.Status { + return metav1.Status{ + Status: metav1.StatusFailure, + Code: http.StatusNotAcceptable, + Reason: metav1.StatusReason("NotAcceptable"), + Message: e.Error(), + } +} + func IsNotMarshalable(err error) bool { _, ok := err.(errNotMarshalable) return err != nil && ok diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD index de54abb3..1e923aec 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD @@ -8,10 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["recognizer.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer", importpath = "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go new file mode 100644 index 00000000..3bc9d13b --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go @@ -0,0 +1,91 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 serializer + +import ( + "testing" + + "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" +) + +type FakeV1Obj struct { + metav1.TypeMeta + metav1.ObjectMeta +} + +func (*FakeV1Obj) DeepCopyObject() runtime.Object { + panic("not supported") +} + +type FakeV2DifferentObj struct { + metav1.TypeMeta + metav1.ObjectMeta +} + +func (*FakeV2DifferentObj) DeepCopyObject() runtime.Object { + panic("not supported") +} +func TestSparse(t *testing.T) { + v1 := schema.GroupVersion{Group: "mygroup", Version: "v1"} + v2 := schema.GroupVersion{Group: "mygroup", Version: "v2"} + + scheme := runtime.NewScheme() + scheme.AddKnownTypes(v1, &FakeV1Obj{}) + scheme.AddKnownTypes(v2, &FakeV2DifferentObj{}) + codecs := NewCodecFactory(scheme) + + srcObj1 := &FakeV1Obj{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + srcObj2 := &FakeV2DifferentObj{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + + encoder := codecs.LegacyCodec(v2, v1) + decoder := codecs.UniversalDecoder(v2, v1) + + srcObj1Bytes, err := runtime.Encode(encoder, srcObj1) + if err != nil { + t.Fatal(err) + } + t.Log(string(srcObj1Bytes)) + srcObj2Bytes, err := runtime.Encode(encoder, srcObj2) + if err != nil { + t.Fatal(err) + } + t.Log(string(srcObj2Bytes)) + + uncastDstObj1, err := runtime.Decode(decoder, srcObj1Bytes) + if err != nil { + t.Fatal(err) + } + uncastDstObj2, err := runtime.Decode(decoder, srcObj2Bytes) + if err != nil { + t.Fatal(err) + } + + // clear typemeta + uncastDstObj1.(*FakeV1Obj).TypeMeta = metav1.TypeMeta{} + uncastDstObj2.(*FakeV2DifferentObj).TypeMeta = metav1.TypeMeta{} + + if !equality.Semantic.DeepEqual(srcObj1, uncastDstObj1) { + t.Fatal(diff.ObjectDiff(srcObj1, uncastDstObj1)) + } + if !equality.Semantic.DeepEqual(srcObj2, uncastDstObj2) { + t.Fatal(diff.ObjectDiff(srcObj2, uncastDstObj2)) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD index e0589fef..34563444 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD @@ -11,19 +11,20 @@ go_test( srcs = ["streaming_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/framer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/framer:go_default_library", ], ) go_library( name = "go_default_library", srcs = ["streaming.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming", importpath = "k8s.io/apimachinery/pkg/runtime/serializer/streaming", deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/streaming_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/streaming_test.go new file mode 100644 index 00000000..9cae6a32 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/streaming_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 streaming + +import ( + "bytes" + "io" + "io/ioutil" + "testing" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/framer" +) + +type fakeDecoder struct { + got []byte + obj runtime.Object + err error +} + +func (d *fakeDecoder) Decode(data []byte, gvk *schema.GroupVersionKind, into runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) { + d.got = data + return d.obj, nil, d.err +} + +func TestEmptyDecoder(t *testing.T) { + buf := bytes.NewBuffer([]byte{}) + d := &fakeDecoder{} + _, _, err := NewDecoder(ioutil.NopCloser(buf), d).Decode(nil, nil) + if err != io.EOF { + t.Fatal(err) + } +} + +func TestDecoder(t *testing.T) { + frames := [][]byte{ + make([]byte, 1025), + make([]byte, 1024*5), + make([]byte, 1024*1024*5), + make([]byte, 1025), + } + pr, pw := io.Pipe() + fw := framer.NewLengthDelimitedFrameWriter(pw) + go func() { + for i := range frames { + fw.Write(frames[i]) + } + pw.Close() + }() + + r := framer.NewLengthDelimitedFrameReader(pr) + d := &fakeDecoder{} + dec := NewDecoder(r, d) + if _, _, err := dec.Decode(nil, nil); err != nil || !bytes.Equal(d.got, frames[0]) { + t.Fatalf("unexpected %v %v", err, len(d.got)) + } + if _, _, err := dec.Decode(nil, nil); err != nil || !bytes.Equal(d.got, frames[1]) { + t.Fatalf("unexpected %v %v", err, len(d.got)) + } + if _, _, err := dec.Decode(nil, nil); err != ErrObjectTooLarge || !bytes.Equal(d.got, frames[1]) { + t.Fatalf("unexpected %v %v", err, len(d.got)) + } + if _, _, err := dec.Decode(nil, nil); err != nil || !bytes.Equal(d.got, frames[3]) { + t.Fatalf("unexpected %v %v", err, len(d.got)) + } + if _, _, err := dec.Decode(nil, nil); err != io.EOF { + t.Fatalf("unexpected %v %v", err, len(d.got)) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD index 95aa6d96..785dc5fc 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD @@ -11,20 +11,21 @@ go_test( srcs = ["versioning_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) go_library( name = "go_default_library", srcs = ["versioning.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning", importpath = "k8s.io/apimachinery/pkg/runtime/serializer/versioning", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go index 7716cc42..a5ae3ac4 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go @@ -24,18 +24,6 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" ) -// NewCodecForScheme is a convenience method for callers that are using a scheme. -func NewCodecForScheme( - // TODO: I should be a scheme interface? - scheme *runtime.Scheme, - encoder runtime.Encoder, - decoder runtime.Decoder, - encodeVersion runtime.GroupVersioner, - decodeVersion runtime.GroupVersioner, -) runtime.Codec { - return NewCodec(encoder, decoder, runtime.UnsafeObjectConvertor(scheme), scheme, scheme, nil, encodeVersion, decodeVersion) -} - // NewDefaultingCodecForScheme is a convenience method for callers that are using a scheme. func NewDefaultingCodecForScheme( // TODO: I should be a scheme interface? @@ -45,7 +33,7 @@ func NewDefaultingCodecForScheme( encodeVersion runtime.GroupVersioner, decodeVersion runtime.GroupVersioner, ) runtime.Codec { - return NewCodec(encoder, decoder, runtime.UnsafeObjectConvertor(scheme), scheme, scheme, scheme, encodeVersion, decodeVersion) + return NewCodec(encoder, decoder, runtime.UnsafeObjectConvertor(scheme), scheme, scheme, scheme, encodeVersion, decodeVersion, scheme.Name()) } // NewCodec takes objects in their internal versions and converts them to external versions before @@ -60,6 +48,7 @@ func NewCodec( defaulter runtime.ObjectDefaulter, encodeVersion runtime.GroupVersioner, decodeVersion runtime.GroupVersioner, + originalSchemeName string, ) runtime.Codec { internal := &codec{ encoder: encoder, @@ -71,6 +60,8 @@ func NewCodec( encodeVersion: encodeVersion, decodeVersion: decodeVersion, + + originalSchemeName: originalSchemeName, } return internal } @@ -85,6 +76,9 @@ type codec struct { encodeVersion runtime.GroupVersioner decodeVersion runtime.GroupVersioner + + // originalSchemeName is optional, but when filled in it holds the name of the scheme from which this codec originates + originalSchemeName string } // Decode attempts a decode of the object, then tries to convert it to the internal version. If into is provided and the decoding is @@ -182,7 +176,7 @@ func (c *codec) Encode(obj runtime.Object, w io.Writer) error { } targetGVK, ok := c.encodeVersion.KindForGroupVersionKinds([]schema.GroupVersionKind{objGVK}) if !ok { - return runtime.NewNotRegisteredGVKErrForTarget(objGVK, c.encodeVersion) + return runtime.NewNotRegisteredGVKErrForTarget(c.originalSchemeName, objGVK, c.encodeVersion) } if targetGVK == objGVK { return c.encoder.Encode(obj, w) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go new file mode 100644 index 00000000..7f13904d --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go @@ -0,0 +1,382 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 versioning + +import ( + "fmt" + "io" + "io/ioutil" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" +) + +type testDecodable struct { + Other string + Value int `json:"value"` + gvk schema.GroupVersionKind +} + +func (d *testDecodable) GetObjectKind() schema.ObjectKind { return d } +func (d *testDecodable) SetGroupVersionKind(gvk schema.GroupVersionKind) { d.gvk = gvk } +func (d *testDecodable) GroupVersionKind() schema.GroupVersionKind { return d.gvk } +func (d *testDecodable) DeepCopyObject() runtime.Object { + // no real deepcopy because these tests check for pointer equality + return d +} + +type testNestedDecodable struct { + Other string + Value int `json:"value"` + + gvk schema.GroupVersionKind + nestedCalled bool + nestedErr error +} + +func (d *testNestedDecodable) GetObjectKind() schema.ObjectKind { return d } +func (d *testNestedDecodable) SetGroupVersionKind(gvk schema.GroupVersionKind) { d.gvk = gvk } +func (d *testNestedDecodable) GroupVersionKind() schema.GroupVersionKind { return d.gvk } +func (d *testNestedDecodable) DeepCopyObject() runtime.Object { + // no real deepcopy because these tests check for pointer equality + return d +} + +func (d *testNestedDecodable) EncodeNestedObjects(e runtime.Encoder) error { + d.nestedCalled = true + return d.nestedErr +} + +func (d *testNestedDecodable) DecodeNestedObjects(_ runtime.Decoder) error { + d.nestedCalled = true + return d.nestedErr +} + +func TestNestedDecode(t *testing.T) { + n := &testNestedDecodable{nestedErr: fmt.Errorf("unable to decode")} + decoder := &mockSerializer{obj: n} + codec := NewCodec(nil, decoder, nil, nil, nil, nil, nil, nil, "TestNestedDecode") + if _, _, err := codec.Decode([]byte(`{}`), nil, n); err != n.nestedErr { + t.Errorf("unexpected error: %v", err) + } + if !n.nestedCalled { + t.Errorf("did not invoke nested decoder") + } +} + +func TestNestedEncode(t *testing.T) { + n := &testNestedDecodable{nestedErr: fmt.Errorf("unable to decode")} + n2 := &testNestedDecodable{nestedErr: fmt.Errorf("unable to decode 2")} + encoder := &mockSerializer{obj: n} + codec := NewCodec( + encoder, nil, + &checkConvertor{obj: n2, groupVersion: schema.GroupVersion{Group: "other"}}, + nil, + &mockTyper{gvks: []schema.GroupVersionKind{{Kind: "test"}}}, + nil, + schema.GroupVersion{Group: "other"}, nil, + "TestNestedEncode", + ) + if err := codec.Encode(n, ioutil.Discard); err != n2.nestedErr { + t.Errorf("unexpected error: %v", err) + } + if n.nestedCalled || !n2.nestedCalled { + t.Errorf("did not invoke correct nested decoder") + } +} + +func TestDecode(t *testing.T) { + gvk1 := &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"} + decodable1 := &testDecodable{} + decodable2 := &testDecodable{} + decodable3 := &testDecodable{} + versionedDecodable1 := &runtime.VersionedObjects{Objects: []runtime.Object{decodable1}} + + testCases := []struct { + serializer runtime.Serializer + convertor runtime.ObjectConvertor + creater runtime.ObjectCreater + typer runtime.ObjectTyper + defaulter runtime.ObjectDefaulter + yaml bool + pretty bool + + encodes, decodes runtime.GroupVersioner + + defaultGVK *schema.GroupVersionKind + into runtime.Object + + errFn func(error) bool + expectedObject runtime.Object + sameObject runtime.Object + expectedGVK *schema.GroupVersionKind + }{ + { + serializer: &mockSerializer{actual: gvk1}, + convertor: &checkConvertor{groupVersion: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}}, + expectedGVK: gvk1, + decodes: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}, + }, + { + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}}, + expectedGVK: gvk1, + sameObject: decodable2, + decodes: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}, + }, + // defaultGVK.Group is allowed to force a conversion to the destination group + { + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + defaultGVK: &schema.GroupVersionKind{Group: "force"}, + convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "force", Version: runtime.APIVersionInternal}}, + expectedGVK: gvk1, + sameObject: decodable2, + decodes: schema.GroupVersion{Group: "force", Version: runtime.APIVersionInternal}, + }, + // uses direct conversion for into when objects differ + { + into: decodable3, + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + convertor: &checkConvertor{in: decodable1, obj: decodable3, directConvert: true}, + expectedGVK: gvk1, + sameObject: decodable3, + }, + { + into: versionedDecodable1, + serializer: &mockSerializer{actual: gvk1, obj: decodable3}, + convertor: &checkConvertor{in: decodable3, obj: decodable1, directConvert: true}, + expectedGVK: gvk1, + sameObject: versionedDecodable1, + }, + // returns directly when serializer returns into + { + into: decodable3, + serializer: &mockSerializer{actual: gvk1, obj: decodable3}, + expectedGVK: gvk1, + sameObject: decodable3, + }, + // returns directly when serializer returns into + { + into: versionedDecodable1, + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + expectedGVK: gvk1, + sameObject: versionedDecodable1, + }, + + // runtime.VersionedObjects are decoded + { + into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, + + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}}, + expectedGVK: gvk1, + expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1, decodable2}}, + decodes: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}, + }, + + // decode into the same version as the serialized object + { + decodes: schema.GroupVersions{gvk1.GroupVersion()}, + + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + convertor: &checkConvertor{in: decodable1, obj: decodable1, groupVersion: schema.GroupVersions{{Group: "other", Version: "blah"}}}, + expectedGVK: gvk1, + expectedObject: decodable1, + }, + { + into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, + decodes: schema.GroupVersions{gvk1.GroupVersion()}, + + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + convertor: &checkConvertor{in: decodable1, obj: decodable1, groupVersion: schema.GroupVersions{{Group: "other", Version: "blah"}}}, + expectedGVK: gvk1, + expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1}}, + }, + + // codec with non matching version skips conversion altogether + { + decodes: schema.GroupVersions{{Group: "something", Version: "else"}}, + + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + convertor: &checkConvertor{in: decodable1, obj: decodable1, groupVersion: schema.GroupVersions{{Group: "something", Version: "else"}}}, + expectedGVK: gvk1, + expectedObject: decodable1, + }, + { + into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, + decodes: schema.GroupVersions{{Group: "something", Version: "else"}}, + + serializer: &mockSerializer{actual: gvk1, obj: decodable1}, + convertor: &checkConvertor{in: decodable1, obj: decodable1, groupVersion: schema.GroupVersions{{Group: "something", Version: "else"}}}, + expectedGVK: gvk1, + expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1}}, + }, + } + + for i, test := range testCases { + t.Logf("%d", i) + s := NewCodec(test.serializer, test.serializer, test.convertor, test.creater, test.typer, test.defaulter, test.encodes, test.decodes, fmt.Sprintf("mock-%d", i)) + obj, gvk, err := s.Decode([]byte(`{}`), test.defaultGVK, test.into) + + if !reflect.DeepEqual(test.expectedGVK, gvk) { + t.Errorf("%d: unexpected GVK: %v", i, gvk) + } + + switch { + case err == nil && test.errFn != nil: + t.Errorf("%d: failed: %v", i, err) + continue + case err != nil && test.errFn == nil: + t.Errorf("%d: failed: %v", i, err) + continue + case err != nil: + if !test.errFn(err) { + t.Errorf("%d: failed: %v", i, err) + } + if obj != nil { + t.Errorf("%d: should have returned nil object", i) + } + continue + } + + if test.into != nil && test.into != obj { + t.Errorf("%d: expected into to be returned: %v", i, obj) + continue + } + + switch { + case test.expectedObject != nil: + if !reflect.DeepEqual(test.expectedObject, obj) { + t.Errorf("%d: unexpected object:\n%s", i, diff.ObjectGoPrintSideBySide(test.expectedObject, obj)) + } + case test.sameObject != nil: + if test.sameObject != obj { + t.Errorf("%d: unexpected object:\n%s", i, diff.ObjectGoPrintSideBySide(test.sameObject, obj)) + } + case obj != nil: + t.Errorf("%d: unexpected object: %#v", i, obj) + } + } +} + +type checkConvertor struct { + err error + in, obj runtime.Object + groupVersion runtime.GroupVersioner + directConvert bool +} + +func (c *checkConvertor) Convert(in, out, context interface{}) error { + if !c.directConvert { + return fmt.Errorf("unexpected call to Convert") + } + if c.in != nil && c.in != in { + return fmt.Errorf("unexpected in: %s", in) + } + if c.obj != nil && c.obj != out { + return fmt.Errorf("unexpected out: %s", out) + } + return c.err +} +func (c *checkConvertor) ConvertToVersion(in runtime.Object, outVersion runtime.GroupVersioner) (out runtime.Object, err error) { + if c.directConvert { + return nil, fmt.Errorf("unexpected call to ConvertToVersion") + } + if c.in != nil && c.in != in { + return nil, fmt.Errorf("unexpected in: %s", in) + } + if !reflect.DeepEqual(c.groupVersion, outVersion) { + return nil, fmt.Errorf("unexpected outversion: %s (%s)", outVersion, c.groupVersion) + } + return c.obj, c.err +} +func (c *checkConvertor) ConvertFieldLabel(gvk schema.GroupVersionKind, label, value string) (string, string, error) { + return "", "", fmt.Errorf("unexpected call to ConvertFieldLabel") +} + +type mockSerializer struct { + err error + obj runtime.Object + encodingObjGVK schema.GroupVersionKind + + defaults, actual *schema.GroupVersionKind + into runtime.Object +} + +func (s *mockSerializer) Decode(data []byte, defaults *schema.GroupVersionKind, into runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) { + s.defaults = defaults + s.into = into + return s.obj, s.actual, s.err +} + +func (s *mockSerializer) Encode(obj runtime.Object, w io.Writer) error { + s.obj = obj + s.encodingObjGVK = obj.GetObjectKind().GroupVersionKind() + return s.err +} + +type mockCreater struct { + err error + obj runtime.Object +} + +func (c *mockCreater) New(kind schema.GroupVersionKind) (runtime.Object, error) { + return c.obj, c.err +} + +type mockTyper struct { + gvks []schema.GroupVersionKind + unversioned bool + err error +} + +func (t *mockTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) { + return t.gvks, t.unversioned, t.err +} + +func (t *mockTyper) Recognizes(_ schema.GroupVersionKind) bool { + return true +} + +func TestDirectCodecEncode(t *testing.T) { + serializer := mockSerializer{} + typer := mockTyper{ + gvks: []schema.GroupVersionKind{ + { + Group: "wrong_group", + Kind: "some_kind", + }, + { + Group: "expected_group", + Kind: "some_kind", + }, + }, + } + + c := DirectEncoder{ + Version: schema.GroupVersion{Group: "expected_group"}, + Encoder: &serializer, + ObjectTyper: &typer, + } + c.Encode(&testDecodable{}, ioutil.Discard) + if e, a := "expected_group", serializer.encodingObjGVK.Group; e != a { + t.Errorf("expected group to be %v, got %v", e, a) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/swagger_doc_generator_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/swagger_doc_generator_test.go new file mode 100644 index 00000000..a6f338d3 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/swagger_doc_generator_test.go @@ -0,0 +1,43 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 runtime + +import ( + "testing" +) + +func TestFmtRawDoc(t *testing.T) { + tests := []struct { + t, expected string + }{ + {"aaa\n --- asd\n TODO: tooooodo\n toooodoooooo\n", "aaa"}, + {"aaa\nasd\n TODO: tooooodo\nbbbb\n --- toooodoooooo\n", "aaa asd bbbb"}, + {" TODO: tooooodo\n", ""}, + {"Par1\n\nPar2\n\n", "Par1\\n\\nPar2"}, + {"", ""}, + {" ", ""}, + {" \n", ""}, + {" \n\n ", ""}, + {"Example:\n\tl1\n\t\tl2\n", "Example:\\n\\tl1\\n\\t\\tl2"}, + } + + for _, test := range tests { + if o := fmtRawDoc(test.t); o != test.expected { + t.Fatalf("Expected: %q, got %q", test.expected, o) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go index 167de610..8b9182f3 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go @@ -28,9 +28,7 @@ func (in *RawExtension) DeepCopyInto(out *RawExtension) { *out = make([]byte, len(*in)) copy(*out, *in) } - if in.Object == nil { - out.Object = nil - } else { + if in.Object != nil { out.Object = in.Object.DeepCopyObject() } return @@ -83,9 +81,7 @@ func (in *VersionedObjects) DeepCopyInto(out *VersionedObjects) { in, out := &in.Objects, &out.Objects *out = make([]Object, len(*in)) for i := range *in { - if (*in)[i] == nil { - (*out)[i] = nil - } else { + if (*in)[i] != nil { (*out)[i] = (*in)[i].DeepCopyObject() } } diff --git a/vendor/k8s.io/apimachinery/pkg/selection/BUILD b/vendor/k8s.io/apimachinery/pkg/selection/BUILD index 3790df9a..ebb68728 100644 --- a/vendor/k8s.io/apimachinery/pkg/selection/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/selection/BUILD @@ -8,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["operator.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/selection", importpath = "k8s.io/apimachinery/pkg/selection", ) diff --git a/vendor/k8s.io/apimachinery/pkg/types/BUILD b/vendor/k8s.io/apimachinery/pkg/types/BUILD index 3db635c8..ad08cd8f 100644 --- a/vendor/k8s.io/apimachinery/pkg/types/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/types/BUILD @@ -14,6 +14,7 @@ go_library( "patch.go", "uid.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/types", importpath = "k8s.io/apimachinery/pkg/types", ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD b/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD index 2fcbae36..06a7cfa2 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD @@ -14,8 +14,8 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", ], ) @@ -25,6 +25,7 @@ go_library( "cache.go", "lruexpirecache.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/cache", importpath = "k8s.io/apimachinery/pkg/util/cache", deps = ["//vendor/github.com/hashicorp/golang-lru:go_default_library"], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/cache/cache_test.go b/vendor/k8s.io/apimachinery/pkg/util/cache/cache_test.go new file mode 100644 index 00000000..42a58a93 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/cache/cache_test.go @@ -0,0 +1,90 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 cache + +import ( + "testing" +) + +const ( + maxTestCacheSize int = shardsCount * 2 +) + +func ExpectEntry(t *testing.T, cache Cache, index uint64, expectedValue interface{}) bool { + elem, found := cache.Get(index) + if !found { + t.Errorf("Expected to find entry with key %d", index) + return false + } else if elem != expectedValue { + t.Errorf("Expected to find %v, got %v", expectedValue, elem) + return false + } + return true +} + +func TestBasic(t *testing.T) { + cache := NewCache(maxTestCacheSize) + cache.Add(1, "xxx") + ExpectEntry(t, cache, 1, "xxx") +} + +func TestOverflow(t *testing.T) { + cache := NewCache(maxTestCacheSize) + for i := 0; i < maxTestCacheSize+1; i++ { + cache.Add(uint64(i), "xxx") + } + foundIndexes := make([]uint64, 0) + for i := 0; i < maxTestCacheSize+1; i++ { + _, found := cache.Get(uint64(i)) + if found { + foundIndexes = append(foundIndexes, uint64(i)) + } + } + if len(foundIndexes) != maxTestCacheSize { + t.Errorf("Expect to find %d elements, got %d %v", maxTestCacheSize, len(foundIndexes), foundIndexes) + } +} + +func TestOverwrite(t *testing.T) { + cache := NewCache(maxTestCacheSize) + cache.Add(1, "xxx") + ExpectEntry(t, cache, 1, "xxx") + cache.Add(1, "yyy") + ExpectEntry(t, cache, 1, "yyy") +} + +// TestEvict this test will fail sporatically depending on what add() +// selects for the randomKey to be evicted. Ensure that randomKey +// is never the key we most recently added. Since the chance of failure +// on each evict is 50%, if we do it 7 times, it should catch the problem +// if it exists >99% of the time. +func TestEvict(t *testing.T) { + cache := NewCache(shardsCount) + var found bool + for retry := 0; retry < 7; retry++ { + cache.Add(uint64(shardsCount), "xxx") + found = ExpectEntry(t, cache, uint64(shardsCount), "xxx") + if !found { + break + } + cache.Add(0, "xxx") + found = ExpectEntry(t, cache, 0, "xxx") + if !found { + break + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache_test.go b/vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache_test.go new file mode 100644 index 00000000..bd44f60d --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/cache/lruexpirecache_test.go @@ -0,0 +1,68 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 cache + +import ( + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/clock" + + "github.com/golang/groupcache/lru" +) + +func expectEntry(t *testing.T, c *LRUExpireCache, key lru.Key, value interface{}) { + result, ok := c.Get(key) + if !ok || result != value { + t.Errorf("Expected cache[%v]: %v, got %v", key, value, result) + } +} + +func expectNotEntry(t *testing.T, c *LRUExpireCache, key lru.Key) { + if result, ok := c.Get(key); ok { + t.Errorf("Expected cache[%v] to be empty, got %v", key, result) + } +} + +func TestSimpleGet(t *testing.T) { + c := NewLRUExpireCache(10) + c.Add("long-lived", "12345", 10*time.Hour) + expectEntry(t, c, "long-lived", "12345") +} + +func TestExpiredGet(t *testing.T) { + fakeClock := clock.NewFakeClock(time.Now()) + c := NewLRUExpireCacheWithClock(10, fakeClock) + c.Add("short-lived", "12345", 1*time.Millisecond) + // ensure the entry expired + fakeClock.Step(2 * time.Millisecond) + expectNotEntry(t, c, "short-lived") +} + +func TestLRUOverflow(t *testing.T) { + c := NewLRUExpireCache(4) + c.Add("elem1", "1", 10*time.Hour) + c.Add("elem2", "2", 10*time.Hour) + c.Add("elem3", "3", 10*time.Hour) + c.Add("elem4", "4", 10*time.Hour) + c.Add("elem5", "5", 10*time.Hour) + expectNotEntry(t, c, "elem1") + expectEntry(t, c, "elem2", "2") + expectEntry(t, c, "elem3", "3") + expectEntry(t, c, "elem4", "4") + expectEntry(t, c, "elem5", "5") +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD b/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD index a9f6be47..8aee67d9 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["clock.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/clock", importpath = "k8s.io/apimachinery/pkg/util/clock", ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go b/vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go new file mode 100644 index 00000000..c7b371fc --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go @@ -0,0 +1,196 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 clock + +import ( + "testing" + "time" +) + +var ( + _ = Clock(RealClock{}) + _ = Clock(&FakeClock{}) + _ = Clock(&IntervalClock{}) + + _ = Timer(&realTimer{}) + _ = Timer(&fakeTimer{}) + + _ = Ticker(&realTicker{}) + _ = Ticker(&fakeTicker{}) +) + +func TestFakeClock(t *testing.T) { + startTime := time.Now() + tc := NewFakeClock(startTime) + tc.Step(time.Second) + now := tc.Now() + if now.Sub(startTime) != time.Second { + t.Errorf("input: %s now=%s gap=%s expected=%s", startTime, now, now.Sub(startTime), time.Second) + } + + tt := tc.Now() + tc.SetTime(tt.Add(time.Hour)) + if tc.Now().Sub(tt) != time.Hour { + t.Errorf("input: %s now=%s gap=%s expected=%s", tt, tc.Now(), tc.Now().Sub(tt), time.Hour) + } +} + +func TestFakeClockSleep(t *testing.T) { + startTime := time.Now() + tc := NewFakeClock(startTime) + tc.Sleep(time.Duration(1) * time.Hour) + now := tc.Now() + if now.Sub(startTime) != time.Hour { + t.Errorf("Fake sleep failed, expected time to advance by one hour, instead, its %v", now.Sub(startTime)) + } +} + +func TestFakeAfter(t *testing.T) { + tc := NewFakeClock(time.Now()) + if tc.HasWaiters() { + t.Errorf("unexpected waiter?") + } + oneSec := tc.After(time.Second) + if !tc.HasWaiters() { + t.Errorf("unexpected lack of waiter?") + } + + oneOhOneSec := tc.After(time.Second + time.Millisecond) + twoSec := tc.After(2 * time.Second) + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(999 * time.Millisecond) + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(time.Millisecond) + select { + case <-oneSec: + // Expected! + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } + tc.Step(time.Millisecond) + select { + case <-oneSec: + // should not double-trigger! + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + // Expected! + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } +} + +func TestFakeTick(t *testing.T) { + tc := NewFakeClock(time.Now()) + if tc.HasWaiters() { + t.Errorf("unexpected waiter?") + } + oneSec := tc.NewTicker(time.Second).C() + if !tc.HasWaiters() { + t.Errorf("unexpected lack of waiter?") + } + + oneOhOneSec := tc.NewTicker(time.Second + time.Millisecond).C() + twoSec := tc.NewTicker(2 * time.Second).C() + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(999 * time.Millisecond) // t=.999 + select { + case <-oneSec: + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + } + + tc.Step(time.Millisecond) // t=1.000 + select { + case <-oneSec: + // Expected! + case <-oneOhOneSec: + t.Errorf("unexpected channel read") + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } + tc.Step(time.Millisecond) // t=1.001 + select { + case <-oneSec: + // should not double-trigger! + t.Errorf("unexpected channel read") + case <-oneOhOneSec: + // Expected! + case <-twoSec: + t.Errorf("unexpected channel read") + default: + t.Errorf("unexpected non-channel read") + } + + tc.Step(time.Second) // t=2.001 + tc.Step(time.Second) // t=3.001 + tc.Step(time.Second) // t=4.001 + tc.Step(time.Second) // t=5.001 + + // The one second ticker should not accumulate ticks + accumulatedTicks := 0 + drained := false + for !drained { + select { + case <-oneSec: + accumulatedTicks++ + default: + drained = true + } + } + if accumulatedTicks != 1 { + t.Errorf("unexpected number of accumulated ticks: %d", accumulatedTicks) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD b/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD index 3cd03b43..0089ba84 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD @@ -15,10 +15,11 @@ go_test( go_library( name = "go_default_library", srcs = ["diff.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/diff", importpath = "k8s.io/apimachinery/pkg/util/diff", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go index bce95baf..06042617 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go +++ b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go @@ -108,6 +108,14 @@ func limit(aObj, bObj interface{}, max int) (string, string) { elidedASuffix := "" elidedBSuffix := "" a, b := fmt.Sprintf("%#v", aObj), fmt.Sprintf("%#v", bObj) + + if aObj != nil && bObj != nil { + if aType, bType := fmt.Sprintf("%T", aObj), fmt.Sprintf("%T", bObj); aType != bType { + a = fmt.Sprintf("%s (%s)", a, aType) + b = fmt.Sprintf("%s (%s)", b, bType) + } + } + for { switch { case len(a) > max && len(a) > 4 && len(b) > 4 && a[:4] == b[:4]: diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go b/vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go new file mode 100644 index 00000000..79ea2216 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go @@ -0,0 +1,148 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 diff + +import ( + "testing" +) + +func TestObjectReflectDiff(t *testing.T) { + type struct1 struct{ A []int } + + testCases := map[string]struct { + a, b interface{} + out string + }{ + "map": { + a: map[string]int{}, + b: map[string]int{}, + }, + "detect nil map": { + a: map[string]int(nil), + b: map[string]int{}, + out: ` +object: + a: map[string]int(nil) + b: map[string]int{}`, + }, + "detect map changes": { + a: map[string]int{"test": 1, "other": 2}, + b: map[string]int{"test": 2, "third": 3}, + out: ` +object[other]: + a: 2 + b: +object[test]: + a: 1 + b: 2 +object[third]: + a: + b: 3`, + }, + "nil slice": {a: struct1{A: nil}, b: struct1{A: nil}}, + "empty slice": {a: struct1{A: []int{}}, b: struct1{A: []int{}}}, + "detect slice changes 1": {a: struct1{A: []int{1}}, b: struct1{A: []int{2}}, out: ` +object.A[0]: + a: 1 + b: 2`, + }, + "detect slice changes 2": {a: struct1{A: []int{}}, b: struct1{A: []int{2}}, out: ` +object.A[0]: + a: + b: 2`, + }, + "detect slice changes 3": {a: struct1{A: []int{1}}, b: struct1{A: []int{}}, out: ` +object.A[0]: + a: 1 + b: `, + }, + "detect nil vs empty slices": {a: struct1{A: nil}, b: struct1{A: []int{}}, out: ` +object.A: + a: []int(nil) + b: []int{}`, + }, + "display type differences": {a: []interface{}{int64(1)}, b: []interface{}{uint64(1)}, out: ` +object[0]: + a: 1 (int64) + b: 0x1 (uint64)`, + }, + } + for name, test := range testCases { + expect := test.out + if len(expect) == 0 { + expect = "" + } + if actual := ObjectReflectDiff(test.a, test.b); actual != expect { + t.Errorf("%s: unexpected output: %s", name, actual) + } + } +} + +func TestStringDiff(t *testing.T) { + diff := StringDiff("aaabb", "aaacc") + expect := "aaa\n\nA: bb\n\nB: cc\n\n" + if diff != expect { + t.Errorf("diff returned %v", diff) + } +} + +func TestLimit(t *testing.T) { + testcases := []struct { + a interface{} + b interface{} + expectA string + expectB string + }{ + { + a: `short a`, + b: `short b`, + expectA: `"short a"`, + expectB: `"short b"`, + }, + { + a: `short a`, + b: `long b needs truncating`, + expectA: `"short a"`, + expectB: `"long b ne...`, + }, + { + a: `long a needs truncating`, + b: `long b needs truncating`, + expectA: `...g a needs ...`, + expectB: `...g b needs ...`, + }, + { + a: `long common prefix with different stuff at the end of a`, + b: `long common prefix with different stuff at the end of b`, + expectA: `...end of a"`, + expectB: `...end of b"`, + }, + { + a: `long common prefix with different stuff at the end of a`, + b: `long common prefix with different stuff at the end of b which continues`, + expectA: `...of a"`, + expectB: `...of b which...`, + }, + } + + for _, tc := range testcases { + a, b := limit(tc.a, tc.b, 10) + if a != tc.expectA || b != tc.expectB { + t.Errorf("limit(%q, %q)\n\texpected: %s, %s\n\tgot: %s, %s", tc.a, tc.b, tc.expectA, tc.expectB, a, b) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD b/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD index fa2b74a2..c1de3109 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD @@ -18,6 +18,7 @@ go_library( "doc.go", "errors.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/errors", importpath = "k8s.io/apimachinery/pkg/util/errors", ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/errors_test.go b/vendor/k8s.io/apimachinery/pkg/util/errors/errors_test.go new file mode 100644 index 00000000..0ad3967d --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/errors/errors_test.go @@ -0,0 +1,368 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 errors + +import ( + "fmt" + "reflect" + "sort" + "testing" +) + +func TestEmptyAggregate(t *testing.T) { + var slice []error + var agg Aggregate + var err error + + agg = NewAggregate(slice) + if agg != nil { + t.Errorf("expected nil, got %#v", agg) + } + err = NewAggregate(slice) + if err != nil { + t.Errorf("expected nil, got %#v", err) + } + + // This is not normally possible, but pedantry demands I test it. + agg = aggregate(slice) // empty aggregate + if s := agg.Error(); s != "" { + t.Errorf("expected empty string, got %q", s) + } + if s := agg.Errors(); len(s) != 0 { + t.Errorf("expected empty slice, got %#v", s) + } + err = agg.(error) + if s := err.Error(); s != "" { + t.Errorf("expected empty string, got %q", s) + } +} + +func TestAggregateWithNil(t *testing.T) { + var slice []error + slice = []error{nil} + var agg Aggregate + var err error + + agg = NewAggregate(slice) + if agg != nil { + t.Errorf("expected nil, got %#v", agg) + } + err = NewAggregate(slice) + if err != nil { + t.Errorf("expected nil, got %#v", err) + } + + // Append a non-nil error + slice = append(slice, fmt.Errorf("err")) + agg = NewAggregate(slice) + if agg == nil { + t.Errorf("expected non-nil") + } + if s := agg.Error(); s != "err" { + t.Errorf("expected 'err', got %q", s) + } + if s := agg.Errors(); len(s) != 1 { + t.Errorf("expected one-element slice, got %#v", s) + } + if s := agg.Errors()[0].Error(); s != "err" { + t.Errorf("expected 'err', got %q", s) + } + + err = agg.(error) + if err == nil { + t.Errorf("expected non-nil") + } + if s := err.Error(); s != "err" { + t.Errorf("expected 'err', got %q", s) + } +} + +func TestSingularAggregate(t *testing.T) { + var slice []error = []error{fmt.Errorf("err")} + var agg Aggregate + var err error + + agg = NewAggregate(slice) + if agg == nil { + t.Errorf("expected non-nil") + } + if s := agg.Error(); s != "err" { + t.Errorf("expected 'err', got %q", s) + } + if s := agg.Errors(); len(s) != 1 { + t.Errorf("expected one-element slice, got %#v", s) + } + if s := agg.Errors()[0].Error(); s != "err" { + t.Errorf("expected 'err', got %q", s) + } + + err = agg.(error) + if err == nil { + t.Errorf("expected non-nil") + } + if s := err.Error(); s != "err" { + t.Errorf("expected 'err', got %q", s) + } +} + +func TestPluralAggregate(t *testing.T) { + var slice []error = []error{fmt.Errorf("abc"), fmt.Errorf("123")} + var agg Aggregate + var err error + + agg = NewAggregate(slice) + if agg == nil { + t.Errorf("expected non-nil") + } + if s := agg.Error(); s != "[abc, 123]" { + t.Errorf("expected '[abc, 123]', got %q", s) + } + if s := agg.Errors(); len(s) != 2 { + t.Errorf("expected two-elements slice, got %#v", s) + } + if s := agg.Errors()[0].Error(); s != "abc" { + t.Errorf("expected '[abc, 123]', got %q", s) + } + + err = agg.(error) + if err == nil { + t.Errorf("expected non-nil") + } + if s := err.Error(); s != "[abc, 123]" { + t.Errorf("expected '[abc, 123]', got %q", s) + } +} + +func TestFilterOut(t *testing.T) { + testCases := []struct { + err error + filter []Matcher + expected error + }{ + { + nil, + []Matcher{}, + nil, + }, + { + aggregate{}, + []Matcher{}, + nil, + }, + { + aggregate{fmt.Errorf("abc")}, + []Matcher{}, + aggregate{fmt.Errorf("abc")}, + }, + { + aggregate{fmt.Errorf("abc")}, + []Matcher{func(err error) bool { return false }}, + aggregate{fmt.Errorf("abc")}, + }, + { + aggregate{fmt.Errorf("abc")}, + []Matcher{func(err error) bool { return true }}, + nil, + }, + { + aggregate{fmt.Errorf("abc")}, + []Matcher{func(err error) bool { return false }, func(err error) bool { return false }}, + aggregate{fmt.Errorf("abc")}, + }, + { + aggregate{fmt.Errorf("abc")}, + []Matcher{func(err error) bool { return false }, func(err error) bool { return true }}, + nil, + }, + { + aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, + []Matcher{func(err error) bool { return err.Error() == "def" }}, + aggregate{fmt.Errorf("abc"), fmt.Errorf("ghi")}, + }, + { + aggregate{aggregate{fmt.Errorf("abc")}}, + []Matcher{}, + aggregate{aggregate{fmt.Errorf("abc")}}, + }, + { + aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, + []Matcher{}, + aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, + }, + { + aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, + []Matcher{func(err error) bool { return err.Error() == "def" }}, + aggregate{aggregate{fmt.Errorf("abc")}}, + }, + } + for i, testCase := range testCases { + err := FilterOut(testCase.err, testCase.filter...) + if !reflect.DeepEqual(testCase.expected, err) { + t.Errorf("%d: expected %v, got %v", i, testCase.expected, err) + } + } +} + +func TestFlatten(t *testing.T) { + testCases := []struct { + agg Aggregate + expected Aggregate + }{ + { + nil, + nil, + }, + { + aggregate{}, + nil, + }, + { + aggregate{fmt.Errorf("abc")}, + aggregate{fmt.Errorf("abc")}, + }, + { + aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, + aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, + }, + { + aggregate{aggregate{fmt.Errorf("abc")}}, + aggregate{fmt.Errorf("abc")}, + }, + { + aggregate{aggregate{aggregate{fmt.Errorf("abc")}}}, + aggregate{fmt.Errorf("abc")}, + }, + { + aggregate{aggregate{fmt.Errorf("abc"), aggregate{fmt.Errorf("def")}}}, + aggregate{fmt.Errorf("abc"), fmt.Errorf("def")}, + }, + { + aggregate{aggregate{aggregate{fmt.Errorf("abc")}, fmt.Errorf("def"), aggregate{fmt.Errorf("ghi")}}}, + aggregate{fmt.Errorf("abc"), fmt.Errorf("def"), fmt.Errorf("ghi")}, + }, + } + for i, testCase := range testCases { + agg := Flatten(testCase.agg) + if !reflect.DeepEqual(testCase.expected, agg) { + t.Errorf("%d: expected %v, got %v", i, testCase.expected, agg) + } + } +} + +func TestCreateAggregateFromMessageCountMap(t *testing.T) { + testCases := []struct { + name string + mcm MessageCountMap + expected Aggregate + }{ + { + "input has single instance of one message", + MessageCountMap{"abc": 1}, + aggregate{fmt.Errorf("abc")}, + }, + { + "input has multiple messages", + MessageCountMap{"abc": 2, "ghi": 1}, + aggregate{fmt.Errorf("abc (repeated 2 times)"), fmt.Errorf("ghi")}, + }, + { + "input has multiple messages", + MessageCountMap{"ghi": 1, "abc": 2}, + aggregate{fmt.Errorf("abc (repeated 2 times)"), fmt.Errorf("ghi")}, + }, + } + + var expected, agg []error + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + if testCase.expected != nil { + expected = testCase.expected.Errors() + sort.Slice(expected, func(i, j int) bool { return expected[i].Error() < expected[j].Error() }) + } + if testCase.mcm != nil { + agg = CreateAggregateFromMessageCountMap(testCase.mcm).Errors() + sort.Slice(agg, func(i, j int) bool { return agg[i].Error() < agg[j].Error() }) + } + if !reflect.DeepEqual(expected, agg) { + t.Errorf("expected %v, got %v", expected, agg) + } + }) + } +} + +func TestAggregateGoroutines(t *testing.T) { + testCases := []struct { + errs []error + expected map[string]bool // can't compare directly to Aggregate due to non-deterministic ordering + }{ + { + []error{}, + nil, + }, + { + []error{nil}, + nil, + }, + { + []error{nil, nil}, + nil, + }, + { + []error{fmt.Errorf("1")}, + map[string]bool{"1": true}, + }, + { + []error{fmt.Errorf("1"), nil}, + map[string]bool{"1": true}, + }, + { + []error{fmt.Errorf("1"), fmt.Errorf("267")}, + map[string]bool{"1": true, "267": true}, + }, + { + []error{fmt.Errorf("1"), nil, fmt.Errorf("1234")}, + map[string]bool{"1": true, "1234": true}, + }, + { + []error{nil, fmt.Errorf("1"), nil, fmt.Errorf("1234"), fmt.Errorf("22")}, + map[string]bool{"1": true, "1234": true, "22": true}, + }, + } + for i, testCase := range testCases { + funcs := make([]func() error, len(testCase.errs)) + for i := range testCase.errs { + err := testCase.errs[i] + funcs[i] = func() error { return err } + } + agg := AggregateGoroutines(funcs...) + if agg == nil { + if len(testCase.expected) > 0 { + t.Errorf("%d: expected %v, got nil", i, testCase.expected) + } + continue + } + if len(agg.Errors()) != len(testCase.expected) { + t.Errorf("%d: expected %d errors in aggregate, got %v", i, len(testCase.expected), agg) + continue + } + for _, err := range agg.Errors() { + if !testCase.expected[err.Error()] { + t.Errorf("%d: expected %v, got aggregate containing %v", i, testCase.expected, err) + } + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD b/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD index 3a323b11..e72505b9 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["framer.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/framer", importpath = "k8s.io/apimachinery/pkg/util/framer", ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/framer/framer_test.go b/vendor/k8s.io/apimachinery/pkg/util/framer/framer_test.go new file mode 100644 index 00000000..b7ed00f5 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/framer/framer_test.go @@ -0,0 +1,176 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 framer + +import ( + "bytes" + "io" + "io/ioutil" + "testing" +) + +func TestRead(t *testing.T) { + data := []byte{ + 0x00, 0x00, 0x00, 0x04, + 0x01, 0x02, 0x03, 0x04, + 0x00, 0x00, 0x00, 0x03, + 0x05, 0x06, 0x07, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x08, + } + b := bytes.NewBuffer(data) + r := NewLengthDelimitedFrameReader(ioutil.NopCloser(b)) + buf := make([]byte, 1) + if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x01}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x02}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read the remaining frame + buf = make([]byte, 2) + if n, err := r.Read(buf); err != nil && n != 2 && bytes.Equal(buf, []byte{0x03, 0x04}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read with buffer equal to frame + buf = make([]byte, 3) + if n, err := r.Read(buf); err != nil && n != 3 && bytes.Equal(buf, []byte{0x05, 0x06, 0x07}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read empty frame + buf = make([]byte, 3) + if n, err := r.Read(buf); err != nil && n != 0 && bytes.Equal(buf, []byte{}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read with larger buffer than frame + buf = make([]byte, 3) + if n, err := r.Read(buf); err != nil && n != 1 && bytes.Equal(buf, []byte{0x08}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read EOF + if n, err := r.Read(buf); err != io.EOF && n != 0 { + t.Fatalf("unexpected: %v %d", err, n) + } +} + +func TestReadLarge(t *testing.T) { + data := []byte{ + 0x00, 0x00, 0x00, 0x04, + 0x01, 0x02, 0x03, 0x04, + 0x00, 0x00, 0x00, 0x03, + 0x05, 0x06, 0x07, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x08, + } + b := bytes.NewBuffer(data) + r := NewLengthDelimitedFrameReader(ioutil.NopCloser(b)) + buf := make([]byte, 40) + if n, err := r.Read(buf); err != nil && n != 4 && bytes.Equal(buf, []byte{0x01, 0x02, 0x03, 0x04}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + if n, err := r.Read(buf); err != nil && n != 3 && bytes.Equal(buf, []byte{0x05, 0x06, 0x7}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + if n, err := r.Read(buf); err != nil && n != 0 && bytes.Equal(buf, []byte{}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + if n, err := r.Read(buf); err != nil && n != 1 && bytes.Equal(buf, []byte{0x08}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read EOF + if n, err := r.Read(buf); err != io.EOF && n != 0 { + t.Fatalf("unexpected: %v %d", err, n) + } +} +func TestReadInvalidFrame(t *testing.T) { + data := []byte{ + 0x00, 0x00, 0x00, 0x04, + 0x01, 0x02, + } + b := bytes.NewBuffer(data) + r := NewLengthDelimitedFrameReader(ioutil.NopCloser(b)) + buf := make([]byte, 1) + if n, err := r.Read(buf); err != io.ErrShortBuffer && n != 1 && bytes.Equal(buf, []byte{0x01}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read the remaining frame + buf = make([]byte, 3) + if n, err := r.Read(buf); err != io.ErrUnexpectedEOF && n != 1 && bytes.Equal(buf, []byte{0x02}) { + t.Fatalf("unexpected: %v %d %v", err, n, buf) + } + // read EOF + if n, err := r.Read(buf); err != io.EOF && n != 0 { + t.Fatalf("unexpected: %v %d", err, n) + } +} + +func TestJSONFrameReader(t *testing.T) { + b := bytes.NewBufferString("{\"test\":true}\n1\n[\"a\"]") + r := NewJSONFramedReader(ioutil.NopCloser(b)) + buf := make([]byte, 20) + if n, err := r.Read(buf); err != nil || n != 13 || string(buf[:n]) != `{"test":true}` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `1` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != nil || n != 5 || string(buf[:n]) != `["a"]` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != io.EOF || n != 0 { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } +} + +func TestJSONFrameReaderShortBuffer(t *testing.T) { + b := bytes.NewBufferString("{\"test\":true}\n1\n[\"a\"]") + r := NewJSONFramedReader(ioutil.NopCloser(b)) + buf := make([]byte, 3) + + if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `{"t` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `est` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `":t` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `rue` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `}` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + + if n, err := r.Read(buf); err != nil || n != 1 || string(buf[:n]) != `1` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + + if n, err := r.Read(buf); err != io.ErrShortBuffer || n != 3 || string(buf[:n]) != `["a` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + if n, err := r.Read(buf); err != nil || n != 2 || string(buf[:n]) != `"]` { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } + + if n, err := r.Read(buf); err != io.EOF || n != 0 { + t.Fatalf("unexpected: %v %d %q", err, n, buf) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD b/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD index 5d45073e..fa8e3f8d 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD @@ -18,6 +18,7 @@ go_library( "doc.go", "httpstream.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/httpstream", importpath = "k8s.io/apimachinery/pkg/util/httpstream", ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/httpstream_test.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/httpstream_test.go new file mode 100644 index 00000000..f7f9a3eb --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/httpstream_test.go @@ -0,0 +1,125 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 httpstream + +import ( + "net/http" + "reflect" + "testing" +) + +type responseWriter struct { + header http.Header + statusCode *int +} + +func newResponseWriter() *responseWriter { + return &responseWriter{ + header: make(http.Header), + } +} + +func (r *responseWriter) Header() http.Header { + return r.header +} + +func (r *responseWriter) WriteHeader(code int) { + r.statusCode = &code +} + +func (r *responseWriter) Write([]byte) (int, error) { + return 0, nil +} + +func TestHandshake(t *testing.T) { + tests := map[string]struct { + clientProtocols []string + serverProtocols []string + expectedProtocol string + expectError bool + }{ + "no client protocols": { + clientProtocols: []string{}, + serverProtocols: []string{"a", "b"}, + expectedProtocol: "", + }, + "no common protocol": { + clientProtocols: []string{"c"}, + serverProtocols: []string{"a", "b"}, + expectedProtocol: "", + expectError: true, + }, + "common protocol": { + clientProtocols: []string{"b"}, + serverProtocols: []string{"a", "b"}, + expectedProtocol: "b", + }, + } + + for name, test := range tests { + req, err := http.NewRequest("GET", "http://www.example.com/", nil) + if err != nil { + t.Fatalf("%s: error creating request: %v", name, err) + } + + for _, p := range test.clientProtocols { + req.Header.Add(HeaderProtocolVersion, p) + } + + w := newResponseWriter() + negotiated, err := Handshake(req, w, test.serverProtocols) + + // verify negotiated protocol + if e, a := test.expectedProtocol, negotiated; e != a { + t.Errorf("%s: protocol: expected %q, got %q", name, e, a) + } + + if test.expectError { + if err == nil { + t.Errorf("%s: expected error but did not get one", name) + } + if w.statusCode == nil { + t.Errorf("%s: expected w.statusCode to be set", name) + } else if e, a := http.StatusForbidden, *w.statusCode; e != a { + t.Errorf("%s: w.statusCode: expected %d, got %d", name, e, a) + } + if e, a := test.serverProtocols, w.Header()[HeaderAcceptedProtocolVersions]; !reflect.DeepEqual(e, a) { + t.Errorf("%s: accepted server protocols: expected %v, got %v", name, e, a) + } + continue + } + if !test.expectError && err != nil { + t.Errorf("%s: unexpected error: %v", name, err) + continue + } + if w.statusCode != nil { + t.Errorf("%s: unexpected non-nil w.statusCode: %d", name, w.statusCode) + } + + if len(test.expectedProtocol) == 0 { + if len(w.Header()[HeaderProtocolVersion]) > 0 { + t.Errorf("%s: unexpected protocol version response header: %s", name, w.Header()[HeaderProtocolVersion]) + } + continue + } + + // verify response headers + if e, a := []string{test.expectedProtocol}, w.Header()[HeaderProtocolVersion]; !reflect.DeepEqual(e, a) { + t.Errorf("%s: protocol response header: expected %v, got %v", name, e, a) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD index 75d6ec0d..9721de40 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD @@ -15,8 +15,8 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", "//vendor/github.com/elazarl/goproxy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", ], ) @@ -27,18 +27,19 @@ go_library( "roundtripper.go", "upgrade.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy", importpath = "k8s.io/apimachinery/pkg/util/httpstream/spdy", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/third_party/forked/golang/netutil:go_default_library", "//vendor/github.com/docker/spdystream:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/third_party/forked/golang/netutil:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go new file mode 100644 index 00000000..f94e2b3b --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection_test.go @@ -0,0 +1,164 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 spdy + +import ( + "io" + "net" + "net/http" + "sync" + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/httpstream" +) + +func runProxy(t *testing.T, backendUrl string, proxyUrl chan<- string, proxyDone chan<- struct{}) { + listener, err := net.Listen("tcp4", "localhost:0") + if err != nil { + t.Fatalf("error listening: %v", err) + } + defer listener.Close() + + proxyUrl <- listener.Addr().String() + + clientConn, err := listener.Accept() + if err != nil { + t.Errorf("proxy: error accepting client connection: %v", err) + return + } + + backendConn, err := net.Dial("tcp4", backendUrl) + if err != nil { + t.Errorf("proxy: error dialing backend: %v", err) + return + } + defer backendConn.Close() + + var wg sync.WaitGroup + wg.Add(2) + + go func() { + defer wg.Done() + io.Copy(backendConn, clientConn) + }() + + go func() { + defer wg.Done() + io.Copy(clientConn, backendConn) + }() + + wg.Wait() + + proxyDone <- struct{}{} +} + +func runServer(t *testing.T, backendUrl chan<- string, serverDone chan<- struct{}) { + listener, err := net.Listen("tcp4", "localhost:0") + if err != nil { + t.Fatalf("server: error listening: %v", err) + } + defer listener.Close() + + backendUrl <- listener.Addr().String() + + conn, err := listener.Accept() + if err != nil { + t.Errorf("server: error accepting connection: %v", err) + return + } + + streamChan := make(chan httpstream.Stream) + replySentChan := make(chan (<-chan struct{})) + spdyConn, err := NewServerConnection(conn, func(stream httpstream.Stream, replySent <-chan struct{}) error { + streamChan <- stream + replySentChan <- replySent + return nil + }) + if err != nil { + t.Errorf("server: error creating spdy connection: %v", err) + return + } + + stream := <-streamChan + replySent := <-replySentChan + <-replySent + + buf := make([]byte, 1) + _, err = stream.Read(buf) + if err != io.EOF { + t.Errorf("server: unexpected read error: %v", err) + return + } + + <-spdyConn.CloseChan() + raw := spdyConn.(*connection).conn + if err := raw.Wait(15 * time.Second); err != nil { + t.Errorf("server: timed out waiting for connection closure: %v", err) + } + + serverDone <- struct{}{} +} + +func TestConnectionCloseIsImmediateThroughAProxy(t *testing.T) { + serverDone := make(chan struct{}) + backendUrlChan := make(chan string) + go runServer(t, backendUrlChan, serverDone) + backendUrl := <-backendUrlChan + + proxyDone := make(chan struct{}) + proxyUrlChan := make(chan string) + go runProxy(t, backendUrl, proxyUrlChan, proxyDone) + proxyUrl := <-proxyUrlChan + + conn, err := net.Dial("tcp4", proxyUrl) + if err != nil { + t.Fatalf("client: error connecting to proxy: %v", err) + } + + spdyConn, err := NewClientConnection(conn) + if err != nil { + t.Fatalf("client: error creating spdy connection: %v", err) + } + + if _, err := spdyConn.CreateStream(http.Header{}); err != nil { + t.Fatalf("client: error creating stream: %v", err) + } + + spdyConn.Close() + raw := spdyConn.(*connection).conn + if err := raw.Wait(15 * time.Second); err != nil { + t.Fatalf("client: timed out waiting for connection closure: %v", err) + } + + expired := time.NewTimer(15 * time.Second) + defer expired.Stop() + i := 0 + for { + select { + case <-expired.C: + t.Fatalf("timed out waiting for proxy and/or server closure") + case <-serverDone: + i++ + case <-proxyDone: + i++ + } + if i == 2 { + break + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go new file mode 100644 index 00000000..fb396bca --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go @@ -0,0 +1,529 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 spdy + +import ( + "crypto/tls" + "crypto/x509" + "encoding/base64" + "fmt" + "io" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "sync/atomic" + "testing" + + "github.com/elazarl/goproxy" + + "k8s.io/apimachinery/pkg/util/httpstream" +) + +// be sure to unset environment variable https_proxy (if exported) before testing, otherwise the testing will fail unexpectedly. +func TestRoundTripAndNewConnection(t *testing.T) { + for _, redirect := range []bool{false, true} { + t.Run(fmt.Sprintf("redirect = %t", redirect), func(t *testing.T) { + localhostPool := x509.NewCertPool() + if !localhostPool.AppendCertsFromPEM(localhostCert) { + t.Errorf("error setting up localhostCert pool") + } + + httpsServerInvalidHostname := func(h http.Handler) *httptest.Server { + cert, err := tls.X509KeyPair(exampleCert, exampleKey) + if err != nil { + t.Errorf("https (invalid hostname): proxy_test: %v", err) + } + ts := httptest.NewUnstartedServer(h) + ts.TLS = &tls.Config{ + Certificates: []tls.Certificate{cert}, + } + ts.StartTLS() + return ts + } + + httpsServerValidHostname := func(h http.Handler) *httptest.Server { + cert, err := tls.X509KeyPair(localhostCert, localhostKey) + if err != nil { + t.Errorf("https (valid hostname): proxy_test: %v", err) + } + ts := httptest.NewUnstartedServer(h) + ts.TLS = &tls.Config{ + Certificates: []tls.Certificate{cert}, + } + ts.StartTLS() + return ts + } + + testCases := map[string]struct { + serverFunc func(http.Handler) *httptest.Server + proxyServerFunc func(http.Handler) *httptest.Server + proxyAuth *url.Userinfo + clientTLS *tls.Config + serverConnectionHeader string + serverUpgradeHeader string + serverStatusCode int + shouldError bool + }{ + "no headers": { + serverFunc: httptest.NewServer, + serverConnectionHeader: "", + serverUpgradeHeader: "", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: true, + }, + "no upgrade header": { + serverFunc: httptest.NewServer, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: true, + }, + "no connection header": { + serverFunc: httptest.NewServer, + serverConnectionHeader: "", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: true, + }, + "no switching protocol status code": { + serverFunc: httptest.NewServer, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusForbidden, + shouldError: true, + }, + "http": { + serverFunc: httptest.NewServer, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "https (invalid hostname + InsecureSkipVerify)": { + serverFunc: httpsServerInvalidHostname, + clientTLS: &tls.Config{InsecureSkipVerify: true}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "https (invalid hostname + hostname verification)": { + serverFunc: httpsServerInvalidHostname, + clientTLS: &tls.Config{InsecureSkipVerify: false}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: true, + }, + "https (valid hostname + RootCAs)": { + serverFunc: httpsServerValidHostname, + clientTLS: &tls.Config{RootCAs: localhostPool}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "proxied http->http": { + serverFunc: httptest.NewServer, + proxyServerFunc: httptest.NewServer, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "proxied https (invalid hostname + InsecureSkipVerify) -> http": { + serverFunc: httptest.NewServer, + proxyServerFunc: httpsServerInvalidHostname, + clientTLS: &tls.Config{InsecureSkipVerify: true}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "proxied https with auth (invalid hostname + InsecureSkipVerify) -> http": { + serverFunc: httptest.NewServer, + proxyServerFunc: httpsServerInvalidHostname, + proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), + clientTLS: &tls.Config{InsecureSkipVerify: true}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "proxied https (invalid hostname + hostname verification) -> http": { + serverFunc: httptest.NewServer, + proxyServerFunc: httpsServerInvalidHostname, + clientTLS: &tls.Config{InsecureSkipVerify: false}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: true, // fails because the client doesn't trust the proxy + }, + "proxied https (valid hostname + RootCAs) -> http": { + serverFunc: httptest.NewServer, + proxyServerFunc: httpsServerValidHostname, + clientTLS: &tls.Config{RootCAs: localhostPool}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "proxied https with auth (valid hostname + RootCAs) -> http": { + serverFunc: httptest.NewServer, + proxyServerFunc: httpsServerValidHostname, + proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), + clientTLS: &tls.Config{RootCAs: localhostPool}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "proxied https (invalid hostname + InsecureSkipVerify) -> https (invalid hostname)": { + serverFunc: httpsServerInvalidHostname, + proxyServerFunc: httpsServerInvalidHostname, + clientTLS: &tls.Config{InsecureSkipVerify: true}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, // works because the test proxy ignores TLS errors + }, + "proxied https with auth (invalid hostname + InsecureSkipVerify) -> https (invalid hostname)": { + serverFunc: httpsServerInvalidHostname, + proxyServerFunc: httpsServerInvalidHostname, + proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), + clientTLS: &tls.Config{InsecureSkipVerify: true}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, // works because the test proxy ignores TLS errors + }, + "proxied https (invalid hostname + hostname verification) -> https (invalid hostname)": { + serverFunc: httpsServerInvalidHostname, + proxyServerFunc: httpsServerInvalidHostname, + clientTLS: &tls.Config{InsecureSkipVerify: false}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: true, // fails because the client doesn't trust the proxy + }, + "proxied https (valid hostname + RootCAs) -> https (valid hostname + RootCAs)": { + serverFunc: httpsServerValidHostname, + proxyServerFunc: httpsServerValidHostname, + clientTLS: &tls.Config{RootCAs: localhostPool}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + "proxied https with auth (valid hostname + RootCAs) -> https (valid hostname + RootCAs)": { + serverFunc: httpsServerValidHostname, + proxyServerFunc: httpsServerValidHostname, + proxyAuth: url.UserPassword("proxyuser", "proxypasswd"), + clientTLS: &tls.Config{RootCAs: localhostPool}, + serverConnectionHeader: "Upgrade", + serverUpgradeHeader: "SPDY/3.1", + serverStatusCode: http.StatusSwitchingProtocols, + shouldError: false, + }, + } + + for k, testCase := range testCases { + server := testCase.serverFunc(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if testCase.shouldError { + if e, a := httpstream.HeaderUpgrade, req.Header.Get(httpstream.HeaderConnection); e != a { + t.Fatalf("%s: Expected connection=upgrade header, got '%s", k, a) + } + + w.Header().Set(httpstream.HeaderConnection, testCase.serverConnectionHeader) + w.Header().Set(httpstream.HeaderUpgrade, testCase.serverUpgradeHeader) + w.WriteHeader(testCase.serverStatusCode) + + return + } + + streamCh := make(chan httpstream.Stream) + + responseUpgrader := NewResponseUpgrader() + spdyConn := responseUpgrader.UpgradeResponse(w, req, func(s httpstream.Stream, replySent <-chan struct{}) error { + streamCh <- s + return nil + }) + if spdyConn == nil { + t.Fatalf("%s: unexpected nil spdyConn", k) + } + defer spdyConn.Close() + + stream := <-streamCh + io.Copy(stream, stream) + })) + defer server.Close() + + serverURL, err := url.Parse(server.URL) + if err != nil { + t.Fatalf("%s: Error creating request: %s", k, err) + } + req, err := http.NewRequest("GET", server.URL, nil) + if err != nil { + t.Fatalf("%s: Error creating request: %s", k, err) + } + + spdyTransport := NewSpdyRoundTripper(testCase.clientTLS, redirect) + + var proxierCalled bool + var proxyCalledWithHost string + var proxyCalledWithAuth bool + var proxyCalledWithAuthHeader string + if testCase.proxyServerFunc != nil { + proxyHandler := goproxy.NewProxyHttpServer() + + proxyHandler.OnRequest().HandleConnectFunc(func(host string, ctx *goproxy.ProxyCtx) (*goproxy.ConnectAction, string) { + proxyCalledWithHost = host + + proxyAuthHeaderName := "Proxy-Authorization" + _, proxyCalledWithAuth = ctx.Req.Header[proxyAuthHeaderName] + proxyCalledWithAuthHeader = ctx.Req.Header.Get(proxyAuthHeaderName) + return goproxy.OkConnect, host + }) + + proxy := testCase.proxyServerFunc(proxyHandler) + + spdyTransport.proxier = func(proxierReq *http.Request) (*url.URL, error) { + proxierCalled = true + proxyURL, err := url.Parse(proxy.URL) + if err != nil { + return nil, err + } + proxyURL.User = testCase.proxyAuth + return proxyURL, nil + } + defer proxy.Close() + } + + client := &http.Client{Transport: spdyTransport} + + resp, err := client.Do(req) + var conn httpstream.Connection + if err == nil { + conn, err = spdyTransport.NewConnection(resp) + } + haveErr := err != nil + if e, a := testCase.shouldError, haveErr; e != a { + t.Fatalf("%s: shouldError=%t, got %t: %v", k, e, a, err) + } + if testCase.shouldError { + continue + } + defer conn.Close() + + if resp.StatusCode != http.StatusSwitchingProtocols { + t.Fatalf("%s: expected http 101 switching protocols, got %d", k, resp.StatusCode) + } + + stream, err := conn.CreateStream(http.Header{}) + if err != nil { + t.Fatalf("%s: error creating client stream: %s", k, err) + } + + n, err := stream.Write([]byte("hello")) + if err != nil { + t.Fatalf("%s: error writing to stream: %s", k, err) + } + if n != 5 { + t.Fatalf("%s: Expected to write 5 bytes, but actually wrote %d", k, n) + } + + b := make([]byte, 5) + n, err = stream.Read(b) + if err != nil { + t.Fatalf("%s: error reading from stream: %s", k, err) + } + if n != 5 { + t.Fatalf("%s: Expected to read 5 bytes, but actually read %d", k, n) + } + if e, a := "hello", string(b[0:n]); e != a { + t.Fatalf("%s: expected '%s', got '%s'", k, e, a) + } + + if testCase.proxyServerFunc != nil { + if !proxierCalled { + t.Fatalf("%s: Expected to use a proxy but proxier in SpdyRoundTripper wasn't called", k) + } + if proxyCalledWithHost != serverURL.Host { + t.Fatalf("%s: Expected to see a call to the proxy for backend %q, got %q", k, serverURL.Host, proxyCalledWithHost) + } + } + + var expectedProxyAuth string + if testCase.proxyAuth != nil { + encodedCredentials := base64.StdEncoding.EncodeToString([]byte(testCase.proxyAuth.String())) + expectedProxyAuth = "Basic " + encodedCredentials + } + if len(expectedProxyAuth) == 0 && proxyCalledWithAuth { + t.Fatalf("%s: Proxy authorization unexpected, got %q", k, proxyCalledWithAuthHeader) + } + if proxyCalledWithAuthHeader != expectedProxyAuth { + t.Fatalf("%s: Expected to see a call to the proxy with credentials %q, got %q", k, testCase.proxyAuth, proxyCalledWithAuthHeader) + } + } + }) + } +} + +func TestRoundTripRedirects(t *testing.T) { + tests := []struct { + redirects int32 + expectSuccess bool + }{ + {0, true}, + {1, true}, + {10, true}, + {11, false}, + } + for _, test := range tests { + t.Run(fmt.Sprintf("with %d redirects", test.redirects), func(t *testing.T) { + var redirects int32 = 0 + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if redirects < test.redirects { + atomic.AddInt32(&redirects, 1) + http.Redirect(w, req, "redirect", http.StatusFound) + return + } + streamCh := make(chan httpstream.Stream) + + responseUpgrader := NewResponseUpgrader() + spdyConn := responseUpgrader.UpgradeResponse(w, req, func(s httpstream.Stream, replySent <-chan struct{}) error { + streamCh <- s + return nil + }) + if spdyConn == nil { + t.Fatalf("unexpected nil spdyConn") + } + defer spdyConn.Close() + + stream := <-streamCh + io.Copy(stream, stream) + })) + defer server.Close() + + req, err := http.NewRequest("GET", server.URL, nil) + if err != nil { + t.Fatalf("Error creating request: %s", err) + } + + spdyTransport := NewSpdyRoundTripper(nil, true) + client := &http.Client{Transport: spdyTransport} + + resp, err := client.Do(req) + if test.expectSuccess { + if err != nil { + t.Fatalf("error calling Do: %v", err) + } + } else { + if err == nil { + t.Fatalf("expecting an error") + } else if !strings.Contains(err.Error(), "too many redirects") { + t.Fatalf("expecting too many redirects, got %v", err) + } + return + } + + conn, err := spdyTransport.NewConnection(resp) + if err != nil { + t.Fatalf("error calling NewConnection: %v", err) + } + defer conn.Close() + + if resp.StatusCode != http.StatusSwitchingProtocols { + t.Fatalf("expected http 101 switching protocols, got %d", resp.StatusCode) + } + + stream, err := conn.CreateStream(http.Header{}) + if err != nil { + t.Fatalf("error creating client stream: %s", err) + } + + n, err := stream.Write([]byte("hello")) + if err != nil { + t.Fatalf("error writing to stream: %s", err) + } + if n != 5 { + t.Fatalf("Expected to write 5 bytes, but actually wrote %d", n) + } + + b := make([]byte, 5) + n, err = stream.Read(b) + if err != nil { + t.Fatalf("error reading from stream: %s", err) + } + if n != 5 { + t.Fatalf("Expected to read 5 bytes, but actually read %d", n) + } + if e, a := "hello", string(b[0:n]); e != a { + t.Fatalf("expected '%s', got '%s'", e, a) + } + }) + } +} + +// exampleCert was generated from crypto/tls/generate_cert.go with the following command: +// go run generate_cert.go --rsa-bits 512 --host example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h +var exampleCert = []byte(`-----BEGIN CERTIFICATE----- +MIIBdzCCASGgAwIBAgIRAOVTAdPnfbS5V85mfS90TfIwDQYJKoZIhvcNAQELBQAw +EjEQMA4GA1UEChMHQWNtZSBDbzAgFw03MDAxMDEwMDAwMDBaGA8yMDg0MDEyOTE2 +MDAwMFowEjEQMA4GA1UEChMHQWNtZSBDbzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC +QQCoVSqeu8TBvF+70T7Jm4340YQNhds6IxjRoifenYodAO1dnKGrcbF266DJGunh +nIjQH7B12tduhl0fLK4Ezf7/AgMBAAGjUDBOMA4GA1UdDwEB/wQEAwICpDATBgNV +HSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MBYGA1UdEQQPMA2CC2V4 +YW1wbGUuY29tMA0GCSqGSIb3DQEBCwUAA0EAk1kVa5uZ/AzwYDVcS9bpM/czwjjV +xq3VeSCfmNa2uNjbFvodmCRwZOHUvipAMGCUCV6j5vMrJ8eMj8tCQ36W9A== +-----END CERTIFICATE-----`) + +var exampleKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIIBOgIBAAJBAKhVKp67xMG8X7vRPsmbjfjRhA2F2zojGNGiJ96dih0A7V2coatx +sXbroMka6eGciNAfsHXa126GXR8srgTN/v8CAwEAAQJASdzdD7vKsUwMIejGCUb1 +fAnLTPfAY3lFCa+CmR89nE22dAoRDv+5RbnBsZ58BazPNJHrsVPRlfXB3OQmSQr0 +SQIhANoJhs+xOJE/i8nJv0uAbzKyiD1YkvRkta0GpUOULyAVAiEAxaQus3E/SuqD +P7y5NeJnE7X6XkyC35zrsJRkz7orE8MCIHdDjsI8pjyNDeGqwUCDWE/a6DrmIDwe +emHSqMN2YvChAiEAnxLCM9NWaenOsaIoP+J1rDuvw+4499nJKVqGuVrSCRkCIEqK +4KSchPMc3x8M/uhw9oWTtKFmjA/PPh0FsWCdKrEy +-----END RSA PRIVATE KEY-----`) + +// localhostCert was generated from crypto/tls/generate_cert.go with the following command: +// go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h +var localhostCert = []byte(`-----BEGIN CERTIFICATE----- +MIIBjzCCATmgAwIBAgIRAKpi2WmTcFrVjxrl5n5YDUEwDQYJKoZIhvcNAQELBQAw +EjEQMA4GA1UEChMHQWNtZSBDbzAgFw03MDAxMDEwMDAwMDBaGA8yMDg0MDEyOTE2 +MDAwMFowEjEQMA4GA1UEChMHQWNtZSBDbzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgC +QQC9fEbRszP3t14Gr4oahV7zFObBI4TfA5i7YnlMXeLinb7MnvT4bkfOJzE6zktn +59zP7UiHs3l4YOuqrjiwM413AgMBAAGjaDBmMA4GA1UdDwEB/wQEAwICpDATBgNV +HSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MC4GA1UdEQQnMCWCC2V4 +YW1wbGUuY29thwR/AAABhxAAAAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUA +A0EAUsVE6KMnza/ZbodLlyeMzdo7EM/5nb5ywyOxgIOCf0OOLHsPS9ueGLQX9HEG +//yjTXuhNcUugExIjM/AIwAZPQ== +-----END CERTIFICATE-----`) + +// localhostKey is the private key for localhostCert. +var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIIBOwIBAAJBAL18RtGzM/e3XgavihqFXvMU5sEjhN8DmLtieUxd4uKdvsye9Phu +R84nMTrOS2fn3M/tSIezeXhg66quOLAzjXcCAwEAAQJBAKcRxH9wuglYLBdI/0OT +BLzfWPZCEw1vZmMR2FF1Fm8nkNOVDPleeVGTWoOEcYYlQbpTmkGSxJ6ya+hqRi6x +goECIQDx3+X49fwpL6B5qpJIJMyZBSCuMhH4B7JevhGGFENi3wIhAMiNJN5Q3UkL +IuSvv03kaPR5XVQ99/UeEetUgGvBcABpAiBJSBzVITIVCGkGc7d+RCf49KTCIklv +bGWObufAR8Ni4QIgWpILjW8dkGg8GOUZ0zaNA6Nvt6TIv2UWGJ4v5PoV98kCIQDx +rIiZs5QbKdycsv9gQJzwQAogC8o04X3Zz3dsoX+h4A== +-----END RSA PRIVATE KEY-----`) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade_test.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade_test.go new file mode 100644 index 00000000..5a514dd5 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade_test.go @@ -0,0 +1,93 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 spdy + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func TestUpgradeResponse(t *testing.T) { + testCases := []struct { + connectionHeader string + upgradeHeader string + shouldError bool + }{ + { + connectionHeader: "", + upgradeHeader: "", + shouldError: true, + }, + { + connectionHeader: "Upgrade", + upgradeHeader: "", + shouldError: true, + }, + { + connectionHeader: "", + upgradeHeader: "SPDY/3.1", + shouldError: true, + }, + { + connectionHeader: "Upgrade", + upgradeHeader: "SPDY/3.1", + shouldError: false, + }, + } + + for i, testCase := range testCases { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + upgrader := NewResponseUpgrader() + conn := upgrader.UpgradeResponse(w, req, nil) + haveErr := conn == nil + if e, a := testCase.shouldError, haveErr; e != a { + t.Fatalf("%d: expected shouldErr=%t, got %t", i, testCase.shouldError, haveErr) + } + if haveErr { + return + } + if conn == nil { + t.Fatalf("%d: unexpected nil conn", i) + } + defer conn.Close() + })) + defer server.Close() + + req, err := http.NewRequest("GET", server.URL, nil) + if err != nil { + t.Fatalf("%d: error creating request: %s", i, err) + } + + req.Header.Set("Connection", testCase.connectionHeader) + req.Header.Set("Upgrade", testCase.upgradeHeader) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + t.Fatalf("%d: unexpected non-nil err from client.Do: %s", i, err) + } + + if testCase.shouldError { + continue + } + + if resp.StatusCode != http.StatusSwitchingProtocols { + t.Fatalf("%d: expected status 101 switching protocols, got %d", i, resp.StatusCode) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD b/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD index 73e62bcd..3e4b9eb7 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD @@ -19,6 +19,7 @@ go_library( "generated.pb.go", "intstr.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/intstr", importpath = "k8s.io/apimachinery/pkg/util/intstr", deps = [ "//vendor/github.com/gogo/protobuf/proto:go_default_library", @@ -39,9 +40,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go index 231498ca..642b83ce 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go +++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go @@ -18,6 +18,7 @@ package intstr import ( "encoding/json" + "errors" "fmt" "math" "runtime/debug" @@ -142,7 +143,17 @@ func (intstr *IntOrString) Fuzz(c fuzz.Continue) { } } +func ValueOrDefault(intOrPercent *IntOrString, defaultValue IntOrString) *IntOrString { + if intOrPercent == nil { + return &defaultValue + } + return intOrPercent +} + func GetValueFromIntOrPercent(intOrPercent *IntOrString, total int, roundUp bool) (int, error) { + if intOrPercent == nil { + return 0, errors.New("nil value for IntOrString") + } value, isPercent, err := getIntOrPercentValue(intOrPercent) if err != nil { return 0, fmt.Errorf("invalid value for IntOrString: %v", err) diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr_test.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr_test.go new file mode 100644 index 00000000..690fe2d5 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/intstr_test.go @@ -0,0 +1,183 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 intstr + +import ( + "encoding/json" + "reflect" + "testing" + + "github.com/ghodss/yaml" +) + +func TestFromInt(t *testing.T) { + i := FromInt(93) + if i.Type != Int || i.IntVal != 93 { + t.Errorf("Expected IntVal=93, got %+v", i) + } +} + +func TestFromString(t *testing.T) { + i := FromString("76") + if i.Type != String || i.StrVal != "76" { + t.Errorf("Expected StrVal=\"76\", got %+v", i) + } +} + +type IntOrStringHolder struct { + IOrS IntOrString `json:"val"` +} + +func TestIntOrStringUnmarshalJSON(t *testing.T) { + cases := []struct { + input string + result IntOrString + }{ + {"{\"val\": 123}", FromInt(123)}, + {"{\"val\": \"123\"}", FromString("123")}, + } + + for _, c := range cases { + var result IntOrStringHolder + if err := json.Unmarshal([]byte(c.input), &result); err != nil { + t.Errorf("Failed to unmarshal input '%v': %v", c.input, err) + } + if result.IOrS != c.result { + t.Errorf("Failed to unmarshal input '%v': expected %+v, got %+v", c.input, c.result, result) + } + } +} + +func TestIntOrStringMarshalJSON(t *testing.T) { + cases := []struct { + input IntOrString + result string + }{ + {FromInt(123), "{\"val\":123}"}, + {FromString("123"), "{\"val\":\"123\"}"}, + } + + for _, c := range cases { + input := IntOrStringHolder{c.input} + result, err := json.Marshal(&input) + if err != nil { + t.Errorf("Failed to marshal input '%v': %v", input, err) + } + if string(result) != c.result { + t.Errorf("Failed to marshal input '%v': expected: %+v, got %q", input, c.result, string(result)) + } + } +} + +func TestIntOrStringMarshalJSONUnmarshalYAML(t *testing.T) { + cases := []struct { + input IntOrString + }{ + {FromInt(123)}, + {FromString("123")}, + } + + for _, c := range cases { + input := IntOrStringHolder{c.input} + jsonMarshalled, err := json.Marshal(&input) + if err != nil { + t.Errorf("1: Failed to marshal input: '%v': %v", input, err) + } + + var result IntOrStringHolder + err = yaml.Unmarshal(jsonMarshalled, &result) + if err != nil { + t.Errorf("2: Failed to unmarshal '%+v': %v", string(jsonMarshalled), err) + } + + if !reflect.DeepEqual(input, result) { + t.Errorf("3: Failed to marshal input '%+v': got %+v", input, result) + } + } +} + +func TestGetValueFromIntOrPercent(t *testing.T) { + tests := []struct { + input IntOrString + total int + roundUp bool + expectErr bool + expectVal int + }{ + { + input: FromInt(123), + expectErr: false, + expectVal: 123, + }, + { + input: FromString("90%"), + total: 100, + roundUp: true, + expectErr: false, + expectVal: 90, + }, + { + input: FromString("90%"), + total: 95, + roundUp: true, + expectErr: false, + expectVal: 86, + }, + { + input: FromString("90%"), + total: 95, + roundUp: false, + expectErr: false, + expectVal: 85, + }, + { + input: FromString("%"), + expectErr: true, + }, + { + input: FromString("90#"), + expectErr: true, + }, + { + input: FromString("#%"), + expectErr: true, + }, + } + + for i, test := range tests { + t.Logf("test case %d", i) + value, err := GetValueFromIntOrPercent(&test.input, test.total, test.roundUp) + if test.expectErr && err == nil { + t.Errorf("expected error, but got none") + continue + } + if !test.expectErr && err != nil { + t.Errorf("unexpected err: %v", err) + continue + } + if test.expectVal != value { + t.Errorf("expected %v, but got %v", test.expectVal, value) + } + } +} + +func TestGetValueFromIntOrPercentNil(t *testing.T) { + _, err := GetValueFromIntOrPercent(nil, 0, false) + if err == nil { + t.Errorf("expected error got none") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/json/BUILD b/vendor/k8s.io/apimachinery/pkg/util/json/BUILD index c42821fc..d8ac6ce4 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/json/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/json/BUILD @@ -9,6 +9,7 @@ load( go_library( name = "go_default_library", srcs = ["json.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/json", importpath = "k8s.io/apimachinery/pkg/util/json", ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/json/json_test.go b/vendor/k8s.io/apimachinery/pkg/util/json/json_test.go new file mode 100644 index 00000000..cd0c18bb --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/json/json_test.go @@ -0,0 +1,319 @@ +// +build go1.8 + +/* +Copyright 2015 The Kubernetes Authors. + +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 json + +import ( + "fmt" + "math" + "reflect" + "strconv" + "strings" + "testing" +) + +func TestEvaluateTypes(t *testing.T) { + testCases := []struct { + In string + Data interface{} + Out string + Err bool + }{ + // Invalid syntaxes + { + In: `x`, + Err: true, + }, + { + In: ``, + Err: true, + }, + + // Null + { + In: `null`, + Data: nil, + Out: `null`, + }, + // Booleans + { + In: `true`, + Data: true, + Out: `true`, + }, + { + In: `false`, + Data: false, + Out: `false`, + }, + + // Integers + { + In: `0`, + Data: int64(0), + Out: `0`, + }, + { + In: `-0`, + Data: int64(-0), + Out: `0`, + }, + { + In: `1`, + Data: int64(1), + Out: `1`, + }, + { + In: `2147483647`, + Data: int64(math.MaxInt32), + Out: `2147483647`, + }, + { + In: `-2147483648`, + Data: int64(math.MinInt32), + Out: `-2147483648`, + }, + { + In: `9223372036854775807`, + Data: int64(math.MaxInt64), + Out: `9223372036854775807`, + }, + { + In: `-9223372036854775808`, + Data: int64(math.MinInt64), + Out: `-9223372036854775808`, + }, + + // Int overflow + { + In: `9223372036854775808`, // MaxInt64 + 1 + Data: float64(9223372036854775808), + Out: `9223372036854776000`, + }, + { + In: `-9223372036854775809`, // MinInt64 - 1 + Data: float64(math.MinInt64), + Out: `-9223372036854776000`, + }, + + // Floats + { + In: `0.0`, + Data: float64(0), + Out: `0`, + }, + { + In: `-0.0`, + Data: float64(-0.0), + Out: `-0`, + }, + { + In: `0.5`, + Data: float64(0.5), + Out: `0.5`, + }, + { + In: `1e3`, + Data: float64(1e3), + Out: `1000`, + }, + { + In: `1.5`, + Data: float64(1.5), + Out: `1.5`, + }, + { + In: `-0.3`, + Data: float64(-.3), + Out: `-0.3`, + }, + { + // Largest representable float32 + In: `3.40282346638528859811704183484516925440e+38`, + Data: float64(math.MaxFloat32), + Out: strconv.FormatFloat(math.MaxFloat32, 'g', -1, 64), + }, + { + // Smallest float32 without losing precision + In: `1.175494351e-38`, + Data: float64(1.175494351e-38), + Out: `1.175494351e-38`, + }, + { + // float32 closest to zero + In: `1.401298464324817070923729583289916131280e-45`, + Data: float64(math.SmallestNonzeroFloat32), + Out: strconv.FormatFloat(math.SmallestNonzeroFloat32, 'g', -1, 64), + }, + { + // Largest representable float64 + In: `1.797693134862315708145274237317043567981e+308`, + Data: float64(math.MaxFloat64), + Out: strconv.FormatFloat(math.MaxFloat64, 'g', -1, 64), + }, + { + // Closest to zero without losing precision + In: `2.2250738585072014e-308`, + Data: float64(2.2250738585072014e-308), + Out: `2.2250738585072014e-308`, + }, + + { + // float64 closest to zero + In: `4.940656458412465441765687928682213723651e-324`, + Data: float64(math.SmallestNonzeroFloat64), + Out: strconv.FormatFloat(math.SmallestNonzeroFloat64, 'g', -1, 64), + }, + + { + // math.MaxFloat64 + 2 overflow + In: `1.7976931348623159e+308`, + Err: true, + }, + + // Strings + { + In: `""`, + Data: string(""), + Out: `""`, + }, + { + In: `"0"`, + Data: string("0"), + Out: `"0"`, + }, + { + In: `"A"`, + Data: string("A"), + Out: `"A"`, + }, + { + In: `"Iñtërnâtiônàlizætiøn"`, + Data: string("Iñtërnâtiônàlizætiøn"), + Out: `"Iñtërnâtiônàlizætiøn"`, + }, + + // Arrays + { + In: `[]`, + Data: []interface{}{}, + Out: `[]`, + }, + { + In: `[` + strings.Join([]string{ + `null`, + `true`, + `false`, + `0`, + `9223372036854775807`, + `0.0`, + `0.5`, + `1.0`, + `1.797693134862315708145274237317043567981e+308`, + `"0"`, + `"A"`, + `"Iñtërnâtiônàlizætiøn"`, + `[null,true,1,1.0,1.5]`, + `{"boolkey":true,"floatkey":1.0,"intkey":1,"nullkey":null}`, + }, ",") + `]`, + Data: []interface{}{ + nil, + true, + false, + int64(0), + int64(math.MaxInt64), + float64(0.0), + float64(0.5), + float64(1.0), + float64(math.MaxFloat64), + string("0"), + string("A"), + string("Iñtërnâtiônàlizætiøn"), + []interface{}{nil, true, int64(1), float64(1.0), float64(1.5)}, + map[string]interface{}{"nullkey": nil, "boolkey": true, "intkey": int64(1), "floatkey": float64(1.0)}, + }, + Out: `[` + strings.Join([]string{ + `null`, + `true`, + `false`, + `0`, + `9223372036854775807`, + `0`, + `0.5`, + `1`, + strconv.FormatFloat(math.MaxFloat64, 'g', -1, 64), + `"0"`, + `"A"`, + `"Iñtërnâtiônàlizætiøn"`, + `[null,true,1,1,1.5]`, + `{"boolkey":true,"floatkey":1,"intkey":1,"nullkey":null}`, // gets alphabetized by Marshal + }, ",") + `]`, + }, + + // Maps + { + In: `{}`, + Data: map[string]interface{}{}, + Out: `{}`, + }, + { + In: `{"boolkey":true,"floatkey":1.0,"intkey":1,"nullkey":null}`, + Data: map[string]interface{}{"nullkey": nil, "boolkey": true, "intkey": int64(1), "floatkey": float64(1.0)}, + Out: `{"boolkey":true,"floatkey":1,"intkey":1,"nullkey":null}`, // gets alphabetized by Marshal + }, + } + + for _, tc := range testCases { + inputJSON := fmt.Sprintf(`{"data":%s}`, tc.In) + expectedJSON := fmt.Sprintf(`{"data":%s}`, tc.Out) + m := map[string]interface{}{} + err := Unmarshal([]byte(inputJSON), &m) + if tc.Err && err != nil { + // Expected error + continue + } + if err != nil { + t.Errorf("%s: error decoding: %v", tc.In, err) + continue + } + if tc.Err { + t.Errorf("%s: expected error, got none", tc.In) + continue + } + data, ok := m["data"] + if !ok { + t.Errorf("%s: decoded object missing data key: %#v", tc.In, m) + continue + } + if !reflect.DeepEqual(tc.Data, data) { + t.Errorf("%s: expected\n\t%#v (%v), got\n\t%#v (%v)", tc.In, tc.Data, reflect.TypeOf(tc.Data), data, reflect.TypeOf(data)) + continue + } + + outputJSON, err := Marshal(m) + if err != nil { + t.Errorf("%s: error encoding: %v", tc.In, err) + continue + } + + if expectedJSON != string(outputJSON) { + t.Errorf("%s: expected\n\t%s, got\n\t%s", tc.In, expectedJSON, string(outputJSON)) + continue + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD index 0ddf97d1..1ed8649a 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD @@ -18,6 +18,7 @@ go_library( "errors.go", "util.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/mergepatch", importpath = "k8s.io/apimachinery/pkg/util/mergepatch", deps = [ "//vendor/github.com/davecgh/go-spew/spew:go_default_library", diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go index 9261290a..d09a939b 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go +++ b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util.go @@ -125,7 +125,7 @@ func HasConflicts(left, right interface{}) (bool, error) { default: return true, nil } - case string, float64, bool, int, int64, nil: + case string, float64, bool, int64, nil: return !reflect.DeepEqual(left, right), nil default: return true, fmt.Errorf("unknown type: %v", reflect.TypeOf(left)) diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util_test.go b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util_test.go new file mode 100644 index 00000000..e74dfabd --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/util_test.go @@ -0,0 +1,136 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 mergepatch + +import ( + "fmt" + "testing" +) + +func TestHasConflicts(t *testing.T) { + testCases := []struct { + A interface{} + B interface{} + Ret bool + }{ + {A: "hello", B: "hello", Ret: false}, + {A: "hello", B: "hell", Ret: true}, + {A: "hello", B: nil, Ret: true}, + {A: "hello", B: int64(1), Ret: true}, + {A: "hello", B: float64(1.0), Ret: true}, + {A: "hello", B: false, Ret: true}, + {A: int64(1), B: int64(1), Ret: false}, + {A: nil, B: nil, Ret: false}, + {A: false, B: false, Ret: false}, + {A: float64(3), B: float64(3), Ret: false}, + + {A: "hello", B: []interface{}{}, Ret: true}, + {A: []interface{}{int64(1)}, B: []interface{}{}, Ret: true}, + {A: []interface{}{}, B: []interface{}{}, Ret: false}, + {A: []interface{}{int64(1)}, B: []interface{}{int64(1)}, Ret: false}, + {A: map[string]interface{}{}, B: []interface{}{int64(1)}, Ret: true}, + + {A: map[string]interface{}{}, B: map[string]interface{}{"a": int64(1)}, Ret: false}, + {A: map[string]interface{}{"a": int64(1)}, B: map[string]interface{}{"a": int64(1)}, Ret: false}, + {A: map[string]interface{}{"a": int64(1)}, B: map[string]interface{}{"a": int64(2)}, Ret: true}, + {A: map[string]interface{}{"a": int64(1)}, B: map[string]interface{}{"b": int64(2)}, Ret: false}, + + { + A: map[string]interface{}{"a": []interface{}{int64(1)}}, + B: map[string]interface{}{"a": []interface{}{int64(1)}}, + Ret: false, + }, + { + A: map[string]interface{}{"a": []interface{}{int64(1)}}, + B: map[string]interface{}{"a": []interface{}{}}, + Ret: true, + }, + { + A: map[string]interface{}{"a": []interface{}{int64(1)}}, + B: map[string]interface{}{"a": int64(1)}, + Ret: true, + }, + + // Maps and lists with multiple entries. + { + A: map[string]interface{}{"a": int64(1), "b": int64(2)}, + B: map[string]interface{}{"a": int64(1), "b": int64(0)}, + Ret: true, + }, + { + A: map[string]interface{}{"a": int64(1), "b": int64(2)}, + B: map[string]interface{}{"a": int64(1), "b": int64(2)}, + Ret: false, + }, + { + A: map[string]interface{}{"a": int64(1), "b": int64(2)}, + B: map[string]interface{}{"a": int64(1), "b": int64(0), "c": int64(3)}, + Ret: true, + }, + { + A: map[string]interface{}{"a": int64(1), "b": int64(2)}, + B: map[string]interface{}{"a": int64(1), "b": int64(2), "c": int64(3)}, + Ret: false, + }, + { + A: map[string]interface{}{"a": []interface{}{int64(1), int64(2)}}, + B: map[string]interface{}{"a": []interface{}{int64(1), int64(0)}}, + Ret: true, + }, + { + A: map[string]interface{}{"a": []interface{}{int64(1), int64(2)}}, + B: map[string]interface{}{"a": []interface{}{int64(1), int64(2)}}, + Ret: false, + }, + + // Numeric types are not interchangeable. + // Callers are expected to ensure numeric types are consistent in 'left' and 'right'. + {A: int64(0), B: float64(0), Ret: true}, + // Other types are not interchangeable. + {A: int64(0), B: "0", Ret: true}, + {A: int64(0), B: nil, Ret: true}, + {A: int64(0), B: false, Ret: true}, + {A: "true", B: true, Ret: true}, + {A: "null", B: nil, Ret: true}, + } + + for _, testCase := range testCases { + testStr := fmt.Sprintf("A = %#v, B = %#v", testCase.A, testCase.B) + // Run each test case multiple times if it passes because HasConflicts() + // uses map iteration, which returns keys in nondeterministic order. + for try := 0; try < 10; try++ { + out, err := HasConflicts(testCase.A, testCase.B) + if err != nil { + t.Errorf("%v: unexpected error: %v", testStr, err) + break + } + if out != testCase.Ret { + t.Errorf("%v: expected %t got %t", testStr, testCase.Ret, out) + break + } + out, err = HasConflicts(testCase.B, testCase.A) + if err != nil { + t.Errorf("%v: unexpected error: %v", testStr, err) + break + } + if out != testCase.Ret { + t.Errorf("%v: expected reversed %t got %t", testStr, testCase.Ret, out) + break + } + } + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/healthz/BUILD b/vendor/k8s.io/apimachinery/pkg/util/naming/BUILD similarity index 50% rename from vendor/k8s.io/apiserver/pkg/server/healthz/BUILD rename to vendor/k8s.io/apimachinery/pkg/util/naming/BUILD index f4ccb496..d9046784 100644 --- a/vendor/k8s.io/apiserver/pkg/server/healthz/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/naming/BUILD @@ -1,25 +1,11 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["healthz_test.go"], - embed = [":go_default_library"], -) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", - srcs = [ - "doc.go", - "healthz.go", - ], - importpath = "k8s.io/apiserver/pkg/server/healthz", - deps = ["//vendor/github.com/golang/glog:go_default_library"], + srcs = ["from_stack.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/naming", + importpath = "k8s.io/apimachinery/pkg/util/naming", + visibility = ["//visibility:public"], ) filegroup( @@ -33,4 +19,11 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], +) + +go_test( + name = "go_default_test", + srcs = ["from_stack_test.go"], + embed = [":go_default_library"], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go b/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go new file mode 100644 index 00000000..2965d5a8 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go @@ -0,0 +1,93 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 naming + +import ( + "fmt" + "regexp" + goruntime "runtime" + "runtime/debug" + "strconv" + "strings" +) + +// GetNameFromCallsite walks back through the call stack until we find a caller from outside of the ignoredPackages +// it returns back a shortpath/filename:line to aid in identification of this reflector when it starts logging +func GetNameFromCallsite(ignoredPackages ...string) string { + name := "????" + const maxStack = 10 + for i := 1; i < maxStack; i++ { + _, file, line, ok := goruntime.Caller(i) + if !ok { + file, line, ok = extractStackCreator() + if !ok { + break + } + i += maxStack + } + if hasPackage(file, append(ignoredPackages, "/runtime/asm_")) { + continue + } + + file = trimPackagePrefix(file) + name = fmt.Sprintf("%s:%d", file, line) + break + } + return name +} + +// hasPackage returns true if the file is in one of the ignored packages. +func hasPackage(file string, ignoredPackages []string) bool { + for _, ignoredPackage := range ignoredPackages { + if strings.Contains(file, ignoredPackage) { + return true + } + } + return false +} + +// trimPackagePrefix reduces duplicate values off the front of a package name. +func trimPackagePrefix(file string) string { + if l := strings.LastIndex(file, "/vendor/"); l >= 0 { + return file[l+len("/vendor/"):] + } + if l := strings.LastIndex(file, "/src/"); l >= 0 { + return file[l+5:] + } + if l := strings.LastIndex(file, "/pkg/"); l >= 0 { + return file[l+1:] + } + return file +} + +var stackCreator = regexp.MustCompile(`(?m)^created by (.*)\n\s+(.*):(\d+) \+0x[[:xdigit:]]+$`) + +// extractStackCreator retrieves the goroutine file and line that launched this stack. Returns false +// if the creator cannot be located. +// TODO: Go does not expose this via runtime https://github.com/golang/go/issues/11440 +func extractStackCreator() (string, int, bool) { + stack := debug.Stack() + matches := stackCreator.FindStringSubmatch(string(stack)) + if matches == nil || len(matches) != 4 { + return "", 0, false + } + line, err := strconv.Atoi(matches[3]) + if err != nil { + return "", 0, false + } + return matches[2], line, true +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack_test.go b/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack_test.go new file mode 100644 index 00000000..1ff1ec8a --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/naming/from_stack_test.go @@ -0,0 +1,56 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 naming + +import "testing" + +func TestGetNameFromCallsite(t *testing.T) { + tests := []struct { + name string + ignoredPackages []string + expected string + }{ + { + name: "simple", + expected: "k8s.io/apimachinery/pkg/util/naming/from_stack_test.go:50", + }, + { + name: "ignore-package", + ignoredPackages: []string{"k8s.io/apimachinery/pkg/util/naming"}, + expected: "testing/testing.go:777", + }, + { + name: "ignore-file", + ignoredPackages: []string{"k8s.io/apimachinery/pkg/util/naming/from_stack_test.go"}, + expected: "testing/testing.go:777", + }, + { + name: "ignore-multiple", + ignoredPackages: []string{"k8s.io/apimachinery/pkg/util/naming/from_stack_test.go", "testing/testing.go"}, + expected: "????", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + actual := GetNameFromCallsite(tc.ignoredPackages...) + if tc.expected != actual { + t.Fatalf("expected %q, got %q", tc.expected, actual) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/BUILD b/vendor/k8s.io/apimachinery/pkg/util/net/BUILD index 9d0fffb1..00fba56b 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/net/BUILD @@ -28,11 +28,12 @@ go_library( "port_split.go", "util.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/net", importpath = "k8s.io/apimachinery/pkg/util/net", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/http.go b/vendor/k8s.io/apimachinery/pkg/util/net/http.go index 7ea2df22..8abbdea8 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/http.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/http.go @@ -91,7 +91,8 @@ func SetOldTransportDefaults(t *http.Transport) *http.Transport { // ProxierWithNoProxyCIDR allows CIDR rules in NO_PROXY t.Proxy = NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment) } - if t.DialContext == nil { + // If no custom dialer is set, use the default context dialer + if t.DialContext == nil && t.Dial == nil { t.DialContext = defaultTransport.DialContext } if t.TLSHandshakeTimeout == 0 { @@ -129,7 +130,18 @@ func DialerFor(transport http.RoundTripper) (DialFunc, error) { switch transport := transport.(type) { case *http.Transport: - return transport.DialContext, nil + // transport.DialContext takes precedence over transport.Dial + if transport.DialContext != nil { + return transport.DialContext, nil + } + // adapt transport.Dial to the DialWithContext signature + if transport.Dial != nil { + return func(ctx context.Context, net, addr string) (net.Conn, error) { + return transport.Dial(net, addr) + }, nil + } + // otherwise return nil + return nil, nil case RoundTripperWrapper: return DialerFor(transport.WrappedRoundTripper()) default: @@ -167,10 +179,8 @@ func FormatURL(scheme string, host string, port int, path string) *url.URL { } func GetHTTPClient(req *http.Request) string { - if userAgent, ok := req.Header["User-Agent"]; ok { - if len(userAgent) > 0 { - return userAgent[0] - } + if ua := req.UserAgent(); len(ua) != 0 { + return ua } return "unknown" } diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/http_test.go b/vendor/k8s.io/apimachinery/pkg/util/net/http_test.go new file mode 100644 index 00000000..98bd6497 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/net/http_test.go @@ -0,0 +1,282 @@ +// +build go1.8 + +/* +Copyright 2016 The Kubernetes Authors. + +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 net + +import ( + "crypto/tls" + "fmt" + "net" + "net/http" + "net/url" + "os" + "reflect" + "testing" +) + +func TestGetClientIP(t *testing.T) { + ipString := "10.0.0.1" + ip := net.ParseIP(ipString) + invalidIPString := "invalidIPString" + testCases := []struct { + Request http.Request + ExpectedIP net.IP + }{ + { + Request: http.Request{}, + }, + { + Request: http.Request{ + Header: map[string][]string{ + "X-Real-Ip": {ipString}, + }, + }, + ExpectedIP: ip, + }, + { + Request: http.Request{ + Header: map[string][]string{ + "X-Real-Ip": {invalidIPString}, + }, + }, + }, + { + Request: http.Request{ + Header: map[string][]string{ + "X-Forwarded-For": {ipString}, + }, + }, + ExpectedIP: ip, + }, + { + Request: http.Request{ + Header: map[string][]string{ + "X-Forwarded-For": {invalidIPString}, + }, + }, + }, + { + Request: http.Request{ + Header: map[string][]string{ + "X-Forwarded-For": {invalidIPString + "," + ipString}, + }, + }, + ExpectedIP: ip, + }, + { + Request: http.Request{ + // RemoteAddr is in the form host:port + RemoteAddr: ipString + ":1234", + }, + ExpectedIP: ip, + }, + { + Request: http.Request{ + RemoteAddr: invalidIPString, + }, + }, + { + Request: http.Request{ + Header: map[string][]string{ + "X-Forwarded-For": {invalidIPString}, + }, + // RemoteAddr is in the form host:port + RemoteAddr: ipString, + }, + ExpectedIP: ip, + }, + } + + for i, test := range testCases { + if a, e := GetClientIP(&test.Request), test.ExpectedIP; reflect.DeepEqual(e, a) != true { + t.Fatalf("test case %d failed. expected: %v, actual: %v", i, e, a) + } + } +} + +func TestAppendForwardedForHeader(t *testing.T) { + testCases := []struct { + addr, forwarded, expected string + }{ + {"1.2.3.4:8000", "", "1.2.3.4"}, + {"1.2.3.4:8000", "8.8.8.8", "8.8.8.8, 1.2.3.4"}, + {"1.2.3.4:8000", "8.8.8.8, 1.2.3.4", "8.8.8.8, 1.2.3.4, 1.2.3.4"}, + {"1.2.3.4:8000", "foo,bar", "foo,bar, 1.2.3.4"}, + } + for i, test := range testCases { + req := &http.Request{ + RemoteAddr: test.addr, + Header: make(http.Header), + } + if test.forwarded != "" { + req.Header.Set("X-Forwarded-For", test.forwarded) + } + + AppendForwardedForHeader(req) + actual := req.Header.Get("X-Forwarded-For") + if actual != test.expected { + t.Errorf("[%d] Expected %q, Got %q", i, test.expected, actual) + } + } +} + +func TestProxierWithNoProxyCIDR(t *testing.T) { + testCases := []struct { + name string + noProxy string + url string + + expectedDelegated bool + }{ + { + name: "no env", + url: "https://192.168.143.1/api", + expectedDelegated: true, + }, + { + name: "no cidr", + noProxy: "192.168.63.1", + url: "https://192.168.143.1/api", + expectedDelegated: true, + }, + { + name: "hostname", + noProxy: "192.168.63.0/24,192.168.143.0/24", + url: "https://my-hostname/api", + expectedDelegated: true, + }, + { + name: "match second cidr", + noProxy: "192.168.63.0/24,192.168.143.0/24", + url: "https://192.168.143.1/api", + expectedDelegated: false, + }, + { + name: "match second cidr with host:port", + noProxy: "192.168.63.0/24,192.168.143.0/24", + url: "https://192.168.143.1:8443/api", + expectedDelegated: false, + }, + { + name: "IPv6 cidr", + noProxy: "2001:db8::/48", + url: "https://[2001:db8::1]/api", + expectedDelegated: false, + }, + { + name: "IPv6+port cidr", + noProxy: "2001:db8::/48", + url: "https://[2001:db8::1]:8443/api", + expectedDelegated: false, + }, + { + name: "IPv6, not matching cidr", + noProxy: "2001:db8::/48", + url: "https://[2001:db8:1::1]/api", + expectedDelegated: true, + }, + { + name: "IPv6+port, not matching cidr", + noProxy: "2001:db8::/48", + url: "https://[2001:db8:1::1]:8443/api", + expectedDelegated: true, + }, + } + + for _, test := range testCases { + os.Setenv("NO_PROXY", test.noProxy) + actualDelegated := false + proxyFunc := NewProxierWithNoProxyCIDR(func(req *http.Request) (*url.URL, error) { + actualDelegated = true + return nil, nil + }) + + req, err := http.NewRequest("GET", test.url, nil) + if err != nil { + t.Errorf("%s: unexpected err: %v", test.name, err) + continue + } + if _, err := proxyFunc(req); err != nil { + t.Errorf("%s: unexpected err: %v", test.name, err) + continue + } + + if test.expectedDelegated != actualDelegated { + t.Errorf("%s: expected %v, got %v", test.name, test.expectedDelegated, actualDelegated) + continue + } + } +} + +type fakeTLSClientConfigHolder struct { + called bool +} + +func (f *fakeTLSClientConfigHolder) TLSClientConfig() *tls.Config { + f.called = true + return nil +} +func (f *fakeTLSClientConfigHolder) RoundTrip(*http.Request) (*http.Response, error) { + return nil, nil +} + +func TestTLSClientConfigHolder(t *testing.T) { + rt := &fakeTLSClientConfigHolder{} + TLSClientConfig(rt) + + if !rt.called { + t.Errorf("didn't find tls config") + } +} + +func TestJoinPreservingTrailingSlash(t *testing.T) { + tests := []struct { + a string + b string + want string + }{ + // All empty + {"", "", ""}, + + // Empty a + {"", "/", "/"}, + {"", "foo", "foo"}, + {"", "/foo", "/foo"}, + {"", "/foo/", "/foo/"}, + + // Empty b + {"/", "", "/"}, + {"foo", "", "foo"}, + {"/foo", "", "/foo"}, + {"/foo/", "", "/foo/"}, + + // Both populated + {"/", "/", "/"}, + {"foo", "foo", "foo/foo"}, + {"/foo", "/foo", "/foo/foo"}, + {"/foo/", "/foo/", "/foo/foo/"}, + } + for _, tt := range tests { + name := fmt.Sprintf("%q+%q=%q", tt.a, tt.b, tt.want) + t.Run(name, func(t *testing.T) { + if got := JoinPreservingTrailingSlash(tt.a, tt.b); got != tt.want { + t.Errorf("JoinPreservingTrailingSlash() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go b/vendor/k8s.io/apimachinery/pkg/util/net/interface.go index 42816bd7..0ab9b360 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/interface.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/interface.go @@ -53,6 +53,28 @@ type RouteFile struct { parse func(input io.Reader) ([]Route, error) } +// noRoutesError can be returned by ChooseBindAddress() in case of no routes +type noRoutesError struct { + message string +} + +func (e noRoutesError) Error() string { + return e.message +} + +// IsNoRoutesError checks if an error is of type noRoutesError +func IsNoRoutesError(err error) bool { + if err == nil { + return false + } + switch err.(type) { + case noRoutesError: + return true + default: + return false + } +} + var ( v4File = RouteFile{name: ipv4RouteFile, parse: getIPv4DefaultRoutes} v6File = RouteFile{name: ipv6RouteFile, parse: getIPv6DefaultRoutes} @@ -347,7 +369,9 @@ func getAllDefaultRoutes() ([]Route, error) { v6Routes, _ := v6File.extract() routes = append(routes, v6Routes...) if len(routes) == 0 { - return nil, fmt.Errorf("No default routes.") + return nil, noRoutesError{ + message: fmt.Sprintf("no default routes found in %q or %q", v4File.name, v6File.name), + } } return routes, nil } diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/interface_test.go b/vendor/k8s.io/apimachinery/pkg/util/net/interface_test.go new file mode 100644 index 00000000..d652f479 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/net/interface_test.go @@ -0,0 +1,725 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 net + +import ( + "fmt" + "io/ioutil" + "net" + "os" + "strings" + "testing" +) + +const gatewayfirst = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 +eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 +docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 +virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 +` +const gatewaylast = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 +virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 +eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 +eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 +` +const gatewaymiddle = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 +docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 +eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 +virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 +` +const noInternetConnection = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 +virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 +` +const nothing = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +` +const badDestination = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +eth3 00000000 0100FE0A 0003 0 0 1024 00000000 0 0 0 +eth3 0000FE0AA1 00000000 0001 0 0 0 0080FFFF 0 0 0 +docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 +virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 +` +const badGateway = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +eth3 00000000 0100FE0AA1 0003 0 0 1024 00000000 0 0 0 +eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 +docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 +virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 +` +const route_Invalidhex = `Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT +eth3 00000000 0100FE0AA 0003 0 0 1024 00000000 0 0 0 +eth3 0000FE0A 00000000 0001 0 0 0 0080FFFF 0 0 0 +docker0 000011AC 00000000 0001 0 0 0 0000FFFF 0 0 0 +virbr0 007AA8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0 +` + +const v6gatewayfirst = `00000000000000000000000000000000 00 00000000000000000000000000000000 00 20010001000000000000000000000001 00000064 00000000 00000000 00000003 eth3 +20010002000000000000000000000000 40 00000000000000000000000000000000 00 00000000000000000000000000000000 00000100 00000000 00000000 00000001 eth3 +00000000000000000000000000000000 60 00000000000000000000000000000000 00 00000000000000000000000000000000 00000400 00000000 00000000 00200200 lo +` +const v6gatewaylast = `20010002000000000000000000000000 40 00000000000000000000000000000000 00 00000000000000000000000000000000 00000100 00000000 00000000 00000001 eth3 +00000000000000000000000000000000 60 00000000000000000000000000000000 00 00000000000000000000000000000000 00000400 00000000 00000000 00200200 lo +00000000000000000000000000000000 00 00000000000000000000000000000000 00 20010001000000000000000000000001 00000064 00000000 00000000 00000003 eth3 +` +const v6gatewaymiddle = `20010002000000000000000000000000 40 00000000000000000000000000000000 00 00000000000000000000000000000000 00000100 00000000 00000000 00000001 eth3 +00000000000000000000000000000000 00 00000000000000000000000000000000 00 20010001000000000000000000000001 00000064 00000000 00000000 00000003 eth3 +00000000000000000000000000000000 60 00000000000000000000000000000000 00 00000000000000000000000000000000 00000400 00000000 00000000 00200200 lo +` +const v6noDefaultRoutes = `00000000000000000000000000000000 60 00000000000000000000000000000000 00 00000000000000000000000000000000 00000400 00000000 00000000 00200200 lo +20010001000000000000000000000000 40 00000000000000000000000000000000 00 00000000000000000000000000000000 00000400 00000000 00000000 00000001 docker0 +20010002000000000000000000000000 40 00000000000000000000000000000000 00 00000000000000000000000000000000 00000100 00000000 00000000 00000001 eth3 +fe800000000000000000000000000000 40 00000000000000000000000000000000 00 00000000000000000000000000000000 00000100 00000000 00000000 00000001 eth3 +` +const v6nothing = `` +const v6badDestination = `2001000200000000 7a 00000000000000000000000000000000 00 00000000000000000000000000000000 00000400 00000000 00000000 00200200 lo +` +const v6badGateway = `00000000000000000000000000000000 00 00000000000000000000000000000000 00 200100010000000000000000000000000012 00000064 00000000 00000000 00000003 eth3 +` +const v6route_Invalidhex = `000000000000000000000000000000000 00 00000000000000000000000000000000 00 fe80000000000000021fcafffea0ec00 00000064 00000000 00000000 00000003 enp1s0f0 + +` + +const ( + flagUp = net.FlagUp | net.FlagBroadcast | net.FlagMulticast + flagDown = net.FlagBroadcast | net.FlagMulticast + flagLoopback = net.FlagUp | net.FlagLoopback + flagP2P = net.FlagUp | net.FlagPointToPoint +) + +func makeIntf(index int, name string, flags net.Flags) net.Interface { + mac := net.HardwareAddr{0, 0x32, 0x7d, 0x69, 0xf7, byte(0x30 + index)} + return net.Interface{ + Index: index, + MTU: 1500, + Name: name, + HardwareAddr: mac, + Flags: flags} +} + +var ( + downIntf = makeIntf(1, "eth3", flagDown) + loopbackIntf = makeIntf(1, "lo", flagLoopback) + p2pIntf = makeIntf(1, "lo", flagP2P) + upIntf = makeIntf(1, "eth3", flagUp) +) + +var ( + ipv4Route = Route{Interface: "eth3", Destination: net.ParseIP("0.0.0.0"), Gateway: net.ParseIP("10.254.0.1"), Family: familyIPv4} + ipv6Route = Route{Interface: "eth3", Destination: net.ParseIP("::"), Gateway: net.ParseIP("2001:1::1"), Family: familyIPv6} +) + +var ( + noRoutes = []Route{} + routeV4 = []Route{ipv4Route} + routeV6 = []Route{ipv6Route} + bothRoutes = []Route{ipv4Route, ipv6Route} +) + +func TestGetIPv4Routes(t *testing.T) { + testCases := []struct { + tcase string + route string + count int + expected *Route + errStrFrag string + }{ + {"gatewayfirst", gatewayfirst, 1, &ipv4Route, ""}, + {"gatewaymiddle", gatewaymiddle, 1, &ipv4Route, ""}, + {"gatewaylast", gatewaylast, 1, &ipv4Route, ""}, + {"no routes", nothing, 0, nil, ""}, + {"badDestination", badDestination, 0, nil, "invalid IPv4"}, + {"badGateway", badGateway, 0, nil, "invalid IPv4"}, + {"route_Invalidhex", route_Invalidhex, 0, nil, "odd length hex string"}, + {"no default routes", noInternetConnection, 0, nil, ""}, + } + for _, tc := range testCases { + r := strings.NewReader(tc.route) + routes, err := getIPv4DefaultRoutes(r) + if err != nil { + if !strings.Contains(err.Error(), tc.errStrFrag) { + t.Errorf("case[%s]: Error string %q does not contain %q", tc.tcase, err, tc.errStrFrag) + } + } else if tc.errStrFrag != "" { + t.Errorf("case[%s]: Error %q expected, but not seen", tc.tcase, tc.errStrFrag) + } else { + if tc.count != len(routes) { + t.Errorf("case[%s]: expected %d routes, have %v", tc.tcase, tc.count, routes) + } else if tc.count == 1 { + if !tc.expected.Gateway.Equal(routes[0].Gateway) { + t.Errorf("case[%s]: expected %v, got %v .err : %v", tc.tcase, tc.expected, routes, err) + } + if !routes[0].Destination.Equal(net.IPv4zero) { + t.Errorf("case[%s}: destination is not for default route (not zero)", tc.tcase) + } + + } + } + } +} + +func TestGetIPv6Routes(t *testing.T) { + testCases := []struct { + tcase string + route string + count int + expected *Route + errStrFrag string + }{ + {"v6 gatewayfirst", v6gatewayfirst, 1, &ipv6Route, ""}, + {"v6 gatewaymiddle", v6gatewaymiddle, 1, &ipv6Route, ""}, + {"v6 gatewaylast", v6gatewaylast, 1, &ipv6Route, ""}, + {"v6 no routes", v6nothing, 0, nil, ""}, + {"v6 badDestination", v6badDestination, 0, nil, "invalid IPv6"}, + {"v6 badGateway", v6badGateway, 0, nil, "invalid IPv6"}, + {"v6 route_Invalidhex", v6route_Invalidhex, 0, nil, "odd length hex string"}, + {"v6 no default routes", v6noDefaultRoutes, 0, nil, ""}, + } + for _, tc := range testCases { + r := strings.NewReader(tc.route) + routes, err := getIPv6DefaultRoutes(r) + if err != nil { + if !strings.Contains(err.Error(), tc.errStrFrag) { + t.Errorf("case[%s]: Error string %q does not contain %q", tc.tcase, err, tc.errStrFrag) + } + } else if tc.errStrFrag != "" { + t.Errorf("case[%s]: Error %q expected, but not seen", tc.tcase, tc.errStrFrag) + } else { + if tc.count != len(routes) { + t.Errorf("case[%s]: expected %d routes, have %v", tc.tcase, tc.count, routes) + } else if tc.count == 1 { + if !tc.expected.Gateway.Equal(routes[0].Gateway) { + t.Errorf("case[%s]: expected %v, got %v .err : %v", tc.tcase, tc.expected, routes, err) + } + if !routes[0].Destination.Equal(net.IPv6zero) { + t.Errorf("case[%s}: destination is not for default route (not zero)", tc.tcase) + } + } + } + } +} + +func TestParseIP(t *testing.T) { + testCases := []struct { + tcase string + ip string + family AddressFamily + success bool + expected net.IP + }{ + {"empty", "", familyIPv4, false, nil}, + {"too short", "AA", familyIPv4, false, nil}, + {"too long", "0011223344", familyIPv4, false, nil}, + {"invalid", "invalid!", familyIPv4, false, nil}, + {"zero", "00000000", familyIPv4, true, net.IP{0, 0, 0, 0}}, + {"ffff", "FFFFFFFF", familyIPv4, true, net.IP{0xff, 0xff, 0xff, 0xff}}, + {"valid v4", "12345678", familyIPv4, true, net.IP{120, 86, 52, 18}}, + {"valid v6", "fe800000000000000000000000000000", familyIPv6, true, net.IP{0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {"v6 too short", "fe80000000000000021fcafffea0ec0", familyIPv6, false, nil}, + {"v6 too long", "fe80000000000000021fcafffea0ec002", familyIPv6, false, nil}, + } + for _, tc := range testCases { + ip, err := parseIP(tc.ip, tc.family) + if !ip.Equal(tc.expected) { + t.Errorf("case[%v]: expected %q, got %q . err : %v", tc.tcase, tc.expected, ip, err) + } + } +} + +func TestIsInterfaceUp(t *testing.T) { + testCases := []struct { + tcase string + intf *net.Interface + expected bool + }{ + {"up", &net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: net.FlagUp}, true}, + {"down", &net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: 0}, false}, + {"no interface", nil, false}, + } + for _, tc := range testCases { + it := isInterfaceUp(tc.intf) + if it != tc.expected { + t.Errorf("case[%v]: expected %v, got %v .", tc.tcase, tc.expected, it) + } + } +} + +type addrStruct struct{ val string } + +func (a addrStruct) Network() string { + return a.val +} +func (a addrStruct) String() string { + return a.val +} + +func TestFinalIP(t *testing.T) { + testCases := []struct { + tcase string + addr []net.Addr + family AddressFamily + expected net.IP + }{ + {"no ipv4", []net.Addr{addrStruct{val: "2001::5/64"}}, familyIPv4, nil}, + {"no ipv6", []net.Addr{addrStruct{val: "10.128.0.4/32"}}, familyIPv6, nil}, + {"invalidV4CIDR", []net.Addr{addrStruct{val: "10.20.30.40.50/24"}}, familyIPv4, nil}, + {"invalidV6CIDR", []net.Addr{addrStruct{val: "fe80::2f7:67fff:fe6e:2956/64"}}, familyIPv6, nil}, + {"loopback", []net.Addr{addrStruct{val: "127.0.0.1/24"}}, familyIPv4, nil}, + {"loopbackv6", []net.Addr{addrStruct{val: "::1/128"}}, familyIPv6, nil}, + {"link local v4", []net.Addr{addrStruct{val: "169.254.1.10/16"}}, familyIPv4, nil}, + {"link local v6", []net.Addr{addrStruct{val: "fe80::2f7:6fff:fe6e:2956/64"}}, familyIPv6, nil}, + {"ip4", []net.Addr{addrStruct{val: "10.254.12.132/17"}}, familyIPv4, net.ParseIP("10.254.12.132")}, + {"ip6", []net.Addr{addrStruct{val: "2001::5/64"}}, familyIPv6, net.ParseIP("2001::5")}, + + {"no addresses", []net.Addr{}, familyIPv4, nil}, + } + for _, tc := range testCases { + ip, err := getMatchingGlobalIP(tc.addr, tc.family) + if !ip.Equal(tc.expected) { + t.Errorf("case[%v]: expected %v, got %v .err : %v", tc.tcase, tc.expected, ip, err) + } + } +} + +func TestAddrs(t *testing.T) { + var nw networkInterfacer = validNetworkInterface{} + intf := net.Interface{Index: 0, MTU: 0, Name: "eth3", HardwareAddr: nil, Flags: 0} + addrs, err := nw.Addrs(&intf) + if err != nil { + t.Errorf("expected no error got : %v", err) + } + if len(addrs) != 2 { + t.Errorf("expected addrs: 2 got null") + } +} + +// Has a valid IPv4 address (IPv6 is LLA) +type validNetworkInterface struct { +} + +func (_ validNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return &upIntf, nil +} +func (_ validNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{ + addrStruct{val: "fe80::2f7:6fff:fe6e:2956/64"}, addrStruct{val: "10.254.71.145/17"}} + return ifat, nil +} +func (_ validNetworkInterface) Interfaces() ([]net.Interface, error) { + return []net.Interface{upIntf}, nil +} + +// Both IPv4 and IPv6 addresses (expecting IPv4 to be used) +type v4v6NetworkInterface struct { +} + +func (_ v4v6NetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return &upIntf, nil +} +func (_ v4v6NetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{ + addrStruct{val: "2001::10/64"}, addrStruct{val: "10.254.71.145/17"}} + return ifat, nil +} +func (_ v4v6NetworkInterface) Interfaces() ([]net.Interface, error) { + return []net.Interface{upIntf}, nil +} + +// Interface with only IPv6 address +type ipv6NetworkInterface struct { +} + +func (_ ipv6NetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return &upIntf, nil +} +func (_ ipv6NetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{addrStruct{val: "2001::200/64"}} + return ifat, nil +} + +func (_ ipv6NetworkInterface) Interfaces() ([]net.Interface, error) { + return []net.Interface{upIntf}, nil +} + +// Only with link local addresses +type networkInterfaceWithOnlyLinkLocals struct { +} + +func (_ networkInterfaceWithOnlyLinkLocals) InterfaceByName(intfName string) (*net.Interface, error) { + return &upIntf, nil +} +func (_ networkInterfaceWithOnlyLinkLocals) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{addrStruct{val: "169.254.162.166/16"}, addrStruct{val: "fe80::200/10"}} + return ifat, nil +} +func (_ networkInterfaceWithOnlyLinkLocals) Interfaces() ([]net.Interface, error) { + return []net.Interface{upIntf}, nil +} + +// Unable to get interface(s) +type failGettingNetworkInterface struct { +} + +func (_ failGettingNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return nil, fmt.Errorf("unable get Interface") +} +func (_ failGettingNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + return nil, nil +} +func (_ failGettingNetworkInterface) Interfaces() ([]net.Interface, error) { + return nil, fmt.Errorf("mock failed getting all interfaces") +} + +// No interfaces +type noNetworkInterface struct { +} + +func (_ noNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return nil, fmt.Errorf("no such network interface") +} +func (_ noNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + return nil, nil +} +func (_ noNetworkInterface) Interfaces() ([]net.Interface, error) { + return []net.Interface{}, nil +} + +// Interface is down +type downNetworkInterface struct { +} + +func (_ downNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return &downIntf, nil +} +func (_ downNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{ + addrStruct{val: "fe80::2f7:6fff:fe6e:2956/64"}, addrStruct{val: "10.254.71.145/17"}} + return ifat, nil +} +func (_ downNetworkInterface) Interfaces() ([]net.Interface, error) { + return []net.Interface{downIntf}, nil +} + +// Loopback interface +type loopbackNetworkInterface struct { +} + +func (_ loopbackNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return &loopbackIntf, nil +} +func (_ loopbackNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{ + addrStruct{val: "::1/128"}, addrStruct{val: "127.0.0.1/8"}} + return ifat, nil +} +func (_ loopbackNetworkInterface) Interfaces() ([]net.Interface, error) { + return []net.Interface{loopbackIntf}, nil +} + +// Point to point interface +type p2pNetworkInterface struct { +} + +func (_ p2pNetworkInterface) InterfaceByName(intfName string) (*net.Interface, error) { + return &p2pIntf, nil +} +func (_ p2pNetworkInterface) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{ + addrStruct{val: "::1/128"}, addrStruct{val: "127.0.0.1/8"}} + return ifat, nil +} +func (_ p2pNetworkInterface) Interfaces() ([]net.Interface, error) { + return []net.Interface{p2pIntf}, nil +} + +// Unable to get IP addresses for interface +type networkInterfaceFailGetAddrs struct { +} + +func (_ networkInterfaceFailGetAddrs) InterfaceByName(intfName string) (*net.Interface, error) { + return &upIntf, nil +} +func (_ networkInterfaceFailGetAddrs) Addrs(intf *net.Interface) ([]net.Addr, error) { + return nil, fmt.Errorf("unable to get Addrs") +} +func (_ networkInterfaceFailGetAddrs) Interfaces() ([]net.Interface, error) { + return []net.Interface{upIntf}, nil +} + +// No addresses for interface +type networkInterfaceWithNoAddrs struct { +} + +func (_ networkInterfaceWithNoAddrs) InterfaceByName(intfName string) (*net.Interface, error) { + return &upIntf, nil +} +func (_ networkInterfaceWithNoAddrs) Addrs(intf *net.Interface) ([]net.Addr, error) { + ifat := []net.Addr{} + return ifat, nil +} +func (_ networkInterfaceWithNoAddrs) Interfaces() ([]net.Interface, error) { + return []net.Interface{upIntf}, nil +} + +// Invalid addresses for interface +type networkInterfaceWithInvalidAddr struct { +} + +func (_ networkInterfaceWithInvalidAddr) InterfaceByName(intfName string) (*net.Interface, error) { + return &upIntf, nil +} +func (_ networkInterfaceWithInvalidAddr) Addrs(intf *net.Interface) ([]net.Addr, error) { + var ifat []net.Addr + ifat = []net.Addr{addrStruct{val: "10.20.30.40.50/24"}} + return ifat, nil +} +func (_ networkInterfaceWithInvalidAddr) Interfaces() ([]net.Interface, error) { + return []net.Interface{upIntf}, nil +} + +func TestGetIPFromInterface(t *testing.T) { + testCases := []struct { + tcase string + nwname string + family AddressFamily + nw networkInterfacer + expected net.IP + errStrFrag string + }{ + {"ipv4", "eth3", familyIPv4, validNetworkInterface{}, net.ParseIP("10.254.71.145"), ""}, + {"ipv6", "eth3", familyIPv6, ipv6NetworkInterface{}, net.ParseIP("2001::200"), ""}, + {"no ipv4", "eth3", familyIPv4, ipv6NetworkInterface{}, nil, ""}, + {"no ipv6", "eth3", familyIPv6, validNetworkInterface{}, nil, ""}, + {"I/F down", "eth3", familyIPv4, downNetworkInterface{}, nil, ""}, + {"I/F get fail", "eth3", familyIPv4, noNetworkInterface{}, nil, "no such network interface"}, + {"fail get addr", "eth3", familyIPv4, networkInterfaceFailGetAddrs{}, nil, "unable to get Addrs"}, + {"bad addr", "eth3", familyIPv4, networkInterfaceWithInvalidAddr{}, nil, "invalid CIDR"}, + } + for _, tc := range testCases { + ip, err := getIPFromInterface(tc.nwname, tc.family, tc.nw) + if err != nil { + if !strings.Contains(err.Error(), tc.errStrFrag) { + t.Errorf("case[%s]: Error string %q does not contain %q", tc.tcase, err, tc.errStrFrag) + } + } else if tc.errStrFrag != "" { + t.Errorf("case[%s]: Error %q expected, but not seen", tc.tcase, tc.errStrFrag) + } else if !ip.Equal(tc.expected) { + t.Errorf("case[%v]: expected %v, got %+v .err : %v", tc.tcase, tc.expected, ip, err) + } + } +} + +func TestChooseHostInterfaceFromRoute(t *testing.T) { + testCases := []struct { + tcase string + routes []Route + nw networkInterfacer + expected net.IP + }{ + {"ipv4", routeV4, validNetworkInterface{}, net.ParseIP("10.254.71.145")}, + {"ipv6", routeV6, ipv6NetworkInterface{}, net.ParseIP("2001::200")}, + {"prefer ipv4", bothRoutes, v4v6NetworkInterface{}, net.ParseIP("10.254.71.145")}, + {"all LLA", routeV4, networkInterfaceWithOnlyLinkLocals{}, nil}, + {"no routes", noRoutes, validNetworkInterface{}, nil}, + {"fail get IP", routeV4, networkInterfaceFailGetAddrs{}, nil}, + } + for _, tc := range testCases { + ip, err := chooseHostInterfaceFromRoute(tc.routes, tc.nw) + if !ip.Equal(tc.expected) { + t.Errorf("case[%v]: expected %v, got %+v .err : %v", tc.tcase, tc.expected, ip, err) + } + } +} + +func TestMemberOf(t *testing.T) { + testCases := []struct { + tcase string + ip net.IP + family AddressFamily + expected bool + }{ + {"ipv4 is 4", net.ParseIP("10.20.30.40"), familyIPv4, true}, + {"ipv4 is 6", net.ParseIP("10.10.10.10"), familyIPv6, false}, + {"ipv6 is 4", net.ParseIP("2001::100"), familyIPv4, false}, + {"ipv6 is 6", net.ParseIP("2001::100"), familyIPv6, true}, + } + for _, tc := range testCases { + if memberOf(tc.ip, tc.family) != tc.expected { + t.Errorf("case[%s]: expected %+v", tc.tcase, tc.expected) + } + } +} + +func TestGetIPFromHostInterfaces(t *testing.T) { + testCases := []struct { + tcase string + nw networkInterfacer + expected net.IP + errStrFrag string + }{ + {"fail get I/Fs", failGettingNetworkInterface{}, nil, "failed getting all interfaces"}, + {"no interfaces", noNetworkInterface{}, nil, "no interfaces"}, + {"I/F not up", downNetworkInterface{}, nil, "no acceptable"}, + {"loopback only", loopbackNetworkInterface{}, nil, "no acceptable"}, + {"P2P I/F only", p2pNetworkInterface{}, nil, "no acceptable"}, + {"fail get addrs", networkInterfaceFailGetAddrs{}, nil, "unable to get Addrs"}, + {"no addresses", networkInterfaceWithNoAddrs{}, nil, "no acceptable"}, + {"invalid addr", networkInterfaceWithInvalidAddr{}, nil, "invalid CIDR"}, + {"no matches", networkInterfaceWithOnlyLinkLocals{}, nil, "no acceptable"}, + {"ipv4", validNetworkInterface{}, net.ParseIP("10.254.71.145"), ""}, + {"ipv6", ipv6NetworkInterface{}, net.ParseIP("2001::200"), ""}, + } + + for _, tc := range testCases { + ip, err := chooseIPFromHostInterfaces(tc.nw) + if !ip.Equal(tc.expected) { + t.Errorf("case[%s]: expected %+v, got %+v with err : %v", tc.tcase, tc.expected, ip, err) + } + if err != nil && !strings.Contains(err.Error(), tc.errStrFrag) { + t.Errorf("case[%s]: unable to find %q in error string %q", tc.tcase, tc.errStrFrag, err.Error()) + } + } +} + +func makeRouteFile(content string, t *testing.T) (*os.File, error) { + routeFile, err := ioutil.TempFile("", "route") + if err != nil { + return nil, err + } + + if _, err := routeFile.Write([]byte(content)); err != nil { + return routeFile, err + } + err = routeFile.Close() + return routeFile, err +} + +func TestFailGettingIPv4Routes(t *testing.T) { + defer func() { v4File.name = ipv4RouteFile }() + + // Try failure to open file (should not occur, as caller ensures we have IPv4 route file, but being thorough) + v4File.name = "no-such-file" + errStrFrag := "no such file" + _, err := v4File.extract() + if err == nil { + t.Errorf("Expected error trying to read non-existent v4 route file") + } + if !strings.Contains(err.Error(), errStrFrag) { + t.Errorf("Unable to find %q in error string %q", errStrFrag, err.Error()) + } +} + +func TestFailGettingIPv6Routes(t *testing.T) { + defer func() { v6File.name = ipv6RouteFile }() + + // Try failure to open file (this would be ignored by caller) + v6File.name = "no-such-file" + errStrFrag := "no such file" + _, err := v6File.extract() + if err == nil { + t.Errorf("Expected error trying to read non-existent v6 route file") + } + if !strings.Contains(err.Error(), errStrFrag) { + t.Errorf("Unable to find %q in error string %q", errStrFrag, err.Error()) + } +} + +func TestGetAllDefaultRoutesFailNoV4RouteFile(t *testing.T) { + defer func() { v4File.name = ipv4RouteFile }() + + // Should not occur, as caller ensures we have IPv4 route file, but being thorough + v4File.name = "no-such-file" + errStrFrag := "no such file" + _, err := getAllDefaultRoutes() + if err == nil { + t.Errorf("Expected error trying to read non-existent v4 route file") + } + if !strings.Contains(err.Error(), errStrFrag) { + t.Errorf("Unable to find %q in error string %q", errStrFrag, err.Error()) + } +} + +func TestGetAllDefaultRoutes(t *testing.T) { + testCases := []struct { + tcase string + v4Info string + v6Info string + count int + expected []Route + errStrFrag string + }{ + {"no routes", noInternetConnection, v6noDefaultRoutes, 0, nil, "no default routes"}, + {"only v4 route", gatewayfirst, v6noDefaultRoutes, 1, routeV4, ""}, + {"only v6 route", noInternetConnection, v6gatewayfirst, 1, routeV6, ""}, + {"v4 and v6 routes", gatewayfirst, v6gatewayfirst, 2, bothRoutes, ""}, + } + defer func() { + v4File.name = ipv4RouteFile + v6File.name = ipv6RouteFile + }() + + for _, tc := range testCases { + routeFile, err := makeRouteFile(tc.v4Info, t) + if routeFile != nil { + defer os.Remove(routeFile.Name()) + } + if err != nil { + t.Errorf("case[%s]: test setup failure for IPv4 route file: %v", tc.tcase, err) + } + v4File.name = routeFile.Name() + v6routeFile, err := makeRouteFile(tc.v6Info, t) + if v6routeFile != nil { + defer os.Remove(v6routeFile.Name()) + } + if err != nil { + t.Errorf("case[%s]: test setup failure for IPv6 route file: %v", tc.tcase, err) + } + v6File.name = v6routeFile.Name() + + routes, err := getAllDefaultRoutes() + if err != nil { + if !strings.Contains(err.Error(), tc.errStrFrag) { + t.Errorf("case[%s]: Error string %q does not contain %q", tc.tcase, err, tc.errStrFrag) + } + } else if tc.errStrFrag != "" { + t.Errorf("case[%s]: Error %q expected, but not seen", tc.tcase, tc.errStrFrag) + } else { + if tc.count != len(routes) { + t.Errorf("case[%s]: expected %d routes, have %v", tc.tcase, tc.count, routes) + } + for i, expected := range tc.expected { + if !expected.Gateway.Equal(routes[i].Gateway) { + t.Errorf("case[%s]: at %d expected %v, got %v .err : %v", tc.tcase, i, tc.expected, routes, err) + } + zeroIP := net.IPv4zero + if expected.Family == familyIPv6 { + zeroIP = net.IPv6zero + } + if !routes[i].Destination.Equal(zeroIP) { + t.Errorf("case[%s}: at %d destination is not for default route (not %v)", tc.tcase, i, zeroIP) + } + } + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go new file mode 100644 index 00000000..b4cbe824 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go @@ -0,0 +1,77 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 net + +import ( + "testing" + + flag "github.com/spf13/pflag" +) + +func TestPortRange(t *testing.T) { + testCases := []struct { + input string + success bool + expected string + included int + excluded int + }{ + {"100-200", true, "100-200", 200, 201}, + {" 100-200 ", true, "100-200", 200, 201}, + {"0-0", true, "0-0", 0, 1}, + {"", true, "", -1, 0}, + {"100", true, "100-100", 100, 101}, + {"100 - 200", false, "", -1, -1}, + {"-100", false, "", -1, -1}, + {"100-", false, "", -1, -1}, + {"200-100", false, "", -1, -1}, + {"60000-70000", false, "", -1, -1}, + {"70000-80000", false, "", -1, -1}, + {"70000+80000", false, "", -1, -1}, + {"1+0", true, "1-1", 1, 2}, + {"0+0", true, "0-0", 0, 1}, + {"1+-1", false, "", -1, -1}, + {"1-+1", false, "", -1, -1}, + {"100+200", true, "100-300", 300, 301}, + {"1+65535", false, "", -1, -1}, + {"0+65535", true, "0-65535", 65535, 65536}, + } + + for i := range testCases { + tc := &testCases[i] + pr := &PortRange{} + var f flag.Value = pr + err := f.Set(tc.input) + if err != nil && tc.success == true { + t.Errorf("expected success, got %q", err) + continue + } else if err == nil && tc.success == false { + t.Errorf("expected failure %#v", testCases[i]) + continue + } else if tc.success { + if f.String() != tc.expected { + t.Errorf("expected %q, got %q", tc.expected, f.String()) + } + if tc.included >= 0 && !pr.Contains(tc.included) { + t.Errorf("expected %q to include %d", f.String(), tc.included) + } + if tc.excluded >= 0 && pr.Contains(tc.excluded) { + t.Errorf("expected %q to exclude %d", f.String(), tc.excluded) + } + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_split_test.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_split_test.go new file mode 100644 index 00000000..e801bdbe --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/net/port_split_test.go @@ -0,0 +1,121 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 net + +import ( + "testing" +) + +func TestSplitSchemeNamePort(t *testing.T) { + table := []struct { + in string + name, port, scheme string + valid bool + normalized bool + }{ + { + in: "aoeu:asdf", + name: "aoeu", + port: "asdf", + valid: true, + normalized: true, + }, { + in: "http:aoeu:asdf", + scheme: "http", + name: "aoeu", + port: "asdf", + valid: true, + normalized: true, + }, { + in: "https:aoeu:", + scheme: "https", + name: "aoeu", + port: "", + valid: true, + normalized: false, + }, { + in: "https:aoeu:asdf", + scheme: "https", + name: "aoeu", + port: "asdf", + valid: true, + normalized: true, + }, { + in: "aoeu:", + name: "aoeu", + valid: true, + normalized: false, + }, { + in: "aoeu", + name: "aoeu", + valid: true, + normalized: true, + }, { + in: ":asdf", + valid: false, + }, { + in: "aoeu:asdf:htns", + valid: false, + }, { + in: "http::asdf", + valid: false, + }, { + in: "http::", + valid: false, + }, { + in: "", + valid: false, + }, + } + + for _, item := range table { + scheme, name, port, valid := SplitSchemeNamePort(item.in) + if e, a := item.scheme, scheme; e != a { + t.Errorf("%q: Wanted %q, got %q", item.in, e, a) + } + if e, a := item.name, name; e != a { + t.Errorf("%q: Wanted %q, got %q", item.in, e, a) + } + if e, a := item.port, port; e != a { + t.Errorf("%q: Wanted %q, got %q", item.in, e, a) + } + if e, a := item.valid, valid; e != a { + t.Errorf("%q: Wanted %t, got %t", item.in, e, a) + } + + // Make sure valid items round trip through JoinSchemeNamePort + if item.valid { + out := JoinSchemeNamePort(scheme, name, port) + if item.normalized && out != item.in { + t.Errorf("%q: Wanted %s, got %s", item.in, item.in, out) + } + scheme, name, port, valid := SplitSchemeNamePort(out) + if e, a := item.scheme, scheme; e != a { + t.Errorf("%q: Wanted %q, got %q", item.in, e, a) + } + if e, a := item.name, name; e != a { + t.Errorf("%q: Wanted %q, got %q", item.in, e, a) + } + if e, a := item.port, port; e != a { + t.Errorf("%q: Wanted %q, got %q", item.in, e, a) + } + if e, a := item.valid, valid; e != a { + t.Errorf("%q: Wanted %t, got %t", item.in, e, a) + } + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/util_test.go b/vendor/k8s.io/apimachinery/pkg/util/net/util_test.go new file mode 100644 index 00000000..bcbef753 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/net/util_test.go @@ -0,0 +1,68 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 net + +import ( + "net" + "testing" +) + +func getIPNet(cidr string) *net.IPNet { + _, ipnet, _ := net.ParseCIDR(cidr) + return ipnet +} + +func TestIPNetEqual(t *testing.T) { + testCases := []struct { + ipnet1 *net.IPNet + ipnet2 *net.IPNet + expect bool + }{ + //null case + { + getIPNet("10.0.0.1/24"), + getIPNet(""), + false, + }, + { + getIPNet("10.0.0.0/24"), + getIPNet("10.0.0.0/24"), + true, + }, + { + getIPNet("10.0.0.0/24"), + getIPNet("10.0.0.1/24"), + true, + }, + { + getIPNet("10.0.0.0/25"), + getIPNet("10.0.0.0/24"), + false, + }, + { + getIPNet("10.0.1.0/24"), + getIPNet("10.0.0.0/24"), + false, + }, + } + + for _, tc := range testCases { + if tc.expect != IPNetEqual(tc.ipnet1, tc.ipnet2) { + t.Errorf("Expect equality of %s and %s be to %v", tc.ipnet1.String(), tc.ipnet2.String(), tc.expect) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD b/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD deleted file mode 100644 index 69e9734c..00000000 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "dial_test.go", - "transport_test.go", - "upgradeaware_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "dial.go", - "doc.go", - "transport.go", - "upgradeaware.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/proxy", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/mxk/go-flowrate/flowrate:go_default_library", - "//vendor/golang.org/x/net/html:go_default_library", - "//vendor/golang.org/x/net/html/atom:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/third_party/forked/golang/netutil:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go deleted file mode 100644 index 37a5be48..00000000 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 proxy - -import ( - "context" - "crypto/tls" - "fmt" - "net" - "net/http" - "net/url" - - "github.com/golang/glog" - - utilnet "k8s.io/apimachinery/pkg/util/net" - "k8s.io/apimachinery/third_party/forked/golang/netutil" -) - -func DialURL(ctx context.Context, url *url.URL, transport http.RoundTripper) (net.Conn, error) { - dialAddr := netutil.CanonicalAddr(url) - - dialer, err := utilnet.DialerFor(transport) - if err != nil { - glog.V(5).Infof("Unable to unwrap transport %T to get dialer: %v", transport, err) - } - - switch url.Scheme { - case "http": - if dialer != nil { - return dialer(ctx, "tcp", dialAddr) - } - var d net.Dialer - return d.DialContext(ctx, "tcp", dialAddr) - case "https": - // Get the tls config from the transport if we recognize it - var tlsConfig *tls.Config - var tlsConn *tls.Conn - var err error - tlsConfig, err = utilnet.TLSClientConfig(transport) - if err != nil { - glog.V(5).Infof("Unable to unwrap transport %T to get at TLS config: %v", transport, err) - } - - if dialer != nil { - // We have a dialer; use it to open the connection, then - // create a tls client using the connection. - netConn, err := dialer(ctx, "tcp", dialAddr) - if err != nil { - return nil, err - } - if tlsConfig == nil { - // tls.Client requires non-nil config - glog.Warningf("using custom dialer with no TLSClientConfig. Defaulting to InsecureSkipVerify") - // tls.Handshake() requires ServerName or InsecureSkipVerify - tlsConfig = &tls.Config{ - InsecureSkipVerify: true, - } - } else if len(tlsConfig.ServerName) == 0 && !tlsConfig.InsecureSkipVerify { - // tls.Handshake() requires ServerName or InsecureSkipVerify - // infer the ServerName from the hostname we're connecting to. - inferredHost := dialAddr - if host, _, err := net.SplitHostPort(dialAddr); err == nil { - inferredHost = host - } - // Make a copy to avoid polluting the provided config - tlsConfigCopy := tlsConfig.Clone() - tlsConfigCopy.ServerName = inferredHost - tlsConfig = tlsConfigCopy - } - tlsConn = tls.Client(netConn, tlsConfig) - if err := tlsConn.Handshake(); err != nil { - netConn.Close() - return nil, err - } - - } else { - // Dial. This Dial method does not allow to pass a context unfortunately - tlsConn, err = tls.Dial("tcp", dialAddr, tlsConfig) - if err != nil { - return nil, err - } - } - - // Return if we were configured to skip validation - if tlsConfig != nil && tlsConfig.InsecureSkipVerify { - return tlsConn, nil - } - - // Verify - host, _, _ := net.SplitHostPort(dialAddr) - if tlsConfig != nil && len(tlsConfig.ServerName) > 0 { - host = tlsConfig.ServerName - } - if err := tlsConn.VerifyHostname(host); err != nil { - tlsConn.Close() - return nil, err - } - - return tlsConn, nil - default: - return nil, fmt.Errorf("Unknown scheme: %s", url.Scheme) - } -} diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/doc.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/doc.go deleted file mode 100644 index d14ecfad..00000000 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 proxy provides transport and upgrade support for proxies. -package proxy // import "k8s.io/apimachinery/pkg/util/proxy" diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go deleted file mode 100644 index 6c34ab52..00000000 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/transport.go +++ /dev/null @@ -1,259 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 proxy - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "path" - "strings" - - "github.com/golang/glog" - "golang.org/x/net/html" - "golang.org/x/net/html/atom" - - "k8s.io/apimachinery/pkg/util/net" - "k8s.io/apimachinery/pkg/util/sets" -) - -// atomsToAttrs states which attributes of which tags require URL substitution. -// Sources: http://www.w3.org/TR/REC-html40/index/attributes.html -// http://www.w3.org/html/wg/drafts/html/master/index.html#attributes-1 -var atomsToAttrs = map[atom.Atom]sets.String{ - atom.A: sets.NewString("href"), - atom.Applet: sets.NewString("codebase"), - atom.Area: sets.NewString("href"), - atom.Audio: sets.NewString("src"), - atom.Base: sets.NewString("href"), - atom.Blockquote: sets.NewString("cite"), - atom.Body: sets.NewString("background"), - atom.Button: sets.NewString("formaction"), - atom.Command: sets.NewString("icon"), - atom.Del: sets.NewString("cite"), - atom.Embed: sets.NewString("src"), - atom.Form: sets.NewString("action"), - atom.Frame: sets.NewString("longdesc", "src"), - atom.Head: sets.NewString("profile"), - atom.Html: sets.NewString("manifest"), - atom.Iframe: sets.NewString("longdesc", "src"), - atom.Img: sets.NewString("longdesc", "src", "usemap"), - atom.Input: sets.NewString("src", "usemap", "formaction"), - atom.Ins: sets.NewString("cite"), - atom.Link: sets.NewString("href"), - atom.Object: sets.NewString("classid", "codebase", "data", "usemap"), - atom.Q: sets.NewString("cite"), - atom.Script: sets.NewString("src"), - atom.Source: sets.NewString("src"), - atom.Video: sets.NewString("poster", "src"), - - // TODO: css URLs hidden in style elements. -} - -// Transport is a transport for text/html content that replaces URLs in html -// content with the prefix of the proxy server -type Transport struct { - Scheme string - Host string - PathPrepend string - - http.RoundTripper -} - -// RoundTrip implements the http.RoundTripper interface -func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { - // Add reverse proxy headers. - forwardedURI := path.Join(t.PathPrepend, req.URL.Path) - if strings.HasSuffix(req.URL.Path, "/") { - forwardedURI = forwardedURI + "/" - } - req.Header.Set("X-Forwarded-Uri", forwardedURI) - if len(t.Host) > 0 { - req.Header.Set("X-Forwarded-Host", t.Host) - } - if len(t.Scheme) > 0 { - req.Header.Set("X-Forwarded-Proto", t.Scheme) - } - - rt := t.RoundTripper - if rt == nil { - rt = http.DefaultTransport - } - resp, err := rt.RoundTrip(req) - - if err != nil { - message := fmt.Sprintf("Error: '%s'\nTrying to reach: '%v'", err.Error(), req.URL.String()) - resp = &http.Response{ - StatusCode: http.StatusServiceUnavailable, - Body: ioutil.NopCloser(strings.NewReader(message)), - } - return resp, nil - } - - if redirect := resp.Header.Get("Location"); redirect != "" { - resp.Header.Set("Location", t.rewriteURL(redirect, req.URL, req.Host)) - return resp, nil - } - - cType := resp.Header.Get("Content-Type") - cType = strings.TrimSpace(strings.SplitN(cType, ";", 2)[0]) - if cType != "text/html" { - // Do nothing, simply pass through - return resp, nil - } - - return t.rewriteResponse(req, resp) -} - -var _ = net.RoundTripperWrapper(&Transport{}) - -func (rt *Transport) WrappedRoundTripper() http.RoundTripper { - return rt.RoundTripper -} - -// rewriteURL rewrites a single URL to go through the proxy, if the URL refers -// to the same host as sourceURL, which is the page on which the target URL -// occurred, or if the URL matches the sourceRequestHost. If any error occurs (e.g. -// parsing), it returns targetURL. -func (t *Transport) rewriteURL(targetURL string, sourceURL *url.URL, sourceRequestHost string) string { - url, err := url.Parse(targetURL) - if err != nil { - return targetURL - } - - // Example: - // When API server processes a proxy request to a service (e.g. /api/v1/namespace/foo/service/bar/proxy/), - // the sourceURL.Host (i.e. req.URL.Host) is the endpoint IP address of the service. The - // sourceRequestHost (i.e. req.Host) is the Host header that specifies the host on which the - // URL is sought, which can be different from sourceURL.Host. For example, if user sends the - // request through "kubectl proxy" locally (i.e. localhost:8001/api/v1/namespace/foo/service/bar/proxy/), - // sourceRequestHost is "localhost:8001". - // - // If the service's response URL contains non-empty host, and url.Host is equal to either sourceURL.Host - // or sourceRequestHost, we should not consider the returned URL to be a completely different host. - // It's the API server's responsibility to rewrite a same-host-and-absolute-path URL and append the - // necessary URL prefix (i.e. /api/v1/namespace/foo/service/bar/proxy/). - isDifferentHost := url.Host != "" && url.Host != sourceURL.Host && url.Host != sourceRequestHost - isRelative := !strings.HasPrefix(url.Path, "/") - if isDifferentHost || isRelative { - return targetURL - } - - // Do not rewrite scheme and host if the Transport has empty scheme and host - // when targetURL already contains the sourceRequestHost - if !(url.Host == sourceRequestHost && t.Scheme == "" && t.Host == "") { - url.Scheme = t.Scheme - url.Host = t.Host - } - - origPath := url.Path - // Do not rewrite URL if the sourceURL already contains the necessary prefix. - if strings.HasPrefix(url.Path, t.PathPrepend) { - return url.String() - } - url.Path = path.Join(t.PathPrepend, url.Path) - if strings.HasSuffix(origPath, "/") { - // Add back the trailing slash, which was stripped by path.Join(). - url.Path += "/" - } - - return url.String() -} - -// rewriteHTML scans the HTML for tags with url-valued attributes, and updates -// those values with the urlRewriter function. The updated HTML is output to the -// writer. -func rewriteHTML(reader io.Reader, writer io.Writer, urlRewriter func(string) string) error { - // Note: This assumes the content is UTF-8. - tokenizer := html.NewTokenizer(reader) - - var err error - for err == nil { - tokenType := tokenizer.Next() - switch tokenType { - case html.ErrorToken: - err = tokenizer.Err() - case html.StartTagToken, html.SelfClosingTagToken: - token := tokenizer.Token() - if urlAttrs, ok := atomsToAttrs[token.DataAtom]; ok { - for i, attr := range token.Attr { - if urlAttrs.Has(attr.Key) { - token.Attr[i].Val = urlRewriter(attr.Val) - } - } - } - _, err = writer.Write([]byte(token.String())) - default: - _, err = writer.Write(tokenizer.Raw()) - } - } - if err != io.EOF { - return err - } - return nil -} - -// rewriteResponse modifies an HTML response by updating absolute links referring -// to the original host to instead refer to the proxy transport. -func (t *Transport) rewriteResponse(req *http.Request, resp *http.Response) (*http.Response, error) { - origBody := resp.Body - defer origBody.Close() - - newContent := &bytes.Buffer{} - var reader io.Reader = origBody - var writer io.Writer = newContent - encoding := resp.Header.Get("Content-Encoding") - switch encoding { - case "gzip": - var err error - reader, err = gzip.NewReader(reader) - if err != nil { - return nil, fmt.Errorf("errorf making gzip reader: %v", err) - } - gzw := gzip.NewWriter(writer) - defer gzw.Close() - writer = gzw - // TODO: support flate, other encodings. - case "": - // This is fine - default: - // Some encoding we don't understand-- don't try to parse this - glog.Errorf("Proxy encountered encoding %v for text/html; can't understand this so not fixing links.", encoding) - return resp, nil - } - - urlRewriter := func(targetUrl string) string { - return t.rewriteURL(targetUrl, req.URL, req.Host) - } - err := rewriteHTML(reader, writer, urlRewriter) - if err != nil { - glog.Errorf("Failed to rewrite URLs: %v", err) - return resp, err - } - - resp.Body = ioutil.NopCloser(newContent) - // Update header node with new content-length - // TODO: Remove any hash/signature headers here? - resp.Header.Del("Content-Length") - resp.ContentLength = int64(newContent.Len()) - - return resp, err -} diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go deleted file mode 100644 index d725b228..00000000 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go +++ /dev/null @@ -1,413 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 proxy - -import ( - "bytes" - "context" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/http/httputil" - "net/url" - "strings" - "sync" - "time" - - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/util/httpstream" - utilnet "k8s.io/apimachinery/pkg/util/net" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - - "github.com/golang/glog" - "github.com/mxk/go-flowrate/flowrate" -) - -// UpgradeRequestRoundTripper provides an additional method to decorate a request -// with any authentication or other protocol level information prior to performing -// an upgrade on the server. Any response will be handled by the intercepting -// proxy. -type UpgradeRequestRoundTripper interface { - http.RoundTripper - // WrapRequest takes a valid HTTP request and returns a suitably altered version - // of request with any HTTP level values required to complete the request half of - // an upgrade on the server. It does not get a chance to see the response and - // should bypass any request side logic that expects to see the response. - WrapRequest(*http.Request) (*http.Request, error) -} - -// UpgradeAwareHandler is a handler for proxy requests that may require an upgrade -type UpgradeAwareHandler struct { - // UpgradeRequired will reject non-upgrade connections if true. - UpgradeRequired bool - // Location is the location of the upstream proxy. It is used as the location to Dial on the upstream server - // for upgrade requests unless UseRequestLocationOnUpgrade is true. - Location *url.URL - // Transport provides an optional round tripper to use to proxy. If nil, the default proxy transport is used - Transport http.RoundTripper - // UpgradeTransport, if specified, will be used as the backend transport when upgrade requests are provided. - // This allows clients to disable HTTP/2. - UpgradeTransport UpgradeRequestRoundTripper - // WrapTransport indicates whether the provided Transport should be wrapped with default proxy transport behavior (URL rewriting, X-Forwarded-* header setting) - WrapTransport bool - // InterceptRedirects determines whether the proxy should sniff backend responses for redirects, - // following them as necessary. - InterceptRedirects bool - // UseRequestLocation will use the incoming request URL when talking to the backend server. - UseRequestLocation bool - // FlushInterval controls how often the standard HTTP proxy will flush content from the upstream. - FlushInterval time.Duration - // MaxBytesPerSec controls the maximum rate for an upstream connection. No rate is imposed if the value is zero. - MaxBytesPerSec int64 - // Responder is passed errors that occur while setting up proxying. - Responder ErrorResponder -} - -const defaultFlushInterval = 200 * time.Millisecond - -// ErrorResponder abstracts error reporting to the proxy handler to remove the need to hardcode a particular -// error format. -type ErrorResponder interface { - Error(w http.ResponseWriter, req *http.Request, err error) -} - -// SimpleErrorResponder is the legacy implementation of ErrorResponder for callers that only -// service a single request/response per proxy. -type SimpleErrorResponder interface { - Error(err error) -} - -func NewErrorResponder(r SimpleErrorResponder) ErrorResponder { - return simpleResponder{r} -} - -type simpleResponder struct { - responder SimpleErrorResponder -} - -func (r simpleResponder) Error(w http.ResponseWriter, req *http.Request, err error) { - r.responder.Error(err) -} - -// upgradeRequestRoundTripper implements proxy.UpgradeRequestRoundTripper. -type upgradeRequestRoundTripper struct { - http.RoundTripper - upgrader http.RoundTripper -} - -var ( - _ UpgradeRequestRoundTripper = &upgradeRequestRoundTripper{} - _ utilnet.RoundTripperWrapper = &upgradeRequestRoundTripper{} -) - -// WrappedRoundTripper returns the round tripper that a caller would use. -func (rt *upgradeRequestRoundTripper) WrappedRoundTripper() http.RoundTripper { - return rt.RoundTripper -} - -// WriteToRequest calls the nested upgrader and then copies the returned request -// fields onto the passed request. -func (rt *upgradeRequestRoundTripper) WrapRequest(req *http.Request) (*http.Request, error) { - resp, err := rt.upgrader.RoundTrip(req) - if err != nil { - return nil, err - } - return resp.Request, nil -} - -// onewayRoundTripper captures the provided request - which is assumed to have -// been modified by other round trippers - and then returns a fake response. -type onewayRoundTripper struct{} - -// RoundTrip returns a simple 200 OK response that captures the provided request. -func (onewayRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { - return &http.Response{ - Status: "200 OK", - StatusCode: http.StatusOK, - Body: ioutil.NopCloser(&bytes.Buffer{}), - Request: req, - }, nil -} - -// MirrorRequest is a round tripper that can be called to get back the calling request as -// the core round tripper in a chain. -var MirrorRequest http.RoundTripper = onewayRoundTripper{} - -// NewUpgradeRequestRoundTripper takes two round trippers - one for the underlying TCP connection, and -// one that is able to write headers to an HTTP request. The request rt is used to set the request headers -// and that is written to the underlying connection rt. -func NewUpgradeRequestRoundTripper(connection, request http.RoundTripper) UpgradeRequestRoundTripper { - return &upgradeRequestRoundTripper{ - RoundTripper: connection, - upgrader: request, - } -} - -// normalizeLocation returns the result of parsing the full URL, with scheme set to http if missing -func normalizeLocation(location *url.URL) *url.URL { - normalized, _ := url.Parse(location.String()) - if len(normalized.Scheme) == 0 { - normalized.Scheme = "http" - } - return normalized -} - -// NewUpgradeAwareHandler creates a new proxy handler with a default flush interval. Responder is required for returning -// errors to the caller. -func NewUpgradeAwareHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired bool, responder ErrorResponder) *UpgradeAwareHandler { - return &UpgradeAwareHandler{ - Location: normalizeLocation(location), - Transport: transport, - WrapTransport: wrapTransport, - UpgradeRequired: upgradeRequired, - FlushInterval: defaultFlushInterval, - Responder: responder, - } -} - -// ServeHTTP handles the proxy request -func (h *UpgradeAwareHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - if h.tryUpgrade(w, req) { - return - } - if h.UpgradeRequired { - h.Responder.Error(w, req, errors.NewBadRequest("Upgrade request required")) - return - } - - loc := *h.Location - loc.RawQuery = req.URL.RawQuery - - // If original request URL ended in '/', append a '/' at the end of the - // of the proxy URL - if !strings.HasSuffix(loc.Path, "/") && strings.HasSuffix(req.URL.Path, "/") { - loc.Path += "/" - } - - // From pkg/genericapiserver/endpoints/handlers/proxy.go#ServeHTTP: - // Redirect requests with an empty path to a location that ends with a '/' - // This is essentially a hack for http://issue.k8s.io/4958. - // Note: Keep this code after tryUpgrade to not break that flow. - if len(loc.Path) == 0 { - var queryPart string - if len(req.URL.RawQuery) > 0 { - queryPart = "?" + req.URL.RawQuery - } - w.Header().Set("Location", req.URL.Path+"/"+queryPart) - w.WriteHeader(http.StatusMovedPermanently) - return - } - - if h.Transport == nil || h.WrapTransport { - h.Transport = h.defaultProxyTransport(req.URL, h.Transport) - } - - // WithContext creates a shallow clone of the request with the new context. - newReq := req.WithContext(context.Background()) - newReq.Header = utilnet.CloneHeader(req.Header) - if !h.UseRequestLocation { - newReq.URL = &loc - } - - proxy := httputil.NewSingleHostReverseProxy(&url.URL{Scheme: h.Location.Scheme, Host: h.Location.Host}) - proxy.Transport = h.Transport - proxy.FlushInterval = h.FlushInterval - proxy.ServeHTTP(w, newReq) -} - -// tryUpgrade returns true if the request was handled. -func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Request) bool { - if !httpstream.IsUpgradeRequest(req) { - glog.V(6).Infof("Request was not an upgrade") - return false - } - - var ( - backendConn net.Conn - rawResponse []byte - err error - ) - - location := *h.Location - if h.UseRequestLocation { - location = *req.URL - location.Scheme = h.Location.Scheme - location.Host = h.Location.Host - } - - clone := utilnet.CloneRequest(req) - // Only append X-Forwarded-For in the upgrade path, since httputil.NewSingleHostReverseProxy - // handles this in the non-upgrade path. - utilnet.AppendForwardedForHeader(clone) - if h.InterceptRedirects { - glog.V(6).Infof("Connecting to backend proxy (intercepting redirects) %s\n Headers: %v", &location, clone.Header) - backendConn, rawResponse, err = utilnet.ConnectWithRedirects(req.Method, &location, clone.Header, req.Body, utilnet.DialerFunc(h.DialForUpgrade)) - } else { - glog.V(6).Infof("Connecting to backend proxy (direct dial) %s\n Headers: %v", &location, clone.Header) - clone.URL = &location - backendConn, err = h.DialForUpgrade(clone) - } - if err != nil { - glog.V(6).Infof("Proxy connection error: %v", err) - h.Responder.Error(w, req, err) - return true - } - defer backendConn.Close() - - // Once the connection is hijacked, the ErrorResponder will no longer work, so - // hijacking should be the last step in the upgrade. - requestHijacker, ok := w.(http.Hijacker) - if !ok { - glog.V(6).Infof("Unable to hijack response writer: %T", w) - h.Responder.Error(w, req, fmt.Errorf("request connection cannot be hijacked: %T", w)) - return true - } - requestHijackedConn, _, err := requestHijacker.Hijack() - if err != nil { - glog.V(6).Infof("Unable to hijack response: %v", err) - h.Responder.Error(w, req, fmt.Errorf("error hijacking connection: %v", err)) - return true - } - defer requestHijackedConn.Close() - - // Forward raw response bytes back to client. - if len(rawResponse) > 0 { - glog.V(6).Infof("Writing %d bytes to hijacked connection", len(rawResponse)) - if _, err = requestHijackedConn.Write(rawResponse); err != nil { - utilruntime.HandleError(fmt.Errorf("Error proxying response from backend to client: %v", err)) - } - } - - // Proxy the connection. - wg := &sync.WaitGroup{} - wg.Add(2) - - go func() { - var writer io.WriteCloser - if h.MaxBytesPerSec > 0 { - writer = flowrate.NewWriter(backendConn, h.MaxBytesPerSec) - } else { - writer = backendConn - } - _, err := io.Copy(writer, requestHijackedConn) - if err != nil && !strings.Contains(err.Error(), "use of closed network connection") { - glog.Errorf("Error proxying data from client to backend: %v", err) - } - wg.Done() - }() - - go func() { - var reader io.ReadCloser - if h.MaxBytesPerSec > 0 { - reader = flowrate.NewReader(backendConn, h.MaxBytesPerSec) - } else { - reader = backendConn - } - _, err := io.Copy(requestHijackedConn, reader) - if err != nil && !strings.Contains(err.Error(), "use of closed network connection") { - glog.Errorf("Error proxying data from backend to client: %v", err) - } - wg.Done() - }() - - wg.Wait() - return true -} - -func (h *UpgradeAwareHandler) Dial(req *http.Request) (net.Conn, error) { - return dial(req, h.Transport) -} - -func (h *UpgradeAwareHandler) DialForUpgrade(req *http.Request) (net.Conn, error) { - if h.UpgradeTransport == nil { - return dial(req, h.Transport) - } - updatedReq, err := h.UpgradeTransport.WrapRequest(req) - if err != nil { - return nil, err - } - return dial(updatedReq, h.UpgradeTransport) -} - -// dial dials the backend at req.URL and writes req to it. -func dial(req *http.Request, transport http.RoundTripper) (net.Conn, error) { - conn, err := DialURL(req.Context(), req.URL, transport) - if err != nil { - return nil, fmt.Errorf("error dialing backend: %v", err) - } - - if err = req.Write(conn); err != nil { - conn.Close() - return nil, fmt.Errorf("error sending request: %v", err) - } - - return conn, err -} - -var _ utilnet.Dialer = &UpgradeAwareHandler{} - -func (h *UpgradeAwareHandler) defaultProxyTransport(url *url.URL, internalTransport http.RoundTripper) http.RoundTripper { - scheme := url.Scheme - host := url.Host - suffix := h.Location.Path - if strings.HasSuffix(url.Path, "/") && !strings.HasSuffix(suffix, "/") { - suffix += "/" - } - pathPrepend := strings.TrimSuffix(url.Path, suffix) - rewritingTransport := &Transport{ - Scheme: scheme, - Host: host, - PathPrepend: pathPrepend, - RoundTripper: internalTransport, - } - return &corsRemovingTransport{ - RoundTripper: rewritingTransport, - } -} - -// corsRemovingTransport is a wrapper for an internal transport. It removes CORS headers -// from the internal response. -// Implements pkg/util/net.RoundTripperWrapper -type corsRemovingTransport struct { - http.RoundTripper -} - -var _ = utilnet.RoundTripperWrapper(&corsRemovingTransport{}) - -func (rt *corsRemovingTransport) RoundTrip(req *http.Request) (*http.Response, error) { - resp, err := rt.RoundTripper.RoundTrip(req) - if err != nil { - return nil, err - } - removeCORSHeaders(resp) - return resp, nil -} - -func (rt *corsRemovingTransport) WrappedRoundTripper() http.RoundTripper { - return rt.RoundTripper -} - -// removeCORSHeaders strip CORS headers sent from the backend -// This should be called on all responses before returning -func removeCORSHeaders(resp *http.Response) { - resp.Header.Del("Access-Control-Allow-Credentials") - resp.Header.Del("Access-Control-Allow-Headers") - resp.Header.Del("Access-Control-Allow-Methods") - resp.Header.Del("Access-Control-Allow-Origin") -} diff --git a/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD b/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD index 27126ab5..46e73b03 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["rand.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/rand", importpath = "k8s.io/apimachinery/pkg/util/rand", ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/rand/rand_test.go b/vendor/k8s.io/apimachinery/pkg/util/rand/rand_test.go new file mode 100644 index 00000000..517043a5 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/rand/rand_test.go @@ -0,0 +1,114 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 rand + +import ( + "math/rand" + "strings" + "testing" +) + +const ( + maxRangeTestCount = 500 + testStringLength = 32 +) + +func TestString(t *testing.T) { + valid := "0123456789abcdefghijklmnopqrstuvwxyz" + for _, l := range []int{0, 1, 2, 10, 123} { + s := String(l) + if len(s) != l { + t.Errorf("expected string of size %d, got %q", l, s) + } + for _, c := range s { + if !strings.ContainsRune(valid, c) { + t.Errorf("expected valid characters, got %v", c) + } + } + } +} + +// Confirm that panic occurs on invalid input. +func TestRangePanic(t *testing.T) { + defer func() { + if err := recover(); err == nil { + t.Errorf("Panic didn't occur!") + } + }() + // Should result in an error... + Intn(0) +} + +func TestIntn(t *testing.T) { + // 0 is invalid. + for _, max := range []int{1, 2, 10, 123} { + inrange := Intn(max) + if inrange < 0 || inrange > max { + t.Errorf("%v out of range (0,%v)", inrange, max) + } + } +} + +func TestPerm(t *testing.T) { + Seed(5) + rand.Seed(5) + for i := 1; i < 20; i++ { + actual := Perm(i) + expected := rand.Perm(i) + for j := 0; j < i; j++ { + if actual[j] != expected[j] { + t.Errorf("Perm call result is unexpected") + } + } + } +} + +func TestIntnRange(t *testing.T) { + // 0 is invalid. + for min, max := range map[int]int{1: 2, 10: 123, 100: 500} { + for i := 0; i < maxRangeTestCount; i++ { + inrange := IntnRange(min, max) + if inrange < min || inrange >= max { + t.Errorf("%v out of range (%v,%v)", inrange, min, max) + } + } + } +} + +func TestInt63nRange(t *testing.T) { + // 0 is invalid. + for min, max := range map[int64]int64{1: 2, 10: 123, 100: 500} { + for i := 0; i < maxRangeTestCount; i++ { + inrange := Int63nRange(min, max) + if inrange < min || inrange >= max { + t.Errorf("%v out of range (%v,%v)", inrange, min, max) + } + } + } +} + +func BenchmarkRandomStringGeneration(b *testing.B) { + b.ResetTimer() + var s string + for i := 0; i < b.N; i++ { + s = String(testStringLength) + } + b.StopTimer() + if len(s) == 0 { + b.Fatal(s) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD b/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD index 9919ad54..2997f51a 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD @@ -8,8 +8,9 @@ load( go_library( name = "go_default_library", srcs = ["constants.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/remotecommand", importpath = "k8s.io/apimachinery/pkg/util/remotecommand", - deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD b/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD index 6407b8bd..6bdeeb3d 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["runtime.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/runtime", importpath = "k8s.io/apimachinery/pkg/util/runtime", deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime_test.go b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime_test.go new file mode 100644 index 00000000..9dff17ea --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime_test.go @@ -0,0 +1,71 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 runtime + +import ( + "fmt" + "testing" +) + +func TestHandleCrash(t *testing.T) { + defer func() { + if x := recover(); x == nil { + t.Errorf("Expected a panic to recover from") + } + }() + defer HandleCrash() + panic("Test Panic") +} + +func TestCustomHandleCrash(t *testing.T) { + old := PanicHandlers + defer func() { PanicHandlers = old }() + var result interface{} + PanicHandlers = []func(interface{}){ + func(r interface{}) { + result = r + }, + } + func() { + defer func() { + if x := recover(); x == nil { + t.Errorf("Expected a panic to recover from") + } + }() + defer HandleCrash() + panic("test") + }() + if result != "test" { + t.Errorf("did not receive custom handler") + } +} + +func TestCustomHandleError(t *testing.T) { + old := ErrorHandlers + defer func() { ErrorHandlers = old }() + var result error + ErrorHandlers = []func(error){ + func(err error) { + result = err + }, + } + err := fmt.Errorf("test") + HandleError(err) + if result != err { + t.Errorf("did not receive custom handler") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD b/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD index aaccd789..76ef7263 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD @@ -17,9 +17,11 @@ go_library( "int64.go", "string.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/sets", importpath = "k8s.io/apimachinery/pkg/util/sets", ) +# This rule makes all sorts of terrible assumptions that it's running inside k8s.io/kubernetes, even though it's part of k8s.io/apimachinery. :\ go_genrule( name = "set-gen", srcs = [ @@ -35,13 +37,13 @@ go_genrule( ], cmd = """ $(location //vendor/k8s.io/code-generator/cmd/set-gen) \ - --input-dirs ./vendor/k8s.io/apimachinery/pkg/util/sets/types \ + --input-dirs k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/sets/types \ --output-base $$(dirname $$(dirname $(location :byte.go))) \ --go-header-file $(location //hack/boilerplate:boilerplate.generatego.txt) \ --output-package sets """, go_deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/sets/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets/types:go_default_library", ], tools = [ "//vendor/k8s.io/code-generator/cmd/set-gen", diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/set_test.go b/vendor/k8s.io/apimachinery/pkg/util/sets/set_test.go new file mode 100644 index 00000000..df722ec2 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/set_test.go @@ -0,0 +1,270 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 sets + +import ( + "reflect" + "testing" +) + +func TestStringSet(t *testing.T) { + s := String{} + s2 := String{} + if len(s) != 0 { + t.Errorf("Expected len=0: %d", len(s)) + } + s.Insert("a", "b") + if len(s) != 2 { + t.Errorf("Expected len=2: %d", len(s)) + } + s.Insert("c") + if s.Has("d") { + t.Errorf("Unexpected contents: %#v", s) + } + if !s.Has("a") { + t.Errorf("Missing contents: %#v", s) + } + s.Delete("a") + if s.Has("a") { + t.Errorf("Unexpected contents: %#v", s) + } + s.Insert("a") + if s.HasAll("a", "b", "d") { + t.Errorf("Unexpected contents: %#v", s) + } + if !s.HasAll("a", "b") { + t.Errorf("Missing contents: %#v", s) + } + s2.Insert("a", "b", "d") + if s.IsSuperset(s2) { + t.Errorf("Unexpected contents: %#v", s) + } + s2.Delete("d") + if !s.IsSuperset(s2) { + t.Errorf("Missing contents: %#v", s) + } +} + +func TestStringSetDeleteMultiples(t *testing.T) { + s := String{} + s.Insert("a", "b", "c") + if len(s) != 3 { + t.Errorf("Expected len=3: %d", len(s)) + } + + s.Delete("a", "c") + if len(s) != 1 { + t.Errorf("Expected len=1: %d", len(s)) + } + if s.Has("a") { + t.Errorf("Unexpected contents: %#v", s) + } + if s.Has("c") { + t.Errorf("Unexpected contents: %#v", s) + } + if !s.Has("b") { + t.Errorf("Missing contents: %#v", s) + } + +} + +func TestNewStringSet(t *testing.T) { + s := NewString("a", "b", "c") + if len(s) != 3 { + t.Errorf("Expected len=3: %d", len(s)) + } + if !s.Has("a") || !s.Has("b") || !s.Has("c") { + t.Errorf("Unexpected contents: %#v", s) + } +} + +func TestStringSetList(t *testing.T) { + s := NewString("z", "y", "x", "a") + if !reflect.DeepEqual(s.List(), []string{"a", "x", "y", "z"}) { + t.Errorf("List gave unexpected result: %#v", s.List()) + } +} + +func TestStringSetDifference(t *testing.T) { + a := NewString("1", "2", "3") + b := NewString("1", "2", "4", "5") + c := a.Difference(b) + d := b.Difference(a) + if len(c) != 1 { + t.Errorf("Expected len=1: %d", len(c)) + } + if !c.Has("3") { + t.Errorf("Unexpected contents: %#v", c.List()) + } + if len(d) != 2 { + t.Errorf("Expected len=2: %d", len(d)) + } + if !d.Has("4") || !d.Has("5") { + t.Errorf("Unexpected contents: %#v", d.List()) + } +} + +func TestStringSetHasAny(t *testing.T) { + a := NewString("1", "2", "3") + + if !a.HasAny("1", "4") { + t.Errorf("expected true, got false") + } + + if a.HasAny("0", "4") { + t.Errorf("expected false, got true") + } +} + +func TestStringSetEquals(t *testing.T) { + // Simple case (order doesn't matter) + a := NewString("1", "2") + b := NewString("2", "1") + if !a.Equal(b) { + t.Errorf("Expected to be equal: %v vs %v", a, b) + } + + // It is a set; duplicates are ignored + b = NewString("2", "2", "1") + if !a.Equal(b) { + t.Errorf("Expected to be equal: %v vs %v", a, b) + } + + // Edge cases around empty sets / empty strings + a = NewString() + b = NewString() + if !a.Equal(b) { + t.Errorf("Expected to be equal: %v vs %v", a, b) + } + + b = NewString("1", "2", "3") + if a.Equal(b) { + t.Errorf("Expected to be not-equal: %v vs %v", a, b) + } + + b = NewString("1", "2", "") + if a.Equal(b) { + t.Errorf("Expected to be not-equal: %v vs %v", a, b) + } + + // Check for equality after mutation + a = NewString() + a.Insert("1") + if a.Equal(b) { + t.Errorf("Expected to be not-equal: %v vs %v", a, b) + } + + a.Insert("2") + if a.Equal(b) { + t.Errorf("Expected to be not-equal: %v vs %v", a, b) + } + + a.Insert("") + if !a.Equal(b) { + t.Errorf("Expected to be equal: %v vs %v", a, b) + } + + a.Delete("") + if a.Equal(b) { + t.Errorf("Expected to be not-equal: %v vs %v", a, b) + } +} + +func TestStringUnion(t *testing.T) { + tests := []struct { + s1 String + s2 String + expected String + }{ + { + NewString("1", "2", "3", "4"), + NewString("3", "4", "5", "6"), + NewString("1", "2", "3", "4", "5", "6"), + }, + { + NewString("1", "2", "3", "4"), + NewString(), + NewString("1", "2", "3", "4"), + }, + { + NewString(), + NewString("1", "2", "3", "4"), + NewString("1", "2", "3", "4"), + }, + { + NewString(), + NewString(), + NewString(), + }, + } + + for _, test := range tests { + union := test.s1.Union(test.s2) + if union.Len() != test.expected.Len() { + t.Errorf("Expected union.Len()=%d but got %d", test.expected.Len(), union.Len()) + } + + if !union.Equal(test.expected) { + t.Errorf("Expected union.Equal(expected) but not true. union:%v expected:%v", union.List(), test.expected.List()) + } + } +} + +func TestStringIntersection(t *testing.T) { + tests := []struct { + s1 String + s2 String + expected String + }{ + { + NewString("1", "2", "3", "4"), + NewString("3", "4", "5", "6"), + NewString("3", "4"), + }, + { + NewString("1", "2", "3", "4"), + NewString("1", "2", "3", "4"), + NewString("1", "2", "3", "4"), + }, + { + NewString("1", "2", "3", "4"), + NewString(), + NewString(), + }, + { + NewString(), + NewString("1", "2", "3", "4"), + NewString(), + }, + { + NewString(), + NewString(), + NewString(), + }, + } + + for _, test := range tests { + intersection := test.s1.Intersection(test.s2) + if intersection.Len() != test.expected.Len() { + t.Errorf("Expected intersection.Len()=%d but got %d", test.expected.Len(), intersection.Len()) + } + + if !intersection.Equal(test.expected) { + t.Errorf("Expected intersection.Equal(expected) but not true. intersection:%v expected:%v", intersection.List(), test.expected.List()) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD index 2d608892..e0a947ec 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD @@ -15,13 +15,13 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/testing:go_default_library", "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch/testing:go_default_library", ], ) @@ -33,12 +33,13 @@ go_library( "patch.go", "types.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/strategicpatch", importpath = "k8s.io/apimachinery/pkg/util/strategicpatch", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//vendor/k8s.io/apimachinery/third_party/forked/golang/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", + "//staging/src/k8s.io/apimachinery/third_party/forked/golang/json:go_default_library", "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS index 8e8d9fce..dbbe0de4 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS @@ -1,5 +1,6 @@ approvers: - pwittrock +- mengqiy reviewers: - mengqiy - apelisse diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go index 6be328f7..ddf99817 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go @@ -1876,7 +1876,7 @@ func mergingMapFieldsHaveConflicts( return true, nil } return slicesHaveConflicts(leftType, rightType, schema, fieldPatchStrategy, fieldPatchMergeKey) - case string, float64, bool, int, int64, nil: + case string, float64, bool, int64, nil: return !reflect.DeepEqual(left, right), nil default: return true, fmt.Errorf("unknown type: %v", reflect.TypeOf(left)) diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go new file mode 100644 index 00000000..4721803c --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch_test.go @@ -0,0 +1,6763 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 strategicpatch + +import ( + "fmt" + "path/filepath" + "reflect" + "strings" + "testing" + + "github.com/davecgh/go-spew/spew" + "github.com/ghodss/yaml" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/json" + "k8s.io/apimachinery/pkg/util/mergepatch" + "k8s.io/apimachinery/pkg/util/sets" + sptest "k8s.io/apimachinery/pkg/util/strategicpatch/testing" +) + +var ( + fakeMergeItemSchema = sptest.Fake{Path: filepath.Join("testdata", "swagger-merge-item.json")} + fakePrecisionItemSchema = sptest.Fake{Path: filepath.Join("testdata", "swagger-precision-item.json")} +) + +type SortMergeListTestCases struct { + TestCases []SortMergeListTestCase +} + +type SortMergeListTestCase struct { + Description string + Original map[string]interface{} + Sorted map[string]interface{} +} + +type StrategicMergePatchTestCases struct { + TestCases []StrategicMergePatchTestCase +} + +type StrategicMergePatchTestCase struct { + Description string + StrategicMergePatchTestCaseData +} + +type StrategicMergePatchRawTestCase struct { + Description string + StrategicMergePatchRawTestCaseData +} + +type StrategicMergePatchTestCaseData struct { + // Original is the original object (last-applied config in annotation) + Original map[string]interface{} + // Modified is the modified object (new config we want) + Modified map[string]interface{} + // Current is the current object (live config in the server) + Current map[string]interface{} + // TwoWay is the expected two-way merge patch diff between original and modified + TwoWay map[string]interface{} + // ThreeWay is the expected three-way merge patch + ThreeWay map[string]interface{} + // Result is the expected object after applying the three-way patch on current object. + Result map[string]interface{} + // TwoWayResult is the expected object after applying the two-way patch on current object. + // If nil, Modified is used. + TwoWayResult map[string]interface{} +} + +// The meaning of each field is the same as StrategicMergePatchTestCaseData's. +// The difference is that all the fields in StrategicMergePatchRawTestCaseData are json-encoded data. +type StrategicMergePatchRawTestCaseData struct { + Original []byte + Modified []byte + Current []byte + TwoWay []byte + ThreeWay []byte + Result []byte + TwoWayResult []byte + ExpectedError string +} + +type MergeItem struct { + Name string `json:"name,omitempty"` + Value string `json:"value,omitempty"` + Other string `json:"other,omitempty"` + MergingList []MergeItem `json:"mergingList,omitempty" patchStrategy:"merge" patchMergeKey:"name"` + NonMergingList []MergeItem `json:"nonMergingList,omitempty"` + MergingIntList []int `json:"mergingIntList,omitempty" patchStrategy:"merge"` + NonMergingIntList []int `json:"nonMergingIntList,omitempty"` + MergeItemPtr *MergeItem `json:"mergeItemPtr,omitempty" patchStrategy:"merge" patchMergeKey:"name"` + SimpleMap map[string]string `json:"simpleMap,omitempty"` + ReplacingItem runtime.RawExtension `json:"replacingItem,omitempty" patchStrategy:"replace"` + RetainKeysMap RetainKeysMergeItem `json:"retainKeysMap,omitempty" patchStrategy:"retainKeys"` + RetainKeysMergingList []MergeItem `json:"retainKeysMergingList,omitempty" patchStrategy:"merge,retainKeys" patchMergeKey:"name"` +} + +type RetainKeysMergeItem struct { + Name string `json:"name,omitempty"` + Value string `json:"value,omitempty"` + Other string `json:"other,omitempty"` + SimpleMap map[string]string `json:"simpleMap,omitempty"` + MergingIntList []int `json:"mergingIntList,omitempty" patchStrategy:"merge"` + MergingList []MergeItem `json:"mergingList,omitempty" patchStrategy:"merge" patchMergeKey:"name"` + NonMergingList []MergeItem `json:"nonMergingList,omitempty"` +} + +var ( + mergeItem MergeItem + mergeItemStructSchema = PatchMetaFromStruct{T: GetTagStructTypeOrDie(mergeItem)} +) + +// These are test cases for SortMergeList, used to assert that it (recursively) +// sorts both merging and non merging lists correctly. +var sortMergeListTestCaseData = []byte(` +testCases: + - description: sort one list of maps + original: + mergingList: + - name: 1 + - name: 3 + - name: 2 + sorted: + mergingList: + - name: 1 + - name: 2 + - name: 3 + - description: sort lists of maps but not nested lists of maps + original: + mergingList: + - name: 2 + nonMergingList: + - name: 1 + - name: 3 + - name: 2 + - name: 1 + nonMergingList: + - name: 2 + - name: 1 + sorted: + mergingList: + - name: 1 + nonMergingList: + - name: 2 + - name: 1 + - name: 2 + nonMergingList: + - name: 1 + - name: 3 + - name: 2 + - description: sort lists of maps and nested lists of maps + original: + mergingList: + - name: 2 + mergingList: + - name: 1 + - name: 3 + - name: 2 + - name: 1 + mergingList: + - name: 2 + - name: 1 + sorted: + mergingList: + - name: 1 + mergingList: + - name: 1 + - name: 2 + - name: 2 + mergingList: + - name: 1 + - name: 2 + - name: 3 + - description: merging list should NOT sort when nested in non merging list + original: + nonMergingList: + - name: 2 + mergingList: + - name: 1 + - name: 3 + - name: 2 + - name: 1 + mergingList: + - name: 2 + - name: 1 + sorted: + nonMergingList: + - name: 2 + mergingList: + - name: 1 + - name: 3 + - name: 2 + - name: 1 + mergingList: + - name: 2 + - name: 1 + - description: sort very nested list of maps + fieldTypes: + original: + mergingList: + - mergingList: + - mergingList: + - name: 2 + - name: 1 + sorted: + mergingList: + - mergingList: + - mergingList: + - name: 1 + - name: 2 + - description: sort nested lists of ints + original: + mergingList: + - name: 2 + mergingIntList: + - 1 + - 3 + - 2 + - name: 1 + mergingIntList: + - 2 + - 1 + sorted: + mergingList: + - name: 1 + mergingIntList: + - 1 + - 2 + - name: 2 + mergingIntList: + - 1 + - 2 + - 3 + - description: sort nested pointers of ints + original: + mergeItemPtr: + - name: 2 + mergingIntList: + - 1 + - 3 + - 2 + - name: 1 + mergingIntList: + - 2 + - 1 + sorted: + mergeItemPtr: + - name: 1 + mergingIntList: + - 1 + - 2 + - name: 2 + mergingIntList: + - 1 + - 2 + - 3 + - description: sort merging list by pointer + original: + mergeItemPtr: + - name: 1 + - name: 3 + - name: 2 + sorted: + mergeItemPtr: + - name: 1 + - name: 2 + - name: 3 +`) + +func TestSortMergeLists(t *testing.T) { + mergeItemOpenapiSchema := PatchMetaFromOpenAPI{ + Schema: sptest.GetSchemaOrDie(fakeMergeItemSchema, "mergeItem"), + } + schemas := []LookupPatchMeta{ + mergeItemStructSchema, + mergeItemOpenapiSchema, + } + + tc := SortMergeListTestCases{} + err := yaml.Unmarshal(sortMergeListTestCaseData, &tc) + if err != nil { + t.Errorf("can't unmarshal test cases: %s\n", err) + return + } + + for _, schema := range schemas { + for _, c := range tc.TestCases { + temp := testObjectToJSONOrFail(t, c.Original) + got := sortJsonOrFail(t, temp, c.Description, schema) + expected := testObjectToJSONOrFail(t, c.Sorted) + if !reflect.DeepEqual(got, expected) { + t.Errorf("using %s error in test case: %s\ncannot sort object:\n%s\nexpected:\n%s\ngot:\n%s\n", + getSchemaType(schema), c.Description, mergepatch.ToYAMLOrError(c.Original), mergepatch.ToYAMLOrError(c.Sorted), jsonToYAMLOrError(got)) + } + } + } +} + +// These are test cases for StrategicMergePatch that cannot be generated using +// CreateTwoWayMergePatch because it may be one of the following cases: +// - not use the replace directive. +// - generate duplicate integers for a merging list patch. +// - generate empty merging lists. +// - use patch format from an old client. +var customStrategicMergePatchTestCaseData = []byte(` +testCases: + - description: unique scalars when merging lists + original: + mergingIntList: + - 1 + - 2 + twoWay: + mergingIntList: + - 2 + - 3 + modified: + mergingIntList: + - 1 + - 2 + - 3 + - description: delete map from nested map + original: + simpleMap: + key1: 1 + key2: 1 + twoWay: + simpleMap: + $patch: delete + modified: + simpleMap: + {} + - description: delete all items from merging list + original: + mergingList: + - name: 1 + - name: 2 + twoWay: + mergingList: + - $patch: replace + modified: + mergingList: [] + - description: merge empty merging lists + original: + mergingList: [] + twoWay: + mergingList: [] + modified: + mergingList: [] + - description: delete all keys from map + original: + name: 1 + value: 1 + twoWay: + $patch: replace + modified: {} + - description: add key and delete all keys from map + original: + name: 1 + value: 1 + twoWay: + other: a + $patch: replace + modified: + other: a + - description: delete all duplicate entries in a merging list + original: + mergingList: + - name: 1 + - name: 1 + - name: 2 + value: a + - name: 3 + - name: 3 + twoWay: + mergingList: + - name: 1 + $patch: delete + - name: 3 + $patch: delete + modified: + mergingList: + - name: 2 + value: a + - description: retainKeys map can add a field when no retainKeys directive present + original: + retainKeysMap: + name: foo + twoWay: + retainKeysMap: + value: bar + modified: + retainKeysMap: + name: foo + value: bar + - description: retainKeys map can change a field when no retainKeys directive present + original: + retainKeysMap: + name: foo + value: a + twoWay: + retainKeysMap: + value: b + modified: + retainKeysMap: + name: foo + value: b + - description: retainKeys map can delete a field when no retainKeys directive present + original: + retainKeysMap: + name: foo + value: a + twoWay: + retainKeysMap: + value: null + modified: + retainKeysMap: + name: foo + - description: retainKeys map merge an empty map + original: + retainKeysMap: + name: foo + value: a + twoWay: + retainKeysMap: {} + modified: + retainKeysMap: + name: foo + value: a + - description: retainKeys list can add a field when no retainKeys directive present + original: + retainKeysMergingList: + - name: bar + - name: foo + twoWay: + retainKeysMergingList: + - name: foo + value: a + modified: + retainKeysMergingList: + - name: bar + - name: foo + value: a + - description: retainKeys list can change a field when no retainKeys directive present + original: + retainKeysMergingList: + - name: bar + - name: foo + value: a + twoWay: + retainKeysMergingList: + - name: foo + value: b + modified: + retainKeysMergingList: + - name: bar + - name: foo + value: b + - description: retainKeys list can delete a field when no retainKeys directive present + original: + retainKeysMergingList: + - name: bar + - name: foo + value: a + twoWay: + retainKeysMergingList: + - name: foo + value: null + modified: + retainKeysMergingList: + - name: bar + - name: foo + - description: preserve the order from the patch in a merging list + original: + mergingList: + - name: 1 + - name: 2 + value: b + - name: 3 + twoWay: + mergingList: + - name: 3 + value: c + - name: 1 + value: a + - name: 2 + other: x + modified: + mergingList: + - name: 3 + value: c + - name: 1 + value: a + - name: 2 + value: b + other: x + - description: preserve the order from the patch in a merging list 2 + original: + mergingList: + - name: 1 + - name: 2 + value: b + - name: 3 + twoWay: + mergingList: + - name: 3 + value: c + - name: 1 + value: a + modified: + mergingList: + - name: 2 + value: b + - name: 3 + value: c + - name: 1 + value: a + - description: preserve the order from the patch in a merging int list + original: + mergingIntList: + - 1 + - 2 + - 3 + twoWay: + mergingIntList: + - 3 + - 1 + - 2 + modified: + mergingIntList: + - 3 + - 1 + - 2 + - description: preserve the order from the patch in a merging int list + original: + mergingIntList: + - 1 + - 2 + - 3 + twoWay: + mergingIntList: + - 3 + - 1 + modified: + mergingIntList: + - 2 + - 3 + - 1 +`) + +var customStrategicMergePatchRawTestCases = []StrategicMergePatchRawTestCase{ + { + Description: "$setElementOrder contains item that is not present in the list to be merged", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 3 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 3 + - name: 2 + - name: 1 +mergingList: + - name: 3 + value: 3 + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 3 + value: 3 + - name: 1 + value: 1 +`), + }, + }, + { + Description: "$setElementOrder contains item that is not present in the int list to be merged", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 3 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 3 + - 2 + - 1 +`), + Modified: []byte(` +mergingIntList: + - 3 + - 1 +`), + }, + }, + { + Description: "should check if order in $setElementOrder and patch list match", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 3 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 + - name: 3 +mergingList: + - name: 3 + value: 3 + - name: 1 + value: 1 +`), + ExpectedError: "doesn't match", + }, + }, + { + Description: "$setElementOrder contains item that is not present in the int list to be merged", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 3 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 + - 3 +mergingIntList: + - 3 + - 1 +`), + ExpectedError: "doesn't match", + }, + }, + { + Description: "missing merge key should error out", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: a +`), + TwoWay: []byte(` +mergingList: + - value: b +`), + ExpectedError: "does not contain declared merge key", + }, + }, +} + +func TestCustomStrategicMergePatch(t *testing.T) { + mergeItemOpenapiSchema := PatchMetaFromOpenAPI{ + Schema: sptest.GetSchemaOrDie(fakeMergeItemSchema, "mergeItem"), + } + schemas := []LookupPatchMeta{ + mergeItemStructSchema, + mergeItemOpenapiSchema, + } + + tc := StrategicMergePatchTestCases{} + err := yaml.Unmarshal(customStrategicMergePatchTestCaseData, &tc) + if err != nil { + t.Errorf("can't unmarshal test cases: %v\n", err) + return + } + + for _, schema := range schemas { + for _, c := range tc.TestCases { + original, expectedTwoWayPatch, _, expectedResult := twoWayTestCaseToJSONOrFail(t, c, schema) + testPatchApplication(t, original, expectedTwoWayPatch, expectedResult, c.Description, "", schema) + } + + for _, c := range customStrategicMergePatchRawTestCases { + original, expectedTwoWayPatch, _, expectedResult := twoWayRawTestCaseToJSONOrFail(t, c) + testPatchApplication(t, original, expectedTwoWayPatch, expectedResult, c.Description, c.ExpectedError, schema) + } + } +} + +// These are test cases for StrategicMergePatch, to assert that applying a patch +// yields the correct outcome. They are also test cases for CreateTwoWayMergePatch +// and CreateThreeWayMergePatch, to assert that they both generate the correct patch +// for the given set of input documents. +// +var createStrategicMergePatchTestCaseData = []byte(` +testCases: + - description: nil original + twoWay: + name: 1 + value: 1 + modified: + name: 1 + value: 1 + current: + name: 1 + other: a + threeWay: + value: 1 + result: + name: 1 + value: 1 + other: a + - description: nil patch + original: + name: 1 + twoWay: + {} + modified: + name: 1 + current: + name: 1 + threeWay: + {} + result: + name: 1 + - description: add field to map + original: + name: 1 + twoWay: + value: 1 + modified: + name: 1 + value: 1 + current: + name: 1 + other: a + threeWay: + value: 1 + result: + name: 1 + value: 1 + other: a + - description: add field to map with conflict + original: + name: 1 + twoWay: + value: 1 + modified: + name: 1 + value: 1 + current: + name: a + other: a + threeWay: + name: 1 + value: 1 + result: + name: 1 + value: 1 + other: a + - description: add field and delete field from map + original: + name: 1 + twoWay: + name: null + value: 1 + modified: + value: 1 + current: + name: 1 + other: a + threeWay: + name: null + value: 1 + result: + value: 1 + other: a + - description: add field and delete field from map with conflict + original: + name: 1 + twoWay: + name: null + value: 1 + modified: + value: 1 + current: + name: a + other: a + threeWay: + name: null + value: 1 + result: + value: 1 + other: a + - description: delete field from nested map + original: + simpleMap: + key1: 1 + key2: 1 + twoWay: + simpleMap: + key2: null + modified: + simpleMap: + key1: 1 + current: + simpleMap: + key1: 1 + key2: 1 + other: a + threeWay: + simpleMap: + key2: null + result: + simpleMap: + key1: 1 + other: a + - description: delete field from nested map with conflict + original: + simpleMap: + key1: 1 + key2: 1 + twoWay: + simpleMap: + key2: null + modified: + simpleMap: + key1: 1 + current: + simpleMap: + key1: a + key2: 1 + other: a + threeWay: + simpleMap: + key1: 1 + key2: null + result: + simpleMap: + key1: 1 + other: a + - description: delete all fields from map + original: + name: 1 + value: 1 + twoWay: + name: null + value: null + modified: {} + current: + name: 1 + value: 1 + other: a + threeWay: + name: null + value: null + result: + other: a + - description: delete all fields from map with conflict + original: + name: 1 + value: 1 + twoWay: + name: null + value: null + modified: {} + current: + name: 1 + value: a + other: a + threeWay: + name: null + value: null + result: + other: a + - description: add field and delete all fields from map + original: + name: 1 + value: 1 + twoWay: + name: null + value: null + other: a + modified: + other: a + current: + name: 1 + value: 1 + other: a + threeWay: + name: null + value: null + result: + other: a + - description: add field and delete all fields from map with conflict + original: + name: 1 + value: 1 + twoWay: + name: null + value: null + other: a + modified: + other: a + current: + name: 1 + value: 1 + other: b + threeWay: + name: null + value: null + other: a + result: + other: a + - description: replace list of scalars + original: + nonMergingIntList: + - 1 + - 2 + twoWay: + nonMergingIntList: + - 2 + - 3 + modified: + nonMergingIntList: + - 2 + - 3 + current: + nonMergingIntList: + - 1 + - 2 + threeWay: + nonMergingIntList: + - 2 + - 3 + result: + nonMergingIntList: + - 2 + - 3 + - description: replace list of scalars with conflict + original: + nonMergingIntList: + - 1 + - 2 + twoWay: + nonMergingIntList: + - 2 + - 3 + modified: + nonMergingIntList: + - 2 + - 3 + current: + nonMergingIntList: + - 1 + - 4 + threeWay: + nonMergingIntList: + - 2 + - 3 + result: + nonMergingIntList: + - 2 + - 3 + - description: delete all maps from merging list + original: + mergingList: + - name: 1 + - name: 2 + twoWay: + mergingList: + - name: 1 + $patch: delete + - name: 2 + $patch: delete + modified: + mergingList: [] + current: + mergingList: + - name: 1 + - name: 2 + threeWay: + mergingList: + - name: 1 + $patch: delete + - name: 2 + $patch: delete + result: + mergingList: [] + - description: delete all maps from merging list with conflict + original: + mergingList: + - name: 1 + - name: 2 + twoWay: + mergingList: + - name: 1 + $patch: delete + - name: 2 + $patch: delete + modified: + mergingList: [] + current: + mergingList: + - name: 1 + other: a + - name: 2 + other: b + threeWay: + mergingList: + - name: 1 + $patch: delete + - name: 2 + $patch: delete + result: + mergingList: [] + - description: delete all maps from empty merging list + original: + mergingList: + - name: 1 + - name: 2 + twoWay: + mergingList: + - name: 1 + $patch: delete + - name: 2 + $patch: delete + modified: + mergingList: [] + current: + mergingList: [] + threeWay: + mergingList: + - name: 1 + $patch: delete + - name: 2 + $patch: delete + result: + mergingList: [] + - description: merge empty merging lists + original: + mergingList: [] + twoWay: + {} + modified: + mergingList: [] + current: + mergingList: [] + threeWay: + {} + result: + mergingList: [] + - description: defined null values should propagate overwrite current fields (with conflict) + original: + name: 2 + twoWay: + name: 1 + value: 1 + other: null + twoWayResult: + name: 1 + value: 1 + modified: + name: 1 + value: 1 + other: null + current: + name: a + other: a + threeWay: + name: 1 + value: 1 + other: null + result: + name: 1 + value: 1 + - description: defined null values should propagate removing original fields + original: + name: original-name + value: original-value + current: + name: original-name + value: original-value + other: current-other + modified: + name: modified-name + value: null + twoWay: + name: modified-name + value: null + twoWayResult: + name: modified-name + threeWay: + name: modified-name + value: null + result: + name: modified-name + other: current-other + - description: nil patch with retainKeys map + original: + name: a + retainKeysMap: + name: foo + current: + name: a + value: b + retainKeysMap: + name: foo + modified: + name: a + retainKeysMap: + name: foo + twoWay: {} + threeWay: {} + result: + name: a + value: b + retainKeysMap: + name: foo + - description: retainKeys map with no change should not be present + original: + name: a + retainKeysMap: + name: foo + current: + name: a + other: c + retainKeysMap: + name: foo + modified: + name: a + value: b + retainKeysMap: + name: foo + twoWay: + value: b + threeWay: + value: b + result: + name: a + value: b + other: c + retainKeysMap: + name: foo +`) + +var strategicMergePatchRawTestCases = []StrategicMergePatchRawTestCase{ + { + Description: "delete items in lists of scalars", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 + - 3 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Modified: []byte(` +mergingIntList: + - 1 + - 2 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 3 + - 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Result: []byte(` +mergingIntList: + - 1 + - 2 + - 4 +`), + }, + }, + { + Description: "delete all duplicate items in lists of scalars", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 + - 3 + - 3 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Modified: []byte(` +mergingIntList: + - 1 + - 2 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 3 + - 3 + - 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Result: []byte(` +mergingIntList: + - 1 + - 2 + - 4 +`), + }, + }, + { + Description: "add and delete items in lists of scalars", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 + - 3 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 + - 4 +$deleteFromPrimitiveList/mergingIntList: + - 3 +mergingIntList: + - 4 +`), + Modified: []byte(` +mergingIntList: + - 1 + - 2 + - 4 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 3 + - 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 + - 4 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Result: []byte(` +mergingIntList: + - 1 + - 2 + - 4 +`), + }, + }, + { + Description: "merge lists of maps", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 1 + - name: 2 + - name: 3 +mergingList: + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + Modified: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 1 + - name: 2 + value: 2 + - name: 3 + value: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 1 + - name: 2 + - name: 3 +mergingList: + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + Result: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 1 + other: a + - name: 2 + value: 2 + other: b + - name: 3 + value: 3 +`), + }, + }, + { + Description: "merge lists of maps with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 + - name: 3 +mergingList: + - name: 3 + value: 3 +`), + Modified: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 3 + value: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 3 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 + - name: 3 +mergingList: + - name: 2 + value: 2 + - name: 3 + value: 3 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b + - name: 3 + value: 3 +`), + }, + }, + { + Description: "add field to map in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "add field to map in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "add field to map in merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 3 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + Result: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + - name: 3 + value: 2 + other: b +`), + }, + }, + { + Description: "add duplicate field to map in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(`{}`), + Result: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "add an item that already exists in current object in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: a + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 + - name: 3 +mergingList: + - name: 3 +`), + Modified: []byte(` +mergingList: + - name: 1 + value: a + - name: 2 + - name: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + value: a + other: x + - name: 2 + - name: 3 +`), + ThreeWay: []byte(`{}`), + Result: []byte(` +mergingList: + - name: 1 + value: a + other: x + - name: 2 + - name: 3 +`), + }, + }, + { + Description: "add duplicate field to map in merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 3 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 2 + value: 2 +`), + Result: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "replace map field value in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: a +`), + Modified: []byte(` +mergingList: + - name: 1 + value: a + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: a +`), + Result: []byte(` +mergingList: + - name: 1 + value: a + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "replace map field value in merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: a +`), + Modified: []byte(` +mergingList: + - name: 1 + value: a + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + value: 3 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: a +`), + Result: []byte(` +mergingList: + - name: 1 + value: a + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "delete map from merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 1 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 1 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 2 + other: b +`), + }, + }, + { + Description: "delete map from merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 1 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 1 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 2 + other: b +`), + }, + }, + { + Description: "delete missing map from merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 1 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 1 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 2 + other: b +`), + }, + }, + { + Description: "delete missing map from merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 1 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 3 + other: a +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 +mergingList: + - name: 2 + - name: 1 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 2 + - name: 3 + other: a +`), + }, + }, + { + Description: "add map and delete map from merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 3 +mergingList: + - name: 3 + - name: 1 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 2 + - name: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + - name: 2 + other: b + - name: 4 + other: c +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 3 +mergingList: + - name: 3 + - name: 1 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 2 + other: b + - name: 4 + other: c + - name: 3 +`), + }, + }, + { + Description: "add map and delete map from merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 3 +mergingList: + - name: 3 + - name: 1 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 2 + - name: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 4 + other: c +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 3 +mergingList: + - name: 2 + - name: 3 + - name: 1 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 4 + other: c + - name: 2 + - name: 3 +`), + }, + }, + { + Description: "delete field from map in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null +`), + Modified: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "delete field from map in merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null +`), + Modified: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + value: a + other: a + - name: 2 + value: 2 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 +`), + }, + }, + { + Description: "delete missing field from map in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null +`), + Modified: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "delete missing field from map in merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null +`), + Modified: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + value: null + - name: 2 + value: 2 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "replace non merging list nested in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + nonMergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + nonMergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + nonMergingList: + - name: 1 + value: 1 + - name: 2 + other: b +`), + }, + }, + { + Description: "replace non merging list nested in merging list with value conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + nonMergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + nonMergingList: + - name: 1 + value: c + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + nonMergingList: + - name: 1 + value: 1 + - name: 2 + other: b +`), + }, + }, + { + Description: "replace non merging list nested in merging list with deletion conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + nonMergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + nonMergingList: + - name: 2 + value: 2 + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 1 + nonMergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + nonMergingList: + - name: 1 + value: 1 + - name: 2 + other: b +`), + }, + }, + { + Description: "add field to map in merging list nested in merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 1 + - name: 2 + name: 1 + mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 1 + - name: 2 + name: 1 + mergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 + - name: 2 + other: b +`), + }, + }, + { + Description: "add field to map in merging list nested in merging list with value conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 1 + - name: 2 + name: 1 + mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 1 + value: a + other: c + - name: 2 + value: b + other: d + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 1 + - name: 2 + name: 1 + mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 1 + value: 1 + other: c + - name: 2 + value: 2 + other: d + - name: 2 + other: b +`), + }, + }, + { + Description: "add field to map in merging list nested in merging list with deletion conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 1 + - name: 2 + name: 1 + mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 2 + value: 2 + other: d + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 1 + - name: 2 + name: 1 + mergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 1 + value: 1 + - name: 2 + value: 2 + other: d + - name: 2 + other: b +`), + }, + }, + + { + Description: "add field to map in merging list nested in merging list with deletion conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 2 + - name: 1 + name: 1 + mergingList: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergingList: + - name: 1 + mergingList: + - name: 2 + value: 2 + - name: 1 + value: 1 + - name: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 2 + value: 2 + other: d + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - $setElementOrder/mergingList: + - name: 2 + - name: 1 + name: 1 + mergingList: + - name: 1 + value: 1 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + mergingList: + - name: 2 + value: 2 + other: d + - name: 1 + value: 1 + - name: 2 + other: b +`), + }, + }, + { + Description: "add map to merging list by pointer", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergeItemPtr: + - name: 1 +`), + TwoWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - name: 2 +`), + Modified: []byte(` +mergeItemPtr: + - name: 1 + - name: 2 +`), + Current: []byte(` +mergeItemPtr: + - name: 1 + other: a + - name: 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - name: 2 +`), + Result: []byte(` +mergeItemPtr: + - name: 1 + other: a + - name: 2 + - name: 3 +`), + }, + }, + { + Description: "add map to merging list by pointer with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergeItemPtr: + - name: 1 +`), + TwoWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - name: 2 +`), + Modified: []byte(` +mergeItemPtr: + - name: 1 + - name: 2 +`), + Current: []byte(` +mergeItemPtr: + - name: 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - name: 1 + - name: 2 +`), + Result: []byte(` +mergeItemPtr: + - name: 1 + - name: 2 + - name: 3 +`), + }, + }, + { + Description: "add field to map in merging list by pointer", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergeItemPtr: + - name: 1 + mergeItemPtr: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - $setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 + name: 1 + mergeItemPtr: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergeItemPtr: + - name: 1 + mergeItemPtr: + - name: 1 + value: 1 + - name: 2 + value: 2 + - name: 2 +`), + Current: []byte(` +mergeItemPtr: + - name: 1 + other: a + mergeItemPtr: + - name: 1 + other: a + - name: 2 + value: 2 + other: b + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - $setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 + name: 1 + mergeItemPtr: + - name: 1 + value: 1 +`), + Result: []byte(` +mergeItemPtr: + - name: 1 + other: a + mergeItemPtr: + - name: 1 + value: 1 + other: a + - name: 2 + value: 2 + other: b + - name: 2 + other: b +`), + }, + }, + { + Description: "add field to map in merging list by pointer with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergeItemPtr: + - name: 1 + mergeItemPtr: + - name: 1 + - name: 2 + value: 2 + - name: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - $setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 + name: 1 + mergeItemPtr: + - name: 1 + value: 1 +`), + Modified: []byte(` +mergeItemPtr: + - name: 1 + mergeItemPtr: + - name: 1 + value: 1 + - name: 2 + value: 2 + - name: 2 +`), + Current: []byte(` +mergeItemPtr: + - name: 1 + other: a + mergeItemPtr: + - name: 1 + value: a + - name: 2 + value: 2 + other: b + - name: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 +mergeItemPtr: + - $setElementOrder/mergeItemPtr: + - name: 1 + - name: 2 + name: 1 + mergeItemPtr: + - name: 1 + value: 1 +`), + Result: []byte(` +mergeItemPtr: + - name: 1 + other: a + mergeItemPtr: + - name: 1 + value: 1 + - name: 2 + value: 2 + other: b + - name: 2 + other: b +`), + }, + }, + { + Description: "merge lists of scalars", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: +- 1 +- 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: +- 1 +- 2 +- 3 +mergingIntList: +- 3 +`), + Modified: []byte(` +mergingIntList: +- 1 +- 2 +- 3 +`), + Current: []byte(` +mergingIntList: +- 1 +- 2 +- 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: +- 1 +- 2 +- 3 +mergingIntList: +- 3 +`), + Result: []byte(` +mergingIntList: +- 1 +- 2 +- 3 +- 4 +`), + }, + }, + { + Description: "add duplicate field to map in merging int list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 2 + - 3 +mergingIntList: + - 3 +`), + Modified: []byte(` +mergingIntList: + - 1 + - 2 + - 3 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 3 +`), + ThreeWay: []byte(`{}`), + Result: []byte(` +mergingIntList: + - 1 + - 2 + - 3 +`), + }, + }, + // test case for setElementOrder + { + Description: "add an item in a list of primitives and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: +- 1 +- 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: +- 3 +- 1 +- 2 +mergingIntList: +- 3 +`), + Modified: []byte(` +mergingIntList: +- 3 +- 1 +- 2 +`), + Current: []byte(` +mergingIntList: +- 1 +- 4 +- 2 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: +- 3 +- 1 +- 2 +mergingIntList: +- 3 +`), + Result: []byte(` +mergingIntList: +- 3 +- 1 +- 4 +- 2 +`), + }, + }, + { + Description: "delete an item in a list of primitives and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: +- 1 +- 2 +- 3 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: +- 2 +- 1 +$deleteFromPrimitiveList/mergingIntList: +- 3 +`), + Modified: []byte(` +mergingIntList: +- 2 +- 1 +`), + Current: []byte(` +mergingIntList: +- 1 +- 2 +- 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: +- 2 +- 1 +$deleteFromPrimitiveList/mergingIntList: +- 3 +`), + Result: []byte(` +mergingIntList: +- 2 +- 1 +`), + }, + }, + { + Description: "add an item in a list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 3 + - name: 1 + - name: 2 +mergingList: + - name: 3 + value: 3 +`), + Modified: []byte(` +mergingList: + - name: 3 + value: 3 + - name: 1 + - name: 2 + value: 2 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 3 + - name: 1 + - name: 2 +mergingList: + - name: 3 + value: 3 +`), + Result: []byte(` +mergingList: + - name: 3 + value: 3 + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + }, + }, + { + Description: "add multiple items in a list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 4 + - name: 2 + - name: 3 +mergingList: + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + Modified: []byte(` +mergingList: + - name: 1 + - name: 4 + value: 4 + - name: 2 + value: 2 + - name: 3 + value: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 4 + - name: 2 + - name: 3 +mergingList: + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + Result: []byte(` +mergingList: + - name: 1 + other: a + - name: 4 + value: 4 + - name: 2 + value: 2 + other: b + - name: 3 + value: 3 +`), + }, + }, + { + Description: "delete an item in a list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 3 + value: 3 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 1 +mergingList: + - name: 3 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 2 + value: 2 + - name: 1 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b + - name: 3 + value: 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 1 +mergingList: + - name: 3 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 2 + value: 2 + other: b + - name: 1 + other: a +`), + }, + }, + { + Description: "change an item in a list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 3 + value: 3 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 3 + - name: 1 +mergingList: + - name: 3 + value: x +`), + Modified: []byte(` +mergingList: + - name: 2 + value: 2 + - name: 3 + value: x + - name: 1 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b + - name: 3 + value: 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 3 + - name: 1 +mergingList: + - name: 3 + value: x +`), + Result: []byte(` +mergingList: + - name: 2 + value: 2 + other: b + - name: 3 + value: x + - name: 1 + other: a +`), + }, + }, + { + Description: "add and delete an item in a list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 3 + value: 3 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 2 + - name: 1 +mergingList: + - name: 4 + value: 4 + - name: 3 + $patch: delete +`), + Modified: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 2 + value: 2 + - name: 1 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + other: b + - name: 3 + value: 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 2 + - name: 1 +mergingList: + - name: 4 + value: 4 + - name: 3 + $patch: delete +`), + Result: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 2 + value: 2 + other: b + - name: 1 + other: a +`), + }, + }, + { + Description: "set elements order in a list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 3 + value: 3 + - name: 4 + value: 4 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 2 + - name: 3 + - name: 1 +`), + Modified: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 2 + value: 2 + - name: 3 + value: 3 + - name: 1 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 3 + value: 3 + - name: 4 + value: 4 + - name: 2 + value: 2 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 2 + - name: 3 + - name: 1 +`), + Result: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 2 + value: 2 + - name: 3 + value: 3 + - name: 1 + other: a +`), + }, + }, + { + Description: "set elements order in a list with server-only items", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 3 + value: 3 + - name: 4 + value: 4 + - name: 2 + value: 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 2 + - name: 3 + - name: 1 +`), + Modified: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 2 + value: 2 + - name: 3 + value: 3 + - name: 1 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 3 + value: 3 + - name: 4 + value: 4 + - name: 2 + value: 2 + - name: 9 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 4 + - name: 2 + - name: 3 + - name: 1 +`), + Result: []byte(` +mergingList: + - name: 4 + value: 4 + - name: 2 + value: 2 + - name: 3 + value: 3 + - name: 1 + other: a + - name: 9 +`), + }, + }, + { + Description: "set elements order in a list with server-only items 2", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 3 + value: 3 + - name: 4 + value: 4 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 1 + - name: 4 + - name: 3 +`), + Modified: []byte(` +mergingList: + - name: 2 + value: 2 + - name: 1 + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + - name: 9 + - name: 3 + value: 3 + - name: 4 + value: 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 1 + - name: 4 + - name: 3 +`), + Result: []byte(` +mergingList: + - name: 2 + value: 2 + - name: 1 + other: a + - name: 9 + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + }, + }, + { + Description: "set elements order in a list with server-only items 3", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: + - name: 1 + - name: 2 + value: 2 + - name: 3 + value: 3 + - name: 4 + value: 4 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 1 + - name: 4 + - name: 3 +`), + Modified: []byte(` +mergingList: + - name: 2 + value: 2 + - name: 1 + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + Current: []byte(` +mergingList: + - name: 1 + other: a + - name: 2 + value: 2 + - name: 7 + - name: 9 + - name: 8 + - name: 3 + value: 3 + - name: 4 + value: 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 2 + - name: 1 + - name: 4 + - name: 3 +`), + Result: []byte(` +mergingList: + - name: 2 + value: 2 + - name: 1 + other: a + - name: 7 + - name: 9 + - name: 8 + - name: 4 + value: 4 + - name: 3 + value: 3 +`), + }, + }, + { + Description: "add an item in a int list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 3 + - 1 + - 2 +mergingIntList: + - 3 +`), + Modified: []byte(` +mergingIntList: + - 3 + - 1 + - 2 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 3 + - 1 + - 2 +mergingIntList: + - 3 +`), + Result: []byte(` +mergingIntList: + - 3 + - 1 + - 2 +`), + }, + }, + { + Description: "add multiple items in a int list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 4 + - 2 + - 3 +mergingIntList: + - 4 + - 3 +`), + Modified: []byte(` +mergingIntList: + - 1 + - 4 + - 2 + - 3 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 1 + - 4 + - 2 + - 3 +mergingIntList: + - 4 + - 3 +`), + Result: []byte(` +mergingIntList: + - 1 + - 4 + - 2 + - 3 +`), + }, + }, + { + Description: "delete an item in a int list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 3 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 2 + - 1 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Modified: []byte(` +mergingIntList: + - 2 + - 1 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 2 + - 1 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Result: []byte(` +mergingIntList: + - 2 + - 1 +`), + }, + }, + { + Description: "add and delete an item in a int list and preserve order", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 3 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 4 + - 2 + - 1 +mergingIntList: + - 4 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Modified: []byte(` +mergingIntList: + - 4 + - 2 + - 1 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 4 + - 2 + - 1 +mergingIntList: + - 4 +$deleteFromPrimitiveList/mergingIntList: + - 3 +`), + Result: []byte(` +mergingIntList: + - 4 + - 2 + - 1 +`), + }, + }, + { + Description: "set elements order in a int list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 3 + - 4 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 4 + - 2 + - 3 + - 1 +`), + Modified: []byte(` +mergingIntList: + - 4 + - 2 + - 3 + - 1 +`), + Current: []byte(` +mergingIntList: + - 1 + - 3 + - 4 + - 2 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 4 + - 2 + - 3 + - 1 +`), + Result: []byte(` +mergingIntList: + - 4 + - 2 + - 3 + - 1 +`), + }, + }, + { + Description: "set elements order in a int list with server-only items", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 3 + - 4 + - 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 4 + - 2 + - 3 + - 1 +`), + Modified: []byte(` +mergingIntList: + - 4 + - 2 + - 3 + - 1 +`), + Current: []byte(` +mergingIntList: + - 1 + - 3 + - 4 + - 2 + - 9 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 4 + - 2 + - 3 + - 1 +`), + Result: []byte(` +mergingIntList: + - 4 + - 2 + - 3 + - 1 + - 9 +`), + }, + }, + { + Description: "set elements order in a int list with server-only items 2", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 + - 3 + - 4 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 2 + - 1 + - 4 + - 3 +`), + Modified: []byte(` +mergingIntList: + - 2 + - 1 + - 4 + - 3 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 9 + - 3 + - 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 2 + - 1 + - 4 + - 3 +`), + Result: []byte(` +mergingIntList: + - 2 + - 1 + - 9 + - 4 + - 3 +`), + }, + }, + { + Description: "set elements order in a int list with server-only items 3", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: + - 1 + - 2 + - 3 + - 4 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: + - 2 + - 1 + - 4 + - 3 +`), + Modified: []byte(` +mergingIntList: + - 2 + - 1 + - 4 + - 3 +`), + Current: []byte(` +mergingIntList: + - 1 + - 2 + - 7 + - 9 + - 8 + - 3 + - 4 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: + - 2 + - 1 + - 4 + - 3 +`), + Result: []byte(` +mergingIntList: + - 2 + - 1 + - 7 + - 9 + - 8 + - 4 + - 3 +`), + }, + }, + { + // This test case is used just to demonstrate the behavior when dealing with a list with duplicate + Description: "behavior of set element order for a merging list with duplicate", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: +- name: 1 +- name: 2 + value: dup1 +- name: 3 +- name: 2 + value: dup2 +- name: 4 +`), + Current: []byte(` +mergingList: +- name: 1 +- name: 2 + value: dup1 +- name: 3 +- name: 2 + value: dup2 +- name: 4 +`), + Modified: []byte(` +mergingList: +- name: 2 + value: dup1 +- name: 1 +- name: 4 +- name: 3 +- name: 2 + value: dup2 +`), + TwoWay: []byte(` +$setElementOrder/mergingList: +- name: 2 +- name: 1 +- name: 4 +- name: 3 +- name: 2 +`), + TwoWayResult: []byte(` +mergingList: +- name: 2 + value: dup1 +- name: 2 + value: dup2 +- name: 1 +- name: 4 +- name: 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: +- name: 2 +- name: 1 +- name: 4 +- name: 3 +- name: 2 +`), + Result: []byte(` +mergingList: +- name: 2 + value: dup1 +- name: 2 + value: dup2 +- name: 1 +- name: 4 +- name: 3 +`), + }, + }, + { + // This test case is used just to demonstrate the behavior when dealing with a list with duplicate + Description: "behavior of set element order for a merging int list with duplicate", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingIntList: +- 1 +- 2 +- 3 +- 2 +- 4 +`), + Current: []byte(` +mergingIntList: +- 1 +- 2 +- 3 +- 2 +- 4 +`), + Modified: []byte(` +mergingIntList: +- 2 +- 1 +- 4 +- 3 +- 2 +`), + TwoWay: []byte(` +$setElementOrder/mergingIntList: +- 2 +- 1 +- 4 +- 3 +- 2 +`), + TwoWayResult: []byte(` +mergingIntList: +- 2 +- 2 +- 1 +- 4 +- 3 +`), + ThreeWay: []byte(` +$setElementOrder/mergingIntList: +- 2 +- 1 +- 4 +- 3 +- 2 +`), + Result: []byte(` +mergingIntList: +- 2 +- 2 +- 1 +- 4 +- 3 +`), + }, + }, + { + Description: "retainKeys map should clear defaulted field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(`{}`), + Current: []byte(` +retainKeysMap: + value: foo +`), + Modified: []byte(` +retainKeysMap: + other: bar +`), + TwoWay: []byte(` +retainKeysMap: + other: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - other + other: bar +`), + Result: []byte(` +retainKeysMap: + other: bar +`), + }, + }, + { + Description: "retainKeys map should clear defaulted field with conflict (discriminated union)", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(`{}`), + Current: []byte(` +retainKeysMap: + name: type1 + value: foo +`), + Modified: []byte(` +retainKeysMap: + name: type2 + other: bar +`), + TwoWay: []byte(` +retainKeysMap: + name: type2 + other: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - other + name: type2 + other: bar +`), + Result: []byte(` +retainKeysMap: + name: type2 + other: bar +`), + }, + }, + { + Description: "retainKeys map adds a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo +`), + Current: []byte(` +retainKeysMap: + name: foo +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar +`), + }, + }, + { + Description: "retainKeys map adds a field and clear a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo +`), + Current: []byte(` +retainKeysMap: + name: foo + other: a +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar +`), + }, + }, + { + Description: "retainKeys map deletes a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar +`), + Modified: []byte(` +retainKeysMap: + name: foo +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + value: null +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + value: null +`), + Result: []byte(` +retainKeysMap: + name: foo +`), + }, + }, + { + Description: "retainKeys map deletes a field and clears a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar + other: a +`), + Modified: []byte(` +retainKeysMap: + name: foo +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + value: null +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + value: null +`), + Result: []byte(` +retainKeysMap: + name: foo +`), + }, + }, + { + Description: "retainKeys map clears a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar + other: a +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar +`), + TwoWay: []byte(`{}`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar +`), + }, + }, + { + Description: "retainKeys map nested map with no change", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + simpleMap: + key1: a +`), + Current: []byte(` +retainKeysMap: + name: foo + simpleMap: + key1: a +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + value: bar +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a +`), + }, + }, + { + Description: "retainKeys map adds a field in a nested map", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key3: c +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key2: b +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key2: b +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key2: b +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key2: b + key3: c +`), + }, + }, + { + Description: "retainKeys map deletes a field in a nested map", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key2: b +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key2: b + key3: c +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key2: null +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key2: null +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key3: c +`), + }, + }, + { + Description: "retainKeys map changes a field in a nested map", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key2: b +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: a + key2: b + key3: c +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: x + key2: b +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key1: x +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key1: x +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: x + key2: b + key3: c +`), + }, + }, + { + Description: "retainKeys map changes a field in a nested map with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: old + key2: b +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: new + key2: b + key3: c +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: modified + key2: b +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key1: modified +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - simpleMap + - value + simpleMap: + key1: modified +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + simpleMap: + key1: modified + key2: b + key3: c +`), + }, + }, + { + Description: "retainKeys map replaces non-merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: b +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: c + - name: b +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - nonMergingList + - value + nonMergingList: + - name: a + - name: c + - name: b +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - nonMergingList + - value + nonMergingList: + - name: a + - name: c + - name: b +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: c + - name: b +`), + }, + }, + { + Description: "retainKeys map nested non-merging list with no change", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: b +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - nonMergingList + - value + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - nonMergingList + - value + value: bar +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: b +`), + }, + }, + { + Description: "retainKeys map nested non-merging list with no change with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b + - name: c +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: b +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - nonMergingList + - value + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - nonMergingList + - value + value: bar + nonMergingList: + - name: a + - name: b +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + nonMergingList: + - name: a + - name: b +`), + }, + }, + { + Description: "retainKeys map deletes nested non-merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar + nonMergingList: null +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar + nonMergingList: null +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar +`), + }, + }, + { + Description: "retainKeys map delete nested non-merging list with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + nonMergingList: + - name: a + - name: b + - name: c +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar + nonMergingList: null +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar + nonMergingList: null +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar +`), + }, + }, + { + Description: "retainKeys map nested merging int list with no change", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + mergingIntList: + - 1 + - 2 +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingIntList + - name + - value + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingIntList + - name + - value + $setElementOrder/mergingIntList: + - 1 + - 2 + value: bar +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + mergingIntList: + - 1 + - 2 + - 3 +`), + }, + }, + { + Description: "retainKeys map adds an item in nested merging int list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 +`), + Modified: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 4 +`), + TwoWay: []byte(` +retainKeysMap: + $setElementOrder/mergingIntList: + - 1 + - 2 + - 4 + $retainKeys: + - mergingIntList + - name + mergingIntList: + - 4 +`), + ThreeWay: []byte(` +retainKeysMap: + $setElementOrder/mergingIntList: + - 1 + - 2 + - 4 + $retainKeys: + - mergingIntList + - name + mergingIntList: + - 4 +`), + Result: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 4 + - 3 +`), + }, + }, + { + Description: "retainKeys map deletes an item in nested merging int list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 + - 4 +`), + Modified: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 3 +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingIntList + - name + $deleteFromPrimitiveList/mergingIntList: + - 2 + $setElementOrder/mergingIntList: + - 1 + - 3 +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingIntList + - name + $deleteFromPrimitiveList/mergingIntList: + - 2 + $setElementOrder/mergingIntList: + - 1 + - 3 +`), + Result: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 3 + - 4 +`), + }, + }, + { + Description: "retainKeys map adds an item and deletes an item in nested merging int list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 + - 4 +`), + Modified: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 3 + - 5 +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingIntList + - name + mergingIntList: + - 5 + $deleteFromPrimitiveList/mergingIntList: + - 2 + $setElementOrder/mergingIntList: + - 1 + - 3 + - 5 +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingIntList + - name + mergingIntList: + - 5 + $deleteFromPrimitiveList/mergingIntList: + - 2 + $setElementOrder/mergingIntList: + - 1 + - 3 + - 5 +`), + Result: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 3 + - 5 + - 4 +`), + }, + }, + { + Description: "retainKeys map deletes nested merging int list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingIntList: + - 1 + - 2 + - 3 +`), + Modified: []byte(` +retainKeysMap: + name: foo +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + mergingIntList: null +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + mergingIntList: null +`), + Result: []byte(` +retainKeysMap: + name: foo +`), + }, + }, + { + Description: "retainKeys map nested merging list with no change", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + - name: c +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar + mergingList: + - name: a + - name: b +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + - value + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + - value + $setElementOrder/mergingList: + - name: a + - name: b + value: bar +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar + mergingList: + - name: a + - name: b + - name: c +`), + }, + }, + { + Description: "retainKeys map adds an item in nested merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + - name: x +`), + Modified: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + - name: c +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + $setElementOrder/mergingList: + - name: a + - name: b + - name: c + mergingList: + - name: c +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + $setElementOrder/mergingList: + - name: a + - name: b + - name: c + mergingList: + - name: c +`), + Result: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + - name: c + - name: x +`), + }, + }, + { + Description: "retainKeys map changes an item in nested merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + value: foo +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + value: foo + - name: x +`), + Modified: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + value: bar +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + $setElementOrder/mergingList: + - name: a + - name: b + mergingList: + - name: b + value: bar +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + $setElementOrder/mergingList: + - name: a + - name: b + mergingList: + - name: b + value: bar +`), + Result: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + value: bar + - name: x +`), + }, + }, + { + Description: "retainKeys map deletes nested merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b +`), + Modified: []byte(` +retainKeysMap: + name: foo + value: bar +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar + mergingList: null +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - name + - value + value: bar + mergingList: null +`), + Result: []byte(` +retainKeysMap: + name: foo + value: bar +`), + }, + }, + { + Description: "retainKeys map deletes an item in nested merging list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b +`), + Current: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: b + - name: x +`), + Modified: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a +`), + TwoWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + $setElementOrder/mergingList: + - name: a + mergingList: + - name: b + $patch: delete +`), + ThreeWay: []byte(` +retainKeysMap: + $retainKeys: + - mergingList + - name + $setElementOrder/mergingList: + - name: a + mergingList: + - name: b + $patch: delete +`), + Result: []byte(` +retainKeysMap: + name: foo + mergingList: + - name: a + - name: x +`), + }, + }, + { + Description: "retainKeys list of maps clears a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a + other: x +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + TwoWay: []byte(`{}`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + }, + }, + { + Description: "retainKeys list of maps clears a field with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: old +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: new + other: x +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: modified +`), + TwoWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: modified +`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: modified +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: modified +`), + }, + }, + { + Description: "retainKeys list of maps changes a field and clear a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: old +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: old + other: x +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: new +`), + TwoWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: new +`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: new +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: new +`), + }, + }, + { + Description: "retainKeys list of maps changes a field and clear a field with conflict", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: old +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: modified + other: x +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: new +`), + TwoWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: new +`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: new +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: new +`), + }, + }, + { + Description: "retainKeys list of maps adds a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + TwoWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: a +`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: a +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + }, + }, + { + Description: "retainKeys list of maps adds a field and clear a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + other: x +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + TwoWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: a +`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + - value + name: foo + value: a +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + }, + }, + { + Description: "retainKeys list of maps deletes a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo +`), + TwoWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + name: foo + value: null +`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + name: foo + value: null +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo +`), + }, + }, + { + Description: "retainKeys list of maps deletes a field and clear a field", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a +`), + Current: []byte(` +retainKeysMergingList: +- name: bar +- name: foo + value: a + other: x +`), + Modified: []byte(` +retainKeysMergingList: +- name: bar +- name: foo +`), + TwoWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + name: foo + value: null +`), + ThreeWay: []byte(` +$setElementOrder/retainKeysMergingList: + - name: bar + - name: foo +retainKeysMergingList: +- $retainKeys: + - name + name: foo + value: null +`), + Result: []byte(` +retainKeysMergingList: +- name: bar +- name: foo +`), + }, + }, + { + Description: "delete and reorder in one list, reorder in another", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +mergingList: +- name: a + value: a +- name: b + value: b +mergeItemPtr: +- name: c + value: c +- name: d + value: d +`), + Current: []byte(` +mergingList: +- name: a + value: a +- name: b + value: b +mergeItemPtr: +- name: c + value: c +- name: d + value: d +`), + Modified: []byte(` +mergingList: +- name: b + value: b +mergeItemPtr: +- name: d + value: d +- name: c + value: c +`), + TwoWay: []byte(` +$setElementOrder/mergingList: +- name: b +$setElementOrder/mergeItemPtr: +- name: d +- name: c +mergingList: +- $patch: delete + name: a +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: +- name: b +$setElementOrder/mergeItemPtr: +- name: d +- name: c +mergingList: +- $patch: delete + name: a +`), + Result: []byte(` +mergingList: +- name: b + value: b +mergeItemPtr: +- name: d + value: d +- name: c + value: c +`), + }, + }, +} + +func TestStrategicMergePatch(t *testing.T) { + testStrategicMergePatchWithCustomArgumentsUsingStruct(t, "bad struct", + "{}", "{}", []byte(""), mergepatch.ErrBadArgKind(struct{}{}, []byte{})) + + mergeItemOpenapiSchema := PatchMetaFromOpenAPI{ + Schema: sptest.GetSchemaOrDie(fakeMergeItemSchema, "mergeItem"), + } + schemas := []LookupPatchMeta{ + mergeItemStructSchema, + mergeItemOpenapiSchema, + } + + tc := StrategicMergePatchTestCases{} + err := yaml.Unmarshal(createStrategicMergePatchTestCaseData, &tc) + if err != nil { + t.Errorf("can't unmarshal test cases: %s\n", err) + return + } + + for _, schema := range schemas { + testStrategicMergePatchWithCustomArguments(t, "bad original", + "", "{}", schema, mergepatch.ErrBadJSONDoc) + testStrategicMergePatchWithCustomArguments(t, "bad patch", + "{}", "", schema, mergepatch.ErrBadJSONDoc) + testStrategicMergePatchWithCustomArguments(t, "nil struct", + "{}", "{}", nil, mergepatch.ErrBadArgKind(struct{}{}, nil)) + + for _, c := range tc.TestCases { + testTwoWayPatch(t, c, schema) + testThreeWayPatch(t, c, schema) + } + + // run multiple times to exercise different map traversal orders + for i := 0; i < 10; i++ { + for _, c := range strategicMergePatchRawTestCases { + testTwoWayPatchForRawTestCase(t, c, schema) + testThreeWayPatchForRawTestCase(t, c, schema) + } + } + } +} + +func testStrategicMergePatchWithCustomArgumentsUsingStruct(t *testing.T, description, original, patch string, dataStruct interface{}, expected error) { + schema, actual := NewPatchMetaFromStruct(dataStruct) + // If actual is not nil, check error. If errors match, return. + if actual != nil { + checkErrorsEqual(t, description, expected, actual, schema) + return + } + testStrategicMergePatchWithCustomArguments(t, description, original, patch, schema, expected) +} + +func testStrategicMergePatchWithCustomArguments(t *testing.T, description, original, patch string, schema LookupPatchMeta, expected error) { + _, actual := StrategicMergePatch([]byte(original), []byte(patch), schema) + checkErrorsEqual(t, description, expected, actual, schema) +} + +func checkErrorsEqual(t *testing.T, description string, expected, actual error, schema LookupPatchMeta) { + if actual != expected { + if actual == nil { + t.Errorf("using %s expected error: %s\ndid not occur in test case: %s", getSchemaType(schema), expected, description) + return + } + + if expected == nil || actual.Error() != expected.Error() { + t.Errorf("using %s unexpected error: %s\noccurred in test case: %s", getSchemaType(schema), actual, description) + return + } + } +} + +func testTwoWayPatch(t *testing.T, c StrategicMergePatchTestCase, schema LookupPatchMeta) { + original, expectedPatch, modified, expectedResult := twoWayTestCaseToJSONOrFail(t, c, schema) + + actualPatch, err := CreateTwoWayMergePatchUsingLookupPatchMeta(original, modified, schema) + if err != nil { + t.Errorf("using %s error: %s\nin test case: %s\ncannot create two way patch: %s:\n%s\n", + getSchemaType(schema), err, c.Description, original, mergepatch.ToYAMLOrError(c.StrategicMergePatchTestCaseData)) + return + } + + testPatchCreation(t, expectedPatch, actualPatch, c.Description) + testPatchApplication(t, original, actualPatch, expectedResult, c.Description, "", schema) +} + +func testTwoWayPatchForRawTestCase(t *testing.T, c StrategicMergePatchRawTestCase, schema LookupPatchMeta) { + original, expectedPatch, modified, expectedResult := twoWayRawTestCaseToJSONOrFail(t, c) + + actualPatch, err := CreateTwoWayMergePatchUsingLookupPatchMeta(original, modified, schema) + if err != nil { + t.Errorf("error: %s\nin test case: %s\ncannot create two way patch:\noriginal:%s\ntwoWay:%s\nmodified:%s\ncurrent:%s\nthreeWay:%s\nresult:%s\n", + err, c.Description, c.Original, c.TwoWay, c.Modified, c.Current, c.ThreeWay, c.Result) + return + } + + testPatchCreation(t, expectedPatch, actualPatch, c.Description) + testPatchApplication(t, original, actualPatch, expectedResult, c.Description, c.ExpectedError, schema) +} + +func twoWayTestCaseToJSONOrFail(t *testing.T, c StrategicMergePatchTestCase, schema LookupPatchMeta) ([]byte, []byte, []byte, []byte) { + expectedResult := c.TwoWayResult + if expectedResult == nil { + expectedResult = c.Modified + } + return sortJsonOrFail(t, testObjectToJSONOrFail(t, c.Original), c.Description, schema), + sortJsonOrFail(t, testObjectToJSONOrFail(t, c.TwoWay), c.Description, schema), + sortJsonOrFail(t, testObjectToJSONOrFail(t, c.Modified), c.Description, schema), + sortJsonOrFail(t, testObjectToJSONOrFail(t, expectedResult), c.Description, schema) +} + +func twoWayRawTestCaseToJSONOrFail(t *testing.T, c StrategicMergePatchRawTestCase) ([]byte, []byte, []byte, []byte) { + expectedResult := c.TwoWayResult + if expectedResult == nil { + expectedResult = c.Modified + } + return yamlToJSONOrError(t, c.Original), + yamlToJSONOrError(t, c.TwoWay), + yamlToJSONOrError(t, c.Modified), + yamlToJSONOrError(t, expectedResult) +} + +func testThreeWayPatch(t *testing.T, c StrategicMergePatchTestCase, schema LookupPatchMeta) { + original, modified, current, expected, result := threeWayTestCaseToJSONOrFail(t, c, schema) + actual, err := CreateThreeWayMergePatch(original, modified, current, schema, false) + if err != nil { + if !mergepatch.IsConflict(err) { + t.Errorf("using %s error: %s\nin test case: %s\ncannot create three way patch:\n%s\n", + getSchemaType(schema), err, c.Description, mergepatch.ToYAMLOrError(c.StrategicMergePatchTestCaseData)) + return + } + + if !strings.Contains(c.Description, "conflict") { + t.Errorf("using %s unexpected conflict: %s\nin test case: %s\ncannot create three way patch:\n%s\n", + getSchemaType(schema), err, c.Description, mergepatch.ToYAMLOrError(c.StrategicMergePatchTestCaseData)) + return + } + + if len(c.Result) > 0 { + actual, err := CreateThreeWayMergePatch(original, modified, current, schema, true) + if err != nil { + t.Errorf("using %s error: %s\nin test case: %s\ncannot force three way patch application:\n%s\n", + getSchemaType(schema), err, c.Description, mergepatch.ToYAMLOrError(c.StrategicMergePatchTestCaseData)) + return + } + + testPatchCreation(t, expected, actual, c.Description) + testPatchApplication(t, current, actual, result, c.Description, "", schema) + } + + return + } + + if strings.Contains(c.Description, "conflict") || len(c.Result) < 1 { + t.Errorf("using %s error in test case: %s\nexpected conflict did not occur:\n%s\n", + getSchemaType(schema), c.Description, mergepatch.ToYAMLOrError(c.StrategicMergePatchTestCaseData)) + return + } + + testPatchCreation(t, expected, actual, c.Description) + testPatchApplication(t, current, actual, result, c.Description, "", schema) +} + +func testThreeWayPatchForRawTestCase(t *testing.T, c StrategicMergePatchRawTestCase, schema LookupPatchMeta) { + original, modified, current, expected, result := threeWayRawTestCaseToJSONOrFail(t, c) + actual, err := CreateThreeWayMergePatch(original, modified, current, schema, false) + if err != nil { + if !mergepatch.IsConflict(err) { + t.Errorf("using %s error: %s\nin test case: %s\ncannot create three way patch:\noriginal:%s\ntwoWay:%s\nmodified:%s\ncurrent:%s\nthreeWay:%s\nresult:%s\n", + getSchemaType(schema), err, c.Description, c.Original, c.TwoWay, c.Modified, c.Current, c.ThreeWay, c.Result) + return + } + + if !strings.Contains(c.Description, "conflict") { + t.Errorf("using %s unexpected conflict: %s\nin test case: %s\ncannot create three way patch:\noriginal:%s\ntwoWay:%s\nmodified:%s\ncurrent:%s\nthreeWay:%s\nresult:%s\n", + getSchemaType(schema), err, c.Description, c.Original, c.TwoWay, c.Modified, c.Current, c.ThreeWay, c.Result) + return + } + + if len(c.Result) > 0 { + actual, err := CreateThreeWayMergePatch(original, modified, current, schema, true) + if err != nil { + t.Errorf("using %s error: %s\nin test case: %s\ncannot force three way patch application:\noriginal:%s\ntwoWay:%s\nmodified:%s\ncurrent:%s\nthreeWay:%s\nresult:%s\n", + getSchemaType(schema), err, c.Description, c.Original, c.TwoWay, c.Modified, c.Current, c.ThreeWay, c.Result) + return + } + + testPatchCreation(t, expected, actual, c.Description) + testPatchApplication(t, current, actual, result, c.Description, c.ExpectedError, schema) + } + + return + } + + if strings.Contains(c.Description, "conflict") || len(c.Result) < 1 { + t.Errorf("using %s error: %s\nin test case: %s\nexpected conflict did not occur:\noriginal:%s\ntwoWay:%s\nmodified:%s\ncurrent:%s\nthreeWay:%s\nresult:%s\n", + getSchemaType(schema), err, c.Description, c.Original, c.TwoWay, c.Modified, c.Current, c.ThreeWay, c.Result) + return + } + + testPatchCreation(t, expected, actual, c.Description) + testPatchApplication(t, current, actual, result, c.Description, c.ExpectedError, schema) +} + +func threeWayTestCaseToJSONOrFail(t *testing.T, c StrategicMergePatchTestCase, schema LookupPatchMeta) ([]byte, []byte, []byte, []byte, []byte) { + return sortJsonOrFail(t, testObjectToJSONOrFail(t, c.Original), c.Description, schema), + sortJsonOrFail(t, testObjectToJSONOrFail(t, c.Modified), c.Description, schema), + sortJsonOrFail(t, testObjectToJSONOrFail(t, c.Current), c.Description, schema), + sortJsonOrFail(t, testObjectToJSONOrFail(t, c.ThreeWay), c.Description, schema), + sortJsonOrFail(t, testObjectToJSONOrFail(t, c.Result), c.Description, schema) +} + +func threeWayRawTestCaseToJSONOrFail(t *testing.T, c StrategicMergePatchRawTestCase) ([]byte, []byte, []byte, []byte, []byte) { + return yamlToJSONOrError(t, c.Original), + yamlToJSONOrError(t, c.Modified), + yamlToJSONOrError(t, c.Current), + yamlToJSONOrError(t, c.ThreeWay), + yamlToJSONOrError(t, c.Result) +} + +func testPatchCreation(t *testing.T, expected, actual []byte, description string) { + if !reflect.DeepEqual(actual, expected) { + t.Errorf("error in test case: %s\nexpected patch:\n%s\ngot:\n%s\n", + description, jsonToYAMLOrError(expected), jsonToYAMLOrError(actual)) + return + } +} + +func testPatchApplication(t *testing.T, original, patch, expected []byte, description, expectedError string, schema LookupPatchMeta) { + result, err := StrategicMergePatchUsingLookupPatchMeta(original, patch, schema) + if len(expectedError) != 0 { + if err != nil && strings.Contains(err.Error(), expectedError) { + return + } + t.Errorf("using %s expected error should contain:\n%s\nin test case: %s\nbut got:\n%s\n", getSchemaType(schema), expectedError, description, err) + } + if err != nil { + t.Errorf("using %s error: %s\nin test case: %s\ncannot apply patch:\n%s\nto original:\n%s\n", + getSchemaType(schema), err, description, jsonToYAMLOrError(patch), jsonToYAMLOrError(original)) + return + } + + if !reflect.DeepEqual(result, expected) { + format := "using error in test case: %s\npatch application failed:\noriginal:\n%s\npatch:\n%s\nexpected:\n%s\ngot:\n%s\n" + t.Errorf(format, description, + jsonToYAMLOrError(original), jsonToYAMLOrError(patch), + jsonToYAMLOrError(expected), jsonToYAMLOrError(result)) + return + } +} + +func testObjectToJSONOrFail(t *testing.T, o map[string]interface{}) []byte { + if o == nil { + return nil + } + + j, err := toJSON(o) + if err != nil { + t.Error(err) + } + return j +} + +func sortJsonOrFail(t *testing.T, j []byte, description string, schema LookupPatchMeta) []byte { + if j == nil { + return nil + } + r, err := sortMergeListsByName(j, schema) + if err != nil { + t.Errorf("using %s error: %s\n in test case: %s\ncannot sort object:\n%s\n", getSchemaType(schema), err, description, j) + return nil + } + + return r +} + +func getSchemaType(schema LookupPatchMeta) string { + return reflect.TypeOf(schema).String() +} + +func jsonToYAMLOrError(j []byte) string { + y, err := jsonToYAML(j) + if err != nil { + return err.Error() + } + + return string(y) +} + +func toJSON(v interface{}) ([]byte, error) { + j, err := json.Marshal(v) + if err != nil { + return nil, fmt.Errorf("json marshal failed: %v\n%v\n", err, spew.Sdump(v)) + } + + return j, nil +} + +func jsonToYAML(j []byte) ([]byte, error) { + y, err := yaml.JSONToYAML(j) + if err != nil { + return nil, fmt.Errorf("json to yaml failed: %v\n%v\n", err, j) + } + + return y, nil +} + +func yamlToJSON(y []byte) ([]byte, error) { + j, err := yaml.YAMLToJSON(y) + if err != nil { + return nil, fmt.Errorf("yaml to json failed: %v\n%v\n", err, y) + } + + return j, nil +} + +func yamlToJSONOrError(t *testing.T, y []byte) []byte { + j, err := yamlToJSON(y) + if err != nil { + t.Errorf("%v", err) + } + + return j +} + +type PrecisionItem struct { + Name string `json:"name,omitempty"` + Int32 int32 `json:"int32,omitempty"` + Int64 int64 `json:"int64,omitempty"` + Float32 float32 `json:"float32,omitempty"` + Float64 float64 `json:"float64,omitempty"` +} + +var ( + precisionItem PrecisionItem + precisionItemStructSchema = PatchMetaFromStruct{T: GetTagStructTypeOrDie(precisionItem)} +) + +func TestNumberConversion(t *testing.T) { + testcases := map[string]struct { + Old string + New string + ExpectedPatch string + ExpectedResult string + }{ + "empty": { + Old: `{}`, + New: `{}`, + ExpectedPatch: `{}`, + ExpectedResult: `{}`, + }, + "int32 medium": { + Old: `{"int32":1000000}`, + New: `{"int32":1000000,"name":"newname"}`, + ExpectedPatch: `{"name":"newname"}`, + ExpectedResult: `{"int32":1000000,"name":"newname"}`, + }, + "int32 max": { + Old: `{"int32":2147483647}`, + New: `{"int32":2147483647,"name":"newname"}`, + ExpectedPatch: `{"name":"newname"}`, + ExpectedResult: `{"int32":2147483647,"name":"newname"}`, + }, + "int64 medium": { + Old: `{"int64":1000000}`, + New: `{"int64":1000000,"name":"newname"}`, + ExpectedPatch: `{"name":"newname"}`, + ExpectedResult: `{"int64":1000000,"name":"newname"}`, + }, + "int64 max": { + Old: `{"int64":9223372036854775807}`, + New: `{"int64":9223372036854775807,"name":"newname"}`, + ExpectedPatch: `{"name":"newname"}`, + ExpectedResult: `{"int64":9223372036854775807,"name":"newname"}`, + }, + "float32 max": { + Old: `{"float32":3.4028234663852886e+38}`, + New: `{"float32":3.4028234663852886e+38,"name":"newname"}`, + ExpectedPatch: `{"name":"newname"}`, + ExpectedResult: `{"float32":3.4028234663852886e+38,"name":"newname"}`, + }, + "float64 max": { + Old: `{"float64":1.7976931348623157e+308}`, + New: `{"float64":1.7976931348623157e+308,"name":"newname"}`, + ExpectedPatch: `{"name":"newname"}`, + ExpectedResult: `{"float64":1.7976931348623157e+308,"name":"newname"}`, + }, + } + + precisionItemOpenapiSchema := PatchMetaFromOpenAPI{ + Schema: sptest.GetSchemaOrDie(fakePrecisionItemSchema, "precisionItem"), + } + precisionItemSchemas := []LookupPatchMeta{ + precisionItemStructSchema, + precisionItemOpenapiSchema, + } + + for _, schema := range precisionItemSchemas { + for k, tc := range testcases { + patch, err := CreateTwoWayMergePatchUsingLookupPatchMeta([]byte(tc.Old), []byte(tc.New), schema) + if err != nil { + t.Errorf("using %s in testcase %s: unexpected error %v", getSchemaType(schema), k, err) + continue + } + if tc.ExpectedPatch != string(patch) { + t.Errorf("using %s in testcase %s: expected %s, got %s", getSchemaType(schema), k, tc.ExpectedPatch, string(patch)) + continue + } + + result, err := StrategicMergePatchUsingLookupPatchMeta([]byte(tc.Old), patch, schema) + if err != nil { + t.Errorf("using %s in testcase %s: unexpected error %v", getSchemaType(schema), k, err) + continue + } + if tc.ExpectedResult != string(result) { + t.Errorf("using %s in testcase %s: expected %s, got %s", getSchemaType(schema), k, tc.ExpectedResult, string(result)) + continue + } + } + } +} + +var replaceRawExtensionPatchTestCases = []StrategicMergePatchRawTestCase{ + { + Description: "replace RawExtension field, rest unchanched", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +name: my-object +value: some-value +other: current-other +replacingItem: + Some: Generic + Yaml: Inside + The: RawExtension + Field: Period +`), + Current: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 2 + - name: 3 +replacingItem: + Some: Generic + Yaml: Inside + The: RawExtension + Field: Period +`), + Modified: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 2 + - name: 3 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + TwoWay: []byte(` +mergingList: + - name: 1 + - name: 2 + - name: 3 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + TwoWayResult: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 2 + - name: 3 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + ThreeWay: []byte(` +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + Result: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 2 + - name: 3 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + }, + }, + { + Description: "replace RawExtension field and merge list", + StrategicMergePatchRawTestCaseData: StrategicMergePatchRawTestCaseData{ + Original: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 +replacingItem: + Some: Generic + Yaml: Inside + The: RawExtension + Field: Period +`), + Current: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 3 +replacingItem: + Some: Generic + Yaml: Inside + The: RawExtension + Field: Period +`), + Modified: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 2 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + TwoWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 2 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + TwoWayResult: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 2 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + ThreeWay: []byte(` +$setElementOrder/mergingList: + - name: 1 + - name: 2 +mergingList: + - name: 2 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + Result: []byte(` +name: my-object +value: some-value +other: current-other +mergingList: + - name: 1 + - name: 2 + - name: 3 +replacingItem: + Newly: Modified + Yaml: Inside + The: RawExtension +`), + }, + }, +} + +func TestReplaceWithRawExtension(t *testing.T) { + mergeItemOpenapiSchema := PatchMetaFromOpenAPI{ + Schema: sptest.GetSchemaOrDie(fakeMergeItemSchema, "mergeItem"), + } + schemas := []LookupPatchMeta{ + mergeItemStructSchema, + mergeItemOpenapiSchema, + } + + for _, schema := range schemas { + for _, c := range replaceRawExtensionPatchTestCases { + testTwoWayPatchForRawTestCase(t, c, schema) + testThreeWayPatchForRawTestCase(t, c, schema) + } + } +} + +func TestUnknownField(t *testing.T) { + testcases := map[string]struct { + Original string + Current string + Modified string + + ExpectedTwoWay string + ExpectedTwoWayErr string + ExpectedTwoWayResult string + ExpectedThreeWay string + ExpectedThreeWayErr string + ExpectedThreeWayResult string + }{ + // cases we can successfully strategically merge + "no diff": { + Original: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + Current: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + Modified: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + + ExpectedTwoWay: `{}`, + ExpectedTwoWayResult: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + ExpectedThreeWay: `{}`, + ExpectedThreeWayResult: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + }, + "added only": { + Original: `{"name":"foo"}`, + Current: `{"name":"foo"}`, + Modified: `{"name":"foo","scalar":true,"complex":{"nested":true},"array":[1,2,3]}`, + + ExpectedTwoWay: `{"array":[1,2,3],"complex":{"nested":true},"scalar":true}`, + ExpectedTwoWayResult: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + ExpectedThreeWay: `{"array":[1,2,3],"complex":{"nested":true},"scalar":true}`, + ExpectedThreeWayResult: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + }, + "removed only": { + Original: `{"name":"foo","scalar":true,"complex":{"nested":true}}`, + Current: `{"name":"foo","scalar":true,"complex":{"nested":true},"array":[1,2,3]}`, + Modified: `{"name":"foo"}`, + + ExpectedTwoWay: `{"complex":null,"scalar":null}`, + ExpectedTwoWayResult: `{"name":"foo"}`, + ExpectedThreeWay: `{"complex":null,"scalar":null}`, + ExpectedThreeWayResult: `{"array":[1,2,3],"name":"foo"}`, + }, + + // cases we cannot successfully strategically merge (expect errors) + "diff": { + Original: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + Current: `{"array":[1,2,3],"complex":{"nested":true},"name":"foo","scalar":true}`, + Modified: `{"array":[1,2,3],"complex":{"nested":false},"name":"foo","scalar":true}`, + + ExpectedTwoWayErr: `unable to find api field`, + ExpectedThreeWayErr: `unable to find api field`, + }, + } + + mergeItemOpenapiSchema := PatchMetaFromOpenAPI{ + Schema: sptest.GetSchemaOrDie(fakeMergeItemSchema, "mergeItem"), + } + schemas := []LookupPatchMeta{ + mergeItemStructSchema, + mergeItemOpenapiSchema, + } + + for _, k := range sets.StringKeySet(testcases).List() { + tc := testcases[k] + for _, schema := range schemas { + func() { + twoWay, err := CreateTwoWayMergePatchUsingLookupPatchMeta([]byte(tc.Original), []byte(tc.Modified), schema) + if err != nil { + if len(tc.ExpectedTwoWayErr) == 0 { + t.Errorf("using %s in testcase %s: error making two-way patch: %v", getSchemaType(schema), k, err) + } + if !strings.Contains(err.Error(), tc.ExpectedTwoWayErr) { + t.Errorf("using %s in testcase %s: expected error making two-way patch to contain '%s', got %s", getSchemaType(schema), k, tc.ExpectedTwoWayErr, err) + } + return + } + + if string(twoWay) != tc.ExpectedTwoWay { + t.Errorf("using %s in testcase %s: expected two-way patch:\n\t%s\ngot\n\t%s", getSchemaType(schema), k, string(tc.ExpectedTwoWay), string(twoWay)) + return + } + + twoWayResult, err := StrategicMergePatchUsingLookupPatchMeta([]byte(tc.Original), twoWay, schema) + if err != nil { + t.Errorf("using %s in testcase %s: error applying two-way patch: %v", getSchemaType(schema), k, err) + return + } + if string(twoWayResult) != tc.ExpectedTwoWayResult { + t.Errorf("using %s in testcase %s: expected two-way result:\n\t%s\ngot\n\t%s", getSchemaType(schema), k, string(tc.ExpectedTwoWayResult), string(twoWayResult)) + return + } + }() + + func() { + threeWay, err := CreateThreeWayMergePatch([]byte(tc.Original), []byte(tc.Modified), []byte(tc.Current), schema, false) + if err != nil { + if len(tc.ExpectedThreeWayErr) == 0 { + t.Errorf("using %s in testcase %s: error making three-way patch: %v", getSchemaType(schema), k, err) + } else if !strings.Contains(err.Error(), tc.ExpectedThreeWayErr) { + t.Errorf("using %s in testcase %s: expected error making three-way patch to contain '%s', got %s", getSchemaType(schema), k, tc.ExpectedThreeWayErr, err) + } + return + } + + if string(threeWay) != tc.ExpectedThreeWay { + t.Errorf("using %s in testcase %s: expected three-way patch:\n\t%s\ngot\n\t%s", getSchemaType(schema), k, string(tc.ExpectedThreeWay), string(threeWay)) + return + } + + threeWayResult, err := StrategicMergePatch([]byte(tc.Current), threeWay, schema) + if err != nil { + t.Errorf("using %s in testcase %s: error applying three-way patch: %v", getSchemaType(schema), k, err) + return + } else if string(threeWayResult) != tc.ExpectedThreeWayResult { + t.Errorf("using %s in testcase %s: expected three-way result:\n\t%s\ngot\n\t%s", getSchemaType(schema), k, string(tc.ExpectedThreeWayResult), string(threeWayResult)) + return + } + }() + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD index db599cbb..a28ee93e 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD @@ -10,14 +10,15 @@ go_test( name = "go_default_test", srcs = ["validation_test.go"], embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], ) go_library( name = "go_default_library", srcs = ["validation.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/validation", importpath = "k8s.io/apimachinery/pkg/util/validation", - deps = ["//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD b/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD index fc59dd81..ee8d60c0 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD @@ -21,10 +21,11 @@ go_library( "errors.go", "path.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/validation/field", importpath = "k8s.io/apimachinery/pkg/util/validation/field", deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go index 31705dee..4767fd1d 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go @@ -48,7 +48,7 @@ func (v *Error) ErrorBody() string { var s string switch v.Type { case ErrorTypeRequired, ErrorTypeForbidden, ErrorTypeTooLong, ErrorTypeInternal: - s = fmt.Sprintf("%s", v.Type) + s = v.Type.String() default: value := v.BadValue valueType := reflect.TypeOf(value) diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors_test.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors_test.go new file mode 100644 index 00000000..fe747319 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/field/errors_test.go @@ -0,0 +1,175 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 field + +import ( + "fmt" + "strings" + "testing" +) + +func TestMakeFuncs(t *testing.T) { + testCases := []struct { + fn func() *Error + expected ErrorType + }{ + { + func() *Error { return Invalid(NewPath("f"), "v", "d") }, + ErrorTypeInvalid, + }, + { + func() *Error { return NotSupported(NewPath("f"), "v", nil) }, + ErrorTypeNotSupported, + }, + { + func() *Error { return Duplicate(NewPath("f"), "v") }, + ErrorTypeDuplicate, + }, + { + func() *Error { return NotFound(NewPath("f"), "v") }, + ErrorTypeNotFound, + }, + { + func() *Error { return Required(NewPath("f"), "d") }, + ErrorTypeRequired, + }, + { + func() *Error { return InternalError(NewPath("f"), fmt.Errorf("e")) }, + ErrorTypeInternal, + }, + } + + for _, testCase := range testCases { + err := testCase.fn() + if err.Type != testCase.expected { + t.Errorf("expected Type %q, got %q", testCase.expected, err.Type) + } + } +} + +func TestErrorUsefulMessage(t *testing.T) { + { + s := Invalid(nil, nil, "").Error() + t.Logf("message: %v", s) + if !strings.Contains(s, "null") { + t.Errorf("error message did not contain 'null': %s", s) + } + } + + s := Invalid(NewPath("foo"), "bar", "deet").Error() + t.Logf("message: %v", s) + for _, part := range []string{"foo", "bar", "deet", ErrorTypeInvalid.String()} { + if !strings.Contains(s, part) { + t.Errorf("error message did not contain expected part '%v'", part) + } + } + + type complicated struct { + Baz int + Qux string + Inner interface{} + KV map[string]int + } + s = Invalid( + NewPath("foo"), + &complicated{ + Baz: 1, + Qux: "aoeu", + Inner: &complicated{Qux: "asdf"}, + KV: map[string]int{"Billy": 2}, + }, + "detail", + ).Error() + t.Logf("message: %v", s) + for _, part := range []string{ + "foo", ErrorTypeInvalid.String(), + "Baz", "Qux", "Inner", "KV", "detail", + "1", "aoeu", "Billy", "2", + // "asdf", TODO: re-enable once we have a better nested printer + } { + if !strings.Contains(s, part) { + t.Errorf("error message did not contain expected part '%v'", part) + } + } +} + +func TestToAggregate(t *testing.T) { + testCases := struct { + ErrList []ErrorList + NumExpectedErrs []int + }{ + []ErrorList{ + nil, + {}, + {Invalid(NewPath("f"), "v", "d")}, + {Invalid(NewPath("f"), "v", "d"), Invalid(NewPath("f"), "v", "d")}, + {Invalid(NewPath("f"), "v", "d"), InternalError(NewPath(""), fmt.Errorf("e"))}, + }, + []int{ + 0, + 0, + 1, + 1, + 2, + }, + } + + if len(testCases.ErrList) != len(testCases.NumExpectedErrs) { + t.Errorf("Mismatch: length of NumExpectedErrs does not match length of ErrList") + } + for i, tc := range testCases.ErrList { + agg := tc.ToAggregate() + numErrs := 0 + + if agg != nil { + numErrs = len(agg.Errors()) + } + if numErrs != testCases.NumExpectedErrs[i] { + t.Errorf("[%d] Expected %d, got %d", i, testCases.NumExpectedErrs[i], numErrs) + } + + if len(tc) == 0 { + if agg != nil { + t.Errorf("[%d] Expected nil, got %#v", i, agg) + } + } else if agg == nil { + t.Errorf("[%d] Expected non-nil", i) + } + } +} + +func TestErrListFilter(t *testing.T) { + list := ErrorList{ + Invalid(NewPath("test.field"), "", ""), + Invalid(NewPath("field.test"), "", ""), + Duplicate(NewPath("test"), "value"), + } + if len(list.Filter(NewErrorTypeMatcher(ErrorTypeDuplicate))) != 2 { + t.Errorf("should not filter") + } + if len(list.Filter(NewErrorTypeMatcher(ErrorTypeInvalid))) != 1 { + t.Errorf("should filter") + } +} + +func TestNotSupported(t *testing.T) { + notSupported := NotSupported(NewPath("f"), "v", []string{"a", "b", "c"}) + expected := `Unsupported value: "v": supported values: "a", "b", "c"` + if notSupported.ErrorBody() != expected { + t.Errorf("Expected: %s\n, but got: %s\n", expected, notSupported.ErrorBody()) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/path_test.go b/vendor/k8s.io/apimachinery/pkg/util/validation/field/path_test.go new file mode 100644 index 00000000..d2f568c3 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/field/path_test.go @@ -0,0 +1,123 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 field + +import "testing" + +func TestPath(t *testing.T) { + testCases := []struct { + op func(*Path) *Path + expected string + }{ + { + func(p *Path) *Path { return p }, + "root", + }, + { + func(p *Path) *Path { return p.Child("first") }, + "root.first", + }, + { + func(p *Path) *Path { return p.Child("second") }, + "root.first.second", + }, + { + func(p *Path) *Path { return p.Index(0) }, + "root.first.second[0]", + }, + { + func(p *Path) *Path { return p.Child("third") }, + "root.first.second[0].third", + }, + { + func(p *Path) *Path { return p.Index(93) }, + "root.first.second[0].third[93]", + }, + { + func(p *Path) *Path { return p.parent }, + "root.first.second[0].third", + }, + { + func(p *Path) *Path { return p.parent }, + "root.first.second[0]", + }, + { + func(p *Path) *Path { return p.Key("key") }, + "root.first.second[0][key]", + }, + } + + root := NewPath("root") + p := root + for i, tc := range testCases { + p = tc.op(p) + if p.String() != tc.expected { + t.Errorf("[%d] Expected %q, got %q", i, tc.expected, p.String()) + } + if p.Root() != root { + t.Errorf("[%d] Wrong root: %#v", i, p.Root()) + } + } +} + +func TestPathMultiArg(t *testing.T) { + testCases := []struct { + op func(*Path) *Path + expected string + }{ + { + func(p *Path) *Path { return p }, + "root.first", + }, + { + func(p *Path) *Path { return p.Child("second", "third") }, + "root.first.second.third", + }, + { + func(p *Path) *Path { return p.Index(0) }, + "root.first.second.third[0]", + }, + { + func(p *Path) *Path { return p.parent }, + "root.first.second.third", + }, + { + func(p *Path) *Path { return p.parent }, + "root.first.second", + }, + { + func(p *Path) *Path { return p.parent }, + "root.first", + }, + { + func(p *Path) *Path { return p.parent }, + "root", + }, + } + + root := NewPath("root", "first") + p := root + for i, tc := range testCases { + p = tc.op(p) + if p.String() != tc.expected { + t.Errorf("[%d] Expected %q, got %q", i, tc.expected, p.String()) + } + if p.Root() != root.Root() { + t.Errorf("[%d] Wrong root: %#v", i, p.Root()) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go b/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go index 7da6a17d..e0d17154 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/validation.go @@ -21,6 +21,7 @@ import ( "math" "net" "regexp" + "strconv" "strings" "k8s.io/apimachinery/pkg/util/validation/field" @@ -389,3 +390,18 @@ func hasChDirPrefix(value string) []string { } return errs } + +// IsSocketAddr checks that a string conforms is a valid socket address +// as defined in RFC 789. (e.g 0.0.0.0:10254 or [::]:10254)) +func IsValidSocketAddr(value string) []string { + var errs []string + ip, port, err := net.SplitHostPort(value) + if err != nil { + return append(errs, "must be a valid socket address format, (e.g. 0.0.0.0:10254 or [::]:10254)") + return errs + } + portInt, _ := strconv.Atoi(port) + errs = append(errs, IsValidPortNum(portInt)...) + errs = append(errs, IsValidIP(ip)...) + return errs +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/validation_test.go b/vendor/k8s.io/apimachinery/pkg/util/validation/validation_test.go new file mode 100644 index 00000000..b3892e1c --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/validation/validation_test.go @@ -0,0 +1,541 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 validation + +import ( + "strings" + "testing" + + "k8s.io/apimachinery/pkg/util/validation/field" +) + +func TestIsDNS1123Label(t *testing.T) { + goodValues := []string{ + "a", "ab", "abc", "a1", "a-1", "a--1--2--b", + "0", "01", "012", "1a", "1-a", "1--a--b--2", + strings.Repeat("a", 63), + } + for _, val := range goodValues { + if msgs := IsDNS1123Label(val); len(msgs) != 0 { + t.Errorf("expected true for '%s': %v", val, msgs) + } + } + + badValues := []string{ + "", "A", "ABC", "aBc", "A1", "A-1", "1-A", + "-", "a-", "-a", "1-", "-1", + "_", "a_", "_a", "a_b", "1_", "_1", "1_2", + ".", "a.", ".a", "a.b", "1.", ".1", "1.2", + " ", "a ", " a", "a b", "1 ", " 1", "1 2", + strings.Repeat("a", 64), + } + for _, val := range badValues { + if msgs := IsDNS1123Label(val); len(msgs) == 0 { + t.Errorf("expected false for '%s'", val) + } + } +} + +func TestIsDNS1123Subdomain(t *testing.T) { + goodValues := []string{ + "a", "ab", "abc", "a1", "a-1", "a--1--2--b", + "0", "01", "012", "1a", "1-a", "1--a--b--2", + "a.a", "ab.a", "abc.a", "a1.a", "a-1.a", "a--1--2--b.a", + "a.1", "ab.1", "abc.1", "a1.1", "a-1.1", "a--1--2--b.1", + "0.a", "01.a", "012.a", "1a.a", "1-a.a", "1--a--b--2", + "0.1", "01.1", "012.1", "1a.1", "1-a.1", "1--a--b--2.1", + "a.b.c.d.e", "aa.bb.cc.dd.ee", "1.2.3.4.5", "11.22.33.44.55", + strings.Repeat("a", 253), + } + for _, val := range goodValues { + if msgs := IsDNS1123Subdomain(val); len(msgs) != 0 { + t.Errorf("expected true for '%s': %v", val, msgs) + } + } + + badValues := []string{ + "", "A", "ABC", "aBc", "A1", "A-1", "1-A", + "-", "a-", "-a", "1-", "-1", + "_", "a_", "_a", "a_b", "1_", "_1", "1_2", + ".", "a.", ".a", "a..b", "1.", ".1", "1..2", + " ", "a ", " a", "a b", "1 ", " 1", "1 2", + "A.a", "aB.a", "ab.A", "A1.a", "a1.A", + "A.1", "aB.1", "A1.1", "1A.1", + "0.A", "01.A", "012.A", "1A.a", "1a.A", + "A.B.C.D.E", "AA.BB.CC.DD.EE", "a.B.c.d.e", "aa.bB.cc.dd.ee", + "a@b", "a,b", "a_b", "a;b", + "a:b", "a%b", "a?b", "a$b", + strings.Repeat("a", 254), + } + for _, val := range badValues { + if msgs := IsDNS1123Subdomain(val); len(msgs) == 0 { + t.Errorf("expected false for '%s'", val) + } + } +} + +func TestIsDNS1035Label(t *testing.T) { + goodValues := []string{ + "a", "ab", "abc", "a1", "a-1", "a--1--2--b", + strings.Repeat("a", 63), + } + for _, val := range goodValues { + if msgs := IsDNS1035Label(val); len(msgs) != 0 { + t.Errorf("expected true for '%s': %v", val, msgs) + } + } + + badValues := []string{ + "0", "01", "012", "1a", "1-a", "1--a--b--2", + "", "A", "ABC", "aBc", "A1", "A-1", "1-A", + "-", "a-", "-a", "1-", "-1", + "_", "a_", "_a", "a_b", "1_", "_1", "1_2", + ".", "a.", ".a", "a.b", "1.", ".1", "1.2", + " ", "a ", " a", "a b", "1 ", " 1", "1 2", + strings.Repeat("a", 64), + } + for _, val := range badValues { + if msgs := IsDNS1035Label(val); len(msgs) == 0 { + t.Errorf("expected false for '%s'", val) + } + } +} + +func TestIsCIdentifier(t *testing.T) { + goodValues := []string{ + "a", "ab", "abc", "a1", "_a", "a_", "a_b", "a_1", "a__1__2__b", "__abc_123", + "A", "AB", "AbC", "A1", "_A", "A_", "A_B", "A_1", "A__1__2__B", "__123_ABC", + } + for _, val := range goodValues { + if msgs := IsCIdentifier(val); len(msgs) != 0 { + t.Errorf("expected true for '%s': %v", val, msgs) + } + } + + badValues := []string{ + "", "1", "123", "1a", + "-", "a-", "-a", "1-", "-1", "1_", "1_2", + ".", "a.", ".a", "a.b", "1.", ".1", "1.2", + " ", "a ", " a", "a b", "1 ", " 1", "1 2", + "#a#", + } + for _, val := range badValues { + if msgs := IsCIdentifier(val); len(msgs) == 0 { + t.Errorf("expected false for '%s'", val) + } + } +} + +func TestIsValidPortNum(t *testing.T) { + goodValues := []int{1, 2, 1000, 16384, 32768, 65535} + for _, val := range goodValues { + if msgs := IsValidPortNum(val); len(msgs) != 0 { + t.Errorf("expected true for %d, got %v", val, msgs) + } + } + + badValues := []int{0, -1, 65536, 100000} + for _, val := range badValues { + if msgs := IsValidPortNum(val); len(msgs) == 0 { + t.Errorf("expected false for %d", val) + } + } +} + +func TestIsInRange(t *testing.T) { + goodValues := []struct { + value int + min int + max int + }{{1, 0, 10}, {5, 5, 20}, {25, 10, 25}} + for _, val := range goodValues { + if msgs := IsInRange(val.value, val.min, val.max); len(msgs) > 0 { + t.Errorf("expected no errors for %#v, but got %v", val, msgs) + } + } + + badValues := []struct { + value int + min int + max int + }{{1, 2, 10}, {5, -4, 2}, {25, 100, 120}} + for _, val := range badValues { + if msgs := IsInRange(val.value, val.min, val.max); len(msgs) == 0 { + t.Errorf("expected errors for %#v", val) + } + } +} + +func createGroupIDs(ids ...int64) []int64 { + var output []int64 + for _, id := range ids { + output = append(output, int64(id)) + } + return output +} + +func createUserIDs(ids ...int64) []int64 { + var output []int64 + for _, id := range ids { + output = append(output, int64(id)) + } + return output +} + +func TestIsValidGroupID(t *testing.T) { + goodValues := createGroupIDs(0, 1, 1000, 65535, 2147483647) + for _, val := range goodValues { + if msgs := IsValidGroupID(val); len(msgs) != 0 { + t.Errorf("expected true for '%d': %v", val, msgs) + } + } + + badValues := createGroupIDs(-1, -1003, 2147483648, 4147483647) + for _, val := range badValues { + if msgs := IsValidGroupID(val); len(msgs) == 0 { + t.Errorf("expected false for '%d'", val) + } + } +} + +func TestIsValidUserID(t *testing.T) { + goodValues := createUserIDs(0, 1, 1000, 65535, 2147483647) + for _, val := range goodValues { + if msgs := IsValidUserID(val); len(msgs) != 0 { + t.Errorf("expected true for '%d': %v", val, msgs) + } + } + + badValues := createUserIDs(-1, -1003, 2147483648, 4147483647) + for _, val := range badValues { + if msgs := IsValidUserID(val); len(msgs) == 0 { + t.Errorf("expected false for '%d'", val) + } + } +} + +func TestIsValidPortName(t *testing.T) { + goodValues := []string{"telnet", "re-mail-ck", "pop3", "a", "a-1", "1-a", "a-1-b-2-c", "1-a-2-b-3"} + for _, val := range goodValues { + if msgs := IsValidPortName(val); len(msgs) != 0 { + t.Errorf("expected true for %q: %v", val, msgs) + } + } + + badValues := []string{"longerthan15characters", "", strings.Repeat("a", 16), "12345", "1-2-3-4", "-begin", "end-", "two--hyphens", "whois++"} + for _, val := range badValues { + if msgs := IsValidPortName(val); len(msgs) == 0 { + t.Errorf("expected false for %q", val) + } + } +} + +func TestIsQualifiedName(t *testing.T) { + successCases := []string{ + "simple", + "now-with-dashes", + "1-starts-with-num", + "1234", + "simple/simple", + "now-with-dashes/simple", + "now-with-dashes/now-with-dashes", + "now.with.dots/simple", + "now-with.dashes-and.dots/simple", + "1-num.2-num/3-num", + "1234/5678", + "1.2.3.4/5678", + "Uppercase_Is_OK_123", + "example.com/Uppercase_Is_OK_123", + "requests.storage-foo", + strings.Repeat("a", 63), + strings.Repeat("a", 253) + "/" + strings.Repeat("b", 63), + } + for i := range successCases { + if errs := IsQualifiedName(successCases[i]); len(errs) != 0 { + t.Errorf("case[%d]: %q: expected success: %v", i, successCases[i], errs) + } + } + + errorCases := []string{ + "nospecialchars%^=@", + "cantendwithadash-", + "-cantstartwithadash-", + "only/one/slash", + "Example.com/abc", + "example_com/abc", + "example.com/", + "/simple", + strings.Repeat("a", 64), + strings.Repeat("a", 254) + "/abc", + } + for i := range errorCases { + if errs := IsQualifiedName(errorCases[i]); len(errs) == 0 { + t.Errorf("case[%d]: %q: expected failure", i, errorCases[i]) + } + } +} + +func TestIsValidLabelValue(t *testing.T) { + successCases := []string{ + "simple", + "now-with-dashes", + "1-starts-with-num", + "end-with-num-1", + "1234", // only num + strings.Repeat("a", 63), // to the limit + "", // empty value + } + for i := range successCases { + if errs := IsValidLabelValue(successCases[i]); len(errs) != 0 { + t.Errorf("case %s expected success: %v", successCases[i], errs) + } + } + + errorCases := []string{ + "nospecialchars%^=@", + "Tama-nui-te-rā.is.Māori.sun", + "\\backslashes\\are\\bad", + "-starts-with-dash", + "ends-with-dash-", + ".starts.with.dot", + "ends.with.dot.", + strings.Repeat("a", 64), // over the limit + } + for i := range errorCases { + if errs := IsValidLabelValue(errorCases[i]); len(errs) == 0 { + t.Errorf("case[%d] expected failure", i) + } + } +} + +func TestIsValidIP(t *testing.T) { + goodValues := []string{ + "::1", + "2a00:79e0:2:0:f1c3:e797:93c1:df80", + "::", + "2001:4860:4860::8888", + "::fff:1.1.1.1", + "1.1.1.1", + "1.1.1.01", + "255.0.0.1", + "1.0.0.0", + "0.0.0.0", + } + for _, val := range goodValues { + if msgs := IsValidIP(val); len(msgs) != 0 { + t.Errorf("expected true for %q: %v", val, msgs) + } + } + + badValues := []string{ + "[2001:db8:0:1]:80", + "myhost.mydomain", + "-1.0.0.0", + "[2001:db8:0:1]", + "a", + } + for _, val := range badValues { + if msgs := IsValidIP(val); len(msgs) == 0 { + t.Errorf("expected false for %q", val) + } + } +} + +func TestIsHTTPHeaderName(t *testing.T) { + goodValues := []string{ + // Common ones + "Accept-Encoding", "Host", "If-Modified-Since", "X-Forwarded-For", + // Weirdo, but still conforming names + "a", "ab", "abc", "a1", "-a", "a-", "a-b", "a-1", "a--1--2--b", "--abc-123", + "A", "AB", "AbC", "A1", "-A", "A-", "A-B", "A-1", "A--1--2--B", "--123-ABC", + } + for _, val := range goodValues { + if msgs := IsHTTPHeaderName(val); len(msgs) != 0 { + t.Errorf("expected true for '%s': %v", val, msgs) + } + } + + badValues := []string{ + "Host:", "X-Forwarded-For:", "X-@Home", + "", "_", "a_", "_a", "1_", "1_2", ".", "a.", ".a", "a.b", "1.", ".1", "1.2", + " ", "a ", " a", "a b", "1 ", " 1", "1 2", "#a#", "^", ",", ";", "=", "<", + "?", "@", "{", + } + for _, val := range badValues { + if msgs := IsHTTPHeaderName(val); len(msgs) == 0 { + t.Errorf("expected false for '%s'", val) + } + } +} + +func TestIsValidPercent(t *testing.T) { + goodValues := []string{ + "0%", + "00000%", + "1%", + "01%", + "99%", + "100%", + "101%", + } + for _, val := range goodValues { + if msgs := IsValidPercent(val); len(msgs) != 0 { + t.Errorf("expected true for %q: %v", val, msgs) + } + } + + badValues := []string{ + "", + "0", + "100", + "0.0%", + "99.9%", + "hundred", + " 1%", + "1% ", + "-0%", + "-1%", + "+1%", + } + for _, val := range badValues { + if msgs := IsValidPercent(val); len(msgs) == 0 { + t.Errorf("expected false for %q", val) + } + } +} + +func TestIsConfigMapKey(t *testing.T) { + successCases := []string{ + "a", + "good", + "good-good", + "still.good", + "this.is.also.good", + ".so.is.this", + "THIS_IS_GOOD", + "so_is_this_17", + } + + for i := range successCases { + if errs := IsConfigMapKey(successCases[i]); len(errs) != 0 { + t.Errorf("[%d] expected success: %v", i, errs) + } + } + + failureCases := []string{ + ".", + "..", + "..bad", + "b*d", + "bad!&bad", + } + + for i := range failureCases { + if errs := IsConfigMapKey(failureCases[i]); len(errs) == 0 { + t.Errorf("[%d] expected failure", i) + } + } +} + +func TestIsWildcardDNS1123Subdomain(t *testing.T) { + goodValues := []string{ + "*.example.com", + "*.bar.com", + "*.foo.bar.com", + } + for _, val := range goodValues { + if errs := IsWildcardDNS1123Subdomain(val); len(errs) != 0 { + t.Errorf("expected no errors for %q: %v", val, errs) + } + } + + badValues := []string{ + "*.*.bar.com", + "*.foo.*.com", + "*bar.com", + "f*.bar.com", + "*", + } + for _, val := range badValues { + if errs := IsWildcardDNS1123Subdomain(val); len(errs) == 0 { + t.Errorf("expected errors for %q", val) + } + } +} + +func TestIsFullyQualifiedName(t *testing.T) { + tests := []struct { + name string + targetName string + err string + }{ + { + name: "name needs to be fully qualified, i.e., contains at least 2 dots", + targetName: "k8s.io", + err: "should be a domain with at least three segments separated by dots", + }, + { + name: "name cannot be empty", + targetName: "", + err: "Required value", + }, + { + name: "name must conform to RFC 1123", + targetName: "A.B.C", + err: "a DNS-1123 subdomain must consist of lower case alphanumeric characters", + }, + } + for _, tc := range tests { + err := IsFullyQualifiedName(field.NewPath(""), tc.targetName).ToAggregate() + switch { + case tc.err == "" && err != nil: + t.Errorf("%q: unexpected error: %v", tc.name, err) + case tc.err != "" && err == nil: + t.Errorf("%q: unexpected no error, expected %s", tc.name, tc.err) + case tc.err != "" && err != nil && !strings.Contains(err.Error(), tc.err): + t.Errorf("%q: expected %s, got %v", tc.name, tc.err, err) + } + } +} + +func TestIsValidSocketAddr(t *testing.T) { + goodValues := []string{ + "0.0.0.0:10254", + "127.0.0.1:8888", + "[2001:db8:1f70::999:de8:7648:6e8]:10254", + "[::]:10254", + } + for _, val := range goodValues { + if errs := IsValidSocketAddr(val); len(errs) != 0 { + t.Errorf("expected no errors for %q: %v", val, errs) + } + } + + badValues := []string{ + "0.0.0.0.0:2020", + "0.0.0.0", + "6.6.6.6:909090", + "2001:db8:1f70::999:de8:7648:6e8:87567:102545", + "", + "*", + } + for _, val := range badValues { + if errs := IsValidSocketAddr(val); len(errs) == 0 { + t.Errorf("expected errors for %q", val) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD b/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD index c062f381..7f24e924 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD @@ -10,7 +10,7 @@ go_test( name = "go_default_test", srcs = ["wait_test.go"], embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], ) go_library( @@ -19,8 +19,9 @@ go_library( "doc.go", "wait.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait", importpath = "k8s.io/apimachinery/pkg/util/wait", - deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go index a25e9246..ca61168c 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go +++ b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go @@ -230,13 +230,13 @@ func pollInternal(wait WaitFunc, condition ConditionFunc) error { // PollImmediate tries a condition func until it returns true, an error, or the timeout // is reached. // -// Poll always checks 'condition' before waiting for the interval. 'condition' +// PollImmediate always checks 'condition' before waiting for the interval. 'condition' // will always be invoked at least once. // // Some intervals may be missed if the condition takes too long or the time // window is too short. // -// If you want to Poll something forever, see PollInfinite. +// If you want to immediately Poll something forever, see PollImmediateInfinite. func PollImmediate(interval, timeout time.Duration, condition ConditionFunc) error { return pollImmediateInternal(poller(interval, timeout), condition) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/wait_test.go b/vendor/k8s.io/apimachinery/pkg/util/wait/wait_test.go new file mode 100644 index 00000000..2dfd2877 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/wait/wait_test.go @@ -0,0 +1,501 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 wait + +import ( + "errors" + "fmt" + "sync" + "sync/atomic" + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/runtime" +) + +func TestUntil(t *testing.T) { + ch := make(chan struct{}) + close(ch) + Until(func() { + t.Fatal("should not have been invoked") + }, 0, ch) + + ch = make(chan struct{}) + called := make(chan struct{}) + go func() { + Until(func() { + called <- struct{}{} + }, 0, ch) + close(called) + }() + <-called + close(ch) + <-called +} + +func TestNonSlidingUntil(t *testing.T) { + ch := make(chan struct{}) + close(ch) + NonSlidingUntil(func() { + t.Fatal("should not have been invoked") + }, 0, ch) + + ch = make(chan struct{}) + called := make(chan struct{}) + go func() { + NonSlidingUntil(func() { + called <- struct{}{} + }, 0, ch) + close(called) + }() + <-called + close(ch) + <-called +} + +func TestUntilReturnsImmediately(t *testing.T) { + now := time.Now() + ch := make(chan struct{}) + Until(func() { + close(ch) + }, 30*time.Second, ch) + if now.Add(25 * time.Second).Before(time.Now()) { + t.Errorf("Until did not return immediately when the stop chan was closed inside the func") + } +} + +func TestJitterUntil(t *testing.T) { + ch := make(chan struct{}) + // if a channel is closed JitterUntil never calls function f + // and returns immediately + close(ch) + JitterUntil(func() { + t.Fatal("should not have been invoked") + }, 0, 1.0, true, ch) + + ch = make(chan struct{}) + called := make(chan struct{}) + go func() { + JitterUntil(func() { + called <- struct{}{} + }, 0, 1.0, true, ch) + close(called) + }() + <-called + close(ch) + <-called +} + +func TestJitterUntilReturnsImmediately(t *testing.T) { + now := time.Now() + ch := make(chan struct{}) + JitterUntil(func() { + close(ch) + }, 30*time.Second, 1.0, true, ch) + if now.Add(25 * time.Second).Before(time.Now()) { + t.Errorf("JitterUntil did not return immediately when the stop chan was closed inside the func") + } +} + +func TestJitterUntilRecoversPanic(t *testing.T) { + // Save and restore crash handlers + originalReallyCrash := runtime.ReallyCrash + originalHandlers := runtime.PanicHandlers + defer func() { + runtime.ReallyCrash = originalReallyCrash + runtime.PanicHandlers = originalHandlers + }() + + called := 0 + handled := 0 + + // Hook up a custom crash handler to ensure it is called when a jitter function panics + runtime.ReallyCrash = false + runtime.PanicHandlers = []func(interface{}){ + func(p interface{}) { + handled++ + }, + } + + ch := make(chan struct{}) + JitterUntil(func() { + called++ + if called > 2 { + close(ch) + return + } + panic("TestJitterUntilRecoversPanic") + }, time.Millisecond, 1.0, true, ch) + + if called != 3 { + t.Errorf("Expected panic recovers") + } +} + +func TestJitterUntilNegativeFactor(t *testing.T) { + now := time.Now() + ch := make(chan struct{}) + called := make(chan struct{}) + received := make(chan struct{}) + go func() { + JitterUntil(func() { + called <- struct{}{} + <-received + }, time.Second, -30.0, true, ch) + }() + // first loop + <-called + received <- struct{}{} + // second loop + <-called + close(ch) + received <- struct{}{} + + // it should take at most 2 seconds + some overhead, not 3 + if now.Add(3 * time.Second).Before(time.Now()) { + t.Errorf("JitterUntil did not returned after predefined period with negative jitter factor when the stop chan was closed inside the func") + } + +} + +func TestExponentialBackoff(t *testing.T) { + opts := Backoff{Factor: 1.0, Steps: 3} + + // waits up to steps + i := 0 + err := ExponentialBackoff(opts, func() (bool, error) { + i++ + return false, nil + }) + if err != ErrWaitTimeout || i != opts.Steps { + t.Errorf("unexpected error: %v", err) + } + + // returns immediately + i = 0 + err = ExponentialBackoff(opts, func() (bool, error) { + i++ + return true, nil + }) + if err != nil || i != 1 { + t.Errorf("unexpected error: %v", err) + } + + // returns immediately on error + testErr := fmt.Errorf("some other error") + err = ExponentialBackoff(opts, func() (bool, error) { + return false, testErr + }) + if err != testErr { + t.Errorf("unexpected error: %v", err) + } + + // invoked multiple times + i = 1 + err = ExponentialBackoff(opts, func() (bool, error) { + if i < opts.Steps { + i++ + return false, nil + } + return true, nil + }) + if err != nil || i != opts.Steps { + t.Errorf("unexpected error: %v", err) + } +} + +func TestPoller(t *testing.T) { + done := make(chan struct{}) + defer close(done) + w := poller(time.Millisecond, 2*time.Millisecond) + ch := w(done) + count := 0 +DRAIN: + for { + select { + case _, open := <-ch: + if !open { + break DRAIN + } + count++ + case <-time.After(ForeverTestTimeout): + t.Errorf("unexpected timeout after poll") + } + } + if count > 3 { + t.Errorf("expected up to three values, got %d", count) + } +} + +type fakePoller struct { + max int + used int32 // accessed with atomics + wg sync.WaitGroup +} + +func fakeTicker(max int, used *int32, doneFunc func()) WaitFunc { + return func(done <-chan struct{}) <-chan struct{} { + ch := make(chan struct{}) + go func() { + defer doneFunc() + defer close(ch) + for i := 0; i < max; i++ { + select { + case ch <- struct{}{}: + case <-done: + return + } + if used != nil { + atomic.AddInt32(used, 1) + } + } + }() + return ch + } +} + +func (fp *fakePoller) GetWaitFunc() WaitFunc { + fp.wg.Add(1) + return fakeTicker(fp.max, &fp.used, fp.wg.Done) +} + +func TestPoll(t *testing.T) { + invocations := 0 + f := ConditionFunc(func() (bool, error) { + invocations++ + return true, nil + }) + fp := fakePoller{max: 1} + if err := pollInternal(fp.GetWaitFunc(), f); err != nil { + t.Fatalf("unexpected error %v", err) + } + fp.wg.Wait() + if invocations != 1 { + t.Errorf("Expected exactly one invocation, got %d", invocations) + } + used := atomic.LoadInt32(&fp.used) + if used != 1 { + t.Errorf("Expected exactly one tick, got %d", used) + } +} + +func TestPollError(t *testing.T) { + expectedError := errors.New("Expected error") + f := ConditionFunc(func() (bool, error) { + return false, expectedError + }) + fp := fakePoller{max: 1} + if err := pollInternal(fp.GetWaitFunc(), f); err == nil || err != expectedError { + t.Fatalf("Expected error %v, got none %v", expectedError, err) + } + fp.wg.Wait() + used := atomic.LoadInt32(&fp.used) + if used != 1 { + t.Errorf("Expected exactly one tick, got %d", used) + } +} + +func TestPollImmediate(t *testing.T) { + invocations := 0 + f := ConditionFunc(func() (bool, error) { + invocations++ + return true, nil + }) + fp := fakePoller{max: 0} + if err := pollImmediateInternal(fp.GetWaitFunc(), f); err != nil { + t.Fatalf("unexpected error %v", err) + } + // We don't need to wait for fp.wg, as pollImmediate shouldn't call WaitFunc at all. + if invocations != 1 { + t.Errorf("Expected exactly one invocation, got %d", invocations) + } + used := atomic.LoadInt32(&fp.used) + if used != 0 { + t.Errorf("Expected exactly zero ticks, got %d", used) + } +} + +func TestPollImmediateError(t *testing.T) { + expectedError := errors.New("Expected error") + f := ConditionFunc(func() (bool, error) { + return false, expectedError + }) + fp := fakePoller{max: 0} + if err := pollImmediateInternal(fp.GetWaitFunc(), f); err == nil || err != expectedError { + t.Fatalf("Expected error %v, got none %v", expectedError, err) + } + // We don't need to wait for fp.wg, as pollImmediate shouldn't call WaitFunc at all. + used := atomic.LoadInt32(&fp.used) + if used != 0 { + t.Errorf("Expected exactly zero ticks, got %d", used) + } +} + +func TestPollForever(t *testing.T) { + ch := make(chan struct{}) + done := make(chan struct{}, 1) + complete := make(chan struct{}) + go func() { + f := ConditionFunc(func() (bool, error) { + ch <- struct{}{} + select { + case <-done: + return true, nil + default: + } + return false, nil + }) + + if err := PollInfinite(time.Microsecond, f); err != nil { + t.Fatalf("unexpected error %v", err) + } + + close(ch) + complete <- struct{}{} + }() + + // ensure the condition is opened + <-ch + + // ensure channel sends events + for i := 0; i < 10; i++ { + select { + case _, open := <-ch: + if !open { + t.Fatalf("did not expect channel to be closed") + } + case <-time.After(ForeverTestTimeout): + t.Fatalf("channel did not return at least once within the poll interval") + } + } + + // at most one poll notification should be sent once we return from the condition + done <- struct{}{} + go func() { + for i := 0; i < 2; i++ { + _, open := <-ch + if !open { + return + } + } + t.Fatalf("expected closed channel after two iterations") + }() + <-complete +} + +func TestWaitFor(t *testing.T) { + var invocations int + testCases := map[string]struct { + F ConditionFunc + Ticks int + Invoked int + Err bool + }{ + "invoked once": { + ConditionFunc(func() (bool, error) { + invocations++ + return true, nil + }), + 2, + 1, + false, + }, + "invoked and returns a timeout": { + ConditionFunc(func() (bool, error) { + invocations++ + return false, nil + }), + 2, + 3, // the contract of WaitFor() says the func is called once more at the end of the wait + true, + }, + "returns immediately on error": { + ConditionFunc(func() (bool, error) { + invocations++ + return false, errors.New("test") + }), + 2, + 1, + true, + }, + } + for k, c := range testCases { + invocations = 0 + ticker := fakeTicker(c.Ticks, nil, func() {}) + err := func() error { + done := make(chan struct{}) + defer close(done) + return WaitFor(ticker, c.F, done) + }() + switch { + case c.Err && err == nil: + t.Errorf("%s: Expected error, got nil", k) + continue + case !c.Err && err != nil: + t.Errorf("%s: Expected no error, got: %#v", k, err) + continue + } + if invocations != c.Invoked { + t.Errorf("%s: Expected %d invocations, got %d", k, c.Invoked, invocations) + } + } +} + +func TestWaitForWithDelay(t *testing.T) { + done := make(chan struct{}) + defer close(done) + WaitFor(poller(time.Millisecond, ForeverTestTimeout), func() (bool, error) { + time.Sleep(10 * time.Millisecond) + return true, nil + }, done) + // If polling goroutine doesn't see the done signal it will leak timers. + select { + case done <- struct{}{}: + case <-time.After(ForeverTestTimeout): + t.Errorf("expected an ack of the done signal.") + } +} + +func TestPollUntil(t *testing.T) { + stopCh := make(chan struct{}) + called := make(chan bool) + pollDone := make(chan struct{}) + + go func() { + PollUntil(time.Microsecond, ConditionFunc(func() (bool, error) { + called <- true + return false, nil + }), stopCh) + + close(pollDone) + }() + + // make sure we're called once + <-called + // this should trigger a "done" + close(stopCh) + + go func() { + // release the condition func if needed + for { + <-called + } + }() + + // make sure we finished the poll + <-pollDone +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD b/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD index 596ea292..64fa65e7 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["decoder.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/yaml", importpath = "k8s.io/apimachinery/pkg/util/yaml", deps = [ "//vendor/github.com/ghodss/yaml:go_default_library", diff --git a/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go b/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go new file mode 100644 index 00000000..03e502ec --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/yaml/decoder_test.go @@ -0,0 +1,405 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 yaml + +import ( + "bufio" + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "math/rand" + "reflect" + "strings" + "testing" +) + +func TestYAMLDecoderReadBytesLength(t *testing.T) { + d := `--- +stuff: 1 + test-foo: 1 +` + testCases := []struct { + bufLen int + expectLen int + expectErr error + }{ + {len(d), len(d), nil}, + {len(d) + 10, len(d), nil}, + {len(d) - 10, len(d) - 10, io.ErrShortBuffer}, + } + + for i, testCase := range testCases { + r := NewDocumentDecoder(ioutil.NopCloser(bytes.NewReader([]byte(d)))) + b := make([]byte, testCase.bufLen) + n, err := r.Read(b) + if err != testCase.expectErr || n != testCase.expectLen { + t.Fatalf("%d: unexpected body: %d / %v", i, n, err) + } + } +} + +func TestYAMLDecoderCallsAfterErrShortBufferRestOfFrame(t *testing.T) { + d := `--- +stuff: 1 + test-foo: 1` + r := NewDocumentDecoder(ioutil.NopCloser(bytes.NewReader([]byte(d)))) + b := make([]byte, 12) + n, err := r.Read(b) + if err != io.ErrShortBuffer || n != 12 { + t.Fatalf("expected ErrShortBuffer: %d / %v", n, err) + } + expected := "---\nstuff: 1" + if string(b) != expected { + t.Fatalf("expected bytes read to be: %s got: %s", expected, string(b)) + } + b = make([]byte, 13) + n, err = r.Read(b) + if err != nil || n != 13 { + t.Fatalf("expected nil: %d / %v", n, err) + } + expected = "\n\ttest-foo: 1" + if string(b) != expected { + t.Fatalf("expected bytes read to be: '%s' got: '%s'", expected, string(b)) + } + b = make([]byte, 15) + n, err = r.Read(b) + if err != io.EOF || n != 0 { + t.Fatalf("expected EOF: %d / %v", n, err) + } +} + +func TestSplitYAMLDocument(t *testing.T) { + testCases := []struct { + input string + atEOF bool + expect string + adv int + }{ + {"foo", true, "foo", 3}, + {"fo", false, "", 0}, + + {"---", true, "---", 3}, + {"---\n", true, "---\n", 4}, + {"---\n", false, "", 0}, + + {"\n---\n", false, "", 5}, + {"\n---\n", true, "", 5}, + + {"abc\n---\ndef", true, "abc", 8}, + {"def", true, "def", 3}, + {"", true, "", 0}, + } + for i, testCase := range testCases { + adv, token, err := splitYAMLDocument([]byte(testCase.input), testCase.atEOF) + if err != nil { + t.Errorf("%d: unexpected error: %v", i, err) + continue + } + if adv != testCase.adv { + t.Errorf("%d: advance did not match: %d %d", i, testCase.adv, adv) + } + if testCase.expect != string(token) { + t.Errorf("%d: token did not match: %q %q", i, testCase.expect, string(token)) + } + } +} + +func TestGuessJSON(t *testing.T) { + if r, _, isJSON := GuessJSONStream(bytes.NewReader([]byte(" \n{}")), 100); !isJSON { + t.Fatalf("expected stream to be JSON") + } else { + b := make([]byte, 30) + n, err := r.Read(b) + if err != nil || n != 4 { + t.Fatalf("unexpected body: %d / %v", n, err) + } + if string(b[:n]) != " \n{}" { + t.Fatalf("unexpected body: %q", string(b[:n])) + } + } +} + +func TestScanYAML(t *testing.T) { + s := bufio.NewScanner(bytes.NewReader([]byte(`--- +stuff: 1 + +--- + `))) + s.Split(splitYAMLDocument) + if !s.Scan() { + t.Fatalf("should have been able to scan") + } + t.Logf("scan: %s", s.Text()) + if !s.Scan() { + t.Fatalf("should have been able to scan") + } + t.Logf("scan: %s", s.Text()) + if s.Scan() { + t.Fatalf("scan should have been done") + } + if s.Err() != nil { + t.Fatalf("err should have been nil: %v", s.Err()) + } +} + +func TestDecodeYAML(t *testing.T) { + s := NewYAMLToJSONDecoder(bytes.NewReader([]byte(`--- +stuff: 1 + +--- + `))) + obj := generic{} + if err := s.Decode(&obj); err != nil { + t.Fatalf("unexpected error: %v", err) + } + if fmt.Sprintf("%#v", obj) != `yaml.generic{"stuff":1}` { + t.Errorf("unexpected object: %#v", obj) + } + obj = generic{} + if err := s.Decode(&obj); err != nil { + t.Fatalf("unexpected error: %v", err) + } + if len(obj) != 0 { + t.Fatalf("unexpected object: %#v", obj) + } + obj = generic{} + if err := s.Decode(&obj); err != io.EOF { + t.Fatalf("unexpected error: %v", err) + } +} + +func TestDecodeBrokenYAML(t *testing.T) { + s := NewYAMLOrJSONDecoder(bytes.NewReader([]byte(`--- +stuff: 1 + test-foo: 1 + +--- + `)), 100) + obj := generic{} + err := s.Decode(&obj) + if err == nil { + t.Fatal("expected error with yaml: violate, got no error") + } + fmt.Printf("err: %s\n", err.Error()) + if !strings.Contains(err.Error(), "yaml: line 2:") { + t.Fatalf("expected %q to have 'yaml: line 2:' found a tab character", err.Error()) + } +} + +func TestDecodeBrokenJSON(t *testing.T) { + s := NewYAMLOrJSONDecoder(bytes.NewReader([]byte(`{ + "foo": { + "stuff": 1 + "otherStuff": 2 + } +} + `)), 100) + obj := generic{} + err := s.Decode(&obj) + if err == nil { + t.Fatal("expected error with json: prefix, got no error") + } + if !strings.HasPrefix(err.Error(), "json: line 3:") { + t.Fatalf("expected %q to have 'json: line 3:' prefix", err.Error()) + } +} + +type generic map[string]interface{} + +func TestYAMLOrJSONDecoder(t *testing.T) { + testCases := []struct { + input string + buffer int + isJSON bool + err bool + out []generic + }{ + {` {"1":2}{"3":4}`, 2, true, false, []generic{ + {"1": 2}, + {"3": 4}, + }}, + {" \n{}", 3, true, false, []generic{ + {}, + }}, + {" \na: b", 2, false, false, []generic{ + {"a": "b"}, + }}, + {" \n{\"a\": \"b\"}", 2, false, true, []generic{ + {"a": "b"}, + }}, + {" \n{\"a\": \"b\"}", 3, true, false, []generic{ + {"a": "b"}, + }}, + {` {"a":"b"}`, 100, true, false, []generic{ + {"a": "b"}, + }}, + {"", 1, false, false, []generic{}}, + {"foo: bar\n---\nbaz: biz", 100, false, false, []generic{ + {"foo": "bar"}, + {"baz": "biz"}, + }}, + {"foo: bar\n---\n", 100, false, false, []generic{ + {"foo": "bar"}, + }}, + {"foo: bar\n---", 100, false, false, []generic{ + {"foo": "bar"}, + }}, + {"foo: bar\n--", 100, false, true, []generic{ + {"foo": "bar"}, + }}, + {"foo: bar\n-", 100, false, true, []generic{ + {"foo": "bar"}, + }}, + {"foo: bar\n", 100, false, false, []generic{ + {"foo": "bar"}, + }}, + } + for i, testCase := range testCases { + decoder := NewYAMLOrJSONDecoder(bytes.NewReader([]byte(testCase.input)), testCase.buffer) + objs := []generic{} + + var err error + for { + out := make(generic) + err = decoder.Decode(&out) + if err != nil { + break + } + objs = append(objs, out) + } + if err != io.EOF { + switch { + case testCase.err && err == nil: + t.Errorf("%d: unexpected non-error", i) + continue + case !testCase.err && err != nil: + t.Errorf("%d: unexpected error: %v", i, err) + continue + case err != nil: + continue + } + } + switch decoder.decoder.(type) { + case *YAMLToJSONDecoder: + if testCase.isJSON { + t.Errorf("%d: expected JSON decoder, got YAML", i) + } + case *json.Decoder: + if !testCase.isJSON { + t.Errorf("%d: expected YAML decoder, got JSON", i) + } + } + if fmt.Sprintf("%#v", testCase.out) != fmt.Sprintf("%#v", objs) { + t.Errorf("%d: objects were not equal: \n%#v\n%#v", i, testCase.out, objs) + } + } +} + +func TestReadSingleLongLine(t *testing.T) { + testReadLines(t, []int{128 * 1024}) +} + +func TestReadRandomLineLengths(t *testing.T) { + minLength := 100 + maxLength := 96 * 1024 + maxLines := 100 + + lineLengths := make([]int, maxLines) + for i := 0; i < maxLines; i++ { + lineLengths[i] = rand.Intn(maxLength-minLength) + minLength + } + + testReadLines(t, lineLengths) +} + +func testReadLines(t *testing.T, lineLengths []int) { + var ( + lines [][]byte + inputStream []byte + ) + for _, lineLength := range lineLengths { + inputLine := make([]byte, lineLength+1) + for i := 0; i < lineLength; i++ { + char := rand.Intn('z'-'A') + 'A' + inputLine[i] = byte(char) + } + inputLine[len(inputLine)-1] = '\n' + lines = append(lines, inputLine) + } + for _, line := range lines { + inputStream = append(inputStream, line...) + } + + // init Reader + reader := bufio.NewReader(bytes.NewReader(inputStream)) + lineReader := &LineReader{reader: reader} + + // read lines + var readLines [][]byte + for range lines { + bytes, err := lineReader.Read() + if err != nil && err != io.EOF { + t.Fatalf("failed to read lines: %v", err) + } + readLines = append(readLines, bytes) + } + + // validate + for i := range lines { + if len(lines[i]) != len(readLines[i]) { + t.Fatalf("expected line length: %d, but got %d", len(lines[i]), len(readLines[i])) + } + if !reflect.DeepEqual(lines[i], readLines[i]) { + t.Fatalf("expected line: %v, but got %v", lines[i], readLines[i]) + } + } +} + +func TestTypedJSONOrYamlErrors(t *testing.T) { + s := NewYAMLOrJSONDecoder(bytes.NewReader([]byte(`{ + "foo": { + "stuff": 1 + "otherStuff": 2 + } +} + `)), 100) + obj := generic{} + err := s.Decode(&obj) + if err == nil { + t.Fatal("expected error with json: prefix, got no error") + } + if _, ok := err.(JSONSyntaxError); !ok { + t.Fatalf("expected %q to be of type JSONSyntaxError", err.Error()) + } + + s = NewYAMLOrJSONDecoder(bytes.NewReader([]byte(`--- +stuff: 1 + test-foo: 1 + +--- + `)), 100) + obj = generic{} + err = s.Decode(&obj) + if err == nil { + t.Fatal("expected error with yaml: prefix, got no error") + } + if _, ok := err.(YAMLSyntaxError); !ok { + t.Fatalf("expected %q to be of type YAMLSyntaxError", err.Error()) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/version/BUILD b/vendor/k8s.io/apimachinery/pkg/version/BUILD index fc803ec6..95435cb7 100644 --- a/vendor/k8s.io/apimachinery/pkg/version/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/version/BUILD @@ -13,6 +13,7 @@ go_library( "helpers.go", "types.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/version", importpath = "k8s.io/apimachinery/pkg/version", ) diff --git a/vendor/k8s.io/apimachinery/pkg/version/helpers_test.go b/vendor/k8s.io/apimachinery/pkg/version/helpers_test.go new file mode 100644 index 00000000..863a5369 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/version/helpers_test.go @@ -0,0 +1,52 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 version + +import ( + "testing" +) + +func TestCompareKubeAwareVersionStrings(t *testing.T) { + tests := []*struct { + v1, v2 string + expectedGreater bool + }{ + {"v1", "v2", false}, + {"v2", "v1", true}, + {"v10", "v2", true}, + {"v1", "v2alpha1", true}, + {"v1", "v2beta1", true}, + {"v1alpha2", "v1alpha1", true}, + {"v1beta1", "v2alpha3", true}, + {"v1alpha10", "v1alpha2", true}, + {"v1beta10", "v1beta2", true}, + {"foo", "v1beta2", false}, + {"bar", "foo", true}, + {"version1", "version2", true}, // Non kube-like versions are sorted alphabetically + {"version1", "version10", true}, // Non kube-like versions are sorted alphabetically + } + + for _, tc := range tests { + if e, a := tc.expectedGreater, CompareKubeAwareVersionStrings(tc.v1, tc.v2) > 0; e != a { + if e { + t.Errorf("expected %s to be greater than %s", tc.v1, tc.v2) + } else { + t.Errorf("expected %s to be less than than %s", tc.v1, tc.v2) + } + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/BUILD b/vendor/k8s.io/apimachinery/pkg/watch/BUILD index 3106af8f..49ebc152 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/watch/BUILD @@ -13,45 +13,33 @@ go_library( "filter.go", "mux.go", "streamwatcher.go", - "until.go", "watch.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/watch", importpath = "k8s.io/apimachinery/pkg/watch", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) go_test( - name = "go_default_xtest", + name = "go_default_test", srcs = [ "filter_test.go", "mux_test.go", "streamwatcher_test.go", "watch_test.go", ], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["until_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/watch/filter_test.go b/vendor/k8s.io/apimachinery/pkg/watch/filter_test.go new file mode 100644 index 00000000..4b5ae898 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/watch/filter_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 watch_test + +import ( + "reflect" + "testing" + + . "k8s.io/apimachinery/pkg/watch" +) + +func TestFilter(t *testing.T) { + table := []Event{ + {Type: Added, Object: testType("foo")}, + {Type: Added, Object: testType("bar")}, + {Type: Added, Object: testType("baz")}, + {Type: Added, Object: testType("qux")}, + {Type: Added, Object: testType("zoo")}, + } + + source := NewFake() + filtered := Filter(source, func(e Event) (Event, bool) { + return e, e.Object.(testType)[0] != 'b' + }) + + go func() { + for _, item := range table { + source.Action(item.Type, item.Object) + } + source.Stop() + }() + + var got []string + for { + event, ok := <-filtered.ResultChan() + if !ok { + break + } + got = append(got, string(event.Object.(testType))) + } + + if e, a := []string{"foo", "qux", "zoo"}, got; !reflect.DeepEqual(e, a) { + t.Errorf("got %v, wanted %v", e, a) + } +} + +func TestFilterStop(t *testing.T) { + source := NewFake() + filtered := Filter(source, func(e Event) (Event, bool) { + return e, e.Object.(testType)[0] != 'b' + }) + + go func() { + source.Add(testType("foo")) + filtered.Stop() + }() + + var got []string + for { + event, ok := <-filtered.ResultChan() + if !ok { + break + } + got = append(got, string(event.Object.(testType))) + } + + if e, a := []string{"foo"}, got; !reflect.DeepEqual(e, a) { + t.Errorf("got %v, wanted %v", e, a) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/mux_test.go b/vendor/k8s.io/apimachinery/pkg/watch/mux_test.go new file mode 100644 index 00000000..7029cf1f --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/watch/mux_test.go @@ -0,0 +1,176 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 watch_test + +import ( + "reflect" + "sync" + "testing" + "time" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/wait" + . "k8s.io/apimachinery/pkg/watch" +) + +type myType struct { + ID string + Value string +} + +func (obj *myType) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } +func (obj *myType) DeepCopyObject() runtime.Object { + if obj == nil { + return nil + } + clone := *obj + return &clone +} + +func TestBroadcaster(t *testing.T) { + table := []Event{ + {Type: Added, Object: &myType{"foo", "hello world 1"}}, + {Type: Added, Object: &myType{"bar", "hello world 2"}}, + {Type: Modified, Object: &myType{"foo", "goodbye world 3"}}, + {Type: Deleted, Object: &myType{"bar", "hello world 4"}}, + } + + // The broadcaster we're testing + m := NewBroadcaster(0, WaitIfChannelFull) + + // Add a bunch of watchers + const testWatchers = 2 + wg := sync.WaitGroup{} + wg.Add(testWatchers) + for i := 0; i < testWatchers; i++ { + // Verify that each watcher gets the events in the correct order + go func(watcher int, w Interface) { + tableLine := 0 + for { + event, ok := <-w.ResultChan() + if !ok { + break + } + if e, a := table[tableLine], event; !reflect.DeepEqual(e, a) { + t.Errorf("Watcher %v, line %v: Expected (%v, %#v), got (%v, %#v)", + watcher, tableLine, e.Type, e.Object, a.Type, a.Object) + } else { + t.Logf("Got (%v, %#v)", event.Type, event.Object) + } + tableLine++ + } + wg.Done() + }(i, m.Watch()) + } + + for i, item := range table { + t.Logf("Sending %v", i) + m.Action(item.Type, item.Object) + } + + m.Shutdown() + + wg.Wait() +} + +func TestBroadcasterWatcherClose(t *testing.T) { + m := NewBroadcaster(0, WaitIfChannelFull) + w := m.Watch() + w2 := m.Watch() + w.Stop() + m.Shutdown() + if _, open := <-w.ResultChan(); open { + t.Errorf("Stop didn't work?") + } + if _, open := <-w2.ResultChan(); open { + t.Errorf("Shutdown didn't work?") + } + // Extra stops don't hurt things + w.Stop() + w2.Stop() +} + +func TestBroadcasterWatcherStopDeadlock(t *testing.T) { + done := make(chan bool) + m := NewBroadcaster(0, WaitIfChannelFull) + go func(w0, w1 Interface) { + // We know Broadcaster is in the distribute loop once one watcher receives + // an event. Stop the other watcher while distribute is trying to + // send to it. + select { + case <-w0.ResultChan(): + w1.Stop() + case <-w1.ResultChan(): + w0.Stop() + } + close(done) + }(m.Watch(), m.Watch()) + m.Action(Added, &myType{}) + select { + case <-time.After(wait.ForeverTestTimeout): + t.Error("timeout: deadlocked") + case <-done: + } + m.Shutdown() +} + +func TestBroadcasterDropIfChannelFull(t *testing.T) { + m := NewBroadcaster(1, DropIfChannelFull) + + event1 := Event{Type: Added, Object: &myType{"foo", "hello world 1"}} + event2 := Event{Type: Added, Object: &myType{"bar", "hello world 2"}} + + // Add a couple watchers + watches := make([]Interface, 2) + for i := range watches { + watches[i] = m.Watch() + } + + // Send a couple events before closing the broadcast channel. + t.Log("Sending event 1") + m.Action(event1.Type, event1.Object) + t.Log("Sending event 2") + m.Action(event2.Type, event2.Object) + m.Shutdown() + + // Pull events from the queue. + wg := sync.WaitGroup{} + wg.Add(len(watches)) + for i := range watches { + // Verify that each watcher only gets the first event because its watch + // queue of length one was full from the first one. + go func(watcher int, w Interface) { + defer wg.Done() + e1, ok := <-w.ResultChan() + if !ok { + t.Errorf("Watcher %v failed to retrieve first event.", watcher) + } + if e, a := event1, e1; !reflect.DeepEqual(e, a) { + t.Errorf("Watcher %v: Expected (%v, %#v), got (%v, %#v)", + watcher, e.Type, e.Object, a.Type, a.Object) + } + t.Logf("Got (%v, %#v)", e1.Type, e1.Object) + e2, ok := <-w.ResultChan() + if ok { + t.Errorf("Watcher %v received second event (%v, %#v) even though it shouldn't have.", + watcher, e2.Type, e2.Object) + } + }(i, watches[i]) + } + wg.Wait() +} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher_test.go b/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher_test.go new file mode 100644 index 00000000..1e302911 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/watch/streamwatcher_test.go @@ -0,0 +1,68 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 watch_test + +import ( + "io" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime" + . "k8s.io/apimachinery/pkg/watch" +) + +type fakeDecoder struct { + items chan Event +} + +func (f fakeDecoder) Decode() (action EventType, object runtime.Object, err error) { + item, open := <-f.items + if !open { + return action, nil, io.EOF + } + return item.Type, item.Object, nil +} + +func (f fakeDecoder) Close() { + close(f.items) +} + +func TestStreamWatcher(t *testing.T) { + table := []Event{ + {Type: Added, Object: testType("foo")}, + } + + fd := fakeDecoder{make(chan Event, 5)} + sw := NewStreamWatcher(fd) + + for _, item := range table { + fd.items <- item + got, open := <-sw.ResultChan() + if !open { + t.Errorf("unexpected early close") + } + if e, a := item, got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + } + + sw.Stop() + _, open := <-sw.ResultChan() + if open { + t.Errorf("Unexpected failure to close") + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/until.go b/vendor/k8s.io/apimachinery/pkg/watch/until.go deleted file mode 100644 index c2772ddb..00000000 --- a/vendor/k8s.io/apimachinery/pkg/watch/until.go +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 watch - -import ( - "errors" - "time" - - "k8s.io/apimachinery/pkg/util/wait" -) - -// ConditionFunc returns true if the condition has been reached, false if it has not been reached yet, -// or an error if the condition cannot be checked and should terminate. In general, it is better to define -// level driven conditions over edge driven conditions (pod has ready=true, vs pod modified and ready changed -// from false to true). -type ConditionFunc func(event Event) (bool, error) - -// ErrWatchClosed is returned when the watch channel is closed before timeout in Until. -var ErrWatchClosed = errors.New("watch closed before Until timeout") - -// Until reads items from the watch until each provided condition succeeds, and then returns the last watch -// encountered. The first condition that returns an error terminates the watch (and the event is also returned). -// If no event has been received, the returned event will be nil. -// Conditions are satisfied sequentially so as to provide a useful primitive for higher level composition. -// A zero timeout means to wait forever. -func Until(timeout time.Duration, watcher Interface, conditions ...ConditionFunc) (*Event, error) { - ch := watcher.ResultChan() - defer watcher.Stop() - var after <-chan time.Time - if timeout > 0 { - after = time.After(timeout) - } else { - ch := make(chan time.Time) - defer close(ch) - after = ch - } - var lastEvent *Event - for _, condition := range conditions { - // check the next condition against the previous event and short circuit waiting for the next watch - if lastEvent != nil { - done, err := condition(*lastEvent) - if err != nil { - return lastEvent, err - } - if done { - continue - } - } - ConditionSucceeded: - for { - select { - case event, ok := <-ch: - if !ok { - return lastEvent, ErrWatchClosed - } - lastEvent = &event - - // TODO: check for watch expired error and retry watch from latest point? - done, err := condition(event) - if err != nil { - return lastEvent, err - } - if done { - break ConditionSucceeded - } - - case <-after: - return lastEvent, wait.ErrWaitTimeout - } - } - } - return lastEvent, nil -} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/watch.go b/vendor/k8s.io/apimachinery/pkg/watch/watch.go index 5c1380b2..a627d1d5 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/watch.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/watch.go @@ -268,3 +268,50 @@ func (f *RaceFreeFakeWatcher) Action(action EventType, obj runtime.Object) { } } } + +// ProxyWatcher lets you wrap your channel in watch Interface. Threadsafe. +type ProxyWatcher struct { + result chan Event + stopCh chan struct{} + + mutex sync.Mutex + stopped bool +} + +var _ Interface = &ProxyWatcher{} + +// NewProxyWatcher creates new ProxyWatcher by wrapping a channel +func NewProxyWatcher(ch chan Event) *ProxyWatcher { + return &ProxyWatcher{ + result: ch, + stopCh: make(chan struct{}), + stopped: false, + } +} + +// Stop implements Interface +func (pw *ProxyWatcher) Stop() { + pw.mutex.Lock() + defer pw.mutex.Unlock() + if !pw.stopped { + pw.stopped = true + close(pw.stopCh) + } +} + +// Stopping returns true if Stop() has been called +func (pw *ProxyWatcher) Stopping() bool { + pw.mutex.Lock() + defer pw.mutex.Unlock() + return pw.stopped +} + +// ResultChan implements Interface +func (pw *ProxyWatcher) ResultChan() <-chan Event { + return pw.result +} + +// StopChan returns stop channel +func (pw *ProxyWatcher) StopChan() <-chan struct{} { + return pw.stopCh +} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/watch_test.go b/vendor/k8s.io/apimachinery/pkg/watch/watch_test.go new file mode 100644 index 00000000..4fb159b0 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/watch/watch_test.go @@ -0,0 +1,175 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 watch_test + +import ( + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + . "k8s.io/apimachinery/pkg/watch" +) + +type testType string + +func (obj testType) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } +func (obj testType) DeepCopyObject() runtime.Object { return obj } + +func TestFake(t *testing.T) { + f := NewFake() + + table := []struct { + t EventType + s testType + }{ + {Added, testType("foo")}, + {Modified, testType("qux")}, + {Modified, testType("bar")}, + {Deleted, testType("bar")}, + {Error, testType("error: blah")}, + } + + // Prove that f implements Interface by phrasing this as a function. + consumer := func(w Interface) { + for _, expect := range table { + got, ok := <-w.ResultChan() + if !ok { + t.Fatalf("closed early") + } + if e, a := expect.t, got.Type; e != a { + t.Fatalf("Expected %v, got %v", e, a) + } + if a, ok := got.Object.(testType); !ok || a != expect.s { + t.Fatalf("Expected %v, got %v", expect.s, a) + } + } + _, stillOpen := <-w.ResultChan() + if stillOpen { + t.Fatal("Never stopped") + } + } + + sender := func() { + f.Add(testType("foo")) + f.Action(Modified, testType("qux")) + f.Modify(testType("bar")) + f.Delete(testType("bar")) + f.Error(testType("error: blah")) + f.Stop() + } + + go sender() + consumer(f) +} + +func TestRaceFreeFake(t *testing.T) { + f := NewRaceFreeFake() + + table := []struct { + t EventType + s testType + }{ + {Added, testType("foo")}, + {Modified, testType("qux")}, + {Modified, testType("bar")}, + {Deleted, testType("bar")}, + {Error, testType("error: blah")}, + } + + // Prove that f implements Interface by phrasing this as a function. + consumer := func(w Interface) { + for _, expect := range table { + got, ok := <-w.ResultChan() + if !ok { + t.Fatalf("closed early") + } + if e, a := expect.t, got.Type; e != a { + t.Fatalf("Expected %v, got %v", e, a) + } + if a, ok := got.Object.(testType); !ok || a != expect.s { + t.Fatalf("Expected %v, got %v", expect.s, a) + } + } + _, stillOpen := <-w.ResultChan() + if stillOpen { + t.Fatal("Never stopped") + } + } + + sender := func() { + f.Add(testType("foo")) + f.Action(Modified, testType("qux")) + f.Modify(testType("bar")) + f.Delete(testType("bar")) + f.Error(testType("error: blah")) + f.Stop() + } + + go sender() + consumer(f) +} + +func TestEmpty(t *testing.T) { + w := NewEmptyWatch() + _, ok := <-w.ResultChan() + if ok { + t.Errorf("unexpected result channel result") + } + w.Stop() + _, ok = <-w.ResultChan() + if ok { + t.Errorf("unexpected result channel result") + } +} + +func TestProxyWatcher(t *testing.T) { + events := []Event{ + {Added, testType("foo")}, + {Modified, testType("qux")}, + {Modified, testType("bar")}, + {Deleted, testType("bar")}, + {Error, testType("error: blah")}, + } + + ch := make(chan Event, len(events)) + w := NewProxyWatcher(ch) + + for _, e := range events { + ch <- e + } + + for _, e := range events { + g := <-w.ResultChan() + if !reflect.DeepEqual(e, g) { + t.Errorf("Expected %#v, got %#v", e, g) + continue + } + } + + w.Stop() + + select { + // Closed channel always reads immediately + case <-w.StopChan(): + default: + t.Error("Channel isn't closed") + } + + // Test double close + w.Stop() +} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go index 0d266ffb..71ef4da3 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go @@ -23,9 +23,7 @@ package watch // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Event) DeepCopyInto(out *Event) { *out = *in - if in.Object == nil { - out.Object = nil - } else { + if in.Object != nil { out.Object = in.Object.DeepCopyObject() } return diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD index 7ece664d..6dc06d4e 100644 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD @@ -9,6 +9,7 @@ load( go_library( name = "go_default_library", srcs = ["fields.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/json", importpath = "k8s.io/apimachinery/third_party/forked/golang/json", ) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go new file mode 100644 index 00000000..33b78bc4 --- /dev/null +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields_test.go @@ -0,0 +1,30 @@ +package json + +import ( + "reflect" + "testing" +) + +func TestLookupPtrToStruct(t *testing.T) { + type Elem struct { + Key string + Value string + } + type Outer struct { + Inner []Elem `json:"inner" patchStrategy:"merge" patchMergeKey:"key"` + } + outer := &Outer{} + elemType, patchStrategies, patchMergeKey, err := LookupPatchMetadataForStruct(reflect.TypeOf(outer), "inner") + if err != nil { + t.Fatal(err) + } + if elemType != reflect.TypeOf([]Elem{}) { + t.Errorf("elemType = %v, want: %v", elemType, reflect.TypeOf([]Elem{})) + } + if !reflect.DeepEqual(patchStrategies, []string{"merge"}) { + t.Errorf("patchStrategies = %v, want: %v", patchStrategies, []string{"merge"}) + } + if patchMergeKey != "key" { + t.Errorf("patchMergeKey = %v, want: %v", patchMergeKey, "key") + } +} diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD index 1df29057..acc180d5 100644 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD @@ -8,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["addr.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil", importpath = "k8s.io/apimachinery/third_party/forked/golang/netutil", ) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD index 22c8ec04..0af6d87d 100644 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["deep_equal.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect", importpath = "k8s.io/apimachinery/third_party/forked/golang/reflect", ) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal_test.go b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal_test.go new file mode 100644 index 00000000..4a062993 --- /dev/null +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal_test.go @@ -0,0 +1,137 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package reflect + +import ( + "testing" +) + +func TestEqualities(t *testing.T) { + e := Equalities{} + type Bar struct { + X int + } + type Baz struct { + Y Bar + } + err := e.AddFuncs( + func(a, b int) bool { + return a+1 == b + }, + func(a, b Bar) bool { + return a.X*10 == b.X + }, + ) + if err != nil { + t.Fatalf("Unexpected: %v", err) + } + + type Foo struct { + X int + } + + table := []struct { + a, b interface{} + equal bool + }{ + {1, 2, true}, + {2, 1, false}, + {"foo", "fo", false}, + {"foo", "foo", true}, + {"foo", "foobar", false}, + {Foo{1}, Foo{2}, true}, + {Foo{2}, Foo{1}, false}, + {Bar{1}, Bar{10}, true}, + {&Bar{1}, &Bar{10}, true}, + {Baz{Bar{1}}, Baz{Bar{10}}, true}, + {[...]string{}, [...]string{"1", "2", "3"}, false}, + {[...]string{"1"}, [...]string{"1", "2", "3"}, false}, + {[...]string{"1", "2", "3"}, [...]string{}, false}, + {[...]string{"1", "2", "3"}, [...]string{"1", "2", "3"}, true}, + {map[string]int{"foo": 1}, map[string]int{}, false}, + {map[string]int{"foo": 1}, map[string]int{"foo": 2}, true}, + {map[string]int{"foo": 2}, map[string]int{"foo": 1}, false}, + {map[string]int{"foo": 1}, map[string]int{"foo": 2, "bar": 6}, false}, + {map[string]int{"foo": 1, "bar": 6}, map[string]int{"foo": 2}, false}, + {map[string]int{}, map[string]int(nil), true}, + {[]string(nil), []string(nil), true}, + {[]string{}, []string(nil), true}, + {[]string(nil), []string{}, true}, + {[]string{"1"}, []string(nil), false}, + {[]string{}, []string{"1", "2", "3"}, false}, + {[]string{"1"}, []string{"1", "2", "3"}, false}, + {[]string{"1", "2", "3"}, []string{}, false}, + } + + for _, item := range table { + if e, a := item.equal, e.DeepEqual(item.a, item.b); e != a { + t.Errorf("Expected (%+v == %+v) == %v, but got %v", item.a, item.b, e, a) + } + } +} + +func TestDerivates(t *testing.T) { + e := Equalities{} + type Bar struct { + X int + } + type Baz struct { + Y Bar + } + err := e.AddFuncs( + func(a, b int) bool { + return a+1 == b + }, + func(a, b Bar) bool { + return a.X*10 == b.X + }, + ) + if err != nil { + t.Fatalf("Unexpected: %v", err) + } + + type Foo struct { + X int + } + + table := []struct { + a, b interface{} + equal bool + }{ + {1, 2, true}, + {2, 1, false}, + {"foo", "fo", false}, + {"foo", "foo", true}, + {"foo", "foobar", false}, + {Foo{1}, Foo{2}, true}, + {Foo{2}, Foo{1}, false}, + {Bar{1}, Bar{10}, true}, + {&Bar{1}, &Bar{10}, true}, + {Baz{Bar{1}}, Baz{Bar{10}}, true}, + {[...]string{}, [...]string{"1", "2", "3"}, false}, + {[...]string{"1"}, [...]string{"1", "2", "3"}, false}, + {[...]string{"1", "2", "3"}, [...]string{}, false}, + {[...]string{"1", "2", "3"}, [...]string{"1", "2", "3"}, true}, + {map[string]int{"foo": 1}, map[string]int{}, false}, + {map[string]int{"foo": 1}, map[string]int{"foo": 2}, true}, + {map[string]int{"foo": 2}, map[string]int{"foo": 1}, false}, + {map[string]int{"foo": 1}, map[string]int{"foo": 2, "bar": 6}, true}, + {map[string]int{"foo": 1, "bar": 6}, map[string]int{"foo": 2}, false}, + {map[string]int{}, map[string]int(nil), true}, + {[]string(nil), []string(nil), true}, + {[]string{}, []string(nil), true}, + {[]string(nil), []string{}, true}, + {[]string{"1"}, []string(nil), false}, + {[]string{}, []string{"1", "2", "3"}, true}, + {[]string{"1"}, []string{"1", "2", "3"}, true}, + {[]string{"1", "2", "3"}, []string{}, false}, + } + + for _, item := range table { + if e, a := item.equal, e.DeepDerivative(item.a, item.b); e != a { + t.Errorf("Expected (%+v ~ %+v) == %v, but got %v", item.a, item.b, e, a) + } + } +} diff --git a/vendor/k8s.io/apiserver/CONTRIBUTING.md b/vendor/k8s.io/apiserver/CONTRIBUTING.md new file mode 100644 index 00000000..94a28899 --- /dev/null +++ b/vendor/k8s.io/apiserver/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing guidelines + +Do not open pull requests directly against this repository, they will be ignored. Instead, please open pull requests against [kubernetes/kubernetes](https://git.k8s.io/kubernetes/). Please follow the same [contributing guide](https://git.k8s.io/kubernetes/CONTRIBUTING.md) you would follow for any other pull request made to kubernetes/kubernetes. + +This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/apiserver](https://git.k8s.io/kubernetes/staging/src/k8s.io/apiserver) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot). + +Please see [Staging Directory and Publishing](https://git.k8s.io/community/contributors/devel/staging.md) for more information diff --git a/vendor/k8s.io/apiserver/OWNERS b/vendor/k8s.io/apiserver/OWNERS new file mode 100644 index 00000000..9617c277 --- /dev/null +++ b/vendor/k8s.io/apiserver/OWNERS @@ -0,0 +1,22 @@ +approvers: +- lavalamp +- smarterclayton +- deads2k +- sttts +- liggitt +reviewers: +- lavalamp +- smarterclayton +- wojtek-t +- deads2k +- caesarxuchao +- liggitt +- sttts +- ncdc +- tallclair +- enj +- hzxuzhonghu +- CaoShuFeng +labels: +- sig/api-machinery +- area/apiserver diff --git a/vendor/k8s.io/apiserver/README.md b/vendor/k8s.io/apiserver/README.md new file mode 100644 index 00000000..90160ce9 --- /dev/null +++ b/vendor/k8s.io/apiserver/README.md @@ -0,0 +1,30 @@ +# apiserver + +Generic library for building a Kubernetes aggregated API server. + + +## Purpose + +This library contains code to create Kubernetes aggregation server complete with delegated authentication and authorization, +`kubectl` compatible discovery information, optional admission chain, and versioned types. It's first consumers are +`k8s.io/kubernetes`, `k8s.io/kube-aggregator`, and `github.com/kubernetes-incubator/service-catalog`. + + +## Compatibility + +There are *NO compatibility guarantees* for this repository, yet. It is in direct support of Kubernetes, so branches +will track Kubernetes and be compatible with that repo. As we more cleanly separate the layers, we will review the +compatibility guarantee. We have a goal to make this easier to use in the future. + + +## Where does it come from? + +`apiserver` is synced from https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/apiserver. +Code changes are made in that location, merged into `k8s.io/kubernetes` and later synced here. + + +## Things you should *NOT* do + + 1. Directly modify any files under `pkg` in this repo. Those are driven from `k8s.io/kubernetes/staging/src/k8s.io/apiserver`. + 2. Expect compatibility. This repo is changing quickly in direct support of + Kubernetes and the API isn't yet stable enough for API guarantees. diff --git a/vendor/k8s.io/apiserver/SECURITY_CONTACTS b/vendor/k8s.io/apiserver/SECURITY_CONTACTS new file mode 100644 index 00000000..0648a8eb --- /dev/null +++ b/vendor/k8s.io/apiserver/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/apiserver/code-of-conduct.md b/vendor/k8s.io/apiserver/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/vendor/k8s.io/apiserver/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) diff --git a/vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD index 268bb29f..4a2741d9 100644 --- a/vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD +++ b/vendor/k8s.io/apiserver/pkg/authentication/authenticator/BUILD @@ -8,8 +8,9 @@ load( go_library( name = "go_default_library", srcs = ["interfaces.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/authenticator", importpath = "k8s.io/apiserver/pkg/authentication/authenticator", - deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], + deps = ["//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD index 3a60436e..5fdc4311 100644 --- a/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD +++ b/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/BUILD @@ -15,8 +15,9 @@ go_test( go_library( name = "go_default_library", srcs = ["util.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount", importpath = "k8s.io/apiserver/pkg/authentication/serviceaccount", - deps = ["//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/util_test.go b/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/util_test.go new file mode 100644 index 00000000..14784b16 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/util_test.go @@ -0,0 +1,82 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 serviceaccount + +import "testing" + +func TestMakeUsername(t *testing.T) { + + testCases := map[string]struct { + Namespace string + Name string + ExpectedErr bool + }{ + "valid": { + Namespace: "foo", + Name: "bar", + ExpectedErr: false, + }, + "empty": { + ExpectedErr: true, + }, + "empty namespace": { + Namespace: "", + Name: "foo", + ExpectedErr: true, + }, + "empty name": { + Namespace: "foo", + Name: "", + ExpectedErr: true, + }, + "extra segments": { + Namespace: "foo", + Name: "bar:baz", + ExpectedErr: true, + }, + "invalid chars in namespace": { + Namespace: "foo ", + Name: "bar", + ExpectedErr: true, + }, + "invalid chars in name": { + Namespace: "foo", + Name: "bar ", + ExpectedErr: true, + }, + } + + for k, tc := range testCases { + username := MakeUsername(tc.Namespace, tc.Name) + + namespace, name, err := SplitUsername(username) + if (err != nil) != tc.ExpectedErr { + t.Errorf("%s: Expected error=%v, got %v", k, tc.ExpectedErr, err) + continue + } + if err != nil { + continue + } + + if namespace != tc.Namespace { + t.Errorf("%s: Expected namespace %q, got %q", k, tc.Namespace, namespace) + } + if name != tc.Name { + t.Errorf("%s: Expected name %q, got %q", k, tc.Name, name) + } + } +} diff --git a/vendor/k8s.io/apiserver/pkg/authentication/user/BUILD b/vendor/k8s.io/apiserver/pkg/authentication/user/BUILD index f22095c2..cd8109d7 100644 --- a/vendor/k8s.io/apiserver/pkg/authentication/user/BUILD +++ b/vendor/k8s.io/apiserver/pkg/authentication/user/BUILD @@ -11,6 +11,7 @@ go_library( "doc.go", "user.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/user", importpath = "k8s.io/apiserver/pkg/authentication/user", ) diff --git a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD b/vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD deleted file mode 100644 index 2a7508f4..00000000 --- a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interfaces.go", - "rule.go", - ], - importpath = "k8s.io/apiserver/pkg/authorization/authorizer", - deps = ["//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/interfaces.go b/vendor/k8s.io/apiserver/pkg/authorization/authorizer/interfaces.go deleted file mode 100644 index 95ade009..00000000 --- a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/interfaces.go +++ /dev/null @@ -1,158 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 authorizer - -import ( - "net/http" - - "k8s.io/apiserver/pkg/authentication/user" -) - -// Attributes is an interface used by an Authorizer to get information about a request -// that is used to make an authorization decision. -type Attributes interface { - // GetUser returns the user.Info object to authorize - GetUser() user.Info - - // GetVerb returns the kube verb associated with API requests (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy), - // or the lowercased HTTP verb associated with non-API requests (this includes get, put, post, patch, and delete) - GetVerb() string - - // When IsReadOnly() == true, the request has no side effects, other than - // caching, logging, and other incidentals. - IsReadOnly() bool - - // The namespace of the object, if a request is for a REST object. - GetNamespace() string - - // The kind of object, if a request is for a REST object. - GetResource() string - - // GetSubresource returns the subresource being requested, if present - GetSubresource() string - - // GetName returns the name of the object as parsed off the request. This will not be present for all request types, but - // will be present for: get, update, delete - GetName() string - - // The group of the resource, if a request is for a REST object. - GetAPIGroup() string - - // GetAPIVersion returns the version of the group requested, if a request is for a REST object. - GetAPIVersion() string - - // IsResourceRequest returns true for requests to API resources, like /api/v1/nodes, - // and false for non-resource endpoints like /api, /healthz, and /swaggerapi - IsResourceRequest() bool - - // GetPath returns the path of the request - GetPath() string -} - -// Authorizer makes an authorization decision based on information gained by making -// zero or more calls to methods of the Attributes interface. It returns nil when an action is -// authorized, otherwise it returns an error. -type Authorizer interface { - Authorize(a Attributes) (authorized Decision, reason string, err error) -} - -type AuthorizerFunc func(a Attributes) (Decision, string, error) - -func (f AuthorizerFunc) Authorize(a Attributes) (Decision, string, error) { - return f(a) -} - -// RuleResolver provides a mechanism for resolving the list of rules that apply to a given user within a namespace. -type RuleResolver interface { - // RulesFor get the list of cluster wide rules, the list of rules in the specific namespace, incomplete status and errors. - RulesFor(user user.Info, namespace string) ([]ResourceRuleInfo, []NonResourceRuleInfo, bool, error) -} - -// RequestAttributesGetter provides a function that extracts Attributes from an http.Request -type RequestAttributesGetter interface { - GetRequestAttributes(user.Info, *http.Request) Attributes -} - -// AttributesRecord implements Attributes interface. -type AttributesRecord struct { - User user.Info - Verb string - Namespace string - APIGroup string - APIVersion string - Resource string - Subresource string - Name string - ResourceRequest bool - Path string -} - -func (a AttributesRecord) GetUser() user.Info { - return a.User -} - -func (a AttributesRecord) GetVerb() string { - return a.Verb -} - -func (a AttributesRecord) IsReadOnly() bool { - return a.Verb == "get" || a.Verb == "list" || a.Verb == "watch" -} - -func (a AttributesRecord) GetNamespace() string { - return a.Namespace -} - -func (a AttributesRecord) GetResource() string { - return a.Resource -} - -func (a AttributesRecord) GetSubresource() string { - return a.Subresource -} - -func (a AttributesRecord) GetName() string { - return a.Name -} - -func (a AttributesRecord) GetAPIGroup() string { - return a.APIGroup -} - -func (a AttributesRecord) GetAPIVersion() string { - return a.APIVersion -} - -func (a AttributesRecord) IsResourceRequest() bool { - return a.ResourceRequest -} - -func (a AttributesRecord) GetPath() string { - return a.Path -} - -type Decision int - -const ( - // DecisionDeny means that an authorizer decided to deny the action. - DecisionDeny Decision = iota - // DecisionAllow means that an authorizer decided to allow the action. - DecisionAllow - // DecisionNoOpionion means that an authorizer has no opinion on whether - // to allow or deny an action. - DecisionNoOpinion -) diff --git a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/rule.go b/vendor/k8s.io/apiserver/pkg/authorization/authorizer/rule.go deleted file mode 100644 index 8f7d9d9e..00000000 --- a/vendor/k8s.io/apiserver/pkg/authorization/authorizer/rule.go +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 authorizer - -type ResourceRuleInfo interface { - // GetVerbs returns a list of kubernetes resource API verbs. - GetVerbs() []string - // GetAPIGroups return the names of the APIGroup that contains the resources. - GetAPIGroups() []string - // GetResources return a list of resources the rule applies to. - GetResources() []string - // GetResourceNames return a white list of names that the rule applies to. - GetResourceNames() []string -} - -// DefaultResourceRuleInfo holds information that describes a rule for the resource -type DefaultResourceRuleInfo struct { - Verbs []string - APIGroups []string - Resources []string - ResourceNames []string -} - -func (i *DefaultResourceRuleInfo) GetVerbs() []string { - return i.Verbs -} - -func (i *DefaultResourceRuleInfo) GetAPIGroups() []string { - return i.APIGroups -} - -func (i *DefaultResourceRuleInfo) GetResources() []string { - return i.Resources -} - -func (i *DefaultResourceRuleInfo) GetResourceNames() []string { - return i.ResourceNames -} - -type NonResourceRuleInfo interface { - // GetVerbs returns a list of kubernetes resource API verbs. - GetVerbs() []string - // GetNonResourceURLs return a set of partial urls that a user should have access to. - GetNonResourceURLs() []string -} - -// DefaultNonResourceRuleInfo holds information that describes a rule for the non-resource -type DefaultNonResourceRuleInfo struct { - Verbs []string - NonResourceURLs []string -} - -func (i *DefaultNonResourceRuleInfo) GetVerbs() []string { - return i.Verbs -} - -func (i *DefaultNonResourceRuleInfo) GetNonResourceURLs() []string { - return i.NonResourceURLs -} diff --git a/vendor/k8s.io/apiserver/pkg/features/BUILD b/vendor/k8s.io/apiserver/pkg/features/BUILD index 1d45a428..711a89f4 100644 --- a/vendor/k8s.io/apiserver/pkg/features/BUILD +++ b/vendor/k8s.io/apiserver/pkg/features/BUILD @@ -8,8 +8,9 @@ load( go_library( name = "go_default_library", srcs = ["kube_features.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/features", importpath = "k8s.io/apiserver/pkg/features", - deps = ["//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library"], + deps = ["//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/apiserver/pkg/features/kube_features.go b/vendor/k8s.io/apiserver/pkg/features/kube_features.go index 57bab8b0..3b692572 100644 --- a/vendor/k8s.io/apiserver/pkg/features/kube_features.go +++ b/vendor/k8s.io/apiserver/pkg/features/kube_features.go @@ -37,6 +37,7 @@ const ( // owner: @tallclair // alpha: v1.7 // beta: v1.8 + // GA: v1.12 // // AdvancedAuditing enables a much more general API auditing pipeline, which includes support for // pluggable output backends and an audit policy specifying how different requests should be @@ -63,6 +64,14 @@ const ( // Allow API clients to retrieve resource lists in chunks rather than // all at once. APIListChunking utilfeature.Feature = "APIListChunking" + + // owner: @apelisse + // alpha: v1.12 + // + // Allow requests to be processed but not stored, so that + // validation, merging, mutation can be tested without + // committing. + DryRun utilfeature.Feature = "DryRun" ) func init() { @@ -74,8 +83,9 @@ func init() { // available throughout Kubernetes binaries. var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureSpec{ StreamingProxyRedirects: {Default: true, PreRelease: utilfeature.Beta}, - AdvancedAuditing: {Default: true, PreRelease: utilfeature.Beta}, + AdvancedAuditing: {Default: true, PreRelease: utilfeature.GA}, APIResponseCompression: {Default: false, PreRelease: utilfeature.Alpha}, Initializers: {Default: false, PreRelease: utilfeature.Alpha}, APIListChunking: {Default: true, PreRelease: utilfeature.Beta}, + DryRun: {Default: false, PreRelease: utilfeature.Alpha}, } diff --git a/vendor/k8s.io/apiserver/pkg/server/BUILD b/vendor/k8s.io/apiserver/pkg/server/BUILD new file mode 100644 index 00000000..c71377a4 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/BUILD @@ -0,0 +1,141 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = [ + "config_selfclient_test.go", + "config_test.go", + "genericapiserver_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/filters:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//vendor/github.com/go-openapi/spec:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "config.go", + "config_selfclient.go", + "deprecated_insecure_serving.go", + "doc.go", + "genericapiserver.go", + "handler.go", + "healthz.go", + "hooks.go", + "plugins.go", + "secure_serving.go", + "signal.go", + "signal_posix.go", + "signal_windows.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server", + importpath = "k8s.io/apiserver/pkg/server", + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/waitgroup:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/initialization:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/apis/apiserver/install:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/audit:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/audit/policy:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/authenticatorfactory:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/request/union:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authorization/authorizerfactory:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authorization/union:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/registry/rest:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/filters:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/healthz:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/routes:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/storage:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/logs:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/util/cert:go_default_library", + "//vendor/github.com/coreos/go-systemd/daemon:go_default_library", + "//vendor/github.com/emicklei/go-restful:go_default_library", + "//vendor/github.com/emicklei/go-restful-swagger12:go_default_library", + "//vendor/github.com/go-openapi/spec:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/pborman/uuid:go_default_library", + "//vendor/golang.org/x/net/http2:go_default_library", + "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/filters:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/healthz:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/httplog:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/mux:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/options:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/resourceconfig:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/routes:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/server/storage:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/vendor/k8s.io/apiserver/pkg/server/config.go b/vendor/k8s.io/apiserver/pkg/server/config.go new file mode 100644 index 00000000..e7b0a8ec --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/config.go @@ -0,0 +1,627 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 server + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "net" + "net/http" + goruntime "runtime" + "sort" + "strconv" + "strings" + "time" + + "github.com/emicklei/go-restful-swagger12" + "github.com/go-openapi/spec" + "github.com/golang/glog" + "github.com/pborman/uuid" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/sets" + utilwaitgroup "k8s.io/apimachinery/pkg/util/waitgroup" + "k8s.io/apimachinery/pkg/version" + "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/audit" + auditpolicy "k8s.io/apiserver/pkg/audit/policy" + "k8s.io/apiserver/pkg/authentication/authenticator" + "k8s.io/apiserver/pkg/authentication/authenticatorfactory" + authenticatorunion "k8s.io/apiserver/pkg/authentication/request/union" + "k8s.io/apiserver/pkg/authentication/user" + "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/apiserver/pkg/authorization/authorizerfactory" + authorizerunion "k8s.io/apiserver/pkg/authorization/union" + "k8s.io/apiserver/pkg/endpoints/discovery" + genericapifilters "k8s.io/apiserver/pkg/endpoints/filters" + apiopenapi "k8s.io/apiserver/pkg/endpoints/openapi" + apirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/apiserver/pkg/features" + genericregistry "k8s.io/apiserver/pkg/registry/generic" + genericfilters "k8s.io/apiserver/pkg/server/filters" + "k8s.io/apiserver/pkg/server/healthz" + "k8s.io/apiserver/pkg/server/routes" + serverstore "k8s.io/apiserver/pkg/server/storage" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/apiserver/pkg/util/logs" + "k8s.io/client-go/informers" + restclient "k8s.io/client-go/rest" + certutil "k8s.io/client-go/util/cert" + openapicommon "k8s.io/kube-openapi/pkg/common" + + // install apis + _ "k8s.io/apiserver/pkg/apis/apiserver/install" +) + +const ( + // DefaultLegacyAPIPrefix is where the legacy APIs will be located. + DefaultLegacyAPIPrefix = "/api" + + // APIGroupPrefix is where non-legacy API group will be located. + APIGroupPrefix = "/apis" +) + +// Config is a structure used to configure a GenericAPIServer. +// Its members are sorted roughly in order of importance for composers. +type Config struct { + // SecureServing is required to serve https + SecureServing *SecureServingInfo + + // Authentication is the configuration for authentication + Authentication AuthenticationInfo + + // Authorization is the configuration for authorization + Authorization AuthorizationInfo + + // LoopbackClientConfig is a config for a privileged loopback connection to the API server + // This is required for proper functioning of the PostStartHooks on a GenericAPIServer + // TODO: move into SecureServing(WithLoopback) as soon as insecure serving is gone + LoopbackClientConfig *restclient.Config + // RuleResolver is required to get the list of rules that apply to a given user + // in a given namespace + RuleResolver authorizer.RuleResolver + // AdmissionControl performs deep inspection of a given request (including content) + // to set values and determine whether its allowed + AdmissionControl admission.Interface + CorsAllowedOriginList []string + + EnableSwaggerUI bool + EnableIndex bool + EnableProfiling bool + EnableDiscovery bool + // Requires generic profiling enabled + EnableContentionProfiling bool + EnableMetrics bool + + DisabledPostStartHooks sets.String + + // Version will enable the /version endpoint if non-nil + Version *version.Info + // AuditBackend is where audit events are sent to. + AuditBackend audit.Backend + // AuditPolicyChecker makes the decision of whether and how to audit log a request. + AuditPolicyChecker auditpolicy.Checker + // ExternalAddress is the host name to use for external (public internet) facing URLs (e.g. Swagger) + // Will default to a value based on secure serving info and available ipv4 IPs. + ExternalAddress string + + //=========================================================================== + // Fields you probably don't care about changing + //=========================================================================== + + // BuildHandlerChainFunc allows you to build custom handler chains by decorating the apiHandler. + BuildHandlerChainFunc func(apiHandler http.Handler, c *Config) (secure http.Handler) + // HandlerChainWaitGroup allows you to wait for all chain handlers exit after the server shutdown. + HandlerChainWaitGroup *utilwaitgroup.SafeWaitGroup + // DiscoveryAddresses is used to build the IPs pass to discovery. If nil, the ExternalAddress is + // always reported + DiscoveryAddresses discovery.Addresses + // The default set of healthz checks. There might be more added via AddHealthzChecks dynamically. + HealthzChecks []healthz.HealthzChecker + // LegacyAPIGroupPrefixes is used to set up URL parsing for authorization and for validating requests + // to InstallLegacyAPIGroup. New API servers don't generally have legacy groups at all. + LegacyAPIGroupPrefixes sets.String + // RequestInfoResolver is used to assign attributes (used by admission and authorization) based on a request URL. + // Use-cases that are like kubelets may need to customize this. + RequestInfoResolver apirequest.RequestInfoResolver + // Serializer is required and provides the interface for serializing and converting objects to and from the wire + // The default (api.Codecs) usually works fine. + Serializer runtime.NegotiatedSerializer + // OpenAPIConfig will be used in generating OpenAPI spec. This is nil by default. Use DefaultOpenAPIConfig for "working" defaults. + OpenAPIConfig *openapicommon.Config + // SwaggerConfig will be used in generating Swagger spec. This is nil by default. Use DefaultSwaggerConfig for "working" defaults. + SwaggerConfig *swagger.Config + + // RESTOptionsGetter is used to construct RESTStorage types via the generic registry. + RESTOptionsGetter genericregistry.RESTOptionsGetter + + // If specified, all requests except those which match the LongRunningFunc predicate will timeout + // after this duration. + RequestTimeout time.Duration + // If specified, long running requests such as watch will be allocated a random timeout between this value, and + // twice this value. Note that it is up to the request handlers to ignore or honor this timeout. In seconds. + MinRequestTimeout int + // MaxRequestsInFlight is the maximum number of parallel non-long-running requests. Every further + // request has to wait. Applies only to non-mutating requests. + MaxRequestsInFlight int + // MaxMutatingRequestsInFlight is the maximum number of parallel mutating requests. Every further + // request has to wait. + MaxMutatingRequestsInFlight int + // Predicate which is true for paths of long-running http requests + LongRunningFunc apirequest.LongRunningRequestCheck + + // EnableAPIResponseCompression indicates whether API Responses should support compression + // if the client requests it via Accept-Encoding + EnableAPIResponseCompression bool + + // MergedResourceConfig indicates which groupVersion enabled and its resources enabled/disabled. + // This is composed of genericapiserver defaultAPIResourceConfig and those parsed from flags. + // If not specify any in flags, then genericapiserver will only enable defaultAPIResourceConfig. + MergedResourceConfig *serverstore.ResourceConfig + + //=========================================================================== + // values below here are targets for removal + //=========================================================================== + + // PublicAddress is the IP address where members of the cluster (kubelet, + // kube-proxy, services, etc.) can reach the GenericAPIServer. + // If nil or 0.0.0.0, the host's default interface will be used. + PublicAddress net.IP +} + +type RecommendedConfig struct { + Config + + // SharedInformerFactory provides shared informers for Kubernetes resources. This value is set by + // RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo. It uses an in-cluster client config + // by default, or the kubeconfig given with kubeconfig command line flag. + SharedInformerFactory informers.SharedInformerFactory + + // ClientConfig holds the kubernetes client configuration. + // This value is set by RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo. + // By default in-cluster client config is used. + ClientConfig *restclient.Config +} + +type SecureServingInfo struct { + // Listener is the secure server network listener. + Listener net.Listener + + // Cert is the main server cert which is used if SNI does not match. Cert must be non-nil and is + // allowed to be in SNICerts. + Cert *tls.Certificate + + // SNICerts are the TLS certificates by name used for SNI. + SNICerts map[string]*tls.Certificate + + // ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates + ClientCA *x509.CertPool + + // MinTLSVersion optionally overrides the minimum TLS version supported. + // Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants). + MinTLSVersion uint16 + + // CipherSuites optionally overrides the list of allowed cipher suites for the server. + // Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants). + CipherSuites []uint16 + + // HTTP2MaxStreamsPerConnection is the limit that the api server imposes on each client. + // A value of zero means to use the default provided by golang's HTTP/2 support. + HTTP2MaxStreamsPerConnection int +} + +type AuthenticationInfo struct { + // Authenticator determines which subject is making the request + Authenticator authenticator.Request + // SupportsBasicAuth indicates that's at least one Authenticator supports basic auth + // If this is true, a basic auth challenge is returned on authentication failure + // TODO(roberthbailey): Remove once the server no longer supports http basic auth. + SupportsBasicAuth bool +} + +type AuthorizationInfo struct { + // Authorizer determines whether the subject is allowed to make the request based only + // on the RequestURI + Authorizer authorizer.Authorizer +} + +// NewConfig returns a Config struct with the default values +func NewConfig(codecs serializer.CodecFactory) *Config { + return &Config{ + Serializer: codecs, + BuildHandlerChainFunc: DefaultBuildHandlerChain, + HandlerChainWaitGroup: new(utilwaitgroup.SafeWaitGroup), + LegacyAPIGroupPrefixes: sets.NewString(DefaultLegacyAPIPrefix), + DisabledPostStartHooks: sets.NewString(), + HealthzChecks: []healthz.HealthzChecker{healthz.PingHealthz, healthz.LogHealthz}, + EnableIndex: true, + EnableDiscovery: true, + EnableProfiling: true, + EnableMetrics: true, + MaxRequestsInFlight: 400, + MaxMutatingRequestsInFlight: 200, + RequestTimeout: time.Duration(60) * time.Second, + MinRequestTimeout: 1800, + EnableAPIResponseCompression: utilfeature.DefaultFeatureGate.Enabled(features.APIResponseCompression), + + // Default to treating watch as a long-running operation + // Generic API servers have no inherent long-running subresources + LongRunningFunc: genericfilters.BasicLongRunningRequestCheck(sets.NewString("watch"), sets.NewString()), + } +} + +// NewRecommendedConfig returns a RecommendedConfig struct with the default values +func NewRecommendedConfig(codecs serializer.CodecFactory) *RecommendedConfig { + return &RecommendedConfig{ + Config: *NewConfig(codecs), + } +} + +func DefaultOpenAPIConfig(getDefinitions openapicommon.GetOpenAPIDefinitions, defNamer *apiopenapi.DefinitionNamer) *openapicommon.Config { + return &openapicommon.Config{ + ProtocolList: []string{"https"}, + IgnorePrefixes: []string{"/swaggerapi"}, + Info: &spec.Info{ + InfoProps: spec.InfoProps{ + Title: "Generic API Server", + }, + }, + DefaultResponse: &spec.Response{ + ResponseProps: spec.ResponseProps{ + Description: "Default Response.", + }, + }, + GetOperationIDAndTags: apiopenapi.GetOperationIDAndTags, + GetDefinitionName: defNamer.GetDefinitionName, + GetDefinitions: getDefinitions, + } +} + +// DefaultSwaggerConfig returns a default configuration without WebServiceURL and +// WebServices set. +func DefaultSwaggerConfig() *swagger.Config { + return &swagger.Config{ + ApiPath: "/swaggerapi", + SwaggerPath: "/swaggerui/", + SwaggerFilePath: "/swagger-ui/", + SchemaFormatHandler: func(typeName string) string { + switch typeName { + case "metav1.Time", "*metav1.Time": + return "date-time" + } + return "" + }, + } +} + +func (c *AuthenticationInfo) ApplyClientCert(clientCAFile string, servingInfo *SecureServingInfo) error { + if servingInfo != nil { + if len(clientCAFile) > 0 { + clientCAs, err := certutil.CertsFromFile(clientCAFile) + if err != nil { + return fmt.Errorf("unable to load client CA file: %v", err) + } + if servingInfo.ClientCA == nil { + servingInfo.ClientCA = x509.NewCertPool() + } + for _, cert := range clientCAs { + servingInfo.ClientCA.AddCert(cert) + } + } + } + + return nil +} + +type completedConfig struct { + *Config + + //=========================================================================== + // values below here are filled in during completion + //=========================================================================== + + // SharedInformerFactory provides shared informers for resources + SharedInformerFactory informers.SharedInformerFactory +} + +type CompletedConfig struct { + // Embed a private pointer that cannot be instantiated outside of this package. + *completedConfig +} + +// Complete fills in any fields not set that are required to have valid data and can be derived +// from other fields. If you're going to `ApplyOptions`, do that first. It's mutating the receiver. +func (c *Config) Complete(informers informers.SharedInformerFactory) CompletedConfig { + if len(c.ExternalAddress) == 0 && c.PublicAddress != nil { + c.ExternalAddress = c.PublicAddress.String() + } + + // if there is no port, and we listen on one securely, use that one + if _, _, err := net.SplitHostPort(c.ExternalAddress); err != nil { + if c.SecureServing == nil { + glog.Fatalf("cannot derive external address port without listening on a secure port.") + } + _, port, err := c.SecureServing.HostPort() + if err != nil { + glog.Fatalf("cannot derive external address from the secure port: %v", err) + } + c.ExternalAddress = net.JoinHostPort(c.ExternalAddress, strconv.Itoa(port)) + } + + if c.OpenAPIConfig != nil { + if c.OpenAPIConfig.SecurityDefinitions != nil { + // Setup OpenAPI security: all APIs will have the same authentication for now. + c.OpenAPIConfig.DefaultSecurity = []map[string][]string{} + keys := []string{} + for k := range *c.OpenAPIConfig.SecurityDefinitions { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + c.OpenAPIConfig.DefaultSecurity = append(c.OpenAPIConfig.DefaultSecurity, map[string][]string{k: {}}) + } + if c.OpenAPIConfig.CommonResponses == nil { + c.OpenAPIConfig.CommonResponses = map[int]spec.Response{} + } + if _, exists := c.OpenAPIConfig.CommonResponses[http.StatusUnauthorized]; !exists { + c.OpenAPIConfig.CommonResponses[http.StatusUnauthorized] = spec.Response{ + ResponseProps: spec.ResponseProps{ + Description: "Unauthorized", + }, + } + } + } + + // make sure we populate info, and info.version, if not manually set + if c.OpenAPIConfig.Info == nil { + c.OpenAPIConfig.Info = &spec.Info{} + } + if c.OpenAPIConfig.Info.Version == "" { + if c.Version != nil { + c.OpenAPIConfig.Info.Version = strings.Split(c.Version.String(), "-")[0] + } else { + c.OpenAPIConfig.Info.Version = "unversioned" + } + } + } + if c.SwaggerConfig != nil && len(c.SwaggerConfig.WebServicesUrl) == 0 { + if c.SecureServing != nil { + c.SwaggerConfig.WebServicesUrl = "https://" + c.ExternalAddress + } else { + c.SwaggerConfig.WebServicesUrl = "http://" + c.ExternalAddress + } + } + if c.DiscoveryAddresses == nil { + c.DiscoveryAddresses = discovery.DefaultAddresses{DefaultAddress: c.ExternalAddress} + } + + AuthorizeClientBearerToken(c.LoopbackClientConfig, &c.Authentication, &c.Authorization) + + if c.RequestInfoResolver == nil { + c.RequestInfoResolver = NewRequestInfoResolver(c) + } + + return CompletedConfig{&completedConfig{c, informers}} +} + +// Complete fills in any fields not set that are required to have valid data and can be derived +// from other fields. If you're going to `ApplyOptions`, do that first. It's mutating the receiver. +func (c *RecommendedConfig) Complete() CompletedConfig { + return c.Config.Complete(c.SharedInformerFactory) +} + +// New creates a new server which logically combines the handling chain with the passed server. +// name is used to differentiate for logging. The handler chain in particular can be difficult as it starts delgating. +// delegationTarget may not be nil. +func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*GenericAPIServer, error) { + if c.Serializer == nil { + return nil, fmt.Errorf("Genericapiserver.New() called with config.Serializer == nil") + } + if c.LoopbackClientConfig == nil { + return nil, fmt.Errorf("Genericapiserver.New() called with config.LoopbackClientConfig == nil") + } + + handlerChainBuilder := func(handler http.Handler) http.Handler { + return c.BuildHandlerChainFunc(handler, c.Config) + } + apiServerHandler := NewAPIServerHandler(name, c.Serializer, handlerChainBuilder, delegationTarget.UnprotectedHandler()) + + s := &GenericAPIServer{ + discoveryAddresses: c.DiscoveryAddresses, + LoopbackClientConfig: c.LoopbackClientConfig, + legacyAPIGroupPrefixes: c.LegacyAPIGroupPrefixes, + admissionControl: c.AdmissionControl, + Serializer: c.Serializer, + AuditBackend: c.AuditBackend, + Authorizer: c.Authorization.Authorizer, + delegationTarget: delegationTarget, + HandlerChainWaitGroup: c.HandlerChainWaitGroup, + + minRequestTimeout: time.Duration(c.MinRequestTimeout) * time.Second, + ShutdownTimeout: c.RequestTimeout, + + SecureServingInfo: c.SecureServing, + ExternalAddress: c.ExternalAddress, + + Handler: apiServerHandler, + + listedPathProvider: apiServerHandler, + + swaggerConfig: c.SwaggerConfig, + openAPIConfig: c.OpenAPIConfig, + + postStartHooks: map[string]postStartHookEntry{}, + preShutdownHooks: map[string]preShutdownHookEntry{}, + disabledPostStartHooks: c.DisabledPostStartHooks, + + healthzChecks: c.HealthzChecks, + + DiscoveryGroupManager: discovery.NewRootAPIsHandler(c.DiscoveryAddresses, c.Serializer), + + enableAPIResponseCompression: c.EnableAPIResponseCompression, + } + + for k, v := range delegationTarget.PostStartHooks() { + s.postStartHooks[k] = v + } + + for k, v := range delegationTarget.PreShutdownHooks() { + s.preShutdownHooks[k] = v + } + + genericApiServerHookName := "generic-apiserver-start-informers" + if c.SharedInformerFactory != nil && !s.isPostStartHookRegistered(genericApiServerHookName) { + err := s.AddPostStartHook(genericApiServerHookName, func(context PostStartHookContext) error { + c.SharedInformerFactory.Start(context.StopCh) + return nil + }) + if err != nil { + return nil, err + } + } + + for _, delegateCheck := range delegationTarget.HealthzChecks() { + skip := false + for _, existingCheck := range c.HealthzChecks { + if existingCheck.Name() == delegateCheck.Name() { + skip = true + break + } + } + if skip { + continue + } + + s.healthzChecks = append(s.healthzChecks, delegateCheck) + } + + s.listedPathProvider = routes.ListedPathProviders{s.listedPathProvider, delegationTarget} + + installAPI(s, c.Config) + + // use the UnprotectedHandler from the delegation target to ensure that we don't attempt to double authenticator, authorize, + // or some other part of the filter chain in delegation cases. + if delegationTarget.UnprotectedHandler() == nil && c.EnableIndex { + s.Handler.NonGoRestfulMux.NotFoundHandler(routes.IndexLister{ + StatusCode: http.StatusNotFound, + PathProvider: s.listedPathProvider, + }) + } + + return s, nil +} + +func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler { + handler := genericapifilters.WithAuthorization(apiHandler, c.Authorization.Authorizer, c.Serializer) + handler = genericfilters.WithMaxInFlightLimit(handler, c.MaxRequestsInFlight, c.MaxMutatingRequestsInFlight, c.LongRunningFunc) + handler = genericapifilters.WithImpersonation(handler, c.Authorization.Authorizer, c.Serializer) + handler = genericapifilters.WithAudit(handler, c.AuditBackend, c.AuditPolicyChecker, c.LongRunningFunc) + failedHandler := genericapifilters.Unauthorized(c.Serializer, c.Authentication.SupportsBasicAuth) + failedHandler = genericapifilters.WithFailedAuthenticationAudit(failedHandler, c.AuditBackend, c.AuditPolicyChecker) + handler = genericapifilters.WithAuthentication(handler, c.Authentication.Authenticator, failedHandler) + handler = genericfilters.WithCORS(handler, c.CorsAllowedOriginList, nil, nil, nil, "true") + handler = genericfilters.WithTimeoutForNonLongRunningRequests(handler, c.LongRunningFunc, c.RequestTimeout) + handler = genericfilters.WithWaitGroup(handler, c.LongRunningFunc, c.HandlerChainWaitGroup) + handler = genericapifilters.WithRequestInfo(handler, c.RequestInfoResolver) + handler = genericfilters.WithPanicRecovery(handler) + return handler +} + +func installAPI(s *GenericAPIServer, c *Config) { + if c.EnableIndex { + routes.Index{}.Install(s.listedPathProvider, s.Handler.NonGoRestfulMux) + } + if c.SwaggerConfig != nil && c.EnableSwaggerUI { + routes.SwaggerUI{}.Install(s.Handler.NonGoRestfulMux) + } + if c.EnableProfiling { + routes.Profiling{}.Install(s.Handler.NonGoRestfulMux) + if c.EnableContentionProfiling { + goruntime.SetBlockProfileRate(1) + } + // so far, only logging related endpoints are considered valid to add for these debug flags. + routes.DebugFlags{}.Install(s.Handler.NonGoRestfulMux, "v", routes.StringFlagPutHandler(logs.GlogSetter)) + } + if c.EnableMetrics { + if c.EnableProfiling { + routes.MetricsWithReset{}.Install(s.Handler.NonGoRestfulMux) + } else { + routes.DefaultMetrics{}.Install(s.Handler.NonGoRestfulMux) + } + } + + routes.Version{Version: c.Version}.Install(s.Handler.GoRestfulContainer) + + if c.EnableDiscovery { + s.Handler.GoRestfulContainer.Add(s.DiscoveryGroupManager.WebService()) + } +} + +func NewRequestInfoResolver(c *Config) *apirequest.RequestInfoFactory { + apiPrefixes := sets.NewString(strings.Trim(APIGroupPrefix, "/")) // all possible API prefixes + legacyAPIPrefixes := sets.String{} // APIPrefixes that won't have groups (legacy) + for legacyAPIPrefix := range c.LegacyAPIGroupPrefixes { + apiPrefixes.Insert(strings.Trim(legacyAPIPrefix, "/")) + legacyAPIPrefixes.Insert(strings.Trim(legacyAPIPrefix, "/")) + } + + return &apirequest.RequestInfoFactory{ + APIPrefixes: apiPrefixes, + GrouplessAPIPrefixes: legacyAPIPrefixes, + } +} + +func (s *SecureServingInfo) HostPort() (string, int, error) { + if s == nil || s.Listener == nil { + return "", 0, fmt.Errorf("no listener found") + } + addr := s.Listener.Addr().String() + host, portStr, err := net.SplitHostPort(addr) + if err != nil { + return "", 0, fmt.Errorf("failed to get port from listener address %q: %v", addr, err) + } + port, err := strconv.Atoi(portStr) + if err != nil { + return "", 0, fmt.Errorf("invalid non-numeric port %q", portStr) + } + return host, port, nil +} + +// AuthorizeClientBearerToken wraps the authenticator and authorizer in loopback authentication logic +// if the loopback client config is specified AND it has a bearer token. +func AuthorizeClientBearerToken(loopback *restclient.Config, authn *AuthenticationInfo, authz *AuthorizationInfo) { + if loopback == nil || authn == nil || authz == nil || authn.Authenticator == nil && authz.Authorizer == nil || len(loopback.BearerToken) == 0 { + return + } + + privilegedLoopbackToken := loopback.BearerToken + var uid = uuid.NewRandom().String() + tokens := make(map[string]*user.DefaultInfo) + tokens[privilegedLoopbackToken] = &user.DefaultInfo{ + Name: user.APIServerUser, + UID: uid, + Groups: []string{user.SystemPrivilegedGroup}, + } + + tokenAuthenticator := authenticatorfactory.NewFromTokens(tokens) + authn.Authenticator = authenticatorunion.New(tokenAuthenticator, authn.Authenticator) + + tokenAuthorizer := authorizerfactory.NewPrivilegedGroups(user.SystemPrivilegedGroup) + authz.Authorizer = authorizerunion.New(tokenAuthorizer, authz.Authorizer) +} diff --git a/vendor/k8s.io/apiserver/pkg/server/config_selfclient.go b/vendor/k8s.io/apiserver/pkg/server/config_selfclient.go new file mode 100644 index 00000000..53f17952 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/config_selfclient.go @@ -0,0 +1,95 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 server + +import ( + "fmt" + "net" + + restclient "k8s.io/client-go/rest" +) + +// LoopbackClientServerNameOverride is passed to the apiserver from the loopback client in order to +// select the loopback certificate via SNI if TLS is used. +const LoopbackClientServerNameOverride = "apiserver-loopback-client" + +func (s *SecureServingInfo) NewClientConfig(caCert []byte) (*restclient.Config, error) { + if s == nil || (s.Cert == nil && len(s.SNICerts) == 0) { + return nil, nil + } + + host, port, err := LoopbackHostPort(s.Listener.Addr().String()) + if err != nil { + return nil, err + } + + return &restclient.Config{ + // Increase QPS limits. The client is currently passed to all admission plugins, + // and those can be throttled in case of higher load on apiserver - see #22340 and #22422 + // for more details. Once #22422 is fixed, we may want to remove it. + QPS: 50, + Burst: 100, + Host: "https://" + net.JoinHostPort(host, port), + // override the ServerName to select our loopback certificate via SNI. This name is also + // used by the client to compare the returns server certificate against. + TLSClientConfig: restclient.TLSClientConfig{ + CAData: caCert, + }, + }, nil +} + +func (s *SecureServingInfo) NewLoopbackClientConfig(token string, loopbackCert []byte) (*restclient.Config, error) { + c, err := s.NewClientConfig(loopbackCert) + if err != nil || c == nil { + return c, err + } + + c.BearerToken = token + c.TLSClientConfig.ServerName = LoopbackClientServerNameOverride + + return c, nil +} + +// LoopbackHostPort returns the host and port loopback REST clients should use +// to contact the server. +func LoopbackHostPort(bindAddress string) (string, string, error) { + host, port, err := net.SplitHostPort(bindAddress) + if err != nil { + // should never happen + return "", "", fmt.Errorf("invalid server bind address: %q", bindAddress) + } + + isIPv6 := net.ParseIP(host).To4() == nil + + // Value is expected to be an IP or DNS name, not "0.0.0.0". + if host == "0.0.0.0" || host == "::" { + host = "localhost" + // Get ip of local interface, but fall back to "localhost". + // Note that "localhost" is resolved with the external nameserver first with Go's stdlib. + // So if localhost. resolves, we don't get a 127.0.0.1 as expected. + addrs, err := net.InterfaceAddrs() + if err == nil { + for _, address := range addrs { + if ipnet, ok := address.(*net.IPNet); ok && ipnet.IP.IsLoopback() && isIPv6 == (ipnet.IP.To4() == nil) { + host = ipnet.IP.String() + break + } + } + } + } + return host, port, nil +} diff --git a/vendor/k8s.io/apiserver/pkg/server/config_selfclient_test.go b/vendor/k8s.io/apiserver/pkg/server/config_selfclient_test.go new file mode 100644 index 00000000..9374403f --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/config_selfclient_test.go @@ -0,0 +1,69 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 server + +import ( + "net" + "testing" +) + +func TestLoopbackHostPort(t *testing.T) { + host, port, err := LoopbackHostPort("1.2.3.4:443") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if host != "1.2.3.4" { + t.Fatalf("expected 1.2.3.4 as host, got %q", host) + } + if port != "443" { + t.Fatalf("expected 443 as port, got %q", port) + } + + host, port, err = LoopbackHostPort("0.0.0.0:443") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if ip := net.ParseIP(host); ip == nil || !ip.IsLoopback() { + t.Fatalf("expected host to be loopback, got %q", host) + } + if port != "443" { + t.Fatalf("expected 443 as port, got %q", port) + } + + host, port, err = LoopbackHostPort("[ff06:0:0:0:0:0:0:c3]:443") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if host != "ff06:0:0:0:0:0:0:c3" { + t.Fatalf("expected ff06:0:0:0:0:0:0:c3 as host, got %q", host) + } + if port != "443" { + t.Fatalf("expected 443 as port, got %q", port) + } + + host, port, err = LoopbackHostPort("[::]:443") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if ip := net.ParseIP(host); ip == nil || !ip.IsLoopback() || ip.To4() != nil { + t.Fatalf("expected IPv6 host to be loopback, got %q", host) + } + + if port != "443" { + t.Fatalf("expected 443 as port, got %q", port) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/config_test.go b/vendor/k8s.io/apiserver/pkg/server/config_test.go new file mode 100644 index 00000000..07fece4c --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/config_test.go @@ -0,0 +1,155 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 server + +import ( + "fmt" + "io/ioutil" + "net" + "net/http" + "net/http/httptest" + "net/http/httputil" + "testing" + + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apiserver/pkg/server/healthz" + "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes/fake" + "k8s.io/client-go/rest" +) + +func TestNewWithDelegate(t *testing.T) { + delegateConfig := NewConfig(codecs) + delegateConfig.ExternalAddress = "192.168.10.4:443" + delegateConfig.PublicAddress = net.ParseIP("192.168.10.4") + delegateConfig.LegacyAPIGroupPrefixes = sets.NewString("/api") + delegateConfig.LoopbackClientConfig = &rest.Config{} + delegateConfig.SwaggerConfig = DefaultSwaggerConfig() + clientset := fake.NewSimpleClientset() + if clientset == nil { + t.Fatal("unable to create fake client set") + } + + delegateConfig.HealthzChecks = append(delegateConfig.HealthzChecks, healthz.NamedCheck("delegate-health", func(r *http.Request) error { + return fmt.Errorf("delegate failed healthcheck") + })) + + sharedInformers := informers.NewSharedInformerFactory(clientset, delegateConfig.LoopbackClientConfig.Timeout) + delegateServer, err := delegateConfig.Complete(sharedInformers).New("test", NewEmptyDelegate()) + if err != nil { + t.Fatal(err) + } + delegateServer.Handler.NonGoRestfulMux.HandleFunc("/foo", func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusForbidden) + }) + + delegateServer.AddPostStartHook("delegate-post-start-hook", func(context PostStartHookContext) error { + return nil + }) + + // this wires up swagger + delegateServer.PrepareRun() + + wrappingConfig := NewConfig(codecs) + wrappingConfig.ExternalAddress = "192.168.10.4:443" + wrappingConfig.PublicAddress = net.ParseIP("192.168.10.4") + wrappingConfig.LegacyAPIGroupPrefixes = sets.NewString("/api") + wrappingConfig.LoopbackClientConfig = &rest.Config{} + wrappingConfig.SwaggerConfig = DefaultSwaggerConfig() + + wrappingConfig.HealthzChecks = append(wrappingConfig.HealthzChecks, healthz.NamedCheck("wrapping-health", func(r *http.Request) error { + return fmt.Errorf("wrapping failed healthcheck") + })) + + sharedInformers = informers.NewSharedInformerFactory(clientset, wrappingConfig.LoopbackClientConfig.Timeout) + wrappingServer, err := wrappingConfig.Complete(sharedInformers).New("test", delegateServer) + if err != nil { + t.Fatal(err) + } + wrappingServer.Handler.NonGoRestfulMux.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusUnauthorized) + }) + + wrappingServer.AddPostStartHook("wrapping-post-start-hook", func(context PostStartHookContext) error { + return nil + }) + + stopCh := make(chan struct{}) + defer close(stopCh) + wrappingServer.PrepareRun() + wrappingServer.RunPostStartHooks(stopCh) + + server := httptest.NewServer(wrappingServer.Handler) + defer server.Close() + + checkPath(server.URL, http.StatusOK, `{ + "paths": [ + "/apis", + "/bar", + "/foo", + "/healthz", + "/healthz/delegate-health", + "/healthz/log", + "/healthz/ping", + "/healthz/poststarthook/delegate-post-start-hook", + "/healthz/poststarthook/generic-apiserver-start-informers", + "/healthz/poststarthook/wrapping-post-start-hook", + "/healthz/wrapping-health", + "/metrics", + "/swaggerapi" + ] +}`, t) + checkPath(server.URL+"/healthz", http.StatusInternalServerError, `[+]ping ok +[+]log ok +[-]wrapping-health failed: reason withheld +[-]delegate-health failed: reason withheld +[+]poststarthook/generic-apiserver-start-informers ok +[+]poststarthook/delegate-post-start-hook ok +[+]poststarthook/wrapping-post-start-hook ok +healthz check failed +`, t) + + checkPath(server.URL+"/healthz/delegate-health", http.StatusInternalServerError, `internal server error: delegate failed healthcheck +`, t) + checkPath(server.URL+"/healthz/wrapping-health", http.StatusInternalServerError, `internal server error: wrapping failed healthcheck +`, t) + checkPath(server.URL+"/healthz/poststarthook/delegate-post-start-hook", http.StatusOK, `ok`, t) + checkPath(server.URL+"/healthz/poststarthook/wrapping-post-start-hook", http.StatusOK, `ok`, t) + checkPath(server.URL+"/foo", http.StatusForbidden, ``, t) + checkPath(server.URL+"/bar", http.StatusUnauthorized, ``, t) +} + +func checkPath(url string, expectedStatusCode int, expectedBody string, t *testing.T) { + resp, err := http.Get(url) + if err != nil { + t.Fatal(err) + } + dump, _ := httputil.DumpResponse(resp, true) + t.Log(string(dump)) + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + if e, a := expectedBody, string(body); e != a { + t.Errorf("%q expected %v, got %v", url, e, a) + } + if e, a := expectedStatusCode, resp.StatusCode; e != a { + t.Errorf("%q expected %v, got %v", url, e, a) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go b/vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go new file mode 100644 index 00000000..2af16bf9 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go @@ -0,0 +1,85 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 server + +import ( + "net" + "net/http" + "time" + + "github.com/golang/glog" + + "k8s.io/apiserver/pkg/authentication/user" + "k8s.io/client-go/rest" +) + +// DeprecatedInsecureServingInfo is the main context object for the insecure http server. +type DeprecatedInsecureServingInfo struct { + // Listener is the secure server network listener. + Listener net.Listener + // optional server name for log messages + Name string +} + +// Serve starts an insecure http server with the given handler. It fails only if +// the initial listen call fails. It does not block. +func (s *DeprecatedInsecureServingInfo) Serve(handler http.Handler, shutdownTimeout time.Duration, stopCh <-chan struct{}) error { + insecureServer := &http.Server{ + Addr: s.Listener.Addr().String(), + Handler: handler, + MaxHeaderBytes: 1 << 20, + } + + if len(s.Name) > 0 { + glog.Infof("Serving %s insecurely on %s", s.Name, s.Listener.Addr()) + } else { + glog.Infof("Serving insecurely on %s", s.Listener.Addr()) + } + return RunServer(insecureServer, s.Listener, shutdownTimeout, stopCh) +} + +func (s *DeprecatedInsecureServingInfo) NewLoopbackClientConfig() (*rest.Config, error) { + if s == nil { + return nil, nil + } + + host, port, err := LoopbackHostPort(s.Listener.Addr().String()) + if err != nil { + return nil, err + } + + return &rest.Config{ + Host: "http://" + net.JoinHostPort(host, port), + // Increase QPS limits. The client is currently passed to all admission plugins, + // and those can be throttled in case of higher load on apiserver - see #22340 and #22422 + // for more details. Once #22422 is fixed, we may want to remove it. + QPS: 50, + Burst: 100, + }, nil +} + +// InsecureSuperuser implements authenticator.Request to always return a superuser. +// This is functionally equivalent to skipping authentication and authorization, +// but allows apiserver code to stop special-casing a nil user to skip authorization checks. +type InsecureSuperuser struct{} + +func (InsecureSuperuser) AuthenticateRequest(req *http.Request) (user.Info, bool, error) { + return &user.DefaultInfo{ + Name: "system:unsecured", + Groups: []string{user.SystemPrivilegedGroup, user.AllAuthenticated}, + }, true, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/probe/probe.go b/vendor/k8s.io/apiserver/pkg/server/doc.go similarity index 81% rename from vendor/k8s.io/kubernetes/pkg/probe/probe.go rename to vendor/k8s.io/apiserver/pkg/server/doc.go index ebbb607c..b5f97c65 100644 --- a/vendor/k8s.io/kubernetes/pkg/probe/probe.go +++ b/vendor/k8s.io/apiserver/pkg/server/doc.go @@ -14,12 +14,5 @@ See the License for the specific language governing permissions and limitations under the License. */ -package probe - -type Result string - -const ( - Success Result = "success" - Failure Result = "failure" - Unknown Result = "unknown" -) +// Package server contains the plumbing to create kubernetes-like API server command. +package server diff --git a/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go b/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go new file mode 100644 index 00000000..b6e500c6 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go @@ -0,0 +1,447 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 server + +import ( + "fmt" + "net/http" + "strings" + "sync" + "time" + + systemd "github.com/coreos/go-systemd/daemon" + "github.com/emicklei/go-restful-swagger12" + "github.com/golang/glog" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/sets" + utilwaitgroup "k8s.io/apimachinery/pkg/util/waitgroup" + "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/audit" + "k8s.io/apiserver/pkg/authorization/authorizer" + genericapi "k8s.io/apiserver/pkg/endpoints" + "k8s.io/apiserver/pkg/endpoints/discovery" + "k8s.io/apiserver/pkg/registry/rest" + "k8s.io/apiserver/pkg/server/healthz" + "k8s.io/apiserver/pkg/server/routes" + restclient "k8s.io/client-go/rest" + openapicommon "k8s.io/kube-openapi/pkg/common" +) + +// Info about an API group. +type APIGroupInfo struct { + PrioritizedVersions []schema.GroupVersion + // Info about the resources in this group. It's a map from version to resource to the storage. + VersionedResourcesStorageMap map[string]map[string]rest.Storage + // OptionsExternalVersion controls the APIVersion used for common objects in the + // schema like api.Status, api.DeleteOptions, and metav1.ListOptions. Other implementors may + // define a version "v1beta1" but want to use the Kubernetes "v1" internal objects. + // If nil, defaults to groupMeta.GroupVersion. + // TODO: Remove this when https://github.com/kubernetes/kubernetes/issues/19018 is fixed. + OptionsExternalVersion *schema.GroupVersion + // MetaGroupVersion defaults to "meta.k8s.io/v1" and is the scheme group version used to decode + // common API implementations like ListOptions. Future changes will allow this to vary by group + // version (for when the inevitable meta/v2 group emerges). + MetaGroupVersion *schema.GroupVersion + + // Scheme includes all of the types used by this group and how to convert between them (or + // to convert objects from outside of this group that are accepted in this API). + // TODO: replace with interfaces + Scheme *runtime.Scheme + // NegotiatedSerializer controls how this group encodes and decodes data + NegotiatedSerializer runtime.NegotiatedSerializer + // ParameterCodec performs conversions for query parameters passed to API calls + ParameterCodec runtime.ParameterCodec +} + +// GenericAPIServer contains state for a Kubernetes cluster api server. +type GenericAPIServer struct { + // discoveryAddresses is used to build cluster IPs for discovery. + discoveryAddresses discovery.Addresses + + // LoopbackClientConfig is a config for a privileged loopback connection to the API server + LoopbackClientConfig *restclient.Config + + // minRequestTimeout is how short the request timeout can be. This is used to build the RESTHandler + minRequestTimeout time.Duration + + // ShutdownTimeout is the timeout used for server shutdown. This specifies the timeout before server + // gracefully shutdown returns. + ShutdownTimeout time.Duration + + // legacyAPIGroupPrefixes is used to set up URL parsing for authorization and for validating requests + // to InstallLegacyAPIGroup + legacyAPIGroupPrefixes sets.String + + // admissionControl is used to build the RESTStorage that backs an API Group. + admissionControl admission.Interface + + // SecureServingInfo holds configuration of the TLS server. + SecureServingInfo *SecureServingInfo + + // ExternalAddress is the address (hostname or IP and port) that should be used in + // external (public internet) URLs for this GenericAPIServer. + ExternalAddress string + + // Serializer controls how common API objects not in a group/version prefix are serialized for this server. + // Individual APIGroups may define their own serializers. + Serializer runtime.NegotiatedSerializer + + // "Outputs" + // Handler holds the handlers being used by this API server + Handler *APIServerHandler + + // listedPathProvider is a lister which provides the set of paths to show at / + listedPathProvider routes.ListedPathProvider + + // DiscoveryGroupManager serves /apis + DiscoveryGroupManager discovery.GroupManager + + // Enable swagger and/or OpenAPI if these configs are non-nil. + swaggerConfig *swagger.Config + openAPIConfig *openapicommon.Config + + // PostStartHooks are each called after the server has started listening, in a separate go func for each + // with no guarantee of ordering between them. The map key is a name used for error reporting. + // It may kill the process with a panic if it wishes to by returning an error. + postStartHookLock sync.Mutex + postStartHooks map[string]postStartHookEntry + postStartHooksCalled bool + disabledPostStartHooks sets.String + + preShutdownHookLock sync.Mutex + preShutdownHooks map[string]preShutdownHookEntry + preShutdownHooksCalled bool + + // healthz checks + healthzLock sync.Mutex + healthzChecks []healthz.HealthzChecker + healthzCreated bool + + // auditing. The backend is started after the server starts listening. + AuditBackend audit.Backend + + // Authorizer determines whether a user is allowed to make a certain request. The Handler does a preliminary + // authorization check using the request URI but it may be necessary to make additional checks, such as in + // the create-on-update case + Authorizer authorizer.Authorizer + + // enableAPIResponseCompression indicates whether API Responses should support compression + // if the client requests it via Accept-Encoding + enableAPIResponseCompression bool + + // delegationTarget is the next delegate in the chain. This is never nil. + delegationTarget DelegationTarget + + // HandlerChainWaitGroup allows you to wait for all chain handlers finish after the server shutdown. + HandlerChainWaitGroup *utilwaitgroup.SafeWaitGroup +} + +// DelegationTarget is an interface which allows for composition of API servers with top level handling that works +// as expected. +type DelegationTarget interface { + // UnprotectedHandler returns a handler that is NOT protected by a normal chain + UnprotectedHandler() http.Handler + + // PostStartHooks returns the post-start hooks that need to be combined + PostStartHooks() map[string]postStartHookEntry + + // PreShutdownHooks returns the pre-stop hooks that need to be combined + PreShutdownHooks() map[string]preShutdownHookEntry + + // HealthzChecks returns the healthz checks that need to be combined + HealthzChecks() []healthz.HealthzChecker + + // ListedPaths returns the paths for supporting an index + ListedPaths() []string + + // NextDelegate returns the next delegationTarget in the chain of delegations + NextDelegate() DelegationTarget +} + +func (s *GenericAPIServer) UnprotectedHandler() http.Handler { + // when we delegate, we need the server we're delegating to choose whether or not to use gorestful + return s.Handler.Director +} +func (s *GenericAPIServer) PostStartHooks() map[string]postStartHookEntry { + return s.postStartHooks +} +func (s *GenericAPIServer) PreShutdownHooks() map[string]preShutdownHookEntry { + return s.preShutdownHooks +} +func (s *GenericAPIServer) HealthzChecks() []healthz.HealthzChecker { + return s.healthzChecks +} +func (s *GenericAPIServer) ListedPaths() []string { + return s.listedPathProvider.ListedPaths() +} + +func (s *GenericAPIServer) NextDelegate() DelegationTarget { + return s.delegationTarget +} + +type emptyDelegate struct { +} + +func NewEmptyDelegate() DelegationTarget { + return emptyDelegate{} +} + +func (s emptyDelegate) UnprotectedHandler() http.Handler { + return nil +} +func (s emptyDelegate) PostStartHooks() map[string]postStartHookEntry { + return map[string]postStartHookEntry{} +} +func (s emptyDelegate) PreShutdownHooks() map[string]preShutdownHookEntry { + return map[string]preShutdownHookEntry{} +} +func (s emptyDelegate) HealthzChecks() []healthz.HealthzChecker { + return []healthz.HealthzChecker{} +} +func (s emptyDelegate) ListedPaths() []string { + return []string{} +} +func (s emptyDelegate) NextDelegate() DelegationTarget { + return nil +} + +// preparedGenericAPIServer is a private wrapper that enforces a call of PrepareRun() before Run can be invoked. +type preparedGenericAPIServer struct { + *GenericAPIServer +} + +// PrepareRun does post API installation setup steps. +func (s *GenericAPIServer) PrepareRun() preparedGenericAPIServer { + if s.swaggerConfig != nil { + routes.Swagger{Config: s.swaggerConfig}.Install(s.Handler.GoRestfulContainer) + } + if s.openAPIConfig != nil { + routes.OpenAPI{ + Config: s.openAPIConfig, + }.Install(s.Handler.GoRestfulContainer, s.Handler.NonGoRestfulMux) + } + + s.installHealthz() + + // Register audit backend preShutdownHook. + if s.AuditBackend != nil { + s.AddPreShutdownHook("audit-backend", func() error { + s.AuditBackend.Shutdown() + return nil + }) + } + + return preparedGenericAPIServer{s} +} + +// Run spawns the secure http server. It only returns if stopCh is closed +// or the secure port cannot be listened on initially. +func (s preparedGenericAPIServer) Run(stopCh <-chan struct{}) error { + err := s.NonBlockingRun(stopCh) + if err != nil { + return err + } + + <-stopCh + + err = s.RunPreShutdownHooks() + if err != nil { + return err + } + + // Wait for all requests to finish, which are bounded by the RequestTimeout variable. + s.HandlerChainWaitGroup.Wait() + + return nil +} + +// NonBlockingRun spawns the secure http server. An error is +// returned if the secure port cannot be listened on. +func (s preparedGenericAPIServer) NonBlockingRun(stopCh <-chan struct{}) error { + // Use an stop channel to allow graceful shutdown without dropping audit events + // after http server shutdown. + auditStopCh := make(chan struct{}) + + // Start the audit backend before any request comes in. This means we must call Backend.Run + // before http server start serving. Otherwise the Backend.ProcessEvents call might block. + if s.AuditBackend != nil { + if err := s.AuditBackend.Run(auditStopCh); err != nil { + return fmt.Errorf("failed to run the audit backend: %v", err) + } + } + + // Use an internal stop channel to allow cleanup of the listeners on error. + internalStopCh := make(chan struct{}) + + if s.SecureServingInfo != nil && s.Handler != nil { + if err := s.SecureServingInfo.Serve(s.Handler, s.ShutdownTimeout, internalStopCh); err != nil { + close(internalStopCh) + return err + } + } + + // Now that listener have bound successfully, it is the + // responsibility of the caller to close the provided channel to + // ensure cleanup. + go func() { + <-stopCh + close(internalStopCh) + s.HandlerChainWaitGroup.Wait() + close(auditStopCh) + }() + + s.RunPostStartHooks(stopCh) + + if _, err := systemd.SdNotify(true, "READY=1\n"); err != nil { + glog.Errorf("Unable to send systemd daemon successful start message: %v\n", err) + } + + return nil +} + +// installAPIResources is a private method for installing the REST storage backing each api groupversionresource +func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo) error { + for _, groupVersion := range apiGroupInfo.PrioritizedVersions { + if len(apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version]) == 0 { + glog.Warningf("Skipping API %v because it has no resources.", groupVersion) + continue + } + + apiGroupVersion := s.getAPIGroupVersion(apiGroupInfo, groupVersion, apiPrefix) + if apiGroupInfo.OptionsExternalVersion != nil { + apiGroupVersion.OptionsExternalVersion = apiGroupInfo.OptionsExternalVersion + } + + if err := apiGroupVersion.InstallREST(s.Handler.GoRestfulContainer); err != nil { + return fmt.Errorf("unable to setup API %v: %v", apiGroupInfo, err) + } + } + + return nil +} + +func (s *GenericAPIServer) InstallLegacyAPIGroup(apiPrefix string, apiGroupInfo *APIGroupInfo) error { + if !s.legacyAPIGroupPrefixes.Has(apiPrefix) { + return fmt.Errorf("%q is not in the allowed legacy API prefixes: %v", apiPrefix, s.legacyAPIGroupPrefixes.List()) + } + if err := s.installAPIResources(apiPrefix, apiGroupInfo); err != nil { + return err + } + + // Install the version handler. + // Add a handler at / to enumerate the supported api versions. + s.Handler.GoRestfulContainer.Add(discovery.NewLegacyRootAPIHandler(s.discoveryAddresses, s.Serializer, apiPrefix).WebService()) + + return nil +} + +// Exposes the given api group in the API. +func (s *GenericAPIServer) InstallAPIGroup(apiGroupInfo *APIGroupInfo) error { + // Do not register empty group or empty version. Doing so claims /apis/ for the wrong entity to be returned. + // Catching these here places the error much closer to its origin + if len(apiGroupInfo.PrioritizedVersions[0].Group) == 0 { + return fmt.Errorf("cannot register handler with an empty group for %#v", *apiGroupInfo) + } + if len(apiGroupInfo.PrioritizedVersions[0].Version) == 0 { + return fmt.Errorf("cannot register handler with an empty version for %#v", *apiGroupInfo) + } + + if err := s.installAPIResources(APIGroupPrefix, apiGroupInfo); err != nil { + return err + } + + // setup discovery + // Install the version handler. + // Add a handler at /apis/ to enumerate all versions supported by this group. + apiVersionsForDiscovery := []metav1.GroupVersionForDiscovery{} + for _, groupVersion := range apiGroupInfo.PrioritizedVersions { + // Check the config to make sure that we elide versions that don't have any resources + if len(apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version]) == 0 { + continue + } + apiVersionsForDiscovery = append(apiVersionsForDiscovery, metav1.GroupVersionForDiscovery{ + GroupVersion: groupVersion.String(), + Version: groupVersion.Version, + }) + } + preferredVersionForDiscovery := metav1.GroupVersionForDiscovery{ + GroupVersion: apiGroupInfo.PrioritizedVersions[0].String(), + Version: apiGroupInfo.PrioritizedVersions[0].Version, + } + apiGroup := metav1.APIGroup{ + Name: apiGroupInfo.PrioritizedVersions[0].Group, + Versions: apiVersionsForDiscovery, + PreferredVersion: preferredVersionForDiscovery, + } + + s.DiscoveryGroupManager.AddGroup(apiGroup) + s.Handler.GoRestfulContainer.Add(discovery.NewAPIGroupHandler(s.Serializer, apiGroup).WebService()) + + return nil +} + +func (s *GenericAPIServer) getAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupVersion schema.GroupVersion, apiPrefix string) *genericapi.APIGroupVersion { + storage := make(map[string]rest.Storage) + for k, v := range apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version] { + storage[strings.ToLower(k)] = v + } + version := s.newAPIGroupVersion(apiGroupInfo, groupVersion) + version.Root = apiPrefix + version.Storage = storage + return version +} + +func (s *GenericAPIServer) newAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupVersion schema.GroupVersion) *genericapi.APIGroupVersion { + return &genericapi.APIGroupVersion{ + GroupVersion: groupVersion, + MetaGroupVersion: apiGroupInfo.MetaGroupVersion, + + ParameterCodec: apiGroupInfo.ParameterCodec, + Serializer: apiGroupInfo.NegotiatedSerializer, + Creater: apiGroupInfo.Scheme, + Convertor: apiGroupInfo.Scheme, + UnsafeConvertor: runtime.UnsafeObjectConvertor(apiGroupInfo.Scheme), + Defaulter: apiGroupInfo.Scheme, + Typer: apiGroupInfo.Scheme, + Linker: runtime.SelfLinker(meta.NewAccessor()), + + Admit: s.admissionControl, + MinRequestTimeout: s.minRequestTimeout, + EnableAPIResponseCompression: s.enableAPIResponseCompression, + OpenAPIConfig: s.openAPIConfig, + Authorizer: s.Authorizer, + } +} + +// NewDefaultAPIGroupInfo returns an APIGroupInfo stubbed with "normal" values +// exposed for easier composition from other packages +func NewDefaultAPIGroupInfo(group string, scheme *runtime.Scheme, parameterCodec runtime.ParameterCodec, codecs serializer.CodecFactory) APIGroupInfo { + return APIGroupInfo{ + PrioritizedVersions: scheme.PrioritizedVersionsForGroup(group), + VersionedResourcesStorageMap: map[string]map[string]rest.Storage{}, + // TODO unhardcode this. It was hardcoded before, but we need to re-evaluate + OptionsExternalVersion: &schema.GroupVersion{Version: "v1"}, + Scheme: scheme, + ParameterCodec: parameterCodec, + NegotiatedSerializer: codecs, + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/genericapiserver_test.go b/vendor/k8s.io/apiserver/pkg/server/genericapiserver_test.go new file mode 100644 index 00000000..a3dda1a4 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/genericapiserver_test.go @@ -0,0 +1,582 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 server + +import ( + "context" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/http/httptest" + goruntime "runtime" + "strconv" + "sync" + "testing" + "time" + + openapi "github.com/go-openapi/spec" + "github.com/stretchr/testify/assert" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/version" + "k8s.io/apiserver/pkg/apis/example" + examplev1 "k8s.io/apiserver/pkg/apis/example/v1" + "k8s.io/apiserver/pkg/authorization/authorizer" + "k8s.io/apiserver/pkg/endpoints/discovery" + genericapifilters "k8s.io/apiserver/pkg/endpoints/filters" + openapinamer "k8s.io/apiserver/pkg/endpoints/openapi" + "k8s.io/apiserver/pkg/registry/rest" + genericfilters "k8s.io/apiserver/pkg/server/filters" + "k8s.io/client-go/informers" + "k8s.io/client-go/kubernetes/fake" + restclient "k8s.io/client-go/rest" + kubeopenapi "k8s.io/kube-openapi/pkg/common" +) + +const ( + extensionsGroupName = "extensions" +) + +var ( + v1GroupVersion = schema.GroupVersion{Group: "", Version: "v1"} + + scheme = runtime.NewScheme() + codecs = serializer.NewCodecFactory(scheme) + parameterCodec = runtime.NewParameterCodec(scheme) +) + +func init() { + metav1.AddToGroupVersion(scheme, metav1.SchemeGroupVersion) + scheme.AddUnversionedTypes(v1GroupVersion, + &metav1.Status{}, + &metav1.APIVersions{}, + &metav1.APIGroupList{}, + &metav1.APIGroup{}, + &metav1.APIResourceList{}, + ) + utilruntime.Must(example.AddToScheme(scheme)) + utilruntime.Must(examplev1.AddToScheme(scheme)) +} + +func buildTestOpenAPIDefinition() kubeopenapi.OpenAPIDefinition { + return kubeopenapi.OpenAPIDefinition{ + Schema: openapi.Schema{ + SchemaProps: openapi.SchemaProps{ + Description: "Description", + Properties: map[string]openapi.Schema{}, + }, + VendorExtensible: openapi.VendorExtensible{ + Extensions: openapi.Extensions{ + "x-kubernetes-group-version-kind": []map[string]string{ + { + "group": "", + "version": "v1", + "kind": "Getter", + }, + { + "group": "batch", + "version": "v1", + "kind": "Getter", + }, + { + "group": "extensions", + "version": "v1", + "kind": "Getter", + }, + }, + }, + }, + }, + } +} + +func testGetOpenAPIDefinitions(_ kubeopenapi.ReferenceCallback) map[string]kubeopenapi.OpenAPIDefinition { + return map[string]kubeopenapi.OpenAPIDefinition{ + "k8s.io/apimachinery/pkg/apis/meta/v1.Status": {}, + "k8s.io/apimachinery/pkg/apis/meta/v1.APIVersions": {}, + "k8s.io/apimachinery/pkg/apis/meta/v1.APIGroupList": {}, + "k8s.io/apimachinery/pkg/apis/meta/v1.APIGroup": buildTestOpenAPIDefinition(), + "k8s.io/apimachinery/pkg/apis/meta/v1.APIResourceList": {}, + } +} + +// setUp is a convience function for setting up for (most) tests. +func setUp(t *testing.T) (Config, *assert.Assertions) { + config := NewConfig(codecs) + config.ExternalAddress = "192.168.10.4:443" + config.PublicAddress = net.ParseIP("192.168.10.4") + config.LegacyAPIGroupPrefixes = sets.NewString("/api") + config.LoopbackClientConfig = &restclient.Config{} + + clientset := fake.NewSimpleClientset() + if clientset == nil { + t.Fatal("unable to create fake client set") + } + + config.OpenAPIConfig = DefaultOpenAPIConfig(testGetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(runtime.NewScheme())) + config.OpenAPIConfig.Info.Version = "unversioned" + config.SwaggerConfig = DefaultSwaggerConfig() + sharedInformers := informers.NewSharedInformerFactory(clientset, config.LoopbackClientConfig.Timeout) + config.Complete(sharedInformers) + + return *config, assert.New(t) +} + +func newMaster(t *testing.T) (*GenericAPIServer, Config, *assert.Assertions) { + config, assert := setUp(t) + + s, err := config.Complete(nil).New("test", NewEmptyDelegate()) + if err != nil { + t.Fatalf("Error in bringing up the server: %v", err) + } + return s, config, assert +} + +// TestNew verifies that the New function returns a GenericAPIServer +// using the configuration properly. +func TestNew(t *testing.T) { + s, config, assert := newMaster(t) + + // Verify many of the variables match their config counterparts + assert.Equal(s.legacyAPIGroupPrefixes, config.LegacyAPIGroupPrefixes) + assert.Equal(s.admissionControl, config.AdmissionControl) + + // these values get defaulted + assert.Equal(net.JoinHostPort(config.PublicAddress.String(), "443"), s.ExternalAddress) + assert.NotNil(s.swaggerConfig) + assert.Equal("http://"+s.ExternalAddress, s.swaggerConfig.WebServicesUrl) +} + +// Verifies that AddGroupVersions works as expected. +func TestInstallAPIGroups(t *testing.T) { + config, assert := setUp(t) + + config.LegacyAPIGroupPrefixes = sets.NewString("/apiPrefix") + config.DiscoveryAddresses = discovery.DefaultAddresses{DefaultAddress: "ExternalAddress"} + + s, err := config.Complete(nil).New("test", NewEmptyDelegate()) + if err != nil { + t.Fatalf("Error in bringing up the server: %v", err) + } + + testAPI := func(gv schema.GroupVersion) APIGroupInfo { + getter, noVerbs := testGetterStorage{}, testNoVerbsStorage{} + + scheme := runtime.NewScheme() + scheme.AddKnownTypeWithName(gv.WithKind("Getter"), getter.New()) + scheme.AddKnownTypeWithName(gv.WithKind("NoVerb"), noVerbs.New()) + scheme.AddKnownTypes(v1GroupVersion, &metav1.Status{}) + metav1.AddToGroupVersion(scheme, v1GroupVersion) + + return APIGroupInfo{ + PrioritizedVersions: []schema.GroupVersion{gv}, + VersionedResourcesStorageMap: map[string]map[string]rest.Storage{ + gv.Version: { + "getter": &testGetterStorage{Version: gv.Version}, + "noverbs": &testNoVerbsStorage{Version: gv.Version}, + }, + }, + OptionsExternalVersion: &schema.GroupVersion{Version: "v1"}, + ParameterCodec: parameterCodec, + NegotiatedSerializer: codecs, + Scheme: scheme, + } + } + + apis := []APIGroupInfo{ + testAPI(schema.GroupVersion{Group: "", Version: "v1"}), + testAPI(schema.GroupVersion{Group: extensionsGroupName, Version: "v1"}), + testAPI(schema.GroupVersion{Group: "batch", Version: "v1"}), + } + + err = s.InstallLegacyAPIGroup("/apiPrefix", &apis[0]) + assert.NoError(err) + groupPaths := []string{ + config.LegacyAPIGroupPrefixes.List()[0], // /apiPrefix + } + for _, api := range apis[1:] { + err = s.InstallAPIGroup(&api) + assert.NoError(err) + groupPaths = append(groupPaths, APIGroupPrefix+"/"+api.PrioritizedVersions[0].Group) // /apis/ + } + + server := httptest.NewServer(s.Handler) + defer server.Close() + + for i := range apis { + // should serve APIGroup at group path + info := &apis[i] + path := groupPaths[i] + resp, err := http.Get(server.URL + path) + if err != nil { + t.Errorf("[%d] unexpected error getting path %q path: %v", i, path, err) + continue + } + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + t.Errorf("[%d] unexpected error reading body at path %q: %v", i, path, err) + continue + } + + t.Logf("[%d] json at %s: %s", i, path, string(body)) + + if i == 0 { + // legacy API returns APIVersions + group := metav1.APIVersions{} + err = json.Unmarshal(body, &group) + if err != nil { + t.Errorf("[%d] unexpected error parsing json body at path %q: %v", i, path, err) + continue + } + } else { + // API groups return APIGroup + group := metav1.APIGroup{} + err = json.Unmarshal(body, &group) + if err != nil { + t.Errorf("[%d] unexpected error parsing json body at path %q: %v", i, path, err) + continue + } + + if got, expected := group.Name, info.PrioritizedVersions[0].Group; got != expected { + t.Errorf("[%d] unexpected group name at path %q: got=%q expected=%q", i, path, got, expected) + continue + } + + if got, expected := group.PreferredVersion.Version, info.PrioritizedVersions[0].Version; got != expected { + t.Errorf("[%d] unexpected group version at path %q: got=%q expected=%q", i, path, got, expected) + continue + } + } + + // should serve APIResourceList at group path + / + path = path + "/" + info.PrioritizedVersions[0].Version + resp, err = http.Get(server.URL + path) + if err != nil { + t.Errorf("[%d] unexpected error getting path %q path: %v", i, path, err) + continue + } + + body, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Errorf("[%d] unexpected error reading body at path %q: %v", i, path, err) + continue + } + + t.Logf("[%d] json at %s: %s", i, path, string(body)) + + resources := metav1.APIResourceList{} + err = json.Unmarshal(body, &resources) + if err != nil { + t.Errorf("[%d] unexpected error parsing json body at path %q: %v", i, path, err) + continue + } + + if got, expected := resources.GroupVersion, info.PrioritizedVersions[0].String(); got != expected { + t.Errorf("[%d] unexpected groupVersion at path %q: got=%q expected=%q", i, path, got, expected) + continue + } + + // the verbs should match the features of resources + for _, r := range resources.APIResources { + switch r.Name { + case "getter": + if got, expected := sets.NewString([]string(r.Verbs)...), sets.NewString("get"); !got.Equal(expected) { + t.Errorf("[%d] unexpected verbs for resource %s/%s: got=%v expected=%v", i, resources.GroupVersion, r.Name, got, expected) + } + case "noverbs": + if r.Verbs == nil { + t.Errorf("[%d] unexpected nil verbs slice. Expected: []string{}", i) + } + if got, expected := sets.NewString([]string(r.Verbs)...), sets.NewString(); !got.Equal(expected) { + t.Errorf("[%d] unexpected verbs for resource %s/%s: got=%v expected=%v", i, resources.GroupVersion, r.Name, got, expected) + } + } + } + } +} + +func TestPrepareRun(t *testing.T) { + s, config, assert := newMaster(t) + + assert.NotNil(config.SwaggerConfig) + + server := httptest.NewServer(s.Handler.Director) + defer server.Close() + done := make(chan struct{}) + + s.PrepareRun() + s.RunPostStartHooks(done) + + // swagger is installed in PrepareRun + resp, err := http.Get(server.URL + "/swaggerapi/") + assert.NoError(err) + assert.Equal(http.StatusOK, resp.StatusCode) + + // healthz checks are installed in PrepareRun + resp, err = http.Get(server.URL + "/healthz") + assert.NoError(err) + assert.Equal(http.StatusOK, resp.StatusCode) + resp, err = http.Get(server.URL + "/healthz/ping") + assert.NoError(err) + assert.Equal(http.StatusOK, resp.StatusCode) +} + +// TestCustomHandlerChain verifies the handler chain with custom handler chain builder functions. +func TestCustomHandlerChain(t *testing.T) { + config, _ := setUp(t) + + var protected, called bool + + config.BuildHandlerChainFunc = func(apiHandler http.Handler, c *Config) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + protected = true + apiHandler.ServeHTTP(w, req) + }) + } + handler := http.HandlerFunc(func(r http.ResponseWriter, req *http.Request) { + called = true + }) + + s, err := config.Complete(nil).New("test", NewEmptyDelegate()) + if err != nil { + t.Fatalf("Error in bringing up the server: %v", err) + } + + s.Handler.NonGoRestfulMux.Handle("/nonswagger", handler) + s.Handler.NonGoRestfulMux.Handle("/secret", handler) + + type Test struct { + handler http.Handler + path string + protected bool + } + for i, test := range []Test{ + {s.Handler, "/nonswagger", true}, + {s.Handler, "/secret", true}, + } { + protected, called = false, false + + var w io.Reader + req, err := http.NewRequest("GET", test.path, w) + if err != nil { + t.Errorf("%d: Unexpected http error: %v", i, err) + continue + } + + test.handler.ServeHTTP(httptest.NewRecorder(), req) + + if !called { + t.Errorf("%d: Expected handler to be called.", i) + } + if test.protected != protected { + t.Errorf("%d: Expected protected=%v, got protected=%v.", i, test.protected, protected) + } + } +} + +// TestNotRestRoutesHaveAuth checks that special non-routes are behind authz/authn. +func TestNotRestRoutesHaveAuth(t *testing.T) { + config, _ := setUp(t) + + authz := mockAuthorizer{} + + config.LegacyAPIGroupPrefixes = sets.NewString("/apiPrefix") + config.Authorization.Authorizer = &authz + + config.EnableSwaggerUI = true + config.EnableIndex = true + config.EnableProfiling = true + config.SwaggerConfig = DefaultSwaggerConfig() + + kubeVersion := fakeVersion() + config.Version = &kubeVersion + + s, err := config.Complete(nil).New("test", NewEmptyDelegate()) + if err != nil { + t.Fatalf("Error in bringing up the server: %v", err) + } + + for _, test := range []struct { + route string + }{ + {"/"}, + {"/swagger-ui/"}, + {"/debug/pprof/"}, + {"/debug/flags/"}, + {"/version"}, + } { + resp := httptest.NewRecorder() + req, _ := http.NewRequest("GET", test.route, nil) + s.Handler.ServeHTTP(resp, req) + if resp.Code != 200 { + t.Errorf("route %q expected to work: code %d", test.route, resp.Code) + continue + } + + if authz.lastURI != test.route { + t.Errorf("route %q expected to go through authorization, last route did: %q", test.route, authz.lastURI) + } + } +} + +type mockAuthorizer struct { + lastURI string +} + +func (authz *mockAuthorizer) Authorize(a authorizer.Attributes) (authorized authorizer.Decision, reason string, err error) { + authz.lastURI = a.GetPath() + return authorizer.DecisionAllow, "", nil +} + +type testGetterStorage struct { + Version string +} + +func (p *testGetterStorage) NamespaceScoped() bool { + return true +} + +func (p *testGetterStorage) New() runtime.Object { + return &metav1.APIGroup{ + TypeMeta: metav1.TypeMeta{ + Kind: "Getter", + APIVersion: p.Version, + }, + } +} + +func (p *testGetterStorage) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { + return nil, nil +} + +type testNoVerbsStorage struct { + Version string +} + +func (p *testNoVerbsStorage) NamespaceScoped() bool { + return true +} + +func (p *testNoVerbsStorage) New() runtime.Object { + return &metav1.APIGroup{ + TypeMeta: metav1.TypeMeta{ + Kind: "NoVerbs", + APIVersion: p.Version, + }, + } +} + +func fakeVersion() version.Info { + return version.Info{ + Major: "42", + Minor: "42", + GitVersion: "42", + GitCommit: "34973274ccef6ab4dfaaf86599792fa9c3fe4689", + GitTreeState: "Dirty", + BuildDate: time.Now().String(), + GoVersion: goruntime.Version(), + Compiler: goruntime.Compiler, + Platform: fmt.Sprintf("%s/%s", goruntime.GOOS, goruntime.GOARCH), + } +} + +// TestGracefulShutdown verifies server shutdown after request handler finish. +func TestGracefulShutdown(t *testing.T) { + config, _ := setUp(t) + + var graceShutdown bool + wg := sync.WaitGroup{} + wg.Add(1) + + config.BuildHandlerChainFunc = func(apiHandler http.Handler, c *Config) http.Handler { + handler := genericfilters.WithWaitGroup(apiHandler, c.LongRunningFunc, c.HandlerChainWaitGroup) + handler = genericapifilters.WithRequestInfo(handler, c.RequestInfoResolver) + return handler + } + + handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + wg.Done() + time.Sleep(2 * time.Second) + w.WriteHeader(http.StatusOK) + graceShutdown = true + }) + + s, err := config.Complete(nil).New("test", NewEmptyDelegate()) + if err != nil { + t.Fatalf("Error in bringing up the server: %v", err) + } + + s.Handler.NonGoRestfulMux.Handle("/test", handler) + + insecureServer := &http.Server{ + Addr: "0.0.0.0:0", + Handler: s.Handler, + } + stopCh := make(chan struct{}) + + ln, err := net.Listen("tcp", insecureServer.Addr) + if err != nil { + t.Errorf("failed to listen on %v: %v", insecureServer.Addr, err) + } + + // get port + serverPort := ln.Addr().(*net.TCPAddr).Port + err = RunServer(insecureServer, ln, 10*time.Second, stopCh) + if err != nil { + t.Errorf("RunServer err: %v", err) + } + + graceCh := make(chan struct{}) + // mock a client request + go func() { + resp, err := http.Get("http://127.0.0.1:" + strconv.Itoa(serverPort) + "/test") + if err != nil { + t.Errorf("Unexpected http error: %v", err) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("Unexpected http status code: %v", resp.StatusCode) + } + close(graceCh) + }() + + // close stopCh after request sent to server to guarantee request handler is running. + wg.Wait() + close(stopCh) + // wait for wait group handler finish + s.HandlerChainWaitGroup.Wait() + + // check server all handlers finished. + if !graceShutdown { + t.Errorf("server shutdown not gracefully.") + } + // check client to make sure receive response. + select { + case <-graceCh: + t.Logf("server shutdown gracefully.") + case <-time.After(30 * time.Second): + t.Errorf("Timed out waiting for response.") + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/handler.go b/vendor/k8s.io/apiserver/pkg/server/handler.go new file mode 100644 index 00000000..e4e7d9ae --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/handler.go @@ -0,0 +1,190 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 server + +import ( + "bytes" + "fmt" + "net/http" + rt "runtime" + "sort" + "strings" + + "github.com/emicklei/go-restful" + "github.com/golang/glog" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters" + "k8s.io/apiserver/pkg/server/mux" +) + +// APIServerHandlers holds the different http.Handlers used by the API server. +// This includes the full handler chain, the director (which chooses between gorestful and nonGoRestful, +// the gorestful handler (used for the API) which falls through to the nonGoRestful handler on unregistered paths, +// and the nonGoRestful handler (which can contain a fallthrough of its own) +// FullHandlerChain -> Director -> {GoRestfulContainer,NonGoRestfulMux} based on inspection of registered web services +type APIServerHandler struct { + // FullHandlerChain is the one that is eventually served with. It should include the full filter + // chain and then call the Director. + FullHandlerChain http.Handler + // The registered APIs. InstallAPIs uses this. Other servers probably shouldn't access this directly. + GoRestfulContainer *restful.Container + // NonGoRestfulMux is the final HTTP handler in the chain. + // It comes after all filters and the API handling + // This is where other servers can attach handler to various parts of the chain. + NonGoRestfulMux *mux.PathRecorderMux + + // Director is here so that we can properly handle fall through and proxy cases. + // This looks a bit bonkers, but here's what's happening. We need to have /apis handling registered in gorestful in order to have + // swagger generated for compatibility. Doing that with `/apis` as a webservice, means that it forcibly 404s (no defaulting allowed) + // all requests which are not /apis or /apis/. We need those calls to fall through behind goresful for proper delegation. Trying to + // register for a pattern which includes everything behind it doesn't work because gorestful negotiates for verbs and content encoding + // and all those things go crazy when gorestful really just needs to pass through. In addition, openapi enforces unique verb constraints + // which we don't fit into and it still muddies up swagger. Trying to switch the webservices into a route doesn't work because the + // containing webservice faces all the same problems listed above. + // This leads to the crazy thing done here. Our mux does what we need, so we'll place it in front of gorestful. It will introspect to + // decide if the route is likely to be handled by goresful and route there if needed. Otherwise, it goes to PostGoRestful mux in + // order to handle "normal" paths and delegation. Hopefully no API consumers will ever have to deal with this level of detail. I think + // we should consider completely removing gorestful. + // Other servers should only use this opaquely to delegate to an API server. + Director http.Handler +} + +// HandlerChainBuilderFn is used to wrap the GoRestfulContainer handler using the provided handler chain. +// It is normally used to apply filtering like authentication and authorization +type HandlerChainBuilderFn func(apiHandler http.Handler) http.Handler + +func NewAPIServerHandler(name string, s runtime.NegotiatedSerializer, handlerChainBuilder HandlerChainBuilderFn, notFoundHandler http.Handler) *APIServerHandler { + nonGoRestfulMux := mux.NewPathRecorderMux(name) + if notFoundHandler != nil { + nonGoRestfulMux.NotFoundHandler(notFoundHandler) + } + + gorestfulContainer := restful.NewContainer() + gorestfulContainer.ServeMux = http.NewServeMux() + gorestfulContainer.Router(restful.CurlyRouter{}) // e.g. for proxy/{kind}/{name}/{*} + gorestfulContainer.RecoverHandler(func(panicReason interface{}, httpWriter http.ResponseWriter) { + logStackOnRecover(s, panicReason, httpWriter) + }) + gorestfulContainer.ServiceErrorHandler(func(serviceErr restful.ServiceError, request *restful.Request, response *restful.Response) { + serviceErrorHandler(s, serviceErr, request, response) + }) + + director := director{ + name: name, + goRestfulContainer: gorestfulContainer, + nonGoRestfulMux: nonGoRestfulMux, + } + + return &APIServerHandler{ + FullHandlerChain: handlerChainBuilder(director), + GoRestfulContainer: gorestfulContainer, + NonGoRestfulMux: nonGoRestfulMux, + Director: director, + } +} + +// ListedPaths returns the paths that should be shown under / +func (a *APIServerHandler) ListedPaths() []string { + var handledPaths []string + // Extract the paths handled using restful.WebService + for _, ws := range a.GoRestfulContainer.RegisteredWebServices() { + handledPaths = append(handledPaths, ws.RootPath()) + } + handledPaths = append(handledPaths, a.NonGoRestfulMux.ListedPaths()...) + sort.Strings(handledPaths) + + return handledPaths +} + +type director struct { + name string + goRestfulContainer *restful.Container + nonGoRestfulMux *mux.PathRecorderMux +} + +func (d director) ServeHTTP(w http.ResponseWriter, req *http.Request) { + path := req.URL.Path + + // check to see if our webservices want to claim this path + for _, ws := range d.goRestfulContainer.RegisteredWebServices() { + switch { + case ws.RootPath() == "/apis": + // if we are exactly /apis or /apis/, then we need special handling in loop. + // normally these are passed to the nonGoRestfulMux, but if discovery is enabled, it will go directly. + // We can't rely on a prefix match since /apis matches everything (see the big comment on Director above) + if path == "/apis" || path == "/apis/" { + glog.V(5).Infof("%v: %v %q satisfied by gorestful with webservice %v", d.name, req.Method, path, ws.RootPath()) + // don't use servemux here because gorestful servemuxes get messed up when removing webservices + // TODO fix gorestful, remove TPRs, or stop using gorestful + d.goRestfulContainer.Dispatch(w, req) + return + } + + case strings.HasPrefix(path, ws.RootPath()): + // ensure an exact match or a path boundary match + if len(path) == len(ws.RootPath()) || path[len(ws.RootPath())] == '/' { + glog.V(5).Infof("%v: %v %q satisfied by gorestful with webservice %v", d.name, req.Method, path, ws.RootPath()) + // don't use servemux here because gorestful servemuxes get messed up when removing webservices + // TODO fix gorestful, remove TPRs, or stop using gorestful + d.goRestfulContainer.Dispatch(w, req) + return + } + } + } + + // if we didn't find a match, then we just skip gorestful altogether + glog.V(5).Infof("%v: %v %q satisfied by nonGoRestful", d.name, req.Method, path) + d.nonGoRestfulMux.ServeHTTP(w, req) +} + +//TODO: Unify with RecoverPanics? +func logStackOnRecover(s runtime.NegotiatedSerializer, panicReason interface{}, w http.ResponseWriter) { + var buffer bytes.Buffer + buffer.WriteString(fmt.Sprintf("recover from panic situation: - %v\r\n", panicReason)) + for i := 2; ; i++ { + _, file, line, ok := rt.Caller(i) + if !ok { + break + } + buffer.WriteString(fmt.Sprintf(" %s:%d\r\n", file, line)) + } + glog.Errorln(buffer.String()) + + headers := http.Header{} + if ct := w.Header().Get("Content-Type"); len(ct) > 0 { + headers.Set("Accept", ct) + } + responsewriters.ErrorNegotiated(apierrors.NewGenericServerResponse(http.StatusInternalServerError, "", schema.GroupResource{}, "", "", 0, false), s, schema.GroupVersion{}, w, &http.Request{Header: headers}) +} + +func serviceErrorHandler(s runtime.NegotiatedSerializer, serviceErr restful.ServiceError, request *restful.Request, resp *restful.Response) { + responsewriters.ErrorNegotiated( + apierrors.NewGenericServerResponse(serviceErr.Code, "", schema.GroupResource{}, "", serviceErr.Message, 0, false), + s, + schema.GroupVersion{}, + resp, + request.Request, + ) +} + +// ServeHTTP makes it an http.Handler +func (a *APIServerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + a.FullHandlerChain.ServeHTTP(w, r) +} diff --git a/vendor/k8s.io/apiserver/pkg/server/healthz.go b/vendor/k8s.io/apiserver/pkg/server/healthz.go new file mode 100644 index 00000000..43e102b5 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/healthz.go @@ -0,0 +1,45 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 server + +import ( + "fmt" + + "k8s.io/apiserver/pkg/server/healthz" +) + +// AddHealthzCheck allows you to add a HealthzCheck. +func (s *GenericAPIServer) AddHealthzChecks(checks ...healthz.HealthzChecker) error { + s.healthzLock.Lock() + defer s.healthzLock.Unlock() + + if s.healthzCreated { + return fmt.Errorf("unable to add because the healthz endpoint has already been created") + } + + s.healthzChecks = append(s.healthzChecks, checks...) + return nil +} + +// installHealthz creates the healthz endpoint for this server +func (s *GenericAPIServer) installHealthz() { + s.healthzLock.Lock() + defer s.healthzLock.Unlock() + s.healthzCreated = true + + healthz.InstallHandler(s.Handler.NonGoRestfulMux, s.healthzChecks...) +} diff --git a/vendor/k8s.io/apiserver/pkg/server/healthz/healthz.go b/vendor/k8s.io/apiserver/pkg/server/healthz/healthz.go deleted file mode 100644 index 224f1eda..00000000 --- a/vendor/k8s.io/apiserver/pkg/server/healthz/healthz.go +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 healthz - -import ( - "bytes" - "fmt" - "net/http" - "strings" - "sync" - - "github.com/golang/glog" -) - -// HealthzChecker is a named healthz checker. -type HealthzChecker interface { - Name() string - Check(req *http.Request) error -} - -var defaultHealthz = sync.Once{} - -// DefaultHealthz installs the default healthz check to the http.DefaultServeMux. -func DefaultHealthz(checks ...HealthzChecker) { - defaultHealthz.Do(func() { - InstallHandler(http.DefaultServeMux, checks...) - }) -} - -// PingHealthz returns true automatically when checked -var PingHealthz HealthzChecker = ping{} - -// ping implements the simplest possible healthz checker. -type ping struct{} - -func (ping) Name() string { - return "ping" -} - -// PingHealthz is a health check that returns true. -func (ping) Check(_ *http.Request) error { - return nil -} - -// NamedCheck returns a healthz checker for the given name and function. -func NamedCheck(name string, check func(r *http.Request) error) HealthzChecker { - return &healthzCheck{name, check} -} - -// InstallHandler registers handlers for health checking on the path -// "/healthz" to mux. *All handlers* for mux must be specified in -// exactly one call to InstallHandler. Calling InstallHandler more -// than once for the same mux will result in a panic. -func InstallHandler(mux mux, checks ...HealthzChecker) { - InstallPathHandler(mux, "/healthz", checks...) -} - -// InstallPathHandler registers handlers for health checking on -// a specific path to mux. *All handlers* for the path must be -// specified in exactly one call to InstallPathHandler. Calling -// InstallPathHandler more than once for the same path and mux will -// result in a panic. -func InstallPathHandler(mux mux, path string, checks ...HealthzChecker) { - if len(checks) == 0 { - glog.V(5).Info("No default health checks specified. Installing the ping handler.") - checks = []HealthzChecker{PingHealthz} - } - - glog.V(5).Info("Installing healthz checkers:", strings.Join(checkerNames(checks...), ", ")) - - mux.Handle(path, handleRootHealthz(checks...)) - for _, check := range checks { - mux.Handle(fmt.Sprintf("%s/%v", path, check.Name()), adaptCheckToHandler(check.Check)) - } -} - -// mux is an interface describing the methods InstallHandler requires. -type mux interface { - Handle(pattern string, handler http.Handler) -} - -// healthzCheck implements HealthzChecker on an arbitrary name and check function. -type healthzCheck struct { - name string - check func(r *http.Request) error -} - -var _ HealthzChecker = &healthzCheck{} - -func (c *healthzCheck) Name() string { - return c.name -} - -func (c *healthzCheck) Check(r *http.Request) error { - return c.check(r) -} - -// handleRootHealthz returns an http.HandlerFunc that serves the provided checks. -func handleRootHealthz(checks ...HealthzChecker) http.HandlerFunc { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - failed := false - var verboseOut bytes.Buffer - for _, check := range checks { - if err := check.Check(r); err != nil { - // don't include the error since this endpoint is public. If someone wants more detail - // they should have explicit permission to the detailed checks. - glog.V(6).Infof("healthz check %v failed: %v", check.Name(), err) - fmt.Fprintf(&verboseOut, "[-]%v failed: reason withheld\n", check.Name()) - failed = true - } else { - fmt.Fprintf(&verboseOut, "[+]%v ok\n", check.Name()) - } - } - // always be verbose on failure - if failed { - http.Error(w, fmt.Sprintf("%vhealthz check failed", verboseOut.String()), http.StatusInternalServerError) - return - } - - if _, found := r.URL.Query()["verbose"]; !found { - fmt.Fprint(w, "ok") - return - } - - verboseOut.WriteTo(w) - fmt.Fprint(w, "healthz check passed\n") - }) -} - -// adaptCheckToHandler returns an http.HandlerFunc that serves the provided checks. -func adaptCheckToHandler(c func(r *http.Request) error) http.HandlerFunc { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - err := c(r) - if err != nil { - http.Error(w, fmt.Sprintf("internal server error: %v", err), http.StatusInternalServerError) - } else { - fmt.Fprint(w, "ok") - } - }) -} - -// checkerNames returns the names of the checks in the same order as passed in. -func checkerNames(checks ...HealthzChecker) []string { - if len(checks) > 0 { - // accumulate the names of checks for printing them out. - checkerNames := make([]string, 0, len(checks)) - for _, check := range checks { - // quote the Name so we can disambiguate - checkerNames = append(checkerNames, fmt.Sprintf("%q", check.Name())) - } - return checkerNames - } - return nil -} diff --git a/vendor/k8s.io/apiserver/pkg/server/hooks.go b/vendor/k8s.io/apiserver/pkg/server/hooks.go new file mode 100644 index 00000000..ccf8ee17 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/hooks.go @@ -0,0 +1,230 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 server + +import ( + "errors" + "fmt" + "net/http" + + "github.com/golang/glog" + + utilerrors "k8s.io/apimachinery/pkg/util/errors" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apiserver/pkg/server/healthz" + restclient "k8s.io/client-go/rest" +) + +// PostStartHookFunc is a function that is called after the server has started. +// It must properly handle cases like: +// 1. asynchronous start in multiple API server processes +// 2. conflicts between the different processes all trying to perform the same action +// 3. partially complete work (API server crashes while running your hook) +// 4. API server access **BEFORE** your hook has completed +// Think of it like a mini-controller that is super privileged and gets to run in-process +// If you use this feature, tag @deads2k on github who has promised to review code for anyone's PostStartHook +// until it becomes easier to use. +type PostStartHookFunc func(context PostStartHookContext) error + +// PreShutdownHookFunc is a function that can be added to the shutdown logic. +type PreShutdownHookFunc func() error + +// PostStartHookContext provides information about this API server to a PostStartHookFunc +type PostStartHookContext struct { + // LoopbackClientConfig is a config for a privileged loopback connection to the API server + LoopbackClientConfig *restclient.Config + // StopCh is the channel that will be closed when the server stops + StopCh <-chan struct{} +} + +// PostStartHookProvider is an interface in addition to provide a post start hook for the api server +type PostStartHookProvider interface { + PostStartHook() (string, PostStartHookFunc, error) +} + +type postStartHookEntry struct { + hook PostStartHookFunc + + // done will be closed when the postHook is finished + done chan struct{} +} + +type preShutdownHookEntry struct { + hook PreShutdownHookFunc +} + +// AddPostStartHook allows you to add a PostStartHook. +func (s *GenericAPIServer) AddPostStartHook(name string, hook PostStartHookFunc) error { + if len(name) == 0 { + return fmt.Errorf("missing name") + } + if hook == nil { + return nil + } + if s.disabledPostStartHooks.Has(name) { + return nil + } + + s.postStartHookLock.Lock() + defer s.postStartHookLock.Unlock() + + if s.postStartHooksCalled { + return fmt.Errorf("unable to add %q because PostStartHooks have already been called", name) + } + if _, exists := s.postStartHooks[name]; exists { + return fmt.Errorf("unable to add %q because it is already registered", name) + } + + // done is closed when the poststarthook is finished. This is used by the health check to be able to indicate + // that the poststarthook is finished + done := make(chan struct{}) + s.AddHealthzChecks(postStartHookHealthz{name: "poststarthook/" + name, done: done}) + s.postStartHooks[name] = postStartHookEntry{hook: hook, done: done} + + return nil +} + +// AddPostStartHookOrDie allows you to add a PostStartHook, but dies on failure +func (s *GenericAPIServer) AddPostStartHookOrDie(name string, hook PostStartHookFunc) { + if err := s.AddPostStartHook(name, hook); err != nil { + glog.Fatalf("Error registering PostStartHook %q: %v", name, err) + } +} + +// AddPreShutdownHook allows you to add a PreShutdownHook. +func (s *GenericAPIServer) AddPreShutdownHook(name string, hook PreShutdownHookFunc) error { + if len(name) == 0 { + return fmt.Errorf("missing name") + } + if hook == nil { + return nil + } + + s.preShutdownHookLock.Lock() + defer s.preShutdownHookLock.Unlock() + + if s.preShutdownHooksCalled { + return fmt.Errorf("unable to add %q because PreShutdownHooks have already been called", name) + } + if _, exists := s.preShutdownHooks[name]; exists { + return fmt.Errorf("unable to add %q because it is already registered", name) + } + + s.preShutdownHooks[name] = preShutdownHookEntry{hook: hook} + + return nil +} + +// AddPreShutdownHookOrDie allows you to add a PostStartHook, but dies on failure +func (s *GenericAPIServer) AddPreShutdownHookOrDie(name string, hook PreShutdownHookFunc) { + if err := s.AddPreShutdownHook(name, hook); err != nil { + glog.Fatalf("Error registering PreShutdownHook %q: %v", name, err) + } +} + +// RunPostStartHooks runs the PostStartHooks for the server +func (s *GenericAPIServer) RunPostStartHooks(stopCh <-chan struct{}) { + s.postStartHookLock.Lock() + defer s.postStartHookLock.Unlock() + s.postStartHooksCalled = true + + context := PostStartHookContext{ + LoopbackClientConfig: s.LoopbackClientConfig, + StopCh: stopCh, + } + + for hookName, hookEntry := range s.postStartHooks { + go runPostStartHook(hookName, hookEntry, context) + } +} + +// RunPreShutdownHooks runs the PreShutdownHooks for the server +func (s *GenericAPIServer) RunPreShutdownHooks() error { + var errorList []error + + s.preShutdownHookLock.Lock() + defer s.preShutdownHookLock.Unlock() + s.preShutdownHooksCalled = true + + for hookName, hookEntry := range s.preShutdownHooks { + if err := runPreShutdownHook(hookName, hookEntry); err != nil { + errorList = append(errorList, err) + } + } + return utilerrors.NewAggregate(errorList) +} + +// isPostStartHookRegistered checks whether a given PostStartHook is registered +func (s *GenericAPIServer) isPostStartHookRegistered(name string) bool { + s.postStartHookLock.Lock() + defer s.postStartHookLock.Unlock() + _, exists := s.postStartHooks[name] + return exists +} + +func runPostStartHook(name string, entry postStartHookEntry, context PostStartHookContext) { + var err error + func() { + // don't let the hook *accidentally* panic and kill the server + defer utilruntime.HandleCrash() + err = entry.hook(context) + }() + // if the hook intentionally wants to kill server, let it. + if err != nil { + glog.Fatalf("PostStartHook %q failed: %v", name, err) + } + close(entry.done) +} + +func runPreShutdownHook(name string, entry preShutdownHookEntry) error { + var err error + func() { + // don't let the hook *accidentally* panic and kill the server + defer utilruntime.HandleCrash() + err = entry.hook() + }() + if err != nil { + return fmt.Errorf("PreShutdownHook %q failed: %v", name, err) + } + return nil +} + +// postStartHookHealthz implements a healthz check for poststarthooks. It will return a "hookNotFinished" +// error until the poststarthook is finished. +type postStartHookHealthz struct { + name string + + // done will be closed when the postStartHook is finished + done chan struct{} +} + +var _ healthz.HealthzChecker = postStartHookHealthz{} + +func (h postStartHookHealthz) Name() string { + return h.name +} + +var hookNotFinished = errors.New("not finished") + +func (h postStartHookHealthz) Check(req *http.Request) error { + select { + case <-h.done: + return nil + default: + return hookNotFinished + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/httplog/BUILD b/vendor/k8s.io/apiserver/pkg/server/httplog/BUILD index 3a620708..22d299ba 100644 --- a/vendor/k8s.io/apiserver/pkg/server/httplog/BUILD +++ b/vendor/k8s.io/apiserver/pkg/server/httplog/BUILD @@ -18,6 +18,7 @@ go_library( "doc.go", "httplog.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/httplog", importpath = "k8s.io/apiserver/pkg/server/httplog", deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go b/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go index ee8e05f1..f8a8a530 100644 --- a/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go +++ b/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go @@ -100,14 +100,11 @@ func NewLogged(req *http.Request, w *http.ResponseWriter) *respLogger { // then a passthroughLogger will be created which will log to stdout immediately // when Addf is called. func LogOf(req *http.Request, w http.ResponseWriter) logger { - if _, exists := w.(*respLogger); !exists { - pl := &passthroughLogger{} - return pl - } if rl, ok := w.(*respLogger); ok { return rl } - panic("Unable to find or create the logger!") + + return &passthroughLogger{} } // Unlogged returns the original ResponseWriter, or w if it is not our inserted logger. @@ -148,9 +145,9 @@ func (rl *respLogger) Log() { latency := time.Since(rl.startTime) if glog.V(3) { if !rl.hijacked { - glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) %v%v%v [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.status, rl.statusStack, rl.addedInfo, rl.req.Header["User-Agent"], rl.req.RemoteAddr)) + glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) %v%v%v [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.status, rl.statusStack, rl.addedInfo, rl.req.UserAgent(), rl.req.RemoteAddr)) } else { - glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) hijacked [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.req.Header["User-Agent"], rl.req.RemoteAddr)) + glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) hijacked [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.req.UserAgent(), rl.req.RemoteAddr)) } } } diff --git a/vendor/k8s.io/apiserver/pkg/server/httplog/httplog_test.go b/vendor/k8s.io/apiserver/pkg/server/httplog/httplog_test.go new file mode 100644 index 00000000..680b1e47 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/httplog/httplog_test.go @@ -0,0 +1,152 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 httplog + +import ( + "net/http" + "net/http/httptest" + "reflect" + "testing" +) + +func TestDefaultStacktracePred(t *testing.T) { + for _, x := range []int{101, 200, 204, 302, 400, 404} { + if DefaultStacktracePred(x) { + t.Fatalf("should not log on %v by default", x) + } + } + + for _, x := range []int{500, 100} { + if !DefaultStacktracePred(x) { + t.Fatalf("should log on %v by default", x) + } + } +} + +func TestStatusIsNot(t *testing.T) { + statusTestTable := []struct { + status int + statuses []int + want bool + }{ + {http.StatusOK, []int{}, true}, + {http.StatusOK, []int{http.StatusOK}, false}, + {http.StatusCreated, []int{http.StatusOK, http.StatusAccepted}, true}, + } + for _, tt := range statusTestTable { + sp := StatusIsNot(tt.statuses...) + got := sp(tt.status) + if got != tt.want { + t.Errorf("Expected %v, got %v", tt.want, got) + } + } +} + +func TestNewLogged(t *testing.T) { + req, err := http.NewRequest("GET", "http://example.com", nil) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + handler := func(w http.ResponseWriter, r *http.Request) { + NewLogged(req, &w) + defer func() { + if r := recover(); r == nil { + t.Errorf("Expected NewLogged to panic") + } + }() + NewLogged(req, &w) + } + w := httptest.NewRecorder() + handler(w, req) +} + +func TestLogOf(t *testing.T) { + logOfTests := []bool{true, false} + for _, makeLogger := range logOfTests { + req, err := http.NewRequest("GET", "http://example.com", nil) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + handler := func(w http.ResponseWriter, r *http.Request) { + var want string + if makeLogger { + NewLogged(req, &w) + want = "*httplog.respLogger" + } else { + want = "*httplog.passthroughLogger" + } + got := reflect.TypeOf(LogOf(r, w)).String() + if want != got { + t.Errorf("Expected %v, got %v", want, got) + } + } + w := httptest.NewRecorder() + handler(w, req) + } +} + +func TestUnlogged(t *testing.T) { + unloggedTests := []bool{true, false} + for _, makeLogger := range unloggedTests { + req, err := http.NewRequest("GET", "http://example.com", nil) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + handler := func(w http.ResponseWriter, r *http.Request) { + want := w + if makeLogger { + NewLogged(req, &w) + } + got := Unlogged(w) + if want != got { + t.Errorf("Expected %v, got %v", want, got) + } + } + w := httptest.NewRecorder() + handler(w, req) + } +} + +type testResponseWriter struct{} + +func (*testResponseWriter) Header() http.Header { return nil } +func (*testResponseWriter) Write([]byte) (int, error) { return 0, nil } +func (*testResponseWriter) WriteHeader(int) {} + +func TestLoggedStatus(t *testing.T) { + req, err := http.NewRequest("GET", "http://example.com", nil) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + var tw http.ResponseWriter = new(testResponseWriter) + logger := NewLogged(req, &tw) + logger.Write(nil) + + if logger.status != http.StatusOK { + t.Errorf("expected status after write to be %v, got %v", http.StatusOK, logger.status) + } + + tw = new(testResponseWriter) + logger = NewLogged(req, &tw) + logger.WriteHeader(http.StatusForbidden) + logger.Write(nil) + + if logger.status != http.StatusForbidden { + t.Errorf("expected status after write to remain %v, got %v", http.StatusForbidden, logger.status) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/server/plugins.go b/vendor/k8s.io/apiserver/pkg/server/plugins.go new file mode 100644 index 00000000..84813aaf --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/plugins.go @@ -0,0 +1,34 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 server + +// This file exists to force the desired plugin implementations to be linked into genericapi pkg. +import ( + "k8s.io/apiserver/pkg/admission" + "k8s.io/apiserver/pkg/admission/plugin/initialization" + "k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle" + mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating" + validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating" +) + +// RegisterAllAdmissionPlugins registers all admission plugins +func RegisterAllAdmissionPlugins(plugins *admission.Plugins) { + lifecycle.Register(plugins) + initialization.Register(plugins) + validatingwebhook.Register(plugins) + mutatingwebhook.Register(plugins) +} diff --git a/vendor/k8s.io/apiserver/pkg/server/secure_serving.go b/vendor/k8s.io/apiserver/pkg/server/secure_serving.go new file mode 100644 index 00000000..67a45d57 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/secure_serving.go @@ -0,0 +1,234 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 server + +import ( + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "net" + "net/http" + "strings" + "time" + + "github.com/golang/glog" + "golang.org/x/net/http2" + + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/validation" +) + +const ( + defaultKeepAlivePeriod = 3 * time.Minute +) + +// serveSecurely runs the secure http server. It fails only if certificates cannot +// be loaded or the initial listen call fails. The actual server loop (stoppable by closing +// stopCh) runs in a go routine, i.e. serveSecurely does not block. +func (s *SecureServingInfo) Serve(handler http.Handler, shutdownTimeout time.Duration, stopCh <-chan struct{}) error { + if s.Listener == nil { + return fmt.Errorf("listener must not be nil") + } + + secureServer := &http.Server{ + Addr: s.Listener.Addr().String(), + Handler: handler, + MaxHeaderBytes: 1 << 20, + TLSConfig: &tls.Config{ + NameToCertificate: s.SNICerts, + // Can't use SSLv3 because of POODLE and BEAST + // Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher + // Can't use TLSv1.1 because of RC4 cipher usage + MinVersion: tls.VersionTLS12, + // enable HTTP2 for go's 1.7 HTTP Server + NextProtos: []string{"h2", "http/1.1"}, + }, + } + + if s.MinTLSVersion > 0 { + secureServer.TLSConfig.MinVersion = s.MinTLSVersion + } + if len(s.CipherSuites) > 0 { + secureServer.TLSConfig.CipherSuites = s.CipherSuites + } + + if s.Cert != nil { + secureServer.TLSConfig.Certificates = []tls.Certificate{*s.Cert} + } + + // append all named certs. Otherwise, the go tls stack will think no SNI processing + // is necessary because there is only one cert anyway. + // Moreover, if ServerCert.CertFile/ServerCert.KeyFile are not set, the first SNI + // cert will become the default cert. That's what we expect anyway. + for _, c := range s.SNICerts { + secureServer.TLSConfig.Certificates = append(secureServer.TLSConfig.Certificates, *c) + } + + if s.ClientCA != nil { + // Populate PeerCertificates in requests, but don't reject connections without certificates + // This allows certificates to be validated by authenticators, while still allowing other auth types + secureServer.TLSConfig.ClientAuth = tls.RequestClientCert + // Specify allowed CAs for client certificates + secureServer.TLSConfig.ClientCAs = s.ClientCA + } + + // At least 99% of serialized resources in surveyed clusters were smaller than 256kb. + // This should be big enough to accommodate most API POST requests in a single frame, + // and small enough to allow a per connection buffer of this size multiplied by `MaxConcurrentStreams`. + const resourceBody99Percentile = 256 * 1024 + + http2Options := &http2.Server{} + + // shrink the per-stream buffer and max framesize from the 1MB default while still accommodating most API POST requests in a single frame + http2Options.MaxUploadBufferPerStream = resourceBody99Percentile + http2Options.MaxReadFrameSize = resourceBody99Percentile + + // use the overridden concurrent streams setting or make the default of 250 explicit so we can size MaxUploadBufferPerConnection appropriately + if s.HTTP2MaxStreamsPerConnection > 0 { + http2Options.MaxConcurrentStreams = uint32(s.HTTP2MaxStreamsPerConnection) + } else { + http2Options.MaxConcurrentStreams = 250 + } + + // increase the connection buffer size from the 1MB default to handle the specified number of concurrent streams + http2Options.MaxUploadBufferPerConnection = http2Options.MaxUploadBufferPerStream * int32(http2Options.MaxConcurrentStreams) + + // apply settings to the server + if err := http2.ConfigureServer(secureServer, http2Options); err != nil { + return fmt.Errorf("error configuring http2: %v", err) + } + + glog.Infof("Serving securely on %s", secureServer.Addr) + return RunServer(secureServer, s.Listener, shutdownTimeout, stopCh) +} + +// RunServer listens on the given port if listener is not given, +// then spawns a go-routine continuously serving +// until the stopCh is closed. This function does not block. +// TODO: make private when insecure serving is gone from the kube-apiserver +func RunServer( + server *http.Server, + ln net.Listener, + shutDownTimeout time.Duration, + stopCh <-chan struct{}, +) error { + if ln == nil { + return fmt.Errorf("listener must not be nil") + } + + // Shutdown server gracefully. + go func() { + <-stopCh + ctx, cancel := context.WithTimeout(context.Background(), shutDownTimeout) + server.Shutdown(ctx) + cancel() + }() + + go func() { + defer utilruntime.HandleCrash() + + var listener net.Listener + listener = tcpKeepAliveListener{ln.(*net.TCPListener)} + if server.TLSConfig != nil { + listener = tls.NewListener(listener, server.TLSConfig) + } + + err := server.Serve(listener) + + msg := fmt.Sprintf("Stopped listening on %s", ln.Addr().String()) + select { + case <-stopCh: + glog.Info(msg) + default: + panic(fmt.Sprintf("%s due to error: %v", msg, err)) + } + }() + + return nil +} + +type NamedTLSCert struct { + TLSCert tls.Certificate + + // names is a list of domain patterns: fully qualified domain names, possibly prefixed with + // wildcard segments. + Names []string +} + +// getNamedCertificateMap returns a map of *tls.Certificate by name. It's is +// suitable for use in tls.Config#NamedCertificates. Returns an error if any of the certs +// cannot be loaded. Returns nil if len(certs) == 0 +func GetNamedCertificateMap(certs []NamedTLSCert) (map[string]*tls.Certificate, error) { + // register certs with implicit names first, reverse order such that earlier trump over the later + byName := map[string]*tls.Certificate{} + for i := len(certs) - 1; i >= 0; i-- { + if len(certs[i].Names) > 0 { + continue + } + cert := &certs[i].TLSCert + + // read names from certificate common names and DNS names + if len(cert.Certificate) == 0 { + return nil, fmt.Errorf("empty SNI certificate, skipping") + } + x509Cert, err := x509.ParseCertificate(cert.Certificate[0]) + if err != nil { + return nil, fmt.Errorf("parse error for SNI certificate: %v", err) + } + cn := x509Cert.Subject.CommonName + if cn == "*" || len(validation.IsDNS1123Subdomain(strings.TrimPrefix(cn, "*."))) == 0 { + byName[cn] = cert + } + for _, san := range x509Cert.DNSNames { + byName[san] = cert + } + // intentionally all IPs in the cert are ignored as SNI forbids passing IPs + // to select a cert. Before go 1.6 the tls happily passed IPs as SNI values. + } + + // register certs with explicit names last, overwriting every of the implicit ones, + // again in reverse order. + for i := len(certs) - 1; i >= 0; i-- { + namedCert := &certs[i] + for _, name := range namedCert.Names { + byName[name] = &certs[i].TLSCert + } + } + + return byName, nil +} + +// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted +// connections. It's used by ListenAndServe and ListenAndServeTLS so +// dead TCP connections (e.g. closing laptop mid-download) eventually +// go away. +// +// Copied from Go 1.7.2 net/http/server.go +type tcpKeepAliveListener struct { + *net.TCPListener +} + +func (ln tcpKeepAliveListener) Accept() (net.Conn, error) { + tc, err := ln.AcceptTCP() + if err != nil { + return nil, err + } + tc.SetKeepAlive(true) + tc.SetKeepAlivePeriod(defaultKeepAlivePeriod) + return tc, nil +} diff --git a/vendor/k8s.io/apiserver/pkg/server/signal.go b/vendor/k8s.io/apiserver/pkg/server/signal.go new file mode 100644 index 00000000..1cd8cefa --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/server/signal.go @@ -0,0 +1,43 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 server + +import ( + "os" + "os/signal" +) + +var onlyOneSignalHandler = make(chan struct{}) + +// SetupSignalHandler registered for SIGTERM and SIGINT. A stop channel is returned +// which is closed on one of these signals. If a second signal is caught, the program +// is terminated with exit code 1. +func SetupSignalHandler() (stopCh <-chan struct{}) { + close(onlyOneSignalHandler) // panics when called twice + + stop := make(chan struct{}) + c := make(chan os.Signal, 2) + signal.Notify(c, shutdownSignals...) + go func() { + <-c + close(stop) + <-c + os.Exit(1) // second signal. Exit directly. + }() + + return stop +} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/doc.go b/vendor/k8s.io/apiserver/pkg/server/signal_posix.go similarity index 81% rename from vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/doc.go rename to vendor/k8s.io/apiserver/pkg/server/signal_posix.go index f870a997..11b3bba6 100644 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/doc.go +++ b/vendor/k8s.io/apiserver/pkg/server/signal_posix.go @@ -1,3 +1,5 @@ +// +build !windows + /* Copyright 2017 The Kubernetes Authors. @@ -14,8 +16,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -// +k8s:deepcopy-gen=package -// +k8s:conversion-gen=k8s.io/metrics/pkg/apis/metrics -// +k8s:openapi-gen=true +package server + +import ( + "os" + "syscall" +) -package v1alpha1 +var shutdownSignals = []os.Signal{os.Interrupt, syscall.SIGTERM} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/doc.go b/vendor/k8s.io/apiserver/pkg/server/signal_windows.go similarity index 87% rename from vendor/k8s.io/metrics/pkg/apis/metrics/doc.go rename to vendor/k8s.io/apiserver/pkg/server/signal_windows.go index 9437a13f..e7645a20 100644 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/doc.go +++ b/vendor/k8s.io/apiserver/pkg/server/signal_windows.go @@ -14,6 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -// +k8s:deepcopy-gen=package -// +groupName=metrics.k8s.io -package metrics +package server + +import ( + "os" +) + +var shutdownSignals = []os.Signal{os.Interrupt} diff --git a/vendor/k8s.io/apiserver/pkg/storage/BUILD b/vendor/k8s.io/apiserver/pkg/storage/BUILD index 1218c464..4ed7f4be 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/BUILD +++ b/vendor/k8s.io/apiserver/pkg/storage/BUILD @@ -9,64 +9,38 @@ load( go_test( name = "go_default_test", srcs = [ - "cacher_whitebox_test.go", "selection_predicate_test.go", - "time_budget_test.go", "util_test.go", - "watch_cache_test.go", ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) go_library( name = "go_default_library", srcs = [ - "cacher.go", "doc.go", "errors.go", "interfaces.go", "selection_predicate.go", - "time_budget.go", "util.go", - "watch_cache.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage", importpath = "k8s.io/apiserver/pkg/storage", deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/trace:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", ], ) @@ -81,6 +55,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//staging/src/k8s.io/apiserver/pkg/storage/cacher:all-srcs", "//staging/src/k8s.io/apiserver/pkg/storage/errors:all-srcs", "//staging/src/k8s.io/apiserver/pkg/storage/etcd:all-srcs", "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:all-srcs", diff --git a/vendor/k8s.io/apiserver/pkg/storage/cacher.go b/vendor/k8s.io/apiserver/pkg/storage/cacher.go deleted file mode 100644 index ab4ab04f..00000000 --- a/vendor/k8s.io/apiserver/pkg/storage/cacher.go +++ /dev/null @@ -1,989 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 storage - -import ( - "context" - "fmt" - "net/http" - "reflect" - "sync" - "time" - - "github.com/golang/glog" - - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/conversion" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/apimachinery/pkg/watch" - "k8s.io/apiserver/pkg/features" - utilfeature "k8s.io/apiserver/pkg/util/feature" - utiltrace "k8s.io/apiserver/pkg/util/trace" - "k8s.io/client-go/tools/cache" -) - -// CacherConfig contains the configuration for a given Cache. -type CacherConfig struct { - // Maximum size of the history cached in memory. - CacheCapacity int - - // An underlying storage.Interface. - Storage Interface - - // An underlying storage.Versioner. - Versioner Versioner - - // The Cache will be caching objects of a given Type and assumes that they - // are all stored under ResourcePrefix directory in the underlying database. - Type interface{} - ResourcePrefix string - - // KeyFunc is used to get a key in the underlying storage for a given object. - KeyFunc func(runtime.Object) (string, error) - - // GetAttrsFunc is used to get object labels, fields, and the uninitialized bool - GetAttrsFunc func(runtime.Object) (label labels.Set, field fields.Set, uninitialized bool, err error) - - // TriggerPublisherFunc is used for optimizing amount of watchers that - // needs to process an incoming event. - TriggerPublisherFunc TriggerPublisherFunc - - // NewList is a function that creates new empty object storing a list of - // objects of type Type. - NewListFunc func() runtime.Object - - Codec runtime.Codec -} - -type watchersMap map[int]*cacheWatcher - -func (wm watchersMap) addWatcher(w *cacheWatcher, number int) { - wm[number] = w -} - -func (wm watchersMap) deleteWatcher(number int) { - delete(wm, number) -} - -func (wm watchersMap) terminateAll() { - for key, watcher := range wm { - delete(wm, key) - watcher.stop() - } -} - -type indexedWatchers struct { - allWatchers watchersMap - valueWatchers map[string]watchersMap -} - -func (i *indexedWatchers) addWatcher(w *cacheWatcher, number int, value string, supported bool) { - if supported { - if _, ok := i.valueWatchers[value]; !ok { - i.valueWatchers[value] = watchersMap{} - } - i.valueWatchers[value].addWatcher(w, number) - } else { - i.allWatchers.addWatcher(w, number) - } -} - -func (i *indexedWatchers) deleteWatcher(number int, value string, supported bool) { - if supported { - i.valueWatchers[value].deleteWatcher(number) - if len(i.valueWatchers[value]) == 0 { - delete(i.valueWatchers, value) - } - } else { - i.allWatchers.deleteWatcher(number) - } -} - -func (i *indexedWatchers) terminateAll(objectType reflect.Type) { - if len(i.allWatchers) > 0 || len(i.valueWatchers) > 0 { - glog.Warningf("Terminating all watchers from cacher %v", objectType) - } - i.allWatchers.terminateAll() - for index, watchers := range i.valueWatchers { - watchers.terminateAll() - delete(i.valueWatchers, index) - } -} - -type filterWithAttrsFunc func(key string, l labels.Set, f fields.Set, uninitialized bool) bool - -// Cacher is responsible for serving WATCH and LIST requests for a given -// resource from its internal cache and updating its cache in the background -// based on the underlying storage contents. -// Cacher implements storage.Interface (although most of the calls are just -// delegated to the underlying storage). -type Cacher struct { - // HighWaterMarks for performance debugging. - // Important: Since HighWaterMark is using sync/atomic, it has to be at the top of the struct due to a bug on 32-bit platforms - // See: https://golang.org/pkg/sync/atomic/ for more information - incomingHWM HighWaterMark - // Incoming events that should be dispatched to watchers. - incoming chan watchCacheEvent - - sync.RWMutex - - // Before accessing the cacher's cache, wait for the ready to be ok. - // This is necessary to prevent users from accessing structures that are - // uninitialized or are being repopulated right now. - // ready needs to be set to false when the cacher is paused or stopped. - // ready needs to be set to true when the cacher is ready to use after - // initialization. - ready *ready - - // Underlying storage.Interface. - storage Interface - - // Expected type of objects in the underlying cache. - objectType reflect.Type - - // "sliding window" of recent changes of objects and the current state. - watchCache *watchCache - reflector *cache.Reflector - - // Versioner is used to handle resource versions. - versioner Versioner - - // triggerFunc is used for optimizing amount of watchers that needs to process - // an incoming event. - triggerFunc TriggerPublisherFunc - // watchers is mapping from the value of trigger function that a - // watcher is interested into the watchers - watcherIdx int - watchers indexedWatchers - - // Defines a time budget that can be spend on waiting for not-ready watchers - // while dispatching event before shutting them down. - dispatchTimeoutBudget *timeBudget - - // Handling graceful termination. - stopLock sync.RWMutex - stopped bool - stopCh chan struct{} - stopWg sync.WaitGroup -} - -// Create a new Cacher responsible for servicing WATCH and LIST requests from -// its internal cache and updating its cache in the background based on the -// given configuration. -func NewCacherFromConfig(config CacherConfig) *Cacher { - watchCache := newWatchCache(config.CacheCapacity, config.KeyFunc, config.GetAttrsFunc) - listerWatcher := newCacherListerWatcher(config.Storage, config.ResourcePrefix, config.NewListFunc) - reflectorName := "storage/cacher.go:" + config.ResourcePrefix - - // Give this error when it is constructed rather than when you get the - // first watch item, because it's much easier to track down that way. - if obj, ok := config.Type.(runtime.Object); ok { - if err := runtime.CheckCodec(config.Codec, obj); err != nil { - panic("storage codec doesn't seem to match given type: " + err.Error()) - } - } - - stopCh := make(chan struct{}) - cacher := &Cacher{ - ready: newReady(), - storage: config.Storage, - objectType: reflect.TypeOf(config.Type), - watchCache: watchCache, - reflector: cache.NewNamedReflector(reflectorName, listerWatcher, config.Type, watchCache, 0), - versioner: config.Versioner, - triggerFunc: config.TriggerPublisherFunc, - watcherIdx: 0, - watchers: indexedWatchers{ - allWatchers: make(map[int]*cacheWatcher), - valueWatchers: make(map[string]watchersMap), - }, - // TODO: Figure out the correct value for the buffer size. - incoming: make(chan watchCacheEvent, 100), - dispatchTimeoutBudget: newTimeBudget(stopCh), - // We need to (potentially) stop both: - // - wait.Until go-routine - // - reflector.ListAndWatch - // and there are no guarantees on the order that they will stop. - // So we will be simply closing the channel, and synchronizing on the WaitGroup. - stopCh: stopCh, - } - watchCache.SetOnEvent(cacher.processEvent) - go cacher.dispatchEvents() - - cacher.stopWg.Add(1) - go func() { - defer cacher.stopWg.Done() - wait.Until( - func() { - if !cacher.isStopped() { - cacher.startCaching(stopCh) - } - }, time.Second, stopCh, - ) - }() - return cacher -} - -func (c *Cacher) startCaching(stopChannel <-chan struct{}) { - // The 'usable' lock is always 'RLock'able when it is safe to use the cache. - // It is safe to use the cache after a successful list until a disconnection. - // We start with usable (write) locked. The below OnReplace function will - // unlock it after a successful list. The below defer will then re-lock - // it when this function exits (always due to disconnection), only if - // we actually got a successful list. This cycle will repeat as needed. - successfulList := false - c.watchCache.SetOnReplace(func() { - successfulList = true - c.ready.set(true) - }) - defer func() { - if successfulList { - c.ready.set(false) - } - }() - - c.terminateAllWatchers() - // Note that since onReplace may be not called due to errors, we explicitly - // need to retry it on errors under lock. - // Also note that startCaching is called in a loop, so there's no need - // to have another loop here. - if err := c.reflector.ListAndWatch(stopChannel); err != nil { - glog.Errorf("unexpected ListAndWatch error: %v", err) - } -} - -// Implements storage.Interface. -func (c *Cacher) Versioner() Versioner { - return c.storage.Versioner() -} - -// Implements storage.Interface. -func (c *Cacher) Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error { - return c.storage.Create(ctx, key, obj, out, ttl) -} - -// Implements storage.Interface. -func (c *Cacher) Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error { - return c.storage.Delete(ctx, key, out, preconditions) -} - -// Implements storage.Interface. -func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate) (watch.Interface, error) { - watchRV, err := c.versioner.ParseWatchResourceVersion(resourceVersion) - if err != nil { - return nil, err - } - - c.ready.wait() - - // We explicitly use thread unsafe version and do locking ourself to ensure that - // no new events will be processed in the meantime. The watchCache will be unlocked - // on return from this function. - // Note that we cannot do it under Cacher lock, to avoid a deadlock, since the - // underlying watchCache is calling processEvent under its lock. - c.watchCache.RLock() - defer c.watchCache.RUnlock() - initEvents, err := c.watchCache.GetAllEventsSinceThreadUnsafe(watchRV) - if err != nil { - // To match the uncached watch implementation, once we have passed authn/authz/admission, - // and successfully parsed a resource version, other errors must fail with a watch event of type ERROR, - // rather than a directly returned error. - return newErrWatcher(err), nil - } - - triggerValue, triggerSupported := "", false - // TODO: Currently we assume that in a given Cacher object, any that is - // passed here is aware of exactly the same trigger (at most one). - // Thus, either 0 or 1 values will be returned. - if matchValues := pred.MatcherIndex(); len(matchValues) > 0 { - triggerValue, triggerSupported = matchValues[0].Value, true - } - - // If there is triggerFunc defined, but triggerSupported is false, - // we can't narrow the amount of events significantly at this point. - // - // That said, currently triggerFunc is defined only for Pods and Nodes, - // and there is only constant number of watchers for which triggerSupported - // is false (excluding those issues explicitly by users). - // Thus, to reduce the risk of those watchers blocking all watchers of a - // given resource in the system, we increase the sizes of buffers for them. - chanSize := 10 - if c.triggerFunc != nil && !triggerSupported { - // TODO: We should tune this value and ideally make it dependent on the - // number of objects of a given type and/or their churn. - chanSize = 1000 - } - - c.Lock() - defer c.Unlock() - forget := forgetWatcher(c, c.watcherIdx, triggerValue, triggerSupported) - watcher := newCacheWatcher(watchRV, chanSize, initEvents, filterWithAttrsFunction(key, pred), forget, c.versioner) - - c.watchers.addWatcher(watcher, c.watcherIdx, triggerValue, triggerSupported) - c.watcherIdx++ - return watcher, nil -} - -// Implements storage.Interface. -func (c *Cacher) WatchList(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate) (watch.Interface, error) { - return c.Watch(ctx, key, resourceVersion, pred) -} - -// Implements storage.Interface. -func (c *Cacher) Get(ctx context.Context, key string, resourceVersion string, objPtr runtime.Object, ignoreNotFound bool) error { - if resourceVersion == "" { - // If resourceVersion is not specified, serve it from underlying - // storage (for backward compatibility). - return c.storage.Get(ctx, key, resourceVersion, objPtr, ignoreNotFound) - } - - // If resourceVersion is specified, serve it from cache. - // It's guaranteed that the returned value is at least that - // fresh as the given resourceVersion. - getRV, err := c.versioner.ParseListResourceVersion(resourceVersion) - if err != nil { - return err - } - - if getRV == 0 && !c.ready.check() { - // If Cacher is not yet initialized and we don't require any specific - // minimal resource version, simply forward the request to storage. - return c.storage.Get(ctx, key, resourceVersion, objPtr, ignoreNotFound) - } - - // Do not create a trace - it's not for free and there are tons - // of Get requests. We can add it if it will be really needed. - c.ready.wait() - - objVal, err := conversion.EnforcePtr(objPtr) - if err != nil { - return err - } - - obj, exists, readResourceVersion, err := c.watchCache.WaitUntilFreshAndGet(getRV, key, nil) - if err != nil { - return err - } - - if exists { - elem, ok := obj.(*storeElement) - if !ok { - return fmt.Errorf("non *storeElement returned from storage: %v", obj) - } - objVal.Set(reflect.ValueOf(elem.Object).Elem()) - } else { - objVal.Set(reflect.Zero(objVal.Type())) - if !ignoreNotFound { - return NewKeyNotFoundError(key, int64(readResourceVersion)) - } - } - return nil -} - -// Implements storage.Interface. -func (c *Cacher) GetToList(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate, listObj runtime.Object) error { - pagingEnabled := utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking) - if resourceVersion == "" || (pagingEnabled && (len(pred.Continue) > 0 || pred.Limit > 0)) { - // If resourceVersion is not specified, serve it from underlying - // storage (for backward compatibility). If a continuation or limit is - // requested, serve it from the underlying storage as well. - return c.storage.GetToList(ctx, key, resourceVersion, pred, listObj) - } - - // If resourceVersion is specified, serve it from cache. - // It's guaranteed that the returned value is at least that - // fresh as the given resourceVersion. - listRV, err := c.versioner.ParseListResourceVersion(resourceVersion) - if err != nil { - return err - } - - if listRV == 0 && !c.ready.check() { - // If Cacher is not yet initialized and we don't require any specific - // minimal resource version, simply forward the request to storage. - return c.storage.GetToList(ctx, key, resourceVersion, pred, listObj) - } - - trace := utiltrace.New(fmt.Sprintf("cacher %v: List", c.objectType.String())) - defer trace.LogIfLong(500 * time.Millisecond) - - c.ready.wait() - trace.Step("Ready") - - // List elements with at least 'listRV' from cache. - listPtr, err := meta.GetItemsPtr(listObj) - if err != nil { - return err - } - listVal, err := conversion.EnforcePtr(listPtr) - if err != nil || listVal.Kind() != reflect.Slice { - return fmt.Errorf("need a pointer to slice, got %v", listVal.Kind()) - } - filter := filterWithAttrsFunction(key, pred) - - obj, exists, readResourceVersion, err := c.watchCache.WaitUntilFreshAndGet(listRV, key, trace) - if err != nil { - return err - } - trace.Step("Got from cache") - - if exists { - elem, ok := obj.(*storeElement) - if !ok { - return fmt.Errorf("non *storeElement returned from storage: %v", obj) - } - if filter(elem.Key, elem.Labels, elem.Fields, elem.Uninitialized) { - listVal.Set(reflect.Append(listVal, reflect.ValueOf(elem.Object).Elem())) - } - } - if c.versioner != nil { - if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil { - return err - } - } - return nil -} - -// Implements storage.Interface. -func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate, listObj runtime.Object) error { - pagingEnabled := utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking) - hasContinuation := pagingEnabled && len(pred.Continue) > 0 - hasLimit := pagingEnabled && pred.Limit > 0 && resourceVersion != "0" - if resourceVersion == "" || hasContinuation || hasLimit { - // If resourceVersion is not specified, serve it from underlying - // storage (for backward compatibility). If a continuation is - // requested, serve it from the underlying storage as well. - // Limits are only sent to storage when resourceVersion is non-zero - // since the watch cache isn't able to perform continuations, and - // limits are ignored when resource version is zero. - return c.storage.List(ctx, key, resourceVersion, pred, listObj) - } - - // If resourceVersion is specified, serve it from cache. - // It's guaranteed that the returned value is at least that - // fresh as the given resourceVersion. - listRV, err := c.versioner.ParseListResourceVersion(resourceVersion) - if err != nil { - return err - } - - if listRV == 0 && !c.ready.check() { - // If Cacher is not yet initialized and we don't require any specific - // minimal resource version, simply forward the request to storage. - return c.storage.List(ctx, key, resourceVersion, pred, listObj) - } - - trace := utiltrace.New(fmt.Sprintf("cacher %v: List", c.objectType.String())) - defer trace.LogIfLong(500 * time.Millisecond) - - c.ready.wait() - trace.Step("Ready") - - // List elements with at least 'listRV' from cache. - listPtr, err := meta.GetItemsPtr(listObj) - if err != nil { - return err - } - listVal, err := conversion.EnforcePtr(listPtr) - if err != nil || listVal.Kind() != reflect.Slice { - return fmt.Errorf("need a pointer to slice, got %v", listVal.Kind()) - } - filter := filterWithAttrsFunction(key, pred) - - objs, readResourceVersion, err := c.watchCache.WaitUntilFreshAndList(listRV, trace) - if err != nil { - return err - } - trace.Step(fmt.Sprintf("Listed %d items from cache", len(objs))) - if len(objs) > listVal.Cap() && pred.Label.Empty() && pred.Field.Empty() { - // Resize the slice appropriately, since we already know that none - // of the elements will be filtered out. - listVal.Set(reflect.MakeSlice(reflect.SliceOf(c.objectType.Elem()), 0, len(objs))) - trace.Step("Resized result") - } - for _, obj := range objs { - elem, ok := obj.(*storeElement) - if !ok { - return fmt.Errorf("non *storeElement returned from storage: %v", obj) - } - if filter(elem.Key, elem.Labels, elem.Fields, elem.Uninitialized) { - listVal.Set(reflect.Append(listVal, reflect.ValueOf(elem.Object).Elem())) - } - } - trace.Step(fmt.Sprintf("Filtered %d items", listVal.Len())) - if c.versioner != nil { - if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil { - return err - } - } - return nil -} - -// Implements storage.Interface. -func (c *Cacher) GuaranteedUpdate( - ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool, - preconditions *Preconditions, tryUpdate UpdateFunc, _ ...runtime.Object) error { - // Ignore the suggestion and try to pass down the current version of the object - // read from cache. - if elem, exists, err := c.watchCache.GetByKey(key); err != nil { - glog.Errorf("GetByKey returned error: %v", err) - } else if exists { - currObj := elem.(*storeElement).Object.DeepCopyObject() - return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, currObj) - } - // If we couldn't get the object, fallback to no-suggestion. - return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate) -} - -func (c *Cacher) Count(pathPrefix string) (int64, error) { - return c.storage.Count(pathPrefix) -} - -func (c *Cacher) triggerValues(event *watchCacheEvent) ([]string, bool) { - // TODO: Currently we assume that in a given Cacher object, its - // is aware of exactly the same trigger (at most one). Thus calling: - // c.triggerFunc() - // can return only 0 or 1 values. - // That means, that triggerValues itself may return up to 2 different values. - if c.triggerFunc == nil { - return nil, false - } - result := make([]string, 0, 2) - matchValues := c.triggerFunc(event.Object) - if len(matchValues) > 0 { - result = append(result, matchValues[0].Value) - } - if event.PrevObject == nil { - return result, len(result) > 0 - } - prevMatchValues := c.triggerFunc(event.PrevObject) - if len(prevMatchValues) > 0 { - if len(result) == 0 || result[0] != prevMatchValues[0].Value { - result = append(result, prevMatchValues[0].Value) - } - } - return result, len(result) > 0 -} - -func (c *Cacher) processEvent(event *watchCacheEvent) { - if curLen := int64(len(c.incoming)); c.incomingHWM.Update(curLen) { - // Monitor if this gets backed up, and how much. - glog.V(1).Infof("cacher (%v): %v objects queued in incoming channel.", c.objectType.String(), curLen) - } - c.incoming <- *event -} - -func (c *Cacher) dispatchEvents() { - for { - select { - case event, ok := <-c.incoming: - if !ok { - return - } - c.dispatchEvent(&event) - case <-c.stopCh: - return - } - } -} - -func (c *Cacher) dispatchEvent(event *watchCacheEvent) { - triggerValues, supported := c.triggerValues(event) - - c.Lock() - defer c.Unlock() - // Iterate over "allWatchers" no matter what the trigger function is. - for _, watcher := range c.watchers.allWatchers { - watcher.add(event, c.dispatchTimeoutBudget) - } - if supported { - // Iterate over watchers interested in the given values of the trigger. - for _, triggerValue := range triggerValues { - for _, watcher := range c.watchers.valueWatchers[triggerValue] { - watcher.add(event, c.dispatchTimeoutBudget) - } - } - } else { - // supported equal to false generally means that trigger function - // is not defined (or not aware of any indexes). In this case, - // watchers filters should generally also don't generate any - // trigger values, but can cause problems in case of some - // misconfiguration. Thus we paranoidly leave this branch. - - // Iterate over watchers interested in exact values for all values. - for _, watchers := range c.watchers.valueWatchers { - for _, watcher := range watchers { - watcher.add(event, c.dispatchTimeoutBudget) - } - } - } -} - -func (c *Cacher) terminateAllWatchers() { - c.Lock() - defer c.Unlock() - c.watchers.terminateAll(c.objectType) -} - -func (c *Cacher) isStopped() bool { - c.stopLock.RLock() - defer c.stopLock.RUnlock() - return c.stopped -} - -func (c *Cacher) Stop() { - // avoid stopping twice (note: cachers are shared with subresources) - if c.isStopped() { - return - } - c.stopLock.Lock() - if c.stopped { - c.stopLock.Unlock() - return - } - c.stopped = true - c.stopLock.Unlock() - close(c.stopCh) - c.stopWg.Wait() -} - -func forgetWatcher(c *Cacher, index int, triggerValue string, triggerSupported bool) func(bool) { - return func(lock bool) { - if lock { - c.Lock() - defer c.Unlock() - } else { - // false is currently passed only if we are forcing watcher to close due - // to its unresponsiveness and blocking other watchers. - // TODO: Get this information in cleaner way. - glog.V(1).Infof("Forcing watcher close due to unresponsiveness: %v", c.objectType.String()) - } - // It's possible that the watcher is already not in the structure (e.g. in case of - // simultaneous Stop() and terminateAllWatchers(), but it doesn't break anything. - c.watchers.deleteWatcher(index, triggerValue, triggerSupported) - } -} - -func filterWithAttrsFunction(key string, p SelectionPredicate) filterWithAttrsFunc { - filterFunc := func(objKey string, label labels.Set, field fields.Set, uninitialized bool) bool { - if !hasPathPrefix(objKey, key) { - return false - } - return p.MatchesObjectAttributes(label, field, uninitialized) - } - return filterFunc -} - -// Returns resource version to which the underlying cache is synced. -func (c *Cacher) LastSyncResourceVersion() (uint64, error) { - c.ready.wait() - - resourceVersion := c.reflector.LastSyncResourceVersion() - return c.versioner.ParseListResourceVersion(resourceVersion) -} - -// cacherListerWatcher opaques storage.Interface to expose cache.ListerWatcher. -type cacherListerWatcher struct { - storage Interface - resourcePrefix string - newListFunc func() runtime.Object -} - -func newCacherListerWatcher(storage Interface, resourcePrefix string, newListFunc func() runtime.Object) cache.ListerWatcher { - return &cacherListerWatcher{ - storage: storage, - resourcePrefix: resourcePrefix, - newListFunc: newListFunc, - } -} - -// Implements cache.ListerWatcher interface. -func (lw *cacherListerWatcher) List(options metav1.ListOptions) (runtime.Object, error) { - list := lw.newListFunc() - if err := lw.storage.List(context.TODO(), lw.resourcePrefix, "", Everything, list); err != nil { - return nil, err - } - return list, nil -} - -// Implements cache.ListerWatcher interface. -func (lw *cacherListerWatcher) Watch(options metav1.ListOptions) (watch.Interface, error) { - return lw.storage.WatchList(context.TODO(), lw.resourcePrefix, options.ResourceVersion, Everything) -} - -// errWatcher implements watch.Interface to return a single error -type errWatcher struct { - result chan watch.Event -} - -func newErrWatcher(err error) *errWatcher { - // Create an error event - errEvent := watch.Event{Type: watch.Error} - switch err := err.(type) { - case runtime.Object: - errEvent.Object = err - case *errors.StatusError: - errEvent.Object = &err.ErrStatus - default: - errEvent.Object = &metav1.Status{ - Status: metav1.StatusFailure, - Message: err.Error(), - Reason: metav1.StatusReasonInternalError, - Code: http.StatusInternalServerError, - } - } - - // Create a watcher with room for a single event, populate it, and close the channel - watcher := &errWatcher{result: make(chan watch.Event, 1)} - watcher.result <- errEvent - close(watcher.result) - - return watcher -} - -// Implements watch.Interface. -func (c *errWatcher) ResultChan() <-chan watch.Event { - return c.result -} - -// Implements watch.Interface. -func (c *errWatcher) Stop() { - // no-op -} - -// cachWatcher implements watch.Interface -type cacheWatcher struct { - sync.Mutex - input chan *watchCacheEvent - result chan watch.Event - done chan struct{} - filter filterWithAttrsFunc - stopped bool - forget func(bool) - versioner Versioner -} - -func newCacheWatcher(resourceVersion uint64, chanSize int, initEvents []*watchCacheEvent, filter filterWithAttrsFunc, forget func(bool), versioner Versioner) *cacheWatcher { - watcher := &cacheWatcher{ - input: make(chan *watchCacheEvent, chanSize), - result: make(chan watch.Event, chanSize), - done: make(chan struct{}), - filter: filter, - stopped: false, - forget: forget, - versioner: versioner, - } - go watcher.process(initEvents, resourceVersion) - return watcher -} - -// Implements watch.Interface. -func (c *cacheWatcher) ResultChan() <-chan watch.Event { - return c.result -} - -// Implements watch.Interface. -func (c *cacheWatcher) Stop() { - c.forget(true) - c.stop() -} - -func (c *cacheWatcher) stop() { - c.Lock() - defer c.Unlock() - if !c.stopped { - c.stopped = true - close(c.done) - close(c.input) - } -} - -var timerPool sync.Pool - -func (c *cacheWatcher) add(event *watchCacheEvent, budget *timeBudget) { - // Try to send the event immediately, without blocking. - select { - case c.input <- event: - return - default: - } - - // OK, block sending, but only for up to . - // cacheWatcher.add is called very often, so arrange - // to reuse timers instead of constantly allocating. - startTime := time.Now() - timeout := budget.takeAvailable() - - t, ok := timerPool.Get().(*time.Timer) - if ok { - t.Reset(timeout) - } else { - t = time.NewTimer(timeout) - } - defer timerPool.Put(t) - - select { - case c.input <- event: - stopped := t.Stop() - if !stopped { - // Consume triggered (but not yet received) timer event - // so that future reuse does not get a spurious timeout. - <-t.C - } - case <-t.C: - // This means that we couldn't send event to that watcher. - // Since we don't want to block on it infinitely, - // we simply terminate it. - c.forget(false) - c.stop() - } - - budget.returnUnused(timeout - time.Since(startTime)) -} - -// NOTE: sendWatchCacheEvent is assumed to not modify !!! -func (c *cacheWatcher) sendWatchCacheEvent(event *watchCacheEvent) { - curObjPasses := event.Type != watch.Deleted && c.filter(event.Key, event.ObjLabels, event.ObjFields, event.ObjUninitialized) - oldObjPasses := false - if event.PrevObject != nil { - oldObjPasses = c.filter(event.Key, event.PrevObjLabels, event.PrevObjFields, event.PrevObjUninitialized) - } - if !curObjPasses && !oldObjPasses { - // Watcher is not interested in that object. - return - } - - var watchEvent watch.Event - switch { - case curObjPasses && !oldObjPasses: - watchEvent = watch.Event{Type: watch.Added, Object: event.Object.DeepCopyObject()} - case curObjPasses && oldObjPasses: - watchEvent = watch.Event{Type: watch.Modified, Object: event.Object.DeepCopyObject()} - case !curObjPasses && oldObjPasses: - // return a delete event with the previous object content, but with the event's resource version - oldObj := event.PrevObject.DeepCopyObject() - if err := c.versioner.UpdateObject(oldObj, event.ResourceVersion); err != nil { - utilruntime.HandleError(fmt.Errorf("failure to version api object (%d) %#v: %v", event.ResourceVersion, oldObj, err)) - } - watchEvent = watch.Event{Type: watch.Deleted, Object: oldObj} - } - - // We need to ensure that if we put event X to the c.result, all - // previous events were already put into it before, no matter whether - // c.done is close or not. - // Thus we cannot simply select from c.done and c.result and this - // would give us non-determinism. - // At the same time, we don't want to block infinitely on putting - // to c.result, when c.done is already closed. - - // This ensures that with c.done already close, we at most once go - // into the next select after this. With that, no matter which - // statement we choose there, we will deliver only consecutive - // events. - select { - case <-c.done: - return - default: - } - - select { - case c.result <- watchEvent: - case <-c.done: - } -} - -func (c *cacheWatcher) process(initEvents []*watchCacheEvent, resourceVersion uint64) { - defer utilruntime.HandleCrash() - - // Check how long we are processing initEvents. - // As long as these are not processed, we are not processing - // any incoming events, so if it takes long, we may actually - // block all watchers for some time. - // TODO: From the logs it seems that there happens processing - // times even up to 1s which is very long. However, this doesn't - // depend that much on the number of initEvents. E.g. from the - // 2000-node Kubemark run we have logs like this, e.g.: - // ... processing 13862 initEvents took 66.808689ms - // ... processing 14040 initEvents took 993.532539ms - // We should understand what is blocking us in those cases (e.g. - // is it lack of CPU, network, or sth else) and potentially - // consider increase size of result buffer in those cases. - const initProcessThreshold = 500 * time.Millisecond - startTime := time.Now() - for _, event := range initEvents { - c.sendWatchCacheEvent(event) - } - processingTime := time.Since(startTime) - if processingTime > initProcessThreshold { - objType := "" - if len(initEvents) > 0 { - objType = reflect.TypeOf(initEvents[0].Object).String() - } - glog.V(2).Infof("processing %d initEvents of %s took %v", len(initEvents), objType, processingTime) - } - - defer close(c.result) - defer c.Stop() - for { - event, ok := <-c.input - if !ok { - return - } - // only send events newer than resourceVersion - if event.ResourceVersion > resourceVersion { - c.sendWatchCacheEvent(event) - } - } -} - -type ready struct { - ok bool - c *sync.Cond -} - -func newReady() *ready { - return &ready{c: sync.NewCond(&sync.Mutex{})} -} - -func (r *ready) wait() { - r.c.L.Lock() - for !r.ok { - r.c.Wait() - } - r.c.L.Unlock() -} - -// TODO: Make check() function more sophisticated, in particular -// allow it to behave as "waitWithTimeout". -func (r *ready) check() bool { - r.c.L.Lock() - defer r.c.L.Unlock() - return r.ok -} - -func (r *ready) set(ok bool) { - r.c.L.Lock() - defer r.c.L.Unlock() - r.ok = ok - r.c.Broadcast() -} diff --git a/vendor/k8s.io/apiserver/pkg/storage/errors.go b/vendor/k8s.io/apiserver/pkg/storage/errors.go index a4d134ac..f73d47ae 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/errors.go +++ b/vendor/k8s.io/apiserver/pkg/storage/errors.go @@ -166,5 +166,5 @@ func NewInternalError(reason string) InternalError { } func NewInternalErrorf(format string, a ...interface{}) InternalError { - return InternalError{fmt.Sprintf(format, a)} + return InternalError{fmt.Sprintf(format, a...)} } diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd/BUILD index ccdf63e5..eea13867 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd/BUILD +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/BUILD @@ -15,25 +15,26 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/apitesting:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/apis/example:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage/etcd/etcdtest:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage/etcd/testing:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage/testing:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage/tests:go_default_library", "//vendor/github.com/coreos/etcd/client:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/apis/example:go_default_library", - "//vendor/k8s.io/apiserver/pkg/apis/example/v1:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/etcd/etcdtest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/etcd/testing:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/testing:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/tests:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", ], ) @@ -45,22 +46,23 @@ go_library( "etcd_helper.go", "etcd_watcher.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd", importpath = "k8s.io/apiserver/pkg/storage/etcd", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage/etcd/metrics:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage/etcd/util:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/trace:go_default_library", "//vendor/github.com/coreos/etcd/client:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/etcd/metrics:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/etcd/util:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/trace:go_default_library", ], ) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner.go b/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner.go index 5534f9fa..471a3313 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner.go @@ -82,11 +82,11 @@ func (a APIObjectVersioner) ObjectResourceVersion(obj runtime.Object) (uint64, e return strconv.ParseUint(version, 10, 64) } -// ParseWatchResourceVersion takes a resource version argument and converts it to -// the etcd version we should pass to helper.Watch(). Because resourceVersion is +// ParseResourceVersion takes a resource version argument and converts it to +// the etcd version. For watch we should pass to helper.Watch(). Because resourceVersion is // an opaque value, the default watch behavior for non-zero watch is to watch // the next value (if you pass "1", you will see updates from "2" onwards). -func (a APIObjectVersioner) ParseWatchResourceVersion(resourceVersion string) (uint64, error) { +func (a APIObjectVersioner) ParseResourceVersion(resourceVersion string) (uint64, error) { if resourceVersion == "" || resourceVersion == "0" { return 0, nil } @@ -101,25 +101,6 @@ func (a APIObjectVersioner) ParseWatchResourceVersion(resourceVersion string) (u return version, nil } -// ParseListResourceVersion takes a resource version argument and converts it to -// the etcd version. -// TODO: reevaluate whether it is really clearer to have both this and the -// Watch version of this function, since they perform the same logic. -func (a APIObjectVersioner) ParseListResourceVersion(resourceVersion string) (uint64, error) { - if resourceVersion == "" { - return 0, nil - } - version, err := strconv.ParseUint(resourceVersion, 10, 64) - if err != nil { - return 0, storage.NewInvalidError(field.ErrorList{ - // Validation errors are supposed to return version-specific field - // paths, but this is probably close enough. - field.Invalid(field.NewPath("resourceVersion"), resourceVersion, err.Error()), - }) - } - return version, nil -} - // APIObjectVersioner implements Versioner var Versioner storage.Versioner = APIObjectVersioner{} diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner_test.go b/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner_test.go new file mode 100644 index 00000000..4126f58d --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner_test.go @@ -0,0 +1,95 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 etcd + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apiserver/pkg/storage" + storagetesting "k8s.io/apiserver/pkg/storage/testing" +) + +func TestObjectVersioner(t *testing.T) { + v := APIObjectVersioner{} + if ver, err := v.ObjectResourceVersion(&storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{ResourceVersion: "5"}}); err != nil || ver != 5 { + t.Errorf("unexpected version: %d %v", ver, err) + } + if ver, err := v.ObjectResourceVersion(&storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{ResourceVersion: "a"}}); err == nil || ver != 0 { + t.Errorf("unexpected version: %d %v", ver, err) + } + obj := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{ResourceVersion: "a"}} + if err := v.UpdateObject(obj, 5); err != nil { + t.Fatalf("unexpected error: %v", err) + } + if obj.ResourceVersion != "5" || obj.DeletionTimestamp != nil { + t.Errorf("unexpected resource version: %#v", obj) + } +} + +func TestEtcdParseResourceVersion(t *testing.T) { + testCases := []struct { + Version string + ExpectVersion uint64 + Err bool + }{ + {Version: "", ExpectVersion: 0}, + {Version: "a", Err: true}, + {Version: " ", Err: true}, + {Version: "1", ExpectVersion: 1}, + {Version: "10", ExpectVersion: 10}, + } + + v := APIObjectVersioner{} + testFuncs := []func(string) (uint64, error){ + v.ParseResourceVersion, + } + + for _, testCase := range testCases { + for i, f := range testFuncs { + version, err := f(testCase.Version) + switch { + case testCase.Err && err == nil: + t.Errorf("%s[%v]: unexpected non-error", testCase.Version, i) + case testCase.Err && !storage.IsInvalidError(err): + t.Errorf("%s[%v]: unexpected error: %v", testCase.Version, i, err) + case !testCase.Err && err != nil: + t.Errorf("%s[%v]: unexpected error: %v", testCase.Version, i, err) + } + if version != testCase.ExpectVersion { + t.Errorf("%s[%v]: expected version %d but was %d", testCase.Version, i, testCase.ExpectVersion, version) + } + } + } +} + +func TestCompareResourceVersion(t *testing.T) { + five := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{ResourceVersion: "5"}} + six := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{ResourceVersion: "6"}} + + versioner := APIObjectVersioner{} + + if e, a := -1, versioner.CompareResourceVersion(five, six); e != a { + t.Errorf("expected %v got %v", e, a) + } + if e, a := 1, versioner.CompareResourceVersion(six, five); e != a { + t.Errorf("expected %v got %v", e, a) + } + if e, a := 0, versioner.CompareResourceVersion(six, six); e != a { + t.Errorf("expected %v got %v", e, a) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go index 2fe2bbad..c6bdd9c9 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go @@ -153,21 +153,6 @@ func (h *etcdHelper) Create(ctx context.Context, key string, obj, out runtime.Ob return err } -func checkPreconditions(key string, preconditions *storage.Preconditions, out runtime.Object) error { - if preconditions == nil { - return nil - } - objMeta, err := meta.Accessor(out) - if err != nil { - return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err) - } - if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() { - errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", preconditions.UID, objMeta.GetUID()) - return storage.NewInvalidObjError(key, errMsg) - } - return nil -} - // Implements storage.Interface. func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions) error { if ctx == nil { @@ -199,7 +184,7 @@ func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, if err != nil { return toStorageErr(err, key, 0) } - if err := checkPreconditions(key, preconditions, obj); err != nil { + if err := preconditions.Check(key, obj); err != nil { return toStorageErr(err, key, 0) } index := uint64(0) @@ -231,7 +216,7 @@ func (h *etcdHelper) Watch(ctx context.Context, key string, resourceVersion stri if ctx == nil { glog.Errorf("Context is nil") } - watchRV, err := h.versioner.ParseWatchResourceVersion(resourceVersion) + watchRV, err := h.versioner.ParseResourceVersion(resourceVersion) if err != nil { return nil, err } @@ -246,7 +231,7 @@ func (h *etcdHelper) WatchList(ctx context.Context, key string, resourceVersion if ctx == nil { glog.Errorf("Context is nil") } - watchRV, err := h.versioner.ParseWatchResourceVersion(resourceVersion) + watchRV, err := h.versioner.ParseResourceVersion(resourceVersion) if err != nil { return nil, err } @@ -493,7 +478,7 @@ func (h *etcdHelper) GuaranteedUpdate( if err != nil { return toStorageErr(err, key, 0) } - if err := checkPreconditions(key, preconditions, obj); err != nil { + if err := preconditions.Check(key, obj); err != nil { return toStorageErr(err, key, 0) } meta := storage.ResponseMeta{} diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper_test.go b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper_test.go new file mode 100644 index 00000000..a695fe25 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper_test.go @@ -0,0 +1,747 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 etcd + +import ( + "context" + "fmt" + "path" + "reflect" + "strings" + "sync" + "testing" + "time" + + etcd "github.com/coreos/etcd/client" + "github.com/stretchr/testify/require" + + apitesting "k8s.io/apimachinery/pkg/api/apitesting" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/conversion" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/apiserver/pkg/apis/example" + examplev1 "k8s.io/apiserver/pkg/apis/example/v1" + "k8s.io/apiserver/pkg/storage" + "k8s.io/apiserver/pkg/storage/etcd/etcdtest" + etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing" + storagetesting "k8s.io/apiserver/pkg/storage/testing" + storagetests "k8s.io/apiserver/pkg/storage/tests" +) + +// prefixTransformer adds and verifies that all data has the correct prefix on its way in and out. +type prefixTransformer struct { + prefix string + stale bool + err error +} + +func (p prefixTransformer) TransformStringFromStorage(s string) (string, bool, error) { + if !strings.HasPrefix(s, p.prefix) { + return "", false, fmt.Errorf("value does not have expected prefix: %s", s) + } + return strings.TrimPrefix(s, p.prefix), p.stale, p.err +} +func (p prefixTransformer) TransformStringToStorage(s string) (string, error) { + if len(s) > 0 { + return p.prefix + s, p.err + } + return s, p.err +} + +func defaultPrefix(s string) string { + return "test!" + s +} + +func defaultPrefixValue(value []byte) string { + return defaultPrefix(string(value)) +} + +func testScheme(t *testing.T) (*runtime.Scheme, serializer.CodecFactory) { + scheme := runtime.NewScheme() + scheme.Log(t) + scheme.AddKnownTypes(schema.GroupVersion{Version: runtime.APIVersionInternal}, &storagetesting.TestResource{}) + require.NoError(t, example.AddToScheme(scheme)) + require.NoError(t, examplev1.AddToScheme(scheme)) + require.NoError(t, scheme.AddConversionFuncs( + func(in *storagetesting.TestResource, out *storagetesting.TestResource, s conversion.Scope) error { + *out = *in + return nil + }, + func(in, out *time.Time, s conversion.Scope) error { + *out = *in + return nil + }, + )) + codecs := serializer.NewCodecFactory(scheme) + return scheme, codecs +} + +func newEtcdHelper(client etcd.Client, codec runtime.Codec, prefix string) etcdHelper { + return *NewEtcdStorage(client, codec, prefix, false, etcdtest.DeserializationCacheSize, prefixTransformer{prefix: "test!"}).(*etcdHelper) +} + +func createObj(t *testing.T, helper etcdHelper, name string, obj, out runtime.Object, ttl uint64) error { + err := helper.Create(context.TODO(), name, obj, out, ttl) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + return err +} + +func createPodList(t *testing.T, helper etcdHelper, list *example.PodList) error { + for i := range list.Items { + returnedObj := &example.Pod{} + err := createObj(t, helper, list.Items[i].Name, &list.Items[i], returnedObj, 0) + if err != nil { + return err + } + list.Items[i] = *returnedObj + } + return nil +} + +func TestList(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + list := example.PodList{ + Items: []example.Pod{ + { + ObjectMeta: metav1.ObjectMeta{Name: "bar"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "baz"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + }, + } + + createPodList(t, helper, &list) + var got example.PodList + // TODO: a sorted filter function could be applied such implied + // ordering on the returned list doesn't matter. + err := helper.List(context.TODO(), "/", "", storage.Everything, &got) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + + if e, a := list.Items, got.Items; !reflect.DeepEqual(e, a) { + t.Errorf("Expected %#v, got %#v", e, a) + } +} + +func TestTransformationFailure(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + pods := []example.Pod{ + { + ObjectMeta: metav1.ObjectMeta{Name: "bar"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "baz"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + } + createPodList(t, helper, &example.PodList{Items: pods[:1]}) + + // create a second resource with an invalid prefix + oldTransformer := helper.transformer + helper.transformer = prefixTransformer{prefix: "otherprefix!"} + createPodList(t, helper, &example.PodList{Items: pods[1:]}) + helper.transformer = oldTransformer + + // only the first item is returned, and no error + var got example.PodList + if err := helper.List(context.TODO(), "/", "", storage.Everything, &got); err != nil { + t.Errorf("Unexpected error %v", err) + } + if e, a := pods[:1], got.Items; !reflect.DeepEqual(e, a) { + t.Errorf("Unexpected: %s", diff.ObjectReflectDiff(e, a)) + } + + // Get should fail + if err := helper.Get(context.TODO(), "/baz", "", &example.Pod{}, false); !storage.IsInternalError(err) { + t.Errorf("Unexpected error: %v", err) + } + // GuaranteedUpdate should return an error + if err := helper.GuaranteedUpdate(context.TODO(), "/baz", &example.Pod{}, false, nil, func(input runtime.Object, res storage.ResponseMeta) (output runtime.Object, ttl *uint64, err error) { + return input, nil, nil + }, &pods[1]); !storage.IsInternalError(err) { + t.Errorf("Unexpected error: %v", err) + } + + // Delete succeeds but reports an error because we cannot access the body + if err := helper.Delete(context.TODO(), "/baz", &example.Pod{}, nil); !storage.IsInternalError(err) { + t.Errorf("Unexpected error: %v", err) + } + + if err := helper.Get(context.TODO(), "/baz", "", &example.Pod{}, false); !storage.IsNotFound(err) { + t.Errorf("Unexpected error: %v", err) + } +} + +func TestListFiltered(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + list := example.PodList{ + Items: []example.Pod{ + { + ObjectMeta: metav1.ObjectMeta{Name: "bar"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "baz"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + }, + } + + createPodList(t, helper, &list) + // List only "bar" pod + p := storage.SelectionPredicate{ + Label: labels.Everything(), + Field: fields.SelectorFromSet(fields.Set{"metadata.name": "bar"}), + GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, bool, error) { + pod := obj.(*example.Pod) + return labels.Set(pod.Labels), fields.Set{"metadata.name": pod.Name}, pod.Initializers != nil, nil + }, + } + var got example.PodList + err := helper.List(context.TODO(), "/", "", p, &got) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + // Check to make certain that the filter function only returns "bar" + if e, a := list.Items[0], got.Items[0]; !reflect.DeepEqual(e, a) { + t.Errorf("Expected %#v, got %#v", e, a) + } +} + +// TestListAcrossDirectories ensures that the client excludes directories and flattens tree-response - simulates cross-namespace query +func TestListAcrossDirectories(t *testing.T) { + _, codecs := testScheme(t) + server := etcdtesting.NewEtcdTestClientServer(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + defer server.Terminate(t) + + roothelper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + helper1 := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()+"/dir1") + helper2 := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()+"/dir2") + + list := example.PodList{ + Items: []example.Pod{ + { + ObjectMeta: metav1.ObjectMeta{Name: "baz"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "bar"}, + Spec: storagetests.DeepEqualSafePodSpec(), + }, + }, + } + + returnedObj := &example.Pod{} + // create the 1st 2 elements in one directory + createObj(t, helper1, list.Items[0].Name, &list.Items[0], returnedObj, 0) + list.Items[0] = *returnedObj + createObj(t, helper1, list.Items[1].Name, &list.Items[1], returnedObj, 0) + list.Items[1] = *returnedObj + // create the last element in the other directory + createObj(t, helper2, list.Items[2].Name, &list.Items[2], returnedObj, 0) + list.Items[2] = *returnedObj + + var got example.PodList + err := roothelper.List(context.TODO(), "/", "", storage.Everything, &got) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + if e, a := list.Items, got.Items; !reflect.DeepEqual(e, a) { + t.Errorf("Expected %#v, got %#v", e, a) + } +} + +func TestGet(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + expect := example.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: storagetests.DeepEqualSafePodSpec(), + } + var got example.Pod + if err := helper.Create(context.TODO(), key, &expect, &got, 0); err != nil { + t.Errorf("Unexpected error %#v", err) + } + expect = got + if err := helper.Get(context.TODO(), key, "", &got, false); err != nil { + t.Errorf("Unexpected error %#v", err) + } + if !reflect.DeepEqual(got, expect) { + t.Errorf("Wanted %#v, got %#v", expect, got) + } +} + +func TestGetToList(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + storedObj := &example.Pod{} + if err := helper.Create(context.TODO(), key, &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, storedObj, 0); err != nil { + t.Errorf("Unexpected error %#v", err) + } + + tests := []struct { + key string + pred storage.SelectionPredicate + expectedOut []*example.Pod + }{{ // test GetToList on existing key + key: key, + pred: storage.Everything, + expectedOut: []*example.Pod{storedObj}, + }, { // test GetToList on non-existing key + key: "/non-existing", + pred: storage.Everything, + expectedOut: nil, + }, { // test GetToList with matching pod name + key: "/non-existing", + pred: storage.SelectionPredicate{ + Label: labels.Everything(), + Field: fields.ParseSelectorOrDie("metadata.name!=" + storedObj.Name), + GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, bool, error) { + pod := obj.(*example.Pod) + return nil, fields.Set{"metadata.name": pod.Name}, pod.Initializers != nil, nil + }, + }, + expectedOut: nil, + }} + + for i, tt := range tests { + out := &example.PodList{} + err := helper.GetToList(context.TODO(), tt.key, "", tt.pred, out) + if err != nil { + t.Fatalf("GetToList failed: %v", err) + } + if len(out.ResourceVersion) == 0 { + t.Errorf("#%d: unset resourceVersion", i) + } + if len(out.Items) != len(tt.expectedOut) { + t.Errorf("#%d: length of list want=%d, get=%d", i, len(tt.expectedOut), len(out.Items)) + continue + } + for j, wantPod := range tt.expectedOut { + getPod := &out.Items[j] + if !reflect.DeepEqual(wantPod, getPod) { + t.Errorf("#%d: pod want=%#v, get=%#v", i, wantPod, getPod) + } + } + } +} + +func TestGetNotFoundErr(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, schema.GroupVersion{Version: "v1"}) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + boguskey := "/some/boguskey" + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + var got example.Pod + err := helper.Get(context.TODO(), boguskey, "", &got, false) + if !storage.IsNotFound(err) { + t.Errorf("Unexpected response on key=%v, err=%v", boguskey, err) + } +} + +func TestCreate(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + obj := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + returnedObj := &example.Pod{} + err := helper.Create(context.TODO(), "/some/key", obj, returnedObj, 5) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + _, err = runtime.Encode(codec, obj) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + err = helper.Get(context.TODO(), "/some/key", "", returnedObj, false) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + _, err = runtime.Encode(codec, returnedObj) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + if obj.Name != returnedObj.Name { + t.Errorf("Wanted %v, got %v", obj.Name, returnedObj.Name) + } +} + +func TestCreateNilOutParam(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + obj := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + err := helper.Create(context.TODO(), "/some/key", obj, nil, 5) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } +} + +func TestGuaranteedUpdate(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, schema.GroupVersion{Version: runtime.APIVersionInternal}) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + obj := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, Value: 1} + err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + return obj, nil + })) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + + // Update an existing node. + callbackCalled := false + objUpdate := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, Value: 2} + err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + callbackCalled = true + + if in.(*storagetesting.TestResource).Value != 1 { + t.Errorf("Callback input was not current set value") + } + + return objUpdate, nil + })) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + objCheck := &storagetesting.TestResource{} + err = helper.Get(context.TODO(), key, "", objCheck, false) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + if objCheck.Value != 2 { + t.Errorf("Value should have been 2 but got %v", objCheck.Value) + } + + if !callbackCalled { + t.Errorf("tryUpdate callback should have been called.") + } +} + +func TestGuaranteedUpdateNoChange(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, schema.GroupVersion{Version: runtime.APIVersionInternal}) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + obj := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, Value: 1} + original := &storagetesting.TestResource{} + err := helper.GuaranteedUpdate(context.TODO(), key, original, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + return obj, nil + })) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + + // Update an existing node with the same data + callbackCalled := false + objUpdate := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{Name: "foo", ResourceVersion: original.ResourceVersion}, Value: 1} + result := &storagetesting.TestResource{} + err = helper.GuaranteedUpdate(context.TODO(), key, result, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + callbackCalled = true + return objUpdate, nil + })) + if err != nil { + t.Fatalf("Unexpected error %#v", err) + } + if !callbackCalled { + t.Errorf("tryUpdate callback should have been called.") + } + if result.ResourceVersion != original.ResourceVersion { + t.Fatalf("updated the object resource version") + } + + // Update an existing node with the same data but return stale + helper.transformer = prefixTransformer{prefix: "test!", stale: true} + callbackCalled = false + result = &storagetesting.TestResource{} + objUpdate = &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, Value: 1} + err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + callbackCalled = true + return objUpdate, nil + })) + if err != nil { + t.Fatalf("Unexpected error %#v", err) + } + if !callbackCalled { + t.Errorf("tryUpdate callback should have been called.") + } + if result.ResourceVersion == original.ResourceVersion { + t.Errorf("did not update the object resource version") + } +} + +func TestGuaranteedUpdateKeyNotFound(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, schema.GroupVersion{Version: runtime.APIVersionInternal}) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + // Create a new node. + obj := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, Value: 1} + + f := storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + return obj, nil + }) + + ignoreNotFound := false + err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, nil, f) + if err == nil { + t.Errorf("Expected error for key not found.") + } + + ignoreNotFound = true + err = helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, ignoreNotFound, nil, f) + if err != nil { + t.Errorf("Unexpected error %v.", err) + } +} + +func TestGuaranteedUpdate_CreateCollision(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, schema.GroupVersion{Version: runtime.APIVersionInternal}) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + helper := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + const concurrency = 10 + var wgDone sync.WaitGroup + var wgForceCollision sync.WaitGroup + wgDone.Add(concurrency) + wgForceCollision.Add(concurrency) + + for i := 0; i < concurrency; i++ { + // Increment storagetesting.TestResource.Value by 1 + go func() { + defer wgDone.Done() + + firstCall := true + err := helper.GuaranteedUpdate(context.TODO(), key, &storagetesting.TestResource{}, true, nil, storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + defer func() { firstCall = false }() + + if firstCall { + // Force collision by joining all concurrent GuaranteedUpdate operations here. + wgForceCollision.Done() + wgForceCollision.Wait() + } + + currValue := in.(*storagetesting.TestResource).Value + obj := &storagetesting.TestResource{ObjectMeta: metav1.ObjectMeta{Name: "foo"}, Value: currValue + 1} + return obj, nil + })) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + }() + } + wgDone.Wait() + + stored := &storagetesting.TestResource{} + err := helper.Get(context.TODO(), key, "", stored, false) + if err != nil { + t.Errorf("Unexpected error %#v", stored) + } + if stored.Value != concurrency { + t.Errorf("Some of the writes were lost. Stored value: %d", stored.Value) + } +} + +func TestGuaranteedUpdateUIDMismatch(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + prefix := path.Join("/", etcdtest.PathPrefix()) + helper := newEtcdHelper(server.Client, codec, prefix) + + obj := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "A"}} + podPtr := &example.Pod{} + err := helper.Create(context.TODO(), "/some/key", obj, podPtr, 0) + if err != nil { + t.Fatalf("Unexpected error %#v", err) + } + err = helper.GuaranteedUpdate(context.TODO(), "/some/key", podPtr, true, storage.NewUIDPreconditions("B"), storage.SimpleUpdate(func(in runtime.Object) (runtime.Object, error) { + return obj, nil + })) + if !storage.IsInvalidObj(err) { + t.Fatalf("Expect a Test Failed (write conflict) error, got: %v", err) + } +} + +func TestDeleteUIDMismatch(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + prefix := path.Join("/", etcdtest.PathPrefix()) + helper := newEtcdHelper(server.Client, codec, prefix) + + obj := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "A"}} + podPtr := &example.Pod{} + err := helper.Create(context.TODO(), "/some/key", obj, podPtr, 0) + if err != nil { + t.Fatalf("Unexpected error %#v", err) + } + err = helper.Delete(context.TODO(), "/some/key", obj, storage.NewUIDPreconditions("B")) + if !storage.IsInvalidObj(err) { + t.Fatalf("Expect a Test Failed (write conflict) error, got: %v", err) + } +} + +type getFunc func(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) + +type fakeDeleteKeysAPI struct { + etcd.KeysAPI + fakeGetFunc getFunc + getCount int + // The fakeGetFunc will be called fakeGetCap times before the KeysAPI's Get will be called. + fakeGetCap int +} + +func (f *fakeDeleteKeysAPI) Get(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) { + f.getCount++ + if f.getCount < f.fakeGetCap { + return f.fakeGetFunc(ctx, key, opts) + } + return f.KeysAPI.Get(ctx, key, opts) +} + +// This is to emulate the case where another party updates the object when +// etcdHelper.Delete has verified the preconditions, but hasn't carried out the +// deletion yet. Etcd will fail the deletion and report the conflict. etcdHelper +// should retry until there is no conflict. +func TestDeleteWithRetry(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + prefix := path.Join("/", etcdtest.PathPrefix()) + + obj := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo", UID: "A"}} + // fakeGet returns a large ModifiedIndex to emulate the case that another + // party has updated the object. + fakeGet := func(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) { + data, _ := runtime.Encode(codec, obj) + return &etcd.Response{Node: &etcd.Node{Value: defaultPrefixValue(data), ModifiedIndex: 99}}, nil + } + expectedRetries := 3 + helper := newEtcdHelper(server.Client, codec, prefix) + fake := &fakeDeleteKeysAPI{KeysAPI: helper.etcdKeysAPI, fakeGetCap: expectedRetries, fakeGetFunc: fakeGet} + helper.etcdKeysAPI = fake + + returnedObj := &example.Pod{} + err := helper.Create(context.TODO(), "/some/key", obj, returnedObj, 0) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + + err = helper.Delete(context.TODO(), "/some/key", obj, storage.NewUIDPreconditions("A")) + if err != nil { + t.Errorf("Unexpected error %#v", err) + } + if fake.getCount != expectedRetries { + t.Errorf("Expect %d retries, got %d", expectedRetries, fake.getCount) + } + err = helper.Get(context.TODO(), "/some/key", "", obj, false) + if !storage.IsNotFound(err) { + t.Errorf("Expect an NotFound error, got %v", err) + } +} + +func TestPrefix(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + + testcases := map[string]string{ + "custom/prefix": "/custom/prefix", + "/custom//prefix//": "/custom/prefix", + "/registry": "/registry", + } + for configuredPrefix, effectivePrefix := range testcases { + helper := newEtcdHelper(server.Client, codec, configuredPrefix) + if helper.pathPrefix != effectivePrefix { + t.Errorf("configured prefix of %s, expected effective prefix of %s, got %s", configuredPrefix, effectivePrefix, helper.pathPrefix) + } + } +} diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher.go b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher.go index 21ffc42e..d3a2e3c5 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher.go @@ -22,7 +22,6 @@ import ( "net/http" "reflect" "sync" - "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -100,9 +99,6 @@ type etcdWatcher struct { cache etcdCache } -// watchWaitDuration is the amount of time to wait for an error from watch. -const watchWaitDuration = 100 * time.Millisecond - // newEtcdWatcher returns a new etcdWatcher; if list is true, watch sub-nodes. // The versioner must be able to handle the objects that transform creates. func newEtcdWatcher(list bool, quorum bool, include includeFunc, pred storage.SelectionPredicate, diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher_test.go b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher_test.go new file mode 100644 index 00000000..38ccb308 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher_test.go @@ -0,0 +1,579 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 etcd + +import ( + "context" + rt "runtime" + "testing" + + apitesting "k8s.io/apimachinery/pkg/api/apitesting" + apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/apiserver/pkg/apis/example" + examplev1 "k8s.io/apiserver/pkg/apis/example/v1" + "k8s.io/apiserver/pkg/storage" + "k8s.io/apiserver/pkg/storage/etcd/etcdtest" + etcdtesting "k8s.io/apiserver/pkg/storage/etcd/testing" + + etcd "github.com/coreos/etcd/client" +) + +var versioner = APIObjectVersioner{} + +// Implements etcdCache interface as empty methods (i.e. does not cache any objects) +type fakeEtcdCache struct{} + +func (f *fakeEtcdCache) getFromCache(index uint64, pred storage.SelectionPredicate) (runtime.Object, bool) { + return nil, false +} + +func (f *fakeEtcdCache) addToCache(index uint64, obj runtime.Object) { +} + +var _ etcdCache = &fakeEtcdCache{} + +func TestWatchInterpretations(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + // Declare some pods to make the test cases compact. + podFoo := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + podBar := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}} + podBaz := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "baz"}} + + // All of these test cases will be run with the firstLetterIsB SelectionPredicate. + table := map[string]struct { + actions []string // Run this test item for every action here. + prevNodeValue string + nodeValue string + expectEmit bool + expectType watch.EventType + expectObject runtime.Object + }{ + "create": { + actions: []string{"create", "get"}, + nodeValue: runtime.EncodeOrDie(codec, podBar), + expectEmit: true, + expectType: watch.Added, + expectObject: podBar, + }, + "create but filter blocks": { + actions: []string{"create", "get"}, + nodeValue: runtime.EncodeOrDie(codec, podFoo), + expectEmit: false, + }, + "delete": { + actions: []string{"delete"}, + prevNodeValue: runtime.EncodeOrDie(codec, podBar), + expectEmit: true, + expectType: watch.Deleted, + expectObject: podBar, + }, + "delete but filter blocks": { + actions: []string{"delete"}, + nodeValue: runtime.EncodeOrDie(codec, podFoo), + expectEmit: false, + }, + "modify appears to create 1": { + actions: []string{"set", "compareAndSwap"}, + nodeValue: runtime.EncodeOrDie(codec, podBar), + expectEmit: true, + expectType: watch.Added, + expectObject: podBar, + }, + "modify appears to create 2": { + actions: []string{"set", "compareAndSwap"}, + prevNodeValue: runtime.EncodeOrDie(codec, podFoo), + nodeValue: runtime.EncodeOrDie(codec, podBar), + expectEmit: true, + expectType: watch.Added, + expectObject: podBar, + }, + "modify appears to delete": { + actions: []string{"set", "compareAndSwap"}, + prevNodeValue: runtime.EncodeOrDie(codec, podBar), + nodeValue: runtime.EncodeOrDie(codec, podFoo), + expectEmit: true, + expectType: watch.Deleted, + expectObject: podBar, // Should return last state that passed the filter! + }, + "modify modifies": { + actions: []string{"set", "compareAndSwap"}, + prevNodeValue: runtime.EncodeOrDie(codec, podBar), + nodeValue: runtime.EncodeOrDie(codec, podBaz), + expectEmit: true, + expectType: watch.Modified, + expectObject: podBaz, + }, + "modify ignores": { + actions: []string{"set", "compareAndSwap"}, + nodeValue: runtime.EncodeOrDie(codec, podFoo), + expectEmit: false, + }, + } + + // Should use fieldSelector here. + // But for the sake of tests (simplifying the codes), use labelSelector to support set-based requirements + selector, err := labels.Parse("metadata.name in (bar, baz)") + if err != nil { + t.Fatal(err) + } + firstLetterIsB := storage.SelectionPredicate{ + Label: selector, + Field: fields.Everything(), + IncludeUninitialized: true, + GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, bool, error) { + pod := obj.(*example.Pod) + return labels.Set{"metadata.name": pod.Name}, nil, pod.Initializers != nil, nil + }, + } + for name, item := range table { + for _, action := range item.actions { + w := newEtcdWatcher(true, false, nil, firstLetterIsB, codec, versioner, nil, prefixTransformer{prefix: "test!"}, &fakeEtcdCache{}) + emitCalled := false + w.emit = func(event watch.Event) { + emitCalled = true + if !item.expectEmit { + return + } + if e, a := item.expectType, event.Type; e != a { + t.Errorf("'%v - %v': expected %v, got %v", name, action, e, a) + } + if e, a := item.expectObject, event.Object; !apiequality.Semantic.DeepDerivative(e, a) { + t.Errorf("'%v - %v': expected %v, got %v", name, action, e, a) + } + } + + var n, pn *etcd.Node + if item.nodeValue != "" { + n = &etcd.Node{Value: defaultPrefix(item.nodeValue)} + } + if item.prevNodeValue != "" { + pn = &etcd.Node{Value: defaultPrefix(item.prevNodeValue)} + } + + w.sendResult(&etcd.Response{ + Action: action, + Node: n, + PrevNode: pn, + }) + + if e, a := item.expectEmit, emitCalled; e != a { + t.Errorf("'%v - %v': expected %v, got %v", name, action, e, a) + } + w.Stop() + } + } +} + +func TestWatchInterpretation_ResponseNotSet(t *testing.T) { + _, codecs := testScheme(t) + codec := codecs.LegacyCodec(schema.GroupVersion{Version: "v1"}) + w := newEtcdWatcher(false, false, nil, storage.Everything, codec, versioner, nil, prefixTransformer{prefix: "test!"}, &fakeEtcdCache{}) + w.emit = func(e watch.Event) { + t.Errorf("Unexpected emit: %v", e) + } + + w.sendResult(&etcd.Response{ + Action: "update", + }) + w.Stop() +} + +func TestWatchInterpretation_ResponseNoNode(t *testing.T) { + _, codecs := testScheme(t) + codec := codecs.LegacyCodec(schema.GroupVersion{Version: "v1"}) + actions := []string{"create", "set", "compareAndSwap", "delete"} + for _, action := range actions { + w := newEtcdWatcher(false, false, nil, storage.Everything, codec, versioner, nil, prefixTransformer{prefix: "test!"}, &fakeEtcdCache{}) + w.emit = func(e watch.Event) { + t.Errorf("Unexpected emit: %v", e) + } + w.sendResult(&etcd.Response{ + Action: action, + }) + w.Stop() + } +} + +func TestWatchInterpretation_ResponseBadData(t *testing.T) { + _, codecs := testScheme(t) + codec := codecs.LegacyCodec(schema.GroupVersion{Version: "v1"}) + actions := []string{"create", "set", "compareAndSwap", "delete"} + for _, action := range actions { + w := newEtcdWatcher(false, false, nil, storage.Everything, codec, versioner, nil, prefixTransformer{prefix: "test!"}, &fakeEtcdCache{}) + w.emit = func(e watch.Event) { + t.Errorf("Unexpected emit: %v", e) + } + w.sendResult(&etcd.Response{ + Action: action, + Node: &etcd.Node{ + Value: defaultPrefix("foobar"), + }, + }) + w.sendResult(&etcd.Response{ + Action: action, + PrevNode: &etcd.Node{ + Value: defaultPrefix("foobar"), + }, + }) + w.Stop() + } +} + +func TestSendResultDeleteEventHaveLatestIndex(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + selector, _ := fields.ParseSelector("metadata.name!=bar") + pred := storage.SelectionPredicate{ + Label: labels.Everything(), + Field: selector, + IncludeUninitialized: true, + GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, bool, error) { + pod := obj.(*example.Pod) + return nil, fields.Set{"metadata.name": pod.Name}, pod.Initializers != nil, nil + }, + } + w := newEtcdWatcher(false, false, nil, pred, codec, versioner, nil, prefixTransformer{prefix: "test!"}, &fakeEtcdCache{}) + + eventChan := make(chan watch.Event, 1) + w.emit = func(e watch.Event) { + eventChan <- e + } + + fooPod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + barPod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}} + fooBytes, err := runtime.Encode(codec, fooPod) + if err != nil { + t.Fatalf("Encode failed: %v", err) + } + barBytes, err := runtime.Encode(codec, barPod) + if err != nil { + t.Fatalf("Encode failed: %v", err) + } + + tests := []struct { + response *etcd.Response + expRV string + }{{ // Delete event + response: &etcd.Response{ + Action: EtcdDelete, + Node: &etcd.Node{ + ModifiedIndex: 2, + }, + PrevNode: &etcd.Node{ + Value: defaultPrefixValue(fooBytes), + ModifiedIndex: 1, + }, + }, + expRV: "2", + }, { // Modify event with uninterested data + response: &etcd.Response{ + Action: EtcdSet, + Node: &etcd.Node{ + Value: defaultPrefixValue(barBytes), + ModifiedIndex: 2, + }, + PrevNode: &etcd.Node{ + Value: defaultPrefixValue(fooBytes), + ModifiedIndex: 1, + }, + }, + expRV: "2", + }} + + for i, tt := range tests { + w.sendResult(tt.response) + ev := <-eventChan + if ev.Type != watch.Deleted { + t.Errorf("#%d: event type want=Deleted, get=%s", i, ev.Type) + return + } + rv := ev.Object.(*example.Pod).ResourceVersion + if rv != tt.expRV { + t.Errorf("#%d: resource version want=%s, get=%s", i, tt.expRV, rv) + } + } + w.Stop() +} + +func TestWatch(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + // watching is explicitly closed below. + + // Test normal case + pod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + returnObj := &example.Pod{} + err = h.Create(context.TODO(), key, pod, returnObj, 0) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + event := <-watching.ResultChan() + if e, a := watch.Added, event.Type; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + if e, a := pod, event.Object; !apiequality.Semantic.DeepDerivative(e, a) { + t.Errorf("Expected %v, got %v", e, a) + } + + watching.Stop() + + // There is a race in etcdWatcher so that after calling Stop() one of + // two things can happen: + // - ResultChan() may be closed (triggered by closing userStop channel) + // - an Error "context cancelled" may be emitted (triggered by cancelling request + // to etcd and putting that error to etcdError channel) + // We need to be prepared for both here. + event, open := <-watching.ResultChan() + if open && event.Type != watch.Error { + t.Errorf("Unexpected event from stopped watcher: %#v", event) + } +} + +func TestWatchEtcdState(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + key := "/somekey/foo" + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + + h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + defer watching.Stop() + + pod := &example.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + } + + err = h.Create(context.TODO(), key, pod, pod, 0) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + event := <-watching.ResultChan() + if event.Type != watch.Added { + t.Errorf("Unexpected event %#v", event) + } + + pod.ResourceVersion = "" + pod.Status = example.PodStatus{ + Phase: example.PodPhase("Running"), + } + + // CAS the previous value + updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { + return pod.DeepCopyObject(), nil, nil + } + err = h.GuaranteedUpdate(context.TODO(), key, &example.Pod{}, false, nil, updateFn) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + event = <-watching.ResultChan() + if event.Type != watch.Modified { + t.Errorf("Unexpected event %#v", event) + } + + if e, a := pod, event.Object; !apiequality.Semantic.DeepDerivative(e, a) { + t.Errorf("Unexpected error: expected %#v, got %#v", e, a) + } +} + +func TestWatchFromZeroIndex(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + pod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + + key := "/somekey/foo" + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + + h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + // set before the watch and verify events + err := h.Create(context.TODO(), key, pod, pod, 0) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + pod.ResourceVersion = "" + + watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + // The create trigger ADDED event when watching from 0 + event := <-watching.ResultChan() + watching.Stop() + if event.Type != watch.Added { + t.Errorf("Unexpected event %#v", event) + } + + // check for concatenation on watch event with CAS + updateFn := func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { + pod := input.(*example.Pod) + pod.Name = "bar" + return pod, nil, nil + } + err = h.GuaranteedUpdate(context.TODO(), key, &example.Pod{}, false, nil, updateFn) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + watching, err = h.Watch(context.TODO(), key, "0", storage.Everything) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + defer watching.Stop() + + // because we watch from 0, first event that we receive will always be ADDED + event = <-watching.ResultChan() + if event.Type != watch.Added { + t.Errorf("Unexpected event %#v", event) + } + + pod.Name = "baz" + updateFn = func(input runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) { + pod := input.(*example.Pod) + pod.Name = "baz" + return pod, nil, nil + } + err = h.GuaranteedUpdate(context.TODO(), key, &example.Pod{}, false, nil, updateFn) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + event = <-watching.ResultChan() + if event.Type != watch.Modified { + t.Errorf("Unexpected event %#v", event) + } + + if e, a := pod, event.Object; a == nil || !apiequality.Semantic.DeepDerivative(e, a) { + t.Errorf("Unexpected error: expected %#v, got %#v", e, a) + } +} + +func TestWatchListFromZeroIndex(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + prefix := "/some/key" + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + h := newEtcdHelper(server.Client, codec, prefix) + + watching, err := h.WatchList(context.TODO(), "/", "0", storage.Everything) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + defer watching.Stop() + + // creates foo which should trigger the WatchList for "/" + pod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + err = h.Create(context.TODO(), pod.Name, pod, pod, 0) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + event, _ := <-watching.ResultChan() + if event.Type != watch.Added { + t.Errorf("Unexpected event %#v", event) + } + + if e, a := pod, event.Object; !apiequality.Semantic.DeepDerivative(e, a) { + t.Errorf("Unexpected error: expected %v, got %v", e, a) + } +} + +func TestWatchListIgnoresRootKey(t *testing.T) { + _, codecs := testScheme(t) + codec := apitesting.TestCodec(codecs, examplev1.SchemeGroupVersion) + pod := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + key := "/some/key" + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + h := newEtcdHelper(server.Client, codec, key) + + watching, err := h.WatchList(context.TODO(), key, "0", storage.Everything) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + defer watching.Stop() + + // creates key/foo which should trigger the WatchList for "key" + err = h.Create(context.TODO(), key, pod, pod, 0) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + // force context switch to ensure watches would catch and notify. + rt.Gosched() + + select { + case event, _ := <-watching.ResultChan(): + t.Fatalf("Unexpected event: %#v", event) + default: + // fall through, expected behavior + } +} + +func TestWatchPurposefulShutdown(t *testing.T) { + _, codecs := testScheme(t) + codec := codecs.LegacyCodec(schema.GroupVersion{Version: "v1"}) + server := etcdtesting.NewEtcdTestClientServer(t) + defer server.Terminate(t) + key := "/some/key" + h := newEtcdHelper(server.Client, codec, etcdtest.PathPrefix()) + + // Test purposeful shutdown + watching, err := h.Watch(context.TODO(), key, "0", storage.Everything) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + + watching.Stop() + rt.Gosched() + + // There is a race in etcdWatcher so that after calling Stop() one of + // two things can happen: + // - ResultChan() may be closed (triggered by closing userStop channel) + // - an Error "context cancelled" may be emitted (triggered by cancelling request + // to etcd and putting that error to etcdError channel) + // We need to be prepared for both here. + event, open := <-watching.ResultChan() + if open && event.Type != watch.Error { + t.Errorf("Unexpected event from stopped watcher: %#v", event) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD index f4edcf22..807c63e1 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics/BUILD @@ -8,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["metrics.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics", importpath = "k8s.io/apiserver/pkg/storage/etcd/metrics", deps = ["//vendor/github.com/prometheus/client_golang/prometheus:go_default_library"], ) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/util/BUILD b/vendor/k8s.io/apiserver/pkg/storage/etcd/util/BUILD index a0ad4fc5..131664d3 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd/util/BUILD +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/util/BUILD @@ -22,6 +22,7 @@ go_library( "doc.go", "etcd_util.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd/util", importpath = "k8s.io/apiserver/pkg/storage/etcd/util", deps = ["//vendor/github.com/coreos/etcd/client:go_default_library"], ) diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd/util/etcd_util_test.go b/vendor/k8s.io/apiserver/pkg/storage/etcd/util/etcd_util_test.go new file mode 100644 index 00000000..de764795 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd/util/etcd_util_test.go @@ -0,0 +1,120 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 util + +import ( + "fmt" + "math/rand" + "net" + "net/http" + "net/http/httptest" + "strconv" + "testing" + "time" + + etcd "github.com/coreos/etcd/client" + "github.com/stretchr/testify/assert" +) + +const validEtcdVersion = "etcd 2.0.9" + +func TestIsEtcdNotFound(t *testing.T) { + try := func(err error, isNotFound bool) { + if IsEtcdNotFound(err) != isNotFound { + t.Errorf("Expected %#v to return %v, but it did not", err, isNotFound) + } + } + try(&etcd.Error{Code: 101}, false) + try(nil, false) + try(fmt.Errorf("some other kind of error"), false) +} + +func TestGetEtcdVersion_ValidVersion(t *testing.T) { + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprint(w, validEtcdVersion) + })) + defer testServer.Close() + + var version string + var err error + if version, err = GetEtcdVersion(testServer.URL); err != nil { + t.Errorf("Unexpected error: %v", err) + } + assert.Equal(t, validEtcdVersion, version, "Unexpected version") + assert.Nil(t, err) +} + +func TestGetEtcdVersion_ErrorStatus(t *testing.T) { + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusServiceUnavailable) + })) + defer testServer.Close() + + _, err := GetEtcdVersion(testServer.URL) + assert.NotNil(t, err) +} + +func TestGetEtcdVersion_NotListening(t *testing.T) { + portIsOpen := func(port int) bool { + conn, err := net.DialTimeout("tcp", "127.0.0.1:"+strconv.Itoa(port), 1*time.Second) + if err == nil { + conn.Close() + return true + } + return false + } + + port := rand.Intn((1 << 16) - 1) + for tried := 0; portIsOpen(port); tried++ { + if tried >= 10 { + t.Fatal("Couldn't find a closed TCP port to continue testing") + } + port++ + } + + _, err := GetEtcdVersion("http://127.0.0.1:" + strconv.Itoa(port)) + assert.NotNil(t, err) +} + +func TestEtcdHealthCheck(t *testing.T) { + tests := []struct { + data string + expectErr bool + }{ + { + data: "{\"health\": \"true\"}", + expectErr: false, + }, + { + data: "{\"health\": \"false\"}", + expectErr: true, + }, + { + data: "invalid json", + expectErr: true, + }, + } + for _, test := range tests { + err := EtcdHealthCheck([]byte(test.data)) + if err != nil && !test.expectErr { + t.Errorf("unexpected error: %v", err) + } + if err == nil && test.expectErr { + t.Error("unexpected non-error") + } + } +} diff --git a/vendor/k8s.io/apiserver/pkg/storage/interfaces.go b/vendor/k8s.io/apiserver/pkg/storage/interfaces.go index 227ab2b8..2b5da24f 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/interfaces.go +++ b/vendor/k8s.io/apiserver/pkg/storage/interfaces.go @@ -18,7 +18,9 @@ package storage import ( "context" + "fmt" + "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" @@ -49,16 +51,12 @@ type Versioner interface { // Should return an error if the specified object does not have a persistable version. ObjectResourceVersion(obj runtime.Object) (uint64, error) - // ParseWatchResourceVersion takes a resource version argument and - // converts it to the storage backend we should pass to helper.Watch(). + // ParseResourceVersion takes a resource version argument and + // converts it to the storage backend. For watch we should pass to helper.Watch(). // Because resourceVersion is an opaque value, the default watch // behavior for non-zero watch is to watch the next value (if you pass // "1", you will see updates from "2" onwards). - ParseWatchResourceVersion(resourceVersion string) (uint64, error) - // ParseListResourceVersion takes a resource version argument and - // converts it to the storage backend version. Appropriate for - // everything that's not intended as an argument for watch. - ParseListResourceVersion(resourceVersion string) (uint64, error) + ParseResourceVersion(resourceVersion string) (uint64, error) } // ResponseMeta contains information about the database metadata that is associated with @@ -110,6 +108,29 @@ func NewUIDPreconditions(uid string) *Preconditions { return &Preconditions{UID: &u} } +func (p *Preconditions) Check(key string, obj runtime.Object) error { + if p == nil { + return nil + } + objMeta, err := meta.Accessor(obj) + if err != nil { + return NewInternalErrorf( + "can't enforce preconditions %v on un-introspectable object %v, got error: %v", + *p, + obj, + err) + } + if p.UID != nil && *p.UID != objMeta.GetUID() { + err := fmt.Sprintf( + "Precondition failed: UID in precondition: %v, UID in object meta: %v", + *p.UID, + objMeta.GetUID()) + return NewInvalidObjError(key, err) + } + return nil + +} + // Interface offers a common interface for object marshaling/unmarshaling operations and // hides all the storage-related operations behind it. type Interface interface { diff --git a/vendor/k8s.io/apiserver/pkg/storage/selection_predicate_test.go b/vendor/k8s.io/apiserver/pkg/storage/selection_predicate_test.go new file mode 100644 index 00000000..8f6bcf7f --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/storage/selection_predicate_test.go @@ -0,0 +1,134 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 storage + +import ( + "errors" + "testing" + + "k8s.io/apimachinery/pkg/fields" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +type Ignored struct { + ID string +} + +type IgnoredList struct { + Items []Ignored +} + +func (obj *Ignored) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } +func (obj *IgnoredList) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } +func (obj *Ignored) DeepCopyObject() runtime.Object { + panic("Ignored does not support DeepCopy") +} +func (obj *IgnoredList) DeepCopyObject() runtime.Object { + panic("IgnoredList does not support DeepCopy") +} + +func TestSelectionPredicate(t *testing.T) { + table := map[string]struct { + labelSelector, fieldSelector string + labels labels.Set + fields fields.Set + uninitialized bool + err error + shouldMatch bool + matchSingleKey string + }{ + "A": { + labelSelector: "name=foo", + fieldSelector: "uid=12345", + labels: labels.Set{"name": "foo"}, + fields: fields.Set{"uid": "12345"}, + shouldMatch: true, + }, + "B": { + labelSelector: "name=foo", + fieldSelector: "uid=12345", + labels: labels.Set{"name": "foo"}, + fields: fields.Set{}, + shouldMatch: false, + }, + "C": { + labelSelector: "name=foo", + fieldSelector: "uid=12345", + labels: labels.Set{}, + fields: fields.Set{"uid": "12345"}, + shouldMatch: false, + }, + "D": { + fieldSelector: "metadata.name=12345", + labels: labels.Set{}, + fields: fields.Set{"metadata.name": "12345"}, + shouldMatch: true, + matchSingleKey: "12345", + }, + "E": { + fieldSelector: "metadata.name=12345", + labels: labels.Set{}, + fields: fields.Set{"metadata.name": "12345"}, + uninitialized: true, + shouldMatch: false, + matchSingleKey: "12345", + }, + "error": { + labelSelector: "name=foo", + fieldSelector: "uid=12345", + err: errors.New("maybe this is a 'wrong object type' error"), + shouldMatch: false, + }, + } + + for name, item := range table { + parsedLabel, err := labels.Parse(item.labelSelector) + if err != nil { + panic(err) + } + parsedField, err := fields.ParseSelector(item.fieldSelector) + if err != nil { + panic(err) + } + sp := &SelectionPredicate{ + Label: parsedLabel, + Field: parsedField, + GetAttrs: func(runtime.Object) (label labels.Set, field fields.Set, uninitialized bool, err error) { + return item.labels, item.fields, item.uninitialized, item.err + }, + } + got, err := sp.Matches(&Ignored{}) + if e, a := item.err, err; e != a { + t.Errorf("%v: expected %v, got %v", name, e, a) + continue + } + if e, a := item.shouldMatch, got; e != a { + t.Errorf("%v: expected %v, got %v", name, e, a) + } + if key := item.matchSingleKey; key != "" { + got, ok := sp.MatchesSingle() + if !ok { + t.Errorf("%v: expected single match", name) + } + if e, a := key, got; e != a { + t.Errorf("%v: expected %v, got %v", name, e, a) + } + } + } +} diff --git a/vendor/k8s.io/apiserver/pkg/storage/time_budget.go b/vendor/k8s.io/apiserver/pkg/storage/time_budget.go deleted file mode 100644 index e619ec66..00000000 --- a/vendor/k8s.io/apiserver/pkg/storage/time_budget.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 storage - -import ( - "sync" - "time" -) - -const ( - refreshPerSecond = 50 * time.Millisecond - maxBudget = 100 * time.Millisecond -) - -// timeBudget implements a budget of time that you can use and is -// periodically being refreshed. The pattern to use it is: -// budget := newTimeBudget(...) -// ... -// timeout := budget.takeAvailable() -// // Now you can spend at most timeout on doing stuff -// ... -// // If you didn't use all timeout, return what you didn't use -// budget.returnUnused() -// -// NOTE: It's not recommended to be used concurrently from multiple threads - -// if first user takes the whole timeout, the second one will get 0 timeout -// even though the first one may return something later. -type timeBudget struct { - sync.Mutex - budget time.Duration - - refresh time.Duration - maxBudget time.Duration -} - -func newTimeBudget(stopCh <-chan struct{}) *timeBudget { - result := &timeBudget{ - budget: time.Duration(0), - refresh: refreshPerSecond, - maxBudget: maxBudget, - } - go result.periodicallyRefresh(stopCh) - return result -} - -func (t *timeBudget) periodicallyRefresh(stopCh <-chan struct{}) { - ticker := time.NewTicker(time.Second) - defer ticker.Stop() - for { - select { - case <-ticker.C: - t.Lock() - if t.budget = t.budget + t.refresh; t.budget > t.maxBudget { - t.budget = t.maxBudget - } - t.Unlock() - case <-stopCh: - return - } - } -} - -func (t *timeBudget) takeAvailable() time.Duration { - t.Lock() - defer t.Unlock() - result := t.budget - t.budget = time.Duration(0) - return result -} - -func (t *timeBudget) returnUnused(unused time.Duration) { - t.Lock() - defer t.Unlock() - if unused < 0 { - // We used more than allowed. - return - } - if t.budget = t.budget + unused; t.budget > t.maxBudget { - t.budget = t.maxBudget - } -} diff --git a/vendor/k8s.io/apiserver/pkg/storage/util.go b/vendor/k8s.io/apiserver/pkg/storage/util.go index 9d437d06..8c571b1c 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/util.go +++ b/vendor/k8s.io/apiserver/pkg/storage/util.go @@ -18,7 +18,6 @@ package storage import ( "fmt" - "strings" "sync/atomic" "k8s.io/apimachinery/pkg/api/meta" @@ -72,31 +71,6 @@ func NoNamespaceKeyFunc(prefix string, obj runtime.Object) (string, error) { return prefix + "/" + name, nil } -// hasPathPrefix returns true if the string matches pathPrefix exactly, or if is prefixed with pathPrefix at a path segment boundary -func hasPathPrefix(s, pathPrefix string) bool { - // Short circuit if s doesn't contain the prefix at all - if !strings.HasPrefix(s, pathPrefix) { - return false - } - - pathPrefixLength := len(pathPrefix) - - if len(s) == pathPrefixLength { - // Exact match - return true - } - if strings.HasSuffix(pathPrefix, "/") { - // pathPrefix already ensured a path segment boundary - return true - } - if s[pathPrefixLength:pathPrefixLength+1] == "/" { - // The next character in s is a path segment boundary - // Check this instead of normalizing pathPrefix to avoid allocating on every call - return true - } - return false -} - // HighWaterMark is a thread-safe object for tracking the maximum value seen // for some quantity. type HighWaterMark int64 diff --git a/vendor/k8s.io/apiserver/pkg/storage/util_test.go b/vendor/k8s.io/apiserver/pkg/storage/util_test.go new file mode 100644 index 00000000..c8043d5c --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/storage/util_test.go @@ -0,0 +1,54 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 storage + +import ( + "math/rand" + "sync" + "testing" +) + +func TestHighWaterMark(t *testing.T) { + var h HighWaterMark + + for i := int64(10); i < 20; i++ { + if !h.Update(i) { + t.Errorf("unexpected false for %v", i) + } + if h.Update(i - 1) { + t.Errorf("unexpected true for %v", i-1) + } + } + + m := int64(0) + wg := sync.WaitGroup{} + for i := 0; i < 300; i++ { + wg.Add(1) + v := rand.Int63() + go func(v int64) { + defer wg.Done() + h.Update(v) + }(v) + if v > m { + m = v + } + } + wg.Wait() + if m != int64(h) { + t.Errorf("unexpected value, wanted %v, got %v", m, int64(h)) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/storage/watch_cache.go b/vendor/k8s.io/apiserver/pkg/storage/watch_cache.go deleted file mode 100644 index 373e74ee..00000000 --- a/vendor/k8s.io/apiserver/pkg/storage/watch_cache.go +++ /dev/null @@ -1,484 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 storage - -import ( - "fmt" - "sort" - "strconv" - "sync" - "time" - - "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/clock" - "k8s.io/apimachinery/pkg/watch" - utiltrace "k8s.io/apiserver/pkg/util/trace" - "k8s.io/client-go/tools/cache" -) - -const ( - // blockTimeout determines how long we're willing to block the request - // to wait for a given resource version to be propagated to cache, - // before terminating request and returning Timeout error with retry - // after suggestion. - blockTimeout = 3 * time.Second -) - -// watchCacheEvent is a single "watch event" that is send to users of -// watchCache. Additionally to a typical "watch.Event" it contains -// the previous value of the object to enable proper filtering in the -// upper layers. -type watchCacheEvent struct { - Type watch.EventType - Object runtime.Object - ObjLabels labels.Set - ObjFields fields.Set - ObjUninitialized bool - PrevObject runtime.Object - PrevObjLabels labels.Set - PrevObjFields fields.Set - PrevObjUninitialized bool - Key string - ResourceVersion uint64 -} - -// Computing a key of an object is generally non-trivial (it performs -// e.g. validation underneath). Similarly computing object fields and -// labels. To avoid computing them multiple times (to serve the event -// in different List/Watch requests), in the underlying store we are -// keeping structs (key, object, labels, fields, uninitialized). -type storeElement struct { - Key string - Object runtime.Object - Labels labels.Set - Fields fields.Set - Uninitialized bool -} - -func storeElementKey(obj interface{}) (string, error) { - elem, ok := obj.(*storeElement) - if !ok { - return "", fmt.Errorf("not a storeElement: %v", obj) - } - return elem.Key, nil -} - -// watchCacheElement is a single "watch event" stored in a cache. -// It contains the resource version of the object and the object -// itself. -type watchCacheElement struct { - resourceVersion uint64 - watchCacheEvent *watchCacheEvent -} - -// watchCache implements a Store interface. -// However, it depends on the elements implementing runtime.Object interface. -// -// watchCache is a "sliding window" (with a limited capacity) of objects -// observed from a watch. -type watchCache struct { - sync.RWMutex - - // Condition on which lists are waiting for the fresh enough - // resource version. - cond *sync.Cond - - // Maximum size of history window. - capacity int - - // keyFunc is used to get a key in the underlying storage for a given object. - keyFunc func(runtime.Object) (string, error) - - // getAttrsFunc is used to get labels and fields of an object. - getAttrsFunc func(runtime.Object) (labels.Set, fields.Set, bool, error) - - // cache is used a cyclic buffer - its first element (with the smallest - // resourceVersion) is defined by startIndex, its last element is defined - // by endIndex (if cache is full it will be startIndex + capacity). - // Both startIndex and endIndex can be greater than buffer capacity - - // you should always apply modulo capacity to get an index in cache array. - cache []watchCacheElement - startIndex int - endIndex int - - // store will effectively support LIST operation from the "end of cache - // history" i.e. from the moment just after the newest cached watched event. - // It is necessary to effectively allow clients to start watching at now. - // NOTE: We assume that is thread-safe. - store cache.Store - - // ResourceVersion up to which the watchCache is propagated. - resourceVersion uint64 - - // This handler is run at the end of every successful Replace() method. - onReplace func() - - // This handler is run at the end of every Add/Update/Delete method - // and additionally gets the previous value of the object. - onEvent func(*watchCacheEvent) - - // for testing timeouts. - clock clock.Clock -} - -func newWatchCache( - capacity int, - keyFunc func(runtime.Object) (string, error), - getAttrsFunc func(runtime.Object) (labels.Set, fields.Set, bool, error)) *watchCache { - wc := &watchCache{ - capacity: capacity, - keyFunc: keyFunc, - getAttrsFunc: getAttrsFunc, - cache: make([]watchCacheElement, capacity), - startIndex: 0, - endIndex: 0, - store: cache.NewStore(storeElementKey), - resourceVersion: 0, - clock: clock.RealClock{}, - } - wc.cond = sync.NewCond(wc.RLocker()) - return wc -} - -// Add takes runtime.Object as an argument. -func (w *watchCache) Add(obj interface{}) error { - object, resourceVersion, err := objectToVersionedRuntimeObject(obj) - if err != nil { - return err - } - event := watch.Event{Type: watch.Added, Object: object} - - f := func(elem *storeElement) error { return w.store.Add(elem) } - return w.processEvent(event, resourceVersion, f) -} - -// Update takes runtime.Object as an argument. -func (w *watchCache) Update(obj interface{}) error { - object, resourceVersion, err := objectToVersionedRuntimeObject(obj) - if err != nil { - return err - } - event := watch.Event{Type: watch.Modified, Object: object} - - f := func(elem *storeElement) error { return w.store.Update(elem) } - return w.processEvent(event, resourceVersion, f) -} - -// Delete takes runtime.Object as an argument. -func (w *watchCache) Delete(obj interface{}) error { - object, resourceVersion, err := objectToVersionedRuntimeObject(obj) - if err != nil { - return err - } - event := watch.Event{Type: watch.Deleted, Object: object} - - f := func(elem *storeElement) error { return w.store.Delete(elem) } - return w.processEvent(event, resourceVersion, f) -} - -func objectToVersionedRuntimeObject(obj interface{}) (runtime.Object, uint64, error) { - object, ok := obj.(runtime.Object) - if !ok { - return nil, 0, fmt.Errorf("obj does not implement runtime.Object interface: %v", obj) - } - meta, err := meta.Accessor(object) - if err != nil { - return nil, 0, err - } - resourceVersion, err := parseResourceVersion(meta.GetResourceVersion()) - if err != nil { - return nil, 0, err - } - return object, resourceVersion, nil -} - -func parseResourceVersion(resourceVersion string) (uint64, error) { - if resourceVersion == "" { - return 0, nil - } - // Use bitsize being the size of int on the machine. - return strconv.ParseUint(resourceVersion, 10, 0) -} - -func (w *watchCache) processEvent(event watch.Event, resourceVersion uint64, updateFunc func(*storeElement) error) error { - key, err := w.keyFunc(event.Object) - if err != nil { - return fmt.Errorf("couldn't compute key: %v", err) - } - elem := &storeElement{Key: key, Object: event.Object} - elem.Labels, elem.Fields, elem.Uninitialized, err = w.getAttrsFunc(event.Object) - if err != nil { - return err - } - - watchCacheEvent := &watchCacheEvent{ - Type: event.Type, - Object: elem.Object, - ObjLabels: elem.Labels, - ObjFields: elem.Fields, - ObjUninitialized: elem.Uninitialized, - Key: key, - ResourceVersion: resourceVersion, - } - - // TODO: We should consider moving this lock below after the watchCacheEvent - // is created. In such situation, the only problematic scenario is Replace( - // happening after getting object from store and before acquiring a lock. - // Maybe introduce another lock for this purpose. - w.Lock() - defer w.Unlock() - previous, exists, err := w.store.Get(elem) - if err != nil { - return err - } - if exists { - previousElem := previous.(*storeElement) - watchCacheEvent.PrevObject = previousElem.Object - watchCacheEvent.PrevObjLabels = previousElem.Labels - watchCacheEvent.PrevObjFields = previousElem.Fields - watchCacheEvent.PrevObjUninitialized = previousElem.Uninitialized - } - - if w.onEvent != nil { - w.onEvent(watchCacheEvent) - } - w.updateCache(resourceVersion, watchCacheEvent) - w.resourceVersion = resourceVersion - w.cond.Broadcast() - return updateFunc(elem) -} - -// Assumes that lock is already held for write. -func (w *watchCache) updateCache(resourceVersion uint64, event *watchCacheEvent) { - if w.endIndex == w.startIndex+w.capacity { - // Cache is full - remove the oldest element. - w.startIndex++ - } - w.cache[w.endIndex%w.capacity] = watchCacheElement{resourceVersion, event} - w.endIndex++ -} - -// List returns list of pointers to objects. -func (w *watchCache) List() []interface{} { - return w.store.List() -} - -// waitUntilFreshAndBlock waits until cache is at least as fresh as given . -// NOTE: This function acquired lock and doesn't release it. -// You HAVE TO explicitly call w.RUnlock() after this function. -func (w *watchCache) waitUntilFreshAndBlock(resourceVersion uint64, trace *utiltrace.Trace) error { - startTime := w.clock.Now() - go func() { - // Wake us up when the time limit has expired. The docs - // promise that time.After (well, NewTimer, which it calls) - // will wait *at least* the duration given. Since this go - // routine starts sometime after we record the start time, and - // it will wake up the loop below sometime after the broadcast, - // we don't need to worry about waking it up before the time - // has expired accidentally. - <-w.clock.After(blockTimeout) - w.cond.Broadcast() - }() - - w.RLock() - if trace != nil { - trace.Step("watchCache locked acquired") - } - for w.resourceVersion < resourceVersion { - if w.clock.Since(startTime) >= blockTimeout { - // Timeout with retry after 1 second. - return errors.NewTimeoutError(fmt.Sprintf("Too large resource version: %v, current: %v", resourceVersion, w.resourceVersion), 1) - } - w.cond.Wait() - } - if trace != nil { - trace.Step("watchCache fresh enough") - } - return nil -} - -// WaitUntilFreshAndList returns list of pointers to objects. -func (w *watchCache) WaitUntilFreshAndList(resourceVersion uint64, trace *utiltrace.Trace) ([]interface{}, uint64, error) { - err := w.waitUntilFreshAndBlock(resourceVersion, trace) - defer w.RUnlock() - if err != nil { - return nil, 0, err - } - return w.store.List(), w.resourceVersion, nil -} - -// WaitUntilFreshAndGet returns a pointers to object. -func (w *watchCache) WaitUntilFreshAndGet(resourceVersion uint64, key string, trace *utiltrace.Trace) (interface{}, bool, uint64, error) { - err := w.waitUntilFreshAndBlock(resourceVersion, trace) - defer w.RUnlock() - if err != nil { - return nil, false, 0, err - } - value, exists, err := w.store.GetByKey(key) - return value, exists, w.resourceVersion, err -} - -func (w *watchCache) ListKeys() []string { - return w.store.ListKeys() -} - -// Get takes runtime.Object as a parameter. However, it returns -// pointer to . -func (w *watchCache) Get(obj interface{}) (interface{}, bool, error) { - object, ok := obj.(runtime.Object) - if !ok { - return nil, false, fmt.Errorf("obj does not implement runtime.Object interface: %v", obj) - } - key, err := w.keyFunc(object) - if err != nil { - return nil, false, fmt.Errorf("couldn't compute key: %v", err) - } - - return w.store.Get(&storeElement{Key: key, Object: object}) -} - -// GetByKey returns pointer to . -func (w *watchCache) GetByKey(key string) (interface{}, bool, error) { - return w.store.GetByKey(key) -} - -// Replace takes slice of runtime.Object as a parameter. -func (w *watchCache) Replace(objs []interface{}, resourceVersion string) error { - version, err := parseResourceVersion(resourceVersion) - if err != nil { - return err - } - - toReplace := make([]interface{}, 0, len(objs)) - for _, obj := range objs { - object, ok := obj.(runtime.Object) - if !ok { - return fmt.Errorf("didn't get runtime.Object for replace: %#v", obj) - } - key, err := w.keyFunc(object) - if err != nil { - return fmt.Errorf("couldn't compute key: %v", err) - } - objLabels, objFields, objUninitialized, err := w.getAttrsFunc(object) - if err != nil { - return err - } - toReplace = append(toReplace, &storeElement{ - Key: key, - Object: object, - Labels: objLabels, - Fields: objFields, - Uninitialized: objUninitialized, - }) - } - - w.Lock() - defer w.Unlock() - - w.startIndex = 0 - w.endIndex = 0 - if err := w.store.Replace(toReplace, resourceVersion); err != nil { - return err - } - w.resourceVersion = version - if w.onReplace != nil { - w.onReplace() - } - w.cond.Broadcast() - return nil -} - -func (w *watchCache) SetOnReplace(onReplace func()) { - w.Lock() - defer w.Unlock() - w.onReplace = onReplace -} - -func (w *watchCache) SetOnEvent(onEvent func(*watchCacheEvent)) { - w.Lock() - defer w.Unlock() - w.onEvent = onEvent -} - -func (w *watchCache) GetAllEventsSinceThreadUnsafe(resourceVersion uint64) ([]*watchCacheEvent, error) { - size := w.endIndex - w.startIndex - // if we have no watch events in our cache, the oldest one we can successfully deliver to a watcher - // is the *next* event we'll receive, which will be at least one greater than our current resourceVersion - oldest := w.resourceVersion + 1 - if size > 0 { - oldest = w.cache[w.startIndex%w.capacity].resourceVersion - } - if resourceVersion == 0 { - // resourceVersion = 0 means that we don't require any specific starting point - // and we would like to start watching from ~now. - // However, to keep backward compatibility, we additionally need to return the - // current state and only then start watching from that point. - // - // TODO: In v2 api, we should stop returning the current state - #13969. - allItems := w.store.List() - result := make([]*watchCacheEvent, len(allItems)) - for i, item := range allItems { - elem, ok := item.(*storeElement) - if !ok { - return nil, fmt.Errorf("not a storeElement: %v", elem) - } - objLabels, objFields, objUninitialized, err := w.getAttrsFunc(elem.Object) - if err != nil { - return nil, err - } - result[i] = &watchCacheEvent{ - Type: watch.Added, - Object: elem.Object, - ObjLabels: objLabels, - ObjFields: objFields, - ObjUninitialized: objUninitialized, - Key: elem.Key, - ResourceVersion: w.resourceVersion, - } - } - return result, nil - } - if resourceVersion < oldest-1 { - return nil, errors.NewGone(fmt.Sprintf("too old resource version: %d (%d)", resourceVersion, oldest-1)) - } - - // Binary search the smallest index at which resourceVersion is greater than the given one. - f := func(i int) bool { - return w.cache[(w.startIndex+i)%w.capacity].resourceVersion > resourceVersion - } - first := sort.Search(size, f) - result := make([]*watchCacheEvent, size-first) - for i := 0; i < size-first; i++ { - result[i] = w.cache[(w.startIndex+first+i)%w.capacity].watchCacheEvent - } - return result, nil -} - -func (w *watchCache) GetAllEventsSince(resourceVersion uint64) ([]*watchCacheEvent, error) { - w.RLock() - defer w.RUnlock() - return w.GetAllEventsSinceThreadUnsafe(resourceVersion) -} - -func (w *watchCache) Resync() error { - // Nothing to do - return nil -} diff --git a/vendor/k8s.io/apiserver/pkg/util/feature/BUILD b/vendor/k8s.io/apiserver/pkg/util/feature/BUILD index 157aa49e..31274c71 100644 --- a/vendor/k8s.io/apiserver/pkg/util/feature/BUILD +++ b/vendor/k8s.io/apiserver/pkg/util/feature/BUILD @@ -10,12 +10,16 @@ go_test( name = "go_default_test", srcs = ["feature_gate_test.go"], embed = [":go_default_library"], - deps = ["//vendor/github.com/spf13/pflag:go_default_library"], + deps = [ + "//vendor/github.com/spf13/pflag:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + ], ) go_library( name = "go_default_library", srcs = ["feature_gate.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/feature", importpath = "k8s.io/apiserver/pkg/util/feature", deps = [ "//vendor/github.com/golang/glog:go_default_library", diff --git a/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go b/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go index fe35adc6..8847c1fb 100644 --- a/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go +++ b/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go @@ -145,54 +145,24 @@ func NewFeatureGate() *featureGate { // Set parses a string of the form "key1=value1,key2=value2,..." into a // map[string]bool of known keys or returns an error. func (f *featureGate) Set(value string) error { - f.lock.Lock() - defer f.lock.Unlock() - - // Copy existing state - known := map[Feature]FeatureSpec{} - for k, v := range f.known.Load().(map[Feature]FeatureSpec) { - known[k] = v - } - enabled := map[Feature]bool{} - for k, v := range f.enabled.Load().(map[Feature]bool) { - enabled[k] = v - } - + m := make(map[string]bool) for _, s := range strings.Split(value, ",") { if len(s) == 0 { continue } arr := strings.SplitN(s, "=", 2) - k := Feature(strings.TrimSpace(arr[0])) - featureSpec, ok := known[k] - if !ok { - return fmt.Errorf("unrecognized key: %s", k) - } + k := strings.TrimSpace(arr[0]) if len(arr) != 2 { return fmt.Errorf("missing bool value for %s", k) } v := strings.TrimSpace(arr[1]) boolValue, err := strconv.ParseBool(v) if err != nil { - return fmt.Errorf("invalid value of %s: %s, err: %v", k, v, err) - } - enabled[k] = boolValue - if boolValue && featureSpec.PreRelease == Deprecated { - glog.Warningf("enabling deprecated feature gate %s", k) - } - - // Handle "special" features like "all alpha gates" - if fn, found := f.special[k]; found { - fn(known, enabled, boolValue) + return fmt.Errorf("invalid value of %s=%s, err: %v", k, v, err) } + m[k] = boolValue } - - // Persist changes - f.known.Store(known) - f.enabled.Store(enabled) - - glog.Infof("feature gates: %v", enabled) - return nil + return f.SetFromMap(m) } // SetFromMap stores flag gates for known features from a map[string]bool or returns an error @@ -212,22 +182,28 @@ func (f *featureGate) SetFromMap(m map[string]bool) error { for k, v := range m { k := Feature(k) - _, ok := known[k] + featureSpec, ok := known[k] if !ok { - return fmt.Errorf("unrecognized key: %s", k) + return fmt.Errorf("unrecognized feature gate: %s", k) } enabled[k] = v // Handle "special" features like "all alpha gates" if fn, found := f.special[k]; found { fn(known, enabled, v) } + + if featureSpec.PreRelease == Deprecated { + glog.Warningf("Setting deprecated feature gate %s=%t. It will be removed in a future release.", k, v) + } else if featureSpec.PreRelease == GA { + glog.Warningf("Setting GA feature gate %s=%t. It will be removed in a future release.", k, v) + } } // Persist changes f.known.Store(known) f.enabled.Store(enabled) - glog.Infof("feature gates: %v", f.enabled) + glog.V(1).Infof("feature gates: %v", f.enabled) return nil } @@ -302,14 +278,14 @@ func (f *featureGate) AddFlag(fs *pflag.FlagSet) { } // KnownFeatures returns a slice of strings describing the FeatureGate's known features. +// Deprecated and GA features are hidden from the list. func (f *featureGate) KnownFeatures() []string { var known []string for k, v := range f.known.Load().(map[Feature]FeatureSpec) { - pre := "" - if v.PreRelease != GA { - pre = fmt.Sprintf("%s - ", v.PreRelease) + if v.PreRelease == GA || v.PreRelease == Deprecated { + continue } - known = append(known, fmt.Sprintf("%s=true|false (%sdefault=%t)", k, pre, v.Default)) + known = append(known, fmt.Sprintf("%s=true|false (%s - default=%t)", k, v.PreRelease, v.Default)) } sort.Strings(known) return known diff --git a/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate_test.go b/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate_test.go new file mode 100644 index 00000000..14ec8694 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate_test.go @@ -0,0 +1,347 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 feature + +import ( + "fmt" + "strings" + "testing" + + "github.com/spf13/pflag" + "github.com/stretchr/testify/assert" +) + +func TestFeatureGateFlag(t *testing.T) { + // gates for testing + const testAlphaGate Feature = "TestAlpha" + const testBetaGate Feature = "TestBeta" + + tests := []struct { + arg string + expect map[Feature]bool + parseError string + }{ + { + arg: "", + expect: map[Feature]bool{ + allAlphaGate: false, + testAlphaGate: false, + testBetaGate: false, + }, + }, + { + arg: "fooBarBaz=true", + expect: map[Feature]bool{ + allAlphaGate: false, + testAlphaGate: false, + testBetaGate: false, + }, + parseError: "unrecognized feature gate: fooBarBaz", + }, + { + arg: "AllAlpha=false", + expect: map[Feature]bool{ + allAlphaGate: false, + testAlphaGate: false, + testBetaGate: false, + }, + }, + { + arg: "AllAlpha=true", + expect: map[Feature]bool{ + allAlphaGate: true, + testAlphaGate: true, + testBetaGate: false, + }, + }, + { + arg: "AllAlpha=banana", + expect: map[Feature]bool{ + allAlphaGate: false, + testAlphaGate: false, + testBetaGate: false, + }, + parseError: "invalid value of AllAlpha", + }, + { + arg: "AllAlpha=false,TestAlpha=true", + expect: map[Feature]bool{ + allAlphaGate: false, + testAlphaGate: true, + testBetaGate: false, + }, + }, + { + arg: "TestAlpha=true,AllAlpha=false", + expect: map[Feature]bool{ + allAlphaGate: false, + testAlphaGate: true, + testBetaGate: false, + }, + }, + { + arg: "AllAlpha=true,TestAlpha=false", + expect: map[Feature]bool{ + allAlphaGate: true, + testAlphaGate: false, + testBetaGate: false, + }, + }, + { + arg: "TestAlpha=false,AllAlpha=true", + expect: map[Feature]bool{ + allAlphaGate: true, + testAlphaGate: false, + testBetaGate: false, + }, + }, + { + arg: "TestBeta=true,AllAlpha=false", + expect: map[Feature]bool{ + allAlphaGate: false, + testAlphaGate: false, + testBetaGate: true, + }, + }, + } + for i, test := range tests { + fs := pflag.NewFlagSet("testfeaturegateflag", pflag.ContinueOnError) + f := NewFeatureGate() + f.Add(map[Feature]FeatureSpec{ + testAlphaGate: {Default: false, PreRelease: Alpha}, + testBetaGate: {Default: false, PreRelease: Beta}, + }) + f.AddFlag(fs) + + err := fs.Parse([]string{fmt.Sprintf("--%s=%s", flagName, test.arg)}) + if test.parseError != "" { + if !strings.Contains(err.Error(), test.parseError) { + t.Errorf("%d: Parse() Expected %v, Got %v", i, test.parseError, err) + } + } else if err != nil { + t.Errorf("%d: Parse() Expected nil, Got %v", i, err) + } + for k, v := range test.expect { + if actual := f.enabled.Load().(map[Feature]bool)[k]; actual != v { + t.Errorf("%d: expected %s=%v, Got %v", i, k, v, actual) + } + } + } +} + +func TestFeatureGateOverride(t *testing.T) { + const testAlphaGate Feature = "TestAlpha" + const testBetaGate Feature = "TestBeta" + + // Don't parse the flag, assert defaults are used. + var f FeatureGate = NewFeatureGate() + f.Add(map[Feature]FeatureSpec{ + testAlphaGate: {Default: false, PreRelease: Alpha}, + testBetaGate: {Default: false, PreRelease: Beta}, + }) + + f.Set("TestAlpha=true,TestBeta=true") + if f.Enabled(testAlphaGate) != true { + t.Errorf("Expected true") + } + if f.Enabled(testBetaGate) != true { + t.Errorf("Expected true") + } + + f.Set("TestAlpha=false") + if f.Enabled(testAlphaGate) != false { + t.Errorf("Expected false") + } + if f.Enabled(testBetaGate) != true { + t.Errorf("Expected true") + } +} + +func TestFeatureGateFlagDefaults(t *testing.T) { + // gates for testing + const testAlphaGate Feature = "TestAlpha" + const testBetaGate Feature = "TestBeta" + + // Don't parse the flag, assert defaults are used. + var f FeatureGate = NewFeatureGate() + f.Add(map[Feature]FeatureSpec{ + testAlphaGate: {Default: false, PreRelease: Alpha}, + testBetaGate: {Default: true, PreRelease: Beta}, + }) + + if f.Enabled(testAlphaGate) != false { + t.Errorf("Expected false") + } + if f.Enabled(testBetaGate) != true { + t.Errorf("Expected true") + } +} + +func TestFeatureGateKnownFeatures(t *testing.T) { + // gates for testing + const ( + testAlphaGate Feature = "TestAlpha" + testBetaGate Feature = "TestBeta" + testGAGate Feature = "TestGA" + testDeprecatedGate Feature = "TestDeprecated" + ) + + // Don't parse the flag, assert defaults are used. + var f FeatureGate = NewFeatureGate() + f.Add(map[Feature]FeatureSpec{ + testAlphaGate: {Default: false, PreRelease: Alpha}, + testBetaGate: {Default: true, PreRelease: Beta}, + testGAGate: {Default: true, PreRelease: GA}, + testDeprecatedGate: {Default: false, PreRelease: Deprecated}, + }) + + known := strings.Join(f.KnownFeatures(), " ") + + assert.Contains(t, known, testAlphaGate) + assert.Contains(t, known, testBetaGate) + assert.NotContains(t, known, testGAGate) + assert.NotContains(t, known, testDeprecatedGate) +} + +func TestFeatureGateSetFromMap(t *testing.T) { + // gates for testing + const testAlphaGate Feature = "TestAlpha" + const testBetaGate Feature = "TestBeta" + + tests := []struct { + name string + setmap map[string]bool + expect map[Feature]bool + setmapError string + }{ + { + name: "set TestAlpha and TestBeta true", + setmap: map[string]bool{ + "TestAlpha": true, + "TestBeta": true, + }, + expect: map[Feature]bool{ + testAlphaGate: true, + testBetaGate: true, + }, + }, + { + name: "set TestBeta true", + setmap: map[string]bool{ + "TestBeta": true, + }, + expect: map[Feature]bool{ + testAlphaGate: false, + testBetaGate: true, + }, + }, + { + name: "set TestAlpha false", + setmap: map[string]bool{ + "TestAlpha": false, + }, + expect: map[Feature]bool{ + testAlphaGate: false, + testBetaGate: false, + }, + }, + { + name: "set TestInvaild true", + setmap: map[string]bool{ + "TestInvaild": true, + }, + expect: map[Feature]bool{ + testAlphaGate: false, + testBetaGate: false, + }, + setmapError: "unrecognized feature gate:", + }, + } + for i, test := range tests { + t.Run(fmt.Sprintf("SetFromMap %s", test.name), func(t *testing.T) { + f := NewFeatureGate() + f.Add(map[Feature]FeatureSpec{ + testAlphaGate: {Default: false, PreRelease: Alpha}, + testBetaGate: {Default: false, PreRelease: Beta}, + }) + err := f.SetFromMap(test.setmap) + if test.setmapError != "" { + if !strings.Contains(err.Error(), test.setmapError) { + t.Errorf("%d: SetFromMap(%#v) Expected err:%v, Got err:%v", i, test.setmap, test.setmapError, err) + } + } else if err != nil { + t.Errorf("%d: SetFromMap(%#v) Expected success, Got err:%v", i, test.setmap, err) + } + for k, v := range test.expect { + if actual := f.Enabled(k); actual != v { + t.Errorf("%d: SetFromMap(%#v) Expected %s=%v, Got %s=%v", i, test.setmap, k, v, k, actual) + } + } + }) + } +} + +func TestFeatureGateString(t *testing.T) { + // gates for testing + const testAlphaGate Feature = "TestAlpha" + const testBetaGate Feature = "TestBeta" + const testGAGate Feature = "TestGA" + + featuremap := map[Feature]FeatureSpec{ + testGAGate: {Default: true, PreRelease: GA}, + testAlphaGate: {Default: false, PreRelease: Alpha}, + testBetaGate: {Default: true, PreRelease: Beta}, + } + + tests := []struct { + setmap map[string]bool + expect string + }{ + { + setmap: map[string]bool{ + "TestAlpha": false, + }, + expect: "TestAlpha=false", + }, + { + setmap: map[string]bool{ + "TestAlpha": false, + "TestBeta": true, + }, + expect: "TestAlpha=false,TestBeta=true", + }, + { + setmap: map[string]bool{ + "TestGA": true, + "TestAlpha": false, + "TestBeta": true, + }, + expect: "TestAlpha=false,TestBeta=true,TestGA=true", + }, + } + for i, test := range tests { + t.Run(fmt.Sprintf("SetFromMap %s", test.expect), func(t *testing.T) { + f := NewFeatureGate() + f.Add(featuremap) + f.SetFromMap(test.setmap) + result := f.String() + if result != test.expect { + t.Errorf("%d: SetFromMap(%#v) Expected %s, Got %s", i, test.setmap, test.expect, result) + } + }) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/util/flag/BUILD b/vendor/k8s.io/apiserver/pkg/util/flag/BUILD index 1883510d..6370f398 100644 --- a/vendor/k8s.io/apiserver/pkg/util/flag/BUILD +++ b/vendor/k8s.io/apiserver/pkg/util/flag/BUILD @@ -33,14 +33,17 @@ go_library( "namedcertkey_flag.go", "noop.go", "omitempty.go", + "sectioned.go", "string_flag.go", "tristate.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flag", importpath = "k8s.io/apiserver/pkg/util/flag", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/github.com/docker/docker/pkg/term:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag_test.go b/vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag_test.go new file mode 100644 index 00000000..4a8c4efe --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag_test.go @@ -0,0 +1,114 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 flag + +import ( + "crypto/tls" + "fmt" + "go/importer" + "reflect" + "strings" + "testing" +) + +func TestStrToUInt16(t *testing.T) { + tests := []struct { + flag []string + expected []uint16 + expected_error bool + }{ + { + // Happy case + flag: []string{"TLS_RSA_WITH_RC4_128_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_RC4_128_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"}, + expected: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_RSA_WITH_AES_128_CBC_SHA, tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA}, + expected_error: false, + }, + { + // One flag only + flag: []string{"TLS_RSA_WITH_RC4_128_SHA"}, + expected: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA}, + expected_error: false, + }, + { + // Empty flag + flag: []string{}, + expected: nil, + expected_error: false, + }, + { + // Duplicated flag + flag: []string{"TLS_RSA_WITH_RC4_128_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_RC4_128_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_RC4_128_SHA"}, + expected: []uint16{tls.TLS_RSA_WITH_RC4_128_SHA, tls.TLS_RSA_WITH_AES_128_CBC_SHA, tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA, tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, tls.TLS_RSA_WITH_RC4_128_SHA}, + expected_error: false, + }, + { + // Invalid flag + flag: []string{"foo"}, + expected: nil, + expected_error: true, + }, + } + + for i, test := range tests { + uIntFlags, err := TLSCipherSuites(test.flag) + if reflect.DeepEqual(uIntFlags, test.expected) == false { + t.Errorf("%d: expected %+v, got %+v", i, test.expected, uIntFlags) + } + if test.expected_error && err == nil { + t.Errorf("%d: expecting error, got %+v", i, err) + } + } +} + +func TestConstantMaps(t *testing.T) { + pkg, err := importer.Default().Import("crypto/tls") + if err != nil { + fmt.Printf("error: %s\n", err.Error()) + return + } + discoveredVersions := map[string]bool{} + discoveredCiphers := map[string]bool{} + for _, declName := range pkg.Scope().Names() { + if strings.HasPrefix(declName, "VersionTLS") { + discoveredVersions[declName] = true + } + if strings.HasPrefix(declName, "TLS_RSA_") || strings.HasPrefix(declName, "TLS_ECDHE_") { + discoveredCiphers[declName] = true + } + } + + for k := range discoveredCiphers { + if _, ok := ciphers[k]; !ok { + t.Errorf("discovered cipher tls.%s not in ciphers map", k) + } + } + for k := range ciphers { + if _, ok := discoveredCiphers[k]; !ok { + t.Errorf("ciphers map has %s not in tls package", k) + } + } + for k := range discoveredVersions { + if _, ok := versions[k]; !ok { + t.Errorf("discovered version tls.%s not in version map", k) + } + } + for k := range versions { + if _, ok := discoveredVersions[k]; !ok { + t.Errorf("versions map has %s not in tls package", k) + } + } +} diff --git a/vendor/k8s.io/apiserver/pkg/util/flag/colon_separated_multimap_string_string_test.go b/vendor/k8s.io/apiserver/pkg/util/flag/colon_separated_multimap_string_string_test.go new file mode 100644 index 00000000..9e77035c --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/util/flag/colon_separated_multimap_string_string_test.go @@ -0,0 +1,242 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 flag + +import ( + "reflect" + "testing" +) + +func TestStringColonSeparatedMultimapStringString(t *testing.T) { + var nilMap map[string][]string + cases := []struct { + desc string + m *ColonSeparatedMultimapStringString + expect string + }{ + {"nil", NewColonSeparatedMultimapStringString(&nilMap), ""}, + {"empty", NewColonSeparatedMultimapStringString(&map[string][]string{}), ""}, + {"empty key", NewColonSeparatedMultimapStringString( + &map[string][]string{ + "": {"foo"}, + }), + ":foo"}, + {"one key", NewColonSeparatedMultimapStringString( + &map[string][]string{ + "one": {"foo"}, + }), + "one:foo"}, + {"two keys", NewColonSeparatedMultimapStringString( + &map[string][]string{ + "one": {"foo"}, + "two": {"bar"}, + }), + "one:foo,two:bar"}, + {"two keys, multiple items in one key", NewColonSeparatedMultimapStringString( + &map[string][]string{ + "one": {"foo", "baz"}, + "two": {"bar"}, + }), + "one:foo,one:baz,two:bar"}, + {"three keys, multiple items in one key", NewColonSeparatedMultimapStringString( + &map[string][]string{ + "a": {"hello"}, + "b": {"again", "beautiful"}, + "c": {"world"}, + }), + "a:hello,b:again,b:beautiful,c:world"}, + } + for _, c := range cases { + t.Run(c.desc, func(t *testing.T) { + str := c.m.String() + if c.expect != str { + t.Fatalf("expect %q but got %q", c.expect, str) + } + }) + } +} + +func TestSetColonSeparatedMultimapStringString(t *testing.T) { + var nilMap map[string][]string + cases := []struct { + desc string + vals []string + start *ColonSeparatedMultimapStringString + expect *ColonSeparatedMultimapStringString + err string + }{ + // we initialize the map with a default key that should be cleared by Set + {"clears defaults", []string{""}, + NewColonSeparatedMultimapStringString(&map[string][]string{"default": {}}), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{}}, ""}, + // make sure we still allocate for "initialized" multimaps where Multimap was initially set to a nil map + {"allocates map if currently nil", []string{""}, + &ColonSeparatedMultimapStringString{initialized: true, Multimap: &nilMap}, + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{}, + }, ""}, + // for most cases, we just reuse nilMap, which should be allocated by Set, and is reset before each test case + {"empty", []string{""}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{}}, ""}, + {"empty key", []string{":foo"}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{ + "": {"foo"}, + }}, ""}, + {"one key", []string{"one:foo"}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{ + "one": {"foo"}, + }}, ""}, + {"two keys", []string{"one:foo,two:bar"}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{ + "one": {"foo"}, + "two": {"bar"}, + }}, ""}, + {"two keys with space", []string{"one:foo, two:bar"}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{ + "one": {"foo"}, + "two": {"bar"}, + }}, ""}, + {"two keys, multiple items in one key", []string{"one: foo, two:bar, one:baz"}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{ + "one": {"foo", "baz"}, + "two": {"bar"}, + }}, ""}, + {"three keys, multiple items in one key", []string{"a:hello,b:again,c:world,b:beautiful"}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{ + "a": {"hello"}, + "b": {"again", "beautiful"}, + "c": {"world"}, + }}, ""}, + {"three keys, multiple items in one key, multiple Set invocations", []string{"a:hello,b:again", "c:world", "b:beautiful"}, + NewColonSeparatedMultimapStringString(&nilMap), + &ColonSeparatedMultimapStringString{ + initialized: true, + Multimap: &map[string][]string{ + "a": {"hello"}, + "b": {"again", "beautiful"}, + "c": {"world"}, + }}, ""}, + {"missing value", []string{"a"}, + NewColonSeparatedMultimapStringString(&nilMap), + nil, + "malformed pair, expect string:string"}, + {"no target", []string{"a:foo"}, + NewColonSeparatedMultimapStringString(nil), + nil, + "no target (nil pointer to map[string][]string)"}, + } + + for _, c := range cases { + nilMap = nil + t.Run(c.desc, func(t *testing.T) { + var err error + for _, val := range c.vals { + err = c.start.Set(val) + if err != nil { + break + } + } + if c.err != "" { + if err == nil || err.Error() != c.err { + t.Fatalf("expect error %s but got %v", c.err, err) + } + return + } else if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(c.expect, c.start) { + t.Fatalf("expect %#v but got %#v", c.expect, c.start) + } + }) + } +} + +func TestRoundTripColonSeparatedMultimapStringString(t *testing.T) { + cases := []struct { + desc string + vals []string + expect string + }{ + {"empty", []string{""}, ""}, + {"empty key", []string{":foo"}, ":foo"}, + {"one key", []string{"one:foo"}, "one:foo"}, + {"two keys", []string{"one:foo,two:bar"}, "one:foo,two:bar"}, + {"two keys, multiple items in one key", []string{"one:foo, two:bar, one:baz"}, "one:foo,one:baz,two:bar"}, + {"three keys, multiple items in one key", []string{"a:hello,b:again,c:world,b:beautiful"}, "a:hello,b:again,b:beautiful,c:world"}, + {"three keys, multiple items in one key, multiple Set invocations", []string{"a:hello,b:again", "c:world", "b:beautiful"}, "a:hello,b:again,b:beautiful,c:world"}, + } + + for _, c := range cases { + t.Run(c.desc, func(t *testing.T) { + m := NewColonSeparatedMultimapStringString(&map[string][]string{}) + for _, val := range c.vals { + if err := m.Set(val); err != nil { + t.Fatalf("unexpected error: %v", err) + } + } + str := m.String() + if c.expect != str { + t.Fatalf("expect %q but got %q", c.expect, str) + } + }) + } +} + +func TestEmptyColonSeparatedMultimapStringString(t *testing.T) { + var nilMap map[string][]string + cases := []struct { + desc string + val *ColonSeparatedMultimapStringString + expect bool + }{ + {"nil", NewColonSeparatedMultimapStringString(&nilMap), true}, + {"empty", NewColonSeparatedMultimapStringString(&map[string][]string{}), true}, + {"populated", NewColonSeparatedMultimapStringString(&map[string][]string{"foo": {}}), false}, + } + for _, c := range cases { + t.Run(c.desc, func(t *testing.T) { + result := c.val.Empty() + if result != c.expect { + t.Fatalf("expect %t but got %t", c.expect, result) + } + }) + } +} diff --git a/vendor/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go b/vendor/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go new file mode 100644 index 00000000..80c67c32 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go @@ -0,0 +1,159 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 flag + +import ( + "reflect" + "testing" +) + +func TestStringLangleSeparatedMapStringString(t *testing.T) { + var nilMap map[string]string + cases := []struct { + desc string + m *LangleSeparatedMapStringString + expect string + }{ + {"nil", NewLangleSeparatedMapStringString(&nilMap), ""}, + {"empty", NewLangleSeparatedMapStringString(&map[string]string{}), ""}, + {"one key", NewLangleSeparatedMapStringString(&map[string]string{"one": "foo"}), "one 24 { + zzz = strings.Repeat("z", cols-24) + wideFS.Int(zzz, 0, strings.Repeat("z", cols-24)) + } + + var buf bytes.Buffer + fmt.Fprintf(&buf, "\n%s flags:\n\n%s", strings.ToUpper(name[:1])+name[1:], wideFS.FlagUsagesWrapped(cols)) + + if cols > 24 { + i := strings.Index(buf.String(), zzz) + lines := strings.Split(buf.String()[:i], "\n") + fmt.Fprint(w, strings.Join(lines[:len(lines)-1], "\n")) + fmt.Fprintln(w) + } else { + fmt.Fprint(w, buf.String()) + } + } +} + +// TerminalSize returns the current width and height of the user's terminal. If it isn't a terminal, +// nil is returned. On error, zero values are returned for width and height. +// Usually w must be the stdout of the process. Stderr won't work. +func TerminalSize(w io.Writer) (int, int, error) { + outFd, isTerminal := term.GetFdInfo(w) + if !isTerminal { + return 0, 0, fmt.Errorf("given writer is no terminal") + } + winsize, err := term.GetWinsize(outFd) + if err != nil { + return 0, 0, err + } + return int(winsize.Width), int(winsize.Height), nil +} diff --git a/vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD b/vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD deleted file mode 100644 index 2ca558aa..00000000 --- a/vendor/k8s.io/apiserver/pkg/util/flushwriter/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["writer_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "writer.go", - ], - importpath = "k8s.io/apiserver/pkg/util/flushwriter", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiserver/pkg/util/flushwriter/doc.go b/vendor/k8s.io/apiserver/pkg/util/flushwriter/doc.go deleted file mode 100644 index f81e09a2..00000000 --- a/vendor/k8s.io/apiserver/pkg/util/flushwriter/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 flushwriter implements a wrapper for a writer that flushes on every -// write if that writer implements the io.Flusher interface -package flushwriter // import "k8s.io/apiserver/pkg/util/flushwriter" diff --git a/vendor/k8s.io/apiserver/pkg/util/flushwriter/writer.go b/vendor/k8s.io/apiserver/pkg/util/flushwriter/writer.go deleted file mode 100644 index 748bd010..00000000 --- a/vendor/k8s.io/apiserver/pkg/util/flushwriter/writer.go +++ /dev/null @@ -1,53 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 flushwriter - -import ( - "io" - "net/http" -) - -// Wrap wraps an io.Writer into a writer that flushes after every write if -// the writer implements the Flusher interface. -func Wrap(w io.Writer) io.Writer { - fw := &flushWriter{ - writer: w, - } - if flusher, ok := w.(http.Flusher); ok { - fw.flusher = flusher - } - return fw -} - -// flushWriter provides wrapper for responseWriter with HTTP streaming capabilities -type flushWriter struct { - flusher http.Flusher - writer io.Writer -} - -// Write is a FlushWriter implementation of the io.Writer that sends any buffered -// data to the client. -func (fw *flushWriter) Write(p []byte) (n int, err error) { - n, err = fw.writer.Write(p) - if err != nil { - return - } - if fw.flusher != nil { - fw.flusher.Flush() - } - return -} diff --git a/vendor/k8s.io/apiserver/pkg/util/logs/BUILD b/vendor/k8s.io/apiserver/pkg/util/logs/BUILD index 069bb5ab..1e5cf497 100644 --- a/vendor/k8s.io/apiserver/pkg/util/logs/BUILD +++ b/vendor/k8s.io/apiserver/pkg/util/logs/BUILD @@ -8,11 +8,12 @@ load( go_library( name = "go_default_library", srcs = ["logs.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/logs", importpath = "k8s.io/apiserver/pkg/util/logs", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) diff --git a/vendor/k8s.io/apiserver/pkg/util/logs/logs.go b/vendor/k8s.io/apiserver/pkg/util/logs/logs.go index c5ba084a..a62c0609 100644 --- a/vendor/k8s.io/apiserver/pkg/util/logs/logs.go +++ b/vendor/k8s.io/apiserver/pkg/util/logs/logs.go @@ -18,6 +18,7 @@ package logs import ( "flag" + "fmt" "log" "time" @@ -46,7 +47,7 @@ type GlogWriter struct{} // Write implements the io.Writer interface. func (writer GlogWriter) Write(data []byte) (n int, err error) { - glog.Info(string(data)) + glog.InfoDepth(1, string(data)) return len(data), nil } @@ -67,3 +68,12 @@ func FlushLogs() { func NewLogger(prefix string) *log.Logger { return log.New(GlogWriter{}, prefix, 0) } + +// GlogSetter is a setter to set glog level. +func GlogSetter(val string) (string, error) { + var level glog.Level + if err := level.Set(val); err != nil { + return "", fmt.Errorf("failed set glog.logging.verbosity %s: %v", val, err) + } + return fmt.Sprintf("successfully set glog.logging.verbosity to %s", val), nil +} diff --git a/vendor/k8s.io/apiserver/pkg/util/trace/BUILD b/vendor/k8s.io/apiserver/pkg/util/trace/BUILD index 5d37bb00..2e94b1d0 100644 --- a/vendor/k8s.io/apiserver/pkg/util/trace/BUILD +++ b/vendor/k8s.io/apiserver/pkg/util/trace/BUILD @@ -8,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["trace.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/trace", importpath = "k8s.io/apiserver/pkg/util/trace", deps = ["//vendor/github.com/golang/glog:go_default_library"], ) diff --git a/vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD b/vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD index 3d1c90f6..269af15e 100644 --- a/vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD +++ b/vendor/k8s.io/apiserver/pkg/util/wsstream/BUILD @@ -23,11 +23,12 @@ go_library( "doc.go", "stream.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/wsstream", importpath = "k8s.io/apiserver/pkg/util/wsstream", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) diff --git a/vendor/k8s.io/apiserver/pkg/util/wsstream/conn_test.go b/vendor/k8s.io/apiserver/pkg/util/wsstream/conn_test.go new file mode 100644 index 00000000..1c049aad --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/util/wsstream/conn_test.go @@ -0,0 +1,272 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 wsstream + +import ( + "encoding/base64" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "reflect" + "sync" + "testing" + + "golang.org/x/net/websocket" +) + +func newServer(handler http.Handler) (*httptest.Server, string) { + server := httptest.NewServer(handler) + serverAddr := server.Listener.Addr().String() + return server, serverAddr +} + +func TestRawConn(t *testing.T) { + channels := []ChannelType{ReadWriteChannel, ReadWriteChannel, IgnoreChannel, ReadChannel, WriteChannel} + conn := NewConn(NewDefaultChannelProtocols(channels)) + + s, addr := newServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + conn.Open(w, req) + })) + defer s.Close() + + client, err := websocket.Dial("ws://"+addr, "", "http://localhost/") + if err != nil { + t.Fatal(err) + } + defer client.Close() + + <-conn.ready + wg := sync.WaitGroup{} + + // verify we can read a client write + wg.Add(1) + go func() { + defer wg.Done() + data, err := ioutil.ReadAll(conn.channels[0]) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(data, []byte("client")) { + t.Errorf("unexpected server read: %v", data) + } + }() + + if n, err := client.Write(append([]byte{0}, []byte("client")...)); err != nil || n != 7 { + t.Fatalf("%d: %v", n, err) + } + + // verify we can read a server write + wg.Add(1) + go func() { + defer wg.Done() + if n, err := conn.channels[1].Write([]byte("server")); err != nil && n != 6 { + t.Fatalf("%d: %v", n, err) + } + }() + + data := make([]byte, 1024) + if n, err := io.ReadAtLeast(client, data, 6); n != 7 || err != nil { + t.Fatalf("%d: %v", n, err) + } + if !reflect.DeepEqual(data[:7], append([]byte{1}, []byte("server")...)) { + t.Errorf("unexpected client read: %v", data[:7]) + } + + // verify that an ignore channel is empty in both directions. + if n, err := conn.channels[2].Write([]byte("test")); n != 4 || err != nil { + t.Errorf("writes should be ignored") + } + data = make([]byte, 1024) + if n, err := conn.channels[2].Read(data); n != 0 || err != io.EOF { + t.Errorf("reads should be ignored") + } + + // verify that a write to a Read channel doesn't block + if n, err := conn.channels[3].Write([]byte("test")); n != 4 || err != nil { + t.Errorf("writes should be ignored") + } + + // verify that a read from a Write channel doesn't block + data = make([]byte, 1024) + if n, err := conn.channels[4].Read(data); n != 0 || err != io.EOF { + t.Errorf("reads should be ignored") + } + + // verify that a client write to a Write channel doesn't block (is dropped) + if n, err := client.Write(append([]byte{4}, []byte("ignored")...)); err != nil || n != 8 { + t.Fatalf("%d: %v", n, err) + } + + client.Close() + wg.Wait() +} + +func TestBase64Conn(t *testing.T) { + conn := NewConn(NewDefaultChannelProtocols([]ChannelType{ReadWriteChannel, ReadWriteChannel})) + s, addr := newServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + conn.Open(w, req) + })) + defer s.Close() + + config, err := websocket.NewConfig("ws://"+addr, "http://localhost/") + if err != nil { + t.Fatal(err) + } + config.Protocol = []string{"base64.channel.k8s.io"} + client, err := websocket.DialConfig(config) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + <-conn.ready + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + data, err := ioutil.ReadAll(conn.channels[0]) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(data, []byte("client")) { + t.Errorf("unexpected server read: %s", string(data)) + } + }() + + clientData := base64.StdEncoding.EncodeToString([]byte("client")) + if n, err := client.Write(append([]byte{'0'}, clientData...)); err != nil || n != len(clientData)+1 { + t.Fatalf("%d: %v", n, err) + } + + wg.Add(1) + go func() { + defer wg.Done() + if n, err := conn.channels[1].Write([]byte("server")); err != nil && n != 6 { + t.Fatalf("%d: %v", n, err) + } + }() + + data := make([]byte, 1024) + if n, err := io.ReadAtLeast(client, data, 9); n != 9 || err != nil { + t.Fatalf("%d: %v", n, err) + } + expect := []byte(base64.StdEncoding.EncodeToString([]byte("server"))) + + if !reflect.DeepEqual(data[:9], append([]byte{'1'}, expect...)) { + t.Errorf("unexpected client read: %v", data[:9]) + } + + client.Close() + wg.Wait() +} + +type versionTest struct { + supported map[string]bool // protocol -> binary + requested []string + error bool + expected string +} + +func versionTests() []versionTest { + const ( + binary = true + base64 = false + ) + return []versionTest{ + { + supported: nil, + requested: []string{"raw"}, + error: true, + }, + { + supported: map[string]bool{"": binary, "raw": binary, "base64": base64}, + requested: nil, + expected: "", + }, + { + supported: map[string]bool{"": binary, "raw": binary, "base64": base64}, + requested: []string{"v1.raw"}, + error: true, + }, + { + supported: map[string]bool{"": binary, "raw": binary, "base64": base64}, + requested: []string{"v1.raw", "v1.base64"}, + error: true, + }, { + supported: map[string]bool{"": binary, "raw": binary, "base64": base64}, + requested: []string{"v1.raw", "raw"}, + expected: "raw", + }, + { + supported: map[string]bool{"": binary, "v1.raw": binary, "v1.base64": base64, "v2.raw": binary, "v2.base64": base64}, + requested: []string{"v1.raw"}, + expected: "v1.raw", + }, + { + supported: map[string]bool{"": binary, "v1.raw": binary, "v1.base64": base64, "v2.raw": binary, "v2.base64": base64}, + requested: []string{"v2.base64"}, + expected: "v2.base64", + }, + } +} + +func TestVersionedConn(t *testing.T) { + for i, test := range versionTests() { + func() { + supportedProtocols := map[string]ChannelProtocolConfig{} + for p, binary := range test.supported { + supportedProtocols[p] = ChannelProtocolConfig{ + Binary: binary, + Channels: []ChannelType{ReadWriteChannel}, + } + } + conn := NewConn(supportedProtocols) + // note that it's not enough to wait for conn.ready to avoid a race here. Hence, + // we use a channel. + selectedProtocol := make(chan string, 0) + s, addr := newServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + p, _, _ := conn.Open(w, req) + selectedProtocol <- p + })) + defer s.Close() + + config, err := websocket.NewConfig("ws://"+addr, "http://localhost/") + if err != nil { + t.Fatal(err) + } + config.Protocol = test.requested + client, err := websocket.DialConfig(config) + if err != nil { + if !test.error { + t.Fatalf("test %d: didn't expect error: %v", i, err) + } else { + return + } + } + defer client.Close() + if test.error && err == nil { + t.Fatalf("test %d: expected an error", i) + } + + <-conn.ready + if got, expected := <-selectedProtocol, test.expected; got != expected { + t.Fatalf("test %d: unexpected protocol version: got=%s expected=%s", i, got, expected) + } + }() + } +} diff --git a/vendor/k8s.io/apiserver/pkg/util/wsstream/stream_test.go b/vendor/k8s.io/apiserver/pkg/util/wsstream/stream_test.go new file mode 100644 index 00000000..09dda761 --- /dev/null +++ b/vendor/k8s.io/apiserver/pkg/util/wsstream/stream_test.go @@ -0,0 +1,294 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 wsstream + +import ( + "bytes" + "encoding/base64" + "fmt" + "io" + "io/ioutil" + "net/http" + "reflect" + "strings" + "testing" + "time" + + "golang.org/x/net/websocket" +) + +func TestStream(t *testing.T) { + input := "some random text" + r := NewReader(bytes.NewBuffer([]byte(input)), true, NewDefaultReaderProtocols()) + r.SetIdleTimeout(time.Second) + data, err := readWebSocket(r, t, nil) + if !reflect.DeepEqual(data, []byte(input)) { + t.Errorf("unexpected server read: %v", data) + } + if err != nil { + t.Fatal(err) + } +} + +func TestStreamPing(t *testing.T) { + input := "some random text" + r := NewReader(bytes.NewBuffer([]byte(input)), true, NewDefaultReaderProtocols()) + r.SetIdleTimeout(time.Second) + err := expectWebSocketFrames(r, t, nil, [][]byte{ + {}, + []byte(input), + }) + if err != nil { + t.Fatal(err) + } +} + +func TestStreamBase64(t *testing.T) { + input := "some random text" + encoded := base64.StdEncoding.EncodeToString([]byte(input)) + r := NewReader(bytes.NewBuffer([]byte(input)), true, NewDefaultReaderProtocols()) + data, err := readWebSocket(r, t, nil, "base64.binary.k8s.io") + if !reflect.DeepEqual(data, []byte(encoded)) { + t.Errorf("unexpected server read: %v\n%v", data, []byte(encoded)) + } + if err != nil { + t.Fatal(err) + } +} + +func TestStreamVersionedBase64(t *testing.T) { + input := "some random text" + encoded := base64.StdEncoding.EncodeToString([]byte(input)) + r := NewReader(bytes.NewBuffer([]byte(input)), true, map[string]ReaderProtocolConfig{ + "": {Binary: true}, + "binary.k8s.io": {Binary: true}, + "base64.binary.k8s.io": {Binary: false}, + "v1.binary.k8s.io": {Binary: true}, + "v1.base64.binary.k8s.io": {Binary: false}, + "v2.binary.k8s.io": {Binary: true}, + "v2.base64.binary.k8s.io": {Binary: false}, + }) + data, err := readWebSocket(r, t, nil, "v2.base64.binary.k8s.io") + if !reflect.DeepEqual(data, []byte(encoded)) { + t.Errorf("unexpected server read: %v\n%v", data, []byte(encoded)) + } + if err != nil { + t.Fatal(err) + } +} + +func TestStreamVersionedCopy(t *testing.T) { + for i, test := range versionTests() { + func() { + supportedProtocols := map[string]ReaderProtocolConfig{} + for p, binary := range test.supported { + supportedProtocols[p] = ReaderProtocolConfig{ + Binary: binary, + } + } + input := "some random text" + r := NewReader(bytes.NewBuffer([]byte(input)), true, supportedProtocols) + s, addr := newServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + err := r.Copy(w, req) + if err != nil { + w.WriteHeader(503) + } + })) + defer s.Close() + + config, err := websocket.NewConfig("ws://"+addr, "http://localhost/") + if err != nil { + t.Error(err) + return + } + config.Protocol = test.requested + client, err := websocket.DialConfig(config) + if err != nil { + if !test.error { + t.Errorf("test %d: didn't expect error: %v", i, err) + } + return + } + defer client.Close() + if test.error && err == nil { + t.Errorf("test %d: expected an error", i) + return + } + + <-r.err + if got, expected := r.selectedProtocol, test.expected; got != expected { + t.Errorf("test %d: unexpected protocol version: got=%s expected=%s", i, got, expected) + } + }() + } +} + +func TestStreamError(t *testing.T) { + input := "some random text" + errs := &errorReader{ + reads: [][]byte{ + []byte("some random"), + []byte(" text"), + }, + err: fmt.Errorf("bad read"), + } + r := NewReader(errs, false, NewDefaultReaderProtocols()) + + data, err := readWebSocket(r, t, nil) + if !reflect.DeepEqual(data, []byte(input)) { + t.Errorf("unexpected server read: %v", data) + } + if err == nil || err.Error() != "bad read" { + t.Fatal(err) + } +} + +func TestStreamSurvivesPanic(t *testing.T) { + input := "some random text" + errs := &errorReader{ + reads: [][]byte{ + []byte("some random"), + []byte(" text"), + }, + panicMessage: "bad read", + } + r := NewReader(errs, false, NewDefaultReaderProtocols()) + + // do not call runtime.HandleCrash() in handler. Otherwise, the tests are interrupted. + r.handleCrash = func() { recover() } + + data, err := readWebSocket(r, t, nil) + if !reflect.DeepEqual(data, []byte(input)) { + t.Errorf("unexpected server read: %v", data) + } + if err != nil { + t.Fatal(err) + } +} + +func TestStreamClosedDuringRead(t *testing.T) { + for i := 0; i < 25; i++ { + ch := make(chan struct{}) + input := "some random text" + errs := &errorReader{ + reads: [][]byte{ + []byte("some random"), + []byte(" text"), + }, + err: fmt.Errorf("stuff"), + pause: ch, + } + r := NewReader(errs, false, NewDefaultReaderProtocols()) + + data, err := readWebSocket(r, t, func(c *websocket.Conn) { + c.Close() + close(ch) + }) + // verify that the data returned by the server on an early close always has a specific error + if err == nil || !strings.Contains(err.Error(), "use of closed network connection") { + t.Fatal(err) + } + // verify that the data returned is a strict subset of the input + if !bytes.HasPrefix([]byte(input), data) && len(data) != 0 { + t.Fatalf("unexpected server read: %q", string(data)) + } + } +} + +type errorReader struct { + reads [][]byte + err error + panicMessage string + pause chan struct{} +} + +func (r *errorReader) Read(p []byte) (int, error) { + if len(r.reads) == 0 { + if r.pause != nil { + <-r.pause + } + if len(r.panicMessage) != 0 { + panic(r.panicMessage) + } + return 0, r.err + } + next := r.reads[0] + r.reads = r.reads[1:] + copy(p, next) + return len(next), nil +} + +func readWebSocket(r *Reader, t *testing.T, fn func(*websocket.Conn), protocols ...string) ([]byte, error) { + errCh := make(chan error, 1) + s, addr := newServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + errCh <- r.Copy(w, req) + })) + defer s.Close() + + config, _ := websocket.NewConfig("ws://"+addr, "http://"+addr) + config.Protocol = protocols + client, err := websocket.DialConfig(config) + if err != nil { + return nil, err + } + defer client.Close() + + if fn != nil { + fn(client) + } + + data, err := ioutil.ReadAll(client) + if err != nil { + return data, err + } + return data, <-errCh +} + +func expectWebSocketFrames(r *Reader, t *testing.T, fn func(*websocket.Conn), frames [][]byte, protocols ...string) error { + errCh := make(chan error, 1) + s, addr := newServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + errCh <- r.Copy(w, req) + })) + defer s.Close() + + config, _ := websocket.NewConfig("ws://"+addr, "http://"+addr) + config.Protocol = protocols + ws, err := websocket.DialConfig(config) + if err != nil { + return err + } + defer ws.Close() + + if fn != nil { + fn(ws) + } + + for i := range frames { + var data []byte + if err := websocket.Message.Receive(ws, &data); err != nil { + return err + } + if !reflect.DeepEqual(frames[i], data) { + return fmt.Errorf("frame %d did not match expected: %v", data, err) + } + } + var data []byte + if err := websocket.Message.Receive(ws, &data); err != io.EOF { + return fmt.Errorf("expected no more frames: %v (%v)", err, data) + } + return <-errCh +} diff --git a/vendor/k8s.io/client-go/CONTRIBUTING.md b/vendor/k8s.io/client-go/CONTRIBUTING.md new file mode 100644 index 00000000..b01f8abb --- /dev/null +++ b/vendor/k8s.io/client-go/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing guidelines + +Do not open pull requests directly against this repository, they will be ignored. Instead, please open pull requests against [kubernetes/kubernetes](https://git.k8s.io/kubernetes/). Please follow the same [contributing guide](https://git.k8s.io/kubernetes/CONTRIBUTING.md) you would follow for any other pull request made to kubernetes/kubernetes. + +This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/client-go](https://git.k8s.io/kubernetes/staging/src/k8s.io/client-go) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot). + +Please see [Staging Directory and Publishing](https://git.k8s.io/community/contributors/devel/staging.md) for more information diff --git a/vendor/k8s.io/client-go/INSTALL.md b/vendor/k8s.io/client-go/INSTALL.md new file mode 100644 index 00000000..d3592f49 --- /dev/null +++ b/vendor/k8s.io/client-go/INSTALL.md @@ -0,0 +1,162 @@ +# Installing client-go + +## For the casual user + +If you want to write a simple script, don't care about a reproducible client +library install, don't mind getting head (which may be less stable than a +particular release), then simply: + +```sh +$ go get k8s.io/client-go/... +``` + +This will install `k8s.io/client-go` in your `$GOPATH`. `k8s.io/client-go` +includes most of its own dependencies in its `k8s.io/client-go/vendor` path, +except for `k8s.io/apimachinery` and `glog`. `go get` will recursively download +these excluded repos to your `$GOPATH`, if they don't already exist. If +`k8s.io/apimachinery` preexisted in `$GOPATH`, you also need to: + +```sh +$ go get -u k8s.io/apimachinery/... +``` + +because the head of client-go is only guaranteed to work with the head of +apimachinery. + +We excluded `k8s.io/apimachinery` and `glog` from `k8s.io/client-go/vendor` to +prevent `go get` users from hitting issues like +[#19](https://github.com/kubernetes/client-go/issues/19) and +[#83](https://github.com/kubernetes/client-go/issues/83). If your project share +other dependencies with client-go, and you hit issues similar to #19 or #83, +then you'll need to look down at the next section. + +Note: the official go policy is that libraries should not vendor their +dependencies. This is unworkable for us, since our dependencies change and HEAD +on every dependency has not necessarily been tested with client-go. In fact, +HEAD from all dependencies may not even compile with client-go! + +## Dependency management for the serious (or reluctant) user + +Reasons why you might need to use a dependency management system: +* You use a dependency that client-go also uses, and don't want two copies of + the dependency compiled into your application. For some dependencies with + singletons or global inits (e.g. `glog`) this wouldn't even compile... +* You want to lock in a particular version (so you don't have to change your + code every time we change a public interface). +* You want your install to be reproducible. For example, for your CI system or + for new team members. + +There are three tools you could in theory use for this. Instructions +for each follows. + +### Godep + +[godep](https://github.com/tools/godep) is an older dependency management tool, which is +used by the main Kubernetes repo and `client-go` to manage dependencies. + +Before proceeding with the below instructions, you should ensure that your +$GOPATH is empty except for containing your own package and its dependencies, +and you have a copy of godep somewhere in your $PATH. + +To install `client-go` and place its dependencies in your `$GOPATH`: + +```sh +go get k8s.io/client-go/... +cd $GOPATH/src/k8s.io/client-go +git checkout v9.0.0 # replace v9.0.0 with the required version +# cd 1.5 # only necessary with 1.5 and 1.4 clients. +godep restore ./... +``` + +At this point, `client-go`'s dependencies have been placed in your $GOPATH, but +if you were to build, `client-go` would still see its own copy of its +dependencies in its `vendor` directory. You have two options at this point. + +If you would like to keep dependencies in your own project's vendor directory, +then you can continue like this: + +```sh +cd $GOPATH/src/ +godep save ./... +``` + +Alternatively, if you want to build using the dependencies in your `$GOPATH`, +then `rm -rf vendor/` to remove `client-go`'s copy of its dependencies. + +### Glide + +[Glide](https://github.com/Masterminds/glide) is another popular dependency +management tool for Go. Glide will manage your /vendor directory, but unlike +godep, will not use or modify your $GOPATH (there's no equivalent of +`godep restore` or `godep save`). + +Generally, it's best to avoid Glide's many subcommands, favoring modifying +Glide's manifest file (`glide.yaml`) directly, then running +`glide update --strip-vendor`. First create a `glide.yaml` file at the root of +your project: + +```yaml +package: ( your project's import path ) # e.g. github.com/foo/bar +import: +- package: k8s.io/client-go + version: v9.0.0 # replace v9.0.0 with the required version +``` + +Second, add a Go file that imports `client-go` somewhere in your project, +otherwise `client-go`'s dependencies will not be added to your project's +vendor/. Then run the following command in the same directory as `glide.yaml`: + +```sh +glide update --strip-vendor +``` + +This can also be abbreviated as: + +```sh +glide up -v +``` + +At this point, `k8s.io/client-go` should be added to your project's vendor/. +`client-go`'s dependencies should be flattened and be added to your project's +vendor/ as well. + +Glide will detect the versions of dependencies `client-go` specified in +`client-go`'s Godep.json file, and automatically set the versions of these +imports in your /vendor directory. It will also record the detected version of +all dependencies in the `glide.lock` file. + +Projects that require a different version of a dependency than `client-go` +requests can override the version manually in `glide.yaml`. For example: + +```yaml +package: ( your project's import path ) # e.g. github.com/foo/bar +import: +- package: k8s.io/client-go + version: v9.0.0 # replace v9.0.0 with the required version +# Use a newer version of go-spew even though client-go wants an old one. +- package: github.com/davecgh/go-spew + version: v1.1.0 +``` + +After modifying, run `glide up -v` again to re-populate your /vendor directory. + +Optionally, Glide users can also use [`glide-vc`](https://github.com/sgotti/glide-vc) +after running `glide up -v` to remove unused files from /vendor. + +### Dep (Not supported yet!) + +[dep](https://github.com/golang/dep) is an up-and-coming dependency management +tool, which has the goal of being accepted as part of the standard go toolchain. +However, client-go does **NOT** work well with `dep` yet. To support `dep`, we +need to fix at least two issues: +1. publish native `Gopkg.toml` in client-go and other k8s.io repos, like `k8s.io/apimachinery`; +2. find a way to express transitive constraints (see https://github.com/golang/dep/issues/1124). + +As a workaround, which may or may not be worthwhile, you can specify all +client-go dependencies manually as +[override](https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md#override) +in Gopkg.toml with the versions listed in [Godeps.json](./Godeps/Godeps.json), +and manually update them when you upgrade client-go version. + +We are actively working on the two issues blocking using `dep`. For the +meantime, we recommend using `glide` or `godeps`. diff --git a/vendor/k8s.io/client-go/OWNERS b/vendor/k8s.io/client-go/OWNERS new file mode 100644 index 00000000..52d33465 --- /dev/null +++ b/vendor/k8s.io/client-go/OWNERS @@ -0,0 +1,17 @@ +approvers: +- caesarxuchao +- deads2k +- lavalamp +- liggitt +- smarterclayton +- sttts +reviewers: +- caesarxuchao +- deads2k +- lavalamp +- liggitt +- soltysh +- sttts +- yliaog +labels: +- sig/api-machinery diff --git a/vendor/k8s.io/client-go/SECURITY_CONTACTS b/vendor/k8s.io/client-go/SECURITY_CONTACTS new file mode 100644 index 00000000..0648a8eb --- /dev/null +++ b/vendor/k8s.io/client-go/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/client-go/code-of-conduct.md b/vendor/k8s.io/client-go/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/vendor/k8s.io/client-go/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) diff --git a/vendor/k8s.io/client-go/discovery/BUILD b/vendor/k8s.io/client-go/discovery/BUILD index bf66795e..1ddb339a 100644 --- a/vendor/k8s.io/client-go/discovery/BUILD +++ b/vendor/k8s.io/client-go/discovery/BUILD @@ -11,44 +11,29 @@ go_library( srcs = [ "cached_discovery.go", "discovery_client.go", + "doc.go", "helper.go", "round_tripper.go", - "unstructured.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery", importpath = "k8s.io/client-go/discovery", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/golang/protobuf/proto:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/github.com/gregjones/httpcache:go_default_library", "//vendor/github.com/gregjones/httpcache/diskcache:go_default_library", "//vendor/github.com/peterbourgon/diskv:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["helper_blackbox_test.go"], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/rest/fake:go_default_library", ], ) @@ -74,20 +59,24 @@ go_test( srcs = [ "cached_discovery_test.go", "discovery_client_test.go", + "helper_blackbox_test.go", "round_tripper_test.go", ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/rest/fake:go_default_library", "//vendor/github.com/gogo/protobuf/proto:go_default_library", "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/rest/fake:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/discovery/cached_discovery.go b/vendor/k8s.io/client-go/discovery/cached_discovery.go index aca46546..d38a0bbd 100644 --- a/vendor/k8s.io/client-go/discovery/cached_discovery.go +++ b/vendor/k8s.io/client-go/discovery/cached_discovery.go @@ -83,7 +83,7 @@ func (d *CachedDiscoveryClient) ServerResourcesForGroupVersion(groupVersion stri } if err := d.writeCachedFile(filename, liveResources); err != nil { - glog.V(3).Infof("failed to write cache to %v due to %v", filename, err) + glog.V(1).Infof("failed to write cache to %v due to %v", filename, err) } return liveResources, nil @@ -117,7 +117,7 @@ func (d *CachedDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { } if err := d.writeCachedFile(filename, liveGroups); err != nil { - glog.V(3).Infof("failed to write cache to %v due to %v", filename, err) + glog.V(1).Infof("failed to write cache to %v due to %v", filename, err) } return liveGroups, nil diff --git a/vendor/k8s.io/client-go/discovery/cached_discovery_test.go b/vendor/k8s.io/client-go/discovery/cached_discovery_test.go new file mode 100644 index 00000000..278931c2 --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/cached_discovery_test.go @@ -0,0 +1,169 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 discovery + +import ( + "io/ioutil" + "os" + "testing" + "time" + + "github.com/googleapis/gnostic/OpenAPIv2" + "github.com/stretchr/testify/assert" + + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/version" + restclient "k8s.io/client-go/rest" + "k8s.io/client-go/rest/fake" +) + +func TestCachedDiscoveryClient_Fresh(t *testing.T) { + assert := assert.New(t) + + d, err := ioutil.TempDir("", "") + assert.NoError(err) + defer os.RemoveAll(d) + + c := fakeDiscoveryClient{} + cdc := newCachedDiscoveryClient(&c, d, 60*time.Second) + assert.True(cdc.Fresh(), "should be fresh after creation") + + cdc.ServerGroups() + assert.True(cdc.Fresh(), "should be fresh after groups call without cache") + assert.Equal(c.groupCalls, 1) + + cdc.ServerGroups() + assert.True(cdc.Fresh(), "should be fresh after another groups call") + assert.Equal(c.groupCalls, 1) + + cdc.ServerResources() + assert.True(cdc.Fresh(), "should be fresh after resources call") + assert.Equal(c.resourceCalls, 1) + + cdc.ServerResources() + assert.True(cdc.Fresh(), "should be fresh after another resources call") + assert.Equal(c.resourceCalls, 1) + + cdc = newCachedDiscoveryClient(&c, d, 60*time.Second) + cdc.ServerGroups() + assert.False(cdc.Fresh(), "should NOT be fresh after recreation with existing groups cache") + assert.Equal(c.groupCalls, 1) + + cdc.ServerResources() + assert.False(cdc.Fresh(), "should NOT be fresh after recreation with existing resources cache") + assert.Equal(c.resourceCalls, 1) + + cdc.Invalidate() + assert.True(cdc.Fresh(), "should be fresh after cache invalidation") + + cdc.ServerResources() + assert.True(cdc.Fresh(), "should ignore existing resources cache after invalidation") + assert.Equal(c.resourceCalls, 2) +} + +func TestNewCachedDiscoveryClient_TTL(t *testing.T) { + assert := assert.New(t) + + d, err := ioutil.TempDir("", "") + assert.NoError(err) + defer os.RemoveAll(d) + + c := fakeDiscoveryClient{} + cdc := newCachedDiscoveryClient(&c, d, 1*time.Nanosecond) + cdc.ServerGroups() + assert.Equal(c.groupCalls, 1) + + time.Sleep(1 * time.Second) + + cdc.ServerGroups() + assert.Equal(c.groupCalls, 2) +} + +type fakeDiscoveryClient struct { + groupCalls int + resourceCalls int + versionCalls int + openAPICalls int + + serverResourcesHandler func() ([]*metav1.APIResourceList, error) +} + +var _ DiscoveryInterface = &fakeDiscoveryClient{} + +func (c *fakeDiscoveryClient) RESTClient() restclient.Interface { + return &fake.RESTClient{} +} + +func (c *fakeDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { + c.groupCalls = c.groupCalls + 1 + return &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "a", + Versions: []metav1.GroupVersionForDiscovery{ + { + GroupVersion: "a/v1", + Version: "v1", + }, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{ + GroupVersion: "a/v1", + Version: "v1", + }, + }, + }, + }, nil +} + +func (c *fakeDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + if groupVersion == "a/v1" { + return &metav1.APIResourceList{APIResources: []metav1.APIResource{{Name: "widgets", Kind: "Widget"}}}, nil + } + + return nil, errors.NewNotFound(schema.GroupResource{}, "") +} + +func (c *fakeDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + if c.serverResourcesHandler != nil { + return c.serverResourcesHandler() + } + return []*metav1.APIResourceList{}, nil +} + +func (c *fakeDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + return nil, nil +} + +func (c *fakeDiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + return nil, nil +} + +func (c *fakeDiscoveryClient) ServerVersion() (*version.Info, error) { + c.versionCalls = c.versionCalls + 1 + return &version.Info{}, nil +} + +func (c *fakeDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { + c.openAPICalls = c.openAPICalls + 1 + return &openapi_v2.Document{}, nil +} diff --git a/vendor/k8s.io/client-go/discovery/discovery_client_test.go b/vendor/k8s.io/client-go/discovery/discovery_client_test.go new file mode 100644 index 00000000..10e49432 --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/discovery_client_test.go @@ -0,0 +1,882 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 discovery + +import ( + "encoding/json" + "fmt" + "mime" + "net/http" + "net/http/httptest" + "reflect" + "testing" + + "github.com/gogo/protobuf/proto" + "github.com/googleapis/gnostic/OpenAPIv2" + "github.com/stretchr/testify/assert" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/version" + restclient "k8s.io/client-go/rest" +) + +func TestGetServerVersion(t *testing.T) { + expect := version.Info{ + Major: "foo", + Minor: "bar", + GitCommit: "baz", + } + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + output, err := json.Marshal(expect) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + })) + defer server.Close() + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + + got, err := client.ServerVersion() + if err != nil { + t.Fatalf("unexpected encoding error: %v", err) + } + if e, a := expect, *got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestGetServerGroupsWithV1Server(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + var obj interface{} + switch req.URL.Path { + case "/api": + obj = &metav1.APIVersions{ + Versions: []string{ + "v1", + }, + } + case "/apis": + obj = &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "extensions", + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "extensions/v1beta1"}, + }, + }, + }, + } + default: + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(obj) + if err != nil { + t.Fatalf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + })) + defer server.Close() + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + // ServerGroups should not return an error even if server returns error at /api and /apis + apiGroupList, err := client.ServerGroups() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + groupVersions := metav1.ExtractGroupVersions(apiGroupList) + if !reflect.DeepEqual(groupVersions, []string{"v1", "extensions/v1beta1"}) { + t.Errorf("expected: %q, got: %q", []string{"v1", "extensions/v1beta1"}, groupVersions) + } +} + +func TestGetServerGroupsWithBrokenServer(t *testing.T) { + for _, statusCode := range []int{http.StatusNotFound, http.StatusForbidden} { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.WriteHeader(statusCode) + })) + defer server.Close() + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + // ServerGroups should not return an error even if server returns Not Found or Forbidden error at all end points + apiGroupList, err := client.ServerGroups() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + groupVersions := metav1.ExtractGroupVersions(apiGroupList) + if len(groupVersions) != 0 { + t.Errorf("expected empty list, got: %q", groupVersions) + } + } +} + +func TestTimeoutIsSet(t *testing.T) { + cfg := &restclient.Config{} + setDiscoveryDefaults(cfg) + assert.Equal(t, defaultTimeout, cfg.Timeout) +} + +func TestGetServerResourcesWithV1Server(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + var obj interface{} + switch req.URL.Path { + case "/api": + obj = &metav1.APIVersions{ + Versions: []string{ + "v1", + }, + } + default: + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(obj) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + })) + defer server.Close() + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + // ServerResources should not return an error even if server returns error at /api/v1. + serverResources, err := client.ServerResources() + if err != nil { + t.Errorf("unexpected error: %v", err) + } + gvs := groupVersions(serverResources) + if !sets.NewString(gvs...).Has("v1") { + t.Errorf("missing v1 in resource list: %v", serverResources) + } +} + +func TestGetServerResources(t *testing.T) { + stable := metav1.APIResourceList{ + GroupVersion: "v1", + APIResources: []metav1.APIResource{ + {Name: "pods", Namespaced: true, Kind: "Pod"}, + {Name: "services", Namespaced: true, Kind: "Service"}, + {Name: "namespaces", Namespaced: false, Kind: "Namespace"}, + }, + } + beta := metav1.APIResourceList{ + GroupVersion: "extensions/v1beta1", + APIResources: []metav1.APIResource{ + {Name: "deployments", Namespaced: true, Kind: "Deployment"}, + {Name: "ingresses", Namespaced: true, Kind: "Ingress"}, + {Name: "jobs", Namespaced: true, Kind: "Job"}, + }, + } + beta2 := metav1.APIResourceList{ + GroupVersion: "extensions/v1beta2", + APIResources: []metav1.APIResource{ + {Name: "deployments", Namespaced: true, Kind: "Deployment"}, + {Name: "ingresses", Namespaced: true, Kind: "Ingress"}, + {Name: "jobs", Namespaced: true, Kind: "Job"}, + }, + } + tests := []struct { + resourcesList *metav1.APIResourceList + path string + request string + expectErr bool + }{ + { + resourcesList: &stable, + path: "/api/v1", + request: "v1", + expectErr: false, + }, + { + resourcesList: &beta, + path: "/apis/extensions/v1beta1", + request: "extensions/v1beta1", + expectErr: false, + }, + { + resourcesList: &stable, + path: "/api/v1", + request: "foobar", + expectErr: true, + }, + } + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + var list interface{} + switch req.URL.Path { + case "/api/v1": + list = &stable + case "/apis/extensions/v1beta1": + list = &beta + case "/apis/extensions/v1beta2": + list = &beta2 + case "/api": + list = &metav1.APIVersions{ + Versions: []string{ + "v1", + }, + } + case "/apis": + list = &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "extensions", + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "extensions/v1beta1", Version: "v1beta1"}, + {GroupVersion: "extensions/v1beta2", Version: "v1beta2"}, + }, + }, + }, + } + default: + t.Logf("unexpected request: %s", req.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(list) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + })) + defer server.Close() + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + for _, test := range tests { + got, err := client.ServerResourcesForGroupVersion(test.request) + if test.expectErr { + if err == nil { + t.Error("unexpected non-error") + } + continue + } + if err != nil { + t.Errorf("unexpected error: %v", err) + continue + } + if !reflect.DeepEqual(got, test.resourcesList) { + t.Errorf("expected:\n%v\ngot:\n%v\n", test.resourcesList, got) + } + } + + serverResources, err := client.ServerResources() + if err != nil { + t.Errorf("unexpected error: %v", err) + } + serverGroupVersions := groupVersions(serverResources) + expectedGroupVersions := []string{"v1", "extensions/v1beta1", "extensions/v1beta2"} + if !reflect.DeepEqual(expectedGroupVersions, serverGroupVersions) { + t.Errorf("unexpected group versions: %v", diff.ObjectReflectDiff(expectedGroupVersions, serverGroupVersions)) + } +} + +var returnedOpenAPI = openapi_v2.Document{ + Definitions: &openapi_v2.Definitions{ + AdditionalProperties: []*openapi_v2.NamedSchema{ + { + Name: "fake.type.1", + Value: &openapi_v2.Schema{ + Properties: &openapi_v2.Properties{ + AdditionalProperties: []*openapi_v2.NamedSchema{ + { + Name: "count", + Value: &openapi_v2.Schema{ + Type: &openapi_v2.TypeItem{ + Value: []string{"integer"}, + }, + }, + }, + }, + }, + }, + }, + { + Name: "fake.type.2", + Value: &openapi_v2.Schema{ + Properties: &openapi_v2.Properties{ + AdditionalProperties: []*openapi_v2.NamedSchema{ + { + Name: "count", + Value: &openapi_v2.Schema{ + Type: &openapi_v2.TypeItem{ + Value: []string{"array"}, + }, + Items: &openapi_v2.ItemsItem{ + Schema: []*openapi_v2.Schema{ + { + Type: &openapi_v2.TypeItem{ + Value: []string{"string"}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, +} + +func openapiSchemaDeprecatedFakeServer(status int) (*httptest.Server, error) { + var sErr error + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if req.URL.Path == "/openapi/v2" { + // write the error status for the new endpoint request + w.WriteHeader(status) + return + } + if req.URL.Path != "/swagger-2.0.0.pb-v1" { + sErr = fmt.Errorf("Unexpected url %v", req.URL) + } + if req.Method != "GET" { + sErr = fmt.Errorf("Unexpected method %v", req.Method) + } + + mime.AddExtensionType(".pb-v1", "application/com.github.googleapis.gnostic.OpenAPIv2@68f4ded+protobuf") + + output, err := proto.Marshal(&returnedOpenAPI) + if err != nil { + sErr = err + return + } + w.WriteHeader(http.StatusOK) + w.Write(output) + })) + return server, sErr +} + +func openapiSchemaFakeServer() (*httptest.Server, error) { + var sErr error + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if req.URL.Path != "/openapi/v2" { + sErr = fmt.Errorf("Unexpected url %v", req.URL) + } + if req.Method != "GET" { + sErr = fmt.Errorf("Unexpected method %v", req.Method) + } + decipherableFormat := req.Header.Get("Accept") + if decipherableFormat != "application/com.github.proto-openapi.spec.v2@v1.0+protobuf" { + sErr = fmt.Errorf("Unexpected accept mime type %v", decipherableFormat) + } + + mime.AddExtensionType(".pb-v1", "application/com.github.googleapis.gnostic.OpenAPIv2@68f4ded+protobuf") + + output, err := proto.Marshal(&returnedOpenAPI) + if err != nil { + sErr = err + return + } + w.WriteHeader(http.StatusOK) + w.Write(output) + })) + return server, sErr +} + +func TestGetOpenAPISchema(t *testing.T) { + server, err := openapiSchemaFakeServer() + if err != nil { + t.Errorf("unexpected error starting fake server: %v", err) + } + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + got, err := client.OpenAPISchema() + if err != nil { + t.Fatalf("unexpected error getting openapi: %v", err) + } + if e, a := returnedOpenAPI, *got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestGetOpenAPISchemaForbiddenFallback(t *testing.T) { + server, err := openapiSchemaDeprecatedFakeServer(http.StatusForbidden) + if err != nil { + t.Errorf("unexpected error starting fake server: %v", err) + } + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + got, err := client.OpenAPISchema() + if err != nil { + t.Fatalf("unexpected error getting openapi: %v", err) + } + if e, a := returnedOpenAPI, *got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestGetOpenAPISchemaNotFoundFallback(t *testing.T) { + server, err := openapiSchemaDeprecatedFakeServer(http.StatusNotFound) + if err != nil { + t.Errorf("unexpected error starting fake server: %v", err) + } + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + got, err := client.OpenAPISchema() + if err != nil { + t.Fatalf("unexpected error getting openapi: %v", err) + } + if e, a := returnedOpenAPI, *got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestGetOpenAPISchemaNotAcceptableFallback(t *testing.T) { + server, err := openapiSchemaDeprecatedFakeServer(http.StatusNotAcceptable) + if err != nil { + t.Errorf("unexpected error starting fake server: %v", err) + } + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + got, err := client.OpenAPISchema() + if err != nil { + t.Fatalf("unexpected error getting openapi: %v", err) + } + if e, a := returnedOpenAPI, *got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestServerPreferredResources(t *testing.T) { + stable := metav1.APIResourceList{ + GroupVersion: "v1", + APIResources: []metav1.APIResource{ + {Name: "pods", Namespaced: true, Kind: "Pod"}, + {Name: "services", Namespaced: true, Kind: "Service"}, + {Name: "namespaces", Namespaced: false, Kind: "Namespace"}, + }, + } + tests := []struct { + resourcesList []*metav1.APIResourceList + response func(w http.ResponseWriter, req *http.Request) + expectErr func(err error) bool + }{ + { + resourcesList: []*metav1.APIResourceList{&stable}, + expectErr: IsGroupDiscoveryFailedError, + response: func(w http.ResponseWriter, req *http.Request) { + var list interface{} + switch req.URL.Path { + case "/apis/extensions/v1beta1": + w.WriteHeader(http.StatusInternalServerError) + return + case "/api/v1": + list = &stable + case "/api": + list = &metav1.APIVersions{ + Versions: []string{ + "v1", + }, + } + case "/apis": + list = &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "extensions/v1beta1"}, + }, + }, + }, + } + default: + t.Logf("unexpected request: %s", req.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(list) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + }, + }, + { + resourcesList: nil, + expectErr: IsGroupDiscoveryFailedError, + response: func(w http.ResponseWriter, req *http.Request) { + var list interface{} + switch req.URL.Path { + case "/apis/extensions/v1beta1": + w.WriteHeader(http.StatusInternalServerError) + return + case "/api/v1": + w.WriteHeader(http.StatusInternalServerError) + case "/api": + list = &metav1.APIVersions{ + Versions: []string{ + "v1", + }, + } + case "/apis": + list = &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "extensions/v1beta1"}, + }, + }, + }, + } + default: + t.Logf("unexpected request: %s", req.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(list) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + }, + }, + } + for _, test := range tests { + server := httptest.NewServer(http.HandlerFunc(test.response)) + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + resources, err := client.ServerPreferredResources() + if test.expectErr != nil { + if err == nil { + t.Error("unexpected non-error") + } + + continue + } + if err != nil { + t.Errorf("unexpected error: %v", err) + continue + } + got, err := GroupVersionResources(resources) + if err != nil { + t.Errorf("unexpected error: %v", err) + continue + } + expected, _ := GroupVersionResources(test.resourcesList) + if !reflect.DeepEqual(got, expected) { + t.Errorf("expected:\n%v\ngot:\n%v\n", test.resourcesList, got) + } + server.Close() + } +} + +func TestServerPreferredResourcesRetries(t *testing.T) { + stable := metav1.APIResourceList{ + GroupVersion: "v1", + APIResources: []metav1.APIResource{ + {Name: "pods", Namespaced: true, Kind: "Pod"}, + }, + } + beta := metav1.APIResourceList{ + GroupVersion: "extensions/v1", + APIResources: []metav1.APIResource{ + {Name: "deployments", Namespaced: true, Kind: "Deployment"}, + }, + } + + response := func(numErrors int) http.HandlerFunc { + var i = 0 + return func(w http.ResponseWriter, req *http.Request) { + var list interface{} + switch req.URL.Path { + case "/apis/extensions/v1beta1": + if i < numErrors { + i++ + w.WriteHeader(http.StatusInternalServerError) + return + } + list = &beta + case "/api/v1": + list = &stable + case "/api": + list = &metav1.APIVersions{ + Versions: []string{ + "v1", + }, + } + case "/apis": + list = &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "extensions", + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "extensions/v1beta1", Version: "v1beta1"}, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{ + GroupVersion: "extensions/v1beta1", + Version: "v1beta1", + }, + }, + }, + } + default: + t.Logf("unexpected request: %s", req.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(list) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + } + } + tests := []struct { + responseErrors int + expectResources int + expectedError func(err error) bool + }{ + { + responseErrors: 1, + expectResources: 2, + expectedError: func(err error) bool { + return err == nil + }, + }, + { + responseErrors: 2, + expectResources: 1, + expectedError: IsGroupDiscoveryFailedError, + }, + } + + for i, tc := range tests { + server := httptest.NewServer(http.HandlerFunc(response(tc.responseErrors))) + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + resources, err := client.ServerPreferredResources() + if !tc.expectedError(err) { + t.Errorf("case %d: unexpected error: %v", i, err) + } + got, err := GroupVersionResources(resources) + if err != nil { + t.Errorf("case %d: unexpected error: %v", i, err) + } + if len(got) != tc.expectResources { + t.Errorf("case %d: expect %d resources, got %#v", i, tc.expectResources, got) + } + server.Close() + } +} + +func TestServerPreferredNamespacedResources(t *testing.T) { + stable := metav1.APIResourceList{ + GroupVersion: "v1", + APIResources: []metav1.APIResource{ + {Name: "pods", Namespaced: true, Kind: "Pod"}, + {Name: "services", Namespaced: true, Kind: "Service"}, + {Name: "namespaces", Namespaced: false, Kind: "Namespace"}, + }, + } + batchv1 := metav1.APIResourceList{ + GroupVersion: "batch/v1", + APIResources: []metav1.APIResource{ + {Name: "jobs", Namespaced: true, Kind: "Job"}, + }, + } + batchv2alpha1 := metav1.APIResourceList{ + GroupVersion: "batch/v2alpha1", + APIResources: []metav1.APIResource{ + {Name: "jobs", Namespaced: true, Kind: "Job"}, + {Name: "cronjobs", Namespaced: true, Kind: "CronJob"}, + }, + } + batchv3alpha1 := metav1.APIResourceList{ + GroupVersion: "batch/v3alpha1", + APIResources: []metav1.APIResource{ + {Name: "jobs", Namespaced: true, Kind: "Job"}, + {Name: "cronjobs", Namespaced: true, Kind: "CronJob"}, + }, + } + tests := []struct { + response func(w http.ResponseWriter, req *http.Request) + expected map[schema.GroupVersionResource]struct{} + }{ + { + response: func(w http.ResponseWriter, req *http.Request) { + var list interface{} + switch req.URL.Path { + case "/api/v1": + list = &stable + case "/api": + list = &metav1.APIVersions{ + Versions: []string{ + "v1", + }, + } + default: + t.Logf("unexpected request: %s", req.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(list) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + }, + expected: map[schema.GroupVersionResource]struct{}{ + {Group: "", Version: "v1", Resource: "pods"}: {}, + {Group: "", Version: "v1", Resource: "services"}: {}, + }, + }, + { + response: func(w http.ResponseWriter, req *http.Request) { + var list interface{} + switch req.URL.Path { + case "/apis": + list = &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "batch", + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "batch/v1", Version: "v1"}, + {GroupVersion: "batch/v2alpha1", Version: "v2alpha1"}, + {GroupVersion: "batch/v3alpha1", Version: "v3alpha1"}, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{GroupVersion: "batch/v1", Version: "v1"}, + }, + }, + } + case "/apis/batch/v1": + list = &batchv1 + case "/apis/batch/v2alpha1": + list = &batchv2alpha1 + case "/apis/batch/v3alpha1": + list = &batchv3alpha1 + default: + t.Logf("unexpected request: %s", req.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(list) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + }, + expected: map[schema.GroupVersionResource]struct{}{ + {Group: "batch", Version: "v1", Resource: "jobs"}: {}, + {Group: "batch", Version: "v2alpha1", Resource: "cronjobs"}: {}, + }, + }, + { + response: func(w http.ResponseWriter, req *http.Request) { + var list interface{} + switch req.URL.Path { + case "/apis": + list = &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "batch", + Versions: []metav1.GroupVersionForDiscovery{ + {GroupVersion: "batch/v1", Version: "v1"}, + {GroupVersion: "batch/v2alpha1", Version: "v2alpha1"}, + {GroupVersion: "batch/v3alpha1", Version: "v3alpha1"}, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{GroupVersion: "batch/v2alpha", Version: "v2alpha1"}, + }, + }, + } + case "/apis/batch/v1": + list = &batchv1 + case "/apis/batch/v2alpha1": + list = &batchv2alpha1 + case "/apis/batch/v3alpha1": + list = &batchv3alpha1 + default: + t.Logf("unexpected request: %s", req.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + output, err := json.Marshal(list) + if err != nil { + t.Errorf("unexpected encoding error: %v", err) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(output) + }, + expected: map[schema.GroupVersionResource]struct{}{ + {Group: "batch", Version: "v2alpha1", Resource: "jobs"}: {}, + {Group: "batch", Version: "v2alpha1", Resource: "cronjobs"}: {}, + }, + }, + } + for i, test := range tests { + server := httptest.NewServer(http.HandlerFunc(test.response)) + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + resources, err := client.ServerPreferredNamespacedResources() + if err != nil { + t.Errorf("[%d] unexpected error: %v", i, err) + continue + } + got, err := GroupVersionResources(resources) + if err != nil { + t.Errorf("[%d] unexpected error: %v", i, err) + continue + } + + if !reflect.DeepEqual(got, test.expected) { + t.Errorf("[%d] expected:\n%v\ngot:\n%v\n", i, test.expected, got) + } + server.Close() + } +} + +func groupVersions(resources []*metav1.APIResourceList) []string { + result := []string{} + for _, resourceList := range resources { + result = append(result, resourceList.GroupVersion) + } + return result +} diff --git a/vendor/k8s.io/client-go/discovery/doc.go b/vendor/k8s.io/client-go/discovery/doc.go new file mode 100644 index 00000000..76495588 --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/doc.go @@ -0,0 +1,19 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 discovery provides ways to discover server-supported +// API groups, versions and resources. +package discovery diff --git a/vendor/k8s.io/client-go/discovery/helper_blackbox_test.go b/vendor/k8s.io/client-go/discovery/helper_blackbox_test.go new file mode 100644 index 00000000..9cd85cb1 --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/helper_blackbox_test.go @@ -0,0 +1,184 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 discovery_test + +import ( + "bytes" + "encoding/json" + "errors" + "io" + "io/ioutil" + "net/http" + "strings" + "testing" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/discovery" + "k8s.io/client-go/kubernetes/scheme" + restclient "k8s.io/client-go/rest" + "k8s.io/client-go/rest/fake" +) + +func objBody(object interface{}) io.ReadCloser { + output, err := json.MarshalIndent(object, "", "") + if err != nil { + panic(err) + } + return ioutil.NopCloser(bytes.NewReader([]byte(output))) +} + +func TestServerSupportsVersion(t *testing.T) { + tests := []struct { + name string + requiredVersion schema.GroupVersion + serverVersions []string + expectErr func(err error) bool + sendErr error + statusCode int + }{ + { + name: "explicit version supported", + requiredVersion: schema.GroupVersion{Version: "v1"}, + serverVersions: []string{"/version1", v1.SchemeGroupVersion.String()}, + statusCode: http.StatusOK, + }, + { + name: "explicit version not supported on server", + requiredVersion: schema.GroupVersion{Version: "v1"}, + serverVersions: []string{"version1"}, + expectErr: func(err error) bool { return strings.Contains(err.Error(), `server does not support API version "v1"`) }, + statusCode: http.StatusOK, + }, + { + name: "connection refused error", + serverVersions: []string{"version1"}, + sendErr: errors.New("connection refused"), + expectErr: func(err error) bool { return strings.Contains(err.Error(), "connection refused") }, + statusCode: http.StatusOK, + }, + { + name: "discovery fails due to 404 Not Found errors and thus serverVersions is empty, use requested GroupVersion", + requiredVersion: schema.GroupVersion{Version: "version1"}, + statusCode: http.StatusNotFound, + }, + } + + for _, test := range tests { + fakeClient := &fake.RESTClient{ + NegotiatedSerializer: scheme.Codecs, + Resp: &http.Response{ + StatusCode: test.statusCode, + Body: objBody(&metav1.APIVersions{Versions: test.serverVersions}), + }, + Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { + if test.sendErr != nil { + return nil, test.sendErr + } + header := http.Header{} + header.Set("Content-Type", runtime.ContentTypeJSON) + return &http.Response{StatusCode: test.statusCode, Header: header, Body: objBody(&metav1.APIVersions{Versions: test.serverVersions})}, nil + }), + } + c := discovery.NewDiscoveryClientForConfigOrDie(&restclient.Config{}) + c.RESTClient().(*restclient.RESTClient).Client = fakeClient.Client + err := discovery.ServerSupportsVersion(c, test.requiredVersion) + if err == nil && test.expectErr != nil { + t.Errorf("expected error, got nil for [%s].", test.name) + } + if err != nil { + if test.expectErr == nil || !test.expectErr(err) { + t.Errorf("unexpected error for [%s]: %v.", test.name, err) + } + continue + } + } +} + +func TestFilteredBy(t *testing.T) { + all := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { + return true + }) + none := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { + return false + }) + onlyV2 := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { + return strings.HasSuffix(gv, "/v2") || gv == "v2" + }) + onlyBar := discovery.ResourcePredicateFunc(func(gv string, r *metav1.APIResource) bool { + return r.Kind == "Bar" + }) + + foo := []*metav1.APIResourceList{ + { + GroupVersion: "foo/v1", + APIResources: []metav1.APIResource{ + {Name: "bar", Kind: "Bar"}, + {Name: "test", Kind: "Test"}, + }, + }, + { + GroupVersion: "foo/v2", + APIResources: []metav1.APIResource{ + {Name: "bar", Kind: "Bar"}, + {Name: "test", Kind: "Test"}, + }, + }, + { + GroupVersion: "foo/v3", + APIResources: []metav1.APIResource{}, + }, + } + + tests := []struct { + input []*metav1.APIResourceList + pred discovery.ResourcePredicate + expectedResources []string + }{ + {nil, all, []string{}}, + {[]*metav1.APIResourceList{ + {GroupVersion: "foo/v1"}, + }, all, []string{}}, + {foo, all, []string{"foo/v1.bar", "foo/v1.test", "foo/v2.bar", "foo/v2.test"}}, + {foo, onlyV2, []string{"foo/v2.bar", "foo/v2.test"}}, + {foo, onlyBar, []string{"foo/v1.bar", "foo/v2.bar"}}, + {foo, none, []string{}}, + } + for i, test := range tests { + filtered := discovery.FilteredBy(test.pred, test.input) + + if expected, got := sets.NewString(test.expectedResources...), sets.NewString(stringify(filtered)...); !expected.Equal(got) { + t.Errorf("[%d] unexpected group versions: expected=%v, got=%v", i, test.expectedResources, stringify(filtered)) + } + } +} + +func stringify(rls []*metav1.APIResourceList) []string { + result := []string{} + for _, rl := range rls { + for _, r := range rl.APIResources { + result = append(result, rl.GroupVersion+"."+r.Name) + } + if len(rl.APIResources) == 0 { + result = append(result, rl.GroupVersion) + } + } + return result +} diff --git a/vendor/k8s.io/client-go/discovery/round_tripper.go b/vendor/k8s.io/client-go/discovery/round_tripper.go index 2e352b88..75b7f520 100644 --- a/vendor/k8s.io/client-go/discovery/round_tripper.go +++ b/vendor/k8s.io/client-go/discovery/round_tripper.go @@ -14,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package transport provides a round tripper capable of caching HTTP responses. package discovery import ( "net/http" "path/filepath" + "github.com/golang/glog" "github.com/gregjones/httpcache" "github.com/gregjones/httpcache/diskcache" "github.com/peterbourgon/diskv" @@ -48,4 +48,15 @@ func (rt *cacheRoundTripper) RoundTrip(req *http.Request) (*http.Response, error return rt.rt.RoundTrip(req) } +func (rt *cacheRoundTripper) CancelRequest(req *http.Request) { + type canceler interface { + CancelRequest(*http.Request) + } + if cr, ok := rt.rt.Transport.(canceler); ok { + cr.CancelRequest(req) + } else { + glog.Errorf("CancelRequest not implemented by %T", rt.rt.Transport) + } +} + func (rt *cacheRoundTripper) WrappedRoundTripper() http.RoundTripper { return rt.rt.Transport } diff --git a/vendor/k8s.io/client-go/discovery/round_tripper_test.go b/vendor/k8s.io/client-go/discovery/round_tripper_test.go new file mode 100644 index 00000000..b15e2e77 --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/round_tripper_test.go @@ -0,0 +1,95 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 discovery + +import ( + "bytes" + "io/ioutil" + "net/http" + "net/url" + "os" + "testing" +) + +// copied from k8s.io/client-go/transport/round_trippers_test.go +type testRoundTripper struct { + Request *http.Request + Response *http.Response + Err error +} + +func (rt *testRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + rt.Request = req + return rt.Response, rt.Err +} + +func TestCacheRoundTripper(t *testing.T) { + rt := &testRoundTripper{} + cacheDir, err := ioutil.TempDir("", "cache-rt") + defer os.RemoveAll(cacheDir) + if err != nil { + t.Fatal(err) + } + cache := newCacheRoundTripper(cacheDir, rt) + + // First call, caches the response + req := &http.Request{ + Method: http.MethodGet, + URL: &url.URL{Host: "localhost"}, + } + rt.Response = &http.Response{ + Header: http.Header{"ETag": []string{`"123456"`}}, + Body: ioutil.NopCloser(bytes.NewReader([]byte("Content"))), + StatusCode: http.StatusOK, + } + resp, err := cache.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + content, err := ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + if string(content) != "Content" { + t.Errorf(`Expected Body to be "Content", got %q`, string(content)) + } + + // Second call, returns cached response + req = &http.Request{ + Method: http.MethodGet, + URL: &url.URL{Host: "localhost"}, + } + rt.Response = &http.Response{ + StatusCode: http.StatusNotModified, + Body: ioutil.NopCloser(bytes.NewReader([]byte("Other Content"))), + } + + resp, err = cache.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + + // Read body and make sure we have the initial content + content, err = ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if string(content) != "Content" { + t.Errorf("Invalid content read from cache %q", string(content)) + } +} diff --git a/vendor/k8s.io/client-go/discovery/unstructured.go b/vendor/k8s.io/client-go/discovery/unstructured.go deleted file mode 100644 index 81913a41..00000000 --- a/vendor/k8s.io/client-go/discovery/unstructured.go +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 discovery - -import ( - "reflect" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// UnstructuredObjectTyper provides a runtime.ObjectTyper implementation for -// runtime.Unstructured object based on discovery information. -type UnstructuredObjectTyper struct { - typers []runtime.ObjectTyper -} - -// NewUnstructuredObjectTyper returns a runtime.ObjectTyper for -// unstructured objects based on discovery information. It accepts a list of fallback typers -// for handling objects that are not runtime.Unstructured. It does not delegate the Recognizes -// check, only ObjectKinds. -// TODO this only works for the apiextensions server and doesn't recognize any types. Move to point of use. -func NewUnstructuredObjectTyper(typers ...runtime.ObjectTyper) *UnstructuredObjectTyper { - dot := &UnstructuredObjectTyper{ - typers: typers, - } - return dot -} - -// ObjectKinds returns a slice of one element with the group,version,kind of the -// provided object, or an error if the object is not runtime.Unstructured or -// has no group,version,kind information. unversionedType will always be false -// because runtime.Unstructured object should always have group,version,kind -// information set. -func (d *UnstructuredObjectTyper) ObjectKinds(obj runtime.Object) (gvks []schema.GroupVersionKind, unversionedType bool, err error) { - if _, ok := obj.(runtime.Unstructured); ok { - gvk := obj.GetObjectKind().GroupVersionKind() - if len(gvk.Kind) == 0 { - return nil, false, runtime.NewMissingKindErr("object has no kind field ") - } - if len(gvk.Version) == 0 { - return nil, false, runtime.NewMissingVersionErr("object has no apiVersion field") - } - return []schema.GroupVersionKind{gvk}, false, nil - } - var lastErr error - for _, typer := range d.typers { - gvks, unversioned, err := typer.ObjectKinds(obj) - if err != nil { - lastErr = err - continue - } - return gvks, unversioned, nil - } - if lastErr == nil { - lastErr = runtime.NewNotRegisteredErrForType(reflect.TypeOf(obj)) - } - return nil, false, lastErr -} - -// Recognizes returns true if the provided group,version,kind was in the -// discovery information. -func (d *UnstructuredObjectTyper) Recognizes(gvk schema.GroupVersionKind) bool { - return false -} - -var _ runtime.ObjectTyper = &UnstructuredObjectTyper{} diff --git a/vendor/k8s.io/client-go/dynamic/BUILD b/vendor/k8s.io/client-go/dynamic/BUILD new file mode 100644 index 00000000..97598fb5 --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/BUILD @@ -0,0 +1,65 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["client_test.go"], + embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/rest/watch:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = [ + "interface.go", + "scheme.go", + "simple.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/dynamic", + importpath = "k8s.io/client-go/dynamic", + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/client-go/dynamic/fake:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/vendor/k8s.io/client-go/dynamic/client_test.go b/vendor/k8s.io/client-go/dynamic/client_test.go new file mode 100644 index 00000000..e74cb832 --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/client_test.go @@ -0,0 +1,651 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 dynamic + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "reflect" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" + restclientwatch "k8s.io/client-go/rest/watch" +) + +func getJSON(version, kind, name string) []byte { + return []byte(fmt.Sprintf(`{"apiVersion": %q, "kind": %q, "metadata": {"name": %q}}`, version, kind, name)) +} + +func getListJSON(version, kind string, items ...[]byte) []byte { + json := fmt.Sprintf(`{"apiVersion": %q, "kind": %q, "items": [%s]}`, + version, kind, bytes.Join(items, []byte(","))) + return []byte(json) +} + +func getObject(version, kind, name string) *unstructured.Unstructured { + return &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": version, + "kind": kind, + "metadata": map[string]interface{}{ + "name": name, + }, + }, + } +} + +func getClientServer(h func(http.ResponseWriter, *http.Request)) (Interface, *httptest.Server, error) { + srv := httptest.NewServer(http.HandlerFunc(h)) + cl, err := NewForConfig(&restclient.Config{ + Host: srv.URL, + }) + if err != nil { + srv.Close() + return nil, nil, err + } + return cl, srv, nil +} + +func TestList(t *testing.T) { + tcs := []struct { + name string + namespace string + path string + resp []byte + want *unstructured.UnstructuredList + }{ + { + name: "normal_list", + path: "/apis/gtest/vtest/rtest", + resp: getListJSON("vTest", "rTestList", + getJSON("vTest", "rTest", "item1"), + getJSON("vTest", "rTest", "item2")), + want: &unstructured.UnstructuredList{ + Object: map[string]interface{}{ + "apiVersion": "vTest", + "kind": "rTestList", + }, + Items: []unstructured.Unstructured{ + *getObject("vTest", "rTest", "item1"), + *getObject("vTest", "rTest", "item2"), + }, + }, + }, + { + name: "namespaced_list", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + resp: getListJSON("vTest", "rTestList", + getJSON("vTest", "rTest", "item1"), + getJSON("vTest", "rTest", "item2")), + want: &unstructured.UnstructuredList{ + Object: map[string]interface{}{ + "apiVersion": "vTest", + "kind": "rTestList", + }, + Items: []unstructured.Unstructured{ + *getObject("vTest", "rTest", "item1"), + *getObject("vTest", "rTest", "item2"), + }, + }, + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Errorf("List(%q) got HTTP method %s. wanted GET", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("List(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + w.Write(tc.resp) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource).Namespace(tc.namespace).List(metav1.ListOptions{}) + if err != nil { + t.Errorf("unexpected error when listing %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("List(%q) want: %v\ngot: %v", tc.name, tc.want, got) + } + } +} + +func TestGet(t *testing.T) { + tcs := []struct { + resource string + subresource []string + namespace string + name string + path string + resp []byte + want *unstructured.Unstructured + }{ + { + resource: "rtest", + name: "normal_get", + path: "/apis/gtest/vtest/rtest/normal_get", + resp: getJSON("vTest", "rTest", "normal_get"), + want: getObject("vTest", "rTest", "normal_get"), + }, + { + resource: "rtest", + namespace: "nstest", + name: "namespaced_get", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_get", + resp: getJSON("vTest", "rTest", "namespaced_get"), + want: getObject("vTest", "rTest", "namespaced_get"), + }, + { + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_get", + path: "/apis/gtest/vtest/rtest/normal_subresource_get/srtest", + resp: getJSON("vTest", "srTest", "normal_subresource_get"), + want: getObject("vTest", "srTest", "normal_subresource_get"), + }, + { + resource: "rtest", + subresource: []string{"srtest"}, + namespace: "nstest", + name: "namespaced_subresource_get", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_get/srtest", + resp: getJSON("vTest", "srTest", "namespaced_subresource_get"), + want: getObject("vTest", "srTest", "namespaced_subresource_get"), + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Errorf("Get(%q) got HTTP method %s. wanted GET", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Get(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + w.Write(tc.resp) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource).Namespace(tc.namespace).Get(tc.name, metav1.GetOptions{}, tc.subresource...) + if err != nil { + t.Errorf("unexpected error when getting %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("Get(%q) want: %v\ngot: %v", tc.name, tc.want, got) + } + } +} + +func TestDelete(t *testing.T) { + background := metav1.DeletePropagationBackground + uid := types.UID("uid") + + statusOK := &metav1.Status{ + TypeMeta: metav1.TypeMeta{Kind: "Status"}, + Status: metav1.StatusSuccess, + } + tcs := []struct { + subresource []string + namespace string + name string + path string + deleteOptions *metav1.DeleteOptions + }{ + { + name: "normal_delete", + path: "/apis/gtest/vtest/rtest/normal_delete", + }, + { + namespace: "nstest", + name: "namespaced_delete", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete", + }, + { + subresource: []string{"srtest"}, + name: "normal_delete", + path: "/apis/gtest/vtest/rtest/normal_delete/srtest", + }, + { + subresource: []string{"srtest"}, + namespace: "nstest", + name: "namespaced_delete", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete/srtest", + }, + { + namespace: "nstest", + name: "namespaced_delete_with_options", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete_with_options", + deleteOptions: &metav1.DeleteOptions{Preconditions: &metav1.Preconditions{UID: &uid}, PropagationPolicy: &background}, + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "DELETE" { + t.Errorf("Delete(%q) got HTTP method %s. wanted DELETE", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Delete(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + unstructured.UnstructuredJSONScheme.Encode(statusOK, w) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + err = cl.Resource(resource).Namespace(tc.namespace).Delete(tc.name, tc.deleteOptions, tc.subresource...) + if err != nil { + t.Errorf("unexpected error when deleting %q: %v", tc.name, err) + continue + } + } +} + +func TestDeleteCollection(t *testing.T) { + statusOK := &metav1.Status{ + TypeMeta: metav1.TypeMeta{Kind: "Status"}, + Status: metav1.StatusSuccess, + } + tcs := []struct { + namespace string + name string + path string + }{ + { + name: "normal_delete_collection", + path: "/apis/gtest/vtest/rtest", + }, + { + namespace: "nstest", + name: "namespaced_delete_collection", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "DELETE" { + t.Errorf("DeleteCollection(%q) got HTTP method %s. wanted DELETE", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("DeleteCollection(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + unstructured.UnstructuredJSONScheme.Encode(statusOK, w) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + err = cl.Resource(resource).Namespace(tc.namespace).DeleteCollection(nil, metav1.ListOptions{}) + if err != nil { + t.Errorf("unexpected error when deleting collection %q: %v", tc.name, err) + continue + } + } +} + +func TestCreate(t *testing.T) { + tcs := []struct { + resource string + subresource []string + name string + namespace string + obj *unstructured.Unstructured + path string + }{ + { + resource: "rtest", + name: "normal_create", + path: "/apis/gtest/vtest/rtest", + obj: getObject("gtest/vTest", "rTest", "normal_create"), + }, + { + resource: "rtest", + name: "namespaced_create", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + obj: getObject("gtest/vTest", "rTest", "namespaced_create"), + }, + { + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_create", + path: "/apis/gtest/vtest/rtest/normal_subresource_create/srtest", + obj: getObject("vTest", "srTest", "normal_subresource_create"), + }, + { + resource: "rtest/", + subresource: []string{"srtest"}, + name: "namespaced_subresource_create", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_create/srtest", + obj: getObject("vTest", "srTest", "namespaced_subresource_create"), + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Errorf("Create(%q) got HTTP method %s. wanted POST", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Create(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + data, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Errorf("Create(%q) unexpected error reading body: %v", tc.name, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Write(data) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource).Namespace(tc.namespace).Create(tc.obj, metav1.CreateOptions{}, tc.subresource...) + if err != nil { + t.Errorf("unexpected error when creating %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.obj) { + t.Errorf("Create(%q) want: %v\ngot: %v", tc.name, tc.obj, got) + } + } +} + +func TestUpdate(t *testing.T) { + tcs := []struct { + resource string + subresource []string + name string + namespace string + obj *unstructured.Unstructured + path string + }{ + { + resource: "rtest", + name: "normal_update", + path: "/apis/gtest/vtest/rtest/normal_update", + obj: getObject("gtest/vTest", "rTest", "normal_update"), + }, + { + resource: "rtest", + name: "namespaced_update", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_update", + obj: getObject("gtest/vTest", "rTest", "namespaced_update"), + }, + { + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_update", + path: "/apis/gtest/vtest/rtest/normal_update/srtest", + obj: getObject("gtest/vTest", "srTest", "normal_update"), + }, + { + resource: "rtest", + subresource: []string{"srtest"}, + name: "namespaced_subresource_update", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_update/srtest", + obj: getObject("gtest/vTest", "srTest", "namespaced_update"), + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "PUT" { + t.Errorf("Update(%q) got HTTP method %s. wanted PUT", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Update(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + data, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Errorf("Update(%q) unexpected error reading body: %v", tc.name, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Write(data) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource).Namespace(tc.namespace).Update(tc.obj, metav1.UpdateOptions{}, tc.subresource...) + if err != nil { + t.Errorf("unexpected error when updating %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.obj) { + t.Errorf("Update(%q) want: %v\ngot: %v", tc.name, tc.obj, got) + } + } +} + +func TestWatch(t *testing.T) { + tcs := []struct { + name string + namespace string + events []watch.Event + path string + query string + }{ + { + name: "normal_watch", + path: "/apis/gtest/vtest/rtest", + query: "watch=true", + events: []watch.Event{ + {Type: watch.Added, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + {Type: watch.Modified, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + {Type: watch.Deleted, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + }, + }, + { + name: "namespaced_watch", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + query: "watch=true", + events: []watch.Event{ + {Type: watch.Added, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + {Type: watch.Modified, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + {Type: watch.Deleted, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + }, + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Errorf("Watch(%q) got HTTP method %s. wanted GET", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Watch(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + if r.URL.RawQuery != tc.query { + t.Errorf("Watch(%q) got query %s. wanted %s", tc.name, r.URL.RawQuery, tc.query) + } + + enc := restclientwatch.NewEncoder(streaming.NewEncoder(w, unstructured.UnstructuredJSONScheme), unstructured.UnstructuredJSONScheme) + for _, e := range tc.events { + enc.Encode(&e) + } + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + watcher, err := cl.Resource(resource).Namespace(tc.namespace).Watch(metav1.ListOptions{}) + if err != nil { + t.Errorf("unexpected error when watching %q: %v", tc.name, err) + continue + } + + for _, want := range tc.events { + got := <-watcher.ResultChan() + if !reflect.DeepEqual(got, want) { + t.Errorf("Watch(%q) want: %v\ngot: %v", tc.name, want, got) + } + } + } +} + +func TestPatch(t *testing.T) { + tcs := []struct { + resource string + subresource []string + name string + namespace string + patch []byte + want *unstructured.Unstructured + path string + }{ + { + resource: "rtest", + name: "normal_patch", + path: "/apis/gtest/vtest/rtest/normal_patch", + patch: getJSON("gtest/vTest", "rTest", "normal_patch"), + want: getObject("gtest/vTest", "rTest", "normal_patch"), + }, + { + resource: "rtest", + name: "namespaced_patch", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_patch", + patch: getJSON("gtest/vTest", "rTest", "namespaced_patch"), + want: getObject("gtest/vTest", "rTest", "namespaced_patch"), + }, + { + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_patch", + path: "/apis/gtest/vtest/rtest/normal_subresource_patch/srtest", + patch: getJSON("gtest/vTest", "srTest", "normal_subresource_patch"), + want: getObject("gtest/vTest", "srTest", "normal_subresource_patch"), + }, + { + resource: "rtest", + subresource: []string{"srtest"}, + name: "namespaced_subresource_patch", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_patch/srtest", + patch: getJSON("gtest/vTest", "srTest", "namespaced_subresource_patch"), + want: getObject("gtest/vTest", "srTest", "namespaced_subresource_patch"), + }, + } + for _, tc := range tcs { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "PATCH" { + t.Errorf("Patch(%q) got HTTP method %s. wanted PATCH", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Patch(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + content := r.Header.Get("Content-Type") + if content != string(types.StrategicMergePatchType) { + t.Errorf("Patch(%q) got Content-Type %s. wanted %s", tc.name, content, types.StrategicMergePatchType) + } + + data, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Errorf("Patch(%q) unexpected error reading body: %v", tc.name, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + w.Write(data) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource).Namespace(tc.namespace).Patch(tc.name, types.StrategicMergePatchType, tc.patch, metav1.UpdateOptions{}, tc.subresource...) + if err != nil { + t.Errorf("unexpected error when patching %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("Patch(%q) want: %v\ngot: %v", tc.name, tc.want, got) + } + } +} diff --git a/vendor/k8s.io/client-go/dynamic/interface.go b/vendor/k8s.io/client-go/dynamic/interface.go new file mode 100644 index 00000000..c457be17 --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/interface.go @@ -0,0 +1,59 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 dynamic + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" +) + +type Interface interface { + Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface +} + +type ResourceInterface interface { + Create(obj *unstructured.Unstructured, options metav1.CreateOptions, subresources ...string) (*unstructured.Unstructured, error) + Update(obj *unstructured.Unstructured, options metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) + UpdateStatus(obj *unstructured.Unstructured, options metav1.UpdateOptions) (*unstructured.Unstructured, error) + Delete(name string, options *metav1.DeleteOptions, subresources ...string) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) + List(opts metav1.ListOptions) (*unstructured.UnstructuredList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, options metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) +} + +type NamespaceableResourceInterface interface { + Namespace(string) ResourceInterface + ResourceInterface +} + +// APIPathResolverFunc knows how to convert a groupVersion to its API path. The Kind field is optional. +// TODO find a better place to move this for existing callers +type APIPathResolverFunc func(kind schema.GroupVersionKind) string + +// LegacyAPIPathResolverFunc can resolve paths properly with the legacy API. +// TODO find a better place to move this for existing callers +func LegacyAPIPathResolverFunc(kind schema.GroupVersionKind) string { + if len(kind.Group) == 0 { + return "/api" + } + return "/apis" +} diff --git a/vendor/k8s.io/client-go/dynamic/scheme.go b/vendor/k8s.io/client-go/dynamic/scheme.go new file mode 100644 index 00000000..c4aa081f --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/scheme.go @@ -0,0 +1,98 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 dynamic + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/apimachinery/pkg/runtime/serializer/versioning" +) + +var watchScheme = runtime.NewScheme() +var basicScheme = runtime.NewScheme() +var deleteScheme = runtime.NewScheme() +var parameterScheme = runtime.NewScheme() +var deleteOptionsCodec = serializer.NewCodecFactory(deleteScheme) +var dynamicParameterCodec = runtime.NewParameterCodec(parameterScheme) + +var versionV1 = schema.GroupVersion{Version: "v1"} + +func init() { + metav1.AddToGroupVersion(watchScheme, versionV1) + metav1.AddToGroupVersion(basicScheme, versionV1) + metav1.AddToGroupVersion(parameterScheme, versionV1) + metav1.AddToGroupVersion(deleteScheme, versionV1) +} + +var watchJsonSerializerInfo = runtime.SerializerInfo{ + MediaType: "application/json", + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, watchScheme, watchScheme, false), + PrettySerializer: json.NewSerializer(json.DefaultMetaFactory, watchScheme, watchScheme, true), + StreamSerializer: &runtime.StreamSerializerInfo{ + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, watchScheme, watchScheme, false), + Framer: json.Framer, + }, +} + +// watchNegotiatedSerializer is used to read the wrapper of the watch stream +type watchNegotiatedSerializer struct{} + +var watchNegotiatedSerializerInstance = watchNegotiatedSerializer{} + +func (s watchNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo { + return []runtime.SerializerInfo{watchJsonSerializerInfo} +} + +func (s watchNegotiatedSerializer) EncoderForVersion(encoder runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, encoder, nil, gv, nil) +} + +func (s watchNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, nil, decoder, nil, gv) +} + +// basicNegotiatedSerializer is used to handle discovery and error handling serialization +type basicNegotiatedSerializer struct{} + +func (s basicNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo { + return []runtime.SerializerInfo{ + { + MediaType: "application/json", + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, basicScheme, basicScheme, false), + PrettySerializer: json.NewSerializer(json.DefaultMetaFactory, basicScheme, basicScheme, true), + StreamSerializer: &runtime.StreamSerializerInfo{ + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, basicScheme, basicScheme, false), + Framer: json.Framer, + }, + }, + } +} + +func (s basicNegotiatedSerializer) EncoderForVersion(encoder runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, encoder, nil, gv, nil) +} + +func (s basicNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, nil, decoder, nil, gv) +} diff --git a/vendor/k8s.io/client-go/dynamic/simple.go b/vendor/k8s.io/client-go/dynamic/simple.go new file mode 100644 index 00000000..9e21cda6 --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/simple.go @@ -0,0 +1,326 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 dynamic + +import ( + "io" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/rest" +) + +type dynamicClient struct { + client *rest.RESTClient +} + +var _ Interface = &dynamicClient{} + +// NewForConfigOrDie creates a new Interface for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) Interface { + ret, err := NewForConfig(c) + if err != nil { + panic(err) + } + return ret +} + +func NewForConfig(inConfig *rest.Config) (Interface, error) { + config := rest.CopyConfig(inConfig) + // for serializing the options + config.GroupVersion = &schema.GroupVersion{} + config.APIPath = "/if-you-see-this-search-for-the-break" + config.AcceptContentTypes = "application/json" + config.ContentType = "application/json" + config.NegotiatedSerializer = basicNegotiatedSerializer{} // this gets used for discovery and error handling types + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + restClient, err := rest.RESTClientFor(config) + if err != nil { + return nil, err + } + + return &dynamicClient{client: restClient}, nil +} + +type dynamicResourceClient struct { + client *dynamicClient + namespace string + resource schema.GroupVersionResource +} + +func (c *dynamicClient) Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface { + return &dynamicResourceClient{client: c, resource: resource} +} + +func (c *dynamicResourceClient) Namespace(ns string) ResourceInterface { + ret := *c + ret.namespace = ns + return &ret +} + +func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, opts metav1.CreateOptions, subresources ...string) (*unstructured.Unstructured, error) { + outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + name := "" + if len(subresources) > 0 { + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + name = accessor.GetName() + } + + result := c.client.client. + Post(). + AbsPath(append(c.makeURLSegments(name), subresources...)...). + Body(outBytes). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() + if err := result.Error(); err != nil { + return nil, err + } + + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, opts metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) { + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + + result := c.client.client. + Put(). + AbsPath(append(c.makeURLSegments(accessor.GetName()), subresources...)...). + Body(outBytes). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() + if err := result.Error(); err != nil { + return nil, err + } + + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured, opts metav1.UpdateOptions) (*unstructured.Unstructured, error) { + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + + outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + + result := c.client.client. + Put(). + AbsPath(append(c.makeURLSegments(accessor.GetName()), "status")...). + Body(outBytes). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() + if err := result.Error(); err != nil { + return nil, err + } + + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) Delete(name string, opts *metav1.DeleteOptions, subresources ...string) error { + if opts == nil { + opts = &metav1.DeleteOptions{} + } + deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), opts) + if err != nil { + return err + } + + result := c.client.client. + Delete(). + AbsPath(append(c.makeURLSegments(name), subresources...)...). + Body(deleteOptionsByte). + Do() + return result.Error() +} + +func (c *dynamicResourceClient) DeleteCollection(opts *metav1.DeleteOptions, listOptions metav1.ListOptions) error { + if opts == nil { + opts = &metav1.DeleteOptions{} + } + deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), opts) + if err != nil { + return err + } + + result := c.client.client. + Delete(). + AbsPath(c.makeURLSegments("")...). + Body(deleteOptionsByte). + SpecificallyVersionedParams(&listOptions, dynamicParameterCodec, versionV1). + Do() + return result.Error() +} + +func (c *dynamicResourceClient) Get(name string, opts metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) { + result := c.client.client.Get().AbsPath(append(c.makeURLSegments(name), subresources...)...).SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).Do() + if err := result.Error(); err != nil { + return nil, err + } + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) List(opts metav1.ListOptions) (*unstructured.UnstructuredList, error) { + result := c.client.client.Get().AbsPath(c.makeURLSegments("")...).SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).Do() + if err := result.Error(); err != nil { + return nil, err + } + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + if list, ok := uncastObj.(*unstructured.UnstructuredList); ok { + return list, nil + } + + list, err := uncastObj.(*unstructured.Unstructured).ToList() + if err != nil { + return nil, err + } + return list, nil +} + +func (c *dynamicResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) { + internalGV := schema.GroupVersions{ + {Group: c.resource.Group, Version: runtime.APIVersionInternal}, + // always include the legacy group as a decoding target to handle non-error `Status` return types + {Group: "", Version: runtime.APIVersionInternal}, + } + s := &rest.Serializers{ + Encoder: watchNegotiatedSerializerInstance.EncoderForVersion(watchJsonSerializerInfo.Serializer, c.resource.GroupVersion()), + Decoder: watchNegotiatedSerializerInstance.DecoderToVersion(watchJsonSerializerInfo.Serializer, internalGV), + + RenegotiatedDecoder: func(contentType string, params map[string]string) (runtime.Decoder, error) { + return watchNegotiatedSerializerInstance.DecoderToVersion(watchJsonSerializerInfo.Serializer, internalGV), nil + }, + StreamingSerializer: watchJsonSerializerInfo.StreamSerializer.Serializer, + Framer: watchJsonSerializerInfo.StreamSerializer.Framer, + } + + wrappedDecoderFn := func(body io.ReadCloser) streaming.Decoder { + framer := s.Framer.NewFrameReader(body) + return streaming.NewDecoder(framer, s.StreamingSerializer) + } + + opts.Watch = true + return c.client.client.Get().AbsPath(c.makeURLSegments("")...). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + WatchWithSpecificDecoders(wrappedDecoderFn, unstructured.UnstructuredJSONScheme) +} + +func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, opts metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) { + result := c.client.client. + Patch(pt). + AbsPath(append(c.makeURLSegments(name), subresources...)...). + Body(data). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() + if err := result.Error(); err != nil { + return nil, err + } + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) makeURLSegments(name string) []string { + url := []string{} + if len(c.resource.Group) == 0 { + url = append(url, "api") + } else { + url = append(url, "apis", c.resource.Group) + } + url = append(url, c.resource.Version) + + if len(c.namespace) > 0 { + url = append(url, "namespaces", c.namespace) + } + url = append(url, c.resource.Resource) + + if len(name) > 0 { + url = append(url, name) + } + + return url +} diff --git a/vendor/k8s.io/client-go/informers/BUILD b/vendor/k8s.io/client-go/informers/BUILD index 6514fa41..d5654768 100644 --- a/vendor/k8s.io/client-go/informers/BUILD +++ b/vendor/k8s.io/client-go/informers/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,53 +6,58 @@ go_library( "factory.go", "generic.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers", importpath = "k8s.io/client-go/informers", + visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/api/scheduling/v1beta1:go_default_library", - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/informers/admissionregistration:go_default_library", - "//vendor/k8s.io/client-go/informers/apps:go_default_library", - "//vendor/k8s.io/client-go/informers/autoscaling:go_default_library", - "//vendor/k8s.io/client-go/informers/batch:go_default_library", - "//vendor/k8s.io/client-go/informers/certificates:go_default_library", - "//vendor/k8s.io/client-go/informers/core:go_default_library", - "//vendor/k8s.io/client-go/informers/events:go_default_library", - "//vendor/k8s.io/client-go/informers/extensions:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/networking:go_default_library", - "//vendor/k8s.io/client-go/informers/policy:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac:go_default_library", - "//vendor/k8s.io/client-go/informers/scheduling:go_default_library", - "//vendor/k8s.io/client-go/informers/settings:go_default_library", - "//vendor/k8s.io/client-go/informers/storage:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/api/networking/v1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/client-go/informers/admissionregistration:go_default_library", + "//staging/src/k8s.io/client-go/informers/apps:go_default_library", + "//staging/src/k8s.io/client-go/informers/autoscaling:go_default_library", + "//staging/src/k8s.io/client-go/informers/batch:go_default_library", + "//staging/src/k8s.io/client-go/informers/certificates:go_default_library", + "//staging/src/k8s.io/client-go/informers/coordination:go_default_library", + "//staging/src/k8s.io/client-go/informers/core:go_default_library", + "//staging/src/k8s.io/client-go/informers/events:go_default_library", + "//staging/src/k8s.io/client-go/informers/extensions:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/networking:go_default_library", + "//staging/src/k8s.io/client-go/informers/policy:go_default_library", + "//staging/src/k8s.io/client-go/informers/rbac:go_default_library", + "//staging/src/k8s.io/client-go/informers/scheduling:go_default_library", + "//staging/src/k8s.io/client-go/informers/settings:go_default_library", + "//staging/src/k8s.io/client-go/informers/storage:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) @@ -77,6 +77,7 @@ filegroup( "//staging/src/k8s.io/client-go/informers/autoscaling:all-srcs", "//staging/src/k8s.io/client-go/informers/batch:all-srcs", "//staging/src/k8s.io/client-go/informers/certificates:all-srcs", + "//staging/src/k8s.io/client-go/informers/coordination:all-srcs", "//staging/src/k8s.io/client-go/informers/core:all-srcs", "//staging/src/k8s.io/client-go/informers/events:all-srcs", "//staging/src/k8s.io/client-go/informers/extensions:all-srcs", @@ -89,4 +90,5 @@ filegroup( "//staging/src/k8s.io/client-go/informers/storage:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/BUILD index 6f93c10a..133a7478 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/BUILD +++ b/vendor/k8s.io/client-go/informers/admissionregistration/BUILD @@ -8,11 +8,12 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration", importpath = "k8s.io/client-go/informers/admissionregistration", deps = [ - "//vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/informers/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD index 7292f8ca..cc6eb8d2 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD @@ -6,17 +6,18 @@ go_library( "initializerconfiguration.go", "interface.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1", importpath = "k8s.io/client-go/informers/admissionregistration/v1alpha1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go index 463ca00e..4cfaae5b 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - admissionregistration_v1alpha1 "k8s.io/api/admissionregistration/v1alpha1" + admissionregistrationv1alpha1 "k8s.io/api/admissionregistration/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredInitializerConfigurationInformer(client kubernetes.Interface, re return client.AdmissionregistrationV1alpha1().InitializerConfigurations().Watch(options) }, }, - &admissionregistration_v1alpha1.InitializerConfiguration{}, + &admissionregistrationv1alpha1.InitializerConfiguration{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *initializerConfigurationInformer) defaultInformer(client kubernetes.Int } func (f *initializerConfigurationInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&admissionregistration_v1alpha1.InitializerConfiguration{}, f.defaultInformer) + return f.factory.InformerFor(&admissionregistrationv1alpha1.InitializerConfiguration{}, f.defaultInformer) } func (f *initializerConfigurationInformer) Lister() v1alpha1.InitializerConfigurationLister { diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD index e66e6eb4..82ddc155 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD @@ -7,17 +7,18 @@ go_library( "mutatingwebhookconfiguration.go", "validatingwebhookconfiguration.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1", importpath = "k8s.io/client-go/informers/admissionregistration/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go index 58f065de..a06c406c 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - admissionregistration_v1beta1 "k8s.io/api/admissionregistration/v1beta1" + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredMutatingWebhookConfigurationInformer(client kubernetes.Interface return client.AdmissionregistrationV1beta1().MutatingWebhookConfigurations().Watch(options) }, }, - &admissionregistration_v1beta1.MutatingWebhookConfiguration{}, + &admissionregistrationv1beta1.MutatingWebhookConfiguration{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *mutatingWebhookConfigurationInformer) defaultInformer(client kubernetes } func (f *mutatingWebhookConfigurationInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&admissionregistration_v1beta1.MutatingWebhookConfiguration{}, f.defaultInformer) + return f.factory.InformerFor(&admissionregistrationv1beta1.MutatingWebhookConfiguration{}, f.defaultInformer) } func (f *mutatingWebhookConfigurationInformer) Lister() v1beta1.MutatingWebhookConfigurationLister { diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go index bfa89cef..3b7fafd2 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - admissionregistration_v1beta1 "k8s.io/api/admissionregistration/v1beta1" + admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredValidatingWebhookConfigurationInformer(client kubernetes.Interfa return client.AdmissionregistrationV1beta1().ValidatingWebhookConfigurations().Watch(options) }, }, - &admissionregistration_v1beta1.ValidatingWebhookConfiguration{}, + &admissionregistrationv1beta1.ValidatingWebhookConfiguration{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *validatingWebhookConfigurationInformer) defaultInformer(client kubernet } func (f *validatingWebhookConfigurationInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&admissionregistration_v1beta1.ValidatingWebhookConfiguration{}, f.defaultInformer) + return f.factory.InformerFor(&admissionregistrationv1beta1.ValidatingWebhookConfiguration{}, f.defaultInformer) } func (f *validatingWebhookConfigurationInformer) Lister() v1beta1.ValidatingWebhookConfigurationLister { diff --git a/vendor/k8s.io/client-go/informers/apps/BUILD b/vendor/k8s.io/client-go/informers/apps/BUILD index 80615b10..55e563d0 100644 --- a/vendor/k8s.io/client-go/informers/apps/BUILD +++ b/vendor/k8s.io/client-go/informers/apps/BUILD @@ -8,12 +8,13 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps", importpath = "k8s.io/client-go/informers/apps", deps = [ - "//vendor/k8s.io/client-go/informers/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/apps/v1/BUILD b/vendor/k8s.io/client-go/informers/apps/v1/BUILD index 233e2610..31aca7c5 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/BUILD +++ b/vendor/k8s.io/client-go/informers/apps/v1/BUILD @@ -10,17 +10,18 @@ go_library( "replicaset.go", "statefulset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1", importpath = "k8s.io/client-go/informers/apps/v1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go b/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go index 58bf4214..2f69e0df 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - apps_v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewControllerRevisionInformer(client kubernetes.Interface, namespace string func NewFilteredControllerRevisionInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().ControllerRevisions(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().ControllerRevisions(namespace).Watch(options) }, }, - &apps_v1.ControllerRevision{}, + &appsv1.ControllerRevision{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *controllerRevisionInformer) defaultInformer(client kubernetes.Interface } func (f *controllerRevisionInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1.ControllerRevision{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1.ControllerRevision{}, f.defaultInformer) } func (f *controllerRevisionInformer) Lister() v1.ControllerRevisionLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go b/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go index 14d890ba..db649ccb 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - apps_v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewDaemonSetInformer(client kubernetes.Interface, namespace string, resyncP func NewFilteredDaemonSetInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().DaemonSets(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().DaemonSets(namespace).Watch(options) }, }, - &apps_v1.DaemonSet{}, + &appsv1.DaemonSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *daemonSetInformer) defaultInformer(client kubernetes.Interface, resyncP } func (f *daemonSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1.DaemonSet{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1.DaemonSet{}, f.defaultInformer) } func (f *daemonSetInformer) Lister() v1.DaemonSetLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1/deployment.go b/vendor/k8s.io/client-go/informers/apps/v1/deployment.go index dd858750..71cd0027 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/deployment.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/deployment.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - apps_v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewDeploymentInformer(client kubernetes.Interface, namespace string, resync func NewFilteredDeploymentInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().Deployments(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().Deployments(namespace).Watch(options) }, }, - &apps_v1.Deployment{}, + &appsv1.Deployment{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *deploymentInformer) defaultInformer(client kubernetes.Interface, resync } func (f *deploymentInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1.Deployment{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1.Deployment{}, f.defaultInformer) } func (f *deploymentInformer) Lister() v1.DeploymentLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go b/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go index b1ab1ebe..6ee7a053 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - apps_v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewReplicaSetInformer(client kubernetes.Interface, namespace string, resync func NewFilteredReplicaSetInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().ReplicaSets(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().ReplicaSets(namespace).Watch(options) }, }, - &apps_v1.ReplicaSet{}, + &appsv1.ReplicaSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *replicaSetInformer) defaultInformer(client kubernetes.Interface, resync } func (f *replicaSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1.ReplicaSet{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1.ReplicaSet{}, f.defaultInformer) } func (f *replicaSetInformer) Lister() v1.ReplicaSetLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go b/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go index f488e3b9..385e6536 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - apps_v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + appsv1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewStatefulSetInformer(client kubernetes.Interface, namespace string, resyn func NewFilteredStatefulSetInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().StatefulSets(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AppsV1().StatefulSets(namespace).Watch(options) }, }, - &apps_v1.StatefulSet{}, + &appsv1.StatefulSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *statefulSetInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *statefulSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1.StatefulSet{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1.StatefulSet{}, f.defaultInformer) } func (f *statefulSetInformer) Lister() v1.StatefulSetLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD index 80ca939e..cd5220b3 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD @@ -13,16 +13,17 @@ go_library( "interface.go", "statefulset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1beta1", importpath = "k8s.io/client-go/informers/apps/v1beta1", deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go b/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go index 4283d382..c7d3e30e 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - apps_v1beta1 "k8s.io/api/apps/v1beta1" + appsv1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredControllerRevisionInformer(client kubernetes.Interface, namespac return client.AppsV1beta1().ControllerRevisions(namespace).Watch(options) }, }, - &apps_v1beta1.ControllerRevision{}, + &appsv1beta1.ControllerRevision{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *controllerRevisionInformer) defaultInformer(client kubernetes.Interface } func (f *controllerRevisionInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta1.ControllerRevision{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta1.ControllerRevision{}, f.defaultInformer) } func (f *controllerRevisionInformer) Lister() v1beta1.ControllerRevisionLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go b/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go index 1e7620be..03bafca6 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - apps_v1beta1 "k8s.io/api/apps/v1beta1" + appsv1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredDeploymentInformer(client kubernetes.Interface, namespace string return client.AppsV1beta1().Deployments(namespace).Watch(options) }, }, - &apps_v1beta1.Deployment{}, + &appsv1beta1.Deployment{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *deploymentInformer) defaultInformer(client kubernetes.Interface, resync } func (f *deploymentInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta1.Deployment{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta1.Deployment{}, f.defaultInformer) } func (f *deploymentInformer) Lister() v1beta1.DeploymentLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go b/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go index 94fd0f93..e4d1b46f 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - apps_v1beta1 "k8s.io/api/apps/v1beta1" + appsv1beta1 "k8s.io/api/apps/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredStatefulSetInformer(client kubernetes.Interface, namespace strin return client.AppsV1beta1().StatefulSets(namespace).Watch(options) }, }, - &apps_v1beta1.StatefulSet{}, + &appsv1beta1.StatefulSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *statefulSetInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *statefulSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta1.StatefulSet{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta1.StatefulSet{}, f.defaultInformer) } func (f *statefulSetInformer) Lister() v1beta1.StatefulSetLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD index 5b0137bb..ce5d9adc 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD @@ -15,16 +15,17 @@ go_library( "replicaset.go", "statefulset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1beta2", importpath = "k8s.io/client-go/informers/apps/v1beta2", deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go index 28e241b1..975e8107 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go @@ -21,7 +21,7 @@ package v1beta2 import ( time "time" - apps_v1beta2 "k8s.io/api/apps/v1beta2" + appsv1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredControllerRevisionInformer(client kubernetes.Interface, namespac return client.AppsV1beta2().ControllerRevisions(namespace).Watch(options) }, }, - &apps_v1beta2.ControllerRevision{}, + &appsv1beta2.ControllerRevision{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *controllerRevisionInformer) defaultInformer(client kubernetes.Interface } func (f *controllerRevisionInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta2.ControllerRevision{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta2.ControllerRevision{}, f.defaultInformer) } func (f *controllerRevisionInformer) Lister() v1beta2.ControllerRevisionLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go index bb25a194..99f17fa6 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go @@ -21,7 +21,7 @@ package v1beta2 import ( time "time" - apps_v1beta2 "k8s.io/api/apps/v1beta2" + appsv1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredDaemonSetInformer(client kubernetes.Interface, namespace string, return client.AppsV1beta2().DaemonSets(namespace).Watch(options) }, }, - &apps_v1beta2.DaemonSet{}, + &appsv1beta2.DaemonSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *daemonSetInformer) defaultInformer(client kubernetes.Interface, resyncP } func (f *daemonSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta2.DaemonSet{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta2.DaemonSet{}, f.defaultInformer) } func (f *daemonSetInformer) Lister() v1beta2.DaemonSetLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go index 457ca30a..b25da82b 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go @@ -21,7 +21,7 @@ package v1beta2 import ( time "time" - apps_v1beta2 "k8s.io/api/apps/v1beta2" + appsv1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredDeploymentInformer(client kubernetes.Interface, namespace string return client.AppsV1beta2().Deployments(namespace).Watch(options) }, }, - &apps_v1beta2.Deployment{}, + &appsv1beta2.Deployment{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *deploymentInformer) defaultInformer(client kubernetes.Interface, resync } func (f *deploymentInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta2.Deployment{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta2.Deployment{}, f.defaultInformer) } func (f *deploymentInformer) Lister() v1beta2.DeploymentLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go index 1558c141..6ce7fcfd 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go @@ -21,7 +21,7 @@ package v1beta2 import ( time "time" - apps_v1beta2 "k8s.io/api/apps/v1beta2" + appsv1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredReplicaSetInformer(client kubernetes.Interface, namespace string return client.AppsV1beta2().ReplicaSets(namespace).Watch(options) }, }, - &apps_v1beta2.ReplicaSet{}, + &appsv1beta2.ReplicaSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *replicaSetInformer) defaultInformer(client kubernetes.Interface, resync } func (f *replicaSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta2.ReplicaSet{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta2.ReplicaSet{}, f.defaultInformer) } func (f *replicaSetInformer) Lister() v1beta2.ReplicaSetLister { diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go index ae929d65..e77bb2f8 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go @@ -21,7 +21,7 @@ package v1beta2 import ( time "time" - apps_v1beta2 "k8s.io/api/apps/v1beta2" + appsv1beta2 "k8s.io/api/apps/v1beta2" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredStatefulSetInformer(client kubernetes.Interface, namespace strin return client.AppsV1beta2().StatefulSets(namespace).Watch(options) }, }, - &apps_v1beta2.StatefulSet{}, + &appsv1beta2.StatefulSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *statefulSetInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *statefulSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&apps_v1beta2.StatefulSet{}, f.defaultInformer) + return f.factory.InformerFor(&appsv1beta2.StatefulSet{}, f.defaultInformer) } func (f *statefulSetInformer) Lister() v1beta2.StatefulSetLister { diff --git a/vendor/k8s.io/client-go/informers/autoscaling/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/BUILD index 7ad9e975..66f6ca74 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/BUILD +++ b/vendor/k8s.io/client-go/informers/autoscaling/BUILD @@ -3,12 +3,14 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling", importpath = "k8s.io/client-go/informers/autoscaling", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/client-go/informers/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) @@ -25,6 +27,7 @@ filegroup( ":package-srcs", "//staging/src/k8s.io/client-go/informers/autoscaling/v1:all-srcs", "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta1:all-srcs", + "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta2:all-srcs", ], tags = ["automanaged"], visibility = ["//visibility:public"], diff --git a/vendor/k8s.io/client-go/informers/autoscaling/interface.go b/vendor/k8s.io/client-go/informers/autoscaling/interface.go index 1494d19d..81e83901 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/interface.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/interface.go @@ -21,6 +21,7 @@ package autoscaling import ( v1 "k8s.io/client-go/informers/autoscaling/v1" v2beta1 "k8s.io/client-go/informers/autoscaling/v2beta1" + v2beta2 "k8s.io/client-go/informers/autoscaling/v2beta2" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" ) @@ -30,6 +31,8 @@ type Interface interface { V1() v1.Interface // V2beta1 provides access to shared informers for resources in V2beta1. V2beta1() v2beta1.Interface + // V2beta2 provides access to shared informers for resources in V2beta2. + V2beta2() v2beta2.Interface } type group struct { @@ -52,3 +55,8 @@ func (g *group) V1() v1.Interface { func (g *group) V2beta1() v2beta1.Interface { return v2beta1.New(g.factory, g.namespace, g.tweakListOptions) } + +// V2beta2 returns a new v2beta2.Interface. +func (g *group) V2beta2() v2beta2.Interface { + return v2beta2.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD index 5c3ba46b..4a8e4d7f 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD +++ b/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD @@ -6,17 +6,18 @@ go_library( "horizontalpodautoscaler.go", "interface.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v1", importpath = "k8s.io/client-go/informers/autoscaling/v1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go index 71991b7f..205e4ecd 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - autoscaling_v1 "k8s.io/api/autoscaling/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewHorizontalPodAutoscalerInformer(client kubernetes.Interface, namespace s func NewFilteredHorizontalPodAutoscalerInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AutoscalingV1().HorizontalPodAutoscalers(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.AutoscalingV1().HorizontalPodAutoscalers(namespace).Watch(options) }, }, - &autoscaling_v1.HorizontalPodAutoscaler{}, + &autoscalingv1.HorizontalPodAutoscaler{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *horizontalPodAutoscalerInformer) defaultInformer(client kubernetes.Inte } func (f *horizontalPodAutoscalerInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&autoscaling_v1.HorizontalPodAutoscaler{}, f.defaultInformer) + return f.factory.InformerFor(&autoscalingv1.HorizontalPodAutoscaler{}, f.defaultInformer) } func (f *horizontalPodAutoscalerInformer) Lister() v1.HorizontalPodAutoscalerLister { diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD index 3439a4ed..57800041 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD @@ -6,17 +6,18 @@ go_library( "horizontalpodautoscaler.go", "interface.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v2beta1", importpath = "k8s.io/client-go/informers/autoscaling/v2beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go index 1546eb9b..4627c5a0 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go @@ -21,7 +21,7 @@ package v2beta1 import ( time "time" - autoscaling_v2beta1 "k8s.io/api/autoscaling/v2beta1" + autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredHorizontalPodAutoscalerInformer(client kubernetes.Interface, nam return client.AutoscalingV2beta1().HorizontalPodAutoscalers(namespace).Watch(options) }, }, - &autoscaling_v2beta1.HorizontalPodAutoscaler{}, + &autoscalingv2beta1.HorizontalPodAutoscaler{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *horizontalPodAutoscalerInformer) defaultInformer(client kubernetes.Inte } func (f *horizontalPodAutoscalerInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&autoscaling_v2beta1.HorizontalPodAutoscaler{}, f.defaultInformer) + return f.factory.InformerFor(&autoscalingv2beta1.HorizontalPodAutoscaler{}, f.defaultInformer) } func (f *horizontalPodAutoscalerInformer) Lister() v2beta1.HorizontalPodAutoscalerLister { diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD new file mode 100644 index 00000000..78bdf909 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/BUILD @@ -0,0 +1,36 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "horizontalpodautoscaler.go", + "interface.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v2beta2", + importpath = "k8s.io/client-go/informers/autoscaling/v2beta2", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/horizontalpodautoscaler.go new file mode 100644 index 00000000..b4863f9b --- /dev/null +++ b/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/horizontalpodautoscaler.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v2beta2 + +import ( + time "time" + + autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v2beta2 "k8s.io/client-go/listers/autoscaling/v2beta2" + cache "k8s.io/client-go/tools/cache" +) + +// HorizontalPodAutoscalerInformer provides access to a shared informer and lister for +// HorizontalPodAutoscalers. +type HorizontalPodAutoscalerInformer interface { + Informer() cache.SharedIndexInformer + Lister() v2beta2.HorizontalPodAutoscalerLister +} + +type horizontalPodAutoscalerInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewHorizontalPodAutoscalerInformer constructs a new informer for HorizontalPodAutoscaler type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewHorizontalPodAutoscalerInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredHorizontalPodAutoscalerInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredHorizontalPodAutoscalerInformer constructs a new informer for HorizontalPodAutoscaler type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredHorizontalPodAutoscalerInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AutoscalingV2beta2().HorizontalPodAutoscalers(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.AutoscalingV2beta2().HorizontalPodAutoscalers(namespace).Watch(options) + }, + }, + &autoscalingv2beta2.HorizontalPodAutoscaler{}, + resyncPeriod, + indexers, + ) +} + +func (f *horizontalPodAutoscalerInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredHorizontalPodAutoscalerInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *horizontalPodAutoscalerInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&autoscalingv2beta2.HorizontalPodAutoscaler{}, f.defaultInformer) +} + +func (f *horizontalPodAutoscalerInformer) Lister() v2beta2.HorizontalPodAutoscalerLister { + return v2beta2.NewHorizontalPodAutoscalerLister(f.Informer().GetIndexer()) +} diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/interface.go b/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/interface.go new file mode 100644 index 00000000..e482c579 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/autoscaling/v2beta2/interface.go @@ -0,0 +1,45 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v2beta2 + +import ( + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // HorizontalPodAutoscalers returns a HorizontalPodAutoscalerInformer. + HorizontalPodAutoscalers() HorizontalPodAutoscalerInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// HorizontalPodAutoscalers returns a HorizontalPodAutoscalerInformer. +func (v *version) HorizontalPodAutoscalers() HorizontalPodAutoscalerInformer { + return &horizontalPodAutoscalerInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/vendor/k8s.io/client-go/informers/batch/BUILD b/vendor/k8s.io/client-go/informers/batch/BUILD index 9199107c..3d461eca 100644 --- a/vendor/k8s.io/client-go/informers/batch/BUILD +++ b/vendor/k8s.io/client-go/informers/batch/BUILD @@ -8,12 +8,13 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch", importpath = "k8s.io/client-go/informers/batch", deps = [ - "//vendor/k8s.io/client-go/informers/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/batch/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/batch/v1/BUILD b/vendor/k8s.io/client-go/informers/batch/v1/BUILD index ed482548..64b28c54 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1/BUILD +++ b/vendor/k8s.io/client-go/informers/batch/v1/BUILD @@ -11,16 +11,17 @@ go_library( "interface.go", "job.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v1", importpath = "k8s.io/client-go/informers/batch/v1", deps = [ - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/batch/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/batch/v1/job.go b/vendor/k8s.io/client-go/informers/batch/v1/job.go index 6be8a025..30d41104 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1/job.go +++ b/vendor/k8s.io/client-go/informers/batch/v1/job.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - batch_v1 "k8s.io/api/batch/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + batchv1 "k8s.io/api/batch/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewJobInformer(client kubernetes.Interface, namespace string, resyncPeriod func NewFilteredJobInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.BatchV1().Jobs(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.BatchV1().Jobs(namespace).Watch(options) }, }, - &batch_v1.Job{}, + &batchv1.Job{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *jobInformer) defaultInformer(client kubernetes.Interface, resyncPeriod } func (f *jobInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&batch_v1.Job{}, f.defaultInformer) + return f.factory.InformerFor(&batchv1.Job{}, f.defaultInformer) } func (f *jobInformer) Lister() v1.JobLister { diff --git a/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD index 20f4ac3c..b7bde880 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD @@ -11,16 +11,17 @@ go_library( "cronjob.go", "interface.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v1beta1", importpath = "k8s.io/client-go/informers/batch/v1beta1", deps = [ - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go b/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go index 3ace6010..0b7598e0 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go +++ b/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - batch_v1beta1 "k8s.io/api/batch/v1beta1" + batchv1beta1 "k8s.io/api/batch/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredCronJobInformer(client kubernetes.Interface, namespace string, r return client.BatchV1beta1().CronJobs(namespace).Watch(options) }, }, - &batch_v1beta1.CronJob{}, + &batchv1beta1.CronJob{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *cronJobInformer) defaultInformer(client kubernetes.Interface, resyncPer } func (f *cronJobInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&batch_v1beta1.CronJob{}, f.defaultInformer) + return f.factory.InformerFor(&batchv1beta1.CronJob{}, f.defaultInformer) } func (f *cronJobInformer) Lister() v1beta1.CronJobLister { diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD index 4684ca4b..0ff45d9e 100644 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD +++ b/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD @@ -11,16 +11,17 @@ go_library( "cronjob.go", "interface.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v2alpha1", importpath = "k8s.io/client-go/informers/batch/v2alpha1", deps = [ - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go b/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go index 6608e461..20cf7d49 100644 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go +++ b/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go @@ -21,7 +21,7 @@ package v2alpha1 import ( time "time" - batch_v2alpha1 "k8s.io/api/batch/v2alpha1" + batchv2alpha1 "k8s.io/api/batch/v2alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredCronJobInformer(client kubernetes.Interface, namespace string, r return client.BatchV2alpha1().CronJobs(namespace).Watch(options) }, }, - &batch_v2alpha1.CronJob{}, + &batchv2alpha1.CronJob{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *cronJobInformer) defaultInformer(client kubernetes.Interface, resyncPer } func (f *cronJobInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&batch_v2alpha1.CronJob{}, f.defaultInformer) + return f.factory.InformerFor(&batchv2alpha1.CronJob{}, f.defaultInformer) } func (f *cronJobInformer) Lister() v2alpha1.CronJobLister { diff --git a/vendor/k8s.io/client-go/informers/certificates/BUILD b/vendor/k8s.io/client-go/informers/certificates/BUILD index bbe39da8..291f56a0 100644 --- a/vendor/k8s.io/client-go/informers/certificates/BUILD +++ b/vendor/k8s.io/client-go/informers/certificates/BUILD @@ -8,10 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/certificates", importpath = "k8s.io/client-go/informers/certificates", deps = [ - "//vendor/k8s.io/client-go/informers/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD index d8ada389..3f464ec0 100644 --- a/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD @@ -11,16 +11,17 @@ go_library( "certificatesigningrequest.go", "interface.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/certificates/v1beta1", importpath = "k8s.io/client-go/informers/certificates/v1beta1", deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go b/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go index b442ff78..6472d20e 100644 --- a/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - certificates_v1beta1 "k8s.io/api/certificates/v1beta1" + certificatesv1beta1 "k8s.io/api/certificates/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredCertificateSigningRequestInformer(client kubernetes.Interface, r return client.CertificatesV1beta1().CertificateSigningRequests().Watch(options) }, }, - &certificates_v1beta1.CertificateSigningRequest{}, + &certificatesv1beta1.CertificateSigningRequest{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *certificateSigningRequestInformer) defaultInformer(client kubernetes.In } func (f *certificateSigningRequestInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&certificates_v1beta1.CertificateSigningRequest{}, f.defaultInformer) + return f.factory.InformerFor(&certificatesv1beta1.CertificateSigningRequest{}, f.defaultInformer) } func (f *certificateSigningRequestInformer) Lister() v1beta1.CertificateSigningRequestLister { diff --git a/vendor/k8s.io/client-go/informers/coordination/BUILD b/vendor/k8s.io/client-go/informers/coordination/BUILD new file mode 100644 index 00000000..014cb3e0 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/coordination/BUILD @@ -0,0 +1,30 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/coordination", + importpath = "k8s.io/client-go/informers/coordination", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/client-go/informers/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/client-go/informers/coordination/v1beta1:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/client-go/informers/coordination/interface.go b/vendor/k8s.io/client-go/informers/coordination/interface.go new file mode 100644 index 00000000..8e541d80 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/coordination/interface.go @@ -0,0 +1,46 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package coordination + +import ( + v1beta1 "k8s.io/client-go/informers/coordination/v1beta1" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to each of this group's versions. +type Interface interface { + // V1beta1 provides access to shared informers for resources in V1beta1. + V1beta1() v1beta1.Interface +} + +type group struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// V1beta1 returns a new v1beta1.Interface. +func (g *group) V1beta1() v1beta1.Interface { + return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD new file mode 100644 index 00000000..22d27614 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/coordination/v1beta1/BUILD @@ -0,0 +1,36 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "interface.go", + "lease.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/coordination/v1beta1", + importpath = "k8s.io/client-go/informers/coordination/v1beta1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/client-go/informers/coordination/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/coordination/v1beta1/interface.go new file mode 100644 index 00000000..36026620 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/coordination/v1beta1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1beta1 + +import ( + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // Leases returns a LeaseInformer. + Leases() LeaseInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// Leases returns a LeaseInformer. +func (v *version) Leases() LeaseInformer { + return &leaseInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/vendor/k8s.io/client-go/informers/coordination/v1beta1/lease.go b/vendor/k8s.io/client-go/informers/coordination/v1beta1/lease.go new file mode 100644 index 00000000..bb59be13 --- /dev/null +++ b/vendor/k8s.io/client-go/informers/coordination/v1beta1/lease.go @@ -0,0 +1,89 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1beta1 + +import ( + time "time" + + coordinationv1beta1 "k8s.io/api/coordination/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1beta1 "k8s.io/client-go/listers/coordination/v1beta1" + cache "k8s.io/client-go/tools/cache" +) + +// LeaseInformer provides access to a shared informer and lister for +// Leases. +type LeaseInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1beta1.LeaseLister +} + +type leaseInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewLeaseInformer constructs a new informer for Lease type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewLeaseInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredLeaseInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredLeaseInformer constructs a new informer for Lease type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredLeaseInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.CoordinationV1beta1().Leases(namespace).List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.CoordinationV1beta1().Leases(namespace).Watch(options) + }, + }, + &coordinationv1beta1.Lease{}, + resyncPeriod, + indexers, + ) +} + +func (f *leaseInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredLeaseInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *leaseInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&coordinationv1beta1.Lease{}, f.defaultInformer) +} + +func (f *leaseInformer) Lister() v1beta1.LeaseLister { + return v1beta1.NewLeaseLister(f.Informer().GetIndexer()) +} diff --git a/vendor/k8s.io/client-go/informers/core/BUILD b/vendor/k8s.io/client-go/informers/core/BUILD index 69458990..d72514d9 100644 --- a/vendor/k8s.io/client-go/informers/core/BUILD +++ b/vendor/k8s.io/client-go/informers/core/BUILD @@ -8,10 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/core", importpath = "k8s.io/client-go/informers/core", deps = [ - "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/core/v1/BUILD b/vendor/k8s.io/client-go/informers/core/v1/BUILD index 1d459c5d..6fb6c75f 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/BUILD +++ b/vendor/k8s.io/client-go/informers/core/v1/BUILD @@ -26,16 +26,17 @@ go_library( "service.go", "serviceaccount.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/core/v1", importpath = "k8s.io/client-go/informers/core/v1", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go b/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go index cc60d480..a5ae6fc4 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go +++ b/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -56,20 +56,20 @@ func NewComponentStatusInformer(client kubernetes.Interface, resyncPeriod time.D func NewFilteredComponentStatusInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ComponentStatuses().List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ComponentStatuses().Watch(options) }, }, - &core_v1.ComponentStatus{}, + &corev1.ComponentStatus{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *componentStatusInformer) defaultInformer(client kubernetes.Interface, r } func (f *componentStatusInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.ComponentStatus{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.ComponentStatus{}, f.defaultInformer) } func (f *componentStatusInformer) Lister() v1.ComponentStatusLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/configmap.go b/vendor/k8s.io/client-go/informers/core/v1/configmap.go index ebd86c2d..48cb1a48 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/configmap.go +++ b/vendor/k8s.io/client-go/informers/core/v1/configmap.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewConfigMapInformer(client kubernetes.Interface, namespace string, resyncP func NewFilteredConfigMapInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ConfigMaps(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ConfigMaps(namespace).Watch(options) }, }, - &core_v1.ConfigMap{}, + &corev1.ConfigMap{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *configMapInformer) defaultInformer(client kubernetes.Interface, resyncP } func (f *configMapInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.ConfigMap{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.ConfigMap{}, f.defaultInformer) } func (f *configMapInformer) Lister() v1.ConfigMapLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/endpoints.go b/vendor/k8s.io/client-go/informers/core/v1/endpoints.go index b7362d08..77fa8cf8 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/endpoints.go +++ b/vendor/k8s.io/client-go/informers/core/v1/endpoints.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewEndpointsInformer(client kubernetes.Interface, namespace string, resyncP func NewFilteredEndpointsInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Endpoints(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Endpoints(namespace).Watch(options) }, }, - &core_v1.Endpoints{}, + &corev1.Endpoints{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *endpointsInformer) defaultInformer(client kubernetes.Interface, resyncP } func (f *endpointsInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.Endpoints{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.Endpoints{}, f.defaultInformer) } func (f *endpointsInformer) Lister() v1.EndpointsLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/event.go b/vendor/k8s.io/client-go/informers/core/v1/event.go index 905db2db..52f4911c 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/event.go +++ b/vendor/k8s.io/client-go/informers/core/v1/event.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewEventInformer(client kubernetes.Interface, namespace string, resyncPerio func NewFilteredEventInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Events(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Events(namespace).Watch(options) }, }, - &core_v1.Event{}, + &corev1.Event{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *eventInformer) defaultInformer(client kubernetes.Interface, resyncPerio } func (f *eventInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.Event{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.Event{}, f.defaultInformer) } func (f *eventInformer) Lister() v1.EventLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/limitrange.go b/vendor/k8s.io/client-go/informers/core/v1/limitrange.go index 39d0340d..7499e186 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/limitrange.go +++ b/vendor/k8s.io/client-go/informers/core/v1/limitrange.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewLimitRangeInformer(client kubernetes.Interface, namespace string, resync func NewFilteredLimitRangeInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().LimitRanges(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().LimitRanges(namespace).Watch(options) }, }, - &core_v1.LimitRange{}, + &corev1.LimitRange{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *limitRangeInformer) defaultInformer(client kubernetes.Interface, resync } func (f *limitRangeInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.LimitRange{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.LimitRange{}, f.defaultInformer) } func (f *limitRangeInformer) Lister() v1.LimitRangeLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/namespace.go b/vendor/k8s.io/client-go/informers/core/v1/namespace.go index 5830c88f..57a07335 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/namespace.go +++ b/vendor/k8s.io/client-go/informers/core/v1/namespace.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -56,20 +56,20 @@ func NewNamespaceInformer(client kubernetes.Interface, resyncPeriod time.Duratio func NewFilteredNamespaceInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Namespaces().List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Namespaces().Watch(options) }, }, - &core_v1.Namespace{}, + &corev1.Namespace{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *namespaceInformer) defaultInformer(client kubernetes.Interface, resyncP } func (f *namespaceInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.Namespace{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.Namespace{}, f.defaultInformer) } func (f *namespaceInformer) Lister() v1.NamespaceLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/node.go b/vendor/k8s.io/client-go/informers/core/v1/node.go index 202cb3b7..d9b85f83 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/node.go +++ b/vendor/k8s.io/client-go/informers/core/v1/node.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -56,20 +56,20 @@ func NewNodeInformer(client kubernetes.Interface, resyncPeriod time.Duration, in func NewFilteredNodeInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Nodes().List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Nodes().Watch(options) }, }, - &core_v1.Node{}, + &corev1.Node{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *nodeInformer) defaultInformer(client kubernetes.Interface, resyncPeriod } func (f *nodeInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.Node{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.Node{}, f.defaultInformer) } func (f *nodeInformer) Lister() v1.NodeLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go b/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go index 3f9af92a..a50bcfc6 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go +++ b/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -56,20 +56,20 @@ func NewPersistentVolumeInformer(client kubernetes.Interface, resyncPeriod time. func NewFilteredPersistentVolumeInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().PersistentVolumes().List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().PersistentVolumes().Watch(options) }, }, - &core_v1.PersistentVolume{}, + &corev1.PersistentVolume{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *persistentVolumeInformer) defaultInformer(client kubernetes.Interface, } func (f *persistentVolumeInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.PersistentVolume{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.PersistentVolume{}, f.defaultInformer) } func (f *persistentVolumeInformer) Lister() v1.PersistentVolumeLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go b/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go index b4946e84..3fb5e5f6 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewPersistentVolumeClaimInformer(client kubernetes.Interface, namespace str func NewFilteredPersistentVolumeClaimInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().PersistentVolumeClaims(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().PersistentVolumeClaims(namespace).Watch(options) }, }, - &core_v1.PersistentVolumeClaim{}, + &corev1.PersistentVolumeClaim{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *persistentVolumeClaimInformer) defaultInformer(client kubernetes.Interf } func (f *persistentVolumeClaimInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.PersistentVolumeClaim{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.PersistentVolumeClaim{}, f.defaultInformer) } func (f *persistentVolumeClaimInformer) Lister() v1.PersistentVolumeClaimLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/pod.go b/vendor/k8s.io/client-go/informers/core/v1/pod.go index e964d581..57aadd94 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/pod.go +++ b/vendor/k8s.io/client-go/informers/core/v1/pod.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewPodInformer(client kubernetes.Interface, namespace string, resyncPeriod func NewFilteredPodInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Pods(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Pods(namespace).Watch(options) }, }, - &core_v1.Pod{}, + &corev1.Pod{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *podInformer) defaultInformer(client kubernetes.Interface, resyncPeriod } func (f *podInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.Pod{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.Pod{}, f.defaultInformer) } func (f *podInformer) Lister() v1.PodLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go b/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go index 542fd032..ff47094f 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go +++ b/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewPodTemplateInformer(client kubernetes.Interface, namespace string, resyn func NewFilteredPodTemplateInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().PodTemplates(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().PodTemplates(namespace).Watch(options) }, }, - &core_v1.PodTemplate{}, + &corev1.PodTemplate{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *podTemplateInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *podTemplateInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.PodTemplate{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.PodTemplate{}, f.defaultInformer) } func (f *podTemplateInformer) Lister() v1.PodTemplateLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go b/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go index c5c009b0..903fe3fb 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go +++ b/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewReplicationControllerInformer(client kubernetes.Interface, namespace str func NewFilteredReplicationControllerInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ReplicationControllers(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ReplicationControllers(namespace).Watch(options) }, }, - &core_v1.ReplicationController{}, + &corev1.ReplicationController{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *replicationControllerInformer) defaultInformer(client kubernetes.Interf } func (f *replicationControllerInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.ReplicationController{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.ReplicationController{}, f.defaultInformer) } func (f *replicationControllerInformer) Lister() v1.ReplicationControllerLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go b/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go index 85ea9098..27ae53cc 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go +++ b/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewResourceQuotaInformer(client kubernetes.Interface, namespace string, res func NewFilteredResourceQuotaInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ResourceQuotas(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ResourceQuotas(namespace).Watch(options) }, }, - &core_v1.ResourceQuota{}, + &corev1.ResourceQuota{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *resourceQuotaInformer) defaultInformer(client kubernetes.Interface, res } func (f *resourceQuotaInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.ResourceQuota{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.ResourceQuota{}, f.defaultInformer) } func (f *resourceQuotaInformer) Lister() v1.ResourceQuotaLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/secret.go b/vendor/k8s.io/client-go/informers/core/v1/secret.go index 6c0c5a84..e13776b2 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/secret.go +++ b/vendor/k8s.io/client-go/informers/core/v1/secret.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewSecretInformer(client kubernetes.Interface, namespace string, resyncPeri func NewFilteredSecretInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Secrets(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Secrets(namespace).Watch(options) }, }, - &core_v1.Secret{}, + &corev1.Secret{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *secretInformer) defaultInformer(client kubernetes.Interface, resyncPeri } func (f *secretInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.Secret{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.Secret{}, f.defaultInformer) } func (f *secretInformer) Lister() v1.SecretLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/service.go b/vendor/k8s.io/client-go/informers/core/v1/service.go index c2bb8025..1c758668 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/service.go +++ b/vendor/k8s.io/client-go/informers/core/v1/service.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewServiceInformer(client kubernetes.Interface, namespace string, resyncPer func NewFilteredServiceInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Services(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().Services(namespace).Watch(options) }, }, - &core_v1.Service{}, + &corev1.Service{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *serviceInformer) defaultInformer(client kubernetes.Interface, resyncPer } func (f *serviceInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.Service{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.Service{}, f.defaultInformer) } func (f *serviceInformer) Lister() v1.ServiceLister { diff --git a/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go b/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go index 2d0b94a6..c701b8f1 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go +++ b/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - core_v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewServiceAccountInformer(client kubernetes.Interface, namespace string, re func NewFilteredServiceAccountInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ServiceAccounts(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.CoreV1().ServiceAccounts(namespace).Watch(options) }, }, - &core_v1.ServiceAccount{}, + &corev1.ServiceAccount{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *serviceAccountInformer) defaultInformer(client kubernetes.Interface, re } func (f *serviceAccountInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&core_v1.ServiceAccount{}, f.defaultInformer) + return f.factory.InformerFor(&corev1.ServiceAccount{}, f.defaultInformer) } func (f *serviceAccountInformer) Lister() v1.ServiceAccountLister { diff --git a/vendor/k8s.io/client-go/informers/events/BUILD b/vendor/k8s.io/client-go/informers/events/BUILD index cf87d7c5..54d4d141 100644 --- a/vendor/k8s.io/client-go/informers/events/BUILD +++ b/vendor/k8s.io/client-go/informers/events/BUILD @@ -3,11 +3,12 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events", importpath = "k8s.io/client-go/informers/events", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/client-go/informers/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/events/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD index 7f398d3e..0bf60bd7 100644 --- a/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD @@ -6,17 +6,18 @@ go_library( "event.go", "interface.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events/v1beta1", importpath = "k8s.io/client-go/informers/events/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/events/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/events/v1beta1/event.go b/vendor/k8s.io/client-go/informers/events/v1beta1/event.go index cb757c5b..0ac6fa28 100644 --- a/vendor/k8s.io/client-go/informers/events/v1beta1/event.go +++ b/vendor/k8s.io/client-go/informers/events/v1beta1/event.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - events_v1beta1 "k8s.io/api/events/v1beta1" + eventsv1beta1 "k8s.io/api/events/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredEventInformer(client kubernetes.Interface, namespace string, res return client.EventsV1beta1().Events(namespace).Watch(options) }, }, - &events_v1beta1.Event{}, + &eventsv1beta1.Event{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *eventInformer) defaultInformer(client kubernetes.Interface, resyncPerio } func (f *eventInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&events_v1beta1.Event{}, f.defaultInformer) + return f.factory.InformerFor(&eventsv1beta1.Event{}, f.defaultInformer) } func (f *eventInformer) Lister() v1beta1.EventLister { diff --git a/vendor/k8s.io/client-go/informers/extensions/BUILD b/vendor/k8s.io/client-go/informers/extensions/BUILD index 070358e2..d75a2ae9 100644 --- a/vendor/k8s.io/client-go/informers/extensions/BUILD +++ b/vendor/k8s.io/client-go/informers/extensions/BUILD @@ -8,10 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/extensions", importpath = "k8s.io/client-go/informers/extensions", deps = [ - "//vendor/k8s.io/client-go/informers/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD index 7f11d7bd..ac71d055 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD @@ -15,16 +15,17 @@ go_library( "podsecuritypolicy.go", "replicaset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/extensions/v1beta1", importpath = "k8s.io/client-go/informers/extensions/v1beta1", deps = [ - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go index 3064384b..80e84eba 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - extensions_v1beta1 "k8s.io/api/extensions/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredDaemonSetInformer(client kubernetes.Interface, namespace string, return client.ExtensionsV1beta1().DaemonSets(namespace).Watch(options) }, }, - &extensions_v1beta1.DaemonSet{}, + &extensionsv1beta1.DaemonSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *daemonSetInformer) defaultInformer(client kubernetes.Interface, resyncP } func (f *daemonSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&extensions_v1beta1.DaemonSet{}, f.defaultInformer) + return f.factory.InformerFor(&extensionsv1beta1.DaemonSet{}, f.defaultInformer) } func (f *daemonSetInformer) Lister() v1beta1.DaemonSetLister { diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go index a6b8b68e..cef4b815 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - extensions_v1beta1 "k8s.io/api/extensions/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredDeploymentInformer(client kubernetes.Interface, namespace string return client.ExtensionsV1beta1().Deployments(namespace).Watch(options) }, }, - &extensions_v1beta1.Deployment{}, + &extensionsv1beta1.Deployment{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *deploymentInformer) defaultInformer(client kubernetes.Interface, resync } func (f *deploymentInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&extensions_v1beta1.Deployment{}, f.defaultInformer) + return f.factory.InformerFor(&extensionsv1beta1.Deployment{}, f.defaultInformer) } func (f *deploymentInformer) Lister() v1beta1.DeploymentLister { diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go index ec8147c1..72a88f31 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - extensions_v1beta1 "k8s.io/api/extensions/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredIngressInformer(client kubernetes.Interface, namespace string, r return client.ExtensionsV1beta1().Ingresses(namespace).Watch(options) }, }, - &extensions_v1beta1.Ingress{}, + &extensionsv1beta1.Ingress{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *ingressInformer) defaultInformer(client kubernetes.Interface, resyncPer } func (f *ingressInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&extensions_v1beta1.Ingress{}, f.defaultInformer) + return f.factory.InformerFor(&extensionsv1beta1.Ingress{}, f.defaultInformer) } func (f *ingressInformer) Lister() v1beta1.IngressLister { diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go index 15414d8e..6f91e545 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - extensions_v1beta1 "k8s.io/api/extensions/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredPodSecurityPolicyInformer(client kubernetes.Interface, resyncPer return client.ExtensionsV1beta1().PodSecurityPolicies().Watch(options) }, }, - &extensions_v1beta1.PodSecurityPolicy{}, + &extensionsv1beta1.PodSecurityPolicy{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *podSecurityPolicyInformer) defaultInformer(client kubernetes.Interface, } func (f *podSecurityPolicyInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&extensions_v1beta1.PodSecurityPolicy{}, f.defaultInformer) + return f.factory.InformerFor(&extensionsv1beta1.PodSecurityPolicy{}, f.defaultInformer) } func (f *podSecurityPolicyInformer) Lister() v1beta1.PodSecurityPolicyLister { diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go index a63d769e..e8847aa2 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - extensions_v1beta1 "k8s.io/api/extensions/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredReplicaSetInformer(client kubernetes.Interface, namespace string return client.ExtensionsV1beta1().ReplicaSets(namespace).Watch(options) }, }, - &extensions_v1beta1.ReplicaSet{}, + &extensionsv1beta1.ReplicaSet{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *replicaSetInformer) defaultInformer(client kubernetes.Interface, resync } func (f *replicaSetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&extensions_v1beta1.ReplicaSet{}, f.defaultInformer) + return f.factory.InformerFor(&extensionsv1beta1.ReplicaSet{}, f.defaultInformer) } func (f *replicaSetInformer) Lister() v1beta1.ReplicaSetLister { diff --git a/vendor/k8s.io/client-go/informers/factory.go b/vendor/k8s.io/client-go/informers/factory.go index 902195d6..7ae22ee2 100644 --- a/vendor/k8s.io/client-go/informers/factory.go +++ b/vendor/k8s.io/client-go/informers/factory.go @@ -31,6 +31,7 @@ import ( autoscaling "k8s.io/client-go/informers/autoscaling" batch "k8s.io/client-go/informers/batch" certificates "k8s.io/client-go/informers/certificates" + coordination "k8s.io/client-go/informers/coordination" core "k8s.io/client-go/informers/core" events "k8s.io/client-go/informers/events" extensions "k8s.io/client-go/informers/extensions" @@ -190,6 +191,7 @@ type SharedInformerFactory interface { Autoscaling() autoscaling.Interface Batch() batch.Interface Certificates() certificates.Interface + Coordination() coordination.Interface Core() core.Interface Events() events.Interface Extensions() extensions.Interface @@ -221,6 +223,10 @@ func (f *sharedInformerFactory) Certificates() certificates.Interface { return certificates.New(f, f.namespace, f.tweakListOptions) } +func (f *sharedInformerFactory) Coordination() coordination.Interface { + return coordination.New(f, f.namespace, f.tweakListOptions) +} + func (f *sharedInformerFactory) Core() core.Interface { return core.New(f, f.namespace, f.tweakListOptions) } diff --git a/vendor/k8s.io/client-go/informers/generic.go b/vendor/k8s.io/client-go/informers/generic.go index 08c43906..3af96304 100644 --- a/vendor/k8s.io/client-go/informers/generic.go +++ b/vendor/k8s.io/client-go/informers/generic.go @@ -24,28 +24,30 @@ import ( v1alpha1 "k8s.io/api/admissionregistration/v1alpha1" v1beta1 "k8s.io/api/admissionregistration/v1beta1" v1 "k8s.io/api/apps/v1" - apps_v1beta1 "k8s.io/api/apps/v1beta1" + appsv1beta1 "k8s.io/api/apps/v1beta1" v1beta2 "k8s.io/api/apps/v1beta2" - autoscaling_v1 "k8s.io/api/autoscaling/v1" + autoscalingv1 "k8s.io/api/autoscaling/v1" v2beta1 "k8s.io/api/autoscaling/v2beta1" - batch_v1 "k8s.io/api/batch/v1" - batch_v1beta1 "k8s.io/api/batch/v1beta1" + v2beta2 "k8s.io/api/autoscaling/v2beta2" + batchv1 "k8s.io/api/batch/v1" + batchv1beta1 "k8s.io/api/batch/v1beta1" v2alpha1 "k8s.io/api/batch/v2alpha1" - certificates_v1beta1 "k8s.io/api/certificates/v1beta1" - core_v1 "k8s.io/api/core/v1" - events_v1beta1 "k8s.io/api/events/v1beta1" - extensions_v1beta1 "k8s.io/api/extensions/v1beta1" - networking_v1 "k8s.io/api/networking/v1" - policy_v1beta1 "k8s.io/api/policy/v1beta1" - rbac_v1 "k8s.io/api/rbac/v1" - rbac_v1alpha1 "k8s.io/api/rbac/v1alpha1" - rbac_v1beta1 "k8s.io/api/rbac/v1beta1" - scheduling_v1alpha1 "k8s.io/api/scheduling/v1alpha1" - scheduling_v1beta1 "k8s.io/api/scheduling/v1beta1" - settings_v1alpha1 "k8s.io/api/settings/v1alpha1" - storage_v1 "k8s.io/api/storage/v1" - storage_v1alpha1 "k8s.io/api/storage/v1alpha1" - storage_v1beta1 "k8s.io/api/storage/v1beta1" + certificatesv1beta1 "k8s.io/api/certificates/v1beta1" + coordinationv1beta1 "k8s.io/api/coordination/v1beta1" + corev1 "k8s.io/api/core/v1" + eventsv1beta1 "k8s.io/api/events/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + networkingv1 "k8s.io/api/networking/v1" + policyv1beta1 "k8s.io/api/policy/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" + settingsv1alpha1 "k8s.io/api/settings/v1alpha1" + storagev1 "k8s.io/api/storage/v1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" + storagev1beta1 "k8s.io/api/storage/v1beta1" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" ) @@ -99,11 +101,11 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Apps().V1().StatefulSets().Informer()}, nil // Group=apps, Version=v1beta1 - case apps_v1beta1.SchemeGroupVersion.WithResource("controllerrevisions"): + case appsv1beta1.SchemeGroupVersion.WithResource("controllerrevisions"): return &genericInformer{resource: resource.GroupResource(), informer: f.Apps().V1beta1().ControllerRevisions().Informer()}, nil - case apps_v1beta1.SchemeGroupVersion.WithResource("deployments"): + case appsv1beta1.SchemeGroupVersion.WithResource("deployments"): return &genericInformer{resource: resource.GroupResource(), informer: f.Apps().V1beta1().Deployments().Informer()}, nil - case apps_v1beta1.SchemeGroupVersion.WithResource("statefulsets"): + case appsv1beta1.SchemeGroupVersion.WithResource("statefulsets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Apps().V1beta1().StatefulSets().Informer()}, nil // Group=apps, Version=v1beta2 @@ -119,19 +121,23 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Apps().V1beta2().StatefulSets().Informer()}, nil // Group=autoscaling, Version=v1 - case autoscaling_v1.SchemeGroupVersion.WithResource("horizontalpodautoscalers"): + case autoscalingv1.SchemeGroupVersion.WithResource("horizontalpodautoscalers"): return &genericInformer{resource: resource.GroupResource(), informer: f.Autoscaling().V1().HorizontalPodAutoscalers().Informer()}, nil // Group=autoscaling, Version=v2beta1 case v2beta1.SchemeGroupVersion.WithResource("horizontalpodautoscalers"): return &genericInformer{resource: resource.GroupResource(), informer: f.Autoscaling().V2beta1().HorizontalPodAutoscalers().Informer()}, nil + // Group=autoscaling, Version=v2beta2 + case v2beta2.SchemeGroupVersion.WithResource("horizontalpodautoscalers"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Autoscaling().V2beta2().HorizontalPodAutoscalers().Informer()}, nil + // Group=batch, Version=v1 - case batch_v1.SchemeGroupVersion.WithResource("jobs"): + case batchv1.SchemeGroupVersion.WithResource("jobs"): return &genericInformer{resource: resource.GroupResource(), informer: f.Batch().V1().Jobs().Informer()}, nil // Group=batch, Version=v1beta1 - case batch_v1beta1.SchemeGroupVersion.WithResource("cronjobs"): + case batchv1beta1.SchemeGroupVersion.WithResource("cronjobs"): return &genericInformer{resource: resource.GroupResource(), informer: f.Batch().V1beta1().CronJobs().Informer()}, nil // Group=batch, Version=v2alpha1 @@ -139,123 +145,127 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Batch().V2alpha1().CronJobs().Informer()}, nil // Group=certificates.k8s.io, Version=v1beta1 - case certificates_v1beta1.SchemeGroupVersion.WithResource("certificatesigningrequests"): + case certificatesv1beta1.SchemeGroupVersion.WithResource("certificatesigningrequests"): return &genericInformer{resource: resource.GroupResource(), informer: f.Certificates().V1beta1().CertificateSigningRequests().Informer()}, nil + // Group=coordination.k8s.io, Version=v1beta1 + case coordinationv1beta1.SchemeGroupVersion.WithResource("leases"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Coordination().V1beta1().Leases().Informer()}, nil + // Group=core, Version=v1 - case core_v1.SchemeGroupVersion.WithResource("componentstatuses"): + case corev1.SchemeGroupVersion.WithResource("componentstatuses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().ComponentStatuses().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("configmaps"): + case corev1.SchemeGroupVersion.WithResource("configmaps"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().ConfigMaps().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("endpoints"): + case corev1.SchemeGroupVersion.WithResource("endpoints"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().Endpoints().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("events"): + case corev1.SchemeGroupVersion.WithResource("events"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().Events().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("limitranges"): + case corev1.SchemeGroupVersion.WithResource("limitranges"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().LimitRanges().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("namespaces"): + case corev1.SchemeGroupVersion.WithResource("namespaces"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().Namespaces().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("nodes"): + case corev1.SchemeGroupVersion.WithResource("nodes"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().Nodes().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("persistentvolumes"): + case corev1.SchemeGroupVersion.WithResource("persistentvolumes"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().PersistentVolumes().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("persistentvolumeclaims"): + case corev1.SchemeGroupVersion.WithResource("persistentvolumeclaims"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().PersistentVolumeClaims().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("pods"): + case corev1.SchemeGroupVersion.WithResource("pods"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().Pods().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("podtemplates"): + case corev1.SchemeGroupVersion.WithResource("podtemplates"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().PodTemplates().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("replicationcontrollers"): + case corev1.SchemeGroupVersion.WithResource("replicationcontrollers"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().ReplicationControllers().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("resourcequotas"): + case corev1.SchemeGroupVersion.WithResource("resourcequotas"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().ResourceQuotas().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("secrets"): + case corev1.SchemeGroupVersion.WithResource("secrets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().Secrets().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("services"): + case corev1.SchemeGroupVersion.WithResource("services"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().Services().Informer()}, nil - case core_v1.SchemeGroupVersion.WithResource("serviceaccounts"): + case corev1.SchemeGroupVersion.WithResource("serviceaccounts"): return &genericInformer{resource: resource.GroupResource(), informer: f.Core().V1().ServiceAccounts().Informer()}, nil // Group=events.k8s.io, Version=v1beta1 - case events_v1beta1.SchemeGroupVersion.WithResource("events"): + case eventsv1beta1.SchemeGroupVersion.WithResource("events"): return &genericInformer{resource: resource.GroupResource(), informer: f.Events().V1beta1().Events().Informer()}, nil // Group=extensions, Version=v1beta1 - case extensions_v1beta1.SchemeGroupVersion.WithResource("daemonsets"): + case extensionsv1beta1.SchemeGroupVersion.WithResource("daemonsets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Extensions().V1beta1().DaemonSets().Informer()}, nil - case extensions_v1beta1.SchemeGroupVersion.WithResource("deployments"): + case extensionsv1beta1.SchemeGroupVersion.WithResource("deployments"): return &genericInformer{resource: resource.GroupResource(), informer: f.Extensions().V1beta1().Deployments().Informer()}, nil - case extensions_v1beta1.SchemeGroupVersion.WithResource("ingresses"): + case extensionsv1beta1.SchemeGroupVersion.WithResource("ingresses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Extensions().V1beta1().Ingresses().Informer()}, nil - case extensions_v1beta1.SchemeGroupVersion.WithResource("podsecuritypolicies"): + case extensionsv1beta1.SchemeGroupVersion.WithResource("podsecuritypolicies"): return &genericInformer{resource: resource.GroupResource(), informer: f.Extensions().V1beta1().PodSecurityPolicies().Informer()}, nil - case extensions_v1beta1.SchemeGroupVersion.WithResource("replicasets"): + case extensionsv1beta1.SchemeGroupVersion.WithResource("replicasets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Extensions().V1beta1().ReplicaSets().Informer()}, nil // Group=networking.k8s.io, Version=v1 - case networking_v1.SchemeGroupVersion.WithResource("networkpolicies"): + case networkingv1.SchemeGroupVersion.WithResource("networkpolicies"): return &genericInformer{resource: resource.GroupResource(), informer: f.Networking().V1().NetworkPolicies().Informer()}, nil // Group=policy, Version=v1beta1 - case policy_v1beta1.SchemeGroupVersion.WithResource("poddisruptionbudgets"): + case policyv1beta1.SchemeGroupVersion.WithResource("poddisruptionbudgets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Policy().V1beta1().PodDisruptionBudgets().Informer()}, nil - case policy_v1beta1.SchemeGroupVersion.WithResource("podsecuritypolicies"): + case policyv1beta1.SchemeGroupVersion.WithResource("podsecuritypolicies"): return &genericInformer{resource: resource.GroupResource(), informer: f.Policy().V1beta1().PodSecurityPolicies().Informer()}, nil // Group=rbac.authorization.k8s.io, Version=v1 - case rbac_v1.SchemeGroupVersion.WithResource("clusterroles"): + case rbacv1.SchemeGroupVersion.WithResource("clusterroles"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().ClusterRoles().Informer()}, nil - case rbac_v1.SchemeGroupVersion.WithResource("clusterrolebindings"): + case rbacv1.SchemeGroupVersion.WithResource("clusterrolebindings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().ClusterRoleBindings().Informer()}, nil - case rbac_v1.SchemeGroupVersion.WithResource("roles"): + case rbacv1.SchemeGroupVersion.WithResource("roles"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().Roles().Informer()}, nil - case rbac_v1.SchemeGroupVersion.WithResource("rolebindings"): + case rbacv1.SchemeGroupVersion.WithResource("rolebindings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1().RoleBindings().Informer()}, nil // Group=rbac.authorization.k8s.io, Version=v1alpha1 - case rbac_v1alpha1.SchemeGroupVersion.WithResource("clusterroles"): + case rbacv1alpha1.SchemeGroupVersion.WithResource("clusterroles"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1alpha1().ClusterRoles().Informer()}, nil - case rbac_v1alpha1.SchemeGroupVersion.WithResource("clusterrolebindings"): + case rbacv1alpha1.SchemeGroupVersion.WithResource("clusterrolebindings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1alpha1().ClusterRoleBindings().Informer()}, nil - case rbac_v1alpha1.SchemeGroupVersion.WithResource("roles"): + case rbacv1alpha1.SchemeGroupVersion.WithResource("roles"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1alpha1().Roles().Informer()}, nil - case rbac_v1alpha1.SchemeGroupVersion.WithResource("rolebindings"): + case rbacv1alpha1.SchemeGroupVersion.WithResource("rolebindings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1alpha1().RoleBindings().Informer()}, nil // Group=rbac.authorization.k8s.io, Version=v1beta1 - case rbac_v1beta1.SchemeGroupVersion.WithResource("clusterroles"): + case rbacv1beta1.SchemeGroupVersion.WithResource("clusterroles"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1beta1().ClusterRoles().Informer()}, nil - case rbac_v1beta1.SchemeGroupVersion.WithResource("clusterrolebindings"): + case rbacv1beta1.SchemeGroupVersion.WithResource("clusterrolebindings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1beta1().ClusterRoleBindings().Informer()}, nil - case rbac_v1beta1.SchemeGroupVersion.WithResource("roles"): + case rbacv1beta1.SchemeGroupVersion.WithResource("roles"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1beta1().Roles().Informer()}, nil - case rbac_v1beta1.SchemeGroupVersion.WithResource("rolebindings"): + case rbacv1beta1.SchemeGroupVersion.WithResource("rolebindings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Rbac().V1beta1().RoleBindings().Informer()}, nil // Group=scheduling.k8s.io, Version=v1alpha1 - case scheduling_v1alpha1.SchemeGroupVersion.WithResource("priorityclasses"): + case schedulingv1alpha1.SchemeGroupVersion.WithResource("priorityclasses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Scheduling().V1alpha1().PriorityClasses().Informer()}, nil // Group=scheduling.k8s.io, Version=v1beta1 - case scheduling_v1beta1.SchemeGroupVersion.WithResource("priorityclasses"): + case schedulingv1beta1.SchemeGroupVersion.WithResource("priorityclasses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Scheduling().V1beta1().PriorityClasses().Informer()}, nil // Group=settings.k8s.io, Version=v1alpha1 - case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"): + case settingsv1alpha1.SchemeGroupVersion.WithResource("podpresets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Settings().V1alpha1().PodPresets().Informer()}, nil // Group=storage.k8s.io, Version=v1 - case storage_v1.SchemeGroupVersion.WithResource("storageclasses"): + case storagev1.SchemeGroupVersion.WithResource("storageclasses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1().StorageClasses().Informer()}, nil // Group=storage.k8s.io, Version=v1alpha1 - case storage_v1alpha1.SchemeGroupVersion.WithResource("volumeattachments"): + case storagev1alpha1.SchemeGroupVersion.WithResource("volumeattachments"): return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1alpha1().VolumeAttachments().Informer()}, nil // Group=storage.k8s.io, Version=v1beta1 - case storage_v1beta1.SchemeGroupVersion.WithResource("storageclasses"): + case storagev1beta1.SchemeGroupVersion.WithResource("storageclasses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().StorageClasses().Informer()}, nil - case storage_v1beta1.SchemeGroupVersion.WithResource("volumeattachments"): + case storagev1beta1.SchemeGroupVersion.WithResource("volumeattachments"): return &genericInformer{resource: resource.GroupResource(), informer: f.Storage().V1beta1().VolumeAttachments().Informer()}, nil } diff --git a/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD b/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD index 5b20c78f..fb724889 100644 --- a/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD +++ b/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD @@ -8,12 +8,13 @@ load( go_library( name = "go_default_library", srcs = ["factory_interfaces.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/internalinterfaces", importpath = "k8s.io/client-go/informers/internalinterfaces", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/networking/BUILD b/vendor/k8s.io/client-go/informers/networking/BUILD index 3219e7d0..719db0c0 100644 --- a/vendor/k8s.io/client-go/informers/networking/BUILD +++ b/vendor/k8s.io/client-go/informers/networking/BUILD @@ -8,10 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/networking", importpath = "k8s.io/client-go/informers/networking", deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/networking/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/networking/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/networking/v1/BUILD b/vendor/k8s.io/client-go/informers/networking/v1/BUILD index dc6f3269..ee914bb5 100644 --- a/vendor/k8s.io/client-go/informers/networking/v1/BUILD +++ b/vendor/k8s.io/client-go/informers/networking/v1/BUILD @@ -11,16 +11,17 @@ go_library( "interface.go", "networkpolicy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/networking/v1", importpath = "k8s.io/client-go/informers/networking/v1", deps = [ - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/networking/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/networking/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/networking/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go b/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go index 51e0bdf1..c2255c0d 100644 --- a/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go +++ b/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - networking_v1 "k8s.io/api/networking/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + networkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewNetworkPolicyInformer(client kubernetes.Interface, namespace string, res func NewFilteredNetworkPolicyInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.NetworkingV1().NetworkPolicies(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.NetworkingV1().NetworkPolicies(namespace).Watch(options) }, }, - &networking_v1.NetworkPolicy{}, + &networkingv1.NetworkPolicy{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *networkPolicyInformer) defaultInformer(client kubernetes.Interface, res } func (f *networkPolicyInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&networking_v1.NetworkPolicy{}, f.defaultInformer) + return f.factory.InformerFor(&networkingv1.NetworkPolicy{}, f.defaultInformer) } func (f *networkPolicyInformer) Lister() v1.NetworkPolicyLister { diff --git a/vendor/k8s.io/client-go/informers/policy/BUILD b/vendor/k8s.io/client-go/informers/policy/BUILD index 882d54d5..0e7dbd04 100644 --- a/vendor/k8s.io/client-go/informers/policy/BUILD +++ b/vendor/k8s.io/client-go/informers/policy/BUILD @@ -8,10 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/policy", importpath = "k8s.io/client-go/informers/policy", deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/policy/v1beta1:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD index 547a0a39..8ebf954c 100644 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD @@ -12,16 +12,17 @@ go_library( "poddisruptionbudget.go", "podsecuritypolicy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/policy/v1beta1", importpath = "k8s.io/client-go/informers/policy/v1beta1", deps = [ - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/policy/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go b/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go index d305e617..dce61f7f 100644 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go +++ b/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - policy_v1beta1 "k8s.io/api/policy/v1beta1" + policyv1beta1 "k8s.io/api/policy/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredPodDisruptionBudgetInformer(client kubernetes.Interface, namespa return client.PolicyV1beta1().PodDisruptionBudgets(namespace).Watch(options) }, }, - &policy_v1beta1.PodDisruptionBudget{}, + &policyv1beta1.PodDisruptionBudget{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *podDisruptionBudgetInformer) defaultInformer(client kubernetes.Interfac } func (f *podDisruptionBudgetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&policy_v1beta1.PodDisruptionBudget{}, f.defaultInformer) + return f.factory.InformerFor(&policyv1beta1.PodDisruptionBudget{}, f.defaultInformer) } func (f *podDisruptionBudgetInformer) Lister() v1beta1.PodDisruptionBudgetLister { diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go index 12a16acd..7ce5684f 100644 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - policy_v1beta1 "k8s.io/api/policy/v1beta1" + policyv1beta1 "k8s.io/api/policy/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredPodSecurityPolicyInformer(client kubernetes.Interface, resyncPer return client.PolicyV1beta1().PodSecurityPolicies().Watch(options) }, }, - &policy_v1beta1.PodSecurityPolicy{}, + &policyv1beta1.PodSecurityPolicy{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *podSecurityPolicyInformer) defaultInformer(client kubernetes.Interface, } func (f *podSecurityPolicyInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&policy_v1beta1.PodSecurityPolicy{}, f.defaultInformer) + return f.factory.InformerFor(&policyv1beta1.PodSecurityPolicy{}, f.defaultInformer) } func (f *podSecurityPolicyInformer) Lister() v1beta1.PodSecurityPolicyLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/BUILD b/vendor/k8s.io/client-go/informers/rbac/BUILD index e2afef93..a1f4c26d 100644 --- a/vendor/k8s.io/client-go/informers/rbac/BUILD +++ b/vendor/k8s.io/client-go/informers/rbac/BUILD @@ -8,12 +8,13 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac", importpath = "k8s.io/client-go/informers/rbac", deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/rbac/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/informers/rbac/v1beta1:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1/BUILD index 4278890e..a40e459b 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/BUILD +++ b/vendor/k8s.io/client-go/informers/rbac/v1/BUILD @@ -14,16 +14,17 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1", importpath = "k8s.io/client-go/informers/rbac/v1", deps = [ - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/rbac/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go index d5e10cad..b8096e6b 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - rbac_v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -56,20 +56,20 @@ func NewClusterRoleInformer(client kubernetes.Interface, resyncPeriod time.Durat func NewFilteredClusterRoleInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().ClusterRoles().List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().ClusterRoles().Watch(options) }, }, - &rbac_v1.ClusterRole{}, + &rbacv1.ClusterRole{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *clusterRoleInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *clusterRoleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1.ClusterRole{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1.ClusterRole{}, f.defaultInformer) } func (f *clusterRoleInformer) Lister() v1.ClusterRoleLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go index 027d11b6..5ef3407c 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - rbac_v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -56,20 +56,20 @@ func NewClusterRoleBindingInformer(client kubernetes.Interface, resyncPeriod tim func NewFilteredClusterRoleBindingInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().ClusterRoleBindings().List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().ClusterRoleBindings().Watch(options) }, }, - &rbac_v1.ClusterRoleBinding{}, + &rbacv1.ClusterRoleBinding{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *clusterRoleBindingInformer) defaultInformer(client kubernetes.Interface } func (f *clusterRoleBindingInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1.ClusterRoleBinding{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1.ClusterRoleBinding{}, f.defaultInformer) } func (f *clusterRoleBindingInformer) Lister() v1.ClusterRoleBindingLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/role.go b/vendor/k8s.io/client-go/informers/rbac/v1/role.go index 9c9f4f84..2d98874e 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/role.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/role.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - rbac_v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewRoleInformer(client kubernetes.Interface, namespace string, resyncPeriod func NewFilteredRoleInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().Roles(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().Roles(namespace).Watch(options) }, }, - &rbac_v1.Role{}, + &rbacv1.Role{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *roleInformer) defaultInformer(client kubernetes.Interface, resyncPeriod } func (f *roleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1.Role{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1.Role{}, f.defaultInformer) } func (f *roleInformer) Lister() v1.RoleLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go index 73cd3056..a97107de 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - rbac_v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + rbacv1 "k8s.io/api/rbac/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -57,20 +57,20 @@ func NewRoleBindingInformer(client kubernetes.Interface, namespace string, resyn func NewFilteredRoleBindingInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().RoleBindings(namespace).List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.RbacV1().RoleBindings(namespace).Watch(options) }, }, - &rbac_v1.RoleBinding{}, + &rbacv1.RoleBinding{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *roleBindingInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *roleBindingInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1.RoleBinding{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1.RoleBinding{}, f.defaultInformer) } func (f *roleBindingInformer) Lister() v1.RoleBindingLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD index 345e10c6..85f76b47 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD @@ -14,16 +14,17 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1alpha1", importpath = "k8s.io/client-go/informers/rbac/v1alpha1", deps = [ - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go index 76aa466c..58c9c412 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - rbac_v1alpha1 "k8s.io/api/rbac/v1alpha1" + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredClusterRoleInformer(client kubernetes.Interface, resyncPeriod ti return client.RbacV1alpha1().ClusterRoles().Watch(options) }, }, - &rbac_v1alpha1.ClusterRole{}, + &rbacv1alpha1.ClusterRole{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *clusterRoleInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *clusterRoleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1alpha1.ClusterRole{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1alpha1.ClusterRole{}, f.defaultInformer) } func (f *clusterRoleInformer) Lister() v1alpha1.ClusterRoleLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go index 851eb39d..759c716b 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - rbac_v1alpha1 "k8s.io/api/rbac/v1alpha1" + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredClusterRoleBindingInformer(client kubernetes.Interface, resyncPe return client.RbacV1alpha1().ClusterRoleBindings().Watch(options) }, }, - &rbac_v1alpha1.ClusterRoleBinding{}, + &rbacv1alpha1.ClusterRoleBinding{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *clusterRoleBindingInformer) defaultInformer(client kubernetes.Interface } func (f *clusterRoleBindingInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1alpha1.ClusterRoleBinding{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1alpha1.ClusterRoleBinding{}, f.defaultInformer) } func (f *clusterRoleBindingInformer) Lister() v1alpha1.ClusterRoleBindingLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go index be847445..1d1f99f0 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - rbac_v1alpha1 "k8s.io/api/rbac/v1alpha1" + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredRoleInformer(client kubernetes.Interface, namespace string, resy return client.RbacV1alpha1().Roles(namespace).Watch(options) }, }, - &rbac_v1alpha1.Role{}, + &rbacv1alpha1.Role{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *roleInformer) defaultInformer(client kubernetes.Interface, resyncPeriod } func (f *roleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1alpha1.Role{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1alpha1.Role{}, f.defaultInformer) } func (f *roleInformer) Lister() v1alpha1.RoleLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go index 20e7159e..9fcb01d3 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - rbac_v1alpha1 "k8s.io/api/rbac/v1alpha1" + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredRoleBindingInformer(client kubernetes.Interface, namespace strin return client.RbacV1alpha1().RoleBindings(namespace).Watch(options) }, }, - &rbac_v1alpha1.RoleBinding{}, + &rbacv1alpha1.RoleBinding{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *roleBindingInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *roleBindingInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1alpha1.RoleBinding{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1alpha1.RoleBinding{}, f.defaultInformer) } func (f *roleBindingInformer) Lister() v1alpha1.RoleBindingLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD index 0ed73f4e..c1c47efb 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD @@ -14,16 +14,17 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1beta1", importpath = "k8s.io/client-go/informers/rbac/v1beta1", deps = [ - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go index d79c75c9..b82c1c74 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - rbac_v1beta1 "k8s.io/api/rbac/v1beta1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredClusterRoleInformer(client kubernetes.Interface, resyncPeriod ti return client.RbacV1beta1().ClusterRoles().Watch(options) }, }, - &rbac_v1beta1.ClusterRole{}, + &rbacv1beta1.ClusterRole{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *clusterRoleInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *clusterRoleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1beta1.ClusterRole{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1beta1.ClusterRole{}, f.defaultInformer) } func (f *clusterRoleInformer) Lister() v1beta1.ClusterRoleLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go index f6b64816..d662e7f5 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - rbac_v1beta1 "k8s.io/api/rbac/v1beta1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredClusterRoleBindingInformer(client kubernetes.Interface, resyncPe return client.RbacV1beta1().ClusterRoleBindings().Watch(options) }, }, - &rbac_v1beta1.ClusterRoleBinding{}, + &rbacv1beta1.ClusterRoleBinding{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *clusterRoleBindingInformer) defaultInformer(client kubernetes.Interface } func (f *clusterRoleBindingInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1beta1.ClusterRoleBinding{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1beta1.ClusterRoleBinding{}, f.defaultInformer) } func (f *clusterRoleBindingInformer) Lister() v1beta1.ClusterRoleBindingLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go index fc1c5687..b885beb2 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - rbac_v1beta1 "k8s.io/api/rbac/v1beta1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredRoleInformer(client kubernetes.Interface, namespace string, resy return client.RbacV1beta1().Roles(namespace).Watch(options) }, }, - &rbac_v1beta1.Role{}, + &rbacv1beta1.Role{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *roleInformer) defaultInformer(client kubernetes.Interface, resyncPeriod } func (f *roleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1beta1.Role{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1beta1.Role{}, f.defaultInformer) } func (f *roleInformer) Lister() v1beta1.RoleLister { diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go index 9bbf7020..63d9d726 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - rbac_v1beta1 "k8s.io/api/rbac/v1beta1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredRoleBindingInformer(client kubernetes.Interface, namespace strin return client.RbacV1beta1().RoleBindings(namespace).Watch(options) }, }, - &rbac_v1beta1.RoleBinding{}, + &rbacv1beta1.RoleBinding{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *roleBindingInformer) defaultInformer(client kubernetes.Interface, resyn } func (f *roleBindingInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&rbac_v1beta1.RoleBinding{}, f.defaultInformer) + return f.factory.InformerFor(&rbacv1beta1.RoleBinding{}, f.defaultInformer) } func (f *roleBindingInformer) Lister() v1beta1.RoleBindingLister { diff --git a/vendor/k8s.io/client-go/informers/scheduling/BUILD b/vendor/k8s.io/client-go/informers/scheduling/BUILD index 81c38c91..9695dc43 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/BUILD +++ b/vendor/k8s.io/client-go/informers/scheduling/BUILD @@ -8,11 +8,12 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling", importpath = "k8s.io/client-go/informers/scheduling", deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/informers/scheduling/v1beta1:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD index b168cda4..163945b4 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD @@ -11,16 +11,17 @@ go_library( "interface.go", "priorityclass.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling/v1alpha1", importpath = "k8s.io/client-go/informers/scheduling/v1alpha1", deps = [ - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go index 481df049..cd90dd76 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go +++ b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - scheduling_v1alpha1 "k8s.io/api/scheduling/v1alpha1" + schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredPriorityClassInformer(client kubernetes.Interface, resyncPeriod return client.SchedulingV1alpha1().PriorityClasses().Watch(options) }, }, - &scheduling_v1alpha1.PriorityClass{}, + &schedulingv1alpha1.PriorityClass{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *priorityClassInformer) defaultInformer(client kubernetes.Interface, res } func (f *priorityClassInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&scheduling_v1alpha1.PriorityClass{}, f.defaultInformer) + return f.factory.InformerFor(&schedulingv1alpha1.PriorityClass{}, f.defaultInformer) } func (f *priorityClassInformer) Lister() v1alpha1.PriorityClassLister { diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD index dec0410f..b6ffaa41 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/BUILD @@ -6,17 +6,18 @@ go_library( "interface.go", "priorityclass.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling/v1beta1", importpath = "k8s.io/client-go/informers/scheduling/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/scheduling/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/scheduling/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go index ff61e58d..3c7d9093 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go +++ b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - scheduling_v1beta1 "k8s.io/api/scheduling/v1beta1" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredPriorityClassInformer(client kubernetes.Interface, resyncPeriod return client.SchedulingV1beta1().PriorityClasses().Watch(options) }, }, - &scheduling_v1beta1.PriorityClass{}, + &schedulingv1beta1.PriorityClass{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *priorityClassInformer) defaultInformer(client kubernetes.Interface, res } func (f *priorityClassInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&scheduling_v1beta1.PriorityClass{}, f.defaultInformer) + return f.factory.InformerFor(&schedulingv1beta1.PriorityClass{}, f.defaultInformer) } func (f *priorityClassInformer) Lister() v1beta1.PriorityClassLister { diff --git a/vendor/k8s.io/client-go/informers/settings/BUILD b/vendor/k8s.io/client-go/informers/settings/BUILD index 5dc3cfd1..39b0533d 100644 --- a/vendor/k8s.io/client-go/informers/settings/BUILD +++ b/vendor/k8s.io/client-go/informers/settings/BUILD @@ -8,10 +8,11 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/settings", importpath = "k8s.io/client-go/informers/settings", deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/settings/v1alpha1:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/settings/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/settings/v1alpha1/BUILD index fd24549e..2d437be9 100644 --- a/vendor/k8s.io/client-go/informers/settings/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/informers/settings/v1alpha1/BUILD @@ -11,16 +11,17 @@ go_library( "interface.go", "podpreset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/settings/v1alpha1", importpath = "k8s.io/client-go/informers/settings/v1alpha1", deps = [ - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go b/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go index c4596c82..33fcf235 100644 --- a/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go +++ b/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - settings_v1alpha1 "k8s.io/api/settings/v1alpha1" + settingsv1alpha1 "k8s.io/api/settings/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -70,7 +70,7 @@ func NewFilteredPodPresetInformer(client kubernetes.Interface, namespace string, return client.SettingsV1alpha1().PodPresets(namespace).Watch(options) }, }, - &settings_v1alpha1.PodPreset{}, + &settingsv1alpha1.PodPreset{}, resyncPeriod, indexers, ) @@ -81,7 +81,7 @@ func (f *podPresetInformer) defaultInformer(client kubernetes.Interface, resyncP } func (f *podPresetInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&settings_v1alpha1.PodPreset{}, f.defaultInformer) + return f.factory.InformerFor(&settingsv1alpha1.PodPreset{}, f.defaultInformer) } func (f *podPresetInformer) Lister() v1alpha1.PodPresetLister { diff --git a/vendor/k8s.io/client-go/informers/storage/BUILD b/vendor/k8s.io/client-go/informers/storage/BUILD index 56e9e185..4f6cacf0 100644 --- a/vendor/k8s.io/client-go/informers/storage/BUILD +++ b/vendor/k8s.io/client-go/informers/storage/BUILD @@ -8,12 +8,13 @@ load( go_library( name = "go_default_library", srcs = ["interface.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage", importpath = "k8s.io/client-go/informers/storage", deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/informers/storage/v1beta1:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/storage/v1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1/BUILD index 29c0b883..4e3f9966 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1/BUILD +++ b/vendor/k8s.io/client-go/informers/storage/v1/BUILD @@ -11,16 +11,17 @@ go_library( "interface.go", "storageclass.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1", importpath = "k8s.io/client-go/informers/storage/v1", deps = [ - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go b/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go index ae90b53b..b4609b4d 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go +++ b/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go @@ -21,8 +21,8 @@ package v1 import ( time "time" - storage_v1 "k8s.io/api/storage/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + storagev1 "k8s.io/api/storage/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" @@ -56,20 +56,20 @@ func NewStorageClassInformer(client kubernetes.Interface, resyncPeriod time.Dura func NewFilteredStorageClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ - ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.StorageV1().StorageClasses().List(options) }, - WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { if tweakListOptions != nil { tweakListOptions(&options) } return client.StorageV1().StorageClasses().Watch(options) }, }, - &storage_v1.StorageClass{}, + &storagev1.StorageClass{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *storageClassInformer) defaultInformer(client kubernetes.Interface, resy } func (f *storageClassInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&storage_v1.StorageClass{}, f.defaultInformer) + return f.factory.InformerFor(&storagev1.StorageClass{}, f.defaultInformer) } func (f *storageClassInformer) Lister() v1.StorageClassLister { diff --git a/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD index 1871ff49..3373147d 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD @@ -6,17 +6,18 @@ go_library( "interface.go", "volumeattachment.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1alpha1", importpath = "k8s.io/client-go/informers/storage/v1alpha1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go b/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go index 01c46858..e169c8a2 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go +++ b/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go @@ -21,7 +21,7 @@ package v1alpha1 import ( time "time" - storage_v1alpha1 "k8s.io/api/storage/v1alpha1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredVolumeAttachmentInformer(client kubernetes.Interface, resyncPeri return client.StorageV1alpha1().VolumeAttachments().Watch(options) }, }, - &storage_v1alpha1.VolumeAttachment{}, + &storagev1alpha1.VolumeAttachment{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *volumeAttachmentInformer) defaultInformer(client kubernetes.Interface, } func (f *volumeAttachmentInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&storage_v1alpha1.VolumeAttachment{}, f.defaultInformer) + return f.factory.InformerFor(&storagev1alpha1.VolumeAttachment{}, f.defaultInformer) } func (f *volumeAttachmentInformer) Lister() v1alpha1.VolumeAttachmentLister { diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD index 64aae516..72df0590 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD @@ -12,16 +12,17 @@ go_library( "storageclass.go", "volumeattachment.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1beta1", importpath = "k8s.io/client-go/informers/storage/v1beta1", deps = [ - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go b/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go index 1c2f3490..ed898a77 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - storage_v1beta1 "k8s.io/api/storage/v1beta1" + storagev1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredStorageClassInformer(client kubernetes.Interface, resyncPeriod t return client.StorageV1beta1().StorageClasses().Watch(options) }, }, - &storage_v1beta1.StorageClass{}, + &storagev1beta1.StorageClass{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *storageClassInformer) defaultInformer(client kubernetes.Interface, resy } func (f *storageClassInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&storage_v1beta1.StorageClass{}, f.defaultInformer) + return f.factory.InformerFor(&storagev1beta1.StorageClass{}, f.defaultInformer) } func (f *storageClassInformer) Lister() v1beta1.StorageClassLister { diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go b/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go index 63fa12f0..c75fc06b 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go @@ -21,7 +21,7 @@ package v1beta1 import ( time "time" - storage_v1beta1 "k8s.io/api/storage/v1beta1" + storagev1beta1 "k8s.io/api/storage/v1beta1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" @@ -69,7 +69,7 @@ func NewFilteredVolumeAttachmentInformer(client kubernetes.Interface, resyncPeri return client.StorageV1beta1().VolumeAttachments().Watch(options) }, }, - &storage_v1beta1.VolumeAttachment{}, + &storagev1beta1.VolumeAttachment{}, resyncPeriod, indexers, ) @@ -80,7 +80,7 @@ func (f *volumeAttachmentInformer) defaultInformer(client kubernetes.Interface, } func (f *volumeAttachmentInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&storage_v1beta1.VolumeAttachment{}, f.defaultInformer) + return f.factory.InformerFor(&storagev1beta1.VolumeAttachment{}, f.defaultInformer) } func (f *volumeAttachmentInformer) Lister() v1beta1.VolumeAttachmentLister { diff --git a/vendor/k8s.io/client-go/kubernetes/BUILD b/vendor/k8s.io/client-go/kubernetes/BUILD index 73f5a9b0..fc7ed0d7 100644 --- a/vendor/k8s.io/client-go/kubernetes/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -12,40 +7,44 @@ go_library( "doc.go", "import.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes", importpath = "k8s.io/client-go/kubernetes", + visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", + "//staging/src/k8s.io/client-go/discovery:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", ], ) @@ -73,10 +72,12 @@ filegroup( "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:all-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:all-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:all-srcs", @@ -93,4 +94,5 @@ filegroup( "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1:all-srcs", ], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/client-go/kubernetes/clientset.go b/vendor/k8s.io/client-go/kubernetes/clientset.go index 9d0eace4..122e4bb7 100644 --- a/vendor/k8s.io/client-go/kubernetes/clientset.go +++ b/vendor/k8s.io/client-go/kubernetes/clientset.go @@ -31,10 +31,12 @@ import ( authorizationv1beta1 "k8s.io/client-go/kubernetes/typed/authorization/v1beta1" autoscalingv1 "k8s.io/client-go/kubernetes/typed/autoscaling/v1" autoscalingv2beta1 "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1" + autoscalingv2beta2 "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2" batchv1 "k8s.io/client-go/kubernetes/typed/batch/v1" batchv1beta1 "k8s.io/client-go/kubernetes/typed/batch/v1beta1" batchv2alpha1 "k8s.io/client-go/kubernetes/typed/batch/v2alpha1" certificatesv1beta1 "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" + coordinationv1beta1 "k8s.io/client-go/kubernetes/typed/coordination/v1beta1" corev1 "k8s.io/client-go/kubernetes/typed/core/v1" eventsv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1" extensionsv1beta1 "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" @@ -76,6 +78,7 @@ type Interface interface { // Deprecated: please explicitly pick a version if possible. Autoscaling() autoscalingv1.AutoscalingV1Interface AutoscalingV2beta1() autoscalingv2beta1.AutoscalingV2beta1Interface + AutoscalingV2beta2() autoscalingv2beta2.AutoscalingV2beta2Interface BatchV1() batchv1.BatchV1Interface // Deprecated: please explicitly pick a version if possible. Batch() batchv1.BatchV1Interface @@ -84,6 +87,9 @@ type Interface interface { CertificatesV1beta1() certificatesv1beta1.CertificatesV1beta1Interface // Deprecated: please explicitly pick a version if possible. Certificates() certificatesv1beta1.CertificatesV1beta1Interface + CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface + // Deprecated: please explicitly pick a version if possible. + Coordination() coordinationv1beta1.CoordinationV1beta1Interface CoreV1() corev1.CoreV1Interface // Deprecated: please explicitly pick a version if possible. Core() corev1.CoreV1Interface @@ -133,10 +139,12 @@ type Clientset struct { authorizationV1beta1 *authorizationv1beta1.AuthorizationV1beta1Client autoscalingV1 *autoscalingv1.AutoscalingV1Client autoscalingV2beta1 *autoscalingv2beta1.AutoscalingV2beta1Client + autoscalingV2beta2 *autoscalingv2beta2.AutoscalingV2beta2Client batchV1 *batchv1.BatchV1Client batchV1beta1 *batchv1beta1.BatchV1beta1Client batchV2alpha1 *batchv2alpha1.BatchV2alpha1Client certificatesV1beta1 *certificatesv1beta1.CertificatesV1beta1Client + coordinationV1beta1 *coordinationv1beta1.CoordinationV1beta1Client coreV1 *corev1.CoreV1Client eventsV1beta1 *eventsv1beta1.EventsV1beta1Client extensionsV1beta1 *extensionsv1beta1.ExtensionsV1beta1Client @@ -238,6 +246,11 @@ func (c *Clientset) AutoscalingV2beta1() autoscalingv2beta1.AutoscalingV2beta1In return c.autoscalingV2beta1 } +// AutoscalingV2beta2 retrieves the AutoscalingV2beta2Client +func (c *Clientset) AutoscalingV2beta2() autoscalingv2beta2.AutoscalingV2beta2Interface { + return c.autoscalingV2beta2 +} + // BatchV1 retrieves the BatchV1Client func (c *Clientset) BatchV1() batchv1.BatchV1Interface { return c.batchV1 @@ -270,6 +283,17 @@ func (c *Clientset) Certificates() certificatesv1beta1.CertificatesV1beta1Interf return c.certificatesV1beta1 } +// CoordinationV1beta1 retrieves the CoordinationV1beta1Client +func (c *Clientset) CoordinationV1beta1() coordinationv1beta1.CoordinationV1beta1Interface { + return c.coordinationV1beta1 +} + +// Deprecated: Coordination retrieves the default version of CoordinationClient. +// Please explicitly pick a version. +func (c *Clientset) Coordination() coordinationv1beta1.CoordinationV1beta1Interface { + return c.coordinationV1beta1 +} + // CoreV1 retrieves the CoreV1Client func (c *Clientset) CoreV1() corev1.CoreV1Interface { return c.coreV1 @@ -454,6 +478,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.autoscalingV2beta2, err = autoscalingv2beta2.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.batchV1, err = batchv1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -470,6 +498,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.coordinationV1beta1, err = coordinationv1beta1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.coreV1, err = corev1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -549,10 +581,12 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { cs.authorizationV1beta1 = authorizationv1beta1.NewForConfigOrDie(c) cs.autoscalingV1 = autoscalingv1.NewForConfigOrDie(c) cs.autoscalingV2beta1 = autoscalingv2beta1.NewForConfigOrDie(c) + cs.autoscalingV2beta2 = autoscalingv2beta2.NewForConfigOrDie(c) cs.batchV1 = batchv1.NewForConfigOrDie(c) cs.batchV1beta1 = batchv1beta1.NewForConfigOrDie(c) cs.batchV2alpha1 = batchv2alpha1.NewForConfigOrDie(c) cs.certificatesV1beta1 = certificatesv1beta1.NewForConfigOrDie(c) + cs.coordinationV1beta1 = coordinationv1beta1.NewForConfigOrDie(c) cs.coreV1 = corev1.NewForConfigOrDie(c) cs.eventsV1beta1 = eventsv1beta1.NewForConfigOrDie(c) cs.extensionsV1beta1 = extensionsv1beta1.NewForConfigOrDie(c) @@ -586,10 +620,12 @@ func New(c rest.Interface) *Clientset { cs.authorizationV1beta1 = authorizationv1beta1.New(c) cs.autoscalingV1 = autoscalingv1.New(c) cs.autoscalingV2beta1 = autoscalingv2beta1.New(c) + cs.autoscalingV2beta2 = autoscalingv2beta2.New(c) cs.batchV1 = batchv1.New(c) cs.batchV1beta1 = batchv1beta1.New(c) cs.batchV2alpha1 = batchv2alpha1.New(c) cs.certificatesV1beta1 = certificatesv1beta1.New(c) + cs.coordinationV1beta1 = coordinationv1beta1.New(c) cs.coreV1 = corev1.New(c) cs.eventsV1beta1 = eventsv1beta1.New(c) cs.extensionsV1beta1 = extensionsv1beta1.New(c) diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/BUILD b/vendor/k8s.io/client-go/kubernetes/scheme/BUILD index 55ae1310..3490063e 100644 --- a/vendor/k8s.io/client-go/kubernetes/scheme/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/scheme/BUILD @@ -1,9 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", @@ -11,41 +6,46 @@ go_library( "doc.go", "register.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/scheme", importpath = "k8s.io/client-go/kubernetes/scheme", + visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/api/authorization/v1:go_default_library", - "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/api/scheduling/v1beta1:go_default_library", - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/api/authentication/v1:go_default_library", + "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", + "//staging/src/k8s.io/api/authorization/v1:go_default_library", + "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/api/networking/v1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) @@ -60,4 +60,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/register.go b/vendor/k8s.io/client-go/kubernetes/scheme/register.go index 86584cf8..9ca89b76 100644 --- a/vendor/k8s.io/client-go/kubernetes/scheme/register.go +++ b/vendor/k8s.io/client-go/kubernetes/scheme/register.go @@ -30,10 +30,12 @@ import ( authorizationv1beta1 "k8s.io/api/authorization/v1beta1" autoscalingv1 "k8s.io/api/autoscaling/v1" autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" + autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2" batchv1 "k8s.io/api/batch/v1" batchv1beta1 "k8s.io/api/batch/v1beta1" batchv2alpha1 "k8s.io/api/batch/v2alpha1" certificatesv1beta1 "k8s.io/api/certificates/v1beta1" + coordinationv1beta1 "k8s.io/api/coordination/v1beta1" corev1 "k8s.io/api/core/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" @@ -52,15 +54,44 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) - -func init() { - v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - AddToScheme(Scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + admissionregistrationv1alpha1.AddToScheme, + admissionregistrationv1beta1.AddToScheme, + appsv1beta1.AddToScheme, + appsv1beta2.AddToScheme, + appsv1.AddToScheme, + authenticationv1.AddToScheme, + authenticationv1beta1.AddToScheme, + authorizationv1.AddToScheme, + authorizationv1beta1.AddToScheme, + autoscalingv1.AddToScheme, + autoscalingv2beta1.AddToScheme, + autoscalingv2beta2.AddToScheme, + batchv1.AddToScheme, + batchv1beta1.AddToScheme, + batchv2alpha1.AddToScheme, + certificatesv1beta1.AddToScheme, + coordinationv1beta1.AddToScheme, + corev1.AddToScheme, + eventsv1beta1.AddToScheme, + extensionsv1beta1.AddToScheme, + networkingv1.AddToScheme, + policyv1beta1.AddToScheme, + rbacv1.AddToScheme, + rbacv1beta1.AddToScheme, + rbacv1alpha1.AddToScheme, + schedulingv1alpha1.AddToScheme, + schedulingv1beta1.AddToScheme, + settingsv1alpha1.AddToScheme, + storagev1beta1.AddToScheme, + storagev1.AddToScheme, + storagev1alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -73,38 +104,13 @@ func init() { // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -func AddToScheme(scheme *runtime.Scheme) { - admissionregistrationv1alpha1.AddToScheme(scheme) - admissionregistrationv1beta1.AddToScheme(scheme) - appsv1beta1.AddToScheme(scheme) - appsv1beta2.AddToScheme(scheme) - appsv1.AddToScheme(scheme) - authenticationv1.AddToScheme(scheme) - authenticationv1beta1.AddToScheme(scheme) - authorizationv1.AddToScheme(scheme) - authorizationv1beta1.AddToScheme(scheme) - autoscalingv1.AddToScheme(scheme) - autoscalingv2beta1.AddToScheme(scheme) - batchv1.AddToScheme(scheme) - batchv1beta1.AddToScheme(scheme) - batchv2alpha1.AddToScheme(scheme) - certificatesv1beta1.AddToScheme(scheme) - corev1.AddToScheme(scheme) - eventsv1beta1.AddToScheme(scheme) - extensionsv1beta1.AddToScheme(scheme) - networkingv1.AddToScheme(scheme) - policyv1beta1.AddToScheme(scheme) - rbacv1.AddToScheme(scheme) - rbacv1beta1.AddToScheme(scheme) - rbacv1alpha1.AddToScheme(scheme) - schedulingv1alpha1.AddToScheme(scheme) - schedulingv1beta1.AddToScheme(scheme) - settingsv1alpha1.AddToScheme(scheme) - storagev1beta1.AddToScheme(scheme) - storagev1.AddToScheme(scheme) - storagev1alpha1.AddToScheme(scheme) +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(Scheme)) } diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD index 6ad24531..8a8cc814 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD @@ -8,16 +8,17 @@ go_library( "generated_expansion.go", "initializerconfiguration.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD index 197f738e..0fbeccb5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD @@ -9,16 +9,17 @@ go_library( "mutatingwebhookconfiguration.go", "validatingwebhookconfiguration.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD index 5d77a94d..17bd3fad 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD @@ -12,16 +12,17 @@ go_library( "replicaset.go", "statefulset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1", importpath = "k8s.io/client-go/kubernetes/typed/apps/v1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go index ac9d6279..1ddaa1a7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type ControllerRevisionsGetter interface { type ControllerRevisionInterface interface { Create(*v1.ControllerRevision) (*v1.ControllerRevision, error) Update(*v1.ControllerRevision) (*v1.ControllerRevision, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ControllerRevision, error) - List(opts meta_v1.ListOptions) (*v1.ControllerRevisionList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ControllerRevision, error) + List(opts metav1.ListOptions) (*v1.ControllerRevisionList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ControllerRevision, err error) ControllerRevisionExpansion } @@ -61,7 +61,7 @@ func newControllerRevisions(c *AppsV1Client, namespace string) *controllerRevisi } // Get takes name of the controllerRevision, and returns the corresponding controllerRevision object, and an error if there is any. -func (c *controllerRevisions) Get(name string, options meta_v1.GetOptions) (result *v1.ControllerRevision, err error) { +func (c *controllerRevisions) Get(name string, options metav1.GetOptions) (result *v1.ControllerRevision, err error) { result = &v1.ControllerRevision{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *controllerRevisions) Get(name string, options meta_v1.GetOptions) (resu } // List takes label and field selectors, and returns the list of ControllerRevisions that match those selectors. -func (c *controllerRevisions) List(opts meta_v1.ListOptions) (result *v1.ControllerRevisionList, err error) { +func (c *controllerRevisions) List(opts metav1.ListOptions) (result *v1.ControllerRevisionList, err error) { result = &v1.ControllerRevisionList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *controllerRevisions) List(opts meta_v1.ListOptions) (result *v1.Control } // Watch returns a watch.Interface that watches the requested controllerRevisions. -func (c *controllerRevisions) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *controllerRevisions) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *controllerRevisions) Update(controllerRevision *v1.ControllerRevision) } // Delete takes name of the controllerRevision and deletes it. Returns an error if one occurs. -func (c *controllerRevisions) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *controllerRevisions) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("controllerrevisions"). @@ -132,7 +132,7 @@ func (c *controllerRevisions) Delete(name string, options *meta_v1.DeleteOptions } // DeleteCollection deletes a collection of objects. -func (c *controllerRevisions) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *controllerRevisions) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("controllerrevisions"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go index b50ac255..03a87069 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type DaemonSetInterface interface { Create(*v1.DaemonSet) (*v1.DaemonSet, error) Update(*v1.DaemonSet) (*v1.DaemonSet, error) UpdateStatus(*v1.DaemonSet) (*v1.DaemonSet, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.DaemonSet, error) - List(opts meta_v1.ListOptions) (*v1.DaemonSetList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.DaemonSet, error) + List(opts metav1.ListOptions) (*v1.DaemonSetList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.DaemonSet, err error) DaemonSetExpansion } @@ -62,7 +62,7 @@ func newDaemonSets(c *AppsV1Client, namespace string) *daemonSets { } // Get takes name of the daemonSet, and returns the corresponding daemonSet object, and an error if there is any. -func (c *daemonSets) Get(name string, options meta_v1.GetOptions) (result *v1.DaemonSet, err error) { +func (c *daemonSets) Get(name string, options metav1.GetOptions) (result *v1.DaemonSet, err error) { result = &v1.DaemonSet{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *daemonSets) Get(name string, options meta_v1.GetOptions) (result *v1.Da } // List takes label and field selectors, and returns the list of DaemonSets that match those selectors. -func (c *daemonSets) List(opts meta_v1.ListOptions) (result *v1.DaemonSetList, err error) { +func (c *daemonSets) List(opts metav1.ListOptions) (result *v1.DaemonSetList, err error) { result = &v1.DaemonSetList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *daemonSets) List(opts meta_v1.ListOptions) (result *v1.DaemonSetList, e } // Watch returns a watch.Interface that watches the requested daemonSets. -func (c *daemonSets) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *daemonSets) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *daemonSets) UpdateStatus(daemonSet *v1.DaemonSet) (result *v1.DaemonSet } // Delete takes name of the daemonSet and deletes it. Returns an error if one occurs. -func (c *daemonSets) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *daemonSets) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("daemonsets"). @@ -149,7 +149,7 @@ func (c *daemonSets) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *daemonSets) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *daemonSets) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("daemonsets"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go index e2b1b188..73d46f8b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type DeploymentInterface interface { Create(*v1.Deployment) (*v1.Deployment, error) Update(*v1.Deployment) (*v1.Deployment, error) UpdateStatus(*v1.Deployment) (*v1.Deployment, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Deployment, error) - List(opts meta_v1.ListOptions) (*v1.DeploymentList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Deployment, error) + List(opts metav1.ListOptions) (*v1.DeploymentList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Deployment, err error) DeploymentExpansion } @@ -62,7 +62,7 @@ func newDeployments(c *AppsV1Client, namespace string) *deployments { } // Get takes name of the deployment, and returns the corresponding deployment object, and an error if there is any. -func (c *deployments) Get(name string, options meta_v1.GetOptions) (result *v1.Deployment, err error) { +func (c *deployments) Get(name string, options metav1.GetOptions) (result *v1.Deployment, err error) { result = &v1.Deployment{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *deployments) Get(name string, options meta_v1.GetOptions) (result *v1.D } // List takes label and field selectors, and returns the list of Deployments that match those selectors. -func (c *deployments) List(opts meta_v1.ListOptions) (result *v1.DeploymentList, err error) { +func (c *deployments) List(opts metav1.ListOptions) (result *v1.DeploymentList, err error) { result = &v1.DeploymentList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *deployments) List(opts meta_v1.ListOptions) (result *v1.DeploymentList, } // Watch returns a watch.Interface that watches the requested deployments. -func (c *deployments) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *deployments) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *deployments) UpdateStatus(deployment *v1.Deployment) (result *v1.Deploy } // Delete takes name of the deployment and deletes it. Returns an error if one occurs. -func (c *deployments) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *deployments) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("deployments"). @@ -149,7 +149,7 @@ func (c *deployments) Delete(name string, options *meta_v1.DeleteOptions) error } // DeleteCollection deletes a collection of objects. -func (c *deployments) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *deployments) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("deployments"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go index 21614cbe..07794116 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type ReplicaSetInterface interface { Create(*v1.ReplicaSet) (*v1.ReplicaSet, error) Update(*v1.ReplicaSet) (*v1.ReplicaSet, error) UpdateStatus(*v1.ReplicaSet) (*v1.ReplicaSet, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ReplicaSet, error) - List(opts meta_v1.ListOptions) (*v1.ReplicaSetList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ReplicaSet, error) + List(opts metav1.ListOptions) (*v1.ReplicaSetList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ReplicaSet, err error) ReplicaSetExpansion } @@ -62,7 +62,7 @@ func newReplicaSets(c *AppsV1Client, namespace string) *replicaSets { } // Get takes name of the replicaSet, and returns the corresponding replicaSet object, and an error if there is any. -func (c *replicaSets) Get(name string, options meta_v1.GetOptions) (result *v1.ReplicaSet, err error) { +func (c *replicaSets) Get(name string, options metav1.GetOptions) (result *v1.ReplicaSet, err error) { result = &v1.ReplicaSet{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *replicaSets) Get(name string, options meta_v1.GetOptions) (result *v1.R } // List takes label and field selectors, and returns the list of ReplicaSets that match those selectors. -func (c *replicaSets) List(opts meta_v1.ListOptions) (result *v1.ReplicaSetList, err error) { +func (c *replicaSets) List(opts metav1.ListOptions) (result *v1.ReplicaSetList, err error) { result = &v1.ReplicaSetList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *replicaSets) List(opts meta_v1.ListOptions) (result *v1.ReplicaSetList, } // Watch returns a watch.Interface that watches the requested replicaSets. -func (c *replicaSets) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *replicaSets) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *replicaSets) UpdateStatus(replicaSet *v1.ReplicaSet) (result *v1.Replic } // Delete takes name of the replicaSet and deletes it. Returns an error if one occurs. -func (c *replicaSets) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *replicaSets) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("replicasets"). @@ -149,7 +149,7 @@ func (c *replicaSets) Delete(name string, options *meta_v1.DeleteOptions) error } // DeleteCollection deletes a collection of objects. -func (c *replicaSets) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *replicaSets) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("replicasets"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go index 3ef5b888..54322d97 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/apps/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type StatefulSetInterface interface { Create(*v1.StatefulSet) (*v1.StatefulSet, error) Update(*v1.StatefulSet) (*v1.StatefulSet, error) UpdateStatus(*v1.StatefulSet) (*v1.StatefulSet, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.StatefulSet, error) - List(opts meta_v1.ListOptions) (*v1.StatefulSetList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.StatefulSet, error) + List(opts metav1.ListOptions) (*v1.StatefulSetList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.StatefulSet, err error) StatefulSetExpansion } @@ -62,7 +62,7 @@ func newStatefulSets(c *AppsV1Client, namespace string) *statefulSets { } // Get takes name of the statefulSet, and returns the corresponding statefulSet object, and an error if there is any. -func (c *statefulSets) Get(name string, options meta_v1.GetOptions) (result *v1.StatefulSet, err error) { +func (c *statefulSets) Get(name string, options metav1.GetOptions) (result *v1.StatefulSet, err error) { result = &v1.StatefulSet{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *statefulSets) Get(name string, options meta_v1.GetOptions) (result *v1. } // List takes label and field selectors, and returns the list of StatefulSets that match those selectors. -func (c *statefulSets) List(opts meta_v1.ListOptions) (result *v1.StatefulSetList, err error) { +func (c *statefulSets) List(opts metav1.ListOptions) (result *v1.StatefulSetList, err error) { result = &v1.StatefulSetList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *statefulSets) List(opts meta_v1.ListOptions) (result *v1.StatefulSetLis } // Watch returns a watch.Interface that watches the requested statefulSets. -func (c *statefulSets) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *statefulSets) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *statefulSets) UpdateStatus(statefulSet *v1.StatefulSet) (result *v1.Sta } // Delete takes name of the statefulSet and deletes it. Returns an error if one occurs. -func (c *statefulSets) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *statefulSets) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("statefulsets"). @@ -149,7 +149,7 @@ func (c *statefulSets) Delete(name string, options *meta_v1.DeleteOptions) error } // DeleteCollection deletes a collection of objects. -func (c *statefulSets) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *statefulSets) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("statefulsets"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD index 18dca716..34a2f829 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD @@ -16,15 +16,16 @@ go_library( "scale.go", "statefulset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta1", deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD index 0af42bcf..246b4327 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD @@ -18,15 +18,16 @@ go_library( "scale.go", "statefulset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2", importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta2", deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD index b89498de..981ad197 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD @@ -14,12 +14,13 @@ go_library( "tokenreview.go", "tokenreview_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1", importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1", deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/authentication/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD index ddbe7e98..06cfd13c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD @@ -14,12 +14,13 @@ go_library( "tokenreview.go", "tokenreview_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", deps = [ - "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/authentication/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD index f6255f38..11c640c0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD @@ -20,12 +20,13 @@ go_library( "subjectaccessreview.go", "subjectaccessreview_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1", importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1", deps = [ - "//vendor/k8s.io/api/authorization/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/authorization/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD index 793ec39b..0643a927 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD @@ -20,12 +20,13 @@ go_library( "subjectaccessreview.go", "subjectaccessreview_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", deps = [ - "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/authorization/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD index 30e434a6..161aba34 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD @@ -13,15 +13,16 @@ go_library( "generated_expansion.go", "horizontalpodautoscaler.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1", importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v1", deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go index 2da25e96..6891b6b6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/autoscaling/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type HorizontalPodAutoscalerInterface interface { Create(*v1.HorizontalPodAutoscaler) (*v1.HorizontalPodAutoscaler, error) Update(*v1.HorizontalPodAutoscaler) (*v1.HorizontalPodAutoscaler, error) UpdateStatus(*v1.HorizontalPodAutoscaler) (*v1.HorizontalPodAutoscaler, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.HorizontalPodAutoscaler, error) - List(opts meta_v1.ListOptions) (*v1.HorizontalPodAutoscalerList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.HorizontalPodAutoscaler, error) + List(opts metav1.ListOptions) (*v1.HorizontalPodAutoscalerList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.HorizontalPodAutoscaler, err error) HorizontalPodAutoscalerExpansion } @@ -62,7 +62,7 @@ func newHorizontalPodAutoscalers(c *AutoscalingV1Client, namespace string) *hori } // Get takes name of the horizontalPodAutoscaler, and returns the corresponding horizontalPodAutoscaler object, and an error if there is any. -func (c *horizontalPodAutoscalers) Get(name string, options meta_v1.GetOptions) (result *v1.HorizontalPodAutoscaler, err error) { +func (c *horizontalPodAutoscalers) Get(name string, options metav1.GetOptions) (result *v1.HorizontalPodAutoscaler, err error) { result = &v1.HorizontalPodAutoscaler{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *horizontalPodAutoscalers) Get(name string, options meta_v1.GetOptions) } // List takes label and field selectors, and returns the list of HorizontalPodAutoscalers that match those selectors. -func (c *horizontalPodAutoscalers) List(opts meta_v1.ListOptions) (result *v1.HorizontalPodAutoscalerList, err error) { +func (c *horizontalPodAutoscalers) List(opts metav1.ListOptions) (result *v1.HorizontalPodAutoscalerList, err error) { result = &v1.HorizontalPodAutoscalerList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *horizontalPodAutoscalers) List(opts meta_v1.ListOptions) (result *v1.Ho } // Watch returns a watch.Interface that watches the requested horizontalPodAutoscalers. -func (c *horizontalPodAutoscalers) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *horizontalPodAutoscalers) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *horizontalPodAutoscalers) UpdateStatus(horizontalPodAutoscaler *v1.Hori } // Delete takes name of the horizontalPodAutoscaler and deletes it. Returns an error if one occurs. -func (c *horizontalPodAutoscalers) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *horizontalPodAutoscalers) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("horizontalpodautoscalers"). @@ -149,7 +149,7 @@ func (c *horizontalPodAutoscalers) Delete(name string, options *meta_v1.DeleteOp } // DeleteCollection deletes a collection of objects. -func (c *horizontalPodAutoscalers) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *horizontalPodAutoscalers) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("horizontalpodautoscalers"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD index 1bb14507..44def4ff 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD @@ -8,16 +8,17 @@ go_library( "generated_expansion.go", "horizontalpodautoscaler.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD new file mode 100644 index 00000000..f4b0f0ef --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/BUILD @@ -0,0 +1,40 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "autoscaling_client.go", + "doc.go", + "generated_expansion.go", + "horizontalpodautoscaler.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", + importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/fake:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/autoscaling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/autoscaling_client.go new file mode 100644 index 00000000..03fe25e4 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/autoscaling_client.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +type AutoscalingV2beta2Interface interface { + RESTClient() rest.Interface + HorizontalPodAutoscalersGetter +} + +// AutoscalingV2beta2Client is used to interact with features provided by the autoscaling group. +type AutoscalingV2beta2Client struct { + restClient rest.Interface +} + +func (c *AutoscalingV2beta2Client) HorizontalPodAutoscalers(namespace string) HorizontalPodAutoscalerInterface { + return newHorizontalPodAutoscalers(c, namespace) +} + +// NewForConfig creates a new AutoscalingV2beta2Client for the given config. +func NewForConfig(c *rest.Config) (*AutoscalingV2beta2Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &AutoscalingV2beta2Client{client}, nil +} + +// NewForConfigOrDie creates a new AutoscalingV2beta2Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *AutoscalingV2beta2Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new AutoscalingV2beta2Client for the given RESTClient. +func New(c rest.Interface) *AutoscalingV2beta2Client { + return &AutoscalingV2beta2Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v2beta2.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *AutoscalingV2beta2Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/doc.go new file mode 100644 index 00000000..c6009659 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/doc.go @@ -0,0 +1,20 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v2beta2 diff --git a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/generated_expansion.go similarity index 78% rename from vendor/k8s.io/kubernetes/pkg/apis/componentconfig/doc.go rename to vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/generated_expansion.go index 159d6192..822e0628 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -// +k8s:deepcopy-gen=package +// Code generated by client-gen. DO NOT EDIT. -package componentconfig // import "k8s.io/kubernetes/pkg/apis/componentconfig" +package v2beta2 + +type HorizontalPodAutoscalerExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go new file mode 100644 index 00000000..ddabda7e --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go @@ -0,0 +1,174 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// HorizontalPodAutoscalersGetter has a method to return a HorizontalPodAutoscalerInterface. +// A group's client should implement this interface. +type HorizontalPodAutoscalersGetter interface { + HorizontalPodAutoscalers(namespace string) HorizontalPodAutoscalerInterface +} + +// HorizontalPodAutoscalerInterface has methods to work with HorizontalPodAutoscaler resources. +type HorizontalPodAutoscalerInterface interface { + Create(*v2beta2.HorizontalPodAutoscaler) (*v2beta2.HorizontalPodAutoscaler, error) + Update(*v2beta2.HorizontalPodAutoscaler) (*v2beta2.HorizontalPodAutoscaler, error) + UpdateStatus(*v2beta2.HorizontalPodAutoscaler) (*v2beta2.HorizontalPodAutoscaler, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v2beta2.HorizontalPodAutoscaler, error) + List(opts v1.ListOptions) (*v2beta2.HorizontalPodAutoscalerList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta2.HorizontalPodAutoscaler, err error) + HorizontalPodAutoscalerExpansion +} + +// horizontalPodAutoscalers implements HorizontalPodAutoscalerInterface +type horizontalPodAutoscalers struct { + client rest.Interface + ns string +} + +// newHorizontalPodAutoscalers returns a HorizontalPodAutoscalers +func newHorizontalPodAutoscalers(c *AutoscalingV2beta2Client, namespace string) *horizontalPodAutoscalers { + return &horizontalPodAutoscalers{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the horizontalPodAutoscaler, and returns the corresponding horizontalPodAutoscaler object, and an error if there is any. +func (c *horizontalPodAutoscalers) Get(name string, options v1.GetOptions) (result *v2beta2.HorizontalPodAutoscaler, err error) { + result = &v2beta2.HorizontalPodAutoscaler{} + err = c.client.Get(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of HorizontalPodAutoscalers that match those selectors. +func (c *horizontalPodAutoscalers) List(opts v1.ListOptions) (result *v2beta2.HorizontalPodAutoscalerList, err error) { + result = &v2beta2.HorizontalPodAutoscalerList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested horizontalPodAutoscalers. +func (c *horizontalPodAutoscalers) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a horizontalPodAutoscaler and creates it. Returns the server's representation of the horizontalPodAutoscaler, and an error, if there is any. +func (c *horizontalPodAutoscalers) Create(horizontalPodAutoscaler *v2beta2.HorizontalPodAutoscaler) (result *v2beta2.HorizontalPodAutoscaler, err error) { + result = &v2beta2.HorizontalPodAutoscaler{} + err = c.client.Post(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Body(horizontalPodAutoscaler). + Do(). + Into(result) + return +} + +// Update takes the representation of a horizontalPodAutoscaler and updates it. Returns the server's representation of the horizontalPodAutoscaler, and an error, if there is any. +func (c *horizontalPodAutoscalers) Update(horizontalPodAutoscaler *v2beta2.HorizontalPodAutoscaler) (result *v2beta2.HorizontalPodAutoscaler, err error) { + result = &v2beta2.HorizontalPodAutoscaler{} + err = c.client.Put(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(horizontalPodAutoscaler.Name). + Body(horizontalPodAutoscaler). + Do(). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). + +func (c *horizontalPodAutoscalers) UpdateStatus(horizontalPodAutoscaler *v2beta2.HorizontalPodAutoscaler) (result *v2beta2.HorizontalPodAutoscaler, err error) { + result = &v2beta2.HorizontalPodAutoscaler{} + err = c.client.Put(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(horizontalPodAutoscaler.Name). + SubResource("status"). + Body(horizontalPodAutoscaler). + Do(). + Into(result) + return +} + +// Delete takes name of the horizontalPodAutoscaler and deletes it. Returns an error if one occurs. +func (c *horizontalPodAutoscalers) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *horizontalPodAutoscalers) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched horizontalPodAutoscaler. +func (c *horizontalPodAutoscalers) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v2beta2.HorizontalPodAutoscaler, err error) { + result = &v2beta2.HorizontalPodAutoscaler{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("horizontalpodautoscalers"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD index 2af6de36..c3af5d12 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD @@ -13,15 +13,16 @@ go_library( "generated_expansion.go", "job.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1", importpath = "k8s.io/client-go/kubernetes/typed/batch/v1", deps = [ - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go index f714d3de..ba8332a9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/batch/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type JobInterface interface { Create(*v1.Job) (*v1.Job, error) Update(*v1.Job) (*v1.Job, error) UpdateStatus(*v1.Job) (*v1.Job, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Job, error) - List(opts meta_v1.ListOptions) (*v1.JobList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Job, error) + List(opts metav1.ListOptions) (*v1.JobList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Job, err error) JobExpansion } @@ -62,7 +62,7 @@ func newJobs(c *BatchV1Client, namespace string) *jobs { } // Get takes name of the job, and returns the corresponding job object, and an error if there is any. -func (c *jobs) Get(name string, options meta_v1.GetOptions) (result *v1.Job, err error) { +func (c *jobs) Get(name string, options metav1.GetOptions) (result *v1.Job, err error) { result = &v1.Job{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *jobs) Get(name string, options meta_v1.GetOptions) (result *v1.Job, err } // List takes label and field selectors, and returns the list of Jobs that match those selectors. -func (c *jobs) List(opts meta_v1.ListOptions) (result *v1.JobList, err error) { +func (c *jobs) List(opts metav1.ListOptions) (result *v1.JobList, err error) { result = &v1.JobList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *jobs) List(opts meta_v1.ListOptions) (result *v1.JobList, err error) { } // Watch returns a watch.Interface that watches the requested jobs. -func (c *jobs) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *jobs) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *jobs) UpdateStatus(job *v1.Job) (result *v1.Job, err error) { } // Delete takes name of the job and deletes it. Returns an error if one occurs. -func (c *jobs) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *jobs) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("jobs"). @@ -149,7 +149,7 @@ func (c *jobs) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *jobs) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *jobs) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("jobs"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD index 58e0a6af..f542eed7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD @@ -13,15 +13,16 @@ go_library( "doc.go", "generated_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/batch/v1beta1", deps = [ - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD index c698053a..8c960802 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD @@ -13,15 +13,16 @@ go_library( "doc.go", "generated_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1", importpath = "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", deps = [ - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD index 1caeb018..0e838c17 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD @@ -14,15 +14,16 @@ go_library( "doc.go", "generated_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD new file mode 100644 index 00000000..0dd7f096 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/BUILD @@ -0,0 +1,40 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "coordination_client.go", + "doc.go", + "generated_expansion.go", + "lease.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1", + importpath = "k8s.io/client-go/kubernetes/typed/coordination/v1beta1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/fake:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/metrics_client.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/coordination_client.go similarity index 59% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/metrics_client.go rename to vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/coordination_client.go index 7353ddbb..91a76484 100644 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/metrics_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/coordination_client.go @@ -19,33 +19,28 @@ limitations under the License. package v1beta1 import ( + v1beta1 "k8s.io/api/coordination/v1beta1" serializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/kubernetes/scheme" rest "k8s.io/client-go/rest" - v1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" - "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme" ) -type MetricsV1beta1Interface interface { +type CoordinationV1beta1Interface interface { RESTClient() rest.Interface - NodeMetricsesGetter - PodMetricsesGetter + LeasesGetter } -// MetricsV1beta1Client is used to interact with features provided by the metrics group. -type MetricsV1beta1Client struct { +// CoordinationV1beta1Client is used to interact with features provided by the coordination.k8s.io group. +type CoordinationV1beta1Client struct { restClient rest.Interface } -func (c *MetricsV1beta1Client) NodeMetricses() NodeMetricsInterface { - return newNodeMetricses(c) +func (c *CoordinationV1beta1Client) Leases(namespace string) LeaseInterface { + return newLeases(c, namespace) } -func (c *MetricsV1beta1Client) PodMetricses(namespace string) PodMetricsInterface { - return newPodMetricses(c, namespace) -} - -// NewForConfig creates a new MetricsV1beta1Client for the given config. -func NewForConfig(c *rest.Config) (*MetricsV1beta1Client, error) { +// NewForConfig creates a new CoordinationV1beta1Client for the given config. +func NewForConfig(c *rest.Config) (*CoordinationV1beta1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -54,12 +49,12 @@ func NewForConfig(c *rest.Config) (*MetricsV1beta1Client, error) { if err != nil { return nil, err } - return &MetricsV1beta1Client{client}, nil + return &CoordinationV1beta1Client{client}, nil } -// NewForConfigOrDie creates a new MetricsV1beta1Client for the given config and +// NewForConfigOrDie creates a new CoordinationV1beta1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *MetricsV1beta1Client { +func NewForConfigOrDie(c *rest.Config) *CoordinationV1beta1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -67,9 +62,9 @@ func NewForConfigOrDie(c *rest.Config) *MetricsV1beta1Client { return client } -// New creates a new MetricsV1beta1Client for the given RESTClient. -func New(c rest.Interface) *MetricsV1beta1Client { - return &MetricsV1beta1Client{c} +// New creates a new CoordinationV1beta1Client for the given RESTClient. +func New(c rest.Interface) *CoordinationV1beta1Client { + return &CoordinationV1beta1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -87,7 +82,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *MetricsV1beta1Client) RESTClient() rest.Interface { +func (c *CoordinationV1beta1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/doc.go similarity index 100% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/doc.go rename to vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/doc.go diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/generated_expansion.go similarity index 89% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/generated_expansion.go rename to vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/generated_expansion.go index a89ca3c7..dfd180da 100644 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/generated_expansion.go @@ -18,6 +18,4 @@ limitations under the License. package v1beta1 -type NodeMetricsExpansion interface{} - -type PodMetricsExpansion interface{} +type LeaseExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go new file mode 100644 index 00000000..16277255 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go @@ -0,0 +1,157 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/coordination/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// LeasesGetter has a method to return a LeaseInterface. +// A group's client should implement this interface. +type LeasesGetter interface { + Leases(namespace string) LeaseInterface +} + +// LeaseInterface has methods to work with Lease resources. +type LeaseInterface interface { + Create(*v1beta1.Lease) (*v1beta1.Lease, error) + Update(*v1beta1.Lease) (*v1beta1.Lease, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1beta1.Lease, error) + List(opts v1.ListOptions) (*v1beta1.LeaseList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.Lease, err error) + LeaseExpansion +} + +// leases implements LeaseInterface +type leases struct { + client rest.Interface + ns string +} + +// newLeases returns a Leases +func newLeases(c *CoordinationV1beta1Client, namespace string) *leases { + return &leases{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the lease, and returns the corresponding lease object, and an error if there is any. +func (c *leases) Get(name string, options v1.GetOptions) (result *v1beta1.Lease, err error) { + result = &v1beta1.Lease{} + err = c.client.Get(). + Namespace(c.ns). + Resource("leases"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Leases that match those selectors. +func (c *leases) List(opts v1.ListOptions) (result *v1beta1.LeaseList, err error) { + result = &v1beta1.LeaseList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("leases"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested leases. +func (c *leases) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("leases"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a lease and creates it. Returns the server's representation of the lease, and an error, if there is any. +func (c *leases) Create(lease *v1beta1.Lease) (result *v1beta1.Lease, err error) { + result = &v1beta1.Lease{} + err = c.client.Post(). + Namespace(c.ns). + Resource("leases"). + Body(lease). + Do(). + Into(result) + return +} + +// Update takes the representation of a lease and updates it. Returns the server's representation of the lease, and an error, if there is any. +func (c *leases) Update(lease *v1beta1.Lease) (result *v1beta1.Lease, err error) { + result = &v1beta1.Lease{} + err = c.client.Put(). + Namespace(c.ns). + Resource("leases"). + Name(lease.Name). + Body(lease). + Do(). + Into(result) + return +} + +// Delete takes name of the lease and deletes it. Returns an error if one occurs. +func (c *leases) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("leases"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *leases) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("leases"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched lease. +func (c *leases) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.Lease, err error) { + result = &v1beta1.Lease{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("leases"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD index 4c9f03aa..76f16bfa 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD @@ -34,22 +34,23 @@ go_library( "serviceaccount.go", "serviceaccount_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/core/v1", importpath = "k8s.io/client-go/kubernetes/typed/core/v1", deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", + "//staging/src/k8s.io/api/authentication/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go index 6ae5a668..e497661c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type ComponentStatusesGetter interface { type ComponentStatusInterface interface { Create(*v1.ComponentStatus) (*v1.ComponentStatus, error) Update(*v1.ComponentStatus) (*v1.ComponentStatus, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ComponentStatus, error) - List(opts meta_v1.ListOptions) (*v1.ComponentStatusList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ComponentStatus, error) + List(opts metav1.ListOptions) (*v1.ComponentStatusList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ComponentStatus, err error) ComponentStatusExpansion } @@ -59,7 +59,7 @@ func newComponentStatuses(c *CoreV1Client) *componentStatuses { } // Get takes name of the componentStatus, and returns the corresponding componentStatus object, and an error if there is any. -func (c *componentStatuses) Get(name string, options meta_v1.GetOptions) (result *v1.ComponentStatus, err error) { +func (c *componentStatuses) Get(name string, options metav1.GetOptions) (result *v1.ComponentStatus, err error) { result = &v1.ComponentStatus{} err = c.client.Get(). Resource("componentstatuses"). @@ -71,7 +71,7 @@ func (c *componentStatuses) Get(name string, options meta_v1.GetOptions) (result } // List takes label and field selectors, and returns the list of ComponentStatuses that match those selectors. -func (c *componentStatuses) List(opts meta_v1.ListOptions) (result *v1.ComponentStatusList, err error) { +func (c *componentStatuses) List(opts metav1.ListOptions) (result *v1.ComponentStatusList, err error) { result = &v1.ComponentStatusList{} err = c.client.Get(). Resource("componentstatuses"). @@ -82,7 +82,7 @@ func (c *componentStatuses) List(opts meta_v1.ListOptions) (result *v1.Component } // Watch returns a watch.Interface that watches the requested componentStatuses. -func (c *componentStatuses) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *componentStatuses) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Resource("componentstatuses"). @@ -114,7 +114,7 @@ func (c *componentStatuses) Update(componentStatus *v1.ComponentStatus) (result } // Delete takes name of the componentStatus and deletes it. Returns an error if one occurs. -func (c *componentStatuses) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *componentStatuses) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Resource("componentstatuses"). Name(name). @@ -124,7 +124,7 @@ func (c *componentStatuses) Delete(name string, options *meta_v1.DeleteOptions) } // DeleteCollection deletes a collection of objects. -func (c *componentStatuses) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *componentStatuses) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Resource("componentstatuses"). VersionedParams(&listOptions, scheme.ParameterCodec). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go index 3ae229f4..0984ae70 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type ConfigMapsGetter interface { type ConfigMapInterface interface { Create(*v1.ConfigMap) (*v1.ConfigMap, error) Update(*v1.ConfigMap) (*v1.ConfigMap, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ConfigMap, error) - List(opts meta_v1.ListOptions) (*v1.ConfigMapList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ConfigMap, error) + List(opts metav1.ListOptions) (*v1.ConfigMapList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ConfigMap, err error) ConfigMapExpansion } @@ -61,7 +61,7 @@ func newConfigMaps(c *CoreV1Client, namespace string) *configMaps { } // Get takes name of the configMap, and returns the corresponding configMap object, and an error if there is any. -func (c *configMaps) Get(name string, options meta_v1.GetOptions) (result *v1.ConfigMap, err error) { +func (c *configMaps) Get(name string, options metav1.GetOptions) (result *v1.ConfigMap, err error) { result = &v1.ConfigMap{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *configMaps) Get(name string, options meta_v1.GetOptions) (result *v1.Co } // List takes label and field selectors, and returns the list of ConfigMaps that match those selectors. -func (c *configMaps) List(opts meta_v1.ListOptions) (result *v1.ConfigMapList, err error) { +func (c *configMaps) List(opts metav1.ListOptions) (result *v1.ConfigMapList, err error) { result = &v1.ConfigMapList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *configMaps) List(opts meta_v1.ListOptions) (result *v1.ConfigMapList, e } // Watch returns a watch.Interface that watches the requested configMaps. -func (c *configMaps) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *configMaps) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *configMaps) Update(configMap *v1.ConfigMap) (result *v1.ConfigMap, err } // Delete takes name of the configMap and deletes it. Returns an error if one occurs. -func (c *configMaps) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *configMaps) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("configmaps"). @@ -132,7 +132,7 @@ func (c *configMaps) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *configMaps) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *configMaps) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("configmaps"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go index 2868baaa..dd821678 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type EndpointsGetter interface { type EndpointsInterface interface { Create(*v1.Endpoints) (*v1.Endpoints, error) Update(*v1.Endpoints) (*v1.Endpoints, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Endpoints, error) - List(opts meta_v1.ListOptions) (*v1.EndpointsList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Endpoints, error) + List(opts metav1.ListOptions) (*v1.EndpointsList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Endpoints, err error) EndpointsExpansion } @@ -61,7 +61,7 @@ func newEndpoints(c *CoreV1Client, namespace string) *endpoints { } // Get takes name of the endpoints, and returns the corresponding endpoints object, and an error if there is any. -func (c *endpoints) Get(name string, options meta_v1.GetOptions) (result *v1.Endpoints, err error) { +func (c *endpoints) Get(name string, options metav1.GetOptions) (result *v1.Endpoints, err error) { result = &v1.Endpoints{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *endpoints) Get(name string, options meta_v1.GetOptions) (result *v1.End } // List takes label and field selectors, and returns the list of Endpoints that match those selectors. -func (c *endpoints) List(opts meta_v1.ListOptions) (result *v1.EndpointsList, err error) { +func (c *endpoints) List(opts metav1.ListOptions) (result *v1.EndpointsList, err error) { result = &v1.EndpointsList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *endpoints) List(opts meta_v1.ListOptions) (result *v1.EndpointsList, er } // Watch returns a watch.Interface that watches the requested endpoints. -func (c *endpoints) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *endpoints) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *endpoints) Update(endpoints *v1.Endpoints) (result *v1.Endpoints, err e } // Delete takes name of the endpoints and deletes it. Returns an error if one occurs. -func (c *endpoints) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *endpoints) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("endpoints"). @@ -132,7 +132,7 @@ func (c *endpoints) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *endpoints) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *endpoints) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("endpoints"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go index 56506234..57d30f9f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type EventsGetter interface { type EventInterface interface { Create(*v1.Event) (*v1.Event, error) Update(*v1.Event) (*v1.Event, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Event, error) - List(opts meta_v1.ListOptions) (*v1.EventList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Event, error) + List(opts metav1.ListOptions) (*v1.EventList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Event, err error) EventExpansion } @@ -61,7 +61,7 @@ func newEvents(c *CoreV1Client, namespace string) *events { } // Get takes name of the event, and returns the corresponding event object, and an error if there is any. -func (c *events) Get(name string, options meta_v1.GetOptions) (result *v1.Event, err error) { +func (c *events) Get(name string, options metav1.GetOptions) (result *v1.Event, err error) { result = &v1.Event{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *events) Get(name string, options meta_v1.GetOptions) (result *v1.Event, } // List takes label and field selectors, and returns the list of Events that match those selectors. -func (c *events) List(opts meta_v1.ListOptions) (result *v1.EventList, err error) { +func (c *events) List(opts metav1.ListOptions) (result *v1.EventList, err error) { result = &v1.EventList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *events) List(opts meta_v1.ListOptions) (result *v1.EventList, err error } // Watch returns a watch.Interface that watches the requested events. -func (c *events) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *events) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *events) Update(event *v1.Event) (result *v1.Event, err error) { } // Delete takes name of the event and deletes it. Returns an error if one occurs. -func (c *events) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *events) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("events"). @@ -132,7 +132,7 @@ func (c *events) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *events) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *events) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("events"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go index 396e5ca4..5b385668 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type LimitRangesGetter interface { type LimitRangeInterface interface { Create(*v1.LimitRange) (*v1.LimitRange, error) Update(*v1.LimitRange) (*v1.LimitRange, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.LimitRange, error) - List(opts meta_v1.ListOptions) (*v1.LimitRangeList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.LimitRange, error) + List(opts metav1.ListOptions) (*v1.LimitRangeList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.LimitRange, err error) LimitRangeExpansion } @@ -61,7 +61,7 @@ func newLimitRanges(c *CoreV1Client, namespace string) *limitRanges { } // Get takes name of the limitRange, and returns the corresponding limitRange object, and an error if there is any. -func (c *limitRanges) Get(name string, options meta_v1.GetOptions) (result *v1.LimitRange, err error) { +func (c *limitRanges) Get(name string, options metav1.GetOptions) (result *v1.LimitRange, err error) { result = &v1.LimitRange{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *limitRanges) Get(name string, options meta_v1.GetOptions) (result *v1.L } // List takes label and field selectors, and returns the list of LimitRanges that match those selectors. -func (c *limitRanges) List(opts meta_v1.ListOptions) (result *v1.LimitRangeList, err error) { +func (c *limitRanges) List(opts metav1.ListOptions) (result *v1.LimitRangeList, err error) { result = &v1.LimitRangeList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *limitRanges) List(opts meta_v1.ListOptions) (result *v1.LimitRangeList, } // Watch returns a watch.Interface that watches the requested limitRanges. -func (c *limitRanges) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *limitRanges) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *limitRanges) Update(limitRange *v1.LimitRange) (result *v1.LimitRange, } // Delete takes name of the limitRange and deletes it. Returns an error if one occurs. -func (c *limitRanges) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *limitRanges) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("limitranges"). @@ -132,7 +132,7 @@ func (c *limitRanges) Delete(name string, options *meta_v1.DeleteOptions) error } // DeleteCollection deletes a collection of objects. -func (c *limitRanges) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *limitRanges) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("limitranges"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go index 707b3e97..e22d07de 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,10 +38,10 @@ type NamespaceInterface interface { Create(*v1.Namespace) (*v1.Namespace, error) Update(*v1.Namespace) (*v1.Namespace, error) UpdateStatus(*v1.Namespace) (*v1.Namespace, error) - Delete(name string, options *meta_v1.DeleteOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Namespace, error) - List(opts meta_v1.ListOptions) (*v1.NamespaceList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + Get(name string, options metav1.GetOptions) (*v1.Namespace, error) + List(opts metav1.ListOptions) (*v1.NamespaceList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Namespace, err error) NamespaceExpansion } @@ -59,7 +59,7 @@ func newNamespaces(c *CoreV1Client) *namespaces { } // Get takes name of the namespace, and returns the corresponding namespace object, and an error if there is any. -func (c *namespaces) Get(name string, options meta_v1.GetOptions) (result *v1.Namespace, err error) { +func (c *namespaces) Get(name string, options metav1.GetOptions) (result *v1.Namespace, err error) { result = &v1.Namespace{} err = c.client.Get(). Resource("namespaces"). @@ -71,7 +71,7 @@ func (c *namespaces) Get(name string, options meta_v1.GetOptions) (result *v1.Na } // List takes label and field selectors, and returns the list of Namespaces that match those selectors. -func (c *namespaces) List(opts meta_v1.ListOptions) (result *v1.NamespaceList, err error) { +func (c *namespaces) List(opts metav1.ListOptions) (result *v1.NamespaceList, err error) { result = &v1.NamespaceList{} err = c.client.Get(). Resource("namespaces"). @@ -82,7 +82,7 @@ func (c *namespaces) List(opts meta_v1.ListOptions) (result *v1.NamespaceList, e } // Watch returns a watch.Interface that watches the requested namespaces. -func (c *namespaces) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *namespaces) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Resource("namespaces"). @@ -129,7 +129,7 @@ func (c *namespaces) UpdateStatus(namespace *v1.Namespace) (result *v1.Namespace } // Delete takes name of the namespace and deletes it. Returns an error if one occurs. -func (c *namespaces) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *namespaces) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Resource("namespaces"). Name(name). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go index 1462d254..5c769c11 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type NodeInterface interface { Create(*v1.Node) (*v1.Node, error) Update(*v1.Node) (*v1.Node, error) UpdateStatus(*v1.Node) (*v1.Node, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Node, error) - List(opts meta_v1.ListOptions) (*v1.NodeList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Node, error) + List(opts metav1.ListOptions) (*v1.NodeList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Node, err error) NodeExpansion } @@ -60,7 +60,7 @@ func newNodes(c *CoreV1Client) *nodes { } // Get takes name of the node, and returns the corresponding node object, and an error if there is any. -func (c *nodes) Get(name string, options meta_v1.GetOptions) (result *v1.Node, err error) { +func (c *nodes) Get(name string, options metav1.GetOptions) (result *v1.Node, err error) { result = &v1.Node{} err = c.client.Get(). Resource("nodes"). @@ -72,7 +72,7 @@ func (c *nodes) Get(name string, options meta_v1.GetOptions) (result *v1.Node, e } // List takes label and field selectors, and returns the list of Nodes that match those selectors. -func (c *nodes) List(opts meta_v1.ListOptions) (result *v1.NodeList, err error) { +func (c *nodes) List(opts metav1.ListOptions) (result *v1.NodeList, err error) { result = &v1.NodeList{} err = c.client.Get(). Resource("nodes"). @@ -83,7 +83,7 @@ func (c *nodes) List(opts meta_v1.ListOptions) (result *v1.NodeList, err error) } // Watch returns a watch.Interface that watches the requested nodes. -func (c *nodes) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *nodes) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Resource("nodes"). @@ -130,7 +130,7 @@ func (c *nodes) UpdateStatus(node *v1.Node) (result *v1.Node, err error) { } // Delete takes name of the node and deletes it. Returns an error if one occurs. -func (c *nodes) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *nodes) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Resource("nodes"). Name(name). @@ -140,7 +140,7 @@ func (c *nodes) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *nodes) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *nodes) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Resource("nodes"). VersionedParams(&listOptions, scheme.ParameterCodec). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go index f9010119..d5f19aef 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type PersistentVolumeInterface interface { Create(*v1.PersistentVolume) (*v1.PersistentVolume, error) Update(*v1.PersistentVolume) (*v1.PersistentVolume, error) UpdateStatus(*v1.PersistentVolume) (*v1.PersistentVolume, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.PersistentVolume, error) - List(opts meta_v1.ListOptions) (*v1.PersistentVolumeList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.PersistentVolume, error) + List(opts metav1.ListOptions) (*v1.PersistentVolumeList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.PersistentVolume, err error) PersistentVolumeExpansion } @@ -60,7 +60,7 @@ func newPersistentVolumes(c *CoreV1Client) *persistentVolumes { } // Get takes name of the persistentVolume, and returns the corresponding persistentVolume object, and an error if there is any. -func (c *persistentVolumes) Get(name string, options meta_v1.GetOptions) (result *v1.PersistentVolume, err error) { +func (c *persistentVolumes) Get(name string, options metav1.GetOptions) (result *v1.PersistentVolume, err error) { result = &v1.PersistentVolume{} err = c.client.Get(). Resource("persistentvolumes"). @@ -72,7 +72,7 @@ func (c *persistentVolumes) Get(name string, options meta_v1.GetOptions) (result } // List takes label and field selectors, and returns the list of PersistentVolumes that match those selectors. -func (c *persistentVolumes) List(opts meta_v1.ListOptions) (result *v1.PersistentVolumeList, err error) { +func (c *persistentVolumes) List(opts metav1.ListOptions) (result *v1.PersistentVolumeList, err error) { result = &v1.PersistentVolumeList{} err = c.client.Get(). Resource("persistentvolumes"). @@ -83,7 +83,7 @@ func (c *persistentVolumes) List(opts meta_v1.ListOptions) (result *v1.Persisten } // Watch returns a watch.Interface that watches the requested persistentVolumes. -func (c *persistentVolumes) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *persistentVolumes) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Resource("persistentvolumes"). @@ -130,7 +130,7 @@ func (c *persistentVolumes) UpdateStatus(persistentVolume *v1.PersistentVolume) } // Delete takes name of the persistentVolume and deletes it. Returns an error if one occurs. -func (c *persistentVolumes) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *persistentVolumes) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Resource("persistentvolumes"). Name(name). @@ -140,7 +140,7 @@ func (c *persistentVolumes) Delete(name string, options *meta_v1.DeleteOptions) } // DeleteCollection deletes a collection of objects. -func (c *persistentVolumes) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *persistentVolumes) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Resource("persistentvolumes"). VersionedParams(&listOptions, scheme.ParameterCodec). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go index 59253d5e..d32ae5df 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type PersistentVolumeClaimInterface interface { Create(*v1.PersistentVolumeClaim) (*v1.PersistentVolumeClaim, error) Update(*v1.PersistentVolumeClaim) (*v1.PersistentVolumeClaim, error) UpdateStatus(*v1.PersistentVolumeClaim) (*v1.PersistentVolumeClaim, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.PersistentVolumeClaim, error) - List(opts meta_v1.ListOptions) (*v1.PersistentVolumeClaimList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.PersistentVolumeClaim, error) + List(opts metav1.ListOptions) (*v1.PersistentVolumeClaimList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.PersistentVolumeClaim, err error) PersistentVolumeClaimExpansion } @@ -62,7 +62,7 @@ func newPersistentVolumeClaims(c *CoreV1Client, namespace string) *persistentVol } // Get takes name of the persistentVolumeClaim, and returns the corresponding persistentVolumeClaim object, and an error if there is any. -func (c *persistentVolumeClaims) Get(name string, options meta_v1.GetOptions) (result *v1.PersistentVolumeClaim, err error) { +func (c *persistentVolumeClaims) Get(name string, options metav1.GetOptions) (result *v1.PersistentVolumeClaim, err error) { result = &v1.PersistentVolumeClaim{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *persistentVolumeClaims) Get(name string, options meta_v1.GetOptions) (r } // List takes label and field selectors, and returns the list of PersistentVolumeClaims that match those selectors. -func (c *persistentVolumeClaims) List(opts meta_v1.ListOptions) (result *v1.PersistentVolumeClaimList, err error) { +func (c *persistentVolumeClaims) List(opts metav1.ListOptions) (result *v1.PersistentVolumeClaimList, err error) { result = &v1.PersistentVolumeClaimList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *persistentVolumeClaims) List(opts meta_v1.ListOptions) (result *v1.Pers } // Watch returns a watch.Interface that watches the requested persistentVolumeClaims. -func (c *persistentVolumeClaims) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *persistentVolumeClaims) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *persistentVolumeClaims) UpdateStatus(persistentVolumeClaim *v1.Persiste } // Delete takes name of the persistentVolumeClaim and deletes it. Returns an error if one occurs. -func (c *persistentVolumeClaims) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *persistentVolumeClaims) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("persistentvolumeclaims"). @@ -149,7 +149,7 @@ func (c *persistentVolumeClaims) Delete(name string, options *meta_v1.DeleteOpti } // DeleteCollection deletes a collection of objects. -func (c *persistentVolumeClaims) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *persistentVolumeClaims) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("persistentvolumeclaims"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go index 8eb7ba8b..b19c5a5c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type PodInterface interface { Create(*v1.Pod) (*v1.Pod, error) Update(*v1.Pod) (*v1.Pod, error) UpdateStatus(*v1.Pod) (*v1.Pod, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Pod, error) - List(opts meta_v1.ListOptions) (*v1.PodList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Pod, error) + List(opts metav1.ListOptions) (*v1.PodList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Pod, err error) PodExpansion } @@ -62,7 +62,7 @@ func newPods(c *CoreV1Client, namespace string) *pods { } // Get takes name of the pod, and returns the corresponding pod object, and an error if there is any. -func (c *pods) Get(name string, options meta_v1.GetOptions) (result *v1.Pod, err error) { +func (c *pods) Get(name string, options metav1.GetOptions) (result *v1.Pod, err error) { result = &v1.Pod{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *pods) Get(name string, options meta_v1.GetOptions) (result *v1.Pod, err } // List takes label and field selectors, and returns the list of Pods that match those selectors. -func (c *pods) List(opts meta_v1.ListOptions) (result *v1.PodList, err error) { +func (c *pods) List(opts metav1.ListOptions) (result *v1.PodList, err error) { result = &v1.PodList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *pods) List(opts meta_v1.ListOptions) (result *v1.PodList, err error) { } // Watch returns a watch.Interface that watches the requested pods. -func (c *pods) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *pods) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *pods) UpdateStatus(pod *v1.Pod) (result *v1.Pod, err error) { } // Delete takes name of the pod and deletes it. Returns an error if one occurs. -func (c *pods) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *pods) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("pods"). @@ -149,7 +149,7 @@ func (c *pods) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *pods) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *pods) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("pods"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go index d99d8c3b..d644e17d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type PodTemplatesGetter interface { type PodTemplateInterface interface { Create(*v1.PodTemplate) (*v1.PodTemplate, error) Update(*v1.PodTemplate) (*v1.PodTemplate, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.PodTemplate, error) - List(opts meta_v1.ListOptions) (*v1.PodTemplateList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.PodTemplate, error) + List(opts metav1.ListOptions) (*v1.PodTemplateList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.PodTemplate, err error) PodTemplateExpansion } @@ -61,7 +61,7 @@ func newPodTemplates(c *CoreV1Client, namespace string) *podTemplates { } // Get takes name of the podTemplate, and returns the corresponding podTemplate object, and an error if there is any. -func (c *podTemplates) Get(name string, options meta_v1.GetOptions) (result *v1.PodTemplate, err error) { +func (c *podTemplates) Get(name string, options metav1.GetOptions) (result *v1.PodTemplate, err error) { result = &v1.PodTemplate{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *podTemplates) Get(name string, options meta_v1.GetOptions) (result *v1. } // List takes label and field selectors, and returns the list of PodTemplates that match those selectors. -func (c *podTemplates) List(opts meta_v1.ListOptions) (result *v1.PodTemplateList, err error) { +func (c *podTemplates) List(opts metav1.ListOptions) (result *v1.PodTemplateList, err error) { result = &v1.PodTemplateList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *podTemplates) List(opts meta_v1.ListOptions) (result *v1.PodTemplateLis } // Watch returns a watch.Interface that watches the requested podTemplates. -func (c *podTemplates) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *podTemplates) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *podTemplates) Update(podTemplate *v1.PodTemplate) (result *v1.PodTempla } // Delete takes name of the podTemplate and deletes it. Returns an error if one occurs. -func (c *podTemplates) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *podTemplates) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("podtemplates"). @@ -132,7 +132,7 @@ func (c *podTemplates) Delete(name string, options *meta_v1.DeleteOptions) error } // DeleteCollection deletes a collection of objects. -func (c *podTemplates) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *podTemplates) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("podtemplates"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go index 7741f970..17622f1c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go @@ -21,7 +21,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" v1beta1 "k8s.io/api/extensions/v1beta1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -39,13 +39,13 @@ type ReplicationControllerInterface interface { Create(*v1.ReplicationController) (*v1.ReplicationController, error) Update(*v1.ReplicationController) (*v1.ReplicationController, error) UpdateStatus(*v1.ReplicationController) (*v1.ReplicationController, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ReplicationController, error) - List(opts meta_v1.ListOptions) (*v1.ReplicationControllerList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ReplicationController, error) + List(opts metav1.ListOptions) (*v1.ReplicationControllerList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ReplicationController, err error) - GetScale(replicationControllerName string, options meta_v1.GetOptions) (*v1beta1.Scale, error) + GetScale(replicationControllerName string, options metav1.GetOptions) (*v1beta1.Scale, error) UpdateScale(replicationControllerName string, scale *v1beta1.Scale) (*v1beta1.Scale, error) ReplicationControllerExpansion @@ -66,7 +66,7 @@ func newReplicationControllers(c *CoreV1Client, namespace string) *replicationCo } // Get takes name of the replicationController, and returns the corresponding replicationController object, and an error if there is any. -func (c *replicationControllers) Get(name string, options meta_v1.GetOptions) (result *v1.ReplicationController, err error) { +func (c *replicationControllers) Get(name string, options metav1.GetOptions) (result *v1.ReplicationController, err error) { result = &v1.ReplicationController{} err = c.client.Get(). Namespace(c.ns). @@ -79,7 +79,7 @@ func (c *replicationControllers) Get(name string, options meta_v1.GetOptions) (r } // List takes label and field selectors, and returns the list of ReplicationControllers that match those selectors. -func (c *replicationControllers) List(opts meta_v1.ListOptions) (result *v1.ReplicationControllerList, err error) { +func (c *replicationControllers) List(opts metav1.ListOptions) (result *v1.ReplicationControllerList, err error) { result = &v1.ReplicationControllerList{} err = c.client.Get(). Namespace(c.ns). @@ -91,7 +91,7 @@ func (c *replicationControllers) List(opts meta_v1.ListOptions) (result *v1.Repl } // Watch returns a watch.Interface that watches the requested replicationControllers. -func (c *replicationControllers) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *replicationControllers) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -142,7 +142,7 @@ func (c *replicationControllers) UpdateStatus(replicationController *v1.Replicat } // Delete takes name of the replicationController and deletes it. Returns an error if one occurs. -func (c *replicationControllers) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *replicationControllers) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("replicationcontrollers"). @@ -153,7 +153,7 @@ func (c *replicationControllers) Delete(name string, options *meta_v1.DeleteOpti } // DeleteCollection deletes a collection of objects. -func (c *replicationControllers) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *replicationControllers) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("replicationcontrollers"). @@ -178,7 +178,7 @@ func (c *replicationControllers) Patch(name string, pt types.PatchType, data []b } // GetScale takes name of the replicationController, and returns the corresponding v1beta1.Scale object, and an error if there is any. -func (c *replicationControllers) GetScale(replicationControllerName string, options meta_v1.GetOptions) (result *v1beta1.Scale, err error) { +func (c *replicationControllers) GetScale(replicationControllerName string, options metav1.GetOptions) (result *v1beta1.Scale, err error) { result = &v1beta1.Scale{} err = c.client.Get(). Namespace(c.ns). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go index 7662a028..8b74a404 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,11 +38,11 @@ type ResourceQuotaInterface interface { Create(*v1.ResourceQuota) (*v1.ResourceQuota, error) Update(*v1.ResourceQuota) (*v1.ResourceQuota, error) UpdateStatus(*v1.ResourceQuota) (*v1.ResourceQuota, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ResourceQuota, error) - List(opts meta_v1.ListOptions) (*v1.ResourceQuotaList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ResourceQuota, error) + List(opts metav1.ListOptions) (*v1.ResourceQuotaList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ResourceQuota, err error) ResourceQuotaExpansion } @@ -62,7 +62,7 @@ func newResourceQuotas(c *CoreV1Client, namespace string) *resourceQuotas { } // Get takes name of the resourceQuota, and returns the corresponding resourceQuota object, and an error if there is any. -func (c *resourceQuotas) Get(name string, options meta_v1.GetOptions) (result *v1.ResourceQuota, err error) { +func (c *resourceQuotas) Get(name string, options metav1.GetOptions) (result *v1.ResourceQuota, err error) { result = &v1.ResourceQuota{} err = c.client.Get(). Namespace(c.ns). @@ -75,7 +75,7 @@ func (c *resourceQuotas) Get(name string, options meta_v1.GetOptions) (result *v } // List takes label and field selectors, and returns the list of ResourceQuotas that match those selectors. -func (c *resourceQuotas) List(opts meta_v1.ListOptions) (result *v1.ResourceQuotaList, err error) { +func (c *resourceQuotas) List(opts metav1.ListOptions) (result *v1.ResourceQuotaList, err error) { result = &v1.ResourceQuotaList{} err = c.client.Get(). Namespace(c.ns). @@ -87,7 +87,7 @@ func (c *resourceQuotas) List(opts meta_v1.ListOptions) (result *v1.ResourceQuot } // Watch returns a watch.Interface that watches the requested resourceQuotas. -func (c *resourceQuotas) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *resourceQuotas) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -138,7 +138,7 @@ func (c *resourceQuotas) UpdateStatus(resourceQuota *v1.ResourceQuota) (result * } // Delete takes name of the resourceQuota and deletes it. Returns an error if one occurs. -func (c *resourceQuotas) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *resourceQuotas) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("resourcequotas"). @@ -149,7 +149,7 @@ func (c *resourceQuotas) Delete(name string, options *meta_v1.DeleteOptions) err } // DeleteCollection deletes a collection of objects. -func (c *resourceQuotas) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *resourceQuotas) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("resourcequotas"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go index 5d149f8c..4ea9796b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type SecretsGetter interface { type SecretInterface interface { Create(*v1.Secret) (*v1.Secret, error) Update(*v1.Secret) (*v1.Secret, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Secret, error) - List(opts meta_v1.ListOptions) (*v1.SecretList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Secret, error) + List(opts metav1.ListOptions) (*v1.SecretList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Secret, err error) SecretExpansion } @@ -61,7 +61,7 @@ func newSecrets(c *CoreV1Client, namespace string) *secrets { } // Get takes name of the secret, and returns the corresponding secret object, and an error if there is any. -func (c *secrets) Get(name string, options meta_v1.GetOptions) (result *v1.Secret, err error) { +func (c *secrets) Get(name string, options metav1.GetOptions) (result *v1.Secret, err error) { result = &v1.Secret{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *secrets) Get(name string, options meta_v1.GetOptions) (result *v1.Secre } // List takes label and field selectors, and returns the list of Secrets that match those selectors. -func (c *secrets) List(opts meta_v1.ListOptions) (result *v1.SecretList, err error) { +func (c *secrets) List(opts metav1.ListOptions) (result *v1.SecretList, err error) { result = &v1.SecretList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *secrets) List(opts meta_v1.ListOptions) (result *v1.SecretList, err err } // Watch returns a watch.Interface that watches the requested secrets. -func (c *secrets) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *secrets) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *secrets) Update(secret *v1.Secret) (result *v1.Secret, err error) { } // Delete takes name of the secret and deletes it. Returns an error if one occurs. -func (c *secrets) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *secrets) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("secrets"). @@ -132,7 +132,7 @@ func (c *secrets) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *secrets) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *secrets) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("secrets"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go index ec8646a2..6c42ca87 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -38,10 +38,10 @@ type ServiceInterface interface { Create(*v1.Service) (*v1.Service, error) Update(*v1.Service) (*v1.Service, error) UpdateStatus(*v1.Service) (*v1.Service, error) - Delete(name string, options *meta_v1.DeleteOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Service, error) - List(opts meta_v1.ListOptions) (*v1.ServiceList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + Get(name string, options metav1.GetOptions) (*v1.Service, error) + List(opts metav1.ListOptions) (*v1.ServiceList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Service, err error) ServiceExpansion } @@ -61,7 +61,7 @@ func newServices(c *CoreV1Client, namespace string) *services { } // Get takes name of the service, and returns the corresponding service object, and an error if there is any. -func (c *services) Get(name string, options meta_v1.GetOptions) (result *v1.Service, err error) { +func (c *services) Get(name string, options metav1.GetOptions) (result *v1.Service, err error) { result = &v1.Service{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *services) Get(name string, options meta_v1.GetOptions) (result *v1.Serv } // List takes label and field selectors, and returns the list of Services that match those selectors. -func (c *services) List(opts meta_v1.ListOptions) (result *v1.ServiceList, err error) { +func (c *services) List(opts metav1.ListOptions) (result *v1.ServiceList, err error) { result = &v1.ServiceList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *services) List(opts meta_v1.ListOptions) (result *v1.ServiceList, err e } // Watch returns a watch.Interface that watches the requested services. -func (c *services) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *services) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -137,7 +137,7 @@ func (c *services) UpdateStatus(service *v1.Service) (result *v1.Service, err er } // Delete takes name of the service and deletes it. Returns an error if one occurs. -func (c *services) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *services) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("services"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go index ba2a2794..f3ab7eb8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/core/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type ServiceAccountsGetter interface { type ServiceAccountInterface interface { Create(*v1.ServiceAccount) (*v1.ServiceAccount, error) Update(*v1.ServiceAccount) (*v1.ServiceAccount, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ServiceAccount, error) - List(opts meta_v1.ListOptions) (*v1.ServiceAccountList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ServiceAccount, error) + List(opts metav1.ListOptions) (*v1.ServiceAccountList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ServiceAccount, err error) ServiceAccountExpansion } @@ -61,7 +61,7 @@ func newServiceAccounts(c *CoreV1Client, namespace string) *serviceAccounts { } // Get takes name of the serviceAccount, and returns the corresponding serviceAccount object, and an error if there is any. -func (c *serviceAccounts) Get(name string, options meta_v1.GetOptions) (result *v1.ServiceAccount, err error) { +func (c *serviceAccounts) Get(name string, options metav1.GetOptions) (result *v1.ServiceAccount, err error) { result = &v1.ServiceAccount{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *serviceAccounts) Get(name string, options meta_v1.GetOptions) (result * } // List takes label and field selectors, and returns the list of ServiceAccounts that match those selectors. -func (c *serviceAccounts) List(opts meta_v1.ListOptions) (result *v1.ServiceAccountList, err error) { +func (c *serviceAccounts) List(opts metav1.ListOptions) (result *v1.ServiceAccountList, err error) { result = &v1.ServiceAccountList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *serviceAccounts) List(opts meta_v1.ListOptions) (result *v1.ServiceAcco } // Watch returns a watch.Interface that watches the requested serviceAccounts. -func (c *serviceAccounts) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *serviceAccounts) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *serviceAccounts) Update(serviceAccount *v1.ServiceAccount) (result *v1. } // Delete takes name of the serviceAccount and deletes it. Returns an error if one occurs. -func (c *serviceAccounts) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *serviceAccounts) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("serviceaccounts"). @@ -132,7 +132,7 @@ func (c *serviceAccounts) Delete(name string, options *meta_v1.DeleteOptions) er } // DeleteCollection deletes a collection of objects. -func (c *serviceAccounts) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *serviceAccounts) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("serviceaccounts"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD index 307884cc..c395bb61 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD @@ -8,16 +8,17 @@ go_library( "events_client.go", "generated_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/events/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD index 5ad97686..062da621 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD @@ -20,17 +20,18 @@ go_library( "scale.go", "scale_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", deps = [ - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD index 7a2e3e2b..8d4be083 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD @@ -13,15 +13,16 @@ go_library( "networking_client.go", "networkpolicy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/networking/v1", importpath = "k8s.io/client-go/kubernetes/typed/networking/v1", deps = [ - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/networking/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go index c2eb2e79..d8f0a6b4 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/networking/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type NetworkPoliciesGetter interface { type NetworkPolicyInterface interface { Create(*v1.NetworkPolicy) (*v1.NetworkPolicy, error) Update(*v1.NetworkPolicy) (*v1.NetworkPolicy, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.NetworkPolicy, error) - List(opts meta_v1.ListOptions) (*v1.NetworkPolicyList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.NetworkPolicy, error) + List(opts metav1.ListOptions) (*v1.NetworkPolicyList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.NetworkPolicy, err error) NetworkPolicyExpansion } @@ -61,7 +61,7 @@ func newNetworkPolicies(c *NetworkingV1Client, namespace string) *networkPolicie } // Get takes name of the networkPolicy, and returns the corresponding networkPolicy object, and an error if there is any. -func (c *networkPolicies) Get(name string, options meta_v1.GetOptions) (result *v1.NetworkPolicy, err error) { +func (c *networkPolicies) Get(name string, options metav1.GetOptions) (result *v1.NetworkPolicy, err error) { result = &v1.NetworkPolicy{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *networkPolicies) Get(name string, options meta_v1.GetOptions) (result * } // List takes label and field selectors, and returns the list of NetworkPolicies that match those selectors. -func (c *networkPolicies) List(opts meta_v1.ListOptions) (result *v1.NetworkPolicyList, err error) { +func (c *networkPolicies) List(opts metav1.ListOptions) (result *v1.NetworkPolicyList, err error) { result = &v1.NetworkPolicyList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *networkPolicies) List(opts meta_v1.ListOptions) (result *v1.NetworkPoli } // Watch returns a watch.Interface that watches the requested networkPolicies. -func (c *networkPolicies) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *networkPolicies) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *networkPolicies) Update(networkPolicy *v1.NetworkPolicy) (result *v1.Ne } // Delete takes name of the networkPolicy and deletes it. Returns an error if one occurs. -func (c *networkPolicies) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *networkPolicies) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("networkpolicies"). @@ -132,7 +132,7 @@ func (c *networkPolicies) Delete(name string, options *meta_v1.DeleteOptions) er } // DeleteCollection deletes a collection of objects. -func (c *networkPolicies) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *networkPolicies) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("networkpolicies"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD index 92606b3c..6a6c2f74 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD @@ -16,15 +16,16 @@ go_library( "podsecuritypolicy.go", "policy_client.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/policy/v1beta1", deps = [ - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD index 76e85d4f..fdd7fb0f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD @@ -16,15 +16,16 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1", importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1", deps = [ - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go index f3db3beb..c4299d4c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type ClusterRolesGetter interface { type ClusterRoleInterface interface { Create(*v1.ClusterRole) (*v1.ClusterRole, error) Update(*v1.ClusterRole) (*v1.ClusterRole, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ClusterRole, error) - List(opts meta_v1.ListOptions) (*v1.ClusterRoleList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ClusterRole, error) + List(opts metav1.ListOptions) (*v1.ClusterRoleList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ClusterRole, err error) ClusterRoleExpansion } @@ -59,7 +59,7 @@ func newClusterRoles(c *RbacV1Client) *clusterRoles { } // Get takes name of the clusterRole, and returns the corresponding clusterRole object, and an error if there is any. -func (c *clusterRoles) Get(name string, options meta_v1.GetOptions) (result *v1.ClusterRole, err error) { +func (c *clusterRoles) Get(name string, options metav1.GetOptions) (result *v1.ClusterRole, err error) { result = &v1.ClusterRole{} err = c.client.Get(). Resource("clusterroles"). @@ -71,7 +71,7 @@ func (c *clusterRoles) Get(name string, options meta_v1.GetOptions) (result *v1. } // List takes label and field selectors, and returns the list of ClusterRoles that match those selectors. -func (c *clusterRoles) List(opts meta_v1.ListOptions) (result *v1.ClusterRoleList, err error) { +func (c *clusterRoles) List(opts metav1.ListOptions) (result *v1.ClusterRoleList, err error) { result = &v1.ClusterRoleList{} err = c.client.Get(). Resource("clusterroles"). @@ -82,7 +82,7 @@ func (c *clusterRoles) List(opts meta_v1.ListOptions) (result *v1.ClusterRoleLis } // Watch returns a watch.Interface that watches the requested clusterRoles. -func (c *clusterRoles) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *clusterRoles) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Resource("clusterroles"). @@ -114,7 +114,7 @@ func (c *clusterRoles) Update(clusterRole *v1.ClusterRole) (result *v1.ClusterRo } // Delete takes name of the clusterRole and deletes it. Returns an error if one occurs. -func (c *clusterRoles) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *clusterRoles) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Resource("clusterroles"). Name(name). @@ -124,7 +124,7 @@ func (c *clusterRoles) Delete(name string, options *meta_v1.DeleteOptions) error } // DeleteCollection deletes a collection of objects. -func (c *clusterRoles) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *clusterRoles) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Resource("clusterroles"). VersionedParams(&listOptions, scheme.ParameterCodec). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go index 21dda498..30c0469a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type ClusterRoleBindingsGetter interface { type ClusterRoleBindingInterface interface { Create(*v1.ClusterRoleBinding) (*v1.ClusterRoleBinding, error) Update(*v1.ClusterRoleBinding) (*v1.ClusterRoleBinding, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.ClusterRoleBinding, error) - List(opts meta_v1.ListOptions) (*v1.ClusterRoleBindingList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.ClusterRoleBinding, error) + List(opts metav1.ListOptions) (*v1.ClusterRoleBindingList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.ClusterRoleBinding, err error) ClusterRoleBindingExpansion } @@ -59,7 +59,7 @@ func newClusterRoleBindings(c *RbacV1Client) *clusterRoleBindings { } // Get takes name of the clusterRoleBinding, and returns the corresponding clusterRoleBinding object, and an error if there is any. -func (c *clusterRoleBindings) Get(name string, options meta_v1.GetOptions) (result *v1.ClusterRoleBinding, err error) { +func (c *clusterRoleBindings) Get(name string, options metav1.GetOptions) (result *v1.ClusterRoleBinding, err error) { result = &v1.ClusterRoleBinding{} err = c.client.Get(). Resource("clusterrolebindings"). @@ -71,7 +71,7 @@ func (c *clusterRoleBindings) Get(name string, options meta_v1.GetOptions) (resu } // List takes label and field selectors, and returns the list of ClusterRoleBindings that match those selectors. -func (c *clusterRoleBindings) List(opts meta_v1.ListOptions) (result *v1.ClusterRoleBindingList, err error) { +func (c *clusterRoleBindings) List(opts metav1.ListOptions) (result *v1.ClusterRoleBindingList, err error) { result = &v1.ClusterRoleBindingList{} err = c.client.Get(). Resource("clusterrolebindings"). @@ -82,7 +82,7 @@ func (c *clusterRoleBindings) List(opts meta_v1.ListOptions) (result *v1.Cluster } // Watch returns a watch.Interface that watches the requested clusterRoleBindings. -func (c *clusterRoleBindings) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *clusterRoleBindings) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Resource("clusterrolebindings"). @@ -114,7 +114,7 @@ func (c *clusterRoleBindings) Update(clusterRoleBinding *v1.ClusterRoleBinding) } // Delete takes name of the clusterRoleBinding and deletes it. Returns an error if one occurs. -func (c *clusterRoleBindings) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *clusterRoleBindings) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Resource("clusterrolebindings"). Name(name). @@ -124,7 +124,7 @@ func (c *clusterRoleBindings) Delete(name string, options *meta_v1.DeleteOptions } // DeleteCollection deletes a collection of objects. -func (c *clusterRoleBindings) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *clusterRoleBindings) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Resource("clusterrolebindings"). VersionedParams(&listOptions, scheme.ParameterCodec). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go index cb7c5c4e..81ea12a9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type RolesGetter interface { type RoleInterface interface { Create(*v1.Role) (*v1.Role, error) Update(*v1.Role) (*v1.Role, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.Role, error) - List(opts meta_v1.ListOptions) (*v1.RoleList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.Role, error) + List(opts metav1.ListOptions) (*v1.RoleList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Role, err error) RoleExpansion } @@ -61,7 +61,7 @@ func newRoles(c *RbacV1Client, namespace string) *roles { } // Get takes name of the role, and returns the corresponding role object, and an error if there is any. -func (c *roles) Get(name string, options meta_v1.GetOptions) (result *v1.Role, err error) { +func (c *roles) Get(name string, options metav1.GetOptions) (result *v1.Role, err error) { result = &v1.Role{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *roles) Get(name string, options meta_v1.GetOptions) (result *v1.Role, e } // List takes label and field selectors, and returns the list of Roles that match those selectors. -func (c *roles) List(opts meta_v1.ListOptions) (result *v1.RoleList, err error) { +func (c *roles) List(opts metav1.ListOptions) (result *v1.RoleList, err error) { result = &v1.RoleList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *roles) List(opts meta_v1.ListOptions) (result *v1.RoleList, err error) } // Watch returns a watch.Interface that watches the requested roles. -func (c *roles) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *roles) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *roles) Update(role *v1.Role) (result *v1.Role, err error) { } // Delete takes name of the role and deletes it. Returns an error if one occurs. -func (c *roles) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *roles) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("roles"). @@ -132,7 +132,7 @@ func (c *roles) Delete(name string, options *meta_v1.DeleteOptions) error { } // DeleteCollection deletes a collection of objects. -func (c *roles) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *roles) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("roles"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go index a19010fa..17c6f991 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/rbac/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type RoleBindingsGetter interface { type RoleBindingInterface interface { Create(*v1.RoleBinding) (*v1.RoleBinding, error) Update(*v1.RoleBinding) (*v1.RoleBinding, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.RoleBinding, error) - List(opts meta_v1.ListOptions) (*v1.RoleBindingList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.RoleBinding, error) + List(opts metav1.ListOptions) (*v1.RoleBindingList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.RoleBinding, err error) RoleBindingExpansion } @@ -61,7 +61,7 @@ func newRoleBindings(c *RbacV1Client, namespace string) *roleBindings { } // Get takes name of the roleBinding, and returns the corresponding roleBinding object, and an error if there is any. -func (c *roleBindings) Get(name string, options meta_v1.GetOptions) (result *v1.RoleBinding, err error) { +func (c *roleBindings) Get(name string, options metav1.GetOptions) (result *v1.RoleBinding, err error) { result = &v1.RoleBinding{} err = c.client.Get(). Namespace(c.ns). @@ -74,7 +74,7 @@ func (c *roleBindings) Get(name string, options meta_v1.GetOptions) (result *v1. } // List takes label and field selectors, and returns the list of RoleBindings that match those selectors. -func (c *roleBindings) List(opts meta_v1.ListOptions) (result *v1.RoleBindingList, err error) { +func (c *roleBindings) List(opts metav1.ListOptions) (result *v1.RoleBindingList, err error) { result = &v1.RoleBindingList{} err = c.client.Get(). Namespace(c.ns). @@ -86,7 +86,7 @@ func (c *roleBindings) List(opts meta_v1.ListOptions) (result *v1.RoleBindingLis } // Watch returns a watch.Interface that watches the requested roleBindings. -func (c *roleBindings) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *roleBindings) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Namespace(c.ns). @@ -121,7 +121,7 @@ func (c *roleBindings) Update(roleBinding *v1.RoleBinding) (result *v1.RoleBindi } // Delete takes name of the roleBinding and deletes it. Returns an error if one occurs. -func (c *roleBindings) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *roleBindings) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("rolebindings"). @@ -132,7 +132,7 @@ func (c *roleBindings) Delete(name string, options *meta_v1.DeleteOptions) error } // DeleteCollection deletes a collection of objects. -func (c *roleBindings) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *roleBindings) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Namespace(c.ns). Resource("rolebindings"). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD index 11065cf6..e7c4da27 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD @@ -16,15 +16,16 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", deps = [ - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD index e750f1e1..daa9aaac 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD @@ -16,15 +16,16 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", deps = [ - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD index db9b36f3..13e4f39d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD @@ -13,15 +13,16 @@ go_library( "priorityclass.go", "scheduling_client.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", deps = [ - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD index a12fa2d2..12c6e00e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/BUILD @@ -8,16 +8,17 @@ go_library( "priorityclass.go", "scheduling_client.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/scheduling/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD index a1abc87e..47bbc31f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD @@ -13,15 +13,16 @@ go_library( "podpreset.go", "settings_client.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1", importpath = "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", deps = [ - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD index 0c550714..7948513c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD @@ -13,15 +13,16 @@ go_library( "storage_client.go", "storageclass.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1", importpath = "k8s.io/client-go/kubernetes/typed/storage/v1", deps = [ - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go index 74410b24..0f7f57f0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go @@ -20,7 +20,7 @@ package v1 import ( v1 "k8s.io/api/storage/v1" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" types "k8s.io/apimachinery/pkg/types" watch "k8s.io/apimachinery/pkg/watch" scheme "k8s.io/client-go/kubernetes/scheme" @@ -37,11 +37,11 @@ type StorageClassesGetter interface { type StorageClassInterface interface { Create(*v1.StorageClass) (*v1.StorageClass, error) Update(*v1.StorageClass) (*v1.StorageClass, error) - Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error - Get(name string, options meta_v1.GetOptions) (*v1.StorageClass, error) - List(opts meta_v1.ListOptions) (*v1.StorageClassList, error) - Watch(opts meta_v1.ListOptions) (watch.Interface, error) + Delete(name string, options *metav1.DeleteOptions) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions) (*v1.StorageClass, error) + List(opts metav1.ListOptions) (*v1.StorageClassList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.StorageClass, err error) StorageClassExpansion } @@ -59,7 +59,7 @@ func newStorageClasses(c *StorageV1Client) *storageClasses { } // Get takes name of the storageClass, and returns the corresponding storageClass object, and an error if there is any. -func (c *storageClasses) Get(name string, options meta_v1.GetOptions) (result *v1.StorageClass, err error) { +func (c *storageClasses) Get(name string, options metav1.GetOptions) (result *v1.StorageClass, err error) { result = &v1.StorageClass{} err = c.client.Get(). Resource("storageclasses"). @@ -71,7 +71,7 @@ func (c *storageClasses) Get(name string, options meta_v1.GetOptions) (result *v } // List takes label and field selectors, and returns the list of StorageClasses that match those selectors. -func (c *storageClasses) List(opts meta_v1.ListOptions) (result *v1.StorageClassList, err error) { +func (c *storageClasses) List(opts metav1.ListOptions) (result *v1.StorageClassList, err error) { result = &v1.StorageClassList{} err = c.client.Get(). Resource("storageclasses"). @@ -82,7 +82,7 @@ func (c *storageClasses) List(opts meta_v1.ListOptions) (result *v1.StorageClass } // Watch returns a watch.Interface that watches the requested storageClasses. -func (c *storageClasses) Watch(opts meta_v1.ListOptions) (watch.Interface, error) { +func (c *storageClasses) Watch(opts metav1.ListOptions) (watch.Interface, error) { opts.Watch = true return c.client.Get(). Resource("storageclasses"). @@ -114,7 +114,7 @@ func (c *storageClasses) Update(storageClass *v1.StorageClass) (result *v1.Stora } // Delete takes name of the storageClass and deletes it. Returns an error if one occurs. -func (c *storageClasses) Delete(name string, options *meta_v1.DeleteOptions) error { +func (c *storageClasses) Delete(name string, options *metav1.DeleteOptions) error { return c.client.Delete(). Resource("storageclasses"). Name(name). @@ -124,7 +124,7 @@ func (c *storageClasses) Delete(name string, options *meta_v1.DeleteOptions) err } // DeleteCollection deletes a collection of objects. -func (c *storageClasses) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { +func (c *storageClasses) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error { return c.client.Delete(). Resource("storageclasses"). VersionedParams(&listOptions, scheme.ParameterCodec). diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD index 15542196..4a987437 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD @@ -8,16 +8,17 @@ go_library( "storage_client.go", "volumeattachment.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1", importpath = "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD index 79d13929..425d2dc9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD @@ -14,15 +14,16 @@ go_library( "storageclass.go", "volumeattachment.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1", importpath = "k8s.io/client-go/kubernetes/typed/storage/v1beta1", deps = [ - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD index df036423..c714d216 100644 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD @@ -6,13 +6,14 @@ go_library( "expansion_generated.go", "initializerconfiguration.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1", importpath = "k8s.io/client-go/listers/admissionregistration/v1alpha1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD index d5128618..553cc6f8 100644 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD @@ -7,13 +7,14 @@ go_library( "mutatingwebhookconfiguration.go", "validatingwebhookconfiguration.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1", importpath = "k8s.io/client-go/listers/admissionregistration/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/admissionregistration/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/apps/v1/BUILD b/vendor/k8s.io/client-go/listers/apps/v1/BUILD index fb3cfbbb..32aaa37e 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1/BUILD +++ b/vendor/k8s.io/client-go/listers/apps/v1/BUILD @@ -14,15 +14,16 @@ go_library( "statefulset.go", "statefulset_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1", importpath = "k8s.io/client-go/listers/apps/v1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD index f6ddce53..640f6599 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD @@ -15,14 +15,15 @@ go_library( "statefulset.go", "statefulset_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1beta1", importpath = "k8s.io/client-go/listers/apps/v1beta1", deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD index 50aefcab..20e24652 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD @@ -20,14 +20,15 @@ go_library( "statefulset.go", "statefulset_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1beta2", importpath = "k8s.io/client-go/listers/apps/v1beta2", deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta2:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD index 8c5bfd95..99704f4a 100644 --- a/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD +++ b/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD @@ -6,13 +6,14 @@ go_library( "expansion_generated.go", "horizontalpodautoscaler.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v1", importpath = "k8s.io/client-go/listers/autoscaling/v1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD index 78aca584..80d19292 100644 --- a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD @@ -6,13 +6,14 @@ go_library( "expansion_generated.go", "horizontalpodautoscaler.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v2beta1", importpath = "k8s.io/client-go/listers/autoscaling/v2beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/autoscaling/v2beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD new file mode 100644 index 00000000..6ce5db8f --- /dev/null +++ b/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "expansion_generated.go", + "horizontalpodautoscaler.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v2beta2", + importpath = "k8s.io/client-go/listers/autoscaling/v2beta2", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/autoscaling/v2beta2:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/log_metrics_provider.go b/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/expansion_generated.go similarity index 53% rename from vendor/k8s.io/kubernetes/pkg/kubelet/stats/log_metrics_provider.go rename to vendor/k8s.io/client-go/listers/autoscaling/v2beta2/expansion_generated.go index 1d31c8b5..5127945a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/log_metrics_provider.go +++ b/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,22 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package stats +// Code generated by lister-gen. DO NOT EDIT. -import ( - "k8s.io/kubernetes/pkg/volume" -) +package v2beta2 -type LogMetricsService interface { - createLogMetricsProvider(path string) volume.MetricsProvider -} +// HorizontalPodAutoscalerListerExpansion allows custom methods to be added to +// HorizontalPodAutoscalerLister. +type HorizontalPodAutoscalerListerExpansion interface{} -type logMetrics struct{} - -func NewLogMetricsService() LogMetricsService { - return logMetrics{} -} - -func (l logMetrics) createLogMetricsProvider(path string) volume.MetricsProvider { - return volume.NewMetricsDu(path) -} +// HorizontalPodAutoscalerNamespaceListerExpansion allows custom methods to be added to +// HorizontalPodAutoscalerNamespaceLister. +type HorizontalPodAutoscalerNamespaceListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/horizontalpodautoscaler.go new file mode 100644 index 00000000..9caaed88 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/autoscaling/v2beta2/horizontalpodautoscaler.go @@ -0,0 +1,94 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v2beta2 + +import ( + v2beta2 "k8s.io/api/autoscaling/v2beta2" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// HorizontalPodAutoscalerLister helps list HorizontalPodAutoscalers. +type HorizontalPodAutoscalerLister interface { + // List lists all HorizontalPodAutoscalers in the indexer. + List(selector labels.Selector) (ret []*v2beta2.HorizontalPodAutoscaler, err error) + // HorizontalPodAutoscalers returns an object that can list and get HorizontalPodAutoscalers. + HorizontalPodAutoscalers(namespace string) HorizontalPodAutoscalerNamespaceLister + HorizontalPodAutoscalerListerExpansion +} + +// horizontalPodAutoscalerLister implements the HorizontalPodAutoscalerLister interface. +type horizontalPodAutoscalerLister struct { + indexer cache.Indexer +} + +// NewHorizontalPodAutoscalerLister returns a new HorizontalPodAutoscalerLister. +func NewHorizontalPodAutoscalerLister(indexer cache.Indexer) HorizontalPodAutoscalerLister { + return &horizontalPodAutoscalerLister{indexer: indexer} +} + +// List lists all HorizontalPodAutoscalers in the indexer. +func (s *horizontalPodAutoscalerLister) List(selector labels.Selector) (ret []*v2beta2.HorizontalPodAutoscaler, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v2beta2.HorizontalPodAutoscaler)) + }) + return ret, err +} + +// HorizontalPodAutoscalers returns an object that can list and get HorizontalPodAutoscalers. +func (s *horizontalPodAutoscalerLister) HorizontalPodAutoscalers(namespace string) HorizontalPodAutoscalerNamespaceLister { + return horizontalPodAutoscalerNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// HorizontalPodAutoscalerNamespaceLister helps list and get HorizontalPodAutoscalers. +type HorizontalPodAutoscalerNamespaceLister interface { + // List lists all HorizontalPodAutoscalers in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v2beta2.HorizontalPodAutoscaler, err error) + // Get retrieves the HorizontalPodAutoscaler from the indexer for a given namespace and name. + Get(name string) (*v2beta2.HorizontalPodAutoscaler, error) + HorizontalPodAutoscalerNamespaceListerExpansion +} + +// horizontalPodAutoscalerNamespaceLister implements the HorizontalPodAutoscalerNamespaceLister +// interface. +type horizontalPodAutoscalerNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all HorizontalPodAutoscalers in the indexer for a given namespace. +func (s horizontalPodAutoscalerNamespaceLister) List(selector labels.Selector) (ret []*v2beta2.HorizontalPodAutoscaler, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v2beta2.HorizontalPodAutoscaler)) + }) + return ret, err +} + +// Get retrieves the HorizontalPodAutoscaler from the indexer for a given namespace and name. +func (s horizontalPodAutoscalerNamespaceLister) Get(name string) (*v2beta2.HorizontalPodAutoscaler, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v2beta2.Resource("horizontalpodautoscaler"), name) + } + return obj.(*v2beta2.HorizontalPodAutoscaler), nil +} diff --git a/vendor/k8s.io/client-go/listers/batch/v1/BUILD b/vendor/k8s.io/client-go/listers/batch/v1/BUILD index c695b985..ea3fd00f 100644 --- a/vendor/k8s.io/client-go/listers/batch/v1/BUILD +++ b/vendor/k8s.io/client-go/listers/batch/v1/BUILD @@ -12,14 +12,15 @@ go_library( "job.go", "job_expansion.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v1", importpath = "k8s.io/client-go/listers/batch/v1", deps = [ - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/batch/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD index 0ae1a2ed..f4ed597f 100644 --- a/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD @@ -11,12 +11,13 @@ go_library( "cronjob.go", "expansion_generated.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v1beta1", importpath = "k8s.io/client-go/listers/batch/v1beta1", deps = [ - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/batch/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD index 92220512..25936513 100644 --- a/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD +++ b/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD @@ -11,12 +11,13 @@ go_library( "cronjob.go", "expansion_generated.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v2alpha1", importpath = "k8s.io/client-go/listers/batch/v2alpha1", deps = [ - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/batch/v2alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD index b7ca4270..0dd49fcb 100644 --- a/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD @@ -11,12 +11,13 @@ go_library( "certificatesigningrequest.go", "expansion_generated.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/certificates/v1beta1", importpath = "k8s.io/client-go/listers/certificates/v1beta1", deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/certificates/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD new file mode 100644 index 00000000..da6d88d5 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/coordination/v1beta1/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "expansion_generated.go", + "lease.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/coordination/v1beta1", + importpath = "k8s.io/client-go/listers/coordination/v1beta1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/coordination/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/client-go/listers/coordination/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/coordination/v1beta1/expansion_generated.go new file mode 100644 index 00000000..dddc5310 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/coordination/v1beta1/expansion_generated.go @@ -0,0 +1,27 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1beta1 + +// LeaseListerExpansion allows custom methods to be added to +// LeaseLister. +type LeaseListerExpansion interface{} + +// LeaseNamespaceListerExpansion allows custom methods to be added to +// LeaseNamespaceLister. +type LeaseNamespaceListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/listers/coordination/v1beta1/lease.go b/vendor/k8s.io/client-go/listers/coordination/v1beta1/lease.go new file mode 100644 index 00000000..0027444d --- /dev/null +++ b/vendor/k8s.io/client-go/listers/coordination/v1beta1/lease.go @@ -0,0 +1,94 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/coordination/v1beta1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// LeaseLister helps list Leases. +type LeaseLister interface { + // List lists all Leases in the indexer. + List(selector labels.Selector) (ret []*v1beta1.Lease, err error) + // Leases returns an object that can list and get Leases. + Leases(namespace string) LeaseNamespaceLister + LeaseListerExpansion +} + +// leaseLister implements the LeaseLister interface. +type leaseLister struct { + indexer cache.Indexer +} + +// NewLeaseLister returns a new LeaseLister. +func NewLeaseLister(indexer cache.Indexer) LeaseLister { + return &leaseLister{indexer: indexer} +} + +// List lists all Leases in the indexer. +func (s *leaseLister) List(selector labels.Selector) (ret []*v1beta1.Lease, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.Lease)) + }) + return ret, err +} + +// Leases returns an object that can list and get Leases. +func (s *leaseLister) Leases(namespace string) LeaseNamespaceLister { + return leaseNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// LeaseNamespaceLister helps list and get Leases. +type LeaseNamespaceLister interface { + // List lists all Leases in the indexer for a given namespace. + List(selector labels.Selector) (ret []*v1beta1.Lease, err error) + // Get retrieves the Lease from the indexer for a given namespace and name. + Get(name string) (*v1beta1.Lease, error) + LeaseNamespaceListerExpansion +} + +// leaseNamespaceLister implements the LeaseNamespaceLister +// interface. +type leaseNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Leases in the indexer for a given namespace. +func (s leaseNamespaceLister) List(selector labels.Selector) (ret []*v1beta1.Lease, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.Lease)) + }) + return ret, err +} + +// Get retrieves the Lease from the indexer for a given namespace and name. +func (s leaseNamespaceLister) Get(name string) (*v1beta1.Lease, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1beta1.Resource("lease"), name) + } + return obj.(*v1beta1.Lease), nil +} diff --git a/vendor/k8s.io/client-go/listers/core/v1/BUILD b/vendor/k8s.io/client-go/listers/core/v1/BUILD index 313cdc29..458cd280 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/BUILD +++ b/vendor/k8s.io/client-go/listers/core/v1/BUILD @@ -29,12 +29,13 @@ go_library( "service_expansion.go", "serviceaccount.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/core/v1", importpath = "k8s.io/client-go/listers/core/v1", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD index f4ea35d4..f3ea306f 100644 --- a/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD @@ -6,13 +6,14 @@ go_library( "event.go", "expansion_generated.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/events/v1beta1", importpath = "k8s.io/client-go/listers/events/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD index 49b895c3..786a6331 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD @@ -20,15 +20,16 @@ go_library( "replicaset_expansion.go", "scale.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/extensions/v1beta1", importpath = "k8s.io/client-go/listers/extensions/v1beta1", deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/apps/v1beta1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) @@ -37,12 +38,12 @@ go_test( srcs = ["daemonset_expansion_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset_expansion_test.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset_expansion_test.go new file mode 100644 index 00000000..77180854 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset_expansion_test.go @@ -0,0 +1,152 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 v1beta1 + +import ( + "testing" + + "k8s.io/api/core/v1" + extensions "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/tools/cache" +) + +func TestDaemonSetLister(t *testing.T) { + store := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{"namespace": cache.MetaNamespaceIndexFunc}) + lister := NewDaemonSetLister(store) + testCases := []struct { + inDSs []*extensions.DaemonSet + list func() ([]*extensions.DaemonSet, error) + outDaemonSetNames sets.String + expectErr bool + }{ + // Basic listing + { + inDSs: []*extensions.DaemonSet{ + {ObjectMeta: metav1.ObjectMeta{Name: "basic"}}, + }, + list: func() ([]*extensions.DaemonSet, error) { + return lister.List(labels.Everything()) + }, + outDaemonSetNames: sets.NewString("basic"), + }, + // Listing multiple daemon sets + { + inDSs: []*extensions.DaemonSet{ + {ObjectMeta: metav1.ObjectMeta{Name: "basic"}}, + {ObjectMeta: metav1.ObjectMeta{Name: "complex"}}, + {ObjectMeta: metav1.ObjectMeta{Name: "complex2"}}, + }, + list: func() ([]*extensions.DaemonSet, error) { + return lister.List(labels.Everything()) + }, + outDaemonSetNames: sets.NewString("basic", "complex", "complex2"), + }, + // No pod labels + { + inDSs: []*extensions.DaemonSet{ + { + ObjectMeta: metav1.ObjectMeta{Name: "basic", Namespace: "ns"}, + Spec: extensions.DaemonSetSpec{ + Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "baz"}}, + }, + }, + }, + list: func() ([]*extensions.DaemonSet, error) { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: "pod1", Namespace: "ns"}, + } + return lister.GetPodDaemonSets(pod) + }, + outDaemonSetNames: sets.NewString(), + expectErr: true, + }, + // No DS selectors + { + inDSs: []*extensions.DaemonSet{ + { + ObjectMeta: metav1.ObjectMeta{Name: "basic", Namespace: "ns"}, + }, + }, + list: func() ([]*extensions.DaemonSet, error) { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod1", + Namespace: "ns", + Labels: map[string]string{"foo": "bar"}, + }, + } + return lister.GetPodDaemonSets(pod) + }, + outDaemonSetNames: sets.NewString(), + expectErr: true, + }, + // Matching labels to selectors and namespace + { + inDSs: []*extensions.DaemonSet{ + { + ObjectMeta: metav1.ObjectMeta{Name: "foo"}, + Spec: extensions.DaemonSetSpec{ + Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "bar", Namespace: "ns"}, + Spec: extensions.DaemonSetSpec{ + Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"foo": "bar"}}, + }, + }, + }, + list: func() ([]*extensions.DaemonSet, error) { + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod1", + Labels: map[string]string{"foo": "bar"}, + Namespace: "ns", + }, + } + return lister.GetPodDaemonSets(pod) + }, + outDaemonSetNames: sets.NewString("bar"), + }, + } + for _, c := range testCases { + for _, r := range c.inDSs { + store.Add(r) + } + + daemonSets, err := c.list() + if err != nil && c.expectErr { + continue + } else if c.expectErr { + t.Error("Expected error, got none") + continue + } else if err != nil { + t.Errorf("Unexpected error %#v", err) + continue + } + daemonSetNames := make([]string, len(daemonSets)) + for ix := range daemonSets { + daemonSetNames[ix] = daemonSets[ix].Name + } + if !c.outDaemonSetNames.HasAll(daemonSetNames...) || len(daemonSetNames) != len(c.outDaemonSetNames) { + t.Errorf("Unexpected got controllers %+v expected %+v", daemonSetNames, c.outDaemonSetNames) + } + } +} diff --git a/vendor/k8s.io/client-go/listers/networking/v1/BUILD b/vendor/k8s.io/client-go/listers/networking/v1/BUILD index 64dc638b..c3172f6f 100644 --- a/vendor/k8s.io/client-go/listers/networking/v1/BUILD +++ b/vendor/k8s.io/client-go/listers/networking/v1/BUILD @@ -11,12 +11,13 @@ go_library( "expansion_generated.go", "networkpolicy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/networking/v1", importpath = "k8s.io/client-go/listers/networking/v1", deps = [ - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/networking/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD index 2c5f33df..5c140cb3 100644 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD @@ -14,15 +14,16 @@ go_library( "poddisruptionbudget_expansion.go", "podsecuritypolicy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/policy/v1beta1", importpath = "k8s.io/client-go/listers/policy/v1beta1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1/BUILD index 9facdc04..0d6f8e14 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1/BUILD +++ b/vendor/k8s.io/client-go/listers/rbac/v1/BUILD @@ -14,12 +14,13 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1", importpath = "k8s.io/client-go/listers/rbac/v1", deps = [ - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/rbac/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD index 917c535f..ba058303 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD @@ -14,12 +14,13 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1alpha1", importpath = "k8s.io/client-go/listers/rbac/v1alpha1", deps = [ - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/rbac/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD index bde3d52e..055f3542 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD @@ -14,12 +14,13 @@ go_library( "role.go", "rolebinding.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1beta1", importpath = "k8s.io/client-go/listers/rbac/v1beta1", deps = [ - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/rbac/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD index cf60e813..3f17b057 100644 --- a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD @@ -11,12 +11,13 @@ go_library( "expansion_generated.go", "priorityclass.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/scheduling/v1alpha1", importpath = "k8s.io/client-go/listers/scheduling/v1alpha1", deps = [ - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD index 1eb39738..543d09dd 100644 --- a/vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/scheduling/v1beta1/BUILD @@ -6,13 +6,14 @@ go_library( "expansion_generated.go", "priorityclass.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/scheduling/v1beta1", importpath = "k8s.io/client-go/listers/scheduling/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/scheduling/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/settings/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/settings/v1alpha1/BUILD index 9979b5e3..266ec235 100644 --- a/vendor/k8s.io/client-go/listers/settings/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/listers/settings/v1alpha1/BUILD @@ -11,12 +11,13 @@ go_library( "expansion_generated.go", "podpreset.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/settings/v1alpha1", importpath = "k8s.io/client-go/listers/settings/v1alpha1", deps = [ - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/settings/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/storage/v1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1/BUILD index b90f06bb..31929057 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1/BUILD +++ b/vendor/k8s.io/client-go/listers/storage/v1/BUILD @@ -11,12 +11,13 @@ go_library( "expansion_generated.go", "storageclass.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1", importpath = "k8s.io/client-go/listers/storage/v1", deps = [ - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD index 50592d67..300af788 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD @@ -6,13 +6,14 @@ go_library( "expansion_generated.go", "volumeattachment.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1alpha1", importpath = "k8s.io/client-go/listers/storage/v1alpha1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/storage/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD index 49d992e4..e38902fa 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD @@ -12,12 +12,13 @@ go_library( "storageclass.go", "volumeattachment.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1beta1", importpath = "k8s.io/client-go/listers/storage/v1beta1", deps = [ - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/storage/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD index 9536954e..12c6369e 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD @@ -8,12 +8,13 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication", importpath = "k8s.io/client-go/pkg/apis/clientauthentication", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD index 1a3bc15f..d3d66e5d 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD @@ -15,13 +15,14 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", importpath = "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go index 9921c7ee..461c20b2 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go @@ -35,17 +35,48 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. -func RegisterConversions(scheme *runtime.Scheme) error { - return scheme.AddGeneratedConversionFuncs( - Convert_v1alpha1_ExecCredential_To_clientauthentication_ExecCredential, - Convert_clientauthentication_ExecCredential_To_v1alpha1_ExecCredential, - Convert_v1alpha1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec, - Convert_clientauthentication_ExecCredentialSpec_To_v1alpha1_ExecCredentialSpec, - Convert_v1alpha1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus, - Convert_clientauthentication_ExecCredentialStatus_To_v1alpha1_ExecCredentialStatus, - Convert_v1alpha1_Response_To_clientauthentication_Response, - Convert_clientauthentication_Response_To_v1alpha1_Response, - ) +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*ExecCredential)(nil), (*clientauthentication.ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ExecCredential_To_clientauthentication_ExecCredential(a.(*ExecCredential), b.(*clientauthentication.ExecCredential), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredential)(nil), (*ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_ExecCredential_To_v1alpha1_ExecCredential(a.(*clientauthentication.ExecCredential), b.(*ExecCredential), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ExecCredentialSpec)(nil), (*clientauthentication.ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(a.(*ExecCredentialSpec), b.(*clientauthentication.ExecCredentialSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialSpec)(nil), (*ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_ExecCredentialSpec_To_v1alpha1_ExecCredentialSpec(a.(*clientauthentication.ExecCredentialSpec), b.(*ExecCredentialSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ExecCredentialStatus)(nil), (*clientauthentication.ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(a.(*ExecCredentialStatus), b.(*clientauthentication.ExecCredentialStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialStatus)(nil), (*ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_ExecCredentialStatus_To_v1alpha1_ExecCredentialStatus(a.(*clientauthentication.ExecCredentialStatus), b.(*ExecCredentialStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*Response)(nil), (*clientauthentication.Response)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_Response_To_clientauthentication_Response(a.(*Response), b.(*clientauthentication.Response), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*clientauthentication.Response)(nil), (*Response)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_Response_To_v1alpha1_Response(a.(*clientauthentication.Response), b.(*Response), scope) + }); err != nil { + return err + } + return nil } func autoConvert_v1alpha1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error { diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go index f062b8f0..a73d31b3 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go @@ -31,12 +31,8 @@ func (in *ExecCredential) DeepCopyInto(out *ExecCredential) { in.Spec.DeepCopyInto(&out.Spec) if in.Status != nil { in, out := &in.Status, &out.Status - if *in == nil { - *out = nil - } else { - *out = new(ExecCredentialStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ExecCredentialStatus) + (*in).DeepCopyInto(*out) } return } @@ -64,12 +60,8 @@ func (in *ExecCredentialSpec) DeepCopyInto(out *ExecCredentialSpec) { *out = *in if in.Response != nil { in, out := &in.Response, &out.Response - if *in == nil { - *out = nil - } else { - *out = new(Response) - (*in).DeepCopyInto(*out) - } + *out = new(Response) + (*in).DeepCopyInto(*out) } return } @@ -89,11 +81,7 @@ func (in *ExecCredentialStatus) DeepCopyInto(out *ExecCredentialStatus) { *out = *in if in.ExpirationTimestamp != nil { in, out := &in.ExpirationTimestamp, &out.ExpirationTimestamp - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } @@ -115,12 +103,15 @@ func (in *Response) DeepCopyInto(out *Response) { in, out := &in.Header, &out.Header *out = make(map[string][]string, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]string, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD index 6431610f..fa0df9ae 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/BUILD @@ -11,14 +11,15 @@ go_library( "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", importpath = "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go index 80e9b315..94ef4b73 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go @@ -35,15 +35,43 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. -func RegisterConversions(scheme *runtime.Scheme) error { - return scheme.AddGeneratedConversionFuncs( - Convert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential, - Convert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential, - Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec, - Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec, - Convert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus, - Convert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus, - ) +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*ExecCredential)(nil), (*clientauthentication.ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(a.(*ExecCredential), b.(*clientauthentication.ExecCredential), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredential)(nil), (*ExecCredential)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential(a.(*clientauthentication.ExecCredential), b.(*ExecCredential), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ExecCredentialSpec)(nil), (*clientauthentication.ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(a.(*ExecCredentialSpec), b.(*clientauthentication.ExecCredentialSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialSpec)(nil), (*ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec(a.(*clientauthentication.ExecCredentialSpec), b.(*ExecCredentialSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*ExecCredentialStatus)(nil), (*clientauthentication.ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(a.(*ExecCredentialStatus), b.(*clientauthentication.ExecCredentialStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*clientauthentication.ExecCredentialStatus)(nil), (*ExecCredentialStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus(a.(*clientauthentication.ExecCredentialStatus), b.(*ExecCredentialStatus), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*clientauthentication.ExecCredentialSpec)(nil), (*ExecCredentialSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec(a.(*clientauthentication.ExecCredentialSpec), b.(*ExecCredentialSpec), scope) + }); err != nil { + return err + } + return nil } func autoConvert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error { diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go index 656fea4d..736b8cf0 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go @@ -31,12 +31,8 @@ func (in *ExecCredential) DeepCopyInto(out *ExecCredential) { out.Spec = in.Spec if in.Status != nil { in, out := &in.Status, &out.Status - if *in == nil { - *out = nil - } else { - *out = new(ExecCredentialStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ExecCredentialStatus) + (*in).DeepCopyInto(*out) } return } @@ -80,11 +76,7 @@ func (in *ExecCredentialStatus) DeepCopyInto(out *ExecCredentialStatus) { *out = *in if in.ExpirationTimestamp != nil { in, out := &in.ExpirationTimestamp, &out.ExpirationTimestamp - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go index 008c3c7d..c568a6fc 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go @@ -31,12 +31,8 @@ func (in *ExecCredential) DeepCopyInto(out *ExecCredential) { in.Spec.DeepCopyInto(&out.Spec) if in.Status != nil { in, out := &in.Status, &out.Status - if *in == nil { - *out = nil - } else { - *out = new(ExecCredentialStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ExecCredentialStatus) + (*in).DeepCopyInto(*out) } return } @@ -64,12 +60,8 @@ func (in *ExecCredentialSpec) DeepCopyInto(out *ExecCredentialSpec) { *out = *in if in.Response != nil { in, out := &in.Response, &out.Response - if *in == nil { - *out = nil - } else { - *out = new(Response) - (*in).DeepCopyInto(*out) - } + *out = new(Response) + (*in).DeepCopyInto(*out) } return } @@ -89,11 +81,7 @@ func (in *ExecCredentialStatus) DeepCopyInto(out *ExecCredentialStatus) { *out = *in if in.ExpirationTimestamp != nil { in, out := &in.ExpirationTimestamp, &out.ExpirationTimestamp - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } @@ -115,12 +103,15 @@ func (in *Response) DeepCopyInto(out *Response) { in, out := &in.Header, &out.Header *out = make(map[string][]string, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]string, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return diff --git a/vendor/k8s.io/client-go/pkg/version/BUILD b/vendor/k8s.io/client-go/pkg/version/BUILD index ee19d8cd..9e66d15a 100644 --- a/vendor/k8s.io/client-go/pkg/version/BUILD +++ b/vendor/k8s.io/client-go/pkg/version/BUILD @@ -12,8 +12,9 @@ go_library( "doc.go", "version.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/version", importpath = "k8s.io/client-go/pkg/version", - deps = ["//vendor/k8s.io/apimachinery/pkg/version:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/version:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD index 9af48cf3..d2459367 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD @@ -3,21 +3,23 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["exec.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec", importpath = "k8s.io/client-go/plugin/pkg/client/auth/exec", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", + "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1:go_default_library", + "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", + "//staging/src/k8s.io/client-go/transport:go_default_library", + "//staging/src/k8s.io/client-go/util/connrotation:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/crypto/ssh/terminal:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/transport:go_default_library", - "//vendor/k8s.io/client-go/util/connrotation:go_default_library", ], ) @@ -27,11 +29,11 @@ go_test( data = glob(["testdata/**"]), embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/transport:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", + "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", + "//staging/src/k8s.io/client-go/transport:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go index 2d05ac62..cae9d0d6 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "crypto/tls" + "errors" "fmt" "io" "net" @@ -36,6 +37,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/pkg/apis/clientauthentication" "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1" "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" @@ -51,9 +53,9 @@ var codecs = serializer.NewCodecFactory(scheme) func init() { v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) - v1alpha1.AddToScheme(scheme) - v1beta1.AddToScheme(scheme) - clientauthentication.AddToScheme(scheme) + utilruntime.Must(v1alpha1.AddToScheme(scheme)) + utilruntime.Must(v1beta1.AddToScheme(scheme)) + utilruntime.Must(clientauthentication.AddToScheme(scheme)) } var ( @@ -178,21 +180,10 @@ func (a *Authenticator) UpdateTransportConfig(c *transport.Config) error { return &roundTripper{a, rt} } - getCert := c.TLS.GetCert - c.TLS.GetCert = func() (*tls.Certificate, error) { - // If previous GetCert is present and returns a valid non-nil - // certificate, use that. Otherwise use cert from exec plugin. - if getCert != nil { - cert, err := getCert() - if err != nil { - return nil, err - } - if cert != nil { - return cert, nil - } - } - return a.cert() + if c.TLS.GetCert != nil { + return errors.New("can't add TLS certificate callback: transport.Config.TLS.GetCert already set") } + c.TLS.GetCert = a.cert var dial func(ctx context.Context, network, addr string) (net.Conn, error) if c.Dial != nil { diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go new file mode 100644 index 00000000..e3398e82 --- /dev/null +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go @@ -0,0 +1,748 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 exec + +import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "encoding/json" + "encoding/pem" + "fmt" + "io/ioutil" + "math/big" + "net/http" + "net/http/httptest" + "reflect" + "strings" + "testing" + "time" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/pkg/apis/clientauthentication" + "k8s.io/client-go/tools/clientcmd/api" + "k8s.io/client-go/transport" +) + +var ( + certData = []byte(`-----BEGIN CERTIFICATE----- +MIIC6jCCAdSgAwIBAgIBCzALBgkqhkiG9w0BAQswIzEhMB8GA1UEAwwYMTAuMTMu +MTI5LjEwNkAxNDIxMzU5MDU4MB4XDTE1MDExNTIyMDEzMVoXDTE2MDExNTIyMDEz +MlowGzEZMBcGA1UEAxMQb3BlbnNoaWZ0LWNsaWVudDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKtdhz0+uCLXw5cSYns9rU/XifFSpb/x24WDdrm72S/v +b9BPYsAStiP148buylr1SOuNi8sTAZmlVDDIpIVwMLff+o2rKYDicn9fjbrTxTOj +lI4pHJBH+JU3AJ0tbajupioh70jwFS0oYpwtneg2zcnE2Z4l6mhrj2okrc5Q1/X2 +I2HChtIU4JYTisObtin10QKJX01CLfYXJLa8upWzKZ4/GOcHG+eAV3jXWoXidtjb +1Usw70amoTZ6mIVCkiu1QwCoa8+ycojGfZhvqMsAp1536ZcCul+Na+AbCv4zKS7F +kQQaImVrXdUiFansIoofGlw/JNuoKK6ssVpS5Ic3pgcCAwEAAaM1MDMwDgYDVR0P +AQH/BAQDAgCgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwCwYJ +KoZIhvcNAQELA4IBAQCKLREH7bXtXtZ+8vI6cjD7W3QikiArGqbl36bAhhWsJLp/ +p/ndKz39iFNaiZ3GlwIURWOOKx3y3GA0x9m8FR+Llthf0EQ8sUjnwaknWs0Y6DQ3 +jjPFZOpV3KPCFrdMJ3++E3MgwFC/Ih/N2ebFX9EcV9Vcc6oVWMdwT0fsrhu683rq +6GSR/3iVX1G/pmOiuaR0fNUaCyCfYrnI4zHBDgSfnlm3vIvN2lrsR/DQBakNL8DJ +HBgKxMGeUPoneBv+c8DMXIL0EhaFXRlBv9QW45/GiAIOuyFJ0i6hCtGZpJjq4OpQ +BRjCI+izPzFTjsxD4aORE+WOkyWFCGPWKfNejfw0 +-----END CERTIFICATE-----`) + keyData = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAq12HPT64ItfDlxJiez2tT9eJ8VKlv/HbhYN2ubvZL+9v0E9i +wBK2I/Xjxu7KWvVI642LyxMBmaVUMMikhXAwt9/6jaspgOJyf1+NutPFM6OUjikc +kEf4lTcAnS1tqO6mKiHvSPAVLShinC2d6DbNycTZniXqaGuPaiStzlDX9fYjYcKG +0hTglhOKw5u2KfXRAolfTUIt9hcktry6lbMpnj8Y5wcb54BXeNdaheJ22NvVSzDv +RqahNnqYhUKSK7VDAKhrz7JyiMZ9mG+oywCnXnfplwK6X41r4BsK/jMpLsWRBBoi +ZWtd1SIVqewiih8aXD8k26gorqyxWlLkhzemBwIDAQABAoIBAD2XYRs3JrGHQUpU +FkdbVKZkvrSY0vAZOqBTLuH0zUv4UATb8487anGkWBjRDLQCgxH+jucPTrztekQK +aW94clo0S3aNtV4YhbSYIHWs1a0It0UdK6ID7CmdWkAj6s0T8W8lQT7C46mWYVLm +5mFnCTHi6aB42jZrqmEpC7sivWwuU0xqj3Ml8kkxQCGmyc9JjmCB4OrFFC8NNt6M +ObvQkUI6Z3nO4phTbpxkE1/9dT0MmPIF7GhHVzJMS+EyyRYUDllZ0wvVSOM3qZT0 +JMUaBerkNwm9foKJ1+dv2nMKZZbJajv7suUDCfU44mVeaEO+4kmTKSGCGjjTBGkr +7L1ySDECgYEA5ElIMhpdBzIivCuBIH8LlUeuzd93pqssO1G2Xg0jHtfM4tz7fyeI +cr90dc8gpli24dkSxzLeg3Tn3wIj/Bu64m2TpZPZEIlukYvgdgArmRIPQVxerYey +OkrfTNkxU1HXsYjLCdGcGXs5lmb+K/kuTcFxaMOs7jZi7La+jEONwf8CgYEAwCs/ +rUOOA0klDsWWisbivOiNPII79c9McZCNBqncCBfMUoiGe8uWDEO4TFHN60vFuVk9 +8PkwpCfvaBUX+ajvbafIfHxsnfk1M04WLGCeqQ/ym5Q4sQoQOcC1b1y9qc/xEWfg +nIUuia0ukYRpl7qQa3tNg+BNFyjypW8zukUAC/kCgYB1/Kojuxx5q5/oQVPrx73k +2bevD+B3c+DYh9MJqSCNwFtUpYIWpggPxoQan4LwdsmO0PKzocb/ilyNFj4i/vII +NToqSc/WjDFpaDIKyuu9oWfhECye45NqLWhb/6VOuu4QA/Nsj7luMhIBehnEAHW+ +GkzTKM8oD1PxpEG3nPKXYQKBgQC6AuMPRt3XBl1NkCrpSBy/uObFlFaP2Enpf39S +3OZ0Gv0XQrnSaL1kP8TMcz68rMrGX8DaWYsgytstR4W+jyy7WvZwsUu+GjTJ5aMG +77uEcEBpIi9CBzivfn7hPccE8ZgqPf+n4i6q66yxBJflW5xhvafJqDtW2LcPNbW/ +bvzdmQKBgExALRUXpq+5dbmkdXBHtvXdRDZ6rVmrnjy4nI5bPw+1GqQqk6uAR6B/ +F6NmLCQOO4PDG/cuatNHIr2FrwTmGdEL6ObLUGWn9Oer9gJhHVqqsY5I4sEPo4XX +stR0Yiw0buV6DL/moUO0HIM9Bjh96HJp+LxiIS6UCdIhMPp5HoQa +-----END RSA PRIVATE KEY-----`) + validCert *tls.Certificate +) + +func init() { + cert, err := tls.X509KeyPair(certData, keyData) + if err != nil { + panic(err) + } + validCert = &cert +} + +func TestCacheKey(t *testing.T) { + c1 := &api.ExecConfig{ + Command: "foo-bar", + Args: []string{"1", "2"}, + Env: []api.ExecEnvVar{ + {Name: "3", Value: "4"}, + {Name: "5", Value: "6"}, + {Name: "7", Value: "8"}, + }, + APIVersion: "client.authentication.k8s.io/v1alpha1", + } + c2 := &api.ExecConfig{ + Command: "foo-bar", + Args: []string{"1", "2"}, + Env: []api.ExecEnvVar{ + {Name: "3", Value: "4"}, + {Name: "5", Value: "6"}, + {Name: "7", Value: "8"}, + }, + APIVersion: "client.authentication.k8s.io/v1alpha1", + } + c3 := &api.ExecConfig{ + Command: "foo-bar", + Args: []string{"1", "2"}, + Env: []api.ExecEnvVar{ + {Name: "3", Value: "4"}, + {Name: "5", Value: "6"}, + }, + APIVersion: "client.authentication.k8s.io/v1alpha1", + } + key1 := cacheKey(c1) + key2 := cacheKey(c2) + key3 := cacheKey(c3) + if key1 != key2 { + t.Error("key1 and key2 didn't match") + } + if key1 == key3 { + t.Error("key1 and key3 matched") + } + if key2 == key3 { + t.Error("key2 and key3 matched") + } +} + +func compJSON(t *testing.T, got, want []byte) { + t.Helper() + gotJSON := &bytes.Buffer{} + wantJSON := &bytes.Buffer{} + + if err := json.Indent(gotJSON, got, "", " "); err != nil { + t.Errorf("got invalid JSON: %v", err) + } + if err := json.Indent(wantJSON, want, "", " "); err != nil { + t.Errorf("want invalid JSON: %v", err) + } + g := strings.TrimSpace(gotJSON.String()) + w := strings.TrimSpace(wantJSON.String()) + if g != w { + t.Errorf("wanted %q, got %q", w, g) + } +} + +func TestRefreshCreds(t *testing.T) { + tests := []struct { + name string + config api.ExecConfig + output string + interactive bool + response *clientauthentication.Response + wantInput string + wantCreds credentials + wantExpiry time.Time + wantErr bool + }{ + { + name: "basic-request", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "foo-bar" + } + }`, + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "interactive", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + interactive: true, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": { + "interactive": true + } + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "foo-bar" + } + }`, + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "response", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + response: &clientauthentication.Response{ + Header: map[string][]string{ + "WWW-Authenticate": {`Basic realm="Access to the staging site", charset="UTF-8"`}, + }, + Code: 401, + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": { + "response": { + "header": { + "WWW-Authenticate": [ + "Basic realm=\"Access to the staging site\", charset=\"UTF-8\"" + ] + }, + "code": 401 + } + } + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "foo-bar" + } + }`, + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "expiry", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "foo-bar", + "expirationTimestamp": "2006-01-02T15:04:05Z" + } + }`, + wantExpiry: time.Date(2006, 01, 02, 15, 04, 05, 0, time.UTC), + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "no-group-version", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: `{ + "kind": "ExecCredential", + "status": { + "token": "foo-bar" + } + }`, + wantErr: true, + }, + { + name: "no-status", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1" + }`, + wantErr: true, + }, + { + name: "no-creds", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "status": {} + }`, + wantErr: true, + }, + { + name: "TLS credentials", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: fmt.Sprintf(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "clientKeyData": %q, + "clientCertificateData": %q + } + }`, keyData, certData), + wantCreds: credentials{cert: validCert}, + }, + { + name: "bad TLS credentials", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "clientKeyData": "foo", + "clientCertificateData": "bar" + } + }`, + wantErr: true, + }, + { + name: "cert but no key", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: fmt.Sprintf(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "clientCertificateData": %q + } + }`, certData), + wantErr: true, + }, + { + name: "beta-basic-request", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1beta1", + "status": { + "token": "foo-bar" + } + }`, + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "beta-expiry", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1beta1", + "status": { + "token": "foo-bar", + "expirationTimestamp": "2006-01-02T15:04:05Z" + } + }`, + wantExpiry: time.Date(2006, 01, 02, 15, 04, 05, 0, time.UTC), + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "beta-no-group-version", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "status": { + "token": "foo-bar" + } + }`, + wantErr: true, + }, + { + name: "beta-no-status", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1beta1" + }`, + wantErr: true, + }, + { + name: "beta-no-token", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1beta1", + "status": {} + }`, + wantErr: true, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + c := test.config + + c.Command = "./testdata/test-plugin.sh" + c.Env = append(c.Env, api.ExecEnvVar{ + Name: "TEST_OUTPUT", + Value: test.output, + }) + + a, err := newAuthenticator(newCache(), &c) + if err != nil { + t.Fatal(err) + } + + stderr := &bytes.Buffer{} + a.stderr = stderr + a.interactive = test.interactive + a.environ = func() []string { return nil } + + if err := a.refreshCredsLocked(test.response); err != nil { + if !test.wantErr { + t.Errorf("get token %v", err) + } + return + } + if test.wantErr { + t.Fatal("expected error getting token") + } + + if !reflect.DeepEqual(a.cachedCreds, &test.wantCreds) { + t.Errorf("expected credentials %+v got %+v", &test.wantCreds, a.cachedCreds) + } + + if !a.exp.Equal(test.wantExpiry) { + t.Errorf("expected expiry %v got %v", test.wantExpiry, a.exp) + } + + if test.wantInput == "" { + if got := strings.TrimSpace(stderr.String()); got != "" { + t.Errorf("expected no input parameters, got %q", got) + } + return + } + + compJSON(t, stderr.Bytes(), []byte(test.wantInput)) + }) + } +} + +func TestRoundTripper(t *testing.T) { + wantToken := "" + + n := time.Now() + now := func() time.Time { return n } + + env := []string{""} + environ := func() []string { + s := make([]string, len(env)) + copy(s, env) + return s + } + + setOutput := func(s string) { + env[0] = "TEST_OUTPUT=" + s + } + + handler := func(w http.ResponseWriter, r *http.Request) { + gotToken := "" + parts := strings.Split(r.Header.Get("Authorization"), " ") + if len(parts) > 1 && strings.EqualFold(parts[0], "bearer") { + gotToken = parts[1] + } + + if wantToken != gotToken { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + fmt.Fprintln(w, "ok") + } + server := httptest.NewServer(http.HandlerFunc(handler)) + + c := api.ExecConfig{ + Command: "./testdata/test-plugin.sh", + APIVersion: "client.authentication.k8s.io/v1alpha1", + } + a, err := newAuthenticator(newCache(), &c) + if err != nil { + t.Fatal(err) + } + a.environ = environ + a.now = now + a.stderr = ioutil.Discard + + tc := &transport.Config{} + if err := a.UpdateTransportConfig(tc); err != nil { + t.Fatal(err) + } + client := http.Client{ + Transport: tc.WrapTransport(http.DefaultTransport), + } + + get := func(t *testing.T, statusCode int) { + t.Helper() + resp, err := client.Get(server.URL) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != statusCode { + t.Errorf("wanted status %d got %d", statusCode, resp.StatusCode) + } + } + + setOutput(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "token1" + } + }`) + wantToken = "token1" + get(t, http.StatusOK) + + setOutput(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "token2" + } + }`) + // Previous token should be cached + get(t, http.StatusOK) + + wantToken = "token2" + // Token is still cached, hits unauthorized but causes token to rotate. + get(t, http.StatusUnauthorized) + // Follow up request uses the rotated token. + get(t, http.StatusOK) + + setOutput(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "token3", + "expirationTimestamp": "` + now().Add(time.Hour).Format(time.RFC3339Nano) + `" + } + }`) + wantToken = "token3" + // Token is still cached, hit's unauthorized but causes rotation to token with an expiry. + get(t, http.StatusUnauthorized) + get(t, http.StatusOK) + + // Move time forward 2 hours, "token3" is now expired. + n = n.Add(time.Hour * 2) + setOutput(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "token": "token4", + "expirationTimestamp": "` + now().Add(time.Hour).Format(time.RFC3339Nano) + `" + } + }`) + wantToken = "token4" + // Old token is expired, should refresh automatically without hitting a 401. + get(t, http.StatusOK) +} + +func TestTLSCredentials(t *testing.T) { + now := time.Now() + + certPool := x509.NewCertPool() + cert, key := genClientCert(t) + if !certPool.AppendCertsFromPEM(cert) { + t.Fatal("failed to add client cert to CertPool") + } + + server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "ok") + })) + server.TLS = &tls.Config{ + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: certPool, + } + server.StartTLS() + defer server.Close() + + a, err := newAuthenticator(newCache(), &api.ExecConfig{ + Command: "./testdata/test-plugin.sh", + APIVersion: "client.authentication.k8s.io/v1alpha1", + }) + if err != nil { + t.Fatal(err) + } + var output *clientauthentication.ExecCredential + a.environ = func() []string { + data, err := runtime.Encode(codecs.LegacyCodec(a.group), output) + if err != nil { + t.Fatal(err) + } + return []string{"TEST_OUTPUT=" + string(data)} + } + a.now = func() time.Time { return now } + a.stderr = ioutil.Discard + + // We're not interested in server's cert, this test is about client cert. + tc := &transport.Config{TLS: transport.TLSConfig{Insecure: true}} + if err := a.UpdateTransportConfig(tc); err != nil { + t.Fatal(err) + } + + get := func(t *testing.T, desc string, wantErr bool) { + t.Run(desc, func(t *testing.T) { + tlsCfg, err := transport.TLSConfigFor(tc) + if err != nil { + t.Fatal("TLSConfigFor:", err) + } + client := http.Client{ + Transport: &http.Transport{TLSClientConfig: tlsCfg}, + } + resp, err := client.Get(server.URL) + switch { + case err != nil && !wantErr: + t.Errorf("got client.Get error: %q, want nil", err) + case err == nil && wantErr: + t.Error("got nil client.Get error, want non-nil") + } + if err == nil { + resp.Body.Close() + } + }) + } + + output = &clientauthentication.ExecCredential{ + Status: &clientauthentication.ExecCredentialStatus{ + ClientCertificateData: string(cert), + ClientKeyData: string(key), + ExpirationTimestamp: &v1.Time{now.Add(time.Hour)}, + }, + } + get(t, "valid TLS cert", false) + + // Advance time to force re-exec. + nCert, nKey := genClientCert(t) + now = now.Add(time.Hour * 2) + output = &clientauthentication.ExecCredential{ + Status: &clientauthentication.ExecCredentialStatus{ + ClientCertificateData: string(nCert), + ClientKeyData: string(nKey), + ExpirationTimestamp: &v1.Time{now.Add(time.Hour)}, + }, + } + get(t, "untrusted TLS cert", true) + + now = now.Add(time.Hour * 2) + output = &clientauthentication.ExecCredential{ + Status: &clientauthentication.ExecCredentialStatus{ + ClientCertificateData: string(cert), + ClientKeyData: string(key), + ExpirationTimestamp: &v1.Time{now.Add(time.Hour)}, + }, + } + get(t, "valid TLS cert again", false) +} + +// genClientCert generates an x509 certificate for testing. Certificate and key +// are returned in PEM encoding. +func genClientCert(t *testing.T) ([]byte, []byte) { + key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + t.Fatal(err) + } + keyRaw, err := x509.MarshalECPrivateKey(key) + if err != nil { + t.Fatal(err) + } + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + t.Fatal(err) + } + cert := &x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{Organization: []string{"Acme Co"}}, + NotBefore: time.Now(), + NotAfter: time.Now().Add(24 * time.Hour), + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, + BasicConstraintsValid: true, + } + certRaw, err := x509.CreateCertificate(rand.Reader, cert, cert, key.Public(), key) + if err != nil { + t.Fatal(err) + } + return pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certRaw}), + pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: keyRaw}) +} diff --git a/vendor/k8s.io/client-go/rest/BUILD b/vendor/k8s.io/client-go/rest/BUILD index 130ec31a..0d95e60c 100644 --- a/vendor/k8s.io/client-go/rest/BUILD +++ b/vendor/k8s.io/client-go/rest/BUILD @@ -13,34 +13,36 @@ go_test( "config_test.go", "plugin_test.go", "request_test.go", + "token_source_test.go", "url_utils_test.go", "urlbackoff_test.go", ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest/watch:go_default_library", + "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", + "//staging/src/k8s.io/client-go/util/testing:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", + "//vendor/golang.org/x/oauth2:go_default_library", ], ) @@ -51,32 +53,35 @@ go_library( "config.go", "plugin.go", "request.go", + "token_source.go", "transport.go", "url_utils.go", "urlbackoff.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/rest", importpath = "k8s.io/client-go/rest", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/pkg/version:go_default_library", + "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/exec:go_default_library", + "//staging/src/k8s.io/client-go/rest/watch:go_default_library", + "//staging/src/k8s.io/client-go/tools/clientcmd/api:go_default_library", + "//staging/src/k8s.io/client-go/tools/metrics:go_default_library", + "//staging/src/k8s.io/client-go/transport:go_default_library", + "//staging/src/k8s.io/client-go/util/cert:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/plugin/pkg/client/auth/exec:go_default_library", - "//vendor/k8s.io/client-go/rest/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/tools/metrics:go_default_library", - "//vendor/k8s.io/client-go/transport:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", + "//vendor/golang.org/x/oauth2:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/rest/client_test.go b/vendor/k8s.io/client-go/rest/client_test.go new file mode 100644 index 00000000..2eae9be2 --- /dev/null +++ b/vendor/k8s.io/client-go/rest/client_test.go @@ -0,0 +1,343 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 rest + +import ( + "net/http" + "net/http/httptest" + "net/url" + "os" + "reflect" + "testing" + "time" + + "fmt" + + "k8s.io/api/core/v1" + v1beta1 "k8s.io/api/extensions/v1beta1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/client-go/kubernetes/scheme" + utiltesting "k8s.io/client-go/util/testing" +) + +type TestParam struct { + actualError error + expectingError bool + actualCreated bool + expCreated bool + expStatus *metav1.Status + testBody bool + testBodyErrorIsNotNil bool +} + +// TestSerializer makes sure that you're always able to decode metav1.Status +func TestSerializer(t *testing.T) { + gv := v1beta1.SchemeGroupVersion + contentConfig := ContentConfig{ + ContentType: "application/json", + GroupVersion: &gv, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, + } + + serializer, err := createSerializers(contentConfig) + if err != nil { + t.Fatal(err) + } + // bytes based on actual return from API server when encoding an "unversioned" object + obj, err := runtime.Decode(serializer.Decoder, []byte(`{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Success"}`)) + t.Log(obj) + if err != nil { + t.Fatal(err) + } +} + +func TestDoRequestSuccess(t *testing.T) { + testServer, fakeHandler, status := testServerEnv(t, 200) + defer testServer.Close() + + c, err := restClient(testServer) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + body, err := c.Get().Prefix("test").Do().Raw() + + testParam := TestParam{actualError: err, expectingError: false, expCreated: true, + expStatus: status, testBody: true, testBodyErrorIsNotNil: false} + validate(testParam, t, body, fakeHandler) +} + +func TestDoRequestFailed(t *testing.T) { + status := &metav1.Status{ + Code: http.StatusNotFound, + Status: metav1.StatusFailure, + Reason: metav1.StatusReasonNotFound, + Message: " \"\" not found", + Details: &metav1.StatusDetails{}, + } + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), status) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: 404, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + defer testServer.Close() + + c, err := restClient(testServer) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + err = c.Get().Do().Error() + if err == nil { + t.Errorf("unexpected non-error") + } + ss, ok := err.(errors.APIStatus) + if !ok { + t.Errorf("unexpected error type %v", err) + } + actual := ss.Status() + if !reflect.DeepEqual(status, &actual) { + t.Errorf("Unexpected mis-match: %s", diff.ObjectReflectDiff(status, &actual)) + } +} + +func TestDoRawRequestFailed(t *testing.T) { + status := &metav1.Status{ + Code: http.StatusNotFound, + Status: metav1.StatusFailure, + Reason: metav1.StatusReasonNotFound, + Message: "the server could not find the requested resource", + Details: &metav1.StatusDetails{ + Causes: []metav1.StatusCause{ + {Type: metav1.CauseTypeUnexpectedServerResponse, Message: "unknown"}, + }, + }, + } + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), status) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: 404, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + defer testServer.Close() + + c, err := restClient(testServer) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + body, err := c.Get().Do().Raw() + + if err == nil || body == nil { + t.Errorf("unexpected non-error: %#v", body) + } + ss, ok := err.(errors.APIStatus) + if !ok { + t.Errorf("unexpected error type %v", err) + } + actual := ss.Status() + if !reflect.DeepEqual(status, &actual) { + t.Errorf("Unexpected mis-match: %s", diff.ObjectReflectDiff(status, &actual)) + } +} + +func TestDoRequestCreated(t *testing.T) { + testServer, fakeHandler, status := testServerEnv(t, 201) + defer testServer.Close() + + c, err := restClient(testServer) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + created := false + body, err := c.Get().Prefix("test").Do().WasCreated(&created).Raw() + + testParam := TestParam{actualError: err, expectingError: false, expCreated: true, + expStatus: status, testBody: false} + validate(testParam, t, body, fakeHandler) +} + +func TestDoRequestNotCreated(t *testing.T) { + testServer, fakeHandler, expectedStatus := testServerEnv(t, 202) + defer testServer.Close() + c, err := restClient(testServer) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + created := false + body, err := c.Get().Prefix("test").Do().WasCreated(&created).Raw() + testParam := TestParam{actualError: err, expectingError: false, expCreated: false, + expStatus: expectedStatus, testBody: false} + validate(testParam, t, body, fakeHandler) +} + +func TestDoRequestAcceptedNoContentReturned(t *testing.T) { + testServer, fakeHandler, _ := testServerEnv(t, 204) + defer testServer.Close() + + c, err := restClient(testServer) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + created := false + body, err := c.Get().Prefix("test").Do().WasCreated(&created).Raw() + testParam := TestParam{actualError: err, expectingError: false, expCreated: false, + testBody: false} + validate(testParam, t, body, fakeHandler) +} + +func TestBadRequest(t *testing.T) { + testServer, fakeHandler, _ := testServerEnv(t, 400) + defer testServer.Close() + c, err := restClient(testServer) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + created := false + body, err := c.Get().Prefix("test").Do().WasCreated(&created).Raw() + testParam := TestParam{actualError: err, expectingError: true, expCreated: false, + testBody: true} + validate(testParam, t, body, fakeHandler) +} + +func validate(testParam TestParam, t *testing.T, body []byte, fakeHandler *utiltesting.FakeHandler) { + switch { + case testParam.expectingError && testParam.actualError == nil: + t.Errorf("Expected error") + case !testParam.expectingError && testParam.actualError != nil: + t.Error(testParam.actualError) + } + if !testParam.expCreated { + if testParam.actualCreated { + t.Errorf("Expected object not to be created") + } + } + statusOut, err := runtime.Decode(scheme.Codecs.UniversalDeserializer(), body) + if testParam.testBody { + if testParam.testBodyErrorIsNotNil && err == nil { + t.Errorf("Expected Error") + } + if !testParam.testBodyErrorIsNotNil && err != nil { + t.Errorf("Unexpected Error: %v", err) + } + } + + if testParam.expStatus != nil { + if !reflect.DeepEqual(testParam.expStatus, statusOut) { + t.Errorf("Unexpected mis-match. Expected %#v. Saw %#v", testParam.expStatus, statusOut) + } + } + fakeHandler.ValidateRequest(t, "/"+v1.SchemeGroupVersion.String()+"/test", "GET", nil) + +} + +func TestHttpMethods(t *testing.T) { + testServer, _, _ := testServerEnv(t, 200) + defer testServer.Close() + c, _ := restClient(testServer) + + request := c.Post() + if request == nil { + t.Errorf("Post : Object returned should not be nil") + } + + request = c.Get() + if request == nil { + t.Errorf("Get: Object returned should not be nil") + } + + request = c.Put() + if request == nil { + t.Errorf("Put : Object returned should not be nil") + } + + request = c.Delete() + if request == nil { + t.Errorf("Delete : Object returned should not be nil") + } + + request = c.Patch(types.JSONPatchType) + if request == nil { + t.Errorf("Patch : Object returned should not be nil") + } +} + +func TestCreateBackoffManager(t *testing.T) { + + theUrl, _ := url.Parse("http://localhost") + + // 1 second base backoff + duration of 2 seconds -> exponential backoff for requests. + os.Setenv(envBackoffBase, "1") + os.Setenv(envBackoffDuration, "2") + backoff := readExpBackoffConfig() + backoff.UpdateBackoff(theUrl, nil, 500) + backoff.UpdateBackoff(theUrl, nil, 500) + if backoff.CalculateBackoff(theUrl)/time.Second != 2 { + t.Errorf("Backoff env not working.") + } + + // 0 duration -> no backoff. + os.Setenv(envBackoffBase, "1") + os.Setenv(envBackoffDuration, "0") + backoff.UpdateBackoff(theUrl, nil, 500) + backoff.UpdateBackoff(theUrl, nil, 500) + backoff = readExpBackoffConfig() + if backoff.CalculateBackoff(theUrl)/time.Second != 0 { + t.Errorf("Zero backoff duration, but backoff still occurring.") + } + + // No env -> No backoff. + os.Setenv(envBackoffBase, "") + os.Setenv(envBackoffDuration, "") + backoff = readExpBackoffConfig() + backoff.UpdateBackoff(theUrl, nil, 500) + backoff.UpdateBackoff(theUrl, nil, 500) + if backoff.CalculateBackoff(theUrl)/time.Second != 0 { + t.Errorf("Backoff should have been 0.") + } + +} + +func testServerEnv(t *testing.T, statusCode int) (*httptest.Server, *utiltesting.FakeHandler, *metav1.Status) { + status := &metav1.Status{TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Status"}, Status: fmt.Sprintf("%s", metav1.StatusSuccess)} + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), status) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: statusCode, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + return testServer, &fakeHandler, status +} + +func restClient(testServer *httptest.Server) (*RESTClient, error) { + c, err := RESTClientFor(&Config{ + Host: testServer.URL, + ContentConfig: ContentConfig{ + GroupVersion: &v1.SchemeGroupVersion, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, + }, + Username: "user", + Password: "pass", + }) + return c, err +} diff --git a/vendor/k8s.io/client-go/rest/config.go b/vendor/k8s.io/client-go/rest/config.go index 7934a019..87e87905 100644 --- a/vendor/k8s.io/client-go/rest/config.go +++ b/vendor/k8s.io/client-go/rest/config.go @@ -18,6 +18,7 @@ package rest import ( "context" + "errors" "fmt" "io/ioutil" "net" @@ -29,7 +30,6 @@ import ( "time" "github.com/golang/glog" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -44,6 +44,8 @@ const ( DefaultBurst int = 10 ) +var ErrNotInCluster = errors.New("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined") + // Config holds the common attributes that can be passed to a Kubernetes client on // initialization. type Config struct { @@ -220,7 +222,7 @@ func RESTClientFor(config *Config) (*RESTClient, error) { // the config.Version to be empty. func UnversionedRESTClientFor(config *Config) (*RESTClient, error) { if config.NegotiatedSerializer == nil { - return nil, fmt.Errorf("NeogitatedSerializer is required when initializing a RESTClient") + return nil, fmt.Errorf("NegotiatedSerializer is required when initializing a RESTClient") } baseURL, versionedAPIPath, err := defaultServerUrlFor(config) @@ -308,20 +310,26 @@ func DefaultKubernetesUserAgent() string { // InClusterConfig returns a config object which uses the service account // kubernetes gives to pods. It's intended for clients that expect to be -// running inside a pod running on kubernetes. It will return an error if -// called from a process not running in a kubernetes environment. +// running inside a pod running on kubernetes. It will return ErrNotInCluster +// if called from a process not running in a kubernetes environment. func InClusterConfig() (*Config, error) { + const ( + tokenFile = "/var/run/secrets/kubernetes.io/serviceaccount/token" + rootCAFile = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" + ) host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT") if len(host) == 0 || len(port) == 0 { - return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined") + return nil, ErrNotInCluster } - token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token") - if err != nil { + ts := newCachedPathTokenSource(tokenFile) + + if _, err := ts.Token(); err != nil { return nil, err } + tlsClientConfig := TLSClientConfig{} - rootCAFile := "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" + if _, err := certutil.NewPool(rootCAFile); err != nil { glog.Errorf("Expected to load root CA config from %s, but got err: %v", rootCAFile, err) } else { @@ -331,8 +339,8 @@ func InClusterConfig() (*Config, error) { return &Config{ // TODO: switch to using cluster DNS. Host: "https://" + net.JoinHostPort(host, port), - BearerToken: string(token), TLSClientConfig: tlsClientConfig, + WrapTransport: TokenSourceWrapTransport(ts), }, nil } diff --git a/vendor/k8s.io/client-go/rest/config_test.go b/vendor/k8s.io/client-go/rest/config_test.go new file mode 100644 index 00000000..34786428 --- /dev/null +++ b/vendor/k8s.io/client-go/rest/config_test.go @@ -0,0 +1,375 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 rest + +import ( + "context" + "errors" + "io" + "net" + "net/http" + "path/filepath" + "reflect" + "strings" + "testing" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/client-go/kubernetes/scheme" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" + "k8s.io/client-go/util/flowcontrol" + + fuzz "github.com/google/gofuzz" + "github.com/stretchr/testify/assert" +) + +func TestIsConfigTransportTLS(t *testing.T) { + testCases := []struct { + Config *Config + TransportTLS bool + }{ + { + Config: &Config{}, + TransportTLS: false, + }, + { + Config: &Config{ + Host: "https://localhost", + }, + TransportTLS: true, + }, + { + Config: &Config{ + Host: "localhost", + TLSClientConfig: TLSClientConfig{ + CertFile: "foo", + }, + }, + TransportTLS: true, + }, + { + Config: &Config{ + Host: "///:://localhost", + TLSClientConfig: TLSClientConfig{ + CertFile: "foo", + }, + }, + TransportTLS: false, + }, + { + Config: &Config{ + Host: "1.2.3.4:567", + TLSClientConfig: TLSClientConfig{ + Insecure: true, + }, + }, + TransportTLS: true, + }, + } + for _, testCase := range testCases { + if err := SetKubernetesDefaults(testCase.Config); err != nil { + t.Errorf("setting defaults failed for %#v: %v", testCase.Config, err) + continue + } + useTLS := IsConfigTransportTLS(*testCase.Config) + if testCase.TransportTLS != useTLS { + t.Errorf("expected %v for %#v", testCase.TransportTLS, testCase.Config) + } + } +} + +func TestSetKubernetesDefaultsUserAgent(t *testing.T) { + config := &Config{} + if err := SetKubernetesDefaults(config); err != nil { + t.Errorf("unexpected error: %v", err) + } + if !strings.Contains(config.UserAgent, "kubernetes/") { + t.Errorf("no user agent set: %#v", config) + } +} + +func TestAdjustVersion(t *testing.T) { + assert := assert.New(t) + assert.Equal("1.2.3", adjustVersion("1.2.3-alpha4")) + assert.Equal("1.2.3", adjustVersion("1.2.3-alpha")) + assert.Equal("1.2.3", adjustVersion("1.2.3")) + assert.Equal("unknown", adjustVersion("")) +} + +func TestAdjustCommit(t *testing.T) { + assert := assert.New(t) + assert.Equal("1234567", adjustCommit("1234567890")) + assert.Equal("123456", adjustCommit("123456")) + assert.Equal("unknown", adjustCommit("")) +} + +func TestAdjustCommand(t *testing.T) { + assert := assert.New(t) + assert.Equal("beans", adjustCommand(filepath.Join("home", "bob", "Downloads", "beans"))) + assert.Equal("beans", adjustCommand(filepath.Join(".", "beans"))) + assert.Equal("beans", adjustCommand("beans")) + assert.Equal("unknown", adjustCommand("")) +} + +func TestBuildUserAgent(t *testing.T) { + assert.New(t).Equal( + "lynx/nicest (beos/itanium) kubernetes/baaaaaaaaad", + buildUserAgent( + "lynx", "nicest", + "beos", "itanium", "baaaaaaaaad")) +} + +// This function untestable since it doesn't accept arguments. +func TestDefaultKubernetesUserAgent(t *testing.T) { + assert.New(t).Contains(DefaultKubernetesUserAgent(), "kubernetes") +} + +func TestRESTClientRequires(t *testing.T) { + if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{NegotiatedSerializer: scheme.Codecs}}); err == nil { + t.Errorf("unexpected non-error") + } + if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{GroupVersion: &v1.SchemeGroupVersion}}); err == nil { + t.Errorf("unexpected non-error") + } + if _, err := RESTClientFor(&Config{Host: "127.0.0.1", ContentConfig: ContentConfig{GroupVersion: &v1.SchemeGroupVersion, NegotiatedSerializer: scheme.Codecs}}); err != nil { + t.Errorf("unexpected error: %v", err) + } +} + +type fakeLimiter struct { + FakeSaturation float64 + FakeQPS float32 +} + +func (t *fakeLimiter) TryAccept() bool { + return true +} + +func (t *fakeLimiter) Saturation() float64 { + return t.FakeSaturation +} + +func (t *fakeLimiter) QPS() float32 { + return t.FakeQPS +} + +func (t *fakeLimiter) Stop() {} + +func (t *fakeLimiter) Accept() {} + +type fakeCodec struct{} + +func (c *fakeCodec) Decode([]byte, *schema.GroupVersionKind, runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) { + return nil, nil, nil +} + +func (c *fakeCodec) Encode(obj runtime.Object, stream io.Writer) error { + return nil +} + +type fakeRoundTripper struct{} + +func (r *fakeRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { + return nil, nil +} + +var fakeWrapperFunc = func(http.RoundTripper) http.RoundTripper { + return &fakeRoundTripper{} +} + +type fakeNegotiatedSerializer struct{} + +func (n *fakeNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo { + return nil +} + +func (n *fakeNegotiatedSerializer) EncoderForVersion(serializer runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder { + return &fakeCodec{} +} + +func (n *fakeNegotiatedSerializer) DecoderToVersion(serializer runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { + return &fakeCodec{} +} + +var fakeDialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) { + return nil, fakeDialerError +} +var fakeDialerError = errors.New("fakedialer") + +type fakeAuthProviderConfigPersister struct{} + +func (fakeAuthProviderConfigPersister) Persist(map[string]string) error { + return fakeAuthProviderConfigPersisterError +} + +var fakeAuthProviderConfigPersisterError = errors.New("fakeAuthProviderConfigPersisterError") + +func TestAnonymousConfig(t *testing.T) { + f := fuzz.New().NilChance(0.0).NumElements(1, 1) + f.Funcs( + func(r *runtime.Codec, f fuzz.Continue) { + codec := &fakeCodec{} + f.Fuzz(codec) + *r = codec + }, + func(r *http.RoundTripper, f fuzz.Continue) { + roundTripper := &fakeRoundTripper{} + f.Fuzz(roundTripper) + *r = roundTripper + }, + func(fn *func(http.RoundTripper) http.RoundTripper, f fuzz.Continue) { + *fn = fakeWrapperFunc + }, + func(r *runtime.NegotiatedSerializer, f fuzz.Continue) { + serializer := &fakeNegotiatedSerializer{} + f.Fuzz(serializer) + *r = serializer + }, + func(r *flowcontrol.RateLimiter, f fuzz.Continue) { + limiter := &fakeLimiter{} + f.Fuzz(limiter) + *r = limiter + }, + // Authentication does not require fuzzer + func(r *AuthProviderConfigPersister, f fuzz.Continue) {}, + func(r *clientcmdapi.AuthProviderConfig, f fuzz.Continue) { + r.Config = map[string]string{} + }, + // Dial does not require fuzzer + func(r *func(ctx context.Context, network, addr string) (net.Conn, error), f fuzz.Continue) {}, + ) + for i := 0; i < 20; i++ { + original := &Config{} + f.Fuzz(original) + actual := AnonymousClientConfig(original) + expected := *original + + // this is the list of known security related fields, add to this list if a new field + // is added to Config, update AnonymousClientConfig to preserve the field otherwise. + expected.Impersonate = ImpersonationConfig{} + expected.BearerToken = "" + expected.Username = "" + expected.Password = "" + expected.AuthProvider = nil + expected.AuthConfigPersister = nil + expected.ExecProvider = nil + expected.TLSClientConfig.CertData = nil + expected.TLSClientConfig.CertFile = "" + expected.TLSClientConfig.KeyData = nil + expected.TLSClientConfig.KeyFile = "" + + // The DeepEqual cannot handle the func comparison, so we just verify if the + // function return the expected object. + if actual.WrapTransport == nil || !reflect.DeepEqual(expected.WrapTransport(nil), &fakeRoundTripper{}) { + t.Fatalf("AnonymousClientConfig dropped the WrapTransport field") + } else { + actual.WrapTransport = nil + expected.WrapTransport = nil + } + if actual.Dial != nil { + _, actualError := actual.Dial(context.Background(), "", "") + _, expectedError := expected.Dial(context.Background(), "", "") + if !reflect.DeepEqual(expectedError, actualError) { + t.Fatalf("CopyConfig dropped the Dial field") + } + } else { + actual.Dial = nil + expected.Dial = nil + } + + if !reflect.DeepEqual(*actual, expected) { + t.Fatalf("AnonymousClientConfig dropped unexpected fields, identify whether they are security related or not: %s", diff.ObjectGoPrintDiff(expected, actual)) + } + } +} + +func TestCopyConfig(t *testing.T) { + f := fuzz.New().NilChance(0.0).NumElements(1, 1) + f.Funcs( + func(r *runtime.Codec, f fuzz.Continue) { + codec := &fakeCodec{} + f.Fuzz(codec) + *r = codec + }, + func(r *http.RoundTripper, f fuzz.Continue) { + roundTripper := &fakeRoundTripper{} + f.Fuzz(roundTripper) + *r = roundTripper + }, + func(fn *func(http.RoundTripper) http.RoundTripper, f fuzz.Continue) { + *fn = fakeWrapperFunc + }, + func(r *runtime.NegotiatedSerializer, f fuzz.Continue) { + serializer := &fakeNegotiatedSerializer{} + f.Fuzz(serializer) + *r = serializer + }, + func(r *flowcontrol.RateLimiter, f fuzz.Continue) { + limiter := &fakeLimiter{} + f.Fuzz(limiter) + *r = limiter + }, + func(r *AuthProviderConfigPersister, f fuzz.Continue) { + *r = fakeAuthProviderConfigPersister{} + }, + func(r *func(ctx context.Context, network, addr string) (net.Conn, error), f fuzz.Continue) { + *r = fakeDialFunc + }, + ) + for i := 0; i < 20; i++ { + original := &Config{} + f.Fuzz(original) + actual := CopyConfig(original) + expected := *original + + // this is the list of known risky fields, add to this list if a new field + // is added to Config, update CopyConfig to preserve the field otherwise. + + // The DeepEqual cannot handle the func comparison, so we just verify if the + // function return the expected object. + if actual.WrapTransport == nil || !reflect.DeepEqual(expected.WrapTransport(nil), &fakeRoundTripper{}) { + t.Fatalf("CopyConfig dropped the WrapTransport field") + } else { + actual.WrapTransport = nil + expected.WrapTransport = nil + } + if actual.Dial != nil { + _, actualError := actual.Dial(context.Background(), "", "") + _, expectedError := expected.Dial(context.Background(), "", "") + if !reflect.DeepEqual(expectedError, actualError) { + t.Fatalf("CopyConfig dropped the Dial field") + } + } + actual.Dial = nil + expected.Dial = nil + if actual.AuthConfigPersister != nil { + actualError := actual.AuthConfigPersister.Persist(nil) + expectedError := expected.AuthConfigPersister.Persist(nil) + if !reflect.DeepEqual(expectedError, actualError) { + t.Fatalf("CopyConfig dropped the Dial field") + } + } + actual.AuthConfigPersister = nil + expected.AuthConfigPersister = nil + + if !reflect.DeepEqual(*actual, expected) { + t.Fatalf("CopyConfig dropped unexpected fields, identify whether they are security related or not: %s", diff.ObjectReflectDiff(expected, *actual)) + } + } +} diff --git a/vendor/k8s.io/client-go/rest/plugin_test.go b/vendor/k8s.io/client-go/rest/plugin_test.go new file mode 100644 index 00000000..070e5379 --- /dev/null +++ b/vendor/k8s.io/client-go/rest/plugin_test.go @@ -0,0 +1,311 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 rest + +import ( + "fmt" + "net/http" + "reflect" + "strconv" + "testing" + + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" +) + +func TestAuthPluginWrapTransport(t *testing.T) { + if err := RegisterAuthProviderPlugin("pluginA", pluginAProvider); err != nil { + t.Errorf("Unexpected error: failed to register pluginA: %v", err) + } + if err := RegisterAuthProviderPlugin("pluginB", pluginBProvider); err != nil { + t.Errorf("Unexpected error: failed to register pluginB: %v", err) + } + if err := RegisterAuthProviderPlugin("pluginFail", pluginFailProvider); err != nil { + t.Errorf("Unexpected error: failed to register pluginFail: %v", err) + } + testCases := []struct { + useWrapTransport bool + plugin string + expectErr bool + expectPluginA bool + expectPluginB bool + }{ + {false, "", false, false, false}, + {false, "pluginA", false, true, false}, + {false, "pluginB", false, false, true}, + {false, "pluginFail", true, false, false}, + {false, "pluginUnknown", true, false, false}, + } + for i, tc := range testCases { + c := Config{} + if tc.useWrapTransport { + // Specify an existing WrapTransport in the config to make sure that + // plugins play nicely. + c.WrapTransport = func(rt http.RoundTripper) http.RoundTripper { + return &wrapTransport{rt} + } + } + if len(tc.plugin) != 0 { + c.AuthProvider = &clientcmdapi.AuthProviderConfig{Name: tc.plugin} + } + tConfig, err := c.TransportConfig() + if err != nil { + // Unknown/bad plugins are expected to fail here. + if !tc.expectErr { + t.Errorf("%d. Did not expect errors loading Auth Plugin: %q. Got: %v", i, tc.plugin, err) + } + continue + } + var fullyWrappedTransport http.RoundTripper + fullyWrappedTransport = &emptyTransport{} + if tConfig.WrapTransport != nil { + fullyWrappedTransport = tConfig.WrapTransport(&emptyTransport{}) + } + res, err := fullyWrappedTransport.RoundTrip(&http.Request{}) + if err != nil { + t.Errorf("%d. Unexpected error in RoundTrip: %v", i, err) + continue + } + hasWrapTransport := res.Header.Get("wrapTransport") == "Y" + hasPluginA := res.Header.Get("pluginA") == "Y" + hasPluginB := res.Header.Get("pluginB") == "Y" + if hasWrapTransport != tc.useWrapTransport { + t.Errorf("%d. Expected Existing config.WrapTransport: %t; Got: %t", i, tc.useWrapTransport, hasWrapTransport) + } + if hasPluginA != tc.expectPluginA { + t.Errorf("%d. Expected Plugin A: %t; Got: %t", i, tc.expectPluginA, hasPluginA) + } + if hasPluginB != tc.expectPluginB { + t.Errorf("%d. Expected Plugin B: %t; Got: %t", i, tc.expectPluginB, hasPluginB) + } + } +} + +func TestAuthPluginPersist(t *testing.T) { + // register pluginA by a different name so we don't collide across tests. + if err := RegisterAuthProviderPlugin("pluginA2", pluginAProvider); err != nil { + t.Errorf("Unexpected error: failed to register pluginA: %v", err) + } + if err := RegisterAuthProviderPlugin("pluginPersist", pluginPersistProvider); err != nil { + t.Errorf("Unexpected error: failed to register pluginPersist: %v", err) + } + fooBarConfig := map[string]string{"foo": "bar"} + testCases := []struct { + plugin string + startingConfig map[string]string + expectedConfigAfterLogin map[string]string + expectedConfigAfterRoundTrip map[string]string + }{ + // non-persisting plugins should work fine without modifying config. + {"pluginA2", map[string]string{}, map[string]string{}, map[string]string{}}, + {"pluginA2", fooBarConfig, fooBarConfig, fooBarConfig}, + // plugins that persist config should be able to persist when they want. + { + "pluginPersist", + map[string]string{}, + map[string]string{ + "login": "Y", + }, + map[string]string{ + "login": "Y", + "roundTrips": "1", + }, + }, + { + "pluginPersist", + map[string]string{ + "login": "Y", + "roundTrips": "123", + }, + map[string]string{ + "login": "Y", + "roundTrips": "123", + }, + map[string]string{ + "login": "Y", + "roundTrips": "124", + }, + }, + } + for i, tc := range testCases { + cfg := &clientcmdapi.AuthProviderConfig{ + Name: tc.plugin, + Config: tc.startingConfig, + } + persister := &inMemoryPersister{make(map[string]string)} + persister.Persist(tc.startingConfig) + plugin, err := GetAuthProvider("127.0.0.1", cfg, persister) + if err != nil { + t.Errorf("%d. Unexpected error: failed to get plugin %q: %v", i, tc.plugin, err) + } + if err := plugin.Login(); err != nil { + t.Errorf("%d. Unexpected error calling Login() w/ plugin %q: %v", i, tc.plugin, err) + } + // Make sure the plugin persisted what we expect after Login(). + if !reflect.DeepEqual(persister.savedConfig, tc.expectedConfigAfterLogin) { + t.Errorf("%d. Unexpected persisted config after calling %s.Login(): \nGot:\n%v\nExpected:\n%v", + i, tc.plugin, persister.savedConfig, tc.expectedConfigAfterLogin) + } + if _, err := plugin.WrapTransport(&emptyTransport{}).RoundTrip(&http.Request{}); err != nil { + t.Errorf("%d. Unexpected error round-tripping w/ plugin %q: %v", i, tc.plugin, err) + } + // Make sure the plugin persisted what we expect after RoundTrip(). + if !reflect.DeepEqual(persister.savedConfig, tc.expectedConfigAfterRoundTrip) { + t.Errorf("%d. Unexpected persisted config after calling %s.WrapTransport.RoundTrip(): \nGot:\n%v\nExpected:\n%v", + i, tc.plugin, persister.savedConfig, tc.expectedConfigAfterLogin) + } + } + +} + +// emptyTransport provides an empty http.Response with an initialized header +// to allow wrapping RoundTrippers to set header values. +type emptyTransport struct{} + +func (*emptyTransport) RoundTrip(req *http.Request) (*http.Response, error) { + res := &http.Response{ + Header: make(map[string][]string), + } + return res, nil +} + +// wrapTransport sets "wrapTransport" = "Y" on the response. +type wrapTransport struct { + rt http.RoundTripper +} + +func (w *wrapTransport) RoundTrip(req *http.Request) (*http.Response, error) { + res, err := w.rt.RoundTrip(req) + if err != nil { + return nil, err + } + res.Header.Add("wrapTransport", "Y") + return res, nil +} + +// wrapTransportA sets "pluginA" = "Y" on the response. +type wrapTransportA struct { + rt http.RoundTripper +} + +func (w *wrapTransportA) RoundTrip(req *http.Request) (*http.Response, error) { + res, err := w.rt.RoundTrip(req) + if err != nil { + return nil, err + } + res.Header.Add("pluginA", "Y") + return res, nil +} + +type pluginA struct{} + +func (*pluginA) WrapTransport(rt http.RoundTripper) http.RoundTripper { + return &wrapTransportA{rt} +} + +func (*pluginA) Login() error { return nil } + +func pluginAProvider(string, map[string]string, AuthProviderConfigPersister) (AuthProvider, error) { + return &pluginA{}, nil +} + +// wrapTransportB sets "pluginB" = "Y" on the response. +type wrapTransportB struct { + rt http.RoundTripper +} + +func (w *wrapTransportB) RoundTrip(req *http.Request) (*http.Response, error) { + res, err := w.rt.RoundTrip(req) + if err != nil { + return nil, err + } + res.Header.Add("pluginB", "Y") + return res, nil +} + +type pluginB struct{} + +func (*pluginB) WrapTransport(rt http.RoundTripper) http.RoundTripper { + return &wrapTransportB{rt} +} + +func (*pluginB) Login() error { return nil } + +func pluginBProvider(string, map[string]string, AuthProviderConfigPersister) (AuthProvider, error) { + return &pluginB{}, nil +} + +// pluginFailProvider simulates a registered AuthPlugin that fails to load. +func pluginFailProvider(string, map[string]string, AuthProviderConfigPersister) (AuthProvider, error) { + return nil, fmt.Errorf("Failed to load AuthProvider") +} + +type inMemoryPersister struct { + savedConfig map[string]string +} + +func (i *inMemoryPersister) Persist(config map[string]string) error { + i.savedConfig = make(map[string]string) + for k, v := range config { + i.savedConfig[k] = v + } + return nil +} + +// wrapTransportPersist increments the "roundTrips" entry from the config when +// roundTrip is called. +type wrapTransportPersist struct { + rt http.RoundTripper + config map[string]string + persister AuthProviderConfigPersister +} + +func (w *wrapTransportPersist) RoundTrip(req *http.Request) (*http.Response, error) { + roundTrips := 0 + if rtVal, ok := w.config["roundTrips"]; ok { + var err error + roundTrips, err = strconv.Atoi(rtVal) + if err != nil { + return nil, err + } + } + roundTrips++ + w.config["roundTrips"] = fmt.Sprintf("%d", roundTrips) + if err := w.persister.Persist(w.config); err != nil { + return nil, err + } + return w.rt.RoundTrip(req) +} + +type pluginPersist struct { + config map[string]string + persister AuthProviderConfigPersister +} + +func (p *pluginPersist) WrapTransport(rt http.RoundTripper) http.RoundTripper { + return &wrapTransportPersist{rt, p.config, p.persister} +} + +// Login sets the config entry "login" to "Y". +func (p *pluginPersist) Login() error { + p.config["login"] = "Y" + p.persister.Persist(p.config) + return nil +} + +func pluginPersistProvider(_ string, config map[string]string, persister AuthProviderConfigPersister) (AuthProvider, error) { + return &pluginPersist{config, persister}, nil +} diff --git a/vendor/k8s.io/client-go/rest/request.go b/vendor/k8s.io/client-go/rest/request.go index 09ffd76d..9bb31144 100644 --- a/vendor/k8s.io/client-go/rest/request.go +++ b/vendor/k8s.io/client-go/rest/request.go @@ -198,7 +198,7 @@ func (r *Request) Throttle(limiter flowcontrol.RateLimiter) *Request { return r } -// SubResource sets a sub-resource path which can be multiple segments segment after the resource +// SubResource sets a sub-resource path which can be multiple segments after the resource // name but before the suffix. func (r *Request) SubResource(subresources ...string) *Request { if r.err != nil { @@ -455,17 +455,9 @@ func (r *Request) URL() *url.URL { // finalURLTemplate is similar to URL(), but will make all specific parameter values equal // - instead of name or namespace, "{name}" and "{namespace}" will be used, and all query -// parameters will be reset. This creates a copy of the request so as not to change the -// underlying object. This means some useful request info (like the types of field -// selectors in use) will be lost. -// TODO: preserve field selector keys +// parameters will be reset. This creates a copy of the url so as not to change the +// underlying object. func (r Request) finalURLTemplate() url.URL { - if len(r.resourceName) != 0 { - r.resourceName = "{name}" - } - if r.namespaceSet && len(r.namespace) != 0 { - r.namespace = "{namespace}" - } newParams := url.Values{} v := []string{"{value}"} for k := range r.params { @@ -473,6 +465,59 @@ func (r Request) finalURLTemplate() url.URL { } r.params = newParams url := r.URL() + segments := strings.Split(r.URL().Path, "/") + groupIndex := 0 + index := 0 + if r.URL() != nil && r.baseURL != nil && strings.Contains(r.URL().Path, r.baseURL.Path) { + groupIndex += len(strings.Split(r.baseURL.Path, "/")) + } + if groupIndex >= len(segments) { + return *url + } + + const CoreGroupPrefix = "api" + const NamedGroupPrefix = "apis" + isCoreGroup := segments[groupIndex] == CoreGroupPrefix + isNamedGroup := segments[groupIndex] == NamedGroupPrefix + if isCoreGroup { + // checking the case of core group with /api/v1/... format + index = groupIndex + 2 + } else if isNamedGroup { + // checking the case of named group with /apis/apps/v1/... format + index = groupIndex + 3 + } else { + // this should not happen that the only two possibilities are /api... and /apis..., just want to put an + // outlet here in case more API groups are added in future if ever possible: + // https://kubernetes.io/docs/concepts/overview/kubernetes-api/#api-groups + // if a wrong API groups name is encountered, return the {prefix} for url.Path + url.Path = "/{prefix}" + url.RawQuery = "" + return *url + } + //switch segLength := len(segments) - index; segLength { + switch { + // case len(segments) - index == 1: + // resource (with no name) do nothing + case len(segments)-index == 2: + // /$RESOURCE/$NAME: replace $NAME with {name} + segments[index+1] = "{name}" + case len(segments)-index == 3: + if segments[index+2] == "finalize" || segments[index+2] == "status" { + // /$RESOURCE/$NAME/$SUBRESOURCE: replace $NAME with {name} + segments[index+1] = "{name}" + } else { + // /namespace/$NAMESPACE/$RESOURCE: replace $NAMESPACE with {namespace} + segments[index+1] = "{namespace}" + } + case len(segments)-index >= 4: + segments[index+1] = "{namespace}" + // /namespace/$NAMESPACE/$RESOURCE/$NAME: replace $NAMESPACE with {namespace}, $NAME with {name} + if segments[index+3] != "finalize" && segments[index+3] != "status" { + // /$RESOURCE/$NAME/$SUBRESOURCE: replace $NAME with {name} + segments[index+3] = "{name}" + } + } + url.Path = path.Join(segments...) return *url } @@ -731,7 +776,7 @@ func (r *Request) request(fn func(*http.Request, *http.Response)) error { } } - glog.V(4).Infof("Got a Retry-After %s response for attempt %d to %v", seconds, retries, url) + glog.V(4).Infof("Got a Retry-After %ds response for attempt %d to %v", seconds, retries, url) r.backoffMgr.Sleep(time.Duration(seconds) * time.Second) return false } diff --git a/vendor/k8s.io/client-go/rest/request_test.go b/vendor/k8s.io/client-go/rest/request_test.go new file mode 100755 index 00000000..2660c0be --- /dev/null +++ b/vendor/k8s.io/client-go/rest/request_test.go @@ -0,0 +1,1937 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 rest + +import ( + "bytes" + "context" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/http/httptest" + "net/url" + "os" + "reflect" + "strings" + "syscall" + "testing" + "time" + + "github.com/golang/glog" + + "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + 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/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/apimachinery/pkg/util/httpstream" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/kubernetes/scheme" + restclientwatch "k8s.io/client-go/rest/watch" + "k8s.io/client-go/util/flowcontrol" + utiltesting "k8s.io/client-go/util/testing" +) + +func TestNewRequestSetsAccept(t *testing.T) { + r := NewRequest(nil, "get", &url.URL{Path: "/path/"}, "", ContentConfig{}, Serializers{}, nil, nil, 0) + if r.headers.Get("Accept") != "" { + t.Errorf("unexpected headers: %#v", r.headers) + } + r = NewRequest(nil, "get", &url.URL{Path: "/path/"}, "", ContentConfig{ContentType: "application/other"}, Serializers{}, nil, nil, 0) + if r.headers.Get("Accept") != "application/other, */*" { + t.Errorf("unexpected headers: %#v", r.headers) + } +} + +type clientFunc func(req *http.Request) (*http.Response, error) + +func (f clientFunc) Do(req *http.Request) (*http.Response, error) { + return f(req) +} + +func TestRequestSetsHeaders(t *testing.T) { + server := clientFunc(func(req *http.Request) (*http.Response, error) { + if req.Header.Get("Accept") != "application/other, */*" { + t.Errorf("unexpected headers: %#v", req.Header) + } + return &http.Response{ + StatusCode: http.StatusForbidden, + Body: ioutil.NopCloser(bytes.NewReader([]byte{})), + }, nil + }) + config := defaultContentConfig() + config.ContentType = "application/other" + serializers := defaultSerializers(t) + r := NewRequest(server, "get", &url.URL{Path: "/path"}, "", config, serializers, nil, nil, 0) + + // Check if all "issue" methods are setting headers. + _ = r.Do() + _, _ = r.Watch() + _, _ = r.Stream() +} + +func TestRequestWithErrorWontChange(t *testing.T) { + gvCopy := v1.SchemeGroupVersion + original := Request{ + err: errors.New("test"), + content: ContentConfig{GroupVersion: &gvCopy}, + } + r := original + changed := r.Param("foo", "bar"). + AbsPath("/abs"). + Prefix("test"). + Suffix("testing"). + Namespace("new"). + Resource("foos"). + Name("bars"). + Body("foo"). + Timeout(time.Millisecond) + if changed != &r { + t.Errorf("returned request should point to the same object") + } + if !reflect.DeepEqual(changed, &original) { + t.Errorf("expected %#v, got %#v", &original, changed) + } +} + +func TestRequestPreservesBaseTrailingSlash(t *testing.T) { + r := &Request{baseURL: &url.URL{}, pathPrefix: "/path/"} + if s := r.URL().String(); s != "/path/" { + t.Errorf("trailing slash should be preserved: %s", s) + } +} + +func TestRequestAbsPathPreservesTrailingSlash(t *testing.T) { + r := (&Request{baseURL: &url.URL{}}).AbsPath("/foo/") + if s := r.URL().String(); s != "/foo/" { + t.Errorf("trailing slash should be preserved: %s", s) + } + + r = (&Request{baseURL: &url.URL{}}).AbsPath("/foo/") + if s := r.URL().String(); s != "/foo/" { + t.Errorf("trailing slash should be preserved: %s", s) + } +} + +func TestRequestAbsPathJoins(t *testing.T) { + r := (&Request{baseURL: &url.URL{}}).AbsPath("foo/bar", "baz") + if s := r.URL().String(); s != "foo/bar/baz" { + t.Errorf("trailing slash should be preserved: %s", s) + } +} + +func TestRequestSetsNamespace(t *testing.T) { + r := (&Request{ + baseURL: &url.URL{ + Path: "/", + }, + }).Namespace("foo") + if r.namespace == "" { + t.Errorf("namespace should be set: %#v", r) + } + + if s := r.URL().String(); s != "namespaces/foo" { + t.Errorf("namespace should be in path: %s", s) + } +} + +func TestRequestOrdersNamespaceInPath(t *testing.T) { + r := (&Request{ + baseURL: &url.URL{}, + pathPrefix: "/test/", + }).Name("bar").Resource("baz").Namespace("foo") + if s := r.URL().String(); s != "/test/namespaces/foo/baz/bar" { + t.Errorf("namespace should be in order in path: %s", s) + } +} + +func TestRequestOrdersSubResource(t *testing.T) { + r := (&Request{ + baseURL: &url.URL{}, + pathPrefix: "/test/", + }).Name("bar").Resource("baz").Namespace("foo").Suffix("test").SubResource("a", "b") + if s := r.URL().String(); s != "/test/namespaces/foo/baz/bar/a/b/test" { + t.Errorf("namespace should be in order in path: %s", s) + } +} + +func TestRequestSetTwiceError(t *testing.T) { + if (&Request{}).Name("bar").Name("baz").err == nil { + t.Errorf("setting name twice should result in error") + } + if (&Request{}).Namespace("bar").Namespace("baz").err == nil { + t.Errorf("setting namespace twice should result in error") + } + if (&Request{}).Resource("bar").Resource("baz").err == nil { + t.Errorf("setting resource twice should result in error") + } + if (&Request{}).SubResource("bar").SubResource("baz").err == nil { + t.Errorf("setting subresource twice should result in error") + } +} + +func TestInvalidSegments(t *testing.T) { + invalidSegments := []string{".", "..", "test/segment", "test%2bsegment"} + setters := map[string]func(string, *Request){ + "namespace": func(s string, r *Request) { r.Namespace(s) }, + "resource": func(s string, r *Request) { r.Resource(s) }, + "name": func(s string, r *Request) { r.Name(s) }, + "subresource": func(s string, r *Request) { r.SubResource(s) }, + } + for _, invalidSegment := range invalidSegments { + for setterName, setter := range setters { + r := &Request{} + setter(invalidSegment, r) + if r.err == nil { + t.Errorf("%s: %s: expected error, got none", setterName, invalidSegment) + } + } + } +} + +func TestRequestParam(t *testing.T) { + r := (&Request{}).Param("foo", "a") + if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}}) { + t.Errorf("should have set a param: %#v", r) + } + + r.Param("bar", "1") + r.Param("bar", "2") + if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}, "bar": []string{"1", "2"}}) { + t.Errorf("should have set a param: %#v", r) + } +} + +func TestRequestVersionedParams(t *testing.T) { + r := (&Request{content: ContentConfig{GroupVersion: &v1.SchemeGroupVersion}}).Param("foo", "a") + if !reflect.DeepEqual(r.params, url.Values{"foo": []string{"a"}}) { + t.Errorf("should have set a param: %#v", r) + } + r.VersionedParams(&v1.PodLogOptions{Follow: true, Container: "bar"}, scheme.ParameterCodec) + + if !reflect.DeepEqual(r.params, url.Values{ + "foo": []string{"a"}, + "container": []string{"bar"}, + "follow": []string{"true"}, + }) { + t.Errorf("should have set a param: %#v", r) + } +} + +func TestRequestVersionedParamsFromListOptions(t *testing.T) { + r := &Request{content: ContentConfig{GroupVersion: &v1.SchemeGroupVersion}} + r.VersionedParams(&metav1.ListOptions{ResourceVersion: "1"}, scheme.ParameterCodec) + if !reflect.DeepEqual(r.params, url.Values{ + "resourceVersion": []string{"1"}, + }) { + t.Errorf("should have set a param: %#v", r) + } + + var timeout int64 = 10 + r.VersionedParams(&metav1.ListOptions{ResourceVersion: "2", TimeoutSeconds: &timeout}, scheme.ParameterCodec) + if !reflect.DeepEqual(r.params, url.Values{ + "resourceVersion": []string{"1", "2"}, + "timeoutSeconds": []string{"10"}, + }) { + t.Errorf("should have set a param: %#v %v", r.params, r.err) + } +} + +func TestRequestURI(t *testing.T) { + r := (&Request{}).Param("foo", "a") + r.Prefix("other") + r.RequestURI("/test?foo=b&a=b&c=1&c=2") + if r.pathPrefix != "/test" { + t.Errorf("path is wrong: %#v", r) + } + if !reflect.DeepEqual(r.params, url.Values{"a": []string{"b"}, "foo": []string{"b"}, "c": []string{"1", "2"}}) { + t.Errorf("should have set a param: %#v", r) + } +} + +type NotAnAPIObject struct{} + +func (obj NotAnAPIObject) GroupVersionKind() *schema.GroupVersionKind { return nil } +func (obj NotAnAPIObject) SetGroupVersionKind(gvk *schema.GroupVersionKind) {} + +func defaultContentConfig() ContentConfig { + gvCopy := v1.SchemeGroupVersion + return ContentConfig{ + ContentType: "application/json", + GroupVersion: &gvCopy, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, + } +} + +func defaultSerializers(t *testing.T) Serializers { + config := defaultContentConfig() + serializers, err := createSerializers(config) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + return *serializers +} + +func TestRequestBody(t *testing.T) { + // test unknown type + r := (&Request{}).Body([]string{"test"}) + if r.err == nil || r.body != nil { + t.Errorf("should have set err and left body nil: %#v", r) + } + + // test error set when failing to read file + f, err := ioutil.TempFile("", "test") + if err != nil { + t.Fatalf("unable to create temp file") + } + defer f.Close() + os.Remove(f.Name()) + r = (&Request{}).Body(f.Name()) + if r.err == nil || r.body != nil { + t.Errorf("should have set err and left body nil: %#v", r) + } + + // test unencodable api object + r = (&Request{content: defaultContentConfig()}).Body(&NotAnAPIObject{}) + if r.err == nil || r.body != nil { + t.Errorf("should have set err and left body nil: %#v", r) + } +} + +func TestResultIntoWithErrReturnsErr(t *testing.T) { + res := Result{err: errors.New("test")} + if err := res.Into(&v1.Pod{}); err != res.err { + t.Errorf("should have returned exact error from result") + } +} + +func TestResultIntoWithNoBodyReturnsErr(t *testing.T) { + res := Result{ + body: []byte{}, + decoder: scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), + } + if err := res.Into(&v1.Pod{}); err == nil || !strings.Contains(err.Error(), "0-length") { + t.Errorf("should have complained about 0 length body") + } +} + +func TestURLTemplate(t *testing.T) { + uri, _ := url.Parse("http://localhost/some/base/url/path") + testCases := []struct { + Request *Request + ExpectedFullURL string + ExpectedFinalURL string + }{ + { + // non dynamic client + Request: NewRequest(nil, "POST", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("api", "v1").Resource("r1").Namespace("ns").Name("nm").Param("p0", "v0"), + ExpectedFullURL: "http://localhost/some/base/url/path/api/v1/namespaces/ns/r1/nm?p0=v0", + ExpectedFinalURL: "http://localhost/some/base/url/path/api/v1/namespaces/%7Bnamespace%7D/r1/%7Bname%7D?p0=%7Bvalue%7D", + }, + { + // non dynamic client with wrong api group + Request: NewRequest(nil, "POST", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("pre1", "v1").Resource("r1").Namespace("ns").Name("nm").Param("p0", "v0"), + ExpectedFullURL: "http://localhost/some/base/url/path/pre1/v1/namespaces/ns/r1/nm?p0=v0", + ExpectedFinalURL: "http://localhost/%7Bprefix%7D", + }, + { + // dynamic client with core group + namespace + resourceResource (with name) + // /api/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/api/v1/namespaces/ns/r1/name1"), + ExpectedFullURL: "http://localhost/some/base/url/path/api/v1/namespaces/ns/r1/name1", + ExpectedFinalURL: "http://localhost/some/base/url/path/api/v1/namespaces/%7Bnamespace%7D/r1/%7Bname%7D", + }, + { + // dynamic client with named group + namespace + resourceResource (with name) + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/g1/v1/namespaces/ns/r1/name1"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/g1/v1/namespaces/ns/r1/name1", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/g1/v1/namespaces/%7Bnamespace%7D/r1/%7Bname%7D", + }, + { + // dynamic client with core group + namespace + resourceResource (with NO name) + // /api/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/api/v1/namespaces/ns/r1"), + ExpectedFullURL: "http://localhost/some/base/url/path/api/v1/namespaces/ns/r1", + ExpectedFinalURL: "http://localhost/some/base/url/path/api/v1/namespaces/%7Bnamespace%7D/r1", + }, + { + // dynamic client with named group + namespace + resourceResource (with NO name) + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/g1/v1/namespaces/ns/r1"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/g1/v1/namespaces/ns/r1", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/g1/v1/namespaces/%7Bnamespace%7D/r1", + }, + { + // dynamic client with core group + resourceResource (with name) + // /api/$RESOURCEVERSION/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/api/v1/r1/name1"), + ExpectedFullURL: "http://localhost/some/base/url/path/api/v1/r1/name1", + ExpectedFinalURL: "http://localhost/some/base/url/path/api/v1/r1/%7Bname%7D", + }, + { + // dynamic client with named group + resourceResource (with name) + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/g1/v1/r1/name1"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/g1/v1/r1/name1", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/g1/v1/r1/%7Bname%7D", + }, + { + // dynamic client with named group + namespace + resourceResource (with name) + subresource + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME/$SUBRESOURCE + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces/finalize"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces/finalize", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bnamespace%7D/namespaces/%7Bname%7D/finalize", + }, + { + // dynamic client with named group + namespace + resourceResource (with name) + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bnamespace%7D/namespaces/%7Bname%7D", + }, + { + // dynamic client with named group + namespace + resourceResource (with NO name) + subresource + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%SUBRESOURCE + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces/namespaces/finalize"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces/namespaces/finalize", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bnamespace%7D/namespaces/finalize", + }, + { + // dynamic client with named group + namespace + resourceResource (with NO name) + subresource + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%SUBRESOURCE + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces/namespaces/status"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces/namespaces/status", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bnamespace%7D/namespaces/status", + }, + { + // dynamic client with named group + namespace + resourceResource (with no name) + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces/namespaces"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces/namespaces", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bnamespace%7D/namespaces", + }, + { + // dynamic client with named group + resourceResource (with name) + subresource + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces/finalize"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces/finalize", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bname%7D/finalize", + }, + { + // dynamic client with named group + resourceResource (with name) + subresource + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces/status"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces/status", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bname%7D/status", + }, + { + // dynamic client with named group + resourceResource (with name) + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces/namespaces"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/namespaces", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces/%7Bname%7D", + }, + { + // dynamic client with named group + resourceResource (with no name) + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/$RESOURCE/%NAME + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/apis/namespaces/namespaces/namespaces"), + ExpectedFullURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces", + ExpectedFinalURL: "http://localhost/some/base/url/path/apis/namespaces/namespaces/namespaces", + }, + { + // dynamic client with wrong api group + namespace + resourceResource (with name) + subresource + // /apis/$NAMEDGROUPNAME/$RESOURCEVERSION/namespaces/$NAMESPACE/$RESOURCE/%NAME/$SUBRESOURCE + Request: NewRequest(nil, "DELETE", uri, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0). + Prefix("/pre1/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces/finalize"), + ExpectedFullURL: "http://localhost/some/base/url/path/pre1/namespaces/namespaces/namespaces/namespaces/namespaces/namespaces/finalize", + ExpectedFinalURL: "http://localhost/%7Bprefix%7D", + }, + } + for i, testCase := range testCases { + r := testCase.Request + full := r.URL() + if full.String() != testCase.ExpectedFullURL { + t.Errorf("%d: unexpected initial URL: %s %s", i, full, testCase.ExpectedFullURL) + } + actualURL := r.finalURLTemplate() + actual := actualURL.String() + if actual != testCase.ExpectedFinalURL { + t.Errorf("%d: unexpected URL template: %s %s", i, actual, testCase.ExpectedFinalURL) + } + if r.URL().String() != full.String() { + t.Errorf("%d, creating URL template changed request: %s -> %s", i, full.String(), r.URL().String()) + } + } +} + +func TestTransformResponse(t *testing.T) { + invalid := []byte("aaaaa") + uri, _ := url.Parse("http://localhost") + testCases := []struct { + Response *http.Response + Data []byte + Created bool + Error bool + ErrFn func(err error) bool + }{ + {Response: &http.Response{StatusCode: 200}, Data: []byte{}}, + {Response: &http.Response{StatusCode: 201}, Data: []byte{}, Created: true}, + {Response: &http.Response{StatusCode: 199}, Error: true}, + {Response: &http.Response{StatusCode: 500}, Error: true}, + {Response: &http.Response{StatusCode: 422}, Error: true}, + {Response: &http.Response{StatusCode: 409}, Error: true}, + {Response: &http.Response{StatusCode: 404}, Error: true}, + {Response: &http.Response{StatusCode: 401}, Error: true}, + { + Response: &http.Response{ + StatusCode: 401, + Header: http.Header{"Content-Type": []string{"application/json"}}, + Body: ioutil.NopCloser(bytes.NewReader(invalid)), + }, + Error: true, + ErrFn: func(err error) bool { + return err.Error() != "aaaaa" && apierrors.IsUnauthorized(err) + }, + }, + { + Response: &http.Response{ + StatusCode: 401, + Header: http.Header{"Content-Type": []string{"text/any"}}, + Body: ioutil.NopCloser(bytes.NewReader(invalid)), + }, + Error: true, + ErrFn: func(err error) bool { + return strings.Contains(err.Error(), "server has asked for the client to provide") && apierrors.IsUnauthorized(err) + }, + }, + {Response: &http.Response{StatusCode: 403}, Error: true}, + {Response: &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader(invalid))}, Data: invalid}, + {Response: &http.Response{StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader(invalid))}, Data: invalid}, + } + for i, test := range testCases { + r := NewRequest(nil, "", uri, "", defaultContentConfig(), defaultSerializers(t), nil, nil, 0) + if test.Response.Body == nil { + test.Response.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) + } + result := r.transformResponse(test.Response, &http.Request{}) + response, created, err := result.body, result.statusCode == http.StatusCreated, result.err + hasErr := err != nil + if hasErr != test.Error { + t.Errorf("%d: unexpected error: %t %v", i, test.Error, err) + } else if hasErr && test.Response.StatusCode > 399 { + status, ok := err.(apierrors.APIStatus) + if !ok { + t.Errorf("%d: response should have been transformable into APIStatus: %v", i, err) + continue + } + if int(status.Status().Code) != test.Response.StatusCode { + t.Errorf("%d: status code did not match response: %#v", i, status.Status()) + } + } + if test.ErrFn != nil && !test.ErrFn(err) { + t.Errorf("%d: error function did not match: %v", i, err) + } + if !(test.Data == nil && response == nil) && !apiequality.Semantic.DeepDerivative(test.Data, response) { + t.Errorf("%d: unexpected response: %#v %#v", i, test.Data, response) + } + if test.Created != created { + t.Errorf("%d: expected created %t, got %t", i, test.Created, created) + } + } +} + +type renegotiator struct { + called bool + contentType string + params map[string]string + decoder runtime.Decoder + err error +} + +func (r *renegotiator) invoke(contentType string, params map[string]string) (runtime.Decoder, error) { + r.called = true + r.contentType = contentType + r.params = params + return r.decoder, r.err +} + +func TestTransformResponseNegotiate(t *testing.T) { + invalid := []byte("aaaaa") + uri, _ := url.Parse("http://localhost") + testCases := []struct { + Response *http.Response + Data []byte + Created bool + Error bool + ErrFn func(err error) bool + + ContentType string + Called bool + ExpectContentType string + Decoder runtime.Decoder + NegotiateErr error + }{ + { + ContentType: "application/json", + Response: &http.Response{ + StatusCode: 401, + Header: http.Header{"Content-Type": []string{"application/json"}}, + Body: ioutil.NopCloser(bytes.NewReader(invalid)), + }, + Error: true, + ErrFn: func(err error) bool { + return err.Error() != "aaaaa" && apierrors.IsUnauthorized(err) + }, + }, + { + ContentType: "application/json", + Response: &http.Response{ + StatusCode: 401, + Header: http.Header{"Content-Type": []string{"application/protobuf"}}, + Body: ioutil.NopCloser(bytes.NewReader(invalid)), + }, + Decoder: scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), + + Called: true, + ExpectContentType: "application/protobuf", + + Error: true, + ErrFn: func(err error) bool { + return err.Error() != "aaaaa" && apierrors.IsUnauthorized(err) + }, + }, + { + ContentType: "application/json", + Response: &http.Response{ + StatusCode: 500, + Header: http.Header{"Content-Type": []string{"application/,others"}}, + }, + Decoder: scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), + + Error: true, + ErrFn: func(err error) bool { + return err.Error() == "Internal error occurred: mime: expected token after slash" && err.(apierrors.APIStatus).Status().Code == 500 + }, + }, + { + // no negotiation when no content type specified + Response: &http.Response{ + StatusCode: 200, + Header: http.Header{"Content-Type": []string{"text/any"}}, + Body: ioutil.NopCloser(bytes.NewReader(invalid)), + }, + Decoder: scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), + }, + { + // no negotiation when no response content type specified + ContentType: "text/any", + Response: &http.Response{ + StatusCode: 200, + Body: ioutil.NopCloser(bytes.NewReader(invalid)), + }, + Decoder: scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), + }, + { + // unrecognized content type is not handled + ContentType: "application/json", + Response: &http.Response{ + StatusCode: 404, + Header: http.Header{"Content-Type": []string{"application/unrecognized"}}, + Body: ioutil.NopCloser(bytes.NewReader(invalid)), + }, + Decoder: scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), + + NegotiateErr: fmt.Errorf("aaaa"), + Called: true, + ExpectContentType: "application/unrecognized", + + Error: true, + ErrFn: func(err error) bool { + return err.Error() != "aaaaa" && apierrors.IsNotFound(err) + }, + }, + } + for i, test := range testCases { + serializers := defaultSerializers(t) + negotiator := &renegotiator{ + decoder: test.Decoder, + err: test.NegotiateErr, + } + serializers.RenegotiatedDecoder = negotiator.invoke + contentConfig := defaultContentConfig() + contentConfig.ContentType = test.ContentType + r := NewRequest(nil, "", uri, "", contentConfig, serializers, nil, nil, 0) + if test.Response.Body == nil { + test.Response.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) + } + result := r.transformResponse(test.Response, &http.Request{}) + _, err := result.body, result.err + hasErr := err != nil + if hasErr != test.Error { + t.Errorf("%d: unexpected error: %t %v", i, test.Error, err) + continue + } else if hasErr && test.Response.StatusCode > 399 { + status, ok := err.(apierrors.APIStatus) + if !ok { + t.Errorf("%d: response should have been transformable into APIStatus: %v", i, err) + continue + } + if int(status.Status().Code) != test.Response.StatusCode { + t.Errorf("%d: status code did not match response: %#v", i, status.Status()) + } + } + if test.ErrFn != nil && !test.ErrFn(err) { + t.Errorf("%d: error function did not match: %v", i, err) + } + if negotiator.called != test.Called { + t.Errorf("%d: negotiator called %t != %t", i, negotiator.called, test.Called) + } + if !test.Called { + continue + } + if negotiator.contentType != test.ExpectContentType { + t.Errorf("%d: unexpected content type: %s", i, negotiator.contentType) + } + } +} + +func TestTransformUnstructuredError(t *testing.T) { + testCases := []struct { + Req *http.Request + Res *http.Response + + Resource string + Name string + + ErrFn func(error) bool + Transformed error + }{ + { + Resource: "foo", + Name: "bar", + Req: &http.Request{ + Method: "POST", + }, + Res: &http.Response{ + StatusCode: http.StatusConflict, + Body: ioutil.NopCloser(bytes.NewReader(nil)), + }, + ErrFn: apierrors.IsAlreadyExists, + }, + { + Resource: "foo", + Name: "bar", + Req: &http.Request{ + Method: "PUT", + }, + Res: &http.Response{ + StatusCode: http.StatusConflict, + Body: ioutil.NopCloser(bytes.NewReader(nil)), + }, + ErrFn: apierrors.IsConflict, + }, + { + Resource: "foo", + Name: "bar", + Req: &http.Request{}, + Res: &http.Response{ + StatusCode: http.StatusNotFound, + Body: ioutil.NopCloser(bytes.NewReader(nil)), + }, + ErrFn: apierrors.IsNotFound, + }, + { + Req: &http.Request{}, + Res: &http.Response{ + StatusCode: http.StatusBadRequest, + Body: ioutil.NopCloser(bytes.NewReader(nil)), + }, + ErrFn: apierrors.IsBadRequest, + }, + { + // status in response overrides transformed result + Req: &http.Request{}, + Res: &http.Response{StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(bytes.NewReader([]byte(`{"kind":"Status","apiVersion":"v1","status":"Failure","code":404}`)))}, + ErrFn: apierrors.IsBadRequest, + Transformed: &apierrors.StatusError{ + ErrStatus: metav1.Status{Status: metav1.StatusFailure, Code: http.StatusNotFound}, + }, + }, + { + // successful status is ignored + Req: &http.Request{}, + Res: &http.Response{StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(bytes.NewReader([]byte(`{"kind":"Status","apiVersion":"v1","status":"Success","code":404}`)))}, + ErrFn: apierrors.IsBadRequest, + }, + { + // empty object does not change result + Req: &http.Request{}, + Res: &http.Response{StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(bytes.NewReader([]byte(`{}`)))}, + ErrFn: apierrors.IsBadRequest, + }, + { + // we default apiVersion for backwards compatibility with old clients + // TODO: potentially remove in 1.7 + Req: &http.Request{}, + Res: &http.Response{StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(bytes.NewReader([]byte(`{"kind":"Status","status":"Failure","code":404}`)))}, + ErrFn: apierrors.IsBadRequest, + Transformed: &apierrors.StatusError{ + ErrStatus: metav1.Status{Status: metav1.StatusFailure, Code: http.StatusNotFound}, + }, + }, + { + // we do not default kind + Req: &http.Request{}, + Res: &http.Response{StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(bytes.NewReader([]byte(`{"status":"Failure","code":404}`)))}, + ErrFn: apierrors.IsBadRequest, + }, + } + + for i, testCase := range testCases { + r := &Request{ + content: defaultContentConfig(), + serializers: defaultSerializers(t), + resourceName: testCase.Name, + resource: testCase.Resource, + } + result := r.transformResponse(testCase.Res, testCase.Req) + err := result.err + if !testCase.ErrFn(err) { + t.Errorf("unexpected error: %v", err) + continue + } + if !apierrors.IsUnexpectedServerError(err) { + t.Errorf("%d: unexpected error type: %v", i, err) + } + if len(testCase.Name) != 0 && !strings.Contains(err.Error(), testCase.Name) { + t.Errorf("unexpected error string: %s", err) + } + if len(testCase.Resource) != 0 && !strings.Contains(err.Error(), testCase.Resource) { + t.Errorf("unexpected error string: %s", err) + } + + // verify Error() properly transforms the error + transformed := result.Error() + expect := testCase.Transformed + if expect == nil { + expect = err + } + if !reflect.DeepEqual(expect, transformed) { + t.Errorf("%d: unexpected Error(): %s", i, diff.ObjectReflectDiff(expect, transformed)) + } + + // verify result.Get properly transforms the error + if _, err := result.Get(); !reflect.DeepEqual(expect, err) { + t.Errorf("%d: unexpected error on Get(): %s", i, diff.ObjectReflectDiff(expect, err)) + } + + // verify result.Into properly handles the error + if err := result.Into(&v1.Pod{}); !reflect.DeepEqual(expect, err) { + t.Errorf("%d: unexpected error on Into(): %s", i, diff.ObjectReflectDiff(expect, err)) + } + + // verify result.Raw leaves the error in the untransformed state + if _, err := result.Raw(); !reflect.DeepEqual(result.err, err) { + t.Errorf("%d: unexpected error on Raw(): %s", i, diff.ObjectReflectDiff(expect, err)) + } + } +} + +func TestRequestWatch(t *testing.T) { + testCases := []struct { + Request *Request + Err bool + ErrFn func(error) bool + Empty bool + }{ + { + Request: &Request{err: errors.New("bail")}, + Err: true, + }, + { + Request: &Request{baseURL: &url.URL{}, pathPrefix: "%"}, + Err: true, + }, + { + Request: &Request{ + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return nil, errors.New("err") + }), + baseURL: &url.URL{}, + }, + Err: true, + }, + { + Request: &Request{ + content: defaultContentConfig(), + serializers: defaultSerializers(t), + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusForbidden, + Body: ioutil.NopCloser(bytes.NewReader([]byte{})), + }, nil + }), + baseURL: &url.URL{}, + }, + Err: true, + ErrFn: func(err error) bool { + return apierrors.IsForbidden(err) + }, + }, + { + Request: &Request{ + content: defaultContentConfig(), + serializers: defaultSerializers(t), + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusUnauthorized, + Body: ioutil.NopCloser(bytes.NewReader([]byte{})), + }, nil + }), + baseURL: &url.URL{}, + }, + Err: true, + ErrFn: func(err error) bool { + return apierrors.IsUnauthorized(err) + }, + }, + { + Request: &Request{ + content: defaultContentConfig(), + serializers: defaultSerializers(t), + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusUnauthorized, + Body: ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), &metav1.Status{ + Status: metav1.StatusFailure, + Reason: metav1.StatusReasonUnauthorized, + })))), + }, nil + }), + baseURL: &url.URL{}, + }, + Err: true, + ErrFn: func(err error) bool { + return apierrors.IsUnauthorized(err) + }, + }, + { + Request: &Request{ + serializers: defaultSerializers(t), + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return nil, io.EOF + }), + baseURL: &url.URL{}, + }, + Empty: true, + }, + { + Request: &Request{ + serializers: defaultSerializers(t), + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return nil, &url.Error{Err: io.EOF} + }), + baseURL: &url.URL{}, + }, + Empty: true, + }, + { + Request: &Request{ + serializers: defaultSerializers(t), + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return nil, errors.New("http: can't write HTTP request on broken connection") + }), + baseURL: &url.URL{}, + }, + Empty: true, + }, + { + Request: &Request{ + serializers: defaultSerializers(t), + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return nil, errors.New("foo: connection reset by peer") + }), + baseURL: &url.URL{}, + }, + Empty: true, + }, + } + for i, testCase := range testCases { + t.Logf("testcase %v", testCase.Request) + testCase.Request.backoffMgr = &NoBackoff{} + watch, err := testCase.Request.Watch() + hasErr := err != nil + if hasErr != testCase.Err { + t.Errorf("%d: expected %t, got %t: %v", i, testCase.Err, hasErr, err) + continue + } + if testCase.ErrFn != nil && !testCase.ErrFn(err) { + t.Errorf("%d: error not valid: %v", i, err) + } + if hasErr && watch != nil { + t.Errorf("%d: watch should be nil when error is returned", i) + continue + } + if testCase.Empty { + _, ok := <-watch.ResultChan() + if ok { + t.Errorf("%d: expected the watch to be empty: %#v", i, watch) + } + } + } +} + +func TestRequestStream(t *testing.T) { + testCases := []struct { + Request *Request + Err bool + ErrFn func(error) bool + }{ + { + Request: &Request{err: errors.New("bail")}, + Err: true, + }, + { + Request: &Request{baseURL: &url.URL{}, pathPrefix: "%"}, + Err: true, + }, + { + Request: &Request{ + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return nil, errors.New("err") + }), + baseURL: &url.URL{}, + }, + Err: true, + }, + { + Request: &Request{ + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusUnauthorized, + Body: ioutil.NopCloser(bytes.NewReader([]byte(runtime.EncodeOrDie(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), &metav1.Status{ + Status: metav1.StatusFailure, + Reason: metav1.StatusReasonUnauthorized, + })))), + }, nil + }), + content: defaultContentConfig(), + serializers: defaultSerializers(t), + baseURL: &url.URL{}, + }, + Err: true, + }, + { + Request: &Request{ + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return &http.Response{ + StatusCode: http.StatusBadRequest, + Body: ioutil.NopCloser(bytes.NewReader([]byte(`{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"a container name must be specified for pod kube-dns-v20-mz5cv, choose one of: [kubedns dnsmasq healthz]","reason":"BadRequest","code":400}`))), + }, nil + }), + content: defaultContentConfig(), + serializers: defaultSerializers(t), + baseURL: &url.URL{}, + }, + Err: true, + ErrFn: func(err error) bool { + if err.Error() == "a container name must be specified for pod kube-dns-v20-mz5cv, choose one of: [kubedns dnsmasq healthz]" { + return true + } + return false + }, + }, + } + for i, testCase := range testCases { + testCase.Request.backoffMgr = &NoBackoff{} + body, err := testCase.Request.Stream() + hasErr := err != nil + if hasErr != testCase.Err { + t.Errorf("%d: expected %t, got %t: %v", i, testCase.Err, hasErr, err) + } + if hasErr && body != nil { + t.Errorf("%d: body should be nil when error is returned", i) + } + + if hasErr { + if testCase.ErrFn != nil && !testCase.ErrFn(err) { + t.Errorf("unexpected error: %v", err) + } + } + } +} + +type fakeUpgradeConnection struct{} + +func (c *fakeUpgradeConnection) CreateStream(headers http.Header) (httpstream.Stream, error) { + return nil, nil +} +func (c *fakeUpgradeConnection) Close() error { + return nil +} +func (c *fakeUpgradeConnection) CloseChan() <-chan bool { + return make(chan bool) +} +func (c *fakeUpgradeConnection) SetIdleTimeout(timeout time.Duration) { +} + +type fakeUpgradeRoundTripper struct { + req *http.Request + conn httpstream.Connection +} + +func (f *fakeUpgradeRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + f.req = req + b := []byte{} + body := ioutil.NopCloser(bytes.NewReader(b)) + resp := &http.Response{ + StatusCode: 101, + Body: body, + } + return resp, nil +} + +func (f *fakeUpgradeRoundTripper) NewConnection(resp *http.Response) (httpstream.Connection, error) { + return f.conn, nil +} + +func TestRequestDo(t *testing.T) { + testCases := []struct { + Request *Request + Err bool + }{ + { + Request: &Request{err: errors.New("bail")}, + Err: true, + }, + { + Request: &Request{baseURL: &url.URL{}, pathPrefix: "%"}, + Err: true, + }, + { + Request: &Request{ + client: clientFunc(func(req *http.Request) (*http.Response, error) { + return nil, errors.New("err") + }), + baseURL: &url.URL{}, + }, + Err: true, + }, + } + for i, testCase := range testCases { + testCase.Request.backoffMgr = &NoBackoff{} + body, err := testCase.Request.Do().Raw() + hasErr := err != nil + if hasErr != testCase.Err { + t.Errorf("%d: expected %t, got %t: %v", i, testCase.Err, hasErr, err) + } + if hasErr && body != nil { + t.Errorf("%d: body should be nil when error is returned", i) + } + } +} + +func TestDoRequestNewWay(t *testing.T) { + reqBody := "request body" + expectedObj := &v1.Service{Spec: v1.ServiceSpec{Ports: []v1.ServicePort{{ + Protocol: "TCP", + Port: 12345, + TargetPort: intstr.FromInt(12345), + }}}} + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expectedObj) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: 200, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + defer testServer.Close() + c := testRESTClient(t, testServer) + obj, err := c.Verb("POST"). + Prefix("foo", "bar"). + Suffix("baz"). + Timeout(time.Second). + Body([]byte(reqBody)). + Do().Get() + if err != nil { + t.Errorf("Unexpected error: %v %#v", err, err) + return + } + if obj == nil { + t.Error("nil obj") + } else if !apiequality.Semantic.DeepDerivative(expectedObj, obj) { + t.Errorf("Expected: %#v, got %#v", expectedObj, obj) + } + requestURL := defaultResourcePathWithPrefix("foo/bar", "", "", "baz") + requestURL += "?timeout=1s" + fakeHandler.ValidateRequest(t, requestURL, "POST", &reqBody) +} + +// This test assumes that the client implementation backs off exponentially, for an individual request. +func TestBackoffLifecycle(t *testing.T) { + count := 0 + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + count++ + t.Logf("Attempt %d", count) + if count == 5 || count == 9 { + w.WriteHeader(http.StatusOK) + return + } else { + w.WriteHeader(http.StatusGatewayTimeout) + return + } + })) + defer testServer.Close() + c := testRESTClient(t, testServer) + + // Test backoff recovery and increase. This correlates to the constants + // which are used in the server implementation returning StatusOK above. + seconds := []int{0, 1, 2, 4, 8, 0, 1, 2, 4, 0} + request := c.Verb("POST").Prefix("backofftest").Suffix("abc") + clock := clock.FakeClock{} + request.backoffMgr = &URLBackoff{ + // Use a fake backoff here to avoid flakes and speed the test up. + Backoff: flowcontrol.NewFakeBackOff( + time.Duration(1)*time.Second, + time.Duration(200)*time.Second, + &clock, + )} + + for _, sec := range seconds { + thisBackoff := request.backoffMgr.CalculateBackoff(request.URL()) + t.Logf("Current backoff %v", thisBackoff) + if thisBackoff != time.Duration(sec)*time.Second { + t.Errorf("Backoff is %v instead of %v", thisBackoff, sec) + } + now := clock.Now() + request.DoRaw() + elapsed := clock.Since(now) + if clock.Since(now) != thisBackoff { + t.Errorf("CalculatedBackoff not honored by clock: Expected time of %v, but got %v ", thisBackoff, elapsed) + } + } +} + +type testBackoffManager struct { + sleeps []time.Duration +} + +func (b *testBackoffManager) UpdateBackoff(actualUrl *url.URL, err error, responseCode int) { +} + +func (b *testBackoffManager) CalculateBackoff(actualUrl *url.URL) time.Duration { + return time.Duration(0) +} + +func (b *testBackoffManager) Sleep(d time.Duration) { + b.sleeps = append(b.sleeps, d) +} + +func TestCheckRetryClosesBody(t *testing.T) { + count := 0 + ch := make(chan struct{}) + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + count++ + t.Logf("attempt %d", count) + if count >= 5 { + w.WriteHeader(http.StatusOK) + close(ch) + return + } + w.Header().Set("Retry-After", "1") + http.Error(w, "Too many requests, please try again later.", http.StatusTooManyRequests) + })) + defer testServer.Close() + + backoffMgr := &testBackoffManager{} + expectedSleeps := []time.Duration{0, time.Second, 0, time.Second, 0, time.Second, 0, time.Second, 0} + + c := testRESTClient(t, testServer) + c.createBackoffMgr = func() BackoffManager { return backoffMgr } + _, err := c.Verb("POST"). + Prefix("foo", "bar"). + Suffix("baz"). + Timeout(time.Second). + Body([]byte(strings.Repeat("abcd", 1000))). + DoRaw() + if err != nil { + t.Fatalf("Unexpected error: %v %#v", err, err) + } + <-ch + if count != 5 { + t.Errorf("unexpected retries: %d", count) + } + if !reflect.DeepEqual(backoffMgr.sleeps, expectedSleeps) { + t.Errorf("unexpected sleeps, expected: %v, got: %v", expectedSleeps, backoffMgr.sleeps) + } +} + +func TestConnectionResetByPeerIsRetried(t *testing.T) { + count := 0 + backoff := &testBackoffManager{} + req := &Request{ + verb: "GET", + client: clientFunc(func(req *http.Request) (*http.Response, error) { + count++ + if count >= 3 { + return &http.Response{ + StatusCode: 200, + Body: ioutil.NopCloser(bytes.NewReader([]byte{})), + }, nil + } + return nil, &net.OpError{Err: syscall.ECONNRESET} + }), + backoffMgr: backoff, + } + // We expect two retries of "connection reset by peer" and the success. + _, err := req.Do().Raw() + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + // We have a sleep before each retry (including the initial one) and for + // every "retry-after" call - thus 5 together. + if len(backoff.sleeps) != 5 { + t.Errorf("Expected 5 retries, got: %d", len(backoff.sleeps)) + } +} + +func TestCheckRetryHandles429And5xx(t *testing.T) { + count := 0 + ch := make(chan struct{}) + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + data, err := ioutil.ReadAll(req.Body) + if err != nil { + t.Fatalf("unable to read request body: %v", err) + } + if !bytes.Equal(data, []byte(strings.Repeat("abcd", 1000))) { + t.Fatalf("retry did not send a complete body: %s", data) + } + t.Logf("attempt %d", count) + if count >= 4 { + w.WriteHeader(http.StatusOK) + close(ch) + return + } + w.Header().Set("Retry-After", "0") + w.WriteHeader([]int{http.StatusTooManyRequests, 500, 501, 504}[count]) + count++ + })) + defer testServer.Close() + + c := testRESTClient(t, testServer) + _, err := c.Verb("POST"). + Prefix("foo", "bar"). + Suffix("baz"). + Timeout(time.Second). + Body([]byte(strings.Repeat("abcd", 1000))). + DoRaw() + if err != nil { + t.Fatalf("Unexpected error: %v %#v", err, err) + } + <-ch + if count != 4 { + t.Errorf("unexpected retries: %d", count) + } +} + +func BenchmarkCheckRetryClosesBody(b *testing.B) { + count := 0 + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + count++ + if count%3 == 0 { + w.WriteHeader(http.StatusOK) + return + } + w.Header().Set("Retry-After", "0") + w.WriteHeader(http.StatusTooManyRequests) + })) + defer testServer.Close() + + c := testRESTClient(b, testServer) + r := c.Verb("POST"). + Prefix("foo", "bar"). + Suffix("baz"). + Timeout(time.Second). + Body([]byte(strings.Repeat("abcd", 1000))) + + for i := 0; i < b.N; i++ { + if _, err := r.DoRaw(); err != nil { + b.Fatalf("Unexpected error: %v %#v", err, err) + } + } +} + +func TestDoRequestNewWayReader(t *testing.T) { + reqObj := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + reqBodyExpected, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), reqObj) + expectedObj := &v1.Service{Spec: v1.ServiceSpec{Ports: []v1.ServicePort{{ + Protocol: "TCP", + Port: 12345, + TargetPort: intstr.FromInt(12345), + }}}} + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expectedObj) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: 200, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + defer testServer.Close() + c := testRESTClient(t, testServer) + obj, err := c.Verb("POST"). + Resource("bar"). + Name("baz"). + Prefix("foo"). + Timeout(time.Second). + Body(bytes.NewBuffer(reqBodyExpected)). + Do().Get() + if err != nil { + t.Errorf("Unexpected error: %v %#v", err, err) + return + } + if obj == nil { + t.Error("nil obj") + } else if !apiequality.Semantic.DeepDerivative(expectedObj, obj) { + t.Errorf("Expected: %#v, got %#v", expectedObj, obj) + } + tmpStr := string(reqBodyExpected) + requestURL := defaultResourcePathWithPrefix("foo", "bar", "", "baz") + requestURL += "?timeout=1s" + fakeHandler.ValidateRequest(t, requestURL, "POST", &tmpStr) +} + +func TestDoRequestNewWayObj(t *testing.T) { + reqObj := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + reqBodyExpected, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), reqObj) + expectedObj := &v1.Service{Spec: v1.ServiceSpec{Ports: []v1.ServicePort{{ + Protocol: "TCP", + Port: 12345, + TargetPort: intstr.FromInt(12345), + }}}} + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expectedObj) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: 200, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + defer testServer.Close() + c := testRESTClient(t, testServer) + obj, err := c.Verb("POST"). + Suffix("baz"). + Name("bar"). + Resource("foo"). + Timeout(time.Second). + Body(reqObj). + Do().Get() + if err != nil { + t.Errorf("Unexpected error: %v %#v", err, err) + return + } + if obj == nil { + t.Error("nil obj") + } else if !apiequality.Semantic.DeepDerivative(expectedObj, obj) { + t.Errorf("Expected: %#v, got %#v", expectedObj, obj) + } + tmpStr := string(reqBodyExpected) + requestURL := defaultResourcePathWithPrefix("", "foo", "", "bar/baz") + requestURL += "?timeout=1s" + fakeHandler.ValidateRequest(t, requestURL, "POST", &tmpStr) +} + +func TestDoRequestNewWayFile(t *testing.T) { + reqObj := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + reqBodyExpected, err := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), reqObj) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + file, err := ioutil.TempFile("", "foo") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + defer file.Close() + defer os.Remove(file.Name()) + + _, err = file.Write(reqBodyExpected) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + expectedObj := &v1.Service{Spec: v1.ServiceSpec{Ports: []v1.ServicePort{{ + Protocol: "TCP", + Port: 12345, + TargetPort: intstr.FromInt(12345), + }}}} + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expectedObj) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: 200, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + defer testServer.Close() + c := testRESTClient(t, testServer) + wasCreated := true + obj, err := c.Verb("POST"). + Prefix("foo/bar", "baz"). + Timeout(time.Second). + Body(file.Name()). + Do().WasCreated(&wasCreated).Get() + if err != nil { + t.Errorf("Unexpected error: %v %#v", err, err) + return + } + if obj == nil { + t.Error("nil obj") + } else if !apiequality.Semantic.DeepDerivative(expectedObj, obj) { + t.Errorf("Expected: %#v, got %#v", expectedObj, obj) + } + if wasCreated { + t.Errorf("expected object was created") + } + tmpStr := string(reqBodyExpected) + requestURL := defaultResourcePathWithPrefix("foo/bar/baz", "", "", "") + requestURL += "?timeout=1s" + fakeHandler.ValidateRequest(t, requestURL, "POST", &tmpStr) +} + +func TestWasCreated(t *testing.T) { + reqObj := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + reqBodyExpected, err := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), reqObj) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + expectedObj := &v1.Service{Spec: v1.ServiceSpec{Ports: []v1.ServicePort{{ + Protocol: "TCP", + Port: 12345, + TargetPort: intstr.FromInt(12345), + }}}} + expectedBody, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expectedObj) + fakeHandler := utiltesting.FakeHandler{ + StatusCode: 201, + ResponseBody: string(expectedBody), + T: t, + } + testServer := httptest.NewServer(&fakeHandler) + defer testServer.Close() + c := testRESTClient(t, testServer) + wasCreated := false + obj, err := c.Verb("PUT"). + Prefix("foo/bar", "baz"). + Timeout(time.Second). + Body(reqBodyExpected). + Do().WasCreated(&wasCreated).Get() + if err != nil { + t.Errorf("Unexpected error: %v %#v", err, err) + return + } + if obj == nil { + t.Error("nil obj") + } else if !apiequality.Semantic.DeepDerivative(expectedObj, obj) { + t.Errorf("Expected: %#v, got %#v", expectedObj, obj) + } + if !wasCreated { + t.Errorf("Expected object was created") + } + + tmpStr := string(reqBodyExpected) + requestURL := defaultResourcePathWithPrefix("foo/bar/baz", "", "", "") + requestURL += "?timeout=1s" + fakeHandler.ValidateRequest(t, requestURL, "PUT", &tmpStr) +} + +func TestVerbs(t *testing.T) { + c := testRESTClient(t, nil) + if r := c.Post(); r.verb != "POST" { + t.Errorf("Post verb is wrong") + } + if r := c.Put(); r.verb != "PUT" { + t.Errorf("Put verb is wrong") + } + if r := c.Get(); r.verb != "GET" { + t.Errorf("Get verb is wrong") + } + if r := c.Delete(); r.verb != "DELETE" { + t.Errorf("Delete verb is wrong") + } +} + +func TestAbsPath(t *testing.T) { + for i, tc := range []struct { + configPrefix string + resourcePrefix string + absPath string + wantsAbsPath string + }{ + {"/", "", "", "/"}, + {"", "", "/", "/"}, + {"", "", "/api", "/api"}, + {"", "", "/api/", "/api/"}, + {"", "", "/apis", "/apis"}, + {"", "/foo", "/bar/foo", "/bar/foo"}, + {"", "/api/foo/123", "/bar/foo", "/bar/foo"}, + {"/p1", "", "", "/p1"}, + {"/p1", "", "/", "/p1/"}, + {"/p1", "", "/api", "/p1/api"}, + {"/p1", "", "/apis", "/p1/apis"}, + {"/p1", "/r1", "/apis", "/p1/apis"}, + {"/p1", "/api/r1", "/apis", "/p1/apis"}, + {"/p1/api/p2", "", "", "/p1/api/p2"}, + {"/p1/api/p2", "", "/", "/p1/api/p2/"}, + {"/p1/api/p2", "", "/api", "/p1/api/p2/api"}, + {"/p1/api/p2", "", "/api/", "/p1/api/p2/api/"}, + {"/p1/api/p2", "/r1", "/api/", "/p1/api/p2/api/"}, + {"/p1/api/p2", "/api/r1", "/api/", "/p1/api/p2/api/"}, + } { + u, _ := url.Parse("http://localhost:123" + tc.configPrefix) + r := NewRequest(nil, "POST", u, "", ContentConfig{GroupVersion: &schema.GroupVersion{Group: "test"}}, Serializers{}, nil, nil, 0).Prefix(tc.resourcePrefix).AbsPath(tc.absPath) + if r.pathPrefix != tc.wantsAbsPath { + t.Errorf("test case %d failed, unexpected path: %q, expected %q", i, r.pathPrefix, tc.wantsAbsPath) + } + } +} + +func TestUnacceptableParamNames(t *testing.T) { + table := []struct { + name string + testVal string + expectSuccess bool + }{ + // timeout is no longer "protected" + {"timeout", "42", true}, + } + + for _, item := range table { + c := testRESTClient(t, nil) + r := c.Get().setParam(item.name, item.testVal) + if e, a := item.expectSuccess, r.err == nil; e != a { + t.Errorf("expected %v, got %v (%v)", e, a, r.err) + } + } +} + +func TestBody(t *testing.T) { + const data = "test payload" + + obj := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + bodyExpected, _ := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), obj) + + f, err := ioutil.TempFile("", "test_body") + if err != nil { + t.Fatalf("TempFile error: %v", err) + } + if _, err := f.WriteString(data); err != nil { + t.Fatalf("TempFile.WriteString error: %v", err) + } + f.Close() + defer os.Remove(f.Name()) + + var nilObject *metav1.DeleteOptions + typedObject := interface{}(nilObject) + c := testRESTClient(t, nil) + tests := []struct { + input interface{} + expected string + headers map[string]string + }{ + {[]byte(data), data, nil}, + {f.Name(), data, nil}, + {strings.NewReader(data), data, nil}, + {obj, string(bodyExpected), map[string]string{"Content-Type": "application/json"}}, + {typedObject, "", nil}, + } + for i, tt := range tests { + r := c.Post().Body(tt.input) + if r.err != nil { + t.Errorf("%d: r.Body(%#v) error: %v", i, tt, r.err) + continue + } + if tt.headers != nil { + for k, v := range tt.headers { + if r.headers.Get(k) != v { + t.Errorf("%d: r.headers[%q] = %q; want %q", i, k, v, v) + } + } + } + + if r.body == nil { + if len(tt.expected) != 0 { + t.Errorf("%d: r.body = %q; want %q", i, r.body, tt.expected) + } + continue + } + buf := make([]byte, len(tt.expected)) + if _, err := r.body.Read(buf); err != nil { + t.Errorf("%d: r.body.Read error: %v", i, err) + continue + } + body := string(buf) + if body != tt.expected { + t.Errorf("%d: r.body = %q; want %q", i, body, tt.expected) + } + } +} + +func TestWatch(t *testing.T) { + var table = []struct { + t watch.EventType + obj runtime.Object + }{ + {watch.Added, &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "first"}}}, + {watch.Modified, &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "second"}}}, + {watch.Deleted, &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "last"}}}, + } + + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + flusher, ok := w.(http.Flusher) + if !ok { + panic("need flusher!") + } + + w.Header().Set("Transfer-Encoding", "chunked") + w.WriteHeader(http.StatusOK) + flusher.Flush() + + encoder := restclientwatch.NewEncoder(streaming.NewEncoder(w, scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)), scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion)) + for _, item := range table { + if err := encoder.Encode(&watch.Event{Type: item.t, Object: item.obj}); err != nil { + panic(err) + } + flusher.Flush() + } + })) + defer testServer.Close() + + s := testRESTClient(t, testServer) + watching, err := s.Get().Prefix("path/to/watch/thing").Watch() + if err != nil { + t.Fatalf("Unexpected error") + } + + for _, item := range table { + got, ok := <-watching.ResultChan() + if !ok { + t.Fatalf("Unexpected early close") + } + if e, a := item.t, got.Type; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + if e, a := item.obj, got.Object; !apiequality.Semantic.DeepDerivative(e, a) { + t.Errorf("Expected %v, got %v", e, a) + } + } + + _, ok := <-watching.ResultChan() + if ok { + t.Fatal("Unexpected non-close") + } +} + +func TestStream(t *testing.T) { + expectedBody := "expected body" + + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + flusher, ok := w.(http.Flusher) + if !ok { + panic("need flusher!") + } + w.Header().Set("Transfer-Encoding", "chunked") + w.WriteHeader(http.StatusOK) + w.Write([]byte(expectedBody)) + flusher.Flush() + })) + defer testServer.Close() + + s := testRESTClient(t, testServer) + readCloser, err := s.Get().Prefix("path/to/stream/thing").Stream() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + defer readCloser.Close() + buf := new(bytes.Buffer) + buf.ReadFrom(readCloser) + resultBody := buf.String() + + if expectedBody != resultBody { + t.Errorf("Expected %s, got %s", expectedBody, resultBody) + } +} + +func testRESTClient(t testing.TB, srv *httptest.Server) *RESTClient { + baseURL, _ := url.Parse("http://localhost") + if srv != nil { + var err error + baseURL, err = url.Parse(srv.URL) + if err != nil { + t.Fatalf("failed to parse test URL: %v", err) + } + } + versionedAPIPath := defaultResourcePathWithPrefix("", "", "", "") + client, err := NewRESTClient(baseURL, versionedAPIPath, defaultContentConfig(), 0, 0, nil, nil) + if err != nil { + t.Fatalf("failed to create a client: %v", err) + } + return client +} + +func TestDoContext(t *testing.T) { + receivedCh := make(chan struct{}) + block := make(chan struct{}) + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + close(receivedCh) + <-block + w.WriteHeader(http.StatusOK) + })) + defer testServer.Close() + defer close(block) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + go func() { + <-receivedCh + cancel() + }() + + c := testRESTClient(t, testServer) + _, err := c.Verb("GET"). + Context(ctx). + Prefix("foo"). + DoRaw() + if err == nil { + t.Fatal("Expected context cancellation error") + } +} + +func buildString(length int) string { + s := make([]byte, length) + for i := range s { + s[i] = 'a' + } + return string(s) +} + +func TestTruncateBody(t *testing.T) { + tests := []struct { + body string + want string + level string + }{ + // Anything below 8 is completely truncated + { + body: "Completely truncated below 8", + want: " [truncated 28 chars]", + level: "0", + }, + // Small strings are not truncated by high levels + { + body: "Small body never gets truncated", + want: "Small body never gets truncated", + level: "10", + }, + { + body: "Small body never gets truncated", + want: "Small body never gets truncated", + level: "8", + }, + // Strings are truncated to 1024 if level is less than 9. + { + body: buildString(2000), + level: "8", + want: fmt.Sprintf("%s [truncated 976 chars]", buildString(1024)), + }, + // Strings are truncated to 10240 if level is 9. + { + body: buildString(20000), + level: "9", + want: fmt.Sprintf("%s [truncated 9760 chars]", buildString(10240)), + }, + // Strings are not truncated if level is 10 or higher + { + body: buildString(20000), + level: "10", + want: buildString(20000), + }, + // Strings are not truncated if level is 10 or higher + { + body: buildString(20000), + level: "11", + want: buildString(20000), + }, + } + + l := flag.Lookup("v").Value.(flag.Getter).Get().(glog.Level) + for _, test := range tests { + flag.Set("v", test.level) + got := truncateBody(test.body) + if got != test.want { + t.Errorf("truncateBody(%v) = %v, want %v", test.body, got, test.want) + } + } + flag.Set("v", l.String()) +} + +func defaultResourcePathWithPrefix(prefix, resource, namespace, name string) string { + var path string + path = "/api/" + v1.SchemeGroupVersion.Version + + if prefix != "" { + path = path + "/" + prefix + } + if namespace != "" { + path = path + "/namespaces/" + namespace + } + // Resource names are lower case. + resource = strings.ToLower(resource) + if resource != "" { + path = path + "/" + resource + } + if name != "" { + path = path + "/" + name + } + return path +} diff --git a/vendor/k8s.io/client-go/rest/token_source.go b/vendor/k8s.io/client-go/rest/token_source.go new file mode 100644 index 00000000..296b2a04 --- /dev/null +++ b/vendor/k8s.io/client-go/rest/token_source.go @@ -0,0 +1,138 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 rest + +import ( + "fmt" + "io/ioutil" + "net/http" + "strings" + "sync" + "time" + + "github.com/golang/glog" + "golang.org/x/oauth2" +) + +// TokenSourceWrapTransport returns a WrapTransport that injects bearer tokens +// authentication from an oauth2.TokenSource. +func TokenSourceWrapTransport(ts oauth2.TokenSource) func(http.RoundTripper) http.RoundTripper { + return func(rt http.RoundTripper) http.RoundTripper { + return &tokenSourceTransport{ + base: rt, + ort: &oauth2.Transport{ + Source: ts, + Base: rt, + }, + } + } +} + +func newCachedPathTokenSource(path string) oauth2.TokenSource { + return &cachingTokenSource{ + now: time.Now, + leeway: 1 * time.Minute, + base: &fileTokenSource{ + path: path, + // This period was picked because it is half of the minimum validity + // duration for a token provisioned by they TokenRequest API. This is + // unsophisticated and should induce rotation at a frequency that should + // work with the token volume source. + period: 5 * time.Minute, + }, + } +} + +type tokenSourceTransport struct { + base http.RoundTripper + ort http.RoundTripper +} + +func (tst *tokenSourceTransport) RoundTrip(req *http.Request) (*http.Response, error) { + // This is to allow --token to override other bearer token providers. + if req.Header.Get("Authorization") != "" { + return tst.base.RoundTrip(req) + } + return tst.ort.RoundTrip(req) +} + +type fileTokenSource struct { + path string + period time.Duration +} + +var _ = oauth2.TokenSource(&fileTokenSource{}) + +func (ts *fileTokenSource) Token() (*oauth2.Token, error) { + tokb, err := ioutil.ReadFile(ts.path) + if err != nil { + return nil, fmt.Errorf("failed to read token file %q: %v", ts.path, err) + } + tok := strings.TrimSpace(string(tokb)) + if len(tok) == 0 { + return nil, fmt.Errorf("read empty token from file %q", ts.path) + } + + return &oauth2.Token{ + AccessToken: tok, + Expiry: time.Now().Add(ts.period), + }, nil +} + +type cachingTokenSource struct { + base oauth2.TokenSource + leeway time.Duration + + sync.RWMutex + tok *oauth2.Token + + // for testing + now func() time.Time +} + +var _ = oauth2.TokenSource(&cachingTokenSource{}) + +func (ts *cachingTokenSource) Token() (*oauth2.Token, error) { + now := ts.now() + // fast path + ts.RLock() + tok := ts.tok + ts.RUnlock() + + if tok != nil && tok.Expiry.Add(-1*ts.leeway).After(now) { + return tok, nil + } + + // slow path + ts.Lock() + defer ts.Unlock() + if tok := ts.tok; tok != nil && tok.Expiry.Add(-1*ts.leeway).After(now) { + return tok, nil + } + + tok, err := ts.base.Token() + if err != nil { + if ts.tok == nil { + return nil, err + } + glog.Errorf("Unable to rotate token: %v", err) + return ts.tok, nil + } + + ts.tok = tok + return tok, nil +} diff --git a/vendor/k8s.io/client-go/rest/token_source_test.go b/vendor/k8s.io/client-go/rest/token_source_test.go new file mode 100644 index 00000000..40851f80 --- /dev/null +++ b/vendor/k8s.io/client-go/rest/token_source_test.go @@ -0,0 +1,156 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 rest + +import ( + "fmt" + "reflect" + "sync" + "testing" + "time" + + "golang.org/x/oauth2" +) + +type testTokenSource struct { + calls int + tok *oauth2.Token + err error +} + +func (ts *testTokenSource) Token() (*oauth2.Token, error) { + ts.calls++ + return ts.tok, ts.err +} + +func TestCachingTokenSource(t *testing.T) { + start := time.Now() + tokA := &oauth2.Token{ + AccessToken: "a", + Expiry: start.Add(10 * time.Minute), + } + tokB := &oauth2.Token{ + AccessToken: "b", + Expiry: start.Add(20 * time.Minute), + } + tests := []struct { + name string + + tok *oauth2.Token + tsTok *oauth2.Token + tsErr error + wait time.Duration + + wantTok *oauth2.Token + wantErr bool + wantTSCalls int + }{ + { + name: "valid token returned from cache", + tok: tokA, + wantTok: tokA, + }, + { + name: "valid token returned from cache 1 minute before scheduled refresh", + tok: tokA, + wait: 8 * time.Minute, + wantTok: tokA, + }, + { + name: "new token created when cache is empty", + tsTok: tokA, + wantTok: tokA, + wantTSCalls: 1, + }, + { + name: "new token created 1 minute after scheduled refresh", + tok: tokA, + tsTok: tokB, + wait: 10 * time.Minute, + wantTok: tokB, + wantTSCalls: 1, + }, + { + name: "error on create token returns error", + tsErr: fmt.Errorf("error"), + wantErr: true, + wantTSCalls: 1, + }, + } + for _, c := range tests { + t.Run(c.name, func(t *testing.T) { + tts := &testTokenSource{ + tok: c.tsTok, + err: c.tsErr, + } + + ts := &cachingTokenSource{ + base: tts, + tok: c.tok, + leeway: 1 * time.Minute, + now: func() time.Time { return start.Add(c.wait) }, + } + + gotTok, gotErr := ts.Token() + if got, want := gotTok, c.wantTok; !reflect.DeepEqual(got, want) { + t.Errorf("unexpected token:\n\tgot:\t%#v\n\twant:\t%#v", got, want) + } + if got, want := tts.calls, c.wantTSCalls; got != want { + t.Errorf("unexpected number of Token() calls: got %d, want %d", got, want) + } + if gotErr == nil && c.wantErr { + t.Errorf("wanted error but got none") + } + if gotErr != nil && !c.wantErr { + t.Errorf("unexpected error: %v", gotErr) + } + }) + } +} + +func TestCachingTokenSourceRace(t *testing.T) { + for i := 0; i < 100; i++ { + tts := &testTokenSource{ + tok: &oauth2.Token{ + AccessToken: "a", + Expiry: time.Now().Add(1000 * time.Hour), + }, + } + + ts := &cachingTokenSource{ + now: time.Now, + base: tts, + leeway: 1 * time.Minute, + } + + var wg sync.WaitGroup + wg.Add(100) + + for i := 0; i < 100; i++ { + go func() { + defer wg.Done() + if _, err := ts.Token(); err != nil { + t.Fatalf("err: %v", err) + } + }() + } + wg.Wait() + if tts.calls != 1 { + t.Errorf("expected one call to Token() but saw: %d", tts.calls) + } + } +} diff --git a/vendor/k8s.io/client-go/rest/url_utils_test.go b/vendor/k8s.io/client-go/rest/url_utils_test.go new file mode 100644 index 00000000..6321678a --- /dev/null +++ b/vendor/k8s.io/client-go/rest/url_utils_test.go @@ -0,0 +1,61 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 rest + +import ( + "path" + "testing" + + "k8s.io/api/core/v1" +) + +func TestValidatesHostParameter(t *testing.T) { + testCases := []struct { + Host string + APIPath string + + URL string + Err bool + }{ + {"127.0.0.1", "", "http://127.0.0.1/" + v1.SchemeGroupVersion.Version, false}, + {"127.0.0.1:8080", "", "http://127.0.0.1:8080/" + v1.SchemeGroupVersion.Version, false}, + {"foo.bar.com", "", "http://foo.bar.com/" + v1.SchemeGroupVersion.Version, false}, + {"http://host/prefix", "", "http://host/prefix/" + v1.SchemeGroupVersion.Version, false}, + {"http://host", "", "http://host/" + v1.SchemeGroupVersion.Version, false}, + {"http://host", "/", "http://host/" + v1.SchemeGroupVersion.Version, false}, + {"http://host", "/other", "http://host/other/" + v1.SchemeGroupVersion.Version, false}, + {"host/server", "", "", true}, + } + for i, testCase := range testCases { + u, versionedAPIPath, err := DefaultServerURL(testCase.Host, testCase.APIPath, v1.SchemeGroupVersion, false) + switch { + case err == nil && testCase.Err: + t.Errorf("expected error but was nil") + continue + case err != nil && !testCase.Err: + t.Errorf("unexpected error %v", err) + continue + case err != nil: + continue + } + u.Path = path.Join(u.Path, versionedAPIPath) + if e, a := testCase.URL, u.String(); e != a { + t.Errorf("%d: expected host %s, got %s", i, e, a) + continue + } + } +} diff --git a/vendor/k8s.io/client-go/rest/urlbackoff_test.go b/vendor/k8s.io/client-go/rest/urlbackoff_test.go new file mode 100644 index 00000000..c5f43923 --- /dev/null +++ b/vendor/k8s.io/client-go/rest/urlbackoff_test.go @@ -0,0 +1,79 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 rest + +import ( + "net/url" + "testing" + "time" + + "k8s.io/client-go/util/flowcontrol" +) + +func parse(raw string) *url.URL { + theUrl, _ := url.Parse(raw) + return theUrl +} + +func TestURLBackoffFunctionalityCollisions(t *testing.T) { + myBackoff := &URLBackoff{ + Backoff: flowcontrol.NewBackOff(1*time.Second, 60*time.Second), + } + + // Add some noise and make sure backoff for a clean URL is zero. + myBackoff.UpdateBackoff(parse("http://100.200.300.400:8080"), nil, 500) + + myBackoff.UpdateBackoff(parse("http://1.2.3.4:8080"), nil, 500) + + if myBackoff.CalculateBackoff(parse("http://1.2.3.4:100")) > 0 { + t.Errorf("URLs are colliding in the backoff map!") + } +} + +// TestURLBackoffFunctionality generally tests the URLBackoff wrapper. We avoid duplicating tests from backoff and request. +func TestURLBackoffFunctionality(t *testing.T) { + myBackoff := &URLBackoff{ + Backoff: flowcontrol.NewBackOff(1*time.Second, 60*time.Second), + } + + // Now test that backoff increases, then recovers. + // 200 and 300 should both result in clearing the backoff. + // all others like 429 should result in increased backoff. + seconds := []int{0, + 1, 2, 4, 8, 0, + 1, 2} + returnCodes := []int{ + 429, 500, 501, 502, 300, + 500, 501, 502, + } + + if len(seconds) != len(returnCodes) { + t.Fatalf("responseCode to backoff arrays should be the same length... sanity check failed.") + } + + for i, sec := range seconds { + backoffSec := myBackoff.CalculateBackoff(parse("http://1.2.3.4:100")) + if backoffSec < time.Duration(sec)*time.Second || backoffSec > time.Duration(sec+5)*time.Second { + t.Errorf("Backoff out of range %v: %v %v", i, sec, backoffSec) + } + myBackoff.UpdateBackoff(parse("http://1.2.3.4:100/responseCodeForFuncTest"), nil, returnCodes[i]) + } + + if myBackoff.CalculateBackoff(parse("http://1.2.3.4:100")) == 0 { + t.Errorf("The final return code %v should have resulted in a backoff ! ", returnCodes[7]) + } +} diff --git a/vendor/k8s.io/client-go/rest/watch/BUILD b/vendor/k8s.io/client-go/rest/watch/BUILD index 30dfadd1..699d9f3e 100644 --- a/vendor/k8s.io/client-go/rest/watch/BUILD +++ b/vendor/k8s.io/client-go/rest/watch/BUILD @@ -12,33 +12,34 @@ go_library( "decoder.go", "encoder.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/rest/watch", importpath = "k8s.io/client-go/rest/watch", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", ], ) go_test( - name = "go_default_xtest", + name = "go_default_test", srcs = [ "decoder_test.go", "encoder_test.go", ], + embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest/watch:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/rest/watch/decoder_test.go b/vendor/k8s.io/client-go/rest/watch/decoder_test.go new file mode 100644 index 00000000..2d29d437 --- /dev/null +++ b/vendor/k8s.io/client-go/rest/watch/decoder_test.go @@ -0,0 +1,123 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 versioned_test + +import ( + "encoding/json" + "io" + "testing" + "time" + + "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + runtimejson "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/kubernetes/scheme" + restclientwatch "k8s.io/client-go/rest/watch" +) + +// getDecoder mimics how k8s.io/client-go/rest.createSerializers creates a decoder +func getDecoder() runtime.Decoder { + jsonSerializer := runtimejson.NewSerializer(runtimejson.DefaultMetaFactory, scheme.Scheme, scheme.Scheme, false) + directCodecFactory := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + return directCodecFactory.DecoderToVersion(jsonSerializer, v1.SchemeGroupVersion) +} + +func TestDecoder(t *testing.T) { + table := []watch.EventType{watch.Added, watch.Deleted, watch.Modified, watch.Error} + + for _, eventType := range table { + out, in := io.Pipe() + + decoder := restclientwatch.NewDecoder(streaming.NewDecoder(out, getDecoder()), getDecoder()) + + expect := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + encoder := json.NewEncoder(in) + go func() { + data, err := runtime.Encode(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), expect) + if err != nil { + t.Fatalf("Unexpected error %v", err) + } + event := metav1.WatchEvent{ + Type: string(eventType), + Object: runtime.RawExtension{Raw: json.RawMessage(data)}, + } + if err := encoder.Encode(&event); err != nil { + t.Errorf("Unexpected error %v", err) + } + in.Close() + }() + + done := make(chan struct{}) + go func() { + action, got, err := decoder.Decode() + if err != nil { + t.Fatalf("Unexpected error %v", err) + } + if e, a := eventType, action; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + if e, a := expect, got; !apiequality.Semantic.DeepDerivative(e, a) { + t.Errorf("Expected %v, got %v", e, a) + } + t.Logf("Exited read") + close(done) + }() + <-done + + done = make(chan struct{}) + go func() { + _, _, err := decoder.Decode() + if err == nil { + t.Errorf("Unexpected nil error") + } + close(done) + }() + <-done + + decoder.Close() + } +} + +func TestDecoder_SourceClose(t *testing.T) { + out, in := io.Pipe() + decoder := restclientwatch.NewDecoder(streaming.NewDecoder(out, getDecoder()), getDecoder()) + + done := make(chan struct{}) + + go func() { + _, _, err := decoder.Decode() + if err == nil { + t.Errorf("Unexpected nil error") + } + close(done) + }() + + in.Close() + + select { + case <-done: + break + case <-time.After(wait.ForeverTestTimeout): + t.Error("Timeout") + } +} diff --git a/vendor/k8s.io/client-go/rest/watch/encoder_test.go b/vendor/k8s.io/client-go/rest/watch/encoder_test.go new file mode 100644 index 00000000..1388d1cc --- /dev/null +++ b/vendor/k8s.io/client-go/rest/watch/encoder_test.go @@ -0,0 +1,84 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 versioned_test + +import ( + "bytes" + "io/ioutil" + "testing" + + "k8s.io/api/core/v1" + apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + runtimejson "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/kubernetes/scheme" + restclientwatch "k8s.io/client-go/rest/watch" +) + +// getEncoder mimics how k8s.io/client-go/rest.createSerializers creates a encoder +func getEncoder() runtime.Encoder { + jsonSerializer := runtimejson.NewSerializer(runtimejson.DefaultMetaFactory, scheme.Scheme, scheme.Scheme, false) + directCodecFactory := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + return directCodecFactory.EncoderForVersion(jsonSerializer, v1.SchemeGroupVersion) +} + +func TestEncodeDecodeRoundTrip(t *testing.T) { + testCases := []struct { + Type watch.EventType + Object runtime.Object + }{ + { + watch.Added, + &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, + }, + { + watch.Modified, + &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, + }, + { + watch.Deleted, + &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}, + }, + } + for i, testCase := range testCases { + buf := &bytes.Buffer{} + + encoder := restclientwatch.NewEncoder(streaming.NewEncoder(buf, getEncoder()), getEncoder()) + if err := encoder.Encode(&watch.Event{Type: testCase.Type, Object: testCase.Object}); err != nil { + t.Errorf("%d: unexpected error: %v", i, err) + continue + } + + rc := ioutil.NopCloser(buf) + decoder := restclientwatch.NewDecoder(streaming.NewDecoder(rc, getDecoder()), getDecoder()) + event, obj, err := decoder.Decode() + if err != nil { + t.Errorf("%d: unexpected error: %v", i, err) + continue + } + if !apiequality.Semantic.DeepDerivative(testCase.Object, obj) { + t.Errorf("%d: expected %#v, got %#v", i, testCase.Object, obj) + } + if event != testCase.Type { + t.Errorf("%d: unexpected type: %#v", i, event) + } + } +} diff --git a/vendor/k8s.io/client-go/tools/cache/BUILD b/vendor/k8s.io/client-go/tools/cache/BUILD index 6be2aecd..0240fa6f 100644 --- a/vendor/k8s.io/client-go/tools/cache/BUILD +++ b/vendor/k8s.io/client-go/tools/cache/BUILD @@ -25,16 +25,16 @@ go_test( embed = [":go_default_library"], race = "off", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache/testing:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/cache/testing:go_default_library", ], ) @@ -61,27 +61,29 @@ go_library( "thread_safe_store.go", "undelta_store.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/cache", importpath = "k8s.io/client-go/tools/cache", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/cache:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/naming:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/tools/pager:go_default_library", + "//staging/src/k8s.io/client-go/util/buffer:go_default_library", + "//staging/src/k8s.io/client-go/util/retry:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/pager:go_default_library", - "//vendor/k8s.io/client-go/util/buffer:go_default_library", - "//vendor/k8s.io/client-go/util/retry:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/tools/cache/controller_test.go b/vendor/k8s.io/client-go/tools/cache/controller_test.go new file mode 100644 index 00000000..64aca8d7 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/controller_test.go @@ -0,0 +1,405 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 cache + +import ( + "fmt" + "math/rand" + "sync" + "testing" + "time" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + fcache "k8s.io/client-go/tools/cache/testing" + + "github.com/google/gofuzz" +) + +func Example() { + // source simulates an apiserver object endpoint. + source := fcache.NewFakeControllerSource() + + // This will hold the downstream state, as we know it. + downstream := NewStore(DeletionHandlingMetaNamespaceKeyFunc) + + // This will hold incoming changes. Note how we pass downstream in as a + // KeyLister, that way resync operations will result in the correct set + // of update/delete deltas. + fifo := NewDeltaFIFO(MetaNamespaceKeyFunc, downstream) + + // Let's do threadsafe output to get predictable test results. + deletionCounter := make(chan string, 1000) + + cfg := &Config{ + Queue: fifo, + ListerWatcher: source, + ObjectType: &v1.Pod{}, + FullResyncPeriod: time.Millisecond * 100, + RetryOnError: false, + + // Let's implement a simple controller that just deletes + // everything that comes in. + Process: func(obj interface{}) error { + // Obj is from the Pop method of the Queue we make above. + newest := obj.(Deltas).Newest() + + if newest.Type != Deleted { + // Update our downstream store. + err := downstream.Add(newest.Object) + if err != nil { + return err + } + + // Delete this object. + source.Delete(newest.Object.(runtime.Object)) + } else { + // Update our downstream store. + err := downstream.Delete(newest.Object) + if err != nil { + return err + } + + // fifo's KeyOf is easiest, because it handles + // DeletedFinalStateUnknown markers. + key, err := fifo.KeyOf(newest.Object) + if err != nil { + return err + } + + // Report this deletion. + deletionCounter <- key + } + return nil + }, + } + + // Create the controller and run it until we close stop. + stop := make(chan struct{}) + defer close(stop) + go New(cfg).Run(stop) + + // Let's add a few objects to the source. + testIDs := []string{"a-hello", "b-controller", "c-framework"} + for _, name := range testIDs { + // Note that these pods are not valid-- the fake source doesn't + // call validation or anything. + source.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: name}}) + } + + // Let's wait for the controller to process the things we just added. + outputSet := sets.String{} + for i := 0; i < len(testIDs); i++ { + outputSet.Insert(<-deletionCounter) + } + + for _, key := range outputSet.List() { + fmt.Println(key) + } + // Output: + // a-hello + // b-controller + // c-framework +} + +func ExampleNewInformer() { + // source simulates an apiserver object endpoint. + source := fcache.NewFakeControllerSource() + + // Let's do threadsafe output to get predictable test results. + deletionCounter := make(chan string, 1000) + + // Make a controller that immediately deletes anything added to it, and + // logs anything deleted. + _, controller := NewInformer( + source, + &v1.Pod{}, + time.Millisecond*100, + ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + source.Delete(obj.(runtime.Object)) + }, + DeleteFunc: func(obj interface{}) { + key, err := DeletionHandlingMetaNamespaceKeyFunc(obj) + if err != nil { + key = "oops something went wrong with the key" + } + + // Report this deletion. + deletionCounter <- key + }, + }, + ) + + // Run the controller and run it until we close stop. + stop := make(chan struct{}) + defer close(stop) + go controller.Run(stop) + + // Let's add a few objects to the source. + testIDs := []string{"a-hello", "b-controller", "c-framework"} + for _, name := range testIDs { + // Note that these pods are not valid-- the fake source doesn't + // call validation or anything. + source.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: name}}) + } + + // Let's wait for the controller to process the things we just added. + outputSet := sets.String{} + for i := 0; i < len(testIDs); i++ { + outputSet.Insert(<-deletionCounter) + } + + for _, key := range outputSet.List() { + fmt.Println(key) + } + // Output: + // a-hello + // b-controller + // c-framework +} + +func TestHammerController(t *testing.T) { + // This test executes a bunch of requests through the fake source and + // controller framework to make sure there's no locking/threading + // errors. If an error happens, it should hang forever or trigger the + // race detector. + + // source simulates an apiserver object endpoint. + source := fcache.NewFakeControllerSource() + + // Let's do threadsafe output to get predictable test results. + outputSetLock := sync.Mutex{} + // map of key to operations done on the key + outputSet := map[string][]string{} + + recordFunc := func(eventType string, obj interface{}) { + key, err := DeletionHandlingMetaNamespaceKeyFunc(obj) + if err != nil { + t.Errorf("something wrong with key: %v", err) + key = "oops something went wrong with the key" + } + + // Record some output when items are deleted. + outputSetLock.Lock() + defer outputSetLock.Unlock() + outputSet[key] = append(outputSet[key], eventType) + } + + // Make a controller which just logs all the changes it gets. + _, controller := NewInformer( + source, + &v1.Pod{}, + time.Millisecond*100, + ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { recordFunc("add", obj) }, + UpdateFunc: func(oldObj, newObj interface{}) { recordFunc("update", newObj) }, + DeleteFunc: func(obj interface{}) { recordFunc("delete", obj) }, + }, + ) + + if controller.HasSynced() { + t.Errorf("Expected HasSynced() to return false before we started the controller") + } + + // Run the controller and run it until we close stop. + stop := make(chan struct{}) + go controller.Run(stop) + + // Let's wait for the controller to do its initial sync + wait.Poll(100*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { + return controller.HasSynced(), nil + }) + if !controller.HasSynced() { + t.Errorf("Expected HasSynced() to return true after the initial sync") + } + + wg := sync.WaitGroup{} + const threads = 3 + wg.Add(threads) + for i := 0; i < threads; i++ { + go func() { + defer wg.Done() + // Let's add a few objects to the source. + currentNames := sets.String{} + rs := rand.NewSource(rand.Int63()) + f := fuzz.New().NilChance(.5).NumElements(0, 2).RandSource(rs) + r := rand.New(rs) // Mustn't use r and f concurrently! + for i := 0; i < 100; i++ { + var name string + var isNew bool + if currentNames.Len() == 0 || r.Intn(3) == 1 { + f.Fuzz(&name) + isNew = true + } else { + l := currentNames.List() + name = l[r.Intn(len(l))] + } + + pod := &v1.Pod{} + f.Fuzz(pod) + pod.ObjectMeta.Name = name + pod.ObjectMeta.Namespace = "default" + // Add, update, or delete randomly. + // Note that these pods are not valid-- the fake source doesn't + // call validation or perform any other checking. + if isNew { + currentNames.Insert(name) + source.Add(pod) + continue + } + switch r.Intn(2) { + case 0: + currentNames.Insert(name) + source.Modify(pod) + case 1: + currentNames.Delete(name) + source.Delete(pod) + } + } + }() + } + wg.Wait() + + // Let's wait for the controller to finish processing the things we just added. + // TODO: look in the queue to see how many items need to be processed. + time.Sleep(100 * time.Millisecond) + close(stop) + + // TODO: Verify that no goroutines were leaked here and that everything shut + // down cleanly. + + outputSetLock.Lock() + t.Logf("got: %#v", outputSet) +} + +func TestUpdate(t *testing.T) { + // This test is going to exercise the various paths that result in a + // call to update. + + // source simulates an apiserver object endpoint. + source := fcache.NewFakeControllerSource() + + const ( + FROM = "from" + TO = "to" + ) + + // These are the transitions we expect to see; because this is + // asynchronous, there are a lot of valid possibilities. + type pair struct{ from, to string } + allowedTransitions := map[pair]bool{ + {FROM, TO}: true, + + // Because a resync can happen when we've already observed one + // of the above but before the item is deleted. + {TO, TO}: true, + // Because a resync could happen before we observe an update. + {FROM, FROM}: true, + } + + pod := func(name, check string, final bool) *v1.Pod { + p := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Labels: map[string]string{"check": check}, + }, + } + if final { + p.Labels["final"] = "true" + } + return p + } + deletePod := func(p *v1.Pod) bool { + return p.Labels["final"] == "true" + } + + tests := []func(string){ + func(name string) { + name = "a-" + name + source.Add(pod(name, FROM, false)) + source.Modify(pod(name, TO, true)) + }, + } + + const threads = 3 + + var testDoneWG sync.WaitGroup + testDoneWG.Add(threads * len(tests)) + + // Make a controller that deletes things once it observes an update. + // It calls Done() on the wait group on deletions so we can tell when + // everything we've added has been deleted. + watchCh := make(chan struct{}) + _, controller := NewInformer( + &testLW{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + watch, err := source.Watch(options) + close(watchCh) + return watch, err + }, + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return source.List(options) + }, + }, + &v1.Pod{}, + 0, + ResourceEventHandlerFuncs{ + UpdateFunc: func(oldObj, newObj interface{}) { + o, n := oldObj.(*v1.Pod), newObj.(*v1.Pod) + from, to := o.Labels["check"], n.Labels["check"] + if !allowedTransitions[pair{from, to}] { + t.Errorf("observed transition %q -> %q for %v", from, to, n.Name) + } + if deletePod(n) { + source.Delete(n) + } + }, + DeleteFunc: func(obj interface{}) { + testDoneWG.Done() + }, + }, + ) + + // Run the controller and run it until we close stop. + // Once Run() is called, calls to testDoneWG.Done() might start, so + // all testDoneWG.Add() calls must happen before this point + stop := make(chan struct{}) + go controller.Run(stop) + <-watchCh + + // run every test a few times, in parallel + var wg sync.WaitGroup + wg.Add(threads * len(tests)) + for i := 0; i < threads; i++ { + for j, f := range tests { + go func(name string, f func(string)) { + defer wg.Done() + f(name) + }(fmt.Sprintf("%v-%v", i, j), f) + } + } + wg.Wait() + + // Let's wait for the controller to process the things we just added. + testDoneWG.Wait() + close(stop) +} diff --git a/vendor/k8s.io/client-go/tools/cache/delta_fifo_test.go b/vendor/k8s.io/client-go/tools/cache/delta_fifo_test.go new file mode 100644 index 00000000..9f8e5758 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/delta_fifo_test.go @@ -0,0 +1,492 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 cache + +import ( + "fmt" + "reflect" + "testing" + "time" +) + +// helper function to reduce stuttering +func testPop(f *DeltaFIFO) testFifoObject { + return Pop(f).(Deltas).Newest().Object.(testFifoObject) +} + +// keyLookupFunc adapts a raw function to be a KeyLookup. +type keyLookupFunc func() []testFifoObject + +// ListKeys just calls kl. +func (kl keyLookupFunc) ListKeys() []string { + result := []string{} + for _, fifoObj := range kl() { + result = append(result, fifoObj.name) + } + return result +} + +// GetByKey returns the key if it exists in the list returned by kl. +func (kl keyLookupFunc) GetByKey(key string) (interface{}, bool, error) { + for _, v := range kl() { + if v.name == key { + return v, true, nil + } + } + return nil, false, nil +} + +func TestDeltaFIFO_basic(t *testing.T) { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + const amount = 500 + go func() { + for i := 0; i < amount; i++ { + f.Add(mkFifoObj(string([]rune{'a', rune(i)}), i+1)) + } + }() + go func() { + for u := uint64(0); u < amount; u++ { + f.Add(mkFifoObj(string([]rune{'b', rune(u)}), u+1)) + } + }() + + lastInt := int(0) + lastUint := uint64(0) + for i := 0; i < amount*2; i++ { + switch obj := testPop(f).val.(type) { + case int: + if obj <= lastInt { + t.Errorf("got %v (int) out of order, last was %v", obj, lastInt) + } + lastInt = obj + case uint64: + if obj <= lastUint { + t.Errorf("got %v (uint) out of order, last was %v", obj, lastUint) + } else { + lastUint = obj + } + default: + t.Fatalf("unexpected type %#v", obj) + } + } +} + +func TestDeltaFIFO_requeueOnPop(t *testing.T) { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + + f.Add(mkFifoObj("foo", 10)) + _, err := f.Pop(func(obj interface{}) error { + if obj.(Deltas)[0].Object.(testFifoObject).name != "foo" { + t.Fatalf("unexpected object: %#v", obj) + } + return ErrRequeue{Err: nil} + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if _, ok, err := f.GetByKey("foo"); !ok || err != nil { + t.Fatalf("object should have been requeued: %t %v", ok, err) + } + + _, err = f.Pop(func(obj interface{}) error { + if obj.(Deltas)[0].Object.(testFifoObject).name != "foo" { + t.Fatalf("unexpected object: %#v", obj) + } + return ErrRequeue{Err: fmt.Errorf("test error")} + }) + if err == nil || err.Error() != "test error" { + t.Fatalf("unexpected error: %v", err) + } + if _, ok, err := f.GetByKey("foo"); !ok || err != nil { + t.Fatalf("object should have been requeued: %t %v", ok, err) + } + + _, err = f.Pop(func(obj interface{}) error { + if obj.(Deltas)[0].Object.(testFifoObject).name != "foo" { + t.Fatalf("unexpected object: %#v", obj) + } + return nil + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if _, ok, err := f.GetByKey("foo"); ok || err != nil { + t.Fatalf("object should have been removed: %t %v", ok, err) + } +} + +func TestDeltaFIFO_addUpdate(t *testing.T) { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + f.Add(mkFifoObj("foo", 10)) + f.Update(mkFifoObj("foo", 12)) + f.Delete(mkFifoObj("foo", 15)) + + if e, a := []interface{}{mkFifoObj("foo", 15)}, f.List(); !reflect.DeepEqual(e, a) { + t.Errorf("Expected %+v, got %+v", e, a) + } + if e, a := []string{"foo"}, f.ListKeys(); !reflect.DeepEqual(e, a) { + t.Errorf("Expected %+v, got %+v", e, a) + } + + got := make(chan testFifoObject, 2) + go func() { + for { + obj := testPop(f) + t.Logf("got a thing %#v", obj) + t.Logf("D len: %v", len(f.queue)) + got <- obj + } + }() + + first := <-got + if e, a := 15, first.val; e != a { + t.Errorf("Didn't get updated value (%v), got %v", e, a) + } + select { + case unexpected := <-got: + t.Errorf("Got second value %v", unexpected.val) + case <-time.After(50 * time.Millisecond): + } + _, exists, _ := f.Get(mkFifoObj("foo", "")) + if exists { + t.Errorf("item did not get removed") + } +} + +func TestDeltaFIFO_enqueueingNoLister(t *testing.T) { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + f.Add(mkFifoObj("foo", 10)) + f.Update(mkFifoObj("bar", 15)) + f.Add(mkFifoObj("qux", 17)) + f.Delete(mkFifoObj("qux", 18)) + + // This delete does not enqueue anything because baz doesn't exist. + f.Delete(mkFifoObj("baz", 20)) + + expectList := []int{10, 15, 18} + for _, expect := range expectList { + if e, a := expect, testPop(f).val; e != a { + t.Errorf("Didn't get updated value (%v), got %v", e, a) + } + } + if e, a := 0, len(f.items); e != a { + t.Errorf("queue unexpectedly not empty: %v != %v\n%#v", e, a, f.items) + } +} + +func TestDeltaFIFO_enqueueingWithLister(t *testing.T) { + f := NewDeltaFIFO( + testFifoObjectKeyFunc, + keyLookupFunc(func() []testFifoObject { + return []testFifoObject{mkFifoObj("foo", 5), mkFifoObj("bar", 6), mkFifoObj("baz", 7)} + }), + ) + f.Add(mkFifoObj("foo", 10)) + f.Update(mkFifoObj("bar", 15)) + + // This delete does enqueue the deletion, because "baz" is in the key lister. + f.Delete(mkFifoObj("baz", 20)) + + expectList := []int{10, 15, 20} + for _, expect := range expectList { + if e, a := expect, testPop(f).val; e != a { + t.Errorf("Didn't get updated value (%v), got %v", e, a) + } + } + if e, a := 0, len(f.items); e != a { + t.Errorf("queue unexpectedly not empty: %v != %v", e, a) + } +} + +func TestDeltaFIFO_addReplace(t *testing.T) { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + f.Add(mkFifoObj("foo", 10)) + f.Replace([]interface{}{mkFifoObj("foo", 15)}, "0") + got := make(chan testFifoObject, 2) + go func() { + for { + got <- testPop(f) + } + }() + + first := <-got + if e, a := 15, first.val; e != a { + t.Errorf("Didn't get updated value (%v), got %v", e, a) + } + select { + case unexpected := <-got: + t.Errorf("Got second value %v", unexpected.val) + case <-time.After(50 * time.Millisecond): + } + _, exists, _ := f.Get(mkFifoObj("foo", "")) + if exists { + t.Errorf("item did not get removed") + } +} + +func TestDeltaFIFO_ResyncNonExisting(t *testing.T) { + f := NewDeltaFIFO( + testFifoObjectKeyFunc, + keyLookupFunc(func() []testFifoObject { + return []testFifoObject{mkFifoObj("foo", 5)} + }), + ) + f.Delete(mkFifoObj("foo", 10)) + f.Resync() + + deltas := f.items["foo"] + if len(deltas) != 1 { + t.Fatalf("unexpected deltas length: %v", deltas) + } + if deltas[0].Type != Deleted { + t.Errorf("unexpected delta: %v", deltas[0]) + } +} + +func TestDeltaFIFO_DeleteExistingNonPropagated(t *testing.T) { + f := NewDeltaFIFO( + testFifoObjectKeyFunc, + keyLookupFunc(func() []testFifoObject { + return []testFifoObject{} + }), + ) + f.Add(mkFifoObj("foo", 5)) + f.Delete(mkFifoObj("foo", 6)) + + deltas := f.items["foo"] + if len(deltas) != 2 { + t.Fatalf("unexpected deltas length: %v", deltas) + } + if deltas[len(deltas)-1].Type != Deleted { + t.Errorf("unexpected delta: %v", deltas[len(deltas)-1]) + } +} + +func TestDeltaFIFO_ReplaceMakesDeletions(t *testing.T) { + f := NewDeltaFIFO( + testFifoObjectKeyFunc, + keyLookupFunc(func() []testFifoObject { + return []testFifoObject{mkFifoObj("foo", 5), mkFifoObj("bar", 6), mkFifoObj("baz", 7)} + }), + ) + f.Delete(mkFifoObj("baz", 10)) + f.Replace([]interface{}{mkFifoObj("foo", 5)}, "0") + + expectedList := []Deltas{ + {{Deleted, mkFifoObj("baz", 10)}}, + {{Sync, mkFifoObj("foo", 5)}}, + // Since "bar" didn't have a delete event and wasn't in the Replace list + // it should get a tombstone key with the right Obj. + {{Deleted, DeletedFinalStateUnknown{Key: "bar", Obj: mkFifoObj("bar", 6)}}}, + } + + for _, expected := range expectedList { + cur := Pop(f).(Deltas) + if e, a := expected, cur; !reflect.DeepEqual(e, a) { + t.Errorf("Expected %#v, got %#v", e, a) + } + } +} + +func TestDeltaFIFO_UpdateResyncRace(t *testing.T) { + f := NewDeltaFIFO( + testFifoObjectKeyFunc, + keyLookupFunc(func() []testFifoObject { + return []testFifoObject{mkFifoObj("foo", 5)} + }), + ) + f.Update(mkFifoObj("foo", 6)) + f.Resync() + + expectedList := []Deltas{ + {{Updated, mkFifoObj("foo", 6)}}, + } + + for _, expected := range expectedList { + cur := Pop(f).(Deltas) + if e, a := expected, cur; !reflect.DeepEqual(e, a) { + t.Errorf("Expected %#v, got %#v", e, a) + } + } +} + +func TestDeltaFIFO_HasSyncedCorrectOnDeletion(t *testing.T) { + f := NewDeltaFIFO( + testFifoObjectKeyFunc, + keyLookupFunc(func() []testFifoObject { + return []testFifoObject{mkFifoObj("foo", 5), mkFifoObj("bar", 6), mkFifoObj("baz", 7)} + }), + ) + f.Replace([]interface{}{mkFifoObj("foo", 5)}, "0") + + expectedList := []Deltas{ + {{Sync, mkFifoObj("foo", 5)}}, + // Since "bar" didn't have a delete event and wasn't in the Replace list + // it should get a tombstone key with the right Obj. + {{Deleted, DeletedFinalStateUnknown{Key: "bar", Obj: mkFifoObj("bar", 6)}}}, + } + + for _, expected := range expectedList { + if f.HasSynced() { + t.Errorf("Expected HasSynced to be false") + } + cur := Pop(f).(Deltas) + if e, a := expected, cur; !reflect.DeepEqual(e, a) { + t.Errorf("Expected %#v, got %#v", e, a) + } + } + if f.HasSynced() { + t.Errorf("Expected HasSynced to be true") + } +} + +func TestDeltaFIFO_detectLineJumpers(t *testing.T) { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + + f.Add(mkFifoObj("foo", 10)) + f.Add(mkFifoObj("bar", 1)) + f.Add(mkFifoObj("foo", 11)) + f.Add(mkFifoObj("foo", 13)) + f.Add(mkFifoObj("zab", 30)) + + if e, a := 13, testPop(f).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } + + f.Add(mkFifoObj("foo", 14)) // ensure foo doesn't jump back in line + + if e, a := 1, testPop(f).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } + + if e, a := 30, testPop(f).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } + + if e, a := 14, testPop(f).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } +} + +func TestDeltaFIFO_addIfNotPresent(t *testing.T) { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + + f.Add(mkFifoObj("b", 3)) + b3 := Pop(f) + f.Add(mkFifoObj("c", 4)) + c4 := Pop(f) + if e, a := 0, len(f.items); e != a { + t.Fatalf("Expected %v, got %v items in queue", e, a) + } + + f.Add(mkFifoObj("a", 1)) + f.Add(mkFifoObj("b", 2)) + f.AddIfNotPresent(b3) + f.AddIfNotPresent(c4) + + if e, a := 3, len(f.items); a != e { + t.Fatalf("expected queue length %d, got %d", e, a) + } + + expectedValues := []int{1, 2, 4} + for _, expected := range expectedValues { + if actual := testPop(f).val; actual != expected { + t.Fatalf("expected value %d, got %d", expected, actual) + } + } +} + +func TestDeltaFIFO_KeyOf(t *testing.T) { + f := DeltaFIFO{keyFunc: testFifoObjectKeyFunc} + + table := []struct { + obj interface{} + key string + }{ + {obj: testFifoObject{name: "A"}, key: "A"}, + {obj: DeletedFinalStateUnknown{Key: "B", Obj: nil}, key: "B"}, + {obj: Deltas{{Object: testFifoObject{name: "C"}}}, key: "C"}, + {obj: Deltas{{Object: DeletedFinalStateUnknown{Key: "D", Obj: nil}}}, key: "D"}, + } + + for _, item := range table { + got, err := f.KeyOf(item.obj) + if err != nil { + t.Errorf("Unexpected error for %q: %v", item.obj, err) + continue + } + if e, a := item.key, got; e != a { + t.Errorf("Expected %v, got %v", e, a) + } + } +} + +func TestDeltaFIFO_HasSynced(t *testing.T) { + tests := []struct { + actions []func(f *DeltaFIFO) + expectedSynced bool + }{ + { + actions: []func(f *DeltaFIFO){}, + expectedSynced: false, + }, + { + actions: []func(f *DeltaFIFO){ + func(f *DeltaFIFO) { f.Add(mkFifoObj("a", 1)) }, + }, + expectedSynced: true, + }, + { + actions: []func(f *DeltaFIFO){ + func(f *DeltaFIFO) { f.Replace([]interface{}{}, "0") }, + }, + expectedSynced: true, + }, + { + actions: []func(f *DeltaFIFO){ + func(f *DeltaFIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, + }, + expectedSynced: false, + }, + { + actions: []func(f *DeltaFIFO){ + func(f *DeltaFIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, + func(f *DeltaFIFO) { Pop(f) }, + }, + expectedSynced: false, + }, + { + actions: []func(f *DeltaFIFO){ + func(f *DeltaFIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, + func(f *DeltaFIFO) { Pop(f) }, + func(f *DeltaFIFO) { Pop(f) }, + }, + expectedSynced: true, + }, + } + + for i, test := range tests { + f := NewDeltaFIFO(testFifoObjectKeyFunc, nil) + + for _, action := range test.actions { + action(f) + } + if e, a := test.expectedSynced, f.HasSynced(); a != e { + t.Errorf("test case %v failed, expected: %v , got %v", i, e, a) + } + } +} diff --git a/vendor/k8s.io/client-go/tools/cache/expiration_cache_test.go b/vendor/k8s.io/client-go/tools/cache/expiration_cache_test.go new file mode 100644 index 00000000..fac621cb --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/expiration_cache_test.go @@ -0,0 +1,189 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 cache + +import ( + "reflect" + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/wait" +) + +func TestTTLExpirationBasic(t *testing.T) { + testObj := testStoreObject{id: "foo", val: "bar"} + deleteChan := make(chan string, 1) + ttlStore := NewFakeExpirationStore( + testStoreKeyFunc, deleteChan, + &FakeExpirationPolicy{ + NeverExpire: sets.NewString(), + RetrieveKeyFunc: func(obj interface{}) (string, error) { + return obj.(*timestampedEntry).obj.(testStoreObject).id, nil + }, + }, + clock.RealClock{}, + ) + err := ttlStore.Add(testObj) + if err != nil { + t.Errorf("Unable to add obj %#v", testObj) + } + item, exists, err := ttlStore.Get(testObj) + if err != nil { + t.Errorf("Failed to get from store, %v", err) + } + if exists || item != nil { + t.Errorf("Got unexpected item %#v", item) + } + key, _ := testStoreKeyFunc(testObj) + select { + case delKey := <-deleteChan: + if delKey != key { + t.Errorf("Unexpected delete for key %s", key) + } + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("Unexpected timeout waiting on delete") + } + close(deleteChan) +} + +func TestReAddExpiredItem(t *testing.T) { + deleteChan := make(chan string, 1) + exp := &FakeExpirationPolicy{ + NeverExpire: sets.NewString(), + RetrieveKeyFunc: func(obj interface{}) (string, error) { + return obj.(*timestampedEntry).obj.(testStoreObject).id, nil + }, + } + ttlStore := NewFakeExpirationStore( + testStoreKeyFunc, deleteChan, exp, clock.RealClock{}) + testKey := "foo" + testObj := testStoreObject{id: testKey, val: "bar"} + err := ttlStore.Add(testObj) + if err != nil { + t.Errorf("Unable to add obj %#v", testObj) + } + + // This get will expire the item. + item, exists, err := ttlStore.Get(testObj) + if err != nil { + t.Errorf("Failed to get from store, %v", err) + } + if exists || item != nil { + t.Errorf("Got unexpected item %#v", item) + } + + key, _ := testStoreKeyFunc(testObj) + differentValue := "different_bar" + err = ttlStore.Add( + testStoreObject{id: testKey, val: differentValue}) + if err != nil { + t.Errorf("Failed to add second value") + } + + select { + case delKey := <-deleteChan: + if delKey != key { + t.Errorf("Unexpected delete for key %s", key) + } + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("Unexpected timeout waiting on delete") + } + exp.NeverExpire = sets.NewString(testKey) + item, exists, err = ttlStore.GetByKey(testKey) + if err != nil { + t.Errorf("Failed to get from store, %v", err) + } + if !exists || item == nil || item.(testStoreObject).val != differentValue { + t.Errorf("Got unexpected item %#v", item) + } + close(deleteChan) +} + +func TestTTLList(t *testing.T) { + testObjs := []testStoreObject{ + {id: "foo", val: "bar"}, + {id: "foo1", val: "bar1"}, + {id: "foo2", val: "bar2"}, + } + expireKeys := sets.NewString(testObjs[0].id, testObjs[2].id) + deleteChan := make(chan string, len(testObjs)) + defer close(deleteChan) + + ttlStore := NewFakeExpirationStore( + testStoreKeyFunc, deleteChan, + &FakeExpirationPolicy{ + NeverExpire: sets.NewString(testObjs[1].id), + RetrieveKeyFunc: func(obj interface{}) (string, error) { + return obj.(*timestampedEntry).obj.(testStoreObject).id, nil + }, + }, + clock.RealClock{}, + ) + for _, obj := range testObjs { + err := ttlStore.Add(obj) + if err != nil { + t.Errorf("Unable to add obj %#v", obj) + } + } + listObjs := ttlStore.List() + if len(listObjs) != 1 || !reflect.DeepEqual(listObjs[0], testObjs[1]) { + t.Errorf("List returned unexpected results %#v", listObjs) + } + + // Make sure all our deletes come through in an acceptable rate (1/100ms) + for expireKeys.Len() != 0 { + select { + case delKey := <-deleteChan: + if !expireKeys.Has(delKey) { + t.Errorf("Unexpected delete for key %s", delKey) + } + expireKeys.Delete(delKey) + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("Unexpected timeout waiting on delete") + return + } + } +} + +func TestTTLPolicy(t *testing.T) { + fakeTime := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) + ttl := 30 * time.Second + exactlyOnTTL := fakeTime.Add(-ttl) + expiredTime := fakeTime.Add(-(ttl + 1)) + + policy := TTLPolicy{ttl, clock.NewFakeClock(fakeTime)} + fakeTimestampedEntry := ×tampedEntry{obj: struct{}{}, timestamp: exactlyOnTTL} + if policy.IsExpired(fakeTimestampedEntry) { + t.Errorf("TTL cache should not expire entries exactly on ttl") + } + fakeTimestampedEntry.timestamp = fakeTime + if policy.IsExpired(fakeTimestampedEntry) { + t.Errorf("TTL Cache should not expire entries before ttl") + } + fakeTimestampedEntry.timestamp = expiredTime + if !policy.IsExpired(fakeTimestampedEntry) { + t.Errorf("TTL Cache should expire entries older than ttl") + } + for _, ttl = range []time.Duration{0, -1} { + policy.Ttl = ttl + if policy.IsExpired(fakeTimestampedEntry) { + t.Errorf("TTL policy should only expire entries when initialized with a ttl > 0") + } + } +} diff --git a/vendor/k8s.io/client-go/tools/cache/fifo_test.go b/vendor/k8s.io/client-go/tools/cache/fifo_test.go new file mode 100644 index 00000000..afd311d7 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/fifo_test.go @@ -0,0 +1,280 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 cache + +import ( + "fmt" + "reflect" + "testing" + "time" +) + +func testFifoObjectKeyFunc(obj interface{}) (string, error) { + return obj.(testFifoObject).name, nil +} + +type testFifoObject struct { + name string + val interface{} +} + +func mkFifoObj(name string, val interface{}) testFifoObject { + return testFifoObject{name: name, val: val} +} + +func TestFIFO_basic(t *testing.T) { + f := NewFIFO(testFifoObjectKeyFunc) + const amount = 500 + go func() { + for i := 0; i < amount; i++ { + f.Add(mkFifoObj(string([]rune{'a', rune(i)}), i+1)) + } + }() + go func() { + for u := uint64(0); u < amount; u++ { + f.Add(mkFifoObj(string([]rune{'b', rune(u)}), u+1)) + } + }() + + lastInt := int(0) + lastUint := uint64(0) + for i := 0; i < amount*2; i++ { + switch obj := Pop(f).(testFifoObject).val.(type) { + case int: + if obj <= lastInt { + t.Errorf("got %v (int) out of order, last was %v", obj, lastInt) + } + lastInt = obj + case uint64: + if obj <= lastUint { + t.Errorf("got %v (uint) out of order, last was %v", obj, lastUint) + } else { + lastUint = obj + } + default: + t.Fatalf("unexpected type %#v", obj) + } + } +} + +func TestFIFO_requeueOnPop(t *testing.T) { + f := NewFIFO(testFifoObjectKeyFunc) + + f.Add(mkFifoObj("foo", 10)) + _, err := f.Pop(func(obj interface{}) error { + if obj.(testFifoObject).name != "foo" { + t.Fatalf("unexpected object: %#v", obj) + } + return ErrRequeue{Err: nil} + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if _, ok, err := f.GetByKey("foo"); !ok || err != nil { + t.Fatalf("object should have been requeued: %t %v", ok, err) + } + + _, err = f.Pop(func(obj interface{}) error { + if obj.(testFifoObject).name != "foo" { + t.Fatalf("unexpected object: %#v", obj) + } + return ErrRequeue{Err: fmt.Errorf("test error")} + }) + if err == nil || err.Error() != "test error" { + t.Fatalf("unexpected error: %v", err) + } + if _, ok, err := f.GetByKey("foo"); !ok || err != nil { + t.Fatalf("object should have been requeued: %t %v", ok, err) + } + + _, err = f.Pop(func(obj interface{}) error { + if obj.(testFifoObject).name != "foo" { + t.Fatalf("unexpected object: %#v", obj) + } + return nil + }) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if _, ok, err := f.GetByKey("foo"); ok || err != nil { + t.Fatalf("object should have been removed: %t %v", ok, err) + } +} + +func TestFIFO_addUpdate(t *testing.T) { + f := NewFIFO(testFifoObjectKeyFunc) + f.Add(mkFifoObj("foo", 10)) + f.Update(mkFifoObj("foo", 15)) + + if e, a := []interface{}{mkFifoObj("foo", 15)}, f.List(); !reflect.DeepEqual(e, a) { + t.Errorf("Expected %+v, got %+v", e, a) + } + if e, a := []string{"foo"}, f.ListKeys(); !reflect.DeepEqual(e, a) { + t.Errorf("Expected %+v, got %+v", e, a) + } + + got := make(chan testFifoObject, 2) + go func() { + for { + got <- Pop(f).(testFifoObject) + } + }() + + first := <-got + if e, a := 15, first.val; e != a { + t.Errorf("Didn't get updated value (%v), got %v", e, a) + } + select { + case unexpected := <-got: + t.Errorf("Got second value %v", unexpected.val) + case <-time.After(50 * time.Millisecond): + } + _, exists, _ := f.Get(mkFifoObj("foo", "")) + if exists { + t.Errorf("item did not get removed") + } +} + +func TestFIFO_addReplace(t *testing.T) { + f := NewFIFO(testFifoObjectKeyFunc) + f.Add(mkFifoObj("foo", 10)) + f.Replace([]interface{}{mkFifoObj("foo", 15)}, "15") + got := make(chan testFifoObject, 2) + go func() { + for { + got <- Pop(f).(testFifoObject) + } + }() + + first := <-got + if e, a := 15, first.val; e != a { + t.Errorf("Didn't get updated value (%v), got %v", e, a) + } + select { + case unexpected := <-got: + t.Errorf("Got second value %v", unexpected.val) + case <-time.After(50 * time.Millisecond): + } + _, exists, _ := f.Get(mkFifoObj("foo", "")) + if exists { + t.Errorf("item did not get removed") + } +} + +func TestFIFO_detectLineJumpers(t *testing.T) { + f := NewFIFO(testFifoObjectKeyFunc) + + f.Add(mkFifoObj("foo", 10)) + f.Add(mkFifoObj("bar", 1)) + f.Add(mkFifoObj("foo", 11)) + f.Add(mkFifoObj("foo", 13)) + f.Add(mkFifoObj("zab", 30)) + + if e, a := 13, Pop(f).(testFifoObject).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } + + f.Add(mkFifoObj("foo", 14)) // ensure foo doesn't jump back in line + + if e, a := 1, Pop(f).(testFifoObject).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } + + if e, a := 30, Pop(f).(testFifoObject).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } + + if e, a := 14, Pop(f).(testFifoObject).val; a != e { + t.Fatalf("expected %d, got %d", e, a) + } +} + +func TestFIFO_addIfNotPresent(t *testing.T) { + f := NewFIFO(testFifoObjectKeyFunc) + + f.Add(mkFifoObj("a", 1)) + f.Add(mkFifoObj("b", 2)) + f.AddIfNotPresent(mkFifoObj("b", 3)) + f.AddIfNotPresent(mkFifoObj("c", 4)) + + if e, a := 3, len(f.items); a != e { + t.Fatalf("expected queue length %d, got %d", e, a) + } + + expectedValues := []int{1, 2, 4} + for _, expected := range expectedValues { + if actual := Pop(f).(testFifoObject).val; actual != expected { + t.Fatalf("expected value %d, got %d", expected, actual) + } + } +} + +func TestFIFO_HasSynced(t *testing.T) { + tests := []struct { + actions []func(f *FIFO) + expectedSynced bool + }{ + { + actions: []func(f *FIFO){}, + expectedSynced: false, + }, + { + actions: []func(f *FIFO){ + func(f *FIFO) { f.Add(mkFifoObj("a", 1)) }, + }, + expectedSynced: true, + }, + { + actions: []func(f *FIFO){ + func(f *FIFO) { f.Replace([]interface{}{}, "0") }, + }, + expectedSynced: true, + }, + { + actions: []func(f *FIFO){ + func(f *FIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, + }, + expectedSynced: false, + }, + { + actions: []func(f *FIFO){ + func(f *FIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, + func(f *FIFO) { Pop(f) }, + }, + expectedSynced: false, + }, + { + actions: []func(f *FIFO){ + func(f *FIFO) { f.Replace([]interface{}{mkFifoObj("a", 1), mkFifoObj("b", 2)}, "0") }, + func(f *FIFO) { Pop(f) }, + func(f *FIFO) { Pop(f) }, + }, + expectedSynced: true, + }, + } + + for i, test := range tests { + f := NewFIFO(testFifoObjectKeyFunc) + + for _, action := range test.actions { + action(f) + } + if e, a := test.expectedSynced, f.HasSynced(); a != e { + t.Errorf("test case %v failed, expected: %v , got %v", i, e, a) + } + } +} diff --git a/vendor/k8s.io/client-go/tools/cache/heap_test.go b/vendor/k8s.io/client-go/tools/cache/heap_test.go new file mode 100644 index 00000000..c2e47698 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/heap_test.go @@ -0,0 +1,382 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 cache + +import ( + "sync" + "testing" + "time" +) + +func testHeapObjectKeyFunc(obj interface{}) (string, error) { + return obj.(testHeapObject).name, nil +} + +type testHeapObject struct { + name string + val interface{} +} + +func mkHeapObj(name string, val interface{}) testHeapObject { + return testHeapObject{name: name, val: val} +} + +func compareInts(val1 interface{}, val2 interface{}) bool { + first := val1.(testHeapObject).val.(int) + second := val2.(testHeapObject).val.(int) + return first < second +} + +// TestHeapBasic tests Heap invariant and synchronization. +func TestHeapBasic(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + var wg sync.WaitGroup + wg.Add(2) + const amount = 500 + var i, u int + // Insert items in the heap in opposite orders in two go routines. + go func() { + for i = amount; i > 0; i-- { + h.Add(mkHeapObj(string([]rune{'a', rune(i)}), i)) + } + wg.Done() + }() + go func() { + for u = 0; u < amount; u++ { + h.Add(mkHeapObj(string([]rune{'b', rune(u)}), u+1)) + } + wg.Done() + }() + // Wait for the two go routines to finish. + wg.Wait() + // Make sure that the numbers are popped in ascending order. + prevNum := 0 + for i := 0; i < amount*2; i++ { + obj, err := h.Pop() + num := obj.(testHeapObject).val.(int) + // All the items must be sorted. + if err != nil || prevNum > num { + t.Errorf("got %v out of order, last was %v", obj, prevNum) + } + prevNum = num + } +} + +// Tests Heap.Add and ensures that heap invariant is preserved after adding items. +func TestHeap_Add(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("baz", 11)) + h.Add(mkHeapObj("zab", 30)) + h.Add(mkHeapObj("foo", 13)) // This updates "foo". + + item, err := h.Pop() + if e, a := 1, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 11, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + h.Delete(mkHeapObj("baz", 11)) // Nothing is deleted. + h.Add(mkHeapObj("foo", 14)) // foo is updated. + item, err = h.Pop() + if e, a := 14, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 30, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } +} + +// TestHeap_BulkAdd tests Heap.BulkAdd functionality and ensures that all the +// items given to BulkAdd are added to the queue before Pop reads them. +func TestHeap_BulkAdd(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + const amount = 500 + // Insert items in the heap in opposite orders in a go routine. + go func() { + l := []interface{}{} + for i := amount; i > 0; i-- { + l = append(l, mkHeapObj(string([]rune{'a', rune(i)}), i)) + } + h.BulkAdd(l) + }() + prevNum := -1 + for i := 0; i < amount; i++ { + obj, err := h.Pop() + num := obj.(testHeapObject).val.(int) + // All the items must be sorted. + if err != nil || prevNum >= num { + t.Errorf("got %v out of order, last was %v", obj, prevNum) + } + prevNum = num + } +} + +// TestHeapEmptyPop tests that pop returns properly after heap is closed. +func TestHeapEmptyPop(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + go func() { + time.Sleep(1 * time.Second) + h.Close() + }() + _, err := h.Pop() + if err == nil || err.Error() != closedMsg { + t.Errorf("pop should have returned heap closed error: %v", err) + } +} + +// TestHeap_AddIfNotPresent tests Heap.AddIfNotPresent and ensures that heap +// invariant is preserved after adding items. +func TestHeap_AddIfNotPresent(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.AddIfNotPresent(mkHeapObj("foo", 10)) + h.AddIfNotPresent(mkHeapObj("bar", 1)) + h.AddIfNotPresent(mkHeapObj("baz", 11)) + h.AddIfNotPresent(mkHeapObj("zab", 30)) + h.AddIfNotPresent(mkHeapObj("foo", 13)) // This is not added. + + if len := len(h.data.items); len != 4 { + t.Errorf("unexpected number of items: %d", len) + } + if val := h.data.items["foo"].obj.(testHeapObject).val; val != 10 { + t.Errorf("unexpected value: %d", val) + } + item, err := h.Pop() + if e, a := 1, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 10, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + // bar is already popped. Let's add another one. + h.AddIfNotPresent(mkHeapObj("bar", 14)) + item, err = h.Pop() + if e, a := 11, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 14, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } +} + +// TestHeap_Delete tests Heap.Delete and ensures that heap invariant is +// preserved after deleting items. +func TestHeap_Delete(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + // Delete head. Delete should work with "key" and doesn't care about the value. + if err := h.Delete(mkHeapObj("bar", 200)); err != nil { + t.Fatalf("Failed to delete head.") + } + item, err := h.Pop() + if e, a := 10, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + h.Add(mkHeapObj("zab", 30)) + h.Add(mkHeapObj("faz", 30)) + len := h.data.Len() + // Delete non-existing item. + if err = h.Delete(mkHeapObj("non-existent", 10)); err == nil || len != h.data.Len() { + t.Fatalf("Didn't expect any item removal") + } + // Delete tail. + if err = h.Delete(mkHeapObj("bal", 31)); err != nil { + t.Fatalf("Failed to delete tail.") + } + // Delete one of the items with value 30. + if err = h.Delete(mkHeapObj("zab", 30)); err != nil { + t.Fatalf("Failed to delete item.") + } + item, err = h.Pop() + if e, a := 11, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + item, err = h.Pop() + if e, a := 30, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + if h.data.Len() != 0 { + t.Fatalf("expected an empty heap.") + } +} + +// TestHeap_Update tests Heap.Update and ensures that heap invariant is +// preserved after adding items. +func TestHeap_Update(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + // Update an item to a value that should push it to the head. + h.Update(mkHeapObj("baz", 0)) + if h.data.queue[0] != "baz" || h.data.items["baz"].index != 0 { + t.Fatalf("expected baz to be at the head") + } + item, err := h.Pop() + if e, a := 0, item.(testHeapObject).val; err != nil || a != e { + t.Fatalf("expected %d, got %d", e, a) + } + // Update bar to push it farther back in the queue. + h.Update(mkHeapObj("bar", 100)) + if h.data.queue[0] != "foo" || h.data.items["foo"].index != 0 { + t.Fatalf("expected foo to be at the head") + } +} + +// TestHeap_Get tests Heap.Get. +func TestHeap_Get(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + // Get works with the key. + obj, exists, err := h.Get(mkHeapObj("baz", 0)) + if err != nil || exists == false || obj.(testHeapObject).val != 11 { + t.Fatalf("unexpected error in getting element") + } + // Get non-existing object. + _, exists, err = h.Get(mkHeapObj("non-existing", 0)) + if err != nil || exists == true { + t.Fatalf("didn't expect to get any object") + } +} + +// TestHeap_GetByKey tests Heap.GetByKey and is very similar to TestHeap_Get. +func TestHeap_GetByKey(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + h.Add(mkHeapObj("bal", 31)) + h.Add(mkHeapObj("baz", 11)) + + obj, exists, err := h.GetByKey("baz") + if err != nil || exists == false || obj.(testHeapObject).val != 11 { + t.Fatalf("unexpected error in getting element") + } + // Get non-existing object. + _, exists, err = h.GetByKey("non-existing") + if err != nil || exists == true { + t.Fatalf("didn't expect to get any object") + } +} + +// TestHeap_Close tests Heap.Close and Heap.IsClosed functions. +func TestHeap_Close(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Add(mkHeapObj("foo", 10)) + h.Add(mkHeapObj("bar", 1)) + + if h.IsClosed() { + t.Fatalf("didn't expect heap to be closed") + } + h.Close() + if !h.IsClosed() { + t.Fatalf("expect heap to be closed") + } +} + +// TestHeap_List tests Heap.List function. +func TestHeap_List(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + list := h.List() + if len(list) != 0 { + t.Errorf("expected an empty list") + } + + items := map[string]int{ + "foo": 10, + "bar": 1, + "bal": 30, + "baz": 11, + "faz": 30, + } + for k, v := range items { + h.Add(mkHeapObj(k, v)) + } + list = h.List() + if len(list) != len(items) { + t.Errorf("expected %d items, got %d", len(items), len(list)) + } + for _, obj := range list { + heapObj := obj.(testHeapObject) + v, ok := items[heapObj.name] + if !ok || v != heapObj.val { + t.Errorf("unexpected item in the list: %v", heapObj) + } + } +} + +// TestHeap_ListKeys tests Heap.ListKeys function. Scenario is the same as +// TestHeap_list. +func TestHeap_ListKeys(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + list := h.ListKeys() + if len(list) != 0 { + t.Errorf("expected an empty list") + } + + items := map[string]int{ + "foo": 10, + "bar": 1, + "bal": 30, + "baz": 11, + "faz": 30, + } + for k, v := range items { + h.Add(mkHeapObj(k, v)) + } + list = h.ListKeys() + if len(list) != len(items) { + t.Errorf("expected %d items, got %d", len(items), len(list)) + } + for _, key := range list { + _, ok := items[key] + if !ok { + t.Errorf("unexpected item in the list: %v", key) + } + } +} + +// TestHeapAddAfterClose tests that heap returns an error if anything is added +// after it is closed. +func TestHeapAddAfterClose(t *testing.T) { + h := NewHeap(testHeapObjectKeyFunc, compareInts) + h.Close() + if err := h.Add(mkHeapObj("test", 1)); err == nil || err.Error() != closedMsg { + t.Errorf("expected heap closed error") + } + if err := h.AddIfNotPresent(mkHeapObj("test", 1)); err == nil || err.Error() != closedMsg { + t.Errorf("expected heap closed error") + } + if err := h.BulkAdd([]interface{}{mkHeapObj("test", 1)}); err == nil || err.Error() != closedMsg { + t.Errorf("expected heap closed error") + } +} diff --git a/vendor/k8s.io/client-go/tools/cache/index_test.go b/vendor/k8s.io/client-go/tools/cache/index_test.go new file mode 100644 index 00000000..ecc104c0 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/index_test.go @@ -0,0 +1,163 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 cache + +import ( + "strings" + "testing" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func testIndexFunc(obj interface{}) ([]string, error) { + pod := obj.(*v1.Pod) + return []string{pod.Labels["foo"]}, nil +} + +func TestGetIndexFuncValues(t *testing.T) { + index := NewIndexer(MetaNamespaceKeyFunc, Indexers{"testmodes": testIndexFunc}) + + pod1 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "one", Labels: map[string]string{"foo": "bar"}}} + pod2 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "two", Labels: map[string]string{"foo": "bar"}}} + pod3 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "tre", Labels: map[string]string{"foo": "biz"}}} + + index.Add(pod1) + index.Add(pod2) + index.Add(pod3) + + keys := index.ListIndexFuncValues("testmodes") + if len(keys) != 2 { + t.Errorf("Expected 2 keys but got %v", len(keys)) + } + + for _, key := range keys { + if key != "bar" && key != "biz" { + t.Errorf("Expected only 'bar' or 'biz' but got %s", key) + } + } +} + +func testUsersIndexFunc(obj interface{}) ([]string, error) { + pod := obj.(*v1.Pod) + usersString := pod.Annotations["users"] + + return strings.Split(usersString, ","), nil +} + +func TestMultiIndexKeys(t *testing.T) { + index := NewIndexer(MetaNamespaceKeyFunc, Indexers{"byUser": testUsersIndexFunc}) + + pod1 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "one", Annotations: map[string]string{"users": "ernie,bert"}}} + pod2 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "two", Annotations: map[string]string{"users": "bert,oscar"}}} + pod3 := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "tre", Annotations: map[string]string{"users": "ernie,elmo"}}} + + index.Add(pod1) + index.Add(pod2) + index.Add(pod3) + + erniePods, err := index.ByIndex("byUser", "ernie") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(erniePods) != 2 { + t.Errorf("Expected 2 pods but got %v", len(erniePods)) + } + for _, erniePod := range erniePods { + if erniePod.(*v1.Pod).Name != "one" && erniePod.(*v1.Pod).Name != "tre" { + t.Errorf("Expected only 'one' or 'tre' but got %s", erniePod.(*v1.Pod).Name) + } + } + + bertPods, err := index.ByIndex("byUser", "bert") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(bertPods) != 2 { + t.Errorf("Expected 2 pods but got %v", len(bertPods)) + } + for _, bertPod := range bertPods { + if bertPod.(*v1.Pod).Name != "one" && bertPod.(*v1.Pod).Name != "two" { + t.Errorf("Expected only 'one' or 'two' but got %s", bertPod.(*v1.Pod).Name) + } + } + + oscarPods, err := index.ByIndex("byUser", "oscar") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(oscarPods) != 1 { + t.Errorf("Expected 1 pods but got %v", len(erniePods)) + } + for _, oscarPod := range oscarPods { + if oscarPod.(*v1.Pod).Name != "two" { + t.Errorf("Expected only 'two' but got %s", oscarPod.(*v1.Pod).Name) + } + } + + ernieAndBertKeys, err := index.Index("byUser", pod1) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(ernieAndBertKeys) != 3 { + t.Errorf("Expected 3 pods but got %v", len(ernieAndBertKeys)) + } + for _, ernieAndBertKey := range ernieAndBertKeys { + if ernieAndBertKey.(*v1.Pod).Name != "one" && ernieAndBertKey.(*v1.Pod).Name != "two" && ernieAndBertKey.(*v1.Pod).Name != "tre" { + t.Errorf("Expected only 'one', 'two' or 'tre' but got %s", ernieAndBertKey.(*v1.Pod).Name) + } + } + + index.Delete(pod3) + erniePods, err = index.ByIndex("byUser", "ernie") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(erniePods) != 1 { + t.Errorf("Expected 1 pods but got %v", len(erniePods)) + } + for _, erniePod := range erniePods { + if erniePod.(*v1.Pod).Name != "one" { + t.Errorf("Expected only 'one' but got %s", erniePod.(*v1.Pod).Name) + } + } + + elmoPods, err := index.ByIndex("byUser", "elmo") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(elmoPods) != 0 { + t.Errorf("Expected 0 pods but got %v", len(elmoPods)) + } + + copyOfPod2 := pod2.DeepCopy() + copyOfPod2.Annotations["users"] = "oscar" + index.Update(copyOfPod2) + bertPods, err = index.ByIndex("byUser", "bert") + if err != nil { + t.Errorf("unexpected error: %v", err) + } + if len(bertPods) != 1 { + t.Errorf("Expected 1 pods but got %v", len(bertPods)) + } + for _, bertPod := range bertPods { + if bertPod.(*v1.Pod).Name != "one" { + t.Errorf("Expected only 'one' but got %s", bertPod.(*v1.Pod).Name) + } + } + +} diff --git a/vendor/k8s.io/client-go/tools/cache/listwatch.go b/vendor/k8s.io/client-go/tools/cache/listwatch.go index 8bf41f51..f8679165 100644 --- a/vendor/k8s.io/client-go/tools/cache/listwatch.go +++ b/vendor/k8s.io/client-go/tools/cache/listwatch.go @@ -18,13 +18,10 @@ package cache import ( "context" - "time" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/pager" @@ -93,13 +90,6 @@ func NewFilteredListWatchFromClient(c Getter, resource string, namespace string, return &ListWatch{ListFunc: listFunc, WatchFunc: watchFunc} } -func timeoutFromListOptions(options metav1.ListOptions) time.Duration { - if options.TimeoutSeconds != nil { - return time.Duration(*options.TimeoutSeconds) * time.Second - } - return 0 -} - // List a set of apiserver resources func (lw *ListWatch) List(options metav1.ListOptions) (runtime.Object, error) { if !lw.DisableChunking { @@ -112,76 +102,3 @@ func (lw *ListWatch) List(options metav1.ListOptions) (runtime.Object, error) { func (lw *ListWatch) Watch(options metav1.ListOptions) (watch.Interface, error) { return lw.WatchFunc(options) } - -// ListWatchUntil checks the provided conditions against the items returned by the list watcher, returning wait.ErrWaitTimeout -// if timeout is exceeded without all conditions returning true, or an error if an error occurs. -// TODO: check for watch expired error and retry watch from latest point? Same issue exists for Until. -func ListWatchUntil(timeout time.Duration, lw ListerWatcher, conditions ...watch.ConditionFunc) (*watch.Event, error) { - if len(conditions) == 0 { - return nil, nil - } - - list, err := lw.List(metav1.ListOptions{}) - if err != nil { - return nil, err - } - initialItems, err := meta.ExtractList(list) - if err != nil { - return nil, err - } - - // use the initial items as simulated "adds" - var lastEvent *watch.Event - currIndex := 0 - passedConditions := 0 - for _, condition := range conditions { - // check the next condition against the previous event and short circuit waiting for the next watch - if lastEvent != nil { - done, err := condition(*lastEvent) - if err != nil { - return lastEvent, err - } - if done { - passedConditions = passedConditions + 1 - continue - } - } - - ConditionSucceeded: - for currIndex < len(initialItems) { - lastEvent = &watch.Event{Type: watch.Added, Object: initialItems[currIndex]} - currIndex++ - - done, err := condition(*lastEvent) - if err != nil { - return lastEvent, err - } - if done { - passedConditions = passedConditions + 1 - break ConditionSucceeded - } - } - } - if passedConditions == len(conditions) { - return lastEvent, nil - } - remainingConditions := conditions[passedConditions:] - - metaObj, err := meta.ListAccessor(list) - if err != nil { - return nil, err - } - currResourceVersion := metaObj.GetResourceVersion() - - watchInterface, err := lw.Watch(metav1.ListOptions{ResourceVersion: currResourceVersion}) - if err != nil { - return nil, err - } - - evt, err := watch.Until(timeout, watchInterface, remainingConditions...) - if err == watch.ErrWatchClosed { - // present a consistent error interface to callers - err = wait.ErrWaitTimeout - } - return evt, err -} diff --git a/vendor/k8s.io/client-go/tools/cache/mutation_detector_test.go b/vendor/k8s.io/client-go/tools/cache/mutation_detector_test.go new file mode 100644 index 00000000..41b6942f --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/mutation_detector_test.go @@ -0,0 +1,81 @@ +// +build !race + +/* +Copyright 2016 The Kubernetes Authors. + +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 cache + +import ( + "testing" + "time" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" +) + +func TestMutationDetector(t *testing.T) { + fakeWatch := watch.NewFake() + lw := &testLW{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return fakeWatch, nil + }, + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return &v1.PodList{}, nil + }, + } + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: "anything", + Labels: map[string]string{"check": "foo"}, + }, + } + stopCh := make(chan struct{}) + defer close(stopCh) + addReceived := make(chan bool) + mutationFound := make(chan bool) + + informer := NewSharedInformer(lw, &v1.Pod{}, 1*time.Second).(*sharedIndexInformer) + informer.cacheMutationDetector = &defaultCacheMutationDetector{ + name: "name", + period: 1 * time.Second, + failureFunc: func(message string) { + mutationFound <- true + }, + } + informer.AddEventHandler( + ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + addReceived <- true + }, + }, + ) + go informer.Run(stopCh) + + fakeWatch.Add(pod) + + select { + case <-addReceived: + } + + pod.Labels["change"] = "true" + + select { + case <-mutationFound: + } + +} diff --git a/vendor/k8s.io/client-go/tools/cache/processor_listener_test.go b/vendor/k8s.io/client-go/tools/cache/processor_listener_test.go new file mode 100644 index 00000000..1da73420 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/processor_listener_test.go @@ -0,0 +1,58 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 cache + +import ( + "sync" + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/wait" +) + +const ( + concurrencyLevel = 5 +) + +func BenchmarkListener(b *testing.B) { + var notification addNotification + + var swg sync.WaitGroup + swg.Add(b.N) + b.SetParallelism(concurrencyLevel) + // Preallocate enough space so that benchmark does not run out of it + pl := newProcessListener(&ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + swg.Done() + }, + }, 0, 0, time.Now(), 1024*1024) + var wg wait.Group + defer wg.Wait() // Wait for .run and .pop to stop + defer close(pl.addCh) // Tell .run and .pop to stop + wg.Start(pl.run) + wg.Start(pl.pop) + + b.ReportAllocs() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + pl.add(notification) + } + }) + swg.Wait() // Block until all notifications have been received + b.StopTimer() +} diff --git a/vendor/k8s.io/client-go/tools/cache/reflector.go b/vendor/k8s.io/client-go/tools/cache/reflector.go index 054a7373..9ee7efcb 100644 --- a/vendor/k8s.io/client-go/tools/cache/reflector.go +++ b/vendor/k8s.io/client-go/tools/cache/reflector.go @@ -24,9 +24,6 @@ import ( "net" "net/url" "reflect" - "regexp" - goruntime "runtime" - "runtime/debug" "strconv" "strings" "sync" @@ -40,6 +37,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/naming" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" @@ -76,8 +74,6 @@ type Reflector struct { var ( // We try to spread the load on apiserver by setting timeouts for // watch requests - it is random in [minWatchTimeout, 2*minWatchTimeout]. - // However, it can be modified to avoid periodic resync to break the - // TCP connection. minWatchTimeout = 5 * time.Minute ) @@ -96,7 +92,7 @@ func NewNamespaceKeyedIndexerAndReflector(lw ListerWatcher, expectedType interfa // resyncPeriod, so that you can use reflectors to periodically process everything as // well as incrementally processing the things that change. func NewReflector(lw ListerWatcher, expectedType interface{}, store Store, resyncPeriod time.Duration) *Reflector { - return NewNamedReflector(getDefaultReflectorName(internalPackages...), lw, expectedType, store, resyncPeriod) + return NewNamedReflector(naming.GetNameFromCallsite(internalPackages...), lw, expectedType, store, resyncPeriod) } // reflectorDisambiguator is used to disambiguate started reflectors. @@ -127,74 +123,7 @@ func makeValidPrometheusMetricLabel(in string) string { // internalPackages are packages that ignored when creating a default reflector name. These packages are in the common // call chains to NewReflector, so they'd be low entropy names for reflectors -var internalPackages = []string{"client-go/tools/cache/", "/runtime/asm_"} - -// getDefaultReflectorName walks back through the call stack until we find a caller from outside of the ignoredPackages -// it returns back a shortpath/filename:line to aid in identification of this reflector when it starts logging -func getDefaultReflectorName(ignoredPackages ...string) string { - name := "????" - const maxStack = 10 - for i := 1; i < maxStack; i++ { - _, file, line, ok := goruntime.Caller(i) - if !ok { - file, line, ok = extractStackCreator() - if !ok { - break - } - i += maxStack - } - if hasPackage(file, ignoredPackages) { - continue - } - - file = trimPackagePrefix(file) - name = fmt.Sprintf("%s:%d", file, line) - break - } - return name -} - -// hasPackage returns true if the file is in one of the ignored packages. -func hasPackage(file string, ignoredPackages []string) bool { - for _, ignoredPackage := range ignoredPackages { - if strings.Contains(file, ignoredPackage) { - return true - } - } - return false -} - -// trimPackagePrefix reduces duplicate values off the front of a package name. -func trimPackagePrefix(file string) string { - if l := strings.LastIndex(file, "k8s.io/client-go/pkg/"); l >= 0 { - return file[l+len("k8s.io/client-go/"):] - } - if l := strings.LastIndex(file, "/src/"); l >= 0 { - return file[l+5:] - } - if l := strings.LastIndex(file, "/pkg/"); l >= 0 { - return file[l+1:] - } - return file -} - -var stackCreator = regexp.MustCompile(`(?m)^created by (.*)\n\s+(.*):(\d+) \+0x[[:xdigit:]]+$`) - -// extractStackCreator retrieves the goroutine file and line that launched this stack. Returns false -// if the creator cannot be located. -// TODO: Go does not expose this via runtime https://github.com/golang/go/issues/11440 -func extractStackCreator() (string, int, bool) { - stack := debug.Stack() - matches := stackCreator.FindStringSubmatch(string(stack)) - if matches == nil || len(matches) != 4 { - return "", 0, false - } - line, err := strconv.Atoi(matches[3]) - if err != nil { - return "", 0, false - } - return matches[2], line, true -} +var internalPackages = []string{"client-go/tools/cache/"} // Run starts a watch and handles watch events. Will restart the watch if it is closed. // Run will exit when stopCh is closed. diff --git a/vendor/k8s.io/client-go/tools/cache/reflector_test.go b/vendor/k8s.io/client-go/tools/cache/reflector_test.go new file mode 100644 index 00000000..bb06059f --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/reflector_test.go @@ -0,0 +1,389 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 cache + +import ( + "errors" + "fmt" + "math/rand" + "strconv" + "testing" + "time" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" +) + +var nevererrc chan error + +type testLW struct { + ListFunc func(options metav1.ListOptions) (runtime.Object, error) + WatchFunc func(options metav1.ListOptions) (watch.Interface, error) +} + +func (t *testLW) List(options metav1.ListOptions) (runtime.Object, error) { + return t.ListFunc(options) +} +func (t *testLW) Watch(options metav1.ListOptions) (watch.Interface, error) { + return t.WatchFunc(options) +} + +func TestCloseWatchChannelOnError(t *testing.T) { + r := NewReflector(&testLW{}, &v1.Pod{}, NewStore(MetaNamespaceKeyFunc), 0) + pod := &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}} + fw := watch.NewFake() + r.listerWatcher = &testLW{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return fw, nil + }, + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return &v1.PodList{ListMeta: metav1.ListMeta{ResourceVersion: "1"}}, nil + }, + } + go r.ListAndWatch(wait.NeverStop) + fw.Error(pod) + select { + case _, ok := <-fw.ResultChan(): + if ok { + t.Errorf("Watch channel left open after cancellation") + } + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("the cancellation is at least %s late", wait.ForeverTestTimeout.String()) + break + } +} + +func TestRunUntil(t *testing.T) { + stopCh := make(chan struct{}) + store := NewStore(MetaNamespaceKeyFunc) + r := NewReflector(&testLW{}, &v1.Pod{}, store, 0) + fw := watch.NewFake() + r.listerWatcher = &testLW{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return fw, nil + }, + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return &v1.PodList{ListMeta: metav1.ListMeta{ResourceVersion: "1"}}, nil + }, + } + go r.Run(stopCh) + // Synchronously add a dummy pod into the watch channel so we + // know the RunUntil go routine is in the watch handler. + fw.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}}) + close(stopCh) + select { + case _, ok := <-fw.ResultChan(): + if ok { + t.Errorf("Watch channel left open after stopping the watch") + } + case <-time.After(wait.ForeverTestTimeout): + t.Errorf("the cancellation is at least %s late", wait.ForeverTestTimeout.String()) + break + } +} + +func TestReflectorResyncChan(t *testing.T) { + s := NewStore(MetaNamespaceKeyFunc) + g := NewReflector(&testLW{}, &v1.Pod{}, s, time.Millisecond) + a, _ := g.resyncChan() + b := time.After(wait.ForeverTestTimeout) + select { + case <-a: + t.Logf("got timeout as expected") + case <-b: + t.Errorf("resyncChan() is at least 99 milliseconds late??") + } +} + +func BenchmarkReflectorResyncChanMany(b *testing.B) { + s := NewStore(MetaNamespaceKeyFunc) + g := NewReflector(&testLW{}, &v1.Pod{}, s, 25*time.Millisecond) + // The improvement to this (calling the timer's Stop() method) makes + // this benchmark about 40% faster. + for i := 0; i < b.N; i++ { + g.resyncPeriod = time.Duration(rand.Float64() * float64(time.Millisecond) * 25) + _, stop := g.resyncChan() + stop() + } +} + +func TestReflectorWatchHandlerError(t *testing.T) { + s := NewStore(MetaNamespaceKeyFunc) + g := NewReflector(&testLW{}, &v1.Pod{}, s, 0) + fw := watch.NewFake() + go func() { + fw.Stop() + }() + var resumeRV string + err := g.watchHandler(fw, &resumeRV, nevererrc, wait.NeverStop) + if err == nil { + t.Errorf("unexpected non-error") + } +} + +func TestReflectorWatchHandler(t *testing.T) { + s := NewStore(MetaNamespaceKeyFunc) + g := NewReflector(&testLW{}, &v1.Pod{}, s, 0) + fw := watch.NewFake() + s.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}) + s.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}}) + go func() { + fw.Add(&v1.Service{ObjectMeta: metav1.ObjectMeta{Name: "rejected"}}) + fw.Delete(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}) + fw.Modify(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar", ResourceVersion: "55"}}) + fw.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "baz", ResourceVersion: "32"}}) + fw.Stop() + }() + var resumeRV string + err := g.watchHandler(fw, &resumeRV, nevererrc, wait.NeverStop) + if err != nil { + t.Errorf("unexpected error %v", err) + } + + mkPod := func(id string, rv string) *v1.Pod { + return &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: id, ResourceVersion: rv}} + } + + table := []struct { + Pod *v1.Pod + exists bool + }{ + {mkPod("foo", ""), false}, + {mkPod("rejected", ""), false}, + {mkPod("bar", "55"), true}, + {mkPod("baz", "32"), true}, + } + for _, item := range table { + obj, exists, _ := s.Get(item.Pod) + if e, a := item.exists, exists; e != a { + t.Errorf("%v: expected %v, got %v", item.Pod, e, a) + } + if !exists { + continue + } + if e, a := item.Pod.ResourceVersion, obj.(*v1.Pod).ResourceVersion; e != a { + t.Errorf("%v: expected %v, got %v", item.Pod, e, a) + } + } + + // RV should send the last version we see. + if e, a := "32", resumeRV; e != a { + t.Errorf("expected %v, got %v", e, a) + } + + // last sync resource version should be the last version synced with store + if e, a := "32", g.LastSyncResourceVersion(); e != a { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestReflectorStopWatch(t *testing.T) { + s := NewStore(MetaNamespaceKeyFunc) + g := NewReflector(&testLW{}, &v1.Pod{}, s, 0) + fw := watch.NewFake() + var resumeRV string + stopWatch := make(chan struct{}, 1) + stopWatch <- struct{}{} + err := g.watchHandler(fw, &resumeRV, nevererrc, stopWatch) + if err != errorStopRequested { + t.Errorf("expected stop error, got %q", err) + } +} + +func TestReflectorListAndWatch(t *testing.T) { + createdFakes := make(chan *watch.FakeWatcher) + + // The ListFunc says that it's at revision 1. Therefore, we expect our WatchFunc + // to get called at the beginning of the watch with 1, and again with 3 when we + // inject an error. + expectedRVs := []string{"1", "3"} + lw := &testLW{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + rv := options.ResourceVersion + fw := watch.NewFake() + if e, a := expectedRVs[0], rv; e != a { + t.Errorf("Expected rv %v, but got %v", e, a) + } + expectedRVs = expectedRVs[1:] + // channel is not buffered because the for loop below needs to block. But + // we don't want to block here, so report the new fake via a go routine. + go func() { createdFakes <- fw }() + return fw, nil + }, + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return &v1.PodList{ListMeta: metav1.ListMeta{ResourceVersion: "1"}}, nil + }, + } + s := NewFIFO(MetaNamespaceKeyFunc) + r := NewReflector(lw, &v1.Pod{}, s, 0) + go r.ListAndWatch(wait.NeverStop) + + ids := []string{"foo", "bar", "baz", "qux", "zoo"} + var fw *watch.FakeWatcher + for i, id := range ids { + if fw == nil { + fw = <-createdFakes + } + sendingRV := strconv.FormatUint(uint64(i+2), 10) + fw.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: id, ResourceVersion: sendingRV}}) + if sendingRV == "3" { + // Inject a failure. + fw.Stop() + fw = nil + } + } + + // Verify we received the right ids with the right resource versions. + for i, id := range ids { + pod := Pop(s).(*v1.Pod) + if e, a := id, pod.Name; e != a { + t.Errorf("%v: Expected %v, got %v", i, e, a) + } + if e, a := strconv.FormatUint(uint64(i+2), 10), pod.ResourceVersion; e != a { + t.Errorf("%v: Expected %v, got %v", i, e, a) + } + } + + if len(expectedRVs) != 0 { + t.Error("called watchStarter an unexpected number of times") + } +} + +func TestReflectorListAndWatchWithErrors(t *testing.T) { + mkPod := func(id string, rv string) *v1.Pod { + return &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: id, ResourceVersion: rv}} + } + mkList := func(rv string, pods ...*v1.Pod) *v1.PodList { + list := &v1.PodList{ListMeta: metav1.ListMeta{ResourceVersion: rv}} + for _, pod := range pods { + list.Items = append(list.Items, *pod) + } + return list + } + table := []struct { + list *v1.PodList + listErr error + events []watch.Event + watchErr error + }{ + { + list: mkList("1"), + events: []watch.Event{ + {Type: watch.Added, Object: mkPod("foo", "2")}, + {Type: watch.Added, Object: mkPod("bar", "3")}, + }, + }, { + list: mkList("3", mkPod("foo", "2"), mkPod("bar", "3")), + events: []watch.Event{ + {Type: watch.Deleted, Object: mkPod("foo", "4")}, + {Type: watch.Added, Object: mkPod("qux", "5")}, + }, + }, { + listErr: fmt.Errorf("a list error"), + }, { + list: mkList("5", mkPod("bar", "3"), mkPod("qux", "5")), + watchErr: fmt.Errorf("a watch error"), + }, { + list: mkList("5", mkPod("bar", "3"), mkPod("qux", "5")), + events: []watch.Event{ + {Type: watch.Added, Object: mkPod("baz", "6")}, + }, + }, { + list: mkList("6", mkPod("bar", "3"), mkPod("qux", "5"), mkPod("baz", "6")), + }, + } + + s := NewFIFO(MetaNamespaceKeyFunc) + for line, item := range table { + if item.list != nil { + // Test that the list is what currently exists in the store. + current := s.List() + checkMap := map[string]string{} + for _, item := range current { + pod := item.(*v1.Pod) + checkMap[pod.Name] = pod.ResourceVersion + } + for _, pod := range item.list.Items { + if e, a := pod.ResourceVersion, checkMap[pod.Name]; e != a { + t.Errorf("%v: expected %v, got %v for pod %v", line, e, a, pod.Name) + } + } + if e, a := len(item.list.Items), len(checkMap); e != a { + t.Errorf("%v: expected %v, got %v", line, e, a) + } + } + watchRet, watchErr := item.events, item.watchErr + lw := &testLW{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if watchErr != nil { + return nil, watchErr + } + watchErr = fmt.Errorf("second watch") + fw := watch.NewFake() + go func() { + for _, e := range watchRet { + fw.Action(e.Type, e.Object) + } + fw.Stop() + }() + return fw, nil + }, + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return item.list, item.listErr + }, + } + r := NewReflector(lw, &v1.Pod{}, s, 0) + r.ListAndWatch(wait.NeverStop) + } +} + +func TestReflectorResync(t *testing.T) { + iteration := 0 + stopCh := make(chan struct{}) + rerr := errors.New("expected resync reached") + s := &FakeCustomStore{ + ResyncFunc: func() error { + iteration++ + if iteration == 2 { + return rerr + } + return nil + }, + } + + lw := &testLW{ + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + fw := watch.NewFake() + return fw, nil + }, + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return &v1.PodList{ListMeta: metav1.ListMeta{ResourceVersion: "0"}}, nil + }, + } + resyncPeriod := 1 * time.Millisecond + r := NewReflector(lw, &v1.Pod{}, s, resyncPeriod) + if err := r.ListAndWatch(stopCh); err != nil { + // error from Resync is not propaged up to here. + t.Errorf("expected error %v", err) + } + if iteration != 2 { + t.Errorf("exactly 2 iterations were expected, got: %v", iteration) + } +} diff --git a/vendor/k8s.io/client-go/tools/cache/shared_informer_test.go b/vendor/k8s.io/client-go/tools/cache/shared_informer_test.go new file mode 100644 index 00000000..22e4a90d --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/shared_informer_test.go @@ -0,0 +1,265 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 cache + +import ( + "fmt" + "sync" + "testing" + "time" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/wait" + fcache "k8s.io/client-go/tools/cache/testing" +) + +type testListener struct { + lock sync.RWMutex + resyncPeriod time.Duration + expectedItemNames sets.String + receivedItemNames []string + name string +} + +func newTestListener(name string, resyncPeriod time.Duration, expected ...string) *testListener { + l := &testListener{ + resyncPeriod: resyncPeriod, + expectedItemNames: sets.NewString(expected...), + name: name, + } + return l +} + +func (l *testListener) OnAdd(obj interface{}) { + l.handle(obj) +} + +func (l *testListener) OnUpdate(old, new interface{}) { + l.handle(new) +} + +func (l *testListener) OnDelete(obj interface{}) { +} + +func (l *testListener) handle(obj interface{}) { + key, _ := MetaNamespaceKeyFunc(obj) + fmt.Printf("%s: handle: %v\n", l.name, key) + l.lock.Lock() + defer l.lock.Unlock() + + objectMeta, _ := meta.Accessor(obj) + l.receivedItemNames = append(l.receivedItemNames, objectMeta.GetName()) +} + +func (l *testListener) ok() bool { + fmt.Println("polling") + err := wait.PollImmediate(100*time.Millisecond, 2*time.Second, func() (bool, error) { + if l.satisfiedExpectations() { + return true, nil + } + return false, nil + }) + if err != nil { + return false + } + + // wait just a bit to allow any unexpected stragglers to come in + fmt.Println("sleeping") + time.Sleep(1 * time.Second) + fmt.Println("final check") + return l.satisfiedExpectations() +} + +func (l *testListener) satisfiedExpectations() bool { + l.lock.RLock() + defer l.lock.RUnlock() + + return len(l.receivedItemNames) == l.expectedItemNames.Len() && sets.NewString(l.receivedItemNames...).Equal(l.expectedItemNames) +} + +func TestListenerResyncPeriods(t *testing.T) { + // source simulates an apiserver object endpoint. + source := fcache.NewFakeControllerSource() + source.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1"}}) + source.Add(&v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod2"}}) + + // create the shared informer and resync every 1s + informer := NewSharedInformer(source, &v1.Pod{}, 1*time.Second).(*sharedIndexInformer) + + clock := clock.NewFakeClock(time.Now()) + informer.clock = clock + informer.processor.clock = clock + + // listener 1, never resync + listener1 := newTestListener("listener1", 0, "pod1", "pod2") + informer.AddEventHandlerWithResyncPeriod(listener1, listener1.resyncPeriod) + + // listener 2, resync every 2s + listener2 := newTestListener("listener2", 2*time.Second, "pod1", "pod2") + informer.AddEventHandlerWithResyncPeriod(listener2, listener2.resyncPeriod) + + // listener 3, resync every 3s + listener3 := newTestListener("listener3", 3*time.Second, "pod1", "pod2") + informer.AddEventHandlerWithResyncPeriod(listener3, listener3.resyncPeriod) + listeners := []*testListener{listener1, listener2, listener3} + + stop := make(chan struct{}) + defer close(stop) + + go informer.Run(stop) + + // ensure all listeners got the initial List + for _, listener := range listeners { + if !listener.ok() { + t.Errorf("%s: expected %v, got %v", listener.name, listener.expectedItemNames, listener.receivedItemNames) + } + } + + // reset + for _, listener := range listeners { + listener.receivedItemNames = []string{} + } + + // advance so listener2 gets a resync + clock.Step(2 * time.Second) + + // make sure listener2 got the resync + if !listener2.ok() { + t.Errorf("%s: expected %v, got %v", listener2.name, listener2.expectedItemNames, listener2.receivedItemNames) + } + + // wait a bit to give errant items a chance to go to 1 and 3 + time.Sleep(1 * time.Second) + + // make sure listeners 1 and 3 got nothing + if len(listener1.receivedItemNames) != 0 { + t.Errorf("listener1: should not have resynced (got %d)", len(listener1.receivedItemNames)) + } + if len(listener3.receivedItemNames) != 0 { + t.Errorf("listener3: should not have resynced (got %d)", len(listener3.receivedItemNames)) + } + + // reset + for _, listener := range listeners { + listener.receivedItemNames = []string{} + } + + // advance so listener3 gets a resync + clock.Step(1 * time.Second) + + // make sure listener3 got the resync + if !listener3.ok() { + t.Errorf("%s: expected %v, got %v", listener3.name, listener3.expectedItemNames, listener3.receivedItemNames) + } + + // wait a bit to give errant items a chance to go to 1 and 2 + time.Sleep(1 * time.Second) + + // make sure listeners 1 and 2 got nothing + if len(listener1.receivedItemNames) != 0 { + t.Errorf("listener1: should not have resynced (got %d)", len(listener1.receivedItemNames)) + } + if len(listener2.receivedItemNames) != 0 { + t.Errorf("listener2: should not have resynced (got %d)", len(listener2.receivedItemNames)) + } +} + +func TestResyncCheckPeriod(t *testing.T) { + // source simulates an apiserver object endpoint. + source := fcache.NewFakeControllerSource() + + // create the shared informer and resync every 12 hours + informer := NewSharedInformer(source, &v1.Pod{}, 12*time.Hour).(*sharedIndexInformer) + + clock := clock.NewFakeClock(time.Now()) + informer.clock = clock + informer.processor.clock = clock + + // listener 1, never resync + listener1 := newTestListener("listener1", 0) + informer.AddEventHandlerWithResyncPeriod(listener1, listener1.resyncPeriod) + if e, a := 12*time.Hour, informer.resyncCheckPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := time.Duration(0), informer.processor.listeners[0].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + + // listener 2, resync every minute + listener2 := newTestListener("listener2", 1*time.Minute) + informer.AddEventHandlerWithResyncPeriod(listener2, listener2.resyncPeriod) + if e, a := 1*time.Minute, informer.resyncCheckPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := time.Duration(0), informer.processor.listeners[0].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := 1*time.Minute, informer.processor.listeners[1].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + + // listener 3, resync every 55 seconds + listener3 := newTestListener("listener3", 55*time.Second) + informer.AddEventHandlerWithResyncPeriod(listener3, listener3.resyncPeriod) + if e, a := 55*time.Second, informer.resyncCheckPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := time.Duration(0), informer.processor.listeners[0].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := 1*time.Minute, informer.processor.listeners[1].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := 55*time.Second, informer.processor.listeners[2].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + + // listener 4, resync every 5 seconds + listener4 := newTestListener("listener4", 5*time.Second) + informer.AddEventHandlerWithResyncPeriod(listener4, listener4.resyncPeriod) + if e, a := 5*time.Second, informer.resyncCheckPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := time.Duration(0), informer.processor.listeners[0].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := 1*time.Minute, informer.processor.listeners[1].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := 55*time.Second, informer.processor.listeners[2].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } + if e, a := 5*time.Second, informer.processor.listeners[3].resyncPeriod; e != a { + t.Errorf("expected %d, got %d", e, a) + } +} + +// verify that https://github.com/kubernetes/kubernetes/issues/59822 is fixed +func TestSharedInformerInitializationRace(t *testing.T) { + source := fcache.NewFakeControllerSource() + informer := NewSharedInformer(source, &v1.Pod{}, 1*time.Second).(*sharedIndexInformer) + listener := newTestListener("raceListener", 0) + + stop := make(chan struct{}) + go informer.AddEventHandlerWithResyncPeriod(listener, listener.resyncPeriod) + go informer.Run(stop) + close(stop) +} diff --git a/vendor/k8s.io/client-go/tools/cache/store_test.go b/vendor/k8s.io/client-go/tools/cache/store_test.go new file mode 100644 index 00000000..52c9585a --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/store_test.go @@ -0,0 +1,156 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 cache + +import ( + "testing" + + "k8s.io/apimachinery/pkg/util/sets" +) + +// Test public interface +func doTestStore(t *testing.T, store Store) { + mkObj := func(id string, val string) testStoreObject { + return testStoreObject{id: id, val: val} + } + + store.Add(mkObj("foo", "bar")) + if item, ok, _ := store.Get(mkObj("foo", "")); !ok { + t.Errorf("didn't find inserted item") + } else { + if e, a := "bar", item.(testStoreObject).val; e != a { + t.Errorf("expected %v, got %v", e, a) + } + } + store.Update(mkObj("foo", "baz")) + if item, ok, _ := store.Get(mkObj("foo", "")); !ok { + t.Errorf("didn't find inserted item") + } else { + if e, a := "baz", item.(testStoreObject).val; e != a { + t.Errorf("expected %v, got %v", e, a) + } + } + store.Delete(mkObj("foo", "")) + if _, ok, _ := store.Get(mkObj("foo", "")); ok { + t.Errorf("found deleted item??") + } + + // Test List. + store.Add(mkObj("a", "b")) + store.Add(mkObj("c", "d")) + store.Add(mkObj("e", "e")) + { + found := sets.String{} + for _, item := range store.List() { + found.Insert(item.(testStoreObject).val) + } + if !found.HasAll("b", "d", "e") { + t.Errorf("missing items, found: %v", found) + } + if len(found) != 3 { + t.Errorf("extra items") + } + } + + // Test Replace. + store.Replace([]interface{}{ + mkObj("foo", "foo"), + mkObj("bar", "bar"), + }, "0") + + { + found := sets.String{} + for _, item := range store.List() { + found.Insert(item.(testStoreObject).val) + } + if !found.HasAll("foo", "bar") { + t.Errorf("missing items") + } + if len(found) != 2 { + t.Errorf("extra items") + } + } +} + +// Test public interface +func doTestIndex(t *testing.T, indexer Indexer) { + mkObj := func(id string, val string) testStoreObject { + return testStoreObject{id: id, val: val} + } + + // Test Index + expected := map[string]sets.String{} + expected["b"] = sets.NewString("a", "c") + expected["f"] = sets.NewString("e") + expected["h"] = sets.NewString("g") + indexer.Add(mkObj("a", "b")) + indexer.Add(mkObj("c", "b")) + indexer.Add(mkObj("e", "f")) + indexer.Add(mkObj("g", "h")) + { + for k, v := range expected { + found := sets.String{} + indexResults, err := indexer.Index("by_val", mkObj("", k)) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + for _, item := range indexResults { + found.Insert(item.(testStoreObject).id) + } + items := v.List() + if !found.HasAll(items...) { + t.Errorf("missing items, index %s, expected %v but found %v", k, items, found.List()) + } + } + } +} + +func testStoreKeyFunc(obj interface{}) (string, error) { + return obj.(testStoreObject).id, nil +} + +func testStoreIndexFunc(obj interface{}) ([]string, error) { + return []string{obj.(testStoreObject).val}, nil +} + +func testStoreIndexers() Indexers { + indexers := Indexers{} + indexers["by_val"] = testStoreIndexFunc + return indexers +} + +type testStoreObject struct { + id string + val string +} + +func TestCache(t *testing.T) { + doTestStore(t, NewStore(testStoreKeyFunc)) +} + +func TestFIFOCache(t *testing.T) { + doTestStore(t, NewFIFO(testStoreKeyFunc)) +} + +func TestUndeltaStore(t *testing.T) { + nop := func([]interface{}) {} + doTestStore(t, NewUndeltaStore(nop, testStoreKeyFunc)) +} + +func TestIndex(t *testing.T) { + doTestIndex(t, NewIndexer(testStoreKeyFunc, testStoreIndexers())) +} diff --git a/vendor/k8s.io/client-go/tools/cache/undelta_store_test.go b/vendor/k8s.io/client-go/tools/cache/undelta_store_test.go new file mode 100644 index 00000000..6316442e --- /dev/null +++ b/vendor/k8s.io/client-go/tools/cache/undelta_store_test.go @@ -0,0 +1,131 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 cache + +import ( + "reflect" + "testing" +) + +// store_test.go checks that UndeltaStore conforms to the Store interface +// behavior. This test just tests that it calls the push func in addition. + +type testUndeltaObject struct { + name string + val interface{} +} + +func testUndeltaKeyFunc(obj interface{}) (string, error) { + return obj.(testUndeltaObject).name, nil +} + +/* +var ( + o1 interface{} = t{1} + o2 interface{} = t{2} + l1 []interface{} = []interface{}{t{1}} +) +*/ + +func TestUpdateCallsPush(t *testing.T) { + mkObj := func(name string, val interface{}) testUndeltaObject { + return testUndeltaObject{name: name, val: val} + } + + var got []interface{} + var callcount int = 0 + push := func(m []interface{}) { + callcount++ + got = m + } + + u := NewUndeltaStore(push, testUndeltaKeyFunc) + + u.Add(mkObj("a", 2)) + u.Update(mkObj("a", 1)) + if callcount != 2 { + t.Errorf("Expected 2 calls, got %d", callcount) + } + + l := []interface{}{mkObj("a", 1)} + if !reflect.DeepEqual(l, got) { + t.Errorf("Expected %#v, Got %#v", l, got) + } +} + +func TestDeleteCallsPush(t *testing.T) { + mkObj := func(name string, val interface{}) testUndeltaObject { + return testUndeltaObject{name: name, val: val} + } + + var got []interface{} + var callcount int = 0 + push := func(m []interface{}) { + callcount++ + got = m + } + + u := NewUndeltaStore(push, testUndeltaKeyFunc) + + u.Add(mkObj("a", 2)) + u.Delete(mkObj("a", "")) + if callcount != 2 { + t.Errorf("Expected 2 calls, got %d", callcount) + } + expected := []interface{}{} + if !reflect.DeepEqual(expected, got) { + t.Errorf("Expected %#v, Got %#v", expected, got) + } +} + +func TestReadsDoNotCallPush(t *testing.T) { + push := func(m []interface{}) { + t.Errorf("Unexpected call to push!") + } + + u := NewUndeltaStore(push, testUndeltaKeyFunc) + + // These should not call push. + _ = u.List() + _, _, _ = u.Get(testUndeltaObject{"a", ""}) +} + +func TestReplaceCallsPush(t *testing.T) { + mkObj := func(name string, val interface{}) testUndeltaObject { + return testUndeltaObject{name: name, val: val} + } + + var got []interface{} + var callcount int = 0 + push := func(m []interface{}) { + callcount++ + got = m + } + + u := NewUndeltaStore(push, testUndeltaKeyFunc) + + m := []interface{}{mkObj("a", 1)} + + u.Replace(m, "0") + if callcount != 1 { + t.Errorf("Expected 1 calls, got %d", callcount) + } + expected := []interface{}{mkObj("a", 1)} + if !reflect.DeepEqual(expected, got) { + t.Errorf("Expected %#v, Got %#v", expected, got) + } +} diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD index b2fd1382..222cec2a 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD @@ -25,10 +25,11 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/clientcmd/api", importpath = "k8s.io/client-go/tools/clientcmd/api", deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/helpers.go b/vendor/k8s.io/client-go/tools/clientcmd/api/helpers.go index 43e26487..65a36936 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/helpers.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/helpers.go @@ -29,6 +29,8 @@ import ( func init() { sDec, _ := base64.StdEncoding.DecodeString("REDACTED+") redactedBytes = []byte(string(sDec)) + sDec, _ = base64.StdEncoding.DecodeString("DATA+OMITTED") + dataOmittedBytes = []byte(string(sDec)) } // IsConfigEmpty returns true if the config is empty. @@ -79,7 +81,10 @@ func MinifyConfig(config *Config) error { return nil } -var redactedBytes []byte +var ( + redactedBytes []byte + dataOmittedBytes []byte +) // Flatten redacts raw data entries from the config object for a human-readable view. func ShortenConfig(config *Config) { @@ -97,7 +102,7 @@ func ShortenConfig(config *Config) { } for key, cluster := range config.Clusters { if len(cluster.CertificateAuthorityData) > 0 { - cluster.CertificateAuthorityData = redactedBytes + cluster.CertificateAuthorityData = dataOmittedBytes } config.Clusters[key] = cluster } diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/helpers_test.go b/vendor/k8s.io/client-go/tools/clientcmd/api/helpers_test.go new file mode 100644 index 00000000..7ec30e5d --- /dev/null +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/helpers_test.go @@ -0,0 +1,302 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 api + +import ( + "fmt" + "io/ioutil" + "os" + "reflect" + "testing" + + "github.com/ghodss/yaml" +) + +func newMergedConfig(certFile, certContent, keyFile, keyContent, caFile, caContent string, t *testing.T) Config { + if err := ioutil.WriteFile(certFile, []byte(certContent), 0644); err != nil { + t.Errorf("unexpected error: %v", err) + } + if err := ioutil.WriteFile(keyFile, []byte(keyContent), 0600); err != nil { + t.Errorf("unexpected error: %v", err) + } + if err := ioutil.WriteFile(caFile, []byte(caContent), 0644); err != nil { + t.Errorf("unexpected error: %v", err) + } + + return Config{ + AuthInfos: map[string]*AuthInfo{ + "red-user": {Token: "red-token", ClientCertificateData: []byte(certContent), ClientKeyData: []byte(keyContent)}, + "blue-user": {Token: "blue-token", ClientCertificate: certFile, ClientKey: keyFile}}, + Clusters: map[string]*Cluster{ + "cow-cluster": {Server: "http://cow.org:8080", CertificateAuthorityData: []byte(caContent)}, + "chicken-cluster": {Server: "http://chicken.org:8080", CertificateAuthority: caFile}}, + Contexts: map[string]*Context{ + "federal-context": {AuthInfo: "red-user", Cluster: "cow-cluster"}, + "shaker-context": {AuthInfo: "blue-user", Cluster: "chicken-cluster"}}, + CurrentContext: "federal-context", + } +} + +func TestMinifySuccess(t *testing.T) { + certFile, _ := ioutil.TempFile("", "") + defer os.Remove(certFile.Name()) + keyFile, _ := ioutil.TempFile("", "") + defer os.Remove(keyFile.Name()) + caFile, _ := ioutil.TempFile("", "") + defer os.Remove(caFile.Name()) + + mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) + + if err := MinifyConfig(&mutatingConfig); err != nil { + t.Errorf("unexpected error: %v", err) + } + + if len(mutatingConfig.Contexts) > 1 { + t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts) + } + if _, exists := mutatingConfig.Contexts["federal-context"]; !exists { + t.Errorf("missing context") + } + + if len(mutatingConfig.Clusters) > 1 { + t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters) + } + if _, exists := mutatingConfig.Clusters["cow-cluster"]; !exists { + t.Errorf("missing cluster") + } + + if len(mutatingConfig.AuthInfos) > 1 { + t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos) + } + if _, exists := mutatingConfig.AuthInfos["red-user"]; !exists { + t.Errorf("missing user") + } +} + +func TestMinifyMissingContext(t *testing.T) { + certFile, _ := ioutil.TempFile("", "") + defer os.Remove(certFile.Name()) + keyFile, _ := ioutil.TempFile("", "") + defer os.Remove(keyFile.Name()) + caFile, _ := ioutil.TempFile("", "") + defer os.Remove(caFile.Name()) + + mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) + mutatingConfig.CurrentContext = "missing" + + errMsg := "cannot locate context missing" + + if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg { + t.Errorf("expected %v, got %v", errMsg, err) + } +} + +func TestMinifyMissingCluster(t *testing.T) { + certFile, _ := ioutil.TempFile("", "") + defer os.Remove(certFile.Name()) + keyFile, _ := ioutil.TempFile("", "") + defer os.Remove(keyFile.Name()) + caFile, _ := ioutil.TempFile("", "") + defer os.Remove(caFile.Name()) + + mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) + delete(mutatingConfig.Clusters, mutatingConfig.Contexts[mutatingConfig.CurrentContext].Cluster) + + errMsg := "cannot locate cluster cow-cluster" + + if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg { + t.Errorf("expected %v, got %v", errMsg, err) + } +} + +func TestMinifyMissingAuthInfo(t *testing.T) { + certFile, _ := ioutil.TempFile("", "") + defer os.Remove(certFile.Name()) + keyFile, _ := ioutil.TempFile("", "") + defer os.Remove(keyFile.Name()) + caFile, _ := ioutil.TempFile("", "") + defer os.Remove(caFile.Name()) + + mutatingConfig := newMergedConfig(certFile.Name(), "cert", keyFile.Name(), "key", caFile.Name(), "ca", t) + delete(mutatingConfig.AuthInfos, mutatingConfig.Contexts[mutatingConfig.CurrentContext].AuthInfo) + + errMsg := "cannot locate user red-user" + + if err := MinifyConfig(&mutatingConfig); err == nil || err.Error() != errMsg { + t.Errorf("expected %v, got %v", errMsg, err) + } +} + +func TestFlattenSuccess(t *testing.T) { + certFile, _ := ioutil.TempFile("", "") + defer os.Remove(certFile.Name()) + keyFile, _ := ioutil.TempFile("", "") + defer os.Remove(keyFile.Name()) + caFile, _ := ioutil.TempFile("", "") + defer os.Remove(caFile.Name()) + + certData := "cert" + keyData := "key" + caData := "ca" + + unchangingCluster := "cow-cluster" + unchangingAuthInfo := "red-user" + changingCluster := "chicken-cluster" + changingAuthInfo := "blue-user" + + startingConfig := newMergedConfig(certFile.Name(), certData, keyFile.Name(), keyData, caFile.Name(), caData, t) + mutatingConfig := startingConfig + + if err := FlattenConfig(&mutatingConfig); err != nil { + t.Errorf("unexpected error: %v", err) + } + + if len(mutatingConfig.Contexts) != 2 { + t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts) + } + if !reflect.DeepEqual(startingConfig.Contexts, mutatingConfig.Contexts) { + t.Errorf("expected %v, got %v", startingConfig.Contexts, mutatingConfig.Contexts) + } + + if len(mutatingConfig.Clusters) != 2 { + t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters) + } + if !reflect.DeepEqual(startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) { + t.Errorf("expected %v, got %v", startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) + } + if len(mutatingConfig.Clusters[changingCluster].CertificateAuthority) != 0 { + t.Errorf("unexpected caFile") + } + if string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData) != caData { + t.Errorf("expected %v, got %v", caData, string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData)) + } + + if len(mutatingConfig.AuthInfos) != 2 { + t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos) + } + if !reflect.DeepEqual(startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) { + t.Errorf("expected %v, got %v", startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) + } + if len(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificate) != 0 { + t.Errorf("unexpected caFile") + } + if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData) != certData { + t.Errorf("expected %v, got %v", certData, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData)) + } + if len(mutatingConfig.AuthInfos[changingAuthInfo].ClientKey) != 0 { + t.Errorf("unexpected caFile") + } + if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData) != keyData { + t.Errorf("expected %v, got %v", keyData, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData)) + } + +} + +func Example_minifyAndShorten() { + certFile, _ := ioutil.TempFile("", "") + defer os.Remove(certFile.Name()) + keyFile, _ := ioutil.TempFile("", "") + defer os.Remove(keyFile.Name()) + caFile, _ := ioutil.TempFile("", "") + defer os.Remove(caFile.Name()) + + certData := "cert" + keyData := "key" + caData := "ca" + + config := newMergedConfig(certFile.Name(), certData, keyFile.Name(), keyData, caFile.Name(), caData, nil) + + MinifyConfig(&config) + ShortenConfig(&config) + + output, _ := yaml.Marshal(config) + fmt.Printf("%s", string(output)) + // Output: + // clusters: + // cow-cluster: + // LocationOfOrigin: "" + // certificate-authority-data: DATA+OMITTED + // server: http://cow.org:8080 + // contexts: + // federal-context: + // LocationOfOrigin: "" + // cluster: cow-cluster + // user: red-user + // current-context: federal-context + // preferences: {} + // users: + // red-user: + // LocationOfOrigin: "" + // client-certificate-data: REDACTED + // client-key-data: REDACTED + // token: red-token +} + +func TestShortenSuccess(t *testing.T) { + certFile, _ := ioutil.TempFile("", "") + defer os.Remove(certFile.Name()) + keyFile, _ := ioutil.TempFile("", "") + defer os.Remove(keyFile.Name()) + caFile, _ := ioutil.TempFile("", "") + defer os.Remove(caFile.Name()) + + certData := "cert" + keyData := "key" + caData := "ca" + + unchangingCluster := "chicken-cluster" + unchangingAuthInfo := "blue-user" + changingCluster := "cow-cluster" + changingAuthInfo := "red-user" + + startingConfig := newMergedConfig(certFile.Name(), certData, keyFile.Name(), keyData, caFile.Name(), caData, t) + mutatingConfig := startingConfig + + ShortenConfig(&mutatingConfig) + + if len(mutatingConfig.Contexts) != 2 { + t.Errorf("unexpected contexts: %v", mutatingConfig.Contexts) + } + if !reflect.DeepEqual(startingConfig.Contexts, mutatingConfig.Contexts) { + t.Errorf("expected %v, got %v", startingConfig.Contexts, mutatingConfig.Contexts) + } + + redacted := string(redactedBytes) + dataOmitted := string(dataOmittedBytes) + if len(mutatingConfig.Clusters) != 2 { + t.Errorf("unexpected clusters: %v", mutatingConfig.Clusters) + } + if !reflect.DeepEqual(startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) { + t.Errorf("expected %v, got %v", startingConfig.Clusters[unchangingCluster], mutatingConfig.Clusters[unchangingCluster]) + } + if string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData) != dataOmitted { + t.Errorf("expected %v, got %v", dataOmitted, string(mutatingConfig.Clusters[changingCluster].CertificateAuthorityData)) + } + + if len(mutatingConfig.AuthInfos) != 2 { + t.Errorf("unexpected users: %v", mutatingConfig.AuthInfos) + } + if !reflect.DeepEqual(startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) { + t.Errorf("expected %v, got %v", startingConfig.AuthInfos[unchangingAuthInfo], mutatingConfig.AuthInfos[unchangingAuthInfo]) + } + if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData) != redacted { + t.Errorf("expected %v, got %v", redacted, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientCertificateData)) + } + if string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData) != redacted { + t.Errorf("expected %v, got %v", redacted, string(mutatingConfig.AuthInfos[changingAuthInfo].ClientKeyData)) + } +} diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/types_test.go b/vendor/k8s.io/client-go/tools/clientcmd/api/types_test.go new file mode 100644 index 00000000..bd348345 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/types_test.go @@ -0,0 +1,135 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 api + +import ( + "fmt" + + "github.com/ghodss/yaml" +) + +func Example_emptyConfig() { + defaultConfig := NewConfig() + + output, err := yaml.Marshal(defaultConfig) + if err != nil { + fmt.Printf("Unexpected error: %v", err) + } + + fmt.Printf("%v", string(output)) + // Output: + // clusters: {} + // contexts: {} + // current-context: "" + // preferences: {} + // users: {} +} + +func Example_ofOptionsConfig() { + defaultConfig := NewConfig() + defaultConfig.Preferences.Colors = true + defaultConfig.Clusters["alfa"] = &Cluster{ + Server: "https://alfa.org:8080", + InsecureSkipTLSVerify: true, + CertificateAuthority: "path/to/my/cert-ca-filename", + } + defaultConfig.Clusters["bravo"] = &Cluster{ + Server: "https://bravo.org:8080", + InsecureSkipTLSVerify: false, + } + defaultConfig.AuthInfos["white-mage-via-cert"] = &AuthInfo{ + ClientCertificate: "path/to/my/client-cert-filename", + ClientKey: "path/to/my/client-key-filename", + } + defaultConfig.AuthInfos["red-mage-via-token"] = &AuthInfo{ + Token: "my-secret-token", + } + defaultConfig.AuthInfos["black-mage-via-auth-provider"] = &AuthInfo{ + AuthProvider: &AuthProviderConfig{ + Name: "gcp", + Config: map[string]string{ + "foo": "bar", + "token": "s3cr3t-t0k3n", + }, + }, + } + defaultConfig.Contexts["bravo-as-black-mage"] = &Context{ + Cluster: "bravo", + AuthInfo: "black-mage-via-auth-provider", + Namespace: "yankee", + } + defaultConfig.Contexts["alfa-as-black-mage"] = &Context{ + Cluster: "alfa", + AuthInfo: "black-mage-via-auth-provider", + Namespace: "zulu", + } + defaultConfig.Contexts["alfa-as-white-mage"] = &Context{ + Cluster: "alfa", + AuthInfo: "white-mage-via-cert", + } + defaultConfig.CurrentContext = "alfa-as-white-mage" + + output, err := yaml.Marshal(defaultConfig) + if err != nil { + fmt.Printf("Unexpected error: %v", err) + } + + fmt.Printf("%v", string(output)) + // Output: + // clusters: + // alfa: + // LocationOfOrigin: "" + // certificate-authority: path/to/my/cert-ca-filename + // insecure-skip-tls-verify: true + // server: https://alfa.org:8080 + // bravo: + // LocationOfOrigin: "" + // server: https://bravo.org:8080 + // contexts: + // alfa-as-black-mage: + // LocationOfOrigin: "" + // cluster: alfa + // namespace: zulu + // user: black-mage-via-auth-provider + // alfa-as-white-mage: + // LocationOfOrigin: "" + // cluster: alfa + // user: white-mage-via-cert + // bravo-as-black-mage: + // LocationOfOrigin: "" + // cluster: bravo + // namespace: yankee + // user: black-mage-via-auth-provider + // current-context: alfa-as-white-mage + // preferences: + // colors: true + // users: + // black-mage-via-auth-provider: + // LocationOfOrigin: "" + // auth-provider: + // config: + // foo: bar + // token: s3cr3t-t0k3n + // name: gcp + // red-mage-via-token: + // LocationOfOrigin: "" + // token: my-secret-token + // white-mage-via-cert: + // LocationOfOrigin: "" + // client-certificate: path/to/my/client-cert-filename + // client-key: path/to/my/client-key-filename +} diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go index b90aa8d7..3240a7a9 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go @@ -46,31 +46,26 @@ func (in *AuthInfo) DeepCopyInto(out *AuthInfo) { in, out := &in.ImpersonateUserExtra, &out.ImpersonateUserExtra *out = make(map[string][]string, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]string, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } if in.AuthProvider != nil { in, out := &in.AuthProvider, &out.AuthProvider - if *in == nil { - *out = nil - } else { - *out = new(AuthProviderConfig) - (*in).DeepCopyInto(*out) - } + *out = new(AuthProviderConfig) + (*in).DeepCopyInto(*out) } if in.Exec != nil { in, out := &in.Exec, &out.Exec - if *in == nil { - *out = nil - } else { - *out = new(ExecConfig) - (*in).DeepCopyInto(*out) - } + *out = new(ExecConfig) + (*in).DeepCopyInto(*out) } if in.Extensions != nil { in, out := &in.Extensions, &out.Extensions @@ -159,36 +154,45 @@ func (in *Config) DeepCopyInto(out *Config) { in, out := &in.Clusters, &out.Clusters *out = make(map[string]*Cluster, len(*in)) for key, val := range *in { + var outVal *Cluster if val == nil { (*out)[key] = nil } else { - (*out)[key] = new(Cluster) - val.DeepCopyInto((*out)[key]) + in, out := &val, &outVal + *out = new(Cluster) + (*in).DeepCopyInto(*out) } + (*out)[key] = outVal } } if in.AuthInfos != nil { in, out := &in.AuthInfos, &out.AuthInfos *out = make(map[string]*AuthInfo, len(*in)) for key, val := range *in { + var outVal *AuthInfo if val == nil { (*out)[key] = nil } else { - (*out)[key] = new(AuthInfo) - val.DeepCopyInto((*out)[key]) + in, out := &val, &outVal + *out = new(AuthInfo) + (*in).DeepCopyInto(*out) } + (*out)[key] = outVal } } if in.Contexts != nil { in, out := &in.Contexts, &out.Contexts *out = make(map[string]*Context, len(*in)) for key, val := range *in { + var outVal *Context if val == nil { (*out)[key] = nil } else { - (*out)[key] = new(Context) - val.DeepCopyInto((*out)[key]) + in, out := &val, &outVal + *out = new(Context) + (*in).DeepCopyInto(*out) } + (*out)[key] = outVal } } if in.Extensions != nil { diff --git a/vendor/k8s.io/client-go/tools/metrics/BUILD b/vendor/k8s.io/client-go/tools/metrics/BUILD index 7b06e0f9..eafb3070 100644 --- a/vendor/k8s.io/client-go/tools/metrics/BUILD +++ b/vendor/k8s.io/client-go/tools/metrics/BUILD @@ -8,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["metrics.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/metrics", importpath = "k8s.io/client-go/tools/metrics", ) diff --git a/vendor/k8s.io/client-go/tools/pager/BUILD b/vendor/k8s.io/client-go/tools/pager/BUILD index c02def57..304d5b65 100644 --- a/vendor/k8s.io/client-go/tools/pager/BUILD +++ b/vendor/k8s.io/client-go/tools/pager/BUILD @@ -9,13 +9,14 @@ load( go_library( name = "go_default_library", srcs = ["pager.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/pager", importpath = "k8s.io/client-go/tools/pager", deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", ], ) @@ -38,10 +39,10 @@ go_test( srcs = ["pager_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/tools/pager/pager_test.go b/vendor/k8s.io/client-go/tools/pager/pager_test.go new file mode 100644 index 00000000..ae517cab --- /dev/null +++ b/vendor/k8s.io/client-go/tools/pager/pager_test.go @@ -0,0 +1,206 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 pager + +import ( + "context" + "fmt" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/api/errors" + metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" + "k8s.io/apimachinery/pkg/runtime" +) + +func list(count int, rv string) *metainternalversion.List { + var list metainternalversion.List + for i := 0; i < count; i++ { + list.Items = append(list.Items, &metav1beta1.PartialObjectMetadata{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("%d", i), + }, + }) + } + list.ResourceVersion = rv + return &list +} + +type testPager struct { + t *testing.T + rv string + index int + remaining int + last int + continuing bool + done bool + expectPage int64 +} + +func (p *testPager) reset() { + p.continuing = false + p.remaining += p.index + p.index = 0 + p.last = 0 + p.done = false +} + +func (p *testPager) PagedList(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) { + if p.done { + p.t.Errorf("did not expect additional call to paged list") + return nil, fmt.Errorf("unexpected list call") + } + expectedContinue := fmt.Sprintf("%s:%d", p.rv, p.last) + if options.Limit != p.expectPage || (p.continuing && options.Continue != expectedContinue) { + p.t.Errorf("invariant violated, expected limit %d and continue %s, got %#v", p.expectPage, expectedContinue, options) + return nil, fmt.Errorf("invariant violated") + } + var list metainternalversion.List + total := options.Limit + if total == 0 { + total = int64(p.remaining) + } + for i := int64(0); i < total; i++ { + if p.remaining <= 0 { + break + } + list.Items = append(list.Items, &metav1beta1.PartialObjectMetadata{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("%d", p.index), + }, + }) + p.remaining-- + p.index++ + } + p.last = p.index + if p.remaining > 0 { + list.Continue = fmt.Sprintf("%s:%d", p.rv, p.last) + p.continuing = true + } else { + p.done = true + } + list.ResourceVersion = p.rv + return &list, nil +} + +func (p *testPager) ExpiresOnSecondPage(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) { + if p.continuing { + p.done = true + return nil, errors.NewResourceExpired("this list has expired") + } + return p.PagedList(ctx, options) +} + +func (p *testPager) ExpiresOnSecondPageThenFullList(ctx context.Context, options metav1.ListOptions) (runtime.Object, error) { + if p.continuing { + p.reset() + p.expectPage = 0 + return nil, errors.NewResourceExpired("this list has expired") + } + return p.PagedList(ctx, options) +} + +func TestListPager_List(t *testing.T) { + type fields struct { + PageSize int64 + PageFn ListPageFunc + FullListIfExpired bool + } + type args struct { + ctx context.Context + options metav1.ListOptions + } + tests := []struct { + name string + fields fields + args args + want runtime.Object + wantErr bool + isExpired bool + }{ + { + name: "empty page", + fields: fields{PageSize: 10, PageFn: (&testPager{t: t, expectPage: 10, remaining: 0, rv: "rv:20"}).PagedList}, + args: args{}, + want: list(0, "rv:20"), + }, + { + name: "one page", + fields: fields{PageSize: 10, PageFn: (&testPager{t: t, expectPage: 10, remaining: 9, rv: "rv:20"}).PagedList}, + args: args{}, + want: list(9, "rv:20"), + }, + { + name: "one full page", + fields: fields{PageSize: 10, PageFn: (&testPager{t: t, expectPage: 10, remaining: 10, rv: "rv:20"}).PagedList}, + args: args{}, + want: list(10, "rv:20"), + }, + { + name: "two pages", + fields: fields{PageSize: 10, PageFn: (&testPager{t: t, expectPage: 10, remaining: 11, rv: "rv:20"}).PagedList}, + args: args{}, + want: list(11, "rv:20"), + }, + { + name: "three pages", + fields: fields{PageSize: 10, PageFn: (&testPager{t: t, expectPage: 10, remaining: 21, rv: "rv:20"}).PagedList}, + args: args{}, + want: list(21, "rv:20"), + }, + { + name: "expires on second page", + fields: fields{PageSize: 10, PageFn: (&testPager{t: t, expectPage: 10, remaining: 21, rv: "rv:20"}).ExpiresOnSecondPage}, + args: args{}, + wantErr: true, + isExpired: true, + }, + { + name: "expires on second page and then lists", + fields: fields{ + FullListIfExpired: true, + PageSize: 10, + PageFn: (&testPager{t: t, expectPage: 10, remaining: 21, rv: "rv:20"}).ExpiresOnSecondPageThenFullList, + }, + args: args{}, + want: list(21, "rv:20"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := &ListPager{ + PageSize: tt.fields.PageSize, + PageFn: tt.fields.PageFn, + FullListIfExpired: tt.fields.FullListIfExpired, + } + got, err := p.List(tt.args.ctx, tt.args.options) + if (err != nil) != tt.wantErr { + t.Errorf("ListPager.List() error = %v, wantErr %v", err, tt.wantErr) + return + } + if tt.isExpired != errors.IsResourceExpired(err) { + t.Errorf("ListPager.List() error = %v, isExpired %v", err, tt.isExpired) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ListPager.List() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/vendor/k8s.io/client-go/tools/record/BUILD b/vendor/k8s.io/client-go/tools/record/BUILD index 0799afe7..fc1eaf2e 100644 --- a/vendor/k8s.io/client-go/tools/record/BUILD +++ b/vendor/k8s.io/client-go/tools/record/BUILD @@ -14,16 +14,16 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", ], ) @@ -35,22 +35,23 @@ go_library( "events_cache.go", "fake.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record", importpath = "k8s.io/client-go/tools/record", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/tools/record/event_test.go b/vendor/k8s.io/client-go/tools/record/event_test.go new file mode 100644 index 00000000..4fcebc35 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/record/event_test.go @@ -0,0 +1,924 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 record + +import ( + "encoding/json" + "fmt" + "math/rand" + "net/http" + "strconv" + "testing" + "time" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + k8sruntime "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/strategicpatch" + "k8s.io/client-go/kubernetes/scheme" + restclient "k8s.io/client-go/rest" + ref "k8s.io/client-go/tools/reference" +) + +type testEventSink struct { + OnCreate func(e *v1.Event) (*v1.Event, error) + OnUpdate func(e *v1.Event) (*v1.Event, error) + OnPatch func(e *v1.Event, p []byte) (*v1.Event, error) +} + +// CreateEvent records the event for testing. +func (t *testEventSink) Create(e *v1.Event) (*v1.Event, error) { + if t.OnCreate != nil { + return t.OnCreate(e) + } + return e, nil +} + +// UpdateEvent records the event for testing. +func (t *testEventSink) Update(e *v1.Event) (*v1.Event, error) { + if t.OnUpdate != nil { + return t.OnUpdate(e) + } + return e, nil +} + +// PatchEvent records the event for testing. +func (t *testEventSink) Patch(e *v1.Event, p []byte) (*v1.Event, error) { + if t.OnPatch != nil { + return t.OnPatch(e, p) + } + return e, nil +} + +type OnCreateFunc func(*v1.Event) (*v1.Event, error) + +func OnCreateFactory(testCache map[string]*v1.Event, createEvent chan<- *v1.Event) OnCreateFunc { + return func(event *v1.Event) (*v1.Event, error) { + testCache[getEventKey(event)] = event + createEvent <- event + return event, nil + } +} + +type OnPatchFunc func(*v1.Event, []byte) (*v1.Event, error) + +func OnPatchFactory(testCache map[string]*v1.Event, patchEvent chan<- *v1.Event) OnPatchFunc { + return func(event *v1.Event, patch []byte) (*v1.Event, error) { + cachedEvent, found := testCache[getEventKey(event)] + if !found { + return nil, fmt.Errorf("unexpected error: couldn't find Event in testCache.") + } + originalData, err := json.Marshal(cachedEvent) + if err != nil { + return nil, fmt.Errorf("unexpected error: %v", err) + } + patched, err := strategicpatch.StrategicMergePatch(originalData, patch, event) + if err != nil { + return nil, fmt.Errorf("unexpected error: %v", err) + } + patchedObj := &v1.Event{} + err = json.Unmarshal(patched, patchedObj) + if err != nil { + return nil, fmt.Errorf("unexpected error: %v", err) + } + patchEvent <- patchedObj + return patchedObj, nil + } +} + +func TestEventf(t *testing.T) { + testPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + SelfLink: "/api/version/pods/foo", + Name: "foo", + Namespace: "baz", + UID: "bar", + }, + } + testPod2 := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + SelfLink: "/api/version/pods/foo", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + }, + } + testRef, err := ref.GetPartialReference(scheme.Scheme, testPod, "spec.containers[2]") + if err != nil { + t.Fatal(err) + } + testRef2, err := ref.GetPartialReference(scheme.Scheme, testPod2, "spec.containers[3]") + if err != nil { + t.Fatal(err) + } + table := []struct { + obj k8sruntime.Object + eventtype string + reason string + messageFmt string + elements []interface{} + expect *v1.Event + expectLog string + expectUpdate bool + }{ + { + obj: testRef, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + FieldPath: "spec.containers[2]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: false, + }, + { + obj: testPod, + eventtype: v1.EventTypeNormal, + reason: "Killed", + messageFmt: "some other verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + }, + Reason: "Killed", + Message: "some other verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, + expectUpdate: false, + }, + { + obj: testRef, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + FieldPath: "spec.containers[2]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 2, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: true, + }, + { + obj: testRef2, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + APIVersion: "version", + FieldPath: "spec.containers[3]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: false, + }, + { + obj: testRef, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + FieldPath: "spec.containers[2]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 3, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: true, + }, + { + obj: testRef2, + eventtype: v1.EventTypeNormal, + reason: "Stopped", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + APIVersion: "version", + FieldPath: "spec.containers[3]", + }, + Reason: "Stopped", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectUpdate: false, + }, + { + obj: testRef2, + eventtype: v1.EventTypeNormal, + reason: "Stopped", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + APIVersion: "version", + FieldPath: "spec.containers[3]", + }, + Reason: "Stopped", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 2, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectUpdate: true, + }, + } + + testCache := map[string]*v1.Event{} + logCalled := make(chan struct{}) + createEvent := make(chan *v1.Event) + updateEvent := make(chan *v1.Event) + patchEvent := make(chan *v1.Event) + testEvents := testEventSink{ + OnCreate: OnCreateFactory(testCache, createEvent), + OnUpdate: func(event *v1.Event) (*v1.Event, error) { + updateEvent <- event + return event, nil + }, + OnPatch: OnPatchFactory(testCache, patchEvent), + } + eventBroadcaster := NewBroadcasterForTests(0) + sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) + + clock := clock.NewFakeClock(time.Now()) + recorder := recorderWithFakeClock(v1.EventSource{Component: "eventTest"}, eventBroadcaster, clock) + for index, item := range table { + clock.Step(1 * time.Second) + logWatcher := eventBroadcaster.StartLogging(func(formatter string, args ...interface{}) { + if e, a := item.expectLog, fmt.Sprintf(formatter, args...); e != a { + t.Errorf("Expected '%v', got '%v'", e, a) + } + logCalled <- struct{}{} + }) + recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) + + <-logCalled + + // validate event + if item.expectUpdate { + actualEvent := <-patchEvent + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } else { + actualEvent := <-createEvent + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } + logWatcher.Stop() + } + sinkWatcher.Stop() +} + +func recorderWithFakeClock(eventSource v1.EventSource, eventBroadcaster EventBroadcaster, clock clock.Clock) EventRecorder { + return &recorderImpl{scheme.Scheme, eventSource, eventBroadcaster.(*eventBroadcasterImpl).Broadcaster, clock} +} + +func TestWriteEventError(t *testing.T) { + type entry struct { + timesToSendError int + attemptsWanted int + err error + } + table := map[string]*entry{ + "giveUp1": { + timesToSendError: 1000, + attemptsWanted: 1, + err: &restclient.RequestConstructionError{}, + }, + "giveUp2": { + timesToSendError: 1000, + attemptsWanted: 1, + err: &errors.StatusError{}, + }, + "retry1": { + timesToSendError: 1000, + attemptsWanted: 12, + err: &errors.UnexpectedObjectError{}, + }, + "retry2": { + timesToSendError: 1000, + attemptsWanted: 12, + err: fmt.Errorf("A weird error"), + }, + "succeedEventually": { + timesToSendError: 2, + attemptsWanted: 2, + err: fmt.Errorf("A weird error"), + }, + } + + clock := clock.IntervalClock{Time: time.Now(), Duration: time.Second} + eventCorrelator := NewEventCorrelator(&clock) + randGen := rand.New(rand.NewSource(time.Now().UnixNano())) + + for caseName, ent := range table { + attempts := 0 + sink := &testEventSink{ + OnCreate: func(event *v1.Event) (*v1.Event, error) { + attempts++ + if attempts < ent.timesToSendError { + return nil, ent.err + } + return event, nil + }, + } + ev := &v1.Event{} + recordToSink(sink, ev, eventCorrelator, randGen, 0) + if attempts != ent.attemptsWanted { + t.Errorf("case %v: wanted %d, got %d attempts", caseName, ent.attemptsWanted, attempts) + } + } +} + +func TestUpdateExpiredEvent(t *testing.T) { + clock := clock.IntervalClock{Time: time.Now(), Duration: time.Second} + eventCorrelator := NewEventCorrelator(&clock) + randGen := rand.New(rand.NewSource(time.Now().UnixNano())) + + var createdEvent *v1.Event + + sink := &testEventSink{ + OnPatch: func(*v1.Event, []byte) (*v1.Event, error) { + return nil, &errors.StatusError{ + ErrStatus: metav1.Status{ + Code: http.StatusNotFound, + Reason: metav1.StatusReasonNotFound, + }} + }, + OnCreate: func(event *v1.Event) (*v1.Event, error) { + createdEvent = event + return event, nil + }, + } + + ev := &v1.Event{} + ev.ResourceVersion = "updated-resource-version" + ev.Count = 2 + recordToSink(sink, ev, eventCorrelator, randGen, 0) + + if createdEvent == nil { + t.Error("Event did not get created after patch failed") + return + } + + if createdEvent.ResourceVersion != "" { + t.Errorf("Event did not have its resource version cleared, was %s", createdEvent.ResourceVersion) + } +} + +func TestLotsOfEvents(t *testing.T) { + recorderCalled := make(chan struct{}) + loggerCalled := make(chan struct{}) + + // Fail each event a few times to ensure there's some load on the tested code. + var counts [1000]int + testEvents := testEventSink{ + OnCreate: func(event *v1.Event) (*v1.Event, error) { + num, err := strconv.Atoi(event.Message) + if err != nil { + t.Error(err) + return event, nil + } + counts[num]++ + if counts[num] < 5 { + return nil, fmt.Errorf("fake error") + } + recorderCalled <- struct{}{} + return event, nil + }, + } + + eventBroadcaster := NewBroadcasterForTests(0) + sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) + logWatcher := eventBroadcaster.StartLogging(func(formatter string, args ...interface{}) { + loggerCalled <- struct{}{} + }) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "eventTest"}) + for i := 0; i < maxQueuedEvents; i++ { + // we want a unique object to stop spam filtering + ref := &v1.ObjectReference{ + Kind: "Pod", + Name: fmt.Sprintf("foo-%v", i), + Namespace: "baz", + UID: "bar", + APIVersion: "version", + } + // we need to vary the reason to prevent aggregation + go recorder.Eventf(ref, v1.EventTypeNormal, "Reason-"+string(i), strconv.Itoa(i)) + } + // Make sure no events were dropped by either of the listeners. + for i := 0; i < maxQueuedEvents; i++ { + <-recorderCalled + <-loggerCalled + } + // Make sure that every event was attempted 5 times + for i := 0; i < maxQueuedEvents; i++ { + if counts[i] < 5 { + t.Errorf("Only attempted to record event '%d' %d times.", i, counts[i]) + } + } + sinkWatcher.Stop() + logWatcher.Stop() +} + +func TestEventfNoNamespace(t *testing.T) { + testPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + SelfLink: "/api/version/pods/foo", + Name: "foo", + UID: "bar", + }, + } + testRef, err := ref.GetPartialReference(scheme.Scheme, testPod, "spec.containers[2]") + if err != nil { + t.Fatal(err) + } + table := []struct { + obj k8sruntime.Object + eventtype string + reason string + messageFmt string + elements []interface{} + expect *v1.Event + expectLog string + expectUpdate bool + }{ + { + obj: testRef, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "default", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "", + UID: "bar", + APIVersion: "version", + FieldPath: "spec.containers[2]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: false, + }, + } + + testCache := map[string]*v1.Event{} + logCalled := make(chan struct{}) + createEvent := make(chan *v1.Event) + updateEvent := make(chan *v1.Event) + patchEvent := make(chan *v1.Event) + testEvents := testEventSink{ + OnCreate: OnCreateFactory(testCache, createEvent), + OnUpdate: func(event *v1.Event) (*v1.Event, error) { + updateEvent <- event + return event, nil + }, + OnPatch: OnPatchFactory(testCache, patchEvent), + } + eventBroadcaster := NewBroadcasterForTests(0) + sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) + + clock := clock.NewFakeClock(time.Now()) + recorder := recorderWithFakeClock(v1.EventSource{Component: "eventTest"}, eventBroadcaster, clock) + + for index, item := range table { + clock.Step(1 * time.Second) + logWatcher := eventBroadcaster.StartLogging(func(formatter string, args ...interface{}) { + if e, a := item.expectLog, fmt.Sprintf(formatter, args...); e != a { + t.Errorf("Expected '%v', got '%v'", e, a) + } + logCalled <- struct{}{} + }) + recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) + + <-logCalled + + // validate event + if item.expectUpdate { + actualEvent := <-patchEvent + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } else { + actualEvent := <-createEvent + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } + + logWatcher.Stop() + } + sinkWatcher.Stop() +} + +func TestMultiSinkCache(t *testing.T) { + testPod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + SelfLink: "/api/version/pods/foo", + Name: "foo", + Namespace: "baz", + UID: "bar", + }, + } + testPod2 := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + SelfLink: "/api/version/pods/foo", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + }, + } + testRef, err := ref.GetPartialReference(scheme.Scheme, testPod, "spec.containers[2]") + if err != nil { + t.Fatal(err) + } + testRef2, err := ref.GetPartialReference(scheme.Scheme, testPod2, "spec.containers[3]") + if err != nil { + t.Fatal(err) + } + table := []struct { + obj k8sruntime.Object + eventtype string + reason string + messageFmt string + elements []interface{} + expect *v1.Event + expectLog string + expectUpdate bool + }{ + { + obj: testRef, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + FieldPath: "spec.containers[2]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: false, + }, + { + obj: testPod, + eventtype: v1.EventTypeNormal, + reason: "Killed", + messageFmt: "some other verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + }, + Reason: "Killed", + Message: "some other verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:""}): type: 'Normal' reason: 'Killed' some other verbose message: 1`, + expectUpdate: false, + }, + { + obj: testRef, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + FieldPath: "spec.containers[2]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 2, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: true, + }, + { + obj: testRef2, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + APIVersion: "version", + FieldPath: "spec.containers[3]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: false, + }, + { + obj: testRef, + eventtype: v1.EventTypeNormal, + reason: "Started", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "bar", + APIVersion: "version", + FieldPath: "spec.containers[2]", + }, + Reason: "Started", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 3, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"bar", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[2]"}): type: 'Normal' reason: 'Started' some verbose message: 1`, + expectUpdate: true, + }, + { + obj: testRef2, + eventtype: v1.EventTypeNormal, + reason: "Stopped", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + APIVersion: "version", + FieldPath: "spec.containers[3]", + }, + Reason: "Stopped", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 1, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectUpdate: false, + }, + { + obj: testRef2, + eventtype: v1.EventTypeNormal, + reason: "Stopped", + messageFmt: "some verbose message: %v", + elements: []interface{}{1}, + expect: &v1.Event{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "baz", + }, + InvolvedObject: v1.ObjectReference{ + Kind: "Pod", + Name: "foo", + Namespace: "baz", + UID: "differentUid", + APIVersion: "version", + FieldPath: "spec.containers[3]", + }, + Reason: "Stopped", + Message: "some verbose message: 1", + Source: v1.EventSource{Component: "eventTest"}, + Count: 2, + Type: v1.EventTypeNormal, + }, + expectLog: `Event(v1.ObjectReference{Kind:"Pod", Namespace:"baz", Name:"foo", UID:"differentUid", APIVersion:"version", ResourceVersion:"", FieldPath:"spec.containers[3]"}): type: 'Normal' reason: 'Stopped' some verbose message: 1`, + expectUpdate: true, + }, + } + + testCache := map[string]*v1.Event{} + createEvent := make(chan *v1.Event) + updateEvent := make(chan *v1.Event) + patchEvent := make(chan *v1.Event) + testEvents := testEventSink{ + OnCreate: OnCreateFactory(testCache, createEvent), + OnUpdate: func(event *v1.Event) (*v1.Event, error) { + updateEvent <- event + return event, nil + }, + OnPatch: OnPatchFactory(testCache, patchEvent), + } + + testCache2 := map[string]*v1.Event{} + createEvent2 := make(chan *v1.Event) + updateEvent2 := make(chan *v1.Event) + patchEvent2 := make(chan *v1.Event) + testEvents2 := testEventSink{ + OnCreate: OnCreateFactory(testCache2, createEvent2), + OnUpdate: func(event *v1.Event) (*v1.Event, error) { + updateEvent2 <- event + return event, nil + }, + OnPatch: OnPatchFactory(testCache2, patchEvent2), + } + + eventBroadcaster := NewBroadcasterForTests(0) + clock := clock.NewFakeClock(time.Now()) + recorder := recorderWithFakeClock(v1.EventSource{Component: "eventTest"}, eventBroadcaster, clock) + + sinkWatcher := eventBroadcaster.StartRecordingToSink(&testEvents) + for index, item := range table { + clock.Step(1 * time.Second) + recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) + + // validate event + if item.expectUpdate { + actualEvent := <-patchEvent + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } else { + actualEvent := <-createEvent + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } + } + + // Another StartRecordingToSink call should start to record events with new clean cache. + sinkWatcher2 := eventBroadcaster.StartRecordingToSink(&testEvents2) + for index, item := range table { + clock.Step(1 * time.Second) + recorder.Eventf(item.obj, item.eventtype, item.reason, item.messageFmt, item.elements...) + + // validate event + if item.expectUpdate { + actualEvent := <-patchEvent2 + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } else { + actualEvent := <-createEvent2 + validateEvent(strconv.Itoa(index), actualEvent, item.expect, t) + } + } + + sinkWatcher.Stop() + sinkWatcher2.Stop() +} diff --git a/vendor/k8s.io/client-go/tools/record/events_cache.go b/vendor/k8s.io/client-go/tools/record/events_cache.go index 6ac767c9..a42084f3 100644 --- a/vendor/k8s.io/client-go/tools/record/events_cache.go +++ b/vendor/k8s.io/client-go/tools/record/events_cache.go @@ -84,11 +84,6 @@ func getSpamKey(event *v1.Event) string { // EventFilterFunc is a function that returns true if the event should be skipped type EventFilterFunc func(event *v1.Event) bool -// DefaultEventFilterFunc returns false for all incoming events -func DefaultEventFilterFunc(event *v1.Event) bool { - return false -} - // EventSourceObjectSpamFilter is responsible for throttling // the amount of events a source and object can produce. type EventSourceObjectSpamFilter struct { diff --git a/vendor/k8s.io/client-go/tools/record/events_cache_test.go b/vendor/k8s.io/client-go/tools/record/events_cache_test.go new file mode 100644 index 00000000..8cb4a39e --- /dev/null +++ b/vendor/k8s.io/client-go/tools/record/events_cache_test.go @@ -0,0 +1,279 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 record + +import ( + "reflect" + "strings" + "testing" + "time" + + "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/diff" +) + +func makeObjectReference(kind, name, namespace string) v1.ObjectReference { + return v1.ObjectReference{ + Kind: kind, + Name: name, + Namespace: namespace, + UID: "C934D34AFB20242", + APIVersion: "version", + FieldPath: "spec.containers{mycontainer}", + } +} + +func makeEvent(reason, message string, involvedObject v1.ObjectReference) v1.Event { + eventTime := metav1.Now() + event := v1.Event{ + Reason: reason, + Message: message, + InvolvedObject: involvedObject, + Source: v1.EventSource{ + Component: "kubelet", + Host: "kublet.node1", + }, + Count: 1, + FirstTimestamp: eventTime, + LastTimestamp: eventTime, + Type: v1.EventTypeNormal, + } + return event +} + +func makeEvents(num int, template v1.Event) []v1.Event { + events := []v1.Event{} + for i := 0; i < num; i++ { + events = append(events, template) + } + return events +} + +func makeUniqueEvents(num int) []v1.Event { + events := []v1.Event{} + kind := "Pod" + for i := 0; i < num; i++ { + reason := strings.Join([]string{"reason", string(i)}, "-") + message := strings.Join([]string{"message", string(i)}, "-") + name := strings.Join([]string{"pod", string(i)}, "-") + namespace := strings.Join([]string{"ns", string(i)}, "-") + involvedObject := makeObjectReference(kind, name, namespace) + events = append(events, makeEvent(reason, message, involvedObject)) + } + return events +} + +func makeSimilarEvents(num int, template v1.Event, messagePrefix string) []v1.Event { + events := makeEvents(num, template) + for i := range events { + events[i].Message = strings.Join([]string{messagePrefix, string(i), events[i].Message}, "-") + } + return events +} + +func setCount(event v1.Event, count int) v1.Event { + event.Count = int32(count) + return event +} + +func validateEvent(messagePrefix string, actualEvent *v1.Event, expectedEvent *v1.Event, t *testing.T) (*v1.Event, error) { + recvEvent := *actualEvent + expectCompression := expectedEvent.Count > 1 + t.Logf("%v - expectedEvent.Count is %d\n", messagePrefix, expectedEvent.Count) + // Just check that the timestamp was set. + if recvEvent.FirstTimestamp.IsZero() || recvEvent.LastTimestamp.IsZero() { + t.Errorf("%v - timestamp wasn't set: %#v", messagePrefix, recvEvent) + } + actualFirstTimestamp := recvEvent.FirstTimestamp + actualLastTimestamp := recvEvent.LastTimestamp + if actualFirstTimestamp.Equal(&actualLastTimestamp) { + if expectCompression { + t.Errorf("%v - FirstTimestamp (%q) and LastTimestamp (%q) must be different to indicate event compression happened, but were the same. Actual Event: %#v", messagePrefix, actualFirstTimestamp, actualLastTimestamp, recvEvent) + } + } else { + if expectedEvent.Count == 1 { + t.Errorf("%v - FirstTimestamp (%q) and LastTimestamp (%q) must be equal to indicate only one occurrence of the event, but were different. Actual Event: %#v", messagePrefix, actualFirstTimestamp, actualLastTimestamp, recvEvent) + } + } + // Temp clear time stamps for comparison because actual values don't matter for comparison + recvEvent.FirstTimestamp = expectedEvent.FirstTimestamp + recvEvent.LastTimestamp = expectedEvent.LastTimestamp + // Check that name has the right prefix. + if n, en := recvEvent.Name, expectedEvent.Name; !strings.HasPrefix(n, en) { + t.Errorf("%v - Name '%v' does not contain prefix '%v'", messagePrefix, n, en) + } + recvEvent.Name = expectedEvent.Name + if e, a := expectedEvent, &recvEvent; !reflect.DeepEqual(e, a) { + t.Errorf("%v - diff: %s", messagePrefix, diff.ObjectGoPrintDiff(e, a)) + } + recvEvent.FirstTimestamp = actualFirstTimestamp + recvEvent.LastTimestamp = actualLastTimestamp + return actualEvent, nil +} + +// TestEventAggregatorByReasonFunc ensures that two events are aggregated if they vary only by event.message +func TestEventAggregatorByReasonFunc(t *testing.T) { + event1 := makeEvent("end-of-world", "it was fun", makeObjectReference("Pod", "pod1", "other")) + event2 := makeEvent("end-of-world", "it was awful", makeObjectReference("Pod", "pod1", "other")) + event3 := makeEvent("nevermind", "it was a bug", makeObjectReference("Pod", "pod1", "other")) + + aggKey1, localKey1 := EventAggregatorByReasonFunc(&event1) + aggKey2, localKey2 := EventAggregatorByReasonFunc(&event2) + aggKey3, _ := EventAggregatorByReasonFunc(&event3) + + if aggKey1 != aggKey2 { + t.Errorf("Expected %v equal %v", aggKey1, aggKey2) + } + if localKey1 == localKey2 { + t.Errorf("Expected %v to not equal %v", aggKey1, aggKey3) + } + if aggKey1 == aggKey3 { + t.Errorf("Expected %v to not equal %v", aggKey1, aggKey3) + } +} + +// TestEventAggregatorByReasonMessageFunc validates the proper output for an aggregate message +func TestEventAggregatorByReasonMessageFunc(t *testing.T) { + expectedPrefix := "(combined from similar events): " + event1 := makeEvent("end-of-world", "it was fun", makeObjectReference("Pod", "pod1", "other")) + actual := EventAggregatorByReasonMessageFunc(&event1) + if !strings.HasPrefix(actual, expectedPrefix) { + t.Errorf("Expected %v to begin with prefix %v", actual, expectedPrefix) + } +} + +// TestEventCorrelator validates proper counting, aggregation of events +func TestEventCorrelator(t *testing.T) { + firstEvent := makeEvent("first", "i am first", makeObjectReference("Pod", "my-pod", "my-ns")) + duplicateEvent := makeEvent("duplicate", "me again", makeObjectReference("Pod", "my-pod", "my-ns")) + uniqueEvent := makeEvent("unique", "snowflake", makeObjectReference("Pod", "my-pod", "my-ns")) + similarEvent := makeEvent("similar", "similar message", makeObjectReference("Pod", "my-pod", "my-ns")) + similarEvent.InvolvedObject.FieldPath = "spec.containers{container1}" + aggregateEvent := makeEvent(similarEvent.Reason, EventAggregatorByReasonMessageFunc(&similarEvent), similarEvent.InvolvedObject) + similarButDifferentContainerEvent := similarEvent + similarButDifferentContainerEvent.InvolvedObject.FieldPath = "spec.containers{container2}" + scenario := map[string]struct { + previousEvents []v1.Event + newEvent v1.Event + expectedEvent v1.Event + intervalSeconds int + expectedSkip bool + }{ + "create-a-single-event": { + previousEvents: []v1.Event{}, + newEvent: firstEvent, + expectedEvent: setCount(firstEvent, 1), + intervalSeconds: 5, + }, + "the-same-event-should-just-count": { + previousEvents: makeEvents(1, duplicateEvent), + newEvent: duplicateEvent, + expectedEvent: setCount(duplicateEvent, 2), + intervalSeconds: 5, + }, + "the-same-event-should-just-count-even-if-more-than-aggregate": { + previousEvents: makeEvents(defaultAggregateMaxEvents, duplicateEvent), + newEvent: duplicateEvent, + expectedEvent: setCount(duplicateEvent, defaultAggregateMaxEvents+1), + intervalSeconds: 30, // larger interval induces aggregation but not spam. + }, + "the-same-event-is-spam-if-happens-too-frequently": { + previousEvents: makeEvents(defaultSpamBurst+1, duplicateEvent), + newEvent: duplicateEvent, + expectedSkip: true, + intervalSeconds: 1, + }, + "create-many-unique-events": { + previousEvents: makeUniqueEvents(30), + newEvent: uniqueEvent, + expectedEvent: setCount(uniqueEvent, 1), + intervalSeconds: 5, + }, + "similar-events-should-aggregate-event": { + previousEvents: makeSimilarEvents(defaultAggregateMaxEvents-1, similarEvent, similarEvent.Message), + newEvent: similarEvent, + expectedEvent: setCount(aggregateEvent, 1), + intervalSeconds: 5, + }, + "similar-events-many-times-should-count-the-aggregate": { + previousEvents: makeSimilarEvents(defaultAggregateMaxEvents, similarEvent, similarEvent.Message), + newEvent: similarEvent, + expectedEvent: setCount(aggregateEvent, 2), + intervalSeconds: 5, + }, + "events-from-different-containers-do-not-aggregate": { + previousEvents: makeEvents(1, similarButDifferentContainerEvent), + newEvent: similarEvent, + expectedEvent: setCount(similarEvent, 1), + intervalSeconds: 5, + }, + "similar-events-whose-interval-is-greater-than-aggregate-interval-do-not-aggregate": { + previousEvents: makeSimilarEvents(defaultAggregateMaxEvents-1, similarEvent, similarEvent.Message), + newEvent: similarEvent, + expectedEvent: setCount(similarEvent, 1), + intervalSeconds: defaultAggregateIntervalInSeconds, + }, + } + + for testScenario, testInput := range scenario { + eventInterval := time.Duration(testInput.intervalSeconds) * time.Second + clock := clock.IntervalClock{Time: time.Now(), Duration: eventInterval} + correlator := NewEventCorrelator(&clock) + for i := range testInput.previousEvents { + event := testInput.previousEvents[i] + now := metav1.NewTime(clock.Now()) + event.FirstTimestamp = now + event.LastTimestamp = now + result, err := correlator.EventCorrelate(&event) + if err != nil { + t.Errorf("scenario %v: unexpected error playing back prevEvents %v", testScenario, err) + } + // if we are skipping the event, we can avoid updating state + if !result.Skip { + correlator.UpdateState(result.Event) + } + } + + // update the input to current clock value + now := metav1.NewTime(clock.Now()) + testInput.newEvent.FirstTimestamp = now + testInput.newEvent.LastTimestamp = now + result, err := correlator.EventCorrelate(&testInput.newEvent) + if err != nil { + t.Errorf("scenario %v: unexpected error correlating input event %v", testScenario, err) + } + + // verify we did not get skip from filter function unexpectedly... + if result.Skip != testInput.expectedSkip { + t.Errorf("scenario %v: expected skip %v, but got %v", testScenario, testInput.expectedSkip, result.Skip) + continue + } + + // we wanted to actually skip, so no event is needed to validate + if testInput.expectedSkip { + continue + } + + // validate event + _, err = validateEvent(testScenario, result.Event, &testInput.expectedEvent, t) + if err != nil { + t.Errorf("scenario %v: unexpected error validating result %v", testScenario, err) + } + } +} diff --git a/vendor/k8s.io/client-go/tools/reference/BUILD b/vendor/k8s.io/client-go/tools/reference/BUILD index f23e51dd..a16e7598 100644 --- a/vendor/k8s.io/client-go/tools/reference/BUILD +++ b/vendor/k8s.io/client-go/tools/reference/BUILD @@ -9,12 +9,13 @@ load( go_library( name = "go_default_library", srcs = ["ref.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/reference", importpath = "k8s.io/client-go/tools/reference", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", ], ) @@ -36,8 +37,8 @@ go_test( srcs = ["ref_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/tools/reference/ref_test.go b/vendor/k8s.io/client-go/tools/reference/ref_test.go new file mode 100644 index 00000000..b0cf06a9 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/reference/ref_test.go @@ -0,0 +1,72 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 reference + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +type TestRuntimeObj struct { + metav1.TypeMeta + metav1.ObjectMeta +} + +func (o *TestRuntimeObj) DeepCopyObject() runtime.Object { + panic("die") +} + +func TestGetReferenceRefVersion(t *testing.T) { + tests := []struct { + name string + input *TestRuntimeObj + expectedRefVersion string + }{ + { + name: "api from selflink", + input: &TestRuntimeObj{ + ObjectMeta: metav1.ObjectMeta{SelfLink: "/api/v1/namespaces"}, + }, + expectedRefVersion: "v1", + }, + { + name: "foo.group/v3 from selflink", + input: &TestRuntimeObj{ + ObjectMeta: metav1.ObjectMeta{SelfLink: "/apis/foo.group/v3/namespaces"}, + }, + expectedRefVersion: "foo.group/v3", + }, + } + + scheme := runtime.NewScheme() + scheme.AddKnownTypes(schema.GroupVersion{Group: "this", Version: "is ignored"}, &TestRuntimeObj{}) + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ref, err := GetReference(scheme, test.input) + if err != nil { + t.Fatal(err) + } + if test.expectedRefVersion != ref.APIVersion { + t.Errorf("expected %q, got %q", test.expectedRefVersion, ref.APIVersion) + } + }) + } +} diff --git a/vendor/k8s.io/client-go/tools/remotecommand/BUILD b/vendor/k8s.io/client-go/tools/remotecommand/BUILD index b30c122c..9e0aac98 100644 --- a/vendor/k8s.io/client-go/tools/remotecommand/BUILD +++ b/vendor/k8s.io/client-go/tools/remotecommand/BUILD @@ -14,9 +14,9 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) @@ -32,17 +32,18 @@ go_library( "v3.go", "v4.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/remotecommand", importpath = "k8s.io/client-go/tools/remotecommand", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/transport/spdy:go_default_library", + "//staging/src/k8s.io/client-go/util/exec:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/transport/spdy:go_default_library", - "//vendor/k8s.io/client-go/util/exec:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/tools/remotecommand/remotecommand.go b/vendor/k8s.io/client-go/tools/remotecommand/remotecommand.go index 6b69f366..d2b29861 100644 --- a/vendor/k8s.io/client-go/tools/remotecommand/remotecommand.go +++ b/vendor/k8s.io/client-go/tools/remotecommand/remotecommand.go @@ -30,8 +30,8 @@ import ( spdy "k8s.io/client-go/transport/spdy" ) -// StreamOptions holds information pertaining to the current streaming session: supported stream -// protocols, input/output streams, if the client is requesting a TTY, and a terminal size queue to +// StreamOptions holds information pertaining to the current streaming session: +// input/output streams, if the client is requesting a TTY, and a terminal size queue to // support terminal resizing. type StreamOptions struct { Stdin io.Reader diff --git a/vendor/k8s.io/client-go/tools/remotecommand/v2_test.go b/vendor/k8s.io/client-go/tools/remotecommand/v2_test.go new file mode 100644 index 00000000..e303f57a --- /dev/null +++ b/vendor/k8s.io/client-go/tools/remotecommand/v2_test.go @@ -0,0 +1,228 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 remotecommand + +import ( + "errors" + "io" + "net/http" + "strings" + "testing" + "time" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/httpstream" + "k8s.io/apimachinery/pkg/util/wait" +) + +type fakeReader struct { + err error +} + +func (r *fakeReader) Read([]byte) (int, error) { return 0, r.err } + +type fakeWriter struct{} + +func (*fakeWriter) Write([]byte) (int, error) { return 0, nil } + +type fakeStreamCreator struct { + created map[string]bool + errors map[string]error +} + +var _ streamCreator = &fakeStreamCreator{} + +func (f *fakeStreamCreator) CreateStream(headers http.Header) (httpstream.Stream, error) { + streamType := headers.Get(v1.StreamType) + f.created[streamType] = true + return nil, f.errors[streamType] +} + +func TestV2CreateStreams(t *testing.T) { + tests := []struct { + name string + stdin bool + stdinError error + stdout bool + stdoutError error + stderr bool + stderrError error + errorError error + tty bool + expectError bool + }{ + { + name: "stdin error", + stdin: true, + stdinError: errors.New("stdin error"), + expectError: true, + }, + { + name: "stdout error", + stdout: true, + stdoutError: errors.New("stdout error"), + expectError: true, + }, + { + name: "stderr error", + stderr: true, + stderrError: errors.New("stderr error"), + expectError: true, + }, + { + name: "error stream error", + stdin: true, + stdout: true, + stderr: true, + errorError: errors.New("error stream error"), + expectError: true, + }, + { + name: "no errors", + stdin: true, + stdout: true, + stderr: true, + expectError: false, + }, + { + name: "no errors, stderr & tty set, don't expect stderr", + stdin: true, + stdout: true, + stderr: true, + tty: true, + expectError: false, + }, + } + for _, test := range tests { + conn := &fakeStreamCreator{ + created: make(map[string]bool), + errors: map[string]error{ + v1.StreamTypeStdin: test.stdinError, + v1.StreamTypeStdout: test.stdoutError, + v1.StreamTypeStderr: test.stderrError, + v1.StreamTypeError: test.errorError, + }, + } + + opts := StreamOptions{Tty: test.tty} + if test.stdin { + opts.Stdin = &fakeReader{} + } + if test.stdout { + opts.Stdout = &fakeWriter{} + } + if test.stderr { + opts.Stderr = &fakeWriter{} + } + + h := newStreamProtocolV2(opts).(*streamProtocolV2) + err := h.createStreams(conn) + + if test.expectError { + if err == nil { + t.Errorf("%s: expected error", test.name) + continue + } + if e, a := test.stdinError, err; test.stdinError != nil && e != a { + t.Errorf("%s: expected %v, got %v", test.name, e, a) + } + if e, a := test.stdoutError, err; test.stdoutError != nil && e != a { + t.Errorf("%s: expected %v, got %v", test.name, e, a) + } + if e, a := test.stderrError, err; test.stderrError != nil && e != a { + t.Errorf("%s: expected %v, got %v", test.name, e, a) + } + if e, a := test.errorError, err; test.errorError != nil && e != a { + t.Errorf("%s: expected %v, got %v", test.name, e, a) + } + continue + } + + if !test.expectError && err != nil { + t.Errorf("%s: unexpected error: %v", test.name, err) + continue + } + + if test.stdin && !conn.created[v1.StreamTypeStdin] { + t.Errorf("%s: expected stdin stream", test.name) + } + if test.stdout && !conn.created[v1.StreamTypeStdout] { + t.Errorf("%s: expected stdout stream", test.name) + } + if test.stderr { + if test.tty && conn.created[v1.StreamTypeStderr] { + t.Errorf("%s: unexpected stderr stream because tty is set", test.name) + } else if !test.tty && !conn.created[v1.StreamTypeStderr] { + t.Errorf("%s: expected stderr stream", test.name) + } + } + if !conn.created[v1.StreamTypeError] { + t.Errorf("%s: expected error stream", test.name) + } + + } +} + +func TestV2ErrorStreamReading(t *testing.T) { + tests := []struct { + name string + stream io.Reader + expectedError error + }{ + { + name: "error reading from stream", + stream: &fakeReader{errors.New("foo")}, + expectedError: errors.New("error reading from error stream: foo"), + }, + { + name: "stream returns an error", + stream: strings.NewReader("some error"), + expectedError: errors.New("error executing remote command: some error"), + }, + } + + for _, test := range tests { + h := newStreamProtocolV2(StreamOptions{}).(*streamProtocolV2) + h.errorStream = test.stream + + ch := watchErrorStream(h.errorStream, &errorDecoderV2{}) + if ch == nil { + t.Fatalf("%s: unexpected nil channel", test.name) + } + + var err error + select { + case err = <-ch: + case <-time.After(wait.ForeverTestTimeout): + t.Fatalf("%s: timed out", test.name) + } + + if test.expectedError != nil { + if err == nil { + t.Errorf("%s: expected an error", test.name) + } else if e, a := test.expectedError, err; e.Error() != a.Error() { + t.Errorf("%s: expected %q, got %q", test.name, e, a) + } + continue + } + + if test.expectedError == nil && err != nil { + t.Errorf("%s: unexpected error: %v", test.name, err) + continue + } + } +} diff --git a/vendor/k8s.io/client-go/tools/remotecommand/v4_test.go b/vendor/k8s.io/client-go/tools/remotecommand/v4_test.go new file mode 100644 index 00000000..b8674918 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/remotecommand/v4_test.go @@ -0,0 +1,71 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 remotecommand + +import ( + "fmt" + "testing" +) + +func TestV4ErrorDecoder(t *testing.T) { + dec := errorDecoderV4{} + + type Test struct { + message string + err string + } + + for _, test := range []Test{ + { + message: "{}", + err: "error stream protocol error: unknown error", + }, + { + message: "{", + err: "error stream protocol error: unexpected end of JSON input in \"{\"", + }, + { + message: `{"status": "Success" }`, + err: "", + }, + { + message: `{"status": "Failure", "message": "foobar" }`, + err: "foobar", + }, + { + message: `{"status": "Failure", "message": "foobar", "reason": "NonZeroExitCode", "details": {"causes": [{"reason": "foo"}] } }`, + err: "error stream protocol error: no ExitCode cause given", + }, + { + message: `{"status": "Failure", "message": "foobar", "reason": "NonZeroExitCode", "details": {"causes": [{"reason": "ExitCode"}] } }`, + err: "error stream protocol error: invalid exit code value \"\"", + }, + { + message: `{"status": "Failure", "message": "foobar", "reason": "NonZeroExitCode", "details": {"causes": [{"reason": "ExitCode", "message": "42"}] } }`, + err: "command terminated with exit code 42", + }, + } { + err := dec.decode([]byte(test.message)) + want := test.err + if want == "" { + want = "" + } + if got := fmt.Sprintf("%v", err); got != want { + t.Errorf("wrong error for message %q: want=%q, got=%q", test.message, want, got) + } + } +} diff --git a/vendor/k8s.io/client-go/tools/watch/BUILD b/vendor/k8s.io/client-go/tools/watch/BUILD new file mode 100644 index 00000000..d1994ebb --- /dev/null +++ b/vendor/k8s.io/client-go/tools/watch/BUILD @@ -0,0 +1,57 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "informerwatcher.go", + "until.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/watch", + importpath = "k8s.io/client-go/tools/watch", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "informerwatcher_test.go", + "until_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/testing:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/client-go/tools/watch/informerwatcher.go b/vendor/k8s.io/client-go/tools/watch/informerwatcher.go new file mode 100644 index 00000000..35a34694 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/watch/informerwatcher.go @@ -0,0 +1,114 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 watch + +import ( + "sync" + "sync/atomic" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/tools/cache" +) + +func newTicketer() *ticketer { + return &ticketer{ + cond: sync.NewCond(&sync.Mutex{}), + } +} + +type ticketer struct { + counter uint64 + + cond *sync.Cond + current uint64 +} + +func (t *ticketer) GetTicket() uint64 { + // -1 to start from 0 + return atomic.AddUint64(&t.counter, 1) - 1 +} + +func (t *ticketer) WaitForTicket(ticket uint64, f func()) { + t.cond.L.Lock() + defer t.cond.L.Unlock() + for ticket != t.current { + t.cond.Wait() + } + + f() + + t.current++ + t.cond.Broadcast() +} + +// NewIndexerInformerWatcher will create an IndexerInformer and wrap it into watch.Interface +// so you can use it anywhere where you'd have used a regular Watcher returned from Watch method. +func NewIndexerInformerWatcher(lw cache.ListerWatcher, objType runtime.Object) (cache.Indexer, cache.Controller, watch.Interface) { + ch := make(chan watch.Event) + w := watch.NewProxyWatcher(ch) + t := newTicketer() + + indexer, informer := cache.NewIndexerInformer(lw, objType, 0, cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + go t.WaitForTicket(t.GetTicket(), func() { + select { + case ch <- watch.Event{ + Type: watch.Added, + Object: obj.(runtime.Object), + }: + case <-w.StopChan(): + } + }) + }, + UpdateFunc: func(old, new interface{}) { + go t.WaitForTicket(t.GetTicket(), func() { + select { + case ch <- watch.Event{ + Type: watch.Modified, + Object: new.(runtime.Object), + }: + case <-w.StopChan(): + } + }) + }, + DeleteFunc: func(obj interface{}) { + go t.WaitForTicket(t.GetTicket(), func() { + staleObj, stale := obj.(cache.DeletedFinalStateUnknown) + if stale { + // We have no means of passing the additional information down using watch API based on watch.Event + // but the caller can filter such objects by checking if metadata.deletionTimestamp is set + obj = staleObj + } + + select { + case ch <- watch.Event{ + Type: watch.Deleted, + Object: obj.(runtime.Object), + }: + case <-w.StopChan(): + } + }) + }, + }, cache.Indexers{}) + + go func() { + informer.Run(w.StopChan()) + }() + + return indexer, informer, w +} diff --git a/vendor/k8s.io/client-go/tools/watch/informerwatcher_test.go b/vendor/k8s.io/client-go/tools/watch/informerwatcher_test.go new file mode 100644 index 00000000..e94b4d25 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/watch/informerwatcher_test.go @@ -0,0 +1,236 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 watch + +import ( + "math/rand" + "reflect" + "sort" + "testing" + "time" + + "github.com/davecgh/go-spew/spew" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/apimachinery/pkg/watch" + fakeclientset "k8s.io/client-go/kubernetes/fake" + testcore "k8s.io/client-go/testing" + "k8s.io/client-go/tools/cache" +) + +type byEventTypeAndName []watch.Event + +func (a byEventTypeAndName) Len() int { return len(a) } +func (a byEventTypeAndName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byEventTypeAndName) Less(i, j int) bool { + if a[i].Type < a[j].Type { + return true + } + + if a[i].Type > a[j].Type { + return false + } + + return a[i].Object.(*corev1.Secret).Name < a[j].Object.(*corev1.Secret).Name +} + +func TestTicketer(t *testing.T) { + tg := newTicketer() + + const numTickets = 100 // current golang limit for race detector is 8192 simultaneously alive goroutines + var tickets []uint64 + for i := 0; i < numTickets; i++ { + ticket := tg.GetTicket() + tickets = append(tickets, ticket) + + exp, got := uint64(i), ticket + if got != exp { + t.Fatalf("expected ticket %d, got %d", exp, got) + } + } + + // shuffle tickets + rand.Shuffle(len(tickets), func(i, j int) { + tickets[i], tickets[j] = tickets[j], tickets[i] + }) + + res := make(chan uint64, len(tickets)) + for _, ticket := range tickets { + go func(ticket uint64) { + time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond) + tg.WaitForTicket(ticket, func() { + res <- ticket + }) + }(ticket) + } + + for i := 0; i < numTickets; i++ { + exp, got := uint64(i), <-res + if got != exp { + t.Fatalf("expected ticket %d, got %d", exp, got) + } + } +} + +func TestNewInformerWatcher(t *testing.T) { + // Make sure there are no 2 same types of events on a secret with the same name or that might be flaky. + tt := []struct { + name string + objects []runtime.Object + events []watch.Event + }{ + { + name: "basic test", + objects: []runtime.Object{ + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-1", + }, + StringData: map[string]string{ + "foo-1": "initial", + }, + }, + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-2", + }, + StringData: map[string]string{ + "foo-2": "initial", + }, + }, + &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-3", + }, + StringData: map[string]string{ + "foo-3": "initial", + }, + }, + }, + events: []watch.Event{ + { + Type: watch.Added, + Object: &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-4", + }, + StringData: map[string]string{ + "foo-4": "initial", + }, + }, + }, + { + Type: watch.Modified, + Object: &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-2", + }, + StringData: map[string]string{ + "foo-2": "new", + }, + }, + }, + { + Type: watch.Deleted, + Object: &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-3", + }, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + var expected []watch.Event + for _, o := range tc.objects { + expected = append(expected, watch.Event{ + Type: watch.Added, + Object: o.DeepCopyObject(), + }) + } + for _, e := range tc.events { + expected = append(expected, *e.DeepCopy()) + } + + fake := fakeclientset.NewSimpleClientset(tc.objects...) + fakeWatch := watch.NewFakeWithChanSize(len(tc.events), false) + fake.PrependWatchReactor("secrets", testcore.DefaultWatchReactor(fakeWatch, nil)) + + for _, e := range tc.events { + fakeWatch.Action(e.Type, e.Object) + } + + lw := &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return fake.Core().Secrets("").List(options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return fake.Core().Secrets("").Watch(options) + }, + } + _, _, w := NewIndexerInformerWatcher(lw, &corev1.Secret{}) + + var result []watch.Event + loop: + for { + var event watch.Event + var ok bool + select { + case event, ok = <-w.ResultChan(): + if !ok { + t.Errorf("Failed to read event: channel is already closed!") + return + } + + result = append(result, *event.DeepCopy()) + case <-time.After(time.Second * 1): + // All the events are buffered -> this means we are done + // Also the one sec will make sure that we would detect RetryWatcher's incorrect behaviour after last event + break loop + } + } + + // Informers don't guarantee event order so we need to sort these arrays to compare them + sort.Sort(byEventTypeAndName(expected)) + sort.Sort(byEventTypeAndName(result)) + + if !reflect.DeepEqual(expected, result) { + t.Error(spew.Errorf("\nexpected: %#v,\ngot: %#v,\ndiff: %s", expected, result, diff.ObjectReflectDiff(expected, result))) + return + } + + // Fill in some data to test watch closing while there are some events to be read + for _, e := range tc.events { + fakeWatch.Action(e.Type, e.Object) + } + + // Stop before reading all the data to make sure the informer can deal with closed channel + w.Stop() + + // Wait a bit to see if the informer won't panic + // TODO: Try to figure out a more reliable mechanism than time.Sleep (https://github.com/kubernetes/kubernetes/pull/50102/files#r184716591) + time.Sleep(1 * time.Second) + }) + } + +} diff --git a/vendor/k8s.io/client-go/tools/watch/until.go b/vendor/k8s.io/client-go/tools/watch/until.go new file mode 100644 index 00000000..93357884 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/watch/until.go @@ -0,0 +1,225 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 watch + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/golang/glog" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/tools/cache" +) + +// PreconditionFunc returns true if the condition has been reached, false if it has not been reached yet, +// or an error if the condition failed or detected an error state. +type PreconditionFunc func(store cache.Store) (bool, error) + +// ConditionFunc returns true if the condition has been reached, false if it has not been reached yet, +// or an error if the condition cannot be checked and should terminate. In general, it is better to define +// level driven conditions over edge driven conditions (pod has ready=true, vs pod modified and ready changed +// from false to true). +type ConditionFunc func(event watch.Event) (bool, error) + +// ErrWatchClosed is returned when the watch channel is closed before timeout in UntilWithoutRetry. +var ErrWatchClosed = errors.New("watch closed before UntilWithoutRetry timeout") + +// UntilWithoutRetry reads items from the watch until each provided condition succeeds, and then returns the last watch +// encountered. The first condition that returns an error terminates the watch (and the event is also returned). +// If no event has been received, the returned event will be nil. +// Conditions are satisfied sequentially so as to provide a useful primitive for higher level composition. +// Waits until context deadline or until context is canceled. +// +// Warning: Unless you have a very specific use case (probably a special Watcher) don't use this function!!! +// Warning: This will fail e.g. on API timeouts and/or 'too old resource version' error. +// Warning: You are most probably looking for a function *Until* or *UntilWithSync* below, +// Warning: solving such issues. +// TODO: Consider making this function private to prevent misuse when the other occurrences in our codebase are gone. +func UntilWithoutRetry(ctx context.Context, watcher watch.Interface, conditions ...ConditionFunc) (*watch.Event, error) { + ch := watcher.ResultChan() + defer watcher.Stop() + var lastEvent *watch.Event + for _, condition := range conditions { + // check the next condition against the previous event and short circuit waiting for the next watch + if lastEvent != nil { + done, err := condition(*lastEvent) + if err != nil { + return lastEvent, err + } + if done { + continue + } + } + ConditionSucceeded: + for { + select { + case event, ok := <-ch: + if !ok { + return lastEvent, ErrWatchClosed + } + lastEvent = &event + + done, err := condition(event) + if err != nil { + return lastEvent, err + } + if done { + break ConditionSucceeded + } + + case <-ctx.Done(): + return lastEvent, wait.ErrWaitTimeout + } + } + } + return lastEvent, nil +} + +// UntilWithSync creates an informer from lw, optionally checks precondition when the store is synced, +// and watches the output until each provided condition succeeds, in a way that is identical +// to function UntilWithoutRetry. (See above.) +// UntilWithSync can deal with all errors like API timeout, lost connections and 'Resource version too old'. +// It is the only function that can recover from 'Resource version too old', Until and UntilWithoutRetry will +// just fail in that case. On the other hand it can't provide you with guarantees as strong as using simple +// Watch method with Until. It can skip some intermediate events in case of watch function failing but it will +// re-list to recover and you always get an event, if there has been a change, after recovery. +// Also with the current implementation based on DeltaFIFO, order of the events you receive is guaranteed only for +// particular object, not between more of them even it's the same resource. +// The most frequent usage would be a command that needs to watch the "state of the world" and should't fail, like: +// waiting for object reaching a state, "small" controllers, ... +func UntilWithSync(ctx context.Context, lw cache.ListerWatcher, objType runtime.Object, precondition PreconditionFunc, conditions ...ConditionFunc) (*watch.Event, error) { + indexer, informer, watcher := NewIndexerInformerWatcher(lw, objType) + // Proxy watcher can be stopped multiple times so it's fine to use defer here to cover alternative branches and + // let UntilWithoutRetry to stop it + defer watcher.Stop() + + if precondition != nil { + if !cache.WaitForCacheSync(ctx.Done(), informer.HasSynced) { + return nil, fmt.Errorf("UntilWithSync: unable to sync caches: %v", ctx.Err()) + } + + done, err := precondition(indexer) + if err != nil { + return nil, err + } + + if done { + return nil, nil + } + } + + return UntilWithoutRetry(ctx, watcher, conditions...) +} + +// ContextWithOptionalTimeout wraps context.WithTimeout and handles infinite timeouts expressed as 0 duration. +func ContextWithOptionalTimeout(parent context.Context, timeout time.Duration) (context.Context, context.CancelFunc) { + if timeout < 0 { + // This should be handled in validation + glog.Errorf("Timeout for context shall not be negative!") + timeout = 0 + } + + if timeout == 0 { + return context.WithCancel(parent) + } + + return context.WithTimeout(parent, timeout) +} + +// ListWatchUntil checks the provided conditions against the items returned by the list watcher, returning wait.ErrWaitTimeout +// if timeout is exceeded without all conditions returning true, or an error if an error occurs. +// TODO: check for watch expired error and retry watch from latest point? Same issue exists for Until. +// TODO: remove when no longer used +// +// Deprecated: Use UntilWithSync instead. +func ListWatchUntil(timeout time.Duration, lw cache.ListerWatcher, conditions ...ConditionFunc) (*watch.Event, error) { + if len(conditions) == 0 { + return nil, nil + } + + list, err := lw.List(metav1.ListOptions{}) + if err != nil { + return nil, err + } + initialItems, err := meta.ExtractList(list) + if err != nil { + return nil, err + } + + // use the initial items as simulated "adds" + var lastEvent *watch.Event + currIndex := 0 + passedConditions := 0 + for _, condition := range conditions { + // check the next condition against the previous event and short circuit waiting for the next watch + if lastEvent != nil { + done, err := condition(*lastEvent) + if err != nil { + return lastEvent, err + } + if done { + passedConditions = passedConditions + 1 + continue + } + } + + ConditionSucceeded: + for currIndex < len(initialItems) { + lastEvent = &watch.Event{Type: watch.Added, Object: initialItems[currIndex]} + currIndex++ + + done, err := condition(*lastEvent) + if err != nil { + return lastEvent, err + } + if done { + passedConditions = passedConditions + 1 + break ConditionSucceeded + } + } + } + if passedConditions == len(conditions) { + return lastEvent, nil + } + remainingConditions := conditions[passedConditions:] + + metaObj, err := meta.ListAccessor(list) + if err != nil { + return nil, err + } + currResourceVersion := metaObj.GetResourceVersion() + + watchInterface, err := lw.Watch(metav1.ListOptions{ResourceVersion: currResourceVersion}) + if err != nil { + return nil, err + } + + ctx, cancel := ContextWithOptionalTimeout(context.Background(), timeout) + defer cancel() + evt, err := UntilWithoutRetry(ctx, watchInterface, remainingConditions...) + if err == ErrWatchClosed { + // present a consistent error interface to callers + err = wait.ErrWaitTimeout + } + return evt, err +} diff --git a/vendor/k8s.io/client-go/tools/watch/until_test.go b/vendor/k8s.io/client-go/tools/watch/until_test.go new file mode 100644 index 00000000..dd055946 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/watch/until_test.go @@ -0,0 +1,303 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 watch + +import ( + "context" + "errors" + "reflect" + "strings" + "testing" + "time" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + fakeclient "k8s.io/client-go/kubernetes/fake" + "k8s.io/client-go/tools/cache" +) + +type fakePod struct { + name string +} + +func (obj *fakePod) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind } +func (obj *fakePod) DeepCopyObject() runtime.Object { panic("DeepCopyObject not supported by fakePod") } + +func TestUntil(t *testing.T) { + fw := watch.NewFake() + go func() { + var obj *fakePod + fw.Add(obj) + fw.Modify(obj) + }() + conditions := []ConditionFunc{ + func(event watch.Event) (bool, error) { return event.Type == watch.Added, nil }, + func(event watch.Event) (bool, error) { return event.Type == watch.Modified, nil }, + } + + ctx, _ := context.WithTimeout(context.Background(), time.Minute) + lastEvent, err := UntilWithoutRetry(ctx, fw, conditions...) + if err != nil { + t.Fatalf("expected nil error, got %#v", err) + } + if lastEvent == nil { + t.Fatal("expected an event") + } + if lastEvent.Type != watch.Modified { + t.Fatalf("expected MODIFIED event type, got %v", lastEvent.Type) + } + if got, isPod := lastEvent.Object.(*fakePod); !isPod { + t.Fatalf("expected a pod event, got %#v", got) + } +} + +func TestUntilMultipleConditions(t *testing.T) { + fw := watch.NewFake() + go func() { + var obj *fakePod + fw.Add(obj) + }() + conditions := []ConditionFunc{ + func(event watch.Event) (bool, error) { return event.Type == watch.Added, nil }, + func(event watch.Event) (bool, error) { return event.Type == watch.Added, nil }, + } + + ctx, _ := context.WithTimeout(context.Background(), time.Minute) + lastEvent, err := UntilWithoutRetry(ctx, fw, conditions...) + if err != nil { + t.Fatalf("expected nil error, got %#v", err) + } + if lastEvent == nil { + t.Fatal("expected an event") + } + if lastEvent.Type != watch.Added { + t.Fatalf("expected MODIFIED event type, got %v", lastEvent.Type) + } + if got, isPod := lastEvent.Object.(*fakePod); !isPod { + t.Fatalf("expected a pod event, got %#v", got) + } +} + +func TestUntilMultipleConditionsFail(t *testing.T) { + fw := watch.NewFake() + go func() { + var obj *fakePod + fw.Add(obj) + }() + conditions := []ConditionFunc{ + func(event watch.Event) (bool, error) { return event.Type == watch.Added, nil }, + func(event watch.Event) (bool, error) { return event.Type == watch.Added, nil }, + func(event watch.Event) (bool, error) { return event.Type == watch.Deleted, nil }, + } + + ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) + lastEvent, err := UntilWithoutRetry(ctx, fw, conditions...) + if err != wait.ErrWaitTimeout { + t.Fatalf("expected ErrWaitTimeout error, got %#v", err) + } + if lastEvent == nil { + t.Fatal("expected an event") + } + if lastEvent.Type != watch.Added { + t.Fatalf("expected ADDED event type, got %v", lastEvent.Type) + } + if got, isPod := lastEvent.Object.(*fakePod); !isPod { + t.Fatalf("expected a pod event, got %#v", got) + } +} + +func TestUntilTimeout(t *testing.T) { + fw := watch.NewFake() + go func() { + var obj *fakePod + fw.Add(obj) + fw.Modify(obj) + }() + conditions := []ConditionFunc{ + func(event watch.Event) (bool, error) { + return event.Type == watch.Added, nil + }, + func(event watch.Event) (bool, error) { + return event.Type == watch.Modified, nil + }, + } + + lastEvent, err := UntilWithoutRetry(context.Background(), fw, conditions...) + if err != nil { + t.Fatalf("expected nil error, got %#v", err) + } + if lastEvent == nil { + t.Fatal("expected an event") + } + if lastEvent.Type != watch.Modified { + t.Fatalf("expected MODIFIED event type, got %v", lastEvent.Type) + } + if got, isPod := lastEvent.Object.(*fakePod); !isPod { + t.Fatalf("expected a pod event, got %#v", got) + } +} + +func TestUntilErrorCondition(t *testing.T) { + fw := watch.NewFake() + go func() { + var obj *fakePod + fw.Add(obj) + }() + expected := "something bad" + conditions := []ConditionFunc{ + func(event watch.Event) (bool, error) { return event.Type == watch.Added, nil }, + func(event watch.Event) (bool, error) { return false, errors.New(expected) }, + } + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + _, err := UntilWithoutRetry(ctx, fw, conditions...) + if err == nil { + t.Fatal("expected an error") + } + if !strings.Contains(err.Error(), expected) { + t.Fatalf("expected %q in error string, got %q", expected, err.Error()) + } +} + +func TestUntilWithSync(t *testing.T) { + // FIXME: test preconditions + tt := []struct { + name string + lw *cache.ListWatch + preconditionFunc PreconditionFunc + conditionFunc ConditionFunc + expectedErr error + expectedEvent *watch.Event + }{ + { + name: "doesn't wait for sync with no precondition", + lw: &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + select {} + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + select {} + }, + }, + preconditionFunc: nil, + conditionFunc: func(e watch.Event) (bool, error) { + return true, nil + }, + expectedErr: errors.New("timed out waiting for the condition"), + expectedEvent: nil, + }, + { + name: "waits indefinitely with precondition if it can't sync", + lw: &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + select {} + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + select {} + }, + }, + preconditionFunc: func(store cache.Store) (bool, error) { + return true, nil + }, + conditionFunc: func(e watch.Event) (bool, error) { + return true, nil + }, + expectedErr: errors.New("UntilWithSync: unable to sync caches: context deadline exceeded"), + expectedEvent: nil, + }, + { + name: "precondition can stop the loop", + lw: func() *cache.ListWatch { + fakeclient := fakeclient.NewSimpleClientset(&corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "first"}}) + + return &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return fakeclient.CoreV1().Secrets("").List(options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return fakeclient.CoreV1().Secrets("").Watch(options) + }, + } + }(), + preconditionFunc: func(store cache.Store) (bool, error) { + _, exists, err := store.Get(&metav1.ObjectMeta{Namespace: "", Name: "first"}) + if err != nil { + return true, err + } + if exists { + return true, nil + } + return false, nil + }, + conditionFunc: func(e watch.Event) (bool, error) { + return true, errors.New("should never reach this") + }, + expectedErr: nil, + expectedEvent: nil, + }, + { + name: "precondition lets it proceed to regular condition", + lw: func() *cache.ListWatch { + fakeclient := fakeclient.NewSimpleClientset(&corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "first"}}) + + return &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return fakeclient.CoreV1().Secrets("").List(options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + return fakeclient.CoreV1().Secrets("").Watch(options) + }, + } + }(), + preconditionFunc: func(store cache.Store) (bool, error) { + return false, nil + }, + conditionFunc: func(e watch.Event) (bool, error) { + if e.Type == watch.Added { + return true, nil + } + panic("no other events are expected") + }, + expectedErr: nil, + expectedEvent: &watch.Event{Type: watch.Added, Object: &corev1.Secret{ObjectMeta: metav1.ObjectMeta{Name: "first"}}}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Informer waits for caches to sync by polling in 100ms intervals, + // timeout needs to be reasonably higher + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + + event, err := UntilWithSync(ctx, tc.lw, &corev1.Secret{}, tc.preconditionFunc, tc.conditionFunc) + + if !reflect.DeepEqual(err, tc.expectedErr) { + t.Errorf("expected error %#v, got %#v", tc.expectedErr, err) + } + + if !reflect.DeepEqual(event, tc.expectedEvent) { + t.Errorf("expected event %#v, got %#v", tc.expectedEvent, event) + } + }) + } +} diff --git a/vendor/k8s.io/client-go/transport/BUILD b/vendor/k8s.io/client-go/transport/BUILD index 71494544..05b0e604 100644 --- a/vendor/k8s.io/client-go/transport/BUILD +++ b/vendor/k8s.io/client-go/transport/BUILD @@ -24,10 +24,11 @@ go_library( "round_trippers.go", "transport.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/transport", importpath = "k8s.io/client-go/transport", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/transport/cache_test.go b/vendor/k8s.io/client-go/transport/cache_test.go new file mode 100644 index 00000000..9b740cde --- /dev/null +++ b/vendor/k8s.io/client-go/transport/cache_test.go @@ -0,0 +1,157 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 transport + +import ( + "context" + "crypto/tls" + "net" + "net/http" + "testing" +) + +func TestTLSConfigKey(t *testing.T) { + // Make sure config fields that don't affect the tls config don't affect the cache key + identicalConfigurations := map[string]*Config{ + "empty": {}, + "basic": {Username: "bob", Password: "password"}, + "bearer": {BearerToken: "token"}, + "user agent": {UserAgent: "useragent"}, + "transport": {Transport: http.DefaultTransport}, + "wrap transport": {WrapTransport: func(http.RoundTripper) http.RoundTripper { return nil }}, + } + for nameA, valueA := range identicalConfigurations { + for nameB, valueB := range identicalConfigurations { + keyA, err := tlsConfigKey(valueA) + if err != nil { + t.Errorf("Unexpected error for %q: %v", nameA, err) + continue + } + keyB, err := tlsConfigKey(valueB) + if err != nil { + t.Errorf("Unexpected error for %q: %v", nameB, err) + continue + } + if keyA != keyB { + t.Errorf("Expected identical cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB) + continue + } + } + } + + // Make sure config fields that affect the tls config affect the cache key + dialer := net.Dialer{} + getCert := func() (*tls.Certificate, error) { return nil, nil } + uniqueConfigurations := map[string]*Config{ + "no tls": {}, + "dialer": {Dial: dialer.DialContext}, + "dialer2": {Dial: func(ctx context.Context, network, address string) (net.Conn, error) { return nil, nil }}, + "insecure": {TLS: TLSConfig{Insecure: true}}, + "cadata 1": {TLS: TLSConfig{CAData: []byte{1}}}, + "cadata 2": {TLS: TLSConfig{CAData: []byte{2}}}, + "cert 1, key 1": { + TLS: TLSConfig{ + CertData: []byte{1}, + KeyData: []byte{1}, + }, + }, + "cert 1, key 1, servername 1": { + TLS: TLSConfig{ + CertData: []byte{1}, + KeyData: []byte{1}, + ServerName: "1", + }, + }, + "cert 1, key 1, servername 2": { + TLS: TLSConfig{ + CertData: []byte{1}, + KeyData: []byte{1}, + ServerName: "2", + }, + }, + "cert 1, key 2": { + TLS: TLSConfig{ + CertData: []byte{1}, + KeyData: []byte{2}, + }, + }, + "cert 2, key 1": { + TLS: TLSConfig{ + CertData: []byte{2}, + KeyData: []byte{1}, + }, + }, + "cert 2, key 2": { + TLS: TLSConfig{ + CertData: []byte{2}, + KeyData: []byte{2}, + }, + }, + "cadata 1, cert 1, key 1": { + TLS: TLSConfig{ + CAData: []byte{1}, + CertData: []byte{1}, + KeyData: []byte{1}, + }, + }, + "getCert1": { + TLS: TLSConfig{ + KeyData: []byte{1}, + GetCert: getCert, + }, + }, + "getCert2": { + TLS: TLSConfig{ + KeyData: []byte{1}, + GetCert: func() (*tls.Certificate, error) { return nil, nil }, + }, + }, + "getCert1, key 2": { + TLS: TLSConfig{ + KeyData: []byte{2}, + GetCert: getCert, + }, + }, + } + for nameA, valueA := range uniqueConfigurations { + for nameB, valueB := range uniqueConfigurations { + keyA, err := tlsConfigKey(valueA) + if err != nil { + t.Errorf("Unexpected error for %q: %v", nameA, err) + continue + } + keyB, err := tlsConfigKey(valueB) + if err != nil { + t.Errorf("Unexpected error for %q: %v", nameB, err) + continue + } + + // Make sure we get the same key on the same config + if nameA == nameB { + if keyA != keyB { + t.Errorf("Expected identical cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB) + } + continue + } + + if keyA == keyB { + t.Errorf("Expected unique cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB) + continue + } + } + } +} diff --git a/vendor/k8s.io/client-go/transport/round_trippers.go b/vendor/k8s.io/client-go/transport/round_trippers.go index 459a9376..0ebcbbc8 100644 --- a/vendor/k8s.io/client-go/transport/round_trippers.go +++ b/vendor/k8s.io/client-go/transport/round_trippers.go @@ -129,7 +129,7 @@ func SetAuthProxyHeaders(req *http.Request, username string, groups []string, ex } for key, values := range extra { for _, value := range values { - req.Header.Add("X-Remote-Extra-"+key, value) + req.Header.Add("X-Remote-Extra-"+headerKeyEscape(key), value) } } } @@ -138,7 +138,7 @@ func (rt *authProxyRoundTripper) CancelRequest(req *http.Request) { if canceler, ok := rt.rt.(requestCanceler); ok { canceler.CancelRequest(req) } else { - glog.Errorf("CancelRequest not implemented") + glog.Errorf("CancelRequest not implemented by %T", rt.rt) } } @@ -166,7 +166,7 @@ func (rt *userAgentRoundTripper) CancelRequest(req *http.Request) { if canceler, ok := rt.rt.(requestCanceler); ok { canceler.CancelRequest(req) } else { - glog.Errorf("CancelRequest not implemented") + glog.Errorf("CancelRequest not implemented by %T", rt.rt) } } @@ -197,7 +197,7 @@ func (rt *basicAuthRoundTripper) CancelRequest(req *http.Request) { if canceler, ok := rt.rt.(requestCanceler); ok { canceler.CancelRequest(req) } else { - glog.Errorf("CancelRequest not implemented") + glog.Errorf("CancelRequest not implemented by %T", rt.rt) } } @@ -246,7 +246,7 @@ func (rt *impersonatingRoundTripper) RoundTrip(req *http.Request) (*http.Respons } for k, vv := range rt.impersonate.Extra { for _, v := range vv { - req.Header.Add(ImpersonateUserExtraHeaderPrefix+k, v) + req.Header.Add(ImpersonateUserExtraHeaderPrefix+headerKeyEscape(k), v) } } @@ -257,7 +257,7 @@ func (rt *impersonatingRoundTripper) CancelRequest(req *http.Request) { if canceler, ok := rt.delegate.(requestCanceler); ok { canceler.CancelRequest(req) } else { - glog.Errorf("CancelRequest not implemented") + glog.Errorf("CancelRequest not implemented by %T", rt.delegate) } } @@ -288,7 +288,7 @@ func (rt *bearerAuthRoundTripper) CancelRequest(req *http.Request) { if canceler, ok := rt.rt.(requestCanceler); ok { canceler.CancelRequest(req) } else { - glog.Errorf("CancelRequest not implemented") + glog.Errorf("CancelRequest not implemented by %T", rt.rt) } } @@ -372,7 +372,7 @@ func (rt *debuggingRoundTripper) CancelRequest(req *http.Request) { if canceler, ok := rt.delegatedRoundTripper.(requestCanceler); ok { canceler.CancelRequest(req) } else { - glog.Errorf("CancelRequest not implemented") + glog.Errorf("CancelRequest not implemented by %T", rt.delegatedRoundTripper) } } @@ -422,3 +422,110 @@ func (rt *debuggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, e func (rt *debuggingRoundTripper) WrappedRoundTripper() http.RoundTripper { return rt.delegatedRoundTripper } + +func legalHeaderByte(b byte) bool { + return int(b) < len(legalHeaderKeyBytes) && legalHeaderKeyBytes[b] +} + +func shouldEscape(b byte) bool { + // url.PathUnescape() returns an error if any '%' is not followed by two + // hexadecimal digits, so we'll intentionally encode it. + return !legalHeaderByte(b) || b == '%' +} + +func headerKeyEscape(key string) string { + buf := strings.Builder{} + for i := 0; i < len(key); i++ { + b := key[i] + if shouldEscape(b) { + // %-encode bytes that should be escaped: + // https://tools.ietf.org/html/rfc3986#section-2.1 + fmt.Fprintf(&buf, "%%%02X", b) + continue + } + buf.WriteByte(b) + } + return buf.String() +} + +// legalHeaderKeyBytes was copied from net/http/lex.go's isTokenTable. +// See https://httpwg.github.io/specs/rfc7230.html#rule.token.separators +var legalHeaderKeyBytes = [127]bool{ + '%': true, + '!': true, + '#': true, + '$': true, + '&': true, + '\'': true, + '*': true, + '+': true, + '-': true, + '.': true, + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + 'A': true, + 'B': true, + 'C': true, + 'D': true, + 'E': true, + 'F': true, + 'G': true, + 'H': true, + 'I': true, + 'J': true, + 'K': true, + 'L': true, + 'M': true, + 'N': true, + 'O': true, + 'P': true, + 'Q': true, + 'R': true, + 'S': true, + 'T': true, + 'U': true, + 'W': true, + 'V': true, + 'X': true, + 'Y': true, + 'Z': true, + '^': true, + '_': true, + '`': true, + 'a': true, + 'b': true, + 'c': true, + 'd': true, + 'e': true, + 'f': true, + 'g': true, + 'h': true, + 'i': true, + 'j': true, + 'k': true, + 'l': true, + 'm': true, + 'n': true, + 'o': true, + 'p': true, + 'q': true, + 'r': true, + 's': true, + 't': true, + 'u': true, + 'v': true, + 'w': true, + 'x': true, + 'y': true, + 'z': true, + '|': true, + '~': true, +} diff --git a/vendor/k8s.io/client-go/transport/round_trippers_test.go b/vendor/k8s.io/client-go/transport/round_trippers_test.go new file mode 100644 index 00000000..74d3dc21 --- /dev/null +++ b/vendor/k8s.io/client-go/transport/round_trippers_test.go @@ -0,0 +1,329 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 transport + +import ( + "net/http" + "net/url" + "reflect" + "strings" + "testing" +) + +type testRoundTripper struct { + Request *http.Request + Response *http.Response + Err error +} + +func (rt *testRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + rt.Request = req + return rt.Response, rt.Err +} + +func TestBearerAuthRoundTripper(t *testing.T) { + rt := &testRoundTripper{} + req := &http.Request{} + NewBearerAuthRoundTripper("test", rt).RoundTrip(req) + if rt.Request == nil { + t.Fatalf("unexpected nil request: %v", rt) + } + if rt.Request == req { + t.Fatalf("round tripper should have copied request object: %#v", rt.Request) + } + if rt.Request.Header.Get("Authorization") != "Bearer test" { + t.Errorf("unexpected authorization header: %#v", rt.Request) + } +} + +func TestBasicAuthRoundTripper(t *testing.T) { + for n, tc := range map[string]struct { + user string + pass string + }{ + "basic": {user: "user", pass: "pass"}, + "no pass": {user: "user"}, + } { + rt := &testRoundTripper{} + req := &http.Request{} + NewBasicAuthRoundTripper(tc.user, tc.pass, rt).RoundTrip(req) + if rt.Request == nil { + t.Fatalf("%s: unexpected nil request: %v", n, rt) + } + if rt.Request == req { + t.Fatalf("%s: round tripper should have copied request object: %#v", n, rt.Request) + } + if user, pass, found := rt.Request.BasicAuth(); !found || user != tc.user || pass != tc.pass { + t.Errorf("%s: unexpected authorization header: %#v", n, rt.Request) + } + } +} + +func TestUserAgentRoundTripper(t *testing.T) { + rt := &testRoundTripper{} + req := &http.Request{ + Header: make(http.Header), + } + req.Header.Set("User-Agent", "other") + NewUserAgentRoundTripper("test", rt).RoundTrip(req) + if rt.Request == nil { + t.Fatalf("unexpected nil request: %v", rt) + } + if rt.Request != req { + t.Fatalf("round tripper should not have copied request object: %#v", rt.Request) + } + if rt.Request.Header.Get("User-Agent") != "other" { + t.Errorf("unexpected user agent header: %#v", rt.Request) + } + + req = &http.Request{} + NewUserAgentRoundTripper("test", rt).RoundTrip(req) + if rt.Request == nil { + t.Fatalf("unexpected nil request: %v", rt) + } + if rt.Request == req { + t.Fatalf("round tripper should have copied request object: %#v", rt.Request) + } + if rt.Request.Header.Get("User-Agent") != "test" { + t.Errorf("unexpected user agent header: %#v", rt.Request) + } +} + +func TestImpersonationRoundTripper(t *testing.T) { + tcs := []struct { + name string + impersonationConfig ImpersonationConfig + expected map[string][]string + }{ + { + name: "all", + impersonationConfig: ImpersonationConfig{ + UserName: "user", + Groups: []string{"one", "two"}, + Extra: map[string][]string{ + "first": {"A", "a"}, + "second": {"B", "b"}, + }, + }, + expected: map[string][]string{ + ImpersonateUserHeader: {"user"}, + ImpersonateGroupHeader: {"one", "two"}, + ImpersonateUserExtraHeaderPrefix + "First": {"A", "a"}, + ImpersonateUserExtraHeaderPrefix + "Second": {"B", "b"}, + }, + }, + { + name: "escape handling", + impersonationConfig: ImpersonationConfig{ + UserName: "user", + Extra: map[string][]string{ + "test.example.com/thing.thing": {"A", "a"}, + }, + }, + expected: map[string][]string{ + ImpersonateUserHeader: {"user"}, + ImpersonateUserExtraHeaderPrefix + `Test.example.com%2fthing.thing`: {"A", "a"}, + }, + }, + { + name: "double escape handling", + impersonationConfig: ImpersonationConfig{ + UserName: "user", + Extra: map[string][]string{ + "test.example.com/thing.thing%20another.thing": {"A", "a"}, + }, + }, + expected: map[string][]string{ + ImpersonateUserHeader: {"user"}, + ImpersonateUserExtraHeaderPrefix + `Test.example.com%2fthing.thing%2520another.thing`: {"A", "a"}, + }, + }, + } + + for _, tc := range tcs { + rt := &testRoundTripper{} + req := &http.Request{ + Header: make(http.Header), + } + NewImpersonatingRoundTripper(tc.impersonationConfig, rt).RoundTrip(req) + + for k, v := range rt.Request.Header { + expected, ok := tc.expected[k] + if !ok { + t.Errorf("%v missing %v=%v", tc.name, k, v) + continue + } + if !reflect.DeepEqual(expected, v) { + t.Errorf("%v expected %v: %v, got %v", tc.name, k, expected, v) + } + } + for k, v := range tc.expected { + expected, ok := rt.Request.Header[k] + if !ok { + t.Errorf("%v missing %v=%v", tc.name, k, v) + continue + } + if !reflect.DeepEqual(expected, v) { + t.Errorf("%v expected %v: %v, got %v", tc.name, k, expected, v) + } + } + } +} + +func TestAuthProxyRoundTripper(t *testing.T) { + for n, tc := range map[string]struct { + username string + groups []string + extra map[string][]string + expectedExtra map[string][]string + }{ + "allfields": { + username: "user", + groups: []string{"groupA", "groupB"}, + extra: map[string][]string{ + "one": {"alpha", "bravo"}, + "two": {"charlie", "delta"}, + }, + expectedExtra: map[string][]string{ + "one": {"alpha", "bravo"}, + "two": {"charlie", "delta"}, + }, + }, + "escaped extra": { + username: "user", + groups: []string{"groupA", "groupB"}, + extra: map[string][]string{ + "one": {"alpha", "bravo"}, + "example.com/two": {"charlie", "delta"}, + }, + expectedExtra: map[string][]string{ + "one": {"alpha", "bravo"}, + "example.com%2ftwo": {"charlie", "delta"}, + }, + }, + "double escaped extra": { + username: "user", + groups: []string{"groupA", "groupB"}, + extra: map[string][]string{ + "one": {"alpha", "bravo"}, + "example.com/two%20three": {"charlie", "delta"}, + }, + expectedExtra: map[string][]string{ + "one": {"alpha", "bravo"}, + "example.com%2ftwo%2520three": {"charlie", "delta"}, + }, + }, + } { + rt := &testRoundTripper{} + req := &http.Request{} + NewAuthProxyRoundTripper(tc.username, tc.groups, tc.extra, rt).RoundTrip(req) + if rt.Request == nil { + t.Errorf("%s: unexpected nil request: %v", n, rt) + continue + } + if rt.Request == req { + t.Errorf("%s: round tripper should have copied request object: %#v", n, rt.Request) + continue + } + + actualUsernames, ok := rt.Request.Header["X-Remote-User"] + if !ok { + t.Errorf("%s missing value", n) + continue + } + if e, a := []string{tc.username}, actualUsernames; !reflect.DeepEqual(e, a) { + t.Errorf("%s expected %v, got %v", n, e, a) + continue + } + actualGroups, ok := rt.Request.Header["X-Remote-Group"] + if !ok { + t.Errorf("%s missing value", n) + continue + } + if e, a := tc.groups, actualGroups; !reflect.DeepEqual(e, a) { + t.Errorf("%s expected %v, got %v", n, e, a) + continue + } + + actualExtra := map[string][]string{} + for key, values := range rt.Request.Header { + if strings.HasPrefix(strings.ToLower(key), strings.ToLower("X-Remote-Extra-")) { + extraKey := strings.ToLower(key[len("X-Remote-Extra-"):]) + actualExtra[extraKey] = append(actualExtra[key], values...) + } + } + if e, a := tc.expectedExtra, actualExtra; !reflect.DeepEqual(e, a) { + t.Errorf("%s expected %v, got %v", n, e, a) + continue + } + } +} + +// TestHeaderEscapeRoundTrip tests to see if foo == url.PathUnescape(headerEscape(foo)) +// This behavior is important for client -> API server transmission of extra values. +func TestHeaderEscapeRoundTrip(t *testing.T) { + t.Parallel() + testCases := []struct { + name string + key string + }{ + { + name: "alpha", + key: "alphabetical", + }, + { + name: "alphanumeric", + key: "alph4num3r1c", + }, + { + name: "percent encoded", + key: "percent%20encoded", + }, + { + name: "almost percent encoded", + key: "almost%zzpercent%xxencoded", + }, + { + name: "illegal char & percent encoding", + key: "example.com/percent%20encoded", + }, + { + name: "weird unicode stuff", + key: "example.com/ᛒᚥᛏᛖᚥᚢとロビン", + }, + { + name: "header legal chars", + key: "abc123!#$+.-_*\\^`~|'", + }, + { + name: "legal path, illegal header", + key: "@=:", + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + escaped := headerKeyEscape(tc.key) + unescaped, err := url.PathUnescape(escaped) + if err != nil { + t.Fatalf("url.PathUnescape(%q) returned error: %v", escaped, err) + } + if tc.key != unescaped { + t.Errorf("url.PathUnescape(headerKeyEscape(%q)) returned %q, wanted %q", tc.key, unescaped, tc.key) + } + }) + } +} diff --git a/vendor/k8s.io/client-go/transport/spdy/BUILD b/vendor/k8s.io/client-go/transport/spdy/BUILD index bf90084b..ba78f316 100644 --- a/vendor/k8s.io/client-go/transport/spdy/BUILD +++ b/vendor/k8s.io/client-go/transport/spdy/BUILD @@ -8,11 +8,12 @@ load( go_library( name = "go_default_library", srcs = ["spdy.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/transport/spdy", importpath = "k8s.io/client-go/transport/spdy", deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/transport/transport_test.go b/vendor/k8s.io/client-go/transport/transport_test.go new file mode 100644 index 00000000..2e9896a0 --- /dev/null +++ b/vendor/k8s.io/client-go/transport/transport_test.go @@ -0,0 +1,288 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 transport + +import ( + "crypto/tls" + "errors" + "net/http" + "testing" +) + +const ( + rootCACert = `-----BEGIN CERTIFICATE----- +MIIC4DCCAcqgAwIBAgIBATALBgkqhkiG9w0BAQswIzEhMB8GA1UEAwwYMTAuMTMu +MTI5LjEwNkAxNDIxMzU5MDU4MB4XDTE1MDExNTIxNTczN1oXDTE2MDExNTIxNTcz +OFowIzEhMB8GA1UEAwwYMTAuMTMuMTI5LjEwNkAxNDIxMzU5MDU4MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunDRXGwsiYWGFDlWH6kjGun+PshDGeZX +xtx9lUnL8pIRWH3wX6f13PO9sktaOWW0T0mlo6k2bMlSLlSZgG9H6og0W6gLS3vq +s4VavZ6DbXIwemZG2vbRwsvR+t4G6Nbwelm6F8RFnA1Fwt428pavmNQ/wgYzo+T1 +1eS+HiN4ACnSoDSx3QRWcgBkB1g6VReofVjx63i0J+w8Q/41L9GUuLqquFxu6ZnH +60vTB55lHgFiDLjA1FkEz2dGvGh/wtnFlRvjaPC54JH2K1mPYAUXTreoeJtLJKX0 +ycoiyB24+zGCniUmgIsmQWRPaOPircexCp1BOeze82BT1LCZNTVaxQIDAQABoyMw +ITAOBgNVHQ8BAf8EBAMCAKQwDwYDVR0TAQH/BAUwAwEB/zALBgkqhkiG9w0BAQsD +ggEBADMxsUuAFlsYDpF4fRCzXXwrhbtj4oQwcHpbu+rnOPHCZupiafzZpDu+rw4x +YGPnCb594bRTQn4pAu3Ac18NbLD5pV3uioAkv8oPkgr8aUhXqiv7KdDiaWm6sbAL +EHiXVBBAFvQws10HMqMoKtO8f1XDNAUkWduakR/U6yMgvOPwS7xl0eUTqyRB6zGb +K55q2dejiFWaFqB/y78txzvz6UlOZKE44g2JAVoJVM6kGaxh33q8/FmrL4kuN3ut +W+MmJCVDvd4eEqPwbp7146ZWTqpIJ8lvA6wuChtqV8lhAPka2hD/LMqY8iXNmfXD +uml0obOEy+ON91k+SWTJ3ggmF/U= +-----END CERTIFICATE-----` + + certData = `-----BEGIN CERTIFICATE----- +MIIC6jCCAdSgAwIBAgIBCzALBgkqhkiG9w0BAQswIzEhMB8GA1UEAwwYMTAuMTMu +MTI5LjEwNkAxNDIxMzU5MDU4MB4XDTE1MDExNTIyMDEzMVoXDTE2MDExNTIyMDEz +MlowGzEZMBcGA1UEAxMQb3BlbnNoaWZ0LWNsaWVudDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKtdhz0+uCLXw5cSYns9rU/XifFSpb/x24WDdrm72S/v +b9BPYsAStiP148buylr1SOuNi8sTAZmlVDDIpIVwMLff+o2rKYDicn9fjbrTxTOj +lI4pHJBH+JU3AJ0tbajupioh70jwFS0oYpwtneg2zcnE2Z4l6mhrj2okrc5Q1/X2 +I2HChtIU4JYTisObtin10QKJX01CLfYXJLa8upWzKZ4/GOcHG+eAV3jXWoXidtjb +1Usw70amoTZ6mIVCkiu1QwCoa8+ycojGfZhvqMsAp1536ZcCul+Na+AbCv4zKS7F +kQQaImVrXdUiFansIoofGlw/JNuoKK6ssVpS5Ic3pgcCAwEAAaM1MDMwDgYDVR0P +AQH/BAQDAgCgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwCwYJ +KoZIhvcNAQELA4IBAQCKLREH7bXtXtZ+8vI6cjD7W3QikiArGqbl36bAhhWsJLp/ +p/ndKz39iFNaiZ3GlwIURWOOKx3y3GA0x9m8FR+Llthf0EQ8sUjnwaknWs0Y6DQ3 +jjPFZOpV3KPCFrdMJ3++E3MgwFC/Ih/N2ebFX9EcV9Vcc6oVWMdwT0fsrhu683rq +6GSR/3iVX1G/pmOiuaR0fNUaCyCfYrnI4zHBDgSfnlm3vIvN2lrsR/DQBakNL8DJ +HBgKxMGeUPoneBv+c8DMXIL0EhaFXRlBv9QW45/GiAIOuyFJ0i6hCtGZpJjq4OpQ +BRjCI+izPzFTjsxD4aORE+WOkyWFCGPWKfNejfw0 +-----END CERTIFICATE-----` + + keyData = `-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAq12HPT64ItfDlxJiez2tT9eJ8VKlv/HbhYN2ubvZL+9v0E9i +wBK2I/Xjxu7KWvVI642LyxMBmaVUMMikhXAwt9/6jaspgOJyf1+NutPFM6OUjikc +kEf4lTcAnS1tqO6mKiHvSPAVLShinC2d6DbNycTZniXqaGuPaiStzlDX9fYjYcKG +0hTglhOKw5u2KfXRAolfTUIt9hcktry6lbMpnj8Y5wcb54BXeNdaheJ22NvVSzDv +RqahNnqYhUKSK7VDAKhrz7JyiMZ9mG+oywCnXnfplwK6X41r4BsK/jMpLsWRBBoi +ZWtd1SIVqewiih8aXD8k26gorqyxWlLkhzemBwIDAQABAoIBAD2XYRs3JrGHQUpU +FkdbVKZkvrSY0vAZOqBTLuH0zUv4UATb8487anGkWBjRDLQCgxH+jucPTrztekQK +aW94clo0S3aNtV4YhbSYIHWs1a0It0UdK6ID7CmdWkAj6s0T8W8lQT7C46mWYVLm +5mFnCTHi6aB42jZrqmEpC7sivWwuU0xqj3Ml8kkxQCGmyc9JjmCB4OrFFC8NNt6M +ObvQkUI6Z3nO4phTbpxkE1/9dT0MmPIF7GhHVzJMS+EyyRYUDllZ0wvVSOM3qZT0 +JMUaBerkNwm9foKJ1+dv2nMKZZbJajv7suUDCfU44mVeaEO+4kmTKSGCGjjTBGkr +7L1ySDECgYEA5ElIMhpdBzIivCuBIH8LlUeuzd93pqssO1G2Xg0jHtfM4tz7fyeI +cr90dc8gpli24dkSxzLeg3Tn3wIj/Bu64m2TpZPZEIlukYvgdgArmRIPQVxerYey +OkrfTNkxU1HXsYjLCdGcGXs5lmb+K/kuTcFxaMOs7jZi7La+jEONwf8CgYEAwCs/ +rUOOA0klDsWWisbivOiNPII79c9McZCNBqncCBfMUoiGe8uWDEO4TFHN60vFuVk9 +8PkwpCfvaBUX+ajvbafIfHxsnfk1M04WLGCeqQ/ym5Q4sQoQOcC1b1y9qc/xEWfg +nIUuia0ukYRpl7qQa3tNg+BNFyjypW8zukUAC/kCgYB1/Kojuxx5q5/oQVPrx73k +2bevD+B3c+DYh9MJqSCNwFtUpYIWpggPxoQan4LwdsmO0PKzocb/ilyNFj4i/vII +NToqSc/WjDFpaDIKyuu9oWfhECye45NqLWhb/6VOuu4QA/Nsj7luMhIBehnEAHW+ +GkzTKM8oD1PxpEG3nPKXYQKBgQC6AuMPRt3XBl1NkCrpSBy/uObFlFaP2Enpf39S +3OZ0Gv0XQrnSaL1kP8TMcz68rMrGX8DaWYsgytstR4W+jyy7WvZwsUu+GjTJ5aMG +77uEcEBpIi9CBzivfn7hPccE8ZgqPf+n4i6q66yxBJflW5xhvafJqDtW2LcPNbW/ +bvzdmQKBgExALRUXpq+5dbmkdXBHtvXdRDZ6rVmrnjy4nI5bPw+1GqQqk6uAR6B/ +F6NmLCQOO4PDG/cuatNHIr2FrwTmGdEL6ObLUGWn9Oer9gJhHVqqsY5I4sEPo4XX +stR0Yiw0buV6DL/moUO0HIM9Bjh96HJp+LxiIS6UCdIhMPp5HoQa +-----END RSA PRIVATE KEY-----` +) + +func TestNew(t *testing.T) { + testCases := map[string]struct { + Config *Config + Err bool + TLS bool + TLSCert bool + TLSErr bool + Default bool + }{ + "default transport": { + Default: true, + Config: &Config{}, + }, + + "server name": { + TLS: true, + Config: &Config{TLS: TLSConfig{ + ServerName: "foo", + }}, + }, + + "ca transport": { + TLS: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + }, + }, + }, + "bad ca file transport": { + Err: true, + Config: &Config{ + TLS: TLSConfig{ + CAFile: "invalid file", + }, + }, + }, + "ca data overriding bad ca file transport": { + TLS: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + CAFile: "invalid file", + }, + }, + }, + + "cert transport": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + CertData: []byte(certData), + KeyData: []byte(keyData), + }, + }, + }, + "bad cert data transport": { + Err: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + CertData: []byte(certData), + KeyData: []byte("bad key data"), + }, + }, + }, + "bad file cert transport": { + Err: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + CertData: []byte(certData), + KeyFile: "invalid file", + }, + }, + }, + "key data overriding bad file cert transport": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + CertData: []byte(certData), + KeyData: []byte(keyData), + KeyFile: "invalid file", + }, + }, + }, + "callback cert and key": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + crt, err := tls.X509KeyPair([]byte(certData), []byte(keyData)) + return &crt, err + }, + }, + }, + }, + "cert callback error": { + TLS: true, + TLSCert: true, + TLSErr: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + return nil, errors.New("GetCert failure") + }, + }, + }, + }, + "cert data overrides empty callback result": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + return nil, nil + }, + CertData: []byte(certData), + KeyData: []byte(keyData), + }, + }, + }, + "callback returns nothing": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + return nil, nil + }, + }, + }, + }, + } + for k, testCase := range testCases { + t.Run(k, func(t *testing.T) { + rt, err := New(testCase.Config) + switch { + case testCase.Err && err == nil: + t.Fatal("unexpected non-error") + case !testCase.Err && err != nil: + t.Fatalf("unexpected error: %v", err) + } + if testCase.Err { + return + } + + switch { + case testCase.Default && rt != http.DefaultTransport: + t.Fatalf("got %#v, expected the default transport", rt) + case !testCase.Default && rt == http.DefaultTransport: + t.Fatalf("got %#v, expected non-default transport", rt) + } + + // We only know how to check TLSConfig on http.Transports + transport := rt.(*http.Transport) + switch { + case testCase.TLS && transport.TLSClientConfig == nil: + t.Fatalf("got %#v, expected TLSClientConfig", transport) + case !testCase.TLS && transport.TLSClientConfig != nil: + t.Fatalf("got %#v, expected no TLSClientConfig", transport) + } + if !testCase.TLS { + return + } + + switch { + case testCase.TLSCert && transport.TLSClientConfig.GetClientCertificate == nil: + t.Fatalf("got %#v, expected TLSClientConfig.GetClientCertificate", transport.TLSClientConfig) + case !testCase.TLSCert && transport.TLSClientConfig.GetClientCertificate != nil: + t.Fatalf("got %#v, expected no TLSClientConfig.GetClientCertificate", transport.TLSClientConfig) + } + if !testCase.TLSCert { + return + } + + _, err = transport.TLSClientConfig.GetClientCertificate(nil) + switch { + case testCase.TLSErr && err == nil: + t.Error("got nil error from GetClientCertificate, expected non-nil") + case !testCase.TLSErr && err != nil: + t.Errorf("got error from GetClientCertificate: %q, expected nil", err) + } + }) + } +} diff --git a/vendor/k8s.io/client-go/util/buffer/BUILD b/vendor/k8s.io/client-go/util/buffer/BUILD index d3b2652c..d9496272 100644 --- a/vendor/k8s.io/client-go/util/buffer/BUILD +++ b/vendor/k8s.io/client-go/util/buffer/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["ring_growing.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/buffer", importpath = "k8s.io/client-go/util/buffer", visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/client-go/util/buffer/ring_growing_test.go b/vendor/k8s.io/client-go/util/buffer/ring_growing_test.go new file mode 100644 index 00000000..31a4c079 --- /dev/null +++ b/vendor/k8s.io/client-go/util/buffer/ring_growing_test.go @@ -0,0 +1,50 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 buffer + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGrowth(t *testing.T) { + t.Parallel() + x := 10 + g := NewRingGrowing(1) + for i := 0; i < x; i++ { + assert.Equal(t, i, g.readable) + g.WriteOne(i) + } + read := 0 + for g.readable > 0 { + v, ok := g.ReadOne() + assert.True(t, ok) + assert.Equal(t, read, v) + read++ + } + assert.Equalf(t, x, read, "expected to have read %d items: %d", x, read) + assert.Zerof(t, g.readable, "expected readable to be zero: %d", g.readable) + assert.Equalf(t, 16, g.n, "expected N to be 16: %d", g.n) +} + +func TestEmpty(t *testing.T) { + t.Parallel() + g := NewRingGrowing(1) + _, ok := g.ReadOne() + assert.False(t, ok) +} diff --git a/vendor/k8s.io/client-go/util/cert/BUILD b/vendor/k8s.io/client-go/util/cert/BUILD index fc2a59be..4db41c73 100644 --- a/vendor/k8s.io/client-go/util/cert/BUILD +++ b/vendor/k8s.io/client-go/util/cert/BUILD @@ -24,6 +24,7 @@ go_library( "io.go", "pem.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/cert", importpath = "k8s.io/client-go/util/cert", ) diff --git a/vendor/k8s.io/client-go/util/cert/cert.go b/vendor/k8s.io/client-go/util/cert/cert.go index fb7f5fac..fe2158b2 100644 --- a/vendor/k8s.io/client-go/util/cert/cert.go +++ b/vendor/k8s.io/client-go/util/cert/cert.go @@ -20,6 +20,7 @@ import ( "bytes" "crypto/ecdsa" "crypto/elliptic" + "crypto/rand" cryptorand "crypto/rand" "crypto/rsa" "crypto/x509" @@ -27,9 +28,12 @@ import ( "encoding/pem" "errors" "fmt" + "io/ioutil" "math" "math/big" "net" + "path" + "strings" "time" ) @@ -84,7 +88,7 @@ func NewSelfSignedCACert(cfg Config, key *rsa.PrivateKey) (*x509.Certificate, er // NewSignedCert creates a signed certificate using the given CA certificate and key func NewSignedCert(cfg Config, key *rsa.PrivateKey, caCert *x509.Certificate, caKey *rsa.PrivateKey) (*x509.Certificate, error) { - serial, err := cryptorand.Int(cryptorand.Reader, new(big.Int).SetInt64(math.MaxInt64)) + serial, err := rand.Int(rand.Reader, new(big.Int).SetInt64(math.MaxInt64)) if err != nil { return nil, err } @@ -136,8 +140,38 @@ func MakeEllipticPrivateKeyPEM() ([]byte, error) { // GenerateSelfSignedCertKey creates a self-signed certificate and key for the given host. // Host may be an IP or a DNS name -// You may also specify additional subject alt names (either ip or dns names) for the certificate +// You may also specify additional subject alt names (either ip or dns names) for the certificate. func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS []string) ([]byte, []byte, error) { + return GenerateSelfSignedCertKeyWithFixtures(host, alternateIPs, alternateDNS, "") +} + +// GenerateSelfSignedCertKeyWithFixtures creates a self-signed certificate and key for the given host. +// Host may be an IP or a DNS name. You may also specify additional subject alt names (either ip or dns names) +// for the certificate. +// +// If fixtureDirectory is non-empty, it is a directory path which can contain pre-generated certs. The format is: +// _-_-.crt +// _-_-.key +// Certs/keys not existing in that directory are created. +func GenerateSelfSignedCertKeyWithFixtures(host string, alternateIPs []net.IP, alternateDNS []string, fixtureDirectory string) ([]byte, []byte, error) { + validFrom := time.Now().Add(-time.Hour) // valid an hour earlier to avoid flakes due to clock skew + maxAge := time.Hour * 24 * 365 // one year self-signed certs + + baseName := fmt.Sprintf("%s_%s_%s", host, strings.Join(ipsToStrings(alternateIPs), "-"), strings.Join(alternateDNS, "-")) + certFixturePath := path.Join(fixtureDirectory, baseName+".crt") + keyFixturePath := path.Join(fixtureDirectory, baseName+".key") + if len(fixtureDirectory) > 0 { + cert, err := ioutil.ReadFile(certFixturePath) + if err == nil { + key, err := ioutil.ReadFile(keyFixturePath) + if err == nil { + return cert, key, nil + } + return nil, nil, fmt.Errorf("cert %s can be read, but key %s cannot: %v", certFixturePath, keyFixturePath, err) + } + maxAge = 100 * time.Hour * 24 * 365 // 100 years fixtures + } + caKey, err := rsa.GenerateKey(cryptorand.Reader, 2048) if err != nil { return nil, nil, err @@ -148,8 +182,8 @@ func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS Subject: pkix.Name{ CommonName: fmt.Sprintf("%s-ca@%d", host, time.Now().Unix()), }, - NotBefore: time.Now(), - NotAfter: time.Now().Add(time.Hour * 24 * 365), + NotBefore: validFrom, + NotAfter: validFrom.Add(maxAge), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, @@ -176,8 +210,8 @@ func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS Subject: pkix.Name{ CommonName: fmt.Sprintf("%s@%d", host, time.Now().Unix()), }, - NotBefore: time.Now(), - NotAfter: time.Now().Add(time.Hour * 24 * 365), + NotBefore: validFrom, + NotAfter: validFrom.Add(maxAge), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, @@ -213,6 +247,15 @@ func GenerateSelfSignedCertKey(host string, alternateIPs []net.IP, alternateDNS return nil, nil, err } + if len(fixtureDirectory) > 0 { + if err := ioutil.WriteFile(certFixturePath, certBuffer.Bytes(), 0644); err != nil { + return nil, nil, fmt.Errorf("failed to write cert fixture to %s: %v", certFixturePath, err) + } + if err := ioutil.WriteFile(keyFixturePath, keyBuffer.Bytes(), 0644); err != nil { + return nil, nil, fmt.Errorf("failed to write key fixture to %s: %v", certFixturePath, err) + } + } + return certBuffer.Bytes(), keyBuffer.Bytes(), nil } @@ -243,3 +286,11 @@ func FormatCert(c *x509.Certificate) string { } return res } + +func ipsToStrings(ips []net.IP) []string { + ss := make([]string, 0, len(ips)) + for _, ip := range ips { + ss = append(ss, ip.String()) + } + return ss +} diff --git a/vendor/k8s.io/client-go/util/cert/csr_test.go b/vendor/k8s.io/client-go/util/cert/csr_test.go new file mode 100644 index 00000000..ed28f021 --- /dev/null +++ b/vendor/k8s.io/client-go/util/cert/csr_test.go @@ -0,0 +1,75 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 cert + +import ( + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "io/ioutil" + "net" + "testing" +) + +func TestMakeCSR(t *testing.T) { + keyFile := "testdata/dontUseThisKey.pem" + subject := &pkix.Name{ + CommonName: "kube-worker", + } + dnsSANs := []string{"localhost"} + ipSANs := []net.IP{net.ParseIP("127.0.0.1")} + + keyData, err := ioutil.ReadFile(keyFile) + if err != nil { + t.Fatal(err) + } + key, err := ParsePrivateKeyPEM(keyData) + if err != nil { + t.Fatal(err) + } + csrPEM, err := MakeCSR(key, subject, dnsSANs, ipSANs) + if err != nil { + t.Error(err) + } + csrBlock, rest := pem.Decode(csrPEM) + if csrBlock == nil { + t.Error("Unable to decode MakeCSR result.") + } + if len(rest) != 0 { + t.Error("Found more than one PEM encoded block in the result.") + } + if csrBlock.Type != CertificateRequestBlockType { + t.Errorf("Found block type %q, wanted 'CERTIFICATE REQUEST'", csrBlock.Type) + } + csr, err := x509.ParseCertificateRequest(csrBlock.Bytes) + if err != nil { + t.Errorf("Found %v parsing MakeCSR result as a CertificateRequest.", err) + } + if csr.Subject.CommonName != subject.CommonName { + t.Errorf("Wanted %v, got %v", subject, csr.Subject) + } + if len(csr.DNSNames) != 1 { + t.Errorf("Wanted 1 DNS name in the result, got %d", len(csr.DNSNames)) + } else if csr.DNSNames[0] != dnsSANs[0] { + t.Errorf("Wanted %v, got %v", dnsSANs[0], csr.DNSNames[0]) + } + if len(csr.IPAddresses) != 1 { + t.Errorf("Wanted 1 IP address in the result, got %d", len(csr.IPAddresses)) + } else if csr.IPAddresses[0].String() != ipSANs[0].String() { + t.Errorf("Wanted %v, got %v", ipSANs[0], csr.IPAddresses[0]) + } +} diff --git a/vendor/k8s.io/client-go/util/cert/pem_test.go b/vendor/k8s.io/client-go/util/cert/pem_test.go new file mode 100644 index 00000000..de3ce525 --- /dev/null +++ b/vendor/k8s.io/client-go/util/cert/pem_test.go @@ -0,0 +1,197 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 cert + +import ( + "io/ioutil" + "os" + "testing" +) + +const ( + // rsaPrivateKey is a RSA Private Key in PKCS#1 format + // openssl genrsa -out rsa2048.pem 2048 + rsaPrivateKey = `-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA92mVjhBKOFsdxFzb/Pjq+7b5TJlODAdY5hK+WxLZTIrfhDPq +FWrGKdjSNiHbXrdEtwJh9V+RqPZVSN3aWy1224RgkyNdMJsXhJKuCC24ZKY8SXtW +xuTYmMRaMnCsv6QBGRTIbZ2EFbAObVM7lDyv1VqY3amZIWFQMlZ9CNpxDSPa5yi4 +3gopbXkne0oGNmey9X0qtpk7NMZIgAL6Zz4rZ30bcfC2ag6RLOFI2E/c4n8c38R8 +9MfXfLkj8/Cxo4JfI9NvRCpPOpFO8d/ZtWVUuIrBQN+Y7tkN2T60Qq/TkKXUrhDe +fwlTlktZVJ/GztLYU41b2GcWsh/XO+PH831rmwIDAQABAoIBAQCC9c6GDjVbM0/E +WurPMusfJjE7zII1d8YkspM0HfwLug6qKdikUYpnKC/NG4rEzfl/bbFwco/lgc6O +7W/hh2U8uQttlvCDA/Uk5YddKOZL0Hpk4vaB/SxxYK3luSKXpjY2knutGg2KdVCN +qdsFkkH4iyYTXuyBcMNEgedZQldI/kEujIH/L7FE+DF5TMzT4lHhozDoG+fy564q +qVGUZXJn0ubc3GaPn2QOLNNM44sfYA4UJCpKBXPu85bvNObjxVQO4WqwwxU1vRnL +UUsaGaelhSVJCo0dVPRvrfPPKZ09HTwpy40EkgQo6VriFc1EBoQDjENLbAJv9OfQ +aCc9wiZhAoGBAP/8oEy48Zbb0P8Vdy4djf5tfBW8yXFLWzXewJ4l3itKS1r42nbX +9q3cJsgRTQm8uRcMIpWxsc3n6zG+lREvTkoTB3ViI7+uQPiqA+BtWyNy7jzufFke +ONKZfg7QxxmYRWZBRnoNGNbMpNeERuLmhvQuom9D1WbhzAYJbfs/O4WTAoGBAPds +2FNDU0gaesFDdkIUGq1nIJqRQDW485LXZm4pFqBFxdOpbdWRuYT2XZjd3fD0XY98 +Nhkpb7NTMCuK3BdKcqIptt+cK+quQgYid0hhhgZbpCQ5AL6c6KgyjgpYlh2enzU9 +Zo3yg8ej1zbbA11sBlhX+5iO2P1u5DG+JHLwUUbZAoGAUwaU102EzfEtsA4+QW7E +hyjrfgFlNKHES4yb3K9bh57pIfBkqvcQwwMMcQdrfSUAw0DkVrjzel0mI1Q09QXq +1ould6UFAz55RC2gZEITtUOpkYmoOx9aPrQZ9qQwb1S77ZZuTVfCHqjxLhVxCFbM +npYhiQTvShciHTMhwMOZgpECgYAVV5EtVXBYltgh1YTc3EkUzgF087R7LdHsx6Gx +POATwRD4WfP8aQ58lpeqOPEM+LcdSlSMRRO6fyF3kAm+BJDwxfJdRWZQXumZB94M +I0VhRQRaj4Qt7PDwmTPBVrTUJzuKZxpyggm17b8Bn1Ch/VBqzGQKW8AB1E/grosM +UwhfuQKBgQC2JO/iqTQScHClf0qlItCJsBuVukFmSAVCkpOD8YdbdlPdOOwSk1wQ +C0eAlsC3BCMvkpidKQmra6IqIrvTGI6EFgkrb3aknWdup2w8j2udYCNqyE3W+fVe +p8FdYQ1FkACQ+daO5VlClL/9l0sGjKXlNKbpmJ2H4ngZmXj5uGmxuQ== +-----END RSA PRIVATE KEY-----` + + // rsaPublicKey is a RSA Public Key in PEM encoded format + // openssl rsa -in rsa2048.pem -pubout -out rsa2048pub.pem + rsaPublicKey = `-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA92mVjhBKOFsdxFzb/Pjq ++7b5TJlODAdY5hK+WxLZTIrfhDPqFWrGKdjSNiHbXrdEtwJh9V+RqPZVSN3aWy12 +24RgkyNdMJsXhJKuCC24ZKY8SXtWxuTYmMRaMnCsv6QBGRTIbZ2EFbAObVM7lDyv +1VqY3amZIWFQMlZ9CNpxDSPa5yi43gopbXkne0oGNmey9X0qtpk7NMZIgAL6Zz4r +Z30bcfC2ag6RLOFI2E/c4n8c38R89MfXfLkj8/Cxo4JfI9NvRCpPOpFO8d/ZtWVU +uIrBQN+Y7tkN2T60Qq/TkKXUrhDefwlTlktZVJ/GztLYU41b2GcWsh/XO+PH831r +mwIDAQAB +-----END PUBLIC KEY-----` + + // certificate is an x509 certificate in PEM encoded format + // openssl req -new -key rsa2048.pem -sha256 -nodes -x509 -days 1826 -out x509certificate.pem -subj "/C=US/CN=not-valid" + certificate = `-----BEGIN CERTIFICATE----- +MIIDFTCCAf2gAwIBAgIJAN8B8NOwtiUCMA0GCSqGSIb3DQEBCwUAMCExCzAJBgNV +BAYTAlVTMRIwEAYDVQQDDAlub3QtdmFsaWQwHhcNMTcwMzIyMDI1NjM2WhcNMjIw +MzIyMDI1NjM2WjAhMQswCQYDVQQGEwJVUzESMBAGA1UEAwwJbm90LXZhbGlkMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA92mVjhBKOFsdxFzb/Pjq+7b5 +TJlODAdY5hK+WxLZTIrfhDPqFWrGKdjSNiHbXrdEtwJh9V+RqPZVSN3aWy1224Rg +kyNdMJsXhJKuCC24ZKY8SXtWxuTYmMRaMnCsv6QBGRTIbZ2EFbAObVM7lDyv1VqY +3amZIWFQMlZ9CNpxDSPa5yi43gopbXkne0oGNmey9X0qtpk7NMZIgAL6Zz4rZ30b +cfC2ag6RLOFI2E/c4n8c38R89MfXfLkj8/Cxo4JfI9NvRCpPOpFO8d/ZtWVUuIrB +QN+Y7tkN2T60Qq/TkKXUrhDefwlTlktZVJ/GztLYU41b2GcWsh/XO+PH831rmwID +AQABo1AwTjAdBgNVHQ4EFgQU1I5GfinLF7ta+dBJ6UWcrYaexLswHwYDVR0jBBgw +FoAU1I5GfinLF7ta+dBJ6UWcrYaexLswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B +AQsFAAOCAQEAUl0wUD4y41juHFOVMYiziPYr1ShSpQXdwp8FfaHrzI5hsr8UMe8D +dzb9QzZ4bx3yZhiG3ahrSBh956thMTHrKTEwAfJIEXI4cuSVWQAaOJ4Em5SDFxQe +d0E6Ui2nGh1SFGF7oyuEXyzqgRMWFNDFw9HLUNgXaO18Zfouw8+K0BgbfEWEcSi1 +JLQbyhCjz088gltrliQGPWDFAg9cHBKtJhuTzZkvuqK1CLEmBhtzP1zFiGBfOJc8 +v+aKjAwrPUNX11cXOCPxBv2qXMetxaovBem6AI2hvypCInXaVQfP+yOLubzlTDjS +Y708SlY38hmS1uTwDpyLOn8AKkZ8jtx75g== +-----END CERTIFICATE-----` + + // ecdsaPrivateKeyWithParams is a ECDSA Private Key with included EC Parameters block + // openssl ecparam -name prime256v1 -genkey -out ecdsa256params.pem + ecdsaPrivateKeyWithParams = `-----BEGIN EC PARAMETERS----- +BggqhkjOPQMBBw== +-----END EC PARAMETERS----- +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIAwSOWQqlMTZNqNF7tgua812Jxib1DVOgb2pHHyIEyNNoAoGCCqGSM49 +AwEHoUQDQgAEyxYNrs6a6tsNCFNYn+l+JDUZ0PnUZbcsDgJn2O62D1se8M5iQ5rY +iIv6RpxE3VHvlHEIvYgCZkG0jHszTUopBg== +-----END EC PRIVATE KEY-----` + + // ecdsaPrivateKey is a ECDSA Private Key in ASN.1 format + // openssl ecparam -name prime256v1 -genkey -noout -out ecdsa256.pem + ecdsaPrivateKey = `-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIP6Qw6dHDiLsSnLXUhQVTPE0fTQQrj3XSbiQAZPXnk5+oAoGCCqGSM49 +AwEHoUQDQgAEZZzi1u5f2/AEGFI/HYUhU+u6cTK1q2bbtE7r1JMK+/sQA5sNAp+7 +Vdc3psr1OaNzyTyuhTECyRdFKXm63cMnGg== +-----END EC PRIVATE KEY-----` + + // ecdsaPublicKey is a ECDSA Public Key in PEM encoded format + // openssl ec -in ecdsa256.pem -pubout -out ecdsa256pub.pem + ecdsaPublicKey = `-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZZzi1u5f2/AEGFI/HYUhU+u6cTK1 +q2bbtE7r1JMK+/sQA5sNAp+7Vdc3psr1OaNzyTyuhTECyRdFKXm63cMnGg== +-----END PUBLIC KEY-----` +) + +func TestReadPrivateKey(t *testing.T) { + f, err := ioutil.TempFile("", "") + if err != nil { + t.Fatalf("error creating tmpfile: %v", err) + } + defer os.Remove(f.Name()) + + if _, err := PrivateKeyFromFile(f.Name()); err == nil { + t.Fatalf("Expected error reading key from empty file, got none") + } + + if err := ioutil.WriteFile(f.Name(), []byte(rsaPrivateKey), os.FileMode(0600)); err != nil { + t.Fatalf("error writing private key to tmpfile: %v", err) + } + if _, err := PrivateKeyFromFile(f.Name()); err != nil { + t.Fatalf("error reading private RSA key: %v", err) + } + + if err := ioutil.WriteFile(f.Name(), []byte(ecdsaPrivateKey), os.FileMode(0600)); err != nil { + t.Fatalf("error writing private key to tmpfile: %v", err) + } + if _, err := PrivateKeyFromFile(f.Name()); err != nil { + t.Fatalf("error reading private ECDSA key: %v", err) + } + + if err := ioutil.WriteFile(f.Name(), []byte(ecdsaPrivateKeyWithParams), os.FileMode(0600)); err != nil { + t.Fatalf("error writing private key to tmpfile: %v", err) + } + if _, err := PrivateKeyFromFile(f.Name()); err != nil { + t.Fatalf("error reading private ECDSA key with params: %v", err) + } +} + +func TestReadPublicKeys(t *testing.T) { + f, err := ioutil.TempFile("", "") + if err != nil { + t.Fatalf("error creating tmpfile: %v", err) + } + defer os.Remove(f.Name()) + + if _, err := PublicKeysFromFile(f.Name()); err == nil { + t.Fatalf("Expected error reading keys from empty file, got none") + } + + if err := ioutil.WriteFile(f.Name(), []byte(rsaPublicKey), os.FileMode(0600)); err != nil { + t.Fatalf("error writing public key to tmpfile: %v", err) + } + if keys, err := PublicKeysFromFile(f.Name()); err != nil { + t.Fatalf("error reading RSA public key: %v", err) + } else if len(keys) != 1 { + t.Fatalf("expected 1 key, got %d", len(keys)) + } + + if err := ioutil.WriteFile(f.Name(), []byte(ecdsaPublicKey), os.FileMode(0600)); err != nil { + t.Fatalf("error writing public key to tmpfile: %v", err) + } + if keys, err := PublicKeysFromFile(f.Name()); err != nil { + t.Fatalf("error reading ECDSA public key: %v", err) + } else if len(keys) != 1 { + t.Fatalf("expected 1 key, got %d", len(keys)) + } + + if err := ioutil.WriteFile(f.Name(), []byte(rsaPublicKey+"\n"+ecdsaPublicKey), os.FileMode(0600)); err != nil { + t.Fatalf("error writing public key to tmpfile: %v", err) + } + if keys, err := PublicKeysFromFile(f.Name()); err != nil { + t.Fatalf("error reading combined RSA/ECDSA public key file: %v", err) + } else if len(keys) != 2 { + t.Fatalf("expected 2 keys, got %d", len(keys)) + } + + if err := ioutil.WriteFile(f.Name(), []byte(certificate), os.FileMode(0600)); err != nil { + t.Fatalf("error writing certificate to tmpfile: %v", err) + } + if keys, err := PublicKeysFromFile(f.Name()); err != nil { + t.Fatalf("error reading public key from certificate file: %v", err) + } else if len(keys) != 1 { + t.Fatalf("expected 1 keys, got %d", len(keys)) + } + +} diff --git a/vendor/k8s.io/client-go/util/certificate/BUILD b/vendor/k8s.io/client-go/util/certificate/BUILD deleted file mode 100644 index dfc5c393..00000000 --- a/vendor/k8s.io/client-go/util/certificate/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "certificate_manager_test.go", - "certificate_store_test.go", - ], - embed = [":go_default_library"], - tags = ["automanaged"], - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "certificate_manager.go", - "certificate_store.go", - ], - importpath = "k8s.io/client-go/util/certificate", - tags = ["automanaged"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - "//vendor/k8s.io/client-go/util/certificate/csr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/util/certificate/csr:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/util/certificate/OWNERS b/vendor/k8s.io/client-go/util/certificate/OWNERS deleted file mode 100644 index 2dce803b..00000000 --- a/vendor/k8s.io/client-go/util/certificate/OWNERS +++ /dev/null @@ -1,8 +0,0 @@ -reviewers: -- mikedanese -- liggit -- smarterclayton -approvers: -- mikedanese -- liggit -- smarterclayton diff --git a/vendor/k8s.io/client-go/util/certificate/certificate_manager.go b/vendor/k8s.io/client-go/util/certificate/certificate_manager.go deleted file mode 100644 index e189c847..00000000 --- a/vendor/k8s.io/client-go/util/certificate/certificate_manager.go +++ /dev/null @@ -1,429 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 certificate - -import ( - "crypto/ecdsa" - "crypto/elliptic" - cryptorand "crypto/rand" - "crypto/tls" - "crypto/x509" - "encoding/pem" - "fmt" - "sync" - "time" - - "github.com/golang/glog" - - certificates "k8s.io/api/certificates/v1beta1" - "k8s.io/apimachinery/pkg/api/errors" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/wait" - certificatesclient "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" - "k8s.io/client-go/util/cert" - "k8s.io/client-go/util/certificate/csr" -) - -// certificateWaitBackoff controls the amount and timing of retries when the -// watch for certificate approval is interrupted. -var certificateWaitBackoff = wait.Backoff{Duration: 30 * time.Second, Steps: 4, Factor: 1.5, Jitter: 0.1} - -// Manager maintains and updates the certificates in use by this certificate -// manager. In the background it communicates with the API server to get new -// certificates for certificates about to expire. -type Manager interface { - // CertificateSigningRequestClient sets the client interface that is used for - // signing new certificates generated as part of rotation. - SetCertificateSigningRequestClient(certificatesclient.CertificateSigningRequestInterface) error - // Start the API server status sync loop. - Start() - // Current returns the currently selected certificate from the - // certificate manager, as well as the associated certificate and key data - // in PEM format. - Current() *tls.Certificate - // ServerHealthy returns true if the manager is able to communicate with - // the server. This allows a caller to determine whether the cert manager - // thinks it can potentially talk to the API server. The cert manager may - // be very conservative and only return true if recent communication has - // occurred with the server. - ServerHealthy() bool -} - -// Config is the set of configuration parameters available for a new Manager. -type Config struct { - // CertificateSigningRequestClient will be used for signing new certificate - // requests generated when a key rotation occurs. It must be set either at - // initialization or by using CertificateSigningRequestClient before - // Manager.Start() is called. - CertificateSigningRequestClient certificatesclient.CertificateSigningRequestInterface - // Template is the CertificateRequest that will be used as a template for - // generating certificate signing requests for all new keys generated as - // part of rotation. It follows the same rules as the template parameter of - // crypto.x509.CreateCertificateRequest in the Go standard libraries. - Template *x509.CertificateRequest - // Usages is the types of usages that certificates generated by the manager - // can be used for. - Usages []certificates.KeyUsage - // CertificateStore is a persistent store where the current cert/key is - // kept and future cert/key pairs will be persisted after they are - // generated. - CertificateStore Store - // BootstrapCertificatePEM is the certificate data that will be returned - // from the Manager if the CertificateStore doesn't have any cert/key pairs - // currently available and has not yet had a chance to get a new cert/key - // pair from the API. If the CertificateStore does have a cert/key pair, - // this will be ignored. If there is no cert/key pair available in the - // CertificateStore, as soon as Start is called, it will request a new - // cert/key pair from the CertificateSigningRequestClient. This is intended - // to allow the first boot of a component to be initialized using a - // generic, multi-use cert/key pair which will be quickly replaced with a - // unique cert/key pair. - BootstrapCertificatePEM []byte - // BootstrapKeyPEM is the key data that will be returned from the Manager - // if the CertificateStore doesn't have any cert/key pairs currently - // available. If the CertificateStore does have a cert/key pair, this will - // be ignored. If the bootstrap cert/key pair are used, they will be - // rotated at the first opportunity, possibly well in advance of expiring. - // This is intended to allow the first boot of a component to be - // initialized using a generic, multi-use cert/key pair which will be - // quickly replaced with a unique cert/key pair. - BootstrapKeyPEM []byte - // CertificateExpiration will record a metric that shows the remaining - // lifetime of the certificate. - CertificateExpiration Gauge -} - -// Store is responsible for getting and updating the current certificate. -// Depending on the concrete implementation, the backing store for this -// behavior may vary. -type Store interface { - // Current returns the currently selected certificate, as well as the - // associated certificate and key data in PEM format. If the Store doesn't - // have a cert/key pair currently, it should return a NoCertKeyError so - // that the Manager can recover by using bootstrap certificates to request - // a new cert/key pair. - Current() (*tls.Certificate, error) - // Update accepts the PEM data for the cert/key pair and makes the new - // cert/key pair the 'current' pair, that will be returned by future calls - // to Current(). - Update(cert, key []byte) (*tls.Certificate, error) -} - -// Gauge will record the remaining lifetime of the certificate each time it is -// updated. -type Gauge interface { - Set(float64) -} - -// NoCertKeyError indicates there is no cert/key currently available. -type NoCertKeyError string - -func (e *NoCertKeyError) Error() string { return string(*e) } - -type manager struct { - certSigningRequestClient certificatesclient.CertificateSigningRequestInterface - template *x509.CertificateRequest - usages []certificates.KeyUsage - certStore Store - certAccessLock sync.RWMutex - cert *tls.Certificate - forceRotation bool - certificateExpiration Gauge - serverHealth bool -} - -// NewManager returns a new certificate manager. A certificate manager is -// responsible for being the authoritative source of certificates in the -// Kubelet and handling updates due to rotation. -func NewManager(config *Config) (Manager, error) { - cert, forceRotation, err := getCurrentCertificateOrBootstrap( - config.CertificateStore, - config.BootstrapCertificatePEM, - config.BootstrapKeyPEM) - if err != nil { - return nil, err - } - - m := manager{ - certSigningRequestClient: config.CertificateSigningRequestClient, - template: config.Template, - usages: config.Usages, - certStore: config.CertificateStore, - cert: cert, - forceRotation: forceRotation, - certificateExpiration: config.CertificateExpiration, - } - - return &m, nil -} - -// Current returns the currently selected certificate from the certificate -// manager. This can be nil if the manager was initialized without a -// certificate and has not yet received one from the -// CertificateSigningRequestClient. -func (m *manager) Current() *tls.Certificate { - m.certAccessLock.RLock() - defer m.certAccessLock.RUnlock() - return m.cert -} - -// ServerHealthy returns true if the cert manager believes the server -// is currently alive. -func (m *manager) ServerHealthy() bool { - m.certAccessLock.RLock() - defer m.certAccessLock.RUnlock() - return m.serverHealth -} - -// SetCertificateSigningRequestClient sets the client interface that is used -// for signing new certificates generated as part of rotation. It must be -// called before Start() and can not be used to change the -// CertificateSigningRequestClient that has already been set. This method is to -// support the one specific scenario where the CertificateSigningRequestClient -// uses the CertificateManager. -func (m *manager) SetCertificateSigningRequestClient(certSigningRequestClient certificatesclient.CertificateSigningRequestInterface) error { - if m.certSigningRequestClient == nil { - m.certSigningRequestClient = certSigningRequestClient - return nil - } - return fmt.Errorf("property CertificateSigningRequestClient is already set") -} - -// Start will start the background work of rotating the certificates. -func (m *manager) Start() { - // Certificate rotation depends on access to the API server certificate - // signing API, so don't start the certificate manager if we don't have a - // client. - if m.certSigningRequestClient == nil { - glog.V(2).Infof("Certificate rotation is not enabled, no connection to the apiserver.") - return - } - - glog.V(2).Infof("Certificate rotation is enabled.") - - go wait.Forever(func() { - deadline := m.nextRotationDeadline() - if sleepInterval := deadline.Sub(time.Now()); sleepInterval > 0 { - glog.V(2).Infof("Waiting %v for next certificate rotation", sleepInterval) - time.Sleep(sleepInterval) - } - backoff := wait.Backoff{ - Duration: 2 * time.Second, - Factor: 2, - Jitter: 0.1, - Steps: 5, - } - if err := wait.ExponentialBackoff(backoff, m.rotateCerts); err != nil { - utilruntime.HandleError(fmt.Errorf("Reached backoff limit, still unable to rotate certs: %v", err)) - wait.PollInfinite(32*time.Second, m.rotateCerts) - } - }, 0) -} - -func getCurrentCertificateOrBootstrap( - store Store, - bootstrapCertificatePEM []byte, - bootstrapKeyPEM []byte) (cert *tls.Certificate, shouldRotate bool, errResult error) { - - currentCert, err := store.Current() - if err == nil { - // if the current cert is expired, fall back to the bootstrap cert - if currentCert.Leaf != nil && time.Now().Before(currentCert.Leaf.NotAfter) { - return currentCert, false, nil - } - } else { - if _, ok := err.(*NoCertKeyError); !ok { - return nil, false, err - } - } - - if bootstrapCertificatePEM == nil || bootstrapKeyPEM == nil { - return nil, true, nil - } - - bootstrapCert, err := tls.X509KeyPair(bootstrapCertificatePEM, bootstrapKeyPEM) - if err != nil { - return nil, false, err - } - if len(bootstrapCert.Certificate) < 1 { - return nil, false, fmt.Errorf("no cert/key data found") - } - - certs, err := x509.ParseCertificates(bootstrapCert.Certificate[0]) - if err != nil { - return nil, false, fmt.Errorf("unable to parse certificate data: %v", err) - } - bootstrapCert.Leaf = certs[0] - - if _, err := store.Update(bootstrapCertificatePEM, bootstrapKeyPEM); err != nil { - utilruntime.HandleError(fmt.Errorf("Unable to set the cert/key pair to the bootstrap certificate: %v", err)) - } else { - glog.V(4).Infof("Updated the store to contain the initial bootstrap certificate") - } - - return &bootstrapCert, true, nil -} - -// rotateCerts attempts to request a client cert from the server, wait a reasonable -// period of time for it to be signed, and then update the cert on disk. If it cannot -// retrieve a cert, it will return false. It will only return error in exceptional cases. -// This method also keeps track of "server health" by interpreting the responses it gets -// from the server on the various calls it makes. -func (m *manager) rotateCerts() (bool, error) { - glog.V(2).Infof("Rotating certificates") - - csrPEM, keyPEM, privateKey, err := m.generateCSR() - if err != nil { - utilruntime.HandleError(fmt.Errorf("Unable to generate a certificate signing request: %v", err)) - return false, nil - } - - // Call the Certificate Signing Request API to get a certificate for the - // new private key. - req, err := csr.RequestCertificate(m.certSigningRequestClient, csrPEM, "", m.usages, privateKey) - if err != nil { - utilruntime.HandleError(fmt.Errorf("Failed while requesting a signed certificate from the master: %v", err)) - return false, m.updateServerError(err) - } - - // Wait for the certificate to be signed. Instead of one long watch, we retry with slightly longer - // intervals each time in order to tolerate failures from the server AND to preserve the liveliness - // of the cert manager loop. This creates slightly more traffic against the API server in return - // for bounding the amount of time we wait when a certificate expires. - var crtPEM []byte - watchDuration := time.Minute - if err := wait.ExponentialBackoff(certificateWaitBackoff, func() (bool, error) { - data, err := csr.WaitForCertificate(m.certSigningRequestClient, req, watchDuration) - switch { - case err == nil: - crtPEM = data - return true, nil - case err == wait.ErrWaitTimeout: - watchDuration += time.Minute - if watchDuration > 5*time.Minute { - watchDuration = 5 * time.Minute - } - return false, nil - default: - utilruntime.HandleError(fmt.Errorf("Unable to check certificate signing status: %v", err)) - return false, m.updateServerError(err) - } - }); err != nil { - utilruntime.HandleError(fmt.Errorf("Certificate request was not signed: %v", err)) - return false, nil - } - - cert, err := m.certStore.Update(crtPEM, keyPEM) - if err != nil { - utilruntime.HandleError(fmt.Errorf("Unable to store the new cert/key pair: %v", err)) - return false, nil - } - - m.updateCached(cert) - return true, nil -} - -// nextRotationDeadline returns a value for the threshold at which the -// current certificate should be rotated, 80%+/-10% of the expiration of the -// certificate. -func (m *manager) nextRotationDeadline() time.Time { - // forceRotation is not protected by locks - if m.forceRotation { - m.forceRotation = false - return time.Now() - } - - m.certAccessLock.RLock() - defer m.certAccessLock.RUnlock() - if m.cert == nil { - return time.Now() - } - - notAfter := m.cert.Leaf.NotAfter - totalDuration := float64(notAfter.Sub(m.cert.Leaf.NotBefore)) - deadline := m.cert.Leaf.NotBefore.Add(jitteryDuration(totalDuration)) - - glog.V(2).Infof("Certificate expiration is %v, rotation deadline is %v", notAfter, deadline) - if m.certificateExpiration != nil { - m.certificateExpiration.Set(float64(notAfter.Unix())) - } - return deadline -} - -// jitteryDuration uses some jitter to set the rotation threshold so each node -// will rotate at approximately 70-90% of the total lifetime of the -// certificate. With jitter, if a number of nodes are added to a cluster at -// approximately the same time (such as cluster creation time), they won't all -// try to rotate certificates at the same time for the rest of the life of the -// cluster. -// -// This function is represented as a variable to allow replacement during testing. -var jitteryDuration = func(totalDuration float64) time.Duration { - return wait.Jitter(time.Duration(totalDuration), 0.2) - time.Duration(totalDuration*0.3) -} - -// updateCached sets the most recent retrieved cert. It also sets the server -// as assumed healthy. -func (m *manager) updateCached(cert *tls.Certificate) { - m.certAccessLock.Lock() - defer m.certAccessLock.Unlock() - m.serverHealth = true - m.cert = cert -} - -// updateServerError takes an error returned by the server and infers -// the health of the server based on the error. It will return nil if -// the error does not require immediate termination of any wait loops, -// and otherwise it will return the error. -func (m *manager) updateServerError(err error) error { - m.certAccessLock.Lock() - defer m.certAccessLock.Unlock() - switch { - case errors.IsUnauthorized(err): - // SSL terminating proxies may report this error instead of the master - m.serverHealth = true - case errors.IsUnexpectedServerError(err): - // generally indicates a proxy or other load balancer problem, rather than a problem coming - // from the master - m.serverHealth = false - default: - // Identify known errors that could be expected for a cert request that - // indicate everything is working normally - m.serverHealth = errors.IsNotFound(err) || errors.IsForbidden(err) - } - return nil -} - -func (m *manager) generateCSR() (csrPEM []byte, keyPEM []byte, key interface{}, err error) { - // Generate a new private key. - privateKey, err := ecdsa.GenerateKey(elliptic.P256(), cryptorand.Reader) - if err != nil { - return nil, nil, nil, fmt.Errorf("unable to generate a new private key: %v", err) - } - der, err := x509.MarshalECPrivateKey(privateKey) - if err != nil { - return nil, nil, nil, fmt.Errorf("unable to marshal the new key to DER: %v", err) - } - - keyPEM = pem.EncodeToMemory(&pem.Block{Type: cert.ECPrivateKeyBlockType, Bytes: der}) - - csrPEM, err = cert.MakeCSRFromTemplate(privateKey, m.template) - if err != nil { - return nil, nil, nil, fmt.Errorf("unable to create a csr from the private key: %v", err) - } - return csrPEM, keyPEM, privateKey, nil -} diff --git a/vendor/k8s.io/client-go/util/certificate/certificate_store.go b/vendor/k8s.io/client-go/util/certificate/certificate_store.go deleted file mode 100644 index f54bd658..00000000 --- a/vendor/k8s.io/client-go/util/certificate/certificate_store.go +++ /dev/null @@ -1,338 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 certificate - -import ( - "crypto/tls" - "crypto/x509" - "encoding/pem" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" - - "github.com/golang/glog" -) - -const ( - keyExtension = ".key" - certExtension = ".crt" - pemExtension = ".pem" - currentPair = "current" - updatedPair = "updated" -) - -type fileStore struct { - pairNamePrefix string - certDirectory string - keyDirectory string - certFile string - keyFile string -} - -// FileStore is a store that provides certificate retrieval as well as -// the path on disk of the current PEM. -type FileStore interface { - Store - // CurrentPath returns the path on disk of the current certificate/key - // pair encoded as PEM files. - CurrentPath() string -} - -// NewFileStore returns a concrete implementation of a Store that is based on -// storing the cert/key pairs in a single file per pair on disk in the -// designated directory. When starting up it will look for the currently -// selected cert/key pair in: -// -// 1. ${certDirectory}/${pairNamePrefix}-current.pem - both cert and key are in the same file. -// 2. ${certFile}, ${keyFile} -// 3. ${certDirectory}/${pairNamePrefix}.crt, ${keyDirectory}/${pairNamePrefix}.key -// -// The first one found will be used. If rotation is enabled, future cert/key -// updates will be written to the ${certDirectory} directory and -// ${certDirectory}/${pairNamePrefix}-current.pem will be created as a soft -// link to the currently selected cert/key pair. -func NewFileStore( - pairNamePrefix string, - certDirectory string, - keyDirectory string, - certFile string, - keyFile string) (FileStore, error) { - - s := fileStore{ - pairNamePrefix: pairNamePrefix, - certDirectory: certDirectory, - keyDirectory: keyDirectory, - certFile: certFile, - keyFile: keyFile, - } - if err := s.recover(); err != nil { - return nil, err - } - return &s, nil -} - -// CurrentPath returns the path to the current version of these certificates. -func (s *fileStore) CurrentPath() string { - return filepath.Join(s.certDirectory, s.filename(currentPair)) -} - -// recover checks if there is a certificate rotation that was interrupted while -// progress, and if so, attempts to recover to a good state. -func (s *fileStore) recover() error { - // If the 'current' file doesn't exist, continue on with the recovery process. - currentPath := filepath.Join(s.certDirectory, s.filename(currentPair)) - if exists, err := fileExists(currentPath); err != nil { - return err - } else if exists { - return nil - } - - // If the 'updated' file exists, and it is a symbolic link, continue on - // with the recovery process. - updatedPath := filepath.Join(s.certDirectory, s.filename(updatedPair)) - if fi, err := os.Lstat(updatedPath); err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } else if fi.Mode()&os.ModeSymlink != os.ModeSymlink { - return fmt.Errorf("expected %q to be a symlink but it is a file", updatedPath) - } - - // Move the 'updated' symlink to 'current'. - if err := os.Rename(updatedPath, currentPath); err != nil { - return fmt.Errorf("unable to rename %q to %q: %v", updatedPath, currentPath, err) - } - return nil -} - -func (s *fileStore) Current() (*tls.Certificate, error) { - pairFile := filepath.Join(s.certDirectory, s.filename(currentPair)) - if pairFileExists, err := fileExists(pairFile); err != nil { - return nil, err - } else if pairFileExists { - glog.Infof("Loading cert/key pair from %q.", pairFile) - return loadFile(pairFile) - } - - certFileExists, err := fileExists(s.certFile) - if err != nil { - return nil, err - } - keyFileExists, err := fileExists(s.keyFile) - if err != nil { - return nil, err - } - if certFileExists && keyFileExists { - glog.Infof("Loading cert/key pair from (%q, %q).", s.certFile, s.keyFile) - return loadX509KeyPair(s.certFile, s.keyFile) - } - - c := filepath.Join(s.certDirectory, s.pairNamePrefix+certExtension) - k := filepath.Join(s.keyDirectory, s.pairNamePrefix+keyExtension) - certFileExists, err = fileExists(c) - if err != nil { - return nil, err - } - keyFileExists, err = fileExists(k) - if err != nil { - return nil, err - } - if certFileExists && keyFileExists { - glog.Infof("Loading cert/key pair from (%q, %q).", c, k) - return loadX509KeyPair(c, k) - } - - noKeyErr := NoCertKeyError( - fmt.Sprintf("no cert/key files read at %q, (%q, %q) or (%q, %q)", - pairFile, - s.certFile, - s.keyFile, - s.certDirectory, - s.keyDirectory)) - return nil, &noKeyErr -} - -func loadFile(pairFile string) (*tls.Certificate, error) { - certBlock, keyBlock, err := loadCertKeyBlocks(pairFile) - if err != nil { - return nil, err - } - cert, err := tls.X509KeyPair(pem.EncodeToMemory(certBlock), pem.EncodeToMemory(keyBlock)) - if err != nil { - return nil, fmt.Errorf("could not convert data from %q into cert/key pair: %v", pairFile, err) - } - certs, err := x509.ParseCertificates(cert.Certificate[0]) - if err != nil { - return nil, fmt.Errorf("unable to parse certificate data: %v", err) - } - cert.Leaf = certs[0] - return &cert, nil -} - -func loadCertKeyBlocks(pairFile string) (cert *pem.Block, key *pem.Block, err error) { - data, err := ioutil.ReadFile(pairFile) - if err != nil { - return nil, nil, fmt.Errorf("could not load cert/key pair from %q: %v", pairFile, err) - } - certBlock, rest := pem.Decode(data) - if certBlock == nil { - return nil, nil, fmt.Errorf("could not decode the first block from %q from expected PEM format", pairFile) - } - keyBlock, _ := pem.Decode(rest) - if keyBlock == nil { - return nil, nil, fmt.Errorf("could not decode the second block from %q from expected PEM format", pairFile) - } - return certBlock, keyBlock, nil -} - -func (s *fileStore) Update(certData, keyData []byte) (*tls.Certificate, error) { - ts := time.Now().Format("2006-01-02-15-04-05") - pemFilename := s.filename(ts) - - if err := os.MkdirAll(s.certDirectory, 0755); err != nil { - return nil, fmt.Errorf("could not create directory %q to store certificates: %v", s.certDirectory, err) - } - certPath := filepath.Join(s.certDirectory, pemFilename) - - f, err := os.OpenFile(certPath, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0600) - if err != nil { - return nil, fmt.Errorf("could not open %q: %v", certPath, err) - } - defer f.Close() - certBlock, _ := pem.Decode(certData) - if certBlock == nil { - return nil, fmt.Errorf("invalid certificate data") - } - pem.Encode(f, certBlock) - keyBlock, _ := pem.Decode(keyData) - if keyBlock == nil { - return nil, fmt.Errorf("invalid key data") - } - pem.Encode(f, keyBlock) - - cert, err := loadFile(certPath) - if err != nil { - return nil, err - } - - if err := s.updateSymlink(certPath); err != nil { - return nil, err - } - return cert, nil -} - -// updateSymLink updates the current symlink to point to the file that is -// passed it. It will fail if there is a non-symlink file exists where the -// symlink is expected to be. -func (s *fileStore) updateSymlink(filename string) error { - // If the 'current' file either doesn't exist, or is already a symlink, - // proceed. Otherwise, this is an unrecoverable error. - currentPath := filepath.Join(s.certDirectory, s.filename(currentPair)) - currentPathExists := false - if fi, err := os.Lstat(currentPath); err != nil { - if !os.IsNotExist(err) { - return err - } - } else if fi.Mode()&os.ModeSymlink != os.ModeSymlink { - return fmt.Errorf("expected %q to be a symlink but it is a file", currentPath) - } else { - currentPathExists = true - } - - // If the 'updated' file doesn't exist, proceed. If it exists but it is a - // symlink, delete it. Otherwise, this is an unrecoverable error. - updatedPath := filepath.Join(s.certDirectory, s.filename(updatedPair)) - if fi, err := os.Lstat(updatedPath); err != nil { - if !os.IsNotExist(err) { - return err - } - } else if fi.Mode()&os.ModeSymlink != os.ModeSymlink { - return fmt.Errorf("expected %q to be a symlink but it is a file", updatedPath) - } else { - if err := os.Remove(updatedPath); err != nil { - return fmt.Errorf("unable to remove %q: %v", updatedPath, err) - } - } - - // Check that the new cert/key pair file exists to avoid rotating to an - // invalid cert/key. - if filenameExists, err := fileExists(filename); err != nil { - return err - } else if !filenameExists { - return fmt.Errorf("file %q does not exist so it can not be used as the currently selected cert/key", filename) - } - - // Ensure the source path is absolute to ensure the symlink target is - // correct when certDirectory is a relative path. - filename, err := filepath.Abs(filename) - if err != nil { - return err - } - - // Create the 'updated' symlink pointing to the requested file name. - if err := os.Symlink(filename, updatedPath); err != nil { - return fmt.Errorf("unable to create a symlink from %q to %q: %v", updatedPath, filename, err) - } - - // Replace the 'current' symlink. - if currentPathExists { - if err := os.Remove(currentPath); err != nil { - return fmt.Errorf("unable to remove %q: %v", currentPath, err) - } - } - if err := os.Rename(updatedPath, currentPath); err != nil { - return fmt.Errorf("unable to rename %q to %q: %v", updatedPath, currentPath, err) - } - return nil -} - -func (s *fileStore) filename(qualifier string) string { - return s.pairNamePrefix + "-" + qualifier + pemExtension -} - -// withoutExt returns the given filename after removing the extension. The -// extension to remove will be the result of filepath.Ext(). -func withoutExt(filename string) string { - return strings.TrimSuffix(filename, filepath.Ext(filename)) -} - -func loadX509KeyPair(certFile, keyFile string) (*tls.Certificate, error) { - cert, err := tls.LoadX509KeyPair(certFile, keyFile) - if err != nil { - return nil, err - } - certs, err := x509.ParseCertificates(cert.Certificate[0]) - if err != nil { - return nil, fmt.Errorf("unable to parse certificate data: %v", err) - } - cert.Leaf = certs[0] - return &cert, nil -} - -// FileExists checks if specified file exists. -func fileExists(filename string) (bool, error) { - if _, err := os.Stat(filename); os.IsNotExist(err) { - return false, nil - } else if err != nil { - return false, err - } - return true, nil -} diff --git a/vendor/k8s.io/client-go/util/certificate/csr/BUILD b/vendor/k8s.io/client-go/util/certificate/csr/BUILD deleted file mode 100644 index c1bcd957..00000000 --- a/vendor/k8s.io/client-go/util/certificate/csr/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["csr.go"], - importpath = "k8s.io/client-go/util/certificate/csr", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["csr_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/util/certificate/csr/csr.go b/vendor/k8s.io/client-go/util/certificate/csr/csr.go deleted file mode 100644 index 22112a5b..00000000 --- a/vendor/k8s.io/client-go/util/certificate/csr/csr.go +++ /dev/null @@ -1,261 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 csr - -import ( - "crypto" - "crypto/sha512" - "crypto/x509" - "crypto/x509/pkix" - "encoding/base64" - "encoding/pem" - "fmt" - "github.com/golang/glog" - "reflect" - "time" - - certificates "k8s.io/api/certificates/v1beta1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/apimachinery/pkg/watch" - certificatesclient "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" - "k8s.io/client-go/tools/cache" - certutil "k8s.io/client-go/util/cert" -) - -// RequestNodeCertificate will create a certificate signing request for a node -// (Organization and CommonName for the CSR will be set as expected for node -// certificates) and send it to API server, then it will watch the object's -// status, once approved by API server, it will return the API server's issued -// certificate (pem-encoded). If there is any errors, or the watch timeouts, it -// will return an error. This is intended for use on nodes (kubelet and -// kubeadm). -func RequestNodeCertificate(client certificatesclient.CertificateSigningRequestInterface, privateKeyData []byte, nodeName types.NodeName) (certData []byte, err error) { - subject := &pkix.Name{ - Organization: []string{"system:nodes"}, - CommonName: "system:node:" + string(nodeName), - } - - privateKey, err := certutil.ParsePrivateKeyPEM(privateKeyData) - if err != nil { - return nil, fmt.Errorf("invalid private key for certificate request: %v", err) - } - csrData, err := certutil.MakeCSR(privateKey, subject, nil, nil) - if err != nil { - return nil, fmt.Errorf("unable to generate certificate request: %v", err) - } - - usages := []certificates.KeyUsage{ - certificates.UsageDigitalSignature, - certificates.UsageKeyEncipherment, - certificates.UsageClientAuth, - } - name := digestedName(privateKeyData, subject, usages) - req, err := RequestCertificate(client, csrData, name, usages, privateKey) - if err != nil { - return nil, err - } - return WaitForCertificate(client, req, 3600*time.Second) -} - -// RequestCertificate will either use an existing (if this process has run -// before but not to completion) or create a certificate signing request using the -// PEM encoded CSR and send it to API server, then it will watch the object's -// status, once approved by API server, it will return the API server's issued -// certificate (pem-encoded). If there is any errors, or the watch timeouts, it -// will return an error. -func RequestCertificate(client certificatesclient.CertificateSigningRequestInterface, csrData []byte, name string, usages []certificates.KeyUsage, privateKey interface{}) (req *certificates.CertificateSigningRequest, err error) { - csr := &certificates.CertificateSigningRequest{ - // Username, UID, Groups will be injected by API server. - TypeMeta: metav1.TypeMeta{Kind: "CertificateSigningRequest"}, - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Spec: certificates.CertificateSigningRequestSpec{ - Request: csrData, - Usages: usages, - }, - } - if len(csr.Name) == 0 { - csr.GenerateName = "csr-" - } - - req, err = client.Create(csr) - switch { - case err == nil: - case errors.IsAlreadyExists(err) && len(name) > 0: - glog.Infof("csr for this node already exists, reusing") - req, err = client.Get(name, metav1.GetOptions{}) - if err != nil { - return nil, formatError("cannot retrieve certificate signing request: %v", err) - } - if err := ensureCompatible(req, csr, privateKey); err != nil { - return nil, fmt.Errorf("retrieved csr is not compatible: %v", err) - } - glog.Infof("csr for this node is still valid") - default: - return nil, formatError("cannot create certificate signing request: %v", err) - } - return req, nil -} - -// WaitForCertificate waits for a certificate to be issued until timeout, or returns an error. -func WaitForCertificate(client certificatesclient.CertificateSigningRequestInterface, req *certificates.CertificateSigningRequest, timeout time.Duration) (certData []byte, err error) { - fieldSelector := fields.OneTermEqualSelector("metadata.name", req.Name).String() - - event, err := cache.ListWatchUntil( - timeout, - &cache.ListWatch{ - ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { - options.FieldSelector = fieldSelector - return client.List(options) - }, - WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { - options.FieldSelector = fieldSelector - return client.Watch(options) - }, - }, - func(event watch.Event) (bool, error) { - switch event.Type { - case watch.Modified, watch.Added: - case watch.Deleted: - return false, fmt.Errorf("csr %q was deleted", req.Name) - default: - return false, nil - } - csr := event.Object.(*certificates.CertificateSigningRequest) - if csr.UID != req.UID { - return false, fmt.Errorf("csr %q changed UIDs", csr.Name) - } - for _, c := range csr.Status.Conditions { - if c.Type == certificates.CertificateDenied { - return false, fmt.Errorf("certificate signing request is not approved, reason: %v, message: %v", c.Reason, c.Message) - } - if c.Type == certificates.CertificateApproved && csr.Status.Certificate != nil { - return true, nil - } - } - return false, nil - }, - ) - if err == wait.ErrWaitTimeout { - return nil, wait.ErrWaitTimeout - } - if err != nil { - return nil, formatError("cannot watch on the certificate signing request: %v", err) - } - - return event.Object.(*certificates.CertificateSigningRequest).Status.Certificate, nil -} - -// This digest should include all the relevant pieces of the CSR we care about. -// We can't direcly hash the serialized CSR because of random padding that we -// regenerate every loop and we include usages which are not contained in the -// CSR. This needs to be kept up to date as we add new fields to the node -// certificates and with ensureCompatible. -func digestedName(privateKeyData []byte, subject *pkix.Name, usages []certificates.KeyUsage) string { - hash := sha512.New512_256() - - // Here we make sure two different inputs can't write the same stream - // to the hash. This delimiter is not in the base64.URLEncoding - // alphabet so there is no way to have spill over collisions. Without - // it 'CN:foo,ORG:bar' hashes to the same value as 'CN:foob,ORG:ar' - const delimiter = '|' - encode := base64.RawURLEncoding.EncodeToString - - write := func(data []byte) { - hash.Write([]byte(encode(data))) - hash.Write([]byte{delimiter}) - } - - write(privateKeyData) - write([]byte(subject.CommonName)) - for _, v := range subject.Organization { - write([]byte(v)) - } - for _, v := range usages { - write([]byte(v)) - } - - return "node-csr-" + encode(hash.Sum(nil)) -} - -// ensureCompatible ensures that a CSR object is compatible with an original CSR -func ensureCompatible(new, orig *certificates.CertificateSigningRequest, privateKey interface{}) error { - newCsr, err := ParseCSR(new) - if err != nil { - return fmt.Errorf("unable to parse new csr: %v", err) - } - origCsr, err := ParseCSR(orig) - if err != nil { - return fmt.Errorf("unable to parse original csr: %v", err) - } - if !reflect.DeepEqual(newCsr.Subject, origCsr.Subject) { - return fmt.Errorf("csr subjects differ: new: %#v, orig: %#v", newCsr.Subject, origCsr.Subject) - } - signer, ok := privateKey.(crypto.Signer) - if !ok { - return fmt.Errorf("privateKey is not a signer") - } - newCsr.PublicKey = signer.Public() - if err := newCsr.CheckSignature(); err != nil { - return fmt.Errorf("error validating signature new CSR against old key: %v", err) - } - if len(new.Status.Certificate) > 0 { - certs, err := certutil.ParseCertsPEM(new.Status.Certificate) - if err != nil { - return fmt.Errorf("error parsing signed certificate for CSR: %v", err) - } - now := time.Now() - for _, cert := range certs { - if now.After(cert.NotAfter) { - return fmt.Errorf("one of the certificates for the CSR has expired: %s", cert.NotAfter) - } - } - } - return nil -} - -// formatError preserves the type of an API message but alters the message. Expects -// a single argument format string, and returns the wrapped error. -func formatError(format string, err error) error { - if s, ok := err.(errors.APIStatus); ok { - se := &errors.StatusError{ErrStatus: s.Status()} - se.ErrStatus.Message = fmt.Sprintf(format, se.ErrStatus.Message) - return se - } - return fmt.Errorf(format, err) -} - -// ParseCSR extracts the CSR from the API object and decodes it. -func ParseCSR(obj *certificates.CertificateSigningRequest) (*x509.CertificateRequest, error) { - // extract PEM from request object - pemBytes := obj.Spec.Request - block, _ := pem.Decode(pemBytes) - if block == nil || block.Type != "CERTIFICATE REQUEST" { - return nil, fmt.Errorf("PEM block type must be CERTIFICATE REQUEST") - } - csr, err := x509.ParseCertificateRequest(block.Bytes) - if err != nil { - return nil, err - } - return csr, nil -} diff --git a/vendor/k8s.io/client-go/util/connrotation/BUILD b/vendor/k8s.io/client-go/util/connrotation/BUILD index 5744cfd1..caf852a3 100644 --- a/vendor/k8s.io/client-go/util/connrotation/BUILD +++ b/vendor/k8s.io/client-go/util/connrotation/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["connrotation.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/connrotation", importpath = "k8s.io/client-go/util/connrotation", visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/client-go/util/connrotation/connrotation_test.go b/vendor/k8s.io/client-go/util/connrotation/connrotation_test.go new file mode 100644 index 00000000..a618f296 --- /dev/null +++ b/vendor/k8s.io/client-go/util/connrotation/connrotation_test.go @@ -0,0 +1,61 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 connrotation + +import ( + "context" + "net" + "testing" + "time" +) + +func TestCloseAll(t *testing.T) { + closed := make(chan struct{}) + dialFn := func(ctx context.Context, network, address string) (net.Conn, error) { + return closeOnlyConn{onClose: func() { closed <- struct{}{} }}, nil + } + dialer := NewDialer(dialFn) + + const numConns = 10 + + // Outer loop to ensure Dialer is re-usable after CloseAll. + for i := 0; i < 5; i++ { + for j := 0; j < numConns; j++ { + if _, err := dialer.Dial("", ""); err != nil { + t.Fatal(err) + } + } + dialer.CloseAll() + for j := 0; j < numConns; j++ { + select { + case <-closed: + case <-time.After(time.Second): + t.Fatalf("iteration %d: 1s after CloseAll only %d/%d connections closed", i, j, numConns) + } + } + } +} + +type closeOnlyConn struct { + net.Conn + onClose func() +} + +func (c closeOnlyConn) Close() error { + go c.onClose() + return nil +} diff --git a/vendor/k8s.io/client-go/util/exec/BUILD b/vendor/k8s.io/client-go/util/exec/BUILD index 57b58e5c..30f4af10 100644 --- a/vendor/k8s.io/client-go/util/exec/BUILD +++ b/vendor/k8s.io/client-go/util/exec/BUILD @@ -8,6 +8,7 @@ load( go_library( name = "go_default_library", srcs = ["exec.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/exec", importpath = "k8s.io/client-go/util/exec", ) diff --git a/vendor/k8s.io/client-go/util/flowcontrol/BUILD b/vendor/k8s.io/client-go/util/flowcontrol/BUILD index 819bb7ef..a67ac494 100644 --- a/vendor/k8s.io/client-go/util/flowcontrol/BUILD +++ b/vendor/k8s.io/client-go/util/flowcontrol/BUILD @@ -13,7 +13,7 @@ go_test( "throttle_test.go", ], embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library"], ) go_library( @@ -22,11 +22,12 @@ go_library( "backoff.go", "throttle.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/flowcontrol", importpath = "k8s.io/client-go/util/flowcontrol", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/client-go/util/integer:go_default_library", "//vendor/golang.org/x/time/rate:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/client-go/util/integer:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/util/flowcontrol/backoff_test.go b/vendor/k8s.io/client-go/util/flowcontrol/backoff_test.go new file mode 100644 index 00000000..b14ab341 --- /dev/null +++ b/vendor/k8s.io/client-go/util/flowcontrol/backoff_test.go @@ -0,0 +1,195 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 flowcontrol + +import ( + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/clock" +) + +func TestSlowBackoff(t *testing.T) { + id := "_idSlow" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 50 * step + + b := NewFakeBackOff(step, maxDuration, tc) + cases := []time.Duration{0, 1, 2, 4, 8, 16, 32, 50, 50, 50} + for ix, c := range cases { + tc.Step(step) + w := b.Get(id) + if w != c*step { + t.Errorf("input: '%d': expected %s, got %s", ix, c*step, w) + } + b.Next(id, tc.Now()) + } + + //Now confirm that the Reset cancels backoff. + b.Next(id, tc.Now()) + b.Reset(id) + if b.Get(id) != 0 { + t.Errorf("Reset didn't clear the backoff.") + } + +} + +func TestBackoffReset(t *testing.T) { + id := "_idReset" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := step * 5 + b := NewFakeBackOff(step, maxDuration, tc) + startTime := tc.Now() + + // get to backoff = maxDuration + for i := 0; i <= int(maxDuration/step); i++ { + tc.Step(step) + b.Next(id, tc.Now()) + } + + // backoff should be capped at maxDuration + if !b.IsInBackOffSince(id, tc.Now()) { + t.Errorf("expected to be in Backoff got %s", b.Get(id)) + } + + lastUpdate := tc.Now() + tc.Step(2*maxDuration + step) // time += 11s, 11 > 2*maxDuration + if b.IsInBackOffSince(id, lastUpdate) { + t.Errorf("expected to not be in Backoff after reset (start=%s, now=%s, lastUpdate=%s), got %s", startTime, tc.Now(), lastUpdate, b.Get(id)) + } +} + +func TestBackoffHighWaterMark(t *testing.T) { + id := "_idHiWaterMark" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 5 * step + b := NewFakeBackOff(step, maxDuration, tc) + + // get to backoff = maxDuration + for i := 0; i <= int(maxDuration/step); i++ { + tc.Step(step) + b.Next(id, tc.Now()) + } + + // backoff high watermark expires after 2*maxDuration + tc.Step(maxDuration + step) + b.Next(id, tc.Now()) + + if b.Get(id) != maxDuration { + t.Errorf("expected Backoff to stay at high watermark %s got %s", maxDuration, b.Get(id)) + } +} + +func TestBackoffGC(t *testing.T) { + id := "_idGC" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 5 * step + + b := NewFakeBackOff(step, maxDuration, tc) + + for i := 0; i <= int(maxDuration/step); i++ { + tc.Step(step) + b.Next(id, tc.Now()) + } + lastUpdate := tc.Now() + tc.Step(maxDuration + step) + b.GC() + _, found := b.perItemBackoff[id] + if !found { + t.Errorf("expected GC to skip entry, elapsed time=%s maxDuration=%s", tc.Now().Sub(lastUpdate), maxDuration) + } + + tc.Step(maxDuration + step) + b.GC() + r, found := b.perItemBackoff[id] + if found { + t.Errorf("expected GC of entry after %s got entry %v", tc.Now().Sub(lastUpdate), r) + } +} + +func TestIsInBackOffSinceUpdate(t *testing.T) { + id := "_idIsInBackOffSinceUpdate" + tc := clock.NewFakeClock(time.Now()) + step := time.Second + maxDuration := 10 * step + b := NewFakeBackOff(step, maxDuration, tc) + startTime := tc.Now() + + cases := []struct { + tick time.Duration + inBackOff bool + value int + }{ + {tick: 0, inBackOff: false, value: 0}, + {tick: 1, inBackOff: false, value: 1}, + {tick: 2, inBackOff: true, value: 2}, + {tick: 3, inBackOff: false, value: 2}, + {tick: 4, inBackOff: true, value: 4}, + {tick: 5, inBackOff: true, value: 4}, + {tick: 6, inBackOff: true, value: 4}, + {tick: 7, inBackOff: false, value: 4}, + {tick: 8, inBackOff: true, value: 8}, + {tick: 9, inBackOff: true, value: 8}, + {tick: 10, inBackOff: true, value: 8}, + {tick: 11, inBackOff: true, value: 8}, + {tick: 12, inBackOff: true, value: 8}, + {tick: 13, inBackOff: true, value: 8}, + {tick: 14, inBackOff: true, value: 8}, + {tick: 15, inBackOff: false, value: 8}, + {tick: 16, inBackOff: true, value: 10}, + {tick: 17, inBackOff: true, value: 10}, + {tick: 18, inBackOff: true, value: 10}, + {tick: 19, inBackOff: true, value: 10}, + {tick: 20, inBackOff: true, value: 10}, + {tick: 21, inBackOff: true, value: 10}, + {tick: 22, inBackOff: true, value: 10}, + {tick: 23, inBackOff: true, value: 10}, + {tick: 24, inBackOff: true, value: 10}, + {tick: 25, inBackOff: false, value: 10}, + {tick: 26, inBackOff: true, value: 10}, + {tick: 27, inBackOff: true, value: 10}, + {tick: 28, inBackOff: true, value: 10}, + {tick: 29, inBackOff: true, value: 10}, + {tick: 30, inBackOff: true, value: 10}, + {tick: 31, inBackOff: true, value: 10}, + {tick: 32, inBackOff: true, value: 10}, + {tick: 33, inBackOff: true, value: 10}, + {tick: 34, inBackOff: true, value: 10}, + {tick: 35, inBackOff: false, value: 10}, + {tick: 56, inBackOff: false, value: 0}, + {tick: 57, inBackOff: false, value: 1}, + } + + for _, c := range cases { + tc.SetTime(startTime.Add(c.tick * step)) + if c.inBackOff != b.IsInBackOffSinceUpdate(id, tc.Now()) { + t.Errorf("expected IsInBackOffSinceUpdate %v got %v at tick %s", c.inBackOff, b.IsInBackOffSinceUpdate(id, tc.Now()), c.tick*step) + } + + if c.inBackOff && (time.Duration(c.value)*step != b.Get(id)) { + t.Errorf("expected backoff value=%s got %s at tick %s", time.Duration(c.value)*step, b.Get(id), c.tick*step) + } + + if !c.inBackOff { + b.Next(id, tc.Now()) + } + } +} diff --git a/vendor/k8s.io/client-go/util/flowcontrol/throttle_test.go b/vendor/k8s.io/client-go/util/flowcontrol/throttle_test.go new file mode 100644 index 00000000..99cf64d6 --- /dev/null +++ b/vendor/k8s.io/client-go/util/flowcontrol/throttle_test.go @@ -0,0 +1,153 @@ +/* +Copyright 2014 The Kubernetes Authors. + +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 flowcontrol + +import ( + "sync" + "testing" + "time" +) + +func TestMultithreadedThrottling(t *testing.T) { + // Bucket with 100QPS and no burst + r := NewTokenBucketRateLimiter(100, 1) + + // channel to collect 100 tokens + taken := make(chan bool, 100) + + // Set up goroutines to hammer the throttler + startCh := make(chan bool) + endCh := make(chan bool) + for i := 0; i < 10; i++ { + go func() { + // wait for the starting signal + <-startCh + for { + // get a token + r.Accept() + select { + // try to add it to the taken channel + case taken <- true: + continue + // if taken is full, notify and return + default: + endCh <- true + return + } + } + }() + } + + // record wall time + startTime := time.Now() + // take the initial capacity so all tokens are the result of refill + r.Accept() + // start the thundering herd + close(startCh) + // wait for the first signal that we collected 100 tokens + <-endCh + // record wall time + endTime := time.Now() + + // tolerate a 1% clock change because these things happen + if duration := endTime.Sub(startTime); duration < (time.Second * 99 / 100) { + // We shouldn't be able to get 100 tokens out of the bucket in less than 1 second of wall clock time, no matter what + t.Errorf("Expected it to take at least 1 second to get 100 tokens, took %v", duration) + } else { + t.Logf("Took %v to get 100 tokens", duration) + } +} + +func TestBasicThrottle(t *testing.T) { + r := NewTokenBucketRateLimiter(1, 3) + for i := 0; i < 3; i++ { + if !r.TryAccept() { + t.Error("unexpected false accept") + } + } + if r.TryAccept() { + t.Error("unexpected true accept") + } +} + +func TestIncrementThrottle(t *testing.T) { + r := NewTokenBucketRateLimiter(1, 1) + if !r.TryAccept() { + t.Error("unexpected false accept") + } + if r.TryAccept() { + t.Error("unexpected true accept") + } + + // Allow to refill + time.Sleep(2 * time.Second) + + if !r.TryAccept() { + t.Error("unexpected false accept") + } +} + +func TestThrottle(t *testing.T) { + r := NewTokenBucketRateLimiter(10, 5) + + // Should consume 5 tokens immediately, then + // the remaining 11 should take at least 1 second (0.1s each) + expectedFinish := time.Now().Add(time.Second * 1) + for i := 0; i < 16; i++ { + r.Accept() + } + if time.Now().Before(expectedFinish) { + t.Error("rate limit was not respected, finished too early") + } +} + +func TestAlwaysFake(t *testing.T) { + rl := NewFakeAlwaysRateLimiter() + if !rl.TryAccept() { + t.Error("TryAccept in AlwaysFake should return true.") + } + // If this will block the test will timeout + rl.Accept() +} + +func TestNeverFake(t *testing.T) { + rl := NewFakeNeverRateLimiter() + if rl.TryAccept() { + t.Error("TryAccept in NeverFake should return false.") + } + + finished := false + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + rl.Accept() + finished = true + wg.Done() + }() + + // Wait some time to make sure it never finished. + time.Sleep(time.Second) + if finished { + t.Error("Accept should block forever in NeverFake.") + } + + rl.Stop() + wg.Wait() + if !finished { + t.Error("Stop should make Accept unblock in NeverFake.") + } +} diff --git a/vendor/k8s.io/client-go/util/integer/BUILD b/vendor/k8s.io/client-go/util/integer/BUILD index 8a2105e4..338cd1b8 100644 --- a/vendor/k8s.io/client-go/util/integer/BUILD +++ b/vendor/k8s.io/client-go/util/integer/BUILD @@ -15,6 +15,7 @@ go_test( go_library( name = "go_default_library", srcs = ["integer.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/integer", importpath = "k8s.io/client-go/util/integer", ) diff --git a/vendor/k8s.io/client-go/util/integer/integer_test.go b/vendor/k8s.io/client-go/util/integer/integer_test.go new file mode 100644 index 00000000..e9f58688 --- /dev/null +++ b/vendor/k8s.io/client-go/util/integer/integer_test.go @@ -0,0 +1,244 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 integer + +import "testing" + +func TestIntMax(t *testing.T) { + tests := []struct { + nums []int + expectedMax int + }{ + { + nums: []int{-1, 0}, + expectedMax: 0, + }, + { + nums: []int{-1, -2}, + expectedMax: -1, + }, + { + nums: []int{0, 1}, + expectedMax: 1, + }, + { + nums: []int{1, 2}, + expectedMax: 2, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if max := IntMax(test.nums[0], test.nums[1]); max != test.expectedMax { + t.Errorf("expected %v, got %v", test.expectedMax, max) + } + } +} + +func TestIntMin(t *testing.T) { + tests := []struct { + nums []int + expectedMin int + }{ + { + nums: []int{-1, 0}, + expectedMin: -1, + }, + { + nums: []int{-1, -2}, + expectedMin: -2, + }, + { + nums: []int{0, 1}, + expectedMin: 0, + }, + { + nums: []int{1, 2}, + expectedMin: 1, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if min := IntMin(test.nums[0], test.nums[1]); min != test.expectedMin { + t.Errorf("expected %v, got %v", test.expectedMin, min) + } + } +} + +func TestInt32Max(t *testing.T) { + tests := []struct { + nums []int32 + expectedMax int32 + }{ + { + nums: []int32{-1, 0}, + expectedMax: 0, + }, + { + nums: []int32{-1, -2}, + expectedMax: -1, + }, + { + nums: []int32{0, 1}, + expectedMax: 1, + }, + { + nums: []int32{1, 2}, + expectedMax: 2, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if max := Int32Max(test.nums[0], test.nums[1]); max != test.expectedMax { + t.Errorf("expected %v, got %v", test.expectedMax, max) + } + } +} + +func TestInt32Min(t *testing.T) { + tests := []struct { + nums []int32 + expectedMin int32 + }{ + { + nums: []int32{-1, 0}, + expectedMin: -1, + }, + { + nums: []int32{-1, -2}, + expectedMin: -2, + }, + { + nums: []int32{0, 1}, + expectedMin: 0, + }, + { + nums: []int32{1, 2}, + expectedMin: 1, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if min := Int32Min(test.nums[0], test.nums[1]); min != test.expectedMin { + t.Errorf("expected %v, got %v", test.expectedMin, min) + } + } +} + +func TestInt64Max(t *testing.T) { + tests := []struct { + nums []int64 + expectedMax int64 + }{ + { + nums: []int64{-1, 0}, + expectedMax: 0, + }, + { + nums: []int64{-1, -2}, + expectedMax: -1, + }, + { + nums: []int64{0, 1}, + expectedMax: 1, + }, + { + nums: []int64{1, 2}, + expectedMax: 2, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if max := Int64Max(test.nums[0], test.nums[1]); max != test.expectedMax { + t.Errorf("expected %v, got %v", test.expectedMax, max) + } + } +} + +func TestInt64Min(t *testing.T) { + tests := []struct { + nums []int64 + expectedMin int64 + }{ + { + nums: []int64{-1, 0}, + expectedMin: -1, + }, + { + nums: []int64{-1, -2}, + expectedMin: -2, + }, + { + nums: []int64{0, 1}, + expectedMin: 0, + }, + { + nums: []int64{1, 2}, + expectedMin: 1, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if min := Int64Min(test.nums[0], test.nums[1]); min != test.expectedMin { + t.Errorf("expected %v, got %v", test.expectedMin, min) + } + } +} + +func TestRoundToInt32(t *testing.T) { + tests := []struct { + num float64 + exp int32 + }{ + { + num: 5.5, + exp: 6, + }, + { + num: -3.7, + exp: -4, + }, + { + num: 3.49, + exp: 3, + }, + { + num: -7.9, + exp: -8, + }, + { + num: -4.499999, + exp: -4, + }, + { + num: 0, + exp: 0, + }, + } + + for i, test := range tests { + t.Logf("executing scenario %d", i) + if got := RoundToInt32(test.num); got != test.exp { + t.Errorf("expected %d, got %d", test.exp, got) + } + } +} diff --git a/vendor/k8s.io/client-go/util/retry/BUILD b/vendor/k8s.io/client-go/util/retry/BUILD index d7458131..601c1393 100644 --- a/vendor/k8s.io/client-go/util/retry/BUILD +++ b/vendor/k8s.io/client-go/util/retry/BUILD @@ -9,10 +9,11 @@ load( go_library( name = "go_default_library", srcs = ["util.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/retry", importpath = "k8s.io/client-go/util/retry", deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) @@ -21,9 +22,9 @@ go_test( srcs = ["util_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) diff --git a/vendor/k8s.io/client-go/util/retry/util_test.go b/vendor/k8s.io/client-go/util/retry/util_test.go new file mode 100644 index 00000000..dbb4374f --- /dev/null +++ b/vendor/k8s.io/client-go/util/retry/util_test.go @@ -0,0 +1,71 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 retry + +import ( + "fmt" + "testing" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/wait" +) + +func TestRetryOnConflict(t *testing.T) { + opts := wait.Backoff{Factor: 1.0, Steps: 3} + conflictErr := errors.NewConflict(schema.GroupResource{Resource: "test"}, "other", nil) + + // never returns + err := RetryOnConflict(opts, func() error { + return conflictErr + }) + if err != conflictErr { + t.Errorf("unexpected error: %v", err) + } + + // returns immediately + i := 0 + err = RetryOnConflict(opts, func() error { + i++ + return nil + }) + if err != nil || i != 1 { + t.Errorf("unexpected error: %v", err) + } + + // returns immediately on error + testErr := fmt.Errorf("some other error") + err = RetryOnConflict(opts, func() error { + return testErr + }) + if err != testErr { + t.Errorf("unexpected error: %v", err) + } + + // keeps retrying + i = 0 + err = RetryOnConflict(opts, func() error { + if i < 2 { + i++ + return errors.NewConflict(schema.GroupResource{Resource: "test"}, "other", nil) + } + return nil + }) + if err != nil || i != 2 { + t.Errorf("unexpected error: %v", err) + } +} diff --git a/vendor/k8s.io/client-go/util/workqueue/BUILD b/vendor/k8s.io/client-go/util/workqueue/BUILD index 7fb9fba4..c139977c 100644 --- a/vendor/k8s.io/client-go/util/workqueue/BUILD +++ b/vendor/k8s.io/client-go/util/workqueue/BUILD @@ -11,12 +11,13 @@ go_test( srcs = [ "default_rate_limiters_test.go", "delaying_queue_test.go", + "queue_test.go", "rate_limitting_queue_test.go", ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) @@ -31,20 +32,15 @@ go_library( "queue.go", "rate_limitting_queue.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/util/workqueue", importpath = "k8s.io/client-go/util/workqueue", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/golang.org/x/time/rate:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) -go_test( - name = "go_default_xtest", - srcs = ["queue_test.go"], - deps = ["//vendor/k8s.io/client-go/util/workqueue:go_default_library"], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), diff --git a/vendor/k8s.io/client-go/util/workqueue/default_rate_limiters_test.go b/vendor/k8s.io/client-go/util/workqueue/default_rate_limiters_test.go new file mode 100644 index 00000000..91d34a31 --- /dev/null +++ b/vendor/k8s.io/client-go/util/workqueue/default_rate_limiters_test.go @@ -0,0 +1,184 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 workqueue + +import ( + "testing" + "time" +) + +func TestItemExponentialFailureRateLimiter(t *testing.T) { + limiter := NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1*time.Second) + + if e, a := 1*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 2*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 4*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 8*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 16*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5, limiter.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + if e, a := 1*time.Millisecond, limiter.When("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 2*time.Millisecond, limiter.When("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 2, limiter.NumRequeues("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + limiter.Forget("one") + if e, a := 0, limiter.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 1*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + +} + +func TestItemExponentialFailureRateLimiterOverFlow(t *testing.T) { + limiter := NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1000*time.Second) + for i := 0; i < 5; i++ { + limiter.When("one") + } + if e, a := 32*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + for i := 0; i < 1000; i++ { + limiter.When("overflow1") + } + if e, a := 1000*time.Second, limiter.When("overflow1"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + limiter = NewItemExponentialFailureRateLimiter(1*time.Minute, 1000*time.Hour) + for i := 0; i < 2; i++ { + limiter.When("two") + } + if e, a := 4*time.Minute, limiter.When("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + for i := 0; i < 1000; i++ { + limiter.When("overflow2") + } + if e, a := 1000*time.Hour, limiter.When("overflow2"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + +} + +func TestItemFastSlowRateLimiter(t *testing.T) { + limiter := NewItemFastSlowRateLimiter(5*time.Millisecond, 10*time.Second, 3) + + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 10*time.Second, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 10*time.Second, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5, limiter.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + if e, a := 5*time.Millisecond, limiter.When("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 2, limiter.NumRequeues("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + limiter.Forget("one") + if e, a := 0, limiter.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + +} + +func TestMaxOfRateLimiter(t *testing.T) { + limiter := NewMaxOfRateLimiter( + NewItemFastSlowRateLimiter(5*time.Millisecond, 3*time.Second, 3), + NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1*time.Second), + ) + + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 3*time.Second, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 3*time.Second, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5, limiter.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + if e, a := 5*time.Millisecond, limiter.When("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 2, limiter.NumRequeues("two"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + limiter.Forget("one") + if e, a := 0, limiter.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 5*time.Millisecond, limiter.When("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + +} diff --git a/vendor/k8s.io/client-go/util/workqueue/delaying_queue_test.go b/vendor/k8s.io/client-go/util/workqueue/delaying_queue_test.go new file mode 100644 index 00000000..3c8ebf13 --- /dev/null +++ b/vendor/k8s.io/client-go/util/workqueue/delaying_queue_test.go @@ -0,0 +1,255 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 workqueue + +import ( + "fmt" + "math/rand" + "reflect" + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/wait" +) + +func TestSimpleQueue(t *testing.T) { + fakeClock := clock.NewFakeClock(time.Now()) + q := newDelayingQueue(fakeClock, "") + + first := "foo" + + q.AddAfter(first, 50*time.Millisecond) + if err := waitForWaitingQueueToFill(q); err != nil { + t.Fatalf("unexpected err: %v", err) + } + + if q.Len() != 0 { + t.Errorf("should not have added") + } + + fakeClock.Step(60 * time.Millisecond) + + if err := waitForAdded(q, 1); err != nil { + t.Errorf("should have added") + } + item, _ := q.Get() + q.Done(item) + + // step past the next heartbeat + fakeClock.Step(10 * time.Second) + + err := wait.Poll(1*time.Millisecond, 30*time.Millisecond, func() (done bool, err error) { + if q.Len() > 0 { + return false, fmt.Errorf("added to queue") + } + + return false, nil + }) + if err != wait.ErrWaitTimeout { + t.Errorf("expected timeout, got: %v", err) + } + + if q.Len() != 0 { + t.Errorf("should not have added") + } +} + +func TestDeduping(t *testing.T) { + fakeClock := clock.NewFakeClock(time.Now()) + q := newDelayingQueue(fakeClock, "") + + first := "foo" + + q.AddAfter(first, 50*time.Millisecond) + if err := waitForWaitingQueueToFill(q); err != nil { + t.Fatalf("unexpected err: %v", err) + } + q.AddAfter(first, 70*time.Millisecond) + if err := waitForWaitingQueueToFill(q); err != nil { + t.Fatalf("unexpected err: %v", err) + } + if q.Len() != 0 { + t.Errorf("should not have added") + } + + // step past the first block, we should receive now + fakeClock.Step(60 * time.Millisecond) + if err := waitForAdded(q, 1); err != nil { + t.Errorf("should have added") + } + item, _ := q.Get() + q.Done(item) + + // step past the second add + fakeClock.Step(20 * time.Millisecond) + if q.Len() != 0 { + t.Errorf("should not have added") + } + + // test again, but this time the earlier should override + q.AddAfter(first, 50*time.Millisecond) + q.AddAfter(first, 30*time.Millisecond) + if err := waitForWaitingQueueToFill(q); err != nil { + t.Fatalf("unexpected err: %v", err) + } + if q.Len() != 0 { + t.Errorf("should not have added") + } + + fakeClock.Step(40 * time.Millisecond) + if err := waitForAdded(q, 1); err != nil { + t.Errorf("should have added") + } + item, _ = q.Get() + q.Done(item) + + // step past the second add + fakeClock.Step(20 * time.Millisecond) + if q.Len() != 0 { + t.Errorf("should not have added") + } + if q.Len() != 0 { + t.Errorf("should not have added") + } +} + +func TestAddTwoFireEarly(t *testing.T) { + fakeClock := clock.NewFakeClock(time.Now()) + q := newDelayingQueue(fakeClock, "") + + first := "foo" + second := "bar" + third := "baz" + + q.AddAfter(first, 1*time.Second) + q.AddAfter(second, 50*time.Millisecond) + if err := waitForWaitingQueueToFill(q); err != nil { + t.Fatalf("unexpected err: %v", err) + } + + if q.Len() != 0 { + t.Errorf("should not have added") + } + + fakeClock.Step(60 * time.Millisecond) + + if err := waitForAdded(q, 1); err != nil { + t.Fatalf("unexpected err: %v", err) + } + item, _ := q.Get() + if !reflect.DeepEqual(item, second) { + t.Errorf("expected %v, got %v", second, item) + } + + q.AddAfter(third, 2*time.Second) + + fakeClock.Step(1 * time.Second) + if err := waitForAdded(q, 1); err != nil { + t.Fatalf("unexpected err: %v", err) + } + item, _ = q.Get() + if !reflect.DeepEqual(item, first) { + t.Errorf("expected %v, got %v", first, item) + } + + fakeClock.Step(2 * time.Second) + if err := waitForAdded(q, 1); err != nil { + t.Fatalf("unexpected err: %v", err) + } + item, _ = q.Get() + if !reflect.DeepEqual(item, third) { + t.Errorf("expected %v, got %v", third, item) + } +} + +func TestCopyShifting(t *testing.T) { + fakeClock := clock.NewFakeClock(time.Now()) + q := newDelayingQueue(fakeClock, "") + + first := "foo" + second := "bar" + third := "baz" + + q.AddAfter(first, 1*time.Second) + q.AddAfter(second, 500*time.Millisecond) + q.AddAfter(third, 250*time.Millisecond) + if err := waitForWaitingQueueToFill(q); err != nil { + t.Fatalf("unexpected err: %v", err) + } + + if q.Len() != 0 { + t.Errorf("should not have added") + } + + fakeClock.Step(2 * time.Second) + + if err := waitForAdded(q, 3); err != nil { + t.Fatalf("unexpected err: %v", err) + } + actualFirst, _ := q.Get() + if !reflect.DeepEqual(actualFirst, third) { + t.Errorf("expected %v, got %v", third, actualFirst) + } + actualSecond, _ := q.Get() + if !reflect.DeepEqual(actualSecond, second) { + t.Errorf("expected %v, got %v", second, actualSecond) + } + actualThird, _ := q.Get() + if !reflect.DeepEqual(actualThird, first) { + t.Errorf("expected %v, got %v", first, actualThird) + } +} + +func BenchmarkDelayingQueue_AddAfter(b *testing.B) { + r := rand.New(rand.NewSource(time.Now().Unix())) + + fakeClock := clock.NewFakeClock(time.Now()) + q := newDelayingQueue(fakeClock, "") + + // Add items + for n := 0; n < b.N; n++ { + data := fmt.Sprintf("%d", n) + q.AddAfter(data, time.Duration(r.Int63n(int64(10*time.Minute)))) + } + + // Exercise item removal as well + fakeClock.Step(11 * time.Minute) + for n := 0; n < b.N; n++ { + _, _ = q.Get() + } +} + +func waitForAdded(q DelayingInterface, depth int) error { + return wait.Poll(1*time.Millisecond, 10*time.Second, func() (done bool, err error) { + if q.Len() == depth { + return true, nil + } + + return false, nil + }) +} + +func waitForWaitingQueueToFill(q DelayingInterface) error { + return wait.Poll(1*time.Millisecond, 10*time.Second, func() (done bool, err error) { + if len(q.(*delayingType).waitingForAddCh) == 0 { + return true, nil + } + + return false, nil + }) +} diff --git a/vendor/k8s.io/client-go/util/workqueue/parallelizer.go b/vendor/k8s.io/client-go/util/workqueue/parallelizer.go index be668c42..526bd244 100644 --- a/vendor/k8s.io/client-go/util/workqueue/parallelizer.go +++ b/vendor/k8s.io/client-go/util/workqueue/parallelizer.go @@ -17,6 +17,7 @@ limitations under the License. package workqueue import ( + "context" "sync" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -24,9 +25,20 @@ import ( type DoWorkPieceFunc func(piece int) -// Parallelize is a very simple framework that allow for parallelizing +// Parallelize is a very simple framework that allows for parallelizing // N independent pieces of work. func Parallelize(workers, pieces int, doWorkPiece DoWorkPieceFunc) { + ParallelizeUntil(nil, workers, pieces, doWorkPiece) +} + +// ParallelizeUntil is a framework that allows for parallelizing N +// independent pieces of work until done or the context is canceled. +func ParallelizeUntil(ctx context.Context, workers, pieces int, doWorkPiece DoWorkPieceFunc) { + var stop <-chan struct{} + if ctx != nil { + stop = ctx.Done() + } + toProcess := make(chan int, pieces) for i := 0; i < pieces; i++ { toProcess <- i @@ -44,7 +56,12 @@ func Parallelize(workers, pieces int, doWorkPiece DoWorkPieceFunc) { defer utilruntime.HandleCrash() defer wg.Done() for piece := range toProcess { - doWorkPiece(piece) + select { + case <-stop: + return + default: + doWorkPiece(piece) + } } }() } diff --git a/vendor/k8s.io/client-go/util/workqueue/queue_test.go b/vendor/k8s.io/client-go/util/workqueue/queue_test.go new file mode 100644 index 00000000..131f4a2a --- /dev/null +++ b/vendor/k8s.io/client-go/util/workqueue/queue_test.go @@ -0,0 +1,161 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 workqueue_test + +import ( + "sync" + "testing" + "time" + + "k8s.io/client-go/util/workqueue" +) + +func TestBasic(t *testing.T) { + // If something is seriously wrong this test will never complete. + q := workqueue.New() + + // Start producers + const producers = 50 + producerWG := sync.WaitGroup{} + producerWG.Add(producers) + for i := 0; i < producers; i++ { + go func(i int) { + defer producerWG.Done() + for j := 0; j < 50; j++ { + q.Add(i) + time.Sleep(time.Millisecond) + } + }(i) + } + + // Start consumers + const consumers = 10 + consumerWG := sync.WaitGroup{} + consumerWG.Add(consumers) + for i := 0; i < consumers; i++ { + go func(i int) { + defer consumerWG.Done() + for { + item, quit := q.Get() + if item == "added after shutdown!" { + t.Errorf("Got an item added after shutdown.") + } + if quit { + return + } + t.Logf("Worker %v: begin processing %v", i, item) + time.Sleep(3 * time.Millisecond) + t.Logf("Worker %v: done processing %v", i, item) + q.Done(item) + } + }(i) + } + + producerWG.Wait() + q.ShutDown() + q.Add("added after shutdown!") + consumerWG.Wait() +} + +func TestAddWhileProcessing(t *testing.T) { + q := workqueue.New() + + // Start producers + const producers = 50 + producerWG := sync.WaitGroup{} + producerWG.Add(producers) + for i := 0; i < producers; i++ { + go func(i int) { + defer producerWG.Done() + q.Add(i) + }(i) + } + + // Start consumers + const consumers = 10 + consumerWG := sync.WaitGroup{} + consumerWG.Add(consumers) + for i := 0; i < consumers; i++ { + go func(i int) { + defer consumerWG.Done() + // Every worker will re-add every item up to two times. + // This tests the dirty-while-processing case. + counters := map[interface{}]int{} + for { + item, quit := q.Get() + if quit { + return + } + counters[item]++ + if counters[item] < 2 { + q.Add(item) + } + q.Done(item) + } + }(i) + } + + producerWG.Wait() + q.ShutDown() + consumerWG.Wait() +} + +func TestLen(t *testing.T) { + q := workqueue.New() + q.Add("foo") + if e, a := 1, q.Len(); e != a { + t.Errorf("Expected %v, got %v", e, a) + } + q.Add("bar") + if e, a := 2, q.Len(); e != a { + t.Errorf("Expected %v, got %v", e, a) + } + q.Add("foo") // should not increase the queue length. + if e, a := 2, q.Len(); e != a { + t.Errorf("Expected %v, got %v", e, a) + } +} + +func TestReinsert(t *testing.T) { + q := workqueue.New() + q.Add("foo") + + // Start processing + i, _ := q.Get() + if i != "foo" { + t.Errorf("Expected %v, got %v", "foo", i) + } + + // Add it back while processing + q.Add(i) + + // Finish it up + q.Done(i) + + // It should be back on the queue + i, _ = q.Get() + if i != "foo" { + t.Errorf("Expected %v, got %v", "foo", i) + } + + // Finish that one up + q.Done(i) + + if a := q.Len(); a != 0 { + t.Errorf("Expected queue to be empty. Has %v items", a) + } +} diff --git a/vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go b/vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go new file mode 100644 index 00000000..3fbe07d0 --- /dev/null +++ b/vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go @@ -0,0 +1,75 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 workqueue + +import ( + "testing" + "time" + + "k8s.io/apimachinery/pkg/util/clock" +) + +func TestRateLimitingQueue(t *testing.T) { + limiter := NewItemExponentialFailureRateLimiter(1*time.Millisecond, 1*time.Second) + queue := NewRateLimitingQueue(limiter).(*rateLimitingType) + fakeClock := clock.NewFakeClock(time.Now()) + delayingQueue := &delayingType{ + Interface: New(), + clock: fakeClock, + heartbeat: fakeClock.NewTicker(maxWait), + stopCh: make(chan struct{}), + waitingForAddCh: make(chan *waitFor, 1000), + metrics: newRetryMetrics(""), + } + queue.DelayingInterface = delayingQueue + + queue.AddRateLimited("one") + waitEntry := <-delayingQueue.waitingForAddCh + if e, a := 1*time.Millisecond, waitEntry.readyAt.Sub(fakeClock.Now()); e != a { + t.Errorf("expected %v, got %v", e, a) + } + queue.AddRateLimited("one") + waitEntry = <-delayingQueue.waitingForAddCh + if e, a := 2*time.Millisecond, waitEntry.readyAt.Sub(fakeClock.Now()); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := 2, queue.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + queue.AddRateLimited("two") + waitEntry = <-delayingQueue.waitingForAddCh + if e, a := 1*time.Millisecond, waitEntry.readyAt.Sub(fakeClock.Now()); e != a { + t.Errorf("expected %v, got %v", e, a) + } + queue.AddRateLimited("two") + waitEntry = <-delayingQueue.waitingForAddCh + if e, a := 2*time.Millisecond, waitEntry.readyAt.Sub(fakeClock.Now()); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + queue.Forget("one") + if e, a := 0, queue.NumRequeues("one"); e != a { + t.Errorf("expected %v, got %v", e, a) + } + queue.AddRateLimited("one") + waitEntry = <-delayingQueue.waitingForAddCh + if e, a := 1*time.Millisecond, waitEntry.readyAt.Sub(fakeClock.Now()); e != a { + t.Errorf("expected %v, got %v", e, a) + } + +} diff --git a/vendor/k8s.io/csi-api/LICENSE b/vendor/k8s.io/csi-api/LICENSE new file mode 100644 index 00000000..8dada3ed --- /dev/null +++ b/vendor/k8s.io/csi-api/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/BUILD b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/BUILD new file mode 100644 index 00000000..445e43c5 --- /dev/null +++ b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/BUILD @@ -0,0 +1,33 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "register.go", + "types.go", + "zz_generated.deepcopy.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1", + importpath = "k8s.io/csi-api/pkg/apis/csi/v1alpha1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/doc.go b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/doc.go similarity index 68% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/doc.go rename to vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/doc.go index 862aae3e..67f44299 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/doc.go +++ b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,9 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -// +k8s:deepcopy-gen=package -// +k8s:conversion-gen=k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig +// +k8s:deepcopy-gen=package,register +// +groupName=csi.storage.k8s.io // +k8s:openapi-gen=true -// +k8s:defaulter-gen=TypeMeta -package v1beta1 // import "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" +// Package v1alpha1 provides alpha API for CSI API objects. +package v1alpha1 // import "k8s.io/csi-api/pkg/apis/csi/v1alpha1" diff --git a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/register.go b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/register.go similarity index 57% rename from vendor/k8s.io/kubernetes/pkg/apis/componentconfig/register.go rename to vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/register.go index 7ba52b1f..b2ffe63a 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/register.go +++ b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/register.go @@ -1,5 +1,5 @@ /* -Copyright 2015 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,38 +14,49 @@ See the License for the specific language governing permissions and limitations under the License. */ -package componentconfig +package v1alpha1 import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) -var ( - SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) - AddToScheme = SchemeBuilder.AddToScheme -) +const ( + // GroupName is the group name use in this package + GroupName string = "csi.storage.k8s.io" -// GroupName is the group name use in this package -const GroupName = "componentconfig" + // CsiDriverResourcePlural is the plural name of the CSIDriver resource + CsiDriverResourcePlural string = "csidrivers" -// SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} + // CsiNodeInfoResourcePlural is the plural name of the CSINode resource + CsiNodeInfoResourcePlural string = "csinodeinfos" +) -// Kind takes an unqualified kind and returns a Group qualified GroupKind -func Kind(kind string) schema.GroupKind { - return SchemeGroupVersion.WithKind(kind).GroupKind() -} +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"} // Resource takes an unqualified resource and returns a Group qualified GroupResource func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } +var ( + // SchemeBuilder collects schemas to build. + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + // AddToScheme is used by generated client to add this scheme to the generated client. + AddToScheme = SchemeBuilder.AddToScheme +) + +// Adds the list of known types to the given scheme. func addKnownTypes(scheme *runtime.Scheme) error { - // TODO this will get cleaned up with the scheme types are fixed scheme.AddKnownTypes(SchemeGroupVersion, - &KubeSchedulerConfiguration{}, + &CSIDriver{}, + &CSIDriverList{}, + &CSINodeInfo{}, + &CSINodeInfoList{}, ) + + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil } diff --git a/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/types.go b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/types.go new file mode 100644 index 00000000..d2fbe0aa --- /dev/null +++ b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/types.go @@ -0,0 +1,142 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 v1alpha1 + +import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// CSIDriver captures information about a Container Storage Interface (CSI) +// volume driver deployed on the cluster. +// CSIDriver objects are non-namespaced. +type CSIDriver struct { + metav1.TypeMeta `json:",inline"` + + // Standard object metadata. + // metadata.Name indicates the name of the CSI driver that this object + // refers to; it MUST be the same name returned by the CSI GetPluginName() + // call for that driver. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + metav1.ObjectMeta `json:"metadata,omitempty"` + + // Specification of the CSI Driver. + Spec CSIDriverSpec `json:"spec"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// CSIDriverList is a collection of CSIDriver objects. +type CSIDriverList struct { + metav1.TypeMeta `json:",inline"` + + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + // items is the list of CSIDriver + Items []CSIDriver `json:"items"` +} + +// CSIDriverSpec is the specification of a CSIDriver. +type CSIDriverSpec struct { + // attachRequired indicates this CSI volume driver requires an attach + // operation (because it implements the CSI ControllerPublishVolume() + // method), and that Kubernetes should call attach and wait for any attach + // operation to complete before proceeding to mounting. + // If value is not specified, default is false -- meaning attach will not be + // called. + // +optional + AttachRequired *bool `json:"attachRequired"` + + // If specified, podInfoRequiredOnMount indicates this CSI volume driver + // requires additional pod information (like podName, podUID, etc.) during + // mount operations. + // If value is not specified, pod information will not be passed on mount. + // If value is set to a valid version, Kubelet will pass pod information as + // VolumeAttributes in the CSI NodePublishVolume() calls. + // Supported versions: + // Version "v1" will pass the following ValueAttributes + // "csi.storage.k8s.io/pod.name": pod.Name + // "csi.storage.k8s.io/pod.namespace": pod.Namespace + // "csi.storage.k8s.io/pod.uid": string(pod.UID) + // +optional + PodInfoOnMountVersion *string `json:"podInfoOnMountVersion"` +} + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// CSINodeInfo holds information about all CSI drivers installed on a node. +type CSINodeInfo struct { + metav1.TypeMeta `json:",inline"` + + // metadata.name must be the Kubernetes node name. + metav1.ObjectMeta `json:"metadata,omitempty"` + + // List of CSI drivers running on the node and their properties. + // +patchMergeKey=driver + // +patchStrategy=merge + CSIDrivers []CSIDriverInfo `json:"csiDrivers" patchStrategy:"merge" patchMergeKey:"driver"` +} + +// CSIDriverInfo contains information about one CSI driver installed on a node. +type CSIDriverInfo struct { + // driver is the name of the CSI driver that this object refers to. + // This MUST be the same name returned by the CSI GetPluginName() call for + // that driver. + Driver string `json:"driver"` + + // nodeID of the node from the driver point of view. + // This field enables Kubernetes to communicate with storage systems that do + // not share the same nomenclature for nodes. For example, Kubernetes may + // refer to a given node as "node1", but the storage system may refer to + // the same node as "nodeA". When Kubernetes issues a command to the storage + // system to attach a volume to a specific node, it can use this field to + // refer to the node name using the ID that the storage system will + // understand, e.g. "nodeA" instead of "node1". + NodeID string `json:"nodeID"` + + // topologyKeys is the list of keys supported by the driver. + // When a driver is initialized on a cluster, it provides a set of topology + // keys that it understands (e.g. "company.com/zone", "company.com/region"). + // When a driver is initialized on a node it provides the same topology keys + // along with values that kubelet applies to the coresponding node API + // object as labels. + // When Kubernetes does topology aware provisioning, it can use this list to + // determine which labels it should retrieve from the node object and pass + // back to the driver. + TopologyKeys []string `json:"topologyKeys"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// CSINodeInfoList is a collection of CSINodeInfo objects. +type CSINodeInfoList struct { + metav1.TypeMeta `json:",inline"` + + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty"` + + // items is the list of CSINodeInfo + Items []CSINodeInfo `json:"items"` +} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/zz_generated.deepcopy.go similarity index 60% rename from vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.deepcopy.go rename to vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/zz_generated.deepcopy.go index 28a10633..aa9ccbba 100644 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1/zz_generated.deepcopy.go @@ -21,76 +21,65 @@ limitations under the License. package v1alpha1 import ( - v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ContainerMetrics) DeepCopyInto(out *ContainerMetrics) { +func (in *CSIDriver) DeepCopyInto(out *CSIDriver) { *out = *in - if in.Usage != nil { - in, out := &in.Usage, &out.Usage - *out = make(v1.ResourceList, len(*in)) - for key, val := range *in { - (*out)[key] = val.DeepCopy() - } - } + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerMetrics. -func (in *ContainerMetrics) DeepCopy() *ContainerMetrics { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIDriver. +func (in *CSIDriver) DeepCopy() *CSIDriver { if in == nil { return nil } - out := new(ContainerMetrics) + out := new(CSIDriver) in.DeepCopyInto(out) return out } +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *CSIDriver) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeMetrics) DeepCopyInto(out *NodeMetrics) { +func (in *CSIDriverInfo) DeepCopyInto(out *CSIDriverInfo) { *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Timestamp.DeepCopyInto(&out.Timestamp) - out.Window = in.Window - if in.Usage != nil { - in, out := &in.Usage, &out.Usage - *out = make(v1.ResourceList, len(*in)) - for key, val := range *in { - (*out)[key] = val.DeepCopy() - } + if in.TopologyKeys != nil { + in, out := &in.TopologyKeys, &out.TopologyKeys + *out = make([]string, len(*in)) + copy(*out, *in) } return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeMetrics. -func (in *NodeMetrics) DeepCopy() *NodeMetrics { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIDriverInfo. +func (in *CSIDriverInfo) DeepCopy() *CSIDriverInfo { if in == nil { return nil } - out := new(NodeMetrics) + out := new(CSIDriverInfo) in.DeepCopyInto(out) return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NodeMetrics) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeMetricsList) DeepCopyInto(out *NodeMetricsList) { +func (in *CSIDriverList) DeepCopyInto(out *CSIDriverList) { *out = *in out.TypeMeta = in.TypeMeta out.ListMeta = in.ListMeta if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]NodeMetrics, len(*in)) + *out = make([]CSIDriver, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -98,18 +87,18 @@ func (in *NodeMetricsList) DeepCopyInto(out *NodeMetricsList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeMetricsList. -func (in *NodeMetricsList) DeepCopy() *NodeMetricsList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIDriverList. +func (in *CSIDriverList) DeepCopy() *CSIDriverList { if in == nil { return nil } - out := new(NodeMetricsList) + out := new(CSIDriverList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NodeMetricsList) DeepCopyObject() runtime.Object { +func (in *CSIDriverList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -117,15 +106,39 @@ func (in *NodeMetricsList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMetrics) DeepCopyInto(out *PodMetrics) { +func (in *CSIDriverSpec) DeepCopyInto(out *CSIDriverSpec) { + *out = *in + if in.AttachRequired != nil { + in, out := &in.AttachRequired, &out.AttachRequired + *out = new(bool) + **out = **in + } + if in.PodInfoOnMountVersion != nil { + in, out := &in.PodInfoOnMountVersion, &out.PodInfoOnMountVersion + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSIDriverSpec. +func (in *CSIDriverSpec) DeepCopy() *CSIDriverSpec { + if in == nil { + return nil + } + out := new(CSIDriverSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CSINodeInfo) DeepCopyInto(out *CSINodeInfo) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Timestamp.DeepCopyInto(&out.Timestamp) - out.Window = in.Window - if in.Containers != nil { - in, out := &in.Containers, &out.Containers - *out = make([]ContainerMetrics, len(*in)) + if in.CSIDrivers != nil { + in, out := &in.CSIDrivers, &out.CSIDrivers + *out = make([]CSIDriverInfo, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -133,18 +146,18 @@ func (in *PodMetrics) DeepCopyInto(out *PodMetrics) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetrics. -func (in *PodMetrics) DeepCopy() *PodMetrics { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSINodeInfo. +func (in *CSINodeInfo) DeepCopy() *CSINodeInfo { if in == nil { return nil } - out := new(PodMetrics) + out := new(CSINodeInfo) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PodMetrics) DeepCopyObject() runtime.Object { +func (in *CSINodeInfo) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } @@ -152,13 +165,13 @@ func (in *PodMetrics) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMetricsList) DeepCopyInto(out *PodMetricsList) { +func (in *CSINodeInfoList) DeepCopyInto(out *CSINodeInfoList) { *out = *in out.TypeMeta = in.TypeMeta out.ListMeta = in.ListMeta if in.Items != nil { in, out := &in.Items, &out.Items - *out = make([]PodMetrics, len(*in)) + *out = make([]CSINodeInfo, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -166,18 +179,18 @@ func (in *PodMetricsList) DeepCopyInto(out *PodMetricsList) { return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetricsList. -func (in *PodMetricsList) DeepCopy() *PodMetricsList { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSINodeInfoList. +func (in *CSINodeInfoList) DeepCopy() *CSINodeInfoList { if in == nil { return nil } - out := new(PodMetricsList) + out := new(CSINodeInfoList) in.DeepCopyInto(out) return out } // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PodMetricsList) DeepCopyObject() runtime.Object { +func (in *CSINodeInfoList) DeepCopyObject() runtime.Object { if c := in.DeepCopy(); c != nil { return c } diff --git a/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/BUILD b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/BUILD new file mode 100644 index 00000000..ed79e534 --- /dev/null +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/BUILD @@ -0,0 +1,37 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "clientset.go", + "doc.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/client/clientset/versioned", + importpath = "k8s.io/csi-api/pkg/client/clientset/versioned", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/client-go/discovery:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/fake:all-srcs", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/scheme:all-srcs", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/clientset.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/clientset.go similarity index 62% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/clientset.go rename to vendor/k8s.io/csi-api/pkg/client/clientset/versioned/clientset.go index e9a9b600..9d9099a7 100644 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/clientset.go +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/clientset.go @@ -16,46 +16,38 @@ limitations under the License. // Code generated by client-gen. DO NOT EDIT. -package clientset +package versioned import ( discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" - metricsv1alpha1 "k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1" - metricsv1beta1 "k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1" + csiv1alpha1 "k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1" ) type Interface interface { Discovery() discovery.DiscoveryInterface - MetricsV1alpha1() metricsv1alpha1.MetricsV1alpha1Interface - MetricsV1beta1() metricsv1beta1.MetricsV1beta1Interface + CsiV1alpha1() csiv1alpha1.CsiV1alpha1Interface // Deprecated: please explicitly pick a version if possible. - Metrics() metricsv1beta1.MetricsV1beta1Interface + Csi() csiv1alpha1.CsiV1alpha1Interface } // Clientset contains the clients for groups. Each group has exactly one // version included in a Clientset. type Clientset struct { *discovery.DiscoveryClient - metricsV1alpha1 *metricsv1alpha1.MetricsV1alpha1Client - metricsV1beta1 *metricsv1beta1.MetricsV1beta1Client + csiV1alpha1 *csiv1alpha1.CsiV1alpha1Client } -// MetricsV1alpha1 retrieves the MetricsV1alpha1Client -func (c *Clientset) MetricsV1alpha1() metricsv1alpha1.MetricsV1alpha1Interface { - return c.metricsV1alpha1 +// CsiV1alpha1 retrieves the CsiV1alpha1Client +func (c *Clientset) CsiV1alpha1() csiv1alpha1.CsiV1alpha1Interface { + return c.csiV1alpha1 } -// MetricsV1beta1 retrieves the MetricsV1beta1Client -func (c *Clientset) MetricsV1beta1() metricsv1beta1.MetricsV1beta1Interface { - return c.metricsV1beta1 -} - -// Deprecated: Metrics retrieves the default version of MetricsClient. +// Deprecated: Csi retrieves the default version of CsiClient. // Please explicitly pick a version. -func (c *Clientset) Metrics() metricsv1beta1.MetricsV1beta1Interface { - return c.metricsV1beta1 +func (c *Clientset) Csi() csiv1alpha1.CsiV1alpha1Interface { + return c.csiV1alpha1 } // Discovery retrieves the DiscoveryClient @@ -74,11 +66,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { } var cs Clientset var err error - cs.metricsV1alpha1, err = metricsv1alpha1.NewForConfig(&configShallowCopy) - if err != nil { - return nil, err - } - cs.metricsV1beta1, err = metricsv1beta1.NewForConfig(&configShallowCopy) + cs.csiV1alpha1, err = csiv1alpha1.NewForConfig(&configShallowCopy) if err != nil { return nil, err } @@ -94,8 +82,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { // panics if there is an error in the config. func NewForConfigOrDie(c *rest.Config) *Clientset { var cs Clientset - cs.metricsV1alpha1 = metricsv1alpha1.NewForConfigOrDie(c) - cs.metricsV1beta1 = metricsv1beta1.NewForConfigOrDie(c) + cs.csiV1alpha1 = csiv1alpha1.NewForConfigOrDie(c) cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c) return &cs @@ -104,8 +91,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { // New creates a new Clientset for the given RESTClient. func New(c rest.Interface) *Clientset { var cs Clientset - cs.metricsV1alpha1 = metricsv1alpha1.New(c) - cs.metricsV1beta1 = metricsv1beta1.New(c) + cs.csiV1alpha1 = csiv1alpha1.New(c) cs.DiscoveryClient = discovery.NewDiscoveryClient(c) return &cs diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/doc.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/doc.go similarity index 97% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/doc.go rename to vendor/k8s.io/csi-api/pkg/client/clientset/versioned/doc.go index ee865e56..41721ca5 100644 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/doc.go +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/doc.go @@ -17,4 +17,4 @@ limitations under the License. // Code generated by client-gen. DO NOT EDIT. // This package has the automatically generated clientset. -package clientset +package versioned diff --git a/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/BUILD b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/BUILD new file mode 100644 index 00000000..1cdd3540 --- /dev/null +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/BUILD @@ -0,0 +1,34 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "register.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme", + importpath = "k8s.io/csi-api/pkg/client/clientset/versioned/scheme", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/doc.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/doc.go similarity index 100% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/doc.go rename to vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/doc.go diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/register.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/register.go similarity index 82% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/register.go rename to vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/register.go index 78e42962..114f615f 100644 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/register.go +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme/register.go @@ -23,17 +23,15 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - metricsv1alpha1 "k8s.io/metrics/pkg/apis/metrics/v1alpha1" - metricsv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + csiv1alpha1 "k8s.io/csi-api/pkg/apis/csi/v1alpha1" ) var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) - -func init() { - v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - AddToScheme(Scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + csiv1alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -46,11 +44,13 @@ func init() { // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -func AddToScheme(scheme *runtime.Scheme) { - metricsv1alpha1.AddToScheme(scheme) - metricsv1beta1.AddToScheme(scheme) +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(Scheme)) } diff --git a/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/BUILD b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/BUILD new file mode 100644 index 00000000..fb4d6f90 --- /dev/null +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/BUILD @@ -0,0 +1,41 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "csi_client.go", + "csidriver.go", + "csinodeinfo.go", + "doc.go", + "generated_expansion.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1", + importpath = "k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/csi-api/pkg/apis/csi/v1alpha1:go_default_library", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/scheme:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/fake:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/metrics_client.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csi_client.go similarity index 59% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/metrics_client.go rename to vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csi_client.go index a1ba2f52..dcda8c23 100644 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/metrics_client.go +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csi_client.go @@ -21,31 +21,31 @@ package v1alpha1 import ( serializer "k8s.io/apimachinery/pkg/runtime/serializer" rest "k8s.io/client-go/rest" - v1alpha1 "k8s.io/metrics/pkg/apis/metrics/v1alpha1" - "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme" + v1alpha1 "k8s.io/csi-api/pkg/apis/csi/v1alpha1" + "k8s.io/csi-api/pkg/client/clientset/versioned/scheme" ) -type MetricsV1alpha1Interface interface { +type CsiV1alpha1Interface interface { RESTClient() rest.Interface - NodeMetricsesGetter - PodMetricsesGetter + CSIDriversGetter + CSINodeInfosGetter } -// MetricsV1alpha1Client is used to interact with features provided by the metrics group. -type MetricsV1alpha1Client struct { +// CsiV1alpha1Client is used to interact with features provided by the csi.storage.k8s.io group. +type CsiV1alpha1Client struct { restClient rest.Interface } -func (c *MetricsV1alpha1Client) NodeMetricses() NodeMetricsInterface { - return newNodeMetricses(c) +func (c *CsiV1alpha1Client) CSIDrivers() CSIDriverInterface { + return newCSIDrivers(c) } -func (c *MetricsV1alpha1Client) PodMetricses(namespace string) PodMetricsInterface { - return newPodMetricses(c, namespace) +func (c *CsiV1alpha1Client) CSINodeInfos() CSINodeInfoInterface { + return newCSINodeInfos(c) } -// NewForConfig creates a new MetricsV1alpha1Client for the given config. -func NewForConfig(c *rest.Config) (*MetricsV1alpha1Client, error) { +// NewForConfig creates a new CsiV1alpha1Client for the given config. +func NewForConfig(c *rest.Config) (*CsiV1alpha1Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -54,12 +54,12 @@ func NewForConfig(c *rest.Config) (*MetricsV1alpha1Client, error) { if err != nil { return nil, err } - return &MetricsV1alpha1Client{client}, nil + return &CsiV1alpha1Client{client}, nil } -// NewForConfigOrDie creates a new MetricsV1alpha1Client for the given config and +// NewForConfigOrDie creates a new CsiV1alpha1Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *rest.Config) *MetricsV1alpha1Client { +func NewForConfigOrDie(c *rest.Config) *CsiV1alpha1Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -67,9 +67,9 @@ func NewForConfigOrDie(c *rest.Config) *MetricsV1alpha1Client { return client } -// New creates a new MetricsV1alpha1Client for the given RESTClient. -func New(c rest.Interface) *MetricsV1alpha1Client { - return &MetricsV1alpha1Client{c} +// New creates a new CsiV1alpha1Client for the given RESTClient. +func New(c rest.Interface) *CsiV1alpha1Client { + return &CsiV1alpha1Client{c} } func setConfigDefaults(config *rest.Config) error { @@ -87,7 +87,7 @@ func setConfigDefaults(config *rest.Config) error { // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *MetricsV1alpha1Client) RESTClient() rest.Interface { +func (c *CsiV1alpha1Client) RESTClient() rest.Interface { if c == nil { return nil } diff --git a/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csidriver.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csidriver.go new file mode 100644 index 00000000..ffcee619 --- /dev/null +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csidriver.go @@ -0,0 +1,147 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" + v1alpha1 "k8s.io/csi-api/pkg/apis/csi/v1alpha1" + scheme "k8s.io/csi-api/pkg/client/clientset/versioned/scheme" +) + +// CSIDriversGetter has a method to return a CSIDriverInterface. +// A group's client should implement this interface. +type CSIDriversGetter interface { + CSIDrivers() CSIDriverInterface +} + +// CSIDriverInterface has methods to work with CSIDriver resources. +type CSIDriverInterface interface { + Create(*v1alpha1.CSIDriver) (*v1alpha1.CSIDriver, error) + Update(*v1alpha1.CSIDriver) (*v1alpha1.CSIDriver, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.CSIDriver, error) + List(opts v1.ListOptions) (*v1alpha1.CSIDriverList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.CSIDriver, err error) + CSIDriverExpansion +} + +// cSIDrivers implements CSIDriverInterface +type cSIDrivers struct { + client rest.Interface +} + +// newCSIDrivers returns a CSIDrivers +func newCSIDrivers(c *CsiV1alpha1Client) *cSIDrivers { + return &cSIDrivers{ + client: c.RESTClient(), + } +} + +// Get takes name of the cSIDriver, and returns the corresponding cSIDriver object, and an error if there is any. +func (c *cSIDrivers) Get(name string, options v1.GetOptions) (result *v1alpha1.CSIDriver, err error) { + result = &v1alpha1.CSIDriver{} + err = c.client.Get(). + Resource("csidrivers"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of CSIDrivers that match those selectors. +func (c *cSIDrivers) List(opts v1.ListOptions) (result *v1alpha1.CSIDriverList, err error) { + result = &v1alpha1.CSIDriverList{} + err = c.client.Get(). + Resource("csidrivers"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested cSIDrivers. +func (c *cSIDrivers) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Resource("csidrivers"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a cSIDriver and creates it. Returns the server's representation of the cSIDriver, and an error, if there is any. +func (c *cSIDrivers) Create(cSIDriver *v1alpha1.CSIDriver) (result *v1alpha1.CSIDriver, err error) { + result = &v1alpha1.CSIDriver{} + err = c.client.Post(). + Resource("csidrivers"). + Body(cSIDriver). + Do(). + Into(result) + return +} + +// Update takes the representation of a cSIDriver and updates it. Returns the server's representation of the cSIDriver, and an error, if there is any. +func (c *cSIDrivers) Update(cSIDriver *v1alpha1.CSIDriver) (result *v1alpha1.CSIDriver, err error) { + result = &v1alpha1.CSIDriver{} + err = c.client.Put(). + Resource("csidrivers"). + Name(cSIDriver.Name). + Body(cSIDriver). + Do(). + Into(result) + return +} + +// Delete takes name of the cSIDriver and deletes it. Returns an error if one occurs. +func (c *cSIDrivers) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Resource("csidrivers"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *cSIDrivers) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Resource("csidrivers"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched cSIDriver. +func (c *cSIDrivers) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.CSIDriver, err error) { + result = &v1alpha1.CSIDriver{} + err = c.client.Patch(pt). + Resource("csidrivers"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csinodeinfo.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csinodeinfo.go new file mode 100644 index 00000000..8580127c --- /dev/null +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/csinodeinfo.go @@ -0,0 +1,147 @@ +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" + v1alpha1 "k8s.io/csi-api/pkg/apis/csi/v1alpha1" + scheme "k8s.io/csi-api/pkg/client/clientset/versioned/scheme" +) + +// CSINodeInfosGetter has a method to return a CSINodeInfoInterface. +// A group's client should implement this interface. +type CSINodeInfosGetter interface { + CSINodeInfos() CSINodeInfoInterface +} + +// CSINodeInfoInterface has methods to work with CSINodeInfo resources. +type CSINodeInfoInterface interface { + Create(*v1alpha1.CSINodeInfo) (*v1alpha1.CSINodeInfo, error) + Update(*v1alpha1.CSINodeInfo) (*v1alpha1.CSINodeInfo, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1alpha1.CSINodeInfo, error) + List(opts v1.ListOptions) (*v1alpha1.CSINodeInfoList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.CSINodeInfo, err error) + CSINodeInfoExpansion +} + +// cSINodeInfos implements CSINodeInfoInterface +type cSINodeInfos struct { + client rest.Interface +} + +// newCSINodeInfos returns a CSINodeInfos +func newCSINodeInfos(c *CsiV1alpha1Client) *cSINodeInfos { + return &cSINodeInfos{ + client: c.RESTClient(), + } +} + +// Get takes name of the cSINodeInfo, and returns the corresponding cSINodeInfo object, and an error if there is any. +func (c *cSINodeInfos) Get(name string, options v1.GetOptions) (result *v1alpha1.CSINodeInfo, err error) { + result = &v1alpha1.CSINodeInfo{} + err = c.client.Get(). + Resource("csinodeinfos"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of CSINodeInfos that match those selectors. +func (c *cSINodeInfos) List(opts v1.ListOptions) (result *v1alpha1.CSINodeInfoList, err error) { + result = &v1alpha1.CSINodeInfoList{} + err = c.client.Get(). + Resource("csinodeinfos"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested cSINodeInfos. +func (c *cSINodeInfos) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Resource("csinodeinfos"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a cSINodeInfo and creates it. Returns the server's representation of the cSINodeInfo, and an error, if there is any. +func (c *cSINodeInfos) Create(cSINodeInfo *v1alpha1.CSINodeInfo) (result *v1alpha1.CSINodeInfo, err error) { + result = &v1alpha1.CSINodeInfo{} + err = c.client.Post(). + Resource("csinodeinfos"). + Body(cSINodeInfo). + Do(). + Into(result) + return +} + +// Update takes the representation of a cSINodeInfo and updates it. Returns the server's representation of the cSINodeInfo, and an error, if there is any. +func (c *cSINodeInfos) Update(cSINodeInfo *v1alpha1.CSINodeInfo) (result *v1alpha1.CSINodeInfo, err error) { + result = &v1alpha1.CSINodeInfo{} + err = c.client.Put(). + Resource("csinodeinfos"). + Name(cSINodeInfo.Name). + Body(cSINodeInfo). + Do(). + Into(result) + return +} + +// Delete takes name of the cSINodeInfo and deletes it. Returns an error if one occurs. +func (c *cSINodeInfos) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Resource("csinodeinfos"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *cSINodeInfos) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Resource("csinodeinfos"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched cSINodeInfo. +func (c *cSINodeInfos) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.CSINodeInfo, err error) { + result = &v1alpha1.CSINodeInfo{} + err = c.client.Patch(pt). + Resource("csinodeinfos"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/doc.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/doc.go similarity index 100% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/doc.go rename to vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/doc.go diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/generated_expansion.go b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/generated_expansion.go similarity index 89% rename from vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/generated_expansion.go rename to vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/generated_expansion.go index e8fc33bb..efa8eeda 100644 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/generated_expansion.go +++ b/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1/generated_expansion.go @@ -18,6 +18,6 @@ limitations under the License. package v1alpha1 -type NodeMetricsExpansion interface{} +type CSIDriverExpansion interface{} -type PodMetricsExpansion interface{} +type CSINodeInfoExpansion interface{} diff --git a/vendor/k8s.io/kube-openapi/pkg/common/BUILD b/vendor/k8s.io/kube-openapi/pkg/common/BUILD index 0111987d..fe28bbeb 100644 --- a/vendor/k8s.io/kube-openapi/pkg/common/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/common/BUILD @@ -6,6 +6,7 @@ go_library( "common.go", "doc.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-openapi/pkg/common", importpath = "k8s.io/kube-openapi/pkg/common", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/k8s.io/kube-openapi/pkg/util/proto/BUILD b/vendor/k8s.io/kube-openapi/pkg/util/proto/BUILD index 1dc6f53a..c52888c2 100644 --- a/vendor/k8s.io/kube-openapi/pkg/util/proto/BUILD +++ b/vendor/k8s.io/kube-openapi/pkg/util/proto/BUILD @@ -7,6 +7,7 @@ go_library( "document.go", "openapi.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/kube-openapi/pkg/util/proto", importpath = "k8s.io/kube-openapi/pkg/util/proto", visibility = ["//visibility:public"], deps = [ diff --git a/vendor/k8s.io/kubelet/LICENSE b/vendor/k8s.io/kubelet/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/k8s.io/kubelet/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/k8s.io/kubelet/config/v1beta1/BUILD b/vendor/k8s.io/kubelet/config/v1beta1/BUILD new file mode 100644 index 00000000..af57c42e --- /dev/null +++ b/vendor/k8s.io/kubelet/config/v1beta1/BUILD @@ -0,0 +1,34 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "register.go", + "types.go", + "zz_generated.deepcopy.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/kubelet/config/v1beta1", + importpath = "k8s.io/kubelet/config/v1beta1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/vendor/k8s.io/kubelet/config/v1beta1/doc.go b/vendor/k8s.io/kubelet/config/v1beta1/doc.go new file mode 100644 index 00000000..5644377d --- /dev/null +++ b/vendor/k8s.io/kubelet/config/v1beta1/doc.go @@ -0,0 +1,21 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:openapi-gen=true +// +groupName=kubelet.config.k8s.io + +package v1beta1 // import "k8s.io/kubelet/config/v1beta1" diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/register.go b/vendor/k8s.io/kubelet/config/v1beta1/register.go similarity index 57% rename from vendor/k8s.io/metrics/pkg/apis/metrics/register.go rename to vendor/k8s.io/kubelet/config/v1beta1/register.go index 9729b08f..914dfb25 100644 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/register.go +++ b/vendor/k8s.io/kubelet/config/v1beta1/register.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,40 +14,31 @@ See the License for the specific language governing permissions and limitations under the License. */ -package metrics +package v1beta1 import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) -// GroupName is the group name use in this package -const GroupName = "metrics.k8s.io" +// GroupName is the group name used in this package +const GroupName = "kubelet.config.k8s.io" // SchemeGroupVersion is group version used to register these objects -var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} - -// Kind takes an unqualified kind and returns back a Group qualified GroupKind -func Kind(kind string) schema.GroupKind { - return SchemeGroupVersion.WithKind(kind).GroupKind() -} - -// Resource takes an unqualified resource and returns back a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} var ( + // SchemeBuilder is the scheme builder with scheme init functions to run for this API package SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) - AddToScheme = SchemeBuilder.AddToScheme + // AddToScheme is a global function that registers this API group & version to a scheme + AddToScheme = SchemeBuilder.AddToScheme ) +// addKnownTypes registers known types to the given scheme func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, - &NodeMetrics{}, - &NodeMetricsList{}, - &PodMetrics{}, - &PodMetricsList{}, + &KubeletConfiguration{}, + &SerializedNodeConfigSource{}, ) return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/types.go b/vendor/k8s.io/kubelet/config/v1beta1/types.go similarity index 94% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/types.go rename to vendor/k8s.io/kubelet/config/v1beta1/types.go index 2ec949ef..281298f0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/types.go +++ b/vendor/k8s.io/kubelet/config/v1beta1/types.go @@ -39,6 +39,23 @@ const ( HairpinNone = "none" ) +// ResourceChangeDetectionStrategy denotes a mode in which internal +// managers (secret, configmap) are discovering object changes. +type ResourceChangeDetectionStrategy string + +// Enum settings for different strategies of kubelet managers. +const ( + // GetChangeDetectionStrategy is a mode in which kubelet fetches + // necessary objects directly from apiserver. + GetChangeDetectionStrategy ResourceChangeDetectionStrategy = "Get" + // TTLCacheChangeDetectionStrategy is a mode in which kubelet uses + // ttl cache for object directly fetched from apiserver. + TTLCacheChangeDetectionStrategy ResourceChangeDetectionStrategy = "Cache" + // WatchChangeDetectionStrategy is a mode in which kubelet uses + // watches to observe changes to objects that are in its interest. + WatchChangeDetectionStrategy ResourceChangeDetectionStrategy = "Watch" +) + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // KubeletConfiguration contains the configuration for the Kubelet @@ -286,6 +303,19 @@ type KubeletConfiguration struct { // Default: "10s" // +optional NodeStatusUpdateFrequency metav1.Duration `json:"nodeStatusUpdateFrequency,omitempty"` + // nodeLeaseDurationSeconds is the duration the Kubelet will set on its corresponding Lease, + // when the NodeLease feature is enabled. This feature provides an indicator of node + // health by having the Kublet create and periodically renew a lease, named after the node, + // in the kube-node-lease namespace. If the lease expires, the node can be considered unhealthy. + // The lease is currently renewed every 10s, per KEP-0009. In the future, the lease renewal interval + // may be set based on the lease duration. + // Requires the NodeLease feature gate to be enabled. + // Dynamic Kubelet Config (beta): If dynamically updating this field, consider that + // decreasing the duration may reduce tolerance for issues that temporarily prevent + // the Kubelet from renewing the lease (e.g. a short-lived network issue). + // Default: 40 + // +optional + NodeLeaseDurationSeconds int32 `json:"nodeLeaseDurationSeconds,omitempty"` // imageMinimumGCAge is the minimum age for an unused image before it is // garbage collected. // Dynamic Kubelet Config (beta): If dynamically updating this field, consider that @@ -436,6 +466,13 @@ type KubeletConfiguration struct { // Default: true // +optional CPUCFSQuota *bool `json:"cpuCFSQuota,omitempty"` + // CPUCFSQuotaPeriod is the CPU CFS quota period value, cpu.cfs_period_us. + // Dynamic Kubelet Config (beta): If dynamically updating this field, consider that + // limits set for containers will result in different cpu.cfs_quota settings. This + // will trigger container restarts on the node being reconfigured. + // Default: "100ms" + // +optional + CPUCFSQuotaPeriod *metav1.Duration `json:"cpuCFSQuotaPeriod,omitempty"` // maxOpenFiles is Number of files that can be opened by Kubelet process. // Dynamic Kubelet Config (beta): If dynamically updating this field, consider that // it may impact the ability of the Kubelet to interact with the node's filesystem. @@ -612,6 +649,11 @@ type KubeletConfiguration struct { // Default: 5 // +optional ContainerLogMaxFiles *int32 `json:"containerLogMaxFiles,omitempty"` + // ConfigMapAndSecretChangeDetectionStrategy is a mode in which + // config map and secret managers are running. + // Default: "Watching" + // +optional + ConfigMapAndSecretChangeDetectionStrategy ResourceChangeDetectionStrategy `json:"configMapAndSecretChangeDetectionStrategy,omitempty"` /* the following fields are meant for Node Allocatable */ diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go similarity index 85% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.deepcopy.go rename to vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go index f7fc0a79..37be9cb1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package v1beta1 import ( + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -29,12 +30,8 @@ func (in *KubeletAnonymousAuthentication) DeepCopyInto(out *KubeletAnonymousAuth *out = *in if in.Enabled != nil { in, out := &in.Enabled, &out.Enabled - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -96,12 +93,15 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { in, out := &in.StaticPodURLHeader, &out.StaticPodURLHeader *out = make(map[string][]string, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]string, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } if in.TLSCipherSuites != nil { @@ -113,48 +113,28 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { out.Authorization = in.Authorization if in.RegistryPullQPS != nil { in, out := &in.RegistryPullQPS, &out.RegistryPullQPS - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.EventRecordQPS != nil { in, out := &in.EventRecordQPS, &out.EventRecordQPS - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.EnableDebuggingHandlers != nil { in, out := &in.EnableDebuggingHandlers, &out.EnableDebuggingHandlers - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.HealthzPort != nil { in, out := &in.HealthzPort, &out.HealthzPort - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.OOMScoreAdj != nil { in, out := &in.OOMScoreAdj, &out.OOMScoreAdj - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.ClusterDNS != nil { in, out := &in.ClusterDNS, &out.ClusterDNS @@ -166,31 +146,19 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { out.ImageMinimumGCAge = in.ImageMinimumGCAge if in.ImageGCHighThresholdPercent != nil { in, out := &in.ImageGCHighThresholdPercent, &out.ImageGCHighThresholdPercent - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.ImageGCLowThresholdPercent != nil { in, out := &in.ImageGCLowThresholdPercent, &out.ImageGCLowThresholdPercent - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } out.VolumeStatsAggPeriod = in.VolumeStatsAggPeriod if in.CgroupsPerQOS != nil { in, out := &in.CgroupsPerQOS, &out.CgroupsPerQOS - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } out.CPUManagerReconcilePeriod = in.CPUManagerReconcilePeriod if in.QOSReserved != nil { @@ -203,39 +171,28 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { out.RuntimeRequestTimeout = in.RuntimeRequestTimeout if in.PodPidsLimit != nil { in, out := &in.PodPidsLimit, &out.PodPidsLimit - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.CPUCFSQuota != nil { in, out := &in.CPUCFSQuota, &out.CPUCFSQuota - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in + } + if in.CPUCFSQuotaPeriod != nil { + in, out := &in.CPUCFSQuotaPeriod, &out.CPUCFSQuotaPeriod + *out = new(v1.Duration) + **out = **in } if in.KubeAPIQPS != nil { in, out := &in.KubeAPIQPS, &out.KubeAPIQPS - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.SerializeImagePulls != nil { in, out := &in.SerializeImagePulls, &out.SerializeImagePulls - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.EvictionHard != nil { in, out := &in.EvictionHard, &out.EvictionHard @@ -268,39 +225,23 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { } if in.EnableControllerAttachDetach != nil { in, out := &in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.MakeIPTablesUtilChains != nil { in, out := &in.MakeIPTablesUtilChains, &out.MakeIPTablesUtilChains - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.IPTablesMasqueradeBit != nil { in, out := &in.IPTablesMasqueradeBit, &out.IPTablesMasqueradeBit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.IPTablesDropBit != nil { in, out := &in.IPTablesDropBit, &out.IPTablesDropBit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.FeatureGates != nil { in, out := &in.FeatureGates, &out.FeatureGates @@ -311,21 +252,13 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { } if in.FailSwapOn != nil { in, out := &in.FailSwapOn, &out.FailSwapOn - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.ContainerLogMaxFiles != nil { in, out := &in.ContainerLogMaxFiles, &out.ContainerLogMaxFiles - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.SystemReserved != nil { in, out := &in.SystemReserved, &out.SystemReserved @@ -372,12 +305,8 @@ func (in *KubeletWebhookAuthentication) DeepCopyInto(out *KubeletWebhookAuthenti *out = *in if in.Enabled != nil { in, out := &in.Enabled, &out.Enabled - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } out.CacheTTL = in.CacheTTL return diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD index db6e6a9a..42ba81e5 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/BUILD @@ -11,77 +11,34 @@ go_library( srcs = [ "container_runtime.go", "globalflags.go", + "globalflags_linux.go", + "globalflags_other.go", "options.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "globalflags_linux.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "globalflags_other.go", - "osflags_others.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "globalflags_other.go", - "osflags_windows.go", - ], - "//conditions:default": [], - }), + "osflags_others.go", + "osflags_windows.go", + ], importpath = "k8s.io/kubernetes/cmd/kubelet/app/options", deps = [ - "//pkg/apis/componentconfig:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/credentialprovider/azure:go_default_library", "//pkg/credentialprovider/gcp:go_default_library", "//pkg/features:go_default_library", - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/v1beta1:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/validation:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", + "//pkg/kubelet/apis/config/scheme:go_default_library", + "//pkg/kubelet/apis/config/validation:go_default_library", "//pkg/kubelet/config:go_default_library", "//pkg/kubelet/types:go_default_library", "//pkg/master/ports:go_default_library", + "//pkg/util/flag:go_default_library", "//pkg/util/taints:go_default_library", "//pkg/version/verflag:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/flag:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/logs:go_default_library", + "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ "//vendor/github.com/google/cadvisor/container/common:go_default_library", @@ -114,8 +71,8 @@ go_test( srcs = ["options_test.go"], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go index d07cfb69..a811577d 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/container_runtime.go @@ -49,9 +49,12 @@ func NewContainerRuntimeOptions() *config.ContainerRuntimeOptions { RedirectContainerStreaming: false, DockerEndpoint: dockerEndpoint, DockershimRootDirectory: "/var/lib/dockershim", - DockerDisableSharedPID: true, PodSandboxImage: defaultPodSandboxImage, ImagePullProgressDeadline: metav1.Duration{Duration: 1 * time.Minute}, ExperimentalDockershim: false, + + //Alpha feature + CNIBinDir: "/opt/cni/bin", + CNIConfDir: "/etc/cni/net.d", } } diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/globalflags.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/globalflags.go index d088245e..db85071f 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/globalflags.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/globalflags.go @@ -78,12 +78,6 @@ func registerDeprecated(global *flag.FlagSet, local *pflag.FlagSet, globalName, local.Lookup(normalize(globalName)).Deprecated = deprecated } -// pflagRegisterDeprecated registers the flag with pflagRegister, and then marks it deprecated -func pflagRegisterDeprecated(global, local *pflag.FlagSet, globalName, deprecated string) { - pflagRegister(global, local, globalName) - local.Lookup(normalize(globalName)).Deprecated = deprecated -} - // addCredentialProviderFlags adds flags from k8s.io/kubernetes/pkg/credentialprovider func addCredentialProviderFlags(fs *pflag.FlagSet) { // lookup flags in global flag set and re-register the values with our flagset diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go index 048637bd..85d14f5a 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go @@ -27,19 +27,18 @@ import ( "github.com/spf13/pflag" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - utilvalidation "k8s.io/apimachinery/pkg/util/validation" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/apiserver/pkg/util/flag" - "k8s.io/kubernetes/pkg/apis/componentconfig" + "k8s.io/kubelet/config/v1beta1" "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" - kubeletconfigvalidation "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" + kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme" + kubeletconfigvalidation "k8s.io/kubernetes/pkg/kubelet/apis/config/validation" "k8s.io/kubernetes/pkg/kubelet/config" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/kubernetes/pkg/master/ports" + utilflag "k8s.io/kubernetes/pkg/util/flag" utiltaints "k8s.io/kubernetes/pkg/util/taints" ) @@ -121,9 +120,6 @@ type KubeletFlags struct { // is true and upon the initial registration of the node. RegisterWithTaints []core.Taint - // cAdvisorPort is the port of the localhost cAdvisor endpoint (set to 0 to disable) - CAdvisorPort int32 - // WindowsService should be set to true if kubelet is running as a service on Windows. // Its corresponding flag only gets registered in Windows builds. WindowsService bool @@ -239,8 +235,6 @@ func NewKubeletFlags() *KubeletFlags { HostNetworkSources: []string{kubetypes.AllSource}, HostPIDSources: []string{kubetypes.AllSource}, HostIPCSources: []string{kubetypes.AllSource}, - // TODO(#56523:v1.12.0): Remove --cadvisor-port, it has been deprecated since v1.10 - CAdvisorPort: 0, // TODO(#58010:v1.13.0): Remove --allow-privileged, it is deprecated AllowPrivileged: true, // prior to the introduction of this flag, there was a hardcoded cap of 50 images @@ -253,9 +247,6 @@ func ValidateKubeletFlags(f *KubeletFlags) error { if f.DynamicConfigDir.Provided() && !utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { return fmt.Errorf("the DynamicKubeletConfig feature gate must be enabled in order to use the --dynamic-config-dir flag") } - if f.CAdvisorPort != 0 && utilvalidation.IsValidPortNum(int(f.CAdvisorPort)) != nil { - return fmt.Errorf("invalid configuration: CAdvisorPort (--cadvisor-port) %v must be between 0 and 65535, inclusive", f.CAdvisorPort) - } if f.NodeStatusMaxImages < -1 { return fmt.Errorf("invalid configuration: NodeStatusMaxImages (--node-status-max-images) must be -1 or greater") } @@ -395,14 +386,12 @@ func (f *KubeletFlags) AddFlags(mainfs *pflag.FlagSet) { fs.StringVar(&f.LockFilePath, "lock-file", f.LockFilePath, " The path to file for kubelet to use as a lock file.") fs.BoolVar(&f.ExitOnLockContention, "exit-on-lock-contention", f.ExitOnLockContention, "Whether kubelet should exit upon lock-file contention.") fs.StringVar(&f.SeccompProfileRoot, "seccomp-profile-root", f.SeccompProfileRoot, " Directory path for seccomp profiles.") - fs.StringVar(&f.BootstrapCheckpointPath, "bootstrap-checkpoint-path", f.BootstrapCheckpointPath, " Path to to the directory where the checkpoints are stored") + fs.StringVar(&f.BootstrapCheckpointPath, "bootstrap-checkpoint-path", f.BootstrapCheckpointPath, " Path to the directory where the checkpoints are stored") fs.Int32Var(&f.NodeStatusMaxImages, "node-status-max-images", f.NodeStatusMaxImages, " The maximum number of images to report in Node.Status.Images. If -1 is specified, no cap will be applied. Default: 50") // DEPRECATED FLAGS fs.StringVar(&f.BootstrapKubeconfig, "experimental-bootstrap-kubeconfig", f.BootstrapKubeconfig, "") fs.MarkDeprecated("experimental-bootstrap-kubeconfig", "Use --bootstrap-kubeconfig") - fs.Int32Var(&f.CAdvisorPort, "cadvisor-port", f.CAdvisorPort, "The port of the localhost cAdvisor endpoint (set to 0 to disable)") - fs.MarkDeprecated("cadvisor-port", "The default will change to 0 (disabled) in 1.11, and the cadvisor port will be removed entirely in 1.12") fs.DurationVar(&f.MinimumGCAge.Duration, "minimum-container-ttl-duration", f.MinimumGCAge.Duration, "Minimum age for a finished container before it is garbage collected. Examples: '300ms', '10s' or '2h45m'") fs.MarkDeprecated("minimum-container-ttl-duration", "Use --eviction-hard or --eviction-soft instead. Will be removed in a future version.") fs.Int32Var(&f.MaxPerPodContainerCount, "maximum-dead-containers-per-container", f.MaxPerPodContainerCount, "Maximum number of old instances to retain per container. Each container takes up some disk space.") @@ -458,7 +447,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.DurationVar(&c.HTTPCheckFrequency.Duration, "http-check-frequency", c.HTTPCheckFrequency.Duration, "Duration between checking http for new data") fs.StringVar(&c.StaticPodURL, "manifest-url", c.StaticPodURL, "URL for accessing additional Pod specifications to run") fs.Var(flag.NewColonSeparatedMultimapStringString(&c.StaticPodURLHeader), "manifest-url-header", "Comma-separated list of HTTP headers to use when accessing the url provided to --manifest-url. Multiple headers with the same name will be added in the same order provided. This flag can be repeatedly invoked. For example: `--manifest-url-header 'a:hello,b:again,c:world' --manifest-url-header 'b:beautiful'`") - fs.Var(componentconfig.IPVar{Val: &c.Address}, "address", "The IP address for the Kubelet to serve on (set to `0.0.0.0` for all IPv4 interfaces and `::` for all IPv6 interfaces)") + fs.Var(utilflag.IPVar{Val: &c.Address}, "address", "The IP address for the Kubelet to serve on (set to `0.0.0.0` for all IPv4 interfaces and `::` for all IPv6 interfaces)") fs.Int32Var(&c.Port, "port", c.Port, "The port for the Kubelet to serve on.") fs.Int32Var(&c.ReadOnlyPort, "read-only-port", c.ReadOnlyPort, "The read-only port for the Kubelet to serve on with no authentication/authorization (set to 0 to disable)") @@ -489,6 +478,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig "If --tls-cert-file and --tls-private-key-file are not provided, a self-signed certificate and key "+ "are generated for the public address and saved to the directory passed to --cert-dir.") fs.StringVar(&c.TLSPrivateKeyFile, "tls-private-key-file", c.TLSPrivateKeyFile, "File containing x509 private key matching --tls-cert-file.") + fs.BoolVar(&c.ServerTLSBootstrap, "rotate-server-certificates", c.ServerTLSBootstrap, "Auto-request and rotate the kubelet serving certificates by requesting new certificates from the kube-apiserver when the certificate expiration approaches. Requires the RotateKubeletServerCertificate feature gate to be enabled, and approval of the submitted CertificateSigningRequest objects.") tlsCipherPossibleValues := flag.TLSCipherPossibleValues() fs.StringSliceVar(&c.TLSCipherSuites, "tls-cipher-suites", c.TLSCipherSuites, @@ -509,7 +499,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.BoolVar(&c.EnableDebuggingHandlers, "enable-debugging-handlers", c.EnableDebuggingHandlers, "Enables server endpoints for log collection and local running of containers and commands") fs.BoolVar(&c.EnableContentionProfiling, "contention-profiling", c.EnableContentionProfiling, "Enable lock contention profiling, if profiling is enabled") fs.Int32Var(&c.HealthzPort, "healthz-port", c.HealthzPort, "The port of the localhost healthz endpoint (set to 0 to disable)") - fs.Var(componentconfig.IPVar{Val: &c.HealthzBindAddress}, "healthz-bind-address", "The IP address for the healthz server to serve on (set to `0.0.0.0` for all IPv4 interfaces and `::` for all IPv6 interfaces)") + fs.Var(utilflag.IPVar{Val: &c.HealthzBindAddress}, "healthz-bind-address", "The IP address for the healthz server to serve on (set to `0.0.0.0` for all IPv4 interfaces and `::` for all IPv6 interfaces)") fs.Int32Var(&c.OOMScoreAdj, "oom-score-adj", c.OOMScoreAdj, "The oom-score-adj value for kubelet process. Values must be within the range [-1000, 1000]") fs.StringVar(&c.ClusterDomain, "cluster-domain", c.ClusterDomain, "Domain for this cluster. If set, kubelet will configure all containers to search this domain in addition to the host's search domains") @@ -540,6 +530,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.StringVar(&c.ResolverConfig, "resolv-conf", c.ResolverConfig, "Resolver configuration file used as the basis for the container DNS resolution configuration.") fs.BoolVar(&c.CPUCFSQuota, "cpu-cfs-quota", c.CPUCFSQuota, "Enable CPU CFS quota enforcement for containers that specify CPU limits") + fs.DurationVar(&c.CPUCFSQuotaPeriod.Duration, "cpu-cfs-quota-period", c.CPUCFSQuotaPeriod.Duration, "Sets CPU CFS quota period value, cpu.cfs_period_us, defaults to Linux Kernel default") fs.BoolVar(&c.EnableControllerAttachDetach, "enable-controller-attach-detach", c.EnableControllerAttachDetach, "Enables the Attach/Detach controller to manage attachment/detachment of volumes scheduled to this node, and disables kubelet from executing any attach/detach operations") fs.BoolVar(&c.MakeIPTablesUtilChains, "make-iptables-util-chains", c.MakeIPTablesUtilChains, "If true, kubelet will ensure iptables utility rules are present on host.") fs.Int32Var(&c.IPTablesMasqueradeBit, "iptables-masquerade-bit", c.IPTablesMasqueradeBit, "The bit of the fwmark space to mark packets for SNAT. Must be within the range [0, 31]. Please match this parameter with corresponding parameter in kube-proxy.") diff --git a/vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD b/vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD index 0a876889..b02b10a5 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/api/legacyscheme/BUILD @@ -6,8 +6,8 @@ go_library( importpath = "k8s.io/kubernetes/pkg/api/legacyscheme", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD index 15e9597d..737f6c21 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/pod/BUILD @@ -11,9 +11,9 @@ go_library( srcs = ["util.go"], importpath = "k8s.io/kubernetes/pkg/api/v1/pod", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -22,12 +22,12 @@ go_test( srcs = ["util_test.go"], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go b/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go index e8429509..416221d5 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/pod/util.go @@ -209,14 +209,10 @@ func GetContainerStatus(statuses []v1.ContainerStatus, name string) (v1.Containe } // GetExistingContainerStatus extracts the status of container "name" from "statuses", -// and returns empty status if "name" does not exist. +// It also returns if "name" exists. func GetExistingContainerStatus(statuses []v1.ContainerStatus, name string) v1.ContainerStatus { - for i := range statuses { - if statuses[i].Name == name { - return statuses[i] - } - } - return v1.ContainerStatus{} + status, _ := GetContainerStatus(statuses, name) + return status } // IsPodAvailable returns true if a pod is available; false otherwise. diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD index f918e559..7cbc5077 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/resource/BUILD @@ -11,9 +11,9 @@ go_test( srcs = ["helpers_test.go"], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], ) @@ -22,8 +22,8 @@ go_library( srcs = ["helpers.go"], importpath = "k8s.io/kubernetes/pkg/api/v1/resource", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/resource/helpers.go b/vendor/k8s.io/kubernetes/pkg/api/v1/resource/helpers.go index 09d9ea04..6f7c59f5 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/resource/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/resource/helpers.go @@ -25,50 +25,45 @@ import ( "k8s.io/apimachinery/pkg/api/resource" ) -// PodRequestsAndLimits returns a dictionary of all defined resources summed up for all -// containers of the pod. -func PodRequestsAndLimits(pod *v1.Pod) (reqs map[v1.ResourceName]resource.Quantity, limits map[v1.ResourceName]resource.Quantity) { - reqs, limits = map[v1.ResourceName]resource.Quantity{}, map[v1.ResourceName]resource.Quantity{} - for _, container := range pod.Spec.Containers { - for name, quantity := range container.Resources.Requests { - if value, ok := reqs[name]; !ok { - reqs[name] = *quantity.Copy() - } else { - value.Add(quantity) - reqs[name] = value - } +// addResourceList adds the resources in newList to list +func addResourceList(list, new v1.ResourceList) { + for name, quantity := range new { + if value, ok := list[name]; !ok { + list[name] = *quantity.Copy() + } else { + value.Add(quantity) + list[name] = value } - for name, quantity := range container.Resources.Limits { - if value, ok := limits[name]; !ok { - limits[name] = *quantity.Copy() - } else { - value.Add(quantity) - limits[name] = value + } +} + +// maxResourceList sets list to the greater of list/newList for every resource +// either list +func maxResourceList(list, new v1.ResourceList) { + for name, quantity := range new { + if value, ok := list[name]; !ok { + list[name] = *quantity.Copy() + continue + } else { + if quantity.Cmp(value) > 0 { + list[name] = *quantity.Copy() } } } +} + +// PodRequestsAndLimits returns a dictionary of all defined resources summed up for all +// containers of the pod. +func PodRequestsAndLimits(pod *v1.Pod) (reqs, limits v1.ResourceList) { + reqs, limits = v1.ResourceList{}, v1.ResourceList{} + for _, container := range pod.Spec.Containers { + addResourceList(reqs, container.Resources.Requests) + addResourceList(limits, container.Resources.Limits) + } // init containers define the minimum of any resource for _, container := range pod.Spec.InitContainers { - for name, quantity := range container.Resources.Requests { - value, ok := reqs[name] - if !ok { - reqs[name] = *quantity.Copy() - continue - } - if quantity.Cmp(value) > 0 { - reqs[name] = *quantity.Copy() - } - } - for name, quantity := range container.Resources.Limits { - value, ok := limits[name] - if !ok { - limits[name] = *quantity.Copy() - continue - } - if quantity.Cmp(value) > 0 { - limits[name] = *quantity.Copy() - } - } + maxResourceList(reqs, container.Resources.Requests) + maxResourceList(limits, container.Resources.Limits) } return } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/BUILD b/vendor/k8s.io/kubernetes/pkg/api/v1/service/BUILD similarity index 59% rename from vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/BUILD rename to vendor/k8s.io/kubernetes/pkg/api/v1/service/BUILD index 5f6e0c1e..a324d7cc 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/service/BUILD @@ -8,9 +8,22 @@ load( go_library( name = "go_default_library", - srcs = ["files.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files", - deps = ["//pkg/util/filesystem:go_default_library"], + srcs = ["util.go"], + importpath = "k8s.io/kubernetes/pkg/api/v1/service", + deps = [ + "//pkg/util/net/sets:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = ["util_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/util/net/sets:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + ], ) filegroup( @@ -25,13 +38,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -go_test( - name = "go_default_test", - srcs = ["files_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//pkg/util/filesystem:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go b/vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go new file mode 100644 index 00000000..4cb453cf --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/service/util.go @@ -0,0 +1,97 @@ +/* +Copyright 2016 The Kubernetes Authors. + +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 service + +import ( + "fmt" + "strings" + + "k8s.io/api/core/v1" + netsets "k8s.io/kubernetes/pkg/util/net/sets" +) + +const ( + defaultLoadBalancerSourceRanges = "0.0.0.0/0" +) + +// IsAllowAll checks whether the netsets.IPNet allows traffic from 0.0.0.0/0 +func IsAllowAll(ipnets netsets.IPNet) bool { + for _, s := range ipnets.StringSlice() { + if s == "0.0.0.0/0" { + return true + } + } + return false +} + +// GetLoadBalancerSourceRanges first try to parse and verify LoadBalancerSourceRanges field from a service. +// If the field is not specified, turn to parse and verify the AnnotationLoadBalancerSourceRangesKey annotation from a service, +// extracting the source ranges to allow, and if not present returns a default (allow-all) value. +func GetLoadBalancerSourceRanges(service *v1.Service) (netsets.IPNet, error) { + var ipnets netsets.IPNet + var err error + // if SourceRange field is specified, ignore sourceRange annotation + if len(service.Spec.LoadBalancerSourceRanges) > 0 { + specs := service.Spec.LoadBalancerSourceRanges + ipnets, err = netsets.ParseIPNets(specs...) + + if err != nil { + return nil, fmt.Errorf("service.Spec.LoadBalancerSourceRanges: %v is not valid. Expecting a list of IP ranges. For example, 10.0.0.0/24. Error msg: %v", specs, err) + } + } else { + val := service.Annotations[v1.AnnotationLoadBalancerSourceRangesKey] + val = strings.TrimSpace(val) + if val == "" { + val = defaultLoadBalancerSourceRanges + } + specs := strings.Split(val, ",") + ipnets, err = netsets.ParseIPNets(specs...) + if err != nil { + return nil, fmt.Errorf("%s: %s is not valid. Expecting a comma-separated list of source IP ranges. For example, 10.0.0.0/24,192.168.2.0/24", v1.AnnotationLoadBalancerSourceRangesKey, val) + } + } + return ipnets, nil +} + +// RequestsOnlyLocalTraffic checks if service requests OnlyLocal traffic. +func RequestsOnlyLocalTraffic(service *v1.Service) bool { + if service.Spec.Type != v1.ServiceTypeLoadBalancer && + service.Spec.Type != v1.ServiceTypeNodePort { + return false + } + return service.Spec.ExternalTrafficPolicy == v1.ServiceExternalTrafficPolicyTypeLocal +} + +// NeedsHealthCheck checks if service needs health check. +func NeedsHealthCheck(service *v1.Service) bool { + if service.Spec.Type != v1.ServiceTypeLoadBalancer { + return false + } + return RequestsOnlyLocalTraffic(service) +} + +// GetServiceHealthCheckPathPort returns the path and nodePort programmed into the Cloud LB Health Check +func GetServiceHealthCheckPathPort(service *v1.Service) (string, int32) { + if !NeedsHealthCheck(service) { + return "", 0 + } + port := service.Spec.HealthCheckNodePort + if port == 0 { + return "", 0 + } + return "/healthz", port +} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD index dcca30c0..5fed7730 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/BUILD @@ -17,10 +17,10 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/autoscaling", deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -39,6 +39,7 @@ filegroup( "//pkg/apis/autoscaling/install:all-srcs", "//pkg/apis/autoscaling/v1:all-srcs", "//pkg/apis/autoscaling/v2beta1:all-srcs", + "//pkg/apis/autoscaling/v2beta2:all-srcs", "//pkg/apis/autoscaling/validation:all-srcs", ], tags = ["automanaged"], diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/types.go b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/types.go index 5489742d..4ab6f8af 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/types.go @@ -154,13 +154,9 @@ type MetricSpec struct { // ObjectMetricSource indicates how to scale on a metric describing a // kubernetes object (for example, hits-per-second on an Ingress object). type ObjectMetricSource struct { - // Target is the described Kubernetes object. - Target CrossVersionObjectReference - - // MetricName is the name of the metric in question. - MetricName string - // TargetValue is the target value of the metric (as a quantity). - TargetValue resource.Quantity + DescribedObject CrossVersionObjectReference + Target MetricTarget + Metric MetricIdentifier } // PodsMetricSource indicates how to scale on a metric describing each pod in @@ -168,11 +164,10 @@ type ObjectMetricSource struct { // The values will be averaged together before being compared to the target // value. type PodsMetricSource struct { - // MetricName is the name of the metric in question - MetricName string - // TargetAverageValue is the target value of the average of the - // metric across all relevant pods (as a quantity) - TargetAverageValue resource.Quantity + // metric identifies the target metric by name and selector + Metric MetricIdentifier + // target specifies the target value for the given metric + Target MetricTarget } // ResourceMetricSource indicates how to scale on a resource metric known to @@ -185,38 +180,57 @@ type PodsMetricSource struct { type ResourceMetricSource struct { // Name is the name of the resource in question. Name api.ResourceName - // TargetAverageUtilization is the target value of the average of the - // resource metric across all relevant pods, represented as a percentage of - // the requested value of the resource for the pods. - // +optional - TargetAverageUtilization *int32 - // TargetAverageValue is the target value of the average of the - // resource metric across all relevant pods, as a raw value (instead of as - // a percentage of the request), similar to the "pods" metric source type. - // +optional - TargetAverageValue *resource.Quantity + // Target specifies the target value for the given metric + Target MetricTarget } // ExternalMetricSource indicates how to scale on a metric not associated with // any Kubernetes object (for example length of queue in cloud // messaging service, or QPS from loadbalancer running outside of cluster). type ExternalMetricSource struct { - // metricName is the name of the metric in question. - MetricName string - // MetricSelector is used to identify a specific time series - // within a given metric. - // +optional - MetricSelector *metav1.LabelSelector - // TargetValue is the target value of the metric (as a quantity). - // Mutually exclusive with TargetAverageValue. - // +optional - TargetValue *resource.Quantity - // TargetAverageValue is the target per-pod value of global metric (as a quantity). - // Mutually exclusive with TargetValue. + // Metric identifies the target metric by name and selector + Metric MetricIdentifier + // Target specifies the target value for the given metric + Target MetricTarget +} + +// MetricIdentifier defines the name and optionally selector for a metric +type MetricIdentifier struct { + // Name is the name of the given metric + Name string + // Selector is the selector for the given metric + // it is the string-encoded form of a standard kubernetes label selector // +optional - TargetAverageValue *resource.Quantity + Selector *metav1.LabelSelector } +// MetricTarget defines the target value, average value, or average utilization of a specific metric +type MetricTarget struct { + // Type represents whether the metric type is Utilization, Value, or AverageValue + Type MetricTargetType + // Value is the target value of the metric (as a quantity). + Value *resource.Quantity + // TargetAverageValue is the target value of the average of the + // metric across all relevant pods (as a quantity) + AverageValue *resource.Quantity + + // AverageUtilization is the target value of the average of the + // resource metric across all relevant pods, represented as a percentage of + // the requested value of the resource for the pods. + // Currently only valid for Resource metric source type + AverageUtilization *int32 +} + +// MetricTargetType specifies the type of metric being targeted, and should be either +// "Value", "AverageValue", or "Utilization" +type MetricTargetType string + +var ( + UtilizationMetricType MetricTargetType = "Utilization" + ValueMetricType MetricTargetType = "Value" + AverageValueMetricType MetricTargetType = "AverageValue" +) + // HorizontalPodAutoscalerStatus describes the current status of a horizontal pod autoscaler. type HorizontalPodAutoscalerStatus struct { // ObservedGeneration is the most recent generation observed by this autoscaler. @@ -237,6 +251,7 @@ type HorizontalPodAutoscalerStatus struct { DesiredReplicas int32 // CurrentMetrics is the last read state of the metrics used by this autoscaler. + // +optional CurrentMetrics []MetricStatus // Conditions is the set of conditions required for this autoscaler to scale its target, @@ -327,23 +342,17 @@ type MetricStatus struct { // ObjectMetricStatus indicates the current value of a metric describing a // kubernetes object (for example, hits-per-second on an Ingress object). type ObjectMetricStatus struct { - // Target is the described Kubernetes object. - Target CrossVersionObjectReference + Metric MetricIdentifier + Current MetricValueStatus - // MetricName is the name of the metric in question. - MetricName string - // CurrentValue is the current value of the metric (as a quantity). - CurrentValue resource.Quantity + DescribedObject CrossVersionObjectReference } // PodsMetricStatus indicates the current value of a metric describing each pod in // the current scale target (for example, transactions-processed-per-second). type PodsMetricStatus struct { - // MetricName is the name of the metric in question - MetricName string - // CurrentAverageValue is the current value of the average of the - // metric across all relevant pods (as a quantity) - CurrentAverageValue resource.Quantity + Metric MetricIdentifier + Current MetricValueStatus } // ResourceMetricStatus indicates the current value of a resource metric known to @@ -353,36 +362,21 @@ type PodsMetricStatus struct { // normal per-pod metrics using the "pods" source. type ResourceMetricStatus struct { // Name is the name of the resource in question. - Name api.ResourceName - // CurrentAverageUtilization is the current value of the average of the - // resource metric across all relevant pods, represented as a percentage of - // the requested value of the resource for the pods. It will only be - // present if `targetAverageValue` was set in the corresponding metric - // specification. - // +optional - CurrentAverageUtilization *int32 - // CurrentAverageValue is the current value of the average of the - // resource metric across all relevant pods, as a raw value (instead of as - // a percentage of the request), similar to the "pods" metric source type. - // It will always be set, regardless of the corresponding metric specification. - CurrentAverageValue resource.Quantity + Name api.ResourceName + Current MetricValueStatus } // ExternalMetricStatus indicates the current value of a global metric // not associated with any Kubernetes object. type ExternalMetricStatus struct { - // MetricName is the name of a metric used for autoscaling in - // metric system. - MetricName string - // MetricSelector is used to identify a specific time series - // within a given metric. - // +optional - MetricSelector *metav1.LabelSelector - // CurrentValue is the current value of the metric (as a quantity) - CurrentValue resource.Quantity - // CurrentAverageValue is the current value of metric averaged over autoscaled pods. - // +optional - CurrentAverageValue *resource.Quantity + Metric MetricIdentifier + Current MetricValueStatus +} + +type MetricValueStatus struct { + Value *resource.Quantity + AverageValue *resource.Quantity + AverageUtilization *int32 } // +genclient diff --git a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/zz_generated.deepcopy.go index 12c518d3..03b8cd8b 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/zz_generated.deepcopy.go @@ -44,33 +44,8 @@ func (in *CrossVersionObjectReference) DeepCopy() *CrossVersionObjectReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ExternalMetricSource) DeepCopyInto(out *ExternalMetricSource) { *out = *in - if in.MetricSelector != nil { - in, out := &in.MetricSelector, &out.MetricSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } - } - if in.TargetValue != nil { - in, out := &in.TargetValue, &out.TargetValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } - } - if in.TargetAverageValue != nil { - in, out := &in.TargetAverageValue, &out.TargetAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } - } + in.Metric.DeepCopyInto(&out.Metric) + in.Target.DeepCopyInto(&out.Target) return } @@ -87,25 +62,8 @@ func (in *ExternalMetricSource) DeepCopy() *ExternalMetricSource { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ExternalMetricStatus) DeepCopyInto(out *ExternalMetricStatus) { *out = *in - if in.MetricSelector != nil { - in, out := &in.MetricSelector, &out.MetricSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } - } - out.CurrentValue = in.CurrentValue.DeepCopy() - if in.CurrentAverageValue != nil { - in, out := &in.CurrentAverageValue, &out.CurrentAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } - } + in.Metric.DeepCopyInto(&out.Metric) + in.Current.DeepCopyInto(&out.Current) return } @@ -203,12 +161,8 @@ func (in *HorizontalPodAutoscalerSpec) DeepCopyInto(out *HorizontalPodAutoscaler out.ScaleTargetRef = in.ScaleTargetRef if in.MinReplicas != nil { in, out := &in.MinReplicas, &out.MinReplicas - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Metrics != nil { in, out := &in.Metrics, &out.Metrics @@ -235,20 +189,12 @@ func (in *HorizontalPodAutoscalerStatus) DeepCopyInto(out *HorizontalPodAutoscal *out = *in if in.ObservedGeneration != nil { in, out := &in.ObservedGeneration, &out.ObservedGeneration - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.LastScaleTime != nil { in, out := &in.LastScaleTime, &out.LastScaleTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.CurrentMetrics != nil { in, out := &in.CurrentMetrics, &out.CurrentMetrics @@ -277,44 +223,49 @@ func (in *HorizontalPodAutoscalerStatus) DeepCopy() *HorizontalPodAutoscalerStat return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricIdentifier) DeepCopyInto(out *MetricIdentifier) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricIdentifier. +func (in *MetricIdentifier) DeepCopy() *MetricIdentifier { + if in == nil { + return nil + } + out := new(MetricIdentifier) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MetricSpec) DeepCopyInto(out *MetricSpec) { *out = *in if in.Object != nil { in, out := &in.Object, &out.Object - if *in == nil { - *out = nil - } else { - *out = new(ObjectMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ObjectMetricSource) + (*in).DeepCopyInto(*out) } if in.Pods != nil { in, out := &in.Pods, &out.Pods - if *in == nil { - *out = nil - } else { - *out = new(PodsMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(PodsMetricSource) + (*in).DeepCopyInto(*out) } if in.Resource != nil { in, out := &in.Resource, &out.Resource - if *in == nil { - *out = nil - } else { - *out = new(ResourceMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceMetricSource) + (*in).DeepCopyInto(*out) } if in.External != nil { in, out := &in.External, &out.External - if *in == nil { - *out = nil - } else { - *out = new(ExternalMetricSource) - (*in).DeepCopyInto(*out) - } + *out = new(ExternalMetricSource) + (*in).DeepCopyInto(*out) } return } @@ -334,39 +285,23 @@ func (in *MetricStatus) DeepCopyInto(out *MetricStatus) { *out = *in if in.Object != nil { in, out := &in.Object, &out.Object - if *in == nil { - *out = nil - } else { - *out = new(ObjectMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ObjectMetricStatus) + (*in).DeepCopyInto(*out) } if in.Pods != nil { in, out := &in.Pods, &out.Pods - if *in == nil { - *out = nil - } else { - *out = new(PodsMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(PodsMetricStatus) + (*in).DeepCopyInto(*out) } if in.Resource != nil { in, out := &in.Resource, &out.Resource - if *in == nil { - *out = nil - } else { - *out = new(ResourceMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceMetricStatus) + (*in).DeepCopyInto(*out) } if in.External != nil { in, out := &in.External, &out.External - if *in == nil { - *out = nil - } else { - *out = new(ExternalMetricStatus) - (*in).DeepCopyInto(*out) - } + *out = new(ExternalMetricStatus) + (*in).DeepCopyInto(*out) } return } @@ -381,11 +316,74 @@ func (in *MetricStatus) DeepCopy() *MetricStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricTarget) DeepCopyInto(out *MetricTarget) { + *out = *in + if in.Value != nil { + in, out := &in.Value, &out.Value + x := (*in).DeepCopy() + *out = &x + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } + if in.AverageUtilization != nil { + in, out := &in.AverageUtilization, &out.AverageUtilization + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricTarget. +func (in *MetricTarget) DeepCopy() *MetricTarget { + if in == nil { + return nil + } + out := new(MetricTarget) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *MetricValueStatus) DeepCopyInto(out *MetricValueStatus) { + *out = *in + if in.Value != nil { + in, out := &in.Value, &out.Value + x := (*in).DeepCopy() + *out = &x + } + if in.AverageValue != nil { + in, out := &in.AverageValue, &out.AverageValue + x := (*in).DeepCopy() + *out = &x + } + if in.AverageUtilization != nil { + in, out := &in.AverageUtilization, &out.AverageUtilization + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MetricValueStatus. +func (in *MetricValueStatus) DeepCopy() *MetricValueStatus { + if in == nil { + return nil + } + out := new(MetricValueStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ObjectMetricSource) DeepCopyInto(out *ObjectMetricSource) { *out = *in - out.Target = in.Target - out.TargetValue = in.TargetValue.DeepCopy() + out.DescribedObject = in.DescribedObject + in.Target.DeepCopyInto(&out.Target) + in.Metric.DeepCopyInto(&out.Metric) return } @@ -402,8 +400,9 @@ func (in *ObjectMetricSource) DeepCopy() *ObjectMetricSource { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ObjectMetricStatus) DeepCopyInto(out *ObjectMetricStatus) { *out = *in - out.Target = in.Target - out.CurrentValue = in.CurrentValue.DeepCopy() + in.Metric.DeepCopyInto(&out.Metric) + in.Current.DeepCopyInto(&out.Current) + out.DescribedObject = in.DescribedObject return } @@ -420,7 +419,8 @@ func (in *ObjectMetricStatus) DeepCopy() *ObjectMetricStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodsMetricSource) DeepCopyInto(out *PodsMetricSource) { *out = *in - out.TargetAverageValue = in.TargetAverageValue.DeepCopy() + in.Metric.DeepCopyInto(&out.Metric) + in.Target.DeepCopyInto(&out.Target) return } @@ -437,7 +437,8 @@ func (in *PodsMetricSource) DeepCopy() *PodsMetricSource { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodsMetricStatus) DeepCopyInto(out *PodsMetricStatus) { *out = *in - out.CurrentAverageValue = in.CurrentAverageValue.DeepCopy() + in.Metric.DeepCopyInto(&out.Metric) + in.Current.DeepCopyInto(&out.Current) return } @@ -454,24 +455,7 @@ func (in *PodsMetricStatus) DeepCopy() *PodsMetricStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceMetricSource) DeepCopyInto(out *ResourceMetricSource) { *out = *in - if in.TargetAverageUtilization != nil { - in, out := &in.TargetAverageUtilization, &out.TargetAverageUtilization - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } - } - if in.TargetAverageValue != nil { - in, out := &in.TargetAverageValue, &out.TargetAverageValue - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } - } + in.Target.DeepCopyInto(&out.Target) return } @@ -488,16 +472,7 @@ func (in *ResourceMetricSource) DeepCopy() *ResourceMetricSource { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceMetricStatus) DeepCopyInto(out *ResourceMetricStatus) { *out = *in - if in.CurrentAverageUtilization != nil { - in, out := &in.CurrentAverageUtilization, &out.CurrentAverageUtilization - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } - } - out.CurrentAverageValue = in.CurrentAverageValue.DeepCopy() + in.Current.DeepCopyInto(&out.Current) return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/BUILD deleted file mode 100644 index 8759839a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/kubernetes/pkg/apis/componentconfig", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/spf13/pflag:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/apis/componentconfig/fuzzer:all-srcs", - "//pkg/apis/componentconfig/install:all-srcs", - "//pkg/apis/componentconfig/v1alpha1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/OWNERS deleted file mode 100755 index a1f5f1d9..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/OWNERS +++ /dev/null @@ -1,43 +0,0 @@ -reviewers: -- thockin -- lavalamp -- smarterclayton -- wojtek-t -- deads2k -- yujuhong -- derekwaynecarr -- caesarxuchao -- vishh -- mikedanese -- liggitt -- nikhiljindal -- gmarek -- sttts -- dchen1107 -- saad-ali -- luxas -- justinsb -- pwittrock -- ncdc -- yifan-gu -- mwielgus -- feiskyer -- dims -- errordeveloper -- mtaufen -- markturansky -- freehan -- mml -- ingvagabund -- cjcullen -- mbohlool -- jessfraz -- david-mcmahon -- therc -- '249043822' -- mqliang -- mfanjie -approvers: - - mikedanese - - vishh - - mtaufen diff --git a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/types.go b/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/types.go deleted file mode 100644 index 51f79b15..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/types.go +++ /dev/null @@ -1,578 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 componentconfig - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// ClientConnectionConfiguration contains details for constructing a client. -type ClientConnectionConfiguration struct { - // kubeConfigFile is the path to a kubeconfig file. - KubeConfigFile string - // acceptContentTypes defines the Accept header sent by clients when connecting to a server, overriding the - // default value of 'application/json'. This field will control all connections to the server used by a particular - // client. - AcceptContentTypes string - // contentType is the content type used when sending data to the server from this client. - ContentType string - // cps controls the number of queries per second allowed for this connection. - QPS float32 - // burst allows extra queries to accumulate when a client is exceeding its rate. - Burst int32 -} - -// SchedulerPolicyConfigMapKey defines the key of the element in the -// scheduler's policy ConfigMap that contains scheduler's policy config. -const SchedulerPolicyConfigMapKey string = "policy.cfg" - -// SchedulerPolicySource configures a means to obtain a scheduler Policy. One -// source field must be specified, and source fields are mutually exclusive. -type SchedulerPolicySource struct { - // File is a file policy source. - File *SchedulerPolicyFileSource - // ConfigMap is a config map policy source. - ConfigMap *SchedulerPolicyConfigMapSource -} - -// SchedulerPolicyFileSource is a policy serialized to disk and accessed via -// path. -type SchedulerPolicyFileSource struct { - // Path is the location of a serialized policy. - Path string -} - -// SchedulerPolicyConfigMapSource is a policy serialized into a config map value -// under the SchedulerPolicyConfigMapKey key. -type SchedulerPolicyConfigMapSource struct { - // Namespace is the namespace of the policy config map. - Namespace string - // Name is the name of hte policy config map. - Name string -} - -// SchedulerAlgorithmSource is the source of a scheduler algorithm. One source -// field must be specified, and source fields are mutually exclusive. -type SchedulerAlgorithmSource struct { - // Policy is a policy based algorithm source. - Policy *SchedulerPolicySource - // Provider is the name of a scheduling algorithm provider to use. - Provider *string -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -type KubeSchedulerConfiguration struct { - metav1.TypeMeta - - // schedulerName is name of the scheduler, used to select which pods - // will be processed by this scheduler, based on pod's "spec.SchedulerName". - SchedulerName string - // AlgorithmSource specifies the scheduler algorithm source. - AlgorithmSource SchedulerAlgorithmSource - // RequiredDuringScheduling affinity is not symmetric, but there is an implicit PreferredDuringScheduling affinity rule - // corresponding to every RequiredDuringScheduling affinity rule. - // HardPodAffinitySymmetricWeight represents the weight of implicit PreferredDuringScheduling affinity rule, in the range 0-100. - HardPodAffinitySymmetricWeight int32 - - // LeaderElection defines the configuration of leader election client. - LeaderElection KubeSchedulerLeaderElectionConfiguration - - // ClientConnection specifies the kubeconfig file and client connection - // settings for the proxy server to use when communicating with the apiserver. - ClientConnection ClientConnectionConfiguration - // HealthzBindAddress is the IP address and port for the health check server to serve on, - // defaulting to 0.0.0.0:10251 - HealthzBindAddress string - // MetricsBindAddress is the IP address and port for the metrics server to - // serve on, defaulting to 0.0.0.0:10251. - MetricsBindAddress string - // EnableProfiling enables profiling via web interface on /debug/pprof - // handler. Profiling handlers will be handled by metrics server. - EnableProfiling bool - // EnableContentionProfiling enables lock contention profiling, if - // EnableProfiling is true. - EnableContentionProfiling bool - - // Indicate the "all topologies" set for empty topologyKey when it's used for PreferredDuringScheduling pod anti-affinity. - // DEPRECATED: This is no longer used. - FailureDomains string - - // DisablePreemption disables the pod preemption feature. - DisablePreemption bool -} - -// KubeSchedulerLeaderElectionConfiguration expands LeaderElectionConfiguration -// to include scheduler specific configuration. -type KubeSchedulerLeaderElectionConfiguration struct { - LeaderElectionConfiguration - - // LockObjectNamespace defines the namespace of the lock object - LockObjectNamespace string - // LockObjectName defines the lock object name - LockObjectName string -} - -// LeaderElectionConfiguration defines the configuration of leader election -// clients for components that can run with leader election enabled. -type LeaderElectionConfiguration struct { - // leaderElect enables a leader election client to gain leadership - // before executing the main loop. Enable this when running replicated - // components for high availability. - LeaderElect bool - // leaseDuration is the duration that non-leader candidates will wait - // after observing a leadership renewal until attempting to acquire - // leadership of a led but unrenewed leader slot. This is effectively the - // maximum duration that a leader can be stopped before it is replaced - // by another candidate. This is only applicable if leader election is - // enabled. - LeaseDuration metav1.Duration - // renewDeadline is the interval between attempts by the acting master to - // renew a leadership slot before it stops leading. This must be less - // than or equal to the lease duration. This is only applicable if leader - // election is enabled. - RenewDeadline metav1.Duration - // retryPeriod is the duration the clients should wait between attempting - // acquisition and renewal of a leadership. This is only applicable if - // leader election is enabled. - RetryPeriod metav1.Duration - // resourceLock indicates the resource object type that will be used to lock - // during leader election cycles. - ResourceLock string -} - -type GroupResource struct { - // group is the group portion of the GroupResource. - Group string - // resource is the resource portion of the GroupResource. - Resource string -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -type KubeControllerManagerConfiguration struct { - metav1.TypeMeta - - // CloudProviderConfiguration holds configuration for CloudProvider related features. - CloudProvider CloudProviderConfiguration - // DebuggingConfiguration holds configuration for Debugging related features. - Debugging DebuggingConfiguration - // GenericComponentConfiguration holds configuration for GenericComponent - // related features both in cloud controller manager and kube-controller manager. - GenericComponent GenericComponentConfiguration - // KubeCloudSharedConfiguration holds configuration for shared related features - // both in cloud controller manager and kube-controller manager. - KubeCloudShared KubeCloudSharedConfiguration - - // AttachDetachControllerConfiguration holds configuration for - // AttachDetachController related features. - AttachDetachController AttachDetachControllerConfiguration - // CSRSigningControllerConfiguration holds configuration for - // CSRSigningController related features. - CSRSigningController CSRSigningControllerConfiguration - // DaemonSetControllerConfiguration holds configuration for DaemonSetController - // related features. - DaemonSetController DaemonSetControllerConfiguration - // DeploymentControllerConfiguration holds configuration for - // DeploymentController related features. - DeploymentController DeploymentControllerConfiguration - // DeprecatedControllerConfiguration holds configuration for some deprecated - // features. - DeprecatedController DeprecatedControllerConfiguration - // EndPointControllerConfiguration holds configuration for EndPointController - // related features. - EndPointController EndPointControllerConfiguration - // GarbageCollectorControllerConfiguration holds configuration for - // GarbageCollectorController related features. - GarbageCollectorController GarbageCollectorControllerConfiguration - // HPAControllerConfiguration holds configuration for HPAController related features. - HPAController HPAControllerConfiguration - // JobControllerConfiguration holds configuration for JobController related features. - JobController JobControllerConfiguration - // NamespaceControllerConfiguration holds configuration for - // NamespaceController related features. - NamespaceController NamespaceControllerConfiguration - // NodeIpamControllerConfiguration holds configuration for NodeIpamController - // related features. - NodeIpamController NodeIpamControllerConfiguration - // NodeLifecycleControllerConfiguration holds configuration for - // NodeLifecycleController related features. - NodeLifecycleController NodeLifecycleControllerConfiguration - // PersistentVolumeBinderControllerConfiguration holds configuration for - // PersistentVolumeBinderController related features. - PersistentVolumeBinderController PersistentVolumeBinderControllerConfiguration - // PodGCControllerConfiguration holds configuration for PodGCController - // related features. - PodGCController PodGCControllerConfiguration - // ReplicaSetControllerConfiguration holds configuration for ReplicaSet related features. - ReplicaSetController ReplicaSetControllerConfiguration - // ReplicationControllerConfiguration holds configuration for - // ReplicationController related features. - ReplicationController ReplicationControllerConfiguration - // ResourceQuotaControllerConfiguration holds configuration for - // ResourceQuotaController related features. - ResourceQuotaController ResourceQuotaControllerConfiguration - // SAControllerConfiguration holds configuration for ServiceAccountController - // related features. - SAController SAControllerConfiguration - // ServiceControllerConfiguration holds configuration for ServiceController - // related features. - ServiceController ServiceControllerConfiguration - - // Controllers is the list of controllers to enable or disable - // '*' means "all enabled by default controllers" - // 'foo' means "enable 'foo'" - // '-foo' means "disable 'foo'" - // first item for a particular name wins - Controllers []string - // externalCloudVolumePlugin specifies the plugin to use when cloudProvider is "external". - // It is currently used by the in repo cloud providers to handle node and volume control in the KCM. - ExternalCloudVolumePlugin string -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -type CloudControllerManagerConfiguration struct { - metav1.TypeMeta - - // CloudProviderConfiguration holds configuration for CloudProvider related features. - CloudProvider CloudProviderConfiguration - // DebuggingConfiguration holds configuration for Debugging related features. - Debugging DebuggingConfiguration - // GenericComponentConfiguration holds configuration for GenericComponent - // related features both in cloud controller manager and kube-controller manager. - GenericComponent GenericComponentConfiguration - // KubeCloudSharedConfiguration holds configuration for shared related features - // both in cloud controller manager and kube-controller manager. - KubeCloudShared KubeCloudSharedConfiguration - // ServiceControllerConfiguration holds configuration for ServiceController - // related features. - ServiceController ServiceControllerConfiguration - // NodeStatusUpdateFrequency is the frequency at which the controller updates nodes' status - NodeStatusUpdateFrequency metav1.Duration -} - -type CloudProviderConfiguration struct { - // Name is the provider for cloud services. - Name string - // cloudConfigFile is the path to the cloud provider configuration file. - CloudConfigFile string -} - -type DebuggingConfiguration struct { - // enableProfiling enables profiling via web interface host:port/debug/pprof/ - EnableProfiling bool - // EnableContentionProfiling enables lock contention profiling, if - // EnableProfiling is true. - EnableContentionProfiling bool -} - -type GenericComponentConfiguration struct { - // minResyncPeriod is the resync period in reflectors; will be random between - // minResyncPeriod and 2*minResyncPeriod. - MinResyncPeriod metav1.Duration - // contentType is contentType of requests sent to apiserver. - ContentType string - // kubeAPIQPS is the QPS to use while talking with kubernetes apiserver. - KubeAPIQPS float32 - // kubeAPIBurst is the burst to use while talking with kubernetes apiserver. - KubeAPIBurst int32 - // How long to wait between starting controller managers - ControllerStartInterval metav1.Duration - // leaderElection defines the configuration of leader election client. - LeaderElection LeaderElectionConfiguration -} - -type KubeCloudSharedConfiguration struct { - // port is the port that the controller-manager's http service runs on. - Port int32 - // address is the IP address to serve on (set to 0.0.0.0 for all interfaces). - Address string - // useServiceAccountCredentials indicates whether controllers should be run with - // individual service account credentials. - UseServiceAccountCredentials bool - // run with untagged cloud instances - AllowUntaggedCloud bool - // routeReconciliationPeriod is the period for reconciling routes created for Nodes by cloud provider.. - RouteReconciliationPeriod metav1.Duration - // nodeMonitorPeriod is the period for syncing NodeStatus in NodeController. - NodeMonitorPeriod metav1.Duration - // clusterName is the instance prefix for the cluster. - ClusterName string - // clusterCIDR is CIDR Range for Pods in cluster. - ClusterCIDR string - // AllocateNodeCIDRs enables CIDRs for Pods to be allocated and, if - // ConfigureCloudRoutes is true, to be set on the cloud provider. - AllocateNodeCIDRs bool - // CIDRAllocatorType determines what kind of pod CIDR allocator will be used. - CIDRAllocatorType string - // configureCloudRoutes enables CIDRs allocated with allocateNodeCIDRs - // to be configured on the cloud provider. - ConfigureCloudRoutes bool - // nodeSyncPeriod is the period for syncing nodes from cloudprovider. Longer - // periods will result in fewer calls to cloud provider, but may delay addition - // of new nodes to cluster. - NodeSyncPeriod metav1.Duration -} - -type AttachDetachControllerConfiguration struct { - // Reconciler runs a periodic loop to reconcile the desired state of the with - // the actual state of the world by triggering attach detach operations. - // This flag enables or disables reconcile. Is false by default, and thus enabled. - DisableAttachDetachReconcilerSync bool - // ReconcilerSyncLoopPeriod is the amount of time the reconciler sync states loop - // wait between successive executions. Is set to 5 sec by default. - ReconcilerSyncLoopPeriod metav1.Duration -} - -type CSRSigningControllerConfiguration struct { - // clusterSigningCertFile is the filename containing a PEM-encoded - // X509 CA certificate used to issue cluster-scoped certificates - ClusterSigningCertFile string - // clusterSigningCertFile is the filename containing a PEM-encoded - // RSA or ECDSA private key used to issue cluster-scoped certificates - ClusterSigningKeyFile string - // clusterSigningDuration is the length of duration signed certificates - // will be given. - ClusterSigningDuration metav1.Duration -} - -type DaemonSetControllerConfiguration struct { - // concurrentDaemonSetSyncs is the number of daemonset objects that are - // allowed to sync concurrently. Larger number = more responsive daemonset, - // but more CPU (and network) load. - ConcurrentDaemonSetSyncs int32 -} - -type DeploymentControllerConfiguration struct { - // concurrentDeploymentSyncs is the number of deployment objects that are - // allowed to sync concurrently. Larger number = more responsive deployments, - // but more CPU (and network) load. - ConcurrentDeploymentSyncs int32 - // deploymentControllerSyncPeriod is the period for syncing the deployments. - DeploymentControllerSyncPeriod metav1.Duration -} - -type DeprecatedControllerConfiguration struct { - // DEPRECATED: deletingPodsQps is the number of nodes per second on which pods are deleted in - // case of node failure. - DeletingPodsQps float32 - // DEPRECATED: deletingPodsBurst is the number of nodes on which pods are bursty deleted in - // case of node failure. For more details look into RateLimiter. - DeletingPodsBurst int32 - // registerRetryCount is the number of retries for initial node registration. - // Retry interval equals node-sync-period. - RegisterRetryCount int32 -} - -type EndPointControllerConfiguration struct { - // concurrentEndpointSyncs is the number of endpoint syncing operations - // that will be done concurrently. Larger number = faster endpoint updating, - // but more CPU (and network) load. - ConcurrentEndpointSyncs int32 -} - -type GarbageCollectorControllerConfiguration struct { - // enables the generic garbage collector. MUST be synced with the - // corresponding flag of the kube-apiserver. WARNING: the generic garbage - // collector is an alpha feature. - EnableGarbageCollector bool - // concurrentGCSyncs is the number of garbage collector workers that are - // allowed to sync concurrently. - ConcurrentGCSyncs int32 - // gcIgnoredResources is the list of GroupResources that garbage collection should ignore. - GCIgnoredResources []GroupResource -} - -type HPAControllerConfiguration struct { - // horizontalPodAutoscalerSyncPeriod is the period for syncing the number of - // pods in horizontal pod autoscaler. - HorizontalPodAutoscalerSyncPeriod metav1.Duration - // horizontalPodAutoscalerUpscaleForbiddenWindow is a period after which next upscale allowed. - HorizontalPodAutoscalerUpscaleForbiddenWindow metav1.Duration - // horizontalPodAutoscalerDownscaleForbiddenWindow is a period after which next downscale allowed. - HorizontalPodAutoscalerDownscaleForbiddenWindow metav1.Duration - // horizontalPodAutoscalerTolerance is the tolerance for when - // resource usage suggests upscaling/downscaling - HorizontalPodAutoscalerTolerance float64 - // HorizontalPodAutoscalerUseRESTClients causes the HPA controller to use REST clients - // through the kube-aggregator when enabled, instead of using the legacy metrics client - // through the API server proxy. - HorizontalPodAutoscalerUseRESTClients bool -} - -type JobControllerConfiguration struct { - // concurrentJobSyncs is the number of job objects that are - // allowed to sync concurrently. Larger number = more responsive jobs, - // but more CPU (and network) load. - ConcurrentJobSyncs int32 -} - -type NamespaceControllerConfiguration struct { - // namespaceSyncPeriod is the period for syncing namespace life-cycle - // updates. - NamespaceSyncPeriod metav1.Duration - // concurrentNamespaceSyncs is the number of namespace objects that are - // allowed to sync concurrently. - ConcurrentNamespaceSyncs int32 -} - -type NodeIpamControllerConfiguration struct { - // serviceCIDR is CIDR Range for Services in cluster. - ServiceCIDR string - // NodeCIDRMaskSize is the mask size for node cidr in cluster. - NodeCIDRMaskSize int32 -} - -type NodeLifecycleControllerConfiguration struct { - // If set to true enables NoExecute Taints and will evict all not-tolerating - // Pod running on Nodes tainted with this kind of Taints. - EnableTaintManager bool - // nodeEvictionRate is the number of nodes per second on which pods are deleted in case of node failure when a zone is healthy - NodeEvictionRate float32 - // secondaryNodeEvictionRate is the number of nodes per second on which pods are deleted in case of node failure when a zone is unhealthy - SecondaryNodeEvictionRate float32 - // nodeStartupGracePeriod is the amount of time which we allow starting a node to - // be unresponsive before marking it unhealthy. - NodeStartupGracePeriod metav1.Duration - // nodeMontiorGracePeriod is the amount of time which we allow a running node to be - // unresponsive before marking it unhealthy. Must be N times more than kubelet's - // nodeStatusUpdateFrequency, where N means number of retries allowed for kubelet - // to post node status. - NodeMonitorGracePeriod metav1.Duration - // podEvictionTimeout is the grace period for deleting pods on failed nodes. - PodEvictionTimeout metav1.Duration - // secondaryNodeEvictionRate is implicitly overridden to 0 for clusters smaller than or equal to largeClusterSizeThreshold - LargeClusterSizeThreshold int32 - // Zone is treated as unhealthy in nodeEvictionRate and secondaryNodeEvictionRate when at least - // unhealthyZoneThreshold (no less than 3) of Nodes in the zone are NotReady - UnhealthyZoneThreshold float32 -} - -type PersistentVolumeBinderControllerConfiguration struct { - // pvClaimBinderSyncPeriod is the period for syncing persistent volumes - // and persistent volume claims. - PVClaimBinderSyncPeriod metav1.Duration - // volumeConfiguration holds configuration for volume related features. - VolumeConfiguration VolumeConfiguration -} - -type PodGCControllerConfiguration struct { - // terminatedPodGCThreshold is the number of terminated pods that can exist - // before the terminated pod garbage collector starts deleting terminated pods. - // If <= 0, the terminated pod garbage collector is disabled. - TerminatedPodGCThreshold int32 -} - -type ReplicaSetControllerConfiguration struct { - // concurrentRSSyncs is the number of replica sets that are allowed to sync - // concurrently. Larger number = more responsive replica management, but more - // CPU (and network) load. - ConcurrentRSSyncs int32 -} - -type ReplicationControllerConfiguration struct { - // concurrentRCSyncs is the number of replication controllers that are - // allowed to sync concurrently. Larger number = more responsive replica - // management, but more CPU (and network) load. - ConcurrentRCSyncs int32 -} - -type ResourceQuotaControllerConfiguration struct { - // resourceQuotaSyncPeriod is the period for syncing quota usage status - // in the system. - ResourceQuotaSyncPeriod metav1.Duration - // concurrentResourceQuotaSyncs is the number of resource quotas that are - // allowed to sync concurrently. Larger number = more responsive quota - // management, but more CPU (and network) load. - ConcurrentResourceQuotaSyncs int32 -} - -type SAControllerConfiguration struct { - // serviceAccountKeyFile is the filename containing a PEM-encoded private RSA key - // used to sign service account tokens. - ServiceAccountKeyFile string - // concurrentSATokenSyncs is the number of service account token syncing operations - // that will be done concurrently. - ConcurrentSATokenSyncs int32 - // rootCAFile is the root certificate authority will be included in service - // account's token secret. This must be a valid PEM-encoded CA bundle. - RootCAFile string -} - -type ServiceControllerConfiguration struct { - // concurrentServiceSyncs is the number of services that are - // allowed to sync concurrently. Larger number = more responsive service - // management, but more CPU (and network) load. - ConcurrentServiceSyncs int32 -} - -// VolumeConfiguration contains *all* enumerated flags meant to configure all volume -// plugins. From this config, the controller-manager binary will create many instances of -// volume.VolumeConfig, each containing only the configuration needed for that plugin which -// are then passed to the appropriate plugin. The ControllerManager binary is the only part -// of the code which knows what plugins are supported and which flags correspond to each plugin. -type VolumeConfiguration struct { - // enableHostPathProvisioning enables HostPath PV provisioning when running without a - // cloud provider. This allows testing and development of provisioning features. HostPath - // provisioning is not supported in any way, won't work in a multi-node cluster, and - // should not be used for anything other than testing or development. - EnableHostPathProvisioning bool - // enableDynamicProvisioning enables the provisioning of volumes when running within an environment - // that supports dynamic provisioning. Defaults to true. - EnableDynamicProvisioning bool - // persistentVolumeRecyclerConfiguration holds configuration for persistent volume plugins. - PersistentVolumeRecyclerConfiguration PersistentVolumeRecyclerConfiguration - // volumePluginDir is the full path of the directory in which the flex - // volume plugin should search for additional third party volume plugins - FlexVolumePluginDir string -} - -type PersistentVolumeRecyclerConfiguration struct { - // maximumRetry is number of retries the PV recycler will execute on failure to recycle - // PV. - MaximumRetry int32 - // minimumTimeoutNFS is the minimum ActiveDeadlineSeconds to use for an NFS Recycler - // pod. - MinimumTimeoutNFS int32 - // podTemplateFilePathNFS is the file path to a pod definition used as a template for - // NFS persistent volume recycling - PodTemplateFilePathNFS string - // incrementTimeoutNFS is the increment of time added per Gi to ActiveDeadlineSeconds - // for an NFS scrubber pod. - IncrementTimeoutNFS int32 - // podTemplateFilePathHostPath is the file path to a pod definition used as a template for - // HostPath persistent volume recycling. This is for development and testing only and - // will not work in a multi-node cluster. - PodTemplateFilePathHostPath string - // minimumTimeoutHostPath is the minimum ActiveDeadlineSeconds to use for a HostPath - // Recycler pod. This is for development and testing only and will not work in a multi-node - // cluster. - MinimumTimeoutHostPath int32 - // incrementTimeoutHostPath is the increment of time added per Gi to ActiveDeadlineSeconds - // for a HostPath scrubber pod. This is for development and testing only and will not work - // in a multi-node cluster. - IncrementTimeoutHostPath int32 -} - -const ( - // "kube-system" is the default scheduler lock object namespace - SchedulerDefaultLockObjectNamespace string = "kube-system" - - // "kube-scheduler" is the default scheduler lock object name - SchedulerDefaultLockObjectName = "kube-scheduler" -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/zz_generated.deepcopy.go deleted file mode 100644 index c8317d11..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/zz_generated.deepcopy.go +++ /dev/null @@ -1,805 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package componentconfig - -import ( - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *AttachDetachControllerConfiguration) DeepCopyInto(out *AttachDetachControllerConfiguration) { - *out = *in - out.ReconcilerSyncLoopPeriod = in.ReconcilerSyncLoopPeriod - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AttachDetachControllerConfiguration. -func (in *AttachDetachControllerConfiguration) DeepCopy() *AttachDetachControllerConfiguration { - if in == nil { - return nil - } - out := new(AttachDetachControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CSRSigningControllerConfiguration) DeepCopyInto(out *CSRSigningControllerConfiguration) { - *out = *in - out.ClusterSigningDuration = in.ClusterSigningDuration - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CSRSigningControllerConfiguration. -func (in *CSRSigningControllerConfiguration) DeepCopy() *CSRSigningControllerConfiguration { - if in == nil { - return nil - } - out := new(CSRSigningControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClientConnectionConfiguration) DeepCopyInto(out *ClientConnectionConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClientConnectionConfiguration. -func (in *ClientConnectionConfiguration) DeepCopy() *ClientConnectionConfiguration { - if in == nil { - return nil - } - out := new(ClientConnectionConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CloudControllerManagerConfiguration) DeepCopyInto(out *CloudControllerManagerConfiguration) { - *out = *in - out.TypeMeta = in.TypeMeta - out.CloudProvider = in.CloudProvider - out.Debugging = in.Debugging - out.GenericComponent = in.GenericComponent - out.KubeCloudShared = in.KubeCloudShared - out.ServiceController = in.ServiceController - out.NodeStatusUpdateFrequency = in.NodeStatusUpdateFrequency - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudControllerManagerConfiguration. -func (in *CloudControllerManagerConfiguration) DeepCopy() *CloudControllerManagerConfiguration { - if in == nil { - return nil - } - out := new(CloudControllerManagerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *CloudControllerManagerConfiguration) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CloudProviderConfiguration) DeepCopyInto(out *CloudProviderConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CloudProviderConfiguration. -func (in *CloudProviderConfiguration) DeepCopy() *CloudProviderConfiguration { - if in == nil { - return nil - } - out := new(CloudProviderConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DaemonSetControllerConfiguration) DeepCopyInto(out *DaemonSetControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DaemonSetControllerConfiguration. -func (in *DaemonSetControllerConfiguration) DeepCopy() *DaemonSetControllerConfiguration { - if in == nil { - return nil - } - out := new(DaemonSetControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DebuggingConfiguration) DeepCopyInto(out *DebuggingConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DebuggingConfiguration. -func (in *DebuggingConfiguration) DeepCopy() *DebuggingConfiguration { - if in == nil { - return nil - } - out := new(DebuggingConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeploymentControllerConfiguration) DeepCopyInto(out *DeploymentControllerConfiguration) { - *out = *in - out.DeploymentControllerSyncPeriod = in.DeploymentControllerSyncPeriod - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeploymentControllerConfiguration. -func (in *DeploymentControllerConfiguration) DeepCopy() *DeploymentControllerConfiguration { - if in == nil { - return nil - } - out := new(DeploymentControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeprecatedControllerConfiguration) DeepCopyInto(out *DeprecatedControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeprecatedControllerConfiguration. -func (in *DeprecatedControllerConfiguration) DeepCopy() *DeprecatedControllerConfiguration { - if in == nil { - return nil - } - out := new(DeprecatedControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EndPointControllerConfiguration) DeepCopyInto(out *EndPointControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndPointControllerConfiguration. -func (in *EndPointControllerConfiguration) DeepCopy() *EndPointControllerConfiguration { - if in == nil { - return nil - } - out := new(EndPointControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GarbageCollectorControllerConfiguration) DeepCopyInto(out *GarbageCollectorControllerConfiguration) { - *out = *in - if in.GCIgnoredResources != nil { - in, out := &in.GCIgnoredResources, &out.GCIgnoredResources - *out = make([]GroupResource, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GarbageCollectorControllerConfiguration. -func (in *GarbageCollectorControllerConfiguration) DeepCopy() *GarbageCollectorControllerConfiguration { - if in == nil { - return nil - } - out := new(GarbageCollectorControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GenericComponentConfiguration) DeepCopyInto(out *GenericComponentConfiguration) { - *out = *in - out.MinResyncPeriod = in.MinResyncPeriod - out.ControllerStartInterval = in.ControllerStartInterval - out.LeaderElection = in.LeaderElection - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GenericComponentConfiguration. -func (in *GenericComponentConfiguration) DeepCopy() *GenericComponentConfiguration { - if in == nil { - return nil - } - out := new(GenericComponentConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *GroupResource) DeepCopyInto(out *GroupResource) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GroupResource. -func (in *GroupResource) DeepCopy() *GroupResource { - if in == nil { - return nil - } - out := new(GroupResource) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *HPAControllerConfiguration) DeepCopyInto(out *HPAControllerConfiguration) { - *out = *in - out.HorizontalPodAutoscalerSyncPeriod = in.HorizontalPodAutoscalerSyncPeriod - out.HorizontalPodAutoscalerUpscaleForbiddenWindow = in.HorizontalPodAutoscalerUpscaleForbiddenWindow - out.HorizontalPodAutoscalerDownscaleForbiddenWindow = in.HorizontalPodAutoscalerDownscaleForbiddenWindow - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HPAControllerConfiguration. -func (in *HPAControllerConfiguration) DeepCopy() *HPAControllerConfiguration { - if in == nil { - return nil - } - out := new(HPAControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPPortVar) DeepCopyInto(out *IPPortVar) { - *out = *in - if in.Val != nil { - in, out := &in.Val, &out.Val - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPPortVar. -func (in *IPPortVar) DeepCopy() *IPPortVar { - if in == nil { - return nil - } - out := new(IPPortVar) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPVar) DeepCopyInto(out *IPVar) { - *out = *in - if in.Val != nil { - in, out := &in.Val, &out.Val - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPVar. -func (in *IPVar) DeepCopy() *IPVar { - if in == nil { - return nil - } - out := new(IPVar) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *JobControllerConfiguration) DeepCopyInto(out *JobControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JobControllerConfiguration. -func (in *JobControllerConfiguration) DeepCopy() *JobControllerConfiguration { - if in == nil { - return nil - } - out := new(JobControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeCloudSharedConfiguration) DeepCopyInto(out *KubeCloudSharedConfiguration) { - *out = *in - out.RouteReconciliationPeriod = in.RouteReconciliationPeriod - out.NodeMonitorPeriod = in.NodeMonitorPeriod - out.NodeSyncPeriod = in.NodeSyncPeriod - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeCloudSharedConfiguration. -func (in *KubeCloudSharedConfiguration) DeepCopy() *KubeCloudSharedConfiguration { - if in == nil { - return nil - } - out := new(KubeCloudSharedConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeControllerManagerConfiguration) DeepCopyInto(out *KubeControllerManagerConfiguration) { - *out = *in - out.TypeMeta = in.TypeMeta - out.CloudProvider = in.CloudProvider - out.Debugging = in.Debugging - out.GenericComponent = in.GenericComponent - out.KubeCloudShared = in.KubeCloudShared - out.AttachDetachController = in.AttachDetachController - out.CSRSigningController = in.CSRSigningController - out.DaemonSetController = in.DaemonSetController - out.DeploymentController = in.DeploymentController - out.DeprecatedController = in.DeprecatedController - out.EndPointController = in.EndPointController - in.GarbageCollectorController.DeepCopyInto(&out.GarbageCollectorController) - out.HPAController = in.HPAController - out.JobController = in.JobController - out.NamespaceController = in.NamespaceController - out.NodeIpamController = in.NodeIpamController - out.NodeLifecycleController = in.NodeLifecycleController - out.PersistentVolumeBinderController = in.PersistentVolumeBinderController - out.PodGCController = in.PodGCController - out.ReplicaSetController = in.ReplicaSetController - out.ReplicationController = in.ReplicationController - out.ResourceQuotaController = in.ResourceQuotaController - out.SAController = in.SAController - out.ServiceController = in.ServiceController - if in.Controllers != nil { - in, out := &in.Controllers, &out.Controllers - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeControllerManagerConfiguration. -func (in *KubeControllerManagerConfiguration) DeepCopy() *KubeControllerManagerConfiguration { - if in == nil { - return nil - } - out := new(KubeControllerManagerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *KubeControllerManagerConfiguration) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeSchedulerConfiguration) DeepCopyInto(out *KubeSchedulerConfiguration) { - *out = *in - out.TypeMeta = in.TypeMeta - in.AlgorithmSource.DeepCopyInto(&out.AlgorithmSource) - out.LeaderElection = in.LeaderElection - out.ClientConnection = in.ClientConnection - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeSchedulerConfiguration. -func (in *KubeSchedulerConfiguration) DeepCopy() *KubeSchedulerConfiguration { - if in == nil { - return nil - } - out := new(KubeSchedulerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *KubeSchedulerConfiguration) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeSchedulerLeaderElectionConfiguration) DeepCopyInto(out *KubeSchedulerLeaderElectionConfiguration) { - *out = *in - out.LeaderElectionConfiguration = in.LeaderElectionConfiguration - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeSchedulerLeaderElectionConfiguration. -func (in *KubeSchedulerLeaderElectionConfiguration) DeepCopy() *KubeSchedulerLeaderElectionConfiguration { - if in == nil { - return nil - } - out := new(KubeSchedulerLeaderElectionConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *LeaderElectionConfiguration) DeepCopyInto(out *LeaderElectionConfiguration) { - *out = *in - out.LeaseDuration = in.LeaseDuration - out.RenewDeadline = in.RenewDeadline - out.RetryPeriod = in.RetryPeriod - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LeaderElectionConfiguration. -func (in *LeaderElectionConfiguration) DeepCopy() *LeaderElectionConfiguration { - if in == nil { - return nil - } - out := new(LeaderElectionConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NamespaceControllerConfiguration) DeepCopyInto(out *NamespaceControllerConfiguration) { - *out = *in - out.NamespaceSyncPeriod = in.NamespaceSyncPeriod - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamespaceControllerConfiguration. -func (in *NamespaceControllerConfiguration) DeepCopy() *NamespaceControllerConfiguration { - if in == nil { - return nil - } - out := new(NamespaceControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeIpamControllerConfiguration) DeepCopyInto(out *NodeIpamControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeIpamControllerConfiguration. -func (in *NodeIpamControllerConfiguration) DeepCopy() *NodeIpamControllerConfiguration { - if in == nil { - return nil - } - out := new(NodeIpamControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeLifecycleControllerConfiguration) DeepCopyInto(out *NodeLifecycleControllerConfiguration) { - *out = *in - out.NodeStartupGracePeriod = in.NodeStartupGracePeriod - out.NodeMonitorGracePeriod = in.NodeMonitorGracePeriod - out.PodEvictionTimeout = in.PodEvictionTimeout - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeLifecycleControllerConfiguration. -func (in *NodeLifecycleControllerConfiguration) DeepCopy() *NodeLifecycleControllerConfiguration { - if in == nil { - return nil - } - out := new(NodeLifecycleControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PersistentVolumeBinderControllerConfiguration) DeepCopyInto(out *PersistentVolumeBinderControllerConfiguration) { - *out = *in - out.PVClaimBinderSyncPeriod = in.PVClaimBinderSyncPeriod - out.VolumeConfiguration = in.VolumeConfiguration - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeBinderControllerConfiguration. -func (in *PersistentVolumeBinderControllerConfiguration) DeepCopy() *PersistentVolumeBinderControllerConfiguration { - if in == nil { - return nil - } - out := new(PersistentVolumeBinderControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PersistentVolumeRecyclerConfiguration) DeepCopyInto(out *PersistentVolumeRecyclerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PersistentVolumeRecyclerConfiguration. -func (in *PersistentVolumeRecyclerConfiguration) DeepCopy() *PersistentVolumeRecyclerConfiguration { - if in == nil { - return nil - } - out := new(PersistentVolumeRecyclerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodGCControllerConfiguration) DeepCopyInto(out *PodGCControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodGCControllerConfiguration. -func (in *PodGCControllerConfiguration) DeepCopy() *PodGCControllerConfiguration { - if in == nil { - return nil - } - out := new(PodGCControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PortRangeVar) DeepCopyInto(out *PortRangeVar) { - *out = *in - if in.Val != nil { - in, out := &in.Val, &out.Val - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PortRangeVar. -func (in *PortRangeVar) DeepCopy() *PortRangeVar { - if in == nil { - return nil - } - out := new(PortRangeVar) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ReplicaSetControllerConfiguration) DeepCopyInto(out *ReplicaSetControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplicaSetControllerConfiguration. -func (in *ReplicaSetControllerConfiguration) DeepCopy() *ReplicaSetControllerConfiguration { - if in == nil { - return nil - } - out := new(ReplicaSetControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ReplicationControllerConfiguration) DeepCopyInto(out *ReplicationControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReplicationControllerConfiguration. -func (in *ReplicationControllerConfiguration) DeepCopy() *ReplicationControllerConfiguration { - if in == nil { - return nil - } - out := new(ReplicationControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ResourceQuotaControllerConfiguration) DeepCopyInto(out *ResourceQuotaControllerConfiguration) { - *out = *in - out.ResourceQuotaSyncPeriod = in.ResourceQuotaSyncPeriod - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ResourceQuotaControllerConfiguration. -func (in *ResourceQuotaControllerConfiguration) DeepCopy() *ResourceQuotaControllerConfiguration { - if in == nil { - return nil - } - out := new(ResourceQuotaControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SAControllerConfiguration) DeepCopyInto(out *SAControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SAControllerConfiguration. -func (in *SAControllerConfiguration) DeepCopy() *SAControllerConfiguration { - if in == nil { - return nil - } - out := new(SAControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerAlgorithmSource) DeepCopyInto(out *SchedulerAlgorithmSource) { - *out = *in - if in.Policy != nil { - in, out := &in.Policy, &out.Policy - if *in == nil { - *out = nil - } else { - *out = new(SchedulerPolicySource) - (*in).DeepCopyInto(*out) - } - } - if in.Provider != nil { - in, out := &in.Provider, &out.Provider - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerAlgorithmSource. -func (in *SchedulerAlgorithmSource) DeepCopy() *SchedulerAlgorithmSource { - if in == nil { - return nil - } - out := new(SchedulerAlgorithmSource) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerPolicyConfigMapSource) DeepCopyInto(out *SchedulerPolicyConfigMapSource) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerPolicyConfigMapSource. -func (in *SchedulerPolicyConfigMapSource) DeepCopy() *SchedulerPolicyConfigMapSource { - if in == nil { - return nil - } - out := new(SchedulerPolicyConfigMapSource) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerPolicyFileSource) DeepCopyInto(out *SchedulerPolicyFileSource) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerPolicyFileSource. -func (in *SchedulerPolicyFileSource) DeepCopy() *SchedulerPolicyFileSource { - if in == nil { - return nil - } - out := new(SchedulerPolicyFileSource) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *SchedulerPolicySource) DeepCopyInto(out *SchedulerPolicySource) { - *out = *in - if in.File != nil { - in, out := &in.File, &out.File - if *in == nil { - *out = nil - } else { - *out = new(SchedulerPolicyFileSource) - **out = **in - } - } - if in.ConfigMap != nil { - in, out := &in.ConfigMap, &out.ConfigMap - if *in == nil { - *out = nil - } else { - *out = new(SchedulerPolicyConfigMapSource) - **out = **in - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SchedulerPolicySource. -func (in *SchedulerPolicySource) DeepCopy() *SchedulerPolicySource { - if in == nil { - return nil - } - out := new(SchedulerPolicySource) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ServiceControllerConfiguration) DeepCopyInto(out *ServiceControllerConfiguration) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceControllerConfiguration. -func (in *ServiceControllerConfiguration) DeepCopy() *ServiceControllerConfiguration { - if in == nil { - return nil - } - out := new(ServiceControllerConfiguration) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *VolumeConfiguration) DeepCopyInto(out *VolumeConfiguration) { - *out = *in - out.PersistentVolumeRecyclerConfiguration = in.PersistentVolumeRecyclerConfiguration - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VolumeConfiguration. -func (in *VolumeConfiguration) DeepCopy() *VolumeConfiguration { - if in == nil { - return nil - } - out := new(VolumeConfiguration) - in.DeepCopyInto(out) - return out -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/BUILD index 026cd897..6ca92930 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/BUILD @@ -18,13 +18,13 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/core", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS index 17bebcb3..7e195eca 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS @@ -41,3 +41,5 @@ reviewers: - piosz - jsafrane - jbeda +labels: +- sig/apps diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD index 72df5635..d4fa9fea 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/BUILD @@ -12,8 +12,8 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", ], ) @@ -23,14 +23,14 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/core/helper", deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go index 7be34a85..48612229 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/helper/helpers.go @@ -56,7 +56,7 @@ func HugePageResourceName(pageSize resource.Quantity) core.ResourceName { // an error is returned. func HugePageSizeFromResourceName(name core.ResourceName) (resource.Quantity, error) { if !IsHugePageResourceName(name) { - return resource.Quantity{}, fmt.Errorf("resource name: %s is not valid hugepage name", name) + return resource.Quantity{}, fmt.Errorf("resource name: %s is an invalid hugepage name", name) } pageSize := strings.TrimPrefix(string(name), core.ResourceHugePagesPrefix) return resource.ParseQuantity(pageSize) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD index a5b6505f..731869eb 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/install/BUILD @@ -14,8 +14,8 @@ go_library( "//pkg/api/legacyscheme:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/apis/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) @@ -26,10 +26,10 @@ go_test( deps = [ "//pkg/api/legacyscheme:go_default_library", "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/types.go b/vendor/k8s.io/kubernetes/pkg/apis/core/types.go index cd1235b6..702ffa4d 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/types.go @@ -35,6 +35,8 @@ const ( NamespaceSystem string = "kube-system" // NamespacePublic is the namespace where we place public info (ConfigMaps) NamespacePublic string = "kube-public" + // NamespaceNodeLease is the namespace where we place node lease objects (used for node heartbeats) + NamespaceNodeLease string = "kube-node-lease" // TerminationMessagePathDefault means the default path to capture the application termination message running in a container TerminationMessagePathDefault string = "/dev/termination-log" ) @@ -411,6 +413,16 @@ type PersistentVolumeClaimSpec struct { // This is an alpha feature and may change in the future. // +optional VolumeMode *PersistentVolumeMode + // This field requires the VolumeSnapshotDataSource alpha feature gate to be + // enabled and currently VolumeSnapshot is the only supported data source. + // If the provisioner can support VolumeSnapshot data source, it will create + // a new volume and data will be restored to the volume at the same time. + // If the provisioner does not support VolumeSnapshot data source, volume will + // not be created and the failure will be reported as an event. + // In the future, we plan to support more data source types and the behavior + // of the provisioner may change. + // +optional + DataSource *TypedLocalObjectReference } type PersistentVolumeClaimConditionType string @@ -562,6 +574,8 @@ const ( ProtocolTCP Protocol = "TCP" // ProtocolUDP is the UDP protocol. ProtocolUDP Protocol = "UDP" + // ProtocolSCTP is the SCTP protocol. + ProtocolSCTP Protocol = "SCTP" ) // Represents a Persistent Disk resource in Google Compute Engine. @@ -1264,6 +1278,7 @@ type ScaleIOVolumeSource struct { // +optional StoragePool string // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + // Default is ThinProvisioned. // +optional StorageMode string // The name of a volume already created in the ScaleIO system @@ -1271,7 +1286,8 @@ type ScaleIOVolumeSource struct { VolumeName string // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". + // Default is "xfs". // +optional FSType string // Defaults to false (read/write). ReadOnly here will force @@ -1300,6 +1316,7 @@ type ScaleIOPersistentVolumeSource struct { // +optional StoragePool string // Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. + // Default is ThinProvisioned. // +optional StorageMode string // The name of a volume created in the ScaleIO system @@ -1307,7 +1324,8 @@ type ScaleIOPersistentVolumeSource struct { VolumeName string // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". + // Default is "xfs". // +optional FSType string // Defaults to false (read/write). ReadOnly here will force @@ -1495,10 +1513,14 @@ type KeyToPath struct { type LocalVolumeSource struct { // The full path to the volume on the node. // It can be either a directory or block device (disk, partition, ...). - // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. - // Block devices can be represented only by VolumeMode=Block, which also requires the - // BlockVolume alpha feature gate to be enabled. Path string + + // Filesystem type to mount. + // It applies only when the Path is a block device. + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". The default value is to auto-select a fileystem if unspecified. + // +optional + FSType *string } // Represents storage that is managed by an external CSI volume driver (Beta feature) @@ -1519,7 +1541,7 @@ type CSIPersistentVolumeSource struct { // Filesystem type to mount. // Must be a filesystem type supported by the host operating system. - // Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // Ex. "ext4", "xfs", "ntfs". // +optional FSType string @@ -1564,7 +1586,7 @@ type ContainerPort struct { HostPort int32 // Required: This must be a valid port number, 0 < x < 65536. ContainerPort int32 - // Required: Supports "TCP" and "UDP". + // Required: Supports "TCP", "UDP" and "SCTP" // +optional Protocol Protocol // Optional: What host IP to bind the external port to. @@ -1589,7 +1611,7 @@ type VolumeMount struct { SubPath string // mountPropagation determines how mounts are propagated from the host // to container and the other way around. - // When not set, MountPropagationHostToContainer is used. + // When not set, MountPropagationNone is used. // This field is beta in 1.10. // +optional MountPropagation *MountPropagationMode @@ -2567,6 +2589,14 @@ type PodSpec struct { // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md // +optional ReadinessGates []PodReadinessGate + // RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used + // to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. + // If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an + // empty definition that uses the default runtime handler. + // More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md + // This is an alpha feature and may change in the future. + // +optional + RuntimeClassName *string } // HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the @@ -2609,7 +2639,7 @@ type PodSecurityContext struct { // in the same pod, and the first process in each container will not be assigned PID 1. // HostPID and ShareProcessNamespace cannot both be set. // Optional: Default to false. - // This field is alpha-level and is honored only by servers that enable the PodShareProcessNamespace feature. + // This field is beta-level and may be disabled with the PodShareProcessNamespace feature. // +k8s:conversion-gen=false // +optional ShareProcessNamespace *bool @@ -3161,7 +3191,7 @@ type ServicePort struct { // the 'Name' field in EndpointPort objects. Name string - // The IP protocol for this port. Supports "TCP" and "UDP". + // The IP protocol for this port. Supports "TCP", "UDP", and "SCTP". Protocol Protocol // The port that will be exposed on the service. @@ -3944,6 +3974,19 @@ type LocalObjectReference struct { Name string } +// TypedLocalObjectReference contains enough information to let you locate the typed referenced object inside the same namespace. +type TypedLocalObjectReference struct { + // APIGroup is the group for the resource being referenced. + // If APIGroup is not specified, the specified Kind must be in the core API group. + // For any other third-party types, APIGroup is required. + // +optional + APIGroup *string + // Kind is the type of resource being referenced + Kind string + // Name is the name of resource being referenced + Name string +} + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type SerializedReference struct { @@ -4580,8 +4623,27 @@ type SecurityContext struct { // the no_new_privs flag will be set on the container process. // +optional AllowPrivilegeEscalation *bool + // ProcMount denotes the type of proc mount to use for the containers. + // The default is DefaultProcMount which uses the container runtime defaults for + // readonly paths and masked paths. + // +optional + ProcMount *ProcMountType } +type ProcMountType string + +const ( + // DefaultProcMount uses the container runtime defaults for readonly and masked + // paths for /proc. Most container runtimes mask certain paths in /proc to avoid + // accidental security exposure of special devices or information. + DefaultProcMount ProcMountType = "Default" + + // UnmaskedProcMount bypasses the default masking behavior of the container + // runtime and ensures the newly created /proc the container stays intact with + // no modifications. + UnmaskedProcMount ProcMountType = "Unmasked" +) + // SELinuxOptions are the labels to be applied to the container. type SELinuxOptions struct { // SELinux user label diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD index 8de59b3f..180f0bad 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/BUILD @@ -17,45 +17,45 @@ go_library( "//pkg/apis/extensions:go_default_library", "//pkg/features:go_default_library", "//pkg/util/parsers:go_default_library", - "//pkg/util/pointer:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], ) go_test( - name = "go_default_xtest", + name = "go_default_test", srcs = [ "conversion_test.go", "defaults_test.go", ], + embed = [":go_default_library"], deps = [ - ":go_default_library", "//pkg/api/legacyscheme:go_default_library", "//pkg/api/testapi:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/apis/core/fuzzer:go_default_library", "//pkg/apis/extensions:go_default_library", - "//pkg/util/pointer:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go index bc431d14..bab07f19 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/conversion.go @@ -30,105 +30,6 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions" ) -// This is a "fast-path" that avoids reflection for common types. It focuses on the objects that are -// converted the most in the cluster. -// TODO: generate one of these for every external API group - this is to prove the impact -func addFastPathConversionFuncs(scheme *runtime.Scheme) error { - scheme.AddGenericConversionFunc(func(objA, objB interface{}, s conversion.Scope) (bool, error) { - switch a := objA.(type) { - case *v1.Pod: - switch b := objB.(type) { - case *core.Pod: - return true, Convert_v1_Pod_To_core_Pod(a, b, s) - } - case *core.Pod: - switch b := objB.(type) { - case *v1.Pod: - return true, Convert_core_Pod_To_v1_Pod(a, b, s) - } - - case *v1.Event: - switch b := objB.(type) { - case *core.Event: - return true, Convert_v1_Event_To_core_Event(a, b, s) - } - case *core.Event: - switch b := objB.(type) { - case *v1.Event: - return true, Convert_core_Event_To_v1_Event(a, b, s) - } - - case *v1.ReplicationController: - switch b := objB.(type) { - case *core.ReplicationController: - return true, Convert_v1_ReplicationController_To_core_ReplicationController(a, b, s) - } - case *core.ReplicationController: - switch b := objB.(type) { - case *v1.ReplicationController: - return true, Convert_core_ReplicationController_To_v1_ReplicationController(a, b, s) - } - - case *v1.Node: - switch b := objB.(type) { - case *core.Node: - return true, Convert_v1_Node_To_core_Node(a, b, s) - } - case *core.Node: - switch b := objB.(type) { - case *v1.Node: - return true, Convert_core_Node_To_v1_Node(a, b, s) - } - - case *v1.Namespace: - switch b := objB.(type) { - case *core.Namespace: - return true, Convert_v1_Namespace_To_core_Namespace(a, b, s) - } - case *core.Namespace: - switch b := objB.(type) { - case *v1.Namespace: - return true, Convert_core_Namespace_To_v1_Namespace(a, b, s) - } - - case *v1.Service: - switch b := objB.(type) { - case *core.Service: - return true, Convert_v1_Service_To_core_Service(a, b, s) - } - case *core.Service: - switch b := objB.(type) { - case *v1.Service: - return true, Convert_core_Service_To_v1_Service(a, b, s) - } - - case *v1.Endpoints: - switch b := objB.(type) { - case *core.Endpoints: - return true, Convert_v1_Endpoints_To_core_Endpoints(a, b, s) - } - case *core.Endpoints: - switch b := objB.(type) { - case *v1.Endpoints: - return true, Convert_core_Endpoints_To_v1_Endpoints(a, b, s) - } - - case *metav1.WatchEvent: - switch b := objB.(type) { - case *metav1.InternalEvent: - return true, metav1.Convert_versioned_Event_to_versioned_InternalEvent(a, b, s) - } - case *metav1.InternalEvent: - switch b := objB.(type) { - case *metav1.WatchEvent: - return true, metav1.Convert_versioned_InternalEvent_to_versioned_Event(a, b, s) - } - } - return false, nil - }) - return nil -} - func addConversionFuncs(scheme *runtime.Scheme) error { // Add non-generated conversion functions err := scheme.AddConversionFuncs( @@ -142,19 +43,19 @@ func addConversionFuncs(scheme *runtime.Scheme) error { Convert_v1_Secret_To_core_Secret, Convert_v1_ServiceSpec_To_core_ServiceSpec, Convert_v1_ResourceList_To_core_ResourceList, - Convert_v1_ReplicationController_to_extensions_ReplicaSet, - Convert_v1_ReplicationControllerSpec_to_extensions_ReplicaSetSpec, - Convert_v1_ReplicationControllerStatus_to_extensions_ReplicaSetStatus, - Convert_extensions_ReplicaSet_to_v1_ReplicationController, - Convert_extensions_ReplicaSetSpec_to_v1_ReplicationControllerSpec, - Convert_extensions_ReplicaSetStatus_to_v1_ReplicationControllerStatus, + Convert_v1_ReplicationController_To_extensions_ReplicaSet, + Convert_v1_ReplicationControllerSpec_To_extensions_ReplicaSetSpec, + Convert_v1_ReplicationControllerStatus_To_extensions_ReplicaSetStatus, + Convert_extensions_ReplicaSet_To_v1_ReplicationController, + Convert_extensions_ReplicaSetSpec_To_v1_ReplicationControllerSpec, + Convert_extensions_ReplicaSetStatus_To_v1_ReplicationControllerStatus, ) if err != nil { return err } // Add field conversion funcs. - err = scheme.AddFieldLabelConversionFunc("v1", "Pod", + err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Pod"), func(label, value string) (string, string, error) { switch label { case "metadata.name", @@ -162,6 +63,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { "spec.nodeName", "spec.restartPolicy", "spec.schedulerName", + "spec.serviceAccountName", "status.phase", "status.podIP", "status.nominatedNodeName": @@ -177,7 +79,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err != nil { return err } - err = scheme.AddFieldLabelConversionFunc("v1", "Node", + err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Node"), func(label, value string) (string, string, error) { switch label { case "metadata.name": @@ -192,7 +94,7 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err != nil { return err } - err = scheme.AddFieldLabelConversionFunc("v1", "ReplicationController", + err = scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("ReplicationController"), func(label, value string) (string, string, error) { switch label { case "metadata.name", @@ -218,23 +120,23 @@ func addConversionFuncs(scheme *runtime.Scheme) error { return nil } -func Convert_v1_ReplicationController_to_extensions_ReplicaSet(in *v1.ReplicationController, out *extensions.ReplicaSet, s conversion.Scope) error { +func Convert_v1_ReplicationController_To_extensions_ReplicaSet(in *v1.ReplicationController, out *extensions.ReplicaSet, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if err := Convert_v1_ReplicationControllerSpec_to_extensions_ReplicaSetSpec(&in.Spec, &out.Spec, s); err != nil { + if err := Convert_v1_ReplicationControllerSpec_To_extensions_ReplicaSetSpec(&in.Spec, &out.Spec, s); err != nil { return err } - if err := Convert_v1_ReplicationControllerStatus_to_extensions_ReplicaSetStatus(&in.Status, &out.Status, s); err != nil { + if err := Convert_v1_ReplicationControllerStatus_To_extensions_ReplicaSetStatus(&in.Status, &out.Status, s); err != nil { return err } return nil } -func Convert_v1_ReplicationControllerSpec_to_extensions_ReplicaSetSpec(in *v1.ReplicationControllerSpec, out *extensions.ReplicaSetSpec, s conversion.Scope) error { +func Convert_v1_ReplicationControllerSpec_To_extensions_ReplicaSetSpec(in *v1.ReplicationControllerSpec, out *extensions.ReplicaSetSpec, s conversion.Scope) error { out.Replicas = *in.Replicas out.MinReadySeconds = in.MinReadySeconds if in.Selector != nil { out.Selector = new(metav1.LabelSelector) - metav1.Convert_map_to_unversioned_LabelSelector(&in.Selector, out.Selector, s) + metav1.Convert_Map_string_To_string_To_v1_LabelSelector(&in.Selector, out.Selector, s) } if in.Template != nil { if err := Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(in.Template, &out.Template, s); err != nil { @@ -244,7 +146,7 @@ func Convert_v1_ReplicationControllerSpec_to_extensions_ReplicaSetSpec(in *v1.Re return nil } -func Convert_v1_ReplicationControllerStatus_to_extensions_ReplicaSetStatus(in *v1.ReplicationControllerStatus, out *extensions.ReplicaSetStatus, s conversion.Scope) error { +func Convert_v1_ReplicationControllerStatus_To_extensions_ReplicaSetStatus(in *v1.ReplicationControllerStatus, out *extensions.ReplicaSetStatus, s conversion.Scope) error { out.Replicas = in.Replicas out.FullyLabeledReplicas = in.FullyLabeledReplicas out.ReadyReplicas = in.ReadyReplicas @@ -262,9 +164,9 @@ func Convert_v1_ReplicationControllerStatus_to_extensions_ReplicaSetStatus(in *v return nil } -func Convert_extensions_ReplicaSet_to_v1_ReplicationController(in *extensions.ReplicaSet, out *v1.ReplicationController, s conversion.Scope) error { +func Convert_extensions_ReplicaSet_To_v1_ReplicationController(in *extensions.ReplicaSet, out *v1.ReplicationController, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta - if err := Convert_extensions_ReplicaSetSpec_to_v1_ReplicationControllerSpec(&in.Spec, &out.Spec, s); err != nil { + if err := Convert_extensions_ReplicaSetSpec_To_v1_ReplicationControllerSpec(&in.Spec, &out.Spec, s); err != nil { fieldErr, ok := err.(*field.Error) if !ok { return err @@ -274,19 +176,19 @@ func Convert_extensions_ReplicaSet_to_v1_ReplicationController(in *extensions.Re } out.Annotations[v1.NonConvertibleAnnotationPrefix+"/"+fieldErr.Field] = reflect.ValueOf(fieldErr.BadValue).String() } - if err := Convert_extensions_ReplicaSetStatus_to_v1_ReplicationControllerStatus(&in.Status, &out.Status, s); err != nil { + if err := Convert_extensions_ReplicaSetStatus_To_v1_ReplicationControllerStatus(&in.Status, &out.Status, s); err != nil { return err } return nil } -func Convert_extensions_ReplicaSetSpec_to_v1_ReplicationControllerSpec(in *extensions.ReplicaSetSpec, out *v1.ReplicationControllerSpec, s conversion.Scope) error { +func Convert_extensions_ReplicaSetSpec_To_v1_ReplicationControllerSpec(in *extensions.ReplicaSetSpec, out *v1.ReplicationControllerSpec, s conversion.Scope) error { out.Replicas = new(int32) *out.Replicas = in.Replicas out.MinReadySeconds = in.MinReadySeconds var invalidErr error if in.Selector != nil { - invalidErr = metav1.Convert_unversioned_LabelSelector_to_map(in.Selector, &out.Selector, s) + invalidErr = metav1.Convert_v1_LabelSelector_To_Map_string_To_string(in.Selector, &out.Selector, s) } out.Template = new(v1.PodTemplateSpec) if err := Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(&in.Template, out.Template, s); err != nil { @@ -295,7 +197,7 @@ func Convert_extensions_ReplicaSetSpec_to_v1_ReplicationControllerSpec(in *exten return invalidErr } -func Convert_extensions_ReplicaSetStatus_to_v1_ReplicationControllerStatus(in *extensions.ReplicaSetStatus, out *v1.ReplicationControllerStatus, s conversion.Scope) error { +func Convert_extensions_ReplicaSetStatus_To_v1_ReplicationControllerStatus(in *extensions.ReplicaSetStatus, out *v1.ReplicationControllerStatus, s conversion.Scope) error { out.Replicas = in.Replicas out.FullyLabeledReplicas = in.FullyLabeledReplicas out.ReadyReplicas = in.ReadyReplicas @@ -478,6 +380,11 @@ func Convert_core_SecurityContext_To_v1_SecurityContext(in *core.SecurityContext out.RunAsNonRoot = in.RunAsNonRoot out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.AllowPrivilegeEscalation = in.AllowPrivilegeEscalation + if in.ProcMount != nil { + pm := string(*in.ProcMount) + pmt := v1.ProcMountType(pm) + out.ProcMount = &pmt + } return nil } @@ -553,7 +460,7 @@ func Convert_v1_ResourceList_To_core_ResourceList(in *v1.ResourceList, out *core } func AddFieldLabelConversionsForEvent(scheme *runtime.Scheme) error { - return scheme.AddFieldLabelConversionFunc("v1", "Event", + return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Event"), func(label, value string) (string, string, error) { switch label { case "involvedObject.kind", @@ -576,7 +483,7 @@ func AddFieldLabelConversionsForEvent(scheme *runtime.Scheme) error { } func AddFieldLabelConversionsForNamespace(scheme *runtime.Scheme) error { - return scheme.AddFieldLabelConversionFunc("v1", "Namespace", + return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Namespace"), func(label, value string) (string, string, error) { switch label { case "status.phase", @@ -589,7 +496,7 @@ func AddFieldLabelConversionsForNamespace(scheme *runtime.Scheme) error { } func AddFieldLabelConversionsForSecret(scheme *runtime.Scheme) error { - return scheme.AddFieldLabelConversionFunc("v1", "Secret", + return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Secret"), func(label, value string) (string, string, error) { switch label { case "type", diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go index 110ef54d..1c7e2b32 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/defaults.go @@ -25,7 +25,7 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/util/parsers" - utilpointer "k8s.io/kubernetes/pkg/util/pointer" + utilpointer "k8s.io/utils/pointer" ) func addDefaultingFuncs(scheme *runtime.Scheme) error { @@ -93,6 +93,7 @@ func SetDefaults_Container(obj *v1.Container) { obj.TerminationMessagePolicy = v1.TerminationMessageReadFile } } + func SetDefaults_Service(obj *v1.Service) { if obj.Spec.SessionAffinity == "" { obj.Spec.SessionAffinity = v1.ServiceAffinityNone diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD index 2fc1eda5..79483ac3 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/BUILD @@ -11,12 +11,12 @@ go_test( srcs = ["helpers_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", ], ) @@ -26,12 +26,12 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/core/v1/helper", deps = [ "//pkg/apis/core/helper:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go index c8dbbdce..bf6c001b 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/helpers.go @@ -79,7 +79,7 @@ func HugePageResourceName(pageSize resource.Quantity) v1.ResourceName { // an error is returned. func HugePageSizeFromResourceName(name v1.ResourceName) (resource.Quantity, error) { if !IsHugePageResourceName(name) { - return resource.Quantity{}, fmt.Errorf("resource name: %s is not valid hugepage name", name) + return resource.Quantity{}, fmt.Errorf("resource name: %s is an invalid hugepage name", name) } pageSize := strings.TrimPrefix(string(name), v1.ResourceHugePagesPrefix) return resource.ParseQuantity(pageSize) @@ -283,6 +283,20 @@ func NodeSelectorRequirementsAsFieldSelector(nsm []v1.NodeSelectorRequirement) ( return fields.AndSelectors(selectors...), nil } +// NodeSelectorRequirementKeysExistInNodeSelectorTerms checks if a NodeSelectorTerm with key is already specified in terms +func NodeSelectorRequirementKeysExistInNodeSelectorTerms(reqs []v1.NodeSelectorRequirement, terms []v1.NodeSelectorTerm) bool { + for _, req := range reqs { + for _, term := range terms { + for _, r := range term.MatchExpressions { + if r.Key == req.Key { + return true + } + } + } + } + return false +} + // MatchNodeSelectorTerms checks whether the node labels and fields match node selector terms in ORed; // nil or empty term matches no objects. func MatchNodeSelectorTerms( diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD index f459253d..38108d70 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/helper/qos/BUILD @@ -14,9 +14,9 @@ go_test( "//pkg/apis/core:go_default_library", "//pkg/apis/core/helper/qos:go_default_library", "//pkg/apis/core/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) @@ -26,9 +26,9 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos", deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go index 79611bea..b446b7ea 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/register.go @@ -30,7 +30,7 @@ func init() { // We only register manually written functions here. The registration of the // generated functions takes place in the generated files. The separation // makes the code compile even when the generated files are missing. - localSchemeBuilder.Register(addDefaultingFuncs, addConversionFuncs, addFastPathConversionFuncs) + localSchemeBuilder.Register(addDefaultingFuncs, addConversionFuncs) } // TODO: remove these global varialbes diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD deleted file mode 100644 index ed794151..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/core/v1/validation", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/helper:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/validation.go deleted file mode 100644 index 02362233..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/validation/validation.go +++ /dev/null @@ -1,165 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 validation - -import ( - "fmt" - "strings" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/apimachinery/pkg/util/validation/field" - "k8s.io/kubernetes/pkg/apis/core/helper" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" -) - -const isNegativeErrorMsg string = `must be greater than or equal to 0` -const isNotIntegerErrorMsg string = `must be an integer` - -func ValidateResourceRequirements(requirements *v1.ResourceRequirements, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - limPath := fldPath.Child("limits") - reqPath := fldPath.Child("requests") - for resourceName, quantity := range requirements.Limits { - fldPath := limPath.Key(string(resourceName)) - // Validate resource name. - allErrs = append(allErrs, validateContainerResourceName(string(resourceName), fldPath)...) - - // Validate resource quantity. - allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...) - - } - for resourceName, quantity := range requirements.Requests { - fldPath := reqPath.Key(string(resourceName)) - // Validate resource name. - allErrs = append(allErrs, validateContainerResourceName(string(resourceName), fldPath)...) - // Validate resource quantity. - allErrs = append(allErrs, ValidateResourceQuantityValue(string(resourceName), quantity, fldPath)...) - - // Check that request <= limit. - limitQuantity, exists := requirements.Limits[resourceName] - if exists { - // For GPUs, not only requests can't exceed limits, they also can't be lower, i.e. must be equal. - if quantity.Cmp(limitQuantity) != 0 && !v1helper.IsOvercommitAllowed(resourceName) { - allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be equal to %s limit", resourceName))) - } else if quantity.Cmp(limitQuantity) > 0 { - allErrs = append(allErrs, field.Invalid(reqPath, quantity.String(), fmt.Sprintf("must be less than or equal to %s limit", resourceName))) - } - } - } - - return allErrs -} - -func validateContainerResourceName(value string, fldPath *field.Path) field.ErrorList { - allErrs := validateResourceName(value, fldPath) - if len(strings.Split(value, "/")) == 1 { - if !helper.IsStandardContainerResourceName(value) { - return append(allErrs, field.Invalid(fldPath, value, "must be a standard resource for containers")) - } - } else if !v1helper.IsNativeResource(v1.ResourceName(value)) { - if !v1helper.IsExtendedResourceName(v1.ResourceName(value)) { - return append(allErrs, field.Invalid(fldPath, value, "doesn't follow extended resource name standard")) - } - } - return allErrs -} - -// ValidateResourceQuantityValue enforces that specified quantity is valid for specified resource -func ValidateResourceQuantityValue(resource string, value resource.Quantity, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, ValidateNonnegativeQuantity(value, fldPath)...) - if helper.IsIntegerResourceName(resource) { - if value.MilliValue()%int64(1000) != int64(0) { - allErrs = append(allErrs, field.Invalid(fldPath, value, isNotIntegerErrorMsg)) - } - } - return allErrs -} - -// Validates that a Quantity is not negative -func ValidateNonnegativeQuantity(value resource.Quantity, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if value.Cmp(resource.Quantity{}) < 0 { - allErrs = append(allErrs, field.Invalid(fldPath, value.String(), isNegativeErrorMsg)) - } - return allErrs -} - -// Validate compute resource typename. -// Refer to docs/design/resources.md for more details. -func validateResourceName(value string, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - for _, msg := range validation.IsQualifiedName(value) { - allErrs = append(allErrs, field.Invalid(fldPath, value, msg)) - } - if len(allErrs) != 0 { - return allErrs - } - - if len(strings.Split(value, "/")) == 1 { - if !helper.IsStandardResourceName(value) { - return append(allErrs, field.Invalid(fldPath, value, "must be a standard resource type or fully qualified")) - } - } - - return allErrs -} - -func ValidatePodLogOptions(opts *v1.PodLogOptions) field.ErrorList { - allErrs := field.ErrorList{} - if opts.TailLines != nil && *opts.TailLines < 0 { - allErrs = append(allErrs, field.Invalid(field.NewPath("tailLines"), *opts.TailLines, isNegativeErrorMsg)) - } - if opts.LimitBytes != nil && *opts.LimitBytes < 1 { - allErrs = append(allErrs, field.Invalid(field.NewPath("limitBytes"), *opts.LimitBytes, "must be greater than 0")) - } - switch { - case opts.SinceSeconds != nil && opts.SinceTime != nil: - allErrs = append(allErrs, field.Forbidden(field.NewPath(""), "at most one of `sinceTime` or `sinceSeconds` may be specified")) - case opts.SinceSeconds != nil: - if *opts.SinceSeconds < 1 { - allErrs = append(allErrs, field.Invalid(field.NewPath("sinceSeconds"), *opts.SinceSeconds, "must be greater than 0")) - } - } - return allErrs -} - -func AccumulateUniqueHostPorts(containers []v1.Container, accumulator *sets.String, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - for ci, ctr := range containers { - idxPath := fldPath.Index(ci) - portsPath := idxPath.Child("ports") - for pi := range ctr.Ports { - idxPath := portsPath.Index(pi) - port := ctr.Ports[pi].HostPort - if port == 0 { - continue - } - str := fmt.Sprintf("%d/%s", port, ctr.Ports[pi].Protocol) - if accumulator.Has(str) { - allErrs = append(allErrs, field.Duplicate(idxPath.Child("hostPort"), str)) - } else { - accumulator.Insert(str) - } - } - } - return allErrs -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go index 6ef20a5f..7bfbcf0f 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go @@ -25,11 +25,12 @@ import ( v1 "k8s.io/api/core/v1" resource "k8s.io/apimachinery/pkg/api/resource" - meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" types "k8s.io/apimachinery/pkg/types" core "k8s.io/kubernetes/pkg/apis/core" + extensions "k8s.io/kubernetes/pkg/apis/extensions" ) func init() { @@ -38,397 +39,2053 @@ func init() { // RegisterConversions adds conversion functions to the given scheme. // Public to allow building arbitrary schemes. -func RegisterConversions(scheme *runtime.Scheme) error { - return scheme.AddGeneratedConversionFuncs( - Convert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource, - Convert_core_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource, - Convert_v1_Affinity_To_core_Affinity, - Convert_core_Affinity_To_v1_Affinity, - Convert_v1_AttachedVolume_To_core_AttachedVolume, - Convert_core_AttachedVolume_To_v1_AttachedVolume, - Convert_v1_AvoidPods_To_core_AvoidPods, - Convert_core_AvoidPods_To_v1_AvoidPods, - Convert_v1_AzureDiskVolumeSource_To_core_AzureDiskVolumeSource, - Convert_core_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource, - Convert_v1_AzureFilePersistentVolumeSource_To_core_AzureFilePersistentVolumeSource, - Convert_core_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource, - Convert_v1_AzureFileVolumeSource_To_core_AzureFileVolumeSource, - Convert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource, - Convert_v1_Binding_To_core_Binding, - Convert_core_Binding_To_v1_Binding, - Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource, - Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource, - Convert_v1_Capabilities_To_core_Capabilities, - Convert_core_Capabilities_To_v1_Capabilities, - Convert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource, - Convert_core_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource, - Convert_v1_CephFSVolumeSource_To_core_CephFSVolumeSource, - Convert_core_CephFSVolumeSource_To_v1_CephFSVolumeSource, - Convert_v1_CinderPersistentVolumeSource_To_core_CinderPersistentVolumeSource, - Convert_core_CinderPersistentVolumeSource_To_v1_CinderPersistentVolumeSource, - Convert_v1_CinderVolumeSource_To_core_CinderVolumeSource, - Convert_core_CinderVolumeSource_To_v1_CinderVolumeSource, - Convert_v1_ClientIPConfig_To_core_ClientIPConfig, - Convert_core_ClientIPConfig_To_v1_ClientIPConfig, - Convert_v1_ComponentCondition_To_core_ComponentCondition, - Convert_core_ComponentCondition_To_v1_ComponentCondition, - Convert_v1_ComponentStatus_To_core_ComponentStatus, - Convert_core_ComponentStatus_To_v1_ComponentStatus, - Convert_v1_ComponentStatusList_To_core_ComponentStatusList, - Convert_core_ComponentStatusList_To_v1_ComponentStatusList, - Convert_v1_ConfigMap_To_core_ConfigMap, - Convert_core_ConfigMap_To_v1_ConfigMap, - Convert_v1_ConfigMapEnvSource_To_core_ConfigMapEnvSource, - Convert_core_ConfigMapEnvSource_To_v1_ConfigMapEnvSource, - Convert_v1_ConfigMapKeySelector_To_core_ConfigMapKeySelector, - Convert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector, - Convert_v1_ConfigMapList_To_core_ConfigMapList, - Convert_core_ConfigMapList_To_v1_ConfigMapList, - Convert_v1_ConfigMapNodeConfigSource_To_core_ConfigMapNodeConfigSource, - Convert_core_ConfigMapNodeConfigSource_To_v1_ConfigMapNodeConfigSource, - Convert_v1_ConfigMapProjection_To_core_ConfigMapProjection, - Convert_core_ConfigMapProjection_To_v1_ConfigMapProjection, - Convert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource, - Convert_core_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource, - Convert_v1_Container_To_core_Container, - Convert_core_Container_To_v1_Container, - Convert_v1_ContainerImage_To_core_ContainerImage, - Convert_core_ContainerImage_To_v1_ContainerImage, - Convert_v1_ContainerPort_To_core_ContainerPort, - Convert_core_ContainerPort_To_v1_ContainerPort, - Convert_v1_ContainerState_To_core_ContainerState, - Convert_core_ContainerState_To_v1_ContainerState, - Convert_v1_ContainerStateRunning_To_core_ContainerStateRunning, - Convert_core_ContainerStateRunning_To_v1_ContainerStateRunning, - Convert_v1_ContainerStateTerminated_To_core_ContainerStateTerminated, - Convert_core_ContainerStateTerminated_To_v1_ContainerStateTerminated, - Convert_v1_ContainerStateWaiting_To_core_ContainerStateWaiting, - Convert_core_ContainerStateWaiting_To_v1_ContainerStateWaiting, - Convert_v1_ContainerStatus_To_core_ContainerStatus, - Convert_core_ContainerStatus_To_v1_ContainerStatus, - Convert_v1_DaemonEndpoint_To_core_DaemonEndpoint, - Convert_core_DaemonEndpoint_To_v1_DaemonEndpoint, - Convert_v1_DownwardAPIProjection_To_core_DownwardAPIProjection, - Convert_core_DownwardAPIProjection_To_v1_DownwardAPIProjection, - Convert_v1_DownwardAPIVolumeFile_To_core_DownwardAPIVolumeFile, - Convert_core_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile, - Convert_v1_DownwardAPIVolumeSource_To_core_DownwardAPIVolumeSource, - Convert_core_DownwardAPIVolumeSource_To_v1_DownwardAPIVolumeSource, - Convert_v1_EmptyDirVolumeSource_To_core_EmptyDirVolumeSource, - Convert_core_EmptyDirVolumeSource_To_v1_EmptyDirVolumeSource, - Convert_v1_EndpointAddress_To_core_EndpointAddress, - Convert_core_EndpointAddress_To_v1_EndpointAddress, - Convert_v1_EndpointPort_To_core_EndpointPort, - Convert_core_EndpointPort_To_v1_EndpointPort, - Convert_v1_EndpointSubset_To_core_EndpointSubset, - Convert_core_EndpointSubset_To_v1_EndpointSubset, - Convert_v1_Endpoints_To_core_Endpoints, - Convert_core_Endpoints_To_v1_Endpoints, - Convert_v1_EndpointsList_To_core_EndpointsList, - Convert_core_EndpointsList_To_v1_EndpointsList, - Convert_v1_EnvFromSource_To_core_EnvFromSource, - Convert_core_EnvFromSource_To_v1_EnvFromSource, - Convert_v1_EnvVar_To_core_EnvVar, - Convert_core_EnvVar_To_v1_EnvVar, - Convert_v1_EnvVarSource_To_core_EnvVarSource, - Convert_core_EnvVarSource_To_v1_EnvVarSource, - Convert_v1_Event_To_core_Event, - Convert_core_Event_To_v1_Event, - Convert_v1_EventList_To_core_EventList, - Convert_core_EventList_To_v1_EventList, - Convert_v1_EventSeries_To_core_EventSeries, - Convert_core_EventSeries_To_v1_EventSeries, - Convert_v1_EventSource_To_core_EventSource, - Convert_core_EventSource_To_v1_EventSource, - Convert_v1_ExecAction_To_core_ExecAction, - Convert_core_ExecAction_To_v1_ExecAction, - Convert_v1_FCVolumeSource_To_core_FCVolumeSource, - Convert_core_FCVolumeSource_To_v1_FCVolumeSource, - Convert_v1_FlexPersistentVolumeSource_To_core_FlexPersistentVolumeSource, - Convert_core_FlexPersistentVolumeSource_To_v1_FlexPersistentVolumeSource, - Convert_v1_FlexVolumeSource_To_core_FlexVolumeSource, - Convert_core_FlexVolumeSource_To_v1_FlexVolumeSource, - Convert_v1_FlockerVolumeSource_To_core_FlockerVolumeSource, - Convert_core_FlockerVolumeSource_To_v1_FlockerVolumeSource, - Convert_v1_GCEPersistentDiskVolumeSource_To_core_GCEPersistentDiskVolumeSource, - Convert_core_GCEPersistentDiskVolumeSource_To_v1_GCEPersistentDiskVolumeSource, - Convert_v1_GitRepoVolumeSource_To_core_GitRepoVolumeSource, - Convert_core_GitRepoVolumeSource_To_v1_GitRepoVolumeSource, - Convert_v1_GlusterfsVolumeSource_To_core_GlusterfsVolumeSource, - Convert_core_GlusterfsVolumeSource_To_v1_GlusterfsVolumeSource, - Convert_v1_HTTPGetAction_To_core_HTTPGetAction, - Convert_core_HTTPGetAction_To_v1_HTTPGetAction, - Convert_v1_HTTPHeader_To_core_HTTPHeader, - Convert_core_HTTPHeader_To_v1_HTTPHeader, - Convert_v1_Handler_To_core_Handler, - Convert_core_Handler_To_v1_Handler, - Convert_v1_HostAlias_To_core_HostAlias, - Convert_core_HostAlias_To_v1_HostAlias, - Convert_v1_HostPathVolumeSource_To_core_HostPathVolumeSource, - Convert_core_HostPathVolumeSource_To_v1_HostPathVolumeSource, - Convert_v1_ISCSIPersistentVolumeSource_To_core_ISCSIPersistentVolumeSource, - Convert_core_ISCSIPersistentVolumeSource_To_v1_ISCSIPersistentVolumeSource, - Convert_v1_ISCSIVolumeSource_To_core_ISCSIVolumeSource, - Convert_core_ISCSIVolumeSource_To_v1_ISCSIVolumeSource, - Convert_v1_KeyToPath_To_core_KeyToPath, - Convert_core_KeyToPath_To_v1_KeyToPath, - Convert_v1_Lifecycle_To_core_Lifecycle, - Convert_core_Lifecycle_To_v1_Lifecycle, - Convert_v1_LimitRange_To_core_LimitRange, - Convert_core_LimitRange_To_v1_LimitRange, - Convert_v1_LimitRangeItem_To_core_LimitRangeItem, - Convert_core_LimitRangeItem_To_v1_LimitRangeItem, - Convert_v1_LimitRangeList_To_core_LimitRangeList, - Convert_core_LimitRangeList_To_v1_LimitRangeList, - Convert_v1_LimitRangeSpec_To_core_LimitRangeSpec, - Convert_core_LimitRangeSpec_To_v1_LimitRangeSpec, - Convert_v1_List_To_core_List, - Convert_core_List_To_v1_List, - Convert_v1_LoadBalancerIngress_To_core_LoadBalancerIngress, - Convert_core_LoadBalancerIngress_To_v1_LoadBalancerIngress, - Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus, - Convert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus, - Convert_v1_LocalObjectReference_To_core_LocalObjectReference, - Convert_core_LocalObjectReference_To_v1_LocalObjectReference, - Convert_v1_LocalVolumeSource_To_core_LocalVolumeSource, - Convert_core_LocalVolumeSource_To_v1_LocalVolumeSource, - Convert_v1_NFSVolumeSource_To_core_NFSVolumeSource, - Convert_core_NFSVolumeSource_To_v1_NFSVolumeSource, - Convert_v1_Namespace_To_core_Namespace, - Convert_core_Namespace_To_v1_Namespace, - Convert_v1_NamespaceList_To_core_NamespaceList, - Convert_core_NamespaceList_To_v1_NamespaceList, - Convert_v1_NamespaceSpec_To_core_NamespaceSpec, - Convert_core_NamespaceSpec_To_v1_NamespaceSpec, - Convert_v1_NamespaceStatus_To_core_NamespaceStatus, - Convert_core_NamespaceStatus_To_v1_NamespaceStatus, - Convert_v1_Node_To_core_Node, - Convert_core_Node_To_v1_Node, - Convert_v1_NodeAddress_To_core_NodeAddress, - Convert_core_NodeAddress_To_v1_NodeAddress, - Convert_v1_NodeAffinity_To_core_NodeAffinity, - Convert_core_NodeAffinity_To_v1_NodeAffinity, - Convert_v1_NodeCondition_To_core_NodeCondition, - Convert_core_NodeCondition_To_v1_NodeCondition, - Convert_v1_NodeConfigSource_To_core_NodeConfigSource, - Convert_core_NodeConfigSource_To_v1_NodeConfigSource, - Convert_v1_NodeConfigStatus_To_core_NodeConfigStatus, - Convert_core_NodeConfigStatus_To_v1_NodeConfigStatus, - Convert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints, - Convert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints, - Convert_v1_NodeList_To_core_NodeList, - Convert_core_NodeList_To_v1_NodeList, - Convert_v1_NodeProxyOptions_To_core_NodeProxyOptions, - Convert_core_NodeProxyOptions_To_v1_NodeProxyOptions, - Convert_v1_NodeResources_To_core_NodeResources, - Convert_core_NodeResources_To_v1_NodeResources, - Convert_v1_NodeSelector_To_core_NodeSelector, - Convert_core_NodeSelector_To_v1_NodeSelector, - Convert_v1_NodeSelectorRequirement_To_core_NodeSelectorRequirement, - Convert_core_NodeSelectorRequirement_To_v1_NodeSelectorRequirement, - Convert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm, - Convert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm, - Convert_v1_NodeSpec_To_core_NodeSpec, - Convert_core_NodeSpec_To_v1_NodeSpec, - Convert_v1_NodeStatus_To_core_NodeStatus, - Convert_core_NodeStatus_To_v1_NodeStatus, - Convert_v1_NodeSystemInfo_To_core_NodeSystemInfo, - Convert_core_NodeSystemInfo_To_v1_NodeSystemInfo, - Convert_v1_ObjectFieldSelector_To_core_ObjectFieldSelector, - Convert_core_ObjectFieldSelector_To_v1_ObjectFieldSelector, - Convert_v1_ObjectReference_To_core_ObjectReference, - Convert_core_ObjectReference_To_v1_ObjectReference, - Convert_v1_PersistentVolume_To_core_PersistentVolume, - Convert_core_PersistentVolume_To_v1_PersistentVolume, - Convert_v1_PersistentVolumeClaim_To_core_PersistentVolumeClaim, - Convert_core_PersistentVolumeClaim_To_v1_PersistentVolumeClaim, - Convert_v1_PersistentVolumeClaimCondition_To_core_PersistentVolumeClaimCondition, - Convert_core_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition, - Convert_v1_PersistentVolumeClaimList_To_core_PersistentVolumeClaimList, - Convert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList, - Convert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec, - Convert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec, - Convert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus, - Convert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus, - Convert_v1_PersistentVolumeClaimVolumeSource_To_core_PersistentVolumeClaimVolumeSource, - Convert_core_PersistentVolumeClaimVolumeSource_To_v1_PersistentVolumeClaimVolumeSource, - Convert_v1_PersistentVolumeList_To_core_PersistentVolumeList, - Convert_core_PersistentVolumeList_To_v1_PersistentVolumeList, - Convert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource, - Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource, - Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec, - Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec, - Convert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus, - Convert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus, - Convert_v1_PhotonPersistentDiskVolumeSource_To_core_PhotonPersistentDiskVolumeSource, - Convert_core_PhotonPersistentDiskVolumeSource_To_v1_PhotonPersistentDiskVolumeSource, - Convert_v1_Pod_To_core_Pod, - Convert_core_Pod_To_v1_Pod, - Convert_v1_PodAffinity_To_core_PodAffinity, - Convert_core_PodAffinity_To_v1_PodAffinity, - Convert_v1_PodAffinityTerm_To_core_PodAffinityTerm, - Convert_core_PodAffinityTerm_To_v1_PodAffinityTerm, - Convert_v1_PodAntiAffinity_To_core_PodAntiAffinity, - Convert_core_PodAntiAffinity_To_v1_PodAntiAffinity, - Convert_v1_PodAttachOptions_To_core_PodAttachOptions, - Convert_core_PodAttachOptions_To_v1_PodAttachOptions, - Convert_v1_PodCondition_To_core_PodCondition, - Convert_core_PodCondition_To_v1_PodCondition, - Convert_v1_PodDNSConfig_To_core_PodDNSConfig, - Convert_core_PodDNSConfig_To_v1_PodDNSConfig, - Convert_v1_PodDNSConfigOption_To_core_PodDNSConfigOption, - Convert_core_PodDNSConfigOption_To_v1_PodDNSConfigOption, - Convert_v1_PodExecOptions_To_core_PodExecOptions, - Convert_core_PodExecOptions_To_v1_PodExecOptions, - Convert_v1_PodList_To_core_PodList, - Convert_core_PodList_To_v1_PodList, - Convert_v1_PodLogOptions_To_core_PodLogOptions, - Convert_core_PodLogOptions_To_v1_PodLogOptions, - Convert_v1_PodPortForwardOptions_To_core_PodPortForwardOptions, - Convert_core_PodPortForwardOptions_To_v1_PodPortForwardOptions, - Convert_v1_PodProxyOptions_To_core_PodProxyOptions, - Convert_core_PodProxyOptions_To_v1_PodProxyOptions, - Convert_v1_PodReadinessGate_To_core_PodReadinessGate, - Convert_core_PodReadinessGate_To_v1_PodReadinessGate, - Convert_v1_PodSecurityContext_To_core_PodSecurityContext, - Convert_core_PodSecurityContext_To_v1_PodSecurityContext, - Convert_v1_PodSignature_To_core_PodSignature, - Convert_core_PodSignature_To_v1_PodSignature, - Convert_v1_PodSpec_To_core_PodSpec, - Convert_core_PodSpec_To_v1_PodSpec, - Convert_v1_PodStatus_To_core_PodStatus, - Convert_core_PodStatus_To_v1_PodStatus, - Convert_v1_PodStatusResult_To_core_PodStatusResult, - Convert_core_PodStatusResult_To_v1_PodStatusResult, - Convert_v1_PodTemplate_To_core_PodTemplate, - Convert_core_PodTemplate_To_v1_PodTemplate, - Convert_v1_PodTemplateList_To_core_PodTemplateList, - Convert_core_PodTemplateList_To_v1_PodTemplateList, - Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec, - Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec, - Convert_v1_PortworxVolumeSource_To_core_PortworxVolumeSource, - Convert_core_PortworxVolumeSource_To_v1_PortworxVolumeSource, - Convert_v1_Preconditions_To_core_Preconditions, - Convert_core_Preconditions_To_v1_Preconditions, - Convert_v1_PreferAvoidPodsEntry_To_core_PreferAvoidPodsEntry, - Convert_core_PreferAvoidPodsEntry_To_v1_PreferAvoidPodsEntry, - Convert_v1_PreferredSchedulingTerm_To_core_PreferredSchedulingTerm, - Convert_core_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm, - Convert_v1_Probe_To_core_Probe, - Convert_core_Probe_To_v1_Probe, - Convert_v1_ProjectedVolumeSource_To_core_ProjectedVolumeSource, - Convert_core_ProjectedVolumeSource_To_v1_ProjectedVolumeSource, - Convert_v1_QuobyteVolumeSource_To_core_QuobyteVolumeSource, - Convert_core_QuobyteVolumeSource_To_v1_QuobyteVolumeSource, - Convert_v1_RBDPersistentVolumeSource_To_core_RBDPersistentVolumeSource, - Convert_core_RBDPersistentVolumeSource_To_v1_RBDPersistentVolumeSource, - Convert_v1_RBDVolumeSource_To_core_RBDVolumeSource, - Convert_core_RBDVolumeSource_To_v1_RBDVolumeSource, - Convert_v1_RangeAllocation_To_core_RangeAllocation, - Convert_core_RangeAllocation_To_v1_RangeAllocation, - Convert_v1_ReplicationController_To_core_ReplicationController, - Convert_core_ReplicationController_To_v1_ReplicationController, - Convert_v1_ReplicationControllerCondition_To_core_ReplicationControllerCondition, - Convert_core_ReplicationControllerCondition_To_v1_ReplicationControllerCondition, - Convert_v1_ReplicationControllerList_To_core_ReplicationControllerList, - Convert_core_ReplicationControllerList_To_v1_ReplicationControllerList, - Convert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec, - Convert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec, - Convert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus, - Convert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus, - Convert_v1_ResourceFieldSelector_To_core_ResourceFieldSelector, - Convert_core_ResourceFieldSelector_To_v1_ResourceFieldSelector, - Convert_v1_ResourceQuota_To_core_ResourceQuota, - Convert_core_ResourceQuota_To_v1_ResourceQuota, - Convert_v1_ResourceQuotaList_To_core_ResourceQuotaList, - Convert_core_ResourceQuotaList_To_v1_ResourceQuotaList, - Convert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec, - Convert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec, - Convert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus, - Convert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus, - Convert_v1_ResourceRequirements_To_core_ResourceRequirements, - Convert_core_ResourceRequirements_To_v1_ResourceRequirements, - Convert_v1_SELinuxOptions_To_core_SELinuxOptions, - Convert_core_SELinuxOptions_To_v1_SELinuxOptions, - Convert_v1_ScaleIOPersistentVolumeSource_To_core_ScaleIOPersistentVolumeSource, - Convert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource, - Convert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource, - Convert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource, - Convert_v1_ScopeSelector_To_core_ScopeSelector, - Convert_core_ScopeSelector_To_v1_ScopeSelector, - Convert_v1_ScopedResourceSelectorRequirement_To_core_ScopedResourceSelectorRequirement, - Convert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement, - Convert_v1_Secret_To_core_Secret, - Convert_core_Secret_To_v1_Secret, - Convert_v1_SecretEnvSource_To_core_SecretEnvSource, - Convert_core_SecretEnvSource_To_v1_SecretEnvSource, - Convert_v1_SecretKeySelector_To_core_SecretKeySelector, - Convert_core_SecretKeySelector_To_v1_SecretKeySelector, - Convert_v1_SecretList_To_core_SecretList, - Convert_core_SecretList_To_v1_SecretList, - Convert_v1_SecretProjection_To_core_SecretProjection, - Convert_core_SecretProjection_To_v1_SecretProjection, - Convert_v1_SecretReference_To_core_SecretReference, - Convert_core_SecretReference_To_v1_SecretReference, - Convert_v1_SecretVolumeSource_To_core_SecretVolumeSource, - Convert_core_SecretVolumeSource_To_v1_SecretVolumeSource, - Convert_v1_SecurityContext_To_core_SecurityContext, - Convert_core_SecurityContext_To_v1_SecurityContext, - Convert_v1_SerializedReference_To_core_SerializedReference, - Convert_core_SerializedReference_To_v1_SerializedReference, - Convert_v1_Service_To_core_Service, - Convert_core_Service_To_v1_Service, - Convert_v1_ServiceAccount_To_core_ServiceAccount, - Convert_core_ServiceAccount_To_v1_ServiceAccount, - Convert_v1_ServiceAccountList_To_core_ServiceAccountList, - Convert_core_ServiceAccountList_To_v1_ServiceAccountList, - Convert_v1_ServiceAccountTokenProjection_To_core_ServiceAccountTokenProjection, - Convert_core_ServiceAccountTokenProjection_To_v1_ServiceAccountTokenProjection, - Convert_v1_ServiceList_To_core_ServiceList, - Convert_core_ServiceList_To_v1_ServiceList, - Convert_v1_ServicePort_To_core_ServicePort, - Convert_core_ServicePort_To_v1_ServicePort, - Convert_v1_ServiceProxyOptions_To_core_ServiceProxyOptions, - Convert_core_ServiceProxyOptions_To_v1_ServiceProxyOptions, - Convert_v1_ServiceSpec_To_core_ServiceSpec, - Convert_core_ServiceSpec_To_v1_ServiceSpec, - Convert_v1_ServiceStatus_To_core_ServiceStatus, - Convert_core_ServiceStatus_To_v1_ServiceStatus, - Convert_v1_SessionAffinityConfig_To_core_SessionAffinityConfig, - Convert_core_SessionAffinityConfig_To_v1_SessionAffinityConfig, - Convert_v1_StorageOSPersistentVolumeSource_To_core_StorageOSPersistentVolumeSource, - Convert_core_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource, - Convert_v1_StorageOSVolumeSource_To_core_StorageOSVolumeSource, - Convert_core_StorageOSVolumeSource_To_v1_StorageOSVolumeSource, - Convert_v1_Sysctl_To_core_Sysctl, - Convert_core_Sysctl_To_v1_Sysctl, - Convert_v1_TCPSocketAction_To_core_TCPSocketAction, - Convert_core_TCPSocketAction_To_v1_TCPSocketAction, - Convert_v1_Taint_To_core_Taint, - Convert_core_Taint_To_v1_Taint, - Convert_v1_Toleration_To_core_Toleration, - Convert_core_Toleration_To_v1_Toleration, - Convert_v1_TopologySelectorLabelRequirement_To_core_TopologySelectorLabelRequirement, - Convert_core_TopologySelectorLabelRequirement_To_v1_TopologySelectorLabelRequirement, - Convert_v1_TopologySelectorTerm_To_core_TopologySelectorTerm, - Convert_core_TopologySelectorTerm_To_v1_TopologySelectorTerm, - Convert_v1_Volume_To_core_Volume, - Convert_core_Volume_To_v1_Volume, - Convert_v1_VolumeDevice_To_core_VolumeDevice, - Convert_core_VolumeDevice_To_v1_VolumeDevice, - Convert_v1_VolumeMount_To_core_VolumeMount, - Convert_core_VolumeMount_To_v1_VolumeMount, - Convert_v1_VolumeNodeAffinity_To_core_VolumeNodeAffinity, - Convert_core_VolumeNodeAffinity_To_v1_VolumeNodeAffinity, - Convert_v1_VolumeProjection_To_core_VolumeProjection, - Convert_core_VolumeProjection_To_v1_VolumeProjection, - Convert_v1_VolumeSource_To_core_VolumeSource, - Convert_core_VolumeSource_To_v1_VolumeSource, - Convert_v1_VsphereVirtualDiskVolumeSource_To_core_VsphereVirtualDiskVolumeSource, - Convert_core_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource, - Convert_v1_WeightedPodAffinityTerm_To_core_WeightedPodAffinityTerm, - Convert_core_WeightedPodAffinityTerm_To_v1_WeightedPodAffinityTerm, - ) +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*v1.AWSElasticBlockStoreVolumeSource)(nil), (*core.AWSElasticBlockStoreVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource(a.(*v1.AWSElasticBlockStoreVolumeSource), b.(*core.AWSElasticBlockStoreVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.AWSElasticBlockStoreVolumeSource)(nil), (*v1.AWSElasticBlockStoreVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_AWSElasticBlockStoreVolumeSource_To_v1_AWSElasticBlockStoreVolumeSource(a.(*core.AWSElasticBlockStoreVolumeSource), b.(*v1.AWSElasticBlockStoreVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Affinity)(nil), (*core.Affinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Affinity_To_core_Affinity(a.(*v1.Affinity), b.(*core.Affinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Affinity)(nil), (*v1.Affinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Affinity_To_v1_Affinity(a.(*core.Affinity), b.(*v1.Affinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.AttachedVolume)(nil), (*core.AttachedVolume)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_AttachedVolume_To_core_AttachedVolume(a.(*v1.AttachedVolume), b.(*core.AttachedVolume), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.AttachedVolume)(nil), (*v1.AttachedVolume)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_AttachedVolume_To_v1_AttachedVolume(a.(*core.AttachedVolume), b.(*v1.AttachedVolume), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.AvoidPods)(nil), (*core.AvoidPods)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_AvoidPods_To_core_AvoidPods(a.(*v1.AvoidPods), b.(*core.AvoidPods), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.AvoidPods)(nil), (*v1.AvoidPods)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_AvoidPods_To_v1_AvoidPods(a.(*core.AvoidPods), b.(*v1.AvoidPods), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.AzureDiskVolumeSource)(nil), (*core.AzureDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_AzureDiskVolumeSource_To_core_AzureDiskVolumeSource(a.(*v1.AzureDiskVolumeSource), b.(*core.AzureDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.AzureDiskVolumeSource)(nil), (*v1.AzureDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_AzureDiskVolumeSource_To_v1_AzureDiskVolumeSource(a.(*core.AzureDiskVolumeSource), b.(*v1.AzureDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.AzureFilePersistentVolumeSource)(nil), (*core.AzureFilePersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_AzureFilePersistentVolumeSource_To_core_AzureFilePersistentVolumeSource(a.(*v1.AzureFilePersistentVolumeSource), b.(*core.AzureFilePersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.AzureFilePersistentVolumeSource)(nil), (*v1.AzureFilePersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_AzureFilePersistentVolumeSource_To_v1_AzureFilePersistentVolumeSource(a.(*core.AzureFilePersistentVolumeSource), b.(*v1.AzureFilePersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.AzureFileVolumeSource)(nil), (*core.AzureFileVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_AzureFileVolumeSource_To_core_AzureFileVolumeSource(a.(*v1.AzureFileVolumeSource), b.(*core.AzureFileVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.AzureFileVolumeSource)(nil), (*v1.AzureFileVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_AzureFileVolumeSource_To_v1_AzureFileVolumeSource(a.(*core.AzureFileVolumeSource), b.(*v1.AzureFileVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Binding)(nil), (*core.Binding)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Binding_To_core_Binding(a.(*v1.Binding), b.(*core.Binding), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Binding)(nil), (*v1.Binding)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Binding_To_v1_Binding(a.(*core.Binding), b.(*v1.Binding), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CSIPersistentVolumeSource)(nil), (*core.CSIPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CSIPersistentVolumeSource_To_core_CSIPersistentVolumeSource(a.(*v1.CSIPersistentVolumeSource), b.(*core.CSIPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.CSIPersistentVolumeSource)(nil), (*v1.CSIPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_CSIPersistentVolumeSource_To_v1_CSIPersistentVolumeSource(a.(*core.CSIPersistentVolumeSource), b.(*v1.CSIPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Capabilities)(nil), (*core.Capabilities)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Capabilities_To_core_Capabilities(a.(*v1.Capabilities), b.(*core.Capabilities), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Capabilities)(nil), (*v1.Capabilities)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Capabilities_To_v1_Capabilities(a.(*core.Capabilities), b.(*v1.Capabilities), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CephFSPersistentVolumeSource)(nil), (*core.CephFSPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CephFSPersistentVolumeSource_To_core_CephFSPersistentVolumeSource(a.(*v1.CephFSPersistentVolumeSource), b.(*core.CephFSPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.CephFSPersistentVolumeSource)(nil), (*v1.CephFSPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_CephFSPersistentVolumeSource_To_v1_CephFSPersistentVolumeSource(a.(*core.CephFSPersistentVolumeSource), b.(*v1.CephFSPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CephFSVolumeSource)(nil), (*core.CephFSVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CephFSVolumeSource_To_core_CephFSVolumeSource(a.(*v1.CephFSVolumeSource), b.(*core.CephFSVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.CephFSVolumeSource)(nil), (*v1.CephFSVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_CephFSVolumeSource_To_v1_CephFSVolumeSource(a.(*core.CephFSVolumeSource), b.(*v1.CephFSVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CinderPersistentVolumeSource)(nil), (*core.CinderPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CinderPersistentVolumeSource_To_core_CinderPersistentVolumeSource(a.(*v1.CinderPersistentVolumeSource), b.(*core.CinderPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.CinderPersistentVolumeSource)(nil), (*v1.CinderPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_CinderPersistentVolumeSource_To_v1_CinderPersistentVolumeSource(a.(*core.CinderPersistentVolumeSource), b.(*v1.CinderPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.CinderVolumeSource)(nil), (*core.CinderVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_CinderVolumeSource_To_core_CinderVolumeSource(a.(*v1.CinderVolumeSource), b.(*core.CinderVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.CinderVolumeSource)(nil), (*v1.CinderVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_CinderVolumeSource_To_v1_CinderVolumeSource(a.(*core.CinderVolumeSource), b.(*v1.CinderVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ClientIPConfig)(nil), (*core.ClientIPConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ClientIPConfig_To_core_ClientIPConfig(a.(*v1.ClientIPConfig), b.(*core.ClientIPConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ClientIPConfig)(nil), (*v1.ClientIPConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ClientIPConfig_To_v1_ClientIPConfig(a.(*core.ClientIPConfig), b.(*v1.ClientIPConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ComponentCondition)(nil), (*core.ComponentCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ComponentCondition_To_core_ComponentCondition(a.(*v1.ComponentCondition), b.(*core.ComponentCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ComponentCondition)(nil), (*v1.ComponentCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ComponentCondition_To_v1_ComponentCondition(a.(*core.ComponentCondition), b.(*v1.ComponentCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ComponentStatus)(nil), (*core.ComponentStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ComponentStatus_To_core_ComponentStatus(a.(*v1.ComponentStatus), b.(*core.ComponentStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ComponentStatus)(nil), (*v1.ComponentStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ComponentStatus_To_v1_ComponentStatus(a.(*core.ComponentStatus), b.(*v1.ComponentStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ComponentStatusList)(nil), (*core.ComponentStatusList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ComponentStatusList_To_core_ComponentStatusList(a.(*v1.ComponentStatusList), b.(*core.ComponentStatusList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ComponentStatusList)(nil), (*v1.ComponentStatusList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ComponentStatusList_To_v1_ComponentStatusList(a.(*core.ComponentStatusList), b.(*v1.ComponentStatusList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ConfigMap)(nil), (*core.ConfigMap)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ConfigMap_To_core_ConfigMap(a.(*v1.ConfigMap), b.(*core.ConfigMap), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ConfigMap)(nil), (*v1.ConfigMap)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ConfigMap_To_v1_ConfigMap(a.(*core.ConfigMap), b.(*v1.ConfigMap), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ConfigMapEnvSource)(nil), (*core.ConfigMapEnvSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ConfigMapEnvSource_To_core_ConfigMapEnvSource(a.(*v1.ConfigMapEnvSource), b.(*core.ConfigMapEnvSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ConfigMapEnvSource)(nil), (*v1.ConfigMapEnvSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ConfigMapEnvSource_To_v1_ConfigMapEnvSource(a.(*core.ConfigMapEnvSource), b.(*v1.ConfigMapEnvSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ConfigMapKeySelector)(nil), (*core.ConfigMapKeySelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ConfigMapKeySelector_To_core_ConfigMapKeySelector(a.(*v1.ConfigMapKeySelector), b.(*core.ConfigMapKeySelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ConfigMapKeySelector)(nil), (*v1.ConfigMapKeySelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector(a.(*core.ConfigMapKeySelector), b.(*v1.ConfigMapKeySelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ConfigMapList)(nil), (*core.ConfigMapList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ConfigMapList_To_core_ConfigMapList(a.(*v1.ConfigMapList), b.(*core.ConfigMapList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ConfigMapList)(nil), (*v1.ConfigMapList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ConfigMapList_To_v1_ConfigMapList(a.(*core.ConfigMapList), b.(*v1.ConfigMapList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ConfigMapNodeConfigSource)(nil), (*core.ConfigMapNodeConfigSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ConfigMapNodeConfigSource_To_core_ConfigMapNodeConfigSource(a.(*v1.ConfigMapNodeConfigSource), b.(*core.ConfigMapNodeConfigSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ConfigMapNodeConfigSource)(nil), (*v1.ConfigMapNodeConfigSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ConfigMapNodeConfigSource_To_v1_ConfigMapNodeConfigSource(a.(*core.ConfigMapNodeConfigSource), b.(*v1.ConfigMapNodeConfigSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ConfigMapProjection)(nil), (*core.ConfigMapProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ConfigMapProjection_To_core_ConfigMapProjection(a.(*v1.ConfigMapProjection), b.(*core.ConfigMapProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ConfigMapProjection)(nil), (*v1.ConfigMapProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ConfigMapProjection_To_v1_ConfigMapProjection(a.(*core.ConfigMapProjection), b.(*v1.ConfigMapProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ConfigMapVolumeSource)(nil), (*core.ConfigMapVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource(a.(*v1.ConfigMapVolumeSource), b.(*core.ConfigMapVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ConfigMapVolumeSource)(nil), (*v1.ConfigMapVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ConfigMapVolumeSource_To_v1_ConfigMapVolumeSource(a.(*core.ConfigMapVolumeSource), b.(*v1.ConfigMapVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Container)(nil), (*core.Container)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Container_To_core_Container(a.(*v1.Container), b.(*core.Container), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Container)(nil), (*v1.Container)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Container_To_v1_Container(a.(*core.Container), b.(*v1.Container), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ContainerImage)(nil), (*core.ContainerImage)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ContainerImage_To_core_ContainerImage(a.(*v1.ContainerImage), b.(*core.ContainerImage), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ContainerImage)(nil), (*v1.ContainerImage)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ContainerImage_To_v1_ContainerImage(a.(*core.ContainerImage), b.(*v1.ContainerImage), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ContainerPort)(nil), (*core.ContainerPort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ContainerPort_To_core_ContainerPort(a.(*v1.ContainerPort), b.(*core.ContainerPort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ContainerPort)(nil), (*v1.ContainerPort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ContainerPort_To_v1_ContainerPort(a.(*core.ContainerPort), b.(*v1.ContainerPort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ContainerState)(nil), (*core.ContainerState)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ContainerState_To_core_ContainerState(a.(*v1.ContainerState), b.(*core.ContainerState), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ContainerState)(nil), (*v1.ContainerState)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ContainerState_To_v1_ContainerState(a.(*core.ContainerState), b.(*v1.ContainerState), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ContainerStateRunning)(nil), (*core.ContainerStateRunning)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ContainerStateRunning_To_core_ContainerStateRunning(a.(*v1.ContainerStateRunning), b.(*core.ContainerStateRunning), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ContainerStateRunning)(nil), (*v1.ContainerStateRunning)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ContainerStateRunning_To_v1_ContainerStateRunning(a.(*core.ContainerStateRunning), b.(*v1.ContainerStateRunning), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ContainerStateTerminated)(nil), (*core.ContainerStateTerminated)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ContainerStateTerminated_To_core_ContainerStateTerminated(a.(*v1.ContainerStateTerminated), b.(*core.ContainerStateTerminated), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ContainerStateTerminated)(nil), (*v1.ContainerStateTerminated)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ContainerStateTerminated_To_v1_ContainerStateTerminated(a.(*core.ContainerStateTerminated), b.(*v1.ContainerStateTerminated), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ContainerStateWaiting)(nil), (*core.ContainerStateWaiting)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ContainerStateWaiting_To_core_ContainerStateWaiting(a.(*v1.ContainerStateWaiting), b.(*core.ContainerStateWaiting), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ContainerStateWaiting)(nil), (*v1.ContainerStateWaiting)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ContainerStateWaiting_To_v1_ContainerStateWaiting(a.(*core.ContainerStateWaiting), b.(*v1.ContainerStateWaiting), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ContainerStatus)(nil), (*core.ContainerStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ContainerStatus_To_core_ContainerStatus(a.(*v1.ContainerStatus), b.(*core.ContainerStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ContainerStatus)(nil), (*v1.ContainerStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ContainerStatus_To_v1_ContainerStatus(a.(*core.ContainerStatus), b.(*v1.ContainerStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.DaemonEndpoint)(nil), (*core.DaemonEndpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_DaemonEndpoint_To_core_DaemonEndpoint(a.(*v1.DaemonEndpoint), b.(*core.DaemonEndpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.DaemonEndpoint)(nil), (*v1.DaemonEndpoint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_DaemonEndpoint_To_v1_DaemonEndpoint(a.(*core.DaemonEndpoint), b.(*v1.DaemonEndpoint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.DownwardAPIProjection)(nil), (*core.DownwardAPIProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_DownwardAPIProjection_To_core_DownwardAPIProjection(a.(*v1.DownwardAPIProjection), b.(*core.DownwardAPIProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.DownwardAPIProjection)(nil), (*v1.DownwardAPIProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_DownwardAPIProjection_To_v1_DownwardAPIProjection(a.(*core.DownwardAPIProjection), b.(*v1.DownwardAPIProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.DownwardAPIVolumeFile)(nil), (*core.DownwardAPIVolumeFile)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_DownwardAPIVolumeFile_To_core_DownwardAPIVolumeFile(a.(*v1.DownwardAPIVolumeFile), b.(*core.DownwardAPIVolumeFile), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.DownwardAPIVolumeFile)(nil), (*v1.DownwardAPIVolumeFile)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_DownwardAPIVolumeFile_To_v1_DownwardAPIVolumeFile(a.(*core.DownwardAPIVolumeFile), b.(*v1.DownwardAPIVolumeFile), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.DownwardAPIVolumeSource)(nil), (*core.DownwardAPIVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_DownwardAPIVolumeSource_To_core_DownwardAPIVolumeSource(a.(*v1.DownwardAPIVolumeSource), b.(*core.DownwardAPIVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.DownwardAPIVolumeSource)(nil), (*v1.DownwardAPIVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_DownwardAPIVolumeSource_To_v1_DownwardAPIVolumeSource(a.(*core.DownwardAPIVolumeSource), b.(*v1.DownwardAPIVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EmptyDirVolumeSource)(nil), (*core.EmptyDirVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EmptyDirVolumeSource_To_core_EmptyDirVolumeSource(a.(*v1.EmptyDirVolumeSource), b.(*core.EmptyDirVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EmptyDirVolumeSource)(nil), (*v1.EmptyDirVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EmptyDirVolumeSource_To_v1_EmptyDirVolumeSource(a.(*core.EmptyDirVolumeSource), b.(*v1.EmptyDirVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointAddress)(nil), (*core.EndpointAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointAddress_To_core_EndpointAddress(a.(*v1.EndpointAddress), b.(*core.EndpointAddress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EndpointAddress)(nil), (*v1.EndpointAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EndpointAddress_To_v1_EndpointAddress(a.(*core.EndpointAddress), b.(*v1.EndpointAddress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointPort)(nil), (*core.EndpointPort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointPort_To_core_EndpointPort(a.(*v1.EndpointPort), b.(*core.EndpointPort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EndpointPort)(nil), (*v1.EndpointPort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EndpointPort_To_v1_EndpointPort(a.(*core.EndpointPort), b.(*v1.EndpointPort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointSubset)(nil), (*core.EndpointSubset)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointSubset_To_core_EndpointSubset(a.(*v1.EndpointSubset), b.(*core.EndpointSubset), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EndpointSubset)(nil), (*v1.EndpointSubset)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EndpointSubset_To_v1_EndpointSubset(a.(*core.EndpointSubset), b.(*v1.EndpointSubset), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Endpoints)(nil), (*core.Endpoints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Endpoints_To_core_Endpoints(a.(*v1.Endpoints), b.(*core.Endpoints), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Endpoints)(nil), (*v1.Endpoints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Endpoints_To_v1_Endpoints(a.(*core.Endpoints), b.(*v1.Endpoints), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EndpointsList)(nil), (*core.EndpointsList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EndpointsList_To_core_EndpointsList(a.(*v1.EndpointsList), b.(*core.EndpointsList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EndpointsList)(nil), (*v1.EndpointsList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EndpointsList_To_v1_EndpointsList(a.(*core.EndpointsList), b.(*v1.EndpointsList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EnvFromSource)(nil), (*core.EnvFromSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EnvFromSource_To_core_EnvFromSource(a.(*v1.EnvFromSource), b.(*core.EnvFromSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EnvFromSource)(nil), (*v1.EnvFromSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EnvFromSource_To_v1_EnvFromSource(a.(*core.EnvFromSource), b.(*v1.EnvFromSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EnvVar)(nil), (*core.EnvVar)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EnvVar_To_core_EnvVar(a.(*v1.EnvVar), b.(*core.EnvVar), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EnvVar)(nil), (*v1.EnvVar)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EnvVar_To_v1_EnvVar(a.(*core.EnvVar), b.(*v1.EnvVar), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EnvVarSource)(nil), (*core.EnvVarSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EnvVarSource_To_core_EnvVarSource(a.(*v1.EnvVarSource), b.(*core.EnvVarSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EnvVarSource)(nil), (*v1.EnvVarSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EnvVarSource_To_v1_EnvVarSource(a.(*core.EnvVarSource), b.(*v1.EnvVarSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Event)(nil), (*core.Event)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Event_To_core_Event(a.(*v1.Event), b.(*core.Event), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Event)(nil), (*v1.Event)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Event_To_v1_Event(a.(*core.Event), b.(*v1.Event), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EventList)(nil), (*core.EventList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EventList_To_core_EventList(a.(*v1.EventList), b.(*core.EventList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EventList)(nil), (*v1.EventList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EventList_To_v1_EventList(a.(*core.EventList), b.(*v1.EventList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EventSeries)(nil), (*core.EventSeries)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EventSeries_To_core_EventSeries(a.(*v1.EventSeries), b.(*core.EventSeries), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EventSeries)(nil), (*v1.EventSeries)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EventSeries_To_v1_EventSeries(a.(*core.EventSeries), b.(*v1.EventSeries), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.EventSource)(nil), (*core.EventSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_EventSource_To_core_EventSource(a.(*v1.EventSource), b.(*core.EventSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.EventSource)(nil), (*v1.EventSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_EventSource_To_v1_EventSource(a.(*core.EventSource), b.(*v1.EventSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ExecAction)(nil), (*core.ExecAction)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ExecAction_To_core_ExecAction(a.(*v1.ExecAction), b.(*core.ExecAction), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ExecAction)(nil), (*v1.ExecAction)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ExecAction_To_v1_ExecAction(a.(*core.ExecAction), b.(*v1.ExecAction), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.FCVolumeSource)(nil), (*core.FCVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_FCVolumeSource_To_core_FCVolumeSource(a.(*v1.FCVolumeSource), b.(*core.FCVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.FCVolumeSource)(nil), (*v1.FCVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_FCVolumeSource_To_v1_FCVolumeSource(a.(*core.FCVolumeSource), b.(*v1.FCVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.FlexPersistentVolumeSource)(nil), (*core.FlexPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_FlexPersistentVolumeSource_To_core_FlexPersistentVolumeSource(a.(*v1.FlexPersistentVolumeSource), b.(*core.FlexPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.FlexPersistentVolumeSource)(nil), (*v1.FlexPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_FlexPersistentVolumeSource_To_v1_FlexPersistentVolumeSource(a.(*core.FlexPersistentVolumeSource), b.(*v1.FlexPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.FlexVolumeSource)(nil), (*core.FlexVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_FlexVolumeSource_To_core_FlexVolumeSource(a.(*v1.FlexVolumeSource), b.(*core.FlexVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.FlexVolumeSource)(nil), (*v1.FlexVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_FlexVolumeSource_To_v1_FlexVolumeSource(a.(*core.FlexVolumeSource), b.(*v1.FlexVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.FlockerVolumeSource)(nil), (*core.FlockerVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_FlockerVolumeSource_To_core_FlockerVolumeSource(a.(*v1.FlockerVolumeSource), b.(*core.FlockerVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.FlockerVolumeSource)(nil), (*v1.FlockerVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_FlockerVolumeSource_To_v1_FlockerVolumeSource(a.(*core.FlockerVolumeSource), b.(*v1.FlockerVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.GCEPersistentDiskVolumeSource)(nil), (*core.GCEPersistentDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_GCEPersistentDiskVolumeSource_To_core_GCEPersistentDiskVolumeSource(a.(*v1.GCEPersistentDiskVolumeSource), b.(*core.GCEPersistentDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.GCEPersistentDiskVolumeSource)(nil), (*v1.GCEPersistentDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_GCEPersistentDiskVolumeSource_To_v1_GCEPersistentDiskVolumeSource(a.(*core.GCEPersistentDiskVolumeSource), b.(*v1.GCEPersistentDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.GitRepoVolumeSource)(nil), (*core.GitRepoVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_GitRepoVolumeSource_To_core_GitRepoVolumeSource(a.(*v1.GitRepoVolumeSource), b.(*core.GitRepoVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.GitRepoVolumeSource)(nil), (*v1.GitRepoVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_GitRepoVolumeSource_To_v1_GitRepoVolumeSource(a.(*core.GitRepoVolumeSource), b.(*v1.GitRepoVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.GlusterfsVolumeSource)(nil), (*core.GlusterfsVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_GlusterfsVolumeSource_To_core_GlusterfsVolumeSource(a.(*v1.GlusterfsVolumeSource), b.(*core.GlusterfsVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.GlusterfsVolumeSource)(nil), (*v1.GlusterfsVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_GlusterfsVolumeSource_To_v1_GlusterfsVolumeSource(a.(*core.GlusterfsVolumeSource), b.(*v1.GlusterfsVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.HTTPGetAction)(nil), (*core.HTTPGetAction)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_HTTPGetAction_To_core_HTTPGetAction(a.(*v1.HTTPGetAction), b.(*core.HTTPGetAction), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.HTTPGetAction)(nil), (*v1.HTTPGetAction)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_HTTPGetAction_To_v1_HTTPGetAction(a.(*core.HTTPGetAction), b.(*v1.HTTPGetAction), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.HTTPHeader)(nil), (*core.HTTPHeader)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_HTTPHeader_To_core_HTTPHeader(a.(*v1.HTTPHeader), b.(*core.HTTPHeader), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.HTTPHeader)(nil), (*v1.HTTPHeader)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_HTTPHeader_To_v1_HTTPHeader(a.(*core.HTTPHeader), b.(*v1.HTTPHeader), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Handler)(nil), (*core.Handler)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Handler_To_core_Handler(a.(*v1.Handler), b.(*core.Handler), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Handler)(nil), (*v1.Handler)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Handler_To_v1_Handler(a.(*core.Handler), b.(*v1.Handler), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.HostAlias)(nil), (*core.HostAlias)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_HostAlias_To_core_HostAlias(a.(*v1.HostAlias), b.(*core.HostAlias), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.HostAlias)(nil), (*v1.HostAlias)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_HostAlias_To_v1_HostAlias(a.(*core.HostAlias), b.(*v1.HostAlias), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.HostPathVolumeSource)(nil), (*core.HostPathVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_HostPathVolumeSource_To_core_HostPathVolumeSource(a.(*v1.HostPathVolumeSource), b.(*core.HostPathVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.HostPathVolumeSource)(nil), (*v1.HostPathVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_HostPathVolumeSource_To_v1_HostPathVolumeSource(a.(*core.HostPathVolumeSource), b.(*v1.HostPathVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ISCSIPersistentVolumeSource)(nil), (*core.ISCSIPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ISCSIPersistentVolumeSource_To_core_ISCSIPersistentVolumeSource(a.(*v1.ISCSIPersistentVolumeSource), b.(*core.ISCSIPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ISCSIPersistentVolumeSource)(nil), (*v1.ISCSIPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ISCSIPersistentVolumeSource_To_v1_ISCSIPersistentVolumeSource(a.(*core.ISCSIPersistentVolumeSource), b.(*v1.ISCSIPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ISCSIVolumeSource)(nil), (*core.ISCSIVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ISCSIVolumeSource_To_core_ISCSIVolumeSource(a.(*v1.ISCSIVolumeSource), b.(*core.ISCSIVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ISCSIVolumeSource)(nil), (*v1.ISCSIVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ISCSIVolumeSource_To_v1_ISCSIVolumeSource(a.(*core.ISCSIVolumeSource), b.(*v1.ISCSIVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.KeyToPath)(nil), (*core.KeyToPath)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_KeyToPath_To_core_KeyToPath(a.(*v1.KeyToPath), b.(*core.KeyToPath), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.KeyToPath)(nil), (*v1.KeyToPath)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_KeyToPath_To_v1_KeyToPath(a.(*core.KeyToPath), b.(*v1.KeyToPath), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Lifecycle)(nil), (*core.Lifecycle)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Lifecycle_To_core_Lifecycle(a.(*v1.Lifecycle), b.(*core.Lifecycle), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Lifecycle)(nil), (*v1.Lifecycle)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Lifecycle_To_v1_Lifecycle(a.(*core.Lifecycle), b.(*v1.Lifecycle), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LimitRange)(nil), (*core.LimitRange)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LimitRange_To_core_LimitRange(a.(*v1.LimitRange), b.(*core.LimitRange), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LimitRange)(nil), (*v1.LimitRange)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LimitRange_To_v1_LimitRange(a.(*core.LimitRange), b.(*v1.LimitRange), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LimitRangeItem)(nil), (*core.LimitRangeItem)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LimitRangeItem_To_core_LimitRangeItem(a.(*v1.LimitRangeItem), b.(*core.LimitRangeItem), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LimitRangeItem)(nil), (*v1.LimitRangeItem)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LimitRangeItem_To_v1_LimitRangeItem(a.(*core.LimitRangeItem), b.(*v1.LimitRangeItem), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LimitRangeList)(nil), (*core.LimitRangeList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LimitRangeList_To_core_LimitRangeList(a.(*v1.LimitRangeList), b.(*core.LimitRangeList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LimitRangeList)(nil), (*v1.LimitRangeList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LimitRangeList_To_v1_LimitRangeList(a.(*core.LimitRangeList), b.(*v1.LimitRangeList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LimitRangeSpec)(nil), (*core.LimitRangeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LimitRangeSpec_To_core_LimitRangeSpec(a.(*v1.LimitRangeSpec), b.(*core.LimitRangeSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LimitRangeSpec)(nil), (*v1.LimitRangeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LimitRangeSpec_To_v1_LimitRangeSpec(a.(*core.LimitRangeSpec), b.(*v1.LimitRangeSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.List)(nil), (*core.List)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_List_To_core_List(a.(*v1.List), b.(*core.List), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.List)(nil), (*v1.List)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_List_To_v1_List(a.(*core.List), b.(*v1.List), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LoadBalancerIngress)(nil), (*core.LoadBalancerIngress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LoadBalancerIngress_To_core_LoadBalancerIngress(a.(*v1.LoadBalancerIngress), b.(*core.LoadBalancerIngress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LoadBalancerIngress)(nil), (*v1.LoadBalancerIngress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LoadBalancerIngress_To_v1_LoadBalancerIngress(a.(*core.LoadBalancerIngress), b.(*v1.LoadBalancerIngress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LoadBalancerStatus)(nil), (*core.LoadBalancerStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus(a.(*v1.LoadBalancerStatus), b.(*core.LoadBalancerStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LoadBalancerStatus)(nil), (*v1.LoadBalancerStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LoadBalancerStatus_To_v1_LoadBalancerStatus(a.(*core.LoadBalancerStatus), b.(*v1.LoadBalancerStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LocalObjectReference)(nil), (*core.LocalObjectReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LocalObjectReference_To_core_LocalObjectReference(a.(*v1.LocalObjectReference), b.(*core.LocalObjectReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LocalObjectReference)(nil), (*v1.LocalObjectReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LocalObjectReference_To_v1_LocalObjectReference(a.(*core.LocalObjectReference), b.(*v1.LocalObjectReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.LocalVolumeSource)(nil), (*core.LocalVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_LocalVolumeSource_To_core_LocalVolumeSource(a.(*v1.LocalVolumeSource), b.(*core.LocalVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.LocalVolumeSource)(nil), (*v1.LocalVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_LocalVolumeSource_To_v1_LocalVolumeSource(a.(*core.LocalVolumeSource), b.(*v1.LocalVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NFSVolumeSource)(nil), (*core.NFSVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NFSVolumeSource_To_core_NFSVolumeSource(a.(*v1.NFSVolumeSource), b.(*core.NFSVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NFSVolumeSource)(nil), (*v1.NFSVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NFSVolumeSource_To_v1_NFSVolumeSource(a.(*core.NFSVolumeSource), b.(*v1.NFSVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Namespace)(nil), (*core.Namespace)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Namespace_To_core_Namespace(a.(*v1.Namespace), b.(*core.Namespace), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Namespace)(nil), (*v1.Namespace)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Namespace_To_v1_Namespace(a.(*core.Namespace), b.(*v1.Namespace), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NamespaceList)(nil), (*core.NamespaceList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NamespaceList_To_core_NamespaceList(a.(*v1.NamespaceList), b.(*core.NamespaceList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NamespaceList)(nil), (*v1.NamespaceList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NamespaceList_To_v1_NamespaceList(a.(*core.NamespaceList), b.(*v1.NamespaceList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NamespaceSpec)(nil), (*core.NamespaceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NamespaceSpec_To_core_NamespaceSpec(a.(*v1.NamespaceSpec), b.(*core.NamespaceSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NamespaceSpec)(nil), (*v1.NamespaceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NamespaceSpec_To_v1_NamespaceSpec(a.(*core.NamespaceSpec), b.(*v1.NamespaceSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NamespaceStatus)(nil), (*core.NamespaceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NamespaceStatus_To_core_NamespaceStatus(a.(*v1.NamespaceStatus), b.(*core.NamespaceStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NamespaceStatus)(nil), (*v1.NamespaceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NamespaceStatus_To_v1_NamespaceStatus(a.(*core.NamespaceStatus), b.(*v1.NamespaceStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Node)(nil), (*core.Node)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Node_To_core_Node(a.(*v1.Node), b.(*core.Node), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Node)(nil), (*v1.Node)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Node_To_v1_Node(a.(*core.Node), b.(*v1.Node), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeAddress)(nil), (*core.NodeAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeAddress_To_core_NodeAddress(a.(*v1.NodeAddress), b.(*core.NodeAddress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeAddress)(nil), (*v1.NodeAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeAddress_To_v1_NodeAddress(a.(*core.NodeAddress), b.(*v1.NodeAddress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeAffinity)(nil), (*core.NodeAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeAffinity_To_core_NodeAffinity(a.(*v1.NodeAffinity), b.(*core.NodeAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeAffinity)(nil), (*v1.NodeAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeAffinity_To_v1_NodeAffinity(a.(*core.NodeAffinity), b.(*v1.NodeAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeCondition)(nil), (*core.NodeCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeCondition_To_core_NodeCondition(a.(*v1.NodeCondition), b.(*core.NodeCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeCondition)(nil), (*v1.NodeCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeCondition_To_v1_NodeCondition(a.(*core.NodeCondition), b.(*v1.NodeCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeConfigSource)(nil), (*core.NodeConfigSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeConfigSource_To_core_NodeConfigSource(a.(*v1.NodeConfigSource), b.(*core.NodeConfigSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeConfigSource)(nil), (*v1.NodeConfigSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeConfigSource_To_v1_NodeConfigSource(a.(*core.NodeConfigSource), b.(*v1.NodeConfigSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeConfigStatus)(nil), (*core.NodeConfigStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeConfigStatus_To_core_NodeConfigStatus(a.(*v1.NodeConfigStatus), b.(*core.NodeConfigStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeConfigStatus)(nil), (*v1.NodeConfigStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeConfigStatus_To_v1_NodeConfigStatus(a.(*core.NodeConfigStatus), b.(*v1.NodeConfigStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeDaemonEndpoints)(nil), (*core.NodeDaemonEndpoints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeDaemonEndpoints_To_core_NodeDaemonEndpoints(a.(*v1.NodeDaemonEndpoints), b.(*core.NodeDaemonEndpoints), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeDaemonEndpoints)(nil), (*v1.NodeDaemonEndpoints)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeDaemonEndpoints_To_v1_NodeDaemonEndpoints(a.(*core.NodeDaemonEndpoints), b.(*v1.NodeDaemonEndpoints), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeList)(nil), (*core.NodeList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeList_To_core_NodeList(a.(*v1.NodeList), b.(*core.NodeList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeList)(nil), (*v1.NodeList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeList_To_v1_NodeList(a.(*core.NodeList), b.(*v1.NodeList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeProxyOptions)(nil), (*core.NodeProxyOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeProxyOptions_To_core_NodeProxyOptions(a.(*v1.NodeProxyOptions), b.(*core.NodeProxyOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeProxyOptions)(nil), (*v1.NodeProxyOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeProxyOptions_To_v1_NodeProxyOptions(a.(*core.NodeProxyOptions), b.(*v1.NodeProxyOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeResources)(nil), (*core.NodeResources)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeResources_To_core_NodeResources(a.(*v1.NodeResources), b.(*core.NodeResources), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeResources)(nil), (*v1.NodeResources)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeResources_To_v1_NodeResources(a.(*core.NodeResources), b.(*v1.NodeResources), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeSelector)(nil), (*core.NodeSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeSelector_To_core_NodeSelector(a.(*v1.NodeSelector), b.(*core.NodeSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeSelector)(nil), (*v1.NodeSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeSelector_To_v1_NodeSelector(a.(*core.NodeSelector), b.(*v1.NodeSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeSelectorRequirement)(nil), (*core.NodeSelectorRequirement)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeSelectorRequirement_To_core_NodeSelectorRequirement(a.(*v1.NodeSelectorRequirement), b.(*core.NodeSelectorRequirement), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeSelectorRequirement)(nil), (*v1.NodeSelectorRequirement)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeSelectorRequirement_To_v1_NodeSelectorRequirement(a.(*core.NodeSelectorRequirement), b.(*v1.NodeSelectorRequirement), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeSelectorTerm)(nil), (*core.NodeSelectorTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeSelectorTerm_To_core_NodeSelectorTerm(a.(*v1.NodeSelectorTerm), b.(*core.NodeSelectorTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeSelectorTerm)(nil), (*v1.NodeSelectorTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeSelectorTerm_To_v1_NodeSelectorTerm(a.(*core.NodeSelectorTerm), b.(*v1.NodeSelectorTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeSpec)(nil), (*core.NodeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeSpec_To_core_NodeSpec(a.(*v1.NodeSpec), b.(*core.NodeSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeSpec)(nil), (*v1.NodeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeSpec_To_v1_NodeSpec(a.(*core.NodeSpec), b.(*v1.NodeSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeStatus)(nil), (*core.NodeStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeStatus_To_core_NodeStatus(a.(*v1.NodeStatus), b.(*core.NodeStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeStatus)(nil), (*v1.NodeStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeStatus_To_v1_NodeStatus(a.(*core.NodeStatus), b.(*v1.NodeStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.NodeSystemInfo)(nil), (*core.NodeSystemInfo)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_NodeSystemInfo_To_core_NodeSystemInfo(a.(*v1.NodeSystemInfo), b.(*core.NodeSystemInfo), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.NodeSystemInfo)(nil), (*v1.NodeSystemInfo)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_NodeSystemInfo_To_v1_NodeSystemInfo(a.(*core.NodeSystemInfo), b.(*v1.NodeSystemInfo), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ObjectFieldSelector)(nil), (*core.ObjectFieldSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ObjectFieldSelector_To_core_ObjectFieldSelector(a.(*v1.ObjectFieldSelector), b.(*core.ObjectFieldSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ObjectFieldSelector)(nil), (*v1.ObjectFieldSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ObjectFieldSelector_To_v1_ObjectFieldSelector(a.(*core.ObjectFieldSelector), b.(*v1.ObjectFieldSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ObjectReference)(nil), (*core.ObjectReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ObjectReference_To_core_ObjectReference(a.(*v1.ObjectReference), b.(*core.ObjectReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ObjectReference)(nil), (*v1.ObjectReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ObjectReference_To_v1_ObjectReference(a.(*core.ObjectReference), b.(*v1.ObjectReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolume)(nil), (*core.PersistentVolume)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolume_To_core_PersistentVolume(a.(*v1.PersistentVolume), b.(*core.PersistentVolume), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolume)(nil), (*v1.PersistentVolume)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolume_To_v1_PersistentVolume(a.(*core.PersistentVolume), b.(*v1.PersistentVolume), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeClaim)(nil), (*core.PersistentVolumeClaim)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeClaim_To_core_PersistentVolumeClaim(a.(*v1.PersistentVolumeClaim), b.(*core.PersistentVolumeClaim), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeClaim)(nil), (*v1.PersistentVolumeClaim)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeClaim_To_v1_PersistentVolumeClaim(a.(*core.PersistentVolumeClaim), b.(*v1.PersistentVolumeClaim), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeClaimCondition)(nil), (*core.PersistentVolumeClaimCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeClaimCondition_To_core_PersistentVolumeClaimCondition(a.(*v1.PersistentVolumeClaimCondition), b.(*core.PersistentVolumeClaimCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeClaimCondition)(nil), (*v1.PersistentVolumeClaimCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeClaimCondition_To_v1_PersistentVolumeClaimCondition(a.(*core.PersistentVolumeClaimCondition), b.(*v1.PersistentVolumeClaimCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeClaimList)(nil), (*core.PersistentVolumeClaimList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeClaimList_To_core_PersistentVolumeClaimList(a.(*v1.PersistentVolumeClaimList), b.(*core.PersistentVolumeClaimList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeClaimList)(nil), (*v1.PersistentVolumeClaimList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList(a.(*core.PersistentVolumeClaimList), b.(*v1.PersistentVolumeClaimList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeClaimSpec)(nil), (*core.PersistentVolumeClaimSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec(a.(*v1.PersistentVolumeClaimSpec), b.(*core.PersistentVolumeClaimSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeClaimSpec)(nil), (*v1.PersistentVolumeClaimSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec(a.(*core.PersistentVolumeClaimSpec), b.(*v1.PersistentVolumeClaimSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeClaimStatus)(nil), (*core.PersistentVolumeClaimStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeClaimStatus_To_core_PersistentVolumeClaimStatus(a.(*v1.PersistentVolumeClaimStatus), b.(*core.PersistentVolumeClaimStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeClaimStatus)(nil), (*v1.PersistentVolumeClaimStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStatus(a.(*core.PersistentVolumeClaimStatus), b.(*v1.PersistentVolumeClaimStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeClaimVolumeSource)(nil), (*core.PersistentVolumeClaimVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeClaimVolumeSource_To_core_PersistentVolumeClaimVolumeSource(a.(*v1.PersistentVolumeClaimVolumeSource), b.(*core.PersistentVolumeClaimVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeClaimVolumeSource)(nil), (*v1.PersistentVolumeClaimVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeClaimVolumeSource_To_v1_PersistentVolumeClaimVolumeSource(a.(*core.PersistentVolumeClaimVolumeSource), b.(*v1.PersistentVolumeClaimVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeList)(nil), (*core.PersistentVolumeList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeList_To_core_PersistentVolumeList(a.(*v1.PersistentVolumeList), b.(*core.PersistentVolumeList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeList)(nil), (*v1.PersistentVolumeList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeList_To_v1_PersistentVolumeList(a.(*core.PersistentVolumeList), b.(*v1.PersistentVolumeList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeSource)(nil), (*core.PersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeSource_To_core_PersistentVolumeSource(a.(*v1.PersistentVolumeSource), b.(*core.PersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeSource)(nil), (*v1.PersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(a.(*core.PersistentVolumeSource), b.(*v1.PersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeSpec)(nil), (*core.PersistentVolumeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(a.(*v1.PersistentVolumeSpec), b.(*core.PersistentVolumeSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeSpec)(nil), (*v1.PersistentVolumeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(a.(*core.PersistentVolumeSpec), b.(*v1.PersistentVolumeSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PersistentVolumeStatus)(nil), (*core.PersistentVolumeStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus(a.(*v1.PersistentVolumeStatus), b.(*core.PersistentVolumeStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PersistentVolumeStatus)(nil), (*v1.PersistentVolumeStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PersistentVolumeStatus_To_v1_PersistentVolumeStatus(a.(*core.PersistentVolumeStatus), b.(*v1.PersistentVolumeStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PhotonPersistentDiskVolumeSource)(nil), (*core.PhotonPersistentDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PhotonPersistentDiskVolumeSource_To_core_PhotonPersistentDiskVolumeSource(a.(*v1.PhotonPersistentDiskVolumeSource), b.(*core.PhotonPersistentDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PhotonPersistentDiskVolumeSource)(nil), (*v1.PhotonPersistentDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PhotonPersistentDiskVolumeSource_To_v1_PhotonPersistentDiskVolumeSource(a.(*core.PhotonPersistentDiskVolumeSource), b.(*v1.PhotonPersistentDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Pod)(nil), (*core.Pod)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Pod_To_core_Pod(a.(*v1.Pod), b.(*core.Pod), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Pod)(nil), (*v1.Pod)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Pod_To_v1_Pod(a.(*core.Pod), b.(*v1.Pod), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodAffinity)(nil), (*core.PodAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodAffinity_To_core_PodAffinity(a.(*v1.PodAffinity), b.(*core.PodAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodAffinity)(nil), (*v1.PodAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodAffinity_To_v1_PodAffinity(a.(*core.PodAffinity), b.(*v1.PodAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodAffinityTerm)(nil), (*core.PodAffinityTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodAffinityTerm_To_core_PodAffinityTerm(a.(*v1.PodAffinityTerm), b.(*core.PodAffinityTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodAffinityTerm)(nil), (*v1.PodAffinityTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodAffinityTerm_To_v1_PodAffinityTerm(a.(*core.PodAffinityTerm), b.(*v1.PodAffinityTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodAntiAffinity)(nil), (*core.PodAntiAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodAntiAffinity_To_core_PodAntiAffinity(a.(*v1.PodAntiAffinity), b.(*core.PodAntiAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodAntiAffinity)(nil), (*v1.PodAntiAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodAntiAffinity_To_v1_PodAntiAffinity(a.(*core.PodAntiAffinity), b.(*v1.PodAntiAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodAttachOptions)(nil), (*core.PodAttachOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodAttachOptions_To_core_PodAttachOptions(a.(*v1.PodAttachOptions), b.(*core.PodAttachOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodAttachOptions)(nil), (*v1.PodAttachOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodAttachOptions_To_v1_PodAttachOptions(a.(*core.PodAttachOptions), b.(*v1.PodAttachOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodCondition)(nil), (*core.PodCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodCondition_To_core_PodCondition(a.(*v1.PodCondition), b.(*core.PodCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodCondition)(nil), (*v1.PodCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodCondition_To_v1_PodCondition(a.(*core.PodCondition), b.(*v1.PodCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodDNSConfig)(nil), (*core.PodDNSConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodDNSConfig_To_core_PodDNSConfig(a.(*v1.PodDNSConfig), b.(*core.PodDNSConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodDNSConfig)(nil), (*v1.PodDNSConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodDNSConfig_To_v1_PodDNSConfig(a.(*core.PodDNSConfig), b.(*v1.PodDNSConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodDNSConfigOption)(nil), (*core.PodDNSConfigOption)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodDNSConfigOption_To_core_PodDNSConfigOption(a.(*v1.PodDNSConfigOption), b.(*core.PodDNSConfigOption), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodDNSConfigOption)(nil), (*v1.PodDNSConfigOption)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodDNSConfigOption_To_v1_PodDNSConfigOption(a.(*core.PodDNSConfigOption), b.(*v1.PodDNSConfigOption), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodExecOptions)(nil), (*core.PodExecOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodExecOptions_To_core_PodExecOptions(a.(*v1.PodExecOptions), b.(*core.PodExecOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodExecOptions)(nil), (*v1.PodExecOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodExecOptions_To_v1_PodExecOptions(a.(*core.PodExecOptions), b.(*v1.PodExecOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodList)(nil), (*core.PodList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodList_To_core_PodList(a.(*v1.PodList), b.(*core.PodList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodList)(nil), (*v1.PodList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodList_To_v1_PodList(a.(*core.PodList), b.(*v1.PodList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodLogOptions)(nil), (*core.PodLogOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodLogOptions_To_core_PodLogOptions(a.(*v1.PodLogOptions), b.(*core.PodLogOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodLogOptions)(nil), (*v1.PodLogOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodLogOptions_To_v1_PodLogOptions(a.(*core.PodLogOptions), b.(*v1.PodLogOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodPortForwardOptions)(nil), (*core.PodPortForwardOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodPortForwardOptions_To_core_PodPortForwardOptions(a.(*v1.PodPortForwardOptions), b.(*core.PodPortForwardOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodPortForwardOptions)(nil), (*v1.PodPortForwardOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodPortForwardOptions_To_v1_PodPortForwardOptions(a.(*core.PodPortForwardOptions), b.(*v1.PodPortForwardOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodProxyOptions)(nil), (*core.PodProxyOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodProxyOptions_To_core_PodProxyOptions(a.(*v1.PodProxyOptions), b.(*core.PodProxyOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodProxyOptions)(nil), (*v1.PodProxyOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodProxyOptions_To_v1_PodProxyOptions(a.(*core.PodProxyOptions), b.(*v1.PodProxyOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodReadinessGate)(nil), (*core.PodReadinessGate)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodReadinessGate_To_core_PodReadinessGate(a.(*v1.PodReadinessGate), b.(*core.PodReadinessGate), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodReadinessGate)(nil), (*v1.PodReadinessGate)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodReadinessGate_To_v1_PodReadinessGate(a.(*core.PodReadinessGate), b.(*v1.PodReadinessGate), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodSecurityContext)(nil), (*core.PodSecurityContext)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodSecurityContext_To_core_PodSecurityContext(a.(*v1.PodSecurityContext), b.(*core.PodSecurityContext), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodSecurityContext)(nil), (*v1.PodSecurityContext)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodSecurityContext_To_v1_PodSecurityContext(a.(*core.PodSecurityContext), b.(*v1.PodSecurityContext), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodSignature)(nil), (*core.PodSignature)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodSignature_To_core_PodSignature(a.(*v1.PodSignature), b.(*core.PodSignature), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodSignature)(nil), (*v1.PodSignature)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodSignature_To_v1_PodSignature(a.(*core.PodSignature), b.(*v1.PodSignature), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodSpec)(nil), (*core.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodSpec_To_core_PodSpec(a.(*v1.PodSpec), b.(*core.PodSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodSpec)(nil), (*v1.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodSpec_To_v1_PodSpec(a.(*core.PodSpec), b.(*v1.PodSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodStatus)(nil), (*core.PodStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodStatus_To_core_PodStatus(a.(*v1.PodStatus), b.(*core.PodStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodStatus)(nil), (*v1.PodStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodStatus_To_v1_PodStatus(a.(*core.PodStatus), b.(*v1.PodStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodStatusResult)(nil), (*core.PodStatusResult)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodStatusResult_To_core_PodStatusResult(a.(*v1.PodStatusResult), b.(*core.PodStatusResult), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodStatusResult)(nil), (*v1.PodStatusResult)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodStatusResult_To_v1_PodStatusResult(a.(*core.PodStatusResult), b.(*v1.PodStatusResult), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodTemplate)(nil), (*core.PodTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodTemplate_To_core_PodTemplate(a.(*v1.PodTemplate), b.(*core.PodTemplate), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodTemplate)(nil), (*v1.PodTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodTemplate_To_v1_PodTemplate(a.(*core.PodTemplate), b.(*v1.PodTemplate), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodTemplateList)(nil), (*core.PodTemplateList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodTemplateList_To_core_PodTemplateList(a.(*v1.PodTemplateList), b.(*core.PodTemplateList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodTemplateList)(nil), (*v1.PodTemplateList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodTemplateList_To_v1_PodTemplateList(a.(*core.PodTemplateList), b.(*v1.PodTemplateList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PodTemplateSpec)(nil), (*core.PodTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(a.(*v1.PodTemplateSpec), b.(*core.PodTemplateSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PodTemplateSpec)(nil), (*v1.PodTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(a.(*core.PodTemplateSpec), b.(*v1.PodTemplateSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PortworxVolumeSource)(nil), (*core.PortworxVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PortworxVolumeSource_To_core_PortworxVolumeSource(a.(*v1.PortworxVolumeSource), b.(*core.PortworxVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PortworxVolumeSource)(nil), (*v1.PortworxVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PortworxVolumeSource_To_v1_PortworxVolumeSource(a.(*core.PortworxVolumeSource), b.(*v1.PortworxVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Preconditions)(nil), (*core.Preconditions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Preconditions_To_core_Preconditions(a.(*v1.Preconditions), b.(*core.Preconditions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Preconditions)(nil), (*v1.Preconditions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Preconditions_To_v1_Preconditions(a.(*core.Preconditions), b.(*v1.Preconditions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PreferAvoidPodsEntry)(nil), (*core.PreferAvoidPodsEntry)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PreferAvoidPodsEntry_To_core_PreferAvoidPodsEntry(a.(*v1.PreferAvoidPodsEntry), b.(*core.PreferAvoidPodsEntry), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PreferAvoidPodsEntry)(nil), (*v1.PreferAvoidPodsEntry)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PreferAvoidPodsEntry_To_v1_PreferAvoidPodsEntry(a.(*core.PreferAvoidPodsEntry), b.(*v1.PreferAvoidPodsEntry), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.PreferredSchedulingTerm)(nil), (*core.PreferredSchedulingTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PreferredSchedulingTerm_To_core_PreferredSchedulingTerm(a.(*v1.PreferredSchedulingTerm), b.(*core.PreferredSchedulingTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.PreferredSchedulingTerm)(nil), (*v1.PreferredSchedulingTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PreferredSchedulingTerm_To_v1_PreferredSchedulingTerm(a.(*core.PreferredSchedulingTerm), b.(*v1.PreferredSchedulingTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Probe)(nil), (*core.Probe)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Probe_To_core_Probe(a.(*v1.Probe), b.(*core.Probe), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Probe)(nil), (*v1.Probe)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Probe_To_v1_Probe(a.(*core.Probe), b.(*v1.Probe), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ProjectedVolumeSource)(nil), (*core.ProjectedVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ProjectedVolumeSource_To_core_ProjectedVolumeSource(a.(*v1.ProjectedVolumeSource), b.(*core.ProjectedVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ProjectedVolumeSource)(nil), (*v1.ProjectedVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(a.(*core.ProjectedVolumeSource), b.(*v1.ProjectedVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.QuobyteVolumeSource)(nil), (*core.QuobyteVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_QuobyteVolumeSource_To_core_QuobyteVolumeSource(a.(*v1.QuobyteVolumeSource), b.(*core.QuobyteVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.QuobyteVolumeSource)(nil), (*v1.QuobyteVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_QuobyteVolumeSource_To_v1_QuobyteVolumeSource(a.(*core.QuobyteVolumeSource), b.(*v1.QuobyteVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.RBDPersistentVolumeSource)(nil), (*core.RBDPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_RBDPersistentVolumeSource_To_core_RBDPersistentVolumeSource(a.(*v1.RBDPersistentVolumeSource), b.(*core.RBDPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.RBDPersistentVolumeSource)(nil), (*v1.RBDPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_RBDPersistentVolumeSource_To_v1_RBDPersistentVolumeSource(a.(*core.RBDPersistentVolumeSource), b.(*v1.RBDPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.RBDVolumeSource)(nil), (*core.RBDVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_RBDVolumeSource_To_core_RBDVolumeSource(a.(*v1.RBDVolumeSource), b.(*core.RBDVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.RBDVolumeSource)(nil), (*v1.RBDVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_RBDVolumeSource_To_v1_RBDVolumeSource(a.(*core.RBDVolumeSource), b.(*v1.RBDVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.RangeAllocation)(nil), (*core.RangeAllocation)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_RangeAllocation_To_core_RangeAllocation(a.(*v1.RangeAllocation), b.(*core.RangeAllocation), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.RangeAllocation)(nil), (*v1.RangeAllocation)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_RangeAllocation_To_v1_RangeAllocation(a.(*core.RangeAllocation), b.(*v1.RangeAllocation), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ReplicationController)(nil), (*core.ReplicationController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationController_To_core_ReplicationController(a.(*v1.ReplicationController), b.(*core.ReplicationController), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ReplicationController)(nil), (*v1.ReplicationController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ReplicationController_To_v1_ReplicationController(a.(*core.ReplicationController), b.(*v1.ReplicationController), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ReplicationControllerCondition)(nil), (*core.ReplicationControllerCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationControllerCondition_To_core_ReplicationControllerCondition(a.(*v1.ReplicationControllerCondition), b.(*core.ReplicationControllerCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ReplicationControllerCondition)(nil), (*v1.ReplicationControllerCondition)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ReplicationControllerCondition_To_v1_ReplicationControllerCondition(a.(*core.ReplicationControllerCondition), b.(*v1.ReplicationControllerCondition), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ReplicationControllerList)(nil), (*core.ReplicationControllerList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationControllerList_To_core_ReplicationControllerList(a.(*v1.ReplicationControllerList), b.(*core.ReplicationControllerList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ReplicationControllerList)(nil), (*v1.ReplicationControllerList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ReplicationControllerList_To_v1_ReplicationControllerList(a.(*core.ReplicationControllerList), b.(*v1.ReplicationControllerList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ReplicationControllerSpec)(nil), (*core.ReplicationControllerSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec(a.(*v1.ReplicationControllerSpec), b.(*core.ReplicationControllerSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ReplicationControllerSpec)(nil), (*v1.ReplicationControllerSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec(a.(*core.ReplicationControllerSpec), b.(*v1.ReplicationControllerSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ReplicationControllerStatus)(nil), (*core.ReplicationControllerStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationControllerStatus_To_core_ReplicationControllerStatus(a.(*v1.ReplicationControllerStatus), b.(*core.ReplicationControllerStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ReplicationControllerStatus)(nil), (*v1.ReplicationControllerStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ReplicationControllerStatus_To_v1_ReplicationControllerStatus(a.(*core.ReplicationControllerStatus), b.(*v1.ReplicationControllerStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ResourceFieldSelector)(nil), (*core.ResourceFieldSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ResourceFieldSelector_To_core_ResourceFieldSelector(a.(*v1.ResourceFieldSelector), b.(*core.ResourceFieldSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ResourceFieldSelector)(nil), (*v1.ResourceFieldSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ResourceFieldSelector_To_v1_ResourceFieldSelector(a.(*core.ResourceFieldSelector), b.(*v1.ResourceFieldSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ResourceQuota)(nil), (*core.ResourceQuota)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ResourceQuota_To_core_ResourceQuota(a.(*v1.ResourceQuota), b.(*core.ResourceQuota), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ResourceQuota)(nil), (*v1.ResourceQuota)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ResourceQuota_To_v1_ResourceQuota(a.(*core.ResourceQuota), b.(*v1.ResourceQuota), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ResourceQuotaList)(nil), (*core.ResourceQuotaList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ResourceQuotaList_To_core_ResourceQuotaList(a.(*v1.ResourceQuotaList), b.(*core.ResourceQuotaList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ResourceQuotaList)(nil), (*v1.ResourceQuotaList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ResourceQuotaList_To_v1_ResourceQuotaList(a.(*core.ResourceQuotaList), b.(*v1.ResourceQuotaList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ResourceQuotaSpec)(nil), (*core.ResourceQuotaSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ResourceQuotaSpec_To_core_ResourceQuotaSpec(a.(*v1.ResourceQuotaSpec), b.(*core.ResourceQuotaSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ResourceQuotaSpec)(nil), (*v1.ResourceQuotaSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ResourceQuotaSpec_To_v1_ResourceQuotaSpec(a.(*core.ResourceQuotaSpec), b.(*v1.ResourceQuotaSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ResourceQuotaStatus)(nil), (*core.ResourceQuotaStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ResourceQuotaStatus_To_core_ResourceQuotaStatus(a.(*v1.ResourceQuotaStatus), b.(*core.ResourceQuotaStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ResourceQuotaStatus)(nil), (*v1.ResourceQuotaStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ResourceQuotaStatus_To_v1_ResourceQuotaStatus(a.(*core.ResourceQuotaStatus), b.(*v1.ResourceQuotaStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ResourceRequirements)(nil), (*core.ResourceRequirements)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ResourceRequirements_To_core_ResourceRequirements(a.(*v1.ResourceRequirements), b.(*core.ResourceRequirements), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ResourceRequirements)(nil), (*v1.ResourceRequirements)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ResourceRequirements_To_v1_ResourceRequirements(a.(*core.ResourceRequirements), b.(*v1.ResourceRequirements), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SELinuxOptions)(nil), (*core.SELinuxOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SELinuxOptions_To_core_SELinuxOptions(a.(*v1.SELinuxOptions), b.(*core.SELinuxOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SELinuxOptions)(nil), (*v1.SELinuxOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SELinuxOptions_To_v1_SELinuxOptions(a.(*core.SELinuxOptions), b.(*v1.SELinuxOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ScaleIOPersistentVolumeSource)(nil), (*core.ScaleIOPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ScaleIOPersistentVolumeSource_To_core_ScaleIOPersistentVolumeSource(a.(*v1.ScaleIOPersistentVolumeSource), b.(*core.ScaleIOPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ScaleIOPersistentVolumeSource)(nil), (*v1.ScaleIOPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ScaleIOPersistentVolumeSource_To_v1_ScaleIOPersistentVolumeSource(a.(*core.ScaleIOPersistentVolumeSource), b.(*v1.ScaleIOPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ScaleIOVolumeSource)(nil), (*core.ScaleIOVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ScaleIOVolumeSource_To_core_ScaleIOVolumeSource(a.(*v1.ScaleIOVolumeSource), b.(*core.ScaleIOVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ScaleIOVolumeSource)(nil), (*v1.ScaleIOVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ScaleIOVolumeSource_To_v1_ScaleIOVolumeSource(a.(*core.ScaleIOVolumeSource), b.(*v1.ScaleIOVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ScopeSelector)(nil), (*core.ScopeSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ScopeSelector_To_core_ScopeSelector(a.(*v1.ScopeSelector), b.(*core.ScopeSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ScopeSelector)(nil), (*v1.ScopeSelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ScopeSelector_To_v1_ScopeSelector(a.(*core.ScopeSelector), b.(*v1.ScopeSelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ScopedResourceSelectorRequirement)(nil), (*core.ScopedResourceSelectorRequirement)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ScopedResourceSelectorRequirement_To_core_ScopedResourceSelectorRequirement(a.(*v1.ScopedResourceSelectorRequirement), b.(*core.ScopedResourceSelectorRequirement), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ScopedResourceSelectorRequirement)(nil), (*v1.ScopedResourceSelectorRequirement)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement(a.(*core.ScopedResourceSelectorRequirement), b.(*v1.ScopedResourceSelectorRequirement), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Secret)(nil), (*core.Secret)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Secret_To_core_Secret(a.(*v1.Secret), b.(*core.Secret), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Secret)(nil), (*v1.Secret)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Secret_To_v1_Secret(a.(*core.Secret), b.(*v1.Secret), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SecretEnvSource)(nil), (*core.SecretEnvSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SecretEnvSource_To_core_SecretEnvSource(a.(*v1.SecretEnvSource), b.(*core.SecretEnvSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretEnvSource)(nil), (*v1.SecretEnvSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretEnvSource_To_v1_SecretEnvSource(a.(*core.SecretEnvSource), b.(*v1.SecretEnvSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SecretKeySelector)(nil), (*core.SecretKeySelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SecretKeySelector_To_core_SecretKeySelector(a.(*v1.SecretKeySelector), b.(*core.SecretKeySelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretKeySelector)(nil), (*v1.SecretKeySelector)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretKeySelector_To_v1_SecretKeySelector(a.(*core.SecretKeySelector), b.(*v1.SecretKeySelector), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SecretList)(nil), (*core.SecretList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SecretList_To_core_SecretList(a.(*v1.SecretList), b.(*core.SecretList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretList)(nil), (*v1.SecretList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretList_To_v1_SecretList(a.(*core.SecretList), b.(*v1.SecretList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SecretProjection)(nil), (*core.SecretProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SecretProjection_To_core_SecretProjection(a.(*v1.SecretProjection), b.(*core.SecretProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretProjection)(nil), (*v1.SecretProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretProjection_To_v1_SecretProjection(a.(*core.SecretProjection), b.(*v1.SecretProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SecretReference)(nil), (*core.SecretReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SecretReference_To_core_SecretReference(a.(*v1.SecretReference), b.(*core.SecretReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretReference)(nil), (*v1.SecretReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretReference_To_v1_SecretReference(a.(*core.SecretReference), b.(*v1.SecretReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SecretVolumeSource)(nil), (*core.SecretVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SecretVolumeSource_To_core_SecretVolumeSource(a.(*v1.SecretVolumeSource), b.(*core.SecretVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecretVolumeSource)(nil), (*v1.SecretVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecretVolumeSource_To_v1_SecretVolumeSource(a.(*core.SecretVolumeSource), b.(*v1.SecretVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SecurityContext)(nil), (*core.SecurityContext)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SecurityContext_To_core_SecurityContext(a.(*v1.SecurityContext), b.(*core.SecurityContext), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SecurityContext)(nil), (*v1.SecurityContext)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecurityContext_To_v1_SecurityContext(a.(*core.SecurityContext), b.(*v1.SecurityContext), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SerializedReference)(nil), (*core.SerializedReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SerializedReference_To_core_SerializedReference(a.(*v1.SerializedReference), b.(*core.SerializedReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SerializedReference)(nil), (*v1.SerializedReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SerializedReference_To_v1_SerializedReference(a.(*core.SerializedReference), b.(*v1.SerializedReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Service)(nil), (*core.Service)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Service_To_core_Service(a.(*v1.Service), b.(*core.Service), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Service)(nil), (*v1.Service)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Service_To_v1_Service(a.(*core.Service), b.(*v1.Service), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServiceAccount)(nil), (*core.ServiceAccount)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServiceAccount_To_core_ServiceAccount(a.(*v1.ServiceAccount), b.(*core.ServiceAccount), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServiceAccount)(nil), (*v1.ServiceAccount)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServiceAccount_To_v1_ServiceAccount(a.(*core.ServiceAccount), b.(*v1.ServiceAccount), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServiceAccountList)(nil), (*core.ServiceAccountList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServiceAccountList_To_core_ServiceAccountList(a.(*v1.ServiceAccountList), b.(*core.ServiceAccountList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServiceAccountList)(nil), (*v1.ServiceAccountList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServiceAccountList_To_v1_ServiceAccountList(a.(*core.ServiceAccountList), b.(*v1.ServiceAccountList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServiceAccountTokenProjection)(nil), (*core.ServiceAccountTokenProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServiceAccountTokenProjection_To_core_ServiceAccountTokenProjection(a.(*v1.ServiceAccountTokenProjection), b.(*core.ServiceAccountTokenProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServiceAccountTokenProjection)(nil), (*v1.ServiceAccountTokenProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServiceAccountTokenProjection_To_v1_ServiceAccountTokenProjection(a.(*core.ServiceAccountTokenProjection), b.(*v1.ServiceAccountTokenProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServiceList)(nil), (*core.ServiceList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServiceList_To_core_ServiceList(a.(*v1.ServiceList), b.(*core.ServiceList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServiceList)(nil), (*v1.ServiceList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServiceList_To_v1_ServiceList(a.(*core.ServiceList), b.(*v1.ServiceList), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServicePort)(nil), (*core.ServicePort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServicePort_To_core_ServicePort(a.(*v1.ServicePort), b.(*core.ServicePort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServicePort)(nil), (*v1.ServicePort)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServicePort_To_v1_ServicePort(a.(*core.ServicePort), b.(*v1.ServicePort), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServiceProxyOptions)(nil), (*core.ServiceProxyOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServiceProxyOptions_To_core_ServiceProxyOptions(a.(*v1.ServiceProxyOptions), b.(*core.ServiceProxyOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServiceProxyOptions)(nil), (*v1.ServiceProxyOptions)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServiceProxyOptions_To_v1_ServiceProxyOptions(a.(*core.ServiceProxyOptions), b.(*v1.ServiceProxyOptions), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServiceSpec)(nil), (*core.ServiceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServiceSpec_To_core_ServiceSpec(a.(*v1.ServiceSpec), b.(*core.ServiceSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServiceSpec)(nil), (*v1.ServiceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServiceSpec_To_v1_ServiceSpec(a.(*core.ServiceSpec), b.(*v1.ServiceSpec), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.ServiceStatus)(nil), (*core.ServiceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ServiceStatus_To_core_ServiceStatus(a.(*v1.ServiceStatus), b.(*core.ServiceStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ServiceStatus)(nil), (*v1.ServiceStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ServiceStatus_To_v1_ServiceStatus(a.(*core.ServiceStatus), b.(*v1.ServiceStatus), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.SessionAffinityConfig)(nil), (*core.SessionAffinityConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SessionAffinityConfig_To_core_SessionAffinityConfig(a.(*v1.SessionAffinityConfig), b.(*core.SessionAffinityConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SessionAffinityConfig)(nil), (*v1.SessionAffinityConfig)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SessionAffinityConfig_To_v1_SessionAffinityConfig(a.(*core.SessionAffinityConfig), b.(*v1.SessionAffinityConfig), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.StorageOSPersistentVolumeSource)(nil), (*core.StorageOSPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_StorageOSPersistentVolumeSource_To_core_StorageOSPersistentVolumeSource(a.(*v1.StorageOSPersistentVolumeSource), b.(*core.StorageOSPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.StorageOSPersistentVolumeSource)(nil), (*v1.StorageOSPersistentVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_StorageOSPersistentVolumeSource_To_v1_StorageOSPersistentVolumeSource(a.(*core.StorageOSPersistentVolumeSource), b.(*v1.StorageOSPersistentVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.StorageOSVolumeSource)(nil), (*core.StorageOSVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_StorageOSVolumeSource_To_core_StorageOSVolumeSource(a.(*v1.StorageOSVolumeSource), b.(*core.StorageOSVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.StorageOSVolumeSource)(nil), (*v1.StorageOSVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_StorageOSVolumeSource_To_v1_StorageOSVolumeSource(a.(*core.StorageOSVolumeSource), b.(*v1.StorageOSVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Sysctl)(nil), (*core.Sysctl)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Sysctl_To_core_Sysctl(a.(*v1.Sysctl), b.(*core.Sysctl), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Sysctl)(nil), (*v1.Sysctl)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Sysctl_To_v1_Sysctl(a.(*core.Sysctl), b.(*v1.Sysctl), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.TCPSocketAction)(nil), (*core.TCPSocketAction)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_TCPSocketAction_To_core_TCPSocketAction(a.(*v1.TCPSocketAction), b.(*core.TCPSocketAction), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.TCPSocketAction)(nil), (*v1.TCPSocketAction)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_TCPSocketAction_To_v1_TCPSocketAction(a.(*core.TCPSocketAction), b.(*v1.TCPSocketAction), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Taint)(nil), (*core.Taint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Taint_To_core_Taint(a.(*v1.Taint), b.(*core.Taint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Taint)(nil), (*v1.Taint)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Taint_To_v1_Taint(a.(*core.Taint), b.(*v1.Taint), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Toleration)(nil), (*core.Toleration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Toleration_To_core_Toleration(a.(*v1.Toleration), b.(*core.Toleration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Toleration)(nil), (*v1.Toleration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Toleration_To_v1_Toleration(a.(*core.Toleration), b.(*v1.Toleration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.TopologySelectorLabelRequirement)(nil), (*core.TopologySelectorLabelRequirement)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_TopologySelectorLabelRequirement_To_core_TopologySelectorLabelRequirement(a.(*v1.TopologySelectorLabelRequirement), b.(*core.TopologySelectorLabelRequirement), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.TopologySelectorLabelRequirement)(nil), (*v1.TopologySelectorLabelRequirement)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_TopologySelectorLabelRequirement_To_v1_TopologySelectorLabelRequirement(a.(*core.TopologySelectorLabelRequirement), b.(*v1.TopologySelectorLabelRequirement), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.TopologySelectorTerm)(nil), (*core.TopologySelectorTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_TopologySelectorTerm_To_core_TopologySelectorTerm(a.(*v1.TopologySelectorTerm), b.(*core.TopologySelectorTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.TopologySelectorTerm)(nil), (*v1.TopologySelectorTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_TopologySelectorTerm_To_v1_TopologySelectorTerm(a.(*core.TopologySelectorTerm), b.(*v1.TopologySelectorTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.TypedLocalObjectReference)(nil), (*core.TypedLocalObjectReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_TypedLocalObjectReference_To_core_TypedLocalObjectReference(a.(*v1.TypedLocalObjectReference), b.(*core.TypedLocalObjectReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.TypedLocalObjectReference)(nil), (*v1.TypedLocalObjectReference)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_TypedLocalObjectReference_To_v1_TypedLocalObjectReference(a.(*core.TypedLocalObjectReference), b.(*v1.TypedLocalObjectReference), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.Volume)(nil), (*core.Volume)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Volume_To_core_Volume(a.(*v1.Volume), b.(*core.Volume), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.Volume)(nil), (*v1.Volume)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Volume_To_v1_Volume(a.(*core.Volume), b.(*v1.Volume), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.VolumeDevice)(nil), (*core.VolumeDevice)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_VolumeDevice_To_core_VolumeDevice(a.(*v1.VolumeDevice), b.(*core.VolumeDevice), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.VolumeDevice)(nil), (*v1.VolumeDevice)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_VolumeDevice_To_v1_VolumeDevice(a.(*core.VolumeDevice), b.(*v1.VolumeDevice), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.VolumeMount)(nil), (*core.VolumeMount)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_VolumeMount_To_core_VolumeMount(a.(*v1.VolumeMount), b.(*core.VolumeMount), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.VolumeMount)(nil), (*v1.VolumeMount)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_VolumeMount_To_v1_VolumeMount(a.(*core.VolumeMount), b.(*v1.VolumeMount), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.VolumeNodeAffinity)(nil), (*core.VolumeNodeAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_VolumeNodeAffinity_To_core_VolumeNodeAffinity(a.(*v1.VolumeNodeAffinity), b.(*core.VolumeNodeAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.VolumeNodeAffinity)(nil), (*v1.VolumeNodeAffinity)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_VolumeNodeAffinity_To_v1_VolumeNodeAffinity(a.(*core.VolumeNodeAffinity), b.(*v1.VolumeNodeAffinity), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.VolumeProjection)(nil), (*core.VolumeProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_VolumeProjection_To_core_VolumeProjection(a.(*v1.VolumeProjection), b.(*core.VolumeProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.VolumeProjection)(nil), (*v1.VolumeProjection)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_VolumeProjection_To_v1_VolumeProjection(a.(*core.VolumeProjection), b.(*v1.VolumeProjection), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.VolumeSource)(nil), (*core.VolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_VolumeSource_To_core_VolumeSource(a.(*v1.VolumeSource), b.(*core.VolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.VolumeSource)(nil), (*v1.VolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_VolumeSource_To_v1_VolumeSource(a.(*core.VolumeSource), b.(*v1.VolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.VsphereVirtualDiskVolumeSource)(nil), (*core.VsphereVirtualDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_VsphereVirtualDiskVolumeSource_To_core_VsphereVirtualDiskVolumeSource(a.(*v1.VsphereVirtualDiskVolumeSource), b.(*core.VsphereVirtualDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.VsphereVirtualDiskVolumeSource)(nil), (*v1.VsphereVirtualDiskVolumeSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_VsphereVirtualDiskVolumeSource_To_v1_VsphereVirtualDiskVolumeSource(a.(*core.VsphereVirtualDiskVolumeSource), b.(*v1.VsphereVirtualDiskVolumeSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1.WeightedPodAffinityTerm)(nil), (*core.WeightedPodAffinityTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_WeightedPodAffinityTerm_To_core_WeightedPodAffinityTerm(a.(*v1.WeightedPodAffinityTerm), b.(*core.WeightedPodAffinityTerm), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.WeightedPodAffinityTerm)(nil), (*v1.WeightedPodAffinityTerm)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_WeightedPodAffinityTerm_To_v1_WeightedPodAffinityTerm(a.(*core.WeightedPodAffinityTerm), b.(*v1.WeightedPodAffinityTerm), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*core.PodSecurityContext)(nil), (*v1.PodSecurityContext)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodSecurityContext_To_v1_PodSecurityContext(a.(*core.PodSecurityContext), b.(*v1.PodSecurityContext), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*core.PodSpec)(nil), (*v1.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodSpec_To_v1_PodSpec(a.(*core.PodSpec), b.(*v1.PodSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*core.PodTemplateSpec)(nil), (*v1.PodTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_PodTemplateSpec_To_v1_PodTemplateSpec(a.(*core.PodTemplateSpec), b.(*v1.PodTemplateSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*core.Pod)(nil), (*v1.Pod)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_Pod_To_v1_Pod(a.(*core.Pod), b.(*v1.Pod), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*core.ReplicationControllerSpec)(nil), (*v1.ReplicationControllerSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec(a.(*core.ReplicationControllerSpec), b.(*v1.ReplicationControllerSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*core.SecurityContext)(nil), (*v1.SecurityContext)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SecurityContext_To_v1_SecurityContext(a.(*core.SecurityContext), b.(*v1.SecurityContext), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*extensions.ReplicaSetSpec)(nil), (*v1.ReplicationControllerSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_extensions_ReplicaSetSpec_To_v1_ReplicationControllerSpec(a.(*extensions.ReplicaSetSpec), b.(*v1.ReplicationControllerSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*extensions.ReplicaSetStatus)(nil), (*v1.ReplicationControllerStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_extensions_ReplicaSetStatus_To_v1_ReplicationControllerStatus(a.(*extensions.ReplicaSetStatus), b.(*v1.ReplicationControllerStatus), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*extensions.ReplicaSet)(nil), (*v1.ReplicationController)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_extensions_ReplicaSet_To_v1_ReplicationController(a.(*extensions.ReplicaSet), b.(*v1.ReplicationController), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.PodSecurityContext)(nil), (*core.PodSecurityContext)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodSecurityContext_To_core_PodSecurityContext(a.(*v1.PodSecurityContext), b.(*core.PodSecurityContext), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.PodSpec)(nil), (*core.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodSpec_To_core_PodSpec(a.(*v1.PodSpec), b.(*core.PodSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.PodTemplateSpec)(nil), (*core.PodTemplateSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_PodTemplateSpec_To_core_PodTemplateSpec(a.(*v1.PodTemplateSpec), b.(*core.PodTemplateSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.Pod)(nil), (*core.Pod)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Pod_To_core_Pod(a.(*v1.Pod), b.(*core.Pod), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.ReplicationControllerSpec)(nil), (*core.ReplicationControllerSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec(a.(*v1.ReplicationControllerSpec), b.(*core.ReplicationControllerSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.ReplicationControllerSpec)(nil), (*extensions.ReplicaSetSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationControllerSpec_To_extensions_ReplicaSetSpec(a.(*v1.ReplicationControllerSpec), b.(*extensions.ReplicaSetSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.ReplicationControllerStatus)(nil), (*extensions.ReplicaSetStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationControllerStatus_To_extensions_ReplicaSetStatus(a.(*v1.ReplicationControllerStatus), b.(*extensions.ReplicaSetStatus), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.ReplicationController)(nil), (*extensions.ReplicaSet)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ReplicationController_To_extensions_ReplicaSet(a.(*v1.ReplicationController), b.(*extensions.ReplicaSet), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.ResourceList)(nil), (*core.ResourceList)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_ResourceList_To_core_ResourceList(a.(*v1.ResourceList), b.(*core.ResourceList), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1.Secret)(nil), (*core.Secret)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_Secret_To_core_Secret(a.(*v1.Secret), b.(*core.Secret), scope) + }); err != nil { + return err + } + return nil } func autoConvert_v1_AWSElasticBlockStoreVolumeSource_To_core_AWSElasticBlockStoreVolumeSource(in *v1.AWSElasticBlockStoreVolumeSource, out *core.AWSElasticBlockStoreVolumeSource, s conversion.Scope) error { @@ -2417,6 +4074,7 @@ func Convert_core_LocalObjectReference_To_v1_LocalObjectReference(in *core.Local func autoConvert_v1_LocalVolumeSource_To_core_LocalVolumeSource(in *v1.LocalVolumeSource, out *core.LocalVolumeSource, s conversion.Scope) error { out.Path = in.Path + out.FSType = (*string)(unsafe.Pointer(in.FSType)) return nil } @@ -2427,6 +4085,7 @@ func Convert_v1_LocalVolumeSource_To_core_LocalVolumeSource(in *v1.LocalVolumeSo func autoConvert_core_LocalVolumeSource_To_v1_LocalVolumeSource(in *core.LocalVolumeSource, out *v1.LocalVolumeSource, s conversion.Scope) error { out.Path = in.Path + out.FSType = (*string)(unsafe.Pointer(in.FSType)) return nil } @@ -3145,13 +4804,14 @@ func Convert_core_PersistentVolumeClaimList_To_v1_PersistentVolumeClaimList(in * func autoConvert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec(in *v1.PersistentVolumeClaimSpec, out *core.PersistentVolumeClaimSpec, s conversion.Scope) error { out.AccessModes = *(*[]core.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes)) - out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) + out.Selector = (*metav1.LabelSelector)(unsafe.Pointer(in.Selector)) if err := Convert_v1_ResourceRequirements_To_core_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil { return err } out.VolumeName = in.VolumeName out.StorageClassName = (*string)(unsafe.Pointer(in.StorageClassName)) out.VolumeMode = (*core.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) + out.DataSource = (*core.TypedLocalObjectReference)(unsafe.Pointer(in.DataSource)) return nil } @@ -3162,13 +4822,14 @@ func Convert_v1_PersistentVolumeClaimSpec_To_core_PersistentVolumeClaimSpec(in * func autoConvert_core_PersistentVolumeClaimSpec_To_v1_PersistentVolumeClaimSpec(in *core.PersistentVolumeClaimSpec, out *v1.PersistentVolumeClaimSpec, s conversion.Scope) error { out.AccessModes = *(*[]v1.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes)) - out.Selector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.Selector)) + out.Selector = (*metav1.LabelSelector)(unsafe.Pointer(in.Selector)) if err := Convert_core_ResourceRequirements_To_v1_ResourceRequirements(&in.Resources, &out.Resources, s); err != nil { return err } out.VolumeName = in.VolumeName out.StorageClassName = (*string)(unsafe.Pointer(in.StorageClassName)) out.VolumeMode = (*v1.PersistentVolumeMode)(unsafe.Pointer(in.VolumeMode)) + out.DataSource = (*v1.TypedLocalObjectReference)(unsafe.Pointer(in.DataSource)) return nil } @@ -3460,7 +5121,7 @@ func Convert_core_PodAffinity_To_v1_PodAffinity(in *core.PodAffinity, out *v1.Po } func autoConvert_v1_PodAffinityTerm_To_core_PodAffinityTerm(in *v1.PodAffinityTerm, out *core.PodAffinityTerm, s conversion.Scope) error { - out.LabelSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.LabelSelector)) + out.LabelSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.LabelSelector)) out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces)) out.TopologyKey = in.TopologyKey return nil @@ -3472,7 +5133,7 @@ func Convert_v1_PodAffinityTerm_To_core_PodAffinityTerm(in *v1.PodAffinityTerm, } func autoConvert_core_PodAffinityTerm_To_v1_PodAffinityTerm(in *core.PodAffinityTerm, out *v1.PodAffinityTerm, s conversion.Scope) error { - out.LabelSelector = (*meta_v1.LabelSelector)(unsafe.Pointer(in.LabelSelector)) + out.LabelSelector = (*metav1.LabelSelector)(unsafe.Pointer(in.LabelSelector)) out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces)) out.TopologyKey = in.TopologyKey return nil @@ -3686,7 +5347,7 @@ func autoConvert_v1_PodLogOptions_To_core_PodLogOptions(in *v1.PodLogOptions, ou out.Follow = in.Follow out.Previous = in.Previous out.SinceSeconds = (*int64)(unsafe.Pointer(in.SinceSeconds)) - out.SinceTime = (*meta_v1.Time)(unsafe.Pointer(in.SinceTime)) + out.SinceTime = (*metav1.Time)(unsafe.Pointer(in.SinceTime)) out.Timestamps = in.Timestamps out.TailLines = (*int64)(unsafe.Pointer(in.TailLines)) out.LimitBytes = (*int64)(unsafe.Pointer(in.LimitBytes)) @@ -3703,7 +5364,7 @@ func autoConvert_core_PodLogOptions_To_v1_PodLogOptions(in *core.PodLogOptions, out.Follow = in.Follow out.Previous = in.Previous out.SinceSeconds = (*int64)(unsafe.Pointer(in.SinceSeconds)) - out.SinceTime = (*meta_v1.Time)(unsafe.Pointer(in.SinceTime)) + out.SinceTime = (*metav1.Time)(unsafe.Pointer(in.SinceTime)) out.Timestamps = in.Timestamps out.TailLines = (*int64)(unsafe.Pointer(in.TailLines)) out.LimitBytes = (*int64)(unsafe.Pointer(in.LimitBytes)) @@ -3802,7 +5463,7 @@ func autoConvert_core_PodSecurityContext_To_v1_PodSecurityContext(in *core.PodSe } func autoConvert_v1_PodSignature_To_core_PodSignature(in *v1.PodSignature, out *core.PodSignature, s conversion.Scope) error { - out.PodController = (*meta_v1.OwnerReference)(unsafe.Pointer(in.PodController)) + out.PodController = (*metav1.OwnerReference)(unsafe.Pointer(in.PodController)) return nil } @@ -3812,7 +5473,7 @@ func Convert_v1_PodSignature_To_core_PodSignature(in *v1.PodSignature, out *core } func autoConvert_core_PodSignature_To_v1_PodSignature(in *core.PodSignature, out *v1.PodSignature, s conversion.Scope) error { - out.PodController = (*meta_v1.OwnerReference)(unsafe.Pointer(in.PodController)) + out.PodController = (*metav1.OwnerReference)(unsafe.Pointer(in.PodController)) return nil } @@ -3888,6 +5549,7 @@ func autoConvert_v1_PodSpec_To_core_PodSpec(in *v1.PodSpec, out *core.PodSpec, s out.Priority = (*int32)(unsafe.Pointer(in.Priority)) out.DNSConfig = (*core.PodDNSConfig)(unsafe.Pointer(in.DNSConfig)) out.ReadinessGates = *(*[]core.PodReadinessGate)(unsafe.Pointer(&in.ReadinessGates)) + out.RuntimeClassName = (*string)(unsafe.Pointer(in.RuntimeClassName)) return nil } @@ -3953,6 +5615,7 @@ func autoConvert_core_PodSpec_To_v1_PodSpec(in *core.PodSpec, out *v1.PodSpec, s out.Priority = (*int32)(unsafe.Pointer(in.Priority)) out.DNSConfig = (*v1.PodDNSConfig)(unsafe.Pointer(in.DNSConfig)) out.ReadinessGates = *(*[]v1.PodReadinessGate)(unsafe.Pointer(&in.ReadinessGates)) + out.RuntimeClassName = (*string)(unsafe.Pointer(in.RuntimeClassName)) return nil } @@ -3964,7 +5627,7 @@ func autoConvert_v1_PodStatus_To_core_PodStatus(in *v1.PodStatus, out *core.PodS out.NominatedNodeName = in.NominatedNodeName out.HostIP = in.HostIP out.PodIP = in.PodIP - out.StartTime = (*meta_v1.Time)(unsafe.Pointer(in.StartTime)) + out.StartTime = (*metav1.Time)(unsafe.Pointer(in.StartTime)) out.InitContainerStatuses = *(*[]core.ContainerStatus)(unsafe.Pointer(&in.InitContainerStatuses)) out.ContainerStatuses = *(*[]core.ContainerStatus)(unsafe.Pointer(&in.ContainerStatuses)) out.QOSClass = core.PodQOSClass(in.QOSClass) @@ -3984,7 +5647,7 @@ func autoConvert_core_PodStatus_To_v1_PodStatus(in *core.PodStatus, out *v1.PodS out.NominatedNodeName = in.NominatedNodeName out.HostIP = in.HostIP out.PodIP = in.PodIP - out.StartTime = (*meta_v1.Time)(unsafe.Pointer(in.StartTime)) + out.StartTime = (*metav1.Time)(unsafe.Pointer(in.StartTime)) out.QOSClass = v1.PodQOSClass(in.QOSClass) out.InitContainerStatuses = *(*[]v1.ContainerStatus)(unsafe.Pointer(&in.InitContainerStatuses)) out.ContainerStatuses = *(*[]v1.ContainerStatus)(unsafe.Pointer(&in.ContainerStatuses)) @@ -4505,7 +6168,7 @@ func Convert_core_ReplicationControllerList_To_v1_ReplicationControllerList(in * } func autoConvert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec(in *v1.ReplicationControllerSpec, out *core.ReplicationControllerSpec, s conversion.Scope) error { - if err := meta_v1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil { + if err := metav1.Convert_Pointer_int32_To_int32(&in.Replicas, &out.Replicas, s); err != nil { return err } out.MinReadySeconds = in.MinReadySeconds @@ -4523,7 +6186,7 @@ func autoConvert_v1_ReplicationControllerSpec_To_core_ReplicationControllerSpec( } func autoConvert_core_ReplicationControllerSpec_To_v1_ReplicationControllerSpec(in *core.ReplicationControllerSpec, out *v1.ReplicationControllerSpec, s conversion.Scope) error { - if err := meta_v1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil { + if err := metav1.Convert_int32_To_Pointer_int32(&in.Replicas, &out.Replicas, s); err != nil { return err } out.MinReadySeconds = in.MinReadySeconds @@ -5063,6 +6726,7 @@ func autoConvert_v1_SecurityContext_To_core_SecurityContext(in *v1.SecurityConte out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot)) out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem)) out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation)) + out.ProcMount = (*core.ProcMountType)(unsafe.Pointer(in.ProcMount)) return nil } @@ -5080,6 +6744,7 @@ func autoConvert_core_SecurityContext_To_v1_SecurityContext(in *core.SecurityCon out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot)) out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem)) out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation)) + out.ProcMount = (*v1.ProcMountType)(unsafe.Pointer(in.ProcMount)) return nil } @@ -5189,7 +6854,7 @@ func Convert_core_ServiceAccountList_To_v1_ServiceAccountList(in *core.ServiceAc func autoConvert_v1_ServiceAccountTokenProjection_To_core_ServiceAccountTokenProjection(in *v1.ServiceAccountTokenProjection, out *core.ServiceAccountTokenProjection, s conversion.Scope) error { out.Audience = in.Audience - if err := meta_v1.Convert_Pointer_int64_To_int64(&in.ExpirationSeconds, &out.ExpirationSeconds, s); err != nil { + if err := metav1.Convert_Pointer_int64_To_int64(&in.ExpirationSeconds, &out.ExpirationSeconds, s); err != nil { return err } out.Path = in.Path @@ -5203,7 +6868,7 @@ func Convert_v1_ServiceAccountTokenProjection_To_core_ServiceAccountTokenProject func autoConvert_core_ServiceAccountTokenProjection_To_v1_ServiceAccountTokenProjection(in *core.ServiceAccountTokenProjection, out *v1.ServiceAccountTokenProjection, s conversion.Scope) error { out.Audience = in.Audience - if err := meta_v1.Convert_int64_To_Pointer_int64(&in.ExpirationSeconds, &out.ExpirationSeconds, s); err != nil { + if err := metav1.Convert_int64_To_Pointer_int64(&in.ExpirationSeconds, &out.ExpirationSeconds, s); err != nil { return err } out.Path = in.Path @@ -5497,7 +7162,7 @@ func autoConvert_v1_Taint_To_core_Taint(in *v1.Taint, out *core.Taint, s convers out.Key = in.Key out.Value = in.Value out.Effect = core.TaintEffect(in.Effect) - out.TimeAdded = (*meta_v1.Time)(unsafe.Pointer(in.TimeAdded)) + out.TimeAdded = (*metav1.Time)(unsafe.Pointer(in.TimeAdded)) return nil } @@ -5510,7 +7175,7 @@ func autoConvert_core_Taint_To_v1_Taint(in *core.Taint, out *v1.Taint, s convers out.Key = in.Key out.Value = in.Value out.Effect = v1.TaintEffect(in.Effect) - out.TimeAdded = (*meta_v1.Time)(unsafe.Pointer(in.TimeAdded)) + out.TimeAdded = (*metav1.Time)(unsafe.Pointer(in.TimeAdded)) return nil } @@ -5589,6 +7254,30 @@ func Convert_core_TopologySelectorTerm_To_v1_TopologySelectorTerm(in *core.Topol return autoConvert_core_TopologySelectorTerm_To_v1_TopologySelectorTerm(in, out, s) } +func autoConvert_v1_TypedLocalObjectReference_To_core_TypedLocalObjectReference(in *v1.TypedLocalObjectReference, out *core.TypedLocalObjectReference, s conversion.Scope) error { + out.APIGroup = (*string)(unsafe.Pointer(in.APIGroup)) + out.Kind = in.Kind + out.Name = in.Name + return nil +} + +// Convert_v1_TypedLocalObjectReference_To_core_TypedLocalObjectReference is an autogenerated conversion function. +func Convert_v1_TypedLocalObjectReference_To_core_TypedLocalObjectReference(in *v1.TypedLocalObjectReference, out *core.TypedLocalObjectReference, s conversion.Scope) error { + return autoConvert_v1_TypedLocalObjectReference_To_core_TypedLocalObjectReference(in, out, s) +} + +func autoConvert_core_TypedLocalObjectReference_To_v1_TypedLocalObjectReference(in *core.TypedLocalObjectReference, out *v1.TypedLocalObjectReference, s conversion.Scope) error { + out.APIGroup = (*string)(unsafe.Pointer(in.APIGroup)) + out.Kind = in.Kind + out.Name = in.Name + return nil +} + +// Convert_core_TypedLocalObjectReference_To_v1_TypedLocalObjectReference is an autogenerated conversion function. +func Convert_core_TypedLocalObjectReference_To_v1_TypedLocalObjectReference(in *core.TypedLocalObjectReference, out *v1.TypedLocalObjectReference, s conversion.Scope) error { + return autoConvert_core_TypedLocalObjectReference_To_v1_TypedLocalObjectReference(in, out, s) +} + func autoConvert_v1_Volume_To_core_Volume(in *v1.Volume, out *core.Volume, s conversion.Scope) error { out.Name = in.Name if err := Convert_v1_VolumeSource_To_core_VolumeSource(&in.VolumeSource, &out.VolumeSource, s); err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD index 9594b47f..9ea47dc5 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD @@ -25,20 +25,21 @@ go_library( "//pkg/fieldpath:go_default_library", "//pkg/master/ports:go_default_library", "//pkg/security/apparmor:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -55,15 +56,15 @@ go_test( "//pkg/capabilities:go_default_library", "//pkg/features:go_default_library", "//pkg/security/apparmor:go_default_library", - "//pkg/util/pointer:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go index 7050c604..ab81fe45 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go @@ -36,6 +36,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/sets" @@ -195,23 +196,23 @@ type ValidateNameFunc apimachineryvalidation.ValidateNameFunc // ValidatePodName can be used to check whether the given pod name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidatePodName = NameIsDNSSubdomain +var ValidatePodName = apimachineryvalidation.NameIsDNSSubdomain // ValidateReplicationControllerName can be used to check whether the given replication // controller name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateReplicationControllerName = NameIsDNSSubdomain +var ValidateReplicationControllerName = apimachineryvalidation.NameIsDNSSubdomain // ValidateServiceName can be used to check whether the given service name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateServiceName = NameIsDNS1035Label +var ValidateServiceName = apimachineryvalidation.NameIsDNS1035Label // ValidateNodeName can be used to check whether the given node name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateNodeName = NameIsDNSSubdomain +var ValidateNodeName = apimachineryvalidation.NameIsDNSSubdomain // ValidateNamespaceName can be used to check whether the given namespace name is valid. // Prefix indicates this name will be used as part of generation, in which case @@ -221,18 +222,18 @@ var ValidateNamespaceName = apimachineryvalidation.ValidateNamespaceName // ValidateLimitRangeName can be used to check whether the given limit range name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateLimitRangeName = NameIsDNSSubdomain +var ValidateLimitRangeName = apimachineryvalidation.NameIsDNSSubdomain // ValidateResourceQuotaName can be used to check whether the given // resource quota name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateResourceQuotaName = NameIsDNSSubdomain +var ValidateResourceQuotaName = apimachineryvalidation.NameIsDNSSubdomain // ValidateSecretName can be used to check whether the given secret name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateSecretName = NameIsDNSSubdomain +var ValidateSecretName = apimachineryvalidation.NameIsDNSSubdomain // ValidateServiceAccountName can be used to check whether the given service account name is valid. // Prefix indicates this name will be used as part of generation, in which case @@ -242,7 +243,7 @@ var ValidateServiceAccountName = apimachineryvalidation.ValidateServiceAccountNa // ValidateEndpointsName can be used to check whether the given endpoints name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateEndpointsName = NameIsDNSSubdomain +var ValidateEndpointsName = apimachineryvalidation.NameIsDNSSubdomain // ValidateClusterName can be used to check whether the given cluster name is valid. var ValidateClusterName = apimachineryvalidation.ValidateClusterName @@ -250,21 +251,21 @@ var ValidateClusterName = apimachineryvalidation.ValidateClusterName // ValidateClassName can be used to check whether the given class name is valid. // It is defined here to avoid import cycle between pkg/apis/storage/validation // (where it should be) and this file. -var ValidateClassName = NameIsDNSSubdomain +var ValidateClassName = apimachineryvalidation.NameIsDNSSubdomain // ValidatePiorityClassName can be used to check whether the given priority // class name is valid. -var ValidatePriorityClassName = NameIsDNSSubdomain +var ValidatePriorityClassName = apimachineryvalidation.NameIsDNSSubdomain -// TODO update all references to these functions to point to the apimachineryvalidation ones -// NameIsDNSSubdomain is a ValidateNameFunc for names that must be a DNS subdomain. -func NameIsDNSSubdomain(name string, prefix bool) []string { - return apimachineryvalidation.NameIsDNSSubdomain(name, prefix) -} - -// NameIsDNS1035Label is a ValidateNameFunc for names that must be a DNS 952 label. -func NameIsDNS1035Label(name string, prefix bool) []string { - return apimachineryvalidation.NameIsDNS1035Label(name, prefix) +// ValidateRuntimeClassName can be used to check whether the given RuntimeClass name is valid. +// Prefix indicates this name will be used as part of generation, in which case +// trailing dashes are allowed. +func ValidateRuntimeClassName(name string, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + for _, msg := range apimachineryvalidation.NameIsDNSSubdomain(name, false) { + allErrs = append(allErrs, field.Invalid(fldPath, name, msg)) + } + return allErrs } // Validates that given value is not negative. @@ -1022,7 +1023,7 @@ func validateProjectionSources(projection *core.ProjectedVolumeSource, projectio } } } - if projPath := fldPath.Child("serviceAccountToken"); source.ServiceAccountToken != nil { + if projPath := srcPath.Child("serviceAccountToken"); source.ServiceAccountToken != nil { numSources++ if !utilfeature.DefaultFeatureGate.Enabled(features.TokenRequestProjection) { allErrs = append(allErrs, field.Forbidden(projPath, "TokenRequestProjection feature is not enabled")) @@ -1493,7 +1494,7 @@ func validateCSIPersistentVolumeSource(csi *core.CSIPersistentVolumeSource, fldP // ValidatePersistentVolumeName checks that a name is appropriate for a // PersistentVolumeName object. -var ValidatePersistentVolumeName = NameIsDNSSubdomain +var ValidatePersistentVolumeName = apimachineryvalidation.NameIsDNSSubdomain var supportedAccessModes = sets.NewString(string(core.ReadWriteOnce), string(core.ReadOnlyMany), string(core.ReadWriteMany)) @@ -1501,6 +1502,10 @@ var supportedReclaimPolicy = sets.NewString(string(core.PersistentVolumeReclaimD var supportedVolumeModes = sets.NewString(string(core.PersistentVolumeBlock), string(core.PersistentVolumeFilesystem)) +var supportedDataSourceAPIGroupKinds = map[schema.GroupKind]bool{ + {Group: "snapshot.storage.k8s.io", Kind: "VolumeSnapshot"}: true, +} + func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList { metaPath := field.NewPath("metadata") allErrs := ValidateObjectMeta(&pv.ObjectMeta, false, ValidatePersistentVolumeName, metaPath) @@ -1824,6 +1829,27 @@ func ValidatePersistentVolumeClaimSpec(spec *core.PersistentVolumeClaimSpec, fld } else if spec.VolumeMode != nil && !supportedVolumeModes.Has(string(*spec.VolumeMode)) { allErrs = append(allErrs, field.NotSupported(fldPath.Child("volumeMode"), *spec.VolumeMode, supportedVolumeModes.List())) } + + if spec.DataSource != nil && !utilfeature.DefaultFeatureGate.Enabled(features.VolumeSnapshotDataSource) { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("dataSource"), "VolumeSnapshotDataSource is disabled by feature-gate")) + } else if spec.DataSource != nil { + if len(spec.DataSource.Name) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("dataSource", "name"), "")) + } + + groupKind := schema.GroupKind{Group: "", Kind: spec.DataSource.Kind} + if spec.DataSource.APIGroup != nil { + groupKind.Group = string(*spec.DataSource.APIGroup) + } + groupKindList := make([]string, 0, len(supportedDataSourceAPIGroupKinds)) + for grp := range supportedDataSourceAPIGroupKinds { + groupKindList = append(groupKindList, grp.String()) + } + if !supportedDataSourceAPIGroupKinds[groupKind] { + allErrs = append(allErrs, field.NotSupported(fldPath.Child("dataSource"), groupKind.String(), groupKindList)) + } + } + return allErrs } @@ -1918,7 +1944,7 @@ func ValidatePersistentVolumeClaimStatusUpdate(newPvc, oldPvc *core.PersistentVo return allErrs } -var supportedPortProtocols = sets.NewString(string(core.ProtocolTCP), string(core.ProtocolUDP)) +var supportedPortProtocols = sets.NewString(string(core.ProtocolTCP), string(core.ProtocolUDP), string(core.ProtocolSCTP)) func validateContainerPorts(ports []core.ContainerPort, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -1951,6 +1977,8 @@ func validateContainerPorts(ports []core.ContainerPort, fldPath *field.Path) fie } if len(port.Protocol) == 0 { allErrs = append(allErrs, field.Required(idxPath.Child("protocol"), "")) + } else if !utilfeature.DefaultFeatureGate.Enabled(features.SCTPSupport) && port.Protocol == core.ProtocolSCTP { + allErrs = append(allErrs, field.NotSupported(idxPath.Child("protocol"), port.Protocol, []string{string(core.ProtocolTCP), string(core.ProtocolUDP)})) } else if !supportedPortProtocols.Has(string(port.Protocol)) { allErrs = append(allErrs, field.NotSupported(idxPath.Child("protocol"), port.Protocol, supportedPortProtocols.List())) } @@ -2913,6 +2941,20 @@ func ValidatePod(pod *core.Pod) field.ErrorList { // this was done to preserve backwards compatibility specPath := field.NewPath("spec") + if pod.Spec.ServiceAccountName == "" { + for vi, volume := range pod.Spec.Volumes { + path := specPath.Child("volumes").Index(vi).Child("projected") + if volume.Projected != nil { + for si, source := range volume.Projected.Sources { + saPath := path.Child("sources").Index(si).Child("serviceAccountToken") + if source.ServiceAccountToken != nil { + allErrs = append(allErrs, field.Forbidden(saPath, "must not be specified when serviceAccountName is not set")) + } + } + } + } + } + allErrs = append(allErrs, validateContainersOnlyForPod(pod.Spec.Containers, specPath.Child("containers"))...) allErrs = append(allErrs, validateContainersOnlyForPod(pod.Spec.InitContainers, specPath.Child("initContainers"))...) @@ -2996,6 +3038,10 @@ func ValidatePodSpec(spec *core.PodSpec, fldPath *field.Path) field.ErrorList { } } + if spec.RuntimeClassName != nil && utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) { + allErrs = append(allErrs, ValidateRuntimeClassName(*spec.RuntimeClassName, fldPath.Child("runtimeClassName"))...) + } + return allErrs } @@ -3087,30 +3133,55 @@ func ValidateNodeSelector(nodeSelector *core.NodeSelector, fldPath *field.Path) return allErrs } -// validateTopologySelectorLabelRequirement tests that the specified TopologySelectorLabelRequirement fields has valid data -func validateTopologySelectorLabelRequirement(rq core.TopologySelectorLabelRequirement, fldPath *field.Path) field.ErrorList { +// validateTopologySelectorLabelRequirement tests that the specified TopologySelectorLabelRequirement fields has valid data, +// and constructs a set containing all of its Values. +func validateTopologySelectorLabelRequirement(rq core.TopologySelectorLabelRequirement, fldPath *field.Path) (sets.String, field.ErrorList) { allErrs := field.ErrorList{} + valueSet := make(sets.String) + valuesPath := fldPath.Child("values") if len(rq.Values) == 0 { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("values"), "must specify as least one value")) + allErrs = append(allErrs, field.Required(valuesPath, "")) } + + // Validate set property of Values field + for i, value := range rq.Values { + if valueSet.Has(value) { + allErrs = append(allErrs, field.Duplicate(valuesPath.Index(i), value)) + } + valueSet.Insert(value) + } + allErrs = append(allErrs, unversionedvalidation.ValidateLabelName(rq.Key, fldPath.Child("key"))...) - return allErrs + return valueSet, allErrs } -// ValidateTopologySelectorTerm tests that the specified topology selector term has valid data -func ValidateTopologySelectorTerm(term core.TopologySelectorTerm, fldPath *field.Path) field.ErrorList { +// ValidateTopologySelectorTerm tests that the specified topology selector term has valid data, +// and constructs a map representing the term in raw form. +func ValidateTopologySelectorTerm(term core.TopologySelectorTerm, fldPath *field.Path) (map[string]sets.String, field.ErrorList) { allErrs := field.ErrorList{} + exprMap := make(map[string]sets.String) + exprPath := fldPath.Child("matchLabelExpressions") + + if utilfeature.DefaultFeatureGate.Enabled(features.VolumeScheduling) { + // Allow empty MatchLabelExpressions, in case this field becomes optional in the future. - if utilfeature.DefaultFeatureGate.Enabled(features.DynamicProvisioningScheduling) { for i, req := range term.MatchLabelExpressions { - allErrs = append(allErrs, validateTopologySelectorLabelRequirement(req, fldPath.Child("matchLabelExpressions").Index(i))...) + idxPath := exprPath.Index(i) + valueSet, exprErrs := validateTopologySelectorLabelRequirement(req, idxPath) + allErrs = append(allErrs, exprErrs...) + + // Validate no duplicate keys exist. + if _, exists := exprMap[req.Key]; exists { + allErrs = append(allErrs, field.Duplicate(idxPath.Child("key"), req.Key)) + } + exprMap[req.Key] = valueSet } } else if len(term.MatchLabelExpressions) != 0 { - allErrs = append(allErrs, field.Forbidden(fldPath, "field is disabled by feature-gate DynamicProvisioningScheduling")) + allErrs = append(allErrs, field.Forbidden(fldPath, "field is disabled by feature-gate VolumeScheduling")) } - return allErrs + return exprMap, allErrs } // ValidateAvoidPodsInNodeAnnotations tests that the serialized AvoidPods in Node.Annotations has valid data @@ -3708,8 +3779,10 @@ func ValidateService(service *core.Service) field.ErrorList { includeProtocols := sets.NewString() for i := range service.Spec.Ports { portPath := portsPath.Index(i) - if !supportedPortProtocols.Has(string(service.Spec.Ports[i].Protocol)) { - allErrs = append(allErrs, field.Invalid(portPath.Child("protocol"), service.Spec.Ports[i].Protocol, "cannot create an external load balancer with non-TCP/UDP ports")) + if !utilfeature.DefaultFeatureGate.Enabled(features.SCTPSupport) && service.Spec.Ports[i].Protocol == core.ProtocolSCTP { + allErrs = append(allErrs, field.NotSupported(portPath.Child("protocol"), service.Spec.Ports[i].Protocol, []string{string(core.ProtocolTCP), string(core.ProtocolUDP)})) + } else if !supportedPortProtocols.Has(string(service.Spec.Ports[i].Protocol)) { + allErrs = append(allErrs, field.Invalid(portPath.Child("protocol"), service.Spec.Ports[i].Protocol, "cannot create an external load balancer with non-TCP/UDP/SCTP ports")) } else { includeProtocols.Insert(string(service.Spec.Ports[i].Protocol)) } @@ -3807,6 +3880,8 @@ func validateServicePort(sp *core.ServicePort, requireName, isHeadlessService bo if len(sp.Protocol) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("protocol"), "")) + } else if !utilfeature.DefaultFeatureGate.Enabled(features.SCTPSupport) && sp.Protocol == core.ProtocolSCTP { + allErrs = append(allErrs, field.NotSupported(fldPath.Child("protocol"), sp.Protocol, []string{string(core.ProtocolTCP), string(core.ProtocolUDP)})) } else if !supportedPortProtocols.Has(string(sp.Protocol)) { allErrs = append(allErrs, field.NotSupported(fldPath.Child("protocol"), sp.Protocol, supportedPortProtocols.List())) } @@ -4654,7 +4729,7 @@ func ValidateSecretUpdate(newSecret, oldSecret *core.Secret) field.ErrorList { // ValidateConfigMapName can be used to check whether the given ConfigMap name is valid. // Prefix indicates this name will be used as part of generation, in which case // trailing dashes are allowed. -var ValidateConfigMapName = NameIsDNSSubdomain +var ValidateConfigMapName = apimachineryvalidation.NameIsDNSSubdomain // ValidateConfigMap tests whether required fields in the ConfigMap are set. func ValidateConfigMap(cfg *core.ConfigMap) field.ErrorList { @@ -5176,6 +5251,8 @@ func validateEndpointPort(port *core.EndpointPort, requireName bool, fldPath *fi } if len(port.Protocol) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("protocol"), "")) + } else if !utilfeature.DefaultFeatureGate.Enabled(features.SCTPSupport) && port.Protocol == core.ProtocolSCTP { + allErrs = append(allErrs, field.NotSupported(fldPath.Child("protocol"), port.Protocol, []string{string(core.ProtocolTCP), string(core.ProtocolUDP)})) } else if !supportedPortProtocols.Has(string(port.Protocol)) { allErrs = append(allErrs, field.NotSupported(fldPath.Child("protocol"), port.Protocol, supportedPortProtocols.List())) } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go index 3331f6e1..26fe6fa0 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go @@ -47,30 +47,18 @@ func (in *Affinity) DeepCopyInto(out *Affinity) { *out = *in if in.NodeAffinity != nil { in, out := &in.NodeAffinity, &out.NodeAffinity - if *in == nil { - *out = nil - } else { - *out = new(NodeAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(NodeAffinity) + (*in).DeepCopyInto(*out) } if in.PodAffinity != nil { in, out := &in.PodAffinity, &out.PodAffinity - if *in == nil { - *out = nil - } else { - *out = new(PodAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(PodAffinity) + (*in).DeepCopyInto(*out) } if in.PodAntiAffinity != nil { in, out := &in.PodAntiAffinity, &out.PodAntiAffinity - if *in == nil { - *out = nil - } else { - *out = new(PodAntiAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(PodAntiAffinity) + (*in).DeepCopyInto(*out) } return } @@ -129,39 +117,23 @@ func (in *AzureDiskVolumeSource) DeepCopyInto(out *AzureDiskVolumeSource) { *out = *in if in.CachingMode != nil { in, out := &in.CachingMode, &out.CachingMode - if *in == nil { - *out = nil - } else { - *out = new(AzureDataDiskCachingMode) - **out = **in - } + *out = new(AzureDataDiskCachingMode) + **out = **in } if in.FSType != nil { in, out := &in.FSType, &out.FSType - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } if in.ReadOnly != nil { in, out := &in.ReadOnly, &out.ReadOnly - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.Kind != nil { in, out := &in.Kind, &out.Kind - if *in == nil { - *out = nil - } else { - *out = new(AzureDataDiskKind) - **out = **in - } + *out = new(AzureDataDiskKind) + **out = **in } return } @@ -181,12 +153,8 @@ func (in *AzureFilePersistentVolumeSource) DeepCopyInto(out *AzureFilePersistent *out = *in if in.SecretNamespace != nil { in, out := &in.SecretNamespace, &out.SecretNamespace - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -256,30 +224,18 @@ func (in *CSIPersistentVolumeSource) DeepCopyInto(out *CSIPersistentVolumeSource } if in.ControllerPublishSecretRef != nil { in, out := &in.ControllerPublishSecretRef, &out.ControllerPublishSecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.NodeStageSecretRef != nil { in, out := &in.NodeStageSecretRef, &out.NodeStageSecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.NodePublishSecretRef != nil { in, out := &in.NodePublishSecretRef, &out.NodePublishSecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -330,12 +286,8 @@ func (in *CephFSPersistentVolumeSource) DeepCopyInto(out *CephFSPersistentVolume } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -360,12 +312,8 @@ func (in *CephFSVolumeSource) DeepCopyInto(out *CephFSVolumeSource) { } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -385,12 +333,8 @@ func (in *CinderPersistentVolumeSource) DeepCopyInto(out *CinderPersistentVolume *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -410,12 +354,8 @@ func (in *CinderVolumeSource) DeepCopyInto(out *CinderVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -435,12 +375,8 @@ func (in *ClientIPConfig) DeepCopyInto(out *ClientIPConfig) { *out = *in if in.TimeoutSeconds != nil { in, out := &in.TimeoutSeconds, &out.TimeoutSeconds - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -551,12 +487,15 @@ func (in *ConfigMap) DeepCopyInto(out *ConfigMap) { in, out := &in.BinaryData, &out.BinaryData *out = make(map[string][]byte, len(*in)) for key, val := range *in { + var outVal []byte if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]byte, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]byte, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return @@ -586,12 +525,8 @@ func (in *ConfigMapEnvSource) DeepCopyInto(out *ConfigMapEnvSource) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -612,12 +547,8 @@ func (in *ConfigMapKeySelector) DeepCopyInto(out *ConfigMapKeySelector) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -694,12 +625,8 @@ func (in *ConfigMapProjection) DeepCopyInto(out *ConfigMapProjection) { } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -727,21 +654,13 @@ func (in *ConfigMapVolumeSource) DeepCopyInto(out *ConfigMapVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -803,39 +722,23 @@ func (in *Container) DeepCopyInto(out *Container) { } if in.LivenessProbe != nil { in, out := &in.LivenessProbe, &out.LivenessProbe - if *in == nil { - *out = nil - } else { - *out = new(Probe) - (*in).DeepCopyInto(*out) - } + *out = new(Probe) + (*in).DeepCopyInto(*out) } if in.ReadinessProbe != nil { in, out := &in.ReadinessProbe, &out.ReadinessProbe - if *in == nil { - *out = nil - } else { - *out = new(Probe) - (*in).DeepCopyInto(*out) - } + *out = new(Probe) + (*in).DeepCopyInto(*out) } if in.Lifecycle != nil { in, out := &in.Lifecycle, &out.Lifecycle - if *in == nil { - *out = nil - } else { - *out = new(Lifecycle) - (*in).DeepCopyInto(*out) - } + *out = new(Lifecycle) + (*in).DeepCopyInto(*out) } if in.SecurityContext != nil { in, out := &in.SecurityContext, &out.SecurityContext - if *in == nil { - *out = nil - } else { - *out = new(SecurityContext) - (*in).DeepCopyInto(*out) - } + *out = new(SecurityContext) + (*in).DeepCopyInto(*out) } return } @@ -892,30 +795,18 @@ func (in *ContainerState) DeepCopyInto(out *ContainerState) { *out = *in if in.Waiting != nil { in, out := &in.Waiting, &out.Waiting - if *in == nil { - *out = nil - } else { - *out = new(ContainerStateWaiting) - **out = **in - } + *out = new(ContainerStateWaiting) + **out = **in } if in.Running != nil { in, out := &in.Running, &out.Running - if *in == nil { - *out = nil - } else { - *out = new(ContainerStateRunning) - (*in).DeepCopyInto(*out) - } + *out = new(ContainerStateRunning) + (*in).DeepCopyInto(*out) } if in.Terminated != nil { in, out := &in.Terminated, &out.Terminated - if *in == nil { - *out = nil - } else { - *out = new(ContainerStateTerminated) - (*in).DeepCopyInto(*out) - } + *out = new(ContainerStateTerminated) + (*in).DeepCopyInto(*out) } return } @@ -1043,30 +934,18 @@ func (in *DownwardAPIVolumeFile) DeepCopyInto(out *DownwardAPIVolumeFile) { *out = *in if in.FieldRef != nil { in, out := &in.FieldRef, &out.FieldRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectFieldSelector) - **out = **in - } + *out = new(ObjectFieldSelector) + **out = **in } if in.ResourceFieldRef != nil { in, out := &in.ResourceFieldRef, &out.ResourceFieldRef - if *in == nil { - *out = nil - } else { - *out = new(ResourceFieldSelector) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceFieldSelector) + (*in).DeepCopyInto(*out) } if in.Mode != nil { in, out := &in.Mode, &out.Mode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -1093,12 +972,8 @@ func (in *DownwardAPIVolumeSource) DeepCopyInto(out *DownwardAPIVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -1118,12 +993,8 @@ func (in *EmptyDirVolumeSource) DeepCopyInto(out *EmptyDirVolumeSource) { *out = *in if in.SizeLimit != nil { in, out := &in.SizeLimit, &out.SizeLimit - if *in == nil { - *out = nil - } else { - x := (*in).DeepCopy() - *out = &x - } + x := (*in).DeepCopy() + *out = &x } return } @@ -1143,21 +1014,13 @@ func (in *EndpointAddress) DeepCopyInto(out *EndpointAddress) { *out = *in if in.NodeName != nil { in, out := &in.NodeName, &out.NodeName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } if in.TargetRef != nil { in, out := &in.TargetRef, &out.TargetRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } return } @@ -1294,21 +1157,13 @@ func (in *EnvFromSource) DeepCopyInto(out *EnvFromSource) { *out = *in if in.ConfigMapRef != nil { in, out := &in.ConfigMapRef, &out.ConfigMapRef - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapEnvSource) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapEnvSource) + (*in).DeepCopyInto(*out) } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretEnvSource) - (*in).DeepCopyInto(*out) - } + *out = new(SecretEnvSource) + (*in).DeepCopyInto(*out) } return } @@ -1328,12 +1183,8 @@ func (in *EnvVar) DeepCopyInto(out *EnvVar) { *out = *in if in.ValueFrom != nil { in, out := &in.ValueFrom, &out.ValueFrom - if *in == nil { - *out = nil - } else { - *out = new(EnvVarSource) - (*in).DeepCopyInto(*out) - } + *out = new(EnvVarSource) + (*in).DeepCopyInto(*out) } return } @@ -1353,39 +1204,23 @@ func (in *EnvVarSource) DeepCopyInto(out *EnvVarSource) { *out = *in if in.FieldRef != nil { in, out := &in.FieldRef, &out.FieldRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectFieldSelector) - **out = **in - } + *out = new(ObjectFieldSelector) + **out = **in } if in.ResourceFieldRef != nil { in, out := &in.ResourceFieldRef, &out.ResourceFieldRef - if *in == nil { - *out = nil - } else { - *out = new(ResourceFieldSelector) - (*in).DeepCopyInto(*out) - } + *out = new(ResourceFieldSelector) + (*in).DeepCopyInto(*out) } if in.ConfigMapKeyRef != nil { in, out := &in.ConfigMapKeyRef, &out.ConfigMapKeyRef - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapKeySelector) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapKeySelector) + (*in).DeepCopyInto(*out) } if in.SecretKeyRef != nil { in, out := &in.SecretKeyRef, &out.SecretKeyRef - if *in == nil { - *out = nil - } else { - *out = new(SecretKeySelector) - (*in).DeepCopyInto(*out) - } + *out = new(SecretKeySelector) + (*in).DeepCopyInto(*out) } return } @@ -1412,21 +1247,13 @@ func (in *Event) DeepCopyInto(out *Event) { in.EventTime.DeepCopyInto(&out.EventTime) if in.Series != nil { in, out := &in.Series, &out.Series - if *in == nil { - *out = nil - } else { - *out = new(EventSeries) - (*in).DeepCopyInto(*out) - } + *out = new(EventSeries) + (*in).DeepCopyInto(*out) } if in.Related != nil { in, out := &in.Related, &out.Related - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } return } @@ -1546,12 +1373,8 @@ func (in *FCVolumeSource) DeepCopyInto(out *FCVolumeSource) { } if in.Lun != nil { in, out := &in.Lun, &out.Lun - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.WWIDs != nil { in, out := &in.WWIDs, &out.WWIDs @@ -1576,12 +1399,8 @@ func (in *FlexPersistentVolumeSource) DeepCopyInto(out *FlexPersistentVolumeSour *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.Options != nil { in, out := &in.Options, &out.Options @@ -1608,12 +1427,8 @@ func (in *FlexVolumeSource) DeepCopyInto(out *FlexVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } if in.Options != nil { in, out := &in.Options, &out.Options @@ -1742,30 +1557,18 @@ func (in *Handler) DeepCopyInto(out *Handler) { *out = *in if in.Exec != nil { in, out := &in.Exec, &out.Exec - if *in == nil { - *out = nil - } else { - *out = new(ExecAction) - (*in).DeepCopyInto(*out) - } + *out = new(ExecAction) + (*in).DeepCopyInto(*out) } if in.HTTPGet != nil { in, out := &in.HTTPGet, &out.HTTPGet - if *in == nil { - *out = nil - } else { - *out = new(HTTPGetAction) - (*in).DeepCopyInto(*out) - } + *out = new(HTTPGetAction) + (*in).DeepCopyInto(*out) } if in.TCPSocket != nil { in, out := &in.TCPSocket, &out.TCPSocket - if *in == nil { - *out = nil - } else { - *out = new(TCPSocketAction) - **out = **in - } + *out = new(TCPSocketAction) + **out = **in } return } @@ -1806,12 +1609,8 @@ func (in *HostPathVolumeSource) DeepCopyInto(out *HostPathVolumeSource) { *out = *in if in.Type != nil { in, out := &in.Type, &out.Type - if *in == nil { - *out = nil - } else { - *out = new(HostPathType) - **out = **in - } + *out = new(HostPathType) + **out = **in } return } @@ -1836,21 +1635,13 @@ func (in *ISCSIPersistentVolumeSource) DeepCopyInto(out *ISCSIPersistentVolumeSo } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } if in.InitiatorName != nil { in, out := &in.InitiatorName, &out.InitiatorName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -1875,21 +1666,13 @@ func (in *ISCSIVolumeSource) DeepCopyInto(out *ISCSIVolumeSource) { } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } if in.InitiatorName != nil { in, out := &in.InitiatorName, &out.InitiatorName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -1909,12 +1692,8 @@ func (in *KeyToPath) DeepCopyInto(out *KeyToPath) { *out = *in if in.Mode != nil { in, out := &in.Mode, &out.Mode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -1934,21 +1713,13 @@ func (in *Lifecycle) DeepCopyInto(out *Lifecycle) { *out = *in if in.PostStart != nil { in, out := &in.PostStart, &out.PostStart - if *in == nil { - *out = nil - } else { - *out = new(Handler) - (*in).DeepCopyInto(*out) - } + *out = new(Handler) + (*in).DeepCopyInto(*out) } if in.PreStop != nil { in, out := &in.PreStop, &out.PreStop - if *in == nil { - *out = nil - } else { - *out = new(Handler) - (*in).DeepCopyInto(*out) - } + *out = new(Handler) + (*in).DeepCopyInto(*out) } return } @@ -2106,9 +1877,7 @@ func (in *List) DeepCopyInto(out *List) { in, out := &in.Items, &out.Items *out = make([]runtime.Object, len(*in)) for i := range *in { - if (*in)[i] == nil { - (*out)[i] = nil - } else { + if (*in)[i] != nil { (*out)[i] = (*in)[i].DeepCopyObject() } } @@ -2190,6 +1959,11 @@ func (in *LocalObjectReference) DeepCopy() *LocalObjectReference { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LocalVolumeSource) DeepCopyInto(out *LocalVolumeSource) { *out = *in + if in.FSType != nil { + in, out := &in.FSType, &out.FSType + *out = new(string) + **out = **in + } return } @@ -2366,12 +2140,8 @@ func (in *NodeAffinity) DeepCopyInto(out *NodeAffinity) { *out = *in if in.RequiredDuringSchedulingIgnoredDuringExecution != nil { in, out := &in.RequiredDuringSchedulingIgnoredDuringExecution, &out.RequiredDuringSchedulingIgnoredDuringExecution - if *in == nil { - *out = nil - } else { - *out = new(NodeSelector) - (*in).DeepCopyInto(*out) - } + *out = new(NodeSelector) + (*in).DeepCopyInto(*out) } if in.PreferredDuringSchedulingIgnoredDuringExecution != nil { in, out := &in.PreferredDuringSchedulingIgnoredDuringExecution, &out.PreferredDuringSchedulingIgnoredDuringExecution @@ -2416,12 +2186,8 @@ func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) { *out = *in if in.ConfigMap != nil { in, out := &in.ConfigMap, &out.ConfigMap - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapNodeConfigSource) - **out = **in - } + *out = new(ConfigMapNodeConfigSource) + **out = **in } return } @@ -2441,30 +2207,18 @@ func (in *NodeConfigStatus) DeepCopyInto(out *NodeConfigStatus) { *out = *in if in.Assigned != nil { in, out := &in.Assigned, &out.Assigned - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } if in.Active != nil { in, out := &in.Active, &out.Active - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } if in.LastKnownGood != nil { in, out := &in.LastKnownGood, &out.LastKnownGood - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } return } @@ -2663,12 +2417,8 @@ func (in *NodeSpec) DeepCopyInto(out *NodeSpec) { } if in.ConfigSource != nil { in, out := &in.ConfigSource, &out.ConfigSource - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigSource) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) } return } @@ -2733,12 +2483,8 @@ func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { } if in.Config != nil { in, out := &in.Config, &out.Config - if *in == nil { - *out = nil - } else { - *out = new(NodeConfigStatus) - (*in).DeepCopyInto(*out) - } + *out = new(NodeConfigStatus) + (*in).DeepCopyInto(*out) } return } @@ -2926,31 +2672,24 @@ func (in *PersistentVolumeClaimSpec) DeepCopyInto(out *PersistentVolumeClaimSpec } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Resources.DeepCopyInto(&out.Resources) if in.StorageClassName != nil { in, out := &in.StorageClassName, &out.StorageClassName - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } if in.VolumeMode != nil { in, out := &in.VolumeMode, &out.VolumeMode - if *in == nil { - *out = nil - } else { - *out = new(PersistentVolumeMode) - **out = **in - } + *out = new(PersistentVolumeMode) + **out = **in + } + if in.DataSource != nil { + in, out := &in.DataSource, &out.DataSource + *out = new(TypedLocalObjectReference) + (*in).DeepCopyInto(*out) } return } @@ -3054,201 +2793,113 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { *out = *in if in.GCEPersistentDisk != nil { in, out := &in.GCEPersistentDisk, &out.GCEPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(GCEPersistentDiskVolumeSource) - **out = **in - } + *out = new(GCEPersistentDiskVolumeSource) + **out = **in } if in.AWSElasticBlockStore != nil { in, out := &in.AWSElasticBlockStore, &out.AWSElasticBlockStore - if *in == nil { - *out = nil - } else { - *out = new(AWSElasticBlockStoreVolumeSource) - **out = **in - } + *out = new(AWSElasticBlockStoreVolumeSource) + **out = **in } if in.HostPath != nil { in, out := &in.HostPath, &out.HostPath - if *in == nil { - *out = nil - } else { - *out = new(HostPathVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(HostPathVolumeSource) + (*in).DeepCopyInto(*out) } if in.Glusterfs != nil { in, out := &in.Glusterfs, &out.Glusterfs - if *in == nil { - *out = nil - } else { - *out = new(GlusterfsVolumeSource) - **out = **in - } + *out = new(GlusterfsVolumeSource) + **out = **in } if in.NFS != nil { in, out := &in.NFS, &out.NFS - if *in == nil { - *out = nil - } else { - *out = new(NFSVolumeSource) - **out = **in - } + *out = new(NFSVolumeSource) + **out = **in } if in.RBD != nil { in, out := &in.RBD, &out.RBD - if *in == nil { - *out = nil - } else { - *out = new(RBDPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(RBDPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.Quobyte != nil { in, out := &in.Quobyte, &out.Quobyte - if *in == nil { - *out = nil - } else { - *out = new(QuobyteVolumeSource) - **out = **in - } + *out = new(QuobyteVolumeSource) + **out = **in } if in.ISCSI != nil { in, out := &in.ISCSI, &out.ISCSI - if *in == nil { - *out = nil - } else { - *out = new(ISCSIPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ISCSIPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.FlexVolume != nil { in, out := &in.FlexVolume, &out.FlexVolume - if *in == nil { - *out = nil - } else { - *out = new(FlexPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FlexPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.Cinder != nil { in, out := &in.Cinder, &out.Cinder - if *in == nil { - *out = nil - } else { - *out = new(CinderPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CinderPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.CephFS != nil { in, out := &in.CephFS, &out.CephFS - if *in == nil { - *out = nil - } else { - *out = new(CephFSPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CephFSPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.FC != nil { in, out := &in.FC, &out.FC - if *in == nil { - *out = nil - } else { - *out = new(FCVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FCVolumeSource) + (*in).DeepCopyInto(*out) } if in.Flocker != nil { in, out := &in.Flocker, &out.Flocker - if *in == nil { - *out = nil - } else { - *out = new(FlockerVolumeSource) - **out = **in - } + *out = new(FlockerVolumeSource) + **out = **in } if in.AzureFile != nil { in, out := &in.AzureFile, &out.AzureFile - if *in == nil { - *out = nil - } else { - *out = new(AzureFilePersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(AzureFilePersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.VsphereVolume != nil { in, out := &in.VsphereVolume, &out.VsphereVolume - if *in == nil { - *out = nil - } else { - *out = new(VsphereVirtualDiskVolumeSource) - **out = **in - } + *out = new(VsphereVirtualDiskVolumeSource) + **out = **in } if in.AzureDisk != nil { in, out := &in.AzureDisk, &out.AzureDisk - if *in == nil { - *out = nil - } else { - *out = new(AzureDiskVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(AzureDiskVolumeSource) + (*in).DeepCopyInto(*out) } if in.PhotonPersistentDisk != nil { in, out := &in.PhotonPersistentDisk, &out.PhotonPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(PhotonPersistentDiskVolumeSource) - **out = **in - } + *out = new(PhotonPersistentDiskVolumeSource) + **out = **in } if in.PortworxVolume != nil { in, out := &in.PortworxVolume, &out.PortworxVolume - if *in == nil { - *out = nil - } else { - *out = new(PortworxVolumeSource) - **out = **in - } + *out = new(PortworxVolumeSource) + **out = **in } if in.ScaleIO != nil { in, out := &in.ScaleIO, &out.ScaleIO - if *in == nil { - *out = nil - } else { - *out = new(ScaleIOPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ScaleIOPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.Local != nil { in, out := &in.Local, &out.Local - if *in == nil { - *out = nil - } else { - *out = new(LocalVolumeSource) - **out = **in - } + *out = new(LocalVolumeSource) + (*in).DeepCopyInto(*out) } if in.StorageOS != nil { in, out := &in.StorageOS, &out.StorageOS - if *in == nil { - *out = nil - } else { - *out = new(StorageOSPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(StorageOSPersistentVolumeSource) + (*in).DeepCopyInto(*out) } if in.CSI != nil { in, out := &in.CSI, &out.CSI - if *in == nil { - *out = nil - } else { - *out = new(CSIPersistentVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CSIPersistentVolumeSource) + (*in).DeepCopyInto(*out) } return } @@ -3281,12 +2932,8 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { } if in.ClaimRef != nil { in, out := &in.ClaimRef, &out.ClaimRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } if in.MountOptions != nil { in, out := &in.MountOptions, &out.MountOptions @@ -3295,21 +2942,13 @@ func (in *PersistentVolumeSpec) DeepCopyInto(out *PersistentVolumeSpec) { } if in.VolumeMode != nil { in, out := &in.VolumeMode, &out.VolumeMode - if *in == nil { - *out = nil - } else { - *out = new(PersistentVolumeMode) - **out = **in - } + *out = new(PersistentVolumeMode) + **out = **in } if in.NodeAffinity != nil { in, out := &in.NodeAffinity, &out.NodeAffinity - if *in == nil { - *out = nil - } else { - *out = new(VolumeNodeAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(VolumeNodeAffinity) + (*in).DeepCopyInto(*out) } return } @@ -3419,12 +3058,8 @@ func (in *PodAffinityTerm) DeepCopyInto(out *PodAffinityTerm) { *out = *in if in.LabelSelector != nil { in, out := &in.LabelSelector, &out.LabelSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.Namespaces != nil { in, out := &in.Namespaces, &out.Namespaces @@ -3555,12 +3190,8 @@ func (in *PodDNSConfigOption) DeepCopyInto(out *PodDNSConfigOption) { *out = *in if in.Value != nil { in, out := &in.Value, &out.Value - if *in == nil { - *out = nil - } else { - *out = new(string) - **out = **in - } + *out = new(string) + **out = **in } return } @@ -3644,38 +3275,22 @@ func (in *PodLogOptions) DeepCopyInto(out *PodLogOptions) { out.TypeMeta = in.TypeMeta if in.SinceSeconds != nil { in, out := &in.SinceSeconds, &out.SinceSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.SinceTime != nil { in, out := &in.SinceTime, &out.SinceTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.TailLines != nil { in, out := &in.TailLines, &out.TailLines - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.LimitBytes != nil { in, out := &in.LimitBytes, &out.LimitBytes - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } return } @@ -3774,48 +3389,28 @@ func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { *out = *in if in.ShareProcessNamespace != nil { in, out := &in.ShareProcessNamespace, &out.ShareProcessNamespace - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.SELinuxOptions != nil { in, out := &in.SELinuxOptions, &out.SELinuxOptions - if *in == nil { - *out = nil - } else { - *out = new(SELinuxOptions) - **out = **in - } + *out = new(SELinuxOptions) + **out = **in } if in.RunAsUser != nil { in, out := &in.RunAsUser, &out.RunAsUser - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsGroup != nil { in, out := &in.RunAsGroup, &out.RunAsGroup - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsNonRoot != nil { in, out := &in.RunAsNonRoot, &out.RunAsNonRoot - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.SupplementalGroups != nil { in, out := &in.SupplementalGroups, &out.SupplementalGroups @@ -3824,12 +3419,8 @@ func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { } if in.FSGroup != nil { in, out := &in.FSGroup, &out.FSGroup - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.Sysctls != nil { in, out := &in.Sysctls, &out.Sysctls @@ -3854,12 +3445,8 @@ func (in *PodSignature) DeepCopyInto(out *PodSignature) { *out = *in if in.PodController != nil { in, out := &in.PodController, &out.PodController - if *in == nil { - *out = nil - } else { - *out = new(v1.OwnerReference) - (*in).DeepCopyInto(*out) - } + *out = new(v1.OwnerReference) + (*in).DeepCopyInto(*out) } return } @@ -3900,21 +3487,13 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.TerminationGracePeriodSeconds != nil { in, out := &in.TerminationGracePeriodSeconds, &out.TerminationGracePeriodSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.ActiveDeadlineSeconds != nil { in, out := &in.ActiveDeadlineSeconds, &out.ActiveDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.NodeSelector != nil { in, out := &in.NodeSelector, &out.NodeSelector @@ -3925,21 +3504,13 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.AutomountServiceAccountToken != nil { in, out := &in.AutomountServiceAccountToken, &out.AutomountServiceAccountToken - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.SecurityContext != nil { in, out := &in.SecurityContext, &out.SecurityContext - if *in == nil { - *out = nil - } else { - *out = new(PodSecurityContext) - (*in).DeepCopyInto(*out) - } + *out = new(PodSecurityContext) + (*in).DeepCopyInto(*out) } if in.ImagePullSecrets != nil { in, out := &in.ImagePullSecrets, &out.ImagePullSecrets @@ -3948,12 +3519,8 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.Affinity != nil { in, out := &in.Affinity, &out.Affinity - if *in == nil { - *out = nil - } else { - *out = new(Affinity) - (*in).DeepCopyInto(*out) - } + *out = new(Affinity) + (*in).DeepCopyInto(*out) } if in.Tolerations != nil { in, out := &in.Tolerations, &out.Tolerations @@ -3971,27 +3538,24 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { } if in.Priority != nil { in, out := &in.Priority, &out.Priority - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.DNSConfig != nil { in, out := &in.DNSConfig, &out.DNSConfig - if *in == nil { - *out = nil - } else { - *out = new(PodDNSConfig) - (*in).DeepCopyInto(*out) - } + *out = new(PodDNSConfig) + (*in).DeepCopyInto(*out) } if in.ReadinessGates != nil { in, out := &in.ReadinessGates, &out.ReadinessGates *out = make([]PodReadinessGate, len(*in)) copy(*out, *in) } + if in.RuntimeClassName != nil { + in, out := &in.RuntimeClassName, &out.RuntimeClassName + *out = new(string) + **out = **in + } return } @@ -4017,11 +3581,7 @@ func (in *PodStatus) DeepCopyInto(out *PodStatus) { } if in.StartTime != nil { in, out := &in.StartTime, &out.StartTime - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } if in.InitContainerStatuses != nil { in, out := &in.InitContainerStatuses, &out.InitContainerStatuses @@ -4176,12 +3736,8 @@ func (in *Preconditions) DeepCopyInto(out *Preconditions) { *out = *in if in.UID != nil { in, out := &in.UID, &out.UID - if *in == nil { - *out = nil - } else { - *out = new(types.UID) - **out = **in - } + *out = new(types.UID) + **out = **in } return } @@ -4260,12 +3816,8 @@ func (in *ProjectedVolumeSource) DeepCopyInto(out *ProjectedVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -4306,12 +3858,8 @@ func (in *RBDPersistentVolumeSource) DeepCopyInto(out *RBDPersistentVolumeSource } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -4336,12 +3884,8 @@ func (in *RBDVolumeSource) DeepCopyInto(out *RBDVolumeSource) { } if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -4477,12 +4021,8 @@ func (in *ReplicationControllerSpec) DeepCopyInto(out *ReplicationControllerSpec } if in.Template != nil { in, out := &in.Template, &out.Template - if *in == nil { - *out = nil - } else { - *out = new(PodTemplateSpec) - (*in).DeepCopyInto(*out) - } + *out = new(PodTemplateSpec) + (*in).DeepCopyInto(*out) } return } @@ -4637,12 +4177,8 @@ func (in *ResourceQuotaSpec) DeepCopyInto(out *ResourceQuotaSpec) { } if in.ScopeSelector != nil { in, out := &in.ScopeSelector, &out.ScopeSelector - if *in == nil { - *out = nil - } else { - *out = new(ScopeSelector) - (*in).DeepCopyInto(*out) - } + *out = new(ScopeSelector) + (*in).DeepCopyInto(*out) } return } @@ -4738,12 +4274,8 @@ func (in *ScaleIOPersistentVolumeSource) DeepCopyInto(out *ScaleIOPersistentVolu *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(SecretReference) - **out = **in - } + *out = new(SecretReference) + **out = **in } return } @@ -4763,12 +4295,8 @@ func (in *ScaleIOVolumeSource) DeepCopyInto(out *ScaleIOVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -4836,12 +4364,15 @@ func (in *Secret) DeepCopyInto(out *Secret) { in, out := &in.Data, &out.Data *out = make(map[string][]byte, len(*in)) for key, val := range *in { + var outVal []byte if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]byte, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]byte, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } return @@ -4871,12 +4402,8 @@ func (in *SecretEnvSource) DeepCopyInto(out *SecretEnvSource) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -4897,12 +4424,8 @@ func (in *SecretKeySelector) DeepCopyInto(out *SecretKeySelector) { out.LocalObjectReference = in.LocalObjectReference if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -4963,12 +4486,8 @@ func (in *SecretProjection) DeepCopyInto(out *SecretProjection) { } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -5011,21 +4530,13 @@ func (in *SecretVolumeSource) DeepCopyInto(out *SecretVolumeSource) { } if in.DefaultMode != nil { in, out := &in.DefaultMode, &out.DefaultMode - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Optional != nil { in, out := &in.Optional, &out.Optional - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -5045,75 +4556,48 @@ func (in *SecurityContext) DeepCopyInto(out *SecurityContext) { *out = *in if in.Capabilities != nil { in, out := &in.Capabilities, &out.Capabilities - if *in == nil { - *out = nil - } else { - *out = new(Capabilities) - (*in).DeepCopyInto(*out) - } + *out = new(Capabilities) + (*in).DeepCopyInto(*out) } if in.Privileged != nil { in, out := &in.Privileged, &out.Privileged - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.SELinuxOptions != nil { in, out := &in.SELinuxOptions, &out.SELinuxOptions - if *in == nil { - *out = nil - } else { - *out = new(SELinuxOptions) - **out = **in - } + *out = new(SELinuxOptions) + **out = **in } if in.RunAsUser != nil { in, out := &in.RunAsUser, &out.RunAsUser - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsGroup != nil { in, out := &in.RunAsGroup, &out.RunAsGroup - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } if in.RunAsNonRoot != nil { in, out := &in.RunAsNonRoot, &out.RunAsNonRoot - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.ReadOnlyRootFilesystem != nil { in, out := &in.ReadOnlyRootFilesystem, &out.ReadOnlyRootFilesystem - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.AllowPrivilegeEscalation != nil { in, out := &in.AllowPrivilegeEscalation, &out.AllowPrivilegeEscalation - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in + } + if in.ProcMount != nil { + in, out := &in.ProcMount, &out.ProcMount + *out = new(ProcMountType) + **out = **in } return } @@ -5199,12 +4683,8 @@ func (in *ServiceAccount) DeepCopyInto(out *ServiceAccount) { } if in.AutomountServiceAccountToken != nil { in, out := &in.AutomountServiceAccountToken, &out.AutomountServiceAccountToken - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } return } @@ -5373,12 +4853,8 @@ func (in *ServiceSpec) DeepCopyInto(out *ServiceSpec) { } if in.SessionAffinityConfig != nil { in, out := &in.SessionAffinityConfig, &out.SessionAffinityConfig - if *in == nil { - *out = nil - } else { - *out = new(SessionAffinityConfig) - (*in).DeepCopyInto(*out) - } + *out = new(SessionAffinityConfig) + (*in).DeepCopyInto(*out) } if in.LoadBalancerSourceRanges != nil { in, out := &in.LoadBalancerSourceRanges, &out.LoadBalancerSourceRanges @@ -5420,12 +4896,8 @@ func (in *SessionAffinityConfig) DeepCopyInto(out *SessionAffinityConfig) { *out = *in if in.ClientIP != nil { in, out := &in.ClientIP, &out.ClientIP - if *in == nil { - *out = nil - } else { - *out = new(ClientIPConfig) - (*in).DeepCopyInto(*out) - } + *out = new(ClientIPConfig) + (*in).DeepCopyInto(*out) } return } @@ -5445,12 +4917,8 @@ func (in *StorageOSPersistentVolumeSource) DeepCopyInto(out *StorageOSPersistent *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(ObjectReference) - **out = **in - } + *out = new(ObjectReference) + **out = **in } return } @@ -5470,12 +4938,8 @@ func (in *StorageOSVolumeSource) DeepCopyInto(out *StorageOSVolumeSource) { *out = *in if in.SecretRef != nil { in, out := &in.SecretRef, &out.SecretRef - if *in == nil { - *out = nil - } else { - *out = new(LocalObjectReference) - **out = **in - } + *out = new(LocalObjectReference) + **out = **in } return } @@ -5528,11 +4992,7 @@ func (in *Taint) DeepCopyInto(out *Taint) { *out = *in if in.TimeAdded != nil { in, out := &in.TimeAdded, &out.TimeAdded - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } + *out = (*in).DeepCopy() } return } @@ -5552,12 +5012,8 @@ func (in *Toleration) DeepCopyInto(out *Toleration) { *out = *in if in.TolerationSeconds != nil { in, out := &in.TolerationSeconds, &out.TolerationSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } + *out = new(int64) + **out = **in } return } @@ -5616,6 +5072,27 @@ func (in *TopologySelectorTerm) DeepCopy() *TopologySelectorTerm { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TypedLocalObjectReference) DeepCopyInto(out *TypedLocalObjectReference) { + *out = *in + if in.APIGroup != nil { + in, out := &in.APIGroup, &out.APIGroup + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TypedLocalObjectReference. +func (in *TypedLocalObjectReference) DeepCopy() *TypedLocalObjectReference { + if in == nil { + return nil + } + out := new(TypedLocalObjectReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Volume) DeepCopyInto(out *Volume) { *out = *in @@ -5654,12 +5131,8 @@ func (in *VolumeMount) DeepCopyInto(out *VolumeMount) { *out = *in if in.MountPropagation != nil { in, out := &in.MountPropagation, &out.MountPropagation - if *in == nil { - *out = nil - } else { - *out = new(MountPropagationMode) - **out = **in - } + *out = new(MountPropagationMode) + **out = **in } return } @@ -5679,12 +5152,8 @@ func (in *VolumeNodeAffinity) DeepCopyInto(out *VolumeNodeAffinity) { *out = *in if in.Required != nil { in, out := &in.Required, &out.Required - if *in == nil { - *out = nil - } else { - *out = new(NodeSelector) - (*in).DeepCopyInto(*out) - } + *out = new(NodeSelector) + (*in).DeepCopyInto(*out) } return } @@ -5704,39 +5173,23 @@ func (in *VolumeProjection) DeepCopyInto(out *VolumeProjection) { *out = *in if in.Secret != nil { in, out := &in.Secret, &out.Secret - if *in == nil { - *out = nil - } else { - *out = new(SecretProjection) - (*in).DeepCopyInto(*out) - } + *out = new(SecretProjection) + (*in).DeepCopyInto(*out) } if in.DownwardAPI != nil { in, out := &in.DownwardAPI, &out.DownwardAPI - if *in == nil { - *out = nil - } else { - *out = new(DownwardAPIProjection) - (*in).DeepCopyInto(*out) - } + *out = new(DownwardAPIProjection) + (*in).DeepCopyInto(*out) } if in.ConfigMap != nil { in, out := &in.ConfigMap, &out.ConfigMap - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapProjection) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapProjection) + (*in).DeepCopyInto(*out) } if in.ServiceAccountToken != nil { in, out := &in.ServiceAccountToken, &out.ServiceAccountToken - if *in == nil { - *out = nil - } else { - *out = new(ServiceAccountTokenProjection) - **out = **in - } + *out = new(ServiceAccountTokenProjection) + **out = **in } return } @@ -5756,246 +5209,138 @@ func (in *VolumeSource) DeepCopyInto(out *VolumeSource) { *out = *in if in.HostPath != nil { in, out := &in.HostPath, &out.HostPath - if *in == nil { - *out = nil - } else { - *out = new(HostPathVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(HostPathVolumeSource) + (*in).DeepCopyInto(*out) } if in.EmptyDir != nil { in, out := &in.EmptyDir, &out.EmptyDir - if *in == nil { - *out = nil - } else { - *out = new(EmptyDirVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(EmptyDirVolumeSource) + (*in).DeepCopyInto(*out) } if in.GCEPersistentDisk != nil { in, out := &in.GCEPersistentDisk, &out.GCEPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(GCEPersistentDiskVolumeSource) - **out = **in - } + *out = new(GCEPersistentDiskVolumeSource) + **out = **in } if in.AWSElasticBlockStore != nil { in, out := &in.AWSElasticBlockStore, &out.AWSElasticBlockStore - if *in == nil { - *out = nil - } else { - *out = new(AWSElasticBlockStoreVolumeSource) - **out = **in - } + *out = new(AWSElasticBlockStoreVolumeSource) + **out = **in } if in.GitRepo != nil { in, out := &in.GitRepo, &out.GitRepo - if *in == nil { - *out = nil - } else { - *out = new(GitRepoVolumeSource) - **out = **in - } + *out = new(GitRepoVolumeSource) + **out = **in } if in.Secret != nil { in, out := &in.Secret, &out.Secret - if *in == nil { - *out = nil - } else { - *out = new(SecretVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(SecretVolumeSource) + (*in).DeepCopyInto(*out) } if in.NFS != nil { in, out := &in.NFS, &out.NFS - if *in == nil { - *out = nil - } else { - *out = new(NFSVolumeSource) - **out = **in - } + *out = new(NFSVolumeSource) + **out = **in } if in.ISCSI != nil { in, out := &in.ISCSI, &out.ISCSI - if *in == nil { - *out = nil - } else { - *out = new(ISCSIVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ISCSIVolumeSource) + (*in).DeepCopyInto(*out) } if in.Glusterfs != nil { in, out := &in.Glusterfs, &out.Glusterfs - if *in == nil { - *out = nil - } else { - *out = new(GlusterfsVolumeSource) - **out = **in - } + *out = new(GlusterfsVolumeSource) + **out = **in } if in.PersistentVolumeClaim != nil { in, out := &in.PersistentVolumeClaim, &out.PersistentVolumeClaim - if *in == nil { - *out = nil - } else { - *out = new(PersistentVolumeClaimVolumeSource) - **out = **in - } + *out = new(PersistentVolumeClaimVolumeSource) + **out = **in } if in.RBD != nil { in, out := &in.RBD, &out.RBD - if *in == nil { - *out = nil - } else { - *out = new(RBDVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(RBDVolumeSource) + (*in).DeepCopyInto(*out) } if in.Quobyte != nil { in, out := &in.Quobyte, &out.Quobyte - if *in == nil { - *out = nil - } else { - *out = new(QuobyteVolumeSource) - **out = **in - } + *out = new(QuobyteVolumeSource) + **out = **in } if in.FlexVolume != nil { in, out := &in.FlexVolume, &out.FlexVolume - if *in == nil { - *out = nil - } else { - *out = new(FlexVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FlexVolumeSource) + (*in).DeepCopyInto(*out) } if in.Cinder != nil { in, out := &in.Cinder, &out.Cinder - if *in == nil { - *out = nil - } else { - *out = new(CinderVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CinderVolumeSource) + (*in).DeepCopyInto(*out) } if in.CephFS != nil { in, out := &in.CephFS, &out.CephFS - if *in == nil { - *out = nil - } else { - *out = new(CephFSVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(CephFSVolumeSource) + (*in).DeepCopyInto(*out) } if in.Flocker != nil { in, out := &in.Flocker, &out.Flocker - if *in == nil { - *out = nil - } else { - *out = new(FlockerVolumeSource) - **out = **in - } + *out = new(FlockerVolumeSource) + **out = **in } if in.DownwardAPI != nil { in, out := &in.DownwardAPI, &out.DownwardAPI - if *in == nil { - *out = nil - } else { - *out = new(DownwardAPIVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(DownwardAPIVolumeSource) + (*in).DeepCopyInto(*out) } if in.FC != nil { in, out := &in.FC, &out.FC - if *in == nil { - *out = nil - } else { - *out = new(FCVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(FCVolumeSource) + (*in).DeepCopyInto(*out) } if in.AzureFile != nil { in, out := &in.AzureFile, &out.AzureFile - if *in == nil { - *out = nil - } else { - *out = new(AzureFileVolumeSource) - **out = **in - } + *out = new(AzureFileVolumeSource) + **out = **in } if in.ConfigMap != nil { in, out := &in.ConfigMap, &out.ConfigMap - if *in == nil { - *out = nil - } else { - *out = new(ConfigMapVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ConfigMapVolumeSource) + (*in).DeepCopyInto(*out) } if in.VsphereVolume != nil { in, out := &in.VsphereVolume, &out.VsphereVolume - if *in == nil { - *out = nil - } else { - *out = new(VsphereVirtualDiskVolumeSource) - **out = **in - } + *out = new(VsphereVirtualDiskVolumeSource) + **out = **in } if in.AzureDisk != nil { in, out := &in.AzureDisk, &out.AzureDisk - if *in == nil { - *out = nil - } else { - *out = new(AzureDiskVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(AzureDiskVolumeSource) + (*in).DeepCopyInto(*out) } if in.PhotonPersistentDisk != nil { in, out := &in.PhotonPersistentDisk, &out.PhotonPersistentDisk - if *in == nil { - *out = nil - } else { - *out = new(PhotonPersistentDiskVolumeSource) - **out = **in - } + *out = new(PhotonPersistentDiskVolumeSource) + **out = **in } if in.Projected != nil { in, out := &in.Projected, &out.Projected - if *in == nil { - *out = nil - } else { - *out = new(ProjectedVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ProjectedVolumeSource) + (*in).DeepCopyInto(*out) } if in.PortworxVolume != nil { in, out := &in.PortworxVolume, &out.PortworxVolume - if *in == nil { - *out = nil - } else { - *out = new(PortworxVolumeSource) - **out = **in - } + *out = new(PortworxVolumeSource) + **out = **in } if in.ScaleIO != nil { in, out := &in.ScaleIO, &out.ScaleIO - if *in == nil { - *out = nil - } else { - *out = new(ScaleIOVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(ScaleIOVolumeSource) + (*in).DeepCopyInto(*out) } if in.StorageOS != nil { in, out := &in.StorageOS, &out.StorageOS - if *in == nil { - *out = nil - } else { - *out = new(StorageOSVolumeSource) - (*in).DeepCopyInto(*out) - } + *out = new(StorageOSVolumeSource) + (*in).DeepCopyInto(*out) } return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD index 511011b5..764a5af8 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/BUILD @@ -19,11 +19,11 @@ go_library( "//pkg/apis/core:go_default_library", "//pkg/apis/networking:go_default_library", "//pkg/apis/policy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS b/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS index cfac4711..fc2bfc6f 100755 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS @@ -36,3 +36,5 @@ reviewers: - mqliang - lukaszo - jianhuiz +labels: +- sig/apps diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/types.go b/vendor/k8s.io/kubernetes/pkg/apis/extensions/types.go index a2330c45..8dd49b46 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/types.go @@ -127,8 +127,8 @@ type DeploymentSpec struct { // is considered to be failed. The deployment controller will continue to // process failed deployments and a condition with a ProgressDeadlineExceeded // reason will be surfaced in the deployment status. Note that progress will - // not be estimated during the time a deployment is paused. This is not set - // by default. + // not be estimated during the time a deployment is paused. This is set to + // the max value of int32 (i.e. 2147483647) by default, which means "no deadline". // +optional ProgressDeadlineSeconds *int32 } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/BUILD deleted file mode 100644 index e56e1162..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/extensions/validation", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/extensions:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/validation.go deleted file mode 100644 index 3f0d3747..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/validation/validation.go +++ /dev/null @@ -1,608 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 validation - -import ( - "net" - "regexp" - "strconv" - "strings" - - apiequality "k8s.io/apimachinery/pkg/api/equality" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/apimachinery/pkg/util/validation/field" - api "k8s.io/kubernetes/pkg/apis/core" - apivalidation "k8s.io/kubernetes/pkg/apis/core/validation" - "k8s.io/kubernetes/pkg/apis/extensions" -) - -// ValidateDaemonSet tests if required fields in the DaemonSet are set. -func ValidateDaemonSet(ds *extensions.DaemonSet) field.ErrorList { - allErrs := apivalidation.ValidateObjectMeta(&ds.ObjectMeta, true, ValidateDaemonSetName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateDaemonSetSpec(&ds.Spec, field.NewPath("spec"))...) - return allErrs -} - -// ValidateDaemonSetUpdate tests if required fields in the DaemonSet are set. -func ValidateDaemonSetUpdate(ds, oldDS *extensions.DaemonSet) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&ds.ObjectMeta, &oldDS.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateDaemonSetSpecUpdate(&ds.Spec, &oldDS.Spec, field.NewPath("spec"))...) - allErrs = append(allErrs, ValidateDaemonSetSpec(&ds.Spec, field.NewPath("spec"))...) - return allErrs -} - -func ValidateDaemonSetSpecUpdate(newSpec, oldSpec *extensions.DaemonSetSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - // TemplateGeneration shouldn't be decremented - if newSpec.TemplateGeneration < oldSpec.TemplateGeneration { - allErrs = append(allErrs, field.Invalid(fldPath.Child("templateGeneration"), newSpec.TemplateGeneration, "must not be decremented")) - } - - // TemplateGeneration should be increased when and only when template is changed - templateUpdated := !apiequality.Semantic.DeepEqual(newSpec.Template, oldSpec.Template) - if newSpec.TemplateGeneration == oldSpec.TemplateGeneration && templateUpdated { - allErrs = append(allErrs, field.Invalid(fldPath.Child("templateGeneration"), newSpec.TemplateGeneration, "must be incremented upon template update")) - } else if newSpec.TemplateGeneration > oldSpec.TemplateGeneration && !templateUpdated { - allErrs = append(allErrs, field.Invalid(fldPath.Child("templateGeneration"), newSpec.TemplateGeneration, "must not be incremented without template update")) - } - - return allErrs -} - -// validateDaemonSetStatus validates a DaemonSetStatus -func validateDaemonSetStatus(status *extensions.DaemonSetStatus, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.CurrentNumberScheduled), fldPath.Child("currentNumberScheduled"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberMisscheduled), fldPath.Child("numberMisscheduled"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.DesiredNumberScheduled), fldPath.Child("desiredNumberScheduled"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberReady), fldPath.Child("numberReady"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(status.ObservedGeneration, fldPath.Child("observedGeneration"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.UpdatedNumberScheduled), fldPath.Child("updatedNumberScheduled"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberAvailable), fldPath.Child("numberAvailable"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberUnavailable), fldPath.Child("numberUnavailable"))...) - if status.CollisionCount != nil { - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*status.CollisionCount), fldPath.Child("collisionCount"))...) - } - return allErrs -} - -// ValidateDaemonSetStatus validates tests if required fields in the DaemonSet Status section -func ValidateDaemonSetStatusUpdate(ds, oldDS *extensions.DaemonSet) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&ds.ObjectMeta, &oldDS.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, validateDaemonSetStatus(&ds.Status, field.NewPath("status"))...) - if apivalidation.IsDecremented(ds.Status.CollisionCount, oldDS.Status.CollisionCount) { - value := int32(0) - if ds.Status.CollisionCount != nil { - value = *ds.Status.CollisionCount - } - allErrs = append(allErrs, field.Invalid(field.NewPath("status").Child("collisionCount"), value, "cannot be decremented")) - } - return allErrs -} - -// ValidateDaemonSetSpec tests if required fields in the DaemonSetSpec are set. -func ValidateDaemonSetSpec(spec *extensions.DaemonSetSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) - - selector, err := metav1.LabelSelectorAsSelector(spec.Selector) - if err == nil && !selector.Matches(labels.Set(spec.Template.Labels)) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("template", "metadata", "labels"), spec.Template.Labels, "`selector` does not match template `labels`")) - } - if spec.Selector != nil && len(spec.Selector.MatchLabels)+len(spec.Selector.MatchExpressions) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "empty selector is not valid for daemonset.")) - } - - allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(&spec.Template, fldPath.Child("template"))...) - // Daemons typically run on more than one node, so mark Read-Write persistent disks as invalid. - allErrs = append(allErrs, apivalidation.ValidateReadOnlyPersistentDisks(spec.Template.Spec.Volumes, fldPath.Child("template", "spec", "volumes"))...) - // RestartPolicy has already been first-order validated as per ValidatePodTemplateSpec(). - if spec.Template.Spec.RestartPolicy != api.RestartPolicyAlways { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("template", "spec", "restartPolicy"), spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)})) - } - if spec.Template.Spec.ActiveDeadlineSeconds != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("template", "spec", "activeDeadlineSeconds"), spec.Template.Spec.ActiveDeadlineSeconds, "must not be specified")) - } - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.TemplateGeneration), fldPath.Child("templateGeneration"))...) - - allErrs = append(allErrs, ValidateDaemonSetUpdateStrategy(&spec.UpdateStrategy, fldPath.Child("updateStrategy"))...) - if spec.RevisionHistoryLimit != nil { - // zero is a valid RevisionHistoryLimit - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.RevisionHistoryLimit), fldPath.Child("revisionHistoryLimit"))...) - } - return allErrs -} - -func ValidateRollingUpdateDaemonSet(rollingUpdate *extensions.RollingUpdateDaemonSet, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, ValidatePositiveIntOrPercent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) - if getIntOrPercentValue(rollingUpdate.MaxUnavailable) == 0 { - // MaxUnavailable cannot be 0. - allErrs = append(allErrs, field.Invalid(fldPath.Child("maxUnavailable"), rollingUpdate.MaxUnavailable, "cannot be 0")) - } - // Validate that MaxUnavailable is not more than 100%. - allErrs = append(allErrs, IsNotMoreThan100Percent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) - return allErrs -} - -func ValidateDaemonSetUpdateStrategy(strategy *extensions.DaemonSetUpdateStrategy, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - switch strategy.Type { - case extensions.OnDeleteDaemonSetStrategyType: - case extensions.RollingUpdateDaemonSetStrategyType: - // Make sure RollingUpdate field isn't nil. - if strategy.RollingUpdate == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("rollingUpdate"), "")) - return allErrs - } - allErrs = append(allErrs, ValidateRollingUpdateDaemonSet(strategy.RollingUpdate, fldPath.Child("rollingUpdate"))...) - default: - validValues := []string{string(extensions.RollingUpdateDaemonSetStrategyType), string(extensions.OnDeleteDaemonSetStrategyType)} - allErrs = append(allErrs, field.NotSupported(fldPath, strategy, validValues)) - } - return allErrs -} - -// ValidateDaemonSetName can be used to check whether the given daemon set name is valid. -// Prefix indicates this name will be used as part of generation, in which case -// trailing dashes are allowed. -var ValidateDaemonSetName = apivalidation.NameIsDNSSubdomain - -// Validates that the given name can be used as a deployment name. -var ValidateDeploymentName = apivalidation.NameIsDNSSubdomain - -func ValidatePositiveIntOrPercent(intOrPercent intstr.IntOrString, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - switch intOrPercent.Type { - case intstr.String: - for _, msg := range validation.IsValidPercent(intOrPercent.StrVal) { - allErrs = append(allErrs, field.Invalid(fldPath, intOrPercent, msg)) - } - case intstr.Int: - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(intOrPercent.IntValue()), fldPath)...) - default: - allErrs = append(allErrs, field.Invalid(fldPath, intOrPercent, "must be an integer or percentage (e.g '5%%')")) - } - return allErrs -} - -func getPercentValue(intOrStringValue intstr.IntOrString) (int, bool) { - if intOrStringValue.Type != intstr.String { - return 0, false - } - if len(validation.IsValidPercent(intOrStringValue.StrVal)) != 0 { - return 0, false - } - value, _ := strconv.Atoi(intOrStringValue.StrVal[:len(intOrStringValue.StrVal)-1]) - return value, true -} - -func getIntOrPercentValue(intOrStringValue intstr.IntOrString) int { - value, isPercent := getPercentValue(intOrStringValue) - if isPercent { - return value - } - return intOrStringValue.IntValue() -} - -func IsNotMoreThan100Percent(intOrStringValue intstr.IntOrString, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - value, isPercent := getPercentValue(intOrStringValue) - if !isPercent || value <= 100 { - return nil - } - allErrs = append(allErrs, field.Invalid(fldPath, intOrStringValue, "must not be greater than 100%")) - return allErrs -} - -func ValidateRollingUpdateDeployment(rollingUpdate *extensions.RollingUpdateDeployment, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, ValidatePositiveIntOrPercent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) - allErrs = append(allErrs, ValidatePositiveIntOrPercent(rollingUpdate.MaxSurge, fldPath.Child("maxSurge"))...) - if getIntOrPercentValue(rollingUpdate.MaxUnavailable) == 0 && getIntOrPercentValue(rollingUpdate.MaxSurge) == 0 { - // Both MaxSurge and MaxUnavailable cannot be zero. - allErrs = append(allErrs, field.Invalid(fldPath.Child("maxUnavailable"), rollingUpdate.MaxUnavailable, "may not be 0 when `maxSurge` is 0")) - } - // Validate that MaxUnavailable is not more than 100%. - allErrs = append(allErrs, IsNotMoreThan100Percent(rollingUpdate.MaxUnavailable, fldPath.Child("maxUnavailable"))...) - return allErrs -} - -func ValidateDeploymentStrategy(strategy *extensions.DeploymentStrategy, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - switch strategy.Type { - case extensions.RecreateDeploymentStrategyType: - if strategy.RollingUpdate != nil { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("rollingUpdate"), "may not be specified when strategy `type` is '"+string(extensions.RecreateDeploymentStrategyType+"'"))) - } - case extensions.RollingUpdateDeploymentStrategyType: - // This should never happen since it's set and checked in defaults.go - if strategy.RollingUpdate == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("rollingUpdate"), "this should be defaulted and never be nil")) - } else { - allErrs = append(allErrs, ValidateRollingUpdateDeployment(strategy.RollingUpdate, fldPath.Child("rollingUpdate"))...) - } - default: - validValues := []string{string(extensions.RecreateDeploymentStrategyType), string(extensions.RollingUpdateDeploymentStrategyType)} - allErrs = append(allErrs, field.NotSupported(fldPath, strategy, validValues)) - } - return allErrs -} - -func ValidateRollback(rollback *extensions.RollbackConfig, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - v := rollback.Revision - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(v), fldPath.Child("version"))...) - return allErrs -} - -// Validates given deployment spec. -func ValidateDeploymentSpec(spec *extensions.DeploymentSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.Replicas), fldPath.Child("replicas"))...) - - if spec.Selector == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("selector"), "")) - } else { - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) - if len(spec.Selector.MatchLabels)+len(spec.Selector.MatchExpressions) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "empty selector is not valid for deployment.")) - } - } - - selector, err := metav1.LabelSelectorAsSelector(spec.Selector) - if err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "invalid label selector.")) - } else { - allErrs = append(allErrs, ValidatePodTemplateSpecForReplicaSet(&spec.Template, selector, spec.Replicas, fldPath.Child("template"))...) - } - - allErrs = append(allErrs, ValidateDeploymentStrategy(&spec.Strategy, fldPath.Child("strategy"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...) - if spec.RevisionHistoryLimit != nil { - // zero is a valid RevisionHistoryLimit - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.RevisionHistoryLimit), fldPath.Child("revisionHistoryLimit"))...) - } - if spec.RollbackTo != nil { - allErrs = append(allErrs, ValidateRollback(spec.RollbackTo, fldPath.Child("rollback"))...) - } - if spec.ProgressDeadlineSeconds != nil { - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*spec.ProgressDeadlineSeconds), fldPath.Child("progressDeadlineSeconds"))...) - if *spec.ProgressDeadlineSeconds <= spec.MinReadySeconds { - allErrs = append(allErrs, field.Invalid(fldPath.Child("progressDeadlineSeconds"), spec.ProgressDeadlineSeconds, "must be greater than minReadySeconds.")) - } - } - return allErrs -} - -// Validates given deployment status. -func ValidateDeploymentStatus(status *extensions.DeploymentStatus, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(status.ObservedGeneration, fldPath.Child("observedGeneration"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.Replicas), fldPath.Child("replicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.UpdatedReplicas), fldPath.Child("updatedReplicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.ReadyReplicas), fldPath.Child("readyReplicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.AvailableReplicas), fldPath.Child("availableReplicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.UnavailableReplicas), fldPath.Child("unavailableReplicas"))...) - if status.CollisionCount != nil { - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(*status.CollisionCount), fldPath.Child("collisionCount"))...) - } - msg := "cannot be greater than status.replicas" - if status.UpdatedReplicas > status.Replicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("updatedReplicas"), status.UpdatedReplicas, msg)) - } - if status.ReadyReplicas > status.Replicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("readyReplicas"), status.ReadyReplicas, msg)) - } - if status.AvailableReplicas > status.Replicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("availableReplicas"), status.AvailableReplicas, msg)) - } - if status.AvailableReplicas > status.ReadyReplicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("availableReplicas"), status.AvailableReplicas, "cannot be greater than readyReplicas")) - } - return allErrs -} - -func ValidateDeploymentUpdate(update, old *extensions.Deployment) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&update.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateDeploymentSpec(&update.Spec, field.NewPath("spec"))...) - return allErrs -} - -func ValidateDeploymentStatusUpdate(update, old *extensions.Deployment) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&update.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata")) - fldPath := field.NewPath("status") - allErrs = append(allErrs, ValidateDeploymentStatus(&update.Status, fldPath)...) - if apivalidation.IsDecremented(update.Status.CollisionCount, old.Status.CollisionCount) { - value := int32(0) - if update.Status.CollisionCount != nil { - value = *update.Status.CollisionCount - } - allErrs = append(allErrs, field.Invalid(fldPath.Child("collisionCount"), value, "cannot be decremented")) - } - return allErrs -} - -func ValidateDeployment(obj *extensions.Deployment) field.ErrorList { - allErrs := apivalidation.ValidateObjectMeta(&obj.ObjectMeta, true, ValidateDeploymentName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateDeploymentSpec(&obj.Spec, field.NewPath("spec"))...) - return allErrs -} - -func ValidateDeploymentRollback(obj *extensions.DeploymentRollback) field.ErrorList { - allErrs := apivalidation.ValidateAnnotations(obj.UpdatedAnnotations, field.NewPath("updatedAnnotations")) - if len(obj.Name) == 0 { - allErrs = append(allErrs, field.Required(field.NewPath("name"), "name is required")) - } - allErrs = append(allErrs, ValidateRollback(&obj.RollbackTo, field.NewPath("rollback"))...) - return allErrs -} - -// ValidateIngress tests if required fields in the Ingress are set. -func ValidateIngress(ingress *extensions.Ingress) field.ErrorList { - allErrs := apivalidation.ValidateObjectMeta(&ingress.ObjectMeta, true, ValidateIngressName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateIngressSpec(&ingress.Spec, field.NewPath("spec"))...) - return allErrs -} - -// ValidateIngressName validates that the given name can be used as an Ingress name. -var ValidateIngressName = apivalidation.NameIsDNSSubdomain - -func validateIngressTLS(spec *extensions.IngressSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - // TODO: Perform a more thorough validation of spec.TLS.Hosts that takes - // the wildcard spec from RFC 6125 into account. - for _, itls := range spec.TLS { - for i, host := range itls.Hosts { - if strings.Contains(host, "*") { - for _, msg := range validation.IsWildcardDNS1123Subdomain(host) { - allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("hosts"), host, msg)) - } - continue - } - for _, msg := range validation.IsDNS1123Subdomain(host) { - allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("hosts"), host, msg)) - } - } - } - - return allErrs -} - -// ValidateIngressSpec tests if required fields in the IngressSpec are set. -func ValidateIngressSpec(spec *extensions.IngressSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - // TODO: Is a default backend mandatory? - if spec.Backend != nil { - allErrs = append(allErrs, validateIngressBackend(spec.Backend, fldPath.Child("backend"))...) - } else if len(spec.Rules) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath, spec.Rules, "either `backend` or `rules` must be specified")) - } - if len(spec.Rules) > 0 { - allErrs = append(allErrs, validateIngressRules(spec.Rules, fldPath.Child("rules"))...) - } - if len(spec.TLS) > 0 { - allErrs = append(allErrs, validateIngressTLS(spec, fldPath.Child("tls"))...) - } - return allErrs -} - -// ValidateIngressUpdate tests if required fields in the Ingress are set. -func ValidateIngressUpdate(ingress, oldIngress *extensions.Ingress) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&ingress.ObjectMeta, &oldIngress.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateIngressSpec(&ingress.Spec, field.NewPath("spec"))...) - return allErrs -} - -// ValidateIngressStatusUpdate tests if required fields in the Ingress are set when updating status. -func ValidateIngressStatusUpdate(ingress, oldIngress *extensions.Ingress) field.ErrorList { - allErrs := apivalidation.ValidateObjectMetaUpdate(&ingress.ObjectMeta, &oldIngress.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, apivalidation.ValidateLoadBalancerStatus(&ingress.Status.LoadBalancer, field.NewPath("status", "loadBalancer"))...) - return allErrs -} - -func validateIngressRules(ingressRules []extensions.IngressRule, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if len(ingressRules) == 0 { - return append(allErrs, field.Required(fldPath, "")) - } - for i, ih := range ingressRules { - if len(ih.Host) > 0 { - if isIP := (net.ParseIP(ih.Host) != nil); isIP { - allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("host"), ih.Host, "must be a DNS name, not an IP address")) - } - // TODO: Ports and ips are allowed in the host part of a url - // according to RFC 3986, consider allowing them. - if strings.Contains(ih.Host, "*") { - for _, msg := range validation.IsWildcardDNS1123Subdomain(ih.Host) { - allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("host"), ih.Host, msg)) - } - continue - } - for _, msg := range validation.IsDNS1123Subdomain(ih.Host) { - allErrs = append(allErrs, field.Invalid(fldPath.Index(i).Child("host"), ih.Host, msg)) - } - } - allErrs = append(allErrs, validateIngressRuleValue(&ih.IngressRuleValue, fldPath.Index(0))...) - } - return allErrs -} - -func validateIngressRuleValue(ingressRule *extensions.IngressRuleValue, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if ingressRule.HTTP != nil { - allErrs = append(allErrs, validateHTTPIngressRuleValue(ingressRule.HTTP, fldPath.Child("http"))...) - } - return allErrs -} - -func validateHTTPIngressRuleValue(httpIngressRuleValue *extensions.HTTPIngressRuleValue, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if len(httpIngressRuleValue.Paths) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("paths"), "")) - } - for i, rule := range httpIngressRuleValue.Paths { - if len(rule.Path) > 0 { - if !strings.HasPrefix(rule.Path, "/") { - allErrs = append(allErrs, field.Invalid(fldPath.Child("paths").Index(i).Child("path"), rule.Path, "must be an absolute path")) - } - // TODO: More draconian path regex validation. - // Path must be a valid regex. This is the basic requirement. - // In addition to this any characters not allowed in a path per - // RFC 3986 section-3.3 cannot appear as a literal in the regex. - // Consider the example: http://host/valid?#bar, everything after - // the last '/' is a valid regex that matches valid#bar, which - // isn't a valid path, because the path terminates at the first ? - // or #. A more sophisticated form of validation would detect that - // the user is confusing url regexes with path regexes. - _, err := regexp.CompilePOSIX(rule.Path) - if err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("paths").Index(i).Child("path"), rule.Path, "must be a valid regex")) - } - } - allErrs = append(allErrs, validateIngressBackend(&rule.Backend, fldPath.Child("backend"))...) - } - return allErrs -} - -// validateIngressBackend tests if a given backend is valid. -func validateIngressBackend(backend *extensions.IngressBackend, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - // All backends must reference a single local service by name, and a single service port by name or number. - if len(backend.ServiceName) == 0 { - return append(allErrs, field.Required(fldPath.Child("serviceName"), "")) - } else { - for _, msg := range apivalidation.ValidateServiceName(backend.ServiceName, false) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("serviceName"), backend.ServiceName, msg)) - } - } - allErrs = append(allErrs, apivalidation.ValidatePortNumOrName(backend.ServicePort, fldPath.Child("servicePort"))...) - return allErrs -} - -// ValidateReplicaSetName can be used to check whether the given ReplicaSet -// name is valid. -// Prefix indicates this name will be used as part of generation, in which case -// trailing dashes are allowed. -var ValidateReplicaSetName = apivalidation.NameIsDNSSubdomain - -// ValidateReplicaSet tests if required fields in the ReplicaSet are set. -func ValidateReplicaSet(rs *extensions.ReplicaSet) field.ErrorList { - allErrs := apivalidation.ValidateObjectMeta(&rs.ObjectMeta, true, ValidateReplicaSetName, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateReplicaSetSpec(&rs.Spec, field.NewPath("spec"))...) - return allErrs -} - -// ValidateReplicaSetUpdate tests if required fields in the ReplicaSet are set. -func ValidateReplicaSetUpdate(rs, oldRs *extensions.ReplicaSet) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&rs.ObjectMeta, &oldRs.ObjectMeta, field.NewPath("metadata"))...) - allErrs = append(allErrs, ValidateReplicaSetSpec(&rs.Spec, field.NewPath("spec"))...) - return allErrs -} - -// ValidateReplicaSetStatusUpdate tests if required fields in the ReplicaSet are set. -func ValidateReplicaSetStatusUpdate(rs, oldRs *extensions.ReplicaSet) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&rs.ObjectMeta, &oldRs.ObjectMeta, field.NewPath("metadata"))...) - allErrs = append(allErrs, ValidateReplicaSetStatus(rs.Status, field.NewPath("status"))...) - return allErrs -} - -func ValidateReplicaSetStatus(status extensions.ReplicaSetStatus, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.Replicas), fldPath.Child("replicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.FullyLabeledReplicas), fldPath.Child("fullyLabeledReplicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.ReadyReplicas), fldPath.Child("readyReplicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.AvailableReplicas), fldPath.Child("availableReplicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.ObservedGeneration), fldPath.Child("observedGeneration"))...) - msg := "cannot be greater than status.replicas" - if status.FullyLabeledReplicas > status.Replicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("fullyLabeledReplicas"), status.FullyLabeledReplicas, msg)) - } - if status.ReadyReplicas > status.Replicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("readyReplicas"), status.ReadyReplicas, msg)) - } - if status.AvailableReplicas > status.Replicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("availableReplicas"), status.AvailableReplicas, msg)) - } - if status.AvailableReplicas > status.ReadyReplicas { - allErrs = append(allErrs, field.Invalid(fldPath.Child("availableReplicas"), status.AvailableReplicas, "cannot be greater than readyReplicas")) - } - return allErrs -} - -// ValidateReplicaSetSpec tests if required fields in the ReplicaSet spec are set. -func ValidateReplicaSetSpec(spec *extensions.ReplicaSetSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.Replicas), fldPath.Child("replicas"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...) - - if spec.Selector == nil { - allErrs = append(allErrs, field.Required(fldPath.Child("selector"), "")) - } else { - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) - if len(spec.Selector.MatchLabels)+len(spec.Selector.MatchExpressions) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "empty selector is not valid for deployment.")) - } - } - - selector, err := metav1.LabelSelectorAsSelector(spec.Selector) - if err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("selector"), spec.Selector, "invalid label selector.")) - } else { - allErrs = append(allErrs, ValidatePodTemplateSpecForReplicaSet(&spec.Template, selector, spec.Replicas, fldPath.Child("template"))...) - } - return allErrs -} - -// Validates the given template and ensures that it is in accordance with the desired selector and replicas. -func ValidatePodTemplateSpecForReplicaSet(template *api.PodTemplateSpec, selector labels.Selector, replicas int32, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if template == nil { - allErrs = append(allErrs, field.Required(fldPath, "")) - } else { - if !selector.Empty() { - // Verify that the ReplicaSet selector matches the labels in template. - labels := labels.Set(template.Labels) - if !selector.Matches(labels) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("metadata", "labels"), template.Labels, "`selector` does not match template `labels`")) - } - } - allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpec(template, fldPath)...) - if replicas > 1 { - allErrs = append(allErrs, apivalidation.ValidateReadOnlyPersistentDisks(template.Spec.Volumes, fldPath.Child("spec", "volumes"))...) - } - // RestartPolicy has already been first-order validated as per ValidatePodTemplateSpec(). - if template.Spec.RestartPolicy != api.RestartPolicyAlways { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("spec", "restartPolicy"), template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)})) - } - if template.Spec.ActiveDeadlineSeconds != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Child("spec", "activeDeadlineSeconds"), template.Spec.ActiveDeadlineSeconds, "must not be specified")) - } - } - return allErrs -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/extensions/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/extensions/zz_generated.deepcopy.go index 199db30f..befc3a71 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/extensions/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/extensions/zz_generated.deepcopy.go @@ -188,23 +188,15 @@ func (in *DaemonSetSpec) DeepCopyInto(out *DaemonSetSpec) { *out = *in if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) in.UpdateStrategy.DeepCopyInto(&out.UpdateStrategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -224,12 +216,8 @@ func (in *DaemonSetStatus) DeepCopyInto(out *DaemonSetStatus) { *out = *in if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -256,12 +244,8 @@ func (in *DaemonSetUpdateStrategy) DeepCopyInto(out *DaemonSetUpdateStrategy) { *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateDaemonSet) - **out = **in - } + *out = new(RollingUpdateDaemonSet) + **out = **in } return } @@ -393,41 +377,25 @@ func (in *DeploymentSpec) DeepCopyInto(out *DeploymentSpec) { *out = *in if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) in.Strategy.DeepCopyInto(&out.Strategy) if in.RevisionHistoryLimit != nil { in, out := &in.RevisionHistoryLimit, &out.RevisionHistoryLimit - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } if in.RollbackTo != nil { in, out := &in.RollbackTo, &out.RollbackTo - if *in == nil { - *out = nil - } else { - *out = new(RollbackConfig) - **out = **in - } + *out = new(RollbackConfig) + **out = **in } if in.ProgressDeadlineSeconds != nil { in, out := &in.ProgressDeadlineSeconds, &out.ProgressDeadlineSeconds - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -454,12 +422,8 @@ func (in *DeploymentStatus) DeepCopyInto(out *DeploymentStatus) { } if in.CollisionCount != nil { in, out := &in.CollisionCount, &out.CollisionCount - if *in == nil { - *out = nil - } else { - *out = new(int32) - **out = **in - } + *out = new(int32) + **out = **in } return } @@ -479,12 +443,8 @@ func (in *DeploymentStrategy) DeepCopyInto(out *DeploymentStrategy) { *out = *in if in.RollingUpdate != nil { in, out := &in.RollingUpdate, &out.RollingUpdate - if *in == nil { - *out = nil - } else { - *out = new(RollingUpdateDeployment) - **out = **in - } + *out = new(RollingUpdateDeployment) + **out = **in } return } @@ -637,12 +597,8 @@ func (in *IngressRuleValue) DeepCopyInto(out *IngressRuleValue) { *out = *in if in.HTTP != nil { in, out := &in.HTTP, &out.HTTP - if *in == nil { - *out = nil - } else { - *out = new(HTTPIngressRuleValue) - (*in).DeepCopyInto(*out) - } + *out = new(HTTPIngressRuleValue) + (*in).DeepCopyInto(*out) } return } @@ -662,12 +618,8 @@ func (in *IngressSpec) DeepCopyInto(out *IngressSpec) { *out = *in if in.Backend != nil { in, out := &in.Backend, &out.Backend - if *in == nil { - *out = nil - } else { - *out = new(IngressBackend) - **out = **in - } + *out = new(IngressBackend) + **out = **in } if in.TLS != nil { in, out := &in.TLS, &out.TLS @@ -817,12 +769,8 @@ func (in *ReplicaSetSpec) DeepCopyInto(out *ReplicaSetSpec) { *out = *in if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } in.Template.DeepCopyInto(&out.Template) return diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD index 4dff82d1..6aff9d44 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/BUILD @@ -16,10 +16,10 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/networking", deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go index b92e0329..541b884b 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/types.go @@ -134,7 +134,7 @@ type NetworkPolicyEgressRule struct { // NetworkPolicyPort describes a port to allow traffic on type NetworkPolicyPort struct { - // The protocol (TCP or UDP) which traffic must match. If not specified, this + // The protocol (TCP, UDP, or SCTP) which traffic must match. If not specified, this // field defaults to TCP. // +optional Protocol *api.Protocol diff --git a/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go index 43b6f5a7..5a0959e9 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/networking/zz_generated.deepcopy.go @@ -173,30 +173,18 @@ func (in *NetworkPolicyPeer) DeepCopyInto(out *NetworkPolicyPeer) { *out = *in if in.PodSelector != nil { in, out := &in.PodSelector, &out.PodSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.NamespaceSelector != nil { in, out := &in.NamespaceSelector, &out.NamespaceSelector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.IPBlock != nil { in, out := &in.IPBlock, &out.IPBlock - if *in == nil { - *out = nil - } else { - *out = new(IPBlock) - (*in).DeepCopyInto(*out) - } + *out = new(IPBlock) + (*in).DeepCopyInto(*out) } return } @@ -216,21 +204,13 @@ func (in *NetworkPolicyPort) DeepCopyInto(out *NetworkPolicyPort) { *out = *in if in.Protocol != nil { in, out := &in.Protocol, &out.Protocol - if *in == nil { - *out = nil - } else { - *out = new(core.Protocol) - **out = **in - } + *out = new(core.Protocol) + **out = **in } if in.Port != nil { in, out := &in.Port, &out.Port - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD index 2b429bb0..e1ea426b 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/BUILD @@ -16,10 +16,10 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/policy", deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go index 298fcd0e..7b962865 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go @@ -63,6 +63,7 @@ type PodDisruptionBudgetStatus struct { // the list automatically by PodDisruptionBudget controller after some time. // If everything goes smooth this map should be empty for the most of the time. // Large number of entries in the map may indicate problems with pod deletions. + // +optional DisruptedPods map[string]metav1.Time // Number of pod disruptions that are currently allowed. @@ -227,6 +228,10 @@ type PodSecurityPolicySpec struct { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional ForbiddenSysctls []string + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // +optional + AllowedProcMountTypes []api.ProcMountType } // AllowedHostPath defines the host volume conditions that will be enabled by a policy diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD deleted file mode 100644 index 14fcee1d..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/kubernetes/pkg/apis/policy/validation", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/extensions/validation:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/features:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy/seccomp:go_default_library", - "//pkg/security/podsecuritypolicy/util:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go deleted file mode 100644 index aa898ad8..00000000 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/validation/validation.go +++ /dev/null @@ -1,443 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 validation - -import ( - "fmt" - "path/filepath" - "reflect" - "regexp" - "strings" - - unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/validation/field" - core "k8s.io/kubernetes/pkg/apis/core" - apivalidation "k8s.io/kubernetes/pkg/apis/core/validation" - extensionsvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" - "k8s.io/kubernetes/pkg/apis/policy" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/security/apparmor" - "k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp" - psputil "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util" - - utilfeature "k8s.io/apiserver/pkg/util/feature" -) - -func ValidatePodDisruptionBudget(pdb *policy.PodDisruptionBudget) field.ErrorList { - allErrs := ValidatePodDisruptionBudgetSpec(pdb.Spec, field.NewPath("spec")) - allErrs = append(allErrs, ValidatePodDisruptionBudgetStatus(pdb.Status, field.NewPath("status"))...) - return allErrs -} - -func ValidatePodDisruptionBudgetUpdate(pdb, oldPdb *policy.PodDisruptionBudget) field.ErrorList { - allErrs := field.ErrorList{} - - restoreGeneration := pdb.Generation - pdb.Generation = oldPdb.Generation - - if !reflect.DeepEqual(pdb.Spec, oldPdb.Spec) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "updates to poddisruptionbudget spec are forbidden.")) - } - allErrs = append(allErrs, ValidatePodDisruptionBudgetStatus(pdb.Status, field.NewPath("status"))...) - - pdb.Generation = restoreGeneration - return allErrs -} - -func ValidatePodDisruptionBudgetSpec(spec policy.PodDisruptionBudgetSpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - if spec.MinAvailable != nil && spec.MaxUnavailable != nil { - allErrs = append(allErrs, field.Invalid(fldPath, spec, "minAvailable and maxUnavailable cannot be both set")) - } - - if spec.MinAvailable != nil { - allErrs = append(allErrs, extensionsvalidation.ValidatePositiveIntOrPercent(*spec.MinAvailable, fldPath.Child("minAvailable"))...) - allErrs = append(allErrs, extensionsvalidation.IsNotMoreThan100Percent(*spec.MinAvailable, fldPath.Child("minAvailable"))...) - } - - if spec.MaxUnavailable != nil { - allErrs = append(allErrs, extensionsvalidation.ValidatePositiveIntOrPercent(*spec.MaxUnavailable, fldPath.Child("maxUnavailable"))...) - allErrs = append(allErrs, extensionsvalidation.IsNotMoreThan100Percent(*spec.MaxUnavailable, fldPath.Child("maxUnavailable"))...) - } - - allErrs = append(allErrs, unversionedvalidation.ValidateLabelSelector(spec.Selector, fldPath.Child("selector"))...) - - return allErrs -} - -func ValidatePodDisruptionBudgetStatus(status policy.PodDisruptionBudgetStatus, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.PodDisruptionsAllowed), fldPath.Child("podDisruptionsAllowed"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.CurrentHealthy), fldPath.Child("currentHealthy"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.DesiredHealthy), fldPath.Child("desiredHealthy"))...) - allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.ExpectedPods), fldPath.Child("expectedPods"))...) - return allErrs -} - -// ValidatePodSecurityPolicyName can be used to check whether the given -// pod security policy name is valid. -// Prefix indicates this name will be used as part of generation, in which case -// trailing dashes are allowed. -var ValidatePodSecurityPolicyName = apivalidation.NameIsDNSSubdomain - -func ValidatePodSecurityPolicy(psp *policy.PodSecurityPolicy) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&psp.ObjectMeta, false, ValidatePodSecurityPolicyName, field.NewPath("metadata"))...) - allErrs = append(allErrs, ValidatePodSecurityPolicySpecificAnnotations(psp.Annotations, field.NewPath("metadata").Child("annotations"))...) - allErrs = append(allErrs, ValidatePodSecurityPolicySpec(&psp.Spec, field.NewPath("spec"))...) - return allErrs -} - -func ValidatePodSecurityPolicySpec(spec *policy.PodSecurityPolicySpec, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - allErrs = append(allErrs, validatePSPRunAsUser(fldPath.Child("runAsUser"), &spec.RunAsUser)...) - allErrs = append(allErrs, validatePSPSELinux(fldPath.Child("seLinux"), &spec.SELinux)...) - allErrs = append(allErrs, validatePSPSupplementalGroup(fldPath.Child("supplementalGroups"), &spec.SupplementalGroups)...) - allErrs = append(allErrs, validatePSPFSGroup(fldPath.Child("fsGroup"), &spec.FSGroup)...) - allErrs = append(allErrs, validatePodSecurityPolicyVolumes(fldPath, spec.Volumes)...) - if len(spec.RequiredDropCapabilities) > 0 && hasCap(policy.AllowAllCapabilities, spec.AllowedCapabilities) { - allErrs = append(allErrs, field.Invalid(field.NewPath("requiredDropCapabilities"), spec.RequiredDropCapabilities, - "must be empty when all capabilities are allowed by a wildcard")) - } - allErrs = append(allErrs, validatePSPCapsAgainstDrops(spec.RequiredDropCapabilities, spec.DefaultAddCapabilities, field.NewPath("defaultAddCapabilities"))...) - allErrs = append(allErrs, validatePSPCapsAgainstDrops(spec.RequiredDropCapabilities, spec.AllowedCapabilities, field.NewPath("allowedCapabilities"))...) - allErrs = append(allErrs, validatePSPDefaultAllowPrivilegeEscalation(fldPath.Child("defaultAllowPrivilegeEscalation"), spec.DefaultAllowPrivilegeEscalation, spec.AllowPrivilegeEscalation)...) - allErrs = append(allErrs, validatePSPAllowedHostPaths(fldPath.Child("allowedHostPaths"), spec.AllowedHostPaths)...) - allErrs = append(allErrs, validatePSPAllowedFlexVolumes(fldPath.Child("allowedFlexVolumes"), spec.AllowedFlexVolumes)...) - allErrs = append(allErrs, validatePodSecurityPolicySysctls(fldPath.Child("allowedUnsafeSysctls"), spec.AllowedUnsafeSysctls)...) - allErrs = append(allErrs, validatePodSecurityPolicySysctls(fldPath.Child("forbiddenSysctls"), spec.ForbiddenSysctls)...) - allErrs = append(allErrs, validatePodSecurityPolicySysctlListsDoNotOverlap(fldPath.Child("allowedUnsafeSysctls"), fldPath.Child("forbiddenSysctls"), spec.AllowedUnsafeSysctls, spec.ForbiddenSysctls)...) - - return allErrs -} - -func ValidatePodSecurityPolicySpecificAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - - if p := annotations[apparmor.DefaultProfileAnnotationKey]; p != "" { - if err := apparmor.ValidateProfileFormat(p); err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Key(apparmor.DefaultProfileAnnotationKey), p, err.Error())) - } - } - if allowed := annotations[apparmor.AllowedProfilesAnnotationKey]; allowed != "" { - for _, p := range strings.Split(allowed, ",") { - if err := apparmor.ValidateProfileFormat(p); err != nil { - allErrs = append(allErrs, field.Invalid(fldPath.Key(apparmor.AllowedProfilesAnnotationKey), allowed, err.Error())) - } - } - } - - if p := annotations[seccomp.DefaultProfileAnnotationKey]; p != "" { - allErrs = append(allErrs, apivalidation.ValidateSeccompProfile(p, fldPath.Key(seccomp.DefaultProfileAnnotationKey))...) - } - if allowed := annotations[seccomp.AllowedProfilesAnnotationKey]; allowed != "" { - for _, p := range strings.Split(allowed, ",") { - if p == seccomp.AllowAny { - continue - } - allErrs = append(allErrs, apivalidation.ValidateSeccompProfile(p, fldPath.Key(seccomp.AllowedProfilesAnnotationKey))...) - } - } - return allErrs -} - -// validatePSPAllowedHostPaths makes sure all allowed host paths follow: -// 1. path prefix is required -// 2. path prefix does not have any element which is ".." -func validatePSPAllowedHostPaths(fldPath *field.Path, allowedHostPaths []policy.AllowedHostPath) field.ErrorList { - allErrs := field.ErrorList{} - - for i, target := range allowedHostPaths { - if target.PathPrefix == "" { - allErrs = append(allErrs, field.Required(fldPath.Index(i), "is required")) - break - } - parts := strings.Split(filepath.ToSlash(target.PathPrefix), "/") - for _, item := range parts { - if item == ".." { - allErrs = append(allErrs, field.Invalid(fldPath.Index(i), target.PathPrefix, "must not contain '..'")) - break // even for `../../..`, one error is sufficient to make the point - } - } - } - - return allErrs -} - -func validatePSPAllowedFlexVolumes(fldPath *field.Path, flexVolumes []policy.AllowedFlexVolume) field.ErrorList { - allErrs := field.ErrorList{} - if len(flexVolumes) > 0 { - for idx, fv := range flexVolumes { - if len(fv.Driver) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("allowedFlexVolumes").Index(idx).Child("driver"), - "must specify a driver")) - } - } - } - return allErrs -} - -// validatePSPSELinux validates the SELinux fields of PodSecurityPolicy. -func validatePSPSELinux(fldPath *field.Path, seLinux *policy.SELinuxStrategyOptions) field.ErrorList { - allErrs := field.ErrorList{} - - // ensure the selinux strategy has a valid rule - supportedSELinuxRules := sets.NewString( - string(policy.SELinuxStrategyMustRunAs), - string(policy.SELinuxStrategyRunAsAny), - ) - if !supportedSELinuxRules.Has(string(seLinux.Rule)) { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("rule"), seLinux.Rule, supportedSELinuxRules.List())) - } - - return allErrs -} - -// validatePSPRunAsUser validates the RunAsUser fields of PodSecurityPolicy. -func validatePSPRunAsUser(fldPath *field.Path, runAsUser *policy.RunAsUserStrategyOptions) field.ErrorList { - allErrs := field.ErrorList{} - - // ensure the user strategy has a valid rule - supportedRunAsUserRules := sets.NewString( - string(policy.RunAsUserStrategyMustRunAs), - string(policy.RunAsUserStrategyMustRunAsNonRoot), - string(policy.RunAsUserStrategyRunAsAny), - ) - if !supportedRunAsUserRules.Has(string(runAsUser.Rule)) { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("rule"), runAsUser.Rule, supportedRunAsUserRules.List())) - } - - // validate range settings - for idx, rng := range runAsUser.Ranges { - allErrs = append(allErrs, validateUserIDRange(fldPath.Child("ranges").Index(idx), rng)...) - } - - return allErrs -} - -// validatePSPFSGroup validates the FSGroupStrategyOptions fields of the PodSecurityPolicy. -func validatePSPFSGroup(fldPath *field.Path, groupOptions *policy.FSGroupStrategyOptions) field.ErrorList { - allErrs := field.ErrorList{} - - supportedRules := sets.NewString( - string(policy.FSGroupStrategyMustRunAs), - string(policy.FSGroupStrategyRunAsAny), - ) - if !supportedRules.Has(string(groupOptions.Rule)) { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("rule"), groupOptions.Rule, supportedRules.List())) - } - - for idx, rng := range groupOptions.Ranges { - allErrs = append(allErrs, validateGroupIDRange(fldPath.Child("ranges").Index(idx), rng)...) - } - return allErrs -} - -// validatePSPSupplementalGroup validates the SupplementalGroupsStrategyOptions fields of the PodSecurityPolicy. -func validatePSPSupplementalGroup(fldPath *field.Path, groupOptions *policy.SupplementalGroupsStrategyOptions) field.ErrorList { - allErrs := field.ErrorList{} - - supportedRules := sets.NewString( - string(policy.SupplementalGroupsStrategyRunAsAny), - string(policy.SupplementalGroupsStrategyMustRunAs), - ) - if !supportedRules.Has(string(groupOptions.Rule)) { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("rule"), groupOptions.Rule, supportedRules.List())) - } - - for idx, rng := range groupOptions.Ranges { - allErrs = append(allErrs, validateGroupIDRange(fldPath.Child("ranges").Index(idx), rng)...) - } - return allErrs -} - -// validatePodSecurityPolicyVolumes validates the volume fields of PodSecurityPolicy. -func validatePodSecurityPolicyVolumes(fldPath *field.Path, volumes []policy.FSType) field.ErrorList { - allErrs := field.ErrorList{} - allowed := psputil.GetAllFSTypesAsSet() - // add in the * value since that is a pseudo type that is not included by default - allowed.Insert(string(policy.All)) - for _, v := range volumes { - if !allowed.Has(string(v)) { - allErrs = append(allErrs, field.NotSupported(fldPath.Child("volumes"), v, allowed.List())) - } - } - return allErrs -} - -// validatePSPDefaultAllowPrivilegeEscalation validates the DefaultAllowPrivilegeEscalation field against the AllowPrivilegeEscalation field of a PodSecurityPolicy. -func validatePSPDefaultAllowPrivilegeEscalation(fldPath *field.Path, defaultAllowPrivilegeEscalation *bool, allowPrivilegeEscalation bool) field.ErrorList { - allErrs := field.ErrorList{} - if defaultAllowPrivilegeEscalation != nil && *defaultAllowPrivilegeEscalation && !allowPrivilegeEscalation { - allErrs = append(allErrs, field.Invalid(fldPath, defaultAllowPrivilegeEscalation, "Cannot set DefaultAllowPrivilegeEscalation to true without also setting AllowPrivilegeEscalation to true")) - } - - return allErrs -} - -const sysctlPatternSegmentFmt string = "([a-z0-9][-_a-z0-9]*)?[a-z0-9*]" -const SysctlPatternFmt string = "(" + apivalidation.SysctlSegmentFmt + "\\.)*" + sysctlPatternSegmentFmt - -var sysctlPatternRegexp = regexp.MustCompile("^" + SysctlPatternFmt + "$") - -func IsValidSysctlPattern(name string) bool { - if len(name) > apivalidation.SysctlMaxLength { - return false - } - return sysctlPatternRegexp.MatchString(name) -} - -func validatePodSecurityPolicySysctlListsDoNotOverlap(allowedSysctlsFldPath, forbiddenSysctlsFldPath *field.Path, allowedUnsafeSysctls, forbiddenSysctls []string) field.ErrorList { - allErrs := field.ErrorList{} - for i, allowedSysctl := range allowedUnsafeSysctls { - isAllowedSysctlPattern := false - allowedSysctlPrefix := "" - if strings.HasSuffix(allowedSysctl, "*") { - isAllowedSysctlPattern = true - allowedSysctlPrefix = strings.TrimSuffix(allowedSysctl, "*") - } - for j, forbiddenSysctl := range forbiddenSysctls { - isForbiddenSysctlPattern := false - forbiddenSysctlPrefix := "" - if strings.HasSuffix(forbiddenSysctl, "*") { - isForbiddenSysctlPattern = true - forbiddenSysctlPrefix = strings.TrimSuffix(forbiddenSysctl, "*") - } - switch { - case isAllowedSysctlPattern && isForbiddenSysctlPattern: - if strings.HasPrefix(allowedSysctlPrefix, forbiddenSysctlPrefix) { - allErrs = append(allErrs, field.Invalid(allowedSysctlsFldPath.Index(i), allowedUnsafeSysctls[i], fmt.Sprintf("sysctl overlaps with %v", forbiddenSysctl))) - } else if strings.HasPrefix(forbiddenSysctlPrefix, allowedSysctlPrefix) { - allErrs = append(allErrs, field.Invalid(forbiddenSysctlsFldPath.Index(j), forbiddenSysctls[j], fmt.Sprintf("sysctl overlaps with %v", allowedSysctl))) - } - case isAllowedSysctlPattern: - if strings.HasPrefix(forbiddenSysctl, allowedSysctlPrefix) { - allErrs = append(allErrs, field.Invalid(forbiddenSysctlsFldPath.Index(j), forbiddenSysctls[j], fmt.Sprintf("sysctl overlaps with %v", allowedSysctl))) - } - case isForbiddenSysctlPattern: - if strings.HasPrefix(allowedSysctl, forbiddenSysctlPrefix) { - allErrs = append(allErrs, field.Invalid(allowedSysctlsFldPath.Index(i), allowedUnsafeSysctls[i], fmt.Sprintf("sysctl overlaps with %v", forbiddenSysctl))) - } - default: - if allowedSysctl == forbiddenSysctl { - allErrs = append(allErrs, field.Invalid(allowedSysctlsFldPath.Index(i), allowedUnsafeSysctls[i], fmt.Sprintf("sysctl overlaps with %v", forbiddenSysctl))) - } - } - } - } - return allErrs -} - -// validatePodSecurityPolicySysctls validates the sysctls fields of PodSecurityPolicy. -func validatePodSecurityPolicySysctls(fldPath *field.Path, sysctls []string) field.ErrorList { - allErrs := field.ErrorList{} - - if len(sysctls) == 0 { - return allErrs - } - - if !utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) { - return append(allErrs, field.Forbidden(fldPath, "Sysctls are disabled by Sysctls feature-gate")) - } - - coversAll := false - for i, s := range sysctls { - if len(s) == 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Index(i), sysctls[i], fmt.Sprintf("empty sysctl not allowed"))) - } else if !IsValidSysctlPattern(string(s)) { - allErrs = append( - allErrs, - field.Invalid(fldPath.Index(i), sysctls[i], fmt.Sprintf("must have at most %d characters and match regex %s", - apivalidation.SysctlMaxLength, - SysctlPatternFmt, - )), - ) - } else if s[0] == '*' { - coversAll = true - } - } - - if coversAll && len(sysctls) > 1 { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("items"), fmt.Sprintf("if '*' is present, must not specify other sysctls"))) - } - - return allErrs -} - -func validateUserIDRange(fldPath *field.Path, rng policy.IDRange) field.ErrorList { - return validateIDRanges(fldPath, rng.Min, rng.Max) -} - -func validateGroupIDRange(fldPath *field.Path, rng policy.IDRange) field.ErrorList { - return validateIDRanges(fldPath, rng.Min, rng.Max) -} - -// validateIDRanges ensures the range is valid. -func validateIDRanges(fldPath *field.Path, min, max int64) field.ErrorList { - allErrs := field.ErrorList{} - - // if 0 <= Min <= Max then we do not need to validate max. It is always greater than or - // equal to 0 and Min. - if min < 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("min"), min, "min cannot be negative")) - } - if max < 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("max"), max, "max cannot be negative")) - } - if min > max { - allErrs = append(allErrs, field.Invalid(fldPath.Child("min"), min, "min cannot be greater than max")) - } - - return allErrs -} - -// validatePSPCapsAgainstDrops ensures an allowed cap is not listed in the required drops. -func validatePSPCapsAgainstDrops(requiredDrops []core.Capability, capsToCheck []core.Capability, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} - if requiredDrops == nil { - return allErrs - } - for _, cap := range capsToCheck { - if hasCap(cap, requiredDrops) { - allErrs = append(allErrs, field.Invalid(fldPath, cap, - fmt.Sprintf("capability is listed in %s and requiredDropCapabilities", fldPath.String()))) - } - } - return allErrs -} - -// ValidatePodSecurityPolicyUpdate validates a PSP for updates. -func ValidatePodSecurityPolicyUpdate(old *policy.PodSecurityPolicy, new *policy.PodSecurityPolicy) field.ErrorList { - allErrs := field.ErrorList{} - allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&new.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata"))...) - allErrs = append(allErrs, ValidatePodSecurityPolicySpecificAnnotations(new.Annotations, field.NewPath("metadata").Child("annotations"))...) - allErrs = append(allErrs, ValidatePodSecurityPolicySpec(&new.Spec, field.NewPath("spec"))...) - return allErrs -} - -// hasCap checks for needle in haystack. -func hasCap(needle core.Capability, haystack []core.Capability) bool { - for _, c := range haystack { - if needle == c { - return true - } - } - return false -} diff --git a/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go index 3bb51ae4..b0cfe752 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/policy/zz_generated.deepcopy.go @@ -66,12 +66,8 @@ func (in *Eviction) DeepCopyInto(out *Eviction) { in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) if in.DeleteOptions != nil { in, out := &in.DeleteOptions, &out.DeleteOptions - if *in == nil { - *out = nil - } else { - *out = new(v1.DeleteOptions) - (*in).DeepCopyInto(*out) - } + *out = new(v1.DeleteOptions) + (*in).DeepCopyInto(*out) } return } @@ -213,30 +209,18 @@ func (in *PodDisruptionBudgetSpec) DeepCopyInto(out *PodDisruptionBudgetSpec) { *out = *in if in.MinAvailable != nil { in, out := &in.MinAvailable, &out.MinAvailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } if in.Selector != nil { in, out := &in.Selector, &out.Selector - if *in == nil { - *out = nil - } else { - *out = new(v1.LabelSelector) - (*in).DeepCopyInto(*out) - } + *out = new(v1.LabelSelector) + (*in).DeepCopyInto(*out) } if in.MaxUnavailable != nil { in, out := &in.MaxUnavailable, &out.MaxUnavailable - if *in == nil { - *out = nil - } else { - *out = new(intstr.IntOrString) - **out = **in - } + *out = new(intstr.IntOrString) + **out = **in } return } @@ -368,12 +352,8 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { in.FSGroup.DeepCopyInto(&out.FSGroup) if in.DefaultAllowPrivilegeEscalation != nil { in, out := &in.DefaultAllowPrivilegeEscalation, &out.DefaultAllowPrivilegeEscalation - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } + *out = new(bool) + **out = **in } if in.AllowedHostPaths != nil { in, out := &in.AllowedHostPaths, &out.AllowedHostPaths @@ -395,6 +375,11 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowedProcMountTypes != nil { + in, out := &in.AllowedProcMountTypes, &out.AllowedProcMountTypes + *out = make([]core.ProcMountType, len(*in)) + copy(*out, *in) + } return } @@ -434,12 +419,8 @@ func (in *SELinuxStrategyOptions) DeepCopyInto(out *SELinuxStrategyOptions) { *out = *in if in.SELinuxOptions != nil { in, out := &in.SELinuxOptions, &out.SELinuxOptions - if *in == nil { - *out = nil - } else { - *out = new(core.SELinuxOptions) - **out = **in - } + *out = new(core.SELinuxOptions) + **out = **in } return } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD index 61a76279..3d6e6cba 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/apis/scheduling/BUILD @@ -17,9 +17,9 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/apis/scheduling", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -47,5 +47,5 @@ go_test( name = "go_default_test", srcs = ["helpers_test.go"], embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/BUILD b/vendor/k8s.io/kubernetes/pkg/cloudprovider/BUILD index 7c38feae..ed3344f6 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/BUILD @@ -15,10 +15,10 @@ go_library( importpath = "k8s.io/kubernetes/pkg/cloudprovider", deps = [ "//pkg/controller:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/client-go/informers:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/OWNERS b/vendor/k8s.io/kubernetes/pkg/cloudprovider/OWNERS index 07cf4dbd..314eb3d9 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/OWNERS @@ -2,6 +2,7 @@ approvers: - mikedanese - dims - wlan0 +- andrewsykim reviewers: - thockin - lavalamp @@ -42,3 +43,5 @@ reviewers: - wlan0 - cheftako - andrewsykim +labels: +- sig/cloud-provider diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/README.md b/vendor/k8s.io/kubernetes/pkg/cloudprovider/README.md index b59eba40..c647238b 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/README.md +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/README.md @@ -1,16 +1,18 @@ -##### Deprecation Notice: This directory has entered maintenance mode and will not be accepting new providers. Cloud Providers in this directory will continue to be actively developed or maintained and supported at their current level of support as a longer-term solution evolves. - -## Overview: +##### Deprecation Notice: cloud providers in this directory are deprecated and will be removed in favor of external (a.k.a out-of-tree) providers. Existing providers in this directory (a.k.a in-tree providers) should only make small incremental changes as needed and avoid large refactors or new features. New providers seeking to support Kubernetes should follow the out-of-tree model as specified in the [Running Kubernetes Cloud Controller Manager docs](https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/). For more information on the future of Kubernetes cloud providers see [KEP-0002](https://github.com/kubernetes/community/blob/master/keps/sig-cloud-provider/0002-cloud-controller-manager.md) and [KEP-0013](https://github.com/kubernetes/community/blob/master/keps/sig-cloud-provider/0013-build-deploy-ccm.md). + +Cloud Providers in this directory will continue to be actively developed or maintained and supported at their current level of support as a longer-term solution evolves. + +## Overview: The mechanism for supporting cloud providers is currently in transition: the original method of implementing cloud provider-specific functionality within the main kubernetes tree (here) is no longer advised; however, the proposed solution is still in development. - -#### Guidance for potential cloud providers: -* Support for cloud providers is currently in a state of flux. Background information on motivation and the proposal for improving is in the github [proposal](https://git.k8s.io/community/contributors/design-proposals/cloud-provider/cloud-provider-refactoring.md). -* In support of this plan, a new cloud-controller-manager binary was added in 1.6. This was the first of several steps (see the proposal for more information). -* Attempts to contribute new cloud providers or (to a lesser extent) persistent volumes to the core repo will likely meet with some pushback from reviewers/approvers. -* It is understood that this is an unfortunate situation in which 'the old way is no longer supported but the new way is not ready yet', but the initial path is unsustainable, and contributors are encouraged to participate in the implementation of the proposed long-term solution, as there is risk that PRs for new cloud providers here will not be approved. -* Though the fully productized support envisioned in the proposal is still 2 - 3 releases out, the foundational work is underway, and a motivated cloud provider could accomplish the work in a forward-looking way. Contributors are encouraged to assist with the implementation of the design outlined in the proposal. - -#### Some additional context on status / direction: + +#### Guidance for potential cloud providers: +* Support for cloud providers is currently in a state of flux. Background information on motivation and the proposal for improving is in the github [proposal](https://git.k8s.io/community/contributors/design-proposals/cloud-provider/cloud-provider-refactoring.md). +* In support of this plan, a new cloud-controller-manager binary was added in 1.6. This was the first of several steps (see the proposal for more information). +* Attempts to contribute new cloud providers or (to a lesser extent) persistent volumes to the core repo will likely meet with some pushback from reviewers/approvers. +* It is understood that this is an unfortunate situation in which 'the old way is no longer supported but the new way is not ready yet', but the initial path is unsustainable, and contributors are encouraged to participate in the implementation of the proposed long-term solution, as there is risk that PRs for new cloud providers here will not be approved. +* Though the fully productized support envisioned in the proposal is still 2 - 3 releases out, the foundational work is underway, and a motivated cloud provider could accomplish the work in a forward-looking way. Contributors are encouraged to assist with the implementation of the design outlined in the proposal. + +#### Some additional context on status / direction: * 1.6 added a new cloud-controller-manager binary that may be used for testing the new out-of-core cloudprovider flow. * Setting cloud-provider=external allows for creation of a separate controller-manager binary -* 1.7 adds [extensible admission control](https://git.k8s.io/community/contributors/design-proposals/api-machinery/admission_control_extension.md), further enabling topology customization. +* 1.7 adds [extensible admission control](https://git.k8s.io/community/contributors/design-proposals/api-machinery/admission_control_extension.md), further enabling topology customization. diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/cloud.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/cloud.go index 0358890b..f0fd8864 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/cloud.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/cloud.go @@ -62,9 +62,12 @@ type Clusters interface { Master(ctx context.Context, clusterName string) (string, error) } -// TODO(#6812): Use a shorter name that's less likely to be longer than cloud -// providers' name length limits. -func GetLoadBalancerName(service *v1.Service) string { +// (DEPRECATED) DefaultLoadBalancerName is the default load balancer name that is called from +// LoadBalancer.GetLoadBalancerName. Use this method to maintain backward compatible names for +// LoadBalancers that were created prior to Kubernetes v1.12. In the future, each provider should +// replace this method call in GetLoadBalancerName with a provider-specific implementation that +// is less cryptic than the Service's UUID. +func DefaultLoadBalancerName(service *v1.Service) string { //GCE requires that the name of a load balancer starts with a lower case letter. ret := "a" + string(service.UID) ret = strings.Replace(ret, "-", "", -1) @@ -96,6 +99,9 @@ type LoadBalancer interface { // Implementations must treat the *v1.Service parameter as read-only and not modify it. // Parameter 'clusterName' is the name of the cluster as presented to kube-controller-manager GetLoadBalancer(ctx context.Context, clusterName string, service *v1.Service) (status *v1.LoadBalancerStatus, exists bool, err error) + // GetLoadBalancerName returns the name of the load balancer. Implementations must treat the + // *v1.Service parameter as read-only and not modify it. + GetLoadBalancerName(ctx context.Context, clusterName string, service *v1.Service) string // EnsureLoadBalancer creates a new load balancer 'name', or updates the existing one. Returns the status of the balancer // Implementations must treat the *v1.Service and *v1.Node // parameters as read-only and not modify them. @@ -131,7 +137,8 @@ type Instances interface { // services cannot be used in this method to obtain nodeaddresses NodeAddressesByProviderID(ctx context.Context, providerID string) ([]v1.NodeAddress, error) // InstanceID returns the cloud provider ID of the node with the specified NodeName. - // Note that if the instance does not exist or is no longer running, we must return ("", cloudprovider.InstanceNotFound) + // Note that if the instance does not exist, we must return ("", cloudprovider.InstanceNotFound) + // cloudprovider.InstanceNotFound should NOT be returned for instances that exist but are stopped/sleeping InstanceID(ctx context.Context, nodeName types.NodeName) (string, error) // InstanceType returns the type of the specified instance. InstanceType(ctx context.Context, name types.NodeName) (string, error) @@ -143,8 +150,9 @@ type Instances interface { // CurrentNodeName returns the name of the node we are currently running on // On most clouds (e.g. GCE) this is the hostname, so we provide the hostname CurrentNodeName(ctx context.Context, hostname string) (types.NodeName, error) - // InstanceExistsByProviderID returns true if the instance for the given provider id still is running. + // InstanceExistsByProviderID returns true if the instance for the given provider exists. // If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. + // This method should still return true for instances that exist but are stopped/sleeping. InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) // InstanceShutdownByProviderID returns true if the instance is shutdown in cloudprovider InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) @@ -198,13 +206,13 @@ type Zones interface { // can no longer be called from the kubelets. GetZone(ctx context.Context) (Zone, error) - // GetZoneByProviderID returns the Zone containing the current zone and locality region of the node specified by providerId - // This method is particularly used in the context of external cloud providers where node initialization must be down + // GetZoneByProviderID returns the Zone containing the current zone and locality region of the node specified by providerID + // This method is particularly used in the context of external cloud providers where node initialization must be done // outside the kubelets. GetZoneByProviderID(ctx context.Context, providerID string) (Zone, error) // GetZoneByNodeName returns the Zone containing the current zone and locality region of the node specified by node name - // This method is particularly used in the context of external cloud providers where node initialization must be down + // This method is particularly used in the context of external cloud providers where node initialization must be done // outside the kubelets. GetZoneByNodeName(ctx context.Context, nodeName types.NodeName) (Zone, error) } diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/plugins.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/plugins.go index 7777997f..e9aa90c7 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/plugins.go @@ -42,6 +42,8 @@ var ( }{ {"openstack", true, "https://github.com/kubernetes/cloud-provider-openstack"}, {"photon", false, "The Photon Controller project is no longer maintained."}, + {"cloudstack", false, "The CloudStack Controller project is no longer maintained."}, + {"ovirt", false, "The ovirt Controller project is no longer maintained."}, } ) diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth/azure_auth.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth/azure_auth.go index a2760fbc..08f894d7 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth/azure_auth.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth/azure_auth.go @@ -44,28 +44,39 @@ type AzureAuthConfig struct { AADClientCertPassword string `json:"aadClientCertPassword" yaml:"aadClientCertPassword"` // Use managed service identity for the virtual machine to access Azure ARM APIs UseManagedIdentityExtension bool `json:"useManagedIdentityExtension" yaml:"useManagedIdentityExtension"` + // UserAssignedIdentityID contains the Client ID of the user assigned MSI which is assigned to the underlying VMs. If empty the user assigned identity is not used. + // More details of the user assigned identity can be found at: https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/overview + // For the user assigned identity specified here to be used, the UseManagedIdentityExtension has to be set to true. + UserAssignedIdentityID string `json:"userAssignedIdentityID" yaml:"userAssignedIdentityID"` // The ID of the Azure Subscription that the cluster is deployed in SubscriptionID string `json:"subscriptionId" yaml:"subscriptionId"` } // GetServicePrincipalToken creates a new service principal token based on the configuration func GetServicePrincipalToken(config *AzureAuthConfig, env *azure.Environment) (*adal.ServicePrincipalToken, error) { - oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) - if err != nil { - return nil, fmt.Errorf("creating the OAuth config: %v", err) - } - if config.UseManagedIdentityExtension { glog.V(2).Infoln("azure: using managed identity extension to retrieve access token") msiEndpoint, err := adal.GetMSIVMEndpoint() if err != nil { return nil, fmt.Errorf("Getting the managed service identity endpoint: %v", err) } + if len(config.UserAssignedIdentityID) > 0 { + glog.V(4).Info("azure: using User Assigned MSI ID to retrieve access token") + return adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, + env.ServiceManagementEndpoint, + config.UserAssignedIdentityID) + } + glog.V(4).Info("azure: using System Assigned MSI to retrieve access token") return adal.NewServicePrincipalTokenFromMSI( msiEndpoint, env.ServiceManagementEndpoint) } + oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID) + if err != nil { + return nil, fmt.Errorf("creating the OAuth config: %v", err) + } + if len(config.AADClientSecret) > 0 { glog.V(2).Infoln("azure: using client_id+client_secret to retrieve access token") return adal.NewServicePrincipalToken( diff --git a/vendor/k8s.io/kubernetes/pkg/controller/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/BUILD index d2d5ed45..e5c8dc76 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/controller/BUILD @@ -18,24 +18,24 @@ go_test( "//pkg/apis/core/install:go_default_library", "//pkg/controller/testutil:go_default_library", "//pkg/securitycontext:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/util/testing:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", ], ) @@ -59,35 +59,37 @@ go_library( "//pkg/serviceaccount:go_default_library", "//pkg/util/hash:go_default_library", "//pkg/util/taints:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/authentication/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/watch:go_default_library", + "//staging/src/k8s.io/client-go/util/integer:go_default_library", + "//staging/src/k8s.io/client-go/util/retry:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/integer:go_default_library", - "//vendor/k8s.io/client-go/util/retry:go_default_library", ], ) @@ -102,6 +104,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/controller/apis/config:all-srcs", "//pkg/controller/bootstrap:all-srcs", "//pkg/controller/certificates:all-srcs", "//pkg/controller/cloud:all-srcs", @@ -128,6 +131,7 @@ filegroup( "//pkg/controller/statefulset:all-srcs", "//pkg/controller/testutil:all-srcs", "//pkg/controller/ttl:all-srcs", + "//pkg/controller/ttlafterfinished:all-srcs", "//pkg/controller/util/node:all-srcs", "//pkg/controller/volume/attachdetach:all-srcs", "//pkg/controller/volume/events:all-srcs", diff --git a/vendor/k8s.io/kubernetes/pkg/controller/client_builder.go b/vendor/k8s.io/kubernetes/pkg/controller/client_builder.go index 04171762..bcf2182d 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/client_builder.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/client_builder.go @@ -33,6 +33,7 @@ import ( v1core "k8s.io/client-go/kubernetes/typed/core/v1" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" + watchtools "k8s.io/client-go/tools/watch" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/serviceaccount" @@ -46,8 +47,6 @@ type ControllerClientBuilder interface { ConfigOrDie(name string) *restclient.Config Client(name string) (clientset.Interface, error) ClientOrDie(name string) clientset.Interface - ClientGoClient(name string) (clientset.Interface, error) - ClientGoClientOrDie(name string) clientset.Interface } // SimpleControllerClientBuilder returns a fixed client with different user agents @@ -85,22 +84,6 @@ func (b SimpleControllerClientBuilder) ClientOrDie(name string) clientset.Interf return client } -func (b SimpleControllerClientBuilder) ClientGoClient(name string) (clientset.Interface, error) { - clientConfig, err := b.Config(name) - if err != nil { - return nil, err - } - return clientset.NewForConfig(clientConfig) -} - -func (b SimpleControllerClientBuilder) ClientGoClientOrDie(name string) clientset.Interface { - client, err := b.ClientGoClient(name) - if err != nil { - glog.Fatal(err) - } - return client -} - // SAControllerClientBuilder is a ControllerClientBuilder that returns clients identifying as // service accounts type SAControllerClientBuilder struct { @@ -140,7 +123,7 @@ func (b SAControllerClientBuilder) Config(name string) (*restclient.Config, erro return b.CoreClient.Secrets(b.Namespace).Watch(options) }, } - _, err = cache.ListWatchUntil(30*time.Second, lw, + _, err = watchtools.ListWatchUntil(30*time.Second, lw, func(event watch.Event) (bool, error) { switch event.Type { case watch.Deleted: @@ -274,19 +257,3 @@ func (b SAControllerClientBuilder) ClientOrDie(name string) clientset.Interface } return client } - -func (b SAControllerClientBuilder) ClientGoClient(name string) (clientset.Interface, error) { - clientConfig, err := b.Config(name) - if err != nil { - return nil, err - } - return clientset.NewForConfig(clientConfig) -} - -func (b SAControllerClientBuilder) ClientGoClientOrDie(name string) clientset.Interface { - client, err := b.ClientGoClient(name) - if err != nil { - glog.Fatal(err) - } - return client -} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go b/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go index fb00a756..394407b2 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go @@ -27,12 +27,14 @@ import ( apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/clock" + "k8s.io/apimachinery/pkg/util/rand" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/strategicpatch" @@ -594,7 +596,7 @@ func (r RealPodControl) DeletePod(namespace string, podID string, object runtime return fmt.Errorf("object does not have ObjectMeta, %v", err) } glog.V(2).Infof("Controller %v deleting pod %v/%v", accessor.GetName(), namespace, podID) - if err := r.KubeClient.CoreV1().Pods(namespace).Delete(podID, nil); err != nil { + if err := r.KubeClient.CoreV1().Pods(namespace).Delete(podID, nil); err != nil && !apierrors.IsNotFound(err) { r.Recorder.Eventf(object, v1.EventTypeWarning, FailedDeletePodReason, "Error deleting: %v", err) return fmt.Errorf("unable to delete pods: %v", err) } else { @@ -1033,8 +1035,10 @@ func WaitForCacheSync(controllerName string, stopCh <-chan struct{}, cacheSyncs return true } -// ComputeHash returns a hash value calculated from pod template and a collisionCount to avoid hash collision -func ComputeHash(template *v1.PodTemplateSpec, collisionCount *int32) uint32 { +// ComputeHash returns a hash value calculated from pod template and +// a collisionCount to avoid hash collision. The hash will be safe encoded to +// avoid bad words. +func ComputeHash(template *v1.PodTemplateSpec, collisionCount *int32) string { podTemplateSpecHasher := fnv.New32a() hashutil.DeepHashObject(podTemplateSpecHasher, *template) @@ -1045,5 +1049,5 @@ func ComputeHash(template *v1.PodTemplateSpec, collisionCount *int32) uint32 { podTemplateSpecHasher.Write(collisionCountBytes) } - return podTemplateSpecHasher.Sum32() + return rand.SafeEncodeString(fmt.Sprint(podTemplateSpecHasher.Sum32())) } diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/events/event.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/events/event.go index c99c30c9..12294030 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/events/event.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/events/event.go @@ -30,4 +30,5 @@ const ( ProvisioningCleanupFailed = "ProvisioningCleanupFailed" ProvisioningSucceeded = "ProvisioningSucceeded" WaitForFirstConsumer = "WaitForFirstConsumer" + ExternalExpanding = "ExternalExpanding" ) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/BUILD deleted file mode 100644 index 68b23159..00000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["volume_resize_map.go"], - importpath = "k8s.io/kubernetes/pkg/controller/volume/expand/cache", - deps = [ - "//pkg/util/strings:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["volume_resize_map_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume/util/types:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/volume_resize_map.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/volume_resize_map.go deleted file mode 100644 index aadfd983..00000000 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/expand/cache/volume_resize_map.go +++ /dev/null @@ -1,221 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 cache - -import ( - "encoding/json" - "fmt" - "sync" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - commontypes "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/strategicpatch" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/util/strings" - "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/kubernetes/pkg/volume/util/types" -) - -// VolumeResizeMap defines an interface that serves as a cache for holding pending resizing requests -type VolumeResizeMap interface { - // AddPVCUpdate adds pvc for resizing - AddPVCUpdate(pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) - // DeletePVC deletes pvc that is scheduled for resizing - DeletePVC(pvc *v1.PersistentVolumeClaim) - // GetPVCsWithResizeRequest returns all pending pvc resize requests - GetPVCsWithResizeRequest() []*PVCWithResizeRequest - // MarkAsResized marks a pvc as fully resized - MarkAsResized(*PVCWithResizeRequest, resource.Quantity) error - // UpdatePVSize updates just pv size after cloudprovider resizing is successful - UpdatePVSize(*PVCWithResizeRequest, resource.Quantity) error - // MarkForFSResize updates pvc condition to indicate that a file system resize is pending - MarkForFSResize(*PVCWithResizeRequest) error -} - -type volumeResizeMap struct { - // map of unique pvc name and resize requests that are pending or inflight - pvcrs map[types.UniquePVCName]*PVCWithResizeRequest - // kube client for making API calls - kubeClient clientset.Interface - // for guarding access to pvcrs map - sync.Mutex -} - -// PVCWithResizeRequest struct defines data structure that stores state needed for -// performing file system resize -type PVCWithResizeRequest struct { - // PVC that needs to be resized - PVC *v1.PersistentVolumeClaim - // persistentvolume - PersistentVolume *v1.PersistentVolume - // Current volume size - CurrentSize resource.Quantity - // Expended volume size - ExpectedSize resource.Quantity -} - -// UniquePVCKey returns unique key of the PVC based on its UID -func (pvcr *PVCWithResizeRequest) UniquePVCKey() types.UniquePVCName { - return types.UniquePVCName(pvcr.PVC.UID) -} - -// QualifiedName returns namespace and name combination of the PVC -func (pvcr *PVCWithResizeRequest) QualifiedName() string { - return strings.JoinQualifiedName(pvcr.PVC.Namespace, pvcr.PVC.Name) -} - -// NewVolumeResizeMap returns new VolumeResizeMap which acts as a cache -// for holding pending resize requests. -func NewVolumeResizeMap(kubeClient clientset.Interface) VolumeResizeMap { - resizeMap := &volumeResizeMap{} - resizeMap.pvcrs = make(map[types.UniquePVCName]*PVCWithResizeRequest) - resizeMap.kubeClient = kubeClient - return resizeMap -} - -// AddPVCUpdate adds pvc for resizing -// This function intentionally allows addition of PVCs for which pv.Spec.Size >= pvc.Spec.Size, -// the reason being - lack of transaction in k8s means after successful resize, we can't guarantee that when we update PV, -// pvc update will be successful too and after resize we alyways update PV first. -// If for some reason we weren't able to update PVC after successful resize, then we are going to reprocess -// the PVC and hopefully after a no-op resize in volume plugin, PVC will be updated with right values as well. -func (resizeMap *volumeResizeMap) AddPVCUpdate(pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) { - if pv.Spec.ClaimRef == nil || pvc.Namespace != pv.Spec.ClaimRef.Namespace || pvc.Name != pv.Spec.ClaimRef.Name { - glog.V(4).Infof("Persistent Volume is not bound to PVC being updated : %s", util.ClaimToClaimKey(pvc)) - return - } - - if pvc.Status.Phase != v1.ClaimBound { - return - } - - pvcSize := pvc.Spec.Resources.Requests[v1.ResourceStorage] - pvcStatusSize := pvc.Status.Capacity[v1.ResourceStorage] - - if pvcStatusSize.Cmp(pvcSize) >= 0 { - return - } - - glog.V(4).Infof("Adding pvc %s with Size %s/%s for resizing", util.ClaimToClaimKey(pvc), pvcSize.String(), pvcStatusSize.String()) - - pvcRequest := &PVCWithResizeRequest{ - PVC: pvc, - CurrentSize: pvcStatusSize, - ExpectedSize: pvcSize, - PersistentVolume: pv, - } - - resizeMap.Lock() - defer resizeMap.Unlock() - resizeMap.pvcrs[types.UniquePVCName(pvc.UID)] = pvcRequest -} - -// GetPVCsWithResizeRequest returns all pending pvc resize requests -func (resizeMap *volumeResizeMap) GetPVCsWithResizeRequest() []*PVCWithResizeRequest { - resizeMap.Lock() - defer resizeMap.Unlock() - - pvcrs := []*PVCWithResizeRequest{} - for _, pvcr := range resizeMap.pvcrs { - pvcrs = append(pvcrs, pvcr) - } - // Empty out pvcrs map, we will add back failed resize requests later - resizeMap.pvcrs = map[types.UniquePVCName]*PVCWithResizeRequest{} - return pvcrs -} - -// DeletePVC removes given pvc object from list of pvcs that needs resizing. -// deleting a pvc in this map doesn't affect operations that are already inflight. -func (resizeMap *volumeResizeMap) DeletePVC(pvc *v1.PersistentVolumeClaim) { - pvcUniqueName := types.UniquePVCName(pvc.UID) - glog.V(5).Infof("Removing PVC %v from resize map", pvcUniqueName) - resizeMap.Lock() - defer resizeMap.Unlock() - delete(resizeMap.pvcrs, pvcUniqueName) -} - -// MarkAsResized marks a pvc as fully resized -func (resizeMap *volumeResizeMap) MarkAsResized(pvcr *PVCWithResizeRequest, newSize resource.Quantity) error { - emptyCondition := []v1.PersistentVolumeClaimCondition{} - - err := resizeMap.updatePVCCapacityAndConditions(pvcr, newSize, emptyCondition) - if err != nil { - glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcr.QualifiedName(), err) - return err - } - return nil -} - -// MarkForFSResize marks pvc with condition that indicates a fs resize is pending -func (resizeMap *volumeResizeMap) MarkForFSResize(pvcr *PVCWithResizeRequest) error { - pvcCondition := v1.PersistentVolumeClaimCondition{ - Type: v1.PersistentVolumeClaimFileSystemResizePending, - Status: v1.ConditionTrue, - LastTransitionTime: metav1.Now(), - Message: "Waiting for user to (re-)start a pod to finish file system resize of volume on node.", - } - conditions := []v1.PersistentVolumeClaimCondition{pvcCondition} - newPVC := pvcr.PVC.DeepCopy() - newPVC = util.MergeResizeConditionOnPVC(newPVC, conditions) - _, err := util.PatchPVCStatus(pvcr.PVC /*oldPVC*/, newPVC, resizeMap.kubeClient) - return err -} - -// UpdatePVSize updates just pv size after cloudprovider resizing is successful -func (resizeMap *volumeResizeMap) UpdatePVSize(pvcr *PVCWithResizeRequest, newSize resource.Quantity) error { - oldPv := pvcr.PersistentVolume - pvClone := oldPv.DeepCopy() - - oldData, err := json.Marshal(pvClone) - - if err != nil { - return fmt.Errorf("Unexpected error marshaling PV : %q with error %v", pvClone.Name, err) - } - - pvClone.Spec.Capacity[v1.ResourceStorage] = newSize - - newData, err := json.Marshal(pvClone) - - if err != nil { - return fmt.Errorf("Unexpected error marshaling PV : %q with error %v", pvClone.Name, err) - } - - patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, pvClone) - - if err != nil { - return fmt.Errorf("Error Creating two way merge patch for PV : %q with error %v", pvClone.Name, err) - } - - _, updateErr := resizeMap.kubeClient.CoreV1().PersistentVolumes().Patch(pvClone.Name, commontypes.StrategicMergePatchType, patchBytes) - - if updateErr != nil { - glog.V(4).Infof("Error updating pv %q with error : %v", pvClone.Name, updateErr) - return updateErr - } - return nil -} - -func (resizeMap *volumeResizeMap) updatePVCCapacityAndConditions(pvcr *PVCWithResizeRequest, newSize resource.Quantity, pvcConditions []v1.PersistentVolumeClaimCondition) error { - newPVC := pvcr.PVC.DeepCopy() - newPVC.Status.Capacity[v1.ResourceStorage] = newSize - newPVC = util.MergeResizeConditionOnPVC(newPVC, pvcConditions) - _, err := util.PatchPVCStatus(pvcr.PVC /*oldPVC*/, newPVC, resizeMap.kubeClient) - return err -} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/BUILD index ec57338d..6936a128 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/BUILD @@ -28,36 +28,36 @@ go_library( "//pkg/features:go_default_library", "//pkg/util/goroutinemap:go_default_library", "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//pkg/util/io:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", "//pkg/volume/util/recyclerclient:go_default_library", + "//staging/src/k8s.io/api/authentication/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", + "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", ], ) @@ -83,28 +83,28 @@ go_test( "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", "//pkg/volume/util/recyclerclient:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/informers:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/testing:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/informers:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/OWNERS b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/OWNERS index 1a69ba7d..a0e86666 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/OWNERS @@ -3,3 +3,9 @@ approvers: - saad-ali - thockin - msau42 # for volume scheduling +reviewers: +- jsafrane +- saad-ali +- thockin +- msau42 # for volume scheduling +- lichuqiang # for volume scheduling diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/BUILD index e5a37cbf..e231fc8d 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/BUILD @@ -10,9 +10,9 @@ go_library( srcs = ["metrics.go"], importpath = "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/metrics.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/metrics.go index 5035b1bb..2c26935b 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics/metrics.go @@ -56,6 +56,8 @@ type PVCLister interface { func Register(pvLister PVLister, pvcLister PVCLister) { registerMetrics.Do(func() { prometheus.MustRegister(newPVAndPVCCountCollector(pvLister, pvcLister)) + prometheus.MustRegister(volumeOperationMetric) + prometheus.MustRegister(volumeOperationErrorsMetric) }) } @@ -89,6 +91,19 @@ var ( prometheus.BuildFQName("", pvControllerSubsystem, unboundPVCKey), "Gauge measuring number of persistent volume claim currently unbound", []string{namespaceLabel}, nil) + + volumeOperationMetric = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Name: "volume_operation_total_seconds", + Help: "Total volume operation time", + }, + []string{"plugin_name", "operation_name"}) + volumeOperationErrorsMetric = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "volume_operation_total_errors", + Help: "Total volume operation erros", + }, + []string{"plugin_name", "operation_name"}) ) func (collector *pvAndPVCCountCollector) Describe(ch chan<- *prometheus.Desc) { @@ -182,3 +197,15 @@ func (collector *pvAndPVCCountCollector) pvcCollect(ch chan<- prometheus.Metric) ch <- metric } } + +// RecordVolumeOperationMetric records the latency and errors of volume operations. +func RecordVolumeOperationMetric(pluginName, opName string, timeTaken float64, err error) { + if pluginName == "" { + pluginName = "N/A" + } + if err != nil { + volumeOperationErrorsMetric.WithLabelValues(pluginName, opName).Inc() + return + } + volumeOperationMetric.WithLabelValues(pluginName, opName).Observe(timeTaken) +} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/pv_controller.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/pv_controller.go index 4743c474..a65ffb1b 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/pv_controller.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/pv_controller.go @@ -40,6 +40,7 @@ import ( v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/controller/volume/events" + "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/util/goroutinemap" "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff" @@ -122,6 +123,8 @@ const annBindCompleted = "pv.kubernetes.io/bind-completed" // the binding (PV->PVC or PVC->PV) was installed by the controller. The // absence of this annotation means the binding was done by the user (i.e. // pre-bound). Value of this annotation does not matter. +// External PV binders must bind PV the same way as PV controller, otherwise PV +// controller may not handle it correctly. const annBoundByController = "pv.kubernetes.io/bound-by-controller" // This annotation is added to a PV that has been dynamically provisioned by @@ -137,7 +140,7 @@ const annStorageProvisioner = "volume.beta.kubernetes.io/storage-provisioner" // This annotation is added to a PVC that has been triggered by scheduler to // be dynamically provisioned. Its value is the name of the selected node. -const annSelectedNode = "volume.alpha.kubernetes.io/selected-node" +const annSelectedNode = "volume.kubernetes.io/selected-node" // If the provisioner name in a storage class is set to "kubernetes.io/no-provisioner", // then dynamic provisioning is not supported by the storage. @@ -264,7 +267,7 @@ func checkVolumeSatisfyClaim(volume *v1.PersistentVolume, claim *v1.PersistentVo requestedClass := v1helper.GetPersistentVolumeClaimClass(claim) if v1helper.GetPersistentVolumeClass(volume) != requestedClass { - return fmt.Errorf("storageClasseName does not match") + return fmt.Errorf("storageClassName does not match") } isMisMatch, err := checkVolumeModeMisMatches(&claim.Spec, &volume.Spec) @@ -287,14 +290,12 @@ func (ctrl *PersistentVolumeController) shouldDelayBinding(claim *v1.PersistentV return false, nil } - if utilfeature.DefaultFeatureGate.Enabled(features.DynamicProvisioningScheduling) { - // When feature DynamicProvisioningScheduling enabled, - // Scheduler signal to the PV controller to start dynamic - // provisioning by setting the "annSelectedNode" annotation - // in the PVC - if _, ok := claim.Annotations[annSelectedNode]; ok { - return false, nil - } + // When feature VolumeScheduling enabled, + // Scheduler signal to the PV controller to start dynamic + // provisioning by setting the "annSelectedNode" annotation + // in the PVC + if _, ok := claim.Annotations[annSelectedNode]; ok { + return false, nil } className := v1helper.GetPersistentVolumeClaimClass(claim) @@ -544,6 +545,30 @@ func (ctrl *PersistentVolumeController) syncVolume(volume *v1.PersistentVolume) if err != nil { return err } + if !found && metav1.HasAnnotation(volume.ObjectMeta, annBoundByController) { + // If PV is bound by external PV binder (e.g. kube-scheduler), it's + // possible on heavy load that corresponding PVC is not synced to + // controller local cache yet. So we need to double-check PVC in + // 1) informer cache + // 2) apiserver if not found in informer cache + // to make sure we will not reclaim a PV wrongly. + // Note that only non-released and non-failed volumes will be + // updated to Released state when PVC does not eixst. + if volume.Status.Phase != v1.VolumeReleased && volume.Status.Phase != v1.VolumeFailed { + obj, err = ctrl.claimLister.PersistentVolumeClaims(volume.Spec.ClaimRef.Namespace).Get(volume.Spec.ClaimRef.Name) + if err != nil && !apierrs.IsNotFound(err) { + return err + } + found = !apierrs.IsNotFound(err) + if !found { + obj, err = ctrl.kubeClient.CoreV1().PersistentVolumeClaims(volume.Spec.ClaimRef.Namespace).Get(volume.Spec.ClaimRef.Name, metav1.GetOptions{}) + if err != nil && !apierrs.IsNotFound(err) { + return err + } + found = !apierrs.IsNotFound(err) + } + } + } if !found { glog.V(4).Infof("synchronizing PersistentVolume[%s]: claim %s not found", volume.Name, claimrefToClaimKey(volume.Spec.ClaimRef)) // Fall through with claim = nil @@ -1058,8 +1083,12 @@ func (ctrl *PersistentVolumeController) reclaimVolume(volume *v1.PersistentVolum case v1.PersistentVolumeReclaimDelete: glog.V(4).Infof("reclaimVolume[%s]: policy is Delete", volume.Name) opName := fmt.Sprintf("delete-%s[%s]", volume.Name, string(volume.UID)) + startTime := time.Now() ctrl.scheduleOperation(opName, func() error { - return ctrl.deleteVolumeOperation(volume) + pluginName, err := ctrl.deleteVolumeOperation(volume) + timeTaken := time.Since(startTime).Seconds() + metrics.RecordVolumeOperationMetric(pluginName, "delete", timeTaken, err) + return err }) default: @@ -1157,7 +1186,7 @@ func (ctrl *PersistentVolumeController) recycleVolumeOperation(volume *v1.Persis // deleteVolumeOperation deletes a volume. This method is running in standalone // goroutine and already has all necessary locks. -func (ctrl *PersistentVolumeController) deleteVolumeOperation(volume *v1.PersistentVolume) error { +func (ctrl *PersistentVolumeController) deleteVolumeOperation(volume *v1.PersistentVolume) (string, error) { glog.V(4).Infof("deleteVolumeOperation [%s] started", volume.Name) // This method may have been waiting for a volume lock for some time. @@ -1166,19 +1195,19 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(volume *v1.Persist newVolume, err := ctrl.kubeClient.CoreV1().PersistentVolumes().Get(volume.Name, metav1.GetOptions{}) if err != nil { glog.V(3).Infof("error reading persistent volume %q: %v", volume.Name, err) - return nil + return "", nil } needsReclaim, err := ctrl.isVolumeReleased(newVolume) if err != nil { glog.V(3).Infof("error reading claim for volume %q: %v", volume.Name, err) - return nil + return "", nil } if !needsReclaim { glog.V(3).Infof("volume %q no longer needs deletion, skipping", volume.Name) - return nil + return "", nil } - deleted, err := ctrl.doDeleteVolume(volume) + pluginName, deleted, err := ctrl.doDeleteVolume(volume) if err != nil { // Delete failed, update the volume and emit an event. glog.V(3).Infof("deletion of volume %q failed: %v", volume.Name, err) @@ -1192,17 +1221,17 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(volume *v1.Persist if _, err := ctrl.updateVolumePhaseWithEvent(volume, v1.VolumeFailed, v1.EventTypeWarning, events.VolumeFailedDelete, err.Error()); err != nil { glog.V(4).Infof("deleteVolumeOperation [%s]: failed to mark volume as failed: %v", volume.Name, err) // Save failed, retry on the next deletion attempt - return err + return pluginName, err } } // Despite the volume being Failed, the controller will retry deleting // the volume in every syncVolume() call. - return err + return pluginName, err } if !deleted { // The volume waits for deletion by an external plugin. Do nothing. - return nil + return pluginName, nil } glog.V(4).Infof("deleteVolumeOperation [%s]: success", volume.Name) @@ -1213,9 +1242,9 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(volume *v1.Persist // cache of "recently deleted volumes" and avoid unnecessary deletion, // this is left out as future optimization. glog.V(3).Infof("failed to delete volume %q from database: %v", volume.Name, err) - return nil + return pluginName, nil } - return nil + return pluginName, nil } // isVolumeReleased returns true if given volume is released and can be recycled @@ -1292,43 +1321,44 @@ func (ctrl *PersistentVolumeController) isVolumeUsed(pv *v1.PersistentVolume) ([ return podNames.List(), podNames.Len() != 0, nil } -// doDeleteVolume finds appropriate delete plugin and deletes given volume. It -// returns 'true', when the volume was deleted and 'false' when the volume -// cannot be deleted because of the deleter is external. No error should be -// reported in this case. -func (ctrl *PersistentVolumeController) doDeleteVolume(volume *v1.PersistentVolume) (bool, error) { +// doDeleteVolume finds appropriate delete plugin and deletes given volume, returning +// the volume plugin name. Also, it returns 'true', when the volume was deleted and +// 'false' when the volume cannot be deleted because of the deleter is external. No +// error should be reported in this case. +func (ctrl *PersistentVolumeController) doDeleteVolume(volume *v1.PersistentVolume) (string, bool, error) { glog.V(4).Infof("doDeleteVolume [%s]", volume.Name) var err error plugin, err := ctrl.findDeletablePlugin(volume) if err != nil { - return false, err + return "", false, err } if plugin == nil { // External deleter is requested, do nothing glog.V(3).Infof("external deleter for volume %q requested, ignoring", volume.Name) - return false, nil + return "", false, nil } // Plugin found - glog.V(5).Infof("found a deleter plugin %q for volume %q", plugin.GetPluginName(), volume.Name) + pluginName := plugin.GetPluginName() + glog.V(5).Infof("found a deleter plugin %q for volume %q", pluginName, volume.Name) spec := vol.NewSpecFromPersistentVolume(volume, false) deleter, err := plugin.NewDeleter(spec) if err != nil { // Cannot create deleter - return false, fmt.Errorf("Failed to create deleter for volume %q: %v", volume.Name, err) + return pluginName, false, fmt.Errorf("Failed to create deleter for volume %q: %v", volume.Name, err) } - opComplete := util.OperationCompleteHook(plugin.GetPluginName(), "volume_delete") + opComplete := util.OperationCompleteHook(pluginName, "volume_delete") err = deleter.Delete() opComplete(&err) if err != nil { // Deleter failed - return false, err + return pluginName, false, err } glog.V(2).Infof("volume %q deleted", volume.Name) - return true, nil + return pluginName, true, nil } // provisionClaim starts new asynchronous operation to provision a claim if @@ -1339,16 +1369,19 @@ func (ctrl *PersistentVolumeController) provisionClaim(claim *v1.PersistentVolum } glog.V(4).Infof("provisionClaim[%s]: started", claimToClaimKey(claim)) opName := fmt.Sprintf("provision-%s[%s]", claimToClaimKey(claim), string(claim.UID)) + startTime := time.Now() ctrl.scheduleOperation(opName, func() error { - ctrl.provisionClaimOperation(claim) - return nil + pluginName, err := ctrl.provisionClaimOperation(claim) + timeTaken := time.Since(startTime).Seconds() + metrics.RecordVolumeOperationMetric(pluginName, "provision", timeTaken, err) + return err }) return nil } // provisionClaimOperation provisions a volume. This method is running in // standalone goroutine and already has all necessary locks. -func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.PersistentVolumeClaim) { +func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.PersistentVolumeClaim) (string, error) { claimClass := v1helper.GetPersistentVolumeClaimClass(claim) glog.V(4).Infof("provisionClaimOperation [%s] started, class: %q", claimToClaimKey(claim), claimClass) @@ -1358,7 +1391,12 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis glog.V(2).Infof("error finding provisioning plugin for claim %s: %v", claimToClaimKey(claim), err) // The controller will retry provisioning the volume in every // syncVolume() call. - return + return "", err + } + + var pluginName string + if plugin != nil { + pluginName = plugin.GetPluginName() } // Add provisioner annotation so external provisioners know when to start @@ -1366,7 +1404,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis if err != nil { // Save failed, the controller will retry in the next sync glog.V(2).Infof("error saving claim %s: %v", claimToClaimKey(claim), err) - return + return pluginName, err } claim = newClaim @@ -1377,7 +1415,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis msg := fmt.Sprintf("waiting for a volume to be created, either by external provisioner %q or manually created by system administrator", storageClass.Provisioner) ctrl.eventRecorder.Event(claim, v1.EventTypeNormal, events.ExternalProvisioning, msg) glog.V(3).Infof("provisioning claim %q: %s", claimToClaimKey(claim), msg) - return + return pluginName, nil } // internal provisioning @@ -1391,7 +1429,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis if err == nil && volume != nil { // Volume has been already provisioned, nothing to do. glog.V(4).Infof("provisionClaimOperation [%s]: volume already exists, skipping", claimToClaimKey(claim)) - return + return pluginName, err } // Prepare a claimRef to the claim early (to fail before a volume is @@ -1399,7 +1437,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis claimRef, err := ref.GetReference(scheme.Scheme, claim) if err != nil { glog.V(3).Infof("unexpected error getting claim reference: %v", err) - return + return pluginName, err } // Gather provisioning options @@ -1424,7 +1462,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis strerr := fmt.Sprintf("Mount options are not supported by the provisioner but StorageClass %q has mount options %v", storageClass.Name, options.MountOptions) glog.V(2).Infof("Mount options are not supported by the provisioner but claim %q's StorageClass %q has mount options %v", claimToClaimKey(claim), storageClass.Name, options.MountOptions) ctrl.eventRecorder.Event(claim, v1.EventTypeWarning, events.ProvisioningFailed, strerr) - return + return pluginName, fmt.Errorf("provisioner %q doesn't support mount options", plugin.GetPluginName()) } // Provision the volume @@ -1433,29 +1471,26 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis strerr := fmt.Sprintf("Failed to create provisioner: %v", err) glog.V(2).Infof("failed to create provisioner for claim %q with StorageClass %q: %v", claimToClaimKey(claim), storageClass.Name, err) ctrl.eventRecorder.Event(claim, v1.EventTypeWarning, events.ProvisioningFailed, strerr) - return + return pluginName, err } var selectedNode *v1.Node = nil - var allowedTopologies []v1.TopologySelectorTerm = nil - if utilfeature.DefaultFeatureGate.Enabled(features.DynamicProvisioningScheduling) { - if nodeName, ok := claim.Annotations[annSelectedNode]; ok { - selectedNode, err = ctrl.NodeLister.Get(nodeName) - if err != nil { - strerr := fmt.Sprintf("Failed to get target node: %v", err) - glog.V(3).Infof("unexpected error getting target node %q for claim %q: %v", nodeName, claimToClaimKey(claim), err) - ctrl.eventRecorder.Event(claim, v1.EventTypeWarning, events.ProvisioningFailed, strerr) - return - } + if nodeName, ok := claim.Annotations[annSelectedNode]; ok { + selectedNode, err = ctrl.NodeLister.Get(nodeName) + if err != nil { + strerr := fmt.Sprintf("Failed to get target node: %v", err) + glog.V(3).Infof("unexpected error getting target node %q for claim %q: %v", nodeName, claimToClaimKey(claim), err) + ctrl.eventRecorder.Event(claim, v1.EventTypeWarning, events.ProvisioningFailed, strerr) + return pluginName, err } - allowedTopologies = storageClass.AllowedTopologies } + allowedTopologies := storageClass.AllowedTopologies opComplete := util.OperationCompleteHook(plugin.GetPluginName(), "volume_provision") volume, err = provisioner.Provision(selectedNode, allowedTopologies) opComplete(&err) if err != nil { - // Other places of failure have nothing to do with DynamicProvisioningScheduling, + // Other places of failure have nothing to do with VolumeScheduling, // so just let controller retry in the next sync. We'll only call func // rescheduleProvisioning here when the underlying provisioning actually failed. ctrl.rescheduleProvisioning(claim) @@ -1463,7 +1498,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis strerr := fmt.Sprintf("Failed to provision volume with StorageClass %q: %v", storageClass.Name, err) glog.V(2).Infof("failed to provision volume for claim %q with StorageClass %q: %v", claimToClaimKey(claim), storageClass.Name, err) ctrl.eventRecorder.Event(claim, v1.EventTypeWarning, events.ProvisioningFailed, strerr) - return + return pluginName, err } glog.V(3).Infof("volume %q for claim %q created", volume.Name, claimToClaimKey(claim)) @@ -1518,7 +1553,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis var deleteErr error var deleted bool for i := 0; i < ctrl.createProvisionedPVRetryCount; i++ { - deleted, deleteErr = ctrl.doDeleteVolume(volume) + _, deleted, deleteErr = ctrl.doDeleteVolume(volume) if deleteErr == nil && deleted { // Delete succeeded glog.V(4).Infof("provisionClaimOperation [%s]: cleaning volume %s succeeded", claimToClaimKey(claim), volume.Name) @@ -1548,6 +1583,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation(claim *v1.Persis msg := fmt.Sprintf("Successfully provisioned volume %s using %s", volume.Name, plugin.GetPluginName()) ctrl.eventRecorder.Event(claim, v1.EventTypeNormal, events.ProvisioningSucceeded, msg) } + return pluginName, nil } // rescheduleProvisioning signal back to the scheduler to retry dynamic provisioning diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_assume_cache.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_assume_cache.go index b04b402b..0e4ade0f 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_assume_cache.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_assume_cache.go @@ -83,7 +83,8 @@ func (e *errObjectName) Error() string { // Restore() sets the latest object pointer back to the informer object. // Get/List() always returns the latest object pointer. type assumeCache struct { - mutex sync.Mutex + // Synchronizes updates to store + rwMutex sync.RWMutex // describes the object stored description string @@ -155,8 +156,8 @@ func (c *assumeCache) add(obj interface{}) { return } - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.Lock() + defer c.rwMutex.Unlock() if objInfo, _ := c.getObjInfo(name); objInfo != nil { newVersion, err := c.getObjVersion(name, obj) @@ -199,8 +200,8 @@ func (c *assumeCache) delete(obj interface{}) { return } - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.Lock() + defer c.rwMutex.Unlock() objInfo := &objInfo{name: name} err = c.store.Delete(objInfo) @@ -239,8 +240,8 @@ func (c *assumeCache) getObjInfo(name string) (*objInfo, error) { } func (c *assumeCache) Get(objName string) (interface{}, error) { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.RLock() + defer c.rwMutex.RUnlock() objInfo, err := c.getObjInfo(objName) if err != nil { @@ -250,8 +251,8 @@ func (c *assumeCache) Get(objName string) (interface{}, error) { } func (c *assumeCache) List(indexObj interface{}) []interface{} { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.RLock() + defer c.rwMutex.RUnlock() allObjs := []interface{}{} objs, err := c.store.Index(c.indexName, &objInfo{latestObj: indexObj}) @@ -277,8 +278,8 @@ func (c *assumeCache) Assume(obj interface{}) error { return &errObjectName{err} } - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.Lock() + defer c.rwMutex.Unlock() objInfo, err := c.getObjInfo(name) if err != nil { @@ -306,8 +307,8 @@ func (c *assumeCache) Assume(obj interface{}) error { } func (c *assumeCache) Restore(objName string) { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.Lock() + defer c.rwMutex.Unlock() objInfo, err := c.getObjInfo(objName) if err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder.go index bec90c1b..5375c78a 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder.go @@ -19,18 +19,18 @@ package persistentvolume import ( "fmt" "sort" + "time" "github.com/golang/glog" "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" - utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/apimachinery/pkg/util/wait" coreinformers "k8s.io/client-go/informers/core/v1" storageinformers "k8s.io/client-go/informers/storage/v1" clientset "k8s.io/client-go/kubernetes" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" - "k8s.io/kubernetes/pkg/features" volumeutil "k8s.io/kubernetes/pkg/volume/util" ) @@ -44,16 +44,19 @@ import ( // a. Invokes all predicate functions, parallelized across nodes. FindPodVolumes() is invoked here. // b. Invokes all priority functions. Future/TBD // c. Selects the best node for the Pod. -// d. Cache the node selection for the Pod. (Assume phase) +// d. Cache the node selection for the Pod. AssumePodVolumes() is invoked here. // i. If PVC binding is required, cache in-memory only: -// * Updated PV objects for prebinding to the corresponding PVCs. -// * For the pod, which PVs need API updates. -// AssumePodVolumes() is invoked here. Then BindPodVolumes() is called asynchronously by the -// scheduler. After BindPodVolumes() is complete, the Pod is added back to the scheduler queue -// to be processed again until all PVCs are bound. -// ii. If PVC binding is not required, cache the Pod->Node binding in the scheduler's pod cache, -// and asynchronously bind the Pod to the Node. This is handled in the scheduler and not here. -// 2. Once the assume operation is done, the scheduler processes the next Pod in the scheduler queue +// * For manual binding: update PV objects for prebinding to the corresponding PVCs. +// * For dynamic provisioning: update PVC object with a selected node from c) +// * For the pod, which PVCs and PVs need API updates. +// ii. Afterwards, the main scheduler caches the Pod->Node binding in the scheduler's pod cache, +// This is handled in the scheduler and not here. +// e. Asynchronously bind volumes and pod in a separate goroutine +// i. BindPodVolumes() is called first. It makes all the necessary API updates and waits for +// PV controller to fully bind and provision the PVCs. If binding fails, the Pod is sent +// back through the scheduler. +// ii. After BindPodVolumes() is complete, then the scheduler does the final Pod->Node binding. +// 2. Once all the assume operations are done in d), the scheduler processes the next Pod in the scheduler queue // while the actual binding operation occurs in the background. type SchedulerVolumeBinder interface { // FindPodVolumes checks if all of a Pod's PVCs can be satisfied by the node. @@ -73,18 +76,18 @@ type SchedulerVolumeBinder interface { // 2. Take the PVCs that need provisioning and update the PVC cache with related // annotations set. // - // It returns true if all volumes are fully bound, and returns true if any volume binding/provisioning - // API operation needs to be done afterwards. + // It returns true if all volumes are fully bound // // This function will modify assumedPod with the node name. // This function is called serially. - AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (allFullyBound bool, bindingRequired bool, err error) + AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (allFullyBound bool, err error) // BindPodVolumes will: // 1. Initiate the volume binding by making the API call to prebind the PV // to its matching PVC. // 2. Trigger the volume provisioning by making the API call to set related // annotations on the PVC + // 3. Wait for PVCs to be completely bound by the PV controller // // This function can be called in parallel. BindPodVolumes(assumedPod *v1.Pod) error @@ -102,6 +105,9 @@ type volumeBinder struct { // Stores binding decisions that were made in FindPodVolumes for use in AssumePodVolumes. // AssumePodVolumes modifies the bindings again for use in BindPodVolumes. podBindingCache PodBindingCache + + // Amount of time to wait for the bind operation to succeed + bindTimeout time.Duration } // NewVolumeBinder sets up all the caches needed for the scheduler to make volume binding decisions. @@ -109,7 +115,8 @@ func NewVolumeBinder( kubeClient clientset.Interface, pvcInformer coreinformers.PersistentVolumeClaimInformer, pvInformer coreinformers.PersistentVolumeInformer, - storageClassInformer storageinformers.StorageClassInformer) SchedulerVolumeBinder { + storageClassInformer storageinformers.StorageClassInformer, + bindTimeout time.Duration) SchedulerVolumeBinder { // TODO: find better way... ctrl := &PersistentVolumeController{ @@ -122,6 +129,7 @@ func NewVolumeBinder( pvcCache: NewPVCAssumeCache(pvcInformer.Informer()), pvCache: NewPVAssumeCache(pvInformer.Informer()), podBindingCache: NewPodBindingCache(), + bindTimeout: bindTimeout, } return b @@ -151,7 +159,7 @@ func (b *volumeBinder) FindPodVolumes(pod *v1.Pod, node *v1.Node) (unboundVolume // Immediate claims should be bound if len(unboundClaimsImmediate) > 0 { - return false, false, fmt.Errorf("pod has unbound PersistentVolumeClaims") + return false, false, fmt.Errorf("pod has unbound immediate PersistentVolumeClaims") } // Check PV node affinity on bound volumes @@ -169,13 +177,11 @@ func (b *volumeBinder) FindPodVolumes(pod *v1.Pod, node *v1.Node) (unboundVolume return false, false, err } - if utilfeature.DefaultFeatureGate.Enabled(features.DynamicProvisioningScheduling) { - // Try to provision for unbound volumes - if !unboundVolumesSatisfied { - unboundVolumesSatisfied, err = b.checkVolumeProvisions(pod, claimsToProvision, node) - if err != nil { - return false, false, err - } + // Try to provision for unbound volumes + if !unboundVolumesSatisfied { + unboundVolumesSatisfied, err = b.checkVolumeProvisions(pod, claimsToProvision, node) + if err != nil { + return false, false, err } } } @@ -187,22 +193,24 @@ func (b *volumeBinder) FindPodVolumes(pod *v1.Pod, node *v1.Node) (unboundVolume // in podBindingCache for the chosen node, and: // 1. Update the pvCache with the new prebound PV. // 2. Update the pvcCache with the new PVCs with annotations set -// It will update podBindingCache again with the PVs and PVCs that need an API update. -func (b *volumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (allFullyBound, bindingRequired bool, err error) { +// 3. Update podBindingCache again with cached API updates for PVs and PVCs. +func (b *volumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (allFullyBound bool, err error) { podName := getPodName(assumedPod) glog.V(4).Infof("AssumePodVolumes for pod %q, node %q", podName, nodeName) if allBound := b.arePodVolumesBound(assumedPod); allBound { glog.V(4).Infof("AssumePodVolumes for pod %q, node %q: all PVCs bound and nothing to do", podName, nodeName) - return true, false, nil + return true, nil } assumedPod.Spec.NodeName = nodeName - // Assume PV + claimsToBind := b.podBindingCache.GetBindings(assumedPod, nodeName) - newBindings := []*bindingInfo{} + claimsToProvision := b.podBindingCache.GetProvisionedPVCs(assumedPod, nodeName) + // Assume PV + newBindings := []*bindingInfo{} for _, binding := range claimsToBind { newPV, dirty, err := b.ctrl.getBindVolumeToClaim(binding.pv, binding.pvc) glog.V(5).Infof("AssumePodVolumes: getBindVolumeToClaim for pod %q, PV %q, PVC %q. newPV %p, dirty %v, err: %v", @@ -214,29 +222,20 @@ func (b *volumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (al err) if err != nil { b.revertAssumedPVs(newBindings) - return false, true, err + return false, err } + // TODO: can we assume everytime? if dirty { err = b.pvCache.Assume(newPV) if err != nil { b.revertAssumedPVs(newBindings) - return false, true, err + return false, err } - - newBindings = append(newBindings, &bindingInfo{pv: newPV, pvc: binding.pvc}) } - } - - // Don't update cached bindings if no API updates are needed. This can happen if we - // previously updated the PV object and are waiting for the PV controller to finish binding. - if len(newBindings) != 0 { - bindingRequired = true - b.podBindingCache.UpdateBindings(assumedPod, nodeName, newBindings) + newBindings = append(newBindings, &bindingInfo{pv: newPV, pvc: binding.pvc}) } // Assume PVCs - claimsToProvision := b.podBindingCache.GetProvisionedPVCs(assumedPod, nodeName) - newProvisionedPVCs := []*v1.PersistentVolumeClaim{} for _, claim := range claimsToProvision { // The claims from method args can be pointing to watcher cache. We must not @@ -253,66 +252,172 @@ func (b *volumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (al newProvisionedPVCs = append(newProvisionedPVCs, claimClone) } - if len(newProvisionedPVCs) != 0 { - bindingRequired = true - b.podBindingCache.UpdateProvisionedPVCs(assumedPod, nodeName, newProvisionedPVCs) - } + // Update cache with the assumed pvcs and pvs + // Even if length is zero, update the cache with an empty slice to indicate that no + // operations are needed + b.podBindingCache.UpdateBindings(assumedPod, nodeName, newBindings) + b.podBindingCache.UpdateProvisionedPVCs(assumedPod, nodeName, newProvisionedPVCs) return } -// BindPodVolumes gets the cached bindings and PVCs to provision in podBindingCache -// and makes the API update for those PVs/PVCs. +// BindPodVolumes gets the cached bindings and PVCs to provision in podBindingCache, +// makes the API update for those PVs/PVCs, and waits for the PVCs to be completely bound +// by the PV controller. func (b *volumeBinder) BindPodVolumes(assumedPod *v1.Pod) error { podName := getPodName(assumedPod) - glog.V(4).Infof("BindPodVolumes for pod %q", podName) + glog.V(4).Infof("BindPodVolumes for pod %q, node %q", podName, assumedPod.Spec.NodeName) bindings := b.podBindingCache.GetBindings(assumedPod, assumedPod.Spec.NodeName) claimsToProvision := b.podBindingCache.GetProvisionedPVCs(assumedPod, assumedPod.Spec.NodeName) + // Start API operations + err := b.bindAPIUpdate(podName, bindings, claimsToProvision) + if err != nil { + return err + } + + return wait.Poll(time.Second, b.bindTimeout, func() (bool, error) { + // Get cached values every time in case the pod gets deleted + bindings = b.podBindingCache.GetBindings(assumedPod, assumedPod.Spec.NodeName) + claimsToProvision = b.podBindingCache.GetProvisionedPVCs(assumedPod, assumedPod.Spec.NodeName) + return b.checkBindings(assumedPod, bindings, claimsToProvision) + }) +} + +func getPodName(pod *v1.Pod) string { + return pod.Namespace + "/" + pod.Name +} + +func getPVCName(pvc *v1.PersistentVolumeClaim) string { + return pvc.Namespace + "/" + pvc.Name +} + +// bindAPIUpdate gets the cached bindings and PVCs to provision in podBindingCache +// and makes the API update for those PVs/PVCs. +func (b *volumeBinder) bindAPIUpdate(podName string, bindings []*bindingInfo, claimsToProvision []*v1.PersistentVolumeClaim) error { + if bindings == nil { + return fmt.Errorf("failed to get cached bindings for pod %q", podName) + } + if claimsToProvision == nil { + return fmt.Errorf("failed to get cached claims to provision for pod %q", podName) + } + + lastProcessedBinding := 0 + lastProcessedProvisioning := 0 + defer func() { + // only revert assumed cached updates for volumes we haven't successfully bound + if lastProcessedBinding < len(bindings) { + b.revertAssumedPVs(bindings[lastProcessedBinding:]) + } + // only revert assumed cached updates for claims we haven't updated, + if lastProcessedProvisioning < len(claimsToProvision) { + b.revertAssumedPVCs(claimsToProvision[lastProcessedProvisioning:]) + } + }() + + var ( + binding *bindingInfo + claim *v1.PersistentVolumeClaim + ) + // Do the actual prebinding. Let the PV controller take care of the rest // There is no API rollback if the actual binding fails - for i, bindingInfo := range bindings { - glog.V(5).Infof("BindPodVolumes: Pod %q, binding PV %q to PVC %q", podName, bindingInfo.pv.Name, bindingInfo.pvc.Name) - _, err := b.ctrl.updateBindVolumeToClaim(bindingInfo.pv, bindingInfo.pvc, false) - if err != nil { - // only revert assumed cached updates for volumes we haven't successfully bound - b.revertAssumedPVs(bindings[i:]) - // Revert all of the assumed cached updates for claims, - // since no actual API update will be done - b.revertAssumedPVCs(claimsToProvision) + for _, binding = range bindings { + glog.V(5).Infof("bindAPIUpdate: Pod %q, binding PV %q to PVC %q", podName, binding.pv.Name, binding.pvc.Name) + // TODO: does it hurt if we make an api call and nothing needs to be updated? + if _, err := b.ctrl.updateBindVolumeToClaim(binding.pv, binding.pvc, false); err != nil { return err } + lastProcessedBinding++ } // Update claims objects to trigger volume provisioning. Let the PV controller take care of the rest // PV controller is expect to signal back by removing related annotations if actual provisioning fails - for i, claim := range claimsToProvision { + for _, claim = range claimsToProvision { + glog.V(5).Infof("bindAPIUpdate: Pod %q, PVC %q", podName, getPVCName(claim)) if _, err := b.ctrl.kubeClient.CoreV1().PersistentVolumeClaims(claim.Namespace).Update(claim); err != nil { - glog.V(4).Infof("updating PersistentVolumeClaim[%s] failed: %v", getPVCName(claim), err) - // only revert assumed cached updates for claims we haven't successfully updated - b.revertAssumedPVCs(claimsToProvision[i:]) return err } + lastProcessedProvisioning++ } return nil } -func getPodName(pod *v1.Pod) string { - return pod.Namespace + "/" + pod.Name -} +// checkBindings runs through all the PVCs in the Pod and checks: +// * if the PVC is fully bound +// * if there are any conditions that require binding to fail and be retried +// +// It returns true when all of the Pod's PVCs are fully bound, and error if +// binding (and scheduling) needs to be retried +func (b *volumeBinder) checkBindings(pod *v1.Pod, bindings []*bindingInfo, claimsToProvision []*v1.PersistentVolumeClaim) (bool, error) { + podName := getPodName(pod) + if bindings == nil { + return false, fmt.Errorf("failed to get cached bindings for pod %q", podName) + } + if claimsToProvision == nil { + return false, fmt.Errorf("failed to get cached claims to provision for pod %q", podName) + } -func getPVCName(pvc *v1.PersistentVolumeClaim) string { - return pvc.Namespace + "/" + pvc.Name + for _, binding := range bindings { + // Check for any conditions that might require scheduling retry + + // Check if pv still exists + pv, err := b.pvCache.GetPV(binding.pv.Name) + if err != nil || pv == nil { + return false, fmt.Errorf("failed to check pv binding: %v", err) + } + + // Check if pv.ClaimRef got dropped by unbindVolume() + if pv.Spec.ClaimRef == nil || pv.Spec.ClaimRef.UID == "" { + return false, fmt.Errorf("ClaimRef got reset for pv %q", pv.Name) + } + + // Check if pvc is fully bound + if isBound, _, err := b.isPVCBound(binding.pvc.Namespace, binding.pvc.Name); !isBound || err != nil { + return false, err + } + + // TODO; what if pvc is bound to the wrong pv? It means our assume cache should be reverted. + // Or will pv controller cleanup the pv.ClaimRef? + } + + for _, claim := range claimsToProvision { + bound, pvc, err := b.isPVCBound(claim.Namespace, claim.Name) + if err != nil || pvc == nil { + return false, fmt.Errorf("failed to check pvc binding: %v", err) + } + + // Check if selectedNode annotation is still set + if pvc.Annotations == nil { + return false, fmt.Errorf("selectedNode annotation reset for PVC %q", pvc.Name) + } + selectedNode := pvc.Annotations[annSelectedNode] + if selectedNode != pod.Spec.NodeName { + return false, fmt.Errorf("selectedNode annotation value %q not set to scheduled node %q", selectedNode, pod.Spec.NodeName) + } + + if !bound { + return false, nil + } + } + + // All pvs and pvcs that we operated on are bound + glog.V(4).Infof("All PVCs for pod %q are bound", podName) + return true, nil } -func (b *volumeBinder) isVolumeBound(namespace string, vol *v1.Volume, checkFullyBound bool) (bool, *v1.PersistentVolumeClaim, error) { +func (b *volumeBinder) isVolumeBound(namespace string, vol *v1.Volume) (bool, *v1.PersistentVolumeClaim, error) { if vol.PersistentVolumeClaim == nil { return true, nil, nil } pvcName := vol.PersistentVolumeClaim.ClaimName + return b.isPVCBound(namespace, pvcName) +} + +func (b *volumeBinder) isPVCBound(namespace, pvcName string) (bool, *v1.PersistentVolumeClaim, error) { claim := &v1.PersistentVolumeClaim{ ObjectMeta: metav1.ObjectMeta{ Name: pvcName, @@ -326,17 +431,13 @@ func (b *volumeBinder) isVolumeBound(namespace string, vol *v1.Volume, checkFull pvName := pvc.Spec.VolumeName if pvName != "" { - if checkFullyBound { - if metav1.HasAnnotation(pvc.ObjectMeta, annBindCompleted) { - glog.V(5).Infof("PVC %q is fully bound to PV %q", getPVCName(pvc), pvName) - return true, pvc, nil - } else { - glog.V(5).Infof("PVC %q is not fully bound to PV %q", getPVCName(pvc), pvName) - return false, pvc, nil - } + if metav1.HasAnnotation(pvc.ObjectMeta, annBindCompleted) { + glog.V(5).Infof("PVC %q is fully bound to PV %q", getPVCName(pvc), pvName) + return true, pvc, nil + } else { + glog.V(5).Infof("PVC %q is not fully bound to PV %q", getPVCName(pvc), pvName) + return false, pvc, nil } - glog.V(5).Infof("PVC %q is bound or prebound to PV %q", getPVCName(pvc), pvName) - return true, pvc, nil } glog.V(5).Infof("PVC %q is not bound", getPVCName(pvc)) @@ -346,7 +447,7 @@ func (b *volumeBinder) isVolumeBound(namespace string, vol *v1.Volume, checkFull // arePodVolumesBound returns true if all volumes are fully bound func (b *volumeBinder) arePodVolumesBound(pod *v1.Pod) bool { for _, vol := range pod.Spec.Volumes { - if isBound, _, _ := b.isVolumeBound(pod.Namespace, &vol, true); !isBound { + if isBound, _, _ := b.isVolumeBound(pod.Namespace, &vol); !isBound { // Pod has at least one PVC that needs binding return false } @@ -362,7 +463,7 @@ func (b *volumeBinder) getPodVolumes(pod *v1.Pod) (boundClaims []*v1.PersistentV unboundClaims = []*bindingInfo{} for _, vol := range pod.Spec.Volumes { - volumeBound, pvc, err := b.isVolumeBound(pod.Namespace, &vol, false) + volumeBound, pvc, err := b.isVolumeBound(pod.Namespace, &vol) if err != nil { return nil, nil, nil, err } @@ -376,7 +477,8 @@ func (b *volumeBinder) getPodVolumes(pod *v1.Pod) (boundClaims []*v1.PersistentV if err != nil { return nil, nil, nil, err } - if delayBinding { + // Prebound PVCs are treated as unbound immediate binding + if delayBinding && pvc.Spec.VolumeName == "" { // Scheduler path unboundClaims = append(unboundClaims, &bindingInfo{pvc: pvc}) } else { @@ -522,19 +624,6 @@ type bindingInfo struct { pv *v1.PersistentVolume } -// Used in unit test errors -func (b bindingInfo) String() string { - pvcName := "" - pvName := "" - if b.pvc != nil { - pvcName = getPVCName(b.pvc) - } - if b.pv != nil { - pvName = b.pv.Name - } - return fmt.Sprintf("[PVC %q, PV %q]", pvcName, pvName) -} - type byPVCSize []*bindingInfo func (a byPVCSize) Len() int { diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_cache.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_cache.go index c5230117..e3acc351 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_cache.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_cache.go @@ -31,6 +31,8 @@ type PodBindingCache interface { UpdateBindings(pod *v1.Pod, node string, bindings []*bindingInfo) // GetBindings will return the cached bindings for the given pod and node. + // A nil return value means that the entry was not found. An empty slice + // means that no binding operations are needed. GetBindings(pod *v1.Pod, node string) []*bindingInfo // UpdateProvisionedPVCs will update the cache with the given provisioning decisions @@ -38,6 +40,8 @@ type PodBindingCache interface { UpdateProvisionedPVCs(pod *v1.Pod, node string, provisionings []*v1.PersistentVolumeClaim) // GetProvisionedPVCs will return the cached provisioning decisions for the given pod and node. + // A nil return value means that the entry was not found. An empty slice + // means that no provisioning operations are needed. GetProvisionedPVCs(pod *v1.Pod, node string) []*v1.PersistentVolumeClaim // DeleteBindings will remove all cached bindings and provisionings for the given pod. @@ -46,7 +50,8 @@ type PodBindingCache interface { } type podBindingCache struct { - mutex sync.Mutex + // synchronizes bindingDecisions + rwMutex sync.RWMutex // Key = pod name // Value = nodeDecisions @@ -68,16 +73,16 @@ func NewPodBindingCache() PodBindingCache { } func (c *podBindingCache) DeleteBindings(pod *v1.Pod) { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.Lock() + defer c.rwMutex.Unlock() podName := getPodName(pod) delete(c.bindingDecisions, podName) } func (c *podBindingCache) UpdateBindings(pod *v1.Pod, node string, bindings []*bindingInfo) { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.Lock() + defer c.rwMutex.Unlock() podName := getPodName(pod) decisions, ok := c.bindingDecisions[podName] @@ -97,8 +102,8 @@ func (c *podBindingCache) UpdateBindings(pod *v1.Pod, node string, bindings []*b } func (c *podBindingCache) GetBindings(pod *v1.Pod, node string) []*bindingInfo { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.RLock() + defer c.rwMutex.RUnlock() podName := getPodName(pod) decisions, ok := c.bindingDecisions[podName] @@ -113,8 +118,8 @@ func (c *podBindingCache) GetBindings(pod *v1.Pod, node string) []*bindingInfo { } func (c *podBindingCache) UpdateProvisionedPVCs(pod *v1.Pod, node string, pvcs []*v1.PersistentVolumeClaim) { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.Lock() + defer c.rwMutex.Unlock() podName := getPodName(pod) decisions, ok := c.bindingDecisions[podName] @@ -134,8 +139,8 @@ func (c *podBindingCache) UpdateProvisionedPVCs(pod *v1.Pod, node string, pvcs [ } func (c *podBindingCache) GetProvisionedPVCs(pod *v1.Pod, node string) []*v1.PersistentVolumeClaim { - c.mutex.Lock() - defer c.mutex.Unlock() + c.rwMutex.RLock() + defer c.rwMutex.RUnlock() podName := getPodName(pod) decisions, ok := c.bindingDecisions[podName] diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_fake.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_fake.go index 4cefc58b..46e8f200 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_fake.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/scheduler_binder_fake.go @@ -16,18 +16,15 @@ limitations under the License. package persistentvolume -import ( - "k8s.io/api/core/v1" -) +import "k8s.io/api/core/v1" type FakeVolumeBinderConfig struct { - AllBound bool - FindUnboundSatsified bool - FindBoundSatsified bool - FindErr error - AssumeBindingRequired bool - AssumeErr error - BindErr error + AllBound bool + FindUnboundSatsified bool + FindBoundSatsified bool + FindErr error + AssumeErr error + BindErr error } // NewVolumeBinder sets up all the caches needed for the scheduler to make @@ -48,9 +45,9 @@ func (b *FakeVolumeBinder) FindPodVolumes(pod *v1.Pod, node *v1.Node) (unboundVo return b.config.FindUnboundSatsified, b.config.FindBoundSatsified, b.config.FindErr } -func (b *FakeVolumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (bool, bool, error) { +func (b *FakeVolumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string) (bool, error) { b.AssumeCalled = true - return b.config.AllBound, b.config.AssumeBindingRequired, b.config.AssumeErr + return b.config.AllBound, b.config.AssumeErr } func (b *FakeVolumeBinder) BindPodVolumes(assumedPod *v1.Pod) error { diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/volume_host.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/volume_host.go index 7fa54790..fe54b06c 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/volume_host.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/persistentvolume/volume_host.go @@ -25,8 +25,8 @@ import ( "k8s.io/apimachinery/pkg/types" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" + csiclientset "k8s.io/csi-api/pkg/client/clientset/versioned" "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/util/io" "k8s.io/kubernetes/pkg/util/mount" vol "k8s.io/kubernetes/pkg/volume" ) @@ -79,10 +79,6 @@ func (ctrl *PersistentVolumeController) GetMounter(pluginName string) mount.Inte return nil } -func (ctrl *PersistentVolumeController) GetWriter() io.Writer { - return nil -} - func (ctrl *PersistentVolumeController) GetHostName() string { return "" } @@ -128,3 +124,8 @@ func (ctrl *PersistentVolumeController) GetNodeName() types.NodeName { func (ctrl *PersistentVolumeController) GetEventRecorder() record.EventRecorder { return ctrl.eventRecorder } + +func (ctrl *PersistentVolumeController) GetCSIClient() csiclientset.Interface { + // No volume plugin needs csi.storage.k8s.io client in PV controller. + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD index e397729b..351420ae 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/BUILD @@ -17,9 +17,9 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/credentialprovider", deps = [ + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/docker/docker/api/types:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go index 7f698bea..ffeab5ea 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/azure/azure_credentials.go @@ -40,6 +40,8 @@ var flagConfigFile = pflag.String("azure-container-registry-config", "", const dummyRegistryEmail = "name@contoso.com" +var containerRegistryUrls = []string{"*.azurecr.io", "*.azurecr.cn", "*.azurecr.de", "*.azurecr.us"} + // init registers the various means by which credentials may // be resolved on Azure. func init() { @@ -176,31 +178,33 @@ func (a *acrProvider) Provide() credentialprovider.DockerConfig { ctx, cancel := getContextWithCancel() defer cancel() - glog.V(4).Infof("listing registries") - result, err := a.registryClient.List(ctx) - if err != nil { - glog.Errorf("Failed to list registries: %v", err) - return cfg - } - - for ix := range result { - loginServer := getLoginServer(result[ix]) - var cred *credentialprovider.DockerConfigEntry + if a.config.UseManagedIdentityExtension { + glog.V(4).Infof("listing registries") + result, err := a.registryClient.List(ctx) + if err != nil { + glog.Errorf("Failed to list registries: %v", err) + return cfg + } - if a.config.UseManagedIdentityExtension { - cred, err = getACRDockerEntryFromARMToken(a, loginServer) + for ix := range result { + loginServer := getLoginServer(result[ix]) + glog.V(2).Infof("loginServer: %s", loginServer) + cred, err := getACRDockerEntryFromARMToken(a, loginServer) if err != nil { continue } - } else { - cred = &credentialprovider.DockerConfigEntry{ + cfg[loginServer] = *cred + } + } else { + // Add our entry for each of the supported container registry URLs + for _, url := range containerRegistryUrls { + cred := &credentialprovider.DockerConfigEntry{ Username: a.config.AADClientID, Password: a.config.AADClientSecret, Email: dummyRegistryEmail, } + cfg[url] = *cred } - - cfg[loginServer] = *cred } return cfg } diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD index 8f399596..e5d2704f 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/BUILD @@ -16,12 +16,12 @@ go_library( importpath = "k8s.io/kubernetes/pkg/credentialprovider/gcp", deps = [ "//pkg/credentialprovider:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/golang.org/x/oauth2:go_default_library", "//vendor/golang.org/x/oauth2/google:go_default_library", "//vendor/golang.org/x/oauth2/jwt:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", ], ) @@ -34,7 +34,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/credentialprovider:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugins.go b/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugins.go index 76c2e724..c817fefa 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/plugins.go @@ -17,6 +17,8 @@ limitations under the License. package credentialprovider import ( + "reflect" + "sort" "sync" "github.com/golang/glog" @@ -49,11 +51,17 @@ func NewDockerKeyring() DockerKeyring { Providers: make([]DockerConfigProvider, 0), } - // TODO(mattmoor): iterating over the map is non-deterministic. We should - // introduce the notion of priorities for conflict resolution. - for name, provider := range providers { + keys := reflect.ValueOf(providers).MapKeys() + stringKeys := make([]string, len(keys)) + for ix := range keys { + stringKeys[ix] = keys[ix].String() + } + sort.Strings(stringKeys) + + for _, key := range stringKeys { + provider := providers[key] if provider.Enabled() { - glog.V(4).Infof("Registering credential provider: %v", name) + glog.V(4).Infof("Registering credential provider: %v", key) keyring.Providers = append(keyring.Providers, provider) } } diff --git a/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD b/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD index 15d41a63..4dbe880d 100644 --- a/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/credentialprovider/secrets/BUILD @@ -7,7 +7,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/credentialprovider:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/features/BUILD b/vendor/k8s.io/kubernetes/pkg/features/BUILD index c88d15f2..b0c1c854 100644 --- a/vendor/k8s.io/kubernetes/pkg/features/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/features/BUILD @@ -10,9 +10,9 @@ go_library( srcs = ["kube_features.go"], importpath = "k8s.io/kubernetes/pkg/features", deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/features/kube_features.go b/vendor/k8s.io/kubernetes/pkg/features/kube_features.go index 855ede10..bb5cfd58 100644 --- a/vendor/k8s.io/kubernetes/pkg/features/kube_features.go +++ b/vendor/k8s.io/kubernetes/pkg/features/kube_features.go @@ -69,6 +69,7 @@ const ( // owner: @mikedanese // alpha: v1.7 + // beta: v1.12 // // Gets a server certificate for the kubelet from the Certificate Signing // Request API instead of generating one self signed and auto rotates the @@ -111,7 +112,7 @@ const ( DebugContainers utilfeature.Feature = "DebugContainers" // owner: @verb - // alpha: v1.10 + // beta: v1.12 // // Allows all containers in a pod to share a process namespace. PodShareProcessNamespace utilfeature.Feature = "PodShareProcessNamespace" @@ -129,14 +130,14 @@ const ( EnableEquivalenceClassCache utilfeature.Feature = "EnableEquivalenceClassCache" // owner: @k82cn - // alpha: v1.8 + // beta: v1.12 // // Taint nodes based on their condition status for 'NetworkUnavailable', // 'MemoryPressure', 'OutOfDisk' and 'DiskPressure'. TaintNodesByCondition utilfeature.Feature = "TaintNodesByCondition" // owner: @jsafrane - // beta: v1.10 + // GA: v1.12 // // Enable mount propagation of volumes. MountPropagation utilfeature.Feature = "MountPropagation" @@ -154,6 +155,12 @@ const ( // Alternative container-level CPU affinity policies. CPUManager utilfeature.Feature = "CPUManager" + // owner: @szuecs + // alpha: v1.12 + // + // Enable nodes to change CPUCFSQuotaPeriod + CPUCFSQuotaPeriod utilfeature.Feature = "CustomCPUCFSQuotaPeriod" + // owner: @derekwaynecarr // beta: v1.10 // @@ -172,13 +179,6 @@ const ( // Enable nodes to exclude themselves from service load balancers ServiceNodeExclusion utilfeature.Feature = "ServiceNodeExclusion" - // owner @brendandburns - // deprecated: v1.10 - // - // Enable the service proxy to contact external IP addresses. Note this feature is present - // only for backward compatibility, it will be removed in the 1.11 release. - ServiceProxyAllowExternalIPs utilfeature.Feature = "ServiceProxyAllowExternalIPs" - // owner: @jsafrane // alpha: v1.9 // @@ -193,11 +193,21 @@ const ( VolumeScheduling utilfeature.Feature = "VolumeScheduling" // owner: @vladimirvivien - // alpha: v1.9 + // beta: v1.10 // // Enable mount/attachment of Container Storage Interface (CSI) backed PVs CSIPersistentVolume utilfeature.Feature = "CSIPersistentVolume" + // owner: @saad-ali + // alpha: v1.12 + // Enable all logic related to the CSIDriver API object in csi.storage.k8s.io + CSIDriverRegistry utilfeature.Feature = "CSIDriverRegistry" + + // owner: @verult + // alpha: v1.12 + // Enable all logic related to the CSINodeInfo API object in csi.storage.k8s.io + CSINodeInfo utilfeature.Feature = "CSINodeInfo" + // owner @MrHohn // beta: v1.10 // @@ -240,27 +250,20 @@ const ( // Enable Hyper-V containers on Windows HyperVContainer utilfeature.Feature = "HyperVContainer" - // owner: @joelsmith - // deprecated: v1.10 - // - // Mount secret, configMap, downwardAPI and projected volumes ReadOnly. Note: this feature - // gate is present only for backward compatibility, it will be removed in the 1.11 release. - ReadOnlyAPIDataVolumes utilfeature.Feature = "ReadOnlyAPIDataVolumes" - // owner: @k82cn - // alpha: v1.10 + // beta: v1.12 // // Schedule DaemonSet Pods by default scheduler instead of DaemonSet controller ScheduleDaemonSetPods utilfeature.Feature = "ScheduleDaemonSetPods" // owner: @mikedanese - // alpha: v1.10 + // beta: v1.12 // // Implement TokenRequest endpoint on service account resources. TokenRequest utilfeature.Feature = "TokenRequest" // owner: @mikedanese - // alpha: v1.11 + // beta: v1.12 // // Enable ServiceAccountTokenVolumeProjection support in ProjectedVolumes. TokenRequestProjection utilfeature.Feature = "TokenRequestProjection" @@ -291,7 +294,7 @@ const ( VolumeSubpath utilfeature.Feature = "VolumeSubpath" // owner: @gnufied - // alpha : v1.11 + // beta : v1.12 // // Add support for volume plugins to report node specific // volume limits @@ -311,12 +314,6 @@ const ( // Support Pod Ready++ PodReadinessGates utilfeature.Feature = "PodReadinessGates" - // owner: @lichuqiang - // alpha: v1.11 - // - // Extend the default scheduler to be aware of volume topology and handle PV provisioning - DynamicProvisioningScheduling utilfeature.Feature = "DynamicProvisioningScheduling" - // owner: @kevtaylor // alpha: v1.11 // @@ -332,7 +329,7 @@ const ( KubeletPluginsWatcher utilfeature.Feature = "KubeletPluginsWatcher" // owner: @vikaschoudhary16 - // alpha: v1.11 + // beta: v1.12 // // // Enable resource quota scope selectors @@ -343,6 +340,43 @@ const ( // // Enables CSI to use raw block storage volumes CSIBlockVolume utilfeature.Feature = "CSIBlockVolume" + + // owner: @tallclair + // alpha: v1.12 + // + // Enables RuntimeClass, for selecting between multiple runtimes to run a pod. + RuntimeClass utilfeature.Feature = "RuntimeClass" + + // owner: @mtaufen + // alpha: v1.12 + // + // Kubelet uses the new Lease API to report node heartbeats, + // (Kube) Node Lifecycle Controller uses these heartbeats as a node health signal. + NodeLease utilfeature.Feature = "NodeLease" + + // owner: @janosi + // alpha: v1.12 + // + // Enables SCTP as new protocol for Service ports, NetworkPolicy, and ContainerPort in Pod/Containers definition + SCTPSupport utilfeature.Feature = "SCTPSupport" + + // owner: @xing-yang + // alpha: v1.12 + // + // Enable volume snapshot data source support. + VolumeSnapshotDataSource utilfeature.Feature = "VolumeSnapshotDataSource" + + // owner: @jessfraz + // alpha: v1.12 + // + // Enables control over ProcMountType for containers. + ProcMountType utilfeature.Feature = "ProcMountType" + + // owner: @janetkuo + // alpha: v1.12 + // + // Allow TTL controller to clean up Pods and Jobs after they finish. + TTLAfterFinished utilfeature.Feature = "TTLAfterFinished" ) func init() { @@ -359,27 +393,30 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS ExperimentalCriticalPodAnnotation: {Default: false, PreRelease: utilfeature.Alpha}, DevicePlugins: {Default: true, PreRelease: utilfeature.Beta}, TaintBasedEvictions: {Default: false, PreRelease: utilfeature.Alpha}, - RotateKubeletServerCertificate: {Default: false, PreRelease: utilfeature.Alpha}, + RotateKubeletServerCertificate: {Default: true, PreRelease: utilfeature.Beta}, RotateKubeletClientCertificate: {Default: true, PreRelease: utilfeature.Beta}, PersistentLocalVolumes: {Default: true, PreRelease: utilfeature.Beta}, LocalStorageCapacityIsolation: {Default: true, PreRelease: utilfeature.Beta}, HugePages: {Default: true, PreRelease: utilfeature.Beta}, Sysctls: {Default: true, PreRelease: utilfeature.Beta}, DebugContainers: {Default: false, PreRelease: utilfeature.Alpha}, - PodShareProcessNamespace: {Default: false, PreRelease: utilfeature.Alpha}, + PodShareProcessNamespace: {Default: true, PreRelease: utilfeature.Beta}, PodPriority: {Default: true, PreRelease: utilfeature.Beta}, EnableEquivalenceClassCache: {Default: false, PreRelease: utilfeature.Alpha}, - TaintNodesByCondition: {Default: false, PreRelease: utilfeature.Alpha}, - MountPropagation: {Default: true, PreRelease: utilfeature.Beta}, + TaintNodesByCondition: {Default: true, PreRelease: utilfeature.Beta}, + MountPropagation: {Default: true, PreRelease: utilfeature.GA}, QOSReserved: {Default: false, PreRelease: utilfeature.Alpha}, ExpandPersistentVolumes: {Default: true, PreRelease: utilfeature.Beta}, ExpandInUsePersistentVolumes: {Default: false, PreRelease: utilfeature.Alpha}, - AttachVolumeLimit: {Default: false, PreRelease: utilfeature.Alpha}, + AttachVolumeLimit: {Default: false, PreRelease: utilfeature.Beta}, CPUManager: {Default: true, PreRelease: utilfeature.Beta}, + CPUCFSQuotaPeriod: {Default: false, PreRelease: utilfeature.Alpha}, ServiceNodeExclusion: {Default: false, PreRelease: utilfeature.Alpha}, MountContainers: {Default: false, PreRelease: utilfeature.Alpha}, VolumeScheduling: {Default: true, PreRelease: utilfeature.Beta}, CSIPersistentVolume: {Default: true, PreRelease: utilfeature.Beta}, + CSIDriverRegistry: {Default: false, PreRelease: utilfeature.Alpha}, + CSINodeInfo: {Default: false, PreRelease: utilfeature.Alpha}, CustomPodDNS: {Default: true, PreRelease: utilfeature.Beta}, BlockVolume: {Default: false, PreRelease: utilfeature.Alpha}, StorageObjectInUseProtection: {Default: true, PreRelease: utilfeature.GA}, @@ -387,28 +424,34 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS SupportIPVSProxyMode: {Default: true, PreRelease: utilfeature.GA}, SupportPodPidsLimit: {Default: false, PreRelease: utilfeature.Alpha}, HyperVContainer: {Default: false, PreRelease: utilfeature.Alpha}, - ScheduleDaemonSetPods: {Default: false, PreRelease: utilfeature.Alpha}, - TokenRequest: {Default: false, PreRelease: utilfeature.Alpha}, - TokenRequestProjection: {Default: false, PreRelease: utilfeature.Alpha}, + ScheduleDaemonSetPods: {Default: true, PreRelease: utilfeature.Beta}, + TokenRequest: {Default: true, PreRelease: utilfeature.Beta}, + TokenRequestProjection: {Default: true, PreRelease: utilfeature.Beta}, CRIContainerLogRotation: {Default: true, PreRelease: utilfeature.Beta}, GCERegionalPersistentDisk: {Default: true, PreRelease: utilfeature.Beta}, RunAsGroup: {Default: false, PreRelease: utilfeature.Alpha}, VolumeSubpath: {Default: true, PreRelease: utilfeature.GA}, BalanceAttachedNodeVolumes: {Default: false, PreRelease: utilfeature.Alpha}, - DynamicProvisioningScheduling: {Default: false, PreRelease: utilfeature.Alpha}, - PodReadinessGates: {Default: false, PreRelease: utilfeature.Beta}, + PodReadinessGates: {Default: true, PreRelease: utilfeature.Beta}, VolumeSubpathEnvExpansion: {Default: false, PreRelease: utilfeature.Alpha}, - KubeletPluginsWatcher: {Default: false, PreRelease: utilfeature.Alpha}, - ResourceQuotaScopeSelectors: {Default: false, PreRelease: utilfeature.Alpha}, + KubeletPluginsWatcher: {Default: true, PreRelease: utilfeature.Beta}, + ResourceQuotaScopeSelectors: {Default: true, PreRelease: utilfeature.Beta}, CSIBlockVolume: {Default: false, PreRelease: utilfeature.Alpha}, + RuntimeClass: {Default: false, PreRelease: utilfeature.Alpha}, + NodeLease: {Default: false, PreRelease: utilfeature.Alpha}, + SCTPSupport: {Default: false, PreRelease: utilfeature.Alpha}, + VolumeSnapshotDataSource: {Default: false, PreRelease: utilfeature.Alpha}, + ProcMountType: {Default: false, PreRelease: utilfeature.Alpha}, + TTLAfterFinished: {Default: false, PreRelease: utilfeature.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: genericfeatures.StreamingProxyRedirects: {Default: true, PreRelease: utilfeature.Beta}, - genericfeatures.AdvancedAuditing: {Default: true, PreRelease: utilfeature.Beta}, + genericfeatures.AdvancedAuditing: {Default: true, PreRelease: utilfeature.GA}, genericfeatures.APIResponseCompression: {Default: false, PreRelease: utilfeature.Alpha}, genericfeatures.Initializers: {Default: false, PreRelease: utilfeature.Alpha}, genericfeatures.APIListChunking: {Default: true, PreRelease: utilfeature.Beta}, + genericfeatures.DryRun: {Default: false, PreRelease: utilfeature.Alpha}, // inherited features from apiextensions-apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: @@ -416,6 +459,5 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS apiextensionsfeatures.CustomResourceSubresources: {Default: true, PreRelease: utilfeature.Beta}, // features that enable backwards compatibility but are scheduled to be removed - ServiceProxyAllowExternalIPs: {Default: false, PreRelease: utilfeature.Deprecated}, - ReadOnlyAPIDataVolumes: {Default: true, PreRelease: utilfeature.Deprecated}, + // ... } diff --git a/vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD b/vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD index b3cde577..02583111 100644 --- a/vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/fieldpath/BUILD @@ -14,8 +14,9 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/fieldpath", deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", ], ) @@ -24,8 +25,8 @@ go_test( srcs = ["fieldpath_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/fieldpath/fieldpath.go b/vendor/k8s.io/kubernetes/pkg/fieldpath/fieldpath.go index 43754145..b997751e 100644 --- a/vendor/k8s.io/kubernetes/pkg/fieldpath/fieldpath.go +++ b/vendor/k8s.io/kubernetes/pkg/fieldpath/fieldpath.go @@ -21,13 +21,19 @@ import ( "strings" "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" ) // FormatMap formats map[string]string to a string. func FormatMap(m map[string]string) (fmtStr string) { - for key, value := range m { - fmtStr += fmt.Sprintf("%v=%q\n", key, value) + // output with keys in sorted order to provide stable output + keys := sets.NewString() + for key := range m { + keys.Insert(key) + } + for _, key := range keys.List() { + fmtStr += fmt.Sprintf("%v=%q\n", key, m[key]) } fmtStr = strings.TrimSuffix(fmtStr, "\n") diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD deleted file mode 100644 index d6c52d72..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/BUILD +++ /dev/null @@ -1,296 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "active_deadline.go", - "doc.go", - "kubelet.go", - "kubelet_getters.go", - "kubelet_network.go", - "kubelet_node_status.go", - "kubelet_pods.go", - "kubelet_resources.go", - "kubelet_volumes.go", - "oom_watcher.go", - "pod_container_deletor.go", - "pod_workers.go", - "reason_cache.go", - "runonce.go", - "runtime.go", - "util.go", - "volume_host.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/pods:go_default_library", - "//pkg/apis/core/v1:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/cloudprovider:go_default_library", - "//pkg/features:go_default_library", - "//pkg/fieldpath:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//pkg/kubelet/apis/cri:go_default_library", - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/certificate:go_default_library", - "//pkg/kubelet/checkpointmanager:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/dockershim:go_default_library", - "//pkg/kubelet/dockershim/remote:go_default_library", - "//pkg/kubelet/envvars:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/images:go_default_library", - "//pkg/kubelet/kubeletconfig:go_default_library", - "//pkg/kubelet/kuberuntime:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/logs:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/metrics/collectors:go_default_library", - "//pkg/kubelet/mountpod:go_default_library", - "//pkg/kubelet/network/dns:go_default_library", - "//pkg/kubelet/pleg:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/preemption:go_default_library", - "//pkg/kubelet/prober:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/remote:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/server:go_default_library", - "//pkg/kubelet/server/portforward:go_default_library", - "//pkg/kubelet/server/remotecommand:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/server/streaming:go_default_library", - "//pkg/kubelet/stats:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/sysctl:go_default_library", - "//pkg/kubelet/token:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/kubelet/util/manager:go_default_library", - "//pkg/kubelet/util/pluginwatcher:go_default_library", - "//pkg/kubelet/util/queue:go_default_library", - "//pkg/kubelet/util/sliceutils:go_default_library", - "//pkg/kubelet/volumemanager:go_default_library", - "//pkg/scheduler/algorithm:go_default_library", - "//pkg/scheduler/algorithm/predicates:go_default_library", - "//pkg/security/apparmor:go_default_library", - "//pkg/security/podsecuritypolicy/sysctl:go_default_library", - "//pkg/securitycontext:go_default_library", - "//pkg/util/dbus:go_default_library", - "//pkg/util/file:go_default_library", - "//pkg/util/io:go_default_library", - "//pkg/util/iptables:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/util/node:go_default_library", - "//pkg/util/oom:go_default_library", - "//pkg/util/removeall:go_default_library", - "//pkg/version:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csi:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//pkg/volume/validation:go_default_library", - "//third_party/forked/golang/expansion:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/github.com/google/cadvisor/events:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/certificate:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/client-go/util/integer:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "active_deadline_test.go", - "kubelet_getters_test.go", - "kubelet_network_test.go", - "kubelet_node_status_test.go", - "kubelet_pods_test.go", - "kubelet_resources_test.go", - "kubelet_test.go", - "kubelet_volumes_test.go", - "oom_watcher_test.go", - "pod_container_deletor_test.go", - "pod_workers_test.go", - "reason_cache_test.go", - "runonce_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "kubelet_pods_windows_test.go", - ], - "//conditions:default": [], - }), - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core/install:go_default_library", - "//pkg/capabilities:go_default_library", - "//pkg/cloudprovider/providers/fake:go_default_library", - "//pkg/kubelet/apis:go_default_library", - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/cadvisor/testing:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/images:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/logs:go_default_library", - "//pkg/kubelet/pleg:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/prober/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/server/portforward:go_default_library", - "//pkg/kubelet/server/remotecommand:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/stats:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/kubelet/token:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/queue:go_default_library", - "//pkg/kubelet/util/sliceutils:go_default_library", - "//pkg/kubelet/volumemanager:go_default_library", - "//pkg/scheduler/cache:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/version:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/aws_ebs:go_default_library", - "//pkg/volume/azure_dd:go_default_library", - "//pkg/volume/gce_pd:go_default_library", - "//pkg/volume/host_path:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/apis:all-srcs", - "//pkg/kubelet/cadvisor:all-srcs", - "//pkg/kubelet/certificate:all-srcs", - "//pkg/kubelet/checkpoint:all-srcs", - "//pkg/kubelet/checkpointmanager:all-srcs", - "//pkg/kubelet/client:all-srcs", - "//pkg/kubelet/cm:all-srcs", - "//pkg/kubelet/config:all-srcs", - "//pkg/kubelet/configmap:all-srcs", - "//pkg/kubelet/container:all-srcs", - "//pkg/kubelet/custommetrics:all-srcs", - "//pkg/kubelet/dockershim:all-srcs", - "//pkg/kubelet/envvars:all-srcs", - "//pkg/kubelet/events:all-srcs", - "//pkg/kubelet/eviction:all-srcs", - "//pkg/kubelet/images:all-srcs", - "//pkg/kubelet/kubeletconfig:all-srcs", - "//pkg/kubelet/kuberuntime:all-srcs", - "//pkg/kubelet/leaky:all-srcs", - "//pkg/kubelet/lifecycle:all-srcs", - "//pkg/kubelet/logs:all-srcs", - "//pkg/kubelet/metrics:all-srcs", - "//pkg/kubelet/mountpod:all-srcs", - "//pkg/kubelet/network:all-srcs", - "//pkg/kubelet/pleg:all-srcs", - "//pkg/kubelet/pod:all-srcs", - "//pkg/kubelet/preemption:all-srcs", - "//pkg/kubelet/prober:all-srcs", - "//pkg/kubelet/qos:all-srcs", - "//pkg/kubelet/remote:all-srcs", - "//pkg/kubelet/secret:all-srcs", - "//pkg/kubelet/server:all-srcs", - "//pkg/kubelet/stats:all-srcs", - "//pkg/kubelet/status:all-srcs", - "//pkg/kubelet/sysctl:all-srcs", - "//pkg/kubelet/token:all-srcs", - "//pkg/kubelet/types:all-srcs", - "//pkg/kubelet/util:all-srcs", - "//pkg/kubelet/volumemanager:all-srcs", - "//pkg/kubelet/winstats:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS deleted file mode 100644 index 82e510ea..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/OWNERS +++ /dev/null @@ -1,9 +0,0 @@ -approvers: -- Random-Liu -- dchen1107 -- derekwaynecarr -- tallclair -- vishh -- yujuhong -reviewers: -- sig-node-reviewers diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/active_deadline.go b/vendor/k8s.io/kubernetes/pkg/kubelet/active_deadline.go deleted file mode 100644 index f14024b9..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/active_deadline.go +++ /dev/null @@ -1,98 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "time" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/clock" - "k8s.io/client-go/tools/record" - "k8s.io/kubernetes/pkg/kubelet/lifecycle" - "k8s.io/kubernetes/pkg/kubelet/status" -) - -const ( - reason = "DeadlineExceeded" - message = "Pod was active on the node longer than the specified deadline" -) - -// activeDeadlineHandler knows how to enforce active deadlines on pods. -type activeDeadlineHandler struct { - // the clock to use for deadline enforcement - clock clock.Clock - // the provider of pod status - podStatusProvider status.PodStatusProvider - // the recorder to dispatch events when we identify a pod has exceeded active deadline - recorder record.EventRecorder -} - -// newActiveDeadlineHandler returns an active deadline handler that can enforce pod active deadline -func newActiveDeadlineHandler( - podStatusProvider status.PodStatusProvider, - recorder record.EventRecorder, - clock clock.Clock, -) (*activeDeadlineHandler, error) { - - // check for all required fields - if clock == nil || podStatusProvider == nil || recorder == nil { - return nil, fmt.Errorf("Required arguments must not be nil: %v, %v, %v", clock, podStatusProvider, recorder) - } - return &activeDeadlineHandler{ - clock: clock, - podStatusProvider: podStatusProvider, - recorder: recorder, - }, nil -} - -// ShouldSync returns true if the pod is past its active deadline. -func (m *activeDeadlineHandler) ShouldSync(pod *v1.Pod) bool { - return m.pastActiveDeadline(pod) -} - -// ShouldEvict returns true if the pod is past its active deadline. -// It dispatches an event that the pod should be evicted if it is past its deadline. -func (m *activeDeadlineHandler) ShouldEvict(pod *v1.Pod) lifecycle.ShouldEvictResponse { - if !m.pastActiveDeadline(pod) { - return lifecycle.ShouldEvictResponse{Evict: false} - } - m.recorder.Eventf(pod, v1.EventTypeNormal, reason, message) - return lifecycle.ShouldEvictResponse{Evict: true, Reason: reason, Message: message} -} - -// pastActiveDeadline returns true if the pod has been active for more than its ActiveDeadlineSeconds -func (m *activeDeadlineHandler) pastActiveDeadline(pod *v1.Pod) bool { - // no active deadline was specified - if pod.Spec.ActiveDeadlineSeconds == nil { - return false - } - // get the latest status to determine if it was started - podStatus, ok := m.podStatusProvider.GetPodStatus(pod.UID) - if !ok { - podStatus = pod.Status - } - // we have no start time so just return - if podStatus.StartTime.IsZero() { - return false - } - // determine if the deadline was exceeded - start := podStatus.StartTime.Time - duration := m.clock.Since(start) - allowedDuration := time.Duration(*pod.Spec.ActiveDeadlineSeconds) * time.Second - return duration >= allowedDuration -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD index 2a22e481..c4a2fb50 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/BUILD @@ -9,18 +9,14 @@ go_library( name = "go_default_library", srcs = [ "well_known_annotations.go", + "well_known_annotations_windows.go", "well_known_labels.go", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "well_known_annotations_windows.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/kubelet/apis", deps = select({ "@io_bazel_rules_go//go/platform:windows": [ "//pkg/features:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], "//conditions:default": [], }), @@ -37,11 +33,12 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//pkg/kubelet/apis/config:all-srcs", "//pkg/kubelet/apis/cri:all-srcs", "//pkg/kubelet/apis/deviceplugin/v1alpha:all-srcs", "//pkg/kubelet/apis/deviceplugin/v1beta1:all-srcs", - "//pkg/kubelet/apis/kubeletconfig:all-srcs", "//pkg/kubelet/apis/pluginregistration/v1alpha1:all-srcs", + "//pkg/kubelet/apis/pluginregistration/v1beta1:all-srcs", "//pkg/kubelet/apis/stats/v1alpha1:all-srcs", ], tags = ["automanaged"], diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD similarity index 50% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/BUILD rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD index 969efbc9..eab836ff 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD @@ -15,12 +15,12 @@ go_library( "types.go", "zz_generated.deepcopy.go", ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig", + importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", ], ) @@ -35,10 +35,10 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//pkg/kubelet/apis/kubeletconfig/fuzzer:all-srcs", - "//pkg/kubelet/apis/kubeletconfig/scheme:all-srcs", - "//pkg/kubelet/apis/kubeletconfig/v1beta1:all-srcs", - "//pkg/kubelet/apis/kubeletconfig/validation:all-srcs", + "//pkg/kubelet/apis/config/fuzzer:all-srcs", + "//pkg/kubelet/apis/config/scheme:all-srcs", + "//pkg/kubelet/apis/config/v1beta1:all-srcs", + "//pkg/kubelet/apis/config/validation:all-srcs", ], tags = ["automanaged"], ) @@ -48,7 +48,7 @@ go_test( srcs = ["helpers_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/OWNERS similarity index 100% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/OWNERS rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/OWNERS diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/doc.go similarity index 85% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/doc.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/doc.go index bd856d83..ad40e683 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/doc.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/doc.go @@ -15,5 +15,6 @@ limitations under the License. */ // +k8s:deepcopy-gen=package +// +groupName=kubelet.config.k8s.io -package kubeletconfig // import "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" +package config // import "k8s.io/kubernetes/pkg/kubelet/apis/config" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/helpers.go similarity index 98% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/helpers.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/helpers.go index 3563fb7f..0217fadb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/helpers.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubeletconfig +package config // KubeletConfigurationPathRefs returns pointers to all of the KubeletConfiguration fields that contain filepaths. // You might use this, for example, to resolve all relative paths against some common root before diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/register.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/register.go similarity index 66% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/register.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/register.go index 886f39de..cbebd990 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/register.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/register.go @@ -14,36 +14,28 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubeletconfig +package config import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) -var ( - SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) - AddToScheme = SchemeBuilder.AddToScheme -) - -// GroupName is the group name use in this package +// GroupName is the group name used in this package const GroupName = "kubelet.config.k8s.io" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal} -// Kind takes an unqualified kind and returns a Group qualified GroupKind -func Kind(kind string) schema.GroupKind { - return SchemeGroupVersion.WithKind(kind).GroupKind() -} - -// Resource takes an unqualified resource and returns a Group qualified GroupResource -func Resource(resource string) schema.GroupResource { - return SchemeGroupVersion.WithResource(resource).GroupResource() -} +var ( + // SchemeBuilder is the scheme builder with scheme init functions to run for this API package + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + // AddToScheme is a global function that registers this API group & version to a scheme + AddToScheme = SchemeBuilder.AddToScheme +) +// addKnownTypes registers known types to the given scheme func addKnownTypes(scheme *runtime.Scheme) error { - // TODO this will get cleaned up with the scheme types are fixed scheme.AddKnownTypes(SchemeGroupVersion, &KubeletConfiguration{}, &SerializedNodeConfigSource{}, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/BUILD similarity index 53% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme/BUILD rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/BUILD index 246d476b..bf40b15a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/BUILD @@ -3,13 +3,13 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = ["scheme.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme", + importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme", visibility = ["//visibility:public"], deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", + "//pkg/kubelet/apis/config/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", ], ) @@ -32,7 +32,7 @@ go_test( srcs = ["scheme_test.go"], embed = [":go_default_library"], deps = [ - "//pkg/kubelet/apis/kubeletconfig/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", + "//pkg/kubelet/apis/config/fuzzer:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme/scheme.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/scheme.go similarity index 85% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme/scheme.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/scheme.go index 2afd7531..2c7c3e51 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme/scheme.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/scheme/scheme.go @@ -19,8 +19,8 @@ package scheme import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" + kubeletconfigv1beta1 "k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1" ) // Utility functions for the Kubelet's kubeletconfig API group @@ -32,7 +32,7 @@ func NewSchemeAndCodecs() (*runtime.Scheme, *serializer.CodecFactory, error) { if err := kubeletconfig.AddToScheme(scheme); err != nil { return nil, nil, err } - if err := v1beta1.AddToScheme(scheme); err != nil { + if err := kubeletconfigv1beta1.AddToScheme(scheme); err != nil { return nil, nil, err } codecs := serializer.NewCodecFactory(scheme) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go similarity index 93% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/types.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go index 4b220981..ab232157 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/types.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubeletconfig +package config import ( "k8s.io/api/core/v1" @@ -39,6 +39,23 @@ const ( HairpinNone = "none" ) +// ResourceChangeDetectionStrategy denotes a mode in which internal +// managers (secret, configmap) are discovering object changes. +type ResourceChangeDetectionStrategy string + +// Enum settings for different strategies of kubelet managers. +const ( + // GetChangeDetectionStrategy is a mode in which kubelet fetches + // necessary objects directly from apiserver. + GetChangeDetectionStrategy ResourceChangeDetectionStrategy = "Get" + // TTLCacheChangeDetectionStrategy is a mode in which kubelet uses + // ttl cache for object directly fetched from apiserver. + TTLCacheChangeDetectionStrategy ResourceChangeDetectionStrategy = "Cache" + // WatchChangeDetectionStrategy is a mode in which kubelet uses + // watches to observe changes to objects that are in its interest. + WatchChangeDetectionStrategy ResourceChangeDetectionStrategy = "Watch" +) + // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // KubeletConfiguration contains the configuration for the Kubelet @@ -138,6 +155,8 @@ type KubeletConfiguration struct { // status to master. Note: be cautious when changing the constant, it // must work with nodeMonitorGracePeriod in nodecontroller. NodeStatusUpdateFrequency metav1.Duration + // nodeLeaseDurationSeconds is the duration the Kubelet will set on its corresponding Lease. + NodeLeaseDurationSeconds int32 // imageMinimumGCAge is the minimum age for an unused image before it is // garbage collected. ImageMinimumGCAge metav1.Duration @@ -201,6 +220,8 @@ type KubeletConfiguration struct { // cpuCFSQuota enables CPU CFS quota enforcement for containers that // specify CPU limits CPUCFSQuota bool + // CPUCFSQuotaPeriod sets the CPU CFS quota period value, cpu.cfs_period_us, defaults to 100ms + CPUCFSQuotaPeriod metav1.Duration // maxOpenFiles is Number of files that can be opened by Kubelet process. MaxOpenFiles int64 // contentType is contentType of requests sent to apiserver. @@ -259,6 +280,8 @@ type KubeletConfiguration struct { ContainerLogMaxSize string // Maximum number of container log files that can be present for a container. ContainerLogMaxFiles int32 + // ConfigMapAndSecretChangeDetectionStrategy is a mode in which config map and secret managers are running. + ConfigMapAndSecretChangeDetectionStrategy ResourceChangeDetectionStrategy /* the following fields are meant for Node Allocatable */ diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD similarity index 55% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/BUILD rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD index c45da80c..c747871a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD @@ -9,25 +9,26 @@ go_library( name = "go_default_library", srcs = [ "defaults.go", + "defaults_linux.go", + "defaults_others.go", "doc.go", "register.go", - "types.go", "zz_generated.conversion.go", "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1", + importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1", deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/qos:go_default_library", "//pkg/kubelet/types:go_default_library", "//pkg/master/ports:go_default_library", - "//pkg/util/pointer:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/defaults.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go similarity index 86% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/defaults.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go index b8d6bb32..d5a12f33 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go @@ -21,19 +21,23 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kruntime "k8s.io/apimachinery/pkg/runtime" + kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1" + // TODO: Cut references to k8s.io/kubernetes, eventually there should be none from this package "k8s.io/kubernetes/pkg/kubelet/qos" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/kubernetes/pkg/master/ports" - utilpointer "k8s.io/kubernetes/pkg/util/pointer" + utilpointer "k8s.io/utils/pointer" ) const ( + // TODO: Move these constants to k8s.io/kubelet/config/v1beta1 instead? DefaultIPTablesMasqueradeBit = 14 DefaultIPTablesDropBit = 15 ) var ( zeroDuration = metav1.Duration{} + // TODO: Move these constants to k8s.io/kubelet/config/v1beta1 instead? // Refer to [Node Allocatable](https://git.k8s.io/community/contributors/design-proposals/node/node-allocatable.md) doc for more information. DefaultNodeAllocatableEnforcement = []string{"pods"} ) @@ -42,7 +46,7 @@ func addDefaultingFuncs(scheme *kruntime.Scheme) error { return RegisterDefaults(scheme) } -func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { +func SetDefaults_KubeletConfiguration(obj *kubeletconfigv1beta1.KubeletConfiguration) { if obj.SyncFrequency == zeroDuration { obj.SyncFrequency = metav1.Duration{Duration: 1 * time.Minute} } @@ -68,7 +72,7 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { obj.Authentication.Webhook.CacheTTL = metav1.Duration{Duration: 2 * time.Minute} } if obj.Authorization.Mode == "" { - obj.Authorization.Mode = KubeletAuthorizationModeWebhook + obj.Authorization.Mode = kubeletconfigv1beta1.KubeletAuthorizationModeWebhook } if obj.Authorization.Webhook.CacheAuthorizedTTL == zeroDuration { obj.Authorization.Webhook.CacheAuthorizedTTL = metav1.Duration{Duration: 5 * time.Minute} @@ -106,6 +110,9 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { if obj.NodeStatusUpdateFrequency == zeroDuration { obj.NodeStatusUpdateFrequency = metav1.Duration{Duration: 10 * time.Second} } + if obj.NodeLeaseDurationSeconds == 0 { + obj.NodeLeaseDurationSeconds = 40 + } if obj.ImageMinimumGCAge == zeroDuration { obj.ImageMinimumGCAge = metav1.Duration{Duration: 2 * time.Minute} } @@ -136,7 +143,7 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { obj.RuntimeRequestTimeout = metav1.Duration{Duration: 2 * time.Minute} } if obj.HairpinMode == "" { - obj.HairpinMode = PromiscuousBridge + obj.HairpinMode = kubeletconfigv1beta1.PromiscuousBridge } if obj.MaxPods == 0 { obj.MaxPods = 110 @@ -151,6 +158,9 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { if obj.CPUCFSQuota == nil { obj.CPUCFSQuota = utilpointer.BoolPtr(true) } + if obj.CPUCFSQuotaPeriod == nil { + obj.CPUCFSQuotaPeriod = &metav1.Duration{Duration: 100 * time.Millisecond} + } if obj.MaxOpenFiles == 0 { obj.MaxOpenFiles = 1000000 } @@ -167,12 +177,7 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { obj.SerializeImagePulls = utilpointer.BoolPtr(true) } if obj.EvictionHard == nil { - obj.EvictionHard = map[string]string{ - "memory.available": "100Mi", - "nodefs.available": "10%", - "nodefs.inodesFree": "5%", - "imagefs.available": "15%", - } + obj.EvictionHard = DefaultEvictionHard } if obj.EvictionPressureTransitionPeriod == zeroDuration { obj.EvictionPressureTransitionPeriod = metav1.Duration{Duration: 5 * time.Minute} @@ -198,6 +203,9 @@ func SetDefaults_KubeletConfiguration(obj *KubeletConfiguration) { if obj.ContainerLogMaxFiles == nil { obj.ContainerLogMaxFiles = utilpointer.Int32Ptr(5) } + if obj.ConfigMapAndSecretChangeDetectionStrategy == "" { + obj.ConfigMapAndSecretChangeDetectionStrategy = kubeletconfigv1beta1.WatchChangeDetectionStrategy + } if obj.EnforceNodeAllocatable == nil { obj.EnforceNodeAllocatable = DefaultNodeAllocatableEnforcement } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults_linux.go similarity index 67% rename from vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager_stub.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults_linux.go index a6e0729f..7e1060a0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults_linux.go @@ -1,3 +1,5 @@ +// +build linux + /* Copyright 2018 The Kubernetes Authors. @@ -14,13 +16,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package logs - -type containerLogManagerStub struct{} - -func (*containerLogManagerStub) Start() {} +package v1beta1 -// NewStubContainerLogManager returns an empty ContainerLogManager which does nothing. -func NewStubContainerLogManager() ContainerLogManager { - return &containerLogManagerStub{} +// DefaultEvictionHard includes default options for hard eviction. +var DefaultEvictionHard = map[string]string{ + "memory.available": "100Mi", + "nodefs.available": "10%", + "nodefs.inodesFree": "5%", + "imagefs.available": "15%", } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults_others.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults_others.go new file mode 100644 index 00000000..74464a3c --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults_others.go @@ -0,0 +1,26 @@ +// +build !linux + +/* +Copyright 2018 The Kubernetes Authors. + +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 v1beta1 + +// DefaultEvictionHard includes default options for hard eviction. +var DefaultEvictionHard = map[string]string{ + "memory.available": "100Mi", + "nodefs.available": "10%", + "imagefs.available": "15%", +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/doc.go new file mode 100644 index 00000000..cd542f14 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/doc.go @@ -0,0 +1,24 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:conversion-gen=k8s.io/kubernetes/pkg/kubelet/apis/config +// +k8s:conversion-gen-external-types=k8s.io/kubelet/config/v1beta1 +// +k8s:defaulter-gen=TypeMeta +// +k8s:defaulter-gen-input=../../../../../vendor/k8s.io/kubelet/config/v1beta1 +// +groupName=kubelet.config.k8s.io + +package v1beta1 // import "k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/register.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/register.go similarity index 64% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/register.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/register.go index 4c6b2931..1b981b57 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/register.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/register.go @@ -17,35 +17,27 @@ limitations under the License. package v1beta1 import ( - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1" ) -// GroupName is the group name use in this package +// GroupName is the group name used in this package const GroupName = "kubelet.config.k8s.io" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} var ( - // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. - // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. - SchemeBuilder runtime.SchemeBuilder - localSchemeBuilder = &SchemeBuilder - AddToScheme = localSchemeBuilder.AddToScheme + // localSchemeBuilder extends the SchemeBuilder instance with the external types. In this package, + // defaulting and conversion init funcs are registered as well. + localSchemeBuilder = &kubeletconfigv1beta1.SchemeBuilder + // AddToScheme is a global function that registers this API group & version to a scheme + AddToScheme = localSchemeBuilder.AddToScheme ) func init() { // We only register manually written functions here. The registration of the // generated functions takes place in the generated files. The separation // makes the code compile even when the generated files are missing. - localSchemeBuilder.Register(addKnownTypes, addDefaultingFuncs) -} - -func addKnownTypes(scheme *runtime.Scheme) error { - scheme.AddKnownTypes(SchemeGroupVersion, - &KubeletConfiguration{}, - &SerializedNodeConfigSource{}, - ) - return nil + localSchemeBuilder.Register(addDefaultingFuncs) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go new file mode 100644 index 00000000..9e67bf9e --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go @@ -0,0 +1,553 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by conversion-gen. DO NOT EDIT. + +package v1beta1 + +import ( + unsafe "unsafe" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + v1beta1 "k8s.io/kubelet/config/v1beta1" + config "k8s.io/kubernetes/pkg/kubelet/apis/config" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(s *runtime.Scheme) error { + if err := s.AddGeneratedConversionFunc((*v1beta1.KubeletAnonymousAuthentication)(nil), (*config.KubeletAnonymousAuthentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeletAnonymousAuthentication_To_config_KubeletAnonymousAuthentication(a.(*v1beta1.KubeletAnonymousAuthentication), b.(*config.KubeletAnonymousAuthentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.KubeletAnonymousAuthentication)(nil), (*v1beta1.KubeletAnonymousAuthentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(a.(*config.KubeletAnonymousAuthentication), b.(*v1beta1.KubeletAnonymousAuthentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.KubeletAuthentication)(nil), (*config.KubeletAuthentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeletAuthentication_To_config_KubeletAuthentication(a.(*v1beta1.KubeletAuthentication), b.(*config.KubeletAuthentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.KubeletAuthentication)(nil), (*v1beta1.KubeletAuthentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_KubeletAuthentication_To_v1beta1_KubeletAuthentication(a.(*config.KubeletAuthentication), b.(*v1beta1.KubeletAuthentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.KubeletAuthorization)(nil), (*config.KubeletAuthorization)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeletAuthorization_To_config_KubeletAuthorization(a.(*v1beta1.KubeletAuthorization), b.(*config.KubeletAuthorization), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.KubeletAuthorization)(nil), (*v1beta1.KubeletAuthorization)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_KubeletAuthorization_To_v1beta1_KubeletAuthorization(a.(*config.KubeletAuthorization), b.(*v1beta1.KubeletAuthorization), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.KubeletConfiguration)(nil), (*config.KubeletConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(a.(*v1beta1.KubeletConfiguration), b.(*config.KubeletConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.KubeletConfiguration)(nil), (*v1beta1.KubeletConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(a.(*config.KubeletConfiguration), b.(*v1beta1.KubeletConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.KubeletWebhookAuthentication)(nil), (*config.KubeletWebhookAuthentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeletWebhookAuthentication_To_config_KubeletWebhookAuthentication(a.(*v1beta1.KubeletWebhookAuthentication), b.(*config.KubeletWebhookAuthentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.KubeletWebhookAuthentication)(nil), (*v1beta1.KubeletWebhookAuthentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(a.(*config.KubeletWebhookAuthentication), b.(*v1beta1.KubeletWebhookAuthentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.KubeletWebhookAuthorization)(nil), (*config.KubeletWebhookAuthorization)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeletWebhookAuthorization_To_config_KubeletWebhookAuthorization(a.(*v1beta1.KubeletWebhookAuthorization), b.(*config.KubeletWebhookAuthorization), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.KubeletWebhookAuthorization)(nil), (*v1beta1.KubeletWebhookAuthorization)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(a.(*config.KubeletWebhookAuthorization), b.(*v1beta1.KubeletWebhookAuthorization), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.KubeletX509Authentication)(nil), (*config.KubeletX509Authentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeletX509Authentication_To_config_KubeletX509Authentication(a.(*v1beta1.KubeletX509Authentication), b.(*config.KubeletX509Authentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.KubeletX509Authentication)(nil), (*v1beta1.KubeletX509Authentication)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(a.(*config.KubeletX509Authentication), b.(*v1beta1.KubeletX509Authentication), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*v1beta1.SerializedNodeConfigSource)(nil), (*config.SerializedNodeConfigSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_SerializedNodeConfigSource_To_config_SerializedNodeConfigSource(a.(*v1beta1.SerializedNodeConfigSource), b.(*config.SerializedNodeConfigSource), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.SerializedNodeConfigSource)(nil), (*v1beta1.SerializedNodeConfigSource)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource(a.(*config.SerializedNodeConfigSource), b.(*v1beta1.SerializedNodeConfigSource), scope) + }); err != nil { + return err + } + return nil +} + +func autoConvert_v1beta1_KubeletAnonymousAuthentication_To_config_KubeletAnonymousAuthentication(in *v1beta1.KubeletAnonymousAuthentication, out *config.KubeletAnonymousAuthentication, s conversion.Scope) error { + if err := v1.Convert_Pointer_bool_To_bool(&in.Enabled, &out.Enabled, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta1_KubeletAnonymousAuthentication_To_config_KubeletAnonymousAuthentication is an autogenerated conversion function. +func Convert_v1beta1_KubeletAnonymousAuthentication_To_config_KubeletAnonymousAuthentication(in *v1beta1.KubeletAnonymousAuthentication, out *config.KubeletAnonymousAuthentication, s conversion.Scope) error { + return autoConvert_v1beta1_KubeletAnonymousAuthentication_To_config_KubeletAnonymousAuthentication(in, out, s) +} + +func autoConvert_config_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(in *config.KubeletAnonymousAuthentication, out *v1beta1.KubeletAnonymousAuthentication, s conversion.Scope) error { + if err := v1.Convert_bool_To_Pointer_bool(&in.Enabled, &out.Enabled, s); err != nil { + return err + } + return nil +} + +// Convert_config_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication is an autogenerated conversion function. +func Convert_config_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(in *config.KubeletAnonymousAuthentication, out *v1beta1.KubeletAnonymousAuthentication, s conversion.Scope) error { + return autoConvert_config_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(in, out, s) +} + +func autoConvert_v1beta1_KubeletAuthentication_To_config_KubeletAuthentication(in *v1beta1.KubeletAuthentication, out *config.KubeletAuthentication, s conversion.Scope) error { + if err := Convert_v1beta1_KubeletX509Authentication_To_config_KubeletX509Authentication(&in.X509, &out.X509, s); err != nil { + return err + } + if err := Convert_v1beta1_KubeletWebhookAuthentication_To_config_KubeletWebhookAuthentication(&in.Webhook, &out.Webhook, s); err != nil { + return err + } + if err := Convert_v1beta1_KubeletAnonymousAuthentication_To_config_KubeletAnonymousAuthentication(&in.Anonymous, &out.Anonymous, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta1_KubeletAuthentication_To_config_KubeletAuthentication is an autogenerated conversion function. +func Convert_v1beta1_KubeletAuthentication_To_config_KubeletAuthentication(in *v1beta1.KubeletAuthentication, out *config.KubeletAuthentication, s conversion.Scope) error { + return autoConvert_v1beta1_KubeletAuthentication_To_config_KubeletAuthentication(in, out, s) +} + +func autoConvert_config_KubeletAuthentication_To_v1beta1_KubeletAuthentication(in *config.KubeletAuthentication, out *v1beta1.KubeletAuthentication, s conversion.Scope) error { + if err := Convert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(&in.X509, &out.X509, s); err != nil { + return err + } + if err := Convert_config_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(&in.Webhook, &out.Webhook, s); err != nil { + return err + } + if err := Convert_config_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(&in.Anonymous, &out.Anonymous, s); err != nil { + return err + } + return nil +} + +// Convert_config_KubeletAuthentication_To_v1beta1_KubeletAuthentication is an autogenerated conversion function. +func Convert_config_KubeletAuthentication_To_v1beta1_KubeletAuthentication(in *config.KubeletAuthentication, out *v1beta1.KubeletAuthentication, s conversion.Scope) error { + return autoConvert_config_KubeletAuthentication_To_v1beta1_KubeletAuthentication(in, out, s) +} + +func autoConvert_v1beta1_KubeletAuthorization_To_config_KubeletAuthorization(in *v1beta1.KubeletAuthorization, out *config.KubeletAuthorization, s conversion.Scope) error { + out.Mode = config.KubeletAuthorizationMode(in.Mode) + if err := Convert_v1beta1_KubeletWebhookAuthorization_To_config_KubeletWebhookAuthorization(&in.Webhook, &out.Webhook, s); err != nil { + return err + } + return nil +} + +// Convert_v1beta1_KubeletAuthorization_To_config_KubeletAuthorization is an autogenerated conversion function. +func Convert_v1beta1_KubeletAuthorization_To_config_KubeletAuthorization(in *v1beta1.KubeletAuthorization, out *config.KubeletAuthorization, s conversion.Scope) error { + return autoConvert_v1beta1_KubeletAuthorization_To_config_KubeletAuthorization(in, out, s) +} + +func autoConvert_config_KubeletAuthorization_To_v1beta1_KubeletAuthorization(in *config.KubeletAuthorization, out *v1beta1.KubeletAuthorization, s conversion.Scope) error { + out.Mode = v1beta1.KubeletAuthorizationMode(in.Mode) + if err := Convert_config_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(&in.Webhook, &out.Webhook, s); err != nil { + return err + } + return nil +} + +// Convert_config_KubeletAuthorization_To_v1beta1_KubeletAuthorization is an autogenerated conversion function. +func Convert_config_KubeletAuthorization_To_v1beta1_KubeletAuthorization(in *config.KubeletAuthorization, out *v1beta1.KubeletAuthorization, s conversion.Scope) error { + return autoConvert_config_KubeletAuthorization_To_v1beta1_KubeletAuthorization(in, out, s) +} + +func autoConvert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(in *v1beta1.KubeletConfiguration, out *config.KubeletConfiguration, s conversion.Scope) error { + out.StaticPodPath = in.StaticPodPath + out.SyncFrequency = in.SyncFrequency + out.FileCheckFrequency = in.FileCheckFrequency + out.HTTPCheckFrequency = in.HTTPCheckFrequency + out.StaticPodURL = in.StaticPodURL + out.StaticPodURLHeader = *(*map[string][]string)(unsafe.Pointer(&in.StaticPodURLHeader)) + out.Address = in.Address + out.Port = in.Port + out.ReadOnlyPort = in.ReadOnlyPort + out.TLSCertFile = in.TLSCertFile + out.TLSPrivateKeyFile = in.TLSPrivateKeyFile + out.TLSCipherSuites = *(*[]string)(unsafe.Pointer(&in.TLSCipherSuites)) + out.TLSMinVersion = in.TLSMinVersion + out.RotateCertificates = in.RotateCertificates + out.ServerTLSBootstrap = in.ServerTLSBootstrap + if err := Convert_v1beta1_KubeletAuthentication_To_config_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { + return err + } + if err := Convert_v1beta1_KubeletAuthorization_To_config_KubeletAuthorization(&in.Authorization, &out.Authorization, s); err != nil { + return err + } + if err := v1.Convert_Pointer_int32_To_int32(&in.RegistryPullQPS, &out.RegistryPullQPS, s); err != nil { + return err + } + out.RegistryBurst = in.RegistryBurst + if err := v1.Convert_Pointer_int32_To_int32(&in.EventRecordQPS, &out.EventRecordQPS, s); err != nil { + return err + } + out.EventBurst = in.EventBurst + if err := v1.Convert_Pointer_bool_To_bool(&in.EnableDebuggingHandlers, &out.EnableDebuggingHandlers, s); err != nil { + return err + } + out.EnableContentionProfiling = in.EnableContentionProfiling + if err := v1.Convert_Pointer_int32_To_int32(&in.HealthzPort, &out.HealthzPort, s); err != nil { + return err + } + out.HealthzBindAddress = in.HealthzBindAddress + if err := v1.Convert_Pointer_int32_To_int32(&in.OOMScoreAdj, &out.OOMScoreAdj, s); err != nil { + return err + } + out.ClusterDomain = in.ClusterDomain + out.ClusterDNS = *(*[]string)(unsafe.Pointer(&in.ClusterDNS)) + out.StreamingConnectionIdleTimeout = in.StreamingConnectionIdleTimeout + out.NodeStatusUpdateFrequency = in.NodeStatusUpdateFrequency + out.NodeLeaseDurationSeconds = in.NodeLeaseDurationSeconds + out.ImageMinimumGCAge = in.ImageMinimumGCAge + if err := v1.Convert_Pointer_int32_To_int32(&in.ImageGCHighThresholdPercent, &out.ImageGCHighThresholdPercent, s); err != nil { + return err + } + if err := v1.Convert_Pointer_int32_To_int32(&in.ImageGCLowThresholdPercent, &out.ImageGCLowThresholdPercent, s); err != nil { + return err + } + out.VolumeStatsAggPeriod = in.VolumeStatsAggPeriod + out.KubeletCgroups = in.KubeletCgroups + out.SystemCgroups = in.SystemCgroups + out.CgroupRoot = in.CgroupRoot + if err := v1.Convert_Pointer_bool_To_bool(&in.CgroupsPerQOS, &out.CgroupsPerQOS, s); err != nil { + return err + } + out.CgroupDriver = in.CgroupDriver + out.CPUManagerPolicy = in.CPUManagerPolicy + out.CPUManagerReconcilePeriod = in.CPUManagerReconcilePeriod + out.QOSReserved = *(*map[string]string)(unsafe.Pointer(&in.QOSReserved)) + out.RuntimeRequestTimeout = in.RuntimeRequestTimeout + out.HairpinMode = in.HairpinMode + out.MaxPods = in.MaxPods + out.PodCIDR = in.PodCIDR + if err := v1.Convert_Pointer_int64_To_int64(&in.PodPidsLimit, &out.PodPidsLimit, s); err != nil { + return err + } + out.ResolverConfig = in.ResolverConfig + if err := v1.Convert_Pointer_bool_To_bool(&in.CPUCFSQuota, &out.CPUCFSQuota, s); err != nil { + return err + } + if err := v1.Convert_Pointer_v1_Duration_To_v1_Duration(&in.CPUCFSQuotaPeriod, &out.CPUCFSQuotaPeriod, s); err != nil { + return err + } + out.MaxOpenFiles = in.MaxOpenFiles + out.ContentType = in.ContentType + if err := v1.Convert_Pointer_int32_To_int32(&in.KubeAPIQPS, &out.KubeAPIQPS, s); err != nil { + return err + } + out.KubeAPIBurst = in.KubeAPIBurst + if err := v1.Convert_Pointer_bool_To_bool(&in.SerializeImagePulls, &out.SerializeImagePulls, s); err != nil { + return err + } + out.EvictionHard = *(*map[string]string)(unsafe.Pointer(&in.EvictionHard)) + out.EvictionSoft = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoft)) + out.EvictionSoftGracePeriod = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoftGracePeriod)) + out.EvictionPressureTransitionPeriod = in.EvictionPressureTransitionPeriod + out.EvictionMaxPodGracePeriod = in.EvictionMaxPodGracePeriod + out.EvictionMinimumReclaim = *(*map[string]string)(unsafe.Pointer(&in.EvictionMinimumReclaim)) + out.PodsPerCore = in.PodsPerCore + if err := v1.Convert_Pointer_bool_To_bool(&in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach, s); err != nil { + return err + } + out.ProtectKernelDefaults = in.ProtectKernelDefaults + if err := v1.Convert_Pointer_bool_To_bool(&in.MakeIPTablesUtilChains, &out.MakeIPTablesUtilChains, s); err != nil { + return err + } + if err := v1.Convert_Pointer_int32_To_int32(&in.IPTablesMasqueradeBit, &out.IPTablesMasqueradeBit, s); err != nil { + return err + } + if err := v1.Convert_Pointer_int32_To_int32(&in.IPTablesDropBit, &out.IPTablesDropBit, s); err != nil { + return err + } + out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) + if err := v1.Convert_Pointer_bool_To_bool(&in.FailSwapOn, &out.FailSwapOn, s); err != nil { + return err + } + out.ContainerLogMaxSize = in.ContainerLogMaxSize + if err := v1.Convert_Pointer_int32_To_int32(&in.ContainerLogMaxFiles, &out.ContainerLogMaxFiles, s); err != nil { + return err + } + out.ConfigMapAndSecretChangeDetectionStrategy = config.ResourceChangeDetectionStrategy(in.ConfigMapAndSecretChangeDetectionStrategy) + out.SystemReserved = *(*map[string]string)(unsafe.Pointer(&in.SystemReserved)) + out.KubeReserved = *(*map[string]string)(unsafe.Pointer(&in.KubeReserved)) + out.SystemReservedCgroup = in.SystemReservedCgroup + out.KubeReservedCgroup = in.KubeReservedCgroup + out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) + return nil +} + +// Convert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration is an autogenerated conversion function. +func Convert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(in *v1beta1.KubeletConfiguration, out *config.KubeletConfiguration, s conversion.Scope) error { + return autoConvert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(in, out, s) +} + +func autoConvert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in *config.KubeletConfiguration, out *v1beta1.KubeletConfiguration, s conversion.Scope) error { + out.StaticPodPath = in.StaticPodPath + out.SyncFrequency = in.SyncFrequency + out.FileCheckFrequency = in.FileCheckFrequency + out.HTTPCheckFrequency = in.HTTPCheckFrequency + out.StaticPodURL = in.StaticPodURL + out.StaticPodURLHeader = *(*map[string][]string)(unsafe.Pointer(&in.StaticPodURLHeader)) + out.Address = in.Address + out.Port = in.Port + out.ReadOnlyPort = in.ReadOnlyPort + out.TLSCertFile = in.TLSCertFile + out.TLSPrivateKeyFile = in.TLSPrivateKeyFile + out.TLSCipherSuites = *(*[]string)(unsafe.Pointer(&in.TLSCipherSuites)) + out.TLSMinVersion = in.TLSMinVersion + out.RotateCertificates = in.RotateCertificates + out.ServerTLSBootstrap = in.ServerTLSBootstrap + if err := Convert_config_KubeletAuthentication_To_v1beta1_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { + return err + } + if err := Convert_config_KubeletAuthorization_To_v1beta1_KubeletAuthorization(&in.Authorization, &out.Authorization, s); err != nil { + return err + } + if err := v1.Convert_int32_To_Pointer_int32(&in.RegistryPullQPS, &out.RegistryPullQPS, s); err != nil { + return err + } + out.RegistryBurst = in.RegistryBurst + if err := v1.Convert_int32_To_Pointer_int32(&in.EventRecordQPS, &out.EventRecordQPS, s); err != nil { + return err + } + out.EventBurst = in.EventBurst + if err := v1.Convert_bool_To_Pointer_bool(&in.EnableDebuggingHandlers, &out.EnableDebuggingHandlers, s); err != nil { + return err + } + out.EnableContentionProfiling = in.EnableContentionProfiling + if err := v1.Convert_int32_To_Pointer_int32(&in.HealthzPort, &out.HealthzPort, s); err != nil { + return err + } + out.HealthzBindAddress = in.HealthzBindAddress + if err := v1.Convert_int32_To_Pointer_int32(&in.OOMScoreAdj, &out.OOMScoreAdj, s); err != nil { + return err + } + out.ClusterDomain = in.ClusterDomain + out.ClusterDNS = *(*[]string)(unsafe.Pointer(&in.ClusterDNS)) + out.StreamingConnectionIdleTimeout = in.StreamingConnectionIdleTimeout + out.NodeStatusUpdateFrequency = in.NodeStatusUpdateFrequency + out.NodeLeaseDurationSeconds = in.NodeLeaseDurationSeconds + out.ImageMinimumGCAge = in.ImageMinimumGCAge + if err := v1.Convert_int32_To_Pointer_int32(&in.ImageGCHighThresholdPercent, &out.ImageGCHighThresholdPercent, s); err != nil { + return err + } + if err := v1.Convert_int32_To_Pointer_int32(&in.ImageGCLowThresholdPercent, &out.ImageGCLowThresholdPercent, s); err != nil { + return err + } + out.VolumeStatsAggPeriod = in.VolumeStatsAggPeriod + out.KubeletCgroups = in.KubeletCgroups + out.SystemCgroups = in.SystemCgroups + out.CgroupRoot = in.CgroupRoot + if err := v1.Convert_bool_To_Pointer_bool(&in.CgroupsPerQOS, &out.CgroupsPerQOS, s); err != nil { + return err + } + out.CgroupDriver = in.CgroupDriver + out.CPUManagerPolicy = in.CPUManagerPolicy + out.CPUManagerReconcilePeriod = in.CPUManagerReconcilePeriod + out.QOSReserved = *(*map[string]string)(unsafe.Pointer(&in.QOSReserved)) + out.RuntimeRequestTimeout = in.RuntimeRequestTimeout + out.HairpinMode = in.HairpinMode + out.MaxPods = in.MaxPods + out.PodCIDR = in.PodCIDR + if err := v1.Convert_int64_To_Pointer_int64(&in.PodPidsLimit, &out.PodPidsLimit, s); err != nil { + return err + } + out.ResolverConfig = in.ResolverConfig + if err := v1.Convert_bool_To_Pointer_bool(&in.CPUCFSQuota, &out.CPUCFSQuota, s); err != nil { + return err + } + if err := v1.Convert_v1_Duration_To_Pointer_v1_Duration(&in.CPUCFSQuotaPeriod, &out.CPUCFSQuotaPeriod, s); err != nil { + return err + } + out.MaxOpenFiles = in.MaxOpenFiles + out.ContentType = in.ContentType + if err := v1.Convert_int32_To_Pointer_int32(&in.KubeAPIQPS, &out.KubeAPIQPS, s); err != nil { + return err + } + out.KubeAPIBurst = in.KubeAPIBurst + if err := v1.Convert_bool_To_Pointer_bool(&in.SerializeImagePulls, &out.SerializeImagePulls, s); err != nil { + return err + } + out.EvictionHard = *(*map[string]string)(unsafe.Pointer(&in.EvictionHard)) + out.EvictionSoft = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoft)) + out.EvictionSoftGracePeriod = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoftGracePeriod)) + out.EvictionPressureTransitionPeriod = in.EvictionPressureTransitionPeriod + out.EvictionMaxPodGracePeriod = in.EvictionMaxPodGracePeriod + out.EvictionMinimumReclaim = *(*map[string]string)(unsafe.Pointer(&in.EvictionMinimumReclaim)) + out.PodsPerCore = in.PodsPerCore + if err := v1.Convert_bool_To_Pointer_bool(&in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach, s); err != nil { + return err + } + out.ProtectKernelDefaults = in.ProtectKernelDefaults + if err := v1.Convert_bool_To_Pointer_bool(&in.MakeIPTablesUtilChains, &out.MakeIPTablesUtilChains, s); err != nil { + return err + } + if err := v1.Convert_int32_To_Pointer_int32(&in.IPTablesMasqueradeBit, &out.IPTablesMasqueradeBit, s); err != nil { + return err + } + if err := v1.Convert_int32_To_Pointer_int32(&in.IPTablesDropBit, &out.IPTablesDropBit, s); err != nil { + return err + } + out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) + if err := v1.Convert_bool_To_Pointer_bool(&in.FailSwapOn, &out.FailSwapOn, s); err != nil { + return err + } + out.ContainerLogMaxSize = in.ContainerLogMaxSize + if err := v1.Convert_int32_To_Pointer_int32(&in.ContainerLogMaxFiles, &out.ContainerLogMaxFiles, s); err != nil { + return err + } + out.ConfigMapAndSecretChangeDetectionStrategy = v1beta1.ResourceChangeDetectionStrategy(in.ConfigMapAndSecretChangeDetectionStrategy) + out.SystemReserved = *(*map[string]string)(unsafe.Pointer(&in.SystemReserved)) + out.KubeReserved = *(*map[string]string)(unsafe.Pointer(&in.KubeReserved)) + out.SystemReservedCgroup = in.SystemReservedCgroup + out.KubeReservedCgroup = in.KubeReservedCgroup + out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) + return nil +} + +// Convert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration is an autogenerated conversion function. +func Convert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in *config.KubeletConfiguration, out *v1beta1.KubeletConfiguration, s conversion.Scope) error { + return autoConvert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in, out, s) +} + +func autoConvert_v1beta1_KubeletWebhookAuthentication_To_config_KubeletWebhookAuthentication(in *v1beta1.KubeletWebhookAuthentication, out *config.KubeletWebhookAuthentication, s conversion.Scope) error { + if err := v1.Convert_Pointer_bool_To_bool(&in.Enabled, &out.Enabled, s); err != nil { + return err + } + out.CacheTTL = in.CacheTTL + return nil +} + +// Convert_v1beta1_KubeletWebhookAuthentication_To_config_KubeletWebhookAuthentication is an autogenerated conversion function. +func Convert_v1beta1_KubeletWebhookAuthentication_To_config_KubeletWebhookAuthentication(in *v1beta1.KubeletWebhookAuthentication, out *config.KubeletWebhookAuthentication, s conversion.Scope) error { + return autoConvert_v1beta1_KubeletWebhookAuthentication_To_config_KubeletWebhookAuthentication(in, out, s) +} + +func autoConvert_config_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(in *config.KubeletWebhookAuthentication, out *v1beta1.KubeletWebhookAuthentication, s conversion.Scope) error { + if err := v1.Convert_bool_To_Pointer_bool(&in.Enabled, &out.Enabled, s); err != nil { + return err + } + out.CacheTTL = in.CacheTTL + return nil +} + +// Convert_config_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication is an autogenerated conversion function. +func Convert_config_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(in *config.KubeletWebhookAuthentication, out *v1beta1.KubeletWebhookAuthentication, s conversion.Scope) error { + return autoConvert_config_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(in, out, s) +} + +func autoConvert_v1beta1_KubeletWebhookAuthorization_To_config_KubeletWebhookAuthorization(in *v1beta1.KubeletWebhookAuthorization, out *config.KubeletWebhookAuthorization, s conversion.Scope) error { + out.CacheAuthorizedTTL = in.CacheAuthorizedTTL + out.CacheUnauthorizedTTL = in.CacheUnauthorizedTTL + return nil +} + +// Convert_v1beta1_KubeletWebhookAuthorization_To_config_KubeletWebhookAuthorization is an autogenerated conversion function. +func Convert_v1beta1_KubeletWebhookAuthorization_To_config_KubeletWebhookAuthorization(in *v1beta1.KubeletWebhookAuthorization, out *config.KubeletWebhookAuthorization, s conversion.Scope) error { + return autoConvert_v1beta1_KubeletWebhookAuthorization_To_config_KubeletWebhookAuthorization(in, out, s) +} + +func autoConvert_config_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(in *config.KubeletWebhookAuthorization, out *v1beta1.KubeletWebhookAuthorization, s conversion.Scope) error { + out.CacheAuthorizedTTL = in.CacheAuthorizedTTL + out.CacheUnauthorizedTTL = in.CacheUnauthorizedTTL + return nil +} + +// Convert_config_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization is an autogenerated conversion function. +func Convert_config_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(in *config.KubeletWebhookAuthorization, out *v1beta1.KubeletWebhookAuthorization, s conversion.Scope) error { + return autoConvert_config_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(in, out, s) +} + +func autoConvert_v1beta1_KubeletX509Authentication_To_config_KubeletX509Authentication(in *v1beta1.KubeletX509Authentication, out *config.KubeletX509Authentication, s conversion.Scope) error { + out.ClientCAFile = in.ClientCAFile + return nil +} + +// Convert_v1beta1_KubeletX509Authentication_To_config_KubeletX509Authentication is an autogenerated conversion function. +func Convert_v1beta1_KubeletX509Authentication_To_config_KubeletX509Authentication(in *v1beta1.KubeletX509Authentication, out *config.KubeletX509Authentication, s conversion.Scope) error { + return autoConvert_v1beta1_KubeletX509Authentication_To_config_KubeletX509Authentication(in, out, s) +} + +func autoConvert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(in *config.KubeletX509Authentication, out *v1beta1.KubeletX509Authentication, s conversion.Scope) error { + out.ClientCAFile = in.ClientCAFile + return nil +} + +// Convert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication is an autogenerated conversion function. +func Convert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(in *config.KubeletX509Authentication, out *v1beta1.KubeletX509Authentication, s conversion.Scope) error { + return autoConvert_config_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(in, out, s) +} + +func autoConvert_v1beta1_SerializedNodeConfigSource_To_config_SerializedNodeConfigSource(in *v1beta1.SerializedNodeConfigSource, out *config.SerializedNodeConfigSource, s conversion.Scope) error { + out.Source = in.Source + return nil +} + +// Convert_v1beta1_SerializedNodeConfigSource_To_config_SerializedNodeConfigSource is an autogenerated conversion function. +func Convert_v1beta1_SerializedNodeConfigSource_To_config_SerializedNodeConfigSource(in *v1beta1.SerializedNodeConfigSource, out *config.SerializedNodeConfigSource, s conversion.Scope) error { + return autoConvert_v1beta1_SerializedNodeConfigSource_To_config_SerializedNodeConfigSource(in, out, s) +} + +func autoConvert_config_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource(in *config.SerializedNodeConfigSource, out *v1beta1.SerializedNodeConfigSource, s conversion.Scope) error { + out.Source = in.Source + return nil +} + +// Convert_config_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource is an autogenerated conversion function. +func Convert_config_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource(in *config.SerializedNodeConfigSource, out *v1beta1.SerializedNodeConfigSource, s conversion.Scope) error { + return autoConvert_config_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource(in, out, s) +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 00000000..016d58c8 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,21 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +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. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1beta1 diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.defaults.go similarity index 78% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.defaults.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.defaults.go index ab982de3..7c127d46 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.defaults.go @@ -22,16 +22,17 @@ package v1beta1 import ( runtime "k8s.io/apimachinery/pkg/runtime" + v1beta1 "k8s.io/kubelet/config/v1beta1" ) // RegisterDefaults adds defaulters functions to the given scheme. // Public to allow building arbitrary schemes. // All generated defaulters are covering - they call all nested defaulters. func RegisterDefaults(scheme *runtime.Scheme) error { - scheme.AddTypeDefaultingFunc(&KubeletConfiguration{}, func(obj interface{}) { SetObjectDefaults_KubeletConfiguration(obj.(*KubeletConfiguration)) }) + scheme.AddTypeDefaultingFunc(&v1beta1.KubeletConfiguration{}, func(obj interface{}) { SetObjectDefaults_KubeletConfiguration(obj.(*v1beta1.KubeletConfiguration)) }) return nil } -func SetObjectDefaults_KubeletConfiguration(in *KubeletConfiguration) { +func SetObjectDefaults_KubeletConfiguration(in *v1beta1.KubeletConfiguration) { SetDefaults_KubeletConfiguration(in) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD new file mode 100644 index 00000000..f7348901 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD @@ -0,0 +1,49 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = [ + "validation.go", + "validation_others.go", + "validation_windows.go", + ], + importpath = "k8s.io/kubernetes/pkg/kubelet/apis/config/validation", + deps = [ + "//pkg/features:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", + "//pkg/kubelet/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +go_test( + name = "go_default_test", + srcs = ["validation_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/kubelet/apis/config:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + ], +) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go similarity index 88% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go index 4be15401..9a39898f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go @@ -18,12 +18,13 @@ package validation import ( "fmt" + "time" utilerrors "k8s.io/apimachinery/pkg/util/errors" utilvalidation "k8s.io/apimachinery/pkg/util/validation" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" ) @@ -36,6 +37,9 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error localFeatureGate := utilfeature.DefaultFeatureGate.DeepCopy() localFeatureGate.SetFromMap(kc.FeatureGates) + if kc.NodeLeaseDurationSeconds <= 0 { + allErrors = append(allErrors, fmt.Errorf("invalid configuration: NodeLeaseDurationSeconds must be greater than 0")) + } if !kc.CgroupsPerQOS && len(kc.EnforceNodeAllocatable) > 0 { allErrors = append(allErrors, fmt.Errorf("invalid configuration: EnforceNodeAllocatable (--enforce-node-allocatable) is not supported unless CgroupsPerQOS (--cgroups-per-qos) feature is turned on")) } @@ -51,12 +55,18 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error if kc.HealthzPort != 0 && utilvalidation.IsValidPortNum(int(kc.HealthzPort)) != nil { allErrors = append(allErrors, fmt.Errorf("invalid configuration: HealthzPort (--healthz-port) %v must be between 1 and 65535, inclusive", kc.HealthzPort)) } + if localFeatureGate.Enabled(features.CPUCFSQuotaPeriod) && utilvalidation.IsInRange(int(kc.CPUCFSQuotaPeriod.Duration), int(1*time.Microsecond), int(time.Second)) != nil { + allErrors = append(allErrors, fmt.Errorf("invalid configuration: CPUCFSQuotaPeriod (--cpu-cfs-quota-period) %v must be between 1usec and 1sec, inclusive", kc.CPUCFSQuotaPeriod)) + } if utilvalidation.IsInRange(int(kc.ImageGCHighThresholdPercent), 0, 100) != nil { allErrors = append(allErrors, fmt.Errorf("invalid configuration: ImageGCHighThresholdPercent (--image-gc-high-threshold) %v must be between 0 and 100, inclusive", kc.ImageGCHighThresholdPercent)) } if utilvalidation.IsInRange(int(kc.ImageGCLowThresholdPercent), 0, 100) != nil { allErrors = append(allErrors, fmt.Errorf("invalid configuration: ImageGCLowThresholdPercent (--image-gc-low-threshold) %v must be between 0 and 100, inclusive", kc.ImageGCLowThresholdPercent)) } + if kc.ImageGCLowThresholdPercent >= kc.ImageGCHighThresholdPercent { + allErrors = append(allErrors, fmt.Errorf("invalid configuration: ImageGCLowThresholdPercent (--image-gc-low-threshold) %v must be less than ImageGCHighThresholdPercent (--image-gc-high-threshold) %v", kc.ImageGCLowThresholdPercent, kc.ImageGCHighThresholdPercent)) + } if utilvalidation.IsInRange(int(kc.IPTablesDropBit), 0, 31) != nil { allErrors = append(allErrors, fmt.Errorf("invalid configuration: IPTablesDropBit (--iptables-drop-bit) %v must be between 0 and 31, inclusive", kc.IPTablesDropBit)) } @@ -110,7 +120,7 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error } default: allErrors = append(allErrors, fmt.Errorf("invalid configuration: option %q specified for EnforceNodeAllocatable (--enforce-node-allocatable). Valid options are %q, %q, %q, or %q", - val, kubetypes.NodeAllocatableEnforcementKey, kubetypes.SystemReservedEnforcementKey, kubetypes.KubeReservedEnforcementKey, kubetypes.NodeAllocatableEnforcementKey)) + val, kubetypes.NodeAllocatableEnforcementKey, kubetypes.SystemReservedEnforcementKey, kubetypes.KubeReservedEnforcementKey, kubetypes.NodeAllocatableNoneKey)) } } switch kc.HairpinMode { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation_others.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_others.go similarity index 93% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation_others.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_others.go index 4cad8258..0eb7fcd0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation_others.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_others.go @@ -19,7 +19,7 @@ limitations under the License. package validation import ( - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" ) // validateKubeletOSConfiguration validates os specific kubelet configuration and returns an error if it is invalid. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_windows.go similarity index 95% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation_windows.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_windows.go index d1a8ec1d..c2203041 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/validation_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation_windows.go @@ -22,7 +22,7 @@ import ( "fmt" utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" ) // validateKubeletOSConfiguration validates os specific kubelet configuration and returns an error if it is invalid. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go similarity index 97% rename from vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/zz_generated.deepcopy.go rename to vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go index 2a312ad8..266a8629 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go @@ -18,7 +18,7 @@ limitations under the License. // Code generated by deepcopy-gen. DO NOT EDIT. -package kubeletconfig +package config import ( runtime "k8s.io/apimachinery/pkg/runtime" @@ -87,12 +87,15 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { in, out := &in.StaticPodURLHeader, &out.StaticPodURLHeader *out = make(map[string][]string, len(*in)) for key, val := range *in { + var outVal []string if val == nil { (*out)[key] = nil } else { - (*out)[key] = make([]string, len(val)) - copy((*out)[key], val) + in, out := &val, &outVal + *out = make([]string, len(*in)) + copy(*out, *in) } + (*out)[key] = outVal } } if in.TLSCipherSuites != nil { @@ -120,6 +123,7 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { } } out.RuntimeRequestTimeout = in.RuntimeRequestTimeout + out.CPUCFSQuotaPeriod = in.CPUCFSQuotaPeriod if in.EvictionHard != nil { in, out := &in.EvictionHard, &out.EvictionHard *out = make(map[string]string, len(*in)) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/BUILD index 6685cd12..8ba330b9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/BUILD @@ -33,8 +33,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["api.proto"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go index c17a8e0d..ca0cb6a9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go @@ -160,17 +160,20 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package type Protocol int32 const ( - Protocol_TCP Protocol = 0 - Protocol_UDP Protocol = 1 + Protocol_TCP Protocol = 0 + Protocol_UDP Protocol = 1 + Protocol_SCTP Protocol = 2 ) var Protocol_name = map[int32]string{ 0: "TCP", 1: "UDP", + 2: "SCTP", } var Protocol_value = map[string]int32{ - "TCP": 0, - "UDP": 1, + "TCP": 0, + "UDP": 1, + "SCTP": 2, } func (x Protocol) String() string { @@ -842,6 +845,12 @@ func (m *PodSandboxConfig) GetLinux() *LinuxPodSandboxConfig { type RunPodSandboxRequest struct { // Configuration for creating a PodSandbox. Config *PodSandboxConfig `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"` + // Named runtime configuration to use for this PodSandbox. + // If the runtime handler is unknown, this request should be rejected. An + // empty string should select the default handler, equivalent to the + // behavior before this feature was added. + // See https://git.k8s.io/community/keps/sig-node/0014-runtime-class.md + RuntimeHandler string `protobuf:"bytes,2,opt,name=runtime_handler,json=runtimeHandler,proto3" json:"runtime_handler,omitempty"` } func (m *RunPodSandboxRequest) Reset() { *m = RunPodSandboxRequest{} } @@ -855,6 +864,13 @@ func (m *RunPodSandboxRequest) GetConfig() *PodSandboxConfig { return nil } +func (m *RunPodSandboxRequest) GetRuntimeHandler() string { + if m != nil { + return m.RuntimeHandler + } + return "" +} + type RunPodSandboxResponse struct { // ID of the PodSandbox to run. PodSandboxId string `protobuf:"bytes,1,opt,name=pod_sandbox_id,json=podSandboxId,proto3" json:"pod_sandbox_id,omitempty"` @@ -1497,6 +1513,12 @@ type LinuxContainerSecurityContext struct { // no_new_privs defines if the flag for no_new_privs should be set on the // container. NoNewPrivs bool `protobuf:"varint,11,opt,name=no_new_privs,json=noNewPrivs,proto3" json:"no_new_privs,omitempty"` + // masked_paths is a slice of paths that should be masked by the container + // runtime, this can be passed directly to the OCI spec. + MaskedPaths []string `protobuf:"bytes,13,rep,name=masked_paths,json=maskedPaths" json:"masked_paths,omitempty"` + // readonly_paths is a slice of paths that should be set as readonly by the + // container runtime, this can be passed directly to the OCI spec. + ReadonlyPaths []string `protobuf:"bytes,14,rep,name=readonly_paths,json=readonlyPaths" json:"readonly_paths,omitempty"` } func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} } @@ -1589,6 +1611,20 @@ func (m *LinuxContainerSecurityContext) GetNoNewPrivs() bool { return false } +func (m *LinuxContainerSecurityContext) GetMaskedPaths() []string { + if m != nil { + return m.MaskedPaths + } + return nil +} + +func (m *LinuxContainerSecurityContext) GetReadonlyPaths() []string { + if m != nil { + return m.ReadonlyPaths + } + return nil +} + // LinuxContainerConfig contains platform-specific configuration for // Linux-based containers. type LinuxContainerConfig struct { @@ -5413,6 +5449,12 @@ func (m *RunPodSandboxRequest) MarshalTo(dAtA []byte) (int, error) { } i += n11 } + if len(m.RuntimeHandler) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.RuntimeHandler))) + i += copy(dAtA[i:], m.RuntimeHandler) + } return i, nil } @@ -6321,6 +6363,36 @@ func (m *LinuxContainerSecurityContext) MarshalTo(dAtA []byte) (int, error) { } i += n27 } + if len(m.MaskedPaths) > 0 { + for _, s := range m.MaskedPaths { + dAtA[i] = 0x6a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.ReadonlyPaths) > 0 { + for _, s := range m.ReadonlyPaths { + dAtA[i] = 0x72 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -9260,6 +9332,10 @@ func (m *RunPodSandboxRequest) Size() (n int) { l = m.Config.Size() n += 1 + l + sovApi(uint64(l)) } + l = len(m.RuntimeHandler) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } return n } @@ -9643,6 +9719,18 @@ func (m *LinuxContainerSecurityContext) Size() (n int) { l = m.RunAsGroup.Size() n += 1 + l + sovApi(uint64(l)) } + if len(m.MaskedPaths) > 0 { + for _, s := range m.MaskedPaths { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } + if len(m.ReadonlyPaths) > 0 { + for _, s := range m.ReadonlyPaths { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } return n } @@ -10931,6 +11019,7 @@ func (this *RunPodSandboxRequest) String() string { } s := strings.Join([]string{`&RunPodSandboxRequest{`, `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "PodSandboxConfig", "PodSandboxConfig", 1) + `,`, + `RuntimeHandler:` + fmt.Sprintf("%v", this.RuntimeHandler) + `,`, `}`, }, "") return s @@ -11247,6 +11336,8 @@ func (this *LinuxContainerSecurityContext) String() string { `SeccompProfilePath:` + fmt.Sprintf("%v", this.SeccompProfilePath) + `,`, `NoNewPrivs:` + fmt.Sprintf("%v", this.NoNewPrivs) + `,`, `RunAsGroup:` + strings.Replace(fmt.Sprintf("%v", this.RunAsGroup), "Int64Value", "Int64Value", 1) + `,`, + `MaskedPaths:` + fmt.Sprintf("%v", this.MaskedPaths) + `,`, + `ReadonlyPaths:` + fmt.Sprintf("%v", this.ReadonlyPaths) + `,`, `}`, }, "") return s @@ -14250,6 +14341,35 @@ func (m *RunPodSandboxRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuntimeHandler", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RuntimeHandler = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -17509,6 +17629,64 @@ func (m *LinuxContainerSecurityContext) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaskedPaths", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MaskedPaths = append(m.MaskedPaths, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadonlyPaths", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReadonlyPaths = append(m.ReadonlyPaths, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -26658,296 +26836,300 @@ var ( func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } var fileDescriptorApi = []byte{ - // 4649 bytes of a gzipped FileDescriptorProto + // 4708 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5c, 0xcd, 0x6f, 0x1b, 0x49, - 0x76, 0x57, 0x93, 0xfa, 0x20, 0x1f, 0x45, 0x89, 0x2a, 0xcb, 0x16, 0x4d, 0xdb, 0xb2, 0xd5, 0x1e, - 0x7f, 0xce, 0x58, 0x1e, 0x6b, 0x76, 0x3d, 0xb1, 0x3d, 0x6b, 0x9b, 0x96, 0x64, 0x9b, 0x59, 0x9b, - 0x52, 0x9a, 0xd2, 0x7c, 0xec, 0x0c, 0xd0, 0xdb, 0x62, 0x97, 0xa8, 0x5e, 0x93, 0x5d, 0x3d, 0xdd, - 0x4d, 0xdb, 0xca, 0x21, 0x58, 0x20, 0xc8, 0x1e, 0x02, 0x04, 0xc8, 0x79, 0x8f, 0x9b, 0x43, 0x0e, - 0xb9, 0x05, 0x08, 0x72, 0xc8, 0x69, 0x83, 0x3d, 0xec, 0x25, 0x40, 0x4e, 0x8b, 0x7c, 0x5c, 0x32, - 0x13, 0xe4, 0x92, 0x43, 0x90, 0x3f, 0x20, 0x87, 0xa0, 0xbe, 0x9a, 0xfd, 0xc9, 0x0f, 0x8f, 0x77, - 0x67, 0xf6, 0xa4, 0xae, 0xd7, 0xef, 0xbd, 0x7a, 0xf5, 0xea, 0xf5, 0xab, 0x57, 0xbf, 0x2a, 0x0a, - 0x8a, 0x86, 0x63, 0xad, 0x3b, 0x2e, 0xf1, 0x09, 0xaa, 0xb8, 0x7d, 0xdb, 0xb7, 0x7a, 0x78, 0xfd, - 0xe5, 0x2d, 0xa3, 0xeb, 0x1c, 0x19, 0x1b, 0xb5, 0x1b, 0x1d, 0xcb, 0x3f, 0xea, 0x1f, 0xac, 0xb7, - 0x49, 0xef, 0x66, 0x87, 0x74, 0xc8, 0x4d, 0xc6, 0x78, 0xd0, 0x3f, 0x64, 0x2d, 0xd6, 0x60, 0x4f, - 0x5c, 0x81, 0x7a, 0x1d, 0x16, 0x3e, 0xc6, 0xae, 0x67, 0x11, 0x5b, 0xc3, 0x5f, 0xf6, 0xb1, 0xe7, - 0xa3, 0x2a, 0xcc, 0xbd, 0xe4, 0x94, 0xaa, 0x72, 0x41, 0xb9, 0x5a, 0xd4, 0x64, 0x53, 0xfd, 0x6b, - 0x05, 0x16, 0x03, 0x66, 0xcf, 0x21, 0xb6, 0x87, 0xb3, 0xb9, 0xd1, 0x1a, 0xcc, 0x0b, 0xe3, 0x74, - 0xdb, 0xe8, 0xe1, 0x6a, 0x8e, 0xbd, 0x2e, 0x09, 0x5a, 0xd3, 0xe8, 0x61, 0x74, 0x05, 0x16, 0x25, - 0x8b, 0x54, 0x92, 0x67, 0x5c, 0x0b, 0x82, 0x2c, 0x7a, 0x43, 0xeb, 0x70, 0x42, 0x32, 0x1a, 0x8e, - 0x15, 0x30, 0x4f, 0x33, 0xe6, 0x25, 0xf1, 0xaa, 0xee, 0x58, 0x82, 0x5f, 0xfd, 0x1c, 0x8a, 0x5b, - 0xcd, 0xd6, 0x26, 0xb1, 0x0f, 0xad, 0x0e, 0x35, 0xd1, 0xc3, 0x2e, 0x95, 0xa9, 0x2a, 0x17, 0xf2, - 0xd4, 0x44, 0xd1, 0x44, 0x35, 0x28, 0x78, 0xd8, 0x70, 0xdb, 0x47, 0xd8, 0xab, 0xe6, 0xd8, 0xab, - 0xa0, 0x4d, 0xa5, 0x88, 0xe3, 0x5b, 0xc4, 0xf6, 0xaa, 0x79, 0x2e, 0x25, 0x9a, 0xea, 0x2f, 0x14, - 0x28, 0xed, 0x12, 0xd7, 0x7f, 0x6e, 0x38, 0x8e, 0x65, 0x77, 0xd0, 0x6d, 0x28, 0x30, 0x5f, 0xb6, - 0x49, 0x97, 0xf9, 0x60, 0x61, 0xa3, 0xb6, 0x1e, 0x9f, 0x96, 0xf5, 0x5d, 0xc1, 0xa1, 0x05, 0xbc, - 0xe8, 0x12, 0x2c, 0xb4, 0x89, 0xed, 0x1b, 0x96, 0x8d, 0x5d, 0xdd, 0x21, 0xae, 0xcf, 0x5c, 0x34, - 0xa3, 0x95, 0x03, 0x2a, 0xed, 0x05, 0x9d, 0x81, 0xe2, 0x11, 0xf1, 0x7c, 0xce, 0x91, 0x67, 0x1c, - 0x05, 0x4a, 0x60, 0x2f, 0x57, 0x60, 0x8e, 0xbd, 0xb4, 0x1c, 0xe1, 0x8c, 0x59, 0xda, 0x6c, 0x38, - 0xea, 0x6f, 0x14, 0x98, 0x79, 0x4e, 0xfa, 0xb6, 0x1f, 0xeb, 0xc6, 0xf0, 0x8f, 0xc4, 0x44, 0x85, - 0xba, 0x31, 0xfc, 0xa3, 0x41, 0x37, 0x94, 0x83, 0xcf, 0x15, 0xef, 0x86, 0xbe, 0xac, 0x41, 0xc1, - 0xc5, 0x86, 0x49, 0xec, 0xee, 0x31, 0x33, 0xa1, 0xa0, 0x05, 0x6d, 0x3a, 0x89, 0x1e, 0xee, 0x5a, - 0x76, 0xff, 0xb5, 0xee, 0xe2, 0xae, 0x71, 0x80, 0xbb, 0xcc, 0x94, 0x82, 0xb6, 0x20, 0xc8, 0x1a, - 0xa7, 0xa2, 0x2d, 0x28, 0x39, 0x2e, 0x71, 0x8c, 0x8e, 0x41, 0xfd, 0x58, 0x9d, 0x61, 0xae, 0x52, - 0x93, 0xae, 0x62, 0x66, 0xef, 0x0e, 0x38, 0xb5, 0xb0, 0x98, 0xfa, 0xb7, 0x0a, 0x2c, 0xd2, 0xe0, - 0xf1, 0x1c, 0xa3, 0x8d, 0x77, 0xd8, 0x94, 0xa0, 0x3b, 0x30, 0x67, 0x63, 0xff, 0x15, 0x71, 0x5f, - 0x88, 0x09, 0x38, 0x9f, 0xd4, 0x1a, 0xc8, 0x3c, 0x27, 0x26, 0xd6, 0x24, 0x3f, 0xba, 0x05, 0x79, - 0xc7, 0x32, 0xd9, 0x80, 0xc7, 0x10, 0xa3, 0xbc, 0x54, 0xc4, 0x72, 0xda, 0xcc, 0x0f, 0xe3, 0x88, - 0x58, 0x4e, 0x5b, 0x55, 0x01, 0x1a, 0xb6, 0x7f, 0xfb, 0x7b, 0x1f, 0x1b, 0xdd, 0x3e, 0x46, 0xcb, - 0x30, 0xf3, 0x92, 0x3e, 0x30, 0x63, 0xf3, 0x1a, 0x6f, 0xa8, 0x5f, 0xe5, 0xe1, 0xcc, 0x33, 0xea, - 0xaf, 0x96, 0x61, 0x9b, 0x07, 0xe4, 0x75, 0x0b, 0xb7, 0xfb, 0xae, 0xe5, 0x1f, 0x6f, 0x12, 0xdb, - 0xc7, 0xaf, 0x7d, 0xd4, 0x84, 0x25, 0x5b, 0x6a, 0xd6, 0x65, 0x68, 0x52, 0x0d, 0xa5, 0x8d, 0xb5, - 0x21, 0x46, 0x70, 0x17, 0x69, 0x15, 0x3b, 0x4a, 0xf0, 0xd0, 0xd3, 0xc1, 0xbc, 0x49, 0x6d, 0x39, - 0xa6, 0x2d, 0x65, 0x48, 0xad, 0x6d, 0x66, 0x99, 0xd0, 0x25, 0x27, 0x56, 0x6a, 0xfa, 0x08, 0xe8, - 0x57, 0xad, 0x1b, 0x9e, 0xde, 0xf7, 0xb0, 0xcb, 0x1c, 0x53, 0xda, 0x38, 0x9b, 0xd4, 0x32, 0x70, - 0x81, 0x56, 0x74, 0xfb, 0x76, 0xdd, 0xdb, 0xf7, 0xb0, 0xcb, 0x92, 0x80, 0x88, 0x25, 0xdd, 0x25, - 0xc4, 0x3f, 0xf4, 0x64, 0xfc, 0x48, 0xb2, 0xc6, 0xa8, 0xe8, 0x26, 0x9c, 0xf0, 0xfa, 0x8e, 0xd3, - 0xc5, 0x3d, 0x6c, 0xfb, 0x46, 0x57, 0xef, 0xb8, 0xa4, 0xef, 0x78, 0xd5, 0x99, 0x0b, 0xf9, 0xab, - 0x79, 0x0d, 0x85, 0x5f, 0x3d, 0x61, 0x6f, 0xd0, 0x2a, 0x80, 0xe3, 0x5a, 0x2f, 0xad, 0x2e, 0xee, - 0x60, 0xb3, 0x3a, 0xcb, 0x94, 0x86, 0x28, 0xe8, 0x7d, 0x58, 0xf6, 0x70, 0xbb, 0x4d, 0x7a, 0x8e, - 0xee, 0xb8, 0xe4, 0xd0, 0xea, 0x62, 0x1e, 0xfd, 0x73, 0x2c, 0xfa, 0x91, 0x78, 0xb7, 0xcb, 0x5f, - 0xb1, 0xef, 0xe0, 0x3e, 0xcb, 0x69, 0x74, 0xa4, 0xac, 0xf3, 0x6a, 0x61, 0x8c, 0xa1, 0x02, 0x1b, - 0x2a, 0x33, 0x49, 0xfd, 0x45, 0x0e, 0x4e, 0x32, 0x4f, 0xee, 0x12, 0x53, 0x4c, 0xb3, 0x48, 0x52, - 0x17, 0xa1, 0xdc, 0x66, 0x3a, 0x75, 0xc7, 0x70, 0xb1, 0xed, 0x8b, 0x8f, 0x74, 0x9e, 0x13, 0x77, - 0x19, 0x0d, 0x7d, 0x0a, 0x15, 0x4f, 0x44, 0x85, 0xde, 0xe6, 0x61, 0x21, 0xe6, 0xec, 0x46, 0xd2, - 0x84, 0x21, 0xb1, 0xa4, 0x2d, 0x7a, 0x89, 0xe0, 0x9a, 0xf3, 0x8e, 0xbd, 0xb6, 0xdf, 0xe5, 0xd9, - 0xae, 0xb4, 0xf1, 0xbd, 0x0c, 0x85, 0x71, 0xc3, 0xd7, 0x5b, 0x5c, 0x6c, 0xdb, 0xf6, 0xdd, 0x63, - 0x4d, 0x2a, 0xa9, 0xdd, 0x85, 0xf9, 0xf0, 0x0b, 0x54, 0x81, 0xfc, 0x0b, 0x7c, 0x2c, 0x06, 0x45, - 0x1f, 0x07, 0x1f, 0x01, 0xcf, 0x35, 0xbc, 0x71, 0x37, 0xf7, 0x07, 0x8a, 0xea, 0x02, 0x1a, 0xf4, - 0xf2, 0x1c, 0xfb, 0x86, 0x69, 0xf8, 0x06, 0x42, 0x30, 0xcd, 0x96, 0x11, 0xae, 0x82, 0x3d, 0x53, - 0xad, 0x7d, 0xf1, 0xf1, 0x16, 0x35, 0xfa, 0x88, 0xce, 0x42, 0x31, 0x08, 0x74, 0xb1, 0x96, 0x0c, - 0x08, 0x34, 0xa7, 0x1b, 0xbe, 0x8f, 0x7b, 0x8e, 0xcf, 0x42, 0xac, 0xac, 0xc9, 0xa6, 0xfa, 0x3f, - 0xd3, 0x50, 0x49, 0xcc, 0xc9, 0x43, 0x28, 0xf4, 0x44, 0xf7, 0xe2, 0x43, 0x7b, 0x27, 0x25, 0xb1, - 0x27, 0x4c, 0xd5, 0x02, 0x29, 0x9a, 0x37, 0x69, 0x0e, 0x0d, 0xad, 0x7f, 0x41, 0x9b, 0xce, 0x78, - 0x97, 0x74, 0x74, 0xd3, 0x72, 0x71, 0xdb, 0x27, 0xee, 0xb1, 0x30, 0x77, 0xbe, 0x4b, 0x3a, 0x5b, - 0x92, 0x86, 0xee, 0x02, 0x98, 0xb6, 0x47, 0x27, 0xfb, 0xd0, 0xea, 0x30, 0xa3, 0x4b, 0x1b, 0x67, - 0x92, 0x46, 0x04, 0x8b, 0x9d, 0x56, 0x34, 0x6d, 0x4f, 0x98, 0xff, 0x08, 0xca, 0x74, 0xcd, 0xd0, - 0x7b, 0x7c, 0x9d, 0xe2, 0x5f, 0x4a, 0x69, 0xe3, 0x5c, 0xda, 0x18, 0x82, 0xd5, 0x4c, 0x9b, 0x77, - 0x06, 0x0d, 0x0f, 0x3d, 0x86, 0x59, 0x96, 0xbc, 0xbd, 0xea, 0x2c, 0x13, 0x5e, 0x1f, 0xe6, 0x00, - 0x11, 0x11, 0xcf, 0x98, 0x00, 0x0f, 0x08, 0x21, 0x8d, 0xf6, 0xa1, 0x64, 0xd8, 0x36, 0xf1, 0x0d, - 0x9e, 0x68, 0xe6, 0x98, 0xb2, 0x0f, 0xc6, 0x50, 0x56, 0x1f, 0x48, 0x71, 0x8d, 0x61, 0x3d, 0xe8, - 0x07, 0x30, 0xc3, 0x32, 0x91, 0xf8, 0x10, 0xaf, 0x8c, 0x19, 0xb4, 0x1a, 0x97, 0xaa, 0xdd, 0x81, - 0x52, 0xc8, 0xd8, 0x49, 0x82, 0xb4, 0x76, 0x1f, 0x2a, 0x71, 0xd3, 0x26, 0x0a, 0x72, 0x0d, 0x96, - 0xb5, 0xbe, 0x3d, 0x30, 0x4c, 0x56, 0x5f, 0x77, 0x61, 0x56, 0x4c, 0x36, 0x8f, 0x38, 0x75, 0xb4, - 0x8f, 0x34, 0x21, 0xa1, 0xfe, 0x00, 0x4e, 0xc6, 0x74, 0x8a, 0x22, 0xed, 0x1d, 0x58, 0x70, 0x88, - 0xa9, 0x7b, 0x9c, 0xac, 0x5b, 0xa6, 0xcc, 0x2e, 0x4e, 0xc0, 0xdb, 0x30, 0xa9, 0x78, 0xcb, 0x27, - 0x4e, 0xd2, 0xa6, 0xf1, 0xc4, 0xab, 0x70, 0x2a, 0x2e, 0xce, 0xbb, 0x57, 0x1f, 0xc0, 0x8a, 0x86, - 0x7b, 0xe4, 0x25, 0x7e, 0x53, 0xd5, 0x35, 0xa8, 0x26, 0x15, 0x08, 0xe5, 0x9f, 0xc1, 0xca, 0x80, - 0xda, 0xf2, 0x0d, 0xbf, 0xef, 0x4d, 0xa4, 0x5c, 0x54, 0xb0, 0x07, 0xc4, 0xe3, 0xb3, 0x54, 0xd0, - 0x64, 0x53, 0xbd, 0x16, 0x56, 0xdd, 0xe4, 0x05, 0x03, 0xef, 0x01, 0x2d, 0x40, 0xce, 0x72, 0x84, - 0xba, 0x9c, 0xe5, 0xa8, 0x4f, 0xa1, 0x18, 0xac, 0xb8, 0xe8, 0xde, 0xa0, 0x74, 0xcc, 0x8d, 0xbb, - 0x3e, 0x07, 0xd5, 0xe5, 0x5e, 0x62, 0x85, 0x10, 0x5d, 0xde, 0x03, 0x08, 0x32, 0x99, 0x5c, 0xf8, - 0xcf, 0x0c, 0x51, 0xac, 0x85, 0xd8, 0xd5, 0x7f, 0x8b, 0xe4, 0xb7, 0xd0, 0x20, 0xcc, 0x60, 0x10, - 0x66, 0x24, 0xdf, 0xe5, 0xde, 0x28, 0xdf, 0x7d, 0x08, 0x33, 0x9e, 0x6f, 0xf8, 0x58, 0x14, 0x47, - 0x6b, 0xc3, 0xc4, 0xa9, 0x11, 0x58, 0xe3, 0xfc, 0xe8, 0x1c, 0x40, 0xdb, 0xc5, 0x86, 0x8f, 0x4d, - 0xdd, 0xe0, 0xc9, 0x39, 0xaf, 0x15, 0x05, 0xa5, 0xee, 0xa3, 0xcd, 0x41, 0x81, 0x37, 0xc3, 0x0c, - 0xbb, 0x36, 0x4c, 0x73, 0x64, 0xaa, 0x06, 0xa5, 0x5e, 0x90, 0x2c, 0x66, 0xc7, 0x4c, 0x16, 0x42, - 0x01, 0x97, 0x0a, 0xa5, 0xc2, 0xb9, 0xd1, 0xa9, 0x90, 0x8b, 0x8e, 0x93, 0x0a, 0x0b, 0xa3, 0x53, - 0xa1, 0x50, 0x36, 0x34, 0x15, 0x7e, 0x9b, 0xb9, 0xec, 0x5f, 0x15, 0xa8, 0x26, 0xbf, 0x41, 0x91, - 0x7b, 0xee, 0xc2, 0xac, 0xc7, 0x28, 0xe3, 0x24, 0x34, 0x21, 0x2b, 0x24, 0xd0, 0x53, 0x98, 0xb6, - 0xec, 0x43, 0xc2, 0xf6, 0x66, 0xa9, 0x25, 0x49, 0x56, 0xaf, 0xeb, 0x0d, 0xfb, 0x90, 0x70, 0x27, - 0x31, 0x0d, 0xb5, 0x0f, 0xa1, 0x18, 0x90, 0x26, 0x1a, 0xdb, 0x0e, 0x2c, 0xc7, 0x42, 0x96, 0xd7, - 0xf0, 0x41, 0xa4, 0x2b, 0x93, 0x45, 0xba, 0xfa, 0xd3, 0x5c, 0xf8, 0x4b, 0x7c, 0x6c, 0x75, 0x7d, - 0xec, 0x26, 0xbe, 0xc4, 0x8f, 0xa4, 0x76, 0xfe, 0x19, 0x5e, 0x1e, 0xa9, 0x9d, 0x97, 0x9a, 0xe2, - 0x63, 0xfa, 0x02, 0x16, 0x58, 0xac, 0xe9, 0x1e, 0xee, 0xb2, 0x3a, 0x42, 0xd4, 0x74, 0xdf, 0x1f, - 0xa6, 0x86, 0x5b, 0xc2, 0x23, 0xb6, 0x25, 0xe4, 0xb8, 0x07, 0xcb, 0xdd, 0x30, 0xad, 0xf6, 0x10, - 0x50, 0x92, 0x69, 0x22, 0x9f, 0xb6, 0x68, 0x8a, 0xa3, 0x1b, 0xd8, 0x94, 0xc5, 0xef, 0x90, 0x99, - 0x31, 0x4e, 0xac, 0x70, 0x83, 0x35, 0x21, 0xa1, 0xfe, 0x2a, 0x0f, 0x30, 0x78, 0xf9, 0x7b, 0x94, - 0xdb, 0x1e, 0x06, 0x79, 0x85, 0xd7, 0x67, 0x57, 0x87, 0x29, 0x4e, 0xcd, 0x28, 0x3b, 0xd1, 0x8c, - 0xc2, 0x2b, 0xb5, 0x1b, 0x43, 0xd5, 0x7c, 0x67, 0x73, 0xc9, 0x33, 0x38, 0x15, 0x8f, 0x0d, 0x91, - 0x48, 0x36, 0x60, 0xc6, 0xf2, 0x71, 0x8f, 0x83, 0x38, 0xa9, 0x9b, 0xae, 0x90, 0x10, 0x67, 0x55, - 0xd7, 0xa0, 0xd8, 0xe8, 0x19, 0x1d, 0xdc, 0x72, 0x70, 0x9b, 0x76, 0x6a, 0xd1, 0x86, 0x30, 0x84, - 0x37, 0xd4, 0x0d, 0x28, 0xfc, 0x10, 0x1f, 0xf3, 0x8f, 0x7a, 0x4c, 0x43, 0xd5, 0xbf, 0xc8, 0xc1, - 0x0a, 0x5b, 0x2b, 0x36, 0x25, 0x84, 0xa2, 0x61, 0x8f, 0xf4, 0xdd, 0x36, 0xf6, 0xd8, 0x6c, 0x3b, - 0x7d, 0xdd, 0xc1, 0xae, 0x45, 0x4c, 0xb1, 0xc3, 0x2f, 0xb6, 0x9d, 0xfe, 0x2e, 0x23, 0xa0, 0x33, - 0x40, 0x1b, 0xfa, 0x97, 0x7d, 0x22, 0x02, 0x31, 0xaf, 0x15, 0xda, 0x4e, 0xff, 0x8f, 0x68, 0x5b, - 0xca, 0x7a, 0x47, 0x86, 0x8b, 0x3d, 0x16, 0x67, 0x5c, 0xb6, 0xc5, 0x08, 0xe8, 0x16, 0x9c, 0xec, - 0xe1, 0x1e, 0x71, 0x8f, 0xf5, 0xae, 0xd5, 0xb3, 0x7c, 0xdd, 0xb2, 0xf5, 0x83, 0x63, 0x1f, 0x7b, - 0x22, 0xa6, 0x10, 0x7f, 0xf9, 0x8c, 0xbe, 0x6b, 0xd8, 0x8f, 0xe8, 0x1b, 0xa4, 0x42, 0x99, 0x90, - 0x9e, 0xee, 0xb5, 0x89, 0x8b, 0x75, 0xc3, 0xfc, 0x09, 0x5b, 0x3e, 0xf3, 0x5a, 0x89, 0x90, 0x5e, - 0x8b, 0xd2, 0xea, 0xe6, 0x4f, 0xd0, 0x79, 0x28, 0xb5, 0x9d, 0xbe, 0x87, 0x7d, 0x9d, 0xfe, 0x61, - 0xab, 0x63, 0x51, 0x03, 0x4e, 0xda, 0x74, 0xfa, 0x5e, 0x88, 0xa1, 0x47, 0xfd, 0x3f, 0x17, 0x66, - 0x78, 0x4e, 0xdd, 0x6c, 0x40, 0x39, 0x82, 0x10, 0xd0, 0xcd, 0x1a, 0x83, 0x02, 0xc4, 0x66, 0x8d, - 0x3e, 0x53, 0x9a, 0x4b, 0xba, 0xd2, 0x93, 0xec, 0x99, 0xd2, 0xfc, 0x63, 0x47, 0xee, 0xd4, 0xd8, - 0x33, 0x75, 0x79, 0x17, 0xbf, 0x14, 0x28, 0x52, 0x51, 0xe3, 0x0d, 0xd5, 0x04, 0xd8, 0x34, 0x1c, - 0xe3, 0xc0, 0xea, 0x5a, 0xfe, 0x31, 0xba, 0x06, 0x15, 0xc3, 0x34, 0xf5, 0xb6, 0xa4, 0x58, 0x58, - 0x62, 0x7b, 0x8b, 0x86, 0x69, 0x6e, 0x86, 0xc8, 0xe8, 0x5d, 0x58, 0x32, 0x5d, 0xe2, 0x44, 0x79, - 0x39, 0xd8, 0x57, 0xa1, 0x2f, 0xc2, 0xcc, 0xea, 0xcf, 0x67, 0xe0, 0x5c, 0x74, 0x62, 0xe3, 0x28, - 0xcc, 0x43, 0x98, 0x8f, 0xf5, 0x9a, 0x81, 0x00, 0x0c, 0xac, 0xd5, 0x22, 0x12, 0x31, 0x54, 0x22, - 0x97, 0x40, 0x25, 0x52, 0x71, 0x9e, 0xfc, 0x5b, 0xc5, 0x79, 0xa6, 0xdf, 0x0a, 0xce, 0x33, 0x33, - 0x19, 0xce, 0x73, 0x99, 0x81, 0xbd, 0x52, 0x9a, 0x6d, 0x89, 0x79, 0xa8, 0x95, 0x03, 0x1e, 0x5b, - 0x82, 0xc2, 0x31, 0x3c, 0x68, 0x6e, 0x12, 0x3c, 0xa8, 0x90, 0x89, 0x07, 0xd1, 0xa8, 0x71, 0x1c, - 0xc3, 0xed, 0x11, 0x57, 0x02, 0x3e, 0xd5, 0x22, 0x33, 0x61, 0x51, 0xd2, 0x05, 0xd8, 0x93, 0x09, - 0x0d, 0x41, 0x26, 0x34, 0x74, 0x01, 0xe6, 0x6d, 0xa2, 0xdb, 0xf8, 0x95, 0x4e, 0xe7, 0xd2, 0xab, - 0x96, 0xf8, 0xc4, 0xda, 0xa4, 0x89, 0x5f, 0xed, 0x52, 0x4a, 0x02, 0x3c, 0x9a, 0x9f, 0x10, 0x3c, - 0xfa, 0x07, 0x05, 0x96, 0xa3, 0xc1, 0x29, 0x36, 0xfa, 0x4f, 0xa0, 0xe8, 0xca, 0xfc, 0x23, 0x02, - 0xf2, 0x5a, 0x46, 0x71, 0x9b, 0x4c, 0x58, 0xda, 0x40, 0x16, 0xfd, 0x28, 0x13, 0x5f, 0xba, 0x39, - 0x4a, 0xdf, 0x28, 0x84, 0x49, 0x6d, 0xc0, 0xf9, 0x4f, 0x2c, 0xdb, 0x24, 0xaf, 0xbc, 0xcc, 0x6f, - 0x2b, 0x25, 0x42, 0x94, 0x94, 0x08, 0x51, 0x7f, 0xa9, 0xc0, 0xa9, 0xb8, 0x2e, 0xe1, 0x8a, 0x46, - 0xd2, 0x15, 0xef, 0x26, 0x4d, 0x8f, 0x0b, 0xa7, 0x3a, 0xe3, 0x8b, 0x4c, 0x67, 0xdc, 0x1a, 0xad, - 0x71, 0xa4, 0x3b, 0xfe, 0x46, 0x81, 0xd3, 0x99, 0x66, 0xc4, 0x16, 0x02, 0x25, 0xbe, 0x10, 0x88, - 0x45, 0xa4, 0x4d, 0xfa, 0xb6, 0x1f, 0x5a, 0x44, 0x36, 0x19, 0xde, 0xcf, 0xb3, 0xb5, 0xde, 0x33, - 0x5e, 0x5b, 0xbd, 0x7e, 0x4f, 0xac, 0x22, 0x54, 0xdd, 0x73, 0x4e, 0x79, 0x83, 0x65, 0x44, 0xad, - 0xc3, 0x52, 0x60, 0xe5, 0x50, 0x44, 0x2e, 0x84, 0xb0, 0xe5, 0xa2, 0x08, 0x9b, 0x0d, 0xb3, 0x5b, - 0xf8, 0xa5, 0xd5, 0xc6, 0x6f, 0xe5, 0x40, 0xe2, 0x02, 0x94, 0x1c, 0xec, 0xf6, 0x2c, 0xcf, 0x0b, - 0xd2, 0x63, 0x51, 0x0b, 0x93, 0xd4, 0xff, 0x9a, 0x85, 0xc5, 0x78, 0x74, 0x3c, 0x48, 0x00, 0x7a, - 0x17, 0x53, 0x12, 0x77, 0x7c, 0xa0, 0xa1, 0x1a, 0xf0, 0x96, 0x2c, 0x21, 0x72, 0x59, 0xdb, 0xef, - 0xa0, 0xdc, 0x10, 0xf5, 0x05, 0xf5, 0x48, 0x9b, 0xf4, 0x7a, 0x86, 0x6d, 0xca, 0x73, 0x24, 0xd1, - 0xa4, 0xfe, 0x33, 0xdc, 0x0e, 0x75, 0x3b, 0x25, 0xb3, 0x67, 0x3a, 0x79, 0x74, 0xaf, 0x6a, 0xd9, - 0x0c, 0x18, 0x64, 0x29, 0xb6, 0xa8, 0x81, 0x20, 0x6d, 0x59, 0x2e, 0x5a, 0x87, 0x69, 0x6c, 0xbf, - 0x94, 0x45, 0x5e, 0xca, 0x41, 0x93, 0x2c, 0x66, 0x34, 0xc6, 0x87, 0x6e, 0xc2, 0x6c, 0x8f, 0x86, - 0x85, 0xdc, 0xb5, 0xae, 0x64, 0x9c, 0xb7, 0x68, 0x82, 0x0d, 0x6d, 0xc0, 0x9c, 0xc9, 0xe6, 0x49, - 0x6e, 0x4d, 0xab, 0x29, 0x70, 0x23, 0x63, 0xd0, 0x24, 0x23, 0xda, 0x0e, 0x4a, 0xd8, 0x62, 0x56, - 0xed, 0x19, 0x9b, 0x8a, 0xd4, 0x3a, 0x76, 0x2f, 0x5a, 0xc7, 0x02, 0xd3, 0xb5, 0x31, 0x5a, 0xd7, - 0x70, 0x8c, 0xf0, 0x34, 0x14, 0xba, 0xa4, 0xc3, 0xc3, 0xa8, 0xc4, 0x8f, 0x28, 0xbb, 0xa4, 0xc3, - 0xa2, 0x68, 0x99, 0x96, 0xf4, 0xa6, 0x65, 0xb3, 0x54, 0x5c, 0xd0, 0x78, 0x83, 0x7e, 0x7c, 0xec, - 0x41, 0x27, 0x76, 0x1b, 0x57, 0xcb, 0xec, 0x55, 0x91, 0x51, 0x76, 0xec, 0x36, 0x2b, 0x12, 0x7d, - 0xff, 0xb8, 0xba, 0xc0, 0xe8, 0xf4, 0x91, 0xee, 0xd6, 0x38, 0xb0, 0xb0, 0x98, 0xb5, 0x5b, 0x4b, - 0x4b, 0xdb, 0x12, 0x57, 0x78, 0x04, 0x73, 0xaf, 0x78, 0x22, 0xa8, 0x56, 0x98, 0xfc, 0xd5, 0xd1, - 0xe9, 0x45, 0x68, 0x90, 0x82, 0xdf, 0x66, 0xc1, 0xfe, 0x2b, 0x05, 0x4e, 0x6d, 0xb2, 0xcd, 0x4c, - 0x28, 0x8f, 0x4d, 0x82, 0xbf, 0xdd, 0x09, 0x10, 0xcf, 0x4c, 0xb0, 0x2c, 0x3e, 0x6e, 0x21, 0x80, - 0x1a, 0xb0, 0x20, 0x95, 0x0b, 0x15, 0xf9, 0xb1, 0x41, 0xd3, 0xb2, 0x17, 0x6e, 0xaa, 0x1f, 0xc1, - 0x4a, 0x62, 0x14, 0x62, 0xe3, 0xb1, 0x06, 0xf3, 0x83, 0x7c, 0x15, 0x0c, 0xa2, 0x14, 0xd0, 0x1a, - 0xa6, 0x7a, 0x17, 0x4e, 0xb6, 0x7c, 0xc3, 0xf5, 0x13, 0x2e, 0x18, 0x43, 0x96, 0xe1, 0xa6, 0x51, - 0x59, 0x01, 0x6d, 0xb6, 0x60, 0xb9, 0xe5, 0x13, 0xe7, 0x0d, 0x94, 0xd2, 0xac, 0x43, 0xc7, 0x4f, - 0xfa, 0x72, 0x7d, 0x90, 0x4d, 0x75, 0x85, 0xa3, 0xbc, 0xc9, 0xde, 0xee, 0xc1, 0x29, 0x0e, 0xb2, - 0xbe, 0xc9, 0x20, 0x4e, 0x4b, 0x88, 0x37, 0xa9, 0xf7, 0x39, 0x9c, 0x18, 0x2c, 0x8b, 0x03, 0x00, - 0xe5, 0x76, 0x14, 0x40, 0xb9, 0x30, 0x64, 0xd6, 0x23, 0xf8, 0xc9, 0x5f, 0xe5, 0x42, 0x79, 0x3d, - 0x03, 0x3e, 0xb9, 0x17, 0x85, 0x4f, 0x2e, 0x8d, 0xd2, 0x1d, 0x41, 0x4f, 0x92, 0x51, 0x9b, 0x4f, - 0x89, 0xda, 0xcf, 0x13, 0x18, 0xcb, 0x74, 0x16, 0x48, 0x15, 0xb3, 0xf6, 0x77, 0x02, 0xb1, 0x68, - 0x1c, 0x62, 0x09, 0xba, 0x0e, 0x30, 0xf1, 0x3b, 0x31, 0x88, 0x65, 0x6d, 0xa4, 0xbd, 0x01, 0xc2, - 0xf2, 0x77, 0xd3, 0x50, 0x0c, 0xde, 0x25, 0x7c, 0x9e, 0x74, 0x5b, 0x2e, 0xc5, 0x6d, 0xe1, 0x15, - 0x38, 0xff, 0x8d, 0x56, 0xe0, 0xe9, 0xb1, 0x57, 0xe0, 0x33, 0x50, 0x64, 0x0f, 0xba, 0x8b, 0x0f, - 0xc5, 0x8a, 0x5a, 0x60, 0x04, 0x0d, 0x1f, 0x0e, 0xc2, 0x70, 0x76, 0xa2, 0x30, 0x8c, 0x81, 0x3a, - 0x73, 0x71, 0x50, 0xe7, 0x41, 0xb0, 0x22, 0xf2, 0x45, 0xf4, 0xca, 0x10, 0xbd, 0xa9, 0x6b, 0x61, - 0x33, 0xba, 0x16, 0xf2, 0x75, 0xf5, 0xbd, 0x61, 0x5a, 0xbe, 0xb3, 0x90, 0xce, 0x3e, 0x87, 0x74, - 0xc2, 0xb1, 0x28, 0x32, 0xeb, 0x3d, 0x80, 0x20, 0x89, 0x48, 0x5c, 0xe7, 0xcc, 0x90, 0x31, 0x6a, - 0x21, 0x76, 0xaa, 0x36, 0x32, 0x35, 0x83, 0x73, 0x9f, 0xf1, 0xf2, 0x63, 0xc6, 0xa1, 0xcf, 0xff, - 0xcd, 0x84, 0xf2, 0x4b, 0xc6, 0x41, 0xc9, 0x83, 0x04, 0x98, 0x38, 0x61, 0x14, 0xdf, 0x8e, 0x62, - 0x89, 0x6f, 0x18, 0x75, 0x09, 0x28, 0x91, 0x55, 0x2e, 0x86, 0x2b, 0x5e, 0x73, 0xa8, 0xa7, 0x28, - 0x28, 0x75, 0xb6, 0x33, 0x38, 0xb4, 0x6c, 0xcb, 0x3b, 0xe2, 0xef, 0x67, 0xf9, 0xce, 0x40, 0x92, - 0xea, 0xec, 0xaa, 0x11, 0x7e, 0x6d, 0xf9, 0x7a, 0x9b, 0x98, 0x98, 0xc5, 0xf4, 0x8c, 0x56, 0xa0, - 0x84, 0x4d, 0x62, 0xe2, 0xc1, 0x97, 0x57, 0x78, 0xb3, 0x2f, 0xaf, 0x18, 0xfb, 0xf2, 0x4e, 0xc1, - 0xac, 0x8b, 0x0d, 0x8f, 0xd8, 0x62, 0x53, 0x2d, 0x5a, 0x74, 0x6a, 0x7a, 0xd8, 0xf3, 0x68, 0x4f, - 0xa2, 0x5c, 0x13, 0xcd, 0x50, 0x99, 0x39, 0x3f, 0xb2, 0xcc, 0x1c, 0x72, 0x00, 0x13, 0x2b, 0x33, - 0xcb, 0x23, 0xcb, 0xcc, 0x71, 0xce, 0x5f, 0x42, 0x85, 0xf6, 0xc2, 0x78, 0x85, 0x76, 0xb8, 0x2e, - 0x5d, 0x8c, 0xd4, 0xa5, 0xdf, 0xe6, 0xc7, 0xfa, 0x1b, 0x05, 0x56, 0x12, 0x9f, 0x95, 0xf8, 0x5c, - 0xef, 0xc4, 0x8e, 0x72, 0xd6, 0x46, 0xfa, 0x2c, 0x38, 0xc9, 0x79, 0x12, 0x39, 0xc9, 0xf9, 0x60, - 0xb4, 0xe0, 0x5b, 0x3f, 0xc8, 0xf9, 0x33, 0x05, 0xce, 0xef, 0x3b, 0x66, 0xac, 0xc2, 0x13, 0xdb, - 0xfe, 0xf1, 0x13, 0xc7, 0x03, 0x59, 0xeb, 0xe7, 0x26, 0xc5, 0x59, 0xb8, 0x9c, 0xaa, 0xc2, 0x85, - 0x6c, 0x33, 0x44, 0xc9, 0xf4, 0x63, 0x58, 0xdc, 0x7e, 0x8d, 0xdb, 0xad, 0x63, 0xbb, 0x3d, 0x81, - 0x69, 0x15, 0xc8, 0xb7, 0x7b, 0xa6, 0xc0, 0x36, 0xe9, 0x63, 0xb8, 0x0a, 0xcc, 0x47, 0xab, 0x40, - 0x1d, 0x2a, 0x83, 0x1e, 0xc4, 0xf4, 0x9e, 0xa2, 0xd3, 0x6b, 0x52, 0x66, 0xaa, 0x7c, 0x5e, 0x13, - 0x2d, 0x41, 0xc7, 0xae, 0xcb, 0xc6, 0xcc, 0xe9, 0xd8, 0x75, 0xa3, 0xd9, 0x22, 0x1f, 0xcd, 0x16, - 0xea, 0xcf, 0x15, 0x28, 0xd1, 0x1e, 0xbe, 0x91, 0xfd, 0x62, 0xab, 0x95, 0x1f, 0x6c, 0xb5, 0x82, - 0x1d, 0xdb, 0x74, 0x78, 0xc7, 0x36, 0xb0, 0x7c, 0x86, 0x91, 0x93, 0x96, 0xcf, 0x06, 0x74, 0xec, - 0xba, 0xea, 0x05, 0x98, 0xe7, 0xb6, 0x89, 0x91, 0x57, 0x20, 0xdf, 0x77, 0xbb, 0x32, 0x8e, 0xfa, - 0x6e, 0x57, 0xfd, 0x73, 0x05, 0xca, 0x75, 0xdf, 0x37, 0xda, 0x47, 0x13, 0x0c, 0x20, 0x30, 0x2e, - 0x17, 0x36, 0x2e, 0x39, 0x88, 0x81, 0xb9, 0xd3, 0x19, 0xe6, 0xce, 0x44, 0xcc, 0x55, 0x61, 0x41, - 0xda, 0x92, 0x69, 0x70, 0x13, 0xd0, 0x2e, 0x71, 0xfd, 0xc7, 0xc4, 0x7d, 0x65, 0xb8, 0xe6, 0x64, - 0x3b, 0x30, 0x04, 0xd3, 0xe2, 0xfa, 0x69, 0xfe, 0xea, 0x8c, 0xc6, 0x9e, 0xd5, 0x2b, 0x70, 0x22, - 0xa2, 0x2f, 0xb3, 0xe3, 0x87, 0x50, 0x62, 0x79, 0x5f, 0x94, 0xe2, 0xb7, 0xc2, 0x87, 0x2c, 0x63, - 0xad, 0x12, 0xea, 0x1f, 0xc2, 0x12, 0xad, 0x0f, 0x18, 0x3d, 0xf8, 0x14, 0xbf, 0x1f, 0xab, 0x53, - 0xcf, 0x65, 0x28, 0x8a, 0xd5, 0xa8, 0x7f, 0xaf, 0xc0, 0x0c, 0xa3, 0x27, 0xd6, 0xec, 0x33, 0x50, - 0x74, 0xb1, 0x43, 0x74, 0xdf, 0xe8, 0x04, 0x97, 0x7d, 0x29, 0x61, 0xcf, 0xe8, 0x78, 0xec, 0xae, - 0x32, 0x7d, 0x69, 0x5a, 0x1d, 0xec, 0xf9, 0xf2, 0xc6, 0x6f, 0x89, 0xd2, 0xb6, 0x38, 0x89, 0x3a, - 0xc9, 0xb3, 0xfe, 0x98, 0xd7, 0x9d, 0xd3, 0x1a, 0x7b, 0x46, 0xeb, 0xfc, 0xfe, 0xd9, 0x38, 0x40, - 0x38, 0xbb, 0x9d, 0x56, 0x83, 0x42, 0x0c, 0xfb, 0x0e, 0xda, 0xea, 0x36, 0xa0, 0xb0, 0x17, 0x84, - 0xbf, 0x6f, 0xc2, 0x2c, 0x73, 0x92, 0xac, 0x8e, 0x56, 0x32, 0xdc, 0xa0, 0x09, 0x36, 0xd5, 0x00, - 0xc4, 0x1d, 0x1c, 0xa9, 0x88, 0x26, 0x9f, 0x95, 0x21, 0x15, 0xd2, 0x3f, 0x2a, 0x70, 0x22, 0xd2, - 0x87, 0xb0, 0xf5, 0x46, 0xb4, 0x93, 0x4c, 0x53, 0x45, 0x07, 0x9b, 0x91, 0x25, 0xe1, 0x66, 0x96, - 0x49, 0xbf, 0xa5, 0xe5, 0xe0, 0x9f, 0x14, 0x80, 0x7a, 0xdf, 0x3f, 0x12, 0xc8, 0x60, 0x78, 0x66, - 0x94, 0xe8, 0xcc, 0xd0, 0x77, 0x8e, 0xe1, 0x79, 0xaf, 0x88, 0x2b, 0xf7, 0x34, 0x41, 0x9b, 0x61, - 0x78, 0x7d, 0xff, 0x48, 0x1e, 0x60, 0xd1, 0x67, 0x74, 0x09, 0x16, 0xf8, 0x05, 0x73, 0xdd, 0x30, - 0x4d, 0x17, 0x7b, 0x9e, 0x38, 0xc9, 0x2a, 0x73, 0x6a, 0x9d, 0x13, 0x29, 0x9b, 0x65, 0x62, 0xdb, - 0xb7, 0xfc, 0x63, 0xdd, 0x27, 0x2f, 0xb0, 0x2d, 0xf6, 0x26, 0x65, 0x49, 0xdd, 0xa3, 0x44, 0xca, - 0xe6, 0xe2, 0x8e, 0xe5, 0xf9, 0xae, 0x64, 0x93, 0xa7, 0x26, 0x82, 0xca, 0xd8, 0xe8, 0xa4, 0x54, - 0x76, 0xfb, 0xdd, 0x2e, 0x77, 0xf1, 0x9b, 0x4f, 0xfb, 0xfb, 0x62, 0x40, 0xb9, 0xac, 0x98, 0x1e, - 0x38, 0x4d, 0x0c, 0xf7, 0x2d, 0x82, 0x30, 0xef, 0xc3, 0x52, 0x68, 0x0c, 0x22, 0xac, 0x22, 0x45, - 0xa4, 0x12, 0x2d, 0x22, 0xd5, 0x27, 0x80, 0x38, 0xee, 0xf0, 0x0d, 0xc7, 0xad, 0x9e, 0x84, 0x13, - 0x11, 0x45, 0x62, 0x25, 0xbe, 0x0e, 0x65, 0x71, 0x9b, 0x48, 0x04, 0xca, 0x69, 0x28, 0xd0, 0x8c, - 0xda, 0xb6, 0x4c, 0x79, 0xba, 0x39, 0xe7, 0x10, 0x73, 0xd3, 0x32, 0x5d, 0xf5, 0x13, 0x28, 0x6b, - 0xbc, 0x1f, 0xc1, 0xfb, 0x18, 0x16, 0xc4, 0xdd, 0x23, 0x3d, 0x72, 0xa7, 0x2f, 0xed, 0xce, 0x78, - 0xb8, 0x13, 0xad, 0x6c, 0x87, 0x9b, 0xaa, 0x09, 0x35, 0x5e, 0x32, 0x44, 0xd4, 0xcb, 0xc1, 0x3e, - 0x06, 0xf9, 0x6b, 0x89, 0x91, 0xbd, 0x44, 0xe5, 0xcb, 0x6e, 0xb8, 0xa9, 0x9e, 0x83, 0x33, 0xa9, - 0xbd, 0x08, 0x4f, 0x38, 0x50, 0x19, 0xbc, 0x30, 0x2d, 0x79, 0xcc, 0xcb, 0x8e, 0x6f, 0x95, 0xd0, - 0xf1, 0xed, 0xa9, 0xa0, 0x48, 0xcc, 0xc9, 0x45, 0x8c, 0x55, 0x80, 0x83, 0x72, 0x3f, 0x9f, 0x55, - 0xee, 0x4f, 0x47, 0xca, 0x7d, 0xb5, 0x15, 0xf8, 0x53, 0x6c, 0xc3, 0x1e, 0xb1, 0xed, 0x22, 0xef, - 0x5b, 0x26, 0x44, 0x75, 0xd8, 0x28, 0x39, 0xab, 0x16, 0x92, 0x52, 0xaf, 0x41, 0x39, 0x9a, 0x1a, - 0x43, 0x79, 0x4e, 0x49, 0xe4, 0xb9, 0x85, 0x58, 0x8a, 0xfb, 0x30, 0x56, 0x01, 0x67, 0xfb, 0x38, - 0x56, 0xff, 0xde, 0x8f, 0x24, 0xbb, 0xeb, 0x29, 0x27, 0xaf, 0xbf, 0xa5, 0x3c, 0xb7, 0x2c, 0xd6, - 0x83, 0xc7, 0x1e, 0x95, 0x17, 0x83, 0x56, 0x2f, 0x42, 0x69, 0x3f, 0xeb, 0x07, 0x09, 0xd3, 0xf2, - 0x96, 0xc3, 0x6d, 0x58, 0x7e, 0x6c, 0x75, 0xb1, 0x77, 0xec, 0xf9, 0xb8, 0xd7, 0x60, 0x49, 0xe9, - 0xd0, 0xc2, 0x2e, 0x5a, 0x05, 0x60, 0x5b, 0x18, 0x87, 0x58, 0xc1, 0x3d, 0xf5, 0x10, 0x45, 0xfd, - 0x6f, 0x05, 0x16, 0x07, 0x82, 0xfb, 0x6c, 0xeb, 0x76, 0x16, 0x8a, 0x74, 0xbc, 0x9e, 0x6f, 0xf4, - 0x1c, 0x79, 0x9e, 0x15, 0x10, 0xd0, 0x3d, 0x98, 0x39, 0xf4, 0x24, 0x64, 0x94, 0x0a, 0xa0, 0xa7, - 0x19, 0xa2, 0x4d, 0x1f, 0x7a, 0x0d, 0x13, 0x7d, 0x04, 0xd0, 0xf7, 0xb0, 0x29, 0xce, 0xb0, 0xf2, - 0x59, 0xd5, 0xc2, 0x7e, 0xf8, 0x54, 0x9a, 0x0a, 0xf0, 0x0b, 0x12, 0xf7, 0xa1, 0x64, 0xd9, 0xc4, - 0xc4, 0xec, 0xcc, 0xd1, 0x14, 0xa8, 0xd2, 0x08, 0x71, 0xe0, 0x12, 0xfb, 0x1e, 0x36, 0x55, 0x2c, - 0xd6, 0x42, 0xe9, 0x5f, 0x11, 0x28, 0x4d, 0x58, 0xe2, 0x49, 0xeb, 0x30, 0x30, 0x5c, 0x46, 0xec, - 0xda, 0xb0, 0xd1, 0x31, 0x6f, 0x69, 0x15, 0x4b, 0x94, 0x36, 0x52, 0x54, 0xbd, 0x0b, 0x27, 0x23, - 0x3b, 0xa4, 0x09, 0xb6, 0x2c, 0xea, 0x6e, 0x0c, 0x28, 0x19, 0x84, 0xb3, 0x80, 0x21, 0x64, 0x34, - 0x8f, 0x82, 0x21, 0x3c, 0x0e, 0x43, 0x78, 0xea, 0xe7, 0x70, 0x3a, 0x82, 0xe8, 0x44, 0x2c, 0xba, - 0x1f, 0xab, 0xdc, 0x2e, 0x8f, 0xd2, 0x1a, 0x2b, 0xe1, 0xfe, 0x57, 0x81, 0xe5, 0x34, 0x86, 0x37, - 0x44, 0x1c, 0x7f, 0x9c, 0x71, 0x19, 0xee, 0xce, 0x78, 0x66, 0xfd, 0x4e, 0xd0, 0xda, 0x3d, 0xa8, - 0xa5, 0xf9, 0x33, 0x39, 0x4b, 0xf9, 0x49, 0x66, 0xe9, 0x67, 0xf9, 0x10, 0xf2, 0x5e, 0xf7, 0x7d, - 0xd7, 0x3a, 0xe8, 0xd3, 0x90, 0x7f, 0xeb, 0x68, 0x56, 0x23, 0xc0, 0x65, 0xb8, 0x6b, 0x6f, 0x0d, - 0x11, 0x1f, 0xd8, 0x91, 0x8a, 0xcd, 0x7c, 0x1a, 0xc5, 0x66, 0x38, 0xa6, 0x7e, 0x7b, 0x3c, 0x7d, - 0xdf, 0x59, 0x00, 0xf4, 0x67, 0x39, 0x58, 0x88, 0x4e, 0x11, 0xda, 0x06, 0x30, 0x02, 0xcb, 0xc5, - 0x87, 0x72, 0x69, 0xac, 0x61, 0x6a, 0x21, 0x41, 0xf4, 0x1e, 0xe4, 0xdb, 0x4e, 0x5f, 0xcc, 0x5a, - 0xca, 0x61, 0xf0, 0xa6, 0xd3, 0xe7, 0x19, 0x85, 0xb2, 0xd1, 0x3d, 0x15, 0x3f, 0xdb, 0xcf, 0xce, - 0x92, 0xcf, 0xd9, 0x7b, 0x2e, 0x23, 0x98, 0xd1, 0x53, 0x58, 0x78, 0xe5, 0x5a, 0xbe, 0x71, 0xd0, - 0xc5, 0x7a, 0xd7, 0x38, 0xc6, 0xae, 0xc8, 0x92, 0x63, 0x24, 0xb2, 0xb2, 0x14, 0x7c, 0x46, 0xe5, - 0xd4, 0x3f, 0x81, 0x82, 0xb4, 0x68, 0xc4, 0x8a, 0xb0, 0x07, 0x2b, 0x7d, 0xca, 0xa6, 0xb3, 0x8b, - 0x6b, 0xb6, 0x61, 0x13, 0xdd, 0xc3, 0x74, 0x19, 0x97, 0x57, 0xea, 0x47, 0xa4, 0xe8, 0x65, 0x26, - 0xbd, 0x49, 0x5c, 0xdc, 0x34, 0x6c, 0xd2, 0xe2, 0xa2, 0xea, 0x4b, 0x28, 0x85, 0x06, 0x38, 0xc2, - 0x84, 0x06, 0x2c, 0xc9, 0xa3, 0x78, 0x0f, 0xfb, 0x62, 0x79, 0x19, 0xab, 0xf3, 0x45, 0x21, 0xd7, - 0xc2, 0x3e, 0xbf, 0x3e, 0x71, 0x1f, 0x4e, 0x6b, 0x98, 0x38, 0xd8, 0x0e, 0xe6, 0xf3, 0x19, 0xe9, - 0x4c, 0x90, 0xc1, 0xcf, 0x42, 0x2d, 0x4d, 0x9e, 0xe7, 0x87, 0xeb, 0x67, 0xa1, 0x20, 0x7f, 0x5d, - 0x8a, 0xe6, 0x20, 0xbf, 0xb7, 0xb9, 0x5b, 0x99, 0xa2, 0x0f, 0xfb, 0x5b, 0xbb, 0x15, 0xe5, 0x7a, - 0x0f, 0x2a, 0xf1, 0x1f, 0x54, 0xa2, 0x15, 0x38, 0xb1, 0xab, 0xed, 0xec, 0xd6, 0x9f, 0xd4, 0xf7, - 0x1a, 0x3b, 0x4d, 0x7d, 0x57, 0x6b, 0x7c, 0x5c, 0xdf, 0xdb, 0xae, 0x4c, 0xa1, 0x35, 0x38, 0x17, - 0x7e, 0xf1, 0x74, 0xa7, 0xb5, 0xa7, 0xef, 0xed, 0xe8, 0x9b, 0x3b, 0xcd, 0xbd, 0x7a, 0xa3, 0xb9, - 0xad, 0x55, 0x14, 0x74, 0x0e, 0x4e, 0x87, 0x59, 0x1e, 0x35, 0xb6, 0x1a, 0xda, 0xf6, 0x26, 0x7d, - 0xae, 0x3f, 0xab, 0xe4, 0xae, 0xdf, 0x82, 0x72, 0xe4, 0xf7, 0x8f, 0xd4, 0x90, 0xdd, 0x9d, 0xad, - 0xca, 0x14, 0x2a, 0x43, 0x31, 0xac, 0xa7, 0x00, 0xd3, 0xcd, 0x9d, 0xad, 0xed, 0x4a, 0xee, 0xfa, - 0x5d, 0x58, 0x8c, 0xdd, 0x9c, 0x45, 0x4b, 0x50, 0x6e, 0xd5, 0x9b, 0x5b, 0x8f, 0x76, 0x3e, 0xd5, - 0xb5, 0xed, 0xfa, 0xd6, 0x67, 0x95, 0x29, 0xb4, 0x0c, 0x15, 0x49, 0x6a, 0xee, 0xec, 0x71, 0xaa, - 0x72, 0xfd, 0x45, 0xec, 0xcb, 0xc2, 0xe8, 0x24, 0x2c, 0x05, 0xdd, 0xe8, 0x9b, 0xda, 0x76, 0x7d, - 0x6f, 0x9b, 0xf6, 0x1e, 0x21, 0x6b, 0xfb, 0xcd, 0x66, 0xa3, 0xf9, 0xa4, 0xa2, 0x50, 0xad, 0x03, - 0xf2, 0xf6, 0xa7, 0x0d, 0xca, 0x9c, 0x8b, 0x32, 0xef, 0x37, 0x7f, 0xd8, 0xdc, 0xf9, 0xa4, 0x59, - 0xc9, 0x6f, 0xfc, 0x72, 0x09, 0x16, 0x64, 0x79, 0x87, 0x5d, 0x76, 0x97, 0x65, 0x17, 0xe6, 0xe4, - 0x6f, 0x94, 0x53, 0xf2, 0x72, 0xf4, 0x97, 0xd5, 0xb5, 0xb5, 0x21, 0x1c, 0xa2, 0xca, 0x9e, 0x42, - 0x07, 0xac, 0xea, 0x0d, 0xdd, 0x64, 0xbe, 0x9c, 0x5a, 0x63, 0x26, 0x2e, 0x4f, 0xd7, 0xae, 0x8c, - 0xe4, 0x0b, 0xfa, 0xc0, 0xb4, 0xb0, 0x0d, 0xff, 0x54, 0x07, 0x5d, 0x49, 0xab, 0x48, 0x53, 0x7e, - 0x0b, 0x54, 0xbb, 0x3a, 0x9a, 0x31, 0xe8, 0xe6, 0x05, 0x54, 0xe2, 0x3f, 0xdb, 0x41, 0x29, 0x80, - 0x69, 0xc6, 0x6f, 0x83, 0x6a, 0xd7, 0xc7, 0x61, 0x0d, 0x77, 0x96, 0xf8, 0x81, 0xcb, 0xb5, 0x71, - 0x7e, 0x31, 0x90, 0xd9, 0x59, 0xd6, 0x8f, 0x0b, 0xb8, 0x03, 0xa3, 0xb7, 0x94, 0x51, 0xea, 0xaf, - 0x49, 0x52, 0xee, 0xb8, 0xa7, 0x39, 0x30, 0xfd, 0xc2, 0xb3, 0x3a, 0x85, 0x8e, 0x60, 0x31, 0x76, - 0x29, 0x01, 0xa5, 0x88, 0xa7, 0xdf, 0xbe, 0xa8, 0x5d, 0x1b, 0x83, 0x33, 0x1a, 0x11, 0xe1, 0x4b, - 0x08, 0xe9, 0x11, 0x91, 0x72, 0xc5, 0x21, 0x3d, 0x22, 0x52, 0xef, 0x33, 0xb0, 0xe0, 0x8e, 0x5c, - 0x3e, 0x48, 0x0b, 0xee, 0xb4, 0x2b, 0x0f, 0xb5, 0x2b, 0x23, 0xf9, 0xc2, 0x4e, 0x8b, 0x5d, 0x45, - 0x48, 0x73, 0x5a, 0xfa, 0x55, 0x87, 0xda, 0xb5, 0x31, 0x38, 0xe3, 0x51, 0x30, 0x38, 0xd8, 0xcc, - 0x8a, 0x82, 0xc4, 0x31, 0x7c, 0x56, 0x14, 0x24, 0xcf, 0x48, 0x45, 0x14, 0xc4, 0x0e, 0x24, 0xaf, - 0x8e, 0x71, 0x80, 0x92, 0x1d, 0x05, 0xe9, 0x47, 0x2d, 0xea, 0x14, 0xfa, 0x53, 0x05, 0xaa, 0x59, - 0x87, 0x13, 0x28, 0xa5, 0xaa, 0x1b, 0x71, 0x9e, 0x52, 0xdb, 0x98, 0x44, 0x24, 0xb0, 0xe2, 0x4b, - 0x40, 0xc9, 0xd5, 0x0e, 0xbd, 0x9b, 0x36, 0x33, 0x19, 0x6b, 0x6a, 0xed, 0xbd, 0xf1, 0x98, 0x83, - 0x2e, 0x5b, 0x50, 0x90, 0xc7, 0x21, 0x28, 0x25, 0x4b, 0xc7, 0x0e, 0x63, 0x6a, 0xea, 0x30, 0x96, - 0x40, 0xe9, 0x13, 0x98, 0xa6, 0x54, 0x74, 0x2e, 0x9d, 0x5b, 0x2a, 0x5b, 0xcd, 0x7a, 0x1d, 0x28, - 0x7a, 0x0e, 0xb3, 0x1c, 0xff, 0x47, 0x29, 0x78, 0x43, 0xe4, 0x94, 0xa2, 0x76, 0x21, 0x9b, 0x21, - 0x50, 0xf7, 0x05, 0xff, 0xf7, 0x15, 0x02, 0xda, 0x47, 0xef, 0xa4, 0xff, 0x1e, 0x38, 0x7a, 0x92, - 0x50, 0xbb, 0x34, 0x82, 0x2b, 0xfc, 0x51, 0xc4, 0x6a, 0xdd, 0x2b, 0x23, 0x37, 0x2c, 0xd9, 0x1f, - 0x45, 0xfa, 0x96, 0x88, 0x07, 0x49, 0x72, 0xcb, 0x94, 0x16, 0x24, 0x99, 0x1b, 0xd5, 0xb4, 0x20, - 0xc9, 0xde, 0x85, 0xa9, 0x53, 0xc8, 0x87, 0x13, 0x29, 0x00, 0x19, 0x7a, 0x2f, 0x2b, 0xc8, 0xd3, - 0xd0, 0xba, 0xda, 0x8d, 0x31, 0xb9, 0xc3, 0x93, 0x2f, 0x3e, 0xfa, 0xf3, 0xd9, 0xa8, 0x51, 0xe6, - 0xe4, 0xc7, 0x3f, 0xf1, 0x8d, 0x7f, 0xcf, 0xc3, 0x3c, 0x07, 0x3f, 0x45, 0x05, 0xf3, 0x19, 0xc0, - 0xe0, 0xdc, 0x01, 0x5d, 0x4c, 0xf7, 0x49, 0xe4, 0x6c, 0xa6, 0xf6, 0xce, 0x70, 0xa6, 0x70, 0xa0, - 0x85, 0x30, 0xfc, 0xb4, 0x40, 0x4b, 0x1e, 0x55, 0xa4, 0x05, 0x5a, 0xca, 0x41, 0x80, 0x3a, 0x85, - 0x3e, 0x86, 0x62, 0x00, 0x16, 0xa3, 0x34, 0xb0, 0x39, 0x86, 0x86, 0xd7, 0x2e, 0x0e, 0xe5, 0x09, - 0x5b, 0x1d, 0x42, 0x82, 0xd3, 0xac, 0x4e, 0x22, 0xce, 0x69, 0x56, 0xa7, 0xc1, 0xc9, 0x03, 0x9f, - 0x70, 0xbc, 0x28, 0xd3, 0x27, 0x11, 0xb8, 0x2e, 0xd3, 0x27, 0x51, 0xd0, 0x49, 0x9d, 0x7a, 0x74, - 0xf9, 0xd7, 0x5f, 0xad, 0x2a, 0xff, 0xf2, 0xd5, 0xea, 0xd4, 0x4f, 0xbf, 0x5e, 0x55, 0x7e, 0xfd, - 0xf5, 0xaa, 0xf2, 0xcf, 0x5f, 0xaf, 0x2a, 0xff, 0xf1, 0xf5, 0xaa, 0xf2, 0x97, 0xff, 0xb9, 0x3a, - 0xf5, 0xa3, 0x82, 0x94, 0x3e, 0x98, 0x65, 0xff, 0x84, 0xe6, 0x83, 0xff, 0x0f, 0x00, 0x00, 0xff, - 0xff, 0xb5, 0x80, 0xdd, 0xf4, 0x4a, 0x48, 0x00, 0x00, + 0x76, 0x57, 0x93, 0xfa, 0x20, 0x1f, 0x45, 0x89, 0x2a, 0xcb, 0x16, 0x4d, 0x8f, 0x35, 0x56, 0xcf, + 0xf8, 0x73, 0x66, 0xe4, 0xb1, 0x66, 0xd7, 0x13, 0xdb, 0xb3, 0xb6, 0x69, 0x49, 0xb6, 0x99, 0xb5, + 0x29, 0xa6, 0x29, 0xcd, 0xc7, 0xce, 0x00, 0xbd, 0x2d, 0x76, 0x89, 0xea, 0x35, 0xd9, 0xd5, 0xd3, + 0xdd, 0xb4, 0xad, 0x04, 0x08, 0x16, 0x08, 0xb2, 0x87, 0x00, 0x01, 0x72, 0xce, 0x71, 0x73, 0xc8, + 0x21, 0xb7, 0x00, 0x41, 0x0e, 0x39, 0x6d, 0xb0, 0x87, 0xbd, 0x04, 0xc8, 0x69, 0x91, 0x8f, 0x4b, + 0x66, 0x92, 0x5c, 0x72, 0x08, 0xf2, 0x07, 0xe4, 0x10, 0xd4, 0x57, 0xb3, 0x3f, 0xf9, 0xe1, 0xf1, + 0xee, 0x4c, 0x4e, 0xea, 0x7a, 0xfd, 0xde, 0xab, 0x57, 0xaf, 0x5e, 0xbf, 0x7a, 0xf5, 0xab, 0xa2, + 0xa0, 0x68, 0x38, 0xd6, 0xa6, 0xe3, 0x12, 0x9f, 0xa0, 0x8a, 0x3b, 0xb0, 0x7d, 0xab, 0x8f, 0x37, + 0x9f, 0xdf, 0x30, 0x7a, 0xce, 0xb1, 0xb1, 0x55, 0x7b, 0xaf, 0x6b, 0xf9, 0xc7, 0x83, 0xc3, 0xcd, + 0x0e, 0xe9, 0x5f, 0xef, 0x92, 0x2e, 0xb9, 0xce, 0x18, 0x0f, 0x07, 0x47, 0xac, 0xc5, 0x1a, 0xec, + 0x89, 0x2b, 0x50, 0xaf, 0xc1, 0xd2, 0xc7, 0xd8, 0xf5, 0x2c, 0x62, 0x6b, 0xf8, 0xcb, 0x01, 0xf6, + 0x7c, 0x54, 0x85, 0x85, 0xe7, 0x9c, 0x52, 0x55, 0x2e, 0x28, 0x57, 0x8a, 0x9a, 0x6c, 0xaa, 0x7f, + 0xa9, 0xc0, 0x72, 0xc0, 0xec, 0x39, 0xc4, 0xf6, 0x70, 0x36, 0x37, 0xda, 0x80, 0x45, 0x61, 0x9c, + 0x6e, 0x1b, 0x7d, 0x5c, 0xcd, 0xb1, 0xd7, 0x25, 0x41, 0x6b, 0x1a, 0x7d, 0x8c, 0x2e, 0xc3, 0xb2, + 0x64, 0x91, 0x4a, 0xf2, 0x8c, 0x6b, 0x49, 0x90, 0x45, 0x6f, 0x68, 0x13, 0x4e, 0x49, 0x46, 0xc3, + 0xb1, 0x02, 0xe6, 0x59, 0xc6, 0xbc, 0x22, 0x5e, 0xd5, 0x1d, 0x4b, 0xf0, 0xab, 0x9f, 0x43, 0x71, + 0xa7, 0xd9, 0xde, 0x26, 0xf6, 0x91, 0xd5, 0xa5, 0x26, 0x7a, 0xd8, 0xa5, 0x32, 0x55, 0xe5, 0x42, + 0x9e, 0x9a, 0x28, 0x9a, 0xa8, 0x06, 0x05, 0x0f, 0x1b, 0x6e, 0xe7, 0x18, 0x7b, 0xd5, 0x1c, 0x7b, + 0x15, 0xb4, 0xa9, 0x14, 0x71, 0x7c, 0x8b, 0xd8, 0x5e, 0x35, 0xcf, 0xa5, 0x44, 0x53, 0xfd, 0xb9, + 0x02, 0xa5, 0x16, 0x71, 0xfd, 0xa7, 0x86, 0xe3, 0x58, 0x76, 0x17, 0xdd, 0x84, 0x02, 0xf3, 0x65, + 0x87, 0xf4, 0x98, 0x0f, 0x96, 0xb6, 0x6a, 0x9b, 0xf1, 0x69, 0xd9, 0x6c, 0x09, 0x0e, 0x2d, 0xe0, + 0x45, 0x17, 0x61, 0xa9, 0x43, 0x6c, 0xdf, 0xb0, 0x6c, 0xec, 0xea, 0x0e, 0x71, 0x7d, 0xe6, 0xa2, + 0x39, 0xad, 0x1c, 0x50, 0x69, 0x2f, 0xe8, 0x1c, 0x14, 0x8f, 0x89, 0xe7, 0x73, 0x8e, 0x3c, 0xe3, + 0x28, 0x50, 0x02, 0x7b, 0xb9, 0x06, 0x0b, 0xec, 0xa5, 0xe5, 0x08, 0x67, 0xcc, 0xd3, 0x66, 0xc3, + 0x51, 0x7f, 0xad, 0xc0, 0xdc, 0x53, 0x32, 0xb0, 0xfd, 0x58, 0x37, 0x86, 0x7f, 0x2c, 0x26, 0x2a, + 0xd4, 0x8d, 0xe1, 0x1f, 0x0f, 0xbb, 0xa1, 0x1c, 0x7c, 0xae, 0x78, 0x37, 0xf4, 0x65, 0x0d, 0x0a, + 0x2e, 0x36, 0x4c, 0x62, 0xf7, 0x4e, 0x98, 0x09, 0x05, 0x2d, 0x68, 0xd3, 0x49, 0xf4, 0x70, 0xcf, + 0xb2, 0x07, 0x2f, 0x75, 0x17, 0xf7, 0x8c, 0x43, 0xdc, 0x63, 0xa6, 0x14, 0xb4, 0x25, 0x41, 0xd6, + 0x38, 0x15, 0xed, 0x40, 0xc9, 0x71, 0x89, 0x63, 0x74, 0x0d, 0xea, 0xc7, 0xea, 0x1c, 0x73, 0x95, + 0x9a, 0x74, 0x15, 0x33, 0xbb, 0x35, 0xe4, 0xd4, 0xc2, 0x62, 0xea, 0x5f, 0x2b, 0xb0, 0x4c, 0x83, + 0xc7, 0x73, 0x8c, 0x0e, 0xde, 0x63, 0x53, 0x82, 0x6e, 0xc1, 0x82, 0x8d, 0xfd, 0x17, 0xc4, 0x7d, + 0x26, 0x26, 0xe0, 0xcd, 0xa4, 0xd6, 0x40, 0xe6, 0x29, 0x31, 0xb1, 0x26, 0xf9, 0xd1, 0x0d, 0xc8, + 0x3b, 0x96, 0xc9, 0x06, 0x3c, 0x81, 0x18, 0xe5, 0xa5, 0x22, 0x96, 0xd3, 0x61, 0x7e, 0x98, 0x44, + 0xc4, 0x72, 0x3a, 0xaa, 0x0a, 0xd0, 0xb0, 0xfd, 0x9b, 0xdf, 0xfb, 0xd8, 0xe8, 0x0d, 0x30, 0x5a, + 0x85, 0xb9, 0xe7, 0xf4, 0x81, 0x19, 0x9b, 0xd7, 0x78, 0x43, 0xfd, 0x2a, 0x0f, 0xe7, 0x9e, 0x50, + 0x7f, 0xb5, 0x0d, 0xdb, 0x3c, 0x24, 0x2f, 0xdb, 0xb8, 0x33, 0x70, 0x2d, 0xff, 0x64, 0x9b, 0xd8, + 0x3e, 0x7e, 0xe9, 0xa3, 0x26, 0xac, 0xd8, 0x52, 0xb3, 0x2e, 0x43, 0x93, 0x6a, 0x28, 0x6d, 0x6d, + 0x8c, 0x30, 0x82, 0xbb, 0x48, 0xab, 0xd8, 0x51, 0x82, 0x87, 0x1e, 0x0f, 0xe7, 0x4d, 0x6a, 0xcb, + 0x31, 0x6d, 0x29, 0x43, 0x6a, 0xef, 0x32, 0xcb, 0x84, 0x2e, 0x39, 0xb1, 0x52, 0xd3, 0x47, 0x40, + 0xbf, 0x6a, 0xdd, 0xf0, 0xf4, 0x81, 0x87, 0x5d, 0xe6, 0x98, 0xd2, 0xd6, 0x1b, 0x49, 0x2d, 0x43, + 0x17, 0x68, 0x45, 0x77, 0x60, 0xd7, 0xbd, 0x03, 0x0f, 0xbb, 0x2c, 0x09, 0x88, 0x58, 0xd2, 0x5d, + 0x42, 0xfc, 0x23, 0x4f, 0xc6, 0x8f, 0x24, 0x6b, 0x8c, 0x8a, 0xae, 0xc3, 0x29, 0x6f, 0xe0, 0x38, + 0x3d, 0xdc, 0xc7, 0xb6, 0x6f, 0xf4, 0xf4, 0xae, 0x4b, 0x06, 0x8e, 0x57, 0x9d, 0xbb, 0x90, 0xbf, + 0x92, 0xd7, 0x50, 0xf8, 0xd5, 0x23, 0xf6, 0x06, 0xad, 0x03, 0x38, 0xae, 0xf5, 0xdc, 0xea, 0xe1, + 0x2e, 0x36, 0xab, 0xf3, 0x4c, 0x69, 0x88, 0x82, 0xde, 0x87, 0x55, 0x0f, 0x77, 0x3a, 0xa4, 0xef, + 0xe8, 0x8e, 0x4b, 0x8e, 0xac, 0x1e, 0xe6, 0xd1, 0xbf, 0xc0, 0xa2, 0x1f, 0x89, 0x77, 0x2d, 0xfe, + 0x8a, 0x7d, 0x07, 0x77, 0x59, 0x4e, 0xa3, 0x23, 0x65, 0x9d, 0x57, 0x0b, 0x13, 0x0c, 0x15, 0xd8, + 0x50, 0x99, 0x49, 0xea, 0xcf, 0x73, 0x70, 0x9a, 0x79, 0xb2, 0x45, 0x4c, 0x31, 0xcd, 0x22, 0x49, + 0xbd, 0x05, 0xe5, 0x0e, 0xd3, 0xa9, 0x3b, 0x86, 0x8b, 0x6d, 0x5f, 0x7c, 0xa4, 0x8b, 0x9c, 0xd8, + 0x62, 0x34, 0xf4, 0x29, 0x54, 0x3c, 0x11, 0x15, 0x7a, 0x87, 0x87, 0x85, 0x98, 0xb3, 0xf7, 0x92, + 0x26, 0x8c, 0x88, 0x25, 0x6d, 0xd9, 0x4b, 0x04, 0xd7, 0x82, 0x77, 0xe2, 0x75, 0xfc, 0x1e, 0xcf, + 0x76, 0xa5, 0xad, 0xef, 0x65, 0x28, 0x8c, 0x1b, 0xbe, 0xd9, 0xe6, 0x62, 0xbb, 0xb6, 0xef, 0x9e, + 0x68, 0x52, 0x49, 0xed, 0x36, 0x2c, 0x86, 0x5f, 0xa0, 0x0a, 0xe4, 0x9f, 0xe1, 0x13, 0x31, 0x28, + 0xfa, 0x38, 0xfc, 0x08, 0x78, 0xae, 0xe1, 0x8d, 0xdb, 0xb9, 0xdf, 0x51, 0x54, 0x17, 0xd0, 0xb0, + 0x97, 0xa7, 0xd8, 0x37, 0x4c, 0xc3, 0x37, 0x10, 0x82, 0x59, 0xb6, 0x8c, 0x70, 0x15, 0xec, 0x99, + 0x6a, 0x1d, 0x88, 0x8f, 0xb7, 0xa8, 0xd1, 0x47, 0xf4, 0x06, 0x14, 0x83, 0x40, 0x17, 0x6b, 0xc9, + 0x90, 0x40, 0x73, 0xba, 0xe1, 0xfb, 0xb8, 0xef, 0xf8, 0x2c, 0xc4, 0xca, 0x9a, 0x6c, 0xaa, 0xff, + 0x3d, 0x0b, 0x95, 0xc4, 0x9c, 0xdc, 0x87, 0x42, 0x5f, 0x74, 0x2f, 0x3e, 0xb4, 0xb7, 0x53, 0x12, + 0x7b, 0xc2, 0x54, 0x2d, 0x90, 0xa2, 0x79, 0x93, 0xe6, 0xd0, 0xd0, 0xfa, 0x17, 0xb4, 0xe9, 0x8c, + 0xf7, 0x48, 0x57, 0x37, 0x2d, 0x17, 0x77, 0x7c, 0xe2, 0x9e, 0x08, 0x73, 0x17, 0x7b, 0xa4, 0xbb, + 0x23, 0x69, 0xe8, 0x36, 0x80, 0x69, 0x7b, 0x74, 0xb2, 0x8f, 0xac, 0x2e, 0x33, 0xba, 0xb4, 0x75, + 0x2e, 0x69, 0x44, 0xb0, 0xd8, 0x69, 0x45, 0xd3, 0xf6, 0x84, 0xf9, 0x0f, 0xa0, 0x4c, 0xd7, 0x0c, + 0xbd, 0xcf, 0xd7, 0x29, 0xfe, 0xa5, 0x94, 0xb6, 0xce, 0xa7, 0x8d, 0x21, 0x58, 0xcd, 0xb4, 0x45, + 0x67, 0xd8, 0xf0, 0xd0, 0x43, 0x98, 0x67, 0xc9, 0xdb, 0xab, 0xce, 0x33, 0xe1, 0xcd, 0x51, 0x0e, + 0x10, 0x11, 0xf1, 0x84, 0x09, 0xf0, 0x80, 0x10, 0xd2, 0xe8, 0x00, 0x4a, 0x86, 0x6d, 0x13, 0xdf, + 0xe0, 0x89, 0x66, 0x81, 0x29, 0xfb, 0x60, 0x02, 0x65, 0xf5, 0xa1, 0x14, 0xd7, 0x18, 0xd6, 0x83, + 0x7e, 0x00, 0x73, 0x2c, 0x13, 0x89, 0x0f, 0xf1, 0xf2, 0x84, 0x41, 0xab, 0x71, 0xa9, 0xda, 0x2d, + 0x28, 0x85, 0x8c, 0x9d, 0x26, 0x48, 0x6b, 0x77, 0xa1, 0x12, 0x37, 0x6d, 0xaa, 0x20, 0xff, 0x03, + 0x58, 0xd5, 0x06, 0xf6, 0xd0, 0x30, 0x59, 0x7d, 0xdd, 0x86, 0x79, 0x31, 0xd9, 0x3c, 0xe2, 0xd4, + 0xf1, 0x3e, 0xd2, 0x84, 0x44, 0xb8, 0x9c, 0x3a, 0x36, 0x6c, 0xb3, 0x87, 0x5d, 0xd1, 0xaf, 0x2c, + 0xa7, 0x1e, 0x73, 0xaa, 0xfa, 0x03, 0x38, 0x1d, 0xeb, 0x5c, 0x54, 0x73, 0x6f, 0xc3, 0x92, 0x43, + 0x4c, 0xdd, 0xe3, 0x64, 0xdd, 0x32, 0x65, 0x1a, 0x72, 0x02, 0xde, 0x86, 0x49, 0xc5, 0xdb, 0x3e, + 0x71, 0x92, 0xc6, 0x4f, 0x26, 0x5e, 0x85, 0x33, 0x71, 0x71, 0xde, 0xbd, 0x7a, 0x0f, 0xd6, 0x34, + 0xdc, 0x27, 0xcf, 0xf1, 0xab, 0xaa, 0xae, 0x41, 0x35, 0xa9, 0x40, 0x28, 0xff, 0x0c, 0xd6, 0x86, + 0xd4, 0xb6, 0x6f, 0xf8, 0x03, 0x6f, 0x2a, 0xe5, 0xa2, 0xd4, 0x3d, 0x24, 0x1e, 0x9f, 0xce, 0x82, + 0x26, 0x9b, 0xea, 0xd5, 0xb0, 0xea, 0x26, 0xaf, 0x2c, 0x78, 0x0f, 0x68, 0x09, 0x72, 0x96, 0x23, + 0xd4, 0xe5, 0x2c, 0x47, 0x7d, 0x0c, 0xc5, 0x60, 0x69, 0x46, 0x77, 0x86, 0x35, 0x66, 0x6e, 0xd2, + 0x85, 0x3c, 0x28, 0x43, 0xf7, 0x13, 0x4b, 0x89, 0xe8, 0xf2, 0x0e, 0x40, 0x90, 0xf2, 0x64, 0x85, + 0x70, 0x6e, 0x84, 0x62, 0x2d, 0xc4, 0xae, 0xfe, 0x4b, 0x24, 0x11, 0x86, 0x06, 0x61, 0x06, 0x83, + 0x30, 0x23, 0x89, 0x31, 0xf7, 0x4a, 0x89, 0xf1, 0x43, 0x98, 0xf3, 0x7c, 0xc3, 0xc7, 0xa2, 0x8a, + 0xda, 0x18, 0x25, 0x4e, 0x8d, 0xc0, 0x1a, 0xe7, 0x47, 0xe7, 0x01, 0x3a, 0x2e, 0x36, 0x7c, 0x6c, + 0xea, 0x06, 0xcf, 0xe2, 0x79, 0xad, 0x28, 0x28, 0x75, 0x1f, 0x6d, 0x0f, 0x2b, 0xc1, 0x39, 0x66, + 0xd8, 0xd5, 0x51, 0x9a, 0x23, 0x53, 0x35, 0xac, 0x09, 0x83, 0xac, 0x32, 0x3f, 0x61, 0x56, 0x11, + 0x0a, 0xb8, 0x54, 0x28, 0x67, 0x2e, 0x8c, 0xcf, 0x99, 0x5c, 0x74, 0x92, 0x9c, 0x59, 0x18, 0x9f, + 0x33, 0x85, 0xb2, 0x91, 0x39, 0xf3, 0xdb, 0x4c, 0x7a, 0xff, 0xac, 0x40, 0x35, 0xf9, 0x0d, 0x8a, + 0xdc, 0x73, 0x1b, 0xe6, 0x3d, 0x46, 0x99, 0x24, 0xf3, 0x09, 0x59, 0x21, 0x81, 0x1e, 0xc3, 0xac, + 0x65, 0x1f, 0x11, 0xb6, 0x89, 0x4b, 0xad, 0x5d, 0xb2, 0x7a, 0xdd, 0x6c, 0xd8, 0x47, 0x84, 0x3b, + 0x89, 0x69, 0xa8, 0x7d, 0x08, 0xc5, 0x80, 0x34, 0xd5, 0xd8, 0xf6, 0x60, 0x35, 0x16, 0xb2, 0xbc, + 0xd8, 0x0f, 0x22, 0x5d, 0x99, 0x2e, 0xd2, 0xd5, 0x9f, 0xe6, 0xc2, 0x5f, 0xe2, 0x43, 0xab, 0xe7, + 0x63, 0x37, 0xf1, 0x25, 0x7e, 0x24, 0xb5, 0xf3, 0xcf, 0xf0, 0xd2, 0x58, 0xed, 0xbc, 0x26, 0x15, + 0x1f, 0xd3, 0x17, 0xb0, 0xc4, 0x62, 0x4d, 0xf7, 0x70, 0x8f, 0x15, 0x1c, 0xa2, 0xf8, 0xfb, 0xfe, + 0x28, 0x35, 0xdc, 0x12, 0x1e, 0xb1, 0x6d, 0x21, 0xc7, 0x3d, 0x58, 0xee, 0x85, 0x69, 0xb5, 0xfb, + 0x80, 0x92, 0x4c, 0x53, 0xf9, 0xb4, 0x4d, 0x53, 0x1c, 0xdd, 0xe9, 0xa6, 0xac, 0x92, 0x47, 0xcc, + 0x8c, 0x49, 0x62, 0x85, 0x1b, 0xac, 0x09, 0x09, 0xf5, 0x97, 0x79, 0x80, 0xe1, 0xcb, 0xff, 0x47, + 0xb9, 0xed, 0x7e, 0x90, 0x57, 0x78, 0x21, 0x77, 0x65, 0x94, 0xe2, 0xd4, 0x8c, 0xb2, 0x17, 0xcd, + 0x28, 0xbc, 0xa4, 0x7b, 0x6f, 0xa4, 0x9a, 0xef, 0x6c, 0x2e, 0x79, 0x02, 0x67, 0xe2, 0xb1, 0x21, + 0x12, 0xc9, 0x16, 0xcc, 0x59, 0x3e, 0xee, 0x73, 0xb4, 0x27, 0x75, 0x77, 0x16, 0x12, 0xe2, 0xac, + 0xea, 0x06, 0x14, 0x1b, 0x7d, 0xa3, 0x8b, 0xdb, 0x0e, 0xee, 0xd0, 0x4e, 0x2d, 0xda, 0x10, 0x86, + 0xf0, 0x86, 0xba, 0x05, 0x85, 0x1f, 0xe2, 0x13, 0xfe, 0x51, 0x4f, 0x68, 0xa8, 0xfa, 0xa7, 0x39, + 0x58, 0x63, 0x6b, 0xc5, 0xb6, 0xc4, 0x5a, 0x34, 0xec, 0x91, 0x81, 0xdb, 0xc1, 0x1e, 0x9b, 0x6d, + 0x67, 0xa0, 0x3b, 0xd8, 0xb5, 0x88, 0x29, 0xa0, 0x80, 0x62, 0xc7, 0x19, 0xb4, 0x18, 0x01, 0x9d, + 0x03, 0xda, 0xd0, 0xbf, 0x1c, 0x10, 0x11, 0x88, 0x79, 0xad, 0xd0, 0x71, 0x06, 0xbf, 0x47, 0xdb, + 0x52, 0xd6, 0x3b, 0x36, 0x5c, 0xec, 0xb1, 0x38, 0xe3, 0xb2, 0x6d, 0x46, 0x40, 0x37, 0xe0, 0x74, + 0x1f, 0xf7, 0x89, 0x7b, 0xa2, 0xf7, 0xac, 0xbe, 0xe5, 0xeb, 0x96, 0xad, 0x1f, 0x9e, 0xf8, 0xd8, + 0x13, 0x31, 0x85, 0xf8, 0xcb, 0x27, 0xf4, 0x5d, 0xc3, 0x7e, 0x40, 0xdf, 0x20, 0x15, 0xca, 0x84, + 0xf4, 0x75, 0xaf, 0x43, 0x5c, 0xac, 0x1b, 0xe6, 0x4f, 0xd8, 0xf2, 0x99, 0xd7, 0x4a, 0x84, 0xf4, + 0xdb, 0x94, 0x56, 0x37, 0x7f, 0x82, 0xde, 0x84, 0x52, 0xc7, 0x19, 0x78, 0xd8, 0xd7, 0xe9, 0x1f, + 0xb6, 0x3a, 0x16, 0x35, 0xe0, 0xa4, 0x6d, 0x67, 0xe0, 0x85, 0x18, 0xfa, 0xd4, 0xff, 0x0b, 0x61, + 0x86, 0xa7, 0xd4, 0xcd, 0x06, 0x94, 0x23, 0x50, 0x02, 0xdd, 0xd5, 0x31, 0xcc, 0x40, 0xec, 0xea, + 0xe8, 0x33, 0xa5, 0xb9, 0xa4, 0x27, 0x3d, 0xc9, 0x9e, 0x29, 0xcd, 0x3f, 0x71, 0xe4, 0x96, 0x8e, + 0x3d, 0x53, 0x97, 0xf7, 0xf0, 0x73, 0x01, 0x37, 0x15, 0x35, 0xde, 0x50, 0x4d, 0x80, 0x6d, 0xc3, + 0x31, 0x0e, 0xad, 0x9e, 0xe5, 0x9f, 0xa0, 0xab, 0x50, 0x31, 0x4c, 0x53, 0xef, 0x48, 0x8a, 0x85, + 0x25, 0x08, 0xb8, 0x6c, 0x98, 0xe6, 0x76, 0x88, 0x8c, 0xde, 0x81, 0x15, 0xd3, 0x25, 0x4e, 0x94, + 0x97, 0xa3, 0x82, 0x15, 0xfa, 0x22, 0xcc, 0xac, 0xfe, 0xc7, 0x1c, 0x9c, 0x8f, 0x4e, 0x6c, 0x1c, + 0xae, 0xb9, 0x0f, 0x8b, 0xb1, 0x5e, 0x33, 0xa0, 0x82, 0xa1, 0xb5, 0x5a, 0x44, 0x22, 0x06, 0x5f, + 0xe4, 0x12, 0xf0, 0x45, 0x2a, 0x20, 0x94, 0x7f, 0xad, 0x80, 0xd0, 0xec, 0x6b, 0x01, 0x84, 0xe6, + 0xa6, 0x03, 0x84, 0x2e, 0xb1, 0x6d, 0x8c, 0x94, 0x66, 0x7b, 0x67, 0x1e, 0x6a, 0xe5, 0x80, 0xc7, + 0x96, 0xe8, 0x71, 0x0c, 0x38, 0x5a, 0x98, 0x06, 0x38, 0x2a, 0x64, 0x02, 0x47, 0x34, 0x6a, 0x1c, + 0xc7, 0x70, 0xfb, 0xc4, 0x95, 0xc8, 0x50, 0xb5, 0xc8, 0x4c, 0x58, 0x96, 0x74, 0x81, 0x0a, 0x65, + 0x62, 0x48, 0x90, 0x89, 0x21, 0x5d, 0x80, 0x45, 0x9b, 0xe8, 0x36, 0x7e, 0xa1, 0xd3, 0xb9, 0xf4, + 0xaa, 0x25, 0x3e, 0xb1, 0x36, 0x69, 0xe2, 0x17, 0x2d, 0x4a, 0x49, 0xa0, 0x4c, 0x8b, 0xd3, 0xa1, + 0x4c, 0x68, 0x03, 0x16, 0xfb, 0x86, 0xf7, 0x0c, 0x9b, 0xcc, 0x14, 0xaf, 0x5a, 0x66, 0x41, 0x5c, + 0xe2, 0x34, 0x6a, 0x83, 0x87, 0x2e, 0x42, 0xe0, 0x24, 0xc1, 0xb4, 0xc4, 0x98, 0xca, 0x92, 0xca, + 0xd8, 0xd4, 0xbf, 0x53, 0x60, 0x35, 0x1a, 0xe6, 0x02, 0x5b, 0x78, 0x04, 0x45, 0x57, 0x66, 0x32, + 0x11, 0xda, 0x57, 0x33, 0xca, 0xe4, 0x64, 0xea, 0xd3, 0x86, 0xb2, 0xe8, 0x47, 0x99, 0x90, 0xd6, + 0xf5, 0x71, 0xfa, 0xc6, 0x81, 0x5a, 0x6a, 0x03, 0xde, 0xfc, 0xc4, 0xb2, 0x4d, 0xf2, 0xc2, 0xcb, + 0xfc, 0x4a, 0x53, 0x62, 0x4d, 0x49, 0x89, 0x35, 0xf5, 0x17, 0x0a, 0x9c, 0x89, 0xeb, 0x12, 0xae, + 0x68, 0x24, 0x5d, 0xf1, 0x4e, 0xd2, 0xf4, 0xb8, 0x70, 0xaa, 0x33, 0xbe, 0xc8, 0x74, 0xc6, 0x8d, + 0xf1, 0x1a, 0xc7, 0xba, 0xe3, 0xaf, 0x14, 0x38, 0x9b, 0x69, 0x46, 0x6c, 0x49, 0x51, 0xe2, 0x4b, + 0x8a, 0x58, 0x8e, 0x3a, 0x64, 0x60, 0xfb, 0xa1, 0xe5, 0x68, 0x9b, 0x1d, 0x31, 0xf0, 0xbc, 0xaf, + 0xf7, 0x8d, 0x97, 0x56, 0x7f, 0xd0, 0x17, 0xeb, 0x11, 0x55, 0xf7, 0x94, 0x53, 0x5e, 0x61, 0x41, + 0x52, 0xeb, 0xb0, 0x12, 0x58, 0x39, 0x12, 0x04, 0x0c, 0x81, 0x7a, 0xb9, 0x28, 0xa8, 0x67, 0xc3, + 0xfc, 0x0e, 0x7e, 0x6e, 0x75, 0xf0, 0x6b, 0x39, 0x03, 0xb9, 0x00, 0x25, 0x07, 0xbb, 0x7d, 0xcb, + 0xf3, 0x82, 0x44, 0x5b, 0xd4, 0xc2, 0x24, 0xf5, 0x3f, 0xe7, 0x61, 0x39, 0x1e, 0x1d, 0xf7, 0x12, + 0x18, 0xe2, 0x5b, 0x29, 0x4b, 0x40, 0x7c, 0xa0, 0xa1, 0x6a, 0xf2, 0x86, 0x2c, 0x46, 0x72, 0x59, + 0x1b, 0xf9, 0xa0, 0x70, 0x11, 0x95, 0x0a, 0xf5, 0x48, 0x87, 0xf4, 0xfb, 0x86, 0x6d, 0xca, 0xa3, + 0x2b, 0xd1, 0xa4, 0xfe, 0x33, 0xdc, 0x2e, 0x75, 0x3b, 0x25, 0xb3, 0x67, 0x3a, 0x79, 0x74, 0xd7, + 0x6b, 0xd9, 0x0c, 0x8b, 0x64, 0xc9, 0xba, 0xa8, 0x81, 0x20, 0xed, 0x58, 0x2e, 0xda, 0x84, 0x59, + 0x6c, 0x3f, 0x97, 0xe5, 0x62, 0xca, 0xd9, 0x96, 0x2c, 0x8b, 0x34, 0xc6, 0x87, 0xae, 0xc3, 0x7c, + 0x9f, 0x86, 0x85, 0xdc, 0xff, 0xae, 0x65, 0x1c, 0xf1, 0x68, 0x82, 0x0d, 0x6d, 0xc1, 0x82, 0xc9, + 0xe6, 0x49, 0x6e, 0x72, 0xab, 0x29, 0x08, 0x27, 0x63, 0xd0, 0x24, 0x23, 0xda, 0x0d, 0x8a, 0xe1, + 0x62, 0x56, 0x15, 0x1b, 0x9b, 0x8a, 0xd4, 0x8a, 0x78, 0x3f, 0x5a, 0x11, 0x03, 0xd3, 0xb5, 0x35, + 0x5e, 0xd7, 0x68, 0x58, 0xf2, 0x2c, 0x14, 0x7a, 0xa4, 0xcb, 0xc3, 0xa8, 0xc4, 0x4f, 0x45, 0x7b, + 0xa4, 0xcb, 0xa2, 0x68, 0x95, 0x6e, 0x0e, 0x4c, 0xcb, 0x66, 0x49, 0xbd, 0xa0, 0xf1, 0x06, 0xfd, + 0xf8, 0xd8, 0x83, 0x4e, 0xec, 0x0e, 0xae, 0x96, 0xd9, 0xab, 0x22, 0xa3, 0xec, 0xd9, 0x1d, 0x56, + 0x6e, 0xfa, 0xfe, 0x49, 0x75, 0x89, 0xd1, 0xe9, 0x23, 0xdd, 0xf7, 0x71, 0x88, 0x62, 0x39, 0x6b, + 0xdf, 0x97, 0x96, 0xb6, 0x25, 0x42, 0xf1, 0x00, 0x16, 0x5e, 0xf0, 0x44, 0x50, 0xad, 0x30, 0xf9, + 0x2b, 0xe3, 0xd3, 0x8b, 0xd0, 0x20, 0x05, 0xbf, 0xcd, 0xd2, 0xff, 0x97, 0x0a, 0x9c, 0xd9, 0x66, + 0xdb, 0xa2, 0x50, 0x1e, 0x9b, 0x06, 0xc9, 0xbb, 0x15, 0x80, 0xac, 0x99, 0xb0, 0x5b, 0x7c, 0xdc, + 0x12, 0x63, 0x6d, 0xc0, 0x92, 0x54, 0x2e, 0x54, 0xe4, 0x27, 0xc6, 0x69, 0xcb, 0x5e, 0xb8, 0xa9, + 0x7e, 0x04, 0x6b, 0x89, 0x51, 0x88, 0x2d, 0xcc, 0x06, 0x2c, 0x0e, 0xf3, 0x55, 0x30, 0x88, 0x52, + 0x40, 0x6b, 0x98, 0xea, 0x6d, 0x38, 0xdd, 0xf6, 0x0d, 0xd7, 0x4f, 0xb8, 0x60, 0x02, 0x59, 0x86, + 0xc0, 0x46, 0x65, 0x05, 0x48, 0xda, 0x86, 0xd5, 0xb6, 0x4f, 0x9c, 0x57, 0x50, 0x4a, 0xb3, 0x0e, + 0x1d, 0x3f, 0x19, 0xc8, 0xf5, 0x41, 0x36, 0xd5, 0x35, 0x8e, 0x17, 0x27, 0x7b, 0xbb, 0x03, 0x67, + 0x38, 0x5c, 0xfb, 0x2a, 0x83, 0x38, 0x2b, 0xc1, 0xe2, 0xa4, 0xde, 0xa7, 0x70, 0x6a, 0xb8, 0x2c, + 0x0e, 0xa1, 0x98, 0x9b, 0x51, 0x28, 0xe6, 0xc2, 0x88, 0x59, 0x8f, 0x20, 0x31, 0x7f, 0x91, 0x0b, + 0xe5, 0xf5, 0x0c, 0x20, 0xe6, 0x4e, 0x14, 0x88, 0xb9, 0x38, 0x4e, 0x77, 0x04, 0x87, 0x49, 0x46, + 0x6d, 0x3e, 0x25, 0x6a, 0x3f, 0x4f, 0xa0, 0x35, 0xb3, 0x59, 0x70, 0x57, 0xcc, 0xda, 0xdf, 0x0a, + 0x58, 0xa3, 0x71, 0xb0, 0x26, 0xe8, 0x3a, 0x40, 0xd7, 0x6f, 0xc5, 0xc0, 0x9a, 0x8d, 0xb1, 0xf6, + 0x06, 0x58, 0xcd, 0xdf, 0xcc, 0x42, 0x31, 0x78, 0x97, 0xf0, 0x79, 0xd2, 0x6d, 0xb9, 0x14, 0xb7, + 0x85, 0x57, 0xe0, 0xfc, 0x37, 0x5a, 0x81, 0x67, 0x27, 0x5e, 0x81, 0xcf, 0x41, 0x91, 0x3d, 0xe8, + 0x2e, 0x3e, 0x12, 0x2b, 0x6a, 0x81, 0x11, 0x34, 0x7c, 0x34, 0x0c, 0xc3, 0xf9, 0xa9, 0xc2, 0x30, + 0x06, 0x0f, 0x2d, 0xc4, 0xe1, 0xa1, 0x7b, 0xc1, 0x8a, 0xc8, 0x17, 0xd1, 0xcb, 0x23, 0xf4, 0xa6, + 0xae, 0x85, 0xcd, 0xe8, 0x5a, 0xc8, 0xd7, 0xd5, 0x77, 0x47, 0x69, 0xf9, 0xce, 0x82, 0x43, 0x07, + 0x1c, 0x1c, 0x0a, 0xc7, 0xa2, 0xc8, 0xac, 0x77, 0x00, 0x82, 0x24, 0x22, 0x11, 0xa2, 0x73, 0x23, + 0xc6, 0xa8, 0x85, 0xd8, 0xa9, 0xda, 0xc8, 0xd4, 0x0c, 0x4f, 0x90, 0x26, 0xcb, 0x8f, 0x19, 0xc7, + 0x47, 0xff, 0x3b, 0x17, 0xca, 0x2f, 0x19, 0x47, 0x2e, 0xf7, 0x12, 0xb0, 0xe4, 0x94, 0x51, 0x7c, + 0x33, 0x8a, 0x4a, 0xbe, 0x62, 0xd4, 0x25, 0x40, 0x49, 0x56, 0xb9, 0x18, 0xae, 0x78, 0xcd, 0x41, + 0xa3, 0xa2, 0xa0, 0xd4, 0xd9, 0xce, 0xe0, 0xc8, 0xb2, 0x2d, 0xef, 0x98, 0xbf, 0x9f, 0xe7, 0x3b, + 0x03, 0x49, 0xaa, 0xb3, 0xdb, 0x4d, 0xf8, 0xa5, 0xe5, 0xeb, 0x1d, 0x62, 0x62, 0x16, 0xd3, 0x73, + 0x5a, 0x81, 0x12, 0xb6, 0x89, 0x89, 0x87, 0x5f, 0x5e, 0xe1, 0xd5, 0xbe, 0xbc, 0x62, 0xec, 0xcb, + 0x3b, 0x03, 0xf3, 0x2e, 0x36, 0x3c, 0x62, 0x8b, 0xed, 0xb9, 0x68, 0xd1, 0xa9, 0xe9, 0x63, 0xcf, + 0xa3, 0x3d, 0x89, 0x72, 0x4d, 0x34, 0x43, 0x65, 0xe6, 0xe2, 0xd8, 0x32, 0x73, 0xc4, 0x51, 0x4e, + 0xac, 0xcc, 0x2c, 0x8f, 0x2d, 0x33, 0x27, 0x39, 0xc9, 0x09, 0x15, 0xda, 0x4b, 0x93, 0x15, 0xda, + 0xe1, 0xba, 0x74, 0x39, 0x52, 0x97, 0x7e, 0x9b, 0x1f, 0xeb, 0xaf, 0x15, 0x58, 0x4b, 0x7c, 0x56, + 0xe2, 0x73, 0xbd, 0x15, 0x3b, 0x14, 0xda, 0x18, 0xeb, 0xb3, 0xe0, 0x4c, 0xe8, 0x51, 0xe4, 0x4c, + 0xe8, 0x83, 0xf1, 0x82, 0xaf, 0xfd, 0x48, 0xe8, 0x8f, 0x15, 0x78, 0xf3, 0xc0, 0x31, 0x63, 0x15, + 0x9e, 0xd8, 0xf6, 0x4f, 0x9e, 0x38, 0xee, 0xc9, 0x5a, 0x3f, 0x37, 0x2d, 0xce, 0xc2, 0xe5, 0x54, + 0x15, 0x2e, 0x64, 0x9b, 0x21, 0x4a, 0xa6, 0x1f, 0xc3, 0xf2, 0xee, 0x4b, 0xdc, 0x69, 0x9f, 0xd8, + 0x9d, 0x29, 0x4c, 0xab, 0x40, 0xbe, 0xd3, 0x37, 0x05, 0x4a, 0x4a, 0x1f, 0xc3, 0x55, 0x60, 0x3e, + 0x5a, 0x05, 0xea, 0x50, 0x19, 0xf6, 0x20, 0xa6, 0xf7, 0x0c, 0x9d, 0x5e, 0x93, 0x32, 0x53, 0xe5, + 0x8b, 0x9a, 0x68, 0x09, 0x3a, 0x76, 0xf9, 0x05, 0x06, 0x4e, 0xc7, 0xae, 0x1b, 0xcd, 0x16, 0xf9, + 0x68, 0xb6, 0x50, 0xff, 0x5c, 0x81, 0x12, 0xed, 0xe1, 0x1b, 0xd9, 0x2f, 0xb6, 0x5a, 0xf9, 0xe1, + 0x56, 0x2b, 0xd8, 0xb1, 0xcd, 0x86, 0x77, 0x6c, 0x43, 0xcb, 0xe7, 0x18, 0x39, 0x69, 0xf9, 0x7c, + 0x40, 0xc7, 0xae, 0xab, 0x5e, 0x80, 0x45, 0x6e, 0x9b, 0x18, 0x79, 0x05, 0xf2, 0x03, 0xb7, 0x27, + 0xe3, 0x68, 0xe0, 0xf6, 0xd4, 0x3f, 0x51, 0xa0, 0x5c, 0xf7, 0x7d, 0xa3, 0x73, 0x3c, 0xc5, 0x00, + 0x02, 0xe3, 0x72, 0x61, 0xe3, 0x92, 0x83, 0x18, 0x9a, 0x3b, 0x9b, 0x61, 0xee, 0x5c, 0xc4, 0x5c, + 0x15, 0x96, 0xa4, 0x2d, 0x99, 0x06, 0x37, 0x01, 0xb5, 0x88, 0xeb, 0x3f, 0x24, 0xee, 0x0b, 0xc3, + 0x35, 0xa7, 0xdb, 0x81, 0x21, 0x98, 0x15, 0x37, 0x5e, 0xf3, 0x57, 0xe6, 0x34, 0xf6, 0xac, 0x5e, + 0x86, 0x53, 0x11, 0x7d, 0x99, 0x1d, 0xdf, 0x87, 0x12, 0xcb, 0xfb, 0xa2, 0x14, 0xbf, 0x11, 0x3e, + 0xae, 0x99, 0x68, 0x95, 0x50, 0x7f, 0x17, 0x56, 0x68, 0x7d, 0xc0, 0xe8, 0xc1, 0xa7, 0xf8, 0xfd, + 0x58, 0x9d, 0x7a, 0x3e, 0x43, 0x51, 0xac, 0x46, 0xfd, 0x5b, 0x05, 0xe6, 0x18, 0x3d, 0xb1, 0x66, + 0x9f, 0x83, 0xa2, 0x8b, 0x1d, 0xa2, 0xfb, 0x46, 0x37, 0xb8, 0x5f, 0x4c, 0x09, 0xfb, 0x46, 0xd7, + 0x63, 0xd7, 0xa3, 0xe9, 0x4b, 0xd3, 0xea, 0x62, 0xcf, 0x97, 0x97, 0x8c, 0x4b, 0x94, 0xb6, 0xc3, + 0x49, 0xd4, 0x49, 0x9e, 0xf5, 0xfb, 0xbc, 0xee, 0x9c, 0xd5, 0xd8, 0x33, 0xda, 0xe4, 0x57, 0xde, + 0x26, 0x81, 0xd4, 0xd9, 0x85, 0xb8, 0x1a, 0x14, 0x62, 0x28, 0x7a, 0xd0, 0x56, 0x77, 0x01, 0x85, + 0xbd, 0x20, 0xfc, 0x7d, 0x1d, 0xe6, 0x99, 0x93, 0x64, 0x75, 0xb4, 0x96, 0xe1, 0x06, 0x4d, 0xb0, + 0xa9, 0x06, 0x20, 0xee, 0xe0, 0x48, 0x45, 0x34, 0xfd, 0xac, 0x8c, 0xa8, 0x90, 0xfe, 0x5e, 0x81, + 0x53, 0x91, 0x3e, 0x84, 0xad, 0xef, 0x45, 0x3b, 0xc9, 0x34, 0x55, 0x74, 0xb0, 0x1d, 0x59, 0x12, + 0xae, 0x67, 0x99, 0xf4, 0x1b, 0x5a, 0x0e, 0xfe, 0x41, 0x01, 0xa8, 0x0f, 0xfc, 0x63, 0x81, 0x0c, + 0x86, 0x67, 0x46, 0x89, 0xce, 0x0c, 0x7d, 0xe7, 0x18, 0x9e, 0xf7, 0x82, 0xb8, 0x72, 0x4f, 0x13, + 0xb4, 0x19, 0x86, 0x37, 0xf0, 0x8f, 0xe5, 0x51, 0x18, 0x7d, 0x46, 0x17, 0x61, 0x89, 0xdf, 0x69, + 0xd7, 0x0d, 0xd3, 0x74, 0xb1, 0xe7, 0x89, 0x33, 0xb1, 0x32, 0xa7, 0xd6, 0x39, 0x91, 0xb2, 0x59, + 0x26, 0xb6, 0x7d, 0xcb, 0x3f, 0xd1, 0x7d, 0xf2, 0x0c, 0xdb, 0x62, 0x6f, 0x52, 0x96, 0xd4, 0x7d, + 0x4a, 0xe4, 0x87, 0x03, 0x5d, 0xcb, 0xf3, 0x5d, 0xc9, 0x26, 0xcf, 0x5f, 0x04, 0x95, 0xb1, 0xd1, + 0x49, 0xa9, 0xb4, 0x06, 0xbd, 0x1e, 0x77, 0xf1, 0xab, 0x4f, 0xfb, 0xfb, 0x62, 0x40, 0xb9, 0xac, + 0x98, 0x1e, 0x3a, 0x4d, 0x0c, 0xf7, 0x35, 0x82, 0x30, 0xef, 0xc3, 0x4a, 0x68, 0x0c, 0x22, 0xac, + 0x22, 0x45, 0xa4, 0x12, 0x2d, 0x22, 0xd5, 0x47, 0x80, 0x38, 0xee, 0xf0, 0x0d, 0xc7, 0xad, 0x9e, + 0x86, 0x53, 0x11, 0x45, 0x62, 0x25, 0xbe, 0x06, 0x65, 0x71, 0x2f, 0x49, 0x04, 0xca, 0x59, 0x28, + 0xd0, 0x8c, 0xda, 0xb1, 0x4c, 0x79, 0x4e, 0xba, 0xe0, 0x10, 0x73, 0xdb, 0x32, 0x5d, 0xf5, 0x13, + 0x28, 0x6b, 0xbc, 0x1f, 0xc1, 0xfb, 0x10, 0x96, 0xc4, 0x2d, 0x26, 0x3d, 0x72, 0x8d, 0x30, 0xed, + 0x9a, 0x7a, 0xb8, 0x13, 0xad, 0x6c, 0x87, 0x9b, 0xaa, 0x09, 0x35, 0x5e, 0x32, 0x44, 0xd4, 0xcb, + 0xc1, 0x3e, 0x04, 0x79, 0xa3, 0x70, 0x6c, 0x2f, 0x51, 0xf9, 0xb2, 0x1b, 0x6e, 0xaa, 0xe7, 0xe1, + 0x5c, 0x6a, 0x2f, 0xc2, 0x13, 0x0e, 0x54, 0x86, 0x2f, 0x4c, 0x4b, 0x1e, 0x18, 0xb3, 0x83, 0x60, + 0x25, 0x74, 0x10, 0x7c, 0x26, 0x28, 0x12, 0x73, 0x72, 0x11, 0x63, 0x15, 0xe0, 0xb0, 0xdc, 0xcf, + 0x67, 0x95, 0xfb, 0xb3, 0x91, 0x72, 0x5f, 0x6d, 0x07, 0xfe, 0x14, 0xdb, 0xb0, 0x07, 0x6c, 0xbb, + 0xc8, 0xfb, 0x96, 0x09, 0x51, 0x1d, 0x35, 0x4a, 0xce, 0xaa, 0x85, 0xa4, 0xd4, 0xab, 0x50, 0x8e, + 0xa6, 0xc6, 0x50, 0x9e, 0x53, 0x12, 0x79, 0x6e, 0x29, 0x96, 0xe2, 0x3e, 0x8c, 0x55, 0xc0, 0xd9, + 0x3e, 0x8e, 0xd5, 0xbf, 0x77, 0x23, 0xc9, 0xee, 0x5a, 0xca, 0x19, 0xee, 0x6f, 0x28, 0xcf, 0xad, + 0x8a, 0xf5, 0xe0, 0xa1, 0x47, 0xe5, 0xc5, 0xa0, 0xd5, 0xb7, 0xa0, 0x74, 0x90, 0xf5, 0x1b, 0x88, + 0x59, 0x79, 0x5f, 0xe2, 0x26, 0xac, 0x3e, 0xb4, 0x7a, 0xd8, 0x3b, 0xf1, 0x7c, 0xdc, 0x6f, 0xb0, + 0xa4, 0x74, 0x64, 0x61, 0x17, 0xad, 0x03, 0xb0, 0x2d, 0x8c, 0x43, 0xac, 0xe0, 0x6a, 0x7c, 0x88, + 0xa2, 0xfe, 0x97, 0x02, 0xcb, 0x43, 0xc1, 0x03, 0xb6, 0x75, 0x7b, 0x03, 0x8a, 0x74, 0xbc, 0x9e, + 0x6f, 0xf4, 0x1d, 0x79, 0x9e, 0x15, 0x10, 0xd0, 0x1d, 0x98, 0x3b, 0xf2, 0x24, 0x64, 0x94, 0x0a, + 0xa0, 0xa7, 0x19, 0xa2, 0xcd, 0x1e, 0x79, 0x0d, 0x13, 0x7d, 0x04, 0x30, 0xf0, 0xb0, 0x29, 0xce, + 0xb0, 0xf2, 0x59, 0xd5, 0xc2, 0x41, 0xf8, 0x7c, 0x9b, 0x0a, 0xf0, 0xab, 0x16, 0x77, 0xa1, 0x64, + 0xd9, 0xc4, 0xc4, 0xec, 0xcc, 0xd1, 0x14, 0xa8, 0xd2, 0x18, 0x71, 0xe0, 0x12, 0x07, 0x1e, 0x36, + 0x55, 0x2c, 0xd6, 0x42, 0xe9, 0x5f, 0x11, 0x28, 0x4d, 0x58, 0xe1, 0x49, 0xeb, 0x28, 0x30, 0x5c, + 0x46, 0xec, 0xc6, 0xa8, 0xd1, 0x31, 0x6f, 0x69, 0x15, 0x4b, 0x94, 0x36, 0x52, 0x54, 0xbd, 0x0d, + 0xa7, 0x23, 0x3b, 0xa4, 0x29, 0xb6, 0x2c, 0x6a, 0x2b, 0x06, 0x94, 0x0c, 0xc3, 0x59, 0xc0, 0x10, + 0x32, 0x9a, 0xc7, 0xc1, 0x10, 0x1e, 0x87, 0x21, 0x3c, 0xf5, 0x73, 0x38, 0x1b, 0x41, 0x74, 0x22, + 0x16, 0xdd, 0x8d, 0x55, 0x6e, 0x97, 0xc6, 0x69, 0x8d, 0x95, 0x70, 0xff, 0xa3, 0xc0, 0x6a, 0x1a, + 0xc3, 0x2b, 0x22, 0x8e, 0x3f, 0xce, 0xb8, 0x56, 0x77, 0x6b, 0x32, 0xb3, 0x7e, 0x2b, 0x68, 0xed, + 0x3e, 0xd4, 0xd2, 0xfc, 0x99, 0x9c, 0xa5, 0xfc, 0x34, 0xb3, 0xf4, 0xb3, 0x7c, 0x08, 0x79, 0xaf, + 0xfb, 0xbe, 0x6b, 0x1d, 0x0e, 0x68, 0xc8, 0xbf, 0x76, 0x34, 0xab, 0x11, 0xe0, 0x32, 0xdc, 0xb5, + 0x37, 0x46, 0x88, 0x0f, 0xed, 0x48, 0xc5, 0x66, 0x3e, 0x8d, 0x62, 0x33, 0x1c, 0x53, 0xbf, 0x39, + 0x99, 0xbe, 0xef, 0x2c, 0x00, 0xfa, 0xb3, 0x1c, 0x2c, 0x45, 0xa7, 0x08, 0xed, 0x02, 0x18, 0x81, + 0xe5, 0xe2, 0x43, 0xb9, 0x38, 0xd1, 0x30, 0xb5, 0x90, 0x20, 0x7a, 0x17, 0xf2, 0x1d, 0x67, 0x20, + 0x66, 0x2d, 0xe5, 0x30, 0x78, 0xdb, 0x19, 0xf0, 0x8c, 0x42, 0xd9, 0xe8, 0x9e, 0x8a, 0x9f, 0xed, + 0x67, 0x67, 0xc9, 0xa7, 0xec, 0x3d, 0x97, 0x11, 0xcc, 0xe8, 0x31, 0x2c, 0xbd, 0x70, 0x2d, 0xdf, + 0x38, 0xec, 0x61, 0xbd, 0x67, 0x9c, 0x60, 0x57, 0x64, 0xc9, 0x09, 0x12, 0x59, 0x59, 0x0a, 0x3e, + 0xa1, 0x72, 0xea, 0x1f, 0x42, 0x41, 0x5a, 0x34, 0x66, 0x45, 0xd8, 0x87, 0xb5, 0x01, 0x65, 0xd3, + 0xd9, 0x15, 0x38, 0xdb, 0xb0, 0x89, 0xee, 0x61, 0xba, 0x8c, 0xcb, 0xcb, 0xf9, 0x63, 0x52, 0xf4, + 0x2a, 0x93, 0xde, 0x26, 0x2e, 0x6e, 0x1a, 0x36, 0x69, 0x73, 0x51, 0xf5, 0x39, 0x94, 0x42, 0x03, + 0x1c, 0x63, 0x42, 0x03, 0x56, 0xe4, 0x51, 0xbc, 0x87, 0x7d, 0xb1, 0xbc, 0x4c, 0xd4, 0xf9, 0xb2, + 0x90, 0x6b, 0x63, 0x9f, 0x5f, 0x9f, 0xb8, 0x0b, 0x67, 0x35, 0x4c, 0x1c, 0x6c, 0x07, 0xf3, 0xf9, + 0x84, 0x74, 0xa7, 0xc8, 0xe0, 0x6f, 0x40, 0x2d, 0x4d, 0x9e, 0xe7, 0x87, 0x6b, 0x97, 0xa0, 0x20, + 0x7f, 0xd0, 0x8a, 0x16, 0x20, 0xbf, 0xbf, 0xdd, 0xaa, 0xcc, 0xd0, 0x87, 0x83, 0x9d, 0x56, 0x45, + 0x41, 0x05, 0x98, 0x6d, 0x6f, 0xef, 0xb7, 0x2a, 0xb9, 0x6b, 0x7d, 0xa8, 0xc4, 0x7f, 0xcd, 0x89, + 0xd6, 0xe0, 0x54, 0x4b, 0xdb, 0x6b, 0xd5, 0x1f, 0xd5, 0xf7, 0x1b, 0x7b, 0x4d, 0xbd, 0xa5, 0x35, + 0x3e, 0xae, 0xef, 0xef, 0x56, 0x66, 0xd0, 0x06, 0x9c, 0x0f, 0xbf, 0x78, 0xbc, 0xd7, 0xde, 0xd7, + 0xf7, 0xf7, 0xf4, 0xed, 0xbd, 0xe6, 0x7e, 0xbd, 0xd1, 0xdc, 0xd5, 0x2a, 0x0a, 0x3a, 0x0f, 0x67, + 0xc3, 0x2c, 0x0f, 0x1a, 0x3b, 0x0d, 0x6d, 0x77, 0x9b, 0x3e, 0xd7, 0x9f, 0x54, 0x72, 0xd7, 0x6e, + 0x40, 0x39, 0xf2, 0xe3, 0x4b, 0x6a, 0x52, 0x6b, 0x6f, 0xa7, 0x32, 0x83, 0xca, 0x50, 0x0c, 0xeb, + 0x29, 0xc0, 0x6c, 0x73, 0x6f, 0x67, 0xb7, 0x92, 0xbb, 0x76, 0x1b, 0x96, 0x63, 0xb7, 0x71, 0xd1, + 0x0a, 0x94, 0xdb, 0xf5, 0xe6, 0xce, 0x83, 0xbd, 0x4f, 0x75, 0x6d, 0xb7, 0xbe, 0xf3, 0x59, 0x65, + 0x06, 0xad, 0x42, 0x45, 0x92, 0x9a, 0x7b, 0xfb, 0x9c, 0xaa, 0x5c, 0x7b, 0x16, 0xfb, 0xc6, 0x30, + 0x3a, 0x0d, 0x2b, 0x41, 0x37, 0xfa, 0xb6, 0xb6, 0x5b, 0xdf, 0xdf, 0xa5, 0xbd, 0x47, 0xc8, 0xda, + 0x41, 0xb3, 0xd9, 0x68, 0x3e, 0xaa, 0x28, 0x54, 0xeb, 0x90, 0xbc, 0xfb, 0x69, 0x83, 0x32, 0xe7, + 0xa2, 0xcc, 0x07, 0xcd, 0x1f, 0x36, 0xf7, 0x3e, 0x69, 0x56, 0xf2, 0x5b, 0xbf, 0x58, 0x81, 0x25, + 0x59, 0xe8, 0x61, 0x97, 0xdd, 0x6a, 0x69, 0xc1, 0x82, 0xfc, 0x81, 0x74, 0x4a, 0x86, 0x8e, 0xfe, + 0xac, 0xbb, 0xb6, 0x31, 0x82, 0x43, 0xd4, 0xdb, 0x33, 0xe8, 0x90, 0xd5, 0xbf, 0xa1, 0xdb, 0xd1, + 0x97, 0x52, 0xab, 0xcd, 0xc4, 0x85, 0xec, 0xda, 0xe5, 0xb1, 0x7c, 0x41, 0x1f, 0x98, 0x96, 0xb8, + 0xe1, 0x9f, 0xff, 0xa0, 0xcb, 0x69, 0xb5, 0x69, 0xca, 0xef, 0x8b, 0x6a, 0x57, 0xc6, 0x33, 0x06, + 0xdd, 0x3c, 0x83, 0x4a, 0xfc, 0xa7, 0x40, 0x28, 0x05, 0x3a, 0xcd, 0xf8, 0xbd, 0x51, 0xed, 0xda, + 0x24, 0xac, 0xe1, 0xce, 0x12, 0x3f, 0x9a, 0xb9, 0x3a, 0xc9, 0xaf, 0x10, 0x32, 0x3b, 0xcb, 0xfa, + 0xc1, 0x02, 0x77, 0x60, 0xf4, 0xe6, 0x33, 0x4a, 0xfd, 0x85, 0x4a, 0xca, 0xbd, 0xf9, 0x34, 0x07, + 0xa6, 0x5f, 0xa2, 0x56, 0x67, 0xd0, 0x31, 0x2c, 0xc7, 0xae, 0x27, 0xa0, 0x14, 0xf1, 0xf4, 0x7b, + 0x18, 0xb5, 0xab, 0x13, 0x70, 0x46, 0x23, 0x22, 0x7c, 0x1d, 0x21, 0x3d, 0x22, 0x52, 0x2e, 0x3b, + 0xa4, 0x47, 0x44, 0xea, 0xcd, 0x06, 0x16, 0xdc, 0x91, 0x6b, 0x08, 0x69, 0xc1, 0x9d, 0x76, 0xf9, + 0xa1, 0x76, 0x79, 0x2c, 0x5f, 0xd8, 0x69, 0xb1, 0x4b, 0x09, 0x69, 0x4e, 0x4b, 0xbf, 0xf4, 0x50, + 0xbb, 0x3a, 0x01, 0x67, 0x3c, 0x0a, 0x86, 0x47, 0x9c, 0x59, 0x51, 0x90, 0x38, 0x90, 0xcf, 0x8a, + 0x82, 0xe4, 0x69, 0xa9, 0x88, 0x82, 0xd8, 0xd1, 0xe4, 0x95, 0x09, 0x8e, 0x52, 0xb2, 0xa3, 0x20, + 0xfd, 0xd0, 0x45, 0x9d, 0x41, 0x7f, 0xa4, 0x40, 0x35, 0xeb, 0x98, 0x02, 0xa5, 0xd4, 0x77, 0x63, + 0x4e, 0x56, 0x6a, 0x5b, 0xd3, 0x88, 0x04, 0x56, 0x7c, 0x09, 0x28, 0xb9, 0xee, 0xa1, 0x77, 0xd2, + 0x66, 0x26, 0x63, 0x75, 0xad, 0xbd, 0x3b, 0x19, 0x73, 0xd0, 0x65, 0x1b, 0x0a, 0xf2, 0x60, 0x04, + 0xa5, 0x64, 0xe9, 0xd8, 0xb1, 0x4c, 0x4d, 0x1d, 0xc5, 0x12, 0x28, 0x7d, 0x04, 0xb3, 0x94, 0x8a, + 0xce, 0xa7, 0x73, 0x4b, 0x65, 0xeb, 0x59, 0xaf, 0x03, 0x45, 0x4f, 0x61, 0x9e, 0x9f, 0x04, 0xa0, + 0x14, 0xe4, 0x21, 0x72, 0x5e, 0x51, 0xbb, 0x90, 0xcd, 0x10, 0xa8, 0xfb, 0x82, 0xff, 0xef, 0x0c, + 0x01, 0xf2, 0xa3, 0xb7, 0xd3, 0x7f, 0x8c, 0x1c, 0x3d, 0x53, 0xa8, 0x5d, 0x1c, 0xc3, 0x15, 0xfe, + 0x28, 0x62, 0x55, 0xef, 0xe5, 0xb1, 0x5b, 0x97, 0xec, 0x8f, 0x22, 0x7d, 0x73, 0xc4, 0x83, 0x24, + 0xb9, 0x79, 0x4a, 0x0b, 0x92, 0xcc, 0x2d, 0x6b, 0x5a, 0x90, 0x64, 0xef, 0xc7, 0xd4, 0x19, 0xe4, + 0xc3, 0xa9, 0x14, 0xa8, 0x0c, 0xbd, 0x9b, 0x15, 0xe4, 0x69, 0xb8, 0x5d, 0xed, 0xbd, 0x09, 0xb9, + 0xc3, 0x93, 0x2f, 0x3e, 0xfa, 0x37, 0xb3, 0xf1, 0xa3, 0xcc, 0xc9, 0x8f, 0x7f, 0xe2, 0x5b, 0xff, + 0x9a, 0x87, 0x45, 0x0e, 0x83, 0x8a, 0x0a, 0xe6, 0x33, 0x80, 0xe1, 0x09, 0x04, 0x7a, 0x2b, 0xdd, + 0x27, 0x91, 0x53, 0x9a, 0xda, 0xdb, 0xa3, 0x99, 0xc2, 0x81, 0x16, 0x42, 0xf3, 0xd3, 0x02, 0x2d, + 0x79, 0x68, 0x91, 0x16, 0x68, 0x29, 0x47, 0x02, 0xea, 0x0c, 0xfa, 0x18, 0x8a, 0x01, 0x6c, 0x8c, + 0xd2, 0x60, 0xe7, 0x18, 0x2e, 0x5e, 0x7b, 0x6b, 0x24, 0x4f, 0xd8, 0xea, 0x10, 0x26, 0x9c, 0x66, + 0x75, 0x12, 0x7b, 0x4e, 0xb3, 0x3a, 0x0d, 0x58, 0x1e, 0xfa, 0x84, 0x23, 0x47, 0x99, 0x3e, 0x89, + 0x00, 0x77, 0x99, 0x3e, 0x89, 0xc2, 0x4f, 0xea, 0xcc, 0x83, 0x4b, 0xbf, 0xfa, 0x6a, 0x5d, 0xf9, + 0xa7, 0xaf, 0xd6, 0x67, 0x7e, 0xfa, 0xf5, 0xba, 0xf2, 0xab, 0xaf, 0xd7, 0x95, 0x7f, 0xfc, 0x7a, + 0x5d, 0xf9, 0xb7, 0xaf, 0xd7, 0x95, 0x3f, 0xfb, 0xf7, 0xf5, 0x99, 0x1f, 0x15, 0xa4, 0xf4, 0xe1, + 0x3c, 0xfb, 0x0f, 0x38, 0x1f, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x15, 0x30, 0x49, 0xcc, + 0xc7, 0x48, 0x00, 0x00, } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto index ab435137..88196076 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto @@ -143,6 +143,7 @@ message DNSConfig { enum Protocol { TCP = 0; UDP = 1; + SCTP = 2; } // PortMapping specifies the port mapping configurations of a sandbox. @@ -344,6 +345,12 @@ message PodSandboxConfig { message RunPodSandboxRequest { // Configuration for creating a PodSandbox. PodSandboxConfig config = 1; + // Named runtime configuration to use for this PodSandbox. + // If the runtime handler is unknown, this request should be rejected. An + // empty string should select the default handler, equivalent to the + // behavior before this feature was added. + // See https://git.k8s.io/community/keps/sig-node/0014-runtime-class.md + string runtime_handler = 2; } message RunPodSandboxResponse { @@ -586,6 +593,12 @@ message LinuxContainerSecurityContext { // no_new_privs defines if the flag for no_new_privs should be set on the // container. bool no_new_privs = 11; + // masked_paths is a slice of paths that should be masked by the container + // runtime, this can be passed directly to the OCI spec. + repeated string masked_paths = 13; + // readonly_paths is a slice of paths that should be set as readonly by the + // container runtime, this can be passed directly to the OCI spec. + repeated string readonly_paths = 14; } // LinuxContainerConfig contains platform-specific configuration for diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/services.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/services.go index d8387dc2..ae245df0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/services.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/services.go @@ -63,7 +63,7 @@ type ContainerManager interface { type PodSandboxManager interface { // RunPodSandbox creates and starts a pod-level sandbox. Runtimes should ensure // the sandbox is in ready state. - RunPodSandbox(config *runtimeapi.PodSandboxConfig) (string, error) + RunPodSandbox(config *runtimeapi.PodSandboxConfig, runtimeHandler string) (string, error) // StopPodSandbox stops the sandbox. If there are any running containers in the // sandbox, they should be force terminated. StopPodSandbox(podSandboxID string) error diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1/BUILD index 82a6bdd9..6a314cd1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1/BUILD @@ -33,8 +33,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["api.proto"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.conversion.go deleted file mode 100644 index 5765982b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1/zz_generated.conversion.go +++ /dev/null @@ -1,479 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by conversion-gen. DO NOT EDIT. - -package v1beta1 - -import ( - unsafe "unsafe" - - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - conversion "k8s.io/apimachinery/pkg/conversion" - runtime "k8s.io/apimachinery/pkg/runtime" - kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" -) - -func init() { - localSchemeBuilder.Register(RegisterConversions) -} - -// RegisterConversions adds conversion functions to the given scheme. -// Public to allow building arbitrary schemes. -func RegisterConversions(scheme *runtime.Scheme) error { - return scheme.AddGeneratedConversionFuncs( - Convert_v1beta1_KubeletAnonymousAuthentication_To_kubeletconfig_KubeletAnonymousAuthentication, - Convert_kubeletconfig_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication, - Convert_v1beta1_KubeletAuthentication_To_kubeletconfig_KubeletAuthentication, - Convert_kubeletconfig_KubeletAuthentication_To_v1beta1_KubeletAuthentication, - Convert_v1beta1_KubeletAuthorization_To_kubeletconfig_KubeletAuthorization, - Convert_kubeletconfig_KubeletAuthorization_To_v1beta1_KubeletAuthorization, - Convert_v1beta1_KubeletConfiguration_To_kubeletconfig_KubeletConfiguration, - Convert_kubeletconfig_KubeletConfiguration_To_v1beta1_KubeletConfiguration, - Convert_v1beta1_KubeletWebhookAuthentication_To_kubeletconfig_KubeletWebhookAuthentication, - Convert_kubeletconfig_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication, - Convert_v1beta1_KubeletWebhookAuthorization_To_kubeletconfig_KubeletWebhookAuthorization, - Convert_kubeletconfig_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization, - Convert_v1beta1_KubeletX509Authentication_To_kubeletconfig_KubeletX509Authentication, - Convert_kubeletconfig_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication, - Convert_v1beta1_SerializedNodeConfigSource_To_kubeletconfig_SerializedNodeConfigSource, - Convert_kubeletconfig_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource, - ) -} - -func autoConvert_v1beta1_KubeletAnonymousAuthentication_To_kubeletconfig_KubeletAnonymousAuthentication(in *KubeletAnonymousAuthentication, out *kubeletconfig.KubeletAnonymousAuthentication, s conversion.Scope) error { - if err := v1.Convert_Pointer_bool_To_bool(&in.Enabled, &out.Enabled, s); err != nil { - return err - } - return nil -} - -// Convert_v1beta1_KubeletAnonymousAuthentication_To_kubeletconfig_KubeletAnonymousAuthentication is an autogenerated conversion function. -func Convert_v1beta1_KubeletAnonymousAuthentication_To_kubeletconfig_KubeletAnonymousAuthentication(in *KubeletAnonymousAuthentication, out *kubeletconfig.KubeletAnonymousAuthentication, s conversion.Scope) error { - return autoConvert_v1beta1_KubeletAnonymousAuthentication_To_kubeletconfig_KubeletAnonymousAuthentication(in, out, s) -} - -func autoConvert_kubeletconfig_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(in *kubeletconfig.KubeletAnonymousAuthentication, out *KubeletAnonymousAuthentication, s conversion.Scope) error { - if err := v1.Convert_bool_To_Pointer_bool(&in.Enabled, &out.Enabled, s); err != nil { - return err - } - return nil -} - -// Convert_kubeletconfig_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication is an autogenerated conversion function. -func Convert_kubeletconfig_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(in *kubeletconfig.KubeletAnonymousAuthentication, out *KubeletAnonymousAuthentication, s conversion.Scope) error { - return autoConvert_kubeletconfig_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(in, out, s) -} - -func autoConvert_v1beta1_KubeletAuthentication_To_kubeletconfig_KubeletAuthentication(in *KubeletAuthentication, out *kubeletconfig.KubeletAuthentication, s conversion.Scope) error { - if err := Convert_v1beta1_KubeletX509Authentication_To_kubeletconfig_KubeletX509Authentication(&in.X509, &out.X509, s); err != nil { - return err - } - if err := Convert_v1beta1_KubeletWebhookAuthentication_To_kubeletconfig_KubeletWebhookAuthentication(&in.Webhook, &out.Webhook, s); err != nil { - return err - } - if err := Convert_v1beta1_KubeletAnonymousAuthentication_To_kubeletconfig_KubeletAnonymousAuthentication(&in.Anonymous, &out.Anonymous, s); err != nil { - return err - } - return nil -} - -// Convert_v1beta1_KubeletAuthentication_To_kubeletconfig_KubeletAuthentication is an autogenerated conversion function. -func Convert_v1beta1_KubeletAuthentication_To_kubeletconfig_KubeletAuthentication(in *KubeletAuthentication, out *kubeletconfig.KubeletAuthentication, s conversion.Scope) error { - return autoConvert_v1beta1_KubeletAuthentication_To_kubeletconfig_KubeletAuthentication(in, out, s) -} - -func autoConvert_kubeletconfig_KubeletAuthentication_To_v1beta1_KubeletAuthentication(in *kubeletconfig.KubeletAuthentication, out *KubeletAuthentication, s conversion.Scope) error { - if err := Convert_kubeletconfig_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(&in.X509, &out.X509, s); err != nil { - return err - } - if err := Convert_kubeletconfig_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(&in.Webhook, &out.Webhook, s); err != nil { - return err - } - if err := Convert_kubeletconfig_KubeletAnonymousAuthentication_To_v1beta1_KubeletAnonymousAuthentication(&in.Anonymous, &out.Anonymous, s); err != nil { - return err - } - return nil -} - -// Convert_kubeletconfig_KubeletAuthentication_To_v1beta1_KubeletAuthentication is an autogenerated conversion function. -func Convert_kubeletconfig_KubeletAuthentication_To_v1beta1_KubeletAuthentication(in *kubeletconfig.KubeletAuthentication, out *KubeletAuthentication, s conversion.Scope) error { - return autoConvert_kubeletconfig_KubeletAuthentication_To_v1beta1_KubeletAuthentication(in, out, s) -} - -func autoConvert_v1beta1_KubeletAuthorization_To_kubeletconfig_KubeletAuthorization(in *KubeletAuthorization, out *kubeletconfig.KubeletAuthorization, s conversion.Scope) error { - out.Mode = kubeletconfig.KubeletAuthorizationMode(in.Mode) - if err := Convert_v1beta1_KubeletWebhookAuthorization_To_kubeletconfig_KubeletWebhookAuthorization(&in.Webhook, &out.Webhook, s); err != nil { - return err - } - return nil -} - -// Convert_v1beta1_KubeletAuthorization_To_kubeletconfig_KubeletAuthorization is an autogenerated conversion function. -func Convert_v1beta1_KubeletAuthorization_To_kubeletconfig_KubeletAuthorization(in *KubeletAuthorization, out *kubeletconfig.KubeletAuthorization, s conversion.Scope) error { - return autoConvert_v1beta1_KubeletAuthorization_To_kubeletconfig_KubeletAuthorization(in, out, s) -} - -func autoConvert_kubeletconfig_KubeletAuthorization_To_v1beta1_KubeletAuthorization(in *kubeletconfig.KubeletAuthorization, out *KubeletAuthorization, s conversion.Scope) error { - out.Mode = KubeletAuthorizationMode(in.Mode) - if err := Convert_kubeletconfig_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(&in.Webhook, &out.Webhook, s); err != nil { - return err - } - return nil -} - -// Convert_kubeletconfig_KubeletAuthorization_To_v1beta1_KubeletAuthorization is an autogenerated conversion function. -func Convert_kubeletconfig_KubeletAuthorization_To_v1beta1_KubeletAuthorization(in *kubeletconfig.KubeletAuthorization, out *KubeletAuthorization, s conversion.Scope) error { - return autoConvert_kubeletconfig_KubeletAuthorization_To_v1beta1_KubeletAuthorization(in, out, s) -} - -func autoConvert_v1beta1_KubeletConfiguration_To_kubeletconfig_KubeletConfiguration(in *KubeletConfiguration, out *kubeletconfig.KubeletConfiguration, s conversion.Scope) error { - out.StaticPodPath = in.StaticPodPath - out.SyncFrequency = in.SyncFrequency - out.FileCheckFrequency = in.FileCheckFrequency - out.HTTPCheckFrequency = in.HTTPCheckFrequency - out.StaticPodURL = in.StaticPodURL - out.StaticPodURLHeader = *(*map[string][]string)(unsafe.Pointer(&in.StaticPodURLHeader)) - out.Address = in.Address - out.Port = in.Port - out.ReadOnlyPort = in.ReadOnlyPort - out.TLSCertFile = in.TLSCertFile - out.TLSPrivateKeyFile = in.TLSPrivateKeyFile - out.TLSCipherSuites = *(*[]string)(unsafe.Pointer(&in.TLSCipherSuites)) - out.TLSMinVersion = in.TLSMinVersion - out.RotateCertificates = in.RotateCertificates - out.ServerTLSBootstrap = in.ServerTLSBootstrap - if err := Convert_v1beta1_KubeletAuthentication_To_kubeletconfig_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { - return err - } - if err := Convert_v1beta1_KubeletAuthorization_To_kubeletconfig_KubeletAuthorization(&in.Authorization, &out.Authorization, s); err != nil { - return err - } - if err := v1.Convert_Pointer_int32_To_int32(&in.RegistryPullQPS, &out.RegistryPullQPS, s); err != nil { - return err - } - out.RegistryBurst = in.RegistryBurst - if err := v1.Convert_Pointer_int32_To_int32(&in.EventRecordQPS, &out.EventRecordQPS, s); err != nil { - return err - } - out.EventBurst = in.EventBurst - if err := v1.Convert_Pointer_bool_To_bool(&in.EnableDebuggingHandlers, &out.EnableDebuggingHandlers, s); err != nil { - return err - } - out.EnableContentionProfiling = in.EnableContentionProfiling - if err := v1.Convert_Pointer_int32_To_int32(&in.HealthzPort, &out.HealthzPort, s); err != nil { - return err - } - out.HealthzBindAddress = in.HealthzBindAddress - if err := v1.Convert_Pointer_int32_To_int32(&in.OOMScoreAdj, &out.OOMScoreAdj, s); err != nil { - return err - } - out.ClusterDomain = in.ClusterDomain - out.ClusterDNS = *(*[]string)(unsafe.Pointer(&in.ClusterDNS)) - out.StreamingConnectionIdleTimeout = in.StreamingConnectionIdleTimeout - out.NodeStatusUpdateFrequency = in.NodeStatusUpdateFrequency - out.ImageMinimumGCAge = in.ImageMinimumGCAge - if err := v1.Convert_Pointer_int32_To_int32(&in.ImageGCHighThresholdPercent, &out.ImageGCHighThresholdPercent, s); err != nil { - return err - } - if err := v1.Convert_Pointer_int32_To_int32(&in.ImageGCLowThresholdPercent, &out.ImageGCLowThresholdPercent, s); err != nil { - return err - } - out.VolumeStatsAggPeriod = in.VolumeStatsAggPeriod - out.KubeletCgroups = in.KubeletCgroups - out.SystemCgroups = in.SystemCgroups - out.CgroupRoot = in.CgroupRoot - if err := v1.Convert_Pointer_bool_To_bool(&in.CgroupsPerQOS, &out.CgroupsPerQOS, s); err != nil { - return err - } - out.CgroupDriver = in.CgroupDriver - out.CPUManagerPolicy = in.CPUManagerPolicy - out.CPUManagerReconcilePeriod = in.CPUManagerReconcilePeriod - out.QOSReserved = *(*map[string]string)(unsafe.Pointer(&in.QOSReserved)) - out.RuntimeRequestTimeout = in.RuntimeRequestTimeout - out.HairpinMode = in.HairpinMode - out.MaxPods = in.MaxPods - out.PodCIDR = in.PodCIDR - if err := v1.Convert_Pointer_int64_To_int64(&in.PodPidsLimit, &out.PodPidsLimit, s); err != nil { - return err - } - out.ResolverConfig = in.ResolverConfig - if err := v1.Convert_Pointer_bool_To_bool(&in.CPUCFSQuota, &out.CPUCFSQuota, s); err != nil { - return err - } - out.MaxOpenFiles = in.MaxOpenFiles - out.ContentType = in.ContentType - if err := v1.Convert_Pointer_int32_To_int32(&in.KubeAPIQPS, &out.KubeAPIQPS, s); err != nil { - return err - } - out.KubeAPIBurst = in.KubeAPIBurst - if err := v1.Convert_Pointer_bool_To_bool(&in.SerializeImagePulls, &out.SerializeImagePulls, s); err != nil { - return err - } - out.EvictionHard = *(*map[string]string)(unsafe.Pointer(&in.EvictionHard)) - out.EvictionSoft = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoft)) - out.EvictionSoftGracePeriod = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoftGracePeriod)) - out.EvictionPressureTransitionPeriod = in.EvictionPressureTransitionPeriod - out.EvictionMaxPodGracePeriod = in.EvictionMaxPodGracePeriod - out.EvictionMinimumReclaim = *(*map[string]string)(unsafe.Pointer(&in.EvictionMinimumReclaim)) - out.PodsPerCore = in.PodsPerCore - if err := v1.Convert_Pointer_bool_To_bool(&in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach, s); err != nil { - return err - } - out.ProtectKernelDefaults = in.ProtectKernelDefaults - if err := v1.Convert_Pointer_bool_To_bool(&in.MakeIPTablesUtilChains, &out.MakeIPTablesUtilChains, s); err != nil { - return err - } - if err := v1.Convert_Pointer_int32_To_int32(&in.IPTablesMasqueradeBit, &out.IPTablesMasqueradeBit, s); err != nil { - return err - } - if err := v1.Convert_Pointer_int32_To_int32(&in.IPTablesDropBit, &out.IPTablesDropBit, s); err != nil { - return err - } - out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) - if err := v1.Convert_Pointer_bool_To_bool(&in.FailSwapOn, &out.FailSwapOn, s); err != nil { - return err - } - out.ContainerLogMaxSize = in.ContainerLogMaxSize - if err := v1.Convert_Pointer_int32_To_int32(&in.ContainerLogMaxFiles, &out.ContainerLogMaxFiles, s); err != nil { - return err - } - out.SystemReserved = *(*map[string]string)(unsafe.Pointer(&in.SystemReserved)) - out.KubeReserved = *(*map[string]string)(unsafe.Pointer(&in.KubeReserved)) - out.SystemReservedCgroup = in.SystemReservedCgroup - out.KubeReservedCgroup = in.KubeReservedCgroup - out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) - return nil -} - -// Convert_v1beta1_KubeletConfiguration_To_kubeletconfig_KubeletConfiguration is an autogenerated conversion function. -func Convert_v1beta1_KubeletConfiguration_To_kubeletconfig_KubeletConfiguration(in *KubeletConfiguration, out *kubeletconfig.KubeletConfiguration, s conversion.Scope) error { - return autoConvert_v1beta1_KubeletConfiguration_To_kubeletconfig_KubeletConfiguration(in, out, s) -} - -func autoConvert_kubeletconfig_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in *kubeletconfig.KubeletConfiguration, out *KubeletConfiguration, s conversion.Scope) error { - out.StaticPodPath = in.StaticPodPath - out.SyncFrequency = in.SyncFrequency - out.FileCheckFrequency = in.FileCheckFrequency - out.HTTPCheckFrequency = in.HTTPCheckFrequency - out.StaticPodURL = in.StaticPodURL - out.StaticPodURLHeader = *(*map[string][]string)(unsafe.Pointer(&in.StaticPodURLHeader)) - out.Address = in.Address - out.Port = in.Port - out.ReadOnlyPort = in.ReadOnlyPort - out.TLSCertFile = in.TLSCertFile - out.TLSPrivateKeyFile = in.TLSPrivateKeyFile - out.TLSCipherSuites = *(*[]string)(unsafe.Pointer(&in.TLSCipherSuites)) - out.TLSMinVersion = in.TLSMinVersion - out.RotateCertificates = in.RotateCertificates - out.ServerTLSBootstrap = in.ServerTLSBootstrap - if err := Convert_kubeletconfig_KubeletAuthentication_To_v1beta1_KubeletAuthentication(&in.Authentication, &out.Authentication, s); err != nil { - return err - } - if err := Convert_kubeletconfig_KubeletAuthorization_To_v1beta1_KubeletAuthorization(&in.Authorization, &out.Authorization, s); err != nil { - return err - } - if err := v1.Convert_int32_To_Pointer_int32(&in.RegistryPullQPS, &out.RegistryPullQPS, s); err != nil { - return err - } - out.RegistryBurst = in.RegistryBurst - if err := v1.Convert_int32_To_Pointer_int32(&in.EventRecordQPS, &out.EventRecordQPS, s); err != nil { - return err - } - out.EventBurst = in.EventBurst - if err := v1.Convert_bool_To_Pointer_bool(&in.EnableDebuggingHandlers, &out.EnableDebuggingHandlers, s); err != nil { - return err - } - out.EnableContentionProfiling = in.EnableContentionProfiling - if err := v1.Convert_int32_To_Pointer_int32(&in.HealthzPort, &out.HealthzPort, s); err != nil { - return err - } - out.HealthzBindAddress = in.HealthzBindAddress - if err := v1.Convert_int32_To_Pointer_int32(&in.OOMScoreAdj, &out.OOMScoreAdj, s); err != nil { - return err - } - out.ClusterDomain = in.ClusterDomain - out.ClusterDNS = *(*[]string)(unsafe.Pointer(&in.ClusterDNS)) - out.StreamingConnectionIdleTimeout = in.StreamingConnectionIdleTimeout - out.NodeStatusUpdateFrequency = in.NodeStatusUpdateFrequency - out.ImageMinimumGCAge = in.ImageMinimumGCAge - if err := v1.Convert_int32_To_Pointer_int32(&in.ImageGCHighThresholdPercent, &out.ImageGCHighThresholdPercent, s); err != nil { - return err - } - if err := v1.Convert_int32_To_Pointer_int32(&in.ImageGCLowThresholdPercent, &out.ImageGCLowThresholdPercent, s); err != nil { - return err - } - out.VolumeStatsAggPeriod = in.VolumeStatsAggPeriod - out.KubeletCgroups = in.KubeletCgroups - out.SystemCgroups = in.SystemCgroups - out.CgroupRoot = in.CgroupRoot - if err := v1.Convert_bool_To_Pointer_bool(&in.CgroupsPerQOS, &out.CgroupsPerQOS, s); err != nil { - return err - } - out.CgroupDriver = in.CgroupDriver - out.CPUManagerPolicy = in.CPUManagerPolicy - out.CPUManagerReconcilePeriod = in.CPUManagerReconcilePeriod - out.QOSReserved = *(*map[string]string)(unsafe.Pointer(&in.QOSReserved)) - out.RuntimeRequestTimeout = in.RuntimeRequestTimeout - out.HairpinMode = in.HairpinMode - out.MaxPods = in.MaxPods - out.PodCIDR = in.PodCIDR - if err := v1.Convert_int64_To_Pointer_int64(&in.PodPidsLimit, &out.PodPidsLimit, s); err != nil { - return err - } - out.ResolverConfig = in.ResolverConfig - if err := v1.Convert_bool_To_Pointer_bool(&in.CPUCFSQuota, &out.CPUCFSQuota, s); err != nil { - return err - } - out.MaxOpenFiles = in.MaxOpenFiles - out.ContentType = in.ContentType - if err := v1.Convert_int32_To_Pointer_int32(&in.KubeAPIQPS, &out.KubeAPIQPS, s); err != nil { - return err - } - out.KubeAPIBurst = in.KubeAPIBurst - if err := v1.Convert_bool_To_Pointer_bool(&in.SerializeImagePulls, &out.SerializeImagePulls, s); err != nil { - return err - } - out.EvictionHard = *(*map[string]string)(unsafe.Pointer(&in.EvictionHard)) - out.EvictionSoft = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoft)) - out.EvictionSoftGracePeriod = *(*map[string]string)(unsafe.Pointer(&in.EvictionSoftGracePeriod)) - out.EvictionPressureTransitionPeriod = in.EvictionPressureTransitionPeriod - out.EvictionMaxPodGracePeriod = in.EvictionMaxPodGracePeriod - out.EvictionMinimumReclaim = *(*map[string]string)(unsafe.Pointer(&in.EvictionMinimumReclaim)) - out.PodsPerCore = in.PodsPerCore - if err := v1.Convert_bool_To_Pointer_bool(&in.EnableControllerAttachDetach, &out.EnableControllerAttachDetach, s); err != nil { - return err - } - out.ProtectKernelDefaults = in.ProtectKernelDefaults - if err := v1.Convert_bool_To_Pointer_bool(&in.MakeIPTablesUtilChains, &out.MakeIPTablesUtilChains, s); err != nil { - return err - } - if err := v1.Convert_int32_To_Pointer_int32(&in.IPTablesMasqueradeBit, &out.IPTablesMasqueradeBit, s); err != nil { - return err - } - if err := v1.Convert_int32_To_Pointer_int32(&in.IPTablesDropBit, &out.IPTablesDropBit, s); err != nil { - return err - } - out.FeatureGates = *(*map[string]bool)(unsafe.Pointer(&in.FeatureGates)) - if err := v1.Convert_bool_To_Pointer_bool(&in.FailSwapOn, &out.FailSwapOn, s); err != nil { - return err - } - out.ContainerLogMaxSize = in.ContainerLogMaxSize - if err := v1.Convert_int32_To_Pointer_int32(&in.ContainerLogMaxFiles, &out.ContainerLogMaxFiles, s); err != nil { - return err - } - out.SystemReserved = *(*map[string]string)(unsafe.Pointer(&in.SystemReserved)) - out.KubeReserved = *(*map[string]string)(unsafe.Pointer(&in.KubeReserved)) - out.SystemReservedCgroup = in.SystemReservedCgroup - out.KubeReservedCgroup = in.KubeReservedCgroup - out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) - return nil -} - -// Convert_kubeletconfig_KubeletConfiguration_To_v1beta1_KubeletConfiguration is an autogenerated conversion function. -func Convert_kubeletconfig_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in *kubeletconfig.KubeletConfiguration, out *KubeletConfiguration, s conversion.Scope) error { - return autoConvert_kubeletconfig_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in, out, s) -} - -func autoConvert_v1beta1_KubeletWebhookAuthentication_To_kubeletconfig_KubeletWebhookAuthentication(in *KubeletWebhookAuthentication, out *kubeletconfig.KubeletWebhookAuthentication, s conversion.Scope) error { - if err := v1.Convert_Pointer_bool_To_bool(&in.Enabled, &out.Enabled, s); err != nil { - return err - } - out.CacheTTL = in.CacheTTL - return nil -} - -// Convert_v1beta1_KubeletWebhookAuthentication_To_kubeletconfig_KubeletWebhookAuthentication is an autogenerated conversion function. -func Convert_v1beta1_KubeletWebhookAuthentication_To_kubeletconfig_KubeletWebhookAuthentication(in *KubeletWebhookAuthentication, out *kubeletconfig.KubeletWebhookAuthentication, s conversion.Scope) error { - return autoConvert_v1beta1_KubeletWebhookAuthentication_To_kubeletconfig_KubeletWebhookAuthentication(in, out, s) -} - -func autoConvert_kubeletconfig_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(in *kubeletconfig.KubeletWebhookAuthentication, out *KubeletWebhookAuthentication, s conversion.Scope) error { - if err := v1.Convert_bool_To_Pointer_bool(&in.Enabled, &out.Enabled, s); err != nil { - return err - } - out.CacheTTL = in.CacheTTL - return nil -} - -// Convert_kubeletconfig_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication is an autogenerated conversion function. -func Convert_kubeletconfig_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(in *kubeletconfig.KubeletWebhookAuthentication, out *KubeletWebhookAuthentication, s conversion.Scope) error { - return autoConvert_kubeletconfig_KubeletWebhookAuthentication_To_v1beta1_KubeletWebhookAuthentication(in, out, s) -} - -func autoConvert_v1beta1_KubeletWebhookAuthorization_To_kubeletconfig_KubeletWebhookAuthorization(in *KubeletWebhookAuthorization, out *kubeletconfig.KubeletWebhookAuthorization, s conversion.Scope) error { - out.CacheAuthorizedTTL = in.CacheAuthorizedTTL - out.CacheUnauthorizedTTL = in.CacheUnauthorizedTTL - return nil -} - -// Convert_v1beta1_KubeletWebhookAuthorization_To_kubeletconfig_KubeletWebhookAuthorization is an autogenerated conversion function. -func Convert_v1beta1_KubeletWebhookAuthorization_To_kubeletconfig_KubeletWebhookAuthorization(in *KubeletWebhookAuthorization, out *kubeletconfig.KubeletWebhookAuthorization, s conversion.Scope) error { - return autoConvert_v1beta1_KubeletWebhookAuthorization_To_kubeletconfig_KubeletWebhookAuthorization(in, out, s) -} - -func autoConvert_kubeletconfig_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(in *kubeletconfig.KubeletWebhookAuthorization, out *KubeletWebhookAuthorization, s conversion.Scope) error { - out.CacheAuthorizedTTL = in.CacheAuthorizedTTL - out.CacheUnauthorizedTTL = in.CacheUnauthorizedTTL - return nil -} - -// Convert_kubeletconfig_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization is an autogenerated conversion function. -func Convert_kubeletconfig_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(in *kubeletconfig.KubeletWebhookAuthorization, out *KubeletWebhookAuthorization, s conversion.Scope) error { - return autoConvert_kubeletconfig_KubeletWebhookAuthorization_To_v1beta1_KubeletWebhookAuthorization(in, out, s) -} - -func autoConvert_v1beta1_KubeletX509Authentication_To_kubeletconfig_KubeletX509Authentication(in *KubeletX509Authentication, out *kubeletconfig.KubeletX509Authentication, s conversion.Scope) error { - out.ClientCAFile = in.ClientCAFile - return nil -} - -// Convert_v1beta1_KubeletX509Authentication_To_kubeletconfig_KubeletX509Authentication is an autogenerated conversion function. -func Convert_v1beta1_KubeletX509Authentication_To_kubeletconfig_KubeletX509Authentication(in *KubeletX509Authentication, out *kubeletconfig.KubeletX509Authentication, s conversion.Scope) error { - return autoConvert_v1beta1_KubeletX509Authentication_To_kubeletconfig_KubeletX509Authentication(in, out, s) -} - -func autoConvert_kubeletconfig_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(in *kubeletconfig.KubeletX509Authentication, out *KubeletX509Authentication, s conversion.Scope) error { - out.ClientCAFile = in.ClientCAFile - return nil -} - -// Convert_kubeletconfig_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication is an autogenerated conversion function. -func Convert_kubeletconfig_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(in *kubeletconfig.KubeletX509Authentication, out *KubeletX509Authentication, s conversion.Scope) error { - return autoConvert_kubeletconfig_KubeletX509Authentication_To_v1beta1_KubeletX509Authentication(in, out, s) -} - -func autoConvert_v1beta1_SerializedNodeConfigSource_To_kubeletconfig_SerializedNodeConfigSource(in *SerializedNodeConfigSource, out *kubeletconfig.SerializedNodeConfigSource, s conversion.Scope) error { - out.Source = in.Source - return nil -} - -// Convert_v1beta1_SerializedNodeConfigSource_To_kubeletconfig_SerializedNodeConfigSource is an autogenerated conversion function. -func Convert_v1beta1_SerializedNodeConfigSource_To_kubeletconfig_SerializedNodeConfigSource(in *SerializedNodeConfigSource, out *kubeletconfig.SerializedNodeConfigSource, s conversion.Scope) error { - return autoConvert_v1beta1_SerializedNodeConfigSource_To_kubeletconfig_SerializedNodeConfigSource(in, out, s) -} - -func autoConvert_kubeletconfig_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource(in *kubeletconfig.SerializedNodeConfigSource, out *SerializedNodeConfigSource, s conversion.Scope) error { - out.Source = in.Source - return nil -} - -// Convert_kubeletconfig_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource is an autogenerated conversion function. -func Convert_kubeletconfig_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource(in *kubeletconfig.SerializedNodeConfigSource, out *SerializedNodeConfigSource, s conversion.Scope) error { - return autoConvert_kubeletconfig_SerializedNodeConfigSource_To_v1beta1_SerializedNodeConfigSource(in, out, s) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/BUILD deleted file mode 100644 index 071a4b16..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation/BUILD +++ /dev/null @@ -1,81 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "validation.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "validation_others.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "validation_windows.go", - ], - "//conditions:default": [], - }), - importpath = "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/BUILD index f5166850..8939e14d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/BUILD @@ -32,9 +32,3 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) - -filegroup( - name = "go_default_library_protos", - srcs = ["api.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/api.proto b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/api.proto index 319b3f19..c6bd2620 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/api.proto +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1/api.proto @@ -22,12 +22,12 @@ message PluginInfo { // should follow the extended resource name convention. // For CSI, this is the CSI driver registrar name. string name = 2; - // Optional endpoint location. If found set by Kubelet component, - // Kubelet component will use this endpoint for specific requests. - // This allows the plugin to register using one endpoint and possibly use - // a different socket for control operations. CSI uses this model to delegate - // its registration external from the plugin. - string endpoint = 3; + // Optional endpoint location. If found set by Kubelet component, + // Kubelet component will use this endpoint for specific requests. + // This allows the plugin to register using one endpoint and possibly use + // a different socket for control operations. CSI uses this model to delegate + // its registration external from the plugin. + string endpoint = 3; // Plugin service API versions the plugin supports. // For DevicePlugin, this maps to the deviceplugin API versions the // plugin supports at the given socket. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1/BUILD index 61a83c26..3244cdf5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1/BUILD @@ -9,7 +9,7 @@ go_library( name = "go_default_library", srcs = ["types.go"], importpath = "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1", - deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD index 5f73322b..7199ed3d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/BUILD @@ -9,80 +9,35 @@ load( go_library( name = "go_default_library", srcs = [ + "cadvisor_linux.go", + "cadvisor_unsupported.go", + "cadvisor_windows.go", "doc.go", + "helpers_linux.go", + "helpers_unsupported.go", "types.go", "util.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "cadvisor_linux.go", - "cadvisor_unsupported.go", - "helpers_linux.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "cadvisor_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "cadvisor_windows.go", - "helpers_unsupported.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/kubelet/cadvisor", deps = [ "//pkg/apis/core/v1/helper:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/google/cadvisor/events:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/cache/memory:go_default_library", "//vendor/github.com/google/cadvisor/container:go_default_library", "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/http:go_default_library", "//vendor/github.com/google/cadvisor/manager:go_default_library", "//vendor/github.com/google/cadvisor/metrics:go_default_library", "//vendor/github.com/google/cadvisor/utils/sysfs:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], "@io_bazel_rules_go//go/platform:windows": [ "//pkg/kubelet/winstats:go_default_library", @@ -93,24 +48,21 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "cadvisor_linux_test.go", - "util_test.go", - ], - "//conditions:default": [], - }), + srcs = [ + "cadvisor_linux_test.go", + "util_test.go", + ], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:linux": [ "//pkg/apis/core/v1/helper:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/metrics:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go index 6418beb1..f4a3e886 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go @@ -21,24 +21,20 @@ package cadvisor import ( "flag" "fmt" - "net" "net/http" "os" "path" - "strconv" "time" "github.com/golang/glog" "github.com/google/cadvisor/cache/memory" cadvisormetrics "github.com/google/cadvisor/container" "github.com/google/cadvisor/events" - cadvisorhttp "github.com/google/cadvisor/http" cadvisorapi "github.com/google/cadvisor/info/v1" cadvisorapiv2 "github.com/google/cadvisor/info/v2" "github.com/google/cadvisor/manager" "github.com/google/cadvisor/metrics" "github.com/google/cadvisor/utils/sysfs" - "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/kubernetes/pkg/kubelet/types" ) @@ -105,21 +101,26 @@ func containerLabels(c *cadvisorapi.ContainerInfo) map[string]string { } // New creates a cAdvisor and exports its API on the specified port if port > 0. -func New(address string, port uint, imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) { +func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) { sysFs := sysfs.NewRealSysFs() - ignoreMetrics := cadvisormetrics.MetricSet{ - cadvisormetrics.NetworkTcpUsageMetrics: struct{}{}, - cadvisormetrics.NetworkUdpUsageMetrics: struct{}{}, - cadvisormetrics.PerCpuUsageMetrics: struct{}{}, - cadvisormetrics.ProcessSchedulerMetrics: struct{}{}, + includedMetrics := cadvisormetrics.MetricSet{ + cadvisormetrics.CpuUsageMetrics: struct{}{}, + cadvisormetrics.MemoryUsageMetrics: struct{}{}, + cadvisormetrics.CpuLoadMetrics: struct{}{}, + cadvisormetrics.DiskIOMetrics: struct{}{}, + cadvisormetrics.NetworkUsageMetrics: struct{}{}, + cadvisormetrics.AcceleratorUsageMetrics: struct{}{}, + cadvisormetrics.AppMetrics: struct{}{}, } - if !usingLegacyStats { - ignoreMetrics[cadvisormetrics.DiskUsageMetrics] = struct{}{} + if usingLegacyStats { + includedMetrics[cadvisormetrics.DiskUsageMetrics] = struct{}{} } + // collect metrics for all cgroups + rawContainerCgroupPathPrefixWhiteList := []string{"/"} // Create and start the cAdvisor container manager. - m, err := manager.New(memory.New(statsCacheDuration, nil), sysFs, maxHousekeepingInterval, allowDynamicHousekeeping, ignoreMetrics, http.DefaultClient) + m, err := manager.New(memory.New(statsCacheDuration, nil), sysFs, maxHousekeepingInterval, allowDynamicHousekeeping, includedMetrics, http.DefaultClient, rawContainerCgroupPathPrefixWhiteList) if err != nil { return nil, err } @@ -140,10 +141,6 @@ func New(address string, port uint, imageFsInfoProvider ImageFsInfoProvider, roo Manager: m, } - err = cadvisorClient.exportHTTP(address, port) - if err != nil { - return nil, err - } return cadvisorClient, nil } @@ -151,42 +148,6 @@ func (cc *cadvisorClient) Start() error { return cc.Manager.Start() } -func (cc *cadvisorClient) exportHTTP(address string, port uint) error { - // Register the handlers regardless as this registers the prometheus - // collector properly. - mux := http.NewServeMux() - err := cadvisorhttp.RegisterHandlers(mux, cc, "", "", "", "") - if err != nil { - return err - } - - cadvisorhttp.RegisterPrometheusHandler(mux, cc, "/metrics", containerLabels) - - // Only start the http server if port > 0 - if port > 0 { - serv := &http.Server{ - Addr: net.JoinHostPort(address, strconv.Itoa(int(port))), - Handler: mux, - } - - // TODO(vmarmol): Remove this when the cAdvisor port is once again free. - // If export failed, retry in the background until we are able to bind. - // This allows an existing cAdvisor to be killed before this one registers. - go func() { - defer runtime.HandleCrash() - - err := serv.ListenAndServe() - for err != nil { - glog.Infof("Failed to register cAdvisor on port %d, retrying. Error: %v", port, err) - time.Sleep(time.Minute) - err = serv.ListenAndServe() - } - }() - } - - return nil -} - func (cc *cadvisorClient) ContainerInfo(name string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) { return cc.GetContainerInfo(name, req) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_unsupported.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_unsupported.go index 501c743d..ce81ff0e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_unsupported.go @@ -31,7 +31,7 @@ type cadvisorUnsupported struct { var _ Interface = new(cadvisorUnsupported) -func New(address string, port uint, imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) { +func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) { return &cadvisorUnsupported{}, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_windows.go index eb416a14..eeded9b7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_windows.go @@ -33,7 +33,7 @@ type cadvisorClient struct { var _ Interface = new(cadvisorClient) // New creates a cAdvisor and exports its API on the specified port if port > 0. -func New(address string, port uint, imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) { +func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, usingLegacyStats bool) (Interface, error) { client, err := winstats.NewPerfCounterClient() return &cadvisorClient{ rootPath: rootPath, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD deleted file mode 100644 index 6910df4d..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "kubelet.go", - "transport.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/certificate", - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/certificate:go_default_library", - "//vendor/k8s.io/client-go/util/connrotation:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["transport_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/certificate/bootstrap:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/OWNERS deleted file mode 100644 index dcb32d2b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/OWNERS +++ /dev/null @@ -1,7 +0,0 @@ -reviewers: -- mikedanese -- liggitt -- awly -approvers: -- mikedanese -- liggitt diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/kubelet.go b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/kubelet.go deleted file mode 100644 index b8530074..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/kubelet.go +++ /dev/null @@ -1,150 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 certificate - -import ( - "crypto/x509" - "crypto/x509/pkix" - "fmt" - "net" - - "github.com/prometheus/client_golang/prometheus" - - certificates "k8s.io/api/certificates/v1beta1" - "k8s.io/apimachinery/pkg/types" - clientset "k8s.io/client-go/kubernetes" - clientcertificates "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" - "k8s.io/client-go/util/certificate" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/metrics" -) - -// NewKubeletServerCertificateManager creates a certificate manager for the kubelet when retrieving a server certificate -// or returns an error. -func NewKubeletServerCertificateManager(kubeClient clientset.Interface, kubeCfg *kubeletconfig.KubeletConfiguration, nodeName types.NodeName, ips []net.IP, hostnames []string, certDirectory string) (certificate.Manager, error) { - var certSigningRequestClient clientcertificates.CertificateSigningRequestInterface - if kubeClient != nil && kubeClient.CertificatesV1beta1() != nil { - certSigningRequestClient = kubeClient.CertificatesV1beta1().CertificateSigningRequests() - } - certificateStore, err := certificate.NewFileStore( - "kubelet-server", - certDirectory, - certDirectory, - kubeCfg.TLSCertFile, - kubeCfg.TLSPrivateKeyFile) - if err != nil { - return nil, fmt.Errorf("failed to initialize server certificate store: %v", err) - } - var certificateExpiration = prometheus.NewGauge( - prometheus.GaugeOpts{ - Namespace: metrics.KubeletSubsystem, - Subsystem: "certificate_manager", - Name: "server_expiration_seconds", - Help: "Gauge of the lifetime of a certificate. The value is the date the certificate will expire in seconds since January 1, 1970 UTC.", - }, - ) - prometheus.MustRegister(certificateExpiration) - - m, err := certificate.NewManager(&certificate.Config{ - CertificateSigningRequestClient: certSigningRequestClient, - Template: &x509.CertificateRequest{ - Subject: pkix.Name{ - CommonName: fmt.Sprintf("system:node:%s", nodeName), - Organization: []string{"system:nodes"}, - }, - DNSNames: hostnames, - IPAddresses: ips, - }, - Usages: []certificates.KeyUsage{ - // https://tools.ietf.org/html/rfc5280#section-4.2.1.3 - // - // Digital signature allows the certificate to be used to verify - // digital signatures used during TLS negotiation. - certificates.UsageDigitalSignature, - // KeyEncipherment allows the cert/key pair to be used to encrypt - // keys, including the symmetric keys negotiated during TLS setup - // and used for data transfer. - certificates.UsageKeyEncipherment, - // ServerAuth allows the cert to be used by a TLS server to - // authenticate itself to a TLS client. - certificates.UsageServerAuth, - }, - CertificateStore: certificateStore, - CertificateExpiration: certificateExpiration, - }) - if err != nil { - return nil, fmt.Errorf("failed to initialize server certificate manager: %v", err) - } - return m, nil -} - -// NewKubeletClientCertificateManager sets up a certificate manager without a -// client that can be used to sign new certificates (or rotate). It answers with -// whatever certificate it is initialized with. If a CSR client is set later, it -// may begin rotating/renewing the client cert -func NewKubeletClientCertificateManager(certDirectory string, nodeName types.NodeName, certData []byte, keyData []byte, certFile string, keyFile string) (certificate.Manager, error) { - certificateStore, err := certificate.NewFileStore( - "kubelet-client", - certDirectory, - certDirectory, - certFile, - keyFile) - if err != nil { - return nil, fmt.Errorf("failed to initialize client certificate store: %v", err) - } - var certificateExpiration = prometheus.NewGauge( - prometheus.GaugeOpts{ - Namespace: metrics.KubeletSubsystem, - Subsystem: "certificate_manager", - Name: "client_expiration_seconds", - Help: "Gauge of the lifetime of a certificate. The value is the date the certificate will expire in seconds since January 1, 1970 UTC.", - }, - ) - prometheus.MustRegister(certificateExpiration) - - m, err := certificate.NewManager(&certificate.Config{ - Template: &x509.CertificateRequest{ - Subject: pkix.Name{ - CommonName: fmt.Sprintf("system:node:%s", nodeName), - Organization: []string{"system:nodes"}, - }, - }, - Usages: []certificates.KeyUsage{ - // https://tools.ietf.org/html/rfc5280#section-4.2.1.3 - // - // DigitalSignature allows the certificate to be used to verify - // digital signatures including signatures used during TLS - // negotiation. - certificates.UsageDigitalSignature, - // KeyEncipherment allows the cert/key pair to be used to encrypt - // keys, including the symmetric keys negotiated during TLS setup - // and used for data transfer.. - certificates.UsageKeyEncipherment, - // ClientAuth allows the cert to be used by a TLS client to - // authenticate itself to the TLS server. - certificates.UsageClientAuth, - }, - CertificateStore: certificateStore, - BootstrapCertificatePEM: certData, - BootstrapKeyPEM: keyData, - CertificateExpiration: certificateExpiration, - }) - if err != nil { - return nil, fmt.Errorf("failed to initialize client certificate manager: %v", err) - } - return m, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go b/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go deleted file mode 100644 index 76caa20a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/transport.go +++ /dev/null @@ -1,148 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 certificate - -import ( - "crypto/tls" - "fmt" - "net" - "net/http" - "time" - - "github.com/golang/glog" - - utilnet "k8s.io/apimachinery/pkg/util/net" - "k8s.io/apimachinery/pkg/util/wait" - restclient "k8s.io/client-go/rest" - "k8s.io/client-go/util/certificate" - "k8s.io/client-go/util/connrotation" -) - -// UpdateTransport instruments a restconfig with a transport that dynamically uses -// certificates provided by the manager for TLS client auth. -// -// The config must not already provide an explicit transport. -// -// The returned function allows forcefully closing all active connections. -// -// The returned transport periodically checks the manager to determine if the -// certificate has changed. If it has, the transport shuts down all existing client -// connections, forcing the client to re-handshake with the server and use the -// new certificate. -// -// The exitAfter duration, if set, will terminate the current process if a certificate -// is not available from the store (because it has been deleted on disk or is corrupt) -// or if the certificate has expired and the server is responsive. This allows the -// process parent or the bootstrap credentials an opportunity to retrieve a new initial -// certificate. -// -// stopCh should be used to indicate when the transport is unused and doesn't need -// to continue checking the manager. -func UpdateTransport(stopCh <-chan struct{}, clientConfig *restclient.Config, clientCertificateManager certificate.Manager, exitAfter time.Duration) (func(), error) { - return updateTransport(stopCh, 10*time.Second, clientConfig, clientCertificateManager, exitAfter) -} - -// updateTransport is an internal method that exposes how often this method checks that the -// client cert has changed. -func updateTransport(stopCh <-chan struct{}, period time.Duration, clientConfig *restclient.Config, clientCertificateManager certificate.Manager, exitAfter time.Duration) (func(), error) { - if clientConfig.Transport != nil || clientConfig.Dial != nil { - return nil, fmt.Errorf("there is already a transport or dialer configured") - } - - d := connrotation.NewDialer((&net.Dialer{Timeout: 30 * time.Second, KeepAlive: 30 * time.Second}).DialContext) - - tlsConfig, err := restclient.TLSConfigFor(clientConfig) - if err != nil { - return nil, fmt.Errorf("unable to configure TLS for the rest client: %v", err) - } - if tlsConfig == nil { - tlsConfig = &tls.Config{} - } - - if clientCertificateManager != nil { - tlsConfig.Certificates = nil - tlsConfig.GetClientCertificate = func(requestInfo *tls.CertificateRequestInfo) (*tls.Certificate, error) { - cert := clientCertificateManager.Current() - if cert == nil { - return &tls.Certificate{Certificate: nil}, nil - } - return cert, nil - } - - lastCertAvailable := time.Now() - lastCert := clientCertificateManager.Current() - go wait.Until(func() { - curr := clientCertificateManager.Current() - - if exitAfter > 0 { - now := time.Now() - if curr == nil { - // the certificate has been deleted from disk or is otherwise corrupt - if now.After(lastCertAvailable.Add(exitAfter)) { - if clientCertificateManager.ServerHealthy() { - glog.Fatalf("It has been %s since a valid client cert was found and the server is responsive, exiting.", exitAfter) - } else { - glog.Errorf("It has been %s since a valid client cert was found, but the server is not responsive. A restart may be necessary to retrieve new initial credentials.", exitAfter) - } - } - } else { - // the certificate is expired - if now.After(curr.Leaf.NotAfter) { - if clientCertificateManager.ServerHealthy() { - glog.Fatalf("The currently active client certificate has expired and the server is responsive, exiting.") - } else { - glog.Errorf("The currently active client certificate has expired, but the server is not responsive. A restart may be necessary to retrieve new initial credentials.") - } - } - lastCertAvailable = now - } - } - - if curr == nil || lastCert == curr { - // Cert hasn't been rotated. - return - } - lastCert = curr - - glog.Infof("certificate rotation detected, shutting down client connections to start using new credentials") - // The cert has been rotated. Close all existing connections to force the client - // to reperform its TLS handshake with new cert. - // - // See: https://github.com/kubernetes-incubator/bootkube/pull/663#issuecomment-318506493 - d.CloseAll() - }, period, stopCh) - } - - clientConfig.Transport = utilnet.SetTransportDefaults(&http.Transport{ - Proxy: http.ProxyFromEnvironment, - TLSHandshakeTimeout: 10 * time.Second, - TLSClientConfig: tlsConfig, - MaxIdleConnsPerHost: 25, - DialContext: d.DialContext, // Use custom dialer. - }) - - // Zero out all existing TLS options since our new transport enforces them. - clientConfig.CertData = nil - clientConfig.KeyData = nil - clientConfig.CertFile = "" - clientConfig.KeyFile = "" - clientConfig.CAData = nil - clientConfig.CAFile = "" - clientConfig.Insecure = false - - return d.CloseAll, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpoint/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/checkpoint/BUILD index 0be2f14b..a57fff4c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/checkpoint/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/checkpoint/BUILD @@ -9,8 +9,8 @@ go_library( "//pkg/apis/core:go_default_library", "//pkg/kubelet/checkpointmanager:go_default_library", "//pkg/kubelet/checkpointmanager/checksum:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", ], ) @@ -21,8 +21,8 @@ go_test( deps = [ "//pkg/apis/core:go_default_library", "//pkg/kubelet/checkpointmanager:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD index 8bfdd017..6800caf0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/BUILD @@ -3,83 +3,24 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ + "cgroup_manager_linux.go", + "cgroup_manager_unsupported.go", "container_manager.go", + "container_manager_linux.go", "container_manager_stub.go", + "container_manager_unsupported.go", + "container_manager_windows.go", "fake_internal_container_lifecycle.go", + "helpers_linux.go", + "helpers_unsupported.go", "internal_container_lifecycle.go", + "node_container_manager.go", + "pod_container_manager_linux.go", "pod_container_manager_stub.go", + "pod_container_manager_unsupported.go", + "qos_container_manager_linux.go", "types.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "cgroup_manager_linux.go", - "container_manager_linux.go", - "helpers_linux.go", - "node_container_manager.go", - "pod_container_manager_linux.go", - "qos_container_manager_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "cgroup_manager_unsupported.go", - "container_manager_unsupported.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "cgroup_manager_unsupported.go", - "container_manager_windows.go", - "helpers_unsupported.go", - "pod_container_manager_unsupported.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/kubelet/cm", visibility = ["//visibility:public"], deps = [ @@ -91,33 +32,34 @@ go_library( "//pkg/kubelet/eviction/api:go_default_library", "//pkg/kubelet/lifecycle:go_default_library", "//pkg/kubelet/status:go_default_library", + "//pkg/kubelet/util/pluginwatcher:go_default_library", "//pkg/scheduler/cache:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:android": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:darwin": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:dragonfly": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:freebsd": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:linux": [ "//pkg/api/v1/resource:go_default_library", @@ -136,44 +78,44 @@ go_library( "//pkg/util/procfs:go_default_library", "//pkg/util/sysctl:go_default_library", "//pkg/util/version:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/github.com/docker/go-units:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/systemd:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:nacl": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:netbsd": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:openbsd": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:plan9": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:solaris": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "@io_bazel_rules_go//go/platform:windows": [ "//pkg/kubelet/cadvisor:go_default_library", "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", ], "//conditions:default": [], }), @@ -181,27 +123,27 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "cgroup_manager_linux_test.go", - "cgroup_manager_test.go", - "container_manager_linux_test.go", - "helpers_linux_test.go", - "node_container_manager_test.go", - "pod_container_manager_linux_test.go", - ], - "//conditions:default": [], - }), + srcs = [ + "cgroup_manager_linux_test.go", + "cgroup_manager_test.go", + "container_manager_linux_test.go", + "helpers_linux_test.go", + "node_container_manager_test.go", + "pod_container_manager_linux_test.go", + ], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:linux": [ + "//pkg/features:go_default_library", "//pkg/kubelet/eviction/api:go_default_library", "//pkg/util/mount:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go index 14a17396..64728a7d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager.go @@ -28,6 +28,7 @@ import ( evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/status" + "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" "fmt" @@ -94,6 +95,11 @@ type ContainerManager interface { // GetPodCgroupRoot returns the cgroup which contains all pods. GetPodCgroupRoot() string + + // GetPluginRegistrationHandler returns a plugin registration handler + // The pluginwatcher's Handlers allow to have a single module for handling + // registration. + GetPluginRegistrationHandler() pluginwatcher.PluginHandler } type NodeConfig struct { @@ -112,6 +118,7 @@ type NodeConfig struct { ExperimentalCPUManagerReconcilePeriod time.Duration ExperimentalPodPidsLimit int64 EnforceCPULimits bool + CPUCFSQuotaPeriod time.Duration } type NodeAllocatableConfig struct { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go index 974986de..132e2de9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_linux.go @@ -52,6 +52,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/qos" "k8s.io/kubernetes/pkg/kubelet/status" + "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" utilfile "k8s.io/kubernetes/pkg/util/file" "k8s.io/kubernetes/pkg/util/mount" @@ -200,19 +201,22 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I return nil, fmt.Errorf("failed to get mounted cgroup subsystems: %v", err) } - // Check whether swap is enabled. The Kubelet does not support running with swap enabled. - swapData, err := ioutil.ReadFile("/proc/swaps") - if err != nil { - return nil, err - } - swapData = bytes.TrimSpace(swapData) // extra trailing \n - swapLines := strings.Split(string(swapData), "\n") + if failSwapOn { + // Check whether swap is enabled. The Kubelet does not support running with swap enabled. + swapData, err := ioutil.ReadFile("/proc/swaps") + if err != nil { + return nil, err + } + swapData = bytes.TrimSpace(swapData) // extra trailing \n + swapLines := strings.Split(string(swapData), "\n") - // If there is more than one line (table headers) in /proc/swaps, swap is enabled and we should - // error out unless --fail-swap-on is set to false. - if failSwapOn && len(swapLines) > 1 { - return nil, fmt.Errorf("Running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained: %v", swapLines) + // If there is more than one line (table headers) in /proc/swaps, swap is enabled and we should + // error out unless --fail-swap-on is set to false. + if len(swapLines) > 1 { + return nil, fmt.Errorf("Running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained: %v", swapLines) + } } + var capacity = v1.ResourceList{} // It is safe to invoke `MachineInfo` on cAdvisor before logically initializing cAdvisor here because // machine info is computed and cached once as part of cAdvisor object creation. @@ -303,6 +307,7 @@ func (cm *containerManagerImpl) NewPodContainerManager() PodContainerManager { cgroupManager: cm.cgroupManager, podPidsLimit: cm.ExperimentalPodPidsLimit, enforceCPULimits: cm.EnforceCPULimits, + cpuCFSQuotaPeriod: uint64(cm.CPUCFSQuotaPeriod / time.Microsecond), } } return &podContainerManagerNoop{ @@ -540,12 +545,14 @@ func (cm *containerManagerImpl) Start(node *v1.Node, // allocatable of the node cm.nodeInfo = node - rootfs, err := cm.cadvisorInterface.RootFsInfo() - if err != nil { - return fmt.Errorf("failed to get rootfs info: %v", err) - } - for rName, rCap := range cadvisor.EphemeralStorageCapacityFromFsInfo(rootfs) { - cm.capacity[rName] = rCap + if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.LocalStorageCapacityIsolation) { + rootfs, err := cm.cadvisorInterface.RootFsInfo() + if err != nil { + return fmt.Errorf("failed to get rootfs info: %v", err) + } + for rName, rCap := range cadvisor.EphemeralStorageCapacityFromFsInfo(rootfs) { + cm.capacity[rName] = rCap + } } // Ensure that node allocatable configuration is valid. @@ -598,6 +605,10 @@ func (cm *containerManagerImpl) Start(node *v1.Node, return nil } +func (cm *containerManagerImpl) GetPluginRegistrationHandler() pluginwatcher.PluginHandler { + return cm.deviceManager.GetWatcherHandler() +} + // TODO: move the GetResources logic to PodContainerManager. func (cm *containerManagerImpl) GetResources(pod *v1.Pod, container *v1.Container) (*kubecontainer.RunContainerOptions, error) { opts := &kubecontainer.RunContainerOptions{} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go index 8a464adc..8f948c64 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/container_manager_stub.go @@ -27,6 +27,7 @@ import ( kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/status" + "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" ) @@ -76,6 +77,10 @@ func (cm *containerManagerStub) GetCapacity() v1.ResourceList { return c } +func (cm *containerManagerStub) GetPluginRegistrationHandler() pluginwatcher.PluginHandler { + return nil +} + func (cm *containerManagerStub) GetDevicePluginResourceCapacity() (v1.ResourceList, v1.ResourceList, []string) { return nil, nil, []string{} } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD index 26d292e5..4b3baa31 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/BUILD @@ -20,10 +20,10 @@ go_library( "//pkg/kubelet/cm/cpuset:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/status:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) @@ -42,11 +42,11 @@ go_test( "//pkg/kubelet/cm/cpumanager/state:go_default_library", "//pkg/kubelet/cm/cpumanager/topology:go_default_library", "//pkg/kubelet/cm/cpuset:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go index b52fe59a..0754a4da 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/cpu_manager.go @@ -33,7 +33,6 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/status" - "path" ) // ActivePodsFunc is a function that returns a list of pods to reconcile. @@ -45,8 +44,8 @@ type runtimeService interface { type policyName string -// CPUManagerStateFileName is the name file name where cpu manager stores it's state -const CPUManagerStateFileName = "cpu_manager_state" +// cpuManagerStateFileName is the name file name where cpu manager stores it's state +const cpuManagerStateFileName = "cpu_manager_state" // Manager interface provides methods for Kubelet to manage pod cpus. type Manager interface { @@ -98,7 +97,7 @@ type manager struct { var _ Manager = &manager{} // NewManager creates new cpu manager based on provided policy -func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo *cadvisorapi.MachineInfo, nodeAllocatableReservation v1.ResourceList, stateFileDirecory string) (Manager, error) { +func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo *cadvisorapi.MachineInfo, nodeAllocatableReservation v1.ResourceList, stateFileDirectory string) (Manager, error) { var policy Policy switch policyName(cpuPolicyName) { @@ -137,9 +136,10 @@ func NewManager(cpuPolicyName string, reconcilePeriod time.Duration, machineInfo policy = NewNonePolicy() } - stateImpl := state.NewFileState( - path.Join(stateFileDirecory, CPUManagerStateFileName), - policy.Name()) + stateImpl, err := state.NewCheckpointState(stateFileDirectory, cpuManagerStateFileName, policy.Name()) + if err != nil { + return nil, fmt.Errorf("could not initialize checkpoint manager: %v", err) + } manager := &manager{ policy: policy, @@ -181,12 +181,16 @@ func (m *manager) AddContainer(p *v1.Pod, c *v1.Container, containerID string) e err = m.updateContainerCPUSet(containerID, cpus) if err != nil { glog.Errorf("[cpumanager] AddContainer error: %v", err) - return err + m.Lock() + err := m.policy.RemoveContainer(m.state, containerID) + if err != nil { + glog.Errorf("[cpumanager] AddContainer rollback state error: %v", err) + } + m.Unlock() } - } else { - glog.V(5).Infof("[cpumanager] update container resources is skipped due to cpu set is empty") + return err } - + glog.V(5).Infof("[cpumanager] update container resources is skipped due to cpu set is empty") return nil } @@ -245,6 +249,7 @@ func (m *manager) reconcileState() (success []reconciledContainer, failure []rec if err != nil { glog.Errorf("[cpumanager] reconcileState: failed to add container (pod: %s, container: %s, container id: %s, error: %v)", pod.Name, container.Name, containerID, err) failure = append(failure, reconciledContainer{pod.Name, container.Name, containerID}) + continue } } else { // if DeletionTimestamp is set, pod has already been removed from state diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go index 9a461bac..651e5fe7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/policy_static.go @@ -30,8 +30,6 @@ import ( // PolicyStatic is the name of the static policy const PolicyStatic policyName = "static" -var _ Policy = &staticPolicy{} - // staticPolicy is a CPU manager policy that does not change CPU // assignments for exclusively pinned guaranteed containers after the main // container process starts. @@ -131,7 +129,7 @@ func (p *staticPolicy) validateState(s state.State) error { } // State has already been initialized from file (is not empty) - // 1 Check if the reserved cpuset is not part of default cpuset because: + // 1. Check if the reserved cpuset is not part of default cpuset because: // - kube/system reserved have changed (increased) - may lead to some containers not being able to start // - user tampered with file if !p.reserved.Intersection(tmpDefaultCPUset).Equals(p.reserved) { @@ -147,6 +145,23 @@ func (p *staticPolicy) validateState(s state.State) error { cID, cset.String(), tmpDefaultCPUset.String()) } } + + // 3. It's possible that the set of available CPUs has changed since + // the state was written. This can be due to for example + // offlining a CPU when kubelet is not running. If this happens, + // CPU manager will run into trouble when later it tries to + // assign non-existent CPUs to containers. Validate that the + // topology that was received during CPU manager startup matches with + // the set of CPUs stored in the state. + totalKnownCPUs := tmpDefaultCPUset.Clone() + for _, cset := range tmpAssignments { + totalKnownCPUs = totalKnownCPUs.Union(cset) + } + if !totalKnownCPUs.Equals(p.topology.CPUDetails.CPUs()) { + return fmt.Errorf("current set of available CPUs \"%s\" doesn't match with CPUs in state \"%s\"", + p.topology.CPUDetails.CPUs().String(), totalKnownCPUs.String()) + } + return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD index bcaf0045..d3921196 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/BUILD @@ -3,13 +3,18 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ + "checkpoint.go", "state.go", + "state_checkpoint.go", "state_file.go", "state_mem.go", ], importpath = "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state", visibility = ["//visibility:public"], deps = [ + "//pkg/kubelet/checkpointmanager:go_default_library", + "//pkg/kubelet/checkpointmanager/checksum:go_default_library", + "//pkg/kubelet/checkpointmanager/errors:go_default_library", "//pkg/kubelet/cm/cpuset:go_default_library", "//vendor/github.com/golang/glog:go_default_library", ], @@ -17,9 +22,17 @@ go_library( go_test( name = "go_default_test", - srcs = ["state_file_test.go"], + srcs = [ + "state_checkpoint_test.go", + "state_compatibility_test.go", + "state_file_test.go", + ], embed = [":go_default_library"], - deps = ["//pkg/kubelet/cm/cpuset:go_default_library"], + deps = [ + "//pkg/kubelet/checkpointmanager:go_default_library", + "//pkg/kubelet/cm/cpumanager/state/testing:go_default_library", + "//pkg/kubelet/cm/cpuset:go_default_library", + ], ) filegroup( @@ -31,7 +44,10 @@ filegroup( filegroup( name = "all-srcs", - srcs = [":package-srcs"], + srcs = [ + ":package-srcs", + "//pkg/kubelet/cm/cpumanager/state/testing:all-srcs", + ], tags = ["automanaged"], visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/checkpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/checkpoint.go new file mode 100644 index 00000000..40e0fc81 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/checkpoint.go @@ -0,0 +1,67 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 state + +import ( + "encoding/json" + + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum" +) + +var _ checkpointmanager.Checkpoint = &CPUManagerCheckpoint{} + +// CPUManagerCheckpoint struct is used to store cpu/pod assignments in a checkpoint +type CPUManagerCheckpoint struct { + PolicyName string `json:"policyName"` + DefaultCPUSet string `json:"defaultCpuSet"` + Entries map[string]string `json:"entries,omitempty"` + Checksum checksum.Checksum `json:"checksum"` +} + +// NewCPUManagerCheckpoint returns an instance of Checkpoint +func NewCPUManagerCheckpoint() *CPUManagerCheckpoint { + return &CPUManagerCheckpoint{ + Entries: make(map[string]string), + } +} + +// MarshalCheckpoint returns marshalled checkpoint +func (cp *CPUManagerCheckpoint) MarshalCheckpoint() ([]byte, error) { + // make sure checksum wasn't set before so it doesn't affect output checksum + cp.Checksum = 0 + cp.Checksum = checksum.New(cp) + return json.Marshal(*cp) +} + +// UnmarshalCheckpoint tries to unmarshal passed bytes to checkpoint +func (cp *CPUManagerCheckpoint) UnmarshalCheckpoint(blob []byte) error { + return json.Unmarshal(blob, cp) +} + +// VerifyChecksum verifies that current checksum of checkpoint is valid +func (cp *CPUManagerCheckpoint) VerifyChecksum() error { + if cp.Checksum == 0 { + // accept empty checksum for compatibility with old file backend + return nil + } + ck := cp.Checksum + cp.Checksum = 0 + err := ck.Verify(cp) + cp.Checksum = ck + return err +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go new file mode 100644 index 00000000..6d92573b --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state/state_checkpoint.go @@ -0,0 +1,194 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 state + +import ( + "fmt" + "path" + "sync" + + "github.com/golang/glog" + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" + "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors" + "k8s.io/kubernetes/pkg/kubelet/cm/cpuset" +) + +var _ State = &stateCheckpoint{} + +type stateCheckpoint struct { + mux sync.RWMutex + policyName string + cache State + checkpointManager checkpointmanager.CheckpointManager + checkpointName string +} + +// NewCheckpointState creates new State for keeping track of cpu/pod assignment with checkpoint backend +func NewCheckpointState(stateDir, checkpointName, policyName string) (State, error) { + checkpointManager, err := checkpointmanager.NewCheckpointManager(stateDir) + if err != nil { + return nil, fmt.Errorf("failed to initialize checkpoint manager: %v", err) + } + stateCheckpoint := &stateCheckpoint{ + cache: NewMemoryState(), + policyName: policyName, + checkpointManager: checkpointManager, + checkpointName: checkpointName, + } + + if err := stateCheckpoint.restoreState(); err != nil { + return nil, fmt.Errorf("could not restore state from checkpoint: %v\n"+ + "Please drain this node and delete the CPU manager checkpoint file %q before restarting Kubelet.", + err, path.Join(stateDir, checkpointName)) + } + + return stateCheckpoint, nil +} + +// restores state from a checkpoint and creates it if it doesn't exist +func (sc *stateCheckpoint) restoreState() error { + sc.mux.Lock() + defer sc.mux.Unlock() + var err error + + // used when all parsing is ok + tmpAssignments := make(ContainerCPUAssignments) + tmpDefaultCPUSet := cpuset.NewCPUSet() + tmpContainerCPUSet := cpuset.NewCPUSet() + + checkpoint := NewCPUManagerCheckpoint() + if err = sc.checkpointManager.GetCheckpoint(sc.checkpointName, checkpoint); err != nil { + if err == errors.ErrCheckpointNotFound { + sc.storeState() + return nil + } + return err + } + + if sc.policyName != checkpoint.PolicyName { + return fmt.Errorf("configured policy %q differs from state checkpoint policy %q", sc.policyName, checkpoint.PolicyName) + } + + if tmpDefaultCPUSet, err = cpuset.Parse(checkpoint.DefaultCPUSet); err != nil { + return fmt.Errorf("could not parse default cpu set %q: %v", checkpoint.DefaultCPUSet, err) + } + + for containerID, cpuString := range checkpoint.Entries { + if tmpContainerCPUSet, err = cpuset.Parse(cpuString); err != nil { + return fmt.Errorf("could not parse cpuset %q for container id %q: %v", cpuString, containerID, err) + } + tmpAssignments[containerID] = tmpContainerCPUSet + } + + sc.cache.SetDefaultCPUSet(tmpDefaultCPUSet) + sc.cache.SetCPUAssignments(tmpAssignments) + + glog.V(2).Info("[cpumanager] state checkpoint: restored state from checkpoint") + glog.V(2).Infof("[cpumanager] state checkpoint: defaultCPUSet: %s", tmpDefaultCPUSet.String()) + + return nil +} + +// saves state to a checkpoint, caller is responsible for locking +func (sc *stateCheckpoint) storeState() { + checkpoint := NewCPUManagerCheckpoint() + checkpoint.PolicyName = sc.policyName + checkpoint.DefaultCPUSet = sc.cache.GetDefaultCPUSet().String() + + for containerID, cset := range sc.cache.GetCPUAssignments() { + checkpoint.Entries[containerID] = cset.String() + } + + err := sc.checkpointManager.CreateCheckpoint(sc.checkpointName, checkpoint) + + if err != nil { + panic("[cpumanager] could not save checkpoint: " + err.Error()) + } +} + +// GetCPUSet returns current CPU set +func (sc *stateCheckpoint) GetCPUSet(containerID string) (cpuset.CPUSet, bool) { + sc.mux.RLock() + defer sc.mux.RUnlock() + + res, ok := sc.cache.GetCPUSet(containerID) + return res, ok +} + +// GetDefaultCPUSet returns default CPU set +func (sc *stateCheckpoint) GetDefaultCPUSet() cpuset.CPUSet { + sc.mux.RLock() + defer sc.mux.RUnlock() + + return sc.cache.GetDefaultCPUSet() +} + +// GetCPUSetOrDefault returns current CPU set, or default one if it wasn't changed +func (sc *stateCheckpoint) GetCPUSetOrDefault(containerID string) cpuset.CPUSet { + sc.mux.RLock() + defer sc.mux.RUnlock() + + return sc.cache.GetCPUSetOrDefault(containerID) +} + +// GetCPUAssignments returns current CPU to pod assignments +func (sc *stateCheckpoint) GetCPUAssignments() ContainerCPUAssignments { + sc.mux.RLock() + defer sc.mux.RUnlock() + + return sc.cache.GetCPUAssignments() +} + +// SetCPUSet sets CPU set +func (sc *stateCheckpoint) SetCPUSet(containerID string, cset cpuset.CPUSet) { + sc.mux.Lock() + defer sc.mux.Unlock() + sc.cache.SetCPUSet(containerID, cset) + sc.storeState() +} + +// SetDefaultCPUSet sets default CPU set +func (sc *stateCheckpoint) SetDefaultCPUSet(cset cpuset.CPUSet) { + sc.mux.Lock() + defer sc.mux.Unlock() + sc.cache.SetDefaultCPUSet(cset) + sc.storeState() +} + +// SetCPUAssignments sets CPU to pod assignments +func (sc *stateCheckpoint) SetCPUAssignments(a ContainerCPUAssignments) { + sc.mux.Lock() + defer sc.mux.Unlock() + sc.cache.SetCPUAssignments(a) + sc.storeState() +} + +// Delete deletes assignment for specified pod +func (sc *stateCheckpoint) Delete(containerID string) { + sc.mux.Lock() + defer sc.mux.Unlock() + sc.cache.Delete(containerID) + sc.storeState() +} + +// ClearState clears the state and saves it in a checkpoint +func (sc *stateCheckpoint) ClearState() { + sc.mux.Lock() + defer sc.mux.Unlock() + sc.cache.ClearState() + sc.storeState() +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD index d2e467cc..719dbbd6 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/BUILD @@ -15,6 +15,7 @@ go_library( deps = [ "//pkg/apis/core/v1/helper:go_default_library", "//pkg/kubelet/apis/deviceplugin/v1beta1:go_default_library", + "//pkg/kubelet/apis/pluginregistration/v1alpha1:go_default_library", "//pkg/kubelet/checkpointmanager:go_default_library", "//pkg/kubelet/checkpointmanager/errors:go_default_library", "//pkg/kubelet/cm/devicemanager/checkpoint:go_default_library", @@ -22,12 +23,13 @@ go_library( "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/lifecycle:go_default_library", "//pkg/kubelet/metrics:go_default_library", + "//pkg/kubelet/util/pluginwatcher:go_default_library", "//pkg/scheduler/cache:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) @@ -40,16 +42,18 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubelet/apis/deviceplugin/v1beta1:go_default_library", + "//pkg/kubelet/apis/pluginregistration/v1alpha1:go_default_library", "//pkg/kubelet/checkpointmanager:go_default_library", "//pkg/kubelet/lifecycle:go_default_library", + "//pkg/kubelet/util/pluginwatcher:go_default_library", "//pkg/scheduler/cache:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go index 73943039..d4040fd1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go @@ -28,12 +28,15 @@ import ( "google.golang.org/grpc" pluginapi "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1" + watcherapi "k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1" ) // Stub implementation for DevicePlugin. type Stub struct { - devs []*pluginapi.Device - socket string + devs []*pluginapi.Device + socket string + resourceName string + preStartContainerFlag bool stop chan interface{} wg sync.WaitGroup @@ -43,6 +46,10 @@ type Stub struct { // allocFunc is used for handling allocation request allocFunc stubAllocFunc + + registrationStatus chan watcherapi.RegistrationStatus // for testing + endpoint string // for testing + } // stubAllocFunc is the function called when receive an allocation request from Kubelet @@ -55,10 +62,12 @@ func defaultAllocFunc(r *pluginapi.AllocateRequest, devs map[string]pluginapi.De } // NewDevicePluginStub returns an initialized DevicePlugin Stub. -func NewDevicePluginStub(devs []*pluginapi.Device, socket string) *Stub { +func NewDevicePluginStub(devs []*pluginapi.Device, socket string, name string, preStartContainerFlag bool) *Stub { return &Stub{ - devs: devs, - socket: socket, + devs: devs, + socket: socket, + resourceName: name, + preStartContainerFlag: preStartContainerFlag, stop: make(chan interface{}), update: make(chan []*pluginapi.Device), @@ -88,6 +97,7 @@ func (m *Stub) Start() error { m.wg.Add(1) m.server = grpc.NewServer([]grpc.ServerOption{}...) pluginapi.RegisterDevicePluginServer(m.server, m) + watcherapi.RegisterRegistrationServer(m.server, m) go func() { defer m.wg.Done() @@ -118,8 +128,36 @@ func (m *Stub) Stop() error { return m.cleanup() } +// GetInfo is the RPC which return pluginInfo +func (m *Stub) GetInfo(ctx context.Context, req *watcherapi.InfoRequest) (*watcherapi.PluginInfo, error) { + log.Println("GetInfo") + return &watcherapi.PluginInfo{ + Type: watcherapi.DevicePlugin, + Name: m.resourceName, + Endpoint: m.endpoint, + SupportedVersions: []string{pluginapi.Version}}, nil +} + +// NotifyRegistrationStatus receives the registration notification from watcher +func (m *Stub) NotifyRegistrationStatus(ctx context.Context, status *watcherapi.RegistrationStatus) (*watcherapi.RegistrationStatusResponse, error) { + if m.registrationStatus != nil { + m.registrationStatus <- *status + } + if !status.PluginRegistered { + log.Println("Registration failed: ", status.Error) + } + return &watcherapi.RegistrationStatusResponse{}, nil +} + // Register registers the device plugin for the given resourceName with Kubelet. -func (m *Stub) Register(kubeletEndpoint, resourceName string, preStartContainerFlag bool) error { +func (m *Stub) Register(kubeletEndpoint, resourceName string, pluginSockDir string) error { + if pluginSockDir != "" { + if _, err := os.Stat(pluginSockDir + "DEPRECATION"); err == nil { + log.Println("Deprecation file found. Skip registration.") + return nil + } + } + log.Println("Deprecation file not found. Invoke registration") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() @@ -127,16 +165,16 @@ func (m *Stub) Register(kubeletEndpoint, resourceName string, preStartContainerF grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { return net.DialTimeout("unix", addr, timeout) })) - defer conn.Close() if err != nil { return err } + defer conn.Close() client := pluginapi.NewRegistrationClient(conn) reqt := &pluginapi.RegisterRequest{ Version: pluginapi.Version, Endpoint: path.Base(m.socket), ResourceName: resourceName, - Options: &pluginapi.DevicePluginOptions{PreStartRequired: preStartContainerFlag}, + Options: &pluginapi.DevicePluginOptions{PreStartRequired: m.preStartContainerFlag}, } _, err = client.Register(context.Background(), reqt) @@ -148,7 +186,7 @@ func (m *Stub) Register(kubeletEndpoint, resourceName string, preStartContainerF // GetDevicePluginOptions returns DevicePluginOptions settings for the device plugin. func (m *Stub) GetDevicePluginOptions(ctx context.Context, e *pluginapi.Empty) (*pluginapi.DevicePluginOptions, error) { - return &pluginapi.DevicePluginOptions{}, nil + return &pluginapi.DevicePluginOptions{PreStartRequired: m.preStartContainerFlag}, nil } // PreStartContainer resets the devices received diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go index 069ffc22..eed50de6 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go @@ -37,8 +37,7 @@ type endpoint interface { stop() allocate(devs []string) (*pluginapi.AllocateResponse, error) preStartContainer(devs []string) (*pluginapi.PreStartContainerResponse, error) - getDevices() []pluginapi.Device - callback(resourceName string, added, updated, deleted []pluginapi.Device) + callback(resourceName string, devices []pluginapi.Device) isStopped() bool stopGracePeriodExpired() bool } @@ -51,15 +50,13 @@ type endpointImpl struct { resourceName string stopTime time.Time - devices map[string]pluginapi.Device - mutex sync.Mutex - - cb monitorCallback + mutex sync.Mutex + cb monitorCallback } // newEndpoint creates a new endpoint for the given resourceName. // This is to be used during normal device plugin registration. -func newEndpointImpl(socketPath, resourceName string, devices map[string]pluginapi.Device, callback monitorCallback) (*endpointImpl, error) { +func newEndpointImpl(socketPath, resourceName string, callback monitorCallback) (*endpointImpl, error) { client, c, err := dial(socketPath) if err != nil { glog.Errorf("Can't create new endpoint with path %s err %v", socketPath, err) @@ -73,41 +70,26 @@ func newEndpointImpl(socketPath, resourceName string, devices map[string]plugina socketPath: socketPath, resourceName: resourceName, - devices: devices, - cb: callback, + cb: callback, }, nil } // newStoppedEndpointImpl creates a new endpoint for the given resourceName with stopTime set. // This is to be used during Kubelet restart, before the actual device plugin re-registers. -func newStoppedEndpointImpl(resourceName string, devices map[string]pluginapi.Device) *endpointImpl { +func newStoppedEndpointImpl(resourceName string) *endpointImpl { return &endpointImpl{ resourceName: resourceName, - devices: devices, stopTime: time.Now(), } } -func (e *endpointImpl) callback(resourceName string, added, updated, deleted []pluginapi.Device) { - e.cb(resourceName, added, updated, deleted) -} - -func (e *endpointImpl) getDevices() []pluginapi.Device { - e.mutex.Lock() - defer e.mutex.Unlock() - var devs []pluginapi.Device - - for _, d := range e.devices { - devs = append(devs, d) - } - - return devs +func (e *endpointImpl) callback(resourceName string, devices []pluginapi.Device) { + e.cb(resourceName, devices) } // run initializes ListAndWatch gRPC call for the device plugin and // blocks on receiving ListAndWatch gRPC stream updates. Each ListAndWatch -// stream update contains a new list of device states. listAndWatch compares the new -// device states with its cached states to get list of new, updated, and deleted devices. +// stream update contains a new list of device states. // It then issues a callback to pass this information to the device manager which // will adjust the resource available information accordingly. func (e *endpointImpl) run() { @@ -118,14 +100,6 @@ func (e *endpointImpl) run() { return } - devices := make(map[string]pluginapi.Device) - - e.mutex.Lock() - for _, d := range e.devices { - devices[d.ID] = d - } - e.mutex.Unlock() - for { response, err := stream.Recv() if err != nil { @@ -136,57 +110,12 @@ func (e *endpointImpl) run() { devs := response.Devices glog.V(2).Infof("State pushed for device plugin %s", e.resourceName) - newDevs := make(map[string]*pluginapi.Device) - var added, updated []pluginapi.Device - + var newDevs []pluginapi.Device for _, d := range devs { - dOld, ok := devices[d.ID] - newDevs[d.ID] = d - - if !ok { - glog.V(2).Infof("New device for Endpoint %s: %v", e.resourceName, d) - - devices[d.ID] = *d - added = append(added, *d) - - continue - } - - if d.Health == dOld.Health { - continue - } - - if d.Health == pluginapi.Unhealthy { - glog.Errorf("Device %s is now Unhealthy", d.ID) - } else if d.Health == pluginapi.Healthy { - glog.V(2).Infof("Device %s is now Healthy", d.ID) - } - - devices[d.ID] = *d - updated = append(updated, *d) - } - - var deleted []pluginapi.Device - for id, d := range devices { - if _, ok := newDevs[id]; ok { - continue - } - - glog.Errorf("Device %s was deleted", d.ID) - - deleted = append(deleted, d) - delete(devices, id) - } - - e.mutex.Lock() - // NOTE: Return a copy of 'devices' instead of returning a direct reference to local 'devices' - e.devices = make(map[string]pluginapi.Device) - for _, d := range devices { - e.devices[d.ID] = d + newDevs = append(newDevs, *d) } - e.mutex.Unlock() - e.callback(e.resourceName, added, updated, deleted) + e.callback(e.resourceName, newDevs) } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go index 38805ce7..8064b572 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go @@ -39,6 +39,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/config" "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/metrics" + watcher "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" ) @@ -48,14 +49,14 @@ type ActivePodsFunc func() []*v1.Pod // monitorCallback is the function called when a device's health state changes, // or new devices are reported, or old devices are deleted. // Updated contains the most recent state of the Device. -type monitorCallback func(resourceName string, added, updated, deleted []pluginapi.Device) +type monitorCallback func(resourceName string, devices []pluginapi.Device) // ManagerImpl is the structure in charge of managing Device Plugins. type ManagerImpl struct { socketname string socketdir string - endpoints map[string]endpoint // Key is ResourceName + endpoints map[string]endpointInfo // Key is ResourceName mutex sync.Mutex server *grpc.Server @@ -85,10 +86,14 @@ type ManagerImpl struct { // podDevices contains pod to allocated device mapping. podDevices podDevices - pluginOpts map[string]*pluginapi.DevicePluginOptions checkpointManager checkpointmanager.CheckpointManager } +type endpointInfo struct { + e endpoint + opts *pluginapi.DevicePluginOptions +} + type sourcesReadyStub struct{} func (s *sourcesReadyStub) AddSource(source string) {} @@ -103,18 +108,18 @@ func newManagerImpl(socketPath string) (*ManagerImpl, error) { glog.V(2).Infof("Creating Device Plugin manager at %s", socketPath) if socketPath == "" || !filepath.IsAbs(socketPath) { - return nil, fmt.Errorf(errBadSocket+" %v", socketPath) + return nil, fmt.Errorf(errBadSocket+" %s", socketPath) } dir, file := filepath.Split(socketPath) manager := &ManagerImpl{ - endpoints: make(map[string]endpoint), + endpoints: make(map[string]endpointInfo), + socketname: file, socketdir: dir, healthyDevices: make(map[string]sets.String), unhealthyDevices: make(map[string]sets.String), allocatedDevices: make(map[string]sets.String), - pluginOpts: make(map[string]*pluginapi.DevicePluginOptions), podDevices: make(podDevices), } manager.callback = manager.genericDeviceUpdateCallback @@ -125,35 +130,24 @@ func newManagerImpl(socketPath string) (*ManagerImpl, error) { manager.sourcesReady = &sourcesReadyStub{} checkpointManager, err := checkpointmanager.NewCheckpointManager(dir) if err != nil { - return nil, fmt.Errorf("failed to initialize checkpoint manager: %+v", err) + return nil, fmt.Errorf("failed to initialize checkpoint manager: %v", err) } manager.checkpointManager = checkpointManager return manager, nil } -func (m *ManagerImpl) genericDeviceUpdateCallback(resourceName string, added, updated, deleted []pluginapi.Device) { - kept := append(updated, added...) +func (m *ManagerImpl) genericDeviceUpdateCallback(resourceName string, devices []pluginapi.Device) { m.mutex.Lock() - if _, ok := m.healthyDevices[resourceName]; !ok { - m.healthyDevices[resourceName] = sets.NewString() - } - if _, ok := m.unhealthyDevices[resourceName]; !ok { - m.unhealthyDevices[resourceName] = sets.NewString() - } - for _, dev := range kept { + m.healthyDevices[resourceName] = sets.NewString() + m.unhealthyDevices[resourceName] = sets.NewString() + for _, dev := range devices { if dev.Health == pluginapi.Healthy { m.healthyDevices[resourceName].Insert(dev.ID) - m.unhealthyDevices[resourceName].Delete(dev.ID) } else { m.unhealthyDevices[resourceName].Insert(dev.ID) - m.healthyDevices[resourceName].Delete(dev.ID) } } - for _, dev := range deleted { - m.healthyDevices[resourceName].Delete(dev.ID) - m.unhealthyDevices[resourceName].Delete(dev.ID) - } m.mutex.Unlock() m.writeCheckpoint() } @@ -175,7 +169,7 @@ func (m *ManagerImpl) removeContents(dir string) error { } stat, err := os.Stat(filePath) if err != nil { - glog.Errorf("Failed to stat file %v: %v", filePath, err) + glog.Errorf("Failed to stat file %s: %v", filePath, err) continue } if stat.IsDir() { @@ -199,7 +193,6 @@ func (m *ManagerImpl) checkpointFile() string { // starts device plugin registration service. func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady) error { glog.V(2).Infof("Starting Device Plugin manager") - fmt.Println("Starting Device Plugin manager") m.activePods = activePods m.sourcesReady = sourcesReady @@ -216,12 +209,12 @@ func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.Sourc // Removes all stale sockets in m.socketdir. Device plugins can monitor // this and use it as a signal to re-register with the new Kubelet. if err := m.removeContents(m.socketdir); err != nil { - glog.Errorf("Fail to clean up stale contents under %s: %+v", m.socketdir, err) + glog.Errorf("Fail to clean up stale contents under %s: %v", m.socketdir, err) } s, err := net.Listen("unix", socketPath) if err != nil { - glog.Errorf(errListenSocket+" %+v", err) + glog.Errorf(errListenSocket+" %v", err) return err } @@ -239,19 +232,82 @@ func (m *ManagerImpl) Start(activePods ActivePodsFunc, sourcesReady config.Sourc return nil } -// Devices is the map of devices that are known by the Device -// Plugin manager with the kind of the devices as key -func (m *ManagerImpl) Devices() map[string][]pluginapi.Device { +// GetWatcherHandler returns the plugin handler +func (m *ManagerImpl) GetWatcherHandler() watcher.PluginHandler { + if f, err := os.Create(m.socketdir + "DEPRECATION"); err != nil { + glog.Errorf("Failed to create deprecation file at %s", m.socketdir) + } else { + f.Close() + glog.V(4).Infof("created deprecation file %s", f.Name()) + } + + return watcher.PluginHandler(m) +} + +// ValidatePlugin validates a plugin if the version is correct and the name has the format of an extended resource +func (m *ManagerImpl) ValidatePlugin(pluginName string, endpoint string, versions []string) error { + glog.V(2).Infof("Got Plugin %s at endpoint %s with versions %v", pluginName, endpoint, versions) + + if !m.isVersionCompatibleWithPlugin(versions) { + return fmt.Errorf("manager version, %s, is not among plugin supported versions %v", pluginapi.Version, versions) + } + + if !v1helper.IsExtendedResourceName(v1.ResourceName(pluginName)) { + return fmt.Errorf("invalid name of device plugin socket: %s", fmt.Sprintf(errInvalidResourceName, pluginName)) + } + + return nil +} + +// RegisterPlugin starts the endpoint and registers it +// TODO: Start the endpoint and wait for the First ListAndWatch call +// before registering the plugin +func (m *ManagerImpl) RegisterPlugin(pluginName string, endpoint string) error { + glog.V(2).Infof("Registering Plugin %s at endpoint %s", pluginName, endpoint) + + e, err := newEndpointImpl(endpoint, pluginName, m.callback) + if err != nil { + return fmt.Errorf("Failed to dial device plugin with socketPath %s: %v", endpoint, err) + } + + options, err := e.client.GetDevicePluginOptions(context.Background(), &pluginapi.Empty{}) + if err != nil { + return fmt.Errorf("Failed to get device plugin options: %v", err) + } + + m.registerEndpoint(pluginName, options, e) + go m.runEndpoint(pluginName, e) + + return nil +} + +// DeRegisterPlugin deregisters the plugin +// TODO work on the behavior for deregistering plugins +// e.g: Should we delete the resource +func (m *ManagerImpl) DeRegisterPlugin(pluginName string) { m.mutex.Lock() defer m.mutex.Unlock() - devs := make(map[string][]pluginapi.Device) - for k, e := range m.endpoints { - glog.V(3).Infof("Endpoint: %+v: %p", k, e) - devs[k] = e.getDevices() + // Note: This will mark the resource unhealthy as per the behavior + // in runEndpoint + if eI, ok := m.endpoints[pluginName]; ok { + eI.e.stop() } +} - return devs +func (m *ManagerImpl) isVersionCompatibleWithPlugin(versions []string) bool { + // TODO(vikasc): Currently this is fine as we only have a single supported version. When we do need to support + // multiple versions in the future, we may need to extend this function to return a supported version. + // E.g., say kubelet supports v1beta1 and v1beta2, and we get v1alpha1 and v1beta1 from a device plugin, + // this function should return v1beta1 + for _, version := range versions { + for _, supportedVersion := range pluginapi.SupportedVersions { + if version == supportedVersion { + return true + } + } + } + return false } // Allocate is the call that you can use to allocate a set of devices @@ -259,7 +315,6 @@ func (m *ManagerImpl) Devices() map[string][]pluginapi.Device { func (m *ManagerImpl) Allocate(node *schedulercache.NodeInfo, attrs *lifecycle.PodAdmitAttributes) error { pod := attrs.Pod devicesToReuse := make(map[string]sets.String) - // TODO: Reuse devices between init containers and regular containers. for _, container := range pod.Spec.InitContainers { if err := m.allocateContainerResources(pod, &container, devicesToReuse); err != nil { return err @@ -298,13 +353,13 @@ func (m *ManagerImpl) Register(ctx context.Context, r *pluginapi.RegisterRequest } if !versionCompatible { errorString := fmt.Sprintf(errUnsupportedVersion, r.Version, pluginapi.SupportedVersions) - glog.Infof("Bad registration request from device plugin with resource name %q: %v", r.ResourceName, errorString) + glog.Infof("Bad registration request from device plugin with resource name %q: %s", r.ResourceName, errorString) return &pluginapi.Empty{}, fmt.Errorf(errorString) } if !v1helper.IsExtendedResourceName(v1.ResourceName(r.ResourceName)) { errorString := fmt.Sprintf(errInvalidResourceName, r.ResourceName) - glog.Infof("Bad registration request from device plugin: %v", errorString) + glog.Infof("Bad registration request from device plugin: %s", errorString) return &pluginapi.Empty{}, fmt.Errorf(errorString) } @@ -323,8 +378,8 @@ func (m *ManagerImpl) Register(ctx context.Context, r *pluginapi.RegisterRequest func (m *ManagerImpl) Stop() error { m.mutex.Lock() defer m.mutex.Unlock() - for _, e := range m.endpoints { - e.stop() + for _, eI := range m.endpoints { + eI.e.stop() } if m.server == nil { @@ -336,61 +391,37 @@ func (m *ManagerImpl) Stop() error { return nil } -func (m *ManagerImpl) addEndpoint(r *pluginapi.RegisterRequest) { - existingDevs := make(map[string]pluginapi.Device) +func (m *ManagerImpl) registerEndpoint(resourceName string, options *pluginapi.DevicePluginOptions, e endpoint) { m.mutex.Lock() - old, ok := m.endpoints[r.ResourceName] - if ok && old != nil { - // Pass devices of previous endpoint into re-registered one, - // to avoid potential orphaned devices upon re-registration - devices := make(map[string]pluginapi.Device) - for _, device := range old.getDevices() { - device.Health = pluginapi.Unhealthy - devices[device.ID] = device - } - existingDevs = devices + defer m.mutex.Unlock() + + m.endpoints[resourceName] = endpointInfo{e: e, opts: options} + glog.V(2).Infof("Registered endpoint %v", e) +} + +func (m *ManagerImpl) runEndpoint(resourceName string, e endpoint) { + e.run() + e.stop() + + m.mutex.Lock() + defer m.mutex.Unlock() + + if old, ok := m.endpoints[resourceName]; ok && old.e == e { + m.markResourceUnhealthy(resourceName) } - m.mutex.Unlock() - socketPath := filepath.Join(m.socketdir, r.Endpoint) - e, err := newEndpointImpl(socketPath, r.ResourceName, existingDevs, m.callback) + glog.V(2).Infof("Endpoint (%s, %v) became unhealthy", resourceName, e) +} + +func (m *ManagerImpl) addEndpoint(r *pluginapi.RegisterRequest) { + new, err := newEndpointImpl(filepath.Join(m.socketdir, r.Endpoint), r.ResourceName, m.callback) if err != nil { glog.Errorf("Failed to dial device plugin with request %v: %v", r, err) return } - m.mutex.Lock() - if r.Options != nil { - m.pluginOpts[r.ResourceName] = r.Options - } - // Check for potential re-registration during the initialization of new endpoint, - // and skip updating if re-registration happens. - // TODO: simplify the part once we have a better way to handle registered devices - ext := m.endpoints[r.ResourceName] - if ext != old { - glog.Warningf("Some other endpoint %v is added while endpoint %v is initialized", ext, e) - m.mutex.Unlock() - e.stop() - return - } - // Associates the newly created endpoint with the corresponding resource name. - // Stops existing endpoint if there is any. - m.endpoints[r.ResourceName] = e - glog.V(2).Infof("Registered endpoint %v", e) - m.mutex.Unlock() - - if old != nil { - old.stop() - } - + m.registerEndpoint(r.ResourceName, r.Options, new) go func() { - e.run() - e.stop() - m.mutex.Lock() - if old, ok := m.endpoints[r.ResourceName]; ok && old == e { - m.markResourceUnhealthy(r.ResourceName) - } - glog.V(2).Infof("Unregistered endpoint %v", e) - m.mutex.Unlock() + m.runEndpoint(r.ResourceName, new) }() } @@ -426,8 +457,8 @@ func (m *ManagerImpl) GetCapacity() (v1.ResourceList, v1.ResourceList, []string) deletedResources := sets.NewString() m.mutex.Lock() for resourceName, devices := range m.healthyDevices { - e, ok := m.endpoints[resourceName] - if (ok && e.stopGracePeriodExpired()) || !ok { + eI, ok := m.endpoints[resourceName] + if (ok && eI.e.stopGracePeriodExpired()) || !ok { // The resources contained in endpoints and (un)healthyDevices // should always be consistent. Otherwise, we run with the risk // of failing to garbage collect non-existing resources or devices. @@ -444,8 +475,8 @@ func (m *ManagerImpl) GetCapacity() (v1.ResourceList, v1.ResourceList, []string) } } for resourceName, devices := range m.unhealthyDevices { - e, ok := m.endpoints[resourceName] - if (ok && e.stopGracePeriodExpired()) || !ok { + eI, ok := m.endpoints[resourceName] + if (ok && eI.e.stopGracePeriodExpired()) || !ok { if !ok { glog.Errorf("unexpected: unhealthyDevices and endpoints are out of sync") } @@ -508,7 +539,7 @@ func (m *ManagerImpl) readCheckpoint() error { // will stay zero till the corresponding device plugin re-registers. m.healthyDevices[resource] = sets.NewString() m.unhealthyDevices[resource] = sets.NewString() - m.endpoints[resource] = newStoppedEndpointImpl(resource, make(map[string]pluginapi.Device)) + m.endpoints[resource] = endpointInfo{e: newStoppedEndpointImpl(resource), opts: nil} } return nil } @@ -551,17 +582,17 @@ func (m *ManagerImpl) devicesToAllocate(podUID, contName, resource string, requi // A pod's resource is not expected to change once admitted by the API server, // so just fail loudly here. We can revisit this part if this no longer holds. if needed != 0 { - return nil, fmt.Errorf("pod %v container %v changed request for resource %v from %v to %v", podUID, contName, resource, devices.Len(), required) + return nil, fmt.Errorf("pod %q container %q changed request for resource %q from %d to %d", podUID, contName, resource, devices.Len(), required) } } if needed == 0 { // No change, no work. return nil, nil } - glog.V(3).Infof("Needs to allocate %v %v for pod %q container %q", needed, resource, podUID, contName) + glog.V(3).Infof("Needs to allocate %d %q for pod %q container %q", needed, resource, podUID, contName) // Needs to allocate additional devices. if _, ok := m.healthyDevices[resource]; !ok { - return nil, fmt.Errorf("can't allocate unregistered device %v", resource) + return nil, fmt.Errorf("can't allocate unregistered device %s", resource) } devices = sets.NewString() // Allocates from reusableDevices list first. @@ -641,7 +672,7 @@ func (m *ManagerImpl) allocateContainerResources(pod *v1.Pod, container *v1.Cont // plugin Allocate grpc calls if it becomes common that a container may require // resources from multiple device plugins. m.mutex.Lock() - e, ok := m.endpoints[resource] + eI, ok := m.endpoints[resource] m.mutex.Unlock() if !ok { m.mutex.Lock() @@ -654,7 +685,7 @@ func (m *ManagerImpl) allocateContainerResources(pod *v1.Pod, container *v1.Cont // TODO: refactor this part of code to just append a ContainerAllocationRequest // in a passed in AllocateRequest pointer, and issues a single Allocate call per pod. glog.V(3).Infof("Making allocation request for devices %v for device plugin %s", devs, resource) - resp, err := e.allocate(devs) + resp, err := eI.e.allocate(devs) metrics.DevicePluginAllocationLatency.WithLabelValues(resource).Observe(metrics.SinceInMicroseconds(startRPCTime)) if err != nil { // In case of allocation failure, we want to restore m.allocatedDevices @@ -665,6 +696,10 @@ func (m *ManagerImpl) allocateContainerResources(pod *v1.Pod, container *v1.Cont return err } + if len(resp.ContainerResponses) == 0 { + return fmt.Errorf("No containers return in allocation response %v", resp) + } + // Update internal cached podDevices state. m.mutex.Lock() m.podDevices.insert(podUID, contName, resource, allocDevices, resp.ContainerResponses[0]) @@ -700,16 +735,15 @@ func (m *ManagerImpl) GetDeviceRunContainerOptions(pod *v1.Pod, container *v1.Co // with PreStartRequired option set. func (m *ManagerImpl) callPreStartContainerIfNeeded(podUID, contName, resource string) error { m.mutex.Lock() - opts, ok := m.pluginOpts[resource] + eI, ok := m.endpoints[resource] if !ok { m.mutex.Unlock() - glog.V(4).Infof("Plugin options not found in cache for resource: %s. Skip PreStartContainer", resource) - return nil + return fmt.Errorf("endpoint not found in cache for a registered resource: %s", resource) } - if !opts.PreStartRequired { + if eI.opts == nil || !eI.opts.PreStartRequired { m.mutex.Unlock() - glog.V(4).Infof("Plugin options indicate to skip PreStartContainer for resource, %v", resource) + glog.V(4).Infof("Plugin options indicate to skip PreStartContainer for resource: %s", resource) return nil } @@ -719,16 +753,10 @@ func (m *ManagerImpl) callPreStartContainerIfNeeded(podUID, contName, resource s return fmt.Errorf("no devices found allocated in local cache for pod %s, container %s, resource %s", podUID, contName, resource) } - e, ok := m.endpoints[resource] - if !ok { - m.mutex.Unlock() - return fmt.Errorf("endpoint not found in cache for a registered resource: %s", resource) - } - m.mutex.Unlock() devs := devices.UnsortedList() glog.V(4).Infof("Issuing an PreStartContainer call for container, %s, of pod %s", contName, podUID) - _, err := e.preStartContainer(devs) + _, err := eI.e.preStartContainer(devs) if err != nil { return fmt.Errorf("device plugin PreStartContainer rpc failed with err: %v", err) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go index b42c1b3e..1008daca 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager_stub.go @@ -18,9 +18,9 @@ package devicemanager import ( "k8s.io/api/core/v1" - pluginapi "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1" "k8s.io/kubernetes/pkg/kubelet/config" "k8s.io/kubernetes/pkg/kubelet/lifecycle" + "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" ) @@ -42,11 +42,6 @@ func (h *ManagerStub) Stop() error { return nil } -// Devices returns an empty map. -func (h *ManagerStub) Devices() map[string][]pluginapi.Device { - return make(map[string][]pluginapi.Device) -} - // Allocate simply returns nil. func (h *ManagerStub) Allocate(node *schedulercache.NodeInfo, attrs *lifecycle.PodAdmitAttributes) error { return nil @@ -61,3 +56,8 @@ func (h *ManagerStub) GetDeviceRunContainerOptions(pod *v1.Pod, container *v1.Co func (h *ManagerStub) GetCapacity() (v1.ResourceList, v1.ResourceList, []string) { return nil, nil, []string{} } + +// GetWatcherHandler returns plugin watcher interface +func (h *ManagerStub) GetWatcherHandler() pluginwatcher.PluginHandler { + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go index 4e34749b..35923b00 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/types.go @@ -20,10 +20,10 @@ import ( "time" "k8s.io/api/core/v1" - pluginapi "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1" "k8s.io/kubernetes/pkg/kubelet/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/lifecycle" + watcher "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" ) @@ -32,11 +32,6 @@ type Manager interface { // Start starts device plugin registration service. Start(activePods ActivePodsFunc, sourcesReady config.SourcesReady) error - // Devices is the map of devices that have registered themselves - // against the manager. - // The map key is the ResourceName of the device plugins. - Devices() map[string][]pluginapi.Device - // Allocate configures and assigns devices to pods. The pods are provided // through the pod admission attributes in the attrs argument. From the // requested device resources, Allocate will communicate with the owning @@ -58,6 +53,7 @@ type Manager interface { // GetCapacity returns the amount of available device plugin resource capacity, resource allocatable // and inactive device plugin resources previously registered on the node. GetCapacity() (v1.ResourceList, v1.ResourceList, []string) + GetWatcherHandler() watcher.PluginHandler } // DeviceRunContainerOptions contains the combined container runtime settings to consume its allocated devices. @@ -79,22 +75,14 @@ const ( errFailedToDialDevicePlugin = "failed to dial device plugin:" // errUnsupportedVersion is the error raised when the device plugin uses an API version not // supported by the Kubelet registry - errUnsupportedVersion = "requested API version %q is not supported by kubelet. Supported versions are %q" - // errDevicePluginAlreadyExists is the error raised when a device plugin with the - // same Resource Name tries to register itself - errDevicePluginAlreadyExists = "another device plugin already registered this Resource Name" + errUnsupportedVersion = "requested API version %q is not supported by kubelet. Supported version is %q" // errInvalidResourceName is the error raised when a device plugin is registering // itself with an invalid ResourceName errInvalidResourceName = "the ResourceName %q is invalid" - // errEmptyResourceName is the error raised when the resource name field is empty - errEmptyResourceName = "invalid Empty ResourceName" // errEndpointStopped indicates that the endpoint has been stopped errEndpointStopped = "endpoint %v has been stopped" - // errBadSocket is the error raised when the registry socket path is not absolute errBadSocket = "bad socketPath, must be an absolute path:" - // errRemoveSocket is the error raised when the registry could not remove the existing socket - errRemoveSocket = "failed to remove socket while starting device plugin registry, with error" // errListenSocket is the error raised when the registry could not listen on the socket errListenSocket = "failed to listen to socket while starting device plugin registry, with error" // errListAndWatch is the error raised when ListAndWatch ended unsuccessfully diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go index d04128ed..64b12854 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go @@ -27,9 +27,11 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/api/v1/resource" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" + kubefeatures "k8s.io/kubernetes/pkg/features" ) const ( @@ -44,28 +46,29 @@ const ( ) // MilliCPUToQuota converts milliCPU to CFS quota and period values. -func MilliCPUToQuota(milliCPU int64) (quota int64, period uint64) { +func MilliCPUToQuota(milliCPU int64, period int64) (quota int64) { // CFS quota is measured in two values: - // - cfs_period_us=100ms (the amount of time to measure usage across) + // - cfs_period_us=100ms (the amount of time to measure usage across given by period) // - cfs_quota=20ms (the amount of cpu time allowed to be used across a period) // so in the above example, you are limited to 20% of a single CPU // for multi-cpu environments, you just scale equivalent amounts + // see https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt for details if milliCPU == 0 { return } - // we set the period to 100ms by default - period = QuotaPeriod + if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CPUCFSQuotaPeriod) { + period = QuotaPeriod + } // we then convert your milliCPU to a value normalized over a period - quota = (milliCPU * QuotaPeriod) / MilliCPUToCPU + quota = (milliCPU * period) / MilliCPUToCPU // quota needs to be a minimum of 1ms. if quota < MinQuotaPeriod { quota = MinQuotaPeriod } - return } @@ -103,7 +106,7 @@ func HugePageLimits(resourceList v1.ResourceList) map[int64]int64 { } // ResourceConfigForPod takes the input pod and outputs the cgroup resource config. -func ResourceConfigForPod(pod *v1.Pod, enforceCPULimits bool) *ResourceConfig { +func ResourceConfigForPod(pod *v1.Pod, enforceCPULimits bool, cpuPeriod uint64) *ResourceConfig { // sum requests and limits. reqs, limits := resource.PodRequestsAndLimits(pod) @@ -122,7 +125,7 @@ func ResourceConfigForPod(pod *v1.Pod, enforceCPULimits bool) *ResourceConfig { // convert to CFS values cpuShares := MilliCPUToShares(cpuRequests) - cpuQuota, cpuPeriod := MilliCPUToQuota(cpuLimits) + cpuQuota := MilliCPUToQuota(cpuLimits, int64(cpuPeriod)) // track if limits were applied for each resource. memoryLimitsDeclared := true diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_unsupported.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_unsupported.go index ee3ed91d..82ee3b69 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_unsupported.go @@ -28,13 +28,12 @@ const ( SharesPerCPU = 0 MilliCPUToCPU = 0 - QuotaPeriod = 0 MinQuotaPeriod = 0 ) -// MilliCPUToQuota converts milliCPU to CFS quota and period values. -func MilliCPUToQuota(milliCPU int64) (int64, int64) { - return 0, 0 +// MilliCPUToQuota converts milliCPU and period to CFS quota values. +func MilliCPUToQuota(milliCPU, period int64) int64 { + return 0 } // MilliCPUToShares converts the milliCPU to CFS shares. @@ -43,7 +42,7 @@ func MilliCPUToShares(milliCPU int64) int64 { } // ResourceConfigForPod takes the input pod and outputs the cgroup resource config. -func ResourceConfigForPod(pod *v1.Pod, enforceCPULimit bool) *ResourceConfig { +func ResourceConfigForPod(pod *v1.Pod, enforceCPULimit bool, cpuPeriod uint64) *ResourceConfig { return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager.go index 6c1e022c..1267b3f7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/node_container_manager.go @@ -131,6 +131,9 @@ func enforceExistingCgroup(cgroupManager CgroupManager, cName CgroupName, rl v1. Name: cName, ResourceParameters: getCgroupConfig(rl), } + if cgroupConfig.ResourceParameters == nil { + return fmt.Errorf("%q cgroup is not config properly", cgroupConfig.Name) + } glog.V(4).Infof("Enforcing limits on cgroup %q with %d cpu shares and %d bytes of memory", cName, cgroupConfig.ResourceParameters.CpuShares, cgroupConfig.ResourceParameters.Memory) if !cgroupManager.Exists(cgroupConfig.Name) { return fmt.Errorf("%q cgroup does not exist", cgroupConfig.Name) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go index abe5b739..d0c3a829 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/pod_container_manager_linux.go @@ -51,6 +51,9 @@ type podContainerManagerImpl struct { podPidsLimit int64 // enforceCPULimits controls whether cfs quota is enforced or not enforceCPULimits bool + // cpuCFSQuotaPeriod is the cfs period value, cfs_period_us, setting per + // node for all containers in usec + cpuCFSQuotaPeriod uint64 } // Make sure that podContainerManagerImpl implements the PodContainerManager interface @@ -81,7 +84,7 @@ func (m *podContainerManagerImpl) EnsureExists(pod *v1.Pod) error { // Create the pod container containerConfig := &CgroupConfig{ Name: podContainerName, - ResourceParameters: ResourceConfigForPod(pod, m.enforceCPULimits), + ResourceParameters: ResourceConfigForPod(pod, m.enforceCPULimits, m.cpuCFSQuotaPeriod), } if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.SupportPodPidsLimit) && m.podPidsLimit > 0 { containerConfig.ResourceParameters.PodPidsLimit = &m.podPidsLimit @@ -299,7 +302,7 @@ func (m *podContainerManagerNoop) EnsureExists(_ *v1.Pod) error { } func (m *podContainerManagerNoop) GetPodContainerName(_ *v1.Pod) (CgroupName, string) { - return m.cgroupRoot, m.cgroupRoot.ToCgroupfs() + return m.cgroupRoot, "" } func (m *podContainerManagerNoop) GetPodContainerNameForDriver(_ *v1.Pod) string { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD index e344dc6e..3332cdc4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/util/BUILD @@ -7,42 +7,10 @@ load( go_library( name = "go_default_library", - srcs = select({ - "@io_bazel_rules_go//go/platform:android": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "cgroups_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "cgroups_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "cgroups_unsupported.go", - ], - "//conditions:default": [], - }), + srcs = [ + "cgroups_linux.go", + "cgroups_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/kubelet/cm/util", deps = select({ "@io_bazel_rules_go//go/platform:linux": [ diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD index 6985adfd..82cb3a86 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/BUILD @@ -9,45 +9,12 @@ go_library( "defaults.go", "doc.go", "file.go", + "file_linux.go", + "file_unsupported.go", "flags.go", "http.go", "sources.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "file_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "file_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "file_unsupported.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/kubelet/config", visibility = ["//visibility:public"], deps = [ @@ -65,23 +32,23 @@ go_library( "//pkg/kubelet/util/format:go_default_library", "//pkg/util/config:go_default_library", "//pkg/util/hash:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/yaml:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/golang.org/x/exp/inotify:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ], "//conditions:default": [], }), @@ -93,14 +60,10 @@ go_test( "apiserver_test.go", "common_test.go", "config_test.go", + "file_linux_test.go", "file_test.go", "http_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "file_linux_test.go", - ], - "//conditions:default": [], - }), + ], embed = [":go_default_library"], deps = [ "//pkg/api/legacyscheme:go_default_library", @@ -112,20 +75,20 @@ go_test( "//pkg/kubelet/checkpointmanager:go_default_library", "//pkg/kubelet/types:go_default_library", "//pkg/securitycontext:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/util/testing:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go index 7fbf5334..683dc9a3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/file.go @@ -93,6 +93,10 @@ func (s *sourceFile) run() { listTicker := time.NewTicker(s.period) go func() { + // Read path immediately to speed up startup. + if err := s.listConfig(); err != nil { + glog.Errorf("Unable to read config path %q: %v", s.path, err) + } for { select { case <-listTicker.C: @@ -179,7 +183,9 @@ func (s *sourceFile) extractFromDir(name string) ([]*v1.Pod, error) { case statInfo.Mode().IsRegular(): pod, err := s.extractFromFile(path) if err != nil { - glog.Errorf("Can't process manifest file %q: %v", path, err) + if !os.IsNotExist(err) { + glog.Errorf("Can't process manifest file %q: %v", path, err) + } } else { pods = append(pods, pod) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go b/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go index 77105807..4b5494e7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/config/flags.go @@ -48,11 +48,6 @@ type ContainerRuntimeOptions struct { DockershimRootDirectory string // Enable dockershim only mode. ExperimentalDockershim bool - // This flag, if set, disables use of a shared PID namespace for pods running in the docker CRI runtime. - // A shared PID namespace is the only option in non-docker runtimes and is required by the CRI. The ability to - // disable it for docker will be removed unless a compelling use case is discovered with widespread use. - // TODO: Remove once we no longer support disabling shared PID namespace (https://issues.k8s.io/41938) - DockerDisableSharedPID bool // PodSandboxImage is the image whose network/ipc namespaces // containers in each pod will use. PodSandboxImage string @@ -93,15 +88,13 @@ func (s *ContainerRuntimeOptions) AddFlags(fs *pflag.FlagSet) { fs.MarkHidden("experimental-dockershim") fs.StringVar(&s.DockershimRootDirectory, "experimental-dockershim-root-directory", s.DockershimRootDirectory, "Path to the dockershim root directory.") fs.MarkHidden("experimental-dockershim-root-directory") - fs.BoolVar(&s.DockerDisableSharedPID, "docker-disable-shared-pid", s.DockerDisableSharedPID, fmt.Sprintf("Setting this to false causes Kubernetes to create pods using a shared process namespace for containers in a pod when running with Docker 1.13.1 or higher. A future Kubernetes release will make this configurable instead in the API. %s", dockerOnlyWarning)) - fs.MarkDeprecated("docker-disable-shared-pid", "will be removed in a future release. This option will be replaced by PID namespace sharing that is configurable per-pod using the API. See https://features.k8s.io/495") fs.StringVar(&s.PodSandboxImage, "pod-infra-container-image", s.PodSandboxImage, fmt.Sprintf("The image whose network/ipc namespaces containers in each pod will use. %s", dockerOnlyWarning)) - fs.StringVar(&s.DockerEndpoint, "docker-endpoint", s.DockerEndpoint, fmt.Sprintf("Use this for the docker endpoint to communicate with %s", dockerOnlyWarning)) + fs.StringVar(&s.DockerEndpoint, "docker-endpoint", s.DockerEndpoint, fmt.Sprintf("Use this for the docker endpoint to communicate with. %s", dockerOnlyWarning)) fs.DurationVar(&s.ImagePullProgressDeadline.Duration, "image-pull-progress-deadline", s.ImagePullProgressDeadline.Duration, fmt.Sprintf("If no pulling progress is made before this deadline, the image pulling will be cancelled. %s", dockerOnlyWarning)) // Network plugin settings for Docker. fs.StringVar(&s.NetworkPluginName, "network-plugin", s.NetworkPluginName, fmt.Sprintf(" The name of the network plugin to be invoked for various events in kubelet/pod lifecycle. %s", dockerOnlyWarning)) - fs.StringVar(&s.CNIConfDir, "cni-conf-dir", s.CNIConfDir, fmt.Sprintf(" The full path of the directory in which to search for CNI config files. Default: /etc/cni/net.d. %s", dockerOnlyWarning)) - fs.StringVar(&s.CNIBinDir, "cni-bin-dir", s.CNIBinDir, fmt.Sprintf(" A comma-separated list of full paths of directories in which to search for CNI plugin binaries. Default: /opt/cni/bin. %s", dockerOnlyWarning)) + fs.StringVar(&s.CNIConfDir, "cni-conf-dir", s.CNIConfDir, fmt.Sprintf(" The full path of the directory in which to search for CNI config files. %s", dockerOnlyWarning)) + fs.StringVar(&s.CNIBinDir, "cni-bin-dir", s.CNIBinDir, fmt.Sprintf(" A comma-separated list of full paths of directories in which to search for CNI plugin binaries. %s", dockerOnlyWarning)) fs.Int32Var(&s.NetworkPluginMTU, "network-plugin-mtu", s.NetworkPluginMTU, fmt.Sprintf(" The MTU to be passed to the network plugin, to override the default. Set to 0 to use the default 1460 MTU. %s", dockerOnlyWarning)) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD index 84d1e029..fcba1122 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/BUILD @@ -15,13 +15,15 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/configmap", deps = [ "//pkg/api/v1/pod:go_default_library", + "//pkg/apis/core/v1:go_default_library", "//pkg/kubelet/util/manager:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", ], ) @@ -44,11 +46,11 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubelet/util/manager:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go index 91c75ddc..76aa1f03 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/configmap/configmap_manager.go @@ -23,12 +23,14 @@ import ( "k8s.io/api/core/v1" clientset "k8s.io/client-go/kubernetes" podutil "k8s.io/kubernetes/pkg/api/v1/pod" + corev1 "k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/kubernetes/pkg/kubelet/util/manager" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/clock" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/watch" ) type Manager interface { @@ -123,3 +125,25 @@ func NewCachingConfigMapManager(kubeClient clientset.Interface, getTTL manager.G manager: manager.NewCacheBasedManager(configMapStore, getConfigMapNames), } } + +// NewWatchingConfigMapManager creates a manager that keeps a cache of all configmaps +// necessary for registered pods. +// It implements the following logic: +// - whenever a pod is created or updated, we start inidvidual watches for all +// referenced objects that aren't referenced from other registered pods +// - every GetObject() returns a value from local cache propagated via watches +func NewWatchingConfigMapManager(kubeClient clientset.Interface) Manager { + listConfigMap := func(namespace string, opts metav1.ListOptions) (runtime.Object, error) { + return kubeClient.CoreV1().ConfigMaps(namespace).List(opts) + } + watchConfigMap := func(namespace string, opts metav1.ListOptions) (watch.Interface, error) { + return kubeClient.CoreV1().ConfigMaps(namespace).Watch(opts) + } + newConfigMap := func() runtime.Object { + return &v1.ConfigMap{} + } + gr := corev1.Resource("configmap") + return &configMapManager{ + manager: manager.NewWatchBasedManager(listConfigMap, watchConfigMap, newConfigMap, gr, getConfigMapNames), + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD index 287cd501..d7b26708 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/container/BUILD @@ -23,18 +23,18 @@ go_library( "//pkg/kubelet/util/format:go_default_library", "//pkg/util/hash:go_default_library", "//pkg/volume:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", + "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//third_party/forked/golang/expansion:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", - "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ], ) @@ -44,24 +44,17 @@ go_test( "cache_test.go", "helpers_test.go", "ref_test.go", + "runtime_cache_test.go", "sync_result_test.go", ], embed = [":go_default_library"], deps = [ "//pkg/apis/core/install:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["runtime_cache_test.go"], - deps = [ - ":go_default_library", "//pkg/kubelet/container/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go b/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go index 70b72024..4859342a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/container/runtime.go @@ -17,6 +17,7 @@ limitations under the License. package container import ( + "context" "fmt" "io" "net/url" @@ -113,7 +114,7 @@ type Runtime interface { // default, it returns a snapshot of the container log. Set 'follow' to true to // stream the log. Set 'follow' to false and specify the number of lines (e.g. // "100" or "all") to tail the log. - GetContainerLogs(pod *v1.Pod, containerID ContainerID, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) (err error) + GetContainerLogs(ctx context.Context, pod *v1.Pod, containerID ContainerID, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) (err error) // Delete a container. If the container is still running, an error is returned. DeleteContainer(containerID ContainerID) error // ImageService provides methods to image-related methods. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/doc.go deleted file mode 100644 index ce5bb18b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 kubelet is the package that contains the libraries that drive the Kubelet binary. -// The kubelet is responsible for node level pod management. It runs on each worker in the cluster. -package kubelet // import "k8s.io/kubernetes/pkg/kubelet" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD index 286b902d..d835f257 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/BUILD @@ -8,91 +8,32 @@ go_library( "docker_checkpoint.go", "docker_container.go", "docker_image.go", + "docker_image_linux.go", + "docker_image_unsupported.go", + "docker_image_windows.go", "docker_legacy_service.go", "docker_logs.go", "docker_sandbox.go", "docker_service.go", + "docker_stats_linux.go", + "docker_stats_unsupported.go", + "docker_stats_windows.go", "docker_streaming.go", "exec.go", "helpers.go", + "helpers_linux.go", + "helpers_unsupported.go", + "helpers_windows.go", "naming.go", "security_context.go", "selinux_util.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "docker_image_linux.go", - "docker_sandbox_others.go", - "docker_stats_linux.go", - "helpers_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "docker_image_unsupported.go", - "docker_sandbox_others.go", - "docker_stats_unsupported.go", - "helpers_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "docker_image_windows.go", - "docker_sandbox_windows.go", - "docker_stats_windows.go", - "helpers_windows.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim", visibility = ["//visibility:public"], deps = [ "//pkg/credentialprovider:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/apis/kubeletconfig:go_default_library", "//pkg/kubelet/checkpointmanager:go_default_library", "//pkg/kubelet/checkpointmanager/checksum:go_default_library", "//pkg/kubelet/checkpointmanager/errors:go_default_library", @@ -113,6 +54,11 @@ go_library( "//pkg/kubelet/util/ioutils:go_default_library", "//pkg/security/apparmor:go_default_library", "//pkg/util/parsers:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", "//vendor/github.com/armon/circbuf:go_default_library", "//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/docker/docker/api/types:go_default_library", @@ -122,11 +68,6 @@ go_library( "//vendor/github.com/docker/docker/pkg/jsonmessage:go_default_library", "//vendor/github.com/docker/go-connections/nat:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:windows": [ @@ -146,16 +87,12 @@ go_test( "docker_image_test.go", "docker_sandbox_test.go", "docker_service_test.go", + "helpers_linux_test.go", "helpers_test.go", "naming_test.go", "security_context_test.go", "selinux_util_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "helpers_linux_test.go", - ], - "//conditions:default": [], - }), + ], embed = [":go_default_library"], deps = [ "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", @@ -168,6 +105,7 @@ go_test( "//pkg/kubelet/types:go_default_library", "//pkg/kubelet/util/cache:go_default_library", "//pkg/security/apparmor:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", "//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/docker/docker/api/types:go_default_library", "//vendor/github.com/docker/docker/api/types/container:go_default_library", @@ -176,10 +114,9 @@ go_test( "//vendor/github.com/golang/mock/gomock:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD index 871d6f9b..5ca2b2af 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/cm/BUILD @@ -9,42 +9,10 @@ go_library( name = "go_default_library", srcs = [ "container_manager.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "container_manager_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "container_manager_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "container_manager_windows.go", - ], - "//conditions:default": [], - }), + "container_manager_linux.go", + "container_manager_unsupported.go", + "container_manager_windows.go", + ], importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/cm", deps = select({ "@io_bazel_rules_go//go/platform:android": [ @@ -64,10 +32,10 @@ go_library( "//pkg/kubelet/dockershim/libdocker:go_default_library", "//pkg/kubelet/qos:go_default_library", "//pkg/util/version:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs:go_default_library", "//vendor/github.com/opencontainers/runc/libcontainer/configs:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], "@io_bazel_rules_go//go/platform:nacl": [ "//pkg/kubelet/dockershim/libdocker:go_default_library", diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_checkpoint.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_checkpoint.go index 8bfa1a77..e44f0bd6 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_checkpoint.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_checkpoint.go @@ -28,6 +28,7 @@ const ( sandboxCheckpointDir = "sandbox" protocolTCP = Protocol("tcp") protocolUDP = Protocol("udp") + protocolSCTP = Protocol("sctp") schemaVersion = "v1" ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go index 38fe998b..8fd6d2c8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_image_windows.go @@ -45,9 +45,8 @@ func (ds *dockerService) ImageFsInfo(_ context.Context, _ *runtimeapi.ImageFsInf filesystems := []*runtimeapi.FilesystemUsage{ { - Timestamp: time.Now().UnixNano(), - UsedBytes: &runtimeapi.UInt64Value{Value: fsinfo.Usage}, - InodesUsed: &runtimeapi.UInt64Value{Value: 0}, + Timestamp: time.Now().UnixNano(), + UsedBytes: &runtimeapi.UInt64Value{Value: fsinfo.Usage}, FsId: &runtimeapi.FilesystemIdentifier{ Mountpoint: info.DockerRootDir, }, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go index df756a5f..78616c21 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_legacy_service.go @@ -17,6 +17,7 @@ limitations under the License. package dockershim import ( + "context" "fmt" "io" "strconv" @@ -39,7 +40,7 @@ import ( // more functions. type DockerLegacyService interface { // GetContainerLogs gets logs for a specific container. - GetContainerLogs(*v1.Pod, kubecontainer.ContainerID, *v1.PodLogOptions, io.Writer, io.Writer) error + GetContainerLogs(context.Context, *v1.Pod, kubecontainer.ContainerID, *v1.PodLogOptions, io.Writer, io.Writer) error // IsCRISupportedLogDriver checks whether the logging driver used by docker is // supported by native CRI integration. @@ -50,7 +51,7 @@ type DockerLegacyService interface { } // GetContainerLogs get container logs directly from docker daemon. -func (d *dockerService) GetContainerLogs(pod *v1.Pod, containerID kubecontainer.ContainerID, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) error { +func (d *dockerService) GetContainerLogs(_ context.Context, pod *v1.Pod, containerID kubecontainer.ContainerID, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) error { container, err := d.client.InspectContainer(containerID.ID) if err != nil { return err @@ -97,7 +98,7 @@ func (d *dockerService) GetContainerLogTail(uid kubetypes.UID, name, namespace s Namespace: namespace, }, } - err := d.GetContainerLogs(pod, containerId, &v1.PodLogOptions{TailLines: &value}, buf, buf) + err := d.GetContainerLogs(context.Background(), pod, containerId, &v1.PodLogOptions{TailLines: &value}, buf, buf) if err != nil { return "", err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go index c0a9ecfa..b114bf05 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go @@ -96,6 +96,9 @@ func (ds *dockerService) RunPodSandbox(ctx context.Context, r *runtimeapi.RunPod } // Step 2: Create the sandbox container. + if r.GetRuntimeHandler() != "" { + return nil, fmt.Errorf("RuntimeHandler %q not supported", r.GetRuntimeHandler()) + } createConfig, err := ds.makeSandboxDockerConfig(config, image) if err != nil { return nil, fmt.Errorf("failed to make sandbox docker config for pod %q: %v", config.Metadata.Name, err) @@ -538,6 +541,21 @@ func (ds *dockerService) ListPodSandbox(_ context.Context, r *runtimeapi.ListPod return &runtimeapi.ListPodSandboxResponse{Items: result}, nil } +// applySandboxLinuxOptions applies LinuxPodSandboxConfig to dockercontainer.HostConfig and dockercontainer.ContainerCreateConfig. +func (ds *dockerService) applySandboxLinuxOptions(hc *dockercontainer.HostConfig, lc *runtimeapi.LinuxPodSandboxConfig, createConfig *dockertypes.ContainerCreateConfig, image string, separator rune) error { + if lc == nil { + return nil + } + // Apply security context. + if err := applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator); err != nil { + return err + } + + // Set sysctls. + hc.Sysctls = lc.Sysctls + return nil +} + func (ds *dockerService) applySandboxResources(hc *dockercontainer.HostConfig, lc *runtimeapi.LinuxPodSandboxConfig) error { hc.Resources = dockercontainer.Resources{ MemorySwap: DefaultMemorySwap(), @@ -578,8 +596,8 @@ func (ds *dockerService) makeSandboxDockerConfig(c *runtimeapi.PodSandboxConfig, HostConfig: hc, } - // Apply platform-specific options. - if err := ds.applySandboxPlatformOptions(hc, c, createConfig, image, securityOptSeparator); err != nil { + // Apply linux-specific options. + if err := ds.applySandboxLinuxOptions(hc, c.GetLinux(), createConfig, image, securityOptSeparator); err != nil { return nil, err } @@ -657,6 +675,8 @@ func toCheckpointProtocol(protocol runtimeapi.Protocol) Protocol { return protocolTCP case runtimeapi.Protocol_UDP: return protocolUDP + case runtimeapi.Protocol_SCTP: + return protocolSCTP } glog.Warningf("Unknown protocol %q: defaulting to TCP", protocol) return protocolTCP diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_others.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_others.go deleted file mode 100644 index 108f31ce..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_others.go +++ /dev/null @@ -1,42 +0,0 @@ -// +build !windows - -/* -Copyright 2018 The Kubernetes Authors. - -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 dockershim - -import ( - dockertypes "github.com/docker/docker/api/types" - dockercontainer "github.com/docker/docker/api/types/container" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" -) - -// applySandboxPlatformOptions applies platform specific options to dockercontainer.HostConfig and dockercontainer.ContainerCreateConfig. -func (ds *dockerService) applySandboxPlatformOptions(hc *dockercontainer.HostConfig, config *runtimeapi.PodSandboxConfig, createConfig *dockertypes.ContainerCreateConfig, image string, separator rune) error { - lc := config.GetLinux() - if lc == nil { - return nil - } - - // Apply security context. - if err := applySandboxSecurityContext(lc, createConfig.Config, hc, ds.network, separator); err != nil { - return err - } - - // Set sysctls. - hc.Sysctls = lc.Sysctls - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_windows.go deleted file mode 100644 index d899e126..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox_windows.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build windows - -/* -Copyright 2018 The Kubernetes Authors. - -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 dockershim - -import ( - dockertypes "github.com/docker/docker/api/types" - dockercontainer "github.com/docker/docker/api/types/container" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" -) - -// applySandboxPlatformOptions applies platform specific options to dockercontainer.HostConfig and dockercontainer.ContainerCreateConfig. -func (ds *dockerService) applySandboxPlatformOptions(hc *dockercontainer.HostConfig, config *runtimeapi.PodSandboxConfig, createConfig *dockertypes.ContainerCreateConfig, image string, separator rune) error { - dnsConfig := config.GetDnsConfig() - if dnsConfig == nil { - return nil - } - - // Setup DNS. - hc.DNS = dnsConfig.GetServers() - hc.DNSSearch = dnsConfig.GetSearches() - hc.DNSOptions = dnsConfig.GetOptions() - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go index 8201ab94..ae1f70f5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go @@ -30,8 +30,8 @@ import ( "github.com/golang/glog" "k8s.io/api/core/v1" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" @@ -187,9 +187,8 @@ func NewDockerClientFromConfig(config *ClientConfig) libdocker.Interface { } // NOTE: Anything passed to DockerService should be eventually handled in another way when we switch to running the shim as a different process. -func NewDockerService(config *ClientConfig, podSandboxImage string, streamingConfig *streaming.Config, - pluginSettings *NetworkPluginSettings, cgroupsName string, kubeCgroupDriver string, dockershimRootDir string, - disableSharedPID, startLocalStreamingServer bool) (DockerService, error) { +func NewDockerService(config *ClientConfig, podSandboxImage string, streamingConfig *streaming.Config, pluginSettings *NetworkPluginSettings, + cgroupsName string, kubeCgroupDriver string, dockershimRootDir string, startLocalStreamingServer bool) (DockerService, error) { client := NewDockerClientFromConfig(config) @@ -210,7 +209,6 @@ func NewDockerService(config *ClientConfig, podSandboxImage string, streamingCon }, containerManager: cm.NewContainerManager(cgroupsName, client), checkpointManager: checkpointManager, - disableSharedPID: disableSharedPID, startLocalStreamingServer: startLocalStreamingServer, networkReady: make(map[string]bool), } @@ -304,11 +302,6 @@ type dockerService struct { // version checking for some operations. Use this cache to avoid querying // the docker daemon every time we need to do such checks. versionCache *cache.ObjectCache - // This option provides an escape hatch to override the new default behavior for Docker under - // the CRI to use a shared PID namespace for all pods. It is temporary and will be removed. - // See proposals/pod-pid-namespace.md for details. - // TODO: Remove once the escape hatch is no longer used (https://issues.k8s.io/41938) - disableSharedPID bool // startLocalStreamingServer indicates whether dockershim should start a // streaming server on localhost. startLocalStreamingServer bool @@ -522,6 +515,8 @@ func toAPIProtocol(protocol Protocol) v1.Protocol { return v1.ProtocolTCP case protocolUDP: return v1.ProtocolUDP + case protocolSCTP: + return v1.ProtocolSCTP } glog.Warningf("Unknown protocol %q: defaulting to TCP", protocol) return v1.ProtocolTCP diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go index 3caa2441..05d23c75 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go @@ -172,6 +172,8 @@ func makePortsAndBindings(pm []*runtimeapi.PortMapping) (dockernat.PortSet, map[ protocol = "/udp" case runtimeapi.Protocol_TCP: protocol = "/tcp" + case runtimeapi.Protocol_SCTP: + protocol = "/sctp" default: glog.Warningf("Unknown protocol %q: defaulting to TCP", port.Protocol) protocol = "/tcp" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go index 5d231ea8..a93403ac 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go @@ -120,7 +120,7 @@ func (ds *dockerService) updateCreateConfig( if err := applyContainerSecurityContext(lc, podSandboxID, createConfig.Config, createConfig.HostConfig, securityOptSep); err != nil { return fmt.Errorf("failed to apply container security context for container %q: %v", config.Metadata.Name, err) } - modifyContainerPIDNamespaceOverrides(ds.disableSharedPID, apiVersion, createConfig.HostConfig, podSandboxID) + modifyContainerPIDNamespaceOverrides(apiVersion, createConfig.HostConfig, podSandboxID) } // Apply cgroupsParent derived from the sandbox config. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD index 73b1d79f..25c1a0e2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/BUILD @@ -31,6 +31,8 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker", deps = [ "//pkg/kubelet/dockershim/metrics:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", "//vendor/github.com/docker/distribution/reference:go_default_library", "//vendor/github.com/docker/docker/api/types:go_default_library", "//vendor/github.com/docker/docker/api/types/container:go_default_library", @@ -40,8 +42,6 @@ go_library( "//vendor/github.com/docker/docker/pkg/stdcopy:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/opencontainers/go-digest:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go index 02ef40bc..13a1eab5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker/kube_docker_client.go @@ -205,7 +205,7 @@ func (d *kubeDockerClient) inspectImageRaw(ref string) (*dockertypes.ImageInspec return nil, ctxErr } if err != nil { - if dockerapi.IsErrImageNotFound(err) { + if dockerapi.IsErrNotFound(err) { err = ImageNotFoundError{ID: ref} } return nil, err @@ -469,7 +469,7 @@ func (d *kubeDockerClient) StartExec(startExec string, opts dockertypes.ExecStar } return err } - resp, err := d.client.ContainerExecAttach(ctx, startExec, dockertypes.ExecConfig{ + resp, err := d.client.ContainerExecAttach(ctx, startExec, dockertypes.ExecStartCheck{ Detach: opts.Detach, Tty: opts.Tty, }) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD index b1760d09..13ab4c3d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/BUILD @@ -9,16 +9,16 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network", visibility = ["//visibility:public"], deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network/hostport:go_default_library", "//pkg/kubelet/dockershim/network/metrics:go_default_library", "//pkg/util/sysctl:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD index 7fd7e2d1..9396ba84 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/BUILD @@ -10,47 +10,15 @@ go_library( name = "go_default_library", srcs = [ "cni.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "cni_others.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "cni_windows.go", - ], - "//conditions:default": [], - }), + "cni_others.go", + "cni_windows.go", + ], importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni", deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", + "//pkg/util/bandwidth:go_default_library", "//vendor/github.com/containernetworking/cni/libcni:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", "//vendor/github.com/golang/glog:go_default_library", @@ -65,27 +33,22 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "cni_test.go", - ], - "//conditions:default": [], - }), + srcs = ["cni_test.go"], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/container/testing:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", "//pkg/kubelet/dockershim/network/cni/testing:go_default_library", "//pkg/kubelet/dockershim/network/hostport:go_default_library", "//pkg/kubelet/dockershim/network/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/util/testing:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", ], diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go index 776f3eed..e0bbf97c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni.go @@ -26,16 +26,15 @@ import ( "github.com/containernetworking/cni/libcni" cnitypes "github.com/containernetworking/cni/pkg/types" "github.com/golang/glog" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/dockershim/network" + "k8s.io/kubernetes/pkg/util/bandwidth" utilexec "k8s.io/utils/exec" ) const ( - CNIPluginName = "cni" - DefaultConfDir = "/etc/cni/net.d" - DefaultBinDir = "/opt/cni/bin" + CNIPluginName = "cni" ) type cniNetworkPlugin struct { @@ -51,6 +50,7 @@ type cniNetworkPlugin struct { nsenterPath string confDir string binDirs []string + podCidr string } type cniNetwork struct { @@ -68,6 +68,27 @@ type cniPortMapping struct { HostIP string `json:"hostIP"` } +// cniBandwidthEntry maps to the standard CNI bandwidth Capability +// see: https://github.com/containernetworking/cni/blob/master/CONVENTIONS.md and +// https://github.com/containernetworking/plugins/blob/master/plugins/meta/bandwidth/README.md +type cniBandwidthEntry struct { + // IngressRate is the bandwidth rate in bits per second for traffic through container. 0 for no limit. If ingressRate is set, ingressBurst must also be set + IngressRate int `json:"ingressRate,omitempty"` + // IngressBurst is the bandwidth burst in bits for traffic through container. 0 for no limit. If ingressBurst is set, ingressRate must also be set + // NOTE: it's not used for now and default to 0. + IngressBurst int `json:"ingressBurst,omitempty"` + // EgressRate is the bandwidth is the bandwidth rate in bits per second for traffic through container. 0 for no limit. If egressRate is set, egressBurst must also be set + EgressRate int `json:"egressRate,omitempty"` + // EgressBurst is the bandwidth burst in bits for traffic through container. 0 for no limit. If egressBurst is set, egressRate must also be set + // NOTE: it's not used for now and default to 0. + EgressBurst int `json:"egressBurst,omitempty"` +} + +// cniIpRange maps to the standard CNI ip range Capability +type cniIpRange struct { + Subnet string `json:"subnet"` +} + func SplitDirs(dirs string) []string { // Use comma rather than colon to work better with Windows too return strings.Split(dirs, ",") @@ -81,13 +102,6 @@ func ProbeNetworkPlugins(confDir string, binDirs []string) []network.NetworkPlug binDirs = append(binDirs, dir) } } - if len(binDirs) == 0 { - binDirs = []string{DefaultBinDir} - } - - if confDir == "" { - confDir = DefaultConfDir - } plugin := &cniNetworkPlugin{ defaultNetwork: nil, @@ -144,6 +158,8 @@ func getDefaultCNINetwork(confDir string, binDirs []string) (*cniNetwork, error) continue } + glog.V(4).Infof("Using CNI configuration file %s", confFile) + network := &cniNetwork{ name: confList.Name, NetworkConfig: confList, @@ -191,9 +207,43 @@ func (plugin *cniNetworkPlugin) checkInitialized() error { if plugin.getDefaultNetwork() == nil { return errors.New("cni config uninitialized") } + + // If the CNI configuration has the ipRanges capability, we need a PodCIDR assigned + for _, p := range plugin.getDefaultNetwork().NetworkConfig.Plugins { + if p.Network.Capabilities["ipRanges"] { + if plugin.podCidr == "" { + return errors.New("no PodCIDR set") + } + break + } + } return nil } +// Event handles any change events. The only event ever sent is the PodCIDR change. +// No network plugins support changing an already-set PodCIDR +func (plugin *cniNetworkPlugin) Event(name string, details map[string]interface{}) { + if name != network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE { + return + } + + plugin.Lock() + defer plugin.Unlock() + + podCIDR, ok := details[network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE_DETAIL_CIDR].(string) + if !ok { + glog.Warningf("%s event didn't contain pod CIDR", network.NET_PLUGIN_EVENT_POD_CIDR_CHANGE) + return + } + + if plugin.podCidr != "" { + glog.Warningf("Ignoring subsequent pod CIDR update to %s", podCIDR) + return + } + + plugin.podCidr = podCIDR +} + func (plugin *cniNetworkPlugin) Name() string { return CNIPluginName } @@ -217,13 +267,13 @@ func (plugin *cniNetworkPlugin) SetUpPod(namespace string, name string, id kubec // Windows doesn't have loNetwork. It comes only with Linux if plugin.loNetwork != nil { - if _, err = plugin.addToNetwork(plugin.loNetwork, name, namespace, id, netnsPath); err != nil { + if _, err = plugin.addToNetwork(plugin.loNetwork, name, namespace, id, netnsPath, annotations); err != nil { glog.Errorf("Error while adding to cni lo network: %s", err) return err } } - _, err = plugin.addToNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath) + _, err = plugin.addToNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath, annotations) if err != nil { glog.Errorf("Error while adding to cni network: %s", err) return err @@ -243,11 +293,11 @@ func (plugin *cniNetworkPlugin) TearDownPod(namespace string, name string, id ku glog.Warningf("CNI failed to retrieve network namespace path: %v", err) } - return plugin.deleteFromNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath) + return plugin.deleteFromNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath, nil) } -func (plugin *cniNetworkPlugin) addToNetwork(network *cniNetwork, podName string, podNamespace string, podSandboxID kubecontainer.ContainerID, podNetnsPath string) (cnitypes.Result, error) { - rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podSandboxID, podNetnsPath) +func (plugin *cniNetworkPlugin) addToNetwork(network *cniNetwork, podName string, podNamespace string, podSandboxID kubecontainer.ContainerID, podNetnsPath string, annotations map[string]string) (cnitypes.Result, error) { + rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podSandboxID, podNetnsPath, annotations) if err != nil { glog.Errorf("Error adding network when building cni runtime conf: %v", err) return nil, err @@ -264,8 +314,8 @@ func (plugin *cniNetworkPlugin) addToNetwork(network *cniNetwork, podName string return res, nil } -func (plugin *cniNetworkPlugin) deleteFromNetwork(network *cniNetwork, podName string, podNamespace string, podSandboxID kubecontainer.ContainerID, podNetnsPath string) error { - rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podSandboxID, podNetnsPath) +func (plugin *cniNetworkPlugin) deleteFromNetwork(network *cniNetwork, podName string, podNamespace string, podSandboxID kubecontainer.ContainerID, podNetnsPath string, annotations map[string]string) error { + rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podSandboxID, podNetnsPath, annotations) if err != nil { glog.Errorf("Error deleting network when building cni runtime conf: %v", err) return err @@ -283,7 +333,7 @@ func (plugin *cniNetworkPlugin) deleteFromNetwork(network *cniNetwork, podName s return nil } -func (plugin *cniNetworkPlugin) buildCNIRuntimeConf(podName string, podNs string, podSandboxID kubecontainer.ContainerID, podNetnsPath string) (*libcni.RuntimeConf, error) { +func (plugin *cniNetworkPlugin) buildCNIRuntimeConf(podName string, podNs string, podSandboxID kubecontainer.ContainerID, podNetnsPath string, annotations map[string]string) (*libcni.RuntimeConf, error) { glog.V(4).Infof("Got netns path %v", podNetnsPath) glog.V(4).Infof("Using podns path %v", podNs) @@ -321,5 +371,25 @@ func (plugin *cniNetworkPlugin) buildCNIRuntimeConf(podName string, podNs string "portMappings": portMappingsParam, } + ingress, egress, err := bandwidth.ExtractPodBandwidthResources(annotations) + if err != nil { + return nil, fmt.Errorf("Error reading pod bandwidth annotations: %v", err) + } + if ingress != nil || egress != nil { + bandwidthParam := cniBandwidthEntry{} + if ingress != nil { + bandwidthParam.IngressRate = int(ingress.Value() / 1000) + bandwidthParam.IngressBurst = 0 // default to no limit + } + if egress != nil { + bandwidthParam.EgressRate = int(egress.Value() / 1000) + bandwidthParam.EgressBurst = 0 // default to no limit + } + rt.CapabilityArgs["bandwidth"] = bandwidthParam + } + + // Set the PodCIDR + rt.CapabilityArgs["ipRanges"] = [][]cniIpRange{{{Subnet: plugin.podCidr}}} + return rt, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go index 82324b9a..0c904445 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni/cni_windows.go @@ -42,7 +42,7 @@ func (plugin *cniNetworkPlugin) GetPodNetworkStatus(namespace string, name strin return nil, fmt.Errorf("CNI failed to retrieve network namespace path: %v", err) } - result, err := plugin.addToNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath) + result, err := plugin.addToNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath, nil) glog.V(5).Infof("GetPodNetworkStatus result %+v", result) if err != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD index afd8c429..d1f438e0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/BUILD @@ -20,10 +20,10 @@ go_library( "//pkg/util/conntrack:go_default_library", "//pkg/util/iptables:go_default_library", "//pkg/util/net:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) @@ -39,8 +39,8 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/util/iptables:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go index 6d85c75e..70bfd16d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_manager.go @@ -264,6 +264,12 @@ func (hm *hostportManager) openHostports(podPortMapping *PodPortMapping) (map[ho if pm.HostPort <= 0 { continue } + + // We do not open host ports for SCTP ports, as we agreed in the Support of SCTP KEP + if pm.Protocol == v1.ProtocolSCTP { + continue + } + hp := portMappingToHostport(pm) socket, err := hm.portOpener(&hp) if err != nil { @@ -341,7 +347,7 @@ func getExistingHostportIPTablesRules(iptables utiliptables.Interface) (map[util for chain := range existingNATChains { if strings.HasPrefix(string(chain), string(kubeHostportsChain)) || strings.HasPrefix(string(chain), kubeHostportChainPrefix) { - existingHostportChains[chain] = existingNATChains[chain] + existingHostportChains[chain] = string(existingNATChains[chain]) } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_syncer.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_syncer.go index 3d7bfd6e..1f9df7e9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_syncer.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport/hostport_syncer.go @@ -27,6 +27,7 @@ import ( "github.com/golang/glog" + "k8s.io/api/core/v1" iptablesproxy "k8s.io/kubernetes/pkg/proxy/iptables" utiliptables "k8s.io/kubernetes/pkg/util/iptables" ) @@ -74,6 +75,12 @@ func (h *hostportSyncer) openHostports(podHostportMapping *PodPortMapping) error // Assume hostport is not specified in this portmapping. So skip continue } + + // We do not open host ports for SCTP ports, as we agreed in the Support of SCTP KEP + if port.Protocol == v1.ProtocolSCTP { + continue + } + hp := hostport{ port: port.HostPort, protocol: strings.ToLower(string(port.Protocol)), @@ -137,6 +144,11 @@ func writeLine(buf *bytes.Buffer, words ...string) { buf.WriteString(strings.Join(words, " ") + "\n") } +func writeBytesLine(buf *bytes.Buffer, bytes []byte) { + buf.Write(bytes) + buf.WriteByte('\n') +} + //hostportChainName takes containerPort for a pod and returns associated iptables chain. // This is computed by hashing (sha256) // then encoding to base32 and truncating with the prefix "KUBE-SVC-". We do @@ -189,7 +201,7 @@ func (h *hostportSyncer) SyncHostports(natInterfaceName string, activePodPortMap // Get iptables-save output so we can check for existing chains and rules. // This will be a map of chain name to chain with rules as stored in iptables-save/iptables-restore - existingNATChains := make(map[utiliptables.Chain]string) + existingNATChains := make(map[utiliptables.Chain][]byte) iptablesData := bytes.NewBuffer(nil) err = h.iptables.SaveInto(utiliptables.TableNAT, iptablesData) if err != nil { // if we failed to get any rules @@ -204,7 +216,7 @@ func (h *hostportSyncer) SyncHostports(natInterfaceName string, activePodPortMap // Make sure we keep stats for the top-level chains, if they existed // (which most should have because we created them above). if chain, ok := existingNATChains[kubeHostportsChain]; ok { - writeLine(natChains, chain) + writeBytesLine(natChains, chain) } else { writeLine(natChains, utiliptables.MakeChainLine(kubeHostportsChain)) } @@ -216,7 +228,7 @@ func (h *hostportSyncer) SyncHostports(natInterfaceName string, activePodPortMap protocol := strings.ToLower(string(port.Protocol)) hostportChain := hostportChainName(port, target.podFullName) if chain, ok := existingNATChains[hostportChain]; ok { - writeLine(natChains, chain) + writeBytesLine(natChains, chain) } else { writeLine(natChains, utiliptables.MakeChainLine(hostportChain)) } @@ -264,7 +276,7 @@ func (h *hostportSyncer) SyncHostports(natInterfaceName string, activePodPortMap // We must (as per iptables) write a chain-line for it, which has // the nice effect of flushing the chain. Then we can remove the // chain. - writeLine(natChains, existingNATChains[chain]) + writeBytesLine(natChains, existingNATChains[chain]) writeLine(natRules, "-X", chainString) } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD index 869f297b..92613205 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/BUILD @@ -10,66 +10,33 @@ go_library( name = "go_default_library", srcs = [ "kubenet.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "kubenet_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "kubenet_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "kubenet_unsupported.go", - ], - "//conditions:default": [], - }), + "kubenet_linux.go", + "kubenet_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet", deps = select({ "@io_bazel_rules_go//go/platform:android": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", "//pkg/kubelet/dockershim/network/hostport:go_default_library", @@ -78,44 +45,44 @@ go_library( "//pkg/util/ebtables:go_default_library", "//pkg/util/iptables:go_default_library", "//pkg/util/sysctl:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/containernetworking/cni/libcni:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types:go_default_library", "//vendor/github.com/containernetworking/cni/pkg/types/020:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/vishvananda/netlink:go_default_library", "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", ], @@ -125,16 +92,11 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "kubenet_linux_test.go", - ], - "//conditions:default": [], - }), + srcs = ["kubenet_linux_test.go"], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockershim/network:go_default_library", "//pkg/kubelet/dockershim/network/cni/testing:go_default_library", diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go index cb9452b2..0aec8c38 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_linux.go @@ -35,7 +35,7 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" utilnet "k8s.io/apimachinery/pkg/util/net" utilsets "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/dockershim/network" "k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_unsupported.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_unsupported.go index 3fb4f966..ebb56e40 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet/kubenet_unsupported.go @@ -21,7 +21,7 @@ package kubenet import ( "fmt" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/dockershim/network" ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go index 7968b231..bcef49f7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/network/plugins.go @@ -28,7 +28,7 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" utilsets "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/validation" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" + kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport" "k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go index d060144c..17969a11 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/security_context.go @@ -137,6 +137,11 @@ func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig * hostConfig.SecurityOpt = append(hostConfig.SecurityOpt, "no-new-privileges") } + if !hostConfig.Privileged { + hostConfig.MaskedPaths = sc.MaskedPaths + hostConfig.ReadonlyPaths = sc.ReadonlyPaths + } + return nil } @@ -200,20 +205,13 @@ func modifyHostOptionsForContainer(nsOpts *runtimeapi.NamespaceOption, podSandbo } } -// modifyPIDNamespaceOverrides implements two temporary overrides for the default PID namespace sharing for Docker: +// modifyPIDNamespaceOverrides implements a temporary override for the default PID namespace sharing for Docker: // 1. Docker engine prior to API Version 1.24 doesn't support attaching to another container's // PID namespace, and it didn't stabilize until 1.26. This check can be removed when Kubernetes' // minimum Docker version is at least 1.13.1 (API version 1.26). -// 2. The administrator can override the API behavior by using the deprecated --docker-disable-shared-pid=false -// flag. Until this flag is removed, this causes pods to use NamespaceMode_POD instead of -// NamespaceMode_CONTAINER regardless of pod configuration. // TODO(verb): remove entirely once these two conditions are satisfied -func modifyContainerPIDNamespaceOverrides(disableSharedPID bool, version *semver.Version, hc *dockercontainer.HostConfig, podSandboxID string) { - if version.LT(semver.Version{Major: 1, Minor: 26}) { - if strings.HasPrefix(string(hc.PidMode), "container:") { - hc.PidMode = "" - } - } else if !disableSharedPID && hc.PidMode == "" { - hc.PidMode = dockercontainer.PidMode(fmt.Sprintf("container:%v", podSandboxID)) +func modifyContainerPIDNamespaceOverrides(version *semver.Version, hc *dockercontainer.HostConfig, podSandboxID string) { + if version.LT(semver.Version{Major: 1, Minor: 26}) && strings.HasPrefix(string(hc.PidMode), "container:") { + hc.PidMode = "" } } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD deleted file mode 100644 index aa438e80..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "envvars.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/envvars", - deps = [ - "//pkg/apis/core/v1/helper:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["envvars_test.go"], - deps = [ - ":go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/doc.go deleted file mode 100644 index d9519377..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 envvars is the package that build the environment variables that kubernetes provides -// to the containers run by it. -package envvars // import "k8s.io/kubernetes/pkg/kubelet/envvars" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/envvars.go b/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/envvars.go deleted file mode 100644 index 789c2082..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/envvars/envvars.go +++ /dev/null @@ -1,113 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 envvars - -import ( - "fmt" - "net" - "strconv" - "strings" - - "k8s.io/api/core/v1" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" -) - -// FromServices builds environment variables that a container is started with, -// which tell the container where to find the services it may need, which are -// provided as an argument. -func FromServices(services []*v1.Service) []v1.EnvVar { - var result []v1.EnvVar - for i := range services { - service := services[i] - - // ignore services where ClusterIP is "None" or empty - // the services passed to this method should be pre-filtered - // only services that have the cluster IP set should be included here - if !v1helper.IsServiceIPSet(service) { - continue - } - - // Host - name := makeEnvVariableName(service.Name) + "_SERVICE_HOST" - result = append(result, v1.EnvVar{Name: name, Value: service.Spec.ClusterIP}) - // First port - give it the backwards-compatible name - name = makeEnvVariableName(service.Name) + "_SERVICE_PORT" - result = append(result, v1.EnvVar{Name: name, Value: strconv.Itoa(int(service.Spec.Ports[0].Port))}) - // All named ports (only the first may be unnamed, checked in validation) - for i := range service.Spec.Ports { - sp := &service.Spec.Ports[i] - if sp.Name != "" { - pn := name + "_" + makeEnvVariableName(sp.Name) - result = append(result, v1.EnvVar{Name: pn, Value: strconv.Itoa(int(sp.Port))}) - } - } - // Docker-compatible vars. - result = append(result, makeLinkVariables(service)...) - } - return result -} - -func makeEnvVariableName(str string) string { - // TODO: If we simplify to "all names are DNS1123Subdomains" this - // will need two tweaks: - // 1) Handle leading digits - // 2) Handle dots - return strings.ToUpper(strings.Replace(str, "-", "_", -1)) -} - -func makeLinkVariables(service *v1.Service) []v1.EnvVar { - prefix := makeEnvVariableName(service.Name) - all := []v1.EnvVar{} - for i := range service.Spec.Ports { - sp := &service.Spec.Ports[i] - - protocol := string(v1.ProtocolTCP) - if sp.Protocol != "" { - protocol = string(sp.Protocol) - } - - hostPort := net.JoinHostPort(service.Spec.ClusterIP, strconv.Itoa(int(sp.Port))) - - if i == 0 { - // Docker special-cases the first port. - all = append(all, v1.EnvVar{ - Name: prefix + "_PORT", - Value: fmt.Sprintf("%s://%s", strings.ToLower(protocol), hostPort), - }) - } - portPrefix := fmt.Sprintf("%s_PORT_%d_%s", prefix, sp.Port, strings.ToUpper(protocol)) - all = append(all, []v1.EnvVar{ - { - Name: portPrefix, - Value: fmt.Sprintf("%s://%s", strings.ToLower(protocol), hostPort), - }, - { - Name: portPrefix + "_PROTO", - Value: strings.ToLower(protocol), - }, - { - Name: portPrefix + "_PORT", - Value: strconv.Itoa(int(sp.Port)), - }, - { - Name: portPrefix + "_ADDR", - Value: service.Spec.ClusterIP, - }, - }...) - } - return all -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/events/event.go b/vendor/k8s.io/kubernetes/pkg/kubelet/events/event.go index 7a4769d6..f6f468ee 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/events/event.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/events/event.go @@ -67,8 +67,6 @@ const ( NodeSelectorMismatching = "NodeSelectorMismatching" InsufficientFreeCPU = "InsufficientFreeCPU" InsufficientFreeMemory = "InsufficientFreeMemory" - HostNetworkNotSupported = "HostNetworkNotSupported" - UndefinedShaper = "NilShaper" NodeRebooted = "Rebooted" ContainerGCFailed = "ContainerGCFailed" ImageGCFailed = "ImageGCFailed" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD deleted file mode 100644 index a6e6c847..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/BUILD +++ /dev/null @@ -1,126 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "eviction_manager_test.go", - "helpers_test.go", - "memory_threshold_notifier_test.go", - "mock_threshold_notifier_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//vendor/github.com/stretchr/testify/mock:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "eviction_manager.go", - "helpers.go", - "memory_threshold_notifier.go", - "types.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "threshold_notifier_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "threshold_notifier_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "threshold_notifier_unsupported.go", - ], - "//conditions:default": [], - }), - importpath = "k8s.io/kubernetes/pkg/kubelet/eviction", - deps = [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/eviction/api:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/scheduler/algorithm:go_default_library", - "//pkg/scheduler/util:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/eviction/api:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/OWNERS deleted file mode 100644 index a63babac..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -approvers: -- derekwaynecarr -- vishh -- dchen1107 diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD index dd51294b..b66673df 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/api/BUILD @@ -9,7 +9,7 @@ go_library( name = "go_default_library", srcs = ["types.go"], importpath = "k8s.io/kubernetes/pkg/kubelet/eviction/api", - deps = ["//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/doc.go deleted file mode 100644 index 0db0d82b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 eviction is responsible for enforcing eviction thresholds to maintain -// node stability. -package eviction // import "k8s.io/kubernetes/pkg/kubelet/eviction" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go deleted file mode 100644 index 98833d92..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/eviction_manager.go +++ /dev/null @@ -1,567 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 eviction - -import ( - "fmt" - "sort" - "sync" - "time" - - "github.com/golang/glog" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/util/clock" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/client-go/tools/record" - apiv1resource "k8s.io/kubernetes/pkg/api/v1/resource" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" - v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" - "k8s.io/kubernetes/pkg/features" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" - "k8s.io/kubernetes/pkg/kubelet/lifecycle" - "k8s.io/kubernetes/pkg/kubelet/metrics" - kubepod "k8s.io/kubernetes/pkg/kubelet/pod" - "k8s.io/kubernetes/pkg/kubelet/server/stats" - kubelettypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/scheduler/algorithm" -) - -const ( - podCleanupTimeout = 30 * time.Second - podCleanupPollFreq = time.Second -) - -// managerImpl implements Manager -type managerImpl struct { - // used to track time - clock clock.Clock - // config is how the manager is configured - config Config - // the function to invoke to kill a pod - killPodFunc KillPodFunc - // the interface that knows how to do image gc - imageGC ImageGC - // the interface that knows how to do container gc - containerGC ContainerGC - // protects access to internal state - sync.RWMutex - // node conditions are the set of conditions present - nodeConditions []v1.NodeConditionType - // captures when a node condition was last observed based on a threshold being met - nodeConditionsLastObservedAt nodeConditionsObservedAt - // nodeRef is a reference to the node - nodeRef *v1.ObjectReference - // used to record events about the node - recorder record.EventRecorder - // used to measure usage stats on system - summaryProvider stats.SummaryProvider - // records when a threshold was first observed - thresholdsFirstObservedAt thresholdsObservedAt - // records the set of thresholds that have been met (including graceperiod) but not yet resolved - thresholdsMet []evictionapi.Threshold - // signalToRankFunc maps a resource to ranking function for that resource. - signalToRankFunc map[evictionapi.Signal]rankFunc - // signalToNodeReclaimFuncs maps a resource to an ordered list of functions that know how to reclaim that resource. - signalToNodeReclaimFuncs map[evictionapi.Signal]nodeReclaimFuncs - // last observations from synchronize - lastObservations signalObservations - // dedicatedImageFs indicates if imagefs is on a separate device from the rootfs - dedicatedImageFs *bool - // thresholdNotifiers is a list of memory threshold notifiers which each notify for a memory eviction threshold - thresholdNotifiers []ThresholdNotifier - // thresholdsLastUpdated is the last time the thresholdNotifiers were updated. - thresholdsLastUpdated time.Time -} - -// ensure it implements the required interface -var _ Manager = &managerImpl{} - -// NewManager returns a configured Manager and an associated admission handler to enforce eviction configuration. -func NewManager( - summaryProvider stats.SummaryProvider, - config Config, - killPodFunc KillPodFunc, - imageGC ImageGC, - containerGC ContainerGC, - recorder record.EventRecorder, - nodeRef *v1.ObjectReference, - clock clock.Clock, -) (Manager, lifecycle.PodAdmitHandler) { - manager := &managerImpl{ - clock: clock, - killPodFunc: killPodFunc, - imageGC: imageGC, - containerGC: containerGC, - config: config, - recorder: recorder, - summaryProvider: summaryProvider, - nodeRef: nodeRef, - nodeConditionsLastObservedAt: nodeConditionsObservedAt{}, - thresholdsFirstObservedAt: thresholdsObservedAt{}, - dedicatedImageFs: nil, - thresholdNotifiers: []ThresholdNotifier{}, - } - return manager, manager -} - -// Admit rejects a pod if its not safe to admit for node stability. -func (m *managerImpl) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { - m.RLock() - defer m.RUnlock() - if len(m.nodeConditions) == 0 { - return lifecycle.PodAdmitResult{Admit: true} - } - // Admit Critical pods even under resource pressure since they are required for system stability. - // https://github.com/kubernetes/kubernetes/issues/40573 has more details. - if utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalCriticalPodAnnotation) && kubelettypes.IsCriticalPod(attrs.Pod) { - return lifecycle.PodAdmitResult{Admit: true} - } - // the node has memory pressure, admit if not best-effort - if hasNodeCondition(m.nodeConditions, v1.NodeMemoryPressure) { - notBestEffort := v1.PodQOSBestEffort != v1qos.GetPodQOS(attrs.Pod) - if notBestEffort { - return lifecycle.PodAdmitResult{Admit: true} - } - - // When node has memory pressure and TaintNodesByCondition is enabled, check BestEffort Pod's toleration: - // admit it if tolerates memory pressure taint, fail for other tolerations, e.g. OutOfDisk. - if utilfeature.DefaultFeatureGate.Enabled(features.TaintNodesByCondition) && - v1helper.TolerationsTolerateTaint(attrs.Pod.Spec.Tolerations, &v1.Taint{ - Key: algorithm.TaintNodeMemoryPressure, - Effect: v1.TaintEffectNoSchedule, - }) { - return lifecycle.PodAdmitResult{Admit: true} - } - } - - // reject pods when under memory pressure (if pod is best effort), or if under disk pressure. - glog.Warningf("Failed to admit pod %s - node has conditions: %v", format.Pod(attrs.Pod), m.nodeConditions) - return lifecycle.PodAdmitResult{ - Admit: false, - Reason: Reason, - Message: fmt.Sprintf(nodeLowMessageFmt, m.nodeConditions), - } -} - -// Start starts the control loop to observe and response to low compute resources. -func (m *managerImpl) Start(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, podCleanedUpFunc PodCleanedUpFunc, monitoringInterval time.Duration) { - thresholdHandler := func(message string) { - glog.Infof(message) - m.synchronize(diskInfoProvider, podFunc) - } - if m.config.KernelMemcgNotification { - for _, threshold := range m.config.Thresholds { - if threshold.Signal == evictionapi.SignalMemoryAvailable || threshold.Signal == evictionapi.SignalAllocatableMemoryAvailable { - notifier, err := NewMemoryThresholdNotifier(threshold, m.config.PodCgroupRoot, &CgroupNotifierFactory{}, thresholdHandler) - if err != nil { - glog.Warningf("eviction manager: failed to create memory threshold notifier: %v", err) - } else { - go notifier.Start() - m.thresholdNotifiers = append(m.thresholdNotifiers, notifier) - } - } - } - } - // start the eviction manager monitoring - go func() { - for { - if evictedPods := m.synchronize(diskInfoProvider, podFunc); evictedPods != nil { - glog.Infof("eviction manager: pods %s evicted, waiting for pod to be cleaned up", format.Pods(evictedPods)) - m.waitForPodsCleanup(podCleanedUpFunc, evictedPods) - } else { - time.Sleep(monitoringInterval) - } - } - }() -} - -// IsUnderMemoryPressure returns true if the node is under memory pressure. -func (m *managerImpl) IsUnderMemoryPressure() bool { - m.RLock() - defer m.RUnlock() - return hasNodeCondition(m.nodeConditions, v1.NodeMemoryPressure) -} - -// IsUnderDiskPressure returns true if the node is under disk pressure. -func (m *managerImpl) IsUnderDiskPressure() bool { - m.RLock() - defer m.RUnlock() - return hasNodeCondition(m.nodeConditions, v1.NodeDiskPressure) -} - -// IsUnderPIDPressure returns true if the node is under PID pressure. -func (m *managerImpl) IsUnderPIDPressure() bool { - m.RLock() - defer m.RUnlock() - return hasNodeCondition(m.nodeConditions, v1.NodePIDPressure) -} - -// synchronize is the main control loop that enforces eviction thresholds. -// Returns the pod that was killed, or nil if no pod was killed. -func (m *managerImpl) synchronize(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc) []*v1.Pod { - // if we have nothing to do, just return - thresholds := m.config.Thresholds - if len(thresholds) == 0 && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { - return nil - } - - glog.V(3).Infof("eviction manager: synchronize housekeeping") - // build the ranking functions (if not yet known) - // TODO: have a function in cadvisor that lets us know if global housekeeping has completed - if m.dedicatedImageFs == nil { - hasImageFs, ok := diskInfoProvider.HasDedicatedImageFs() - if ok != nil { - return nil - } - m.dedicatedImageFs = &hasImageFs - m.signalToRankFunc = buildSignalToRankFunc(hasImageFs) - m.signalToNodeReclaimFuncs = buildSignalToNodeReclaimFuncs(m.imageGC, m.containerGC, hasImageFs) - } - - activePods := podFunc() - updateStats := true - summary, err := m.summaryProvider.Get(updateStats) - if err != nil { - glog.Errorf("eviction manager: failed to get get summary stats: %v", err) - return nil - } - - if m.clock.Since(m.thresholdsLastUpdated) > notifierRefreshInterval { - m.thresholdsLastUpdated = m.clock.Now() - for _, notifier := range m.thresholdNotifiers { - if err := notifier.UpdateThreshold(summary); err != nil { - glog.Warningf("eviction manager: failed to update %s: %v", notifier.Description(), err) - } - } - } - - // make observations and get a function to derive pod usage stats relative to those observations. - observations, statsFunc := makeSignalObservations(summary) - debugLogObservations("observations", observations) - - // determine the set of thresholds met independent of grace period - thresholds = thresholdsMet(thresholds, observations, false) - debugLogThresholdsWithObservation("thresholds - ignoring grace period", thresholds, observations) - - // determine the set of thresholds previously met that have not yet satisfied the associated min-reclaim - if len(m.thresholdsMet) > 0 { - thresholdsNotYetResolved := thresholdsMet(m.thresholdsMet, observations, true) - thresholds = mergeThresholds(thresholds, thresholdsNotYetResolved) - } - debugLogThresholdsWithObservation("thresholds - reclaim not satisfied", thresholds, observations) - - // track when a threshold was first observed - now := m.clock.Now() - thresholdsFirstObservedAt := thresholdsFirstObservedAt(thresholds, m.thresholdsFirstObservedAt, now) - - // the set of node conditions that are triggered by currently observed thresholds - nodeConditions := nodeConditions(thresholds) - if len(nodeConditions) > 0 { - glog.V(3).Infof("eviction manager: node conditions - observed: %v", nodeConditions) - } - - // track when a node condition was last observed - nodeConditionsLastObservedAt := nodeConditionsLastObservedAt(nodeConditions, m.nodeConditionsLastObservedAt, now) - - // node conditions report true if it has been observed within the transition period window - nodeConditions = nodeConditionsObservedSince(nodeConditionsLastObservedAt, m.config.PressureTransitionPeriod, now) - if len(nodeConditions) > 0 { - glog.V(3).Infof("eviction manager: node conditions - transition period not met: %v", nodeConditions) - } - - // determine the set of thresholds we need to drive eviction behavior (i.e. all grace periods are met) - thresholds = thresholdsMetGracePeriod(thresholdsFirstObservedAt, now) - debugLogThresholdsWithObservation("thresholds - grace periods satisified", thresholds, observations) - - // update internal state - m.Lock() - m.nodeConditions = nodeConditions - m.thresholdsFirstObservedAt = thresholdsFirstObservedAt - m.nodeConditionsLastObservedAt = nodeConditionsLastObservedAt - m.thresholdsMet = thresholds - - // determine the set of thresholds whose stats have been updated since the last sync - thresholds = thresholdsUpdatedStats(thresholds, observations, m.lastObservations) - debugLogThresholdsWithObservation("thresholds - updated stats", thresholds, observations) - - m.lastObservations = observations - m.Unlock() - - // evict pods if there is a resource usage violation from local volume temporary storage - // If eviction happens in localStorageEviction function, skip the rest of eviction action - if utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { - if evictedPods := m.localStorageEviction(summary, activePods); len(evictedPods) > 0 { - return evictedPods - } - } - - if len(thresholds) == 0 { - glog.V(3).Infof("eviction manager: no resources are starved") - return nil - } - - // rank the thresholds by eviction priority - sort.Sort(byEvictionPriority(thresholds)) - thresholdToReclaim := thresholds[0] - resourceToReclaim, found := signalToResource[thresholdToReclaim.Signal] - if !found { - glog.V(3).Infof("eviction manager: threshold %s was crossed, but reclaim is not implemented for this threshold.", thresholdToReclaim.Signal) - return nil - } - glog.Warningf("eviction manager: attempting to reclaim %v", resourceToReclaim) - - // record an event about the resources we are now attempting to reclaim via eviction - m.recorder.Eventf(m.nodeRef, v1.EventTypeWarning, "EvictionThresholdMet", "Attempting to reclaim %s", resourceToReclaim) - - // check if there are node-level resources we can reclaim to reduce pressure before evicting end-user pods. - if m.reclaimNodeLevelResources(thresholdToReclaim.Signal, resourceToReclaim) { - glog.Infof("eviction manager: able to reduce %v pressure without evicting pods.", resourceToReclaim) - return nil - } - - glog.Infof("eviction manager: must evict pod(s) to reclaim %v", resourceToReclaim) - - // rank the pods for eviction - rank, ok := m.signalToRankFunc[thresholdToReclaim.Signal] - if !ok { - glog.Errorf("eviction manager: no ranking function for signal %s", thresholdToReclaim.Signal) - return nil - } - - // the only candidates viable for eviction are those pods that had anything running. - if len(activePods) == 0 { - glog.Errorf("eviction manager: eviction thresholds have been met, but no pods are active to evict") - return nil - } - - // rank the running pods for eviction for the specified resource - rank(activePods, statsFunc) - - glog.Infof("eviction manager: pods ranked for eviction: %s", format.Pods(activePods)) - - //record age of metrics for met thresholds that we are using for evictions. - for _, t := range thresholds { - timeObserved := observations[t.Signal].time - if !timeObserved.IsZero() { - metrics.EvictionStatsAge.WithLabelValues(string(t.Signal)).Observe(metrics.SinceInMicroseconds(timeObserved.Time)) - } - } - - // we kill at most a single pod during each eviction interval - for i := range activePods { - pod := activePods[i] - gracePeriodOverride := int64(0) - if !isHardEvictionThreshold(thresholdToReclaim) { - gracePeriodOverride = m.config.MaxPodGracePeriodSeconds - } - message, annotations := evictionMessage(resourceToReclaim, pod, statsFunc) - if m.evictPod(pod, gracePeriodOverride, message, annotations) { - return []*v1.Pod{pod} - } - } - glog.Infof("eviction manager: unable to evict any pods from the node") - return nil -} - -func (m *managerImpl) waitForPodsCleanup(podCleanedUpFunc PodCleanedUpFunc, pods []*v1.Pod) { - timeout := m.clock.NewTimer(podCleanupTimeout) - defer timeout.Stop() - ticker := m.clock.NewTicker(podCleanupPollFreq) - defer ticker.Stop() - for { - select { - case <-timeout.C(): - glog.Warningf("eviction manager: timed out waiting for pods %s to be cleaned up", format.Pods(pods)) - return - case <-ticker.C(): - for i, pod := range pods { - if !podCleanedUpFunc(pod) { - break - } - if i == len(pods)-1 { - glog.Infof("eviction manager: pods %s successfully cleaned up", format.Pods(pods)) - return - } - } - } - } -} - -// reclaimNodeLevelResources attempts to reclaim node level resources. returns true if thresholds were satisfied and no pod eviction is required. -func (m *managerImpl) reclaimNodeLevelResources(signalToReclaim evictionapi.Signal, resourceToReclaim v1.ResourceName) bool { - nodeReclaimFuncs := m.signalToNodeReclaimFuncs[signalToReclaim] - for _, nodeReclaimFunc := range nodeReclaimFuncs { - // attempt to reclaim the pressured resource. - if err := nodeReclaimFunc(); err != nil { - glog.Warningf("eviction manager: unexpected error when attempting to reduce %v pressure: %v", resourceToReclaim, err) - } - - } - if len(nodeReclaimFuncs) > 0 { - summary, err := m.summaryProvider.Get(true) - if err != nil { - glog.Errorf("eviction manager: failed to get get summary stats after resource reclaim: %v", err) - return false - } - - // make observations and get a function to derive pod usage stats relative to those observations. - observations, _ := makeSignalObservations(summary) - debugLogObservations("observations after resource reclaim", observations) - - // determine the set of thresholds met independent of grace period - thresholds := thresholdsMet(m.config.Thresholds, observations, false) - debugLogThresholdsWithObservation("thresholds after resource reclaim - ignoring grace period", thresholds, observations) - - if len(thresholds) == 0 { - return true - } - } - return false -} - -// localStorageEviction checks the EmptyDir volume usage for each pod and determine whether it exceeds the specified limit and needs -// to be evicted. It also checks every container in the pod, if the container overlay usage exceeds the limit, the pod will be evicted too. -func (m *managerImpl) localStorageEviction(summary *statsapi.Summary, pods []*v1.Pod) []*v1.Pod { - statsFunc := cachedStatsFunc(summary.Pods) - evicted := []*v1.Pod{} - for _, pod := range pods { - podStats, ok := statsFunc(pod) - if !ok { - continue - } - - if m.emptyDirLimitEviction(podStats, pod) { - evicted = append(evicted, pod) - continue - } - - if m.podEphemeralStorageLimitEviction(podStats, pod) { - evicted = append(evicted, pod) - continue - } - - if m.containerEphemeralStorageLimitEviction(podStats, pod) { - evicted = append(evicted, pod) - } - } - - return evicted -} - -func (m *managerImpl) emptyDirLimitEviction(podStats statsapi.PodStats, pod *v1.Pod) bool { - podVolumeUsed := make(map[string]*resource.Quantity) - for _, volume := range podStats.VolumeStats { - podVolumeUsed[volume.Name] = resource.NewQuantity(int64(*volume.UsedBytes), resource.BinarySI) - } - for i := range pod.Spec.Volumes { - source := &pod.Spec.Volumes[i].VolumeSource - if source.EmptyDir != nil { - size := source.EmptyDir.SizeLimit - used := podVolumeUsed[pod.Spec.Volumes[i].Name] - if used != nil && size != nil && size.Sign() == 1 && used.Cmp(*size) > 0 { - // the emptyDir usage exceeds the size limit, evict the pod - return m.evictPod(pod, 0, fmt.Sprintf(emptyDirMessageFmt, pod.Spec.Volumes[i].Name, size.String()), nil) - } - } - } - - return false -} - -func (m *managerImpl) podEphemeralStorageLimitEviction(podStats statsapi.PodStats, pod *v1.Pod) bool { - _, podLimits := apiv1resource.PodRequestsAndLimits(pod) - _, found := podLimits[v1.ResourceEphemeralStorage] - if !found { - return false - } - - podEphemeralStorageTotalUsage := &resource.Quantity{} - fsStatsSet := []fsStatsType{} - if *m.dedicatedImageFs { - fsStatsSet = []fsStatsType{fsStatsLogs, fsStatsLocalVolumeSource} - } else { - fsStatsSet = []fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource} - } - podEphemeralUsage, err := podLocalEphemeralStorageUsage(podStats, pod, fsStatsSet) - if err != nil { - glog.Errorf("eviction manager: error getting pod disk usage %v", err) - return false - } - - podEphemeralStorageTotalUsage.Add(podEphemeralUsage[v1.ResourceEphemeralStorage]) - podEphemeralStorageLimit := podLimits[v1.ResourceEphemeralStorage] - if podEphemeralStorageTotalUsage.Cmp(podEphemeralStorageLimit) > 0 { - // the total usage of pod exceeds the total size limit of containers, evict the pod - return m.evictPod(pod, 0, fmt.Sprintf(podEphemeralStorageMessageFmt, podEphemeralStorageLimit.String()), nil) - } - return false -} - -func (m *managerImpl) containerEphemeralStorageLimitEviction(podStats statsapi.PodStats, pod *v1.Pod) bool { - thresholdsMap := make(map[string]*resource.Quantity) - for _, container := range pod.Spec.Containers { - ephemeralLimit := container.Resources.Limits.StorageEphemeral() - if ephemeralLimit != nil && ephemeralLimit.Value() != 0 { - thresholdsMap[container.Name] = ephemeralLimit - } - } - - for _, containerStat := range podStats.Containers { - containerUsed := diskUsage(containerStat.Logs) - if !*m.dedicatedImageFs { - containerUsed.Add(*diskUsage(containerStat.Rootfs)) - } - - if ephemeralStorageThreshold, ok := thresholdsMap[containerStat.Name]; ok { - if ephemeralStorageThreshold.Cmp(*containerUsed) < 0 { - return m.evictPod(pod, 0, fmt.Sprintf(containerEphemeralStorageMessageFmt, containerStat.Name, ephemeralStorageThreshold.String()), nil) - - } - } - } - return false -} - -func (m *managerImpl) evictPod(pod *v1.Pod, gracePeriodOverride int64, evictMsg string, annotations map[string]string) bool { - // If the pod is marked as critical and static, and support for critical pod annotations is enabled, - // do not evict such pods. Static pods are not re-admitted after evictions. - // https://github.com/kubernetes/kubernetes/issues/40573 has more details. - if utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalCriticalPodAnnotation) && - kubelettypes.IsCriticalPod(pod) && kubepod.IsStaticPod(pod) { - glog.Errorf("eviction manager: cannot evict a critical static pod %s", format.Pod(pod)) - return false - } - status := v1.PodStatus{ - Phase: v1.PodFailed, - Message: evictMsg, - Reason: Reason, - } - // record that we are evicting the pod - m.recorder.AnnotatedEventf(pod, annotations, v1.EventTypeWarning, Reason, evictMsg) - // this is a blocking call and should only return when the pod and its containers are killed. - err := m.killPodFunc(pod, status, &gracePeriodOverride) - if err != nil { - glog.Errorf("eviction manager: pod %s failed to evict %v", format.Pod(pod), err) - } else { - glog.Infof("eviction manager: pod %s is evicted successfully", format.Pod(pod)) - } - return true -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go deleted file mode 100644 index c078ce93..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/helpers.go +++ /dev/null @@ -1,1098 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 eviction - -import ( - "fmt" - "sort" - "strconv" - "strings" - "time" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - schedulerutils "k8s.io/kubernetes/pkg/scheduler/util" -) - -const ( - unsupportedEvictionSignal = "unsupported eviction signal %v" - // Reason is the reason reported back in status. - Reason = "Evicted" - // nodeLowMessageFmt is the message for evictions due to resource pressure. - nodeLowMessageFmt = "The node was low on resource: %v. " - // containerMessageFmt provides additional information for containers exceeding requests - containerMessageFmt = "Container %s was using %s, which exceeds its request of %s. " - // containerEphemeralStorageMessageFmt provides additional information for containers which have exceeded their ES limit - containerEphemeralStorageMessageFmt = "Container %s exceeded its local ephemeral storage limit %q. " - // podEphemeralStorageMessageFmt provides additional information for pods which have exceeded their ES limit - podEphemeralStorageMessageFmt = "Pod ephemeral local storage usage exceeds the total limit of containers %s. " - // emptyDirMessageFmt provides additional information for empty-dir volumes which have exceeded their size limit - emptyDirMessageFmt = "Usage of EmptyDir volume %q exceeds the limit %q. " - // inodes, number. internal to this module, used to account for local disk inode consumption. - resourceInodes v1.ResourceName = "inodes" - // OffendingContainersKey is the key in eviction event annotations for the list of container names which exceeded their requests - OffendingContainersKey = "offending_containers" - // OffendingContainersUsageKey is the key in eviction event annotations for the list of usage of containers which exceeded their requests - OffendingContainersUsageKey = "offending_containers_usage" - // StarvedResourceKey is the key for the starved resource in eviction event annotations - StarvedResourceKey = "starved_resource" -) - -var ( - // signalToNodeCondition maps a signal to the node condition to report if threshold is met. - signalToNodeCondition map[evictionapi.Signal]v1.NodeConditionType - // signalToResource maps a Signal to its associated Resource. - signalToResource map[evictionapi.Signal]v1.ResourceName -) - -func init() { - // map eviction signals to node conditions - signalToNodeCondition = map[evictionapi.Signal]v1.NodeConditionType{} - signalToNodeCondition[evictionapi.SignalMemoryAvailable] = v1.NodeMemoryPressure - signalToNodeCondition[evictionapi.SignalAllocatableMemoryAvailable] = v1.NodeMemoryPressure - signalToNodeCondition[evictionapi.SignalImageFsAvailable] = v1.NodeDiskPressure - signalToNodeCondition[evictionapi.SignalNodeFsAvailable] = v1.NodeDiskPressure - signalToNodeCondition[evictionapi.SignalImageFsInodesFree] = v1.NodeDiskPressure - signalToNodeCondition[evictionapi.SignalNodeFsInodesFree] = v1.NodeDiskPressure - signalToNodeCondition[evictionapi.SignalPIDAvailable] = v1.NodePIDPressure - - // map signals to resources (and vice-versa) - signalToResource = map[evictionapi.Signal]v1.ResourceName{} - signalToResource[evictionapi.SignalMemoryAvailable] = v1.ResourceMemory - signalToResource[evictionapi.SignalAllocatableMemoryAvailable] = v1.ResourceMemory - signalToResource[evictionapi.SignalImageFsAvailable] = v1.ResourceEphemeralStorage - signalToResource[evictionapi.SignalImageFsInodesFree] = resourceInodes - signalToResource[evictionapi.SignalNodeFsAvailable] = v1.ResourceEphemeralStorage - signalToResource[evictionapi.SignalNodeFsInodesFree] = resourceInodes -} - -// validSignal returns true if the signal is supported. -func validSignal(signal evictionapi.Signal) bool { - _, found := signalToResource[signal] - return found -} - -// ParseThresholdConfig parses the flags for thresholds. -func ParseThresholdConfig(allocatableConfig []string, evictionHard, evictionSoft, evictionSoftGracePeriod, evictionMinimumReclaim map[string]string) ([]evictionapi.Threshold, error) { - results := []evictionapi.Threshold{} - hardThresholds, err := parseThresholdStatements(evictionHard) - if err != nil { - return nil, err - } - results = append(results, hardThresholds...) - softThresholds, err := parseThresholdStatements(evictionSoft) - if err != nil { - return nil, err - } - gracePeriods, err := parseGracePeriods(evictionSoftGracePeriod) - if err != nil { - return nil, err - } - minReclaims, err := parseMinimumReclaims(evictionMinimumReclaim) - if err != nil { - return nil, err - } - for i := range softThresholds { - signal := softThresholds[i].Signal - period, found := gracePeriods[signal] - if !found { - return nil, fmt.Errorf("grace period must be specified for the soft eviction threshold %v", signal) - } - softThresholds[i].GracePeriod = period - } - results = append(results, softThresholds...) - for i := range results { - for signal, minReclaim := range minReclaims { - if results[i].Signal == signal { - results[i].MinReclaim = &minReclaim - break - } - } - } - for _, key := range allocatableConfig { - if key == kubetypes.NodeAllocatableEnforcementKey { - results = addAllocatableThresholds(results) - break - } - } - return results, nil -} - -func addAllocatableThresholds(thresholds []evictionapi.Threshold) []evictionapi.Threshold { - additionalThresholds := []evictionapi.Threshold{} - for _, threshold := range thresholds { - if threshold.Signal == evictionapi.SignalMemoryAvailable && isHardEvictionThreshold(threshold) { - // Copy the SignalMemoryAvailable to SignalAllocatableMemoryAvailable - additionalThresholds = append(additionalThresholds, evictionapi.Threshold{ - Signal: evictionapi.SignalAllocatableMemoryAvailable, - Operator: threshold.Operator, - Value: threshold.Value, - MinReclaim: threshold.MinReclaim, - }) - } - } - return append(thresholds, additionalThresholds...) -} - -// parseThresholdStatements parses the input statements into a list of Threshold objects. -func parseThresholdStatements(statements map[string]string) ([]evictionapi.Threshold, error) { - if len(statements) == 0 { - return nil, nil - } - results := []evictionapi.Threshold{} - for signal, val := range statements { - result, err := parseThresholdStatement(evictionapi.Signal(signal), val) - if err != nil { - return nil, err - } - if result != nil { - results = append(results, *result) - } - } - return results, nil -} - -// parseThresholdStatement parses a threshold statement and returns a threshold, -// or nil if the threshold should be ignored. -func parseThresholdStatement(signal evictionapi.Signal, val string) (*evictionapi.Threshold, error) { - if !validSignal(signal) { - return nil, fmt.Errorf(unsupportedEvictionSignal, signal) - } - operator := evictionapi.OpForSignal[signal] - if strings.HasSuffix(val, "%") { - // ignore 0% and 100% - if val == "0%" || val == "100%" { - return nil, nil - } - percentage, err := parsePercentage(val) - if err != nil { - return nil, err - } - if percentage < 0 { - return nil, fmt.Errorf("eviction percentage threshold %v must be >= 0%%: %s", signal, val) - } - if percentage > 100 { - return nil, fmt.Errorf("eviction percentage threshold %v must be <= 100%%: %s", signal, val) - } - return &evictionapi.Threshold{ - Signal: signal, - Operator: operator, - Value: evictionapi.ThresholdValue{ - Percentage: percentage, - }, - }, nil - } - quantity, err := resource.ParseQuantity(val) - if err != nil { - return nil, err - } - if quantity.Sign() < 0 || quantity.IsZero() { - return nil, fmt.Errorf("eviction threshold %v must be positive: %s", signal, &quantity) - } - return &evictionapi.Threshold{ - Signal: signal, - Operator: operator, - Value: evictionapi.ThresholdValue{ - Quantity: &quantity, - }, - }, nil -} - -// parsePercentage parses a string representing a percentage value -func parsePercentage(input string) (float32, error) { - value, err := strconv.ParseFloat(strings.TrimRight(input, "%"), 32) - if err != nil { - return 0, err - } - return float32(value) / 100, nil -} - -// parseGracePeriods parses the grace period statements -func parseGracePeriods(statements map[string]string) (map[evictionapi.Signal]time.Duration, error) { - if len(statements) == 0 { - return nil, nil - } - results := map[evictionapi.Signal]time.Duration{} - for signal, val := range statements { - signal := evictionapi.Signal(signal) - if !validSignal(signal) { - return nil, fmt.Errorf(unsupportedEvictionSignal, signal) - } - gracePeriod, err := time.ParseDuration(val) - if err != nil { - return nil, err - } - if gracePeriod < 0 { - return nil, fmt.Errorf("invalid eviction grace period specified: %v, must be a positive value", val) - } - results[signal] = gracePeriod - } - return results, nil -} - -// parseMinimumReclaims parses the minimum reclaim statements -func parseMinimumReclaims(statements map[string]string) (map[evictionapi.Signal]evictionapi.ThresholdValue, error) { - if len(statements) == 0 { - return nil, nil - } - results := map[evictionapi.Signal]evictionapi.ThresholdValue{} - for signal, val := range statements { - signal := evictionapi.Signal(signal) - if !validSignal(signal) { - return nil, fmt.Errorf(unsupportedEvictionSignal, signal) - } - if strings.HasSuffix(val, "%") { - percentage, err := parsePercentage(val) - if err != nil { - return nil, err - } - if percentage <= 0 { - return nil, fmt.Errorf("eviction percentage minimum reclaim %v must be positive: %s", signal, val) - } - results[signal] = evictionapi.ThresholdValue{ - Percentage: percentage, - } - continue - } - quantity, err := resource.ParseQuantity(val) - if err != nil { - return nil, err - } - if quantity.Sign() < 0 { - return nil, fmt.Errorf("negative eviction minimum reclaim specified for %v", signal) - } - results[signal] = evictionapi.ThresholdValue{ - Quantity: &quantity, - } - } - return results, nil -} - -// diskUsage converts used bytes into a resource quantity. -func diskUsage(fsStats *statsapi.FsStats) *resource.Quantity { - if fsStats == nil || fsStats.UsedBytes == nil { - return &resource.Quantity{Format: resource.BinarySI} - } - usage := int64(*fsStats.UsedBytes) - return resource.NewQuantity(usage, resource.BinarySI) -} - -// inodeUsage converts inodes consumed into a resource quantity. -func inodeUsage(fsStats *statsapi.FsStats) *resource.Quantity { - if fsStats == nil || fsStats.InodesUsed == nil { - return &resource.Quantity{Format: resource.DecimalSI} - } - usage := int64(*fsStats.InodesUsed) - return resource.NewQuantity(usage, resource.DecimalSI) -} - -// memoryUsage converts working set into a resource quantity. -func memoryUsage(memStats *statsapi.MemoryStats) *resource.Quantity { - if memStats == nil || memStats.WorkingSetBytes == nil { - return &resource.Quantity{Format: resource.BinarySI} - } - usage := int64(*memStats.WorkingSetBytes) - return resource.NewQuantity(usage, resource.BinarySI) -} - -// localVolumeNames returns the set of volumes for the pod that are local -// TODO: sumamry API should report what volumes consume local storage rather than hard-code here. -func localVolumeNames(pod *v1.Pod) []string { - result := []string{} - for _, volume := range pod.Spec.Volumes { - if volume.HostPath != nil || - (volume.EmptyDir != nil && volume.EmptyDir.Medium != v1.StorageMediumMemory) || - volume.ConfigMap != nil || - volume.GitRepo != nil { - result = append(result, volume.Name) - } - } - return result -} - -// containerUsage aggregates container disk usage and inode consumption for the specified stats to measure. -func containerUsage(podStats statsapi.PodStats, statsToMeasure []fsStatsType) v1.ResourceList { - disk := resource.Quantity{Format: resource.BinarySI} - inodes := resource.Quantity{Format: resource.DecimalSI} - for _, container := range podStats.Containers { - if hasFsStatsType(statsToMeasure, fsStatsRoot) { - disk.Add(*diskUsage(container.Rootfs)) - inodes.Add(*inodeUsage(container.Rootfs)) - } - if hasFsStatsType(statsToMeasure, fsStatsLogs) { - disk.Add(*diskUsage(container.Logs)) - inodes.Add(*inodeUsage(container.Logs)) - } - } - return v1.ResourceList{ - v1.ResourceEphemeralStorage: disk, - resourceInodes: inodes, - } -} - -// podLocalVolumeUsage aggregates pod local volumes disk usage and inode consumption for the specified stats to measure. -func podLocalVolumeUsage(volumeNames []string, podStats statsapi.PodStats) v1.ResourceList { - disk := resource.Quantity{Format: resource.BinarySI} - inodes := resource.Quantity{Format: resource.DecimalSI} - for _, volumeName := range volumeNames { - for _, volumeStats := range podStats.VolumeStats { - if volumeStats.Name == volumeName { - disk.Add(*diskUsage(&volumeStats.FsStats)) - inodes.Add(*inodeUsage(&volumeStats.FsStats)) - break - } - } - } - return v1.ResourceList{ - v1.ResourceEphemeralStorage: disk, - resourceInodes: inodes, - } -} - -// podDiskUsage aggregates pod disk usage and inode consumption for the specified stats to measure. -func podDiskUsage(podStats statsapi.PodStats, pod *v1.Pod, statsToMeasure []fsStatsType) (v1.ResourceList, error) { - disk := resource.Quantity{Format: resource.BinarySI} - inodes := resource.Quantity{Format: resource.DecimalSI} - - containerUsageList := containerUsage(podStats, statsToMeasure) - disk.Add(containerUsageList[v1.ResourceEphemeralStorage]) - inodes.Add(containerUsageList[resourceInodes]) - - if hasFsStatsType(statsToMeasure, fsStatsLocalVolumeSource) { - volumeNames := localVolumeNames(pod) - podLocalVolumeUsageList := podLocalVolumeUsage(volumeNames, podStats) - disk.Add(podLocalVolumeUsageList[v1.ResourceEphemeralStorage]) - inodes.Add(podLocalVolumeUsageList[resourceInodes]) - } - return v1.ResourceList{ - v1.ResourceEphemeralStorage: disk, - resourceInodes: inodes, - }, nil -} - -// podMemoryUsage aggregates pod memory usage. -func podMemoryUsage(podStats statsapi.PodStats) (v1.ResourceList, error) { - memory := resource.Quantity{Format: resource.BinarySI} - for _, container := range podStats.Containers { - // memory usage (if known) - memory.Add(*memoryUsage(container.Memory)) - } - return v1.ResourceList{v1.ResourceMemory: memory}, nil -} - -// localEphemeralVolumeNames returns the set of ephemeral volumes for the pod that are local -func localEphemeralVolumeNames(pod *v1.Pod) []string { - result := []string{} - for _, volume := range pod.Spec.Volumes { - if volume.GitRepo != nil || - (volume.EmptyDir != nil && volume.EmptyDir.Medium != v1.StorageMediumMemory) || - volume.ConfigMap != nil || volume.DownwardAPI != nil { - result = append(result, volume.Name) - } - } - return result -} - -// podLocalEphemeralStorageUsage aggregates pod local ephemeral storage usage and inode consumption for the specified stats to measure. -func podLocalEphemeralStorageUsage(podStats statsapi.PodStats, pod *v1.Pod, statsToMeasure []fsStatsType) (v1.ResourceList, error) { - disk := resource.Quantity{Format: resource.BinarySI} - inodes := resource.Quantity{Format: resource.DecimalSI} - - containerUsageList := containerUsage(podStats, statsToMeasure) - disk.Add(containerUsageList[v1.ResourceEphemeralStorage]) - inodes.Add(containerUsageList[resourceInodes]) - - if hasFsStatsType(statsToMeasure, fsStatsLocalVolumeSource) { - volumeNames := localEphemeralVolumeNames(pod) - podLocalVolumeUsageList := podLocalVolumeUsage(volumeNames, podStats) - disk.Add(podLocalVolumeUsageList[v1.ResourceEphemeralStorage]) - inodes.Add(podLocalVolumeUsageList[resourceInodes]) - } - return v1.ResourceList{ - v1.ResourceEphemeralStorage: disk, - resourceInodes: inodes, - }, nil -} - -// formatThreshold formats a threshold for logging. -func formatThreshold(threshold evictionapi.Threshold) string { - return fmt.Sprintf("threshold(signal=%v, operator=%v, value=%v, gracePeriod=%v)", threshold.Signal, threshold.Operator, evictionapi.ThresholdValue(threshold.Value), threshold.GracePeriod) -} - -// formatevictionapi.ThresholdValue formats a thresholdValue for logging. -func formatThresholdValue(value evictionapi.ThresholdValue) string { - if value.Quantity != nil { - return value.Quantity.String() - } - return fmt.Sprintf("%f%%", value.Percentage*float32(100)) -} - -// cachedStatsFunc returns a statsFunc based on the provided pod stats. -func cachedStatsFunc(podStats []statsapi.PodStats) statsFunc { - uid2PodStats := map[string]statsapi.PodStats{} - for i := range podStats { - uid2PodStats[podStats[i].PodRef.UID] = podStats[i] - } - return func(pod *v1.Pod) (statsapi.PodStats, bool) { - stats, found := uid2PodStats[string(pod.UID)] - return stats, found - } -} - -// Cmp compares p1 and p2 and returns: -// -// -1 if p1 < p2 -// 0 if p1 == p2 -// +1 if p1 > p2 -// -type cmpFunc func(p1, p2 *v1.Pod) int - -// multiSorter implements the Sort interface, sorting changes within. -type multiSorter struct { - pods []*v1.Pod - cmp []cmpFunc -} - -// Sort sorts the argument slice according to the less functions passed to OrderedBy. -func (ms *multiSorter) Sort(pods []*v1.Pod) { - ms.pods = pods - sort.Sort(ms) -} - -// OrderedBy returns a Sorter that sorts using the cmp functions, in order. -// Call its Sort method to sort the data. -func orderedBy(cmp ...cmpFunc) *multiSorter { - return &multiSorter{ - cmp: cmp, - } -} - -// Len is part of sort.Interface. -func (ms *multiSorter) Len() int { - return len(ms.pods) -} - -// Swap is part of sort.Interface. -func (ms *multiSorter) Swap(i, j int) { - ms.pods[i], ms.pods[j] = ms.pods[j], ms.pods[i] -} - -// Less is part of sort.Interface. -func (ms *multiSorter) Less(i, j int) bool { - p1, p2 := ms.pods[i], ms.pods[j] - var k int - for k = 0; k < len(ms.cmp)-1; k++ { - cmpResult := ms.cmp[k](p1, p2) - // p1 is less than p2 - if cmpResult < 0 { - return true - } - // p1 is greater than p2 - if cmpResult > 0 { - return false - } - // we don't know yet - } - // the last cmp func is the final decider - return ms.cmp[k](p1, p2) < 0 -} - -// priority compares pods by Priority, if priority is enabled. -func priority(p1, p2 *v1.Pod) int { - if !utilfeature.DefaultFeatureGate.Enabled(features.PodPriority) { - // If priority is not enabled, all pods are equal. - return 0 - } - priority1 := schedulerutils.GetPodPriority(p1) - priority2 := schedulerutils.GetPodPriority(p2) - if priority1 == priority2 { - return 0 - } - if priority1 > priority2 { - return 1 - } - return -1 -} - -// exceedMemoryRequests compares whether or not pods' memory usage exceeds their requests -func exceedMemoryRequests(stats statsFunc) cmpFunc { - return func(p1, p2 *v1.Pod) int { - p1Stats, p1Found := stats(p1) - p2Stats, p2Found := stats(p2) - if !p1Found || !p2Found { - // prioritize evicting the pod for which no stats were found - return cmpBool(!p1Found, !p2Found) - } - - p1Usage, p1Err := podMemoryUsage(p1Stats) - p2Usage, p2Err := podMemoryUsage(p2Stats) - if p1Err != nil || p2Err != nil { - // prioritize evicting the pod which had an error getting stats - return cmpBool(p1Err != nil, p2Err != nil) - } - - p1Memory := p1Usage[v1.ResourceMemory] - p2Memory := p2Usage[v1.ResourceMemory] - p1ExceedsRequests := p1Memory.Cmp(podRequest(p1, v1.ResourceMemory)) == 1 - p2ExceedsRequests := p2Memory.Cmp(podRequest(p2, v1.ResourceMemory)) == 1 - // prioritize evicting the pod which exceeds its requests - return cmpBool(p1ExceedsRequests, p2ExceedsRequests) - } -} - -// memory compares pods by largest consumer of memory relative to request. -func memory(stats statsFunc) cmpFunc { - return func(p1, p2 *v1.Pod) int { - p1Stats, p1Found := stats(p1) - p2Stats, p2Found := stats(p2) - if !p1Found || !p2Found { - // prioritize evicting the pod for which no stats were found - return cmpBool(!p1Found, !p2Found) - } - - p1Usage, p1Err := podMemoryUsage(p1Stats) - p2Usage, p2Err := podMemoryUsage(p2Stats) - if p1Err != nil || p2Err != nil { - // prioritize evicting the pod which had an error getting stats - return cmpBool(p1Err != nil, p2Err != nil) - } - - // adjust p1, p2 usage relative to the request (if any) - p1Memory := p1Usage[v1.ResourceMemory] - p1Request := podRequest(p1, v1.ResourceMemory) - p1Memory.Sub(p1Request) - - p2Memory := p2Usage[v1.ResourceMemory] - p2Request := podRequest(p2, v1.ResourceMemory) - p2Memory.Sub(p2Request) - - // prioritize evicting the pod which has the larger consumption of memory - return p2Memory.Cmp(p1Memory) - } -} - -// podRequest returns the total resource request of a pod which is the -// max(max of init container requests, sum of container requests) -func podRequest(pod *v1.Pod, resourceName v1.ResourceName) resource.Quantity { - containerValue := resource.Quantity{Format: resource.BinarySI} - if resourceName == v1.ResourceEphemeralStorage && !utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { - // if the local storage capacity isolation feature gate is disabled, pods request 0 disk - return containerValue - } - for i := range pod.Spec.Containers { - switch resourceName { - case v1.ResourceMemory: - containerValue.Add(*pod.Spec.Containers[i].Resources.Requests.Memory()) - case v1.ResourceEphemeralStorage: - containerValue.Add(*pod.Spec.Containers[i].Resources.Requests.StorageEphemeral()) - } - } - initValue := resource.Quantity{Format: resource.BinarySI} - for i := range pod.Spec.InitContainers { - switch resourceName { - case v1.ResourceMemory: - if initValue.Cmp(*pod.Spec.InitContainers[i].Resources.Requests.Memory()) < 0 { - initValue = *pod.Spec.InitContainers[i].Resources.Requests.Memory() - } - case v1.ResourceEphemeralStorage: - if initValue.Cmp(*pod.Spec.InitContainers[i].Resources.Requests.StorageEphemeral()) < 0 { - initValue = *pod.Spec.InitContainers[i].Resources.Requests.StorageEphemeral() - } - } - } - if containerValue.Cmp(initValue) > 0 { - return containerValue - } - return initValue -} - -// exceedDiskRequests compares whether or not pods' disk usage exceeds their requests -func exceedDiskRequests(stats statsFunc, fsStatsToMeasure []fsStatsType, diskResource v1.ResourceName) cmpFunc { - return func(p1, p2 *v1.Pod) int { - p1Stats, p1Found := stats(p1) - p2Stats, p2Found := stats(p2) - if !p1Found || !p2Found { - // prioritize evicting the pod for which no stats were found - return cmpBool(!p1Found, !p2Found) - } - - p1Usage, p1Err := podDiskUsage(p1Stats, p1, fsStatsToMeasure) - p2Usage, p2Err := podDiskUsage(p2Stats, p2, fsStatsToMeasure) - if p1Err != nil || p2Err != nil { - // prioritize evicting the pod which had an error getting stats - return cmpBool(p1Err != nil, p2Err != nil) - } - - p1Disk := p1Usage[diskResource] - p2Disk := p2Usage[diskResource] - p1ExceedsRequests := p1Disk.Cmp(podRequest(p1, diskResource)) == 1 - p2ExceedsRequests := p2Disk.Cmp(podRequest(p2, diskResource)) == 1 - // prioritize evicting the pod which exceeds its requests - return cmpBool(p1ExceedsRequests, p2ExceedsRequests) - } -} - -// disk compares pods by largest consumer of disk relative to request for the specified disk resource. -func disk(stats statsFunc, fsStatsToMeasure []fsStatsType, diskResource v1.ResourceName) cmpFunc { - return func(p1, p2 *v1.Pod) int { - p1Stats, p1Found := stats(p1) - p2Stats, p2Found := stats(p2) - if !p1Found || !p2Found { - // prioritize evicting the pod for which no stats were found - return cmpBool(!p1Found, !p2Found) - } - p1Usage, p1Err := podDiskUsage(p1Stats, p1, fsStatsToMeasure) - p2Usage, p2Err := podDiskUsage(p2Stats, p2, fsStatsToMeasure) - if p1Err != nil || p2Err != nil { - // prioritize evicting the pod which had an error getting stats - return cmpBool(p1Err != nil, p2Err != nil) - } - - // adjust p1, p2 usage relative to the request (if any) - p1Disk := p1Usage[diskResource] - p2Disk := p2Usage[diskResource] - p1Request := podRequest(p1, v1.ResourceEphemeralStorage) - p1Disk.Sub(p1Request) - p2Request := podRequest(p2, v1.ResourceEphemeralStorage) - p2Disk.Sub(p2Request) - // prioritize evicting the pod which has the larger consumption of disk - return p2Disk.Cmp(p1Disk) - } -} - -// cmpBool compares booleans, placing true before false -func cmpBool(a, b bool) int { - if a == b { - return 0 - } - if !b { - return -1 - } - return 1 -} - -// rankMemoryPressure orders the input pods for eviction in response to memory pressure. -// It ranks by whether or not the pod's usage exceeds its requests, then by priority, and -// finally by memory usage above requests. -func rankMemoryPressure(pods []*v1.Pod, stats statsFunc) { - orderedBy(exceedMemoryRequests(stats), priority, memory(stats)).Sort(pods) -} - -// rankDiskPressureFunc returns a rankFunc that measures the specified fs stats. -func rankDiskPressureFunc(fsStatsToMeasure []fsStatsType, diskResource v1.ResourceName) rankFunc { - return func(pods []*v1.Pod, stats statsFunc) { - orderedBy(exceedDiskRequests(stats, fsStatsToMeasure, diskResource), priority, disk(stats, fsStatsToMeasure, diskResource)).Sort(pods) - } -} - -// byEvictionPriority implements sort.Interface for []v1.ResourceName. -type byEvictionPriority []evictionapi.Threshold - -func (a byEvictionPriority) Len() int { return len(a) } -func (a byEvictionPriority) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -// Less ranks memory before all other resources, and ranks thresholds with no resource to reclaim last -func (a byEvictionPriority) Less(i, j int) bool { - _, jSignalHasResource := signalToResource[a[j].Signal] - return a[i].Signal == evictionapi.SignalMemoryAvailable || a[i].Signal == evictionapi.SignalAllocatableMemoryAvailable || !jSignalHasResource -} - -// makeSignalObservations derives observations using the specified summary provider. -func makeSignalObservations(summary *statsapi.Summary) (signalObservations, statsFunc) { - // build the function to work against for pod stats - statsFunc := cachedStatsFunc(summary.Pods) - // build an evaluation context for current eviction signals - result := signalObservations{} - - if memory := summary.Node.Memory; memory != nil && memory.AvailableBytes != nil && memory.WorkingSetBytes != nil { - result[evictionapi.SignalMemoryAvailable] = signalObservation{ - available: resource.NewQuantity(int64(*memory.AvailableBytes), resource.BinarySI), - capacity: resource.NewQuantity(int64(*memory.AvailableBytes+*memory.WorkingSetBytes), resource.BinarySI), - time: memory.Time, - } - } - if allocatableContainer, err := getSysContainer(summary.Node.SystemContainers, statsapi.SystemContainerPods); err != nil { - glog.Errorf("eviction manager: failed to construct signal: %q error: %v", evictionapi.SignalAllocatableMemoryAvailable, err) - } else { - if memory := allocatableContainer.Memory; memory != nil && memory.AvailableBytes != nil && memory.WorkingSetBytes != nil { - result[evictionapi.SignalAllocatableMemoryAvailable] = signalObservation{ - available: resource.NewQuantity(int64(*memory.AvailableBytes), resource.BinarySI), - capacity: resource.NewQuantity(int64(*memory.AvailableBytes+*memory.WorkingSetBytes), resource.BinarySI), - time: memory.Time, - } - } - } - if nodeFs := summary.Node.Fs; nodeFs != nil { - if nodeFs.AvailableBytes != nil && nodeFs.CapacityBytes != nil { - result[evictionapi.SignalNodeFsAvailable] = signalObservation{ - available: resource.NewQuantity(int64(*nodeFs.AvailableBytes), resource.BinarySI), - capacity: resource.NewQuantity(int64(*nodeFs.CapacityBytes), resource.BinarySI), - time: nodeFs.Time, - } - } - if nodeFs.InodesFree != nil && nodeFs.Inodes != nil { - result[evictionapi.SignalNodeFsInodesFree] = signalObservation{ - available: resource.NewQuantity(int64(*nodeFs.InodesFree), resource.DecimalSI), - capacity: resource.NewQuantity(int64(*nodeFs.Inodes), resource.DecimalSI), - time: nodeFs.Time, - } - } - } - if summary.Node.Runtime != nil { - if imageFs := summary.Node.Runtime.ImageFs; imageFs != nil { - if imageFs.AvailableBytes != nil && imageFs.CapacityBytes != nil { - result[evictionapi.SignalImageFsAvailable] = signalObservation{ - available: resource.NewQuantity(int64(*imageFs.AvailableBytes), resource.BinarySI), - capacity: resource.NewQuantity(int64(*imageFs.CapacityBytes), resource.BinarySI), - time: imageFs.Time, - } - if imageFs.InodesFree != nil && imageFs.Inodes != nil { - result[evictionapi.SignalImageFsInodesFree] = signalObservation{ - available: resource.NewQuantity(int64(*imageFs.InodesFree), resource.DecimalSI), - capacity: resource.NewQuantity(int64(*imageFs.Inodes), resource.DecimalSI), - time: imageFs.Time, - } - } - } - } - } - if rlimit := summary.Node.Rlimit; rlimit != nil { - if rlimit.NumOfRunningProcesses != nil && rlimit.MaxPID != nil { - available := int64(*rlimit.MaxPID) - int64(*rlimit.NumOfRunningProcesses) - result[evictionapi.SignalPIDAvailable] = signalObservation{ - available: resource.NewQuantity(available, resource.BinarySI), - capacity: resource.NewQuantity(int64(*rlimit.MaxPID), resource.BinarySI), - time: rlimit.Time, - } - } - } - return result, statsFunc -} - -func getSysContainer(sysContainers []statsapi.ContainerStats, name string) (*statsapi.ContainerStats, error) { - for _, cont := range sysContainers { - if cont.Name == name { - return &cont, nil - } - } - return nil, fmt.Errorf("system container %q not found in metrics", name) -} - -// thresholdsMet returns the set of thresholds that were met independent of grace period -func thresholdsMet(thresholds []evictionapi.Threshold, observations signalObservations, enforceMinReclaim bool) []evictionapi.Threshold { - results := []evictionapi.Threshold{} - for i := range thresholds { - threshold := thresholds[i] - observed, found := observations[threshold.Signal] - if !found { - glog.Warningf("eviction manager: no observation found for eviction signal %v", threshold.Signal) - continue - } - // determine if we have met the specified threshold - thresholdMet := false - quantity := evictionapi.GetThresholdQuantity(threshold.Value, observed.capacity) - // if enforceMinReclaim is specified, we compare relative to value - minreclaim - if enforceMinReclaim && threshold.MinReclaim != nil { - quantity.Add(*evictionapi.GetThresholdQuantity(*threshold.MinReclaim, observed.capacity)) - } - thresholdResult := quantity.Cmp(*observed.available) - switch threshold.Operator { - case evictionapi.OpLessThan: - thresholdMet = thresholdResult > 0 - } - if thresholdMet { - results = append(results, threshold) - } - } - return results -} - -func debugLogObservations(logPrefix string, observations signalObservations) { - if !glog.V(3) { - return - } - for k, v := range observations { - if !v.time.IsZero() { - glog.Infof("eviction manager: %v: signal=%v, available: %v, capacity: %v, time: %v", logPrefix, k, v.available, v.capacity, v.time) - } else { - glog.Infof("eviction manager: %v: signal=%v, available: %v, capacity: %v", logPrefix, k, v.available, v.capacity) - } - } -} - -func debugLogThresholdsWithObservation(logPrefix string, thresholds []evictionapi.Threshold, observations signalObservations) { - if !glog.V(3) { - return - } - for i := range thresholds { - threshold := thresholds[i] - observed, found := observations[threshold.Signal] - if found { - quantity := evictionapi.GetThresholdQuantity(threshold.Value, observed.capacity) - glog.Infof("eviction manager: %v: threshold [signal=%v, quantity=%v] observed %v", logPrefix, threshold.Signal, quantity, observed.available) - } else { - glog.Infof("eviction manager: %v: threshold [signal=%v] had no observation", logPrefix, threshold.Signal) - } - } -} - -func thresholdsUpdatedStats(thresholds []evictionapi.Threshold, observations, lastObservations signalObservations) []evictionapi.Threshold { - results := []evictionapi.Threshold{} - for i := range thresholds { - threshold := thresholds[i] - observed, found := observations[threshold.Signal] - if !found { - glog.Warningf("eviction manager: no observation found for eviction signal %v", threshold.Signal) - continue - } - last, found := lastObservations[threshold.Signal] - if !found || observed.time.IsZero() || observed.time.After(last.time.Time) { - results = append(results, threshold) - } - } - return results -} - -// thresholdsFirstObservedAt merges the input set of thresholds with the previous observation to determine when active set of thresholds were initially met. -func thresholdsFirstObservedAt(thresholds []evictionapi.Threshold, lastObservedAt thresholdsObservedAt, now time.Time) thresholdsObservedAt { - results := thresholdsObservedAt{} - for i := range thresholds { - observedAt, found := lastObservedAt[thresholds[i]] - if !found { - observedAt = now - } - results[thresholds[i]] = observedAt - } - return results -} - -// thresholdsMetGracePeriod returns the set of thresholds that have satisfied associated grace period -func thresholdsMetGracePeriod(observedAt thresholdsObservedAt, now time.Time) []evictionapi.Threshold { - results := []evictionapi.Threshold{} - for threshold, at := range observedAt { - duration := now.Sub(at) - if duration < threshold.GracePeriod { - glog.V(2).Infof("eviction manager: eviction criteria not yet met for %v, duration: %v", formatThreshold(threshold), duration) - continue - } - results = append(results, threshold) - } - return results -} - -// nodeConditions returns the set of node conditions associated with a threshold -func nodeConditions(thresholds []evictionapi.Threshold) []v1.NodeConditionType { - results := []v1.NodeConditionType{} - for _, threshold := range thresholds { - if nodeCondition, found := signalToNodeCondition[threshold.Signal]; found { - if !hasNodeCondition(results, nodeCondition) { - results = append(results, nodeCondition) - } - } - } - return results -} - -// nodeConditionsLastObservedAt merges the input with the previous observation to determine when a condition was most recently met. -func nodeConditionsLastObservedAt(nodeConditions []v1.NodeConditionType, lastObservedAt nodeConditionsObservedAt, now time.Time) nodeConditionsObservedAt { - results := nodeConditionsObservedAt{} - // the input conditions were observed "now" - for i := range nodeConditions { - results[nodeConditions[i]] = now - } - // the conditions that were not observed now are merged in with their old time - for key, value := range lastObservedAt { - _, found := results[key] - if !found { - results[key] = value - } - } - return results -} - -// nodeConditionsObservedSince returns the set of conditions that have been observed within the specified period -func nodeConditionsObservedSince(observedAt nodeConditionsObservedAt, period time.Duration, now time.Time) []v1.NodeConditionType { - results := []v1.NodeConditionType{} - for nodeCondition, at := range observedAt { - duration := now.Sub(at) - if duration < period { - results = append(results, nodeCondition) - } - } - return results -} - -// hasFsStatsType returns true if the fsStat is in the input list -func hasFsStatsType(inputs []fsStatsType, item fsStatsType) bool { - for _, input := range inputs { - if input == item { - return true - } - } - return false -} - -// hasNodeCondition returns true if the node condition is in the input list -func hasNodeCondition(inputs []v1.NodeConditionType, item v1.NodeConditionType) bool { - for _, input := range inputs { - if input == item { - return true - } - } - return false -} - -// mergeThresholds will merge both threshold lists eliminating duplicates. -func mergeThresholds(inputsA []evictionapi.Threshold, inputsB []evictionapi.Threshold) []evictionapi.Threshold { - results := inputsA - for _, threshold := range inputsB { - if !hasThreshold(results, threshold) { - results = append(results, threshold) - } - } - return results -} - -// hasThreshold returns true if the threshold is in the input list -func hasThreshold(inputs []evictionapi.Threshold, item evictionapi.Threshold) bool { - for _, input := range inputs { - if input.GracePeriod == item.GracePeriod && input.Operator == item.Operator && input.Signal == item.Signal && compareThresholdValue(input.Value, item.Value) { - return true - } - } - return false -} - -// compareThresholdValue returns true if the two thresholdValue objects are logically the same -func compareThresholdValue(a evictionapi.ThresholdValue, b evictionapi.ThresholdValue) bool { - if a.Quantity != nil { - if b.Quantity == nil { - return false - } - return a.Quantity.Cmp(*b.Quantity) == 0 - } - if b.Quantity != nil { - return false - } - return a.Percentage == b.Percentage -} - -// isHardEvictionThreshold returns true if eviction should immediately occur -func isHardEvictionThreshold(threshold evictionapi.Threshold) bool { - return threshold.GracePeriod == time.Duration(0) -} - -func isAllocatableEvictionThreshold(threshold evictionapi.Threshold) bool { - return threshold.Signal == evictionapi.SignalAllocatableMemoryAvailable -} - -// buildSignalToRankFunc returns ranking functions associated with resources -func buildSignalToRankFunc(withImageFs bool) map[evictionapi.Signal]rankFunc { - signalToRankFunc := map[evictionapi.Signal]rankFunc{ - evictionapi.SignalMemoryAvailable: rankMemoryPressure, - evictionapi.SignalAllocatableMemoryAvailable: rankMemoryPressure, - } - // usage of an imagefs is optional - if withImageFs { - // with an imagefs, nodefs pod rank func for eviction only includes logs and local volumes - signalToRankFunc[evictionapi.SignalNodeFsAvailable] = rankDiskPressureFunc([]fsStatsType{fsStatsLogs, fsStatsLocalVolumeSource}, v1.ResourceEphemeralStorage) - signalToRankFunc[evictionapi.SignalNodeFsInodesFree] = rankDiskPressureFunc([]fsStatsType{fsStatsLogs, fsStatsLocalVolumeSource}, resourceInodes) - // with an imagefs, imagefs pod rank func for eviction only includes rootfs - signalToRankFunc[evictionapi.SignalImageFsAvailable] = rankDiskPressureFunc([]fsStatsType{fsStatsRoot}, v1.ResourceEphemeralStorage) - signalToRankFunc[evictionapi.SignalImageFsInodesFree] = rankDiskPressureFunc([]fsStatsType{fsStatsRoot}, resourceInodes) - } else { - // without an imagefs, nodefs pod rank func for eviction looks at all fs stats. - // since imagefs and nodefs share a common device, they share common ranking functions. - signalToRankFunc[evictionapi.SignalNodeFsAvailable] = rankDiskPressureFunc([]fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource}, v1.ResourceEphemeralStorage) - signalToRankFunc[evictionapi.SignalNodeFsInodesFree] = rankDiskPressureFunc([]fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource}, resourceInodes) - signalToRankFunc[evictionapi.SignalImageFsAvailable] = rankDiskPressureFunc([]fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource}, v1.ResourceEphemeralStorage) - signalToRankFunc[evictionapi.SignalImageFsInodesFree] = rankDiskPressureFunc([]fsStatsType{fsStatsRoot, fsStatsLogs, fsStatsLocalVolumeSource}, resourceInodes) - } - return signalToRankFunc -} - -// PodIsEvicted returns true if the reported pod status is due to an eviction. -func PodIsEvicted(podStatus v1.PodStatus) bool { - return podStatus.Phase == v1.PodFailed && podStatus.Reason == Reason -} - -// buildSignalToNodeReclaimFuncs returns reclaim functions associated with resources. -func buildSignalToNodeReclaimFuncs(imageGC ImageGC, containerGC ContainerGC, withImageFs bool) map[evictionapi.Signal]nodeReclaimFuncs { - signalToReclaimFunc := map[evictionapi.Signal]nodeReclaimFuncs{} - // usage of an imagefs is optional - if withImageFs { - // with an imagefs, nodefs pressure should just delete logs - signalToReclaimFunc[evictionapi.SignalNodeFsAvailable] = nodeReclaimFuncs{} - signalToReclaimFunc[evictionapi.SignalNodeFsInodesFree] = nodeReclaimFuncs{} - // with an imagefs, imagefs pressure should delete unused images - signalToReclaimFunc[evictionapi.SignalImageFsAvailable] = nodeReclaimFuncs{containerGC.DeleteAllUnusedContainers, imageGC.DeleteUnusedImages} - signalToReclaimFunc[evictionapi.SignalImageFsInodesFree] = nodeReclaimFuncs{containerGC.DeleteAllUnusedContainers, imageGC.DeleteUnusedImages} - } else { - // without an imagefs, nodefs pressure should delete logs, and unused images - // since imagefs and nodefs share a common device, they share common reclaim functions - signalToReclaimFunc[evictionapi.SignalNodeFsAvailable] = nodeReclaimFuncs{containerGC.DeleteAllUnusedContainers, imageGC.DeleteUnusedImages} - signalToReclaimFunc[evictionapi.SignalNodeFsInodesFree] = nodeReclaimFuncs{containerGC.DeleteAllUnusedContainers, imageGC.DeleteUnusedImages} - signalToReclaimFunc[evictionapi.SignalImageFsAvailable] = nodeReclaimFuncs{containerGC.DeleteAllUnusedContainers, imageGC.DeleteUnusedImages} - signalToReclaimFunc[evictionapi.SignalImageFsInodesFree] = nodeReclaimFuncs{containerGC.DeleteAllUnusedContainers, imageGC.DeleteUnusedImages} - } - return signalToReclaimFunc -} - -// evictionMessage constructs a useful message about why an eviction occurred, and annotations to provide metadata about the eviction -func evictionMessage(resourceToReclaim v1.ResourceName, pod *v1.Pod, stats statsFunc) (message string, annotations map[string]string) { - annotations = make(map[string]string) - message = fmt.Sprintf(nodeLowMessageFmt, resourceToReclaim) - containers := []string{} - containerUsage := []string{} - podStats, ok := stats(pod) - if !ok { - return - } - for _, containerStats := range podStats.Containers { - for _, container := range pod.Spec.Containers { - if container.Name == containerStats.Name { - requests := container.Resources.Requests[resourceToReclaim] - var usage *resource.Quantity - switch resourceToReclaim { - case v1.ResourceEphemeralStorage: - if containerStats.Rootfs != nil && containerStats.Rootfs.UsedBytes != nil && containerStats.Logs != nil && containerStats.Logs.UsedBytes != nil { - usage = resource.NewQuantity(int64(*containerStats.Rootfs.UsedBytes+*containerStats.Logs.UsedBytes), resource.BinarySI) - } - case v1.ResourceMemory: - if containerStats.Memory != nil && containerStats.Memory.WorkingSetBytes != nil { - usage = resource.NewQuantity(int64(*containerStats.Memory.WorkingSetBytes), resource.BinarySI) - } - } - if usage != nil && usage.Cmp(requests) > 0 { - message += fmt.Sprintf(containerMessageFmt, container.Name, usage.String(), requests.String()) - containers = append(containers, container.Name) - containerUsage = append(containerUsage, usage.String()) - } - } - } - } - annotations[OffendingContainersKey] = strings.Join(containers, ",") - annotations[OffendingContainersUsageKey] = strings.Join(containerUsage, ",") - annotations[StarvedResourceKey] = string(resourceToReclaim) - return -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go deleted file mode 100644 index 8d86944f..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/memory_threshold_notifier.go +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 eviction - -import ( - "fmt" - "time" - - "github.com/golang/glog" - - "k8s.io/apimachinery/pkg/api/resource" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/cm" - evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" -) - -const ( - memoryUsageAttribute = "memory.usage_in_bytes" - // this prevents constantly updating the memcg notifier if synchronize - // is run frequently. - notifierRefreshInterval = 10 * time.Second -) - -type memoryThresholdNotifier struct { - threshold evictionapi.Threshold - cgroupPath string - events chan struct{} - factory NotifierFactory - handler func(string) - notifier CgroupNotifier -} - -var _ ThresholdNotifier = &memoryThresholdNotifier{} - -// NewMemoryThresholdNotifier creates a ThresholdNotifier which is designed to respond to the given threshold. -// UpdateThreshold must be called once before the threshold will be active. -func NewMemoryThresholdNotifier(threshold evictionapi.Threshold, cgroupRoot string, factory NotifierFactory, handler func(string)) (ThresholdNotifier, error) { - cgroups, err := cm.GetCgroupSubsystems() - if err != nil { - return nil, err - } - cgpath, found := cgroups.MountPoints["memory"] - if !found || len(cgpath) == 0 { - return nil, fmt.Errorf("memory cgroup mount point not found") - } - if isAllocatableEvictionThreshold(threshold) { - // for allocatable thresholds, point the cgroup notifier at the allocatable cgroup - cgpath += cgroupRoot - } - return &memoryThresholdNotifier{ - threshold: threshold, - cgroupPath: cgpath, - events: make(chan struct{}), - handler: handler, - factory: factory, - }, nil -} - -func (m *memoryThresholdNotifier) Start() { - glog.Infof("eviction manager: created %s", m.Description()) - for range m.events { - m.handler(fmt.Sprintf("eviction manager: %s crossed", m.Description())) - } -} - -func (m *memoryThresholdNotifier) UpdateThreshold(summary *statsapi.Summary) error { - memoryStats := summary.Node.Memory - if isAllocatableEvictionThreshold(m.threshold) { - allocatableContainer, err := getSysContainer(summary.Node.SystemContainers, statsapi.SystemContainerPods) - if err != nil { - return err - } - memoryStats = allocatableContainer.Memory - } - if memoryStats == nil || memoryStats.UsageBytes == nil || memoryStats.WorkingSetBytes == nil || memoryStats.AvailableBytes == nil { - return fmt.Errorf("summary was incomplete. Expected MemoryStats and all subfields to be non-nil, but got %+v", memoryStats) - } - // Set threshold on usage to capacity - eviction_hard + inactive_file, - // since we want to be notified when working_set = capacity - eviction_hard - inactiveFile := resource.NewQuantity(int64(*memoryStats.UsageBytes-*memoryStats.WorkingSetBytes), resource.BinarySI) - capacity := resource.NewQuantity(int64(*memoryStats.AvailableBytes+*memoryStats.WorkingSetBytes), resource.BinarySI) - evictionThresholdQuantity := evictionapi.GetThresholdQuantity(m.threshold.Value, capacity) - memcgThreshold := capacity.DeepCopy() - memcgThreshold.Sub(*evictionThresholdQuantity) - memcgThreshold.Add(*inactiveFile) - - glog.V(3).Infof("eviction manager: setting %s to %s\n", m.Description(), memcgThreshold.String()) - if m.notifier != nil { - m.notifier.Stop() - } - newNotifier, err := m.factory.NewCgroupNotifier(m.cgroupPath, memoryUsageAttribute, memcgThreshold.Value()) - if err != nil { - return err - } - m.notifier = newNotifier - go m.notifier.Start(m.events) - return nil -} - -func (m *memoryThresholdNotifier) Description() string { - var hard, allocatable string - if isHardEvictionThreshold(m.threshold) { - hard = "hard " - } else { - hard = "soft " - } - if isAllocatableEvictionThreshold(m.threshold) { - allocatable = "allocatable " - } - return fmt.Sprintf("%s%smemory eviction threshold", hard, allocatable) -} - -var _ NotifierFactory = &CgroupNotifierFactory{} - -// CgroupNotifierFactory knows how to make CgroupNotifiers which integrate with the kernel -type CgroupNotifierFactory struct{} - -// NewCgroupNotifier implements the NotifierFactory interface -func (n *CgroupNotifierFactory) NewCgroupNotifier(path, attribute string, threshold int64) (CgroupNotifier, error) { - return NewCgroupNotifier(path, attribute, threshold) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go deleted file mode 100644 index 4fabd734..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_linux.go +++ /dev/null @@ -1,185 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 eviction - -import ( - "fmt" - "sync" - "time" - - "github.com/golang/glog" - "golang.org/x/sys/unix" -) - -const ( - // eventSize is the number of bytes returned by a successful read from an eventfd - // see http://man7.org/linux/man-pages/man2/eventfd.2.html for more information - eventSize = 8 - // numFdEvents is the number of events we can record at once. - // If EpollWait finds more than this, they will be missed. - numFdEvents = 6 -) - -type linuxCgroupNotifier struct { - eventfd int - epfd int - stop chan struct{} - stopLock sync.Mutex -} - -var _ CgroupNotifier = &linuxCgroupNotifier{} - -// NewCgroupNotifier returns a linuxCgroupNotifier, which performs cgroup control operations required -// to receive notifications from the cgroup when the threshold is crossed in either direction. -func NewCgroupNotifier(path, attribute string, threshold int64) (CgroupNotifier, error) { - var watchfd, eventfd, epfd, controlfd int - var err error - watchfd, err = unix.Open(fmt.Sprintf("%s/%s", path, attribute), unix.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer unix.Close(watchfd) - controlfd, err = unix.Open(fmt.Sprintf("%s/cgroup.event_control", path), unix.O_WRONLY, 0) - if err != nil { - return nil, err - } - defer unix.Close(controlfd) - eventfd, err = unix.Eventfd(0, unix.EFD_CLOEXEC) - if err != nil { - return nil, err - } - if eventfd < 0 { - err = fmt.Errorf("eventfd call failed") - return nil, err - } - defer func() { - // Close eventfd if we get an error later in initialization - if err != nil { - unix.Close(eventfd) - } - }() - epfd, err = unix.EpollCreate1(0) - if err != nil { - return nil, err - } - if epfd < 0 { - err = fmt.Errorf("EpollCreate1 call failed") - return nil, err - } - defer func() { - // Close epfd if we get an error later in initialization - if err != nil { - unix.Close(epfd) - } - }() - config := fmt.Sprintf("%d %d %d", eventfd, watchfd, threshold) - _, err = unix.Write(controlfd, []byte(config)) - if err != nil { - return nil, err - } - return &linuxCgroupNotifier{ - eventfd: eventfd, - epfd: epfd, - stop: make(chan struct{}), - }, nil -} - -func (n *linuxCgroupNotifier) Start(eventCh chan<- struct{}) { - err := unix.EpollCtl(n.epfd, unix.EPOLL_CTL_ADD, n.eventfd, &unix.EpollEvent{ - Fd: int32(n.eventfd), - Events: unix.EPOLLIN, - }) - if err != nil { - glog.Warningf("eviction manager: error adding epoll eventfd: %v", err) - return - } - for { - select { - case <-n.stop: - return - default: - } - event, err := wait(n.epfd, n.eventfd, notifierRefreshInterval) - if err != nil { - glog.Warningf("eviction manager: error while waiting for memcg events: %v", err) - return - } else if !event { - // Timeout on wait. This is expected if the threshold was not crossed - continue - } - // Consume the event from the eventfd - buf := make([]byte, eventSize) - _, err = unix.Read(n.eventfd, buf) - if err != nil { - glog.Warningf("eviction manager: error reading memcg events: %v", err) - return - } - eventCh <- struct{}{} - } -} - -// wait waits up to notifierRefreshInterval for an event on the Epoll FD for the -// eventfd we are concerned about. It returns an error if one occurrs, and true -// if the consumer should read from the eventfd. -func wait(epfd, eventfd int, timeout time.Duration) (bool, error) { - events := make([]unix.EpollEvent, numFdEvents+1) - timeoutMS := int(timeout / time.Millisecond) - n, err := unix.EpollWait(epfd, events, timeoutMS) - if n == -1 { - if err == unix.EINTR { - // Interrupt, ignore the error - return false, nil - } - return false, err - } - if n == 0 { - // Timeout - return false, nil - } - if n > numFdEvents { - return false, fmt.Errorf("epoll_wait returned more events than we know what to do with") - } - for _, event := range events[:n] { - if event.Fd == int32(eventfd) { - if event.Events&unix.EPOLLHUP != 0 || event.Events&unix.EPOLLERR != 0 || event.Events&unix.EPOLLIN != 0 { - // EPOLLHUP: should not happen, but if it does, treat it as a wakeup. - - // EPOLLERR: If an error is waiting on the file descriptor, we should pretend - // something is ready to read, and let unix.Read pick up the error. - - // EPOLLIN: There is data to read. - return true, nil - } - } - } - // An event occurred that we don't care about. - return false, nil -} - -func (n *linuxCgroupNotifier) Stop() { - n.stopLock.Lock() - defer n.stopLock.Unlock() - select { - case <-n.stop: - // the linuxCgroupNotifier is already stopped - return - default: - } - unix.Close(n.eventfd) - unix.Close(n.epfd) - close(n.stop) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go deleted file mode 100644 index 7078c786..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/threshold_notifier_unsupported.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build !linux - -/* -Copyright 2016 The Kubernetes Authors. - -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 eviction - -import "github.com/golang/glog" - -// NewCgroupNotifier creates a cgroup notifier that does nothing because cgroups do not exist on non-linux systems. -func NewCgroupNotifier(path, attribute string, threshold int64) (CgroupNotifier, error) { - glog.V(5).Infof("cgroup notifications not supported") - return &unsupportedThresholdNotifier{}, nil -} - -type unsupportedThresholdNotifier struct{} - -func (*unsupportedThresholdNotifier) Start(_ chan<- struct{}) {} - -func (*unsupportedThresholdNotifier) Stop() {} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/types.go deleted file mode 100644 index d78e7e06..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/eviction/types.go +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 eviction - -import ( - "time" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api" -) - -// fsStatsType defines the types of filesystem stats to collect. -type fsStatsType string - -const ( - // fsStatsLocalVolumeSource identifies stats for pod local volume sources. - fsStatsLocalVolumeSource fsStatsType = "localVolumeSource" - // fsStatsLogs identifies stats for pod logs. - fsStatsLogs fsStatsType = "logs" - // fsStatsRoot identifies stats for pod container writable layers. - fsStatsRoot fsStatsType = "root" -) - -// Config holds information about how eviction is configured. -type Config struct { - // PressureTransitionPeriod is duration the kubelet has to wait before transititioning out of a pressure condition. - PressureTransitionPeriod time.Duration - // Maximum allowed grace period (in seconds) to use when terminating pods in response to a soft eviction threshold being met. - MaxPodGracePeriodSeconds int64 - // Thresholds define the set of conditions monitored to trigger eviction. - Thresholds []evictionapi.Threshold - // KernelMemcgNotification if true will integrate with the kernel memcg notification to determine if memory thresholds are crossed. - KernelMemcgNotification bool - // PodCgroupRoot is the cgroup which contains all pods. - PodCgroupRoot string -} - -// Manager evaluates when an eviction threshold for node stability has been met on the node. -type Manager interface { - // Start starts the control loop to monitor eviction thresholds at specified interval. - Start(diskInfoProvider DiskInfoProvider, podFunc ActivePodsFunc, podCleanedUpFunc PodCleanedUpFunc, monitoringInterval time.Duration) - - // IsUnderMemoryPressure returns true if the node is under memory pressure. - IsUnderMemoryPressure() bool - - // IsUnderDiskPressure returns true if the node is under disk pressure. - IsUnderDiskPressure() bool - - // IsUnderPIDPressure returns true if the node is under PID pressure. - IsUnderPIDPressure() bool -} - -// DiskInfoProvider is responsible for informing the manager how disk is configured. -type DiskInfoProvider interface { - // HasDedicatedImageFs returns true if the imagefs is on a separate device from the rootfs. - HasDedicatedImageFs() (bool, error) -} - -// ImageGC is responsible for performing garbage collection of unused images. -type ImageGC interface { - // DeleteUnusedImages deletes unused images. - DeleteUnusedImages() error -} - -// ContainerGC is responsible for performing garbage collection of unused containers. -type ContainerGC interface { - // DeleteAllUnusedContainers deletes all unused containers, even those that belong to pods that are terminated, but not deleted. - DeleteAllUnusedContainers() error -} - -// KillPodFunc kills a pod. -// The pod status is updated, and then it is killed with the specified grace period. -// This function must block until either the pod is killed or an error is encountered. -// Arguments: -// pod - the pod to kill -// status - the desired status to associate with the pod (i.e. why its killed) -// gracePeriodOverride - the grace period override to use instead of what is on the pod spec -type KillPodFunc func(pod *v1.Pod, status v1.PodStatus, gracePeriodOverride *int64) error - -// ActivePodsFunc returns pods bound to the kubelet that are active (i.e. non-terminal state) -type ActivePodsFunc func() []*v1.Pod - -// PodCleanedUpFunc returns true if all resources associated with a pod have been reclaimed. -type PodCleanedUpFunc func(*v1.Pod) bool - -// statsFunc returns the usage stats if known for an input pod. -type statsFunc func(pod *v1.Pod) (statsapi.PodStats, bool) - -// rankFunc sorts the pods in eviction order -type rankFunc func(pods []*v1.Pod, stats statsFunc) - -// signalObservation is the observed resource usage -type signalObservation struct { - // The resource capacity - capacity *resource.Quantity - // The available resource - available *resource.Quantity - // Time at which the observation was taken - time metav1.Time -} - -// signalObservations maps a signal to an observed quantity -type signalObservations map[evictionapi.Signal]signalObservation - -// thresholdsObservedAt maps a threshold to a time that it was observed -type thresholdsObservedAt map[evictionapi.Threshold]time.Time - -// nodeConditionsObservedAt maps a node condition to a time that it was observed -type nodeConditionsObservedAt map[v1.NodeConditionType]time.Time - -// nodeReclaimFunc is a function that knows how to reclaim a resource from the node without impacting pods. -type nodeReclaimFunc func() error - -// nodeReclaimFuncs is an ordered list of nodeReclaimFunc -type nodeReclaimFuncs []nodeReclaimFunc - -// CgroupNotifier generates events from cgroup events -type CgroupNotifier interface { - // Start causes the CgroupNotifier to begin notifying on the eventCh - Start(eventCh chan<- struct{}) - // Stop stops all processes and cleans up file descriptors associated with the CgroupNotifier - Stop() -} - -// NotifierFactory creates CgroupNotifer -type NotifierFactory interface { - // NewCgroupNotifier creates a CgroupNotifier that creates events when the threshold - // on the attribute in the cgroup specified by the path is crossed. - NewCgroupNotifier(path, attribute string, threshold int64) (CgroupNotifier, error) -} - -// ThresholdNotifier manages CgroupNotifiers based on memory eviction thresholds, and performs a function -// when memory eviction thresholds are crossed -type ThresholdNotifier interface { - // Start calls the notifier function when the CgroupNotifier notifies the ThresholdNotifier that an event occurred - Start() - // UpdateThreshold updates the memory cgroup threshold based on the metrics provided. - // Calling UpdateThreshold with recent metrics allows the ThresholdNotifier to trigger at the - // eviction threshold more accurately - UpdateThreshold(summary *statsapi.Summary) error - // Description produces a relevant string describing the Memory Threshold Notifier - Description() string -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD index f0baa3a3..5f5594b3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/images/BUILD @@ -23,14 +23,14 @@ go_library( "//pkg/kubelet/events:go_default_library", "//pkg/kubelet/util/sliceutils:go_default_library", "//pkg/util/parsers:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/github.com/docker/distribution/reference:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ], ) @@ -46,13 +46,13 @@ go_test( "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/container/testing:go_default_library", "//pkg/kubelet/server/stats/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go index 42dee55d..2c58cb1c 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/images/image_gc_manager.go @@ -401,9 +401,8 @@ func (ev byLastUsedAndDetected) Less(i, j int) bool { // Sort by last used, break ties by detected. if ev[i].lastUsed.Equal(ev[j].lastUsed) { return ev[i].firstDetected.Before(ev[j].firstDetected) - } else { - return ev[i].lastUsed.Before(ev[j].lastUsed) } + return ev[i].lastUsed.Before(ev[j].lastUsed) } func isImageUsed(imageID string, imagesInUse sets.String) bool { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go deleted file mode 100644 index 33f51997..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go +++ /dev/null @@ -1,2197 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 kubelet - -import ( - "context" - "crypto/tls" - "fmt" - "math" - "net" - "net/http" - "net/url" - "os" - "path" - "sort" - "sync" - "sync/atomic" - "time" - - "github.com/golang/glog" - - cadvisorapi "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/clock" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" - utilfeature "k8s.io/apiserver/pkg/util/feature" - clientset "k8s.io/client-go/kubernetes" - v1core "k8s.io/client-go/kubernetes/typed/core/v1" - corelisters "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/tools/cache" - "k8s.io/client-go/tools/record" - "k8s.io/client-go/util/certificate" - "k8s.io/client-go/util/flowcontrol" - "k8s.io/client-go/util/integer" - api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/features" - internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri" - kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/cadvisor" - kubeletcertificate "k8s.io/kubernetes/pkg/kubelet/certificate" - "k8s.io/kubernetes/pkg/kubelet/checkpointmanager" - "k8s.io/kubernetes/pkg/kubelet/cm" - "k8s.io/kubernetes/pkg/kubelet/config" - "k8s.io/kubernetes/pkg/kubelet/configmap" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/dockershim" - dockerremote "k8s.io/kubernetes/pkg/kubelet/dockershim/remote" - "k8s.io/kubernetes/pkg/kubelet/events" - "k8s.io/kubernetes/pkg/kubelet/eviction" - "k8s.io/kubernetes/pkg/kubelet/images" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/kuberuntime" - "k8s.io/kubernetes/pkg/kubelet/lifecycle" - "k8s.io/kubernetes/pkg/kubelet/logs" - "k8s.io/kubernetes/pkg/kubelet/metrics" - "k8s.io/kubernetes/pkg/kubelet/metrics/collectors" - "k8s.io/kubernetes/pkg/kubelet/network/dns" - "k8s.io/kubernetes/pkg/kubelet/pleg" - kubepod "k8s.io/kubernetes/pkg/kubelet/pod" - "k8s.io/kubernetes/pkg/kubelet/preemption" - "k8s.io/kubernetes/pkg/kubelet/prober" - proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results" - "k8s.io/kubernetes/pkg/kubelet/remote" - "k8s.io/kubernetes/pkg/kubelet/secret" - "k8s.io/kubernetes/pkg/kubelet/server" - serverstats "k8s.io/kubernetes/pkg/kubelet/server/stats" - "k8s.io/kubernetes/pkg/kubelet/server/streaming" - "k8s.io/kubernetes/pkg/kubelet/stats" - "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/sysctl" - "k8s.io/kubernetes/pkg/kubelet/token" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/kubelet/util/manager" - "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher" - "k8s.io/kubernetes/pkg/kubelet/util/queue" - "k8s.io/kubernetes/pkg/kubelet/util/sliceutils" - "k8s.io/kubernetes/pkg/kubelet/volumemanager" - "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" - "k8s.io/kubernetes/pkg/security/apparmor" - sysctlwhitelist "k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl" - utildbus "k8s.io/kubernetes/pkg/util/dbus" - kubeio "k8s.io/kubernetes/pkg/util/io" - utilipt "k8s.io/kubernetes/pkg/util/iptables" - "k8s.io/kubernetes/pkg/util/mount" - nodeutil "k8s.io/kubernetes/pkg/util/node" - "k8s.io/kubernetes/pkg/util/oom" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/csi" - utilexec "k8s.io/utils/exec" -) - -const ( - // Max amount of time to wait for the container runtime to come up. - maxWaitForContainerRuntime = 30 * time.Second - - // nodeStatusUpdateRetry specifies how many times kubelet retries when posting node status failed. - nodeStatusUpdateRetry = 5 - - // ContainerLogsDir is the location of container logs. - ContainerLogsDir = "/var/log/containers" - - // MaxContainerBackOff is the max backoff period, exported for the e2e test - MaxContainerBackOff = 300 * time.Second - - // Capacity of the channel for storing pods to kill. A small number should - // suffice because a goroutine is dedicated to check the channel and does - // not block on anything else. - podKillingChannelCapacity = 50 - - // Period for performing global cleanup tasks. - housekeepingPeriod = time.Second * 2 - - // Period for performing eviction monitoring. - // TODO ensure this is in sync with internal cadvisor housekeeping. - evictionMonitoringPeriod = time.Second * 10 - - // The path in containers' filesystems where the hosts file is mounted. - etcHostsPath = "/etc/hosts" - - // Capacity of the channel for receiving pod lifecycle events. This number - // is a bit arbitrary and may be adjusted in the future. - plegChannelCapacity = 1000 - - // Generic PLEG relies on relisting for discovering container events. - // A longer period means that kubelet will take longer to detect container - // changes and to update pod status. On the other hand, a shorter period - // will cause more frequent relisting (e.g., container runtime operations), - // leading to higher cpu usage. - // Note that even though we set the period to 1s, the relisting itself can - // take more than 1s to finish if the container runtime responds slowly - // and/or when there are many container changes in one cycle. - plegRelistPeriod = time.Second * 1 - - // backOffPeriod is the period to back off when pod syncing results in an - // error. It is also used as the base period for the exponential backoff - // container restarts and image pulls. - backOffPeriod = time.Second * 10 - - // ContainerGCPeriod is the period for performing container garbage collection. - ContainerGCPeriod = time.Minute - // ImageGCPeriod is the period for performing image garbage collection. - ImageGCPeriod = 5 * time.Minute - - // Minimum number of dead containers to keep in a pod - minDeadContainerInPod = 1 -) - -// SyncHandler is an interface implemented by Kubelet, for testability -type SyncHandler interface { - HandlePodAdditions(pods []*v1.Pod) - HandlePodUpdates(pods []*v1.Pod) - HandlePodRemoves(pods []*v1.Pod) - HandlePodReconcile(pods []*v1.Pod) - HandlePodSyncs(pods []*v1.Pod) - HandlePodCleanups() error -} - -// Option is a functional option type for Kubelet -type Option func(*Kubelet) - -// Bootstrap is a bootstrapping interface for kubelet, targets the initialization protocol -type Bootstrap interface { - GetConfiguration() kubeletconfiginternal.KubeletConfiguration - BirthCry() - StartGarbageCollection() - ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableDebuggingHandlers, enableContentionProfiling bool) - ListenAndServeReadOnly(address net.IP, port uint) - Run(<-chan kubetypes.PodUpdate) - RunOnce(<-chan kubetypes.PodUpdate) ([]RunPodResult, error) -} - -// Builder creates and initializes a Kubelet instance -type Builder func(kubeCfg *kubeletconfiginternal.KubeletConfiguration, - kubeDeps *Dependencies, - crOptions *config.ContainerRuntimeOptions, - containerRuntime string, - runtimeCgroups string, - hostnameOverride string, - nodeIP string, - providerID string, - cloudProvider string, - certDirectory string, - rootDirectory string, - registerNode bool, - registerWithTaints []api.Taint, - allowedUnsafeSysctls []string, - remoteRuntimeEndpoint string, - remoteImageEndpoint string, - experimentalMounterPath string, - experimentalKernelMemcgNotification bool, - experimentalCheckNodeCapabilitiesBeforeMount bool, - experimentalNodeAllocatableIgnoreEvictionThreshold bool, - minimumGCAge metav1.Duration, - maxPerPodContainerCount int32, - maxContainerCount int32, - masterServiceNamespace string, - registerSchedulable bool, - nonMasqueradeCIDR string, - keepTerminatedPodVolumes bool, - nodeLabels map[string]string, - seccompProfileRoot string, - bootstrapCheckpointPath string, - nodeStatusMaxImages int32) (Bootstrap, error) - -// Dependencies is a bin for things we might consider "injected dependencies" -- objects constructed -// at runtime that are necessary for running the Kubelet. This is a temporary solution for grouping -// these objects while we figure out a more comprehensive dependency injection story for the Kubelet. -type Dependencies struct { - Options []Option - - // Injected Dependencies - Auth server.AuthInterface - CAdvisorInterface cadvisor.Interface - Cloud cloudprovider.Interface - ContainerManager cm.ContainerManager - DockerClientConfig *dockershim.ClientConfig - EventClient v1core.EventsGetter - HeartbeatClient v1core.CoreV1Interface - OnHeartbeatFailure func() - KubeClient clientset.Interface - ExternalKubeClient clientset.Interface - Mounter mount.Interface - OOMAdjuster *oom.OOMAdjuster - OSInterface kubecontainer.OSInterface - PodConfig *config.PodConfig - Recorder record.EventRecorder - Writer kubeio.Writer - VolumePlugins []volume.VolumePlugin - DynamicPluginProber volume.DynamicPluginProber - TLSOptions *server.TLSOptions - KubeletConfigController *kubeletconfig.Controller -} - -// makePodSourceConfig creates a config.PodConfig from the given -// KubeletConfiguration or returns an error. -func makePodSourceConfig(kubeCfg *kubeletconfiginternal.KubeletConfiguration, kubeDeps *Dependencies, nodeName types.NodeName, bootstrapCheckpointPath string) (*config.PodConfig, error) { - manifestURLHeader := make(http.Header) - if len(kubeCfg.StaticPodURLHeader) > 0 { - for k, v := range kubeCfg.StaticPodURLHeader { - for i := range v { - manifestURLHeader.Add(k, v[i]) - } - } - } - - // source of all configuration - cfg := config.NewPodConfig(config.PodConfigNotificationIncremental, kubeDeps.Recorder) - - // define file config source - if kubeCfg.StaticPodPath != "" { - glog.Infof("Adding pod path: %v", kubeCfg.StaticPodPath) - config.NewSourceFile(kubeCfg.StaticPodPath, nodeName, kubeCfg.FileCheckFrequency.Duration, cfg.Channel(kubetypes.FileSource)) - } - - // define url config source - if kubeCfg.StaticPodURL != "" { - glog.Infof("Adding pod url %q with HTTP header %v", kubeCfg.StaticPodURL, manifestURLHeader) - config.NewSourceURL(kubeCfg.StaticPodURL, manifestURLHeader, nodeName, kubeCfg.HTTPCheckFrequency.Duration, cfg.Channel(kubetypes.HTTPSource)) - } - - // Restore from the checkpoint path - // NOTE: This MUST happen before creating the apiserver source - // below, or the checkpoint would override the source of truth. - - var updatechannel chan<- interface{} - if bootstrapCheckpointPath != "" { - glog.Infof("Adding checkpoint path: %v", bootstrapCheckpointPath) - updatechannel = cfg.Channel(kubetypes.ApiserverSource) - err := cfg.Restore(bootstrapCheckpointPath, updatechannel) - if err != nil { - return nil, err - } - } - - if kubeDeps.KubeClient != nil { - glog.Infof("Watching apiserver") - if updatechannel == nil { - updatechannel = cfg.Channel(kubetypes.ApiserverSource) - } - config.NewSourceApiserver(kubeDeps.KubeClient, nodeName, updatechannel) - } - return cfg, nil -} - -func getRuntimeAndImageServices(remoteRuntimeEndpoint string, remoteImageEndpoint string, runtimeRequestTimeout metav1.Duration) (internalapi.RuntimeService, internalapi.ImageManagerService, error) { - rs, err := remote.NewRemoteRuntimeService(remoteRuntimeEndpoint, runtimeRequestTimeout.Duration) - if err != nil { - return nil, nil, err - } - is, err := remote.NewRemoteImageService(remoteImageEndpoint, runtimeRequestTimeout.Duration) - if err != nil { - return nil, nil, err - } - return rs, is, err -} - -// NewMainKubelet instantiates a new Kubelet object along with all the required internal modules. -// No initialization of Kubelet and its modules should happen here. -func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, - kubeDeps *Dependencies, - crOptions *config.ContainerRuntimeOptions, - containerRuntime string, - runtimeCgroups string, - hostnameOverride string, - nodeIP string, - providerID string, - cloudProvider string, - certDirectory string, - rootDirectory string, - registerNode bool, - registerWithTaints []api.Taint, - allowedUnsafeSysctls []string, - remoteRuntimeEndpoint string, - remoteImageEndpoint string, - experimentalMounterPath string, - experimentalKernelMemcgNotification bool, - experimentalCheckNodeCapabilitiesBeforeMount bool, - experimentalNodeAllocatableIgnoreEvictionThreshold bool, - minimumGCAge metav1.Duration, - maxPerPodContainerCount int32, - maxContainerCount int32, - masterServiceNamespace string, - registerSchedulable bool, - nonMasqueradeCIDR string, - keepTerminatedPodVolumes bool, - nodeLabels map[string]string, - seccompProfileRoot string, - bootstrapCheckpointPath string, - nodeStatusMaxImages int32) (*Kubelet, error) { - if rootDirectory == "" { - return nil, fmt.Errorf("invalid root directory %q", rootDirectory) - } - if kubeCfg.SyncFrequency.Duration <= 0 { - return nil, fmt.Errorf("invalid sync frequency %d", kubeCfg.SyncFrequency.Duration) - } - - if kubeCfg.MakeIPTablesUtilChains { - if kubeCfg.IPTablesMasqueradeBit > 31 || kubeCfg.IPTablesMasqueradeBit < 0 { - return nil, fmt.Errorf("iptables-masquerade-bit is not valid. Must be within [0, 31]") - } - if kubeCfg.IPTablesDropBit > 31 || kubeCfg.IPTablesDropBit < 0 { - return nil, fmt.Errorf("iptables-drop-bit is not valid. Must be within [0, 31]") - } - if kubeCfg.IPTablesDropBit == kubeCfg.IPTablesMasqueradeBit { - return nil, fmt.Errorf("iptables-masquerade-bit and iptables-drop-bit must be different") - } - } - - hostname := nodeutil.GetHostname(hostnameOverride) - // Query the cloud provider for our node name, default to hostname - nodeName := types.NodeName(hostname) - cloudIPs := []net.IP{} - cloudNames := []string{} - if kubeDeps.Cloud != nil { - var err error - instances, ok := kubeDeps.Cloud.Instances() - if !ok { - return nil, fmt.Errorf("failed to get instances from cloud provider") - } - - nodeName, err = instances.CurrentNodeName(context.TODO(), hostname) - if err != nil { - return nil, fmt.Errorf("error fetching current instance name from cloud provider: %v", err) - } - - glog.V(2).Infof("cloud provider determined current node name to be %s", nodeName) - - if utilfeature.DefaultFeatureGate.Enabled(features.RotateKubeletServerCertificate) { - nodeAddresses, err := instances.NodeAddresses(context.TODO(), nodeName) - if err != nil { - return nil, fmt.Errorf("failed to get the addresses of the current instance from the cloud provider: %v", err) - } - for _, nodeAddress := range nodeAddresses { - switch nodeAddress.Type { - case v1.NodeExternalIP, v1.NodeInternalIP: - ip := net.ParseIP(nodeAddress.Address) - if ip != nil && !ip.IsLoopback() { - cloudIPs = append(cloudIPs, ip) - } - case v1.NodeExternalDNS, v1.NodeInternalDNS, v1.NodeHostName: - cloudNames = append(cloudNames, nodeAddress.Address) - } - } - } - - } - - if kubeDeps.PodConfig == nil { - var err error - kubeDeps.PodConfig, err = makePodSourceConfig(kubeCfg, kubeDeps, nodeName, bootstrapCheckpointPath) - if err != nil { - return nil, err - } - } - - containerGCPolicy := kubecontainer.ContainerGCPolicy{ - MinAge: minimumGCAge.Duration, - MaxPerPodContainer: int(maxPerPodContainerCount), - MaxContainers: int(maxContainerCount), - } - - daemonEndpoints := &v1.NodeDaemonEndpoints{ - KubeletEndpoint: v1.DaemonEndpoint{Port: kubeCfg.Port}, - } - - imageGCPolicy := images.ImageGCPolicy{ - MinAge: kubeCfg.ImageMinimumGCAge.Duration, - HighThresholdPercent: int(kubeCfg.ImageGCHighThresholdPercent), - LowThresholdPercent: int(kubeCfg.ImageGCLowThresholdPercent), - } - - enforceNodeAllocatable := kubeCfg.EnforceNodeAllocatable - if experimentalNodeAllocatableIgnoreEvictionThreshold { - // Do not provide kubeCfg.EnforceNodeAllocatable to eviction threshold parsing if we are not enforcing Evictions - enforceNodeAllocatable = []string{} - } - thresholds, err := eviction.ParseThresholdConfig(enforceNodeAllocatable, kubeCfg.EvictionHard, kubeCfg.EvictionSoft, kubeCfg.EvictionSoftGracePeriod, kubeCfg.EvictionMinimumReclaim) - if err != nil { - return nil, err - } - evictionConfig := eviction.Config{ - PressureTransitionPeriod: kubeCfg.EvictionPressureTransitionPeriod.Duration, - MaxPodGracePeriodSeconds: int64(kubeCfg.EvictionMaxPodGracePeriod), - Thresholds: thresholds, - KernelMemcgNotification: experimentalKernelMemcgNotification, - PodCgroupRoot: kubeDeps.ContainerManager.GetPodCgroupRoot(), - } - - serviceIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) - if kubeDeps.KubeClient != nil { - serviceLW := cache.NewListWatchFromClient(kubeDeps.KubeClient.CoreV1().RESTClient(), "services", metav1.NamespaceAll, fields.Everything()) - r := cache.NewReflector(serviceLW, &v1.Service{}, serviceIndexer, 0) - go r.Run(wait.NeverStop) - } - serviceLister := corelisters.NewServiceLister(serviceIndexer) - - nodeIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{}) - if kubeDeps.KubeClient != nil { - fieldSelector := fields.Set{api.ObjectNameField: string(nodeName)}.AsSelector() - nodeLW := cache.NewListWatchFromClient(kubeDeps.KubeClient.CoreV1().RESTClient(), "nodes", metav1.NamespaceAll, fieldSelector) - r := cache.NewReflector(nodeLW, &v1.Node{}, nodeIndexer, 0) - go r.Run(wait.NeverStop) - } - nodeInfo := &predicates.CachedNodeInfo{NodeLister: corelisters.NewNodeLister(nodeIndexer)} - - // TODO: get the real node object of ourself, - // and use the real node name and UID. - // TODO: what is namespace for node? - nodeRef := &v1.ObjectReference{ - Kind: "Node", - Name: string(nodeName), - UID: types.UID(nodeName), - Namespace: "", - } - - containerRefManager := kubecontainer.NewRefManager() - - oomWatcher := NewOOMWatcher(kubeDeps.CAdvisorInterface, kubeDeps.Recorder) - - clusterDNS := make([]net.IP, 0, len(kubeCfg.ClusterDNS)) - for _, ipEntry := range kubeCfg.ClusterDNS { - ip := net.ParseIP(ipEntry) - if ip == nil { - glog.Warningf("Invalid clusterDNS ip '%q'", ipEntry) - } else { - clusterDNS = append(clusterDNS, ip) - } - } - httpClient := &http.Client{} - parsedNodeIP := net.ParseIP(nodeIP) - - klet := &Kubelet{ - hostname: hostname, - nodeName: nodeName, - kubeClient: kubeDeps.KubeClient, - heartbeatClient: kubeDeps.HeartbeatClient, - onRepeatedHeartbeatFailure: kubeDeps.OnHeartbeatFailure, - rootDirectory: rootDirectory, - resyncInterval: kubeCfg.SyncFrequency.Duration, - sourcesReady: config.NewSourcesReady(kubeDeps.PodConfig.SeenAllSources), - registerNode: registerNode, - registerWithTaints: registerWithTaints, - registerSchedulable: registerSchedulable, - dnsConfigurer: dns.NewConfigurer(kubeDeps.Recorder, nodeRef, parsedNodeIP, clusterDNS, kubeCfg.ClusterDomain, kubeCfg.ResolverConfig), - serviceLister: serviceLister, - nodeInfo: nodeInfo, - masterServiceNamespace: masterServiceNamespace, - streamingConnectionIdleTimeout: kubeCfg.StreamingConnectionIdleTimeout.Duration, - recorder: kubeDeps.Recorder, - cadvisor: kubeDeps.CAdvisorInterface, - cloud: kubeDeps.Cloud, - externalCloudProvider: cloudprovider.IsExternal(cloudProvider), - providerID: providerID, - nodeRef: nodeRef, - nodeLabels: nodeLabels, - nodeStatusUpdateFrequency: kubeCfg.NodeStatusUpdateFrequency.Duration, - os: kubeDeps.OSInterface, - oomWatcher: oomWatcher, - cgroupsPerQOS: kubeCfg.CgroupsPerQOS, - cgroupRoot: kubeCfg.CgroupRoot, - mounter: kubeDeps.Mounter, - writer: kubeDeps.Writer, - maxPods: int(kubeCfg.MaxPods), - podsPerCore: int(kubeCfg.PodsPerCore), - syncLoopMonitor: atomic.Value{}, - daemonEndpoints: daemonEndpoints, - containerManager: kubeDeps.ContainerManager, - containerRuntimeName: containerRuntime, - redirectContainerStreaming: crOptions.RedirectContainerStreaming, - nodeIP: parsedNodeIP, - nodeIPValidator: validateNodeIP, - clock: clock.RealClock{}, - enableControllerAttachDetach: kubeCfg.EnableControllerAttachDetach, - iptClient: utilipt.New(utilexec.New(), utildbus.New(), utilipt.ProtocolIpv4), - makeIPTablesUtilChains: kubeCfg.MakeIPTablesUtilChains, - iptablesMasqueradeBit: int(kubeCfg.IPTablesMasqueradeBit), - iptablesDropBit: int(kubeCfg.IPTablesDropBit), - experimentalHostUserNamespaceDefaulting: utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalHostUserNamespaceDefaultingGate), - keepTerminatedPodVolumes: keepTerminatedPodVolumes, - nodeStatusMaxImages: nodeStatusMaxImages, - enablePluginsWatcher: utilfeature.DefaultFeatureGate.Enabled(features.KubeletPluginsWatcher), - } - - if klet.cloud != nil { - klet.cloudproviderRequestParallelism = make(chan int, 1) - klet.cloudproviderRequestSync = make(chan int) - // TODO(jchaloup): Make it configurable via --cloud-provider-request-timeout - klet.cloudproviderRequestTimeout = 10 * time.Second - } - - secretManager := secret.NewCachingSecretManager( - kubeDeps.KubeClient, manager.GetObjectTTLFromNodeFunc(klet.GetNode)) - klet.secretManager = secretManager - - configMapManager := configmap.NewCachingConfigMapManager( - kubeDeps.KubeClient, manager.GetObjectTTLFromNodeFunc(klet.GetNode)) - klet.configMapManager = configMapManager - - if klet.experimentalHostUserNamespaceDefaulting { - glog.Infof("Experimental host user namespace defaulting is enabled.") - } - - machineInfo, err := klet.cadvisor.MachineInfo() - if err != nil { - return nil, err - } - klet.machineInfo = machineInfo - - imageBackOff := flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff) - - klet.livenessManager = proberesults.NewManager() - - klet.podCache = kubecontainer.NewCache() - var checkpointManager checkpointmanager.CheckpointManager - if bootstrapCheckpointPath != "" { - checkpointManager, err = checkpointmanager.NewCheckpointManager(bootstrapCheckpointPath) - if err != nil { - return nil, fmt.Errorf("failed to initialize checkpoint manager: %+v", err) - } - } - // podManager is also responsible for keeping secretManager and configMapManager contents up-to-date. - klet.podManager = kubepod.NewBasicPodManager(kubepod.NewBasicMirrorClient(klet.kubeClient), secretManager, configMapManager, checkpointManager) - - if remoteRuntimeEndpoint != "" { - // remoteImageEndpoint is same as remoteRuntimeEndpoint if not explicitly specified - if remoteImageEndpoint == "" { - remoteImageEndpoint = remoteRuntimeEndpoint - } - } - - // TODO: These need to become arguments to a standalone docker shim. - pluginSettings := dockershim.NetworkPluginSettings{ - HairpinMode: kubeletconfiginternal.HairpinMode(kubeCfg.HairpinMode), - NonMasqueradeCIDR: nonMasqueradeCIDR, - PluginName: crOptions.NetworkPluginName, - PluginConfDir: crOptions.CNIConfDir, - PluginBinDirString: crOptions.CNIBinDir, - MTU: int(crOptions.NetworkPluginMTU), - } - - klet.resourceAnalyzer = serverstats.NewResourceAnalyzer(klet, kubeCfg.VolumeStatsAggPeriod.Duration) - - if containerRuntime == "rkt" { - glog.Fatalln("rktnetes has been deprecated in favor of rktlet. Please see https://github.com/kubernetes-incubator/rktlet for more information.") - } - - // if left at nil, that means it is unneeded - var legacyLogProvider kuberuntime.LegacyLogProvider - - switch containerRuntime { - case kubetypes.DockerContainerRuntime: - // Create and start the CRI shim running as a grpc server. - streamingConfig := getStreamingConfig(kubeCfg, kubeDeps, crOptions) - ds, err := dockershim.NewDockerService(kubeDeps.DockerClientConfig, crOptions.PodSandboxImage, streamingConfig, - &pluginSettings, runtimeCgroups, kubeCfg.CgroupDriver, crOptions.DockershimRootDirectory, - crOptions.DockerDisableSharedPID, !crOptions.RedirectContainerStreaming) - if err != nil { - return nil, err - } - if crOptions.RedirectContainerStreaming { - klet.criHandler = ds - } - - // The unix socket for kubelet <-> dockershim communication. - glog.V(5).Infof("RemoteRuntimeEndpoint: %q, RemoteImageEndpoint: %q", - remoteRuntimeEndpoint, - remoteImageEndpoint) - glog.V(2).Infof("Starting the GRPC server for the docker CRI shim.") - server := dockerremote.NewDockerServer(remoteRuntimeEndpoint, ds) - if err := server.Start(); err != nil { - return nil, err - } - - // Create dockerLegacyService when the logging driver is not supported. - supported, err := ds.IsCRISupportedLogDriver() - if err != nil { - return nil, err - } - if !supported { - klet.dockerLegacyService = ds - legacyLogProvider = ds - } - case kubetypes.RemoteContainerRuntime: - // No-op. - break - default: - return nil, fmt.Errorf("unsupported CRI runtime: %q", containerRuntime) - } - runtimeService, imageService, err := getRuntimeAndImageServices(remoteRuntimeEndpoint, remoteImageEndpoint, kubeCfg.RuntimeRequestTimeout) - if err != nil { - return nil, err - } - klet.runtimeService = runtimeService - runtime, err := kuberuntime.NewKubeGenericRuntimeManager( - kubecontainer.FilterEventRecorder(kubeDeps.Recorder), - klet.livenessManager, - seccompProfileRoot, - containerRefManager, - machineInfo, - klet, - kubeDeps.OSInterface, - klet, - httpClient, - imageBackOff, - kubeCfg.SerializeImagePulls, - float32(kubeCfg.RegistryPullQPS), - int(kubeCfg.RegistryBurst), - kubeCfg.CPUCFSQuota, - runtimeService, - imageService, - kubeDeps.ContainerManager.InternalContainerLifecycle(), - legacyLogProvider, - ) - if err != nil { - return nil, err - } - klet.containerRuntime = runtime - klet.streamingRuntime = runtime - klet.runner = runtime - - if cadvisor.UsingLegacyCadvisorStats(containerRuntime, remoteRuntimeEndpoint) { - klet.StatsProvider = stats.NewCadvisorStatsProvider( - klet.cadvisor, - klet.resourceAnalyzer, - klet.podManager, - klet.runtimeCache, - klet.containerRuntime) - } else { - klet.StatsProvider = stats.NewCRIStatsProvider( - klet.cadvisor, - klet.resourceAnalyzer, - klet.podManager, - klet.runtimeCache, - runtimeService, - imageService, - stats.NewLogMetricsService()) - } - - klet.pleg = pleg.NewGenericPLEG(klet.containerRuntime, plegChannelCapacity, plegRelistPeriod, klet.podCache, clock.RealClock{}) - klet.runtimeState = newRuntimeState(maxWaitForContainerRuntime) - klet.runtimeState.addHealthCheck("PLEG", klet.pleg.Healthy) - klet.updatePodCIDR(kubeCfg.PodCIDR) - - // setup containerGC - containerGC, err := kubecontainer.NewContainerGC(klet.containerRuntime, containerGCPolicy, klet.sourcesReady) - if err != nil { - return nil, err - } - klet.containerGC = containerGC - klet.containerDeletor = newPodContainerDeletor(klet.containerRuntime, integer.IntMax(containerGCPolicy.MaxPerPodContainer, minDeadContainerInPod)) - - // setup imageManager - imageManager, err := images.NewImageGCManager(klet.containerRuntime, klet.StatsProvider, kubeDeps.Recorder, nodeRef, imageGCPolicy, crOptions.PodSandboxImage) - if err != nil { - return nil, fmt.Errorf("failed to initialize image manager: %v", err) - } - klet.imageManager = imageManager - - if containerRuntime == kubetypes.RemoteContainerRuntime && utilfeature.DefaultFeatureGate.Enabled(features.CRIContainerLogRotation) { - // setup containerLogManager for CRI container runtime - containerLogManager, err := logs.NewContainerLogManager( - klet.runtimeService, - kubeCfg.ContainerLogMaxSize, - int(kubeCfg.ContainerLogMaxFiles), - ) - if err != nil { - return nil, fmt.Errorf("failed to initialize container log manager: %v", err) - } - klet.containerLogManager = containerLogManager - } else { - klet.containerLogManager = logs.NewStubContainerLogManager() - } - - klet.statusManager = status.NewManager(klet.kubeClient, klet.podManager, klet) - - if kubeCfg.ServerTLSBootstrap && kubeDeps.TLSOptions != nil && utilfeature.DefaultFeatureGate.Enabled(features.RotateKubeletServerCertificate) { - var ( - ips []net.IP - names []string - ) - - // If the address was explicitly configured, use that. Otherwise, try to - // discover addresses from the cloudprovider. Otherwise, make a best guess. - if cfgAddress := net.ParseIP(kubeCfg.Address); cfgAddress != nil && !cfgAddress.IsUnspecified() { - ips = []net.IP{cfgAddress} - names = []string{klet.GetHostname(), hostnameOverride} - } else if len(cloudIPs) != 0 || len(cloudNames) != 0 { - ips = cloudIPs - names = cloudNames - } else { - localIPs, err := allGlobalUnicastIPs() - if err != nil { - return nil, err - } - ips = localIPs - names = []string{klet.GetHostname(), hostnameOverride} - } - - klet.serverCertificateManager, err = kubeletcertificate.NewKubeletServerCertificateManager(klet.kubeClient, kubeCfg, klet.nodeName, ips, names, certDirectory) - if err != nil { - return nil, fmt.Errorf("failed to initialize certificate manager: %v", err) - } - kubeDeps.TLSOptions.Config.GetCertificate = func(*tls.ClientHelloInfo) (*tls.Certificate, error) { - cert := klet.serverCertificateManager.Current() - if cert == nil { - return nil, fmt.Errorf("no serving certificate available for the kubelet") - } - return cert, nil - } - } - - klet.probeManager = prober.NewManager( - klet.statusManager, - klet.livenessManager, - klet.runner, - containerRefManager, - kubeDeps.Recorder) - - tokenManager := token.NewManager(kubeDeps.KubeClient) - - klet.volumePluginMgr, err = - NewInitializedVolumePluginMgr(klet, secretManager, configMapManager, tokenManager, kubeDeps.VolumePlugins, kubeDeps.DynamicPluginProber) - if err != nil { - return nil, err - } - if klet.enablePluginsWatcher { - klet.pluginWatcher = pluginwatcher.NewWatcher(klet.getPluginsDir()) - } - - // If the experimentalMounterPathFlag is set, we do not want to - // check node capabilities since the mount path is not the default - if len(experimentalMounterPath) != 0 { - experimentalCheckNodeCapabilitiesBeforeMount = false - // Replace the nameserver in containerized-mounter's rootfs/etc/resolve.conf with kubelet.ClusterDNS - // so that service name could be resolved - klet.dnsConfigurer.SetupDNSinContainerizedMounter(experimentalMounterPath) - } - - // setup volumeManager - klet.volumeManager = volumemanager.NewVolumeManager( - kubeCfg.EnableControllerAttachDetach, - nodeName, - klet.podManager, - klet.statusManager, - klet.kubeClient, - klet.volumePluginMgr, - klet.containerRuntime, - kubeDeps.Mounter, - klet.getPodsDir(), - kubeDeps.Recorder, - experimentalCheckNodeCapabilitiesBeforeMount, - keepTerminatedPodVolumes) - - runtimeCache, err := kubecontainer.NewRuntimeCache(klet.containerRuntime) - if err != nil { - return nil, err - } - klet.runtimeCache = runtimeCache - klet.reasonCache = NewReasonCache() - klet.workQueue = queue.NewBasicWorkQueue(klet.clock) - klet.podWorkers = newPodWorkers(klet.syncPod, kubeDeps.Recorder, klet.workQueue, klet.resyncInterval, backOffPeriod, klet.podCache) - - klet.backOff = flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff) - klet.podKillingCh = make(chan *kubecontainer.PodPair, podKillingChannelCapacity) - klet.setNodeStatusFuncs = klet.defaultNodeStatusFuncs() - - // setup eviction manager - evictionManager, evictionAdmitHandler := eviction.NewManager(klet.resourceAnalyzer, evictionConfig, killPodNow(klet.podWorkers, kubeDeps.Recorder), klet.imageManager, klet.containerGC, kubeDeps.Recorder, nodeRef, klet.clock) - - klet.evictionManager = evictionManager - klet.admitHandlers.AddPodAdmitHandler(evictionAdmitHandler) - - if utilfeature.DefaultFeatureGate.Enabled(features.Sysctls) { - // add sysctl admission - runtimeSupport, err := sysctl.NewRuntimeAdmitHandler(klet.containerRuntime) - if err != nil { - return nil, err - } - - // Safe, whitelisted sysctls can always be used as unsafe sysctls in the spec. - // Hence, we concatenate those two lists. - safeAndUnsafeSysctls := append(sysctlwhitelist.SafeSysctlWhitelist(), allowedUnsafeSysctls...) - sysctlsWhitelist, err := sysctl.NewWhitelist(safeAndUnsafeSysctls) - if err != nil { - return nil, err - } - klet.admitHandlers.AddPodAdmitHandler(runtimeSupport) - klet.admitHandlers.AddPodAdmitHandler(sysctlsWhitelist) - } - - // enable active deadline handler - activeDeadlineHandler, err := newActiveDeadlineHandler(klet.statusManager, kubeDeps.Recorder, klet.clock) - if err != nil { - return nil, err - } - klet.AddPodSyncLoopHandler(activeDeadlineHandler) - klet.AddPodSyncHandler(activeDeadlineHandler) - - criticalPodAdmissionHandler := preemption.NewCriticalPodAdmissionHandler(klet.GetActivePods, killPodNow(klet.podWorkers, kubeDeps.Recorder), kubeDeps.Recorder) - klet.admitHandlers.AddPodAdmitHandler(lifecycle.NewPredicateAdmitHandler(klet.getNodeAnyWay, criticalPodAdmissionHandler, klet.containerManager.UpdatePluginResources)) - // apply functional Option's - for _, opt := range kubeDeps.Options { - opt(klet) - } - - klet.appArmorValidator = apparmor.NewValidator(containerRuntime) - klet.softAdmitHandlers.AddPodAdmitHandler(lifecycle.NewAppArmorAdmitHandler(klet.appArmorValidator)) - klet.softAdmitHandlers.AddPodAdmitHandler(lifecycle.NewNoNewPrivsAdmitHandler(klet.containerRuntime)) - // Finally, put the most recent version of the config on the Kubelet, so - // people can see how it was configured. - klet.kubeletConfiguration = *kubeCfg - return klet, nil -} - -type serviceLister interface { - List(labels.Selector) ([]*v1.Service, error) -} - -// Kubelet is the main kubelet implementation. -type Kubelet struct { - kubeletConfiguration kubeletconfiginternal.KubeletConfiguration - - hostname string - nodeName types.NodeName - runtimeCache kubecontainer.RuntimeCache - kubeClient clientset.Interface - heartbeatClient v1core.CoreV1Interface - iptClient utilipt.Interface - rootDirectory string - - // onRepeatedHeartbeatFailure is called when a heartbeat operation fails more than once. optional. - onRepeatedHeartbeatFailure func() - - // podWorkers handle syncing Pods in response to events. - podWorkers PodWorkers - - // resyncInterval is the interval between periodic full reconciliations of - // pods on this node. - resyncInterval time.Duration - - // sourcesReady records the sources seen by the kubelet, it is thread-safe. - sourcesReady config.SourcesReady - - // podManager is a facade that abstracts away the various sources of pods - // this Kubelet services. - podManager kubepod.Manager - - // Needed to observe and respond to situations that could impact node stability - evictionManager eviction.Manager - - // Optional, defaults to /logs/ from /var/log - logServer http.Handler - // Optional, defaults to simple Docker implementation - runner kubecontainer.ContainerCommandRunner - - // cAdvisor used for container information. - cadvisor cadvisor.Interface - - // Set to true to have the node register itself with the apiserver. - registerNode bool - // List of taints to add to a node object when the kubelet registers itself. - registerWithTaints []api.Taint - // Set to true to have the node register itself as schedulable. - registerSchedulable bool - // for internal book keeping; access only from within registerWithApiserver - registrationCompleted bool - - // dnsConfigurer is used for setting up DNS resolver configuration when launching pods. - dnsConfigurer *dns.Configurer - - // masterServiceNamespace is the namespace that the master service is exposed in. - masterServiceNamespace string - // serviceLister knows how to list services - serviceLister serviceLister - // nodeInfo knows how to get information about the node for this kubelet. - nodeInfo predicates.NodeInfo - - // a list of node labels to register - nodeLabels map[string]string - - // Last timestamp when runtime responded on ping. - // Mutex is used to protect this value. - runtimeState *runtimeState - - // Volume plugins. - volumePluginMgr *volume.VolumePluginMgr - - // Handles container probing. - probeManager prober.Manager - // Manages container health check results. - livenessManager proberesults.Manager - - // How long to keep idle streaming command execution/port forwarding - // connections open before terminating them - streamingConnectionIdleTimeout time.Duration - - // The EventRecorder to use - recorder record.EventRecorder - - // Policy for handling garbage collection of dead containers. - containerGC kubecontainer.ContainerGC - - // Manager for image garbage collection. - imageManager images.ImageGCManager - - // Manager for container logs. - containerLogManager logs.ContainerLogManager - - // Secret manager. - secretManager secret.Manager - - // ConfigMap manager. - configMapManager configmap.Manager - - // Cached MachineInfo returned by cadvisor. - machineInfo *cadvisorapi.MachineInfo - - //Cached RootFsInfo returned by cadvisor - rootfsInfo *cadvisorapiv2.FsInfo - - // Handles certificate rotations. - serverCertificateManager certificate.Manager - - // Syncs pods statuses with apiserver; also used as a cache of statuses. - statusManager status.Manager - - // VolumeManager runs a set of asynchronous loops that figure out which - // volumes need to be attached/mounted/unmounted/detached based on the pods - // scheduled on this node and makes it so. - volumeManager volumemanager.VolumeManager - - // Cloud provider interface. - cloud cloudprovider.Interface - // To keep exclusive access to the cloudproviderRequestParallelism - cloudproviderRequestMux sync.Mutex - // Keep the count of requests processed in parallel (expected to be 1 at most at a given time) - cloudproviderRequestParallelism chan int - // Sync with finished requests - cloudproviderRequestSync chan int - // Request timeout - cloudproviderRequestTimeout time.Duration - - // Indicates that the node initialization happens in an external cloud controller - externalCloudProvider bool - // Reference to this node. - nodeRef *v1.ObjectReference - - // The name of the container runtime - containerRuntimeName string - - // redirectContainerStreaming enables container streaming redirect. - redirectContainerStreaming bool - - // Container runtime. - containerRuntime kubecontainer.Runtime - - // Streaming runtime handles container streaming. - streamingRuntime kubecontainer.StreamingRuntime - - // Container runtime service (needed by container runtime Start()). - // TODO(CD): try to make this available without holding a reference in this - // struct. For example, by adding a getter to generic runtime. - runtimeService internalapi.RuntimeService - - // reasonCache caches the failure reason of the last creation of all containers, which is - // used for generating ContainerStatus. - reasonCache *ReasonCache - - // nodeStatusUpdateFrequency specifies how often kubelet posts node status to master. - // Note: be cautious when changing the constant, it must work with nodeMonitorGracePeriod - // in nodecontroller. There are several constraints: - // 1. nodeMonitorGracePeriod must be N times more than nodeStatusUpdateFrequency, where - // N means number of retries allowed for kubelet to post node status. It is pointless - // to make nodeMonitorGracePeriod be less than nodeStatusUpdateFrequency, since there - // will only be fresh values from Kubelet at an interval of nodeStatusUpdateFrequency. - // The constant must be less than podEvictionTimeout. - // 2. nodeStatusUpdateFrequency needs to be large enough for kubelet to generate node - // status. Kubelet may fail to update node status reliably if the value is too small, - // as it takes time to gather all necessary node information. - nodeStatusUpdateFrequency time.Duration - - // Generates pod events. - pleg pleg.PodLifecycleEventGenerator - - // Store kubecontainer.PodStatus for all pods. - podCache kubecontainer.Cache - - // os is a facade for various syscalls that need to be mocked during testing. - os kubecontainer.OSInterface - - // Watcher of out of memory events. - oomWatcher OOMWatcher - - // Monitor resource usage - resourceAnalyzer serverstats.ResourceAnalyzer - - // Whether or not we should have the QOS cgroup hierarchy for resource management - cgroupsPerQOS bool - - // If non-empty, pass this to the container runtime as the root cgroup. - cgroupRoot string - - // Mounter to use for volumes. - mounter mount.Interface - - // Writer interface to use for volumes. - writer kubeio.Writer - - // Manager of non-Runtime containers. - containerManager cm.ContainerManager - - // Maximum Number of Pods which can be run by this Kubelet - maxPods int - - // Monitor Kubelet's sync loop - syncLoopMonitor atomic.Value - - // Container restart Backoff - backOff *flowcontrol.Backoff - - // Channel for sending pods to kill. - podKillingCh chan *kubecontainer.PodPair - - // Information about the ports which are opened by daemons on Node running this Kubelet server. - daemonEndpoints *v1.NodeDaemonEndpoints - - // A queue used to trigger pod workers. - workQueue queue.WorkQueue - - // oneTimeInitializer is used to initialize modules that are dependent on the runtime to be up. - oneTimeInitializer sync.Once - - // If non-nil, use this IP address for the node - nodeIP net.IP - - // use this function to validate the kubelet nodeIP - nodeIPValidator func(net.IP) error - - // If non-nil, this is a unique identifier for the node in an external database, eg. cloudprovider - providerID string - - // clock is an interface that provides time related functionality in a way that makes it - // easy to test the code. - clock clock.Clock - - // handlers called during the tryUpdateNodeStatus cycle - setNodeStatusFuncs []func(*v1.Node) error - - // TODO: think about moving this to be centralized in PodWorkers in follow-on. - // the list of handlers to call during pod admission. - admitHandlers lifecycle.PodAdmitHandlers - - // softAdmithandlers are applied to the pod after it is admitted by the Kubelet, but before it is - // run. A pod rejected by a softAdmitHandler will be left in a Pending state indefinitely. If a - // rejected pod should not be recreated, or the scheduler is not aware of the rejection rule, the - // admission rule should be applied by a softAdmitHandler. - softAdmitHandlers lifecycle.PodAdmitHandlers - - // the list of handlers to call during pod sync loop. - lifecycle.PodSyncLoopHandlers - - // the list of handlers to call during pod sync. - lifecycle.PodSyncHandlers - - // the number of allowed pods per core - podsPerCore int - - // enableControllerAttachDetach indicates the Attach/Detach controller - // should manage attachment/detachment of volumes scheduled to this node, - // and disable kubelet from executing any attach/detach operations - enableControllerAttachDetach bool - - // trigger deleting containers in a pod - containerDeletor *podContainerDeletor - - // config iptables util rules - makeIPTablesUtilChains bool - - // The bit of the fwmark space to mark packets for SNAT. - iptablesMasqueradeBit int - - // The bit of the fwmark space to mark packets for dropping. - iptablesDropBit int - - // The AppArmor validator for checking whether AppArmor is supported. - appArmorValidator apparmor.Validator - - // The handler serving CRI streaming calls (exec/attach/port-forward). - criHandler http.Handler - - // experimentalHostUserNamespaceDefaulting sets userns=true when users request host namespaces (pid, ipc, net), - // are using non-namespaced capabilities (mknod, sys_time, sys_module), the pod contains a privileged container, - // or using host path volumes. - // This should only be enabled when the container runtime is performing user remapping AND if the - // experimental behavior is desired. - experimentalHostUserNamespaceDefaulting bool - - // dockerLegacyService contains some legacy methods for backward compatibility. - // It should be set only when docker is using non json-file logging driver. - dockerLegacyService dockershim.DockerLegacyService - - // StatsProvider provides the node and the container stats. - *stats.StatsProvider - - // This flag, if set, instructs the kubelet to keep volumes from terminated pods mounted to the node. - // This can be useful for debugging volume related issues. - keepTerminatedPodVolumes bool // DEPRECATED - - // pluginwatcher is a utility for Kubelet to register different types of node-level plugins - // such as device plugins or CSI plugins. It discovers plugins by monitoring inotify events under the - // directory returned by kubelet.getPluginsDir() - pluginWatcher pluginwatcher.Watcher - - // This flag sets a maximum number of images to report in the node status. - nodeStatusMaxImages int32 - - // This flag indicates that kubelet should start plugin watcher utility server for discovering Kubelet plugins - enablePluginsWatcher bool -} - -func allGlobalUnicastIPs() ([]net.IP, error) { - interfaces, err := net.Interfaces() - if err != nil { - return nil, fmt.Errorf("could not list network interfaces: %v", err) - } - var ips []net.IP - for _, i := range interfaces { - addresses, err := i.Addrs() - if err != nil { - return nil, fmt.Errorf("could not list the addresses for network interface %v: %v", i, err) - } - for _, address := range addresses { - switch v := address.(type) { - case *net.IPNet: - if v.IP.IsGlobalUnicast() { - ips = append(ips, v.IP) - } - } - } - } - return ips, nil -} - -// setupDataDirs creates: -// 1. the root directory -// 2. the pods directory -// 3. the plugins directory -func (kl *Kubelet) setupDataDirs() error { - kl.rootDirectory = path.Clean(kl.rootDirectory) - if err := os.MkdirAll(kl.getRootDir(), 0750); err != nil { - return fmt.Errorf("error creating root directory: %v", err) - } - if err := kl.mounter.MakeRShared(kl.getRootDir()); err != nil { - return fmt.Errorf("error configuring root directory: %v", err) - } - if err := os.MkdirAll(kl.getPodsDir(), 0750); err != nil { - return fmt.Errorf("error creating pods directory: %v", err) - } - if err := os.MkdirAll(kl.getPluginsDir(), 0750); err != nil { - return fmt.Errorf("error creating plugins directory: %v", err) - } - return nil -} - -// StartGarbageCollection starts garbage collection threads. -func (kl *Kubelet) StartGarbageCollection() { - loggedContainerGCFailure := false - go wait.Until(func() { - if err := kl.containerGC.GarbageCollect(); err != nil { - glog.Errorf("Container garbage collection failed: %v", err) - kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.ContainerGCFailed, err.Error()) - loggedContainerGCFailure = true - } else { - var vLevel glog.Level = 4 - if loggedContainerGCFailure { - vLevel = 1 - loggedContainerGCFailure = false - } - - glog.V(vLevel).Infof("Container garbage collection succeeded") - } - }, ContainerGCPeriod, wait.NeverStop) - - stopChan := make(chan struct{}) - defer close(stopChan) - // when the high threshold is set to 100, stub the image GC manager - if kl.kubeletConfiguration.ImageGCHighThresholdPercent == 100 { - glog.V(2).Infof("ImageGCHighThresholdPercent is set 100, Disable image GC") - go func() { stopChan <- struct{}{} }() - } - - prevImageGCFailed := false - go wait.Until(func() { - if err := kl.imageManager.GarbageCollect(); err != nil { - if prevImageGCFailed { - glog.Errorf("Image garbage collection failed multiple times in a row: %v", err) - // Only create an event for repeated failures - kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.ImageGCFailed, err.Error()) - } else { - glog.Errorf("Image garbage collection failed once. Stats initialization may not have completed yet: %v", err) - } - prevImageGCFailed = true - } else { - var vLevel glog.Level = 4 - if prevImageGCFailed { - vLevel = 1 - prevImageGCFailed = false - } - - glog.V(vLevel).Infof("Image garbage collection succeeded") - } - }, ImageGCPeriod, stopChan) -} - -// initializeModules will initialize internal modules that do not require the container runtime to be up. -// Note that the modules here must not depend on modules that are not initialized here. -func (kl *Kubelet) initializeModules() error { - // Prometheus metrics. - metrics.Register(kl.runtimeCache, collectors.NewVolumeStatsCollector(kl)) - - // Setup filesystem directories. - if err := kl.setupDataDirs(); err != nil { - return err - } - - // If the container logs directory does not exist, create it. - if _, err := os.Stat(ContainerLogsDir); err != nil { - if err := kl.os.MkdirAll(ContainerLogsDir, 0755); err != nil { - glog.Errorf("Failed to create directory %q: %v", ContainerLogsDir, err) - } - } - - // Start the image manager. - kl.imageManager.Start() - - // Start the certificate manager if it was enabled. - if kl.serverCertificateManager != nil { - kl.serverCertificateManager.Start() - } - - // Start out of memory watcher. - if err := kl.oomWatcher.Start(kl.nodeRef); err != nil { - return fmt.Errorf("Failed to start OOM watcher %v", err) - } - - // Start resource analyzer - kl.resourceAnalyzer.Start() - - return nil -} - -// initializeRuntimeDependentModules will initialize internal modules that require the container runtime to be up. -func (kl *Kubelet) initializeRuntimeDependentModules() { - if err := kl.cadvisor.Start(); err != nil { - // Fail kubelet and rely on the babysitter to retry starting kubelet. - // TODO(random-liu): Add backoff logic in the babysitter - glog.Fatalf("Failed to start cAdvisor %v", err) - } - - // trigger on-demand stats collection once so that we have capacity information for ephemeral storage. - // ignore any errors, since if stats collection is not successful, the container manager will fail to start below. - kl.StatsProvider.GetCgroupStats("/", true) - // Start container manager. - node, err := kl.getNodeAnyWay() - if err != nil { - // Fail kubelet and rely on the babysitter to retry starting kubelet. - glog.Fatalf("Kubelet failed to get node info: %v", err) - } - // containerManager must start after cAdvisor because it needs filesystem capacity information - if err := kl.containerManager.Start(node, kl.GetActivePods, kl.sourcesReady, kl.statusManager, kl.runtimeService); err != nil { - // Fail kubelet and rely on the babysitter to retry starting kubelet. - glog.Fatalf("Failed to start ContainerManager %v", err) - } - // eviction manager must start after cadvisor because it needs to know if the container runtime has a dedicated imagefs - kl.evictionManager.Start(kl.StatsProvider, kl.GetActivePods, kl.podResourcesAreReclaimed, evictionMonitoringPeriod) - - // container log manager must start after container runtime is up to retrieve information from container runtime - // and inform container to reopen log file after log rotation. - kl.containerLogManager.Start() - if kl.enablePluginsWatcher { - // Adding Registration Callback function for CSI Driver - kl.pluginWatcher.AddHandler("CSIPlugin", csi.RegistrationCallback) - // Start the plugin watcher - glog.V(4).Infof("starting watcher") - if err := kl.pluginWatcher.Start(); err != nil { - kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.KubeletSetupFailed, err.Error()) - glog.Fatalf("failed to start Plugin Watcher. err: %v", err) - } - } -} - -// Run starts the kubelet reacting to config updates -func (kl *Kubelet) Run(updates <-chan kubetypes.PodUpdate) { - if kl.logServer == nil { - kl.logServer = http.StripPrefix("/logs/", http.FileServer(http.Dir("/var/log/"))) - } - if kl.kubeClient == nil { - glog.Warning("No api server defined - no node status update will be sent.") - } - - if err := kl.initializeModules(); err != nil { - kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.KubeletSetupFailed, err.Error()) - glog.Fatal(err) - } - - // Start volume manager - go kl.volumeManager.Run(kl.sourcesReady, wait.NeverStop) - - if kl.kubeClient != nil { - // Start syncing node status immediately, this may set up things the runtime needs to run. - go wait.Until(kl.syncNodeStatus, kl.nodeStatusUpdateFrequency, wait.NeverStop) - } - go wait.Until(kl.updateRuntimeUp, 5*time.Second, wait.NeverStop) - - // Start loop to sync iptables util rules - if kl.makeIPTablesUtilChains { - go wait.Until(kl.syncNetworkUtil, 1*time.Minute, wait.NeverStop) - } - - // Start a goroutine responsible for killing pods (that are not properly - // handled by pod workers). - go wait.Until(kl.podKiller, 1*time.Second, wait.NeverStop) - - // Start gorouting responsible for checking limits in resolv.conf - if kl.dnsConfigurer.ResolverConfig != "" { - go wait.Until(func() { kl.dnsConfigurer.CheckLimitsForResolvConf() }, 30*time.Second, wait.NeverStop) - } - - // Start component sync loops. - kl.statusManager.Start() - kl.probeManager.Start() - - // Start the pod lifecycle event generator. - kl.pleg.Start() - kl.syncLoop(updates, kl) -} - -// syncPod is the transaction script for the sync of a single pod. -// -// Arguments: -// -// o - the SyncPodOptions for this invocation -// -// The workflow is: -// * If the pod is being created, record pod worker start latency -// * Call generateAPIPodStatus to prepare an v1.PodStatus for the pod -// * If the pod is being seen as running for the first time, record pod -// start latency -// * Update the status of the pod in the status manager -// * Kill the pod if it should not be running -// * Create a mirror pod if the pod is a static pod, and does not -// already have a mirror pod -// * Create the data directories for the pod if they do not exist -// * Wait for volumes to attach/mount -// * Fetch the pull secrets for the pod -// * Call the container runtime's SyncPod callback -// * Update the traffic shaping for the pod's ingress and egress limits -// -// If any step of this workflow errors, the error is returned, and is repeated -// on the next syncPod call. -// -// This operation writes all events that are dispatched in order to provide -// the most accurate information possible about an error situation to aid debugging. -// Callers should not throw an event if this operation returns an error. -func (kl *Kubelet) syncPod(o syncPodOptions) error { - // pull out the required options - pod := o.pod - mirrorPod := o.mirrorPod - podStatus := o.podStatus - updateType := o.updateType - - // if we want to kill a pod, do it now! - if updateType == kubetypes.SyncPodKill { - killPodOptions := o.killPodOptions - if killPodOptions == nil || killPodOptions.PodStatusFunc == nil { - return fmt.Errorf("kill pod options are required if update type is kill") - } - apiPodStatus := killPodOptions.PodStatusFunc(pod, podStatus) - kl.statusManager.SetPodStatus(pod, apiPodStatus) - // we kill the pod with the specified grace period since this is a termination - if err := kl.killPod(pod, nil, podStatus, killPodOptions.PodTerminationGracePeriodSecondsOverride); err != nil { - kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToKillPod, "error killing pod: %v", err) - // there was an error killing the pod, so we return that error directly - utilruntime.HandleError(err) - return err - } - return nil - } - - // Latency measurements for the main workflow are relative to the - // first time the pod was seen by the API server. - var firstSeenTime time.Time - if firstSeenTimeStr, ok := pod.Annotations[kubetypes.ConfigFirstSeenAnnotationKey]; ok { - firstSeenTime = kubetypes.ConvertToTimestamp(firstSeenTimeStr).Get() - } - - // Record pod worker start latency if being created - // TODO: make pod workers record their own latencies - if updateType == kubetypes.SyncPodCreate { - if !firstSeenTime.IsZero() { - // This is the first time we are syncing the pod. Record the latency - // since kubelet first saw the pod if firstSeenTime is set. - metrics.PodWorkerStartLatency.Observe(metrics.SinceInMicroseconds(firstSeenTime)) - } else { - glog.V(3).Infof("First seen time not recorded for pod %q", pod.UID) - } - } - - // Generate final API pod status with pod and status manager status - apiPodStatus := kl.generateAPIPodStatus(pod, podStatus) - // The pod IP may be changed in generateAPIPodStatus if the pod is using host network. (See #24576) - // TODO(random-liu): After writing pod spec into container labels, check whether pod is using host network, and - // set pod IP to hostIP directly in runtime.GetPodStatus - podStatus.IP = apiPodStatus.PodIP - - // Record the time it takes for the pod to become running. - existingStatus, ok := kl.statusManager.GetPodStatus(pod.UID) - if !ok || existingStatus.Phase == v1.PodPending && apiPodStatus.Phase == v1.PodRunning && - !firstSeenTime.IsZero() { - metrics.PodStartLatency.Observe(metrics.SinceInMicroseconds(firstSeenTime)) - } - - runnable := kl.canRunPod(pod) - if !runnable.Admit { - // Pod is not runnable; update the Pod and Container statuses to why. - apiPodStatus.Reason = runnable.Reason - apiPodStatus.Message = runnable.Message - // Waiting containers are not creating. - const waitingReason = "Blocked" - for _, cs := range apiPodStatus.InitContainerStatuses { - if cs.State.Waiting != nil { - cs.State.Waiting.Reason = waitingReason - } - } - for _, cs := range apiPodStatus.ContainerStatuses { - if cs.State.Waiting != nil { - cs.State.Waiting.Reason = waitingReason - } - } - } - - // Update status in the status manager - kl.statusManager.SetPodStatus(pod, apiPodStatus) - - // Kill pod if it should not be running - if !runnable.Admit || pod.DeletionTimestamp != nil || apiPodStatus.Phase == v1.PodFailed { - var syncErr error - if err := kl.killPod(pod, nil, podStatus, nil); err != nil { - kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToKillPod, "error killing pod: %v", err) - syncErr = fmt.Errorf("error killing pod: %v", err) - utilruntime.HandleError(syncErr) - } else { - if !runnable.Admit { - // There was no error killing the pod, but the pod cannot be run. - // Return an error to signal that the sync loop should back off. - syncErr = fmt.Errorf("pod cannot be run: %s", runnable.Message) - } - } - return syncErr - } - - // If the network plugin is not ready, only start the pod if it uses the host network - if rs := kl.runtimeState.networkErrors(); len(rs) != 0 && !kubecontainer.IsHostNetworkPod(pod) { - kl.recorder.Eventf(pod, v1.EventTypeWarning, events.NetworkNotReady, "network is not ready: %v", rs) - return fmt.Errorf("network is not ready: %v", rs) - } - - // Create Cgroups for the pod and apply resource parameters - // to them if cgroups-per-qos flag is enabled. - pcm := kl.containerManager.NewPodContainerManager() - // If pod has already been terminated then we need not create - // or update the pod's cgroup - if !kl.podIsTerminated(pod) { - // When the kubelet is restarted with the cgroups-per-qos - // flag enabled, all the pod's running containers - // should be killed intermittently and brought back up - // under the qos cgroup hierarchy. - // Check if this is the pod's first sync - firstSync := true - for _, containerStatus := range apiPodStatus.ContainerStatuses { - if containerStatus.State.Running != nil { - firstSync = false - break - } - } - // Don't kill containers in pod if pod's cgroups already - // exists or the pod is running for the first time - podKilled := false - if !pcm.Exists(pod) && !firstSync { - if err := kl.killPod(pod, nil, podStatus, nil); err == nil { - podKilled = true - } - } - // Create and Update pod's Cgroups - // Don't create cgroups for run once pod if it was killed above - // The current policy is not to restart the run once pods when - // the kubelet is restarted with the new flag as run once pods are - // expected to run only once and if the kubelet is restarted then - // they are not expected to run again. - // We don't create and apply updates to cgroup if its a run once pod and was killed above - if !(podKilled && pod.Spec.RestartPolicy == v1.RestartPolicyNever) { - if !pcm.Exists(pod) { - if err := kl.containerManager.UpdateQOSCgroups(); err != nil { - glog.V(2).Infof("Failed to update QoS cgroups while syncing pod: %v", err) - } - if err := pcm.EnsureExists(pod); err != nil { - kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToCreatePodContainer, "unable to ensure pod container exists: %v", err) - return fmt.Errorf("failed to ensure that the pod: %v cgroups exist and are correctly applied: %v", pod.UID, err) - } - } - } - } - - // Create Mirror Pod for Static Pod if it doesn't already exist - if kubepod.IsStaticPod(pod) { - podFullName := kubecontainer.GetPodFullName(pod) - deleted := false - if mirrorPod != nil { - if mirrorPod.DeletionTimestamp != nil || !kl.podManager.IsMirrorPodOf(mirrorPod, pod) { - // The mirror pod is semantically different from the static pod. Remove - // it. The mirror pod will get recreated later. - glog.Warningf("Deleting mirror pod %q because it is outdated", format.Pod(mirrorPod)) - if err := kl.podManager.DeleteMirrorPod(podFullName); err != nil { - glog.Errorf("Failed deleting mirror pod %q: %v", format.Pod(mirrorPod), err) - } else { - deleted = true - } - } - } - if mirrorPod == nil || deleted { - node, err := kl.GetNode() - if err != nil || node.DeletionTimestamp != nil { - glog.V(4).Infof("No need to create a mirror pod, since node %q has been removed from the cluster", kl.nodeName) - } else { - glog.V(4).Infof("Creating a mirror pod for static pod %q", format.Pod(pod)) - if err := kl.podManager.CreateMirrorPod(pod); err != nil { - glog.Errorf("Failed creating a mirror pod for %q: %v", format.Pod(pod), err) - } - } - } - } - - // Make data directories for the pod - if err := kl.makePodDataDirs(pod); err != nil { - kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedToMakePodDataDirectories, "error making pod data directories: %v", err) - glog.Errorf("Unable to make pod data directories for pod %q: %v", format.Pod(pod), err) - return err - } - - // Volume manager will not mount volumes for terminated pods - if !kl.podIsTerminated(pod) { - // Wait for volumes to attach/mount - if err := kl.volumeManager.WaitForAttachAndMount(pod); err != nil { - kl.recorder.Eventf(pod, v1.EventTypeWarning, events.FailedMountVolume, "Unable to mount volumes for pod %q: %v", format.Pod(pod), err) - glog.Errorf("Unable to mount volumes for pod %q: %v; skipping pod", format.Pod(pod), err) - return err - } - } - - // Fetch the pull secrets for the pod - pullSecrets := kl.getPullSecretsForPod(pod) - - // Call the container runtime's SyncPod callback - result := kl.containerRuntime.SyncPod(pod, apiPodStatus, podStatus, pullSecrets, kl.backOff) - kl.reasonCache.Update(pod.UID, result) - if err := result.Error(); err != nil { - // Do not record an event here, as we keep all event logging for sync pod failures - // local to container runtime so we get better errors - return err - } - - return nil -} - -// Get pods which should be resynchronized. Currently, the following pod should be resynchronized: -// * pod whose work is ready. -// * internal modules that request sync of a pod. -func (kl *Kubelet) getPodsToSync() []*v1.Pod { - allPods := kl.podManager.GetPods() - podUIDs := kl.workQueue.GetWork() - podUIDSet := sets.NewString() - for _, podUID := range podUIDs { - podUIDSet.Insert(string(podUID)) - } - var podsToSync []*v1.Pod - for _, pod := range allPods { - if podUIDSet.Has(string(pod.UID)) { - // The work of the pod is ready - podsToSync = append(podsToSync, pod) - continue - } - for _, podSyncLoopHandler := range kl.PodSyncLoopHandlers { - if podSyncLoopHandler.ShouldSync(pod) { - podsToSync = append(podsToSync, pod) - break - } - } - } - return podsToSync -} - -// deletePod deletes the pod from the internal state of the kubelet by: -// 1. stopping the associated pod worker asynchronously -// 2. signaling to kill the pod by sending on the podKillingCh channel -// -// deletePod returns an error if not all sources are ready or the pod is not -// found in the runtime cache. -func (kl *Kubelet) deletePod(pod *v1.Pod) error { - if pod == nil { - return fmt.Errorf("deletePod does not allow nil pod") - } - if !kl.sourcesReady.AllReady() { - // If the sources aren't ready, skip deletion, as we may accidentally delete pods - // for sources that haven't reported yet. - return fmt.Errorf("skipping delete because sources aren't ready yet") - } - kl.podWorkers.ForgetWorker(pod.UID) - - // Runtime cache may not have been updated to with the pod, but it's okay - // because the periodic cleanup routine will attempt to delete again later. - runningPods, err := kl.runtimeCache.GetPods() - if err != nil { - return fmt.Errorf("error listing containers: %v", err) - } - runningPod := kubecontainer.Pods(runningPods).FindPod("", pod.UID) - if runningPod.IsEmpty() { - return fmt.Errorf("pod not found") - } - podPair := kubecontainer.PodPair{APIPod: pod, RunningPod: &runningPod} - - kl.podKillingCh <- &podPair - // TODO: delete the mirror pod here? - - // We leave the volume/directory cleanup to the periodic cleanup routine. - return nil -} - -// rejectPod records an event about the pod with the given reason and message, -// and updates the pod to the failed phase in the status manage. -func (kl *Kubelet) rejectPod(pod *v1.Pod, reason, message string) { - kl.recorder.Eventf(pod, v1.EventTypeWarning, reason, message) - kl.statusManager.SetPodStatus(pod, v1.PodStatus{ - Phase: v1.PodFailed, - Reason: reason, - Message: "Pod " + message}) -} - -// canAdmitPod determines if a pod can be admitted, and gives a reason if it -// cannot. "pod" is new pod, while "pods" are all admitted pods -// The function returns a boolean value indicating whether the pod -// can be admitted, a brief single-word reason and a message explaining why -// the pod cannot be admitted. -func (kl *Kubelet) canAdmitPod(pods []*v1.Pod, pod *v1.Pod) (bool, string, string) { - // the kubelet will invoke each pod admit handler in sequence - // if any handler rejects, the pod is rejected. - // TODO: move out of disk check into a pod admitter - // TODO: out of resource eviction should have a pod admitter call-out - attrs := &lifecycle.PodAdmitAttributes{Pod: pod, OtherPods: pods} - for _, podAdmitHandler := range kl.admitHandlers { - if result := podAdmitHandler.Admit(attrs); !result.Admit { - return false, result.Reason, result.Message - } - } - - return true, "", "" -} - -func (kl *Kubelet) canRunPod(pod *v1.Pod) lifecycle.PodAdmitResult { - attrs := &lifecycle.PodAdmitAttributes{Pod: pod} - // Get "OtherPods". Rejected pods are failed, so only include admitted pods that are alive. - attrs.OtherPods = kl.filterOutTerminatedPods(kl.podManager.GetPods()) - - for _, handler := range kl.softAdmitHandlers { - if result := handler.Admit(attrs); !result.Admit { - return result - } - } - - // TODO: Refactor as a soft admit handler. - if err := canRunPod(pod); err != nil { - return lifecycle.PodAdmitResult{ - Admit: false, - Reason: "Forbidden", - Message: err.Error(), - } - } - - return lifecycle.PodAdmitResult{Admit: true} -} - -// syncLoop is the main loop for processing changes. It watches for changes from -// three channels (file, apiserver, and http) and creates a union of them. For -// any new change seen, will run a sync against desired state and running state. If -// no changes are seen to the configuration, will synchronize the last known desired -// state every sync-frequency seconds. Never returns. -func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHandler) { - glog.Info("Starting kubelet main sync loop.") - // The resyncTicker wakes up kubelet to checks if there are any pod workers - // that need to be sync'd. A one-second period is sufficient because the - // sync interval is defaulted to 10s. - syncTicker := time.NewTicker(time.Second) - defer syncTicker.Stop() - housekeepingTicker := time.NewTicker(housekeepingPeriod) - defer housekeepingTicker.Stop() - plegCh := kl.pleg.Watch() - const ( - base = 100 * time.Millisecond - max = 5 * time.Second - factor = 2 - ) - duration := base - for { - if rs := kl.runtimeState.runtimeErrors(); len(rs) != 0 { - glog.Infof("skipping pod synchronization - %v", rs) - // exponential backoff - time.Sleep(duration) - duration = time.Duration(math.Min(float64(max), factor*float64(duration))) - continue - } - // reset backoff if we have a success - duration = base - - kl.syncLoopMonitor.Store(kl.clock.Now()) - if !kl.syncLoopIteration(updates, handler, syncTicker.C, housekeepingTicker.C, plegCh) { - break - } - kl.syncLoopMonitor.Store(kl.clock.Now()) - } -} - -// syncLoopIteration reads from various channels and dispatches pods to the -// given handler. -// -// Arguments: -// 1. configCh: a channel to read config events from -// 2. handler: the SyncHandler to dispatch pods to -// 3. syncCh: a channel to read periodic sync events from -// 4. houseKeepingCh: a channel to read housekeeping events from -// 5. plegCh: a channel to read PLEG updates from -// -// Events are also read from the kubelet liveness manager's update channel. -// -// The workflow is to read from one of the channels, handle that event, and -// update the timestamp in the sync loop monitor. -// -// Here is an appropriate place to note that despite the syntactical -// similarity to the switch statement, the case statements in a select are -// evaluated in a pseudorandom order if there are multiple channels ready to -// read from when the select is evaluated. In other words, case statements -// are evaluated in random order, and you can not assume that the case -// statements evaluate in order if multiple channels have events. -// -// With that in mind, in truly no particular order, the different channels -// are handled as follows: -// -// * configCh: dispatch the pods for the config change to the appropriate -// handler callback for the event type -// * plegCh: update the runtime cache; sync pod -// * syncCh: sync all pods waiting for sync -// * houseKeepingCh: trigger cleanup of pods -// * liveness manager: sync pods that have failed or in which one or more -// containers have failed liveness checks -func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handler SyncHandler, - syncCh <-chan time.Time, housekeepingCh <-chan time.Time, plegCh <-chan *pleg.PodLifecycleEvent) bool { - select { - case u, open := <-configCh: - // Update from a config source; dispatch it to the right handler - // callback. - if !open { - glog.Errorf("Update channel is closed. Exiting the sync loop.") - return false - } - - switch u.Op { - case kubetypes.ADD: - glog.V(2).Infof("SyncLoop (ADD, %q): %q", u.Source, format.Pods(u.Pods)) - // After restarting, kubelet will get all existing pods through - // ADD as if they are new pods. These pods will then go through the - // admission process and *may* be rejected. This can be resolved - // once we have checkpointing. - handler.HandlePodAdditions(u.Pods) - case kubetypes.UPDATE: - glog.V(2).Infof("SyncLoop (UPDATE, %q): %q", u.Source, format.PodsWithDeletiontimestamps(u.Pods)) - handler.HandlePodUpdates(u.Pods) - case kubetypes.REMOVE: - glog.V(2).Infof("SyncLoop (REMOVE, %q): %q", u.Source, format.Pods(u.Pods)) - handler.HandlePodRemoves(u.Pods) - case kubetypes.RECONCILE: - glog.V(4).Infof("SyncLoop (RECONCILE, %q): %q", u.Source, format.Pods(u.Pods)) - handler.HandlePodReconcile(u.Pods) - case kubetypes.DELETE: - glog.V(2).Infof("SyncLoop (DELETE, %q): %q", u.Source, format.Pods(u.Pods)) - // DELETE is treated as a UPDATE because of graceful deletion. - handler.HandlePodUpdates(u.Pods) - case kubetypes.RESTORE: - glog.V(2).Infof("SyncLoop (RESTORE, %q): %q", u.Source, format.Pods(u.Pods)) - // These are pods restored from the checkpoint. Treat them as new - // pods. - handler.HandlePodAdditions(u.Pods) - case kubetypes.SET: - // TODO: Do we want to support this? - glog.Errorf("Kubelet does not support snapshot update") - } - - if u.Op != kubetypes.RESTORE { - // If the update type is RESTORE, it means that the update is from - // the pod checkpoints and may be incomplete. Do not mark the - // source as ready. - - // Mark the source ready after receiving at least one update from the - // source. Once all the sources are marked ready, various cleanup - // routines will start reclaiming resources. It is important that this - // takes place only after kubelet calls the update handler to process - // the update to ensure the internal pod cache is up-to-date. - kl.sourcesReady.AddSource(u.Source) - } - case e := <-plegCh: - if isSyncPodWorthy(e) { - // PLEG event for a pod; sync it. - if pod, ok := kl.podManager.GetPodByUID(e.ID); ok { - glog.V(2).Infof("SyncLoop (PLEG): %q, event: %#v", format.Pod(pod), e) - handler.HandlePodSyncs([]*v1.Pod{pod}) - } else { - // If the pod no longer exists, ignore the event. - glog.V(4).Infof("SyncLoop (PLEG): ignore irrelevant event: %#v", e) - } - } - - if e.Type == pleg.ContainerDied { - if containerID, ok := e.Data.(string); ok { - kl.cleanUpContainersInPod(e.ID, containerID) - } - } - case <-syncCh: - // Sync pods waiting for sync - podsToSync := kl.getPodsToSync() - if len(podsToSync) == 0 { - break - } - glog.V(4).Infof("SyncLoop (SYNC): %d pods; %s", len(podsToSync), format.Pods(podsToSync)) - handler.HandlePodSyncs(podsToSync) - case update := <-kl.livenessManager.Updates(): - if update.Result == proberesults.Failure { - // The liveness manager detected a failure; sync the pod. - - // We should not use the pod from livenessManager, because it is never updated after - // initialization. - pod, ok := kl.podManager.GetPodByUID(update.PodUID) - if !ok { - // If the pod no longer exists, ignore the update. - glog.V(4).Infof("SyncLoop (container unhealthy): ignore irrelevant update: %#v", update) - break - } - glog.V(1).Infof("SyncLoop (container unhealthy): %q", format.Pod(pod)) - handler.HandlePodSyncs([]*v1.Pod{pod}) - } - case <-housekeepingCh: - if !kl.sourcesReady.AllReady() { - // If the sources aren't ready or volume manager has not yet synced the states, - // skip housekeeping, as we may accidentally delete pods from unready sources. - glog.V(4).Infof("SyncLoop (housekeeping, skipped): sources aren't ready yet.") - } else { - glog.V(4).Infof("SyncLoop (housekeeping)") - if err := handler.HandlePodCleanups(); err != nil { - glog.Errorf("Failed cleaning pods: %v", err) - } - } - } - return true -} - -// dispatchWork starts the asynchronous sync of the pod in a pod worker. -// If the pod is terminated, dispatchWork -func (kl *Kubelet) dispatchWork(pod *v1.Pod, syncType kubetypes.SyncPodType, mirrorPod *v1.Pod, start time.Time) { - if kl.podIsTerminated(pod) { - if pod.DeletionTimestamp != nil { - // If the pod is in a terminated state, there is no pod worker to - // handle the work item. Check if the DeletionTimestamp has been - // set, and force a status update to trigger a pod deletion request - // to the apiserver. - kl.statusManager.TerminatePod(pod) - } - return - } - // Run the sync in an async worker. - kl.podWorkers.UpdatePod(&UpdatePodOptions{ - Pod: pod, - MirrorPod: mirrorPod, - UpdateType: syncType, - OnCompleteFunc: func(err error) { - if err != nil { - metrics.PodWorkerLatency.WithLabelValues(syncType.String()).Observe(metrics.SinceInMicroseconds(start)) - } - }, - }) - // Note the number of containers for new pods. - if syncType == kubetypes.SyncPodCreate { - metrics.ContainersPerPodCount.Observe(float64(len(pod.Spec.Containers))) - } -} - -// TODO: handle mirror pods in a separate component (issue #17251) -func (kl *Kubelet) handleMirrorPod(mirrorPod *v1.Pod, start time.Time) { - // Mirror pod ADD/UPDATE/DELETE operations are considered an UPDATE to the - // corresponding static pod. Send update to the pod worker if the static - // pod exists. - if pod, ok := kl.podManager.GetPodByMirrorPod(mirrorPod); ok { - kl.dispatchWork(pod, kubetypes.SyncPodUpdate, mirrorPod, start) - } -} - -// HandlePodAdditions is the callback in SyncHandler for pods being added from -// a config source. -func (kl *Kubelet) HandlePodAdditions(pods []*v1.Pod) { - start := kl.clock.Now() - sort.Sort(sliceutils.PodsByCreationTime(pods)) - for _, pod := range pods { - existingPods := kl.podManager.GetPods() - // Always add the pod to the pod manager. Kubelet relies on the pod - // manager as the source of truth for the desired state. If a pod does - // not exist in the pod manager, it means that it has been deleted in - // the apiserver and no action (other than cleanup) is required. - kl.podManager.AddPod(pod) - - if kubepod.IsMirrorPod(pod) { - kl.handleMirrorPod(pod, start) - continue - } - - if !kl.podIsTerminated(pod) { - // Only go through the admission process if the pod is not - // terminated. - - // We failed pods that we rejected, so activePods include all admitted - // pods that are alive. - activePods := kl.filterOutTerminatedPods(existingPods) - - // Check if we can admit the pod; if not, reject it. - if ok, reason, message := kl.canAdmitPod(activePods, pod); !ok { - kl.rejectPod(pod, reason, message) - continue - } - } - mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) - kl.dispatchWork(pod, kubetypes.SyncPodCreate, mirrorPod, start) - kl.probeManager.AddPod(pod) - } -} - -// HandlePodUpdates is the callback in the SyncHandler interface for pods -// being updated from a config source. -func (kl *Kubelet) HandlePodUpdates(pods []*v1.Pod) { - start := kl.clock.Now() - for _, pod := range pods { - kl.podManager.UpdatePod(pod) - if kubepod.IsMirrorPod(pod) { - kl.handleMirrorPod(pod, start) - continue - } - // TODO: Evaluate if we need to validate and reject updates. - - mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) - kl.dispatchWork(pod, kubetypes.SyncPodUpdate, mirrorPod, start) - } -} - -// HandlePodRemoves is the callback in the SyncHandler interface for pods -// being removed from a config source. -func (kl *Kubelet) HandlePodRemoves(pods []*v1.Pod) { - start := kl.clock.Now() - for _, pod := range pods { - kl.podManager.DeletePod(pod) - if kubepod.IsMirrorPod(pod) { - kl.handleMirrorPod(pod, start) - continue - } - // Deletion is allowed to fail because the periodic cleanup routine - // will trigger deletion again. - if err := kl.deletePod(pod); err != nil { - glog.V(2).Infof("Failed to delete pod %q, err: %v", format.Pod(pod), err) - } - kl.probeManager.RemovePod(pod) - } -} - -// HandlePodReconcile is the callback in the SyncHandler interface for pods -// that should be reconciled. -func (kl *Kubelet) HandlePodReconcile(pods []*v1.Pod) { - start := kl.clock.Now() - for _, pod := range pods { - // Update the pod in pod manager, status manager will do periodically reconcile according - // to the pod manager. - kl.podManager.UpdatePod(pod) - - // Reconcile Pod "Ready" condition if necessary. Trigger sync pod for reconciliation. - if status.NeedToReconcilePodReadiness(pod) { - mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) - kl.dispatchWork(pod, kubetypes.SyncPodSync, mirrorPod, start) - } - - // After an evicted pod is synced, all dead containers in the pod can be removed. - if eviction.PodIsEvicted(pod.Status) { - if podStatus, err := kl.podCache.Get(pod.UID); err == nil { - kl.containerDeletor.deleteContainersInPod("", podStatus, true) - } - } - } -} - -// HandlePodSyncs is the callback in the syncHandler interface for pods -// that should be dispatched to pod workers for sync. -func (kl *Kubelet) HandlePodSyncs(pods []*v1.Pod) { - start := kl.clock.Now() - for _, pod := range pods { - mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) - kl.dispatchWork(pod, kubetypes.SyncPodSync, mirrorPod, start) - } -} - -// LatestLoopEntryTime returns the last time in the sync loop monitor. -func (kl *Kubelet) LatestLoopEntryTime() time.Time { - val := kl.syncLoopMonitor.Load() - if val == nil { - return time.Time{} - } - return val.(time.Time) -} - -// updateRuntimeUp calls the container runtime status callback, initializing -// the runtime dependent modules when the container runtime first comes up, -// and returns an error if the status check fails. If the status check is OK, -// update the container runtime uptime in the kubelet runtimeState. -func (kl *Kubelet) updateRuntimeUp() { - s, err := kl.containerRuntime.Status() - if err != nil { - glog.Errorf("Container runtime sanity check failed: %v", err) - return - } - if s == nil { - glog.Errorf("Container runtime status is nil") - return - } - // Periodically log the whole runtime status for debugging. - // TODO(random-liu): Consider to send node event when optional - // condition is unmet. - glog.V(4).Infof("Container runtime status: %v", s) - networkReady := s.GetRuntimeCondition(kubecontainer.NetworkReady) - if networkReady == nil || !networkReady.Status { - glog.Errorf("Container runtime network not ready: %v", networkReady) - kl.runtimeState.setNetworkState(fmt.Errorf("runtime network not ready: %v", networkReady)) - } else { - // Set nil if the container runtime network is ready. - kl.runtimeState.setNetworkState(nil) - } - // TODO(random-liu): Add runtime error in runtimeState, and update it - // when runtime is not ready, so that the information in RuntimeReady - // condition will be propagated to NodeReady condition. - runtimeReady := s.GetRuntimeCondition(kubecontainer.RuntimeReady) - // If RuntimeReady is not set or is false, report an error. - if runtimeReady == nil || !runtimeReady.Status { - glog.Errorf("Container runtime not ready: %v", runtimeReady) - return - } - kl.oneTimeInitializer.Do(kl.initializeRuntimeDependentModules) - kl.runtimeState.setRuntimeSync(kl.clock.Now()) -} - -// GetConfiguration returns the KubeletConfiguration used to configure the kubelet. -func (kl *Kubelet) GetConfiguration() kubeletconfiginternal.KubeletConfiguration { - return kl.kubeletConfiguration -} - -// BirthCry sends an event that the kubelet has started up. -func (kl *Kubelet) BirthCry() { - // Make an event that kubelet restarted. - kl.recorder.Eventf(kl.nodeRef, v1.EventTypeNormal, events.StartingKubelet, "Starting kubelet.") -} - -// ResyncInterval returns the interval used for periodic syncs. -func (kl *Kubelet) ResyncInterval() time.Duration { - return kl.resyncInterval -} - -// ListenAndServe runs the kubelet HTTP server. -func (kl *Kubelet) ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableDebuggingHandlers, enableContentionProfiling bool) { - server.ListenAndServeKubeletServer(kl, kl.resourceAnalyzer, address, port, tlsOptions, auth, enableDebuggingHandlers, enableContentionProfiling, kl.redirectContainerStreaming, kl.criHandler) -} - -// ListenAndServeReadOnly runs the kubelet HTTP server in read-only mode. -func (kl *Kubelet) ListenAndServeReadOnly(address net.IP, port uint) { - server.ListenAndServeKubeletReadOnlyServer(kl, kl.resourceAnalyzer, address, port) -} - -// Delete the eligible dead container instances in a pod. Depending on the configuration, the latest dead containers may be kept around. -func (kl *Kubelet) cleanUpContainersInPod(podID types.UID, exitedContainerID string) { - if podStatus, err := kl.podCache.Get(podID); err == nil { - removeAll := false - if syncedPod, ok := kl.podManager.GetPodByUID(podID); ok { - // generate the api status using the cached runtime status to get up-to-date ContainerStatuses - apiPodStatus := kl.generateAPIPodStatus(syncedPod, podStatus) - // When an evicted or deleted pod has already synced, all containers can be removed. - removeAll = eviction.PodIsEvicted(syncedPod.Status) || (syncedPod.DeletionTimestamp != nil && notRunning(apiPodStatus.ContainerStatuses)) - } - kl.containerDeletor.deleteContainersInPod(exitedContainerID, podStatus, removeAll) - } -} - -// isSyncPodWorthy filters out events that are not worthy of pod syncing -func isSyncPodWorthy(event *pleg.PodLifecycleEvent) bool { - // ContatnerRemoved doesn't affect pod state - return event.Type != pleg.ContainerRemoved -} - -// Gets the streaming server configuration to use with in-process CRI shims. -func getStreamingConfig(kubeCfg *kubeletconfiginternal.KubeletConfiguration, kubeDeps *Dependencies, crOptions *config.ContainerRuntimeOptions) *streaming.Config { - config := &streaming.Config{ - StreamIdleTimeout: kubeCfg.StreamingConnectionIdleTimeout.Duration, - StreamCreationTimeout: streaming.DefaultConfig.StreamCreationTimeout, - SupportedRemoteCommandProtocols: streaming.DefaultConfig.SupportedRemoteCommandProtocols, - SupportedPortForwardProtocols: streaming.DefaultConfig.SupportedPortForwardProtocols, - } - if !crOptions.RedirectContainerStreaming { - config.Addr = net.JoinHostPort("localhost", "0") - } else { - // Use a relative redirect (no scheme or host). - config.BaseURL = &url.URL{ - Path: "/cri/", - } - if kubeDeps.TLSOptions != nil { - config.TLSConfig = kubeDeps.TLSOptions.Config - } - } - return config -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go deleted file mode 100644 index 89077eb7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go +++ /dev/null @@ -1,313 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "io/ioutil" - "net" - "path/filepath" - - "github.com/golang/glog" - cadvisorapiv1 "github.com/google/cadvisor/info/v1" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/kubernetes/pkg/kubelet/cm" - "k8s.io/kubernetes/pkg/kubelet/config" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - utilfile "k8s.io/kubernetes/pkg/util/file" - utilnode "k8s.io/kubernetes/pkg/util/node" - volumeutil "k8s.io/kubernetes/pkg/volume/util" -) - -// getRootDir returns the full path to the directory under which kubelet can -// store data. These functions are useful to pass interfaces to other modules -// that may need to know where to write data without getting a whole kubelet -// instance. -func (kl *Kubelet) getRootDir() string { - return kl.rootDirectory -} - -// getPodsDir returns the full path to the directory under which pod -// directories are created. -func (kl *Kubelet) getPodsDir() string { - return filepath.Join(kl.getRootDir(), config.DefaultKubeletPodsDirName) -} - -// getPluginsDir returns the full path to the directory under which plugin -// directories are created. Plugins can use these directories for data that -// they need to persist. Plugins should create subdirectories under this named -// after their own names. -func (kl *Kubelet) getPluginsDir() string { - return filepath.Join(kl.getRootDir(), config.DefaultKubeletPluginsDirName) -} - -// getPluginDir returns a data directory name for a given plugin name. -// Plugins can use these directories to store data that they need to persist. -// For per-pod plugin data, see getPodPluginDir. -func (kl *Kubelet) getPluginDir(pluginName string) string { - return filepath.Join(kl.getPluginsDir(), pluginName) -} - -// getVolumeDevicePluginsDir returns the full path to the directory under which plugin -// directories are created. Plugins can use these directories for data that -// they need to persist. Plugins should create subdirectories under this named -// after their own names. -func (kl *Kubelet) getVolumeDevicePluginsDir() string { - return filepath.Join(kl.getRootDir(), config.DefaultKubeletPluginsDirName) -} - -// getVolumeDevicePluginDir returns a data directory name for a given plugin name. -// Plugins can use these directories to store data that they need to persist. -// For per-pod plugin data, see getVolumeDevicePluginsDir. -func (kl *Kubelet) getVolumeDevicePluginDir(pluginName string) string { - return filepath.Join(kl.getVolumeDevicePluginsDir(), pluginName, config.DefaultKubeletVolumeDevicesDirName) -} - -// GetPodDir returns the full path to the per-pod data directory for the -// specified pod. This directory may not exist if the pod does not exist. -func (kl *Kubelet) GetPodDir(podUID types.UID) string { - return kl.getPodDir(podUID) -} - -// getPodDir returns the full path to the per-pod directory for the pod with -// the given UID. -func (kl *Kubelet) getPodDir(podUID types.UID) string { - return filepath.Join(kl.getPodsDir(), string(podUID)) -} - -// getPodVolumesDir returns the full path to the per-pod data directory under -// which volumes are created for the specified pod. This directory may not -// exist if the pod does not exist. -func (kl *Kubelet) getPodVolumesDir(podUID types.UID) string { - return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletVolumesDirName) -} - -// getPodVolumeDir returns the full path to the directory which represents the -// named volume under the named plugin for specified pod. This directory may not -// exist if the pod does not exist. -func (kl *Kubelet) getPodVolumeDir(podUID types.UID, pluginName string, volumeName string) string { - return filepath.Join(kl.getPodVolumesDir(podUID), pluginName, volumeName) -} - -// getPodVolumeDevicesDir returns the full path to the per-pod data directory under -// which volumes are created for the specified pod. This directory may not -// exist if the pod does not exist. -func (kl *Kubelet) getPodVolumeDevicesDir(podUID types.UID) string { - return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletVolumeDevicesDirName) -} - -// getPodVolumeDeviceDir returns the full path to the directory which represents the -// named plugin for specified pod. This directory may not exist if the pod does not exist. -func (kl *Kubelet) getPodVolumeDeviceDir(podUID types.UID, pluginName string) string { - return filepath.Join(kl.getPodVolumeDevicesDir(podUID), pluginName) -} - -// getPodPluginsDir returns the full path to the per-pod data directory under -// which plugins may store data for the specified pod. This directory may not -// exist if the pod does not exist. -func (kl *Kubelet) getPodPluginsDir(podUID types.UID) string { - return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletPluginsDirName) -} - -// getPodPluginDir returns a data directory name for a given plugin name for a -// given pod UID. Plugins can use these directories to store data that they -// need to persist. For non-per-pod plugin data, see getPluginDir. -func (kl *Kubelet) getPodPluginDir(podUID types.UID, pluginName string) string { - return filepath.Join(kl.getPodPluginsDir(podUID), pluginName) -} - -// getPodContainerDir returns the full path to the per-pod data directory under -// which container data is held for the specified pod. This directory may not -// exist if the pod or container does not exist. -func (kl *Kubelet) getPodContainerDir(podUID types.UID, ctrName string) string { - return filepath.Join(kl.getPodDir(podUID), config.DefaultKubeletContainersDirName, ctrName) -} - -// GetPods returns all pods bound to the kubelet and their spec, and the mirror -// pods. -func (kl *Kubelet) GetPods() []*v1.Pod { - return kl.podManager.GetPods() -} - -// GetRunningPods returns all pods running on kubelet from looking at the -// container runtime cache. This function converts kubecontainer.Pod to -// v1.Pod, so only the fields that exist in both kubecontainer.Pod and -// v1.Pod are considered meaningful. -func (kl *Kubelet) GetRunningPods() ([]*v1.Pod, error) { - pods, err := kl.runtimeCache.GetPods() - if err != nil { - return nil, err - } - - apiPods := make([]*v1.Pod, 0, len(pods)) - for _, pod := range pods { - apiPods = append(apiPods, pod.ToAPIPod()) - } - return apiPods, nil -} - -// GetPodByFullName gets the pod with the given 'full' name, which -// incorporates the namespace as well as whether the pod was found. -func (kl *Kubelet) GetPodByFullName(podFullName string) (*v1.Pod, bool) { - return kl.podManager.GetPodByFullName(podFullName) -} - -// GetPodByName provides the first pod that matches namespace and name, as well -// as whether the pod was found. -func (kl *Kubelet) GetPodByName(namespace, name string) (*v1.Pod, bool) { - return kl.podManager.GetPodByName(namespace, name) -} - -// GetPodByCgroupfs provides the pod that maps to the specified cgroup, as well -// as whether the pod was found. -func (kl *Kubelet) GetPodByCgroupfs(cgroupfs string) (*v1.Pod, bool) { - pcm := kl.containerManager.NewPodContainerManager() - if result, podUID := pcm.IsPodCgroup(cgroupfs); result { - return kl.podManager.GetPodByUID(podUID) - } - return nil, false -} - -// GetHostname Returns the hostname as the kubelet sees it. -func (kl *Kubelet) GetHostname() string { - return kl.hostname -} - -// getRuntime returns the current Runtime implementation in use by the kubelet. -func (kl *Kubelet) getRuntime() kubecontainer.Runtime { - return kl.containerRuntime -} - -// GetNode returns the node info for the configured node name of this Kubelet. -func (kl *Kubelet) GetNode() (*v1.Node, error) { - if kl.kubeClient == nil { - return kl.initialNode() - } - return kl.nodeInfo.GetNodeInfo(string(kl.nodeName)) -} - -// getNodeAnyWay() must return a *v1.Node which is required by RunGeneralPredicates(). -// The *v1.Node is obtained as follows: -// Return kubelet's nodeInfo for this node, except on error or if in standalone mode, -// in which case return a manufactured nodeInfo representing a node with no pods, -// zero capacity, and the default labels. -func (kl *Kubelet) getNodeAnyWay() (*v1.Node, error) { - if kl.kubeClient != nil { - if n, err := kl.nodeInfo.GetNodeInfo(string(kl.nodeName)); err == nil { - return n, nil - } - } - return kl.initialNode() -} - -// GetNodeConfig returns the container manager node config. -func (kl *Kubelet) GetNodeConfig() cm.NodeConfig { - return kl.containerManager.GetNodeConfig() -} - -// GetPodCgroupRoot returns the listeral cgroupfs value for the cgroup containing all pods -func (kl *Kubelet) GetPodCgroupRoot() string { - return kl.containerManager.GetPodCgroupRoot() -} - -// GetHostIP returns host IP or nil in case of error. -func (kl *Kubelet) GetHostIP() (net.IP, error) { - node, err := kl.GetNode() - if err != nil { - return nil, fmt.Errorf("cannot get node: %v", err) - } - return utilnode.GetNodeHostIP(node) -} - -// getHostIPAnyway attempts to return the host IP from kubelet's nodeInfo, or -// the initialNode. -func (kl *Kubelet) getHostIPAnyWay() (net.IP, error) { - node, err := kl.getNodeAnyWay() - if err != nil { - return nil, err - } - return utilnode.GetNodeHostIP(node) -} - -// GetExtraSupplementalGroupsForPod returns a list of the extra -// supplemental groups for the Pod. These extra supplemental groups come -// from annotations on persistent volumes that the pod depends on. -func (kl *Kubelet) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 { - return kl.volumeManager.GetExtraSupplementalGroupsForPod(pod) -} - -// getPodVolumePathListFromDisk returns a list of the volume paths by reading the -// volume directories for the given pod from the disk. -func (kl *Kubelet) getPodVolumePathListFromDisk(podUID types.UID) ([]string, error) { - volumes := []string{} - podVolDir := kl.getPodVolumesDir(podUID) - - if pathExists, pathErr := volumeutil.PathExists(podVolDir); pathErr != nil { - return volumes, fmt.Errorf("Error checking if path %q exists: %v", podVolDir, pathErr) - } else if !pathExists { - glog.Warningf("Path %q does not exist", podVolDir) - return volumes, nil - } - - volumePluginDirs, err := ioutil.ReadDir(podVolDir) - if err != nil { - glog.Errorf("Could not read directory %s: %v", podVolDir, err) - return volumes, err - } - for _, volumePluginDir := range volumePluginDirs { - volumePluginName := volumePluginDir.Name() - volumePluginPath := filepath.Join(podVolDir, volumePluginName) - volumeDirs, err := utilfile.ReadDirNoStat(volumePluginPath) - if err != nil { - return volumes, fmt.Errorf("Could not read directory %s: %v", volumePluginPath, err) - } - for _, volumeDir := range volumeDirs { - volumes = append(volumes, filepath.Join(volumePluginPath, volumeDir)) - } - } - return volumes, nil -} - -func (kl *Kubelet) getMountedVolumePathListFromDisk(podUID types.UID) ([]string, error) { - mountedVolumes := []string{} - volumePaths, err := kl.getPodVolumePathListFromDisk(podUID) - if err != nil { - return mountedVolumes, err - } - for _, volumePath := range volumePaths { - isNotMount, err := kl.mounter.IsLikelyNotMountPoint(volumePath) - if err != nil { - return mountedVolumes, err - } - if !isNotMount { - mountedVolumes = append(mountedVolumes, volumePath) - } - } - return mountedVolumes, nil -} - -// GetVersionInfo returns information about the version of cAdvisor in use. -func (kl *Kubelet) GetVersionInfo() (*cadvisorapiv1.VersionInfo, error) { - return kl.cadvisor.VersionInfo() -} - -// GetCachedMachineInfo assumes that the machine info can't change without a reboot -func (kl *Kubelet) GetCachedMachineInfo() (*cadvisorapiv1.MachineInfo, error) { - return kl.machineInfo, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go deleted file mode 100644 index fd7a84e4..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_network.go +++ /dev/null @@ -1,167 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" - utiliptables "k8s.io/kubernetes/pkg/util/iptables" -) - -const ( - // KubeMarkMasqChain is the mark-for-masquerade chain - // TODO: clean up this logic in kube-proxy - KubeMarkMasqChain utiliptables.Chain = "KUBE-MARK-MASQ" - - // KubeMarkDropChain is the mark-for-drop chain - KubeMarkDropChain utiliptables.Chain = "KUBE-MARK-DROP" - - // KubePostroutingChain is kubernetes postrouting rules - KubePostroutingChain utiliptables.Chain = "KUBE-POSTROUTING" - - // KubeFirewallChain is kubernetes firewall rules - KubeFirewallChain utiliptables.Chain = "KUBE-FIREWALL" -) - -// providerRequiresNetworkingConfiguration returns whether the cloud provider -// requires special networking configuration. -func (kl *Kubelet) providerRequiresNetworkingConfiguration() bool { - // TODO: We should have a mechanism to say whether native cloud provider - // is used or whether we are using overlay networking. We should return - // true for cloud providers if they implement Routes() interface and - // we are not using overlay networking. - if kl.cloud == nil || kl.cloud.ProviderName() != "gce" { - return false - } - _, supported := kl.cloud.Routes() - return supported -} - -// updatePodCIDR updates the pod CIDR in the runtime state if it is different -// from the current CIDR. -func (kl *Kubelet) updatePodCIDR(cidr string) { - podCIDR := kl.runtimeState.podCIDR() - - if podCIDR == cidr { - return - } - - // kubelet -> generic runtime -> runtime shim -> network plugin - // docker/non-cri implementations have a passthrough UpdatePodCIDR - if err := kl.getRuntime().UpdatePodCIDR(cidr); err != nil { - glog.Errorf("Failed to update pod CIDR: %v", err) - return - } - - glog.Infof("Setting Pod CIDR: %v -> %v", podCIDR, cidr) - kl.runtimeState.setPodCIDR(cidr) -} - -// syncNetworkUtil ensures the network utility are present on host. -// Network util includes: -// 1. In nat table, KUBE-MARK-DROP rule to mark connections for dropping -// Marked connection will be drop on INPUT/OUTPUT Chain in filter table -// 2. In nat table, KUBE-MARK-MASQ rule to mark connections for SNAT -// Marked connection will get SNAT on POSTROUTING Chain in nat table -func (kl *Kubelet) syncNetworkUtil() { - if kl.iptablesMasqueradeBit < 0 || kl.iptablesMasqueradeBit > 31 { - glog.Errorf("invalid iptables-masquerade-bit %v not in [0, 31]", kl.iptablesMasqueradeBit) - return - } - - if kl.iptablesDropBit < 0 || kl.iptablesDropBit > 31 { - glog.Errorf("invalid iptables-drop-bit %v not in [0, 31]", kl.iptablesDropBit) - return - } - - if kl.iptablesDropBit == kl.iptablesMasqueradeBit { - glog.Errorf("iptables-masquerade-bit %v and iptables-drop-bit %v must be different", kl.iptablesMasqueradeBit, kl.iptablesDropBit) - return - } - - // Setup KUBE-MARK-DROP rules - dropMark := getIPTablesMark(kl.iptablesDropBit) - if _, err := kl.iptClient.EnsureChain(utiliptables.TableNAT, KubeMarkDropChain); err != nil { - glog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableNAT, KubeMarkDropChain, err) - return - } - if _, err := kl.iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubeMarkDropChain, "-j", "MARK", "--set-xmark", dropMark); err != nil { - glog.Errorf("Failed to ensure marking rule for %v: %v", KubeMarkDropChain, err) - return - } - if _, err := kl.iptClient.EnsureChain(utiliptables.TableFilter, KubeFirewallChain); err != nil { - glog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableFilter, KubeFirewallChain, err) - return - } - if _, err := kl.iptClient.EnsureRule(utiliptables.Append, utiliptables.TableFilter, KubeFirewallChain, - "-m", "comment", "--comment", "kubernetes firewall for dropping marked packets", - "-m", "mark", "--mark", dropMark, - "-j", "DROP"); err != nil { - glog.Errorf("Failed to ensure rule to drop packet marked by %v in %v chain %v: %v", KubeMarkDropChain, utiliptables.TableFilter, KubeFirewallChain, err) - return - } - if _, err := kl.iptClient.EnsureRule(utiliptables.Prepend, utiliptables.TableFilter, utiliptables.ChainOutput, "-j", string(KubeFirewallChain)); err != nil { - glog.Errorf("Failed to ensure that %s chain %s jumps to %s: %v", utiliptables.TableFilter, utiliptables.ChainOutput, KubeFirewallChain, err) - return - } - if _, err := kl.iptClient.EnsureRule(utiliptables.Prepend, utiliptables.TableFilter, utiliptables.ChainInput, "-j", string(KubeFirewallChain)); err != nil { - glog.Errorf("Failed to ensure that %s chain %s jumps to %s: %v", utiliptables.TableFilter, utiliptables.ChainInput, KubeFirewallChain, err) - return - } - - // Setup KUBE-MARK-MASQ rules - masqueradeMark := getIPTablesMark(kl.iptablesMasqueradeBit) - if _, err := kl.iptClient.EnsureChain(utiliptables.TableNAT, KubeMarkMasqChain); err != nil { - glog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableNAT, KubeMarkMasqChain, err) - return - } - if _, err := kl.iptClient.EnsureChain(utiliptables.TableNAT, KubePostroutingChain); err != nil { - glog.Errorf("Failed to ensure that %s chain %s exists: %v", utiliptables.TableNAT, KubePostroutingChain, err) - return - } - if _, err := kl.iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubeMarkMasqChain, "-j", "MARK", "--set-xmark", masqueradeMark); err != nil { - glog.Errorf("Failed to ensure marking rule for %v: %v", KubeMarkMasqChain, err) - return - } - if _, err := kl.iptClient.EnsureRule(utiliptables.Prepend, utiliptables.TableNAT, utiliptables.ChainPostrouting, - "-m", "comment", "--comment", "kubernetes postrouting rules", "-j", string(KubePostroutingChain)); err != nil { - glog.Errorf("Failed to ensure that %s chain %s jumps to %s: %v", utiliptables.TableNAT, utiliptables.ChainPostrouting, KubePostroutingChain, err) - return - } - if _, err := kl.iptClient.EnsureRule(utiliptables.Append, utiliptables.TableNAT, KubePostroutingChain, - "-m", "comment", "--comment", "kubernetes service traffic requiring SNAT", - "-m", "mark", "--mark", masqueradeMark, "-j", "MASQUERADE"); err != nil { - glog.Errorf("Failed to ensure SNAT rule for packets marked by %v in %v chain %v: %v", KubeMarkMasqChain, utiliptables.TableNAT, KubePostroutingChain, err) - return - } -} - -// getIPTablesMark returns the fwmark given the bit -func getIPTablesMark(bit int) string { - value := 1 << uint(bit) - return fmt.Sprintf("%#08x/%#08x", value, value) -} - -// GetPodDNS returns DNS settings for the pod. -// This function is defined in kubecontainer.RuntimeHelper interface so we -// have to implement it. -func (kl *Kubelet) GetPodDNS(pod *v1.Pod) (*runtimeapi.DNSConfig, error) { - return kl.dnsConfigurer.GetPodDNS(pod) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go deleted file mode 100644 index 4126eb99..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go +++ /dev/null @@ -1,1178 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "context" - "fmt" - "math" - "net" - goruntime "runtime" - "strings" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/api/core/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/types" - utilnet "k8s.io/apimachinery/pkg/util/net" - utilfeature "k8s.io/apiserver/pkg/util/feature" - k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/features" - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" - "k8s.io/kubernetes/pkg/kubelet/cadvisor" - "k8s.io/kubernetes/pkg/kubelet/events" - "k8s.io/kubernetes/pkg/kubelet/util" - "k8s.io/kubernetes/pkg/scheduler/algorithm" - nodeutil "k8s.io/kubernetes/pkg/util/node" - "k8s.io/kubernetes/pkg/version" - volutil "k8s.io/kubernetes/pkg/volume/util" -) - -const ( - // maxNamesPerImageInNodeStatus is max number of names per image stored in - // the node status. - maxNamesPerImageInNodeStatus = 5 -) - -// registerWithAPIServer registers the node with the cluster master. It is safe -// to call multiple times, but not concurrently (kl.registrationCompleted is -// not locked). -func (kl *Kubelet) registerWithAPIServer() { - if kl.registrationCompleted { - return - } - step := 100 * time.Millisecond - - for { - time.Sleep(step) - step = step * 2 - if step >= 7*time.Second { - step = 7 * time.Second - } - - node, err := kl.initialNode() - if err != nil { - glog.Errorf("Unable to construct v1.Node object for kubelet: %v", err) - continue - } - - glog.Infof("Attempting to register node %s", node.Name) - registered := kl.tryRegisterWithAPIServer(node) - if registered { - glog.Infof("Successfully registered node %s", node.Name) - kl.registrationCompleted = true - return - } - } -} - -// tryRegisterWithAPIServer makes an attempt to register the given node with -// the API server, returning a boolean indicating whether the attempt was -// successful. If a node with the same name already exists, it reconciles the -// value of the annotation for controller-managed attach-detach of attachable -// persistent volumes for the node. If a node of the same name exists but has -// a different externalID value, it attempts to delete that node so that a -// later attempt can recreate it. -func (kl *Kubelet) tryRegisterWithAPIServer(node *v1.Node) bool { - _, err := kl.kubeClient.CoreV1().Nodes().Create(node) - if err == nil { - return true - } - - if !apierrors.IsAlreadyExists(err) { - glog.Errorf("Unable to register node %q with API server: %v", kl.nodeName, err) - return false - } - - existingNode, err := kl.kubeClient.CoreV1().Nodes().Get(string(kl.nodeName), metav1.GetOptions{}) - if err != nil { - glog.Errorf("Unable to register node %q with API server: error getting existing node: %v", kl.nodeName, err) - return false - } - if existingNode == nil { - glog.Errorf("Unable to register node %q with API server: no node instance returned", kl.nodeName) - return false - } - - originalNode := existingNode.DeepCopy() - if originalNode == nil { - glog.Errorf("Nil %q node object", kl.nodeName) - return false - } - - glog.Infof("Node %s was previously registered", kl.nodeName) - - // Edge case: the node was previously registered; reconcile - // the value of the controller-managed attach-detach - // annotation. - requiresUpdate := kl.reconcileCMADAnnotationWithExistingNode(node, existingNode) - requiresUpdate = kl.updateDefaultLabels(node, existingNode) || requiresUpdate - requiresUpdate = kl.reconcileExtendedResource(node, existingNode) || requiresUpdate - if requiresUpdate { - if _, _, err := nodeutil.PatchNodeStatus(kl.kubeClient.CoreV1(), types.NodeName(kl.nodeName), originalNode, existingNode); err != nil { - glog.Errorf("Unable to reconcile node %q with API server: error updating node: %v", kl.nodeName, err) - return false - } - } - - return true -} - -// Zeros out extended resource capacity during reconciliation. -func (kl *Kubelet) reconcileExtendedResource(initialNode, node *v1.Node) bool { - requiresUpdate := false - for k := range node.Status.Capacity { - if v1helper.IsExtendedResourceName(k) { - node.Status.Capacity[k] = *resource.NewQuantity(int64(0), resource.DecimalSI) - node.Status.Allocatable[k] = *resource.NewQuantity(int64(0), resource.DecimalSI) - requiresUpdate = true - } - } - return requiresUpdate -} - -// updateDefaultLabels will set the default labels on the node -func (kl *Kubelet) updateDefaultLabels(initialNode, existingNode *v1.Node) bool { - defaultLabels := []string{ - kubeletapis.LabelHostname, - kubeletapis.LabelZoneFailureDomain, - kubeletapis.LabelZoneRegion, - kubeletapis.LabelInstanceType, - kubeletapis.LabelOS, - kubeletapis.LabelArch, - } - - var needsUpdate bool = false - //Set default labels but make sure to not set labels with empty values - for _, label := range defaultLabels { - if _, hasInitialValue := initialNode.Labels[label]; !hasInitialValue { - continue - } - - if existingNode.Labels[label] != initialNode.Labels[label] { - existingNode.Labels[label] = initialNode.Labels[label] - needsUpdate = true - } - - if existingNode.Labels[label] == "" { - delete(existingNode.Labels, label) - } - } - - return needsUpdate -} - -// reconcileCMADAnnotationWithExistingNode reconciles the controller-managed -// attach-detach annotation on a new node and the existing node, returning -// whether the existing node must be updated. -func (kl *Kubelet) reconcileCMADAnnotationWithExistingNode(node, existingNode *v1.Node) bool { - var ( - existingCMAAnnotation = existingNode.Annotations[volutil.ControllerManagedAttachAnnotation] - newCMAAnnotation, newSet = node.Annotations[volutil.ControllerManagedAttachAnnotation] - ) - - if newCMAAnnotation == existingCMAAnnotation { - return false - } - - // If the just-constructed node and the existing node do - // not have the same value, update the existing node with - // the correct value of the annotation. - if !newSet { - glog.Info("Controller attach-detach setting changed to false; updating existing Node") - delete(existingNode.Annotations, volutil.ControllerManagedAttachAnnotation) - } else { - glog.Info("Controller attach-detach setting changed to true; updating existing Node") - if existingNode.Annotations == nil { - existingNode.Annotations = make(map[string]string) - } - existingNode.Annotations[volutil.ControllerManagedAttachAnnotation] = newCMAAnnotation - } - - return true -} - -// initialNode constructs the initial v1.Node for this Kubelet, incorporating node -// labels, information from the cloud provider, and Kubelet configuration. -func (kl *Kubelet) initialNode() (*v1.Node, error) { - node := &v1.Node{ - ObjectMeta: metav1.ObjectMeta{ - Name: string(kl.nodeName), - Labels: map[string]string{ - kubeletapis.LabelHostname: kl.hostname, - kubeletapis.LabelOS: goruntime.GOOS, - kubeletapis.LabelArch: goruntime.GOARCH, - }, - }, - Spec: v1.NodeSpec{ - Unschedulable: !kl.registerSchedulable, - }, - } - nodeTaints := make([]v1.Taint, 0) - if len(kl.registerWithTaints) > 0 { - taints := make([]v1.Taint, len(kl.registerWithTaints)) - for i := range kl.registerWithTaints { - if err := k8s_api_v1.Convert_core_Taint_To_v1_Taint(&kl.registerWithTaints[i], &taints[i], nil); err != nil { - return nil, err - } - } - nodeTaints = append(nodeTaints, taints...) - } - if kl.externalCloudProvider { - taint := v1.Taint{ - Key: algorithm.TaintExternalCloudProvider, - Value: "true", - Effect: v1.TaintEffectNoSchedule, - } - - nodeTaints = append(nodeTaints, taint) - } - if len(nodeTaints) > 0 { - node.Spec.Taints = nodeTaints - } - // Initially, set NodeNetworkUnavailable to true. - if kl.providerRequiresNetworkingConfiguration() { - node.Status.Conditions = append(node.Status.Conditions, v1.NodeCondition{ - Type: v1.NodeNetworkUnavailable, - Status: v1.ConditionTrue, - Reason: "NoRouteCreated", - Message: "Node created without a route", - LastTransitionTime: metav1.NewTime(kl.clock.Now()), - }) - } - - if kl.enableControllerAttachDetach { - if node.Annotations == nil { - node.Annotations = make(map[string]string) - } - - glog.Infof("Setting node annotation to enable volume controller attach/detach") - node.Annotations[volutil.ControllerManagedAttachAnnotation] = "true" - } else { - glog.Infof("Controller attach/detach is disabled for this node; Kubelet will attach and detach volumes") - } - - if kl.keepTerminatedPodVolumes { - if node.Annotations == nil { - node.Annotations = make(map[string]string) - } - glog.Infof("Setting node annotation to keep pod volumes of terminated pods attached to the node") - node.Annotations[volutil.KeepTerminatedPodVolumesAnnotation] = "true" - } - - // @question: should this be place after the call to the cloud provider? which also applies labels - for k, v := range kl.nodeLabels { - if cv, found := node.ObjectMeta.Labels[k]; found { - glog.Warningf("the node label %s=%s will overwrite default setting %s", k, v, cv) - } - node.ObjectMeta.Labels[k] = v - } - - if kl.providerID != "" { - node.Spec.ProviderID = kl.providerID - } - - if kl.cloud != nil { - instances, ok := kl.cloud.Instances() - if !ok { - return nil, fmt.Errorf("failed to get instances from cloud provider") - } - - // TODO: We can't assume that the node has credentials to talk to the - // cloudprovider from arbitrary nodes. At most, we should talk to a - // local metadata server here. - var err error - if node.Spec.ProviderID == "" { - node.Spec.ProviderID, err = cloudprovider.GetInstanceProviderID(context.TODO(), kl.cloud, kl.nodeName) - if err != nil { - return nil, err - } - } - - instanceType, err := instances.InstanceType(context.TODO(), kl.nodeName) - if err != nil { - return nil, err - } - if instanceType != "" { - glog.Infof("Adding node label from cloud provider: %s=%s", kubeletapis.LabelInstanceType, instanceType) - node.ObjectMeta.Labels[kubeletapis.LabelInstanceType] = instanceType - } - // If the cloud has zone information, label the node with the zone information - zones, ok := kl.cloud.Zones() - if ok { - zone, err := zones.GetZone(context.TODO()) - if err != nil { - return nil, fmt.Errorf("failed to get zone from cloud provider: %v", err) - } - if zone.FailureDomain != "" { - glog.Infof("Adding node label from cloud provider: %s=%s", kubeletapis.LabelZoneFailureDomain, zone.FailureDomain) - node.ObjectMeta.Labels[kubeletapis.LabelZoneFailureDomain] = zone.FailureDomain - } - if zone.Region != "" { - glog.Infof("Adding node label from cloud provider: %s=%s", kubeletapis.LabelZoneRegion, zone.Region) - node.ObjectMeta.Labels[kubeletapis.LabelZoneRegion] = zone.Region - } - } - } - - kl.setNodeStatus(node) - - return node, nil -} - -// setVolumeLimits updates volume limits on the node -func (kl *Kubelet) setVolumeLimits(node *v1.Node) { - if node.Status.Capacity == nil { - node.Status.Capacity = v1.ResourceList{} - } - - if node.Status.Allocatable == nil { - node.Status.Allocatable = v1.ResourceList{} - } - - pluginWithLimits := kl.volumePluginMgr.ListVolumePluginWithLimits() - for _, volumePlugin := range pluginWithLimits { - attachLimits, err := volumePlugin.GetVolumeLimits() - if err != nil { - glog.V(4).Infof("Error getting volume limit for plugin %s", volumePlugin.GetPluginName()) - continue - } - for limitKey, value := range attachLimits { - node.Status.Capacity[v1.ResourceName(limitKey)] = *resource.NewQuantity(value, resource.DecimalSI) - node.Status.Allocatable[v1.ResourceName(limitKey)] = *resource.NewQuantity(value, resource.DecimalSI) - } - } -} - -// syncNodeStatus should be called periodically from a goroutine. -// It synchronizes node status to master, registering the kubelet first if -// necessary. -func (kl *Kubelet) syncNodeStatus() { - if kl.kubeClient == nil || kl.heartbeatClient == nil { - return - } - if kl.registerNode { - // This will exit immediately if it doesn't need to do anything. - kl.registerWithAPIServer() - } - if err := kl.updateNodeStatus(); err != nil { - glog.Errorf("Unable to update node status: %v", err) - } -} - -// updateNodeStatus updates node status to master with retries. -func (kl *Kubelet) updateNodeStatus() error { - glog.V(5).Infof("Updating node status") - for i := 0; i < nodeStatusUpdateRetry; i++ { - if err := kl.tryUpdateNodeStatus(i); err != nil { - if i > 0 && kl.onRepeatedHeartbeatFailure != nil { - kl.onRepeatedHeartbeatFailure() - } - glog.Errorf("Error updating node status, will retry: %v", err) - } else { - return nil - } - } - return fmt.Errorf("update node status exceeds retry count") -} - -// tryUpdateNodeStatus tries to update node status to master. If ReconcileCBR0 -// is set, this function will also confirm that cbr0 is configured correctly. -func (kl *Kubelet) tryUpdateNodeStatus(tryNumber int) error { - // In large clusters, GET and PUT operations on Node objects coming - // from here are the majority of load on apiserver and etcd. - // To reduce the load on etcd, we are serving GET operations from - // apiserver cache (the data might be slightly delayed but it doesn't - // seem to cause more conflict - the delays are pretty small). - // If it result in a conflict, all retries are served directly from etcd. - opts := metav1.GetOptions{} - if tryNumber == 0 { - util.FromApiserverCache(&opts) - } - node, err := kl.heartbeatClient.Nodes().Get(string(kl.nodeName), opts) - if err != nil { - return fmt.Errorf("error getting node %q: %v", kl.nodeName, err) - } - - originalNode := node.DeepCopy() - if originalNode == nil { - return fmt.Errorf("nil %q node object", kl.nodeName) - } - - if node.Spec.PodCIDR != "" { - kl.updatePodCIDR(node.Spec.PodCIDR) - } - - kl.setNodeStatus(node) - // Patch the current status on the API server - updatedNode, _, err := nodeutil.PatchNodeStatus(kl.heartbeatClient, types.NodeName(kl.nodeName), originalNode, node) - if err != nil { - return err - } - // If update finishes successfully, mark the volumeInUse as reportedInUse to indicate - // those volumes are already updated in the node's status - kl.volumeManager.MarkVolumesAsReportedInUse(updatedNode.Status.VolumesInUse) - return nil -} - -// recordNodeStatusEvent records an event of the given type with the given -// message for the node. -func (kl *Kubelet) recordNodeStatusEvent(eventType, event string) { - glog.V(2).Infof("Recording %s event message for node %s", event, kl.nodeName) - // TODO: This requires a transaction, either both node status is updated - // and event is recorded or neither should happen, see issue #6055. - kl.recorder.Eventf(kl.nodeRef, eventType, event, "Node %s status is now: %s", kl.nodeName, event) -} - -// Set IP and hostname addresses for the node. -func (kl *Kubelet) setNodeAddress(node *v1.Node) error { - if kl.nodeIP != nil { - if err := kl.nodeIPValidator(kl.nodeIP); err != nil { - return fmt.Errorf("failed to validate nodeIP: %v", err) - } - glog.V(2).Infof("Using node IP: %q", kl.nodeIP.String()) - } - - if kl.externalCloudProvider { - if kl.nodeIP != nil { - if node.ObjectMeta.Annotations == nil { - node.ObjectMeta.Annotations = make(map[string]string) - } - node.ObjectMeta.Annotations[kubeletapis.AnnotationProvidedIPAddr] = kl.nodeIP.String() - } - // We rely on the external cloud provider to supply the addresses. - return nil - } - if kl.cloud != nil { - instances, ok := kl.cloud.Instances() - if !ok { - return fmt.Errorf("failed to get instances from cloud provider") - } - // TODO(roberthbailey): Can we do this without having credentials to talk - // to the cloud provider? - // TODO(justinsb): We can if CurrentNodeName() was actually CurrentNode() and returned an interface - // TODO: If IP addresses couldn't be fetched from the cloud provider, should kubelet fallback on the other methods for getting the IP below? - var nodeAddresses []v1.NodeAddress - var err error - - // Make sure the instances.NodeAddresses returns even if the cloud provider API hangs for a long time - func() { - kl.cloudproviderRequestMux.Lock() - if len(kl.cloudproviderRequestParallelism) > 0 { - kl.cloudproviderRequestMux.Unlock() - return - } - kl.cloudproviderRequestParallelism <- 0 - kl.cloudproviderRequestMux.Unlock() - - go func() { - nodeAddresses, err = instances.NodeAddresses(context.TODO(), kl.nodeName) - - kl.cloudproviderRequestMux.Lock() - <-kl.cloudproviderRequestParallelism - kl.cloudproviderRequestMux.Unlock() - - kl.cloudproviderRequestSync <- 0 - }() - }() - - select { - case <-kl.cloudproviderRequestSync: - case <-time.After(kl.cloudproviderRequestTimeout): - err = fmt.Errorf("Timeout after %v", kl.cloudproviderRequestTimeout) - } - - if err != nil { - return fmt.Errorf("failed to get node address from cloud provider: %v", err) - } - if kl.nodeIP != nil { - enforcedNodeAddresses := []v1.NodeAddress{} - - var nodeIPType v1.NodeAddressType - for _, nodeAddress := range nodeAddresses { - if nodeAddress.Address == kl.nodeIP.String() { - enforcedNodeAddresses = append(enforcedNodeAddresses, v1.NodeAddress{Type: nodeAddress.Type, Address: nodeAddress.Address}) - nodeIPType = nodeAddress.Type - break - } - } - if len(enforcedNodeAddresses) > 0 { - for _, nodeAddress := range nodeAddresses { - if nodeAddress.Type != nodeIPType && nodeAddress.Type != v1.NodeHostName { - enforcedNodeAddresses = append(enforcedNodeAddresses, v1.NodeAddress{Type: nodeAddress.Type, Address: nodeAddress.Address}) - } - } - - enforcedNodeAddresses = append(enforcedNodeAddresses, v1.NodeAddress{Type: v1.NodeHostName, Address: kl.GetHostname()}) - node.Status.Addresses = enforcedNodeAddresses - return nil - } - return fmt.Errorf("failed to get node address from cloud provider that matches ip: %v", kl.nodeIP) - } - - // Only add a NodeHostName address if the cloudprovider did not specify one - // (we assume the cloudprovider knows best) - var addressNodeHostName *v1.NodeAddress - for i := range nodeAddresses { - if nodeAddresses[i].Type == v1.NodeHostName { - addressNodeHostName = &nodeAddresses[i] - break - } - } - if addressNodeHostName == nil { - hostnameAddress := v1.NodeAddress{Type: v1.NodeHostName, Address: kl.GetHostname()} - nodeAddresses = append(nodeAddresses, hostnameAddress) - } else { - glog.V(2).Infof("Using Node Hostname from cloudprovider: %q", addressNodeHostName.Address) - } - node.Status.Addresses = nodeAddresses - } else { - var ipAddr net.IP - var err error - - // 1) Use nodeIP if set - // 2) If the user has specified an IP to HostnameOverride, use it - // 3) Lookup the IP from node name by DNS and use the first valid IPv4 address. - // If the node does not have a valid IPv4 address, use the first valid IPv6 address. - // 4) Try to get the IP from the network interface used as default gateway - if kl.nodeIP != nil { - ipAddr = kl.nodeIP - } else if addr := net.ParseIP(kl.hostname); addr != nil { - ipAddr = addr - } else { - var addrs []net.IP - addrs, _ = net.LookupIP(node.Name) - for _, addr := range addrs { - if err = kl.nodeIPValidator(addr); err == nil { - if addr.To4() != nil { - ipAddr = addr - break - } - if addr.To16() != nil && ipAddr == nil { - ipAddr = addr - } - } - } - - if ipAddr == nil { - ipAddr, err = utilnet.ChooseHostInterface() - } - } - - if ipAddr == nil { - // We tried everything we could, but the IP address wasn't fetchable; error out - return fmt.Errorf("can't get ip address of node %s. error: %v", node.Name, err) - } - node.Status.Addresses = []v1.NodeAddress{ - {Type: v1.NodeInternalIP, Address: ipAddr.String()}, - {Type: v1.NodeHostName, Address: kl.GetHostname()}, - } - } - return nil -} - -func (kl *Kubelet) setNodeStatusMachineInfo(node *v1.Node) { - // Note: avoid blindly overwriting the capacity in case opaque - // resources are being advertised. - if node.Status.Capacity == nil { - node.Status.Capacity = v1.ResourceList{} - } - - var devicePluginAllocatable v1.ResourceList - var devicePluginCapacity v1.ResourceList - var removedDevicePlugins []string - - // TODO: Post NotReady if we cannot get MachineInfo from cAdvisor. This needs to start - // cAdvisor locally, e.g. for test-cmd.sh, and in integration test. - info, err := kl.GetCachedMachineInfo() - if err != nil { - // TODO(roberthbailey): This is required for test-cmd.sh to pass. - // See if the test should be updated instead. - node.Status.Capacity[v1.ResourceCPU] = *resource.NewMilliQuantity(0, resource.DecimalSI) - node.Status.Capacity[v1.ResourceMemory] = resource.MustParse("0Gi") - node.Status.Capacity[v1.ResourcePods] = *resource.NewQuantity(int64(kl.maxPods), resource.DecimalSI) - glog.Errorf("Error getting machine info: %v", err) - } else { - node.Status.NodeInfo.MachineID = info.MachineID - node.Status.NodeInfo.SystemUUID = info.SystemUUID - - for rName, rCap := range cadvisor.CapacityFromMachineInfo(info) { - node.Status.Capacity[rName] = rCap - } - - if kl.podsPerCore > 0 { - node.Status.Capacity[v1.ResourcePods] = *resource.NewQuantity( - int64(math.Min(float64(info.NumCores*kl.podsPerCore), float64(kl.maxPods))), resource.DecimalSI) - } else { - node.Status.Capacity[v1.ResourcePods] = *resource.NewQuantity( - int64(kl.maxPods), resource.DecimalSI) - } - - if node.Status.NodeInfo.BootID != "" && - node.Status.NodeInfo.BootID != info.BootID { - // TODO: This requires a transaction, either both node status is updated - // and event is recorded or neither should happen, see issue #6055. - kl.recorder.Eventf(kl.nodeRef, v1.EventTypeWarning, events.NodeRebooted, - "Node %s has been rebooted, boot id: %s", kl.nodeName, info.BootID) - } - node.Status.NodeInfo.BootID = info.BootID - - if utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { - // TODO: all the node resources should use GetCapacity instead of deriving the - // capacity for every node status request - initialCapacity := kl.containerManager.GetCapacity() - if initialCapacity != nil { - node.Status.Capacity[v1.ResourceEphemeralStorage] = initialCapacity[v1.ResourceEphemeralStorage] - } - } - - devicePluginCapacity, devicePluginAllocatable, removedDevicePlugins = kl.containerManager.GetDevicePluginResourceCapacity() - if devicePluginCapacity != nil { - for k, v := range devicePluginCapacity { - if old, ok := node.Status.Capacity[k]; !ok || old.Value() != v.Value() { - glog.V(2).Infof("Update capacity for %s to %d", k, v.Value()) - } - node.Status.Capacity[k] = v - } - } - - for _, removedResource := range removedDevicePlugins { - glog.V(2).Infof("Set capacity for %s to 0 on device removal", removedResource) - // Set the capacity of the removed resource to 0 instead of - // removing the resource from the node status. This is to indicate - // that the resource is managed by device plugin and had been - // registered before. - // - // This is required to differentiate the device plugin managed - // resources and the cluster-level resources, which are absent in - // node status. - node.Status.Capacity[v1.ResourceName(removedResource)] = *resource.NewQuantity(int64(0), resource.DecimalSI) - } - } - - // Set Allocatable. - if node.Status.Allocatable == nil { - node.Status.Allocatable = make(v1.ResourceList) - } - // Remove extended resources from allocatable that are no longer - // present in capacity. - for k := range node.Status.Allocatable { - _, found := node.Status.Capacity[k] - if !found && v1helper.IsExtendedResourceName(k) { - delete(node.Status.Allocatable, k) - } - } - allocatableReservation := kl.containerManager.GetNodeAllocatableReservation() - for k, v := range node.Status.Capacity { - value := *(v.Copy()) - if res, exists := allocatableReservation[k]; exists { - value.Sub(res) - } - if value.Sign() < 0 { - // Negative Allocatable resources don't make sense. - value.Set(0) - } - node.Status.Allocatable[k] = value - } - - if devicePluginAllocatable != nil { - for k, v := range devicePluginAllocatable { - if old, ok := node.Status.Allocatable[k]; !ok || old.Value() != v.Value() { - glog.V(2).Infof("Update allocatable for %s to %d", k, v.Value()) - } - node.Status.Allocatable[k] = v - } - } - // for every huge page reservation, we need to remove it from allocatable memory - for k, v := range node.Status.Capacity { - if v1helper.IsHugePageResourceName(k) { - allocatableMemory := node.Status.Allocatable[v1.ResourceMemory] - value := *(v.Copy()) - allocatableMemory.Sub(value) - if allocatableMemory.Sign() < 0 { - // Negative Allocatable resources don't make sense. - allocatableMemory.Set(0) - } - node.Status.Allocatable[v1.ResourceMemory] = allocatableMemory - } - } -} - -// Set versioninfo for the node. -func (kl *Kubelet) setNodeStatusVersionInfo(node *v1.Node) { - verinfo, err := kl.cadvisor.VersionInfo() - if err != nil { - glog.Errorf("Error getting version info: %v", err) - return - } - - node.Status.NodeInfo.KernelVersion = verinfo.KernelVersion - node.Status.NodeInfo.OSImage = verinfo.ContainerOsVersion - - runtimeVersion := "Unknown" - if runtimeVer, err := kl.containerRuntime.Version(); err == nil { - runtimeVersion = runtimeVer.String() - } - node.Status.NodeInfo.ContainerRuntimeVersion = fmt.Sprintf("%s://%s", kl.containerRuntime.Type(), runtimeVersion) - - node.Status.NodeInfo.KubeletVersion = version.Get().String() - // TODO: kube-proxy might be different version from kubelet in the future - node.Status.NodeInfo.KubeProxyVersion = version.Get().String() -} - -// Set daemonEndpoints for the node. -func (kl *Kubelet) setNodeStatusDaemonEndpoints(node *v1.Node) { - node.Status.DaemonEndpoints = *kl.daemonEndpoints -} - -// Set images list for the node -func (kl *Kubelet) setNodeStatusImages(node *v1.Node) { - // Update image list of this node - var imagesOnNode []v1.ContainerImage - containerImages, err := kl.imageManager.GetImageList() - if err != nil { - glog.Errorf("Error getting image list: %v", err) - node.Status.Images = imagesOnNode - return - } - // sort the images from max to min, and only set top N images into the node status. - if int(kl.nodeStatusMaxImages) > -1 && - int(kl.nodeStatusMaxImages) < len(containerImages) { - containerImages = containerImages[0:kl.nodeStatusMaxImages] - } - - for _, image := range containerImages { - names := append(image.RepoDigests, image.RepoTags...) - // Report up to maxNamesPerImageInNodeStatus names per image. - if len(names) > maxNamesPerImageInNodeStatus { - names = names[0:maxNamesPerImageInNodeStatus] - } - imagesOnNode = append(imagesOnNode, v1.ContainerImage{ - Names: names, - SizeBytes: image.Size, - }) - } - - node.Status.Images = imagesOnNode -} - -// Set the GOOS and GOARCH for this node -func (kl *Kubelet) setNodeStatusGoRuntime(node *v1.Node) { - node.Status.NodeInfo.OperatingSystem = goruntime.GOOS - node.Status.NodeInfo.Architecture = goruntime.GOARCH -} - -// Set status for the node. -func (kl *Kubelet) setNodeStatusInfo(node *v1.Node) { - kl.setNodeStatusMachineInfo(node) - kl.setNodeStatusVersionInfo(node) - kl.setNodeStatusDaemonEndpoints(node) - kl.setNodeStatusImages(node) - kl.setNodeStatusGoRuntime(node) - if utilfeature.DefaultFeatureGate.Enabled(features.AttachVolumeLimit) { - kl.setVolumeLimits(node) - } -} - -// Set Ready condition for the node. -func (kl *Kubelet) setNodeReadyCondition(node *v1.Node) { - // NOTE(aaronlevy): NodeReady condition needs to be the last in the list of node conditions. - // This is due to an issue with version skewed kubelet and master components. - // ref: https://github.com/kubernetes/kubernetes/issues/16961 - currentTime := metav1.NewTime(kl.clock.Now()) - newNodeReadyCondition := v1.NodeCondition{ - Type: v1.NodeReady, - Status: v1.ConditionTrue, - Reason: "KubeletReady", - Message: "kubelet is posting ready status", - LastHeartbeatTime: currentTime, - } - rs := append(kl.runtimeState.runtimeErrors(), kl.runtimeState.networkErrors()...) - requiredCapacities := []v1.ResourceName{v1.ResourceCPU, v1.ResourceMemory, v1.ResourcePods} - if utilfeature.DefaultFeatureGate.Enabled(features.LocalStorageCapacityIsolation) { - requiredCapacities = append(requiredCapacities, v1.ResourceEphemeralStorage) - } - missingCapacities := []string{} - for _, resource := range requiredCapacities { - if _, found := node.Status.Capacity[resource]; !found { - missingCapacities = append(missingCapacities, string(resource)) - } - } - if len(missingCapacities) > 0 { - rs = append(rs, fmt.Sprintf("Missing node capacity for resources: %s", strings.Join(missingCapacities, ", "))) - } - if len(rs) > 0 { - newNodeReadyCondition = v1.NodeCondition{ - Type: v1.NodeReady, - Status: v1.ConditionFalse, - Reason: "KubeletNotReady", - Message: strings.Join(rs, ","), - LastHeartbeatTime: currentTime, - } - } - // Append AppArmor status if it's enabled. - // TODO(tallclair): This is a temporary message until node feature reporting is added. - if newNodeReadyCondition.Status == v1.ConditionTrue && - kl.appArmorValidator != nil && kl.appArmorValidator.ValidateHost() == nil { - newNodeReadyCondition.Message = fmt.Sprintf("%s. AppArmor enabled", newNodeReadyCondition.Message) - } - - // Record any soft requirements that were not met in the container manager. - status := kl.containerManager.Status() - if status.SoftRequirements != nil { - newNodeReadyCondition.Message = fmt.Sprintf("%s. WARNING: %s", newNodeReadyCondition.Message, status.SoftRequirements.Error()) - } - - readyConditionUpdated := false - needToRecordEvent := false - for i := range node.Status.Conditions { - if node.Status.Conditions[i].Type == v1.NodeReady { - if node.Status.Conditions[i].Status == newNodeReadyCondition.Status { - newNodeReadyCondition.LastTransitionTime = node.Status.Conditions[i].LastTransitionTime - } else { - newNodeReadyCondition.LastTransitionTime = currentTime - needToRecordEvent = true - } - node.Status.Conditions[i] = newNodeReadyCondition - readyConditionUpdated = true - break - } - } - if !readyConditionUpdated { - newNodeReadyCondition.LastTransitionTime = currentTime - node.Status.Conditions = append(node.Status.Conditions, newNodeReadyCondition) - } - if needToRecordEvent { - if newNodeReadyCondition.Status == v1.ConditionTrue { - kl.recordNodeStatusEvent(v1.EventTypeNormal, events.NodeReady) - } else { - kl.recordNodeStatusEvent(v1.EventTypeNormal, events.NodeNotReady) - glog.Infof("Node became not ready: %+v", newNodeReadyCondition) - } - } -} - -// setNodeMemoryPressureCondition for the node. -// TODO: this needs to move somewhere centralized... -func (kl *Kubelet) setNodeMemoryPressureCondition(node *v1.Node) { - currentTime := metav1.NewTime(kl.clock.Now()) - var condition *v1.NodeCondition - - // Check if NodeMemoryPressure condition already exists and if it does, just pick it up for update. - for i := range node.Status.Conditions { - if node.Status.Conditions[i].Type == v1.NodeMemoryPressure { - condition = &node.Status.Conditions[i] - } - } - - newCondition := false - // If the NodeMemoryPressure condition doesn't exist, create one - if condition == nil { - condition = &v1.NodeCondition{ - Type: v1.NodeMemoryPressure, - Status: v1.ConditionUnknown, - } - // cannot be appended to node.Status.Conditions here because it gets - // copied to the slice. So if we append to the slice here none of the - // updates we make below are reflected in the slice. - newCondition = true - } - - // Update the heartbeat time - condition.LastHeartbeatTime = currentTime - - // Note: The conditions below take care of the case when a new NodeMemoryPressure condition is - // created and as well as the case when the condition already exists. When a new condition - // is created its status is set to v1.ConditionUnknown which matches either - // condition.Status != v1.ConditionTrue or - // condition.Status != v1.ConditionFalse in the conditions below depending on whether - // the kubelet is under memory pressure or not. - if kl.evictionManager.IsUnderMemoryPressure() { - if condition.Status != v1.ConditionTrue { - condition.Status = v1.ConditionTrue - condition.Reason = "KubeletHasInsufficientMemory" - condition.Message = "kubelet has insufficient memory available" - condition.LastTransitionTime = currentTime - kl.recordNodeStatusEvent(v1.EventTypeNormal, "NodeHasInsufficientMemory") - } - } else if condition.Status != v1.ConditionFalse { - condition.Status = v1.ConditionFalse - condition.Reason = "KubeletHasSufficientMemory" - condition.Message = "kubelet has sufficient memory available" - condition.LastTransitionTime = currentTime - kl.recordNodeStatusEvent(v1.EventTypeNormal, "NodeHasSufficientMemory") - } - - if newCondition { - node.Status.Conditions = append(node.Status.Conditions, *condition) - } -} - -// setNodePIDPressureCondition for the node. -// TODO: this needs to move somewhere centralized... -func (kl *Kubelet) setNodePIDPressureCondition(node *v1.Node) { - currentTime := metav1.NewTime(kl.clock.Now()) - var condition *v1.NodeCondition - - // Check if NodePIDPressure condition already exists and if it does, just pick it up for update. - for i := range node.Status.Conditions { - if node.Status.Conditions[i].Type == v1.NodePIDPressure { - condition = &node.Status.Conditions[i] - } - } - - newCondition := false - // If the NodePIDPressure condition doesn't exist, create one - if condition == nil { - condition = &v1.NodeCondition{ - Type: v1.NodePIDPressure, - Status: v1.ConditionUnknown, - } - // cannot be appended to node.Status.Conditions here because it gets - // copied to the slice. So if we append to the slice here none of the - // updates we make below are reflected in the slice. - newCondition = true - } - - // Update the heartbeat time - condition.LastHeartbeatTime = currentTime - - // Note: The conditions below take care of the case when a new NodePIDPressure condition is - // created and as well as the case when the condition already exists. When a new condition - // is created its status is set to v1.ConditionUnknown which matches either - // condition.Status != v1.ConditionTrue or - // condition.Status != v1.ConditionFalse in the conditions below depending on whether - // the kubelet is under PID pressure or not. - if kl.evictionManager.IsUnderPIDPressure() { - if condition.Status != v1.ConditionTrue { - condition.Status = v1.ConditionTrue - condition.Reason = "KubeletHasInsufficientPID" - condition.Message = "kubelet has insufficient PID available" - condition.LastTransitionTime = currentTime - kl.recordNodeStatusEvent(v1.EventTypeNormal, "NodeHasInsufficientPID") - } - } else if condition.Status != v1.ConditionFalse { - condition.Status = v1.ConditionFalse - condition.Reason = "KubeletHasSufficientPID" - condition.Message = "kubelet has sufficient PID available" - condition.LastTransitionTime = currentTime - kl.recordNodeStatusEvent(v1.EventTypeNormal, "NodeHasSufficientPID") - } - - if newCondition { - node.Status.Conditions = append(node.Status.Conditions, *condition) - } -} - -// setNodeDiskPressureCondition for the node. -// TODO: this needs to move somewhere centralized... -func (kl *Kubelet) setNodeDiskPressureCondition(node *v1.Node) { - currentTime := metav1.NewTime(kl.clock.Now()) - var condition *v1.NodeCondition - - // Check if NodeDiskPressure condition already exists and if it does, just pick it up for update. - for i := range node.Status.Conditions { - if node.Status.Conditions[i].Type == v1.NodeDiskPressure { - condition = &node.Status.Conditions[i] - } - } - - newCondition := false - // If the NodeDiskPressure condition doesn't exist, create one - if condition == nil { - condition = &v1.NodeCondition{ - Type: v1.NodeDiskPressure, - Status: v1.ConditionUnknown, - } - // cannot be appended to node.Status.Conditions here because it gets - // copied to the slice. So if we append to the slice here none of the - // updates we make below are reflected in the slice. - newCondition = true - } - - // Update the heartbeat time - condition.LastHeartbeatTime = currentTime - - // Note: The conditions below take care of the case when a new NodeDiskPressure condition is - // created and as well as the case when the condition already exists. When a new condition - // is created its status is set to v1.ConditionUnknown which matches either - // condition.Status != v1.ConditionTrue or - // condition.Status != v1.ConditionFalse in the conditions below depending on whether - // the kubelet is under disk pressure or not. - if kl.evictionManager.IsUnderDiskPressure() { - if condition.Status != v1.ConditionTrue { - condition.Status = v1.ConditionTrue - condition.Reason = "KubeletHasDiskPressure" - condition.Message = "kubelet has disk pressure" - condition.LastTransitionTime = currentTime - kl.recordNodeStatusEvent(v1.EventTypeNormal, "NodeHasDiskPressure") - } - } else if condition.Status != v1.ConditionFalse { - condition.Status = v1.ConditionFalse - condition.Reason = "KubeletHasNoDiskPressure" - condition.Message = "kubelet has no disk pressure" - condition.LastTransitionTime = currentTime - kl.recordNodeStatusEvent(v1.EventTypeNormal, "NodeHasNoDiskPressure") - } - - if newCondition { - node.Status.Conditions = append(node.Status.Conditions, *condition) - } -} - -// Set OODCondition for the node. -func (kl *Kubelet) setNodeOODCondition(node *v1.Node) { - currentTime := metav1.NewTime(kl.clock.Now()) - var nodeOODCondition *v1.NodeCondition - - // Check if NodeOutOfDisk condition already exists and if it does, just pick it up for update. - for i := range node.Status.Conditions { - if node.Status.Conditions[i].Type == v1.NodeOutOfDisk { - nodeOODCondition = &node.Status.Conditions[i] - } - } - - newOODCondition := nodeOODCondition == nil - if newOODCondition { - nodeOODCondition = &v1.NodeCondition{} - } - if nodeOODCondition.Status != v1.ConditionFalse { - nodeOODCondition.Type = v1.NodeOutOfDisk - nodeOODCondition.Status = v1.ConditionFalse - nodeOODCondition.Reason = "KubeletHasSufficientDisk" - nodeOODCondition.Message = "kubelet has sufficient disk space available" - nodeOODCondition.LastTransitionTime = currentTime - kl.recordNodeStatusEvent(v1.EventTypeNormal, "NodeHasSufficientDisk") - } - - // Update the heartbeat time irrespective of all the conditions. - nodeOODCondition.LastHeartbeatTime = currentTime - - if newOODCondition { - node.Status.Conditions = append(node.Status.Conditions, *nodeOODCondition) - } -} - -// Maintains Node.Spec.Unschedulable value from previous run of tryUpdateNodeStatus() -// TODO: why is this a package var? -var ( - oldNodeUnschedulable bool - oldNodeUnschedulableLock sync.Mutex -) - -// record if node schedulable change. -func (kl *Kubelet) recordNodeSchedulableEvent(node *v1.Node) { - oldNodeUnschedulableLock.Lock() - defer oldNodeUnschedulableLock.Unlock() - if oldNodeUnschedulable != node.Spec.Unschedulable { - if node.Spec.Unschedulable { - kl.recordNodeStatusEvent(v1.EventTypeNormal, events.NodeNotSchedulable) - } else { - kl.recordNodeStatusEvent(v1.EventTypeNormal, events.NodeSchedulable) - } - oldNodeUnschedulable = node.Spec.Unschedulable - } -} - -// Update VolumesInUse field in Node Status only after states are synced up at least once -// in volume reconciler. -func (kl *Kubelet) setNodeVolumesInUseStatus(node *v1.Node) { - // Make sure to only update node status after reconciler starts syncing up states - if kl.volumeManager.ReconcilerStatesHasBeenSynced() { - node.Status.VolumesInUse = kl.volumeManager.GetVolumesInUse() - } -} - -// setNodeStatus fills in the Status fields of the given Node, overwriting -// any fields that are currently set. -// TODO(madhusudancs): Simplify the logic for setting node conditions and -// refactor the node status condition code out to a different file. -func (kl *Kubelet) setNodeStatus(node *v1.Node) { - for i, f := range kl.setNodeStatusFuncs { - glog.V(5).Infof("Setting node status at position %v", i) - if err := f(node); err != nil { - glog.Warningf("Failed to set some node status fields: %s", err) - } - } -} - -// defaultNodeStatusFuncs is a factory that generates the default set of -// setNodeStatus funcs -func (kl *Kubelet) defaultNodeStatusFuncs() []func(*v1.Node) error { - // initial set of node status update handlers, can be modified by Option's - withoutError := func(f func(*v1.Node)) func(*v1.Node) error { - return func(n *v1.Node) error { - f(n) - return nil - } - } - return []func(*v1.Node) error{ - kl.setNodeAddress, - withoutError(kl.setNodeStatusInfo), - withoutError(kl.setNodeOODCondition), - withoutError(kl.setNodeMemoryPressureCondition), - withoutError(kl.setNodeDiskPressureCondition), - withoutError(kl.setNodePIDPressureCondition), - withoutError(kl.setNodeReadyCondition), - withoutError(kl.setNodeVolumesInUseStatus), - withoutError(kl.recordNodeSchedulableEvent), - } -} - -// Validate given node IP belongs to the current host -func validateNodeIP(nodeIP net.IP) error { - // Honor IP limitations set in setNodeStatus() - if nodeIP.To4() == nil && nodeIP.To16() == nil { - return fmt.Errorf("nodeIP must be a valid IP address") - } - if nodeIP.IsLoopback() { - return fmt.Errorf("nodeIP can't be loopback address") - } - if nodeIP.IsMulticast() { - return fmt.Errorf("nodeIP can't be a multicast address") - } - if nodeIP.IsLinkLocalUnicast() { - return fmt.Errorf("nodeIP can't be a link-local unicast address") - } - if nodeIP.IsUnspecified() { - return fmt.Errorf("nodeIP can't be an all zeros address") - } - - addrs, err := net.InterfaceAddrs() - if err != nil { - return err - } - for _, addr := range addrs { - var ip net.IP - switch v := addr.(type) { - case *net.IPNet: - ip = v.IP - case *net.IPAddr: - ip = v.IP - } - if ip != nil && ip.Equal(nodeIP) { - return nil - } - } - return fmt.Errorf("Node IP: %q not found in the host's network interfaces", nodeIP.String()) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go deleted file mode 100644 index 0e9ea868..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go +++ /dev/null @@ -1,1761 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "path" - "path/filepath" - "runtime" - "sort" - "strings" - "sync" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/sets" - utilvalidation "k8s.io/apimachinery/pkg/util/validation" - utilfeature "k8s.io/apiserver/pkg/util/feature" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" - "k8s.io/kubernetes/pkg/api/v1/resource" - podshelper "k8s.io/kubernetes/pkg/apis/core/pods" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" - v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/fieldpath" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" - "k8s.io/kubernetes/pkg/kubelet/cm" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/envvars" - "k8s.io/kubernetes/pkg/kubelet/eviction" - "k8s.io/kubernetes/pkg/kubelet/images" - "k8s.io/kubernetes/pkg/kubelet/server/portforward" - remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" - "k8s.io/kubernetes/pkg/kubelet/status" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" - mountutil "k8s.io/kubernetes/pkg/util/mount" - volumeutil "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" - volumevalidation "k8s.io/kubernetes/pkg/volume/validation" - "k8s.io/kubernetes/third_party/forked/golang/expansion" -) - -const ( - managedHostsHeader = "# Kubernetes-managed hosts file.\n" - managedHostsHeaderWithHostNetwork = "# Kubernetes-managed hosts file (host network).\n" -) - -// Get a list of pods that have data directories. -func (kl *Kubelet) listPodsFromDisk() ([]types.UID, error) { - podInfos, err := ioutil.ReadDir(kl.getPodsDir()) - if err != nil { - return nil, err - } - pods := []types.UID{} - for i := range podInfos { - if podInfos[i].IsDir() { - pods = append(pods, types.UID(podInfos[i].Name())) - } - } - return pods, nil -} - -// GetActivePods returns non-terminal pods -func (kl *Kubelet) GetActivePods() []*v1.Pod { - allPods := kl.podManager.GetPods() - activePods := kl.filterOutTerminatedPods(allPods) - return activePods -} - -// makeBlockVolumes maps the raw block devices specified in the path of the container -// Experimental -func (kl *Kubelet) makeBlockVolumes(pod *v1.Pod, container *v1.Container, podVolumes kubecontainer.VolumeMap, blkutil volumepathhandler.BlockVolumePathHandler) ([]kubecontainer.DeviceInfo, error) { - var devices []kubecontainer.DeviceInfo - for _, device := range container.VolumeDevices { - // check path is absolute - if !filepath.IsAbs(device.DevicePath) { - return nil, fmt.Errorf("error DevicePath `%s` must be an absolute path", device.DevicePath) - } - vol, ok := podVolumes[device.Name] - if !ok || vol.BlockVolumeMapper == nil { - glog.Errorf("Block volume cannot be satisfied for container %q, because the volume is missing or the volume mapper is nil: %+v", container.Name, device) - return nil, fmt.Errorf("cannot find volume %q to pass into container %q", device.Name, container.Name) - } - // Get a symbolic link associated to a block device under pod device path - dirPath, volName := vol.BlockVolumeMapper.GetPodDeviceMapPath() - symlinkPath := path.Join(dirPath, volName) - if islinkExist, checkErr := blkutil.IsSymlinkExist(symlinkPath); checkErr != nil { - return nil, checkErr - } else if islinkExist { - // Check readOnly in PVCVolumeSource and set read only permission if it's true. - permission := "mrw" - if vol.ReadOnly { - permission = "r" - } - glog.V(4).Infof("Device will be attached to container %q. Path on host: %v", container.Name, symlinkPath) - devices = append(devices, kubecontainer.DeviceInfo{PathOnHost: symlinkPath, PathInContainer: device.DevicePath, Permissions: permission}) - } - } - - return devices, nil -} - -// makeMounts determines the mount points for the given container. -func makeMounts(pod *v1.Pod, podDir string, container *v1.Container, hostName, hostDomain, podIP string, podVolumes kubecontainer.VolumeMap, mounter mountutil.Interface, expandEnvs []kubecontainer.EnvVar) ([]kubecontainer.Mount, func(), error) { - - // Kubernetes only mounts on /etc/hosts if: - // - container is not an infrastructure (pause) container - // - container is not already mounting on /etc/hosts - // - OS is not Windows - // Kubernetes will not mount /etc/hosts if: - // - when the Pod sandbox is being created, its IP is still unknown. Hence, PodIP will not have been set. - mountEtcHostsFile := len(podIP) > 0 && runtime.GOOS != "windows" - glog.V(3).Infof("container: %v/%v/%v podIP: %q creating hosts mount: %v", pod.Namespace, pod.Name, container.Name, podIP, mountEtcHostsFile) - mounts := []kubecontainer.Mount{} - var cleanupAction func() = nil - for i, mount := range container.VolumeMounts { - // do not mount /etc/hosts if container is already mounting on the path - mountEtcHostsFile = mountEtcHostsFile && (mount.MountPath != etcHostsPath) - vol, ok := podVolumes[mount.Name] - if !ok || vol.Mounter == nil { - glog.Errorf("Mount cannot be satisfied for container %q, because the volume is missing or the volume mounter is nil: %+v", container.Name, mount) - return nil, cleanupAction, fmt.Errorf("cannot find volume %q to mount into container %q", mount.Name, container.Name) - } - - relabelVolume := false - // If the volume supports SELinux and it has not been - // relabeled already and it is not a read-only volume, - // relabel it and mark it as labeled - if vol.Mounter.GetAttributes().Managed && vol.Mounter.GetAttributes().SupportsSELinux && !vol.SELinuxLabeled { - vol.SELinuxLabeled = true - relabelVolume = true - } - hostPath, err := volumeutil.GetPath(vol.Mounter) - if err != nil { - return nil, cleanupAction, err - } - if mount.SubPath != "" { - if !utilfeature.DefaultFeatureGate.Enabled(features.VolumeSubpath) { - return nil, cleanupAction, fmt.Errorf("volume subpaths are disabled") - } - - // Expand subpath variables - if utilfeature.DefaultFeatureGate.Enabled(features.VolumeSubpathEnvExpansion) { - mount.SubPath = kubecontainer.ExpandContainerVolumeMounts(mount, expandEnvs) - } - - if filepath.IsAbs(mount.SubPath) { - return nil, cleanupAction, fmt.Errorf("error SubPath `%s` must not be an absolute path", mount.SubPath) - } - - err = volumevalidation.ValidatePathNoBacksteps(mount.SubPath) - if err != nil { - return nil, cleanupAction, fmt.Errorf("unable to provision SubPath `%s`: %v", mount.SubPath, err) - } - - volumePath := hostPath - hostPath = filepath.Join(volumePath, mount.SubPath) - - if subPathExists, err := mounter.ExistsPath(hostPath); err != nil { - glog.Errorf("Could not determine if subPath %s exists; will not attempt to change its permissions", hostPath) - } else if !subPathExists { - // Create the sub path now because if it's auto-created later when referenced, it may have an - // incorrect ownership and mode. For example, the sub path directory must have at least g+rwx - // when the pod specifies an fsGroup, and if the directory is not created here, Docker will - // later auto-create it with the incorrect mode 0750 - // Make extra care not to escape the volume! - perm, err := mounter.GetMode(volumePath) - if err != nil { - return nil, cleanupAction, err - } - if err := mounter.SafeMakeDir(mount.SubPath, volumePath, perm); err != nil { - // Don't pass detailed error back to the user because it could give information about host filesystem - glog.Errorf("failed to create subPath directory for volumeMount %q of container %q: %v", mount.Name, container.Name, err) - return nil, cleanupAction, fmt.Errorf("failed to create subPath directory for volumeMount %q of container %q", mount.Name, container.Name) - } - } - hostPath, cleanupAction, err = mounter.PrepareSafeSubpath(mountutil.Subpath{ - VolumeMountIndex: i, - Path: hostPath, - VolumeName: vol.InnerVolumeSpecName, - VolumePath: volumePath, - PodDir: podDir, - ContainerName: container.Name, - }) - if err != nil { - // Don't pass detailed error back to the user because it could give information about host filesystem - glog.Errorf("failed to prepare subPath for volumeMount %q of container %q: %v", mount.Name, container.Name, err) - return nil, cleanupAction, fmt.Errorf("failed to prepare subPath for volumeMount %q of container %q", mount.Name, container.Name) - } - } - - // Docker Volume Mounts fail on Windows if it is not of the form C:/ - containerPath := mount.MountPath - if runtime.GOOS == "windows" { - if (strings.HasPrefix(hostPath, "/") || strings.HasPrefix(hostPath, "\\")) && !strings.Contains(hostPath, ":") { - hostPath = "c:" + hostPath - } - } - if !filepath.IsAbs(containerPath) { - containerPath = volumeutil.MakeAbsolutePath(runtime.GOOS, containerPath) - } - - propagation, err := translateMountPropagation(mount.MountPropagation) - if err != nil { - return nil, cleanupAction, err - } - glog.V(5).Infof("Pod %q container %q mount %q has propagation %q", format.Pod(pod), container.Name, mount.Name, propagation) - - mustMountRO := vol.Mounter.GetAttributes().ReadOnly && utilfeature.DefaultFeatureGate.Enabled(features.ReadOnlyAPIDataVolumes) - - mounts = append(mounts, kubecontainer.Mount{ - Name: mount.Name, - ContainerPath: containerPath, - HostPath: hostPath, - ReadOnly: mount.ReadOnly || mustMountRO, - SELinuxRelabel: relabelVolume, - Propagation: propagation, - }) - } - if mountEtcHostsFile { - hostAliases := pod.Spec.HostAliases - hostsMount, err := makeHostsMount(podDir, podIP, hostName, hostDomain, hostAliases, pod.Spec.HostNetwork) - if err != nil { - return nil, cleanupAction, err - } - mounts = append(mounts, *hostsMount) - } - return mounts, cleanupAction, nil -} - -// translateMountPropagation transforms v1.MountPropagationMode to -// runtimeapi.MountPropagation. -func translateMountPropagation(mountMode *v1.MountPropagationMode) (runtimeapi.MountPropagation, error) { - if runtime.GOOS == "windows" { - // Windows containers doesn't support mount propagation, use private for it. - // Refer https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation. - return runtimeapi.MountPropagation_PROPAGATION_PRIVATE, nil - } - - if !utilfeature.DefaultFeatureGate.Enabled(features.MountPropagation) { - // mount propagation is disabled, use private as in the old versions - return runtimeapi.MountPropagation_PROPAGATION_PRIVATE, nil - } - switch { - case mountMode == nil: - // PRIVATE is the default - return runtimeapi.MountPropagation_PROPAGATION_PRIVATE, nil - case *mountMode == v1.MountPropagationHostToContainer: - return runtimeapi.MountPropagation_PROPAGATION_HOST_TO_CONTAINER, nil - case *mountMode == v1.MountPropagationBidirectional: - return runtimeapi.MountPropagation_PROPAGATION_BIDIRECTIONAL, nil - case *mountMode == v1.MountPropagationNone: - return runtimeapi.MountPropagation_PROPAGATION_PRIVATE, nil - default: - return 0, fmt.Errorf("invalid MountPropagation mode: %q", mountMode) - } -} - -// makeHostsMount makes the mountpoint for the hosts file that the containers -// in a pod are injected with. -func makeHostsMount(podDir, podIP, hostName, hostDomainName string, hostAliases []v1.HostAlias, useHostNetwork bool) (*kubecontainer.Mount, error) { - hostsFilePath := path.Join(podDir, "etc-hosts") - if err := ensureHostsFile(hostsFilePath, podIP, hostName, hostDomainName, hostAliases, useHostNetwork); err != nil { - return nil, err - } - return &kubecontainer.Mount{ - Name: "k8s-managed-etc-hosts", - ContainerPath: etcHostsPath, - HostPath: hostsFilePath, - ReadOnly: false, - SELinuxRelabel: true, - }, nil -} - -// ensureHostsFile ensures that the given host file has an up-to-date ip, host -// name, and domain name. -func ensureHostsFile(fileName, hostIP, hostName, hostDomainName string, hostAliases []v1.HostAlias, useHostNetwork bool) error { - var hostsFileContent []byte - var err error - - if useHostNetwork { - // if Pod is using host network, read hosts file from the node's filesystem. - // `etcHostsPath` references the location of the hosts file on the node. - // `/etc/hosts` for *nix systems. - hostsFileContent, err = nodeHostsFileContent(etcHostsPath, hostAliases) - if err != nil { - return err - } - } else { - // if Pod is not using host network, create a managed hosts file with Pod IP and other information. - hostsFileContent = managedHostsFileContent(hostIP, hostName, hostDomainName, hostAliases) - } - - return ioutil.WriteFile(fileName, hostsFileContent, 0644) -} - -// nodeHostsFileContent reads the content of node's hosts file. -func nodeHostsFileContent(hostsFilePath string, hostAliases []v1.HostAlias) ([]byte, error) { - hostsFileContent, err := ioutil.ReadFile(hostsFilePath) - if err != nil { - return nil, err - } - var buffer bytes.Buffer - buffer.WriteString(managedHostsHeaderWithHostNetwork) - buffer.Write(hostsFileContent) - buffer.Write(hostsEntriesFromHostAliases(hostAliases)) - return buffer.Bytes(), nil -} - -// managedHostsFileContent generates the content of the managed etc hosts based on Pod IP and other -// information. -func managedHostsFileContent(hostIP, hostName, hostDomainName string, hostAliases []v1.HostAlias) []byte { - var buffer bytes.Buffer - buffer.WriteString(managedHostsHeader) - buffer.WriteString("127.0.0.1\tlocalhost\n") // ipv4 localhost - buffer.WriteString("::1\tlocalhost ip6-localhost ip6-loopback\n") // ipv6 localhost - buffer.WriteString("fe00::0\tip6-localnet\n") - buffer.WriteString("fe00::0\tip6-mcastprefix\n") - buffer.WriteString("fe00::1\tip6-allnodes\n") - buffer.WriteString("fe00::2\tip6-allrouters\n") - if len(hostDomainName) > 0 { - buffer.WriteString(fmt.Sprintf("%s\t%s.%s\t%s\n", hostIP, hostName, hostDomainName, hostName)) - } else { - buffer.WriteString(fmt.Sprintf("%s\t%s\n", hostIP, hostName)) - } - buffer.Write(hostsEntriesFromHostAliases(hostAliases)) - return buffer.Bytes() -} - -func hostsEntriesFromHostAliases(hostAliases []v1.HostAlias) []byte { - if len(hostAliases) == 0 { - return []byte{} - } - - var buffer bytes.Buffer - buffer.WriteString("\n") - buffer.WriteString("# Entries added by HostAliases.\n") - // write each IP/hostname pair as an entry into hosts file - for _, hostAlias := range hostAliases { - for _, hostname := range hostAlias.Hostnames { - buffer.WriteString(fmt.Sprintf("%s\t%s\n", hostAlias.IP, hostname)) - } - } - return buffer.Bytes() -} - -// truncatePodHostnameIfNeeded truncates the pod hostname if it's longer than 63 chars. -func truncatePodHostnameIfNeeded(podName, hostname string) (string, error) { - // Cap hostname at 63 chars (specification is 64bytes which is 63 chars and the null terminating char). - const hostnameMaxLen = 63 - if len(hostname) <= hostnameMaxLen { - return hostname, nil - } - truncated := hostname[:hostnameMaxLen] - glog.Errorf("hostname for pod:%q was longer than %d. Truncated hostname to :%q", podName, hostnameMaxLen, truncated) - // hostname should not end with '-' or '.' - truncated = strings.TrimRight(truncated, "-.") - if len(truncated) == 0 { - // This should never happen. - return "", fmt.Errorf("hostname for pod %q was invalid: %q", podName, hostname) - } - return truncated, nil -} - -// GeneratePodHostNameAndDomain creates a hostname and domain name for a pod, -// given that pod's spec and annotations or returns an error. -func (kl *Kubelet) GeneratePodHostNameAndDomain(pod *v1.Pod) (string, string, error) { - // TODO(vmarmol): Handle better. - clusterDomain := kl.dnsConfigurer.ClusterDomain - - hostname := pod.Name - if len(pod.Spec.Hostname) > 0 { - if msgs := utilvalidation.IsDNS1123Label(pod.Spec.Hostname); len(msgs) != 0 { - return "", "", fmt.Errorf("Pod Hostname %q is not a valid DNS label: %s", pod.Spec.Hostname, strings.Join(msgs, ";")) - } - hostname = pod.Spec.Hostname - } - - hostname, err := truncatePodHostnameIfNeeded(pod.Name, hostname) - if err != nil { - return "", "", err - } - - hostDomain := "" - if len(pod.Spec.Subdomain) > 0 { - if msgs := utilvalidation.IsDNS1123Label(pod.Spec.Subdomain); len(msgs) != 0 { - return "", "", fmt.Errorf("Pod Subdomain %q is not a valid DNS label: %s", pod.Spec.Subdomain, strings.Join(msgs, ";")) - } - hostDomain = fmt.Sprintf("%s.%s.svc.%s", pod.Spec.Subdomain, pod.Namespace, clusterDomain) - } - - return hostname, hostDomain, nil -} - -// GetPodCgroupParent gets pod cgroup parent from container manager. -func (kl *Kubelet) GetPodCgroupParent(pod *v1.Pod) string { - pcm := kl.containerManager.NewPodContainerManager() - _, cgroupParent := pcm.GetPodContainerName(pod) - return cgroupParent -} - -// GenerateRunContainerOptions generates the RunContainerOptions, which can be used by -// the container runtime to set parameters for launching a container. -func (kl *Kubelet) GenerateRunContainerOptions(pod *v1.Pod, container *v1.Container, podIP string) (*kubecontainer.RunContainerOptions, func(), error) { - opts, err := kl.containerManager.GetResources(pod, container) - if err != nil { - return nil, nil, err - } - - hostname, hostDomainName, err := kl.GeneratePodHostNameAndDomain(pod) - if err != nil { - return nil, nil, err - } - opts.Hostname = hostname - podName := volumeutil.GetUniquePodName(pod) - volumes := kl.volumeManager.GetMountedVolumesForPod(podName) - - opts.PortMappings = kubecontainer.MakePortMappings(container) - - // TODO: remove feature gate check after no longer needed - if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { - blkutil := volumepathhandler.NewBlockVolumePathHandler() - blkVolumes, err := kl.makeBlockVolumes(pod, container, volumes, blkutil) - if err != nil { - return nil, nil, err - } - opts.Devices = append(opts.Devices, blkVolumes...) - } - - envs, err := kl.makeEnvironmentVariables(pod, container, podIP) - if err != nil { - return nil, nil, err - } - opts.Envs = append(opts.Envs, envs...) - - mounts, cleanupAction, err := makeMounts(pod, kl.getPodDir(pod.UID), container, hostname, hostDomainName, podIP, volumes, kl.mounter, opts.Envs) - if err != nil { - return nil, cleanupAction, err - } - opts.Mounts = append(opts.Mounts, mounts...) - - // Disabling adding TerminationMessagePath on Windows as these files would be mounted as docker volume and - // Docker for Windows has a bug where only directories can be mounted - if len(container.TerminationMessagePath) != 0 && runtime.GOOS != "windows" { - p := kl.getPodContainerDir(pod.UID, container.Name) - if err := os.MkdirAll(p, 0750); err != nil { - glog.Errorf("Error on creating %q: %v", p, err) - } else { - opts.PodContainerDir = p - } - } - - // only do this check if the experimental behavior is enabled, otherwise allow it to default to false - if kl.experimentalHostUserNamespaceDefaulting { - opts.EnableHostUserNamespace = kl.enableHostUserNamespace(pod) - } - - return opts, cleanupAction, nil -} - -var masterServices = sets.NewString("kubernetes") - -// getServiceEnvVarMap makes a map[string]string of env vars for services a -// pod in namespace ns should see. -func (kl *Kubelet) getServiceEnvVarMap(ns string) (map[string]string, error) { - var ( - serviceMap = make(map[string]*v1.Service) - m = make(map[string]string) - ) - - // Get all service resources from the master (via a cache), - // and populate them into service environment variables. - if kl.serviceLister == nil { - // Kubelets without masters (e.g. plain GCE ContainerVM) don't set env vars. - return m, nil - } - services, err := kl.serviceLister.List(labels.Everything()) - if err != nil { - return m, fmt.Errorf("failed to list services when setting up env vars") - } - - // project the services in namespace ns onto the master services - for i := range services { - service := services[i] - // ignore services where ClusterIP is "None" or empty - if !v1helper.IsServiceIPSet(service) { - continue - } - serviceName := service.Name - - switch service.Namespace { - // for the case whether the master service namespace is the namespace the pod - // is in, the pod should receive all the services in the namespace. - // - // ordering of the case clauses below enforces this - case ns: - serviceMap[serviceName] = service - case kl.masterServiceNamespace: - if masterServices.Has(serviceName) { - if _, exists := serviceMap[serviceName]; !exists { - serviceMap[serviceName] = service - } - } - } - } - - mappedServices := []*v1.Service{} - for key := range serviceMap { - mappedServices = append(mappedServices, serviceMap[key]) - } - - for _, e := range envvars.FromServices(mappedServices) { - m[e.Name] = e.Value - } - return m, nil -} - -// Make the environment variables for a pod in the given namespace. -func (kl *Kubelet) makeEnvironmentVariables(pod *v1.Pod, container *v1.Container, podIP string) ([]kubecontainer.EnvVar, error) { - var result []kubecontainer.EnvVar - // Note: These are added to the docker Config, but are not included in the checksum computed - // by kubecontainer.HashContainer(...). That way, we can still determine whether an - // v1.Container is already running by its hash. (We don't want to restart a container just - // because some service changed.) - // - // Note that there is a race between Kubelet seeing the pod and kubelet seeing the service. - // To avoid this users can: (1) wait between starting a service and starting; or (2) detect - // missing service env var and exit and be restarted; or (3) use DNS instead of env vars - // and keep trying to resolve the DNS name of the service (recommended). - serviceEnv, err := kl.getServiceEnvVarMap(pod.Namespace) - if err != nil { - return result, err - } - - var ( - configMaps = make(map[string]*v1.ConfigMap) - secrets = make(map[string]*v1.Secret) - tmpEnv = make(map[string]string) - ) - - // Env will override EnvFrom variables. - // Process EnvFrom first then allow Env to replace existing values. - for _, envFrom := range container.EnvFrom { - switch { - case envFrom.ConfigMapRef != nil: - cm := envFrom.ConfigMapRef - name := cm.Name - configMap, ok := configMaps[name] - if !ok { - if kl.kubeClient == nil { - return result, fmt.Errorf("Couldn't get configMap %v/%v, no kubeClient defined", pod.Namespace, name) - } - optional := cm.Optional != nil && *cm.Optional - configMap, err = kl.configMapManager.GetConfigMap(pod.Namespace, name) - if err != nil { - if errors.IsNotFound(err) && optional { - // ignore error when marked optional - continue - } - return result, err - } - configMaps[name] = configMap - } - - invalidKeys := []string{} - for k, v := range configMap.Data { - if len(envFrom.Prefix) > 0 { - k = envFrom.Prefix + k - } - if errMsgs := utilvalidation.IsEnvVarName(k); len(errMsgs) != 0 { - invalidKeys = append(invalidKeys, k) - continue - } - tmpEnv[k] = v - } - if len(invalidKeys) > 0 { - sort.Strings(invalidKeys) - kl.recorder.Eventf(pod, v1.EventTypeWarning, "InvalidEnvironmentVariableNames", "Keys [%s] from the EnvFrom configMap %s/%s were skipped since they are considered invalid environment variable names.", strings.Join(invalidKeys, ", "), pod.Namespace, name) - } - case envFrom.SecretRef != nil: - s := envFrom.SecretRef - name := s.Name - secret, ok := secrets[name] - if !ok { - if kl.kubeClient == nil { - return result, fmt.Errorf("Couldn't get secret %v/%v, no kubeClient defined", pod.Namespace, name) - } - optional := s.Optional != nil && *s.Optional - secret, err = kl.secretManager.GetSecret(pod.Namespace, name) - if err != nil { - if errors.IsNotFound(err) && optional { - // ignore error when marked optional - continue - } - return result, err - } - secrets[name] = secret - } - - invalidKeys := []string{} - for k, v := range secret.Data { - if len(envFrom.Prefix) > 0 { - k = envFrom.Prefix + k - } - if errMsgs := utilvalidation.IsEnvVarName(k); len(errMsgs) != 0 { - invalidKeys = append(invalidKeys, k) - continue - } - tmpEnv[k] = string(v) - } - if len(invalidKeys) > 0 { - sort.Strings(invalidKeys) - kl.recorder.Eventf(pod, v1.EventTypeWarning, "InvalidEnvironmentVariableNames", "Keys [%s] from the EnvFrom secret %s/%s were skipped since they are considered invalid environment variable names.", strings.Join(invalidKeys, ", "), pod.Namespace, name) - } - } - } - - // Determine the final values of variables: - // - // 1. Determine the final value of each variable: - // a. If the variable's Value is set, expand the `$(var)` references to other - // variables in the .Value field; the sources of variables are the declared - // variables of the container and the service environment variables - // b. If a source is defined for an environment variable, resolve the source - // 2. Create the container's environment in the order variables are declared - // 3. Add remaining service environment vars - var ( - mappingFunc = expansion.MappingFuncFor(tmpEnv, serviceEnv) - ) - for _, envVar := range container.Env { - runtimeVal := envVar.Value - if runtimeVal != "" { - // Step 1a: expand variable references - runtimeVal = expansion.Expand(runtimeVal, mappingFunc) - } else if envVar.ValueFrom != nil { - // Step 1b: resolve alternate env var sources - switch { - case envVar.ValueFrom.FieldRef != nil: - runtimeVal, err = kl.podFieldSelectorRuntimeValue(envVar.ValueFrom.FieldRef, pod, podIP) - if err != nil { - return result, err - } - case envVar.ValueFrom.ResourceFieldRef != nil: - defaultedPod, defaultedContainer, err := kl.defaultPodLimitsForDownwardAPI(pod, container) - if err != nil { - return result, err - } - runtimeVal, err = containerResourceRuntimeValue(envVar.ValueFrom.ResourceFieldRef, defaultedPod, defaultedContainer) - if err != nil { - return result, err - } - case envVar.ValueFrom.ConfigMapKeyRef != nil: - cm := envVar.ValueFrom.ConfigMapKeyRef - name := cm.Name - key := cm.Key - optional := cm.Optional != nil && *cm.Optional - configMap, ok := configMaps[name] - if !ok { - if kl.kubeClient == nil { - return result, fmt.Errorf("Couldn't get configMap %v/%v, no kubeClient defined", pod.Namespace, name) - } - configMap, err = kl.configMapManager.GetConfigMap(pod.Namespace, name) - if err != nil { - if errors.IsNotFound(err) && optional { - // ignore error when marked optional - continue - } - return result, err - } - configMaps[name] = configMap - } - runtimeVal, ok = configMap.Data[key] - if !ok { - if optional { - continue - } - return result, fmt.Errorf("Couldn't find key %v in ConfigMap %v/%v", key, pod.Namespace, name) - } - case envVar.ValueFrom.SecretKeyRef != nil: - s := envVar.ValueFrom.SecretKeyRef - name := s.Name - key := s.Key - optional := s.Optional != nil && *s.Optional - secret, ok := secrets[name] - if !ok { - if kl.kubeClient == nil { - return result, fmt.Errorf("Couldn't get secret %v/%v, no kubeClient defined", pod.Namespace, name) - } - secret, err = kl.secretManager.GetSecret(pod.Namespace, name) - if err != nil { - if errors.IsNotFound(err) && optional { - // ignore error when marked optional - continue - } - return result, err - } - secrets[name] = secret - } - runtimeValBytes, ok := secret.Data[key] - if !ok { - if optional { - continue - } - return result, fmt.Errorf("Couldn't find key %v in Secret %v/%v", key, pod.Namespace, name) - } - runtimeVal = string(runtimeValBytes) - } - } - // Accesses apiserver+Pods. - // So, the master may set service env vars, or kubelet may. In case both are doing - // it, we delete the key from the kubelet-generated ones so we don't have duplicate - // env vars. - // TODO: remove this next line once all platforms use apiserver+Pods. - delete(serviceEnv, envVar.Name) - - tmpEnv[envVar.Name] = runtimeVal - } - - // Append the env vars - for k, v := range tmpEnv { - result = append(result, kubecontainer.EnvVar{Name: k, Value: v}) - } - - // Append remaining service env vars. - for k, v := range serviceEnv { - // Accesses apiserver+Pods. - // So, the master may set service env vars, or kubelet may. In case both are doing - // it, we skip the key from the kubelet-generated ones so we don't have duplicate - // env vars. - // TODO: remove this next line once all platforms use apiserver+Pods. - if _, present := tmpEnv[k]; !present { - result = append(result, kubecontainer.EnvVar{Name: k, Value: v}) - } - } - return result, nil -} - -// podFieldSelectorRuntimeValue returns the runtime value of the given -// selector for a pod. -func (kl *Kubelet) podFieldSelectorRuntimeValue(fs *v1.ObjectFieldSelector, pod *v1.Pod, podIP string) (string, error) { - internalFieldPath, _, err := podshelper.ConvertDownwardAPIFieldLabel(fs.APIVersion, fs.FieldPath, "") - if err != nil { - return "", err - } - switch internalFieldPath { - case "spec.nodeName": - return pod.Spec.NodeName, nil - case "spec.serviceAccountName": - return pod.Spec.ServiceAccountName, nil - case "status.hostIP": - hostIP, err := kl.getHostIPAnyWay() - if err != nil { - return "", err - } - return hostIP.String(), nil - case "status.podIP": - return podIP, nil - } - return fieldpath.ExtractFieldPathAsString(pod, internalFieldPath) -} - -// containerResourceRuntimeValue returns the value of the provided container resource -func containerResourceRuntimeValue(fs *v1.ResourceFieldSelector, pod *v1.Pod, container *v1.Container) (string, error) { - containerName := fs.ContainerName - if len(containerName) == 0 { - return resource.ExtractContainerResourceValue(fs, container) - } - return resource.ExtractResourceValueByContainerName(fs, pod, containerName) -} - -// One of the following arguments must be non-nil: runningPod, status. -// TODO: Modify containerRuntime.KillPod() to accept the right arguments. -func (kl *Kubelet) killPod(pod *v1.Pod, runningPod *kubecontainer.Pod, status *kubecontainer.PodStatus, gracePeriodOverride *int64) error { - var p kubecontainer.Pod - if runningPod != nil { - p = *runningPod - } else if status != nil { - p = kubecontainer.ConvertPodStatusToRunningPod(kl.getRuntime().Type(), status) - } else { - return fmt.Errorf("one of the two arguments must be non-nil: runningPod, status") - } - - // Call the container runtime KillPod method which stops all running containers of the pod - if err := kl.containerRuntime.KillPod(pod, p, gracePeriodOverride); err != nil { - return err - } - if err := kl.containerManager.UpdateQOSCgroups(); err != nil { - glog.V(2).Infof("Failed to update QoS cgroups while killing pod: %v", err) - } - return nil -} - -// makePodDataDirs creates the dirs for the pod datas. -func (kl *Kubelet) makePodDataDirs(pod *v1.Pod) error { - uid := pod.UID - if err := os.MkdirAll(kl.getPodDir(uid), 0750); err != nil && !os.IsExist(err) { - return err - } - if err := os.MkdirAll(kl.getPodVolumesDir(uid), 0750); err != nil && !os.IsExist(err) { - return err - } - if err := os.MkdirAll(kl.getPodPluginsDir(uid), 0750); err != nil && !os.IsExist(err) { - return err - } - return nil -} - -// getPullSecretsForPod inspects the Pod and retrieves the referenced pull -// secrets. -func (kl *Kubelet) getPullSecretsForPod(pod *v1.Pod) []v1.Secret { - pullSecrets := []v1.Secret{} - - for _, secretRef := range pod.Spec.ImagePullSecrets { - secret, err := kl.secretManager.GetSecret(pod.Namespace, secretRef.Name) - if err != nil { - glog.Warningf("Unable to retrieve pull secret %s/%s for %s/%s due to %v. The image pull may not succeed.", pod.Namespace, secretRef.Name, pod.Namespace, pod.Name, err) - continue - } - - pullSecrets = append(pullSecrets, *secret) - } - - return pullSecrets -} - -// podIsTerminated returns true if pod is in the terminated state ("Failed" or "Succeeded"). -func (kl *Kubelet) podIsTerminated(pod *v1.Pod) bool { - // Check the cached pod status which was set after the last sync. - status, ok := kl.statusManager.GetPodStatus(pod.UID) - if !ok { - // If there is no cached status, use the status from the - // apiserver. This is useful if kubelet has recently been - // restarted. - status = pod.Status - } - return status.Phase == v1.PodFailed || status.Phase == v1.PodSucceeded || (pod.DeletionTimestamp != nil && notRunning(status.ContainerStatuses)) -} - -// IsPodTerminated returns trus if the pod with the provided UID is in a terminated state ("Failed" or "Succeeded") -// or if the pod has been deleted or removed -func (kl *Kubelet) IsPodTerminated(uid types.UID) bool { - pod, podFound := kl.podManager.GetPodByUID(uid) - if !podFound { - return true - } - return kl.podIsTerminated(pod) -} - -// IsPodDeleted returns true if the pod is deleted. For the pod to be deleted, either: -// 1. The pod object is deleted -// 2. The pod's status is evicted -// 3. The pod's deletion timestamp is set, and containers are not running -func (kl *Kubelet) IsPodDeleted(uid types.UID) bool { - pod, podFound := kl.podManager.GetPodByUID(uid) - if !podFound { - return true - } - status, statusFound := kl.statusManager.GetPodStatus(pod.UID) - if !statusFound { - status = pod.Status - } - return eviction.PodIsEvicted(status) || (pod.DeletionTimestamp != nil && notRunning(status.ContainerStatuses)) -} - -// PodResourcesAreReclaimed returns true if all required node-level resources that a pod was consuming have -// been reclaimed by the kubelet. Reclaiming resources is a prerequisite to deleting a pod from the API server. -func (kl *Kubelet) PodResourcesAreReclaimed(pod *v1.Pod, status v1.PodStatus) bool { - if !notRunning(status.ContainerStatuses) { - // We shouldnt delete pods that still have running containers - glog.V(3).Infof("Pod %q is terminated, but some containers are still running", format.Pod(pod)) - return false - } - // pod's containers should be deleted - runtimeStatus, err := kl.podCache.Get(pod.UID) - if err != nil { - glog.V(3).Infof("Pod %q is terminated, Error getting runtimeStatus from the podCache: %s", format.Pod(pod), err) - return false - } - if len(runtimeStatus.ContainerStatuses) > 0 { - var statusStr string - for _, status := range runtimeStatus.ContainerStatuses { - statusStr += fmt.Sprintf("%+v ", *status) - } - glog.V(3).Infof("Pod %q is terminated, but some containers have not been cleaned up: %s", format.Pod(pod), statusStr) - return false - } - if kl.podVolumesExist(pod.UID) && !kl.keepTerminatedPodVolumes { - // We shouldnt delete pods whose volumes have not been cleaned up if we are not keeping terminated pod volumes - glog.V(3).Infof("Pod %q is terminated, but some volumes have not been cleaned up", format.Pod(pod)) - return false - } - if kl.kubeletConfiguration.CgroupsPerQOS { - pcm := kl.containerManager.NewPodContainerManager() - if pcm.Exists(pod) { - glog.V(3).Infof("Pod %q is terminated, but pod cgroup sandbox has not been cleaned up", format.Pod(pod)) - return false - } - } - return true -} - -// podResourcesAreReclaimed simply calls PodResourcesAreReclaimed with the most up-to-date status. -func (kl *Kubelet) podResourcesAreReclaimed(pod *v1.Pod) bool { - status, ok := kl.statusManager.GetPodStatus(pod.UID) - if !ok { - status = pod.Status - } - return kl.PodResourcesAreReclaimed(pod, status) -} - -// notRunning returns true if every status is terminated or waiting, or the status list -// is empty. -func notRunning(statuses []v1.ContainerStatus) bool { - for _, status := range statuses { - if status.State.Terminated == nil && status.State.Waiting == nil { - return false - } - } - return true -} - -// filterOutTerminatedPods returns the given pods which the status manager -// does not consider failed or succeeded. -func (kl *Kubelet) filterOutTerminatedPods(pods []*v1.Pod) []*v1.Pod { - var filteredPods []*v1.Pod - for _, p := range pods { - if kl.podIsTerminated(p) { - continue - } - filteredPods = append(filteredPods, p) - } - return filteredPods -} - -// removeOrphanedPodStatuses removes obsolete entries in podStatus where -// the pod is no longer considered bound to this node. -func (kl *Kubelet) removeOrphanedPodStatuses(pods []*v1.Pod, mirrorPods []*v1.Pod) { - podUIDs := make(map[types.UID]bool) - for _, pod := range pods { - podUIDs[pod.UID] = true - } - for _, pod := range mirrorPods { - podUIDs[pod.UID] = true - } - kl.statusManager.RemoveOrphanedStatuses(podUIDs) -} - -// HandlePodCleanups performs a series of cleanup work, including terminating -// pod workers, killing unwanted pods, and removing orphaned volumes/pod -// directories. -// NOTE: This function is executed by the main sync loop, so it -// should not contain any blocking calls. -func (kl *Kubelet) HandlePodCleanups() error { - // The kubelet lacks checkpointing, so we need to introspect the set of pods - // in the cgroup tree prior to inspecting the set of pods in our pod manager. - // this ensures our view of the cgroup tree does not mistakenly observe pods - // that are added after the fact... - var ( - cgroupPods map[types.UID]cm.CgroupName - err error - ) - if kl.cgroupsPerQOS { - pcm := kl.containerManager.NewPodContainerManager() - cgroupPods, err = pcm.GetAllPodsFromCgroups() - if err != nil { - return fmt.Errorf("failed to get list of pods that still exist on cgroup mounts: %v", err) - } - } - - allPods, mirrorPods := kl.podManager.GetPodsAndMirrorPods() - // Pod phase progresses monotonically. Once a pod has reached a final state, - // it should never leave regardless of the restart policy. The statuses - // of such pods should not be changed, and there is no need to sync them. - // TODO: the logic here does not handle two cases: - // 1. If the containers were removed immediately after they died, kubelet - // may fail to generate correct statuses, let alone filtering correctly. - // 2. If kubelet restarted before writing the terminated status for a pod - // to the apiserver, it could still restart the terminated pod (even - // though the pod was not considered terminated by the apiserver). - // These two conditions could be alleviated by checkpointing kubelet. - activePods := kl.filterOutTerminatedPods(allPods) - - desiredPods := make(map[types.UID]empty) - for _, pod := range activePods { - desiredPods[pod.UID] = empty{} - } - // Stop the workers for no-longer existing pods. - // TODO: is here the best place to forget pod workers? - kl.podWorkers.ForgetNonExistingPodWorkers(desiredPods) - kl.probeManager.CleanupPods(activePods) - - runningPods, err := kl.runtimeCache.GetPods() - if err != nil { - glog.Errorf("Error listing containers: %#v", err) - return err - } - for _, pod := range runningPods { - if _, found := desiredPods[pod.ID]; !found { - kl.podKillingCh <- &kubecontainer.PodPair{APIPod: nil, RunningPod: pod} - } - } - - kl.removeOrphanedPodStatuses(allPods, mirrorPods) - // Note that we just killed the unwanted pods. This may not have reflected - // in the cache. We need to bypass the cache to get the latest set of - // running pods to clean up the volumes. - // TODO: Evaluate the performance impact of bypassing the runtime cache. - runningPods, err = kl.containerRuntime.GetPods(false) - if err != nil { - glog.Errorf("Error listing containers: %#v", err) - return err - } - - // Remove any orphaned volumes. - // Note that we pass all pods (including terminated pods) to the function, - // so that we don't remove volumes associated with terminated but not yet - // deleted pods. - err = kl.cleanupOrphanedPodDirs(allPods, runningPods) - if err != nil { - // We want all cleanup tasks to be run even if one of them failed. So - // we just log an error here and continue other cleanup tasks. - // This also applies to the other clean up tasks. - glog.Errorf("Failed cleaning up orphaned pod directories: %v", err) - } - - // Remove any orphaned mirror pods. - kl.podManager.DeleteOrphanedMirrorPods() - - // Remove any cgroups in the hierarchy for pods that are no longer running. - if kl.cgroupsPerQOS { - kl.cleanupOrphanedPodCgroups(cgroupPods, activePods) - } - - kl.backOff.GC() - return nil -} - -// podKiller launches a goroutine to kill a pod received from the channel if -// another goroutine isn't already in action. -func (kl *Kubelet) podKiller() { - killing := sets.NewString() - // guard for the killing set - lock := sync.Mutex{} - for podPair := range kl.podKillingCh { - runningPod := podPair.RunningPod - apiPod := podPair.APIPod - - lock.Lock() - exists := killing.Has(string(runningPod.ID)) - if !exists { - killing.Insert(string(runningPod.ID)) - } - lock.Unlock() - - if !exists { - go func(apiPod *v1.Pod, runningPod *kubecontainer.Pod) { - glog.V(2).Infof("Killing unwanted pod %q", runningPod.Name) - err := kl.killPod(apiPod, runningPod, nil, nil) - if err != nil { - glog.Errorf("Failed killing the pod %q: %v", runningPod.Name, err) - } - lock.Lock() - killing.Delete(string(runningPod.ID)) - lock.Unlock() - }(apiPod, runningPod) - } - } -} - -// validateContainerLogStatus returns the container ID for the desired container to retrieve logs for, based on the state -// of the container. The previous flag will only return the logs for the last terminated container, otherwise, the current -// running container is preferred over a previous termination. If info about the container is not available then a specific -// error is returned to the end user. -func (kl *Kubelet) validateContainerLogStatus(podName string, podStatus *v1.PodStatus, containerName string, previous bool) (containerID kubecontainer.ContainerID, err error) { - var cID string - - cStatus, found := podutil.GetContainerStatus(podStatus.ContainerStatuses, containerName) - // if not found, check the init containers - if !found { - cStatus, found = podutil.GetContainerStatus(podStatus.InitContainerStatuses, containerName) - } - if !found { - return kubecontainer.ContainerID{}, fmt.Errorf("container %q in pod %q is not available", containerName, podName) - } - lastState := cStatus.LastTerminationState - waiting, running, terminated := cStatus.State.Waiting, cStatus.State.Running, cStatus.State.Terminated - - switch { - case previous: - if lastState.Terminated == nil || lastState.Terminated.ContainerID == "" { - return kubecontainer.ContainerID{}, fmt.Errorf("previous terminated container %q in pod %q not found", containerName, podName) - } - cID = lastState.Terminated.ContainerID - - case running != nil: - cID = cStatus.ContainerID - - case terminated != nil: - // in cases where the next container didn't start, terminated.ContainerID will be empty, so get logs from the lastState.Terminated. - if terminated.ContainerID == "" { - if lastState.Terminated != nil && lastState.Terminated.ContainerID != "" { - cID = lastState.Terminated.ContainerID - } else { - return kubecontainer.ContainerID{}, fmt.Errorf("container %q in pod %q is terminated", containerName, podName) - } - } else { - cID = terminated.ContainerID - } - - case lastState.Terminated != nil: - if lastState.Terminated.ContainerID == "" { - return kubecontainer.ContainerID{}, fmt.Errorf("container %q in pod %q is terminated", containerName, podName) - } - cID = lastState.Terminated.ContainerID - - case waiting != nil: - // output some info for the most common pending failures - switch reason := waiting.Reason; reason { - case images.ErrImagePull.Error(): - return kubecontainer.ContainerID{}, fmt.Errorf("container %q in pod %q is waiting to start: image can't be pulled", containerName, podName) - case images.ErrImagePullBackOff.Error(): - return kubecontainer.ContainerID{}, fmt.Errorf("container %q in pod %q is waiting to start: trying and failing to pull image", containerName, podName) - default: - return kubecontainer.ContainerID{}, fmt.Errorf("container %q in pod %q is waiting to start: %v", containerName, podName, reason) - } - default: - // unrecognized state - return kubecontainer.ContainerID{}, fmt.Errorf("container %q in pod %q is waiting to start - no logs yet", containerName, podName) - } - - return kubecontainer.ParseContainerID(cID), nil -} - -// GetKubeletContainerLogs returns logs from the container -// TODO: this method is returning logs of random container attempts, when it should be returning the most recent attempt -// or all of them. -func (kl *Kubelet) GetKubeletContainerLogs(podFullName, containerName string, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) error { - // Pod workers periodically write status to statusManager. If status is not - // cached there, something is wrong (or kubelet just restarted and hasn't - // caught up yet). Just assume the pod is not ready yet. - name, namespace, err := kubecontainer.ParsePodFullName(podFullName) - if err != nil { - return fmt.Errorf("unable to parse pod full name %q: %v", podFullName, err) - } - - pod, ok := kl.GetPodByName(namespace, name) - if !ok { - return fmt.Errorf("pod %q cannot be found - no logs available", name) - } - - podUID := pod.UID - if mirrorPod, ok := kl.podManager.GetMirrorPodByPod(pod); ok { - podUID = mirrorPod.UID - } - podStatus, found := kl.statusManager.GetPodStatus(podUID) - if !found { - // If there is no cached status, use the status from the - // apiserver. This is useful if kubelet has recently been - // restarted. - podStatus = pod.Status - } - - // TODO: Consolidate the logic here with kuberuntime.GetContainerLogs, here we convert container name to containerID, - // but inside kuberuntime we convert container id back to container name and restart count. - // TODO: After separate container log lifecycle management, we should get log based on the existing log files - // instead of container status. - containerID, err := kl.validateContainerLogStatus(pod.Name, &podStatus, containerName, logOptions.Previous) - if err != nil { - return err - } - - // Do a zero-byte write to stdout before handing off to the container runtime. - // This ensures at least one Write call is made to the writer when copying starts, - // even if we then block waiting for log output from the container. - if _, err := stdout.Write([]byte{}); err != nil { - return err - } - - if kl.dockerLegacyService != nil { - // dockerLegacyService should only be non-nil when we actually need it, so - // inject it into the runtimeService. - // TODO(random-liu): Remove this hack after deprecating unsupported log driver. - return kl.dockerLegacyService.GetContainerLogs(pod, containerID, logOptions, stdout, stderr) - } - return kl.containerRuntime.GetContainerLogs(pod, containerID, logOptions, stdout, stderr) -} - -// getPhase returns the phase of a pod given its container info. -func getPhase(spec *v1.PodSpec, info []v1.ContainerStatus) v1.PodPhase { - initialized := 0 - pendingInitialization := 0 - failedInitialization := 0 - for _, container := range spec.InitContainers { - containerStatus, ok := podutil.GetContainerStatus(info, container.Name) - if !ok { - pendingInitialization++ - continue - } - - switch { - case containerStatus.State.Running != nil: - pendingInitialization++ - case containerStatus.State.Terminated != nil: - if containerStatus.State.Terminated.ExitCode == 0 { - initialized++ - } else { - failedInitialization++ - } - case containerStatus.State.Waiting != nil: - if containerStatus.LastTerminationState.Terminated != nil { - if containerStatus.LastTerminationState.Terminated.ExitCode == 0 { - initialized++ - } else { - failedInitialization++ - } - } else { - pendingInitialization++ - } - default: - pendingInitialization++ - } - } - - unknown := 0 - running := 0 - waiting := 0 - stopped := 0 - failed := 0 - succeeded := 0 - for _, container := range spec.Containers { - containerStatus, ok := podutil.GetContainerStatus(info, container.Name) - if !ok { - unknown++ - continue - } - - switch { - case containerStatus.State.Running != nil: - running++ - case containerStatus.State.Terminated != nil: - stopped++ - if containerStatus.State.Terminated.ExitCode == 0 { - succeeded++ - } else { - failed++ - } - case containerStatus.State.Waiting != nil: - if containerStatus.LastTerminationState.Terminated != nil { - stopped++ - } else { - waiting++ - } - default: - unknown++ - } - } - - if failedInitialization > 0 && spec.RestartPolicy == v1.RestartPolicyNever { - return v1.PodFailed - } - - switch { - case pendingInitialization > 0: - fallthrough - case waiting > 0: - glog.V(5).Infof("pod waiting > 0, pending") - // One or more containers has not been started - return v1.PodPending - case running > 0 && unknown == 0: - // All containers have been started, and at least - // one container is running - return v1.PodRunning - case running == 0 && stopped > 0 && unknown == 0: - // All containers are terminated - if spec.RestartPolicy == v1.RestartPolicyAlways { - // All containers are in the process of restarting - return v1.PodRunning - } - if stopped == succeeded { - // RestartPolicy is not Always, and all - // containers are terminated in success - return v1.PodSucceeded - } - if spec.RestartPolicy == v1.RestartPolicyNever { - // RestartPolicy is Never, and all containers are - // terminated with at least one in failure - return v1.PodFailed - } - // RestartPolicy is OnFailure, and at least one in failure - // and in the process of restarting - return v1.PodRunning - default: - glog.V(5).Infof("pod default case, pending") - return v1.PodPending - } -} - -// generateAPIPodStatus creates the final API pod status for a pod, given the -// internal pod status. -func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.PodStatus) v1.PodStatus { - glog.V(3).Infof("Generating status for %q", format.Pod(pod)) - - // check if an internal module has requested the pod is evicted. - for _, podSyncHandler := range kl.PodSyncHandlers { - if result := podSyncHandler.ShouldEvict(pod); result.Evict { - return v1.PodStatus{ - Phase: v1.PodFailed, - Reason: result.Reason, - Message: result.Message, - } - } - } - - s := kl.convertStatusToAPIStatus(pod, podStatus) - - // Assume info is ready to process - spec := &pod.Spec - allStatus := append(append([]v1.ContainerStatus{}, s.ContainerStatuses...), s.InitContainerStatuses...) - s.Phase = getPhase(spec, allStatus) - // Check for illegal phase transition - if pod.Status.Phase == v1.PodFailed || pod.Status.Phase == v1.PodSucceeded { - // API server shows terminal phase; transitions are not allowed - if s.Phase != pod.Status.Phase { - glog.Errorf("Pod attempted illegal phase transition from %s to %s: %v", pod.Status.Phase, s.Phase, s) - // Force back to phase from the API server - s.Phase = pod.Status.Phase - } - } - kl.probeManager.UpdatePodStatus(pod.UID, s) - s.Conditions = append(s.Conditions, status.GeneratePodInitializedCondition(spec, s.InitContainerStatuses, s.Phase)) - s.Conditions = append(s.Conditions, status.GeneratePodReadyCondition(spec, s.Conditions, s.ContainerStatuses, s.Phase)) - s.Conditions = append(s.Conditions, status.GenerateContainersReadyCondition(spec, s.ContainerStatuses, s.Phase)) - // Status manager will take care of the LastTransitionTimestamp, either preserve - // the timestamp from apiserver, or set a new one. When kubelet sees the pod, - // `PodScheduled` condition must be true. - s.Conditions = append(s.Conditions, v1.PodCondition{ - Type: v1.PodScheduled, - Status: v1.ConditionTrue, - }) - - if kl.kubeClient != nil { - hostIP, err := kl.getHostIPAnyWay() - if err != nil { - glog.V(4).Infof("Cannot get host IP: %v", err) - } else { - s.HostIP = hostIP.String() - if kubecontainer.IsHostNetworkPod(pod) && s.PodIP == "" { - s.PodIP = hostIP.String() - } - } - } - - return *s -} - -// convertStatusToAPIStatus creates an api PodStatus for the given pod from -// the given internal pod status. It is purely transformative and does not -// alter the kubelet state at all. -func (kl *Kubelet) convertStatusToAPIStatus(pod *v1.Pod, podStatus *kubecontainer.PodStatus) *v1.PodStatus { - var apiPodStatus v1.PodStatus - apiPodStatus.PodIP = podStatus.IP - // set status for Pods created on versions of kube older than 1.6 - apiPodStatus.QOSClass = v1qos.GetPodQOS(pod) - - oldPodStatus, found := kl.statusManager.GetPodStatus(pod.UID) - if !found { - oldPodStatus = pod.Status - } - - apiPodStatus.ContainerStatuses = kl.convertToAPIContainerStatuses( - pod, podStatus, - oldPodStatus.ContainerStatuses, - pod.Spec.Containers, - len(pod.Spec.InitContainers) > 0, - false, - ) - apiPodStatus.InitContainerStatuses = kl.convertToAPIContainerStatuses( - pod, podStatus, - oldPodStatus.InitContainerStatuses, - pod.Spec.InitContainers, - len(pod.Spec.InitContainers) > 0, - true, - ) - - // Preserves conditions not controlled by kubelet - for _, c := range pod.Status.Conditions { - if !kubetypes.PodConditionByKubelet(c.Type) { - apiPodStatus.Conditions = append(apiPodStatus.Conditions, c) - } - } - return &apiPodStatus -} - -// convertToAPIContainerStatuses converts the given internal container -// statuses into API container statuses. -func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecontainer.PodStatus, previousStatus []v1.ContainerStatus, containers []v1.Container, hasInitContainers, isInitContainer bool) []v1.ContainerStatus { - convertContainerStatus := func(cs *kubecontainer.ContainerStatus) *v1.ContainerStatus { - cid := cs.ID.String() - status := &v1.ContainerStatus{ - Name: cs.Name, - RestartCount: int32(cs.RestartCount), - Image: cs.Image, - ImageID: cs.ImageID, - ContainerID: cid, - } - switch cs.State { - case kubecontainer.ContainerStateRunning: - status.State.Running = &v1.ContainerStateRunning{StartedAt: metav1.NewTime(cs.StartedAt)} - case kubecontainer.ContainerStateCreated: - // Treat containers in the "created" state as if they are exited. - // The pod workers are supposed start all containers it creates in - // one sync (syncPod) iteration. There should not be any normal - // "created" containers when the pod worker generates the status at - // the beginning of a sync iteration. - fallthrough - case kubecontainer.ContainerStateExited: - status.State.Terminated = &v1.ContainerStateTerminated{ - ExitCode: int32(cs.ExitCode), - Reason: cs.Reason, - Message: cs.Message, - StartedAt: metav1.NewTime(cs.StartedAt), - FinishedAt: metav1.NewTime(cs.FinishedAt), - ContainerID: cid, - } - default: - status.State.Waiting = &v1.ContainerStateWaiting{} - } - return status - } - - // Fetch old containers statuses from old pod status. - oldStatuses := make(map[string]v1.ContainerStatus, len(containers)) - for _, status := range previousStatus { - oldStatuses[status.Name] = status - } - - // Set all container statuses to default waiting state - statuses := make(map[string]*v1.ContainerStatus, len(containers)) - defaultWaitingState := v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "ContainerCreating"}} - if hasInitContainers { - defaultWaitingState = v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "PodInitializing"}} - } - - for _, container := range containers { - status := &v1.ContainerStatus{ - Name: container.Name, - Image: container.Image, - State: defaultWaitingState, - } - oldStatus, found := oldStatuses[container.Name] - if found { - if oldStatus.State.Terminated != nil { - // Do not update status on terminated init containers as - // they be removed at any time. - status = &oldStatus - } else { - // Apply some values from the old statuses as the default values. - status.RestartCount = oldStatus.RestartCount - status.LastTerminationState = oldStatus.LastTerminationState - } - } - statuses[container.Name] = status - } - - // Make the latest container status comes first. - sort.Sort(sort.Reverse(kubecontainer.SortContainerStatusesByCreationTime(podStatus.ContainerStatuses))) - // Set container statuses according to the statuses seen in pod status - containerSeen := map[string]int{} - for _, cStatus := range podStatus.ContainerStatuses { - cName := cStatus.Name - if _, ok := statuses[cName]; !ok { - // This would also ignore the infra container. - continue - } - if containerSeen[cName] >= 2 { - continue - } - status := convertContainerStatus(cStatus) - if containerSeen[cName] == 0 { - statuses[cName] = status - } else { - statuses[cName].LastTerminationState = status.State - } - containerSeen[cName] = containerSeen[cName] + 1 - } - - // Handle the containers failed to be started, which should be in Waiting state. - for _, container := range containers { - if isInitContainer { - // If the init container is terminated with exit code 0, it won't be restarted. - // TODO(random-liu): Handle this in a cleaner way. - s := podStatus.FindContainerStatusByName(container.Name) - if s != nil && s.State == kubecontainer.ContainerStateExited && s.ExitCode == 0 { - continue - } - } - // If a container should be restarted in next syncpod, it is *Waiting*. - if !kubecontainer.ShouldContainerBeRestarted(&container, pod, podStatus) { - continue - } - status := statuses[container.Name] - reason, ok := kl.reasonCache.Get(pod.UID, container.Name) - if !ok { - // In fact, we could also apply Waiting state here, but it is less informative, - // and the container will be restarted soon, so we prefer the original state here. - // Note that with the current implementation of ShouldContainerBeRestarted the original state here - // could be: - // * Waiting: There is no associated historical container and start failure reason record. - // * Terminated: The container is terminated. - continue - } - if status.State.Terminated != nil { - status.LastTerminationState = status.State - } - status.State = v1.ContainerState{ - Waiting: &v1.ContainerStateWaiting{ - Reason: reason.Err.Error(), - Message: reason.Message, - }, - } - statuses[container.Name] = status - } - - var containerStatuses []v1.ContainerStatus - for _, status := range statuses { - containerStatuses = append(containerStatuses, *status) - } - - // Sort the container statuses since clients of this interface expect the list - // of containers in a pod has a deterministic order. - if isInitContainer { - kubetypes.SortInitContainerStatuses(pod, containerStatuses) - } else { - sort.Sort(kubetypes.SortedContainerStatuses(containerStatuses)) - } - return containerStatuses -} - -// ServeLogs returns logs of current machine. -func (kl *Kubelet) ServeLogs(w http.ResponseWriter, req *http.Request) { - // TODO: whitelist logs we are willing to serve - kl.logServer.ServeHTTP(w, req) -} - -// findContainer finds and returns the container with the given pod ID, full name, and container name. -// It returns nil if not found. -func (kl *Kubelet) findContainer(podFullName string, podUID types.UID, containerName string) (*kubecontainer.Container, error) { - pods, err := kl.containerRuntime.GetPods(false) - if err != nil { - return nil, err - } - // Resolve and type convert back again. - // We need the static pod UID but the kubecontainer API works with types.UID. - podUID = types.UID(kl.podManager.TranslatePodUID(podUID)) - pod := kubecontainer.Pods(pods).FindPod(podFullName, podUID) - return pod.FindContainerByName(containerName), nil -} - -// RunInContainer runs a command in a container, returns the combined stdout, stderr as an array of bytes -func (kl *Kubelet) RunInContainer(podFullName string, podUID types.UID, containerName string, cmd []string) ([]byte, error) { - container, err := kl.findContainer(podFullName, podUID, containerName) - if err != nil { - return nil, err - } - if container == nil { - return nil, fmt.Errorf("container not found (%q)", containerName) - } - // TODO(tallclair): Pass a proper timeout value. - return kl.runner.RunInContainer(container.ID, cmd, 0) -} - -// GetExec gets the URL the exec will be served from, or nil if the Kubelet will serve it. -func (kl *Kubelet) GetExec(podFullName string, podUID types.UID, containerName string, cmd []string, streamOpts remotecommandserver.Options) (*url.URL, error) { - container, err := kl.findContainer(podFullName, podUID, containerName) - if err != nil { - return nil, err - } - if container == nil { - return nil, fmt.Errorf("container not found (%q)", containerName) - } - return kl.streamingRuntime.GetExec(container.ID, cmd, streamOpts.Stdin, streamOpts.Stdout, streamOpts.Stderr, streamOpts.TTY) -} - -// GetAttach gets the URL the attach will be served from, or nil if the Kubelet will serve it. -func (kl *Kubelet) GetAttach(podFullName string, podUID types.UID, containerName string, streamOpts remotecommandserver.Options) (*url.URL, error) { - container, err := kl.findContainer(podFullName, podUID, containerName) - if err != nil { - return nil, err - } - if container == nil { - return nil, fmt.Errorf("container %s not found in pod %s", containerName, podFullName) - } - - // The TTY setting for attach must match the TTY setting in the initial container configuration, - // since whether the process is running in a TTY cannot be changed after it has started. We - // need the api.Pod to get the TTY status. - pod, found := kl.GetPodByFullName(podFullName) - if !found || (string(podUID) != "" && pod.UID != podUID) { - return nil, fmt.Errorf("pod %s not found", podFullName) - } - containerSpec := kubecontainer.GetContainerSpec(pod, containerName) - if containerSpec == nil { - return nil, fmt.Errorf("container %s not found in pod %s", containerName, podFullName) - } - tty := containerSpec.TTY - - return kl.streamingRuntime.GetAttach(container.ID, streamOpts.Stdin, streamOpts.Stdout, streamOpts.Stderr, tty) -} - -// GetPortForward gets the URL the port-forward will be served from, or nil if the Kubelet will serve it. -func (kl *Kubelet) GetPortForward(podName, podNamespace string, podUID types.UID, portForwardOpts portforward.V4Options) (*url.URL, error) { - pods, err := kl.containerRuntime.GetPods(false) - if err != nil { - return nil, err - } - // Resolve and type convert back again. - // We need the static pod UID but the kubecontainer API works with types.UID. - podUID = types.UID(kl.podManager.TranslatePodUID(podUID)) - podFullName := kubecontainer.BuildPodFullName(podName, podNamespace) - pod := kubecontainer.Pods(pods).FindPod(podFullName, podUID) - if pod.IsEmpty() { - return nil, fmt.Errorf("pod not found (%q)", podFullName) - } - - return kl.streamingRuntime.GetPortForward(podName, podNamespace, podUID, portForwardOpts.Ports) -} - -// cleanupOrphanedPodCgroups removes cgroups that should no longer exist. -// it reconciles the cached state of cgroupPods with the specified list of runningPods -func (kl *Kubelet) cleanupOrphanedPodCgroups(cgroupPods map[types.UID]cm.CgroupName, activePods []*v1.Pod) { - // Add all running pods to the set that we want to preserve - podSet := sets.NewString() - for _, pod := range activePods { - podSet.Insert(string(pod.UID)) - } - pcm := kl.containerManager.NewPodContainerManager() - - // Iterate over all the found pods to verify if they should be running - for uid, val := range cgroupPods { - // if the pod is in the running set, its not a candidate for cleanup - if podSet.Has(string(uid)) { - continue - } - - // If volumes have not been unmounted/detached, do not delete the cgroup - // so any memory backed volumes don't have their charges propagated to the - // parent croup. If the volumes still exist, reduce the cpu shares for any - // process in the cgroup to the minimum value while we wait. if the kubelet - // is configured to keep terminated volumes, we will delete the cgroup and not block. - if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist && !kl.keepTerminatedPodVolumes { - glog.V(3).Infof("Orphaned pod %q found, but volumes not yet removed. Reducing cpu to minimum", uid) - if err := pcm.ReduceCPULimits(val); err != nil { - glog.Warningf("Failed to reduce cpu time for pod %q pending volume cleanup due to %v", uid, err) - } - continue - } - glog.V(3).Infof("Orphaned pod %q found, removing pod cgroups", uid) - // Destroy all cgroups of pod that should not be running, - // by first killing all the attached processes to these cgroups. - // We ignore errors thrown by the method, as the housekeeping loop would - // again try to delete these unwanted pod cgroups - go pcm.Destroy(val) - } -} - -// enableHostUserNamespace determines if the host user namespace should be used by the container runtime. -// Returns true if the pod is using a host pid, pic, or network namespace, the pod is using a non-namespaced -// capability, the pod contains a privileged container, or the pod has a host path volume. -// -// NOTE: when if a container shares any namespace with another container it must also share the user namespace -// or it will not have the correct capabilities in the namespace. This means that host user namespace -// is enabled per pod, not per container. -func (kl *Kubelet) enableHostUserNamespace(pod *v1.Pod) bool { - if kubecontainer.HasPrivilegedContainer(pod) || hasHostNamespace(pod) || - hasHostVolume(pod) || hasNonNamespacedCapability(pod) || kl.hasHostMountPVC(pod) { - return true - } - return false -} - -// hasNonNamespacedCapability returns true if MKNOD, SYS_TIME, or SYS_MODULE is requested for any container. -func hasNonNamespacedCapability(pod *v1.Pod) bool { - for _, c := range pod.Spec.Containers { - if c.SecurityContext != nil && c.SecurityContext.Capabilities != nil { - for _, cap := range c.SecurityContext.Capabilities.Add { - if cap == "MKNOD" || cap == "SYS_TIME" || cap == "SYS_MODULE" { - return true - } - } - } - } - - return false -} - -// hasHostVolume returns true if the pod spec has a HostPath volume. -func hasHostVolume(pod *v1.Pod) bool { - for _, v := range pod.Spec.Volumes { - if v.HostPath != nil { - return true - } - } - return false -} - -// hasHostNamespace returns true if hostIPC, hostNetwork, or hostPID are set to true. -func hasHostNamespace(pod *v1.Pod) bool { - if pod.Spec.SecurityContext == nil { - return false - } - return pod.Spec.HostIPC || pod.Spec.HostNetwork || pod.Spec.HostPID -} - -// hasHostMountPVC returns true if a PVC is referencing a HostPath volume. -func (kl *Kubelet) hasHostMountPVC(pod *v1.Pod) bool { - for _, volume := range pod.Spec.Volumes { - if volume.PersistentVolumeClaim != nil { - pvc, err := kl.kubeClient.CoreV1().PersistentVolumeClaims(pod.Namespace).Get(volume.PersistentVolumeClaim.ClaimName, metav1.GetOptions{}) - if err != nil { - glog.Warningf("unable to retrieve pvc %s:%s - %v", pod.Namespace, volume.PersistentVolumeClaim.ClaimName, err) - continue - } - if pvc != nil { - referencedVolume, err := kl.kubeClient.CoreV1().PersistentVolumes().Get(pvc.Spec.VolumeName, metav1.GetOptions{}) - if err != nil { - glog.Warningf("unable to retrieve pv %s - %v", pvc.Spec.VolumeName, err) - continue - } - if referencedVolume != nil && referencedVolume.Spec.HostPath != nil { - return true - } - } - } - } - return false -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go deleted file mode 100644 index dc47a858..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_resources.go +++ /dev/null @@ -1,57 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - - "github.com/golang/glog" - - "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/api/v1/resource" -) - -// defaultPodLimitsForDownwardAPI copies the input pod, and optional container, -// and applies default resource limits. it returns a copy of the input pod, -// and a copy of the input container (if specified) with default limits -// applied. if a container has no limit specified, it will default the limit to -// the node allocatable. -// TODO: if/when we have pod level resources, we need to update this function -// to use those limits instead of node allocatable. -func (kl *Kubelet) defaultPodLimitsForDownwardAPI(pod *v1.Pod, container *v1.Container) (*v1.Pod, *v1.Container, error) { - if pod == nil { - return nil, nil, fmt.Errorf("invalid input, pod cannot be nil") - } - - node, err := kl.getNodeAnyWay() - if err != nil { - return nil, nil, fmt.Errorf("failed to find node object, expected a node") - } - allocatable := node.Status.Allocatable - glog.Infof("allocatable: %v", allocatable) - outputPod := pod.DeepCopy() - for idx := range outputPod.Spec.Containers { - resource.MergeContainerResourceLimits(&outputPod.Spec.Containers[idx], allocatable) - } - - var outputContainer *v1.Container - if container != nil { - outputContainer = container.DeepCopy() - resource.MergeContainerResourceLimits(outputContainer, allocatable) - } - return outputPod, outputContainer, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go deleted file mode 100644 index 09179fec..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/sets" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/util/removeall" - "k8s.io/kubernetes/pkg/volume" - volumetypes "k8s.io/kubernetes/pkg/volume/util/types" -) - -// ListVolumesForPod returns a map of the mounted volumes for the given pod. -// The key in the map is the OuterVolumeSpecName (i.e. pod.Spec.Volumes[x].Name) -func (kl *Kubelet) ListVolumesForPod(podUID types.UID) (map[string]volume.Volume, bool) { - volumesToReturn := make(map[string]volume.Volume) - podVolumes := kl.volumeManager.GetMountedVolumesForPod( - volumetypes.UniquePodName(podUID)) - for outerVolumeSpecName, volume := range podVolumes { - // TODO: volume.Mounter could be nil if volume object is recovered - // from reconciler's sync state process. PR 33616 will fix this problem - // to create Mounter object when recovering volume state. - if volume.Mounter == nil { - continue - } - volumesToReturn[outerVolumeSpecName] = volume.Mounter - } - - return volumesToReturn, len(volumesToReturn) > 0 -} - -// podVolumesExist checks with the volume manager and returns true any of the -// pods for the specified volume are mounted. -func (kl *Kubelet) podVolumesExist(podUID types.UID) bool { - if mountedVolumes := - kl.volumeManager.GetMountedVolumesForPod( - volumetypes.UniquePodName(podUID)); len(mountedVolumes) > 0 { - return true - } - // TODO: This checks pod volume paths and whether they are mounted. If checking returns error, podVolumesExist will return true - // which means we consider volumes might exist and requires further checking. - // There are some volume plugins such as flexvolume might not have mounts. See issue #61229 - volumePaths, err := kl.getMountedVolumePathListFromDisk(podUID) - if err != nil { - glog.Errorf("pod %q found, but error %v occurred during checking mounted volumes from disk", podUID, err) - return true - } - if len(volumePaths) > 0 { - glog.V(4).Infof("pod %q found, but volumes are still mounted on disk %v", podUID, volumePaths) - return true - } - - return false -} - -// newVolumeMounterFromPlugins attempts to find a plugin by volume spec, pod -// and volume options and then creates a Mounter. -// Returns a valid mounter or an error. -func (kl *Kubelet) newVolumeMounterFromPlugins(spec *volume.Spec, pod *v1.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { - plugin, err := kl.volumePluginMgr.FindPluginBySpec(spec) - if err != nil { - return nil, fmt.Errorf("can't use volume plugins for %s: %v", spec.Name(), err) - } - physicalMounter, err := plugin.NewMounter(spec, pod, opts) - if err != nil { - return nil, fmt.Errorf("failed to instantiate mounter for volume: %s using plugin: %s with a root cause: %v", spec.Name(), plugin.GetPluginName(), err) - } - glog.V(10).Infof("Using volume plugin %q to mount %s", plugin.GetPluginName(), spec.Name()) - return physicalMounter, nil -} - -// cleanupOrphanedPodDirs removes the volumes of pods that should not be -// running and that have no containers running. Note that we roll up logs here since it runs in the main loop. -func (kl *Kubelet) cleanupOrphanedPodDirs(pods []*v1.Pod, runningPods []*kubecontainer.Pod) error { - allPods := sets.NewString() - for _, pod := range pods { - allPods.Insert(string(pod.UID)) - } - for _, pod := range runningPods { - allPods.Insert(string(pod.ID)) - } - - found, err := kl.listPodsFromDisk() - if err != nil { - return err - } - - orphanRemovalErrors := []error{} - orphanVolumeErrors := []error{} - - for _, uid := range found { - if allPods.Has(string(uid)) { - continue - } - // If volumes have not been unmounted/detached, do not delete directory. - // Doing so may result in corruption of data. - if podVolumesExist := kl.podVolumesExist(uid); podVolumesExist { - glog.V(3).Infof("Orphaned pod %q found, but volumes are not cleaned up", uid) - continue - } - // If there are still volume directories, do not delete directory - volumePaths, err := kl.getPodVolumePathListFromDisk(uid) - if err != nil { - orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("Orphaned pod %q found, but error %v occurred during reading volume dir from disk", uid, err)) - continue - } - if len(volumePaths) > 0 { - orphanVolumeErrors = append(orphanVolumeErrors, fmt.Errorf("Orphaned pod %q found, but volume paths are still present on disk", uid)) - continue - } - glog.V(3).Infof("Orphaned pod %q found, removing", uid) - if err := removeall.RemoveAllOneFilesystem(kl.mounter, kl.getPodDir(uid)); err != nil { - glog.Errorf("Failed to remove orphaned pod %q dir; err: %v", uid, err) - orphanRemovalErrors = append(orphanRemovalErrors, err) - } - } - - logSpew := func(errs []error) { - if len(errs) > 0 { - glog.Errorf("%v : There were a total of %v errors similar to this. Turn up verbosity to see them.", errs[0], len(errs)) - for _, err := range errs { - glog.V(5).Infof("Orphan pod: %v", err) - } - } - } - logSpew(orphanVolumeErrors) - logSpew(orphanRemovalErrors) - return utilerrors.NewAggregate(orphanRemovalErrors) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD deleted file mode 100644 index c409bd2a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "configsync.go", - "controller.go", - "watch.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig", - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/validation:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint/store:go_default_library", - "//pkg/kubelet/kubeletconfig/status:go_default_library", - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//pkg/kubelet/kubeletconfig/util/panic:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/kubeletconfig/checkpoint:all-srcs", - "//pkg/kubelet/kubeletconfig/configfiles:all-srcs", - "//pkg/kubelet/kubeletconfig/status:all-srcs", - "//pkg/kubelet/kubeletconfig/util/codec:all-srcs", - "//pkg/kubelet/kubeletconfig/util/equal:all-srcs", - "//pkg/kubelet/kubeletconfig/util/files:all-srcs", - "//pkg/kubelet/kubeletconfig/util/log:all-srcs", - "//pkg/kubelet/kubeletconfig/util/panic:all-srcs", - "//pkg/kubelet/kubeletconfig/util/test:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/OWNERS deleted file mode 100644 index 99d321aa..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/OWNERS +++ /dev/null @@ -1,5 +0,0 @@ -approvers: -- mtaufen -- dchen1107 -reviewers: -- sig-node-reviewers diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD deleted file mode 100644 index a0b74462..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/BUILD +++ /dev/null @@ -1,67 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "configmap_test.go", - "download_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "configmap.go", - "download.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint", - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/v1beta1:go_default_library", - "//pkg/kubelet/kubeletconfig/status:go_default_library", - "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/kubeletconfig/checkpoint/store:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/configmap.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/configmap.go deleted file mode 100644 index b79e67e7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/configmap.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 checkpoint - -import ( - "fmt" - - apiv1 "k8s.io/api/core/v1" -) - -const configMapConfigKey = "kubelet" - -// configMapPayload implements Payload, backed by a v1/ConfigMap config source object -type configMapPayload struct { - cm *apiv1.ConfigMap -} - -var _ Payload = (*configMapPayload)(nil) - -// NewConfigMapPayload constructs a Payload backed by a ConfigMap, which must have a non-empty UID -func NewConfigMapPayload(cm *apiv1.ConfigMap) (Payload, error) { - if cm == nil { - return nil, fmt.Errorf("ConfigMap must be non-nil") - } else if cm.ObjectMeta.UID == "" { - return nil, fmt.Errorf("ConfigMap must have a non-empty UID") - } else if cm.ObjectMeta.ResourceVersion == "" { - return nil, fmt.Errorf("ConfigMap must have a non-empty ResourceVersion") - } - - return &configMapPayload{cm}, nil -} - -func (p *configMapPayload) UID() string { - return string(p.cm.UID) -} - -func (p *configMapPayload) ResourceVersion() string { - return p.cm.ResourceVersion -} - -func (p *configMapPayload) Files() map[string]string { - return p.cm.Data -} - -func (p *configMapPayload) object() interface{} { - return p.cm -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go deleted file mode 100644 index eb705980..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/download.go +++ /dev/null @@ -1,273 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 checkpoint - -import ( - "fmt" - "math/rand" - "time" - - apiv1 "k8s.io/api/core/v1" - apiequality "k8s.io/apimachinery/pkg/api/equality" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - "k8s.io/apimachinery/pkg/runtime" - kuberuntime "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/watch" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/cache" - kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" - kubeletconfigv1beta1 "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" - utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" -) - -// Payload represents a local copy of a config source (payload) object -type Payload interface { - // UID returns a globally unique (space and time) identifier for the payload. - // The return value is guaranteed non-empty. - UID() string - - // ResourceVersion returns a resource version for the payload. - // The return value is guaranteed non-empty. - ResourceVersion() string - - // Files returns a map of filenames to file contents. - Files() map[string]string - - // object returns the underlying checkpointed object. - object() interface{} -} - -// RemoteConfigSource represents a remote config source object that can be downloaded as a Checkpoint -type RemoteConfigSource interface { - // KubeletFilename returns the name of the Kubelet config file as it should appear in the keys of Payload.Files() - KubeletFilename() string - - // APIPath returns the API path to the remote resource, e.g. its SelfLink - APIPath() string - - // UID returns the globally unique identifier for the most recently downloaded payload targeted by the source. - UID() string - - // ResourceVersion returns the resource version of the most recently downloaded payload targeted by the source. - ResourceVersion() string - - // Download downloads the remote config source's target object and returns a Payload backed by the object, - // or a sanitized failure reason and error if the download fails. - // Download takes an optional store as an argument. If provided, Download will check this store for the - // target object prior to contacting the API server. - // Download updates the local UID and ResourceVersion tracked by this source, based on the downloaded payload. - Download(client clientset.Interface, store cache.Store) (Payload, string, error) - - // Informer returns an informer that can be used to detect changes to the remote config source - Informer(client clientset.Interface, handler cache.ResourceEventHandlerFuncs) cache.SharedInformer - - // Encode returns a []byte representation of the object behind the RemoteConfigSource - Encode() ([]byte, error) - - // NodeConfigSource returns a copy of the underlying apiv1.NodeConfigSource object. - // All RemoteConfigSources are expected to be backed by a NodeConfigSource, - // though the convenience methods on the interface will target the source - // type that was detected in a call to NewRemoteConfigSource. - NodeConfigSource() *apiv1.NodeConfigSource -} - -// NewRemoteConfigSource constructs a RemoteConfigSource from a v1/NodeConfigSource object -// You should only call this with a non-nil config source. -// Note that the API server validates Node.Spec.ConfigSource. -func NewRemoteConfigSource(source *apiv1.NodeConfigSource) (RemoteConfigSource, string, error) { - // NOTE: Even though the API server validates the config, we check whether all *known* fields are - // nil here, so that if a new API server allows a new config source type, old clients can send - // an error message rather than crashing due to a nil pointer dereference. - - // Exactly one reference subfield of the config source must be non-nil. - // Currently ConfigMap is the only reference subfield. - if source.ConfigMap == nil { - return nil, status.AllNilSubfieldsError, fmt.Errorf("%s, NodeConfigSource was: %#v", status.AllNilSubfieldsError, source) - } - return &remoteConfigMap{source}, "", nil -} - -// DecodeRemoteConfigSource is a helper for using the apimachinery to decode serialized RemoteConfigSources; -// e.g. the metadata stored by checkpoint/store/fsstore.go -func DecodeRemoteConfigSource(data []byte) (RemoteConfigSource, error) { - // decode the remote config source - _, codecs, err := scheme.NewSchemeAndCodecs() - if err != nil { - return nil, err - } - - obj, err := runtime.Decode(codecs.UniversalDecoder(), data) - if err != nil { - return nil, fmt.Errorf("failed to decode, error: %v", err) - } - - // for now we assume we are trying to load an kubeletconfigv1beta1.SerializedNodeConfigSource, - // this may need to be extended if e.g. a new version of the api is born - cs, ok := obj.(*kubeletconfiginternal.SerializedNodeConfigSource) - if !ok { - return nil, fmt.Errorf("failed to cast decoded remote config source to *k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig.SerializedNodeConfigSource") - } - - // we use the v1.NodeConfigSource type on internal and external, so no need to convert to external here - source, _, err := NewRemoteConfigSource(&cs.Source) - if err != nil { - return nil, err - } - - return source, nil -} - -// EqualRemoteConfigSources is a helper for comparing remote config sources by -// comparing the underlying API objects for semantic equality. -func EqualRemoteConfigSources(a, b RemoteConfigSource) bool { - if a != nil && b != nil { - return apiequality.Semantic.DeepEqual(a.NodeConfigSource(), b.NodeConfigSource()) - } - return a == b -} - -// remoteConfigMap implements RemoteConfigSource for v1/ConfigMap config sources -type remoteConfigMap struct { - source *apiv1.NodeConfigSource -} - -var _ RemoteConfigSource = (*remoteConfigMap)(nil) - -func (r *remoteConfigMap) KubeletFilename() string { - return r.source.ConfigMap.KubeletConfigKey -} - -const configMapAPIPathFmt = "/api/v1/namespaces/%s/configmaps/%s" - -func (r *remoteConfigMap) APIPath() string { - ref := r.source.ConfigMap - return fmt.Sprintf(configMapAPIPathFmt, ref.Namespace, ref.Name) -} - -func (r *remoteConfigMap) UID() string { - return string(r.source.ConfigMap.UID) -} - -func (r *remoteConfigMap) ResourceVersion() string { - return r.source.ConfigMap.ResourceVersion -} - -func (r *remoteConfigMap) Download(client clientset.Interface, store cache.Store) (Payload, string, error) { - var ( - cm *apiv1.ConfigMap - err error - ) - // check the in-memory store for the ConfigMap, so we can skip unnecessary downloads - if store != nil { - utillog.Infof("checking in-memory store for %s", r.APIPath()) - cm, err = getConfigMapFromStore(store, r.source.ConfigMap.Namespace, r.source.ConfigMap.Name) - if err != nil { - // just log the error, we'll attempt a direct download instead - utillog.Errorf("failed to check in-memory store for %s, error: %v", r.APIPath(), err) - } else if cm != nil { - utillog.Infof("found %s in in-memory store, UID: %s, ResourceVersion: %s", r.APIPath(), cm.UID, cm.ResourceVersion) - } else { - utillog.Infof("did not find %s in in-memory store", r.APIPath()) - } - } - // if we didn't find the ConfigMap in the in-memory store, download it from the API server - if cm == nil { - utillog.Infof("attempting to download %s", r.APIPath()) - cm, err = client.CoreV1().ConfigMaps(r.source.ConfigMap.Namespace).Get(r.source.ConfigMap.Name, metav1.GetOptions{}) - if err != nil { - return nil, status.DownloadError, fmt.Errorf("%s, error: %v", status.DownloadError, err) - } - utillog.Infof("successfully downloaded %s, UID: %s, ResourceVersion: %s", r.APIPath(), cm.UID, cm.ResourceVersion) - } // Assert: Now we have a non-nil ConfigMap - // construct Payload from the ConfigMap - payload, err := NewConfigMapPayload(cm) - if err != nil { - // We only expect an error here if ObjectMeta is lacking UID or ResourceVersion. This should - // never happen on objects in the informer's store, or objects downloaded from the API server - // directly, so we report InternalError. - return nil, status.InternalError, fmt.Errorf("%s, error: %v", status.InternalError, err) - } - // update internal UID and ResourceVersion based on latest ConfigMap - r.source.ConfigMap.UID = cm.UID - r.source.ConfigMap.ResourceVersion = cm.ResourceVersion - return payload, "", nil -} - -func (r *remoteConfigMap) Informer(client clientset.Interface, handler cache.ResourceEventHandlerFuncs) cache.SharedInformer { - // select ConfigMap by name - fieldselector := fields.OneTermEqualSelector("metadata.name", r.source.ConfigMap.Name) - - // add some randomness to resync period, which can help avoid controllers falling into lock-step - minResyncPeriod := 15 * time.Minute - factor := rand.Float64() + 1 - resyncPeriod := time.Duration(float64(minResyncPeriod.Nanoseconds()) * factor) - - lw := &cache.ListWatch{ - ListFunc: func(options metav1.ListOptions) (kuberuntime.Object, error) { - return client.CoreV1().ConfigMaps(r.source.ConfigMap.Namespace).List(metav1.ListOptions{ - FieldSelector: fieldselector.String(), - }) - }, - WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { - return client.CoreV1().ConfigMaps(r.source.ConfigMap.Namespace).Watch(metav1.ListOptions{ - FieldSelector: fieldselector.String(), - ResourceVersion: options.ResourceVersion, - }) - }, - } - - informer := cache.NewSharedInformer(lw, &apiv1.ConfigMap{}, resyncPeriod) - informer.AddEventHandler(handler) - - return informer -} - -func (r *remoteConfigMap) Encode() ([]byte, error) { - encoder, err := utilcodec.NewKubeletconfigYAMLEncoder(kubeletconfigv1beta1.SchemeGroupVersion) - if err != nil { - return nil, err - } - - data, err := runtime.Encode(encoder, &kubeletconfigv1beta1.SerializedNodeConfigSource{Source: *r.source}) - if err != nil { - return nil, err - } - return data, nil -} - -func (r *remoteConfigMap) NodeConfigSource() *apiv1.NodeConfigSource { - return r.source.DeepCopy() -} - -func getConfigMapFromStore(store cache.Store, namespace, name string) (*apiv1.ConfigMap, error) { - key := fmt.Sprintf("%s/%s", namespace, name) - obj, ok, err := store.GetByKey(key) - if err != nil || !ok { - return nil, err - } - cm, ok := obj.(*apiv1.ConfigMap) - if !ok { - err := fmt.Errorf("failed to cast object %s from informer's store to ConfigMap", key) - utillog.Errorf(err.Error()) - return nil, err - } - return cm, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD deleted file mode 100644 index 76f46e82..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "fsstore_test.go", - "store_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/v1beta1:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", - "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", - "//pkg/kubelet/kubeletconfig/util/files:go_default_library", - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "fakestore.go", - "fsstore.go", - "store.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store", - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/kubeletconfig/checkpoint:go_default_library", - "//pkg/kubelet/kubeletconfig/configfiles:go_default_library", - "//pkg/kubelet/kubeletconfig/util/files:go_default_library", - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//pkg/util/filesystem:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fakestore.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fakestore.go deleted file mode 100644 index cd72c827..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fakestore.go +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 store - -import ( - "fmt" - "time" - - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" -) - -// so far only implements Assigned(), LastKnownGood(), SetAssigned(), and SetLastKnownGood() -type fakeStore struct { - assigned checkpoint.RemoteConfigSource - lastKnownGood checkpoint.RemoteConfigSource -} - -var _ Store = (*fakeStore)(nil) - -func (s *fakeStore) Initialize() error { - return fmt.Errorf("Initialize method not supported") -} - -func (s *fakeStore) Exists(source checkpoint.RemoteConfigSource) (bool, error) { - return false, fmt.Errorf("Exists method not supported") -} - -func (s *fakeStore) Save(c checkpoint.Payload) error { - return fmt.Errorf("Save method not supported") -} - -func (s *fakeStore) Load(source checkpoint.RemoteConfigSource) (*kubeletconfig.KubeletConfiguration, error) { - return nil, fmt.Errorf("Load method not supported") -} - -func (s *fakeStore) AssignedModified() (time.Time, error) { - return time.Time{}, fmt.Errorf("AssignedModified method not supported") -} - -func (s *fakeStore) Assigned() (checkpoint.RemoteConfigSource, error) { - return s.assigned, nil -} - -func (s *fakeStore) LastKnownGood() (checkpoint.RemoteConfigSource, error) { - return s.lastKnownGood, nil -} - -func (s *fakeStore) SetAssigned(source checkpoint.RemoteConfigSource) error { - s.assigned = source - return nil -} - -func (s *fakeStore) SetLastKnownGood(source checkpoint.RemoteConfigSource) error { - s.lastKnownGood = source - return nil -} - -func (s *fakeStore) Reset() (bool, error) { - return false, fmt.Errorf("Reset method not supported") -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go deleted file mode 100644 index 94cd42fe..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/fsstore.go +++ /dev/null @@ -1,194 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 store - -import ( - "fmt" - "path/filepath" - "time" - - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles" - utilfiles "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" - utilfs "k8s.io/kubernetes/pkg/util/filesystem" -) - -const ( - metaDir = "meta" - assignedFile = "assigned" - lastKnownGoodFile = "last-known-good" - - checkpointsDir = "checkpoints" -) - -// fsStore is for tracking checkpoints in the local filesystem, implements Store -type fsStore struct { - // fs is the filesystem to use for storage operations; can be mocked for testing - fs utilfs.Filesystem - // dir is the absolute path to the storage directory for fsStore - dir string -} - -var _ Store = (*fsStore)(nil) - -// NewFsStore returns a Store that saves its data in dir -func NewFsStore(fs utilfs.Filesystem, dir string) Store { - return &fsStore{ - fs: fs, - dir: dir, - } -} - -func (s *fsStore) Initialize() error { - utillog.Infof("initializing config checkpoints directory %q", s.dir) - // ensure top-level dir for store - if err := utilfiles.EnsureDir(s.fs, s.dir); err != nil { - return err - } - // ensure metadata directory and reference files (tracks assigned and lkg configs) - if err := utilfiles.EnsureDir(s.fs, filepath.Join(s.dir, metaDir)); err != nil { - return err - } - if err := utilfiles.EnsureFile(s.fs, s.metaPath(assignedFile)); err != nil { - return err - } - if err := utilfiles.EnsureFile(s.fs, s.metaPath(lastKnownGoodFile)); err != nil { - return err - } - // ensure checkpoints directory (saves unpacked payloads in subdirectories named after payload UID) - return utilfiles.EnsureDir(s.fs, filepath.Join(s.dir, checkpointsDir)) -} - -func (s *fsStore) Exists(source checkpoint.RemoteConfigSource) (bool, error) { - const errfmt = "failed to determine whether checkpoint exists for source %s, UID: %s, ResourceVersion: %s exists, error: %v" - if len(source.UID()) == 0 { - return false, fmt.Errorf(errfmt, source.APIPath(), source.UID(), source.ResourceVersion(), "empty UID is ambiguous") - } - if len(source.ResourceVersion()) == 0 { - return false, fmt.Errorf(errfmt, source.APIPath(), source.UID(), source.ResourceVersion(), "empty ResourceVersion is ambiguous") - } - - // we check whether the directory was created for the resource - ok, err := utilfiles.DirExists(s.fs, s.checkpointPath(source.UID(), source.ResourceVersion())) - if err != nil { - return false, fmt.Errorf(errfmt, source.APIPath(), source.UID(), source.ResourceVersion(), err) - } - return ok, nil -} - -func (s *fsStore) Save(payload checkpoint.Payload) error { - // Note: Payload interface guarantees UID() and ResourceVersion() to be non-empty - path := s.checkpointPath(payload.UID(), payload.ResourceVersion()) - // ensure the parent dir (checkpoints/uid) exists, since ReplaceDir requires the parent of the replacee - // to exist, and we checkpoint as checkpoints/uid/resourceVersion/files-from-configmap - if err := utilfiles.EnsureDir(s.fs, filepath.Dir(path)); err != nil { - return err - } - // save the checkpoint's files in the appropriate checkpoint dir - return utilfiles.ReplaceDir(s.fs, path, payload.Files()) -} - -func (s *fsStore) Load(source checkpoint.RemoteConfigSource) (*kubeletconfig.KubeletConfiguration, error) { - sourceFmt := fmt.Sprintf("%s, UID: %s, ResourceVersion: %s", source.APIPath(), source.UID(), source.ResourceVersion()) - // check if a checkpoint exists for the source - if ok, err := s.Exists(source); err != nil { - return nil, err - } else if !ok { - return nil, fmt.Errorf("no checkpoint for source %s", sourceFmt) - } - // load the kubelet config file - utillog.Infof("loading Kubelet configuration checkpoint for source %s", sourceFmt) - loader, err := configfiles.NewFsLoader(s.fs, filepath.Join(s.checkpointPath(source.UID(), source.ResourceVersion()), source.KubeletFilename())) - if err != nil { - return nil, err - } - kc, err := loader.Load() - if err != nil { - return nil, err - } - return kc, nil -} - -func (s *fsStore) AssignedModified() (time.Time, error) { - path := s.metaPath(assignedFile) - info, err := s.fs.Stat(path) - if err != nil { - return time.Time{}, fmt.Errorf("failed to stat %q while checking modification time, error: %v", path, err) - } - return info.ModTime(), nil -} - -func (s *fsStore) Assigned() (checkpoint.RemoteConfigSource, error) { - return readRemoteConfigSource(s.fs, s.metaPath(assignedFile)) -} - -func (s *fsStore) LastKnownGood() (checkpoint.RemoteConfigSource, error) { - return readRemoteConfigSource(s.fs, s.metaPath(lastKnownGoodFile)) -} - -func (s *fsStore) SetAssigned(source checkpoint.RemoteConfigSource) error { - return writeRemoteConfigSource(s.fs, s.metaPath(assignedFile), source) -} - -func (s *fsStore) SetLastKnownGood(source checkpoint.RemoteConfigSource) error { - return writeRemoteConfigSource(s.fs, s.metaPath(lastKnownGoodFile), source) -} - -func (s *fsStore) Reset() (bool, error) { - return reset(s) -} - -func (s *fsStore) checkpointPath(uid, resourceVersion string) string { - return filepath.Join(s.dir, checkpointsDir, uid, resourceVersion) -} - -func (s *fsStore) metaPath(name string) string { - return filepath.Join(s.dir, metaDir, name) -} - -func readRemoteConfigSource(fs utilfs.Filesystem, path string) (checkpoint.RemoteConfigSource, error) { - data, err := fs.ReadFile(path) - if err != nil { - return nil, err - } else if len(data) == 0 { - return nil, nil - } - return checkpoint.DecodeRemoteConfigSource(data) -} - -func writeRemoteConfigSource(fs utilfs.Filesystem, path string, source checkpoint.RemoteConfigSource) error { - // if nil, reset the file - if source == nil { - return utilfiles.ReplaceFile(fs, path, []byte{}) - } - // check that UID and ResourceVersion are non-empty, - // error to save reference if the checkpoint can't be fully resolved - if source.UID() == "" { - return fmt.Errorf("failed to write RemoteConfigSource, empty UID is ambiguous") - } - if source.ResourceVersion() == "" { - return fmt.Errorf("failed to write RemoteConfigSource, empty ResourceVersion is ambiguous") - } - // encode the source and save it to the file - data, err := source.Encode() - if err != nil { - return err - } - return utilfiles.ReplaceFile(fs, path, data) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/store.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/store.go deleted file mode 100644 index 0ceb34a6..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store/store.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 store - -import ( - "fmt" - "time" - - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" -) - -// Store saves checkpoints and information about which is the assigned and last-known-good checkpoint to a storage layer -type Store interface { - // Initialize sets up the storage layer - Initialize() error - - // Exists returns true if the object referenced by `source` has been checkpointed. - // The source must be unambiguous - e.g. if referencing an API object it must specify both uid and resourceVersion. - Exists(source checkpoint.RemoteConfigSource) (bool, error) - // Save Kubelet config payloads to the storage layer. It must be possible to unmarshal the payload to a KubeletConfiguration. - // The following payload types are supported: - // - k8s.io/api/core/v1.ConfigMap - Save(c checkpoint.Payload) error - // Load loads the KubeletConfiguration from the checkpoint referenced by `source`. - Load(source checkpoint.RemoteConfigSource) (*kubeletconfig.KubeletConfiguration, error) - - // AssignedModified returns the last time that the assigned checkpoint was set - AssignedModified() (time.Time, error) - // Assigned returns the source that points to the checkpoint currently assigned to the Kubelet, or nil if no assigned checkpoint is set - Assigned() (checkpoint.RemoteConfigSource, error) - // LastKnownGood returns the source that points to the last-known-good checkpoint, or nil if no last-known-good checkpoint is set - LastKnownGood() (checkpoint.RemoteConfigSource, error) - - // SetAssigned saves the source that points to the assigned checkpoint, set to nil to unset - SetAssigned(source checkpoint.RemoteConfigSource) error - // SetLastKnownGood saves the source that points to the last-known-good checkpoint, set to nil to unset - SetLastKnownGood(source checkpoint.RemoteConfigSource) error - // Reset unsets the assigned and last-known-good checkpoints and returns whether the assigned checkpoint was unset as a result of the reset - Reset() (bool, error) -} - -// reset is a helper for implementing Reset, which can be implemented in terms of Store methods -func reset(s Store) (bool, error) { - assigned, err := s.Assigned() - if err != nil { - return false, err - } - if err := s.SetLastKnownGood(nil); err != nil { - return false, fmt.Errorf("failed to reset last-known-good UID in checkpoint store, error: %v", err) - } - if err := s.SetAssigned(nil); err != nil { - return false, fmt.Errorf("failed to reset assigned UID in checkpoint store, error: %v", err) - } - return assigned != nil, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD deleted file mode 100644 index 55bee6fe..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["configfiles.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles", - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", - "//pkg/kubelet/kubeletconfig/util/codec:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["configfiles_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/v1beta1:go_default_library", - "//pkg/kubelet/kubeletconfig/util/files:go_default_library", - "//pkg/kubelet/kubeletconfig/util/test:go_default_library", - "//pkg/util/filesystem:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/configfiles.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/configfiles.go deleted file mode 100644 index c3b5fc9b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles/configfiles.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 configfiles - -import ( - "fmt" - "path/filepath" - - "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" - utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec" - utilfs "k8s.io/kubernetes/pkg/util/filesystem" -) - -// Loader loads configuration from a storage layer -type Loader interface { - // Load loads and returns the KubeletConfiguration from the storage layer, or an error if a configuration could not be loaded - Load() (*kubeletconfig.KubeletConfiguration, error) -} - -// fsLoader loads configuration from `configDir` -type fsLoader struct { - // fs is the filesystem where the config files exist; can be mocked for testing - fs utilfs.Filesystem - // kubeletCodecs is the scheme used to decode config files - kubeletCodecs *serializer.CodecFactory - // kubeletFile is an absolute path to the file containing a serialized KubeletConfiguration - kubeletFile string -} - -// NewFsLoader returns a Loader that loads a KubeletConfiguration from the `kubeletFile` -func NewFsLoader(fs utilfs.Filesystem, kubeletFile string) (Loader, error) { - _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs() - if err != nil { - return nil, err - } - - return &fsLoader{ - fs: fs, - kubeletCodecs: kubeletCodecs, - kubeletFile: kubeletFile, - }, nil -} - -func (loader *fsLoader) Load() (*kubeletconfig.KubeletConfiguration, error) { - data, err := loader.fs.ReadFile(loader.kubeletFile) - if err != nil { - return nil, fmt.Errorf("failed to read kubelet config file %q, error: %v", loader.kubeletFile, err) - } - - // no configuration is an error, some parameters are required - if len(data) == 0 { - return nil, fmt.Errorf("kubelet config file %q was empty", loader.kubeletFile) - } - - kc, err := utilcodec.DecodeKubeletConfiguration(loader.kubeletCodecs, data) - if err != nil { - return nil, err - } - - // make all paths absolute - resolveRelativePaths(kubeletconfig.KubeletConfigurationPathRefs(kc), filepath.Dir(loader.kubeletFile)) - return kc, nil -} - -// resolveRelativePaths makes relative paths absolute by resolving them against `root` -func resolveRelativePaths(paths []*string, root string) { - for _, path := range paths { - // leave empty paths alone, "no path" is a valid input - // do not attempt to resolve paths that are already absolute - if len(*path) > 0 && !filepath.IsAbs(*path) { - *path = filepath.Join(root, *path) - } - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go deleted file mode 100644 index cb92fb7e..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configsync.go +++ /dev/null @@ -1,265 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 kubeletconfig - -import ( - "fmt" - "os" - "time" - - "github.com/golang/glog" - - apiv1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - clientset "k8s.io/client-go/kubernetes" - v1core "k8s.io/client-go/kubernetes/typed/core/v1" - "k8s.io/client-go/tools/cache" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" -) - -const ( - // KubeletConfigChangedEventReason identifies an event as a change of Kubelet configuration - KubeletConfigChangedEventReason = "KubeletConfigChanged" - // LocalEventMessage is sent when the Kubelet restarts to use local config - LocalEventMessage = "Kubelet restarting to use local config" - // RemoteEventMessageFmt is sent when the Kubelet restarts to use a remote config - RemoteEventMessageFmt = "Kubelet restarting to use %s, UID: %s, ResourceVersion: %s, KubeletConfigKey: %s" -) - -// pokeConfiSourceWorker tells the worker thread that syncs config sources that work needs to be done -func (cc *Controller) pokeConfigSourceWorker() { - select { - case cc.pendingConfigSource <- true: - default: - } -} - -// syncConfigSource checks if work needs to be done to use a new configuration, and does that work if necessary -func (cc *Controller) syncConfigSource(client clientset.Interface, eventClient v1core.EventsGetter, nodeName string) { - select { - case <-cc.pendingConfigSource: - default: - // no work to be done, return - return - } - - // if the sync fails, we want to retry - var syncerr error - defer func() { - if syncerr != nil { - utillog.Errorf(syncerr.Error()) - cc.pokeConfigSourceWorker() - } - }() - - // get the latest Node.Spec.ConfigSource from the informer - source, err := latestNodeConfigSource(cc.nodeInformer.GetStore(), nodeName) - if err != nil { - cc.configStatus.SetErrorOverride(fmt.Sprintf(status.SyncErrorFmt, status.InternalError)) - syncerr = fmt.Errorf("%s, error: %v", status.InternalError, err) - return - } - - // a nil source simply means we reset to local defaults - if source == nil { - utillog.Infof("Node.Spec.ConfigSource is empty, will reset assigned and last-known-good to defaults") - if updated, reason, err := cc.resetConfig(); err != nil { - reason = fmt.Sprintf(status.SyncErrorFmt, reason) - cc.configStatus.SetErrorOverride(reason) - syncerr = fmt.Errorf("%s, error: %v", reason, err) - return - } else if updated { - restartForNewConfig(eventClient, nodeName, nil) - } - return - } - - // a non-nil source means we should attempt to download the config, and checkpoint it if necessary - utillog.Infof("Node.Spec.ConfigSource is non-empty, will checkpoint source and update config if necessary") - - // TODO(mtaufen): It would be nice if we could check the payload's metadata before (re)downloading the whole payload - // we at least try pulling the latest configmap out of the local informer store. - - // construct the interface that can dynamically dispatch the correct Download, etc. methods for the given source type - remote, reason, err := checkpoint.NewRemoteConfigSource(source) - if err != nil { - reason = fmt.Sprintf(status.SyncErrorFmt, reason) - cc.configStatus.SetErrorOverride(reason) - syncerr = fmt.Errorf("%s, error: %v", reason, err) - return - } - - // "download" source, either from informer's in-memory store or directly from the API server, if the informer doesn't have a copy - payload, reason, err := cc.downloadConfigPayload(client, remote) - if err != nil { - reason = fmt.Sprintf(status.SyncErrorFmt, reason) - cc.configStatus.SetErrorOverride(reason) - syncerr = fmt.Errorf("%s, error: %v", reason, err) - return - } - - // save a checkpoint for the payload, if one does not already exist - if reason, err := cc.saveConfigCheckpoint(remote, payload); err != nil { - reason = fmt.Sprintf(status.SyncErrorFmt, reason) - cc.configStatus.SetErrorOverride(reason) - syncerr = fmt.Errorf("%s, error: %v", reason, err) - return - } - - // update the local, persistent record of assigned config - if updated, reason, err := cc.setAssignedConfig(remote); err != nil { - reason = fmt.Sprintf(status.SyncErrorFmt, reason) - cc.configStatus.SetErrorOverride(reason) - syncerr = fmt.Errorf("%s, error: %v", reason, err) - return - } else if updated { - restartForNewConfig(eventClient, nodeName, remote) - } - - // If we get here: - // - there is no need to restart to use new config - // - there was no error trying to sync configuration - // - if, previously, there was an error trying to sync configuration, we need to clear that error from the status - cc.configStatus.SetErrorOverride("") -} - -// Note: source has up-to-date uid and resourceVersion after calling downloadConfigPayload. -func (cc *Controller) downloadConfigPayload(client clientset.Interface, source checkpoint.RemoteConfigSource) (checkpoint.Payload, string, error) { - var store cache.Store - if cc.remoteConfigSourceInformer != nil { - store = cc.remoteConfigSourceInformer.GetStore() - } - return source.Download(client, store) -} - -func (cc *Controller) saveConfigCheckpoint(source checkpoint.RemoteConfigSource, payload checkpoint.Payload) (string, error) { - ok, err := cc.checkpointStore.Exists(source) - if err != nil { - return status.InternalError, fmt.Errorf("%s, error: %v", status.InternalError, err) - } - if ok { - utillog.Infof("checkpoint already exists for %s, UID: %s, ResourceVersion: %s", source.APIPath(), payload.UID(), payload.ResourceVersion()) - return "", nil - } - if err := cc.checkpointStore.Save(payload); err != nil { - return status.InternalError, fmt.Errorf("%s, error: %v", status.InternalError, err) - } - return "", nil -} - -// setAssignedConfig updates the assigned checkpoint config in the store. -// Returns whether the assigned config changed as a result, or a sanitized failure reason and an error. -func (cc *Controller) setAssignedConfig(source checkpoint.RemoteConfigSource) (bool, string, error) { - assigned, err := cc.checkpointStore.Assigned() - if err != nil { - return false, status.InternalError, err - } - if err := cc.checkpointStore.SetAssigned(source); err != nil { - return false, status.InternalError, err - } - return !checkpoint.EqualRemoteConfigSources(assigned, source), "", nil -} - -// resetConfig resets the assigned and last-known-good checkpoints in the checkpoint store to their default values and -// returns whether the assigned checkpoint changed as a result, or a sanitized failure reason and an error. -func (cc *Controller) resetConfig() (bool, string, error) { - updated, err := cc.checkpointStore.Reset() - if err != nil { - return false, status.InternalError, err - } - return updated, "", nil -} - -// restartForNewConfig presumes the Kubelet is managed by a babysitter, e.g. systemd -// It will send an event before exiting. -func restartForNewConfig(eventClient v1core.EventsGetter, nodeName string, source checkpoint.RemoteConfigSource) { - message := LocalEventMessage - if source != nil { - message = fmt.Sprintf(RemoteEventMessageFmt, source.APIPath(), source.UID(), source.ResourceVersion(), source.KubeletFilename()) - } - // we directly log and send the event, instead of using the event recorder, - // because the event recorder won't flush its queue before we exit (we'd lose the event) - event := makeEvent(nodeName, apiv1.EventTypeNormal, KubeletConfigChangedEventReason, message) - glog.V(3).Infof("Event(%#v): type: '%v' reason: '%v' %v", event.InvolvedObject, event.Type, event.Reason, event.Message) - if _, err := eventClient.Events(apiv1.NamespaceDefault).Create(event); err != nil { - utillog.Errorf("failed to send event, error: %v", err) - } - utillog.Infof(message) - os.Exit(0) -} - -// latestNodeConfigSource returns a copy of the most recent NodeConfigSource from the Node with `nodeName` in `store` -func latestNodeConfigSource(store cache.Store, nodeName string) (*apiv1.NodeConfigSource, error) { - obj, ok, err := store.GetByKey(nodeName) - if err != nil { - err := fmt.Errorf("failed to retrieve Node %q from informer's store, error: %v", nodeName, err) - utillog.Errorf(err.Error()) - return nil, err - } else if !ok { - err := fmt.Errorf("Node %q does not exist in the informer's store, can't sync config source", nodeName) - utillog.Errorf(err.Error()) - return nil, err - } - node, ok := obj.(*apiv1.Node) - if !ok { - err := fmt.Errorf("failed to cast object from informer's store to Node, can't sync config source for Node %q", nodeName) - utillog.Errorf(err.Error()) - return nil, err - } - // Copy the source, so anyone who modifies it after here doesn't mess up the informer's store! - // This was previously the cause of a bug that made the Kubelet frequently resync config; Download updated - // the UID and ResourceVersion on the NodeConfigSource, but the pointer was still drilling all the way - // into the informer's copy! - return node.Spec.ConfigSource.DeepCopy(), nil -} - -// makeEvent constructs an event -// similar to makeEvent in k8s.io/client-go/tools/record/event.go -func makeEvent(nodeName, eventtype, reason, message string) *apiv1.Event { - const componentKubelet = "kubelet" - // NOTE(mtaufen): This is consistent with pkg/kubelet/kubelet.go. Even though setting the node - // name as the UID looks strange, it appears to be conventional for events sent by the Kubelet. - ref := apiv1.ObjectReference{ - Kind: "Node", - Name: nodeName, - UID: types.UID(nodeName), - Namespace: "", - } - - t := metav1.Time{Time: time.Now()} - namespace := ref.Namespace - if namespace == "" { - namespace = metav1.NamespaceDefault - } - return &apiv1.Event{ - ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%v.%x", ref.Name, t.UnixNano()), - Namespace: namespace, - }, - InvolvedObject: ref, - Reason: reason, - Message: message, - FirstTimestamp: t, - LastTimestamp: t, - Count: 1, - Type: eventtype, - Source: apiv1.EventSource{Component: componentKubelet, Host: string(nodeName)}, - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go deleted file mode 100644 index afe707b6..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/controller.go +++ /dev/null @@ -1,324 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 kubeletconfig - -import ( - "fmt" - "path/filepath" - "time" - - apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/util/wait" - clientset "k8s.io/client-go/kubernetes" - v1core "k8s.io/client-go/kubernetes/typed/core/v1" - "k8s.io/client-go/tools/cache" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation" - - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/checkpoint/store" - "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" - utilpanic "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic" - utilfs "k8s.io/kubernetes/pkg/util/filesystem" -) - -const ( - storeDir = "store" - // TODO(mtaufen): We may expose this in a future API, but for the time being we use an internal default, - // because it is not especially clear where this should live in the API. - configTrialDuration = 10 * time.Minute -) - -// TransformFunc edits the KubeletConfiguration in-place, and returns an -// error if any of the transformations failed. -type TransformFunc func(kc *kubeletconfig.KubeletConfiguration) error - -// Controller manages syncing dynamic Kubelet configurations -// For more information, see the proposal: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/dynamic-kubelet-configuration.md -type Controller struct { - // transform applies an arbitrary transformation to config after loading, and before validation. - // This can be used, for example, to include config from flags before the controller's validation step. - // If transform returns an error, loadConfig will fail, and an InternalError will be reported. - // Be wary if using this function as an extension point, in most cases the controller should - // probably just be natively extended to do what you need. Injecting flag precedence transformations - // is something of an exception because the caller of this controller (cmd/) is aware of flags, but this - // controller's tree (pkg/) is not. - transform TransformFunc - - // pendingConfigSource; write to this channel to indicate that the config source needs to be synced from the API server - pendingConfigSource chan bool - - // configStatus manages the status we report on the Node object - configStatus status.NodeConfigStatus - - // nodeInformer is the informer that watches the Node object - nodeInformer cache.SharedInformer - - // remoteConfigSourceInformer is the informer that watches the assigned config source - remoteConfigSourceInformer cache.SharedInformer - - // checkpointStore persists config source checkpoints to a storage layer - checkpointStore store.Store -} - -// NewController constructs a new Controller object and returns it. The dynamicConfigDir -// path must be absolute. transform applies an arbitrary transformation to config after loading, and before validation. -// This can be used, for example, to include config from flags before the controller's validation step. -// If transform returns an error, loadConfig will fail, and an InternalError will be reported. -// Be wary if using this function as an extension point, in most cases the controller should -// probably just be natively extended to do what you need. Injecting flag precedence transformations -// is something of an exception because the caller of this controller (cmd/) is aware of flags, but this -// controller's tree (pkg/) is not. -func NewController(dynamicConfigDir string, transform TransformFunc) *Controller { - return &Controller{ - transform: transform, - // channels must have capacity at least 1, since we signal with non-blocking writes - pendingConfigSource: make(chan bool, 1), - configStatus: status.NewNodeConfigStatus(), - checkpointStore: store.NewFsStore(utilfs.DefaultFs{}, filepath.Join(dynamicConfigDir, storeDir)), - } -} - -// Bootstrap attempts to return a valid KubeletConfiguration based on the configuration of the Controller, -// or returns an error if no valid configuration could be produced. Bootstrap should be called synchronously before StartSync. -// If the pre-existing local configuration should be used, Bootstrap returns a nil config. -func (cc *Controller) Bootstrap() (*kubeletconfig.KubeletConfiguration, error) { - utillog.Infof("starting controller") - - // ensure the filesystem is initialized - if err := cc.initializeDynamicConfigDir(); err != nil { - return nil, err - } - - // determine assigned source and set status - assignedSource, err := cc.checkpointStore.Assigned() - if err != nil { - return nil, err - } - if assignedSource != nil { - cc.configStatus.SetAssigned(assignedSource.NodeConfigSource()) - } - - // determine last-known-good source and set status - lastKnownGoodSource, err := cc.checkpointStore.LastKnownGood() - if err != nil { - return nil, err - } - if lastKnownGoodSource != nil { - cc.configStatus.SetLastKnownGood(lastKnownGoodSource.NodeConfigSource()) - } - - // if the assigned source is nil, return nil to indicate local config - if assignedSource == nil { - return nil, nil - } - - // attempt to load assigned config - assignedConfig, reason, err := cc.loadConfig(assignedSource) - if err == nil { - // update the active source to the non-nil assigned source - cc.configStatus.SetActive(assignedSource.NodeConfigSource()) - - // update the last-known-good config if necessary, and start a timer that - // periodically checks whether the last-known good needs to be updated - // we only do this when the assigned config loads and passes validation - // wait.Forever will call the func once before starting the timer - go wait.Forever(func() { cc.checkTrial(configTrialDuration) }, 10*time.Second) - - return assignedConfig, nil - } // Assert: the assigned config failed to load or validate - - // TODO(mtaufen): consider re-attempting download when a load/verify/parse/validate - // error happens outside trial period, we already made it past the trial so it's probably filesystem corruption - // or something else scary - - // log the reason and error details for the failure to load the assigned config - utillog.Errorf(fmt.Sprintf("%s, error: %v", reason, err)) - - // set status to indicate the failure with the assigned config - cc.configStatus.SetError(reason) - - // if the last-known-good source is nil, return nil to indicate local config - if lastKnownGoodSource == nil { - return nil, nil - } - - // attempt to load the last-known-good config - lastKnownGoodConfig, _, err := cc.loadConfig(lastKnownGoodSource) - if err != nil { - // we failed to load the last-known-good, so something is really messed up and we just return the error - return nil, err - } - - // set status to indicate the active source is the non-nil last-known-good source - cc.configStatus.SetActive(lastKnownGoodSource.NodeConfigSource()) - return lastKnownGoodConfig, nil -} - -// StartSync tells the controller to start the goroutines that sync status/config to/from the API server. -// The clients must be non-nil, and the nodeName must be non-empty. -func (cc *Controller) StartSync(client clientset.Interface, eventClient v1core.EventsGetter, nodeName string) error { - const errFmt = "cannot start Kubelet config sync: %s" - if client == nil { - return fmt.Errorf(errFmt, "nil client") - } - if eventClient == nil { - return fmt.Errorf(errFmt, "nil event client") - } - if nodeName == "" { - return fmt.Errorf(errFmt, "empty nodeName") - } - - // Rather than use utilruntime.HandleCrash, which doesn't actually crash in the Kubelet, - // we use HandlePanic to manually call the panic handlers and then crash. - // We have a better chance of recovering normal operation if we just restart the Kubelet in the event - // of a Go runtime error. - // NOTE(mtaufen): utilpanic.HandlePanic returns a function and you have to call it for your thing to run! - // This was EVIL to debug (difficult to see missing `()`). - // The code now uses `go name()` instead of `go utilpanic.HandlePanic(func(){...})()` to avoid confusion. - - // status sync worker - statusSyncLoopFunc := utilpanic.HandlePanic(func() { - utillog.Infof("starting status sync loop") - wait.JitterUntil(func() { - cc.configStatus.Sync(client, nodeName) - }, 10*time.Second, 0.2, true, wait.NeverStop) - }) - // remote config source informer, if we have a remote source to watch - assignedSource, err := cc.checkpointStore.Assigned() - if err != nil { - return fmt.Errorf(errFmt, err) - } else if assignedSource == nil { - utillog.Infof("local source is assigned, will not start remote config source informer") - } else { - cc.remoteConfigSourceInformer = assignedSource.Informer(client, cache.ResourceEventHandlerFuncs{ - AddFunc: cc.onAddRemoteConfigSourceEvent, - UpdateFunc: cc.onUpdateRemoteConfigSourceEvent, - DeleteFunc: cc.onDeleteRemoteConfigSourceEvent, - }, - ) - } - remoteConfigSourceInformerFunc := utilpanic.HandlePanic(func() { - if cc.remoteConfigSourceInformer != nil { - utillog.Infof("starting remote config source informer") - cc.remoteConfigSourceInformer.Run(wait.NeverStop) - } - }) - // node informer - cc.nodeInformer = newSharedNodeInformer(client, nodeName, - cc.onAddNodeEvent, cc.onUpdateNodeEvent, cc.onDeleteNodeEvent) - nodeInformerFunc := utilpanic.HandlePanic(func() { - utillog.Infof("starting Node informer") - cc.nodeInformer.Run(wait.NeverStop) - }) - // config sync worker - configSyncLoopFunc := utilpanic.HandlePanic(func() { - utillog.Infof("starting Kubelet config sync loop") - wait.JitterUntil(func() { - cc.syncConfigSource(client, eventClient, nodeName) - }, 10*time.Second, 0.2, true, wait.NeverStop) - }) - - go statusSyncLoopFunc() - go remoteConfigSourceInformerFunc() - go nodeInformerFunc() - go configSyncLoopFunc() - return nil -} - -// loadConfig loads Kubelet config from a checkpoint -// It returns the loaded configuration or a clean failure reason (for status reporting) and an error. -func (cc *Controller) loadConfig(source checkpoint.RemoteConfigSource) (*kubeletconfig.KubeletConfiguration, string, error) { - // load KubeletConfiguration from checkpoint - kc, err := cc.checkpointStore.Load(source) - if err != nil { - return nil, status.LoadError, err - } - // apply any required transformations to the KubeletConfiguration - if cc.transform != nil { - if err := cc.transform(kc); err != nil { - return nil, status.InternalError, err - } - } - // validate the result - if err := validation.ValidateKubeletConfiguration(kc); err != nil { - return nil, status.ValidateError, err - } - return kc, "", nil -} - -// initializeDynamicConfigDir makes sure that the storage layers for various controller components are set up correctly -func (cc *Controller) initializeDynamicConfigDir() error { - utillog.Infof("ensuring filesystem is set up correctly") - // initializeDynamicConfigDir local checkpoint storage location - return cc.checkpointStore.Initialize() -} - -// checkTrial checks whether the trial duration has passed, and updates the last-known-good config if necessary -func (cc *Controller) checkTrial(duration time.Duration) { - // when the trial period is over, the assigned config becomes the last-known-good - if trial, err := cc.inTrial(duration); err != nil { - utillog.Errorf("failed to check trial period for assigned config, error: %v", err) - } else if !trial { - if err := cc.graduateAssignedToLastKnownGood(); err != nil { - utillog.Errorf("failed to set last-known-good to assigned config, error: %v", err) - } - } -} - -// inTrial returns true if the time elapsed since the last modification of the assigned config does not exceed `trialDur`, false otherwise -func (cc *Controller) inTrial(trialDur time.Duration) (bool, error) { - now := time.Now() - t, err := cc.checkpointStore.AssignedModified() - if err != nil { - return false, err - } - if now.Sub(t) <= trialDur { - return true, nil - } - return false, nil -} - -// graduateAssignedToLastKnownGood sets the last-known-good in the checkpointStore -// to the same value as the assigned config maintained by the checkpointStore -func (cc *Controller) graduateAssignedToLastKnownGood() error { - // get assigned - assigned, err := cc.checkpointStore.Assigned() - if err != nil { - return err - } - // get last-known-good - lastKnownGood, err := cc.checkpointStore.LastKnownGood() - if err != nil { - return err - } - // if the sources are equal, no need to change - if assigned == lastKnownGood || - assigned != nil && lastKnownGood != nil && apiequality.Semantic.DeepEqual(assigned, lastKnownGood) { - return nil - } - // update last-known-good - err = cc.checkpointStore.SetLastKnownGood(assigned) - if err != nil { - return err - } - // update the status to reflect the new last-known-good config - cc.configStatus.SetLastKnownGood(assigned.NodeConfigSource()) - utillog.Infof("updated last-known-good config to %s, UID: %s, ResourceVersion: %s", assigned.APIPath(), assigned.UID(), assigned.ResourceVersion()) - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD deleted file mode 100644 index fe925bfc..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["status.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status", - deps = [ - "//pkg/kubelet/kubeletconfig/util/log:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/util/node:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go deleted file mode 100644 index d1fdfeb8..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/status/status.go +++ /dev/null @@ -1,202 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 status - -import ( - "fmt" - "sync" - - apiv1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - clientset "k8s.io/client-go/kubernetes" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" - "k8s.io/kubernetes/pkg/kubelet/metrics" - nodeutil "k8s.io/kubernetes/pkg/util/node" -) - -const ( - // LoadError indicates that the Kubelet failed to load the config checkpoint - LoadError = "failed to load config, see Kubelet log for details" - // ValidateError indicates that the Kubelet failed to validate the config checkpoint - ValidateError = "failed to validate config, see Kubelet log for details" - // AllNilSubfieldsError is used when no subfields are set - // This could happen in the case that an old client tries to read an object from a newer API server with a set subfield it does not know about - AllNilSubfieldsError = "invalid NodeConfigSource, exactly one subfield must be non-nil, but all were nil" - // DownloadError is used when the download fails, e.g. due to network issues - DownloadError = "failed to download config, see Kubelet log for details" - // InternalError indicates that some internal error happened while trying to sync config, e.g. filesystem issues - InternalError = "internal failure, see Kubelet log for details" - - // SyncErrorFmt is used when the system couldn't sync the config, due to a malformed Node.Spec.ConfigSource, a download failure, etc. - SyncErrorFmt = "failed to sync: %s" -) - -// NodeConfigStatus represents Node.Status.Config -type NodeConfigStatus interface { - // SetActive sets the active source in the status - SetActive(source *apiv1.NodeConfigSource) - // SetAssigned sets the assigned source in the status - SetAssigned(source *apiv1.NodeConfigSource) - // SetLastKnownGood sets the last-known-good source in the status - SetLastKnownGood(source *apiv1.NodeConfigSource) - // SetError sets the error associated with the status - SetError(err string) - // SetErrorOverride sets an error that overrides the base error set by SetError. - // If the override is set to the empty string, the base error is reported in - // the status, otherwise the override is reported. - SetErrorOverride(err string) - // Sync patches the current status into the Node identified by `nodeName` if an update is pending - Sync(client clientset.Interface, nodeName string) -} - -type nodeConfigStatus struct { - // status is the core NodeConfigStatus that we report - status apiv1.NodeConfigStatus - // mux is a mutex on the nodeConfigStatus, alternate between setting and syncing the status - mux sync.Mutex - // errorOverride is sent in place of the usual error if it is non-empty - errorOverride string - // syncCh; write to this channel to indicate that the status needs to be synced to the API server - syncCh chan bool -} - -// NewNodeConfigStatus returns a new NodeConfigStatus interface -func NewNodeConfigStatus() NodeConfigStatus { - // channels must have capacity at least 1, since we signal with non-blocking writes - syncCh := make(chan bool, 1) - // prime new status managers to sync with the API server on the first call to Sync - syncCh <- true - return &nodeConfigStatus{ - syncCh: syncCh, - } -} - -// transact grabs the lock, performs the fn, records the need to sync, and releases the lock -func (s *nodeConfigStatus) transact(fn func()) { - s.mux.Lock() - defer s.mux.Unlock() - fn() - s.sync() -} - -func (s *nodeConfigStatus) SetAssigned(source *apiv1.NodeConfigSource) { - s.transact(func() { - s.status.Assigned = source - }) -} - -func (s *nodeConfigStatus) SetActive(source *apiv1.NodeConfigSource) { - s.transact(func() { - s.status.Active = source - }) -} - -func (s *nodeConfigStatus) SetLastKnownGood(source *apiv1.NodeConfigSource) { - s.transact(func() { - s.status.LastKnownGood = source - }) -} - -func (s *nodeConfigStatus) SetError(err string) { - s.transact(func() { - s.status.Error = err - }) -} - -func (s *nodeConfigStatus) SetErrorOverride(err string) { - s.transact(func() { - s.errorOverride = err - }) -} - -// sync notes that the status needs to be synced to the API server -func (s *nodeConfigStatus) sync() { - select { - case s.syncCh <- true: - default: - } -} - -// Sync attempts to sync the status with the Node object for this Kubelet, -// if syncing fails, an error is logged, and work is queued for retry. -func (s *nodeConfigStatus) Sync(client clientset.Interface, nodeName string) { - select { - case <-s.syncCh: - default: - // no work to be done, return - return - } - - utillog.Infof("updating Node.Status.Config") - - // grab the lock - s.mux.Lock() - defer s.mux.Unlock() - - // if the sync fails, we want to retry - var err error - defer func() { - if err != nil { - utillog.Errorf(err.Error()) - s.sync() - } - }() - - // get the Node so we can check the current status - oldNode, err := client.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{}) - if err != nil { - err = fmt.Errorf("could not get Node %q, will not sync status, error: %v", nodeName, err) - return - } - - status := &s.status - // override error, if necessary - if len(s.errorOverride) > 0 { - // copy the status, so we don't overwrite the prior error - // with the override - status = status.DeepCopy() - status.Error = s.errorOverride - } - - // update metrics based on the status we will sync - metrics.SetConfigError(len(status.Error) > 0) - err = metrics.SetAssignedConfig(status.Assigned) - if err != nil { - err = fmt.Errorf("failed to update Assigned config metric, error: %v", err) - return - } - err = metrics.SetActiveConfig(status.Active) - if err != nil { - err = fmt.Errorf("failed to update Active config metric, error: %v", err) - return - } - err = metrics.SetLastKnownGoodConfig(status.LastKnownGood) - if err != nil { - err = fmt.Errorf("failed to update LastKnownGood config metric, error: %v", err) - return - } - - // apply the status to a copy of the node so we don't modify the object in the informer's store - newNode := oldNode.DeepCopy() - newNode.Status.Config = status - - // patch the node with the new status - if _, _, err := nodeutil.PatchNodeStatus(client.CoreV1(), types.NodeName(nodeName), oldNode, newNode); err != nil { - utillog.Errorf("failed to patch node status, error: %v", err) - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD deleted file mode 100644 index 43ea8c21..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["codec.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/kubelet/apis/kubeletconfig:go_default_library", - "//pkg/kubelet/apis/kubeletconfig/scheme:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go deleted file mode 100644 index b8356fab..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec/codec.go +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 codec - -import ( - "fmt" - - // ensure the core apis are installed - _ "k8s.io/kubernetes/pkg/apis/core/install" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig" - "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme" -) - -// EncodeKubeletConfig encodes an internal KubeletConfiguration to an external YAML representation -func EncodeKubeletConfig(internal *kubeletconfig.KubeletConfiguration, targetVersion schema.GroupVersion) ([]byte, error) { - encoder, err := NewKubeletconfigYAMLEncoder(targetVersion) - if err != nil { - return nil, err - } - // encoder will convert to external version - data, err := runtime.Encode(encoder, internal) - if err != nil { - return nil, err - } - return data, nil -} - -// NewKubeletconfigYAMLEncoder returns an encoder that can write objects in the kubeletconfig API group to YAML -func NewKubeletconfigYAMLEncoder(targetVersion schema.GroupVersion) (runtime.Encoder, error) { - _, codecs, err := scheme.NewSchemeAndCodecs() - if err != nil { - return nil, err - } - mediaType := "application/yaml" - info, ok := runtime.SerializerInfoForMediaType(codecs.SupportedMediaTypes(), mediaType) - if !ok { - return nil, fmt.Errorf("unsupported media type %q", mediaType) - } - return codecs.EncoderForVersion(info.Serializer, targetVersion), nil -} - -// NewYAMLEncoder generates a new runtime.Encoder that encodes objects to YAML -func NewYAMLEncoder(groupName string) (runtime.Encoder, error) { - // encode to YAML - mediaType := "application/yaml" - info, ok := runtime.SerializerInfoForMediaType(legacyscheme.Codecs.SupportedMediaTypes(), mediaType) - if !ok { - return nil, fmt.Errorf("unsupported media type %q", mediaType) - } - - versions := legacyscheme.Scheme.PrioritizedVersionsForGroup(groupName) - if len(versions) == 0 { - return nil, fmt.Errorf("no enabled versions for group %q", groupName) - } - - // the "best" version supposedly comes first in the list returned from legacyscheme.Registry.EnabledVersionsForGroup - return legacyscheme.Codecs.EncoderForVersion(info.Serializer, versions[0]), nil -} - -// DecodeKubeletConfiguration decodes a serialized KubeletConfiguration to the internal type -func DecodeKubeletConfiguration(kubeletCodecs *serializer.CodecFactory, data []byte) (*kubeletconfig.KubeletConfiguration, error) { - // the UniversalDecoder runs defaulting and returns the internal type by default - obj, gvk, err := kubeletCodecs.UniversalDecoder().Decode(data, nil, nil) - if err != nil { - return nil, fmt.Errorf("failed to decode, error: %v", err) - } - - internalKC, ok := obj.(*kubeletconfig.KubeletConfiguration) - if !ok { - return nil, fmt.Errorf("failed to cast object to KubeletConfiguration, unexpected type: %v", gvk) - } - - return internalKC, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go deleted file mode 100644 index fc42151a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/files/files.go +++ /dev/null @@ -1,229 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 files - -import ( - "fmt" - "os" - "path/filepath" - - utilfs "k8s.io/kubernetes/pkg/util/filesystem" -) - -const ( - defaultPerm = 0755 - tmptag = "tmp_" // additional prefix to prevent accidental collisions -) - -// FileExists returns true if a regular file exists at `path`, false if `path` does not exist, otherwise an error -func FileExists(fs utilfs.Filesystem, path string) (bool, error) { - if info, err := fs.Stat(path); err == nil { - if info.Mode().IsRegular() { - return true, nil - } - return false, fmt.Errorf("expected regular file at %q, but mode is %q", path, info.Mode().String()) - } else if os.IsNotExist(err) { - return false, nil - } else { - return false, err - } -} - -// EnsureFile ensures that a regular file exists at `path`, and if it must create the file any -// necessary parent directories will also be created and the new file will be empty. -func EnsureFile(fs utilfs.Filesystem, path string) error { - // if file exists, don't change it, but do report any unexpected errors - if ok, err := FileExists(fs, path); ok || err != nil { - return err - } // Assert: file does not exist - - // create any necessary parents - err := fs.MkdirAll(filepath.Dir(path), defaultPerm) - if err != nil { - return err - } - - // create the file - file, err := fs.Create(path) - if err != nil { - return err - } - // close the file, since we don't intend to use it yet - return file.Close() -} - -// WriteTmpFile creates a temporary file at `path`, writes `data` into it, and fsyncs the file -// Expects the parent directory to exist. -func WriteTmpFile(fs utilfs.Filesystem, path string, data []byte) (tmpPath string, retErr error) { - dir := filepath.Dir(path) - prefix := tmptag + filepath.Base(path) - - // create the tmp file - tmpFile, err := fs.TempFile(dir, prefix) - if err != nil { - return "", err - } - defer func() { - // close the file, return the close error only if there haven't been any other errors - if err := tmpFile.Close(); retErr == nil { - retErr = err - } - // if there was an error writing, syncing, or closing, delete the temporary file and return the error - if retErr != nil { - if err := fs.Remove(tmpPath); err != nil { - retErr = fmt.Errorf("attempted to remove temporary file %q after error %v, but failed due to error: %v", tmpPath, retErr, err) - } - tmpPath = "" - } - }() - - // Name() will be an absolute path when using utilfs.DefaultFS, because ioutil.TempFile passes - // an absolute path to os.Open, and we ensure similar behavior in utilfs.FakeFS for testing. - tmpPath = tmpFile.Name() - - // write data - if _, err := tmpFile.Write(data); err != nil { - return tmpPath, err - } - // sync file, to ensure it's written in case a hard reset happens - return tmpPath, tmpFile.Sync() -} - -// ReplaceFile replaces the contents of the file at `path` with `data` by writing to a tmp file in the same -// dir as `path` and renaming the tmp file over `path`. The file does not have to exist to use ReplaceFile, -// but the parent directory must exist. -// Note ReplaceFile calls fsync. -func ReplaceFile(fs utilfs.Filesystem, path string, data []byte) error { - // write data to a temporary file - tmpPath, err := WriteTmpFile(fs, path, data) - if err != nil { - return err - } - // rename over existing file - return fs.Rename(tmpPath, path) -} - -// DirExists returns true if a directory exists at `path`, false if `path` does not exist, otherwise an error -func DirExists(fs utilfs.Filesystem, path string) (bool, error) { - if info, err := fs.Stat(path); err == nil { - if info.IsDir() { - return true, nil - } - return false, fmt.Errorf("expected dir at %q, but mode is %q", path, info.Mode().String()) - } else if os.IsNotExist(err) { - return false, nil - } else { - return false, err - } -} - -// EnsureDir ensures that a directory exists at `path`, and if it must create the directory any -// necessary parent directories will also be created and the new directory will be empty. -func EnsureDir(fs utilfs.Filesystem, path string) error { - // if dir exists, don't change it, but do report any unexpected errors - if ok, err := DirExists(fs, path); ok || err != nil { - return err - } // Assert: dir does not exist - - // create the dir - return fs.MkdirAll(path, defaultPerm) -} - -// WriteTempDir creates a temporary dir at `path`, writes `files` into it, and fsyncs all the files -// The keys of `files` represent file names. These names must not: -// - be empty -// - be a path that contains more than the base name of a file (e.g. foo/bar is invalid, as is /bar) -// - match `.` or `..` exactly -// - be longer than 255 characters -// The above validation rules are based on atomic_writer.go, though in this case are more restrictive -// because we only allow a flat hierarchy. -func WriteTempDir(fs utilfs.Filesystem, path string, files map[string]string) (tmpPath string, retErr error) { - // validate the filename keys; for now we only allow a flat keyset - for name := range files { - // invalidate empty names - if name == "" { - return "", fmt.Errorf("invalid file key: must not be empty: %q", name) - } - // invalidate: foo/bar and /bar - if name != filepath.Base(name) { - return "", fmt.Errorf("invalid file key %q, only base names are allowed", name) - } - // invalidate `.` and `..` - if name == "." || name == ".." { - return "", fmt.Errorf("invalid file key, may not be '.' or '..'") - } - // invalidate length > 255 characters - if len(name) > 255 { - return "", fmt.Errorf("invalid file key %q, must be less than 255 characters", name) - } - } - - // write the temp directory in parent dir and return path to the tmp directory - dir := filepath.Dir(path) - prefix := tmptag + filepath.Base(path) - - // create the tmp dir - var err error - tmpPath, err = fs.TempDir(dir, prefix) - if err != nil { - return "", err - } - // be sure to clean up if there was an error - defer func() { - if retErr != nil { - if err := fs.RemoveAll(tmpPath); err != nil { - retErr = fmt.Errorf("attempted to remove temporary directory %q after error %v, but failed due to error: %v", tmpPath, retErr, err) - } - } - }() - // write data - for name, data := range files { - // create the file - file, err := fs.Create(filepath.Join(tmpPath, name)) - if err != nil { - return tmpPath, err - } - // be sure to close the file when we're done - defer func() { - // close the file when we're done, don't overwrite primary retErr if close fails - if err := file.Close(); retErr == nil { - retErr = err - } - }() - // write the file - if _, err := file.Write([]byte(data)); err != nil { - return tmpPath, err - } - // sync the file, to ensure it's written in case a hard reset happens - if err := file.Sync(); err != nil { - return tmpPath, err - } - } - return tmpPath, nil -} - -// ReplaceDir replaces the contents of the dir at `path` with `files` by writing to a tmp dir in the same -// dir as `path` and renaming the tmp dir over `path`. The dir does not have to exist to use ReplaceDir. -func ReplaceDir(fs utilfs.Filesystem, path string, files map[string]string) error { - // write data to a temporary directory - tmpPath, err := WriteTempDir(fs, path, files) - if err != nil { - return err - } - // rename over target directory - return fs.Rename(tmpPath, path) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD deleted file mode 100644 index 34b20a27..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["log.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log", - deps = ["//vendor/github.com/golang/glog:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go deleted file mode 100644 index b4ecfe4d..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log/log.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 log - -import ( - "fmt" - - "github.com/golang/glog" -) - -const logFmt = "kubelet config controller: %s" - -// Errorf shim that inserts "kubelet config controller" at the beginning of the log message, -// while still reporting the call site of the logging function. -func Errorf(format string, args ...interface{}) { - var s string - if len(args) > 0 { - s = fmt.Sprintf(format, args...) - } else { - s = format - } - glog.ErrorDepth(1, fmt.Sprintf(logFmt, s)) -} - -// Infof shim that inserts "kubelet config controller" at the beginning of the log message, -// while still reporting the call site of the logging function. -func Infof(format string, args ...interface{}) { - var s string - if len(args) > 0 { - s = fmt.Sprintf(format, args...) - } else { - s = format - } - glog.InfoDepth(1, fmt.Sprintf(logFmt, s)) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD deleted file mode 100644 index 818059ac..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["panic.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/panic", - deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go deleted file mode 100644 index 879fb747..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubeletconfig/watch.go +++ /dev/null @@ -1,154 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 kubeletconfig - -import ( - "math/rand" - "time" - - apiv1 "k8s.io/api/core/v1" - apiequality "k8s.io/apimachinery/pkg/api/equality" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/fields" - kuberuntime "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/watch" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/cache" - utillog "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/log" -) - -// newSharedNodeInformer returns a shared informer that uses `client` to watch the Node with -// `nodeName` for changes and respond with `addFunc`, `updateFunc`, and `deleteFunc`. -func newSharedNodeInformer(client clientset.Interface, nodeName string, - addFunc func(newObj interface{}), - updateFunc func(oldObj interface{}, newObj interface{}), - deleteFunc func(deletedObj interface{})) cache.SharedInformer { - // select nodes by name - fieldselector := fields.OneTermEqualSelector("metadata.name", nodeName) - - // add some randomness to resync period, which can help avoid controllers falling into lock-step - minResyncPeriod := 15 * time.Minute - factor := rand.Float64() + 1 - resyncPeriod := time.Duration(float64(minResyncPeriod.Nanoseconds()) * factor) - - lw := &cache.ListWatch{ - ListFunc: func(options metav1.ListOptions) (kuberuntime.Object, error) { - return client.CoreV1().Nodes().List(metav1.ListOptions{ - FieldSelector: fieldselector.String(), - }) - }, - WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { - return client.CoreV1().Nodes().Watch(metav1.ListOptions{ - FieldSelector: fieldselector.String(), - ResourceVersion: options.ResourceVersion, - }) - }, - } - - handler := cache.ResourceEventHandlerFuncs{ - AddFunc: addFunc, - UpdateFunc: updateFunc, - DeleteFunc: deleteFunc, - } - - informer := cache.NewSharedInformer(lw, &apiv1.Node{}, resyncPeriod) - informer.AddEventHandler(handler) - - return informer -} - -// onAddNodeEvent calls onUpdateNodeEvent with the new object and a nil old object -func (cc *Controller) onAddNodeEvent(newObj interface{}) { - cc.onUpdateNodeEvent(nil, newObj) -} - -// onUpdateNodeEvent checks whether the configSource changed between oldObj and newObj, and pokes the -// configuration sync worker if there was a change -func (cc *Controller) onUpdateNodeEvent(oldObj interface{}, newObj interface{}) { - newNode, ok := newObj.(*apiv1.Node) - if !ok { - utillog.Errorf("failed to cast new object to Node, couldn't handle event") - return - } - if oldObj == nil { - // Node was just added, need to sync - utillog.Infof("initial Node watch event") - cc.pokeConfigSourceWorker() - return - } - oldNode, ok := oldObj.(*apiv1.Node) - if !ok { - utillog.Errorf("failed to cast old object to Node, couldn't handle event") - return - } - if !apiequality.Semantic.DeepEqual(oldNode.Spec.ConfigSource, newNode.Spec.ConfigSource) { - utillog.Infof("Node.Spec.ConfigSource was updated") - cc.pokeConfigSourceWorker() - } -} - -// onDeleteNodeEvent logs a message if the Node was deleted -// We allow the sync-loop to continue, because it is possible that the Kubelet detected -// a Node with unexpected externalID and is attempting to delete and re-create the Node -// (see pkg/kubelet/kubelet_node_status.go), or that someone accidentally deleted the Node -// (the Kubelet will re-create it). -func (cc *Controller) onDeleteNodeEvent(deletedObj interface{}) { - // For this case, we just log the event. - // We don't want to poke the worker, because a temporary deletion isn't worth reporting an error for. - // If the Node is deleted because the VM is being deleted, then the Kubelet has nothing to do. - utillog.Infof("Node was deleted") -} - -// onAddRemoteConfigSourceEvent calls onUpdateConfigMapEvent with the new object and a nil old object -func (cc *Controller) onAddRemoteConfigSourceEvent(newObj interface{}) { - cc.onUpdateRemoteConfigSourceEvent(nil, newObj) -} - -// onUpdateRemoteConfigSourceEvent checks whether the configSource changed between oldObj and newObj, -// and pokes the sync worker if there was a change -func (cc *Controller) onUpdateRemoteConfigSourceEvent(oldObj interface{}, newObj interface{}) { - // since ConfigMap is currently the only source type, we handle that here - newConfigMap, ok := newObj.(*apiv1.ConfigMap) - if !ok { - utillog.Errorf("failed to cast new object to ConfigMap, couldn't handle event") - return - } - if oldObj == nil { - // ConfigMap was just added, need to sync - utillog.Infof("initial ConfigMap watch event") - cc.pokeConfigSourceWorker() - return - } - oldConfigMap, ok := oldObj.(*apiv1.ConfigMap) - if !ok { - utillog.Errorf("failed to cast old object to ConfigMap, couldn't handle event") - return - } - if !apiequality.Semantic.DeepEqual(oldConfigMap, newConfigMap) { - utillog.Infof("assigned ConfigMap was updated") - cc.pokeConfigSourceWorker() - } -} - -// onDeleteRemoteConfigSourceEvent logs a message if the ConfigMap was deleted and pokes the sync worker -func (cc *Controller) onDeleteRemoteConfigSourceEvent(deletedObj interface{}) { - // If the ConfigMap we're watching is deleted, we log the event and poke the sync worker. - // This requires a sync, because if the Node is still configured to use the deleted ConfigMap, - // the Kubelet should report a DownloadError. - utillog.Infof("assigned ConfigMap was deleted") - cc.pokeConfigSourceWorker() -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD index 29121b94..d1045f5a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/BUILD @@ -12,8 +12,14 @@ go_library( "doc.go", "fake_kuberuntime_manager.go", "helpers.go", + "helpers_linux.go", + "helpers_unsupported.go", + "helpers_windows.go", "instrumented_services.go", "kuberuntime_container.go", + "kuberuntime_container_linux.go", + "kuberuntime_container_unsupported.go", + "kuberuntime_container_windows.go", "kuberuntime_gc.go", "kuberuntime_image.go", "kuberuntime_logs.go", @@ -22,53 +28,7 @@ go_library( "labels.go", "legacy.go", "security_context.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "helpers_linux.go", - "kuberuntime_container_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "helpers_unsupported.go", - "kuberuntime_container_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "helpers_windows.go", - "kuberuntime_container_windows.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/kubelet/kuberuntime", deps = [ "//pkg/api/legacyscheme:go_default_library", @@ -85,6 +45,7 @@ go_library( "//pkg/kubelet/lifecycle:go_default_library", "//pkg/kubelet/metrics:go_default_library", "//pkg/kubelet/prober/results:go_default_library", + "//pkg/kubelet/runtimeclass:go_default_library", "//pkg/kubelet/types:go_default_library", "//pkg/kubelet/util/cache:go_default_library", "//pkg/kubelet/util/format:go_default_library", @@ -94,20 +55,20 @@ go_library( "//pkg/util/selinux:go_default_library", "//pkg/util/tail:go_default_library", "//pkg/util/version:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/client-go/tools/reference:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/github.com/armon/circbuf:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ "//pkg/kubelet/qos:go_default_library", @@ -123,8 +84,10 @@ go_library( go_test( name = "go_default_test", srcs = [ + "helpers_linux_test.go", "helpers_test.go", "instrumented_services_test.go", + "kuberuntime_container_linux_test.go", "kuberuntime_container_test.go", "kuberuntime_gc_test.go", "kuberuntime_image_test.go", @@ -133,12 +96,7 @@ go_test( "labels_test.go", "legacy_test.go", "security_context_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "kuberuntime_container_linux_test.go", - ], - "//conditions:default": [], - }), + ], embed = [":go_default_library"], deps = [ "//pkg/credentialprovider:go_default_library", @@ -149,19 +107,22 @@ go_test( "//pkg/kubelet/container/testing:go_default_library", "//pkg/kubelet/lifecycle:go_default_library", "//pkg/kubelet/metrics:go_default_library", + "//pkg/kubelet/runtimeclass:go_default_library", + "//pkg/kubelet/runtimeclass/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/github.com/golang/mock/gomock:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go index a630588e..6eb64ee7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/fake_kuberuntime_manager.go @@ -21,6 +21,7 @@ import ( "time" cadvisorapi "github.com/google/cadvisor/info/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" "k8s.io/client-go/util/flowcontrol" @@ -74,6 +75,7 @@ func NewFakeKubeRuntimeManager(runtimeService internalapi.RuntimeService, imageS kubeRuntimeManager := &kubeGenericRuntimeManager{ recorder: recorder, cpuCFSQuota: false, + cpuCFSQuotaPeriod: metav1.Duration{Duration: time.Microsecond * 100}, livenessManager: proberesults.NewManager(), containerRefManager: kubecontainer.NewRefManager(), machineInfo: machineInfo, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go index d52faa06..fd977d5a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go @@ -79,6 +79,8 @@ func toRuntimeProtocol(protocol v1.Protocol) runtimeapi.Protocol { return runtimeapi.Protocol_TCP case v1.ProtocolUDP: return runtimeapi.Protocol_UDP + case v1.ProtocolSCTP: + return runtimeapi.Protocol_SCTP } glog.Warningf("Unknown protocol %q: defaulting to TCP", protocol) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers_linux.go index 15abb4a0..b6a4f4f8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers_linux.go @@ -18,6 +18,11 @@ limitations under the License. package kuberuntime +import ( + utilfeature "k8s.io/apiserver/pkg/util/feature" + kubefeatures "k8s.io/kubernetes/pkg/features" +) + const ( // Taken from lmctfy https://github.com/google/lmctfy/blob/master/lmctfy/controllers/cpu_controller.cc minShares = 2 @@ -25,7 +30,7 @@ const ( milliCPUToCPU = 1000 // 100000 is equivalent to 100ms - quotaPeriod = 100 * minQuotaPeriod + quotaPeriod = 100000 minQuotaPeriod = 1000 ) @@ -44,21 +49,22 @@ func milliCPUToShares(milliCPU int64) int64 { } // milliCPUToQuota converts milliCPU to CFS quota and period values -func milliCPUToQuota(milliCPU int64) (quota int64, period int64) { +func milliCPUToQuota(milliCPU int64, period int64) (quota int64) { // CFS quota is measured in two values: // - cfs_period_us=100ms (the amount of time to measure usage across) // - cfs_quota=20ms (the amount of cpu time allowed to be used across a period) // so in the above example, you are limited to 20% of a single CPU // for multi-cpu environments, you just scale equivalent amounts + // see https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt for details if milliCPU == 0 { return } - - // we set the period to 100ms by default - period = quotaPeriod + if !utilfeature.DefaultFeatureGate.Enabled(kubefeatures.CPUCFSQuotaPeriod) { + period = quotaPeriod + } // we then convert your milliCPU to a value normalized over a period - quota = (milliCPU * quotaPeriod) / milliCPUToCPU + quota = (milliCPU * period) / milliCPUToCPU // quota needs to be a minimum of 1ms. if quota < minQuotaPeriod { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/instrumented_services.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/instrumented_services.go index 8540ddb4..898b0b19 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/instrumented_services.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/instrumented_services.go @@ -176,11 +176,11 @@ func (in instrumentedRuntimeService) Attach(req *runtimeapi.AttachRequest) (*run return resp, err } -func (in instrumentedRuntimeService) RunPodSandbox(config *runtimeapi.PodSandboxConfig) (string, error) { +func (in instrumentedRuntimeService) RunPodSandbox(config *runtimeapi.PodSandboxConfig, runtimeHandler string) (string, error) { const operation = "run_podsandbox" defer recordOperation(operation, time.Now()) - out, err := in.service.RunPodSandbox(config) + out, err := in.service.RunPodSandbox(config, runtimeHandler) recordError(operation, err) return out, err } @@ -300,4 +300,4 @@ func (in instrumentedImageManagerService) ImageFsInfo() ([]*runtimeapi.Filesyste fsInfo, err := in.service.ImageFsInfo() recordError(operation, err) return fsInfo, nil -} +} \ No newline at end of file diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go index 4f2444dd..5575c451 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container.go @@ -17,6 +17,7 @@ limitations under the License. package kuberuntime import ( + "context" "errors" "fmt" "io" @@ -51,6 +52,7 @@ import ( var ( ErrCreateContainerConfig = errors.New("CreateContainerConfigError") ErrCreateContainer = errors.New("CreateContainerError") + ErrPreStartHook = errors.New("PreStartHookError") ErrPostStartHook = errors.New("PostStartHookError") ) @@ -122,8 +124,8 @@ func (m *kubeGenericRuntimeManager) startContainer(podSandboxID string, podSandb } err = m.internalLifecycle.PreStartContainer(pod, container, containerID) if err != nil { - m.recorder.Eventf(ref, v1.EventTypeWarning, events.FailedToStartContainer, "Internal PreStartContainer hook failed: %v", err) - return "Internal PreStartContainer hook failed", err + m.recordContainerEvent(pod, container, containerID, v1.EventTypeWarning, events.FailedToStartContainer, "Internal PreStartContainer hook failed: %v", grpc.ErrorDesc(err)) + return grpc.ErrorDesc(err), ErrPreStartHook } m.recordContainerEvent(pod, container, containerID, v1.EventTypeNormal, events.CreatedContainer, "Created container") @@ -366,7 +368,7 @@ func getTerminationMessage(status *runtimeapi.ContainerStatus, terminationMessag func (m *kubeGenericRuntimeManager) readLastStringFromContainerLogs(path string) string { value := int64(kubecontainer.MaxContainerTerminationMessageLogLines) buf, _ := circbuf.NewBuffer(kubecontainer.MaxContainerTerminationMessageLogLength) - if err := m.ReadLogs(path, "", &v1.PodLogOptions{TailLines: &value}, buf, buf); err != nil { + if err := m.ReadLogs(context.Background(), path, "", &v1.PodLogOptions{TailLines: &value}, buf, buf); err != nil { return fmt.Sprintf("Error on reading termination message from logs: %v", err) } return buf.String() @@ -730,13 +732,13 @@ func findNextInitContainerToRun(pod *v1.Pod, podStatus *kubecontainer.PodStatus) } // GetContainerLogs returns logs of a specific container. -func (m *kubeGenericRuntimeManager) GetContainerLogs(pod *v1.Pod, containerID kubecontainer.ContainerID, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) (err error) { +func (m *kubeGenericRuntimeManager) GetContainerLogs(ctx context.Context, pod *v1.Pod, containerID kubecontainer.ContainerID, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) (err error) { status, err := m.runtimeService.ContainerStatus(containerID.ID) if err != nil { glog.V(4).Infof("failed to get container status for %v: %v", containerID.String(), err) return fmt.Errorf("Unable to retrieve container logs for %v", containerID.String()) } - return m.ReadLogs(status.GetLogPath(), containerID.ID, logOptions, stdout, stderr) + return m.ReadLogs(ctx, status.GetLogPath(), containerID.ID, logOptions, stdout, stderr) } // GetExec gets the endpoint the runtime will serve the exec request from. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go index cdac02ff..c5da7e31 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_container_linux.go @@ -19,6 +19,8 @@ limitations under the License. package kuberuntime import ( + "time" + "k8s.io/api/core/v1" runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" "k8s.io/kubernetes/pkg/kubelet/qos" @@ -65,7 +67,8 @@ func (m *kubeGenericRuntimeManager) generateLinuxContainerConfig(container *v1.C if m.cpuCFSQuota { // if cpuLimit.Amount is nil, then the appropriate default value is returned // to allow full usage of cpu resource. - cpuQuota, cpuPeriod := milliCPUToQuota(cpuLimit.MilliValue()) + cpuPeriod := int64(m.cpuCFSQuotaPeriod.Duration / time.Microsecond) + cpuQuota := milliCPUToQuota(cpuLimit.MilliValue(), cpuPeriod) lc.Resources.CpuQuota = cpuQuota lc.Resources.CpuPeriod = cpuPeriod } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_logs.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_logs.go index ee8dc4c8..b4bc6134 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_logs.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_logs.go @@ -17,6 +17,7 @@ limitations under the License. package kuberuntime import ( + "context" "io" "time" @@ -27,9 +28,9 @@ import ( // ReadLogs read the container log and redirect into stdout and stderr. // Note that containerID is only needed when following the log, or else // just pass in empty string "". -func (m *kubeGenericRuntimeManager) ReadLogs(path, containerID string, apiOpts *v1.PodLogOptions, stdout, stderr io.Writer) error { +func (m *kubeGenericRuntimeManager) ReadLogs(ctx context.Context, path, containerID string, apiOpts *v1.PodLogOptions, stdout, stderr io.Writer) error { // Convert v1.PodLogOptions into internal log options. opts := logs.NewLogOptions(apiOpts, time.Now()) - return logs.ReadLogs(path, containerID, opts, m.runtimeService, stdout, stderr) + return logs.ReadLogs(ctx, path, containerID, opts, m.runtimeService, stdout, stderr) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go index df207fb4..2818990b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_manager.go @@ -42,6 +42,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/images" "k8s.io/kubernetes/pkg/kubelet/lifecycle" proberesults "k8s.io/kubernetes/pkg/kubelet/prober/results" + "k8s.io/kubernetes/pkg/kubelet/runtimeclass" "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/kubernetes/pkg/kubelet/util/cache" "k8s.io/kubernetes/pkg/kubelet/util/format" @@ -98,6 +99,9 @@ type kubeGenericRuntimeManager struct { // If true, enforce container cpu limits with CFS quota support cpuCFSQuota bool + // CPUCFSQuotaPeriod sets the CPU CFS quota period value, cpu.cfs_period_us, defaults to 100ms + cpuCFSQuotaPeriod metav1.Duration + // wrapped image puller. imagePuller images.ImageManager @@ -116,6 +120,9 @@ type kubeGenericRuntimeManager struct { // A shim to legacy functions for backward compatibility. legacyLogProvider LegacyLogProvider + + // Manage RuntimeClass resources. + runtimeClassManager *runtimeclass.Manager } type KubeGenericRuntime interface { @@ -146,14 +153,17 @@ func NewKubeGenericRuntimeManager( imagePullQPS float32, imagePullBurst int, cpuCFSQuota bool, + cpuCFSQuotaPeriod metav1.Duration, runtimeService internalapi.RuntimeService, imageService internalapi.ImageManagerService, internalLifecycle cm.InternalContainerLifecycle, legacyLogProvider LegacyLogProvider, + runtimeClassManager *runtimeclass.Manager, ) (KubeGenericRuntime, error) { kubeRuntimeManager := &kubeGenericRuntimeManager{ recorder: recorder, cpuCFSQuota: cpuCFSQuota, + cpuCFSQuotaPeriod: cpuCFSQuotaPeriod, seccompProfileRoot: seccompProfileRoot, livenessManager: livenessManager, containerRefManager: containerRefManager, @@ -165,6 +175,7 @@ func NewKubeGenericRuntimeManager( keyring: credentialprovider.NewDockerKeyring(), internalLifecycle: internalLifecycle, legacyLogProvider: legacyLogProvider, + runtimeClassManager: runtimeClassManager, } typedVersion, err := kubeRuntimeManager.runtimeService.Version(kubeRuntimeAPIVersion) @@ -510,7 +521,7 @@ func (m *kubeGenericRuntimeManager) computePodActions(pod *v1.Pod, podStatus *ku if containerStatus == nil || containerStatus.State != kubecontainer.ContainerStateRunning { if kubecontainer.ShouldContainerBeRestarted(&container, pod, podStatus) { message := fmt.Sprintf("Container %+v is dead, but RestartPolicy says that we should restart it.", container) - glog.Info(message) + glog.V(3).Infof(message) changes.ContainersToStart = append(changes.ContainersToStart, idx) } continue @@ -754,7 +765,7 @@ func (m *kubeGenericRuntimeManager) doBackOff(pod *v1.Pod, container *v1.Contain return false, "", nil } - glog.Infof("checking backoff for container %q in pod %q", container.Name, format.Pod(pod)) + glog.V(3).Infof("checking backoff for container %q in pod %q", container.Name, format.Pod(pod)) // Use the finished time of the latest exited container as the start point to calculate whether to do back-off. ts := cStatus.FinishedAt // backOff requires a unique key to identify the container. @@ -764,7 +775,7 @@ func (m *kubeGenericRuntimeManager) doBackOff(pod *v1.Pod, container *v1.Contain m.recorder.Eventf(ref, v1.EventTypeWarning, events.BackOffStartContainer, "Back-off restarting failed container") } err := fmt.Errorf("Back-off %s restarting failed container=%s pod=%s", backOff.Get(key), container.Name, format.Pod(pod)) - glog.Infof("%s", err.Error()) + glog.V(3).Infof("%s", err.Error()) return true, err.Error(), kubecontainer.ErrCrashLoopBackOff } @@ -803,24 +814,6 @@ func (m *kubeGenericRuntimeManager) killPodWithSyncResult(pod *v1.Pod, runningPo return } -// isHostNetwork checks whether the pod is running in host-network mode. -func (m *kubeGenericRuntimeManager) isHostNetwork(podSandBoxID string, pod *v1.Pod) (bool, error) { - if pod != nil { - return kubecontainer.IsHostNetworkPod(pod), nil - } - - podStatus, err := m.runtimeService.PodSandboxStatus(podSandBoxID) - if err != nil { - return false, err - } - - if podStatus.GetLinux().GetNamespaces().GetOptions().GetNetwork() == runtimeapi.NamespaceMode_NODE { - return true, nil - } - - return false, nil -} - // GetPodStatus retrieves the status of the pod, including the // information of all containers in the pod that are visible in Runtime. func (m *kubeGenericRuntimeManager) GetPodStatus(uid kubetypes.UID, name, namespace string) (*kubecontainer.PodStatus, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go index 33d0881f..c9c8fd28 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go @@ -50,7 +50,16 @@ func (m *kubeGenericRuntimeManager) createPodSandbox(pod *v1.Pod, attempt uint32 return "", message, err } - podSandBoxID, err := m.runtimeService.RunPodSandbox(podSandboxConfig) + runtimeHandler := "" + if utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) && m.runtimeClassManager != nil { + runtimeHandler, err = m.runtimeClassManager.LookupRuntimeHandler(pod.Spec.RuntimeClassName) + if err != nil { + message := fmt.Sprintf("CreatePodSandbox for pod %q failed: %v", format.Pod(pod), err) + return "", message, err + } + } + + podSandBoxID, err := m.runtimeService.RunPodSandbox(podSandboxConfig, runtimeHandler) if err != nil { message := fmt.Sprintf("CreatePodSandbox for pod %q failed: %v", format.Pod(pod), err) glog.Error(message) @@ -152,6 +161,9 @@ func (m *kubeGenericRuntimeManager) generatePodSandboxLinuxConfig(pod *v1.Pod) ( if sc.RunAsUser != nil { lc.SecurityContext.RunAsUser = &runtimeapi.Int64Value{Value: int64(*sc.RunAsUser)} } + if sc.RunAsGroup != nil { + lc.SecurityContext.RunAsGroup = &runtimeapi.Int64Value{Value: int64(*sc.RunAsGroup)} + } lc.SecurityContext.NamespaceOptions = namespacesForPod(pod) if sc.FSGroup != nil { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD index ffccbf2d..ba0dc3f4 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/BUILD @@ -9,10 +9,10 @@ go_library( "//pkg/kubelet/apis/cri:go_default_library", "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", "//pkg/util/tail:go_default_library", - "//vendor/github.com/docker/docker/pkg/jsonlog:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog:go_default_library", "//vendor/github.com/fsnotify/fsnotify:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", ], ) @@ -22,9 +22,9 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go index b948c883..c81194d1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs/logs.go @@ -19,6 +19,7 @@ package logs import ( "bufio" "bytes" + "context" "encoding/json" "errors" "fmt" @@ -27,7 +28,7 @@ import ( "os" "time" - "github.com/docker/docker/pkg/jsonlog" + "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog" "github.com/fsnotify/fsnotify" "github.com/golang/glog" @@ -266,7 +267,7 @@ func (w *logWriter) write(msg *logMessage) error { // ReadLogs read the container log and redirect into stdout and stderr. // Note that containerID is only needed when following the log, or else // just pass in empty string "". -func ReadLogs(path, containerID string, opts *LogOptions, runtimeService internalapi.RuntimeService, stdout, stderr io.Writer) error { +func ReadLogs(ctx context.Context, path, containerID string, opts *LogOptions, runtimeService internalapi.RuntimeService, stdout, stderr io.Writer) error { f, err := os.Open(path) if err != nil { return fmt.Errorf("failed to open log file %q: %v", path, err) @@ -317,7 +318,7 @@ func ReadLogs(path, containerID string, opts *LogOptions, runtimeService interna } } // Wait until the next log change. - if found, err := waitLogs(containerID, watcher, runtimeService); !found { + if found, err := waitLogs(ctx, containerID, watcher, runtimeService); !found { return err } continue @@ -371,7 +372,7 @@ func isContainerRunning(id string, r internalapi.RuntimeService) (bool, error) { // waitLogs wait for the next log write. It returns a boolean and an error. The boolean // indicates whether a new log is found; the error is error happens during waiting new logs. -func waitLogs(id string, w *fsnotify.Watcher, runtimeService internalapi.RuntimeService) (bool, error) { +func waitLogs(ctx context.Context, id string, w *fsnotify.Watcher, runtimeService internalapi.RuntimeService) (bool, error) { // no need to wait if the pod is not running if running, err := isContainerRunning(id, runtimeService); !running { return false, err @@ -379,6 +380,8 @@ func waitLogs(id string, w *fsnotify.Watcher, runtimeService internalapi.Runtime errRetry := 5 for { select { + case <-ctx.Done(): + return false, fmt.Errorf("context cancelled") case e := <-w.Events: switch e.Op { case fsnotify.Write: diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go index c01fd520..7195174f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go @@ -30,7 +30,10 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po effectiveSc := securitycontext.DetermineEffectiveSecurityContext(pod, container) synthesized := convertToRuntimeSecurityContext(effectiveSc) if synthesized == nil { - synthesized = &runtimeapi.LinuxContainerSecurityContext{} + synthesized = &runtimeapi.LinuxContainerSecurityContext{ + MaskedPaths: securitycontext.ConvertToRuntimeMaskedPaths(effectiveSc.ProcMount), + ReadonlyPaths: securitycontext.ConvertToRuntimeReadonlyPaths(effectiveSc.ProcMount), + } } // set SeccompProfilePath. @@ -67,6 +70,9 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po synthesized.NoNewPrivs = securitycontext.AddNoNewPrivileges(effectiveSc) + synthesized.MaskedPaths = securitycontext.ConvertToRuntimeMaskedPaths(effectiveSc.ProcMount) + synthesized.ReadonlyPaths = securitycontext.ConvertToRuntimeReadonlyPaths(effectiveSc.ProcMount) + return synthesized } @@ -108,6 +114,9 @@ func convertToRuntimeSecurityContext(securityContext *v1.SecurityContext) *runti if securityContext.RunAsUser != nil { sc.RunAsUser = &runtimeapi.Int64Value{Value: int64(*securityContext.RunAsUser)} } + if securityContext.RunAsGroup != nil { + sc.RunAsGroup = &runtimeapi.Int64Value{Value: int64(*securityContext.RunAsGroup)} + } if securityContext.Privileged != nil { sc.Privileged = *securityContext.Privileged } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD index 74be426f..e46f9938 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/BUILD @@ -25,10 +25,10 @@ go_library( "//pkg/scheduler/algorithm/predicates:go_default_library", "//pkg/scheduler/cache:go_default_library", "//pkg/security/apparmor:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) @@ -43,9 +43,9 @@ go_test( "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/util/format:go_default_library", "//pkg/scheduler/cache:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/admission_failure_handler_stub.go b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/admission_failure_handler_stub.go index 58e675e9..7184392e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/admission_failure_handler_stub.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/admission_failure_handler_stub.go @@ -31,6 +31,6 @@ func NewAdmissionFailureHandlerStub() *AdmissionFailureHandlerStub { return &AdmissionFailureHandlerStub{} } -func (n *AdmissionFailureHandlerStub) HandleAdmissionFailure(pod *v1.Pod, failureReasons []algorithm.PredicateFailureReason) (bool, []algorithm.PredicateFailureReason, error) { +func (n *AdmissionFailureHandlerStub) HandleAdmissionFailure(admitPod *v1.Pod, failureReasons []algorithm.PredicateFailureReason) (bool, []algorithm.PredicateFailureReason, error) { return false, failureReasons, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go index b941d855..c0630ebb 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/handlers.go @@ -230,3 +230,73 @@ func noNewPrivsRequired(pod *v1.Pod) bool { } return false } + +func NewProcMountAdmitHandler(runtime kubecontainer.Runtime) PodAdmitHandler { + return &procMountAdmitHandler{ + Runtime: runtime, + } +} + +type procMountAdmitHandler struct { + kubecontainer.Runtime +} + +func (a *procMountAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult { + // If the pod is already running or terminated, no need to recheck NoNewPrivs. + if attrs.Pod.Status.Phase != v1.PodPending { + return PodAdmitResult{Admit: true} + } + + // If the containers in a pod only need the default ProcMountType, admit it. + if procMountIsDefault(attrs.Pod) { + return PodAdmitResult{Admit: true} + } + + // Always admit runtimes except docker. + if a.Runtime.Type() != kubetypes.DockerContainerRuntime { + return PodAdmitResult{Admit: true} + } + + // Make sure docker api version is valid. + // Merged in https://github.com/moby/moby/pull/36644 + rversion, err := a.Runtime.APIVersion() + if err != nil { + return PodAdmitResult{ + Admit: false, + Reason: "ProcMount", + Message: fmt.Sprintf("Cannot enforce ProcMount: %v", err), + } + } + v, err := rversion.Compare("1.38.0") + if err != nil { + return PodAdmitResult{ + Admit: false, + Reason: "ProcMount", + Message: fmt.Sprintf("Cannot enforce ProcMount: %v", err), + } + } + // If the version is less than 1.38 it will return -1 above. + if v == -1 { + return PodAdmitResult{ + Admit: false, + Reason: "ProcMount", + Message: fmt.Sprintf("Cannot enforce ProcMount: docker runtime API version %q must be greater than or equal to 1.38", rversion.String()), + } + } + + return PodAdmitResult{Admit: true} +} + +func procMountIsDefault(pod *v1.Pod) bool { + // Iterate over pod containers and check if we are using the DefaultProcMountType + // for all containers. + for _, c := range pod.Spec.Containers { + if c.SecurityContext != nil { + if c.SecurityContext.ProcMount != nil && *c.SecurityContext.ProcMount != v1.DefaultProcMount { + return false + } + } + } + + return true +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go index 420bae21..ba6d25b5 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/lifecycle/predicate.go @@ -36,7 +36,7 @@ type pluginResourceUpdateFuncType func(*schedulercache.NodeInfo, *PodAdmitAttrib // AdmissionFailureHandler is an interface which defines how to deal with a failure to admit a pod. // This allows for the graceful handling of pod admission failure. type AdmissionFailureHandler interface { - HandleAdmissionFailure(pod *v1.Pod, failureReasons []algorithm.PredicateFailureReason) (bool, []algorithm.PredicateFailureReason, error) + HandleAdmissionFailure(admitPod *v1.Pod, failureReasons []algorithm.PredicateFailureReason) (bool, []algorithm.PredicateFailureReason, error) } type predicateAdmitHandler struct { @@ -65,14 +65,14 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult Message: "Kubelet cannot get node info.", } } - pod := attrs.Pod + admitPod := attrs.Pod pods := attrs.OtherPods nodeInfo := schedulercache.NewNodeInfo(pods...) nodeInfo.SetNode(node) // ensure the node has enough plugin resources for that required in pods if err = w.pluginResourceUpdateFunc(nodeInfo, attrs); err != nil { message := fmt.Sprintf("Update plugin resources failed due to %v, which is unexpected.", err) - glog.Warningf("Failed to admit pod %v - %s", format.Pod(pod), message) + glog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) return PodAdmitResult{ Admit: false, Reason: "UnexpectedAdmissionError", @@ -88,12 +88,12 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult // node-level extended resource it requires is not found, then kubelet will // not fail admission while it should. This issue will be addressed with // the Resource Class API in the future. - podWithoutMissingExtendedResources := removeMissingExtendedResources(pod, nodeInfo) + podWithoutMissingExtendedResources := removeMissingExtendedResources(admitPod, nodeInfo) fit, reasons, err := predicates.GeneralPredicates(podWithoutMissingExtendedResources, nil, nodeInfo) if err != nil { message := fmt.Sprintf("GeneralPredicates failed due to %v, which is unexpected.", err) - glog.Warningf("Failed to admit pod %v - %s", format.Pod(pod), message) + glog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) return PodAdmitResult{ Admit: fit, Reason: "UnexpectedAdmissionError", @@ -101,10 +101,10 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult } } if !fit { - fit, reasons, err = w.admissionFailureHandler.HandleAdmissionFailure(pod, reasons) + fit, reasons, err = w.admissionFailureHandler.HandleAdmissionFailure(admitPod, reasons) if err != nil { message := fmt.Sprintf("Unexpected error while attempting to recover from admission failure: %v", err) - glog.Warningf("Failed to admit pod %v - %s", format.Pod(pod), message) + glog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) return PodAdmitResult{ Admit: fit, Reason: "UnexpectedAdmissionError", @@ -117,7 +117,7 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult var message string if len(reasons) == 0 { message = fmt.Sprint("GeneralPredicates failed due to unknown reason, which is unexpected.") - glog.Warningf("Failed to admit pod %v - %s", format.Pod(pod), message) + glog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) return PodAdmitResult{ Admit: fit, Reason: "UnknownReason", @@ -130,19 +130,19 @@ func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult case *predicates.PredicateFailureError: reason = re.PredicateName message = re.Error() - glog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(pod), message) + glog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(admitPod), message) case *predicates.InsufficientResourceError: reason = fmt.Sprintf("OutOf%s", re.ResourceName) message = re.Error() - glog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(pod), message) + glog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(admitPod), message) case *predicates.FailureReason: reason = re.GetReason() message = fmt.Sprintf("Failure: %s", re.GetReason()) - glog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(pod), message) + glog.V(2).Infof("Predicate failed on Pod: %v, for reason: %v", format.Pod(admitPod), message) default: reason = "UnexpectedPredicateFailureType" message = fmt.Sprintf("GeneralPredicates failed due to %v, which is unexpected.", r) - glog.Warningf("Failed to admit pod %v - %s", format.Pod(pod), message) + glog.Warningf("Failed to admit pod %v - %s", format.Pod(admitPod), message) } return PodAdmitResult{ Admit: fit, diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD deleted file mode 100644 index bd16b1c2..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "container_log_manager.go", - "container_log_manager_stub.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/logs", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/cri:go_default_library", - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["container_log_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/apis/cri/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go deleted file mode 100644 index 12ba95bd..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/logs/container_log_manager.go +++ /dev/null @@ -1,387 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 logs - -import ( - "compress/gzip" - "fmt" - "io" - "os" - "path/filepath" - "sort" - "strings" - "time" - - "github.com/golang/glog" - - "k8s.io/apimachinery/pkg/api/resource" - "k8s.io/apimachinery/pkg/util/clock" - "k8s.io/apimachinery/pkg/util/wait" - internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" -) - -const ( - // logMonitorPeriod is the period container log manager monitors - // container logs and performs log rotation. - logMonitorPeriod = 10 * time.Second - // timestampFormat is format of the timestamp suffix for rotated log. - // See https://golang.org/pkg/time/#Time.Format. - timestampFormat = "20060102-150405" - // compressSuffix is the suffix for compressed log. - compressSuffix = ".gz" - // tmpSuffix is the suffix for temporary file. - tmpSuffix = ".tmp" -) - -// ContainerLogManager manages lifecycle of all container logs. -// -// Implementation is thread-safe. -type ContainerLogManager interface { - // TODO(random-liu): Add RotateLogs function and call it under disk pressure. - // Start container log manager. - Start() -} - -// LogRotatePolicy is a policy for container log rotation. The policy applies to all -// containers managed by kubelet. -type LogRotatePolicy struct { - // MaxSize in bytes of the container log file before it is rotated. Negative - // number means to disable container log rotation. - MaxSize int64 - // MaxFiles is the maximum number of log files that can be present. - // If rotating the logs creates excess files, the oldest file is removed. - MaxFiles int -} - -// GetAllLogs gets all inuse (rotated/compressed) logs for a specific container log. -// Returned logs are sorted in oldest to newest order. -// TODO(#59902): Leverage this function to support log rotation in `kubectl logs`. -func GetAllLogs(log string) ([]string, error) { - // pattern is used to match all rotated files. - pattern := fmt.Sprintf("%s.*", log) - logs, err := filepath.Glob(pattern) - if err != nil { - return nil, fmt.Errorf("failed to list all log files with pattern %q: %v", pattern, err) - } - inuse, _ := filterUnusedLogs(logs) - sort.Strings(inuse) - return append(inuse, log), nil -} - -// compressReadCloser wraps gzip.Reader with a function to close file handler. -type compressReadCloser struct { - f *os.File - *gzip.Reader -} - -func (rc *compressReadCloser) Close() error { - ferr := rc.f.Close() - rerr := rc.Reader.Close() - if ferr != nil { - return ferr - } - if rerr != nil { - return rerr - } - return nil -} - -// UncompressLog compresses a compressed log and return a readcloser for the -// stream of the uncompressed content. -// TODO(#59902): Leverage this function to support log rotation in `kubectl logs`. -func UncompressLog(log string) (_ io.ReadCloser, retErr error) { - if !strings.HasSuffix(log, compressSuffix) { - return nil, fmt.Errorf("log is not compressed") - } - f, err := os.Open(log) - if err != nil { - return nil, fmt.Errorf("failed to open log: %v", err) - } - defer func() { - if retErr != nil { - f.Close() - } - }() - r, err := gzip.NewReader(f) - if err != nil { - return nil, fmt.Errorf("failed to create gzip reader: %v", err) - } - return &compressReadCloser{f: f, Reader: r}, nil -} - -// parseMaxSize parses quantity string to int64 max size in bytes. -func parseMaxSize(size string) (int64, error) { - quantity, err := resource.ParseQuantity(size) - if err != nil { - return 0, err - } - maxSize, ok := quantity.AsInt64() - if !ok { - return 0, fmt.Errorf("invalid max log size") - } - if maxSize < 0 { - return 0, fmt.Errorf("negative max log size %d", maxSize) - } - return maxSize, nil -} - -type containerLogManager struct { - runtimeService internalapi.RuntimeService - policy LogRotatePolicy - clock clock.Clock -} - -// NewContainerLogManager creates a new container log manager. -func NewContainerLogManager(runtimeService internalapi.RuntimeService, maxSize string, maxFiles int) (ContainerLogManager, error) { - if maxFiles <= 1 { - return nil, fmt.Errorf("invalid MaxFiles %d, must be > 1", maxFiles) - } - parsedMaxSize, err := parseMaxSize(maxSize) - if err != nil { - return nil, fmt.Errorf("failed to parse container log max size %q: %v", maxSize, err) - } - // policy LogRotatePolicy - return &containerLogManager{ - runtimeService: runtimeService, - policy: LogRotatePolicy{ - MaxSize: parsedMaxSize, - MaxFiles: maxFiles, - }, - clock: clock.RealClock{}, - }, nil -} - -// Start the container log manager. -func (c *containerLogManager) Start() { - // Start a goroutine periodically does container log rotation. - go wait.Forever(func() { - if err := c.rotateLogs(); err != nil { - glog.Errorf("Failed to rotate container logs: %v", err) - } - }, logMonitorPeriod) -} - -func (c *containerLogManager) rotateLogs() error { - // TODO(#59998): Use kubelet pod cache. - containers, err := c.runtimeService.ListContainers(&runtimeapi.ContainerFilter{}) - if err != nil { - return fmt.Errorf("failed to list containers: %v", err) - } - // NOTE(random-liu): Figure out whether we need to rotate container logs in parallel. - for _, container := range containers { - // Only rotate logs for running containers. Non-running containers won't - // generate new output, it doesn't make sense to keep an empty latest log. - if container.GetState() != runtimeapi.ContainerState_CONTAINER_RUNNING { - continue - } - id := container.GetId() - // Note that we should not block log rotate for an error of a single container. - status, err := c.runtimeService.ContainerStatus(id) - if err != nil { - glog.Errorf("Failed to get container status for %q: %v", id, err) - continue - } - path := status.GetLogPath() - info, err := os.Stat(path) - if err != nil { - if !os.IsNotExist(err) { - glog.Errorf("Failed to stat container log %q: %v", path, err) - continue - } - // In rotateLatestLog, there are several cases that we may - // lose original container log after ReopenContainerLog fails. - // We try to to recover it by reopening container log. - if err := c.runtimeService.ReopenContainerLog(id); err != nil { - glog.Errorf("Container %q log %q doesn't exist, reopen container log failed: %v", id, path, err) - continue - } - // The container log should be recovered. - info, err = os.Stat(path) - if err != nil { - glog.Errorf("Failed to stat container log %q after reopen: %v", path, err) - continue - } - } - if info.Size() < c.policy.MaxSize { - continue - } - // Perform log rotation. - if err := c.rotateLog(id, path); err != nil { - glog.Errorf("Failed to rotate log %q for container %q: %v", path, id, err) - continue - } - } - return nil -} - -func (c *containerLogManager) rotateLog(id, log string) error { - // pattern is used to match all rotated files. - pattern := fmt.Sprintf("%s.*", log) - logs, err := filepath.Glob(pattern) - if err != nil { - return fmt.Errorf("failed to list all log files with pattern %q: %v", pattern, err) - } - - logs, err = c.cleanupUnusedLogs(logs) - if err != nil { - return fmt.Errorf("failed to cleanup logs: %v", err) - } - - logs, err = c.removeExcessLogs(logs) - if err != nil { - return fmt.Errorf("failed to remove excess logs: %v", err) - } - - // Compress uncompressed log files. - for _, l := range logs { - if strings.HasSuffix(l, compressSuffix) { - continue - } - if err := c.compressLog(l); err != nil { - return fmt.Errorf("failed to compress log %q: %v", l, err) - } - } - - if err := c.rotateLatestLog(id, log); err != nil { - return fmt.Errorf("failed to rotate log %q: %v", log, err) - } - - return nil -} - -// cleanupUnusedLogs cleans up temporary or unused log files generated by previous log rotation -// failure. -func (c *containerLogManager) cleanupUnusedLogs(logs []string) ([]string, error) { - inuse, unused := filterUnusedLogs(logs) - for _, l := range unused { - if err := os.Remove(l); err != nil { - return nil, fmt.Errorf("failed to remove unused log %q: %v", l, err) - } - } - return inuse, nil -} - -// filterUnusedLogs splits logs into 2 groups, the 1st group is in used logs, -// the second group is unused logs. -func filterUnusedLogs(logs []string) (inuse []string, unused []string) { - for _, l := range logs { - if isInUse(l, logs) { - inuse = append(inuse, l) - } else { - unused = append(unused, l) - } - } - return inuse, unused -} - -// isInUse checks whether a container log file is still inuse. -func isInUse(l string, logs []string) bool { - // All temporary files are not in use. - if strings.HasSuffix(l, tmpSuffix) { - return false - } - // All compresed logs are in use. - if strings.HasSuffix(l, compressSuffix) { - return true - } - // Files has already been compressed are not in use. - for _, another := range logs { - if l+compressSuffix == another { - return false - } - } - return true -} - -// removeExcessLogs removes old logs to make sure there are only at most MaxFiles log files. -func (c *containerLogManager) removeExcessLogs(logs []string) ([]string, error) { - // Sort log files in oldest to newest order. - sort.Strings(logs) - // Container will create a new log file, and we'll rotate the latest log file. - // Other than those 2 files, we can have at most MaxFiles-2 rotated log files. - // Keep MaxFiles-2 files by removing old files. - // We should remove from oldest to newest, so as not to break ongoing `kubectl logs`. - maxRotatedFiles := c.policy.MaxFiles - 2 - if maxRotatedFiles < 0 { - maxRotatedFiles = 0 - } - i := 0 - for ; i < len(logs)-maxRotatedFiles; i++ { - if err := os.Remove(logs[i]); err != nil { - return nil, fmt.Errorf("failed to remove old log %q: %v", logs[i], err) - } - } - logs = logs[i:] - return logs, nil -} - -// compressLog compresses a log to log.gz with gzip. -func (c *containerLogManager) compressLog(log string) error { - r, err := os.Open(log) - if err != nil { - return fmt.Errorf("failed to open log %q: %v", log, err) - } - defer r.Close() - tmpLog := log + tmpSuffix - f, err := os.OpenFile(tmpLog, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return fmt.Errorf("failed to create temporary log %q: %v", tmpLog, err) - } - defer func() { - // Best effort cleanup of tmpLog. - os.Remove(tmpLog) - }() - defer f.Close() - w := gzip.NewWriter(f) - defer w.Close() - if _, err := io.Copy(w, r); err != nil { - return fmt.Errorf("failed to compress %q to %q: %v", log, tmpLog, err) - } - compressedLog := log + compressSuffix - if err := os.Rename(tmpLog, compressedLog); err != nil { - return fmt.Errorf("failed to rename %q to %q: %v", tmpLog, compressedLog, err) - } - // Remove old log file. - if err := os.Remove(log); err != nil { - return fmt.Errorf("failed to remove log %q after compress: %v", log, err) - } - return nil -} - -// rotateLatestLog rotates latest log without compression, so that container can still write -// and fluentd can finish reading. -func (c *containerLogManager) rotateLatestLog(id, log string) error { - timestamp := c.clock.Now().Format(timestampFormat) - rotated := fmt.Sprintf("%s.%s", log, timestamp) - if err := os.Rename(log, rotated); err != nil { - return fmt.Errorf("failed to rotate log %q to %q: %v", log, rotated, err) - } - if err := c.runtimeService.ReopenContainerLog(id); err != nil { - // Rename the rotated log back, so that we can try rotating it again - // next round. - // If kubelet gets restarted at this point, we'll lose original log. - if renameErr := os.Rename(rotated, log); renameErr != nil { - // This shouldn't happen. - // Report an error if this happens, because we will lose original - // log. - glog.Errorf("Failed to rename rotated log %q back to %q: %v, reopen container log error: %v", rotated, log, renameErr, err) - } - return fmt.Errorf("failed to reopen container log %q: %v", id, err) - } - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD index 8e604150..4587b6b7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/BUILD @@ -12,10 +12,10 @@ go_library( deps = [ "//pkg/features:go_default_library", "//pkg/kubelet/container:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD deleted file mode 100644 index 792e8cf3..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["volume_stats.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/metrics/collectors", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "helper_test.go", - "volume_stats_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/server/stats/testing:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/github.com/prometheus/client_model/go:go_default_library", - "//vendor/github.com/prometheus/common/expfmt:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/volume_stats.go b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/volume_stats.go deleted file mode 100644 index e6f1cf36..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/collectors/volume_stats.go +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 collectors - -import ( - "github.com/golang/glog" - "github.com/prometheus/client_golang/prometheus" - "k8s.io/apimachinery/pkg/util/sets" - stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/metrics" - serverstats "k8s.io/kubernetes/pkg/kubelet/server/stats" -) - -var ( - volumeStatsCapacityBytesDesc = prometheus.NewDesc( - prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsCapacityBytesKey), - "Capacity in bytes of the volume", - []string{"namespace", "persistentvolumeclaim"}, nil, - ) - volumeStatsAvailableBytesDesc = prometheus.NewDesc( - prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsAvailableBytesKey), - "Number of available bytes in the volume", - []string{"namespace", "persistentvolumeclaim"}, nil, - ) - volumeStatsUsedBytesDesc = prometheus.NewDesc( - prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsUsedBytesKey), - "Number of used bytes in the volume", - []string{"namespace", "persistentvolumeclaim"}, nil, - ) - volumeStatsInodesDesc = prometheus.NewDesc( - prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsInodesKey), - "Maximum number of inodes in the volume", - []string{"namespace", "persistentvolumeclaim"}, nil, - ) - volumeStatsInodesFreeDesc = prometheus.NewDesc( - prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsInodesFreeKey), - "Number of free inodes in the volume", - []string{"namespace", "persistentvolumeclaim"}, nil, - ) - volumeStatsInodesUsedDesc = prometheus.NewDesc( - prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsInodesUsedKey), - "Number of used inodes in the volume", - []string{"namespace", "persistentvolumeclaim"}, nil, - ) -) - -type volumeStatsCollector struct { - statsProvider serverstats.StatsProvider -} - -// NewVolumeStatsCollector creates a volume stats prometheus collector. -func NewVolumeStatsCollector(statsProvider serverstats.StatsProvider) prometheus.Collector { - return &volumeStatsCollector{statsProvider: statsProvider} -} - -// Describe implements the prometheus.Collector interface. -func (collector *volumeStatsCollector) Describe(ch chan<- *prometheus.Desc) { - ch <- volumeStatsCapacityBytesDesc - ch <- volumeStatsAvailableBytesDesc - ch <- volumeStatsUsedBytesDesc - ch <- volumeStatsInodesDesc - ch <- volumeStatsInodesFreeDesc - ch <- volumeStatsInodesUsedDesc -} - -// Collect implements the prometheus.Collector interface. -func (collector *volumeStatsCollector) Collect(ch chan<- prometheus.Metric) { - podStats, err := collector.statsProvider.ListPodStats() - if err != nil { - return - } - addGauge := func(desc *prometheus.Desc, pvcRef *stats.PVCReference, v float64, lv ...string) { - lv = append([]string{pvcRef.Namespace, pvcRef.Name}, lv...) - metric, err := prometheus.NewConstMetric(desc, prometheus.GaugeValue, v, lv...) - if err != nil { - glog.Warningf("Failed to generate metric: %v", err) - return - } - ch <- metric - } - allPVCs := sets.String{} - for _, podStat := range podStats { - if podStat.VolumeStats == nil { - continue - } - for _, volumeStat := range podStat.VolumeStats { - pvcRef := volumeStat.PVCRef - if pvcRef == nil { - // ignore if no PVC reference - continue - } - pvcUniqStr := pvcRef.Namespace + "/" + pvcRef.Name - if allPVCs.Has(pvcUniqStr) { - // ignore if already collected - continue - } - addGauge(volumeStatsCapacityBytesDesc, pvcRef, float64(*volumeStat.CapacityBytes)) - addGauge(volumeStatsAvailableBytesDesc, pvcRef, float64(*volumeStat.AvailableBytes)) - addGauge(volumeStatsUsedBytesDesc, pvcRef, float64(*volumeStat.UsedBytes)) - addGauge(volumeStatsInodesDesc, pvcRef, float64(*volumeStat.Inodes)) - addGauge(volumeStatsInodesFreeDesc, pvcRef, float64(*volumeStat.InodesFree)) - addGauge(volumeStatsInodesUsedDesc, pvcRef, float64(*volumeStat.InodesUsed)) - allPVCs.Insert(pvcUniqStr) - } - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go index 05825325..8a2e027a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/metrics/metrics.go @@ -84,7 +84,7 @@ var ( prometheus.SummaryOpts{ Subsystem: KubeletSubsystem, Name: PodStartLatencyKey, - Help: "Latency in microseconds for a single pod to go from pending to running. Broken down by podname.", + Help: "Latency in microseconds for a single pod to go from pending to running.", }, ) CgroupManagerLatency = prometheus.NewSummaryVec( diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/BUILD deleted file mode 100644 index f606715a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["mount_pod.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/mountpod", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/util/strings:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["mount_pod_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/mount_pod.go b/vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/mount_pod.go deleted file mode 100644 index 6c7afda4..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/mountpod/mount_pod.go +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 mountpod - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path" - - "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/kubelet/config" - kubepod "k8s.io/kubernetes/pkg/kubelet/pod" - "k8s.io/kubernetes/pkg/util/strings" -) - -// Manager is an interface that tracks pods with mount utilities for individual -// volume plugins. -type Manager interface { - GetMountPod(pluginName string) (pod *v1.Pod, container string, err error) -} - -// basicManager is simple implementation of Manager. Pods with mount utilities -// are registered by placing a JSON file into -// /var/lib/kubelet/plugin-containers/.json and this manager just -// finds them there. -type basicManager struct { - registrationDirectory string - podManager kubepod.Manager -} - -// volumePluginRegistration specified format of the json files placed in -// /var/lib/kubelet/plugin-containers/ -type volumePluginRegistration struct { - PodName string `json:"podName"` - PodNamespace string `json:"podNamespace"` - PodUID string `json:"podUID"` - ContainerName string `json:"containerName"` -} - -// NewManager returns a new mount pod manager. -func NewManager(rootDirectory string, podManager kubepod.Manager) (Manager, error) { - regPath := path.Join(rootDirectory, config.DefaultKubeletPluginContainersDirName) - - // Create the directory on startup - os.MkdirAll(regPath, 0700) - - return &basicManager{ - registrationDirectory: regPath, - podManager: podManager, - }, nil -} - -func (m *basicManager) getVolumePluginRegistrationPath(pluginName string) string { - // sanitize plugin name so it does not escape directory - safePluginName := strings.EscapePluginName(pluginName) + ".json" - return path.Join(m.registrationDirectory, safePluginName) -} - -func (m *basicManager) GetMountPod(pluginName string) (pod *v1.Pod, containerName string, err error) { - // Read /var/lib/kubelet/plugin-containers/.json - regPath := m.getVolumePluginRegistrationPath(pluginName) - regBytes, err := ioutil.ReadFile(regPath) - if err != nil { - if os.IsNotExist(err) { - // No pod is registered for this plugin - return nil, "", nil - } - return nil, "", fmt.Errorf("cannot read %s: %v", regPath, err) - } - - // Parse json - var reg volumePluginRegistration - if err := json.Unmarshal(regBytes, ®); err != nil { - return nil, "", fmt.Errorf("unable to parse %s: %s", regPath, err) - } - if len(reg.ContainerName) == 0 { - return nil, "", fmt.Errorf("unable to parse %s: \"containerName\" is not set", regPath) - } - if len(reg.PodUID) == 0 { - return nil, "", fmt.Errorf("unable to parse %s: \"podUID\" is not set", regPath) - } - if len(reg.PodNamespace) == 0 { - return nil, "", fmt.Errorf("unable to parse %s: \"podNamespace\" is not set", regPath) - } - if len(reg.PodName) == 0 { - return nil, "", fmt.Errorf("unable to parse %s: \"podName\" is not set", regPath) - } - - pod, ok := m.podManager.GetPodByName(reg.PodNamespace, reg.PodName) - if !ok { - return nil, "", fmt.Errorf("unable to process %s: pod %s/%s not found", regPath, reg.PodNamespace, reg.PodName) - } - if string(pod.UID) != reg.PodUID { - return nil, "", fmt.Errorf("unable to process %s: pod %s/%s has unexpected UID", regPath, reg.PodNamespace, reg.PodName) - } - // make sure that reg.ContainerName exists in the pod - for i := range pod.Spec.Containers { - if pod.Spec.Containers[i].Name == reg.ContainerName { - return pod, reg.ContainerName, nil - } - } - return nil, "", fmt.Errorf("unable to process %s: pod %s/%s has no container named %q", regPath, reg.PodNamespace, reg.PodName, reg.ContainerName) - -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD deleted file mode 100644 index 28989f99..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["dns.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/network/dns", - visibility = ["//visibility:public"], - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["dns_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/OWNERS deleted file mode 100644 index b5c11e8c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -approvers: -- sig-network-approvers -reviewers: -- sig-network-reviewers diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go b/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go deleted file mode 100644 index a3e42358..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/dns/dns.go +++ /dev/null @@ -1,414 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 dns - -import ( - "fmt" - "io" - "io/ioutil" - "net" - "os" - "path/filepath" - "strings" - - "k8s.io/api/core/v1" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/client-go/tools/record" - "k8s.io/kubernetes/pkg/apis/core/validation" - "k8s.io/kubernetes/pkg/features" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/util/format" - - "github.com/golang/glog" -) - -var ( - // The default dns opt strings. - defaultDNSOptions = []string{"ndots:5"} -) - -type podDNSType int - -const ( - podDNSCluster podDNSType = iota - podDNSHost - podDNSNone -) - -// Configurer is used for setting up DNS resolver configuration when launching pods. -type Configurer struct { - recorder record.EventRecorder - nodeRef *v1.ObjectReference - nodeIP net.IP - - // If non-nil, use this for container DNS server. - clusterDNS []net.IP - // If non-empty, use this for container DNS search. - ClusterDomain string - // The path to the DNS resolver configuration file used as the base to generate - // the container's DNS resolver configuration file. This can be used in - // conjunction with clusterDomain and clusterDNS. - ResolverConfig string -} - -// NewConfigurer returns a DNS configurer for launching pods. -func NewConfigurer(recorder record.EventRecorder, nodeRef *v1.ObjectReference, nodeIP net.IP, clusterDNS []net.IP, clusterDomain, resolverConfig string) *Configurer { - return &Configurer{ - recorder: recorder, - nodeRef: nodeRef, - nodeIP: nodeIP, - clusterDNS: clusterDNS, - ClusterDomain: clusterDomain, - ResolverConfig: resolverConfig, - } -} - -func omitDuplicates(strs []string) []string { - uniqueStrs := make(map[string]bool) - - var ret []string - for _, str := range strs { - if !uniqueStrs[str] { - ret = append(ret, str) - uniqueStrs[str] = true - } - } - return ret -} - -func (c *Configurer) formDNSSearchFitsLimits(composedSearch []string, pod *v1.Pod) []string { - limitsExceeded := false - - if len(composedSearch) > validation.MaxDNSSearchPaths { - composedSearch = composedSearch[:validation.MaxDNSSearchPaths] - limitsExceeded = true - } - - if resolvSearchLineStrLen := len(strings.Join(composedSearch, " ")); resolvSearchLineStrLen > validation.MaxDNSSearchListChars { - cutDomainsNum := 0 - cutDomainsLen := 0 - for i := len(composedSearch) - 1; i >= 0; i-- { - cutDomainsLen += len(composedSearch[i]) + 1 - cutDomainsNum++ - - if (resolvSearchLineStrLen - cutDomainsLen) <= validation.MaxDNSSearchListChars { - break - } - } - - composedSearch = composedSearch[:(len(composedSearch) - cutDomainsNum)] - limitsExceeded = true - } - - if limitsExceeded { - log := fmt.Sprintf("Search Line limits were exceeded, some search paths have been omitted, the applied search line is: %s", strings.Join(composedSearch, " ")) - c.recorder.Event(pod, v1.EventTypeWarning, "DNSConfigForming", log) - glog.Error(log) - } - return composedSearch -} - -func (c *Configurer) formDNSNameserversFitsLimits(nameservers []string, pod *v1.Pod) []string { - if len(nameservers) > validation.MaxDNSNameservers { - nameservers = nameservers[0:validation.MaxDNSNameservers] - log := fmt.Sprintf("Nameserver limits were exceeded, some nameservers have been omitted, the applied nameserver line is: %s", strings.Join(nameservers, " ")) - c.recorder.Event(pod, v1.EventTypeWarning, "DNSConfigForming", log) - glog.Error(log) - } - return nameservers -} - -func (c *Configurer) formDNSConfigFitsLimits(dnsConfig *runtimeapi.DNSConfig, pod *v1.Pod) *runtimeapi.DNSConfig { - dnsConfig.Servers = c.formDNSNameserversFitsLimits(dnsConfig.Servers, pod) - dnsConfig.Searches = c.formDNSSearchFitsLimits(dnsConfig.Searches, pod) - return dnsConfig -} - -func (c *Configurer) generateSearchesForDNSClusterFirst(hostSearch []string, pod *v1.Pod) []string { - if c.ClusterDomain == "" { - return hostSearch - } - - nsSvcDomain := fmt.Sprintf("%s.svc.%s", pod.Namespace, c.ClusterDomain) - svcDomain := fmt.Sprintf("svc.%s", c.ClusterDomain) - clusterSearch := []string{nsSvcDomain, svcDomain, c.ClusterDomain} - - return omitDuplicates(append(clusterSearch, hostSearch...)) -} - -// CheckLimitsForResolvConf checks limits in resolv.conf. -func (c *Configurer) CheckLimitsForResolvConf() { - f, err := os.Open(c.ResolverConfig) - if err != nil { - c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", err.Error()) - glog.Error("CheckLimitsForResolvConf: " + err.Error()) - return - } - defer f.Close() - - _, hostSearch, _, err := parseResolvConf(f) - if err != nil { - c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", err.Error()) - glog.Error("CheckLimitsForResolvConf: " + err.Error()) - return - } - - domainCountLimit := validation.MaxDNSSearchPaths - - if c.ClusterDomain != "" { - domainCountLimit -= 3 - } - - if len(hostSearch) > domainCountLimit { - log := fmt.Sprintf("Resolv.conf file '%s' contains search line consisting of more than %d domains!", c.ResolverConfig, domainCountLimit) - c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", log) - glog.Error("CheckLimitsForResolvConf: " + log) - return - } - - if len(strings.Join(hostSearch, " ")) > validation.MaxDNSSearchListChars { - log := fmt.Sprintf("Resolv.conf file '%s' contains search line which length is more than allowed %d chars!", c.ResolverConfig, validation.MaxDNSSearchListChars) - c.recorder.Event(c.nodeRef, v1.EventTypeWarning, "CheckLimitsForResolvConf", log) - glog.Error("CheckLimitsForResolvConf: " + log) - return - } - - return -} - -// parseResolveConf reads a resolv.conf file from the given reader, and parses -// it into nameservers, searches and options, possibly returning an error. -func parseResolvConf(reader io.Reader) (nameservers []string, searches []string, options []string, err error) { - file, err := ioutil.ReadAll(reader) - if err != nil { - return nil, nil, nil, err - } - - // Lines of the form "nameserver 1.2.3.4" accumulate. - nameservers = []string{} - - // Lines of the form "search example.com" overrule - last one wins. - searches = []string{} - - // Lines of the form "option ndots:5 attempts:2" overrule - last one wins. - // Each option is recorded as an element in the array. - options = []string{} - - lines := strings.Split(string(file), "\n") - for l := range lines { - trimmed := strings.TrimSpace(lines[l]) - if strings.HasPrefix(trimmed, "#") { - continue - } - fields := strings.Fields(trimmed) - if len(fields) == 0 { - continue - } - if fields[0] == "nameserver" && len(fields) >= 2 { - nameservers = append(nameservers, fields[1]) - } - if fields[0] == "search" { - searches = fields[1:] - } - if fields[0] == "options" { - options = fields[1:] - } - } - - return nameservers, searches, options, nil -} - -func (c *Configurer) getHostDNSConfig(pod *v1.Pod) (*runtimeapi.DNSConfig, error) { - var hostDNS, hostSearch, hostOptions []string - // Get host DNS settings - if c.ResolverConfig != "" { - f, err := os.Open(c.ResolverConfig) - if err != nil { - return nil, err - } - defer f.Close() - - hostDNS, hostSearch, hostOptions, err = parseResolvConf(f) - if err != nil { - return nil, err - } - } - return &runtimeapi.DNSConfig{ - Servers: hostDNS, - Searches: hostSearch, - Options: hostOptions, - }, nil -} - -func getPodDNSType(pod *v1.Pod) (podDNSType, error) { - dnsPolicy := pod.Spec.DNSPolicy - switch dnsPolicy { - case v1.DNSNone: - if utilfeature.DefaultFeatureGate.Enabled(features.CustomPodDNS) { - return podDNSNone, nil - } - // This should not happen as kube-apiserver should have rejected - // setting dnsPolicy to DNSNone when feature gate is disabled. - return podDNSCluster, fmt.Errorf(fmt.Sprintf("invalid DNSPolicy=%v: custom pod DNS is disabled", dnsPolicy)) - case v1.DNSClusterFirstWithHostNet: - return podDNSCluster, nil - case v1.DNSClusterFirst: - if !kubecontainer.IsHostNetworkPod(pod) { - return podDNSCluster, nil - } - // Fallback to DNSDefault for pod on hostnetowrk. - fallthrough - case v1.DNSDefault: - return podDNSHost, nil - } - // This should not happen as kube-apiserver should have rejected - // invalid dnsPolicy. - return podDNSCluster, fmt.Errorf(fmt.Sprintf("invalid DNSPolicy=%v", dnsPolicy)) -} - -// Merge DNS options. If duplicated, entries given by PodDNSConfigOption will -// overwrite the existing ones. -func mergeDNSOptions(existingDNSConfigOptions []string, dnsConfigOptions []v1.PodDNSConfigOption) []string { - optionsMap := make(map[string]string) - for _, op := range existingDNSConfigOptions { - if index := strings.Index(op, ":"); index != -1 { - optionsMap[op[:index]] = op[index+1:] - } else { - optionsMap[op] = "" - } - } - for _, op := range dnsConfigOptions { - if op.Value != nil { - optionsMap[op.Name] = *op.Value - } else { - optionsMap[op.Name] = "" - } - } - // Reconvert DNS options into a string array. - options := []string{} - for opName, opValue := range optionsMap { - op := opName - if opValue != "" { - op = op + ":" + opValue - } - options = append(options, op) - } - return options -} - -// appendDNSConfig appends DNS servers, search paths and options given by -// PodDNSConfig to the existing DNS config. Duplicated entries will be merged. -// This assumes existingDNSConfig and dnsConfig are not nil. -func appendDNSConfig(existingDNSConfig *runtimeapi.DNSConfig, dnsConfig *v1.PodDNSConfig) *runtimeapi.DNSConfig { - existingDNSConfig.Servers = omitDuplicates(append(existingDNSConfig.Servers, dnsConfig.Nameservers...)) - existingDNSConfig.Searches = omitDuplicates(append(existingDNSConfig.Searches, dnsConfig.Searches...)) - existingDNSConfig.Options = mergeDNSOptions(existingDNSConfig.Options, dnsConfig.Options) - return existingDNSConfig -} - -// GetPodDNS returns DNS settings for the pod. -func (c *Configurer) GetPodDNS(pod *v1.Pod) (*runtimeapi.DNSConfig, error) { - dnsConfig, err := c.getHostDNSConfig(pod) - if err != nil { - return nil, err - } - - dnsType, err := getPodDNSType(pod) - if err != nil { - glog.Errorf("Failed to get DNS type for pod %q: %v. Falling back to DNSClusterFirst policy.", format.Pod(pod), err) - dnsType = podDNSCluster - } - switch dnsType { - case podDNSNone: - // DNSNone should use empty DNS settings as the base. - dnsConfig = &runtimeapi.DNSConfig{} - case podDNSCluster: - if len(c.clusterDNS) != 0 { - // For a pod with DNSClusterFirst policy, the cluster DNS server is - // the only nameserver configured for the pod. The cluster DNS server - // itself will forward queries to other nameservers that is configured - // to use, in case the cluster DNS server cannot resolve the DNS query - // itself. - dnsConfig.Servers = []string{} - for _, ip := range c.clusterDNS { - dnsConfig.Servers = append(dnsConfig.Servers, ip.String()) - } - dnsConfig.Searches = c.generateSearchesForDNSClusterFirst(dnsConfig.Searches, pod) - dnsConfig.Options = defaultDNSOptions - break - } - // clusterDNS is not known. Pod with ClusterDNSFirst Policy cannot be created. - nodeErrorMsg := fmt.Sprintf("kubelet does not have ClusterDNS IP configured and cannot create Pod using %q policy. Falling back to %q policy.", v1.DNSClusterFirst, v1.DNSDefault) - c.recorder.Eventf(c.nodeRef, v1.EventTypeWarning, "MissingClusterDNS", nodeErrorMsg) - c.recorder.Eventf(pod, v1.EventTypeWarning, "MissingClusterDNS", "pod: %q. %s", format.Pod(pod), nodeErrorMsg) - // Fallback to DNSDefault. - fallthrough - case podDNSHost: - // When the kubelet --resolv-conf flag is set to the empty string, use - // DNS settings that override the docker default (which is to use - // /etc/resolv.conf) and effectively disable DNS lookups. According to - // the bind documentation, the behavior of the DNS client library when - // "nameservers" are not specified is to "use the nameserver on the - // local machine". A nameserver setting of localhost is equivalent to - // this documented behavior. - if c.ResolverConfig == "" { - switch { - case c.nodeIP == nil || c.nodeIP.To4() != nil: - dnsConfig.Servers = []string{"127.0.0.1"} - case c.nodeIP.To16() != nil: - dnsConfig.Servers = []string{"::1"} - } - dnsConfig.Searches = []string{"."} - } - } - - if utilfeature.DefaultFeatureGate.Enabled(features.CustomPodDNS) && pod.Spec.DNSConfig != nil { - dnsConfig = appendDNSConfig(dnsConfig, pod.Spec.DNSConfig) - } - return c.formDNSConfigFitsLimits(dnsConfig, pod), nil -} - -// SetupDNSinContainerizedMounter replaces the nameserver in containerized-mounter's rootfs/etc/resolve.conf with kubelet.ClusterDNS -func (c *Configurer) SetupDNSinContainerizedMounter(mounterPath string) { - resolvePath := filepath.Join(strings.TrimSuffix(mounterPath, "/mounter"), "rootfs", "etc", "resolv.conf") - dnsString := "" - for _, dns := range c.clusterDNS { - dnsString = dnsString + fmt.Sprintf("nameserver %s\n", dns) - } - if c.ResolverConfig != "" { - f, err := os.Open(c.ResolverConfig) - defer f.Close() - if err != nil { - glog.Error("Could not open resolverConf file") - } else { - _, hostSearch, _, err := parseResolvConf(f) - if err != nil { - glog.Errorf("Error for parsing the reslov.conf file: %v", err) - } else { - dnsString = dnsString + "search" - for _, search := range hostSearch { - dnsString = dnsString + fmt.Sprintf(" %s", search) - } - dnsString = dnsString + "\n" - } - } - } - if err := ioutil.WriteFile(resolvePath, []byte(dnsString), 0600); err != nil { - glog.Errorf("Could not write dns nameserver in file %s, with error %v", resolvePath, err) - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/oom_watcher.go b/vendor/k8s.io/kubernetes/pkg/kubelet/oom_watcher.go deleted file mode 100644 index 448082b0..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/oom_watcher.go +++ /dev/null @@ -1,74 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 kubelet - -import ( - "github.com/golang/glog" - "github.com/google/cadvisor/events" - cadvisorapi "github.com/google/cadvisor/info/v1" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/client-go/tools/record" - "k8s.io/kubernetes/pkg/kubelet/cadvisor" -) - -// OOMWatcher defines the interface of OOM watchers. -type OOMWatcher interface { - Start(ref *v1.ObjectReference) error -} - -type realOOMWatcher struct { - cadvisor cadvisor.Interface - recorder record.EventRecorder -} - -// NewOOMWatcher creates and initializes a OOMWatcher based on parameters. -func NewOOMWatcher(cadvisor cadvisor.Interface, recorder record.EventRecorder) OOMWatcher { - return &realOOMWatcher{ - cadvisor: cadvisor, - recorder: recorder, - } -} - -const systemOOMEvent = "SystemOOM" - -// Watches cadvisor for system oom's and records an event for every system oom encountered. -func (ow *realOOMWatcher) Start(ref *v1.ObjectReference) error { - request := events.Request{ - EventType: map[cadvisorapi.EventType]bool{ - cadvisorapi.EventOom: true, - }, - ContainerName: "/", - IncludeSubcontainers: false, - } - eventChannel, err := ow.cadvisor.WatchEvents(&request) - if err != nil { - return err - } - - go func() { - defer runtime.HandleCrash() - - for event := range eventChannel.GetChannel() { - glog.V(2).Infof("Got sys oom event from cadvisor: %v", event) - ow.recorder.PastEventf(ref, metav1.Time{Time: event.Timestamp}, v1.EventTypeWarning, systemOOMEvent, "System OOM encountered") - } - glog.Errorf("Unexpectedly stopped receiving OOM notifications from cAdvisor") - }() - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD deleted file mode 100644 index 7138d64b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generic.go", - "pleg.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/pleg", - deps = [ - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/metrics:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["generic_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/doc.go deleted file mode 100644 index 2263f2ca..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 pleg contains types and a generic implementation of the pod -// lifecycle event generator. -package pleg // import "k8s.io/kubernetes/pkg/kubelet/pleg" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go deleted file mode 100644 index d9286c96..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go +++ /dev/null @@ -1,464 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 pleg - -import ( - "fmt" - "sync/atomic" - "time" - - "github.com/golang/glog" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/clock" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/metrics" -) - -// GenericPLEG is an extremely simple generic PLEG that relies solely on -// periodic listing to discover container changes. It should be used -// as temporary replacement for container runtimes do not support a proper -// event generator yet. -// -// Note that GenericPLEG assumes that a container would not be created, -// terminated, and garbage collected within one relist period. If such an -// incident happens, GenenricPLEG would miss all events regarding this -// container. In the case of relisting failure, the window may become longer. -// Note that this assumption is not unique -- many kubelet internal components -// rely on terminated containers as tombstones for bookkeeping purposes. The -// garbage collector is implemented to work with such situations. However, to -// guarantee that kubelet can handle missing container events, it is -// recommended to set the relist period short and have an auxiliary, longer -// periodic sync in kubelet as the safety net. -type GenericPLEG struct { - // The period for relisting. - relistPeriod time.Duration - // The container runtime. - runtime kubecontainer.Runtime - // The channel from which the subscriber listens events. - eventChannel chan *PodLifecycleEvent - // The internal cache for pod/container information. - podRecords podRecords - // Time of the last relisting. - relistTime atomic.Value - // Cache for storing the runtime states required for syncing pods. - cache kubecontainer.Cache - // For testability. - clock clock.Clock - // Pods that failed to have their status retrieved during a relist. These pods will be - // retried during the next relisting. - podsToReinspect map[types.UID]*kubecontainer.Pod -} - -// plegContainerState has a one-to-one mapping to the -// kubecontainer.ContainerState except for the non-existent state. This state -// is introduced here to complete the state transition scenarios. -type plegContainerState string - -const ( - plegContainerRunning plegContainerState = "running" - plegContainerExited plegContainerState = "exited" - plegContainerUnknown plegContainerState = "unknown" - plegContainerNonExistent plegContainerState = "non-existent" - - // The threshold needs to be greater than the relisting period + the - // relisting time, which can vary significantly. Set a conservative - // threshold to avoid flipping between healthy and unhealthy. - relistThreshold = 3 * time.Minute -) - -func convertState(state kubecontainer.ContainerState) plegContainerState { - switch state { - case kubecontainer.ContainerStateCreated: - // kubelet doesn't use the "created" state yet, hence convert it to "unknown". - return plegContainerUnknown - case kubecontainer.ContainerStateRunning: - return plegContainerRunning - case kubecontainer.ContainerStateExited: - return plegContainerExited - case kubecontainer.ContainerStateUnknown: - return plegContainerUnknown - default: - panic(fmt.Sprintf("unrecognized container state: %v", state)) - } -} - -type podRecord struct { - old *kubecontainer.Pod - current *kubecontainer.Pod -} - -type podRecords map[types.UID]*podRecord - -func NewGenericPLEG(runtime kubecontainer.Runtime, channelCapacity int, - relistPeriod time.Duration, cache kubecontainer.Cache, clock clock.Clock) PodLifecycleEventGenerator { - return &GenericPLEG{ - relistPeriod: relistPeriod, - runtime: runtime, - eventChannel: make(chan *PodLifecycleEvent, channelCapacity), - podRecords: make(podRecords), - cache: cache, - clock: clock, - } -} - -// Returns a channel from which the subscriber can receive PodLifecycleEvent -// events. -// TODO: support multiple subscribers. -func (g *GenericPLEG) Watch() chan *PodLifecycleEvent { - return g.eventChannel -} - -// Start spawns a goroutine to relist periodically. -func (g *GenericPLEG) Start() { - go wait.Until(g.relist, g.relistPeriod, wait.NeverStop) -} - -func (g *GenericPLEG) Healthy() (bool, error) { - relistTime := g.getRelistTime() - elapsed := g.clock.Since(relistTime) - if elapsed > relistThreshold { - return false, fmt.Errorf("pleg was last seen active %v ago; threshold is %v", elapsed, relistThreshold) - } - return true, nil -} - -func generateEvents(podID types.UID, cid string, oldState, newState plegContainerState) []*PodLifecycleEvent { - if newState == oldState { - return nil - } - - glog.V(4).Infof("GenericPLEG: %v/%v: %v -> %v", podID, cid, oldState, newState) - switch newState { - case plegContainerRunning: - return []*PodLifecycleEvent{{ID: podID, Type: ContainerStarted, Data: cid}} - case plegContainerExited: - return []*PodLifecycleEvent{{ID: podID, Type: ContainerDied, Data: cid}} - case plegContainerUnknown: - return []*PodLifecycleEvent{{ID: podID, Type: ContainerChanged, Data: cid}} - case plegContainerNonExistent: - switch oldState { - case plegContainerExited: - // We already reported that the container died before. - return []*PodLifecycleEvent{{ID: podID, Type: ContainerRemoved, Data: cid}} - default: - return []*PodLifecycleEvent{{ID: podID, Type: ContainerDied, Data: cid}, {ID: podID, Type: ContainerRemoved, Data: cid}} - } - default: - panic(fmt.Sprintf("unrecognized container state: %v", newState)) - } -} - -func (g *GenericPLEG) getRelistTime() time.Time { - val := g.relistTime.Load() - if val == nil { - return time.Time{} - } - return val.(time.Time) -} - -func (g *GenericPLEG) updateRelistTime(timestamp time.Time) { - g.relistTime.Store(timestamp) -} - -// relist queries the container runtime for list of pods/containers, compare -// with the internal pods/containers, and generates events accordingly. -func (g *GenericPLEG) relist() { - glog.V(5).Infof("GenericPLEG: Relisting") - - if lastRelistTime := g.getRelistTime(); !lastRelistTime.IsZero() { - metrics.PLEGRelistInterval.Observe(metrics.SinceInMicroseconds(lastRelistTime)) - } - - timestamp := g.clock.Now() - defer func() { - metrics.PLEGRelistLatency.Observe(metrics.SinceInMicroseconds(timestamp)) - }() - - // Get all the pods. - podList, err := g.runtime.GetPods(true) - if err != nil { - glog.Errorf("GenericPLEG: Unable to retrieve pods: %v", err) - return - } - - g.updateRelistTime(timestamp) - - pods := kubecontainer.Pods(podList) - g.podRecords.setCurrent(pods) - - // Compare the old and the current pods, and generate events. - eventsByPodID := map[types.UID][]*PodLifecycleEvent{} - for pid := range g.podRecords { - oldPod := g.podRecords.getOld(pid) - pod := g.podRecords.getCurrent(pid) - // Get all containers in the old and the new pod. - allContainers := getContainersFromPods(oldPod, pod) - for _, container := range allContainers { - events := computeEvents(oldPod, pod, &container.ID) - for _, e := range events { - updateEvents(eventsByPodID, e) - } - } - } - - var needsReinspection map[types.UID]*kubecontainer.Pod - if g.cacheEnabled() { - needsReinspection = make(map[types.UID]*kubecontainer.Pod) - } - - // If there are events associated with a pod, we should update the - // podCache. - for pid, events := range eventsByPodID { - pod := g.podRecords.getCurrent(pid) - if g.cacheEnabled() { - // updateCache() will inspect the pod and update the cache. If an - // error occurs during the inspection, we want PLEG to retry again - // in the next relist. To achieve this, we do not update the - // associated podRecord of the pod, so that the change will be - // detect again in the next relist. - // TODO: If many pods changed during the same relist period, - // inspecting the pod and getting the PodStatus to update the cache - // serially may take a while. We should be aware of this and - // parallelize if needed. - if err := g.updateCache(pod, pid); err != nil { - glog.Errorf("PLEG: Ignoring events for pod %s/%s: %v", pod.Name, pod.Namespace, err) - - // make sure we try to reinspect the pod during the next relisting - needsReinspection[pid] = pod - - continue - } else if _, found := g.podsToReinspect[pid]; found { - // this pod was in the list to reinspect and we did so because it had events, so remove it - // from the list (we don't want the reinspection code below to inspect it a second time in - // this relist execution) - delete(g.podsToReinspect, pid) - } - } - // Update the internal storage and send out the events. - g.podRecords.update(pid) - for i := range events { - // Filter out events that are not reliable and no other components use yet. - if events[i].Type == ContainerChanged { - continue - } - g.eventChannel <- events[i] - } - } - - if g.cacheEnabled() { - // reinspect any pods that failed inspection during the previous relist - if len(g.podsToReinspect) > 0 { - glog.V(5).Infof("GenericPLEG: Reinspecting pods that previously failed inspection") - for pid, pod := range g.podsToReinspect { - if err := g.updateCache(pod, pid); err != nil { - glog.Errorf("PLEG: pod %s/%s failed reinspection: %v", pod.Name, pod.Namespace, err) - needsReinspection[pid] = pod - } - } - } - - // Update the cache timestamp. This needs to happen *after* - // all pods have been properly updated in the cache. - g.cache.UpdateTime(timestamp) - } - - // make sure we retain the list of pods that need reinspecting the next time relist is called - g.podsToReinspect = needsReinspection -} - -func getContainersFromPods(pods ...*kubecontainer.Pod) []*kubecontainer.Container { - cidSet := sets.NewString() - var containers []*kubecontainer.Container - for _, p := range pods { - if p == nil { - continue - } - for _, c := range p.Containers { - cid := string(c.ID.ID) - if cidSet.Has(cid) { - continue - } - cidSet.Insert(cid) - containers = append(containers, c) - } - // Update sandboxes as containers - // TODO: keep track of sandboxes explicitly. - for _, c := range p.Sandboxes { - cid := string(c.ID.ID) - if cidSet.Has(cid) { - continue - } - cidSet.Insert(cid) - containers = append(containers, c) - } - - } - return containers -} - -func computeEvents(oldPod, newPod *kubecontainer.Pod, cid *kubecontainer.ContainerID) []*PodLifecycleEvent { - var pid types.UID - if oldPod != nil { - pid = oldPod.ID - } else if newPod != nil { - pid = newPod.ID - } - oldState := getContainerState(oldPod, cid) - newState := getContainerState(newPod, cid) - return generateEvents(pid, cid.ID, oldState, newState) -} - -func (g *GenericPLEG) cacheEnabled() bool { - return g.cache != nil -} - -// Preserve an older cached status' pod IP if the new status has no pod IP -// and its sandboxes have exited -func (g *GenericPLEG) getPodIP(pid types.UID, status *kubecontainer.PodStatus) string { - if status.IP != "" { - return status.IP - } - - oldStatus, err := g.cache.Get(pid) - if err != nil || oldStatus.IP == "" { - return "" - } - - for _, sandboxStatus := range status.SandboxStatuses { - // If at least one sandbox is ready, then use this status update's pod IP - if sandboxStatus.State == runtimeapi.PodSandboxState_SANDBOX_READY { - return status.IP - } - } - - if len(status.SandboxStatuses) == 0 { - // Without sandboxes (which built-in runtimes like rkt don't report) - // look at all the container statuses, and if any containers are - // running then use the new pod IP - for _, containerStatus := range status.ContainerStatuses { - if containerStatus.State == kubecontainer.ContainerStateCreated || containerStatus.State == kubecontainer.ContainerStateRunning { - return status.IP - } - } - } - - // For pods with no ready containers or sandboxes (like exited pods) - // use the old status' pod IP - return oldStatus.IP -} - -func (g *GenericPLEG) updateCache(pod *kubecontainer.Pod, pid types.UID) error { - if pod == nil { - // The pod is missing in the current relist. This means that - // the pod has no visible (active or inactive) containers. - glog.V(4).Infof("PLEG: Delete status for pod %q", string(pid)) - g.cache.Delete(pid) - return nil - } - timestamp := g.clock.Now() - // TODO: Consider adding a new runtime method - // GetPodStatus(pod *kubecontainer.Pod) so that Docker can avoid listing - // all containers again. - status, err := g.runtime.GetPodStatus(pod.ID, pod.Name, pod.Namespace) - glog.V(4).Infof("PLEG: Write status for %s/%s: %#v (err: %v)", pod.Name, pod.Namespace, status, err) - if err == nil { - // Preserve the pod IP across cache updates if the new IP is empty. - // When a pod is torn down, kubelet may race with PLEG and retrieve - // a pod status after network teardown, but the kubernetes API expects - // the completed pod's IP to be available after the pod is dead. - status.IP = g.getPodIP(pid, status) - } - - g.cache.Set(pod.ID, status, err, timestamp) - return err -} - -func updateEvents(eventsByPodID map[types.UID][]*PodLifecycleEvent, e *PodLifecycleEvent) { - if e == nil { - return - } - eventsByPodID[e.ID] = append(eventsByPodID[e.ID], e) -} - -func getContainerState(pod *kubecontainer.Pod, cid *kubecontainer.ContainerID) plegContainerState { - // Default to the non-existent state. - state := plegContainerNonExistent - if pod == nil { - return state - } - c := pod.FindContainerByID(*cid) - if c != nil { - return convertState(c.State) - } - // Search through sandboxes too. - c = pod.FindSandboxByID(*cid) - if c != nil { - return convertState(c.State) - } - - return state -} - -func (pr podRecords) getOld(id types.UID) *kubecontainer.Pod { - r, ok := pr[id] - if !ok { - return nil - } - return r.old -} - -func (pr podRecords) getCurrent(id types.UID) *kubecontainer.Pod { - r, ok := pr[id] - if !ok { - return nil - } - return r.current -} - -func (pr podRecords) setCurrent(pods []*kubecontainer.Pod) { - for i := range pr { - pr[i].current = nil - } - for _, pod := range pods { - if r, ok := pr[pod.ID]; ok { - r.current = pod - } else { - pr[pod.ID] = &podRecord{current: pod} - } - } -} - -func (pr podRecords) update(id types.UID) { - r, ok := pr[id] - if !ok { - return - } - pr.updateInternal(id, r) -} - -func (pr podRecords) updateInternal(id types.UID, r *podRecord) { - if r.current == nil { - // Pod no longer exists; delete the entry. - delete(pr, id) - return - } - r.old = r.current - r.current = nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/pleg.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/pleg.go deleted file mode 100644 index aa0e46e4..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pleg/pleg.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 pleg - -import ( - "k8s.io/apimachinery/pkg/types" -) - -type PodLifeCycleEventType string - -const ( - ContainerStarted PodLifeCycleEventType = "ContainerStarted" - ContainerDied PodLifeCycleEventType = "ContainerDied" - ContainerRemoved PodLifeCycleEventType = "ContainerRemoved" - // PodSync is used to trigger syncing of a pod when the observed change of - // the state of the pod cannot be captured by any single event above. - PodSync PodLifeCycleEventType = "PodSync" - // Do not use the events below because they are disabled in GenericPLEG. - ContainerChanged PodLifeCycleEventType = "ContainerChanged" -) - -// PodLifecycleEvent is an event that reflects the change of the pod state. -type PodLifecycleEvent struct { - // The pod ID. - ID types.UID - // The type of the event. - Type PodLifeCycleEventType - // The accompanied data which varies based on the event type. - // - ContainerStarted/ContainerStopped: the container name (string). - // - All other event types: unused. - Data interface{} -} - -type PodLifecycleEventGenerator interface { - Start() - Watch() chan *PodLifecycleEvent - Healthy() (bool, error) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD index 93e77dd9..4096c025 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/pod/BUILD @@ -20,12 +20,12 @@ go_library( "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/secret:go_default_library", "//pkg/kubelet/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], ) @@ -42,9 +42,9 @@ go_test( "//pkg/kubelet/pod/testing:go_default_library", "//pkg/kubelet/secret:go_default_library", "//pkg/kubelet/types:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go deleted file mode 100644 index 48a85958..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_container_deletor.go +++ /dev/null @@ -1,112 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "sort" - - "github.com/golang/glog" - "k8s.io/apimachinery/pkg/util/wait" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" -) - -const ( - // The limit on the number of buffered container deletion requests - // This number is a bit arbitrary and may be adjusted in the future. - containerDeletorBufferLimit = 50 -) - -type containerStatusbyCreatedList []*kubecontainer.ContainerStatus - -type podContainerDeletor struct { - worker chan<- kubecontainer.ContainerID - containersToKeep int -} - -func (a containerStatusbyCreatedList) Len() int { return len(a) } -func (a containerStatusbyCreatedList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a containerStatusbyCreatedList) Less(i, j int) bool { return a[i].CreatedAt.After(a[j].CreatedAt) } - -func newPodContainerDeletor(runtime kubecontainer.Runtime, containersToKeep int) *podContainerDeletor { - buffer := make(chan kubecontainer.ContainerID, containerDeletorBufferLimit) - go wait.Until(func() { - for { - id := <-buffer - runtime.DeleteContainer(id) - } - }, 0, wait.NeverStop) - - return &podContainerDeletor{ - worker: buffer, - containersToKeep: containersToKeep, - } -} - -// getContainersToDeleteInPod returns the exited containers in a pod whose name matches the name inferred from filterContainerId (if not empty), ordered by the creation time from the latest to the earliest. -// If filterContainerID is empty, all dead containers in the pod are returned. -func getContainersToDeleteInPod(filterContainerID string, podStatus *kubecontainer.PodStatus, containersToKeep int) containerStatusbyCreatedList { - matchedContainer := func(filterContainerId string, podStatus *kubecontainer.PodStatus) *kubecontainer.ContainerStatus { - if filterContainerId == "" { - return nil - } - for _, containerStatus := range podStatus.ContainerStatuses { - if containerStatus.ID.ID == filterContainerId { - return containerStatus - } - } - return nil - }(filterContainerID, podStatus) - - if filterContainerID != "" && matchedContainer == nil { - glog.Warningf("Container %q not found in pod's containers", filterContainerID) - return containerStatusbyCreatedList{} - } - - // Find the exited containers whose name matches the name of the container with id being filterContainerId - var candidates containerStatusbyCreatedList - for _, containerStatus := range podStatus.ContainerStatuses { - if containerStatus.State != kubecontainer.ContainerStateExited { - continue - } - if matchedContainer == nil || matchedContainer.Name == containerStatus.Name { - candidates = append(candidates, containerStatus) - } - } - - if len(candidates) <= containersToKeep { - return containerStatusbyCreatedList{} - } - sort.Sort(candidates) - return candidates[containersToKeep:] -} - -// deleteContainersInPod issues container deletion requests for containers selected by getContainersToDeleteInPod. -func (p *podContainerDeletor) deleteContainersInPod(filterContainerID string, podStatus *kubecontainer.PodStatus, removeAll bool) { - containersToKeep := p.containersToKeep - if removeAll { - containersToKeep = 0 - filterContainerID = "" - } - - for _, candidate := range getContainersToDeleteInPod(filterContainerID, podStatus, containersToKeep) { - select { - case p.worker <- candidate.ID: - default: - glog.Warningf("Failed to issue the request to remove container %v", candidate.ID) - } - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go deleted file mode 100644 index 6c80bf10..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/pod_workers.go +++ /dev/null @@ -1,333 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "sync" - "time" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/tools/record" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/events" - "k8s.io/kubernetes/pkg/kubelet/eviction" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/kubelet/util/queue" -) - -// OnCompleteFunc is a function that is invoked when an operation completes. -// If err is non-nil, the operation did not complete successfully. -type OnCompleteFunc func(err error) - -// PodStatusFunc is a function that is invoked to generate a pod status. -type PodStatusFunc func(pod *v1.Pod, podStatus *kubecontainer.PodStatus) v1.PodStatus - -// KillPodOptions are options when performing a pod update whose update type is kill. -type KillPodOptions struct { - // PodStatusFunc is the function to invoke to set pod status in response to a kill request. - PodStatusFunc PodStatusFunc - // PodTerminationGracePeriodSecondsOverride is optional override to use if a pod is being killed as part of kill operation. - PodTerminationGracePeriodSecondsOverride *int64 -} - -// UpdatePodOptions is an options struct to pass to a UpdatePod operation. -type UpdatePodOptions struct { - // pod to update - Pod *v1.Pod - // the mirror pod for the pod to update, if it is a static pod - MirrorPod *v1.Pod - // the type of update (create, update, sync, kill) - UpdateType kubetypes.SyncPodType - // optional callback function when operation completes - // this callback is not guaranteed to be completed since a pod worker may - // drop update requests if it was fulfilling a previous request. this is - // only guaranteed to be invoked in response to a kill pod request which is - // always delivered. - OnCompleteFunc OnCompleteFunc - // if update type is kill, use the specified options to kill the pod. - KillPodOptions *KillPodOptions -} - -// PodWorkers is an abstract interface for testability. -type PodWorkers interface { - UpdatePod(options *UpdatePodOptions) - ForgetNonExistingPodWorkers(desiredPods map[types.UID]empty) - ForgetWorker(uid types.UID) -} - -// syncPodOptions provides the arguments to a SyncPod operation. -type syncPodOptions struct { - // the mirror pod for the pod to sync, if it is a static pod - mirrorPod *v1.Pod - // pod to sync - pod *v1.Pod - // the type of update (create, update, sync) - updateType kubetypes.SyncPodType - // the current status - podStatus *kubecontainer.PodStatus - // if update type is kill, use the specified options to kill the pod. - killPodOptions *KillPodOptions -} - -// the function to invoke to perform a sync. -type syncPodFnType func(options syncPodOptions) error - -const ( - // jitter factor for resyncInterval - workerResyncIntervalJitterFactor = 0.5 - - // jitter factor for backOffPeriod - workerBackOffPeriodJitterFactor = 0.5 -) - -type podWorkers struct { - // Protects all per worker fields. - podLock sync.Mutex - - // Tracks all running per-pod goroutines - per-pod goroutine will be - // processing updates received through its corresponding channel. - podUpdates map[types.UID]chan UpdatePodOptions - // Track the current state of per-pod goroutines. - // Currently all update request for a given pod coming when another - // update of this pod is being processed are ignored. - isWorking map[types.UID]bool - // Tracks the last undelivered work item for this pod - a work item is - // undelivered if it comes in while the worker is working. - lastUndeliveredWorkUpdate map[types.UID]UpdatePodOptions - - workQueue queue.WorkQueue - - // This function is run to sync the desired stated of pod. - // NOTE: This function has to be thread-safe - it can be called for - // different pods at the same time. - syncPodFn syncPodFnType - - // The EventRecorder to use - recorder record.EventRecorder - - // backOffPeriod is the duration to back off when there is a sync error. - backOffPeriod time.Duration - - // resyncInterval is the duration to wait until the next sync. - resyncInterval time.Duration - - // podCache stores kubecontainer.PodStatus for all pods. - podCache kubecontainer.Cache -} - -func newPodWorkers(syncPodFn syncPodFnType, recorder record.EventRecorder, workQueue queue.WorkQueue, - resyncInterval, backOffPeriod time.Duration, podCache kubecontainer.Cache) *podWorkers { - return &podWorkers{ - podUpdates: map[types.UID]chan UpdatePodOptions{}, - isWorking: map[types.UID]bool{}, - lastUndeliveredWorkUpdate: map[types.UID]UpdatePodOptions{}, - syncPodFn: syncPodFn, - recorder: recorder, - workQueue: workQueue, - resyncInterval: resyncInterval, - backOffPeriod: backOffPeriod, - podCache: podCache, - } -} - -func (p *podWorkers) managePodLoop(podUpdates <-chan UpdatePodOptions) { - var lastSyncTime time.Time - for update := range podUpdates { - err := func() error { - podUID := update.Pod.UID - // This is a blocking call that would return only if the cache - // has an entry for the pod that is newer than minRuntimeCache - // Time. This ensures the worker doesn't start syncing until - // after the cache is at least newer than the finished time of - // the previous sync. - status, err := p.podCache.GetNewerThan(podUID, lastSyncTime) - if err != nil { - // This is the legacy event thrown by manage pod loop - // all other events are now dispatched from syncPodFn - p.recorder.Eventf(update.Pod, v1.EventTypeWarning, events.FailedSync, "error determining status: %v", err) - return err - } - err = p.syncPodFn(syncPodOptions{ - mirrorPod: update.MirrorPod, - pod: update.Pod, - podStatus: status, - killPodOptions: update.KillPodOptions, - updateType: update.UpdateType, - }) - lastSyncTime = time.Now() - return err - }() - // notify the call-back function if the operation succeeded or not - if update.OnCompleteFunc != nil { - update.OnCompleteFunc(err) - } - if err != nil { - // IMPORTANT: we do not log errors here, the syncPodFn is responsible for logging errors - glog.Errorf("Error syncing pod %s (%q), skipping: %v", update.Pod.UID, format.Pod(update.Pod), err) - } - p.wrapUp(update.Pod.UID, err) - } -} - -// Apply the new setting to the specified pod. -// If the options provide an OnCompleteFunc, the function is invoked if the update is accepted. -// Update requests are ignored if a kill pod request is pending. -func (p *podWorkers) UpdatePod(options *UpdatePodOptions) { - pod := options.Pod - uid := pod.UID - var podUpdates chan UpdatePodOptions - var exists bool - - p.podLock.Lock() - defer p.podLock.Unlock() - if podUpdates, exists = p.podUpdates[uid]; !exists { - // We need to have a buffer here, because checkForUpdates() method that - // puts an update into channel is called from the same goroutine where - // the channel is consumed. However, it is guaranteed that in such case - // the channel is empty, so buffer of size 1 is enough. - podUpdates = make(chan UpdatePodOptions, 1) - p.podUpdates[uid] = podUpdates - - // Creating a new pod worker either means this is a new pod, or that the - // kubelet just restarted. In either case the kubelet is willing to believe - // the status of the pod for the first pod worker sync. See corresponding - // comment in syncPod. - go func() { - defer runtime.HandleCrash() - p.managePodLoop(podUpdates) - }() - } - if !p.isWorking[pod.UID] { - p.isWorking[pod.UID] = true - podUpdates <- *options - } else { - // if a request to kill a pod is pending, we do not let anything overwrite that request. - update, found := p.lastUndeliveredWorkUpdate[pod.UID] - if !found || update.UpdateType != kubetypes.SyncPodKill { - p.lastUndeliveredWorkUpdate[pod.UID] = *options - } - } -} - -func (p *podWorkers) removeWorker(uid types.UID) { - if ch, ok := p.podUpdates[uid]; ok { - close(ch) - delete(p.podUpdates, uid) - // If there is an undelivered work update for this pod we need to remove it - // since per-pod goroutine won't be able to put it to the already closed - // channel when it finishes processing the current work update. - if _, cached := p.lastUndeliveredWorkUpdate[uid]; cached { - delete(p.lastUndeliveredWorkUpdate, uid) - } - } -} -func (p *podWorkers) ForgetWorker(uid types.UID) { - p.podLock.Lock() - defer p.podLock.Unlock() - p.removeWorker(uid) -} - -func (p *podWorkers) ForgetNonExistingPodWorkers(desiredPods map[types.UID]empty) { - p.podLock.Lock() - defer p.podLock.Unlock() - for key := range p.podUpdates { - if _, exists := desiredPods[key]; !exists { - p.removeWorker(key) - } - } -} - -func (p *podWorkers) wrapUp(uid types.UID, syncErr error) { - // Requeue the last update if the last sync returned error. - switch { - case syncErr == nil: - // No error; requeue at the regular resync interval. - p.workQueue.Enqueue(uid, wait.Jitter(p.resyncInterval, workerResyncIntervalJitterFactor)) - default: - // Error occurred during the sync; back off and then retry. - p.workQueue.Enqueue(uid, wait.Jitter(p.backOffPeriod, workerBackOffPeriodJitterFactor)) - } - p.checkForUpdates(uid) -} - -func (p *podWorkers) checkForUpdates(uid types.UID) { - p.podLock.Lock() - defer p.podLock.Unlock() - if workUpdate, exists := p.lastUndeliveredWorkUpdate[uid]; exists { - p.podUpdates[uid] <- workUpdate - delete(p.lastUndeliveredWorkUpdate, uid) - } else { - p.isWorking[uid] = false - } -} - -// killPodNow returns a KillPodFunc that can be used to kill a pod. -// It is intended to be injected into other modules that need to kill a pod. -func killPodNow(podWorkers PodWorkers, recorder record.EventRecorder) eviction.KillPodFunc { - return func(pod *v1.Pod, status v1.PodStatus, gracePeriodOverride *int64) error { - // determine the grace period to use when killing the pod - gracePeriod := int64(0) - if gracePeriodOverride != nil { - gracePeriod = *gracePeriodOverride - } else if pod.Spec.TerminationGracePeriodSeconds != nil { - gracePeriod = *pod.Spec.TerminationGracePeriodSeconds - } - - // we timeout and return an error if we don't get a callback within a reasonable time. - // the default timeout is relative to the grace period (we settle on 10s to wait for kubelet->runtime traffic to complete in sigkill) - timeout := int64(gracePeriod + (gracePeriod / 2)) - minTimeout := int64(10) - if timeout < minTimeout { - timeout = minTimeout - } - timeoutDuration := time.Duration(timeout) * time.Second - - // open a channel we block against until we get a result - type response struct { - err error - } - ch := make(chan response) - podWorkers.UpdatePod(&UpdatePodOptions{ - Pod: pod, - UpdateType: kubetypes.SyncPodKill, - OnCompleteFunc: func(err error) { - ch <- response{err: err} - }, - KillPodOptions: &KillPodOptions{ - PodStatusFunc: func(p *v1.Pod, podStatus *kubecontainer.PodStatus) v1.PodStatus { - return status - }, - PodTerminationGracePeriodSecondsOverride: gracePeriodOverride, - }, - }) - - // wait for either a response, or a timeout - select { - case r := <-ch: - return r.err - case <-time.After(timeoutDuration): - recorder.Eventf(pod, v1.EventTypeWarning, events.ExceededGracePeriod, "Container runtime did not kill the pod within specified grace period.") - return fmt.Errorf("timeout waiting to kill pod") - } - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD deleted file mode 100644 index a7181793..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["preemption.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/preemption", - deps = [ - "//pkg/api/v1/resource:go_default_library", - "//pkg/apis/core/v1/helper/qos:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/eviction:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/scheduler/algorithm:go_default_library", - "//pkg/scheduler/algorithm/predicates:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["preemption_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go b/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go deleted file mode 100644 index fdccd2c4..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/preemption/preemption.go +++ /dev/null @@ -1,264 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 preemption - -import ( - "fmt" - "math" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/client-go/tools/record" - "k8s.io/kubernetes/pkg/api/v1/resource" - v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/kubelet/events" - "k8s.io/kubernetes/pkg/kubelet/eviction" - "k8s.io/kubernetes/pkg/kubelet/lifecycle" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/scheduler/algorithm" - "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" -) - -const message = "Preempted in order to admit critical pod" - -// CriticalPodAdmissionFailureHandler is an AdmissionFailureHandler that handles admission failure for Critical Pods. -// If the ONLY admission failures are due to insufficient resources, then CriticalPodAdmissionHandler evicts pods -// so that the critical pod can be admitted. For evictions, the CriticalPodAdmissionHandler evicts a set of pods that -// frees up the required resource requests. The set of pods is designed to minimize impact, and is prioritized according to the ordering: -// minimal impact for guaranteed pods > minimal impact for burstable pods > minimal impact for besteffort pods. -// minimal impact is defined as follows: fewest pods evicted > fewest total requests of pods. -// finding the fewest total requests of pods is considered besteffort. -type CriticalPodAdmissionHandler struct { - getPodsFunc eviction.ActivePodsFunc - killPodFunc eviction.KillPodFunc - recorder record.EventRecorder -} - -var _ lifecycle.AdmissionFailureHandler = &CriticalPodAdmissionHandler{} - -func NewCriticalPodAdmissionHandler(getPodsFunc eviction.ActivePodsFunc, killPodFunc eviction.KillPodFunc, recorder record.EventRecorder) *CriticalPodAdmissionHandler { - return &CriticalPodAdmissionHandler{ - getPodsFunc: getPodsFunc, - killPodFunc: killPodFunc, - recorder: recorder, - } -} - -// HandleAdmissionFailure gracefully handles admission rejection, and, in some cases, -// to allow admission of the pod despite its previous failure. -func (c *CriticalPodAdmissionHandler) HandleAdmissionFailure(pod *v1.Pod, failureReasons []algorithm.PredicateFailureReason) (bool, []algorithm.PredicateFailureReason, error) { - if !kubetypes.IsCriticalPod(pod) || !utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalCriticalPodAnnotation) { - return false, failureReasons, nil - } - // InsufficientResourceError is not a reason to reject a critical pod. - // Instead of rejecting, we free up resources to admit it, if no other reasons for rejection exist. - nonResourceReasons := []algorithm.PredicateFailureReason{} - resourceReasons := []*admissionRequirement{} - for _, reason := range failureReasons { - if r, ok := reason.(*predicates.InsufficientResourceError); ok { - resourceReasons = append(resourceReasons, &admissionRequirement{ - resourceName: r.ResourceName, - quantity: r.GetInsufficientAmount(), - }) - } else { - nonResourceReasons = append(nonResourceReasons, reason) - } - } - if len(nonResourceReasons) > 0 { - // Return only reasons that are not resource related, since critical pods cannot fail admission for resource reasons. - return false, nonResourceReasons, nil - } - err := c.evictPodsToFreeRequests(admissionRequirementList(resourceReasons)) - // if no error is returned, preemption succeeded and the pod is safe to admit. - return err == nil, nil, err -} - -// freeRequests takes a list of insufficient resources, and attempts to free them by evicting pods -// based on requests. For example, if the only insufficient resource is 200Mb of memory, this function could -// evict a pod with request=250Mb. -func (c *CriticalPodAdmissionHandler) evictPodsToFreeRequests(insufficientResources admissionRequirementList) error { - podsToPreempt, err := getPodsToPreempt(c.getPodsFunc(), insufficientResources) - if err != nil { - return fmt.Errorf("preemption: error finding a set of pods to preempt: %v", err) - } - glog.Infof("preemption: attempting to evict pods %v, in order to free up resources: %s", podsToPreempt, insufficientResources.toString()) - for _, pod := range podsToPreempt { - status := v1.PodStatus{ - Phase: v1.PodFailed, - Message: message, - Reason: events.PreemptContainer, - } - // record that we are evicting the pod - c.recorder.Eventf(pod, v1.EventTypeWarning, events.PreemptContainer, message) - // this is a blocking call and should only return when the pod and its containers are killed. - err := c.killPodFunc(pod, status, nil) - if err != nil { - return fmt.Errorf("preemption: pod %s failed to evict %v", format.Pod(pod), err) - } - glog.Infof("preemption: pod %s evicted successfully", format.Pod(pod)) - } - return nil -} - -// getPodsToPreempt returns a list of pods that could be preempted to free requests >= requirements -func getPodsToPreempt(pods []*v1.Pod, requirements admissionRequirementList) ([]*v1.Pod, error) { - bestEffortPods, burstablePods, guaranteedPods := sortPodsByQOS(pods) - - // make sure that pods exist to reclaim the requirements - unableToMeetRequirements := requirements.subtract(append(append(bestEffortPods, burstablePods...), guaranteedPods...)...) - if len(unableToMeetRequirements) > 0 { - return nil, fmt.Errorf("no set of running pods found to reclaim resources: %v", unableToMeetRequirements.toString()) - } - // find the guaranteed pods we would need to evict if we already evicted ALL burstable and besteffort pods. - guarateedToEvict, err := getPodsToPreemptByDistance(guaranteedPods, requirements.subtract(append(bestEffortPods, burstablePods...)...)) - if err != nil { - return nil, err - } - // Find the burstable pods we would need to evict if we already evicted ALL besteffort pods, and the required guaranteed pods. - burstableToEvict, err := getPodsToPreemptByDistance(burstablePods, requirements.subtract(append(bestEffortPods, guarateedToEvict...)...)) - if err != nil { - return nil, err - } - // Find the besteffort pods we would need to evict if we already evicted the required guaranteed and burstable pods. - bestEffortToEvict, err := getPodsToPreemptByDistance(bestEffortPods, requirements.subtract(append(burstableToEvict, guarateedToEvict...)...)) - if err != nil { - return nil, err - } - return append(append(bestEffortToEvict, burstableToEvict...), guarateedToEvict...), nil -} - -// finds the pods that have pod requests >= admission requirements. -// Chooses pods that minimize "distance" to the requirements. -// If more than one pod exists that fulfills the remaining requirements, -// it chooses the pod that has the "smaller resource request" -// This method, by repeatedly choosing the pod that fulfills as much of the requirements as possible, -// attempts to minimize the number of pods returned. -func getPodsToPreemptByDistance(pods []*v1.Pod, requirements admissionRequirementList) ([]*v1.Pod, error) { - podsToEvict := []*v1.Pod{} - // evict pods by shortest distance from remaining requirements, updating requirements every round. - for len(requirements) > 0 { - if len(pods) == 0 { - return nil, fmt.Errorf("no set of running pods found to reclaim resources: %v", requirements.toString()) - } - // all distances must be less than len(requirements), because the max distance for a single requirement is 1 - bestDistance := float64(len(requirements) + 1) - bestPodIndex := 0 - // Find the pod with the smallest distance from requirements - // Or, in the case of two equidistant pods, find the pod with "smaller" resource requests. - for i, pod := range pods { - dist := requirements.distance(pod) - if dist < bestDistance || (bestDistance == dist && smallerResourceRequest(pod, pods[bestPodIndex])) { - bestDistance = dist - bestPodIndex = i - } - } - // subtract the pod from requirements, and transfer the pod from input-pods to pods-to-evicted - requirements = requirements.subtract(pods[bestPodIndex]) - podsToEvict = append(podsToEvict, pods[bestPodIndex]) - pods[bestPodIndex] = pods[len(pods)-1] - pods = pods[:len(pods)-1] - } - return podsToEvict, nil -} - -type admissionRequirement struct { - resourceName v1.ResourceName - quantity int64 -} - -type admissionRequirementList []*admissionRequirement - -// distance of the pods requests from the admissionRequirements. -// distance is measured by the fraction of the requirement satisfied by the pod, -// so that each requirement is weighted equally, regardless of absolute magnitude. -func (a admissionRequirementList) distance(pod *v1.Pod) float64 { - dist := float64(0) - for _, req := range a { - remainingRequest := float64(req.quantity - resource.GetResourceRequest(pod, req.resourceName)) - if remainingRequest < 0 { - remainingRequest = 0 - } - dist += math.Pow(remainingRequest/float64(req.quantity), 2) - } - return dist -} - -// returns a new admissionRequirementList containing remaining requirements if the provided pod -// were to be preempted -func (a admissionRequirementList) subtract(pods ...*v1.Pod) admissionRequirementList { - newList := []*admissionRequirement{} - for _, req := range a { - newQuantity := req.quantity - for _, pod := range pods { - newQuantity -= resource.GetResourceRequest(pod, req.resourceName) - } - if newQuantity > 0 { - newList = append(newList, &admissionRequirement{ - resourceName: req.resourceName, - quantity: newQuantity, - }) - } - } - return newList -} - -func (a admissionRequirementList) toString() string { - s := "[" - for _, req := range a { - s += fmt.Sprintf("(res: %v, q: %d), ", req.resourceName, req.quantity) - } - return s + "]" -} - -// returns lists containing non-critical besteffort, burstable, and guaranteed pods -func sortPodsByQOS(pods []*v1.Pod) (bestEffort, burstable, guaranteed []*v1.Pod) { - for _, pod := range pods { - if !kubetypes.IsCriticalPod(pod) { - switch v1qos.GetPodQOS(pod) { - case v1.PodQOSBestEffort: - bestEffort = append(bestEffort, pod) - case v1.PodQOSBurstable: - burstable = append(burstable, pod) - case v1.PodQOSGuaranteed: - guaranteed = append(guaranteed, pod) - default: - } - } - } - return -} - -// returns true if pod1 has a smaller request than pod2 -func smallerResourceRequest(pod1 *v1.Pod, pod2 *v1.Pod) bool { - priorityList := []v1.ResourceName{ - v1.ResourceMemory, - v1.ResourceCPU, - } - for _, res := range priorityList { - req1 := resource.GetResourceRequest(pod1, res) - req2 := resource.GetResourceRequest(pod2, res) - if req1 < req2 { - return true - } else if req1 > req2 { - return false - } - } - return true -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD deleted file mode 100644 index 0807bfa0..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/BUILD +++ /dev/null @@ -1,87 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "prober.go", - "prober_manager.go", - "worker.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/prober", - deps = [ - "//pkg/api/v1/pod:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/probe:go_default_library", - "//pkg/probe/exec:go_default_library", - "//pkg/probe/http:go_default_library", - "//pkg/probe/tcp:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "common_test.go", - "prober_manager_test.go", - "prober_test.go", - "worker_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/prober/results:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/probe:go_default_library", - "//pkg/probe/exec:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/prober/results:all-srcs", - "//pkg/kubelet/prober/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go deleted file mode 100644 index d81ee8f3..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober.go +++ /dev/null @@ -1,279 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 prober - -import ( - "fmt" - "io" - "net" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/client-go/tools/record" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/events" - "k8s.io/kubernetes/pkg/kubelet/prober/results" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/probe" - execprobe "k8s.io/kubernetes/pkg/probe/exec" - httprobe "k8s.io/kubernetes/pkg/probe/http" - tcprobe "k8s.io/kubernetes/pkg/probe/tcp" - "k8s.io/utils/exec" - - "github.com/golang/glog" -) - -const maxProbeRetries = 3 - -// Prober helps to check the liveness/readiness of a container. -type prober struct { - exec execprobe.ExecProber - // probe types needs different httprobe instances so they don't - // share a connection pool which can cause collsions to the - // same host:port and transient failures. See #49740. - readinessHttp httprobe.HTTPProber - livenessHttp httprobe.HTTPProber - tcp tcprobe.TCPProber - runner kubecontainer.ContainerCommandRunner - - refManager *kubecontainer.RefManager - recorder record.EventRecorder -} - -// NewProber creates a Prober, it takes a command runner and -// several container info managers. -func newProber( - runner kubecontainer.ContainerCommandRunner, - refManager *kubecontainer.RefManager, - recorder record.EventRecorder) *prober { - - return &prober{ - exec: execprobe.New(), - readinessHttp: httprobe.New(), - livenessHttp: httprobe.New(), - tcp: tcprobe.New(), - runner: runner, - refManager: refManager, - recorder: recorder, - } -} - -// probe probes the container. -func (pb *prober) probe(probeType probeType, pod *v1.Pod, status v1.PodStatus, container v1.Container, containerID kubecontainer.ContainerID) (results.Result, error) { - var probeSpec *v1.Probe - switch probeType { - case readiness: - probeSpec = container.ReadinessProbe - case liveness: - probeSpec = container.LivenessProbe - default: - return results.Failure, fmt.Errorf("Unknown probe type: %q", probeType) - } - - ctrName := fmt.Sprintf("%s:%s", format.Pod(pod), container.Name) - if probeSpec == nil { - glog.Warningf("%s probe for %s is nil", probeType, ctrName) - return results.Success, nil - } - - result, output, err := pb.runProbeWithRetries(probeType, probeSpec, pod, status, container, containerID, maxProbeRetries) - if err != nil || result != probe.Success { - // Probe failed in one way or another. - ref, hasRef := pb.refManager.GetRef(containerID) - if !hasRef { - glog.Warningf("No ref for container %q (%s)", containerID.String(), ctrName) - } - if err != nil { - glog.V(1).Infof("%s probe for %q errored: %v", probeType, ctrName, err) - if hasRef { - pb.recorder.Eventf(ref, v1.EventTypeWarning, events.ContainerUnhealthy, "%s probe errored: %v", probeType, err) - } - } else { // result != probe.Success - glog.V(1).Infof("%s probe for %q failed (%v): %s", probeType, ctrName, result, output) - if hasRef { - pb.recorder.Eventf(ref, v1.EventTypeWarning, events.ContainerUnhealthy, "%s probe failed: %s", probeType, output) - } - } - return results.Failure, err - } - glog.V(3).Infof("%s probe for %q succeeded", probeType, ctrName) - return results.Success, nil -} - -// runProbeWithRetries tries to probe the container in a finite loop, it returns the last result -// if it never succeeds. -func (pb *prober) runProbeWithRetries(probeType probeType, p *v1.Probe, pod *v1.Pod, status v1.PodStatus, container v1.Container, containerID kubecontainer.ContainerID, retries int) (probe.Result, string, error) { - var err error - var result probe.Result - var output string - for i := 0; i < retries; i++ { - result, output, err = pb.runProbe(probeType, p, pod, status, container, containerID) - if err == nil { - return result, output, nil - } - } - return result, output, err -} - -// buildHeaderMap takes a list of HTTPHeader string -// pairs and returns a populated string->[]string http.Header map. -func buildHeader(headerList []v1.HTTPHeader) http.Header { - headers := make(http.Header) - for _, header := range headerList { - headers[header.Name] = append(headers[header.Name], header.Value) - } - return headers -} - -func (pb *prober) runProbe(probeType probeType, p *v1.Probe, pod *v1.Pod, status v1.PodStatus, container v1.Container, containerID kubecontainer.ContainerID) (probe.Result, string, error) { - timeout := time.Duration(p.TimeoutSeconds) * time.Second - if p.Exec != nil { - glog.V(4).Infof("Exec-Probe Pod: %v, Container: %v, Command: %v", pod, container, p.Exec.Command) - command := kubecontainer.ExpandContainerCommandOnlyStatic(p.Exec.Command, container.Env) - return pb.exec.Probe(pb.newExecInContainer(container, containerID, command, timeout)) - } - if p.HTTPGet != nil { - scheme := strings.ToLower(string(p.HTTPGet.Scheme)) - host := p.HTTPGet.Host - if host == "" { - host = status.PodIP - } - port, err := extractPort(p.HTTPGet.Port, container) - if err != nil { - return probe.Unknown, "", err - } - path := p.HTTPGet.Path - glog.V(4).Infof("HTTP-Probe Host: %v://%v, Port: %v, Path: %v", scheme, host, port, path) - url := formatURL(scheme, host, port, path) - headers := buildHeader(p.HTTPGet.HTTPHeaders) - glog.V(4).Infof("HTTP-Probe Headers: %v", headers) - if probeType == liveness { - return pb.livenessHttp.Probe(url, headers, timeout) - } else { // readiness - return pb.readinessHttp.Probe(url, headers, timeout) - } - } - if p.TCPSocket != nil { - port, err := extractPort(p.TCPSocket.Port, container) - if err != nil { - return probe.Unknown, "", err - } - host := p.TCPSocket.Host - if host == "" { - host = status.PodIP - } - glog.V(4).Infof("TCP-Probe Host: %v, Port: %v, Timeout: %v", host, port, timeout) - return pb.tcp.Probe(host, port, timeout) - } - glog.Warningf("Failed to find probe builder for container: %v", container) - return probe.Unknown, "", fmt.Errorf("Missing probe handler for %s:%s", format.Pod(pod), container.Name) -} - -func extractPort(param intstr.IntOrString, container v1.Container) (int, error) { - port := -1 - var err error - switch param.Type { - case intstr.Int: - port = param.IntValue() - case intstr.String: - if port, err = findPortByName(container, param.StrVal); err != nil { - // Last ditch effort - maybe it was an int stored as string? - if port, err = strconv.Atoi(param.StrVal); err != nil { - return port, err - } - } - default: - return port, fmt.Errorf("IntOrString had no kind: %+v", param) - } - if port > 0 && port < 65536 { - return port, nil - } - return port, fmt.Errorf("invalid port number: %v", port) -} - -// findPortByName is a helper function to look up a port in a container by name. -func findPortByName(container v1.Container, portName string) (int, error) { - for _, port := range container.Ports { - if port.Name == portName { - return int(port.ContainerPort), nil - } - } - return 0, fmt.Errorf("port %s not found", portName) -} - -// formatURL formats a URL from args. For testability. -func formatURL(scheme string, host string, port int, path string) *url.URL { - u, err := url.Parse(path) - // Something is busted with the path, but it's too late to reject it. Pass it along as is. - if err != nil { - u = &url.URL{ - Path: path, - } - } - u.Scheme = scheme - u.Host = net.JoinHostPort(host, strconv.Itoa(port)) - return u -} - -type execInContainer struct { - // run executes a command in a container. Combined stdout and stderr output is always returned. An - // error is returned if one occurred. - run func() ([]byte, error) -} - -func (pb *prober) newExecInContainer(container v1.Container, containerID kubecontainer.ContainerID, cmd []string, timeout time.Duration) exec.Cmd { - return execInContainer{func() ([]byte, error) { - return pb.runner.RunInContainer(containerID, cmd, timeout) - }} -} - -func (eic execInContainer) Run() error { - return fmt.Errorf("unimplemented") -} - -func (eic execInContainer) CombinedOutput() ([]byte, error) { - return eic.run() -} - -func (eic execInContainer) Output() ([]byte, error) { - return nil, fmt.Errorf("unimplemented") -} - -func (eic execInContainer) SetDir(dir string) { - //unimplemented -} - -func (eic execInContainer) SetStdin(in io.Reader) { - //unimplemented -} - -func (eic execInContainer) SetStdout(out io.Writer) { - //unimplemented -} - -func (eic execInContainer) SetStderr(out io.Writer) { - //unimplemented -} - -func (eic execInContainer) Stop() { - //unimplemented -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go deleted file mode 100644 index 0e53e094..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/prober_manager.go +++ /dev/null @@ -1,258 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 prober - -import ( - "sync" - - "github.com/golang/glog" - "github.com/prometheus/client_golang/prometheus" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/tools/record" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/prober/results" - "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/util/format" -) - -// ProberResults stores the results of a probe as prometheus metrics. -var ProberResults = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Subsystem: "prober", - Name: "probe_result", - Help: "The result of a liveness or readiness probe for a container.", - }, - []string{"probe_type", "container_name", "pod_name", "namespace", "pod_uid"}, -) - -// Manager manages pod probing. It creates a probe "worker" for every container that specifies a -// probe (AddPod). The worker periodically probes its assigned container and caches the results. The -// manager use the cached probe results to set the appropriate Ready state in the PodStatus when -// requested (UpdatePodStatus). Updating probe parameters is not currently supported. -// TODO: Move liveness probing out of the runtime, to here. -type Manager interface { - // AddPod creates new probe workers for every container probe. This should be called for every - // pod created. - AddPod(pod *v1.Pod) - - // RemovePod handles cleaning up the removed pod state, including terminating probe workers and - // deleting cached results. - RemovePod(pod *v1.Pod) - - // CleanupPods handles cleaning up pods which should no longer be running. - // It takes a list of "active pods" which should not be cleaned up. - CleanupPods(activePods []*v1.Pod) - - // UpdatePodStatus modifies the given PodStatus with the appropriate Ready state for each - // container based on container running status, cached probe results and worker states. - UpdatePodStatus(types.UID, *v1.PodStatus) - - // Start starts the Manager sync loops. - Start() -} - -type manager struct { - // Map of active workers for probes - workers map[probeKey]*worker - // Lock for accessing & mutating workers - workerLock sync.RWMutex - - // The statusManager cache provides pod IP and container IDs for probing. - statusManager status.Manager - - // readinessManager manages the results of readiness probes - readinessManager results.Manager - - // livenessManager manages the results of liveness probes - livenessManager results.Manager - - // prober executes the probe actions. - prober *prober -} - -func NewManager( - statusManager status.Manager, - livenessManager results.Manager, - runner kubecontainer.ContainerCommandRunner, - refManager *kubecontainer.RefManager, - recorder record.EventRecorder) Manager { - - prober := newProber(runner, refManager, recorder) - readinessManager := results.NewManager() - return &manager{ - statusManager: statusManager, - prober: prober, - readinessManager: readinessManager, - livenessManager: livenessManager, - workers: make(map[probeKey]*worker), - } -} - -// Start syncing probe status. This should only be called once. -func (m *manager) Start() { - // Start syncing readiness. - go wait.Forever(m.updateReadiness, 0) -} - -// Key uniquely identifying container probes -type probeKey struct { - podUID types.UID - containerName string - probeType probeType -} - -// Type of probe (readiness or liveness) -type probeType int - -const ( - liveness probeType = iota - readiness -) - -// For debugging. -func (t probeType) String() string { - switch t { - case readiness: - return "Readiness" - case liveness: - return "Liveness" - default: - return "UNKNOWN" - } -} - -func (m *manager) AddPod(pod *v1.Pod) { - m.workerLock.Lock() - defer m.workerLock.Unlock() - - key := probeKey{podUID: pod.UID} - for _, c := range pod.Spec.Containers { - key.containerName = c.Name - - if c.ReadinessProbe != nil { - key.probeType = readiness - if _, ok := m.workers[key]; ok { - glog.Errorf("Readiness probe already exists! %v - %v", - format.Pod(pod), c.Name) - return - } - w := newWorker(m, readiness, pod, c) - m.workers[key] = w - go w.run() - } - - if c.LivenessProbe != nil { - key.probeType = liveness - if _, ok := m.workers[key]; ok { - glog.Errorf("Liveness probe already exists! %v - %v", - format.Pod(pod), c.Name) - return - } - w := newWorker(m, liveness, pod, c) - m.workers[key] = w - go w.run() - } - } -} - -func (m *manager) RemovePod(pod *v1.Pod) { - m.workerLock.RLock() - defer m.workerLock.RUnlock() - - key := probeKey{podUID: pod.UID} - for _, c := range pod.Spec.Containers { - key.containerName = c.Name - for _, probeType := range [...]probeType{readiness, liveness} { - key.probeType = probeType - if worker, ok := m.workers[key]; ok { - worker.stop() - } - } - } -} - -func (m *manager) CleanupPods(activePods []*v1.Pod) { - desiredPods := make(map[types.UID]sets.Empty) - for _, pod := range activePods { - desiredPods[pod.UID] = sets.Empty{} - } - - m.workerLock.RLock() - defer m.workerLock.RUnlock() - - for key, worker := range m.workers { - if _, ok := desiredPods[key.podUID]; !ok { - worker.stop() - } - } -} - -func (m *manager) UpdatePodStatus(podUID types.UID, podStatus *v1.PodStatus) { - for i, c := range podStatus.ContainerStatuses { - var ready bool - if c.State.Running == nil { - ready = false - } else if result, ok := m.readinessManager.Get(kubecontainer.ParseContainerID(c.ContainerID)); ok { - ready = result == results.Success - } else { - // The check whether there is a probe which hasn't run yet. - _, exists := m.getWorker(podUID, c.Name, readiness) - ready = !exists - } - podStatus.ContainerStatuses[i].Ready = ready - } - // init containers are ready if they have exited with success or if a readiness probe has - // succeeded. - for i, c := range podStatus.InitContainerStatuses { - var ready bool - if c.State.Terminated != nil && c.State.Terminated.ExitCode == 0 { - ready = true - } - podStatus.InitContainerStatuses[i].Ready = ready - } -} - -func (m *manager) getWorker(podUID types.UID, containerName string, probeType probeType) (*worker, bool) { - m.workerLock.RLock() - defer m.workerLock.RUnlock() - worker, ok := m.workers[probeKey{podUID, containerName, probeType}] - return worker, ok -} - -// Called by the worker after exiting. -func (m *manager) removeWorker(podUID types.UID, containerName string, probeType probeType) { - m.workerLock.Lock() - defer m.workerLock.Unlock() - delete(m.workers, probeKey{podUID, containerName, probeType}) -} - -// workerCount returns the total number of probe workers. For testing. -func (m *manager) workerCount() int { - m.workerLock.RLock() - defer m.workerLock.RUnlock() - return len(m.workers) -} - -func (m *manager) updateReadiness() { - update := <-m.readinessManager.Updates() - - ready := update.Result == results.Success - m.statusManager.SetContainerReadiness(update.PodUID, update.ContainerID, ready) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD index ca3c9045..2df22b0e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/results/BUILD @@ -12,8 +12,8 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/prober/results", deps = [ "//pkg/kubelet/container:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", ], ) @@ -23,10 +23,10 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubelet/container:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go b/vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go deleted file mode 100644 index cdefc1da..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/prober/worker.go +++ /dev/null @@ -1,247 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 prober - -import ( - "math/rand" - "time" - - "github.com/golang/glog" - "github.com/prometheus/client_golang/prometheus" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/runtime" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/prober/results" - "k8s.io/kubernetes/pkg/kubelet/util/format" -) - -// worker handles the periodic probing of its assigned container. Each worker has a go-routine -// associated with it which runs the probe loop until the container permanently terminates, or the -// stop channel is closed. The worker uses the probe Manager's statusManager to get up-to-date -// container IDs. -type worker struct { - // Channel for stopping the probe. - stopCh chan struct{} - - // The pod containing this probe (read-only) - pod *v1.Pod - - // The container to probe (read-only) - container v1.Container - - // Describes the probe configuration (read-only) - spec *v1.Probe - - // The type of the worker. - probeType probeType - - // The probe value during the initial delay. - initialValue results.Result - - // Where to store this workers results. - resultsManager results.Manager - probeManager *manager - - // The last known container ID for this worker. - containerID kubecontainer.ContainerID - // The last probe result for this worker. - lastResult results.Result - // How many times in a row the probe has returned the same result. - resultRun int - - // If set, skip probing. - onHold bool - - // proberResultsMetricLabels holds the labels attached to this worker - // for the ProberResults metric. - proberResultsMetricLabels prometheus.Labels -} - -// Creates and starts a new probe worker. -func newWorker( - m *manager, - probeType probeType, - pod *v1.Pod, - container v1.Container) *worker { - - w := &worker{ - stopCh: make(chan struct{}, 1), // Buffer so stop() can be non-blocking. - pod: pod, - container: container, - probeType: probeType, - probeManager: m, - } - - switch probeType { - case readiness: - w.spec = container.ReadinessProbe - w.resultsManager = m.readinessManager - w.initialValue = results.Failure - case liveness: - w.spec = container.LivenessProbe - w.resultsManager = m.livenessManager - w.initialValue = results.Success - } - - w.proberResultsMetricLabels = prometheus.Labels{ - "probe_type": w.probeType.String(), - "container_name": w.container.Name, - "pod_name": w.pod.Name, - "namespace": w.pod.Namespace, - "pod_uid": string(w.pod.UID), - } - - return w -} - -// run periodically probes the container. -func (w *worker) run() { - probeTickerPeriod := time.Duration(w.spec.PeriodSeconds) * time.Second - - // If kubelet restarted the probes could be started in rapid succession. - // Let the worker wait for a random portion of tickerPeriod before probing. - time.Sleep(time.Duration(rand.Float64() * float64(probeTickerPeriod))) - - probeTicker := time.NewTicker(probeTickerPeriod) - - defer func() { - // Clean up. - probeTicker.Stop() - if !w.containerID.IsEmpty() { - w.resultsManager.Remove(w.containerID) - } - - w.probeManager.removeWorker(w.pod.UID, w.container.Name, w.probeType) - ProberResults.Delete(w.proberResultsMetricLabels) - }() - -probeLoop: - for w.doProbe() { - // Wait for next probe tick. - select { - case <-w.stopCh: - break probeLoop - case <-probeTicker.C: - // continue - } - } -} - -// stop stops the probe worker. The worker handles cleanup and removes itself from its manager. -// It is safe to call stop multiple times. -func (w *worker) stop() { - select { - case w.stopCh <- struct{}{}: - default: // Non-blocking. - } -} - -// doProbe probes the container once and records the result. -// Returns whether the worker should continue. -func (w *worker) doProbe() (keepGoing bool) { - defer func() { recover() }() // Actually eat panics (HandleCrash takes care of logging) - defer runtime.HandleCrash(func(_ interface{}) { keepGoing = true }) - - status, ok := w.probeManager.statusManager.GetPodStatus(w.pod.UID) - if !ok { - // Either the pod has not been created yet, or it was already deleted. - glog.V(3).Infof("No status for pod: %v", format.Pod(w.pod)) - return true - } - - // Worker should terminate if pod is terminated. - if status.Phase == v1.PodFailed || status.Phase == v1.PodSucceeded { - glog.V(3).Infof("Pod %v %v, exiting probe worker", - format.Pod(w.pod), status.Phase) - return false - } - - c, ok := podutil.GetContainerStatus(status.ContainerStatuses, w.container.Name) - if !ok || len(c.ContainerID) == 0 { - // Either the container has not been created yet, or it was deleted. - glog.V(3).Infof("Probe target container not found: %v - %v", - format.Pod(w.pod), w.container.Name) - return true // Wait for more information. - } - - if w.containerID.String() != c.ContainerID { - if !w.containerID.IsEmpty() { - w.resultsManager.Remove(w.containerID) - } - w.containerID = kubecontainer.ParseContainerID(c.ContainerID) - w.resultsManager.Set(w.containerID, w.initialValue, w.pod) - // We've got a new container; resume probing. - w.onHold = false - } - - if w.onHold { - // Worker is on hold until there is a new container. - return true - } - - if c.State.Running == nil { - glog.V(3).Infof("Non-running container probed: %v - %v", - format.Pod(w.pod), w.container.Name) - if !w.containerID.IsEmpty() { - w.resultsManager.Set(w.containerID, results.Failure, w.pod) - } - // Abort if the container will not be restarted. - return c.State.Terminated == nil || - w.pod.Spec.RestartPolicy != v1.RestartPolicyNever - } - - if int32(time.Since(c.State.Running.StartedAt.Time).Seconds()) < w.spec.InitialDelaySeconds { - return true - } - - // TODO: in order for exec probes to correctly handle downward API env, we must be able to reconstruct - // the full container environment here, OR we must make a call to the CRI in order to get those environment - // values from the running container. - result, err := w.probeManager.prober.probe(w.probeType, w.pod, status, w.container, w.containerID) - if err != nil { - // Prober error, throw away the result. - return true - } - - if w.lastResult == result { - w.resultRun++ - } else { - w.lastResult = result - w.resultRun = 1 - } - - if (result == results.Failure && w.resultRun < int(w.spec.FailureThreshold)) || - (result == results.Success && w.resultRun < int(w.spec.SuccessThreshold)) { - // Success or failure is below threshold - leave the probe state unchanged. - return true - } - - w.resultsManager.Set(w.containerID, result, w.pod) - ProberResults.With(w.proberResultsMetricLabels).Set(result.ToPrometheusType()) - - if w.probeType == liveness && result == results.Failure { - // The container fails a liveness check, it will need to be restarted. - // Stop probing until we see a new container ID. This is to reduce the - // chance of hitting #21751, where running `docker exec` when a - // container is being stopped may lead to corrupted container state. - w.onHold = true - w.resultRun = 0 - } - - return true -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD index 97b797de..634175a6 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/qos/BUILD @@ -11,8 +11,8 @@ go_test( srcs = ["policy_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], ) @@ -25,7 +25,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/qos", deps = [ "//pkg/apis/core/v1/helper/qos:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/reason_cache.go b/vendor/k8s.io/kubernetes/pkg/kubelet/reason_cache.go deleted file mode 100644 index 4c42ab8a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/reason_cache.go +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "sync" - - "github.com/golang/groupcache/lru" - "k8s.io/apimachinery/pkg/types" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" -) - -// ReasonCache stores the failure reason of the latest container start -// in a string, keyed by _. The goal is to -// propagate this reason to the container status. This endeavor is -// "best-effort" for two reasons: -// 1. The cache is not persisted. -// 2. We use an LRU cache to avoid extra garbage collection work. This -// means that some entries may be recycled before a pod has been -// deleted. -// TODO(random-liu): Use more reliable cache which could collect garbage of failed pod. -// TODO(random-liu): Move reason cache to somewhere better. -type ReasonCache struct { - lock sync.Mutex - cache *lru.Cache -} - -// Reason is the cached item in ReasonCache -type reasonItem struct { - Err error - Message string -} - -// maxReasonCacheEntries is the cache entry number in lru cache. 1000 is a proper number -// for our 100 pods per node target. If we support more pods per node in the future, we -// may want to increase the number. -const maxReasonCacheEntries = 1000 - -// NewReasonCache creates an instance of 'ReasonCache'. -func NewReasonCache() *ReasonCache { - return &ReasonCache{cache: lru.New(maxReasonCacheEntries)} -} - -func (c *ReasonCache) composeKey(uid types.UID, name string) string { - return fmt.Sprintf("%s_%s", uid, name) -} - -// add adds error reason into the cache -func (c *ReasonCache) add(uid types.UID, name string, reason error, message string) { - c.lock.Lock() - defer c.lock.Unlock() - c.cache.Add(c.composeKey(uid, name), reasonItem{reason, message}) -} - -// Update updates the reason cache with the SyncPodResult. Only SyncResult with -// StartContainer action will change the cache. -func (c *ReasonCache) Update(uid types.UID, result kubecontainer.PodSyncResult) { - for _, r := range result.SyncResults { - if r.Action != kubecontainer.StartContainer { - continue - } - name := r.Target.(string) - if r.Error != nil { - c.add(uid, name, r.Error, r.Message) - } else { - c.Remove(uid, name) - } - } -} - -// Remove removes error reason from the cache -func (c *ReasonCache) Remove(uid types.UID, name string) { - c.lock.Lock() - defer c.lock.Unlock() - c.cache.Remove(c.composeKey(uid, name)) -} - -// Get gets error reason from the cache. The return values are error reason, error message and -// whether an error reason is found in the cache. If no error reason is found, empty string will -// be returned for error reason and error message. -func (c *ReasonCache) Get(uid types.UID, name string) (*reasonItem, bool) { - c.lock.Lock() - defer c.lock.Unlock() - value, ok := c.cache.Get(c.composeKey(uid, name)) - if !ok { - return nil, false - } - info := value.(reasonItem) - return &info, true -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_image.go b/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_image.go index d6eae5e3..a6bc88f7 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_image.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_image.go @@ -17,6 +17,7 @@ limitations under the License. package remote import ( + "context" "errors" "fmt" "time" @@ -43,7 +44,10 @@ func NewRemoteImageService(endpoint string, connectionTimeout time.Duration) (in return nil, err } - conn, err := grpc.Dial(addr, grpc.WithInsecure(), grpc.WithTimeout(connectionTimeout), grpc.WithDialer(dailer), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize))) + ctx, cancel := context.WithTimeout(context.Background(), connectionTimeout) + defer cancel() + + conn, err := grpc.DialContext(ctx, addr, grpc.WithInsecure(), grpc.WithDialer(dailer), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize))) if err != nil { glog.Errorf("Connect remote image service %s failed: %v", addr, err) return nil, err diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_runtime.go b/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_runtime.go index 197cd913..f447b850 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_runtime.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/remote/remote_runtime.go @@ -45,7 +45,10 @@ func NewRemoteRuntimeService(endpoint string, connectionTimeout time.Duration) ( if err != nil { return nil, err } - conn, err := grpc.Dial(addr, grpc.WithInsecure(), grpc.WithTimeout(connectionTimeout), grpc.WithDialer(dailer), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize))) + ctx, cancel := context.WithTimeout(context.Background(), connectionTimeout) + defer cancel() + + conn, err := grpc.DialContext(ctx, addr, grpc.WithInsecure(), grpc.WithDialer(dailer), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize))) if err != nil { glog.Errorf("Connect remote runtime %s failed: %v", addr, err) return nil, err @@ -79,14 +82,15 @@ func (r *RemoteRuntimeService) Version(apiVersion string) (*runtimeapi.VersionRe // RunPodSandbox creates and starts a pod-level sandbox. Runtimes should ensure // the sandbox is in ready state. -func (r *RemoteRuntimeService) RunPodSandbox(config *runtimeapi.PodSandboxConfig) (string, error) { +func (r *RemoteRuntimeService) RunPodSandbox(config *runtimeapi.PodSandboxConfig, runtimeHandler string) (string, error) { // Use 2 times longer timeout for sandbox operation (4 mins by default) // TODO: Make the pod sandbox timeout configurable. ctx, cancel := getContextWithTimeout(r.timeout * 2) defer cancel() resp, err := r.runtimeClient.RunPodSandbox(ctx, &runtimeapi.RunPodSandboxRequest{ - Config: config, + Config: config, + RuntimeHandler: runtimeHandler, }) if err != nil { glog.Errorf("RunPodSandbox from runtime service failed: %v", err) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/remote/utils.go b/vendor/k8s.io/kubernetes/pkg/kubelet/remote/utils.go index 784882aa..b01b5614 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/remote/utils.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/remote/utils.go @@ -24,9 +24,9 @@ import ( runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" ) -// maxMsgSize use 8MB as the default message size limit. +// maxMsgSize use 16MB as the default message size limit. // grpc library default is 4MB -const maxMsgSize = 1024 * 1024 * 8 +const maxMsgSize = 1024 * 1024 * 16 // getContextWithTimeout returns a context with timeout. func getContextWithTimeout(timeout time.Duration) (context.Context, context.CancelFunc) { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go b/vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go deleted file mode 100644 index 294580e7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/runonce.go +++ /dev/null @@ -1,177 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "os" - "time" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/kubelet/util/format" -) - -const ( - runOnceManifestDelay = 1 * time.Second - runOnceMaxRetries = 10 - runOnceRetryDelay = 1 * time.Second - runOnceRetryDelayBackoff = 2 -) - -// RunPodResult defines the running results of a Pod. -type RunPodResult struct { - Pod *v1.Pod - Err error -} - -// RunOnce polls from one configuration update and run the associated pods. -func (kl *Kubelet) RunOnce(updates <-chan kubetypes.PodUpdate) ([]RunPodResult, error) { - // Setup filesystem directories. - if err := kl.setupDataDirs(); err != nil { - return nil, err - } - - // If the container logs directory does not exist, create it. - if _, err := os.Stat(ContainerLogsDir); err != nil { - if err := kl.os.MkdirAll(ContainerLogsDir, 0755); err != nil { - glog.Errorf("Failed to create directory %q: %v", ContainerLogsDir, err) - } - } - - select { - case u := <-updates: - glog.Infof("processing manifest with %d pods", len(u.Pods)) - result, err := kl.runOnce(u.Pods, runOnceRetryDelay) - glog.Infof("finished processing %d pods", len(u.Pods)) - return result, err - case <-time.After(runOnceManifestDelay): - return nil, fmt.Errorf("no pod manifest update after %v", runOnceManifestDelay) - } -} - -// runOnce runs a given set of pods and returns their status. -func (kl *Kubelet) runOnce(pods []*v1.Pod, retryDelay time.Duration) (results []RunPodResult, err error) { - ch := make(chan RunPodResult) - admitted := []*v1.Pod{} - for _, pod := range pods { - // Check if we can admit the pod. - if ok, reason, message := kl.canAdmitPod(admitted, pod); !ok { - kl.rejectPod(pod, reason, message) - results = append(results, RunPodResult{pod, nil}) - continue - } - - admitted = append(admitted, pod) - go func(pod *v1.Pod) { - err := kl.runPod(pod, retryDelay) - ch <- RunPodResult{pod, err} - }(pod) - } - - glog.Infof("Waiting for %d pods", len(admitted)) - failedPods := []string{} - for i := 0; i < len(admitted); i++ { - res := <-ch - results = append(results, res) - if res.Err != nil { - faliedContainerName, err := kl.getFailedContainers(res.Pod) - if err != nil { - glog.Infof("unable to get failed containers' names for pod %q, error:%v", format.Pod(res.Pod), err) - } else { - glog.Infof("unable to start pod %q because container:%v failed", format.Pod(res.Pod), faliedContainerName) - } - failedPods = append(failedPods, format.Pod(res.Pod)) - } else { - glog.Infof("started pod %q", format.Pod(res.Pod)) - } - } - if len(failedPods) > 0 { - return results, fmt.Errorf("error running pods: %v", failedPods) - } - glog.Infof("%d pods started", len(pods)) - return results, err -} - -// runPod runs a single pod and wait until all containers are running. -func (kl *Kubelet) runPod(pod *v1.Pod, retryDelay time.Duration) error { - delay := retryDelay - retry := 0 - for { - status, err := kl.containerRuntime.GetPodStatus(pod.UID, pod.Name, pod.Namespace) - if err != nil { - return fmt.Errorf("Unable to get status for pod %q: %v", format.Pod(pod), err) - } - - if kl.isPodRunning(pod, status) { - glog.Infof("pod %q containers running", format.Pod(pod)) - return nil - } - glog.Infof("pod %q containers not running: syncing", format.Pod(pod)) - - glog.Infof("Creating a mirror pod for static pod %q", format.Pod(pod)) - if err := kl.podManager.CreateMirrorPod(pod); err != nil { - glog.Errorf("Failed creating a mirror pod %q: %v", format.Pod(pod), err) - } - mirrorPod, _ := kl.podManager.GetMirrorPodByPod(pod) - if err = kl.syncPod(syncPodOptions{ - pod: pod, - mirrorPod: mirrorPod, - podStatus: status, - updateType: kubetypes.SyncPodUpdate, - }); err != nil { - return fmt.Errorf("error syncing pod %q: %v", format.Pod(pod), err) - } - if retry >= runOnceMaxRetries { - return fmt.Errorf("timeout error: pod %q containers not running after %d retries", format.Pod(pod), runOnceMaxRetries) - } - // TODO(proppy): health checking would be better than waiting + checking the state at the next iteration. - glog.Infof("pod %q containers synced, waiting for %v", format.Pod(pod), delay) - time.Sleep(delay) - retry++ - delay *= runOnceRetryDelayBackoff - } -} - -// isPodRunning returns true if all containers of a manifest are running. -func (kl *Kubelet) isPodRunning(pod *v1.Pod, status *kubecontainer.PodStatus) bool { - for _, c := range pod.Spec.Containers { - cs := status.FindContainerStatusByName(c.Name) - if cs == nil || cs.State != kubecontainer.ContainerStateRunning { - glog.Infof("Container %q for pod %q not running", c.Name, format.Pod(pod)) - return false - } - } - return true -} - -// getFailedContainer returns failed container name for pod. -func (kl *Kubelet) getFailedContainers(pod *v1.Pod) ([]string, error) { - status, err := kl.containerRuntime.GetPodStatus(pod.UID, pod.Name, pod.Namespace) - if err != nil { - return nil, fmt.Errorf("unable to get status for pod %q: %v", format.Pod(pod), err) - } - var containerNames []string - for _, cs := range status.ContainerStatuses { - if cs.State != kubecontainer.ContainerStateRunning && cs.ExitCode != 0 { - containerNames = append(containerNames, cs.Name) - } - } - return containerNames, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/runtime.go b/vendor/k8s.io/kubernetes/pkg/kubelet/runtime.go deleted file mode 100644 index 18883cb7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/runtime.go +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "sync" - "time" -) - -type runtimeState struct { - sync.RWMutex - lastBaseRuntimeSync time.Time - baseRuntimeSyncThreshold time.Duration - networkError error - internalError error - cidr string - healthChecks []*healthCheck -} - -// A health check function should be efficient and not rely on external -// components (e.g., container runtime). -type healthCheckFnType func() (bool, error) - -type healthCheck struct { - name string - fn healthCheckFnType -} - -func (s *runtimeState) addHealthCheck(name string, f healthCheckFnType) { - s.Lock() - defer s.Unlock() - s.healthChecks = append(s.healthChecks, &healthCheck{name: name, fn: f}) -} - -func (s *runtimeState) setRuntimeSync(t time.Time) { - s.Lock() - defer s.Unlock() - s.lastBaseRuntimeSync = t -} - -func (s *runtimeState) setInternalError(err error) { - s.Lock() - defer s.Unlock() - s.internalError = err -} - -func (s *runtimeState) setNetworkState(err error) { - s.Lock() - defer s.Unlock() - s.networkError = err -} - -func (s *runtimeState) setPodCIDR(cidr string) { - s.Lock() - defer s.Unlock() - s.cidr = cidr -} - -func (s *runtimeState) podCIDR() string { - s.RLock() - defer s.RUnlock() - return s.cidr -} - -func (s *runtimeState) runtimeErrors() []string { - s.RLock() - defer s.RUnlock() - var ret []string - if !s.lastBaseRuntimeSync.Add(s.baseRuntimeSyncThreshold).After(time.Now()) { - ret = append(ret, "container runtime is down") - } - if s.internalError != nil { - ret = append(ret, s.internalError.Error()) - } - for _, hc := range s.healthChecks { - if ok, err := hc.fn(); !ok { - ret = append(ret, fmt.Sprintf("%s is not healthy: %v", hc.name, err)) - } - } - - return ret -} - -func (s *runtimeState) networkErrors() []string { - s.RLock() - defer s.RUnlock() - var ret []string - if s.networkError != nil { - ret = append(ret, s.networkError.Error()) - } - return ret -} - -func newRuntimeState( - runtimeSyncThreshold time.Duration, -) *runtimeState { - return &runtimeState{ - lastBaseRuntimeSync: time.Time{}, - baseRuntimeSyncThreshold: runtimeSyncThreshold, - networkError: fmt.Errorf("network state unknown"), - internalError: nil, - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD new file mode 100644 index 00000000..6b7dcdde --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/BUILD @@ -0,0 +1,45 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["runtimeclass_manager.go"], + importpath = "k8s.io/kubernetes/pkg/kubelet/runtimeclass", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/client-go/dynamic:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/kubelet/runtimeclass/testing:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) + +go_test( + name = "go_default_test", + srcs = ["runtimeclass_manager_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/kubelet/runtimeclass/testing:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", + ], +) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/runtimeclass_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/runtimeclass_manager.go new file mode 100644 index 00000000..892240ae --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/runtimeclass/runtimeclass_manager.go @@ -0,0 +1,97 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 runtimeclass + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/tools/cache" +) + +var ( + runtimeClassGVR = schema.GroupVersionResource{ + Group: "node.k8s.io", + Version: "v1alpha1", + Resource: "runtimeclasses", + } +) + +// Manager caches RuntimeClass API objects, and provides accessors to the Kubelet. +type Manager struct { + informer cache.SharedInformer +} + +// NewManager returns a new RuntimeClass Manager. Run must be called before the manager can be used. +func NewManager(client dynamic.Interface) *Manager { + rc := client.Resource(runtimeClassGVR) + lw := &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + return rc.List(options) + }, + WatchFunc: rc.Watch, + } + informer := cache.NewSharedInformer(lw, &unstructured.Unstructured{}, 0) + + return &Manager{ + informer: informer, + } +} + +// Run starts syncing the RuntimeClass cache with the apiserver. +func (m *Manager) Run(stopCh <-chan struct{}) { + m.informer.Run(stopCh) +} + +// LookupRuntimeHandler returns the RuntimeHandler string associated with the given RuntimeClass +// name (or the default of "" for nil). If the RuntimeClass is not found, it returns an +// apierrors.NotFound error. +func (m *Manager) LookupRuntimeHandler(runtimeClassName *string) (string, error) { + if runtimeClassName == nil || *runtimeClassName == "" { + // The default RuntimeClass always resolves to the empty runtime handler. + return "", nil + } + + name := *runtimeClassName + item, exists, err := m.informer.GetStore().GetByKey(name) + if err != nil { + return "", fmt.Errorf("Failed to lookup RuntimeClass %s: %v", name, err) + } + if !exists { + return "", errors.NewNotFound(schema.GroupResource{ + Group: runtimeClassGVR.Group, + Resource: runtimeClassGVR.Resource, + }, name) + } + + rc, ok := item.(*unstructured.Unstructured) + if !ok { + return "", fmt.Errorf("unexpected RuntimeClass type %T", item) + } + + handler, _, err := unstructured.NestedString(rc.Object, "spec", "runtimeHandler") + if err != nil { + return "", fmt.Errorf("Invalid RuntimeClass object: %v", err) + } + + return handler, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD index 4b39334d..d3cc1773 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/secret/BUILD @@ -12,12 +12,12 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubelet/util/manager:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", ], ) @@ -30,13 +30,15 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/secret", deps = [ "//pkg/api/v1/pod:go_default_library", + "//pkg/apis/core/v1:go_default_library", "//pkg/kubelet/util/manager:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go index a3396941..c7b5b109 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/secret/secret_manager.go @@ -23,12 +23,14 @@ import ( "k8s.io/api/core/v1" clientset "k8s.io/client-go/kubernetes" podutil "k8s.io/kubernetes/pkg/api/v1/pod" + corev1 "k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/kubernetes/pkg/kubelet/util/manager" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/clock" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/watch" ) type Manager interface { @@ -123,3 +125,25 @@ func NewCachingSecretManager(kubeClient clientset.Interface, getTTL manager.GetO manager: manager.NewCacheBasedManager(secretStore, getSecretNames), } } + +// NewWatchingSecretManager creates a manager that keeps a cache of all secrets +// necessary for registered pods. +// It implements the following logic: +// - whenever a pod is created or updated, we start inidvidual watches for all +// referenced objects that aren't referenced from other registered pods +// - every GetObject() returns a value from local cache propagated via watches +func NewWatchingSecretManager(kubeClient clientset.Interface) Manager { + listSecret := func(namespace string, opts metav1.ListOptions) (runtime.Object, error) { + return kubeClient.CoreV1().Secrets(namespace).List(opts) + } + watchSecret := func(namespace string, opts metav1.ListOptions) (watch.Interface, error) { + return kubeClient.CoreV1().Secrets(namespace).Watch(opts) + } + newSecret := func() runtime.Object { + return &v1.Secret{} + } + gr := corev1.Resource("secret") + return &secretManager{ + manager: manager.NewWatchBasedManager(listSecret, watchSecret, newSecret, gr, getSecretNames), + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD deleted file mode 100644 index 69a71140..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/BUILD +++ /dev/null @@ -1,105 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "auth.go", - "doc.go", - "server.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/server", - deps = [ - "//pkg/api/legacyscheme:go_default_library", - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/v1/validation:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/prober:go_default_library", - "//pkg/kubelet/server/portforward:go_default_library", - "//pkg/kubelet/server/remotecommand:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/server/streaming:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/util/configz:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/metrics:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/proxy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server/healthz:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/flushwriter:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "auth_test.go", - "server_test.go", - "server_websocket_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/install:go_default_library", - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/server/portforward:go_default_library", - "//pkg/kubelet/server/remotecommand:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/server/streaming:go_default_library", - "//pkg/volume:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", - "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/server/portforward:all-srcs", - "//pkg/kubelet/server/remotecommand:all-srcs", - "//pkg/kubelet/server/stats:all-srcs", - "//pkg/kubelet/server/streaming:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go deleted file mode 100644 index 94a4d309..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/auth.go +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 server - -import ( - "net/http" - "strings" - - "github.com/golang/glog" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apiserver/pkg/authentication/authenticator" - "k8s.io/apiserver/pkg/authentication/user" - "k8s.io/apiserver/pkg/authorization/authorizer" -) - -// KubeletAuth implements AuthInterface -type KubeletAuth struct { - // authenticator identifies the user for requests to the Kubelet API - authenticator.Request - // authorizerAttributeGetter builds authorization.Attributes for a request to the Kubelet API - authorizer.RequestAttributesGetter - // authorizer determines whether a given authorization.Attributes is allowed - authorizer.Authorizer -} - -// NewKubeletAuth returns a kubelet.AuthInterface composed of the given authenticator, attribute getter, and authorizer -func NewKubeletAuth(authenticator authenticator.Request, authorizerAttributeGetter authorizer.RequestAttributesGetter, authorizer authorizer.Authorizer) AuthInterface { - return &KubeletAuth{authenticator, authorizerAttributeGetter, authorizer} -} - -func NewNodeAuthorizerAttributesGetter(nodeName types.NodeName) authorizer.RequestAttributesGetter { - return nodeAuthorizerAttributesGetter{nodeName: nodeName} -} - -type nodeAuthorizerAttributesGetter struct { - nodeName types.NodeName -} - -func isSubpath(subpath, path string) bool { - path = strings.TrimSuffix(path, "/") - return subpath == path || (strings.HasPrefix(subpath, path) && subpath[len(path)] == '/') -} - -// GetRequestAttributes populates authorizer attributes for the requests to the kubelet API. -// Default attributes are: {apiVersion=v1,verb=,resource=nodes,name=,subresource=proxy} -// More specific verb/resource is set for the following request patterns: -// /stats/* => verb=, resource=nodes, name=, subresource=stats -// /metrics/* => verb=, resource=nodes, name=, subresource=metrics -// /logs/* => verb=, resource=nodes, name=, subresource=log -// /spec/* => verb=, resource=nodes, name=, subresource=spec -func (n nodeAuthorizerAttributesGetter) GetRequestAttributes(u user.Info, r *http.Request) authorizer.Attributes { - - apiVerb := "" - switch r.Method { - case "POST": - apiVerb = "create" - case "GET": - apiVerb = "get" - case "PUT": - apiVerb = "update" - case "PATCH": - apiVerb = "patch" - case "DELETE": - apiVerb = "delete" - } - - requestPath := r.URL.Path - - // Default attributes mirror the API attributes that would allow this access to the kubelet API - attrs := authorizer.AttributesRecord{ - User: u, - Verb: apiVerb, - Namespace: "", - APIGroup: "", - APIVersion: "v1", - Resource: "nodes", - Subresource: "proxy", - Name: string(n.nodeName), - ResourceRequest: true, - Path: requestPath, - } - - // Override subresource for specific paths - // This allows subdividing access to the kubelet API - switch { - case isSubpath(requestPath, statsPath): - attrs.Subresource = "stats" - case isSubpath(requestPath, metricsPath): - attrs.Subresource = "metrics" - case isSubpath(requestPath, logsPath): - // "log" to match other log subresources (pods/log, etc) - attrs.Subresource = "log" - case isSubpath(requestPath, specPath): - attrs.Subresource = "spec" - } - - glog.V(5).Infof("Node request attributes: attrs=%#v", attrs) - - return attrs -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/doc.go deleted file mode 100644 index 843c0a58..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 server contains functions related to serving Kubelet's external interface. -package server // import "k8s.io/kubernetes/pkg/kubelet/server" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/BUILD index 1b2a5837..07541328 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/BUILD @@ -17,13 +17,13 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/server/portforward", deps = [ "//pkg/apis/core:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/wsstream:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/wsstream:go_default_library", ], ) @@ -36,7 +36,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/httpstream.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/httpstream.go index 919ed5a7..be2426ea 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/httpstream.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/portforward/httpstream.go @@ -46,7 +46,7 @@ func handleHttpStreams(req *http.Request, w http.ResponseWriter, portForwarder P upgrader := spdy.NewResponseUpgrader() conn := upgrader.UpgradeResponse(w, req, httpStreamReceived(streamChan)) if conn == nil { - return errors.New("Unable to upgrade websocket connection") + return errors.New("Unable to upgrade httpstream connection") } defer conn.Close() diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/remotecommand/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/remotecommand/BUILD index 97da39d6..776abc76 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/remotecommand/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/remotecommand/BUILD @@ -17,17 +17,17 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/server/remotecommand", deps = [ "//pkg/apis/core:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/wsstream:go_default_library", + "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server/httplog:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/wsstream:go_default_library", - "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go deleted file mode 100644 index b96bf6b1..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go +++ /dev/null @@ -1,837 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 server - -import ( - "crypto/tls" - "fmt" - "io" - "net" - "net/http" - "net/http/pprof" - "net/url" - "reflect" - goruntime "runtime" - "strconv" - "strings" - "time" - - restful "github.com/emicklei/go-restful" - "github.com/golang/glog" - cadvisorapi "github.com/google/cadvisor/info/v1" - "github.com/google/cadvisor/metrics" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/proxy" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apiserver/pkg/authentication/authenticator" - "k8s.io/apiserver/pkg/authorization/authorizer" - "k8s.io/apiserver/pkg/server/healthz" - "k8s.io/apiserver/pkg/server/httplog" - "k8s.io/apiserver/pkg/util/flushwriter" - "k8s.io/kubernetes/pkg/api/legacyscheme" - api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/apis/core/v1/validation" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/prober" - "k8s.io/kubernetes/pkg/kubelet/server/portforward" - remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" - "k8s.io/kubernetes/pkg/kubelet/server/stats" - "k8s.io/kubernetes/pkg/kubelet/server/streaming" - kubelettypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/util/configz" -) - -const ( - metricsPath = "/metrics" - cadvisorMetricsPath = "/metrics/cadvisor" - proberMetricsPath = "/metrics/probes" - specPath = "/spec/" - statsPath = "/stats/" - logsPath = "/logs/" -) - -// Server is a http.Handler which exposes kubelet functionality over HTTP. -type Server struct { - auth AuthInterface - host HostInterface - restfulCont containerInterface - resourceAnalyzer stats.ResourceAnalyzer - redirectContainerStreaming bool -} - -type TLSOptions struct { - Config *tls.Config - CertFile string - KeyFile string -} - -// containerInterface defines the restful.Container functions used on the root container -type containerInterface interface { - Add(service *restful.WebService) *restful.Container - Handle(path string, handler http.Handler) - Filter(filter restful.FilterFunction) - ServeHTTP(w http.ResponseWriter, r *http.Request) - RegisteredWebServices() []*restful.WebService - - // RegisteredHandlePaths returns the paths of handlers registered directly with the container (non-web-services) - // Used to test filters are being applied on non-web-service handlers - RegisteredHandlePaths() []string -} - -// filteringContainer delegates all Handle(...) calls to Container.HandleWithFilter(...), -// so we can ensure restful.FilterFunctions are used for all handlers -type filteringContainer struct { - *restful.Container - registeredHandlePaths []string -} - -func (a *filteringContainer) Handle(path string, handler http.Handler) { - a.HandleWithFilter(path, handler) - a.registeredHandlePaths = append(a.registeredHandlePaths, path) -} -func (a *filteringContainer) RegisteredHandlePaths() []string { - return a.registeredHandlePaths -} - -// ListenAndServeKubeletServer initializes a server to respond to HTTP network requests on the Kubelet. -func ListenAndServeKubeletServer( - host HostInterface, - resourceAnalyzer stats.ResourceAnalyzer, - address net.IP, - port uint, - tlsOptions *TLSOptions, - auth AuthInterface, - enableDebuggingHandlers, - enableContentionProfiling, - redirectContainerStreaming bool, - criHandler http.Handler) { - glog.Infof("Starting to listen on %s:%d", address, port) - handler := NewServer(host, resourceAnalyzer, auth, enableDebuggingHandlers, enableContentionProfiling, redirectContainerStreaming, criHandler) - s := &http.Server{ - Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), - Handler: &handler, - MaxHeaderBytes: 1 << 20, - } - if tlsOptions != nil { - s.TLSConfig = tlsOptions.Config - // Passing empty strings as the cert and key files means no - // cert/keys are specified and GetCertificate in the TLSConfig - // should be called instead. - glog.Fatal(s.ListenAndServeTLS(tlsOptions.CertFile, tlsOptions.KeyFile)) - } else { - glog.Fatal(s.ListenAndServe()) - } -} - -// ListenAndServeKubeletReadOnlyServer initializes a server to respond to HTTP network requests on the Kubelet. -func ListenAndServeKubeletReadOnlyServer(host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, address net.IP, port uint) { - glog.V(1).Infof("Starting to listen read-only on %s:%d", address, port) - s := NewServer(host, resourceAnalyzer, nil, false, false, false, nil) - - server := &http.Server{ - Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), - Handler: &s, - MaxHeaderBytes: 1 << 20, - } - glog.Fatal(server.ListenAndServe()) -} - -// AuthInterface contains all methods required by the auth filters -type AuthInterface interface { - authenticator.Request - authorizer.RequestAttributesGetter - authorizer.Authorizer -} - -// HostInterface contains all the kubelet methods required by the server. -// For testability. -type HostInterface interface { - stats.StatsProvider - GetVersionInfo() (*cadvisorapi.VersionInfo, error) - GetCachedMachineInfo() (*cadvisorapi.MachineInfo, error) - GetRunningPods() ([]*v1.Pod, error) - RunInContainer(name string, uid types.UID, container string, cmd []string) ([]byte, error) - GetKubeletContainerLogs(podFullName, containerName string, logOptions *v1.PodLogOptions, stdout, stderr io.Writer) error - ServeLogs(w http.ResponseWriter, req *http.Request) - ResyncInterval() time.Duration - GetHostname() string - LatestLoopEntryTime() time.Time - GetExec(podFullName string, podUID types.UID, containerName string, cmd []string, streamOpts remotecommandserver.Options) (*url.URL, error) - GetAttach(podFullName string, podUID types.UID, containerName string, streamOpts remotecommandserver.Options) (*url.URL, error) - GetPortForward(podName, podNamespace string, podUID types.UID, portForwardOpts portforward.V4Options) (*url.URL, error) -} - -// NewServer initializes and configures a kubelet.Server object to handle HTTP requests. -func NewServer( - host HostInterface, - resourceAnalyzer stats.ResourceAnalyzer, - auth AuthInterface, - enableDebuggingHandlers, - enableContentionProfiling, - redirectContainerStreaming bool, - criHandler http.Handler) Server { - server := Server{ - host: host, - resourceAnalyzer: resourceAnalyzer, - auth: auth, - restfulCont: &filteringContainer{Container: restful.NewContainer()}, - redirectContainerStreaming: redirectContainerStreaming, - } - if auth != nil { - server.InstallAuthFilter() - } - server.InstallDefaultHandlers() - if enableDebuggingHandlers { - server.InstallDebuggingHandlers(criHandler) - if enableContentionProfiling { - goruntime.SetBlockProfileRate(1) - } - } else { - server.InstallDebuggingDisabledHandlers() - } - return server -} - -// InstallAuthFilter installs authentication filters with the restful Container. -func (s *Server) InstallAuthFilter() { - s.restfulCont.Filter(func(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - // Authenticate - u, ok, err := s.auth.AuthenticateRequest(req.Request) - if err != nil { - glog.Errorf("Unable to authenticate the request due to an error: %v", err) - resp.WriteErrorString(http.StatusUnauthorized, "Unauthorized") - return - } - if !ok { - resp.WriteErrorString(http.StatusUnauthorized, "Unauthorized") - return - } - - // Get authorization attributes - attrs := s.auth.GetRequestAttributes(u, req.Request) - - // Authorize - decision, _, err := s.auth.Authorize(attrs) - if err != nil { - msg := fmt.Sprintf("Authorization error (user=%s, verb=%s, resource=%s, subresource=%s)", u.GetName(), attrs.GetVerb(), attrs.GetResource(), attrs.GetSubresource()) - glog.Errorf(msg, err) - resp.WriteErrorString(http.StatusInternalServerError, msg) - return - } - if decision != authorizer.DecisionAllow { - msg := fmt.Sprintf("Forbidden (user=%s, verb=%s, resource=%s, subresource=%s)", u.GetName(), attrs.GetVerb(), attrs.GetResource(), attrs.GetSubresource()) - glog.V(2).Info(msg) - resp.WriteErrorString(http.StatusForbidden, msg) - return - } - - // Continue - chain.ProcessFilter(req, resp) - }) -} - -// InstallDefaultHandlers registers the default set of supported HTTP request -// patterns with the restful Container. -func (s *Server) InstallDefaultHandlers() { - healthz.InstallHandler(s.restfulCont, - healthz.PingHealthz, - healthz.NamedCheck("syncloop", s.syncLoopHealthCheck), - ) - ws := new(restful.WebService) - ws. - Path("/pods"). - Produces(restful.MIME_JSON) - ws.Route(ws.GET(""). - To(s.getPods). - Operation("getPods")) - s.restfulCont.Add(ws) - - s.restfulCont.Add(stats.CreateHandlers(statsPath, s.host, s.resourceAnalyzer)) - s.restfulCont.Handle(metricsPath, prometheus.Handler()) - - // cAdvisor metrics are exposed under the secured handler as well - r := prometheus.NewRegistry() - r.MustRegister(metrics.NewPrometheusCollector(prometheusHostAdapter{s.host}, containerPrometheusLabelsFunc(s.host))) - s.restfulCont.Handle(cadvisorMetricsPath, - promhttp.HandlerFor(r, promhttp.HandlerOpts{ErrorHandling: promhttp.ContinueOnError}), - ) - - // prober metrics are exposed under a different endpoint - p := prometheus.NewRegistry() - p.MustRegister(prober.ProberResults) - s.restfulCont.Handle(proberMetricsPath, - promhttp.HandlerFor(p, promhttp.HandlerOpts{ErrorHandling: promhttp.ContinueOnError}), - ) - - ws = new(restful.WebService) - ws. - Path(specPath). - Produces(restful.MIME_JSON) - ws.Route(ws.GET(""). - To(s.getSpec). - Operation("getSpec"). - Writes(cadvisorapi.MachineInfo{})) - s.restfulCont.Add(ws) -} - -const pprofBasePath = "/debug/pprof/" - -// InstallDebuggingHandlers registers the HTTP request patterns that serve logs or run commands/containers -func (s *Server) InstallDebuggingHandlers(criHandler http.Handler) { - glog.Infof("Adding debug handlers to kubelet server.") - - ws := new(restful.WebService) - ws. - Path("/run") - ws.Route(ws.POST("/{podNamespace}/{podID}/{containerName}"). - To(s.getRun). - Operation("getRun")) - ws.Route(ws.POST("/{podNamespace}/{podID}/{uid}/{containerName}"). - To(s.getRun). - Operation("getRun")) - s.restfulCont.Add(ws) - - ws = new(restful.WebService) - ws. - Path("/exec") - ws.Route(ws.GET("/{podNamespace}/{podID}/{containerName}"). - To(s.getExec). - Operation("getExec")) - ws.Route(ws.POST("/{podNamespace}/{podID}/{containerName}"). - To(s.getExec). - Operation("getExec")) - ws.Route(ws.GET("/{podNamespace}/{podID}/{uid}/{containerName}"). - To(s.getExec). - Operation("getExec")) - ws.Route(ws.POST("/{podNamespace}/{podID}/{uid}/{containerName}"). - To(s.getExec). - Operation("getExec")) - s.restfulCont.Add(ws) - - ws = new(restful.WebService) - ws. - Path("/attach") - ws.Route(ws.GET("/{podNamespace}/{podID}/{containerName}"). - To(s.getAttach). - Operation("getAttach")) - ws.Route(ws.POST("/{podNamespace}/{podID}/{containerName}"). - To(s.getAttach). - Operation("getAttach")) - ws.Route(ws.GET("/{podNamespace}/{podID}/{uid}/{containerName}"). - To(s.getAttach). - Operation("getAttach")) - ws.Route(ws.POST("/{podNamespace}/{podID}/{uid}/{containerName}"). - To(s.getAttach). - Operation("getAttach")) - s.restfulCont.Add(ws) - - ws = new(restful.WebService) - ws. - Path("/portForward") - ws.Route(ws.GET("/{podNamespace}/{podID}"). - To(s.getPortForward). - Operation("getPortForward")) - ws.Route(ws.POST("/{podNamespace}/{podID}"). - To(s.getPortForward). - Operation("getPortForward")) - ws.Route(ws.GET("/{podNamespace}/{podID}/{uid}"). - To(s.getPortForward). - Operation("getPortForward")) - ws.Route(ws.POST("/{podNamespace}/{podID}/{uid}"). - To(s.getPortForward). - Operation("getPortForward")) - s.restfulCont.Add(ws) - - ws = new(restful.WebService) - ws. - Path(logsPath) - ws.Route(ws.GET(""). - To(s.getLogs). - Operation("getLogs")) - ws.Route(ws.GET("/{logpath:*}"). - To(s.getLogs). - Operation("getLogs"). - Param(ws.PathParameter("logpath", "path to the log").DataType("string"))) - s.restfulCont.Add(ws) - - ws = new(restful.WebService) - ws. - Path("/containerLogs") - ws.Route(ws.GET("/{podNamespace}/{podID}/{containerName}"). - To(s.getContainerLogs). - Operation("getContainerLogs")) - s.restfulCont.Add(ws) - - configz.InstallHandler(s.restfulCont) - - handlePprofEndpoint := func(req *restful.Request, resp *restful.Response) { - name := strings.TrimPrefix(req.Request.URL.Path, pprofBasePath) - switch name { - case "profile": - pprof.Profile(resp, req.Request) - case "symbol": - pprof.Symbol(resp, req.Request) - case "cmdline": - pprof.Cmdline(resp, req.Request) - case "trace": - pprof.Trace(resp, req.Request) - default: - pprof.Index(resp, req.Request) - } - } - - // Setup pprof handlers. - ws = new(restful.WebService).Path(pprofBasePath) - ws.Route(ws.GET("/{subpath:*}").To(func(req *restful.Request, resp *restful.Response) { - handlePprofEndpoint(req, resp) - })).Doc("pprof endpoint") - s.restfulCont.Add(ws) - - // The /runningpods endpoint is used for testing only. - ws = new(restful.WebService) - ws. - Path("/runningpods/"). - Produces(restful.MIME_JSON) - ws.Route(ws.GET(""). - To(s.getRunningPods). - Operation("getRunningPods")) - s.restfulCont.Add(ws) - - if criHandler != nil { - s.restfulCont.Handle("/cri/", criHandler) - } -} - -// InstallDebuggingDisabledHandlers registers the HTTP request patterns that provide better error message -func (s *Server) InstallDebuggingDisabledHandlers() { - h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - http.Error(w, "Debug endpoints are disabled.", http.StatusMethodNotAllowed) - }) - - paths := []string{ - "/run/", "/exec/", "/attach/", "/portForward/", "/containerLogs/", - "/runningpods/", pprofBasePath, logsPath} - for _, p := range paths { - s.restfulCont.Handle(p, h) - } -} - -// Checks if kubelet's sync loop that updates containers is working. -func (s *Server) syncLoopHealthCheck(req *http.Request) error { - duration := s.host.ResyncInterval() * 2 - minDuration := time.Minute * 5 - if duration < minDuration { - duration = minDuration - } - enterLoopTime := s.host.LatestLoopEntryTime() - if !enterLoopTime.IsZero() && time.Now().After(enterLoopTime.Add(duration)) { - return fmt.Errorf("sync Loop took longer than expected") - } - return nil -} - -// getContainerLogs handles containerLogs request against the Kubelet -func (s *Server) getContainerLogs(request *restful.Request, response *restful.Response) { - podNamespace := request.PathParameter("podNamespace") - podID := request.PathParameter("podID") - containerName := request.PathParameter("containerName") - - if len(podID) == 0 { - // TODO: Why return JSON when the rest return plaintext errors? - // TODO: Why return plaintext errors? - response.WriteError(http.StatusBadRequest, fmt.Errorf(`{"message": "Missing podID."}`)) - return - } - if len(containerName) == 0 { - // TODO: Why return JSON when the rest return plaintext errors? - response.WriteError(http.StatusBadRequest, fmt.Errorf(`{"message": "Missing container name."}`)) - return - } - if len(podNamespace) == 0 { - // TODO: Why return JSON when the rest return plaintext errors? - response.WriteError(http.StatusBadRequest, fmt.Errorf(`{"message": "Missing podNamespace."}`)) - return - } - - query := request.Request.URL.Query() - // backwards compatibility for the "tail" query parameter - if tail := request.QueryParameter("tail"); len(tail) > 0 { - query["tailLines"] = []string{tail} - // "all" is the same as omitting tail - if tail == "all" { - delete(query, "tailLines") - } - } - // container logs on the kubelet are locked to the v1 API version of PodLogOptions - logOptions := &v1.PodLogOptions{} - if err := legacyscheme.ParameterCodec.DecodeParameters(query, v1.SchemeGroupVersion, logOptions); err != nil { - response.WriteError(http.StatusBadRequest, fmt.Errorf(`{"message": "Unable to decode query."}`)) - return - } - logOptions.TypeMeta = metav1.TypeMeta{} - if errs := validation.ValidatePodLogOptions(logOptions); len(errs) > 0 { - response.WriteError(http.StatusUnprocessableEntity, fmt.Errorf(`{"message": "Invalid request."}`)) - return - } - - pod, ok := s.host.GetPodByName(podNamespace, podID) - if !ok { - response.WriteError(http.StatusNotFound, fmt.Errorf("pod %q does not exist\n", podID)) - return - } - // Check if containerName is valid. - containerExists := false - for _, container := range pod.Spec.Containers { - if container.Name == containerName { - containerExists = true - break - } - } - if !containerExists { - for _, container := range pod.Spec.InitContainers { - if container.Name == containerName { - containerExists = true - break - } - } - } - if !containerExists { - response.WriteError(http.StatusNotFound, fmt.Errorf("container %q not found in pod %q\n", containerName, podID)) - return - } - - if _, ok := response.ResponseWriter.(http.Flusher); !ok { - response.WriteError(http.StatusInternalServerError, fmt.Errorf("unable to convert %v into http.Flusher, cannot show logs\n", reflect.TypeOf(response))) - return - } - fw := flushwriter.Wrap(response.ResponseWriter) - response.Header().Set("Transfer-Encoding", "chunked") - if err := s.host.GetKubeletContainerLogs(kubecontainer.GetPodFullName(pod), containerName, logOptions, fw, fw); err != nil { - response.WriteError(http.StatusBadRequest, err) - return - } -} - -// encodePods creates an v1.PodList object from pods and returns the encoded -// PodList. -func encodePods(pods []*v1.Pod) (data []byte, err error) { - podList := new(v1.PodList) - for _, pod := range pods { - podList.Items = append(podList.Items, *pod) - } - // TODO: this needs to be parameterized to the kubelet, not hardcoded. Depends on Kubelet - // as API server refactor. - // TODO: Locked to v1, needs to be made generic - codec := legacyscheme.Codecs.LegacyCodec(schema.GroupVersion{Group: v1.GroupName, Version: "v1"}) - return runtime.Encode(codec, podList) -} - -// getPods returns a list of pods bound to the Kubelet and their spec. -func (s *Server) getPods(request *restful.Request, response *restful.Response) { - pods := s.host.GetPods() - data, err := encodePods(pods) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - writeJsonResponse(response, data) -} - -// getRunningPods returns a list of pods running on Kubelet. The list is -// provided by the container runtime, and is different from the list returned -// by getPods, which is a set of desired pods to run. -func (s *Server) getRunningPods(request *restful.Request, response *restful.Response) { - pods, err := s.host.GetRunningPods() - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - data, err := encodePods(pods) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - writeJsonResponse(response, data) -} - -// getLogs handles logs requests against the Kubelet. -func (s *Server) getLogs(request *restful.Request, response *restful.Response) { - s.host.ServeLogs(response, request.Request) -} - -// getSpec handles spec requests against the Kubelet. -func (s *Server) getSpec(request *restful.Request, response *restful.Response) { - info, err := s.host.GetCachedMachineInfo() - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - response.WriteEntity(info) -} - -type execRequestParams struct { - podNamespace string - podName string - podUID types.UID - containerName string - cmd []string -} - -func getExecRequestParams(req *restful.Request) execRequestParams { - return execRequestParams{ - podNamespace: req.PathParameter("podNamespace"), - podName: req.PathParameter("podID"), - podUID: types.UID(req.PathParameter("uid")), - containerName: req.PathParameter("containerName"), - cmd: req.Request.URL.Query()[api.ExecCommandParam], - } -} - -type portForwardRequestParams struct { - podNamespace string - podName string - podUID types.UID -} - -func getPortForwardRequestParams(req *restful.Request) portForwardRequestParams { - return portForwardRequestParams{ - podNamespace: req.PathParameter("podNamespace"), - podName: req.PathParameter("podID"), - podUID: types.UID(req.PathParameter("uid")), - } -} - -type responder struct { - errorMessage string -} - -func (r *responder) Error(w http.ResponseWriter, req *http.Request, err error) { - glog.Errorf("Error while proxying request: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) -} - -// proxyStream proxies stream to url. -func proxyStream(w http.ResponseWriter, r *http.Request, url *url.URL) { - // TODO(random-liu): Set MaxBytesPerSec to throttle the stream. - handler := proxy.NewUpgradeAwareHandler(url, nil /*transport*/, false /*wrapTransport*/, true /*upgradeRequired*/, &responder{}) - handler.ServeHTTP(w, r) -} - -// getAttach handles requests to attach to a container. -func (s *Server) getAttach(request *restful.Request, response *restful.Response) { - params := getExecRequestParams(request) - streamOpts, err := remotecommandserver.NewOptions(request.Request) - if err != nil { - utilruntime.HandleError(err) - response.WriteError(http.StatusBadRequest, err) - return - } - pod, ok := s.host.GetPodByName(params.podNamespace, params.podName) - if !ok { - response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist")) - return - } - - podFullName := kubecontainer.GetPodFullName(pod) - url, err := s.host.GetAttach(podFullName, params.podUID, params.containerName, *streamOpts) - if err != nil { - streaming.WriteError(err, response.ResponseWriter) - return - } - - if s.redirectContainerStreaming { - http.Redirect(response.ResponseWriter, request.Request, url.String(), http.StatusFound) - return - } - proxyStream(response.ResponseWriter, request.Request, url) -} - -// getExec handles requests to run a command inside a container. -func (s *Server) getExec(request *restful.Request, response *restful.Response) { - params := getExecRequestParams(request) - streamOpts, err := remotecommandserver.NewOptions(request.Request) - if err != nil { - utilruntime.HandleError(err) - response.WriteError(http.StatusBadRequest, err) - return - } - pod, ok := s.host.GetPodByName(params.podNamespace, params.podName) - if !ok { - response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist")) - return - } - - podFullName := kubecontainer.GetPodFullName(pod) - url, err := s.host.GetExec(podFullName, params.podUID, params.containerName, params.cmd, *streamOpts) - if err != nil { - streaming.WriteError(err, response.ResponseWriter) - return - } - if s.redirectContainerStreaming { - http.Redirect(response.ResponseWriter, request.Request, url.String(), http.StatusFound) - return - } - proxyStream(response.ResponseWriter, request.Request, url) -} - -// getRun handles requests to run a command inside a container. -func (s *Server) getRun(request *restful.Request, response *restful.Response) { - params := getExecRequestParams(request) - pod, ok := s.host.GetPodByName(params.podNamespace, params.podName) - if !ok { - response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist")) - return - } - - // For legacy reasons, run uses different query param than exec. - params.cmd = strings.Split(request.QueryParameter("cmd"), " ") - data, err := s.host.RunInContainer(kubecontainer.GetPodFullName(pod), params.podUID, params.containerName, params.cmd) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - writeJsonResponse(response, data) -} - -// Derived from go-restful writeJSON. -func writeJsonResponse(response *restful.Response, data []byte) { - if data == nil { - response.WriteHeader(http.StatusOK) - // do not write a nil representation - return - } - response.Header().Set(restful.HEADER_ContentType, restful.MIME_JSON) - response.WriteHeader(http.StatusOK) - if _, err := response.Write(data); err != nil { - glog.Errorf("Error writing response: %v", err) - } -} - -// getPortForward handles a new restful port forward request. It determines the -// pod name and uid and then calls ServePortForward. -func (s *Server) getPortForward(request *restful.Request, response *restful.Response) { - params := getPortForwardRequestParams(request) - - portForwardOptions, err := portforward.NewV4Options(request.Request) - if err != nil { - utilruntime.HandleError(err) - response.WriteError(http.StatusBadRequest, err) - return - } - pod, ok := s.host.GetPodByName(params.podNamespace, params.podName) - if !ok { - response.WriteError(http.StatusNotFound, fmt.Errorf("pod does not exist")) - return - } - if len(params.podUID) > 0 && pod.UID != params.podUID { - response.WriteError(http.StatusNotFound, fmt.Errorf("pod not found")) - return - } - - url, err := s.host.GetPortForward(pod.Name, pod.Namespace, pod.UID, *portForwardOptions) - if err != nil { - streaming.WriteError(err, response.ResponseWriter) - return - } - if s.redirectContainerStreaming { - http.Redirect(response.ResponseWriter, request.Request, url.String(), http.StatusFound) - return - } - proxyStream(response.ResponseWriter, request.Request, url) -} - -// ServeHTTP responds to HTTP requests on the Kubelet. -func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { - defer httplog.NewLogged(req, &w).StacktraceWhen( - httplog.StatusIsNot( - http.StatusOK, - http.StatusFound, - http.StatusMovedPermanently, - http.StatusTemporaryRedirect, - http.StatusBadRequest, - http.StatusNotFound, - http.StatusSwitchingProtocols, - ), - ).Log() - s.restfulCont.ServeHTTP(w, req) -} - -// prometheusHostAdapter adapts the HostInterface to the interface expected by the -// cAdvisor prometheus collector. -type prometheusHostAdapter struct { - host HostInterface -} - -func (a prometheusHostAdapter) SubcontainersInfo(containerName string, query *cadvisorapi.ContainerInfoRequest) ([]*cadvisorapi.ContainerInfo, error) { - all, err := a.host.GetRawContainerInfo(containerName, query, true) - items := make([]*cadvisorapi.ContainerInfo, 0, len(all)) - for _, v := range all { - items = append(items, v) - } - return items, err -} -func (a prometheusHostAdapter) GetVersionInfo() (*cadvisorapi.VersionInfo, error) { - return a.host.GetVersionInfo() -} -func (a prometheusHostAdapter) GetMachineInfo() (*cadvisorapi.MachineInfo, error) { - return a.host.GetCachedMachineInfo() -} - -func containerPrometheusLabelsFunc(s stats.StatsProvider) metrics.ContainerLabelsFunc { - // containerPrometheusLabels maps cAdvisor labels to prometheus labels. - return func(c *cadvisorapi.ContainerInfo) map[string]string { - // Prometheus requires that all metrics in the same family have the same labels, - // so we arrange to supply blank strings for missing labels - var name, image, podName, namespace, containerName string - if len(c.Aliases) > 0 { - name = c.Aliases[0] - } - image = c.Spec.Image - if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNameLabel]; ok { - podName = v - } - if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNamespaceLabel]; ok { - namespace = v - } - if v, ok := c.Spec.Labels[kubelettypes.KubernetesContainerNameLabel]; ok { - containerName = v - } - // Associate pod cgroup with pod so we have an accurate accounting of sandbox - if podName == "" && namespace == "" { - if pod, found := s.GetPodByCgroupfs(c.Name); found { - podName = pod.Name - namespace = pod.Namespace - } - } - set := map[string]string{ - metrics.LabelID: c.Name, - metrics.LabelName: name, - metrics.LabelImage: image, - "pod_name": podName, - "namespace": namespace, - "container_name": containerName, - } - return set - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD deleted file mode 100644 index 16a3791a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fs_resource_analyzer.go", - "handler.go", - "resource_analyzer.go", - "summary.go", - "volume_stat_calculator.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/server/stats", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/volume:go_default_library", - "//vendor/github.com/emicklei/go-restful:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "summary_test.go", - "volume_stat_calculator_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/server/stats/testing:go_default_library", - "//pkg/volume:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/server/stats/testing:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/doc.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/doc.go deleted file mode 100644 index a43a61e4..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/doc.go +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -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 stats handles exporting Kubelet and container stats. -// NOTE: We intend to move this functionality into a standalone pod, so this package should be very -// loosely coupled to the rest of the Kubelet. -package stats // import "k8s.io/kubernetes/pkg/kubelet/server/stats" diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go deleted file mode 100644 index 5f72134c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/fs_resource_analyzer.go +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 stats - -import ( - "sync" - "sync/atomic" - "time" - - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - - "github.com/golang/glog" -) - -// Map to PodVolumeStats pointers since the addresses for map values are not constant and can cause pain -// if we need ever to get a pointer to one of the values (e.g. you can't) -type Cache map[types.UID]*volumeStatCalculator - -// fsResourceAnalyzerInterface is for embedding fs functions into ResourceAnalyzer -type fsResourceAnalyzerInterface interface { - GetPodVolumeStats(uid types.UID) (PodVolumeStats, bool) -} - -// fsResourceAnalyzer provides stats about fs resource usage -type fsResourceAnalyzer struct { - statsProvider StatsProvider - calcPeriod time.Duration - cachedVolumeStats atomic.Value - startOnce sync.Once -} - -var _ fsResourceAnalyzerInterface = &fsResourceAnalyzer{} - -// newFsResourceAnalyzer returns a new fsResourceAnalyzer implementation -func newFsResourceAnalyzer(statsProvider StatsProvider, calcVolumePeriod time.Duration) *fsResourceAnalyzer { - r := &fsResourceAnalyzer{ - statsProvider: statsProvider, - calcPeriod: calcVolumePeriod, - } - r.cachedVolumeStats.Store(make(Cache)) - return r -} - -// Start eager background caching of volume stats. -func (s *fsResourceAnalyzer) Start() { - s.startOnce.Do(func() { - if s.calcPeriod <= 0 { - glog.Info("Volume stats collection disabled.") - return - } - glog.Info("Starting FS ResourceAnalyzer") - go wait.Forever(func() { s.updateCachedPodVolumeStats() }, s.calcPeriod) - }) -} - -// updateCachedPodVolumeStats calculates and caches the PodVolumeStats for every Pod known to the kubelet. -func (s *fsResourceAnalyzer) updateCachedPodVolumeStats() { - oldCache := s.cachedVolumeStats.Load().(Cache) - newCache := make(Cache) - - // Copy existing entries to new map, creating/starting new entries for pods missing from the cache - for _, pod := range s.statsProvider.GetPods() { - if value, found := oldCache[pod.GetUID()]; !found { - newCache[pod.GetUID()] = newVolumeStatCalculator(s.statsProvider, s.calcPeriod, pod).StartOnce() - } else { - newCache[pod.GetUID()] = value - } - } - - // Stop entries for pods that have been deleted - for uid, entry := range oldCache { - if _, found := newCache[uid]; !found { - entry.StopOnce() - } - } - - // Update the cache reference - s.cachedVolumeStats.Store(newCache) -} - -// GetPodVolumeStats returns the PodVolumeStats for a given pod. Results are looked up from a cache that -// is eagerly populated in the background, and never calculated on the fly. -func (s *fsResourceAnalyzer) GetPodVolumeStats(uid types.UID) (PodVolumeStats, bool) { - cache := s.cachedVolumeStats.Load().(Cache) - if statCalc, found := cache[uid]; !found { - // TODO: Differentiate between stats being empty - // See issue #20679 - return PodVolumeStats{}, false - } else { - return statCalc.GetLatest() - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go deleted file mode 100644 index f069cd89..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/handler.go +++ /dev/null @@ -1,291 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 stats - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "path" - "time" - - restful "github.com/emicklei/go-restful" - "github.com/golang/glog" - cadvisorapi "github.com/google/cadvisor/info/v1" - - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/cm" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/volume" -) - -// Host methods required by stats handlers. -type StatsProvider interface { - // The following stats are provided by either CRI or cAdvisor. - // - // ListPodStats returns the stats of all the containers managed by pods. - ListPodStats() ([]statsapi.PodStats, error) - // ImageFsStats returns the stats of the image filesystem. - ImageFsStats() (*statsapi.FsStats, error) - - // The following stats are provided by cAdvisor. - // - // GetCgroupStats returns the stats and the networking usage of the cgroup - // with the specified cgroupName. - GetCgroupStats(cgroupName string, updateStats bool) (*statsapi.ContainerStats, *statsapi.NetworkStats, error) - // RootFsStats returns the stats of the node root filesystem. - RootFsStats() (*statsapi.FsStats, error) - - // The following stats are provided by cAdvisor for legacy usage. - // - // GetContainerInfo returns the information of the container with the - // containerName managed by the pod with the uid. - GetContainerInfo(podFullName string, uid types.UID, containerName string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) - // GetRawContainerInfo returns the information of the container with the - // containerName. If subcontainers is true, this function will return the - // information of all the sub-containers as well. - GetRawContainerInfo(containerName string, req *cadvisorapi.ContainerInfoRequest, subcontainers bool) (map[string]*cadvisorapi.ContainerInfo, error) - - // The following information is provided by Kubelet. - // - // GetPodByName returns the spec of the pod with the name in the specified - // namespace. - GetPodByName(namespace, name string) (*v1.Pod, bool) - // GetNode returns the spec of the local node. - GetNode() (*v1.Node, error) - // GetNodeConfig returns the configuration of the local node. - GetNodeConfig() cm.NodeConfig - // ListVolumesForPod returns the stats of the volume used by the pod with - // the podUID. - ListVolumesForPod(podUID types.UID) (map[string]volume.Volume, bool) - // GetPods returns the specs of all the pods running on this node. - GetPods() []*v1.Pod - - // RlimitStats returns the rlimit stats of system. - RlimitStats() (*statsapi.RlimitStats, error) - - // GetPodCgroupRoot returns the literal cgroupfs value for the cgroup containing all pods - GetPodCgroupRoot() string - - // GetPodByCgroupfs provides the pod that maps to the specified cgroup literal, as well - // as whether the pod was found. - GetPodByCgroupfs(cgroupfs string) (*v1.Pod, bool) -} - -type handler struct { - provider StatsProvider - summaryProvider SummaryProvider -} - -func CreateHandlers(rootPath string, provider StatsProvider, summaryProvider SummaryProvider) *restful.WebService { - h := &handler{provider, summaryProvider} - - ws := &restful.WebService{} - ws.Path(rootPath). - Produces(restful.MIME_JSON) - - endpoints := []struct { - path string - handler restful.RouteFunction - }{ - {"", h.handleStats}, - {"/summary", h.handleSummary}, - {"/container", h.handleSystemContainer}, - {"/{podName}/{containerName}", h.handlePodContainer}, - {"/{namespace}/{podName}/{uid}/{containerName}", h.handlePodContainer}, - } - - for _, e := range endpoints { - for _, method := range []string{"GET", "POST"} { - ws.Route(ws. - Method(method). - Path(e.path). - To(e.handler)) - } - } - - return ws -} - -type StatsRequest struct { - // The name of the container for which to request stats. - // Default: / - // +optional - ContainerName string `json:"containerName,omitempty"` - - // Max number of stats to return. - // If start and end time are specified this limit is ignored. - // Default: 60 - // +optional - NumStats int `json:"num_stats,omitempty"` - - // Start time for which to query information. - // If omitted, the beginning of time is assumed. - // +optional - Start time.Time `json:"start,omitempty"` - - // End time for which to query information. - // If omitted, current time is assumed. - // +optional - End time.Time `json:"end,omitempty"` - - // Whether to also include information from subcontainers. - // Default: false. - // +optional - Subcontainers bool `json:"subcontainers,omitempty"` -} - -func (r *StatsRequest) cadvisorRequest() *cadvisorapi.ContainerInfoRequest { - return &cadvisorapi.ContainerInfoRequest{ - NumStats: r.NumStats, - Start: r.Start, - End: r.End, - } -} - -func parseStatsRequest(request *restful.Request) (StatsRequest, error) { - // Default request. - query := StatsRequest{ - NumStats: 60, - } - - err := json.NewDecoder(request.Request.Body).Decode(&query) - if err != nil && err != io.EOF { - return query, err - } - return query, nil -} - -// Handles root container stats requests to /stats -func (h *handler) handleStats(request *restful.Request, response *restful.Response) { - query, err := parseStatsRequest(request) - if err != nil { - handleError(response, "/stats", err) - return - } - - // Root container stats. - statsMap, err := h.provider.GetRawContainerInfo("/", query.cadvisorRequest(), false) - if err != nil { - handleError(response, fmt.Sprintf("/stats %v", query), err) - return - } - writeResponse(response, statsMap["/"]) -} - -// Handles stats summary requests to /stats/summary -func (h *handler) handleSummary(request *restful.Request, response *restful.Response) { - // external calls to the summary API use cached stats - forceStatsUpdate := false - summary, err := h.summaryProvider.Get(forceStatsUpdate) - if err != nil { - handleError(response, "/stats/summary", err) - } else { - writeResponse(response, summary) - } -} - -// Handles non-kubernetes container stats requests to /stats/container/ -func (h *handler) handleSystemContainer(request *restful.Request, response *restful.Response) { - query, err := parseStatsRequest(request) - if err != nil { - handleError(response, "/stats/container", err) - return - } - - // Non-Kubernetes container stats. - containerName := path.Join("/", query.ContainerName) - stats, err := h.provider.GetRawContainerInfo( - containerName, query.cadvisorRequest(), query.Subcontainers) - if err != nil { - if _, ok := stats[containerName]; ok { - // If the failure is partial, log it and return a best-effort response. - glog.Errorf("Partial failure issuing GetRawContainerInfo(%v): %v", query, err) - } else { - handleError(response, fmt.Sprintf("/stats/container %v", query), err) - return - } - } - writeResponse(response, stats) -} - -// Handles kubernetes pod/container stats requests to: -// /stats// -// /stats//// -func (h *handler) handlePodContainer(request *restful.Request, response *restful.Response) { - query, err := parseStatsRequest(request) - if err != nil { - handleError(response, request.Request.URL.String(), err) - return - } - - // Default parameters. - params := map[string]string{ - "namespace": metav1.NamespaceDefault, - "uid": "", - } - for k, v := range request.PathParameters() { - params[k] = v - } - - if params["podName"] == "" || params["containerName"] == "" { - response.WriteErrorString(http.StatusBadRequest, - fmt.Sprintf("Invalid pod container request: %v", params)) - return - } - - pod, ok := h.provider.GetPodByName(params["namespace"], params["podName"]) - if !ok { - glog.V(4).Infof("Container not found: %v", params) - response.WriteError(http.StatusNotFound, kubecontainer.ErrContainerNotFound) - return - } - stats, err := h.provider.GetContainerInfo( - kubecontainer.GetPodFullName(pod), - types.UID(params["uid"]), - params["containerName"], - query.cadvisorRequest()) - - if err != nil { - handleError(response, fmt.Sprintf("%s %v", request.Request.URL.String(), query), err) - return - } - writeResponse(response, stats) -} - -func writeResponse(response *restful.Response, stats interface{}) { - if err := response.WriteAsJson(stats); err != nil { - glog.Errorf("Error writing response: %v", err) - } -} - -// handleError serializes an error object into an HTTP response. -// request is provided for logging. -func handleError(response *restful.Response, request string, err error) { - switch err { - case kubecontainer.ErrContainerNotFound: - response.WriteError(http.StatusNotFound, err) - default: - msg := fmt.Sprintf("Internal Error: %v", err) - glog.Errorf("HTTP InternalServerError serving %s: %s", request, msg) - response.WriteErrorString(http.StatusInternalServerError, msg) - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go deleted file mode 100644 index 5def6ba7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/resource_analyzer.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 stats - -import ( - "time" -) - -// ResourceAnalyzer provides statistics on node resource consumption -type ResourceAnalyzer interface { - Start() - - fsResourceAnalyzerInterface - SummaryProvider -} - -// resourceAnalyzer implements ResourceAnalyzer -type resourceAnalyzer struct { - *fsResourceAnalyzer - SummaryProvider -} - -var _ ResourceAnalyzer = &resourceAnalyzer{} - -// NewResourceAnalyzer returns a new ResourceAnalyzer -func NewResourceAnalyzer(statsProvider StatsProvider, calVolumeFrequency time.Duration) ResourceAnalyzer { - fsAnalyzer := newFsResourceAnalyzer(statsProvider, calVolumeFrequency) - summaryProvider := NewSummaryProvider(statsProvider) - return &resourceAnalyzer{fsAnalyzer, summaryProvider} -} - -// Start starts background functions necessary for the ResourceAnalyzer to function -func (ra *resourceAnalyzer) Start() { - ra.fsResourceAnalyzer.Start() -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go deleted file mode 100644 index 0fff691f..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/summary.go +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 stats - -import ( - "fmt" - - "github.com/golang/glog" - - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" -) - -type SummaryProvider interface { - // Get provides a new Summary with the stats from Kubelet, - // and will update some stats if updateStats is true - Get(updateStats bool) (*statsapi.Summary, error) -} - -// summaryProviderImpl implements the SummaryProvider interface. -type summaryProviderImpl struct { - provider StatsProvider -} - -var _ SummaryProvider = &summaryProviderImpl{} - -// NewSummaryProvider returns a SummaryProvider using the stats provided by the -// specified statsProvider. -func NewSummaryProvider(statsProvider StatsProvider) SummaryProvider { - return &summaryProviderImpl{statsProvider} -} - -func (sp *summaryProviderImpl) Get(updateStats bool) (*statsapi.Summary, error) { - // TODO(timstclair): Consider returning a best-effort response if any of - // the following errors occur. - node, err := sp.provider.GetNode() - if err != nil { - return nil, fmt.Errorf("failed to get node info: %v", err) - } - nodeConfig := sp.provider.GetNodeConfig() - rootStats, networkStats, err := sp.provider.GetCgroupStats("/", updateStats) - if err != nil { - return nil, fmt.Errorf("failed to get root cgroup stats: %v", err) - } - rootFsStats, err := sp.provider.RootFsStats() - if err != nil { - return nil, fmt.Errorf("failed to get rootFs stats: %v", err) - } - imageFsStats, err := sp.provider.ImageFsStats() - if err != nil { - return nil, fmt.Errorf("failed to get imageFs stats: %v", err) - } - podStats, err := sp.provider.ListPodStats() - if err != nil { - return nil, fmt.Errorf("failed to list pod stats: %v", err) - } - rlimit, err := sp.provider.RlimitStats() - if err != nil { - return nil, fmt.Errorf("failed to get rlimit stats: %v", err) - } - - nodeStats := statsapi.NodeStats{ - NodeName: node.Name, - CPU: rootStats.CPU, - Memory: rootStats.Memory, - Network: networkStats, - StartTime: rootStats.StartTime, - Fs: rootFsStats, - Runtime: &statsapi.RuntimeStats{ImageFs: imageFsStats}, - Rlimit: rlimit, - } - - systemContainers := map[string]struct { - name string - forceStatsUpdate bool - }{ - statsapi.SystemContainerKubelet: {nodeConfig.KubeletCgroupsName, false}, - statsapi.SystemContainerRuntime: {nodeConfig.RuntimeCgroupsName, false}, - statsapi.SystemContainerMisc: {nodeConfig.SystemCgroupsName, false}, - statsapi.SystemContainerPods: {sp.provider.GetPodCgroupRoot(), updateStats}, - } - for sys, cont := range systemContainers { - // skip if cgroup name is undefined (not all system containers are required) - if cont.name == "" { - continue - } - s, _, err := sp.provider.GetCgroupStats(cont.name, cont.forceStatsUpdate) - if err != nil { - glog.Errorf("Failed to get system container stats for %q: %v", cont.name, err) - continue - } - // System containers don't have a filesystem associated with them. - s.Logs, s.Rootfs = nil, nil - s.Name = sys - nodeStats.SystemContainers = append(nodeStats.SystemContainers, *s) - } - - summary := statsapi.Summary{ - Node: nodeStats, - Pods: podStats, - } - return &summary, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go b/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go deleted file mode 100644 index 2c535f56..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/stats/volume_stat_calculator.go +++ /dev/null @@ -1,162 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 stats - -import ( - "sync" - "sync/atomic" - "time" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/wait" - stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/volume" - - "github.com/golang/glog" -) - -// volumeStatCalculator calculates volume metrics for a given pod periodically in the background and caches the result -type volumeStatCalculator struct { - statsProvider StatsProvider - jitterPeriod time.Duration - pod *v1.Pod - stopChannel chan struct{} - startO sync.Once - stopO sync.Once - latest atomic.Value -} - -// PodVolumeStats encapsulates the VolumeStats for a pod. -// It consists of two lists, for local ephemeral volumes, and for persistent volumes respectively. -type PodVolumeStats struct { - EphemeralVolumes []stats.VolumeStats - PersistentVolumes []stats.VolumeStats -} - -// newVolumeStatCalculator creates a new VolumeStatCalculator -func newVolumeStatCalculator(statsProvider StatsProvider, jitterPeriod time.Duration, pod *v1.Pod) *volumeStatCalculator { - return &volumeStatCalculator{ - statsProvider: statsProvider, - jitterPeriod: jitterPeriod, - pod: pod, - stopChannel: make(chan struct{}), - } -} - -// StartOnce starts pod volume calc that will occur periodically in the background until s.StopOnce is called -func (s *volumeStatCalculator) StartOnce() *volumeStatCalculator { - s.startO.Do(func() { - go wait.JitterUntil(func() { - s.calcAndStoreStats() - }, s.jitterPeriod, 1.0, true, s.stopChannel) - }) - return s -} - -// StopOnce stops background pod volume calculation. Will not stop a currently executing calculations until -// they complete their current iteration. -func (s *volumeStatCalculator) StopOnce() *volumeStatCalculator { - s.stopO.Do(func() { - close(s.stopChannel) - }) - return s -} - -// getLatest returns the most recent PodVolumeStats from the cache -func (s *volumeStatCalculator) GetLatest() (PodVolumeStats, bool) { - if result := s.latest.Load(); result == nil { - return PodVolumeStats{}, false - } else { - return result.(PodVolumeStats), true - } -} - -// calcAndStoreStats calculates PodVolumeStats for a given pod and writes the result to the s.latest cache. -// If the pod references PVCs, the prometheus metrics for those are updated with the result. -func (s *volumeStatCalculator) calcAndStoreStats() { - // Find all Volumes for the Pod - volumes, found := s.statsProvider.ListVolumesForPod(s.pod.UID) - if !found { - return - } - - // Get volume specs for the pod - key'd by volume name - volumesSpec := make(map[string]v1.Volume) - for _, v := range s.pod.Spec.Volumes { - volumesSpec[v.Name] = v - } - - // Call GetMetrics on each Volume and copy the result to a new VolumeStats.FsStats - ephemeralStats := []stats.VolumeStats{} - persistentStats := []stats.VolumeStats{} - for name, v := range volumes { - metric, err := v.GetMetrics() - if err != nil { - // Expected for Volumes that don't support Metrics - if !volume.IsNotSupported(err) { - glog.V(4).Infof("Failed to calculate volume metrics for pod %s volume %s: %+v", format.Pod(s.pod), name, err) - } - continue - } - // Lookup the volume spec and add a 'PVCReference' for volumes that reference a PVC - volSpec := volumesSpec[name] - var pvcRef *stats.PVCReference - if pvcSource := volSpec.PersistentVolumeClaim; pvcSource != nil { - pvcRef = &stats.PVCReference{ - Name: pvcSource.ClaimName, - Namespace: s.pod.GetNamespace(), - } - } - volumeStats := s.parsePodVolumeStats(name, pvcRef, metric, volSpec) - if isVolumeEphemeral(volSpec) { - ephemeralStats = append(ephemeralStats, volumeStats) - } else { - persistentStats = append(persistentStats, volumeStats) - } - - } - - // Store the new stats - s.latest.Store(PodVolumeStats{EphemeralVolumes: ephemeralStats, - PersistentVolumes: persistentStats}) -} - -// parsePodVolumeStats converts (internal) volume.Metrics to (external) stats.VolumeStats structures -func (s *volumeStatCalculator) parsePodVolumeStats(podName string, pvcRef *stats.PVCReference, metric *volume.Metrics, volSpec v1.Volume) stats.VolumeStats { - available := uint64(metric.Available.Value()) - capacity := uint64(metric.Capacity.Value()) - used := uint64(metric.Used.Value()) - inodes := uint64(metric.Inodes.Value()) - inodesFree := uint64(metric.InodesFree.Value()) - inodesUsed := uint64(metric.InodesUsed.Value()) - - return stats.VolumeStats{ - Name: podName, - PVCRef: pvcRef, - FsStats: stats.FsStats{Time: metric.Time, AvailableBytes: &available, CapacityBytes: &capacity, - UsedBytes: &used, Inodes: &inodes, InodesFree: &inodesFree, InodesUsed: &inodesUsed}, - } -} - -func isVolumeEphemeral(volume v1.Volume) bool { - if (volume.EmptyDir != nil && volume.EmptyDir.Medium == v1.StorageMediumDefault) || - volume.ConfigMap != nil || volume.GitRepo != nil { - return true - } - return false -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/server/streaming/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/server/streaming/BUILD index 36150aef..bee8b567 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/server/streaming/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/server/streaming/BUILD @@ -18,14 +18,14 @@ go_library( "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", "//pkg/kubelet/server/portforward:go_default_library", "//pkg/kubelet/server/remotecommand:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", + "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/google.golang.org/grpc:go_default_library", "//vendor/google.golang.org/grpc/codes:go_default_library", "//vendor/google.golang.org/grpc/status:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", - "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", ], ) @@ -40,12 +40,12 @@ go_test( "//pkg/apis/core:go_default_library", "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", "//pkg/kubelet/server/portforward:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/tools/remotecommand:go_default_library", + "//staging/src/k8s.io/client-go/transport/spdy:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/remotecommand:go_default_library", - "//vendor/k8s.io/client-go/transport/spdy:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD deleted file mode 100644 index 8cee7f26..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/BUILD +++ /dev/null @@ -1,119 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "cadvisor_stats_provider.go", - "cri_stats_provider.go", - "helper.go", - "log_metrics_provider.go", - "stats_provider.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "stats_provider_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "stats_provider_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "stats_provider_unsupported.go", - ], - "//conditions:default": [], - }), - importpath = "k8s.io/kubernetes/pkg/kubelet/stats", - visibility = ["//visibility:public"], - deps = [ - "//pkg/kubelet/apis/cri:go_default_library", - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/cadvisor:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/kuberuntime:go_default_library", - "//pkg/kubelet/leaky:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/volume:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "cadvisor_stats_provider_test.go", - "cri_stats_provider_test.go", - "helper_test.go", - "log_metrics_provider_test.go", - "stats_provider_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", - "//pkg/kubelet/apis/cri/testing:go_default_library", - "//pkg/kubelet/apis/stats/v1alpha1:go_default_library", - "//pkg/kubelet/cadvisor/testing:go_default_library", - "//pkg/kubelet/cm:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/kuberuntime:go_default_library", - "//pkg/kubelet/leaky:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/server/stats:go_default_library", - "//pkg/kubelet/types:go_default_library", - "//pkg/volume:go_default_library", - "//vendor/github.com/google/cadvisor/fs:go_default_library", - "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/google/cadvisor/info/v2:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go deleted file mode 100644 index 8529872c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cadvisor_stats_provider.go +++ /dev/null @@ -1,376 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 stats - -import ( - "fmt" - "path" - "sort" - "strings" - - "github.com/golang/glog" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/cadvisor" - "k8s.io/kubernetes/pkg/kubelet/cm" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/leaky" - "k8s.io/kubernetes/pkg/kubelet/server/stats" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" -) - -// cadvisorStatsProvider implements the containerStatsProvider interface by -// getting the container stats from cAdvisor. This is needed by docker and rkt -// integrations since they do not provide stats from CRI. -type cadvisorStatsProvider struct { - // cadvisor is used to get the stats of the cgroup for the containers that - // are managed by pods. - cadvisor cadvisor.Interface - // resourceAnalyzer is used to get the volume stats of the pods. - resourceAnalyzer stats.ResourceAnalyzer - // imageService is used to get the stats of the image filesystem. - imageService kubecontainer.ImageService -} - -// newCadvisorStatsProvider returns a containerStatsProvider that provides -// container stats from cAdvisor. -func newCadvisorStatsProvider( - cadvisor cadvisor.Interface, - resourceAnalyzer stats.ResourceAnalyzer, - imageService kubecontainer.ImageService, -) containerStatsProvider { - return &cadvisorStatsProvider{ - cadvisor: cadvisor, - resourceAnalyzer: resourceAnalyzer, - imageService: imageService, - } -} - -// ListPodStats returns the stats of all the pod-managed containers. -func (p *cadvisorStatsProvider) ListPodStats() ([]statsapi.PodStats, error) { - // Gets node root filesystem information and image filesystem stats, which - // will be used to populate the available and capacity bytes/inodes in - // container stats. - rootFsInfo, err := p.cadvisor.RootFsInfo() - if err != nil { - return nil, fmt.Errorf("failed to get rootFs info: %v", err) - } - imageFsInfo, err := p.cadvisor.ImagesFsInfo() - if err != nil { - return nil, fmt.Errorf("failed to get imageFs info: %v", err) - } - infos, err := getCadvisorContainerInfo(p.cadvisor) - if err != nil { - return nil, fmt.Errorf("failed to get container info from cadvisor: %v", err) - } - // removeTerminatedContainerInfo will also remove pod level cgroups, so save the infos into allInfos first - allInfos := infos - infos = removeTerminatedContainerInfo(infos) - // Map each container to a pod and update the PodStats with container data. - podToStats := map[statsapi.PodReference]*statsapi.PodStats{} - for key, cinfo := range infos { - // On systemd using devicemapper each mount into the container has an - // associated cgroup. We ignore them to ensure we do not get duplicate - // entries in our summary. For details on .mount units: - // http://man7.org/linux/man-pages/man5/systemd.mount.5.html - if strings.HasSuffix(key, ".mount") { - continue - } - // Build the Pod key if this container is managed by a Pod - if !isPodManagedContainer(&cinfo) { - continue - } - ref := buildPodRef(cinfo.Spec.Labels) - - // Lookup the PodStats for the pod using the PodRef. If none exists, - // initialize a new entry. - podStats, found := podToStats[ref] - if !found { - podStats = &statsapi.PodStats{PodRef: ref} - podToStats[ref] = podStats - } - - // Update the PodStats entry with the stats from the container by - // adding it to podStats.Containers. - containerName := kubetypes.GetContainerName(cinfo.Spec.Labels) - if containerName == leaky.PodInfraContainerName { - // Special case for infrastructure container which is hidden from - // the user and has network stats. - podStats.Network = cadvisorInfoToNetworkStats("pod:"+ref.Namespace+"_"+ref.Name, &cinfo) - podStats.StartTime = metav1.NewTime(cinfo.Spec.CreationTime) - } else { - podStats.Containers = append(podStats.Containers, *cadvisorInfoToContainerStats(containerName, &cinfo, &rootFsInfo, &imageFsInfo)) - } - } - - // Add each PodStats to the result. - result := make([]statsapi.PodStats, 0, len(podToStats)) - for _, podStats := range podToStats { - // Lookup the volume stats for each pod. - podUID := types.UID(podStats.PodRef.UID) - var ephemeralStats []statsapi.VolumeStats - if vstats, found := p.resourceAnalyzer.GetPodVolumeStats(podUID); found { - ephemeralStats = make([]statsapi.VolumeStats, len(vstats.EphemeralVolumes)) - copy(ephemeralStats, vstats.EphemeralVolumes) - podStats.VolumeStats = append(vstats.EphemeralVolumes, vstats.PersistentVolumes...) - } - podStats.EphemeralStorage = calcEphemeralStorage(podStats.Containers, ephemeralStats, &rootFsInfo) - // Lookup the pod-level cgroup's CPU and memory stats - podInfo := getCadvisorPodInfoFromPodUID(podUID, allInfos) - if podInfo != nil { - cpu, memory := cadvisorInfoToCPUandMemoryStats(podInfo) - podStats.CPU = cpu - podStats.Memory = memory - } - result = append(result, *podStats) - } - - return result, nil -} - -func calcEphemeralStorage(containers []statsapi.ContainerStats, volumes []statsapi.VolumeStats, rootFsInfo *cadvisorapiv2.FsInfo) *statsapi.FsStats { - result := &statsapi.FsStats{ - Time: metav1.NewTime(rootFsInfo.Timestamp), - AvailableBytes: &rootFsInfo.Available, - CapacityBytes: &rootFsInfo.Capacity, - InodesFree: rootFsInfo.InodesFree, - Inodes: rootFsInfo.Inodes, - } - for _, container := range containers { - addContainerUsage(result, &container) - } - for _, volume := range volumes { - result.UsedBytes = addUsage(result.UsedBytes, volume.FsStats.UsedBytes) - result.InodesUsed = addUsage(result.InodesUsed, volume.InodesUsed) - result.Time = maxUpdateTime(&result.Time, &volume.FsStats.Time) - } - return result -} - -func addContainerUsage(stat *statsapi.FsStats, container *statsapi.ContainerStats) { - if rootFs := container.Rootfs; rootFs != nil { - stat.Time = maxUpdateTime(&stat.Time, &rootFs.Time) - stat.InodesUsed = addUsage(stat.InodesUsed, rootFs.InodesUsed) - stat.UsedBytes = addUsage(stat.UsedBytes, rootFs.UsedBytes) - if logs := container.Logs; logs != nil { - stat.UsedBytes = addUsage(stat.UsedBytes, logs.UsedBytes) - stat.Time = maxUpdateTime(&stat.Time, &logs.Time) - } - } -} - -func maxUpdateTime(first, second *metav1.Time) metav1.Time { - if first.Before(second) { - return *second - } - return *first -} -func addUsage(first, second *uint64) *uint64 { - if first == nil { - return second - } else if second == nil { - return first - } - total := *first + *second - return &total -} - -// ImageFsStats returns the stats of the filesystem for storing images. -func (p *cadvisorStatsProvider) ImageFsStats() (*statsapi.FsStats, error) { - imageFsInfo, err := p.cadvisor.ImagesFsInfo() - if err != nil { - return nil, fmt.Errorf("failed to get imageFs info: %v", err) - } - imageStats, err := p.imageService.ImageStats() - if err != nil || imageStats == nil { - return nil, fmt.Errorf("failed to get image stats: %v", err) - } - - var imageFsInodesUsed *uint64 - if imageFsInfo.Inodes != nil && imageFsInfo.InodesFree != nil { - imageFsIU := *imageFsInfo.Inodes - *imageFsInfo.InodesFree - imageFsInodesUsed = &imageFsIU - } - - return &statsapi.FsStats{ - Time: metav1.NewTime(imageFsInfo.Timestamp), - AvailableBytes: &imageFsInfo.Available, - CapacityBytes: &imageFsInfo.Capacity, - UsedBytes: &imageStats.TotalStorageBytes, - InodesFree: imageFsInfo.InodesFree, - Inodes: imageFsInfo.Inodes, - InodesUsed: imageFsInodesUsed, - }, nil -} - -// ImageFsDevice returns name of the device where the image filesystem locates, -// e.g. /dev/sda1. -func (p *cadvisorStatsProvider) ImageFsDevice() (string, error) { - imageFsInfo, err := p.cadvisor.ImagesFsInfo() - if err != nil { - return "", err - } - return imageFsInfo.Device, nil -} - -// buildPodRef returns a PodReference that identifies the Pod managing cinfo -func buildPodRef(containerLabels map[string]string) statsapi.PodReference { - podName := kubetypes.GetPodName(containerLabels) - podNamespace := kubetypes.GetPodNamespace(containerLabels) - podUID := kubetypes.GetPodUID(containerLabels) - return statsapi.PodReference{Name: podName, Namespace: podNamespace, UID: podUID} -} - -// isPodManagedContainer returns true if the cinfo container is managed by a Pod -func isPodManagedContainer(cinfo *cadvisorapiv2.ContainerInfo) bool { - podName := kubetypes.GetPodName(cinfo.Spec.Labels) - podNamespace := kubetypes.GetPodNamespace(cinfo.Spec.Labels) - managed := podName != "" && podNamespace != "" - if !managed && podName != podNamespace { - glog.Warningf( - "Expect container to have either both podName (%s) and podNamespace (%s) labels, or neither.", - podName, podNamespace) - } - return managed -} - -// getCadvisorPodInfoFromPodUID returns a pod cgroup information by matching the podUID with its CgroupName identifier base name -func getCadvisorPodInfoFromPodUID(podUID types.UID, infos map[string]cadvisorapiv2.ContainerInfo) *cadvisorapiv2.ContainerInfo { - for key, info := range infos { - if cm.IsSystemdStyleName(key) { - // Convert to internal cgroup name and take the last component only. - internalCgroupName := cm.ParseSystemdToCgroupName(key) - key = internalCgroupName[len(internalCgroupName)-1] - } else { - // Take last component only. - key = path.Base(key) - } - if cm.GetPodCgroupNameSuffix(podUID) == key { - return &info - } - } - return nil -} - -// removeTerminatedContainerInfo returns the specified containerInfo but with -// the stats of the terminated containers removed. -// -// A ContainerInfo is considered to be of a terminated container if it has an -// older CreationTime and zero CPU instantaneous and memory RSS usage. -func removeTerminatedContainerInfo(containerInfo map[string]cadvisorapiv2.ContainerInfo) map[string]cadvisorapiv2.ContainerInfo { - cinfoMap := make(map[containerID][]containerInfoWithCgroup) - for key, cinfo := range containerInfo { - if !isPodManagedContainer(&cinfo) { - continue - } - cinfoID := containerID{ - podRef: buildPodRef(cinfo.Spec.Labels), - containerName: kubetypes.GetContainerName(cinfo.Spec.Labels), - } - cinfoMap[cinfoID] = append(cinfoMap[cinfoID], containerInfoWithCgroup{ - cinfo: cinfo, - cgroup: key, - }) - } - result := make(map[string]cadvisorapiv2.ContainerInfo) - for _, refs := range cinfoMap { - if len(refs) == 1 { - result[refs[0].cgroup] = refs[0].cinfo - continue - } - sort.Sort(ByCreationTime(refs)) - i := 0 - for ; i < len(refs); i++ { - if hasMemoryAndCPUInstUsage(&refs[i].cinfo) { - // Stops removing when we first see an info with non-zero - // CPU/Memory usage. - break - } - } - for ; i < len(refs); i++ { - result[refs[i].cgroup] = refs[i].cinfo - } - } - return result -} - -// ByCreationTime implements sort.Interface for []containerInfoWithCgroup based -// on the cinfo.Spec.CreationTime field. -type ByCreationTime []containerInfoWithCgroup - -func (a ByCreationTime) Len() int { return len(a) } -func (a ByCreationTime) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a ByCreationTime) Less(i, j int) bool { - if a[i].cinfo.Spec.CreationTime.Equal(a[j].cinfo.Spec.CreationTime) { - // There shouldn't be two containers with the same name and/or the same - // creation time. However, to make the logic here robust, we break the - // tie by moving the one without CPU instantaneous or memory RSS usage - // to the beginning. - return hasMemoryAndCPUInstUsage(&a[j].cinfo) - } - return a[i].cinfo.Spec.CreationTime.Before(a[j].cinfo.Spec.CreationTime) -} - -// containerID is the identity of a container in a pod. -type containerID struct { - podRef statsapi.PodReference - containerName string -} - -// containerInfoWithCgroup contains the ContainerInfo and its cgroup name. -type containerInfoWithCgroup struct { - cinfo cadvisorapiv2.ContainerInfo - cgroup string -} - -// hasMemoryAndCPUInstUsage returns true if the specified container info has -// both non-zero CPU instantaneous usage and non-zero memory RSS usage, and -// false otherwise. -func hasMemoryAndCPUInstUsage(info *cadvisorapiv2.ContainerInfo) bool { - if !info.Spec.HasCpu || !info.Spec.HasMemory { - return false - } - cstat, found := latestContainerStats(info) - if !found { - return false - } - if cstat.CpuInst == nil { - return false - } - return cstat.CpuInst.Usage.Total != 0 && cstat.Memory.RSS != 0 -} - -func getCadvisorContainerInfo(ca cadvisor.Interface) (map[string]cadvisorapiv2.ContainerInfo, error) { - infos, err := ca.ContainerInfoV2("/", cadvisorapiv2.RequestOptions{ - IdType: cadvisorapiv2.TypeName, - Count: 2, // 2 samples are needed to compute "instantaneous" CPU - Recursive: true, - }) - if err != nil { - if _, ok := infos["/"]; ok { - // If the failure is partial, log it and return a best-effort - // response. - glog.Errorf("Partial failure issuing cadvisor.ContainerInfoV2: %v", err) - } else { - return nil, fmt.Errorf("failed to get root cgroup stats: %v", err) - } - } - return infos, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go deleted file mode 100644 index 1af0a0cb..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider.go +++ /dev/null @@ -1,487 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 stats - -import ( - "errors" - "fmt" - "path" - "sort" - "strings" - "time" - - "github.com/golang/glog" - cadvisorfs "github.com/google/cadvisor/fs" - - cadvisorapiv2 "github.com/google/cadvisor/info/v2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri" - runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/cadvisor" - "k8s.io/kubernetes/pkg/kubelet/kuberuntime" - "k8s.io/kubernetes/pkg/kubelet/server/stats" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" -) - -// criStatsProvider implements the containerStatsProvider interface by getting -// the container stats from CRI. -type criStatsProvider struct { - // cadvisor is used to get the node root filesystem's stats (such as the - // capacity/available bytes/inodes) that will be populated in per container - // filesystem stats. - cadvisor cadvisor.Interface - // resourceAnalyzer is used to get the volume stats of the pods. - resourceAnalyzer stats.ResourceAnalyzer - // runtimeService is used to get the status and stats of the pods and its - // managed containers. - runtimeService internalapi.RuntimeService - // imageService is used to get the stats of the image filesystem. - imageService internalapi.ImageManagerService - // logMetrics provides the metrics for container logs - logMetricsService LogMetricsService -} - -// newCRIStatsProvider returns a containerStatsProvider implementation that -// provides container stats using CRI. -func newCRIStatsProvider( - cadvisor cadvisor.Interface, - resourceAnalyzer stats.ResourceAnalyzer, - runtimeService internalapi.RuntimeService, - imageService internalapi.ImageManagerService, - logMetricsService LogMetricsService, -) containerStatsProvider { - return &criStatsProvider{ - cadvisor: cadvisor, - resourceAnalyzer: resourceAnalyzer, - runtimeService: runtimeService, - imageService: imageService, - logMetricsService: logMetricsService, - } -} - -// ListPodStats returns the stats of all the pod-managed containers. -func (p *criStatsProvider) ListPodStats() ([]statsapi.PodStats, error) { - // Gets node root filesystem information, which will be used to populate - // the available and capacity bytes/inodes in container stats. - rootFsInfo, err := p.cadvisor.RootFsInfo() - if err != nil { - return nil, fmt.Errorf("failed to get rootFs info: %v", err) - } - - containers, err := p.runtimeService.ListContainers(&runtimeapi.ContainerFilter{}) - if err != nil { - return nil, fmt.Errorf("failed to list all containers: %v", err) - } - - // Creates pod sandbox map. - podSandboxMap := make(map[string]*runtimeapi.PodSandbox) - podSandboxes, err := p.runtimeService.ListPodSandbox(&runtimeapi.PodSandboxFilter{}) - if err != nil { - return nil, fmt.Errorf("failed to list all pod sandboxes: %v", err) - } - for _, s := range podSandboxes { - podSandboxMap[s.Id] = s - } - // fsIDtoInfo is a map from filesystem id to its stats. This will be used - // as a cache to avoid querying cAdvisor for the filesystem stats with the - // same filesystem id many times. - fsIDtoInfo := make(map[runtimeapi.FilesystemIdentifier]*cadvisorapiv2.FsInfo) - - // sandboxIDToPodStats is a temporary map from sandbox ID to its pod stats. - sandboxIDToPodStats := make(map[string]*statsapi.PodStats) - - resp, err := p.runtimeService.ListContainerStats(&runtimeapi.ContainerStatsFilter{}) - if err != nil { - return nil, fmt.Errorf("failed to list all container stats: %v", err) - } - - containers = removeTerminatedContainer(containers) - // Creates container map. - containerMap := make(map[string]*runtimeapi.Container) - for _, c := range containers { - containerMap[c.Id] = c - } - - allInfos, err := getCadvisorContainerInfo(p.cadvisor) - if err != nil { - return nil, fmt.Errorf("failed to fetch cadvisor stats: %v", err) - } - caInfos := getCRICadvisorStats(allInfos) - - for _, stats := range resp { - containerID := stats.Attributes.Id - container, found := containerMap[containerID] - if !found { - continue - } - - podSandboxID := container.PodSandboxId - podSandbox, found := podSandboxMap[podSandboxID] - if !found { - continue - } - - // Creates the stats of the pod (if not created yet) which the - // container belongs to. - ps, found := sandboxIDToPodStats[podSandboxID] - if !found { - ps = buildPodStats(podSandbox) - sandboxIDToPodStats[podSandboxID] = ps - } - - // Fill available stats for full set of required pod stats - cs := p.makeContainerStats(stats, container, &rootFsInfo, fsIDtoInfo, podSandbox.GetMetadata().GetUid()) - p.addPodNetworkStats(ps, podSandboxID, caInfos, cs) - p.addPodCPUMemoryStats(ps, types.UID(podSandbox.Metadata.Uid), allInfos, cs) - - // If cadvisor stats is available for the container, use it to populate - // container stats - caStats, caFound := caInfos[containerID] - if !caFound { - glog.V(4).Infof("Unable to find cadvisor stats for %q", containerID) - } else { - p.addCadvisorContainerStats(cs, &caStats) - } - ps.Containers = append(ps.Containers, *cs) - } - - result := make([]statsapi.PodStats, 0, len(sandboxIDToPodStats)) - for _, s := range sandboxIDToPodStats { - p.makePodStorageStats(s, &rootFsInfo) - result = append(result, *s) - } - return result, nil -} - -// ImageFsStats returns the stats of the image filesystem. -func (p *criStatsProvider) ImageFsStats() (*statsapi.FsStats, error) { - resp, err := p.imageService.ImageFsInfo() - if err != nil { - return nil, err - } - - // CRI may return the stats of multiple image filesystems but we only - // return the first one. - // - // TODO(yguo0905): Support returning stats of multiple image filesystems. - for _, fs := range resp { - s := &statsapi.FsStats{ - Time: metav1.NewTime(time.Unix(0, fs.Timestamp)), - UsedBytes: &fs.UsedBytes.Value, - InodesUsed: &fs.InodesUsed.Value, - } - imageFsInfo := p.getFsInfo(fs.GetFsId()) - if imageFsInfo != nil { - // The image filesystem id is unknown to the local node or there's - // an error on retrieving the stats. In these cases, we omit those - // stats and return the best-effort partial result. See - // https://github.com/kubernetes/heapster/issues/1793. - s.AvailableBytes = &imageFsInfo.Available - s.CapacityBytes = &imageFsInfo.Capacity - s.InodesFree = imageFsInfo.InodesFree - s.Inodes = imageFsInfo.Inodes - } - return s, nil - } - - return nil, fmt.Errorf("imageFs information is unavailable") -} - -// ImageFsDevice returns name of the device where the image filesystem locates, -// e.g. /dev/sda1. -func (p *criStatsProvider) ImageFsDevice() (string, error) { - resp, err := p.imageService.ImageFsInfo() - if err != nil { - return "", err - } - for _, fs := range resp { - fsInfo := p.getFsInfo(fs.GetFsId()) - if fsInfo != nil { - return fsInfo.Device, nil - } - } - return "", errors.New("imagefs device is not found") -} - -// getFsInfo returns the information of the filesystem with the specified -// fsID. If any error occurs, this function logs the error and returns -// nil. -func (p *criStatsProvider) getFsInfo(fsID *runtimeapi.FilesystemIdentifier) *cadvisorapiv2.FsInfo { - if fsID == nil { - glog.V(2).Infof("Failed to get filesystem info: fsID is nil.") - return nil - } - mountpoint := fsID.GetMountpoint() - fsInfo, err := p.cadvisor.GetDirFsInfo(mountpoint) - if err != nil { - msg := fmt.Sprintf("Failed to get the info of the filesystem with mountpoint %q: %v.", mountpoint, err) - if err == cadvisorfs.ErrNoSuchDevice { - glog.V(2).Info(msg) - } else { - glog.Error(msg) - } - return nil - } - return &fsInfo -} - -// buildPodStats returns a PodStats that identifies the Pod managing cinfo -func buildPodStats(podSandbox *runtimeapi.PodSandbox) *statsapi.PodStats { - return &statsapi.PodStats{ - PodRef: statsapi.PodReference{ - Name: podSandbox.Metadata.Name, - UID: podSandbox.Metadata.Uid, - Namespace: podSandbox.Metadata.Namespace, - }, - // The StartTime in the summary API is the pod creation time. - StartTime: metav1.NewTime(time.Unix(0, podSandbox.CreatedAt)), - } -} - -func (p *criStatsProvider) makePodStorageStats(s *statsapi.PodStats, rootFsInfo *cadvisorapiv2.FsInfo) *statsapi.PodStats { - podUID := types.UID(s.PodRef.UID) - if vstats, found := p.resourceAnalyzer.GetPodVolumeStats(podUID); found { - ephemeralStats := make([]statsapi.VolumeStats, len(vstats.EphemeralVolumes)) - copy(ephemeralStats, vstats.EphemeralVolumes) - s.VolumeStats = append(vstats.EphemeralVolumes, vstats.PersistentVolumes...) - s.EphemeralStorage = calcEphemeralStorage(s.Containers, ephemeralStats, rootFsInfo) - } - return s -} - -func (p *criStatsProvider) addPodNetworkStats( - ps *statsapi.PodStats, - podSandboxID string, - caInfos map[string]cadvisorapiv2.ContainerInfo, - cs *statsapi.ContainerStats, -) { - caPodSandbox, found := caInfos[podSandboxID] - // try get network stats from cadvisor first. - if found { - ps.Network = cadvisorInfoToNetworkStats(ps.PodRef.Name, &caPodSandbox) - return - } - - // TODO: sum Pod network stats from container stats. - glog.V(4).Infof("Unable to find cadvisor stats for sandbox %q", podSandboxID) -} - -func (p *criStatsProvider) addPodCPUMemoryStats( - ps *statsapi.PodStats, - podUID types.UID, - allInfos map[string]cadvisorapiv2.ContainerInfo, - cs *statsapi.ContainerStats, -) { - // try get cpu and memory stats from cadvisor first. - podCgroupInfo := getCadvisorPodInfoFromPodUID(podUID, allInfos) - if podCgroupInfo != nil { - cpu, memory := cadvisorInfoToCPUandMemoryStats(podCgroupInfo) - ps.CPU = cpu - ps.Memory = memory - return - } - - // Sum Pod cpu and memory stats from containers stats. - if cs.CPU != nil { - if ps.CPU == nil { - ps.CPU = &statsapi.CPUStats{} - } - - ps.CPU.Time = cs.StartTime - usageCoreNanoSeconds := getUint64Value(cs.CPU.UsageCoreNanoSeconds) + getUint64Value(ps.CPU.UsageCoreNanoSeconds) - usageNanoCores := getUint64Value(cs.CPU.UsageNanoCores) + getUint64Value(ps.CPU.UsageNanoCores) - ps.CPU.UsageCoreNanoSeconds = &usageCoreNanoSeconds - ps.CPU.UsageNanoCores = &usageNanoCores - } - - if cs.Memory != nil { - if ps.Memory == nil { - ps.Memory = &statsapi.MemoryStats{} - } - - ps.Memory.Time = cs.Memory.Time - availableBytes := getUint64Value(cs.Memory.AvailableBytes) + getUint64Value(ps.Memory.AvailableBytes) - usageBytes := getUint64Value(cs.Memory.UsageBytes) + getUint64Value(ps.Memory.UsageBytes) - workingSetBytes := getUint64Value(cs.Memory.WorkingSetBytes) + getUint64Value(ps.Memory.WorkingSetBytes) - rSSBytes := getUint64Value(cs.Memory.RSSBytes) + getUint64Value(ps.Memory.RSSBytes) - pageFaults := getUint64Value(cs.Memory.PageFaults) + getUint64Value(ps.Memory.PageFaults) - majorPageFaults := getUint64Value(cs.Memory.MajorPageFaults) + getUint64Value(ps.Memory.MajorPageFaults) - ps.Memory.AvailableBytes = &availableBytes - ps.Memory.UsageBytes = &usageBytes - ps.Memory.WorkingSetBytes = &workingSetBytes - ps.Memory.RSSBytes = &rSSBytes - ps.Memory.PageFaults = &pageFaults - ps.Memory.MajorPageFaults = &majorPageFaults - } -} - -func (p *criStatsProvider) makeContainerStats( - stats *runtimeapi.ContainerStats, - container *runtimeapi.Container, - rootFsInfo *cadvisorapiv2.FsInfo, - fsIDtoInfo map[runtimeapi.FilesystemIdentifier]*cadvisorapiv2.FsInfo, - uid string, -) *statsapi.ContainerStats { - result := &statsapi.ContainerStats{ - Name: stats.Attributes.Metadata.Name, - // The StartTime in the summary API is the container creation time. - StartTime: metav1.NewTime(time.Unix(0, container.CreatedAt)), - CPU: &statsapi.CPUStats{}, - Memory: &statsapi.MemoryStats{}, - Rootfs: &statsapi.FsStats{}, - // UserDefinedMetrics is not supported by CRI. - } - if stats.Cpu != nil { - result.CPU.Time = metav1.NewTime(time.Unix(0, stats.Cpu.Timestamp)) - if stats.Cpu.UsageCoreNanoSeconds != nil { - result.CPU.UsageCoreNanoSeconds = &stats.Cpu.UsageCoreNanoSeconds.Value - } - } - if stats.Memory != nil { - result.Memory.Time = metav1.NewTime(time.Unix(0, stats.Memory.Timestamp)) - if stats.Memory.WorkingSetBytes != nil { - result.Memory.WorkingSetBytes = &stats.Memory.WorkingSetBytes.Value - } - } - if stats.WritableLayer != nil { - result.Rootfs.Time = metav1.NewTime(time.Unix(0, stats.WritableLayer.Timestamp)) - if stats.WritableLayer.UsedBytes != nil { - result.Rootfs.UsedBytes = &stats.WritableLayer.UsedBytes.Value - } - if stats.WritableLayer.InodesUsed != nil { - result.Rootfs.InodesUsed = &stats.WritableLayer.InodesUsed.Value - } - } - fsID := stats.GetWritableLayer().GetFsId() - if fsID != nil { - imageFsInfo, found := fsIDtoInfo[*fsID] - if !found { - imageFsInfo = p.getFsInfo(fsID) - fsIDtoInfo[*fsID] = imageFsInfo - } - if imageFsInfo != nil { - // The image filesystem id is unknown to the local node or there's - // an error on retrieving the stats. In these cases, we omit those stats - // and return the best-effort partial result. See - // https://github.com/kubernetes/heapster/issues/1793. - result.Rootfs.AvailableBytes = &imageFsInfo.Available - result.Rootfs.CapacityBytes = &imageFsInfo.Capacity - result.Rootfs.InodesFree = imageFsInfo.InodesFree - result.Rootfs.Inodes = imageFsInfo.Inodes - } - } - containerLogPath := kuberuntime.BuildContainerLogsDirectory(types.UID(uid), container.GetMetadata().GetName()) - result.Logs = p.getContainerLogStats(containerLogPath, rootFsInfo) - return result -} - -// removeTerminatedContainer returns the specified container but with -// the stats of the terminated containers removed. -func removeTerminatedContainer(containers []*runtimeapi.Container) []*runtimeapi.Container { - containerMap := make(map[containerID][]*runtimeapi.Container) - // Sort order by create time - sort.Slice(containers, func(i, j int) bool { - return containers[i].CreatedAt < containers[j].CreatedAt - }) - for _, container := range containers { - refID := containerID{ - podRef: buildPodRef(container.Labels), - containerName: kubetypes.GetContainerName(container.Labels), - } - containerMap[refID] = append(containerMap[refID], container) - } - - result := make([]*runtimeapi.Container, 0) - for _, refs := range containerMap { - if len(refs) == 1 { - result = append(result, refs[0]) - continue - } - found := false - for i := 0; i < len(refs); i++ { - if refs[i].State == runtimeapi.ContainerState_CONTAINER_RUNNING { - found = true - result = append(result, refs[i]) - } - } - if !found { - result = append(result, refs[len(refs)-1]) - } - } - return result -} - -func (p *criStatsProvider) addCadvisorContainerStats( - cs *statsapi.ContainerStats, - caPodStats *cadvisorapiv2.ContainerInfo, -) { - if caPodStats.Spec.HasCustomMetrics { - cs.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(caPodStats) - } - - cpu, memory := cadvisorInfoToCPUandMemoryStats(caPodStats) - if cpu != nil { - cs.CPU = cpu - } - if memory != nil { - cs.Memory = memory - } -} - -func getCRICadvisorStats(infos map[string]cadvisorapiv2.ContainerInfo) map[string]cadvisorapiv2.ContainerInfo { - stats := make(map[string]cadvisorapiv2.ContainerInfo) - infos = removeTerminatedContainerInfo(infos) - for key, info := range infos { - // On systemd using devicemapper each mount into the container has an - // associated cgroup. We ignore them to ensure we do not get duplicate - // entries in our summary. For details on .mount units: - // http://man7.org/linux/man-pages/man5/systemd.mount.5.html - if strings.HasSuffix(key, ".mount") { - continue - } - // Build the Pod key if this container is managed by a Pod - if !isPodManagedContainer(&info) { - continue - } - stats[path.Base(key)] = info - } - return stats -} - -// TODO Cache the metrics in container log manager -func (p *criStatsProvider) getContainerLogStats(path string, rootFsInfo *cadvisorapiv2.FsInfo) *statsapi.FsStats { - m := p.logMetricsService.createLogMetricsProvider(path) - logMetrics, err := m.GetMetrics() - if err != nil { - glog.Errorf("Unable to fetch container log stats for path %s: %v ", path, err) - return nil - } - result := &statsapi.FsStats{ - Time: metav1.NewTime(rootFsInfo.Timestamp), - AvailableBytes: &rootFsInfo.Available, - CapacityBytes: &rootFsInfo.Capacity, - InodesFree: rootFsInfo.InodesFree, - Inodes: rootFsInfo.Inodes, - } - usedbytes := uint64(logMetrics.Used.Value()) - result.UsedBytes = &usedbytes - inodesUsed := uint64(logMetrics.InodesUsed.Value()) - result.InodesUsed = &inodesUsed - return result -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go deleted file mode 100644 index a195b9c6..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/helper.go +++ /dev/null @@ -1,313 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 stats - -import ( - "fmt" - "time" - - "github.com/golang/glog" - - cadvisorapiv1 "github.com/google/cadvisor/info/v1" - cadvisorapiv2 "github.com/google/cadvisor/info/v2" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/cadvisor" -) - -// defaultNetworkInterfaceName is used for collectng network stats. -// This logic relies on knowledge of the container runtime implementation and -// is not reliable. -const defaultNetworkInterfaceName = "eth0" - -func cadvisorInfoToCPUandMemoryStats(info *cadvisorapiv2.ContainerInfo) (*statsapi.CPUStats, *statsapi.MemoryStats) { - cstat, found := latestContainerStats(info) - if !found { - return nil, nil - } - var cpuStats *statsapi.CPUStats - var memoryStats *statsapi.MemoryStats - if info.Spec.HasCpu { - cpuStats = &statsapi.CPUStats{ - Time: metav1.NewTime(cstat.Timestamp), - } - if cstat.CpuInst != nil { - cpuStats.UsageNanoCores = &cstat.CpuInst.Usage.Total - } - if cstat.Cpu != nil { - cpuStats.UsageCoreNanoSeconds = &cstat.Cpu.Usage.Total - } - } - if info.Spec.HasMemory { - pageFaults := cstat.Memory.ContainerData.Pgfault - majorPageFaults := cstat.Memory.ContainerData.Pgmajfault - memoryStats = &statsapi.MemoryStats{ - Time: metav1.NewTime(cstat.Timestamp), - UsageBytes: &cstat.Memory.Usage, - WorkingSetBytes: &cstat.Memory.WorkingSet, - RSSBytes: &cstat.Memory.RSS, - PageFaults: &pageFaults, - MajorPageFaults: &majorPageFaults, - } - // availableBytes = memory limit (if known) - workingset - if !isMemoryUnlimited(info.Spec.Memory.Limit) { - availableBytes := info.Spec.Memory.Limit - cstat.Memory.WorkingSet - memoryStats.AvailableBytes = &availableBytes - } - } - return cpuStats, memoryStats -} - -// cadvisorInfoToContainerStats returns the statsapi.ContainerStats converted -// from the container and filesystem info. -func cadvisorInfoToContainerStats(name string, info *cadvisorapiv2.ContainerInfo, rootFs, imageFs *cadvisorapiv2.FsInfo) *statsapi.ContainerStats { - result := &statsapi.ContainerStats{ - StartTime: metav1.NewTime(info.Spec.CreationTime), - Name: name, - } - cstat, found := latestContainerStats(info) - if !found { - return result - } - - cpu, memory := cadvisorInfoToCPUandMemoryStats(info) - result.CPU = cpu - result.Memory = memory - - if rootFs != nil { - // The container logs live on the node rootfs device - result.Logs = buildLogsStats(cstat, rootFs) - } - - if imageFs != nil { - // The container rootFs lives on the imageFs devices (which may not be the node root fs) - result.Rootfs = buildRootfsStats(cstat, imageFs) - } - - cfs := cstat.Filesystem - if cfs != nil { - if cfs.BaseUsageBytes != nil { - if result.Rootfs != nil { - rootfsUsage := *cfs.BaseUsageBytes - result.Rootfs.UsedBytes = &rootfsUsage - } - if cfs.TotalUsageBytes != nil && result.Logs != nil { - logsUsage := *cfs.TotalUsageBytes - *cfs.BaseUsageBytes - result.Logs.UsedBytes = &logsUsage - } - } - if cfs.InodeUsage != nil && result.Rootfs != nil { - rootInodes := *cfs.InodeUsage - result.Rootfs.InodesUsed = &rootInodes - } - } - - for _, acc := range cstat.Accelerators { - result.Accelerators = append(result.Accelerators, statsapi.AcceleratorStats{ - Make: acc.Make, - Model: acc.Model, - ID: acc.ID, - MemoryTotal: acc.MemoryTotal, - MemoryUsed: acc.MemoryUsed, - DutyCycle: acc.DutyCycle, - }) - } - - result.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(info) - - return result -} - -// cadvisorInfoToNetworkStats returns the statsapi.NetworkStats converted from -// the container info from cadvisor. -func cadvisorInfoToNetworkStats(name string, info *cadvisorapiv2.ContainerInfo) *statsapi.NetworkStats { - if !info.Spec.HasNetwork { - return nil - } - cstat, found := latestContainerStats(info) - if !found { - return nil - } - - iStats := statsapi.NetworkStats{ - Time: metav1.NewTime(cstat.Timestamp), - } - - for i := range cstat.Network.Interfaces { - inter := cstat.Network.Interfaces[i] - iStat := statsapi.InterfaceStats{ - Name: inter.Name, - RxBytes: &inter.RxBytes, - RxErrors: &inter.RxErrors, - TxBytes: &inter.TxBytes, - TxErrors: &inter.TxErrors, - } - - if inter.Name == defaultNetworkInterfaceName { - iStats.InterfaceStats = iStat - } - - iStats.Interfaces = append(iStats.Interfaces, iStat) - } - - return &iStats -} - -// cadvisorInfoToUserDefinedMetrics returns the statsapi.UserDefinedMetric -// converted from the container info from cadvisor. -func cadvisorInfoToUserDefinedMetrics(info *cadvisorapiv2.ContainerInfo) []statsapi.UserDefinedMetric { - type specVal struct { - ref statsapi.UserDefinedMetricDescriptor - valType cadvisorapiv1.DataType - time time.Time - value float64 - } - udmMap := map[string]*specVal{} - for _, spec := range info.Spec.CustomMetrics { - udmMap[spec.Name] = &specVal{ - ref: statsapi.UserDefinedMetricDescriptor{ - Name: spec.Name, - Type: statsapi.UserDefinedMetricType(spec.Type), - Units: spec.Units, - }, - valType: spec.Format, - } - } - for _, stat := range info.Stats { - for name, values := range stat.CustomMetrics { - specVal, ok := udmMap[name] - if !ok { - glog.Warningf("spec for custom metric %q is missing from cAdvisor output. Spec: %+v, Metrics: %+v", name, info.Spec, stat.CustomMetrics) - continue - } - for _, value := range values { - // Pick the most recent value - if value.Timestamp.Before(specVal.time) { - continue - } - specVal.time = value.Timestamp - specVal.value = value.FloatValue - if specVal.valType == cadvisorapiv1.IntType { - specVal.value = float64(value.IntValue) - } - } - } - } - var udm []statsapi.UserDefinedMetric - for _, specVal := range udmMap { - udm = append(udm, statsapi.UserDefinedMetric{ - UserDefinedMetricDescriptor: specVal.ref, - Time: metav1.NewTime(specVal.time), - Value: specVal.value, - }) - } - return udm -} - -// latestContainerStats returns the latest container stats from cadvisor, or nil if none exist -func latestContainerStats(info *cadvisorapiv2.ContainerInfo) (*cadvisorapiv2.ContainerStats, bool) { - stats := info.Stats - if len(stats) < 1 { - return nil, false - } - latest := stats[len(stats)-1] - if latest == nil { - return nil, false - } - return latest, true -} - -func isMemoryUnlimited(v uint64) bool { - // Size after which we consider memory to be "unlimited". This is not - // MaxInt64 due to rounding by the kernel. - // TODO: cadvisor should export this https://github.com/google/cadvisor/blob/master/metrics/prometheus.go#L596 - const maxMemorySize = uint64(1 << 62) - - return v > maxMemorySize -} - -// getCgroupInfo returns the information of the container with the specified -// containerName from cadvisor. -func getCgroupInfo(cadvisor cadvisor.Interface, containerName string, updateStats bool) (*cadvisorapiv2.ContainerInfo, error) { - var maxAge *time.Duration - if updateStats { - age := 0 * time.Second - maxAge = &age - } - infoMap, err := cadvisor.ContainerInfoV2(containerName, cadvisorapiv2.RequestOptions{ - IdType: cadvisorapiv2.TypeName, - Count: 2, // 2 samples are needed to compute "instantaneous" CPU - Recursive: false, - MaxAge: maxAge, - }) - if err != nil { - return nil, fmt.Errorf("failed to get container info for %q: %v", containerName, err) - } - if len(infoMap) != 1 { - return nil, fmt.Errorf("unexpected number of containers: %v", len(infoMap)) - } - info := infoMap[containerName] - return &info, nil -} - -// getCgroupStats returns the latest stats of the container having the -// specified containerName from cadvisor. -func getCgroupStats(cadvisor cadvisor.Interface, containerName string, updateStats bool) (*cadvisorapiv2.ContainerStats, error) { - info, err := getCgroupInfo(cadvisor, containerName, updateStats) - if err != nil { - return nil, err - } - stats, found := latestContainerStats(info) - if !found { - return nil, fmt.Errorf("failed to get latest stats from container info for %q", containerName) - } - return stats, nil -} - -func buildLogsStats(cstat *cadvisorapiv2.ContainerStats, rootFs *cadvisorapiv2.FsInfo) *statsapi.FsStats { - fsStats := &statsapi.FsStats{ - Time: metav1.NewTime(cstat.Timestamp), - AvailableBytes: &rootFs.Available, - CapacityBytes: &rootFs.Capacity, - InodesFree: rootFs.InodesFree, - Inodes: rootFs.Inodes, - } - - if rootFs.Inodes != nil && rootFs.InodesFree != nil { - logsInodesUsed := *rootFs.Inodes - *rootFs.InodesFree - fsStats.InodesUsed = &logsInodesUsed - } - return fsStats -} - -func buildRootfsStats(cstat *cadvisorapiv2.ContainerStats, imageFs *cadvisorapiv2.FsInfo) *statsapi.FsStats { - return &statsapi.FsStats{ - Time: metav1.NewTime(cstat.Timestamp), - AvailableBytes: &imageFs.Available, - CapacityBytes: &imageFs.Capacity, - InodesFree: imageFs.InodesFree, - Inodes: imageFs.Inodes, - } -} - -func getUint64Value(value *uint64) uint64 { - if value == nil { - return 0 - } - - return *value -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider.go deleted file mode 100644 index 29a24a1b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider.go +++ /dev/null @@ -1,189 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 stats - -import ( - "fmt" - - cadvisorapiv1 "github.com/google/cadvisor/info/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - internalapi "k8s.io/kubernetes/pkg/kubelet/apis/cri" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" - "k8s.io/kubernetes/pkg/kubelet/cadvisor" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - kubepod "k8s.io/kubernetes/pkg/kubelet/pod" - "k8s.io/kubernetes/pkg/kubelet/server/stats" -) - -// NewCRIStatsProvider returns a StatsProvider that provides the node stats -// from cAdvisor and the container stats from CRI. -func NewCRIStatsProvider( - cadvisor cadvisor.Interface, - resourceAnalyzer stats.ResourceAnalyzer, - podManager kubepod.Manager, - runtimeCache kubecontainer.RuntimeCache, - runtimeService internalapi.RuntimeService, - imageService internalapi.ImageManagerService, - logMetricsService LogMetricsService, -) *StatsProvider { - return newStatsProvider(cadvisor, podManager, runtimeCache, newCRIStatsProvider(cadvisor, resourceAnalyzer, runtimeService, imageService, logMetricsService)) -} - -// NewCadvisorStatsProvider returns a containerStatsProvider that provides both -// the node and the container stats from cAdvisor. -func NewCadvisorStatsProvider( - cadvisor cadvisor.Interface, - resourceAnalyzer stats.ResourceAnalyzer, - podManager kubepod.Manager, - runtimeCache kubecontainer.RuntimeCache, - imageService kubecontainer.ImageService, -) *StatsProvider { - return newStatsProvider(cadvisor, podManager, runtimeCache, newCadvisorStatsProvider(cadvisor, resourceAnalyzer, imageService)) -} - -// newStatsProvider returns a new StatsProvider that provides node stats from -// cAdvisor and the container stats using the containerStatsProvider. -func newStatsProvider( - cadvisor cadvisor.Interface, - podManager kubepod.Manager, - runtimeCache kubecontainer.RuntimeCache, - containerStatsProvider containerStatsProvider, -) *StatsProvider { - return &StatsProvider{ - cadvisor: cadvisor, - podManager: podManager, - runtimeCache: runtimeCache, - containerStatsProvider: containerStatsProvider, - } -} - -// StatsProvider provides the stats of the node and the pod-managed containers. -type StatsProvider struct { - cadvisor cadvisor.Interface - podManager kubepod.Manager - runtimeCache kubecontainer.RuntimeCache - containerStatsProvider - rlimitStatsProvider -} - -// containerStatsProvider is an interface that provides the stats of the -// containers managed by pods. -type containerStatsProvider interface { - ListPodStats() ([]statsapi.PodStats, error) - ImageFsStats() (*statsapi.FsStats, error) - ImageFsDevice() (string, error) -} - -type rlimitStatsProvider interface { - RlimitStats() (*statsapi.RlimitStats, error) -} - -// GetCgroupStats returns the stats of the cgroup with the cgroupName. Note that -// this function doesn't generate filesystem stats. -func (p *StatsProvider) GetCgroupStats(cgroupName string, updateStats bool) (*statsapi.ContainerStats, *statsapi.NetworkStats, error) { - info, err := getCgroupInfo(p.cadvisor, cgroupName, updateStats) - if err != nil { - return nil, nil, fmt.Errorf("failed to get cgroup stats for %q: %v", cgroupName, err) - } - // Rootfs and imagefs doesn't make sense for raw cgroup. - s := cadvisorInfoToContainerStats(cgroupName, info, nil, nil) - n := cadvisorInfoToNetworkStats(cgroupName, info) - return s, n, nil -} - -// RootFsStats returns the stats of the node root filesystem. -func (p *StatsProvider) RootFsStats() (*statsapi.FsStats, error) { - rootFsInfo, err := p.cadvisor.RootFsInfo() - if err != nil { - return nil, fmt.Errorf("failed to get rootFs info: %v", err) - } - - var nodeFsInodesUsed *uint64 - if rootFsInfo.Inodes != nil && rootFsInfo.InodesFree != nil { - nodeFsIU := *rootFsInfo.Inodes - *rootFsInfo.InodesFree - nodeFsInodesUsed = &nodeFsIU - } - - // Get the root container stats's timestamp, which will be used as the - // imageFs stats timestamp. Dont force a stats update, as we only want the timestamp. - rootStats, err := getCgroupStats(p.cadvisor, "/", false) - if err != nil { - return nil, fmt.Errorf("failed to get root container stats: %v", err) - } - - return &statsapi.FsStats{ - Time: metav1.NewTime(rootStats.Timestamp), - AvailableBytes: &rootFsInfo.Available, - CapacityBytes: &rootFsInfo.Capacity, - UsedBytes: &rootFsInfo.Usage, - InodesFree: rootFsInfo.InodesFree, - Inodes: rootFsInfo.Inodes, - InodesUsed: nodeFsInodesUsed, - }, nil -} - -// GetContainerInfo returns stats (from cAdvisor) for a container. -func (p *StatsProvider) GetContainerInfo(podFullName string, podUID types.UID, containerName string, req *cadvisorapiv1.ContainerInfoRequest) (*cadvisorapiv1.ContainerInfo, error) { - // Resolve and type convert back again. - // We need the static pod UID but the kubecontainer API works with types.UID. - podUID = types.UID(p.podManager.TranslatePodUID(podUID)) - - pods, err := p.runtimeCache.GetPods() - if err != nil { - return nil, err - } - pod := kubecontainer.Pods(pods).FindPod(podFullName, podUID) - container := pod.FindContainerByName(containerName) - if container == nil { - return nil, kubecontainer.ErrContainerNotFound - } - - ci, err := p.cadvisor.DockerContainer(container.ID.ID, req) - if err != nil { - return nil, err - } - return &ci, nil -} - -// GetRawContainerInfo returns the stats (from cadvisor) for a non-Kubernetes -// container. -func (p *StatsProvider) GetRawContainerInfo(containerName string, req *cadvisorapiv1.ContainerInfoRequest, subcontainers bool) (map[string]*cadvisorapiv1.ContainerInfo, error) { - if subcontainers { - return p.cadvisor.SubcontainerInfo(containerName, req) - } - containerInfo, err := p.cadvisor.ContainerInfo(containerName, req) - if err != nil { - return nil, err - } - return map[string]*cadvisorapiv1.ContainerInfo{ - containerInfo.Name: containerInfo, - }, nil -} - -// HasDedicatedImageFs returns true if a dedicated image filesystem exists for storing images. -func (p *StatsProvider) HasDedicatedImageFs() (bool, error) { - device, err := p.containerStatsProvider.ImageFsDevice() - if err != nil { - return false, err - } - rootFsInfo, err := p.cadvisor.RootFsInfo() - if err != nil { - return false, err - } - return device != rootFsInfo.Device, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider_linux.go deleted file mode 100644 index f36890fc..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/stats/stats_provider_linux.go +++ /dev/null @@ -1,48 +0,0 @@ -// +build linux - -/* -Copyright 2017 The Kubernetes Authors. - -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 stats - -import ( - "io/ioutil" - "strconv" - "syscall" - "time" - - "k8s.io/apimachinery/pkg/apis/meta/v1" - statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1" -) - -func (p *StatsProvider) RlimitStats() (*statsapi.RlimitStats, error) { - rlimit := &statsapi.RlimitStats{} - - if content, err := ioutil.ReadFile("/proc/sys/kernel/pid_max"); err == nil { - if maxPid, err := strconv.ParseInt(string(content[:len(content)-1]), 10, 64); err == nil { - rlimit.MaxPID = &maxPid - } - } - - var info syscall.Sysinfo_t - syscall.Sysinfo(&info) - procs := int64(info.Procs) - rlimit.NumOfRunningProcesses = &procs - - rlimit.Time = v1.NewTime(time.Now()) - - return rlimit, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD index 63e32a39..6e341e9b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/status/BUILD @@ -20,15 +20,15 @@ go_library( "//pkg/kubelet/types:go_default_library", "//pkg/kubelet/util/format:go_default_library", "//pkg/util/pod:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], ) @@ -49,15 +49,15 @@ go_test( "//pkg/kubelet/secret:go_default_library", "//pkg/kubelet/status/testing:go_default_library", "//pkg/kubelet/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/testing:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go index 1dbfc6aa..f1840031 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/status/status_manager.go @@ -336,6 +336,9 @@ func (m *manager) updateStatusInternal(pod *v1.Pod, status v1.PodStatus, forceUp return false } + // Set ContainersReadyCondition.LastTransitionTime. + updateLastTransitionTime(&status, &oldStatus, v1.ContainersReady) + // Set ReadyCondition.LastTransitionTime. updateLastTransitionTime(&status, &oldStatus, v1.PodReady) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD deleted file mode 100644 index f8c52b92..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "namespace.go", - "runtime.go", - "whitelist.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/sysctl", - deps = [ - "//pkg/apis/core/validation:go_default_library", - "//pkg/apis/policy/validation:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/lifecycle:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "namespace_test.go", - "whitelist_test.go", - ], - embed = [":go_default_library"], - deps = ["//pkg/security/podsecuritypolicy/sysctl:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/namespace.go b/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/namespace.go deleted file mode 100644 index 1619998f..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/namespace.go +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 sysctl - -import ( - "strings" -) - -// Namespace represents a kernel namespace name. -type Namespace string - -const ( - // the Linux IPC namespace - IpcNamespace = Namespace("ipc") - - // the network namespace - NetNamespace = Namespace("net") - - // the zero value if no namespace is known - UnknownNamespace = Namespace("") -) - -var namespaces = map[string]Namespace{ - "kernel.sem": IpcNamespace, -} - -var prefixNamespaces = map[string]Namespace{ - "kernel.shm": IpcNamespace, - "kernel.msg": IpcNamespace, - "fs.mqueue.": IpcNamespace, - "net.": NetNamespace, -} - -// NamespacedBy returns the namespace of the Linux kernel for a sysctl, or -// UnknownNamespace if the sysctl is not known to be namespaced. -func NamespacedBy(val string) Namespace { - if ns, found := namespaces[val]; found { - return ns - } - for p, ns := range prefixNamespaces { - if strings.HasPrefix(val, p) { - return ns - } - } - return UnknownNamespace -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/runtime.go b/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/runtime.go deleted file mode 100644 index 8b37c65c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/runtime.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 sysctl - -import ( - "fmt" - - "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/lifecycle" -) - -const ( - UnsupportedReason = "SysctlUnsupported" - // CRI uses semver-compatible API version, while docker does not - // (e.g., 1.24). Append the version with a ".0". - dockerMinimumAPIVersion = "1.24.0" - - dockerTypeName = "docker" -) - -// TODO: The admission logic in this file is runtime-dependent. It should be -// changed to be generic and CRI-compatible. - -type runtimeAdmitHandler struct { - result lifecycle.PodAdmitResult -} - -var _ lifecycle.PodAdmitHandler = &runtimeAdmitHandler{} - -// NewRuntimeAdmitHandler returns a sysctlRuntimeAdmitHandler which checks whether -// the given runtime support sysctls. -func NewRuntimeAdmitHandler(runtime container.Runtime) (*runtimeAdmitHandler, error) { - switch runtime.Type() { - case dockerTypeName: - v, err := runtime.APIVersion() - if err != nil { - return nil, fmt.Errorf("failed to get runtime version: %v", err) - } - - // only Docker API version >= 1.24 supports sysctls - c, err := v.Compare(dockerMinimumAPIVersion) - if err != nil { - return nil, fmt.Errorf("failed to compare Docker version for sysctl support: %v", err) - } - if c >= 0 { - return &runtimeAdmitHandler{ - result: lifecycle.PodAdmitResult{ - Admit: true, - }, - }, nil - } - return &runtimeAdmitHandler{ - result: lifecycle.PodAdmitResult{ - Admit: false, - Reason: UnsupportedReason, - Message: "Docker API version before 1.24 does not support sysctls", - }, - }, nil - default: - // Return admit for other runtimes. - return &runtimeAdmitHandler{ - result: lifecycle.PodAdmitResult{ - Admit: true, - }, - }, nil - } -} - -// Admit checks whether the runtime supports sysctls. -func (w *runtimeAdmitHandler) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { - if attrs.Pod.Spec.SecurityContext != nil { - - if len(attrs.Pod.Spec.SecurityContext.Sysctls) > 0 { - return w.result - } - } - - return lifecycle.PodAdmitResult{ - Admit: true, - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/whitelist.go b/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/whitelist.go deleted file mode 100644 index 067409a7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/sysctl/whitelist.go +++ /dev/null @@ -1,136 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 sysctl - -import ( - "fmt" - "strings" - - "k8s.io/kubernetes/pkg/apis/core/validation" - policyvalidation "k8s.io/kubernetes/pkg/apis/policy/validation" - "k8s.io/kubernetes/pkg/kubelet/lifecycle" -) - -const ( - AnnotationInvalidReason = "InvalidSysctlAnnotation" - ForbiddenReason = "SysctlForbidden" -) - -// patternWhitelist takes a list of sysctls or sysctl patterns (ending in *) and -// checks validity via a sysctl and prefix map, rejecting those which are not known -// to be namespaced. -type patternWhitelist struct { - sysctls map[string]Namespace - prefixes map[string]Namespace -} - -var _ lifecycle.PodAdmitHandler = &patternWhitelist{} - -// NewWhitelist creates a new Whitelist from a list of sysctls and sysctl pattern (ending in *). -func NewWhitelist(patterns []string) (*patternWhitelist, error) { - w := &patternWhitelist{ - sysctls: map[string]Namespace{}, - prefixes: map[string]Namespace{}, - } - - for _, s := range patterns { - if !policyvalidation.IsValidSysctlPattern(s) { - return nil, fmt.Errorf("sysctl %q must have at most %d characters and match regex %s", - s, - validation.SysctlMaxLength, - policyvalidation.SysctlPatternFmt, - ) - } - if strings.HasSuffix(s, "*") { - prefix := s[:len(s)-1] - ns := NamespacedBy(prefix) - if ns == UnknownNamespace { - return nil, fmt.Errorf("the sysctls %q are not known to be namespaced", s) - } - w.prefixes[prefix] = ns - } else { - ns := NamespacedBy(s) - if ns == UnknownNamespace { - return nil, fmt.Errorf("the sysctl %q are not known to be namespaced", s) - } - w.sysctls[s] = ns - } - } - return w, nil -} - -// validateSysctl checks that a sysctl is whitelisted because it is known -// to be namespaced by the Linux kernel. Note that being whitelisted is required, but not -// sufficient: the container runtime might have a stricter check and refuse to launch a pod. -// -// The parameters hostNet and hostIPC are used to forbid sysctls for pod sharing the -// respective namespaces with the host. This check is only possible for sysctls on -// the static default whitelist, not those on the custom whitelist provided by the admin. -func (w *patternWhitelist) validateSysctl(sysctl string, hostNet, hostIPC bool) error { - nsErrorFmt := "%q not allowed with host %s enabled" - if ns, found := w.sysctls[sysctl]; found { - if ns == IpcNamespace && hostIPC { - return fmt.Errorf(nsErrorFmt, sysctl, ns) - } - if ns == NetNamespace && hostNet { - return fmt.Errorf(nsErrorFmt, sysctl, ns) - } - return nil - } - for p, ns := range w.prefixes { - if strings.HasPrefix(sysctl, p) { - if ns == IpcNamespace && hostIPC { - return fmt.Errorf(nsErrorFmt, sysctl, ns) - } - if ns == NetNamespace && hostNet { - return fmt.Errorf(nsErrorFmt, sysctl, ns) - } - return nil - } - } - return fmt.Errorf("%q not whitelisted", sysctl) -} - -// Admit checks that all sysctls given in pod's security context -// are valid according to the whitelist. -func (w *patternWhitelist) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { - pod := attrs.Pod - if pod.Spec.SecurityContext == nil || len(pod.Spec.SecurityContext.Sysctls) == 0 { - return lifecycle.PodAdmitResult{ - Admit: true, - } - } - - var hostNet, hostIPC bool - if pod.Spec.SecurityContext != nil { - hostNet = pod.Spec.HostNetwork - hostIPC = pod.Spec.HostIPC - } - for _, s := range pod.Spec.SecurityContext.Sysctls { - if err := w.validateSysctl(s.Name, hostNet, hostIPC); err != nil { - return lifecycle.PodAdmitResult{ - Admit: false, - Reason: ForbiddenReason, - Message: fmt.Sprintf("forbidden sysctl: %v", err), - } - } - } - - return lifecycle.PodAdmitResult{ - Admit: true, - } -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD deleted file mode 100644 index d4d812a2..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/token/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_library( - name = "go_default_library", - srcs = ["token_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/token", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["token_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/token/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/token/OWNERS deleted file mode 100644 index 33904f77..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/token/OWNERS +++ /dev/null @@ -1,6 +0,0 @@ -approvers: -- mikedanese -reviewers: -- mikedanese -- awly -- tallclair diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go deleted file mode 100644 index d081bdd1..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/token/token_manager.go +++ /dev/null @@ -1,151 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 token implements a manager of serviceaccount tokens for pods running -// on the node. -package token - -import ( - "errors" - "fmt" - "sync" - "time" - - "github.com/golang/glog" - authenticationv1 "k8s.io/api/authentication/v1" - "k8s.io/apimachinery/pkg/util/clock" - "k8s.io/apimachinery/pkg/util/wait" - clientset "k8s.io/client-go/kubernetes" -) - -const ( - maxTTL = 24 * time.Hour - gcPeriod = time.Minute -) - -// NewManager returns a new token manager. -func NewManager(c clientset.Interface) *Manager { - m := &Manager{ - getToken: func(name, namespace string, tr *authenticationv1.TokenRequest) (*authenticationv1.TokenRequest, error) { - if c == nil { - return nil, errors.New("cannot use TokenManager when kubelet is in standalone mode") - } - return c.CoreV1().ServiceAccounts(namespace).CreateToken(name, tr) - }, - cache: make(map[string]*authenticationv1.TokenRequest), - clock: clock.RealClock{}, - } - go wait.Forever(m.cleanup, gcPeriod) - return m -} - -// Manager manages service account tokens for pods. -type Manager struct { - - // cacheMutex guards the cache - cacheMutex sync.RWMutex - cache map[string]*authenticationv1.TokenRequest - - // mocked for testing - getToken func(name, namespace string, tr *authenticationv1.TokenRequest) (*authenticationv1.TokenRequest, error) - clock clock.Clock -} - -// GetServiceAccountToken gets a service account token for a pod from cache or -// from the TokenRequest API. This process is as follows: -// * Check the cache for the current token request. -// * If the token exists and does not require a refresh, return the current token. -// * Attempt to refresh the token. -// * If the token is refreshed successfully, save it in the cache and return the token. -// * If refresh fails and the old token is still valid, log an error and return the old token. -// * If refresh fails and the old token is no longer valid, return an error -func (m *Manager) GetServiceAccountToken(namespace, name string, tr *authenticationv1.TokenRequest) (*authenticationv1.TokenRequest, error) { - key := keyFunc(name, namespace, tr) - ctr, ok := m.get(key) - - if ok && !m.requiresRefresh(ctr) { - return ctr, nil - } - - tr, err := m.getToken(name, namespace, tr) - if err != nil { - switch { - case !ok: - return nil, fmt.Errorf("failed to fetch token: %v", err) - case m.expired(ctr): - return nil, fmt.Errorf("token %s expired and refresh failed: %v", key, err) - default: - glog.Errorf("couldn't update token %s: %v", key, err) - return ctr, nil - } - } - - m.set(key, tr) - return tr, nil -} - -func (m *Manager) cleanup() { - m.cacheMutex.Lock() - defer m.cacheMutex.Unlock() - for k, tr := range m.cache { - if m.expired(tr) { - delete(m.cache, k) - } - } -} - -func (m *Manager) get(key string) (*authenticationv1.TokenRequest, bool) { - m.cacheMutex.RLock() - defer m.cacheMutex.RUnlock() - ctr, ok := m.cache[key] - return ctr, ok -} - -func (m *Manager) set(key string, tr *authenticationv1.TokenRequest) { - m.cacheMutex.Lock() - defer m.cacheMutex.Unlock() - m.cache[key] = tr -} - -func (m *Manager) expired(t *authenticationv1.TokenRequest) bool { - return m.clock.Now().After(t.Status.ExpirationTimestamp.Time) -} - -// requiresRefresh returns true if the token is older than 80% of its total -// ttl, or if the token is older than 24 hours. -func (m *Manager) requiresRefresh(tr *authenticationv1.TokenRequest) bool { - if tr.Spec.ExpirationSeconds == nil { - glog.Errorf("expiration seconds was nil for tr: %#v", tr) - return false - } - now := m.clock.Now() - exp := tr.Status.ExpirationTimestamp.Time - iat := exp.Add(-1 * time.Duration(*tr.Spec.ExpirationSeconds) * time.Second) - - if now.After(iat.Add(maxTTL)) { - return true - } - // Require a refresh if within 20% of the TTL from the expiration time. - if now.After(exp.Add(-1 * time.Duration((*tr.Spec.ExpirationSeconds*20)/100) * time.Second)) { - return true - } - return false -} - -// keys should be nonconfidential and safe to log -func keyFunc(name, namespace string, tr *authenticationv1.TokenRequest) string { - return fmt.Sprintf("%q/%q/%#v", name, namespace, tr.Spec) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD index b1d5ffd1..bc62f58d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/types/BUILD @@ -20,9 +20,11 @@ go_library( deps = [ "//pkg/apis/core:go_default_library", "//pkg/apis/scheduling:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -36,10 +38,11 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go b/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go index 64083315..bdc5ee79 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/types/pod_update.go @@ -21,8 +21,10 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" kubeapi "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/scheduling" + "k8s.io/kubernetes/pkg/features" ) const ( @@ -141,10 +143,36 @@ func (sp SyncPodType) String() string { } // IsCriticalPod returns true if the pod bears the critical pod annotation key or if pod's priority is greater than -// or equal to SystemCriticalPriority. Both the rescheduler(deprecated in 1.10) and the kubelet use this function +// or equal to SystemCriticalPriority. Both the default scheduler and the kubelet use this function // to make admission and scheduling decisions. func IsCriticalPod(pod *v1.Pod) bool { - return IsCritical(pod.Namespace, pod.Annotations) || (pod.Spec.Priority != nil && IsCriticalPodBasedOnPriority(*pod.Spec.Priority)) + if utilfeature.DefaultFeatureGate.Enabled(features.PodPriority) { + if pod.Spec.Priority != nil && IsCriticalPodBasedOnPriority(*pod.Spec.Priority) { + return true + } + } + if utilfeature.DefaultFeatureGate.Enabled(features.ExperimentalCriticalPodAnnotation) { + if IsCritical(pod.Namespace, pod.Annotations) { + return true + } + } + return false +} + +// Preemptable returns true if preemptor pod can preempt preemptee pod +// if preemptee is not critical or if preemptor's priority is greater than preemptee's priority +func Preemptable(preemptor, preemptee *v1.Pod) bool { + if IsCriticalPod(preemptor) && !IsCriticalPod(preemptee) { + return true + } + if utilfeature.DefaultFeatureGate.Enabled(features.PodPriority) { + if (preemptor != nil && preemptor.Spec.Priority != nil) && + (preemptee != nil && preemptee.Spec.Priority != nil) { + return *(preemptor.Spec.Priority) > *(preemptee.Spec.Priority) + } + } + + return false } // IsCritical returns true if parameters bear the critical pod annotation diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util.go deleted file mode 100644 index 3047c2fa..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util.go +++ /dev/null @@ -1,129 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "os" - - "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/capabilities" - kubetypes "k8s.io/kubernetes/pkg/kubelet/types" - "k8s.io/kubernetes/pkg/securitycontext" -) - -// Check whether we have the capabilities to run the specified pod. -func canRunPod(pod *v1.Pod) error { - if !capabilities.Get().AllowPrivileged { - for _, container := range pod.Spec.Containers { - if securitycontext.HasPrivilegedRequest(&container) { - return fmt.Errorf("pod with UID %q specified privileged container, but is disallowed", pod.UID) - } - } - for _, container := range pod.Spec.InitContainers { - if securitycontext.HasPrivilegedRequest(&container) { - return fmt.Errorf("pod with UID %q specified privileged init container, but is disallowed", pod.UID) - } - } - } - - if pod.Spec.HostNetwork { - allowed, err := allowHostNetwork(pod) - if err != nil { - return err - } - if !allowed { - return fmt.Errorf("pod with UID %q specified host networking, but is disallowed", pod.UID) - } - } - - if pod.Spec.HostPID { - allowed, err := allowHostPID(pod) - if err != nil { - return err - } - if !allowed { - return fmt.Errorf("pod with UID %q specified host PID, but is disallowed", pod.UID) - } - } - - if pod.Spec.HostIPC { - allowed, err := allowHostIPC(pod) - if err != nil { - return err - } - if !allowed { - return fmt.Errorf("pod with UID %q specified host ipc, but is disallowed", pod.UID) - } - } - - return nil -} - -// Determined whether the specified pod is allowed to use host networking -func allowHostNetwork(pod *v1.Pod) (bool, error) { - podSource, err := kubetypes.GetPodSource(pod) - if err != nil { - return false, err - } - for _, source := range capabilities.Get().PrivilegedSources.HostNetworkSources { - if source == podSource { - return true, nil - } - } - return false, nil -} - -// Determined whether the specified pod is allowed to use host PID -func allowHostPID(pod *v1.Pod) (bool, error) { - podSource, err := kubetypes.GetPodSource(pod) - if err != nil { - return false, err - } - for _, source := range capabilities.Get().PrivilegedSources.HostPIDSources { - if source == podSource { - return true, nil - } - } - return false, nil -} - -// Determined whether the specified pod is allowed to use host ipc -func allowHostIPC(pod *v1.Pod) (bool, error) { - podSource, err := kubetypes.GetPodSource(pod) - if err != nil { - return false, err - } - for _, source := range capabilities.Get().PrivilegedSources.HostIPCSources { - if source == podSource { - return true, nil - } - } - return false, nil -} - -// dirExists returns true if the path exists and represents a directory. -func dirExists(path string) bool { - s, err := os.Stat(path) - if err != nil { - return false - } - return s.IsDir() -} - -// empty is a placeholder type used to implement a set -type empty struct{} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD index ff1755eb..d25898d2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/BUILD @@ -8,9 +8,7 @@ load( go_test( name = "go_default_test", - srcs = [ - "util_test.go", - ], + srcs = ["util_test.go"], embed = [":go_default_library"], deps = [ "//vendor/github.com/stretchr/testify/assert:go_default_library", @@ -22,45 +20,13 @@ go_library( srcs = [ "doc.go", "util.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "util_unix.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "util_unix.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "util_unix.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "util_windows.go", - ], - "//conditions:default": [], - }), + "util_unix.go", + "util_unsupported.go", + "util_windows.go", + ], importpath = "k8s.io/kubernetes/pkg/kubelet/util", deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:darwin": [ "//vendor/github.com/golang/glog:go_default_library", diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD index fd8bda8b..8f1b4160 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/cache/BUILD @@ -10,7 +10,7 @@ go_library( name = "go_default_library", srcs = ["object_cache.go"], importpath = "k8s.io/kubernetes/pkg/kubelet/util/cache", - deps = ["//vendor/k8s.io/client-go/tools/cache:go_default_library"], + deps = ["//staging/src/k8s.io/client-go/tools/cache:go_default_library"], ) go_test( @@ -18,8 +18,8 @@ go_test( srcs = ["object_cache_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD index 2d7dc66c..a3cc202f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/BUILD @@ -1,10 +1,4 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", @@ -13,19 +7,26 @@ go_library( "resources.go", ], importpath = "k8s.io/kubernetes/pkg/kubelet/util/format", + visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", ], ) go_test( name = "go_default_test", - srcs = ["resources_test.go"], + srcs = [ + "pod_test.go", + "resources_test.go", + ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", ], ) @@ -40,4 +41,5 @@ filegroup( name = "all-srcs", srcs = [":package-srcs"], tags = ["automanaged"], + visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go index 45c0d8b4..070fd099 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/format/pod.go @@ -57,9 +57,9 @@ func Pods(pods []*v1.Pod) string { return aggregatePods(pods, Pod) } -// PodsWithDeletiontimestamps is the same as Pods. In addition, it prints the +// PodsWithDeletionTimestamps is the same as Pods. In addition, it prints the // deletion timestamps of the pods if they are not nil. -func PodsWithDeletiontimestamps(pods []*v1.Pod) string { +func PodsWithDeletionTimestamps(pods []*v1.Pod) string { return aggregatePods(pods, PodWithDeletionTimestamp) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD index e789de20..e220b787 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/manager/BUILD @@ -11,18 +11,18 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/kubelet/util:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/etcd:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/storage/etcd:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", ], ) @@ -36,18 +36,18 @@ go_test( deps = [ "//pkg/api/v1/pod:go_default_library", "//pkg/apis/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/testing:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/BUILD index b4173ab5..0301c6b9 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/BUILD @@ -1,18 +1,15 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ + "example_handler.go", "example_plugin.go", "plugin_watcher.go", + "types.go", ], importpath = "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher", + visibility = ["//visibility:public"], deps = [ "//pkg/kubelet/apis/pluginregistration/v1alpha1:go_default_library", "//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1:go_default_library", @@ -20,11 +17,22 @@ go_library( "//pkg/util/filesystem:go_default_library", "//vendor/github.com/fsnotify/fsnotify:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/pkg/errors:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", "//vendor/google.golang.org/grpc:go_default_library", ], ) +go_test( + name = "go_default_test", + srcs = ["plugin_watcher_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/kubelet/apis/pluginregistration/v1alpha1:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", + ], +) + filegroup( name = "package-srcs", srcs = glob(["**"]), @@ -42,17 +50,3 @@ filegroup( tags = ["automanaged"], visibility = ["//visibility:public"], ) - -go_test( - name = "go_default_test", - srcs = ["plugin_watcher_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/apis/pluginregistration/v1alpha1:go_default_library", - "//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1:go_default_library", - "//pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/README b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/README index 9654b2cf..c8b6cc28 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/README +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/README @@ -13,17 +13,22 @@ communication with any API version supported by the plugin. Here are the general rules that Kubelet plugin developers should follow: - Run as 'root' user. Currently creating socket under PluginsSockDir, a root owned directory, requires plugin process to be running as 'root'. + - Implements the Registration service specified in pkg/kubelet/apis/pluginregistration/v*/api.proto. + - The plugin name sent during Registration.GetInfo grpc should be unique for the given plugin type (CSIPlugin or DevicePlugin). -- The socket path needs to be unique and doesn't conflict with the path chosen - by any other potential plugins. Currently we only support flat fs namespace - under PluginsSockDir but will soon support recursive inotify watch for - hierarchical socket paths. + +- The socket path needs to be unique within one directory, in normal case, + each plugin type has its own sub directory, but the design does support socket file + under any sub directory of PluginSockDir. + - A plugin should clean up its own socket upon exiting or when a new instance comes up. A plugin should NOT remove any sockets belonging to other plugins. + - A plugin should make sure it has service ready for any supported service API version listed in the PluginInfo. + - For an example plugin implementation, take a look at example_plugin.go included in this directory. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_handler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_handler.go new file mode 100644 index 00000000..8f9cac5d --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_handler.go @@ -0,0 +1,147 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 pluginwatcher + +import ( + "errors" + "fmt" + "reflect" + "sync" + "time" + + "github.com/golang/glog" + "golang.org/x/net/context" + + v1beta1 "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1" + v1beta2 "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2" +) + +type exampleHandler struct { + SupportedVersions []string + ExpectedNames map[string]int + + eventChans map[string]chan examplePluginEvent // map[pluginName]eventChan + + m sync.Mutex + count int +} + +type examplePluginEvent int + +const ( + exampleEventValidate examplePluginEvent = 0 + exampleEventRegister examplePluginEvent = 1 + exampleEventDeRegister examplePluginEvent = 2 + exampleEventError examplePluginEvent = 3 +) + +// NewExampleHandler provide a example handler +func NewExampleHandler(supportedVersions []string) *exampleHandler { + return &exampleHandler{ + SupportedVersions: supportedVersions, + ExpectedNames: make(map[string]int), + + eventChans: make(map[string]chan examplePluginEvent), + } +} + +func (p *exampleHandler) ValidatePlugin(pluginName string, endpoint string, versions []string) error { + p.SendEvent(pluginName, exampleEventValidate) + + n, ok := p.DecreasePluginCount(pluginName) + if !ok && n > 0 { + return fmt.Errorf("pluginName('%s') wasn't expected (count is %d)", pluginName, n) + } + + if !reflect.DeepEqual(versions, p.SupportedVersions) { + return fmt.Errorf("versions('%v') != supported versions('%v')", versions, p.SupportedVersions) + } + + // this handler expects non-empty endpoint as an example + if len(endpoint) == 0 { + return errors.New("expecting non empty endpoint") + } + + return nil +} + +func (p *exampleHandler) RegisterPlugin(pluginName, endpoint string) error { + p.SendEvent(pluginName, exampleEventRegister) + + // Verifies the grpcServer is ready to serve services. + _, conn, err := dial(endpoint, time.Second) + if err != nil { + return fmt.Errorf("Failed dialing endpoint (%s): %v", endpoint, err) + } + defer conn.Close() + + // The plugin handler should be able to use any listed service API version. + v1beta1Client := v1beta1.NewExampleClient(conn) + v1beta2Client := v1beta2.NewExampleClient(conn) + + // Tests v1beta1 GetExampleInfo + _, err = v1beta1Client.GetExampleInfo(context.Background(), &v1beta1.ExampleRequest{}) + if err != nil { + return fmt.Errorf("Failed GetExampleInfo for v1beta2Client(%s): %v", endpoint, err) + } + + // Tests v1beta1 GetExampleInfo + _, err = v1beta2Client.GetExampleInfo(context.Background(), &v1beta2.ExampleRequest{}) + if err != nil { + return fmt.Errorf("Failed GetExampleInfo for v1beta2Client(%s): %v", endpoint, err) + } + + return nil +} + +func (p *exampleHandler) DeRegisterPlugin(pluginName string) { + p.SendEvent(pluginName, exampleEventDeRegister) +} + +func (p *exampleHandler) EventChan(pluginName string) chan examplePluginEvent { + return p.eventChans[pluginName] +} + +func (p *exampleHandler) SendEvent(pluginName string, event examplePluginEvent) { + glog.V(2).Infof("Sending %v for plugin %s over chan %v", event, pluginName, p.eventChans[pluginName]) + p.eventChans[pluginName] <- event +} + +func (p *exampleHandler) AddPluginName(pluginName string) { + p.m.Lock() + defer p.m.Unlock() + + v, ok := p.ExpectedNames[pluginName] + if !ok { + p.eventChans[pluginName] = make(chan examplePluginEvent) + v = 1 + } + + p.ExpectedNames[pluginName] = v +} + +func (p *exampleHandler) DecreasePluginCount(pluginName string) (old int, ok bool) { + p.m.Lock() + defer p.m.Unlock() + + v, ok := p.ExpectedNames[pluginName] + if !ok { + v = -1 + } + + return v, ok +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin.go index fbca43ac..694b3661 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin.go @@ -17,8 +17,10 @@ limitations under the License. package pluginwatcher import ( + "errors" "fmt" "net" + "os" "sync" "time" @@ -31,17 +33,15 @@ import ( v1beta2 "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2" ) -const ( - PluginName = "example-plugin" - PluginType = "example-plugin-type" -) - // examplePlugin is a sample plugin to work with plugin watcher type examplePlugin struct { grpcServer *grpc.Server wg sync.WaitGroup registrationStatus chan registerapi.RegistrationStatus // for testing endpoint string // for testing + pluginName string + pluginType string + versions []string } type pluginServiceV1Beta1 struct { @@ -76,49 +76,64 @@ func NewExamplePlugin() *examplePlugin { } // NewTestExamplePlugin returns an initialized examplePlugin instance for testing -func NewTestExamplePlugin(endpoint string) *examplePlugin { +func NewTestExamplePlugin(pluginName string, pluginType string, endpoint string, advertisedVersions ...string) *examplePlugin { return &examplePlugin{ - registrationStatus: make(chan registerapi.RegistrationStatus), + pluginName: pluginName, + pluginType: pluginType, endpoint: endpoint, + versions: advertisedVersions, + registrationStatus: make(chan registerapi.RegistrationStatus), } } // GetInfo is the RPC invoked by plugin watcher func (e *examplePlugin) GetInfo(ctx context.Context, req *registerapi.InfoRequest) (*registerapi.PluginInfo, error) { return ®isterapi.PluginInfo{ - Type: PluginType, - Name: PluginName, + Type: e.pluginType, + Name: e.pluginName, Endpoint: e.endpoint, - SupportedVersions: []string{"v1beta1", "v1beta2"}, + SupportedVersions: e.versions, }, nil } func (e *examplePlugin) NotifyRegistrationStatus(ctx context.Context, status *registerapi.RegistrationStatus) (*registerapi.RegistrationStatusResponse, error) { + glog.Errorf("Registration is: %v\n", status) + if e.registrationStatus != nil { e.registrationStatus <- *status } - if !status.PluginRegistered { - glog.Errorf("Registration failed: %s\n", status.Error) - } + return ®isterapi.RegistrationStatusResponse{}, nil } -// Serve starts example plugin grpc server -func (e *examplePlugin) Serve(socketPath string) error { - glog.Infof("starting example server at: %s\n", socketPath) - lis, err := net.Listen("unix", socketPath) +// Serve starts a pluginwatcher server and one or more of the plugin services +func (e *examplePlugin) Serve(services ...string) error { + glog.Infof("starting example server at: %s\n", e.endpoint) + lis, err := net.Listen("unix", e.endpoint) if err != nil { return err } - glog.Infof("example server started at: %s\n", socketPath) + + glog.Infof("example server started at: %s\n", e.endpoint) e.grpcServer = grpc.NewServer() + // Registers kubelet plugin watcher api. registerapi.RegisterRegistrationServer(e.grpcServer, e) - // Registers services for both v1beta1 and v1beta2 versions. - v1beta1 := &pluginServiceV1Beta1{server: e} - v1beta1.RegisterService() - v1beta2 := &pluginServiceV1Beta2{server: e} - v1beta2.RegisterService() + + for _, service := range services { + switch service { + case "v1beta1": + v1beta1 := &pluginServiceV1Beta1{server: e} + v1beta1.RegisterService() + break + case "v1beta2": + v1beta2 := &pluginServiceV1Beta2{server: e} + v1beta2.RegisterService() + break + default: + return fmt.Errorf("Unsupported service: '%s'", service) + } + } // Starts service e.wg.Add(1) @@ -129,22 +144,30 @@ func (e *examplePlugin) Serve(socketPath string) error { glog.Errorf("example server stopped serving: %v", err) } }() + return nil } func (e *examplePlugin) Stop() error { - glog.Infof("Stopping example server\n") + glog.Infof("Stopping example server at: %s\n", e.endpoint) + e.grpcServer.Stop() c := make(chan struct{}) go func() { defer close(c) e.wg.Wait() }() + select { case <-c: - return nil + break case <-time.After(time.Second): - glog.Errorf("Timed out on waiting for stop completion") - return fmt.Errorf("Timed out on waiting for stop completion") + return errors.New("Timed out on waiting for stop completion") } + + if err := os.Remove(e.endpoint); err != nil && !os.IsNotExist(err) { + return err + } + + return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1/BUILD index affbd0ae..c535861b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1/BUILD @@ -1,11 +1,5 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") -filegroup( - name = "go_default_library_protos", - srcs = ["api.proto"], - visibility = ["//visibility:public"], -) - go_library( name = "go_default_library", srcs = ["api.pb.go"], diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2/BUILD index f2b53898..35899728 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2/BUILD @@ -1,11 +1,5 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") -filegroup( - name = "go_default_library_protos", - srcs = ["api.proto"], - visibility = ["//visibility:public"], -) - go_library( name = "go_default_library", srcs = ["api.pb.go"], diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go index 9a5241cb..de2addd2 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/plugin_watcher.go @@ -20,90 +20,211 @@ import ( "fmt" "net" "os" - "path" - "path/filepath" + "strings" "sync" "time" "github.com/fsnotify/fsnotify" "github.com/golang/glog" + "github.com/pkg/errors" "golang.org/x/net/context" "google.golang.org/grpc" + registerapi "k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1" utilfs "k8s.io/kubernetes/pkg/util/filesystem" ) -// RegisterCallbackFn is the type of the callback function that handlers will provide -type RegisterCallbackFn func(pluginName string, endpoint string, versions []string, socketPath string) (error, chan bool) - // Watcher is the plugin watcher type Watcher struct { - path string - handlers map[string]RegisterCallbackFn - stopCh chan interface{} - fs utilfs.Filesystem - watcher *fsnotify.Watcher - wg sync.WaitGroup - mutex sync.Mutex + path string + stopCh chan interface{} + fs utilfs.Filesystem + fsWatcher *fsnotify.Watcher + wg sync.WaitGroup + + mutex sync.Mutex + handlers map[string]PluginHandler + plugins map[string]pathInfo + pluginsPool map[string]map[string]*sync.Mutex // map[pluginType][pluginName] +} + +type pathInfo struct { + pluginType string + pluginName string } // NewWatcher provides a new watcher -func NewWatcher(sockDir string) Watcher { - return Watcher{ - path: sockDir, - handlers: make(map[string]RegisterCallbackFn), - fs: &utilfs.DefaultFs{}, +func NewWatcher(sockDir string) *Watcher { + return &Watcher{ + path: sockDir, + fs: &utilfs.DefaultFs{}, + + handlers: make(map[string]PluginHandler), + plugins: make(map[string]pathInfo), + pluginsPool: make(map[string]map[string]*sync.Mutex), } } -// AddHandler registers a callback to be invoked for a particular type of plugin -func (w *Watcher) AddHandler(handlerType string, handlerCbkFn RegisterCallbackFn) { +func (w *Watcher) AddHandler(pluginType string, handler PluginHandler) { w.mutex.Lock() defer w.mutex.Unlock() - w.handlers[handlerType] = handlerCbkFn + + w.handlers[pluginType] = handler } -// Creates the plugin directory, if it doesn't already exist. -func (w *Watcher) createPluginDir() error { - glog.V(4).Infof("Ensuring Plugin directory at %s ", w.path) - if err := w.fs.MkdirAll(w.path, 0755); err != nil { - return fmt.Errorf("error (re-)creating driver directory: %s", err) - } - return nil +func (w *Watcher) getHandler(pluginType string) (PluginHandler, bool) { + w.mutex.Lock() + defer w.mutex.Unlock() + + h, ok := w.handlers[pluginType] + return h, ok } -// Walks through the plugin directory to discover any existing plugin sockets. -func (w *Watcher) traversePluginDir() error { - files, err := w.fs.ReadDir(w.path) +// Start watches for the creation of plugin sockets at the path +func (w *Watcher) Start() error { + glog.V(2).Infof("Plugin Watcher Start at %s", w.path) + w.stopCh = make(chan interface{}) + + // Creating the directory to be watched if it doesn't exist yet, + // and walks through the directory to discover the existing plugins. + if err := w.init(); err != nil { + return err + } + + fsWatcher, err := fsnotify.NewWatcher() if err != nil { - return fmt.Errorf("error reading the plugin directory: %v", err) + return fmt.Errorf("failed to start plugin fsWatcher, err: %v", err) } - for _, f := range files { - // Currently only supports flat fs namespace under the plugin directory. - // TODO: adds support for hierarchical fs namespace. - if !f.IsDir() && filepath.Base(f.Name())[0] != '.' { - go func(sockName string) { - w.watcher.Events <- fsnotify.Event{ - Name: sockName, - Op: fsnotify.Op(uint32(1)), + w.fsWatcher = fsWatcher + + w.wg.Add(1) + go func(fsWatcher *fsnotify.Watcher) { + defer w.wg.Done() + for { + select { + case event := <-fsWatcher.Events: + //TODO: Handle errors by taking corrective measures + + w.wg.Add(1) + go func() { + defer w.wg.Done() + + if event.Op&fsnotify.Create == fsnotify.Create { + err := w.handleCreateEvent(event) + if err != nil { + glog.Errorf("error %v when handling create event: %s", err, event) + } + } else if event.Op&fsnotify.Remove == fsnotify.Remove { + err := w.handleDeleteEvent(event) + if err != nil { + glog.Errorf("error %v when handling delete event: %s", err, event) + } + } + return + }() + continue + case err := <-fsWatcher.Errors: + if err != nil { + glog.Errorf("fsWatcher received error: %v", err) } - }(path.Join(w.path, f.Name())) + continue + case <-w.stopCh: + return + } } + }(fsWatcher) + + // Traverse plugin dir after starting the plugin processing goroutine + if err := w.traversePluginDir(w.path); err != nil { + w.Stop() + return fmt.Errorf("failed to traverse plugin socket path, err: %v", err) } + + return nil +} + +// Stop stops probing the creation of plugin sockets at the path +func (w *Watcher) Stop() error { + close(w.stopCh) + + c := make(chan struct{}) + go func() { + defer close(c) + w.wg.Wait() + }() + + select { + case <-c: + case <-time.After(11 * time.Second): + return fmt.Errorf("timeout on stopping watcher") + } + + w.fsWatcher.Close() + return nil } func (w *Watcher) init() error { - if err := w.createPluginDir(); err != nil { - return err + glog.V(4).Infof("Ensuring Plugin directory at %s ", w.path) + + if err := w.fs.MkdirAll(w.path, 0755); err != nil { + return fmt.Errorf("error (re-)creating root %s: %v", w.path, err) } + return nil } -func (w *Watcher) registerPlugin(socketPath string) error { +// Walks through the plugin directory discover any existing plugin sockets. +func (w *Watcher) traversePluginDir(dir string) error { + return w.fs.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return fmt.Errorf("error accessing path: %s error: %v", path, err) + } + + switch mode := info.Mode(); { + case mode.IsDir(): + if err := w.fsWatcher.Add(path); err != nil { + return fmt.Errorf("failed to watch %s, err: %v", path, err) + } + case mode&os.ModeSocket != 0: + go func() { + w.fsWatcher.Events <- fsnotify.Event{ + Name: path, + Op: fsnotify.Create, + } + }() + default: + glog.V(5).Infof("Ignoring file %s with mode %v", path, mode) + } + + return nil + }) +} + +// Handle filesystem notify event. +func (w *Watcher) handleCreateEvent(event fsnotify.Event) error { + glog.V(6).Infof("Handling create event: %v", event) + + fi, err := os.Stat(event.Name) + if err != nil { + return fmt.Errorf("stat file %s failed: %v", event.Name, err) + } + + if strings.HasPrefix(fi.Name(), ".") { + glog.Errorf("Ignoring file: %s", fi.Name()) + return nil + } + + if !fi.IsDir() { + return w.handlePluginRegistration(event.Name) + } + + return w.traversePluginDir(event.Name) +} + +func (w *Watcher) handlePluginRegistration(socketPath string) error { //TODO: Implement rate limiting to mitigate any DOS kind of attacks. - glog.V(4).Infof("registerPlugin called for socketPath: %s", socketPath) - client, conn, err := dial(socketPath) + client, conn, err := dial(socketPath, 10*time.Second) if err != nil { return fmt.Errorf("dial failed at socket %s, err: %v", socketPath, err) } @@ -111,142 +232,163 @@ func (w *Watcher) registerPlugin(socketPath string) error { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() + infoResp, err := client.GetInfo(ctx, ®isterapi.InfoRequest{}) if err != nil { return fmt.Errorf("failed to get plugin info using RPC GetInfo at socket %s, err: %v", socketPath, err) } - if err := w.invokeRegistrationCallbackAtHandler(ctx, client, infoResp, socketPath); err != nil { - return fmt.Errorf("failed to register plugin. Callback handler returned err: %v", err) - } - glog.V(4).Infof("Successfully registered plugin for plugin type: %s, name: %s, socket: %s", infoResp.Type, infoResp.Name, socketPath) - return nil -} -func (w *Watcher) invokeRegistrationCallbackAtHandler(ctx context.Context, client registerapi.RegistrationClient, infoResp *registerapi.PluginInfo, socketPath string) error { - var handlerCbkFn RegisterCallbackFn - var ok bool - handlerCbkFn, ok = w.handlers[infoResp.Type] + handler, ok := w.handlers[infoResp.Type] if !ok { - if _, err := client.NotifyRegistrationStatus(ctx, ®isterapi.RegistrationStatus{ - PluginRegistered: false, - Error: fmt.Sprintf("No handler found registered for plugin type: %s, socket: %s", infoResp.Type, socketPath), - }); err != nil { - glog.Errorf("Failed to send registration status at socket %s, err: %v", socketPath, err) - } - return fmt.Errorf("no handler found registered for plugin type: %s, socket: %s", infoResp.Type, socketPath) + return w.notifyPlugin(client, false, fmt.Sprintf("no handler registered for plugin type: %s at socket %s", infoResp.Type, socketPath)) } - var versions []string - for _, version := range infoResp.SupportedVersions { - versions = append(versions, version) + // ReRegistration: We want to handle multiple plugins registering at the same time with the same name sequentially. + // See the state machine for more information. + // This is done by using a Lock for each plugin with the same name and type + pool := w.getPluginPool(infoResp.Type, infoResp.Name) + + pool.Lock() + defer pool.Unlock() + + if infoResp.Endpoint == "" { + infoResp.Endpoint = socketPath } + // calls handler callback to verify registration request - err, chanForAckOfNotification := handlerCbkFn(infoResp.Name, infoResp.Endpoint, versions, socketPath) - if err != nil { - if _, err := client.NotifyRegistrationStatus(ctx, ®isterapi.RegistrationStatus{ - PluginRegistered: false, - Error: fmt.Sprintf("Plugin registration failed with err: %v", err), - }); err != nil { - glog.Errorf("Failed to send registration status at socket %s, err: %v", socketPath, err) - } - chanForAckOfNotification <- false - return fmt.Errorf("plugin registration failed with err: %v", err) + if err := handler.ValidatePlugin(infoResp.Name, infoResp.Endpoint, infoResp.SupportedVersions); err != nil { + return w.notifyPlugin(client, false, fmt.Sprintf("plugin validation failed with err: %v", err)) + } + + // We add the plugin to the pluginwatcher's map before calling a plugin consumer's Register handle + // so that if we receive a delete event during Register Plugin, we can process it as a DeRegister call. + w.registerPlugin(socketPath, infoResp.Type, infoResp.Name) + + if err := handler.RegisterPlugin(infoResp.Name, infoResp.Endpoint); err != nil { + return w.notifyPlugin(client, false, fmt.Sprintf("plugin registration failed with err: %v", err)) } - if _, err := client.NotifyRegistrationStatus(ctx, ®isterapi.RegistrationStatus{ - PluginRegistered: true, - }); err != nil { + // Notify is called after register to guarantee that even if notify throws an error Register will always be called after validate + if err := w.notifyPlugin(client, true, ""); err != nil { return fmt.Errorf("failed to send registration status at socket %s, err: %v", socketPath, err) } - chanForAckOfNotification <- true + return nil } -// Start watches for the creation of plugin sockets at the path -func (w *Watcher) Start() error { - glog.V(2).Infof("Plugin Watcher Start at %s", w.path) - w.stopCh = make(chan interface{}) +func (w *Watcher) handleDeleteEvent(event fsnotify.Event) error { + glog.V(6).Infof("Handling delete event: %v", event) - // Creating the directory to be watched if it doesn't exist yet, - // and walks through the directory to discover the existing plugins. - if err := w.init(); err != nil { - return err + plugin, ok := w.getPlugin(event.Name) + if !ok { + return fmt.Errorf("could not find plugin for deleted file %s", event.Name) } - watcher, err := fsnotify.NewWatcher() - if err != nil { - return fmt.Errorf("failed to start plugin watcher, err: %v", err) + // You should not get a Deregister call while registering a plugin + pool := w.getPluginPool(plugin.pluginType, plugin.pluginName) + + pool.Lock() + defer pool.Unlock() + + // ReRegisteration: When waiting for the lock a plugin with the same name (not socketPath) could have registered + // In that case, we don't want to issue a DeRegister call for that plugin + // When ReRegistering, the new plugin will have removed the current mapping (map[socketPath] = plugin) and replaced + // it with it's own socketPath. + if _, ok = w.getPlugin(event.Name); !ok { + glog.V(2).Infof("A newer plugin watcher has been registered for plugin %v, dropping DeRegister call", plugin) + return nil } - if err := watcher.Add(w.path); err != nil { - watcher.Close() - return fmt.Errorf("failed to start plugin watcher, err: %v", err) + h, ok := w.getHandler(plugin.pluginType) + if !ok { + return fmt.Errorf("could not find handler %s for plugin %s at path %s", plugin.pluginType, plugin.pluginName, event.Name) } - w.watcher = watcher + glog.V(2).Infof("DeRegistering plugin %v at path %s", plugin, event.Name) + w.deRegisterPlugin(event.Name, plugin.pluginType, plugin.pluginName) + h.DeRegisterPlugin(plugin.pluginName) - if err := w.traversePluginDir(); err != nil { - watcher.Close() - return fmt.Errorf("failed to traverse plugin socket path, err: %v", err) - } + return nil +} - w.wg.Add(1) - go func(watcher *fsnotify.Watcher) { - defer w.wg.Done() - for { - select { - case event := <-watcher.Events: - if event.Op&fsnotify.Create == fsnotify.Create { - go func(eventName string) { - err := w.registerPlugin(eventName) - if err != nil { - glog.Errorf("Plugin %s registration failed with error: %v", eventName, err) - } - }(event.Name) - } - continue - case err := <-watcher.Errors: - //TODO: Handle errors by taking corrective measures - if err != nil { - glog.Errorf("Watcher received error: %v", err) - } - continue +func (w *Watcher) registerPlugin(socketPath, pluginType, pluginName string) { + w.mutex.Lock() + defer w.mutex.Unlock() - case <-w.stopCh: - watcher.Close() - break - } - break + // Reregistration case, if this plugin is already in the map, remove it + // This will prevent handleDeleteEvent to issue a DeRegister call + for path, info := range w.plugins { + if info.pluginType != pluginType || info.pluginName != pluginName { + continue } - }(watcher) - return nil + + delete(w.plugins, path) + break + } + + w.plugins[socketPath] = pathInfo{ + pluginType: pluginType, + pluginName: pluginName, + } } -// Stop stops probing the creation of plugin sockets at the path -func (w *Watcher) Stop() error { - close(w.stopCh) - c := make(chan struct{}) - go func() { - defer close(c) - w.wg.Wait() - }() - select { - case <-c: - case <-time.After(10 * time.Second): - return fmt.Errorf("timeout on stopping watcher") +func (w *Watcher) deRegisterPlugin(socketPath, pluginType, pluginName string) { + w.mutex.Lock() + defer w.mutex.Unlock() + + delete(w.plugins, socketPath) + delete(w.pluginsPool[pluginType], pluginName) +} + +func (w *Watcher) getPlugin(socketPath string) (pathInfo, bool) { + w.mutex.Lock() + defer w.mutex.Unlock() + + plugin, ok := w.plugins[socketPath] + return plugin, ok +} + +func (w *Watcher) getPluginPool(pluginType, pluginName string) *sync.Mutex { + w.mutex.Lock() + defer w.mutex.Unlock() + + if _, ok := w.pluginsPool[pluginType]; !ok { + w.pluginsPool[pluginType] = make(map[string]*sync.Mutex) } - return nil + + if _, ok := w.pluginsPool[pluginType][pluginName]; !ok { + w.pluginsPool[pluginType][pluginName] = &sync.Mutex{} + } + + return w.pluginsPool[pluginType][pluginName] } -// Cleanup cleans the path by removing sockets -func (w *Watcher) Cleanup() error { - return os.RemoveAll(w.path) +func (w *Watcher) notifyPlugin(client registerapi.RegistrationClient, registered bool, errStr string) error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + status := ®isterapi.RegistrationStatus{ + PluginRegistered: registered, + Error: errStr, + } + + if _, err := client.NotifyRegistrationStatus(ctx, status); err != nil { + return errors.Wrap(err, errStr) + } + + if errStr != "" { + return errors.New(errStr) + } + + return nil } // Dial establishes the gRPC communication with the picked up plugin socket. https://godoc.org/google.golang.org/grpc#Dial -func dial(unixSocketPath string) (registerapi.RegistrationClient, *grpc.ClientConn, error) { - c, err := grpc.Dial(unixSocketPath, grpc.WithInsecure(), grpc.WithBlock(), - grpc.WithTimeout(10*time.Second), +func dial(unixSocketPath string, timeout time.Duration) (registerapi.RegistrationClient, *grpc.ClientConn, error) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + c, err := grpc.DialContext(ctx, unixSocketPath, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { return net.DialTimeout("unix", addr, timeout) }), diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/types.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/types.go new file mode 100644 index 00000000..f37ed241 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/types.go @@ -0,0 +1,59 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 pluginwatcher + +// PluginHandler is an interface a client of the pluginwatcher API needs to implement in +// order to consume plugins +// The PluginHandler follows the simple following state machine: +// +// +--------------------------------------+ +// | ReRegistration | +// | Socket created with same plugin name | +// | | +// | | +// Socket Created v + Socket Deleted +// +------------------> Validate +---------------------------> Register +------------------> DeRegister +// + + + +// | | | +// | Error | Error | +// | | | +// v v v +// Out Out Out +// +// The pluginwatcher module follows strictly and sequentially this state machine for each *plugin name*. +// e.g: If you are Registering a plugin foo, you cannot get a DeRegister call for plugin foo +// until the Register("foo") call returns. Nor will you get a Validate("foo", "Different endpoint", ...) +// call until the Register("foo") call returns. +// +// ReRegistration: Socket created with same plugin name, usually for a plugin update +// e.g: plugin with name foo registers at foo.com/foo-1.9.7 later a plugin with name foo +// registers at foo.com/foo-1.9.9 +// +// DeRegistration: When ReRegistration happens only the deletion of the new socket will trigger a DeRegister call + +type PluginHandler interface { + // Validate returns an error if the information provided by + // the potential plugin is erroneous (unsupported version, ...) + ValidatePlugin(pluginName string, endpoint string, versions []string) error + // RegisterPlugin is called so that the plugin can be register by any + // plugin consumer + // Error encountered here can still be Notified to the plugin. + RegisterPlugin(pluginName, endpoint string) error + // DeRegister is called once the pluginwatcher observes that the socket has + // been deleted. + DeRegisterPlugin(pluginName string) +} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD deleted file mode 100644 index 8384901f..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["work_queue.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/util/queue", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["work_queue_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/work_queue.go b/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/work_queue.go deleted file mode 100644 index 4075562f..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/queue/work_queue.go +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 queue - -import ( - "sync" - "time" - - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/clock" -) - -// WorkQueue allows queuing items with a timestamp. An item is -// considered ready to process if the timestamp has expired. -type WorkQueue interface { - // GetWork dequeues and returns all ready items. - GetWork() []types.UID - // Enqueue inserts a new item or overwrites an existing item. - Enqueue(item types.UID, delay time.Duration) -} - -type basicWorkQueue struct { - clock clock.Clock - lock sync.Mutex - queue map[types.UID]time.Time -} - -var _ WorkQueue = &basicWorkQueue{} - -func NewBasicWorkQueue(clock clock.Clock) WorkQueue { - queue := make(map[types.UID]time.Time) - return &basicWorkQueue{queue: queue, clock: clock} -} - -func (q *basicWorkQueue) GetWork() []types.UID { - q.lock.Lock() - defer q.lock.Unlock() - now := q.clock.Now() - var items []types.UID - for k, v := range q.queue { - if v.Before(now) { - items = append(items, k) - delete(q.queue, k) - } - } - return items -} - -func (q *basicWorkQueue) Enqueue(item types.UID, delay time.Duration) { - q.lock.Lock() - defer q.lock.Unlock() - q.queue[item] = q.clock.Now().Add(delay) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD index 7f9c3e61..053eeddf 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/util/sliceutils/BUILD @@ -12,7 +12,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/kubelet/util/sliceutils", deps = [ "//pkg/kubelet/container:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", ], ) @@ -35,7 +35,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubelet/container:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go deleted file mode 100644 index 1d8bfcc9..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volume_host.go +++ /dev/null @@ -1,272 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 kubelet - -import ( - "fmt" - "net" - "runtime" - - "github.com/golang/glog" - - authenticationv1 "k8s.io/api/authentication/v1" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - utilfeature "k8s.io/apiserver/pkg/util/feature" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/record" - "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/kubelet/configmap" - "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/mountpod" - "k8s.io/kubernetes/pkg/kubelet/secret" - "k8s.io/kubernetes/pkg/kubelet/token" - "k8s.io/kubernetes/pkg/util/io" - "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" -) - -// NewInitializedVolumePluginMgr returns a new instance of -// volume.VolumePluginMgr initialized with kubelets implementation of the -// volume.VolumeHost interface. -// -// kubelet - used by VolumeHost methods to expose kubelet specific parameters -// plugins - used to initialize volumePluginMgr -func NewInitializedVolumePluginMgr( - kubelet *Kubelet, - secretManager secret.Manager, - configMapManager configmap.Manager, - tokenManager *token.Manager, - plugins []volume.VolumePlugin, - prober volume.DynamicPluginProber) (*volume.VolumePluginMgr, error) { - - mountPodManager, err := mountpod.NewManager(kubelet.getRootDir(), kubelet.podManager) - if err != nil { - return nil, err - } - kvh := &kubeletVolumeHost{ - kubelet: kubelet, - volumePluginMgr: volume.VolumePluginMgr{}, - secretManager: secretManager, - configMapManager: configMapManager, - tokenManager: tokenManager, - mountPodManager: mountPodManager, - } - - if err := kvh.volumePluginMgr.InitPlugins(plugins, prober, kvh); err != nil { - return nil, fmt.Errorf( - "Could not initialize volume plugins for KubeletVolumePluginMgr: %v", - err) - } - - return &kvh.volumePluginMgr, nil -} - -// Compile-time check to ensure kubeletVolumeHost implements the VolumeHost interface -var _ volume.VolumeHost = &kubeletVolumeHost{} - -func (kvh *kubeletVolumeHost) GetPluginDir(pluginName string) string { - return kvh.kubelet.getPluginDir(pluginName) -} - -type kubeletVolumeHost struct { - kubelet *Kubelet - volumePluginMgr volume.VolumePluginMgr - secretManager secret.Manager - tokenManager *token.Manager - configMapManager configmap.Manager - mountPodManager mountpod.Manager -} - -func (kvh *kubeletVolumeHost) GetVolumeDevicePluginDir(pluginName string) string { - return kvh.kubelet.getVolumeDevicePluginDir(pluginName) -} - -func (kvh *kubeletVolumeHost) GetPodsDir() string { - return kvh.kubelet.getPodsDir() -} - -func (kvh *kubeletVolumeHost) GetPodVolumeDir(podUID types.UID, pluginName string, volumeName string) string { - dir := kvh.kubelet.getPodVolumeDir(podUID, pluginName, volumeName) - if runtime.GOOS == "windows" { - dir = util.GetWindowsPath(dir) - } - return dir -} - -func (kvh *kubeletVolumeHost) GetPodVolumeDeviceDir(podUID types.UID, pluginName string) string { - return kvh.kubelet.getPodVolumeDeviceDir(podUID, pluginName) -} - -func (kvh *kubeletVolumeHost) GetPodPluginDir(podUID types.UID, pluginName string) string { - return kvh.kubelet.getPodPluginDir(podUID, pluginName) -} - -func (kvh *kubeletVolumeHost) GetKubeClient() clientset.Interface { - return kvh.kubelet.kubeClient -} - -func (kvh *kubeletVolumeHost) NewWrapperMounter( - volName string, - spec volume.Spec, - pod *v1.Pod, - opts volume.VolumeOptions) (volume.Mounter, error) { - // The name of wrapper volume is set to "wrapped_{wrapped_volume_name}" - wrapperVolumeName := "wrapped_" + volName - if spec.Volume != nil { - spec.Volume.Name = wrapperVolumeName - } - - return kvh.kubelet.newVolumeMounterFromPlugins(&spec, pod, opts) -} - -func (kvh *kubeletVolumeHost) NewWrapperUnmounter(volName string, spec volume.Spec, podUID types.UID) (volume.Unmounter, error) { - // The name of wrapper volume is set to "wrapped_{wrapped_volume_name}" - wrapperVolumeName := "wrapped_" + volName - if spec.Volume != nil { - spec.Volume.Name = wrapperVolumeName - } - - plugin, err := kvh.kubelet.volumePluginMgr.FindPluginBySpec(&spec) - if err != nil { - return nil, err - } - - return plugin.NewUnmounter(spec.Name(), podUID) -} - -func (kvh *kubeletVolumeHost) GetCloudProvider() cloudprovider.Interface { - return kvh.kubelet.cloud -} - -func (kvh *kubeletVolumeHost) GetMounter(pluginName string) mount.Interface { - exec, err := kvh.getMountExec(pluginName) - if err != nil { - glog.V(2).Infof("Error finding mount pod for plugin %s: %s", pluginName, err.Error()) - // Use the default mounter - exec = nil - } - if exec == nil { - return kvh.kubelet.mounter - } - return mount.NewExecMounter(exec, kvh.kubelet.mounter) -} - -func (kvh *kubeletVolumeHost) GetWriter() io.Writer { - return kvh.kubelet.writer -} - -func (kvh *kubeletVolumeHost) GetHostName() string { - return kvh.kubelet.hostname -} - -func (kvh *kubeletVolumeHost) GetHostIP() (net.IP, error) { - return kvh.kubelet.GetHostIP() -} - -func (kvh *kubeletVolumeHost) GetNodeAllocatable() (v1.ResourceList, error) { - node, err := kvh.kubelet.getNodeAnyWay() - if err != nil { - return nil, fmt.Errorf("error retrieving node: %v", err) - } - return node.Status.Allocatable, nil -} - -func (kvh *kubeletVolumeHost) GetSecretFunc() func(namespace, name string) (*v1.Secret, error) { - return kvh.secretManager.GetSecret -} - -func (kvh *kubeletVolumeHost) GetConfigMapFunc() func(namespace, name string) (*v1.ConfigMap, error) { - return kvh.configMapManager.GetConfigMap -} - -func (kvh *kubeletVolumeHost) GetServiceAccountTokenFunc() func(namespace, name string, tr *authenticationv1.TokenRequest) (*authenticationv1.TokenRequest, error) { - return kvh.tokenManager.GetServiceAccountToken -} - -func (kvh *kubeletVolumeHost) GetNodeLabels() (map[string]string, error) { - node, err := kvh.kubelet.GetNode() - if err != nil { - return nil, fmt.Errorf("error retrieving node: %v", err) - } - return node.Labels, nil -} - -func (kvh *kubeletVolumeHost) GetNodeName() types.NodeName { - return kvh.kubelet.nodeName -} - -func (kvh *kubeletVolumeHost) GetEventRecorder() record.EventRecorder { - return kvh.kubelet.recorder -} - -func (kvh *kubeletVolumeHost) GetExec(pluginName string) mount.Exec { - exec, err := kvh.getMountExec(pluginName) - if err != nil { - glog.V(2).Infof("Error finding mount pod for plugin %s: %s", pluginName, err.Error()) - // Use the default exec - exec = nil - } - if exec == nil { - return mount.NewOsExec() - } - return exec -} - -// getMountExec returns mount.Exec implementation that leads to pod with mount -// utilities. It returns nil,nil when there is no such pod and default mounter / -// os.Exec should be used. -func (kvh *kubeletVolumeHost) getMountExec(pluginName string) (mount.Exec, error) { - if !utilfeature.DefaultFeatureGate.Enabled(features.MountContainers) { - glog.V(5).Infof("using default mounter/exec for %s", pluginName) - return nil, nil - } - - pod, container, err := kvh.mountPodManager.GetMountPod(pluginName) - if err != nil { - return nil, err - } - if pod == nil { - // Use default mounter/exec for this plugin - glog.V(5).Infof("using default mounter/exec for %s", pluginName) - return nil, nil - } - glog.V(5).Infof("using container %s/%s/%s to execute mount utilites for %s", pod.Namespace, pod.Name, container, pluginName) - return &containerExec{ - pod: pod, - containerName: container, - kl: kvh.kubelet, - }, nil -} - -// containerExec is implementation of mount.Exec that executes commands in given -// container in given pod. -type containerExec struct { - pod *v1.Pod - containerName string - kl *Kubelet -} - -var _ mount.Exec = &containerExec{} - -func (e *containerExec) Run(cmd string, args ...string) ([]byte, error) { - cmdline := append([]string{cmd}, args...) - glog.V(5).Infof("Exec mounter running in pod %s/%s/%s: %v", e.pod.Namespace, e.pod.Name, e.containerName, cmdline) - return e.kl.RunInContainer(container.GetPodFullName(e.pod), e.pod.UID, e.containerName, cmdline) -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD deleted file mode 100644 index 3f9d35d4..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/BUILD +++ /dev/null @@ -1,83 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["volume_manager.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager", - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/kubelet/volumemanager/populator:go_default_library", - "//pkg/kubelet/volumemanager/reconciler:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["volume_manager_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/kubelet/volumemanager/cache:all-srcs", - "//pkg/kubelet/volumemanager/populator:all-srcs", - "//pkg/kubelet/volumemanager/reconciler:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS deleted file mode 100644 index 0f0dc72d..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/OWNERS +++ /dev/null @@ -1,10 +0,0 @@ -approvers: -- saad-ali -reviewers: -- jsafrane -- gnufied -- rootfs -- jingxu97 -- msau42 -- verult -- davidz627 diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD deleted file mode 100644 index c79fad51..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/BUILD +++ /dev/null @@ -1,57 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "actual_state_of_world.go", - "desired_state_of_world.go", - ], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache", - deps = [ - "//pkg/features:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "actual_state_of_world_test.go", - "desired_state_of_world_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go deleted file mode 100644 index 82aef86c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/actual_state_of_world.go +++ /dev/null @@ -1,850 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 cache implements data structures used by the kubelet volume manager to -keep track of attached volumes and the pods that mounted them. -*/ -package cache - -import ( - "fmt" - "sync" - - "github.com/golang/glog" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/kubernetes/pkg/volume/util/operationexecutor" - volumetypes "k8s.io/kubernetes/pkg/volume/util/types" -) - -// ActualStateOfWorld defines a set of thread-safe operations for the kubelet -// volume manager's actual state of the world cache. -// This cache contains volumes->pods i.e. a set of all volumes attached to this -// node and the pods that the manager believes have successfully mounted the -// volume. -// Note: This is distinct from the ActualStateOfWorld implemented by the -// attach/detach controller. They both keep track of different objects. This -// contains kubelet volume manager specific state. -type ActualStateOfWorld interface { - // ActualStateOfWorld must implement the methods required to allow - // operationexecutor to interact with it. - operationexecutor.ActualStateOfWorldMounterUpdater - - // ActualStateOfWorld must implement the methods required to allow - // operationexecutor to interact with it. - operationexecutor.ActualStateOfWorldAttacherUpdater - - // AddPodToVolume adds the given pod to the given volume in the cache - // indicating the specified volume has been successfully mounted to the - // specified pod. - // If a pod with the same unique name already exists under the specified - // volume, reset the pod's remountRequired value. - // If a volume with the name volumeName does not exist in the list of - // attached volumes, an error is returned. - AddPodToVolume(podName volumetypes.UniquePodName, podUID types.UID, volumeName v1.UniqueVolumeName, mounter volume.Mounter, blockVolumeMapper volume.BlockVolumeMapper, outerVolumeSpecName string, volumeGidValue string, volumeSpec *volume.Spec) error - - // MarkRemountRequired marks each volume that is successfully attached and - // mounted for the specified pod as requiring remount (if the plugin for the - // volume indicates it requires remounting on pod updates). Atomically - // updating volumes depend on this to update the contents of the volume on - // pod update. - MarkRemountRequired(podName volumetypes.UniquePodName) - - // SetVolumeGloballyMounted sets the GloballyMounted value for the given - // volume. When set to true this value indicates that the volume is mounted - // to the underlying device at a global mount point. This global mount point - // must unmounted prior to detach. - // If a volume with the name volumeName does not exist in the list of - // attached volumes, an error is returned. - SetVolumeGloballyMounted(volumeName v1.UniqueVolumeName, globallyMounted bool, devicePath, deviceMountPath string) error - - // DeletePodFromVolume removes the given pod from the given volume in the - // cache indicating the volume has been successfully unmounted from the pod. - // If a pod with the same unique name does not exist under the specified - // volume, this is a no-op. - // If a volume with the name volumeName does not exist in the list of - // attached volumes, an error is returned. - DeletePodFromVolume(podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error - - // DeleteVolume removes the given volume from the list of attached volumes - // in the cache indicating the volume has been successfully detached from - // this node. - // If a volume with the name volumeName does not exist in the list of - // attached volumes, this is a no-op. - // If a volume with the name volumeName exists and its list of mountedPods - // is not empty, an error is returned. - DeleteVolume(volumeName v1.UniqueVolumeName) error - - // PodExistsInVolume returns true if the given pod exists in the list of - // mountedPods for the given volume in the cache, indicating that the volume - // is attached to this node and the pod has successfully mounted it. - // If a pod with the same unique name does not exist under the specified - // volume, false is returned. - // If a volume with the name volumeName does not exist in the list of - // attached volumes, a volumeNotAttachedError is returned indicating the - // given volume is not yet attached. - // If the given volumeName/podName combo exists but the value of - // remountRequired is true, a remountRequiredError is returned indicating - // the given volume has been successfully mounted to this pod but should be - // remounted to reflect changes in the referencing pod. Atomically updating - // volumes, depend on this to update the contents of the volume. - // All volume mounting calls should be idempotent so a second mount call for - // volumes that do not need to update contents should not fail. - PodExistsInVolume(podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) (bool, string, error) - - // VolumeExistsWithSpecName returns true if the given volume specified with the - // volume spec name (a.k.a., InnerVolumeSpecName) exists in the list of - // volumes that should be attached to this node. - // If a pod with the same name does not exist under the specified - // volume, false is returned. - VolumeExistsWithSpecName(podName volumetypes.UniquePodName, volumeSpecName string) bool - - // VolumeExists returns true if the given volume exists in the list of - // attached volumes in the cache, indicating the volume is attached to this - // node. - VolumeExists(volumeName v1.UniqueVolumeName) bool - - // GetMountedVolumes generates and returns a list of volumes and the pods - // they are successfully attached and mounted for based on the current - // actual state of the world. - GetMountedVolumes() []MountedVolume - - // GetMountedVolumesForPod generates and returns a list of volumes that are - // successfully attached and mounted for the specified pod based on the - // current actual state of the world. - GetMountedVolumesForPod(podName volumetypes.UniquePodName) []MountedVolume - - // GetGloballyMountedVolumes generates and returns a list of all attached - // volumes that are globally mounted. This list can be used to determine - // which volumes should be reported as "in use" in the node's VolumesInUse - // status field. Globally mounted here refers to the shared plugin mount - // point for the attachable volume from which the pod specific mount points - // are created (via bind mount). - GetGloballyMountedVolumes() []AttachedVolume - - // GetUnmountedVolumes generates and returns a list of attached volumes that - // have no mountedPods. This list can be used to determine which volumes are - // no longer referenced and may be globally unmounted and detached. - GetUnmountedVolumes() []AttachedVolume - - // GetPods generates and returns a map of pods in which map is indexed - // with pod's unique name. This map can be used to determine which pod is currently - // in actual state of world. - GetPods() map[volumetypes.UniquePodName]bool - - // MarkFSResizeRequired marks each volume that is successfully attached and - // mounted for the specified pod as requiring file system resize (if the plugin for the - // volume indicates it requires file system resize). - MarkFSResizeRequired(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) -} - -// MountedVolume represents a volume that has successfully been mounted to a pod. -type MountedVolume struct { - operationexecutor.MountedVolume -} - -// AttachedVolume represents a volume that is attached to a node. -type AttachedVolume struct { - operationexecutor.AttachedVolume - - // GloballyMounted indicates that the volume is mounted to the underlying - // device at a global mount point. This global mount point must unmounted - // prior to detach. - GloballyMounted bool -} - -// NewActualStateOfWorld returns a new instance of ActualStateOfWorld. -func NewActualStateOfWorld( - nodeName types.NodeName, - volumePluginMgr *volume.VolumePluginMgr) ActualStateOfWorld { - return &actualStateOfWorld{ - nodeName: nodeName, - attachedVolumes: make(map[v1.UniqueVolumeName]attachedVolume), - volumePluginMgr: volumePluginMgr, - } -} - -// IsVolumeNotAttachedError returns true if the specified error is a -// volumeNotAttachedError. -func IsVolumeNotAttachedError(err error) bool { - _, ok := err.(volumeNotAttachedError) - return ok -} - -// IsRemountRequiredError returns true if the specified error is a -// remountRequiredError. -func IsRemountRequiredError(err error) bool { - _, ok := err.(remountRequiredError) - return ok -} - -type actualStateOfWorld struct { - // nodeName is the name of this node. This value is passed to Attach/Detach - nodeName types.NodeName - - // attachedVolumes is a map containing the set of volumes the kubelet volume - // manager believes to be successfully attached to this node. Volume types - // that do not implement an attacher interface are assumed to be in this - // state by default. - // The key in this map is the name of the volume and the value is an object - // containing more information about the attached volume. - attachedVolumes map[v1.UniqueVolumeName]attachedVolume - - // volumePluginMgr is the volume plugin manager used to create volume - // plugin objects. - volumePluginMgr *volume.VolumePluginMgr - sync.RWMutex -} - -// attachedVolume represents a volume the kubelet volume manager believes to be -// successfully attached to a node it is managing. Volume types that do not -// implement an attacher are assumed to be in this state. -type attachedVolume struct { - // volumeName contains the unique identifier for this volume. - volumeName v1.UniqueVolumeName - - // mountedPods is a map containing the set of pods that this volume has been - // successfully mounted to. The key in this map is the name of the pod and - // the value is a mountedPod object containing more information about the - // pod. - mountedPods map[volumetypes.UniquePodName]mountedPod - - // spec is the volume spec containing the specification for this volume. - // Used to generate the volume plugin object, and passed to plugin methods. - // In particular, the Unmount method uses spec.Name() as the volumeSpecName - // in the mount path: - // /var/lib/kubelet/pods/{podUID}/volumes/{escapeQualifiedPluginName}/{volumeSpecName}/ - spec *volume.Spec - - // pluginName is the Unescaped Qualified name of the volume plugin used to - // attach and mount this volume. It is stored separately in case the full - // volume spec (everything except the name) can not be reconstructed for a - // volume that should be unmounted (which would be the case for a mount path - // read from disk without a full volume spec). - pluginName string - - // pluginIsAttachable indicates the volume plugin used to attach and mount - // this volume implements the volume.Attacher interface - pluginIsAttachable bool - - // globallyMounted indicates that the volume is mounted to the underlying - // device at a global mount point. This global mount point must be unmounted - // prior to detach. - globallyMounted bool - - // devicePath contains the path on the node where the volume is attached for - // attachable volumes - devicePath string - - // deviceMountPath contains the path on the node where the device should - // be mounted after it is attached. - deviceMountPath string -} - -// The mountedPod object represents a pod for which the kubelet volume manager -// believes the underlying volume has been successfully been mounted. -type mountedPod struct { - // the name of the pod - podName volumetypes.UniquePodName - - // the UID of the pod - podUID types.UID - - // mounter used to mount - mounter volume.Mounter - - // mapper used to block volumes support - blockVolumeMapper volume.BlockVolumeMapper - - // spec is the volume spec containing the specification for this volume. - // Used to generate the volume plugin object, and passed to plugin methods. - // In particular, the Unmount method uses spec.Name() as the volumeSpecName - // in the mount path: - // /var/lib/kubelet/pods/{podUID}/volumes/{escapeQualifiedPluginName}/{volumeSpecName}/ - volumeSpec *volume.Spec - - // outerVolumeSpecName is the volume.Spec.Name() of the volume as referenced - // directly in the pod. If the volume was referenced through a persistent - // volume claim, this contains the volume.Spec.Name() of the persistent - // volume claim - outerVolumeSpecName string - - // remountRequired indicates the underlying volume has been successfully - // mounted to this pod but it should be remounted to reflect changes in the - // referencing pod. - // Atomically updating volumes depend on this to update the contents of the - // volume. All volume mounting calls should be idempotent so a second mount - // call for volumes that do not need to update contents should not fail. - remountRequired bool - - // volumeGidValue contains the value of the GID annotation, if present. - volumeGidValue string - - // fsResizeRequired indicates the underlying volume has been successfully - // mounted to this pod but its size has been expanded after that. - fsResizeRequired bool -} - -func (asw *actualStateOfWorld) MarkVolumeAsAttached( - volumeName v1.UniqueVolumeName, volumeSpec *volume.Spec, _ types.NodeName, devicePath string) error { - return asw.addVolume(volumeName, volumeSpec, devicePath) -} - -func (asw *actualStateOfWorld) MarkVolumeAsDetached( - volumeName v1.UniqueVolumeName, nodeName types.NodeName) { - asw.DeleteVolume(volumeName) -} - -func (asw *actualStateOfWorld) MarkVolumeAsMounted( - podName volumetypes.UniquePodName, - podUID types.UID, - volumeName v1.UniqueVolumeName, - mounter volume.Mounter, - blockVolumeMapper volume.BlockVolumeMapper, - outerVolumeSpecName string, - volumeGidValue string, - volumeSpec *volume.Spec) error { - return asw.AddPodToVolume( - podName, - podUID, - volumeName, - mounter, - blockVolumeMapper, - outerVolumeSpecName, - volumeGidValue, - volumeSpec) -} - -func (asw *actualStateOfWorld) AddVolumeToReportAsAttached(volumeName v1.UniqueVolumeName, nodeName types.NodeName) { - // no operation for kubelet side -} - -func (asw *actualStateOfWorld) RemoveVolumeFromReportAsAttached(volumeName v1.UniqueVolumeName, nodeName types.NodeName) error { - // no operation for kubelet side - return nil -} - -func (asw *actualStateOfWorld) MarkVolumeAsUnmounted( - podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error { - return asw.DeletePodFromVolume(podName, volumeName) -} - -func (asw *actualStateOfWorld) MarkDeviceAsMounted( - volumeName v1.UniqueVolumeName, devicePath, deviceMountPath string) error { - return asw.SetVolumeGloballyMounted(volumeName, true /* globallyMounted */, devicePath, deviceMountPath) -} - -func (asw *actualStateOfWorld) MarkDeviceAsUnmounted( - volumeName v1.UniqueVolumeName) error { - return asw.SetVolumeGloballyMounted(volumeName, false /* globallyMounted */, "", "") -} - -// addVolume adds the given volume to the cache indicating the specified -// volume is attached to this node. If no volume name is supplied, a unique -// volume name is generated from the volumeSpec and returned on success. If a -// volume with the same generated name already exists, this is a noop. If no -// volume plugin can support the given volumeSpec or more than one plugin can -// support it, an error is returned. -func (asw *actualStateOfWorld) addVolume( - volumeName v1.UniqueVolumeName, volumeSpec *volume.Spec, devicePath string) error { - asw.Lock() - defer asw.Unlock() - - volumePlugin, err := asw.volumePluginMgr.FindPluginBySpec(volumeSpec) - if err != nil || volumePlugin == nil { - return fmt.Errorf( - "failed to get Plugin from volumeSpec for volume %q err=%v", - volumeSpec.Name(), - err) - } - - if len(volumeName) == 0 { - volumeName, err = util.GetUniqueVolumeNameFromSpec(volumePlugin, volumeSpec) - if err != nil { - return fmt.Errorf( - "failed to GetUniqueVolumeNameFromSpec for volumeSpec %q using volume plugin %q err=%v", - volumeSpec.Name(), - volumePlugin.GetPluginName(), - err) - } - } - - pluginIsAttachable := false - if _, ok := volumePlugin.(volume.AttachableVolumePlugin); ok { - pluginIsAttachable = true - } - - volumeObj, volumeExists := asw.attachedVolumes[volumeName] - if !volumeExists { - volumeObj = attachedVolume{ - volumeName: volumeName, - spec: volumeSpec, - mountedPods: make(map[volumetypes.UniquePodName]mountedPod), - pluginName: volumePlugin.GetPluginName(), - pluginIsAttachable: pluginIsAttachable, - globallyMounted: false, - devicePath: devicePath, - } - } else { - // If volume object already exists, update the fields such as device path - volumeObj.devicePath = devicePath - glog.V(2).Infof("Volume %q is already added to attachedVolume list, update device path %q", - volumeName, - devicePath) - } - asw.attachedVolumes[volumeName] = volumeObj - - return nil -} - -func (asw *actualStateOfWorld) AddPodToVolume( - podName volumetypes.UniquePodName, - podUID types.UID, - volumeName v1.UniqueVolumeName, - mounter volume.Mounter, - blockVolumeMapper volume.BlockVolumeMapper, - outerVolumeSpecName string, - volumeGidValue string, - volumeSpec *volume.Spec) error { - asw.Lock() - defer asw.Unlock() - - volumeObj, volumeExists := asw.attachedVolumes[volumeName] - if !volumeExists { - return fmt.Errorf( - "no volume with the name %q exists in the list of attached volumes", - volumeName) - } - - podObj, podExists := volumeObj.mountedPods[podName] - if !podExists { - podObj = mountedPod{ - podName: podName, - podUID: podUID, - mounter: mounter, - blockVolumeMapper: blockVolumeMapper, - outerVolumeSpecName: outerVolumeSpecName, - volumeGidValue: volumeGidValue, - volumeSpec: volumeSpec, - } - } - - // If pod exists, reset remountRequired value - podObj.remountRequired = false - asw.attachedVolumes[volumeName].mountedPods[podName] = podObj - - return nil -} - -func (asw *actualStateOfWorld) MarkVolumeAsResized( - podName volumetypes.UniquePodName, - volumeName v1.UniqueVolumeName) error { - asw.Lock() - defer asw.Unlock() - - volumeObj, volumeExists := asw.attachedVolumes[volumeName] - if !volumeExists { - return fmt.Errorf( - "no volume with the name %q exists in the list of attached volumes", - volumeName) - } - - podObj, podExists := volumeObj.mountedPods[podName] - if !podExists { - return fmt.Errorf( - "no pod with the name %q exists in the mounted pods list of volume %s", - podName, - volumeName) - } - - glog.V(5).Infof("Volume %s(OuterVolumeSpecName %s) of pod %s has been resized", - volumeName, podObj.outerVolumeSpecName, podName) - podObj.fsResizeRequired = false - asw.attachedVolumes[volumeName].mountedPods[podName] = podObj - return nil -} - -func (asw *actualStateOfWorld) MarkRemountRequired( - podName volumetypes.UniquePodName) { - asw.Lock() - defer asw.Unlock() - for volumeName, volumeObj := range asw.attachedVolumes { - for mountedPodName, podObj := range volumeObj.mountedPods { - if mountedPodName != podName { - continue - } - - volumePlugin, err := - asw.volumePluginMgr.FindPluginBySpec(podObj.volumeSpec) - if err != nil || volumePlugin == nil { - // Log and continue processing - glog.Errorf( - "MarkRemountRequired failed to FindPluginBySpec for pod %q (podUid %q) volume: %q (volSpecName: %q)", - podObj.podName, - podObj.podUID, - volumeObj.volumeName, - podObj.volumeSpec.Name()) - continue - } - - if volumePlugin.RequiresRemount() { - podObj.remountRequired = true - asw.attachedVolumes[volumeName].mountedPods[podName] = podObj - } - } - } -} - -func (asw *actualStateOfWorld) MarkFSResizeRequired( - volumeName v1.UniqueVolumeName, - podName volumetypes.UniquePodName) { - asw.Lock() - defer asw.Unlock() - volumeObj, exist := asw.attachedVolumes[volumeName] - if !exist { - glog.Warningf("MarkFSResizeRequired for volume %s failed as volume not exist", volumeName) - return - } - - podObj, exist := volumeObj.mountedPods[podName] - if !exist { - glog.Warningf("MarkFSResizeRequired for volume %s failed "+ - "as pod(%s) not exist", volumeName, podName) - return - } - - volumePlugin, err := - asw.volumePluginMgr.FindExpandablePluginBySpec(podObj.volumeSpec) - if err != nil || volumePlugin == nil { - // Log and continue processing - glog.Errorf( - "MarkFSResizeRequired failed to find expandable plugin for pod %q volume: %q (volSpecName: %q)", - podObj.podName, - volumeObj.volumeName, - podObj.volumeSpec.Name()) - return - } - - if volumePlugin.RequiresFSResize() { - if !podObj.fsResizeRequired { - glog.V(3).Infof("PVC volume %s(OuterVolumeSpecName %s) of pod %s requires file system resize", - volumeName, podObj.outerVolumeSpecName, podName) - podObj.fsResizeRequired = true - } - asw.attachedVolumes[volumeName].mountedPods[podName] = podObj - } -} - -func (asw *actualStateOfWorld) SetVolumeGloballyMounted( - volumeName v1.UniqueVolumeName, globallyMounted bool, devicePath, deviceMountPath string) error { - asw.Lock() - defer asw.Unlock() - - volumeObj, volumeExists := asw.attachedVolumes[volumeName] - if !volumeExists { - return fmt.Errorf( - "no volume with the name %q exists in the list of attached volumes", - volumeName) - } - - volumeObj.globallyMounted = globallyMounted - volumeObj.deviceMountPath = deviceMountPath - volumeObj.devicePath = devicePath - asw.attachedVolumes[volumeName] = volumeObj - return nil -} - -func (asw *actualStateOfWorld) DeletePodFromVolume( - podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error { - asw.Lock() - defer asw.Unlock() - - volumeObj, volumeExists := asw.attachedVolumes[volumeName] - if !volumeExists { - return fmt.Errorf( - "no volume with the name %q exists in the list of attached volumes", - volumeName) - } - - _, podExists := volumeObj.mountedPods[podName] - if podExists { - delete(asw.attachedVolumes[volumeName].mountedPods, podName) - } - - return nil -} - -func (asw *actualStateOfWorld) DeleteVolume(volumeName v1.UniqueVolumeName) error { - asw.Lock() - defer asw.Unlock() - - volumeObj, volumeExists := asw.attachedVolumes[volumeName] - if !volumeExists { - return nil - } - - if len(volumeObj.mountedPods) != 0 { - return fmt.Errorf( - "failed to DeleteVolume %q, it still has %v mountedPods", - volumeName, - len(volumeObj.mountedPods)) - } - - delete(asw.attachedVolumes, volumeName) - return nil -} - -func (asw *actualStateOfWorld) PodExistsInVolume( - podName volumetypes.UniquePodName, - volumeName v1.UniqueVolumeName) (bool, string, error) { - asw.RLock() - defer asw.RUnlock() - - volumeObj, volumeExists := asw.attachedVolumes[volumeName] - if !volumeExists { - return false, "", newVolumeNotAttachedError(volumeName) - } - - podObj, podExists := volumeObj.mountedPods[podName] - if podExists { - if podObj.remountRequired { - return true, volumeObj.devicePath, newRemountRequiredError(volumeObj.volumeName, podObj.podName) - } - if podObj.fsResizeRequired && - utilfeature.DefaultFeatureGate.Enabled(features.ExpandInUsePersistentVolumes) { - return true, volumeObj.devicePath, newFsResizeRequiredError(volumeObj.volumeName, podObj.podName) - } - } - - return podExists, volumeObj.devicePath, nil -} - -func (asw *actualStateOfWorld) VolumeExistsWithSpecName(podName volumetypes.UniquePodName, volumeSpecName string) bool { - asw.RLock() - defer asw.RUnlock() - for _, volumeObj := range asw.attachedVolumes { - for name, podObj := range volumeObj.mountedPods { - if podName == name && podObj.volumeSpec.Name() == volumeSpecName { - return true - } - } - } - return false -} - -func (asw *actualStateOfWorld) VolumeExists( - volumeName v1.UniqueVolumeName) bool { - asw.RLock() - defer asw.RUnlock() - - _, volumeExists := asw.attachedVolumes[volumeName] - return volumeExists -} - -func (asw *actualStateOfWorld) GetMountedVolumes() []MountedVolume { - asw.RLock() - defer asw.RUnlock() - mountedVolume := make([]MountedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */) - for _, volumeObj := range asw.attachedVolumes { - for _, podObj := range volumeObj.mountedPods { - mountedVolume = append( - mountedVolume, - getMountedVolume(&podObj, &volumeObj)) - } - } - - return mountedVolume -} - -func (asw *actualStateOfWorld) GetMountedVolumesForPod( - podName volumetypes.UniquePodName) []MountedVolume { - asw.RLock() - defer asw.RUnlock() - mountedVolume := make([]MountedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */) - for _, volumeObj := range asw.attachedVolumes { - for mountedPodName, podObj := range volumeObj.mountedPods { - if mountedPodName == podName { - mountedVolume = append( - mountedVolume, - getMountedVolume(&podObj, &volumeObj)) - } - } - } - - return mountedVolume -} - -func (asw *actualStateOfWorld) GetGloballyMountedVolumes() []AttachedVolume { - asw.RLock() - defer asw.RUnlock() - globallyMountedVolumes := make( - []AttachedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */) - for _, volumeObj := range asw.attachedVolumes { - if volumeObj.globallyMounted { - globallyMountedVolumes = append( - globallyMountedVolumes, - asw.newAttachedVolume(&volumeObj)) - } - } - - return globallyMountedVolumes -} - -func (asw *actualStateOfWorld) GetUnmountedVolumes() []AttachedVolume { - asw.RLock() - defer asw.RUnlock() - unmountedVolumes := make([]AttachedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */) - for _, volumeObj := range asw.attachedVolumes { - if len(volumeObj.mountedPods) == 0 { - unmountedVolumes = append( - unmountedVolumes, - asw.newAttachedVolume(&volumeObj)) - } - } - - return unmountedVolumes -} - -func (asw *actualStateOfWorld) GetPods() map[volumetypes.UniquePodName]bool { - asw.RLock() - defer asw.RUnlock() - - podList := make(map[volumetypes.UniquePodName]bool) - for _, volumeObj := range asw.attachedVolumes { - for podName := range volumeObj.mountedPods { - if !podList[podName] { - podList[podName] = true - } - } - } - return podList -} - -func (asw *actualStateOfWorld) newAttachedVolume( - attachedVolume *attachedVolume) AttachedVolume { - return AttachedVolume{ - AttachedVolume: operationexecutor.AttachedVolume{ - VolumeName: attachedVolume.volumeName, - VolumeSpec: attachedVolume.spec, - NodeName: asw.nodeName, - PluginIsAttachable: attachedVolume.pluginIsAttachable, - DevicePath: attachedVolume.devicePath, - DeviceMountPath: attachedVolume.deviceMountPath, - PluginName: attachedVolume.pluginName}, - GloballyMounted: attachedVolume.globallyMounted, - } -} - -// Compile-time check to ensure volumeNotAttachedError implements the error interface -var _ error = volumeNotAttachedError{} - -// volumeNotAttachedError is an error returned when PodExistsInVolume() fails to -// find specified volume in the list of attached volumes. -type volumeNotAttachedError struct { - volumeName v1.UniqueVolumeName -} - -func (err volumeNotAttachedError) Error() string { - return fmt.Sprintf( - "volumeName %q does not exist in the list of attached volumes", - err.volumeName) -} - -func newVolumeNotAttachedError(volumeName v1.UniqueVolumeName) error { - return volumeNotAttachedError{ - volumeName: volumeName, - } -} - -// Compile-time check to ensure remountRequiredError implements the error interface -var _ error = remountRequiredError{} - -// remountRequiredError is an error returned when PodExistsInVolume() found -// volume/pod attached/mounted but remountRequired was true, indicating the -// given volume should be remounted to the pod to reflect changes in the -// referencing pod. -type remountRequiredError struct { - volumeName v1.UniqueVolumeName - podName volumetypes.UniquePodName -} - -func (err remountRequiredError) Error() string { - return fmt.Sprintf( - "volumeName %q is mounted to %q but should be remounted", - err.volumeName, err.podName) -} - -func newRemountRequiredError( - volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) error { - return remountRequiredError{ - volumeName: volumeName, - podName: podName, - } -} - -// fsResizeRequiredError is an error returned when PodExistsInVolume() found -// volume/pod attached/mounted but fsResizeRequired was true, indicating the -// given volume receives an resize request after attached/mounted. -type fsResizeRequiredError struct { - volumeName v1.UniqueVolumeName - podName volumetypes.UniquePodName -} - -func (err fsResizeRequiredError) Error() string { - return fmt.Sprintf( - "volumeName %q mounted to %q needs to resize file system", - err.volumeName, err.podName) -} - -func newFsResizeRequiredError( - volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) error { - return fsResizeRequiredError{ - volumeName: volumeName, - podName: podName, - } -} - -// IsFSResizeRequiredError returns true if the specified error is a -// fsResizeRequiredError. -func IsFSResizeRequiredError(err error) bool { - _, ok := err.(fsResizeRequiredError) - return ok -} - -// getMountedVolume constructs and returns a MountedVolume object from the given -// mountedPod and attachedVolume objects. -func getMountedVolume( - mountedPod *mountedPod, attachedVolume *attachedVolume) MountedVolume { - return MountedVolume{ - MountedVolume: operationexecutor.MountedVolume{ - PodName: mountedPod.podName, - VolumeName: attachedVolume.volumeName, - InnerVolumeSpecName: mountedPod.volumeSpec.Name(), - OuterVolumeSpecName: mountedPod.outerVolumeSpecName, - PluginName: attachedVolume.pluginName, - PodUID: mountedPod.podUID, - Mounter: mountedPod.mounter, - BlockVolumeMapper: mountedPod.blockVolumeMapper, - VolumeGidValue: mountedPod.volumeGidValue, - VolumeSpec: mountedPod.volumeSpec, - DeviceMountPath: attachedVolume.deviceMountPath}} -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go deleted file mode 100644 index fd52aaaa..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/cache/desired_state_of_world.go +++ /dev/null @@ -1,373 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 cache implements data structures used by the kubelet volume manager to -keep track of attached volumes and the pods that mounted them. -*/ -package cache - -import ( - "fmt" - "sync" - - "k8s.io/api/core/v1" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/kubernetes/pkg/volume/util/operationexecutor" - "k8s.io/kubernetes/pkg/volume/util/types" -) - -// DesiredStateOfWorld defines a set of thread-safe operations for the kubelet -// volume manager's desired state of the world cache. -// This cache contains volumes->pods i.e. a set of all volumes that should be -// attached to this node and the pods that reference them and should mount the -// volume. -// Note: This is distinct from the DesiredStateOfWorld implemented by the -// attach/detach controller. They both keep track of different objects. This -// contains kubelet volume manager specific state. -type DesiredStateOfWorld interface { - // AddPodToVolume adds the given pod to the given volume in the cache - // indicating the specified pod should mount the specified volume. - // A unique volumeName is generated from the volumeSpec and returned on - // success. - // If no volume plugin can support the given volumeSpec or more than one - // plugin can support it, an error is returned. - // If a volume with the name volumeName does not exist in the list of - // volumes that should be attached to this node, the volume is implicitly - // added. - // If a pod with the same unique name already exists under the specified - // volume, this is a no-op. - AddPodToVolume(podName types.UniquePodName, pod *v1.Pod, volumeSpec *volume.Spec, outerVolumeSpecName string, volumeGidValue string) (v1.UniqueVolumeName, error) - - // MarkVolumesReportedInUse sets the ReportedInUse value to true for the - // reportedVolumes. For volumes not in the reportedVolumes list, the - // ReportedInUse value is reset to false. The default ReportedInUse value - // for a newly created volume is false. - // When set to true this value indicates that the volume was successfully - // added to the VolumesInUse field in the node's status. Mount operation needs - // to check this value before issuing the operation. - // If a volume in the reportedVolumes list does not exist in the list of - // volumes that should be attached to this node, it is skipped without error. - MarkVolumesReportedInUse(reportedVolumes []v1.UniqueVolumeName) - - // DeletePodFromVolume removes the given pod from the given volume in the - // cache indicating the specified pod no longer requires the specified - // volume. - // If a pod with the same unique name does not exist under the specified - // volume, this is a no-op. - // If a volume with the name volumeName does not exist in the list of - // attached volumes, this is a no-op. - // If after deleting the pod, the specified volume contains no other child - // pods, the volume is also deleted. - DeletePodFromVolume(podName types.UniquePodName, volumeName v1.UniqueVolumeName) - - // VolumeExists returns true if the given volume exists in the list of - // volumes that should be attached to this node. - // If a pod with the same unique name does not exist under the specified - // volume, false is returned. - VolumeExists(volumeName v1.UniqueVolumeName) bool - - // PodExistsInVolume returns true if the given pod exists in the list of - // podsToMount for the given volume in the cache. - // If a pod with the same unique name does not exist under the specified - // volume, false is returned. - // If a volume with the name volumeName does not exist in the list of - // attached volumes, false is returned. - PodExistsInVolume(podName types.UniquePodName, volumeName v1.UniqueVolumeName) bool - - // GetVolumesToMount generates and returns a list of volumes that should be - // attached to this node and the pods they should be mounted to based on the - // current desired state of the world. - GetVolumesToMount() []VolumeToMount - - // GetPods generates and returns a map of pods in which map is indexed - // with pod's unique name. This map can be used to determine which pod is currently - // in desired state of world. - GetPods() map[types.UniquePodName]bool - - // VolumeExistsWithSpecName returns true if the given volume specified with the - // volume spec name (a.k.a., InnerVolumeSpecName) exists in the list of - // volumes that should be attached to this node. - // If a pod with the same name does not exist under the specified - // volume, false is returned. - VolumeExistsWithSpecName(podName types.UniquePodName, volumeSpecName string) bool -} - -// VolumeToMount represents a volume that is attached to this node and needs to -// be mounted to PodName. -type VolumeToMount struct { - operationexecutor.VolumeToMount -} - -// NewDesiredStateOfWorld returns a new instance of DesiredStateOfWorld. -func NewDesiredStateOfWorld(volumePluginMgr *volume.VolumePluginMgr) DesiredStateOfWorld { - return &desiredStateOfWorld{ - volumesToMount: make(map[v1.UniqueVolumeName]volumeToMount), - volumePluginMgr: volumePluginMgr, - } -} - -type desiredStateOfWorld struct { - // volumesToMount is a map containing the set of volumes that should be - // attached to this node and mounted to the pods referencing it. The key in - // the map is the name of the volume and the value is a volume object - // containing more information about the volume. - volumesToMount map[v1.UniqueVolumeName]volumeToMount - // volumePluginMgr is the volume plugin manager used to create volume - // plugin objects. - volumePluginMgr *volume.VolumePluginMgr - - sync.RWMutex -} - -// The volume object represents a volume that should be attached to this node, -// and mounted to podsToMount. -type volumeToMount struct { - // volumeName contains the unique identifier for this volume. - volumeName v1.UniqueVolumeName - - // podsToMount is a map containing the set of pods that reference this - // volume and should mount it once it is attached. The key in the map is - // the name of the pod and the value is a pod object containing more - // information about the pod. - podsToMount map[types.UniquePodName]podToMount - - // pluginIsAttachable indicates that the plugin for this volume implements - // the volume.Attacher interface - pluginIsAttachable bool - - // volumeGidValue contains the value of the GID annotation, if present. - volumeGidValue string - - // reportedInUse indicates that the volume was successfully added to the - // VolumesInUse field in the node's status. - reportedInUse bool -} - -// The pod object represents a pod that references the underlying volume and -// should mount it once it is attached. -type podToMount struct { - // podName contains the name of this pod. - podName types.UniquePodName - - // Pod to mount the volume to. Used to create NewMounter. - pod *v1.Pod - - // volume spec containing the specification for this volume. Used to - // generate the volume plugin object, and passed to plugin methods. - // For non-PVC volumes this is the same as defined in the pod object. For - // PVC volumes it is from the dereferenced PV object. - volumeSpec *volume.Spec - - // outerVolumeSpecName is the volume.Spec.Name() of the volume as referenced - // directly in the pod. If the volume was referenced through a persistent - // volume claim, this contains the volume.Spec.Name() of the persistent - // volume claim - outerVolumeSpecName string -} - -func (dsw *desiredStateOfWorld) AddPodToVolume( - podName types.UniquePodName, - pod *v1.Pod, - volumeSpec *volume.Spec, - outerVolumeSpecName string, - volumeGidValue string) (v1.UniqueVolumeName, error) { - dsw.Lock() - defer dsw.Unlock() - - volumePlugin, err := dsw.volumePluginMgr.FindPluginBySpec(volumeSpec) - if err != nil || volumePlugin == nil { - return "", fmt.Errorf( - "failed to get Plugin from volumeSpec for volume %q err=%v", - volumeSpec.Name(), - err) - } - - var volumeName v1.UniqueVolumeName - - // The unique volume name used depends on whether the volume is attachable - // or not. - attachable := dsw.isAttachableVolume(volumeSpec) - if attachable { - // For attachable volumes, use the unique volume name as reported by - // the plugin. - volumeName, err = - util.GetUniqueVolumeNameFromSpec(volumePlugin, volumeSpec) - if err != nil { - return "", fmt.Errorf( - "failed to GetUniqueVolumeNameFromSpec for volumeSpec %q using volume plugin %q err=%v", - volumeSpec.Name(), - volumePlugin.GetPluginName(), - err) - } - } else { - // For non-attachable volumes, generate a unique name based on the pod - // namespace and name and the name of the volume within the pod. - volumeName = util.GetUniqueVolumeNameForNonAttachableVolume(podName, volumePlugin, volumeSpec) - } - - if _, volumeExists := dsw.volumesToMount[volumeName]; !volumeExists { - dsw.volumesToMount[volumeName] = volumeToMount{ - volumeName: volumeName, - podsToMount: make(map[types.UniquePodName]podToMount), - pluginIsAttachable: attachable, - volumeGidValue: volumeGidValue, - reportedInUse: false, - } - } - - // Create new podToMount object. If it already exists, it is refreshed with - // updated values (this is required for volumes that require remounting on - // pod update, like Downward API volumes). - dsw.volumesToMount[volumeName].podsToMount[podName] = podToMount{ - podName: podName, - pod: pod, - volumeSpec: volumeSpec, - outerVolumeSpecName: outerVolumeSpecName, - } - return volumeName, nil -} - -func (dsw *desiredStateOfWorld) MarkVolumesReportedInUse( - reportedVolumes []v1.UniqueVolumeName) { - dsw.Lock() - defer dsw.Unlock() - - reportedVolumesMap := make( - map[v1.UniqueVolumeName]bool, len(reportedVolumes) /* capacity */) - - for _, reportedVolume := range reportedVolumes { - reportedVolumesMap[reportedVolume] = true - } - - for volumeName, volumeObj := range dsw.volumesToMount { - _, volumeReported := reportedVolumesMap[volumeName] - volumeObj.reportedInUse = volumeReported - dsw.volumesToMount[volumeName] = volumeObj - } -} - -func (dsw *desiredStateOfWorld) DeletePodFromVolume( - podName types.UniquePodName, volumeName v1.UniqueVolumeName) { - dsw.Lock() - defer dsw.Unlock() - - volumeObj, volumeExists := dsw.volumesToMount[volumeName] - if !volumeExists { - return - } - - if _, podExists := volumeObj.podsToMount[podName]; !podExists { - return - } - - // Delete pod if it exists - delete(dsw.volumesToMount[volumeName].podsToMount, podName) - - if len(dsw.volumesToMount[volumeName].podsToMount) == 0 { - // Delete volume if no child pods left - delete(dsw.volumesToMount, volumeName) - } -} - -func (dsw *desiredStateOfWorld) VolumeExists( - volumeName v1.UniqueVolumeName) bool { - dsw.RLock() - defer dsw.RUnlock() - - _, volumeExists := dsw.volumesToMount[volumeName] - return volumeExists -} - -func (dsw *desiredStateOfWorld) PodExistsInVolume( - podName types.UniquePodName, volumeName v1.UniqueVolumeName) bool { - dsw.RLock() - defer dsw.RUnlock() - - volumeObj, volumeExists := dsw.volumesToMount[volumeName] - if !volumeExists { - return false - } - - _, podExists := volumeObj.podsToMount[podName] - return podExists -} - -func (dsw *desiredStateOfWorld) VolumeExistsWithSpecName(podName types.UniquePodName, volumeSpecName string) bool { - dsw.RLock() - defer dsw.RUnlock() - for _, volumeObj := range dsw.volumesToMount { - for name, podObj := range volumeObj.podsToMount { - if podName == name && podObj.volumeSpec.Name() == volumeSpecName { - return true - } - } - } - return false -} - -func (dsw *desiredStateOfWorld) GetPods() map[types.UniquePodName]bool { - dsw.RLock() - defer dsw.RUnlock() - - podList := make(map[types.UniquePodName]bool) - for _, volumeObj := range dsw.volumesToMount { - for podName := range volumeObj.podsToMount { - if !podList[podName] { - podList[podName] = true - } - } - } - return podList -} - -func (dsw *desiredStateOfWorld) GetVolumesToMount() []VolumeToMount { - dsw.RLock() - defer dsw.RUnlock() - - volumesToMount := make([]VolumeToMount, 0 /* len */, len(dsw.volumesToMount) /* cap */) - for volumeName, volumeObj := range dsw.volumesToMount { - for podName, podObj := range volumeObj.podsToMount { - volumesToMount = append( - volumesToMount, - VolumeToMount{ - VolumeToMount: operationexecutor.VolumeToMount{ - VolumeName: volumeName, - PodName: podName, - Pod: podObj.pod, - VolumeSpec: podObj.volumeSpec, - PluginIsAttachable: volumeObj.pluginIsAttachable, - OuterVolumeSpecName: podObj.outerVolumeSpecName, - VolumeGidValue: volumeObj.volumeGidValue, - ReportedInUse: volumeObj.reportedInUse}}) - } - } - return volumesToMount -} - -func (dsw *desiredStateOfWorld) isAttachableVolume(volumeSpec *volume.Spec) bool { - attachableVolumePlugin, _ := - dsw.volumePluginMgr.FindAttachablePluginBySpec(volumeSpec) - if attachableVolumePlugin != nil { - volumeAttacher, err := attachableVolumePlugin.NewAttacher() - if err == nil && volumeAttacher != nil { - return true - } - } - - return false -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD deleted file mode 100644 index fe4d2da5..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["desired_state_of_world_populator.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/container:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/util/format:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["desired_state_of_world_populator_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/configmap:go_default_library", - "//pkg/kubelet/container/testing:go_default_library", - "//pkg/kubelet/pod:go_default_library", - "//pkg/kubelet/pod/testing:go_default_library", - "//pkg/kubelet/secret:go_default_library", - "//pkg/kubelet/status:go_default_library", - "//pkg/kubelet/status/testing:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go deleted file mode 100644 index e65fdc1b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go +++ /dev/null @@ -1,661 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 populator implements interfaces that monitor and keep the states of the -caches in sync with the "ground truth". -*/ -package populator - -import ( - "fmt" - "sync" - "time" - - "github.com/golang/glog" - - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" - utilfeature "k8s.io/apiserver/pkg/util/feature" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/kubelet/config" - kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/pod" - "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" - volumetypes "k8s.io/kubernetes/pkg/volume/util/types" -) - -// DesiredStateOfWorldPopulator periodically loops through the list of active -// pods and ensures that each one exists in the desired state of the world cache -// if it has volumes. It also verifies that the pods in the desired state of the -// world cache still exist, if not, it removes them. -type DesiredStateOfWorldPopulator interface { - Run(sourcesReady config.SourcesReady, stopCh <-chan struct{}) - - // ReprocessPod removes the specified pod from the list of processedPods - // (if it exists) forcing it to be reprocessed. This is required to enable - // remounting volumes on pod updates (volumes like Downward API volumes - // depend on this behavior to ensure volume content is updated). - ReprocessPod(podName volumetypes.UniquePodName) - - // HasAddedPods returns whether the populator has looped through the list - // of active pods and added them to the desired state of the world cache, - // at a time after sources are all ready, at least once. It does not - // return true before sources are all ready because before then, there is - // a chance many or all pods are missing from the list of active pods and - // so few to none will have been added. - HasAddedPods() bool -} - -// NewDesiredStateOfWorldPopulator returns a new instance of -// DesiredStateOfWorldPopulator. -// -// kubeClient - used to fetch PV and PVC objects from the API server -// loopSleepDuration - the amount of time the populator loop sleeps between -// successive executions -// podManager - the kubelet podManager that is the source of truth for the pods -// that exist on this host -// desiredStateOfWorld - the cache to populate -func NewDesiredStateOfWorldPopulator( - kubeClient clientset.Interface, - loopSleepDuration time.Duration, - getPodStatusRetryDuration time.Duration, - podManager pod.Manager, - podStatusProvider status.PodStatusProvider, - desiredStateOfWorld cache.DesiredStateOfWorld, - actualStateOfWorld cache.ActualStateOfWorld, - kubeContainerRuntime kubecontainer.Runtime, - keepTerminatedPodVolumes bool) DesiredStateOfWorldPopulator { - return &desiredStateOfWorldPopulator{ - kubeClient: kubeClient, - loopSleepDuration: loopSleepDuration, - getPodStatusRetryDuration: getPodStatusRetryDuration, - podManager: podManager, - podStatusProvider: podStatusProvider, - desiredStateOfWorld: desiredStateOfWorld, - actualStateOfWorld: actualStateOfWorld, - pods: processedPods{ - processedPods: make(map[volumetypes.UniquePodName]bool)}, - kubeContainerRuntime: kubeContainerRuntime, - keepTerminatedPodVolumes: keepTerminatedPodVolumes, - hasAddedPods: false, - hasAddedPodsLock: sync.RWMutex{}, - } -} - -type desiredStateOfWorldPopulator struct { - kubeClient clientset.Interface - loopSleepDuration time.Duration - getPodStatusRetryDuration time.Duration - podManager pod.Manager - podStatusProvider status.PodStatusProvider - desiredStateOfWorld cache.DesiredStateOfWorld - actualStateOfWorld cache.ActualStateOfWorld - pods processedPods - kubeContainerRuntime kubecontainer.Runtime - timeOfLastGetPodStatus time.Time - keepTerminatedPodVolumes bool - hasAddedPods bool - hasAddedPodsLock sync.RWMutex -} - -type processedPods struct { - processedPods map[volumetypes.UniquePodName]bool - sync.RWMutex -} - -func (dswp *desiredStateOfWorldPopulator) Run(sourcesReady config.SourcesReady, stopCh <-chan struct{}) { - // Wait for the completion of a loop that started after sources are all ready, then set hasAddedPods accordingly - glog.Infof("Desired state populator starts to run") - wait.PollUntil(dswp.loopSleepDuration, func() (bool, error) { - done := sourcesReady.AllReady() - dswp.populatorLoopFunc()() - return done, nil - }, stopCh) - dswp.hasAddedPodsLock.Lock() - dswp.hasAddedPods = true - dswp.hasAddedPodsLock.Unlock() - wait.Until(dswp.populatorLoopFunc(), dswp.loopSleepDuration, stopCh) -} - -func (dswp *desiredStateOfWorldPopulator) ReprocessPod( - podName volumetypes.UniquePodName) { - dswp.deleteProcessedPod(podName) -} - -func (dswp *desiredStateOfWorldPopulator) HasAddedPods() bool { - dswp.hasAddedPodsLock.RLock() - defer dswp.hasAddedPodsLock.RUnlock() - return dswp.hasAddedPods -} - -func (dswp *desiredStateOfWorldPopulator) populatorLoopFunc() func() { - return func() { - dswp.findAndAddNewPods() - - // findAndRemoveDeletedPods() calls out to the container runtime to - // determine if the containers for a given pod are terminated. This is - // an expensive operation, therefore we limit the rate that - // findAndRemoveDeletedPods() is called independently of the main - // populator loop. - if time.Since(dswp.timeOfLastGetPodStatus) < dswp.getPodStatusRetryDuration { - glog.V(5).Infof( - "Skipping findAndRemoveDeletedPods(). Not permitted until %v (getPodStatusRetryDuration %v).", - dswp.timeOfLastGetPodStatus.Add(dswp.getPodStatusRetryDuration), - dswp.getPodStatusRetryDuration) - - return - } - - dswp.findAndRemoveDeletedPods() - } -} - -func (dswp *desiredStateOfWorldPopulator) isPodTerminated(pod *v1.Pod) bool { - podStatus, found := dswp.podStatusProvider.GetPodStatus(pod.UID) - if !found { - podStatus = pod.Status - } - return util.IsPodTerminated(pod, podStatus) -} - -// Iterate through all pods and add to desired state of world if they don't -// exist but should -func (dswp *desiredStateOfWorldPopulator) findAndAddNewPods() { - // Map unique pod name to outer volume name to MountedVolume. - mountedVolumesForPod := make(map[volumetypes.UniquePodName]map[string]cache.MountedVolume) - if utilfeature.DefaultFeatureGate.Enabled(features.ExpandInUsePersistentVolumes) { - for _, mountedVolume := range dswp.actualStateOfWorld.GetMountedVolumes() { - mountedVolumes, exist := mountedVolumesForPod[mountedVolume.PodName] - if !exist { - mountedVolumes = make(map[string]cache.MountedVolume) - mountedVolumesForPod[mountedVolume.PodName] = mountedVolumes - } - mountedVolumes[mountedVolume.OuterVolumeSpecName] = mountedVolume - } - } - - processedVolumesForFSResize := sets.NewString() - for _, pod := range dswp.podManager.GetPods() { - if dswp.isPodTerminated(pod) { - // Do not (re)add volumes for terminated pods - continue - } - dswp.processPodVolumes(pod, mountedVolumesForPod, processedVolumesForFSResize) - } -} - -// Iterate through all pods in desired state of world, and remove if they no -// longer exist -func (dswp *desiredStateOfWorldPopulator) findAndRemoveDeletedPods() { - var runningPods []*kubecontainer.Pod - - runningPodsFetched := false - for _, volumeToMount := range dswp.desiredStateOfWorld.GetVolumesToMount() { - pod, podExists := dswp.podManager.GetPodByUID(volumeToMount.Pod.UID) - if podExists { - // Skip running pods - if !dswp.isPodTerminated(pod) { - continue - } - if dswp.keepTerminatedPodVolumes { - continue - } - } - - // Once a pod has been deleted from kubelet pod manager, do not delete - // it immediately from volume manager. Instead, check the kubelet - // containerRuntime to verify that all containers in the pod have been - // terminated. - if !runningPodsFetched { - var getPodsErr error - runningPods, getPodsErr = dswp.kubeContainerRuntime.GetPods(false) - if getPodsErr != nil { - glog.Errorf( - "kubeContainerRuntime.findAndRemoveDeletedPods returned error %v.", - getPodsErr) - continue - } - - runningPodsFetched = true - dswp.timeOfLastGetPodStatus = time.Now() - } - - runningContainers := false - for _, runningPod := range runningPods { - if runningPod.ID == volumeToMount.Pod.UID { - if len(runningPod.Containers) > 0 { - runningContainers = true - } - - break - } - } - - if runningContainers { - glog.V(4).Infof( - "Pod %q has been removed from pod manager. However, it still has one or more containers in the non-exited state. Therefore, it will not be removed from volume manager.", - format.Pod(volumeToMount.Pod)) - continue - } - - if !dswp.actualStateOfWorld.VolumeExists(volumeToMount.VolumeName) && podExists { - glog.V(4).Infof(volumeToMount.GenerateMsgDetailed("Actual state has not yet has this information skip removing volume from desired state", "")) - continue - } - glog.V(4).Infof(volumeToMount.GenerateMsgDetailed("Removing volume from desired state", "")) - - dswp.desiredStateOfWorld.DeletePodFromVolume( - volumeToMount.PodName, volumeToMount.VolumeName) - dswp.deleteProcessedPod(volumeToMount.PodName) - } -} - -// processPodVolumes processes the volumes in the given pod and adds them to the -// desired state of the world. -func (dswp *desiredStateOfWorldPopulator) processPodVolumes( - pod *v1.Pod, - mountedVolumesForPod map[volumetypes.UniquePodName]map[string]cache.MountedVolume, - processedVolumesForFSResize sets.String) { - if pod == nil { - return - } - - uniquePodName := util.GetUniquePodName(pod) - if dswp.podPreviouslyProcessed(uniquePodName) { - return - } - - allVolumesAdded := true - mountsMap, devicesMap := dswp.makeVolumeMap(pod.Spec.Containers) - - // Process volume spec for each volume defined in pod - for _, podVolume := range pod.Spec.Volumes { - pvc, volumeSpec, volumeGidValue, err := - dswp.createVolumeSpec(podVolume, pod.Name, pod.Namespace, mountsMap, devicesMap) - if err != nil { - glog.Errorf( - "Error processing volume %q for pod %q: %v", - podVolume.Name, - format.Pod(pod), - err) - allVolumesAdded = false - continue - } - - // Add volume to desired state of world - _, err = dswp.desiredStateOfWorld.AddPodToVolume( - uniquePodName, pod, volumeSpec, podVolume.Name, volumeGidValue) - if err != nil { - glog.Errorf( - "Failed to add volume %q (specName: %q) for pod %q to desiredStateOfWorld. err=%v", - podVolume.Name, - volumeSpec.Name(), - uniquePodName, - err) - allVolumesAdded = false - } - - glog.V(4).Infof( - "Added volume %q (volSpec=%q) for pod %q to desired state.", - podVolume.Name, - volumeSpec.Name(), - uniquePodName) - - if utilfeature.DefaultFeatureGate.Enabled(features.ExpandInUsePersistentVolumes) { - dswp.checkVolumeFSResize(pod, podVolume, pvc, volumeSpec, - uniquePodName, mountedVolumesForPod, processedVolumesForFSResize) - } - } - - // some of the volume additions may have failed, should not mark this pod as fully processed - if allVolumesAdded { - dswp.markPodProcessed(uniquePodName) - // New pod has been synced. Re-mount all volumes that need it - // (e.g. DownwardAPI) - dswp.actualStateOfWorld.MarkRemountRequired(uniquePodName) - } - -} - -// checkVolumeFSResize checks whether a PVC mounted by the pod requires file -// system resize or not. If so, marks this volume as fsResizeRequired in ASW. -// - mountedVolumesForPod stores all mounted volumes in ASW, because online -// volume resize only considers mounted volumes. -// - processedVolumesForFSResize stores all volumes we have checked in current loop, -// because file system resize operation is a global operation for volume, so -// we only need to check it once if more than one pod use it. -func (dswp *desiredStateOfWorldPopulator) checkVolumeFSResize( - pod *v1.Pod, - podVolume v1.Volume, - pvc *v1.PersistentVolumeClaim, - volumeSpec *volume.Spec, - uniquePodName volumetypes.UniquePodName, - mountedVolumesForPod map[volumetypes.UniquePodName]map[string]cache.MountedVolume, - processedVolumesForFSResize sets.String) { - if podVolume.PersistentVolumeClaim == nil { - // Only PVC supports resize operation. - return - } - uniqueVolumeName, exist := getUniqueVolumeName(uniquePodName, podVolume.Name, mountedVolumesForPod) - if !exist { - // Volume not exist in ASW, we assume it hasn't been mounted yet. If it needs resize, - // it will be handled as offline resize(if it indeed hasn't been mounted yet), - // or online resize in subsequent loop(after we confirm it has been mounted). - return - } - fsVolume, err := util.CheckVolumeModeFilesystem(volumeSpec) - if err != nil { - glog.Errorf("Check volume mode failed for volume %s(OuterVolumeSpecName %s): %v", - uniqueVolumeName, podVolume.Name, err) - return - } - if !fsVolume { - glog.V(5).Infof("Block mode volume needn't to check file system resize request") - return - } - if processedVolumesForFSResize.Has(string(uniqueVolumeName)) { - // File system resize operation is a global operation for volume, - // so we only need to check it once if more than one pod use it. - return - } - if mountedReadOnlyByPod(podVolume, pod) { - // This volume is used as read only by this pod, we don't perform resize for read only volumes. - glog.V(5).Infof("Skip file system resize check for volume %s in pod %s/%s "+ - "as the volume is mounted as readonly", podVolume.Name, pod.Namespace, pod.Name) - return - } - if volumeRequiresFSResize(pvc, volumeSpec.PersistentVolume) { - dswp.actualStateOfWorld.MarkFSResizeRequired(uniqueVolumeName, uniquePodName) - } - processedVolumesForFSResize.Insert(string(uniqueVolumeName)) -} - -func mountedReadOnlyByPod(podVolume v1.Volume, pod *v1.Pod) bool { - if podVolume.PersistentVolumeClaim.ReadOnly { - return true - } - for _, container := range pod.Spec.InitContainers { - if !mountedReadOnlyByContainer(podVolume.Name, &container) { - return false - } - } - for _, container := range pod.Spec.Containers { - if !mountedReadOnlyByContainer(podVolume.Name, &container) { - return false - } - } - return true -} - -func mountedReadOnlyByContainer(volumeName string, container *v1.Container) bool { - for _, volumeMount := range container.VolumeMounts { - if volumeMount.Name == volumeName && !volumeMount.ReadOnly { - return false - } - } - return true -} - -func getUniqueVolumeName( - podName volumetypes.UniquePodName, - outerVolumeSpecName string, - mountedVolumesForPod map[volumetypes.UniquePodName]map[string]cache.MountedVolume) (v1.UniqueVolumeName, bool) { - mountedVolumes, exist := mountedVolumesForPod[podName] - if !exist { - return "", false - } - mountedVolume, exist := mountedVolumes[outerVolumeSpecName] - if !exist { - return "", false - } - return mountedVolume.VolumeName, true -} - -func volumeRequiresFSResize(pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) bool { - capacity := pvc.Status.Capacity[v1.ResourceStorage] - requested := pv.Spec.Capacity[v1.ResourceStorage] - return requested.Cmp(capacity) > 0 -} - -// podPreviouslyProcessed returns true if the volumes for this pod have already -// been processed by the populator -func (dswp *desiredStateOfWorldPopulator) podPreviouslyProcessed( - podName volumetypes.UniquePodName) bool { - dswp.pods.RLock() - defer dswp.pods.RUnlock() - - _, exists := dswp.pods.processedPods[podName] - return exists -} - -// markPodProcessed records that the volumes for the specified pod have been -// processed by the populator -func (dswp *desiredStateOfWorldPopulator) markPodProcessed( - podName volumetypes.UniquePodName) { - dswp.pods.Lock() - defer dswp.pods.Unlock() - - dswp.pods.processedPods[podName] = true -} - -// markPodProcessed removes the specified pod from processedPods -func (dswp *desiredStateOfWorldPopulator) deleteProcessedPod( - podName volumetypes.UniquePodName) { - dswp.pods.Lock() - defer dswp.pods.Unlock() - - delete(dswp.pods.processedPods, podName) -} - -// createVolumeSpec creates and returns a mutatable volume.Spec object for the -// specified volume. It dereference any PVC to get PV objects, if needed. -// Returns an error if unable to obtain the volume at this time. -func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( - podVolume v1.Volume, podName string, podNamespace string, mountsMap map[string]bool, devicesMap map[string]bool) (*v1.PersistentVolumeClaim, *volume.Spec, string, error) { - if pvcSource := - podVolume.VolumeSource.PersistentVolumeClaim; pvcSource != nil { - glog.V(5).Infof( - "Found PVC, ClaimName: %q/%q", - podNamespace, - pvcSource.ClaimName) - - // If podVolume is a PVC, fetch the real PV behind the claim - pvc, err := dswp.getPVCExtractPV( - podNamespace, pvcSource.ClaimName) - if err != nil { - return nil, nil, "", fmt.Errorf( - "error processing PVC %q/%q: %v", - podNamespace, - pvcSource.ClaimName, - err) - } - pvName, pvcUID := pvc.Spec.VolumeName, pvc.UID - - glog.V(5).Infof( - "Found bound PV for PVC (ClaimName %q/%q pvcUID %v): pvName=%q", - podNamespace, - pvcSource.ClaimName, - pvcUID, - pvName) - - // Fetch actual PV object - volumeSpec, volumeGidValue, err := - dswp.getPVSpec(pvName, pvcSource.ReadOnly, pvcUID) - if err != nil { - return nil, nil, "", fmt.Errorf( - "error processing PVC %q/%q: %v", - podNamespace, - pvcSource.ClaimName, - err) - } - - glog.V(5).Infof( - "Extracted volumeSpec (%v) from bound PV (pvName %q) and PVC (ClaimName %q/%q pvcUID %v)", - volumeSpec.Name, - pvName, - podNamespace, - pvcSource.ClaimName, - pvcUID) - - // TODO: remove feature gate check after no longer needed - if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { - volumeMode, err := util.GetVolumeMode(volumeSpec) - if err != nil { - return nil, nil, "", err - } - // Error if a container has volumeMounts but the volumeMode of PVC isn't Filesystem - if mountsMap[podVolume.Name] && volumeMode != v1.PersistentVolumeFilesystem { - return nil, nil, "", fmt.Errorf( - "Volume %q has volumeMode %q, but is specified in volumeMounts for pod %q/%q", - podVolume.Name, - volumeMode, - podNamespace, - podName) - } - // Error if a container has volumeDevices but the volumeMode of PVC isn't Block - if devicesMap[podVolume.Name] && volumeMode != v1.PersistentVolumeBlock { - return nil, nil, "", fmt.Errorf( - "Volume %q has volumeMode %q, but is specified in volumeDevices for pod %q/%q", - podVolume.Name, - volumeMode, - podNamespace, - podName) - } - } - return pvc, volumeSpec, volumeGidValue, nil - } - - // Do not return the original volume object, since the source could mutate it - clonedPodVolume := podVolume.DeepCopy() - - return nil, volume.NewSpecFromVolume(clonedPodVolume), "", nil -} - -// getPVCExtractPV fetches the PVC object with the given namespace and name from -// the API server, checks whether PVC is being deleted, extracts the name of the PV -// it is pointing to and returns it. -// An error is returned if the PVC object's phase is not "Bound". -func (dswp *desiredStateOfWorldPopulator) getPVCExtractPV( - namespace string, claimName string) (*v1.PersistentVolumeClaim, error) { - pvc, err := - dswp.kubeClient.CoreV1().PersistentVolumeClaims(namespace).Get(claimName, metav1.GetOptions{}) - if err != nil || pvc == nil { - return nil, fmt.Errorf( - "failed to fetch PVC %s/%s from API server. err=%v", - namespace, - claimName, - err) - } - - if utilfeature.DefaultFeatureGate.Enabled(features.StorageObjectInUseProtection) { - // Pods that uses a PVC that is being deleted must not be started. - // - // In case an old kubelet is running without this check or some kubelets - // have this feature disabled, the worst that can happen is that such - // pod is scheduled. This was the default behavior in 1.8 and earlier - // and users should not be that surprised. - // It should happen only in very rare case when scheduler schedules - // a pod and user deletes a PVC that's used by it at the same time. - if pvc.ObjectMeta.DeletionTimestamp != nil { - return nil, fmt.Errorf( - "can't start pod because PVC %s/%s is being deleted", - namespace, - claimName) - } - } - - if pvc.Status.Phase != v1.ClaimBound || pvc.Spec.VolumeName == "" { - - return nil, fmt.Errorf( - "PVC %s/%s has non-bound phase (%q) or empty pvc.Spec.VolumeName (%q)", - namespace, - claimName, - pvc.Status.Phase, - pvc.Spec.VolumeName) - } - - return pvc, nil -} - -// getPVSpec fetches the PV object with the given name from the API server -// and returns a volume.Spec representing it. -// An error is returned if the call to fetch the PV object fails. -func (dswp *desiredStateOfWorldPopulator) getPVSpec( - name string, - pvcReadOnly bool, - expectedClaimUID types.UID) (*volume.Spec, string, error) { - pv, err := dswp.kubeClient.CoreV1().PersistentVolumes().Get(name, metav1.GetOptions{}) - if err != nil || pv == nil { - return nil, "", fmt.Errorf( - "failed to fetch PV %q from API server. err=%v", name, err) - } - - if pv.Spec.ClaimRef == nil { - return nil, "", fmt.Errorf( - "found PV object %q but it has a nil pv.Spec.ClaimRef indicating it is not yet bound to the claim", - name) - } - - if pv.Spec.ClaimRef.UID != expectedClaimUID { - return nil, "", fmt.Errorf( - "found PV object %q but its pv.Spec.ClaimRef.UID (%q) does not point to claim.UID (%q)", - name, - pv.Spec.ClaimRef.UID, - expectedClaimUID) - } - - volumeGidValue := getPVVolumeGidAnnotationValue(pv) - return volume.NewSpecFromPersistentVolume(pv, pvcReadOnly), volumeGidValue, nil -} - -func (dswp *desiredStateOfWorldPopulator) makeVolumeMap(containers []v1.Container) (map[string]bool, map[string]bool) { - volumeDevicesMap := make(map[string]bool) - volumeMountsMap := make(map[string]bool) - - for _, container := range containers { - if container.VolumeMounts != nil { - for _, mount := range container.VolumeMounts { - volumeMountsMap[mount.Name] = true - } - } - // TODO: remove feature gate check after no longer needed - if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) && - container.VolumeDevices != nil { - for _, device := range container.VolumeDevices { - volumeDevicesMap[device.Name] = true - } - } - } - - return volumeMountsMap, volumeDevicesMap -} - -func getPVVolumeGidAnnotationValue(pv *v1.PersistentVolume) string { - if volumeGid, ok := pv.Annotations[util.VolumeGidAnnotationKey]; ok { - return volumeGid - } - - return "" -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD deleted file mode 100644 index 5877cece..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/BUILD +++ /dev/null @@ -1,73 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["reconciler.go"], - importpath = "k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler", - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/config:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/util/file:go_default_library", - "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/util/strings:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/nestedpendingoperations:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["reconciler_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/kubelet/volumemanager/cache:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/operationexecutor:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go deleted file mode 100644 index 2ffb5c99..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go +++ /dev/null @@ -1,694 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 reconciler implements interfaces that attempt to reconcile the -// desired state of the world with the actual state of the world by triggering -// relevant actions (attach, detach, mount, unmount). -package reconciler - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "time" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - utilfeature "k8s.io/apiserver/pkg/util/feature" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/kubelet/config" - "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache" - utilfile "k8s.io/kubernetes/pkg/util/file" - "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff" - "k8s.io/kubernetes/pkg/util/mount" - utilstrings "k8s.io/kubernetes/pkg/util/strings" - volumepkg "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations" - "k8s.io/kubernetes/pkg/volume/util/operationexecutor" - volumetypes "k8s.io/kubernetes/pkg/volume/util/types" -) - -// Reconciler runs a periodic loop to reconcile the desired state of the world -// with the actual state of the world by triggering attach, detach, mount, and -// unmount operations. -// Note: This is distinct from the Reconciler implemented by the attach/detach -// controller. This reconciles state for the kubelet volume manager. That -// reconciles state for the attach/detach controller. -type Reconciler interface { - // Starts running the reconciliation loop which executes periodically, checks - // if volumes that should be mounted are mounted and volumes that should - // be unmounted are unmounted. If not, it will trigger mount/unmount - // operations to rectify. - // If attach/detach management is enabled, the manager will also check if - // volumes that should be attached are attached and volumes that should - // be detached are detached and trigger attach/detach operations as needed. - Run(stopCh <-chan struct{}) - - // StatesHasBeenSynced returns true only after syncStates process starts to sync - // states at least once after kubelet starts - StatesHasBeenSynced() bool -} - -// NewReconciler returns a new instance of Reconciler. -// -// controllerAttachDetachEnabled - if true, indicates that the attach/detach -// controller is responsible for managing the attach/detach operations for -// this node, and therefore the volume manager should not -// loopSleepDuration - the amount of time the reconciler loop sleeps between -// successive executions -// syncDuration - the amount of time the syncStates sleeps between -// successive executions -// waitForAttachTimeout - the amount of time the Mount function will wait for -// the volume to be attached -// nodeName - the Name for this node, used by Attach and Detach methods -// desiredStateOfWorld - cache containing the desired state of the world -// actualStateOfWorld - cache containing the actual state of the world -// populatorHasAddedPods - checker for whether the populator has finished -// adding pods to the desiredStateOfWorld cache at least once after sources -// are all ready (before sources are ready, pods are probably missing) -// operationExecutor - used to trigger attach/detach/mount/unmount operations -// safely (prevents more than one operation from being triggered on the same -// volume) -// mounter - mounter passed in from kubelet, passed down unmount path -// volumePluginMrg - volume plugin manager passed from kubelet -func NewReconciler( - kubeClient clientset.Interface, - controllerAttachDetachEnabled bool, - loopSleepDuration time.Duration, - syncDuration time.Duration, - waitForAttachTimeout time.Duration, - nodeName types.NodeName, - desiredStateOfWorld cache.DesiredStateOfWorld, - actualStateOfWorld cache.ActualStateOfWorld, - populatorHasAddedPods func() bool, - operationExecutor operationexecutor.OperationExecutor, - mounter mount.Interface, - volumePluginMgr *volumepkg.VolumePluginMgr, - kubeletPodsDir string) Reconciler { - return &reconciler{ - kubeClient: kubeClient, - controllerAttachDetachEnabled: controllerAttachDetachEnabled, - loopSleepDuration: loopSleepDuration, - syncDuration: syncDuration, - waitForAttachTimeout: waitForAttachTimeout, - nodeName: nodeName, - desiredStateOfWorld: desiredStateOfWorld, - actualStateOfWorld: actualStateOfWorld, - populatorHasAddedPods: populatorHasAddedPods, - operationExecutor: operationExecutor, - mounter: mounter, - volumePluginMgr: volumePluginMgr, - kubeletPodsDir: kubeletPodsDir, - timeOfLastSync: time.Time{}, - } -} - -type reconciler struct { - kubeClient clientset.Interface - controllerAttachDetachEnabled bool - loopSleepDuration time.Duration - syncDuration time.Duration - waitForAttachTimeout time.Duration - nodeName types.NodeName - desiredStateOfWorld cache.DesiredStateOfWorld - actualStateOfWorld cache.ActualStateOfWorld - populatorHasAddedPods func() bool - operationExecutor operationexecutor.OperationExecutor - mounter mount.Interface - volumePluginMgr *volumepkg.VolumePluginMgr - kubeletPodsDir string - timeOfLastSync time.Time -} - -func (rc *reconciler) Run(stopCh <-chan struct{}) { - wait.Until(rc.reconciliationLoopFunc(), rc.loopSleepDuration, stopCh) -} - -func (rc *reconciler) reconciliationLoopFunc() func() { - return func() { - rc.reconcile() - - // Sync the state with the reality once after all existing pods are added to the desired state from all sources. - // Otherwise, the reconstruct process may clean up pods' volumes that are still in use because - // desired state of world does not contain a complete list of pods. - if rc.populatorHasAddedPods() && !rc.StatesHasBeenSynced() { - glog.Infof("Reconciler: start to sync state") - rc.sync() - } - } -} - -func (rc *reconciler) reconcile() { - // Unmounts are triggered before mounts so that a volume that was - // referenced by a pod that was deleted and is now referenced by another - // pod is unmounted from the first pod before being mounted to the new - // pod. - - // Ensure volumes that should be unmounted are unmounted. - for _, mountedVolume := range rc.actualStateOfWorld.GetMountedVolumes() { - if !rc.desiredStateOfWorld.PodExistsInVolume(mountedVolume.PodName, mountedVolume.VolumeName) { - // Volume is mounted, unmount it - glog.V(5).Infof(mountedVolume.GenerateMsgDetailed("Starting operationExecutor.UnmountVolume", "")) - err := rc.operationExecutor.UnmountVolume( - mountedVolume.MountedVolume, rc.actualStateOfWorld, rc.kubeletPodsDir) - if err != nil && - !nestedpendingoperations.IsAlreadyExists(err) && - !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(mountedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.UnmountVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) - } - if err == nil { - glog.Infof(mountedVolume.GenerateMsgDetailed("operationExecutor.UnmountVolume started", "")) - } - } - } - - // Ensure volumes that should be attached/mounted are attached/mounted. - for _, volumeToMount := range rc.desiredStateOfWorld.GetVolumesToMount() { - volMounted, devicePath, err := rc.actualStateOfWorld.PodExistsInVolume(volumeToMount.PodName, volumeToMount.VolumeName) - volumeToMount.DevicePath = devicePath - if cache.IsVolumeNotAttachedError(err) { - if rc.controllerAttachDetachEnabled || !volumeToMount.PluginIsAttachable { - // Volume is not attached (or doesn't implement attacher), kubelet attach is disabled, wait - // for controller to finish attaching volume. - glog.V(5).Infof(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.VerifyControllerAttachedVolume", "")) - err := rc.operationExecutor.VerifyControllerAttachedVolume( - volumeToMount.VolumeToMount, - rc.nodeName, - rc.actualStateOfWorld) - if err != nil && - !nestedpendingoperations.IsAlreadyExists(err) && - !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.VerifyControllerAttachedVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) - } - if err == nil { - glog.Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.VerifyControllerAttachedVolume started", "")) - } - } else { - // Volume is not attached to node, kubelet attach is enabled, volume implements an attacher, - // so attach it - volumeToAttach := operationexecutor.VolumeToAttach{ - VolumeName: volumeToMount.VolumeName, - VolumeSpec: volumeToMount.VolumeSpec, - NodeName: rc.nodeName, - } - glog.V(5).Infof(volumeToAttach.GenerateMsgDetailed("Starting operationExecutor.AttachVolume", "")) - err := rc.operationExecutor.AttachVolume(volumeToAttach, rc.actualStateOfWorld) - if err != nil && - !nestedpendingoperations.IsAlreadyExists(err) && - !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.AttachVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) - } - if err == nil { - glog.Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.AttachVolume started", "")) - } - } - } else if !volMounted || cache.IsRemountRequiredError(err) { - // Volume is not mounted, or is already mounted, but requires remounting - remountingLogStr := "" - isRemount := cache.IsRemountRequiredError(err) - if isRemount { - remountingLogStr = "Volume is already mounted to pod, but remount was requested." - } - glog.V(4).Infof(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.MountVolume", remountingLogStr)) - err := rc.operationExecutor.MountVolume( - rc.waitForAttachTimeout, - volumeToMount.VolumeToMount, - rc.actualStateOfWorld, - isRemount) - if err != nil && - !nestedpendingoperations.IsAlreadyExists(err) && - !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(volumeToMount.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.MountVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) - } - if err == nil { - if remountingLogStr == "" { - glog.V(1).Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.MountVolume started", remountingLogStr)) - } else { - glog.V(5).Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.MountVolume started", remountingLogStr)) - } - } - } else if cache.IsFSResizeRequiredError(err) && - utilfeature.DefaultFeatureGate.Enabled(features.ExpandInUsePersistentVolumes) { - glog.V(4).Infof(volumeToMount.GenerateMsgDetailed("Starting operationExecutor.ExpandVolumeFSWithoutUnmounting", "")) - err := rc.operationExecutor.ExpandVolumeFSWithoutUnmounting( - volumeToMount.VolumeToMount, - rc.actualStateOfWorld) - if err != nil && - !nestedpendingoperations.IsAlreadyExists(err) && - !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(volumeToMount.GenerateErrorDetailed("operationExecutor.ExpandVolumeFSWithoutUnmounting failed", err).Error()) - } - if err == nil { - glog.V(4).Infof(volumeToMount.GenerateMsgDetailed("operationExecutor.ExpandVolumeFSWithoutUnmounting started", "")) - } - } - } - - // Ensure devices that should be detached/unmounted are detached/unmounted. - for _, attachedVolume := range rc.actualStateOfWorld.GetUnmountedVolumes() { - // Check IsOperationPending to avoid marking a volume as detached if it's in the process of mounting. - if !rc.desiredStateOfWorld.VolumeExists(attachedVolume.VolumeName) && - !rc.operationExecutor.IsOperationPending(attachedVolume.VolumeName, nestedpendingoperations.EmptyUniquePodName) { - if attachedVolume.GloballyMounted { - // Volume is globally mounted to device, unmount it - glog.V(5).Infof(attachedVolume.GenerateMsgDetailed("Starting operationExecutor.UnmountDevice", "")) - err := rc.operationExecutor.UnmountDevice( - attachedVolume.AttachedVolume, rc.actualStateOfWorld, rc.mounter) - if err != nil && - !nestedpendingoperations.IsAlreadyExists(err) && - !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore nestedpendingoperations.IsAlreadyExists and exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(attachedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.UnmountDevice failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) - } - if err == nil { - glog.Infof(attachedVolume.GenerateMsgDetailed("operationExecutor.UnmountDevice started", "")) - } - } else { - // Volume is attached to node, detach it - // Kubelet not responsible for detaching or this volume has a non-attachable volume plugin. - if rc.controllerAttachDetachEnabled || !attachedVolume.PluginIsAttachable { - rc.actualStateOfWorld.MarkVolumeAsDetached(attachedVolume.VolumeName, attachedVolume.NodeName) - glog.Infof(attachedVolume.GenerateMsgDetailed("Volume detached", fmt.Sprintf("DevicePath %q", attachedVolume.DevicePath))) - } else { - // Only detach if kubelet detach is enabled - glog.V(5).Infof(attachedVolume.GenerateMsgDetailed("Starting operationExecutor.DetachVolume", "")) - err := rc.operationExecutor.DetachVolume( - attachedVolume.AttachedVolume, false /* verifySafeToDetach */, rc.actualStateOfWorld) - if err != nil && - !nestedpendingoperations.IsAlreadyExists(err) && - !exponentialbackoff.IsExponentialBackoff(err) { - // Ignore nestedpendingoperations.IsAlreadyExists && exponentialbackoff.IsExponentialBackoff errors, they are expected. - // Log all other errors. - glog.Errorf(attachedVolume.GenerateErrorDetailed(fmt.Sprintf("operationExecutor.DetachVolume failed (controllerAttachDetachEnabled %v)", rc.controllerAttachDetachEnabled), err).Error()) - } - if err == nil { - glog.Infof(attachedVolume.GenerateMsgDetailed("operationExecutor.DetachVolume started", "")) - } - } - } - } - } -} - -// sync process tries to observe the real world by scanning all pods' volume directories from the disk. -// If the actual and desired state of worlds are not consistent with the observed world, it means that some -// mounted volumes are left out probably during kubelet restart. This process will reconstruct -// the volumes and update the actual and desired states. For the volumes that cannot support reconstruction, -// it will try to clean up the mount paths with operation executor. -func (rc *reconciler) sync() { - defer rc.updateLastSyncTime() - rc.syncStates() -} - -func (rc *reconciler) updateLastSyncTime() { - rc.timeOfLastSync = time.Now() -} - -func (rc *reconciler) StatesHasBeenSynced() bool { - return !rc.timeOfLastSync.IsZero() -} - -type podVolume struct { - podName volumetypes.UniquePodName - volumeSpecName string - mountPath string - pluginName string - volumeMode v1.PersistentVolumeMode -} - -type reconstructedVolume struct { - volumeName v1.UniqueVolumeName - podName volumetypes.UniquePodName - volumeSpec *volumepkg.Spec - outerVolumeSpecName string - pod *v1.Pod - attachablePlugin volumepkg.AttachableVolumePlugin - volumeGidValue string - devicePath string - reportedInUse bool - mounter volumepkg.Mounter - blockVolumeMapper volumepkg.BlockVolumeMapper -} - -// syncStates scans the volume directories under the given pod directory. -// If the volume is not in desired state of world, this function will reconstruct -// the volume related information and put it in both the actual and desired state of worlds. -// For some volume plugins that cannot support reconstruction, it will clean up the existing -// mount points since the volume is no long needed (removed from desired state) -func (rc *reconciler) syncStates() { - // Get volumes information by reading the pod's directory - podVolumes, err := getVolumesFromPodDir(rc.kubeletPodsDir) - if err != nil { - glog.Errorf("Cannot get volumes from disk %v", err) - return - } - volumesNeedUpdate := make(map[v1.UniqueVolumeName]*reconstructedVolume) - volumeNeedReport := []v1.UniqueVolumeName{} - for _, volume := range podVolumes { - if rc.actualStateOfWorld.VolumeExistsWithSpecName(volume.podName, volume.volumeSpecName) { - glog.V(4).Infof("Volume exists in actual state (volume.SpecName %s, pod.UID %s), skip cleaning up mounts", volume.volumeSpecName, volume.podName) - // There is nothing to reconstruct - continue - } - volumeInDSW := rc.desiredStateOfWorld.VolumeExistsWithSpecName(volume.podName, volume.volumeSpecName) - - reconstructedVolume, err := rc.reconstructVolume(volume) - if err != nil { - if volumeInDSW { - // Some pod needs the volume, don't clean it up and hope that - // reconcile() calls SetUp and reconstructs the volume in ASW. - glog.V(4).Infof("Volume exists in desired state (volume.SpecName %s, pod.UID %s), skip cleaning up mounts", volume.volumeSpecName, volume.podName) - continue - } - // No pod needs the volume. - glog.Warningf("Could not construct volume information, cleanup the mounts. (pod.UID %s, volume.SpecName %s): %v", volume.podName, volume.volumeSpecName, err) - rc.cleanupMounts(volume) - continue - } - if volumeInDSW { - // Some pod needs the volume. And it exists on disk. Some previous - // kubelet must have created the directory, therefore it must have - // reported the volume as in use. Mark the volume as in use also in - // this new kubelet so reconcile() calls SetUp and re-mounts the - // volume if it's necessary. - volumeNeedReport = append(volumeNeedReport, reconstructedVolume.volumeName) - glog.V(4).Infof("Volume exists in desired state (volume.SpecName %s, pod.UID %s), marking as InUse", volume.volumeSpecName, volume.podName) - continue - } - // There is no pod that uses the volume. - if rc.operationExecutor.IsOperationPending(reconstructedVolume.volumeName, nestedpendingoperations.EmptyUniquePodName) { - glog.Warning("Volume is in pending operation, skip cleaning up mounts") - } - glog.V(2).Infof( - "Reconciler sync states: could not find pod information in desired state, update it in actual state: %+v", - reconstructedVolume) - volumesNeedUpdate[reconstructedVolume.volumeName] = reconstructedVolume - } - - if len(volumesNeedUpdate) > 0 { - if err = rc.updateStates(volumesNeedUpdate); err != nil { - glog.Errorf("Error occurred during reconstruct volume from disk: %v", err) - } - } - if len(volumeNeedReport) > 0 { - rc.desiredStateOfWorld.MarkVolumesReportedInUse(volumeNeedReport) - } -} - -func (rc *reconciler) cleanupMounts(volume podVolume) { - glog.V(2).Infof("Reconciler sync states: could not find information (PID: %s) (Volume SpecName: %s) in desired state, clean up the mount points", - volume.podName, volume.volumeSpecName) - mountedVolume := operationexecutor.MountedVolume{ - PodName: volume.podName, - VolumeName: v1.UniqueVolumeName(volume.volumeSpecName), - InnerVolumeSpecName: volume.volumeSpecName, - PluginName: volume.pluginName, - PodUID: types.UID(volume.podName), - } - // TODO: Currently cleanupMounts only includes UnmountVolume operation. In the next PR, we will add - // to unmount both volume and device in the same routine. - err := rc.operationExecutor.UnmountVolume(mountedVolume, rc.actualStateOfWorld, rc.kubeletPodsDir) - if err != nil { - glog.Errorf(mountedVolume.GenerateErrorDetailed(fmt.Sprintf("volumeHandler.UnmountVolumeHandler for UnmountVolume failed"), err).Error()) - return - } -} - -// Reconstruct volume data structure by reading the pod's volume directories -func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, error) { - // plugin initializations - plugin, err := rc.volumePluginMgr.FindPluginByName(volume.pluginName) - if err != nil { - return nil, err - } - attachablePlugin, err := rc.volumePluginMgr.FindAttachablePluginByName(volume.pluginName) - if err != nil { - return nil, err - } - - // Create pod object - pod := &v1.Pod{ - ObjectMeta: metav1.ObjectMeta{ - UID: types.UID(volume.podName), - }, - } - mapperPlugin, err := rc.volumePluginMgr.FindMapperPluginByName(volume.pluginName) - if err != nil { - return nil, err - } - volumeSpec, err := rc.operationExecutor.ReconstructVolumeOperation( - volume.volumeMode, - plugin, - mapperPlugin, - pod.UID, - volume.podName, - volume.volumeSpecName, - volume.mountPath, - volume.pluginName) - if err != nil { - return nil, err - } - - var uniqueVolumeName v1.UniqueVolumeName - if attachablePlugin != nil { - uniqueVolumeName, err = util.GetUniqueVolumeNameFromSpec(plugin, volumeSpec) - if err != nil { - return nil, err - } - } else { - uniqueVolumeName = util.GetUniqueVolumeNameForNonAttachableVolume(volume.podName, plugin, volumeSpec) - } - // Check existence of mount point for filesystem volume or symbolic link for block volume - isExist, checkErr := rc.operationExecutor.CheckVolumeExistenceOperation(volumeSpec, volume.mountPath, volumeSpec.Name(), rc.mounter, uniqueVolumeName, volume.podName, pod.UID, attachablePlugin) - if checkErr != nil { - return nil, checkErr - } - // If mount or symlink doesn't exist, volume reconstruction should be failed - if !isExist { - return nil, fmt.Errorf("Volume: %q is not mounted", uniqueVolumeName) - } - - volumeMounter, newMounterErr := plugin.NewMounter( - volumeSpec, - pod, - volumepkg.VolumeOptions{}) - if newMounterErr != nil { - return nil, fmt.Errorf( - "reconstructVolume.NewMounter failed for volume %q (spec.Name: %q) pod %q (UID: %q) with: %v", - uniqueVolumeName, - volumeSpec.Name(), - volume.podName, - pod.UID, - newMounterErr) - } - - // TODO: remove feature gate check after no longer needed - var volumeMapper volumepkg.BlockVolumeMapper - if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) && volume.volumeMode == v1.PersistentVolumeBlock { - var newMapperErr error - if mapperPlugin != nil { - volumeMapper, newMapperErr = mapperPlugin.NewBlockVolumeMapper( - volumeSpec, - pod, - volumepkg.VolumeOptions{}) - if newMapperErr != nil { - return nil, fmt.Errorf( - "reconstructVolume.NewBlockVolumeMapper failed for volume %q (spec.Name: %q) pod %q (UID: %q) with: %v", - uniqueVolumeName, - volumeSpec.Name(), - volume.podName, - pod.UID, - newMapperErr) - } - } - } - - reconstructedVolume := &reconstructedVolume{ - volumeName: uniqueVolumeName, - podName: volume.podName, - volumeSpec: volumeSpec, - // volume.volumeSpecName is actually InnerVolumeSpecName. It will not be used - // for volume cleanup. - // TODO: in case pod is added back before reconciler starts to unmount, we can update this field from desired state information - outerVolumeSpecName: volume.volumeSpecName, - pod: pod, - attachablePlugin: attachablePlugin, - volumeGidValue: "", - // devicePath is updated during updateStates() by checking node status's VolumesAttached data. - // TODO: get device path directly from the volume mount path. - devicePath: "", - mounter: volumeMounter, - blockVolumeMapper: volumeMapper, - } - return reconstructedVolume, nil -} - -// updateDevicePath gets the node status to retrieve volume device path information. -func (rc *reconciler) updateDevicePath(volumesNeedUpdate map[v1.UniqueVolumeName]*reconstructedVolume) { - node, fetchErr := rc.kubeClient.CoreV1().Nodes().Get(string(rc.nodeName), metav1.GetOptions{}) - if fetchErr != nil { - glog.Errorf("updateStates in reconciler: could not get node status with error %v", fetchErr) - } else { - for _, attachedVolume := range node.Status.VolumesAttached { - if volume, exists := volumesNeedUpdate[attachedVolume.Name]; exists { - volume.devicePath = attachedVolume.DevicePath - volumesNeedUpdate[attachedVolume.Name] = volume - glog.V(4).Infof("Update devicePath from node status for volume (%q): %q", attachedVolume.Name, volume.devicePath) - } - } - } -} - -func getDeviceMountPath(volume *reconstructedVolume) (string, error) { - volumeAttacher, err := volume.attachablePlugin.NewAttacher() - if volumeAttacher == nil || err != nil { - return "", err - } - deviceMountPath, err := - volumeAttacher.GetDeviceMountPath(volume.volumeSpec) - if err != nil { - return "", err - } - - if volume.blockVolumeMapper != nil { - deviceMountPath, err = - volume.blockVolumeMapper.GetGlobalMapPath(volume.volumeSpec) - if err != nil { - return "", err - } - } - return deviceMountPath, nil -} - -func (rc *reconciler) updateStates(volumesNeedUpdate map[v1.UniqueVolumeName]*reconstructedVolume) error { - // Get the node status to retrieve volume device path information. - rc.updateDevicePath(volumesNeedUpdate) - - for _, volume := range volumesNeedUpdate { - err := rc.actualStateOfWorld.MarkVolumeAsAttached( - //TODO: the devicePath might not be correct for some volume plugins: see issue #54108 - volume.volumeName, volume.volumeSpec, "" /* nodeName */, volume.devicePath) - if err != nil { - glog.Errorf("Could not add volume information to actual state of world: %v", err) - continue - } - err = rc.actualStateOfWorld.MarkVolumeAsMounted( - volume.podName, - types.UID(volume.podName), - volume.volumeName, - volume.mounter, - volume.blockVolumeMapper, - volume.outerVolumeSpecName, - volume.volumeGidValue, - volume.volumeSpec) - if err != nil { - glog.Errorf("Could not add pod to volume information to actual state of world: %v", err) - continue - } - glog.V(4).Infof("Volume: %s (pod UID %s) is marked as mounted and added into the actual state", volume.volumeName, volume.podName) - if volume.attachablePlugin != nil { - deviceMountPath, err := getDeviceMountPath(volume) - if err != nil { - glog.Errorf("Could not find device mount path for volume %s", volume.volumeName) - continue - } - err = rc.actualStateOfWorld.MarkDeviceAsMounted(volume.volumeName, volume.devicePath, deviceMountPath) - if err != nil { - glog.Errorf("Could not mark device is mounted to actual state of world: %v", err) - continue - } - glog.V(4).Infof("Volume: %s (pod UID %s) is marked device as mounted and added into the actual state", volume.volumeName, volume.podName) - } - } - return nil -} - -// getVolumesFromPodDir scans through the volumes directories under the given pod directory. -// It returns a list of pod volume information including pod's uid, volume's plugin name, mount path, -// and volume spec name. -func getVolumesFromPodDir(podDir string) ([]podVolume, error) { - podsDirInfo, err := ioutil.ReadDir(podDir) - if err != nil { - return nil, err - } - volumes := []podVolume{} - for i := range podsDirInfo { - if !podsDirInfo[i].IsDir() { - continue - } - podName := podsDirInfo[i].Name() - podDir := path.Join(podDir, podName) - - // Find filesystem volume information - // ex. filesystem volume: /pods/{podUid}/volume/{escapeQualifiedPluginName}/{volumeName} - volumesDirs := map[v1.PersistentVolumeMode]string{ - v1.PersistentVolumeFilesystem: path.Join(podDir, config.DefaultKubeletVolumesDirName), - } - // TODO: remove feature gate check after no longer needed - if utilfeature.DefaultFeatureGate.Enabled(features.BlockVolume) { - // Find block volume information - // ex. block volume: /pods/{podUid}/volumeDevices/{escapeQualifiedPluginName}/{volumeName} - volumesDirs[v1.PersistentVolumeBlock] = path.Join(podDir, config.DefaultKubeletVolumeDevicesDirName) - } - for volumeMode, volumesDir := range volumesDirs { - var volumesDirInfo []os.FileInfo - if volumesDirInfo, err = ioutil.ReadDir(volumesDir); err != nil { - // Just skip the loop because given volumesDir doesn't exist depending on volumeMode - continue - } - for _, volumeDir := range volumesDirInfo { - pluginName := volumeDir.Name() - volumePluginPath := path.Join(volumesDir, pluginName) - volumePluginDirs, err := utilfile.ReadDirNoStat(volumePluginPath) - if err != nil { - glog.Errorf("Could not read volume plugin directory %q: %v", volumePluginPath, err) - continue - } - unescapePluginName := utilstrings.UnescapeQualifiedNameForDisk(pluginName) - for _, volumeName := range volumePluginDirs { - mountPath := path.Join(volumePluginPath, volumeName) - glog.V(5).Infof("podName: %v, mount path from volume plugin directory: %v, ", podName, mountPath) - volumes = append(volumes, podVolume{ - podName: volumetypes.UniquePodName(podName), - volumeSpecName: volumeName, - mountPath: mountPath, - pluginName: unescapePluginName, - volumeMode: volumeMode, - }) - } - } - } - } - glog.V(4).Infof("Get volumes from pod directory %q %+v", podDir, volumes) - return volumes, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go deleted file mode 100644 index 5d5ad90a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go +++ /dev/null @@ -1,461 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 volumemanager - -import ( - "fmt" - "sort" - "strconv" - "time" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - k8stypes "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/apimachinery/pkg/util/wait" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/record" - "k8s.io/kubernetes/pkg/kubelet/config" - "k8s.io/kubernetes/pkg/kubelet/container" - "k8s.io/kubernetes/pkg/kubelet/pod" - "k8s.io/kubernetes/pkg/kubelet/status" - "k8s.io/kubernetes/pkg/kubelet/util/format" - "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache" - "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator" - "k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler" - "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/kubernetes/pkg/volume/util/operationexecutor" - "k8s.io/kubernetes/pkg/volume/util/types" - "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" -) - -const ( - // reconcilerLoopSleepPeriod is the amount of time the reconciler loop waits - // between successive executions - reconcilerLoopSleepPeriod time.Duration = 100 * time.Millisecond - - // reconcilerSyncStatesSleepPeriod is the amount of time the reconciler reconstruct process - // waits between successive executions - reconcilerSyncStatesSleepPeriod time.Duration = 3 * time.Minute - - // desiredStateOfWorldPopulatorLoopSleepPeriod is the amount of time the - // DesiredStateOfWorldPopulator loop waits between successive executions - desiredStateOfWorldPopulatorLoopSleepPeriod time.Duration = 100 * time.Millisecond - - // desiredStateOfWorldPopulatorGetPodStatusRetryDuration is the amount of - // time the DesiredStateOfWorldPopulator loop waits between successive pod - // cleanup calls (to prevent calling containerruntime.GetPodStatus too - // frequently). - desiredStateOfWorldPopulatorGetPodStatusRetryDuration time.Duration = 2 * time.Second - - // podAttachAndMountTimeout is the maximum amount of time the - // WaitForAttachAndMount call will wait for all volumes in the specified pod - // to be attached and mounted. Even though cloud operations can take several - // minutes to complete, we set the timeout to 2 minutes because kubelet - // will retry in the next sync iteration. This frees the associated - // goroutine of the pod to process newer updates if needed (e.g., a delete - // request to the pod). - // Value is slightly offset from 2 minutes to make timeouts due to this - // constant recognizable. - podAttachAndMountTimeout time.Duration = 2*time.Minute + 3*time.Second - - // podAttachAndMountRetryInterval is the amount of time the GetVolumesForPod - // call waits before retrying - podAttachAndMountRetryInterval time.Duration = 300 * time.Millisecond - - // waitForAttachTimeout is the maximum amount of time a - // operationexecutor.Mount call will wait for a volume to be attached. - // Set to 10 minutes because we've seen attach operations take several - // minutes to complete for some volume plugins in some cases. While this - // operation is waiting it only blocks other operations on the same device, - // other devices are not affected. - waitForAttachTimeout time.Duration = 10 * time.Minute -) - -// VolumeManager runs a set of asynchronous loops that figure out which volumes -// need to be attached/mounted/unmounted/detached based on the pods scheduled on -// this node and makes it so. -type VolumeManager interface { - // Starts the volume manager and all the asynchronous loops that it controls - Run(sourcesReady config.SourcesReady, stopCh <-chan struct{}) - - // WaitForAttachAndMount processes the volumes referenced in the specified - // pod and blocks until they are all attached and mounted (reflected in - // actual state of the world). - // An error is returned if all volumes are not attached and mounted within - // the duration defined in podAttachAndMountTimeout. - WaitForAttachAndMount(pod *v1.Pod) error - - // GetMountedVolumesForPod returns a VolumeMap containing the volumes - // referenced by the specified pod that are successfully attached and - // mounted. The key in the map is the OuterVolumeSpecName (i.e. - // pod.Spec.Volumes[x].Name). It returns an empty VolumeMap if pod has no - // volumes. - GetMountedVolumesForPod(podName types.UniquePodName) container.VolumeMap - - // GetExtraSupplementalGroupsForPod returns a list of the extra - // supplemental groups for the Pod. These extra supplemental groups come - // from annotations on persistent volumes that the pod depends on. - GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 - - // GetVolumesInUse returns a list of all volumes that implement the volume.Attacher - // interface and are currently in use according to the actual and desired - // state of the world caches. A volume is considered "in use" as soon as it - // is added to the desired state of world, indicating it *should* be - // attached to this node and remains "in use" until it is removed from both - // the desired state of the world and the actual state of the world, or it - // has been unmounted (as indicated in actual state of world). - GetVolumesInUse() []v1.UniqueVolumeName - - // ReconcilerStatesHasBeenSynced returns true only after the actual states in reconciler - // has been synced at least once after kubelet starts so that it is safe to update mounted - // volume list retrieved from actual state. - ReconcilerStatesHasBeenSynced() bool - - // VolumeIsAttached returns true if the given volume is attached to this - // node. - VolumeIsAttached(volumeName v1.UniqueVolumeName) bool - - // Marks the specified volume as having successfully been reported as "in - // use" in the nodes's volume status. - MarkVolumesAsReportedInUse(volumesReportedAsInUse []v1.UniqueVolumeName) -} - -// NewVolumeManager returns a new concrete instance implementing the -// VolumeManager interface. -// -// kubeClient - kubeClient is the kube API client used by DesiredStateOfWorldPopulator -// to communicate with the API server to fetch PV and PVC objects -// volumePluginMgr - the volume plugin manager used to access volume plugins. -// Must be pre-initialized. -func NewVolumeManager( - controllerAttachDetachEnabled bool, - nodeName k8stypes.NodeName, - podManager pod.Manager, - podStatusProvider status.PodStatusProvider, - kubeClient clientset.Interface, - volumePluginMgr *volume.VolumePluginMgr, - kubeContainerRuntime container.Runtime, - mounter mount.Interface, - kubeletPodsDir string, - recorder record.EventRecorder, - checkNodeCapabilitiesBeforeMount bool, - keepTerminatedPodVolumes bool) VolumeManager { - - vm := &volumeManager{ - kubeClient: kubeClient, - volumePluginMgr: volumePluginMgr, - desiredStateOfWorld: cache.NewDesiredStateOfWorld(volumePluginMgr), - actualStateOfWorld: cache.NewActualStateOfWorld(nodeName, volumePluginMgr), - operationExecutor: operationexecutor.NewOperationExecutor(operationexecutor.NewOperationGenerator( - kubeClient, - volumePluginMgr, - recorder, - checkNodeCapabilitiesBeforeMount, - volumepathhandler.NewBlockVolumePathHandler())), - } - - vm.desiredStateOfWorldPopulator = populator.NewDesiredStateOfWorldPopulator( - kubeClient, - desiredStateOfWorldPopulatorLoopSleepPeriod, - desiredStateOfWorldPopulatorGetPodStatusRetryDuration, - podManager, - podStatusProvider, - vm.desiredStateOfWorld, - vm.actualStateOfWorld, - kubeContainerRuntime, - keepTerminatedPodVolumes) - vm.reconciler = reconciler.NewReconciler( - kubeClient, - controllerAttachDetachEnabled, - reconcilerLoopSleepPeriod, - reconcilerSyncStatesSleepPeriod, - waitForAttachTimeout, - nodeName, - vm.desiredStateOfWorld, - vm.actualStateOfWorld, - vm.desiredStateOfWorldPopulator.HasAddedPods, - vm.operationExecutor, - mounter, - volumePluginMgr, - kubeletPodsDir) - - return vm -} - -// volumeManager implements the VolumeManager interface -type volumeManager struct { - // kubeClient is the kube API client used by DesiredStateOfWorldPopulator to - // communicate with the API server to fetch PV and PVC objects - kubeClient clientset.Interface - - // volumePluginMgr is the volume plugin manager used to access volume - // plugins. It must be pre-initialized. - volumePluginMgr *volume.VolumePluginMgr - - // desiredStateOfWorld is a data structure containing the desired state of - // the world according to the volume manager: i.e. what volumes should be - // attached and which pods are referencing the volumes). - // The data structure is populated by the desired state of the world - // populator using the kubelet pod manager. - desiredStateOfWorld cache.DesiredStateOfWorld - - // actualStateOfWorld is a data structure containing the actual state of - // the world according to the manager: i.e. which volumes are attached to - // this node and what pods the volumes are mounted to. - // The data structure is populated upon successful completion of attach, - // detach, mount, and unmount actions triggered by the reconciler. - actualStateOfWorld cache.ActualStateOfWorld - - // operationExecutor is used to start asynchronous attach, detach, mount, - // and unmount operations. - operationExecutor operationexecutor.OperationExecutor - - // reconciler runs an asynchronous periodic loop to reconcile the - // desiredStateOfWorld with the actualStateOfWorld by triggering attach, - // detach, mount, and unmount operations using the operationExecutor. - reconciler reconciler.Reconciler - - // desiredStateOfWorldPopulator runs an asynchronous periodic loop to - // populate the desiredStateOfWorld using the kubelet PodManager. - desiredStateOfWorldPopulator populator.DesiredStateOfWorldPopulator -} - -func (vm *volumeManager) Run(sourcesReady config.SourcesReady, stopCh <-chan struct{}) { - defer runtime.HandleCrash() - - go vm.desiredStateOfWorldPopulator.Run(sourcesReady, stopCh) - glog.V(2).Infof("The desired_state_of_world populator starts") - - glog.Infof("Starting Kubelet Volume Manager") - go vm.reconciler.Run(stopCh) - - <-stopCh - glog.Infof("Shutting down Kubelet Volume Manager") -} - -func (vm *volumeManager) GetMountedVolumesForPod(podName types.UniquePodName) container.VolumeMap { - podVolumes := make(container.VolumeMap) - for _, mountedVolume := range vm.actualStateOfWorld.GetMountedVolumesForPod(podName) { - podVolumes[mountedVolume.OuterVolumeSpecName] = container.VolumeInfo{ - Mounter: mountedVolume.Mounter, - BlockVolumeMapper: mountedVolume.BlockVolumeMapper, - ReadOnly: mountedVolume.VolumeSpec.ReadOnly, - InnerVolumeSpecName: mountedVolume.InnerVolumeSpecName, - } - } - return podVolumes -} - -func (vm *volumeManager) GetExtraSupplementalGroupsForPod(pod *v1.Pod) []int64 { - podName := util.GetUniquePodName(pod) - supplementalGroups := sets.NewString() - - for _, mountedVolume := range vm.actualStateOfWorld.GetMountedVolumesForPod(podName) { - if mountedVolume.VolumeGidValue != "" { - supplementalGroups.Insert(mountedVolume.VolumeGidValue) - } - } - - result := make([]int64, 0, supplementalGroups.Len()) - for _, group := range supplementalGroups.List() { - iGroup, extra := getExtraSupplementalGid(group, pod) - if !extra { - continue - } - - result = append(result, int64(iGroup)) - } - - return result -} - -func (vm *volumeManager) GetVolumesInUse() []v1.UniqueVolumeName { - // Report volumes in desired state of world and actual state of world so - // that volumes are marked in use as soon as the decision is made that the - // volume *should* be attached to this node until it is safely unmounted. - desiredVolumes := vm.desiredStateOfWorld.GetVolumesToMount() - mountedVolumes := vm.actualStateOfWorld.GetGloballyMountedVolumes() - volumesToReportInUse := make([]v1.UniqueVolumeName, 0, len(desiredVolumes)+len(mountedVolumes)) - desiredVolumesMap := make(map[v1.UniqueVolumeName]bool, len(desiredVolumes)+len(mountedVolumes)) - - for _, volume := range desiredVolumes { - if volume.PluginIsAttachable { - if _, exists := desiredVolumesMap[volume.VolumeName]; !exists { - desiredVolumesMap[volume.VolumeName] = true - volumesToReportInUse = append(volumesToReportInUse, volume.VolumeName) - } - } - } - - for _, volume := range mountedVolumes { - if volume.PluginIsAttachable { - if _, exists := desiredVolumesMap[volume.VolumeName]; !exists { - volumesToReportInUse = append(volumesToReportInUse, volume.VolumeName) - } - } - } - - sort.Slice(volumesToReportInUse, func(i, j int) bool { - return string(volumesToReportInUse[i]) < string(volumesToReportInUse[j]) - }) - return volumesToReportInUse -} - -func (vm *volumeManager) ReconcilerStatesHasBeenSynced() bool { - return vm.reconciler.StatesHasBeenSynced() -} - -func (vm *volumeManager) VolumeIsAttached( - volumeName v1.UniqueVolumeName) bool { - return vm.actualStateOfWorld.VolumeExists(volumeName) -} - -func (vm *volumeManager) MarkVolumesAsReportedInUse( - volumesReportedAsInUse []v1.UniqueVolumeName) { - vm.desiredStateOfWorld.MarkVolumesReportedInUse(volumesReportedAsInUse) -} - -func (vm *volumeManager) WaitForAttachAndMount(pod *v1.Pod) error { - if pod == nil { - return nil - } - - expectedVolumes := getExpectedVolumes(pod) - if len(expectedVolumes) == 0 { - // No volumes to verify - return nil - } - - glog.V(3).Infof("Waiting for volumes to attach and mount for pod %q", format.Pod(pod)) - uniquePodName := util.GetUniquePodName(pod) - - // Some pods expect to have Setup called over and over again to update. - // Remount plugins for which this is true. (Atomically updating volumes, - // like Downward API, depend on this to update the contents of the volume). - vm.desiredStateOfWorldPopulator.ReprocessPod(uniquePodName) - - err := wait.Poll( - podAttachAndMountRetryInterval, - podAttachAndMountTimeout, - vm.verifyVolumesMountedFunc(uniquePodName, expectedVolumes)) - - if err != nil { - // Timeout expired - unmountedVolumes := - vm.getUnmountedVolumes(uniquePodName, expectedVolumes) - // Also get unattached volumes for error message - unattachedVolumes := - vm.getUnattachedVolumes(expectedVolumes) - - if len(unmountedVolumes) == 0 { - return nil - } - - return fmt.Errorf( - "timeout expired waiting for volumes to attach or mount for pod %q/%q. list of unmounted volumes=%v. list of unattached volumes=%v", - pod.Namespace, - pod.Name, - unmountedVolumes, - unattachedVolumes) - } - - glog.V(3).Infof("All volumes are attached and mounted for pod %q", format.Pod(pod)) - return nil -} - -// getUnattachedVolumes returns a list of the volumes that are expected to be attached but -// are not currently attached to the node -func (vm *volumeManager) getUnattachedVolumes(expectedVolumes []string) []string { - unattachedVolumes := []string{} - for _, volume := range expectedVolumes { - if !vm.actualStateOfWorld.VolumeExists(v1.UniqueVolumeName(volume)) { - unattachedVolumes = append(unattachedVolumes, volume) - } - } - return unattachedVolumes -} - -// verifyVolumesMountedFunc returns a method that returns true when all expected -// volumes are mounted. -func (vm *volumeManager) verifyVolumesMountedFunc(podName types.UniquePodName, expectedVolumes []string) wait.ConditionFunc { - return func() (done bool, err error) { - return len(vm.getUnmountedVolumes(podName, expectedVolumes)) == 0, nil - } -} - -// getUnmountedVolumes fetches the current list of mounted volumes from -// the actual state of the world, and uses it to process the list of -// expectedVolumes. It returns a list of unmounted volumes. -func (vm *volumeManager) getUnmountedVolumes(podName types.UniquePodName, expectedVolumes []string) []string { - mountedVolumes := sets.NewString() - for _, mountedVolume := range vm.actualStateOfWorld.GetMountedVolumesForPod(podName) { - mountedVolumes.Insert(mountedVolume.OuterVolumeSpecName) - } - return filterUnmountedVolumes(mountedVolumes, expectedVolumes) -} - -// filterUnmountedVolumes adds each element of expectedVolumes that is not in -// mountedVolumes to a list of unmountedVolumes and returns it. -func filterUnmountedVolumes(mountedVolumes sets.String, expectedVolumes []string) []string { - unmountedVolumes := []string{} - for _, expectedVolume := range expectedVolumes { - if !mountedVolumes.Has(expectedVolume) { - unmountedVolumes = append(unmountedVolumes, expectedVolume) - } - } - return unmountedVolumes -} - -// getExpectedVolumes returns a list of volumes that must be mounted in order to -// consider the volume setup step for this pod satisfied. -func getExpectedVolumes(pod *v1.Pod) []string { - expectedVolumes := []string{} - - for _, podVolume := range pod.Spec.Volumes { - expectedVolumes = append(expectedVolumes, podVolume.Name) - } - - return expectedVolumes -} - -// getExtraSupplementalGid returns the value of an extra supplemental GID as -// defined by an annotation on a volume and a boolean indicating whether the -// volume defined a GID that the pod doesn't already request. -func getExtraSupplementalGid(volumeGidValue string, pod *v1.Pod) (int64, bool) { - if volumeGidValue == "" { - return 0, false - } - - gid, err := strconv.ParseInt(volumeGidValue, 10, 64) - if err != nil { - return 0, false - } - - if pod.Spec.SecurityContext != nil { - for _, existingGid := range pod.Spec.SecurityContext.SupplementalGroups { - if gid == int64(existingGid) { - return 0, false - } - } - } - - return gid, true -} diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD b/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD index e82b2ece..731b8630 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/winstats/BUILD @@ -4,25 +4,21 @@ go_library( name = "go_default_library", srcs = [ "doc.go", - ] + select({ - "@io_bazel_rules_go//go/platform:windows": [ - "perfcounter_nodestats.go", - "perfcounters.go", - "version.go", - "winstats.go", - ], - "//conditions:default": [], - }), + "perfcounter_nodestats.go", + "perfcounters.go", + "version.go", + "winstats.go", + ], importpath = "k8s.io/kubernetes/pkg/kubelet/winstats", visibility = ["//visibility:public"], deps = select({ "@io_bazel_rules_go//go/platform:windows": [ + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/github.com/JeffAshton/win_pdh:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", "//vendor/github.com/google/cadvisor/info/v2:go_default_library", "//vendor/golang.org/x/sys/windows:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], "//conditions:default": [], }), @@ -30,12 +26,7 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:windows": [ - "winstats_test.go", - ], - "//conditions:default": [], - }), + srcs = ["winstats_test.go"], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:windows": [ diff --git a/vendor/k8s.io/kubernetes/pkg/master/ports/ports.go b/vendor/k8s.io/kubernetes/pkg/master/ports/ports.go index d4a42f60..19207a10 100644 --- a/vendor/k8s.io/kubernetes/pkg/master/ports/ports.go +++ b/vendor/k8s.io/kubernetes/pkg/master/ports/ports.go @@ -28,9 +28,11 @@ const ( SchedulerPort = 10251 // InsecureKubeControllerManagerPort is the default port for the controller manager status server. // May be overridden by a flag at startup. + // Deprecated: use the secure KubeControllerManagerPort instead. InsecureKubeControllerManagerPort = 10252 // InsecureCloudControllerManagerPort is the default port for the cloud controller manager server. // This value may be overridden by a flag at startup. + // Deprecated: use the secure CloudControllerManagerPort instead. InsecureCloudControllerManagerPort = 10253 // KubeletReadOnlyPort exposes basic read-only services from the kubelet. // May be overridden by a flag at startup. @@ -41,4 +43,10 @@ const ( // ProxyHealthzPort is the default port for the proxy healthz server. // May be overridden by a flag at startup. ProxyHealthzPort = 10256 + // KubeControllerManagerPort is the default port for the controller manager status server. + // May be overridden by a flag at startup. + KubeControllerManagerPort = 10257 + // CloudControllerManagerPort is the default port for the cloud controller manager server. + // This value may be overridden by a flag at startup. + CloudControllerManagerPort = 10258 ) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/BUILD b/vendor/k8s.io/kubernetes/pkg/probe/BUILD deleted file mode 100644 index 51c23b1d..00000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "probe.go", - ], - importpath = "k8s.io/kubernetes/pkg/probe", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/probe/exec:all-srcs", - "//pkg/probe/http:all-srcs", - "//pkg/probe/tcp:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/doc.go b/vendor/k8s.io/kubernetes/pkg/probe/doc.go deleted file mode 100644 index 10fad970..00000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 probe contains utilities for health probing, as well as health status information. -package probe // import "k8s.io/kubernetes/pkg/probe" diff --git a/vendor/k8s.io/kubernetes/pkg/probe/exec/exec.go b/vendor/k8s.io/kubernetes/pkg/probe/exec/exec.go deleted file mode 100644 index 817492a6..00000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/exec/exec.go +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 exec - -import ( - "k8s.io/kubernetes/pkg/probe" - "k8s.io/utils/exec" - - "github.com/golang/glog" -) - -func New() ExecProber { - return execProber{} -} - -type ExecProber interface { - Probe(e exec.Cmd) (probe.Result, string, error) -} - -type execProber struct{} - -func (pr execProber) Probe(e exec.Cmd) (probe.Result, string, error) { - data, err := e.CombinedOutput() - glog.V(4).Infof("Exec probe response: %q", string(data)) - if err != nil { - exit, ok := err.(exec.ExitError) - if ok { - if exit.ExitStatus() == 0 { - return probe.Success, string(data), nil - } else { - return probe.Failure, string(data), nil - } - } - return probe.Unknown, "", err - } - return probe.Success, string(data), nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/probe/http/BUILD b/vendor/k8s.io/kubernetes/pkg/probe/http/BUILD deleted file mode 100644 index c411f77f..00000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/http/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["http.go"], - importpath = "k8s.io/kubernetes/pkg/probe/http", - deps = [ - "//pkg/probe:go_default_library", - "//pkg/version:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["http_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/probe:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/http/http.go b/vendor/k8s.io/kubernetes/pkg/probe/http/http.go deleted file mode 100644 index b9821be0..00000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/http/http.go +++ /dev/null @@ -1,101 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 http - -import ( - "crypto/tls" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "time" - - utilnet "k8s.io/apimachinery/pkg/util/net" - "k8s.io/kubernetes/pkg/probe" - "k8s.io/kubernetes/pkg/version" - - "github.com/golang/glog" -) - -func New() HTTPProber { - tlsConfig := &tls.Config{InsecureSkipVerify: true} - return NewWithTLSConfig(tlsConfig) -} - -// NewWithTLSConfig takes tls config as parameter. -func NewWithTLSConfig(config *tls.Config) HTTPProber { - transport := utilnet.SetTransportDefaults(&http.Transport{TLSClientConfig: config, DisableKeepAlives: true}) - return httpProber{transport} -} - -type HTTPProber interface { - Probe(url *url.URL, headers http.Header, timeout time.Duration) (probe.Result, string, error) -} - -type httpProber struct { - transport *http.Transport -} - -// Probe returns a ProbeRunner capable of running an http check. -func (pr httpProber) Probe(url *url.URL, headers http.Header, timeout time.Duration) (probe.Result, string, error) { - return DoHTTPProbe(url, headers, &http.Client{Timeout: timeout, Transport: pr.transport}) -} - -type HTTPGetInterface interface { - Do(req *http.Request) (*http.Response, error) -} - -// DoHTTPProbe checks if a GET request to the url succeeds. -// If the HTTP response code is successful (i.e. 400 > code >= 200), it returns Success. -// If the HTTP response code is unsuccessful or HTTP communication fails, it returns Failure. -// This is exported because some other packages may want to do direct HTTP probes. -func DoHTTPProbe(url *url.URL, headers http.Header, client HTTPGetInterface) (probe.Result, string, error) { - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - // Convert errors into failures to catch timeouts. - return probe.Failure, err.Error(), nil - } - if _, ok := headers["User-Agent"]; !ok { - if headers == nil { - headers = http.Header{} - } - // explicitly set User-Agent so it's not set to default Go value - v := version.Get() - headers.Set("User-Agent", fmt.Sprintf("kube-probe/%s.%s", v.Major, v.Minor)) - } - req.Header = headers - if headers.Get("Host") != "" { - req.Host = headers.Get("Host") - } - res, err := client.Do(req) - if err != nil { - // Convert errors into failures to catch timeouts. - return probe.Failure, err.Error(), nil - } - defer res.Body.Close() - b, err := ioutil.ReadAll(res.Body) - if err != nil { - return probe.Failure, "", err - } - body := string(b) - if res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusBadRequest { - glog.V(4).Infof("Probe succeeded for %s, Response: %v", url.String(), *res) - return probe.Success, body, nil - } - glog.V(4).Infof("Probe failed for %s with request headers %v, response body: %v", url.String(), headers, body) - return probe.Failure, fmt.Sprintf("HTTP probe failed with statuscode: %d", res.StatusCode), nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD b/vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD deleted file mode 100644 index b14c197e..00000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/tcp/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["tcp.go"], - importpath = "k8s.io/kubernetes/pkg/probe/tcp", - deps = [ - "//pkg/probe:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["tcp_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/probe:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/probe/tcp/tcp.go b/vendor/k8s.io/kubernetes/pkg/probe/tcp/tcp.go deleted file mode 100644 index cce3be99..00000000 --- a/vendor/k8s.io/kubernetes/pkg/probe/tcp/tcp.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 tcp - -import ( - "net" - "strconv" - "time" - - "k8s.io/kubernetes/pkg/probe" - - "github.com/golang/glog" -) - -func New() TCPProber { - return tcpProber{} -} - -type TCPProber interface { - Probe(host string, port int, timeout time.Duration) (probe.Result, string, error) -} - -type tcpProber struct{} - -func (pr tcpProber) Probe(host string, port int, timeout time.Duration) (probe.Result, string, error) { - return DoTCPProbe(net.JoinHostPort(host, strconv.Itoa(port)), timeout) -} - -// DoTCPProbe checks that a TCP socket to the address can be opened. -// If the socket can be opened, it returns Success -// If the socket fails to open, it returns Failure. -// This is exported because some other packages may want to do direct TCP probes. -func DoTCPProbe(addr string, timeout time.Duration) (probe.Result, string, error) { - conn, err := net.DialTimeout("tcp", addr, timeout) - if err != nil { - // Convert errors to failures to handle timeouts. - return probe.Failure, err.Error(), nil - } - err = conn.Close() - if err != nil { - glog.Errorf("Unexpected error closing TCP probe socket: %v (%#v)", err, err) - } - return probe.Success, "", nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/BUILD index bb5b4b61..9920c511 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/proxy/BUILD @@ -16,14 +16,14 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/proxy", deps = [ - "//pkg/api/service:go_default_library", - "//pkg/apis/core:go_default_library", + "//pkg/api/v1/service:go_default_library", "//pkg/proxy/util:go_default_library", "//pkg/util/net:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", ], ) @@ -38,7 +38,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", - "//pkg/proxy/apis/kubeproxyconfig:all-srcs", + "//pkg/proxy/apis/config:all-srcs", "//pkg/proxy/config:all-srcs", "//pkg/proxy/healthcheck:all-srcs", "//pkg/proxy/iptables:all-srcs", @@ -60,11 +60,11 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//pkg/apis/core:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/OWNERS b/vendor/k8s.io/kubernetes/pkg/proxy/OWNERS index 040ab1aa..82821828 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/proxy/OWNERS @@ -12,3 +12,5 @@ reviewers: - dcbw - m1093782566 - danwinship +labels: +- sig/network diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go b/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go index 36f53c98..06c7d3ad 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go @@ -24,10 +24,10 @@ import ( "github.com/golang/glog" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/tools/record" - api "k8s.io/kubernetes/pkg/apis/core" utilproxy "k8s.io/kubernetes/pkg/proxy/util" utilnet "k8s.io/kubernetes/pkg/util/net" ) @@ -113,7 +113,7 @@ func NewEndpointChangeTracker(hostname string, makeEndpointInfo makeEndpointFunc // - pass as the pair. // Delete item // - pass as the pair. -func (ect *EndpointChangeTracker) Update(previous, current *api.Endpoints) bool { +func (ect *EndpointChangeTracker) Update(previous, current *v1.Endpoints) bool { endpoints := current if endpoints == nil { endpoints = previous @@ -184,7 +184,7 @@ type EndpointsMap map[ServicePortName][]Endpoint // This function is used for incremental updated of endpointsMap. // // NOTE: endpoints object should NOT be modified. -func (ect *EndpointChangeTracker) endpointsToEndpointsMap(endpoints *api.Endpoints) EndpointsMap { +func (ect *EndpointChangeTracker) endpointsToEndpointsMap(endpoints *v1.Endpoints) EndpointsMap { if endpoints == nil { return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD index 859600f0..b711fcdb 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/proxy/healthcheck/BUILD @@ -15,13 +15,13 @@ go_library( importpath = "k8s.io/kubernetes/pkg/proxy/healthcheck", deps = [ "//pkg/apis/core:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/renstrom/dedent:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", ], ) @@ -30,10 +30,10 @@ go_test( srcs = ["healthcheck_test.go"], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD index c8bdf903..1fb18753 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/proxy/iptables/BUILD @@ -8,12 +8,9 @@ load( go_library( name = "go_default_library", - srcs = [ - "proxier.go", - ], + srcs = ["proxier.go"], importpath = "k8s.io/kubernetes/pkg/proxy/iptables", deps = [ - "//pkg/apis/core:go_default_library", "//pkg/proxy:go_default_library", "//pkg/proxy/healthcheck:go_default_library", "//pkg/proxy/metrics:go_default_library", @@ -24,11 +21,11 @@ go_library( "//pkg/util/net:go_default_library", "//pkg/util/sysctl:go_default_library", "//pkg/util/version:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) @@ -38,7 +35,6 @@ go_test( srcs = ["proxier_test.go"], embed = [":go_default_library"], deps = [ - "//pkg/apis/core:go_default_library", "//pkg/proxy:go_default_library", "//pkg/proxy/util:go_default_library", "//pkg/proxy/util/testing:go_default_library", @@ -46,10 +42,11 @@ go_test( "//pkg/util/conntrack:go_default_library", "//pkg/util/iptables:go_default_library", "//pkg/util/iptables/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", ], diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go b/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go index a4338f62..41f03d49 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go @@ -38,7 +38,6 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/record" - api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/proxy" "k8s.io/kubernetes/pkg/proxy/healthcheck" "k8s.io/kubernetes/pkg/proxy/metrics" @@ -149,7 +148,7 @@ type serviceInfo struct { } // returns a new proxy.ServicePort which abstracts a serviceInfo -func newServiceInfo(port *api.ServicePort, service *api.Service, baseInfo *proxy.BaseServiceInfo) proxy.ServicePort { +func newServiceInfo(port *v1.ServicePort, service *v1.Service, baseInfo *proxy.BaseServiceInfo) proxy.ServicePort { info := &serviceInfo{BaseServiceInfo: baseInfo} // Store the following for performance reasons. @@ -243,11 +242,18 @@ type Proxier struct { // The following buffers are used to reuse memory and avoid allocations // that are significantly impacting performance. - iptablesData *bytes.Buffer - filterChains *bytes.Buffer - filterRules *bytes.Buffer - natChains *bytes.Buffer - natRules *bytes.Buffer + iptablesData *bytes.Buffer + existingFilterChainsData *bytes.Buffer + filterChains *bytes.Buffer + filterRules *bytes.Buffer + natChains *bytes.Buffer + natRules *bytes.Buffer + + // endpointChainsNumber is the total amount of endpointChains across all + // services that we will generate (it is computed at the beginning of + // syncProxyRules method). If that is large enough, comments in some + // iptable rules are dropped to improve performance. + endpointChainsNumber int // Values are as a parameter to select the interfaces where nodeport works. nodePortAddresses []string @@ -335,6 +341,7 @@ func NewProxier(ipt utiliptables.Interface, healthzServer: healthzServer, precomputedProbabilities: make([]string, 0, 1001), iptablesData: bytes.NewBuffer(nil), + existingFilterChainsData: bytes.NewBuffer(nil), filterChains: bytes.NewBuffer(nil), filterRules: bytes.NewBuffer(nil), natChains: bytes.NewBuffer(nil), @@ -403,16 +410,16 @@ func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { for _, chain := range []utiliptables.Chain{kubeServicesChain, kubeNodePortsChain, kubePostroutingChain, KubeMarkMasqChain} { if _, found := existingNATChains[chain]; found { chainString := string(chain) - writeLine(natChains, existingNATChains[chain]) // flush - writeLine(natRules, "-X", chainString) // delete + writeBytesLine(natChains, existingNATChains[chain]) // flush + writeLine(natRules, "-X", chainString) // delete } } // Hunt for service and endpoint chains. for chain := range existingNATChains { chainString := string(chain) if strings.HasPrefix(chainString, "KUBE-SVC-") || strings.HasPrefix(chainString, "KUBE-SEP-") || strings.HasPrefix(chainString, "KUBE-FW-") || strings.HasPrefix(chainString, "KUBE-XLB-") { - writeLine(natChains, existingNATChains[chain]) // flush - writeLine(natRules, "-X", chainString) // delete + writeBytesLine(natChains, existingNATChains[chain]) // flush + writeLine(natRules, "-X", chainString) // delete } } writeLine(natRules, "COMMIT") @@ -426,7 +433,7 @@ func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { } // Flush and remove all of our "-t filter" chains. - iptablesData = bytes.NewBuffer(nil) + iptablesData.Reset() if err := ipt.SaveInto(utiliptables.TableFilter, iptablesData); err != nil { glog.Errorf("Failed to execute iptables-save for %s: %v", utiliptables.TableFilter, err) encounteredError = true @@ -438,7 +445,7 @@ func CleanupLeftovers(ipt utiliptables.Interface) (encounteredError bool) { for _, chain := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain} { if _, found := existingFilterChains[chain]; found { chainString := string(chain) - writeLine(filterChains, existingFilterChains[chain]) + writeBytesLine(filterChains, existingFilterChains[chain]) writeLine(filterRules, "-X", chainString) } } @@ -501,17 +508,17 @@ func (proxier *Proxier) isInitialized() bool { return atomic.LoadInt32(&proxier.initialized) > 0 } -func (proxier *Proxier) OnServiceAdd(service *api.Service) { +func (proxier *Proxier) OnServiceAdd(service *v1.Service) { proxier.OnServiceUpdate(nil, service) } -func (proxier *Proxier) OnServiceUpdate(oldService, service *api.Service) { +func (proxier *Proxier) OnServiceUpdate(oldService, service *v1.Service) { if proxier.serviceChanges.Update(oldService, service) && proxier.isInitialized() { proxier.syncRunner.Run() } } -func (proxier *Proxier) OnServiceDelete(service *api.Service) { +func (proxier *Proxier) OnServiceDelete(service *v1.Service) { proxier.OnServiceUpdate(service, nil) } @@ -526,17 +533,17 @@ func (proxier *Proxier) OnServiceSynced() { proxier.syncProxyRules() } -func (proxier *Proxier) OnEndpointsAdd(endpoints *api.Endpoints) { +func (proxier *Proxier) OnEndpointsAdd(endpoints *v1.Endpoints) { proxier.OnEndpointsUpdate(nil, endpoints) } -func (proxier *Proxier) OnEndpointsUpdate(oldEndpoints, endpoints *api.Endpoints) { +func (proxier *Proxier) OnEndpointsUpdate(oldEndpoints, endpoints *v1.Endpoints) { if proxier.endpointsChanges.Update(oldEndpoints, endpoints) && proxier.isInitialized() { proxier.syncRunner.Run() } } -func (proxier *Proxier) OnEndpointsDelete(endpoints *api.Endpoints) { +func (proxier *Proxier) OnEndpointsDelete(endpoints *v1.Endpoints) { proxier.OnEndpointsUpdate(endpoints, nil) } @@ -596,7 +603,7 @@ func servicePortEndpointChainName(servicePortName string, protocol string, endpo // TODO: move it to util func (proxier *Proxier) deleteEndpointConnections(connectionMap []proxy.ServiceEndpoint) { for _, epSvcPair := range connectionMap { - if svcInfo, ok := proxier.serviceMap[epSvcPair.ServicePortName]; ok && svcInfo.GetProtocol() == api.ProtocolUDP { + if svcInfo, ok := proxier.serviceMap[epSvcPair.ServicePortName]; ok && svcInfo.GetProtocol() == v1.ProtocolUDP { endpointIP := utilproxy.IPPart(epSvcPair.Endpoint) err := conntrack.ClearEntriesForNAT(proxier.exec, svcInfo.ClusterIPString(), endpointIP, v1.ProtocolUDP) if err != nil { @@ -606,6 +613,19 @@ func (proxier *Proxier) deleteEndpointConnections(connectionMap []proxy.ServiceE } } +const endpointChainsNumberThreshold = 1000 + +// Assumes proxier.mu is held. +func (proxier *Proxier) appendServiceCommentLocked(args []string, svcName string) { + // Not printing these comments, can reduce size of iptables (in case of large + // number of endpoints) even by 40%+. So if total number of endpoint chains + // is large enough, we simply drop those comments. + if proxier.endpointChainsNumber > endpointChainsNumberThreshold { + return + } + args = append(args, "-m", "comment", "--comment", svcName) +} + // This is where all of the iptables-save/restore calls happen. // The only other iptables rules are those that are setup in iptablesInit() // This assumes proxier.mu is NOT held @@ -633,7 +653,7 @@ func (proxier *Proxier) syncProxyRules() { staleServices := serviceUpdateResult.UDPStaleClusterIP // merge stale services gathered from updateEndpointsMap for _, svcPortName := range endpointUpdateResult.StaleServiceNames { - if svcInfo, ok := proxier.serviceMap[svcPortName]; ok && svcInfo != nil && svcInfo.GetProtocol() == api.ProtocolUDP { + if svcInfo, ok := proxier.serviceMap[svcPortName]; ok && svcInfo != nil && svcInfo.GetProtocol() == v1.ProtocolUDP { glog.V(2).Infof("Stale udp service %v -> %s", svcPortName, svcInfo.ClusterIPString()) staleServices.Insert(svcInfo.ClusterIPString()) } @@ -663,16 +683,17 @@ func (proxier *Proxier) syncProxyRules() { // Get iptables-save output so we can check for existing chains and rules. // This will be a map of chain name to chain with rules as stored in iptables-save/iptables-restore - existingFilterChains := make(map[utiliptables.Chain]string) - proxier.iptablesData.Reset() - err := proxier.iptables.SaveInto(utiliptables.TableFilter, proxier.iptablesData) + existingFilterChains := make(map[utiliptables.Chain][]byte) + proxier.existingFilterChainsData.Reset() + err := proxier.iptables.SaveInto(utiliptables.TableFilter, proxier.existingFilterChainsData) if err != nil { // if we failed to get any rules glog.Errorf("Failed to execute iptables-save, syncing all rules: %v", err) } else { // otherwise parse the output - existingFilterChains = utiliptables.GetChainLines(utiliptables.TableFilter, proxier.iptablesData.Bytes()) + existingFilterChains = utiliptables.GetChainLines(utiliptables.TableFilter, proxier.existingFilterChainsData.Bytes()) } - existingNATChains := make(map[utiliptables.Chain]string) + // IMPORTANT: existingNATChains may share memory with proxier.iptablesData. + existingNATChains := make(map[utiliptables.Chain][]byte) proxier.iptablesData.Reset() err = proxier.iptables.SaveInto(utiliptables.TableNAT, proxier.iptablesData) if err != nil { // if we failed to get any rules @@ -696,14 +717,14 @@ func (proxier *Proxier) syncProxyRules() { // (which most should have because we created them above). for _, chainName := range []utiliptables.Chain{kubeServicesChain, kubeExternalServicesChain, kubeForwardChain} { if chain, ok := existingFilterChains[chainName]; ok { - writeLine(proxier.filterChains, chain) + writeBytesLine(proxier.filterChains, chain) } else { writeLine(proxier.filterChains, utiliptables.MakeChainLine(chainName)) } } for _, chainName := range []utiliptables.Chain{kubeServicesChain, kubeNodePortsChain, kubePostroutingChain, KubeMarkMasqChain} { if chain, ok := existingNATChains[chainName]; ok { - writeLine(proxier.natChains, chain) + writeBytesLine(proxier.natChains, chain) } else { writeLine(proxier.natChains, utiliptables.MakeChainLine(chainName)) } @@ -747,6 +768,12 @@ func (proxier *Proxier) syncProxyRules() { // is just for efficiency, not correctness. args := make([]string, 64) + // Compute total number of endpoint chains across all services. + proxier.endpointChainsNumber = 0 + for svcName := range proxier.serviceMap { + proxier.endpointChainsNumber += len(proxier.endpointsMap[svcName]) + } + // Build rules for each service. for svcName, svc := range proxier.serviceMap { svcInfo, ok := svc.(*serviceInfo) @@ -763,7 +790,7 @@ func (proxier *Proxier) syncProxyRules() { if hasEndpoints { // Create the per-service chain, retaining counters if possible. if chain, ok := existingNATChains[svcChain]; ok { - writeLine(proxier.natChains, chain) + writeBytesLine(proxier.natChains, chain) } else { writeLine(proxier.natChains, utiliptables.MakeChainLine(svcChain)) } @@ -775,7 +802,7 @@ func (proxier *Proxier) syncProxyRules() { // Only for services request OnlyLocal traffic // create the per-service LB chain, retaining counters if possible. if lbChain, ok := existingNATChains[svcXlbChain]; ok { - writeLine(proxier.natChains, lbChain) + writeBytesLine(proxier.natChains, lbChain) } else { writeLine(proxier.natChains, utiliptables.MakeChainLine(svcXlbChain)) } @@ -820,7 +847,7 @@ func (proxier *Proxier) syncProxyRules() { // (because the socket might open but it would never work). if local, err := utilproxy.IsLocalIP(externalIP); err != nil { glog.Errorf("can't determine if IP is local, assuming not: %v", err) - } else if local { + } else if local && (svcInfo.GetProtocol() != v1.ProtocolSCTP) { lp := utilproxy.LocalPort{ Description: "externalIP for " + svcNameString, IP: externalIP, @@ -841,7 +868,7 @@ func (proxier *Proxier) syncProxyRules() { Name: proxier.hostname, UID: types.UID(proxier.hostname), Namespace: "", - }, api.EventTypeWarning, err.Error(), msg) + }, v1.EventTypeWarning, err.Error(), msg) glog.Error(msg) continue } @@ -891,7 +918,7 @@ func (proxier *Proxier) syncProxyRules() { if ingress.IP != "" { // create service firewall chain if chain, ok := existingNATChains[fwChain]; ok { - writeLine(proxier.natChains, chain) + writeBytesLine(proxier.natChains, chain) } else { writeLine(proxier.natChains, utiliptables.MakeChainLine(fwChain)) } @@ -989,7 +1016,7 @@ func (proxier *Proxier) syncProxyRules() { if proxier.portsMap[lp] != nil { glog.V(4).Infof("Port %s was open before and is still needed", lp.String()) replacementPortsMap[lp] = proxier.portsMap[lp] - } else { + } else if svcInfo.GetProtocol() != v1.ProtocolSCTP { socket, err := proxier.portMapper.OpenLocalPort(&lp) if err != nil { glog.Errorf("can't open %s, skipping this nodePort: %v", lp.String(), err) @@ -1067,7 +1094,7 @@ func (proxier *Proxier) syncProxyRules() { // Create the endpoint chain, retaining counters if possible. if chain, ok := existingNATChains[utiliptables.Chain(endpointChain)]; ok { - writeLine(proxier.natChains, chain) + writeBytesLine(proxier.natChains, chain) } else { writeLine(proxier.natChains, utiliptables.MakeChainLine(endpointChain)) } @@ -1075,14 +1102,18 @@ func (proxier *Proxier) syncProxyRules() { } // First write session affinity rules, if applicable. - if svcInfo.SessionAffinityType == api.ServiceAffinityClientIP { + if svcInfo.SessionAffinityType == v1.ServiceAffinityClientIP { for _, endpointChain := range endpointChains { - writeLine(proxier.natRules, + args = append(args[:0], "-A", string(svcChain), - "-m", "comment", "--comment", svcNameString, + ) + proxier.appendServiceCommentLocked(args, svcNameString) + args = append(args, "-m", "recent", "--name", string(endpointChain), "--rcheck", "--seconds", strconv.Itoa(svcInfo.StickyMaxAgeSeconds), "--reap", - "-j", string(endpointChain)) + "-j", string(endpointChain), + ) + writeLine(proxier.natRules, args...) } } @@ -1095,10 +1126,8 @@ func (proxier *Proxier) syncProxyRules() { continue } // Balancing rules in the per-service chain. - args = append(args[:0], []string{ - "-A", string(svcChain), - "-m", "comment", "--comment", svcNameString, - }...) + args = append(args[:0], "-A", string(svcChain)) + proxier.appendServiceCommentLocked(args, svcNameString) if i < (n - 1) { // Each rule is a probabilistic match. args = append(args, @@ -1111,16 +1140,14 @@ func (proxier *Proxier) syncProxyRules() { writeLine(proxier.natRules, args...) // Rules in the per-endpoint chain. - args = append(args[:0], - "-A", string(endpointChain), - "-m", "comment", "--comment", svcNameString, - ) + args = append(args[:0], "-A", string(endpointChain)) + proxier.appendServiceCommentLocked(args, svcNameString) // Handle traffic that loops back to the originator with SNAT. writeLine(proxier.natRules, append(args, "-s", utilproxy.ToCIDR(net.ParseIP(epIP)), "-j", string(KubeMarkMasqChain))...) // Update client-affinity lists. - if svcInfo.SessionAffinityType == api.ServiceAffinityClientIP { + if svcInfo.SessionAffinityType == v1.ServiceAffinityClientIP { args = append(args, "-m", "recent", "--name", string(endpointChain), "--set") } // DNAT to final destination. @@ -1171,7 +1198,7 @@ func (proxier *Proxier) syncProxyRules() { writeLine(proxier.natRules, args...) } else { // First write session affinity rules only over local endpoints, if applicable. - if svcInfo.SessionAffinityType == api.ServiceAffinityClientIP { + if svcInfo.SessionAffinityType == v1.ServiceAffinityClientIP { for _, endpointChain := range localEndpointChains { writeLine(proxier.natRules, "-A", string(svcXlbChain), @@ -1215,7 +1242,7 @@ func (proxier *Proxier) syncProxyRules() { // We must (as per iptables) write a chain-line for it, which has // the nice effect of flushing the chain. Then we can remove the // chain. - writeLine(proxier.natChains, existingNATChains[chain]) + writeBytesLine(proxier.natChains, existingNATChains[chain]) writeLine(proxier.natRules, "-X", chainString) } } @@ -1330,7 +1357,7 @@ func (proxier *Proxier) syncProxyRules() { glog.Errorf("Error syncing healtcheck services: %v", err) } if err := proxier.healthChecker.SyncEndpoints(endpointUpdateResult.HCEndpointsLocalIPSize); err != nil { - glog.Errorf("Error syncing healthcheck endoints: %v", err) + glog.Errorf("Error syncing healthcheck endpoints: %v", err) } // Finish housekeeping. @@ -1356,6 +1383,11 @@ func writeLine(buf *bytes.Buffer, words ...string) { } } +func writeBytesLine(buf *bytes.Buffer, bytes []byte) { + buf.Write(bytes) + buf.WriteByte('\n') +} + func openLocalPort(lp *utilproxy.LocalPort) (utilproxy.Closeable, error) { // For ports on node IPs, open the actual port and hold it, even though we // use iptables to redirect traffic. diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/service.go b/vendor/k8s.io/kubernetes/pkg/proxy/service.go index 88e80451..5853ef9c 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/service.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/service.go @@ -25,11 +25,11 @@ import ( "github.com/golang/glog" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/tools/record" - apiservice "k8s.io/kubernetes/pkg/api/service" - api "k8s.io/kubernetes/pkg/apis/core" + apiservice "k8s.io/kubernetes/pkg/api/v1/service" utilproxy "k8s.io/kubernetes/pkg/proxy/util" utilnet "k8s.io/kubernetes/pkg/util/net" ) @@ -41,10 +41,10 @@ import ( type BaseServiceInfo struct { ClusterIP net.IP Port int - Protocol api.Protocol + Protocol v1.Protocol NodePort int - LoadBalancerStatus api.LoadBalancerStatus - SessionAffinityType api.ServiceAffinity + LoadBalancerStatus v1.LoadBalancerStatus + SessionAffinityType v1.ServiceAffinity StickyMaxAgeSeconds int ExternalIPs []string LoadBalancerSourceRanges []string @@ -65,7 +65,7 @@ func (info *BaseServiceInfo) ClusterIPString() string { } // GetProtocol is part of ServicePort interface. -func (info *BaseServiceInfo) GetProtocol() api.Protocol { +func (info *BaseServiceInfo) GetProtocol() v1.Protocol { return info.Protocol } @@ -74,13 +74,13 @@ func (info *BaseServiceInfo) GetHealthCheckNodePort() int { return info.HealthCheckNodePort } -func (sct *ServiceChangeTracker) newBaseServiceInfo(port *api.ServicePort, service *api.Service) *BaseServiceInfo { +func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, service *v1.Service) *BaseServiceInfo { onlyNodeLocalEndpoints := false if apiservice.RequestsOnlyLocalTraffic(service) { onlyNodeLocalEndpoints = true } var stickyMaxAgeSeconds int - if service.Spec.SessionAffinity == api.ServiceAffinityClientIP { + if service.Spec.SessionAffinity == v1.ServiceAffinityClientIP { // Kube-apiserver side guarantees SessionAffinityConfig won't be nil when session affinity type is ClientIP stickyMaxAgeSeconds = int(*service.Spec.SessionAffinityConfig.ClientIP.TimeoutSeconds) } @@ -128,7 +128,7 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *api.ServicePort, servi return info } -type makeServicePortFunc func(*api.ServicePort, *api.Service, *BaseServiceInfo) ServicePort +type makeServicePortFunc func(*v1.ServicePort, *v1.Service, *BaseServiceInfo) ServicePort // serviceChange contains all changes to services that happened since proxy rules were synced. For a single object, // changes are accumulated, i.e. previous is state from before applying the changes, @@ -170,7 +170,7 @@ func NewServiceChangeTracker(makeServiceInfo makeServicePortFunc, isIPv6Mode *bo // - pass as the pair. // Delete item // - pass as the pair. -func (sct *ServiceChangeTracker) Update(previous, current *api.Service) bool { +func (sct *ServiceChangeTracker) Update(previous, current *v1.Service) bool { svc := current if svc == nil { svc = previous @@ -231,7 +231,7 @@ type ServiceMap map[ServicePortName]ServicePort // serviceToServiceMap translates a single Service object to a ServiceMap. // // NOTE: service object should NOT be modified. -func (sct *ServiceChangeTracker) serviceToServiceMap(service *api.Service) ServiceMap { +func (sct *ServiceChangeTracker) serviceToServiceMap(service *v1.Service) ServiceMap { if service == nil { return nil } @@ -332,7 +332,7 @@ func (sm *ServiceMap) unmerge(other ServiceMap, UDPStaleClusterIP sets.String) { info, exists := (*sm)[svcPortName] if exists { glog.V(1).Infof("Removing service port %q", svcPortName) - if info.GetProtocol() == api.ProtocolUDP { + if info.GetProtocol() == v1.ProtocolUDP { UDPStaleClusterIP.Insert(info.ClusterIPString()) } delete(*sm, svcPortName) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/types.go b/vendor/k8s.io/kubernetes/pkg/proxy/types.go index a3cb4d35..f3893706 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/types.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/types.go @@ -19,8 +19,8 @@ package proxy import ( "fmt" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" - api "k8s.io/kubernetes/pkg/apis/core" ) // ProxyProvider is the interface provided by proxier implementations. @@ -51,7 +51,7 @@ type ServicePort interface { // ClusterIPString returns service cluster IP in string format. ClusterIPString() string // GetProtocol returns service protocol. - GetProtocol() api.Protocol + GetProtocol() v1.Protocol // GetHealthCheckNodePort returns service health check node port if present. If return 0, it means not present. GetHealthCheckNodePort() int } diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD b/vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD index 91e24087..999dcf88 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/proxy/util/BUILD @@ -11,14 +11,13 @@ go_library( importpath = "k8s.io/kubernetes/pkg/proxy/util", visibility = ["//visibility:public"], deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/core/helper:go_default_library", + "//pkg/apis/core/v1/helper:go_default_library", "//pkg/util/net:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", ], ) @@ -31,11 +30,11 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//pkg/apis/core:go_default_library", "//pkg/proxy/util/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go b/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go index d766a1d4..ca1e6c8f 100644 --- a/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go +++ b/vendor/k8s.io/kubernetes/pkg/proxy/util/utils.go @@ -24,8 +24,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/tools/record" - api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/apis/core/helper" + helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" utilnet "k8s.io/kubernetes/pkg/util/net" "github.com/golang/glog" @@ -60,14 +59,14 @@ func IsLocalIP(ip string) (bool, error) { return false, nil } -func ShouldSkipService(svcName types.NamespacedName, service *api.Service) bool { +func ShouldSkipService(svcName types.NamespacedName, service *v1.Service) bool { // if ClusterIP is "None" or empty, skip proxying if !helper.IsServiceIPSet(service) { glog.V(3).Infof("Skipping service %s due to clusterIP = %q", svcName, service.Spec.ClusterIP) return true } // Even if ClusterIP is set, ServiceTypeExternalName services don't get proxied - if service.Spec.Type == api.ServiceTypeExternalName { + if service.Spec.Type == v1.ServiceTypeExternalName { glog.V(3).Infof("Skipping service %s due to Type=ExternalName", svcName) return true } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD index 37bfb4fb..254199dd 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/BUILD @@ -19,24 +19,20 @@ go_library( "//pkg/apis/core:go_default_library", "//pkg/scheduler/api:go_default_library", "//pkg/scheduler/cache:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/api/apps/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", ], ) go_test( name = "go_default_test", - srcs = [ - "scheduler_interface_test.go", - "types_test.go", - ], + srcs = ["types_test.go"], embed = [":go_default_library"], deps = [ "//pkg/scheduler/cache:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/BUILD index 13e21617..e4de1bb6 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/BUILD @@ -9,6 +9,7 @@ load( go_library( name = "go_default_library", srcs = [ + "csi_volume_predicate.go", "error.go", "metadata.go", "predicates.go", @@ -27,25 +28,26 @@ go_library( "//pkg/scheduler/util:go_default_library", "//pkg/scheduler/volumebinder:go_default_library", "//pkg/volume/util:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/rand:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", ], ) go_test( name = "go_default_test", srcs = [ + "csi_volume_predicate_test.go", "max_attachable_volume_predicate_test.go", "metadata_test.go", "predicates_test.go", @@ -60,14 +62,14 @@ go_test( "//pkg/scheduler/cache:go_default_library", "//pkg/scheduler/testing:go_default_library", "//pkg/volume/util:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/csi_volume_predicate.go b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/csi_volume_predicate.go new file mode 100644 index 00000000..8e155ea2 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/csi_volume_predicate.go @@ -0,0 +1,157 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 predicates + +import ( + "fmt" + + "github.com/golang/glog" + "k8s.io/api/core/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" + "k8s.io/kubernetes/pkg/scheduler/algorithm" + schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" + volumeutil "k8s.io/kubernetes/pkg/volume/util" +) + +// CSIMaxVolumeLimitChecker defines predicate needed for counting CSI volumes +type CSIMaxVolumeLimitChecker struct { + pvInfo PersistentVolumeInfo + pvcInfo PersistentVolumeClaimInfo +} + +// NewCSIMaxVolumeLimitPredicate returns a predicate for counting CSI volumes +func NewCSIMaxVolumeLimitPredicate( + pvInfo PersistentVolumeInfo, pvcInfo PersistentVolumeClaimInfo) algorithm.FitPredicate { + c := &CSIMaxVolumeLimitChecker{ + pvInfo: pvInfo, + pvcInfo: pvcInfo, + } + return c.attachableLimitPredicate +} + +func (c *CSIMaxVolumeLimitChecker) attachableLimitPredicate( + pod *v1.Pod, meta algorithm.PredicateMetadata, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) { + + // if feature gate is disable we return + if !utilfeature.DefaultFeatureGate.Enabled(features.AttachVolumeLimit) { + return true, nil, nil + } + // If a pod doesn't have any volume attached to it, the predicate will always be true. + // Thus we make a fast path for it, to avoid unnecessary computations in this case. + if len(pod.Spec.Volumes) == 0 { + return true, nil, nil + } + + nodeVolumeLimits := nodeInfo.VolumeLimits() + + // if node does not have volume limits this predicate should exit + if len(nodeVolumeLimits) == 0 { + return true, nil, nil + } + + // a map of unique volume name/csi volume handle and volume limit key + newVolumes := make(map[string]string) + if err := c.filterAttachableVolumes(pod.Spec.Volumes, pod.Namespace, newVolumes); err != nil { + return false, nil, err + } + + if len(newVolumes) == 0 { + return true, nil, nil + } + + // a map of unique volume name/csi volume handle and volume limit key + attachedVolumes := make(map[string]string) + for _, existingPod := range nodeInfo.Pods() { + if err := c.filterAttachableVolumes(existingPod.Spec.Volumes, existingPod.Namespace, attachedVolumes); err != nil { + return false, nil, err + } + } + + newVolumeCount := map[string]int{} + attachedVolumeCount := map[string]int{} + + for volumeName, volumeLimitKey := range attachedVolumes { + if _, ok := newVolumes[volumeName]; ok { + delete(newVolumes, volumeName) + } + attachedVolumeCount[volumeLimitKey]++ + } + + for _, volumeLimitKey := range newVolumes { + newVolumeCount[volumeLimitKey]++ + } + + for volumeLimitKey, count := range newVolumeCount { + maxVolumeLimit, ok := nodeVolumeLimits[v1.ResourceName(volumeLimitKey)] + if ok { + currentVolumeCount := attachedVolumeCount[volumeLimitKey] + if currentVolumeCount+count > int(maxVolumeLimit) { + return false, []algorithm.PredicateFailureReason{ErrMaxVolumeCountExceeded}, nil + } + } + } + + return true, nil, nil +} + +func (c *CSIMaxVolumeLimitChecker) filterAttachableVolumes( + volumes []v1.Volume, namespace string, result map[string]string) error { + + for _, vol := range volumes { + // CSI volumes can only be used as persistent volumes + if vol.PersistentVolumeClaim == nil { + continue + } + pvcName := vol.PersistentVolumeClaim.ClaimName + + if pvcName == "" { + return fmt.Errorf("PersistentVolumeClaim had no name") + } + + pvc, err := c.pvcInfo.GetPersistentVolumeClaimInfo(namespace, pvcName) + + if err != nil { + glog.V(4).Infof("Unable to look up PVC info for %s/%s", namespace, pvcName) + continue + } + + pvName := pvc.Spec.VolumeName + // TODO - the actual handling of unbound PVCs will be fixed by late binding design. + if pvName == "" { + glog.V(4).Infof("Persistent volume had no name for claim %s/%s", namespace, pvcName) + continue + } + pv, err := c.pvInfo.GetPersistentVolumeInfo(pvName) + + if err != nil { + glog.V(4).Infof("Unable to look up PV info for PVC %s/%s and PV %s", namespace, pvcName, pvName) + continue + } + + csiSource := pv.Spec.PersistentVolumeSource.CSI + if csiSource == nil { + glog.V(4).Infof("Not considering non-CSI volume %s/%s", namespace, pvcName) + continue + } + driverName := csiSource.Driver + volumeLimitKey := volumeutil.GetCSIAttachLimitKey(driverName) + result[csiSource.VolumeHandle] = volumeLimitKey + + } + return nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/metadata.go b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/metadata.go index 2b276ede..4695bef0 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/metadata.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/metadata.go @@ -38,6 +38,12 @@ type PredicateMetadataFactory struct { podLister algorithm.PodLister } +// AntiAffinityTerm's topology key value used in predicate metadata +type topologyPair struct { + key string + value string +} + // Note that predicateMetadata and matchingPodAntiAffinityTerm need to be declared in the same file // due to the way declarations are processed in predicate declaration unit tests. type matchingPodAntiAffinityTerm struct { @@ -45,6 +51,17 @@ type matchingPodAntiAffinityTerm struct { node *v1.Node } +type podSet map[*v1.Pod]struct{} + +type topologyPairSet map[topologyPair]struct{} + +// topologyPairsMaps keeps topologyPairToAntiAffinityPods and antiAffinityPodToTopologyPairs in sync +// as they are the inverse of each others. +type topologyPairsMaps struct { + topologyPairToPods map[topologyPair]podSet + podToTopologyPairs map[string]topologyPairSet +} + // NOTE: When new fields are added/removed or logic is changed, please make sure that // RemovePod, AddPod, and ShallowCopy functions are updated to work with the new changes. type predicateMetadata struct { @@ -52,17 +69,17 @@ type predicateMetadata struct { podBestEffort bool podRequest *schedulercache.Resource podPorts []*v1.ContainerPort - //key is a pod full name with the anti-affinity rules. - matchingAntiAffinityTerms map[string][]matchingPodAntiAffinityTerm - // A map of node name to a list of Pods on the node that can potentially match - // the affinity rules of the "pod". - nodeNameToMatchingAffinityPods map[string][]*v1.Pod - // A map of node name to a list of Pods on the node that can potentially match - // the anti-affinity rules of the "pod". - nodeNameToMatchingAntiAffinityPods map[string][]*v1.Pod - serviceAffinityInUse bool - serviceAffinityMatchingPodList []*v1.Pod - serviceAffinityMatchingPodServices []*v1.Service + + topologyPairsAntiAffinityPodsMap *topologyPairsMaps + // A map of topology pairs to a list of Pods that can potentially match + // the affinity terms of the "pod" and its inverse. + topologyPairsPotentialAffinityPods *topologyPairsMaps + // A map of topology pairs to a list of Pods that can potentially match + // the anti-affinity terms of the "pod" and its inverse. + topologyPairsPotentialAntiAffinityPods *topologyPairsMaps + serviceAffinityInUse bool + serviceAffinityMatchingPodList []*v1.Pod + serviceAffinityMatchingPodServices []*v1.Service // ignoredExtendedResources is a set of extended resource names that will // be ignored in the PodFitsResources predicate. // @@ -113,23 +130,26 @@ func (pfactory *PredicateMetadataFactory) GetMetadata(pod *v1.Pod, nodeNameToInf if pod == nil { return nil } - matchingTerms, err := getMatchingAntiAffinityTerms(pod, nodeNameToInfoMap) + // existingPodAntiAffinityMap will be used later for efficient check on existing pods' anti-affinity + existingPodAntiAffinityMap, err := getTPMapMatchingExistingAntiAffinity(pod, nodeNameToInfoMap) if err != nil { return nil } - affinityPods, antiAffinityPods, err := getPodsMatchingAffinity(pod, nodeNameToInfoMap) + // incomingPodAffinityMap will be used later for efficient check on incoming pod's affinity + // incomingPodAntiAffinityMap will be used later for efficient check on incoming pod's anti-affinity + incomingPodAffinityMap, incomingPodAntiAffinityMap, err := getTPMapMatchingIncomingAffinityAntiAffinity(pod, nodeNameToInfoMap) if err != nil { glog.Errorf("[predicate meta data generation] error finding pods that match affinity terms: %v", err) return nil } predicateMetadata := &predicateMetadata{ - pod: pod, - podBestEffort: isPodBestEffort(pod), - podRequest: GetResourceRequest(pod), - podPorts: schedutil.GetContainerPorts(pod), - matchingAntiAffinityTerms: matchingTerms, - nodeNameToMatchingAffinityPods: affinityPods, - nodeNameToMatchingAntiAffinityPods: antiAffinityPods, + pod: pod, + podBestEffort: isPodBestEffort(pod), + podRequest: GetResourceRequest(pod), + podPorts: schedutil.GetContainerPorts(pod), + topologyPairsPotentialAffinityPods: incomingPodAffinityMap, + topologyPairsPotentialAntiAffinityPods: incomingPodAntiAffinityMap, + topologyPairsAntiAffinityPodsMap: existingPodAntiAffinityMap, } for predicateName, precomputeFunc := range predicateMetadataProducers { glog.V(10).Infof("Precompute: %v", predicateName) @@ -138,6 +158,46 @@ func (pfactory *PredicateMetadataFactory) GetMetadata(pod *v1.Pod, nodeNameToInf return predicateMetadata } +// returns a pointer to a new topologyPairsMaps +func newTopologyPairsMaps() *topologyPairsMaps { + return &topologyPairsMaps{topologyPairToPods: make(map[topologyPair]podSet), + podToTopologyPairs: make(map[string]topologyPairSet)} +} + +func (topologyPairsMaps *topologyPairsMaps) addTopologyPair(pair topologyPair, pod *v1.Pod) { + podFullName := schedutil.GetPodFullName(pod) + if topologyPairsMaps.topologyPairToPods[pair] == nil { + topologyPairsMaps.topologyPairToPods[pair] = make(map[*v1.Pod]struct{}) + } + topologyPairsMaps.topologyPairToPods[pair][pod] = struct{}{} + if topologyPairsMaps.podToTopologyPairs[podFullName] == nil { + topologyPairsMaps.podToTopologyPairs[podFullName] = make(map[topologyPair]struct{}) + } + topologyPairsMaps.podToTopologyPairs[podFullName][pair] = struct{}{} +} + +func (topologyPairsMaps *topologyPairsMaps) removePod(deletedPod *v1.Pod) { + deletedPodFullName := schedutil.GetPodFullName(deletedPod) + for pair := range topologyPairsMaps.podToTopologyPairs[deletedPodFullName] { + delete(topologyPairsMaps.topologyPairToPods[pair], deletedPod) + if len(topologyPairsMaps.topologyPairToPods[pair]) == 0 { + delete(topologyPairsMaps.topologyPairToPods, pair) + } + } + delete(topologyPairsMaps.podToTopologyPairs, deletedPodFullName) +} + +func (topologyPairsMaps *topologyPairsMaps) appendMaps(toAppend *topologyPairsMaps) { + if toAppend == nil { + return + } + for pair := range toAppend.topologyPairToPods { + for pod := range toAppend.topologyPairToPods[pair] { + topologyPairsMaps.addTopologyPair(pair, pod) + } + } +} + // RemovePod changes predicateMetadata assuming that the given `deletedPod` is // deleted from the system. func (meta *predicateMetadata) RemovePod(deletedPod *v1.Pod) error { @@ -145,35 +205,10 @@ func (meta *predicateMetadata) RemovePod(deletedPod *v1.Pod) error { if deletedPodFullName == schedutil.GetPodFullName(meta.pod) { return fmt.Errorf("deletedPod and meta.pod must not be the same") } - // Delete any anti-affinity rule from the deletedPod. - delete(meta.matchingAntiAffinityTerms, deletedPodFullName) - // Delete pod from the matching affinity or anti-affinity pods if exists. - affinity := meta.pod.Spec.Affinity - podNodeName := deletedPod.Spec.NodeName - if affinity != nil && len(podNodeName) > 0 { - if affinity.PodAffinity != nil { - for i, p := range meta.nodeNameToMatchingAffinityPods[podNodeName] { - if p == deletedPod { - s := meta.nodeNameToMatchingAffinityPods[podNodeName] - s[i] = s[len(s)-1] - s = s[:len(s)-1] - meta.nodeNameToMatchingAffinityPods[podNodeName] = s - break - } - } - } - if affinity.PodAntiAffinity != nil { - for i, p := range meta.nodeNameToMatchingAntiAffinityPods[podNodeName] { - if p == deletedPod { - s := meta.nodeNameToMatchingAntiAffinityPods[podNodeName] - s[i] = s[len(s)-1] - s = s[:len(s)-1] - meta.nodeNameToMatchingAntiAffinityPods[podNodeName] = s - break - } - } - } - } + meta.topologyPairsAntiAffinityPodsMap.removePod(deletedPod) + // Delete pod from the matching affinity or anti-affinity topology pairs maps. + meta.topologyPairsPotentialAffinityPods.removePod(deletedPod) + meta.topologyPairsPotentialAntiAffinityPods.removePod(deletedPod) // All pods in the serviceAffinityMatchingPodList are in the same namespace. // So, if the namespace of the first one is not the same as the namespace of the // deletedPod, we don't need to check the list, as deletedPod isn't in the list. @@ -203,46 +238,36 @@ func (meta *predicateMetadata) AddPod(addedPod *v1.Pod, nodeInfo *schedulercache return fmt.Errorf("invalid node in nodeInfo") } // Add matching anti-affinity terms of the addedPod to the map. - podMatchingTerms, err := getMatchingAntiAffinityTermsOfExistingPod(meta.pod, addedPod, nodeInfo.Node()) + topologyPairsMaps, err := getMatchingAntiAffinityTopologyPairsOfPod(meta.pod, addedPod, nodeInfo.Node()) if err != nil { return err } - if len(podMatchingTerms) > 0 { - existingTerms, found := meta.matchingAntiAffinityTerms[addedPodFullName] - if found { - meta.matchingAntiAffinityTerms[addedPodFullName] = append(existingTerms, - podMatchingTerms...) - } else { - meta.matchingAntiAffinityTerms[addedPodFullName] = podMatchingTerms - } - } + meta.topologyPairsAntiAffinityPodsMap.appendMaps(topologyPairsMaps) // Add the pod to nodeNameToMatchingAffinityPods and nodeNameToMatchingAntiAffinityPods if needed. affinity := meta.pod.Spec.Affinity podNodeName := addedPod.Spec.NodeName if affinity != nil && len(podNodeName) > 0 { + podNode := nodeInfo.Node() + // It is assumed that when the added pod matches affinity of the meta.pod, all the terms must match, + // this should be changed when the implementation of targetPodMatchesAffinityOfPod/podMatchesAffinityTermProperties + // is changed if targetPodMatchesAffinityOfPod(meta.pod, addedPod) { - found := false - for _, p := range meta.nodeNameToMatchingAffinityPods[podNodeName] { - if p == addedPod { - found = true - break + affinityTerms := GetPodAffinityTerms(affinity.PodAffinity) + for _, term := range affinityTerms { + if topologyValue, ok := podNode.Labels[term.TopologyKey]; ok { + pair := topologyPair{key: term.TopologyKey, value: topologyValue} + meta.topologyPairsPotentialAffinityPods.addTopologyPair(pair, addedPod) } } - if !found { - meta.nodeNameToMatchingAffinityPods[podNodeName] = append(meta.nodeNameToMatchingAffinityPods[podNodeName], addedPod) - } } if targetPodMatchesAntiAffinityOfPod(meta.pod, addedPod) { - found := false - for _, p := range meta.nodeNameToMatchingAntiAffinityPods[podNodeName] { - if p == addedPod { - found = true - break + antiAffinityTerms := GetPodAntiAffinityTerms(affinity.PodAntiAffinity) + for _, term := range antiAffinityTerms { + if topologyValue, ok := podNode.Labels[term.TopologyKey]; ok { + pair := topologyPair{key: term.TopologyKey, value: topologyValue} + meta.topologyPairsPotentialAntiAffinityPods.addTopologyPair(pair, addedPod) } } - if !found { - meta.nodeNameToMatchingAntiAffinityPods[podNodeName] = append(meta.nodeNameToMatchingAntiAffinityPods[podNodeName], addedPod) - } } } // If addedPod is in the same namespace as the meta.pod, update the list @@ -268,18 +293,12 @@ func (meta *predicateMetadata) ShallowCopy() algorithm.PredicateMetadata { ignoredExtendedResources: meta.ignoredExtendedResources, } newPredMeta.podPorts = append([]*v1.ContainerPort(nil), meta.podPorts...) - newPredMeta.matchingAntiAffinityTerms = map[string][]matchingPodAntiAffinityTerm{} - for k, v := range meta.matchingAntiAffinityTerms { - newPredMeta.matchingAntiAffinityTerms[k] = append([]matchingPodAntiAffinityTerm(nil), v...) - } - newPredMeta.nodeNameToMatchingAffinityPods = make(map[string][]*v1.Pod) - for k, v := range meta.nodeNameToMatchingAffinityPods { - newPredMeta.nodeNameToMatchingAffinityPods[k] = append([]*v1.Pod(nil), v...) - } - newPredMeta.nodeNameToMatchingAntiAffinityPods = make(map[string][]*v1.Pod) - for k, v := range meta.nodeNameToMatchingAntiAffinityPods { - newPredMeta.nodeNameToMatchingAntiAffinityPods[k] = append([]*v1.Pod(nil), v...) - } + newPredMeta.topologyPairsPotentialAffinityPods = newTopologyPairsMaps() + newPredMeta.topologyPairsPotentialAffinityPods.appendMaps(meta.topologyPairsPotentialAffinityPods) + newPredMeta.topologyPairsPotentialAntiAffinityPods = newTopologyPairsMaps() + newPredMeta.topologyPairsPotentialAntiAffinityPods.appendMaps(meta.topologyPairsPotentialAntiAffinityPods) + newPredMeta.topologyPairsAntiAffinityPodsMap = newTopologyPairsMaps() + newPredMeta.topologyPairsAntiAffinityPodsMap.appendMaps(meta.topologyPairsAntiAffinityPodsMap) newPredMeta.serviceAffinityMatchingPodServices = append([]*v1.Service(nil), meta.serviceAffinityMatchingPodServices...) newPredMeta.serviceAffinityMatchingPodList = append([]*v1.Pod(nil), @@ -310,8 +329,8 @@ func getAffinityTermProperties(pod *v1.Pod, terms []v1.PodAffinityTerm) (propert return properties, nil } -// podMatchesAffinityTermProperties return true IFF the given pod matches all the given properties. -func podMatchesAffinityTermProperties(pod *v1.Pod, properties []*affinityTermProperties) bool { +// podMatchesAllAffinityTermProperties returns true IFF the given pod matches all the given properties. +func podMatchesAllAffinityTermProperties(pod *v1.Pod, properties []*affinityTermProperties) bool { if len(properties) == 0 { return false } @@ -323,16 +342,76 @@ func podMatchesAffinityTermProperties(pod *v1.Pod, properties []*affinityTermPro return true } -// getPodsMatchingAffinity finds existing Pods that match affinity terms of the given "pod". -// It ignores topology. It returns a set of Pods that are checked later by the affinity -// predicate. With this set of pods available, the affinity predicate does not +// podMatchesAnyAffinityTermProperties returns true if the given pod matches any given property. +func podMatchesAnyAffinityTermProperties(pod *v1.Pod, properties []*affinityTermProperties) bool { + if len(properties) == 0 { + return false + } + for _, property := range properties { + if priorityutil.PodMatchesTermsNamespaceAndSelector(pod, property.namespaces, property.selector) { + return true + } + } + return false +} + +// getTPMapMatchingExistingAntiAffinity calculates the following for each existing pod on each node: +// (1) Whether it has PodAntiAffinity +// (2) Whether any AffinityTerm matches the incoming pod +func getTPMapMatchingExistingAntiAffinity(pod *v1.Pod, nodeInfoMap map[string]*schedulercache.NodeInfo) (*topologyPairsMaps, error) { + allNodeNames := make([]string, 0, len(nodeInfoMap)) + for name := range nodeInfoMap { + allNodeNames = append(allNodeNames, name) + } + + var lock sync.Mutex + var firstError error + + topologyMaps := newTopologyPairsMaps() + + appendTopologyPairsMaps := func(toAppend *topologyPairsMaps) { + lock.Lock() + defer lock.Unlock() + topologyMaps.appendMaps(toAppend) + } + catchError := func(err error) { + lock.Lock() + defer lock.Unlock() + if firstError == nil { + firstError = err + } + } + + processNode := func(i int) { + nodeInfo := nodeInfoMap[allNodeNames[i]] + node := nodeInfo.Node() + if node == nil { + catchError(fmt.Errorf("node not found")) + return + } + for _, existingPod := range nodeInfo.PodsWithAffinity() { + existingPodTopologyMaps, err := getMatchingAntiAffinityTopologyPairsOfPod(pod, existingPod, node) + if err != nil { + catchError(err) + return + } + appendTopologyPairsMaps(existingPodTopologyMaps) + } + } + workqueue.Parallelize(16, len(allNodeNames), processNode) + return topologyMaps, firstError +} + +// getTPMapMatchingIncomingAffinityAntiAffinity finds existing Pods that match affinity terms of the given "pod". +// It returns a topologyPairsMaps that are checked later by the affinity +// predicate. With this topologyPairsMaps available, the affinity predicate does not // need to check all the pods in the cluster. -func getPodsMatchingAffinity(pod *v1.Pod, nodeInfoMap map[string]*schedulercache.NodeInfo) (affinityPods map[string][]*v1.Pod, antiAffinityPods map[string][]*v1.Pod, err error) { +func getTPMapMatchingIncomingAffinityAntiAffinity(pod *v1.Pod, nodeInfoMap map[string]*schedulercache.NodeInfo) (topologyPairsAffinityPodsMaps *topologyPairsMaps, topologyPairsAntiAffinityPodsMaps *topologyPairsMaps, err error) { allNodeNames := make([]string, 0, len(nodeInfoMap)) affinity := pod.Spec.Affinity if affinity == nil || (affinity.PodAffinity == nil && affinity.PodAntiAffinity == nil) { - return nil, nil, nil + return newTopologyPairsMaps(), newTopologyPairsMaps(), nil } for name := range nodeInfoMap { @@ -341,16 +420,16 @@ func getPodsMatchingAffinity(pod *v1.Pod, nodeInfoMap map[string]*schedulercache var lock sync.Mutex var firstError error - affinityPods = make(map[string][]*v1.Pod) - antiAffinityPods = make(map[string][]*v1.Pod) - appendResult := func(nodeName string, affPods, antiAffPods []*v1.Pod) { + topologyPairsAffinityPodsMaps = newTopologyPairsMaps() + topologyPairsAntiAffinityPodsMaps = newTopologyPairsMaps() + appendResult := func(nodeName string, nodeTopologyPairsAffinityPodsMaps, nodeTopologyPairsAntiAffinityPodsMaps *topologyPairsMaps) { lock.Lock() defer lock.Unlock() - if len(affPods) > 0 { - affinityPods[nodeName] = affPods + if len(nodeTopologyPairsAffinityPodsMaps.topologyPairToPods) > 0 { + topologyPairsAffinityPodsMaps.appendMaps(nodeTopologyPairsAffinityPodsMaps) } - if len(antiAffPods) > 0 { - antiAffinityPods[nodeName] = antiAffPods + if len(nodeTopologyPairsAntiAffinityPodsMaps.topologyPairToPods) > 0 { + topologyPairsAntiAffinityPodsMaps.appendMaps(nodeTopologyPairsAntiAffinityPodsMaps) } } @@ -362,14 +441,12 @@ func getPodsMatchingAffinity(pod *v1.Pod, nodeInfoMap map[string]*schedulercache } } - affinityProperties, err := getAffinityTermProperties(pod, GetPodAffinityTerms(affinity.PodAffinity)) - if err != nil { - return nil, nil, err - } - antiAffinityProperties, err := getAffinityTermProperties(pod, GetPodAntiAffinityTerms(affinity.PodAntiAffinity)) + affinityTerms := GetPodAffinityTerms(affinity.PodAffinity) + affinityProperties, err := getAffinityTermProperties(pod, affinityTerms) if err != nil { return nil, nil, err } + antiAffinityTerms := GetPodAntiAffinityTerms(affinity.PodAntiAffinity) processNode := func(i int) { nodeInfo := nodeInfoMap[allNodeNames[i]] @@ -378,27 +455,43 @@ func getPodsMatchingAffinity(pod *v1.Pod, nodeInfoMap map[string]*schedulercache catchError(fmt.Errorf("nodeInfo.Node is nil")) return } - affPods := make([]*v1.Pod, 0, len(nodeInfo.Pods())) - antiAffPods := make([]*v1.Pod, 0, len(nodeInfo.Pods())) + nodeTopologyPairsAffinityPodsMaps := newTopologyPairsMaps() + nodeTopologyPairsAntiAffinityPodsMaps := newTopologyPairsMaps() for _, existingPod := range nodeInfo.Pods() { // Check affinity properties. - if podMatchesAffinityTermProperties(existingPod, affinityProperties) { - affPods = append(affPods, existingPod) + if podMatchesAllAffinityTermProperties(existingPod, affinityProperties) { + for _, term := range affinityTerms { + if topologyValue, ok := node.Labels[term.TopologyKey]; ok { + pair := topologyPair{key: term.TopologyKey, value: topologyValue} + nodeTopologyPairsAffinityPodsMaps.addTopologyPair(pair, existingPod) + } + } } // Check anti-affinity properties. - if podMatchesAffinityTermProperties(existingPod, antiAffinityProperties) { - antiAffPods = append(antiAffPods, existingPod) + for _, term := range antiAffinityTerms { + namespaces := priorityutil.GetNamespacesFromPodAffinityTerm(pod, &term) + selector, err := metav1.LabelSelectorAsSelector(term.LabelSelector) + if err != nil { + catchError(err) + return + } + if priorityutil.PodMatchesTermsNamespaceAndSelector(existingPod, namespaces, selector) { + if topologyValue, ok := node.Labels[term.TopologyKey]; ok { + pair := topologyPair{key: term.TopologyKey, value: topologyValue} + nodeTopologyPairsAntiAffinityPodsMaps.addTopologyPair(pair, existingPod) + } + } } } - if len(antiAffPods) > 0 || len(affPods) > 0 { - appendResult(node.Name, affPods, antiAffPods) + if len(nodeTopologyPairsAffinityPodsMaps.topologyPairToPods) > 0 || len(nodeTopologyPairsAntiAffinityPodsMaps.topologyPairToPods) > 0 { + appendResult(node.Name, nodeTopologyPairsAffinityPodsMaps, nodeTopologyPairsAntiAffinityPodsMaps) } } workqueue.Parallelize(16, len(allNodeNames), processNode) - return affinityPods, antiAffinityPods, firstError + return topologyPairsAffinityPodsMaps, topologyPairsAntiAffinityPodsMaps, firstError } -// podMatchesAffinity returns true if "targetPod" matches any affinity rule of +// targetPodMatchesAffinityOfPod returns true if "targetPod" matches ALL affinity terms of // "pod". Similar to getPodsMatchingAffinity, this function does not check topology. // So, whether the targetPod actually matches or not needs further checks for a specific // node. @@ -412,11 +505,11 @@ func targetPodMatchesAffinityOfPod(pod, targetPod *v1.Pod) bool { glog.Errorf("error in getting affinity properties of Pod %v", pod.Name) return false } - return podMatchesAffinityTermProperties(targetPod, affinityProperties) + return podMatchesAllAffinityTermProperties(targetPod, affinityProperties) } -// targetPodMatchesAntiAffinityOfPod returns true if "targetPod" matches any anti-affinity -// rule of "pod". Similar to getPodsMatchingAffinity, this function does not check topology. +// targetPodMatchesAntiAffinityOfPod returns true if "targetPod" matches ANY anti-affinity +// term of "pod". Similar to getPodsMatchingAffinity, this function does not check topology. // So, whether the targetPod actually matches or not needs further checks for a specific // node. func targetPodMatchesAntiAffinityOfPod(pod, targetPod *v1.Pod) bool { @@ -429,5 +522,5 @@ func targetPodMatchesAntiAffinityOfPod(pod, targetPod *v1.Pod) bool { glog.Errorf("error in getting anti-affinity properties of Pod %v", pod.Name) return false } - return podMatchesAffinityTermProperties(targetPod, properties) + return podMatchesAnyAffinityTermProperties(targetPod, properties) } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/predicates.go b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/predicates.go index aaf28f96..b1bace2f 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/predicates.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/predicates.go @@ -20,8 +20,8 @@ import ( "errors" "fmt" "os" + "regexp" "strconv" - "sync" "github.com/golang/glog" @@ -36,7 +36,6 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" corelisters "k8s.io/client-go/listers/core/v1" storagelisters "k8s.io/client-go/listers/storage/v1" - "k8s.io/client-go/util/workqueue" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" v1qos "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos" "k8s.io/kubernetes/pkg/features" @@ -84,6 +83,8 @@ const ( MaxGCEPDVolumeCountPred = "MaxGCEPDVolumeCount" // MaxAzureDiskVolumeCountPred defines the name of predicate MaxAzureDiskVolumeCount. MaxAzureDiskVolumeCountPred = "MaxAzureDiskVolumeCount" + // MaxCSIVolumeCountPred defines the predicate that decides how many CSI volumes should be attached + MaxCSIVolumeCountPred = "MaxCSIVolumeCountPred" // NoVolumeZoneConflictPred defines the name of predicate NoVolumeZoneConflict. NoVolumeZoneConflictPred = "NoVolumeZoneConflict" // CheckNodeMemoryPressurePred defines the name of predicate CheckNodeMemoryPressure. @@ -93,10 +94,6 @@ const ( // CheckNodePIDPressurePred defines the name of predicate CheckNodePIDPressure. CheckNodePIDPressurePred = "CheckNodePIDPressure" - // DefaultMaxEBSVolumes is the limit for volumes attached to an instance. - // Amazon recommends no more than 40; the system root volume uses at least one. - // See http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/volume_limits.html#linux-specific-volume-limits - DefaultMaxEBSVolumes = 39 // DefaultMaxGCEPDVolumes defines the maximum number of PD Volumes for GCE // GCE instances can have up to 16 PD volumes attached. DefaultMaxGCEPDVolumes = 16 @@ -134,7 +131,7 @@ var ( GeneralPred, HostNamePred, PodFitsHostPortsPred, MatchNodeSelectorPred, PodFitsResourcesPred, NoDiskConflictPred, PodToleratesNodeTaintsPred, PodToleratesNodeNoExecuteTaintsPred, CheckNodeLabelPresencePred, - CheckServiceAffinityPred, MaxEBSVolumeCountPred, MaxGCEPDVolumeCountPred, + CheckServiceAffinityPred, MaxEBSVolumeCountPred, MaxGCEPDVolumeCountPred, MaxCSIVolumeCountPred, MaxAzureDiskVolumeCountPred, CheckVolumeBindingPred, NoVolumeZoneConflictPred, CheckNodeMemoryPressurePred, CheckNodePIDPressurePred, CheckNodeDiskPressurePred, MatchInterPodAffinityPred} ) @@ -291,7 +288,7 @@ func NoDiskConflict(pod *v1.Pod, meta algorithm.PredicateMetadata, nodeInfo *sch type MaxPDVolumeCountChecker struct { filter VolumeFilter volumeLimitKey v1.ResourceName - maxVolumes int + maxVolumeFunc func(node *v1.Node) int pvInfo PersistentVolumeInfo pvcInfo PersistentVolumeClaimInfo @@ -317,7 +314,6 @@ type VolumeFilter struct { func NewMaxPDVolumeCountPredicate( filterName string, pvInfo PersistentVolumeInfo, pvcInfo PersistentVolumeClaimInfo) algorithm.FitPredicate { var filter VolumeFilter - var maxVolumes int var volumeLimitKey v1.ResourceName switch filterName { @@ -325,15 +321,12 @@ func NewMaxPDVolumeCountPredicate( case EBSVolumeFilterType: filter = EBSVolumeFilter volumeLimitKey = v1.ResourceName(volumeutil.EBSVolumeLimitKey) - maxVolumes = getMaxVols(DefaultMaxEBSVolumes) case GCEPDVolumeFilterType: filter = GCEPDVolumeFilter volumeLimitKey = v1.ResourceName(volumeutil.GCEVolumeLimitKey) - maxVolumes = getMaxVols(DefaultMaxGCEPDVolumes) case AzureDiskVolumeFilterType: filter = AzureDiskVolumeFilter volumeLimitKey = v1.ResourceName(volumeutil.AzureVolumeLimitKey) - maxVolumes = getMaxVols(DefaultMaxAzureDiskVolumes) default: glog.Fatalf("Wrong filterName, Only Support %v %v %v ", EBSVolumeFilterType, GCEPDVolumeFilterType, AzureDiskVolumeFilterType) @@ -343,7 +336,7 @@ func NewMaxPDVolumeCountPredicate( c := &MaxPDVolumeCountChecker{ filter: filter, volumeLimitKey: volumeLimitKey, - maxVolumes: maxVolumes, + maxVolumeFunc: getMaxVolumeFunc(filterName), pvInfo: pvInfo, pvcInfo: pvcInfo, randomVolumeIDPrefix: rand.String(32), @@ -352,19 +345,52 @@ func NewMaxPDVolumeCountPredicate( return c.predicate } -// getMaxVols checks the max PD volumes environment variable, otherwise returning a default value -func getMaxVols(defaultVal int) int { +func getMaxVolumeFunc(filterName string) func(node *v1.Node) int { + return func(node *v1.Node) int { + maxVolumesFromEnv := getMaxVolLimitFromEnv() + if maxVolumesFromEnv > 0 { + return maxVolumesFromEnv + } + + var nodeInstanceType string + for k, v := range node.ObjectMeta.Labels { + if k == kubeletapis.LabelInstanceType { + nodeInstanceType = v + } + } + switch filterName { + case EBSVolumeFilterType: + return getMaxEBSVolume(nodeInstanceType) + case GCEPDVolumeFilterType: + return DefaultMaxGCEPDVolumes + case AzureDiskVolumeFilterType: + return DefaultMaxAzureDiskVolumes + default: + return -1 + } + } +} + +func getMaxEBSVolume(nodeInstanceType string) int { + if ok, _ := regexp.MatchString(volumeutil.EBSNitroLimitRegex, nodeInstanceType); ok { + return volumeutil.DefaultMaxEBSNitroVolumeLimit + } + return volumeutil.DefaultMaxEBSVolumes +} + +// getMaxVolLimitFromEnv checks the max PD volumes environment variable, otherwise returning a default value +func getMaxVolLimitFromEnv() int { if rawMaxVols := os.Getenv(KubeMaxPDVols); rawMaxVols != "" { if parsedMaxVols, err := strconv.Atoi(rawMaxVols); err != nil { - glog.Errorf("Unable to parse maximum PD volumes value, using default of %v: %v", defaultVal, err) + glog.Errorf("Unable to parse maximum PD volumes value, using default: %v", err) } else if parsedMaxVols <= 0 { - glog.Errorf("Maximum PD volumes must be a positive value, using default of %v", defaultVal) + glog.Errorf("Maximum PD volumes must be a positive value, using default ") } else { return parsedMaxVols } } - return defaultVal + return -1 } func (c *MaxPDVolumeCountChecker) filterVolumes(volumes []v1.Volume, namespace string, filteredVolumes map[string]bool) error { @@ -454,7 +480,7 @@ func (c *MaxPDVolumeCountChecker) predicate(pod *v1.Pod, meta algorithm.Predicat } numNewVolumes := len(newVolumes) - maxAttachLimit := c.maxVolumes + maxAttachLimit := c.maxVolumeFunc(nodeInfo.Node()) if utilfeature.DefaultFeatureGate.Enabled(features.AttachVolumeLimit) { volumeLimits := nodeInfo.VolumeLimits() @@ -1159,7 +1185,7 @@ func (c *PodAffinityChecker) InterPodAffinityMatches(pod *v1.Pod, meta algorithm // targetPod matches all the terms and their topologies, 2) whether targetPod // matches all the terms label selector and namespaces (AKA term properties), // 3) any error. -func (c *PodAffinityChecker) podMatchesPodAffinityTerms(pod *v1.Pod, targetPod *v1.Pod, nodeInfo *schedulercache.NodeInfo, terms []v1.PodAffinityTerm) (bool, bool, error) { +func (c *PodAffinityChecker) podMatchesPodAffinityTerms(pod, targetPod *v1.Pod, nodeInfo *schedulercache.NodeInfo, terms []v1.PodAffinityTerm) (bool, bool, error) { if len(terms) == 0 { return false, false, fmt.Errorf("terms array is empty") } @@ -1167,7 +1193,7 @@ func (c *PodAffinityChecker) podMatchesPodAffinityTerms(pod *v1.Pod, targetPod * if err != nil { return false, false, err } - if !podMatchesAffinityTermProperties(targetPod, props) { + if !podMatchesAllAffinityTermProperties(targetPod, props) { return false, false, nil } // Namespace and selector of the terms have matched. Now we check topology of the terms. @@ -1214,120 +1240,63 @@ func GetPodAntiAffinityTerms(podAntiAffinity *v1.PodAntiAffinity) (terms []v1.Po return terms } -func getMatchingAntiAffinityTerms(pod *v1.Pod, nodeInfoMap map[string]*schedulercache.NodeInfo) (map[string][]matchingPodAntiAffinityTerm, error) { - allNodeNames := make([]string, 0, len(nodeInfoMap)) - for name := range nodeInfoMap { - allNodeNames = append(allNodeNames, name) - } - - var lock sync.Mutex - var firstError error - result := make(map[string][]matchingPodAntiAffinityTerm) - appendResult := func(toAppend map[string][]matchingPodAntiAffinityTerm) { - lock.Lock() - defer lock.Unlock() - for uid, terms := range toAppend { - result[uid] = append(result[uid], terms...) - } - } - catchError := func(err error) { - lock.Lock() - defer lock.Unlock() - if firstError == nil { - firstError = err - } +// getMatchingAntiAffinityTopologyPairs calculates the following for "existingPod" on given node: +// (1) Whether it has PodAntiAffinity +// (2) Whether ANY AffinityTerm matches the incoming pod +func getMatchingAntiAffinityTopologyPairsOfPod(newPod *v1.Pod, existingPod *v1.Pod, node *v1.Node) (*topologyPairsMaps, error) { + affinity := existingPod.Spec.Affinity + if affinity == nil || affinity.PodAntiAffinity == nil { + return nil, nil } - processNode := func(i int) { - nodeInfo := nodeInfoMap[allNodeNames[i]] - node := nodeInfo.Node() - if node == nil { - catchError(fmt.Errorf("node not found")) - return + topologyMaps := newTopologyPairsMaps() + for _, term := range GetPodAntiAffinityTerms(affinity.PodAntiAffinity) { + namespaces := priorityutil.GetNamespacesFromPodAffinityTerm(existingPod, &term) + selector, err := metav1.LabelSelectorAsSelector(term.LabelSelector) + if err != nil { + return nil, err } - nodeResult := make(map[string][]matchingPodAntiAffinityTerm) - for _, existingPod := range nodeInfo.PodsWithAffinity() { - affinity := existingPod.Spec.Affinity - if affinity == nil { - continue - } - for _, term := range GetPodAntiAffinityTerms(affinity.PodAntiAffinity) { - namespaces := priorityutil.GetNamespacesFromPodAffinityTerm(existingPod, &term) - selector, err := metav1.LabelSelectorAsSelector(term.LabelSelector) - if err != nil { - catchError(err) - return - } - if priorityutil.PodMatchesTermsNamespaceAndSelector(pod, namespaces, selector) { - existingPodFullName := schedutil.GetPodFullName(existingPod) - nodeResult[existingPodFullName] = append( - nodeResult[existingPodFullName], - matchingPodAntiAffinityTerm{term: &term, node: node}) - } + if priorityutil.PodMatchesTermsNamespaceAndSelector(newPod, namespaces, selector) { + if topologyValue, ok := node.Labels[term.TopologyKey]; ok { + pair := topologyPair{key: term.TopologyKey, value: topologyValue} + topologyMaps.addTopologyPair(pair, existingPod) } } - if len(nodeResult) > 0 { - appendResult(nodeResult) - } } - workqueue.Parallelize(16, len(allNodeNames), processNode) - return result, firstError + return topologyMaps, nil } -func getMatchingAntiAffinityTermsOfExistingPod(newPod *v1.Pod, existingPod *v1.Pod, node *v1.Node) ([]matchingPodAntiAffinityTerm, error) { - var result []matchingPodAntiAffinityTerm - affinity := existingPod.Spec.Affinity - if affinity != nil && affinity.PodAntiAffinity != nil { - for _, term := range GetPodAntiAffinityTerms(affinity.PodAntiAffinity) { - namespaces := priorityutil.GetNamespacesFromPodAffinityTerm(existingPod, &term) - selector, err := metav1.LabelSelectorAsSelector(term.LabelSelector) - if err != nil { - return nil, err - } - if priorityutil.PodMatchesTermsNamespaceAndSelector(newPod, namespaces, selector) { - result = append(result, matchingPodAntiAffinityTerm{term: &term, node: node}) - } - } - } - return result, nil -} +func (c *PodAffinityChecker) getMatchingAntiAffinityTopologyPairsOfPods(pod *v1.Pod, existingPods []*v1.Pod) (*topologyPairsMaps, error) { + topologyMaps := newTopologyPairsMaps() -func (c *PodAffinityChecker) getMatchingAntiAffinityTerms(pod *v1.Pod, allPods []*v1.Pod) (map[string][]matchingPodAntiAffinityTerm, error) { - result := make(map[string][]matchingPodAntiAffinityTerm) - for _, existingPod := range allPods { - affinity := existingPod.Spec.Affinity - if affinity != nil && affinity.PodAntiAffinity != nil { - existingPodNode, err := c.info.GetNodeInfo(existingPod.Spec.NodeName) - if err != nil { - if apierrors.IsNotFound(err) { - glog.Errorf("Node not found, %v", existingPod.Spec.NodeName) - continue - } - return nil, err - } - existingPodMatchingTerms, err := getMatchingAntiAffinityTermsOfExistingPod(pod, existingPod, existingPodNode) - if err != nil { - return nil, err - } - if len(existingPodMatchingTerms) > 0 { - existingPodFullName := schedutil.GetPodFullName(existingPod) - result[existingPodFullName] = existingPodMatchingTerms + for _, existingPod := range existingPods { + existingPodNode, err := c.info.GetNodeInfo(existingPod.Spec.NodeName) + if err != nil { + if apierrors.IsNotFound(err) { + glog.Errorf("Node not found, %v", existingPod.Spec.NodeName) + continue } + return nil, err + } + existingPodTopologyMaps, err := getMatchingAntiAffinityTopologyPairsOfPod(pod, existingPod, existingPodNode) + if err != nil { + return nil, err } + topologyMaps.appendMaps(existingPodTopologyMaps) } - return result, nil + return topologyMaps, nil } // Checks if scheduling the pod onto this node would break any anti-affinity -// rules indicated by the existing pods. +// terms indicated by the existing pods. func (c *PodAffinityChecker) satisfiesExistingPodsAntiAffinity(pod *v1.Pod, meta algorithm.PredicateMetadata, nodeInfo *schedulercache.NodeInfo) (algorithm.PredicateFailureReason, error) { node := nodeInfo.Node() if node == nil { return ErrExistingPodsAntiAffinityRulesNotMatch, fmt.Errorf("Node is nil") } - var matchingTerms map[string][]matchingPodAntiAffinityTerm + var topologyMaps *topologyPairsMaps if predicateMeta, ok := meta.(*predicateMetadata); ok { - matchingTerms = predicateMeta.matchingAntiAffinityTerms + topologyMaps = predicateMeta.topologyPairsAntiAffinityPodsMap } else { // Filter out pods whose nodeName is equal to nodeInfo.node.Name, but are not // present in nodeInfo. Pods on other nodes pass the filter. @@ -1337,63 +1306,63 @@ func (c *PodAffinityChecker) satisfiesExistingPodsAntiAffinity(pod *v1.Pod, meta glog.Error(errMessage) return ErrExistingPodsAntiAffinityRulesNotMatch, errors.New(errMessage) } - if matchingTerms, err = c.getMatchingAntiAffinityTerms(pod, filteredPods); err != nil { + if topologyMaps, err = c.getMatchingAntiAffinityTopologyPairsOfPods(pod, filteredPods); err != nil { errMessage := fmt.Sprintf("Failed to get all terms that pod %+v matches, err: %+v", podName(pod), err) glog.Error(errMessage) return ErrExistingPodsAntiAffinityRulesNotMatch, errors.New(errMessage) } } - for _, terms := range matchingTerms { - for i := range terms { - term := &terms[i] - if len(term.term.TopologyKey) == 0 { - errMessage := fmt.Sprintf("Empty topologyKey is not allowed except for PreferredDuringScheduling pod anti-affinity") - glog.Error(errMessage) - return ErrExistingPodsAntiAffinityRulesNotMatch, errors.New(errMessage) - } - if priorityutil.NodesHaveSameTopologyKey(node, term.node, term.term.TopologyKey) { - glog.V(10).Infof("Cannot schedule pod %+v onto node %v,because of PodAntiAffinityTerm %v", - podName(pod), node.Name, term.term) - return ErrExistingPodsAntiAffinityRulesNotMatch, nil - } + + // Iterate over topology pairs to get any of the pods being affected by + // the scheduled pod anti-affinity terms + for topologyKey, topologyValue := range node.Labels { + if topologyMaps.topologyPairToPods[topologyPair{key: topologyKey, value: topologyValue}] != nil { + glog.V(10).Infof("Cannot schedule pod %+v onto node %v", podName(pod), node.Name) + return ErrExistingPodsAntiAffinityRulesNotMatch, nil } } if glog.V(10) { // We explicitly don't do glog.V(10).Infof() to avoid computing all the parameters if this is // not logged. There is visible performance gain from it. - glog.Infof("Schedule Pod %+v on Node %+v is allowed, existing pods anti-affinity rules satisfied.", + glog.Infof("Schedule Pod %+v on Node %+v is allowed, existing pods anti-affinity terms satisfied.", podName(pod), node.Name) } return nil, nil } -// anyPodsMatchingTopologyTerms checks whether any of the nodes given via -// "targetPods" matches topology of all the "terms" for the give "pod" and "nodeInfo". -func (c *PodAffinityChecker) anyPodsMatchingTopologyTerms(pod *v1.Pod, targetPods map[string][]*v1.Pod, nodeInfo *schedulercache.NodeInfo, terms []v1.PodAffinityTerm) (bool, error) { - for nodeName, targetPods := range targetPods { - targetPodNodeInfo, err := c.info.GetNodeInfo(nodeName) - if err != nil { - return false, err - } - if len(targetPods) > 0 { - allTermsMatched := true - for _, term := range terms { - if !priorityutil.NodesHaveSameTopologyKey(nodeInfo.Node(), targetPodNodeInfo, term.TopologyKey) { - allTermsMatched = false - break - } +// nodeMatchesAllTopologyTerms checks whether "nodeInfo" matches +// topology of all the "terms" for the given "pod". +func (c *PodAffinityChecker) nodeMatchesAllTopologyTerms(pod *v1.Pod, topologyPairs *topologyPairsMaps, nodeInfo *schedulercache.NodeInfo, terms []v1.PodAffinityTerm) bool { + node := nodeInfo.Node() + for _, term := range terms { + if topologyValue, ok := node.Labels[term.TopologyKey]; ok { + pair := topologyPair{key: term.TopologyKey, value: topologyValue} + if _, ok := topologyPairs.topologyPairToPods[pair]; !ok { + return false } - if allTermsMatched { - // We have 1 or more pods on the target node that have already matched namespace and selector - // and all of the terms topologies matched the target node. So, there is at least 1 matching pod on the node. - return true, nil + } else { + return false + } + } + return true +} + +// nodeMatchesAnyTopologyTerm checks whether "nodeInfo" matches +// topology of any "term" for the given "pod". +func (c *PodAffinityChecker) nodeMatchesAnyTopologyTerm(pod *v1.Pod, topologyPairs *topologyPairsMaps, nodeInfo *schedulercache.NodeInfo, terms []v1.PodAffinityTerm) bool { + node := nodeInfo.Node() + for _, term := range terms { + if topologyValue, ok := node.Labels[term.TopologyKey]; ok { + pair := topologyPair{key: term.TopologyKey, value: topologyValue} + if _, ok := topologyPairs.topologyPairToPods[pair]; ok { + return true } } } - return false, nil + return false } -// Checks if scheduling the pod onto this node would break any rules of this pod. +// Checks if scheduling the pod onto this node would break any term of this pod. func (c *PodAffinityChecker) satisfiesPodsAffinityAntiAffinity(pod *v1.Pod, meta algorithm.PredicateMetadata, nodeInfo *schedulercache.NodeInfo, affinity *v1.Affinity) (algorithm.PredicateFailureReason, error) { @@ -1403,20 +1372,15 @@ func (c *PodAffinityChecker) satisfiesPodsAffinityAntiAffinity(pod *v1.Pod, } if predicateMeta, ok := meta.(*predicateMetadata); ok { // Check all affinity terms. - matchingPods := predicateMeta.nodeNameToMatchingAffinityPods + topologyPairsPotentialAffinityPods := predicateMeta.topologyPairsPotentialAffinityPods if affinityTerms := GetPodAffinityTerms(affinity.PodAffinity); len(affinityTerms) > 0 { - matchExists, err := c.anyPodsMatchingTopologyTerms(pod, matchingPods, nodeInfo, affinityTerms) - if err != nil { - errMessage := fmt.Sprintf("Cannot schedule pod %+v onto node %v, because of PodAffinity, err: %v", podName(pod), node.Name, err) - glog.Errorf(errMessage) - return ErrPodAffinityRulesNotMatch, errors.New(errMessage) - } + matchExists := c.nodeMatchesAllTopologyTerms(pod, topologyPairsPotentialAffinityPods, nodeInfo, affinityTerms) if !matchExists { // This pod may the first pod in a series that have affinity to themselves. In order // to not leave such pods in pending state forever, we check that if no other pod // in the cluster matches the namespace and selector of this pod and the pod matches // its own terms, then we allow the pod to pass the affinity check. - if !(len(matchingPods) == 0 && targetPodMatchesAffinityOfPod(pod, pod)) { + if !(len(topologyPairsPotentialAffinityPods.topologyPairToPods) == 0 && targetPodMatchesAffinityOfPod(pod, pod)) { glog.V(10).Infof("Cannot schedule pod %+v onto node %v, because of PodAffinity", podName(pod), node.Name) return ErrPodAffinityRulesNotMatch, nil @@ -1425,16 +1389,16 @@ func (c *PodAffinityChecker) satisfiesPodsAffinityAntiAffinity(pod *v1.Pod, } // Check all anti-affinity terms. - matchingPods = predicateMeta.nodeNameToMatchingAntiAffinityPods + topologyPairsPotentialAntiAffinityPods := predicateMeta.topologyPairsPotentialAntiAffinityPods if antiAffinityTerms := GetPodAntiAffinityTerms(affinity.PodAntiAffinity); len(antiAffinityTerms) > 0 { - matchExists, err := c.anyPodsMatchingTopologyTerms(pod, matchingPods, nodeInfo, antiAffinityTerms) - if err != nil || matchExists { - glog.V(10).Infof("Cannot schedule pod %+v onto node %v, because of PodAntiAffinity, err: %v", - podName(pod), node.Name, err) + matchExists := c.nodeMatchesAnyTopologyTerm(pod, topologyPairsPotentialAntiAffinityPods, nodeInfo, antiAffinityTerms) + if matchExists { + glog.V(10).Infof("Cannot schedule pod %+v onto node %v, because of PodAntiAffinity", + podName(pod), node.Name) return ErrPodAntiAffinityRulesNotMatch, nil } } - } else { // We don't have precomputed metadata. We have to follow a slow path to check affinity rules. + } else { // We don't have precomputed metadata. We have to follow a slow path to check affinity terms. filteredPods, err := c.podLister.FilteredList(nodeInfo.Filter, labels.Everything()) if err != nil { return ErrPodAffinityRulesNotMatch, err @@ -1472,7 +1436,7 @@ func (c *PodAffinityChecker) satisfiesPodsAffinityAntiAffinity(pod *v1.Pod, } if !matchFound && len(affinityTerms) > 0 { - // We have not been able to find any matches for the pod's affinity rules. + // We have not been able to find any matches for the pod's affinity terms. // This pod may be the first pod in a series that have affinity to themselves. In order // to not leave such pods in pending state forever, we check that if no other pod // in the cluster matches the namespace and selector of this pod and the pod matches @@ -1506,7 +1470,14 @@ func CheckNodeUnschedulablePredicate(pod *v1.Pod, meta algorithm.PredicateMetada return false, []algorithm.PredicateFailureReason{ErrNodeUnknownCondition}, nil } - if nodeInfo.Node().Spec.Unschedulable { + // If pod tolerate unschedulable taint, it's also tolerate `node.Spec.Unschedulable`. + podToleratesUnschedulable := v1helper.TolerationsTolerateTaint(pod.Spec.Tolerations, &v1.Taint{ + Key: algorithm.TaintNodeUnschedulable, + Effect: v1.TaintEffectNoSchedule, + }) + + // TODO (k82cn): deprecates `node.Spec.Unschedulable` in 1.13. + if nodeInfo.Node().Spec.Unschedulable && !podToleratesUnschedulable { return false, []algorithm.PredicateFailureReason{ErrNodeUnschedulable}, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/BUILD index eab1c834..698ee235 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/BUILD @@ -11,17 +11,16 @@ go_test( srcs = [ "non_zero_test.go", "topologies_test.go", - "util_test.go", ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/selection:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) @@ -30,14 +29,12 @@ go_library( srcs = [ "non_zero.go", "topologies.go", - "util.go", ], importpath = "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/util.go b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/util.go deleted file mode 100644 index a3150c34..00000000 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util/util.go +++ /dev/null @@ -1,36 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 util - -import ( - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// GetControllerRef gets pod's owner controller reference from a pod object. -func GetControllerRef(pod *v1.Pod) *metav1.OwnerReference { - if len(pod.OwnerReferences) == 0 { - return nil - } - for i := range pod.OwnerReferences { - ref := &pod.OwnerReferences[i] - if ref.Controller != nil && *ref.Controller { - return ref - } - } - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go index 7bb5eecf..cd1535cb 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/algorithm/types.go @@ -17,9 +17,8 @@ limitations under the License. package algorithm import ( - apps "k8s.io/api/apps/v1beta1" + apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" - extensions "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/labels" schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" schedulercache "k8s.io/kubernetes/pkg/scheduler/cache" @@ -120,7 +119,7 @@ type ControllerLister interface { // ReplicaSetLister interface represents anything that can produce a list of ReplicaSet; the list is consumed by a scheduler. type ReplicaSetLister interface { // Gets the replicasets for the given pod - GetPodReplicaSets(*v1.Pod) ([]*extensions.ReplicaSet, error) + GetPodReplicaSets(*v1.Pod) ([]*apps.ReplicaSet, error) } var _ ControllerLister = &EmptyControllerLister{} @@ -144,7 +143,7 @@ var _ ReplicaSetLister = &EmptyReplicaSetLister{} type EmptyReplicaSetLister struct{} // GetPodReplicaSets returns nil -func (f EmptyReplicaSetLister) GetPodReplicaSets(pod *v1.Pod) (rss []*extensions.ReplicaSet, err error) { +func (f EmptyReplicaSetLister) GetPodReplicaSets(pod *v1.Pod) (rss []*apps.ReplicaSet, err error) { return nil, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/api/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/api/BUILD index eeaef16a..a160d036 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/api/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/api/BUILD @@ -15,12 +15,12 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/scheduler/api", deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/api/types.go b/vendor/k8s.io/kubernetes/pkg/scheduler/api/types.go index 4964349a..3bffc216 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/api/types.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/api/types.go @@ -36,6 +36,9 @@ const ( MaxPriority = 10 // MaxWeight defines the max weight value. MaxWeight = MaxInt / MaxPriority + // DefaultPercentageOfNodesToScore defines the percentage of nodes of all nodes + // that once found feasible, the scheduler stops looking for more nodes. + DefaultPercentageOfNodesToScore = 50 ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/api/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/scheduler/api/zz_generated.deepcopy.go index d8654dd2..418c78cd 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/api/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/api/zz_generated.deepcopy.go @@ -31,33 +31,21 @@ func (in *ExtenderArgs) DeepCopyInto(out *ExtenderArgs) { *out = *in if in.Pod != nil { in, out := &in.Pod, &out.Pod - if *in == nil { - *out = nil - } else { - *out = new(v1.Pod) - (*in).DeepCopyInto(*out) - } + *out = new(v1.Pod) + (*in).DeepCopyInto(*out) } if in.Nodes != nil { in, out := &in.Nodes, &out.Nodes - if *in == nil { - *out = nil - } else { - *out = new(v1.NodeList) - (*in).DeepCopyInto(*out) - } + *out = new(v1.NodeList) + (*in).DeepCopyInto(*out) } if in.NodeNames != nil { in, out := &in.NodeNames, &out.NodeNames - if *in == nil { - *out = nil - } else { - *out = new([]string) - if **in != nil { - in, out := *in, *out - *out = make([]string, len(*in)) - copy(*out, *in) - } + *out = new([]string) + if **in != nil { + in, out := *in, *out + *out = make([]string, len(*in)) + copy(*out, *in) } } return @@ -110,12 +98,8 @@ func (in *ExtenderConfig) DeepCopyInto(out *ExtenderConfig) { *out = *in if in.TLSConfig != nil { in, out := &in.TLSConfig, &out.TLSConfig - if *in == nil { - *out = nil - } else { - *out = new(rest.TLSClientConfig) - (*in).DeepCopyInto(*out) - } + *out = new(rest.TLSClientConfig) + (*in).DeepCopyInto(*out) } if in.ManagedResources != nil { in, out := &in.ManagedResources, &out.ManagedResources @@ -140,24 +124,16 @@ func (in *ExtenderFilterResult) DeepCopyInto(out *ExtenderFilterResult) { *out = *in if in.Nodes != nil { in, out := &in.Nodes, &out.Nodes - if *in == nil { - *out = nil - } else { - *out = new(v1.NodeList) - (*in).DeepCopyInto(*out) - } + *out = new(v1.NodeList) + (*in).DeepCopyInto(*out) } if in.NodeNames != nil { in, out := &in.NodeNames, &out.NodeNames - if *in == nil { - *out = nil - } else { - *out = new([]string) - if **in != nil { - in, out := *in, *out - *out = make([]string, len(*in)) - copy(*out, *in) - } + *out = new([]string) + if **in != nil { + in, out := *in, *out + *out = make([]string, len(*in)) + copy(*out, *in) } } if in.FailedNodes != nil { @@ -201,35 +177,37 @@ func (in *ExtenderPreemptionArgs) DeepCopyInto(out *ExtenderPreemptionArgs) { *out = *in if in.Pod != nil { in, out := &in.Pod, &out.Pod - if *in == nil { - *out = nil - } else { - *out = new(v1.Pod) - (*in).DeepCopyInto(*out) - } + *out = new(v1.Pod) + (*in).DeepCopyInto(*out) } if in.NodeNameToVictims != nil { in, out := &in.NodeNameToVictims, &out.NodeNameToVictims *out = make(map[string]*Victims, len(*in)) for key, val := range *in { + var outVal *Victims if val == nil { (*out)[key] = nil } else { - (*out)[key] = new(Victims) - val.DeepCopyInto((*out)[key]) + in, out := &val, &outVal + *out = new(Victims) + (*in).DeepCopyInto(*out) } + (*out)[key] = outVal } } if in.NodeNameToMetaVictims != nil { in, out := &in.NodeNameToMetaVictims, &out.NodeNameToMetaVictims *out = make(map[string]*MetaVictims, len(*in)) for key, val := range *in { + var outVal *MetaVictims if val == nil { (*out)[key] = nil } else { - (*out)[key] = new(MetaVictims) - val.DeepCopyInto((*out)[key]) + in, out := &val, &outVal + *out = new(MetaVictims) + (*in).DeepCopyInto(*out) } + (*out)[key] = outVal } } return @@ -252,12 +230,15 @@ func (in *ExtenderPreemptionResult) DeepCopyInto(out *ExtenderPreemptionResult) in, out := &in.NodeNameToMetaVictims, &out.NodeNameToMetaVictims *out = make(map[string]*MetaVictims, len(*in)) for key, val := range *in { + var outVal *MetaVictims if val == nil { (*out)[key] = nil } else { - (*out)[key] = new(MetaVictims) - val.DeepCopyInto((*out)[key]) + in, out := &val, &outVal + *out = new(MetaVictims) + (*in).DeepCopyInto(*out) } + (*out)[key] = outVal } } return @@ -391,11 +372,10 @@ func (in *MetaVictims) DeepCopyInto(out *MetaVictims) { in, out := &in.Pods, &out.Pods *out = make([]*MetaPod, len(*in)) for i := range *in { - if (*in)[i] == nil { - (*out)[i] = nil - } else { - (*out)[i] = new(MetaPod) - (*in)[i].DeepCopyInto((*out)[i]) + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(MetaPod) + **out = **in } } } @@ -463,21 +443,13 @@ func (in *PredicateArgument) DeepCopyInto(out *PredicateArgument) { *out = *in if in.ServiceAffinity != nil { in, out := &in.ServiceAffinity, &out.ServiceAffinity - if *in == nil { - *out = nil - } else { - *out = new(ServiceAffinity) - (*in).DeepCopyInto(*out) - } + *out = new(ServiceAffinity) + (*in).DeepCopyInto(*out) } if in.LabelsPresence != nil { in, out := &in.LabelsPresence, &out.LabelsPresence - if *in == nil { - *out = nil - } else { - *out = new(LabelsPresence) - (*in).DeepCopyInto(*out) - } + *out = new(LabelsPresence) + (*in).DeepCopyInto(*out) } return } @@ -497,12 +469,8 @@ func (in *PredicatePolicy) DeepCopyInto(out *PredicatePolicy) { *out = *in if in.Argument != nil { in, out := &in.Argument, &out.Argument - if *in == nil { - *out = nil - } else { - *out = new(PredicateArgument) - (*in).DeepCopyInto(*out) - } + *out = new(PredicateArgument) + (*in).DeepCopyInto(*out) } return } @@ -522,30 +490,18 @@ func (in *PriorityArgument) DeepCopyInto(out *PriorityArgument) { *out = *in if in.ServiceAntiAffinity != nil { in, out := &in.ServiceAntiAffinity, &out.ServiceAntiAffinity - if *in == nil { - *out = nil - } else { - *out = new(ServiceAntiAffinity) - **out = **in - } + *out = new(ServiceAntiAffinity) + **out = **in } if in.LabelPreference != nil { in, out := &in.LabelPreference, &out.LabelPreference - if *in == nil { - *out = nil - } else { - *out = new(LabelPreference) - **out = **in - } + *out = new(LabelPreference) + **out = **in } if in.RequestedToCapacityRatioArguments != nil { in, out := &in.RequestedToCapacityRatioArguments, &out.RequestedToCapacityRatioArguments - if *in == nil { - *out = nil - } else { - *out = new(RequestedToCapacityRatioArguments) - (*in).DeepCopyInto(*out) - } + *out = new(RequestedToCapacityRatioArguments) + (*in).DeepCopyInto(*out) } return } @@ -565,12 +521,8 @@ func (in *PriorityPolicy) DeepCopyInto(out *PriorityPolicy) { *out = *in if in.Argument != nil { in, out := &in.Argument, &out.Argument - if *in == nil { - *out = nil - } else { - *out = new(PriorityArgument) - (*in).DeepCopyInto(*out) - } + *out = new(PriorityArgument) + (*in).DeepCopyInto(*out) } return } @@ -666,11 +618,10 @@ func (in *Victims) DeepCopyInto(out *Victims) { in, out := &in.Pods, &out.Pods *out = make([]*v1.Pod, len(*in)) for i := range *in { - if (*in)[i] == nil { - (*out)[i] = nil - } else { - (*out)[i] = new(v1.Pod) - (*in)[i].DeepCopyInto((*out)[i]) + if (*in)[i] != nil { + in, out := &(*in)[i], &(*out)[i] + *out = new(v1.Pod) + (*in).DeepCopyInto(*out) } } } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/BUILD index eece6843..98d474be 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/BUILD @@ -6,6 +6,7 @@ go_library( "cache.go", "interface.go", "node_info.go", + "node_tree.go", "util.go", ], importpath = "k8s.io/kubernetes/pkg/scheduler/cache", @@ -15,13 +16,15 @@ go_library( "//pkg/features:go_default_library", "//pkg/scheduler/algorithm/priorities/util:go_default_library", "//pkg/scheduler/util:go_default_library", + "//pkg/util/node:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -30,22 +33,25 @@ go_test( srcs = [ "cache_test.go", "node_info_test.go", + "node_tree_test.go", + "util_test.go", ], embed = [":go_default_library"], deps = [ "//pkg/features:go_default_library", + "//pkg/kubelet/apis:go_default_library", "//pkg/scheduler/algorithm/priorities/util:go_default_library", "//pkg/scheduler/util:go_default_library", - "//pkg/util/parsers:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/cache.go b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/cache.go index 38e26f51..5fc39804 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/cache.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/cache.go @@ -23,6 +23,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/features" @@ -51,14 +52,17 @@ type schedulerCache struct { period time.Duration // This mutex guards all fields within this cache struct. - mu sync.Mutex + mu sync.RWMutex // a set of assumed pod keys. // The key could further be used to get an entry in podStates. assumedPods map[string]bool // a map from pod key to podState. podStates map[string]*podState nodes map[string]*NodeInfo + nodeTree *NodeTree pdbs map[string]*policy.PodDisruptionBudget + // A map from image name to its imageState. + imageStates map[string]*imageState } type podState struct { @@ -69,6 +73,29 @@ type podState struct { bindingFinished bool } +type imageState struct { + // Size of the image + size int64 + // A set of node names for nodes having this image present + nodes sets.String +} + +// ImageStateSummary provides summarized information about the state of an image. +type ImageStateSummary struct { + // Size of the image + Size int64 + // Used to track how many nodes have this image + NumNodes int +} + +// createImageStateSummary returns a summarizing snapshot of the given image's state. +func (cache *schedulerCache) createImageStateSummary(state *imageState) *ImageStateSummary { + return &ImageStateSummary{ + Size: state.size, + NumNodes: len(state.nodes), + } +} + func newSchedulerCache(ttl, period time.Duration, stop <-chan struct{}) *schedulerCache { return &schedulerCache{ ttl: ttl, @@ -76,17 +103,19 @@ func newSchedulerCache(ttl, period time.Duration, stop <-chan struct{}) *schedul stop: stop, nodes: make(map[string]*NodeInfo), + nodeTree: newNodeTree(nil), assumedPods: make(map[string]bool), podStates: make(map[string]*podState), pdbs: make(map[string]*policy.PodDisruptionBudget), + imageStates: make(map[string]*imageState), } } // Snapshot takes a snapshot of the current schedulerCache. The method has performance impact, // and should be only used in non-critical path. func (cache *schedulerCache) Snapshot() *Snapshot { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() nodes := make(map[string]*NodeInfo) for k, v := range cache.nodes { @@ -113,6 +142,7 @@ func (cache *schedulerCache) Snapshot() *Snapshot { func (cache *schedulerCache) UpdateNodeNameToInfoMap(nodeNameToInfo map[string]*NodeInfo) error { cache.mu.Lock() defer cache.mu.Unlock() + for name, info := range cache.nodes { if utilfeature.DefaultFeatureGate.Enabled(features.BalanceAttachedNodeVolumes) && info.TransientInfo != nil { // Transient scheduler info is reset here. @@ -136,8 +166,8 @@ func (cache *schedulerCache) List(selector labels.Selector) ([]*v1.Pod, error) { } func (cache *schedulerCache) FilteredList(podFilter PodFilter, selector labels.Selector) ([]*v1.Pod, error) { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() // podFilter is expected to return true for most or all of the pods. We // can avoid expensive array growth without wasting too much memory by // pre-allocating capacity. @@ -188,8 +218,8 @@ func (cache *schedulerCache) finishBinding(pod *v1.Pod, now time.Time) error { return err } - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() glog.V(5).Infof("Finished binding for pod %v. Can be expired.", key) currState, ok := cache.podStates[key] @@ -317,6 +347,7 @@ func (cache *schedulerCache) UpdatePod(oldPod, newPod *v1.Pod) error { if err := cache.updatePod(oldPod, newPod); err != nil { return err } + currState.pod = newPod default: return fmt.Errorf("pod %v is not added to scheduler cache, so cannot be updated", key) } @@ -358,8 +389,8 @@ func (cache *schedulerCache) IsAssumedPod(pod *v1.Pod) (bool, error) { return false, err } - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() b, found := cache.assumedPods[key] if !found { @@ -374,8 +405,8 @@ func (cache *schedulerCache) GetPod(pod *v1.Pod) (*v1.Pod, error) { return nil, err } - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() podState, ok := cache.podStates[key] if !ok { @@ -393,7 +424,12 @@ func (cache *schedulerCache) AddNode(node *v1.Node) error { if !ok { n = NewNodeInfo() cache.nodes[node.Name] = n + } else { + cache.removeNodeImageStates(n.node) } + + cache.nodeTree.AddNode(node) + cache.addNodeImageStates(node, n) return n.SetNode(node) } @@ -405,7 +441,12 @@ func (cache *schedulerCache) UpdateNode(oldNode, newNode *v1.Node) error { if !ok { n = NewNodeInfo() cache.nodes[newNode.Name] = n + } else { + cache.removeNodeImageStates(n.node) } + + cache.nodeTree.UpdateNode(oldNode, newNode) + cache.addNodeImageStates(newNode, n) return n.SetNode(newNode) } @@ -424,9 +465,63 @@ func (cache *schedulerCache) RemoveNode(node *v1.Node) error { if len(n.pods) == 0 && n.node == nil { delete(cache.nodes, node.Name) } + + cache.nodeTree.RemoveNode(node) + cache.removeNodeImageStates(node) return nil } +// addNodeImageStates adds states of the images on given node to the given nodeInfo and update the imageStates in +// scheduler cache. This function assumes the lock to scheduler cache has been acquired. +func (cache *schedulerCache) addNodeImageStates(node *v1.Node, nodeInfo *NodeInfo) { + newSum := make(map[string]*ImageStateSummary) + + for _, image := range node.Status.Images { + for _, name := range image.Names { + // update the entry in imageStates + state, ok := cache.imageStates[name] + if !ok { + state = &imageState{ + size: image.SizeBytes, + nodes: sets.NewString(node.Name), + } + cache.imageStates[name] = state + } else { + state.nodes.Insert(node.Name) + } + // create the imageStateSummary for this image + if _, ok := newSum[name]; !ok { + newSum[name] = cache.createImageStateSummary(state) + } + } + } + nodeInfo.imageStates = newSum +} + +// removeNodeImageStates removes the given node record from image entries having the node +// in imageStates cache. After the removal, if any image becomes free, i.e., the image +// is no longer available on any node, the image entry will be removed from imageStates. +func (cache *schedulerCache) removeNodeImageStates(node *v1.Node) { + if node == nil { + return + } + + for _, image := range node.Status.Images { + for _, name := range image.Names { + state, ok := cache.imageStates[name] + if ok { + state.nodes.Delete(node.Name) + if len(state.nodes) == 0 { + // Remove the unused image to make sure the length of + // imageStates represents the total number of different + // images on all nodes + delete(cache.imageStates, name) + } + } + } + } +} + func (cache *schedulerCache) AddPDB(pdb *policy.PodDisruptionBudget) error { cache.mu.Lock() defer cache.mu.Unlock() @@ -449,8 +544,8 @@ func (cache *schedulerCache) RemovePDB(pdb *policy.PodDisruptionBudget) error { } func (cache *schedulerCache) ListPDBs(selector labels.Selector) ([]*policy.PodDisruptionBudget, error) { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() var pdbs []*policy.PodDisruptionBudget for _, pdb := range cache.pdbs { if selector.Matches(labels.Set(pdb.Labels)) { @@ -461,8 +556,8 @@ func (cache *schedulerCache) ListPDBs(selector labels.Selector) ([]*policy.PodDi } func (cache *schedulerCache) IsUpToDate(n *NodeInfo) bool { - cache.mu.Lock() - defer cache.mu.Unlock() + cache.mu.RLock() + defer cache.mu.RUnlock() node, ok := cache.nodes[n.Node().Name] return ok && n.generation == node.generation } @@ -508,3 +603,7 @@ func (cache *schedulerCache) expirePod(key string, ps *podState) error { delete(cache.podStates, key) return nil } + +func (cache *schedulerCache) NodeTree() *NodeTree { + return cache.nodeTree +} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/interface.go b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/interface.go index 33668847..21eba905 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/interface.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/interface.go @@ -125,6 +125,9 @@ type Cache interface { // IsUpToDate returns true if the given NodeInfo matches the current data in the cache. IsUpToDate(n *NodeInfo) bool + + // NodeTree returns a node tree structure + NodeTree() *NodeTree } // Snapshot is a snapshot of cache state diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_info.go b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_info.go index 1479e81c..c6b5f96c 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_info.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_info.go @@ -58,9 +58,10 @@ type NodeInfo struct { taints []v1.Taint taintsErr error - // This is a map from image name to image size, also for checking image existence on the node - // Cache it here to avoid rebuilding the map during scheduling, e.g., in image_locality.go - imageSizes map[string]int64 + // imageStates holds the entry of an image if and only if this image is on the node. The entry can be used for + // checking an image's existence and advanced usage (e.g., image locality scheduling policy) based on the image + // state information. + imageStates map[string]*ImageStateSummary // TransientInfo holds the information pertaining to a scheduling cycle. This will be destructed at the end of // scheduling cycle. @@ -261,7 +262,7 @@ func NewNodeInfo(pods ...*v1.Pod) *NodeInfo { TransientInfo: newTransientSchedulerInfo(), generation: nextGeneration(), usedPorts: make(util.HostPortInfo), - imageSizes: make(map[string]int64), + imageStates: make(map[string]*ImageStateSummary), } for _, pod := range pods { ni.AddPod(pod) @@ -293,12 +294,12 @@ func (n *NodeInfo) UsedPorts() util.HostPortInfo { return n.usedPorts } -// ImageSizes returns the image size information on this node. -func (n *NodeInfo) ImageSizes() map[string]int64 { +// ImageStates returns the state information of all images. +func (n *NodeInfo) ImageStates() map[string]*ImageStateSummary { if n == nil { return nil } - return n.imageSizes + return n.imageStates } // PodsWithAffinity return all pods with (anti)affinity constraints on this node. @@ -392,15 +393,20 @@ func (n *NodeInfo) Clone() *NodeInfo { diskPressureCondition: n.diskPressureCondition, pidPressureCondition: n.pidPressureCondition, usedPorts: make(util.HostPortInfo), - imageSizes: n.imageSizes, + imageStates: n.imageStates, generation: n.generation, } if len(n.pods) > 0 { clone.pods = append([]*v1.Pod(nil), n.pods...) } if len(n.usedPorts) > 0 { - for k, v := range n.usedPorts { - clone.usedPorts[k] = v + // util.HostPortInfo is a map-in-map struct + // make sure it's deep copied + for ip, portMap := range n.usedPorts { + clone.usedPorts[ip] = make(map[util.ProtocolPort]struct{}) + for protocolPort, v := range portMap { + clone.usedPorts[ip][protocolPort] = v + } } } if len(n.podsWithAffinity) > 0 { @@ -547,17 +553,6 @@ func (n *NodeInfo) updateUsedPorts(pod *v1.Pod, add bool) { } } -func (n *NodeInfo) updateImageSizes() { - node := n.Node() - imageSizes := make(map[string]int64) - for _, image := range node.Status.Images { - for _, name := range image.Names { - imageSizes[name] = image.SizeBytes - } - } - n.imageSizes = imageSizes -} - // SetNode sets the overall node information. func (n *NodeInfo) SetNode(node *v1.Node) error { n.node = node @@ -579,7 +574,6 @@ func (n *NodeInfo) SetNode(node *v1.Node) error { } } n.TransientInfo = newTransientSchedulerInfo() - n.updateImageSizes() n.generation = nextGeneration() return nil } @@ -596,6 +590,7 @@ func (n *NodeInfo) RemoveNode(node *v1.Node) error { n.memoryPressureCondition = v1.ConditionUnknown n.diskPressureCondition = v1.ConditionUnknown n.pidPressureCondition = v1.ConditionUnknown + n.imageStates = make(map[string]*ImageStateSummary) n.generation = nextGeneration() return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_tree.go b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_tree.go new file mode 100644 index 00000000..4a8e08d2 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/node_tree.go @@ -0,0 +1,187 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 cache + +import ( + "fmt" + "sync" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/sets" + utilnode "k8s.io/kubernetes/pkg/util/node" + + "github.com/golang/glog" +) + +// NodeTree is a tree-like data structure that holds node names in each zone. Zone names are +// keys to "NodeTree.tree" and values of "NodeTree.tree" are arrays of node names. +type NodeTree struct { + tree map[string]*nodeArray // a map from zone (region-zone) to an array of nodes in the zone. + zones []string // a list of all the zones in the tree (keys) + zoneIndex int + exhaustedZones sets.String // set of zones that all of their nodes are returned by next() + NumNodes int + mu sync.RWMutex +} + +// nodeArray is a struct that has nodes that are in a zone. +// We use a slice (as opposed to a set/map) to store the nodes because iterating over the nodes is +// a lot more frequent than searching them by name. +type nodeArray struct { + nodes []string + lastIndex int +} + +func (na *nodeArray) next() (nodeName string, exhausted bool) { + if len(na.nodes) == 0 { + glog.Error("The nodeArray is empty. It should have been deleted from NodeTree.") + return "", false + } + if na.lastIndex >= len(na.nodes) { + return "", true + } + nodeName = na.nodes[na.lastIndex] + na.lastIndex++ + return nodeName, false +} + +func newNodeTree(nodes []*v1.Node) *NodeTree { + nt := &NodeTree{ + tree: make(map[string]*nodeArray), + exhaustedZones: sets.NewString(), + } + for _, n := range nodes { + nt.AddNode(n) + } + return nt +} + +// AddNode adds a node and its corresponding zone to the tree. If the zone already exists, the node +// is added to the array of nodes in that zone. +func (nt *NodeTree) AddNode(n *v1.Node) { + nt.mu.Lock() + defer nt.mu.Unlock() + nt.addNode(n) +} + +func (nt *NodeTree) addNode(n *v1.Node) { + zone := utilnode.GetZoneKey(n) + if na, ok := nt.tree[zone]; ok { + for _, nodeName := range na.nodes { + if nodeName == n.Name { + glog.Warningf("node %v already exist in the NodeTree", n.Name) + return + } + } + na.nodes = append(na.nodes, n.Name) + } else { + nt.zones = append(nt.zones, zone) + nt.tree[zone] = &nodeArray{nodes: []string{n.Name}, lastIndex: 0} + } + glog.V(5).Infof("Added node %v in group %v to NodeTree", n.Name, zone) + nt.NumNodes++ +} + +// RemoveNode removes a node from the NodeTree. +func (nt *NodeTree) RemoveNode(n *v1.Node) error { + nt.mu.Lock() + defer nt.mu.Unlock() + return nt.removeNode(n) +} + +func (nt *NodeTree) removeNode(n *v1.Node) error { + zone := utilnode.GetZoneKey(n) + if na, ok := nt.tree[zone]; ok { + for i, nodeName := range na.nodes { + if nodeName == n.Name { + na.nodes = append(na.nodes[:i], na.nodes[i+1:]...) + if len(na.nodes) == 0 { + nt.removeZone(zone) + } + glog.V(5).Infof("Removed node %v in group %v from NodeTree", n.Name, zone) + nt.NumNodes-- + return nil + } + } + } + glog.Errorf("Node %v in group %v was not found", n.Name, zone) + return fmt.Errorf("node %v in group %v was not found", n.Name, zone) +} + +// removeZone removes a zone from tree. +// This function must be called while writer locks are hold. +func (nt *NodeTree) removeZone(zone string) { + delete(nt.tree, zone) + for i, z := range nt.zones { + if z == zone { + nt.zones = append(nt.zones[:i], nt.zones[i+1:]...) + } + } +} + +// UpdateNode updates a node in the NodeTree. +func (nt *NodeTree) UpdateNode(old, new *v1.Node) { + var oldZone string + if old != nil { + oldZone = utilnode.GetZoneKey(old) + } + newZone := utilnode.GetZoneKey(new) + // If the zone ID of the node has not changed, we don't need to do anything. Name of the node + // cannot be changed in an update. + if oldZone == newZone { + return + } + nt.mu.Lock() + defer nt.mu.Unlock() + nt.removeNode(old) // No error checking. We ignore whether the old node exists or not. + nt.addNode(new) +} + +func (nt *NodeTree) resetExhausted() { + for _, na := range nt.tree { + na.lastIndex = 0 + } + nt.exhaustedZones = sets.NewString() +} + +// Next returns the name of the next node. NodeTree iterates over zones and in each zone iterates +// over nodes in a round robin fashion. +func (nt *NodeTree) Next() string { + nt.mu.Lock() + defer nt.mu.Unlock() + if len(nt.zones) == 0 { + return "" + } + for { + if nt.zoneIndex >= len(nt.zones) { + nt.zoneIndex = 0 + } + zone := nt.zones[nt.zoneIndex] + nt.zoneIndex++ + // We do not check the set of exhausted zones before calling next() on the zone. This ensures + // that if more nodes are added to a zone after it is exhausted, we iterate over the new nodes. + nodeName, exhausted := nt.tree[zone].next() + if exhausted { + nt.exhaustedZones.Insert(zone) + if len(nt.exhaustedZones) == len(nt.zones) { // all zones are exhausted. we should reset. + nt.resetExhausted() + } + } else { + return nodeName + } + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/util.go b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/util.go index c3037dcc..5a252b64 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/cache/util.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/cache/util.go @@ -16,7 +16,10 @@ limitations under the License. package cache -import "k8s.io/api/core/v1" +import ( + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/sets" +) // CreateNodeNameToInfoMap obtains a list of pods and pivots that list into a map where the keys are node names // and the values are the aggregated information for that node. @@ -29,11 +32,47 @@ func CreateNodeNameToInfoMap(pods []*v1.Pod, nodes []*v1.Node) map[string]*NodeI } nodeNameToInfo[nodeName].AddPod(pod) } + imageExistenceMap := createImageExistenceMap(nodes) + for _, node := range nodes { if _, ok := nodeNameToInfo[node.Name]; !ok { nodeNameToInfo[node.Name] = NewNodeInfo() } - nodeNameToInfo[node.Name].SetNode(node) + nodeInfo := nodeNameToInfo[node.Name] + nodeInfo.SetNode(node) + nodeInfo.imageStates = getNodeImageStates(node, imageExistenceMap) } return nodeNameToInfo } + +// getNodeImageStates returns the given node's image states based on the given imageExistence map. +func getNodeImageStates(node *v1.Node, imageExistenceMap map[string]sets.String) map[string]*ImageStateSummary { + imageStates := make(map[string]*ImageStateSummary) + + for _, image := range node.Status.Images { + for _, name := range image.Names { + imageStates[name] = &ImageStateSummary{ + Size: image.SizeBytes, + NumNodes: len(imageExistenceMap[name]), + } + } + } + return imageStates +} + +// createImageExistenceMap returns a map recording on which nodes the images exist, keyed by the images' names. +func createImageExistenceMap(nodes []*v1.Node) map[string]sets.String { + imageExistenceMap := make(map[string]sets.String) + for _, node := range nodes { + for _, image := range node.Status.Images { + for _, name := range image.Names { + if _, ok := imageExistenceMap[name]; !ok { + imageExistenceMap[name] = sets.NewString(node.Name) + } else { + imageExistenceMap[name].Insert(node.Name) + } + } + } + } + return imageExistenceMap +} diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD index 87bce617..57839b67 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/util/BUILD @@ -15,8 +15,9 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/scheduling:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) @@ -30,10 +31,10 @@ go_library( deps = [ "//pkg/apis/scheduling:go_default_library", "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/BUILD b/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/BUILD index 0656eeee..51817837 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/BUILD @@ -7,12 +7,10 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/controller/volume/persistentvolume:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", + "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/volume_binder.go b/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/volume_binder.go index 1dfe4144..4a0089a4 100644 --- a/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/volume_binder.go +++ b/vendor/k8s.io/kubernetes/pkg/scheduler/volumebinder/volume_binder.go @@ -20,19 +20,15 @@ import ( "time" "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/wait" coreinformers "k8s.io/client-go/informers/core/v1" storageinformers "k8s.io/client-go/informers/storage/v1" clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/workqueue" "k8s.io/kubernetes/pkg/controller/volume/persistentvolume" ) -// VolumeBinder sets up the volume binding library and manages -// the volume binding operations with a queue. +// VolumeBinder sets up the volume binding library type VolumeBinder struct { - Binder persistentvolume.SchedulerVolumeBinder - BindQueue *workqueue.Type + Binder persistentvolume.SchedulerVolumeBinder } // NewVolumeBinder sets up the volume binding library and binding queue @@ -40,30 +36,21 @@ func NewVolumeBinder( client clientset.Interface, pvcInformer coreinformers.PersistentVolumeClaimInformer, pvInformer coreinformers.PersistentVolumeInformer, - storageClassInformer storageinformers.StorageClassInformer) *VolumeBinder { + storageClassInformer storageinformers.StorageClassInformer, + bindTimeout time.Duration) *VolumeBinder { return &VolumeBinder{ - Binder: persistentvolume.NewVolumeBinder(client, pvcInformer, pvInformer, storageClassInformer), - BindQueue: workqueue.NewNamed("podsToBind"), + Binder: persistentvolume.NewVolumeBinder(client, pvcInformer, pvInformer, storageClassInformer, bindTimeout), } } // NewFakeVolumeBinder sets up a fake volume binder and binding queue func NewFakeVolumeBinder(config *persistentvolume.FakeVolumeBinderConfig) *VolumeBinder { return &VolumeBinder{ - Binder: persistentvolume.NewFakeVolumeBinder(config), - BindQueue: workqueue.NewNamed("podsToBind"), + Binder: persistentvolume.NewFakeVolumeBinder(config), } } -// Run starts a goroutine to handle the binding queue with the given function. -func (b *VolumeBinder) Run(bindWorkFunc func(), stopCh <-chan struct{}) { - go wait.Until(bindWorkFunc, time.Second, stopCh) - - <-stopCh - b.BindQueue.ShutDown() -} - // DeletePodBindings will delete the cached volume bindings for the given pod. func (b *VolumeBinder) DeletePodBindings(pod *v1.Pod) { cache := b.Binder.GetBindingsCache() diff --git a/vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD b/vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD index 82829b34..576a2780 100644 --- a/vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/security/apparmor/BUILD @@ -11,46 +11,15 @@ go_library( srcs = [ "helpers.go", "validate.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "validate_disabled.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "validate_disabled.go", - ], - "//conditions:default": [], - }), + "validate_disabled.go", + ], importpath = "k8s.io/kubernetes/pkg/security/apparmor", deps = [ "//pkg/features:go_default_library", "//pkg/kubelet/types:go_default_library", "//pkg/util/file:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -62,9 +31,9 @@ go_test( ], embed = [":go_default_library"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD deleted file mode 100644 index 97a4a3eb..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["strategy.go"], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp", - deps = [ - "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["strategy_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/strategy.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/strategy.go deleted file mode 100644 index 715156e8..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/seccomp/strategy.go +++ /dev/null @@ -1,149 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 seccomp - -import ( - "fmt" - "strings" - - "k8s.io/apimachinery/pkg/util/validation/field" - api "k8s.io/kubernetes/pkg/apis/core" -) - -const ( - // AllowAny is the wildcard used to allow any profile. - AllowAny = "*" - // The annotation key specifying the default seccomp profile. - DefaultProfileAnnotationKey = "seccomp.security.alpha.kubernetes.io/defaultProfileName" - // The annotation key specifying the allowed seccomp profiles. - AllowedProfilesAnnotationKey = "seccomp.security.alpha.kubernetes.io/allowedProfileNames" -) - -// Strategy defines the interface for all seccomp constraint strategies. -type Strategy interface { - // Generate returns a profile based on constraint rules. - Generate(annotations map[string]string, pod *api.Pod) (string, error) - // Validate ensures that the specified values fall within the range of the strategy. - ValidatePod(pod *api.Pod) field.ErrorList - // Validate ensures that the specified values fall within the range of the strategy. - ValidateContainer(pod *api.Pod, container *api.Container) field.ErrorList -} - -type strategy struct { - defaultProfile string - allowedProfiles map[string]bool - // For printing error messages (preserves order). - allowedProfilesString string - // does the strategy allow any profile (wildcard) - allowAnyProfile bool -} - -var _ Strategy = &strategy{} - -// NewStrategy creates a new strategy that enforces seccomp profile constraints. -func NewStrategy(pspAnnotations map[string]string) Strategy { - var allowedProfiles map[string]bool - allowAnyProfile := false - if allowed, ok := pspAnnotations[AllowedProfilesAnnotationKey]; ok { - profiles := strings.Split(allowed, ",") - allowedProfiles = make(map[string]bool, len(profiles)) - for _, p := range profiles { - if p == AllowAny { - allowAnyProfile = true - continue - } - allowedProfiles[p] = true - } - } - return &strategy{ - defaultProfile: pspAnnotations[DefaultProfileAnnotationKey], - allowedProfiles: allowedProfiles, - allowedProfilesString: pspAnnotations[AllowedProfilesAnnotationKey], - allowAnyProfile: allowAnyProfile, - } -} - -// Generate returns a profile based on constraint rules. -func (s *strategy) Generate(annotations map[string]string, pod *api.Pod) (string, error) { - if annotations[api.SeccompPodAnnotationKey] != "" { - // Profile already set, nothing to do. - return annotations[api.SeccompPodAnnotationKey], nil - } - return s.defaultProfile, nil -} - -// ValidatePod ensures that the specified values on the pod fall within the range -// of the strategy. -func (s *strategy) ValidatePod(pod *api.Pod) field.ErrorList { - allErrs := field.ErrorList{} - podSpecFieldPath := field.NewPath("pod", "metadata", "annotations").Key(api.SeccompPodAnnotationKey) - podProfile := pod.Annotations[api.SeccompPodAnnotationKey] - - if !s.allowAnyProfile && len(s.allowedProfiles) == 0 && podProfile != "" { - allErrs = append(allErrs, field.Forbidden(podSpecFieldPath, "seccomp may not be set")) - return allErrs - } - - if !s.profileAllowed(podProfile) { - msg := fmt.Sprintf("%s is not an allowed seccomp profile. Valid values are %v", podProfile, s.allowedProfilesString) - allErrs = append(allErrs, field.Forbidden(podSpecFieldPath, msg)) - } - - return allErrs -} - -// ValidateContainer ensures that the specified values on the container fall within -// the range of the strategy. -func (s *strategy) ValidateContainer(pod *api.Pod, container *api.Container) field.ErrorList { - allErrs := field.ErrorList{} - fieldPath := field.NewPath("pod", "metadata", "annotations").Key(api.SeccompContainerAnnotationKeyPrefix + container.Name) - containerProfile := profileForContainer(pod, container) - - if !s.allowAnyProfile && len(s.allowedProfiles) == 0 && containerProfile != "" { - allErrs = append(allErrs, field.Forbidden(fieldPath, "seccomp may not be set")) - return allErrs - } - - if !s.profileAllowed(containerProfile) { - msg := fmt.Sprintf("%s is not an allowed seccomp profile. Valid values are %v", containerProfile, s.allowedProfilesString) - allErrs = append(allErrs, field.Forbidden(fieldPath, msg)) - } - - return allErrs -} - -// profileAllowed checks if profile is in allowedProfiles or if allowedProfiles -// contains the wildcard. -func (s *strategy) profileAllowed(profile string) bool { - // for backwards compatibility and PSPs without a defined list of allowed profiles. - // If a PSP does not have allowedProfiles set then we should allow an empty profile. - // This will mean that the runtime default is used. - if len(s.allowedProfiles) == 0 && profile == "" { - return true - } - - return s.allowAnyProfile || s.allowedProfiles[profile] -} - -// profileForContainer returns the container profile if set, otherwise the pod profile. -func profileForContainer(pod *api.Pod, container *api.Container) string { - containerProfile, ok := pod.Annotations[api.SeccompContainerAnnotationKeyPrefix+container.Name] - if ok { - return containerProfile - } - return pod.Annotations[api.SeccompPodAnnotationKey] -} diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD deleted file mode 100644 index 445907cc..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "mustmatchpatterns.go", - "types.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl", - deps = [ - "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["mustmatchpatterns_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/apis/core:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/mustmatchpatterns.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/mustmatchpatterns.go deleted file mode 100644 index 6c33276c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/mustmatchpatterns.go +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 sysctl - -import ( - "fmt" - "strings" - - "k8s.io/apimachinery/pkg/util/validation/field" - api "k8s.io/kubernetes/pkg/apis/core" -) - -// SafeSysctlWhitelist returns the whitelist of safe sysctls and safe sysctl patterns (ending in *). -// -// A sysctl is called safe iff -// - it is namespaced in the container or the pod -// - it is isolated, i.e. has no influence on any other pod on the same node. -func SafeSysctlWhitelist() []string { - return []string{ - "kernel.shm_rmid_forced", - "net.ipv4.ip_local_port_range", - "net.ipv4.tcp_syncookies", - } -} - -// mustMatchPatterns implements the SysctlsStrategy interface -type mustMatchPatterns struct { - safeWhitelist []string - allowedUnsafeSysctls []string - forbiddenSysctls []string -} - -var ( - _ SysctlsStrategy = &mustMatchPatterns{} - - defaultSysctlsPatterns = []string{"*"} -) - -// NewMustMatchPatterns creates a new mustMatchPatterns strategy that will provide validation. -// Passing nil means the default pattern, passing an empty list means to disallow all sysctls. -func NewMustMatchPatterns(safeWhitelist, allowedUnsafeSysctls, forbiddenSysctls []string) SysctlsStrategy { - return &mustMatchPatterns{ - safeWhitelist: safeWhitelist, - allowedUnsafeSysctls: allowedUnsafeSysctls, - forbiddenSysctls: forbiddenSysctls, - } -} - -func (s *mustMatchPatterns) isForbidden(sysctlName string) bool { - // Is the sysctl forbidden? - for _, s := range s.forbiddenSysctls { - if strings.HasSuffix(s, "*") { - prefix := strings.TrimSuffix(s, "*") - if strings.HasPrefix(sysctlName, prefix) { - return true - } - } else if sysctlName == s { - return true - } - } - return false -} - -func (s *mustMatchPatterns) isSafe(sysctlName string) bool { - for _, ws := range s.safeWhitelist { - if sysctlName == ws { - return true - } - } - return false -} - -func (s *mustMatchPatterns) isAllowedUnsafe(sysctlName string) bool { - for _, s := range s.allowedUnsafeSysctls { - if strings.HasSuffix(s, "*") { - prefix := strings.TrimSuffix(s, "*") - if strings.HasPrefix(sysctlName, prefix) { - return true - } - } else if sysctlName == s { - return true - } - } - return false -} - -// Validate ensures that the specified values fall within the range of the strategy. -func (s *mustMatchPatterns) Validate(pod *api.Pod) field.ErrorList { - allErrs := field.ErrorList{} - - var sysctls []api.Sysctl - if pod.Spec.SecurityContext != nil { - sysctls = pod.Spec.SecurityContext.Sysctls - } - - fieldPath := field.NewPath("pod", "spec", "securityContext").Child("sysctls") - - for i, sysctl := range sysctls { - switch { - case s.isForbidden(sysctl.Name): - allErrs = append(allErrs, field.ErrorList{field.Forbidden(fieldPath.Index(i), fmt.Sprintf("sysctl %q is not allowed", sysctl.Name))}...) - case s.isSafe(sysctl.Name): - continue - case s.isAllowedUnsafe(sysctl.Name): - continue - default: - allErrs = append(allErrs, field.ErrorList{field.Forbidden(fieldPath.Index(i), fmt.Sprintf("unsafe sysctl %q is not allowed", sysctl.Name))}...) - } - } - - return allErrs -} diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/types.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/types.go deleted file mode 100644 index a6c2034a..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl/types.go +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 sysctl - -import ( - "k8s.io/apimachinery/pkg/util/validation/field" - api "k8s.io/kubernetes/pkg/apis/core" -) - -// SysctlsStrategy defines the interface for all sysctl strategies. -type SysctlsStrategy interface { - // Validate ensures that the specified values fall within the range of the strategy. - Validate(pod *api.Pod) field.ErrorList -} diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD deleted file mode 100644 index 24c8ec07..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "util.go", - ], - importpath = "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util", - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//pkg/apis/policy:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/doc.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/doc.go deleted file mode 100644 index af407b58..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 util contains utility code shared amongst different parts of the -// pod security policy apparatus. -package util diff --git a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go b/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go deleted file mode 100644 index 3f29f6e7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/security/podsecuritypolicy/util/util.go +++ /dev/null @@ -1,242 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 util - -import ( - "fmt" - "strings" - - "k8s.io/apimachinery/pkg/util/sets" - api "k8s.io/kubernetes/pkg/apis/core" - "k8s.io/kubernetes/pkg/apis/policy" -) - -const ( - ValidatedPSPAnnotation = "kubernetes.io/psp" -) - -func GetAllFSTypesExcept(exceptions ...string) sets.String { - fstypes := GetAllFSTypesAsSet() - for _, e := range exceptions { - fstypes.Delete(e) - } - return fstypes -} - -func GetAllFSTypesAsSet() sets.String { - fstypes := sets.NewString() - fstypes.Insert( - string(policy.HostPath), - string(policy.AzureFile), - string(policy.Flocker), - string(policy.FlexVolume), - string(policy.EmptyDir), - string(policy.GCEPersistentDisk), - string(policy.AWSElasticBlockStore), - string(policy.GitRepo), - string(policy.Secret), - string(policy.NFS), - string(policy.ISCSI), - string(policy.Glusterfs), - string(policy.PersistentVolumeClaim), - string(policy.RBD), - string(policy.Cinder), - string(policy.CephFS), - string(policy.DownwardAPI), - string(policy.FC), - string(policy.ConfigMap), - string(policy.VsphereVolume), - string(policy.Quobyte), - string(policy.AzureDisk), - string(policy.PhotonPersistentDisk), - string(policy.StorageOS), - string(policy.Projected), - string(policy.PortworxVolume), - string(policy.ScaleIO), - string(policy.CSI), - ) - return fstypes -} - -// getVolumeFSType gets the FSType for a volume. -func GetVolumeFSType(v api.Volume) (policy.FSType, error) { - switch { - case v.HostPath != nil: - return policy.HostPath, nil - case v.EmptyDir != nil: - return policy.EmptyDir, nil - case v.GCEPersistentDisk != nil: - return policy.GCEPersistentDisk, nil - case v.AWSElasticBlockStore != nil: - return policy.AWSElasticBlockStore, nil - case v.GitRepo != nil: - return policy.GitRepo, nil - case v.Secret != nil: - return policy.Secret, nil - case v.NFS != nil: - return policy.NFS, nil - case v.ISCSI != nil: - return policy.ISCSI, nil - case v.Glusterfs != nil: - return policy.Glusterfs, nil - case v.PersistentVolumeClaim != nil: - return policy.PersistentVolumeClaim, nil - case v.RBD != nil: - return policy.RBD, nil - case v.FlexVolume != nil: - return policy.FlexVolume, nil - case v.Cinder != nil: - return policy.Cinder, nil - case v.CephFS != nil: - return policy.CephFS, nil - case v.Flocker != nil: - return policy.Flocker, nil - case v.DownwardAPI != nil: - return policy.DownwardAPI, nil - case v.FC != nil: - return policy.FC, nil - case v.AzureFile != nil: - return policy.AzureFile, nil - case v.ConfigMap != nil: - return policy.ConfigMap, nil - case v.VsphereVolume != nil: - return policy.VsphereVolume, nil - case v.Quobyte != nil: - return policy.Quobyte, nil - case v.AzureDisk != nil: - return policy.AzureDisk, nil - case v.PhotonPersistentDisk != nil: - return policy.PhotonPersistentDisk, nil - case v.StorageOS != nil: - return policy.StorageOS, nil - case v.Projected != nil: - return policy.Projected, nil - case v.PortworxVolume != nil: - return policy.PortworxVolume, nil - case v.ScaleIO != nil: - return policy.ScaleIO, nil - } - - return "", fmt.Errorf("unknown volume type for volume: %#v", v) -} - -// FSTypeToStringSet converts an FSType slice to a string set. -func FSTypeToStringSet(fsTypes []policy.FSType) sets.String { - set := sets.NewString() - for _, v := range fsTypes { - set.Insert(string(v)) - } - return set -} - -// PSPAllowsAllVolumes checks for FSTypeAll in the psp's allowed volumes. -func PSPAllowsAllVolumes(psp *policy.PodSecurityPolicy) bool { - return PSPAllowsFSType(psp, policy.All) -} - -// PSPAllowsFSType is a utility for checking if a PSP allows a particular FSType. -// If all volumes are allowed then this will return true for any FSType passed. -func PSPAllowsFSType(psp *policy.PodSecurityPolicy, fsType policy.FSType) bool { - if psp == nil { - return false - } - - for _, v := range psp.Spec.Volumes { - if v == fsType || v == policy.All { - return true - } - } - return false -} - -// UserFallsInRange is a utility to determine it the id falls in the valid range. -func UserFallsInRange(id int64, rng policy.IDRange) bool { - return id >= rng.Min && id <= rng.Max -} - -// GroupFallsInRange is a utility to determine it the id falls in the valid range. -func GroupFallsInRange(id int64, rng policy.IDRange) bool { - return id >= rng.Min && id <= rng.Max -} - -// AllowsHostVolumePath is a utility for checking if a PSP allows the host volume path. -// This only checks the path. You should still check to make sure the host volume fs type is allowed. -func AllowsHostVolumePath(psp *policy.PodSecurityPolicy, hostPath string) (pathIsAllowed, mustBeReadOnly bool) { - if psp == nil { - return false, false - } - - // If no allowed paths are specified then allow any path - if len(psp.Spec.AllowedHostPaths) == 0 { - return true, false - } - - for _, allowedPath := range psp.Spec.AllowedHostPaths { - if hasPathPrefix(hostPath, allowedPath.PathPrefix) { - if !allowedPath.ReadOnly { - return true, allowedPath.ReadOnly - } - pathIsAllowed = true - mustBeReadOnly = true - } - } - - return pathIsAllowed, mustBeReadOnly -} - -// hasPathPrefix returns true if the string matches pathPrefix exactly, or if is prefixed with pathPrefix at a path segment boundary -// the string and pathPrefix are both normalized to remove trailing slashes prior to checking. -func hasPathPrefix(s, pathPrefix string) bool { - - s = strings.TrimSuffix(s, "/") - pathPrefix = strings.TrimSuffix(pathPrefix, "/") - - // Short circuit if s doesn't contain the prefix at all - if !strings.HasPrefix(s, pathPrefix) { - return false - } - - pathPrefixLength := len(pathPrefix) - - if len(s) == pathPrefixLength { - // Exact match - return true - } - - if s[pathPrefixLength:pathPrefixLength+1] == "/" { - // The next character in s is a path segment boundary - // Check this instead of normalizing pathPrefix to avoid allocating on every call - // Example where this check applies: s=/foo/bar and pathPrefix=/foo - return true - } - - return false -} - -// EqualStringSlices compares string slices for equality. Slices are equal when -// their sizes and elements on similar positions are equal. -func EqualStringSlices(a, b []string) bool { - if len(a) != len(b) { - return false - } - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - return false - } - } - return true -} diff --git a/vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD b/vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD index def21ae1..9ef45c6e 100644 --- a/vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/securitycontext/BUILD @@ -17,7 +17,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/securitycontext", deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", ], ) @@ -30,8 +30,8 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/securitycontext/accessors.go b/vendor/k8s.io/kubernetes/pkg/securitycontext/accessors.go index 98ac6e0b..cf372f28 100644 --- a/vendor/k8s.io/kubernetes/pkg/securitycontext/accessors.go +++ b/vendor/k8s.io/kubernetes/pkg/securitycontext/accessors.go @@ -188,6 +188,7 @@ func (w *podSecurityContextWrapper) SetFSGroup(v *int64) { type ContainerSecurityContextAccessor interface { Capabilities() *api.Capabilities Privileged() *bool + ProcMount() api.ProcMountType SELinuxOptions() *api.SELinuxOptions RunAsUser() *int64 RunAsNonRoot() *bool @@ -257,6 +258,15 @@ func (w *containerSecurityContextWrapper) SetPrivileged(v *bool) { w.ensureContainerSC() w.containerSC.Privileged = v } +func (w *containerSecurityContextWrapper) ProcMount() api.ProcMountType { + if w.containerSC == nil { + return api.DefaultProcMount + } + if w.containerSC.ProcMount == nil { + return api.DefaultProcMount + } + return *w.containerSC.ProcMount +} func (w *containerSecurityContextWrapper) SELinuxOptions() *api.SELinuxOptions { if w.containerSC == nil { return nil @@ -356,6 +366,9 @@ func (w *effectiveContainerSecurityContextWrapper) SetPrivileged(v *bool) { w.containerSC.SetPrivileged(v) } } +func (w *effectiveContainerSecurityContextWrapper) ProcMount() api.ProcMountType { + return w.containerSC.ProcMount() +} func (w *effectiveContainerSecurityContextWrapper) SELinuxOptions() *api.SELinuxOptions { if v := w.containerSC.SELinuxOptions(); v != nil { return v diff --git a/vendor/k8s.io/kubernetes/pkg/securitycontext/fake.go b/vendor/k8s.io/kubernetes/pkg/securitycontext/fake.go index 975445ba..3303db21 100644 --- a/vendor/k8s.io/kubernetes/pkg/securitycontext/fake.go +++ b/vendor/k8s.io/kubernetes/pkg/securitycontext/fake.go @@ -35,8 +35,10 @@ func ValidSecurityContextWithContainerDefaults() *v1.SecurityContext { // empty container defaults. Used for testing. func ValidInternalSecurityContextWithContainerDefaults() *api.SecurityContext { priv := false + dpm := api.DefaultProcMount return &api.SecurityContext{ Capabilities: &api.Capabilities{}, Privileged: &priv, + ProcMount: &dpm, } } diff --git a/vendor/k8s.io/kubernetes/pkg/securitycontext/util.go b/vendor/k8s.io/kubernetes/pkg/securitycontext/util.go index 5ade5588..07489baf 100644 --- a/vendor/k8s.io/kubernetes/pkg/securitycontext/util.go +++ b/vendor/k8s.io/kubernetes/pkg/securitycontext/util.go @@ -72,7 +72,7 @@ func DetermineEffectiveSecurityContext(pod *v1.Pod, container *v1.Container) *v1 containerSc := container.SecurityContext if effectiveSc == nil && containerSc == nil { - return nil + return &v1.SecurityContext{} } if effectiveSc != nil && containerSc == nil { return effectiveSc @@ -121,6 +121,11 @@ func DetermineEffectiveSecurityContext(pod *v1.Pod, container *v1.Container) *v1 *effectiveSc.AllowPrivilegeEscalation = *containerSc.AllowPrivilegeEscalation } + if containerSc.ProcMount != nil { + effectiveSc.ProcMount = new(v1.ProcMountType) + *effectiveSc.ProcMount = *containerSc.ProcMount + } + return effectiveSc } @@ -167,3 +172,52 @@ func AddNoNewPrivileges(sc *v1.SecurityContext) bool { // handle the case where defaultAllowPrivilegeEscalation is false or the user explicitly set allowPrivilegeEscalation to true/false return !*sc.AllowPrivilegeEscalation } + +var ( + // These *must* be kept in sync with moby/moby. + // https://github.com/moby/moby/blob/master/oci/defaults.go#L116-L134 + // @jessfraz will watch changes to those files upstream. + defaultMaskedPaths = []string{ + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + } + defaultReadonlyPaths = []string{ + "/proc/asound", + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger", + } +) + +// ConvertToRuntimeMaskedPaths converts the ProcMountType to the specified or default +// masked paths. +func ConvertToRuntimeMaskedPaths(opt *v1.ProcMountType) []string { + if opt != nil && *opt == v1.UnmaskedProcMount { + // Unmasked proc mount should have no paths set as masked. + return []string{} + } + + // Otherwise, add the default masked paths to the runtime security context. + return defaultMaskedPaths +} + +// ConvertToRuntimeReadonlyPaths converts the ProcMountType to the specified or default +// readonly paths. +func ConvertToRuntimeReadonlyPaths(opt *v1.ProcMountType) []string { + if opt != nil && *opt == v1.UnmaskedProcMount { + // Unmasked proc mount should have no paths set as readonly. + return []string{} + } + + // Otherwise, add the default readonly paths to the runtime security context. + return defaultReadonlyPaths +} diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD b/vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD index 63ddcf92..71a9836d 100644 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/serviceaccount/BUILD @@ -17,28 +17,14 @@ go_library( importpath = "k8s.io/kubernetes/pkg/serviceaccount", deps = [ "//pkg/apis/core:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/gopkg.in/square/go-jose.v2:go_default_library", "//vendor/gopkg.in/square/go-jose.v2/jwt:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/serviceaccount:go_default_library", - "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["jwt_test.go"], - deps = [ - ":go_default_library", - "//pkg/controller/serviceaccount:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", ], ) @@ -59,13 +45,18 @@ go_test( name = "go_default_test", srcs = [ "claims_test.go", + "jwt_test.go", "util_test.go", ], embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", + "//pkg/controller/serviceaccount:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/client-go/util/cert:go_default_library", "//vendor/gopkg.in/square/go-jose.v2/jwt:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go b/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go index 9acc6ccc..070418ff 100644 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go +++ b/vendor/k8s.io/kubernetes/pkg/serviceaccount/claims.go @@ -94,11 +94,11 @@ type validator struct { var _ = Validator(&validator{}) -func (v *validator) Validate(_ string, public *jwt.Claims, privateObj interface{}) (string, string, string, error) { +func (v *validator) Validate(_ string, public *jwt.Claims, privateObj interface{}) (*ServiceAccountInfo, error) { private, ok := privateObj.(*privateClaims) if !ok { glog.Errorf("jwt validator expected private claim of type *privateClaims but got: %T", privateObj) - return "", "", "", errors.New("Token could not be validated.") + return nil, errors.New("Token could not be validated.") } err := public.Validate(jwt.Expected{ Time: now(), @@ -106,10 +106,10 @@ func (v *validator) Validate(_ string, public *jwt.Claims, privateObj interface{ switch { case err == nil: case err == jwt.ErrExpired: - return "", "", "", errors.New("Token has expired.") + return nil, errors.New("Token has expired.") default: glog.Errorf("unexpected validation error: %T", err) - return "", "", "", errors.New("Token could not be validated.") + return nil, errors.New("Token could not be validated.") } var audValid bool @@ -122,7 +122,7 @@ func (v *validator) Validate(_ string, public *jwt.Claims, privateObj interface{ } if !audValid { - return "", "", "", errors.New("Token is invalid for this audience.") + return nil, errors.New("Token is invalid for this audience.") } namespace := private.Kubernetes.Namespace @@ -133,15 +133,15 @@ func (v *validator) Validate(_ string, public *jwt.Claims, privateObj interface{ serviceAccount, err := v.getter.GetServiceAccount(namespace, saref.Name) if err != nil { glog.V(4).Infof("Could not retrieve service account %s/%s: %v", namespace, saref.Name, err) - return "", "", "", err + return nil, err } if serviceAccount.DeletionTimestamp != nil { glog.V(4).Infof("Service account has been deleted %s/%s", namespace, saref.Name) - return "", "", "", fmt.Errorf("ServiceAccount %s/%s has been deleted", namespace, saref.Name) + return nil, fmt.Errorf("ServiceAccount %s/%s has been deleted", namespace, saref.Name) } if string(serviceAccount.UID) != saref.UID { glog.V(4).Infof("Service account UID no longer matches %s/%s: %q != %q", namespace, saref.Name, string(serviceAccount.UID), saref.UID) - return "", "", "", fmt.Errorf("ServiceAccount UID (%s) does not match claim (%s)", serviceAccount.UID, saref.UID) + return nil, fmt.Errorf("ServiceAccount UID (%s) does not match claim (%s)", serviceAccount.UID, saref.UID) } if secref != nil { @@ -149,36 +149,45 @@ func (v *validator) Validate(_ string, public *jwt.Claims, privateObj interface{ secret, err := v.getter.GetSecret(namespace, secref.Name) if err != nil { glog.V(4).Infof("Could not retrieve bound secret %s/%s for service account %s/%s: %v", namespace, secref.Name, namespace, saref.Name, err) - return "", "", "", errors.New("Token has been invalidated") + return nil, errors.New("Token has been invalidated") } if secret.DeletionTimestamp != nil { glog.V(4).Infof("Bound secret is deleted and awaiting removal: %s/%s for service account %s/%s", namespace, secref.Name, namespace, saref.Name) - return "", "", "", errors.New("Token has been invalidated") + return nil, errors.New("Token has been invalidated") } if secref.UID != string(secret.UID) { glog.V(4).Infof("Secret UID no longer matches %s/%s: %q != %q", namespace, secref.Name, string(secret.UID), secref.UID) - return "", "", "", fmt.Errorf("Secret UID (%s) does not match claim (%s)", secret.UID, secref.UID) + return nil, fmt.Errorf("Secret UID (%s) does not match claim (%s)", secret.UID, secref.UID) } } + var podName, podUID string if podref != nil { // Make sure token hasn't been invalidated by deletion of the pod pod, err := v.getter.GetPod(namespace, podref.Name) if err != nil { - glog.V(4).Infof("Could not retrieve bound secret %s/%s for service account %s/%s: %v", namespace, podref.Name, namespace, saref.Name, err) - return "", "", "", errors.New("Token has been invalidated") + glog.V(4).Infof("Could not retrieve bound pod %s/%s for service account %s/%s: %v", namespace, podref.Name, namespace, saref.Name, err) + return nil, errors.New("Token has been invalidated") } if pod.DeletionTimestamp != nil { glog.V(4).Infof("Bound pod is deleted and awaiting removal: %s/%s for service account %s/%s", namespace, podref.Name, namespace, saref.Name) - return "", "", "", errors.New("Token has been invalidated") + return nil, errors.New("Token has been invalidated") } if podref.UID != string(pod.UID) { glog.V(4).Infof("Pod UID no longer matches %s/%s: %q != %q", namespace, podref.Name, string(pod.UID), podref.UID) - return "", "", "", fmt.Errorf("Pod UID (%s) does not match claim (%s)", pod.UID, podref.UID) + return nil, fmt.Errorf("Pod UID (%s) does not match claim (%s)", pod.UID, podref.UID) } + podName = podref.Name + podUID = podref.UID } - return private.Kubernetes.Namespace, private.Kubernetes.Svcacct.Name, private.Kubernetes.Svcacct.UID, nil + return &ServiceAccountInfo{ + Namespace: private.Kubernetes.Namespace, + Name: private.Kubernetes.Svcacct.Name, + UID: private.Kubernetes.Svcacct.UID, + PodName: podName, + PodUID: podUID, + }, nil } func (v *validator) NewPrivateClaims() interface{} { diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go b/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go index 73960d7f..fe4dc5b7 100644 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go +++ b/vendor/k8s.io/kubernetes/pkg/serviceaccount/jwt.go @@ -54,25 +54,13 @@ type TokenGenerator interface { // JWTTokenGenerator returns a TokenGenerator that generates signed JWT tokens, using the given privateKey. // privateKey is a PEM-encoded byte array of a private RSA key. // JWTTokenAuthenticator() -func JWTTokenGenerator(iss string, privateKey interface{}) TokenGenerator { - return &jwtTokenGenerator{ - iss: iss, - privateKey: privateKey, - } -} - -type jwtTokenGenerator struct { - iss string - privateKey interface{} -} - -func (j *jwtTokenGenerator) GenerateToken(claims *jwt.Claims, privateClaims interface{}) (string, error) { +func JWTTokenGenerator(iss string, privateKey interface{}) (TokenGenerator, error) { var alg jose.SignatureAlgorithm - switch privateKey := j.privateKey.(type) { + switch pk := privateKey.(type) { case *rsa.PrivateKey: alg = jose.RS256 case *ecdsa.PrivateKey: - switch privateKey.Curve { + switch pk.Curve { case elliptic.P256(): alg = jose.ES256 case elliptic.P384(): @@ -80,25 +68,38 @@ func (j *jwtTokenGenerator) GenerateToken(claims *jwt.Claims, privateClaims inte case elliptic.P521(): alg = jose.ES512 default: - return "", fmt.Errorf("unknown private key curve, must be 256, 384, or 521") + return nil, fmt.Errorf("unknown private key curve, must be 256, 384, or 521") } + case jose.OpaqueSigner: + alg = jose.SignatureAlgorithm(pk.Public().Algorithm) default: - return "", fmt.Errorf("unknown private key type %T, must be *rsa.PrivateKey or *ecdsa.PrivateKey", j.privateKey) + return nil, fmt.Errorf("unknown private key type %T, must be *rsa.PrivateKey, *ecdsa.PrivateKey, or jose.OpaqueSigner", privateKey) } signer, err := jose.NewSigner( jose.SigningKey{ Algorithm: alg, - Key: j.privateKey, + Key: privateKey, }, nil, ) if err != nil { - return "", err + return nil, err } + return &jwtTokenGenerator{ + iss: iss, + signer: signer, + }, nil +} +type jwtTokenGenerator struct { + iss string + signer jose.Signer +} + +func (j *jwtTokenGenerator) GenerateToken(claims *jwt.Claims, privateClaims interface{}) (string, error) { // claims are applied in reverse precedence - return jwt.Signed(signer). + return jwt.Signed(j.signer). Claims(privateClaims). Claims(claims). Claims(&jwt.Claims{ @@ -130,7 +131,7 @@ type Validator interface { // Validate validates a token and returns user information or an error. // Validator can assume that the issuer and signature of a token are already // verified when this function is called. - Validate(tokenData string, public *jwt.Claims, private interface{}) (namespace, name, uid string, err error) + Validate(tokenData string, public *jwt.Claims, private interface{}) (*ServiceAccountInfo, error) // NewPrivateClaims returns a struct that the authenticator should // deserialize the JWT payload into. The authenticator may then pass this // struct back to the Validator as the 'private' argument to a Validate() @@ -171,12 +172,12 @@ func (j *jwtTokenAuthenticator) AuthenticateToken(tokenData string) (user.Info, // If we get here, we have a token with a recognized signature and // issuer string. - ns, name, uid, err := j.validator.Validate(tokenData, public, private) + sa, err := j.validator.Validate(tokenData, public, private) if err != nil { return nil, false, err } - return UserInfo(ns, name, uid), true, nil + return sa.UserInfo(), true, nil } // hasCorrectIssuer returns true if tokenData is a valid JWT in compact diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/legacy.go b/vendor/k8s.io/kubernetes/pkg/serviceaccount/legacy.go index 5055db7c..79ca8f1b 100644 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/legacy.go +++ b/vendor/k8s.io/kubernetes/pkg/serviceaccount/legacy.go @@ -62,37 +62,37 @@ type legacyValidator struct { var _ = Validator(&legacyValidator{}) -func (v *legacyValidator) Validate(tokenData string, public *jwt.Claims, privateObj interface{}) (string, string, string, error) { +func (v *legacyValidator) Validate(tokenData string, public *jwt.Claims, privateObj interface{}) (*ServiceAccountInfo, error) { private, ok := privateObj.(*legacyPrivateClaims) if !ok { glog.Errorf("jwt validator expected private claim of type *legacyPrivateClaims but got: %T", privateObj) - return "", "", "", errors.New("Token could not be validated.") + return nil, errors.New("Token could not be validated.") } // Make sure the claims we need exist if len(public.Subject) == 0 { - return "", "", "", errors.New("sub claim is missing") + return nil, errors.New("sub claim is missing") } namespace := private.Namespace if len(namespace) == 0 { - return "", "", "", errors.New("namespace claim is missing") + return nil, errors.New("namespace claim is missing") } secretName := private.SecretName if len(secretName) == 0 { - return "", "", "", errors.New("secretName claim is missing") + return nil, errors.New("secretName claim is missing") } serviceAccountName := private.ServiceAccountName if len(serviceAccountName) == 0 { - return "", "", "", errors.New("serviceAccountName claim is missing") + return nil, errors.New("serviceAccountName claim is missing") } serviceAccountUID := private.ServiceAccountUID if len(serviceAccountUID) == 0 { - return "", "", "", errors.New("serviceAccountUID claim is missing") + return nil, errors.New("serviceAccountUID claim is missing") } subjectNamespace, subjectName, err := apiserverserviceaccount.SplitUsername(public.Subject) if err != nil || subjectNamespace != namespace || subjectName != serviceAccountName { - return "", "", "", errors.New("sub claim is invalid") + return nil, errors.New("sub claim is invalid") } if v.lookup { @@ -100,34 +100,38 @@ func (v *legacyValidator) Validate(tokenData string, public *jwt.Claims, private secret, err := v.getter.GetSecret(namespace, secretName) if err != nil { glog.V(4).Infof("Could not retrieve token %s/%s for service account %s/%s: %v", namespace, secretName, namespace, serviceAccountName, err) - return "", "", "", errors.New("Token has been invalidated") + return nil, errors.New("Token has been invalidated") } if secret.DeletionTimestamp != nil { glog.V(4).Infof("Token is deleted and awaiting removal: %s/%s for service account %s/%s", namespace, secretName, namespace, serviceAccountName) - return "", "", "", errors.New("Token has been invalidated") + return nil, errors.New("Token has been invalidated") } if bytes.Compare(secret.Data[v1.ServiceAccountTokenKey], []byte(tokenData)) != 0 { glog.V(4).Infof("Token contents no longer matches %s/%s for service account %s/%s", namespace, secretName, namespace, serviceAccountName) - return "", "", "", errors.New("Token does not match server's copy") + return nil, errors.New("Token does not match server's copy") } // Make sure service account still exists (name and UID) serviceAccount, err := v.getter.GetServiceAccount(namespace, serviceAccountName) if err != nil { glog.V(4).Infof("Could not retrieve service account %s/%s: %v", namespace, serviceAccountName, err) - return "", "", "", err + return nil, err } if serviceAccount.DeletionTimestamp != nil { glog.V(4).Infof("Service account has been deleted %s/%s", namespace, serviceAccountName) - return "", "", "", fmt.Errorf("ServiceAccount %s/%s has been deleted", namespace, serviceAccountName) + return nil, fmt.Errorf("ServiceAccount %s/%s has been deleted", namespace, serviceAccountName) } if string(serviceAccount.UID) != serviceAccountUID { glog.V(4).Infof("Service account UID no longer matches %s/%s: %q != %q", namespace, serviceAccountName, string(serviceAccount.UID), serviceAccountUID) - return "", "", "", fmt.Errorf("ServiceAccount UID (%s) does not match claim (%s)", serviceAccount.UID, serviceAccountUID) + return nil, fmt.Errorf("ServiceAccount UID (%s) does not match claim (%s)", serviceAccount.UID, serviceAccountUID) } } - return private.Namespace, private.ServiceAccountName, private.ServiceAccountUID, nil + return &ServiceAccountInfo{ + Namespace: private.Namespace, + Name: private.ServiceAccountName, + UID: private.ServiceAccountUID, + }, nil } func (v *legacyValidator) NewPrivateClaims() interface{} { diff --git a/vendor/k8s.io/kubernetes/pkg/serviceaccount/util.go b/vendor/k8s.io/kubernetes/pkg/serviceaccount/util.go index 0503c151..9f0a7a46 100644 --- a/vendor/k8s.io/kubernetes/pkg/serviceaccount/util.go +++ b/vendor/k8s.io/kubernetes/pkg/serviceaccount/util.go @@ -20,16 +20,44 @@ import ( "k8s.io/api/core/v1" apiserverserviceaccount "k8s.io/apiserver/pkg/authentication/serviceaccount" "k8s.io/apiserver/pkg/authentication/user" - api "k8s.io/kubernetes/pkg/apis/core" +) + +const ( + // PodNameKey is the key used in a user's "extra" to specify the pod name of + // the authenticating request. + PodNameKey = "authentication.kubernetes.io/pod-name" + // PodUIDKey is the key used in a user's "extra" to specify the pod UID of + // the authenticating request. + PodUIDKey = "authentication.kubernetes.io/pod-uid" ) // UserInfo returns a user.Info interface for the given namespace, service account name and UID func UserInfo(namespace, name, uid string) user.Info { - return &user.DefaultInfo{ - Name: apiserverserviceaccount.MakeUsername(namespace, name), - UID: uid, - Groups: apiserverserviceaccount.MakeGroupNames(namespace), + return (&ServiceAccountInfo{ + Name: name, + Namespace: namespace, + UID: uid, + }).UserInfo() +} + +type ServiceAccountInfo struct { + Name, Namespace, UID string + PodName, PodUID string +} + +func (sa *ServiceAccountInfo) UserInfo() user.Info { + info := &user.DefaultInfo{ + Name: apiserverserviceaccount.MakeUsername(sa.Namespace, sa.Name), + UID: sa.UID, + Groups: apiserverserviceaccount.MakeGroupNames(sa.Namespace), } + if sa.PodName != "" && sa.PodUID != "" { + info.Extra = map[string][]string{ + PodNameKey: {sa.PodName}, + PodUIDKey: {sa.PodUID}, + } + } + return info } // IsServiceAccountToken returns true if the secret is a valid api token for the service account @@ -51,24 +79,3 @@ func IsServiceAccountToken(secret *v1.Secret, sa *v1.ServiceAccount) bool { return true } - -// TODO: remove the duplicate code -// InternalIsServiceAccountToken returns true if the secret is a valid api token for the service account -func InternalIsServiceAccountToken(secret *api.Secret, sa *api.ServiceAccount) bool { - if secret.Type != api.SecretTypeServiceAccountToken { - return false - } - - name := secret.Annotations[api.ServiceAccountNameKey] - uid := secret.Annotations[api.ServiceAccountUIDKey] - if name != sa.Name { - // Name must match - return false - } - if len(uid) > 0 && uid != string(sa.UID) { - // If UID is specified, it must match - return false - } - - return true -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/async/BUILD b/vendor/k8s.io/kubernetes/pkg/util/async/BUILD index 6ea6e5d8..57830ca8 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/async/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/async/BUILD @@ -14,8 +14,8 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/util/async", deps = [ + "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD b/vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD index c78108a2..28548923 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/bandwidth/BUILD @@ -12,50 +12,17 @@ go_library( "doc.go", "fake_shaper.go", "interfaces.go", + "linux.go", + "unsupported.go", "utils.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "unsupported.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/util/bandwidth", deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], "//conditions:default": [], @@ -65,18 +32,14 @@ go_library( go_test( name = "go_default_test", srcs = [ + "linux_test.go", "utils_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "linux_test.go", - ], - "//conditions:default": [], - }), + ], embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ "//vendor/k8s.io/utils/exec:go_default_library", diff --git a/vendor/k8s.io/kubernetes/pkg/util/config/BUILD b/vendor/k8s.io/kubernetes/pkg/util/config/BUILD index 88a1773f..37e4a5f8 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/config/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/config/BUILD @@ -13,7 +13,7 @@ go_library( "doc.go", ], importpath = "k8s.io/kubernetes/pkg/util/config", - deps = ["//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library"], ) go_test( diff --git a/vendor/k8s.io/kubernetes/pkg/util/configz/BUILD b/vendor/k8s.io/kubernetes/pkg/util/configz/BUILD deleted file mode 100644 index 0df832aa..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/configz/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["configz.go"], - importpath = "k8s.io/kubernetes/pkg/util/configz", -) - -go_test( - name = "go_default_test", - srcs = ["configz_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/configz/configz.go b/vendor/k8s.io/kubernetes/pkg/util/configz/configz.go deleted file mode 100644 index 99413d5e..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/configz/configz.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 configz - -import ( - "encoding/json" - "fmt" - "net/http" - "sync" -) - -var ( - configsGuard sync.RWMutex - configs = map[string]*Config{} -) - -type Config struct { - val interface{} -} - -func InstallHandler(m mux) { - m.Handle("/configz", http.HandlerFunc(handle)) -} - -type mux interface { - Handle(string, http.Handler) -} - -func New(name string) (*Config, error) { - configsGuard.Lock() - defer configsGuard.Unlock() - if _, found := configs[name]; found { - return nil, fmt.Errorf("register config %q twice", name) - } - newConfig := Config{} - configs[name] = &newConfig - return &newConfig, nil -} - -func Delete(name string) { - configsGuard.Lock() - defer configsGuard.Unlock() - delete(configs, name) -} - -func (v *Config) Set(val interface{}) { - configsGuard.Lock() - defer configsGuard.Unlock() - v.val = val -} - -func (v *Config) MarshalJSON() ([]byte, error) { - return json.Marshal(v.val) -} - -func handle(w http.ResponseWriter, r *http.Request) { - if err := write(w); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -func write(w http.ResponseWriter) error { - var b []byte - var err error - func() { - configsGuard.RLock() - defer configsGuard.RUnlock() - b, err = json.Marshal(configs) - }() - if err != nil { - return fmt.Errorf("error marshaling json: %v", err) - } - w.Header().Set("Content-Type", "application/json") - _, err = w.Write(b) - return err -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD b/vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD index a17d1531..e078a914 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/conntrack/BUILD @@ -2,27 +2,23 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", - srcs = [ - "conntrack.go", - ], + srcs = ["conntrack.go"], importpath = "k8s.io/kubernetes/pkg/util/conntrack", visibility = ["//visibility:public"], deps = [ "//pkg/util/net:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ], ) go_test( name = "go_default_test", - srcs = [ - "conntrack_test.go", - ], + srcs = ["conntrack_test.go"], embed = [":go_default_library"], deps = [ "//pkg/util/net:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", ], diff --git a/vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD b/vendor/k8s.io/kubernetes/pkg/util/flag/BUILD similarity index 64% rename from vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD rename to vendor/k8s.io/kubernetes/pkg/util/flag/BUILD index 42b68b51..ac88251b 100644 --- a/vendor/k8s.io/kubernetes/pkg/probe/exec/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/flag/BUILD @@ -8,22 +8,15 @@ load( go_library( name = "go_default_library", - srcs = ["exec.go"], - importpath = "k8s.io/kubernetes/pkg/probe/exec", + srcs = ["flags.go"], + importpath = "k8s.io/kubernetes/pkg/util/flag", deps = [ - "//pkg/probe:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/utils/exec:go_default_library", + "//vendor/github.com/spf13/pflag:go_default_library", ], ) -go_test( - name = "go_default_test", - srcs = ["exec_test.go"], - embed = [":go_default_library"], - deps = ["//pkg/probe:go_default_library"], -) - filegroup( name = "package-srcs", srcs = glob(["**"]), @@ -36,3 +29,10 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["flags_test.go"], + embed = [":go_default_library"], + deps = ["//vendor/github.com/spf13/pflag:go_default_library"], +) diff --git a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/helpers.go b/vendor/k8s.io/kubernetes/pkg/util/flag/flags.go similarity index 70% rename from vendor/k8s.io/kubernetes/pkg/apis/componentconfig/helpers.go rename to vendor/k8s.io/kubernetes/pkg/util/flag/flags.go index a8fb98c1..b58a52cc 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/componentconfig/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/util/flag/flags.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,27 +14,40 @@ See the License for the specific language governing permissions and limitations under the License. */ -package componentconfig +package flag import ( - "encoding/json" "fmt" "net" "strconv" - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" + "github.com/golang/glog" + "github.com/spf13/pflag" + utilnet "k8s.io/apimachinery/pkg/util/net" ) -// used for validating command line opts -// TODO(mikedanese): remove these when we remove command line flags +// PrintFlags logs the flags in the flagset +func PrintFlags(flags *pflag.FlagSet) { + flags.VisitAll(func(flag *pflag.Flag) { + glog.V(1).Infof("FLAG: --%s=%q", flag.Name, flag.Value) + }) +} + +// TODO(mikedanese): remove these flag wrapper types when we remove command line flags + +var ( + _ pflag.Value = &IPVar{} + _ pflag.Value = &IPPortVar{} + _ pflag.Value = &PortRangeVar{} +) +// IPVar is used for validating a command line option that represents an IP. It implements the pflag.Value interface type IPVar struct { Val *string } +// Set sets the flag value func (v IPVar) Set(s string) error { if len(s) == 0 { v.Val = nil @@ -51,6 +64,7 @@ func (v IPVar) Set(s string) error { return nil } +// String returns the flag value func (v IPVar) String() string { if v.Val == nil { return "" @@ -58,15 +72,17 @@ func (v IPVar) String() string { return *v.Val } +// Type gets the flag type func (v IPVar) Type() string { return "ip" } -// IPPortVar allows IP or IP:port formats. +// IPPortVar is used for validating a command line option that represents an IP and a port. It implements the pflag.Value interface type IPPortVar struct { Val *string } +// Set sets the flag value func (v IPPortVar) Set(s string) error { if len(s) == 0 { v.Val = nil @@ -100,6 +116,7 @@ func (v IPPortVar) Set(s string) error { return nil } +// String returns the flag value func (v IPPortVar) String() string { if v.Val == nil { return "" @@ -107,14 +124,17 @@ func (v IPPortVar) String() string { return *v.Val } +// Type gets the flag type func (v IPPortVar) Type() string { return "ipport" } +// PortRangeVar is used for validating a command line option that represents a port range. It implements the pflag.Value interface type PortRangeVar struct { Val *string } +// Set sets the flag value func (v PortRangeVar) Set(s string) error { if _, err := utilnet.ParsePortRange(s); err != nil { return fmt.Errorf("%q is not a valid port range: %v", s, err) @@ -127,6 +147,7 @@ func (v PortRangeVar) Set(s string) error { return nil } +// String returns the flag value func (v PortRangeVar) String() string { if v.Val == nil { return "" @@ -134,24 +155,7 @@ func (v PortRangeVar) String() string { return *v.Val } +// Type gets the flag type func (v PortRangeVar) Type() string { return "port-range" } - -// ConvertObjToConfigMap converts an object to a ConfigMap. -// This is specifically meant for ComponentConfigs. -func ConvertObjToConfigMap(name string, obj runtime.Object) (*v1.ConfigMap, error) { - eJSONBytes, err := json.Marshal(obj) - if err != nil { - return nil, err - } - cm := &v1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - }, - Data: map[string]string{ - name: string(eJSONBytes[:]), - }, - } - return cm, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD b/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD index 9f6bff29..f1d77a03 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/goroutinemap/BUILD @@ -12,8 +12,8 @@ go_library( importpath = "k8s.io/kubernetes/pkg/util/goroutinemap", deps = [ "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) @@ -21,7 +21,7 @@ go_test( name = "go_default_test", srcs = ["goroutinemap_test.go"], embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/kubernetes/pkg/util/io/BUILD b/vendor/k8s.io/kubernetes/pkg/util/io/BUILD index 93de0dcb..92e8f2ae 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/io/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/io/BUILD @@ -7,15 +7,8 @@ load( go_library( name = "go_default_library", - srcs = [ - "consistentread.go", - "writer.go", - ], + srcs = ["consistentread.go"], importpath = "k8s.io/kubernetes/pkg/util/io", - deps = [ - "//pkg/util/nsenter:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - ], ) filegroup( diff --git a/vendor/k8s.io/kubernetes/pkg/util/io/writer.go b/vendor/k8s.io/kubernetes/pkg/util/io/writer.go deleted file mode 100644 index 7c457d04..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/io/writer.go +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -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 io - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - - "k8s.io/kubernetes/pkg/util/nsenter" - - "github.com/golang/glog" -) - -// Writer is an interface which allows to write data to a file. -type Writer interface { - // WriteFile mimics ioutil.WriteFile. - WriteFile(filename string, data []byte, perm os.FileMode) error -} - -// StdWriter implements Writer interface and uses standard libraries -// for writing data to files. -type StdWriter struct { -} - -// WriteFile directly calls ioutil.WriteFile. -func (writer *StdWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { - return ioutil.WriteFile(filename, data, perm) -} - -// NsenterWriter is implementation of Writer interface that allows writing data -// to file using nsenter command. -// If a program (e.g. kubelet) runs in a container it may want to write data to -// a mounted device. Since in Docker, mount propagation mode is set to private, -// it will not see the mounted device in its own namespace. To work around this -// limitation one has to first enter hosts namespace (by using 'nsenter') and -// only then write data. -type NsenterWriter struct { - ne *nsenter.Nsenter -} - -// NewNsenterWriter creates a new Writer that allows writing data to file using -// nsenter command. -func NewNsenterWriter(ne *nsenter.Nsenter) *NsenterWriter { - return &NsenterWriter{ - ne: ne, - } -} - -// WriteFile calls 'nsenter cat - > ' and 'nsenter chmod' to create a -// file on the host. -func (writer *NsenterWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { - echoArgs := []string{"-c", fmt.Sprintf("cat > %s", filename)} - glog.V(5).Infof("nsenter: write data to file %s by nsenter", filename) - command := writer.ne.Exec("sh", echoArgs) - command.SetStdin(bytes.NewBuffer(data)) - outputBytes, err := command.CombinedOutput() - if err != nil { - glog.Errorf("Output from writing to %q: %v", filename, string(outputBytes)) - return err - } - - chmodArgs := []string{fmt.Sprintf("%o", perm), filename} - glog.V(5).Infof("nsenter: change permissions of file %s to %s", filename, chmodArgs[0]) - outputBytes, err = writer.ne.Exec("chmod", chmodArgs).CombinedOutput() - if err != nil { - glog.Errorf("Output from chmod command: %v", string(outputBytes)) - return err - } - - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD b/vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD index d803ccb3..3e58721f 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/iptables/BUILD @@ -11,56 +11,24 @@ go_library( srcs = [ "doc.go", "iptables.go", + "iptables_linux.go", + "iptables_unsupported.go", "save_restore.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "iptables_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "iptables_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "iptables_unsupported.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/util/iptables", deps = [ "//pkg/util/dbus:go_default_library", "//pkg/util/version:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/trace:go_default_library", "//vendor/github.com/godbus/dbus:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], "//conditions:default": [], }), @@ -68,17 +36,15 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "iptables_test.go", - ], - "//conditions:default": [], - }), + srcs = [ + "iptables_test.go", + "save_restore_test.go", + ], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:linux": [ "//pkg/util/dbus:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library", ], diff --git a/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go b/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go index 2b932ada..8c9b6722 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go +++ b/vendor/k8s.io/kubernetes/pkg/util/iptables/iptables.go @@ -28,6 +28,7 @@ import ( godbus "github.com/godbus/dbus" "github.com/golang/glog" "k8s.io/apimachinery/pkg/util/sets" + utiltrace "k8s.io/apiserver/pkg/util/trace" utildbus "k8s.io/kubernetes/pkg/util/dbus" utilversion "k8s.io/kubernetes/pkg/util/version" utilexec "k8s.io/utils/exec" @@ -137,6 +138,7 @@ type runner struct { dbus utildbus.Interface protocol Protocol hasCheck bool + hasListener bool waitFlag []string restoreWaitFlag []string lockfilePath string @@ -163,13 +165,11 @@ func newInternal(exec utilexec.Interface, dbus utildbus.Interface, protocol Prot dbus: dbus, protocol: protocol, hasCheck: getIPTablesHasCheckCommand(vstring), + hasListener: false, waitFlag: getIPTablesWaitFlag(vstring), restoreWaitFlag: getIPTablesRestoreWaitFlag(exec, protocol), lockfilePath: lockfilePath, } - // TODO this needs to be moved to a separate Start() or Run() function so that New() has zero side - // effects. - runner.connectToFirewallD() return runner } @@ -200,6 +200,7 @@ func (runner *runner) connectToFirewallD() { glog.V(1).Infof("Could not connect to D-Bus system bus: %s", err) return } + runner.hasListener = true rule := fmt.Sprintf("type='signal',sender='%s',path='%s',interface='%s',member='Reloaded'", firewalldName, firewalldPath, firewalldInterface) bus.BusObject().Call("org.freedesktop.DBus.AddMatch", 0, rule) @@ -317,6 +318,9 @@ func (runner *runner) SaveInto(table Table, buffer *bytes.Buffer) error { runner.mu.Lock() defer runner.mu.Unlock() + trace := utiltrace.New("iptables save") + defer trace.LogIfLong(2 * time.Second) + // run and return iptablesSaveCmd := iptablesSaveCommand(runner.protocol) args := []string{"-t", string(table)} @@ -355,6 +359,9 @@ func (runner *runner) restoreInternal(args []string, data []byte, flush FlushFla runner.mu.Lock() defer runner.mu.Unlock() + trace := utiltrace.New("iptables restore") + defer trace.LogIfLong(2 * time.Second) + if !flush { args = append(args, "--noflush") } @@ -370,6 +377,7 @@ func (runner *runner) restoreInternal(args []string, data []byte, flush FlushFla if err != nil { return err } + trace.Step("Locks grabbed") defer func(locker iptablesLocker) { if err := locker.Close(); err != nil { glog.Errorf("Failed to close iptables locks: %v", err) @@ -669,6 +677,15 @@ func (runner *runner) dbusSignalHandler(bus utildbus.Connection) { // AddReloadFunc is part of Interface func (runner *runner) AddReloadFunc(reloadFunc func()) { + runner.mu.Lock() + defer runner.mu.Unlock() + + // We only need to listen to firewalld if there are Reload functions, so lazy + // initialize the listener. + if !runner.hasListener { + runner.connectToFirewallD() + } + runner.reloadFuncs = append(runner.reloadFuncs, reloadFunc) } diff --git a/vendor/k8s.io/kubernetes/pkg/util/iptables/save_restore.go b/vendor/k8s.io/kubernetes/pkg/util/iptables/save_restore.go index 6f4eacac..172f07e7 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/iptables/save_restore.go +++ b/vendor/k8s.io/kubernetes/pkg/util/iptables/save_restore.go @@ -17,8 +17,13 @@ limitations under the License. package iptables import ( + "bytes" "fmt" - "strings" +) + +var ( + commitBytes = []byte("COMMIT") + spaceBytes = []byte(" ") ) // MakeChainLine return an iptables-save/restore formatted chain line given a Chain @@ -27,41 +32,43 @@ func MakeChainLine(chain Chain) string { } // GetChainLines parses a table's iptables-save data to find chains in the table. -// It returns a map of iptables.Chain to string where the string is the chain line from the save (with counters etc). -func GetChainLines(table Table, save []byte) map[Chain]string { - chainsMap := make(map[Chain]string) - tablePrefix := "*" + string(table) +// It returns a map of iptables.Chain to []byte where the []byte is the chain line +// from save (with counters etc.). +// Note that to avoid allocations memory is SHARED with save. +func GetChainLines(table Table, save []byte) map[Chain][]byte { + chainsMap := make(map[Chain][]byte) + tablePrefix := []byte("*" + string(table)) readIndex := 0 // find beginning of table for readIndex < len(save) { - line, n := ReadLine(readIndex, save) + line, n := readLine(readIndex, save) readIndex = n - if strings.HasPrefix(line, tablePrefix) { + if bytes.HasPrefix(line, tablePrefix) { break } } // parse table lines for readIndex < len(save) { - line, n := ReadLine(readIndex, save) + line, n := readLine(readIndex, save) readIndex = n if len(line) == 0 { continue } - if strings.HasPrefix(line, "COMMIT") || strings.HasPrefix(line, "*") { + if bytes.HasPrefix(line, commitBytes) || line[0] == '*' { break - } else if strings.HasPrefix(line, "#") { + } else if line[0] == '#' { continue - } else if strings.HasPrefix(line, ":") && len(line) > 1 { + } else if line[0] == ':' && len(line) > 1 { // We assume that the contains space - chain lines have 3 fields, // space delimited. If there is no space, this line will panic. - chain := Chain(line[1:strings.Index(line, " ")]) + chain := Chain(line[1:bytes.Index(line, spaceBytes)]) chainsMap[chain] = line } } return chainsMap } -func ReadLine(readIndex int, byteArray []byte) (string, int) { +func readLine(readIndex int, byteArray []byte) ([]byte, int) { currentReadIndex := readIndex // consume left spaces @@ -89,7 +96,7 @@ func ReadLine(readIndex int, byteArray []byte) (string, int) { } else if (byteArray[currentReadIndex] == '\n') || (currentReadIndex == (len(byteArray) - 1)) { // end of line or byte buffer is reached if currentReadIndex <= leftTrimIndex { - return "", currentReadIndex + 1 + return nil, currentReadIndex + 1 } // set the rightTrimIndex if rightTrimIndex == -1 { @@ -100,11 +107,12 @@ func ReadLine(readIndex int, byteArray []byte) (string, int) { rightTrimIndex = currentReadIndex + 1 } } - return string(byteArray[leftTrimIndex:rightTrimIndex]), currentReadIndex + 1 + // Avoid unnecessary allocation. + return byteArray[leftTrimIndex:rightTrimIndex], currentReadIndex + 1 } else { // unset rightTrimIndex rightTrimIndex = -1 } } - return "", currentReadIndex + return nil, currentReadIndex } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD b/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD index 6f2df9ac..e8bf8b86 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/BUILD @@ -5,66 +5,16 @@ go_library( srcs = [ "doc.go", "exec.go", + "exec_mount.go", + "exec_mount_unsupported.go", "fake.go", "mount.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "exec_mount.go", - "mount_linux.go", - "nsenter_mount.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "exec_mount_unsupported.go", - "mount_unsupported.go", - "nsenter_mount_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "exec_mount_unsupported.go", - "mount_windows.go", - "nsenter_mount_unsupported.go", - ], - "//conditions:default": [], - }), + "mount_linux.go", + "mount_unsupported.go", + "mount_windows.go", + "nsenter_mount.go", + "nsenter_mount_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/util/mount", visibility = ["//visibility:public"], deps = [ @@ -87,8 +37,8 @@ go_library( "//pkg/util/file:go_default_library", "//pkg/util/io:go_default_library", "//pkg/util/nsenter:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", ], "@io_bazel_rules_go//go/platform:nacl": [ "//pkg/util/nsenter:go_default_library", @@ -116,18 +66,12 @@ go_library( go_test( name = "go_default_test", srcs = [ + "exec_mount_test.go", + "mount_linux_test.go", + "mount_windows_test.go", + "nsenter_mount_test.go", "safe_format_and_mount_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "exec_mount_test.go", - "mount_linux_test.go", - "nsenter_mount_test.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "mount_windows_test.go", - ], - "//conditions:default": [], - }), + ], embed = [":go_default_library"], deps = [ "//vendor/k8s.io/utils/exec/testing:go_default_library", diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go index fe7dcbd7..3c663832 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount.go @@ -140,6 +140,10 @@ func (m *execMounter) ExistsPath(pathname string) (bool, error) { return m.wrappedMounter.ExistsPath(pathname) } +func (m *execMounter) EvalHostSymlinks(pathname string) (string, error) { + return m.wrappedMounter.EvalHostSymlinks(pathname) +} + func (m *execMounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { return m.wrappedMounter.PrepareSafeSubpath(subPath) } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go index 6854b32b..d5a1fdc5 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/exec_mount_unsupported.go @@ -87,6 +87,10 @@ func (mounter *execMounter) ExistsPath(pathname string) (bool, error) { return true, errors.New("not implemented") } +func (m *execMounter) EvalHostSymlinks(pathname string) (string, error) { + return "", errors.New("not implemented") +} + func (mounter *execMounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { return subPath.Path, nil, nil } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go b/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go index 10832fd3..e834e297 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/fake.go @@ -29,6 +29,7 @@ import ( type FakeMounter struct { MountPoints []MountPoint Log []FakeAction + Filesystem map[string]FileType // Some tests run things in parallel, make sure the mounter does not produce // any golang's DATA RACE warnings. mutex sync.Mutex @@ -190,7 +191,10 @@ func (f *FakeMounter) MakeRShared(path string) error { } func (f *FakeMounter) GetFileType(pathname string) (FileType, error) { - return FileType("fake"), nil + if t, ok := f.Filesystem[pathname]; ok { + return t, nil + } + return FileType("Directory"), nil } func (f *FakeMounter) MakeDir(pathname string) error { @@ -202,7 +206,14 @@ func (f *FakeMounter) MakeFile(pathname string) error { } func (f *FakeMounter) ExistsPath(pathname string) (bool, error) { - return false, errors.New("not implemented") + if _, ok := f.Filesystem[pathname]; ok { + return true, nil + } + return false, nil +} + +func (f *FakeMounter) EvalHostSymlinks(pathname string) (string, error) { + return pathname, nil } func (f *FakeMounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go index f5ce194c..b48caaff 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount.go @@ -96,6 +96,9 @@ type Interface interface { // Will operate in the host mount namespace if kubelet is running in a container. // Error is returned on any other error than "file not found". ExistsPath(pathname string) (bool, error) + // EvalHostSymlinks returns the path name after evaluating symlinks. + // Will operate in the host mount namespace if kubelet is running in a container. + EvalHostSymlinks(pathname string) (string, error) // CleanSubPaths removes any bind-mounts created by PrepareSafeSubpath in given // pod volume directory. CleanSubPaths(podDir string, volumeName string) error @@ -328,8 +331,8 @@ func HasMountRefs(mountPath string, mountRefs []string) bool { return count > 0 } -// pathWithinBase checks if give path is within given base directory. -func pathWithinBase(fullPath, basePath string) bool { +// PathWithinBase checks if give path is within given base directory. +func PathWithinBase(fullPath, basePath string) bool { rel, err := filepath.Rel(basePath, fullPath) if err != nil { return false diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go index e80dad59..1df07321 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go @@ -155,41 +155,6 @@ func (m *Mounter) doMount(mounterPath string, mountCmd string, source string, ta return err } -// GetMountRefs finds all other references to the device referenced -// by mountPath; returns a list of paths. -func GetMountRefs(mounter Interface, mountPath string) ([]string, error) { - mps, err := mounter.List() - if err != nil { - return nil, err - } - // Find the device name. - deviceName := "" - // If mountPath is symlink, need get its target path. - slTarget, err := filepath.EvalSymlinks(mountPath) - if err != nil { - slTarget = mountPath - } - for i := range mps { - if mps[i].Path == slTarget { - deviceName = mps[i].Device - break - } - } - - // Find all references to the device. - var refs []string - if deviceName == "" { - glog.Warningf("could not determine device for path: %q", mountPath) - } else { - for i := range mps { - if mps[i].Device == deviceName && mps[i].Path != slTarget { - refs = append(refs, mps[i].Path) - } - } - } - return refs, nil -} - // detectSystemd returns true if OS runs with systemd as init. When not sure // (permission errors, ...), it returns false. // There may be different ways how to detect systemd, this one makes sure that @@ -352,7 +317,7 @@ func (mounter *Mounter) GetDeviceNameFromMount(mountPath, pluginDir string) (str // the mount path reference should match the given plugin directory. In case no mount path reference // matches, returns the volume name taken from its given mountPath func getDeviceNameFromMount(mounter Interface, mountPath, pluginDir string) (string, error) { - refs, err := GetMountRefs(mounter, mountPath) + refs, err := mounter.GetMountRefs(mountPath) if err != nil { glog.V(4).Infof("GetMountRefs failed for mount path %q: %v", mountPath, err) return "", err @@ -454,6 +419,10 @@ func (mounter *Mounter) ExistsPath(pathname string) (bool, error) { return utilfile.FileExists(pathname) } +func (mounter *Mounter) EvalHostSymlinks(pathname string) (string, error) { + return filepath.EvalSymlinks(pathname) +} + // formatAndMount uses unix utils to format and mount the given disk func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, fstype string, options []string) error { readOnly := false @@ -583,7 +552,7 @@ func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) { } if len(pttype) > 0 { - glog.V(4).Infof("Disk %s detected partition table type: %s", pttype) + glog.V(4).Infof("Disk %s detected partition table type: %s", disk, pttype) // Returns a special non-empty string as filesystem type, then kubelet // will not format it. return "unknown data, probably partitions", nil @@ -696,7 +665,7 @@ func findMountInfo(path, mountInfoPath string) (mountInfo, error) { // point that is prefix of 'path' - that's the mount where path resides var info *mountInfo for i := len(infos) - 1; i >= 0; i-- { - if pathWithinBase(path, infos[i].mountPoint) { + if PathWithinBase(path, infos[i].mountPoint) { info = &infos[i] break } @@ -767,7 +736,7 @@ func (mounter *Mounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, // This implementation is shared between Linux and NsEnterMounter func safeOpenSubPath(mounter Interface, subpath Subpath) (int, error) { - if !pathWithinBase(subpath.Path, subpath.VolumePath) { + if !PathWithinBase(subpath.Path, subpath.VolumePath) { return -1, fmt.Errorf("subpath %q not within volume path %q", subpath.Path, subpath.VolumePath) } fd, err := doSafeOpen(subpath.Path, subpath.VolumePath) @@ -995,7 +964,7 @@ func cleanSubPath(mounter Interface, subpath Subpath) error { // removeEmptyDirs works backwards from endDir to baseDir and removes each directory // if it is empty. It stops once it encounters a directory that has content func removeEmptyDirs(baseDir, endDir string) error { - if !pathWithinBase(endDir, baseDir) { + if !PathWithinBase(endDir, baseDir) { return fmt.Errorf("endDir %q is not within baseDir %q", endDir, baseDir) } @@ -1036,6 +1005,11 @@ func (mounter *Mounter) SafeMakeDir(subdir string, base string, perm os.FileMode } func (mounter *Mounter) GetMountRefs(pathname string) ([]string, error) { + if _, err := os.Stat(pathname); os.IsNotExist(err) { + return []string{}, nil + } else if err != nil { + return nil, err + } realpath, err := filepath.EvalSymlinks(pathname) if err != nil { return nil, err @@ -1083,7 +1057,7 @@ func getMode(pathname string) (os.FileMode, error) { func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { glog.V(4).Infof("Creating directory %q within base %q", pathname, base) - if !pathWithinBase(pathname, base) { + if !PathWithinBase(pathname, base) { return fmt.Errorf("path %s is outside of allowed base %s", pathname, base) } @@ -1110,7 +1084,7 @@ func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { if err != nil { return fmt.Errorf("error opening directory %s: %s", existingPath, err) } - if !pathWithinBase(fullExistingPath, base) { + if !PathWithinBase(fullExistingPath, base) { return fmt.Errorf("path %s is outside of allowed base %s", fullExistingPath, err) } @@ -1272,7 +1246,7 @@ func doSafeOpen(pathname string, base string) (int, error) { // sure the user cannot change already existing directories into symlinks. for _, seg := range segments { currentPath = filepath.Join(currentPath, seg) - if !pathWithinBase(currentPath, base) { + if !PathWithinBase(currentPath, base) { return -1, fmt.Errorf("path %s is outside of allowed base %s", currentPath, base) } @@ -1329,7 +1303,7 @@ func searchMountPoints(hostSource, mountInfoPath string) ([]string, error) { // We need search in backward order because it's possible for later mounts // to overlap earlier mounts. for i := len(mis) - 1; i >= 0; i-- { - if hostSource == mis[i].mountPoint || pathWithinBase(hostSource, mis[i].mountPoint) { + if hostSource == mis[i].mountPoint || PathWithinBase(hostSource, mis[i].mountPoint) { // If it's a mount point or path under a mount point. mountID = mis[i].id rootPath = filepath.Join(mis[i].root, strings.TrimPrefix(hostSource, mis[i].mountPoint)) diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go index 6143aec1..cd6f1a28 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go @@ -46,12 +46,6 @@ func (mounter *Mounter) Unmount(target string) error { return unsupportedErr } -// GetMountRefs finds all other references to the device referenced -// by mountPath; returns a list of paths. -func GetMountRefs(mounter Interface, mountPath string) ([]string, error) { - return []string{}, unsupportedErr -} - func (mounter *Mounter) List() ([]MountPoint, error) { return []MountPoint{}, unsupportedErr } @@ -112,6 +106,10 @@ func (mounter *Mounter) ExistsPath(pathname string) (bool, error) { return true, errors.New("not implemented") } +func (mounter *Mounter) EvalHostSymlinks(pathname string) (string, error) { + return "", unsupportedErr +} + func (mounter *Mounter) PrepareSafeSubpath(subPath Subpath) (newHostPath string, cleanupAction func(), err error) { return subPath.Path, nil, unsupportedErr } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go index 5c57a57d..048e442c 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_windows.go @@ -83,14 +83,20 @@ func (mounter *Mounter) Mount(source string, target string, fstype string, optio return fmt.Errorf("azureMount: only cifs mount is supported now, fstype: %q, mounting source (%q), target (%q), with options (%q)", fstype, source, target, options) } - cmdLine := fmt.Sprintf(`$User = "%s";$PWord = ConvertTo-SecureString -String "%s" -AsPlainText -Force;`+ - `$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord`, - options[0], options[1]) - bindSource = source - cmdLine += fmt.Sprintf(";New-SmbGlobalMapping -RemotePath %s -Credential $Credential", source) - if output, err := exec.Command("powershell", "/c", cmdLine).CombinedOutput(); err != nil { + // use PowerShell Environment Variables to store user input string to prevent command line injection + // https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-5.1 + cmdLine := fmt.Sprintf(`$PWord = ConvertTo-SecureString -String $Env:smbpassword -AsPlainText -Force` + + `;$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Env:smbuser, $PWord` + + `;New-SmbGlobalMapping -RemotePath $Env:smbremotepath -Credential $Credential`) + + cmd := exec.Command("powershell", "/c", cmdLine) + cmd.Env = append(os.Environ(), + fmt.Sprintf("smbuser=%s", options[0]), + fmt.Sprintf("smbpassword=%s", options[1]), + fmt.Sprintf("smbremotepath=%s", source)) + if output, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("azureMount: SmbGlobalMapping failed: %v, only SMB mount is supported now, output: %q", err, string(output)) } } @@ -114,16 +120,6 @@ func (mounter *Mounter) Unmount(target string) error { return nil } -// GetMountRefs finds all other references to the device(drive) referenced -// by mountPath; returns a list of paths. -func GetMountRefs(mounter Interface, mountPath string) ([]string, error) { - refs, err := getAllParentLinks(normalizeWindowsPath(mountPath)) - if err != nil { - return nil, err - } - return refs, nil -} - // List returns a list of all mounted filesystems. todo func (mounter *Mounter) List() ([]MountPoint, error) { return []MountPoint{}, nil @@ -170,7 +166,7 @@ func (mounter *Mounter) GetDeviceNameFromMount(mountPath, pluginDir string) (str // the mount path reference should match the given plugin directory. In case no mount path reference // matches, returns the volume name taken from its given mountPath func getDeviceNameFromMount(mounter Interface, mountPath, pluginDir string) (string, error) { - refs, err := GetMountRefs(mounter, mountPath) + refs, err := mounter.GetMountRefs(mountPath) if err != nil { glog.V(4).Infof("GetMountRefs failed for mount path %q: %v", mountPath, err) return "", err @@ -242,6 +238,11 @@ func (mounter *Mounter) ExistsPath(pathname string) (bool, error) { return utilfile.FileExists(pathname) } +// EvalHostSymlinks returns the path name after evaluating symlinks +func (mounter *Mounter) EvalHostSymlinks(pathname string) (string, error) { + return filepath.EvalSymlinks(pathname) +} + // check whether hostPath is within volume path // this func will lock all intermediate subpath directories, need to close handle outside of this func after container started func lockAndCheckSubPath(volumePath, hostPath string) ([]uintptr, error) { @@ -308,7 +309,7 @@ func lockAndCheckSubPathWithoutSymlink(volumePath, subPath string) ([]uintptr, e break } - if !pathWithinBase(currentFullPath, volumePath) { + if !PathWithinBase(currentFullPath, volumePath) { errorResult = fmt.Errorf("SubPath %q not within volume path %q", currentFullPath, volumePath) break } @@ -458,11 +459,16 @@ func getAllParentLinks(path string) ([]string, error) { } func (mounter *Mounter) GetMountRefs(pathname string) ([]string, error) { - realpath, err := filepath.EvalSymlinks(pathname) + if _, err := os.Stat(normalizeWindowsPath(pathname)); os.IsNotExist(err) { + return []string{}, nil + } else if err != nil { + return nil, err + } + refs, err := getAllParentLinks(normalizeWindowsPath(pathname)) if err != nil { return nil, err } - return getMountRefsByDev(mounter, realpath) + return refs, nil } // Note that on windows, it always returns 0. We actually don't set FSGroup on @@ -498,7 +504,7 @@ func (mounter *Mounter) SafeMakeDir(subdir string, base string, perm os.FileMode func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { glog.V(4).Infof("Creating directory %q within base %q", pathname, base) - if !pathWithinBase(pathname, base) { + if !PathWithinBase(pathname, base) { return fmt.Errorf("path %s is outside of allowed base %s", pathname, base) } @@ -533,7 +539,7 @@ func doSafeMakeDir(pathname string, base string, perm os.FileMode) error { if err != nil { return fmt.Errorf("cannot read link %s: %s", base, err) } - if !pathWithinBase(fullExistingPath, fullBasePath) { + if !PathWithinBase(fullExistingPath, fullBasePath) { return fmt.Errorf("path %s is outside of allowed base %s", fullExistingPath, err) } diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go index a122411c..d627a8f1 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount.go @@ -287,6 +287,10 @@ func (mounter *NsenterMounter) ExistsPath(pathname string) (bool, error) { return utilfile.FileExists(kubeletpath) } +func (mounter *NsenterMounter) EvalHostSymlinks(pathname string) (string, error) { + return mounter.ne.EvalSymlinks(pathname, true) +} + func (mounter *NsenterMounter) CleanSubPaths(podDir string, volumeName string) error { return doCleanSubPaths(mounter, podDir, volumeName) } @@ -316,7 +320,7 @@ func (mounter *NsenterMounter) SafeMakeDir(subdir string, base string, perm os.F evaluatedBase = filepath.Clean(evaluatedBase) rootDir := filepath.Clean(mounter.rootDir) - if pathWithinBase(evaluatedBase, rootDir) { + if PathWithinBase(evaluatedBase, rootDir) { // Base is in /var/lib/kubelet. This directory is shared between the // container with kubelet and the host. We don't need to add '/rootfs'. // This is useful when /rootfs is mounted as read-only - we can still @@ -333,6 +337,13 @@ func (mounter *NsenterMounter) SafeMakeDir(subdir string, base string, perm os.F } func (mounter *NsenterMounter) GetMountRefs(pathname string) ([]string, error) { + exists, err := mounter.ExistsPath(pathname) + if err != nil { + return nil, err + } + if !exists { + return []string{}, nil + } hostpath, err := mounter.ne.EvalSymlinks(pathname, true /* mustExist */) if err != nil { return nil, err diff --git a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go index f417ba9b..87c2e9ec 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/nsenter_mount_unsupported.go @@ -89,6 +89,10 @@ func (*NsenterMounter) ExistsPath(pathname string) (bool, error) { return true, errors.New("not implemented") } +func (*NsenterMounter) EvalHostSymlinks(pathname string) (string, error) { + return "", errors.New("not implemented") +} + func (*NsenterMounter) SafeMakeDir(pathname string, base string, perm os.FileMode) error { return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/util/node/BUILD b/vendor/k8s.io/kubernetes/pkg/util/node/BUILD index 1e198dbb..f07fb2f7 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/node/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/node/BUILD @@ -11,15 +11,13 @@ go_library( srcs = ["node.go"], importpath = "k8s.io/kubernetes/pkg/util/node", deps = [ - "//pkg/apis/core:go_default_library", "//pkg/kubelet/apis:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", ], ) @@ -29,8 +27,8 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/kubelet/apis:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/util/node/node.go b/vendor/k8s.io/kubernetes/pkg/util/node/node.go index 6bc3ea8a..ddb29aac 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/node/node.go +++ b/vendor/k8s.io/kubernetes/pkg/util/node/node.go @@ -24,14 +24,12 @@ import ( "strings" "time" - "github.com/golang/glog" "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/strategicpatch" clientset "k8s.io/client-go/kubernetes" v1core "k8s.io/client-go/kubernetes/typed/core/v1" - api "k8s.io/kubernetes/pkg/apis/core" kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" ) @@ -43,16 +41,23 @@ const ( ) // GetHostname returns OS's hostname if 'hostnameOverride' is empty; otherwise, return 'hostnameOverride'. -func GetHostname(hostnameOverride string) string { - hostname := hostnameOverride - if hostname == "" { - nodename, err := os.Hostname() +func GetHostname(hostnameOverride string) (string, error) { + hostName := hostnameOverride + if len(hostName) == 0 { + nodeName, err := os.Hostname() if err != nil { - glog.Fatalf("Couldn't determine hostname: %v", err) + return "", fmt.Errorf("couldn't determine hostname: %v", err) } - hostname = nodename + hostName = nodeName } - return strings.ToLower(strings.TrimSpace(hostname)) + + // Trim whitespaces first to avoid getting an empty hostname + // For linux, the hostname is read from file /proc/sys/kernel/hostname directly + hostName = strings.TrimSpace(hostName) + if len(hostName) == 0 { + return "", fmt.Errorf("empty hostname is invalid") + } + return strings.ToLower(hostName), nil } // GetPreferredNodeAddress returns the address of the provided node, using the provided preference order. @@ -64,13 +69,6 @@ func GetPreferredNodeAddress(node *v1.Node, preferredAddressTypes []v1.NodeAddre return address.Address, nil } } - // If hostname was requested and no Hostname address was registered... - if addressType == v1.NodeHostName { - // ...fall back to the kubernetes.io/hostname label for compatibility with kubelets before 1.5 - if hostname, ok := node.Labels[kubeletapis.LabelHostname]; ok && len(hostname) > 0 { - return hostname, nil - } - } } return "", fmt.Errorf("no preferred addresses found; known addresses: %v", node.Status.Addresses) } @@ -93,24 +91,6 @@ func GetNodeHostIP(node *v1.Node) (net.IP, error) { return nil, fmt.Errorf("host IP unknown; known addresses: %v", addresses) } -// InternalGetNodeHostIP returns the provided node's IP, based on the priority: -// 1. NodeInternalIP -// 2. NodeExternalIP -func InternalGetNodeHostIP(node *api.Node) (net.IP, error) { - addresses := node.Status.Addresses - addressMap := make(map[api.NodeAddressType][]api.NodeAddress) - for i := range addresses { - addressMap[addresses[i].Type] = append(addressMap[addresses[i].Type], addresses[i]) - } - if addresses, ok := addressMap[api.NodeInternalIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - if addresses, ok := addressMap[api.NodeExternalIP]; ok { - return net.ParseIP(addresses[0].Address), nil - } - return nil, fmt.Errorf("host IP unknown; known addresses: %v", addresses) -} - // GetZoneKey is a helper function that builds a string identifier that is unique per failure-zone; // it returns empty-string for no zone. func GetZoneKey(node *v1.Node) string { diff --git a/vendor/k8s.io/kubernetes/pkg/util/nsenter/BUILD b/vendor/k8s.io/kubernetes/pkg/util/nsenter/BUILD index 286b8882..05765dcc 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/nsenter/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/nsenter/BUILD @@ -2,42 +2,12 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", - srcs = select({ - "@io_bazel_rules_go//go/platform:android": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "nsenter.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "nsenter_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "nsenter_unsupported.go", - ], - "//conditions:default": [], - }), + srcs = [ + "exec.go", + "exec_unsupported.go", + "nsenter.go", + "nsenter_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/util/nsenter", visibility = ["//visibility:public"], deps = select({ @@ -95,12 +65,7 @@ filegroup( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "nsenter_test.go", - ], - "//conditions:default": [], - }), + srcs = ["nsenter_test.go"], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:linux": [ diff --git a/vendor/k8s.io/kubernetes/pkg/util/nsenter/OWNERS b/vendor/k8s.io/kubernetes/pkg/util/nsenter/OWNERS new file mode 100644 index 00000000..c4f27cb4 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/util/nsenter/OWNERS @@ -0,0 +1,8 @@ +reviewers: + - jsafrane + - msau42 + - cofyc +approvers: + - jsafrane + - msau42 + - cofyc diff --git a/vendor/k8s.io/kubernetes/pkg/util/nsenter/exec.go b/vendor/k8s.io/kubernetes/pkg/util/nsenter/exec.go new file mode 100644 index 00000000..201f1270 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/util/nsenter/exec.go @@ -0,0 +1,67 @@ +// +build linux + +/* +Copyright 2018 The Kubernetes Authors. + +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 nsenter + +import ( + "context" + "fmt" + "path/filepath" + + "github.com/golang/glog" + "k8s.io/utils/exec" +) + +// Executor wraps executor interface to be executed via nsenter +type Executor struct { + // Exec implementation + executor exec.Interface + // Path to the host's root proc path + hostProcMountNsPath string +} + +// NewNsenterExecutor returns new nsenter based executor +func NewNsenterExecutor(hostRootFsPath string, executor exec.Interface) *Executor { + hostProcMountNsPath := filepath.Join(hostRootFsPath, mountNsPath) + nsExecutor := &Executor{ + hostProcMountNsPath: hostProcMountNsPath, + executor: executor, + } + return nsExecutor +} + +// Command returns a command wrapped with nenter +func (nsExecutor *Executor) Command(cmd string, args ...string) exec.Cmd { + fullArgs := append([]string{fmt.Sprintf("--mount=%s", nsExecutor.hostProcMountNsPath), "--"}, + append([]string{cmd}, args...)...) + glog.V(5).Infof("Running nsenter command: %v %v", nsenterPath, fullArgs) + return nsExecutor.executor.Command(nsenterPath, fullArgs...) +} + +// CommandContext returns a CommandContext wrapped with nsenter +func (nsExecutor *Executor) CommandContext(ctx context.Context, cmd string, args ...string) exec.Cmd { + fullArgs := append([]string{fmt.Sprintf("--mount=%s", nsExecutor.hostProcMountNsPath), "--"}, + append([]string{cmd}, args...)...) + glog.V(5).Infof("Running nsenter command: %v %v", nsenterPath, fullArgs) + return nsExecutor.executor.CommandContext(ctx, nsenterPath, fullArgs...) +} + +// LookPath returns a LookPath wrapped with nsenter +func (nsExecutor *Executor) LookPath(file string) (string, error) { + return "", fmt.Errorf("not implemented, error looking up : %s", file) +} diff --git a/vendor/k8s.io/kubernetes/pkg/util/nsenter/exec_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/nsenter/exec_unsupported.go new file mode 100644 index 00000000..eecbdfc2 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/util/nsenter/exec_unsupported.go @@ -0,0 +1,58 @@ +// +build !linux + +/* +Copyright 2017 The Kubernetes Authors. + +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 nsenter + +import ( + "context" + "fmt" + + "k8s.io/utils/exec" +) + +// Executor wraps executor interface to be executed via nsenter +type Executor struct { + // Exec implementation + executor exec.Interface + // Path to the host's root proc path + hostProcMountNsPath string +} + +// NewNsenterExecutor returns new nsenter based executor +func NewNsenterExecutor(hostRootFsPath string, executor exec.Interface) *Executor { + nsExecutor := &Executor{ + hostProcMountNsPath: hostRootFsPath, + executor: executor, + } + return nsExecutor +} + +// Command returns a command wrapped with nenter +func (nsExecutor *Executor) Command(cmd string, args ...string) exec.Cmd { + return nil +} + +// CommandContext returns a CommandContext wrapped with nsenter +func (nsExecutor *Executor) CommandContext(ctx context.Context, cmd string, args ...string) exec.Cmd { + return nil +} + +// LookPath returns a LookPath wrapped with nsenter +func (nsExecutor *Executor) LookPath(file string) (string, error) { + return "", fmt.Errorf("not implemented, error looking up : %s", file) +} diff --git a/vendor/k8s.io/kubernetes/pkg/util/oom/BUILD b/vendor/k8s.io/kubernetes/pkg/util/oom/BUILD index 9e666b9f..712fc906 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/oom/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/oom/BUILD @@ -12,42 +12,9 @@ go_library( "doc.go", "oom.go", "oom_fake.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "oom_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "oom_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "oom_unsupported.go", - ], - "//conditions:default": [], - }), + "oom_linux.go", + "oom_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/util/oom", deps = select({ "@io_bazel_rules_go//go/platform:linux": [ @@ -60,12 +27,7 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "oom_linux_test.go", - ], - "//conditions:default": [], - }), + srcs = ["oom_linux_test.go"], embed = [":go_default_library"], deps = select({ "@io_bazel_rules_go//go/platform:linux": [ diff --git a/vendor/k8s.io/kubernetes/pkg/util/pod/BUILD b/vendor/k8s.io/kubernetes/pkg/util/pod/BUILD index 57a081ab..41921752 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/pod/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/pod/BUILD @@ -6,10 +6,10 @@ go_library( importpath = "k8s.io/kubernetes/pkg/util/pod", visibility = ["//visibility:public"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", ], ) @@ -18,9 +18,9 @@ go_test( srcs = ["pod_test.go"], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/util/pointer/BUILD b/vendor/k8s.io/kubernetes/pkg/util/pointer/BUILD deleted file mode 100644 index d45d9000..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/pointer/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["pointer_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["pointer.go"], - importpath = "k8s.io/kubernetes/pkg/util/pointer", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD b/vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD index c7bc5f4a..1c02e429 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/procfs/BUILD @@ -12,47 +12,14 @@ go_library( "doc.go", "procfs.go", "procfs_fake.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "procfs_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "procfs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "procfs_unsupported.go", - ], - "//conditions:default": [], - }), + "procfs_linux.go", + "procfs_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/util/procfs", deps = select({ "@io_bazel_rules_go//go/platform:linux": [ + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", ], "//conditions:default": [], }), @@ -60,12 +27,7 @@ go_library( go_test( name = "go_default_test", - srcs = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "procfs_linux_test.go", - ], - "//conditions:default": [], - }), + srcs = ["procfs_linux_test.go"], data = [ "example_proc_cgroup", ], diff --git a/vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD b/vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD deleted file mode 100644 index 23b04725..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/removeall/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["removeall_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/util/mount:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["removeall.go"], - importpath = "k8s.io/kubernetes/pkg/util/removeall", - deps = ["//pkg/util/mount:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/removeall/removeall.go b/vendor/k8s.io/kubernetes/pkg/util/removeall/removeall.go deleted file mode 100644 index fa15ac1b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/removeall/removeall.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 removeall - -import ( - "fmt" - "io" - "os" - "syscall" - - "k8s.io/kubernetes/pkg/util/mount" -) - -// RemoveAllOneFilesystem removes path and any children it contains. -// It removes everything it can but returns the first error -// it encounters. If the path does not exist, RemoveAll -// returns nil (no error). -// It makes sure it does not cross mount boundary, i.e. it does *not* remove -// files from another filesystems. Like 'rm -rf --one-file-system'. -// It is copied from RemoveAll() sources, with IsLikelyNotMountPoint -func RemoveAllOneFilesystem(mounter mount.Interface, path string) error { - // Simple case: if Remove works, we're done. - err := os.Remove(path) - if err == nil || os.IsNotExist(err) { - return nil - } - - // Otherwise, is this a directory we need to recurse into? - dir, serr := os.Lstat(path) - if serr != nil { - if serr, ok := serr.(*os.PathError); ok && (os.IsNotExist(serr.Err) || serr.Err == syscall.ENOTDIR) { - return nil - } - return serr - } - if !dir.IsDir() { - // Not a directory; return the error from Remove. - return err - } - - // Directory. - isNotMount, err := mounter.IsLikelyNotMountPoint(path) - if err != nil { - return err - } - if !isNotMount { - return fmt.Errorf("cannot delete directory %s: it is a mount point", path) - } - - fd, err := os.Open(path) - if err != nil { - if os.IsNotExist(err) { - // Race. It was deleted between the Lstat and Open. - // Return nil per RemoveAll's docs. - return nil - } - return err - } - - // Remove contents & return first error. - err = nil - for { - names, err1 := fd.Readdirnames(100) - for _, name := range names { - err1 := RemoveAllOneFilesystem(mounter, path+string(os.PathSeparator)+name) - if err == nil { - err = err1 - } - } - if err1 == io.EOF { - break - } - // If Readdirnames returned an error, use it. - if err == nil { - err = err1 - } - if len(names) == 0 { - break - } - } - - // Close directory, because windows won't remove opened directory. - fd.Close() - - // Remove directory. - err1 := os.Remove(path) - if err1 == nil || os.IsNotExist(err1) { - return nil - } - if err == nil { - err = err1 - } - return err -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD b/vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD deleted file mode 100644 index 00fedd0c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/resizefs/BUILD +++ /dev/null @@ -1,94 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = select({ - "@io_bazel_rules_go//go/platform:android": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "resizefs_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "resizefs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "resizefs_unsupported.go", - ], - "//conditions:default": [], - }), - importpath = "k8s.io/kubernetes/pkg/util/resizefs", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//pkg/util/mount:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//pkg/util/mount:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/util/mount:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go b/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go deleted file mode 100644 index 518eba2b..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_linux.go +++ /dev/null @@ -1,86 +0,0 @@ -// +build linux - -/* -Copyright 2017 The Kubernetes Authors. - -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 resizefs - -import ( - "fmt" - - "github.com/golang/glog" - "k8s.io/kubernetes/pkg/util/mount" -) - -// ResizeFs Provides support for resizing file systems -type ResizeFs struct { - mounter *mount.SafeFormatAndMount -} - -// NewResizeFs returns new instance of resizer -func NewResizeFs(mounter *mount.SafeFormatAndMount) *ResizeFs { - return &ResizeFs{mounter: mounter} -} - -// Resize perform resize of file system -func (resizefs *ResizeFs) Resize(devicePath string, deviceMountPath string) (bool, error) { - format, err := resizefs.mounter.GetDiskFormat(devicePath) - - if err != nil { - formatErr := fmt.Errorf("ResizeFS.Resize - error checking format for device %s: %v", devicePath, err) - return false, formatErr - } - - // If disk has no format, there is no need to resize the disk because mkfs.* - // by default will use whole disk anyways. - if format == "" { - return false, nil - } - - glog.V(3).Infof("ResizeFS.Resize - Expanding mounted volume %s", devicePath) - switch format { - case "ext3", "ext4": - return resizefs.extResize(devicePath) - case "xfs": - return resizefs.xfsResize(deviceMountPath) - } - return false, fmt.Errorf("ResizeFS.Resize - resize of format %s is not supported for device %s mounted at %s", format, devicePath, deviceMountPath) -} - -func (resizefs *ResizeFs) extResize(devicePath string) (bool, error) { - output, err := resizefs.mounter.Exec.Run("resize2fs", devicePath) - if err == nil { - glog.V(2).Infof("Device %s resized successfully", devicePath) - return true, nil - } - - resizeError := fmt.Errorf("resize of device %s failed: %v. resize2fs output: %s", devicePath, err, string(output)) - return false, resizeError - -} - -func (resizefs *ResizeFs) xfsResize(deviceMountPath string) (bool, error) { - args := []string{"-d", deviceMountPath} - output, err := resizefs.mounter.Exec.Run("xfs_growfs", args...) - - if err == nil { - glog.V(2).Infof("Device %s resized successfully", deviceMountPath) - return true, nil - } - - resizeError := fmt.Errorf("resize of device %s failed: %v. xfs_growfs output: %s", deviceMountPath, err, string(output)) - return false, resizeError -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_unsupported.go b/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_unsupported.go deleted file mode 100644 index dd4dd017..00000000 --- a/vendor/k8s.io/kubernetes/pkg/util/resizefs/resizefs_unsupported.go +++ /dev/null @@ -1,40 +0,0 @@ -// +build !linux - -/* -Copyright 2017 The Kubernetes Authors. - -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 resizefs - -import ( - "fmt" - - "k8s.io/kubernetes/pkg/util/mount" -) - -// ResizeFs Provides support for resizing file systems -type ResizeFs struct { - mounter *mount.SafeFormatAndMount -} - -// NewResizeFs returns new instance of resizer -func NewResizeFs(mounter *mount.SafeFormatAndMount) *ResizeFs { - return &ResizeFs{mounter: mounter} -} - -// Resize perform resize of file system -func (resizefs *ResizeFs) Resize(devicePath string, deviceMountPath string) (bool, error) { - return false, fmt.Errorf("Resize is not supported for this build") -} diff --git a/vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD b/vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD index dae3792f..868c77c7 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/selinux/BUILD @@ -10,42 +10,9 @@ go_library( srcs = [ "doc.go", "selinux.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "selinux_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "selinux_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "selinux_unsupported.go", - ], - "//conditions:default": [], - }), + "selinux_linux.go", + "selinux_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/util/selinux", deps = select({ "@io_bazel_rules_go//go/platform:linux": [ diff --git a/vendor/k8s.io/kubernetes/pkg/util/taints/BUILD b/vendor/k8s.io/kubernetes/pkg/util/taints/BUILD index 7bcc7819..1409f61e 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/taints/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/util/taints/BUILD @@ -13,10 +13,10 @@ go_library( deps = [ "//pkg/apis/core:go_default_library", "//pkg/apis/core/helper:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", ], ) @@ -26,8 +26,8 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/version/BUILD b/vendor/k8s.io/kubernetes/pkg/version/BUILD index 8194b973..26b0a161 100644 --- a/vendor/k8s.io/kubernetes/pkg/version/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/version/BUILD @@ -13,7 +13,7 @@ go_library( "version.go", ], importpath = "k8s.io/kubernetes/pkg/version", - deps = ["//vendor/k8s.io/apimachinery/pkg/version:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/version:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/kubernetes/pkg/version/def.bzl b/vendor/k8s.io/kubernetes/pkg/version/def.bzl index 9c018a4e..302893b1 100644 --- a/vendor/k8s.io/kubernetes/pkg/version/def.bzl +++ b/vendor/k8s.io/kubernetes/pkg/version/def.bzl @@ -14,25 +14,26 @@ # Implements hack/lib/version.sh's kube::version::ldflags() for Bazel. def version_x_defs(): - # This should match the list of packages in kube::version::ldflag - stamp_pkgs = [ - "k8s.io/kubernetes/pkg/version", - # In hack/lib/version.sh, this has a vendor/ prefix. That isn't needed here? - "k8s.io/client-go/pkg/version", - ] - # This should match the list of vars in kube::version::ldflags - # It should also match the list of vars set in hack/print-workspace-status.sh. - stamp_vars = [ - "buildDate", - "gitCommit", - "gitMajor", - "gitMinor", - "gitTreeState", - "gitVersion", - ] - # Generate the cross-product. - x_defs = {} - for pkg in stamp_pkgs: - for var in stamp_vars: - x_defs["%s.%s" % (pkg, var)] = "{%s}" % var - return x_defs + # This should match the list of packages in kube::version::ldflag + stamp_pkgs = [ + "k8s.io/kubernetes/pkg/version", + "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/version", + ] + + # This should match the list of vars in kube::version::ldflags + # It should also match the list of vars set in hack/print-workspace-status.sh. + stamp_vars = [ + "buildDate", + "gitCommit", + "gitMajor", + "gitMinor", + "gitTreeState", + "gitVersion", + ] + + # Generate the cross-product. + x_defs = {} + for pkg in stamp_pkgs: + for var in stamp_vars: + x_defs["%s.%s" % (pkg, var)] = "{%s}" % var + return x_defs diff --git a/vendor/k8s.io/kubernetes/pkg/volume/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/BUILD index 28c8c8a6..bbe76dd8 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/volume/BUILD @@ -11,91 +11,45 @@ go_library( "metrics_statfs.go", "plugins.go", "volume.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "volume_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "volume_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "volume_unsupported.go", - ], - "//conditions:default": [], - }), + "volume_linux.go", + "volume_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/volume", visibility = ["//visibility:public"], deps = [ "//pkg/cloudprovider:go_default_library", - "//pkg/util/io:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/volume/util/fs:go_default_library", "//pkg/volume/util/recyclerclient:go_default_library", + "//staging/src/k8s.io/api/authentication/v1:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/csi-api/pkg/client/clientset/versioned:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", ], ) go_test( name = "go_default_test", srcs = [ + "metrics_du_test.go", "metrics_nil_test.go", + "metrics_statfs_test.go", "plugins_test.go", ], embed = [":go_default_library"], deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = [ - "metrics_statfs_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "metrics_du_test.go", - ], - "//conditions:default": [], - }), - deps = [ - ":go_default_library", "//pkg/volume/testing:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/client-go/util/testing:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:linux": [ "//vendor/golang.org/x/sys/unix:go_default_library", diff --git a/vendor/k8s.io/kubernetes/pkg/volume/OWNERS b/vendor/k8s.io/kubernetes/pkg/volume/OWNERS index 9ee3a37d..fb4e6f00 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/OWNERS +++ b/vendor/k8s.io/kubernetes/pkg/volume/OWNERS @@ -15,3 +15,5 @@ reviewers: - gnufied - verult - davidz627 +labels: +- sig/storage diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD deleted file mode 100644 index 54a2574e..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/BUILD +++ /dev/null @@ -1,83 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "csi_attacher.go", - "csi_block.go", - "csi_client.go", - "csi_mounter.go", - "csi_plugin.go", - "csi_util.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/csi", - visibility = ["//visibility:public"], - deps = [ - "//pkg/features:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/util/strings:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/csi/labelmanager:go_default_library", - "//pkg/volume/util:go_default_library", - "//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/google.golang.org/grpc:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "csi_attacher_test.go", - "csi_block_test.go", - "csi_client_test.go", - "csi_mounter_test.go", - "csi_plugin_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//pkg/volume:go_default_library", - "//pkg/volume/csi/fake:go_default_library", - "//pkg/volume/testing:go_default_library", - "//pkg/volume/util:go_default_library", - "//vendor/github.com/container-storage-interface/spec/lib/go/csi/v0:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//pkg/volume/csi/fake:all-srcs", - "//pkg/volume/csi/labelmanager:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/OWNERS b/vendor/k8s.io/kubernetes/pkg/volume/csi/OWNERS deleted file mode 100644 index 7d0605ba..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -approvers: -- jsafrane -- saad-ali -- vladimirvivien diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go deleted file mode 100644 index 82fb8e66..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_attacher.go +++ /dev/null @@ -1,567 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 csi - -import ( - "context" - "crypto/sha256" - "errors" - "fmt" - "os" - "path" - "path/filepath" - "strings" - "time" - - "github.com/golang/glog" - - csipb "github.com/container-storage-interface/spec/lib/go/csi/v0" - "k8s.io/api/core/v1" - storage "k8s.io/api/storage/v1beta1" - apierrs "k8s.io/apimachinery/pkg/api/errors" - meta "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/volume" -) - -const ( - persistentVolumeInGlobalPath = "pv" - globalMountInGlobalPath = "globalmount" -) - -type csiAttacher struct { - plugin *csiPlugin - k8s kubernetes.Interface - waitSleepTime time.Duration - - csiClient csiClient -} - -// volume.Attacher methods -var _ volume.Attacher = &csiAttacher{} - -func (c *csiAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string, error) { - if spec == nil { - glog.Error(log("attacher.Attach missing volume.Spec")) - return "", errors.New("missing spec") - } - - csiSource, err := getCSISourceFromSpec(spec) - if err != nil { - glog.Error(log("attacher.Attach failed to get CSI persistent source: %v", err)) - return "", err - } - - node := string(nodeName) - pvName := spec.PersistentVolume.GetName() - attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, node) - - attachment := &storage.VolumeAttachment{ - ObjectMeta: meta.ObjectMeta{ - Name: attachID, - }, - Spec: storage.VolumeAttachmentSpec{ - NodeName: node, - Attacher: csiSource.Driver, - Source: storage.VolumeAttachmentSource{ - PersistentVolumeName: &pvName, - }, - }, - Status: storage.VolumeAttachmentStatus{Attached: false}, - } - - _, err = c.k8s.StorageV1beta1().VolumeAttachments().Create(attachment) - alreadyExist := false - if err != nil { - if !apierrs.IsAlreadyExists(err) { - glog.Error(log("attacher.Attach failed: %v", err)) - return "", err - } - alreadyExist = true - } - - if alreadyExist { - glog.V(4).Info(log("attachment [%v] for volume [%v] already exists (will not be recreated)", attachID, csiSource.VolumeHandle)) - } else { - glog.V(4).Info(log("attachment [%v] for volume [%v] created successfully", attachID, csiSource.VolumeHandle)) - } - - if _, err := c.waitForVolumeAttachment(csiSource.VolumeHandle, attachID, csiTimeout); err != nil { - return "", err - } - - glog.V(4).Info(log("attacher.Attach finished OK with VolumeAttachment object [%s]", attachID)) - - return attachID, nil -} - -func (c *csiAttacher) WaitForAttach(spec *volume.Spec, attachID string, pod *v1.Pod, timeout time.Duration) (string, error) { - source, err := getCSISourceFromSpec(spec) - if err != nil { - glog.Error(log("attacher.WaitForAttach failed to extract CSI volume source: %v", err)) - return "", err - } - - return c.waitForVolumeAttachment(source.VolumeHandle, attachID, timeout) -} - -func (c *csiAttacher) waitForVolumeAttachment(volumeHandle, attachID string, timeout time.Duration) (string, error) { - glog.V(4).Info(log("probing for updates from CSI driver for [attachment.ID=%v]", attachID)) - - timer := time.NewTimer(timeout) // TODO (vladimirvivien) investigate making this configurable - defer timer.Stop() - - return c.waitForVolumeAttachmentInternal(volumeHandle, attachID, timer, timeout) -} - -func (c *csiAttacher) waitForVolumeAttachmentInternal(volumeHandle, attachID string, timer *time.Timer, timeout time.Duration) (string, error) { - glog.V(4).Info(log("probing VolumeAttachment [id=%v]", attachID)) - attach, err := c.k8s.StorageV1beta1().VolumeAttachments().Get(attachID, meta.GetOptions{}) - if err != nil { - glog.Error(log("attacher.WaitForAttach failed for volume [%s] (will continue to try): %v", volumeHandle, err)) - return "", err - } - // if being deleted, fail fast - if attach.GetDeletionTimestamp() != nil { - glog.Error(log("VolumeAttachment [%s] has deletion timestamp, will not continue to wait for attachment", attachID)) - return "", errors.New("volume attachment is being deleted") - } - // attachment OK - if attach.Status.Attached { - return attachID, nil - } - // driver reports attach error - attachErr := attach.Status.AttachError - if attachErr != nil { - glog.Error(log("attachment for %v failed: %v", volumeHandle, attachErr.Message)) - return "", errors.New(attachErr.Message) - } - - watcher, err := c.k8s.StorageV1beta1().VolumeAttachments().Watch(meta.SingleObject(meta.ObjectMeta{Name: attachID, ResourceVersion: attach.ResourceVersion})) - if err != nil { - return "", fmt.Errorf("watch error:%v for volume %v", err, volumeHandle) - } - - ch := watcher.ResultChan() - defer watcher.Stop() - - for { - select { - case event, ok := <-ch: - if !ok { - glog.Errorf("[attachment.ID=%v] watch channel had been closed", attachID) - return "", errors.New("volume attachment watch channel had been closed") - } - - switch event.Type { - case watch.Added, watch.Modified: - attach, _ := event.Object.(*storage.VolumeAttachment) - // if being deleted, fail fast - if attach.GetDeletionTimestamp() != nil { - glog.Error(log("VolumeAttachment [%s] has deletion timestamp, will not continue to wait for attachment", attachID)) - return "", errors.New("volume attachment is being deleted") - } - // attachment OK - if attach.Status.Attached { - return attachID, nil - } - // driver reports attach error - attachErr := attach.Status.AttachError - if attachErr != nil { - glog.Error(log("attachment for %v failed: %v", volumeHandle, attachErr.Message)) - return "", errors.New(attachErr.Message) - } - case watch.Deleted: - // if deleted, fail fast - glog.Error(log("VolumeAttachment [%s] has been deleted, will not continue to wait for attachment", attachID)) - return "", errors.New("volume attachment has been deleted") - - case watch.Error: - // start another cycle - c.waitForVolumeAttachmentInternal(volumeHandle, attachID, timer, timeout) - } - - case <-timer.C: - glog.Error(log("attacher.WaitForAttach timeout after %v [volume=%v; attachment.ID=%v]", timeout, volumeHandle, attachID)) - return "", fmt.Errorf("attachment timeout for volume %v", volumeHandle) - } - } -} - -func (c *csiAttacher) VolumesAreAttached(specs []*volume.Spec, nodeName types.NodeName) (map[*volume.Spec]bool, error) { - glog.V(4).Info(log("probing attachment status for %d volume(s) ", len(specs))) - - attached := make(map[*volume.Spec]bool) - - for _, spec := range specs { - if spec == nil { - glog.Error(log("attacher.VolumesAreAttached missing volume.Spec")) - return nil, errors.New("missing spec") - } - source, err := getCSISourceFromSpec(spec) - if err != nil { - glog.Error(log("attacher.VolumesAreAttached failed: %v", err)) - continue - } - - attachID := getAttachmentName(source.VolumeHandle, source.Driver, string(nodeName)) - glog.V(4).Info(log("probing attachment status for VolumeAttachment %v", attachID)) - attach, err := c.k8s.StorageV1beta1().VolumeAttachments().Get(attachID, meta.GetOptions{}) - if err != nil { - glog.Error(log("attacher.VolumesAreAttached failed for attach.ID=%v: %v", attachID, err)) - continue - } - glog.V(4).Info(log("attacher.VolumesAreAttached attachment [%v] has status.attached=%t", attachID, attach.Status.Attached)) - attached[spec] = attach.Status.Attached - } - - return attached, nil -} - -func (c *csiAttacher) GetDeviceMountPath(spec *volume.Spec) (string, error) { - glog.V(4).Info(log("attacher.GetDeviceMountPath(%v)", spec)) - deviceMountPath, err := makeDeviceMountPath(c.plugin, spec) - if err != nil { - glog.Error(log("attacher.GetDeviceMountPath failed to make device mount path: %v", err)) - return "", err - } - glog.V(4).Infof("attacher.GetDeviceMountPath succeeded, deviceMountPath: %s", deviceMountPath) - return deviceMountPath, nil -} - -func (c *csiAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error { - glog.V(4).Infof(log("attacher.MountDevice(%s, %s)", devicePath, deviceMountPath)) - - mounted, err := isDirMounted(c.plugin, deviceMountPath) - if err != nil { - glog.Error(log("attacher.MountDevice failed while checking mount status for dir [%s]", deviceMountPath)) - return err - } - - if mounted { - glog.V(4).Info(log("attacher.MountDevice skipping mount, dir already mounted [%s]", deviceMountPath)) - return nil - } - - // Setup - if spec == nil { - return fmt.Errorf("attacher.MountDevice failed, spec is nil") - } - csiSource, err := getCSISourceFromSpec(spec) - if err != nil { - glog.Error(log("attacher.MountDevice failed to get CSI persistent source: %v", err)) - return err - } - - if c.csiClient == nil { - c.csiClient = newCsiDriverClient(csiSource.Driver) - } - csi := c.csiClient - - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) - defer cancel() - // Check whether "STAGE_UNSTAGE_VOLUME" is set - stageUnstageSet, err := hasStageUnstageCapability(ctx, csi) - if err != nil { - glog.Error(log("attacher.MountDevice failed to check STAGE_UNSTAGE_VOLUME: %v", err)) - return err - } - if !stageUnstageSet { - glog.Infof(log("attacher.MountDevice STAGE_UNSTAGE_VOLUME capability not set. Skipping MountDevice...")) - return nil - } - - // Start MountDevice - if deviceMountPath == "" { - return fmt.Errorf("attacher.MountDevice failed, deviceMountPath is empty") - } - - nodeName := string(c.plugin.host.GetNodeName()) - attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, nodeName) - - // search for attachment by VolumeAttachment.Spec.Source.PersistentVolumeName - attachment, err := c.k8s.StorageV1beta1().VolumeAttachments().Get(attachID, meta.GetOptions{}) - if err != nil { - glog.Error(log("attacher.MountDevice failed while getting volume attachment [id=%v]: %v", attachID, err)) - return err - } - - if attachment == nil { - glog.Error(log("unable to find VolumeAttachment [id=%s]", attachID)) - return errors.New("no existing VolumeAttachment found") - } - publishVolumeInfo := attachment.Status.AttachmentMetadata - - nodeStageSecrets := map[string]string{} - if csiSource.NodeStageSecretRef != nil { - nodeStageSecrets, err = getCredentialsFromSecret(c.k8s, csiSource.NodeStageSecretRef) - if err != nil { - return fmt.Errorf("fetching NodeStageSecretRef %s/%s failed: %v", - csiSource.NodeStageSecretRef.Namespace, csiSource.NodeStageSecretRef.Name, err) - } - } - - // create target_dir before call to NodeStageVolume - if err := os.MkdirAll(deviceMountPath, 0750); err != nil { - glog.Error(log("attacher.MountDevice failed to create dir %#v: %v", deviceMountPath, err)) - return err - } - glog.V(4).Info(log("created target path successfully [%s]", deviceMountPath)) - - //TODO (vladimirvivien) implement better AccessModes mapping between k8s and CSI - accessMode := v1.ReadWriteOnce - if spec.PersistentVolume.Spec.AccessModes != nil { - accessMode = spec.PersistentVolume.Spec.AccessModes[0] - } - - fsType := csiSource.FSType - if len(fsType) == 0 { - fsType = defaultFSType - } - - err = csi.NodeStageVolume(ctx, - csiSource.VolumeHandle, - publishVolumeInfo, - deviceMountPath, - fsType, - accessMode, - nodeStageSecrets, - csiSource.VolumeAttributes) - - if err != nil { - glog.Errorf(log("attacher.MountDevice failed: %v", err)) - if removeMountDirErr := removeMountDir(c.plugin, deviceMountPath); removeMountDirErr != nil { - glog.Error(log("attacher.MountDevice failed to remove mount dir after a NodeStageVolume() error [%s]: %v", deviceMountPath, removeMountDirErr)) - } - return err - } - - glog.V(4).Infof(log("attacher.MountDevice successfully requested NodeStageVolume [%s]", deviceMountPath)) - return nil -} - -var _ volume.Detacher = &csiAttacher{} - -func (c *csiAttacher) Detach(volumeName string, nodeName types.NodeName) error { - // volumeName in format driverNamevolumeHandle generated by plugin.GetVolumeName() - if volumeName == "" { - glog.Error(log("detacher.Detach missing value for parameter volumeName")) - return errors.New("missing expected parameter volumeName") - } - parts := strings.Split(volumeName, volNameSep) - if len(parts) != 2 { - glog.Error(log("detacher.Detach insufficient info encoded in volumeName")) - return errors.New("volumeName missing expected data") - } - - driverName := parts[0] - volID := parts[1] - attachID := getAttachmentName(volID, driverName, string(nodeName)) - if err := c.k8s.StorageV1beta1().VolumeAttachments().Delete(attachID, nil); err != nil { - if apierrs.IsNotFound(err) { - // object deleted or never existed, done - glog.V(4).Info(log("VolumeAttachment object [%v] for volume [%v] not found, object deleted", attachID, volID)) - return nil - } - glog.Error(log("detacher.Detach failed to delete VolumeAttachment [%s]: %v", attachID, err)) - return err - } - - glog.V(4).Info(log("detacher deleted ok VolumeAttachment.ID=%s", attachID)) - return c.waitForVolumeDetachment(volID, attachID) -} - -func (c *csiAttacher) waitForVolumeDetachment(volumeHandle, attachID string) error { - glog.V(4).Info(log("probing for updates from CSI driver for [attachment.ID=%v]", attachID)) - - timeout := c.waitSleepTime * 10 - timer := time.NewTimer(timeout) // TODO (vladimirvivien) investigate making this configurable - defer timer.Stop() - - return c.waitForVolumeDetachmentInternal(volumeHandle, attachID, timer, timeout) -} - -func (c *csiAttacher) waitForVolumeDetachmentInternal(volumeHandle, attachID string, timer *time.Timer, timeout time.Duration) error { - glog.V(4).Info(log("probing VolumeAttachment [id=%v]", attachID)) - attach, err := c.k8s.StorageV1beta1().VolumeAttachments().Get(attachID, meta.GetOptions{}) - if err != nil { - if apierrs.IsNotFound(err) { - //object deleted or never existed, done - glog.V(4).Info(log("VolumeAttachment object [%v] for volume [%v] not found, object deleted", attachID, volumeHandle)) - return nil - } - glog.Error(log("detacher.WaitForDetach failed for volume [%s] (will continue to try): %v", volumeHandle, err)) - return err - } - // driver reports attach error - detachErr := attach.Status.DetachError - if detachErr != nil { - glog.Error(log("detachment for VolumeAttachment [%v] for volume [%s] failed: %v", attachID, volumeHandle, detachErr.Message)) - return errors.New(detachErr.Message) - } - - watcher, err := c.k8s.StorageV1beta1().VolumeAttachments().Watch(meta.SingleObject(meta.ObjectMeta{Name: attachID, ResourceVersion: attach.ResourceVersion})) - if err != nil { - return fmt.Errorf("watch error:%v for volume %v", err, volumeHandle) - } - ch := watcher.ResultChan() - defer watcher.Stop() - - for { - select { - case event, ok := <-ch: - if !ok { - glog.Errorf("[attachment.ID=%v] watch channel had been closed", attachID) - return errors.New("volume attachment watch channel had been closed") - } - - switch event.Type { - case watch.Added, watch.Modified: - attach, _ := event.Object.(*storage.VolumeAttachment) - // driver reports attach error - detachErr := attach.Status.DetachError - if detachErr != nil { - glog.Error(log("detachment for VolumeAttachment [%v] for volume [%s] failed: %v", attachID, volumeHandle, detachErr.Message)) - return errors.New(detachErr.Message) - } - case watch.Deleted: - //object deleted - glog.V(4).Info(log("VolumeAttachment object [%v] for volume [%v] has been deleted", attachID, volumeHandle)) - return nil - - case watch.Error: - // start another cycle - c.waitForVolumeDetachmentInternal(volumeHandle, attachID, timer, timeout) - } - - case <-timer.C: - glog.Error(log("detacher.WaitForDetach timeout after %v [volume=%v; attachment.ID=%v]", timeout, volumeHandle, attachID)) - return fmt.Errorf("detachment timeout for volume %v", volumeHandle) - } - } -} - -func (c *csiAttacher) UnmountDevice(deviceMountPath string) error { - glog.V(4).Info(log("attacher.UnmountDevice(%s)", deviceMountPath)) - - // Setup - driverName, volID, err := getDriverAndVolNameFromDeviceMountPath(c.k8s, deviceMountPath) - if err != nil { - glog.Errorf(log("attacher.UnmountDevice failed to get driver and volume name from device mount path: %v", err)) - return err - } - - if c.csiClient == nil { - c.csiClient = newCsiDriverClient(driverName) - } - csi := c.csiClient - - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) - defer cancel() - // Check whether "STAGE_UNSTAGE_VOLUME" is set - stageUnstageSet, err := hasStageUnstageCapability(ctx, csi) - if err != nil { - glog.Errorf(log("attacher.UnmountDevice failed to check whether STAGE_UNSTAGE_VOLUME set: %v", err)) - return err - } - if !stageUnstageSet { - glog.Infof(log("attacher.UnmountDevice STAGE_UNSTAGE_VOLUME capability not set. Skipping UnmountDevice...")) - return nil - } - - // Start UnmountDevice - err = csi.NodeUnstageVolume(ctx, - volID, - deviceMountPath) - - if err != nil { - glog.Errorf(log("attacher.UnmountDevice failed: %v", err)) - return err - } - - glog.V(4).Infof(log("attacher.UnmountDevice successfully requested NodeStageVolume [%s]", deviceMountPath)) - return nil -} - -func hasStageUnstageCapability(ctx context.Context, csi csiClient) (bool, error) { - capabilities, err := csi.NodeGetCapabilities(ctx) - if err != nil { - return false, err - } - - stageUnstageSet := false - if capabilities == nil { - return false, nil - } - for _, capability := range capabilities { - if capability.GetRpc().GetType() == csipb.NodeServiceCapability_RPC_STAGE_UNSTAGE_VOLUME { - stageUnstageSet = true - } - } - return stageUnstageSet, nil -} - -// getAttachmentName returns csi- -func getAttachmentName(volName, csiDriverName, nodeName string) string { - result := sha256.Sum256([]byte(fmt.Sprintf("%s%s%s", volName, csiDriverName, nodeName))) - return fmt.Sprintf("csi-%x", result) -} - -func makeDeviceMountPath(plugin *csiPlugin, spec *volume.Spec) (string, error) { - if spec == nil { - return "", fmt.Errorf("makeDeviceMountPath failed, spec is nil") - } - - pvName := spec.PersistentVolume.Name - if pvName == "" { - return "", fmt.Errorf("makeDeviceMountPath failed, pv name empty") - } - - return path.Join(plugin.host.GetPluginDir(plugin.GetPluginName()), persistentVolumeInGlobalPath, pvName, globalMountInGlobalPath), nil -} - -func getDriverAndVolNameFromDeviceMountPath(k8s kubernetes.Interface, deviceMountPath string) (string, string, error) { - // deviceMountPath structure: /var/lib/kubelet/plugins/kubernetes.io/csi/pv/{pvname}/globalmount - dir := filepath.Dir(deviceMountPath) - if file := filepath.Base(deviceMountPath); file != globalMountInGlobalPath { - return "", "", fmt.Errorf("getDriverAndVolNameFromDeviceMountPath failed, path did not end in %s", globalMountInGlobalPath) - } - // dir is now /var/lib/kubelet/plugins/kubernetes.io/csi/pv/{pvname} - pvName := filepath.Base(dir) - - // Get PV and check for errors - pv, err := k8s.CoreV1().PersistentVolumes().Get(pvName, meta.GetOptions{}) - if err != nil { - return "", "", err - } - if pv == nil || pv.Spec.CSI == nil { - return "", "", fmt.Errorf("getDriverAndVolNameFromDeviceMountPath could not find CSI Persistent Volume Source for pv: %s", pvName) - } - - // Get VolumeHandle and PluginName from pv - csiSource := pv.Spec.CSI - if csiSource.Driver == "" { - return "", "", fmt.Errorf("getDriverAndVolNameFromDeviceMountPath failed, driver name empty") - } - if csiSource.VolumeHandle == "" { - return "", "", fmt.Errorf("getDriverAndVolNameFromDeviceMountPath failed, VolumeHandle empty") - } - - return csiSource.Driver, csiSource.VolumeHandle, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go deleted file mode 100644 index 502747d2..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go +++ /dev/null @@ -1,283 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 csi - -import ( - "context" - "errors" - "fmt" - "os" - "path/filepath" - - "github.com/golang/glog" - - "k8s.io/api/core/v1" - meta "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/volume" -) - -type csiBlockMapper struct { - k8s kubernetes.Interface - csiClient csiClient - plugin *csiPlugin - driverName string - specName string - volumeID string - readOnly bool - spec *volume.Spec - podUID types.UID - volumeInfo map[string]string -} - -var _ volume.BlockVolumeMapper = &csiBlockMapper{} - -// GetGlobalMapPath returns a path (on the node) where the devicePath will be symlinked to -// Example: plugins/kubernetes.io/csi/volumeDevices/{volumeID} -func (m *csiBlockMapper) GetGlobalMapPath(spec *volume.Spec) (string, error) { - dir := getVolumeDevicePluginDir(spec.Name(), m.plugin.host) - glog.V(4).Infof(log("blockMapper.GetGlobalMapPath = %s", dir)) - return dir, nil -} - -// GetPodDeviceMapPath returns pod's device map path and volume name -// path: pods/{podUid}/volumeDevices/kubernetes.io~csi/, {volumeID} -func (m *csiBlockMapper) GetPodDeviceMapPath() (string, string) { - path, specName := m.plugin.host.GetPodVolumeDeviceDir(m.podUID, csiPluginName), m.specName - glog.V(4).Infof(log("blockMapper.GetPodDeviceMapPath = %s", path)) - return path, specName -} - -// SetUpDevice ensures the device is attached returns path where the device is located. -func (m *csiBlockMapper) SetUpDevice() (string, error) { - if !m.plugin.blockEnabled { - return "", errors.New("CSIBlockVolume feature not enabled") - } - - glog.V(4).Infof(log("blockMapper.SetupDevice called")) - - if m.spec == nil { - glog.Error(log("blockMapper.Map spec is nil")) - return "", fmt.Errorf("spec is nil") - } - csiSource, err := getCSISourceFromSpec(m.spec) - if err != nil { - glog.Error(log("blockMapper.SetupDevice failed to get CSI persistent source: %v", err)) - return "", err - } - - globalMapPath, err := m.GetGlobalMapPath(m.spec) - if err != nil { - glog.Error(log("blockMapper.SetupDevice failed to get global map path: %v", err)) - return "", err - } - - csi := m.csiClient - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) - defer cancel() - - // Check whether "STAGE_UNSTAGE_VOLUME" is set - stageUnstageSet, err := hasStageUnstageCapability(ctx, csi) - if err != nil { - glog.Error(log("blockMapper.SetupDevice failed to check STAGE_UNSTAGE_VOLUME capability: %v", err)) - return "", err - } - if !stageUnstageSet { - glog.Infof(log("blockMapper.SetupDevice STAGE_UNSTAGE_VOLUME capability not set. Skipping MountDevice...")) - return "", nil - } - - // Start MountDevice - nodeName := string(m.plugin.host.GetNodeName()) - attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, nodeName) - - // search for attachment by VolumeAttachment.Spec.Source.PersistentVolumeName - attachment, err := m.k8s.StorageV1beta1().VolumeAttachments().Get(attachID, meta.GetOptions{}) - if err != nil { - glog.Error(log("blockMapper.SetupDevice failed to get volume attachment [id=%v]: %v", attachID, err)) - return "", err - } - - if attachment == nil { - glog.Error(log("blockMapper.SetupDevice unable to find VolumeAttachment [id=%s]", attachID)) - return "", errors.New("no existing VolumeAttachment found") - } - publishVolumeInfo := attachment.Status.AttachmentMetadata - - nodeStageSecrets := map[string]string{} - if csiSource.NodeStageSecretRef != nil { - nodeStageSecrets, err = getCredentialsFromSecret(m.k8s, csiSource.NodeStageSecretRef) - if err != nil { - return "", fmt.Errorf("failed to get NodeStageSecretRef %s/%s: %v", - csiSource.NodeStageSecretRef.Namespace, csiSource.NodeStageSecretRef.Name, err) - } - } - - // create globalMapPath before call to NodeStageVolume - if err := os.MkdirAll(globalMapPath, 0750); err != nil { - glog.Error(log("blockMapper.SetupDevice failed to create dir %s: %v", globalMapPath, err)) - return "", err - } - glog.V(4).Info(log("blockMapper.SetupDevice created global device map path successfully [%s]", globalMapPath)) - - //TODO (vladimirvivien) implement better AccessModes mapping between k8s and CSI - accessMode := v1.ReadWriteOnce - if m.spec.PersistentVolume.Spec.AccessModes != nil { - accessMode = m.spec.PersistentVolume.Spec.AccessModes[0] - } - - err = csi.NodeStageVolume(ctx, - csiSource.VolumeHandle, - publishVolumeInfo, - globalMapPath, - fsTypeBlockName, - accessMode, - nodeStageSecrets, - csiSource.VolumeAttributes) - - if err != nil { - glog.Error(log("blockMapper.SetupDevice failed: %v", err)) - if err := os.RemoveAll(globalMapPath); err != nil { - glog.Error(log("blockMapper.SetupDevice failed to remove dir after a NodeStageVolume() error [%s]: %v", globalMapPath, err)) - } - return "", err - } - - glog.V(4).Infof(log("blockMapper.SetupDevice successfully requested NodeStageVolume [%s]", globalMapPath)) - return globalMapPath, nil -} - -func (m *csiBlockMapper) MapDevice(devicePath, globalMapPath, volumeMapPath, volumeMapName string, podUID types.UID) error { - if !m.plugin.blockEnabled { - return errors.New("CSIBlockVolume feature not enabled") - } - - glog.V(4).Infof(log("blockMapper.MapDevice mapping block device %s", devicePath)) - - if m.spec == nil { - glog.Error(log("blockMapper.MapDevice spec is nil")) - return fmt.Errorf("spec is nil") - } - - csiSource, err := getCSISourceFromSpec(m.spec) - if err != nil { - glog.Error(log("blockMapper.Map failed to get CSI persistent source: %v", err)) - return err - } - - dir := filepath.Join(volumeMapPath, volumeMapName) - csi := m.csiClient - - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) - defer cancel() - - nodeName := string(m.plugin.host.GetNodeName()) - attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, nodeName) - - // search for attachment by VolumeAttachment.Spec.Source.PersistentVolumeName - attachment, err := m.k8s.StorageV1beta1().VolumeAttachments().Get(attachID, meta.GetOptions{}) - if err != nil { - glog.Error(log("blockMapper.MapDevice failed to get volume attachment [id=%v]: %v", attachID, err)) - return err - } - - if attachment == nil { - glog.Error(log("blockMapper.MapDevice unable to find VolumeAttachment [id=%s]", attachID)) - return errors.New("no existing VolumeAttachment found") - } - publishVolumeInfo := attachment.Status.AttachmentMetadata - - nodePublishSecrets := map[string]string{} - if csiSource.NodePublishSecretRef != nil { - nodePublishSecrets, err = getCredentialsFromSecret(m.k8s, csiSource.NodePublishSecretRef) - if err != nil { - glog.Errorf("blockMapper.MapDevice failed to get NodePublishSecretRef %s/%s: %v", - csiSource.NodePublishSecretRef.Namespace, csiSource.NodePublishSecretRef.Name, err) - return err - } - } - - if err := os.MkdirAll(dir, 0750); err != nil { - glog.Error(log("blockMapper.MapDevice failed to create dir %#v: %v", dir, err)) - return err - } - glog.V(4).Info(log("blockMapper.MapDevice created NodePublish path [%s]", dir)) - - //TODO (vladimirvivien) implement better AccessModes mapping between k8s and CSI - accessMode := v1.ReadWriteOnce - if m.spec.PersistentVolume.Spec.AccessModes != nil { - accessMode = m.spec.PersistentVolume.Spec.AccessModes[0] - } - - err = csi.NodePublishVolume( - ctx, - m.volumeID, - m.readOnly, - globalMapPath, - dir, - accessMode, - publishVolumeInfo, - csiSource.VolumeAttributes, - nodePublishSecrets, - fsTypeBlockName, - ) - - if err != nil { - glog.Errorf(log("blockMapper.MapDevice failed: %v", err)) - if err := os.RemoveAll(dir); err != nil { - glog.Error(log("blockMapper.MapDevice failed to remove mount dir after a NodePublish() error [%s]: %v", dir, err)) - } - return err - } - - return nil -} - -var _ volume.BlockVolumeUnmapper = &csiBlockMapper{} - -// TearDownDevice removes traces of the SetUpDevice. -func (m *csiBlockMapper) TearDownDevice(globalMapPath, devicePath string) error { - if !m.plugin.blockEnabled { - return errors.New("CSIBlockVolume feature not enabled") - } - - glog.V(4).Infof(log("unmapper.TearDownDevice(globalMapPath=%s; devicePath=%s)", globalMapPath, devicePath)) - - csi := m.csiClient - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) - defer cancel() - - // unmap global device map path - if err := csi.NodeUnstageVolume(ctx, m.volumeID, globalMapPath); err != nil { - glog.Errorf(log("blockMapper.TearDownDevice failed: %v", err)) - return err - } - glog.V(4).Infof(log("blockMapper.TearDownDevice NodeUnstageVolume successfully [%s]", globalMapPath)) - - // request to remove pod volume map path also - podVolumePath, volumeName := m.GetPodDeviceMapPath() - podVolumeMapPath := filepath.Join(podVolumePath, volumeName) - if err := csi.NodeUnpublishVolume(ctx, m.volumeID, podVolumeMapPath); err != nil { - glog.Error(log("blockMapper.TearDownDevice failed: %v", err)) - return err - } - - glog.V(4).Infof(log("blockMapper.TearDownDevice NodeUnpublished successfully [%s]", podVolumeMapPath)) - - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go deleted file mode 100644 index e12772d7..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 csi - -import ( - "context" - "errors" - "fmt" - "net" - "time" - - csipb "github.com/container-storage-interface/spec/lib/go/csi/v0" - "github.com/golang/glog" - "google.golang.org/grpc" - api "k8s.io/api/core/v1" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" -) - -type csiClient interface { - NodePublishVolume( - ctx context.Context, - volumeid string, - readOnly bool, - stagingTargetPath string, - targetPath string, - accessMode api.PersistentVolumeAccessMode, - volumeInfo map[string]string, - volumeAttribs map[string]string, - nodePublishSecrets map[string]string, - fsType string, - ) error - NodeUnpublishVolume( - ctx context.Context, - volID string, - targetPath string, - ) error - NodeStageVolume(ctx context.Context, - volID string, - publishVolumeInfo map[string]string, - stagingTargetPath string, - fsType string, - accessMode api.PersistentVolumeAccessMode, - nodeStageSecrets map[string]string, - volumeAttribs map[string]string, - ) error - NodeUnstageVolume(ctx context.Context, volID, stagingTargetPath string) error - NodeGetCapabilities(ctx context.Context) ([]*csipb.NodeServiceCapability, error) -} - -// csiClient encapsulates all csi-plugin methods -type csiDriverClient struct { - driverName string - nodeClient csipb.NodeClient -} - -var _ csiClient = &csiDriverClient{} - -func newCsiDriverClient(driverName string) *csiDriverClient { - c := &csiDriverClient{driverName: driverName} - return c -} - -func (c *csiDriverClient) NodePublishVolume( - ctx context.Context, - volID string, - readOnly bool, - stagingTargetPath string, - targetPath string, - accessMode api.PersistentVolumeAccessMode, - volumeInfo map[string]string, - volumeAttribs map[string]string, - nodePublishSecrets map[string]string, - fsType string, -) error { - glog.V(4).Info(log("calling NodePublishVolume rpc [volid=%s,target_path=%s]", volID, targetPath)) - if volID == "" { - return errors.New("missing volume id") - } - if targetPath == "" { - return errors.New("missing target path") - } - - conn, err := newGrpcConn(c.driverName) - if err != nil { - return err - } - defer conn.Close() - nodeClient := csipb.NewNodeClient(conn) - - req := &csipb.NodePublishVolumeRequest{ - VolumeId: volID, - TargetPath: targetPath, - Readonly: readOnly, - PublishInfo: volumeInfo, - VolumeAttributes: volumeAttribs, - NodePublishSecrets: nodePublishSecrets, - VolumeCapability: &csipb.VolumeCapability{ - AccessMode: &csipb.VolumeCapability_AccessMode{ - Mode: asCSIAccessMode(accessMode), - }, - }, - } - if stagingTargetPath != "" { - req.StagingTargetPath = stagingTargetPath - } - - if fsType == fsTypeBlockName { - req.VolumeCapability.AccessType = &csipb.VolumeCapability_Block{ - Block: &csipb.VolumeCapability_BlockVolume{}, - } - } else { - req.VolumeCapability.AccessType = &csipb.VolumeCapability_Mount{ - Mount: &csipb.VolumeCapability_MountVolume{ - FsType: fsType, - }, - } - } - - _, err = nodeClient.NodePublishVolume(ctx, req) - return err -} - -func (c *csiDriverClient) NodeUnpublishVolume(ctx context.Context, volID string, targetPath string) error { - glog.V(4).Info(log("calling NodeUnpublishVolume rpc: [volid=%s, target_path=%s", volID, targetPath)) - if volID == "" { - return errors.New("missing volume id") - } - if targetPath == "" { - return errors.New("missing target path") - } - - conn, err := newGrpcConn(c.driverName) - if err != nil { - return err - } - defer conn.Close() - nodeClient := csipb.NewNodeClient(conn) - - req := &csipb.NodeUnpublishVolumeRequest{ - VolumeId: volID, - TargetPath: targetPath, - } - - _, err = nodeClient.NodeUnpublishVolume(ctx, req) - return err -} - -func (c *csiDriverClient) NodeStageVolume(ctx context.Context, - volID string, - publishInfo map[string]string, - stagingTargetPath string, - fsType string, - accessMode api.PersistentVolumeAccessMode, - nodeStageSecrets map[string]string, - volumeAttribs map[string]string, -) error { - glog.V(4).Info(log("calling NodeStageVolume rpc [volid=%s,staging_target_path=%s]", volID, stagingTargetPath)) - if volID == "" { - return errors.New("missing volume id") - } - if stagingTargetPath == "" { - return errors.New("missing staging target path") - } - - conn, err := newGrpcConn(c.driverName) - if err != nil { - return err - } - defer conn.Close() - nodeClient := csipb.NewNodeClient(conn) - - req := &csipb.NodeStageVolumeRequest{ - VolumeId: volID, - PublishInfo: publishInfo, - StagingTargetPath: stagingTargetPath, - VolumeCapability: &csipb.VolumeCapability{ - AccessMode: &csipb.VolumeCapability_AccessMode{ - Mode: asCSIAccessMode(accessMode), - }, - }, - NodeStageSecrets: nodeStageSecrets, - VolumeAttributes: volumeAttribs, - } - - if fsType == fsTypeBlockName { - req.VolumeCapability.AccessType = &csipb.VolumeCapability_Block{ - Block: &csipb.VolumeCapability_BlockVolume{}, - } - } else { - req.VolumeCapability.AccessType = &csipb.VolumeCapability_Mount{ - Mount: &csipb.VolumeCapability_MountVolume{ - FsType: fsType, - }, - } - } - - _, err = nodeClient.NodeStageVolume(ctx, req) - return err -} - -func (c *csiDriverClient) NodeUnstageVolume(ctx context.Context, volID, stagingTargetPath string) error { - glog.V(4).Info(log("calling NodeUnstageVolume rpc [volid=%s,staging_target_path=%s]", volID, stagingTargetPath)) - if volID == "" { - return errors.New("missing volume id") - } - if stagingTargetPath == "" { - return errors.New("missing staging target path") - } - - conn, err := newGrpcConn(c.driverName) - if err != nil { - return err - } - defer conn.Close() - nodeClient := csipb.NewNodeClient(conn) - - req := &csipb.NodeUnstageVolumeRequest{ - VolumeId: volID, - StagingTargetPath: stagingTargetPath, - } - _, err = nodeClient.NodeUnstageVolume(ctx, req) - return err -} - -func (c *csiDriverClient) NodeGetCapabilities(ctx context.Context) ([]*csipb.NodeServiceCapability, error) { - glog.V(4).Info(log("calling NodeGetCapabilities rpc")) - - conn, err := newGrpcConn(c.driverName) - if err != nil { - return nil, err - } - defer conn.Close() - nodeClient := csipb.NewNodeClient(conn) - - req := &csipb.NodeGetCapabilitiesRequest{} - resp, err := nodeClient.NodeGetCapabilities(ctx, req) - if err != nil { - return nil, err - } - return resp.GetCapabilities(), nil -} - -func asCSIAccessMode(am api.PersistentVolumeAccessMode) csipb.VolumeCapability_AccessMode_Mode { - switch am { - case api.ReadWriteOnce: - return csipb.VolumeCapability_AccessMode_SINGLE_NODE_WRITER - case api.ReadOnlyMany: - return csipb.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY - case api.ReadWriteMany: - return csipb.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER - } - return csipb.VolumeCapability_AccessMode_UNKNOWN -} - -func newGrpcConn(driverName string) (*grpc.ClientConn, error) { - if driverName == "" { - return nil, fmt.Errorf("driver name is empty") - } - addr := fmt.Sprintf(csiAddrTemplate, driverName) - // TODO once KubeletPluginsWatcher graduates to beta, remove FeatureGate check - if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPluginsWatcher) { - driver, ok := csiDrivers.driversMap[driverName] - if !ok { - return nil, fmt.Errorf("driver name %s not found in the list of registered CSI drivers", driverName) - } - addr = driver.driverEndpoint - } - network := "unix" - glog.V(4).Infof(log("creating new gRPC connection for [%s://%s]", network, addr)) - - return grpc.Dial( - addr, - grpc.WithInsecure(), - grpc.WithDialer(func(target string, timeout time.Duration) (net.Conn, error) { - return net.Dial(network, target) - }), - ) -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go deleted file mode 100644 index b6d86956..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_mounter.go +++ /dev/null @@ -1,346 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 csi - -import ( - "context" - "errors" - "fmt" - "os" - "path" - - "github.com/golang/glog" - - api "k8s.io/api/core/v1" - meta "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes" - kstrings "k8s.io/kubernetes/pkg/util/strings" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" -) - -const defaultFSType = "ext4" - -//TODO (vladimirvivien) move this in a central loc later -var ( - volDataKey = struct { - specVolID, - volHandle, - driverName, - nodeName, - attachmentID string - }{ - "specVolID", - "volumeHandle", - "driverName", - "nodeName", - "attachmentID", - } -) - -type csiMountMgr struct { - csiClient csiClient - k8s kubernetes.Interface - plugin *csiPlugin - driverName string - volumeID string - specVolumeID string - readOnly bool - spec *volume.Spec - pod *api.Pod - podUID types.UID - options volume.VolumeOptions - volumeInfo map[string]string - volume.MetricsNil -} - -// volume.Volume methods -var _ volume.Volume = &csiMountMgr{} - -func (c *csiMountMgr) GetPath() string { - dir := path.Join(getTargetPath(c.podUID, c.specVolumeID, c.plugin.host), "/mount") - glog.V(4).Info(log("mounter.GetPath generated [%s]", dir)) - return dir -} - -func getTargetPath(uid types.UID, specVolumeID string, host volume.VolumeHost) string { - specVolID := kstrings.EscapeQualifiedNameForDisk(specVolumeID) - return host.GetPodVolumeDir(uid, kstrings.EscapeQualifiedNameForDisk(csiPluginName), specVolID) -} - -// volume.Mounter methods -var _ volume.Mounter = &csiMountMgr{} - -func (c *csiMountMgr) CanMount() error { - return nil -} - -func (c *csiMountMgr) SetUp(fsGroup *int64) error { - return c.SetUpAt(c.GetPath(), fsGroup) -} - -func (c *csiMountMgr) SetUpAt(dir string, fsGroup *int64) error { - glog.V(4).Infof(log("Mounter.SetUpAt(%s)", dir)) - - mounted, err := isDirMounted(c.plugin, dir) - if err != nil { - glog.Error(log("mounter.SetUpAt failed while checking mount status for dir [%s]", dir)) - return err - } - - if mounted { - glog.V(4).Info(log("mounter.SetUpAt skipping mount, dir already mounted [%s]", dir)) - return nil - } - - csiSource, err := getCSISourceFromSpec(c.spec) - if err != nil { - glog.Error(log("mounter.SetupAt failed to get CSI persistent source: %v", err)) - return err - } - - csi := c.csiClient - nodeName := string(c.plugin.host.GetNodeName()) - attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, nodeName) - - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) - defer cancel() - - // Check for STAGE_UNSTAGE_VOLUME set and populate deviceMountPath if so - deviceMountPath := "" - stageUnstageSet, err := hasStageUnstageCapability(ctx, csi) - if err != nil { - glog.Error(log("mounter.SetUpAt failed to check for STAGE_UNSTAGE_VOLUME capabilty: %v", err)) - return err - } - - if stageUnstageSet { - deviceMountPath, err = makeDeviceMountPath(c.plugin, c.spec) - if err != nil { - glog.Error(log("mounter.SetUpAt failed to make device mount path: %v", err)) - return err - } - } - - // search for attachment by VolumeAttachment.Spec.Source.PersistentVolumeName - if c.volumeInfo == nil { - attachment, err := c.k8s.StorageV1beta1().VolumeAttachments().Get(attachID, meta.GetOptions{}) - if err != nil { - glog.Error(log("mounter.SetupAt failed while getting volume attachment [id=%v]: %v", attachID, err)) - return err - } - - if attachment == nil { - glog.Error(log("unable to find VolumeAttachment [id=%s]", attachID)) - return errors.New("no existing VolumeAttachment found") - } - c.volumeInfo = attachment.Status.AttachmentMetadata - } - - attribs := csiSource.VolumeAttributes - - nodePublishSecrets := map[string]string{} - if csiSource.NodePublishSecretRef != nil { - nodePublishSecrets, err = getCredentialsFromSecret(c.k8s, csiSource.NodePublishSecretRef) - if err != nil { - return fmt.Errorf("fetching NodePublishSecretRef %s/%s failed: %v", - csiSource.NodePublishSecretRef.Namespace, csiSource.NodePublishSecretRef.Name, err) - } - } - - // create target_dir before call to NodePublish - if err := os.MkdirAll(dir, 0750); err != nil { - glog.Error(log("mouter.SetUpAt failed to create dir %#v: %v", dir, err)) - return err - } - glog.V(4).Info(log("created target path successfully [%s]", dir)) - - //TODO (vladimirvivien) implement better AccessModes mapping between k8s and CSI - accessMode := api.ReadWriteOnce - if c.spec.PersistentVolume.Spec.AccessModes != nil { - accessMode = c.spec.PersistentVolume.Spec.AccessModes[0] - } - - fsType := csiSource.FSType - if len(fsType) == 0 { - fsType = defaultFSType - } - err = csi.NodePublishVolume( - ctx, - c.volumeID, - c.readOnly, - deviceMountPath, - dir, - accessMode, - c.volumeInfo, - attribs, - nodePublishSecrets, - fsType, - ) - - if err != nil { - glog.Errorf(log("mounter.SetupAt failed: %v", err)) - if removeMountDirErr := removeMountDir(c.plugin, dir); removeMountDirErr != nil { - glog.Error(log("mounter.SetupAt failed to remove mount dir after a NodePublish() error [%s]: %v", dir, removeMountDirErr)) - } - return err - } - - // apply volume ownership - if !c.readOnly && fsGroup != nil { - err := volume.SetVolumeOwnership(c, fsGroup) - if err != nil { - // attempt to rollback mount. - glog.Error(log("mounter.SetupAt failed to set fsgroup volume ownership for [%s]: %v", c.volumeID, err)) - glog.V(4).Info(log("mounter.SetupAt attempting to unpublish volume %s due to previous error", c.volumeID)) - if unpubErr := csi.NodeUnpublishVolume(ctx, c.volumeID, dir); unpubErr != nil { - glog.Error(log( - "mounter.SetupAt failed to unpublish volume [%s]: %v (caused by previous NodePublish error: %v)", - c.volumeID, unpubErr, err, - )) - return fmt.Errorf("%v (caused by %v)", unpubErr, err) - } - - if unmountErr := removeMountDir(c.plugin, dir); unmountErr != nil { - glog.Error(log( - "mounter.SetupAt failed to clean mount dir [%s]: %v (caused by previous NodePublish error: %v)", - dir, unmountErr, err, - )) - return fmt.Errorf("%v (caused by %v)", unmountErr, err) - } - - return err - } - glog.V(4).Info(log("mounter.SetupAt sets fsGroup to [%d] for %s", *fsGroup, c.volumeID)) - } - - glog.V(4).Infof(log("mounter.SetUp successfully requested NodePublish [%s]", dir)) - return nil -} - -func (c *csiMountMgr) GetAttributes() volume.Attributes { - mounter := c.plugin.host.GetMounter(c.plugin.GetPluginName()) - path := c.GetPath() - supportSelinux, err := mounter.GetSELinuxSupport(path) - if err != nil { - glog.V(2).Info(log("error checking for SELinux support: %s", err)) - // Best guess - supportSelinux = false - } - return volume.Attributes{ - ReadOnly: c.readOnly, - Managed: !c.readOnly, - SupportsSELinux: supportSelinux, - } -} - -// volume.Unmounter methods -var _ volume.Unmounter = &csiMountMgr{} - -func (c *csiMountMgr) TearDown() error { - return c.TearDownAt(c.GetPath()) -} -func (c *csiMountMgr) TearDownAt(dir string) error { - glog.V(4).Infof(log("Unmounter.TearDown(%s)", dir)) - - // is dir even mounted ? - // TODO (vladimirvivien) this check may not work for an emptyDir or local storage - // see https://github.com/kubernetes/kubernetes/pull/56836#discussion_r155834524 - mounted, err := isDirMounted(c.plugin, dir) - if err != nil { - glog.Error(log("unmounter.Teardown failed while checking mount status for dir [%s]: %v", dir, err)) - return err - } - - if !mounted { - glog.V(4).Info(log("unmounter.Teardown skipping unmount, dir not mounted [%s]", dir)) - return nil - } - - volID := c.volumeID - csi := c.csiClient - - ctx, cancel := context.WithTimeout(context.Background(), csiTimeout) - defer cancel() - - if err := csi.NodeUnpublishVolume(ctx, volID, dir); err != nil { - glog.Errorf(log("mounter.TearDownAt failed: %v", err)) - return err - } - - // clean mount point dir - if err := removeMountDir(c.plugin, dir); err != nil { - glog.Error(log("mounter.TearDownAt failed to clean mount dir [%s]: %v", dir, err)) - return err - } - glog.V(4).Infof(log("mounte.TearDownAt successfully unmounted dir [%s]", dir)) - - return nil -} - -// isDirMounted returns the !notMounted result from IsLikelyNotMountPoint check -func isDirMounted(plug *csiPlugin, dir string) (bool, error) { - mounter := plug.host.GetMounter(plug.GetPluginName()) - notMnt, err := mounter.IsLikelyNotMountPoint(dir) - if err != nil && !os.IsNotExist(err) { - glog.Error(log("isDirMounted IsLikelyNotMountPoint test failed for dir [%v]", dir)) - return false, err - } - return !notMnt, nil -} - -// removeMountDir cleans the mount dir when dir is not mounted and removed the volume data file in dir -func removeMountDir(plug *csiPlugin, mountPath string) error { - glog.V(4).Info(log("removing mount path [%s]", mountPath)) - if pathExists, pathErr := util.PathExists(mountPath); pathErr != nil { - glog.Error(log("failed while checking mount path stat [%s]", pathErr)) - return pathErr - } else if !pathExists { - glog.Warning(log("skipping mount dir removal, path does not exist [%v]", mountPath)) - return nil - } - - mounter := plug.host.GetMounter(plug.GetPluginName()) - notMnt, err := mounter.IsLikelyNotMountPoint(mountPath) - if err != nil { - glog.Error(log("mount dir removal failed [%s]: %v", mountPath, err)) - return err - } - if notMnt { - glog.V(4).Info(log("dir not mounted, deleting it [%s]", mountPath)) - if err := os.Remove(mountPath); err != nil && !os.IsNotExist(err) { - glog.Error(log("failed to remove dir [%s]: %v", mountPath, err)) - return err - } - // remove volume data file as well - volPath := path.Dir(mountPath) - dataFile := path.Join(volPath, volDataFileName) - glog.V(4).Info(log("also deleting volume info data file [%s]", dataFile)) - if err := os.Remove(dataFile); err != nil && !os.IsNotExist(err) { - glog.Error(log("failed to delete volume data file [%s]: %v", dataFile, err)) - return err - } - // remove volume path - glog.V(4).Info(log("deleting volume path [%s]", volPath)) - if err := os.Remove(volPath); err != nil && !os.IsNotExist(err) { - glog.Error(log("failed to delete volume path [%s]: %v", volPath, err)) - return err - } - } - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go deleted file mode 100644 index d1045768..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_plugin.go +++ /dev/null @@ -1,443 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 csi - -import ( - "errors" - "fmt" - "os" - "path" - "strings" - "sync" - "time" - - "github.com/golang/glog" - api "k8s.io/api/core/v1" - meta "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - utilfeature "k8s.io/apiserver/pkg/util/feature" - "k8s.io/kubernetes/pkg/features" - "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/csi/labelmanager" -) - -const ( - csiPluginName = "kubernetes.io/csi" - - // TODO (vladimirvivien) implement a more dynamic way to discover - // the unix domain socket path for each installed csi driver. - // TODO (vladimirvivien) would be nice to name socket with a .sock extension - // for consistency. - csiAddrTemplate = "/var/lib/kubelet/plugins/%v/csi.sock" - csiTimeout = 15 * time.Second - volNameSep = "^" - volDataFileName = "vol_data.json" - fsTypeBlockName = "block" -) - -type csiPlugin struct { - host volume.VolumeHost - blockEnabled bool -} - -// ProbeVolumePlugins returns implemented plugins -func ProbeVolumePlugins() []volume.VolumePlugin { - p := &csiPlugin{ - host: nil, - blockEnabled: utilfeature.DefaultFeatureGate.Enabled(features.CSIBlockVolume), - } - return []volume.VolumePlugin{p} -} - -// volume.VolumePlugin methods -var _ volume.VolumePlugin = &csiPlugin{} - -type csiDriver struct { - driverName string - driverEndpoint string -} - -type csiDriversStore struct { - driversMap map[string]csiDriver - sync.RWMutex -} - -// csiDrivers map keep track of all registered CSI drivers on the node and their -// corresponding sockets -var csiDrivers csiDriversStore - -var lm labelmanager.Interface - -// RegistrationCallback is called by kubelet's plugin watcher upon detection -// of a new registration socket opened by CSI Driver registrar side car. -func RegistrationCallback(pluginName string, endpoint string, versions []string, socketPath string) (error, chan bool) { - - glog.Infof(log("Callback from kubelet with plugin name: %s endpoint: %s versions: %s socket path: %s", - pluginName, endpoint, strings.Join(versions, ","), socketPath)) - - if endpoint == "" { - endpoint = socketPath - } - // Calling nodeLabelManager to update label for newly registered CSI driver - err := lm.AddLabels(pluginName) - if err != nil { - return err, nil - } - // Storing endpoint of newly registered CSI driver into the map, where CSI driver name will be the key - // all other CSI components will be able to get the actual socket of CSI drivers by its name. - csiDrivers.Lock() - defer csiDrivers.Unlock() - csiDrivers.driversMap[pluginName] = csiDriver{driverName: pluginName, driverEndpoint: endpoint} - - return nil, nil -} - -func (p *csiPlugin) Init(host volume.VolumeHost) error { - glog.Info(log("plugin initializing...")) - p.host = host - - // Initializing csiDrivers map and label management channels - csiDrivers = csiDriversStore{driversMap: map[string]csiDriver{}} - lm = labelmanager.NewLabelManager(host.GetNodeName(), host.GetKubeClient()) - - return nil -} - -func (p *csiPlugin) GetPluginName() string { - return csiPluginName -} - -// GetvolumeName returns a concatenated string of CSIVolumeSource.DriverCSIVolumeSource.VolumeHandle -// That string value is used in Detach() to extract driver name and volumeName. -func (p *csiPlugin) GetVolumeName(spec *volume.Spec) (string, error) { - csi, err := getCSISourceFromSpec(spec) - if err != nil { - glog.Error(log("plugin.GetVolumeName failed to extract volume source from spec: %v", err)) - return "", err - } - - // return driverNamevolumeHandle - return fmt.Sprintf("%s%s%s", csi.Driver, volNameSep, csi.VolumeHandle), nil -} - -func (p *csiPlugin) CanSupport(spec *volume.Spec) bool { - // TODO (vladimirvivien) CanSupport should also take into account - // the availability/registration of specified Driver in the volume source - return spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CSI != nil -} - -func (p *csiPlugin) RequiresRemount() bool { - return false -} - -func (p *csiPlugin) NewMounter( - spec *volume.Spec, - pod *api.Pod, - _ volume.VolumeOptions) (volume.Mounter, error) { - pvSource, err := getCSISourceFromSpec(spec) - if err != nil { - return nil, err - } - readOnly, err := getReadOnlyFromSpec(spec) - if err != nil { - return nil, err - } - - k8s := p.host.GetKubeClient() - if k8s == nil { - glog.Error(log("failed to get a kubernetes client")) - return nil, errors.New("failed to get a Kubernetes client") - } - - csi := newCsiDriverClient(pvSource.Driver) - - mounter := &csiMountMgr{ - plugin: p, - k8s: k8s, - spec: spec, - pod: pod, - podUID: pod.UID, - driverName: pvSource.Driver, - volumeID: pvSource.VolumeHandle, - specVolumeID: spec.Name(), - csiClient: csi, - readOnly: readOnly, - } - - // Save volume info in pod dir - dir := mounter.GetPath() - dataDir := path.Dir(dir) // dropoff /mount at end - - if err := os.MkdirAll(dataDir, 0750); err != nil { - glog.Error(log("failed to create dir %#v: %v", dataDir, err)) - return nil, err - } - glog.V(4).Info(log("created path successfully [%s]", dataDir)) - - // persist volume info data for teardown - node := string(p.host.GetNodeName()) - attachID := getAttachmentName(pvSource.VolumeHandle, pvSource.Driver, node) - volData := map[string]string{ - volDataKey.specVolID: spec.Name(), - volDataKey.volHandle: pvSource.VolumeHandle, - volDataKey.driverName: pvSource.Driver, - volDataKey.nodeName: node, - volDataKey.attachmentID: attachID, - } - - if err := saveVolumeData(dataDir, volDataFileName, volData); err != nil { - glog.Error(log("failed to save volume info data: %v", err)) - if err := os.RemoveAll(dataDir); err != nil { - glog.Error(log("failed to remove dir after error [%s]: %v", dataDir, err)) - return nil, err - } - return nil, err - } - - glog.V(4).Info(log("mounter created successfully")) - - return mounter, nil -} - -func (p *csiPlugin) NewUnmounter(specName string, podUID types.UID) (volume.Unmounter, error) { - glog.V(4).Infof(log("setting up unmounter for [name=%v, podUID=%v]", specName, podUID)) - - unmounter := &csiMountMgr{ - plugin: p, - podUID: podUID, - specVolumeID: specName, - } - - // load volume info from file - dir := unmounter.GetPath() - dataDir := path.Dir(dir) // dropoff /mount at end - data, err := loadVolumeData(dataDir, volDataFileName) - if err != nil { - glog.Error(log("unmounter failed to load volume data file [%s]: %v", dir, err)) - return nil, err - } - unmounter.driverName = data[volDataKey.driverName] - unmounter.volumeID = data[volDataKey.volHandle] - unmounter.csiClient = newCsiDriverClient(unmounter.driverName) - - return unmounter, nil -} - -func (p *csiPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { - glog.V(4).Info(log("plugin.ConstructVolumeSpec [pv.Name=%v, path=%v]", volumeName, mountPath)) - - volData, err := loadVolumeData(mountPath, volDataFileName) - if err != nil { - glog.Error(log("plugin.ConstructVolumeSpec failed loading volume data using [%s]: %v", mountPath, err)) - return nil, err - } - - glog.V(4).Info(log("plugin.ConstructVolumeSpec extracted [%#v]", volData)) - - pv := &api.PersistentVolume{ - ObjectMeta: meta.ObjectMeta{ - Name: volData[volDataKey.specVolID], - }, - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - CSI: &api.CSIPersistentVolumeSource{ - Driver: volData[volDataKey.driverName], - VolumeHandle: volData[volDataKey.volHandle], - }, - }, - }, - } - - return volume.NewSpecFromPersistentVolume(pv, false), nil -} - -func (p *csiPlugin) SupportsMountOption() bool { - // TODO (vladimirvivien) use CSI VolumeCapability.MountVolume.mount_flags - // to probe for the result for this method:w - return false -} - -func (p *csiPlugin) SupportsBulkVolumeVerification() bool { - return false -} - -// volume.AttachableVolumePlugin methods -var _ volume.AttachableVolumePlugin = &csiPlugin{} - -func (p *csiPlugin) NewAttacher() (volume.Attacher, error) { - k8s := p.host.GetKubeClient() - if k8s == nil { - glog.Error(log("unable to get kubernetes client from host")) - return nil, errors.New("unable to get Kubernetes client") - } - - return &csiAttacher{ - plugin: p, - k8s: k8s, - waitSleepTime: 1 * time.Second, - }, nil -} - -func (p *csiPlugin) NewDetacher() (volume.Detacher, error) { - k8s := p.host.GetKubeClient() - if k8s == nil { - glog.Error(log("unable to get kubernetes client from host")) - return nil, errors.New("unable to get Kubernetes client") - } - - return &csiAttacher{ - plugin: p, - k8s: k8s, - waitSleepTime: 1 * time.Second, - }, nil -} - -func (p *csiPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) { - m := p.host.GetMounter(p.GetPluginName()) - return mount.GetMountRefs(m, deviceMountPath) -} - -// BlockVolumePlugin methods -var _ volume.BlockVolumePlugin = &csiPlugin{} - -func (p *csiPlugin) NewBlockVolumeMapper(spec *volume.Spec, podRef *api.Pod, opts volume.VolumeOptions) (volume.BlockVolumeMapper, error) { - if !p.blockEnabled { - return nil, errors.New("CSIBlockVolume feature not enabled") - } - - pvSource, err := getCSISourceFromSpec(spec) - if err != nil { - return nil, err - } - readOnly, err := getReadOnlyFromSpec(spec) - if err != nil { - return nil, err - } - - glog.V(4).Info(log("setting up block mapper for [volume=%v,driver=%v]", pvSource.VolumeHandle, pvSource.Driver)) - client := newCsiDriverClient(pvSource.Driver) - - k8s := p.host.GetKubeClient() - if k8s == nil { - glog.Error(log("failed to get a kubernetes client")) - return nil, errors.New("failed to get a Kubernetes client") - } - - mapper := &csiBlockMapper{ - csiClient: client, - k8s: k8s, - plugin: p, - volumeID: pvSource.VolumeHandle, - driverName: pvSource.Driver, - readOnly: readOnly, - spec: spec, - podUID: podRef.UID, - } - - // Save volume info in pod dir - dataDir := getVolumeDeviceDataDir(spec.Name(), p.host) - - if err := os.MkdirAll(dataDir, 0750); err != nil { - glog.Error(log("failed to create data dir %s: %v", dataDir, err)) - return nil, err - } - glog.V(4).Info(log("created path successfully [%s]", dataDir)) - - // persist volume info data for teardown - node := string(p.host.GetNodeName()) - attachID := getAttachmentName(pvSource.VolumeHandle, pvSource.Driver, node) - volData := map[string]string{ - volDataKey.specVolID: spec.Name(), - volDataKey.volHandle: pvSource.VolumeHandle, - volDataKey.driverName: pvSource.Driver, - volDataKey.nodeName: node, - volDataKey.attachmentID: attachID, - } - - if err := saveVolumeData(dataDir, volDataFileName, volData); err != nil { - glog.Error(log("failed to save volume info data: %v", err)) - if err := os.RemoveAll(dataDir); err != nil { - glog.Error(log("failed to remove dir after error [%s]: %v", dataDir, err)) - return nil, err - } - return nil, err - } - - return mapper, nil -} - -func (p *csiPlugin) NewBlockVolumeUnmapper(volName string, podUID types.UID) (volume.BlockVolumeUnmapper, error) { - if !p.blockEnabled { - return nil, errors.New("CSIBlockVolume feature not enabled") - } - - glog.V(4).Infof(log("setting up block unmapper for [Spec=%v, podUID=%v]", volName, podUID)) - unmapper := &csiBlockMapper{ - plugin: p, - podUID: podUID, - specName: volName, - } - - // load volume info from file - dataDir := getVolumeDeviceDataDir(unmapper.specName, p.host) - data, err := loadVolumeData(dataDir, volDataFileName) - if err != nil { - glog.Error(log("unmapper failed to load volume data file [%s]: %v", dataDir, err)) - return nil, err - } - unmapper.driverName = data[volDataKey.driverName] - unmapper.volumeID = data[volDataKey.volHandle] - unmapper.csiClient = newCsiDriverClient(unmapper.driverName) - - return unmapper, nil -} - -func (p *csiPlugin) ConstructBlockVolumeSpec(podUID types.UID, specVolName, mapPath string) (*volume.Spec, error) { - if !p.blockEnabled { - return nil, errors.New("CSIBlockVolume feature not enabled") - } - - glog.V(4).Infof("plugin.ConstructBlockVolumeSpec [podUID=%s, specVolName=%s, path=%s]", string(podUID), specVolName, mapPath) - - dataDir := getVolumeDeviceDataDir(specVolName, p.host) - volData, err := loadVolumeData(dataDir, volDataFileName) - if err != nil { - glog.Error(log("plugin.ConstructBlockVolumeSpec failed loading volume data using [%s]: %v", mapPath, err)) - return nil, err - } - - glog.V(4).Info(log("plugin.ConstructBlockVolumeSpec extracted [%#v]", volData)) - - blockMode := api.PersistentVolumeBlock - pv := &api.PersistentVolume{ - ObjectMeta: meta.ObjectMeta{ - Name: volData[volDataKey.specVolID], - }, - Spec: api.PersistentVolumeSpec{ - PersistentVolumeSource: api.PersistentVolumeSource{ - CSI: &api.CSIPersistentVolumeSource{ - Driver: volData[volDataKey.driverName], - VolumeHandle: volData[volDataKey.volHandle], - }, - }, - VolumeMode: &blockMode, - }, - } - - return volume.NewSpecFromPersistentVolume(pv, false), nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go deleted file mode 100644 index 6a0b6721..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_util.go +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 csi - -import ( - "encoding/json" - "fmt" - "os" - "path" - - "github.com/golang/glog" - api "k8s.io/api/core/v1" - meta "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" - kstrings "k8s.io/kubernetes/pkg/util/strings" - "k8s.io/kubernetes/pkg/volume" -) - -func getCredentialsFromSecret(k8s kubernetes.Interface, secretRef *api.SecretReference) (map[string]string, error) { - credentials := map[string]string{} - secret, err := k8s.CoreV1().Secrets(secretRef.Namespace).Get(secretRef.Name, meta.GetOptions{}) - if err != nil { - glog.Errorf("failed to find the secret %s in the namespace %s with error: %v\n", secretRef.Name, secretRef.Namespace, err) - return credentials, err - } - for key, value := range secret.Data { - credentials[key] = string(value) - } - - return credentials, nil -} - -// saveVolumeData persists parameter data as json file at the provided location -func saveVolumeData(dir string, fileName string, data map[string]string) error { - dataFilePath := path.Join(dir, fileName) - glog.V(4).Info(log("saving volume data file [%s]", dataFilePath)) - file, err := os.Create(dataFilePath) - if err != nil { - glog.Error(log("failed to save volume data file %s: %v", dataFilePath, err)) - return err - } - defer file.Close() - if err := json.NewEncoder(file).Encode(data); err != nil { - glog.Error(log("failed to save volume data file %s: %v", dataFilePath, err)) - return err - } - glog.V(4).Info(log("volume data file saved successfully [%s]", dataFilePath)) - return nil -} - -// loadVolumeData loads volume info from specified json file/location -func loadVolumeData(dir string, fileName string) (map[string]string, error) { - // remove /mount at the end - dataFileName := path.Join(dir, fileName) - glog.V(4).Info(log("loading volume data file [%s]", dataFileName)) - - file, err := os.Open(dataFileName) - if err != nil { - glog.Error(log("failed to open volume data file [%s]: %v", dataFileName, err)) - return nil, err - } - defer file.Close() - data := map[string]string{} - if err := json.NewDecoder(file).Decode(&data); err != nil { - glog.Error(log("failed to parse volume data file [%s]: %v", dataFileName, err)) - return nil, err - } - - return data, nil -} - -func getCSISourceFromSpec(spec *volume.Spec) (*api.CSIPersistentVolumeSource, error) { - if spec.PersistentVolume != nil && - spec.PersistentVolume.Spec.CSI != nil { - return spec.PersistentVolume.Spec.CSI, nil - } - - return nil, fmt.Errorf("CSIPersistentVolumeSource not defined in spec") -} - -func getReadOnlyFromSpec(spec *volume.Spec) (bool, error) { - if spec.PersistentVolume != nil && - spec.PersistentVolume.Spec.CSI != nil { - return spec.ReadOnly, nil - } - - return false, fmt.Errorf("CSIPersistentVolumeSource not defined in spec") -} - -// log prepends log string with `kubernetes.io/csi` -func log(msg string, parts ...interface{}) string { - return fmt.Sprintf(fmt.Sprintf("%s: %s", csiPluginName, msg), parts...) -} - -// getVolumeDevicePluginDir returns the path where the CSI plugin keeps the -// symlink for a block device associated with a given specVolumeID. -// path: plugins/kubernetes.io/csi/volumeDevices/{specVolumeID}/dev -func getVolumeDevicePluginDir(specVolID string, host volume.VolumeHost) string { - sanitizedSpecVolID := kstrings.EscapeQualifiedNameForDisk(specVolID) - return path.Join(host.GetVolumeDevicePluginDir(csiPluginName), sanitizedSpecVolID, "dev") -} - -// getVolumeDeviceDataDir returns the path where the CSI plugin keeps the -// volume data for a block device associated with a given specVolumeID. -// path: plugins/kubernetes.io/csi/volumeDevices/{specVolumeID}/data -func getVolumeDeviceDataDir(specVolID string, host volume.VolumeHost) string { - sanitizedSpecVolID := kstrings.EscapeQualifiedNameForDisk(specVolID) - return path.Join(host.GetVolumeDevicePluginDir(csiPluginName), sanitizedSpecVolID, "data") -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/BUILD deleted file mode 100644 index 1fed8335..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["labelmanager.go"], - importpath = "k8s.io/kubernetes/pkg/volume/csi/labelmanager", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/util/retry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/labelmanager.go b/vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/labelmanager.go deleted file mode 100644 index 162d7d3d..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/csi/labelmanager/labelmanager.go +++ /dev/null @@ -1,251 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 labelmanager includes internal functions used to add/delete labels to -// kubernetes nodes for corresponding CSI drivers -package labelmanager // import "k8s.io/kubernetes/pkg/volume/csi/labelmanager" - -import ( - "encoding/json" - "fmt" - - "github.com/golang/glog" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes" - corev1 "k8s.io/client-go/kubernetes/typed/core/v1" - "k8s.io/client-go/util/retry" -) - -const ( - // Name of node annotation that contains JSON map of driver names to node - // names - annotationKey = "csi.volume.kubernetes.io/nodeid" - csiPluginName = "kubernetes.io/csi" -) - -// labelManagementStruct is struct of channels used for communication between the driver registration -// code and the go routine responsible for managing the node's labels -type labelManagerStruct struct { - nodeName types.NodeName - k8s kubernetes.Interface -} - -// Interface implements an interface for managing labels of a node -type Interface interface { - AddLabels(driverName string) error -} - -// NewLabelManager initializes labelManagerStruct and returns available interfaces -func NewLabelManager(nodeName types.NodeName, kubeClient kubernetes.Interface) Interface { - return labelManagerStruct{ - nodeName: nodeName, - k8s: kubeClient, - } -} - -// nodeLabelManager waits for labeling requests initiated by the driver's registration -// process. -func (lm labelManagerStruct) AddLabels(driverName string) error { - err := verifyAndAddNodeId(string(lm.nodeName), lm.k8s.CoreV1().Nodes(), driverName, string(lm.nodeName)) - if err != nil { - return fmt.Errorf("failed to update node %s's annotation with error: %+v", lm.nodeName, err) - } - return nil -} - -// Clones the given map and returns a new map with the given key and value added. -// Returns the given map, if annotationKey is empty. -func cloneAndAddAnnotation( - annotations map[string]string, - annotationKey, - annotationValue string) map[string]string { - if annotationKey == "" { - // Don't need to add an annotation. - return annotations - } - // Clone. - newAnnotations := map[string]string{} - for key, value := range annotations { - newAnnotations[key] = value - } - newAnnotations[annotationKey] = annotationValue - return newAnnotations -} - -func verifyAndAddNodeId( - k8sNodeName string, - k8sNodesClient corev1.NodeInterface, - csiDriverName string, - csiDriverNodeId string) error { - // Add or update annotation on Node object - retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { - // Retrieve the latest version of Node before attempting update, so that - // existing changes are not overwritten. RetryOnConflict uses - // exponential backoff to avoid exhausting the apiserver. - result, getErr := k8sNodesClient.Get(k8sNodeName, metav1.GetOptions{}) - if getErr != nil { - glog.Errorf("Failed to get latest version of Node: %v", getErr) - return getErr // do not wrap error - } - - var previousAnnotationValue string - if result.ObjectMeta.Annotations != nil { - previousAnnotationValue = - result.ObjectMeta.Annotations[annotationKey] - glog.V(3).Infof( - "previousAnnotationValue=%q", previousAnnotationValue) - } - - existingDriverMap := map[string]string{} - if previousAnnotationValue != "" { - // Parse previousAnnotationValue as JSON - if err := json.Unmarshal([]byte(previousAnnotationValue), &existingDriverMap); err != nil { - return fmt.Errorf( - "failed to parse node's %q annotation value (%q) err=%v", - annotationKey, - previousAnnotationValue, - err) - } - } - - if val, ok := existingDriverMap[csiDriverName]; ok { - if val == csiDriverNodeId { - // Value already exists in node annotation, nothing more to do - glog.V(1).Infof( - "The key value {%q: %q} alredy eixst in node %q annotation, no need to update: %v", - csiDriverName, - csiDriverNodeId, - annotationKey, - previousAnnotationValue) - return nil - } - } - - // Add/update annotation value - existingDriverMap[csiDriverName] = csiDriverNodeId - jsonObj, err := json.Marshal(existingDriverMap) - if err != nil { - return fmt.Errorf( - "failed while trying to add key value {%q: %q} to node %q annotation. Existing value: %v", - csiDriverName, - csiDriverNodeId, - annotationKey, - previousAnnotationValue) - } - - result.ObjectMeta.Annotations = cloneAndAddAnnotation( - result.ObjectMeta.Annotations, - annotationKey, - string(jsonObj)) - _, updateErr := k8sNodesClient.Update(result) - if updateErr == nil { - fmt.Printf( - "Updated node %q successfully for CSI driver %q and CSI node name %q", - k8sNodeName, - csiDriverName, - csiDriverNodeId) - } - return updateErr // do not wrap error - }) - if retryErr != nil { - return fmt.Errorf("node update failed: %v", retryErr) - } - return nil -} - -// Fetches Kubernetes node API object corresponding to k8sNodeName. -// If the csiDriverName is present in the node annotation, it is removed. -func verifyAndDeleteNodeId( - k8sNodeName string, - k8sNodesClient corev1.NodeInterface, - csiDriverName string) error { - retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error { - // Retrieve the latest version of Node before attempting update, so that - // existing changes are not overwritten. RetryOnConflict uses - // exponential backoff to avoid exhausting the apiserver. - result, getErr := k8sNodesClient.Get(k8sNodeName, metav1.GetOptions{}) - if getErr != nil { - glog.Errorf("failed to get latest version of Node: %v", getErr) - return getErr // do not wrap error - } - - var previousAnnotationValue string - if result.ObjectMeta.Annotations != nil { - previousAnnotationValue = - result.ObjectMeta.Annotations[annotationKey] - glog.V(3).Infof( - "previousAnnotationValue=%q", previousAnnotationValue) - } - - existingDriverMap := map[string]string{} - if previousAnnotationValue == "" { - // Value already exists in node annotation, nothing more to do - glog.V(1).Infof( - "The key %q does not exist in node %q annotation, no need to cleanup.", - csiDriverName, - annotationKey) - return nil - } - - // Parse previousAnnotationValue as JSON - if err := json.Unmarshal([]byte(previousAnnotationValue), &existingDriverMap); err != nil { - return fmt.Errorf( - "failed to parse node's %q annotation value (%q) err=%v", - annotationKey, - previousAnnotationValue, - err) - } - - if _, ok := existingDriverMap[csiDriverName]; !ok { - // Value already exists in node annotation, nothing more to do - glog.V(1).Infof( - "The key %q does not eixst in node %q annotation, no need to cleanup: %v", - csiDriverName, - annotationKey, - previousAnnotationValue) - return nil - } - - // Add/update annotation value - delete(existingDriverMap, csiDriverName) - jsonObj, err := json.Marshal(existingDriverMap) - if err != nil { - return fmt.Errorf( - "failed while trying to remove key %q from node %q annotation. Existing data: %v", - csiDriverName, - annotationKey, - previousAnnotationValue) - } - - result.ObjectMeta.Annotations = cloneAndAddAnnotation( - result.ObjectMeta.Annotations, - annotationKey, - string(jsonObj)) - _, updateErr := k8sNodesClient.Update(result) - if updateErr == nil { - fmt.Printf( - "Updated node %q annotation to remove CSI driver %q.", - k8sNodeName, - csiDriverName) - } - return updateErr // do not wrap error - }) - if retryErr != nil { - return fmt.Errorf("node update failed: %v", retryErr) - } - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/plugins.go b/vendor/k8s.io/kubernetes/pkg/volume/plugins.go index fbe0bd4c..e9ccf7e2 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/plugins.go @@ -32,8 +32,8 @@ import ( "k8s.io/apimachinery/pkg/util/validation" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" + csiclientset "k8s.io/csi-api/pkg/client/clientset/versioned" "k8s.io/kubernetes/pkg/cloudprovider" - "k8s.io/kubernetes/pkg/util/io" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume/util/recyclerclient" ) @@ -203,9 +203,17 @@ type ProvisionableVolumePlugin interface { // AttachableVolumePlugin is an extended interface of VolumePlugin and is used for volumes that require attachment // to a node before mounting. type AttachableVolumePlugin interface { - VolumePlugin + DeviceMountableVolumePlugin NewAttacher() (Attacher, error) NewDetacher() (Detacher, error) +} + +// DeviceMountableVolumePlugin is an extended interface of VolumePlugin and is used +// for volumes that requires mount device to a node before binding to volume to pod. +type DeviceMountableVolumePlugin interface { + VolumePlugin + NewDeviceMounter() (DeviceMounter, error) + NewDeviceUnmounter() (DeviceUnmounter, error) GetDeviceMountRefs(deviceMountPath string) ([]string, error) } @@ -302,6 +310,9 @@ type VolumeHost interface { // GetKubeClient returns a client interface GetKubeClient() clientset.Interface + // GetCSIClient returns a client interface to csi.storage.k8s.io + GetCSIClient() csiclientset.Interface + // NewWrapperMounter finds an appropriate plugin with which to handle // the provided spec. This is used to implement volume plugins which // "wrap" other plugins. For example, the "secret" volume is @@ -319,9 +330,6 @@ type VolumeHost interface { // Get mounter interface. GetMounter(pluginName string) mount.Interface - // Get writer interface for writing data to disk. - GetWriter() io.Writer - // Returns the hostname of the host kubelet is running on GetHostName() string @@ -605,7 +613,8 @@ func (pm *VolumePluginMgr) refreshProbedPlugins() { } pm.probedPlugins[event.Plugin.GetPluginName()] = event.Plugin } else if event.Op == ProbeRemove { - delete(pm.probedPlugins, event.Plugin.GetPluginName()) + // Plugin is not available on ProbeRemove event, only PluginName + delete(pm.probedPlugins, event.PluginName) } else { glog.Errorf("Unknown Operation on PluginName: %s.", event.Plugin.GetPluginName()) @@ -760,6 +769,30 @@ func (pm *VolumePluginMgr) FindAttachablePluginByName(name string) (AttachableVo return nil, nil } +// FindDeviceMountablePluginBySpec fetches a persistent volume plugin by spec. +func (pm *VolumePluginMgr) FindDeviceMountablePluginBySpec(spec *Spec) (DeviceMountableVolumePlugin, error) { + volumePlugin, err := pm.FindPluginBySpec(spec) + if err != nil { + return nil, err + } + if deviceMountableVolumePlugin, ok := volumePlugin.(DeviceMountableVolumePlugin); ok { + return deviceMountableVolumePlugin, nil + } + return nil, nil +} + +// FindDeviceMountablePluginByName fetches a devicemountable volume plugin by name. +func (pm *VolumePluginMgr) FindDeviceMountablePluginByName(name string) (DeviceMountableVolumePlugin, error) { + volumePlugin, err := pm.FindPluginByName(name) + if err != nil { + return nil, err + } + if deviceMountableVolumePlugin, ok := volumePlugin.(DeviceMountableVolumePlugin); ok { + return deviceMountableVolumePlugin, nil + } + return nil, nil +} + // FindExpandablePluginBySpec fetches a persistent volume plugin by spec. func (pm *VolumePluginMgr) FindExpandablePluginBySpec(spec *Spec) (ExpandableVolumePlugin, error) { volumePlugin, err := pm.FindPluginBySpec(spec) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD index 08d5c3ef..a6b371ed 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/BUILD @@ -6,6 +6,8 @@ go_library( "atomic_writer.go", "attach_limit.go", "device_util.go", + "device_util_linux.go", + "device_util_unsupported.go", "doc.go", "error.go", "finalizer.go", @@ -14,42 +16,7 @@ go_library( "nested_volumes.go", "resize_util.go", "util.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "device_util_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "device_util_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "device_util_unsupported.go", - ], - "//conditions:default": [], - }), + ], importpath = "k8s.io/kubernetes/pkg/volume/util", visibility = ["//visibility:public"], deps = [ @@ -58,50 +25,51 @@ go_library( "//pkg/features:go_default_library", "//pkg/kubelet/apis:go_default_library", "//pkg/util/mount:go_default_library", + "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util/types:go_default_library", "//pkg/volume/util/volumepathhandler:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/storage/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], ) go_test( name = "go_default_test", srcs = [ + "atomic_writer_test.go", + "attach_limit_test.go", + "device_util_linux_test.go", "nested_volumes_test.go", "resize_util_test.go", "util_test.go", - ] + select({ - "@io_bazel_rules_go//go/platform:linux": [ - "atomic_writer_test.go", - "device_util_linux_test.go", - ], - "//conditions:default": [], - }), + ], embed = [":go_default_library"], deps = [ "//pkg/apis/core/install:go_default_library", + "//pkg/apis/core/v1/helper:go_default_library", + "//pkg/kubelet/apis:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/util/slice:go_default_library", "//pkg/volume:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/client-go/util/testing:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/attach_limit.go b/vendor/k8s.io/kubernetes/pkg/volume/util/attach_limit.go index 610f5f5b..079a0150 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/attach_limit.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/attach_limit.go @@ -16,14 +16,48 @@ limitations under the License. package util +import ( + "crypto/sha1" + "encoding/hex" +) + // This file is a common place holder for volume limit utility constants // shared between volume package and scheduler const ( // EBSVolumeLimitKey resource name that will store volume limits for EBS EBSVolumeLimitKey = "attachable-volumes-aws-ebs" + // EBSNitroLimitRegex finds nitro instance types with different limit than EBS defaults + EBSNitroLimitRegex = "^[cmr]5.*|t3|z1d" + // DefaultMaxEBSVolumes is the limit for volumes attached to an instance. + // Amazon recommends no more than 40; the system root volume uses at least one. + // See http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/volume_limits.html#linux-specific-volume-limits + DefaultMaxEBSVolumes = 39 + // DefaultMaxEBSM5VolumeLimit is default EBS volume limit on m5 and c5 instances + DefaultMaxEBSNitroVolumeLimit = 25 // AzureVolumeLimitKey stores resource name that will store volume limits for Azure AzureVolumeLimitKey = "attachable-volumes-azure-disk" // GCEVolumeLimitKey stores resource name that will store volume limits for GCE node GCEVolumeLimitKey = "attachable-volumes-gce-pd" + + // CSIAttachLimitPrefix defines prefix used for CSI volumes + CSIAttachLimitPrefix = "attachable-volumes-csi-" + + // ResourceNameLengthLimit stores maximum allowed Length for a ResourceName + ResourceNameLengthLimit = 63 ) + +// GetCSIAttachLimitKey returns limit key used for CSI volumes +func GetCSIAttachLimitKey(driverName string) string { + csiPrefixLength := len(CSIAttachLimitPrefix) + totalkeyLength := csiPrefixLength + len(driverName) + if totalkeyLength >= ResourceNameLengthLimit { + charsFromDriverName := driverName[:23] + hash := sha1.New() + hash.Write([]byte(driverName)) + hashed := hex.EncodeToString(hash.Sum(nil)) + hashed = hashed[:16] + return CSIAttachLimitPrefix + charsFromDriverName + hashed + } + return CSIAttachLimitPrefix + driverName +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/device_util.go b/vendor/k8s.io/kubernetes/pkg/volume/util/device_util.go index 9d504bc2..f508399b 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/device_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/device_util.go @@ -20,6 +20,8 @@ package util type DeviceUtil interface { FindMultipathDeviceForDevice(disk string) string FindSlaveDevicesOnMultipath(disk string) []string + GetISCSIPortalHostMapForTarget(targetIqn string) (map[string]int, error) + FindDevicesForISCSILun(targetIqn string, lun int) ([]string, error) } type deviceHandler struct { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_linux.go b/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_linux.go index 297004bf..2d1f43c8 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_linux.go @@ -20,7 +20,10 @@ package util import ( "errors" + "fmt" + "github.com/golang/glog" "path" + "strconv" "strings" ) @@ -80,3 +83,206 @@ func (handler *deviceHandler) FindSlaveDevicesOnMultipath(dm string) []string { } return devices } + +// GetISCSIPortalHostMapForTarget given a target iqn, find all the scsi hosts logged into +// that target. Returns a map of iSCSI portals (string) to SCSI host numbers (integers). +// For example: { +// "192.168.30.7:3260": 2, +// "192.168.30.8:3260": 3, +// } +func (handler *deviceHandler) GetISCSIPortalHostMapForTarget(targetIqn string) (map[string]int, error) { + portalHostMap := make(map[string]int) + io := handler.get_io + + // Iterate over all the iSCSI hosts in sysfs + sysPath := "/sys/class/iscsi_host" + hostDirs, err := io.ReadDir(sysPath) + if err != nil { + return nil, err + } + for _, hostDir := range hostDirs { + // iSCSI hosts are always of the format "host%d" + // See drivers/scsi/hosts.c in Linux + hostName := hostDir.Name() + if !strings.HasPrefix(hostName, "host") { + continue + } + hostNumber, err := strconv.Atoi(strings.TrimPrefix(hostName, "host")) + if err != nil { + glog.Errorf("Could not get number from iSCSI host: %s", hostName) + continue + } + + // Iterate over the children of the iscsi_host device + // We are looking for the associated session + devicePath := sysPath + "/" + hostName + "/device" + deviceDirs, err := io.ReadDir(devicePath) + if err != nil { + return nil, err + } + for _, deviceDir := range deviceDirs { + // Skip over files that aren't the session + // Sessions are of the format "session%u" + // See drivers/scsi/scsi_transport_iscsi.c in Linux + sessionName := deviceDir.Name() + if !strings.HasPrefix(sessionName, "session") { + continue + } + + sessionPath := devicePath + "/" + sessionName + + // Read the target name for the iSCSI session + targetNamePath := sessionPath + "/iscsi_session/" + sessionName + "/targetname" + targetName, err := io.ReadFile(targetNamePath) + if err != nil { + return nil, err + } + + // Ignore hosts that don't matchthe target we were looking for. + if strings.TrimSpace(string(targetName)) != targetIqn { + continue + } + + // Iterate over the children of the iSCSI session looking + // for the iSCSI connection. + dirs2, err := io.ReadDir(sessionPath) + if err != nil { + return nil, err + } + for _, dir2 := range dirs2 { + // Skip over files that aren't the connection + // Connections are of the format "connection%d:%u" + // See drivers/scsi/scsi_transport_iscsi.c in Linux + dirName := dir2.Name() + if !strings.HasPrefix(dirName, "connection") { + continue + } + + connectionPath := sessionPath + "/" + dirName + "/iscsi_connection/" + dirName + + // Read the current and persistent portal information for the connection. + addrPath := connectionPath + "/address" + addr, err := io.ReadFile(addrPath) + if err != nil { + return nil, err + } + + portPath := connectionPath + "/port" + port, err := io.ReadFile(portPath) + if err != nil { + return nil, err + } + + persistentAddrPath := connectionPath + "/persistent_address" + persistentAddr, err := io.ReadFile(persistentAddrPath) + if err != nil { + return nil, err + } + + persistentPortPath := connectionPath + "/persistent_port" + persistentPort, err := io.ReadFile(persistentPortPath) + if err != nil { + return nil, err + } + + // Add entries to the map for both the current and persistent portals + // pointing to the SCSI host for those connections + portal := strings.TrimSpace(string(addr)) + ":" + + strings.TrimSpace(string(port)) + portalHostMap[portal] = hostNumber + + persistentPortal := strings.TrimSpace(string(persistentAddr)) + ":" + + strings.TrimSpace(string(persistentPort)) + portalHostMap[persistentPortal] = hostNumber + } + } + } + + return portalHostMap, nil +} + +// FindDevicesForISCSILun given an iqn, and lun number, find all the devices +// corresponding to that LUN. +func (handler *deviceHandler) FindDevicesForISCSILun(targetIqn string, lun int) ([]string, error) { + devices := make([]string, 0) + io := handler.get_io + + // Iterate over all the iSCSI hosts in sysfs + sysPath := "/sys/class/iscsi_host" + hostDirs, err := io.ReadDir(sysPath) + if err != nil { + return nil, err + } + for _, hostDir := range hostDirs { + // iSCSI hosts are always of the format "host%d" + // See drivers/scsi/hosts.c in Linux + hostName := hostDir.Name() + if !strings.HasPrefix(hostName, "host") { + continue + } + hostNumber, err := strconv.Atoi(strings.TrimPrefix(hostName, "host")) + if err != nil { + glog.Errorf("Could not get number from iSCSI host: %s", hostName) + continue + } + + // Iterate over the children of the iscsi_host device + // We are looking for the associated session + devicePath := sysPath + "/" + hostName + "/device" + deviceDirs, err := io.ReadDir(devicePath) + if err != nil { + return nil, err + } + for _, deviceDir := range deviceDirs { + // Skip over files that aren't the session + // Sessions are of the format "session%u" + // See drivers/scsi/scsi_transport_iscsi.c in Linux + sessionName := deviceDir.Name() + if !strings.HasPrefix(sessionName, "session") { + continue + } + + // Read the target name for the iSCSI session + targetNamePath := devicePath + "/" + sessionName + "/iscsi_session/" + sessionName + "/targetname" + targetName, err := io.ReadFile(targetNamePath) + if err != nil { + return nil, err + } + + // Only if the session matches the target we were looking for, + // add it to the map + if strings.TrimSpace(string(targetName)) != targetIqn { + continue + } + + // The list of block devices on the scsi bus will be in a + // directory called "target%d:%d:%d". + // See drivers/scsi/scsi_scan.c in Linux + // We assume the channel/bus and device/controller are always zero for iSCSI + targetPath := devicePath + "/" + sessionName + fmt.Sprintf("/target%d:0:0", hostNumber) + + // The block device for a given lun will be "%d:%d:%d:%d" -- + // host:channel:bus:LUN + blockDevicePath := targetPath + fmt.Sprintf("/%d:0:0:%d", hostNumber, lun) + + // If the LUN doesn't exist on this bus, continue on + _, err = io.Lstat(blockDevicePath) + if err != nil { + continue + } + + // Read the block directory, there should only be one child -- + // the block device "sd*" + path := blockDevicePath + "/block" + dirs, err := io.ReadDir(path) + if err != nil { + return nil, err + } + if 0 < len(dirs) { + devices = append(devices, dirs[0].Name()) + } + } + } + + return devices, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_unsupported.go b/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_unsupported.go index 0b41eb37..3be3418e 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/device_util_unsupported.go @@ -28,3 +28,15 @@ func (handler *deviceHandler) FindSlaveDevicesOnMultipath(disk string) []string out := []string{} return out } + +// GetISCSIPortalHostMapForTarget unsupported returns nil +func (handler *deviceHandler) GetISCSIPortalHostMapForTarget(targetIqn string) (map[string]int, error) { + portalHostMap := make(map[string]int) + return portalHostMap, nil +} + +// FindDevicesForISCSILun unsupported returns nil +func (handler *deviceHandler) FindDevicesForISCSILun(targetIqn string, lun int) ([]string, error) { + devices := []string{} + return devices, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD index 0e9be301..38602bac 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/fs/BUILD @@ -2,80 +2,49 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = select({ - "@io_bazel_rules_go//go/platform:android": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "fs.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "fs.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "fs_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "fs_windows.go", - ], - "//conditions:default": [], - }), + srcs = [ + "fs.go", + "fs_unsupported.go", + "fs_windows.go", + ], importpath = "k8s.io/kubernetes/pkg/volume/util/fs", visibility = ["//visibility:public"], deps = select({ "@io_bazel_rules_go//go/platform:android": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:darwin": [ + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:linux": [ + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/golang.org/x/sys/unix:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "@io_bazel_rules_go//go/platform:windows": [ + "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//vendor/golang.org/x/sys/windows:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/io_util.go b/vendor/k8s.io/kubernetes/pkg/volume/util/io_util.go index e1f30f5c..aff453e1 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/io_util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/io_util.go @@ -24,6 +24,7 @@ import ( // IoUtil is a mockable util for common IO operations type IoUtil interface { + ReadFile(filename string) ([]byte, error) ReadDir(dirname string) ([]os.FileInfo, error) Lstat(name string) (os.FileInfo, error) EvalSymlinks(path string) (string, error) @@ -36,6 +37,9 @@ func NewIOHandler() IoUtil { return &osIOHandler{} } +func (handler *osIOHandler) ReadFile(filename string) ([]byte, error) { + return ioutil.ReadFile(filename) +} func (handler *osIOHandler) ReadDir(dirname string) ([]os.FileInfo, error) { return ioutil.ReadDir(dirname) } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD deleted file mode 100644 index 46eb0830..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["nestedpendingoperations.go"], - importpath = "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations", - deps = [ - "//pkg/util/goroutinemap/exponentialbackoff:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["nestedpendingoperations_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/volume/util/types:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/OWNERS b/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/OWNERS deleted file mode 100644 index 4739819c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -approvers: -- saad-ali diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/nestedpendingoperations.go b/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/nestedpendingoperations.go deleted file mode 100644 index 526ea403..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations/nestedpendingoperations.go +++ /dev/null @@ -1,322 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 nestedpendingoperations is a modified implementation of -pkg/util/goroutinemap. It implements a data structure for managing go routines -by volume/pod name. It prevents the creation of new go routines if an existing -go routine for the volume already exists. It also allows multiple operations to -execute in parallel for the same volume as long as they are operating on -different pods. -*/ -package nestedpendingoperations - -import ( - "fmt" - "sync" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - k8sRuntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff" - "k8s.io/kubernetes/pkg/volume/util/types" -) - -const ( - // EmptyUniquePodName is a UniquePodName for empty string. - EmptyUniquePodName types.UniquePodName = types.UniquePodName("") - - // EmptyUniqueVolumeName is a UniqueVolumeName for empty string - EmptyUniqueVolumeName v1.UniqueVolumeName = v1.UniqueVolumeName("") -) - -// NestedPendingOperations defines the supported set of operations. -type NestedPendingOperations interface { - // Run adds the concatenation of volumeName and podName to the list of - // running operations and spawns a new go routine to execute operationFunc. - // If an operation with the same volumeName and same or empty podName - // exists, an AlreadyExists or ExponentialBackoff error is returned. - // This enables multiple operations to execute in parallel for the same - // volumeName as long as they have different podName. - // Once the operation is complete, the go routine is terminated and the - // concatenation of volumeName and podName is removed from the list of - // executing operations allowing a new operation to be started with the - // volumeName without error. - Run(volumeName v1.UniqueVolumeName, podName types.UniquePodName, generatedOperations types.GeneratedOperations) error - - // Wait blocks until all operations are completed. This is typically - // necessary during tests - the test should wait until all operations finish - // and evaluate results after that. - Wait() - - // IsOperationPending returns true if an operation for the given volumeName and podName is pending, - // otherwise it returns false - IsOperationPending(volumeName v1.UniqueVolumeName, podName types.UniquePodName) bool -} - -// NewNestedPendingOperations returns a new instance of NestedPendingOperations. -func NewNestedPendingOperations(exponentialBackOffOnError bool) NestedPendingOperations { - g := &nestedPendingOperations{ - operations: []operation{}, - exponentialBackOffOnError: exponentialBackOffOnError, - } - g.cond = sync.NewCond(&g.lock) - return g -} - -type nestedPendingOperations struct { - operations []operation - exponentialBackOffOnError bool - cond *sync.Cond - lock sync.RWMutex -} - -type operation struct { - volumeName v1.UniqueVolumeName - podName types.UniquePodName - operationPending bool - expBackoff exponentialbackoff.ExponentialBackoff -} - -func (grm *nestedPendingOperations) Run( - volumeName v1.UniqueVolumeName, - podName types.UniquePodName, - generatedOperations types.GeneratedOperations) error { - grm.lock.Lock() - defer grm.lock.Unlock() - opExists, previousOpIndex := grm.isOperationExists(volumeName, podName) - if opExists { - previousOp := grm.operations[previousOpIndex] - // Operation already exists - if previousOp.operationPending { - // Operation is pending - operationName := getOperationName(volumeName, podName) - return NewAlreadyExistsError(operationName) - } - - operationName := getOperationName(volumeName, podName) - if err := previousOp.expBackoff.SafeToRetry(operationName); err != nil { - return err - } - - // Update existing operation to mark as pending. - grm.operations[previousOpIndex].operationPending = true - grm.operations[previousOpIndex].volumeName = volumeName - grm.operations[previousOpIndex].podName = podName - } else { - // Create a new operation - grm.operations = append(grm.operations, - operation{ - operationPending: true, - volumeName: volumeName, - podName: podName, - expBackoff: exponentialbackoff.ExponentialBackoff{}, - }) - } - - go func() (eventErr, detailedErr error) { - // Handle unhandled panics (very unlikely) - defer k8sRuntime.HandleCrash() - // Handle completion of and error, if any, from operationFunc() - defer grm.operationComplete(volumeName, podName, &detailedErr) - if generatedOperations.CompleteFunc != nil { - defer generatedOperations.CompleteFunc(&detailedErr) - } - if generatedOperations.EventRecorderFunc != nil { - defer generatedOperations.EventRecorderFunc(&eventErr) - } - // Handle panic, if any, from operationFunc() - defer k8sRuntime.RecoverFromPanic(&detailedErr) - return generatedOperations.OperationFunc() - }() - - return nil -} - -func (grm *nestedPendingOperations) IsOperationPending( - volumeName v1.UniqueVolumeName, - podName types.UniquePodName) bool { - - grm.lock.RLock() - defer grm.lock.RUnlock() - - exist, previousOpIndex := grm.isOperationExists(volumeName, podName) - if exist && grm.operations[previousOpIndex].operationPending { - return true - } - return false -} - -// This is an internal function and caller should acquire and release the lock -func (grm *nestedPendingOperations) isOperationExists( - volumeName v1.UniqueVolumeName, - podName types.UniquePodName) (bool, int) { - - // If volumeName is empty, operation can be executed concurrently - if volumeName == EmptyUniqueVolumeName { - return false, -1 - } - - for previousOpIndex, previousOp := range grm.operations { - if previousOp.volumeName != volumeName { - // No match, keep searching - continue - } - - if previousOp.podName != EmptyUniquePodName && - podName != EmptyUniquePodName && - previousOp.podName != podName { - // No match, keep searching - continue - } - - // Match - return true, previousOpIndex - } - return false, -1 -} - -func (grm *nestedPendingOperations) getOperation( - volumeName v1.UniqueVolumeName, - podName types.UniquePodName) (uint, error) { - // Assumes lock has been acquired by caller. - - for i, op := range grm.operations { - if op.volumeName == volumeName && - op.podName == podName { - return uint(i), nil - } - } - - logOperationName := getOperationName(volumeName, podName) - return 0, fmt.Errorf("Operation %q not found", logOperationName) -} - -func (grm *nestedPendingOperations) deleteOperation( - // Assumes lock has been acquired by caller. - volumeName v1.UniqueVolumeName, - podName types.UniquePodName) { - - opIndex := -1 - for i, op := range grm.operations { - if op.volumeName == volumeName && - op.podName == podName { - opIndex = i - break - } - } - - // Delete index without preserving order - grm.operations[opIndex] = grm.operations[len(grm.operations)-1] - grm.operations = grm.operations[:len(grm.operations)-1] -} - -func (grm *nestedPendingOperations) operationComplete( - volumeName v1.UniqueVolumeName, podName types.UniquePodName, err *error) { - // Defer operations are executed in Last-In is First-Out order. In this case - // the lock is acquired first when operationCompletes begins, and is - // released when the method finishes, after the lock is released cond is - // signaled to wake waiting goroutine. - defer grm.cond.Signal() - grm.lock.Lock() - defer grm.lock.Unlock() - - if *err == nil || !grm.exponentialBackOffOnError { - // Operation completed without error, or exponentialBackOffOnError disabled - grm.deleteOperation(volumeName, podName) - if *err != nil { - // Log error - logOperationName := getOperationName(volumeName, podName) - glog.Errorf("operation %s failed with: %v", - logOperationName, - *err) - } - return - } - - // Operation completed with error and exponentialBackOffOnError Enabled - existingOpIndex, getOpErr := grm.getOperation(volumeName, podName) - if getOpErr != nil { - // Failed to find existing operation - logOperationName := getOperationName(volumeName, podName) - glog.Errorf("Operation %s completed. error: %v. exponentialBackOffOnError is enabled, but failed to get operation to update.", - logOperationName, - *err) - return - } - - grm.operations[existingOpIndex].expBackoff.Update(err) - grm.operations[existingOpIndex].operationPending = false - - // Log error - operationName := - getOperationName(volumeName, podName) - glog.Errorf("%v", grm.operations[existingOpIndex].expBackoff. - GenerateNoRetriesPermittedMsg(operationName)) -} - -func (grm *nestedPendingOperations) Wait() { - grm.lock.Lock() - defer grm.lock.Unlock() - - for len(grm.operations) > 0 { - grm.cond.Wait() - } -} - -func getOperationName( - volumeName v1.UniqueVolumeName, podName types.UniquePodName) string { - podNameStr := "" - if podName != EmptyUniquePodName { - podNameStr = fmt.Sprintf(" (%q)", podName) - } - - return fmt.Sprintf("%q%s", - volumeName, - podNameStr) -} - -// NewAlreadyExistsError returns a new instance of AlreadyExists error. -func NewAlreadyExistsError(operationName string) error { - return alreadyExistsError{operationName} -} - -// IsAlreadyExists returns true if an error returned from -// NestedPendingOperations indicates a new operation can not be started because -// an operation with the same operation name is already executing. -func IsAlreadyExists(err error) bool { - switch err.(type) { - case alreadyExistsError: - return true - default: - return false - } -} - -// alreadyExistsError is the error returned by NestedPendingOperations when a -// new operation can not be started because an operation with the same operation -// name is already executing. -type alreadyExistsError struct { - operationName string -} - -var _ error = alreadyExistsError{} - -func (err alreadyExistsError) Error() string { - return fmt.Sprintf( - "Failed to create operation with name %q. An operation with that name is already executing.", - err.operationName) -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD deleted file mode 100644 index f7676a07..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "operation_executor.go", - "operation_generator.go", - ], - importpath = "k8s.io/kubernetes/pkg/volume/util/operationexecutor", - deps = [ - "//pkg/controller/volume/expand/cache:go_default_library", - "//pkg/features:go_default_library", - "//pkg/kubelet/events:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/util/resizefs:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util:go_default_library", - "//pkg/volume/util/nestedpendingoperations:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//pkg/volume/util/volumepathhandler:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["operation_executor_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/controller/volume/expand/cache:go_default_library", - "//pkg/util/mount:go_default_library", - "//pkg/volume:go_default_library", - "//pkg/volume/util/types:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/OWNERS b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/OWNERS deleted file mode 100644 index 4739819c..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -approvers: -- saad-ali diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go deleted file mode 100644 index 283a3222..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go +++ /dev/null @@ -1,942 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 operationexecutor implements interfaces that enable execution of -// attach, detach, mount, and unmount operations with a -// nestedpendingoperations so that more than one operation is never triggered -// on the same volume for the same pod. -package operationexecutor - -import ( - "fmt" - "time" - - "github.com/golang/glog" - - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/types" - expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" - "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" - "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations" - volumetypes "k8s.io/kubernetes/pkg/volume/util/types" - "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" -) - -// OperationExecutor defines a set of operations for attaching, detaching, -// mounting, or unmounting a volume that are executed with a NewNestedPendingOperations which -// prevents more than one operation from being triggered on the same volume. -// -// These operations should be idempotent (for example, AttachVolume should -// still succeed if the volume is already attached to the node, etc.). However, -// they depend on the volume plugins to implement this behavior. -// -// Once an operation completes successfully, the actualStateOfWorld is updated -// to indicate the volume is attached/detached/mounted/unmounted. -// -// If the OperationExecutor fails to start the operation because, for example, -// an operation with the same UniqueVolumeName is already pending, a non-nil -// error is returned. -// -// Once the operation is started, since it is executed asynchronously, -// errors are simply logged and the goroutine is terminated without updating -// actualStateOfWorld (callers are responsible for retrying as needed). -// -// Some of these operations may result in calls to the API server; callers are -// responsible for rate limiting on errors. -type OperationExecutor interface { - // AttachVolume attaches the volume to the node specified in volumeToAttach. - // It then updates the actual state of the world to reflect that. - AttachVolume(volumeToAttach VolumeToAttach, actualStateOfWorld ActualStateOfWorldAttacherUpdater) error - - // VerifyVolumesAreAttachedPerNode verifies the given list of volumes to see whether they are still attached to the node. - // If any volume is not attached right now, it will update the actual state of the world to reflect that. - // Note that this operation could be operated concurrently with other attach/detach operations. - // In theory (but very unlikely in practise), race condition among these operations might mark volume as detached - // even if it is attached. But reconciler can correct this in a short period of time. - VerifyVolumesAreAttachedPerNode(AttachedVolumes []AttachedVolume, nodeName types.NodeName, actualStateOfWorld ActualStateOfWorldAttacherUpdater) error - - // VerifyVolumesAreAttached verifies volumes being used in entire cluster and if they are still attached to the node - // If any volume is not attached right now, it will update actual state of world to reflect that. - VerifyVolumesAreAttached(volumesToVerify map[types.NodeName][]AttachedVolume, actualStateOfWorld ActualStateOfWorldAttacherUpdater) - - // DetachVolume detaches the volume from the node specified in - // volumeToDetach, and updates the actual state of the world to reflect - // that. If verifySafeToDetach is set, a call is made to the fetch the node - // object and it is used to verify that the volume does not exist in Node's - // Status.VolumesInUse list (operation fails with error if it is). - DetachVolume(volumeToDetach AttachedVolume, verifySafeToDetach bool, actualStateOfWorld ActualStateOfWorldAttacherUpdater) error - - // If a volume has 'Filesystem' volumeMode, MountVolume mounts the - // volume to the pod specified in volumeToMount. - // Specifically it will: - // * Wait for the device to finish attaching (for attachable volumes only). - // * Mount device to global mount path (for attachable volumes only). - // * Update actual state of world to reflect volume is globally mounted (for - // attachable volumes only). - // * Mount the volume to the pod specific path. - // * Update actual state of world to reflect volume is mounted to the pod - // path. - // The parameter "isRemount" is informational and used to adjust logging - // verbosity. An initial mount is more log-worthy than a remount, for - // example. - // - // For 'Block' volumeMode, this method creates a symbolic link to - // the volume from both the pod specified in volumeToMount and global map path. - // Specifically it will: - // * Wait for the device to finish attaching (for attachable volumes only). - // * Update actual state of world to reflect volume is globally mounted/mapped. - // * Map volume to global map path using symbolic link. - // * Map the volume to the pod device map path using symbolic link. - // * Update actual state of world to reflect volume is mounted/mapped to the pod path. - MountVolume(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater, isRemount bool) error - - // If a volume has 'Filesystem' volumeMode, UnmountVolume unmounts the - // volume from the pod specified in volumeToUnmount and updates the actual - // state of the world to reflect that. - // - // For 'Block' volumeMode, this method unmaps symbolic link to the volume - // from both the pod device map path in volumeToUnmount and global map path. - // And then, updates the actual state of the world to reflect that. - UnmountVolume(volumeToUnmount MountedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater, podsDir string) error - - // If a volume has 'Filesystem' volumeMode, UnmountDevice unmounts the - // volumes global mount path from the device (for attachable volumes only, - // freeing it for detach. It then updates the actual state of the world to - // reflect that. - // - // For 'Block' volumeMode, this method checks number of symbolic links under - // global map path. If number of reference is zero, remove global map path - // directory and free a volume for detach. - // It then updates the actual state of the world to reflect that. - UnmountDevice(deviceToDetach AttachedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater, mounter mount.Interface) error - - // VerifyControllerAttachedVolume checks if the specified volume is present - // in the specified nodes AttachedVolumes Status field. It uses kubeClient - // to fetch the node object. - // If the volume is found, the actual state of the world is updated to mark - // the volume as attached. - // If the volume does not implement the attacher interface, it is assumed to - // be attached and the actual state of the world is updated accordingly. - // If the volume is not found or there is an error (fetching the node - // object, for example) then an error is returned which triggers exponential - // back off on retries. - VerifyControllerAttachedVolume(volumeToMount VolumeToMount, nodeName types.NodeName, actualStateOfWorld ActualStateOfWorldAttacherUpdater) error - - // IsOperationPending returns true if an operation for the given volumeName and podName is pending, - // otherwise it returns false - IsOperationPending(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) bool - // Expand Volume will grow size available to PVC - ExpandVolume(*expandcache.PVCWithResizeRequest, expandcache.VolumeResizeMap) error - // ExpandVolumeFSWithoutUnmounting will resize volume's file system to expected size without unmounting the volume. - ExpandVolumeFSWithoutUnmounting(volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater) error - // ReconstructVolumeOperation construct a new volumeSpec and returns it created by plugin - ReconstructVolumeOperation(volumeMode v1.PersistentVolumeMode, plugin volume.VolumePlugin, mapperPlugin volume.BlockVolumePlugin, uid types.UID, podName volumetypes.UniquePodName, volumeSpecName string, mountPath string, pluginName string) (*volume.Spec, error) - // CheckVolumeExistenceOperation checks volume existence - CheckVolumeExistenceOperation(volumeSpec *volume.Spec, mountPath, volumeName string, mounter mount.Interface, uniqueVolumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName, podUID types.UID, attachable volume.AttachableVolumePlugin) (bool, error) -} - -// NewOperationExecutor returns a new instance of OperationExecutor. -func NewOperationExecutor( - operationGenerator OperationGenerator) OperationExecutor { - - return &operationExecutor{ - pendingOperations: nestedpendingoperations.NewNestedPendingOperations( - true /* exponentialBackOffOnError */), - operationGenerator: operationGenerator, - } -} - -// ActualStateOfWorldMounterUpdater defines a set of operations updating the actual -// state of the world cache after successful mount/unmount. -type ActualStateOfWorldMounterUpdater interface { - // Marks the specified volume as mounted to the specified pod - MarkVolumeAsMounted(podName volumetypes.UniquePodName, podUID types.UID, volumeName v1.UniqueVolumeName, mounter volume.Mounter, blockVolumeMapper volume.BlockVolumeMapper, outerVolumeSpecName string, volumeGidValue string, volumeSpec *volume.Spec) error - - // Marks the specified volume as unmounted from the specified pod - MarkVolumeAsUnmounted(podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error - - // Marks the specified volume as having been globally mounted. - MarkDeviceAsMounted(volumeName v1.UniqueVolumeName, devicePath, deviceMountPath string) error - - // Marks the specified volume as having its global mount unmounted. - MarkDeviceAsUnmounted(volumeName v1.UniqueVolumeName) error - - // Marks the specified volume's file system resize request is finished. - MarkVolumeAsResized(podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error -} - -// ActualStateOfWorldAttacherUpdater defines a set of operations updating the -// actual state of the world cache after successful attach/detach/mount/unmount. -type ActualStateOfWorldAttacherUpdater interface { - // Marks the specified volume as attached to the specified node. If the - // volume name is supplied, that volume name will be used. If not, the - // volume name is computed using the result from querying the plugin. - // - // TODO: in the future, we should be able to remove the volumeName - // argument to this method -- since it is used only for attachable - // volumes. See issue 29695. - MarkVolumeAsAttached(volumeName v1.UniqueVolumeName, volumeSpec *volume.Spec, nodeName types.NodeName, devicePath string) error - - // Marks the specified volume as detached from the specified node - MarkVolumeAsDetached(volumeName v1.UniqueVolumeName, nodeName types.NodeName) - - // Marks desire to detach the specified volume (remove the volume from the node's - // volumesToReportAsAttached list) - RemoveVolumeFromReportAsAttached(volumeName v1.UniqueVolumeName, nodeName types.NodeName) error - - // Unmarks the desire to detach for the specified volume (add the volume back to - // the node's volumesToReportAsAttached list) - AddVolumeToReportAsAttached(volumeName v1.UniqueVolumeName, nodeName types.NodeName) -} - -// VolumeLogger defines a set of operations for generating volume-related logging and error msgs -type VolumeLogger interface { - // Creates a detailed msg that can be used in logs - // The msg format follows the pattern " ", - // where each implementation provides the volume details - GenerateMsgDetailed(prefixMsg, suffixMsg string) (detailedMsg string) - - // Creates a detailed error that can be used in logs. - // The msg format follows the pattern " : ", - GenerateErrorDetailed(prefixMsg string, err error) (detailedErr error) - - // Creates a simple msg that is user friendly and a detailed msg that can be used in logs - // The msg format follows the pattern " ", - // where each implementation provides the volume details - GenerateMsg(prefixMsg, suffixMsg string) (simpleMsg, detailedMsg string) - - // Creates a simple error that is user friendly and a detailed error that can be used in logs. - // The msg format follows the pattern " : ", - GenerateError(prefixMsg string, err error) (simpleErr, detailedErr error) -} - -// Generates an error string with the format ": " if err exists -func errSuffix(err error) string { - errStr := "" - if err != nil { - errStr = fmt.Sprintf(": %v", err) - } - return errStr -} - -// Generate a detailed error msg for logs -func generateVolumeMsgDetailed(prefixMsg, suffixMsg, volumeName, details string) (detailedMsg string) { - return fmt.Sprintf("%v for volume %q %v %v", prefixMsg, volumeName, details, suffixMsg) -} - -// Generate a simplified error msg for events and a detailed error msg for logs -func generateVolumeMsg(prefixMsg, suffixMsg, volumeName, details string) (simpleMsg, detailedMsg string) { - simpleMsg = fmt.Sprintf("%v for volume %q %v", prefixMsg, volumeName, suffixMsg) - return simpleMsg, generateVolumeMsgDetailed(prefixMsg, suffixMsg, volumeName, details) -} - -// VolumeToAttach represents a volume that should be attached to a node. -type VolumeToAttach struct { - // MultiAttachErrorReported indicates whether the multi-attach error has been reported for the given volume. - // It is used to to prevent reporting the error from being reported more than once for a given volume. - MultiAttachErrorReported bool - - // VolumeName is the unique identifier for the volume that should be - // attached. - VolumeName v1.UniqueVolumeName - - // VolumeSpec is a volume spec containing the specification for the volume - // that should be attached. - VolumeSpec *volume.Spec - - // NodeName is the identifier for the node that the volume should be - // attached to. - NodeName types.NodeName - - // scheduledPods is a map containing the set of pods that reference this - // volume and are scheduled to the underlying node. The key in the map is - // the name of the pod and the value is a pod object containing more - // information about the pod. - ScheduledPods []*v1.Pod -} - -// GenerateMsgDetailed returns detailed msgs for volumes to attach -func (volume *VolumeToAttach) GenerateMsgDetailed(prefixMsg, suffixMsg string) (detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) from node %q", volume.VolumeName, volume.NodeName) - volumeSpecName := "nil" - if volume.VolumeSpec != nil { - volumeSpecName = volume.VolumeSpec.Name() - } - return generateVolumeMsgDetailed(prefixMsg, suffixMsg, volumeSpecName, detailedStr) -} - -// GenerateMsg returns simple and detailed msgs for volumes to attach -func (volume *VolumeToAttach) GenerateMsg(prefixMsg, suffixMsg string) (simpleMsg, detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) from node %q", volume.VolumeName, volume.NodeName) - volumeSpecName := "nil" - if volume.VolumeSpec != nil { - volumeSpecName = volume.VolumeSpec.Name() - } - return generateVolumeMsg(prefixMsg, suffixMsg, volumeSpecName, detailedStr) -} - -// GenerateErrorDetailed returns detailed errors for volumes to attach -func (volume *VolumeToAttach) GenerateErrorDetailed(prefixMsg string, err error) (detailedErr error) { - return fmt.Errorf(volume.GenerateMsgDetailed(prefixMsg, errSuffix(err))) -} - -// GenerateError returns simple and detailed errors for volumes to attach -func (volume *VolumeToAttach) GenerateError(prefixMsg string, err error) (simpleErr, detailedErr error) { - simpleMsg, detailedMsg := volume.GenerateMsg(prefixMsg, errSuffix(err)) - return fmt.Errorf(simpleMsg), fmt.Errorf(detailedMsg) -} - -// VolumeToMount represents a volume that should be attached to this node and -// mounted to the PodName. -type VolumeToMount struct { - // VolumeName is the unique identifier for the volume that should be - // mounted. - VolumeName v1.UniqueVolumeName - - // PodName is the unique identifier for the pod that the volume should be - // mounted to after it is attached. - PodName volumetypes.UniquePodName - - // VolumeSpec is a volume spec containing the specification for the volume - // that should be mounted. Used to create NewMounter. Used to generate - // InnerVolumeSpecName. - VolumeSpec *volume.Spec - - // outerVolumeSpecName is the podSpec.Volume[x].Name of the volume. If the - // volume was referenced through a persistent volume claim, this contains - // the podSpec.Volume[x].Name of the persistent volume claim. - OuterVolumeSpecName string - - // Pod to mount the volume to. Used to create NewMounter. - Pod *v1.Pod - - // PluginIsAttachable indicates that the plugin for this volume implements - // the volume.Attacher interface - PluginIsAttachable bool - - // VolumeGidValue contains the value of the GID annotation, if present. - VolumeGidValue string - - // DevicePath contains the path on the node where the volume is attached. - // For non-attachable volumes this is empty. - DevicePath string - - // ReportedInUse indicates that the volume was successfully added to the - // VolumesInUse field in the node's status. - ReportedInUse bool -} - -// GenerateMsgDetailed returns detailed msgs for volumes to mount -func (volume *VolumeToMount) GenerateMsgDetailed(prefixMsg, suffixMsg string) (detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) pod %q (UID: %q)", volume.VolumeName, volume.Pod.Name, volume.Pod.UID) - volumeSpecName := "nil" - if volume.VolumeSpec != nil { - volumeSpecName = volume.VolumeSpec.Name() - } - return generateVolumeMsgDetailed(prefixMsg, suffixMsg, volumeSpecName, detailedStr) -} - -// GenerateMsg returns simple and detailed msgs for volumes to mount -func (volume *VolumeToMount) GenerateMsg(prefixMsg, suffixMsg string) (simpleMsg, detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) pod %q (UID: %q)", volume.VolumeName, volume.Pod.Name, volume.Pod.UID) - volumeSpecName := "nil" - if volume.VolumeSpec != nil { - volumeSpecName = volume.VolumeSpec.Name() - } - return generateVolumeMsg(prefixMsg, suffixMsg, volumeSpecName, detailedStr) -} - -// GenerateErrorDetailed returns detailed errors for volumes to mount -func (volume *VolumeToMount) GenerateErrorDetailed(prefixMsg string, err error) (detailedErr error) { - return fmt.Errorf(volume.GenerateMsgDetailed(prefixMsg, errSuffix(err))) -} - -// GenerateError returns simple and detailed errors for volumes to mount -func (volume *VolumeToMount) GenerateError(prefixMsg string, err error) (simpleErr, detailedErr error) { - simpleMsg, detailedMsg := volume.GenerateMsg(prefixMsg, errSuffix(err)) - return fmt.Errorf(simpleMsg), fmt.Errorf(detailedMsg) -} - -// AttachedVolume represents a volume that is attached to a node. -type AttachedVolume struct { - // VolumeName is the unique identifier for the volume that is attached. - VolumeName v1.UniqueVolumeName - - // VolumeSpec is the volume spec containing the specification for the - // volume that is attached. - VolumeSpec *volume.Spec - - // NodeName is the identifier for the node that the volume is attached to. - NodeName types.NodeName - - // PluginIsAttachable indicates that the plugin for this volume implements - // the volume.Attacher interface - PluginIsAttachable bool - - // DevicePath contains the path on the node where the volume is attached. - // For non-attachable volumes this is empty. - DevicePath string - - // DeviceMountPath contains the path on the node where the device should - // be mounted after it is attached. - DeviceMountPath string - - // PluginName is the Unescaped Qualified name of the volume plugin used to - // attach and mount this volume. - PluginName string -} - -// GenerateMsgDetailed returns detailed msgs for attached volumes -func (volume *AttachedVolume) GenerateMsgDetailed(prefixMsg, suffixMsg string) (detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) on node %q", volume.VolumeName, volume.NodeName) - volumeSpecName := "nil" - if volume.VolumeSpec != nil { - volumeSpecName = volume.VolumeSpec.Name() - } - return generateVolumeMsgDetailed(prefixMsg, suffixMsg, volumeSpecName, detailedStr) -} - -// GenerateMsg returns simple and detailed msgs for attached volumes -func (volume *AttachedVolume) GenerateMsg(prefixMsg, suffixMsg string) (simpleMsg, detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) on node %q", volume.VolumeName, volume.NodeName) - volumeSpecName := "nil" - if volume.VolumeSpec != nil { - volumeSpecName = volume.VolumeSpec.Name() - } - return generateVolumeMsg(prefixMsg, suffixMsg, volumeSpecName, detailedStr) -} - -// GenerateErrorDetailed returns detailed errors for attached volumes -func (volume *AttachedVolume) GenerateErrorDetailed(prefixMsg string, err error) (detailedErr error) { - return fmt.Errorf(volume.GenerateMsgDetailed(prefixMsg, errSuffix(err))) -} - -// GenerateError returns simple and detailed errors for attached volumes -func (volume *AttachedVolume) GenerateError(prefixMsg string, err error) (simpleErr, detailedErr error) { - simpleMsg, detailedMsg := volume.GenerateMsg(prefixMsg, errSuffix(err)) - return fmt.Errorf(simpleMsg), fmt.Errorf(detailedMsg) -} - -// MountedVolume represents a volume that has successfully been mounted to a pod. -type MountedVolume struct { - // PodName is the unique identifier of the pod mounted to. - PodName volumetypes.UniquePodName - - // VolumeName is the unique identifier of the volume mounted to the pod. - VolumeName v1.UniqueVolumeName - - // InnerVolumeSpecName is the volume.Spec.Name() of the volume. If the - // volume was referenced through a persistent volume claims, this contains - // the name of the bound persistent volume object. - // It is the name that plugins use in their pod mount path, i.e. - // /var/lib/kubelet/pods/{podUID}/volumes/{escapeQualifiedPluginName}/{innerVolumeSpecName}/ - // PVC example, - // apiVersion: v1 - // kind: PersistentVolume - // metadata: - // name: pv0003 <- InnerVolumeSpecName - // spec: - // capacity: - // storage: 5Gi - // accessModes: - // - ReadWriteOnce - // persistentVolumeReclaimPolicy: Recycle - // nfs: - // path: /tmp - // server: 172.17.0.2 - // Non-PVC example: - // apiVersion: v1 - // kind: Pod - // metadata: - // name: test-pd - // spec: - // containers: - // - image: k8s.gcr.io/test-webserver - // name: test-container - // volumeMounts: - // - mountPath: /test-pd - // name: test-volume - // volumes: - // - name: test-volume <- InnerVolumeSpecName - // gcePersistentDisk: - // pdName: my-data-disk - // fsType: ext4 - InnerVolumeSpecName string - - // outerVolumeSpecName is the podSpec.Volume[x].Name of the volume. If the - // volume was referenced through a persistent volume claim, this contains - // the podSpec.Volume[x].Name of the persistent volume claim. - // PVC example: - // kind: Pod - // apiVersion: v1 - // metadata: - // name: mypod - // spec: - // containers: - // - name: myfrontend - // image: dockerfile/nginx - // volumeMounts: - // - mountPath: "/var/www/html" - // name: mypd - // volumes: - // - name: mypd <- OuterVolumeSpecName - // persistentVolumeClaim: - // claimName: myclaim - // Non-PVC example: - // apiVersion: v1 - // kind: Pod - // metadata: - // name: test-pd - // spec: - // containers: - // - image: k8s.gcr.io/test-webserver - // name: test-container - // volumeMounts: - // - mountPath: /test-pd - // name: test-volume - // volumes: - // - name: test-volume <- OuterVolumeSpecName - // gcePersistentDisk: - // pdName: my-data-disk - // fsType: ext4 - OuterVolumeSpecName string - - // PluginName is the "Unescaped Qualified" name of the volume plugin used to - // mount and unmount this volume. It can be used to fetch the volume plugin - // to unmount with, on demand. It is also the name that plugins use, though - // escaped, in their pod mount path, i.e. - // /var/lib/kubelet/pods/{podUID}/volumes/{escapeQualifiedPluginName}/{outerVolumeSpecName}/ - PluginName string - - // PodUID is the UID of the pod mounted to. It is also the string used by - // plugins in their pod mount path, i.e. - // /var/lib/kubelet/pods/{podUID}/volumes/{escapeQualifiedPluginName}/{outerVolumeSpecName}/ - PodUID types.UID - - // Mounter is the volume mounter used to mount this volume. It is required - // by kubelet to create container.VolumeMap. - Mounter volume.Mounter - - // BlockVolumeMapper is the volume mapper used to map this volume. It is required - // by kubelet to create container.VolumeMap. - BlockVolumeMapper volume.BlockVolumeMapper - - // VolumeGidValue contains the value of the GID annotation, if present. - VolumeGidValue string - - // VolumeSpec is a volume spec containing the specification for the volume - // that should be mounted. - VolumeSpec *volume.Spec - - // DeviceMountPath contains the path on the node where the device should - // be mounted after it is attached. - DeviceMountPath string -} - -// GenerateMsgDetailed returns detailed msgs for mounted volumes -func (volume *MountedVolume) GenerateMsgDetailed(prefixMsg, suffixMsg string) (detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) pod %q (UID: %q)", volume.VolumeName, volume.PodName, volume.PodUID) - return generateVolumeMsgDetailed(prefixMsg, suffixMsg, volume.OuterVolumeSpecName, detailedStr) -} - -// GenerateMsg returns simple and detailed msgs for mounted volumes -func (volume *MountedVolume) GenerateMsg(prefixMsg, suffixMsg string) (simpleMsg, detailedMsg string) { - detailedStr := fmt.Sprintf("(UniqueName: %q) pod %q (UID: %q)", volume.VolumeName, volume.PodName, volume.PodUID) - return generateVolumeMsg(prefixMsg, suffixMsg, volume.OuterVolumeSpecName, detailedStr) -} - -// GenerateErrorDetailed returns simple and detailed errors for mounted volumes -func (volume *MountedVolume) GenerateErrorDetailed(prefixMsg string, err error) (detailedErr error) { - return fmt.Errorf(volume.GenerateMsgDetailed(prefixMsg, errSuffix(err))) -} - -// GenerateError returns simple and detailed errors for mounted volumes -func (volume *MountedVolume) GenerateError(prefixMsg string, err error) (simpleErr, detailedErr error) { - simpleMsg, detailedMsg := volume.GenerateMsg(prefixMsg, errSuffix(err)) - return fmt.Errorf(simpleMsg), fmt.Errorf(detailedMsg) -} - -type operationExecutor struct { - // pendingOperations keeps track of pending attach and detach operations so - // multiple operations are not started on the same volume - pendingOperations nestedpendingoperations.NestedPendingOperations - - // operationGenerator is an interface that provides implementations for - // generating volume function - operationGenerator OperationGenerator -} - -func (oe *operationExecutor) IsOperationPending(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) bool { - return oe.pendingOperations.IsOperationPending(volumeName, podName) -} - -func (oe *operationExecutor) AttachVolume( - volumeToAttach VolumeToAttach, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) error { - generatedOperations, err := - oe.operationGenerator.GenerateAttachVolumeFunc(volumeToAttach, actualStateOfWorld) - if err != nil { - return err - } - - return oe.pendingOperations.Run( - volumeToAttach.VolumeName, "" /* podName */, generatedOperations) -} - -func (oe *operationExecutor) DetachVolume( - volumeToDetach AttachedVolume, - verifySafeToDetach bool, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) error { - generatedOperations, err := - oe.operationGenerator.GenerateDetachVolumeFunc(volumeToDetach, verifySafeToDetach, actualStateOfWorld) - if err != nil { - return err - } - - return oe.pendingOperations.Run( - volumeToDetach.VolumeName, "" /* podName */, generatedOperations) -} - -func (oe *operationExecutor) VerifyVolumesAreAttached( - attachedVolumes map[types.NodeName][]AttachedVolume, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) { - - // A map of plugin names and nodes on which they exist with volumes they manage - bulkVerifyPluginsByNode := make(map[string]map[types.NodeName][]*volume.Spec) - volumeSpecMapByPlugin := make(map[string]map[*volume.Spec]v1.UniqueVolumeName) - - for node, nodeAttachedVolumes := range attachedVolumes { - for _, volumeAttached := range nodeAttachedVolumes { - if volumeAttached.VolumeSpec == nil { - glog.Errorf("VerifyVolumesAreAttached: nil spec for volume %s", volumeAttached.VolumeName) - continue - } - volumePlugin, err := - oe.operationGenerator.GetVolumePluginMgr().FindPluginBySpec(volumeAttached.VolumeSpec) - - if err != nil || volumePlugin == nil { - glog.Errorf( - "VolumesAreAttached.FindPluginBySpec failed for volume %q (spec.Name: %q) on node %q with error: %v", - volumeAttached.VolumeName, - volumeAttached.VolumeSpec.Name(), - volumeAttached.NodeName, - err) - continue - } - - pluginName := volumePlugin.GetPluginName() - - if volumePlugin.SupportsBulkVolumeVerification() { - pluginNodes, pluginNodesExist := bulkVerifyPluginsByNode[pluginName] - - if !pluginNodesExist { - pluginNodes = make(map[types.NodeName][]*volume.Spec) - } - - volumeSpecList, nodeExists := pluginNodes[node] - if !nodeExists { - volumeSpecList = []*volume.Spec{} - } - volumeSpecList = append(volumeSpecList, volumeAttached.VolumeSpec) - pluginNodes[node] = volumeSpecList - - bulkVerifyPluginsByNode[pluginName] = pluginNodes - volumeSpecMap, mapExists := volumeSpecMapByPlugin[pluginName] - - if !mapExists { - volumeSpecMap = make(map[*volume.Spec]v1.UniqueVolumeName) - } - volumeSpecMap[volumeAttached.VolumeSpec] = volumeAttached.VolumeName - volumeSpecMapByPlugin[pluginName] = volumeSpecMap - continue - } - - // If node doesn't support Bulk volume polling it is best to poll individually - nodeError := oe.VerifyVolumesAreAttachedPerNode(nodeAttachedVolumes, node, actualStateOfWorld) - if nodeError != nil { - glog.Errorf("BulkVerifyVolumes.VerifyVolumesAreAttached verifying volumes on node %q with %v", node, nodeError) - } - break - } - } - - for pluginName, pluginNodeVolumes := range bulkVerifyPluginsByNode { - generatedOperations, err := oe.operationGenerator.GenerateBulkVolumeVerifyFunc( - pluginNodeVolumes, - pluginName, - volumeSpecMapByPlugin[pluginName], - actualStateOfWorld) - if err != nil { - glog.Errorf("BulkVerifyVolumes.GenerateBulkVolumeVerifyFunc error bulk verifying volumes for plugin %q with %v", pluginName, err) - } - - // Ugly hack to ensure - we don't do parallel bulk polling of same volume plugin - uniquePluginName := v1.UniqueVolumeName(pluginName) - err = oe.pendingOperations.Run(uniquePluginName, "" /* Pod Name */, generatedOperations) - if err != nil { - glog.Errorf("BulkVerifyVolumes.Run Error bulk volume verification for plugin %q with %v", pluginName, err) - } - } -} - -func (oe *operationExecutor) VerifyVolumesAreAttachedPerNode( - attachedVolumes []AttachedVolume, - nodeName types.NodeName, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) error { - generatedOperations, err := - oe.operationGenerator.GenerateVolumesAreAttachedFunc(attachedVolumes, nodeName, actualStateOfWorld) - if err != nil { - return err - } - - // Give an empty UniqueVolumeName so that this operation could be executed concurrently. - return oe.pendingOperations.Run("" /* volumeName */, "" /* podName */, generatedOperations) -} - -func (oe *operationExecutor) MountVolume( - waitForAttachTimeout time.Duration, - volumeToMount VolumeToMount, - actualStateOfWorld ActualStateOfWorldMounterUpdater, - isRemount bool) error { - fsVolume, err := util.CheckVolumeModeFilesystem(volumeToMount.VolumeSpec) - if err != nil { - return err - } - var generatedOperations volumetypes.GeneratedOperations - if fsVolume { - // Filesystem volume case - // Mount/remount a volume when a volume is attached - generatedOperations, err = oe.operationGenerator.GenerateMountVolumeFunc( - waitForAttachTimeout, volumeToMount, actualStateOfWorld, isRemount) - - } else { - // Block volume case - // Creates a map to device if a volume is attached - generatedOperations, err = oe.operationGenerator.GenerateMapVolumeFunc( - waitForAttachTimeout, volumeToMount, actualStateOfWorld) - } - if err != nil { - return err - } - // Avoid executing mount/map from multiple pods referencing the - // same volume in parallel - podName := nestedpendingoperations.EmptyUniquePodName - - // TODO: remove this -- not necessary - if !volumeToMount.PluginIsAttachable { - // Non-attachable volume plugins can execute mount for multiple pods - // referencing the same volume in parallel - podName = util.GetUniquePodName(volumeToMount.Pod) - } - - // TODO mount_device - return oe.pendingOperations.Run( - volumeToMount.VolumeName, podName, generatedOperations) -} - -func (oe *operationExecutor) UnmountVolume( - volumeToUnmount MountedVolume, - actualStateOfWorld ActualStateOfWorldMounterUpdater, - podsDir string) error { - fsVolume, err := util.CheckVolumeModeFilesystem(volumeToUnmount.VolumeSpec) - if err != nil { - return err - } - var generatedOperations volumetypes.GeneratedOperations - if fsVolume { - // Filesystem volume case - // Unmount a volume if a volume is mounted - generatedOperations, err = oe.operationGenerator.GenerateUnmountVolumeFunc( - volumeToUnmount, actualStateOfWorld, podsDir) - } else { - // Block volume case - // Unmap a volume if a volume is mapped - generatedOperations, err = oe.operationGenerator.GenerateUnmapVolumeFunc( - volumeToUnmount, actualStateOfWorld) - } - if err != nil { - return err - } - // All volume plugins can execute unmount/unmap for multiple pods referencing the - // same volume in parallel - podName := volumetypes.UniquePodName(volumeToUnmount.PodUID) - - return oe.pendingOperations.Run( - volumeToUnmount.VolumeName, podName, generatedOperations) -} - -func (oe *operationExecutor) UnmountDevice( - deviceToDetach AttachedVolume, - actualStateOfWorld ActualStateOfWorldMounterUpdater, - mounter mount.Interface) error { - fsVolume, err := util.CheckVolumeModeFilesystem(deviceToDetach.VolumeSpec) - if err != nil { - return err - } - var generatedOperations volumetypes.GeneratedOperations - if fsVolume { - // Filesystem volume case - // Unmount and detach a device if a volume isn't referenced - generatedOperations, err = oe.operationGenerator.GenerateUnmountDeviceFunc( - deviceToDetach, actualStateOfWorld, mounter) - } else { - // Block volume case - // Detach a device and remove loopback if a volume isn't referenced - generatedOperations, err = oe.operationGenerator.GenerateUnmapDeviceFunc( - deviceToDetach, actualStateOfWorld, mounter) - } - if err != nil { - return err - } - // Avoid executing unmount/unmap device from multiple pods referencing - // the same volume in parallel - podName := nestedpendingoperations.EmptyUniquePodName - - return oe.pendingOperations.Run( - deviceToDetach.VolumeName, podName, generatedOperations) -} - -func (oe *operationExecutor) ExpandVolume(pvcWithResizeRequest *expandcache.PVCWithResizeRequest, resizeMap expandcache.VolumeResizeMap) error { - generatedOperations, err := oe.operationGenerator.GenerateExpandVolumeFunc(pvcWithResizeRequest, resizeMap) - - if err != nil { - return err - } - uniqueVolumeKey := v1.UniqueVolumeName(pvcWithResizeRequest.UniquePVCKey()) - - return oe.pendingOperations.Run(uniqueVolumeKey, "", generatedOperations) -} - -func (oe *operationExecutor) ExpandVolumeFSWithoutUnmounting(volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater) error { - generatedOperations, err := oe.operationGenerator.GenerateExpandVolumeFSWithoutUnmountingFunc(volumeToMount, actualStateOfWorld) - if err != nil { - return err - } - return oe.pendingOperations.Run(volumeToMount.VolumeName, "", generatedOperations) -} - -func (oe *operationExecutor) VerifyControllerAttachedVolume( - volumeToMount VolumeToMount, - nodeName types.NodeName, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) error { - generatedOperations, err := - oe.operationGenerator.GenerateVerifyControllerAttachedVolumeFunc(volumeToMount, nodeName, actualStateOfWorld) - if err != nil { - return err - } - - return oe.pendingOperations.Run( - volumeToMount.VolumeName, "" /* podName */, generatedOperations) -} - -// ReconstructVolumeOperation return a func to create volumeSpec from mount path -func (oe *operationExecutor) ReconstructVolumeOperation( - volumeMode v1.PersistentVolumeMode, - plugin volume.VolumePlugin, - mapperPlugin volume.BlockVolumePlugin, - uid types.UID, - podName volumetypes.UniquePodName, - volumeSpecName string, - mountPath string, - pluginName string) (*volume.Spec, error) { - - // Filesystem Volume case - if volumeMode == v1.PersistentVolumeFilesystem { - // Create volumeSpec from mount path - glog.V(5).Infof("Starting operationExecutor.ReconstructVolumepodName") - volumeSpec, err := plugin.ConstructVolumeSpec(volumeSpecName, mountPath) - if err != nil { - return nil, err - } - return volumeSpec, nil - } - - // Block Volume case - // Create volumeSpec from mount path - glog.V(5).Infof("Starting operationExecutor.ReconstructVolume") - if mapperPlugin == nil { - return nil, fmt.Errorf("Could not find block volume plugin %q (spec.Name: %q) pod %q (UID: %q)", - pluginName, - volumeSpecName, - podName, - uid) - } - // mountPath contains volumeName on the path. In the case of block volume, {volumeName} is symbolic link - // corresponding to raw block device. - // ex. mountPath: pods/{podUid}}/{DefaultKubeletVolumeDevicesDirName}/{escapeQualifiedPluginName}/{volumeName} - volumeSpec, err := mapperPlugin.ConstructBlockVolumeSpec(uid, volumeSpecName, mountPath) - if err != nil { - return nil, err - } - return volumeSpec, nil -} - -// CheckVolumeExistenceOperation return a func() to check mount path directory if volume still exists -func (oe *operationExecutor) CheckVolumeExistenceOperation( - volumeSpec *volume.Spec, - mountPath, volumeName string, - mounter mount.Interface, - uniqueVolumeName v1.UniqueVolumeName, - podName volumetypes.UniquePodName, - podUID types.UID, - attachable volume.AttachableVolumePlugin) (bool, error) { - fsVolume, err := util.CheckVolumeModeFilesystem(volumeSpec) - if err != nil { - return false, err - } - - // Filesystem Volume case - // For attachable volume case, check mount path directory if volume is still existing and mounted. - // Return true if volume is mounted. - if fsVolume { - if attachable != nil { - var isNotMount bool - var mountCheckErr error - if isNotMount, mountCheckErr = mounter.IsLikelyNotMountPoint(mountPath); mountCheckErr != nil { - return false, fmt.Errorf("Could not check whether the volume %q (spec.Name: %q) pod %q (UID: %q) is mounted with: %v", - uniqueVolumeName, - volumeName, - podName, - podUID, - mountCheckErr) - } - return !isNotMount, nil - } - // For non-attachable volume case, skip check and return true without mount point check - // since plugins may not have volume mount point. - return true, nil - } - - // Block Volume case - // Check mount path directory if volume still exists, then return true if volume - // is there. Either plugin is attachable or non-attachable, the plugin should - // have symbolic link associated to raw block device under pod device map - // if volume exists. - blkutil := volumepathhandler.NewBlockVolumePathHandler() - var islinkExist bool - var checkErr error - if islinkExist, checkErr = blkutil.IsSymlinkExist(mountPath); checkErr != nil { - return false, fmt.Errorf("Could not check whether the block volume %q (spec.Name: %q) pod %q (UID: %q) is mapped to: %v", - uniqueVolumeName, - volumeName, - podName, - podUID, - checkErr) - } - return islinkExist, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go deleted file mode 100644 index 51f321ae..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go +++ /dev/null @@ -1,1412 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -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 operationexecutor - -import ( - "fmt" - "path" - "strings" - "time" - - "github.com/golang/glog" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - utilfeature "k8s.io/apiserver/pkg/util/feature" - clientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/tools/record" - expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" - "k8s.io/kubernetes/pkg/features" - kevents "k8s.io/kubernetes/pkg/kubelet/events" - "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/util/resizefs" - "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" - volumetypes "k8s.io/kubernetes/pkg/volume/util/types" - "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" -) - -var _ OperationGenerator = &operationGenerator{} - -type operationGenerator struct { - // Used to fetch objects from the API server like Node in the - // VerifyControllerAttachedVolume operation. - kubeClient clientset.Interface - - // volumePluginMgr is the volume plugin manager used to create volume - // plugin objects. - volumePluginMgr *volume.VolumePluginMgr - - // recorder is used to record events in the API server - recorder record.EventRecorder - - // checkNodeCapabilitiesBeforeMount, if set, enables the CanMount check, - // which verifies that the components (binaries, etc.) required to mount - // the volume are available on the underlying node before attempting mount. - checkNodeCapabilitiesBeforeMount bool - - // blkUtil provides volume path related operations for block volume - blkUtil volumepathhandler.BlockVolumePathHandler -} - -// NewOperationGenerator is returns instance of operationGenerator -func NewOperationGenerator(kubeClient clientset.Interface, - volumePluginMgr *volume.VolumePluginMgr, - recorder record.EventRecorder, - checkNodeCapabilitiesBeforeMount bool, - blkUtil volumepathhandler.BlockVolumePathHandler) OperationGenerator { - - return &operationGenerator{ - kubeClient: kubeClient, - volumePluginMgr: volumePluginMgr, - recorder: recorder, - checkNodeCapabilitiesBeforeMount: checkNodeCapabilitiesBeforeMount, - blkUtil: blkUtil, - } -} - -// OperationGenerator interface that extracts out the functions from operation_executor to make it dependency injectable -type OperationGenerator interface { - // Generates the MountVolume function needed to perform the mount of a volume plugin - GenerateMountVolumeFunc(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorldMounterUpdater ActualStateOfWorldMounterUpdater, isRemount bool) (volumetypes.GeneratedOperations, error) - - // Generates the UnmountVolume function needed to perform the unmount of a volume plugin - GenerateUnmountVolumeFunc(volumeToUnmount MountedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater, podsDir string) (volumetypes.GeneratedOperations, error) - - // Generates the AttachVolume function needed to perform attach of a volume plugin - GenerateAttachVolumeFunc(volumeToAttach VolumeToAttach, actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) - - // Generates the DetachVolume function needed to perform the detach of a volume plugin - GenerateDetachVolumeFunc(volumeToDetach AttachedVolume, verifySafeToDetach bool, actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) - - // Generates the VolumesAreAttached function needed to verify if volume plugins are attached - GenerateVolumesAreAttachedFunc(attachedVolumes []AttachedVolume, nodeName types.NodeName, actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) - - // Generates the UnMountDevice function needed to perform the unmount of a device - GenerateUnmountDeviceFunc(deviceToDetach AttachedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater, mounter mount.Interface) (volumetypes.GeneratedOperations, error) - - // Generates the function needed to check if the attach_detach controller has attached the volume plugin - GenerateVerifyControllerAttachedVolumeFunc(volumeToMount VolumeToMount, nodeName types.NodeName, actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) - - // Generates the MapVolume function needed to perform the map of a volume plugin - GenerateMapVolumeFunc(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorldMounterUpdater ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) - - // Generates the UnmapVolume function needed to perform the unmap of a volume plugin - GenerateUnmapVolumeFunc(volumeToUnmount MountedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) - - // Generates the UnmapDevice function needed to perform the unmap of a device - GenerateUnmapDeviceFunc(deviceToDetach AttachedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater, mounter mount.Interface) (volumetypes.GeneratedOperations, error) - - // GetVolumePluginMgr returns volume plugin manager - GetVolumePluginMgr() *volume.VolumePluginMgr - - GenerateBulkVolumeVerifyFunc( - map[types.NodeName][]*volume.Spec, - string, - map[*volume.Spec]v1.UniqueVolumeName, ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) - - GenerateExpandVolumeFunc(*expandcache.PVCWithResizeRequest, expandcache.VolumeResizeMap) (volumetypes.GeneratedOperations, error) - - // Generates the volume file system resize function, which can resize volume's file system to expected size without unmounting the volume. - GenerateExpandVolumeFSWithoutUnmountingFunc(volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) -} - -func (og *operationGenerator) GenerateVolumesAreAttachedFunc( - attachedVolumes []AttachedVolume, - nodeName types.NodeName, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) { - - // volumesPerPlugin maps from a volume plugin to a list of volume specs which belong - // to this type of plugin - volumesPerPlugin := make(map[string][]*volume.Spec) - // volumeSpecMap maps from a volume spec to its unique volumeName which will be used - // when calling MarkVolumeAsDetached - volumeSpecMap := make(map[*volume.Spec]v1.UniqueVolumeName) - // Iterate each volume spec and put them into a map index by the pluginName - for _, volumeAttached := range attachedVolumes { - if volumeAttached.VolumeSpec == nil { - glog.Errorf("VerifyVolumesAreAttached.GenerateVolumesAreAttachedFunc: nil spec for volume %s", volumeAttached.VolumeName) - continue - } - volumePlugin, err := - og.volumePluginMgr.FindPluginBySpec(volumeAttached.VolumeSpec) - if err != nil || volumePlugin == nil { - glog.Errorf(volumeAttached.GenerateErrorDetailed("VolumesAreAttached.FindPluginBySpec failed", err).Error()) - } - volumeSpecList, pluginExists := volumesPerPlugin[volumePlugin.GetPluginName()] - if !pluginExists { - volumeSpecList = []*volume.Spec{} - } - volumeSpecList = append(volumeSpecList, volumeAttached.VolumeSpec) - volumesPerPlugin[volumePlugin.GetPluginName()] = volumeSpecList - volumeSpecMap[volumeAttached.VolumeSpec] = volumeAttached.VolumeName - } - - volumesAreAttachedFunc := func() (error, error) { - - // For each volume plugin, pass the list of volume specs to VolumesAreAttached to check - // whether the volumes are still attached. - for pluginName, volumesSpecs := range volumesPerPlugin { - attachableVolumePlugin, err := - og.volumePluginMgr.FindAttachablePluginByName(pluginName) - if err != nil || attachableVolumePlugin == nil { - glog.Errorf( - "VolumeAreAttached.FindAttachablePluginBySpec failed for plugin %q with: %v", - pluginName, - err) - continue - } - - volumeAttacher, newAttacherErr := attachableVolumePlugin.NewAttacher() - if newAttacherErr != nil { - glog.Errorf( - "VolumesAreAttached.NewAttacher failed for getting plugin %q with: %v", - pluginName, - newAttacherErr) - continue - } - - attached, areAttachedErr := volumeAttacher.VolumesAreAttached(volumesSpecs, nodeName) - if areAttachedErr != nil { - glog.Errorf( - "VolumesAreAttached failed for checking on node %q with: %v", - nodeName, - areAttachedErr) - continue - } - - for spec, check := range attached { - if !check { - actualStateOfWorld.MarkVolumeAsDetached(volumeSpecMap[spec], nodeName) - glog.V(1).Infof("VerifyVolumesAreAttached determined volume %q (spec.Name: %q) is no longer attached to node %q, therefore it was marked as detached.", - volumeSpecMap[spec], spec.Name(), nodeName) - } - } - } - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: volumesAreAttachedFunc, - CompleteFunc: util.OperationCompleteHook("", "verify_volumes_are_attached_per_node"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil -} - -func (og *operationGenerator) GenerateBulkVolumeVerifyFunc( - pluginNodeVolumes map[types.NodeName][]*volume.Spec, - pluginName string, - volumeSpecMap map[*volume.Spec]v1.UniqueVolumeName, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) { - - bulkVolumeVerifyFunc := func() (error, error) { - attachableVolumePlugin, err := - og.volumePluginMgr.FindAttachablePluginByName(pluginName) - if err != nil || attachableVolumePlugin == nil { - glog.Errorf( - "BulkVerifyVolume.FindAttachablePluginBySpec failed for plugin %q with: %v", - pluginName, - err) - return nil, nil - } - - volumeAttacher, newAttacherErr := attachableVolumePlugin.NewAttacher() - - if newAttacherErr != nil { - glog.Errorf( - "BulkVerifyVolume.NewAttacher failed for getting plugin %q with: %v", - attachableVolumePlugin, - newAttacherErr) - return nil, nil - } - bulkVolumeVerifier, ok := volumeAttacher.(volume.BulkVolumeVerifier) - - if !ok { - glog.Errorf("BulkVerifyVolume failed to type assert attacher %q", bulkVolumeVerifier) - return nil, nil - } - - attached, bulkAttachErr := bulkVolumeVerifier.BulkVerifyVolumes(pluginNodeVolumes) - if bulkAttachErr != nil { - glog.Errorf("BulkVerifyVolume.BulkVerifyVolumes Error checking volumes are attached with %v", bulkAttachErr) - return nil, nil - } - - for nodeName, volumeSpecs := range pluginNodeVolumes { - for _, volumeSpec := range volumeSpecs { - nodeVolumeSpecs, nodeChecked := attached[nodeName] - - if !nodeChecked { - glog.V(2).Infof("VerifyVolumesAreAttached.BulkVerifyVolumes failed for node %q and leaving volume %q as attached", - nodeName, - volumeSpec.Name()) - continue - } - - check := nodeVolumeSpecs[volumeSpec] - - if !check { - glog.V(2).Infof("VerifyVolumesAreAttached.BulkVerifyVolumes failed for node %q and volume %q", - nodeName, - volumeSpec.Name()) - actualStateOfWorld.MarkVolumeAsDetached(volumeSpecMap[volumeSpec], nodeName) - } - } - } - - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: bulkVolumeVerifyFunc, - CompleteFunc: util.OperationCompleteHook(pluginName, "verify_volumes_are_attached"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil - -} - -func (og *operationGenerator) GenerateAttachVolumeFunc( - volumeToAttach VolumeToAttach, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) { - // Get attacher plugin - eventRecorderFunc := func(err *error) { - if *err != nil { - for _, pod := range volumeToAttach.ScheduledPods { - og.recorder.Eventf(pod, v1.EventTypeWarning, kevents.FailedAttachVolume, (*err).Error()) - } - } - } - - attachableVolumePlugin, err := - og.volumePluginMgr.FindAttachablePluginBySpec(volumeToAttach.VolumeSpec) - if err != nil || attachableVolumePlugin == nil { - eventRecorderFunc(&err) - return volumetypes.GeneratedOperations{}, volumeToAttach.GenerateErrorDetailed("AttachVolume.FindAttachablePluginBySpec failed", err) - } - - volumeAttacher, newAttacherErr := attachableVolumePlugin.NewAttacher() - if newAttacherErr != nil { - eventRecorderFunc(&err) - return volumetypes.GeneratedOperations{}, volumeToAttach.GenerateErrorDetailed("AttachVolume.NewAttacher failed", newAttacherErr) - } - - attachVolumeFunc := func() (error, error) { - // Execute attach - devicePath, attachErr := volumeAttacher.Attach( - volumeToAttach.VolumeSpec, volumeToAttach.NodeName) - - if attachErr != nil { - if derr, ok := attachErr.(*util.DanglingAttachError); ok { - addErr := actualStateOfWorld.MarkVolumeAsAttached( - v1.UniqueVolumeName(""), - volumeToAttach.VolumeSpec, - derr.CurrentNode, - derr.DevicePath) - - if addErr != nil { - glog.Errorf("AttachVolume.MarkVolumeAsAttached failed to fix dangling volume error for volume %q with %s", volumeToAttach.VolumeName, addErr) - } - - } - // On failure, return error. Caller will log and retry. - return volumeToAttach.GenerateError("AttachVolume.Attach failed", attachErr) - } - - // Successful attach event is useful for user debugging - simpleMsg, _ := volumeToAttach.GenerateMsg("AttachVolume.Attach succeeded", "") - for _, pod := range volumeToAttach.ScheduledPods { - og.recorder.Eventf(pod, v1.EventTypeNormal, kevents.SuccessfulAttachVolume, simpleMsg) - } - glog.Infof(volumeToAttach.GenerateMsgDetailed("AttachVolume.Attach succeeded", "")) - - // Update actual state of world - addVolumeNodeErr := actualStateOfWorld.MarkVolumeAsAttached( - v1.UniqueVolumeName(""), volumeToAttach.VolumeSpec, volumeToAttach.NodeName, devicePath) - if addVolumeNodeErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToAttach.GenerateError("AttachVolume.MarkVolumeAsAttached failed", addVolumeNodeErr) - } - - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: attachVolumeFunc, - EventRecorderFunc: eventRecorderFunc, - CompleteFunc: util.OperationCompleteHook(attachableVolumePlugin.GetPluginName(), "volume_attach"), - }, nil -} - -func (og *operationGenerator) GetVolumePluginMgr() *volume.VolumePluginMgr { - return og.volumePluginMgr -} - -func (og *operationGenerator) GenerateDetachVolumeFunc( - volumeToDetach AttachedVolume, - verifySafeToDetach bool, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) { - var volumeName string - var attachableVolumePlugin volume.AttachableVolumePlugin - var pluginName string - var err error - - if volumeToDetach.VolumeSpec != nil { - // Get attacher plugin - attachableVolumePlugin, err = - og.volumePluginMgr.FindAttachablePluginBySpec(volumeToDetach.VolumeSpec) - if err != nil || attachableVolumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToDetach.GenerateErrorDetailed("DetachVolume.FindAttachablePluginBySpec failed", err) - } - - volumeName, err = - attachableVolumePlugin.GetVolumeName(volumeToDetach.VolumeSpec) - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToDetach.GenerateErrorDetailed("DetachVolume.GetVolumeName failed", err) - } - } else { - // Get attacher plugin and the volumeName by splitting the volume unique name in case - // there's no VolumeSpec: this happens only on attach/detach controller crash recovery - // when a pod has been deleted during the controller downtime - pluginName, volumeName, err = util.SplitUniqueName(volumeToDetach.VolumeName) - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToDetach.GenerateErrorDetailed("DetachVolume.SplitUniqueName failed", err) - } - attachableVolumePlugin, err = og.volumePluginMgr.FindAttachablePluginByName(pluginName) - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToDetach.GenerateErrorDetailed("DetachVolume.FindAttachablePluginBySpec failed", err) - } - } - - if pluginName == "" { - pluginName = attachableVolumePlugin.GetPluginName() - } - - volumeDetacher, err := attachableVolumePlugin.NewDetacher() - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToDetach.GenerateErrorDetailed("DetachVolume.NewDetacher failed", err) - } - - getVolumePluginMgrFunc := func() (error, error) { - var err error - if verifySafeToDetach { - err = og.verifyVolumeIsSafeToDetach(volumeToDetach) - } - if err == nil { - err = volumeDetacher.Detach(volumeName, volumeToDetach.NodeName) - } - if err != nil { - // On failure, add volume back to ReportAsAttached list - actualStateOfWorld.AddVolumeToReportAsAttached( - volumeToDetach.VolumeName, volumeToDetach.NodeName) - return volumeToDetach.GenerateError("DetachVolume.Detach failed", err) - } - - glog.Infof(volumeToDetach.GenerateMsgDetailed("DetachVolume.Detach succeeded", "")) - - // Update actual state of world - actualStateOfWorld.MarkVolumeAsDetached( - volumeToDetach.VolumeName, volumeToDetach.NodeName) - - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: getVolumePluginMgrFunc, - CompleteFunc: util.OperationCompleteHook(pluginName, "volume_detach"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil -} - -func (og *operationGenerator) GenerateMountVolumeFunc( - waitForAttachTimeout time.Duration, - volumeToMount VolumeToMount, - actualStateOfWorld ActualStateOfWorldMounterUpdater, - isRemount bool) (volumetypes.GeneratedOperations, error) { - // Get mounter plugin - volumePlugin, err := - og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec) - if err != nil || volumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MountVolume.FindPluginBySpec failed", err) - } - - affinityErr := checkNodeAffinity(og, volumeToMount, volumePlugin) - if affinityErr != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.NodeAffinity check failed", affinityErr) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } - - volumeMounter, newMounterErr := volumePlugin.NewMounter( - volumeToMount.VolumeSpec, - volumeToMount.Pod, - volume.VolumeOptions{}) - if newMounterErr != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.NewMounter initialization failed", newMounterErr) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } - - mountCheckError := checkMountOptionSupport(og, volumeToMount, volumePlugin) - - if mountCheckError != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MountVolume.MountOptionSupport check failed", mountCheckError) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.UnsupportedMountOption, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } - - // Get attacher, if possible - attachableVolumePlugin, _ := - og.volumePluginMgr.FindAttachablePluginBySpec(volumeToMount.VolumeSpec) - var volumeAttacher volume.Attacher - if attachableVolumePlugin != nil { - volumeAttacher, _ = attachableVolumePlugin.NewAttacher() - } - - var fsGroup *int64 - if volumeToMount.Pod.Spec.SecurityContext != nil && - volumeToMount.Pod.Spec.SecurityContext.FSGroup != nil { - fsGroup = volumeToMount.Pod.Spec.SecurityContext.FSGroup - } - - mountVolumeFunc := func() (error, error) { - if volumeAttacher != nil { - // Wait for attachable volumes to finish attaching - glog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.WaitForAttach entering", fmt.Sprintf("DevicePath %q", volumeToMount.DevicePath))) - - devicePath, err := volumeAttacher.WaitForAttach( - volumeToMount.VolumeSpec, volumeToMount.DevicePath, volumeToMount.Pod, waitForAttachTimeout) - if err != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.WaitForAttach failed", err) - } - - glog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.WaitForAttach succeeded", fmt.Sprintf("DevicePath %q", devicePath))) - - deviceMountPath, err := - volumeAttacher.GetDeviceMountPath(volumeToMount.VolumeSpec) - if err != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.GetDeviceMountPath failed", err) - } - - // Mount device to global mount path - err = volumeAttacher.MountDevice( - volumeToMount.VolumeSpec, - devicePath, - deviceMountPath) - if err != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.MountDevice failed", err) - } - - glog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.MountDevice succeeded", fmt.Sprintf("device mount path %q", deviceMountPath))) - - // Update actual state of world to reflect volume is globally mounted - markDeviceMountedErr := actualStateOfWorld.MarkDeviceAsMounted( - volumeToMount.VolumeName, devicePath, deviceMountPath) - if markDeviceMountedErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.MarkDeviceAsMounted failed", markDeviceMountedErr) - } - - // resizeFileSystem will resize the file system if user has requested a resize of - // underlying persistent volume and is allowed to do so. - resizeSimpleError, resizeDetailedError := og.resizeFileSystem(volumeToMount, devicePath, deviceMountPath, volumePlugin.GetPluginName()) - - if resizeSimpleError != nil || resizeDetailedError != nil { - return resizeSimpleError, resizeDetailedError - } - - } - - if og.checkNodeCapabilitiesBeforeMount { - if canMountErr := volumeMounter.CanMount(); canMountErr != nil { - err = fmt.Errorf( - "Verify that your node machine has the required components before attempting to mount this volume type. %s", - canMountErr) - return volumeToMount.GenerateError("MountVolume.CanMount failed", err) - } - } - - // Execute mount - mountErr := volumeMounter.SetUp(fsGroup) - if mountErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.SetUp failed", mountErr) - } - - _, detailedMsg := volumeToMount.GenerateMsg("MountVolume.SetUp succeeded", "") - verbosity := glog.Level(1) - if isRemount { - verbosity = glog.Level(4) - } - glog.V(verbosity).Infof(detailedMsg) - - // Update actual state of world - markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted( - volumeToMount.PodName, - volumeToMount.Pod.UID, - volumeToMount.VolumeName, - volumeMounter, - nil, - volumeToMount.OuterVolumeSpecName, - volumeToMount.VolumeGidValue, - volumeToMount.VolumeSpec) - if markVolMountedErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MountVolume.MarkVolumeAsMounted failed", markVolMountedErr) - } - - return nil, nil - } - - eventRecorderFunc := func(err *error) { - if *err != nil { - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, (*err).Error()) - } - } - - return volumetypes.GeneratedOperations{ - OperationFunc: mountVolumeFunc, - EventRecorderFunc: eventRecorderFunc, - CompleteFunc: util.OperationCompleteHook(volumePlugin.GetPluginName(), "volume_mount"), - }, nil -} - -func (og *operationGenerator) resizeFileSystem(volumeToMount VolumeToMount, devicePath, deviceMountPath, pluginName string) (simpleErr, detailedErr error) { - if !utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { - glog.V(4).Infof("Resizing is not enabled for this volume %s", volumeToMount.VolumeName) - return nil, nil - } - - mounter := og.volumePluginMgr.Host.GetMounter(pluginName) - // Get expander, if possible - expandableVolumePlugin, _ := - og.volumePluginMgr.FindExpandablePluginBySpec(volumeToMount.VolumeSpec) - - if expandableVolumePlugin != nil && - expandableVolumePlugin.RequiresFSResize() && - volumeToMount.VolumeSpec.PersistentVolume != nil { - pv := volumeToMount.VolumeSpec.PersistentVolume - pvc, err := og.kubeClient.CoreV1().PersistentVolumeClaims(pv.Spec.ClaimRef.Namespace).Get(pv.Spec.ClaimRef.Name, metav1.GetOptions{}) - if err != nil { - // Return error rather than leave the file system un-resized, caller will log and retry - return volumeToMount.GenerateError("MountVolume.resizeFileSystem get PVC failed", err) - } - - pvcStatusCap := pvc.Status.Capacity[v1.ResourceStorage] - pvSpecCap := pv.Spec.Capacity[v1.ResourceStorage] - if pvcStatusCap.Cmp(pvSpecCap) < 0 { - // File system resize was requested, proceed - glog.V(4).Infof(volumeToMount.GenerateMsgDetailed("MountVolume.resizeFileSystem entering", fmt.Sprintf("DevicePath %q", volumeToMount.DevicePath))) - - if volumeToMount.VolumeSpec.ReadOnly { - simpleMsg, detailedMsg := volumeToMount.GenerateMsg("MountVolume.resizeFileSystem failed", "requested read-only file system") - glog.Warningf(detailedMsg) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FileSystemResizeFailed, simpleMsg) - return nil, nil - } - - diskFormatter := &mount.SafeFormatAndMount{ - Interface: mounter, - Exec: og.volumePluginMgr.Host.GetExec(expandableVolumePlugin.GetPluginName()), - } - - resizer := resizefs.NewResizeFs(diskFormatter) - resizeStatus, resizeErr := resizer.Resize(devicePath, deviceMountPath) - - if resizeErr != nil { - return volumeToMount.GenerateError("MountVolume.resizeFileSystem failed", resizeErr) - } - - if resizeStatus { - simpleMsg, detailedMsg := volumeToMount.GenerateMsg("MountVolume.resizeFileSystem succeeded", "") - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeNormal, kevents.FileSystemResizeSuccess, simpleMsg) - glog.Infof(detailedMsg) - } - - // File system resize succeeded, now update the PVC's Capacity to match the PV's - err = util.MarkFSResizeFinished(pvc, pv.Spec.Capacity, og.kubeClient) - if err != nil { - // On retry, resizeFileSystem will be called again but do nothing - return volumeToMount.GenerateError("MountVolume.resizeFileSystem update PVC status failed", err) - } - return nil, nil - } - } - return nil, nil -} - -func (og *operationGenerator) GenerateUnmountVolumeFunc( - volumeToUnmount MountedVolume, - actualStateOfWorld ActualStateOfWorldMounterUpdater, - podsDir string) (volumetypes.GeneratedOperations, error) { - // Get mountable plugin - volumePlugin, err := - og.volumePluginMgr.FindPluginByName(volumeToUnmount.PluginName) - if err != nil || volumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmountVolume.FindPluginByName failed", err) - } - - volumeUnmounter, newUnmounterErr := volumePlugin.NewUnmounter( - volumeToUnmount.InnerVolumeSpecName, volumeToUnmount.PodUID) - if newUnmounterErr != nil { - return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmountVolume.NewUnmounter failed", newUnmounterErr) - } - - unmountVolumeFunc := func() (error, error) { - mounter := og.volumePluginMgr.Host.GetMounter(volumeToUnmount.PluginName) - - // Remove all bind-mounts for subPaths - podDir := path.Join(podsDir, string(volumeToUnmount.PodUID)) - if err := mounter.CleanSubPaths(podDir, volumeToUnmount.InnerVolumeSpecName); err != nil { - return volumeToUnmount.GenerateError("error cleaning subPath mounts", err) - } - - // Execute unmount - unmountErr := volumeUnmounter.TearDown() - if unmountErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToUnmount.GenerateError("UnmountVolume.TearDown failed", unmountErr) - } - - glog.Infof( - "UnmountVolume.TearDown succeeded for volume %q (OuterVolumeSpecName: %q) pod %q (UID: %q). InnerVolumeSpecName %q. PluginName %q, VolumeGidValue %q", - volumeToUnmount.VolumeName, - volumeToUnmount.OuterVolumeSpecName, - volumeToUnmount.PodName, - volumeToUnmount.PodUID, - volumeToUnmount.InnerVolumeSpecName, - volumeToUnmount.PluginName, - volumeToUnmount.VolumeGidValue) - - // Update actual state of world - markVolMountedErr := actualStateOfWorld.MarkVolumeAsUnmounted( - volumeToUnmount.PodName, volumeToUnmount.VolumeName) - if markVolMountedErr != nil { - // On failure, just log and exit - glog.Errorf(volumeToUnmount.GenerateErrorDetailed("UnmountVolume.MarkVolumeAsUnmounted failed", markVolMountedErr).Error()) - } - - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: unmountVolumeFunc, - CompleteFunc: util.OperationCompleteHook(volumePlugin.GetPluginName(), "volume_unmount"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil -} - -func (og *operationGenerator) GenerateUnmountDeviceFunc( - deviceToDetach AttachedVolume, - actualStateOfWorld ActualStateOfWorldMounterUpdater, - mounter mount.Interface) (volumetypes.GeneratedOperations, error) { - // Get attacher plugin - attachableVolumePlugin, err := - og.volumePluginMgr.FindAttachablePluginByName(deviceToDetach.PluginName) - if err != nil || attachableVolumePlugin == nil { - return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmountDevice.FindAttachablePluginBySpec failed", err) - } - - volumeDetacher, err := attachableVolumePlugin.NewDetacher() - if err != nil { - return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmountDevice.NewDetacher failed", err) - } - unmountDeviceFunc := func() (error, error) { - deviceMountPath := deviceToDetach.DeviceMountPath - refs, err := attachableVolumePlugin.GetDeviceMountRefs(deviceMountPath) - - if err != nil || mount.HasMountRefs(deviceMountPath, refs) { - if err == nil { - err = fmt.Errorf("The device mount path %q is still mounted by other references %v", deviceMountPath, refs) - } - return deviceToDetach.GenerateError("GetDeviceMountRefs check failed", err) - } - // Execute unmount - unmountDeviceErr := volumeDetacher.UnmountDevice(deviceMountPath) - if unmountDeviceErr != nil { - // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("UnmountDevice failed", unmountDeviceErr) - } - // Before logging that UnmountDevice succeeded and moving on, - // use mounter.PathIsDevice to check if the path is a device, - // if so use mounter.DeviceOpened to check if the device is in use anywhere - // else on the system. Retry if it returns true. - deviceOpened, deviceOpenedErr := isDeviceOpened(deviceToDetach, mounter) - if deviceOpenedErr != nil { - return nil, deviceOpenedErr - } - // The device is still in use elsewhere. Caller will log and retry. - if deviceOpened { - return deviceToDetach.GenerateError( - "UnmountDevice failed", - fmt.Errorf("the device is in use when it was no longer expected to be in use")) - } - - glog.Infof(deviceToDetach.GenerateMsg("UnmountDevice succeeded", "")) - - // Update actual state of world - markDeviceUnmountedErr := actualStateOfWorld.MarkDeviceAsUnmounted( - deviceToDetach.VolumeName) - if markDeviceUnmountedErr != nil { - // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("MarkDeviceAsUnmounted failed", markDeviceUnmountedErr) - } - - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: unmountDeviceFunc, - CompleteFunc: util.OperationCompleteHook(attachableVolumePlugin.GetPluginName(), "unmount_device"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil -} - -// GenerateMapVolumeFunc marks volume as mounted based on following steps. -// If plugin is attachable, call WaitForAttach() and then mark the device -// as mounted. On next step, SetUpDevice is called without dependent of -// plugin type, but this method mainly is targeted for none attachable plugin. -// After setup is done, create symbolic links on both global map path and pod -// device map path. Once symbolic links are created, take fd lock by -// loopback for the device to avoid silent volume replacement. This lock -// will be realased once no one uses the device. -// If all steps are completed, the volume is marked as mounted. -func (og *operationGenerator) GenerateMapVolumeFunc( - waitForAttachTimeout time.Duration, - volumeToMount VolumeToMount, - actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) { - - // Get block volume mapper plugin - var blockVolumeMapper volume.BlockVolumeMapper - blockVolumePlugin, err := - og.volumePluginMgr.FindMapperPluginBySpec(volumeToMount.VolumeSpec) - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed", err) - } - if blockVolumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("MapVolume.FindMapperPluginBySpec failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) - } - affinityErr := checkNodeAffinity(og, volumeToMount, blockVolumePlugin) - if affinityErr != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.NodeAffinity check failed", affinityErr) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMountVolume, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } - blockVolumeMapper, newMapperErr := blockVolumePlugin.NewBlockVolumeMapper( - volumeToMount.VolumeSpec, - volumeToMount.Pod, - volume.VolumeOptions{}) - if newMapperErr != nil { - eventErr, detailedErr := volumeToMount.GenerateError("MapVolume.NewBlockVolumeMapper initialization failed", newMapperErr) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMapVolume, eventErr.Error()) - return volumetypes.GeneratedOperations{}, detailedErr - } - - // Get attacher, if possible - attachableVolumePlugin, _ := - og.volumePluginMgr.FindAttachablePluginBySpec(volumeToMount.VolumeSpec) - var volumeAttacher volume.Attacher - if attachableVolumePlugin != nil { - volumeAttacher, _ = attachableVolumePlugin.NewAttacher() - } - - mapVolumeFunc := func() (error, error) { - var devicePath string - // Set up global map path under the given plugin directory using symbolic link - globalMapPath, err := - blockVolumeMapper.GetGlobalMapPath(volumeToMount.VolumeSpec) - if err != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.GetDeviceMountPath failed", err) - } - if volumeAttacher != nil { - // Wait for attachable volumes to finish attaching - glog.Infof(volumeToMount.GenerateMsgDetailed("MapVolume.WaitForAttach entering", fmt.Sprintf("DevicePath %q", volumeToMount.DevicePath))) - - devicePath, err = volumeAttacher.WaitForAttach( - volumeToMount.VolumeSpec, volumeToMount.DevicePath, volumeToMount.Pod, waitForAttachTimeout) - if err != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.WaitForAttach failed", err) - } - - glog.Infof(volumeToMount.GenerateMsgDetailed("MapVolume.WaitForAttach succeeded", fmt.Sprintf("DevicePath %q", devicePath))) - - } - // A plugin doesn't have attacher also needs to map device to global map path with SetUpDevice() - pluginDevicePath, mapErr := blockVolumeMapper.SetUpDevice() - if mapErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.SetUp failed", mapErr) - } - - // if pluginDevicePath is provided, assume attacher may not provide device - // or attachment flow uses SetupDevice to get device path - if len(pluginDevicePath) != 0 { - devicePath = pluginDevicePath - } - if len(devicePath) == 0 { - return volumeToMount.GenerateError("MapVolume failed", fmt.Errorf("Device path of the volume is empty")) - } - - // Map device to global and pod device map path - volumeMapPath, volName := blockVolumeMapper.GetPodDeviceMapPath() - mapErr = blockVolumeMapper.MapDevice(devicePath, globalMapPath, volumeMapPath, volName, volumeToMount.Pod.UID) - if mapErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.MapDevice failed", mapErr) - } - - // Take filedescriptor lock to keep a block device opened. Otherwise, there is a case - // that the block device is silently removed and attached another device with same name. - // Container runtime can't handler this problem. To avoid unexpected condition fd lock - // for the block device is required. - _, err = og.blkUtil.AttachFileDevice(devicePath) - if err != nil { - return volumeToMount.GenerateError("MapVolume.AttachFileDevice failed", err) - } - - // Update actual state of world to reflect volume is globally mounted - markDeviceMappedErr := actualStateOfWorld.MarkDeviceAsMounted( - volumeToMount.VolumeName, devicePath, globalMapPath) - if markDeviceMappedErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.MarkDeviceAsMounted failed", markDeviceMappedErr) - } - - // Device mapping for global map path succeeded - simpleMsg, detailedMsg := volumeToMount.GenerateMsg("MapVolume.MapDevice succeeded", fmt.Sprintf("globalMapPath %q", globalMapPath)) - verbosity := glog.Level(4) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeNormal, kevents.SuccessfulMountVolume, simpleMsg) - glog.V(verbosity).Infof(detailedMsg) - - // Device mapping for pod device map path succeeded - simpleMsg, detailedMsg = volumeToMount.GenerateMsg("MapVolume.MapDevice succeeded", fmt.Sprintf("volumeMapPath %q", volumeMapPath)) - verbosity = glog.Level(1) - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeNormal, kevents.SuccessfulMountVolume, simpleMsg) - glog.V(verbosity).Infof(detailedMsg) - - // Update actual state of world - markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted( - volumeToMount.PodName, - volumeToMount.Pod.UID, - volumeToMount.VolumeName, - nil, - blockVolumeMapper, - volumeToMount.OuterVolumeSpecName, - volumeToMount.VolumeGidValue, - volumeToMount.VolumeSpec) - if markVolMountedErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("MapVolume.MarkVolumeAsMounted failed", markVolMountedErr) - } - - return nil, nil - } - - eventRecorderFunc := func(err *error) { - if *err != nil { - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FailedMapVolume, (*err).Error()) - } - } - - return volumetypes.GeneratedOperations{ - OperationFunc: mapVolumeFunc, - EventRecorderFunc: eventRecorderFunc, - CompleteFunc: util.OperationCompleteHook(blockVolumePlugin.GetPluginName(), "map_volume"), - }, nil -} - -// GenerateUnmapVolumeFunc marks volume as unmonuted based on following steps. -// Remove symbolic links from pod device map path dir and global map path dir. -// Once those cleanups are done, remove pod device map path dir. -// If all steps are completed, the volume is marked as unmounted. -func (og *operationGenerator) GenerateUnmapVolumeFunc( - volumeToUnmount MountedVolume, - actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) { - - // Get block volume unmapper plugin - var blockVolumeUnmapper volume.BlockVolumeUnmapper - blockVolumePlugin, err := - og.volumePluginMgr.FindMapperPluginByName(volumeToUnmount.PluginName) - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed", err) - } - if blockVolumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) - } - blockVolumeUnmapper, newUnmapperErr := blockVolumePlugin.NewBlockVolumeUnmapper( - volumeToUnmount.InnerVolumeSpecName, volumeToUnmount.PodUID) - if newUnmapperErr != nil { - return volumetypes.GeneratedOperations{}, volumeToUnmount.GenerateErrorDetailed("UnmapVolume.NewUnmapper failed", newUnmapperErr) - } - - unmapVolumeFunc := func() (error, error) { - // Try to unmap volumeName symlink under pod device map path dir - // pods/{podUid}/volumeDevices/{escapeQualifiedPluginName}/{volumeName} - podDeviceUnmapPath, volName := blockVolumeUnmapper.GetPodDeviceMapPath() - unmapDeviceErr := og.blkUtil.UnmapDevice(podDeviceUnmapPath, volName) - if unmapDeviceErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToUnmount.GenerateError("UnmapVolume.UnmapDevice on pod device map path failed", unmapDeviceErr) - } - // Try to unmap podUID symlink under global map path dir - // plugins/kubernetes.io/{PluginName}/volumeDevices/{volumePluginDependentPath}/{podUID} - globalUnmapPath := volumeToUnmount.DeviceMountPath - unmapDeviceErr = og.blkUtil.UnmapDevice(globalUnmapPath, string(volumeToUnmount.PodUID)) - if unmapDeviceErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToUnmount.GenerateError("UnmapVolume.UnmapDevice on global map path failed", unmapDeviceErr) - } - - glog.Infof( - "UnmapVolume succeeded for volume %q (OuterVolumeSpecName: %q) pod %q (UID: %q). InnerVolumeSpecName %q. PluginName %q, VolumeGidValue %q", - volumeToUnmount.VolumeName, - volumeToUnmount.OuterVolumeSpecName, - volumeToUnmount.PodName, - volumeToUnmount.PodUID, - volumeToUnmount.InnerVolumeSpecName, - volumeToUnmount.PluginName, - volumeToUnmount.VolumeGidValue) - - // Update actual state of world - markVolUnmountedErr := actualStateOfWorld.MarkVolumeAsUnmounted( - volumeToUnmount.PodName, volumeToUnmount.VolumeName) - if markVolUnmountedErr != nil { - // On failure, just log and exit - glog.Errorf(volumeToUnmount.GenerateErrorDetailed("UnmapVolume.MarkVolumeAsUnmounted failed", markVolUnmountedErr).Error()) - } - - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: unmapVolumeFunc, - CompleteFunc: util.OperationCompleteHook(blockVolumePlugin.GetPluginName(), "unmap_volume"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil -} - -// GenerateUnmapDeviceFunc marks device as unmounted based on following steps. -// Check under globalMapPath dir if there isn't pod's symbolic links in it. -// If symbolick link isn't there, the device isn't referenced from Pods. -// Call plugin TearDownDevice to clean-up device connection, stored data under -// globalMapPath, these operations depend on plugin implementation. -// Once TearDownDevice is completed, remove globalMapPath dir. -// After globalMapPath is removed, fd lock by loopback for the device can -// be released safely because no one can consume the device at this point. -// At last, device open status will be checked just in case. -// If all steps are completed, the device is marked as unmounted. -func (og *operationGenerator) GenerateUnmapDeviceFunc( - deviceToDetach AttachedVolume, - actualStateOfWorld ActualStateOfWorldMounterUpdater, - mounter mount.Interface) (volumetypes.GeneratedOperations, error) { - - blockVolumePlugin, err := - og.volumePluginMgr.FindMapperPluginByName(deviceToDetach.PluginName) - if err != nil { - return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed", err) - } - if blockVolumePlugin == nil { - return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.FindMapperPluginByName failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) - } - - blockVolumeUnmapper, newUnmapperErr := blockVolumePlugin.NewBlockVolumeUnmapper( - string(deviceToDetach.VolumeName), - "" /* podUID */) - if newUnmapperErr != nil { - return volumetypes.GeneratedOperations{}, deviceToDetach.GenerateErrorDetailed("UnmapDevice.NewUnmapper failed", newUnmapperErr) - } - - unmapDeviceFunc := func() (error, error) { - // Search under globalMapPath dir if all symbolic links from pods have been removed already. - // If symbolick links are there, pods may still refer the volume. - globalMapPath := deviceToDetach.DeviceMountPath - refs, err := og.blkUtil.GetDeviceSymlinkRefs(deviceToDetach.DevicePath, globalMapPath) - if err != nil { - return deviceToDetach.GenerateError("UnmapDevice.GetDeviceSymlinkRefs check failed", err) - } - if len(refs) > 0 { - err = fmt.Errorf("The device %q is still referenced from other Pods %v", globalMapPath, refs) - return deviceToDetach.GenerateError("UnmapDevice failed", err) - } - - // Execute tear down device - unmapErr := blockVolumeUnmapper.TearDownDevice(globalMapPath, deviceToDetach.DevicePath) - if unmapErr != nil { - // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("UnmapDevice.TearDownDevice failed", unmapErr) - } - - // Plugin finished TearDownDevice(). Now globalMapPath dir and plugin's stored data - // on the dir are unnecessary, clean up it. - removeMapPathErr := og.blkUtil.RemoveMapPath(globalMapPath) - if removeMapPathErr != nil { - // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("UnmapDevice failed", removeMapPathErr) - } - - // The block volume is not referenced from Pods. Release file descriptor lock. - glog.V(4).Infof("UnmapDevice: deviceToDetach.DevicePath: %v", deviceToDetach.DevicePath) - loopPath, err := og.blkUtil.GetLoopDevice(deviceToDetach.DevicePath) - if err != nil { - if err.Error() == volumepathhandler.ErrDeviceNotFound { - glog.Warningf(deviceToDetach.GenerateMsgDetailed("UnmapDevice: Couldn't find loopback device which takes file descriptor lock", fmt.Sprintf("device path: %q", deviceToDetach.DevicePath))) - } else { - errInfo := "UnmapDevice.GetLoopDevice failed to get loopback device, " + fmt.Sprintf("device path: %q", deviceToDetach.DevicePath) - return deviceToDetach.GenerateError(errInfo, err) - } - } else { - if len(loopPath) != 0 { - err = og.blkUtil.RemoveLoopDevice(loopPath) - if err != nil { - return deviceToDetach.GenerateError("UnmapDevice.RemoveLoopDevice failed", err) - } - } - } - - // Before logging that UnmapDevice succeeded and moving on, - // use mounter.PathIsDevice to check if the path is a device, - // if so use mounter.DeviceOpened to check if the device is in use anywhere - // else on the system. Retry if it returns true. - deviceOpened, deviceOpenedErr := isDeviceOpened(deviceToDetach, mounter) - if deviceOpenedErr != nil { - return nil, deviceOpenedErr - } - // The device is still in use elsewhere. Caller will log and retry. - if deviceOpened { - return deviceToDetach.GenerateError( - "UnmapDevice failed", - fmt.Errorf("the device is in use when it was no longer expected to be in use")) - } - - glog.Infof(deviceToDetach.GenerateMsgDetailed("UnmapDevice succeeded", "")) - - // Update actual state of world - markDeviceUnmountedErr := actualStateOfWorld.MarkDeviceAsUnmounted( - deviceToDetach.VolumeName) - if markDeviceUnmountedErr != nil { - // On failure, return error. Caller will log and retry. - return deviceToDetach.GenerateError("MarkDeviceAsUnmounted failed", markDeviceUnmountedErr) - } - - return nil, nil - } - - return volumetypes.GeneratedOperations{ - OperationFunc: unmapDeviceFunc, - CompleteFunc: util.OperationCompleteHook(blockVolumePlugin.GetPluginName(), "unmap_device"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil -} - -func (og *operationGenerator) GenerateVerifyControllerAttachedVolumeFunc( - volumeToMount VolumeToMount, - nodeName types.NodeName, - actualStateOfWorld ActualStateOfWorldAttacherUpdater) (volumetypes.GeneratedOperations, error) { - volumePlugin, err := - og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec) - if err != nil || volumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("VerifyControllerAttachedVolume.FindPluginBySpec failed", err) - } - - verifyControllerAttachedVolumeFunc := func() (error, error) { - if !volumeToMount.PluginIsAttachable { - // If the volume does not implement the attacher interface, it is - // assumed to be attached and the actual state of the world is - // updated accordingly. - - addVolumeNodeErr := actualStateOfWorld.MarkVolumeAsAttached( - volumeToMount.VolumeName, volumeToMount.VolumeSpec, nodeName, "" /* devicePath */) - if addVolumeNodeErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("VerifyControllerAttachedVolume.MarkVolumeAsAttachedByUniqueVolumeName failed", addVolumeNodeErr) - } - - return nil, nil - } - - if !volumeToMount.ReportedInUse { - // If the given volume has not yet been added to the list of - // VolumesInUse in the node's volume status, do not proceed, return - // error. Caller will log and retry. The node status is updated - // periodically by kubelet, so it may take as much as 10 seconds - // before this clears. - // Issue #28141 to enable on demand status updates. - return volumeToMount.GenerateError("Volume has not been added to the list of VolumesInUse in the node's volume status", nil) - } - - // Fetch current node object - node, fetchErr := og.kubeClient.CoreV1().Nodes().Get(string(nodeName), metav1.GetOptions{}) - if fetchErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("VerifyControllerAttachedVolume failed fetching node from API server", fetchErr) - } - - if node == nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError( - "VerifyControllerAttachedVolume failed", - fmt.Errorf("Node object retrieved from API server is nil")) - } - - for _, attachedVolume := range node.Status.VolumesAttached { - if attachedVolume.Name == volumeToMount.VolumeName { - addVolumeNodeErr := actualStateOfWorld.MarkVolumeAsAttached( - v1.UniqueVolumeName(""), volumeToMount.VolumeSpec, nodeName, attachedVolume.DevicePath) - glog.Infof(volumeToMount.GenerateMsgDetailed("Controller attach succeeded", fmt.Sprintf("device path: %q", attachedVolume.DevicePath))) - if addVolumeNodeErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("VerifyControllerAttachedVolume.MarkVolumeAsAttached failed", addVolumeNodeErr) - } - return nil, nil - } - } - - // Volume not attached, return error. Caller will log and retry. - return volumeToMount.GenerateError("Volume not attached according to node status", nil) - } - - return volumetypes.GeneratedOperations{ - OperationFunc: verifyControllerAttachedVolumeFunc, - CompleteFunc: util.OperationCompleteHook(volumePlugin.GetPluginName(), "verify_controller_attached_volume"), - EventRecorderFunc: nil, // nil because we do not want to generate event on error - }, nil - -} - -func (og *operationGenerator) verifyVolumeIsSafeToDetach( - volumeToDetach AttachedVolume) error { - // Fetch current node object - node, fetchErr := og.kubeClient.CoreV1().Nodes().Get(string(volumeToDetach.NodeName), metav1.GetOptions{}) - if fetchErr != nil { - if errors.IsNotFound(fetchErr) { - glog.Warningf(volumeToDetach.GenerateMsgDetailed("Node not found on API server. DetachVolume will skip safe to detach check", "")) - return nil - } - - // On failure, return error. Caller will log and retry. - return volumeToDetach.GenerateErrorDetailed("DetachVolume failed fetching node from API server", fetchErr) - } - - if node == nil { - // On failure, return error. Caller will log and retry. - return volumeToDetach.GenerateErrorDetailed( - "DetachVolume failed fetching node from API server", - fmt.Errorf("node object retrieved from API server is nil")) - } - - for _, inUseVolume := range node.Status.VolumesInUse { - if inUseVolume == volumeToDetach.VolumeName { - return volumeToDetach.GenerateErrorDetailed( - "DetachVolume failed", - fmt.Errorf("volume is still in use by node, according to Node status")) - } - } - - // Volume is not marked as in use by node - glog.Infof(volumeToDetach.GenerateMsgDetailed("Verified volume is safe to detach", "")) - return nil -} - -func (og *operationGenerator) GenerateExpandVolumeFunc( - pvcWithResizeRequest *expandcache.PVCWithResizeRequest, - resizeMap expandcache.VolumeResizeMap) (volumetypes.GeneratedOperations, error) { - - volumeSpec := volume.NewSpecFromPersistentVolume(pvcWithResizeRequest.PersistentVolume, false) - - volumePlugin, err := og.volumePluginMgr.FindExpandablePluginBySpec(volumeSpec) - - if err != nil { - return volumetypes.GeneratedOperations{}, fmt.Errorf("Error finding plugin for expanding volume: %q with error %v", pvcWithResizeRequest.QualifiedName(), err) - } - if volumePlugin == nil { - return volumetypes.GeneratedOperations{}, fmt.Errorf("Can not find plugin for expanding volume: %q", pvcWithResizeRequest.QualifiedName()) - } - - expandVolumeFunc := func() (error, error) { - newSize := pvcWithResizeRequest.ExpectedSize - pvSize := pvcWithResizeRequest.PersistentVolume.Spec.Capacity[v1.ResourceStorage] - if pvSize.Cmp(newSize) < 0 { - updatedSize, expandErr := volumePlugin.ExpandVolumeDevice( - volumeSpec, - pvcWithResizeRequest.ExpectedSize, - pvcWithResizeRequest.CurrentSize) - - if expandErr != nil { - detailedErr := fmt.Errorf("Error expanding volume %q of plugin %s : %v", pvcWithResizeRequest.QualifiedName(), volumePlugin.GetPluginName(), expandErr) - return detailedErr, detailedErr - } - glog.Infof("ExpandVolume succeeded for volume %s", pvcWithResizeRequest.QualifiedName()) - newSize = updatedSize - // k8s doesn't have transactions, we can't guarantee that after updating PV - updating PVC will be - // successful, that is why all PVCs for which pvc.Spec.Size > pvc.Status.Size must be reprocessed - // until they reflect user requested size in pvc.Status.Size - updateErr := resizeMap.UpdatePVSize(pvcWithResizeRequest, newSize) - - if updateErr != nil { - detailedErr := fmt.Errorf("Error updating PV spec capacity for volume %q with : %v", pvcWithResizeRequest.QualifiedName(), updateErr) - return detailedErr, detailedErr - } - glog.Infof("ExpandVolume.UpdatePV succeeded for volume %s", pvcWithResizeRequest.QualifiedName()) - } - - // No Cloudprovider resize needed, lets mark resizing as done - // Rest of the volume expand controller code will assume PVC as *not* resized until pvc.Status.Size - // reflects user requested size. - if !volumePlugin.RequiresFSResize() { - glog.V(4).Infof("Controller resizing done for PVC %s", pvcWithResizeRequest.QualifiedName()) - err := resizeMap.MarkAsResized(pvcWithResizeRequest, newSize) - - if err != nil { - detailedErr := fmt.Errorf("Error marking pvc %s as resized : %v", pvcWithResizeRequest.QualifiedName(), err) - return detailedErr, detailedErr - } - successMsg := fmt.Sprintf("ExpandVolume succeeded for volume %s", pvcWithResizeRequest.QualifiedName()) - og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeNormal, kevents.VolumeResizeSuccess, successMsg) - } else { - err := resizeMap.MarkForFSResize(pvcWithResizeRequest) - if err != nil { - detailedErr := fmt.Errorf("Error updating pvc %s condition for fs resize : %v", pvcWithResizeRequest.QualifiedName(), err) - glog.Warning(detailedErr) - return nil, nil - } - } - return nil, nil - } - - eventRecorderFunc := func(err *error) { - if *err != nil { - og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeWarning, kevents.VolumeResizeFailed, (*err).Error()) - } - } - - return volumetypes.GeneratedOperations{ - OperationFunc: expandVolumeFunc, - EventRecorderFunc: eventRecorderFunc, - CompleteFunc: util.OperationCompleteHook(volumePlugin.GetPluginName(), "expand_volume"), - }, nil -} - -func (og *operationGenerator) GenerateExpandVolumeFSWithoutUnmountingFunc( - volumeToMount VolumeToMount, - actualStateOfWorld ActualStateOfWorldMounterUpdater) (volumetypes.GeneratedOperations, error) { - volumePlugin, err := - og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec) - if err != nil || volumePlugin == nil { - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("VolumeFSResize.FindPluginBySpec failed", err) - } - - attachableVolumePlugin, err := - og.volumePluginMgr.FindAttachablePluginBySpec(volumeToMount.VolumeSpec) - if err != nil || attachableVolumePlugin == nil { - if attachableVolumePlugin == nil { - err = fmt.Errorf("AttachableVolumePlugin is nil") - } - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("VolumeFSResize.FindAttachablePluginBySpec failed", err) - } - - volumeAttacher, err := attachableVolumePlugin.NewAttacher() - if err != nil || volumeAttacher == nil { - if volumeAttacher == nil { - err = fmt.Errorf("VolumeAttacher is nil") - } - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("VolumeFSResize.NewAttacher failed", err) - } - - deviceMountPath, err := volumeAttacher.GetDeviceMountPath(volumeToMount.VolumeSpec) - if err != nil { - return volumetypes.GeneratedOperations{}, volumeToMount.GenerateErrorDetailed("VolumeFSResize.GetDeviceMountPath failed", err) - } - - fsResizeFunc := func() (error, error) { - resizeSimpleError, resizeDetailedError := og.resizeFileSystem(volumeToMount, volumeToMount.DevicePath, deviceMountPath, volumePlugin.GetPluginName()) - if resizeSimpleError != nil || resizeDetailedError != nil { - return resizeSimpleError, resizeDetailedError - } - markFSResizedErr := actualStateOfWorld.MarkVolumeAsResized(volumeToMount.PodName, volumeToMount.VolumeName) - if markFSResizedErr != nil { - // On failure, return error. Caller will log and retry. - return volumeToMount.GenerateError("VolumeFSResize.MarkVolumeAsResized failed", markFSResizedErr) - } - return nil, nil - } - eventRecorderFunc := func(err *error) { - if *err != nil { - og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.VolumeResizeFailed, (*err).Error()) - } - } - - return volumetypes.GeneratedOperations{ - OperationFunc: fsResizeFunc, - EventRecorderFunc: eventRecorderFunc, - CompleteFunc: util.OperationCompleteHook(volumePlugin.GetPluginName(), "volume_fs_resize"), - }, nil -} - -func checkMountOptionSupport(og *operationGenerator, volumeToMount VolumeToMount, plugin volume.VolumePlugin) error { - mountOptions := util.MountOptionFromSpec(volumeToMount.VolumeSpec) - - if len(mountOptions) > 0 && !plugin.SupportsMountOption() { - return fmt.Errorf("Mount options are not supported for this volume type") - } - return nil -} - -// checkNodeAffinity looks at the PV node affinity, and checks if the node has the same corresponding labels -// This ensures that we don't mount a volume that doesn't belong to this node -func checkNodeAffinity(og *operationGenerator, volumeToMount VolumeToMount, plugin volume.VolumePlugin) error { - if !utilfeature.DefaultFeatureGate.Enabled(features.PersistentLocalVolumes) { - return nil - } - - pv := volumeToMount.VolumeSpec.PersistentVolume - if pv != nil { - nodeLabels, err := og.volumePluginMgr.Host.GetNodeLabels() - if err != nil { - return err - } - err = util.CheckNodeAffinity(pv, nodeLabels) - if err != nil { - return err - } - } - return nil -} - -// isDeviceOpened checks the device status if the device is in use anywhere else on the system -func isDeviceOpened(deviceToDetach AttachedVolume, mounter mount.Interface) (bool, error) { - isDevicePath, devicePathErr := mounter.PathIsDevice(deviceToDetach.DevicePath) - var deviceOpened bool - var deviceOpenedErr error - if !isDevicePath && devicePathErr == nil || - (devicePathErr != nil && strings.Contains(devicePathErr.Error(), "does not exist")) { - // not a device path or path doesn't exist - //TODO: refer to #36092 - glog.V(3).Infof("The path isn't device path or doesn't exist. Skip checking device path: %s", deviceToDetach.DevicePath) - deviceOpened = false - } else { - deviceOpened, deviceOpenedErr = mounter.DeviceOpened(deviceToDetach.DevicePath) - if deviceOpenedErr != nil { - return false, deviceToDetach.GenerateErrorDetailed("DeviceOpened failed", deviceOpenedErr) - } - } - return deviceOpened, nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD index e65ad6c9..e43b35af 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/recyclerclient/BUILD @@ -6,13 +6,13 @@ go_library( importpath = "k8s.io/kubernetes/pkg/volume/util/recyclerclient", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], ) @@ -22,10 +22,10 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD index e6be9eb1..919ee30f 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/types/BUILD @@ -9,7 +9,7 @@ go_library( name = "go_default_library", srcs = ["types.go"], importpath = "k8s.io/kubernetes/pkg/volume/util/types", - deps = ["//vendor/k8s.io/apimachinery/pkg/types:go_default_library"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/types:go_default_library"], ) filegroup( diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/util.go b/vendor/k8s.io/kubernetes/pkg/volume/util/util.go index 1e7b7093..72d9a781 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/util.go @@ -39,6 +39,7 @@ import ( "k8s.io/kubernetes/pkg/features" kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" "k8s.io/kubernetes/pkg/util/mount" + utilstrings "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/volume" "reflect" @@ -79,6 +80,16 @@ const ( VolumeDynamicallyCreatedByKey = "kubernetes.io/createdby" ) +// VolumeZoneConfig contains config information about zonal volume. +type VolumeZoneConfig struct { + ZonePresent bool + ZonesPresent bool + ReplicaZoneFromNodePresent bool + Zone string + Zones string + ReplicaZoneFromNode string +} + // IsReady checks for the existence of a regular file // called 'ready' in the given directory and returns // true if that file exists. @@ -132,7 +143,7 @@ func UnmountMountPoint(mountPath string, mounter mount.Interface, extensiveMount glog.Warningf("Warning: Unmount skipped because path does not exist: %v", mountPath) return nil } - corruptedMnt := isCorruptedMnt(pathErr) + corruptedMnt := IsCorruptedMnt(pathErr) if pathErr != nil && !corruptedMnt { return fmt.Errorf("Error checking path: %v", pathErr) } @@ -188,15 +199,15 @@ func PathExists(path string) (bool, error) { return true, nil } else if os.IsNotExist(err) { return false, nil - } else if isCorruptedMnt(err) { + } else if IsCorruptedMnt(err) { return true, err } else { return false, err } } -// isCorruptedMnt return true if err is about corrupted mount point -func isCorruptedMnt(err error) bool { +// IsCorruptedMnt return true if err is about corrupted mount point +func IsCorruptedMnt(err error) bool { if err == nil { return false } @@ -211,7 +222,8 @@ func isCorruptedMnt(err error) bool { case *os.SyscallError: underlyingError = pe.Err } - return underlyingError == syscall.ENOTCONN || underlyingError == syscall.ESTALE + + return underlyingError == syscall.ENOTCONN || underlyingError == syscall.ESTALE || underlyingError == syscall.EIO } // GetSecretForPod locates secret by name in the pod's namespace and returns secret map @@ -308,13 +320,128 @@ func LoadPodFromFile(filePath string) (*v1.Pod, error) { return pod, nil } +// SelectZoneForVolume is a wrapper around SelectZonesForVolume +// to select a single zone for a volume based on parameters +func SelectZoneForVolume(zoneParameterPresent, zonesParameterPresent bool, zoneParameter string, zonesParameter, zonesWithNodes sets.String, node *v1.Node, allowedTopologies []v1.TopologySelectorTerm, pvcName string) (string, error) { + zones, err := SelectZonesForVolume(zoneParameterPresent, zonesParameterPresent, zoneParameter, zonesParameter, zonesWithNodes, node, allowedTopologies, pvcName, 1) + if err != nil { + return "", err + } + zone, ok := zones.PopAny() + if !ok { + return "", fmt.Errorf("could not determine a zone to provision volume in") + } + return zone, nil +} + +// SelectZonesForVolume selects zones for a volume based on several factors: +// node.zone, allowedTopologies, zone/zones parameters from storageclass, +// zones with active nodes from the cluster. The number of zones = replicas. +func SelectZonesForVolume(zoneParameterPresent, zonesParameterPresent bool, zoneParameter string, zonesParameter, zonesWithNodes sets.String, node *v1.Node, allowedTopologies []v1.TopologySelectorTerm, pvcName string, numReplicas uint32) (sets.String, error) { + if zoneParameterPresent && zonesParameterPresent { + return nil, fmt.Errorf("both zone and zones StorageClass parameters must not be used at the same time") + } + + var zoneFromNode string + // pick one zone from node if present + if node != nil { + // VolumeScheduling implicit since node is not nil + if zoneParameterPresent || zonesParameterPresent { + return nil, fmt.Errorf("zone[s] cannot be specified in StorageClass if VolumeBindingMode is set to WaitForFirstConsumer. Please specify allowedTopologies in StorageClass for constraining zones") + } + + // pick node's zone for one of the replicas + var ok bool + zoneFromNode, ok = node.ObjectMeta.Labels[kubeletapis.LabelZoneFailureDomain] + if !ok { + return nil, fmt.Errorf("%s Label for node missing", kubeletapis.LabelZoneFailureDomain) + } + // if single replica volume and node with zone found, return immediately + if numReplicas == 1 { + return sets.NewString(zoneFromNode), nil + } + } + + // pick zone from allowedZones if specified + allowedZones, err := ZonesFromAllowedTopologies(allowedTopologies) + if err != nil { + return nil, err + } + + if (len(allowedTopologies) > 0) && (allowedZones.Len() == 0) { + return nil, fmt.Errorf("no matchLabelExpressions with %s key found in allowedTopologies. Please specify matchLabelExpressions with %s key", kubeletapis.LabelZoneFailureDomain, kubeletapis.LabelZoneFailureDomain) + } + + if allowedZones.Len() > 0 { + // VolumeScheduling implicit since allowedZones present + if zoneParameterPresent || zonesParameterPresent { + return nil, fmt.Errorf("zone[s] cannot be specified in StorageClass if allowedTopologies specified") + } + // scheduler will guarantee if node != null above, zoneFromNode is member of allowedZones. + // so if zoneFromNode != "", we can safely assume it is part of allowedZones. + if zones, err := chooseZonesForVolumeIncludingZone(allowedZones, pvcName, zoneFromNode, numReplicas); err != nil { + return nil, fmt.Errorf("cannot process zones in allowedTopologies: %v", err) + } else { + return zones, nil + } + } + + // pick zone from parameters if present + if zoneParameterPresent { + if numReplicas > 1 { + return nil, fmt.Errorf("zone cannot be specified if desired number of replicas for pv is greather than 1. Please specify zones or allowedTopologies to specify desired zones") + } + return sets.NewString(zoneParameter), nil + } + + if zonesParameterPresent { + if uint32(zonesParameter.Len()) < numReplicas { + return nil, fmt.Errorf("not enough zones found in zones parameter to provision a volume with %d replicas. Found %d zones, need %d zones", numReplicas, zonesParameter.Len(), numReplicas) + } + // directly choose from zones parameter; no zone from node need to be considered + return ChooseZonesForVolume(zonesParameter, pvcName, numReplicas), nil + } + + // pick zone from zones with nodes + if zonesWithNodes.Len() > 0 { + // If node != null (and thus zoneFromNode != ""), zoneFromNode will be member of zonesWithNodes + if zones, err := chooseZonesForVolumeIncludingZone(zonesWithNodes, pvcName, zoneFromNode, numReplicas); err != nil { + return nil, fmt.Errorf("cannot process zones where nodes exist in the cluster: %v", err) + } else { + return zones, nil + } + } + return nil, fmt.Errorf("cannot determine zones to provision volume in") +} + +// ZonesFromAllowedTopologies returns a list of zones specified in allowedTopologies +func ZonesFromAllowedTopologies(allowedTopologies []v1.TopologySelectorTerm) (sets.String, error) { + zones := make(sets.String) + for _, term := range allowedTopologies { + for _, exp := range term.MatchLabelExpressions { + if exp.Key == kubeletapis.LabelZoneFailureDomain { + for _, value := range exp.Values { + zones.Insert(value) + } + } else { + return nil, fmt.Errorf("unsupported key found in matchLabelExpressions: %s", exp.Key) + } + } + } + return zones, nil +} + func ZonesSetToLabelValue(strSet sets.String) string { return strings.Join(strSet.UnsortedList(), kubeletapis.LabelMultiZoneDelimiter) } // ZonesToSet converts a string containing a comma separated list of zones to set func ZonesToSet(zonesString string) (sets.String, error) { - return stringToSet(zonesString, ",") + zones, err := stringToSet(zonesString, ",") + if err != nil { + return nil, fmt.Errorf("error parsing zones %s, must be strings separated by commas: %v", zonesString, err) + } + return zones, nil } // LabelZonesToSet converts a PV label value from string containing a delimited list of zones to set @@ -322,7 +449,7 @@ func LabelZonesToSet(labelZonesValue string) (sets.String, error) { return stringToSet(labelZonesValue, kubeletapis.LabelMultiZoneDelimiter) } -// StringToSet converts a string containing list separated by specified delimiter to to a set +// StringToSet converts a string containing list separated by specified delimiter to a set func stringToSet(str, delimiter string) (sets.String, error) { zonesSlice := strings.Split(str, delimiter) zonesSet := make(sets.String) @@ -339,6 +466,27 @@ func stringToSet(str, delimiter string) (sets.String, error) { return zonesSet, nil } +// LabelZonesToList converts a PV label value from string containing a delimited list of zones to list +func LabelZonesToList(labelZonesValue string) ([]string, error) { + return stringToList(labelZonesValue, kubeletapis.LabelMultiZoneDelimiter) +} + +// StringToList converts a string containing list separated by specified delimiter to a list +func stringToList(str, delimiter string) ([]string, error) { + zonesSlice := make([]string, 0) + for _, zone := range strings.Split(str, delimiter) { + trimmedZone := strings.TrimSpace(zone) + if trimmedZone == "" { + return nil, fmt.Errorf( + "%q separated list (%q) must not contain an empty string", + delimiter, + str) + } + zonesSlice = append(zonesSlice, trimmedZone) + } + return zonesSlice, nil +} + // CalculateTimeoutForVolume calculates time for a Recycler pod to complete a // recycle operation. The calculation and return value is either the // minimumTimeout or the timeoutIncrement per Gi of storage size, whichever is @@ -361,7 +509,11 @@ func CalculateTimeoutForVolume(minimumTimeout, timeoutIncrement int, pv *v1.Pers // RoundUpSize(1500 * 1024*1024, 1024*1024*1024) returns '2' // (2 GiB is the smallest allocatable volume that can hold 1500MiB) func RoundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 { - return (volumeSizeBytes + allocationUnitBytes - 1) / allocationUnitBytes + roundedUp := volumeSizeBytes / allocationUnitBytes + if volumeSizeBytes%allocationUnitBytes > 0 { + roundedUp += 1 + } + return roundedUp } // RoundUpToGB rounds up given quantity to chunks of GB @@ -376,6 +528,32 @@ func RoundUpToGiB(size resource.Quantity) int64 { return RoundUpSize(requestBytes, GIB) } +// RoundUpSizeInt calculates how many allocation units are needed to accommodate +// a volume of given size. It returns an int instead of an int64 and an error if +// there's overflow +func RoundUpSizeInt(volumeSizeBytes int64, allocationUnitBytes int64) (int, error) { + roundedUp := RoundUpSize(volumeSizeBytes, allocationUnitBytes) + roundedUpInt := int(roundedUp) + if int64(roundedUpInt) != roundedUp { + return 0, fmt.Errorf("capacity %v is too great, casting results in integer overflow", roundedUp) + } + return roundedUpInt, nil +} + +// RoundUpToGBInt rounds up given quantity to chunks of GB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToGBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return RoundUpSizeInt(requestBytes, GB) +} + +// RoundUpToGiBInt rounds up given quantity upto chunks of GiB. It returns an +// int instead of an int64 and an error if there's overflow +func RoundUpToGiBInt(size resource.Quantity) (int, error) { + requestBytes := size.Value() + return RoundUpSizeInt(requestBytes, GIB) +} + // GenerateVolumeName returns a PV name with clusterName prefix. The function // should be used to generate a name of GCE PD or Cinder volume. It basically // adds "-dynamic-" before the PV name, making sure the resulting @@ -407,6 +585,11 @@ func GetPath(mounter volume.Mounter) (string, error) { // This means that a StatefulSet's volumes (`claimname-statefulsetname-id`) will spread across available zones, // assuming the id values are consecutive. func ChooseZoneForVolume(zones sets.String, pvcName string) string { + // No zones available, return empty string. + if zones.Len() == 0 { + return "" + } + // We create the volume in a zone determined by the name // Eventually the scheduler will coordinate placement into an available zone hash, index := getPVCNameHashAndIndexOffset(pvcName) @@ -426,8 +609,41 @@ func ChooseZoneForVolume(zones sets.String, pvcName string) string { return zone } +// chooseZonesForVolumeIncludingZone is a wrapper around ChooseZonesForVolume that ensures zoneToInclude is chosen +// zoneToInclude can either be empty in which case it is ignored. If non-empty, zoneToInclude is expected to be member of zones. +// numReplicas is expected to be > 0 and <= zones.Len() +func chooseZonesForVolumeIncludingZone(zones sets.String, pvcName, zoneToInclude string, numReplicas uint32) (sets.String, error) { + if numReplicas == 0 { + return nil, fmt.Errorf("invalid number of replicas passed") + } + if uint32(zones.Len()) < numReplicas { + return nil, fmt.Errorf("not enough zones found to provision a volume with %d replicas. Need at least %d distinct zones for a volume with %d replicas", numReplicas, numReplicas, numReplicas) + } + if zoneToInclude != "" && !zones.Has(zoneToInclude) { + return nil, fmt.Errorf("zone to be included: %s needs to be member of set: %v", zoneToInclude, zones) + } + if uint32(zones.Len()) == numReplicas { + return zones, nil + } + if zoneToInclude != "" { + zones.Delete(zoneToInclude) + numReplicas = numReplicas - 1 + } + zonesChosen := ChooseZonesForVolume(zones, pvcName, numReplicas) + if zoneToInclude != "" { + zonesChosen.Insert(zoneToInclude) + } + return zonesChosen, nil +} + // ChooseZonesForVolume is identical to ChooseZoneForVolume, but selects a multiple zones, for multi-zone disks. func ChooseZonesForVolume(zones sets.String, pvcName string, numZones uint32) sets.String { + // No zones available, return empty set. + replicaZones := sets.NewString() + if zones.Len() == 0 { + return replicaZones + } + // We create the volume in a zone determined by the name // Eventually the scheduler will coordinate placement into an available zone hash, index := getPVCNameHashAndIndexOffset(pvcName) @@ -441,7 +657,6 @@ func ChooseZonesForVolume(zones sets.String, pvcName string, numZones uint32) se // PVC placement (which could also e.g. avoid putting volumes in overloaded or // unhealthy zones) zoneSlice := zones.List() - replicaZones := sets.NewString() startingIndex := index * numZones for index = startingIndex; index < startingIndex+numZones; index++ { @@ -661,7 +876,7 @@ func notRunning(statuses []v1.ContainerStatus) bool { } // SplitUniqueName splits the unique name to plugin name and volume name strings. It expects the uniqueName to follow -// the fromat plugin_name/volume_name and the plugin name must be namespaced as described by the plugin interface, +// the format plugin_name/volume_name and the plugin name must be namespaced as described by the plugin interface, // i.e. namespace/plugin containing exactly one '/'. This means the unique name will always be in the form of // plugin_namespace/plugin/volume_name, see k8s.io/kubernetes/pkg/volume/plugins.go VolumePlugin interface // description and pkg/volume/util/volumehelper/volumehelper.go GetUniqueVolumeNameFromSpec that constructs @@ -704,6 +919,11 @@ func GetPersistentVolumeClaimVolumeMode(claim *v1.PersistentVolumeClaim) (v1.Per return "", fmt.Errorf("cannot get volumeMode from pvc: %v", claim.Name) } +// GetPersistentVolumeClaimQualifiedName returns a qualified name for pvc. +func GetPersistentVolumeClaimQualifiedName(claim *v1.PersistentVolumeClaim) string { + return utilstrings.JoinQualifiedName(claim.GetNamespace(), claim.GetName()) +} + // CheckVolumeModeFilesystem checks VolumeMode. // If the mode is Filesystem, return true otherwise return false. func CheckVolumeModeFilesystem(volumeSpec *volume.Spec) (bool, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD index 562bfa90..e61e3973 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/volumepathhandler/BUILD @@ -4,47 +4,14 @@ go_library( name = "go_default_library", srcs = [ "volume_path_handler.go", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "volume_path_handler_linux.go", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "volume_path_handler_unsupported.go", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "volume_path_handler_unsupported.go", - ], - "//conditions:default": [], - }), + "volume_path_handler_linux.go", + "volume_path_handler_unsupported.go", + ], importpath = "k8s.io/kubernetes/pkg/volume/util/volumepathhandler", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], ) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD b/vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD deleted file mode 100644 index 45305856..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/validation/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["pv_validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["pv_validation.go"], - importpath = "k8s.io/kubernetes/pkg/volume/validation", - deps = [ - "//pkg/apis/core:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/kubernetes/pkg/volume/validation/pv_validation.go b/vendor/k8s.io/kubernetes/pkg/volume/validation/pv_validation.go deleted file mode 100644 index 23fa51fd..00000000 --- a/vendor/k8s.io/kubernetes/pkg/volume/validation/pv_validation.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 validation - -import ( - "errors" - "path/filepath" - "strings" - - "k8s.io/apimachinery/pkg/util/validation/field" - api "k8s.io/kubernetes/pkg/apis/core" -) - -// ValidatePersistentVolume validates PV object for plugin specific validation -// We can put here validations which are specific to volume types. -func ValidatePersistentVolume(pv *api.PersistentVolume) field.ErrorList { - return checkMountOption(pv) -} - -func checkMountOption(pv *api.PersistentVolume) field.ErrorList { - allErrs := field.ErrorList{} - // if PV is of these types we don't return errors - // since mount options is supported - if pv.Spec.GCEPersistentDisk != nil || - pv.Spec.AWSElasticBlockStore != nil || - pv.Spec.Glusterfs != nil || - pv.Spec.NFS != nil || - pv.Spec.RBD != nil || - pv.Spec.Quobyte != nil || - pv.Spec.ISCSI != nil || - pv.Spec.Cinder != nil || - pv.Spec.CephFS != nil || - pv.Spec.AzureFile != nil || - pv.Spec.VsphereVolume != nil || - pv.Spec.AzureDisk != nil || - pv.Spec.PhotonPersistentDisk != nil { - return allErrs - } - // any other type if mount option is present lets return error - if _, ok := pv.Annotations[api.MountOptionAnnotation]; ok { - metaField := field.NewPath("metadata") - allErrs = append(allErrs, field.Forbidden(metaField.Child("annotations", api.MountOptionAnnotation), "may not specify mount options for this volume type")) - } - return allErrs -} - -// ValidatePathNoBacksteps will make sure the targetPath does not have any element which is ".." -func ValidatePathNoBacksteps(targetPath string) error { - parts := strings.Split(filepath.ToSlash(targetPath), "/") - for _, item := range parts { - if item == ".." { - return errors.New("must not contain '..'") - } - } - - return nil -} diff --git a/vendor/k8s.io/kubernetes/pkg/volume/volume.go b/vendor/k8s.io/kubernetes/pkg/volume/volume.go index 5f633214..013e0dc4 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/volume.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/volume.go @@ -204,6 +204,8 @@ type Deleter interface { // Attacher can attach a volume to a node. type Attacher interface { + DeviceMounter + // Attaches the volume specified by the given spec to the node with the given Name. // On success, returns the device path where the device was attached on the // node. @@ -219,7 +221,10 @@ type Attacher interface { // is returned. Otherwise, if the device does not attach after // the given timeout period, an error will be returned. WaitForAttach(spec *Spec, devicePath string, pod *v1.Pod, timeout time.Duration) (string, error) +} +// DeviceMounter can mount a block volume to a global path. +type DeviceMounter interface { // GetDeviceMountPath returns a path where the device should // be mounted after it is attached. This is a global mount // point which should be bind mounted for individual volumes. @@ -227,6 +232,7 @@ type Attacher interface { // MountDevice mounts the disk to a global path which // individual pods can then bind mount + // Note that devicePath can be empty if the volume plugin does not implement any of Attach and WaitForAttach methods. MountDevice(spec *Spec, devicePath string, deviceMountPath string) error } @@ -240,11 +246,15 @@ type BulkVolumeVerifier interface { // Detacher can detach a volume from a node. type Detacher interface { + DeviceUnmounter // Detach the given volume from the node with the given Name. // volumeName is name of the volume as returned from plugin's // GetVolumeName(). Detach(volumeName string, nodeName types.NodeName) error +} +// DeviceUnmounter can unmount a block volume from the global path. +type DeviceUnmounter interface { // UnmountDevice unmounts the global mount of the disk. This // should only be called once all bind mounts have been // unmounted. diff --git a/vendor/k8s.io/metrics/CONTRIBUTING.md b/vendor/k8s.io/metrics/CONTRIBUTING.md new file mode 100644 index 00000000..e28789c8 --- /dev/null +++ b/vendor/k8s.io/metrics/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing guidelines + +Do not open pull requests directly against this repository, they will be ignored. Instead, please open pull requests against [kubernetes/kubernetes](https://git.k8s.io/kubernetes/). Please follow the same [contributing guide](https://git.k8s.io/kubernetes/CONTRIBUTING.md) you would follow for any other pull request made to kubernetes/kubernetes. + +This repository is published from [kubernetes/kubernetes/staging/src/k8s.io/metrics](https://git.k8s.io/kubernetes/staging/src/k8s.io/metrics) by the [kubernetes publishing-bot](https://git.k8s.io/publishing-bot). + +Please see [Staging Directory and Publishing](https://git.k8s.io/community/contributors/devel/staging.md) for more information diff --git a/vendor/k8s.io/metrics/IMPLEMENTATIONS.md b/vendor/k8s.io/metrics/IMPLEMENTATIONS.md new file mode 100644 index 00000000..7548bb52 --- /dev/null +++ b/vendor/k8s.io/metrics/IMPLEMENTATIONS.md @@ -0,0 +1,26 @@ +# Implementations + +## Resource Metrics API + +- [Heapster](https://github.com/kubernetes/heapster): a application which + gathers metrics, writes them to metrics storage "sinks", and exposes the + resource metrics API from in-memory storage. + +- [Metrics Server](https://github.com/kubernetes-incubator/metrics-server): + a lighter-weight in-memory server specifically for the resource metrics + API. + +## Custom Metrics API + +***NB: None of the below implementations are officially part of Kubernetes. +They are listed here for convenience.*** + +- [Prometheus + Adapter](https://github.com/directxman12/k8s-prometheus-adapter). An + implementation of the custom metrics API that attempts to support + arbitrary metrics following a set label and naming scheme. + +- [Microsoft Azure Adapter](https://github.com/Azure/azure-k8s-metrics-adapter). An implementation of the custom metrics API that allows you to retrieve arbitrary metrics from Azure Monitor. + +- [Google Stackdriver (coming + soon)](https://github.com/GoogleCloudPlatform/k8s-stackdriver) diff --git a/vendor/k8s.io/metrics/OWNERS b/vendor/k8s.io/metrics/OWNERS new file mode 100644 index 00000000..c532d644 --- /dev/null +++ b/vendor/k8s.io/metrics/OWNERS @@ -0,0 +1,3 @@ +approvers: +- DirectXMan12 +- piosz diff --git a/vendor/k8s.io/metrics/README.md b/vendor/k8s.io/metrics/README.md new file mode 100644 index 00000000..2184d3f1 --- /dev/null +++ b/vendor/k8s.io/metrics/README.md @@ -0,0 +1,71 @@ +# metrics + +Kubernetes metrics API type definitions and clients. + +## Purpose + +This repository contains type definitions and client code for the metrics +APIs that Kubernetes makes use of. Depending on the API, the actual +implementations live elsewhere. + +Consumers of the metrics APIs can make use of this repository to access +implementations of the APIs, while implementors should make use of this +library when implementing their API servers. + +## APIs + +This repository contains types and clients for several APIs. For more +details on implementations of these apis, see +[IMPLEMENTATIONS.md](IMPLEMENTATIONS.md). + +### Custom Metrics API + +This API allows consumers to access arbitrary metrics which describe +Kubernetes resources. + +The API is intended to be implemented by monitoring pipeline vendors, on +top of their metrics storage solutions. + +If you want to implement this an API server for this API, please see the +[kubernetes-incubator/custom-metrics-apiserver](https://github.com/kubernetes-incubator/custom-metrics-apiserver) +library, which contains the basic infrastructure required to set up such +an API server. + +Import Path: `k8s.io/metrics/pkg/apis/custom_metrics`. + +### Resource Metrics API + +This API allows consumers to access resource metrics (CPU and memory) for +pods and nodes. + +The API is implemented by Heapster +(https://github.com/kubernetes/heapster) and metrics-server +(https://github.com/kubernetes-incubator/metrics-server). + +Import Path: `k8s.io/metrics/pkg/apis/metrics`. + +## Compatibility + +The APIs in this repository follow the standard guarantees for Kubernetes +APIs, and will follow Kubernetes releases. + +## Community, discussion, contribution, and support + +Learn how to engage with the Kubernetes community on the [community +page](http://kubernetes.io/community/). + +You can reach the maintainers of this repository at: + +- Slack: #sig-instrumention (on https://kubernetes.slack.com -- get an + invite at slack.kubernetes.io) +- Mailing List: + https://groups.google.com/forum/#!forum/kubernetes-sig-instrumentation + +### Code of Conduct + +Participation in the Kubernetes community is governed by the [Kubernetes +Code of Conduct](code-of-conduct.md). + +### Contibution Guidelines + +See [CONTRIBUTING.md](CONTRIBUTING.md) for more information. diff --git a/vendor/k8s.io/metrics/SECURITY_CONTACTS b/vendor/k8s.io/metrics/SECURITY_CONTACTS new file mode 100644 index 00000000..0648a8eb --- /dev/null +++ b/vendor/k8s.io/metrics/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/metrics/code-of-conduct.md b/vendor/k8s.io/metrics/code-of-conduct.md new file mode 100644 index 00000000..0d15c00c --- /dev/null +++ b/vendor/k8s.io/metrics/code-of-conduct.md @@ -0,0 +1,3 @@ +# Kubernetes Community Code of Conduct + +Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md) diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/BUILD b/vendor/k8s.io/metrics/pkg/apis/metrics/BUILD deleted file mode 100644 index da2b2a66..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/metrics/pkg/apis/metrics", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/metrics/install:all-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/metrics/v1alpha1:all-srcs", - "//staging/src/k8s.io/metrics/pkg/apis/metrics/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/types.go b/vendor/k8s.io/metrics/pkg/apis/metrics/types.go deleted file mode 100644 index a53eb440..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/types.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 metrics - -import ( - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +genclient -// +resourceName=nodes -// +genclient:readonly -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// resource usage metrics of a node. -type NodeMetrics struct { - metav1.TypeMeta - metav1.ObjectMeta - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - Timestamp metav1.Time - Window metav1.Duration - - // The memory usage is the memory working set. - Usage corev1.ResourceList -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// NodeMetricsList is a list of NodeMetrics. -type NodeMetricsList struct { - metav1.TypeMeta - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - metav1.ListMeta - - // List of node metrics. - Items []NodeMetrics -} - -// +genclient -// +resourceName=pods -// +genclient:readonly -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// resource usage metrics of a pod. -type PodMetrics struct { - metav1.TypeMeta - metav1.ObjectMeta - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - Timestamp metav1.Time - Window metav1.Duration - - // Metrics for all containers are collected within the same time window. - Containers []ContainerMetrics -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// PodMetricsList is a list of PodMetrics. -type PodMetricsList struct { - metav1.TypeMeta - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - metav1.ListMeta - - // List of pod metrics. - Items []PodMetrics -} - -// resource usage metrics of a container. -type ContainerMetrics struct { - // Container name corresponding to the one from pod.spec.containers. - Name string - // The memory usage is the memory working set. - Usage corev1.ResourceList -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD b/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD deleted file mode 100644 index c05049f0..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/metrics/pkg/apis/metrics/v1alpha1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/metrics/pkg/apis/metrics:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.pb.go b/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.pb.go deleted file mode 100644 index 566003c8..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.pb.go +++ /dev/null @@ -1,1564 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by protoc-gen-gogo. -// source: k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.proto -// DO NOT EDIT! - -/* - Package v1alpha1 is a generated protocol buffer package. - - It is generated from these files: - k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.proto - - It has these top-level messages: - ContainerMetrics - NodeMetrics - NodeMetricsList - PodMetrics - PodMetricsList -*/ -package v1alpha1 - -import proto "github.com/gogo/protobuf/proto" -import fmt "fmt" -import math "math" - -import k8s_io_apimachinery_pkg_api_resource "k8s.io/apimachinery/pkg/api/resource" - -import k8s_io_api_core_v1 "k8s.io/api/core/v1" - -import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" - -import strings "strings" -import reflect "reflect" - -import io "io" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package - -func (m *ContainerMetrics) Reset() { *m = ContainerMetrics{} } -func (*ContainerMetrics) ProtoMessage() {} -func (*ContainerMetrics) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } - -func (m *NodeMetrics) Reset() { *m = NodeMetrics{} } -func (*NodeMetrics) ProtoMessage() {} -func (*NodeMetrics) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } - -func (m *NodeMetricsList) Reset() { *m = NodeMetricsList{} } -func (*NodeMetricsList) ProtoMessage() {} -func (*NodeMetricsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } - -func (m *PodMetrics) Reset() { *m = PodMetrics{} } -func (*PodMetrics) ProtoMessage() {} -func (*PodMetrics) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } - -func (m *PodMetricsList) Reset() { *m = PodMetricsList{} } -func (*PodMetricsList) ProtoMessage() {} -func (*PodMetricsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } - -func init() { - proto.RegisterType((*ContainerMetrics)(nil), "k8s.io.metrics.pkg.apis.metrics.v1alpha1.ContainerMetrics") - proto.RegisterType((*NodeMetrics)(nil), "k8s.io.metrics.pkg.apis.metrics.v1alpha1.NodeMetrics") - proto.RegisterType((*NodeMetricsList)(nil), "k8s.io.metrics.pkg.apis.metrics.v1alpha1.NodeMetricsList") - proto.RegisterType((*PodMetrics)(nil), "k8s.io.metrics.pkg.apis.metrics.v1alpha1.PodMetrics") - proto.RegisterType((*PodMetricsList)(nil), "k8s.io.metrics.pkg.apis.metrics.v1alpha1.PodMetricsList") -} -func (m *ContainerMetrics) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ContainerMetrics) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - if len(m.Usage) > 0 { - keysForUsage := make([]string, 0, len(m.Usage)) - for k := range m.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - for _, k := range keysForUsage { - dAtA[i] = 0x12 - i++ - v := m.Usage[k8s_io_api_core_v1.ResourceName(k)] - msgSize := 0 - if (&v) != nil { - msgSize = (&v).Size() - msgSize += 1 + sovGenerated(uint64(msgSize)) - } - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n1, err := (&v).MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n1 - } - } - return i, nil -} - -func (m *NodeMetrics) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NodeMetrics) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n2, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n2 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Timestamp.Size())) - n3, err := m.Timestamp.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n3 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Window.Size())) - n4, err := m.Window.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n4 - if len(m.Usage) > 0 { - keysForUsage := make([]string, 0, len(m.Usage)) - for k := range m.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - for _, k := range keysForUsage { - dAtA[i] = 0x22 - i++ - v := m.Usage[k8s_io_api_core_v1.ResourceName(k)] - msgSize := 0 - if (&v) != nil { - msgSize = (&v).Size() - msgSize += 1 + sovGenerated(uint64(msgSize)) - } - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n5, err := (&v).MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n5 - } - } - return i, nil -} - -func (m *NodeMetricsList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NodeMetricsList) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n6, err := m.ListMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n6 - if len(m.Items) > 0 { - for _, msg := range m.Items { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - return i, nil -} - -func (m *PodMetrics) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PodMetrics) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n7, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n7 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Timestamp.Size())) - n8, err := m.Timestamp.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n8 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Window.Size())) - n9, err := m.Window.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n9 - if len(m.Containers) > 0 { - for _, msg := range m.Containers { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - return i, nil -} - -func (m *PodMetricsList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PodMetricsList) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n10, err := m.ListMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n10 - if len(m.Items) > 0 { - for _, msg := range m.Items { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - return i, nil -} - -func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return offset + 1 -} -func (m *ContainerMetrics) Size() (n int) { - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Usage) > 0 { - for k, v := range m.Usage { - _ = k - _ = v - l = v.Size() - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - return n -} - -func (m *NodeMetrics) Size() (n int) { - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Timestamp.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Window.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Usage) > 0 { - for k, v := range m.Usage { - _ = k - _ = v - l = v.Size() - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - return n -} - -func (m *NodeMetricsList) Size() (n int) { - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *PodMetrics) Size() (n int) { - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Timestamp.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Window.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Containers) > 0 { - for _, e := range m.Containers { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *PodMetricsList) Size() (n int) { - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func sovGenerated(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *ContainerMetrics) String() string { - if this == nil { - return "nil" - } - keysForUsage := make([]string, 0, len(this.Usage)) - for k := range this.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - mapStringForUsage := "k8s_io_api_core_v1.ResourceList{" - for _, k := range keysForUsage { - mapStringForUsage += fmt.Sprintf("%v: %v,", k, this.Usage[k8s_io_api_core_v1.ResourceName(k)]) - } - mapStringForUsage += "}" - s := strings.Join([]string{`&ContainerMetrics{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Usage:` + mapStringForUsage + `,`, - `}`, - }, "") - return s -} -func (this *NodeMetrics) String() string { - if this == nil { - return "nil" - } - keysForUsage := make([]string, 0, len(this.Usage)) - for k := range this.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - mapStringForUsage := "k8s_io_api_core_v1.ResourceList{" - for _, k := range keysForUsage { - mapStringForUsage += fmt.Sprintf("%v: %v,", k, this.Usage[k8s_io_api_core_v1.ResourceName(k)]) - } - mapStringForUsage += "}" - s := strings.Join([]string{`&NodeMetrics{`, - `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Timestamp:` + strings.Replace(strings.Replace(this.Timestamp.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, - `Window:` + strings.Replace(strings.Replace(this.Window.String(), "Duration", "k8s_io_apimachinery_pkg_apis_meta_v1.Duration", 1), `&`, ``, 1) + `,`, - `Usage:` + mapStringForUsage + `,`, - `}`, - }, "") - return s -} -func (this *NodeMetricsList) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&NodeMetricsList{`, - `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "NodeMetrics", "NodeMetrics", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *PodMetrics) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PodMetrics{`, - `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Timestamp:` + strings.Replace(strings.Replace(this.Timestamp.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, - `Window:` + strings.Replace(strings.Replace(this.Window.String(), "Duration", "k8s_io_apimachinery_pkg_apis_meta_v1.Duration", 1), `&`, ``, 1) + `,`, - `Containers:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Containers), "ContainerMetrics", "ContainerMetrics", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *PodMetricsList) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PodMetricsList{`, - `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "PodMetrics", "PodMetrics", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *ContainerMetrics) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ContainerMetrics: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerMetrics: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.Usage == nil { - m.Usage = make(k8s_io_api_core_v1.ResourceList) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - postmsgIndex := iNdEx + mapmsglen - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue - } else { - var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NodeMetrics) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: NodeMetrics: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NodeMetrics: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Timestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Window", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Window.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.Usage == nil { - m.Usage = make(k8s_io_api_core_v1.ResourceList) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - postmsgIndex := iNdEx + mapmsglen - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue - } else { - var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NodeMetricsList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: NodeMetricsList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NodeMetricsList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, NodeMetrics{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PodMetrics) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PodMetrics: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PodMetrics: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Timestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Window", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Window.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Containers", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Containers = append(m.Containers, ContainerMetrics{}) - if err := m.Containers[len(m.Containers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PodMetricsList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PodMetricsList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PodMetricsList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, PodMetrics{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenerated(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - return iNdEx, nil - case 1: - iNdEx += 8 - return iNdEx, nil - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - iNdEx += length - if length < 0 { - return 0, ErrInvalidLengthGenerated - } - return iNdEx, nil - case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipGenerated(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - } - return iNdEx, nil - case 4: - return iNdEx, nil - case 5: - iNdEx += 4 - return iNdEx, nil - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - } - panic("unreachable") -} - -var ( - ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") -) - -func init() { - proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.proto", fileDescriptorGenerated) -} - -var fileDescriptorGenerated = []byte{ - // 675 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x54, 0xbf, 0x6f, 0x13, 0x3d, - 0x18, 0x8e, 0x9b, 0xa4, 0x6a, 0x9d, 0xef, 0xeb, 0xd7, 0xef, 0xa6, 0x2a, 0xc3, 0xa5, 0xca, 0x14, - 0x21, 0xd5, 0x47, 0x4b, 0x41, 0x55, 0x27, 0x74, 0xb4, 0x03, 0x12, 0x2d, 0xf4, 0x54, 0x40, 0x14, - 0x06, 0x9c, 0x8b, 0xb9, 0x98, 0xf4, 0xec, 0x93, 0xed, 0x4b, 0x95, 0x0d, 0x01, 0x13, 0x13, 0x12, - 0xff, 0x54, 0x11, 0x4b, 0xc7, 0x2e, 0xb4, 0xf4, 0xd8, 0xf9, 0x03, 0x98, 0xd0, 0x39, 0xbe, 0x5c, - 0x68, 0xfa, 0x23, 0x74, 0x60, 0xea, 0x76, 0xf7, 0xda, 0xcf, 0xf3, 0xbc, 0x7e, 0xde, 0xc7, 0x86, - 0x5b, 0x9d, 0x15, 0x89, 0x28, 0x77, 0x3a, 0x71, 0x93, 0x08, 0x46, 0x14, 0x91, 0x4e, 0x97, 0xb0, - 0x16, 0x17, 0x8e, 0x59, 0x08, 0x89, 0x12, 0xd4, 0x97, 0x4e, 0xd4, 0x09, 0x1c, 0x1c, 0x51, 0x39, - 0x28, 0x74, 0x17, 0xf1, 0x6e, 0xd4, 0xc6, 0x8b, 0x4e, 0x40, 0x18, 0x11, 0x58, 0x91, 0x16, 0x8a, - 0x04, 0x57, 0xdc, 0x6a, 0xf4, 0x91, 0xc8, 0x6c, 0x44, 0x51, 0x27, 0x40, 0x29, 0x72, 0x50, 0xc8, - 0x90, 0xd5, 0x85, 0x80, 0xaa, 0x76, 0xdc, 0x44, 0x3e, 0x0f, 0x9d, 0x80, 0x07, 0xdc, 0xd1, 0x04, - 0xcd, 0xf8, 0x95, 0xfe, 0xd3, 0x3f, 0xfa, 0xab, 0x4f, 0x5c, 0xad, 0x9b, 0x96, 0x70, 0x44, 0x1d, - 0x9f, 0x0b, 0xe2, 0x74, 0x47, 0xc4, 0xab, 0xcb, 0xf9, 0x9e, 0x10, 0xfb, 0x6d, 0xca, 0x88, 0xe8, - 0x65, 0xbd, 0x3b, 0x82, 0x48, 0x1e, 0x0b, 0x9f, 0xfc, 0x11, 0x4a, 0x9f, 0x18, 0x9f, 0xa5, 0xe5, - 0x9c, 0x87, 0x12, 0x31, 0x53, 0x34, 0x1c, 0x95, 0xb9, 0x73, 0x19, 0x40, 0xfa, 0x6d, 0x12, 0xe2, - 0x11, 0xdc, 0xad, 0xf3, 0x70, 0xb1, 0xa2, 0xbb, 0x0e, 0x65, 0x4a, 0x2a, 0x71, 0x1a, 0x54, 0x7f, - 0x57, 0x84, 0xb3, 0xf7, 0x38, 0x53, 0x38, 0xdd, 0xbe, 0xd1, 0xb7, 0xde, 0x9a, 0x87, 0x25, 0x86, - 0x43, 0x32, 0x07, 0xe6, 0x41, 0x63, 0xda, 0xfd, 0x67, 0xff, 0xa8, 0x56, 0x48, 0x8e, 0x6a, 0xa5, - 0x4d, 0x1c, 0x12, 0x4f, 0xaf, 0x58, 0x09, 0x80, 0xe5, 0x58, 0xe2, 0x80, 0xcc, 0x4d, 0xcc, 0x17, - 0x1b, 0x95, 0xa5, 0x75, 0x34, 0xee, 0x38, 0xd1, 0x69, 0x35, 0xf4, 0x38, 0xe5, 0x59, 0x67, 0x4a, - 0xf4, 0xdc, 0xf7, 0xc0, 0x68, 0x95, 0x75, 0xf1, 0xe7, 0x51, 0xad, 0x36, 0x3a, 0x4d, 0xe4, 0x99, - 0x01, 0x3d, 0xa0, 0x52, 0xbd, 0x3d, 0xbe, 0x70, 0x4b, 0xda, 0xf2, 0x87, 0xe3, 0xda, 0xc2, 0x38, - 0xf3, 0x46, 0x5b, 0x31, 0x66, 0x8a, 0xaa, 0x9e, 0xd7, 0x3f, 0x5a, 0xb5, 0x0d, 0x61, 0xde, 0x9b, - 0x35, 0x0b, 0x8b, 0x1d, 0xd2, 0xeb, 0x7b, 0xe2, 0xa5, 0x9f, 0xd6, 0x1a, 0x2c, 0x77, 0xf1, 0x6e, - 0x9c, 0x7a, 0x00, 0x1a, 0x95, 0x25, 0x94, 0x79, 0x30, 0xac, 0x92, 0x19, 0x81, 0xce, 0x50, 0xd1, - 0xe0, 0xd5, 0x89, 0x15, 0x50, 0xff, 0x51, 0x82, 0x95, 0x4d, 0xde, 0x22, 0xd9, 0x00, 0x5e, 0xc2, - 0xa9, 0x34, 0x4e, 0x2d, 0xac, 0xb0, 0x16, 0xac, 0x2c, 0xdd, 0xbc, 0x88, 0x5c, 0xbb, 0x8c, 0x51, - 0x77, 0x11, 0x3d, 0x6c, 0xbe, 0x26, 0xbe, 0xda, 0x20, 0x0a, 0xbb, 0x96, 0xb1, 0x12, 0xe6, 0x35, - 0x6f, 0xc0, 0x6a, 0x3d, 0x87, 0xd3, 0x69, 0x96, 0xa4, 0xc2, 0x61, 0x64, 0xfa, 0xbf, 0x31, 0x9e, - 0xc4, 0x36, 0x0d, 0x89, 0xfb, 0xbf, 0x21, 0x9f, 0xde, 0xce, 0x48, 0xbc, 0x9c, 0xcf, 0x7a, 0x02, - 0x27, 0xf7, 0x28, 0x6b, 0xf1, 0xbd, 0xb9, 0xe2, 0xe5, 0xce, 0xe4, 0xcc, 0x6b, 0xb1, 0xc0, 0x8a, - 0x72, 0xe6, 0xce, 0x18, 0xf6, 0xc9, 0xa7, 0x9a, 0xc5, 0x33, 0x6c, 0xd6, 0xd7, 0x41, 0xea, 0x4a, - 0x3a, 0x75, 0x77, 0xc7, 0x4f, 0xdd, 0x90, 0xbb, 0xd7, 0x81, 0x03, 0xf5, 0x2f, 0x00, 0xfe, 0x37, - 0x64, 0x49, 0x7a, 0x30, 0xeb, 0xc5, 0x48, 0xe8, 0xc6, 0x9c, 0x5b, 0x8a, 0xd6, 0x91, 0x9b, 0x35, - 0x66, 0x4e, 0x65, 0x95, 0xa1, 0xc0, 0xed, 0xc0, 0x32, 0x55, 0x24, 0x94, 0xe6, 0xc1, 0xb8, 0x7d, - 0xa5, 0xd1, 0xb9, 0xff, 0x66, 0xe3, 0xba, 0x9f, 0x72, 0x79, 0x7d, 0xca, 0xfa, 0xa7, 0x22, 0x84, - 0x8f, 0x78, 0xeb, 0xfa, 0xf6, 0x5c, 0x78, 0x7b, 0x18, 0x84, 0x7e, 0xf6, 0xf6, 0x4a, 0x73, 0x83, - 0x56, 0xaf, 0xfe, 0x6e, 0xe7, 0x16, 0x0d, 0x56, 0xa4, 0x37, 0xa4, 0x50, 0xff, 0x0c, 0xe0, 0x4c, - 0x3e, 0x95, 0xbf, 0x10, 0xb1, 0x67, 0xbf, 0x47, 0x6c, 0x79, 0xfc, 0xb3, 0xe5, 0x6d, 0x9e, 0x9d, - 0x30, 0x17, 0xed, 0x9f, 0xd8, 0x85, 0x83, 0x13, 0xbb, 0x70, 0x78, 0x62, 0x17, 0xde, 0x24, 0x36, - 0xd8, 0x4f, 0x6c, 0x70, 0x90, 0xd8, 0xe0, 0x30, 0xb1, 0xc1, 0xb7, 0xc4, 0x06, 0x1f, 0xbf, 0xdb, - 0x85, 0x9d, 0xa9, 0x8c, 0xf0, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc4, 0xa1, 0x90, 0x7a, 0x31, - 0x09, 0x00, 0x00, -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.proto b/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.proto deleted file mode 100644 index 17dcc389..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/generated.proto +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - - -// This file was autogenerated by go-to-protobuf. Do not edit it manually! - -syntax = 'proto2'; - -package k8s.io.metrics.pkg.apis.metrics.v1alpha1; - -import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; -import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; - -// Package-wide variables from generator "generated". -option go_package = "v1alpha1"; - -// resource usage metrics of a container. -message ContainerMetrics { - // Container name corresponding to the one from pod.spec.containers. - optional string name = 1; - - // The memory usage is the memory working set. - map usage = 2; -} - -// resource usage metrics of a node. -message NodeMetrics { - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time timestamp = 2; - - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration window = 3; - - // The memory usage is the memory working set. - map usage = 4; -} - -// NodeMetricsList is a list of NodeMetrics. -message NodeMetricsList { - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // List of node metrics. - repeated NodeMetrics items = 2; -} - -// resource usage metrics of a pod. -message PodMetrics { - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time timestamp = 2; - - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration window = 3; - - // Metrics for all containers are collected within the same time window. - repeated ContainerMetrics containers = 4; -} - -// PodMetricsList is a list of PodMetrics. -message PodMetricsList { - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // List of pod metrics. - repeated PodMetrics items = 2; -} - diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/types.go b/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/types.go deleted file mode 100644 index 64d70682..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/types.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 v1alpha1 - -import ( - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +genclient -// +resourceName=nodes -// +genclient:readonly -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// resource usage metrics of a node. -type NodeMetrics struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - Timestamp metav1.Time `json:"timestamp" protobuf:"bytes,2,opt,name=timestamp"` - Window metav1.Duration `json:"window" protobuf:"bytes,3,opt,name=window"` - - // The memory usage is the memory working set. - Usage v1.ResourceList `json:"usage" protobuf:"bytes,4,rep,name=usage,casttype=k8s.io/api/core/v1.ResourceList,castkey=k8s.io/api/core/v1.ResourceName,castvalue=k8s.io/apimachinery/pkg/api/resource.Quantity"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// NodeMetricsList is a list of NodeMetrics. -type NodeMetricsList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // List of node metrics. - Items []NodeMetrics `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// +genclient -// +resourceName=pods -// +genclient:readonly -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// resource usage metrics of a pod. -type PodMetrics struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - Timestamp metav1.Time `json:"timestamp" protobuf:"bytes,2,opt,name=timestamp"` - Window metav1.Duration `json:"window" protobuf:"bytes,3,opt,name=window"` - - // Metrics for all containers are collected within the same time window. - Containers []ContainerMetrics `json:"containers" protobuf:"bytes,4,rep,name=containers"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// PodMetricsList is a list of PodMetrics. -type PodMetricsList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // List of pod metrics. - Items []PodMetrics `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// resource usage metrics of a container. -type ContainerMetrics struct { - // Container name corresponding to the one from pod.spec.containers. - Name string `json:"name" protobuf:"bytes,1,opt,name=name"` - // The memory usage is the memory working set. - Usage v1.ResourceList `json:"usage" protobuf:"bytes,2,rep,name=usage,casttype=k8s.io/api/core/v1.ResourceList,castkey=k8s.io/api/core/v1.ResourceName,castvalue=k8s.io/apimachinery/pkg/api/resource.Quantity"` -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go b/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go deleted file mode 100644 index 4f775add..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1/zz_generated.conversion.go +++ /dev/null @@ -1,169 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by conversion-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - unsafe "unsafe" - - v1 "k8s.io/api/core/v1" - conversion "k8s.io/apimachinery/pkg/conversion" - runtime "k8s.io/apimachinery/pkg/runtime" - metrics "k8s.io/metrics/pkg/apis/metrics" -) - -func init() { - localSchemeBuilder.Register(RegisterConversions) -} - -// RegisterConversions adds conversion functions to the given scheme. -// Public to allow building arbitrary schemes. -func RegisterConversions(scheme *runtime.Scheme) error { - return scheme.AddGeneratedConversionFuncs( - Convert_v1alpha1_ContainerMetrics_To_metrics_ContainerMetrics, - Convert_metrics_ContainerMetrics_To_v1alpha1_ContainerMetrics, - Convert_v1alpha1_NodeMetrics_To_metrics_NodeMetrics, - Convert_metrics_NodeMetrics_To_v1alpha1_NodeMetrics, - Convert_v1alpha1_NodeMetricsList_To_metrics_NodeMetricsList, - Convert_metrics_NodeMetricsList_To_v1alpha1_NodeMetricsList, - Convert_v1alpha1_PodMetrics_To_metrics_PodMetrics, - Convert_metrics_PodMetrics_To_v1alpha1_PodMetrics, - Convert_v1alpha1_PodMetricsList_To_metrics_PodMetricsList, - Convert_metrics_PodMetricsList_To_v1alpha1_PodMetricsList, - ) -} - -func autoConvert_v1alpha1_ContainerMetrics_To_metrics_ContainerMetrics(in *ContainerMetrics, out *metrics.ContainerMetrics, s conversion.Scope) error { - out.Name = in.Name - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_v1alpha1_ContainerMetrics_To_metrics_ContainerMetrics is an autogenerated conversion function. -func Convert_v1alpha1_ContainerMetrics_To_metrics_ContainerMetrics(in *ContainerMetrics, out *metrics.ContainerMetrics, s conversion.Scope) error { - return autoConvert_v1alpha1_ContainerMetrics_To_metrics_ContainerMetrics(in, out, s) -} - -func autoConvert_metrics_ContainerMetrics_To_v1alpha1_ContainerMetrics(in *metrics.ContainerMetrics, out *ContainerMetrics, s conversion.Scope) error { - out.Name = in.Name - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_metrics_ContainerMetrics_To_v1alpha1_ContainerMetrics is an autogenerated conversion function. -func Convert_metrics_ContainerMetrics_To_v1alpha1_ContainerMetrics(in *metrics.ContainerMetrics, out *ContainerMetrics, s conversion.Scope) error { - return autoConvert_metrics_ContainerMetrics_To_v1alpha1_ContainerMetrics(in, out, s) -} - -func autoConvert_v1alpha1_NodeMetrics_To_metrics_NodeMetrics(in *NodeMetrics, out *metrics.NodeMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_v1alpha1_NodeMetrics_To_metrics_NodeMetrics is an autogenerated conversion function. -func Convert_v1alpha1_NodeMetrics_To_metrics_NodeMetrics(in *NodeMetrics, out *metrics.NodeMetrics, s conversion.Scope) error { - return autoConvert_v1alpha1_NodeMetrics_To_metrics_NodeMetrics(in, out, s) -} - -func autoConvert_metrics_NodeMetrics_To_v1alpha1_NodeMetrics(in *metrics.NodeMetrics, out *NodeMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_metrics_NodeMetrics_To_v1alpha1_NodeMetrics is an autogenerated conversion function. -func Convert_metrics_NodeMetrics_To_v1alpha1_NodeMetrics(in *metrics.NodeMetrics, out *NodeMetrics, s conversion.Scope) error { - return autoConvert_metrics_NodeMetrics_To_v1alpha1_NodeMetrics(in, out, s) -} - -func autoConvert_v1alpha1_NodeMetricsList_To_metrics_NodeMetricsList(in *NodeMetricsList, out *metrics.NodeMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]metrics.NodeMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_v1alpha1_NodeMetricsList_To_metrics_NodeMetricsList is an autogenerated conversion function. -func Convert_v1alpha1_NodeMetricsList_To_metrics_NodeMetricsList(in *NodeMetricsList, out *metrics.NodeMetricsList, s conversion.Scope) error { - return autoConvert_v1alpha1_NodeMetricsList_To_metrics_NodeMetricsList(in, out, s) -} - -func autoConvert_metrics_NodeMetricsList_To_v1alpha1_NodeMetricsList(in *metrics.NodeMetricsList, out *NodeMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]NodeMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_metrics_NodeMetricsList_To_v1alpha1_NodeMetricsList is an autogenerated conversion function. -func Convert_metrics_NodeMetricsList_To_v1alpha1_NodeMetricsList(in *metrics.NodeMetricsList, out *NodeMetricsList, s conversion.Scope) error { - return autoConvert_metrics_NodeMetricsList_To_v1alpha1_NodeMetricsList(in, out, s) -} - -func autoConvert_v1alpha1_PodMetrics_To_metrics_PodMetrics(in *PodMetrics, out *metrics.PodMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Containers = *(*[]metrics.ContainerMetrics)(unsafe.Pointer(&in.Containers)) - return nil -} - -// Convert_v1alpha1_PodMetrics_To_metrics_PodMetrics is an autogenerated conversion function. -func Convert_v1alpha1_PodMetrics_To_metrics_PodMetrics(in *PodMetrics, out *metrics.PodMetrics, s conversion.Scope) error { - return autoConvert_v1alpha1_PodMetrics_To_metrics_PodMetrics(in, out, s) -} - -func autoConvert_metrics_PodMetrics_To_v1alpha1_PodMetrics(in *metrics.PodMetrics, out *PodMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Containers = *(*[]ContainerMetrics)(unsafe.Pointer(&in.Containers)) - return nil -} - -// Convert_metrics_PodMetrics_To_v1alpha1_PodMetrics is an autogenerated conversion function. -func Convert_metrics_PodMetrics_To_v1alpha1_PodMetrics(in *metrics.PodMetrics, out *PodMetrics, s conversion.Scope) error { - return autoConvert_metrics_PodMetrics_To_v1alpha1_PodMetrics(in, out, s) -} - -func autoConvert_v1alpha1_PodMetricsList_To_metrics_PodMetricsList(in *PodMetricsList, out *metrics.PodMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]metrics.PodMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_v1alpha1_PodMetricsList_To_metrics_PodMetricsList is an autogenerated conversion function. -func Convert_v1alpha1_PodMetricsList_To_metrics_PodMetricsList(in *PodMetricsList, out *metrics.PodMetricsList, s conversion.Scope) error { - return autoConvert_v1alpha1_PodMetricsList_To_metrics_PodMetricsList(in, out, s) -} - -func autoConvert_metrics_PodMetricsList_To_v1alpha1_PodMetricsList(in *metrics.PodMetricsList, out *PodMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]PodMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_metrics_PodMetricsList_To_v1alpha1_PodMetricsList is an autogenerated conversion function. -func Convert_metrics_PodMetricsList_To_v1alpha1_PodMetricsList(in *metrics.PodMetricsList, out *PodMetricsList, s conversion.Scope) error { - return autoConvert_metrics_PodMetricsList_To_v1alpha1_PodMetricsList(in, out, s) -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/BUILD b/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/BUILD deleted file mode 100644 index 903b9464..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/metrics/pkg/apis/metrics/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/metrics/pkg/apis/metrics:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.pb.go b/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.pb.go deleted file mode 100644 index 4b0e9bac..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.pb.go +++ /dev/null @@ -1,1563 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by protoc-gen-gogo. -// source: k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.proto -// DO NOT EDIT! - -/* - Package v1beta1 is a generated protocol buffer package. - - It is generated from these files: - k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.proto - - It has these top-level messages: - ContainerMetrics - NodeMetrics - NodeMetricsList - PodMetrics - PodMetricsList -*/ -package v1beta1 - -import proto "github.com/gogo/protobuf/proto" -import fmt "fmt" -import math "math" - -import k8s_io_apimachinery_pkg_api_resource "k8s.io/apimachinery/pkg/api/resource" - -import k8s_io_api_core_v1 "k8s.io/api/core/v1" - -import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" - -import strings "strings" -import reflect "reflect" - -import io "io" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package - -func (m *ContainerMetrics) Reset() { *m = ContainerMetrics{} } -func (*ContainerMetrics) ProtoMessage() {} -func (*ContainerMetrics) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } - -func (m *NodeMetrics) Reset() { *m = NodeMetrics{} } -func (*NodeMetrics) ProtoMessage() {} -func (*NodeMetrics) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } - -func (m *NodeMetricsList) Reset() { *m = NodeMetricsList{} } -func (*NodeMetricsList) ProtoMessage() {} -func (*NodeMetricsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } - -func (m *PodMetrics) Reset() { *m = PodMetrics{} } -func (*PodMetrics) ProtoMessage() {} -func (*PodMetrics) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } - -func (m *PodMetricsList) Reset() { *m = PodMetricsList{} } -func (*PodMetricsList) ProtoMessage() {} -func (*PodMetricsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } - -func init() { - proto.RegisterType((*ContainerMetrics)(nil), "k8s.io.metrics.pkg.apis.metrics.v1beta1.ContainerMetrics") - proto.RegisterType((*NodeMetrics)(nil), "k8s.io.metrics.pkg.apis.metrics.v1beta1.NodeMetrics") - proto.RegisterType((*NodeMetricsList)(nil), "k8s.io.metrics.pkg.apis.metrics.v1beta1.NodeMetricsList") - proto.RegisterType((*PodMetrics)(nil), "k8s.io.metrics.pkg.apis.metrics.v1beta1.PodMetrics") - proto.RegisterType((*PodMetricsList)(nil), "k8s.io.metrics.pkg.apis.metrics.v1beta1.PodMetricsList") -} -func (m *ContainerMetrics) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ContainerMetrics) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - if len(m.Usage) > 0 { - keysForUsage := make([]string, 0, len(m.Usage)) - for k := range m.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - for _, k := range keysForUsage { - dAtA[i] = 0x12 - i++ - v := m.Usage[k8s_io_api_core_v1.ResourceName(k)] - msgSize := 0 - if (&v) != nil { - msgSize = (&v).Size() - msgSize += 1 + sovGenerated(uint64(msgSize)) - } - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n1, err := (&v).MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n1 - } - } - return i, nil -} - -func (m *NodeMetrics) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NodeMetrics) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n2, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n2 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Timestamp.Size())) - n3, err := m.Timestamp.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n3 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Window.Size())) - n4, err := m.Window.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n4 - if len(m.Usage) > 0 { - keysForUsage := make([]string, 0, len(m.Usage)) - for k := range m.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - for _, k := range keysForUsage { - dAtA[i] = 0x22 - i++ - v := m.Usage[k8s_io_api_core_v1.ResourceName(k)] - msgSize := 0 - if (&v) != nil { - msgSize = (&v).Size() - msgSize += 1 + sovGenerated(uint64(msgSize)) - } - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n5, err := (&v).MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n5 - } - } - return i, nil -} - -func (m *NodeMetricsList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NodeMetricsList) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n6, err := m.ListMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n6 - if len(m.Items) > 0 { - for _, msg := range m.Items { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - return i, nil -} - -func (m *PodMetrics) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PodMetrics) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n7, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n7 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Timestamp.Size())) - n8, err := m.Timestamp.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n8 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Window.Size())) - n9, err := m.Window.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n9 - if len(m.Containers) > 0 { - for _, msg := range m.Containers { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - return i, nil -} - -func (m *PodMetricsList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PodMetricsList) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n10, err := m.ListMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n10 - if len(m.Items) > 0 { - for _, msg := range m.Items { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - return i, nil -} - -func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - dAtA[offset+4] = uint8(v >> 32) - dAtA[offset+5] = uint8(v >> 40) - dAtA[offset+6] = uint8(v >> 48) - dAtA[offset+7] = uint8(v >> 56) - return offset + 8 -} -func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int { - dAtA[offset] = uint8(v) - dAtA[offset+1] = uint8(v >> 8) - dAtA[offset+2] = uint8(v >> 16) - dAtA[offset+3] = uint8(v >> 24) - return offset + 4 -} -func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return offset + 1 -} -func (m *ContainerMetrics) Size() (n int) { - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Usage) > 0 { - for k, v := range m.Usage { - _ = k - _ = v - l = v.Size() - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - return n -} - -func (m *NodeMetrics) Size() (n int) { - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Timestamp.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Window.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Usage) > 0 { - for k, v := range m.Usage { - _ = k - _ = v - l = v.Size() - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - return n -} - -func (m *NodeMetricsList) Size() (n int) { - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *PodMetrics) Size() (n int) { - var l int - _ = l - l = m.ObjectMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Timestamp.Size() - n += 1 + l + sovGenerated(uint64(l)) - l = m.Window.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Containers) > 0 { - for _, e := range m.Containers { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func (m *PodMetricsList) Size() (n int) { - var l int - _ = l - l = m.ListMeta.Size() - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Items) > 0 { - for _, e := range m.Items { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - return n -} - -func sovGenerated(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} -func sozGenerated(x uint64) (n int) { - return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *ContainerMetrics) String() string { - if this == nil { - return "nil" - } - keysForUsage := make([]string, 0, len(this.Usage)) - for k := range this.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - mapStringForUsage := "k8s_io_api_core_v1.ResourceList{" - for _, k := range keysForUsage { - mapStringForUsage += fmt.Sprintf("%v: %v,", k, this.Usage[k8s_io_api_core_v1.ResourceName(k)]) - } - mapStringForUsage += "}" - s := strings.Join([]string{`&ContainerMetrics{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Usage:` + mapStringForUsage + `,`, - `}`, - }, "") - return s -} -func (this *NodeMetrics) String() string { - if this == nil { - return "nil" - } - keysForUsage := make([]string, 0, len(this.Usage)) - for k := range this.Usage { - keysForUsage = append(keysForUsage, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForUsage) - mapStringForUsage := "k8s_io_api_core_v1.ResourceList{" - for _, k := range keysForUsage { - mapStringForUsage += fmt.Sprintf("%v: %v,", k, this.Usage[k8s_io_api_core_v1.ResourceName(k)]) - } - mapStringForUsage += "}" - s := strings.Join([]string{`&NodeMetrics{`, - `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Timestamp:` + strings.Replace(strings.Replace(this.Timestamp.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, - `Window:` + strings.Replace(strings.Replace(this.Window.String(), "Duration", "k8s_io_apimachinery_pkg_apis_meta_v1.Duration", 1), `&`, ``, 1) + `,`, - `Usage:` + mapStringForUsage + `,`, - `}`, - }, "") - return s -} -func (this *NodeMetricsList) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&NodeMetricsList{`, - `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "NodeMetrics", "NodeMetrics", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *PodMetrics) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PodMetrics{`, - `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Timestamp:` + strings.Replace(strings.Replace(this.Timestamp.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, - `Window:` + strings.Replace(strings.Replace(this.Window.String(), "Duration", "k8s_io_apimachinery_pkg_apis_meta_v1.Duration", 1), `&`, ``, 1) + `,`, - `Containers:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Containers), "ContainerMetrics", "ContainerMetrics", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *PodMetricsList) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PodMetricsList{`, - `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "PodMetrics", "PodMetrics", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func valueToStringGenerated(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} -func (m *ContainerMetrics) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ContainerMetrics: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ContainerMetrics: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.Usage == nil { - m.Usage = make(k8s_io_api_core_v1.ResourceList) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - postmsgIndex := iNdEx + mapmsglen - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue - } else { - var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NodeMetrics) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: NodeMetrics: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NodeMetrics: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Timestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Window", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Window.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.Usage == nil { - m.Usage = make(k8s_io_api_core_v1.ResourceList) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var mapmsglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - mapmsglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - postmsgIndex := iNdEx + mapmsglen - if mapmsglen < 0 { - return ErrInvalidLengthGenerated - } - if postmsgIndex > l { - return io.ErrUnexpectedEOF - } - mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} - if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { - return err - } - iNdEx = postmsgIndex - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue - } else { - var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity - m.Usage[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NodeMetricsList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: NodeMetricsList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NodeMetricsList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, NodeMetrics{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PodMetrics) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PodMetrics: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PodMetrics: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Timestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Window", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Window.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Containers", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Containers = append(m.Containers, ContainerMetrics{}) - if err := m.Containers[len(m.Containers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PodMetricsList) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PodMetricsList: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PodMetricsList: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Items = append(m.Items, PodMetrics{}) - if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenerated(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - return iNdEx, nil - case 1: - iNdEx += 8 - return iNdEx, nil - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - iNdEx += length - if length < 0 { - return 0, ErrInvalidLengthGenerated - } - return iNdEx, nil - case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenerated - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipGenerated(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - } - return iNdEx, nil - case 4: - return iNdEx, nil - case 5: - iNdEx += 4 - return iNdEx, nil - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - } - panic("unreachable") -} - -var ( - ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") -) - -func init() { - proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.proto", fileDescriptorGenerated) -} - -var fileDescriptorGenerated = []byte{ - // 671 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x54, 0xbd, 0x6f, 0x13, 0x31, - 0x1c, 0x8d, 0x9b, 0xa4, 0xb4, 0x0e, 0x94, 0x72, 0x53, 0x95, 0xe1, 0x52, 0x65, 0xa1, 0x42, 0xaa, - 0x4d, 0x3f, 0x84, 0x0a, 0x0b, 0xd2, 0x51, 0x06, 0x24, 0x5a, 0xca, 0xa9, 0x7c, 0x33, 0xe0, 0x5c, - 0xcc, 0xc5, 0xa4, 0x77, 0x8e, 0x6c, 0x5f, 0xaa, 0x6c, 0xa8, 0x62, 0x62, 0x42, 0xfc, 0x55, 0x11, - 0x53, 0xc7, 0x0e, 0xa8, 0x25, 0x61, 0xe6, 0x1f, 0x60, 0x42, 0xe7, 0xf8, 0x72, 0xa1, 0xe9, 0xc7, - 0xd1, 0x81, 0xa9, 0xdb, 0xdd, 0xcf, 0x7e, 0xef, 0xfd, 0xfc, 0x7e, 0xcf, 0x86, 0x5b, 0xcd, 0x35, - 0x89, 0x18, 0xc7, 0xcd, 0xa8, 0x46, 0x45, 0x48, 0x15, 0x95, 0xb8, 0x4d, 0xc3, 0x3a, 0x17, 0xd8, - 0x2c, 0x04, 0x54, 0x09, 0xe6, 0x49, 0xdc, 0x6a, 0xfa, 0x98, 0xb4, 0x98, 0x1c, 0x16, 0xda, 0x4b, - 0x35, 0xaa, 0xc8, 0x12, 0xf6, 0x69, 0x48, 0x05, 0x51, 0xb4, 0x8e, 0x5a, 0x82, 0x2b, 0x6e, 0xdd, - 0x1c, 0x00, 0x91, 0xd9, 0x87, 0x5a, 0x4d, 0x1f, 0xc5, 0xc0, 0x61, 0xc1, 0x00, 0xcb, 0x8b, 0x3e, - 0x53, 0x8d, 0xa8, 0x86, 0x3c, 0x1e, 0x60, 0x9f, 0xfb, 0x1c, 0x6b, 0x7c, 0x2d, 0x7a, 0xaf, 0xff, - 0xf4, 0x8f, 0xfe, 0x1a, 0xf0, 0x96, 0xab, 0xa6, 0x21, 0xd2, 0x62, 0xd8, 0xe3, 0x82, 0xe2, 0xf6, - 0x98, 0x76, 0x79, 0x35, 0xdd, 0x13, 0x10, 0xaf, 0xc1, 0x42, 0x2a, 0x3a, 0x49, 0xe7, 0x58, 0x50, - 0xc9, 0x23, 0xe1, 0xd1, 0x7f, 0x42, 0xe9, 0xf3, 0x92, 0x93, 0xb4, 0xf0, 0x69, 0x28, 0x11, 0x85, - 0x8a, 0x05, 0xe3, 0x32, 0x77, 0xce, 0x03, 0x48, 0xaf, 0x41, 0x03, 0x32, 0x86, 0x5b, 0x39, 0x0d, - 0x17, 0x29, 0xb6, 0x83, 0x59, 0xa8, 0xa4, 0x12, 0xc7, 0x41, 0xd5, 0xbd, 0x3c, 0x9c, 0x7d, 0xc0, - 0x43, 0x45, 0xe2, 0xed, 0x1b, 0x03, 0xe7, 0xad, 0x79, 0x58, 0x08, 0x49, 0x40, 0xe7, 0xc0, 0x3c, - 0x58, 0x98, 0x76, 0xae, 0x76, 0x0f, 0x2b, 0xb9, 0xfe, 0x61, 0xa5, 0xb0, 0x49, 0x02, 0xea, 0xea, - 0x15, 0xab, 0x07, 0x60, 0x31, 0x92, 0xc4, 0xa7, 0x73, 0x13, 0xf3, 0xf9, 0x85, 0xd2, 0xf2, 0x3a, - 0xca, 0x38, 0x4d, 0x74, 0x5c, 0x0c, 0x3d, 0x8b, 0x69, 0x1e, 0x86, 0x4a, 0x74, 0x9c, 0x4f, 0xc0, - 0x48, 0x15, 0x75, 0xf1, 0xf7, 0x61, 0xa5, 0x32, 0x3e, 0x4c, 0xe4, 0x9a, 0xf9, 0x3c, 0x66, 0x52, - 0xed, 0x1d, 0x9d, 0xb9, 0x25, 0xee, 0xf8, 0xf3, 0x51, 0x65, 0x31, 0xcb, 0xb8, 0xd1, 0xd3, 0x88, - 0x84, 0x8a, 0xa9, 0x8e, 0x3b, 0x38, 0x59, 0xb9, 0x01, 0x61, 0xda, 0x9b, 0x35, 0x0b, 0xf3, 0x4d, - 0xda, 0x19, 0x58, 0xe2, 0xc6, 0x9f, 0xd6, 0x3a, 0x2c, 0xb6, 0xc9, 0x4e, 0x14, 0x5b, 0x00, 0x16, - 0x4a, 0xcb, 0x28, 0xb1, 0x60, 0x54, 0x25, 0xf1, 0x01, 0x9d, 0xa0, 0xa2, 0xc1, 0xf7, 0x26, 0xd6, - 0x40, 0xf5, 0x57, 0x01, 0x96, 0x36, 0x79, 0x9d, 0x26, 0xfe, 0xbf, 0x83, 0x53, 0x71, 0x9a, 0xea, - 0x44, 0x11, 0x2d, 0x58, 0x5a, 0xbe, 0x7d, 0x16, 0xb9, 0x36, 0x99, 0xa0, 0xf6, 0x12, 0x7a, 0x52, - 0xfb, 0x40, 0x3d, 0xb5, 0x41, 0x15, 0x71, 0x2c, 0x63, 0x25, 0x4c, 0x6b, 0xee, 0x90, 0xd5, 0x7a, - 0x03, 0xa7, 0xe3, 0x28, 0x49, 0x45, 0x82, 0x96, 0xe9, 0xff, 0x56, 0x36, 0x89, 0x6d, 0x16, 0x50, - 0xe7, 0x86, 0x21, 0x9f, 0xde, 0x4e, 0x48, 0xdc, 0x94, 0xcf, 0x7a, 0x0e, 0x27, 0x77, 0x59, 0x58, - 0xe7, 0xbb, 0x73, 0xf9, 0xf3, 0x9d, 0x49, 0x99, 0xd7, 0x23, 0x41, 0x14, 0xe3, 0xa1, 0x33, 0x63, - 0xd8, 0x27, 0x5f, 0x68, 0x16, 0xd7, 0xb0, 0x59, 0xdf, 0x87, 0xa1, 0x2b, 0xe8, 0xd0, 0xdd, 0xcf, - 0x1c, 0xba, 0x11, 0x73, 0x2f, 0xf3, 0x06, 0xaa, 0xdf, 0x00, 0xbc, 0x3e, 0x62, 0x49, 0x7c, 0x30, - 0xeb, 0xed, 0x58, 0xe6, 0x32, 0x8e, 0x2d, 0x46, 0xeb, 0xc4, 0xcd, 0x1a, 0x33, 0xa7, 0x92, 0xca, - 0x48, 0xde, 0x5e, 0xc1, 0x22, 0x53, 0x34, 0x90, 0xe6, 0xb9, 0x58, 0xbd, 0xc8, 0xe4, 0x9c, 0x6b, - 0xc9, 0xb4, 0x1e, 0xc5, 0x54, 0xee, 0x80, 0xb1, 0xfa, 0x35, 0x0f, 0xe1, 0x16, 0xaf, 0x5f, 0xde, - 0x9d, 0x33, 0xef, 0x4e, 0x00, 0xa1, 0x97, 0xbc, 0xbc, 0xd2, 0xdc, 0x9f, 0xbb, 0x17, 0x7e, 0xb4, - 0x53, 0x87, 0x86, 0x2b, 0xd2, 0x1d, 0x11, 0xa8, 0x76, 0x01, 0x9c, 0x49, 0x87, 0xf2, 0x1f, 0x02, - 0xf6, 0xf2, 0xef, 0x80, 0xad, 0x64, 0x3e, 0x5a, 0xda, 0xe5, 0xc9, 0xf9, 0x72, 0x16, 0xbb, 0x3d, - 0x3b, 0xb7, 0xdf, 0xb3, 0x73, 0x07, 0x3d, 0x3b, 0xf7, 0xb1, 0x6f, 0x83, 0x6e, 0xdf, 0x06, 0xfb, - 0x7d, 0x1b, 0x1c, 0xf4, 0x6d, 0xf0, 0xa3, 0x6f, 0x83, 0x2f, 0x3f, 0xed, 0xdc, 0xeb, 0x2b, 0x86, - 0xef, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xcd, 0xcf, 0xda, 0x29, 0x09, 0x00, 0x00, -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.proto b/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.proto deleted file mode 100644 index 79a891c7..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/generated.proto +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - - -// This file was autogenerated by go-to-protobuf. Do not edit it manually! - -syntax = 'proto2'; - -package k8s.io.metrics.pkg.apis.metrics.v1beta1; - -import "k8s.io/api/core/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; -import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/generated.proto"; -import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; - -// Package-wide variables from generator "generated". -option go_package = "v1beta1"; - -// resource usage metrics of a container. -message ContainerMetrics { - // Container name corresponding to the one from pod.spec.containers. - optional string name = 1; - - // The memory usage is the memory working set. - map usage = 2; -} - -// resource usage metrics of a node. -message NodeMetrics { - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time timestamp = 2; - - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration window = 3; - - // The memory usage is the memory working set. - map usage = 4; -} - -// NodeMetricsList is a list of NodeMetrics. -message NodeMetricsList { - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // List of node metrics. - repeated NodeMetrics items = 2; -} - -// resource usage metrics of a pod. -message PodMetrics { - optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time timestamp = 2; - - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration window = 3; - - // Metrics for all containers are collected within the same time window. - repeated ContainerMetrics containers = 4; -} - -// PodMetricsList is a list of PodMetrics. -message PodMetricsList { - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - - // List of pod metrics. - repeated PodMetrics items = 2; -} - diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/types.go b/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/types.go deleted file mode 100644 index a1f15395..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/types.go +++ /dev/null @@ -1,95 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 v1beta1 - -import ( - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// +genclient -// +resourceName=nodes -// +genclient:readonly -// +genclient:nonNamespaced -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// resource usage metrics of a node. -type NodeMetrics struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - Timestamp metav1.Time `json:"timestamp" protobuf:"bytes,2,opt,name=timestamp"` - Window metav1.Duration `json:"window" protobuf:"bytes,3,opt,name=window"` - - // The memory usage is the memory working set. - Usage v1.ResourceList `json:"usage" protobuf:"bytes,4,rep,name=usage,casttype=k8s.io/api/core/v1.ResourceList,castkey=k8s.io/api/core/v1.ResourceName,castvalue=k8s.io/apimachinery/pkg/api/resource.Quantity"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// NodeMetricsList is a list of NodeMetrics. -type NodeMetricsList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // List of node metrics. - Items []NodeMetrics `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// +genclient -// +resourceName=pods -// +genclient:readonly -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// resource usage metrics of a pod. -type PodMetrics struct { - metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // The following fields define time interval from which metrics were - // collected from the interval [Timestamp-Window, Timestamp]. - Timestamp metav1.Time `json:"timestamp" protobuf:"bytes,2,opt,name=timestamp"` - Window metav1.Duration `json:"window" protobuf:"bytes,3,opt,name=window"` - - // Metrics for all containers are collected within the same time window. - Containers []ContainerMetrics `json:"containers" protobuf:"bytes,4,rep,name=containers"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// PodMetricsList is a list of PodMetrics. -type PodMetricsList struct { - metav1.TypeMeta `json:",inline"` - // Standard list metadata. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds - metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - - // List of pod metrics. - Items []PodMetrics `json:"items" protobuf:"bytes,2,rep,name=items"` -} - -// resource usage metrics of a container. -type ContainerMetrics struct { - // Container name corresponding to the one from pod.spec.containers. - Name string `json:"name" protobuf:"bytes,1,opt,name=name"` - // The memory usage is the memory working set. - Usage v1.ResourceList `json:"usage" protobuf:"bytes,2,rep,name=usage,casttype=k8s.io/api/core/v1.ResourceList,castkey=k8s.io/api/core/v1.ResourceName,castvalue=k8s.io/apimachinery/pkg/api/resource.Quantity"` -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.conversion.go deleted file mode 100644 index b80d297f..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.conversion.go +++ /dev/null @@ -1,169 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by conversion-gen. DO NOT EDIT. - -package v1beta1 - -import ( - unsafe "unsafe" - - v1 "k8s.io/api/core/v1" - conversion "k8s.io/apimachinery/pkg/conversion" - runtime "k8s.io/apimachinery/pkg/runtime" - metrics "k8s.io/metrics/pkg/apis/metrics" -) - -func init() { - localSchemeBuilder.Register(RegisterConversions) -} - -// RegisterConversions adds conversion functions to the given scheme. -// Public to allow building arbitrary schemes. -func RegisterConversions(scheme *runtime.Scheme) error { - return scheme.AddGeneratedConversionFuncs( - Convert_v1beta1_ContainerMetrics_To_metrics_ContainerMetrics, - Convert_metrics_ContainerMetrics_To_v1beta1_ContainerMetrics, - Convert_v1beta1_NodeMetrics_To_metrics_NodeMetrics, - Convert_metrics_NodeMetrics_To_v1beta1_NodeMetrics, - Convert_v1beta1_NodeMetricsList_To_metrics_NodeMetricsList, - Convert_metrics_NodeMetricsList_To_v1beta1_NodeMetricsList, - Convert_v1beta1_PodMetrics_To_metrics_PodMetrics, - Convert_metrics_PodMetrics_To_v1beta1_PodMetrics, - Convert_v1beta1_PodMetricsList_To_metrics_PodMetricsList, - Convert_metrics_PodMetricsList_To_v1beta1_PodMetricsList, - ) -} - -func autoConvert_v1beta1_ContainerMetrics_To_metrics_ContainerMetrics(in *ContainerMetrics, out *metrics.ContainerMetrics, s conversion.Scope) error { - out.Name = in.Name - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_v1beta1_ContainerMetrics_To_metrics_ContainerMetrics is an autogenerated conversion function. -func Convert_v1beta1_ContainerMetrics_To_metrics_ContainerMetrics(in *ContainerMetrics, out *metrics.ContainerMetrics, s conversion.Scope) error { - return autoConvert_v1beta1_ContainerMetrics_To_metrics_ContainerMetrics(in, out, s) -} - -func autoConvert_metrics_ContainerMetrics_To_v1beta1_ContainerMetrics(in *metrics.ContainerMetrics, out *ContainerMetrics, s conversion.Scope) error { - out.Name = in.Name - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_metrics_ContainerMetrics_To_v1beta1_ContainerMetrics is an autogenerated conversion function. -func Convert_metrics_ContainerMetrics_To_v1beta1_ContainerMetrics(in *metrics.ContainerMetrics, out *ContainerMetrics, s conversion.Scope) error { - return autoConvert_metrics_ContainerMetrics_To_v1beta1_ContainerMetrics(in, out, s) -} - -func autoConvert_v1beta1_NodeMetrics_To_metrics_NodeMetrics(in *NodeMetrics, out *metrics.NodeMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_v1beta1_NodeMetrics_To_metrics_NodeMetrics is an autogenerated conversion function. -func Convert_v1beta1_NodeMetrics_To_metrics_NodeMetrics(in *NodeMetrics, out *metrics.NodeMetrics, s conversion.Scope) error { - return autoConvert_v1beta1_NodeMetrics_To_metrics_NodeMetrics(in, out, s) -} - -func autoConvert_metrics_NodeMetrics_To_v1beta1_NodeMetrics(in *metrics.NodeMetrics, out *NodeMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Usage = *(*v1.ResourceList)(unsafe.Pointer(&in.Usage)) - return nil -} - -// Convert_metrics_NodeMetrics_To_v1beta1_NodeMetrics is an autogenerated conversion function. -func Convert_metrics_NodeMetrics_To_v1beta1_NodeMetrics(in *metrics.NodeMetrics, out *NodeMetrics, s conversion.Scope) error { - return autoConvert_metrics_NodeMetrics_To_v1beta1_NodeMetrics(in, out, s) -} - -func autoConvert_v1beta1_NodeMetricsList_To_metrics_NodeMetricsList(in *NodeMetricsList, out *metrics.NodeMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]metrics.NodeMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_v1beta1_NodeMetricsList_To_metrics_NodeMetricsList is an autogenerated conversion function. -func Convert_v1beta1_NodeMetricsList_To_metrics_NodeMetricsList(in *NodeMetricsList, out *metrics.NodeMetricsList, s conversion.Scope) error { - return autoConvert_v1beta1_NodeMetricsList_To_metrics_NodeMetricsList(in, out, s) -} - -func autoConvert_metrics_NodeMetricsList_To_v1beta1_NodeMetricsList(in *metrics.NodeMetricsList, out *NodeMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]NodeMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_metrics_NodeMetricsList_To_v1beta1_NodeMetricsList is an autogenerated conversion function. -func Convert_metrics_NodeMetricsList_To_v1beta1_NodeMetricsList(in *metrics.NodeMetricsList, out *NodeMetricsList, s conversion.Scope) error { - return autoConvert_metrics_NodeMetricsList_To_v1beta1_NodeMetricsList(in, out, s) -} - -func autoConvert_v1beta1_PodMetrics_To_metrics_PodMetrics(in *PodMetrics, out *metrics.PodMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Containers = *(*[]metrics.ContainerMetrics)(unsafe.Pointer(&in.Containers)) - return nil -} - -// Convert_v1beta1_PodMetrics_To_metrics_PodMetrics is an autogenerated conversion function. -func Convert_v1beta1_PodMetrics_To_metrics_PodMetrics(in *PodMetrics, out *metrics.PodMetrics, s conversion.Scope) error { - return autoConvert_v1beta1_PodMetrics_To_metrics_PodMetrics(in, out, s) -} - -func autoConvert_metrics_PodMetrics_To_v1beta1_PodMetrics(in *metrics.PodMetrics, out *PodMetrics, s conversion.Scope) error { - out.ObjectMeta = in.ObjectMeta - out.Timestamp = in.Timestamp - out.Window = in.Window - out.Containers = *(*[]ContainerMetrics)(unsafe.Pointer(&in.Containers)) - return nil -} - -// Convert_metrics_PodMetrics_To_v1beta1_PodMetrics is an autogenerated conversion function. -func Convert_metrics_PodMetrics_To_v1beta1_PodMetrics(in *metrics.PodMetrics, out *PodMetrics, s conversion.Scope) error { - return autoConvert_metrics_PodMetrics_To_v1beta1_PodMetrics(in, out, s) -} - -func autoConvert_v1beta1_PodMetricsList_To_metrics_PodMetricsList(in *PodMetricsList, out *metrics.PodMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]metrics.PodMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_v1beta1_PodMetricsList_To_metrics_PodMetricsList is an autogenerated conversion function. -func Convert_v1beta1_PodMetricsList_To_metrics_PodMetricsList(in *PodMetricsList, out *metrics.PodMetricsList, s conversion.Scope) error { - return autoConvert_v1beta1_PodMetricsList_To_metrics_PodMetricsList(in, out, s) -} - -func autoConvert_metrics_PodMetricsList_To_v1beta1_PodMetricsList(in *metrics.PodMetricsList, out *PodMetricsList, s conversion.Scope) error { - out.ListMeta = in.ListMeta - out.Items = *(*[]PodMetrics)(unsafe.Pointer(&in.Items)) - return nil -} - -// Convert_metrics_PodMetricsList_To_v1beta1_PodMetricsList is an autogenerated conversion function. -func Convert_metrics_PodMetricsList_To_v1beta1_PodMetricsList(in *metrics.PodMetricsList, out *PodMetricsList, s conversion.Scope) error { - return autoConvert_metrics_PodMetricsList_To_v1beta1_PodMetricsList(in, out, s) -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.deepcopy.go deleted file mode 100644 index 2f62c97a..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1/zz_generated.deepcopy.go +++ /dev/null @@ -1,185 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package v1beta1 - -import ( - v1 "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ContainerMetrics) DeepCopyInto(out *ContainerMetrics) { - *out = *in - if in.Usage != nil { - in, out := &in.Usage, &out.Usage - *out = make(v1.ResourceList, len(*in)) - for key, val := range *in { - (*out)[key] = val.DeepCopy() - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerMetrics. -func (in *ContainerMetrics) DeepCopy() *ContainerMetrics { - if in == nil { - return nil - } - out := new(ContainerMetrics) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeMetrics) DeepCopyInto(out *NodeMetrics) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Timestamp.DeepCopyInto(&out.Timestamp) - out.Window = in.Window - if in.Usage != nil { - in, out := &in.Usage, &out.Usage - *out = make(v1.ResourceList, len(*in)) - for key, val := range *in { - (*out)[key] = val.DeepCopy() - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeMetrics. -func (in *NodeMetrics) DeepCopy() *NodeMetrics { - if in == nil { - return nil - } - out := new(NodeMetrics) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NodeMetrics) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeMetricsList) DeepCopyInto(out *NodeMetricsList) { - *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]NodeMetrics, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeMetricsList. -func (in *NodeMetricsList) DeepCopy() *NodeMetricsList { - if in == nil { - return nil - } - out := new(NodeMetricsList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NodeMetricsList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMetrics) DeepCopyInto(out *PodMetrics) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Timestamp.DeepCopyInto(&out.Timestamp) - out.Window = in.Window - if in.Containers != nil { - in, out := &in.Containers, &out.Containers - *out = make([]ContainerMetrics, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetrics. -func (in *PodMetrics) DeepCopy() *PodMetrics { - if in == nil { - return nil - } - out := new(PodMetrics) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PodMetrics) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMetricsList) DeepCopyInto(out *PodMetricsList) { - *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]PodMetrics, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetricsList. -func (in *PodMetricsList) DeepCopy() *PodMetricsList { - if in == nil { - return nil - } - out := new(PodMetricsList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PodMetricsList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} diff --git a/vendor/k8s.io/metrics/pkg/apis/metrics/zz_generated.deepcopy.go b/vendor/k8s.io/metrics/pkg/apis/metrics/zz_generated.deepcopy.go deleted file mode 100644 index 9d5cecc5..00000000 --- a/vendor/k8s.io/metrics/pkg/apis/metrics/zz_generated.deepcopy.go +++ /dev/null @@ -1,185 +0,0 @@ -// +build !ignore_autogenerated - -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by deepcopy-gen. DO NOT EDIT. - -package metrics - -import ( - v1 "k8s.io/api/core/v1" - runtime "k8s.io/apimachinery/pkg/runtime" -) - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ContainerMetrics) DeepCopyInto(out *ContainerMetrics) { - *out = *in - if in.Usage != nil { - in, out := &in.Usage, &out.Usage - *out = make(v1.ResourceList, len(*in)) - for key, val := range *in { - (*out)[key] = val.DeepCopy() - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerMetrics. -func (in *ContainerMetrics) DeepCopy() *ContainerMetrics { - if in == nil { - return nil - } - out := new(ContainerMetrics) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeMetrics) DeepCopyInto(out *NodeMetrics) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Timestamp.DeepCopyInto(&out.Timestamp) - out.Window = in.Window - if in.Usage != nil { - in, out := &in.Usage, &out.Usage - *out = make(v1.ResourceList, len(*in)) - for key, val := range *in { - (*out)[key] = val.DeepCopy() - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeMetrics. -func (in *NodeMetrics) DeepCopy() *NodeMetrics { - if in == nil { - return nil - } - out := new(NodeMetrics) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NodeMetrics) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *NodeMetricsList) DeepCopyInto(out *NodeMetricsList) { - *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]NodeMetrics, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeMetricsList. -func (in *NodeMetricsList) DeepCopy() *NodeMetricsList { - if in == nil { - return nil - } - out := new(NodeMetricsList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NodeMetricsList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMetrics) DeepCopyInto(out *PodMetrics) { - *out = *in - out.TypeMeta = in.TypeMeta - in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - in.Timestamp.DeepCopyInto(&out.Timestamp) - out.Window = in.Window - if in.Containers != nil { - in, out := &in.Containers, &out.Containers - *out = make([]ContainerMetrics, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetrics. -func (in *PodMetrics) DeepCopy() *PodMetrics { - if in == nil { - return nil - } - out := new(PodMetrics) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PodMetrics) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PodMetricsList) DeepCopyInto(out *PodMetricsList) { - *out = *in - out.TypeMeta = in.TypeMeta - out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]PodMetrics, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetricsList. -func (in *PodMetricsList) DeepCopy() *PodMetricsList { - if in == nil { - return nil - } - out := new(PodMetricsList) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *PodMetricsList) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD deleted file mode 100644 index 320e468a..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - ], - importpath = "k8s.io/metrics/pkg/client/clientset_generated/clientset", - deps = [ - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1:go_default_library", - "//vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/fake:all-srcs", - "//staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme:all-srcs", - "//staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1:all-srcs", - "//staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD deleted file mode 100644 index e6820fb4..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1:go_default_library", - "//vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD deleted file mode 100644 index 997d754b..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "metrics_client.go", - "nodemetrics.go", - "podmetrics.go", - ], - importpath = "k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1:go_default_library", - "//vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/nodemetrics.go b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/nodemetrics.go deleted file mode 100644 index c53e95f8..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/nodemetrics.go +++ /dev/null @@ -1,85 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" - v1alpha1 "k8s.io/metrics/pkg/apis/metrics/v1alpha1" - scheme "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme" -) - -// NodeMetricsesGetter has a method to return a NodeMetricsInterface. -// A group's client should implement this interface. -type NodeMetricsesGetter interface { - NodeMetricses() NodeMetricsInterface -} - -// NodeMetricsInterface has methods to work with NodeMetrics resources. -type NodeMetricsInterface interface { - Get(name string, options v1.GetOptions) (*v1alpha1.NodeMetrics, error) - List(opts v1.ListOptions) (*v1alpha1.NodeMetricsList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - NodeMetricsExpansion -} - -// nodeMetricses implements NodeMetricsInterface -type nodeMetricses struct { - client rest.Interface -} - -// newNodeMetricses returns a NodeMetricses -func newNodeMetricses(c *MetricsV1alpha1Client) *nodeMetricses { - return &nodeMetricses{ - client: c.RESTClient(), - } -} - -// Get takes name of the nodeMetrics, and returns the corresponding nodeMetrics object, and an error if there is any. -func (c *nodeMetricses) Get(name string, options v1.GetOptions) (result *v1alpha1.NodeMetrics, err error) { - result = &v1alpha1.NodeMetrics{} - err = c.client.Get(). - Resource("nodes"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of NodeMetricses that match those selectors. -func (c *nodeMetricses) List(opts v1.ListOptions) (result *v1alpha1.NodeMetricsList, err error) { - result = &v1alpha1.NodeMetricsList{} - err = c.client.Get(). - Resource("nodes"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested nodeMetricses. -func (c *nodeMetricses) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Resource("nodes"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/podmetrics.go b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/podmetrics.go deleted file mode 100644 index f030b9dd..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1/podmetrics.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1alpha1 - -import ( - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" - v1alpha1 "k8s.io/metrics/pkg/apis/metrics/v1alpha1" - scheme "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme" -) - -// PodMetricsesGetter has a method to return a PodMetricsInterface. -// A group's client should implement this interface. -type PodMetricsesGetter interface { - PodMetricses(namespace string) PodMetricsInterface -} - -// PodMetricsInterface has methods to work with PodMetrics resources. -type PodMetricsInterface interface { - Get(name string, options v1.GetOptions) (*v1alpha1.PodMetrics, error) - List(opts v1.ListOptions) (*v1alpha1.PodMetricsList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - PodMetricsExpansion -} - -// podMetricses implements PodMetricsInterface -type podMetricses struct { - client rest.Interface - ns string -} - -// newPodMetricses returns a PodMetricses -func newPodMetricses(c *MetricsV1alpha1Client, namespace string) *podMetricses { - return &podMetricses{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the podMetrics, and returns the corresponding podMetrics object, and an error if there is any. -func (c *podMetricses) Get(name string, options v1.GetOptions) (result *v1alpha1.PodMetrics, err error) { - result = &v1alpha1.PodMetrics{} - err = c.client.Get(). - Namespace(c.ns). - Resource("pods"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of PodMetricses that match those selectors. -func (c *podMetricses) List(opts v1.ListOptions) (result *v1alpha1.PodMetricsList, err error) { - result = &v1alpha1.PodMetricsList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("pods"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested podMetricses. -func (c *podMetricses) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("pods"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/BUILD b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/BUILD deleted file mode 100644 index 01ab463f..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "metrics_client.go", - "nodemetrics.go", - "podmetrics.go", - ], - importpath = "k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1:go_default_library", - "//vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/nodemetrics.go b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/nodemetrics.go deleted file mode 100644 index a7b69a52..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/nodemetrics.go +++ /dev/null @@ -1,85 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1beta1 - -import ( - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" - v1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" - scheme "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme" -) - -// NodeMetricsesGetter has a method to return a NodeMetricsInterface. -// A group's client should implement this interface. -type NodeMetricsesGetter interface { - NodeMetricses() NodeMetricsInterface -} - -// NodeMetricsInterface has methods to work with NodeMetrics resources. -type NodeMetricsInterface interface { - Get(name string, options v1.GetOptions) (*v1beta1.NodeMetrics, error) - List(opts v1.ListOptions) (*v1beta1.NodeMetricsList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - NodeMetricsExpansion -} - -// nodeMetricses implements NodeMetricsInterface -type nodeMetricses struct { - client rest.Interface -} - -// newNodeMetricses returns a NodeMetricses -func newNodeMetricses(c *MetricsV1beta1Client) *nodeMetricses { - return &nodeMetricses{ - client: c.RESTClient(), - } -} - -// Get takes name of the nodeMetrics, and returns the corresponding nodeMetrics object, and an error if there is any. -func (c *nodeMetricses) Get(name string, options v1.GetOptions) (result *v1beta1.NodeMetrics, err error) { - result = &v1beta1.NodeMetrics{} - err = c.client.Get(). - Resource("nodes"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of NodeMetricses that match those selectors. -func (c *nodeMetricses) List(opts v1.ListOptions) (result *v1beta1.NodeMetricsList, err error) { - result = &v1beta1.NodeMetricsList{} - err = c.client.Get(). - Resource("nodes"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested nodeMetricses. -func (c *nodeMetricses) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Resource("nodes"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} diff --git a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/podmetrics.go b/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/podmetrics.go deleted file mode 100644 index 1a7ae248..00000000 --- a/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1/podmetrics.go +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright The Kubernetes Authors. - -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. -*/ - -// Code generated by client-gen. DO NOT EDIT. - -package v1beta1 - -import ( - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - watch "k8s.io/apimachinery/pkg/watch" - rest "k8s.io/client-go/rest" - v1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" - scheme "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme" -) - -// PodMetricsesGetter has a method to return a PodMetricsInterface. -// A group's client should implement this interface. -type PodMetricsesGetter interface { - PodMetricses(namespace string) PodMetricsInterface -} - -// PodMetricsInterface has methods to work with PodMetrics resources. -type PodMetricsInterface interface { - Get(name string, options v1.GetOptions) (*v1beta1.PodMetrics, error) - List(opts v1.ListOptions) (*v1beta1.PodMetricsList, error) - Watch(opts v1.ListOptions) (watch.Interface, error) - PodMetricsExpansion -} - -// podMetricses implements PodMetricsInterface -type podMetricses struct { - client rest.Interface - ns string -} - -// newPodMetricses returns a PodMetricses -func newPodMetricses(c *MetricsV1beta1Client, namespace string) *podMetricses { - return &podMetricses{ - client: c.RESTClient(), - ns: namespace, - } -} - -// Get takes name of the podMetrics, and returns the corresponding podMetrics object, and an error if there is any. -func (c *podMetricses) Get(name string, options v1.GetOptions) (result *v1beta1.PodMetrics, err error) { - result = &v1beta1.PodMetrics{} - err = c.client.Get(). - Namespace(c.ns). - Resource("pods"). - Name(name). - VersionedParams(&options, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// List takes label and field selectors, and returns the list of PodMetricses that match those selectors. -func (c *podMetricses) List(opts v1.ListOptions) (result *v1beta1.PodMetricsList, err error) { - result = &v1beta1.PodMetricsList{} - err = c.client.Get(). - Namespace(c.ns). - Resource("pods"). - VersionedParams(&opts, scheme.ParameterCodec). - Do(). - Into(result) - return -} - -// Watch returns a watch.Interface that watches the requested podMetricses. -func (c *podMetricses) Watch(opts v1.ListOptions) (watch.Interface, error) { - opts.Watch = true - return c.client.Get(). - Namespace(c.ns). - Resource("pods"). - VersionedParams(&opts, scheme.ParameterCodec). - Watch() -} diff --git a/vendor/k8s.io/utils/clock/BUILD b/vendor/k8s.io/utils/clock/BUILD index 01347903..1b2e304c 100644 --- a/vendor/k8s.io/utils/clock/BUILD +++ b/vendor/k8s.io/utils/clock/BUILD @@ -3,6 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = ["clock.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/utils/clock", importpath = "k8s.io/utils/clock", visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/utils/exec/BUILD b/vendor/k8s.io/utils/exec/BUILD index f6d1006a..4fa22b95 100644 --- a/vendor/k8s.io/utils/exec/BUILD +++ b/vendor/k8s.io/utils/exec/BUILD @@ -6,6 +6,7 @@ go_library( "doc.go", "exec.go", ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/utils/exec", importpath = "k8s.io/utils/exec", visibility = ["//visibility:public"], ) diff --git a/vendor/github.com/google/cadvisor/http/mux/BUILD b/vendor/k8s.io/utils/pointer/BUILD similarity index 75% rename from vendor/github.com/google/cadvisor/http/mux/BUILD rename to vendor/k8s.io/utils/pointer/BUILD index a77415a9..a41ce263 100644 --- a/vendor/github.com/google/cadvisor/http/mux/BUILD +++ b/vendor/k8s.io/utils/pointer/BUILD @@ -2,8 +2,9 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", - srcs = ["mux.go"], - importpath = "github.com/google/cadvisor/http/mux", + srcs = ["pointer.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/utils/pointer", + importpath = "k8s.io/utils/pointer", visibility = ["//visibility:public"], ) diff --git a/vendor/k8s.io/kubernetes/pkg/util/pointer/pointer.go b/vendor/k8s.io/utils/pointer/pointer.go similarity index 92% rename from vendor/k8s.io/kubernetes/pkg/util/pointer/pointer.go rename to vendor/k8s.io/utils/pointer/pointer.go index 1a517e12..5fbfc6e0 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/pointer/pointer.go +++ b/vendor/k8s.io/utils/pointer/pointer.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -69,3 +69,8 @@ func Int32PtrDerefOr(ptr *int32, def int32) int32 { func BoolPtr(b bool) *bool { return &b } + +// StringPtr returns a pointer to the passed string. +func StringPtr(s string) *string { + return &s +} diff --git a/vendor/vendor.json b/vendor/vendor.json index 3f29c78f..d071f455 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -136,6 +136,34 @@ "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", "revisionTime": "2018-03-23T22:34:25Z" }, + { + "checksumSHA1": "er3PRi2NerMHyCUmmt3ZWW5Gzx0=", + "origin": "k8s.io/kubernetes/vendor/github.com/Rican7/retry", + "path": "github.com/Rican7/retry", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "B8V/jlioLW9/I6er93eHj1TJDVk=", + "origin": "k8s.io/kubernetes/vendor/github.com/Rican7/retry/backoff", + "path": "github.com/Rican7/retry/backoff", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "0w0CqSs4cj7NZm7RmEYp7sTav20=", + "origin": "k8s.io/kubernetes/vendor/github.com/Rican7/retry/jitter", + "path": "github.com/Rican7/retry/jitter", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "+EBOS5n9KLrQ8eFo8iYDyAJTvNM=", + "origin": "k8s.io/kubernetes/vendor/github.com/Rican7/retry/strategy", + "path": "github.com/Rican7/retry/strategy", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "7zRryEqzuHHWp8J7sw1t4IUhSM4=", "path": "github.com/Unknwon/goconfig", @@ -427,67 +455,81 @@ "revision": "" }, { - "checksumSHA1": "WBdJxeR21275YObsdhk5A34MtlI=", + "checksumSHA1": "STThT2WfujFmqVfgVlAhFd9wtco=", + "origin": "k8s.io/kubernetes/vendor/github.com/containerd/console", + "path": "github.com/containerd/console", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "SE60voJDOYHhP3JU1SyEBf+oaGY=", + "origin": "k8s.io/kubernetes/vendor/github.com/containerd/containerd", + "path": "github.com/containerd/containerd", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "oFx0+f0ZokJI7JL1tLwzps8UIxQ=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/api/services/containers/v1", "path": "github.com/containerd/containerd/api/services/containers/v1", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "vcTXx1rS1lALIZ4o23HMtQ9eXVc=", + "checksumSHA1": "EGb9peh47eOt+x23Sr1ckF8nJbM=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/api/services/tasks/v1", "path": "github.com/containerd/containerd/api/services/tasks/v1", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "hDCQaX/Zkp6C8S3Yu2YwIVdZ2d0=", + "checksumSHA1": "6HPmeM1pWyt/yOLVXfNWm1LlRaM=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/api/services/version/v1", "path": "github.com/containerd/containerd/api/services/version/v1", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "l3g6zNM1zV7/MV3ewYiy0rt1zCI=", + "checksumSHA1": "z2zFoFYu0M5UMAhd4AQC/XrpUSI=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/api/types", "path": "github.com/containerd/containerd/api/types", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "1RRoMFlSt5BQNNw2HSAd/WnFqgQ=", + "checksumSHA1": "Bl0TEdZOwn/8K2QMduR7tnvMBYg=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/api/types/task", "path": "github.com/containerd/containerd/api/types/task", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "y6g/5Ap0iZ4raZiXxrSgrFK5uwY=", + "checksumSHA1": "qojLg+WljwZ04sG00NH8hmiVpQQ=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/containers", "path": "github.com/containerd/containerd/containers", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "5q0XKUS32i7Ya0eRUaLEKGTdALw=", + "checksumSHA1": "abvNLwoiuCfqYwUGP+oBM20LiCw=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/dialer", "path": "github.com/containerd/containerd/dialer", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "EnX2+RC+6EnyVw/XelHaJpJcjeo=", + "checksumSHA1": "LPFVmYTbx75JFZbySD3SFhkdFZ8=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/errdefs", "path": "github.com/containerd/containerd/errdefs", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "DQCB4LvBRb2YbKpX46qHUK5KUr4=", + "checksumSHA1": "+fSeiqp84AOSQV3pTIX5RoQVhAs=", "origin": "github.com/google/cadvisor/vendor/github.com/containerd/containerd/namespaces", "path": "github.com/containerd/containerd/namespaces", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "JyLCopudWVhTl9tVNondURUw3sk=", @@ -610,6 +652,13 @@ "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", "revisionTime": "2018-03-23T22:34:25Z" }, + { + "checksumSHA1": "3djQUOr83jk4sksXuRGp4IJvrp0=", + "origin": "k8s.io/kubernetes/vendor/github.com/cyphar/filepath-securejoin", + "path": "github.com/cyphar/filepath-securejoin", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "dvabztWVQX8f6oMLRyv4dLH+TGY=", "origin": "github.com/stretchr/testify/vendor/github.com/davecgh/go-spew/spew", @@ -653,11 +702,11 @@ "revisionTime": "2018-03-23T22:34:25Z" }, { - "checksumSHA1": "/Jf/fJ9modIcYaxwChZwtGbxFTU=", + "checksumSHA1": "6kCv2o4JK4S+kTNpnhGVtAEXOIg=", "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types", "path": "github.com/docker/docker/api/types", - "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", - "revisionTime": "2018-03-23T22:34:25Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "fJMb2e5tbQzl0VXjOTGaSW8u0T8=", @@ -667,7 +716,7 @@ "revisionTime": "2018-03-23T22:34:25Z" }, { - "checksumSHA1": "e5C2966B+DfcM9boa39vPiwQehc=", + "checksumSHA1": "l+IJCZDd4OYSDhYBRIb009PBul0=", "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/container", "path": "github.com/docker/docker/api/types/container", "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", @@ -681,14 +730,14 @@ "revisionTime": "2018-03-23T22:34:25Z" }, { - "checksumSHA1": "XfEI0G7Wo0puyViROhZwbdhXkyk=", + "checksumSHA1": "k8VuYLkMvqcYw/o5v53kkNhXEf0=", "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/filters", "path": "github.com/docker/docker/api/types/filters", - "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", - "revisionTime": "2018-03-23T22:34:25Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6ZynkUElk+QETwZM6u4VQ7v1Fnc=", + "checksumSHA1": "QK0AvGIsxgHImpVe29R/mm6ucOw=", "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/image", "path": "github.com/docker/docker/api/types/image", "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", @@ -751,18 +800,25 @@ "revisionTime": "2018-03-23T22:34:25Z" }, { - "checksumSHA1": "jKL67XgpQIeslHBTnT0rusnde0Y=", + "checksumSHA1": "+8wR4ZC7Mm/2ScHW1HGBkbSY5Ok=", "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/volume", "path": "github.com/docker/docker/api/types/volume", - "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", - "revisionTime": "2018-03-23T22:34:25Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "M9JWRR3ufq/u+MTk0p/HLsOFsLc=", + "checksumSHA1": "Mosehok8KGgEAIBnpZ2hrCGzOR0=", "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/client", "path": "github.com/docker/docker/client", - "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", - "revisionTime": "2018-03-23T22:34:25Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "f8LU3Y5bRiXykIP1kZ+HKkXBllg=", + "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", + "path": "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "9zaE6IgRCl8ni6TQq9IrRP+ybCI=", @@ -796,7 +852,7 @@ "revisionTime": "2018-03-23T22:34:25Z" }, { - "checksumSHA1": "LwEQcFH1tzeTc3R4wlxufxzY4mY=", + "checksumSHA1": "Ijsj6ekel82lArSzcn8v0hVdqiM=", "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/jsonmessage", "path": "github.com/docker/docker/pkg/jsonmessage", "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", @@ -809,10 +865,17 @@ "revisionTime": "2017-07-26T22:03:47Z" }, { - "checksumSHA1": "OftwMeqd/CPdOXNrCD99oKui8YE=", + "checksumSHA1": "RcgZMnKv2wo98B/QSAVJu5kqYYQ=", "path": "github.com/docker/docker/pkg/mount", - "revision": "4f3616fb1c112e206b88cb7a9922bf49067a7756", - "revisionTime": "2017-07-26T22:03:47Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "jzGrdKfaUI6BwFkYp5zVAApRAxo=", + "origin": "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/parsers/operatingsystem", + "path": "github.com/docker/docker/pkg/parsers/operatingsystem", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "cS0+jrjme0j9GX8LLcioQ7ZOBsQ=", @@ -1228,296 +1291,263 @@ "revisionTime": "2018-06-25T03:03:10Z" }, { - "checksumSHA1": "Q2RjHtKk+khmjBlDuDOCkz2Pcps=", - "path": "github.com/google/cadvisor/accelerators", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "checksumSHA1": "JxR9BT+GZ9pUWKTjCNq5YTiEYRs=", + "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor", + "path": "github.com/google/cadvisor", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6zB+3vpVmHbboyqaRDmnNRTXyeI=", - "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/api", - "path": "github.com/google/cadvisor/api", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "checksumSHA1": "+nM6SnN9nvxeFoOYZCAiXtdkDO4=", + "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/accelerators", + "path": "github.com/google/cadvisor/accelerators", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "E/7CJFlE/I4zmEFizqa2sZjCGQk=", + "checksumSHA1": "GgKOPK5pWs/plkRQ7Mlrxo1D48c=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/cache/memory", "path": "github.com/google/cadvisor/cache/memory", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "s5rA//pQW/Uix5n4rweTaRj0pfg=", + "checksumSHA1": "uuOX3u+EVKVxQccRUfecRLjLIWc=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/collector", "path": "github.com/google/cadvisor/collector", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "3R/xPCyxsyAwD0BA3/4hsvidfog=", + "checksumSHA1": "Boa1Sn7ZeEjmuK5laRSTyeJZKWM=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container", "path": "github.com/google/cadvisor/container", - "revision": "d0a17cb4bbdf608559f257a76acfaa9acb054903", - "revisionTime": "2018-06-25T03:03:10Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "coxXJN3847df5g+YMaJVHt3Or2c=", + "checksumSHA1": "H5O1l6KbxfVyj2JjOIaqDSXDkuo=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common", "path": "github.com/google/cadvisor/container/common", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "WsNUZsUEyfiyBYYey+jI28hMcL8=", + "checksumSHA1": "IHjlniafHrhE4CDW/IQ9emYeKy0=", + "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/containerd", "path": "github.com/google/cadvisor/container/containerd", - "revision": "1e567c2ac359c3ed1303e0c80b6cf08edefc841d", - "revisionTime": "2017-12-07T17:52:08Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "IJCZhCU7CZlui0B7t0XTIuGlRs8=", + "checksumSHA1": "lubMjtEo4nnYcHuKJh9bknrR+H0=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/crio", "path": "github.com/google/cadvisor/container/crio", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "v0MxNQRIgqgiza7VPdcDXQyEfOU=", + "checksumSHA1": "OFEbbBu1WGUw+kz0d21FK1LOeeg=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/docker", "path": "github.com/google/cadvisor/container/docker", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "h2D+iZy8BRxYXzT5A+3tCFvJcbM=", + "checksumSHA1": "RWcckuZPLhrW3sR2jF7FtEY21S8=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/libcontainer", "path": "github.com/google/cadvisor/container/libcontainer", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "wPAcLBz7JA0udOTEo7HPEWwkbr8=", + "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/mesos", + "path": "github.com/google/cadvisor/container/mesos", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "BvV1G0mgqsVEN33NLFBZYsoIbOE=", + "checksumSHA1": "lanFeio1r2JLql3vwgpchNkA+fY=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/raw", "path": "github.com/google/cadvisor/container/raw", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "YMYw6zKA0VaxnNoDjMft4bclU3w=", + "checksumSHA1": "DSXMn2rwX2VnyzSGMg9pUt3Oi6Q=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/rkt", "path": "github.com/google/cadvisor/container/rkt", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "BHtSs4g8x6jKImtlT8ofqox4Kmc=", + "checksumSHA1": "fT4ceBKmIHtkxc/Nym41BdshTHo=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/systemd", "path": "github.com/google/cadvisor/container/systemd", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "xeRWkzVEOUUK0jsgPrvGW0eGcSo=", + "checksumSHA1": "7ZMZMTQ5tabIqF65uF2isPtIMZw=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/devicemapper", "path": "github.com/google/cadvisor/devicemapper", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "l5jJeQXmldFlV0k5V7f0/o8LfTQ=", + "checksumSHA1": "J93MH3hw0JMDC0l6ZPYM7GaiMRQ=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/events", "path": "github.com/google/cadvisor/events", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "DfVwVyNBmpl47De2dsaslbJFgPE=", + "checksumSHA1": "9vpv0QCYcdYe4qOBq+N41LkzAe8=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/fs", "path": "github.com/google/cadvisor/fs", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "sKuCwEVycR+wphwLcRtvq2II+W0=", - "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/healthz", - "path": "github.com/google/cadvisor/healthz", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" - }, - { - "checksumSHA1": "DGGTZCYCGHjXa4Xr4ORxGqedPUc=", - "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/http", - "path": "github.com/google/cadvisor/http", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" - }, - { - "checksumSHA1": "JtKr8F24LeE6H3O5Bz/3mcHxpO0=", - "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/http/mux", - "path": "github.com/google/cadvisor/http/mux", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" - }, - { - "checksumSHA1": "K0QdccMbpvmurQJVrI3yEGsG0LM=", + "checksumSHA1": "oS7nugQ7hzXG93qgxHak5w/4M3Q=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/info/v1", "path": "github.com/google/cadvisor/info/v1", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "9tSRQSjWHTAvwQs7a63Ist/3KuU=", + "checksumSHA1": "ousWmEXxZvbjo2p4UuNQbjRYyW4=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/info/v2", "path": "github.com/google/cadvisor/info/v2", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "izk4SHjmVf/trF96WlJZBnBwwN0=", + "checksumSHA1": "bYy1iYcqJLeaK7C/xchum2N9uWs=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/machine", "path": "github.com/google/cadvisor/machine", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "1VwX4NPEcDIB3ubsQutzx4Nwsvc=", + "checksumSHA1": "F1V1I1meuFr3Z5R8EpDRsrQTfqc=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager", "path": "github.com/google/cadvisor/manager", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "cVTJEzJMpbbxuJRcCV5mxDSU9QU=", + "checksumSHA1": "fMFDGt1ZPdAkzIf2WxOD66DUsBQ=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager/watcher", "path": "github.com/google/cadvisor/manager/watcher", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "yzeEdEpH2q0t/fQu1kEAtW3gaxo=", + "checksumSHA1": "ITVoQ93of4JYEOVa3gSRzeXSkdQ=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager/watcher/raw", "path": "github.com/google/cadvisor/manager/watcher/raw", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "GVH8dYflLQlmAKnJVKvRWn2G4Lk=", + "checksumSHA1": "A9jmrOTScD+xZSgL5Mkk4RfhIHI=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/manager/watcher/rkt", "path": "github.com/google/cadvisor/manager/watcher/rkt", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "7b+/DvN8w6zM1y6/HgP5JsF4udg=", + "checksumSHA1": "xW8uX1wvON3UvVq07ykY07Cc53M=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/metrics", "path": "github.com/google/cadvisor/metrics", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" - }, - { - "checksumSHA1": "r9XoeD8+y87gFcbR6hS+mSf5r4E=", - "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/pages", - "path": "github.com/google/cadvisor/pages", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "HeHj4lTWTwH6XOjoOZyop4SqqvY=", - "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/pages/static", - "path": "github.com/google/cadvisor/pages/static", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" - }, - { - "checksumSHA1": "9s6v2kTSAfOTdizi+Wcaq/ytTTY=", + "checksumSHA1": "grV6rjJ8HKDuSdunWr1tusbFT50=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/storage", "path": "github.com/google/cadvisor/storage", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "nN1Txn0ZLB7j2PSg563BVvUa2zc=", + "checksumSHA1": "iAUAJiP2YThQLP3+jH3zWA5Oxzw=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/summary", "path": "github.com/google/cadvisor/summary", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "NvgB8MA3pB5E9DZK2Q7O4cfwdIQ=", + "checksumSHA1": "guU+JeAfQL5IngCTE7ow71DeuE8=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils", "path": "github.com/google/cadvisor/utils", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "gzuuoB8NDNWw6ErDRTvMvtx5a+c=", + "checksumSHA1": "qRR485n9ziSBcOVvdF8DxZ56d/w=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/cloudinfo", "path": "github.com/google/cadvisor/utils/cloudinfo", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "unL8u/yCS5UtOKTK0CvzsDTYQ7o=", + "checksumSHA1": "PX81l45JwF3WEejnn8wuiiHvOYM=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/cpuload", "path": "github.com/google/cadvisor/utils/cpuload", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "pZOsrTdFbqK/rBna6e7stA32hCE=", + "checksumSHA1": "5MeKei5lGhTZyH02R5Lvf7i370Y=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/cpuload/netlink", "path": "github.com/google/cadvisor/utils/cpuload/netlink", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "201Q4o0NzYmCKbP0KNZjtV6CuRk=", + "checksumSHA1": "43ZEcusZFeVinyqnhF1Tsepj/DE=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/docker", "path": "github.com/google/cadvisor/utils/docker", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "+Byae8eL0CJwJ/TctYL35EgzvG8=", + "checksumSHA1": "iVJjHXp8pxyIkm2T+X69cid7gZo=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/oomparser", "path": "github.com/google/cadvisor/utils/oomparser", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "oReNICV802I0Pq6yyMLXWzA4xhM=", + "checksumSHA1": "dCjzirJksq+VnVLQNX6tmaNOV8A=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/sysfs", "path": "github.com/google/cadvisor/utils/sysfs", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "iVozXFKWk1BQLBG3lutmwtbnnUg=", + "checksumSHA1": "4+vA6coVe/P/73Pbvd2NgXcAo8s=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/utils/sysinfo", "path": "github.com/google/cadvisor/utils/sysinfo", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" - }, - { - "checksumSHA1": "fTl5rHpOMEYZFjRHdUwcQBdQ97Q=", - "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/validate", - "path": "github.com/google/cadvisor/validate", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "1SGAXNxpSh3C5vuB5RFyHghVTdw=", + "checksumSHA1": "VMYYvCP4DImcwKEotH6vFMh+GPY=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/version", "path": "github.com/google/cadvisor/version", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "IuxJDv/cCWQjnpi8pF1i9s9E9E8=", + "checksumSHA1": "1R74KNQATPYlSPSzv3Ywf3OwYLs=", "origin": "k8s.io/kubernetes/vendor/github.com/google/cadvisor/zfs", "path": "github.com/google/cadvisor/zfs", - "revision": "5fa2db2bd46ac79e5e00a4e6ed24191080aa463b", - "revisionTime": "2018-01-17T11:44:51Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "L7F9kifLBwr9ssVG7zBxPt09mbk=", @@ -1650,6 +1680,13 @@ "revision": "1ced91f2011b6d20a9572cf782762a1ca5da05c0", "revisionTime": "2017-11-15T14:41:05Z" }, + { + "checksumSHA1": "m7eXv9wsEhm0pcKZHDrmYR//sZc=", + "origin": "k8s.io/kubernetes/vendor/github.com/mattn/go-shellwords", + "path": "github.com/mattn/go-shellwords", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "Nm4B/6KOV4W0Qvxkb10n/02Qan8=", "origin": "k8s.io/kubernetes/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil", @@ -1657,6 +1694,104 @@ "revision": "1ced91f2011b6d20a9572cf782762a1ca5da05c0", "revisionTime": "2017-11-15T14:41:05Z" }, + { + "checksumSHA1": "bh+1i9Q6NBN3V+FjU+d1fkbYOJs=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib", + "path": "github.com/mesos/mesos-go/api/v1/lib", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "Xhujj781AB2C+ouFvSvoyoyCyaY=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/agent", + "path": "github.com/mesos/mesos-go/api/v1/lib/agent", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "KAU7wu1WCiJbKLiWew1uH2gQwl0=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/agent/calls", + "path": "github.com/mesos/mesos-go/api/v1/lib/agent/calls", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "nll+EckyuBsYcqhAadOjBjhotR4=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/client", + "path": "github.com/mesos/mesos-go/api/v1/lib/client", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "xrOMV3Xbh4njVndDkS3Kv3FA2hc=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/debug", + "path": "github.com/mesos/mesos-go/api/v1/lib/debug", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "+/qK4qUanvUOkMmbq6uxONZM4jk=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding", + "path": "github.com/mesos/mesos-go/api/v1/lib/encoding", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "uC1H7HKwlzYRHwSezYGX4vXWGcQ=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/codecs", + "path": "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "8RBSJjP0HuUn5vXDMvKWQpdixfc=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/framing", + "path": "github.com/mesos/mesos-go/api/v1/lib/encoding/framing", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "rnmnewsajm7+q07AZ+8SBnCZ5Jk=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/json", + "path": "github.com/mesos/mesos-go/api/v1/lib/encoding/json", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "oNU2sK49eW9VKg0/brV82rFQ2qU=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/encoding/proto", + "path": "github.com/mesos/mesos-go/api/v1/lib/encoding/proto", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "K9Hxmd8kZSM7WdfUwmOwYSm66IM=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli", + "path": "github.com/mesos/mesos-go/api/v1/lib/httpcli", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "CpSrXefg8su766WVKD/P8FhHcp0=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors", + "path": "github.com/mesos/mesos-go/api/v1/lib/httpcli/apierrors", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "n56hrhpdfYNleTWbiSzfeFGTG3k=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/recordio", + "path": "github.com/mesos/mesos-go/api/v1/lib/recordio", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "QUsYDdAg4eCqUUGKRwHT+HLiibU=", + "origin": "k8s.io/kubernetes/vendor/github.com/mesos/mesos-go/api/v1/lib/roles", + "path": "github.com/mesos/mesos-go/api/v1/lib/roles", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "g0TelN5W7TupZJBAWmQtG7ClkM8=", "origin": "github.com/google/cadvisor/vendor/github.com/mindprince/gonvml", @@ -1921,6 +2056,13 @@ "revision": "d59fa0ac68bb5dd932ee8d24eed631cdd519efc3", "revisionTime": "2016-09-11T05:10:23Z" }, + { + "checksumSHA1": "HXhFcdlkE/ny/szNs9pL1NZ/8UY=", + "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers", + "path": "github.com/opencontainers", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "8ShNS+Ev72sG1tSIb9LoPahx34o=", "path": "github.com/opencontainers/go-digest", @@ -1942,7 +2084,7 @@ "revisionTime": "2017-11-15T14:41:05Z" }, { - "checksumSHA1": "TWegsfELeRD/pAzZNhBscygigTo=", + "checksumSHA1": "TOL9cb9xlmtZrQ8Lr/CwIfGnD5c=", "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer", "path": "github.com/opencontainers/runc/libcontainer", "revision": "1ced91f2011b6d20a9572cf782762a1ca5da05c0", @@ -1983,25 +2125,32 @@ "revisionTime": "2017-11-15T14:41:05Z" }, { - "checksumSHA1": "Hsxftr43p9BsDSzAGtF0qfk8AdY=", + "checksumSHA1": "zC06v7s7XHTwrafuVomHwSHxTqA=", "path": "github.com/opencontainers/runc/libcontainer/configs", - "revision": "4d6e6720a7c885c37b4cb083c0d372dda3425120", - "revisionTime": "2017-08-25T13:55:27Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "o2Lm45rd6DYh47MFoGivOmsRoKU=", + "checksumSHA1": "Q7LxxxsLcH5lbk1fLVKJGVyZQV8=", "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/configs/validate", "path": "github.com/opencontainers/runc/libcontainer/configs/validate", - "revision": "1ced91f2011b6d20a9572cf782762a1ca5da05c0", - "revisionTime": "2017-11-15T14:41:05Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "HtaoLFLlQ/ofDsbbchtvZCEPq0o=", + "checksumSHA1": "C4ABEeyWMnDtJn96RRuMivt/wps=", "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/criurpc", "path": "github.com/opencontainers/runc/libcontainer/criurpc", "revision": "1ced91f2011b6d20a9572cf782762a1ca5da05c0", "revisionTime": "2017-11-15T14:41:05Z" }, + { + "checksumSHA1": "NZwACUXpojb83Hpxfict7g4SKYI=", + "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/intelrdt", + "path": "github.com/opencontainers/runc/libcontainer/intelrdt", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "koRFS+nSVfk22byfIrCC4jjJkU0=", "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/keys", @@ -2009,6 +2158,13 @@ "revision": "1ced91f2011b6d20a9572cf782762a1ca5da05c0", "revisionTime": "2017-11-15T14:41:05Z" }, + { + "checksumSHA1": "mqoAX8S1bt81ZtpC7GXo+fTm1hg=", + "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/mount", + "path": "github.com/opencontainers/runc/libcontainer/mount", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "4Mi3Wm+rTP8d8k+heobAxsC/aUs=", "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/seccomp", @@ -2024,10 +2180,10 @@ "revisionTime": "2017-11-15T14:41:05Z" }, { - "checksumSHA1": "Yd7vPcBsfWE12ZWNK0KuBiRNAJY=", + "checksumSHA1": "P+1ZU3Bgk/PgDlB+u/pb09JgsWk=", "path": "github.com/opencontainers/runc/libcontainer/system", - "revision": "4d6e6720a7c885c37b4cb083c0d372dda3425120", - "revisionTime": "2017-08-25T13:55:27Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "AtG3hKl/TGN/5LCMlGbhCvdXozU=", @@ -2037,7 +2193,7 @@ "revisionTime": "2017-07-26T22:03:47Z" }, { - "checksumSHA1": "NPZpaXX1rAZHJy5Iwob9P/J5QmY=", + "checksumSHA1": "/UnpU+gINPd3R8DbItfBQroGHgQ=", "origin": "k8s.io/kubernetes/vendor/github.com/opencontainers/runc/libcontainer/utils", "path": "github.com/opencontainers/runc/libcontainer/utils", "revision": "1ced91f2011b6d20a9572cf782762a1ca5da05c0", @@ -2098,6 +2254,20 @@ "revision": "f6abca593680b2315d2075e0f5e2a9751e3f431a", "revisionTime": "2017-06-01T20:57:54Z" }, + { + "checksumSHA1": "rEPSS7+9fTmDbg6OXlHgzcmEmIo=", + "origin": "k8s.io/kubernetes/vendor/github.com/pquerna/ffjson/fflib/v1", + "path": "github.com/pquerna/ffjson/fflib/v1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "pjfUu4VSc0t3hdZsrStAj1NMMY0=", + "origin": "k8s.io/kubernetes/vendor/github.com/pquerna/ffjson/fflib/v1/internal", + "path": "github.com/pquerna/ffjson/fflib/v1/internal", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, { "checksumSHA1": "XxeRfD/ySMCs523Aw9zBQCQv18k=", "origin": "k8s.io/kubernetes/vendor/github.com/prometheus/client_golang/prometheus", @@ -2837,11 +3007,11 @@ "revisionTime": "2018-06-25T03:03:10Z" }, { - "checksumSHA1": "vyB7Daa7cfmzd05AE8G7dlt3VrI=", + "checksumSHA1": "NPRfneC2sxKtw7hV2+9tWJe9+3Y=", "origin": "k8s.io/kubernetes/vendor/gopkg.in/square/go-jose.v2", "path": "gopkg.in/square/go-jose.v2", - "revision": "fc32d2f3698e36b93322a3465f63a14e9f0eaead", - "revisionTime": "2018-03-23T22:34:25Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "0xb/XzEeizc89xmlBK8F/oD5DH4=", @@ -2878,14 +3048,21 @@ "revisionTime": "2015-09-24T14:23:14Z" }, { - "checksumSHA1": "r2I/LkrB6QcAqJnUWuuRlHIze3k=", + "checksumSHA1": "ogk59PtDyCEMaZHZc5qSFplj4po=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/api", + "path": "k8s.io/api", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "Oxy6RDKo6jVmeLIhQg3Ni7RGxT8=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/admissionregistration/v1alpha1", "path": "k8s.io/api/admissionregistration/v1alpha1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "m7JKQhxXXEzTT8tqOjCAq8pd5XI=", + "checksumSHA1": "DDcMp4ISdYDt7cc1ZcnTqFOa2oU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/admissionregistration/v1beta1", "path": "k8s.io/api/admissionregistration/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", @@ -2897,147 +3074,161 @@ "revision": "" }, { - "checksumSHA1": "EZwvNTydmjbok1/AePBtmXmFn40=", + "checksumSHA1": "OZHilT6U6yPwZacRzG0Cmd3DF+M=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/apps/v1beta1", "path": "k8s.io/api/apps/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "s0J4oD5MFIYJ555iuoJ4rjPwADY=", + "checksumSHA1": "33HUrUmBI7kMbWAQerSrAyMt0Cc=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/apps/v1beta2", "path": "k8s.io/api/apps/v1beta2", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "EY7PECAlgT9HVguHv6ik5vgei3Q=", + "checksumSHA1": "8ulzcXx+pMVix8PII5VvpSGid2E=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/authentication/v1", "path": "k8s.io/api/authentication/v1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "4xDW6rSpt1VSqVTaDpPs6tFDPlY=", + "checksumSHA1": "X13qeLUlOBLknOk+iiXFseyL5h4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/authentication/v1beta1", "path": "k8s.io/api/authentication/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "buqaDt4ckONyUAlgsxyYj+OjkJs=", + "checksumSHA1": "wLwTwB21QSVrHpgnEQUXK9YOtA4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/authorization/v1", "path": "k8s.io/api/authorization/v1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "6vZVuMW0Gktmc0bGD+Ub6LSyaNg=", + "checksumSHA1": "FuMAm4AS9FQhinNa6ePnyW9siXI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/authorization/v1beta1", "path": "k8s.io/api/authorization/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "mkTxFnNBuOYYLmhC7FIKQ7pDnkI=", + "checksumSHA1": "V6Oi2x1CFvJD6FBAZiDkJlM8JFw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v1", "path": "k8s.io/api/autoscaling/v1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "JKjtnRtDs2YcMYAZ/QsvM62XhSo=", + "checksumSHA1": "ppXNAyxbLoQk59EWlGZ+5hqNclM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta1", "path": "k8s.io/api/autoscaling/v2beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "OAwDoJNQyljENtvduSjb77ibURI=", + "checksumSHA1": "NWUYZF5T73lYExYKqhYFVHFYwRk=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta2", + "path": "k8s.io/api/autoscaling/v2beta2", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "tzENcsk971hEu590FdN+JFYW3gI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/batch/v1", "path": "k8s.io/api/batch/v1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "6vKBbTZCofpsvwY9Iky5+iiGXbk=", + "checksumSHA1": "sN8vtwpmuFH4FpWkhULMdyrH5qI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/batch/v1beta1", "path": "k8s.io/api/batch/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "ThwB+p0+8+Q5I//0P308uSPdK6o=", + "checksumSHA1": "/+u0qIpCWVWSPSzkPTIOspwISQQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/batch/v2alpha1", "path": "k8s.io/api/batch/v2alpha1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "6ZwUFYpjzTjvZCSDN3knXQn1dQw=", + "checksumSHA1": "KpZjvT8RSqz4a+kng2rIVGGdtK8=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/certificates/v1beta1", "path": "k8s.io/api/certificates/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "N+ghj7ilQTnYEgwEeUB/4RkHFuY=", + "checksumSHA1": "qNQG7lX19ZH0CBsvdK6q3alVW6w=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/api/coordination/v1beta1", + "path": "k8s.io/api/coordination/v1beta1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "mGN3rkv2ABGKC/wp+PoNKfDYE5E=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/core/v1", "path": "k8s.io/api/core/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "YerNrc3SJARuTfGyXi4dnAMiXVc=", + "checksumSHA1": "6i564hnjwdt02rJYJsTWjAVEaEM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/events/v1beta1", "path": "k8s.io/api/events/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "ftfZSp3UhkP/vGvo/gDnUkZo+AE=", + "checksumSHA1": "v+yV4o1p4NUBjSQ0Vg8hDOyrA8I=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/extensions/v1beta1", "path": "k8s.io/api/extensions/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "eQLKwMAAhUIO4AHXEEcOd9ZraaI=", + "checksumSHA1": "59B7lWHlaB8WGIhGkJjf5gPpEcA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/networking/v1", "path": "k8s.io/api/networking/v1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "Ia6+YK8uvqe4HPQ90avsUxIyKGc=", + "checksumSHA1": "g8NOPihch7a8PeDg2gE+E/bXy6k=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/policy/v1beta1", "path": "k8s.io/api/policy/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "teru1Iqcg9I/s63sbT+bveP3v+E=", + "checksumSHA1": "i1Vo+55BlpPYLptLMhzG/1xDRkA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1", "path": "k8s.io/api/rbac/v1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "XOUipMav1feRURdQ6mxMfSN+53Q=", + "checksumSHA1": "uGGnp4QCeOcEAq04FGGscurDa1Y=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1alpha1", "path": "k8s.io/api/rbac/v1alpha1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "PoPVeRMabC9f7ETPn9Y4KZfj0x0=", + "checksumSHA1": "6npuBb0IAP1vEbg72fZ0PxL6lpg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/rbac/v1beta1", "path": "k8s.io/api/rbac/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "0pJNC/QV0eYexEjMDa17YT6z+Wc=", + "checksumSHA1": "pex+qkcMdbGylMOKnb1wURKcGHI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1alpha1", "path": "k8s.io/api/scheduling/v1alpha1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", @@ -3049,1499 +3240,1593 @@ "revision": "" }, { - "checksumSHA1": "nQjeYRsM79uQftp0JCZis9vTQsQ=", + "checksumSHA1": "SF/nU+CqGCXlf3HQ4nje6ZsnNJU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/settings/v1alpha1", "path": "k8s.io/api/settings/v1alpha1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "8BVhl70KRlbwtu8nUpt7+RmJnDk=", + "checksumSHA1": "4kCMl2z/35DXp8IVQJj1gcVB+UM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1", "path": "k8s.io/api/storage/v1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "icc2ihujo0rNn4bDRbi9qYTalEM=", + "checksumSHA1": "9zhc0Li6rvEbLr4yUDDw/j74jFs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1alpha1", "path": "k8s.io/api/storage/v1alpha1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "JhmOe/rXiPd0e54q60pZla+Lgg0=", + "checksumSHA1": "hjmb6mAzX7An5ZfljX00yLqcDuE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/api/storage/v1beta1", "path": "k8s.io/api/storage/v1beta1", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "wGqMyGQGvKCC5aieAWmsseAxBDs=", + "checksumSHA1": "dKpY5inaEsCVsgJW/BYsQgvKNEw=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver", + "path": "k8s.io/apiextensions-apiserver", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "xZuhQA7F+elgAgIWbyH+qKGu7uk=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server", + "path": "k8s.io/apiextensions-apiserver/pkg/cmd/server", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "aNqCitp+2ffjGdWZvKeJ1HEyPYY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/features", "path": "k8s.io/apiextensions-apiserver/pkg/features", "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "PHEosEphl6qMGMG2huK39aeHsVk=", + "checksumSHA1": "2VSiMqO0NqYtju+qnBsKYIR5gIw=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery", + "path": "k8s.io/apimachinery", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "4XbJaUfYIjQFDz+2BOitBWAtjcM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/equality", "path": "k8s.io/apimachinery/pkg/api/equality", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "weSvlC4gGGEOyMKlI/qi1wv3enk=", + "checksumSHA1": "dkwZjUBKqhfKnc9abeqTMlJVIXY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/errors", "path": "k8s.io/apimachinery/pkg/api/errors", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "/eKxBUnTIZ8NkhwXH2AM5gCXBpw=", + "checksumSHA1": "EUC7lOE9TetTdnyNO2SWhairiJ4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/meta", "path": "k8s.io/apimachinery/pkg/api/meta", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "9v9niYY6EjgUFOGWR3oDCUVFvr8=", + "checksumSHA1": "LJoDUvdMKYHn9a7ynnWkJ9pXUZQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/resource", "path": "k8s.io/apimachinery/pkg/api/resource", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Mj4nPl+sxtGvXfFBOzQLHFoPOt0=", + "checksumSHA1": "XnICqUep5TVDpEHQEaZFjq9oa6U=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/validation", "path": "k8s.io/apimachinery/pkg/api/validation", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "tN6nP3hv4LW/ByoCPWgbdd4E4/I=", + "checksumSHA1": "y+WGTohxgZ/4zVtO1/sVkIXRYOA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/api/validation/path", "path": "k8s.io/apimachinery/pkg/api/validation/path", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "xPzFnPPy+0BJmTaUHwe59e2oiAY=", + "checksumSHA1": "oat+x0qF1kOC6FFcBbQmD8eXPSI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion", "path": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "akQ3dEpCG9pMzqqeNeQHIMVJ7IM=", + "checksumSHA1": "duspFyhvKORPqJ+kfIasVOhTDRU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1", "path": "k8s.io/apimachinery/pkg/apis/meta/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSA1": "SrGFnakWfEoF6tPS9zzwJf51DgY=", - "checksumSHA1": "09N2ql993GLsTA59Yz35Yw75d/o=", + "checksumSHA1": "VU+GTaVKzolKtZgsSESZqkMixXk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", "path": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "2H8qCtNEhnotVIIC9j9XLjVBA54=", + "checksumSHA1": "9jCUQE5A/6/xumDPjZnRmHsRWW0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation", "path": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "MIM6zm15kwr7wb46dgo71G3JQB0=", + "checksumSHA1": "a9+gtAVEDVUyIhOTB1XFzrC0sac=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1", "path": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "bzaWnvyssRstHgtLRvwoDapEUH0=", + "checksumSHA1": "By5fNYMa5etP16D4ZaFfdp1FXgQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/conversion", "path": "k8s.io/apimachinery/pkg/conversion", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "bWARKXvxrHzqviSGZPoie8FWKOo=", + "checksumSHA1": "IEo8Zgcu8H3MKlrcYlNWYNE3Xnc=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/conversion/queryparams", "path": "k8s.io/apimachinery/pkg/conversion/queryparams", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "TyAXc7KU9RGmm+Qo7fBRdeRnKnY=", + "checksumSHA1": "+sY+5SyMRSKiW7OusvE+4mXgdHQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/fields", "path": "k8s.io/apimachinery/pkg/fields", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "jgt1LU7zAUa3+wuxU9jA6VN3JRA=", + "checksumSHA1": "WLxW1TyD4ZceWulRTuUdHURSIFw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/labels", "path": "k8s.io/apimachinery/pkg/labels", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "vP9fa3fHaDHOoJlpsJGeuY6EWXE=", + "checksumSHA1": "Ip/uZRsm+3c/p6Hs6fanLwE75xY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime", "path": "k8s.io/apimachinery/pkg/runtime", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "9Wyy3ibU+FpkVOwVIj8kBoXcxzY=", + "checksumSHA1": "zVcjFWwCqVCmTFddfxnsKAqpYKo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/schema", "path": "k8s.io/apimachinery/pkg/runtime/schema", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "y03R2ZeTm8QrLVsueIODSfEnYb0=", + "checksumSHA1": "sNIhhAuQyOutMGaehJ1YPqUGGzw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer", "path": "k8s.io/apimachinery/pkg/runtime/serializer", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Bw/GFayXeZ3lC+c6ddhmAI6IKOQ=", + "checksumSHA1": "qsI8LUU6jvX6+UE6Kk77Z2yUAQw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json", "path": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "qNfaSnYQAGJUIDM9SqI8UoFJLns=", + "checksumSHA1": "XgCtO37Uc1xBOqdMIBuimpQBjpY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf", "path": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Ybpu6Yt4iipOUy9Jta4+6uADBYo=", + "checksumSHA1": "x/4g4nVToOcvyZIG8pRS1TYmiEI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer", "path": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "nwnB9Qtkz4/XFehizZSSVlro2+Q=", + "checksumSHA1": "NaZryWvEHFlVOo7ZotkMCwfW2mI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming", "path": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "LN0G09Di0yJ+DXS7qPOqDu6nfww=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing", - "path": "k8s.io/apimachinery/pkg/runtime/serializer/testing", - "revision": "d0a17cb4bbdf608559f257a76acfaa9acb054903", - "revisionTime": "2018-06-25T03:03:10Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "jFPikhIjhzfv4932KDGoYjlxSPg=", + "checksumSHA1": "yTXQiDUP1a8TcmLXB7Q7iygfV7E=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning", "path": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "jjMq79D66L64Ku50azu5VuL6J+I=", + "checksumSHA1": "RXPI8WOBP3SHAg9/McOcxo4sP6k=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/selection", "path": "k8s.io/apimachinery/pkg/selection", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "G8pYfJVf1w5vHjt3P82kep9LvE8=", + "checksumSHA1": "ikmoDZwhaOijl0Oc5vU/ynKc3R0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/types", "path": "k8s.io/apimachinery/pkg/types", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "cwhl+/umxL39ay+D+gRBWlaINhQ=", + "checksumSHA1": "YjtSDyT/QmR7iMGxLfH26j4Fb2w=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/cache", "path": "k8s.io/apimachinery/pkg/util/cache", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "gCp0Ass1rHbvPj9BiCA410LoKvg=", + "checksumSHA1": "0nuH8GGDNr6V7alXMB1noFpTiaQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/clock", "path": "k8s.io/apimachinery/pkg/util/clock", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "0ol/oXuiu2xLshVxC5pLaat4HIg=", + "checksumSHA1": "bZNhdH2guAd0Byar9fOti235GJs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/diff", "path": "k8s.io/apimachinery/pkg/util/diff", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "abkrrvywuG9N/kkRHf3nIRD1GLw=", + "checksumSHA1": "mF/6lyDVfA8vZqC8ygrstTn6+jk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/errors", "path": "k8s.io/apimachinery/pkg/util/errors", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "DCs2PmVMe/k7HH+nJwiyYSAIGxk=", + "checksumSHA1": "C02s0CnJ6Qmefu1OHHXBMjbjc5A=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/framer", "path": "k8s.io/apimachinery/pkg/util/framer", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "IHPMskFsuZ8OC8GvXjV6OJyB+z4=", + "checksumSHA1": "SyN8qVjYs1yX/6JE9oGUALSyPaA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/httpstream", "path": "k8s.io/apimachinery/pkg/util/httpstream", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Y9pWpCX+q4aMebquT8pL5dOiERE=", + "checksumSHA1": "ZXkfA6I45bsGoNLgDGUy7zuqjlo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy", "path": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "5cP/qtOOI+wTtKGRSbLtHVchXjg=", + "checksumSHA1": "tfzVra6txlVoBXViwmTBWmCnFas=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/intstr", "path": "k8s.io/apimachinery/pkg/util/intstr", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Vyk+/h8TRKQmQzQR1PIlSvCmRZo=", + "checksumSHA1": "Q/lujfSX9dpH2C9GQlPK6Fd4G6g=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/json", "path": "k8s.io/apimachinery/pkg/util/json", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "E+/9A5G3Sva5oF/5WlCY7mvL3fE=", + "checksumSHA1": "VkHronQigZJHVKkWMAGycCQFfC0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/mergepatch", "path": "k8s.io/apimachinery/pkg/util/mergepatch", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "AMGa8gZocdwJvRqyT6H476/7zCA=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/net", - "path": "k8s.io/apimachinery/pkg/util/net", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "PaWqljjNOnnk6gvVXvW8GvgHYcE=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/naming", + "path": "k8s.io/apimachinery/pkg/util/naming", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "DI9OpFhQNB6NPFmFo8o/8UQBcM8=", - "path": "k8s.io/apimachinery/pkg/util/proxy", - "revision": "" + "checksumSHA1": "bwlW+y861HalKsarJTRZ5h2BhIw=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/net", + "path": "k8s.io/apimachinery/pkg/util/net", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "7/BYCsBWttIzbn/ItoXiNzSi594=", + "checksumSHA1": "6PbV1PVG0OdW4MkuJKt9a+KELbY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/rand", "path": "k8s.io/apimachinery/pkg/util/rand", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "1EieYfezEHBuBw6D6v+7hTXaTeU=", + "checksumSHA1": "15JFuYtIrx3d+b5ZalwNa1hYzUk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/remotecommand", "path": "k8s.io/apimachinery/pkg/util/remotecommand", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "/Pvb7G3FVnktiZquFdpbZJtB8Fo=", + "checksumSHA1": "5tJdWtS9YJFPk49Sb9QwkY1c72o=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/runtime", "path": "k8s.io/apimachinery/pkg/util/runtime", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "3vsVsuGn/5BccjiFB5GT7Cqbh7k=", + "checksumSHA1": "5fP0TZog8mzsI+2cmy4y2hb2pRQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/sets", "path": "k8s.io/apimachinery/pkg/util/sets", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "LvbO/a7GVMxIk31mX4uGptqMzS4=", + "checksumSHA1": "z1M/bXsJsOM+SQpsTxHA+MlXKFk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/strategicpatch", "path": "k8s.io/apimachinery/pkg/util/strategicpatch", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "caW0MTHgJhaIKaQbCmyAw4tZ488=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/uuid", - "path": "k8s.io/apimachinery/pkg/util/uuid", - "revision": "d0a17cb4bbdf608559f257a76acfaa9acb054903", - "revisionTime": "2018-06-25T03:03:10Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "441FR+VIqNsy/FPYt8zwLhrsByU=", + "checksumSHA1": "EVJjOwv6kfkGN7zDyeU0Jubnres=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/validation", "path": "k8s.io/apimachinery/pkg/util/validation", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "Vnja7o7P3qcUf8g6uYd3JYxA9LY=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/validation/field", - "path": "k8s.io/apimachinery/pkg/util/validation/field", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Vnja7o7P3qcUf8g6uYd3JYxA9LY=", + "checksumSHA1": "CVde7lREFLq8DppeD/bbjnDnAew=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/validation/field", "path": "k8s.io/apimachinery/pkg/util/validation/field", - "revision": "d0a17cb4bbdf608559f257a76acfaa9acb054903", - "revisionTime": "2018-06-25T03:03:10Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "nQIHPPPAhBGvBbxI6NtW1zpR4U8=", + "checksumSHA1": "fOdxTVQI6Fd9Z2PcXH4nZnk5P/M=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait", "path": "k8s.io/apimachinery/pkg/util/wait", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "IMgdtzNwq8wmUUZ7J/NXsxlg8WQ=", + "checksumSHA1": "VEmmciGJxuGsXVJoARePrUpjhow=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/yaml", "path": "k8s.io/apimachinery/pkg/util/yaml", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "UZZBJs80or78waySt7tptGpoAqA=", + "checksumSHA1": "ycqSch8LCRuoMcAUbhigJm1BzmE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/version", "path": "k8s.io/apimachinery/pkg/version", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Dt9WLaWvblshllkkO44c0alXmrA=", + "checksumSHA1": "1Szb2hbez+VLVIJKGeWAtmjvkKM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/watch", "path": "k8s.io/apimachinery/pkg/watch", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6iPPUJHHdM8+KQZNaUsWs+AOSzg=", + "checksumSHA1": "MhxdPngf9Lc6hWzjTdAdtJhazuo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/json", "path": "k8s.io/apimachinery/third_party/forked/golang/json", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "zy/q6Nn9SYoUwFf17resx8Bnq2U=", + "checksumSHA1": "UQ9CkKzmtGNQ+0tDtn+mVoMAig4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil", "path": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "UIqIi0NXnlDGrKOnYzeEtxfxatM=", + "checksumSHA1": "d9AbS8ZSdID8KVh8mRWbPYL8nRc=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect", "path": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "6itCrRvjK9VXV2cDynnOfJR2UTQ=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver", + "path": "k8s.io/apiserver", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "1SsuL5I+NAtnZU0fSu2f/39KBhI=", + "checksumSHA1": "WYhZFhKzPDInxE0dz2alS6tb30A=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/authenticator", "path": "k8s.io/apiserver/pkg/authentication/authenticator", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "QLMW0AHSGcOITt2tSaNFK3hygMk=", + "checksumSHA1": "4kqadBJFYBOLnBFTnYgx9EbBS1M=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount", "path": "k8s.io/apiserver/pkg/authentication/serviceaccount", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "vDPbrlhigK0npFdKlmeeEzkNhz4=", + "checksumSHA1": "lJIff61meY4O2Zs9bmAWkP4tr24=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authentication/user", "path": "k8s.io/apiserver/pkg/authentication/user", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "oR7Ea5dP6NoIYmTXaUoUcfaDzKo=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/authorization/authorizer", - "path": "k8s.io/apiserver/pkg/authorization/authorizer", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "PeOZdhAW61dvsvsLlZaklxkmE84=", + "checksumSHA1": "Gyz8Nfaj/xy2+qB48/S7Z4vMp4c=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/features", "path": "k8s.io/apiserver/pkg/features", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "mzEQ23P9nM0A0DPUpHxo48mSq6E=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/healthz", - "path": "k8s.io/apiserver/pkg/server/healthz", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "xnY4q4o7vI+H4MBUeQ2J9pDsmio=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server", + "path": "k8s.io/apiserver/pkg/server", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lkQOiDrVNuZuSza9bVZV3c8loCs=", + "checksumSHA1": "Ai6TSfdC8Dirpl6udalUZhUF9yA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/httplog", "path": "k8s.io/apiserver/pkg/server/httplog", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "AZzm+5WKaI/DZO7esvBSbHefEcI=", + "checksumSHA1": "iVnFg77ahHiEjTHq+fWpHUC63M0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage", "path": "k8s.io/apiserver/pkg/storage", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "m2GfdBnMlL0g6wRk/98snl2vn6w=", + "checksumSHA1": "yZ4KpJYffjoM0SyMv5SngV2G11c=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd", "path": "k8s.io/apiserver/pkg/storage/etcd", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "H+mLErafkTexOhnDT7KDiZCFL4o=", + "checksumSHA1": "idcewuaUL/yhuCXkHwAT9M0ctCM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics", "path": "k8s.io/apiserver/pkg/storage/etcd/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lLHnsNyHtNiYTEcar83I9Qkue9M=", + "checksumSHA1": "24jSTmsCtIITMF6D4FtrvFkCSZU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd/util", "path": "k8s.io/apiserver/pkg/storage/etcd/util", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "pRpt+ersOFDDmL0VRWJJ2fToNbU=", + "checksumSHA1": "zQai4aXM3/+5N+J8UB3VdRzEIwA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/feature", "path": "k8s.io/apiserver/pkg/util/feature", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lo2uva5R+8d07LTgTJ6GcHB8WOI=", + "checksumSHA1": "XX+30+g7/2sfYsewgtU+jIb/9+w=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flag", "path": "k8s.io/apiserver/pkg/util/flag", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "t3zZopWOoupU06iTORXSHm+js3Y=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/flushwriter", - "path": "k8s.io/apiserver/pkg/util/flushwriter", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "L0Klq4TIANEMPez+LnMCNNAQQQk=", + "checksumSHA1": "Ml3ABS+vBm3lWrPwrxudhqzMPGs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/logs", "path": "k8s.io/apiserver/pkg/util/logs", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Ju0ISdK2u3MqBg6volbQRjOHY1k=", + "checksumSHA1": "ZsvsnEZU38kpbqXhXQPAUMhSiY0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/trace", "path": "k8s.io/apiserver/pkg/util/trace", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "LiHAgiIHQOF8G3fm7sjQbDbADFg=", + "checksumSHA1": "ngz675TQH5v+sOcUGtVvGNYXTgs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/util/wsstream", "path": "k8s.io/apiserver/pkg/util/wsstream", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "gulrW/o0pCGyG/jr+AbzNGlMW7s=", + "checksumSHA1": "aCIlXD4ADxDG8Z3v09s3c8GPKhU=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go", + "path": "k8s.io/client-go", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "9sfQK/lzlj+q+xpLI+cp7iW2GIY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery", "path": "k8s.io/client-go/discovery", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "IMDhkmVNk/sN0xidnqQANHWxXWI=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/dynamic", + "path": "k8s.io/client-go/dynamic", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "4pyCzlediPAl9P977NGIakDzJj4=", + "checksumSHA1": "wnoawQq0w4MXDCzUhFG6/7hRbyM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers", "path": "k8s.io/client-go/informers", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "kwUQdBnXhqM+ICIlscPJRuSNqD4=", + "checksumSHA1": "24E7yPoLP63RsfGk62M3VZaeavM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration", "path": "k8s.io/client-go/informers/admissionregistration", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "xoMhsg+428VuU4rk2BPT98tbvBA=", + "checksumSHA1": "l1O837gYg7q5+Yfbbe44v1I10Kw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1", "path": "k8s.io/client-go/informers/admissionregistration/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lQCVNrWpiPepNwxf5etqoQGWRPU=", + "checksumSHA1": "kpNeC4jk/HSOm4MdufHNPuftLU0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1", "path": "k8s.io/client-go/informers/admissionregistration/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "cbRv6qkIYSaOPhDatxK+sVSptUw=", + "checksumSHA1": "SWEuaZ6PjppMvgvce9zD7HXaeM0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps", "path": "k8s.io/client-go/informers/apps", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "GrmqxjUzVaGRqy+Qk7zkIwvlhQw=", + "checksumSHA1": "NXatsWFAO671SnYOM1/ISu61Mbs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1", "path": "k8s.io/client-go/informers/apps/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "TN0HUxe2I0gjzsacCnISZ9/M0yI=", + "checksumSHA1": "Lqtcjj1uxi7cJ4FID/j6fPjzDIw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1beta1", "path": "k8s.io/client-go/informers/apps/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "b61KRqHPBJjdodLAwhiVdNbQa0U=", + "checksumSHA1": "b88s9I9Sto3IxiqlRgHwNQr4r0I=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/apps/v1beta2", "path": "k8s.io/client-go/informers/apps/v1beta2", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "wZuCMgJY6QyR6FlrQZnds/Tu+kA=", + "checksumSHA1": "UlOOKi73whtpcFT88xPD2ygPBPE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling", "path": "k8s.io/client-go/informers/autoscaling", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "uTLFHbBHfhfrXvl9e8e0BWFYSS8=", + "checksumSHA1": "NK4m+qCOMi9af2gaKiaAQbrH7LE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v1", "path": "k8s.io/client-go/informers/autoscaling/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "uBBCPOElufhq3YOcn6Mmfpc1rWI=", + "checksumSHA1": "fxJaSJdQDYJmCVofBkEVkdULaeA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v2beta1", "path": "k8s.io/client-go/informers/autoscaling/v2beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "Rjm2MMd7MAvF0f0Lp3QNaDR/oVc=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/autoscaling/v2beta2", + "path": "k8s.io/client-go/informers/autoscaling/v2beta2", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "9+kNjsyqhwVNtp86I78cuoLchUM=", + "checksumSHA1": "4vJB5G/omoOISUiudpqRp4hkGek=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch", "path": "k8s.io/client-go/informers/batch", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "MIAl1lI+/t9xcO3oIfU7fNCJeXk=", + "checksumSHA1": "CPYt9VvSnYYCP12NX16P6h6g6o4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v1", "path": "k8s.io/client-go/informers/batch/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "py+I5kl+7b+nrM6pUwfzWRySd58=", + "checksumSHA1": "7h45F/1gADAUCuwOHQFdebY0rMk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v1beta1", "path": "k8s.io/client-go/informers/batch/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "O/WXwTKaKOrVdBfVaVrcozt0Ba8=", + "checksumSHA1": "klBZfXMkGK1OvkPkEb2Okid0XPw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/batch/v2alpha1", "path": "k8s.io/client-go/informers/batch/v2alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "T40YJEv2/fjcT6IN2l20iatxrMw=", + "checksumSHA1": "KQjwF8agHW0k3DDuPhDeXsQoAHw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/certificates", "path": "k8s.io/client-go/informers/certificates", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "N7T/skKyG8VJKHnPFh/ZL8YEh+k=", + "checksumSHA1": "OQIfNOxrFxF/mKV8tndZZlrSWDs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/certificates/v1beta1", "path": "k8s.io/client-go/informers/certificates/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "JU9z/7a2ktMi9jy7DctVgCHJL0k=", + "checksumSHA1": "TP7s7ZBVkwY3sylAchhG9uf/9rw=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/coordination", + "path": "k8s.io/client-go/informers/coordination", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "xF2Fl1nccot42HZcnKnk8pRrGKY=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/coordination/v1beta1", + "path": "k8s.io/client-go/informers/coordination/v1beta1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "odeDcmuBcMiJZdZFmXm6XwpRN0w=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/core", "path": "k8s.io/client-go/informers/core", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "LmgFPV+Xi+cEACTp9VXBeJpM7tc=", + "checksumSHA1": "LZV72br2m+eQjEasocTNhBgPvZ4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/core/v1", "path": "k8s.io/client-go/informers/core/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "rclDo7qkJAT859Yy8bjnj3Dbfsk=", + "checksumSHA1": "1QgdvWeC07kqY+6AkGop302NEFo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events", "path": "k8s.io/client-go/informers/events", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "tA8WHVPjqUNApCq5erXMHaI1UYw=", + "checksumSHA1": "wLtDbS+f/5Bkkd9AhhtJ0fUra6Y=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events/v1beta1", "path": "k8s.io/client-go/informers/events/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "hp137A4lf3jAT+rdG9poWmUJfks=", + "checksumSHA1": "VZ4LpCIejMyNmAIor2HJkimqG9s=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/extensions", "path": "k8s.io/client-go/informers/extensions", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Vrgn/h2mbbBy5OmNn+0y6nHgA+0=", + "checksumSHA1": "fNzaqfPKZ61SbOHXi7a7IdsHzDE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/extensions/v1beta1", "path": "k8s.io/client-go/informers/extensions/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "i5ogW2qHzwkJ4/bQpue1OJWzyXM=", + "checksumSHA1": "xJqaIoZkJuLYUbsuljWH6seRDRU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/internalinterfaces", "path": "k8s.io/client-go/informers/internalinterfaces", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "xPsAQm+2uJEchj0yb9XTklszvRA=", + "checksumSHA1": "lz6RL2rTc67ROlKSQ78fZ47A3Co=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/networking", "path": "k8s.io/client-go/informers/networking", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "R3S9wZ4SolCG0k8u71osPC5+kBg=", + "checksumSHA1": "bzvVuadDuQRLce1QPwThSmBEJb0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/networking/v1", "path": "k8s.io/client-go/informers/networking/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "jlM66IS9FiMNiiKGT7+UvOzPTQg=", + "checksumSHA1": "9PrGeinicCRxx0tO4D6kkaWfRls=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/policy", "path": "k8s.io/client-go/informers/policy", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "d4bdRMcsf6rng3Auvcc89otIcIE=", + "checksumSHA1": "wqogD7fIxBOpN89BHVPhfjtG2Nc=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/policy/v1beta1", "path": "k8s.io/client-go/informers/policy/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "1huXCPgVObuYg4oSpZ0unOMfeD8=", + "checksumSHA1": "bcNyiWmOsXPmpNhyBTPCBUS+c/k=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac", "path": "k8s.io/client-go/informers/rbac", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Cm8W6ngLVMUcc93/xVhwO7ZWz0Q=", + "checksumSHA1": "377NIiOJqVi7R9F7iM9V04c1+j0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1", "path": "k8s.io/client-go/informers/rbac/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "N+4vOM7HNw68VPIyb/dGw79t0BI=", + "checksumSHA1": "OeKSiKXgVBo7/Xdk9WLQAUYUR84=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1alpha1", "path": "k8s.io/client-go/informers/rbac/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Lwb+CzmLgQxuOvejs8dROPjdcZk=", + "checksumSHA1": "+A1CyB6x0MGovriqgS8gacN5imQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/rbac/v1beta1", "path": "k8s.io/client-go/informers/rbac/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "saQ0M6u4aqbTtF0FCAs9mlv+8RI=", + "checksumSHA1": "oI3l70WR1syuBw1SvEktsfOcCrQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling", "path": "k8s.io/client-go/informers/scheduling", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "XQoXspJ+wlwsU+Z/lR/KNULdy9w=", + "checksumSHA1": "gyDyT4WW/4Tl6oaLaaNycTixhbg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling/v1alpha1", "path": "k8s.io/client-go/informers/scheduling/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "e5ZeygUr/sgnDgs/b29KtTdGDVc=", + "checksumSHA1": "B0pGdR394T+bTiXZwYh9ouwow3g=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/scheduling/v1beta1", "path": "k8s.io/client-go/informers/scheduling/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "09GYDA9TrkZqid3NVKrEPfDHl/c=", + "checksumSHA1": "DxfFS0kY45/L9yd9sZnXfjcnegM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/settings", "path": "k8s.io/client-go/informers/settings", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "X4rLJ7ARR3h+T5lGobXasLNmYTE=", + "checksumSHA1": "7jYSpxHLKvwAt43ayrdHTkhaLdY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/settings/v1alpha1", "path": "k8s.io/client-go/informers/settings/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "r3jg91SbO+4zF/YW56x7zF5v6MA=", + "checksumSHA1": "iTYVfwRIoPkpCplZ53ZEESYubSs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage", "path": "k8s.io/client-go/informers/storage", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "sfA75XU1UInucSMbOz5Q9+b3ad8=", + "checksumSHA1": "mrQCF9YLVi2w2//YLQtiD7W+Wvk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1", "path": "k8s.io/client-go/informers/storage/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "XwvSA2K7ZqDlpcqjgkuC+AolOX0=", + "checksumSHA1": "9Rt+fc83shQqTgpckzcys8RwqRE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1alpha1", "path": "k8s.io/client-go/informers/storage/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Vln+xj039L3d+uDbE48+yZ1pPd8=", + "checksumSHA1": "4cu0PotKzTyfQt4hr9IAedm9uvI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/storage/v1beta1", "path": "k8s.io/client-go/informers/storage/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Z0UQ9sCJpqBoxFnAovld/OiHUU0=", + "checksumSHA1": "3zpLBGFZbbEdX5cCs1cvcUTBil4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes", "path": "k8s.io/client-go/kubernetes", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "2gO8H48233beU37LDOE+77e0StM=", + "checksumSHA1": "bW4E6ewfEUc3tfR8BOCxfFyqmBU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/scheme", "path": "k8s.io/client-go/kubernetes/scheme", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "jFVpF3AHXLYor8Zfb5qm+fDC1Ro=", + "checksumSHA1": "vJ/2MjJEwmGtHGM+Otx2PMrFmLI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", "path": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "K376N/XhlUqlHSqtjSEK7dWgb+s=", + "checksumSHA1": "Nmc0MGYRVVold/o7Hhf9NSeiDfM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "QYfdSfKmxdwxCZTs1yeSr6e2IzM=", + "checksumSHA1": "AC+O/LDb01T94R8Go4zVn0QWe3E=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1", "path": "k8s.io/client-go/kubernetes/typed/apps/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "WdocoWuk3BvlnMnpqhZeCf3cgdU=", + "checksumSHA1": "ykiV2gHU6F6d890cd4RLaMv0tuY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "e7FUPpZm8HvZ4ym08HfR3pH+Hl4=", + "checksumSHA1": "hblMagkOmMkY0KHgeo0p25eSH0I=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2", "path": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "IhbmzYcMKsdRACSxnUNHghfUICQ=", + "checksumSHA1": "CSFvwLti0dKn0RkMxsIKUymsgYA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1", "path": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "CefrUol6SV5qzvSYzqyWBdV/HaY=", + "checksumSHA1": "kp+Swisl/oBHQfjzktHBagZ29T4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "qLfQYdirfyHX2FNW07J2OCVrmDk=", + "checksumSHA1": "4etvSZj3KL4bbpISFKvLpYytaV8=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1", "path": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "kFoDxrsOQinBOENN0VjhEz2bVcU=", + "checksumSHA1": "pbNb/stGujaMdywM+nTvdh+uP9Q=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "IMUTGTFcqS7Vh7bU8KjlRMxxAZU=", + "checksumSHA1": "Gu2/RTBrhP2Vfqg/BRy7gXc3NcE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1", "path": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Qqhc2psVDr4cV3khV5G/xJMCTv4=", + "checksumSHA1": "fXaVT6Wjj9raTslS7GJ7POmjJ5I=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", "path": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "DE4LhPpNeLZqgqqNcTc68LyDuV0=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", + "path": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "N4cZs2009UeB9zhx1OF+6A3gX6A=", + "checksumSHA1": "5ZdWEbgcFplFAQgNZivA5Pa64aw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1", "path": "k8s.io/client-go/kubernetes/typed/batch/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "+hpk6tKsJ2MxOqt6AG4iZtFpYGY=", + "checksumSHA1": "YspODYNkTKlHGejpj/oEcGFBudg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "kqmuLQQHCkf9Oo9U51vYJtV2j90=", + "checksumSHA1": "15aFfH5k+webMqcDIQ6DNArzClY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1", "path": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "FtCa2PZAK+cfQMgb9tyJ+/+ucVU=", + "checksumSHA1": "9VXQbFT2PPRY3mwQkB/KQAXYfRU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "sDs2hu0C6VocEoSqmTF08XmmAZo=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1", + "path": "k8s.io/client-go/kubernetes/typed/coordination/v1beta1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "eCvkNvLXknR35FyhVdbeJcroPWg=", + "checksumSHA1": "k41qXtmkD592PrQq7DNlwurVHVk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/core/v1", "path": "k8s.io/client-go/kubernetes/typed/core/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "ogDCNgjC1DFq6koQJzAmXuH2ZcU=", + "checksumSHA1": "27n1J2BGyIMN6glvTshZS4yYXjo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/events/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Kq5xHWKAOJZHiybfFLuc4DMZJTI=", + "checksumSHA1": "3cksaoicvgVAHqEQ6gDmWAGX9iU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "sOg81oQdU+uvfiaH4jLLmuHojoM=", + "checksumSHA1": "5gYnLgp+dam9UWClj8G61jt1W4A=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/networking/v1", "path": "k8s.io/client-go/kubernetes/typed/networking/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "UWogb9zh1Gpz5YPst+ewJuQosws=", + "checksumSHA1": "ZVcNfNs1vvDQ+lVWt2aUdYtRuLg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "L8tBnUJA160KZLUWokChZAmJaUg=", + "checksumSHA1": "ZtHZkzmNPHMnOs6eDWocLYT4QiQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1", "path": "k8s.io/client-go/kubernetes/typed/rbac/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "QYXb625dtMSKYvlnfT1ZcBIKcIk=", + "checksumSHA1": "oO1c+/oHrV/auH0cZGPe2f6eva0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", "path": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "niXoahSb+My/fRUdS0bytQg99n4=", + "checksumSHA1": "d0GWzuZHBRanKQWOMx0qVejW0fg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lnYhM0fMWv0Ldq9WJjj7WpeWSSs=", + "checksumSHA1": "oeqMC4cewxSSqhG9bV6Ca8VUe8E=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", "path": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "wLg0R81BaZC5tVY0/BlqhPkW8lI=", + "checksumSHA1": "HQyn8uGTs2QKhWdkP7LiOMAkU00=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "3kIhrvrSfC5YeLrP8+2j4Mw5ess=", + "checksumSHA1": "8ge9uEJ89bnGONik3LbIL3oMj8E=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1", "path": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "yo8xgmpr2JKOtkMYn/NwmxQzSCA=", + "checksumSHA1": "nL73h28O6vNqndYSilF/4K2QFek=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1", "path": "k8s.io/client-go/kubernetes/typed/storage/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "XzyoYeqFWKrCu/ycQRzxX546LdE=", + "checksumSHA1": "gJE+xrccG4s7koAWU0+71ar0ZKY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1", "path": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "AY8lekG+EyiyrTmaZmTQseMmoT4=", + "checksumSHA1": "lILPBXzJ2Sg3EaWbFawyGvm5wrM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1", "path": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "4oJeX6Ap9C3BgaEbZGrtOm0Rf1I=", + "checksumSHA1": "gFQjUZmcpPq3YGsCvmfPolbGEbo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1", "path": "k8s.io/client-go/listers/admissionregistration/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "AX5cY0bn+0Sl5HlGSeI2ZCc3Bo4=", + "checksumSHA1": "Ie3gkTPiJlkwwtjePyoAHE1GNmM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1", "path": "k8s.io/client-go/listers/admissionregistration/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "5aVqj0BAGMrV8bJ3xA+mrl3xGz4=", + "checksumSHA1": "NaNq/S5Dp9DBgiEtnd0/2orBWvs=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1", "path": "k8s.io/client-go/listers/apps/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Ycfh0Y4DXB3+ZTk6kXY6Wu1KRr0=", + "checksumSHA1": "dQ/TbeP4e6kTxN7ByhzAdr5yMqY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1beta1", "path": "k8s.io/client-go/listers/apps/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "2e6VH9pjYkcCNyj1LnZq2KwZUaU=", + "checksumSHA1": "aXa+ODeQPBPgQjZzu5fMupkkk74=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/apps/v1beta2", "path": "k8s.io/client-go/listers/apps/v1beta2", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "GB4DYgsr6Em+KRpbMCe2CTBKINM=", + "checksumSHA1": "e40/pMHO5/rY9roYC39A2OjQkIY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v1", "path": "k8s.io/client-go/listers/autoscaling/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "pwNSdCjy7xkwvH+s52ur6dNmbkU=", + "checksumSHA1": "p3jj4lEFl4+VhyvR2iLoi3TYJow=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v2beta1", "path": "k8s.io/client-go/listers/autoscaling/v2beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "mIO1a74025pBNpA72ZqJgmL12aM=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/autoscaling/v2beta2", + "path": "k8s.io/client-go/listers/autoscaling/v2beta2", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "qTH6eFe8Mp+jtkvrlJggOcCZfjQ=", + "checksumSHA1": "34yILx0MHMNKhWBnGWl18Qcxi4s=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v1", "path": "k8s.io/client-go/listers/batch/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "gt7QcYzH071LCsNcw1hiIC9wr8k=", + "checksumSHA1": "y/eyKp0Fa1mOULCfPXHuMj5ByqE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v1beta1", "path": "k8s.io/client-go/listers/batch/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "vZXZ8r77eRvxtkcU/9K1U/jK3dQ=", + "checksumSHA1": "awP5gS6q1yHM1RdadgkR5zdhebU=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/batch/v2alpha1", "path": "k8s.io/client-go/listers/batch/v2alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "tg2nBcUcsF2JqtK70PefHI4wtLQ=", + "checksumSHA1": "KuAV/MwfCg7WtUJue1bz+emmpKk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/certificates/v1beta1", "path": "k8s.io/client-go/listers/certificates/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "+z6LtXTSzn9QitD2sL18V+2tPF4=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/coordination/v1beta1", + "path": "k8s.io/client-go/listers/coordination/v1beta1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Yox2lWLXjk59wJQlKJ7ZzeVFmvw=", + "checksumSHA1": "tL422zj/8tNIEhfmvhOqjSrHSow=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/core/v1", "path": "k8s.io/client-go/listers/core/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Ubi5Qsph8aXJ3qRpmxvvQkY+4sE=", + "checksumSHA1": "YepQrKWTxJL6btZGQulsZRCl8kw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/events/v1beta1", "path": "k8s.io/client-go/listers/events/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "BIxhM4G6nYxlphiZij7Y8ZpVQD0=", + "checksumSHA1": "FsqzlFKFhZosK9HXjFwGBM1ROrA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/extensions/v1beta1", "path": "k8s.io/client-go/listers/extensions/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "IUY9xvr8NB8ILO0NyUus3L47gYw=", + "checksumSHA1": "8lzWsv3AhTTltnwqyPEy/ZVdAxA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/networking/v1", "path": "k8s.io/client-go/listers/networking/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "eMeYrQyxelyV9OD6lnyvzbeu/Qo=", + "checksumSHA1": "EErDS850yIrS1UxnHPrnDx09j7Y=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/policy/v1beta1", "path": "k8s.io/client-go/listers/policy/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "RPwqLRCBRcvMKSHKW5PeX3F32GE=", + "checksumSHA1": "0flmAQikSb6jEUYGl9UmcQ74aY0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1", "path": "k8s.io/client-go/listers/rbac/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "RiyydWtp0NikOhm5ZBBv40aOzK4=", + "checksumSHA1": "p2gieMvMq8pj/jWeUX3Ak1WDYTo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1alpha1", "path": "k8s.io/client-go/listers/rbac/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "BQH+73U5s/G2w3sIGZkfq/nyUyU=", + "checksumSHA1": "KMeJNHSZkaVAk1eKaD2F+d+5neE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/rbac/v1beta1", "path": "k8s.io/client-go/listers/rbac/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "70maguYPljilI9AwBVznt5nx1xg=", + "checksumSHA1": "zs/2Bb1e7zGRSGy1X9UEO3RCrX4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/scheduling/v1alpha1", "path": "k8s.io/client-go/listers/scheduling/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "76JTXJtJOplhHLsz1yPL7FV9cHk=", + "checksumSHA1": "7n7ZGdULYvqn7Wkzz5So7FWv/eo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/scheduling/v1beta1", "path": "k8s.io/client-go/listers/scheduling/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "KJfo4U4tF18uJcXBedMlyDjgzxc=", + "checksumSHA1": "rwGnG3HQCYWgKJe8oeBvJsS41R0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/settings/v1alpha1", "path": "k8s.io/client-go/listers/settings/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "rF3ywOUVTmzs7uKlwkH7q5rP9U8=", + "checksumSHA1": "yNn/9iota6Y3Va4h3we/Oyj1jYE=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1", "path": "k8s.io/client-go/listers/storage/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "q77/Icrlw9l5u8eSBwDlXUvIkhc=", + "checksumSHA1": "vu0cPd+eR9DUZ9CJr60jnOUewGY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1alpha1", "path": "k8s.io/client-go/listers/storage/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "eRM893v/cmOsNUaN9oueuhlbGQs=", + "checksumSHA1": "M+VVxsiF/ln13Y9wwK2jNHLwMK8=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/storage/v1beta1", "path": "k8s.io/client-go/listers/storage/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "+0dyiRTxlDp8mCu9vCVo+vPpa/4=", + "checksumSHA1": "1NsQQALrDtvUI8TfdogVVAC5uNM=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication", "path": "k8s.io/client-go/pkg/apis/clientauthentication", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "jTAoX9DPYprloQ4Wo7eruyyuSqA=", + "checksumSHA1": "iyA3E5oka4nSKmydoTdiKNbx+zA=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", "path": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "XG202ZJJtDkRE446L6mGnBaUDu8=", + "checksumSHA1": "yqJ9/hPpv8zF8yrTRFrEhe94Ydk=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", "path": "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "pbxOJCDRybyNC99VxEcGwEMsBVE=", + "checksumSHA1": "xaXNfdLg74njErpzHZiw7/ubJdY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/pkg/version", "path": "k8s.io/client-go/pkg/version", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "AzH/RRNr2Nla4T2/WWyHvYybirs=", + "checksumSHA1": "wu2hcDFqyC5lpIf6dTe8B9R5PvY=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec", "path": "k8s.io/client-go/plugin/pkg/client/auth/exec", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "C6R/FMaQgzkUeCnMKQvK4mkGARw=", + "checksumSHA1": "g64KIKHQzBBQ/hDNuH+0NxvRk+w=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/rest", "path": "k8s.io/client-go/rest", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6ASq7jxDEScHqZqdQHarXIE+1x8=", + "checksumSHA1": "St1PhTIOivkuitST7TuKbRTNggg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/rest/watch", "path": "k8s.io/client-go/rest/watch", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lJfXk0VknXCLHrGP97DEyCNzsSo=", + "checksumSHA1": "llgZMRBHwu4j31yB5VUe8CxyQ88=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/cache", "path": "k8s.io/client-go/tools/cache", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "fliX6DddsG5DV3UtDQq3O5npEb8=", + "checksumSHA1": "DfM/lzwDI03Ac7JXAKQ6r+KmcME=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/clientcmd/api", "path": "k8s.io/client-go/tools/clientcmd/api", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "GxtcTCanDg8Sw2TZJp17QvAz/F8=", + "checksumSHA1": "200wCdsEp+7VJ5KT+RvhRjrEsfo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/metrics", "path": "k8s.io/client-go/tools/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "pHYqzAOJP+mVtVnRm2F/etzp3Us=", + "checksumSHA1": "N8Yf7zNcnxi3arX8jU4iXIu3YK0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/pager", "path": "k8s.io/client-go/tools/pager", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "gF53+B5+pnGL+P4MnD2Wz6Qhhfo=", + "checksumSHA1": "k1kk7D/mMgUQFbewIpmW8CgL9Lg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/record", "path": "k8s.io/client-go/tools/record", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6HuuDsqyr8abI1hK8+H6NgnH66o=", + "checksumSHA1": "vTnL1bweWrZiwIOISHen7++skko=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/reference", "path": "k8s.io/client-go/tools/reference", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "oa98nbzUWG+HQQSfP76cLufgUM4=", + "checksumSHA1": "cF4LRe1X3/g0ZiDgDhEA0My9sio=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/remotecommand", "path": "k8s.io/client-go/tools/remotecommand", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "7ryL+fAYLAPH3l4WkFf+DILWSdU=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/tools/watch", + "path": "k8s.io/client-go/tools/watch", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "MCs16eB1SW2VQxtvb+uHsXqY7rI=", + "checksumSHA1": "v8OmYyzOtkCJUS9/FOUK/+zwDAo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/transport", "path": "k8s.io/client-go/transport", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "p0s95paGotRW+wqbrURxG6HQfB0=", + "checksumSHA1": "N83Z8psiiN2G3gdtOURYbJml9Yo=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/transport/spdy", "path": "k8s.io/client-go/transport/spdy", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "8o8EfK/udY0CTj0PE3kJxUsHP24=", + "checksumSHA1": "b+wclbW6Ql+34RnS0ZkO0O4HTWQ=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/buffer", "path": "k8s.io/client-go/util/buffer", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "X5yX0tas8mCGtlXhLpiXlN8TMAM=", + "checksumSHA1": "KwIcQKPxCW2dCZHeX7FIfzT5dbw=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/cert", "path": "k8s.io/client-go/util/cert", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "nTsr4LYXgV0ejprvQEpfTNSBN14=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/certificate", - "path": "k8s.io/client-go/util/certificate", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "gY19oUfkm6qGoj3AozgZEH8l6xA=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/certificate/csr", - "path": "k8s.io/client-go/util/certificate/csr", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "IgxaQxbgziUM3/lUMODx2S5sgZU=", + "checksumSHA1": "YaBR8q4o/gp7PuaYqLr7D6tT7HY=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/connrotation", "path": "k8s.io/client-go/util/connrotation", - "revision": "" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "UdDZlxcUjHNGrgZ60irOAvri4Gc=", + "checksumSHA1": "B81180SpeohBe40CX6WmQQMwERg=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/exec", "path": "k8s.io/client-go/util/exec", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "d9LYHtDQzkUAhIjAquH33laF9e0=", + "checksumSHA1": "HZiPkVLw3utsVOqUi3KkSaRNOic=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/flowcontrol", "path": "k8s.io/client-go/util/flowcontrol", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "55f8MD/Mlsb3bW1CTnBsS/z0qQM=", + "checksumSHA1": "xycshGdlDXAUegAopoEoO9cbYqI=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/integer", "path": "k8s.io/client-go/util/integer", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6JVOV05ByAbzi5Ewc+ZxE/ikDGo=", + "checksumSHA1": "1AuyuDPFY6UYa4/+TjlkHFAnPF0=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/retry", "path": "k8s.io/client-go/util/retry", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "h0C4TNgeiWA9ladwiP7d9sM9wNk=", + "checksumSHA1": "hId6HTfKIoxtne4F2OGbovL/Ji4=", "origin": "k8s.io/kubernetes/vendor/k8s.io/client-go/util/workqueue", "path": "k8s.io/client-go/util/workqueue", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "kN3BSx8Cbo7/Ixn9JlaG1ll2UJY=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/apis/csi/v1alpha1", + "path": "k8s.io/csi-api/pkg/apis/csi/v1alpha1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "GfaslsUnUaSYK8rUbU1qDXbERUI=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/client/clientset/versioned", + "path": "k8s.io/csi-api/pkg/client/clientset/versioned", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "njBQNXCChgU5garvo2ZQtzT/7vU=", + "checksumSHA1": "e1Hg99/q9zC1gepw9fYU1m/ylTY=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/scheme", + "path": "k8s.io/csi-api/pkg/client/clientset/versioned/scheme", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "UaTYDU0ODG2SAgnvCEI953PhBC4=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1", + "path": "k8s.io/csi-api/pkg/client/clientset/versioned/typed/csi/v1alpha1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "N0ICXkEqL3Q293iNuXBEc8KhYPQ=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/kube-openapi", + "path": "k8s.io/kube-openapi", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "ubYo1BuqQrw7JjKMOKir7TWAN4A=", "origin": "k8s.io/kubernetes/vendor/k8s.io/kube-openapi/pkg/common", "path": "k8s.io/kube-openapi/pkg/common", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "DXy+unuyakiIcb75yQNKWlsL9lE=", + "checksumSHA1": "+I6R/QgWuxbgq73FvxYd35iDRko=", "origin": "k8s.io/kubernetes/vendor/k8s.io/kube-openapi/pkg/util/proto", "path": "k8s.io/kube-openapi/pkg/util/proto", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "UWfU+lPkiBJO+ufbmSf/oWwW0pw=", + "checksumSHA1": "KBLzDLHEoOFhY9682GuqP/D6Gv0=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/kubelet/config/v1beta1", + "path": "k8s.io/kubelet/config/v1beta1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "i+DXperOmmdO3NjfpOAHUTrJbAM=", "path": "k8s.io/kubernetes/cmd/kubelet/app/options", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "utrmRl/X8XFo/TNZal9UA5hO79c=", + "checksumSHA1": "ofUY77v7eBZclMd8GIjAqoKxVlk=", "path": "k8s.io/kubernetes/pkg/api/legacyscheme", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "aOH6MEuQsbqmGAZa/lv5fzeeE2M=", "path": "k8s.io/kubernetes/pkg/api/service", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "wFbTWdOYVyVqwE8feYXkCTPR4UY=", + "checksumSHA1": "JTC7Fe+SaNE9aw7jrlA8nQZOO7c=", "path": "k8s.io/kubernetes/pkg/api/v1/pod", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "CtoKrYgTawHA7VNNFm3sIBNXOww=", + "checksumSHA1": "j+mSap1pE0gEQurVX9pmzik41dU=", "path": "k8s.io/kubernetes/pkg/api/v1/resource", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "XvzduL0EMYJTTrBVvc1tBfsiOx8=", - "path": "k8s.io/kubernetes/pkg/apis/autoscaling", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "bnwuCaQU3Dn8Bor4bb4WgkhnNVQ=", + "path": "k8s.io/kubernetes/pkg/api/v1/service", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "fHBYl9iAGiVHpFdmso7K3AKuoj8=", - "path": "k8s.io/kubernetes/pkg/apis/componentconfig", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "GebrNeQYK2EUTyWh01ipsP+lXfA=", + "path": "k8s.io/kubernetes/pkg/apis/autoscaling", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6RCdMoYqAyQNoaowii1G6Bz6nt0=", + "checksumSHA1": "dz4Y9aUZJ5RM9jZVQLsbHpjOoWk=", "path": "k8s.io/kubernetes/pkg/apis/core", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "JzEyOXgsDJueXLF7R252wcILqVY=", + "checksumSHA1": "1z2iWkfTvpBqWOMs+qQWK5b5yuI=", "path": "k8s.io/kubernetes/pkg/apis/core/helper", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "ALYFn/h3XILLUNo4QkNCaCDfW54=", + "checksumSHA1": "kJHKBj3qIkHLnixbCFi5elzoGxY=", "path": "k8s.io/kubernetes/pkg/apis/core/install", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "AfSaMuMRCQfXsDp/jwMEBHE9Erk=", "path": "k8s.io/kubernetes/pkg/apis/core/pods", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "zZUzIrizOBxYLTHi354IfNWux7s=", + "checksumSHA1": "uVNr3gRgbBbYV7KRG6V3at00Kuk=", "path": "k8s.io/kubernetes/pkg/apis/core/v1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "TnzZQCgSgLI4Mij+/ZeUNIeDPok=", + "checksumSHA1": "XgLSEyGn8qJIeQ5U0TunKfmEd70=", "path": "k8s.io/kubernetes/pkg/apis/core/v1/helper", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "WjWOF3ONZxBdTXqZuouVPPbKiU0=", + "checksumSHA1": "46O0elMkFemXFGQQ1DU+giZV/C4=", "path": "k8s.io/kubernetes/pkg/apis/core/v1/helper/qos", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "8BlkZ7uQDcqrd+Qmr5mEu/gv1AQ=", @@ -4550,16 +4835,16 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "N3Y3qFr9s8s/R4yjLNdqSC7F/o0=", + "checksumSHA1": "Ccm9PjOCeV6uOUUp48BL+xrg9M0=", "path": "k8s.io/kubernetes/pkg/apis/core/validation", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "mAjvMCL0fVvmQ+2DM4YnFDQBhSw=", + "checksumSHA1": "kjAQKDXDnCX3nt2psRqa4ZoaT50=", "path": "k8s.io/kubernetes/pkg/apis/extensions", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "AAGd98CaW4Qk54VjvCPj62lBFwo=", @@ -4568,16 +4853,16 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "ygwV/vWduPI7jbcXEmSSiYdRLeI=", + "checksumSHA1": "PhwziYFtbjzDHOQxOT3Z8Aho6ac=", "path": "k8s.io/kubernetes/pkg/apis/networking", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "3D9VgSNrA83r6sL+rwTu/qeLYnY=", + "checksumSHA1": "i/2PT+jkgVMbULuaJLRnzMMhtyY=", "path": "k8s.io/kubernetes/pkg/apis/policy", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "AqdCXBQ9OveyhTcNwwwBDukxxJA=", @@ -4586,40 +4871,40 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "QMAlD0Y4gnaMh12Cqdu7KCEHpJI=", + "checksumSHA1": "pMHP/vJdvZlxmEoD+vhNHqYr9t4=", "path": "k8s.io/kubernetes/pkg/apis/scheduling", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "6GovapQLuRPig185b+fme5zxymE=", "path": "k8s.io/kubernetes/pkg/capabilities", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "XcEfY5KD86AjMdHKAh4tWByhjQQ=", + "checksumSHA1": "yP4bnKKaf1JrpC00xTSdKCKWB1g=", "path": "k8s.io/kubernetes/pkg/cloudprovider", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "EENV1SGaxk85++ydjIBaT5Lho+c=", + "checksumSHA1": "AW0rtVNeuTa7qcJmlGsqIVJoSno=", "path": "k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "YCyando1VtWUne8ohpfOsoW5C6c=", + "checksumSHA1": "hNFfVG/QiGHlfjTMUJCPOQ99XMM=", "path": "k8s.io/kubernetes/pkg/controller", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "QPJ6P/DvbYnK5zMICp5Bxzq803I=", + "checksumSHA1": "KWAhVqoiIYCuU9bj3D+lWbsACvU=", "path": "k8s.io/kubernetes/pkg/controller/volume/events", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "FMDl8Y8NDOosBFsI8+/7nKM0h00=", @@ -4628,52 +4913,52 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "KB3bxZ/9lfOhUYNNr8+a+P8H5+8=", + "checksumSHA1": "1KSTqGf80uTL1WJsyOpYCTCRV+Q=", "path": "k8s.io/kubernetes/pkg/controller/volume/persistentvolume", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Qy+QvxpY2kP/R4QmTGuzff7FHAE=", + "checksumSHA1": "OHo9iEYV60nol32s/bF65wCAKm0=", "path": "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "FUV4j9PjlS6JItLEzIUshZOliSc=", + "checksumSHA1": "uok+d9ziptTmyYV9HiEcfpVUoGU=", "path": "k8s.io/kubernetes/pkg/credentialprovider", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "ZH4JevdN2nSDOJEQROMRaiAObVw=", + "checksumSHA1": "2PGkVcPtoIjeyM4YjID6zbC2yJM=", "path": "k8s.io/kubernetes/pkg/credentialprovider/azure", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "EfTvIYAMTqJVZe5kru4U2QXn2G0=", + "checksumSHA1": "MqBdtny48PniBBPPIqLzl+JfuiE=", "path": "k8s.io/kubernetes/pkg/credentialprovider/gcp", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "u0hVSOoNwP+KskYVvc98rEGMr+Q=", + "checksumSHA1": "EsspON4cDY338zubGWi8RAQiGfc=", "path": "k8s.io/kubernetes/pkg/credentialprovider/secrets", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "aA1PrsWen/iPPL8wPgRrJ18fh9U=", + "checksumSHA1": "0Stuo4kWHTzehXw4KdrOoZcGCXI=", "path": "k8s.io/kubernetes/pkg/features", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "O0enML647/ULQDwzjnBeLXT0/80=", + "checksumSHA1": "jFgvmISssAWx6AKztXlytkV2Q+s=", "path": "k8s.io/kubernetes/pkg/fieldpath", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "qc9+AWCsbD8lHQRkqlOWRQGDFIw=", @@ -4682,70 +4967,70 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "WZ6UYIdhxGEBRPpMsQNRkcET8bA=", + "checksumSHA1": "D3CGcof+yOuO9k2kTOeQJHTeYjg=", "path": "k8s.io/kubernetes/pkg/kubelet/apis", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Iaw4fhHDlSbfo18vS82EVW5aOXU=", - "path": "k8s.io/kubernetes/pkg/kubelet/apis/cri", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "OH1Cgm1RMb3LdKl+aFiRieqXWWY=", + "path": "k8s.io/kubernetes/pkg/kubelet/apis/config", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "k6PoJbv3afe/Dp71IFHo2/3ZxgI=", - "path": "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "o//swa8olnc3RvbvTar5uYq8/4k=", + "path": "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "hGLlKCVWgDuFeLd1BgH9oniMX9k=", - "path": "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "XOjrPlQRXwHrJp4nmJtglUfnnF8=", + "path": "k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "HFEqH52ZV/C5nbSuQQjxm1l5SL0=", - "path": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "vmHBVmPDOzq66taGgKGeO5mDP1g=", + "path": "k8s.io/kubernetes/pkg/kubelet/apis/config/validation", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "zlwceaGlUALsUnKgBerH/UmtTUc=", - "path": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/scheme", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "7xpvY17zHJQJQz9TAH5XqV4bYDg=", + "path": "k8s.io/kubernetes/pkg/kubelet/apis/cri", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "FQbn0FqFdP1XTCRIoBN0jbGsO0s=", - "path": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "HcJHqcXado9D/dZ4G/2W4ZmKvfQ=", + "path": "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "GSxR4U+mZIrBIxNzT0G0sxDa3U0=", - "path": "k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig/validation", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "KfmOlhHAeBHcFTqW9/W1slBmCks=", + "path": "k8s.io/kubernetes/pkg/kubelet/apis/deviceplugin/v1beta1", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "o+XcwlGhIh9Ea6OsKXI7fGvFtAo=", + "checksumSHA1": "l8eMms6BBixpZOr34qR7x73ZI7U=", "path": "k8s.io/kubernetes/pkg/kubelet/apis/pluginregistration/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "YqkpRzZ8A2gITtxIz/WZ+0Kh/G8=", + "checksumSHA1": "r91yXN3Y6gwLKuFw04aULnolPpI=", "path": "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Mhh10phyDjUeqo6/HbMJ+uHgbcQ=", + "checksumSHA1": "e2l0MUO8nn0qoQqMRvsU5uX7E0c=", "path": "k8s.io/kubernetes/pkg/kubelet/cadvisor", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "j59ywogK7Esp3zTpsEEBvCTiCdM=", @@ -4754,154 +5039,154 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "FP4GSdOF2acNSpAB+5xV70lQ3kk=", + "checksumSHA1": "LDgoXpfyo5FUboxGeLlhRR3M+m0=", "path": "k8s.io/kubernetes/pkg/kubelet/checkpoint", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "NbCTsr/XrXXDTgbCmWEf6UIelY4=", "path": "k8s.io/kubernetes/pkg/kubelet/checkpointmanager", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "N90jxVVf6u9GN5RZzYxb3kFq0Us=", "path": "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/checksum", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "mrujAp8+1fpm7/Nn8nzsnhZ4Ng8=", "path": "k8s.io/kubernetes/pkg/kubelet/checkpointmanager/errors", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "EfBucpl0h/zqGuYw71rxoVQuxIU=", + "checksumSHA1": "oA3IhmRi8i6UtmJoonc8xy9e5zc=", "path": "k8s.io/kubernetes/pkg/kubelet/cm", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "2HD+L0t8Ql9NJAuQ9RfujJi4ync=", + "checksumSHA1": "s3f+8UbTI7pGrdpEBZKMZDvfdkU=", "path": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "l0+ChTKvCd3sIwZUHOzxe9D6qBQ=", + "checksumSHA1": "mgKRV08SmRUdNG+LRJ9go4pnCtk=", "path": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/state", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "xaIF5DLhBe/yMirbXQrGaJZLa1w=", "path": "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "3coCxOI93B++C+yJn/Ib220U2c0=", "path": "k8s.io/kubernetes/pkg/kubelet/cm/cpuset", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "fTS7Iy6p3awrQw8Swes7+A9Y9aA=", + "checksumSHA1": "wJATmrxpjwDMSciPgdYyYtOjaN8=", "path": "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "kv6RPed5Sxj1/bU4ZkiMyyrEAiI=", "path": "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "z8q/p/qFjBUaW5foLfqon90MpP8=", + "checksumSHA1": "/QP4u4rEDANayobjdEUoVEXFKTo=", "path": "k8s.io/kubernetes/pkg/kubelet/cm/util", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "wXlijgrapo0gb+BLO8LzOal3Hs4=", + "checksumSHA1": "7USyfd1MZEO7rUO30B8VFAD2NZc=", "path": "k8s.io/kubernetes/pkg/kubelet/config", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "f5JbbpoVna84xzl+o0SNjj+ED44=", + "checksumSHA1": "Q5Qqm8EzIWIdjG5iiB874kb/w/w=", "path": "k8s.io/kubernetes/pkg/kubelet/configmap", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "ggDSKzolGF//BsqlnvnsZ0xyn60=", + "checksumSHA1": "3af+IDSialipnRPqcLpbuxdYG0U=", "path": "k8s.io/kubernetes/pkg/kubelet/container", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "MhjIPEVwfk6qJ9x6ruXA8R2rHUE=", + "checksumSHA1": "MSyPyAMHzTj/vAjuDHYX9bCivTU=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "pjWxP4GffvEHaMkys0j+5Fs1c5k=", + "checksumSHA1": "wn4469iTq569BwdkRW7G4Muo1fo=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/cm", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "kmAhju0O6yOMbuMDYT3pkuchNcE=", + "checksumSHA1": "SdzTooafTB58m5ggh4MB6nnS8Qs=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "/GQpvIUql5XSYXRWpowjUhWEHmY=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "GJg+97TmGWiZ+ZxszxKNAMfHx5U=", + "checksumSHA1": "h5yfLprd8E/HICYGI+30IN3dbOI=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/network", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "DBKwjZLeZj8ebZW3dBn00nKsKH4=", + "checksumSHA1": "g60kJqIknHuDJ6shhfMmfyyAhi0=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/cni", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lXWgQYkryq2vRrqzmASW5ktuovQ=", + "checksumSHA1": "ka5X3AZTZLtesd2Zz2S5i+iIi3Y=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/hostport", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "PAVFIawatU4ADGVyKSFRxPfC45I=", + "checksumSHA1": "Np0pr0BUaJpfikgDYskzzBwWTA8=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/kubenet", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "ouCArVBo8HnyOhXTOwubrZoc6sU=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "N0J6KVM8Mboqbr1h+AG93lXYci4=", "path": "k8s.io/kubernetes/pkg/kubelet/dockershim/remote", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "YsaVwa4YMUgAgBzeQKGmvKncfeE=", @@ -4910,10 +5195,10 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "Fs0N0FfzGF8DpBCYjzozafpbwnU=", + "checksumSHA1": "yW79OFl6EAVMA8RKScjZnPRZTD8=", "path": "k8s.io/kubernetes/pkg/kubelet/events", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "U1RNh0bXsItJNggOwKkYta87LRA=", @@ -4922,16 +5207,16 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "xXeD+M09/LMBZAwWpBstLRxipSE=", + "checksumSHA1": "pp/v+1Os0GUczqIurvpQytaXZus=", "path": "k8s.io/kubernetes/pkg/kubelet/eviction/api", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "YLP9D0uBLkvjeBkNmuhjfCuaHDY=", + "checksumSHA1": "t+WDmn9kiiOCg9VuwTUfWY7gyM8=", "path": "k8s.io/kubernetes/pkg/kubelet/images", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "Fq1pl1474ao3WyTTKrLFN6MdkNo=", @@ -4988,28 +5273,28 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "0jf8Iz+43beDGw7eosEMEux5YsM=", + "checksumSHA1": "rT0QyhdNYJYcFhx5+W1u9dRSB+0=", "path": "k8s.io/kubernetes/pkg/kubelet/kuberuntime", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "TfGAAfHRQlHoDxmzmRjlXOARMqA=", + "checksumSHA1": "pOntl92OiSw9LSuSUUOnlDk0PtI=", "path": "k8s.io/kubernetes/pkg/kubelet/kuberuntime/logs", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "P8RrX71I2Gqnz3ZwnQFKpQohBcM=", "path": "k8s.io/kubernetes/pkg/kubelet/leaky", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "ZygGOIPRm8FGILITSlRZBTtGQyA=", + "checksumSHA1": "TTlSU3vYthzIDqjKUuKUIU7tLHM=", "path": "k8s.io/kubernetes/pkg/kubelet/lifecycle", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "HlVhtbDZP0xCwJYWxc1SmuYWJLY=", @@ -5018,10 +5303,10 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "FiObdoJRrDIRYRYSGGv+q2iIq1Y=", + "checksumSHA1": "ZH14u0ICzQQ0aLe4XeGqbiqzTl8=", "path": "k8s.io/kubernetes/pkg/kubelet/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "uvUM9GynYSmazMYWLjmZLazJYN0=", @@ -5048,10 +5333,10 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "0KAFSFhE0Gp0KTlaFhAiJtvxbUM=", + "checksumSHA1": "igx+2WWU/5lCVv95T/qNAz3AF9U=", "path": "k8s.io/kubernetes/pkg/kubelet/pod", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "mOuI6V9NUgSq7qwOSg9nFEWPHcc=", @@ -5066,28 +5351,34 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "P/4jrxpg0HDvKMcpaI5gW6R8XBY=", + "checksumSHA1": "2HAw5TO2ZJdQf0odzh6JBsN0bwA=", "path": "k8s.io/kubernetes/pkg/kubelet/prober/results", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "6arjWr9hIf9cQ6X2qZ2j3QnCsT4=", + "checksumSHA1": "NWnL3qyq5i6K7hquSOow/18Upwo=", "path": "k8s.io/kubernetes/pkg/kubelet/qos", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "yUClicSzg9MxFBk77mEnpQmrUy0=", + "checksumSHA1": "Yk0+IZY/R69/PQKvW4pzkZ9PBco=", "path": "k8s.io/kubernetes/pkg/kubelet/remote", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "ZMINM2hdhEYqpHetGOKWvqHXqRI=", + "path": "k8s.io/kubernetes/pkg/kubelet/runtimeclass", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "oyGbMqcG6GKQD/oW4EnDMR87CtU=", + "checksumSHA1": "fNr+NjzmEAuNCH9T+68Q51+RpTU=", "path": "k8s.io/kubernetes/pkg/kubelet/secret", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "qxn5zOSlClVcoNeqepaSMq0bPBE=", @@ -5096,16 +5387,16 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "0jBg5nk7Qeos3sRWgROF7EXRjJg=", + "checksumSHA1": "oX96MeBZlqa5KyHdkTsGFKXucMY=", "path": "k8s.io/kubernetes/pkg/kubelet/server/portforward", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "CYNLu8A0B77UpG4FYHQ9m2mvtDk=", + "checksumSHA1": "oN95qtdAPqmHuEEgAPaF8Uizwro=", "path": "k8s.io/kubernetes/pkg/kubelet/server/remotecommand", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "ylmWEk3GTLSt+hZG3cr+jBJugY8=", @@ -5114,10 +5405,10 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "czsLIoZiljan9uoh/VqCbq7+cGc=", + "checksumSHA1": "mugj/3Tv/t25yDLgx3uGNeLAB3w=", "path": "k8s.io/kubernetes/pkg/kubelet/server/streaming", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "2lPFz/P6oLm3wmiswYURa7xgvM4=", @@ -5126,10 +5417,10 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "4E35z2922wU6f0ycZ2mF8GY9cb4=", + "checksumSHA1": "mo3NbNYH6rhL5gd/pA+oOvUsstk=", "path": "k8s.io/kubernetes/pkg/kubelet/status", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "cGF8TnSXpji8NVgC3SahWZz7VOA=", @@ -5144,58 +5435,58 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "76KbF0i0mjW7+1ZhGebbiWb3LDw=", + "checksumSHA1": "+GU89S5l9LpWJxmx/pXfv7kh/7k=", "path": "k8s.io/kubernetes/pkg/kubelet/types", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "YAzPFJ0zC2jvdJ57MbCF5Os3acc=", + "checksumSHA1": "NaHEiwHejAY8c5MkpS7KQ8iNNhE=", "path": "k8s.io/kubernetes/pkg/kubelet/util", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "43+9wUlMTNzvx3K/2H/TnfXekkE=", + "checksumSHA1": "t5shi0DwCSpcRgpG4RZHIRCTxhA=", "path": "k8s.io/kubernetes/pkg/kubelet/util/cache", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "D1S7bi9uJWloFvt7iS9w/Zp2i9Y=", + "checksumSHA1": "muHrnQHvZHX/WkR6DKyJieN4xtk=", "path": "k8s.io/kubernetes/pkg/kubelet/util/format", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "WK4kJZ9RF5v0ZdS4Dpy09VSXSg0=", "path": "k8s.io/kubernetes/pkg/kubelet/util/ioutils", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Qm+v4UwMeRgpdPDIUNT1M07gW8M=", + "checksumSHA1": "W5tlkhMRQlBxipo0bBU6nfS0dyA=", "path": "k8s.io/kubernetes/pkg/kubelet/util/manager", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "xNdkL+vBd39wakcVufqQbQpGTaI=", + "checksumSHA1": "kLA1gssmBN1bvkhVqpLgC1rAuDk=", "path": "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Z/31KP8BqTPNS1p2o0fVjLH2ZiI=", + "checksumSHA1": "id35YcjNaioidiKW0wQZY5gwxYs=", "path": "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "5Nsp/R/lmxf4/71O+4OKrO5+vDE=", + "checksumSHA1": "CyClqwWHyu5wCHANYsox+PeK/eE=", "path": "k8s.io/kubernetes/pkg/kubelet/util/pluginwatcher/example_plugin_apis/v1beta2", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "vIcJKhCSY1ViUR4/nQRpr+m6PG8=", @@ -5204,16 +5495,16 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "LAJURl/oLnDsX/iz1hrbU8Q8nVQ=", + "checksumSHA1": "l7uE62VuyPpssG30rM45WUASUNY=", "path": "k8s.io/kubernetes/pkg/kubelet/util/sliceutils", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "+fTa//yE3DJerfa59sGx3bQeses=", "path": "k8s.io/kubernetes/pkg/kubelet/util/store", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "2ziHDMthk7UnWIc0/7rhLsrXPrI=", @@ -5240,16 +5531,16 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "PO5U5v1nv9wxqq2vwjMqDRwewDQ=", + "checksumSHA1": "TccKbeKxFZjWsBzvu2Eh0IKXIEc=", "path": "k8s.io/kubernetes/pkg/kubelet/winstats", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "NYJWcL1EQwYl2CPeuwSokiT2s0c=", + "checksumSHA1": "L+roO9OoA4O4kuP1tthq5M9xoFQ=", "path": "k8s.io/kubernetes/pkg/master/ports", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "UyLHtDrMoDvUPEVHt6X3iTBKEdw=", @@ -5276,82 +5567,82 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "AN31xPkg+iaz8Zn/8RgJDLtn9/I=", + "checksumSHA1": "9zfEiFP9Ghh8IX5w+s4eHCd9Oes=", "path": "k8s.io/kubernetes/pkg/proxy", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "q5jBhgNwbuPG2VUm4joDjigQfUg=", + "checksumSHA1": "9aQQWNTvs92Cp4iIPFDXtpl0ufM=", "path": "k8s.io/kubernetes/pkg/proxy/healthcheck", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "92xDAcJqd9sPtiaJIz5133Qg1dM=", + "checksumSHA1": "DGOHYoKy4/ds157tvL/4pFfugSU=", "path": "k8s.io/kubernetes/pkg/proxy/iptables", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "fHqGbA3EXJo+eGeTA1+fKaiw+SI=", "path": "k8s.io/kubernetes/pkg/proxy/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "KLSjOQA7NhuDXluzS8JhYsYZ0Pc=", + "checksumSHA1": "6/qOjXoKcN9qrscDZ7iJhpWB/8Y=", "path": "k8s.io/kubernetes/pkg/proxy/util", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "osVPnbi+/k2EtAbq/sXjgRr+HfA=", + "checksumSHA1": "EYs1OkwXLEJdLEsALjS1thyHXXw=", "path": "k8s.io/kubernetes/pkg/scheduler/algorithm", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "RewlhGiH7oqUqgYe7U+I6ZgXj8c=", + "checksumSHA1": "hdODBh69L8GWgkXIvCrSMi/fP/0=", "path": "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "ZiBwIqIwhcrAkSEoHQXNuKas/OQ=", + "checksumSHA1": "6vmJr0bJjqEuPqVxHqe2G27+xJY=", "path": "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/util", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "lcGCnqtsXk3K43vPgXN2U6/PpJw=", + "checksumSHA1": "aKV+oVNzSO4jzHAPnV9KPPSvuBY=", "path": "k8s.io/kubernetes/pkg/scheduler/api", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "v0d0J/mhSIZaWKs66hMSmWiC/uE=", + "checksumSHA1": "8VAx4kJy/MfUA7p2T90KabDr0sY=", "path": "k8s.io/kubernetes/pkg/scheduler/cache", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "28HEqOgaSqXqwtfO/AkaUwqz9d4=", + "checksumSHA1": "2V7C3CnUq49NfOTxb5YohQ73MxU=", "path": "k8s.io/kubernetes/pkg/scheduler/util", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "yJGW7UrP8WvXZrynRmBqmLB3X8E=", + "checksumSHA1": "pDsBfdvxk81GCES6AVlCQWQgAlk=", "path": "k8s.io/kubernetes/pkg/scheduler/volumebinder", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "YSv5K7PCYkM92g/Gnze4AzynciE=", + "checksumSHA1": "68LtWG4ausPZyeO+/7OSkkh6kDk=", "path": "k8s.io/kubernetes/pkg/security/apparmor", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "OZNVQK4jEMMHPJf4w2DBSfS0Ez0=", @@ -5372,34 +5663,34 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "lWunCDxDc4k1EUOtI1Z7VRbyA/A=", + "checksumSHA1": "5YAfJnkNT9Q2OlV0MK7N/SyOlfY=", "path": "k8s.io/kubernetes/pkg/securitycontext", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Yj6Mz/Mves9CuP64HrtNy3bZrts=", + "checksumSHA1": "OLl11LQISQpJINJCiz/qHx0TTbM=", "path": "k8s.io/kubernetes/pkg/serviceaccount", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "nJelvHcfsfbZwyrmgXLUyiON+6g=", + "checksumSHA1": "btoNIWE1VXx6zA95Sh0xFDJ+IF4=", "path": "k8s.io/kubernetes/pkg/util/async", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "8O/tCcU40rJhNj378ZgW9kzvkuo=", + "checksumSHA1": "SgpvxP+e7WKm3PXfPnjtOC37Ey4=", "path": "k8s.io/kubernetes/pkg/util/bandwidth", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "q+6cv4qcUo5s/3AzKLLBEGR6v/M=", + "checksumSHA1": "xupuMK/RsRkJyK4FWmKLcATUomI=", "path": "k8s.io/kubernetes/pkg/util/config", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "FWo2kUucNob37lJbUZkQnSJGiSM=", @@ -5408,124 +5699,124 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "diFo8iBeDz3apY3sdcoLjRr4NNE=", + "checksumSHA1": "JST3QxtKuX2gSbrnFDnEWDcOuDM=", "path": "k8s.io/kubernetes/pkg/util/conntrack", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "FLnTrCveiavRBYRn8ceIfRUMFBI=", "path": "k8s.io/kubernetes/pkg/util/dbus", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "xOZpcOQ4oAtMGKcyHKj8mg0VkR0=", "path": "k8s.io/kubernetes/pkg/util/ebtables", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "S+Qrmg3r8jHk7zm/XGL2+/6Az3g=", "path": "k8s.io/kubernetes/pkg/util/file", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "0s5JocwthCNWOqIuccIF2w2DIkE=", "path": "k8s.io/kubernetes/pkg/util/filesystem", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "B+s61JqoqVspjdkYi+OTXez6zCY=", + "path": "k8s.io/kubernetes/pkg/util/flag", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "+QIE5mpGjp4N/LMX3R4UJPIanaQ=", + "checksumSHA1": "18B/R+QcrBaAnai/g4Hklc8ULVY=", "path": "k8s.io/kubernetes/pkg/util/goroutinemap", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "6UFk5opZQZ0DGD6Cvi6nKxL4E0Y=", "path": "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "f6VU4MOV6/GEW8FTREhieqRc3ig=", "path": "k8s.io/kubernetes/pkg/util/hash", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "VhTu8jJlTd3Is466tn0SLsD2vyY=", + "checksumSHA1": "ifM8Ve+pzbWdYVJUvGP4Gkctbpw=", "path": "k8s.io/kubernetes/pkg/util/io", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "naX7av1PdshHfe1WEpeG/r3jy/c=", + "checksumSHA1": "OTfFjs7k063FeGGvAMng3fzNtXo=", "path": "k8s.io/kubernetes/pkg/util/iptables", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "PHDIGpTf2mVy9v1W1tGgdtAq2F8=", + "checksumSHA1": "Th5Y0PIMjNYurGRzQb/82FLbQiU=", "path": "k8s.io/kubernetes/pkg/util/mount", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "m8VjvzxvZURsTxHha0MYkZl/Yog=", "path": "k8s.io/kubernetes/pkg/util/net", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "SjWcpwVfzlEmVfYj2Z/AxVIcY1Q=", "path": "k8s.io/kubernetes/pkg/util/net/sets", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "/+uCP7uvqeT2fzjgYHeNU9bMMww=", + "checksumSHA1": "WaLrq8p2SqOFclFVUpZQn5DHONE=", "path": "k8s.io/kubernetes/pkg/util/node", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "UcYeGp7hUbxz9II85LhONIiq7CA=", + "checksumSHA1": "501w6Sn20XCVlIaBCW4TRS2pIBA=", "path": "k8s.io/kubernetes/pkg/util/nsenter", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "Uc+7IEQKvewM3ZYwNnsvNAhdC2U=", + "checksumSHA1": "fSRfGz1AXea0XlP+vNwdX+xuk1Y=", "path": "k8s.io/kubernetes/pkg/util/oom", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "M/jjQNJn6FPK+bsIJpQsgu1Ysw8=", "path": "k8s.io/kubernetes/pkg/util/parsers", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "iWWoQC8/8FsGurxBsu7b8e/ma5Y=", + "checksumSHA1": "V4eKRasl0q1Tn4PcsJGpi3RJOuU=", "path": "k8s.io/kubernetes/pkg/util/pod", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "xCXkCZHe+10fwOTSQPEc2+AuSAo=", - "path": "k8s.io/kubernetes/pkg/util/pointer", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "smFvqFiQghFPuhFF7N8VyPmoXTM=", + "checksumSHA1": "m0IMN/jCKzvCFgDupnJz9noBj4Y=", "path": "k8s.io/kubernetes/pkg/util/procfs", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "DbOLu5/UmrBj5gpL+IQQ2J9hg0o=", @@ -5540,58 +5831,58 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "deItHWbCx5EIjDex4K35gp8onE0=", + "checksumSHA1": "HQYkvT0ITUhpiFzE/x+KSP88zGs=", "path": "k8s.io/kubernetes/pkg/util/selinux", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "yeAxXBeyNLvrY5SrpCV+aVn8jqk=", "path": "k8s.io/kubernetes/pkg/util/strings", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "AMuCmHgzpHm/YUtGe4gPHjw//go=", "path": "k8s.io/kubernetes/pkg/util/sysctl", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "XApoorZskRnrWzaZjHBuIsZe3Qg=", "path": "k8s.io/kubernetes/pkg/util/tail", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "EMP0l/ER6mLqQN4awEMdIP4s7Ig=", + "checksumSHA1": "7jjQATwrFn+CkUeDLd/kvAh3dmY=", "path": "k8s.io/kubernetes/pkg/util/taints", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "41HhQUtd0ZzeIb4b/gA2OfWycW8=", "path": "k8s.io/kubernetes/pkg/util/version", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "72+177+TdJ9wCQ++j/1MbemQz2U=", + "checksumSHA1": "w9oz/ociQeDkUtd+mb03nCXL8Gg=", "path": "k8s.io/kubernetes/pkg/version", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "spB0hg3oeKl2YPszwUb/xn9RzPM=", "path": "k8s.io/kubernetes/pkg/version/verflag", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "L5n9wl/oQuUwKhPJZH/0IG+mnUw=", + "checksumSHA1": "XlIyyeilK50wsK4NeHl1sYOrb30=", "path": "k8s.io/kubernetes/pkg/volume", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "xStHGoDqIkrDLOcpVlzXZOb5ez4=", @@ -5600,22 +5891,16 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "4HA0WPv8tT/zL4ABlvzwi02e1iE=", - "path": "k8s.io/kubernetes/pkg/volume/csi/labelmanager", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "zhhIYqoZfDIFDtrSTJIn5sDtT+g=", + "checksumSHA1": "XkgNWP9YgxhydQkDsSJV6ogCeYk=", "path": "k8s.io/kubernetes/pkg/volume/util", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "0vjNzNmCj+L3H5+1IHx6funL7+Y=", + "checksumSHA1": "B0cz2R0E7PmyP7bdnUD0C8W7bIU=", "path": "k8s.io/kubernetes/pkg/volume/util/fs", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "wIyNCWxfws2Gz4t1o4FunTolHbY=", @@ -5630,22 +5915,22 @@ "revisionTime": "2018-06-27T19:55:42Z" }, { - "checksumSHA1": "TBpSOIktBkK0X58nAIidaKOwWtw=", + "checksumSHA1": "Jmz/PsPDz61AzOBxdfPpAqmRN5w=", "path": "k8s.io/kubernetes/pkg/volume/util/recyclerclient", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "3WLMzGVrjV1WwskU37sAK4OvOe4=", + "checksumSHA1": "PCMfhpeyn9iYkVrlTnMCP8Z0fiA=", "path": "k8s.io/kubernetes/pkg/volume/util/types", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "8CHeYHooUbZrujRXZSjgkzecG54=", + "checksumSHA1": "C3qdtNQPGKUvXSYOW1Ips33bqBY=", "path": "k8s.io/kubernetes/pkg/volume/util/volumepathhandler", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "cUVtCTls+0yscFDG4f3woehwt0w=", @@ -5656,8 +5941,8 @@ { "checksumSHA1": "k/TF5T8qxUw27iXw3fKIRF5ojzs=", "path": "k8s.io/kubernetes/third_party/forked/golang/expansion", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { "checksumSHA1": "5KvHyB1CImtwZT3fwNkNUlc8R0k=", @@ -5666,65 +5951,39 @@ "revisionTime": "2017-01-30T21:42:45Z" }, { - "checksumSHA1": "VdiuZ9FwwhJoh4qPMLY0WmWVPpY=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics", - "path": "k8s.io/metrics/pkg/apis/metrics", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "6kGlMxmZjqKzpuEHD4bmJliteJ0=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1alpha1", - "path": "k8s.io/metrics/pkg/apis/metrics/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "GXymjWOdmTigqUyXjr2z0/s8tj8=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/apis/metrics/v1beta1", - "path": "k8s.io/metrics/pkg/apis/metrics/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "huvXnSKaynPtkHarMR+KLPOiNWU=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset", - "path": "k8s.io/metrics/pkg/client/clientset_generated/clientset", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "ufwtrSXs/xEBrvb7C1TxwkB9THQ=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme", - "path": "k8s.io/metrics/pkg/client/clientset_generated/clientset/scheme", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" - }, - { - "checksumSHA1": "25vF8G9x4GKAXeSofXmqB80ehbI=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1", - "path": "k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1alpha1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "+PSmZvJlokVa7uj6BTSuKfochAs=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics", + "path": "k8s.io/metrics", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "bPyV4tmACVfwcpseM+/ZHecM6aU=", - "origin": "k8s.io/kubernetes/vendor/k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1", - "path": "k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1", - "revision": "91e7b4fd31fcd3d5f436da26c980becec37ceefe", - "revisionTime": "2018-06-27T19:55:42Z" + "checksumSHA1": "M3UPeQlE5J62fqKABn9H30B5uyw=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/utils", + "path": "k8s.io/utils", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "mfjCz861MHIE6JSg1OAkV3zliYs=", + "checksumSHA1": "Hq5M+MvTGEz4kqOFrdPzAn/nVZE=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/utils/clock", "path": "k8s.io/utils/clock", - "revision": "aedf551cdb8b0119df3a19c65fde413a13b34997", - "revisionTime": "2017-11-22T00:09:34Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" }, { - "checksumSHA1": "+4bjxBVfRXO3Ga0yaInDERH3Ey8=", + "checksumSHA1": "3E4X71YviQnjv5eJfkDYUtQvWCk=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/utils/exec", "path": "k8s.io/utils/exec", - "revision": "aedf551cdb8b0119df3a19c65fde413a13b34997", - "revisionTime": "2017-11-22T00:09:34Z" + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" + }, + { + "checksumSHA1": "iXg3jYb8k3K3YCr2Hxvkw5gbE/U=", + "origin": "k8s.io/kubernetes/vendor/k8s.io/utils/pointer", + "path": "k8s.io/utils/pointer", + "revision": "0ed33881dc4355495f623c6f22e7dd0b7632b7c0", + "revisionTime": "2018-09-25T22:13:05Z" } ], "rootPath": "k8s.io/frakti"